@willbooster/wb 22.10.0 → 22.11.0

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.
@@ -1,4 +1,4 @@
1
- import{t as e}from"./error-CkSfqFuk.js";import{existsSync as t}from"node:fs";import n from"node:path";import{readFile as r}from"node:fs/promises";import{TextlintKernel as i}from"@textlint/kernel";import{moduleInterop as a}from"@textlint/module-interop";import{MarkdownProcessor as o}from"@textlint/textlint-plugin-markdown/lib/src/MarkdownProcessor.js";import s from"@textlint-rule/textlint-rule-no-invalid-control-character";import c from"textlint-rule-no-zero-width-spaces";var l=Object.create,u=Object.defineProperty,d=Object.getOwnPropertyDescriptor,f=Object.getOwnPropertyNames,p=Object.getPrototypeOf,m=Object.prototype.hasOwnProperty,h=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t),e=null),t.exports),g=(e,t)=>{let n={};for(var r in e)u(n,r,{get:e[r],enumerable:!0});return t||u(n,Symbol.toStringTag,{value:`Module`}),n},_=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var i=f(t),a=0,o=i.length,s;a<o;a++)s=i[a],!m.call(e,s)&&s!==n&&u(e,s,{get:(e=>t[e]).bind(null,s),enumerable:!(r=d(t,s))||r.enumerable});return e},v=(e,t,n)=>(n=e==null?{}:l(p(e)),_(t||!e||!e.__esModule||!m.call(e,`default`)?u(n,`default`,{value:e,enumerable:!0}):n,e));const y=/\p{Script=Hangul}/u,b=/\p{Script=Han}/u,x=/* @__PURE__ */ new Set(`个乘亂亞从佛來們假傳僞價儉兒兩册刄剩劍劑勞勳勵勸區卷參听呀咯哇哦唔單嘛嚴囑囘圈國圍圓圖團墮壓壘壞壤壯壹壻壽奧奬姙孃學寢實寫寶將專對屆屬峽巖帶广廢廣廳彈很徑從怎恆惡惱愼慘懷戀戰戲拂拔拜挾插搖搜擇擔據擧擴攜攝收效敍敕數斷晝曉會條棧榮樂樓樞樣檢權歐歡歸殘殼毆氣沒淨淺滯滿潛澁濕濟灣燈燒營爐爭爲犧狹獨獵獸獻瓣畫當疊癡發盜盡碎碼祕禪禮稱稻穗穩竊竝粹絲經縣縱總繩繪繼續纖缺罐聲聽肅腦膽臟臺與舉舊舍舖艷莊莖萬藏藥處號螢蟲蠶蠻衞裝襃覺覽觀觸謠證譯譽讀變讓讚豐豫貳賣贊跟踐輕轉辨辭辯這遙遞遲鄰醉醫釀釋錢鎭鏈鐵鑄鑛關陷隨險隱隸雖雙雜霸靈靜顏顯飜飮餘餠騷驅驗驛髓體髮鬪鷄鹽麥麼黏默點黨齊齒齡龜`);let S;function ee(e,t=``){let n=new Set(t.normalize(`NFKC`)),r=S??=te(),i=/* @__PURE__ */ new Set;for(let t of e.normalize(`NFKC`))n.has(t)||(y.test(t)||b.test(t)&&(!r.has(t)||x.has(t)))&&i.add(t);return[...i]}function te(){let e=new TextDecoder(`shift_jis`),t=/* @__PURE__ */ new Set(`𠮟塡剝頰仼伃伹侊俿偂僘僴兊兤冝凬刕劜劯匇匤厓叝咊咜喆坙坥垬埈墲夋奛奝奣尞岺峵嵓嵭嶹巐弡弴彅惞愑愰憘戓抦敎昞昻晳暿曺曻朎杦栁桒棏樰橳櫢櫤涖淸澵濵焏犱犾猤玽甁硺礰竧箞絈緖罇荢葈蓜蘒蠇裵褜訷贒郞鄕釞釥鈼鉙鉷鍈鏆隝隯霳霻靍靏靑靕髙魲鮏鮱鮻鰀﨎﨏﨑﨓﨔﨟﨡﨣﨤﨧﨨﨩𠮷`);for(let n=129;n<=234;n++)if(!(n>=160&&n<=223))for(let r=64;r<=252;r++)t.add(e.decode(new Uint8Array([n,r])));return t}function ne(e){return Array.from(new Set(e))}function re(...e){let t,n,r;e.length===1?(t=0,r=1,[n]=e):[t,n,r=1]=e;let i=[],a=t;for(;a<n;)i.push(a),a+=r||1;return i}function ie(e){return e.replace(/\\/g,`/`)}function ae(e,t){if(!t||t===`all`||t===`*`)return re(1,e+1);if(t===`none`)return[];let n=[];for(let r of t.split(/[,;]/g))if(!r.includes(`-`))n.push(+r);else{let[t,i]=r.split(`-`,2);n.push(...re(+t,i?+i+1:e+1))}return ne(n).filter(t=>t<=e).sort((e,t)=>e-t)}const oe=Symbol.for(`yaml.alias`),se=Symbol.for(`yaml.document`),C=Symbol.for(`yaml.map`),ce=Symbol.for(`yaml.pair`),w=Symbol.for(`yaml.scalar`),T=Symbol.for(`yaml.seq`),E=Symbol.for(`yaml.node.type`),D=e=>!!e&&typeof e==`object`&&e[E]===oe,O=e=>!!e&&typeof e==`object`&&e[E]===se,k=e=>!!e&&typeof e==`object`&&e[E]===C,A=e=>!!e&&typeof e==`object`&&e[E]===ce,j=e=>!!e&&typeof e==`object`&&e[E]===w,le=e=>!!e&&typeof e==`object`&&e[E]===T;function M(e){if(e&&typeof e==`object`)switch(e[E]){case C:case T:return!0}return!1}function N(e){if(e&&typeof e==`object`)switch(e[E]){case oe:case C:case w:case T:return!0}return!1}const ue=e=>(j(e)||M(e))&&!!e.anchor,P=Symbol(`break visit`),de=Symbol(`skip children`),F=Symbol(`remove node`);function I(e,t){let n=he(t);O(e)?fe(null,e.contents,n,Object.freeze([e]))===F&&(e.contents=null):fe(null,e,n,Object.freeze([]))}I.BREAK=P,I.SKIP=de,I.REMOVE=F;function fe(e,t,n,r){let i=ge(e,t,n,r);if(N(i)||A(i))return _e(e,r,i),fe(e,i,n,r);if(typeof i!=`symbol`){if(M(t)){r=Object.freeze(r.concat(t));for(let e=0;e<t.items.length;++e){let i=fe(e,t.items[e],n,r);if(typeof i==`number`)e=i-1;else if(i===P)return P;else i===F&&(t.items.splice(e,1),--e)}}else if(A(t)){r=Object.freeze(r.concat(t));let e=fe(`key`,t.key,n,r);if(e===P)return P;e===F&&(t.key=null);let i=fe(`value`,t.value,n,r);if(i===P)return P;i===F&&(t.value=null)}}return i}async function pe(e,t){let n=he(t);O(e)?await me(null,e.contents,n,Object.freeze([e]))===F&&(e.contents=null):await me(null,e,n,Object.freeze([]))}pe.BREAK=P,pe.SKIP=de,pe.REMOVE=F;async function me(e,t,n,r){let i=await ge(e,t,n,r);if(N(i)||A(i))return _e(e,r,i),me(e,i,n,r);if(typeof i!=`symbol`){if(M(t)){r=Object.freeze(r.concat(t));for(let e=0;e<t.items.length;++e){let i=await me(e,t.items[e],n,r);if(typeof i==`number`)e=i-1;else if(i===P)return P;else i===F&&(t.items.splice(e,1),--e)}}else if(A(t)){r=Object.freeze(r.concat(t));let e=await me(`key`,t.key,n,r);if(e===P)return P;e===F&&(t.key=null);let i=await me(`value`,t.value,n,r);if(i===P)return P;i===F&&(t.value=null)}}return i}function he(e){return typeof e==`object`&&(e.Collection||e.Node||e.Value)?Object.assign({Alias:e.Node,Map:e.Node,Scalar:e.Node,Seq:e.Node},e.Value&&{Map:e.Value,Scalar:e.Value,Seq:e.Value},e.Collection&&{Map:e.Collection,Seq:e.Collection},e):e}function ge(e,t,n,r){if(typeof n==`function`)return n(e,t,r);if(k(t))return n.Map?.(e,t,r);if(le(t))return n.Seq?.(e,t,r);if(A(t))return n.Pair?.(e,t,r);if(j(t))return n.Scalar?.(e,t,r);if(D(t))return n.Alias?.(e,t,r)}function _e(e,t,n){let r=t[t.length-1];if(M(r))r.items[e]=n;else if(A(r))e===`key`?r.key=n:r.value=n;else if(O(r))r.contents=n;else{let e=D(r)?`alias`:`scalar`;throw Error(`Cannot replace node with ${e} parent`)}}const ve={"!":`%21`,",":`%2C`,"[":`%5B`,"]":`%5D`,"{":`%7B`,"}":`%7D`},ye=e=>e.replace(/[!,[\]{}]/g,e=>ve[e]);var be=class e{constructor(t,n){this.docStart=null,this.docEnd=!1,this.yaml=Object.assign({},e.defaultYaml,t),this.tags=Object.assign({},e.defaultTags,n)}clone(){let t=new e(this.yaml,this.tags);return t.docStart=this.docStart,t}atDocument(){let t=new e(this.yaml,this.tags);switch(this.yaml.version){case`1.1`:this.atNextDocument=!0;break;case`1.2`:this.atNextDocument=!1,this.yaml={explicit:e.defaultYaml.explicit,version:`1.2`},this.tags=Object.assign({},e.defaultTags)}return t}add(t,n){this.atNextDocument&&=(this.yaml={explicit:e.defaultYaml.explicit,version:`1.1`},this.tags=Object.assign({},e.defaultTags),!1);let r=t.trim().split(/[ \t]+/),i=r.shift();switch(i){case`%TAG`:{if(r.length!==2&&(n(0,`%TAG directive should contain exactly two parts`),r.length<2))return!1;let[e,t]=r;return this.tags[e]=t,!0}case`%YAML`:{if(this.yaml.explicit=!0,r.length!==1)return n(0,`%YAML directive should contain exactly one part`),!1;let[e]=r;if(e===`1.1`||e===`1.2`)return this.yaml.version=e,!0;{let t=/^\d+\.\d+$/.test(e);return n(6,`Unsupported YAML version ${e}`,t),!1}}default:return n(0,`Unknown directive ${i}`,!0),!1}}tagName(e,t){if(e===`!`)return`!`;if(e[0]!==`!`)return t(`Not a valid tag: ${e}`),null;if(e[1]===`<`){let n=e.slice(2,-1);return n===`!`||n===`!!`?(t(`Verbatim tags aren't resolved, so ${e} is invalid.`),null):(e[e.length-1]!==`>`&&t(`Verbatim tags must end with a >`),n)}let[,n,r]=e.match(/^(.*!)([^!]*)$/s);r||t(`The ${e} tag has no suffix`);let i=this.tags[n];if(i)try{return i+decodeURIComponent(r)}catch(e){return t(String(e)),null}return n===`!`?e:(t(`Could not resolve tag: ${e}`),null)}tagString(e){for(let[t,n]of Object.entries(this.tags))if(e.startsWith(n))return t+ye(e.substring(n.length));return e[0]===`!`?e:`!<${e}>`}toString(e){let t=this.yaml.explicit?[`%YAML ${this.yaml.version||`1.2`}`]:[],n=Object.entries(this.tags),r;if(e&&n.length>0&&N(e.contents)){let t={};I(e.contents,(e,n)=>{N(n)&&n.tag&&(t[n.tag]=!0)}),r=Object.keys(t)}else r=[];for(let[i,a]of n)(i!==`!!`||a!==`tag:yaml.org,2002:`)&&(!e||r.some(e=>e.startsWith(a)))&&t.push(`%TAG ${i} ${a}`);return t.join(`
1
+ import{t as e}from"./error-CBsvD8TI.js";import{existsSync as t}from"node:fs";import n from"node:path";import{readFile as r}from"node:fs/promises";import{TextlintKernel as i}from"@textlint/kernel";import{moduleInterop as a}from"@textlint/module-interop";import{MarkdownProcessor as o}from"@textlint/textlint-plugin-markdown/lib/src/MarkdownProcessor.js";import s from"@textlint-rule/textlint-rule-no-invalid-control-character";import c from"textlint-rule-no-zero-width-spaces";var l=Object.create,u=Object.defineProperty,d=Object.getOwnPropertyDescriptor,f=Object.getOwnPropertyNames,p=Object.getPrototypeOf,m=Object.prototype.hasOwnProperty,h=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t),e=null),t.exports),g=(e,t)=>{let n={};for(var r in e)u(n,r,{get:e[r],enumerable:!0});return t||u(n,Symbol.toStringTag,{value:`Module`}),n},_=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var i=f(t),a=0,o=i.length,s;a<o;a++)s=i[a],!m.call(e,s)&&s!==n&&u(e,s,{get:(e=>t[e]).bind(null,s),enumerable:!(r=d(t,s))||r.enumerable});return e},v=(e,t,n)=>(n=e==null?{}:l(p(e)),_(t||!e||!e.__esModule||!m.call(e,`default`)?u(n,`default`,{value:e,enumerable:!0}):n,e));const y=/\p{Script=Hangul}/u,b=/\p{Script=Han}/u,x=/* @__PURE__ */ new Set(`个乘亂亞从佛來們假傳僞價儉兒兩册刄剩劍劑勞勳勵勸區卷參听呀咯哇哦唔單嘛嚴囑囘圈國圍圓圖團墮壓壘壞壤壯壹壻壽奧奬姙孃學寢實寫寶將專對屆屬峽巖帶广廢廣廳彈很徑從怎恆惡惱愼慘懷戀戰戲拂拔拜挾插搖搜擇擔據擧擴攜攝收效敍敕數斷晝曉會條棧榮樂樓樞樣檢權歐歡歸殘殼毆氣沒淨淺滯滿潛澁濕濟灣燈燒營爐爭爲犧狹獨獵獸獻瓣畫當疊癡發盜盡碎碼祕禪禮稱稻穗穩竊竝粹絲經縣縱總繩繪繼續纖缺罐聲聽肅腦膽臟臺與舉舊舍舖艷莊莖萬藏藥處號螢蟲蠶蠻衞裝襃覺覽觀觸謠證譯譽讀變讓讚豐豫貳賣贊跟踐輕轉辨辭辯這遙遞遲鄰醉醫釀釋錢鎭鏈鐵鑄鑛關陷隨險隱隸雖雙雜霸靈靜顏顯飜飮餘餠騷驅驗驛髓體髮鬪鷄鹽麥麼黏默點黨齊齒齡龜`);let S;function ee(e,t=``){let n=new Set(t.normalize(`NFKC`)),r=S??=te(),i=/* @__PURE__ */ new Set;for(let t of e.normalize(`NFKC`))n.has(t)||(y.test(t)||b.test(t)&&(!r.has(t)||x.has(t)))&&i.add(t);return[...i]}function te(){let e=new TextDecoder(`shift_jis`),t=/* @__PURE__ */ new Set(`𠮟塡剝頰仼伃伹侊俿偂僘僴兊兤冝凬刕劜劯匇匤厓叝咊咜喆坙坥垬埈墲夋奛奝奣尞岺峵嵓嵭嶹巐弡弴彅惞愑愰憘戓抦敎昞昻晳暿曺曻朎杦栁桒棏樰橳櫢櫤涖淸澵濵焏犱犾猤玽甁硺礰竧箞絈緖罇荢葈蓜蘒蠇裵褜訷贒郞鄕釞釥鈼鉙鉷鍈鏆隝隯霳霻靍靏靑靕髙魲鮏鮱鮻鰀﨎﨏﨑﨓﨔﨟﨡﨣﨤﨧﨨﨩𠮷`);for(let n=129;n<=234;n++)if(!(n>=160&&n<=223))for(let r=64;r<=252;r++)t.add(e.decode(new Uint8Array([n,r])));return t}function ne(e){return Array.from(new Set(e))}function re(...e){let t,n,r;e.length===1?(t=0,r=1,[n]=e):[t,n,r=1]=e;let i=[],a=t;for(;a<n;)i.push(a),a+=r||1;return i}function ie(e){return e.replace(/\\/g,`/`)}function ae(e,t){if(!t||t===`all`||t===`*`)return re(1,e+1);if(t===`none`)return[];let n=[];for(let r of t.split(/[,;]/g))if(!r.includes(`-`))n.push(+r);else{let[t,i]=r.split(`-`,2);n.push(...re(+t,i?+i+1:e+1))}return ne(n).filter(t=>t<=e).sort((e,t)=>e-t)}const oe=Symbol.for(`yaml.alias`),se=Symbol.for(`yaml.document`),C=Symbol.for(`yaml.map`),ce=Symbol.for(`yaml.pair`),w=Symbol.for(`yaml.scalar`),T=Symbol.for(`yaml.seq`),E=Symbol.for(`yaml.node.type`),D=e=>!!e&&typeof e==`object`&&e[E]===oe,O=e=>!!e&&typeof e==`object`&&e[E]===se,k=e=>!!e&&typeof e==`object`&&e[E]===C,A=e=>!!e&&typeof e==`object`&&e[E]===ce,j=e=>!!e&&typeof e==`object`&&e[E]===w,le=e=>!!e&&typeof e==`object`&&e[E]===T;function M(e){if(e&&typeof e==`object`)switch(e[E]){case C:case T:return!0}return!1}function N(e){if(e&&typeof e==`object`)switch(e[E]){case oe:case C:case w:case T:return!0}return!1}const ue=e=>(j(e)||M(e))&&!!e.anchor,P=Symbol(`break visit`),de=Symbol(`skip children`),F=Symbol(`remove node`);function I(e,t){let n=he(t);O(e)?fe(null,e.contents,n,Object.freeze([e]))===F&&(e.contents=null):fe(null,e,n,Object.freeze([]))}I.BREAK=P,I.SKIP=de,I.REMOVE=F;function fe(e,t,n,r){let i=ge(e,t,n,r);if(N(i)||A(i))return _e(e,r,i),fe(e,i,n,r);if(typeof i!=`symbol`){if(M(t)){r=Object.freeze(r.concat(t));for(let e=0;e<t.items.length;++e){let i=fe(e,t.items[e],n,r);if(typeof i==`number`)e=i-1;else if(i===P)return P;else i===F&&(t.items.splice(e,1),--e)}}else if(A(t)){r=Object.freeze(r.concat(t));let e=fe(`key`,t.key,n,r);if(e===P)return P;e===F&&(t.key=null);let i=fe(`value`,t.value,n,r);if(i===P)return P;i===F&&(t.value=null)}}return i}async function pe(e,t){let n=he(t);O(e)?await me(null,e.contents,n,Object.freeze([e]))===F&&(e.contents=null):await me(null,e,n,Object.freeze([]))}pe.BREAK=P,pe.SKIP=de,pe.REMOVE=F;async function me(e,t,n,r){let i=await ge(e,t,n,r);if(N(i)||A(i))return _e(e,r,i),me(e,i,n,r);if(typeof i!=`symbol`){if(M(t)){r=Object.freeze(r.concat(t));for(let e=0;e<t.items.length;++e){let i=await me(e,t.items[e],n,r);if(typeof i==`number`)e=i-1;else if(i===P)return P;else i===F&&(t.items.splice(e,1),--e)}}else if(A(t)){r=Object.freeze(r.concat(t));let e=await me(`key`,t.key,n,r);if(e===P)return P;e===F&&(t.key=null);let i=await me(`value`,t.value,n,r);if(i===P)return P;i===F&&(t.value=null)}}return i}function he(e){return typeof e==`object`&&(e.Collection||e.Node||e.Value)?Object.assign({Alias:e.Node,Map:e.Node,Scalar:e.Node,Seq:e.Node},e.Value&&{Map:e.Value,Scalar:e.Value,Seq:e.Value},e.Collection&&{Map:e.Collection,Seq:e.Collection},e):e}function ge(e,t,n,r){if(typeof n==`function`)return n(e,t,r);if(k(t))return n.Map?.(e,t,r);if(le(t))return n.Seq?.(e,t,r);if(A(t))return n.Pair?.(e,t,r);if(j(t))return n.Scalar?.(e,t,r);if(D(t))return n.Alias?.(e,t,r)}function _e(e,t,n){let r=t[t.length-1];if(M(r))r.items[e]=n;else if(A(r))e===`key`?r.key=n:r.value=n;else if(O(r))r.contents=n;else{let e=D(r)?`alias`:`scalar`;throw Error(`Cannot replace node with ${e} parent`)}}const ve={"!":`%21`,",":`%2C`,"[":`%5B`,"]":`%5D`,"{":`%7B`,"}":`%7D`},ye=e=>e.replace(/[!,[\]{}]/g,e=>ve[e]);var be=class e{constructor(t,n){this.docStart=null,this.docEnd=!1,this.yaml=Object.assign({},e.defaultYaml,t),this.tags=Object.assign({},e.defaultTags,n)}clone(){let t=new e(this.yaml,this.tags);return t.docStart=this.docStart,t}atDocument(){let t=new e(this.yaml,this.tags);switch(this.yaml.version){case`1.1`:this.atNextDocument=!0;break;case`1.2`:this.atNextDocument=!1,this.yaml={explicit:e.defaultYaml.explicit,version:`1.2`},this.tags=Object.assign({},e.defaultTags)}return t}add(t,n){this.atNextDocument&&=(this.yaml={explicit:e.defaultYaml.explicit,version:`1.1`},this.tags=Object.assign({},e.defaultTags),!1);let r=t.trim().split(/[ \t]+/),i=r.shift();switch(i){case`%TAG`:{if(r.length!==2&&(n(0,`%TAG directive should contain exactly two parts`),r.length<2))return!1;let[e,t]=r;return this.tags[e]=t,!0}case`%YAML`:{if(this.yaml.explicit=!0,r.length!==1)return n(0,`%YAML directive should contain exactly one part`),!1;let[e]=r;if(e===`1.1`||e===`1.2`)return this.yaml.version=e,!0;{let t=/^\d+\.\d+$/.test(e);return n(6,`Unsupported YAML version ${e}`,t),!1}}default:return n(0,`Unknown directive ${i}`,!0),!1}}tagName(e,t){if(e===`!`)return`!`;if(e[0]!==`!`)return t(`Not a valid tag: ${e}`),null;if(e[1]===`<`){let n=e.slice(2,-1);return n===`!`||n===`!!`?(t(`Verbatim tags aren't resolved, so ${e} is invalid.`),null):(e[e.length-1]!==`>`&&t(`Verbatim tags must end with a >`),n)}let[,n,r]=e.match(/^(.*!)([^!]*)$/s);r||t(`The ${e} tag has no suffix`);let i=this.tags[n];if(i)try{return i+decodeURIComponent(r)}catch(e){return t(String(e)),null}return n===`!`?e:(t(`Could not resolve tag: ${e}`),null)}tagString(e){for(let[t,n]of Object.entries(this.tags))if(e.startsWith(n))return t+ye(e.substring(n.length));return e[0]===`!`?e:`!<${e}>`}toString(e){let t=this.yaml.explicit?[`%YAML ${this.yaml.version||`1.2`}`]:[],n=Object.entries(this.tags),r;if(e&&n.length>0&&N(e.contents)){let t={};I(e.contents,(e,n)=>{N(n)&&n.tag&&(t[n.tag]=!0)}),r=Object.keys(t)}else r=[];for(let[i,a]of n)(i!==`!!`||a!==`tag:yaml.org,2002:`)&&(!e||r.some(e=>e.startsWith(a)))&&t.push(`%TAG ${i} ${a}`);return t.join(`
2
2
  `)}};be.defaultYaml={explicit:!1,version:`1.2`},be.defaultTags={"!!":`tag:yaml.org,2002:`};function xe(e){if(/[\x00-\x19\s,[\]{}]/.test(e)){let t=`Anchor must not contain whitespace or control characters: ${JSON.stringify(e)}`;throw Error(t)}return!0}function Se(e){let t=/* @__PURE__ */ new Set;return I(e,{Value(e,n){n.anchor&&t.add(n.anchor)}}),t}function Ce(e,t){for(let n=1;;++n){let r=`${e}${n}`;if(!t.has(r))return r}}function we(e,t){let n=[],r=/* @__PURE__ */ new Map,i=null;return{onAnchor:r=>{n.push(r),i??=Se(e);let a=Ce(t,i);return i.add(a),a},setAnchors:()=>{for(let e of n){let t=r.get(e);if(typeof t==`object`&&t.anchor&&(j(t.node)||M(t.node)))t.node.anchor=t.anchor;else{let t=/* @__PURE__ */ Error(`Failed to resolve repeated object (this should not happen)`);throw t.source=e,t}}},sourceObjects:r}}function Te(e,t,n,r){if(r&&typeof r==`object`){if(Array.isArray(r))for(let t=0,n=r.length;t<n;++t){let n=r[t],i=Te(e,r,String(t),n);i===void 0?delete r[t]:i!==n&&(r[t]=i)}else if(r instanceof Map)for(let t of Array.from(r.keys())){let n=r.get(t),i=Te(e,r,t,n);i===void 0?r.delete(t):i!==n&&r.set(t,i)}else if(r instanceof Set)for(let t of Array.from(r)){let n=Te(e,r,t,t);n===void 0?r.delete(t):n!==t&&(r.delete(t),r.add(n))}else for(let[t,n]of Object.entries(r)){let i=Te(e,r,t,n);i===void 0?delete r[t]:i!==n&&(r[t]=i)}}return e.call(t,n,r)}function L(e,t,n){if(Array.isArray(e))return e.map((e,t)=>L(e,String(t),n));if(e&&typeof e.toJSON==`function`){if(!n||!ue(e))return e.toJSON(t,n);let r={aliasCount:0,count:1,res:void 0};n.anchors.set(e,r),n.onCreate=e=>{r.res=e,delete n.onCreate};let i=e.toJSON(t,n);return n.onCreate&&n.onCreate(i),i}return typeof e==`bigint`&&!n?.keep?Number(e):e}var Ee=class{constructor(e){Object.defineProperty(this,E,{value:e})}clone(){let e=Object.create(Object.getPrototypeOf(this),Object.getOwnPropertyDescriptors(this));return this.range&&(e.range=this.range.slice()),e}toJS(e,{mapAsMap:t,maxAliasCount:n,onAnchor:r,reviver:i}={}){if(!O(e))throw TypeError(`A document argument is required`);let a={anchors:/* @__PURE__ */ new Map,doc:e,keep:!0,mapAsMap:t===!0,mapKeyWarned:!1,maxAliasCount:typeof n==`number`?n:100},o=L(this,``,a);if(typeof r==`function`)for(let{count:e,res:t}of a.anchors.values())r(t,e);return typeof i==`function`?Te(i,{"":o},``,o):o}},De=class extends Ee{constructor(e){super(oe),this.source=e,Object.defineProperty(this,"tag",{set(){throw Error(`Alias nodes cannot have tags`)}})}resolve(e,t){if(t?.maxAliasCount===0)throw ReferenceError(`Alias resolution is disabled`);let n;t?.aliasResolveCache?n=t.aliasResolveCache:(n=[],I(e,{Node:(e,t)=>{(D(t)||ue(t))&&n.push(t)}}),t&&(t.aliasResolveCache=n));let r;for(let e of n){if(e===this)break;e.anchor===this.source&&(r=e)}if(r&&t){let{anchors:e,doc:n,maxAliasCount:i}=t,a=e.get(r);
3
3
  /* istanbul ignore if */
4
4
  if(a||=(L(r,null,t),e.get(r)),a?.res===void 0)throw ReferenceError(`This should not happen: Alias anchor was not resolved?`);if(i>=0&&(a.count+=1,a.aliasCount===0&&(a.aliasCount=Oe(n,r,e)),a.count*a.aliasCount>i))throw ReferenceError(`Excessive alias count indicates a resource exhaustion attack`)}return r}toJSON(e,t){if(!t)return{source:this.source};let n=this.resolve(t.doc,t);if(!n){let e=`Unresolved alias (the anchor must be set before the alias): ${this.source}`;throw ReferenceError(e)}return t.anchors.get(n).res}toString(e,t,n){let r=`*${this.source}`;if(e){if(xe(this.source),e.options.verifyAliasOrder&&!e.anchors.has(this.source)){let e=`Unresolved alias (the anchor must be set before the alias): ${this.source}`;throw Error(e)}if(e.implicitKey)return`${r} `}return r}};function Oe(e,t,n){if(D(t)){let r=t.resolve(e),i=n&&r&&n.get(r);return i?i.count*i.aliasCount:0}if(M(t)){let r=0;for(let i of t.items){let t=Oe(e,i,n);t>r&&(r=t)}return r}if(A(t)){let r=Oe(e,t.key,n),i=Oe(e,t.value,n);return Math.max(r,i)}return 1}const ke=e=>!e||typeof e!=`function`&&typeof e!=`object`;var R=class extends Ee{constructor(e){super(w),this.value=e}toJSON(e,t){return t?.keep?this.value:L(this.value,e,t)}toString(){return String(this.value)}};R.BLOCK_FOLDED=`BLOCK_FOLDED`,R.BLOCK_LITERAL=`BLOCK_LITERAL`,R.PLAIN=`PLAIN`,R.QUOTE_DOUBLE=`QUOTE_DOUBLE`,R.QUOTE_SINGLE=`QUOTE_SINGLE`;function Ae(e,t,n){if(t){let e=n.filter(e=>e.tag===t),r=e.find(e=>!e.format)??e[0];if(!r)throw Error(`Tag ${t} not found`);return r}return n.find(t=>t.identify?.(e)&&!t.format)}function je(e,t,n){if(O(e)&&(e=e.contents),N(e))return e;if(A(e)){let t=n.schema[C].createNode?.(n.schema,null,n);return t.items.push(e),t}(e instanceof String||e instanceof Number||e instanceof Boolean||typeof BigInt<`u`&&e instanceof BigInt)&&(e=e.valueOf());let{aliasDuplicateObjects:r,onAnchor:i,onTagObj:a,schema:o,sourceObjects:s}=n,c;if(r&&e&&typeof e==`object`){if(c=s.get(e),c)return c.anchor??(c.anchor=i(e)),new De(c.anchor);c={anchor:null,node:null},s.set(e,c)}t?.startsWith(`!!`)&&(t=`tag:yaml.org,2002:`+t.slice(2));let l=Ae(e,t,o.tags);if(!l){if(e&&typeof e.toJSON==`function`&&(e=e.toJSON()),!e||typeof e!=`object`){let t=new R(e);return c&&(c.node=t),t}l=e instanceof Map?o[C]:Symbol.iterator in Object(e)?o[T]:o[C]}a&&(a(l),delete n.onTagObj);let u=l?.createNode?l.createNode(n.schema,e,n):typeof l?.nodeClass?.from==`function`?l.nodeClass.from(n.schema,e,n):new R(e);return t?u.tag=t:l.default||(u.tag=l.tag),c&&(c.node=u),u}function Me(e,t,n){let r=n;for(let e=t.length-1;e>=0;--e){let n=t[e];if(typeof n==`number`&&Number.isInteger(n)&&n>=0){let e=[];e[n]=r,r=e}else r=/* @__PURE__ */ new Map([[n,r]])}return je(r,void 0,{aliasDuplicateObjects:!1,keepUndefined:!1,onAnchor:()=>{throw Error(`This should not happen, please report a bug.`)},schema:e,sourceObjects:/* @__PURE__ */ new Map})}const Ne=e=>e==null||typeof e==`object`&&!!e[Symbol.iterator]().next().done;var Pe=class extends Ee{constructor(e,t){super(e),Object.defineProperty(this,"schema",{value:t,configurable:!0,enumerable:!1,writable:!0})}clone(e){let t=Object.create(Object.getPrototypeOf(this),Object.getOwnPropertyDescriptors(this));return e&&(t.schema=e),t.items=t.items.map(t=>N(t)||A(t)?t.clone(e):t),this.range&&(t.range=this.range.slice()),t}addIn(e,t){if(Ne(e))this.add(t);else{let[n,...r]=e,i=this.get(n,!0);if(M(i))i.addIn(r,t);else if(i===void 0&&this.schema)this.set(n,Me(this.schema,r,t));else throw Error(`Expected YAML collection at ${n}. Remaining path: ${r}`)}}deleteIn(e){let[t,...n]=e;if(n.length===0)return this.delete(t);let r=this.get(t,!0);if(M(r))return r.deleteIn(n);throw Error(`Expected YAML collection at ${t}. Remaining path: ${n}`)}getIn(e,t){let[n,...r]=e,i=this.get(n,!0);return r.length===0?!t&&j(i)?i.value:i:M(i)?i.getIn(r,t):void 0}hasAllNullValues(e){return this.items.every(t=>{if(!A(t))return!1;let n=t.value;return n==null||e&&j(n)&&n.value==null&&!n.commentBefore&&!n.comment&&!n.tag})}hasIn(e){let[t,...n]=e;if(n.length===0)return this.has(t);let r=this.get(t,!0);return M(r)?r.hasIn(n):!1}setIn(e,t){let[n,...r]=e;if(r.length===0)this.set(n,t);else{let e=this.get(n,!0);if(M(e))e.setIn(r,t);else if(e===void 0&&this.schema)this.set(n,Me(this.schema,r,t));else throw Error(`Expected YAML collection at ${n}. Remaining path: ${r}`)}}};const Fe=e=>e.replace(/^(?!$)(?: $)?/gm,`#`);function z(e,t){return/^\n+$/.test(e)?e.substring(1):t?e.replace(/^(?! *$)/gm,t):e}const B=(e,t,n)=>e.endsWith(`
@@ -141,4 +141,4 @@ n?this.stack.push(n):(yield*this.pop(),yield*this.step())}else{let t=this.peek(2
141
141
  `),r),filepath:t,index:a.length,start:o,contentStart:s,end:e};if(n)for(let e of n){if(e.transformSlide){let t=await e.transformSlide(c.content,c.frontmatter);t!==void 0&&(c.content=t),typeof c.frontmatter.title==`string`&&(c.title=c.frontmatter.title),typeof c.frontmatter.level==`number`&&(c.level=c.frontmatter.level)}if(e.transformNote){let t=await e.transformNote(c.note,c.frontmatter);t!==void 0&&(c.note=t)}}a.push(c),o=e+1,s=e+1}if(n)for(let e of n)e.transformRawLines&&await e.transformRawLines(i);for(let e=0;e<i.length;e++){let t=i[e],n=t.trimEnd();if(c){c=qr(t,!0);continue}if(n.startsWith(`---`)){await l(e);let t=i[e+1];if(n[3]!==`-`&&t?.trim()){for(o=e,e+=1;e<i.length&&i[e].trimEnd()!==`---`;e++);s=e+1}}else if(n.trimStart().startsWith("```")){let t=n.match(Gr)[0],r=e+1;for(;r<i.length&&!i[r].startsWith(t);r++);r!==i.length&&(e=r)}else c=qr(t,!1)}return o<=i.length-1&&await l(i.length),{filepath:t,raw:e,slides:a}}function ni(e){let t=/* @__PURE__ */ new Set,n=/* @__PURE__ */ new Set;return e.replace(/^```(\w+)\s*\{monaco([^}]*)\}\s*(\S[\s\S]*?)^```/gm,(e,r=`ts`,i,a)=>{r=r.trim();let o=i===`-run`;if([`js`,`javascript`,`ts`,`typescript`].includes(r))for(let[,,e]of a.matchAll(/\s+from\s+(["'])([/.\w@-]+)\1/g))e&&(`./`.includes(e)||t.add(e),o&&n.add(e));return``}),{types:Array.from(t),deps:Array.from(n)}}function ri(e){let t=0;for(let n=0;n<e.length;n++)t=(t<<5)-t+e.charCodeAt(n),t|=0;return t.toString(36).slice(0,12)}const ii=/^[A-Za-z]:\//;function ai(e=``){return e&&e.replace(/\\/g,`/`).replace(ii,e=>e.toUpperCase())}const oi=/^[/\\](?![/\\])|^[/\\]{2}(?!\.)|^[A-Za-z]:[/\\]/,si=/^[A-Za-z]:$/,ci=/^\/([A-Za-z]:)?$/;function li(){return typeof process<`u`&&typeof process.cwd==`function`?process.cwd().replace(/\\/g,`/`):`/`}const ui=function(...e){e=e.map(e=>ai(e));let t=``,n=!1;for(let r=e.length-1;r>=-1&&!n;r--){let i=r>=0?e[r]:li();i&&i.length!==0&&(t=`${i}/${t}`,n=fi(i))}return t=di(t,!n),n&&!fi(t)?`/${t}`:t.length>0?t:`.`};function di(e,t){let n=``,r=0,i=-1,a=0,o=null;for(let s=0;s<=e.length;++s){if(s<e.length)o=e[s];else if(o===`/`)break;else o=`/`;if(o===`/`){if(i!==s-1&&a!==1){if(a===2){if(n.length<2||r!==2||n[n.length-1]!==`.`||n[n.length-2]!==`.`){if(n.length>2){let e=n.lastIndexOf(`/`);e===-1?(n=``,r=0):(n=n.slice(0,e),r=n.length-1-n.lastIndexOf(`/`)),i=s,a=0;continue}if(n.length>0){n=``,r=0,i=s,a=0;continue}}t&&(n+=n.length>0?`/..`:`..`,r=2)}else n.length>0?n+=`/${e.slice(i+1,s)}`:n=e.slice(i+1,s),r=s-i-1}i=s,a=0}else o===`.`&&a!==-1?++a:a=-1}return n}const fi=function(e){return oi.test(e)},pi=function(e,t){let n=ui(e).replace(ci,`$1`).split(`/`),r=ui(t).replace(ci,`$1`).split(`/`);if(r[0][1]===`:`&&n[0][1]===`:`&&n[0]!==r[0])return r.join(`/`);let i=[...n];for(let e of i){if(r[0]!==e)break;n.shift(),r.shift()}return[...n.map(()=>`..`),...r].join(`/`)},mi=function(e){let t=ai(e).replace(/\/$/,``).split(`/`).slice(0,-1);return t.length===1&&si.test(t[0])&&(t[0]+=`/`),t.join(`/`)||(fi(e)?`/`:`.`)};function hi(e,t){return t.some(t=>{let n=pi(t,e);return n===``||!!n&&!n.startsWith(`..`)&&!fi(n)})}async function gi(e,n,i={},a){let o=typeof i==`function`?i:async e=>i[e]??r(e,`utf-8`);await o(n);let s,c={},l={},u=[];async function d(e,t,n,r){let i=c[e];i||(i=await ti(await o(e),e,s),c[e]=i,l[e]=/* @__PURE__ */ new Set);let a=r?.at(-1);for(let o of ae(i.slides.length,t)){let t=i.slides[o-1];if(!t){i.errors??=[],i.errors.push({row:0,message:`Slide ${o} does not exist in "${e}", which has ${i.slides.length} slides`});continue}try{await f(i,t,n,r)}catch(e){i.errors??=[],i.errors.push({row:t.start,message:`Error when loading slide: ${e}`});continue}a&&(a.imports??=[]).push(t)}return i}async function f(n,r,i,a){if(!(r.frontmatter.disabled||r.frontmatter.hide)){if(r.frontmatter.src){let[o,s]=r.frontmatter.src.split(`#`),c=ie(o.startsWith(`/`)?ui(e.userRoot,o.substring(1)):ui(mi(r.filepath),o));i={...r.frontmatter,...i},delete i.src;let l=new Set((a??[]).map(e=>e.filepath));if(c===r.filepath||l.has(c)){n.errors??=[],n.errors.push({row:r.start,message:`Circular import detected for "${r.frontmatter.src}" (${c})`});return}e.allowedRoots&&!hi(c,e.allowedRoots)?(n.errors??=[],n.errors.push({row:r.start,message:`Imported markdown escapes the project root: ${c}`})):t(c)?await d(c,s,i,a?[...a,r]:[r]):(n.errors??=[],n.errors.push({row:r.start,message:`Imported markdown file not found: ${c}`}))}else u.push({frontmatter:{...r.frontmatter,...i},content:r.content,revision:r.revision,frontmatterRaw:r.frontmatterRaw,note:r.note,title:r.title,level:r.level,index:u.length,importChain:a,source:r})}}let p=await d(ie(n)),m={...p.slides[0]?.frontmatter};return u[0]?.title&&(m.title??=u[0].title),{slides:u,entry:p,headmatter:m,features:$r(u.map(e=>e.source.raw).join(``)),markdownFiles:c,watchFiles:l}}var _i=/* @__PURE__ */ h((e=>{Object.defineProperty(e,"__esModule",{value:!0}),e.ASTNodeTypes=void 0;var t;(function(e){e.Document=`Document`,e.DocumentExit=`Document:exit`,e.Paragraph=`Paragraph`,e.ParagraphExit=`Paragraph:exit`,e.BlockQuote=`BlockQuote`,e.BlockQuoteExit=`BlockQuote:exit`,e.ListItem=`ListItem`,e.ListItemExit=`ListItem:exit`,e.List=`List`,e.ListExit=`List:exit`,e.Header=`Header`,e.HeaderExit=`Header:exit`,e.CodeBlock=`CodeBlock`,e.CodeBlockExit=`CodeBlock:exit`,e.HtmlBlock=`HtmlBlock`,e.HtmlBlockExit=`HtmlBlock:exit`,e.HorizontalRule=`HorizontalRule`,e.HorizontalRuleExit=`HorizontalRule:exit`,e.Comment=`Comment`,e.CommentExit=`Comment:exit`,e.ReferenceDef=`ReferenceDef`,e.ReferenceDefExit=`ReferenceDef:exit`,e.Str=`Str`,e.StrExit=`Str:exit`,e.Break=`Break`,e.BreakExit=`Break:exit`,e.Emphasis=`Emphasis`,e.EmphasisExit=`Emphasis:exit`,e.Strong=`Strong`,e.StrongExit=`Strong:exit`,e.Html=`Html`,e.HtmlExit=`Html:exit`,e.Link=`Link`,e.LinkExit=`Link:exit`,e.LinkReference=`LinkReference`,e.LinkReferenceExit=`LinkReference:exit`,e.Image=`Image`,e.ImageExit=`Image:exit`,e.ImageReference=`ImageReference`,e.ImageReferenceExit=`ImageReference:exit`,e.Definition=`Definition`,e.DefinitionExit=`Definition:exit`,e.Code=`Code`,e.CodeExit=`Code:exit`,e.Delete=`Delete`,e.DeleteExit=`Delete:exit`,e.Table=`Table`,e.TableExit=`Table:exit`,e.TableRow=`TableRow`,e.TableRowExit=`TableRow:exit`,e.TableCell=`TableCell`,e.TableCellExit=`TableCell:exit`})(t||(e.ASTNodeTypes=t={}))})),vi=/* @__PURE__ */ h((e=>{Object.defineProperty(e,"__esModule",{value:!0}),e.ASTNodeTypes=void 0;var t=_i();Object.defineProperty(e,"ASTNodeTypes",{enumerable:!0,get:function(){return t.ASTNodeTypes}})})),yi=/* @__PURE__ */ h((e=>{Object.defineProperty(e,"__esModule",{value:!0});var t=vi();e.default=function(){function e(e){this._ruleContext=e}return e.prototype.getParents=function(e){for(var t=[],n=e.parent;n!=null;)t.push(n),n=n.parent;return t},e.prototype.isChildNode=function(e,t){var n=this.getParents(e).map(function(e){return e.type});return t.some(function(e){return n.some(function(t){return t===e})})},e.prototype.isPlainStrNode=function(e){return e.type!==t.ASTNodeTypes.Str||e.parent?.type!==t.ASTNodeTypes.Paragraph?!1:!this.isChildNode(e,[t.ASTNodeTypes.BlockQuote])},e}()})),bi=/* @__PURE__ */ h(((e,t)=>{t.exports=n;function n(e){if(e==null)return o;if(typeof e==`string`)return a(e);if(typeof e==`object`)return`length`in e?i(e):r(e);if(typeof e==`function`)return e;throw Error(`Expected function, string, or object as test`)}function r(e){return t;function t(t){for(var n in e)if(t[n]!==e[n])return!1;return!0}}function i(e){for(var t=[],r=-1;++r<e.length;)t[r]=n(e[r]);return i;function i(){for(var e=-1;++e<t.length;)if(t[e].apply(this,arguments))return!0;return!1}}function a(e){return t;function t(t){return!!(t&&t.type===e)}}function o(){return!0}})),xi=/* @__PURE__ */ h(((e,t)=>{t.exports=n;function n(e){return e}})),Si=/* @__PURE__ */ h(((e,t)=>{t.exports=s;var n=bi(),r=xi(),i=!0,a=`skip`,o=!1;s.CONTINUE=i,s.SKIP=a,s.EXIT=o;function s(e,t,i,s){var l,u;typeof t==`function`&&typeof i!=`function`&&(s=i,i=t,t=null),u=n(t),l=s?-1:1,d(e,null,[])();function d(e,n,f){var p=typeof e==`object`&&e?e:{},m;return typeof p.type==`string`&&(m=typeof p.tagName==`string`?p.tagName:typeof p.name==`string`?p.name:void 0,h.displayName=`node (`+r(p.type+(m?`<`+m+`>`:``))+`)`),h;function h(){var r=f.concat(e),p=[],m,h;if((!t||u(e,n,f[f.length-1]||null))&&(p=c(i(e,f)),p[0]===o))return p;if(e.children&&p[0]!==a)for(h=(s?e.children.length:-1)+l;h>-1&&h<e.children.length;){if(m=d(e.children[h],h,r)(),m[0]===o)return m;h=typeof m[1]==`number`?m[1]:h+l}return p}}}function c(e){return typeof e==`object`&&e&&`length`in e?e:typeof e==`number`?[i,e]:[e]}})),Ci=/* @__PURE__ */ h(((e,t)=>{t.exports=o;var n=Si(),r=n.CONTINUE,i=n.SKIP,a=n.EXIT;o.CONTINUE=r,o.SKIP=i,o.EXIT=a;function o(e,t,r,i){typeof t==`function`&&typeof r!=`function`&&(i=r,r=t,t=null),n(e,t,a,i);function a(e,t){var n=t[t.length-1],i=n?n.children.indexOf(e):null;return r(e,i,n)}}})),wi=/* @__PURE__ */ h((e=>{var t=e&&e.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(e,"__esModule",{value:!0});var n=t(Ci());e.default=function(){function e(){this._ignoredRangeList=[]}return Object.defineProperty(e.prototype,"ignoredRanges",{get:function(){return this._ignoredRangeList},enumerable:!1,configurable:!0}),e.prototype.isIgnoredIndex=function(e){return this._ignoredRangeList.some(function(t){var n=t[0],r=t[1];return n<=e&&e<r})},e.prototype.isIgnoredRange=function(e){return this.isIgnoredIndex(e[0])||this.isIgnoredIndex(e[1])},e.prototype.isIgnored=function(e){return this.isIgnoredRange(e.range)},e.prototype.ignore=function(e){this.ignoreRange(e.range)},e.prototype.ignoreRange=function(e){this._ignoredRangeList.push(e)},e.prototype.ignoreChildrenByTypes=function(e,t){var r=this;(0,n.default)(e,function(e){t.includes(e.type)&&r.ignore(e)})},e}()})),Ti=/* @__PURE__ */ h((e=>{Object.defineProperty(e,"__esModule",{value:!0}),e.binarySearch=e.upperBound=e.lowerBound=e.compare=void 0;function t(e,t){return e<t}e.compare=t;function n(e,n,r=t){let i=e.length,a=0;for(;i;){let t=i>>>1,o=a+t;r(n,e[o])?i=t:(a=o+1,i-=t+1)}return a}e.upperBound=n;function r(e,n,r=t){let i=e.length,a=0;for(;i;){let t=i>>>1,o=a+t;r(e[o],n)?(a=o+1,i-=t+1):i=t}return a}e.lowerBound=r;function i(e,n,i=t){let a=r(e,n,i);return a!==e.length&&!i(n,e[a])}e.binarySearch=i})),Ei=/* @__PURE__ */ h((e=>{Object.defineProperty(e,"__esModule",{value:!0}),e.StructuredSource=void 0;let t=Ti();e.StructuredSource=class{constructor(e){this.indice=[0];let t=/[\r\n\u2028\u2029]/g,n=e.length;for(t.lastIndex=0;;){let r=t.exec(e);if(!r)break;let i=r.index;e.charCodeAt(i)===13&&e.charCodeAt(i+1)===10&&(i+=1);let a=i+1;if(n<a)break;this.indice.push(a),t.lastIndex=a}}get line(){return this.indice.length}locationToRange(e){return[this.positionToIndex(e.start),this.positionToIndex(e.end)]}rangeToLocation(e){return{start:this.indexToPosition(e[0]),end:this.indexToPosition(e[1])}}positionToIndex(e){return this.indice[e.line-1]+e.column}indexToPosition(e){let n=(0,t.upperBound)(this.indice,e);return{line:n,column:e-this.indice[n-1]}}}})),Di=/* @__PURE__ */ h((e=>{Object.defineProperty(e,"__esModule",{value:!0}),e.SourceLocation=void 0;var t=Ei();e.SourceLocation=function(){function e(e){this.source=new t.StructuredSource(e)}return e.prototype.toAbsoluteLocation=function(e,t){var n=e.range,r=e.loc.start.line,i=e.loc.start.column;if(t.index!==void 0){var a=t.index;return n[0]+a}if(t.line!==void 0&&t.column!==void 0){var o=r+t.line;return t.column>0?this.source.positionToIndex({line:o,column:t.column}):this.source.positionToIndex({line:o,column:i})}if(t.line!==void 0&&t.line>0){var o=r+t.line;return this.source.positionToIndex({line:o,column:i})}return n[0]},e}()})),Oi=/* @__PURE__ */ h((e=>{var t=e&&e.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(e,"__esModule",{value:!0}),e.wrapReportHandler=a;var n=t(yi()),r=t(wi()),i=Di();function a(e,t,a){var o=t.ignoreNodeTypes||[],s=new r.default,c=new n.default(e),l=e.getSource(),u=new i.SourceLocation(l),d=a(function(t,n){var r=u.toAbsoluteLocation(t,n);if(!s.isIgnoredIndex(r))return e.report(t,n)});return Object.keys(d).forEach(function(e){var t=d[e];d[e]=function(e){if(s.ignoreChildrenByTypes(e,o),!c.isChildNode(e,o)&&t)return t(e)}}),d}})),ki=/* @__PURE__ */ h((e=>{var t=e&&e.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(e,"__esModule",{value:!0}),e.wrapReportHandler=e.RuleHelper=e.IgnoreNodeManager=void 0,e.RuleHelper=t(yi()).default,e.IgnoreNodeManager=t(wi()).default;var n=Oi();Object.defineProperty(e,"wrapReportHandler",{enumerable:!0,get:function(){return n.wrapReportHandler}})})),Ai=/* @__PURE__ */ v((/* @__PURE__ */ h((e=>{Object.defineProperty(e,"__esModule",{value:!0}),e.report=e.default=void 0;var t=ki(),n=/([\uff61-\uff9f]+)/g,r=function(e){var{Syntax:r,RuleError:i,fixer:a,report:o,locator:s,getSource:c}=e,l=new t.RuleHelper(e);return{[r.Str](e){if(l.isPlainStrNode(e))for(var t of c(e).matchAll(n)){var r=t[0],u=t.index??0,d=[u,u+r.length];o(e,new i(`Disallow to use 半角カタカナ: "${r}"`,{padding:s.range(d),fix:a.replaceTextRange(d,r.normalize(`NFKC`))}))}}}};e.report=r,e.default={linter:r,fixer:r}})))(),1);const ji=[{ruleId:`no-invalid-control-character`,rule:a(s)},{ruleId:`no-hankaku-kana`,rule:a(Ai.default)},{ruleId:`no-zero-width-spaces`,rule:a(c)},{ruleId:`no-chinese-korean`,rule:({getSource:e,locator:t,report:n,RuleError:r,Syntax:i})=>{let a=[];return{[i.Code](e){a.push(e.range)},[i.CodeBlock](e){a.push(e.range)},[i.DocumentExit](i){let o=e(i);for(let[e,t]of a)o=o.slice(0,e)+` `.repeat(t-e)+o.slice(t);o=o.replaceAll(/<!--[\s\S]*?-->|<(code|pre|script|style)(?=[\s/>])[\s\S]*?<\/\1\s*>/gi,e=>` `.repeat(e.length));let s=[];for(let{0:e,index:t}of o.matchAll(/./gu)){if(ee(e).length===0)continue;let n=s.at(-1);n?.[1]===t?n[1]+=e.length:s.push([t,t+e.length])}for(let e of s)n(i,new r(`Chinese or Korean text "${o.slice(...e)}" is disallowed.`,{padding:t.range(e)}))}}}}];async function Mi(t,r){console.info(`Textlint: ${t}`);let a=n.dirname(t),s;try{s=await gi({roots:[a],userRoot:a,allowedRoots:[r,a]},t)}catch(n){return console.error(`${t}: ${e(n)}`),1}let c=new i,l=0;for(let e of Object.values(s.markdownFiles)){let t=(e.errors??[]).map(t=>`${e.filepath}:${t.row+1}:1: ${t.message}`);for(let e of new Set(t))console.error(e),l=1}let u=/* @__PURE__ */ new Set;for(let{source:e}of s.slides){let t=`${e.filepath}:${e.index}`;if(u.has(t))continue;u.add(t);let n=e.contentStart>e.end?e.start:e.contentStart,r=e.raw.split(`
142
142
  `).slice(n-e.start).join(`
143
143
  `),i=await c.lintText(r,{filePath:e.filepath,ext:`.md`,plugins:[{pluginId:`markdown`,plugin:{Processor:o}}],rules:ji});for(let t of i.messages)console.error(`${e.filepath}:${n+t.line}:${t.column}: ${t.message} (${t.ruleId})`),l=1}return l}export{Mi as lintSlidevText};
144
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpZGV2VGV4dGxpbnQtQldmS0x0aVMuanMiLCJuYW1lcyI6WyJTQ0FMQVIiLCJpc1NjYWxhciIsImlzQ29sbGVjdGlvbiIsIkJSRUFLIiwiU0tJUCIsIlJFTU9WRSIsInZpc2l0IiwiaXNDb2xsZWN0aW9uIiwiaXNTY2FsYXIiLCJpc1NjYWxhciIsImlzQ29sbGVjdGlvbiIsImlzQ29sbGVjdGlvbiIsIlNDQUxBUiIsImlzQ29sbGVjdGlvbiIsImlzU2NhbGFyIiwiaXNTY2FsYXIiLCJpc0NvbGxlY3Rpb24iLCJzdHJpbmdpZnkiLCJpc0NvbGxlY3Rpb24iLCJpc1NjYWxhciIsInN0cmluZ2lmeSIsImlzU2NhbGFyIiwic3RyaW5naWZ5IiwiaXNTY2FsYXIiLCJpc1NjYWxhciIsImZsb2F0TmFOIiwiZmxvYXRFeHAiLCJmbG9hdCIsImludElkZW50aWZ5IiwiaW50UmVzb2x2ZSIsImludFN0cmluZ2lmeSIsImludE9jdCIsImludCIsImludEhleCIsInNjaGVtYSIsImludE9jdCIsImludCIsImludEhleCIsImZsb2F0TmFOIiwiZmxvYXRFeHAiLCJmbG9hdCIsImludElkZW50aWZ5Iiwic2NoZW1hIiwiaXNTY2FsYXIiLCJpc1NjYWxhciIsInNjaGVtYSIsInNjaGVtYSQyIiwiU0NBTEFSIiwic3RyaW5naWZ5IiwiaXNDb2xsZWN0aW9uIiwiaXNTY2FsYXIiLCJpc1NjYWxhciIsIlNDQUxBUiIsImlzU2NhbGFyIiwiaXNTY2FsYXIiLCJpc0NvbGxlY3Rpb24iLCJzdHJpbmdpZnkiLCJwYXJzZSIsIllBTUwiLCJSRV9DUkxGIiwiWUFNTCIsIllBTUwiLCJub0hhbmtha3VLYW5hIl0sInNvdXJjZXMiOlsiLi4vLi4vc2hhcmVkLWxpYi9zcmMvZm9yZWlnbkNqay50cyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9AYW50ZnUvdXRpbHMvZGlzdC9pbmRleC5tanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvQHNsaWRldi9wYXJzZXIvZGlzdC91dGlscy5tanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvbm9kZXMvaWRlbnRpdHkuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3QvdmlzaXQuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3QvZG9jL2RpcmVjdGl2ZXMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3QvZG9jL2FuY2hvcnMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3QvZG9jL2FwcGx5UmV2aXZlci5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9ub2Rlcy90b0pTLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L25vZGVzL05vZGUuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvbm9kZXMvQWxpYXMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvbm9kZXMvU2NhbGFyLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L2RvYy9jcmVhdGVOb2RlLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L25vZGVzL0NvbGxlY3Rpb24uanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvc3RyaW5naWZ5L3N0cmluZ2lmeUNvbW1lbnQuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvc3RyaW5naWZ5L2ZvbGRGbG93TGluZXMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvc3RyaW5naWZ5L3N0cmluZ2lmeVN0cmluZy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9zdHJpbmdpZnkvc3RyaW5naWZ5LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3N0cmluZ2lmeS9zdHJpbmdpZnlQYWlyLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L2xvZy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9zY2hlbWEveWFtbC0xLjEvbWVyZ2UuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvbm9kZXMvYWRkUGFpclRvSlNNYXAuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvbm9kZXMvUGFpci5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9zdHJpbmdpZnkvc3RyaW5naWZ5Q29sbGVjdGlvbi5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9ub2Rlcy9ZQU1MTWFwLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3NjaGVtYS9jb21tb24vbWFwLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L25vZGVzL1lBTUxTZXEuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvc2NoZW1hL2NvbW1vbi9zZXEuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvc2NoZW1hL2NvbW1vbi9zdHJpbmcuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvc2NoZW1hL2NvbW1vbi9udWxsLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3NjaGVtYS9jb3JlL2Jvb2wuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvc3RyaW5naWZ5L3N0cmluZ2lmeU51bWJlci5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9zY2hlbWEvY29yZS9mbG9hdC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9zY2hlbWEvY29yZS9pbnQuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvc2NoZW1hL2NvcmUvc2NoZW1hLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3NjaGVtYS9qc29uL3NjaGVtYS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9zY2hlbWEveWFtbC0xLjEvYmluYXJ5LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3NjaGVtYS95YW1sLTEuMS9wYWlycy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9zY2hlbWEveWFtbC0xLjEvb21hcC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9zY2hlbWEveWFtbC0xLjEvYm9vbC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9zY2hlbWEveWFtbC0xLjEvZmxvYXQuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvc2NoZW1hL3lhbWwtMS4xL2ludC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9zY2hlbWEveWFtbC0xLjEvc2V0LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3NjaGVtYS95YW1sLTEuMS90aW1lc3RhbXAuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvc2NoZW1hL3lhbWwtMS4xL3NjaGVtYS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9zY2hlbWEvdGFncy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9zY2hlbWEvU2NoZW1hLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3N0cmluZ2lmeS9zdHJpbmdpZnlEb2N1bWVudC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9kb2MvRG9jdW1lbnQuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3QvZXJyb3JzLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L2NvbXBvc2UvcmVzb2x2ZS1wcm9wcy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9jb21wb3NlL3V0aWwtY29udGFpbnMtbmV3bGluZS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9jb21wb3NlL3V0aWwtZmxvdy1pbmRlbnQtY2hlY2suanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3QvY29tcG9zZS91dGlsLW1hcC1pbmNsdWRlcy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9jb21wb3NlL3Jlc29sdmUtYmxvY2stbWFwLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L2NvbXBvc2UvcmVzb2x2ZS1ibG9jay1zZXEuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3QvY29tcG9zZS9yZXNvbHZlLWVuZC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9jb21wb3NlL3Jlc29sdmUtZmxvdy1jb2xsZWN0aW9uLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L2NvbXBvc2UvY29tcG9zZS1jb2xsZWN0aW9uLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L2NvbXBvc2UvcmVzb2x2ZS1ibG9jay1zY2FsYXIuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3QvY29tcG9zZS9yZXNvbHZlLWZsb3ctc2NhbGFyLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L2NvbXBvc2UvY29tcG9zZS1zY2FsYXIuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3QvY29tcG9zZS91dGlsLWVtcHR5LXNjYWxhci1wb3NpdGlvbi5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9jb21wb3NlL2NvbXBvc2Utbm9kZS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9jb21wb3NlL2NvbXBvc2UtZG9jLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L2NvbXBvc2UvY29tcG9zZXIuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3QvcGFyc2UvY3N0LXNjYWxhci5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9wYXJzZS9jc3Qtc3RyaW5naWZ5LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3BhcnNlL2NzdC12aXNpdC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9wYXJzZS9jc3QuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3QvcGFyc2UvbGV4ZXIuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3QvcGFyc2UvbGluZS1jb3VudGVyLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3BhcnNlL3BhcnNlci5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9wdWJsaWMtYXBpLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L2luZGV4LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9pbmRleC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9Ac2xpZGV2L3BhcnNlci9kaXN0L2NvcmUubWpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3BhdGhlL2Rpc3Qvc2hhcmVkL3BhdGhlLk0tZVRodE5aLm1qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9Ac2xpZGV2L3BhcnNlci9kaXN0L2ZzLm1qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9AdGV4dGxpbnQvYXN0LW5vZGUtdHlwZXMvbGliL3NyYy9BU1ROb2RlVHlwZXMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvQHRleHRsaW50L2FzdC1ub2RlLXR5cGVzL2xpYi9zcmMvaW5kZXguanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvdGV4dGxpbnQtcnVsZS1oZWxwZXIvbGliL3RleHRsaW50LXJ1bGUtaGVscGVyLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3VuaXN0LXV0aWwtaXMvY29udmVydC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy91bmlzdC11dGlsLXZpc2l0LXBhcmVudHMvY29sb3IuYnJvd3Nlci5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy91bmlzdC11dGlsLXZpc2l0LXBhcmVudHMvaW5kZXguanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvdW5pc3QtdXRpbC12aXNpdC9pbmRleC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy90ZXh0bGludC1ydWxlLWhlbHBlci9saWIvSWdub3JlTm9kZU1hbmFnZXIuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvYm91bmRhcnkvbGliL2luZGV4LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0cnVjdHVyZWQtc291cmNlL2xpYi9zdHJ1Y3R1cmVkLXNvdXJjZS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy90ZXh0bGludC1ydWxlLWhlbHBlci9saWIvU291cmNlTG9jYXRpb24uanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvdGV4dGxpbnQtcnVsZS1oZWxwZXIvbGliL3dyYXAtcmVwb3J0LWhhbmRsZXIuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvdGV4dGxpbnQtcnVsZS1oZWxwZXIvbGliL2luZGV4LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3RleHRsaW50LXJ1bGUtbm8taGFua2FrdS1rYW5hL2xpYi90ZXh0bGludC1ydWxlLW5vLWhhbmtha3Uta2FuYS5qcyIsIi4uL3NyYy91dGlscy9ub0NoaW5lc2VLb3JlYW5SdWxlLnRzIiwiLi4vc3JjL3V0aWxzL3NsaWRldlRleHRsaW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIEZvcmVpZ25DamtMYW5ndWFnZSA9ICdjaGluZXNlJyB8ICdrb3JlYW4nO1xuXG5jb25zdCBIQU5HVUxfUkVHRVggPSAvXFxwe1NjcmlwdD1IYW5ndWx9L3U7XG5jb25zdCBIQU5fUkVHRVggPSAvXFxwe1NjcmlwdD1IYW59L3U7XG4vLyBKSVMgWCAwMjA4IGNhbm5vdCBlbmNvZGUgdGhlc2UgSsWNecWNIGthbmppLCB3aGljaCB3ZXJlIGFkZGVkIGluIDIwMTAuXG5jb25zdCBKT1lPX0tBTkpJX09VVFNJREVfSklTX1hfMDIwOCA9ICfwoK6f5aGh5Ymd6aCwJztcbi8vIEthbmppIGZvciBKYXBhbmVzZSBuYW1lcyAoZS5nLiwg6auZLCDvqJEsIOa/tSwg5qCBKSB0aGF0IENoaW5lc2UgcHJvc2UgcmFyZWx5IGNvbnRhaW5zOiB0aGUgTkZLQyBmb3JtcyBvZiB0aGVcbi8vIFdpbmRvd3MtMzFKIE5FQy1zZWxlY3RlZCBJQk0gYW5kIElCTSBleHRlbnNpb24ga2FuamkgdGhhdCBuZWl0aGVyIEpJUyBYIDAyMDgsIEJpZzUsIG5vciBHQjIzMTIgZW5jb2RlcywgcGx1cyDwoK63IGZyb21cbi8vIEpJUyBYIDAyMTMuIE5GS0MgZm9ybXMgYXJlIGxpc3RlZCBiZWNhdXNlIHRoZSBsb29rdXAgcnVucyBhZnRlciBORktDIG5vcm1hbGl6YXRpb24gKGUuZy4sIFUrRkEyMCBiZWNvbWVzIFUrODYxMikuXG4vLyBTb21lIGFsc28gYXBwZWFyIGluIENoaW5lc2UgbmFtZXMgKGUuZy4sIOWWhiksIGJ1dCBwcm9zZSB0aGF0IG1peGVzIENoaW5lc2UgaW50byBKYXBhbmVzZSBoYXJkbHkgY29udGFpbnMgdGhlbS5cbi8vIEV4dGVuc2lvbiBrYW5qaSB0aGF0IEJpZzUgb3IgR0IyMzEyIGVuY29kZXMgKGUuZy4sIOW+tywg54CoKSBzdGF5IENoaW5lc2UgYmVjYXVzZSBDaGluZXNlIHByb3NlIHVzZXMgdGhlbS5cbmNvbnN0IEpBUEFORVNFX05BTUVfS0FOSklfT1VUU0lERV9KSVNfWF8wMjA4ID1cbiAgJ+S7vOS8g+S8ueS+iuS/v+WBguWDmOWDtOWFiuWFpOWGneWHrOWIleWKnOWKr+WMh+WMpOWOk+WPneWSiuWSnOWWhuWdmeWdpeWerOWfiOWisuWki+Wlm+WlneWlo+WwnuWyuuWzteW1k+W1reW2ueW3kOW8oeW8tOW9heaDnuaEkeaEsOaGmOaIk+aKpuaVjuaYnuaYu+aZs+aav+abuuabu+acjuadpuaggeahkuajj+aosOaps+arouarpOa2lua3uOa+tea/teeEj+eKseeKvueMpOeOveeUgeehuueksOerp+eunue1iOe3lue9h+iNouiRiOiTnOiYkuigh+ijteiknOiot+i0kumDnumElemHnumHpemIvOmJmemJt+mNiOmPhumanemar+mcs+mcu+mdjemdj+mdkemdlemrmemtsumuj+musemuu+mwgO+oju+oj++oke+ok++olO+on++ooe+oo++opO+op++oqO+oqfCgrrcnO1xuLy8gQ2hhcmFjdGVycyBKSVMgWCAwMjA4IGNhbiBlbmNvZGUgYnV0IG1vZGVybiBKYXBhbmVzZSBwcm9zZSBkb2VzIG5vdCB1c2U6XG4vLyAtIG9sZCBmb3JtcyAoa3nFq2ppdGFpKSBvZiBKxY15xY0ga2FuamksIGZyb20gdGhlIGBreXVqaXRhaWAgbnBtIHBhY2thZ2UgYW5kIFVuaWhhbidzIGtKYXBhbmVzZU9sZFZhcmlhbnQsXG4vLyAgIGV4Y2VwdCB0aG9zZSBzdGlsbCBjb21tb24gaW4gSmFwYW5lc2Ugd29yZHMgb3IgbmFtZXMgKGUuZy4sIOaHiSBpbiDmhbbmh4ksIOa+pCwg6YKKLCDpvo0sIOiXnSBpbiDmnbHkuqzol53ooZPlpKflraYsIOezuuOBmSlcbi8vIC0gQ2hpbmVzZSBmdW5jdGlvbiB3b3JkcyB0aGF0IEphcGFuZXNlIHdyaXRlcyBpbiBrYW5hIChlLmcuLCDlgJEsIOmAmSwg6bq8LCDlvogsIOaAjiwg6LefLCDlmJspIGFuZCBzdHJheSBzaW1wbGlmaWVkIGZvcm1zIChlLmcuLCDkuKopXG4vLyAtIHRyYWRpdGlvbmFsIENoaW5lc2UgY2hhcmFjdGVycyB0aGF0IG5laXRoZXIgdGFibGUgY292ZXJzIGJ1dCBKYXBhbmVzZSBuZXZlciB1c2VzOiDnorwsIOiIiSwg6Y+ILCDpm5Zcbi8vIE90aGVyIENoaW5lc2Utb25seSBjb250ZW50IGNoYXJhY3RlcnMgKGUuZy4sIOWqvSwg6LGsKSBhcmUgbm90IGxpc3RlZCBiZWNhdXNlIHNlcGFyYXRpbmcgdGhlbSBmcm9tIHJhcmUga2Fuamlcbi8vIHRoYXQgSmFwYW5lc2UgcHJvc2UgZG9lcyB1c2UgKGUuZy4sIOS5lumboiwg55GV55a1LCDpvZ/pvawsIOS/r+eesCkgbmVlZHMgSmFwYW5lc2UgdXNhZ2UgZnJlcXVlbmNpZXMuXG5jb25zdCBDSElORVNFX0NIQVJBQ1RFUlNfSU5fSklTX1hfMDIwOCA9IG5ldyBTZXQoXG4gICfkuKrkuZjkuoLkup7ku47kvZvkvoblgJHlgYflgrPlg57lg7nlhInlhZLlhanlhozliITlianlio3lipHli57li7Pli7Xli7jljYDljbflj4PlkKzlkYDlkq/lk4flk6bllJTllq7lmJvlmrTlm5Hlm5jlnIjlnIvlnI3lnJPlnJblnJjloq7lo5Plo5jlo57lo6Tlo6/lo7nlo7vlo73lpaflpazlp5nlrYPlrbjlr6Llr6blr6vlr7blsIflsIjlsI3lsYblsazls73lt5bluLblub/lu6Llu6Plu7PlvYjlvojlvpHlvp7mgI7mgYbmg6Hmg7HmhLzmhZjmh7fmiIDmiLDmiLLmi4Lmi5Tmi5zmjL7mj5LmkJbmkJzmk4fmk5Tmk5rmk6fmk7TmlJzmlJ3mlLbmlYjmlY3mlZXmlbjmlrfmmZ3mm4nmnIPmop3mo6fmpq7mqILmqJPmqJ7mqKPmqqLmrIrmrZDmraHmrbjmrpjmrrzmr4bmsKPmspLmt6jmt7rmu6/mu7/mvZvmvoHmv5Xmv5/ngaPnh4jnh5Lnh5/niJDniK3niLLniqfni7nnjajnjbXnjbjnjbvnk6PnlavnlbbnlornmaHnmbznm5znm6Hnoo7norznpZXnpqrnpq7nqLHnqLvnqZfnqannq4rnq53nsrnntbLntpPnuKPnuLHnuL3nuannuarnubznuoznupbnvLrnvZDogbLogb3ogoXohabohr3oh5/oh7roiIfoiInoiIroiI3oiJboibfojorojpbokKzol4/ol6XomZXomZ/onqLon7LooLbooLvooZ7oo53opYPoprropr3op4Dop7jorKDorYnora/orb3oroDorororpPorprosZDosavosrPos6PotIrot5/ouJDovJXovYnovqjovq3ovq/pgJnpgZnpgZ7pgbLphLDphonphqvph4Dph4vpjKLpjq3pj4jpkLXpkYTpkZvpl5zpmbfpmqjpmqrpmrHpmrjpm5bpm5npm5zpnLjpnYjpnZzpoY/poa/po5zpo67ppJjppKDpqLfpqYXpqZfpqZvpq5Ppq5Tpq67prKrpt4Tpub3puqXpurzpu4/pu5jpu57pu6jpvYrpvZLpvaHpvpwnXG4pO1xuXG5sZXQgamFwYW5lc2VLYW5qaTogU2V0PHN0cmluZz4gfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogRGV0ZWN0cyBDaGluZXNlIG9yIEtvcmVhbiBjaGFyYWN0ZXJzIG1peGVkIGludG8gSmFwYW5lc2UgdGV4dCwgc3VjaCBhcyBMTE0tZ2VuZXJhdGVkIEphcGFuZXNlIHByb3NlLlxuICogU2VlIHtAbGluayBmaW5kRm9yZWlnbkNqa0NoYXJhY3RlcnNJbkphcGFuZXNlfSBmb3Igd2hpY2ggY2hhcmFjdGVycyBjb3VudCBhbmQgaG93IGBhbGxvd2VkVGV4dGAgd29ya3MuXG4gKiBSZXR1cm5zIHRoZSBkZXRlY3RlZCBsYW5ndWFnZXMsIG9yIGFuIGVtcHR5IGFycmF5IGlmIG5vbmUgYXJlIGZvdW5kLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0Rm9yZWlnbkNqa0luSmFwYW5lc2UodGV4dDogc3RyaW5nLCBhbGxvd2VkVGV4dD86IHN0cmluZyk6IEZvcmVpZ25DamtMYW5ndWFnZVtdIHtcbiAgY29uc3QgY2hhcmFjdGVycyA9IGZpbmRGb3JlaWduQ2prQ2hhcmFjdGVyc0luSmFwYW5lc2UodGV4dCwgYWxsb3dlZFRleHQpO1xuICBjb25zdCBsYW5ndWFnZXM6IEZvcmVpZ25DamtMYW5ndWFnZVtdID0gW107XG4gIGlmIChjaGFyYWN0ZXJzLnNvbWUoKGNoYXIpID0+ICFIQU5HVUxfUkVHRVgudGVzdChjaGFyKSkpIGxhbmd1YWdlcy5wdXNoKCdjaGluZXNlJyk7XG4gIGlmIChjaGFyYWN0ZXJzLnNvbWUoKGNoYXIpID0+IEhBTkdVTF9SRUdFWC50ZXN0KGNoYXIpKSkgbGFuZ3VhZ2VzLnB1c2goJ2tvcmVhbicpO1xuICByZXR1cm4gbGFuZ3VhZ2VzO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGRpc3RpbmN0IENoaW5lc2Ugb3IgS29yZWFuIGNoYXJhY3RlcnMgbWl4ZWQgaW50byBKYXBhbmVzZSB0ZXh0LCBORktDLW5vcm1hbGl6ZWQsIGluIG9yZGVyIG9mIGFwcGVhcmFuY2UuXG4gKiBBIGthbmppIGlzIHRyZWF0ZWQgYXMgQ2hpbmVzZSB3aGVuIGl0IGlzIG91dHNpZGUgSklTIFggMDIwOCAoZXhjZXB0IHRoZSBmb3VyIErFjXnFjSBrYW5qaSDwoK6f5aGh5Ymd6aCwIGFuZCBKYXBhbmVzZSBuYW1lXG4gKiBrYW5qaSB0aGF0IG5laXRoZXIgQmlnNSBub3IgR0IyMzEyIGVuY29kZXMsIGUuZy4sIOmrmSwg76iRLCDwoK63KSBvciBpcyBvbmUgb2YgdGhlIGxpc3RlZCBvbGQgZm9ybXMsIENoaW5lc2UgZnVuY3Rpb25cbiAqIHdvcmRzLCBvciBvdGhlciBDaGluZXNlLW9ubHkgY2hhcmFjdGVycyB0aGF0IG1vZGVybiBKYXBhbmVzZSBwcm9zZSBkb2VzIG5vdCB1c2UgKGUuZy4sIOWwjSwg5ZyLLCDpgJksIOWAkSwg5b6ILCDnorwpLlxuICogT2xkIGZvcm1zIGluIG5hbWVzIHRoYXQgQ2hpbmVzZSBwcm9zZSBhbHNvIHVzZXMgKGUuZy4sIOWciywg6IiHLCDlvrcpIGFyZSB0aGVyZWZvcmUgYWxzbyByZXBvcnRlZCwgd2hpbGUgQ2hpbmVzZVxuICogY29udGFpbmluZyBub25lIG9mIHRoZXNlIGNoYXJhY3RlcnMgKGUuZy4sIOacgOWQjui/lOWbnuetlOahiCwg6LGs6IKJKSBpcyBub3QuXG4gKiBDaGFyYWN0ZXJzIHRoYXQgYWxzbyBvY2N1ciBpbiBgYWxsb3dlZFRleHRgIGFyZSBub3QgcmVwb3J0ZWQsIHNvIHBhc3NpbmcgdGhlIGlucHV0IHRoYXQgYW4gTExNIG1heSBxdW90ZVxuICogKGUuZy4sIHRoZSBwcm9tcHQsIGEgcXVlc3Rpb24sIG9yIGFuIGVycm9yIG1lc3NhZ2UpIGtlZXBzIHF1b3RlZCBuYW1lcyBhbmQgY29kZSBmcm9tIGJlaW5nIHJlcG9ydGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZEZvcmVpZ25DamtDaGFyYWN0ZXJzSW5KYXBhbmVzZSh0ZXh0OiBzdHJpbmcsIGFsbG93ZWRUZXh0ID0gJycpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGFsbG93ZWRDaGFyYWN0ZXJzID0gbmV3IFNldChhbGxvd2VkVGV4dC5ub3JtYWxpemUoJ05GS0MnKSk7XG4gIGNvbnN0IGthbmppU2V0ID0gKGphcGFuZXNlS2FuamkgPz89IGJ1aWxkSmFwYW5lc2VLYW5qaVNldCgpKTtcbiAgY29uc3QgY2hhcmFjdGVycyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IGNoYXIgb2YgdGV4dC5ub3JtYWxpemUoJ05GS0MnKSkge1xuICAgIGlmIChhbGxvd2VkQ2hhcmFjdGVycy5oYXMoY2hhcikpIGNvbnRpbnVlO1xuICAgIGlmIChcbiAgICAgIEhBTkdVTF9SRUdFWC50ZXN0KGNoYXIpIHx8XG4gICAgICAoSEFOX1JFR0VYLnRlc3QoY2hhcikgJiYgKCFrYW5qaVNldC5oYXMoY2hhcikgfHwgQ0hJTkVTRV9DSEFSQUNURVJTX0lOX0pJU19YXzAyMDguaGFzKGNoYXIpKSlcbiAgICApIHtcbiAgICAgIGNoYXJhY3RlcnMuYWRkKGNoYXIpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gWy4uLmNoYXJhY3RlcnNdO1xufVxuXG5mdW5jdGlvbiBidWlsZEphcGFuZXNlS2FuamlTZXQoKTogU2V0PHN0cmluZz4ge1xuICAvLyBUaGUgV0hBVFdHIGBzaGlmdF9qaXNgIGRlY29kZXIgaXMgV2luZG93cy0zMUosIHNvIHNraXAgaXRzIHZlbmRvci1leHRlbnNpb24gbGVhZCBieXRlcyAoMHhFRC0weEZDKSB0byBrZWVwIEpJUyBYIDAyMDggb25seS5cbiAgY29uc3QgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2Rlcignc2hpZnRfamlzJyk7XG4gIGNvbnN0IGthbmppU2V0ID0gbmV3IFNldChKT1lPX0tBTkpJX09VVFNJREVfSklTX1hfMDIwOCArIEpBUEFORVNFX05BTUVfS0FOSklfT1VUU0lERV9KSVNfWF8wMjA4KTtcbiAgZm9yIChsZXQgbGVhZCA9IDB4ODE7IGxlYWQgPD0gMHhFQTsgbGVhZCsrKSB7XG4gICAgaWYgKGxlYWQgPj0gMHhBMCAmJiBsZWFkIDw9IDB4REYpIGNvbnRpbnVlO1xuICAgIGZvciAobGV0IHRyYWlsID0gMHg0MDsgdHJhaWwgPD0gMHhGQzsgdHJhaWwrKykge1xuICAgICAga2FuamlTZXQuYWRkKGRlY29kZXIuZGVjb2RlKG5ldyBVaW50OEFycmF5KFtsZWFkLCB0cmFpbF0pKSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBrYW5qaVNldDtcbn1cbiIsImZ1bmN0aW9uIGNsYW1wKG4sIG1pbiwgbWF4KSB7XG4gIHJldHVybiBNYXRoLm1pbihtYXgsIE1hdGgubWF4KG1pbiwgbikpO1xufVxuZnVuY3Rpb24gc3VtKC4uLmFyZ3MpIHtcbiAgcmV0dXJuIGZsYXR0ZW5BcnJheWFibGUoYXJncykucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMCk7XG59XG5mdW5jdGlvbiBsZXJwKG1pbiwgbWF4LCB0KSB7XG4gIGNvbnN0IGludGVycG9sYXRpb24gPSBjbGFtcCh0LCAwLCAxKTtcbiAgcmV0dXJuIG1pbiArIChtYXggLSBtaW4pICogaW50ZXJwb2xhdGlvbjtcbn1cbmZ1bmN0aW9uIHJlbWFwKG4sIGluTWluLCBpbk1heCwgb3V0TWluLCBvdXRNYXgpIHtcbiAgY29uc3QgaW50ZXJwb2xhdGlvbiA9IChuIC0gaW5NaW4pIC8gKGluTWF4IC0gaW5NaW4pO1xuICByZXR1cm4gbGVycChvdXRNaW4sIG91dE1heCwgaW50ZXJwb2xhdGlvbik7XG59XG5cbmZ1bmN0aW9uIHRvQXJyYXkoYXJyYXkpIHtcbiAgYXJyYXkgPSBhcnJheSA/PyBbXTtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYXJyYXkpID8gYXJyYXkgOiBbYXJyYXldO1xufVxuZnVuY3Rpb24gZmxhdHRlbkFycmF5YWJsZShhcnJheSkge1xuICByZXR1cm4gdG9BcnJheShhcnJheSkuZmxhdCgxKTtcbn1cbmZ1bmN0aW9uIG1lcmdlQXJyYXlhYmxlKC4uLmFyZ3MpIHtcbiAgcmV0dXJuIGFyZ3MuZmxhdE1hcCgoaSkgPT4gdG9BcnJheShpKSk7XG59XG5mdW5jdGlvbiBwYXJ0aXRpb24oYXJyYXksIC4uLmZpbHRlcnMpIHtcbiAgY29uc3QgcmVzdWx0ID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogZmlsdGVycy5sZW5ndGggKyAxIH0pLmZpbGwobnVsbCkubWFwKCgpID0+IFtdKTtcbiAgYXJyYXkuZm9yRWFjaCgoZSwgaWR4LCBhcnIpID0+IHtcbiAgICBsZXQgaSA9IDA7XG4gICAgZm9yIChjb25zdCBmaWx0ZXIgb2YgZmlsdGVycykge1xuICAgICAgaWYgKGZpbHRlcihlLCBpZHgsIGFycikpIHtcbiAgICAgICAgcmVzdWx0W2ldLnB1c2goZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGkgKz0gMTtcbiAgICB9XG4gICAgcmVzdWx0W2ldLnB1c2goZSk7XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gdW5pcShhcnJheSkge1xuICByZXR1cm4gQXJyYXkuZnJvbShuZXcgU2V0KGFycmF5KSk7XG59XG5mdW5jdGlvbiB1bmlxdWVCeShhcnJheSwgZXF1YWxGbikge1xuICByZXR1cm4gYXJyYXkucmVkdWNlKChhY2MsIGN1cikgPT4ge1xuICAgIGNvbnN0IGluZGV4ID0gYWNjLmZpbmRJbmRleCgoaXRlbSkgPT4gZXF1YWxGbihjdXIsIGl0ZW0pKTtcbiAgICBpZiAoaW5kZXggPT09IC0xKVxuICAgICAgYWNjLnB1c2goY3VyKTtcbiAgICByZXR1cm4gYWNjO1xuICB9LCBbXSk7XG59XG5mdW5jdGlvbiBsYXN0KGFycmF5KSB7XG4gIHJldHVybiBhdChhcnJheSwgLTEpO1xufVxuZnVuY3Rpb24gcmVtb3ZlKGFycmF5LCB2YWx1ZSkge1xuICBpZiAoIWFycmF5KVxuICAgIHJldHVybiBmYWxzZTtcbiAgY29uc3QgaW5kZXggPSBhcnJheS5pbmRleE9mKHZhbHVlKTtcbiAgaWYgKGluZGV4ID49IDApIHtcbiAgICBhcnJheS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGF0KGFycmF5LCBpbmRleCkge1xuICBjb25zdCBsZW4gPSBhcnJheS5sZW5ndGg7XG4gIGlmICghbGVuKVxuICAgIHJldHVybiB2b2lkIDA7XG4gIGlmIChpbmRleCA8IDApXG4gICAgaW5kZXggKz0gbGVuO1xuICByZXR1cm4gYXJyYXlbaW5kZXhdO1xufVxuZnVuY3Rpb24gcmFuZ2UoLi4uYXJncykge1xuICBsZXQgc3RhcnQsIHN0b3AsIHN0ZXA7XG4gIGlmIChhcmdzLmxlbmd0aCA9PT0gMSkge1xuICAgIHN0YXJ0ID0gMDtcbiAgICBzdGVwID0gMTtcbiAgICBbc3RvcF0gPSBhcmdzO1xuICB9IGVsc2Uge1xuICAgIFtzdGFydCwgc3RvcCwgc3RlcCA9IDFdID0gYXJncztcbiAgfVxuICBjb25zdCBhcnIgPSBbXTtcbiAgbGV0IGN1cnJlbnQgPSBzdGFydDtcbiAgd2hpbGUgKGN1cnJlbnQgPCBzdG9wKSB7XG4gICAgYXJyLnB1c2goY3VycmVudCk7XG4gICAgY3VycmVudCArPSBzdGVwIHx8IDE7XG4gIH1cbiAgcmV0dXJuIGFycjtcbn1cbmZ1bmN0aW9uIG1vdmUoYXJyLCBmcm9tLCB0bykge1xuICBhcnIuc3BsaWNlKHRvLCAwLCBhcnIuc3BsaWNlKGZyb20sIDEpWzBdKTtcbiAgcmV0dXJuIGFycjtcbn1cbmZ1bmN0aW9uIGNsYW1wQXJyYXlSYW5nZShuLCBhcnIpIHtcbiAgcmV0dXJuIGNsYW1wKG4sIDAsIGFyci5sZW5ndGggLSAxKTtcbn1cbmZ1bmN0aW9uIHNhbXBsZShhcnIsIHF1YW50aXR5KSB7XG4gIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBxdWFudGl0eSB9LCAoXykgPT4gYXJyW01hdGgucm91bmQoTWF0aC5yYW5kb20oKSAqIChhcnIubGVuZ3RoIC0gMSkpXSk7XG59XG5mdW5jdGlvbiBzaHVmZmxlKGFycmF5KSB7XG4gIGZvciAobGV0IGkgPSBhcnJheS5sZW5ndGggLSAxOyBpID4gMDsgaS0tKSB7XG4gICAgY29uc3QgaiA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChpICsgMSkpO1xuICAgIFthcnJheVtpXSwgYXJyYXlbal1dID0gW2FycmF5W2pdLCBhcnJheVtpXV07XG4gIH1cbiAgcmV0dXJuIGFycmF5O1xufVxuZnVuY3Rpb24gZmlsdGVySW5QbGFjZShhcnJheSwgcHJlZGljYXRlKSB7XG4gIGZvciAobGV0IGkgPSBhcnJheS5sZW5ndGg7IGktLTsgaSA+PSAwKSB7XG4gICAgaWYgKCFwcmVkaWNhdGUoYXJyYXlbaV0sIGksIGFycmF5KSlcbiAgICAgIGFycmF5LnNwbGljZShpLCAxKTtcbiAgfVxuICByZXR1cm4gYXJyYXk7XG59XG5cbmZ1bmN0aW9uIGFzc2VydChjb25kaXRpb24sIG1lc3NhZ2UpIHtcbiAgaWYgKCFjb25kaXRpb24pXG4gICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xufVxuY29uc3QgdG9TdHJpbmcgPSAodikgPT4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHYpO1xuZnVuY3Rpb24gZ2V0VHlwZU5hbWUodikge1xuICBpZiAodiA9PT0gbnVsbClcbiAgICByZXR1cm4gXCJudWxsXCI7XG4gIGNvbnN0IHR5cGUgPSB0b1N0cmluZyh2KS5zbGljZSg4LCAtMSkudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIHR5cGVvZiB2ID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiB2ID09PSBcImZ1bmN0aW9uXCIgPyB0eXBlIDogdHlwZW9mIHY7XG59XG5mdW5jdGlvbiBub29wKCkge1xufVxuXG5mdW5jdGlvbiBpc0RlZXBFcXVhbCh2YWx1ZTEsIHZhbHVlMikge1xuICBjb25zdCB0eXBlMSA9IGdldFR5cGVOYW1lKHZhbHVlMSk7XG4gIGNvbnN0IHR5cGUyID0gZ2V0VHlwZU5hbWUodmFsdWUyKTtcbiAgaWYgKHR5cGUxICE9PSB0eXBlMilcbiAgICByZXR1cm4gZmFsc2U7XG4gIGlmICh0eXBlMSA9PT0gXCJhcnJheVwiKSB7XG4gICAgaWYgKHZhbHVlMS5sZW5ndGggIT09IHZhbHVlMi5sZW5ndGgpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHZhbHVlMS5ldmVyeSgoaXRlbSwgaSkgPT4ge1xuICAgICAgcmV0dXJuIGlzRGVlcEVxdWFsKGl0ZW0sIHZhbHVlMltpXSk7XG4gICAgfSk7XG4gIH1cbiAgaWYgKHR5cGUxID09PSBcIm9iamVjdFwiKSB7XG4gICAgY29uc3Qga2V5QXJyID0gT2JqZWN0LmtleXModmFsdWUxKTtcbiAgICBpZiAoa2V5QXJyLmxlbmd0aCAhPT0gT2JqZWN0LmtleXModmFsdWUyKS5sZW5ndGgpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIGtleUFyci5ldmVyeSgoa2V5KSA9PiB7XG4gICAgICByZXR1cm4gaXNEZWVwRXF1YWwodmFsdWUxW2tleV0sIHZhbHVlMltrZXldKTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gT2JqZWN0LmlzKHZhbHVlMSwgdmFsdWUyKTtcbn1cblxuZnVuY3Rpb24gYmF0Y2hJbnZva2UoZnVuY3Rpb25zKSB7XG4gIGZ1bmN0aW9ucy5mb3JFYWNoKChmbikgPT4gZm4gJiYgZm4oKSk7XG59XG5mdW5jdGlvbiBpbnZva2UoZm4pIHtcbiAgcmV0dXJuIGZuKCk7XG59XG5mdW5jdGlvbiB0YXAodmFsdWUsIGNhbGxiYWNrKSB7XG4gIGNhbGxiYWNrKHZhbHVlKTtcbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiBub3ROdWxsaXNoKHYpIHtcbiAgcmV0dXJuIHYgIT0gbnVsbDtcbn1cbmZ1bmN0aW9uIG5vTnVsbCh2KSB7XG4gIHJldHVybiB2ICE9PSBudWxsO1xufVxuZnVuY3Rpb24gbm90VW5kZWZpbmVkKHYpIHtcbiAgcmV0dXJuIHYgIT09IHZvaWQgMDtcbn1cbmZ1bmN0aW9uIGlzVHJ1dGh5KHYpIHtcbiAgcmV0dXJuIEJvb2xlYW4odik7XG59XG5cbmNvbnN0IGlzRGVmID0gKHZhbCkgPT4gdHlwZW9mIHZhbCAhPT0gXCJ1bmRlZmluZWRcIjtcbmNvbnN0IGlzQm9vbGVhbiA9ICh2YWwpID0+IHR5cGVvZiB2YWwgPT09IFwiYm9vbGVhblwiO1xuY29uc3QgaXNGdW5jdGlvbiA9ICh2YWwpID0+IHR5cGVvZiB2YWwgPT09IFwiZnVuY3Rpb25cIjtcbmNvbnN0IGlzTnVtYmVyID0gKHZhbCkgPT4gdHlwZW9mIHZhbCA9PT0gXCJudW1iZXJcIjtcbmNvbnN0IGlzU3RyaW5nID0gKHZhbCkgPT4gdHlwZW9mIHZhbCA9PT0gXCJzdHJpbmdcIjtcbmNvbnN0IGlzT2JqZWN0ID0gKHZhbCkgPT4gdG9TdHJpbmcodmFsKSA9PT0gXCJbb2JqZWN0IE9iamVjdF1cIjtcbmNvbnN0IGlzVW5kZWZpbmVkID0gKHZhbCkgPT4gdG9TdHJpbmcodmFsKSA9PT0gXCJbb2JqZWN0IFVuZGVmaW5lZF1cIjtcbmNvbnN0IGlzTnVsbCA9ICh2YWwpID0+IHRvU3RyaW5nKHZhbCkgPT09IFwiW29iamVjdCBOdWxsXVwiO1xuY29uc3QgaXNSZWdFeHAgPSAodmFsKSA9PiB0b1N0cmluZyh2YWwpID09PSBcIltvYmplY3QgUmVnRXhwXVwiO1xuY29uc3QgaXNEYXRlID0gKHZhbCkgPT4gdG9TdHJpbmcodmFsKSA9PT0gXCJbb2JqZWN0IERhdGVdXCI7XG5mdW5jdGlvbiBpc1ByaW1pdGl2ZSh2YWwpIHtcbiAgcmV0dXJuICF2YWwgfHwgT2JqZWN0KHZhbCkgIT09IHZhbDtcbn1cbmNvbnN0IGlzV2luZG93ID0gKHZhbCkgPT4gdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0b1N0cmluZyh2YWwpID09PSBcIltvYmplY3QgV2luZG93XVwiO1xuY29uc3QgaXNCcm93c2VyID0gdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIjtcblxuZnVuY3Rpb24gc2xhc2goc3RyKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZSgvXFxcXC9nLCBcIi9cIik7XG59XG5mdW5jdGlvbiBlbnN1cmVQcmVmaXgocHJlZml4LCBzdHIpIHtcbiAgaWYgKCFzdHIuc3RhcnRzV2l0aChwcmVmaXgpKVxuICAgIHJldHVybiBwcmVmaXggKyBzdHI7XG4gIHJldHVybiBzdHI7XG59XG5mdW5jdGlvbiBlbnN1cmVTdWZmaXgoc3VmZml4LCBzdHIpIHtcbiAgaWYgKCFzdHIuZW5kc1dpdGgoc3VmZml4KSlcbiAgICByZXR1cm4gc3RyICsgc3VmZml4O1xuICByZXR1cm4gc3RyO1xufVxuZnVuY3Rpb24gdGVtcGxhdGUoc3RyLCAuLi5hcmdzKSB7XG4gIGNvbnN0IFtmaXJzdEFyZywgZmFsbGJhY2tdID0gYXJncztcbiAgaWYgKGlzT2JqZWN0KGZpcnN0QXJnKSkge1xuICAgIGNvbnN0IHZhcnMgPSBmaXJzdEFyZztcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoL1xceyhcXHcrKVxcfS9nLCAoXywga2V5KSA9PiB2YXJzW2tleV0gfHwgKCh0eXBlb2YgZmFsbGJhY2sgPT09IFwiZnVuY3Rpb25cIiA/IGZhbGxiYWNrKGtleSkgOiBmYWxsYmFjaykgPz8ga2V5KSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKC9cXHsoXFxkKylcXH0vZywgKF8sIGtleSkgPT4ge1xuICAgICAgY29uc3QgaW5kZXggPSBOdW1iZXIoa2V5KTtcbiAgICAgIGlmIChOdW1iZXIuaXNOYU4oaW5kZXgpKVxuICAgICAgICByZXR1cm4ga2V5O1xuICAgICAgcmV0dXJuIGFyZ3NbaW5kZXhdO1xuICAgIH0pO1xuICB9XG59XG5jb25zdCB1cmxBbHBoYWJldCA9IFwidXNlYW5kb20tMjZUMTk4MzQwUFg3NXB4SkFDS1ZFUllNSU5EQlVTSFdPTEZfR1FaYmZnaGprbHF2d3l6cmljdFwiO1xuZnVuY3Rpb24gcmFuZG9tU3RyKHNpemUgPSAxNiwgZGljdCA9IHVybEFscGhhYmV0KSB7XG4gIGxldCBpZCA9IFwiXCI7XG4gIGxldCBpID0gc2l6ZTtcbiAgY29uc3QgbGVuID0gZGljdC5sZW5ndGg7XG4gIHdoaWxlIChpLS0pXG4gICAgaWQgKz0gZGljdFtNYXRoLnJhbmRvbSgpICogbGVuIHwgMF07XG4gIHJldHVybiBpZDtcbn1cbmZ1bmN0aW9uIGNhcGl0YWxpemUoc3RyKSB7XG4gIHJldHVybiBzdHJbMF0udG9VcHBlckNhc2UoKSArIHN0ci5zbGljZSgxKS50b0xvd2VyQ2FzZSgpO1xufVxuY29uc3QgX3JlRnVsbFdzID0gL15cXHMqJC87XG5mdW5jdGlvbiB1bmluZGVudChzdHIpIHtcbiAgY29uc3QgbGluZXMgPSAodHlwZW9mIHN0ciA9PT0gXCJzdHJpbmdcIiA/IHN0ciA6IHN0clswXSkuc3BsaXQoXCJcXG5cIik7XG4gIGNvbnN0IHdoaXRlc3BhY2VMaW5lcyA9IGxpbmVzLm1hcCgobGluZSkgPT4gX3JlRnVsbFdzLnRlc3QobGluZSkpO1xuICBjb25zdCBjb21tb25JbmRlbnQgPSBsaW5lcy5yZWR1Y2UoKG1pbiwgbGluZSwgaWR4KSA9PiB7XG4gICAgaWYgKHdoaXRlc3BhY2VMaW5lc1tpZHhdKVxuICAgICAgcmV0dXJuIG1pbjtcbiAgICBjb25zdCBpbmRlbnQgPSBsaW5lLm1hdGNoKC9eXFxzKi8pPy5bMF0ubGVuZ3RoO1xuICAgIHJldHVybiBpbmRlbnQgPT09IHZvaWQgMCA/IG1pbiA6IE1hdGgubWluKG1pbiwgaW5kZW50KTtcbiAgfSwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTtcbiAgbGV0IGVtcHR5TGluZXNIZWFkID0gMDtcbiAgd2hpbGUgKGVtcHR5TGluZXNIZWFkIDwgbGluZXMubGVuZ3RoICYmIHdoaXRlc3BhY2VMaW5lc1tlbXB0eUxpbmVzSGVhZF0pXG4gICAgZW1wdHlMaW5lc0hlYWQrKztcbiAgbGV0IGVtcHR5TGluZXNUYWlsID0gMDtcbiAgd2hpbGUgKGVtcHR5TGluZXNUYWlsIDwgbGluZXMubGVuZ3RoICYmIHdoaXRlc3BhY2VMaW5lc1tsaW5lcy5sZW5ndGggLSBlbXB0eUxpbmVzVGFpbCAtIDFdKVxuICAgIGVtcHR5TGluZXNUYWlsKys7XG4gIHJldHVybiBsaW5lcy5zbGljZShlbXB0eUxpbmVzSGVhZCwgbGluZXMubGVuZ3RoIC0gZW1wdHlMaW5lc1RhaWwpLm1hcCgobGluZSkgPT4gbGluZS5zbGljZShjb21tb25JbmRlbnQpKS5qb2luKFwiXFxuXCIpO1xufVxuXG5mdW5jdGlvbiBvYmplY3RNYXAob2JqLCBmbikge1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5lbnRyaWVzKG9iaikubWFwKChbaywgdl0pID0+IGZuKGssIHYpKS5maWx0ZXIobm90TnVsbGlzaClcbiAgKTtcbn1cbmZ1bmN0aW9uIGlzS2V5T2Yob2JqLCBrKSB7XG4gIHJldHVybiBrIGluIG9iajtcbn1cbmZ1bmN0aW9uIG9iamVjdEtleXMob2JqKSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhvYmopO1xufVxuZnVuY3Rpb24gb2JqZWN0RW50cmllcyhvYmopIHtcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKG9iaik7XG59XG5mdW5jdGlvbiBkZWVwTWVyZ2UodGFyZ2V0LCAuLi5zb3VyY2VzKSB7XG4gIGlmICghc291cmNlcy5sZW5ndGgpXG4gICAgcmV0dXJuIHRhcmdldDtcbiAgY29uc3Qgc291cmNlID0gc291cmNlcy5zaGlmdCgpO1xuICBpZiAoc291cmNlID09PSB2b2lkIDApXG4gICAgcmV0dXJuIHRhcmdldDtcbiAgaWYgKGlzTWVyZ2FibGVPYmplY3QodGFyZ2V0KSAmJiBpc01lcmdhYmxlT2JqZWN0KHNvdXJjZSkpIHtcbiAgICBvYmplY3RLZXlzKHNvdXJjZSkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBpZiAoa2V5ID09PSBcIl9fcHJvdG9fX1wiIHx8IGtleSA9PT0gXCJjb25zdHJ1Y3RvclwiIHx8IGtleSA9PT0gXCJwcm90b3R5cGVcIilcbiAgICAgICAgcmV0dXJuO1xuICAgICAgaWYgKGlzTWVyZ2FibGVPYmplY3Qoc291cmNlW2tleV0pKSB7XG4gICAgICAgIGlmICghdGFyZ2V0W2tleV0pXG4gICAgICAgICAgdGFyZ2V0W2tleV0gPSB7fTtcbiAgICAgICAgaWYgKGlzTWVyZ2FibGVPYmplY3QodGFyZ2V0W2tleV0pKSB7XG4gICAgICAgICAgZGVlcE1lcmdlKHRhcmdldFtrZXldLCBzb3VyY2Vba2V5XSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICByZXR1cm4gZGVlcE1lcmdlKHRhcmdldCwgLi4uc291cmNlcyk7XG59XG5mdW5jdGlvbiBkZWVwTWVyZ2VXaXRoQXJyYXkodGFyZ2V0LCAuLi5zb3VyY2VzKSB7XG4gIGlmICghc291cmNlcy5sZW5ndGgpXG4gICAgcmV0dXJuIHRhcmdldDtcbiAgY29uc3Qgc291cmNlID0gc291cmNlcy5zaGlmdCgpO1xuICBpZiAoc291cmNlID09PSB2b2lkIDApXG4gICAgcmV0dXJuIHRhcmdldDtcbiAgaWYgKEFycmF5LmlzQXJyYXkodGFyZ2V0KSAmJiBBcnJheS5pc0FycmF5KHNvdXJjZSkpXG4gICAgdGFyZ2V0LnB1c2goLi4uc291cmNlKTtcbiAgaWYgKGlzTWVyZ2FibGVPYmplY3QodGFyZ2V0KSAmJiBpc01lcmdhYmxlT2JqZWN0KHNvdXJjZSkpIHtcbiAgICBvYmplY3RLZXlzKHNvdXJjZSkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBpZiAoa2V5ID09PSBcIl9fcHJvdG9fX1wiIHx8IGtleSA9PT0gXCJjb25zdHJ1Y3RvclwiIHx8IGtleSA9PT0gXCJwcm90b3R5cGVcIilcbiAgICAgICAgcmV0dXJuO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc291cmNlW2tleV0pKSB7XG4gICAgICAgIGlmICghdGFyZ2V0W2tleV0pXG4gICAgICAgICAgdGFyZ2V0W2tleV0gPSBbXTtcbiAgICAgICAgZGVlcE1lcmdlV2l0aEFycmF5KHRhcmdldFtrZXldLCBzb3VyY2Vba2V5XSk7XG4gICAgICB9IGVsc2UgaWYgKGlzTWVyZ2FibGVPYmplY3Qoc291cmNlW2tleV0pKSB7XG4gICAgICAgIGlmICghdGFyZ2V0W2tleV0pXG4gICAgICAgICAgdGFyZ2V0W2tleV0gPSB7fTtcbiAgICAgICAgZGVlcE1lcmdlV2l0aEFycmF5KHRhcmdldFtrZXldLCBzb3VyY2Vba2V5XSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHJldHVybiBkZWVwTWVyZ2VXaXRoQXJyYXkodGFyZ2V0LCAuLi5zb3VyY2VzKTtcbn1cbmZ1bmN0aW9uIGlzTWVyZ2FibGVPYmplY3QoaXRlbSkge1xuICByZXR1cm4gaXNPYmplY3QoaXRlbSkgJiYgIUFycmF5LmlzQXJyYXkoaXRlbSk7XG59XG5mdW5jdGlvbiBvYmplY3RQaWNrKG9iaiwga2V5cywgb21pdFVuZGVmaW5lZCA9IGZhbHNlKSB7XG4gIHJldHVybiBrZXlzLnJlZHVjZSgobiwgaykgPT4ge1xuICAgIGlmIChrIGluIG9iaikge1xuICAgICAgaWYgKCFvbWl0VW5kZWZpbmVkIHx8IG9ialtrXSAhPT0gdm9pZCAwKVxuICAgICAgICBuW2tdID0gb2JqW2tdO1xuICAgIH1cbiAgICByZXR1cm4gbjtcbiAgfSwge30pO1xufVxuZnVuY3Rpb24gb2JqZWN0T21pdChvYmosIGtleXMsIG9taXRVbmRlZmluZWQgPSBmYWxzZSkge1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKG9iaikuZmlsdGVyKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICByZXR1cm4gKCFvbWl0VW5kZWZpbmVkIHx8IHZhbHVlICE9PSB2b2lkIDApICYmICFrZXlzLmluY2x1ZGVzKGtleSk7XG4gIH0pKTtcbn1cbmZ1bmN0aW9uIGNsZWFyVW5kZWZpbmVkKG9iaikge1xuICBPYmplY3Qua2V5cyhvYmopLmZvckVhY2goKGtleSkgPT4gb2JqW2tleV0gPT09IHZvaWQgMCA/IGRlbGV0ZSBvYmpba2V5XSA6IHt9KTtcbiAgcmV0dXJuIG9iajtcbn1cbmZ1bmN0aW9uIGhhc093blByb3BlcnR5KG9iaiwgdikge1xuICBpZiAob2JqID09IG51bGwpXG4gICAgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgdik7XG59XG5jb25zdCBfb2JqZWN0SWRNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcbmZ1bmN0aW9uIG9iamVjdElkKG9iaikge1xuICBpZiAoaXNQcmltaXRpdmUob2JqKSlcbiAgICByZXR1cm4gb2JqO1xuICBpZiAoIV9vYmplY3RJZE1hcC5oYXMob2JqKSkge1xuICAgIF9vYmplY3RJZE1hcC5zZXQob2JqLCByYW5kb21TdHIoKSk7XG4gIH1cbiAgcmV0dXJuIF9vYmplY3RJZE1hcC5nZXQob2JqKTtcbn1cblxuLypcbkhvdyBpdCB3b3JrczpcbmB0aGlzLiNoZWFkYCBpcyBhbiBpbnN0YW5jZSBvZiBgTm9kZWAgd2hpY2gga2VlcHMgdHJhY2sgb2YgaXRzIGN1cnJlbnQgdmFsdWUgYW5kIG5lc3RzIGFub3RoZXIgaW5zdGFuY2Ugb2YgYE5vZGVgIHRoYXQga2VlcHMgdGhlIHZhbHVlIHRoYXQgY29tZXMgYWZ0ZXIgaXQuIFdoZW4gYSB2YWx1ZSBpcyBwcm92aWRlZCB0byBgLmVucXVldWUoKWAsIHRoZSBjb2RlIG5lZWRzIHRvIGl0ZXJhdGUgdGhyb3VnaCBgdGhpcy4jaGVhZGAsIGdvaW5nIGRlZXBlciBhbmQgZGVlcGVyIHRvIGZpbmQgdGhlIGxhc3QgdmFsdWUuIEhvd2V2ZXIsIGl0ZXJhdGluZyB0aHJvdWdoIGV2ZXJ5IHNpbmdsZSBpdGVtIGlzIHNsb3cuIFRoaXMgcHJvYmxlbSBpcyBzb2x2ZWQgYnkgc2F2aW5nIGEgcmVmZXJlbmNlIHRvIHRoZSBsYXN0IHZhbHVlIGFzIGB0aGlzLiN0YWlsYCBzbyB0aGF0IGl0IGNhbiByZWZlcmVuY2UgaXQgdG8gYWRkIGEgbmV3IHZhbHVlLlxuKi9cblxuY2xhc3MgTm9kZSB7XG5cdHZhbHVlO1xuXHRuZXh0O1xuXG5cdGNvbnN0cnVjdG9yKHZhbHVlKSB7XG5cdFx0dGhpcy52YWx1ZSA9IHZhbHVlO1xuXHR9XG59XG5cbmNsYXNzIFF1ZXVlIHtcblx0I2hlYWQ7XG5cdCN0YWlsO1xuXHQjc2l6ZTtcblxuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHR0aGlzLmNsZWFyKCk7XG5cdH1cblxuXHRlbnF1ZXVlKHZhbHVlKSB7XG5cdFx0Y29uc3Qgbm9kZSA9IG5ldyBOb2RlKHZhbHVlKTtcblxuXHRcdGlmICh0aGlzLiNoZWFkKSB7XG5cdFx0XHR0aGlzLiN0YWlsLm5leHQgPSBub2RlO1xuXHRcdFx0dGhpcy4jdGFpbCA9IG5vZGU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuI2hlYWQgPSBub2RlO1xuXHRcdFx0dGhpcy4jdGFpbCA9IG5vZGU7XG5cdFx0fVxuXG5cdFx0dGhpcy4jc2l6ZSsrO1xuXHR9XG5cblx0ZGVxdWV1ZSgpIHtcblx0XHRjb25zdCBjdXJyZW50ID0gdGhpcy4jaGVhZDtcblx0XHRpZiAoIWN1cnJlbnQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR0aGlzLiNoZWFkID0gdGhpcy4jaGVhZC5uZXh0O1xuXHRcdHRoaXMuI3NpemUtLTtcblx0XHRyZXR1cm4gY3VycmVudC52YWx1ZTtcblx0fVxuXG5cdHBlZWsoKSB7XG5cdFx0aWYgKCF0aGlzLiNoZWFkKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuI2hlYWQudmFsdWU7XG5cblx0XHQvLyBUT0RPOiBOb2RlLmpzIDE4LlxuXHRcdC8vIHJldHVybiB0aGlzLiNoZWFkPy52YWx1ZTtcblx0fVxuXG5cdGNsZWFyKCkge1xuXHRcdHRoaXMuI2hlYWQgPSB1bmRlZmluZWQ7XG5cdFx0dGhpcy4jdGFpbCA9IHVuZGVmaW5lZDtcblx0XHR0aGlzLiNzaXplID0gMDtcblx0fVxuXG5cdGdldCBzaXplKCkge1xuXHRcdHJldHVybiB0aGlzLiNzaXplO1xuXHR9XG5cblx0KiBbU3ltYm9sLml0ZXJhdG9yXSgpIHtcblx0XHRsZXQgY3VycmVudCA9IHRoaXMuI2hlYWQ7XG5cblx0XHR3aGlsZSAoY3VycmVudCkge1xuXHRcdFx0eWllbGQgY3VycmVudC52YWx1ZTtcblx0XHRcdGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7XG5cdFx0fVxuXHR9XG5cblx0KiBkcmFpbigpIHtcblx0XHR3aGlsZSAodGhpcy4jaGVhZCkge1xuXHRcdFx0eWllbGQgdGhpcy5kZXF1ZXVlKCk7XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIHBMaW1pdChjb25jdXJyZW5jeSkge1xuXHR2YWxpZGF0ZUNvbmN1cnJlbmN5KGNvbmN1cnJlbmN5KTtcblxuXHRjb25zdCBxdWV1ZSA9IG5ldyBRdWV1ZSgpO1xuXHRsZXQgYWN0aXZlQ291bnQgPSAwO1xuXG5cdGNvbnN0IHJlc3VtZU5leHQgPSAoKSA9PiB7XG5cdFx0Ly8gUHJvY2VzcyB0aGUgbmV4dCBxdWV1ZWQgZnVuY3Rpb24gaWYgd2UncmUgdW5kZXIgdGhlIGNvbmN1cnJlbmN5IGxpbWl0XG5cdFx0aWYgKGFjdGl2ZUNvdW50IDwgY29uY3VycmVuY3kgJiYgcXVldWUuc2l6ZSA+IDApIHtcblx0XHRcdGFjdGl2ZUNvdW50Kys7XG5cdFx0XHRxdWV1ZS5kZXF1ZXVlKCkoKTtcblx0XHR9XG5cdH07XG5cblx0Y29uc3QgbmV4dCA9ICgpID0+IHtcblx0XHRhY3RpdmVDb3VudC0tO1xuXHRcdHJlc3VtZU5leHQoKTtcblx0fTtcblxuXHRjb25zdCBydW4gPSBhc3luYyAoZnVuY3Rpb25fLCByZXNvbHZlLCBhcmd1bWVudHNfKSA9PiB7XG5cdFx0Ly8gRXhlY3V0ZSB0aGUgZnVuY3Rpb24gYW5kIGNhcHR1cmUgdGhlIHJlc3VsdCBwcm9taXNlXG5cdFx0Y29uc3QgcmVzdWx0ID0gKGFzeW5jICgpID0+IGZ1bmN0aW9uXyguLi5hcmd1bWVudHNfKSkoKTtcblxuXHRcdC8vIFJlc29sdmUgaW1tZWRpYXRlbHkgd2l0aCB0aGUgcHJvbWlzZSAoZG9uJ3Qgd2FpdCBmb3IgY29tcGxldGlvbilcblx0XHRyZXNvbHZlKHJlc3VsdCk7XG5cblx0XHQvLyBXYWl0IGZvciB0aGUgZnVuY3Rpb24gdG8gY29tcGxldGUgKHN1Y2Nlc3Mgb3IgZmFpbHVyZSlcblx0XHQvLyBXZSBjYXRjaCBlcnJvcnMgaGVyZSB0byBwcmV2ZW50IHVuaGFuZGxlZCByZWplY3Rpb25zLFxuXHRcdC8vIGJ1dCB0aGUgb3JpZ2luYWwgcHJvbWlzZSByZWplY3Rpb24gaXMgcHJlc2VydmVkIGZvciB0aGUgY2FsbGVyXG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHJlc3VsdDtcblx0XHR9IGNhdGNoIHt9XG5cblx0XHQvLyBEZWNyZW1lbnQgYWN0aXZlIGNvdW50IGFuZCBwcm9jZXNzIG5leHQgcXVldWVkIGZ1bmN0aW9uXG5cdFx0bmV4dCgpO1xuXHR9O1xuXG5cdGNvbnN0IGVucXVldWUgPSAoZnVuY3Rpb25fLCByZXNvbHZlLCBhcmd1bWVudHNfKSA9PiB7XG5cdFx0Ly8gUXVldWUgdGhlIGludGVybmFsIHJlc29sdmUgZnVuY3Rpb24gaW5zdGVhZCBvZiB0aGUgcnVuIGZ1bmN0aW9uXG5cdFx0Ly8gdG8gcHJlc2VydmUgdGhlIGFzeW5jaHJvbm91cyBleGVjdXRpb24gY29udGV4dC5cblx0XHRuZXcgUHJvbWlzZShpbnRlcm5hbFJlc29sdmUgPT4geyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHByb21pc2UvcGFyYW0tbmFtZXNcblx0XHRcdHF1ZXVlLmVucXVldWUoaW50ZXJuYWxSZXNvbHZlKTtcblx0XHR9KS50aGVuKHJ1bi5iaW5kKHVuZGVmaW5lZCwgZnVuY3Rpb25fLCByZXNvbHZlLCBhcmd1bWVudHNfKSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcHJvbWlzZS9wcmVmZXItYXdhaXQtdG8tdGhlblxuXG5cdFx0Ly8gU3RhcnQgcHJvY2Vzc2luZyBpbW1lZGlhdGVseSBpZiB3ZSBoYXZlbid0IHJlYWNoZWQgdGhlIGNvbmN1cnJlbmN5IGxpbWl0XG5cdFx0aWYgKGFjdGl2ZUNvdW50IDwgY29uY3VycmVuY3kpIHtcblx0XHRcdHJlc3VtZU5leHQoKTtcblx0XHR9XG5cdH07XG5cblx0Y29uc3QgZ2VuZXJhdG9yID0gKGZ1bmN0aW9uXywgLi4uYXJndW1lbnRzXykgPT4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG5cdFx0ZW5xdWV1ZShmdW5jdGlvbl8sIHJlc29sdmUsIGFyZ3VtZW50c18pO1xuXHR9KTtcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydGllcyhnZW5lcmF0b3IsIHtcblx0XHRhY3RpdmVDb3VudDoge1xuXHRcdFx0Z2V0OiAoKSA9PiBhY3RpdmVDb3VudCxcblx0XHR9LFxuXHRcdHBlbmRpbmdDb3VudDoge1xuXHRcdFx0Z2V0OiAoKSA9PiBxdWV1ZS5zaXplLFxuXHRcdH0sXG5cdFx0Y2xlYXJRdWV1ZToge1xuXHRcdFx0dmFsdWUoKSB7XG5cdFx0XHRcdHF1ZXVlLmNsZWFyKCk7XG5cdFx0XHR9LFxuXHRcdH0sXG5cdFx0Y29uY3VycmVuY3k6IHtcblx0XHRcdGdldDogKCkgPT4gY29uY3VycmVuY3ksXG5cblx0XHRcdHNldChuZXdDb25jdXJyZW5jeSkge1xuXHRcdFx0XHR2YWxpZGF0ZUNvbmN1cnJlbmN5KG5ld0NvbmN1cnJlbmN5KTtcblx0XHRcdFx0Y29uY3VycmVuY3kgPSBuZXdDb25jdXJyZW5jeTtcblxuXHRcdFx0XHRxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG5cdFx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVubW9kaWZpZWQtbG9vcC1jb25kaXRpb25cblx0XHRcdFx0XHR3aGlsZSAoYWN0aXZlQ291bnQgPCBjb25jdXJyZW5jeSAmJiBxdWV1ZS5zaXplID4gMCkge1xuXHRcdFx0XHRcdFx0cmVzdW1lTmV4dCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9LFxuXHRcdH0sXG5cdFx0bWFwOiB7XG5cdFx0XHRhc3luYyB2YWx1ZShhcnJheSwgZnVuY3Rpb25fKSB7XG5cdFx0XHRcdGNvbnN0IHByb21pc2VzID0gYXJyYXkubWFwKCh2YWx1ZSwgaW5kZXgpID0+IHRoaXMoZnVuY3Rpb25fLCB2YWx1ZSwgaW5kZXgpKTtcblx0XHRcdFx0cmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKTtcblx0XHRcdH0sXG5cdFx0fSxcblx0fSk7XG5cblx0cmV0dXJuIGdlbmVyYXRvcjtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVDb25jdXJyZW5jeShjb25jdXJyZW5jeSkge1xuXHRpZiAoISgoTnVtYmVyLmlzSW50ZWdlcihjb25jdXJyZW5jeSkgfHwgY29uY3VycmVuY3kgPT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSkgJiYgY29uY3VycmVuY3kgPiAwKSkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGBjb25jdXJyZW5jeWAgdG8gYmUgYSBudW1iZXIgZnJvbSAxIGFuZCB1cCcpO1xuXHR9XG59XG5cbmNvbnN0IFZPSUQgPSBTeW1ib2woXCJwLXZvaWRcIik7XG5jbGFzcyBQSW5zdGFuY2UgZXh0ZW5kcyBQcm9taXNlIHtcbiAgY29uc3RydWN0b3IoaXRlbXMgPSBbXSwgb3B0aW9ucykge1xuICAgIHN1cGVyKCgpID0+IHtcbiAgICB9KTtcbiAgICB0aGlzLml0ZW1zID0gaXRlbXM7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgfVxuICBwcm9taXNlcyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG4gIGdldCBwcm9taXNlKCkge1xuICAgIGxldCBiYXRjaDtcbiAgICBjb25zdCBpdGVtcyA9IFsuLi5BcnJheS5mcm9tKHRoaXMuaXRlbXMpLCAuLi5BcnJheS5mcm9tKHRoaXMucHJvbWlzZXMpXTtcbiAgICBpZiAodGhpcy5vcHRpb25zPy5jb25jdXJyZW5jeSkge1xuICAgICAgY29uc3QgbGltaXQgPSBwTGltaXQodGhpcy5vcHRpb25zLmNvbmN1cnJlbmN5KTtcbiAgICAgIGJhdGNoID0gUHJvbWlzZS5hbGwoaXRlbXMubWFwKChwMikgPT4gbGltaXQoKCkgPT4gcDIpKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJhdGNoID0gUHJvbWlzZS5hbGwoaXRlbXMpO1xuICAgIH1cbiAgICByZXR1cm4gYmF0Y2gudGhlbigobCkgPT4gbC5maWx0ZXIoKGkpID0+IGkgIT09IFZPSUQpKTtcbiAgfVxuICBhZGQoLi4uYXJncykge1xuICAgIGFyZ3MuZm9yRWFjaCgoaSkgPT4ge1xuICAgICAgdGhpcy5wcm9taXNlcy5hZGQoaSk7XG4gICAgfSk7XG4gIH1cbiAgbWFwKGZuKSB7XG4gICAgcmV0dXJuIG5ldyBQSW5zdGFuY2UoXG4gICAgICBBcnJheS5mcm9tKHRoaXMuaXRlbXMpLm1hcChhc3luYyAoaSwgaWR4KSA9PiB7XG4gICAgICAgIGNvbnN0IHYgPSBhd2FpdCBpO1xuICAgICAgICBpZiAodiA9PT0gVk9JRClcbiAgICAgICAgICByZXR1cm4gVk9JRDtcbiAgICAgICAgcmV0dXJuIGZuKHYsIGlkeCk7XG4gICAgICB9KSxcbiAgICAgIHRoaXMub3B0aW9uc1xuICAgICk7XG4gIH1cbiAgZmlsdGVyKGZuKSB7XG4gICAgcmV0dXJuIG5ldyBQSW5zdGFuY2UoXG4gICAgICBBcnJheS5mcm9tKHRoaXMuaXRlbXMpLm1hcChhc3luYyAoaSwgaWR4KSA9PiB7XG4gICAgICAgIGNvbnN0IHYgPSBhd2FpdCBpO1xuICAgICAgICBjb25zdCByID0gYXdhaXQgZm4odiwgaWR4KTtcbiAgICAgICAgaWYgKCFyKVxuICAgICAgICAgIHJldHVybiBWT0lEO1xuICAgICAgICByZXR1cm4gdjtcbiAgICAgIH0pLFxuICAgICAgdGhpcy5vcHRpb25zXG4gICAgKTtcbiAgfVxuICBmb3JFYWNoKGZuKSB7XG4gICAgcmV0dXJuIHRoaXMubWFwKGZuKS50aGVuKCk7XG4gIH1cbiAgcmVkdWNlKGZuLCBpbml0aWFsVmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9taXNlLnRoZW4oKGFycmF5KSA9PiBhcnJheS5yZWR1Y2UoZm4sIGluaXRpYWxWYWx1ZSkpO1xuICB9XG4gIGNsZWFyKCkge1xuICAgIHRoaXMucHJvbWlzZXMuY2xlYXIoKTtcbiAgfVxuICB0aGVuKG9uZnVsZmlsbGVkLCBvbnJlamVjdGVkKSB7XG4gICAgcmV0dXJuIHRoaXMucHJvbWlzZS50aGVuKG9uZnVsZmlsbGVkLCBvbnJlamVjdGVkKTtcbiAgfVxuICBjYXRjaChmbikge1xuICAgIHJldHVybiB0aGlzLnByb21pc2UuY2F0Y2goZm4pO1xuICB9XG4gIGZpbmFsbHkoZm4pIHtcbiAgICByZXR1cm4gdGhpcy5wcm9taXNlLmZpbmFsbHkoZm4pO1xuICB9XG59XG5mdW5jdGlvbiBwKGl0ZW1zLCBvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgUEluc3RhbmNlKGl0ZW1zLCBvcHRpb25zKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlU2luZ2xldG9uUHJvbWlzZShmbikge1xuICBsZXQgX3Byb21pc2U7XG4gIGZ1bmN0aW9uIHdyYXBwZXIoKSB7XG4gICAgaWYgKCFfcHJvbWlzZSlcbiAgICAgIF9wcm9taXNlID0gZm4oKTtcbiAgICByZXR1cm4gX3Byb21pc2U7XG4gIH1cbiAgd3JhcHBlci5yZXNldCA9IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBfcHJldiA9IF9wcm9taXNlO1xuICAgIF9wcm9taXNlID0gdm9pZCAwO1xuICAgIGlmIChfcHJldilcbiAgICAgIGF3YWl0IF9wcmV2O1xuICB9O1xuICByZXR1cm4gd3JhcHBlcjtcbn1cbmZ1bmN0aW9uIHNsZWVwKG1zLCBjYWxsYmFjaykge1xuICByZXR1cm4gbmV3IFByb21pc2UoXG4gICAgKHJlc29sdmUpID0+IHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgY2FsbGJhY2s/LigpO1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0sIG1zKVxuICApO1xufVxuZnVuY3Rpb24gY3JlYXRlUHJvbWlzZUxvY2soKSB7XG4gIGNvbnN0IGxvY2tzID0gW107XG4gIHJldHVybiB7XG4gICAgYXN5bmMgcnVuKGZuKSB7XG4gICAgICBjb25zdCBwID0gZm4oKTtcbiAgICAgIGxvY2tzLnB1c2gocCk7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgcDtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHJlbW92ZShsb2NrcywgcCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBhc3luYyB3YWl0KCkge1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKGxvY2tzKTtcbiAgICB9LFxuICAgIGlzV2FpdGluZygpIHtcbiAgICAgIHJldHVybiBCb29sZWFuKGxvY2tzLmxlbmd0aCk7XG4gICAgfSxcbiAgICBjbGVhcigpIHtcbiAgICAgIGxvY2tzLmxlbmd0aCA9IDA7XG4gICAgfVxuICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlQ29udHJvbGxlZFByb21pc2UoKSB7XG4gIGxldCByZXNvbHZlLCByZWplY3Q7XG4gIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZSgoX3Jlc29sdmUsIF9yZWplY3QpID0+IHtcbiAgICByZXNvbHZlID0gX3Jlc29sdmU7XG4gICAgcmVqZWN0ID0gX3JlamVjdDtcbiAgfSk7XG4gIHByb21pc2UucmVzb2x2ZSA9IHJlc29sdmU7XG4gIHByb21pc2UucmVqZWN0ID0gcmVqZWN0O1xuICByZXR1cm4gcHJvbWlzZTtcbn1cblxuY29uc3QgdGltZXN0YW1wID0gKCkgPT4gK0RhdGUubm93KCk7XG5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVmaW5lZCxuby1wYXJhbS1yZWFzc2lnbixuby1zaGFkb3cgKi9cblxuLyoqXG4gKiBUaHJvdHRsZSBleGVjdXRpb24gb2YgYSBmdW5jdGlvbi4gRXNwZWNpYWxseSB1c2VmdWwgZm9yIHJhdGUgbGltaXRpbmdcbiAqIGV4ZWN1dGlvbiBvZiBoYW5kbGVycyBvbiBldmVudHMgbGlrZSByZXNpemUgYW5kIHNjcm9sbC5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gZGVsYXkgLSAgICAgICAgICAgICAgICAgIEEgemVyby1vci1ncmVhdGVyIGRlbGF5IGluIG1pbGxpc2Vjb25kcy4gRm9yIGV2ZW50IGNhbGxiYWNrcywgdmFsdWVzIGFyb3VuZCAxMDAgb3IgMjUwIChvciBldmVuIGhpZ2hlcilcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgbW9zdCB1c2VmdWwuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayAtICAgICAgICAgICAgICAgQSBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCBhZnRlciBkZWxheSBtaWxsaXNlY29uZHMuIFRoZSBgdGhpc2AgY29udGV4dCBhbmQgYWxsIGFyZ3VtZW50cyBhcmUgcGFzc2VkIHRocm91Z2gsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMtaXMsIHRvIGBjYWxsYmFja2Agd2hlbiB0aGUgdGhyb3R0bGVkLWZ1bmN0aW9uIGlzIGV4ZWN1dGVkLlxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXSAtICAgICAgICAgICAgICBBbiBvYmplY3QgdG8gY29uZmlndXJlIG9wdGlvbnMuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLm5vVHJhaWxpbmddIC0gICBPcHRpb25hbCwgZGVmYXVsdHMgdG8gZmFsc2UuIElmIG5vVHJhaWxpbmcgaXMgdHJ1ZSwgY2FsbGJhY2sgd2lsbCBvbmx5IGV4ZWN1dGUgZXZlcnkgYGRlbGF5YCBtaWxsaXNlY29uZHNcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSB0aGUgdGhyb3R0bGVkLWZ1bmN0aW9uIGlzIGJlaW5nIGNhbGxlZC4gSWYgbm9UcmFpbGluZyBpcyBmYWxzZSBvciB1bnNwZWNpZmllZCwgY2FsbGJhY2sgd2lsbCBiZSBleGVjdXRlZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uZSBmaW5hbCB0aW1lIGFmdGVyIHRoZSBsYXN0IHRocm90dGxlZC1mdW5jdGlvbiBjYWxsLiAoQWZ0ZXIgdGhlIHRocm90dGxlZC1mdW5jdGlvbiBoYXMgbm90IGJlZW4gY2FsbGVkIGZvclxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBkZWxheWAgbWlsbGlzZWNvbmRzLCB0aGUgaW50ZXJuYWwgY291bnRlciBpcyByZXNldCkuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLm5vTGVhZGluZ10gLSAgIE9wdGlvbmFsLCBkZWZhdWx0cyB0byBmYWxzZS4gSWYgbm9MZWFkaW5nIGlzIGZhbHNlLCB0aGUgZmlyc3QgdGhyb3R0bGVkLWZ1bmN0aW9uIGNhbGwgd2lsbCBleGVjdXRlIGNhbGxiYWNrXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1tZWRpYXRlbHkuIElmIG5vTGVhZGluZyBpcyB0cnVlLCB0aGUgZmlyc3QgdGhlIGNhbGxiYWNrIGV4ZWN1dGlvbiB3aWxsIGJlIHNraXBwZWQuIEl0IHNob3VsZCBiZSBub3RlZCB0aGF0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgd2lsbCBuZXZlciBleGVjdXRlZCBpZiBib3RoIG5vTGVhZGluZyA9IHRydWUgYW5kIG5vVHJhaWxpbmcgPSB0cnVlLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5kZWJvdW5jZU1vZGVdIC0gSWYgYGRlYm91bmNlTW9kZWAgaXMgdHJ1ZSAoYXQgYmVnaW4pLCBzY2hlZHVsZSBgY2xlYXJgIHRvIGV4ZWN1dGUgYWZ0ZXIgYGRlbGF5YCBtcy4gSWYgYGRlYm91bmNlTW9kZWAgaXNcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAoYXQgZW5kKSwgc2NoZWR1bGUgYGNhbGxiYWNrYCB0byBleGVjdXRlIGFmdGVyIGBkZWxheWAgbXMuXG4gKlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBBIG5ldywgdGhyb3R0bGVkLCBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gdGhyb3R0bGUkMSAoZGVsYXksIGNhbGxiYWNrLCBvcHRpb25zKSB7XG4gIHZhciBfcmVmID0gb3B0aW9ucyB8fCB7fSxcbiAgICAgIF9yZWYkbm9UcmFpbGluZyA9IF9yZWYubm9UcmFpbGluZyxcbiAgICAgIG5vVHJhaWxpbmcgPSBfcmVmJG5vVHJhaWxpbmcgPT09IHZvaWQgMCA/IGZhbHNlIDogX3JlZiRub1RyYWlsaW5nLFxuICAgICAgX3JlZiRub0xlYWRpbmcgPSBfcmVmLm5vTGVhZGluZyxcbiAgICAgIG5vTGVhZGluZyA9IF9yZWYkbm9MZWFkaW5nID09PSB2b2lkIDAgPyBmYWxzZSA6IF9yZWYkbm9MZWFkaW5nLFxuICAgICAgX3JlZiRkZWJvdW5jZU1vZGUgPSBfcmVmLmRlYm91bmNlTW9kZSxcbiAgICAgIGRlYm91bmNlTW9kZSA9IF9yZWYkZGVib3VuY2VNb2RlID09PSB2b2lkIDAgPyB1bmRlZmluZWQgOiBfcmVmJGRlYm91bmNlTW9kZTtcbiAgLypcbiAgICogQWZ0ZXIgd3JhcHBlciBoYXMgc3RvcHBlZCBiZWluZyBjYWxsZWQsIHRoaXMgdGltZW91dCBlbnN1cmVzIHRoYXRcbiAgICogYGNhbGxiYWNrYCBpcyBleGVjdXRlZCBhdCB0aGUgcHJvcGVyIHRpbWVzIGluIGB0aHJvdHRsZWAgYW5kIGBlbmRgXG4gICAqIGRlYm91bmNlIG1vZGVzLlxuICAgKi9cblxuXG4gIHZhciB0aW1lb3V0SUQ7XG4gIHZhciBjYW5jZWxsZWQgPSBmYWxzZTsgLy8gS2VlcCB0cmFjayBvZiB0aGUgbGFzdCB0aW1lIGBjYWxsYmFja2Agd2FzIGV4ZWN1dGVkLlxuXG4gIHZhciBsYXN0RXhlYyA9IDA7IC8vIEZ1bmN0aW9uIHRvIGNsZWFyIGV4aXN0aW5nIHRpbWVvdXRcblxuICBmdW5jdGlvbiBjbGVhckV4aXN0aW5nVGltZW91dCgpIHtcbiAgICBpZiAodGltZW91dElEKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZW91dElEKTtcbiAgICB9XG4gIH0gLy8gRnVuY3Rpb24gdG8gY2FuY2VsIG5leHQgZXhlY1xuXG5cbiAgZnVuY3Rpb24gY2FuY2VsKG9wdGlvbnMpIHtcbiAgICB2YXIgX3JlZjIgPSBvcHRpb25zIHx8IHt9LFxuICAgICAgICBfcmVmMiR1cGNvbWluZ09ubHkgPSBfcmVmMi51cGNvbWluZ09ubHksXG4gICAgICAgIHVwY29taW5nT25seSA9IF9yZWYyJHVwY29taW5nT25seSA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcmVmMiR1cGNvbWluZ09ubHk7XG5cbiAgICBjbGVhckV4aXN0aW5nVGltZW91dCgpO1xuICAgIGNhbmNlbGxlZCA9ICF1cGNvbWluZ09ubHk7XG4gIH1cbiAgLypcbiAgICogVGhlIGB3cmFwcGVyYCBmdW5jdGlvbiBlbmNhcHN1bGF0ZXMgYWxsIG9mIHRoZSB0aHJvdHRsaW5nIC8gZGVib3VuY2luZ1xuICAgKiBmdW5jdGlvbmFsaXR5IGFuZCB3aGVuIGV4ZWN1dGVkIHdpbGwgbGltaXQgdGhlIHJhdGUgYXQgd2hpY2ggYGNhbGxiYWNrYFxuICAgKiBpcyBleGVjdXRlZC5cbiAgICovXG5cblxuICBmdW5jdGlvbiB3cmFwcGVyKCkge1xuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmd1bWVudHNfID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJndW1lbnRzX1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIGVsYXBzZWQgPSBEYXRlLm5vdygpIC0gbGFzdEV4ZWM7XG5cbiAgICBpZiAoY2FuY2VsbGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBFeGVjdXRlIGBjYWxsYmFja2AgYW5kIHVwZGF0ZSB0aGUgYGxhc3RFeGVjYCB0aW1lc3RhbXAuXG5cblxuICAgIGZ1bmN0aW9uIGV4ZWMoKSB7XG4gICAgICBsYXN0RXhlYyA9IERhdGUubm93KCk7XG4gICAgICBjYWxsYmFjay5hcHBseShzZWxmLCBhcmd1bWVudHNfKTtcbiAgICB9XG4gICAgLypcbiAgICAgKiBJZiBgZGVib3VuY2VNb2RlYCBpcyB0cnVlIChhdCBiZWdpbikgdGhpcyBpcyB1c2VkIHRvIGNsZWFyIHRoZSBmbGFnXG4gICAgICogdG8gYWxsb3cgZnV0dXJlIGBjYWxsYmFja2AgZXhlY3V0aW9ucy5cbiAgICAgKi9cblxuXG4gICAgZnVuY3Rpb24gY2xlYXIoKSB7XG4gICAgICB0aW1lb3V0SUQgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKCFub0xlYWRpbmcgJiYgZGVib3VuY2VNb2RlICYmICF0aW1lb3V0SUQpIHtcbiAgICAgIC8qXG4gICAgICAgKiBTaW5jZSBgd3JhcHBlcmAgaXMgYmVpbmcgY2FsbGVkIGZvciB0aGUgZmlyc3QgdGltZSBhbmRcbiAgICAgICAqIGBkZWJvdW5jZU1vZGVgIGlzIHRydWUgKGF0IGJlZ2luKSwgZXhlY3V0ZSBgY2FsbGJhY2tgXG4gICAgICAgKiBhbmQgbm9MZWFkaW5nICE9IHRydWUuXG4gICAgICAgKi9cbiAgICAgIGV4ZWMoKTtcbiAgICB9XG5cbiAgICBjbGVhckV4aXN0aW5nVGltZW91dCgpO1xuXG4gICAgaWYgKGRlYm91bmNlTW9kZSA9PT0gdW5kZWZpbmVkICYmIGVsYXBzZWQgPiBkZWxheSkge1xuICAgICAgaWYgKG5vTGVhZGluZykge1xuICAgICAgICAvKlxuICAgICAgICAgKiBJbiB0aHJvdHRsZSBtb2RlIHdpdGggbm9MZWFkaW5nLCBpZiBgZGVsYXlgIHRpbWUgaGFzXG4gICAgICAgICAqIGJlZW4gZXhjZWVkZWQsIHVwZGF0ZSBgbGFzdEV4ZWNgIGFuZCBzY2hlZHVsZSBgY2FsbGJhY2tgXG4gICAgICAgICAqIHRvIGV4ZWN1dGUgYWZ0ZXIgYGRlbGF5YCBtcy5cbiAgICAgICAgICovXG4gICAgICAgIGxhc3RFeGVjID0gRGF0ZS5ub3coKTtcblxuICAgICAgICBpZiAoIW5vVHJhaWxpbmcpIHtcbiAgICAgICAgICB0aW1lb3V0SUQgPSBzZXRUaW1lb3V0KGRlYm91bmNlTW9kZSA/IGNsZWFyIDogZXhlYywgZGVsYXkpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvKlxuICAgICAgICAgKiBJbiB0aHJvdHRsZSBtb2RlIHdpdGhvdXQgbm9MZWFkaW5nLCBpZiBgZGVsYXlgIHRpbWUgaGFzIGJlZW4gZXhjZWVkZWQsIGV4ZWN1dGVcbiAgICAgICAgICogYGNhbGxiYWNrYC5cbiAgICAgICAgICovXG4gICAgICAgIGV4ZWMoKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG5vVHJhaWxpbmcgIT09IHRydWUpIHtcbiAgICAgIC8qXG4gICAgICAgKiBJbiB0cmFpbGluZyB0aHJvdHRsZSBtb2RlLCBzaW5jZSBgZGVsYXlgIHRpbWUgaGFzIG5vdCBiZWVuXG4gICAgICAgKiBleGNlZWRlZCwgc2NoZWR1bGUgYGNhbGxiYWNrYCB0byBleGVjdXRlIGBkZWxheWAgbXMgYWZ0ZXIgbW9zdFxuICAgICAgICogcmVjZW50IGV4ZWN1dGlvbi5cbiAgICAgICAqXG4gICAgICAgKiBJZiBgZGVib3VuY2VNb2RlYCBpcyB0cnVlIChhdCBiZWdpbiksIHNjaGVkdWxlIGBjbGVhcmAgdG8gZXhlY3V0ZVxuICAgICAgICogYWZ0ZXIgYGRlbGF5YCBtcy5cbiAgICAgICAqXG4gICAgICAgKiBJZiBgZGVib3VuY2VNb2RlYCBpcyBmYWxzZSAoYXQgZW5kKSwgc2NoZWR1bGUgYGNhbGxiYWNrYCB0b1xuICAgICAgICogZXhlY3V0ZSBhZnRlciBgZGVsYXlgIG1zLlxuICAgICAgICovXG4gICAgICB0aW1lb3V0SUQgPSBzZXRUaW1lb3V0KGRlYm91bmNlTW9kZSA/IGNsZWFyIDogZXhlYywgZGVib3VuY2VNb2RlID09PSB1bmRlZmluZWQgPyBkZWxheSAtIGVsYXBzZWQgOiBkZWxheSk7XG4gICAgfVxuICB9XG5cbiAgd3JhcHBlci5jYW5jZWwgPSBjYW5jZWw7IC8vIFJldHVybiB0aGUgd3JhcHBlciBmdW5jdGlvbi5cblxuICByZXR1cm4gd3JhcHBlcjtcbn1cblxuLyogZXNsaW50LWRpc2FibGUgbm8tdW5kZWZpbmVkICovXG4vKipcbiAqIERlYm91bmNlIGV4ZWN1dGlvbiBvZiBhIGZ1bmN0aW9uLiBEZWJvdW5jaW5nLCB1bmxpa2UgdGhyb3R0bGluZyxcbiAqIGd1YXJhbnRlZXMgdGhhdCBhIGZ1bmN0aW9uIGlzIG9ubHkgZXhlY3V0ZWQgYSBzaW5nbGUgdGltZSwgZWl0aGVyIGF0IHRoZVxuICogdmVyeSBiZWdpbm5pbmcgb2YgYSBzZXJpZXMgb2YgY2FsbHMsIG9yIGF0IHRoZSB2ZXJ5IGVuZC5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gZGVsYXkgLSAgICAgICAgICAgICAgIEEgemVyby1vci1ncmVhdGVyIGRlbGF5IGluIG1pbGxpc2Vjb25kcy4gRm9yIGV2ZW50IGNhbGxiYWNrcywgdmFsdWVzIGFyb3VuZCAxMDAgb3IgMjUwIChvciBldmVuIGhpZ2hlcikgYXJlIG1vc3QgdXNlZnVsLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgLSAgICAgICAgICBBIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIGFmdGVyIGRlbGF5IG1pbGxpc2Vjb25kcy4gVGhlIGB0aGlzYCBjb250ZXh0IGFuZCBhbGwgYXJndW1lbnRzIGFyZSBwYXNzZWQgdGhyb3VnaCwgYXMtaXMsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBgY2FsbGJhY2tgIHdoZW4gdGhlIGRlYm91bmNlZC1mdW5jdGlvbiBpcyBleGVjdXRlZC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc10gLSAgICAgICAgICAgQW4gb2JqZWN0IHRvIGNvbmZpZ3VyZSBvcHRpb25zLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5hdEJlZ2luXSAtICBPcHRpb25hbCwgZGVmYXVsdHMgdG8gZmFsc2UuIElmIGF0QmVnaW4gaXMgZmFsc2Ugb3IgdW5zcGVjaWZpZWQsIGNhbGxiYWNrIHdpbGwgb25seSBiZSBleGVjdXRlZCBgZGVsYXlgIG1pbGxpc2Vjb25kc1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXIgdGhlIGxhc3QgZGVib3VuY2VkLWZ1bmN0aW9uIGNhbGwuIElmIGF0QmVnaW4gaXMgdHJ1ZSwgY2FsbGJhY2sgd2lsbCBiZSBleGVjdXRlZCBvbmx5IGF0IHRoZSBmaXJzdCBkZWJvdW5jZWQtZnVuY3Rpb24gY2FsbC5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBZnRlciB0aGUgdGhyb3R0bGVkLWZ1bmN0aW9uIGhhcyBub3QgYmVlbiBjYWxsZWQgZm9yIGBkZWxheWAgbWlsbGlzZWNvbmRzLCB0aGUgaW50ZXJuYWwgY291bnRlciBpcyByZXNldCkuXG4gKlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBBIG5ldywgZGVib3VuY2VkIGZ1bmN0aW9uLlxuICovXG5cbmZ1bmN0aW9uIGRlYm91bmNlJDEgKGRlbGF5LCBjYWxsYmFjaywgb3B0aW9ucykge1xuICB2YXIgX3JlZiA9IG9wdGlvbnMgfHwge30sXG4gICAgICBfcmVmJGF0QmVnaW4gPSBfcmVmLmF0QmVnaW4sXG4gICAgICBhdEJlZ2luID0gX3JlZiRhdEJlZ2luID09PSB2b2lkIDAgPyBmYWxzZSA6IF9yZWYkYXRCZWdpbjtcblxuICByZXR1cm4gdGhyb3R0bGUkMShkZWxheSwgY2FsbGJhY2ssIHtcbiAgICBkZWJvdW5jZU1vZGU6IGF0QmVnaW4gIT09IGZhbHNlXG4gIH0pO1xufVxuXG5mdW5jdGlvbiB0aHJvdHRsZSguLi5hcmdzKSB7XG4gIHJldHVybiB0aHJvdHRsZSQxKC4uLmFyZ3MpO1xufVxuZnVuY3Rpb24gZGVib3VuY2UoLi4uYXJncykge1xuICByZXR1cm4gZGVib3VuY2UkMSguLi5hcmdzKTtcbn1cblxuZXhwb3J0IHsgYXNzZXJ0LCBhdCwgYmF0Y2hJbnZva2UsIGNhcGl0YWxpemUsIGNsYW1wLCBjbGFtcEFycmF5UmFuZ2UsIGNsZWFyVW5kZWZpbmVkLCBjcmVhdGVDb250cm9sbGVkUHJvbWlzZSwgY3JlYXRlUHJvbWlzZUxvY2ssIGNyZWF0ZVNpbmdsZXRvblByb21pc2UsIGRlYm91bmNlLCBkZWVwTWVyZ2UsIGRlZXBNZXJnZVdpdGhBcnJheSwgZW5zdXJlUHJlZml4LCBlbnN1cmVTdWZmaXgsIGZpbHRlckluUGxhY2UsIGZsYXR0ZW5BcnJheWFibGUsIGdldFR5cGVOYW1lLCBoYXNPd25Qcm9wZXJ0eSwgaW52b2tlLCBpc0Jvb2xlYW4sIGlzQnJvd3NlciwgaXNEYXRlLCBpc0RlZXBFcXVhbCwgaXNEZWYsIGlzRnVuY3Rpb24sIGlzS2V5T2YsIGlzTnVsbCwgaXNOdW1iZXIsIGlzT2JqZWN0LCBpc1ByaW1pdGl2ZSwgaXNSZWdFeHAsIGlzU3RyaW5nLCBpc1RydXRoeSwgaXNVbmRlZmluZWQsIGlzV2luZG93LCBsYXN0LCBsZXJwLCBtZXJnZUFycmF5YWJsZSwgbW92ZSwgbm9OdWxsLCBub29wLCBub3ROdWxsaXNoLCBub3RVbmRlZmluZWQsIG9iamVjdEVudHJpZXMsIG9iamVjdElkLCBvYmplY3RLZXlzLCBvYmplY3RNYXAsIG9iamVjdE9taXQsIG9iamVjdFBpY2ssIHAsIHBhcnRpdGlvbiwgcmFuZG9tU3RyLCByYW5nZSwgcmVtYXAsIHJlbW92ZSwgc2FtcGxlLCBzaHVmZmxlLCBzbGFzaCwgc2xlZXAsIHN1bSwgdGFwLCB0ZW1wbGF0ZSwgdGhyb3R0bGUsIHRpbWVzdGFtcCwgdG9BcnJheSwgdG9TdHJpbmcsIHVuaW5kZW50LCB1bmlxLCB1bmlxdWVCeSB9O1xuIiwiaW1wb3J0IHsgaXNOdW1iZXIsIHJhbmdlLCB1bmlxIH0gZnJvbSBcIkBhbnRmdS91dGlsc1wiO1xuLy8jcmVnaW9uIHNyYy90aW1lc3BsaXQvdGltZXN0cmluZy50c1xuLyoqXG4qIFBhcnNlIHRpbWVzdGFtcCBpbnRvIHNlY29uZHNcbipcbiogQWNjZXB0czpcbiogLSAxMDo1MC4xXG4qIC0gMTBzXG4qIC0gNW1cbiogLSAzbWluXG4qIC0gM21pbnMgNXNlY3NcbiogLSAxMC41bTNzXG4qIC0gKzEwc1xuKiAtIDFoMTBtMzBzXG4qIC0gMWg0c1xuKiAtIDE6MToxXG4qL1xuY29uc3QgUkVfQUxQSEEgPSAvW2Etel0vaTtcbmZ1bmN0aW9uIHBhcnNlVGltZVN0cmluZyh0aW1lc3RhbXApIHtcblx0aWYgKHR5cGVvZiB0aW1lc3RhbXAgPT09IFwibnVtYmVyXCIpIHJldHVybiB7XG5cdFx0c2Vjb25kczogdGltZXN0YW1wLFxuXHRcdHJlbGF0aXZlOiBmYWxzZVxuXHR9O1xuXHRjb25zdCByZWxhdGl2ZSA9IHRpbWVzdGFtcC5zdGFydHNXaXRoKFwiK1wiKTtcblx0aWYgKHJlbGF0aXZlKSB0aW1lc3RhbXAgPSB0aW1lc3RhbXAuc2xpY2UoMSk7XG5cdGxldCBzZWNvbmRzID0gMDtcblx0aWYgKHRpbWVzdGFtcC5pbmNsdWRlcyhcIjpcIikpIHtcblx0XHRjb25zdCBwYXJ0cyA9IHRpbWVzdGFtcC5zcGxpdChcIjpcIikubWFwKE51bWJlcik7XG5cdFx0bGV0IGggPSAwO1xuXHRcdGxldCBtID0gMDtcblx0XHRsZXQgcyA9IDA7XG5cdFx0aWYgKHBhcnRzLmxlbmd0aCA9PT0gMykge1xuXHRcdFx0aCA9IHBhcnRzWzBdO1xuXHRcdFx0bSA9IHBhcnRzWzFdO1xuXHRcdFx0cyA9IHBhcnRzWzJdO1xuXHRcdH0gZWxzZSBpZiAocGFydHMubGVuZ3RoID09PSAyKSB7XG5cdFx0XHRtID0gcGFydHNbMF07XG5cdFx0XHRzID0gcGFydHNbMV07XG5cdFx0fSBlbHNlIGlmIChwYXJ0cy5sZW5ndGggPT09IDEpIHMgPSBwYXJ0c1swXTtcblx0XHRlbHNlIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIHRpbWVzdGFtcCBmb3JtYXRcIik7XG5cdFx0aWYgKE51bWJlci5pc05hTihoKSB8fCBOdW1iZXIuaXNOYU4obSkgfHwgTnVtYmVyLmlzTmFOKHMpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCB0aW1lc3RhbXAgZm9ybWF0XCIpO1xuXHRcdHNlY29uZHMgPSAoaCB8fCAwKSAqIDM2MDAgKyAobSB8fCAwKSAqIDYwICsgKHMgfHwgMCk7XG5cdH0gZWxzZSBpZiAoIVJFX0FMUEhBLnRlc3QodGltZXN0YW1wKSkge1xuXHRcdHNlY29uZHMgPSBOdW1iZXIodGltZXN0YW1wKTtcblx0XHRpZiAoTnVtYmVyLmlzTmFOKHNlY29uZHMpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCB0aW1lc3RhbXAgZm9ybWF0XCIpO1xuXHR9IGVsc2Uge1xuXHRcdGNvbnN0IHVuaXRNYXAgPSB7XG5cdFx0XHRzOiAxLFxuXHRcdFx0c2VjOiAxLFxuXHRcdFx0c2VjczogMSxcblx0XHRcdG06IDYwLFxuXHRcdFx0bWluOiA2MCxcblx0XHRcdG1pbnM6IDYwLFxuXHRcdFx0aDogMzYwMCxcblx0XHRcdGhyOiAzNjAwLFxuXHRcdFx0aHJzOiAzNjAwLFxuXHRcdFx0aG91cjogMzYwMCxcblx0XHRcdGhvdXJzOiAzNjAwLFxuXHRcdFx0ZGF5OiA4NjQwMCxcblx0XHRcdGRheXM6IDg2NDAwLFxuXHRcdFx0d2VlazogNjA0ODAwLFxuXHRcdFx0d2Vla3M6IDYwNDgwMCxcblx0XHRcdG1vbnRoOiAyNjI5NzQ2LFxuXHRcdFx0bW9udGhzOiAyNjI5NzQ2LFxuXHRcdFx0eWVhcjogMzE1NTY5NTIsXG5cdFx0XHR5ZWFyczogMzE1NTY5NTJcblx0XHR9O1xuXHRcdGNvbnN0IHJlZ2V4ID0gLyhbXFxkLl0rKShbYS16XSspL2dpO1xuXHRcdGNvbnN0IG1hdGNoZXMgPSB0aW1lc3RhbXAubWF0Y2hBbGwocmVnZXgpO1xuXHRcdGlmIChtYXRjaGVzKSBmb3IgKGNvbnN0IG1hdGNoIG9mIG1hdGNoZXMpIHtcblx0XHRcdGNvbnN0IHZhbHVlID0gTnVtYmVyKG1hdGNoWzFdKTtcblx0XHRcdGlmIChOdW1iZXIuaXNOYU4odmFsdWUpKSB0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIHRpbWVzdGFtcCB2YWx1ZTogJHttYXRjaFsxXX1gKTtcblx0XHRcdGNvbnN0IHVuaXQgPSBtYXRjaFsyXS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0aWYgKCEodW5pdCBpbiB1bml0TWFwKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCB0aW1lc3RhbXAgdW5pdDogJHt1bml0fWApO1xuXHRcdFx0c2Vjb25kcyArPSB2YWx1ZSAqIHVuaXRNYXBbdW5pdF07XG5cdFx0fVxuXHRcdGNvbnN0IHJlbWFpbmluZyA9IHRpbWVzdGFtcC5yZXBsYWNlKHJlZ2V4LCBcIlwiKS50cmltKCk7XG5cdFx0aWYgKHJlbWFpbmluZykgdGhyb3cgbmV3IFR5cGVFcnJvcihgVW5rbm93biB0aW1lc3RhbXAgcmVtYWluaW5nOiAke3JlbWFpbmluZ31gKTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdHNlY29uZHMsXG5cdFx0cmVsYXRpdmVcblx0fTtcbn1cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNyYy90aW1lc3BsaXQvdGltZXNwbGl0LnRzXG5mdW5jdGlvbiBwYXJzZVRpbWVzcGxpdHMoaW5wdXRzKSB7XG5cdGxldCB0cyA9IDA7XG5cdGNvbnN0IG91dHB1dHMgPSBbXTtcblx0bGV0IGN1cnJlbnQgPSB7XG5cdFx0dGltZXN0YW1wU3RhcnQ6IHRzLFxuXHRcdHRpbWVzdGFtcEVuZDogdHMsXG5cdFx0bm9TdGFydDogMCxcblx0XHRub0VuZDogMCxcblx0XHR0aXRsZTogXCJbc3RhcnRdXCJcblx0fTtcblx0b3V0cHV0cy5wdXNoKGN1cnJlbnQpO1xuXHRmb3IgKGNvbnN0IGlucHV0IG9mIGlucHV0cykge1xuXHRcdGNvbnN0IHRpbWUgPSBwYXJzZVRpbWVTdHJpbmcoaW5wdXQudGltZXNwbGl0KTtcblx0XHRjb25zdCBlbmQgPSB0aW1lLnJlbGF0aXZlID8gdHMgKyB0aW1lLnNlY29uZHMgOiB0aW1lLnNlY29uZHM7XG5cdFx0aWYgKGVuZCA8IHRzKSB0aHJvdyBuZXcgRXJyb3IoYFRpbWVzcGxpdCBlbmQgJHtlbmR9IGlzIGJlZm9yZSBzdGFydCAke3RzfWApO1xuXHRcdGN1cnJlbnQudGltZXN0YW1wRW5kID0gZW5kO1xuXHRcdGN1cnJlbnQubm9FbmQgPSBpbnB1dC5ubztcblx0XHRpZiAoaW5wdXQudGl0bGUpIGN1cnJlbnQudGl0bGUgPSBpbnB1dC50aXRsZTtcblx0XHR0cyA9IGVuZDtcblx0XHRjdXJyZW50ID0ge1xuXHRcdFx0dGltZXN0YW1wU3RhcnQ6IGVuZCxcblx0XHRcdHRpbWVzdGFtcEVuZDogZW5kLFxuXHRcdFx0bm9TdGFydDogaW5wdXQubm8sXG5cdFx0XHRub0VuZDogaW5wdXQubm9cblx0XHR9O1xuXHRcdG91dHB1dHMucHVzaChjdXJyZW50KTtcblx0fVxuXHRyZXR1cm4gb3V0cHV0cztcbn1cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNyYy91dGlscy50c1xuY29uc3QgUkVfQVNQRUNUX1JBVElPX1NFUEFSQVRPUiA9IC9bOi94fF0vO1xuLyoqXG4qIDEsMy01LDggPT4gWzEsIDMsIDQsIDUsIDhdXG4qL1xuZnVuY3Rpb24gcGFyc2VSYW5nZVN0cmluZyh0b3RhbCwgcmFuZ2VTdHIpIHtcblx0aWYgKCFyYW5nZVN0ciB8fCByYW5nZVN0ciA9PT0gXCJhbGxcIiB8fCByYW5nZVN0ciA9PT0gXCIqXCIpIHJldHVybiByYW5nZSgxLCB0b3RhbCArIDEpO1xuXHRpZiAocmFuZ2VTdHIgPT09IFwibm9uZVwiKSByZXR1cm4gW107XG5cdGNvbnN0IGluZGV4ZXMgPSBbXTtcblx0Zm9yIChjb25zdCBwYXJ0IG9mIHJhbmdlU3RyLnNwbGl0KC9bLDtdL2cpKSBpZiAoIXBhcnQuaW5jbHVkZXMoXCItXCIpKSBpbmRleGVzLnB1c2goK3BhcnQpO1xuXHRlbHNlIHtcblx0XHRjb25zdCBbc3RhcnQsIGVuZF0gPSBwYXJ0LnNwbGl0KFwiLVwiLCAyKTtcblx0XHRpbmRleGVzLnB1c2goLi4ucmFuZ2UoK3N0YXJ0LCAhZW5kID8gdG90YWwgKyAxIDogK2VuZCArIDEpKTtcblx0fVxuXHRyZXR1cm4gdW5pcShpbmRleGVzKS5maWx0ZXIoKGkpID0+IGkgPD0gdG90YWwpLnNvcnQoKGEsIGIpID0+IGEgLSBiKTtcbn1cbi8qKlxuKiBBY2NlcHRzIGAxNi85YCBgMToxYCBgM3g0YFxuKi9cbmZ1bmN0aW9uIHBhcnNlQXNwZWN0UmF0aW8oc3RyKSB7XG5cdGlmIChpc051bWJlcihzdHIpKSByZXR1cm4gc3RyO1xuXHRpZiAoIU51bWJlci5pc05hTigrc3RyKSkgcmV0dXJuICtzdHI7XG5cdGNvbnN0IFt3U3RyID0gXCJcIiwgaFN0ciA9IFwiXCJdID0gc3RyLnNwbGl0KFJFX0FTUEVDVF9SQVRJT19TRVBBUkFUT1IpO1xuXHRjb25zdCB3ID0gTnVtYmVyLnBhcnNlRmxvYXQod1N0ci50cmltKCkpO1xuXHRjb25zdCBoID0gTnVtYmVyLnBhcnNlRmxvYXQoaFN0ci50cmltKCkpO1xuXHRpZiAoTnVtYmVyLmlzTmFOKHcpIHx8IE51bWJlci5pc05hTihoKSB8fCBoID09PSAwKSB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgYXNwZWN0IHJhdGlvIFwiJHtzdHJ9XCJgKTtcblx0cmV0dXJuIHcgLyBoO1xufVxuLy8jZW5kcmVnaW9uXG5leHBvcnQgeyBwYXJzZUFzcGVjdFJhdGlvLCBwYXJzZVJhbmdlU3RyaW5nLCBwYXJzZVRpbWVTdHJpbmcsIHBhcnNlVGltZXNwbGl0cyB9O1xuIiwiY29uc3QgQUxJQVMgPSBTeW1ib2wuZm9yKCd5YW1sLmFsaWFzJyk7XG5jb25zdCBET0MgPSBTeW1ib2wuZm9yKCd5YW1sLmRvY3VtZW50Jyk7XG5jb25zdCBNQVAgPSBTeW1ib2wuZm9yKCd5YW1sLm1hcCcpO1xuY29uc3QgUEFJUiA9IFN5bWJvbC5mb3IoJ3lhbWwucGFpcicpO1xuY29uc3QgU0NBTEFSID0gU3ltYm9sLmZvcigneWFtbC5zY2FsYXInKTtcbmNvbnN0IFNFUSA9IFN5bWJvbC5mb3IoJ3lhbWwuc2VxJyk7XG5jb25zdCBOT0RFX1RZUEUgPSBTeW1ib2wuZm9yKCd5YW1sLm5vZGUudHlwZScpO1xuY29uc3QgaXNBbGlhcyA9IChub2RlKSA9PiAhIW5vZGUgJiYgdHlwZW9mIG5vZGUgPT09ICdvYmplY3QnICYmIG5vZGVbTk9ERV9UWVBFXSA9PT0gQUxJQVM7XG5jb25zdCBpc0RvY3VtZW50ID0gKG5vZGUpID0+ICEhbm9kZSAmJiB0eXBlb2Ygbm9kZSA9PT0gJ29iamVjdCcgJiYgbm9kZVtOT0RFX1RZUEVdID09PSBET0M7XG5jb25zdCBpc01hcCA9IChub2RlKSA9PiAhIW5vZGUgJiYgdHlwZW9mIG5vZGUgPT09ICdvYmplY3QnICYmIG5vZGVbTk9ERV9UWVBFXSA9PT0gTUFQO1xuY29uc3QgaXNQYWlyID0gKG5vZGUpID0+ICEhbm9kZSAmJiB0eXBlb2Ygbm9kZSA9PT0gJ29iamVjdCcgJiYgbm9kZVtOT0RFX1RZUEVdID09PSBQQUlSO1xuY29uc3QgaXNTY2FsYXIgPSAobm9kZSkgPT4gISFub2RlICYmIHR5cGVvZiBub2RlID09PSAnb2JqZWN0JyAmJiBub2RlW05PREVfVFlQRV0gPT09IFNDQUxBUjtcbmNvbnN0IGlzU2VxID0gKG5vZGUpID0+ICEhbm9kZSAmJiB0eXBlb2Ygbm9kZSA9PT0gJ29iamVjdCcgJiYgbm9kZVtOT0RFX1RZUEVdID09PSBTRVE7XG5mdW5jdGlvbiBpc0NvbGxlY3Rpb24obm9kZSkge1xuICAgIGlmIChub2RlICYmIHR5cGVvZiBub2RlID09PSAnb2JqZWN0JylcbiAgICAgICAgc3dpdGNoIChub2RlW05PREVfVFlQRV0pIHtcbiAgICAgICAgICAgIGNhc2UgTUFQOlxuICAgICAgICAgICAgY2FzZSBTRVE6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBpc05vZGUobm9kZSkge1xuICAgIGlmIChub2RlICYmIHR5cGVvZiBub2RlID09PSAnb2JqZWN0JylcbiAgICAgICAgc3dpdGNoIChub2RlW05PREVfVFlQRV0pIHtcbiAgICAgICAgICAgIGNhc2UgQUxJQVM6XG4gICAgICAgICAgICBjYXNlIE1BUDpcbiAgICAgICAgICAgIGNhc2UgU0NBTEFSOlxuICAgICAgICAgICAgY2FzZSBTRVE6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5jb25zdCBoYXNBbmNob3IgPSAobm9kZSkgPT4gKGlzU2NhbGFyKG5vZGUpIHx8IGlzQ29sbGVjdGlvbihub2RlKSkgJiYgISFub2RlLmFuY2hvcjtcblxuZXhwb3J0IHsgQUxJQVMsIERPQywgTUFQLCBOT0RFX1RZUEUsIFBBSVIsIFNDQUxBUiwgU0VRLCBoYXNBbmNob3IsIGlzQWxpYXMsIGlzQ29sbGVjdGlvbiwgaXNEb2N1bWVudCwgaXNNYXAsIGlzTm9kZSwgaXNQYWlyLCBpc1NjYWxhciwgaXNTZXEgfTtcbiIsImltcG9ydCB7IGlzRG9jdW1lbnQsIGlzTm9kZSwgaXNQYWlyLCBpc0NvbGxlY3Rpb24sIGlzTWFwLCBpc1NlcSwgaXNTY2FsYXIsIGlzQWxpYXMgfSBmcm9tICcuL25vZGVzL2lkZW50aXR5LmpzJztcblxuY29uc3QgQlJFQUsgPSBTeW1ib2woJ2JyZWFrIHZpc2l0Jyk7XG5jb25zdCBTS0lQID0gU3ltYm9sKCdza2lwIGNoaWxkcmVuJyk7XG5jb25zdCBSRU1PVkUgPSBTeW1ib2woJ3JlbW92ZSBub2RlJyk7XG4vKipcbiAqIEFwcGx5IGEgdmlzaXRvciB0byBhbiBBU1Qgbm9kZSBvciBkb2N1bWVudC5cbiAqXG4gKiBXYWxrcyB0aHJvdWdoIHRoZSB0cmVlIChkZXB0aC1maXJzdCkgc3RhcnRpbmcgZnJvbSBgbm9kZWAsIGNhbGxpbmcgYVxuICogYHZpc2l0b3JgIGZ1bmN0aW9uIHdpdGggdGhyZWUgYXJndW1lbnRzOlxuICogICAtIGBrZXlgOiBGb3Igc2VxdWVuY2UgdmFsdWVzIGFuZCBtYXAgYFBhaXJgLCB0aGUgbm9kZSdzIGluZGV4IGluIHRoZVxuICogICAgIGNvbGxlY3Rpb24uIFdpdGhpbiBhIGBQYWlyYCwgYCdrZXknYCBvciBgJ3ZhbHVlJ2AsIGNvcnJlc3BvbmRpbmdseS5cbiAqICAgICBgbnVsbGAgZm9yIHRoZSByb290IG5vZGUuXG4gKiAgIC0gYG5vZGVgOiBUaGUgY3VycmVudCBub2RlLlxuICogICAtIGBwYXRoYDogVGhlIGFuY2VzdHJ5IG9mIHRoZSBjdXJyZW50IG5vZGUuXG4gKlxuICogVGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgdmlzaXRvciBtYXkgYmUgdXNlZCB0byBjb250cm9sIHRoZSB0cmF2ZXJzYWw6XG4gKiAgIC0gYHVuZGVmaW5lZGAgKGRlZmF1bHQpOiBEbyBub3RoaW5nIGFuZCBjb250aW51ZVxuICogICAtIGB2aXNpdC5TS0lQYDogRG8gbm90IHZpc2l0IHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUsIGNvbnRpbnVlIHdpdGggbmV4dFxuICogICAgIHNpYmxpbmdcbiAqICAgLSBgdmlzaXQuQlJFQUtgOiBUZXJtaW5hdGUgdHJhdmVyc2FsIGNvbXBsZXRlbHlcbiAqICAgLSBgdmlzaXQuUkVNT1ZFYDogUmVtb3ZlIHRoZSBjdXJyZW50IG5vZGUsIHRoZW4gY29udGludWUgd2l0aCB0aGUgbmV4dCBvbmVcbiAqICAgLSBgTm9kZWA6IFJlcGxhY2UgdGhlIGN1cnJlbnQgbm9kZSwgdGhlbiBjb250aW51ZSBieSB2aXNpdGluZyBpdFxuICogICAtIGBudW1iZXJgOiBXaGlsZSBpdGVyYXRpbmcgdGhlIGl0ZW1zIG9mIGEgc2VxdWVuY2Ugb3IgbWFwLCBzZXQgdGhlIGluZGV4XG4gKiAgICAgb2YgdGhlIG5leHQgc3RlcC4gVGhpcyBpcyB1c2VmdWwgZXNwZWNpYWxseSBpZiB0aGUgaW5kZXggb2YgdGhlIGN1cnJlbnRcbiAqICAgICBub2RlIGhhcyBjaGFuZ2VkLlxuICpcbiAqIElmIGB2aXNpdG9yYCBpcyBhIHNpbmdsZSBmdW5jdGlvbiwgaXQgd2lsbCBiZSBjYWxsZWQgd2l0aCBhbGwgdmFsdWVzXG4gKiBlbmNvdW50ZXJlZCBpbiB0aGUgdHJlZSwgaW5jbHVkaW5nIGUuZy4gYG51bGxgIHZhbHVlcy4gQWx0ZXJuYXRpdmVseSxcbiAqIHNlcGFyYXRlIHZpc2l0b3IgZnVuY3Rpb25zIG1heSBiZSBkZWZpbmVkIGZvciBlYWNoIGBNYXBgLCBgUGFpcmAsIGBTZXFgLFxuICogYEFsaWFzYCBhbmQgYFNjYWxhcmAgbm9kZS4gVG8gZGVmaW5lIHRoZSBzYW1lIHZpc2l0b3IgZnVuY3Rpb24gZm9yIG1vcmUgdGhhblxuICogb25lIG5vZGUgdHlwZSwgdXNlIHRoZSBgQ29sbGVjdGlvbmAgKG1hcCBhbmQgc2VxKSwgYFZhbHVlYCAobWFwLCBzZXEgJiBzY2FsYXIpXG4gKiBhbmQgYE5vZGVgIChhbGlhcywgbWFwLCBzZXEgJiBzY2FsYXIpIHRhcmdldHMuIE9mIGFsbCB0aGVzZSwgb25seSB0aGUgbW9zdFxuICogc3BlY2lmaWMgZGVmaW5lZCBvbmUgd2lsbCBiZSB1c2VkIGZvciBlYWNoIG5vZGUuXG4gKi9cbmZ1bmN0aW9uIHZpc2l0KG5vZGUsIHZpc2l0b3IpIHtcbiAgICBjb25zdCB2aXNpdG9yXyA9IGluaXRWaXNpdG9yKHZpc2l0b3IpO1xuICAgIGlmIChpc0RvY3VtZW50KG5vZGUpKSB7XG4gICAgICAgIGNvbnN0IGNkID0gdmlzaXRfKG51bGwsIG5vZGUuY29udGVudHMsIHZpc2l0b3JfLCBPYmplY3QuZnJlZXplKFtub2RlXSkpO1xuICAgICAgICBpZiAoY2QgPT09IFJFTU9WRSlcbiAgICAgICAgICAgIG5vZGUuY29udGVudHMgPSBudWxsO1xuICAgIH1cbiAgICBlbHNlXG4gICAgICAgIHZpc2l0XyhudWxsLCBub2RlLCB2aXNpdG9yXywgT2JqZWN0LmZyZWV6ZShbXSkpO1xufVxuLy8gV2l0aG91dCB0aGUgYGFzIHN5bWJvbGAgY2FzdHMsIFRTIGRlY2xhcmVzIHRoZXNlIGluIHRoZSBgdmlzaXRgXG4vLyBuYW1lc3BhY2UgdXNpbmcgYHZhcmAsIGJ1dCB0aGVuIGNvbXBsYWlucyBhYm91dCB0aGF0IGJlY2F1c2Vcbi8vIGB1bmlxdWUgc3ltYm9sYCBtdXN0IGJlIGBjb25zdGAuXG4vKiogVGVybWluYXRlIHZpc2l0IHRyYXZlcnNhbCBjb21wbGV0ZWx5ICovXG52aXNpdC5CUkVBSyA9IEJSRUFLO1xuLyoqIERvIG5vdCB2aXNpdCB0aGUgY2hpbGRyZW4gb2YgdGhlIGN1cnJlbnQgbm9kZSAqL1xudmlzaXQuU0tJUCA9IFNLSVA7XG4vKiogUmVtb3ZlIHRoZSBjdXJyZW50IG5vZGUgKi9cbnZpc2l0LlJFTU9WRSA9IFJFTU9WRTtcbmZ1bmN0aW9uIHZpc2l0XyhrZXksIG5vZGUsIHZpc2l0b3IsIHBhdGgpIHtcbiAgICBjb25zdCBjdHJsID0gY2FsbFZpc2l0b3Ioa2V5LCBub2RlLCB2aXNpdG9yLCBwYXRoKTtcbiAgICBpZiAoaXNOb2RlKGN0cmwpIHx8IGlzUGFpcihjdHJsKSkge1xuICAgICAgICByZXBsYWNlTm9kZShrZXksIHBhdGgsIGN0cmwpO1xuICAgICAgICByZXR1cm4gdmlzaXRfKGtleSwgY3RybCwgdmlzaXRvciwgcGF0aCk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgY3RybCAhPT0gJ3N5bWJvbCcpIHtcbiAgICAgICAgaWYgKGlzQ29sbGVjdGlvbihub2RlKSkge1xuICAgICAgICAgICAgcGF0aCA9IE9iamVjdC5mcmVlemUocGF0aC5jb25jYXQobm9kZSkpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLml0ZW1zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2kgPSB2aXNpdF8oaSwgbm9kZS5pdGVtc1tpXSwgdmlzaXRvciwgcGF0aCk7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjaSA9PT0gJ251bWJlcicpXG4gICAgICAgICAgICAgICAgICAgIGkgPSBjaSAtIDE7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoY2kgPT09IEJSRUFLKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gQlJFQUs7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoY2kgPT09IFJFTU9WRSkge1xuICAgICAgICAgICAgICAgICAgICBub2RlLml0ZW1zLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgaSAtPSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc1BhaXIobm9kZSkpIHtcbiAgICAgICAgICAgIHBhdGggPSBPYmplY3QuZnJlZXplKHBhdGguY29uY2F0KG5vZGUpKTtcbiAgICAgICAgICAgIGNvbnN0IGNrID0gdmlzaXRfKCdrZXknLCBub2RlLmtleSwgdmlzaXRvciwgcGF0aCk7XG4gICAgICAgICAgICBpZiAoY2sgPT09IEJSRUFLKVxuICAgICAgICAgICAgICAgIHJldHVybiBCUkVBSztcbiAgICAgICAgICAgIGVsc2UgaWYgKGNrID09PSBSRU1PVkUpXG4gICAgICAgICAgICAgICAgbm9kZS5rZXkgPSBudWxsO1xuICAgICAgICAgICAgY29uc3QgY3YgPSB2aXNpdF8oJ3ZhbHVlJywgbm9kZS52YWx1ZSwgdmlzaXRvciwgcGF0aCk7XG4gICAgICAgICAgICBpZiAoY3YgPT09IEJSRUFLKVxuICAgICAgICAgICAgICAgIHJldHVybiBCUkVBSztcbiAgICAgICAgICAgIGVsc2UgaWYgKGN2ID09PSBSRU1PVkUpXG4gICAgICAgICAgICAgICAgbm9kZS52YWx1ZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGN0cmw7XG59XG4vKipcbiAqIEFwcGx5IGFuIGFzeW5jIHZpc2l0b3IgdG8gYW4gQVNUIG5vZGUgb3IgZG9jdW1lbnQuXG4gKlxuICogV2Fsa3MgdGhyb3VnaCB0aGUgdHJlZSAoZGVwdGgtZmlyc3QpIHN0YXJ0aW5nIGZyb20gYG5vZGVgLCBjYWxsaW5nIGFcbiAqIGB2aXNpdG9yYCBmdW5jdGlvbiB3aXRoIHRocmVlIGFyZ3VtZW50czpcbiAqICAgLSBga2V5YDogRm9yIHNlcXVlbmNlIHZhbHVlcyBhbmQgbWFwIGBQYWlyYCwgdGhlIG5vZGUncyBpbmRleCBpbiB0aGVcbiAqICAgICBjb2xsZWN0aW9uLiBXaXRoaW4gYSBgUGFpcmAsIGAna2V5J2Agb3IgYCd2YWx1ZSdgLCBjb3JyZXNwb25kaW5nbHkuXG4gKiAgICAgYG51bGxgIGZvciB0aGUgcm9vdCBub2RlLlxuICogICAtIGBub2RlYDogVGhlIGN1cnJlbnQgbm9kZS5cbiAqICAgLSBgcGF0aGA6IFRoZSBhbmNlc3RyeSBvZiB0aGUgY3VycmVudCBub2RlLlxuICpcbiAqIFRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIHZpc2l0b3IgbWF5IGJlIHVzZWQgdG8gY29udHJvbCB0aGUgdHJhdmVyc2FsOlxuICogICAtIGBQcm9taXNlYDogTXVzdCByZXNvbHZlIHRvIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlc1xuICogICAtIGB1bmRlZmluZWRgIChkZWZhdWx0KTogRG8gbm90aGluZyBhbmQgY29udGludWVcbiAqICAgLSBgdmlzaXQuU0tJUGA6IERvIG5vdCB2aXNpdCB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlLCBjb250aW51ZSB3aXRoIG5leHRcbiAqICAgICBzaWJsaW5nXG4gKiAgIC0gYHZpc2l0LkJSRUFLYDogVGVybWluYXRlIHRyYXZlcnNhbCBjb21wbGV0ZWx5XG4gKiAgIC0gYHZpc2l0LlJFTU9WRWA6IFJlbW92ZSB0aGUgY3VycmVudCBub2RlLCB0aGVuIGNvbnRpbnVlIHdpdGggdGhlIG5leHQgb25lXG4gKiAgIC0gYE5vZGVgOiBSZXBsYWNlIHRoZSBjdXJyZW50IG5vZGUsIHRoZW4gY29udGludWUgYnkgdmlzaXRpbmcgaXRcbiAqICAgLSBgbnVtYmVyYDogV2hpbGUgaXRlcmF0aW5nIHRoZSBpdGVtcyBvZiBhIHNlcXVlbmNlIG9yIG1hcCwgc2V0IHRoZSBpbmRleFxuICogICAgIG9mIHRoZSBuZXh0IHN0ZXAuIFRoaXMgaXMgdXNlZnVsIGVzcGVjaWFsbHkgaWYgdGhlIGluZGV4IG9mIHRoZSBjdXJyZW50XG4gKiAgICAgbm9kZSBoYXMgY2hhbmdlZC5cbiAqXG4gKiBJZiBgdmlzaXRvcmAgaXMgYSBzaW5nbGUgZnVuY3Rpb24sIGl0IHdpbGwgYmUgY2FsbGVkIHdpdGggYWxsIHZhbHVlc1xuICogZW5jb3VudGVyZWQgaW4gdGhlIHRyZWUsIGluY2x1ZGluZyBlLmcuIGBudWxsYCB2YWx1ZXMuIEFsdGVybmF0aXZlbHksXG4gKiBzZXBhcmF0ZSB2aXNpdG9yIGZ1bmN0aW9ucyBtYXkgYmUgZGVmaW5lZCBmb3IgZWFjaCBgTWFwYCwgYFBhaXJgLCBgU2VxYCxcbiAqIGBBbGlhc2AgYW5kIGBTY2FsYXJgIG5vZGUuIFRvIGRlZmluZSB0aGUgc2FtZSB2aXNpdG9yIGZ1bmN0aW9uIGZvciBtb3JlIHRoYW5cbiAqIG9uZSBub2RlIHR5cGUsIHVzZSB0aGUgYENvbGxlY3Rpb25gIChtYXAgYW5kIHNlcSksIGBWYWx1ZWAgKG1hcCwgc2VxICYgc2NhbGFyKVxuICogYW5kIGBOb2RlYCAoYWxpYXMsIG1hcCwgc2VxICYgc2NhbGFyKSB0YXJnZXRzLiBPZiBhbGwgdGhlc2UsIG9ubHkgdGhlIG1vc3RcbiAqIHNwZWNpZmljIGRlZmluZWQgb25lIHdpbGwgYmUgdXNlZCBmb3IgZWFjaCBub2RlLlxuICovXG5hc3luYyBmdW5jdGlvbiB2aXNpdEFzeW5jKG5vZGUsIHZpc2l0b3IpIHtcbiAgICBjb25zdCB2aXNpdG9yXyA9IGluaXRWaXNpdG9yKHZpc2l0b3IpO1xuICAgIGlmIChpc0RvY3VtZW50KG5vZGUpKSB7XG4gICAgICAgIGNvbnN0IGNkID0gYXdhaXQgdmlzaXRBc3luY18obnVsbCwgbm9kZS5jb250ZW50cywgdmlzaXRvcl8sIE9iamVjdC5mcmVlemUoW25vZGVdKSk7XG4gICAgICAgIGlmIChjZCA9PT0gUkVNT1ZFKVxuICAgICAgICAgICAgbm9kZS5jb250ZW50cyA9IG51bGw7XG4gICAgfVxuICAgIGVsc2VcbiAgICAgICAgYXdhaXQgdmlzaXRBc3luY18obnVsbCwgbm9kZSwgdmlzaXRvcl8sIE9iamVjdC5mcmVlemUoW10pKTtcbn1cbi8vIFdpdGhvdXQgdGhlIGBhcyBzeW1ib2xgIGNhc3RzLCBUUyBkZWNsYXJlcyB0aGVzZSBpbiB0aGUgYHZpc2l0YFxuLy8gbmFtZXNwYWNlIHVzaW5nIGB2YXJgLCBidXQgdGhlbiBjb21wbGFpbnMgYWJvdXQgdGhhdCBiZWNhdXNlXG4vLyBgdW5pcXVlIHN5bWJvbGAgbXVzdCBiZSBgY29uc3RgLlxuLyoqIFRlcm1pbmF0ZSB2aXNpdCB0cmF2ZXJzYWwgY29tcGxldGVseSAqL1xudmlzaXRBc3luYy5CUkVBSyA9IEJSRUFLO1xuLyoqIERvIG5vdCB2aXNpdCB0aGUgY2hpbGRyZW4gb2YgdGhlIGN1cnJlbnQgbm9kZSAqL1xudmlzaXRBc3luYy5TS0lQID0gU0tJUDtcbi8qKiBSZW1vdmUgdGhlIGN1cnJlbnQgbm9kZSAqL1xudmlzaXRBc3luYy5SRU1PVkUgPSBSRU1PVkU7XG5hc3luYyBmdW5jdGlvbiB2aXNpdEFzeW5jXyhrZXksIG5vZGUsIHZpc2l0b3IsIHBhdGgpIHtcbiAgICBjb25zdCBjdHJsID0gYXdhaXQgY2FsbFZpc2l0b3Ioa2V5LCBub2RlLCB2aXNpdG9yLCBwYXRoKTtcbiAgICBpZiAoaXNOb2RlKGN0cmwpIHx8IGlzUGFpcihjdHJsKSkge1xuICAgICAgICByZXBsYWNlTm9kZShrZXksIHBhdGgsIGN0cmwpO1xuICAgICAgICByZXR1cm4gdmlzaXRBc3luY18oa2V5LCBjdHJsLCB2aXNpdG9yLCBwYXRoKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjdHJsICE9PSAnc3ltYm9sJykge1xuICAgICAgICBpZiAoaXNDb2xsZWN0aW9uKG5vZGUpKSB7XG4gICAgICAgICAgICBwYXRoID0gT2JqZWN0LmZyZWV6ZShwYXRoLmNvbmNhdChub2RlKSk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUuaXRlbXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjaSA9IGF3YWl0IHZpc2l0QXN5bmNfKGksIG5vZGUuaXRlbXNbaV0sIHZpc2l0b3IsIHBhdGgpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY2kgPT09ICdudW1iZXInKVxuICAgICAgICAgICAgICAgICAgICBpID0gY2kgLSAxO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNpID09PSBCUkVBSylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJSRUFLO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNpID09PSBSRU1PVkUpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5pdGVtcy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgICAgIGkgLT0gMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNQYWlyKG5vZGUpKSB7XG4gICAgICAgICAgICBwYXRoID0gT2JqZWN0LmZyZWV6ZShwYXRoLmNvbmNhdChub2RlKSk7XG4gICAgICAgICAgICBjb25zdCBjayA9IGF3YWl0IHZpc2l0QXN5bmNfKCdrZXknLCBub2RlLmtleSwgdmlzaXRvciwgcGF0aCk7XG4gICAgICAgICAgICBpZiAoY2sgPT09IEJSRUFLKVxuICAgICAgICAgICAgICAgIHJldHVybiBCUkVBSztcbiAgICAgICAgICAgIGVsc2UgaWYgKGNrID09PSBSRU1PVkUpXG4gICAgICAgICAgICAgICAgbm9kZS5rZXkgPSBudWxsO1xuICAgICAgICAgICAgY29uc3QgY3YgPSBhd2FpdCB2aXNpdEFzeW5jXygndmFsdWUnLCBub2RlLnZhbHVlLCB2aXNpdG9yLCBwYXRoKTtcbiAgICAgICAgICAgIGlmIChjdiA9PT0gQlJFQUspXG4gICAgICAgICAgICAgICAgcmV0dXJuIEJSRUFLO1xuICAgICAgICAgICAgZWxzZSBpZiAoY3YgPT09IFJFTU9WRSlcbiAgICAgICAgICAgICAgICBub2RlLnZhbHVlID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY3RybDtcbn1cbmZ1bmN0aW9uIGluaXRWaXNpdG9yKHZpc2l0b3IpIHtcbiAgICBpZiAodHlwZW9mIHZpc2l0b3IgPT09ICdvYmplY3QnICYmXG4gICAgICAgICh2aXNpdG9yLkNvbGxlY3Rpb24gfHwgdmlzaXRvci5Ob2RlIHx8IHZpc2l0b3IuVmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgIEFsaWFzOiB2aXNpdG9yLk5vZGUsXG4gICAgICAgICAgICBNYXA6IHZpc2l0b3IuTm9kZSxcbiAgICAgICAgICAgIFNjYWxhcjogdmlzaXRvci5Ob2RlLFxuICAgICAgICAgICAgU2VxOiB2aXNpdG9yLk5vZGVcbiAgICAgICAgfSwgdmlzaXRvci5WYWx1ZSAmJiB7XG4gICAgICAgICAgICBNYXA6IHZpc2l0b3IuVmFsdWUsXG4gICAgICAgICAgICBTY2FsYXI6IHZpc2l0b3IuVmFsdWUsXG4gICAgICAgICAgICBTZXE6IHZpc2l0b3IuVmFsdWVcbiAgICAgICAgfSwgdmlzaXRvci5Db2xsZWN0aW9uICYmIHtcbiAgICAgICAgICAgIE1hcDogdmlzaXRvci5Db2xsZWN0aW9uLFxuICAgICAgICAgICAgU2VxOiB2aXNpdG9yLkNvbGxlY3Rpb25cbiAgICAgICAgfSwgdmlzaXRvcik7XG4gICAgfVxuICAgIHJldHVybiB2aXNpdG9yO1xufVxuZnVuY3Rpb24gY2FsbFZpc2l0b3Ioa2V5LCBub2RlLCB2aXNpdG9yLCBwYXRoKSB7XG4gICAgaWYgKHR5cGVvZiB2aXNpdG9yID09PSAnZnVuY3Rpb24nKVxuICAgICAgICByZXR1cm4gdmlzaXRvcihrZXksIG5vZGUsIHBhdGgpO1xuICAgIGlmIChpc01hcChub2RlKSlcbiAgICAgICAgcmV0dXJuIHZpc2l0b3IuTWFwPy4oa2V5LCBub2RlLCBwYXRoKTtcbiAgICBpZiAoaXNTZXEobm9kZSkpXG4gICAgICAgIHJldHVybiB2aXNpdG9yLlNlcT8uKGtleSwgbm9kZSwgcGF0aCk7XG4gICAgaWYgKGlzUGFpcihub2RlKSlcbiAgICAgICAgcmV0dXJuIHZpc2l0b3IuUGFpcj8uKGtleSwgbm9kZSwgcGF0aCk7XG4gICAgaWYgKGlzU2NhbGFyKG5vZGUpKVxuICAgICAgICByZXR1cm4gdmlzaXRvci5TY2FsYXI/LihrZXksIG5vZGUsIHBhdGgpO1xuICAgIGlmIChpc0FsaWFzKG5vZGUpKVxuICAgICAgICByZXR1cm4gdmlzaXRvci5BbGlhcz8uKGtleSwgbm9kZSwgcGF0aCk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbmZ1bmN0aW9uIHJlcGxhY2VOb2RlKGtleSwgcGF0aCwgbm9kZSkge1xuICAgIGNvbnN0IHBhcmVudCA9IHBhdGhbcGF0aC5sZW5ndGggLSAxXTtcbiAgICBpZiAoaXNDb2xsZWN0aW9uKHBhcmVudCkpIHtcbiAgICAgICAgcGFyZW50Lml0ZW1zW2tleV0gPSBub2RlO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc1BhaXIocGFyZW50KSkge1xuICAgICAgICBpZiAoa2V5ID09PSAna2V5JylcbiAgICAgICAgICAgIHBhcmVudC5rZXkgPSBub2RlO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBwYXJlbnQudmFsdWUgPSBub2RlO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc0RvY3VtZW50KHBhcmVudCkpIHtcbiAgICAgICAgcGFyZW50LmNvbnRlbnRzID0gbm9kZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IHB0ID0gaXNBbGlhcyhwYXJlbnQpID8gJ2FsaWFzJyA6ICdzY2FsYXInO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCByZXBsYWNlIG5vZGUgd2l0aCAke3B0fSBwYXJlbnRgKTtcbiAgICB9XG59XG5cbmV4cG9ydCB7IHZpc2l0LCB2aXNpdEFzeW5jIH07XG4iLCJpbXBvcnQgeyBpc05vZGUgfSBmcm9tICcuLi9ub2Rlcy9pZGVudGl0eS5qcyc7XG5pbXBvcnQgeyB2aXNpdCB9IGZyb20gJy4uL3Zpc2l0LmpzJztcblxuY29uc3QgZXNjYXBlQ2hhcnMgPSB7XG4gICAgJyEnOiAnJTIxJyxcbiAgICAnLCc6ICclMkMnLFxuICAgICdbJzogJyU1QicsXG4gICAgJ10nOiAnJTVEJyxcbiAgICAneyc6ICclN0InLFxuICAgICd9JzogJyU3RCdcbn07XG5jb25zdCBlc2NhcGVUYWdOYW1lID0gKHRuKSA9PiB0bi5yZXBsYWNlKC9bISxbXFxde31dL2csIGNoID0+IGVzY2FwZUNoYXJzW2NoXSk7XG5jbGFzcyBEaXJlY3RpdmVzIHtcbiAgICBjb25zdHJ1Y3Rvcih5YW1sLCB0YWdzKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgZGlyZWN0aXZlcy1lbmQvZG9jLXN0YXJ0IG1hcmtlciBgLS0tYC4gSWYgYG51bGxgLCBhIG1hcmtlciBtYXkgc3RpbGwgYmVcbiAgICAgICAgICogaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50J3Mgc3RyaW5naWZpZWQgcmVwcmVzZW50YXRpb24uXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmRvY1N0YXJ0ID0gbnVsbDtcbiAgICAgICAgLyoqIFRoZSBkb2MtZW5kIG1hcmtlciBgLi4uYC4gICovXG4gICAgICAgIHRoaXMuZG9jRW5kID0gZmFsc2U7XG4gICAgICAgIHRoaXMueWFtbCA9IE9iamVjdC5hc3NpZ24oe30sIERpcmVjdGl2ZXMuZGVmYXVsdFlhbWwsIHlhbWwpO1xuICAgICAgICB0aGlzLnRhZ3MgPSBPYmplY3QuYXNzaWduKHt9LCBEaXJlY3RpdmVzLmRlZmF1bHRUYWdzLCB0YWdzKTtcbiAgICB9XG4gICAgY2xvbmUoKSB7XG4gICAgICAgIGNvbnN0IGNvcHkgPSBuZXcgRGlyZWN0aXZlcyh0aGlzLnlhbWwsIHRoaXMudGFncyk7XG4gICAgICAgIGNvcHkuZG9jU3RhcnQgPSB0aGlzLmRvY1N0YXJ0O1xuICAgICAgICByZXR1cm4gY29weTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRHVyaW5nIHBhcnNpbmcsIGdldCBhIERpcmVjdGl2ZXMgaW5zdGFuY2UgZm9yIHRoZSBjdXJyZW50IGRvY3VtZW50IGFuZFxuICAgICAqIHVwZGF0ZSB0aGUgc3RyZWFtIHN0YXRlIGFjY29yZGluZyB0byB0aGUgY3VycmVudCB2ZXJzaW9uJ3Mgc3BlYy5cbiAgICAgKi9cbiAgICBhdERvY3VtZW50KCkge1xuICAgICAgICBjb25zdCByZXMgPSBuZXcgRGlyZWN0aXZlcyh0aGlzLnlhbWwsIHRoaXMudGFncyk7XG4gICAgICAgIHN3aXRjaCAodGhpcy55YW1sLnZlcnNpb24pIHtcbiAgICAgICAgICAgIGNhc2UgJzEuMSc6XG4gICAgICAgICAgICAgICAgdGhpcy5hdE5leHREb2N1bWVudCA9IHRydWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICcxLjInOlxuICAgICAgICAgICAgICAgIHRoaXMuYXROZXh0RG9jdW1lbnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLnlhbWwgPSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGxpY2l0OiBEaXJlY3RpdmVzLmRlZmF1bHRZYW1sLmV4cGxpY2l0LFxuICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOiAnMS4yJ1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdGhpcy50YWdzID0gT2JqZWN0LmFzc2lnbih7fSwgRGlyZWN0aXZlcy5kZWZhdWx0VGFncyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIG9uRXJyb3IgLSBNYXkgYmUgY2FsbGVkIGV2ZW4gaWYgdGhlIGFjdGlvbiB3YXMgc3VjY2Vzc2Z1bFxuICAgICAqIEByZXR1cm5zIGB0cnVlYCBvbiBzdWNjZXNzXG4gICAgICovXG4gICAgYWRkKGxpbmUsIG9uRXJyb3IpIHtcbiAgICAgICAgaWYgKHRoaXMuYXROZXh0RG9jdW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMueWFtbCA9IHsgZXhwbGljaXQ6IERpcmVjdGl2ZXMuZGVmYXVsdFlhbWwuZXhwbGljaXQsIHZlcnNpb246ICcxLjEnIH07XG4gICAgICAgICAgICB0aGlzLnRhZ3MgPSBPYmplY3QuYXNzaWduKHt9LCBEaXJlY3RpdmVzLmRlZmF1bHRUYWdzKTtcbiAgICAgICAgICAgIHRoaXMuYXROZXh0RG9jdW1lbnQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXJ0cyA9IGxpbmUudHJpbSgpLnNwbGl0KC9bIFxcdF0rLyk7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBwYXJ0cy5zaGlmdCgpO1xuICAgICAgICBzd2l0Y2ggKG5hbWUpIHtcbiAgICAgICAgICAgIGNhc2UgJyVUQUcnOiB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCAhPT0gMikge1xuICAgICAgICAgICAgICAgICAgICBvbkVycm9yKDAsICclVEFHIGRpcmVjdGl2ZSBzaG91bGQgY29udGFpbiBleGFjdGx5IHR3byBwYXJ0cycpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoIDwgMilcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgW2hhbmRsZSwgcHJlZml4XSA9IHBhcnRzO1xuICAgICAgICAgICAgICAgIHRoaXMudGFnc1toYW5kbGVdID0gcHJlZml4O1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnJVlBTUwnOiB7XG4gICAgICAgICAgICAgICAgdGhpcy55YW1sLmV4cGxpY2l0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIG9uRXJyb3IoMCwgJyVZQU1MIGRpcmVjdGl2ZSBzaG91bGQgY29udGFpbiBleGFjdGx5IG9uZSBwYXJ0Jyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgW3ZlcnNpb25dID0gcGFydHM7XG4gICAgICAgICAgICAgICAgaWYgKHZlcnNpb24gPT09ICcxLjEnIHx8IHZlcnNpb24gPT09ICcxLjInKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMueWFtbC52ZXJzaW9uID0gdmVyc2lvbjtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpc1ZhbGlkID0gL15cXGQrXFwuXFxkKyQvLnRlc3QodmVyc2lvbik7XG4gICAgICAgICAgICAgICAgICAgIG9uRXJyb3IoNiwgYFVuc3VwcG9ydGVkIFlBTUwgdmVyc2lvbiAke3ZlcnNpb259YCwgaXNWYWxpZCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIG9uRXJyb3IoMCwgYFVua25vd24gZGlyZWN0aXZlICR7bmFtZX1gLCB0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVzb2x2ZXMgYSB0YWcsIG1hdGNoaW5nIGhhbmRsZXMgdG8gdGhvc2UgZGVmaW5lZCBpbiAlVEFHIGRpcmVjdGl2ZXMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBSZXNvbHZlZCB0YWcsIHdoaWNoIG1heSBhbHNvIGJlIHRoZSBub24tc3BlY2lmaWMgdGFnIGAnISdgIG9yIGFcbiAgICAgKiAgIGAnIWxvY2FsJ2AgdGFnLCBvciBgbnVsbGAgaWYgdW5yZXNvbHZhYmxlLlxuICAgICAqL1xuICAgIHRhZ05hbWUoc291cmNlLCBvbkVycm9yKSB7XG4gICAgICAgIGlmIChzb3VyY2UgPT09ICchJylcbiAgICAgICAgICAgIHJldHVybiAnISc7IC8vIG5vbi1zcGVjaWZpYyB0YWdcbiAgICAgICAgaWYgKHNvdXJjZVswXSAhPT0gJyEnKSB7XG4gICAgICAgICAgICBvbkVycm9yKGBOb3QgYSB2YWxpZCB0YWc6ICR7c291cmNlfWApO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNvdXJjZVsxXSA9PT0gJzwnKSB7XG4gICAgICAgICAgICBjb25zdCB2ZXJiYXRpbSA9IHNvdXJjZS5zbGljZSgyLCAtMSk7XG4gICAgICAgICAgICBpZiAodmVyYmF0aW0gPT09ICchJyB8fCB2ZXJiYXRpbSA9PT0gJyEhJykge1xuICAgICAgICAgICAgICAgIG9uRXJyb3IoYFZlcmJhdGltIHRhZ3MgYXJlbid0IHJlc29sdmVkLCBzbyAke3NvdXJjZX0gaXMgaW52YWxpZC5gKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzb3VyY2Vbc291cmNlLmxlbmd0aCAtIDFdICE9PSAnPicpXG4gICAgICAgICAgICAgICAgb25FcnJvcignVmVyYmF0aW0gdGFncyBtdXN0IGVuZCB3aXRoIGEgPicpO1xuICAgICAgICAgICAgcmV0dXJuIHZlcmJhdGltO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IFssIGhhbmRsZSwgc3VmZml4XSA9IHNvdXJjZS5tYXRjaCgvXiguKiEpKFteIV0qKSQvcyk7XG4gICAgICAgIGlmICghc3VmZml4KVxuICAgICAgICAgICAgb25FcnJvcihgVGhlICR7c291cmNlfSB0YWcgaGFzIG5vIHN1ZmZpeGApO1xuICAgICAgICBjb25zdCBwcmVmaXggPSB0aGlzLnRhZ3NbaGFuZGxlXTtcbiAgICAgICAgaWYgKHByZWZpeCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4ICsgZGVjb2RlVVJJQ29tcG9uZW50KHN1ZmZpeCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBvbkVycm9yKFN0cmluZyhlcnJvcikpO1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChoYW5kbGUgPT09ICchJylcbiAgICAgICAgICAgIHJldHVybiBzb3VyY2U7IC8vIGxvY2FsIHRhZ1xuICAgICAgICBvbkVycm9yKGBDb3VsZCBub3QgcmVzb2x2ZSB0YWc6ICR7c291cmNlfWApO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2l2ZW4gYSBmdWxseSByZXNvbHZlZCB0YWcsIHJldHVybnMgaXRzIHByaW50YWJsZSBzdHJpbmcgZm9ybSxcbiAgICAgKiB0YWtpbmcgaW50byBhY2NvdW50IGN1cnJlbnQgdGFnIHByZWZpeGVzIGFuZCBkZWZhdWx0cy5cbiAgICAgKi9cbiAgICB0YWdTdHJpbmcodGFnKSB7XG4gICAgICAgIGZvciAoY29uc3QgW2hhbmRsZSwgcHJlZml4XSBvZiBPYmplY3QuZW50cmllcyh0aGlzLnRhZ3MpKSB7XG4gICAgICAgICAgICBpZiAodGFnLnN0YXJ0c1dpdGgocHJlZml4KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlICsgZXNjYXBlVGFnTmFtZSh0YWcuc3Vic3RyaW5nKHByZWZpeC5sZW5ndGgpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGFnWzBdID09PSAnIScgPyB0YWcgOiBgITwke3RhZ30+YDtcbiAgICB9XG4gICAgdG9TdHJpbmcoZG9jKSB7XG4gICAgICAgIGNvbnN0IGxpbmVzID0gdGhpcy55YW1sLmV4cGxpY2l0XG4gICAgICAgICAgICA/IFtgJVlBTUwgJHt0aGlzLnlhbWwudmVyc2lvbiB8fCAnMS4yJ31gXVxuICAgICAgICAgICAgOiBbXTtcbiAgICAgICAgY29uc3QgdGFnRW50cmllcyA9IE9iamVjdC5lbnRyaWVzKHRoaXMudGFncyk7XG4gICAgICAgIGxldCB0YWdOYW1lcztcbiAgICAgICAgaWYgKGRvYyAmJiB0YWdFbnRyaWVzLmxlbmd0aCA+IDAgJiYgaXNOb2RlKGRvYy5jb250ZW50cykpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZ3MgPSB7fTtcbiAgICAgICAgICAgIHZpc2l0KGRvYy5jb250ZW50cywgKF9rZXksIG5vZGUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaXNOb2RlKG5vZGUpICYmIG5vZGUudGFnKVxuICAgICAgICAgICAgICAgICAgICB0YWdzW25vZGUudGFnXSA9IHRydWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRhZ05hbWVzID0gT2JqZWN0LmtleXModGFncyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGFnTmFtZXMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBbaGFuZGxlLCBwcmVmaXhdIG9mIHRhZ0VudHJpZXMpIHtcbiAgICAgICAgICAgIGlmIChoYW5kbGUgPT09ICchIScgJiYgcHJlZml4ID09PSAndGFnOnlhbWwub3JnLDIwMDI6JylcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICghZG9jIHx8IHRhZ05hbWVzLnNvbWUodG4gPT4gdG4uc3RhcnRzV2l0aChwcmVmaXgpKSlcbiAgICAgICAgICAgICAgICBsaW5lcy5wdXNoKGAlVEFHICR7aGFuZGxlfSAke3ByZWZpeH1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG4gICAgfVxufVxuRGlyZWN0aXZlcy5kZWZhdWx0WWFtbCA9IHsgZXhwbGljaXQ6IGZhbHNlLCB2ZXJzaW9uOiAnMS4yJyB9O1xuRGlyZWN0aXZlcy5kZWZhdWx0VGFncyA9IHsgJyEhJzogJ3RhZzp5YW1sLm9yZywyMDAyOicgfTtcblxuZXhwb3J0IHsgRGlyZWN0aXZlcyB9O1xuIiwiaW1wb3J0IHsgaXNTY2FsYXIsIGlzQ29sbGVjdGlvbiB9IGZyb20gJy4uL25vZGVzL2lkZW50aXR5LmpzJztcbmltcG9ydCB7IHZpc2l0IH0gZnJvbSAnLi4vdmlzaXQuanMnO1xuXG4vKipcbiAqIFZlcmlmeSB0aGF0IHRoZSBpbnB1dCBzdHJpbmcgaXMgYSB2YWxpZCBhbmNob3IuXG4gKlxuICogV2lsbCB0aHJvdyBvbiBlcnJvcnMuXG4gKi9cbmZ1bmN0aW9uIGFuY2hvcklzVmFsaWQoYW5jaG9yKSB7XG4gICAgaWYgKC9bXFx4MDAtXFx4MTlcXHMsW1xcXXt9XS8udGVzdChhbmNob3IpKSB7XG4gICAgICAgIGNvbnN0IHNhID0gSlNPTi5zdHJpbmdpZnkoYW5jaG9yKTtcbiAgICAgICAgY29uc3QgbXNnID0gYEFuY2hvciBtdXN0IG5vdCBjb250YWluIHdoaXRlc3BhY2Ugb3IgY29udHJvbCBjaGFyYWN0ZXJzOiAke3NhfWA7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIGFuY2hvck5hbWVzKHJvb3QpIHtcbiAgICBjb25zdCBhbmNob3JzID0gbmV3IFNldCgpO1xuICAgIHZpc2l0KHJvb3QsIHtcbiAgICAgICAgVmFsdWUoX2tleSwgbm9kZSkge1xuICAgICAgICAgICAgaWYgKG5vZGUuYW5jaG9yKVxuICAgICAgICAgICAgICAgIGFuY2hvcnMuYWRkKG5vZGUuYW5jaG9yKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBhbmNob3JzO1xufVxuLyoqIEZpbmQgYSBuZXcgYW5jaG9yIG5hbWUgd2l0aCB0aGUgZ2l2ZW4gYHByZWZpeGAgYW5kIGEgb25lLWluZGV4ZWQgc3VmZml4LiAqL1xuZnVuY3Rpb24gZmluZE5ld0FuY2hvcihwcmVmaXgsIGV4Y2x1ZGUpIHtcbiAgICBmb3IgKGxldCBpID0gMTsgdHJ1ZTsgKytpKSB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBgJHtwcmVmaXh9JHtpfWA7XG4gICAgICAgIGlmICghZXhjbHVkZS5oYXMobmFtZSkpXG4gICAgICAgICAgICByZXR1cm4gbmFtZTtcbiAgICB9XG59XG5mdW5jdGlvbiBjcmVhdGVOb2RlQW5jaG9ycyhkb2MsIHByZWZpeCkge1xuICAgIGNvbnN0IGFsaWFzT2JqZWN0cyA9IFtdO1xuICAgIGNvbnN0IHNvdXJjZU9iamVjdHMgPSBuZXcgTWFwKCk7XG4gICAgbGV0IHByZXZBbmNob3JzID0gbnVsbDtcbiAgICByZXR1cm4ge1xuICAgICAgICBvbkFuY2hvcjogKHNvdXJjZSkgPT4ge1xuICAgICAgICAgICAgYWxpYXNPYmplY3RzLnB1c2goc291cmNlKTtcbiAgICAgICAgICAgIHByZXZBbmNob3JzID8/IChwcmV2QW5jaG9ycyA9IGFuY2hvck5hbWVzKGRvYykpO1xuICAgICAgICAgICAgY29uc3QgYW5jaG9yID0gZmluZE5ld0FuY2hvcihwcmVmaXgsIHByZXZBbmNob3JzKTtcbiAgICAgICAgICAgIHByZXZBbmNob3JzLmFkZChhbmNob3IpO1xuICAgICAgICAgICAgcmV0dXJuIGFuY2hvcjtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFdpdGggY2lyY3VsYXIgcmVmZXJlbmNlcywgdGhlIHNvdXJjZSBub2RlIGlzIG9ubHkgcmVzb2x2ZWQgYWZ0ZXIgYWxsXG4gICAgICAgICAqIG9mIGl0cyBjaGlsZCBub2RlcyBhcmUuIFRoaXMgaXMgd2h5IGFuY2hvcnMgYXJlIHNldCBvbmx5IGFmdGVyIGFsbCBvZlxuICAgICAgICAgKiB0aGUgbm9kZXMgaGF2ZSBiZWVuIGNyZWF0ZWQuXG4gICAgICAgICAqL1xuICAgICAgICBzZXRBbmNob3JzOiAoKSA9PiB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHNvdXJjZSBvZiBhbGlhc09iamVjdHMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWYgPSBzb3VyY2VPYmplY3RzLmdldChzb3VyY2UpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVmID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgICAgICAgICByZWYuYW5jaG9yICYmXG4gICAgICAgICAgICAgICAgICAgIChpc1NjYWxhcihyZWYubm9kZSkgfHwgaXNDb2xsZWN0aW9uKHJlZi5ub2RlKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVmLm5vZGUuYW5jaG9yID0gcmVmLmFuY2hvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCdGYWlsZWQgdG8gcmVzb2x2ZSByZXBlYXRlZCBvYmplY3QgKHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4pJyk7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yLnNvdXJjZSA9IHNvdXJjZTtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBzb3VyY2VPYmplY3RzXG4gICAgfTtcbn1cblxuZXhwb3J0IHsgYW5jaG9ySXNWYWxpZCwgYW5jaG9yTmFtZXMsIGNyZWF0ZU5vZGVBbmNob3JzLCBmaW5kTmV3QW5jaG9yIH07XG4iLCIvKipcbiAqIEFwcGxpZXMgdGhlIEpTT04ucGFyc2UgcmV2aXZlciBhbGdvcml0aG0gYXMgZGVmaW5lZCBpbiB0aGUgRUNNQS0yNjIgc3BlYyxcbiAqIGluIHNlY3Rpb24gMjQuNS4xLjEgXCJSdW50aW1lIFNlbWFudGljczogSW50ZXJuYWxpemVKU09OUHJvcGVydHlcIiBvZiB0aGVcbiAqIDIwMjEgZWRpdGlvbjogaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1qc29uLnBhcnNlXG4gKlxuICogSW5jbHVkZXMgZXh0ZW5zaW9ucyBmb3IgaGFuZGxpbmcgTWFwIGFuZCBTZXQgb2JqZWN0cy5cbiAqL1xuZnVuY3Rpb24gYXBwbHlSZXZpdmVyKHJldml2ZXIsIG9iaiwga2V5LCB2YWwpIHtcbiAgICBpZiAodmFsICYmIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB2YWwubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2MCA9IHZhbFtpXTtcbiAgICAgICAgICAgICAgICBjb25zdCB2MSA9IGFwcGx5UmV2aXZlcihyZXZpdmVyLCB2YWwsIFN0cmluZyhpKSwgdjApO1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tYXJyYXktZGVsZXRlXG4gICAgICAgICAgICAgICAgaWYgKHYxID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB2YWxbaV07XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodjEgIT09IHYwKVxuICAgICAgICAgICAgICAgICAgICB2YWxbaV0gPSB2MTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh2YWwgaW5zdGFuY2VvZiBNYXApIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgayBvZiBBcnJheS5mcm9tKHZhbC5rZXlzKCkpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdjAgPSB2YWwuZ2V0KGspO1xuICAgICAgICAgICAgICAgIGNvbnN0IHYxID0gYXBwbHlSZXZpdmVyKHJldml2ZXIsIHZhbCwgaywgdjApO1xuICAgICAgICAgICAgICAgIGlmICh2MSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICB2YWwuZGVsZXRlKGspO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHYxICE9PSB2MClcbiAgICAgICAgICAgICAgICAgICAgdmFsLnNldChrLCB2MSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodmFsIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHYwIG9mIEFycmF5LmZyb20odmFsKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHYxID0gYXBwbHlSZXZpdmVyKHJldml2ZXIsIHZhbCwgdjAsIHYwKTtcbiAgICAgICAgICAgICAgICBpZiAodjEgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgdmFsLmRlbGV0ZSh2MCk7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodjEgIT09IHYwKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbC5kZWxldGUodjApO1xuICAgICAgICAgICAgICAgICAgICB2YWwuYWRkKHYxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtrLCB2MF0gb2YgT2JqZWN0LmVudHJpZXModmFsKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHYxID0gYXBwbHlSZXZpdmVyKHJldml2ZXIsIHZhbCwgaywgdjApO1xuICAgICAgICAgICAgICAgIGlmICh2MSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgdmFsW2tdO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHYxICE9PSB2MClcbiAgICAgICAgICAgICAgICAgICAgdmFsW2tdID0gdjE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldml2ZXIuY2FsbChvYmosIGtleSwgdmFsKTtcbn1cblxuZXhwb3J0IHsgYXBwbHlSZXZpdmVyIH07XG4iLCJpbXBvcnQgeyBoYXNBbmNob3IgfSBmcm9tICcuL2lkZW50aXR5LmpzJztcblxuLyoqXG4gKiBSZWN1cnNpdmVseSBjb252ZXJ0IGFueSBub2RlIG9yIGl0cyBjb250ZW50cyB0byBuYXRpdmUgSmF2YVNjcmlwdFxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBpbnB1dCB2YWx1ZVxuICogQHBhcmFtIGFyZyAtIElmIGB2YWx1ZWAgZGVmaW5lcyBhIGB0b0pTT04oKWAgbWV0aG9kLCB1c2UgdGhpc1xuICogICBhcyBpdHMgZmlyc3QgYXJndW1lbnRcbiAqIEBwYXJhbSBjdHggLSBDb252ZXJzaW9uIGNvbnRleHQsIG9yaWdpbmFsbHkgc2V0IGluIERvY3VtZW50I3RvSlMoKS4gSWZcbiAqICAgYHsga2VlcDogdHJ1ZSB9YCBpcyBub3Qgc2V0LCBvdXRwdXQgc2hvdWxkIGJlIHN1aXRhYmxlIGZvciBKU09OXG4gKiAgIHN0cmluZ2lmaWNhdGlvbi5cbiAqL1xuZnVuY3Rpb24gdG9KUyh2YWx1ZSwgYXJnLCBjdHgpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1yZXR1cm5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpXG4gICAgICAgIHJldHVybiB2YWx1ZS5tYXAoKHYsIGkpID0+IHRvSlModiwgU3RyaW5nKGkpLCBjdHgpKTtcbiAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlLnRvSlNPTiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1jYWxsXG4gICAgICAgIGlmICghY3R4IHx8ICFoYXNBbmNob3IodmFsdWUpKVxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnRvSlNPTihhcmcsIGN0eCk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB7IGFsaWFzQ291bnQ6IDAsIGNvdW50OiAxLCByZXM6IHVuZGVmaW5lZCB9O1xuICAgICAgICBjdHguYW5jaG9ycy5zZXQodmFsdWUsIGRhdGEpO1xuICAgICAgICBjdHgub25DcmVhdGUgPSByZXMgPT4ge1xuICAgICAgICAgICAgZGF0YS5yZXMgPSByZXM7XG4gICAgICAgICAgICBkZWxldGUgY3R4Lm9uQ3JlYXRlO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCByZXMgPSB2YWx1ZS50b0pTT04oYXJnLCBjdHgpO1xuICAgICAgICBpZiAoY3R4Lm9uQ3JlYXRlKVxuICAgICAgICAgICAgY3R4Lm9uQ3JlYXRlKHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdiaWdpbnQnICYmICFjdHg/LmtlZXApXG4gICAgICAgIHJldHVybiBOdW1iZXIodmFsdWUpO1xuICAgIHJldHVybiB2YWx1ZTtcbn1cblxuZXhwb3J0IHsgdG9KUyB9O1xuIiwiaW1wb3J0IHsgYXBwbHlSZXZpdmVyIH0gZnJvbSAnLi4vZG9jL2FwcGx5UmV2aXZlci5qcyc7XG5pbXBvcnQgeyBOT0RFX1RZUEUsIGlzRG9jdW1lbnQgfSBmcm9tICcuL2lkZW50aXR5LmpzJztcbmltcG9ydCB7IHRvSlMgfSBmcm9tICcuL3RvSlMuanMnO1xuXG5jbGFzcyBOb2RlQmFzZSB7XG4gICAgY29uc3RydWN0b3IodHlwZSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgTk9ERV9UWVBFLCB7IHZhbHVlOiB0eXBlIH0pO1xuICAgIH1cbiAgICAvKiogQ3JlYXRlIGEgY29weSBvZiB0aGlzIG5vZGUuICAqL1xuICAgIGNsb25lKCkge1xuICAgICAgICBjb25zdCBjb3B5ID0gT2JqZWN0LmNyZWF0ZShPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcyksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHRoaXMpKTtcbiAgICAgICAgaWYgKHRoaXMucmFuZ2UpXG4gICAgICAgICAgICBjb3B5LnJhbmdlID0gdGhpcy5yYW5nZS5zbGljZSgpO1xuICAgICAgICByZXR1cm4gY29weTtcbiAgICB9XG4gICAgLyoqIEEgcGxhaW4gSmF2YVNjcmlwdCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG5vZGUuICovXG4gICAgdG9KUyhkb2MsIHsgbWFwQXNNYXAsIG1heEFsaWFzQ291bnQsIG9uQW5jaG9yLCByZXZpdmVyIH0gPSB7fSkge1xuICAgICAgICBpZiAoIWlzRG9jdW1lbnQoZG9jKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0EgZG9jdW1lbnQgYXJndW1lbnQgaXMgcmVxdWlyZWQnKTtcbiAgICAgICAgY29uc3QgY3R4ID0ge1xuICAgICAgICAgICAgYW5jaG9yczogbmV3IE1hcCgpLFxuICAgICAgICAgICAgZG9jLFxuICAgICAgICAgICAga2VlcDogdHJ1ZSxcbiAgICAgICAgICAgIG1hcEFzTWFwOiBtYXBBc01hcCA9PT0gdHJ1ZSxcbiAgICAgICAgICAgIG1hcEtleVdhcm5lZDogZmFsc2UsXG4gICAgICAgICAgICBtYXhBbGlhc0NvdW50OiB0eXBlb2YgbWF4QWxpYXNDb3VudCA9PT0gJ251bWJlcicgPyBtYXhBbGlhc0NvdW50IDogMTAwXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlcyA9IHRvSlModGhpcywgJycsIGN0eCk7XG4gICAgICAgIGlmICh0eXBlb2Ygb25BbmNob3IgPT09ICdmdW5jdGlvbicpXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHsgY291bnQsIHJlcyB9IG9mIGN0eC5hbmNob3JzLnZhbHVlcygpKVxuICAgICAgICAgICAgICAgIG9uQW5jaG9yKHJlcywgY291bnQpO1xuICAgICAgICByZXR1cm4gdHlwZW9mIHJldml2ZXIgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgID8gYXBwbHlSZXZpdmVyKHJldml2ZXIsIHsgJyc6IHJlcyB9LCAnJywgcmVzKVxuICAgICAgICAgICAgOiByZXM7XG4gICAgfVxufVxuXG5leHBvcnQgeyBOb2RlQmFzZSB9O1xuIiwiaW1wb3J0IHsgYW5jaG9ySXNWYWxpZCB9IGZyb20gJy4uL2RvYy9hbmNob3JzLmpzJztcbmltcG9ydCB7IHZpc2l0IH0gZnJvbSAnLi4vdmlzaXQuanMnO1xuaW1wb3J0IHsgQUxJQVMsIGlzQWxpYXMsIGlzQ29sbGVjdGlvbiwgaXNQYWlyLCBoYXNBbmNob3IgfSBmcm9tICcuL2lkZW50aXR5LmpzJztcbmltcG9ydCB7IE5vZGVCYXNlIH0gZnJvbSAnLi9Ob2RlLmpzJztcbmltcG9ydCB7IHRvSlMgfSBmcm9tICcuL3RvSlMuanMnO1xuXG5jbGFzcyBBbGlhcyBleHRlbmRzIE5vZGVCYXNlIHtcbiAgICBjb25zdHJ1Y3Rvcihzb3VyY2UpIHtcbiAgICAgICAgc3VwZXIoQUxJQVMpO1xuICAgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICd0YWcnLCB7XG4gICAgICAgICAgICBzZXQoKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBbGlhcyBub2RlcyBjYW5ub3QgaGF2ZSB0YWdzJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXNvbHZlIHRoZSB2YWx1ZSBvZiB0aGlzIGFsaWFzIHdpdGhpbiBgZG9jYCwgZmluZGluZyB0aGUgbGFzdFxuICAgICAqIGluc3RhbmNlIG9mIHRoZSBgc291cmNlYCBhbmNob3IgYmVmb3JlIHRoaXMgbm9kZS5cbiAgICAgKi9cbiAgICByZXNvbHZlKGRvYywgY3R4KSB7XG4gICAgICAgIGlmIChjdHg/Lm1heEFsaWFzQ291bnQgPT09IDApXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoJ0FsaWFzIHJlc29sdXRpb24gaXMgZGlzYWJsZWQnKTtcbiAgICAgICAgbGV0IG5vZGVzO1xuICAgICAgICBpZiAoY3R4Py5hbGlhc1Jlc29sdmVDYWNoZSkge1xuICAgICAgICAgICAgbm9kZXMgPSBjdHguYWxpYXNSZXNvbHZlQ2FjaGU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBub2RlcyA9IFtdO1xuICAgICAgICAgICAgdmlzaXQoZG9jLCB7XG4gICAgICAgICAgICAgICAgTm9kZTogKF9rZXksIG5vZGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzQWxpYXMobm9kZSkgfHwgaGFzQW5jaG9yKG5vZGUpKVxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXMucHVzaChub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChjdHgpXG4gICAgICAgICAgICAgICAgY3R4LmFsaWFzUmVzb2x2ZUNhY2hlID0gbm9kZXM7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGZvdW5kID0gdW5kZWZpbmVkO1xuICAgICAgICBmb3IgKGNvbnN0IG5vZGUgb2Ygbm9kZXMpIHtcbiAgICAgICAgICAgIGlmIChub2RlID09PSB0aGlzKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgaWYgKG5vZGUuYW5jaG9yID09PSB0aGlzLnNvdXJjZSlcbiAgICAgICAgICAgICAgICBmb3VuZCA9IG5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZvdW5kICYmIGN0eCkge1xuICAgICAgICAgICAgY29uc3QgeyBhbmNob3JzLCBkb2MsIG1heEFsaWFzQ291bnQgfSA9IGN0eDtcbiAgICAgICAgICAgIGxldCBkYXRhID0gYW5jaG9ycy5nZXQoZm91bmQpO1xuICAgICAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgICAgICAgLy8gUmVzb2x2ZSBhbmNob3JzIGZvciBOb2RlLnByb3RvdHlwZS50b0pTKClcbiAgICAgICAgICAgICAgICB0b0pTKGZvdW5kLCBudWxsLCBjdHgpO1xuICAgICAgICAgICAgICAgIGRhdGEgPSBhbmNob3JzLmdldChmb3VuZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgICAgICAgIGlmIChkYXRhPy5yZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1zZyA9ICdUaGlzIHNob3VsZCBub3QgaGFwcGVuOiBBbGlhcyBhbmNob3Igd2FzIG5vdCByZXNvbHZlZD8nO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihtc2cpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1heEFsaWFzQ291bnQgPj0gMCkge1xuICAgICAgICAgICAgICAgIGRhdGEuY291bnQgKz0gMTtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5hbGlhc0NvdW50ID09PSAwKVxuICAgICAgICAgICAgICAgICAgICBkYXRhLmFsaWFzQ291bnQgPSBnZXRBbGlhc0NvdW50KGRvYywgZm91bmQsIGFuY2hvcnMpO1xuICAgICAgICAgICAgICAgIGlmIChkYXRhLmNvdW50ICogZGF0YS5hbGlhc0NvdW50ID4gbWF4QWxpYXNDb3VudCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtc2cgPSAnRXhjZXNzaXZlIGFsaWFzIGNvdW50IGluZGljYXRlcyBhIHJlc291cmNlIGV4aGF1c3Rpb24gYXR0YWNrJztcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKG1zZyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmb3VuZDtcbiAgICB9XG4gICAgdG9KU09OKF9hcmcsIGN0eCkge1xuICAgICAgICBpZiAoIWN0eClcbiAgICAgICAgICAgIHJldHVybiB7IHNvdXJjZTogdGhpcy5zb3VyY2UgfTtcbiAgICAgICAgY29uc3Qgc291cmNlID0gdGhpcy5yZXNvbHZlKGN0eC5kb2MsIGN0eCk7XG4gICAgICAgIGlmICghc291cmNlKSB7XG4gICAgICAgICAgICBjb25zdCBtc2cgPSBgVW5yZXNvbHZlZCBhbGlhcyAodGhlIGFuY2hvciBtdXN0IGJlIHNldCBiZWZvcmUgdGhlIGFsaWFzKTogJHt0aGlzLnNvdXJjZX1gO1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKG1zZyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGN0eC5hbmNob3JzLmdldChzb3VyY2UpLnJlcztcbiAgICB9XG4gICAgdG9TdHJpbmcoY3R4LCBfb25Db21tZW50LCBfb25DaG9tcEtlZXApIHtcbiAgICAgICAgY29uc3Qgc3JjID0gYCoke3RoaXMuc291cmNlfWA7XG4gICAgICAgIGlmIChjdHgpIHtcbiAgICAgICAgICAgIGFuY2hvcklzVmFsaWQodGhpcy5zb3VyY2UpO1xuICAgICAgICAgICAgaWYgKGN0eC5vcHRpb25zLnZlcmlmeUFsaWFzT3JkZXIgJiYgIWN0eC5hbmNob3JzLmhhcyh0aGlzLnNvdXJjZSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtc2cgPSBgVW5yZXNvbHZlZCBhbGlhcyAodGhlIGFuY2hvciBtdXN0IGJlIHNldCBiZWZvcmUgdGhlIGFsaWFzKTogJHt0aGlzLnNvdXJjZX1gO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGN0eC5pbXBsaWNpdEtleSlcbiAgICAgICAgICAgICAgICByZXR1cm4gYCR7c3JjfSBgO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzcmM7XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0QWxpYXNDb3VudChkb2MsIG5vZGUsIGFuY2hvcnMpIHtcbiAgICBpZiAoaXNBbGlhcyhub2RlKSkge1xuICAgICAgICBjb25zdCBzb3VyY2UgPSBub2RlLnJlc29sdmUoZG9jKTtcbiAgICAgICAgY29uc3QgYW5jaG9yID0gYW5jaG9ycyAmJiBzb3VyY2UgJiYgYW5jaG9ycy5nZXQoc291cmNlKTtcbiAgICAgICAgcmV0dXJuIGFuY2hvciA/IGFuY2hvci5jb3VudCAqIGFuY2hvci5hbGlhc0NvdW50IDogMDtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNDb2xsZWN0aW9uKG5vZGUpKSB7XG4gICAgICAgIGxldCBjb3VudCA9IDA7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBub2RlLml0ZW1zKSB7XG4gICAgICAgICAgICBjb25zdCBjID0gZ2V0QWxpYXNDb3VudChkb2MsIGl0ZW0sIGFuY2hvcnMpO1xuICAgICAgICAgICAgaWYgKGMgPiBjb3VudClcbiAgICAgICAgICAgICAgICBjb3VudCA9IGM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvdW50O1xuICAgIH1cbiAgICBlbHNlIGlmIChpc1BhaXIobm9kZSkpIHtcbiAgICAgICAgY29uc3Qga2MgPSBnZXRBbGlhc0NvdW50KGRvYywgbm9kZS5rZXksIGFuY2hvcnMpO1xuICAgICAgICBjb25zdCB2YyA9IGdldEFsaWFzQ291bnQoZG9jLCBub2RlLnZhbHVlLCBhbmNob3JzKTtcbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KGtjLCB2Yyk7XG4gICAgfVxuICAgIHJldHVybiAxO1xufVxuXG5leHBvcnQgeyBBbGlhcyB9O1xuIiwiaW1wb3J0IHsgU0NBTEFSIH0gZnJvbSAnLi9pZGVudGl0eS5qcyc7XG5pbXBvcnQgeyBOb2RlQmFzZSB9IGZyb20gJy4vTm9kZS5qcyc7XG5pbXBvcnQgeyB0b0pTIH0gZnJvbSAnLi90b0pTLmpzJztcblxuY29uc3QgaXNTY2FsYXJWYWx1ZSA9ICh2YWx1ZSkgPT4gIXZhbHVlIHx8ICh0eXBlb2YgdmFsdWUgIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0Jyk7XG5jbGFzcyBTY2FsYXIgZXh0ZW5kcyBOb2RlQmFzZSB7XG4gICAgY29uc3RydWN0b3IodmFsdWUpIHtcbiAgICAgICAgc3VwZXIoU0NBTEFSKTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICB0b0pTT04oYXJnLCBjdHgpIHtcbiAgICAgICAgcmV0dXJuIGN0eD8ua2VlcCA/IHRoaXMudmFsdWUgOiB0b0pTKHRoaXMudmFsdWUsIGFyZywgY3R4KTtcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiBTdHJpbmcodGhpcy52YWx1ZSk7XG4gICAgfVxufVxuU2NhbGFyLkJMT0NLX0ZPTERFRCA9ICdCTE9DS19GT0xERUQnO1xuU2NhbGFyLkJMT0NLX0xJVEVSQUwgPSAnQkxPQ0tfTElURVJBTCc7XG5TY2FsYXIuUExBSU4gPSAnUExBSU4nO1xuU2NhbGFyLlFVT1RFX0RPVUJMRSA9ICdRVU9URV9ET1VCTEUnO1xuU2NhbGFyLlFVT1RFX1NJTkdMRSA9ICdRVU9URV9TSU5HTEUnO1xuXG5leHBvcnQgeyBTY2FsYXIsIGlzU2NhbGFyVmFsdWUgfTtcbiIsImltcG9ydCB7IEFsaWFzIH0gZnJvbSAnLi4vbm9kZXMvQWxpYXMuanMnO1xuaW1wb3J0IHsgaXNOb2RlLCBpc1BhaXIsIE1BUCwgU0VRLCBpc0RvY3VtZW50IH0gZnJvbSAnLi4vbm9kZXMvaWRlbnRpdHkuanMnO1xuaW1wb3J0IHsgU2NhbGFyIH0gZnJvbSAnLi4vbm9kZXMvU2NhbGFyLmpzJztcblxuY29uc3QgZGVmYXVsdFRhZ1ByZWZpeCA9ICd0YWc6eWFtbC5vcmcsMjAwMjonO1xuZnVuY3Rpb24gZmluZFRhZ09iamVjdCh2YWx1ZSwgdGFnTmFtZSwgdGFncykge1xuICAgIGlmICh0YWdOYW1lKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoID0gdGFncy5maWx0ZXIodCA9PiB0LnRhZyA9PT0gdGFnTmFtZSk7XG4gICAgICAgIGNvbnN0IHRhZ09iaiA9IG1hdGNoLmZpbmQodCA9PiAhdC5mb3JtYXQpID8/IG1hdGNoWzBdO1xuICAgICAgICBpZiAoIXRhZ09iailcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGFnICR7dGFnTmFtZX0gbm90IGZvdW5kYCk7XG4gICAgICAgIHJldHVybiB0YWdPYmo7XG4gICAgfVxuICAgIHJldHVybiB0YWdzLmZpbmQodCA9PiB0LmlkZW50aWZ5Py4odmFsdWUpICYmICF0LmZvcm1hdCk7XG59XG5mdW5jdGlvbiBjcmVhdGVOb2RlKHZhbHVlLCB0YWdOYW1lLCBjdHgpIHtcbiAgICBpZiAoaXNEb2N1bWVudCh2YWx1ZSkpXG4gICAgICAgIHZhbHVlID0gdmFsdWUuY29udGVudHM7XG4gICAgaWYgKGlzTm9kZSh2YWx1ZSkpXG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICBpZiAoaXNQYWlyKHZhbHVlKSkge1xuICAgICAgICBjb25zdCBtYXAgPSBjdHguc2NoZW1hW01BUF0uY3JlYXRlTm9kZT8uKGN0eC5zY2hlbWEsIG51bGwsIGN0eCk7XG4gICAgICAgIG1hcC5pdGVtcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG1hcDtcbiAgICB9XG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nIHx8XG4gICAgICAgIHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyIHx8XG4gICAgICAgIHZhbHVlIGluc3RhbmNlb2YgQm9vbGVhbiB8fFxuICAgICAgICAodHlwZW9mIEJpZ0ludCAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsdWUgaW5zdGFuY2VvZiBCaWdJbnQpIC8vIG5vdCBzdXBwb3J0ZWQgZXZlcnl3aGVyZVxuICAgICkge1xuICAgICAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXNlcmlhbGl6ZWpzb25wcm9wZXJ0eVxuICAgICAgICB2YWx1ZSA9IHZhbHVlLnZhbHVlT2YoKTtcbiAgICB9XG4gICAgY29uc3QgeyBhbGlhc0R1cGxpY2F0ZU9iamVjdHMsIG9uQW5jaG9yLCBvblRhZ09iaiwgc2NoZW1hLCBzb3VyY2VPYmplY3RzIH0gPSBjdHg7XG4gICAgLy8gRGV0ZWN0IGR1cGxpY2F0ZSByZWZlcmVuY2VzIHRvIHRoZSBzYW1lIG9iamVjdCAmIHVzZSBBbGlhcyBub2RlcyBmb3IgYWxsXG4gICAgLy8gYWZ0ZXIgZmlyc3QuIFRoZSBgcmVmYCB3cmFwcGVyIGFsbG93cyBmb3IgY2lyY3VsYXIgcmVmZXJlbmNlcyB0byByZXNvbHZlLlxuICAgIGxldCByZWYgPSB1bmRlZmluZWQ7XG4gICAgaWYgKGFsaWFzRHVwbGljYXRlT2JqZWN0cyAmJiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJlZiA9IHNvdXJjZU9iamVjdHMuZ2V0KHZhbHVlKTtcbiAgICAgICAgaWYgKHJlZikge1xuICAgICAgICAgICAgcmVmLmFuY2hvciA/PyAocmVmLmFuY2hvciA9IG9uQW5jaG9yKHZhbHVlKSk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEFsaWFzKHJlZi5hbmNob3IpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVmID0geyBhbmNob3I6IG51bGwsIG5vZGU6IG51bGwgfTtcbiAgICAgICAgICAgIHNvdXJjZU9iamVjdHMuc2V0KHZhbHVlLCByZWYpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICh0YWdOYW1lPy5zdGFydHNXaXRoKCchIScpKVxuICAgICAgICB0YWdOYW1lID0gZGVmYXVsdFRhZ1ByZWZpeCArIHRhZ05hbWUuc2xpY2UoMik7XG4gICAgbGV0IHRhZ09iaiA9IGZpbmRUYWdPYmplY3QodmFsdWUsIHRhZ05hbWUsIHNjaGVtYS50YWdzKTtcbiAgICBpZiAoIXRhZ09iaikge1xuICAgICAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlLnRvSlNPTiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtY2FsbFxuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS50b0pTT04oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBuZXcgU2NhbGFyKHZhbHVlKTtcbiAgICAgICAgICAgIGlmIChyZWYpXG4gICAgICAgICAgICAgICAgcmVmLm5vZGUgPSBub2RlO1xuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgdGFnT2JqID1cbiAgICAgICAgICAgIHZhbHVlIGluc3RhbmNlb2YgTWFwXG4gICAgICAgICAgICAgICAgPyBzY2hlbWFbTUFQXVxuICAgICAgICAgICAgICAgIDogU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdCh2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgPyBzY2hlbWFbU0VRXVxuICAgICAgICAgICAgICAgICAgICA6IHNjaGVtYVtNQVBdO1xuICAgIH1cbiAgICBpZiAob25UYWdPYmopIHtcbiAgICAgICAgb25UYWdPYmoodGFnT2JqKTtcbiAgICAgICAgZGVsZXRlIGN0eC5vblRhZ09iajtcbiAgICB9XG4gICAgY29uc3Qgbm9kZSA9IHRhZ09iaj8uY3JlYXRlTm9kZVxuICAgICAgICA/IHRhZ09iai5jcmVhdGVOb2RlKGN0eC5zY2hlbWEsIHZhbHVlLCBjdHgpXG4gICAgICAgIDogdHlwZW9mIHRhZ09iaj8ubm9kZUNsYXNzPy5mcm9tID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgICA/IHRhZ09iai5ub2RlQ2xhc3MuZnJvbShjdHguc2NoZW1hLCB2YWx1ZSwgY3R4KVxuICAgICAgICAgICAgOiBuZXcgU2NhbGFyKHZhbHVlKTtcbiAgICBpZiAodGFnTmFtZSlcbiAgICAgICAgbm9kZS50YWcgPSB0YWdOYW1lO1xuICAgIGVsc2UgaWYgKCF0YWdPYmouZGVmYXVsdClcbiAgICAgICAgbm9kZS50YWcgPSB0YWdPYmoudGFnO1xuICAgIGlmIChyZWYpXG4gICAgICAgIHJlZi5ub2RlID0gbm9kZTtcbiAgICByZXR1cm4gbm9kZTtcbn1cblxuZXhwb3J0IHsgY3JlYXRlTm9kZSB9O1xuIiwiaW1wb3J0IHsgY3JlYXRlTm9kZSB9IGZyb20gJy4uL2RvYy9jcmVhdGVOb2RlLmpzJztcbmltcG9ydCB7IGlzTm9kZSwgaXNQYWlyLCBpc0NvbGxlY3Rpb24sIGlzU2NhbGFyIH0gZnJvbSAnLi9pZGVudGl0eS5qcyc7XG5pbXBvcnQgeyBOb2RlQmFzZSB9IGZyb20gJy4vTm9kZS5qcyc7XG5cbmZ1bmN0aW9uIGNvbGxlY3Rpb25Gcm9tUGF0aChzY2hlbWEsIHBhdGgsIHZhbHVlKSB7XG4gICAgbGV0IHYgPSB2YWx1ZTtcbiAgICBmb3IgKGxldCBpID0gcGF0aC5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICBjb25zdCBrID0gcGF0aFtpXTtcbiAgICAgICAgaWYgKHR5cGVvZiBrID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNJbnRlZ2VyKGspICYmIGsgPj0gMCkge1xuICAgICAgICAgICAgY29uc3QgYSA9IFtdO1xuICAgICAgICAgICAgYVtrXSA9IHY7XG4gICAgICAgICAgICB2ID0gYTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHYgPSBuZXcgTWFwKFtbaywgdl1dKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlTm9kZSh2LCB1bmRlZmluZWQsIHtcbiAgICAgICAgYWxpYXNEdXBsaWNhdGVPYmplY3RzOiBmYWxzZSxcbiAgICAgICAga2VlcFVuZGVmaW5lZDogZmFsc2UsXG4gICAgICAgIG9uQW5jaG9yOiAoKSA9PiB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgc2hvdWxkIG5vdCBoYXBwZW4sIHBsZWFzZSByZXBvcnQgYSBidWcuJyk7XG4gICAgICAgIH0sXG4gICAgICAgIHNjaGVtYSxcbiAgICAgICAgc291cmNlT2JqZWN0czogbmV3IE1hcCgpXG4gICAgfSk7XG59XG4vLyBUeXBlIGd1YXJkIGlzIGludGVudGlvbmFsbHkgYSBsaXR0bGUgd3Jvbmcgc28gYXMgdG8gYmUgbW9yZSB1c2VmdWwsXG4vLyBhcyBpdCBkb2VzIG5vdCBjb3ZlciB1bnR5cGFibGUgZW1wdHkgbm9uLXN0cmluZyBpdGVyYWJsZXMgKGUuZy4gW10pLlxuY29uc3QgaXNFbXB0eVBhdGggPSAocGF0aCkgPT4gcGF0aCA9PSBudWxsIHx8XG4gICAgKHR5cGVvZiBwYXRoID09PSAnb2JqZWN0JyAmJiAhIXBhdGhbU3ltYm9sLml0ZXJhdG9yXSgpLm5leHQoKS5kb25lKTtcbmNsYXNzIENvbGxlY3Rpb24gZXh0ZW5kcyBOb2RlQmFzZSB7XG4gICAgY29uc3RydWN0b3IodHlwZSwgc2NoZW1hKSB7XG4gICAgICAgIHN1cGVyKHR5cGUpO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3NjaGVtYScsIHtcbiAgICAgICAgICAgIHZhbHVlOiBzY2hlbWEsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBjb3B5IG9mIHRoaXMgY29sbGVjdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzY2hlbWEgLSBJZiBkZWZpbmVkLCBvdmVyd3JpdGVzIHRoZSBvcmlnaW5hbCdzIHNjaGVtYVxuICAgICAqL1xuICAgIGNsb25lKHNjaGVtYSkge1xuICAgICAgICBjb25zdCBjb3B5ID0gT2JqZWN0LmNyZWF0ZShPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcyksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHRoaXMpKTtcbiAgICAgICAgaWYgKHNjaGVtYSlcbiAgICAgICAgICAgIGNvcHkuc2NoZW1hID0gc2NoZW1hO1xuICAgICAgICBjb3B5Lml0ZW1zID0gY29weS5pdGVtcy5tYXAoaXQgPT4gaXNOb2RlKGl0KSB8fCBpc1BhaXIoaXQpID8gaXQuY2xvbmUoc2NoZW1hKSA6IGl0KTtcbiAgICAgICAgaWYgKHRoaXMucmFuZ2UpXG4gICAgICAgICAgICBjb3B5LnJhbmdlID0gdGhpcy5yYW5nZS5zbGljZSgpO1xuICAgICAgICByZXR1cm4gY29weTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIHZhbHVlIHRvIHRoZSBjb2xsZWN0aW9uLiBGb3IgYCEhbWFwYCBhbmQgYCEhb21hcGAgdGhlIHZhbHVlIG11c3RcbiAgICAgKiBiZSBhIFBhaXIgaW5zdGFuY2Ugb3IgYSBgeyBrZXksIHZhbHVlIH1gIG9iamVjdCwgd2hpY2ggbWF5IG5vdCBoYXZlIGEga2V5XG4gICAgICogdGhhdCBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgbWFwLlxuICAgICAqL1xuICAgIGFkZEluKHBhdGgsIHZhbHVlKSB7XG4gICAgICAgIGlmIChpc0VtcHR5UGF0aChwYXRoKSlcbiAgICAgICAgICAgIHRoaXMuYWRkKHZhbHVlKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBba2V5LCAuLi5yZXN0XSA9IHBhdGg7XG4gICAgICAgICAgICBjb25zdCBub2RlID0gdGhpcy5nZXQoa2V5LCB0cnVlKTtcbiAgICAgICAgICAgIGlmIChpc0NvbGxlY3Rpb24obm9kZSkpXG4gICAgICAgICAgICAgICAgbm9kZS5hZGRJbihyZXN0LCB2YWx1ZSk7XG4gICAgICAgICAgICBlbHNlIGlmIChub2RlID09PSB1bmRlZmluZWQgJiYgdGhpcy5zY2hlbWEpXG4gICAgICAgICAgICAgICAgdGhpcy5zZXQoa2V5LCBjb2xsZWN0aW9uRnJvbVBhdGgodGhpcy5zY2hlbWEsIHJlc3QsIHZhbHVlKSk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBZQU1MIGNvbGxlY3Rpb24gYXQgJHtrZXl9LiBSZW1haW5pbmcgcGF0aDogJHtyZXN0fWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYSB2YWx1ZSBmcm9tIHRoZSBjb2xsZWN0aW9uLlxuICAgICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgaXRlbSB3YXMgZm91bmQgYW5kIHJlbW92ZWQuXG4gICAgICovXG4gICAgZGVsZXRlSW4ocGF0aCkge1xuICAgICAgICBjb25zdCBba2V5LCAuLi5yZXN0XSA9IHBhdGg7XG4gICAgICAgIGlmIChyZXN0Lmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRlbGV0ZShrZXkpO1xuICAgICAgICBjb25zdCBub2RlID0gdGhpcy5nZXQoa2V5LCB0cnVlKTtcbiAgICAgICAgaWYgKGlzQ29sbGVjdGlvbihub2RlKSlcbiAgICAgICAgICAgIHJldHVybiBub2RlLmRlbGV0ZUluKHJlc3QpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIFlBTUwgY29sbGVjdGlvbiBhdCAke2tleX0uIFJlbWFpbmluZyBwYXRoOiAke3Jlc3R9YCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgaXRlbSBhdCBga2V5YCwgb3IgYHVuZGVmaW5lZGAgaWYgbm90IGZvdW5kLiBCeSBkZWZhdWx0IHVud3JhcHNcbiAgICAgKiBzY2FsYXIgdmFsdWVzIGZyb20gdGhlaXIgc3Vycm91bmRpbmcgbm9kZTsgdG8gZGlzYWJsZSBzZXQgYGtlZXBTY2FsYXJgIHRvXG4gICAgICogYHRydWVgIChjb2xsZWN0aW9ucyBhcmUgYWx3YXlzIHJldHVybmVkIGludGFjdCkuXG4gICAgICovXG4gICAgZ2V0SW4ocGF0aCwga2VlcFNjYWxhcikge1xuICAgICAgICBjb25zdCBba2V5LCAuLi5yZXN0XSA9IHBhdGg7XG4gICAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLmdldChrZXksIHRydWUpO1xuICAgICAgICBpZiAocmVzdC5sZW5ndGggPT09IDApXG4gICAgICAgICAgICByZXR1cm4gIWtlZXBTY2FsYXIgJiYgaXNTY2FsYXIobm9kZSkgPyBub2RlLnZhbHVlIDogbm9kZTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIGlzQ29sbGVjdGlvbihub2RlKSA/IG5vZGUuZ2V0SW4ocmVzdCwga2VlcFNjYWxhcikgOiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGhhc0FsbE51bGxWYWx1ZXMoYWxsb3dTY2FsYXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXRlbXMuZXZlcnkobm9kZSA9PiB7XG4gICAgICAgICAgICBpZiAoIWlzUGFpcihub2RlKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBjb25zdCBuID0gbm9kZS52YWx1ZTtcbiAgICAgICAgICAgIHJldHVybiAobiA9PSBudWxsIHx8XG4gICAgICAgICAgICAgICAgKGFsbG93U2NhbGFyICYmXG4gICAgICAgICAgICAgICAgICAgIGlzU2NhbGFyKG4pICYmXG4gICAgICAgICAgICAgICAgICAgIG4udmFsdWUgPT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgICAgICAhbi5jb21tZW50QmVmb3JlICYmXG4gICAgICAgICAgICAgICAgICAgICFuLmNvbW1lbnQgJiZcbiAgICAgICAgICAgICAgICAgICAgIW4udGFnKSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhlIGNvbGxlY3Rpb24gaW5jbHVkZXMgYSB2YWx1ZSB3aXRoIHRoZSBrZXkgYGtleWAuXG4gICAgICovXG4gICAgaGFzSW4ocGF0aCkge1xuICAgICAgICBjb25zdCBba2V5LCAuLi5yZXN0XSA9IHBhdGg7XG4gICAgICAgIGlmIChyZXN0Lmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmhhcyhrZXkpO1xuICAgICAgICBjb25zdCBub2RlID0gdGhpcy5nZXQoa2V5LCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIGlzQ29sbGVjdGlvbihub2RlKSA/IG5vZGUuaGFzSW4ocmVzdCkgOiBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyBhIHZhbHVlIGluIHRoaXMgY29sbGVjdGlvbi4gRm9yIGAhIXNldGAsIGB2YWx1ZWAgbmVlZHMgdG8gYmUgYVxuICAgICAqIGJvb2xlYW4gdG8gYWRkL3JlbW92ZSB0aGUgaXRlbSBmcm9tIHRoZSBzZXQuXG4gICAgICovXG4gICAgc2V0SW4ocGF0aCwgdmFsdWUpIHtcbiAgICAgICAgY29uc3QgW2tleSwgLi4ucmVzdF0gPSBwYXRoO1xuICAgICAgICBpZiAocmVzdC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuZ2V0KGtleSwgdHJ1ZSk7XG4gICAgICAgICAgICBpZiAoaXNDb2xsZWN0aW9uKG5vZGUpKVxuICAgICAgICAgICAgICAgIG5vZGUuc2V0SW4ocmVzdCwgdmFsdWUpO1xuICAgICAgICAgICAgZWxzZSBpZiAobm9kZSA9PT0gdW5kZWZpbmVkICYmIHRoaXMuc2NoZW1hKVxuICAgICAgICAgICAgICAgIHRoaXMuc2V0KGtleSwgY29sbGVjdGlvbkZyb21QYXRoKHRoaXMuc2NoZW1hLCByZXN0LCB2YWx1ZSkpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgWUFNTCBjb2xsZWN0aW9uIGF0ICR7a2V5fS4gUmVtYWluaW5nIHBhdGg6ICR7cmVzdH1gKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IHsgQ29sbGVjdGlvbiwgY29sbGVjdGlvbkZyb21QYXRoLCBpc0VtcHR5UGF0aCB9O1xuIiwiLyoqXG4gKiBTdHJpbmdpZmllcyBhIGNvbW1lbnQuXG4gKlxuICogRW1wdHkgY29tbWVudCBsaW5lcyBhcmUgbGVmdCBlbXB0eSxcbiAqIGxpbmVzIGNvbnNpc3Rpbmcgb2YgYSBzaW5nbGUgc3BhY2UgYXJlIHJlcGxhY2VkIGJ5IGAjYCxcbiAqIGFuZCBhbGwgb3RoZXIgbGluZXMgYXJlIHByZWZpeGVkIHdpdGggYSBgI2AuXG4gKi9cbmNvbnN0IHN0cmluZ2lmeUNvbW1lbnQgPSAoc3RyKSA9PiBzdHIucmVwbGFjZSgvXig/ISQpKD86ICQpPy9nbSwgJyMnKTtcbmZ1bmN0aW9uIGluZGVudENvbW1lbnQoY29tbWVudCwgaW5kZW50KSB7XG4gICAgaWYgKC9eXFxuKyQvLnRlc3QoY29tbWVudCkpXG4gICAgICAgIHJldHVybiBjb21tZW50LnN1YnN0cmluZygxKTtcbiAgICByZXR1cm4gaW5kZW50ID8gY29tbWVudC5yZXBsYWNlKC9eKD8hICokKS9nbSwgaW5kZW50KSA6IGNvbW1lbnQ7XG59XG5jb25zdCBsaW5lQ29tbWVudCA9IChzdHIsIGluZGVudCwgY29tbWVudCkgPT4gc3RyLmVuZHNXaXRoKCdcXG4nKVxuICAgID8gaW5kZW50Q29tbWVudChjb21tZW50LCBpbmRlbnQpXG4gICAgOiBjb21tZW50LmluY2x1ZGVzKCdcXG4nKVxuICAgICAgICA/ICdcXG4nICsgaW5kZW50Q29tbWVudChjb21tZW50LCBpbmRlbnQpXG4gICAgICAgIDogKHN0ci5lbmRzV2l0aCgnICcpID8gJycgOiAnICcpICsgY29tbWVudDtcblxuZXhwb3J0IHsgaW5kZW50Q29tbWVudCwgbGluZUNvbW1lbnQsIHN0cmluZ2lmeUNvbW1lbnQgfTtcbiIsImNvbnN0IEZPTERfRkxPVyA9ICdmbG93JztcbmNvbnN0IEZPTERfQkxPQ0sgPSAnYmxvY2snO1xuY29uc3QgRk9MRF9RVU9URUQgPSAncXVvdGVkJztcbi8qKlxuICogVHJpZXMgdG8ga2VlcCBpbnB1dCBhdCB1cCB0byBgbGluZVdpZHRoYCBjaGFyYWN0ZXJzLCBzcGxpdHRpbmcgb25seSBvbiBzcGFjZXNcbiAqIG5vdCBmb2xsb3dlZCBieSBuZXdsaW5lcyBvciBzcGFjZXMgdW5sZXNzIGBtb2RlYCBpcyBgJ3F1b3RlZCdgLiBMaW5lcyBhcmVcbiAqIHRlcm1pbmF0ZWQgd2l0aCBgXFxuYCBhbmQgc3RhcnRlZCB3aXRoIGBpbmRlbnRgLlxuICovXG5mdW5jdGlvbiBmb2xkRmxvd0xpbmVzKHRleHQsIGluZGVudCwgbW9kZSA9ICdmbG93JywgeyBpbmRlbnRBdFN0YXJ0LCBsaW5lV2lkdGggPSA4MCwgbWluQ29udGVudFdpZHRoID0gMjAsIG9uRm9sZCwgb25PdmVyZmxvdyB9ID0ge30pIHtcbiAgICBpZiAoIWxpbmVXaWR0aCB8fCBsaW5lV2lkdGggPCAwKVxuICAgICAgICByZXR1cm4gdGV4dDtcbiAgICBpZiAobGluZVdpZHRoIDwgbWluQ29udGVudFdpZHRoKVxuICAgICAgICBtaW5Db250ZW50V2lkdGggPSAwO1xuICAgIGNvbnN0IGVuZFN0ZXAgPSBNYXRoLm1heCgxICsgbWluQ29udGVudFdpZHRoLCAxICsgbGluZVdpZHRoIC0gaW5kZW50Lmxlbmd0aCk7XG4gICAgaWYgKHRleHQubGVuZ3RoIDw9IGVuZFN0ZXApXG4gICAgICAgIHJldHVybiB0ZXh0O1xuICAgIGNvbnN0IGZvbGRzID0gW107XG4gICAgY29uc3QgZXNjYXBlZEZvbGRzID0ge307XG4gICAgbGV0IGVuZCA9IGxpbmVXaWR0aCAtIGluZGVudC5sZW5ndGg7XG4gICAgaWYgKHR5cGVvZiBpbmRlbnRBdFN0YXJ0ID09PSAnbnVtYmVyJykge1xuICAgICAgICBpZiAoaW5kZW50QXRTdGFydCA+IGxpbmVXaWR0aCAtIE1hdGgubWF4KDIsIG1pbkNvbnRlbnRXaWR0aCkpXG4gICAgICAgICAgICBmb2xkcy5wdXNoKDApO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBlbmQgPSBsaW5lV2lkdGggLSBpbmRlbnRBdFN0YXJ0O1xuICAgIH1cbiAgICBsZXQgc3BsaXQgPSB1bmRlZmluZWQ7XG4gICAgbGV0IHByZXYgPSB1bmRlZmluZWQ7XG4gICAgbGV0IG92ZXJmbG93ID0gZmFsc2U7XG4gICAgbGV0IGkgPSAtMTtcbiAgICBsZXQgZXNjU3RhcnQgPSAtMTtcbiAgICBsZXQgZXNjRW5kID0gLTE7XG4gICAgaWYgKG1vZGUgPT09IEZPTERfQkxPQ0spIHtcbiAgICAgICAgaSA9IGNvbnN1bWVNb3JlSW5kZW50ZWRMaW5lcyh0ZXh0LCBpLCBpbmRlbnQubGVuZ3RoKTtcbiAgICAgICAgaWYgKGkgIT09IC0xKVxuICAgICAgICAgICAgZW5kID0gaSArIGVuZFN0ZXA7XG4gICAgfVxuICAgIGZvciAobGV0IGNoOyAoY2ggPSB0ZXh0WyhpICs9IDEpXSk7KSB7XG4gICAgICAgIGlmIChtb2RlID09PSBGT0xEX1FVT1RFRCAmJiBjaCA9PT0gJ1xcXFwnKSB7XG4gICAgICAgICAgICBlc2NTdGFydCA9IGk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRleHRbaSArIDFdKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAneCc6XG4gICAgICAgICAgICAgICAgICAgIGkgKz0gMztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAndSc6XG4gICAgICAgICAgICAgICAgICAgIGkgKz0gNTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnVSc6XG4gICAgICAgICAgICAgICAgICAgIGkgKz0gOTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZXNjRW5kID0gaTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2ggPT09ICdcXG4nKSB7XG4gICAgICAgICAgICBpZiAobW9kZSA9PT0gRk9MRF9CTE9DSylcbiAgICAgICAgICAgICAgICBpID0gY29uc3VtZU1vcmVJbmRlbnRlZExpbmVzKHRleHQsIGksIGluZGVudC5sZW5ndGgpO1xuICAgICAgICAgICAgZW5kID0gaSArIGluZGVudC5sZW5ndGggKyBlbmRTdGVwO1xuICAgICAgICAgICAgc3BsaXQgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoY2ggPT09ICcgJyAmJlxuICAgICAgICAgICAgICAgIHByZXYgJiZcbiAgICAgICAgICAgICAgICBwcmV2ICE9PSAnICcgJiZcbiAgICAgICAgICAgICAgICBwcmV2ICE9PSAnXFxuJyAmJlxuICAgICAgICAgICAgICAgIHByZXYgIT09ICdcXHQnKSB7XG4gICAgICAgICAgICAgICAgLy8gc3BhY2Ugc3Vycm91bmRlZCBieSBub24tc3BhY2UgY2FuIGJlIHJlcGxhY2VkIHdpdGggbmV3bGluZSArIGluZGVudFxuICAgICAgICAgICAgICAgIGNvbnN0IG5leHQgPSB0ZXh0W2kgKyAxXTtcbiAgICAgICAgICAgICAgICBpZiAobmV4dCAmJiBuZXh0ICE9PSAnICcgJiYgbmV4dCAhPT0gJ1xcbicgJiYgbmV4dCAhPT0gJ1xcdCcpXG4gICAgICAgICAgICAgICAgICAgIHNwbGl0ID0gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpID49IGVuZCkge1xuICAgICAgICAgICAgICAgIGlmIChzcGxpdCkge1xuICAgICAgICAgICAgICAgICAgICBmb2xkcy5wdXNoKHNwbGl0KTtcbiAgICAgICAgICAgICAgICAgICAgZW5kID0gc3BsaXQgKyBlbmRTdGVwO1xuICAgICAgICAgICAgICAgICAgICBzcGxpdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobW9kZSA9PT0gRk9MRF9RVU9URUQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gd2hpdGUtc3BhY2UgY29sbGVjdGVkIGF0IGVuZCBtYXkgc3RyZXRjaCBwYXN0IGxpbmVXaWR0aFxuICAgICAgICAgICAgICAgICAgICB3aGlsZSAocHJldiA9PT0gJyAnIHx8IHByZXYgPT09ICdcXHQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmV2ID0gY2g7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaCA9IHRleHRbKGkgKz0gMSldO1xuICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3cgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIEFjY291bnQgZm9yIG5ld2xpbmUgZXNjYXBlLCBidXQgZG9uJ3QgYnJlYWsgcHJlY2VkaW5nIGVzY2FwZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBqID0gaSA+IGVzY0VuZCArIDEgPyBpIC0gMiA6IGVzY1N0YXJ0IC0gMTtcbiAgICAgICAgICAgICAgICAgICAgLy8gQmFpbCBvdXQgaWYgbGluZVdpZHRoICYgbWluQ29udGVudFdpZHRoIGFyZSBzaG9ydGVyIHRoYW4gYW4gZXNjYXBlIHN0cmluZ1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXNjYXBlZEZvbGRzW2pdKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgICAgICAgICAgICAgICAgIGZvbGRzLnB1c2goaik7XG4gICAgICAgICAgICAgICAgICAgIGVzY2FwZWRGb2xkc1tqXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGVuZCA9IGogKyBlbmRTdGVwO1xuICAgICAgICAgICAgICAgICAgICBzcGxpdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG92ZXJmbG93ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcHJldiA9IGNoO1xuICAgIH1cbiAgICBpZiAob3ZlcmZsb3cgJiYgb25PdmVyZmxvdylcbiAgICAgICAgb25PdmVyZmxvdygpO1xuICAgIGlmIChmb2xkcy5sZW5ndGggPT09IDApXG4gICAgICAgIHJldHVybiB0ZXh0O1xuICAgIGlmIChvbkZvbGQpXG4gICAgICAgIG9uRm9sZCgpO1xuICAgIGxldCByZXMgPSB0ZXh0LnNsaWNlKDAsIGZvbGRzWzBdKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZvbGRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNvbnN0IGZvbGQgPSBmb2xkc1tpXTtcbiAgICAgICAgY29uc3QgZW5kID0gZm9sZHNbaSArIDFdIHx8IHRleHQubGVuZ3RoO1xuICAgICAgICBpZiAoZm9sZCA9PT0gMClcbiAgICAgICAgICAgIHJlcyA9IGBcXG4ke2luZGVudH0ke3RleHQuc2xpY2UoMCwgZW5kKX1gO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChtb2RlID09PSBGT0xEX1FVT1RFRCAmJiBlc2NhcGVkRm9sZHNbZm9sZF0pXG4gICAgICAgICAgICAgICAgcmVzICs9IGAke3RleHRbZm9sZF19XFxcXGA7XG4gICAgICAgICAgICByZXMgKz0gYFxcbiR7aW5kZW50fSR7dGV4dC5zbGljZShmb2xkICsgMSwgZW5kKX1gO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG4vKipcbiAqIFByZXN1bWVzIGBpICsgMWAgaXMgYXQgdGhlIHN0YXJ0IG9mIGEgbGluZVxuICogQHJldHVybnMgaW5kZXggb2YgbGFzdCBuZXdsaW5lIGluIG1vcmUtaW5kZW50ZWQgYmxvY2tcbiAqL1xuZnVuY3Rpb24gY29uc3VtZU1vcmVJbmRlbnRlZExpbmVzKHRleHQsIGksIGluZGVudCkge1xuICAgIGxldCBlbmQgPSBpO1xuICAgIGxldCBzdGFydCA9IGkgKyAxO1xuICAgIGxldCBjaCA9IHRleHRbc3RhcnRdO1xuICAgIHdoaWxlIChjaCA9PT0gJyAnIHx8IGNoID09PSAnXFx0Jykge1xuICAgICAgICBpZiAoaSA8IHN0YXJ0ICsgaW5kZW50KSB7XG4gICAgICAgICAgICBjaCA9IHRleHRbKytpXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICBjaCA9IHRleHRbKytpXTtcbiAgICAgICAgICAgIH0gd2hpbGUgKGNoICYmIGNoICE9PSAnXFxuJyk7XG4gICAgICAgICAgICBlbmQgPSBpO1xuICAgICAgICAgICAgc3RhcnQgPSBpICsgMTtcbiAgICAgICAgICAgIGNoID0gdGV4dFtzdGFydF07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGVuZDtcbn1cblxuZXhwb3J0IHsgRk9MRF9CTE9DSywgRk9MRF9GTE9XLCBGT0xEX1FVT1RFRCwgZm9sZEZsb3dMaW5lcyB9O1xuIiwiaW1wb3J0IHsgU2NhbGFyIH0gZnJvbSAnLi4vbm9kZXMvU2NhbGFyLmpzJztcbmltcG9ydCB7IGZvbGRGbG93TGluZXMsIEZPTERfRkxPVywgRk9MRF9RVU9URUQsIEZPTERfQkxPQ0sgfSBmcm9tICcuL2ZvbGRGbG93TGluZXMuanMnO1xuXG5jb25zdCBnZXRGb2xkT3B0aW9ucyA9IChjdHgsIGlzQmxvY2spID0+ICh7XG4gICAgaW5kZW50QXRTdGFydDogaXNCbG9jayA/IGN0eC5pbmRlbnQubGVuZ3RoIDogY3R4LmluZGVudEF0U3RhcnQsXG4gICAgbGluZVdpZHRoOiBjdHgub3B0aW9ucy5saW5lV2lkdGgsXG4gICAgbWluQ29udGVudFdpZHRoOiBjdHgub3B0aW9ucy5taW5Db250ZW50V2lkdGhcbn0pO1xuLy8gQWxzbyBjaGVja3MgZm9yIGxpbmVzIHN0YXJ0aW5nIHdpdGggJSwgYXMgcGFyc2luZyB0aGUgb3V0cHV0IGFzIFlBTUwgMS4xIHdpbGxcbi8vIHByZXN1bWUgdGhhdCdzIHN0YXJ0aW5nIGEgbmV3IGRvY3VtZW50LlxuY29uc3QgY29udGFpbnNEb2N1bWVudE1hcmtlciA9IChzdHIpID0+IC9eKCV8LS0tfFxcLlxcLlxcLikvbS50ZXN0KHN0cik7XG5mdW5jdGlvbiBsaW5lTGVuZ3RoT3ZlckxpbWl0KHN0ciwgbGluZVdpZHRoLCBpbmRlbnRMZW5ndGgpIHtcbiAgICBpZiAoIWxpbmVXaWR0aCB8fCBsaW5lV2lkdGggPCAwKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgbGltaXQgPSBsaW5lV2lkdGggLSBpbmRlbnRMZW5ndGg7XG4gICAgY29uc3Qgc3RyTGVuID0gc3RyLmxlbmd0aDtcbiAgICBpZiAoc3RyTGVuIDw9IGxpbWl0KVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDAsIHN0YXJ0ID0gMDsgaSA8IHN0ckxlbjsgKytpKSB7XG4gICAgICAgIGlmIChzdHJbaV0gPT09ICdcXG4nKSB7XG4gICAgICAgICAgICBpZiAoaSAtIHN0YXJ0ID4gbGltaXQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBzdGFydCA9IGkgKyAxO1xuICAgICAgICAgICAgaWYgKHN0ckxlbiAtIHN0YXJ0IDw9IGxpbWl0KVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIGRvdWJsZVF1b3RlZFN0cmluZyh2YWx1ZSwgY3R4KSB7XG4gICAgY29uc3QganNvbiA9IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICBpZiAoY3R4Lm9wdGlvbnMuZG91YmxlUXVvdGVkQXNKU09OKVxuICAgICAgICByZXR1cm4ganNvbjtcbiAgICBjb25zdCB7IGltcGxpY2l0S2V5IH0gPSBjdHg7XG4gICAgY29uc3QgbWluTXVsdGlMaW5lTGVuZ3RoID0gY3R4Lm9wdGlvbnMuZG91YmxlUXVvdGVkTWluTXVsdGlMaW5lTGVuZ3RoO1xuICAgIGNvbnN0IGluZGVudCA9IGN0eC5pbmRlbnQgfHwgKGNvbnRhaW5zRG9jdW1lbnRNYXJrZXIodmFsdWUpID8gJyAgJyA6ICcnKTtcbiAgICBsZXQgc3RyID0gJyc7XG4gICAgbGV0IHN0YXJ0ID0gMDtcbiAgICBmb3IgKGxldCBpID0gMCwgY2ggPSBqc29uW2ldOyBjaDsgY2ggPSBqc29uWysraV0pIHtcbiAgICAgICAgaWYgKGNoID09PSAnICcgJiYganNvbltpICsgMV0gPT09ICdcXFxcJyAmJiBqc29uW2kgKyAyXSA9PT0gJ24nKSB7XG4gICAgICAgICAgICAvLyBzcGFjZSBiZWZvcmUgbmV3bGluZSBuZWVkcyB0byBiZSBlc2NhcGVkIHRvIG5vdCBiZSBmb2xkZWRcbiAgICAgICAgICAgIHN0ciArPSBqc29uLnNsaWNlKHN0YXJ0LCBpKSArICdcXFxcICc7XG4gICAgICAgICAgICBpICs9IDE7XG4gICAgICAgICAgICBzdGFydCA9IGk7XG4gICAgICAgICAgICBjaCA9ICdcXFxcJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2ggPT09ICdcXFxcJylcbiAgICAgICAgICAgIHN3aXRjaCAoanNvbltpICsgMV0pIHtcbiAgICAgICAgICAgICAgICBjYXNlICd1JzpcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IGpzb24uc2xpY2Uoc3RhcnQsIGkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29kZSA9IGpzb24uc3Vic3RyKGkgKyAyLCA0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoY29kZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzAwMDAnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gJ1xcXFwwJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnMDAwNyc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSAnXFxcXGEnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcwMDBiJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9ICdcXFxcdic7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzAwMWInOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gJ1xcXFxlJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnMDA4NSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSAnXFxcXE4nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcwMGEwJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9ICdcXFxcXyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzIwMjgnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gJ1xcXFxMJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnMjAyOSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSAnXFxcXFAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZS5zdWJzdHIoMCwgMikgPT09ICcwMCcpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gJ1xcXFx4JyArIGNvZGUuc3Vic3RyKDIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0ganNvbi5zdWJzdHIoaSwgNik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpICs9IDU7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IGkgKyAxO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ24nOlxuICAgICAgICAgICAgICAgICAgICBpZiAoaW1wbGljaXRLZXkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGpzb25baSArIDJdID09PSAnXCInIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBqc29uLmxlbmd0aCA8IG1pbk11bHRpTGluZUxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9sZGluZyB3aWxsIGVhdCBmaXJzdCBuZXdsaW5lXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0ganNvbi5zbGljZShzdGFydCwgaSkgKyAnXFxuXFxuJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChqc29uW2kgKyAyXSA9PT0gJ1xcXFwnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAganNvbltpICsgM10gPT09ICduJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzb25baSArIDRdICE9PSAnXCInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9ICdcXG4nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgKz0gMjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBpbmRlbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzcGFjZSBhZnRlciBuZXdsaW5lIG5lZWRzIHRvIGJlIGVzY2FwZWQgdG8gbm90IGJlIGZvbGRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpzb25baSArIDJdID09PSAnICcpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9ICdcXFxcJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGkgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gaSArIDE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICAgICAgfVxuICAgIH1cbiAgICBzdHIgPSBzdGFydCA/IHN0ciArIGpzb24uc2xpY2Uoc3RhcnQpIDoganNvbjtcbiAgICByZXR1cm4gaW1wbGljaXRLZXlcbiAgICAgICAgPyBzdHJcbiAgICAgICAgOiBmb2xkRmxvd0xpbmVzKHN0ciwgaW5kZW50LCBGT0xEX1FVT1RFRCwgZ2V0Rm9sZE9wdGlvbnMoY3R4LCBmYWxzZSkpO1xufVxuZnVuY3Rpb24gc2luZ2xlUXVvdGVkU3RyaW5nKHZhbHVlLCBjdHgpIHtcbiAgICBpZiAoY3R4Lm9wdGlvbnMuc2luZ2xlUXVvdGUgPT09IGZhbHNlIHx8XG4gICAgICAgIChjdHguaW1wbGljaXRLZXkgJiYgdmFsdWUuaW5jbHVkZXMoJ1xcbicpKSB8fFxuICAgICAgICAvWyBcXHRdXFxufFxcblsgXFx0XS8udGVzdCh2YWx1ZSkgLy8gc2luZ2xlIHF1b3RlZCBzdHJpbmcgY2FuJ3QgaGF2ZSBsZWFkaW5nIG9yIHRyYWlsaW5nIHdoaXRlc3BhY2UgYXJvdW5kIG5ld2xpbmVcbiAgICApXG4gICAgICAgIHJldHVybiBkb3VibGVRdW90ZWRTdHJpbmcodmFsdWUsIGN0eCk7XG4gICAgY29uc3QgaW5kZW50ID0gY3R4LmluZGVudCB8fCAoY29udGFpbnNEb2N1bWVudE1hcmtlcih2YWx1ZSkgPyAnICAnIDogJycpO1xuICAgIGNvbnN0IHJlcyA9IFwiJ1wiICsgdmFsdWUucmVwbGFjZSgvJy9nLCBcIicnXCIpLnJlcGxhY2UoL1xcbisvZywgYCQmXFxuJHtpbmRlbnR9YCkgKyBcIidcIjtcbiAgICByZXR1cm4gY3R4LmltcGxpY2l0S2V5XG4gICAgICAgID8gcmVzXG4gICAgICAgIDogZm9sZEZsb3dMaW5lcyhyZXMsIGluZGVudCwgRk9MRF9GTE9XLCBnZXRGb2xkT3B0aW9ucyhjdHgsIGZhbHNlKSk7XG59XG5mdW5jdGlvbiBxdW90ZWRTdHJpbmcodmFsdWUsIGN0eCkge1xuICAgIGNvbnN0IHsgc2luZ2xlUXVvdGUgfSA9IGN0eC5vcHRpb25zO1xuICAgIGxldCBxcztcbiAgICBpZiAoc2luZ2xlUXVvdGUgPT09IGZhbHNlKVxuICAgICAgICBxcyA9IGRvdWJsZVF1b3RlZFN0cmluZztcbiAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgaGFzRG91YmxlID0gdmFsdWUuaW5jbHVkZXMoJ1wiJyk7XG4gICAgICAgIGNvbnN0IGhhc1NpbmdsZSA9IHZhbHVlLmluY2x1ZGVzKFwiJ1wiKTtcbiAgICAgICAgaWYgKGhhc0RvdWJsZSAmJiAhaGFzU2luZ2xlKVxuICAgICAgICAgICAgcXMgPSBzaW5nbGVRdW90ZWRTdHJpbmc7XG4gICAgICAgIGVsc2UgaWYgKGhhc1NpbmdsZSAmJiAhaGFzRG91YmxlKVxuICAgICAgICAgICAgcXMgPSBkb3VibGVRdW90ZWRTdHJpbmc7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHFzID0gc2luZ2xlUXVvdGUgPyBzaW5nbGVRdW90ZWRTdHJpbmcgOiBkb3VibGVRdW90ZWRTdHJpbmc7XG4gICAgfVxuICAgIHJldHVybiBxcyh2YWx1ZSwgY3R4KTtcbn1cbi8vIFRoZSBuZWdhdGl2ZSBsb29rYmVoaW5kIGF2b2lkcyBhIHBvbHlub21pYWwgc2VhcmNoLFxuLy8gYnV0IGlzbid0IHN1cHBvcnRlZCB5ZXQgb24gU2FmYXJpOiBodHRwczovL2Nhbml1c2UuY29tL2pzLXJlZ2V4cC1sb29rYmVoaW5kXG5sZXQgYmxvY2tFbmROZXdsaW5lcztcbnRyeSB7XG4gICAgYmxvY2tFbmROZXdsaW5lcyA9IG5ldyBSZWdFeHAoJyhefCg/PCFcXG4pKVxcbisoPyFcXG58JCknLCAnZycpO1xufVxuY2F0Y2gge1xuICAgIGJsb2NrRW5kTmV3bGluZXMgPSAvXFxuKyg/IVxcbnwkKS9nO1xufVxuZnVuY3Rpb24gYmxvY2tTdHJpbmcoeyBjb21tZW50LCB0eXBlLCB2YWx1ZSB9LCBjdHgsIG9uQ29tbWVudCwgb25DaG9tcEtlZXApIHtcbiAgICBjb25zdCB7IGJsb2NrUXVvdGUsIGNvbW1lbnRTdHJpbmcsIGxpbmVXaWR0aCB9ID0gY3R4Lm9wdGlvbnM7XG4gICAgLy8gMS4gQmxvY2sgY2FuJ3QgZW5kIGluIHdoaXRlc3BhY2UgdW5sZXNzIHRoZSBsYXN0IGxpbmUgaXMgbm9uLWVtcHR5LlxuICAgIC8vIDIuIFN0cmluZ3MgY29uc2lzdGluZyBvZiBvbmx5IHdoaXRlc3BhY2UgYXJlIGJlc3QgcmVuZGVyZWQgZXhwbGljaXRseS5cbiAgICBpZiAoIWJsb2NrUXVvdGUgfHwgL1xcbltcXHQgXSskLy50ZXN0KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gcXVvdGVkU3RyaW5nKHZhbHVlLCBjdHgpO1xuICAgIH1cbiAgICBjb25zdCBpbmRlbnQgPSBjdHguaW5kZW50IHx8XG4gICAgICAgIChjdHguZm9yY2VCbG9ja0luZGVudCB8fCBjb250YWluc0RvY3VtZW50TWFya2VyKHZhbHVlKSA/ICcgICcgOiAnJyk7XG4gICAgY29uc3QgbGl0ZXJhbCA9IGJsb2NrUXVvdGUgPT09ICdsaXRlcmFsJ1xuICAgICAgICA/IHRydWVcbiAgICAgICAgOiBibG9ja1F1b3RlID09PSAnZm9sZGVkJyB8fCB0eXBlID09PSBTY2FsYXIuQkxPQ0tfRk9MREVEXG4gICAgICAgICAgICA/IGZhbHNlXG4gICAgICAgICAgICA6IHR5cGUgPT09IFNjYWxhci5CTE9DS19MSVRFUkFMXG4gICAgICAgICAgICAgICAgPyB0cnVlXG4gICAgICAgICAgICAgICAgOiAhbGluZUxlbmd0aE92ZXJMaW1pdCh2YWx1ZSwgbGluZVdpZHRoLCBpbmRlbnQubGVuZ3RoKTtcbiAgICBpZiAoIXZhbHVlKVxuICAgICAgICByZXR1cm4gbGl0ZXJhbCA/ICd8XFxuJyA6ICc+XFxuJztcbiAgICAvLyBkZXRlcm1pbmUgY2hvbXBpbmcgZnJvbSB3aGl0ZXNwYWNlIGF0IHZhbHVlIGVuZFxuICAgIGxldCBjaG9tcDtcbiAgICBsZXQgZW5kU3RhcnQ7XG4gICAgZm9yIChlbmRTdGFydCA9IHZhbHVlLmxlbmd0aDsgZW5kU3RhcnQgPiAwOyAtLWVuZFN0YXJ0KSB7XG4gICAgICAgIGNvbnN0IGNoID0gdmFsdWVbZW5kU3RhcnQgLSAxXTtcbiAgICAgICAgaWYgKGNoICE9PSAnXFxuJyAmJiBjaCAhPT0gJ1xcdCcgJiYgY2ggIT09ICcgJylcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBsZXQgZW5kID0gdmFsdWUuc3Vic3RyaW5nKGVuZFN0YXJ0KTtcbiAgICBjb25zdCBlbmRObFBvcyA9IGVuZC5pbmRleE9mKCdcXG4nKTtcbiAgICBpZiAoZW5kTmxQb3MgPT09IC0xKSB7XG4gICAgICAgIGNob21wID0gJy0nOyAvLyBzdHJpcFxuICAgIH1cbiAgICBlbHNlIGlmICh2YWx1ZSA9PT0gZW5kIHx8IGVuZE5sUG9zICE9PSBlbmQubGVuZ3RoIC0gMSkge1xuICAgICAgICBjaG9tcCA9ICcrJzsgLy8ga2VlcFxuICAgICAgICBpZiAob25DaG9tcEtlZXApXG4gICAgICAgICAgICBvbkNob21wS2VlcCgpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY2hvbXAgPSAnJzsgLy8gY2xpcFxuICAgIH1cbiAgICBpZiAoZW5kKSB7XG4gICAgICAgIHZhbHVlID0gdmFsdWUuc2xpY2UoMCwgLWVuZC5sZW5ndGgpO1xuICAgICAgICBpZiAoZW5kW2VuZC5sZW5ndGggLSAxXSA9PT0gJ1xcbicpXG4gICAgICAgICAgICBlbmQgPSBlbmQuc2xpY2UoMCwgLTEpO1xuICAgICAgICBlbmQgPSBlbmQucmVwbGFjZShibG9ja0VuZE5ld2xpbmVzLCBgJCYke2luZGVudH1gKTtcbiAgICB9XG4gICAgLy8gZGV0ZXJtaW5lIGluZGVudCBpbmRpY2F0b3IgZnJvbSB3aGl0ZXNwYWNlIGF0IHZhbHVlIHN0YXJ0XG4gICAgbGV0IHN0YXJ0V2l0aFNwYWNlID0gZmFsc2U7XG4gICAgbGV0IHN0YXJ0RW5kO1xuICAgIGxldCBzdGFydE5sUG9zID0gLTE7XG4gICAgZm9yIChzdGFydEVuZCA9IDA7IHN0YXJ0RW5kIDwgdmFsdWUubGVuZ3RoOyArK3N0YXJ0RW5kKSB7XG4gICAgICAgIGNvbnN0IGNoID0gdmFsdWVbc3RhcnRFbmRdO1xuICAgICAgICBpZiAoY2ggPT09ICcgJylcbiAgICAgICAgICAgIHN0YXJ0V2l0aFNwYWNlID0gdHJ1ZTtcbiAgICAgICAgZWxzZSBpZiAoY2ggPT09ICdcXG4nKVxuICAgICAgICAgICAgc3RhcnRObFBvcyA9IHN0YXJ0RW5kO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG4gICAgbGV0IHN0YXJ0ID0gdmFsdWUuc3Vic3RyaW5nKDAsIHN0YXJ0TmxQb3MgPCBzdGFydEVuZCA/IHN0YXJ0TmxQb3MgKyAxIDogc3RhcnRFbmQpO1xuICAgIGlmIChzdGFydCkge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlLnN1YnN0cmluZyhzdGFydC5sZW5ndGgpO1xuICAgICAgICBzdGFydCA9IHN0YXJ0LnJlcGxhY2UoL1xcbisvZywgYCQmJHtpbmRlbnR9YCk7XG4gICAgfVxuICAgIGNvbnN0IGluZGVudFNpemUgPSBpbmRlbnQgPyAnMicgOiAnMSc7IC8vIHJvb3QgaXMgYXQgLTFcbiAgICAvLyBMZWFkaW5nIHwgb3IgPiBpcyBhZGRlZCBsYXRlclxuICAgIGxldCBoZWFkZXIgPSAoc3RhcnRXaXRoU3BhY2UgPyBpbmRlbnRTaXplIDogJycpICsgY2hvbXA7XG4gICAgaWYgKGNvbW1lbnQpIHtcbiAgICAgICAgaGVhZGVyICs9ICcgJyArIGNvbW1lbnRTdHJpbmcoY29tbWVudC5yZXBsYWNlKC8gP1tcXHJcXG5dKy9nLCAnICcpKTtcbiAgICAgICAgaWYgKG9uQ29tbWVudClcbiAgICAgICAgICAgIG9uQ29tbWVudCgpO1xuICAgIH1cbiAgICBpZiAoIWxpdGVyYWwpIHtcbiAgICAgICAgY29uc3QgZm9sZGVkVmFsdWUgPSB2YWx1ZVxuICAgICAgICAgICAgLnJlcGxhY2UoL1xcbisvZywgJ1xcbiQmJylcbiAgICAgICAgICAgIC5yZXBsYWNlKC8oPzpefFxcbikoW1xcdCBdLiopKD86KFtcXG5cXHQgXSopXFxuKD8hW1xcblxcdCBdKSk/L2csICckMSQyJykgLy8gbW9yZS1pbmRlbnRlZCBsaW5lcyBhcmVuJ3QgZm9sZGVkXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICBeIG1vcmUtaW5kLiBeIGVtcHR5ICAgICBeIGNhcHR1cmUgbmV4dCBlbXB0eSBsaW5lcyBvbmx5IGF0IGVuZCBvZiBpbmRlbnRcbiAgICAgICAgICAgIC5yZXBsYWNlKC9cXG4rL2csIGAkJiR7aW5kZW50fWApO1xuICAgICAgICBsZXQgbGl0ZXJhbEZhbGxiYWNrID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IGZvbGRPcHRpb25zID0gZ2V0Rm9sZE9wdGlvbnMoY3R4LCB0cnVlKTtcbiAgICAgICAgaWYgKGJsb2NrUXVvdGUgIT09ICdmb2xkZWQnICYmIHR5cGUgIT09IFNjYWxhci5CTE9DS19GT0xERUQpIHtcbiAgICAgICAgICAgIGZvbGRPcHRpb25zLm9uT3ZlcmZsb3cgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgbGl0ZXJhbEZhbGxiYWNrID0gdHJ1ZTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYm9keSA9IGZvbGRGbG93TGluZXMoYCR7c3RhcnR9JHtmb2xkZWRWYWx1ZX0ke2VuZH1gLCBpbmRlbnQsIEZPTERfQkxPQ0ssIGZvbGRPcHRpb25zKTtcbiAgICAgICAgaWYgKCFsaXRlcmFsRmFsbGJhY2spXG4gICAgICAgICAgICByZXR1cm4gYD4ke2hlYWRlcn1cXG4ke2luZGVudH0ke2JvZHl9YDtcbiAgICB9XG4gICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9cXG4rL2csIGAkJiR7aW5kZW50fWApO1xuICAgIHJldHVybiBgfCR7aGVhZGVyfVxcbiR7aW5kZW50fSR7c3RhcnR9JHt2YWx1ZX0ke2VuZH1gO1xufVxuZnVuY3Rpb24gcGxhaW5TdHJpbmcoaXRlbSwgY3R4LCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKSB7XG4gICAgY29uc3QgeyB0eXBlLCB2YWx1ZSB9ID0gaXRlbTtcbiAgICBjb25zdCB7IGFjdHVhbFN0cmluZywgaW1wbGljaXRLZXksIGluZGVudCwgaW5kZW50U3RlcCwgaW5GbG93IH0gPSBjdHg7XG4gICAgaWYgKChpbXBsaWNpdEtleSAmJiB2YWx1ZS5pbmNsdWRlcygnXFxuJykpIHx8XG4gICAgICAgIChpbkZsb3cgJiYgL1tbXFxde30sXS8udGVzdCh2YWx1ZSkpKSB7XG4gICAgICAgIHJldHVybiBxdW90ZWRTdHJpbmcodmFsdWUsIGN0eCk7XG4gICAgfVxuICAgIGlmICgvXltcXG5cXHQgLFtcXF17fSMmKiF8PidcIiVAYF18Xls/LV0kfF5bPy1dWyBcXHRdfFtcXG46XVsgXFx0XXxbIFxcdF1cXG58W1xcblxcdCBdI3xbXFxuXFx0IDpdJC8udGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgLy8gbm90IGFsbG93ZWQ6XG4gICAgICAgIC8vIC0gJy0nIG9yICc/J1xuICAgICAgICAvLyAtIHN0YXJ0IHdpdGggYW4gaW5kaWNhdG9yIGNoYXJhY3RlciAoZXhjZXB0IFs/Oi1dKSBvciAvWz8tXSAvXG4gICAgICAgIC8vIC0gJ1xcbiAnLCAnOiAnIG9yICcgXFxuJyBhbnl3aGVyZVxuICAgICAgICAvLyAtICcjJyBub3QgcHJlY2VkZWQgYnkgYSBub24tc3BhY2UgY2hhclxuICAgICAgICAvLyAtIGVuZCB3aXRoICcgJyBvciAnOidcbiAgICAgICAgcmV0dXJuIGltcGxpY2l0S2V5IHx8IGluRmxvdyB8fCAhdmFsdWUuaW5jbHVkZXMoJ1xcbicpXG4gICAgICAgICAgICA/IHF1b3RlZFN0cmluZyh2YWx1ZSwgY3R4KVxuICAgICAgICAgICAgOiBibG9ja1N0cmluZyhpdGVtLCBjdHgsIG9uQ29tbWVudCwgb25DaG9tcEtlZXApO1xuICAgIH1cbiAgICBpZiAoIWltcGxpY2l0S2V5ICYmXG4gICAgICAgICFpbkZsb3cgJiZcbiAgICAgICAgdHlwZSAhPT0gU2NhbGFyLlBMQUlOICYmXG4gICAgICAgIHZhbHVlLmluY2x1ZGVzKCdcXG4nKSkge1xuICAgICAgICAvLyBXaGVyZSBhbGxvd2VkICYgdHlwZSBub3Qgc2V0IGV4cGxpY2l0bHksIHByZWZlciBibG9jayBzdHlsZSBmb3IgbXVsdGlsaW5lIHN0cmluZ3NcbiAgICAgICAgcmV0dXJuIGJsb2NrU3RyaW5nKGl0ZW0sIGN0eCwgb25Db21tZW50LCBvbkNob21wS2VlcCk7XG4gICAgfVxuICAgIGlmIChjb250YWluc0RvY3VtZW50TWFya2VyKHZhbHVlKSkge1xuICAgICAgICBpZiAoaW5kZW50ID09PSAnJykge1xuICAgICAgICAgICAgY3R4LmZvcmNlQmxvY2tJbmRlbnQgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIGJsb2NrU3RyaW5nKGl0ZW0sIGN0eCwgb25Db21tZW50LCBvbkNob21wS2VlcCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaW1wbGljaXRLZXkgJiYgaW5kZW50ID09PSBpbmRlbnRTdGVwKSB7XG4gICAgICAgICAgICByZXR1cm4gcXVvdGVkU3RyaW5nKHZhbHVlLCBjdHgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHN0ciA9IHZhbHVlLnJlcGxhY2UoL1xcbisvZywgYCQmXFxuJHtpbmRlbnR9YCk7XG4gICAgLy8gVmVyaWZ5IHRoYXQgb3V0cHV0IHdpbGwgYmUgcGFyc2VkIGFzIGEgc3RyaW5nLCBhcyBlLmcuIHBsYWluIG51bWJlcnMgYW5kXG4gICAgLy8gYm9vbGVhbnMgZ2V0IHBhcnNlZCB3aXRoIHRob3NlIHR5cGVzIGluIHYxLjIgKGUuZy4gJzQyJywgJ3RydWUnICYgJzAuOWUtMycpLFxuICAgIC8vIGFuZCBvdGhlcnMgaW4gdjEuMS5cbiAgICBpZiAoYWN0dWFsU3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHRlc3QgPSAodGFnKSA9PiB0YWcuZGVmYXVsdCAmJiB0YWcudGFnICE9PSAndGFnOnlhbWwub3JnLDIwMDI6c3RyJyAmJiB0YWcudGVzdD8udGVzdChzdHIpO1xuICAgICAgICBjb25zdCB7IGNvbXBhdCwgdGFncyB9ID0gY3R4LmRvYy5zY2hlbWE7XG4gICAgICAgIGlmICh0YWdzLnNvbWUodGVzdCkgfHwgY29tcGF0Py5zb21lKHRlc3QpKVxuICAgICAgICAgICAgcmV0dXJuIHF1b3RlZFN0cmluZyh2YWx1ZSwgY3R4KTtcbiAgICB9XG4gICAgcmV0dXJuIGltcGxpY2l0S2V5XG4gICAgICAgID8gc3RyXG4gICAgICAgIDogZm9sZEZsb3dMaW5lcyhzdHIsIGluZGVudCwgRk9MRF9GTE9XLCBnZXRGb2xkT3B0aW9ucyhjdHgsIGZhbHNlKSk7XG59XG5mdW5jdGlvbiBzdHJpbmdpZnlTdHJpbmcoaXRlbSwgY3R4LCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKSB7XG4gICAgY29uc3QgeyBpbXBsaWNpdEtleSwgaW5GbG93IH0gPSBjdHg7XG4gICAgY29uc3Qgc3MgPSB0eXBlb2YgaXRlbS52YWx1ZSA9PT0gJ3N0cmluZydcbiAgICAgICAgPyBpdGVtXG4gICAgICAgIDogT2JqZWN0LmFzc2lnbih7fSwgaXRlbSwgeyB2YWx1ZTogU3RyaW5nKGl0ZW0udmFsdWUpIH0pO1xuICAgIGxldCB7IHR5cGUgfSA9IGl0ZW07XG4gICAgaWYgKHR5cGUgIT09IFNjYWxhci5RVU9URV9ET1VCTEUpIHtcbiAgICAgICAgLy8gZm9yY2UgZG91YmxlIHF1b3RlcyBvbiBjb250cm9sIGNoYXJhY3RlcnMgJiB1bnBhaXJlZCBzdXJyb2dhdGVzXG4gICAgICAgIGlmICgvW1xceDAwLVxceDA4XFx4MGItXFx4MWZcXHg3Zi1cXHg5ZlxcdXtEODAwfS1cXHV7REZGRn1dL3UudGVzdChzcy52YWx1ZSkpXG4gICAgICAgICAgICB0eXBlID0gU2NhbGFyLlFVT1RFX0RPVUJMRTtcbiAgICB9XG4gICAgY29uc3QgX3N0cmluZ2lmeSA9IChfdHlwZSkgPT4ge1xuICAgICAgICBzd2l0Y2ggKF90eXBlKSB7XG4gICAgICAgICAgICBjYXNlIFNjYWxhci5CTE9DS19GT0xERUQ6XG4gICAgICAgICAgICBjYXNlIFNjYWxhci5CTE9DS19MSVRFUkFMOlxuICAgICAgICAgICAgICAgIHJldHVybiBpbXBsaWNpdEtleSB8fCBpbkZsb3dcbiAgICAgICAgICAgICAgICAgICAgPyBxdW90ZWRTdHJpbmcoc3MudmFsdWUsIGN0eCkgLy8gYmxvY2tzIGFyZSBub3QgdmFsaWQgaW5zaWRlIGZsb3cgY29udGFpbmVyc1xuICAgICAgICAgICAgICAgICAgICA6IGJsb2NrU3RyaW5nKHNzLCBjdHgsIG9uQ29tbWVudCwgb25DaG9tcEtlZXApO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXIuUVVPVEVfRE9VQkxFOlxuICAgICAgICAgICAgICAgIHJldHVybiBkb3VibGVRdW90ZWRTdHJpbmcoc3MudmFsdWUsIGN0eCk7XG4gICAgICAgICAgICBjYXNlIFNjYWxhci5RVU9URV9TSU5HTEU6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNpbmdsZVF1b3RlZFN0cmluZyhzcy52YWx1ZSwgY3R4KTtcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyLlBMQUlOOlxuICAgICAgICAgICAgICAgIHJldHVybiBwbGFpblN0cmluZyhzcywgY3R4LCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGxldCByZXMgPSBfc3RyaW5naWZ5KHR5cGUpO1xuICAgIGlmIChyZXMgPT09IG51bGwpIHtcbiAgICAgICAgY29uc3QgeyBkZWZhdWx0S2V5VHlwZSwgZGVmYXVsdFN0cmluZ1R5cGUgfSA9IGN0eC5vcHRpb25zO1xuICAgICAgICBjb25zdCB0ID0gKGltcGxpY2l0S2V5ICYmIGRlZmF1bHRLZXlUeXBlKSB8fCBkZWZhdWx0U3RyaW5nVHlwZTtcbiAgICAgICAgcmVzID0gX3N0cmluZ2lmeSh0KTtcbiAgICAgICAgaWYgKHJlcyA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgZGVmYXVsdCBzdHJpbmcgdHlwZSAke3R9YCk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG5cbmV4cG9ydCB7IHN0cmluZ2lmeVN0cmluZyB9O1xuIiwiaW1wb3J0IHsgYW5jaG9ySXNWYWxpZCB9IGZyb20gJy4uL2RvYy9hbmNob3JzLmpzJztcbmltcG9ydCB7IGlzUGFpciwgaXNBbGlhcywgaXNOb2RlLCBpc1NjYWxhciwgaXNDb2xsZWN0aW9uIH0gZnJvbSAnLi4vbm9kZXMvaWRlbnRpdHkuanMnO1xuaW1wb3J0IHsgc3RyaW5naWZ5Q29tbWVudCB9IGZyb20gJy4vc3RyaW5naWZ5Q29tbWVudC5qcyc7XG5pbXBvcnQgeyBzdHJpbmdpZnlTdHJpbmcgfSBmcm9tICcuL3N0cmluZ2lmeVN0cmluZy5qcyc7XG5cbmZ1bmN0aW9uIGNyZWF0ZVN0cmluZ2lmeUNvbnRleHQoZG9jLCBvcHRpb25zKSB7XG4gICAgY29uc3Qgb3B0ID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICAgIGJsb2NrUXVvdGU6IHRydWUsXG4gICAgICAgIGNvbW1lbnRTdHJpbmc6IHN0cmluZ2lmeUNvbW1lbnQsXG4gICAgICAgIGRlZmF1bHRLZXlUeXBlOiBudWxsLFxuICAgICAgICBkZWZhdWx0U3RyaW5nVHlwZTogJ1BMQUlOJyxcbiAgICAgICAgZGlyZWN0aXZlczogbnVsbCxcbiAgICAgICAgZG91YmxlUXVvdGVkQXNKU09OOiBmYWxzZSxcbiAgICAgICAgZG91YmxlUXVvdGVkTWluTXVsdGlMaW5lTGVuZ3RoOiA0MCxcbiAgICAgICAgZmFsc2VTdHI6ICdmYWxzZScsXG4gICAgICAgIGZsb3dDb2xsZWN0aW9uUGFkZGluZzogdHJ1ZSxcbiAgICAgICAgaW5kZW50U2VxOiB0cnVlLFxuICAgICAgICBsaW5lV2lkdGg6IDgwLFxuICAgICAgICBtaW5Db250ZW50V2lkdGg6IDIwLFxuICAgICAgICBudWxsU3RyOiAnbnVsbCcsXG4gICAgICAgIHNpbXBsZUtleXM6IGZhbHNlLFxuICAgICAgICBzaW5nbGVRdW90ZTogbnVsbCxcbiAgICAgICAgdHJhaWxpbmdDb21tYTogZmFsc2UsXG4gICAgICAgIHRydWVTdHI6ICd0cnVlJyxcbiAgICAgICAgdmVyaWZ5QWxpYXNPcmRlcjogdHJ1ZVxuICAgIH0sIGRvYy5zY2hlbWEudG9TdHJpbmdPcHRpb25zLCBvcHRpb25zKTtcbiAgICBsZXQgaW5GbG93O1xuICAgIHN3aXRjaCAob3B0LmNvbGxlY3Rpb25TdHlsZSkge1xuICAgICAgICBjYXNlICdibG9jayc6XG4gICAgICAgICAgICBpbkZsb3cgPSBmYWxzZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdmbG93JzpcbiAgICAgICAgICAgIGluRmxvdyA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGluRmxvdyA9IG51bGw7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGFuY2hvcnM6IG5ldyBTZXQoKSxcbiAgICAgICAgZG9jLFxuICAgICAgICBmbG93Q29sbGVjdGlvblBhZGRpbmc6IG9wdC5mbG93Q29sbGVjdGlvblBhZGRpbmcgPyAnICcgOiAnJyxcbiAgICAgICAgaW5kZW50OiAnJyxcbiAgICAgICAgaW5kZW50U3RlcDogdHlwZW9mIG9wdC5pbmRlbnQgPT09ICdudW1iZXInID8gJyAnLnJlcGVhdChvcHQuaW5kZW50KSA6ICcgICcsXG4gICAgICAgIGluRmxvdyxcbiAgICAgICAgb3B0aW9uczogb3B0XG4gICAgfTtcbn1cbmZ1bmN0aW9uIGdldFRhZ09iamVjdCh0YWdzLCBpdGVtKSB7XG4gICAgaWYgKGl0ZW0udGFnKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoID0gdGFncy5maWx0ZXIodCA9PiB0LnRhZyA9PT0gaXRlbS50YWcpO1xuICAgICAgICBpZiAobWF0Y2gubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJldHVybiBtYXRjaC5maW5kKHQgPT4gdC5mb3JtYXQgPT09IGl0ZW0uZm9ybWF0KSA/PyBtYXRjaFswXTtcbiAgICB9XG4gICAgbGV0IHRhZ09iaiA9IHVuZGVmaW5lZDtcbiAgICBsZXQgb2JqO1xuICAgIGlmIChpc1NjYWxhcihpdGVtKSkge1xuICAgICAgICBvYmogPSBpdGVtLnZhbHVlO1xuICAgICAgICBsZXQgbWF0Y2ggPSB0YWdzLmZpbHRlcih0ID0+IHQuaWRlbnRpZnk/LihvYmopKTtcbiAgICAgICAgaWYgKG1hdGNoLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIGNvbnN0IHRlc3RNYXRjaCA9IG1hdGNoLmZpbHRlcih0ID0+IHQudGVzdCk7XG4gICAgICAgICAgICBpZiAodGVzdE1hdGNoLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgbWF0Y2ggPSB0ZXN0TWF0Y2g7XG4gICAgICAgIH1cbiAgICAgICAgdGFnT2JqID1cbiAgICAgICAgICAgIG1hdGNoLmZpbmQodCA9PiB0LmZvcm1hdCA9PT0gaXRlbS5mb3JtYXQpID8/IG1hdGNoLmZpbmQodCA9PiAhdC5mb3JtYXQpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgb2JqID0gaXRlbTtcbiAgICAgICAgdGFnT2JqID0gdGFncy5maW5kKHQgPT4gdC5ub2RlQ2xhc3MgJiYgb2JqIGluc3RhbmNlb2YgdC5ub2RlQ2xhc3MpO1xuICAgIH1cbiAgICBpZiAoIXRhZ09iaikge1xuICAgICAgICBjb25zdCBuYW1lID0gb2JqPy5jb25zdHJ1Y3Rvcj8ubmFtZSA/PyAob2JqID09PSBudWxsID8gJ251bGwnIDogdHlwZW9mIG9iaik7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVGFnIG5vdCByZXNvbHZlZCBmb3IgJHtuYW1lfSB2YWx1ZWApO1xuICAgIH1cbiAgICByZXR1cm4gdGFnT2JqO1xufVxuLy8gbmVlZHMgdG8gYmUgY2FsbGVkIGJlZm9yZSB2YWx1ZSBzdHJpbmdpZmllciB0byBhbGxvdyBmb3IgY2lyY3VsYXIgYW5jaG9yIHJlZnNcbmZ1bmN0aW9uIHN0cmluZ2lmeVByb3BzKG5vZGUsIHRhZ09iaiwgeyBhbmNob3JzLCBkb2MgfSkge1xuICAgIGlmICghZG9jLmRpcmVjdGl2ZXMpXG4gICAgICAgIHJldHVybiAnJztcbiAgICBjb25zdCBwcm9wcyA9IFtdO1xuICAgIGNvbnN0IGFuY2hvciA9IChpc1NjYWxhcihub2RlKSB8fCBpc0NvbGxlY3Rpb24obm9kZSkpICYmIG5vZGUuYW5jaG9yO1xuICAgIGlmIChhbmNob3IgJiYgYW5jaG9ySXNWYWxpZChhbmNob3IpKSB7XG4gICAgICAgIGFuY2hvcnMuYWRkKGFuY2hvcik7XG4gICAgICAgIHByb3BzLnB1c2goYCYke2FuY2hvcn1gKTtcbiAgICB9XG4gICAgY29uc3QgdGFnID0gbm9kZS50YWcgPz8gKHRhZ09iai5kZWZhdWx0ID8gbnVsbCA6IHRhZ09iai50YWcpO1xuICAgIGlmICh0YWcpXG4gICAgICAgIHByb3BzLnB1c2goZG9jLmRpcmVjdGl2ZXMudGFnU3RyaW5nKHRhZykpO1xuICAgIHJldHVybiBwcm9wcy5qb2luKCcgJyk7XG59XG5mdW5jdGlvbiBzdHJpbmdpZnkoaXRlbSwgY3R4LCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKSB7XG4gICAgaWYgKGlzUGFpcihpdGVtKSlcbiAgICAgICAgcmV0dXJuIGl0ZW0udG9TdHJpbmcoY3R4LCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKTtcbiAgICBpZiAoaXNBbGlhcyhpdGVtKSkge1xuICAgICAgICBpZiAoY3R4LmRvYy5kaXJlY3RpdmVzKVxuICAgICAgICAgICAgcmV0dXJuIGl0ZW0udG9TdHJpbmcoY3R4KTtcbiAgICAgICAgaWYgKGN0eC5yZXNvbHZlZEFsaWFzZXM/LmhhcyhpdGVtKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgQ2Fubm90IHN0cmluZ2lmeSBjaXJjdWxhciBzdHJ1Y3R1cmUgd2l0aG91dCBhbGlhcyBub2Rlc2ApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGN0eC5yZXNvbHZlZEFsaWFzZXMpXG4gICAgICAgICAgICAgICAgY3R4LnJlc29sdmVkQWxpYXNlcy5hZGQoaXRlbSk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgY3R4LnJlc29sdmVkQWxpYXNlcyA9IG5ldyBTZXQoW2l0ZW1dKTtcbiAgICAgICAgICAgIGl0ZW0gPSBpdGVtLnJlc29sdmUoY3R4LmRvYyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV0IHRhZ09iaiA9IHVuZGVmaW5lZDtcbiAgICBjb25zdCBub2RlID0gaXNOb2RlKGl0ZW0pXG4gICAgICAgID8gaXRlbVxuICAgICAgICA6IGN0eC5kb2MuY3JlYXRlTm9kZShpdGVtLCB7IG9uVGFnT2JqOiBvID0+ICh0YWdPYmogPSBvKSB9KTtcbiAgICB0YWdPYmogPz8gKHRhZ09iaiA9IGdldFRhZ09iamVjdChjdHguZG9jLnNjaGVtYS50YWdzLCBub2RlKSk7XG4gICAgY29uc3QgcHJvcHMgPSBzdHJpbmdpZnlQcm9wcyhub2RlLCB0YWdPYmosIGN0eCk7XG4gICAgaWYgKHByb3BzLmxlbmd0aCA+IDApXG4gICAgICAgIGN0eC5pbmRlbnRBdFN0YXJ0ID0gKGN0eC5pbmRlbnRBdFN0YXJ0ID8/IDApICsgcHJvcHMubGVuZ3RoICsgMTtcbiAgICBjb25zdCBzdHIgPSB0eXBlb2YgdGFnT2JqLnN0cmluZ2lmeSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICA/IHRhZ09iai5zdHJpbmdpZnkobm9kZSwgY3R4LCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKVxuICAgICAgICA6IGlzU2NhbGFyKG5vZGUpXG4gICAgICAgICAgICA/IHN0cmluZ2lmeVN0cmluZyhub2RlLCBjdHgsIG9uQ29tbWVudCwgb25DaG9tcEtlZXApXG4gICAgICAgICAgICA6IG5vZGUudG9TdHJpbmcoY3R4LCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKTtcbiAgICBpZiAoIXByb3BzKVxuICAgICAgICByZXR1cm4gc3RyO1xuICAgIHJldHVybiBpc1NjYWxhcihub2RlKSB8fCBzdHJbMF0gPT09ICd7JyB8fCBzdHJbMF0gPT09ICdbJ1xuICAgICAgICA/IGAke3Byb3BzfSAke3N0cn1gXG4gICAgICAgIDogYCR7cHJvcHN9XFxuJHtjdHguaW5kZW50fSR7c3RyfWA7XG59XG5cbmV4cG9ydCB7IGNyZWF0ZVN0cmluZ2lmeUNvbnRleHQsIHN0cmluZ2lmeSB9O1xuIiwiaW1wb3J0IHsgaXNDb2xsZWN0aW9uLCBpc05vZGUsIGlzU2NhbGFyLCBpc1NlcSB9IGZyb20gJy4uL25vZGVzL2lkZW50aXR5LmpzJztcbmltcG9ydCB7IFNjYWxhciB9IGZyb20gJy4uL25vZGVzL1NjYWxhci5qcyc7XG5pbXBvcnQgeyBzdHJpbmdpZnkgfSBmcm9tICcuL3N0cmluZ2lmeS5qcyc7XG5pbXBvcnQgeyBsaW5lQ29tbWVudCwgaW5kZW50Q29tbWVudCB9IGZyb20gJy4vc3RyaW5naWZ5Q29tbWVudC5qcyc7XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeVBhaXIoeyBrZXksIHZhbHVlIH0sIGN0eCwgb25Db21tZW50LCBvbkNob21wS2VlcCkge1xuICAgIGNvbnN0IHsgYWxsTnVsbFZhbHVlcywgZG9jLCBpbmRlbnQsIGluZGVudFN0ZXAsIG9wdGlvbnM6IHsgY29tbWVudFN0cmluZywgaW5kZW50U2VxLCBzaW1wbGVLZXlzIH0gfSA9IGN0eDtcbiAgICBsZXQga2V5Q29tbWVudCA9IChpc05vZGUoa2V5KSAmJiBrZXkuY29tbWVudCkgfHwgbnVsbDtcbiAgICBpZiAoc2ltcGxlS2V5cykge1xuICAgICAgICBpZiAoa2V5Q29tbWVudCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXaXRoIHNpbXBsZSBrZXlzLCBrZXkgbm9kZXMgY2Fubm90IGhhdmUgY29tbWVudHMnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNDb2xsZWN0aW9uKGtleSkgfHwgKCFpc05vZGUoa2V5KSAmJiB0eXBlb2Yga2V5ID09PSAnb2JqZWN0JykpIHtcbiAgICAgICAgICAgIGNvbnN0IG1zZyA9ICdXaXRoIHNpbXBsZSBrZXlzLCBjb2xsZWN0aW9uIGNhbm5vdCBiZSB1c2VkIGFzIGEga2V5IHZhbHVlJztcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxldCBleHBsaWNpdEtleSA9ICFzaW1wbGVLZXlzICYmXG4gICAgICAgICgha2V5IHx8XG4gICAgICAgICAgICAoa2V5Q29tbWVudCAmJiB2YWx1ZSA9PSBudWxsICYmICFjdHguaW5GbG93KSB8fFxuICAgICAgICAgICAgaXNDb2xsZWN0aW9uKGtleSkgfHxcbiAgICAgICAgICAgIChpc1NjYWxhcihrZXkpXG4gICAgICAgICAgICAgICAgPyBrZXkudHlwZSA9PT0gU2NhbGFyLkJMT0NLX0ZPTERFRCB8fCBrZXkudHlwZSA9PT0gU2NhbGFyLkJMT0NLX0xJVEVSQUxcbiAgICAgICAgICAgICAgICA6IHR5cGVvZiBrZXkgPT09ICdvYmplY3QnKSk7XG4gICAgY3R4ID0gT2JqZWN0LmFzc2lnbih7fSwgY3R4LCB7XG4gICAgICAgIGFsbE51bGxWYWx1ZXM6IGZhbHNlLFxuICAgICAgICBpbXBsaWNpdEtleTogIWV4cGxpY2l0S2V5ICYmIChzaW1wbGVLZXlzIHx8ICFhbGxOdWxsVmFsdWVzKSxcbiAgICAgICAgaW5kZW50OiBpbmRlbnQgKyBpbmRlbnRTdGVwXG4gICAgfSk7XG4gICAgbGV0IGtleUNvbW1lbnREb25lID0gZmFsc2U7XG4gICAgbGV0IGNob21wS2VlcCA9IGZhbHNlO1xuICAgIGxldCBzdHIgPSBzdHJpbmdpZnkoa2V5LCBjdHgsICgpID0+IChrZXlDb21tZW50RG9uZSA9IHRydWUpLCAoKSA9PiAoY2hvbXBLZWVwID0gdHJ1ZSkpO1xuICAgIGlmICghZXhwbGljaXRLZXkgJiYgIWN0eC5pbkZsb3cgJiYgc3RyLmxlbmd0aCA+IDEwMjQpIHtcbiAgICAgICAgaWYgKHNpbXBsZUtleXMpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dpdGggc2ltcGxlIGtleXMsIHNpbmdsZSBsaW5lIHNjYWxhciBtdXN0IG5vdCBzcGFuIG1vcmUgdGhhbiAxMDI0IGNoYXJhY3RlcnMnKTtcbiAgICAgICAgZXhwbGljaXRLZXkgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoY3R4LmluRmxvdykge1xuICAgICAgICBpZiAoYWxsTnVsbFZhbHVlcyB8fCB2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoa2V5Q29tbWVudERvbmUgJiYgb25Db21tZW50KVxuICAgICAgICAgICAgICAgIG9uQ29tbWVudCgpO1xuICAgICAgICAgICAgcmV0dXJuIHN0ciA9PT0gJycgPyAnPycgOiBleHBsaWNpdEtleSA/IGA/ICR7c3RyfWAgOiBzdHI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoKGFsbE51bGxWYWx1ZXMgJiYgIXNpbXBsZUtleXMpIHx8ICh2YWx1ZSA9PSBudWxsICYmIGV4cGxpY2l0S2V5KSkge1xuICAgICAgICBzdHIgPSBgPyAke3N0cn1gO1xuICAgICAgICBpZiAoa2V5Q29tbWVudCAmJiAha2V5Q29tbWVudERvbmUpIHtcbiAgICAgICAgICAgIHN0ciArPSBsaW5lQ29tbWVudChzdHIsIGN0eC5pbmRlbnQsIGNvbW1lbnRTdHJpbmcoa2V5Q29tbWVudCkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNob21wS2VlcCAmJiBvbkNob21wS2VlcClcbiAgICAgICAgICAgIG9uQ2hvbXBLZWVwKCk7XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuICAgIGlmIChrZXlDb21tZW50RG9uZSlcbiAgICAgICAga2V5Q29tbWVudCA9IG51bGw7XG4gICAgaWYgKGV4cGxpY2l0S2V5KSB7XG4gICAgICAgIGlmIChrZXlDb21tZW50KVxuICAgICAgICAgICAgc3RyICs9IGxpbmVDb21tZW50KHN0ciwgY3R4LmluZGVudCwgY29tbWVudFN0cmluZyhrZXlDb21tZW50KSk7XG4gICAgICAgIHN0ciA9IGA/ICR7c3RyfVxcbiR7aW5kZW50fTpgO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgc3RyID0gYCR7c3RyfTpgO1xuICAgICAgICBpZiAoa2V5Q29tbWVudClcbiAgICAgICAgICAgIHN0ciArPSBsaW5lQ29tbWVudChzdHIsIGN0eC5pbmRlbnQsIGNvbW1lbnRTdHJpbmcoa2V5Q29tbWVudCkpO1xuICAgIH1cbiAgICBsZXQgdnNiLCB2Y2IsIHZhbHVlQ29tbWVudDtcbiAgICBpZiAoaXNOb2RlKHZhbHVlKSkge1xuICAgICAgICB2c2IgPSAhIXZhbHVlLnNwYWNlQmVmb3JlO1xuICAgICAgICB2Y2IgPSB2YWx1ZS5jb21tZW50QmVmb3JlO1xuICAgICAgICB2YWx1ZUNvbW1lbnQgPSB2YWx1ZS5jb21tZW50O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdnNiID0gZmFsc2U7XG4gICAgICAgIHZjYiA9IG51bGw7XG4gICAgICAgIHZhbHVlQ29tbWVudCA9IG51bGw7XG4gICAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKVxuICAgICAgICAgICAgdmFsdWUgPSBkb2MuY3JlYXRlTm9kZSh2YWx1ZSk7XG4gICAgfVxuICAgIGN0eC5pbXBsaWNpdEtleSA9IGZhbHNlO1xuICAgIGlmICghZXhwbGljaXRLZXkgJiYgIWtleUNvbW1lbnQgJiYgaXNTY2FsYXIodmFsdWUpKVxuICAgICAgICBjdHguaW5kZW50QXRTdGFydCA9IHN0ci5sZW5ndGggKyAxO1xuICAgIGNob21wS2VlcCA9IGZhbHNlO1xuICAgIGlmICghaW5kZW50U2VxICYmXG4gICAgICAgIGluZGVudFN0ZXAubGVuZ3RoID49IDIgJiZcbiAgICAgICAgIWN0eC5pbkZsb3cgJiZcbiAgICAgICAgIWV4cGxpY2l0S2V5ICYmXG4gICAgICAgIGlzU2VxKHZhbHVlKSAmJlxuICAgICAgICAhdmFsdWUuZmxvdyAmJlxuICAgICAgICAhdmFsdWUudGFnICYmXG4gICAgICAgICF2YWx1ZS5hbmNob3IpIHtcbiAgICAgICAgLy8gSWYgaW5kZW50U2VxID09PSBmYWxzZSwgY29uc2lkZXIgJy0gJyBhcyBwYXJ0IG9mIGluZGVudGF0aW9uIHdoZXJlIHBvc3NpYmxlXG4gICAgICAgIGN0eC5pbmRlbnQgPSBjdHguaW5kZW50LnN1YnN0cmluZygyKTtcbiAgICB9XG4gICAgbGV0IHZhbHVlQ29tbWVudERvbmUgPSBmYWxzZTtcbiAgICBjb25zdCB2YWx1ZVN0ciA9IHN0cmluZ2lmeSh2YWx1ZSwgY3R4LCAoKSA9PiAodmFsdWVDb21tZW50RG9uZSA9IHRydWUpLCAoKSA9PiAoY2hvbXBLZWVwID0gdHJ1ZSkpO1xuICAgIGxldCB3cyA9ICcgJztcbiAgICBpZiAoa2V5Q29tbWVudCB8fCB2c2IgfHwgdmNiKSB7XG4gICAgICAgIHdzID0gdnNiID8gJ1xcbicgOiAnJztcbiAgICAgICAgaWYgKHZjYikge1xuICAgICAgICAgICAgY29uc3QgY3MgPSBjb21tZW50U3RyaW5nKHZjYik7XG4gICAgICAgICAgICB3cyArPSBgXFxuJHtpbmRlbnRDb21tZW50KGNzLCBjdHguaW5kZW50KX1gO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZVN0ciA9PT0gJycgJiYgIWN0eC5pbkZsb3cpIHtcbiAgICAgICAgICAgIGlmICh3cyA9PT0gJ1xcbicgJiYgdmFsdWVDb21tZW50KVxuICAgICAgICAgICAgICAgIHdzID0gJ1xcblxcbic7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB3cyArPSBgXFxuJHtjdHguaW5kZW50fWA7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoIWV4cGxpY2l0S2V5ICYmIGlzQ29sbGVjdGlvbih2YWx1ZSkpIHtcbiAgICAgICAgY29uc3QgdnMwID0gdmFsdWVTdHJbMF07XG4gICAgICAgIGNvbnN0IG5sMCA9IHZhbHVlU3RyLmluZGV4T2YoJ1xcbicpO1xuICAgICAgICBjb25zdCBoYXNOZXdsaW5lID0gbmwwICE9PSAtMTtcbiAgICAgICAgY29uc3QgZmxvdyA9IGN0eC5pbkZsb3cgPz8gdmFsdWUuZmxvdyA/PyB2YWx1ZS5pdGVtcy5sZW5ndGggPT09IDA7XG4gICAgICAgIGlmIChoYXNOZXdsaW5lIHx8ICFmbG93KSB7XG4gICAgICAgICAgICBsZXQgaGFzUHJvcHNMaW5lID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAoaGFzTmV3bGluZSAmJiAodnMwID09PSAnJicgfHwgdnMwID09PSAnIScpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNwMCA9IHZhbHVlU3RyLmluZGV4T2YoJyAnKTtcbiAgICAgICAgICAgICAgICBpZiAodnMwID09PSAnJicgJiZcbiAgICAgICAgICAgICAgICAgICAgc3AwICE9PSAtMSAmJlxuICAgICAgICAgICAgICAgICAgICBzcDAgPCBubDAgJiZcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVTdHJbc3AwICsgMV0gPT09ICchJykge1xuICAgICAgICAgICAgICAgICAgICBzcDAgPSB2YWx1ZVN0ci5pbmRleE9mKCcgJywgc3AwICsgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChzcDAgPT09IC0xIHx8IG5sMCA8IHNwMClcbiAgICAgICAgICAgICAgICAgICAgaGFzUHJvcHNMaW5lID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaGFzUHJvcHNMaW5lKVxuICAgICAgICAgICAgICAgIHdzID0gYFxcbiR7Y3R4LmluZGVudH1gO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKHZhbHVlU3RyID09PSAnJyB8fCB2YWx1ZVN0clswXSA9PT0gJ1xcbicpIHtcbiAgICAgICAgd3MgPSAnJztcbiAgICB9XG4gICAgc3RyICs9IHdzICsgdmFsdWVTdHI7XG4gICAgaWYgKGN0eC5pbkZsb3cpIHtcbiAgICAgICAgaWYgKHZhbHVlQ29tbWVudERvbmUgJiYgb25Db21tZW50KVxuICAgICAgICAgICAgb25Db21tZW50KCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHZhbHVlQ29tbWVudCAmJiAhdmFsdWVDb21tZW50RG9uZSkge1xuICAgICAgICBzdHIgKz0gbGluZUNvbW1lbnQoc3RyLCBjdHguaW5kZW50LCBjb21tZW50U3RyaW5nKHZhbHVlQ29tbWVudCkpO1xuICAgIH1cbiAgICBlbHNlIGlmIChjaG9tcEtlZXAgJiYgb25DaG9tcEtlZXApIHtcbiAgICAgICAgb25DaG9tcEtlZXAoKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0cjtcbn1cblxuZXhwb3J0IHsgc3RyaW5naWZ5UGFpciB9O1xuIiwiZnVuY3Rpb24gZGVidWcobG9nTGV2ZWwsIC4uLm1lc3NhZ2VzKSB7XG4gICAgaWYgKGxvZ0xldmVsID09PSAnZGVidWcnKVxuICAgICAgICBjb25zb2xlLmxvZyguLi5tZXNzYWdlcyk7XG59XG5mdW5jdGlvbiB3YXJuKGxvZ0xldmVsLCB3YXJuaW5nKSB7XG4gICAgaWYgKGxvZ0xldmVsID09PSAnZGVidWcnIHx8IGxvZ0xldmVsID09PSAnd2FybicpIHtcbiAgICAgICAgY29uc29sZS53YXJuKHdhcm5pbmcpO1xuICAgIH1cbn1cblxuZXhwb3J0IHsgZGVidWcsIHdhcm4gfTtcbiIsImltcG9ydCB7IGlzU2NhbGFyLCBpc1NlcSwgaXNBbGlhcywgaXNNYXAgfSBmcm9tICcuLi8uLi9ub2Rlcy9pZGVudGl0eS5qcyc7XG5pbXBvcnQgeyBTY2FsYXIgfSBmcm9tICcuLi8uLi9ub2Rlcy9TY2FsYXIuanMnO1xuXG4vLyBJZiB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGEgbWVyZ2Uga2V5IGlzIGEgc2luZ2xlIG1hcHBpbmcgbm9kZSwgZWFjaCBvZlxuLy8gaXRzIGtleS92YWx1ZSBwYWlycyBpcyBpbnNlcnRlZCBpbnRvIHRoZSBjdXJyZW50IG1hcHBpbmcsIHVubGVzcyB0aGUga2V5XG4vLyBhbHJlYWR5IGV4aXN0cyBpbiBpdC4gSWYgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWVyZ2Uga2V5IGlzIGFcbi8vIHNlcXVlbmNlLCB0aGVuIHRoaXMgc2VxdWVuY2UgaXMgZXhwZWN0ZWQgdG8gY29udGFpbiBtYXBwaW5nIG5vZGVzIGFuZCBlYWNoXG4vLyBvZiB0aGVzZSBub2RlcyBpcyBtZXJnZWQgaW4gdHVybiBhY2NvcmRpbmcgdG8gaXRzIG9yZGVyIGluIHRoZSBzZXF1ZW5jZS5cbi8vIEtleXMgaW4gbWFwcGluZyBub2RlcyBlYXJsaWVyIGluIHRoZSBzZXF1ZW5jZSBvdmVycmlkZSBrZXlzIHNwZWNpZmllZCBpblxuLy8gbGF0ZXIgbWFwcGluZyBub2Rlcy4gLS0gaHR0cDovL3lhbWwub3JnL3R5cGUvbWVyZ2UuaHRtbFxuY29uc3QgTUVSR0VfS0VZID0gJzw8JztcbmNvbnN0IG1lcmdlID0ge1xuICAgIGlkZW50aWZ5OiB2YWx1ZSA9PiB2YWx1ZSA9PT0gTUVSR0VfS0VZIHx8XG4gICAgICAgICh0eXBlb2YgdmFsdWUgPT09ICdzeW1ib2wnICYmIHZhbHVlLmRlc2NyaXB0aW9uID09PSBNRVJHRV9LRVkpLFxuICAgIGRlZmF1bHQ6ICdrZXknLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOm1lcmdlJyxcbiAgICB0ZXN0OiAvXjw8JC8sXG4gICAgcmVzb2x2ZTogKCkgPT4gT2JqZWN0LmFzc2lnbihuZXcgU2NhbGFyKFN5bWJvbChNRVJHRV9LRVkpKSwge1xuICAgICAgICBhZGRUb0pTTWFwOiBhZGRNZXJnZVRvSlNNYXBcbiAgICB9KSxcbiAgICBzdHJpbmdpZnk6ICgpID0+IE1FUkdFX0tFWVxufTtcbmNvbnN0IGlzTWVyZ2VLZXkgPSAoY3R4LCBrZXkpID0+IChtZXJnZS5pZGVudGlmeShrZXkpIHx8XG4gICAgKGlzU2NhbGFyKGtleSkgJiZcbiAgICAgICAgKCFrZXkudHlwZSB8fCBrZXkudHlwZSA9PT0gU2NhbGFyLlBMQUlOKSAmJlxuICAgICAgICBtZXJnZS5pZGVudGlmeShrZXkudmFsdWUpKSkgJiZcbiAgICBjdHg/LmRvYy5zY2hlbWEudGFncy5zb21lKHRhZyA9PiB0YWcudGFnID09PSBtZXJnZS50YWcgJiYgdGFnLmRlZmF1bHQpO1xuZnVuY3Rpb24gYWRkTWVyZ2VUb0pTTWFwKGN0eCwgbWFwLCB2YWx1ZSkge1xuICAgIGNvbnN0IHNvdXJjZSA9IHJlc29sdmVBbGlhc1ZhbHVlKGN0eCwgdmFsdWUpO1xuICAgIGlmIChpc1NlcShzb3VyY2UpKVxuICAgICAgICBmb3IgKGNvbnN0IGl0IG9mIHNvdXJjZS5pdGVtcylcbiAgICAgICAgICAgIG1lcmdlVmFsdWUoY3R4LCBtYXAsIGl0KTtcbiAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHNvdXJjZSkpXG4gICAgICAgIGZvciAoY29uc3QgaXQgb2Ygc291cmNlKVxuICAgICAgICAgICAgbWVyZ2VWYWx1ZShjdHgsIG1hcCwgaXQpO1xuICAgIGVsc2VcbiAgICAgICAgbWVyZ2VWYWx1ZShjdHgsIG1hcCwgc291cmNlKTtcbn1cbmZ1bmN0aW9uIG1lcmdlVmFsdWUoY3R4LCBtYXAsIHZhbHVlKSB7XG4gICAgY29uc3Qgc291cmNlID0gcmVzb2x2ZUFsaWFzVmFsdWUoY3R4LCB2YWx1ZSk7XG4gICAgaWYgKCFpc01hcChzb3VyY2UpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01lcmdlIHNvdXJjZXMgbXVzdCBiZSBtYXBzIG9yIG1hcCBhbGlhc2VzJyk7XG4gICAgY29uc3Qgc3JjTWFwID0gc291cmNlLnRvSlNPTihudWxsLCBjdHgsIE1hcCk7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2Ygc3JjTWFwKSB7XG4gICAgICAgIGlmIChtYXAgaW5zdGFuY2VvZiBNYXApIHtcbiAgICAgICAgICAgIGlmICghbWFwLmhhcyhrZXkpKVxuICAgICAgICAgICAgICAgIG1hcC5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobWFwIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgICAgICAgICBtYXAuYWRkKGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtYXAsIGtleSkpIHtcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtYXAsIGtleSwge1xuICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWFwO1xufVxuZnVuY3Rpb24gcmVzb2x2ZUFsaWFzVmFsdWUoY3R4LCB2YWx1ZSkge1xuICAgIHJldHVybiBjdHggJiYgaXNBbGlhcyh2YWx1ZSkgPyB2YWx1ZS5yZXNvbHZlKGN0eC5kb2MsIGN0eCkgOiB2YWx1ZTtcbn1cblxuZXhwb3J0IHsgYWRkTWVyZ2VUb0pTTWFwLCBpc01lcmdlS2V5LCBtZXJnZSB9O1xuIiwiaW1wb3J0IHsgd2FybiB9IGZyb20gJy4uL2xvZy5qcyc7XG5pbXBvcnQgeyBpc01lcmdlS2V5LCBhZGRNZXJnZVRvSlNNYXAgfSBmcm9tICcuLi9zY2hlbWEveWFtbC0xLjEvbWVyZ2UuanMnO1xuaW1wb3J0IHsgY3JlYXRlU3RyaW5naWZ5Q29udGV4dCB9IGZyb20gJy4uL3N0cmluZ2lmeS9zdHJpbmdpZnkuanMnO1xuaW1wb3J0IHsgaXNOb2RlIH0gZnJvbSAnLi9pZGVudGl0eS5qcyc7XG5pbXBvcnQgeyB0b0pTIH0gZnJvbSAnLi90b0pTLmpzJztcblxuZnVuY3Rpb24gYWRkUGFpclRvSlNNYXAoY3R4LCBtYXAsIHsga2V5LCB2YWx1ZSB9KSB7XG4gICAgaWYgKGlzTm9kZShrZXkpICYmIGtleS5hZGRUb0pTTWFwKVxuICAgICAgICBrZXkuYWRkVG9KU01hcChjdHgsIG1hcCwgdmFsdWUpO1xuICAgIC8vIFRPRE86IFNob3VsZCBkcm9wIHRoaXMgc3BlY2lhbCBjYXNlIGZvciBiYXJlIDw8IGhhbmRsaW5nXG4gICAgZWxzZSBpZiAoaXNNZXJnZUtleShjdHgsIGtleSkpXG4gICAgICAgIGFkZE1lcmdlVG9KU01hcChjdHgsIG1hcCwgdmFsdWUpO1xuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBqc0tleSA9IHRvSlMoa2V5LCAnJywgY3R4KTtcbiAgICAgICAgaWYgKG1hcCBpbnN0YW5jZW9mIE1hcCkge1xuICAgICAgICAgICAgbWFwLnNldChqc0tleSwgdG9KUyh2YWx1ZSwganNLZXksIGN0eCkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG1hcCBpbnN0YW5jZW9mIFNldCkge1xuICAgICAgICAgICAgbWFwLmFkZChqc0tleSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBzdHJpbmdLZXkgPSBzdHJpbmdpZnlLZXkoa2V5LCBqc0tleSwgY3R4KTtcbiAgICAgICAgICAgIGNvbnN0IGpzVmFsdWUgPSB0b0pTKHZhbHVlLCBzdHJpbmdLZXksIGN0eCk7XG4gICAgICAgICAgICBpZiAoc3RyaW5nS2V5IGluIG1hcClcbiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobWFwLCBzdHJpbmdLZXksIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGpzVmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBtYXBbc3RyaW5nS2V5XSA9IGpzVmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1hcDtcbn1cbmZ1bmN0aW9uIHN0cmluZ2lmeUtleShrZXksIGpzS2V5LCBjdHgpIHtcbiAgICBpZiAoanNLZXkgPT09IG51bGwpXG4gICAgICAgIHJldHVybiAnJztcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWJhc2UtdG8tc3RyaW5nXG4gICAgaWYgKHR5cGVvZiBqc0tleSAhPT0gJ29iamVjdCcpXG4gICAgICAgIHJldHVybiBTdHJpbmcoanNLZXkpO1xuICAgIGlmIChpc05vZGUoa2V5KSAmJiBjdHg/LmRvYykge1xuICAgICAgICBjb25zdCBzdHJDdHggPSBjcmVhdGVTdHJpbmdpZnlDb250ZXh0KGN0eC5kb2MsIHt9KTtcbiAgICAgICAgc3RyQ3R4LmFuY2hvcnMgPSBuZXcgU2V0KCk7XG4gICAgICAgIGZvciAoY29uc3Qgbm9kZSBvZiBjdHguYW5jaG9ycy5rZXlzKCkpXG4gICAgICAgICAgICBzdHJDdHguYW5jaG9ycy5hZGQobm9kZS5hbmNob3IpO1xuICAgICAgICBzdHJDdHguaW5GbG93ID0gdHJ1ZTtcbiAgICAgICAgc3RyQ3R4LmluU3RyaW5naWZ5S2V5ID0gdHJ1ZTtcbiAgICAgICAgY29uc3Qgc3RyS2V5ID0ga2V5LnRvU3RyaW5nKHN0ckN0eCk7XG4gICAgICAgIGlmICghY3R4Lm1hcEtleVdhcm5lZCkge1xuICAgICAgICAgICAgbGV0IGpzb25TdHIgPSBKU09OLnN0cmluZ2lmeShzdHJLZXkpO1xuICAgICAgICAgICAgaWYgKGpzb25TdHIubGVuZ3RoID4gNDApXG4gICAgICAgICAgICAgICAganNvblN0ciA9IGpzb25TdHIuc3Vic3RyaW5nKDAsIDM2KSArICcuLi5cIic7XG4gICAgICAgICAgICB3YXJuKGN0eC5kb2Mub3B0aW9ucy5sb2dMZXZlbCwgYEtleXMgd2l0aCBjb2xsZWN0aW9uIHZhbHVlcyB3aWxsIGJlIHN0cmluZ2lmaWVkIGR1ZSB0byBKUyBPYmplY3QgcmVzdHJpY3Rpb25zOiAke2pzb25TdHJ9LiBTZXQgbWFwQXNNYXA6IHRydWUgdG8gdXNlIG9iamVjdCBrZXlzLmApO1xuICAgICAgICAgICAgY3R4Lm1hcEtleVdhcm5lZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0cktleTtcbiAgICB9XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGpzS2V5KTtcbn1cblxuZXhwb3J0IHsgYWRkUGFpclRvSlNNYXAgfTtcbiIsImltcG9ydCB7IGNyZWF0ZU5vZGUgfSBmcm9tICcuLi9kb2MvY3JlYXRlTm9kZS5qcyc7XG5pbXBvcnQgeyBzdHJpbmdpZnlQYWlyIH0gZnJvbSAnLi4vc3RyaW5naWZ5L3N0cmluZ2lmeVBhaXIuanMnO1xuaW1wb3J0IHsgYWRkUGFpclRvSlNNYXAgfSBmcm9tICcuL2FkZFBhaXJUb0pTTWFwLmpzJztcbmltcG9ydCB7IE5PREVfVFlQRSwgUEFJUiwgaXNOb2RlIH0gZnJvbSAnLi9pZGVudGl0eS5qcyc7XG5cbmZ1bmN0aW9uIGNyZWF0ZVBhaXIoa2V5LCB2YWx1ZSwgY3R4KSB7XG4gICAgY29uc3QgayA9IGNyZWF0ZU5vZGUoa2V5LCB1bmRlZmluZWQsIGN0eCk7XG4gICAgY29uc3QgdiA9IGNyZWF0ZU5vZGUodmFsdWUsIHVuZGVmaW5lZCwgY3R4KTtcbiAgICByZXR1cm4gbmV3IFBhaXIoaywgdik7XG59XG5jbGFzcyBQYWlyIHtcbiAgICBjb25zdHJ1Y3RvcihrZXksIHZhbHVlID0gbnVsbCkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgTk9ERV9UWVBFLCB7IHZhbHVlOiBQQUlSIH0pO1xuICAgICAgICB0aGlzLmtleSA9IGtleTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICBjbG9uZShzY2hlbWEpIHtcbiAgICAgICAgbGV0IHsga2V5LCB2YWx1ZSB9ID0gdGhpcztcbiAgICAgICAgaWYgKGlzTm9kZShrZXkpKVxuICAgICAgICAgICAga2V5ID0ga2V5LmNsb25lKHNjaGVtYSk7XG4gICAgICAgIGlmIChpc05vZGUodmFsdWUpKVxuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5jbG9uZShzY2hlbWEpO1xuICAgICAgICByZXR1cm4gbmV3IFBhaXIoa2V5LCB2YWx1ZSk7XG4gICAgfVxuICAgIHRvSlNPTihfLCBjdHgpIHtcbiAgICAgICAgY29uc3QgcGFpciA9IGN0eD8ubWFwQXNNYXAgPyBuZXcgTWFwKCkgOiB7fTtcbiAgICAgICAgcmV0dXJuIGFkZFBhaXJUb0pTTWFwKGN0eCwgcGFpciwgdGhpcyk7XG4gICAgfVxuICAgIHRvU3RyaW5nKGN0eCwgb25Db21tZW50LCBvbkNob21wS2VlcCkge1xuICAgICAgICByZXR1cm4gY3R4Py5kb2NcbiAgICAgICAgICAgID8gc3RyaW5naWZ5UGFpcih0aGlzLCBjdHgsIG9uQ29tbWVudCwgb25DaG9tcEtlZXApXG4gICAgICAgICAgICA6IEpTT04uc3RyaW5naWZ5KHRoaXMpO1xuICAgIH1cbn1cblxuZXhwb3J0IHsgUGFpciwgY3JlYXRlUGFpciB9O1xuIiwiaW1wb3J0IHsgaXNOb2RlLCBpc1BhaXIgfSBmcm9tICcuLi9ub2Rlcy9pZGVudGl0eS5qcyc7XG5pbXBvcnQgeyBzdHJpbmdpZnkgfSBmcm9tICcuL3N0cmluZ2lmeS5qcyc7XG5pbXBvcnQgeyBsaW5lQ29tbWVudCwgaW5kZW50Q29tbWVudCB9IGZyb20gJy4vc3RyaW5naWZ5Q29tbWVudC5qcyc7XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeUNvbGxlY3Rpb24oY29sbGVjdGlvbiwgY3R4LCBvcHRpb25zKSB7XG4gICAgY29uc3QgZmxvdyA9IGN0eC5pbkZsb3cgPz8gY29sbGVjdGlvbi5mbG93O1xuICAgIGNvbnN0IHN0cmluZ2lmeSA9IGZsb3cgPyBzdHJpbmdpZnlGbG93Q29sbGVjdGlvbiA6IHN0cmluZ2lmeUJsb2NrQ29sbGVjdGlvbjtcbiAgICByZXR1cm4gc3RyaW5naWZ5KGNvbGxlY3Rpb24sIGN0eCwgb3B0aW9ucyk7XG59XG5mdW5jdGlvbiBzdHJpbmdpZnlCbG9ja0NvbGxlY3Rpb24oeyBjb21tZW50LCBpdGVtcyB9LCBjdHgsIHsgYmxvY2tJdGVtUHJlZml4LCBmbG93Q2hhcnMsIGl0ZW1JbmRlbnQsIG9uQ2hvbXBLZWVwLCBvbkNvbW1lbnQgfSkge1xuICAgIGNvbnN0IHsgaW5kZW50LCBvcHRpb25zOiB7IGNvbW1lbnRTdHJpbmcgfSB9ID0gY3R4O1xuICAgIGNvbnN0IGl0ZW1DdHggPSBPYmplY3QuYXNzaWduKHt9LCBjdHgsIHsgaW5kZW50OiBpdGVtSW5kZW50LCB0eXBlOiBudWxsIH0pO1xuICAgIGxldCBjaG9tcEtlZXAgPSBmYWxzZTsgLy8gZmxhZyBmb3IgdGhlIHByZWNlZGluZyBub2RlJ3Mgc3RhdHVzXG4gICAgY29uc3QgbGluZXMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSBpdGVtc1tpXTtcbiAgICAgICAgbGV0IGNvbW1lbnQgPSBudWxsO1xuICAgICAgICBpZiAoaXNOb2RlKGl0ZW0pKSB7XG4gICAgICAgICAgICBpZiAoIWNob21wS2VlcCAmJiBpdGVtLnNwYWNlQmVmb3JlKVxuICAgICAgICAgICAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgICAgICAgICAgYWRkQ29tbWVudEJlZm9yZShjdHgsIGxpbmVzLCBpdGVtLmNvbW1lbnRCZWZvcmUsIGNob21wS2VlcCk7XG4gICAgICAgICAgICBpZiAoaXRlbS5jb21tZW50KVxuICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBpdGVtLmNvbW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNQYWlyKGl0ZW0pKSB7XG4gICAgICAgICAgICBjb25zdCBpayA9IGlzTm9kZShpdGVtLmtleSkgPyBpdGVtLmtleSA6IG51bGw7XG4gICAgICAgICAgICBpZiAoaWspIHtcbiAgICAgICAgICAgICAgICBpZiAoIWNob21wS2VlcCAmJiBpay5zcGFjZUJlZm9yZSlcbiAgICAgICAgICAgICAgICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgICAgICAgICAgICAgYWRkQ29tbWVudEJlZm9yZShjdHgsIGxpbmVzLCBpay5jb21tZW50QmVmb3JlLCBjaG9tcEtlZXApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNob21wS2VlcCA9IGZhbHNlO1xuICAgICAgICBsZXQgc3RyID0gc3RyaW5naWZ5KGl0ZW0sIGl0ZW1DdHgsICgpID0+IChjb21tZW50ID0gbnVsbCksICgpID0+IChjaG9tcEtlZXAgPSB0cnVlKSk7XG4gICAgICAgIGlmIChjb21tZW50KVxuICAgICAgICAgICAgc3RyICs9IGxpbmVDb21tZW50KHN0ciwgaXRlbUluZGVudCwgY29tbWVudFN0cmluZyhjb21tZW50KSk7XG4gICAgICAgIGlmIChjaG9tcEtlZXAgJiYgY29tbWVudClcbiAgICAgICAgICAgIGNob21wS2VlcCA9IGZhbHNlO1xuICAgICAgICBsaW5lcy5wdXNoKGJsb2NrSXRlbVByZWZpeCArIHN0cik7XG4gICAgfVxuICAgIGxldCBzdHI7XG4gICAgaWYgKGxpbmVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBzdHIgPSBmbG93Q2hhcnMuc3RhcnQgKyBmbG93Q2hhcnMuZW5kO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgc3RyID0gbGluZXNbMF07XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgbGluZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGNvbnN0IGxpbmUgPSBsaW5lc1tpXTtcbiAgICAgICAgICAgIHN0ciArPSBsaW5lID8gYFxcbiR7aW5kZW50fSR7bGluZX1gIDogJ1xcbic7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNvbW1lbnQpIHtcbiAgICAgICAgc3RyICs9ICdcXG4nICsgaW5kZW50Q29tbWVudChjb21tZW50U3RyaW5nKGNvbW1lbnQpLCBpbmRlbnQpO1xuICAgICAgICBpZiAob25Db21tZW50KVxuICAgICAgICAgICAgb25Db21tZW50KCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGNob21wS2VlcCAmJiBvbkNob21wS2VlcClcbiAgICAgICAgb25DaG9tcEtlZXAoKTtcbiAgICByZXR1cm4gc3RyO1xufVxuZnVuY3Rpb24gc3RyaW5naWZ5Rmxvd0NvbGxlY3Rpb24oeyBpdGVtcyB9LCBjdHgsIHsgZmxvd0NoYXJzLCBpdGVtSW5kZW50IH0pIHtcbiAgICBjb25zdCB7IGluZGVudCwgaW5kZW50U3RlcCwgZmxvd0NvbGxlY3Rpb25QYWRkaW5nOiBmY1BhZGRpbmcsIG9wdGlvbnM6IHsgY29tbWVudFN0cmluZyB9IH0gPSBjdHg7XG4gICAgaXRlbUluZGVudCArPSBpbmRlbnRTdGVwO1xuICAgIGNvbnN0IGl0ZW1DdHggPSBPYmplY3QuYXNzaWduKHt9LCBjdHgsIHtcbiAgICAgICAgaW5kZW50OiBpdGVtSW5kZW50LFxuICAgICAgICBpbkZsb3c6IHRydWUsXG4gICAgICAgIHR5cGU6IG51bGxcbiAgICB9KTtcbiAgICBsZXQgcmVxTmV3bGluZSA9IGZhbHNlO1xuICAgIGxldCBsaW5lc0F0VmFsdWUgPSAwO1xuICAgIGNvbnN0IGxpbmVzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7ICsraSkge1xuICAgICAgICBjb25zdCBpdGVtID0gaXRlbXNbaV07XG4gICAgICAgIGxldCBjb21tZW50ID0gbnVsbDtcbiAgICAgICAgaWYgKGlzTm9kZShpdGVtKSkge1xuICAgICAgICAgICAgaWYgKGl0ZW0uc3BhY2VCZWZvcmUpXG4gICAgICAgICAgICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgICAgICAgICBhZGRDb21tZW50QmVmb3JlKGN0eCwgbGluZXMsIGl0ZW0uY29tbWVudEJlZm9yZSwgZmFsc2UpO1xuICAgICAgICAgICAgaWYgKGl0ZW0uY29tbWVudClcbiAgICAgICAgICAgICAgICBjb21tZW50ID0gaXRlbS5jb21tZW50O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzUGFpcihpdGVtKSkge1xuICAgICAgICAgICAgY29uc3QgaWsgPSBpc05vZGUoaXRlbS5rZXkpID8gaXRlbS5rZXkgOiBudWxsO1xuICAgICAgICAgICAgaWYgKGlrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlrLnNwYWNlQmVmb3JlKVxuICAgICAgICAgICAgICAgICAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICAgICAgICAgICAgICBhZGRDb21tZW50QmVmb3JlKGN0eCwgbGluZXMsIGlrLmNvbW1lbnRCZWZvcmUsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBpZiAoaWsuY29tbWVudClcbiAgICAgICAgICAgICAgICAgICAgcmVxTmV3bGluZSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBpdiA9IGlzTm9kZShpdGVtLnZhbHVlKSA/IGl0ZW0udmFsdWUgOiBudWxsO1xuICAgICAgICAgICAgaWYgKGl2KSB7XG4gICAgICAgICAgICAgICAgaWYgKGl2LmNvbW1lbnQpXG4gICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBpdi5jb21tZW50O1xuICAgICAgICAgICAgICAgIGlmIChpdi5jb21tZW50QmVmb3JlKVxuICAgICAgICAgICAgICAgICAgICByZXFOZXdsaW5lID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGl0ZW0udmFsdWUgPT0gbnVsbCAmJiBpaz8uY29tbWVudCkge1xuICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBpay5jb21tZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjb21tZW50KVxuICAgICAgICAgICAgcmVxTmV3bGluZSA9IHRydWU7XG4gICAgICAgIGxldCBzdHIgPSBzdHJpbmdpZnkoaXRlbSwgaXRlbUN0eCwgKCkgPT4gKGNvbW1lbnQgPSBudWxsKSk7XG4gICAgICAgIHJlcU5ld2xpbmUgfHwgKHJlcU5ld2xpbmUgPSBsaW5lcy5sZW5ndGggPiBsaW5lc0F0VmFsdWUgfHwgc3RyLmluY2x1ZGVzKCdcXG4nKSk7XG4gICAgICAgIGlmIChpIDwgaXRlbXMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgc3RyICs9ICcsJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjdHgub3B0aW9ucy50cmFpbGluZ0NvbW1hKSB7XG4gICAgICAgICAgICBpZiAoY3R4Lm9wdGlvbnMubGluZVdpZHRoID4gMCkge1xuICAgICAgICAgICAgICAgIHJlcU5ld2xpbmUgfHwgKHJlcU5ld2xpbmUgPSBsaW5lcy5yZWR1Y2UoKHN1bSwgbGluZSkgPT4gc3VtICsgbGluZS5sZW5ndGggKyAyLCAyKSArXG4gICAgICAgICAgICAgICAgICAgIChzdHIubGVuZ3RoICsgMikgPlxuICAgICAgICAgICAgICAgICAgICBjdHgub3B0aW9ucy5saW5lV2lkdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlcU5ld2xpbmUpIHtcbiAgICAgICAgICAgICAgICBzdHIgKz0gJywnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjb21tZW50KVxuICAgICAgICAgICAgc3RyICs9IGxpbmVDb21tZW50KHN0ciwgaXRlbUluZGVudCwgY29tbWVudFN0cmluZyhjb21tZW50KSk7XG4gICAgICAgIGxpbmVzLnB1c2goc3RyKTtcbiAgICAgICAgbGluZXNBdFZhbHVlID0gbGluZXMubGVuZ3RoO1xuICAgIH1cbiAgICBjb25zdCB7IHN0YXJ0LCBlbmQgfSA9IGZsb3dDaGFycztcbiAgICBpZiAobGluZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBzdGFydCArIGVuZDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlmICghcmVxTmV3bGluZSkge1xuICAgICAgICAgICAgY29uc3QgbGVuID0gbGluZXMucmVkdWNlKChzdW0sIGxpbmUpID0+IHN1bSArIGxpbmUubGVuZ3RoICsgMiwgMik7XG4gICAgICAgICAgICByZXFOZXdsaW5lID0gY3R4Lm9wdGlvbnMubGluZVdpZHRoID4gMCAmJiBsZW4gPiBjdHgub3B0aW9ucy5saW5lV2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlcU5ld2xpbmUpIHtcbiAgICAgICAgICAgIGxldCBzdHIgPSBzdGFydDtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcylcbiAgICAgICAgICAgICAgICBzdHIgKz0gbGluZSA/IGBcXG4ke2luZGVudFN0ZXB9JHtpbmRlbnR9JHtsaW5lfWAgOiAnXFxuJztcbiAgICAgICAgICAgIHJldHVybiBgJHtzdHJ9XFxuJHtpbmRlbnR9JHtlbmR9YDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBgJHtzdGFydH0ke2ZjUGFkZGluZ30ke2xpbmVzLmpvaW4oJyAnKX0ke2ZjUGFkZGluZ30ke2VuZH1gO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gYWRkQ29tbWVudEJlZm9yZSh7IGluZGVudCwgb3B0aW9uczogeyBjb21tZW50U3RyaW5nIH0gfSwgbGluZXMsIGNvbW1lbnQsIGNob21wS2VlcCkge1xuICAgIGlmIChjb21tZW50ICYmIGNob21wS2VlcClcbiAgICAgICAgY29tbWVudCA9IGNvbW1lbnQucmVwbGFjZSgvXlxcbisvLCAnJyk7XG4gICAgaWYgKGNvbW1lbnQpIHtcbiAgICAgICAgY29uc3QgaWMgPSBpbmRlbnRDb21tZW50KGNvbW1lbnRTdHJpbmcoY29tbWVudCksIGluZGVudCk7XG4gICAgICAgIGxpbmVzLnB1c2goaWMudHJpbVN0YXJ0KCkpOyAvLyBBdm9pZCBkb3VibGUgaW5kZW50IG9uIGZpcnN0IGxpbmVcbiAgICB9XG59XG5cbmV4cG9ydCB7IHN0cmluZ2lmeUNvbGxlY3Rpb24gfTtcbiIsImltcG9ydCB7IHN0cmluZ2lmeUNvbGxlY3Rpb24gfSBmcm9tICcuLi9zdHJpbmdpZnkvc3RyaW5naWZ5Q29sbGVjdGlvbi5qcyc7XG5pbXBvcnQgeyBhZGRQYWlyVG9KU01hcCB9IGZyb20gJy4vYWRkUGFpclRvSlNNYXAuanMnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbiB9IGZyb20gJy4vQ29sbGVjdGlvbi5qcyc7XG5pbXBvcnQgeyBNQVAsIGlzUGFpciwgaXNTY2FsYXIgfSBmcm9tICcuL2lkZW50aXR5LmpzJztcbmltcG9ydCB7IFBhaXIsIGNyZWF0ZVBhaXIgfSBmcm9tICcuL1BhaXIuanMnO1xuaW1wb3J0IHsgaXNTY2FsYXJWYWx1ZSB9IGZyb20gJy4vU2NhbGFyLmpzJztcblxuZnVuY3Rpb24gZmluZFBhaXIoaXRlbXMsIGtleSkge1xuICAgIGNvbnN0IGsgPSBpc1NjYWxhcihrZXkpID8ga2V5LnZhbHVlIDoga2V5O1xuICAgIGZvciAoY29uc3QgaXQgb2YgaXRlbXMpIHtcbiAgICAgICAgaWYgKGlzUGFpcihpdCkpIHtcbiAgICAgICAgICAgIGlmIChpdC5rZXkgPT09IGtleSB8fCBpdC5rZXkgPT09IGspXG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0O1xuICAgICAgICAgICAgaWYgKGlzU2NhbGFyKGl0LmtleSkgJiYgaXQua2V5LnZhbHVlID09PSBrKVxuICAgICAgICAgICAgICAgIHJldHVybiBpdDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xufVxuY2xhc3MgWUFNTE1hcCBleHRlbmRzIENvbGxlY3Rpb24ge1xuICAgIHN0YXRpYyBnZXQgdGFnTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuICd0YWc6eWFtbC5vcmcsMjAwMjptYXAnO1xuICAgIH1cbiAgICBjb25zdHJ1Y3RvcihzY2hlbWEpIHtcbiAgICAgICAgc3VwZXIoTUFQLCBzY2hlbWEpO1xuICAgICAgICB0aGlzLml0ZW1zID0gW107XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgZ2VuZXJpYyBjb2xsZWN0aW9uIHBhcnNpbmcgbWV0aG9kIHRoYXQgY2FuIGJlIGV4dGVuZGVkXG4gICAgICogdG8gb3RoZXIgbm9kZSBjbGFzc2VzIHRoYXQgaW5oZXJpdCBmcm9tIFlBTUxNYXBcbiAgICAgKi9cbiAgICBzdGF0aWMgZnJvbShzY2hlbWEsIG9iaiwgY3R4KSB7XG4gICAgICAgIGNvbnN0IHsga2VlcFVuZGVmaW5lZCwgcmVwbGFjZXIgfSA9IGN0eDtcbiAgICAgICAgY29uc3QgbWFwID0gbmV3IHRoaXMoc2NoZW1hKTtcbiAgICAgICAgY29uc3QgYWRkID0gKGtleSwgdmFsdWUpID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcmVwbGFjZXIgPT09ICdmdW5jdGlvbicpXG4gICAgICAgICAgICAgICAgdmFsdWUgPSByZXBsYWNlci5jYWxsKG9iaiwga2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHJlcGxhY2VyKSAmJiAhcmVwbGFjZXIuaW5jbHVkZXMoa2V5KSlcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCB8fCBrZWVwVW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgIG1hcC5pdGVtcy5wdXNoKGNyZWF0ZVBhaXIoa2V5LCB2YWx1ZSwgY3R4KSk7XG4gICAgICAgIH07XG4gICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBNYXApIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIG9iailcbiAgICAgICAgICAgICAgICBhZGQoa2V5LCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAob2JqICYmIHR5cGVvZiBvYmogPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhvYmopKVxuICAgICAgICAgICAgICAgIGFkZChrZXksIG9ialtrZXldKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHNjaGVtYS5zb3J0TWFwRW50cmllcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgbWFwLml0ZW1zLnNvcnQoc2NoZW1hLnNvcnRNYXBFbnRyaWVzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWFwO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgdmFsdWUgdG8gdGhlIGNvbGxlY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3ZlcndyaXRlIC0gSWYgbm90IHNldCBgdHJ1ZWAsIHVzaW5nIGEga2V5IHRoYXQgaXMgYWxyZWFkeSBpbiB0aGVcbiAgICAgKiAgIGNvbGxlY3Rpb24gd2lsbCB0aHJvdy4gT3RoZXJ3aXNlLCBvdmVyd3JpdGVzIHRoZSBwcmV2aW91cyB2YWx1ZS5cbiAgICAgKi9cbiAgICBhZGQocGFpciwgb3ZlcndyaXRlKSB7XG4gICAgICAgIGxldCBfcGFpcjtcbiAgICAgICAgaWYgKGlzUGFpcihwYWlyKSlcbiAgICAgICAgICAgIF9wYWlyID0gcGFpcjtcbiAgICAgICAgZWxzZSBpZiAoIXBhaXIgfHwgdHlwZW9mIHBhaXIgIT09ICdvYmplY3QnIHx8ICEoJ2tleScgaW4gcGFpcikpIHtcbiAgICAgICAgICAgIC8vIEluIFR5cGVTY3JpcHQsIHRoaXMgbmV2ZXIgaGFwcGVucy5cbiAgICAgICAgICAgIF9wYWlyID0gbmV3IFBhaXIocGFpciwgcGFpcj8udmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIF9wYWlyID0gbmV3IFBhaXIocGFpci5rZXksIHBhaXIudmFsdWUpO1xuICAgICAgICBjb25zdCBwcmV2ID0gZmluZFBhaXIodGhpcy5pdGVtcywgX3BhaXIua2V5KTtcbiAgICAgICAgY29uc3Qgc29ydEVudHJpZXMgPSB0aGlzLnNjaGVtYT8uc29ydE1hcEVudHJpZXM7XG4gICAgICAgIGlmIChwcmV2KSB7XG4gICAgICAgICAgICBpZiAoIW92ZXJ3cml0ZSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEtleSAke19wYWlyLmtleX0gYWxyZWFkeSBzZXRgKTtcbiAgICAgICAgICAgIC8vIEZvciBzY2FsYXJzLCBrZWVwIHRoZSBvbGQgbm9kZSAmIGl0cyBjb21tZW50cyBhbmQgYW5jaG9yc1xuICAgICAgICAgICAgaWYgKGlzU2NhbGFyKHByZXYudmFsdWUpICYmIGlzU2NhbGFyVmFsdWUoX3BhaXIudmFsdWUpKVxuICAgICAgICAgICAgICAgIHByZXYudmFsdWUudmFsdWUgPSBfcGFpci52YWx1ZTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBwcmV2LnZhbHVlID0gX3BhaXIudmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc29ydEVudHJpZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGkgPSB0aGlzLml0ZW1zLmZpbmRJbmRleChpdGVtID0+IHNvcnRFbnRyaWVzKF9wYWlyLCBpdGVtKSA8IDApO1xuICAgICAgICAgICAgaWYgKGkgPT09IC0xKVxuICAgICAgICAgICAgICAgIHRoaXMuaXRlbXMucHVzaChfcGFpcik7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdGhpcy5pdGVtcy5zcGxpY2UoaSwgMCwgX3BhaXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5pdGVtcy5wdXNoKF9wYWlyKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBkZWxldGUoa2V5KSB7XG4gICAgICAgIGNvbnN0IGl0ID0gZmluZFBhaXIodGhpcy5pdGVtcywga2V5KTtcbiAgICAgICAgaWYgKCFpdClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgZGVsID0gdGhpcy5pdGVtcy5zcGxpY2UodGhpcy5pdGVtcy5pbmRleE9mKGl0KSwgMSk7XG4gICAgICAgIHJldHVybiBkZWwubGVuZ3RoID4gMDtcbiAgICB9XG4gICAgZ2V0KGtleSwga2VlcFNjYWxhcikge1xuICAgICAgICBjb25zdCBpdCA9IGZpbmRQYWlyKHRoaXMuaXRlbXMsIGtleSk7XG4gICAgICAgIGNvbnN0IG5vZGUgPSBpdD8udmFsdWU7XG4gICAgICAgIHJldHVybiAoIWtlZXBTY2FsYXIgJiYgaXNTY2FsYXIobm9kZSkgPyBub2RlLnZhbHVlIDogbm9kZSkgPz8gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBoYXMoa2V5KSB7XG4gICAgICAgIHJldHVybiAhIWZpbmRQYWlyKHRoaXMuaXRlbXMsIGtleSk7XG4gICAgfVxuICAgIHNldChrZXksIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuYWRkKG5ldyBQYWlyKGtleSwgdmFsdWUpLCB0cnVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIGN0eCAtIENvbnZlcnNpb24gY29udGV4dCwgb3JpZ2luYWxseSBzZXQgaW4gRG9jdW1lbnQjdG9KUygpXG4gICAgICogQHBhcmFtIHtDbGFzc30gVHlwZSAtIElmIHNldCwgZm9yY2VzIHRoZSByZXR1cm5lZCBjb2xsZWN0aW9uIHR5cGVcbiAgICAgKiBAcmV0dXJucyBJbnN0YW5jZSBvZiBUeXBlLCBNYXAsIG9yIE9iamVjdFxuICAgICAqL1xuICAgIHRvSlNPTihfLCBjdHgsIFR5cGUpIHtcbiAgICAgICAgY29uc3QgbWFwID0gVHlwZSA/IG5ldyBUeXBlKCkgOiBjdHg/Lm1hcEFzTWFwID8gbmV3IE1hcCgpIDoge307XG4gICAgICAgIGlmIChjdHg/Lm9uQ3JlYXRlKVxuICAgICAgICAgICAgY3R4Lm9uQ3JlYXRlKG1hcCk7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLml0ZW1zKVxuICAgICAgICAgICAgYWRkUGFpclRvSlNNYXAoY3R4LCBtYXAsIGl0ZW0pO1xuICAgICAgICByZXR1cm4gbWFwO1xuICAgIH1cbiAgICB0b1N0cmluZyhjdHgsIG9uQ29tbWVudCwgb25DaG9tcEtlZXApIHtcbiAgICAgICAgaWYgKCFjdHgpXG4gICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcyk7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLml0ZW1zKSB7XG4gICAgICAgICAgICBpZiAoIWlzUGFpcihpdGVtKSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1hcCBpdGVtcyBtdXN0IGFsbCBiZSBwYWlyczsgZm91bmQgJHtKU09OLnN0cmluZ2lmeShpdGVtKX0gaW5zdGVhZGApO1xuICAgICAgICB9XG4gICAgICAgIGlmICghY3R4LmFsbE51bGxWYWx1ZXMgJiYgdGhpcy5oYXNBbGxOdWxsVmFsdWVzKGZhbHNlKSlcbiAgICAgICAgICAgIGN0eCA9IE9iamVjdC5hc3NpZ24oe30sIGN0eCwgeyBhbGxOdWxsVmFsdWVzOiB0cnVlIH0pO1xuICAgICAgICByZXR1cm4gc3RyaW5naWZ5Q29sbGVjdGlvbih0aGlzLCBjdHgsIHtcbiAgICAgICAgICAgIGJsb2NrSXRlbVByZWZpeDogJycsXG4gICAgICAgICAgICBmbG93Q2hhcnM6IHsgc3RhcnQ6ICd7JywgZW5kOiAnfScgfSxcbiAgICAgICAgICAgIGl0ZW1JbmRlbnQ6IGN0eC5pbmRlbnQgfHwgJycsXG4gICAgICAgICAgICBvbkNob21wS2VlcCxcbiAgICAgICAgICAgIG9uQ29tbWVudFxuICAgICAgICB9KTtcbiAgICB9XG59XG5cbmV4cG9ydCB7IFlBTUxNYXAsIGZpbmRQYWlyIH07XG4iLCJpbXBvcnQgeyBpc01hcCB9IGZyb20gJy4uLy4uL25vZGVzL2lkZW50aXR5LmpzJztcbmltcG9ydCB7IFlBTUxNYXAgfSBmcm9tICcuLi8uLi9ub2Rlcy9ZQU1MTWFwLmpzJztcblxuY29uc3QgbWFwID0ge1xuICAgIGNvbGxlY3Rpb246ICdtYXAnLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgbm9kZUNsYXNzOiBZQU1MTWFwLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOm1hcCcsXG4gICAgcmVzb2x2ZShtYXAsIG9uRXJyb3IpIHtcbiAgICAgICAgaWYgKCFpc01hcChtYXApKVxuICAgICAgICAgICAgb25FcnJvcignRXhwZWN0ZWQgYSBtYXBwaW5nIGZvciB0aGlzIHRhZycpO1xuICAgICAgICByZXR1cm4gbWFwO1xuICAgIH0sXG4gICAgY3JlYXRlTm9kZTogKHNjaGVtYSwgb2JqLCBjdHgpID0+IFlBTUxNYXAuZnJvbShzY2hlbWEsIG9iaiwgY3R4KVxufTtcblxuZXhwb3J0IHsgbWFwIH07XG4iLCJpbXBvcnQgeyBjcmVhdGVOb2RlIH0gZnJvbSAnLi4vZG9jL2NyZWF0ZU5vZGUuanMnO1xuaW1wb3J0IHsgc3RyaW5naWZ5Q29sbGVjdGlvbiB9IGZyb20gJy4uL3N0cmluZ2lmeS9zdHJpbmdpZnlDb2xsZWN0aW9uLmpzJztcbmltcG9ydCB7IENvbGxlY3Rpb24gfSBmcm9tICcuL0NvbGxlY3Rpb24uanMnO1xuaW1wb3J0IHsgU0VRLCBpc1NjYWxhciB9IGZyb20gJy4vaWRlbnRpdHkuanMnO1xuaW1wb3J0IHsgaXNTY2FsYXJWYWx1ZSB9IGZyb20gJy4vU2NhbGFyLmpzJztcbmltcG9ydCB7IHRvSlMgfSBmcm9tICcuL3RvSlMuanMnO1xuXG5jbGFzcyBZQU1MU2VxIGV4dGVuZHMgQ29sbGVjdGlvbiB7XG4gICAgc3RhdGljIGdldCB0YWdOYW1lKCkge1xuICAgICAgICByZXR1cm4gJ3RhZzp5YW1sLm9yZywyMDAyOnNlcSc7XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKHNjaGVtYSkge1xuICAgICAgICBzdXBlcihTRVEsIHNjaGVtYSk7XG4gICAgICAgIHRoaXMuaXRlbXMgPSBbXTtcbiAgICB9XG4gICAgYWRkKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuaXRlbXMucHVzaCh2YWx1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYSB2YWx1ZSBmcm9tIHRoZSBjb2xsZWN0aW9uLlxuICAgICAqXG4gICAgICogYGtleWAgbXVzdCBjb250YWluIGEgcmVwcmVzZW50YXRpb24gb2YgYW4gaW50ZWdlciBmb3IgdGhpcyB0byBzdWNjZWVkLlxuICAgICAqIEl0IG1heSBiZSB3cmFwcGVkIGluIGEgYFNjYWxhcmAuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGl0ZW0gd2FzIGZvdW5kIGFuZCByZW1vdmVkLlxuICAgICAqL1xuICAgIGRlbGV0ZShrZXkpIHtcbiAgICAgICAgY29uc3QgaWR4ID0gYXNJdGVtSW5kZXgoa2V5KTtcbiAgICAgICAgaWYgKHR5cGVvZiBpZHggIT09ICdudW1iZXInKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjb25zdCBkZWwgPSB0aGlzLml0ZW1zLnNwbGljZShpZHgsIDEpO1xuICAgICAgICByZXR1cm4gZGVsLmxlbmd0aCA+IDA7XG4gICAgfVxuICAgIGdldChrZXksIGtlZXBTY2FsYXIpIHtcbiAgICAgICAgY29uc3QgaWR4ID0gYXNJdGVtSW5kZXgoa2V5KTtcbiAgICAgICAgaWYgKHR5cGVvZiBpZHggIT09ICdudW1iZXInKVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgaXQgPSB0aGlzLml0ZW1zW2lkeF07XG4gICAgICAgIHJldHVybiAha2VlcFNjYWxhciAmJiBpc1NjYWxhcihpdCkgPyBpdC52YWx1ZSA6IGl0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhlIGNvbGxlY3Rpb24gaW5jbHVkZXMgYSB2YWx1ZSB3aXRoIHRoZSBrZXkgYGtleWAuXG4gICAgICpcbiAgICAgKiBga2V5YCBtdXN0IGNvbnRhaW4gYSByZXByZXNlbnRhdGlvbiBvZiBhbiBpbnRlZ2VyIGZvciB0aGlzIHRvIHN1Y2NlZWQuXG4gICAgICogSXQgbWF5IGJlIHdyYXBwZWQgaW4gYSBgU2NhbGFyYC5cbiAgICAgKi9cbiAgICBoYXMoa2V5KSB7XG4gICAgICAgIGNvbnN0IGlkeCA9IGFzSXRlbUluZGV4KGtleSk7XG4gICAgICAgIHJldHVybiB0eXBlb2YgaWR4ID09PSAnbnVtYmVyJyAmJiBpZHggPCB0aGlzLml0ZW1zLmxlbmd0aDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyBhIHZhbHVlIGluIHRoaXMgY29sbGVjdGlvbi4gRm9yIGAhIXNldGAsIGB2YWx1ZWAgbmVlZHMgdG8gYmUgYVxuICAgICAqIGJvb2xlYW4gdG8gYWRkL3JlbW92ZSB0aGUgaXRlbSBmcm9tIHRoZSBzZXQuXG4gICAgICpcbiAgICAgKiBJZiBga2V5YCBkb2VzIG5vdCBjb250YWluIGEgcmVwcmVzZW50YXRpb24gb2YgYW4gaW50ZWdlciwgdGhpcyB3aWxsIHRocm93LlxuICAgICAqIEl0IG1heSBiZSB3cmFwcGVkIGluIGEgYFNjYWxhcmAuXG4gICAgICovXG4gICAgc2V0KGtleSwgdmFsdWUpIHtcbiAgICAgICAgY29uc3QgaWR4ID0gYXNJdGVtSW5kZXgoa2V5KTtcbiAgICAgICAgaWYgKHR5cGVvZiBpZHggIT09ICdudW1iZXInKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBhIHZhbGlkIGluZGV4LCBub3QgJHtrZXl9LmApO1xuICAgICAgICBjb25zdCBwcmV2ID0gdGhpcy5pdGVtc1tpZHhdO1xuICAgICAgICBpZiAoaXNTY2FsYXIocHJldikgJiYgaXNTY2FsYXJWYWx1ZSh2YWx1ZSkpXG4gICAgICAgICAgICBwcmV2LnZhbHVlID0gdmFsdWU7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRoaXMuaXRlbXNbaWR4XSA9IHZhbHVlO1xuICAgIH1cbiAgICB0b0pTT04oXywgY3R4KSB7XG4gICAgICAgIGNvbnN0IHNlcSA9IFtdO1xuICAgICAgICBpZiAoY3R4Py5vbkNyZWF0ZSlcbiAgICAgICAgICAgIGN0eC5vbkNyZWF0ZShzZXEpO1xuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLml0ZW1zKVxuICAgICAgICAgICAgc2VxLnB1c2godG9KUyhpdGVtLCBTdHJpbmcoaSsrKSwgY3R4KSk7XG4gICAgICAgIHJldHVybiBzZXE7XG4gICAgfVxuICAgIHRvU3RyaW5nKGN0eCwgb25Db21tZW50LCBvbkNob21wS2VlcCkge1xuICAgICAgICBpZiAoIWN0eClcbiAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzKTtcbiAgICAgICAgcmV0dXJuIHN0cmluZ2lmeUNvbGxlY3Rpb24odGhpcywgY3R4LCB7XG4gICAgICAgICAgICBibG9ja0l0ZW1QcmVmaXg6ICctICcsXG4gICAgICAgICAgICBmbG93Q2hhcnM6IHsgc3RhcnQ6ICdbJywgZW5kOiAnXScgfSxcbiAgICAgICAgICAgIGl0ZW1JbmRlbnQ6IChjdHguaW5kZW50IHx8ICcnKSArICcgICcsXG4gICAgICAgICAgICBvbkNob21wS2VlcCxcbiAgICAgICAgICAgIG9uQ29tbWVudFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIGZyb20oc2NoZW1hLCBvYmosIGN0eCkge1xuICAgICAgICBjb25zdCB7IHJlcGxhY2VyIH0gPSBjdHg7XG4gICAgICAgIGNvbnN0IHNlcSA9IG5ldyB0aGlzKHNjaGVtYSk7XG4gICAgICAgIGlmIChvYmogJiYgU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChvYmopKSB7XG4gICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICBmb3IgKGxldCBpdCBvZiBvYmopIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlcGxhY2VyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IG9iaiBpbnN0YW5jZW9mIFNldCA/IGl0IDogU3RyaW5nKGkrKyk7XG4gICAgICAgICAgICAgICAgICAgIGl0ID0gcmVwbGFjZXIuY2FsbChvYmosIGtleSwgaXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzZXEuaXRlbXMucHVzaChjcmVhdGVOb2RlKGl0LCB1bmRlZmluZWQsIGN0eCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZXE7XG4gICAgfVxufVxuZnVuY3Rpb24gYXNJdGVtSW5kZXgoa2V5KSB7XG4gICAgbGV0IGlkeCA9IGlzU2NhbGFyKGtleSkgPyBrZXkudmFsdWUgOiBrZXk7XG4gICAgaWYgKGlkeCAmJiB0eXBlb2YgaWR4ID09PSAnc3RyaW5nJylcbiAgICAgICAgaWR4ID0gTnVtYmVyKGlkeCk7XG4gICAgcmV0dXJuIHR5cGVvZiBpZHggPT09ICdudW1iZXInICYmIE51bWJlci5pc0ludGVnZXIoaWR4KSAmJiBpZHggPj0gMFxuICAgICAgICA/IGlkeFxuICAgICAgICA6IG51bGw7XG59XG5cbmV4cG9ydCB7IFlBTUxTZXEgfTtcbiIsImltcG9ydCB7IGlzU2VxIH0gZnJvbSAnLi4vLi4vbm9kZXMvaWRlbnRpdHkuanMnO1xuaW1wb3J0IHsgWUFNTFNlcSB9IGZyb20gJy4uLy4uL25vZGVzL1lBTUxTZXEuanMnO1xuXG5jb25zdCBzZXEgPSB7XG4gICAgY29sbGVjdGlvbjogJ3NlcScsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgICBub2RlQ2xhc3M6IFlBTUxTZXEsXG4gICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6c2VxJyxcbiAgICByZXNvbHZlKHNlcSwgb25FcnJvcikge1xuICAgICAgICBpZiAoIWlzU2VxKHNlcSkpXG4gICAgICAgICAgICBvbkVycm9yKCdFeHBlY3RlZCBhIHNlcXVlbmNlIGZvciB0aGlzIHRhZycpO1xuICAgICAgICByZXR1cm4gc2VxO1xuICAgIH0sXG4gICAgY3JlYXRlTm9kZTogKHNjaGVtYSwgb2JqLCBjdHgpID0+IFlBTUxTZXEuZnJvbShzY2hlbWEsIG9iaiwgY3R4KVxufTtcblxuZXhwb3J0IHsgc2VxIH07XG4iLCJpbXBvcnQgeyBzdHJpbmdpZnlTdHJpbmcgfSBmcm9tICcuLi8uLi9zdHJpbmdpZnkvc3RyaW5naWZ5U3RyaW5nLmpzJztcblxuY29uc3Qgc3RyaW5nID0ge1xuICAgIGlkZW50aWZ5OiB2YWx1ZSA9PiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6c3RyJyxcbiAgICByZXNvbHZlOiBzdHIgPT4gc3RyLFxuICAgIHN0cmluZ2lmeShpdGVtLCBjdHgsIG9uQ29tbWVudCwgb25DaG9tcEtlZXApIHtcbiAgICAgICAgY3R4ID0gT2JqZWN0LmFzc2lnbih7IGFjdHVhbFN0cmluZzogdHJ1ZSB9LCBjdHgpO1xuICAgICAgICByZXR1cm4gc3RyaW5naWZ5U3RyaW5nKGl0ZW0sIGN0eCwgb25Db21tZW50LCBvbkNob21wS2VlcCk7XG4gICAgfVxufTtcblxuZXhwb3J0IHsgc3RyaW5nIH07XG4iLCJpbXBvcnQgeyBTY2FsYXIgfSBmcm9tICcuLi8uLi9ub2Rlcy9TY2FsYXIuanMnO1xuXG5jb25zdCBudWxsVGFnID0ge1xuICAgIGlkZW50aWZ5OiB2YWx1ZSA9PiB2YWx1ZSA9PSBudWxsLFxuICAgIGNyZWF0ZU5vZGU6ICgpID0+IG5ldyBTY2FsYXIobnVsbCksXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjpudWxsJyxcbiAgICB0ZXN0OiAvXig/On58W05uXXVsbHxOVUxMKT8kLyxcbiAgICByZXNvbHZlOiAoKSA9PiBuZXcgU2NhbGFyKG51bGwpLFxuICAgIHN0cmluZ2lmeTogKHsgc291cmNlIH0sIGN0eCkgPT4gdHlwZW9mIHNvdXJjZSA9PT0gJ3N0cmluZycgJiYgbnVsbFRhZy50ZXN0LnRlc3Qoc291cmNlKVxuICAgICAgICA/IHNvdXJjZVxuICAgICAgICA6IGN0eC5vcHRpb25zLm51bGxTdHJcbn07XG5cbmV4cG9ydCB7IG51bGxUYWcgfTtcbiIsImltcG9ydCB7IFNjYWxhciB9IGZyb20gJy4uLy4uL25vZGVzL1NjYWxhci5qcyc7XG5cbmNvbnN0IGJvb2xUYWcgPSB7XG4gICAgaWRlbnRpZnk6IHZhbHVlID0+IHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6Ym9vbCcsXG4gICAgdGVzdDogL14oPzpbVHRdcnVlfFRSVUV8W0ZmXWFsc2V8RkFMU0UpJC8sXG4gICAgcmVzb2x2ZTogc3RyID0+IG5ldyBTY2FsYXIoc3RyWzBdID09PSAndCcgfHwgc3RyWzBdID09PSAnVCcpLFxuICAgIHN0cmluZ2lmeSh7IHNvdXJjZSwgdmFsdWUgfSwgY3R4KSB7XG4gICAgICAgIGlmIChzb3VyY2UgJiYgYm9vbFRhZy50ZXN0LnRlc3Qoc291cmNlKSkge1xuICAgICAgICAgICAgY29uc3Qgc3YgPSBzb3VyY2VbMF0gPT09ICd0JyB8fCBzb3VyY2VbMF0gPT09ICdUJztcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gc3YpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWUgPyBjdHgub3B0aW9ucy50cnVlU3RyIDogY3R4Lm9wdGlvbnMuZmFsc2VTdHI7XG4gICAgfVxufTtcblxuZXhwb3J0IHsgYm9vbFRhZyB9O1xuIiwiZnVuY3Rpb24gc3RyaW5naWZ5TnVtYmVyKHsgZm9ybWF0LCBtaW5GcmFjdGlvbkRpZ2l0cywgdGFnLCB2YWx1ZSB9KSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2JpZ2ludCcpXG4gICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICAgIGNvbnN0IG51bSA9IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgPyB2YWx1ZSA6IE51bWJlcih2YWx1ZSk7XG4gICAgaWYgKCFpc0Zpbml0ZShudW0pKVxuICAgICAgICByZXR1cm4gaXNOYU4obnVtKSA/ICcubmFuJyA6IG51bSA8IDAgPyAnLS5pbmYnIDogJy5pbmYnO1xuICAgIGxldCBuID0gT2JqZWN0LmlzKHZhbHVlLCAtMCkgPyAnLTAnIDogSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICAgIGlmICghZm9ybWF0ICYmXG4gICAgICAgIG1pbkZyYWN0aW9uRGlnaXRzICYmXG4gICAgICAgICghdGFnIHx8IHRhZyA9PT0gJ3RhZzp5YW1sLm9yZywyMDAyOmZsb2F0JykgJiZcbiAgICAgICAgL14tP1xcZC8udGVzdChuKSAmJlxuICAgICAgICAhbi5pbmNsdWRlcygnZScpKSB7XG4gICAgICAgIGxldCBpID0gbi5pbmRleE9mKCcuJyk7XG4gICAgICAgIGlmIChpIDwgMCkge1xuICAgICAgICAgICAgaSA9IG4ubGVuZ3RoO1xuICAgICAgICAgICAgbiArPSAnLic7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGQgPSBtaW5GcmFjdGlvbkRpZ2l0cyAtIChuLmxlbmd0aCAtIGkgLSAxKTtcbiAgICAgICAgd2hpbGUgKGQtLSA+IDApXG4gICAgICAgICAgICBuICs9ICcwJztcbiAgICB9XG4gICAgcmV0dXJuIG47XG59XG5cbmV4cG9ydCB7IHN0cmluZ2lmeU51bWJlciB9O1xuIiwiaW1wb3J0IHsgU2NhbGFyIH0gZnJvbSAnLi4vLi4vbm9kZXMvU2NhbGFyLmpzJztcbmltcG9ydCB7IHN0cmluZ2lmeU51bWJlciB9IGZyb20gJy4uLy4uL3N0cmluZ2lmeS9zdHJpbmdpZnlOdW1iZXIuanMnO1xuXG5jb25zdCBmbG9hdE5hTiA9IHtcbiAgICBpZGVudGlmeTogdmFsdWUgPT4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOmZsb2F0JyxcbiAgICB0ZXN0OiAvXig/OlstK10/XFwuKD86aW5mfEluZnxJTkYpfFxcLm5hbnxcXC5OYU58XFwuTkFOKSQvLFxuICAgIHJlc29sdmU6IHN0ciA9PiBzdHIuc2xpY2UoLTMpLnRvTG93ZXJDYXNlKCkgPT09ICduYW4nXG4gICAgICAgID8gTmFOXG4gICAgICAgIDogc3RyWzBdID09PSAnLSdcbiAgICAgICAgICAgID8gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZXG4gICAgICAgICAgICA6IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSxcbiAgICBzdHJpbmdpZnk6IHN0cmluZ2lmeU51bWJlclxufTtcbmNvbnN0IGZsb2F0RXhwID0ge1xuICAgIGlkZW50aWZ5OiB2YWx1ZSA9PiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6ZmxvYXQnLFxuICAgIGZvcm1hdDogJ0VYUCcsXG4gICAgdGVzdDogL15bLStdPyg/OlxcLlswLTldK3xbMC05XSsoPzpcXC5bMC05XSopPylbZUVdWy0rXT9bMC05XSskLyxcbiAgICByZXNvbHZlOiBzdHIgPT4gcGFyc2VGbG9hdChzdHIpLFxuICAgIHN0cmluZ2lmeShub2RlKSB7XG4gICAgICAgIGNvbnN0IG51bSA9IE51bWJlcihub2RlLnZhbHVlKTtcbiAgICAgICAgcmV0dXJuIGlzRmluaXRlKG51bSkgPyBudW0udG9FeHBvbmVudGlhbCgpIDogc3RyaW5naWZ5TnVtYmVyKG5vZGUpO1xuICAgIH1cbn07XG5jb25zdCBmbG9hdCA9IHtcbiAgICBpZGVudGlmeTogdmFsdWUgPT4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOmZsb2F0JyxcbiAgICB0ZXN0OiAvXlstK10/KD86XFwuWzAtOV0rfFswLTldK1xcLlswLTldKikkLyxcbiAgICByZXNvbHZlKHN0cikge1xuICAgICAgICBjb25zdCBub2RlID0gbmV3IFNjYWxhcihwYXJzZUZsb2F0KHN0cikpO1xuICAgICAgICBjb25zdCBkb3QgPSBzdHIuaW5kZXhPZignLicpO1xuICAgICAgICBpZiAoZG90ICE9PSAtMSAmJiBzdHJbc3RyLmxlbmd0aCAtIDFdID09PSAnMCcpXG4gICAgICAgICAgICBub2RlLm1pbkZyYWN0aW9uRGlnaXRzID0gc3RyLmxlbmd0aCAtIGRvdCAtIDE7XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH0sXG4gICAgc3RyaW5naWZ5OiBzdHJpbmdpZnlOdW1iZXJcbn07XG5cbmV4cG9ydCB7IGZsb2F0LCBmbG9hdEV4cCwgZmxvYXROYU4gfTtcbiIsImltcG9ydCB7IHN0cmluZ2lmeU51bWJlciB9IGZyb20gJy4uLy4uL3N0cmluZ2lmeS9zdHJpbmdpZnlOdW1iZXIuanMnO1xuXG5jb25zdCBpbnRJZGVudGlmeSA9ICh2YWx1ZSkgPT4gdHlwZW9mIHZhbHVlID09PSAnYmlnaW50JyB8fCBOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKTtcbmNvbnN0IGludFJlc29sdmUgPSAoc3RyLCBvZmZzZXQsIHJhZGl4LCB7IGludEFzQmlnSW50IH0pID0+IChpbnRBc0JpZ0ludCA/IEJpZ0ludChzdHIpIDogcGFyc2VJbnQoc3RyLnN1YnN0cmluZyhvZmZzZXQpLCByYWRpeCkpO1xuZnVuY3Rpb24gaW50U3RyaW5naWZ5KG5vZGUsIHJhZGl4LCBwcmVmaXgpIHtcbiAgICBjb25zdCB7IHZhbHVlIH0gPSBub2RlO1xuICAgIGlmIChpbnRJZGVudGlmeSh2YWx1ZSkgJiYgdmFsdWUgPj0gMClcbiAgICAgICAgcmV0dXJuIHByZWZpeCArIHZhbHVlLnRvU3RyaW5nKHJhZGl4KTtcbiAgICByZXR1cm4gc3RyaW5naWZ5TnVtYmVyKG5vZGUpO1xufVxuY29uc3QgaW50T2N0ID0ge1xuICAgIGlkZW50aWZ5OiB2YWx1ZSA9PiBpbnRJZGVudGlmeSh2YWx1ZSkgJiYgdmFsdWUgPj0gMCxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOmludCcsXG4gICAgZm9ybWF0OiAnT0NUJyxcbiAgICB0ZXN0OiAvXjBvWzAtN10rJC8sXG4gICAgcmVzb2x2ZTogKHN0ciwgX29uRXJyb3IsIG9wdCkgPT4gaW50UmVzb2x2ZShzdHIsIDIsIDgsIG9wdCksXG4gICAgc3RyaW5naWZ5OiBub2RlID0+IGludFN0cmluZ2lmeShub2RlLCA4LCAnMG8nKVxufTtcbmNvbnN0IGludCA9IHtcbiAgICBpZGVudGlmeTogaW50SWRlbnRpZnksXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjppbnQnLFxuICAgIHRlc3Q6IC9eWy0rXT9bMC05XSskLyxcbiAgICByZXNvbHZlOiAoc3RyLCBfb25FcnJvciwgb3B0KSA9PiBpbnRSZXNvbHZlKHN0ciwgMCwgMTAsIG9wdCksXG4gICAgc3RyaW5naWZ5OiBzdHJpbmdpZnlOdW1iZXJcbn07XG5jb25zdCBpbnRIZXggPSB7XG4gICAgaWRlbnRpZnk6IHZhbHVlID0+IGludElkZW50aWZ5KHZhbHVlKSAmJiB2YWx1ZSA+PSAwLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6aW50JyxcbiAgICBmb3JtYXQ6ICdIRVgnLFxuICAgIHRlc3Q6IC9eMHhbMC05YS1mQS1GXSskLyxcbiAgICByZXNvbHZlOiAoc3RyLCBfb25FcnJvciwgb3B0KSA9PiBpbnRSZXNvbHZlKHN0ciwgMiwgMTYsIG9wdCksXG4gICAgc3RyaW5naWZ5OiBub2RlID0+IGludFN0cmluZ2lmeShub2RlLCAxNiwgJzB4Jylcbn07XG5cbmV4cG9ydCB7IGludCwgaW50SGV4LCBpbnRPY3QgfTtcbiIsImltcG9ydCB7IG1hcCB9IGZyb20gJy4uL2NvbW1vbi9tYXAuanMnO1xuaW1wb3J0IHsgbnVsbFRhZyB9IGZyb20gJy4uL2NvbW1vbi9udWxsLmpzJztcbmltcG9ydCB7IHNlcSB9IGZyb20gJy4uL2NvbW1vbi9zZXEuanMnO1xuaW1wb3J0IHsgc3RyaW5nIH0gZnJvbSAnLi4vY29tbW9uL3N0cmluZy5qcyc7XG5pbXBvcnQgeyBib29sVGFnIH0gZnJvbSAnLi9ib29sLmpzJztcbmltcG9ydCB7IGZsb2F0TmFOLCBmbG9hdEV4cCwgZmxvYXQgfSBmcm9tICcuL2Zsb2F0LmpzJztcbmltcG9ydCB7IGludE9jdCwgaW50LCBpbnRIZXggfSBmcm9tICcuL2ludC5qcyc7XG5cbmNvbnN0IHNjaGVtYSA9IFtcbiAgICBtYXAsXG4gICAgc2VxLFxuICAgIHN0cmluZyxcbiAgICBudWxsVGFnLFxuICAgIGJvb2xUYWcsXG4gICAgaW50T2N0LFxuICAgIGludCxcbiAgICBpbnRIZXgsXG4gICAgZmxvYXROYU4sXG4gICAgZmxvYXRFeHAsXG4gICAgZmxvYXRcbl07XG5cbmV4cG9ydCB7IHNjaGVtYSB9O1xuIiwiaW1wb3J0IHsgU2NhbGFyIH0gZnJvbSAnLi4vLi4vbm9kZXMvU2NhbGFyLmpzJztcbmltcG9ydCB7IG1hcCB9IGZyb20gJy4uL2NvbW1vbi9tYXAuanMnO1xuaW1wb3J0IHsgc2VxIH0gZnJvbSAnLi4vY29tbW9uL3NlcS5qcyc7XG5cbmZ1bmN0aW9uIGludElkZW50aWZ5KHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2JpZ2ludCcgfHwgTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSk7XG59XG5jb25zdCBzdHJpbmdpZnlKU09OID0gKHsgdmFsdWUgfSkgPT4gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuY29uc3QganNvblNjYWxhcnMgPSBbXG4gICAge1xuICAgICAgICBpZGVudGlmeTogdmFsdWUgPT4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyxcbiAgICAgICAgZGVmYXVsdDogdHJ1ZSxcbiAgICAgICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6c3RyJyxcbiAgICAgICAgcmVzb2x2ZTogc3RyID0+IHN0cixcbiAgICAgICAgc3RyaW5naWZ5OiBzdHJpbmdpZnlKU09OXG4gICAgfSxcbiAgICB7XG4gICAgICAgIGlkZW50aWZ5OiB2YWx1ZSA9PiB2YWx1ZSA9PSBudWxsLFxuICAgICAgICBjcmVhdGVOb2RlOiAoKSA9PiBuZXcgU2NhbGFyKG51bGwpLFxuICAgICAgICBkZWZhdWx0OiB0cnVlLFxuICAgICAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjpudWxsJyxcbiAgICAgICAgdGVzdDogL15udWxsJC8sXG4gICAgICAgIHJlc29sdmU6ICgpID0+IG51bGwsXG4gICAgICAgIHN0cmluZ2lmeTogc3RyaW5naWZ5SlNPTlxuICAgIH0sXG4gICAge1xuICAgICAgICBpZGVudGlmeTogdmFsdWUgPT4gdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOmJvb2wnLFxuICAgICAgICB0ZXN0OiAvXnRydWUkfF5mYWxzZSQvLFxuICAgICAgICByZXNvbHZlOiBzdHIgPT4gc3RyID09PSAndHJ1ZScsXG4gICAgICAgIHN0cmluZ2lmeTogc3RyaW5naWZ5SlNPTlxuICAgIH0sXG4gICAge1xuICAgICAgICBpZGVudGlmeTogaW50SWRlbnRpZnksXG4gICAgICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOmludCcsXG4gICAgICAgIHRlc3Q6IC9eLT8oPzowfFsxLTldWzAtOV0qKSQvLFxuICAgICAgICByZXNvbHZlOiAoc3RyLCBfb25FcnJvciwgeyBpbnRBc0JpZ0ludCB9KSA9PiBpbnRBc0JpZ0ludCA/IEJpZ0ludChzdHIpIDogcGFyc2VJbnQoc3RyLCAxMCksXG4gICAgICAgIHN0cmluZ2lmeTogKHsgdmFsdWUgfSkgPT4gaW50SWRlbnRpZnkodmFsdWUpID8gdmFsdWUudG9TdHJpbmcoKSA6IEpTT04uc3RyaW5naWZ5KHZhbHVlKVxuICAgIH0sXG4gICAge1xuICAgICAgICBpZGVudGlmeTogdmFsdWUgPT4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyxcbiAgICAgICAgZGVmYXVsdDogdHJ1ZSxcbiAgICAgICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6ZmxvYXQnLFxuICAgICAgICB0ZXN0OiAvXi0/KD86MHxbMS05XVswLTldKikoPzpcXC5bMC05XSopPyg/OltlRV1bLStdP1swLTldKyk/JC8sXG4gICAgICAgIHJlc29sdmU6IHN0ciA9PiBwYXJzZUZsb2F0KHN0ciksXG4gICAgICAgIHN0cmluZ2lmeTogc3RyaW5naWZ5SlNPTlxuICAgIH1cbl07XG5jb25zdCBqc29uRXJyb3IgPSB7XG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgICB0YWc6ICcnLFxuICAgIHRlc3Q6IC9eLyxcbiAgICByZXNvbHZlKHN0ciwgb25FcnJvcikge1xuICAgICAgICBvbkVycm9yKGBVbnJlc29sdmVkIHBsYWluIHNjYWxhciAke0pTT04uc3RyaW5naWZ5KHN0cil9YCk7XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxufTtcbmNvbnN0IHNjaGVtYSA9IFttYXAsIHNlcV0uY29uY2F0KGpzb25TY2FsYXJzLCBqc29uRXJyb3IpO1xuXG5leHBvcnQgeyBzY2hlbWEgfTtcbiIsImltcG9ydCB7IFNjYWxhciB9IGZyb20gJy4uLy4uL25vZGVzL1NjYWxhci5qcyc7XG5pbXBvcnQgeyBzdHJpbmdpZnlTdHJpbmcgfSBmcm9tICcuLi8uLi9zdHJpbmdpZnkvc3RyaW5naWZ5U3RyaW5nLmpzJztcblxuY29uc3QgYmluYXJ5ID0ge1xuICAgIGlkZW50aWZ5OiB2YWx1ZSA9PiB2YWx1ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXksIC8vIEJ1ZmZlciBpbmhlcml0cyBmcm9tIFVpbnQ4QXJyYXlcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjpiaW5hcnknLFxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBCdWZmZXIgaW4gbm9kZSBhbmQgYW4gVWludDhBcnJheSBpbiBicm93c2Vyc1xuICAgICAqXG4gICAgICogVG8gdXNlIHRoZSByZXN1bHRpbmcgYnVmZmVyIGFzIGFuIGltYWdlLCB5b3UnbGwgd2FudCB0byBkbyBzb21ldGhpbmcgbGlrZTpcbiAgICAgKlxuICAgICAqICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtidWZmZXJdLCB7IHR5cGU6ICdpbWFnZS9qcGVnJyB9KVxuICAgICAqICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3Bob3RvJykuc3JjID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKVxuICAgICAqL1xuICAgIHJlc29sdmUoc3JjLCBvbkVycm9yKSB7XG4gICAgICAgIGlmICh0eXBlb2YgYXRvYiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgLy8gT24gSUUgMTEsIGF0b2IoKSBjYW4ndCBoYW5kbGUgbmV3bGluZXNcbiAgICAgICAgICAgIGNvbnN0IHN0ciA9IGF0b2Ioc3JjLnJlcGxhY2UoL1tcXG5cXHJdL2csICcnKSk7XG4gICAgICAgICAgICBjb25zdCBidWZmZXIgPSBuZXcgVWludDhBcnJheShzdHIubGVuZ3RoKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKVxuICAgICAgICAgICAgICAgIGJ1ZmZlcltpXSA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG9uRXJyb3IoJ1RoaXMgZW52aXJvbm1lbnQgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nIGJpbmFyeSB0YWdzOyBlaXRoZXIgQnVmZmVyIG9yIGF0b2IgaXMgcmVxdWlyZWQnKTtcbiAgICAgICAgICAgIHJldHVybiBzcmM7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIHN0cmluZ2lmeSh7IGNvbW1lbnQsIHR5cGUsIHZhbHVlIH0sIGN0eCwgb25Db21tZW50LCBvbkNob21wS2VlcCkge1xuICAgICAgICBpZiAoIXZhbHVlKVxuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICBjb25zdCBidWYgPSB2YWx1ZTsgLy8gY2hlY2tlZCBlYXJsaWVyIGJ5IGJpbmFyeS5pZGVudGlmeSgpXG4gICAgICAgIGxldCBzdHI7XG4gICAgICAgIGlmICh0eXBlb2YgYnRvYSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgbGV0IHMgPSAnJztcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnVmLmxlbmd0aDsgKytpKVxuICAgICAgICAgICAgICAgIHMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0pO1xuICAgICAgICAgICAgc3RyID0gYnRvYShzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBlbnZpcm9ubWVudCBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgYmluYXJ5IHRhZ3M7IGVpdGhlciBCdWZmZXIgb3IgYnRvYSBpcyByZXF1aXJlZCcpO1xuICAgICAgICB9XG4gICAgICAgIHR5cGUgPz8gKHR5cGUgPSBTY2FsYXIuQkxPQ0tfTElURVJBTCk7XG4gICAgICAgIGlmICh0eXBlICE9PSBTY2FsYXIuUVVPVEVfRE9VQkxFKSB7XG4gICAgICAgICAgICBjb25zdCBsaW5lV2lkdGggPSBNYXRoLm1heChjdHgub3B0aW9ucy5saW5lV2lkdGggLSBjdHguaW5kZW50Lmxlbmd0aCwgY3R4Lm9wdGlvbnMubWluQ29udGVudFdpZHRoKTtcbiAgICAgICAgICAgIGNvbnN0IG4gPSBNYXRoLmNlaWwoc3RyLmxlbmd0aCAvIGxpbmVXaWR0aCk7XG4gICAgICAgICAgICBjb25zdCBsaW5lcyA9IG5ldyBBcnJheShuKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBvID0gMDsgaSA8IG47ICsraSwgbyArPSBsaW5lV2lkdGgpIHtcbiAgICAgICAgICAgICAgICBsaW5lc1tpXSA9IHN0ci5zdWJzdHIobywgbGluZVdpZHRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0ciA9IGxpbmVzLmpvaW4odHlwZSA9PT0gU2NhbGFyLkJMT0NLX0xJVEVSQUwgPyAnXFxuJyA6ICcgJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0cmluZ2lmeVN0cmluZyh7IGNvbW1lbnQsIHR5cGUsIHZhbHVlOiBzdHIgfSwgY3R4LCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKTtcbiAgICB9XG59O1xuXG5leHBvcnQgeyBiaW5hcnkgfTtcbiIsImltcG9ydCB7IGlzU2VxLCBpc1BhaXIsIGlzTWFwIH0gZnJvbSAnLi4vLi4vbm9kZXMvaWRlbnRpdHkuanMnO1xuaW1wb3J0IHsgY3JlYXRlUGFpciwgUGFpciB9IGZyb20gJy4uLy4uL25vZGVzL1BhaXIuanMnO1xuaW1wb3J0IHsgU2NhbGFyIH0gZnJvbSAnLi4vLi4vbm9kZXMvU2NhbGFyLmpzJztcbmltcG9ydCB7IFlBTUxTZXEgfSBmcm9tICcuLi8uLi9ub2Rlcy9ZQU1MU2VxLmpzJztcblxuZnVuY3Rpb24gcmVzb2x2ZVBhaXJzKHNlcSwgb25FcnJvcikge1xuICAgIGlmIChpc1NlcShzZXEpKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VxLml0ZW1zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBsZXQgaXRlbSA9IHNlcS5pdGVtc1tpXTtcbiAgICAgICAgICAgIGlmIChpc1BhaXIoaXRlbSkpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBlbHNlIGlmIChpc01hcChpdGVtKSkge1xuICAgICAgICAgICAgICAgIGlmIChpdGVtLml0ZW1zLmxlbmd0aCA+IDEpXG4gICAgICAgICAgICAgICAgICAgIG9uRXJyb3IoJ0VhY2ggcGFpciBtdXN0IGhhdmUgaXRzIG93biBzZXF1ZW5jZSBpbmRpY2F0b3InKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwYWlyID0gaXRlbS5pdGVtc1swXSB8fCBuZXcgUGFpcihuZXcgU2NhbGFyKG51bGwpKTtcbiAgICAgICAgICAgICAgICBpZiAoaXRlbS5jb21tZW50QmVmb3JlKVxuICAgICAgICAgICAgICAgICAgICBwYWlyLmtleS5jb21tZW50QmVmb3JlID0gcGFpci5rZXkuY29tbWVudEJlZm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBgJHtpdGVtLmNvbW1lbnRCZWZvcmV9XFxuJHtwYWlyLmtleS5jb21tZW50QmVmb3JlfWBcbiAgICAgICAgICAgICAgICAgICAgICAgIDogaXRlbS5jb21tZW50QmVmb3JlO1xuICAgICAgICAgICAgICAgIGlmIChpdGVtLmNvbW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY24gPSBwYWlyLnZhbHVlID8/IHBhaXIua2V5O1xuICAgICAgICAgICAgICAgICAgICBjbi5jb21tZW50ID0gY24uY29tbWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBgJHtpdGVtLmNvbW1lbnR9XFxuJHtjbi5jb21tZW50fWBcbiAgICAgICAgICAgICAgICAgICAgICAgIDogaXRlbS5jb21tZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpdGVtID0gcGFpcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNlcS5pdGVtc1tpXSA9IGlzUGFpcihpdGVtKSA/IGl0ZW0gOiBuZXcgUGFpcihpdGVtKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlXG4gICAgICAgIG9uRXJyb3IoJ0V4cGVjdGVkIGEgc2VxdWVuY2UgZm9yIHRoaXMgdGFnJyk7XG4gICAgcmV0dXJuIHNlcTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVBhaXJzKHNjaGVtYSwgaXRlcmFibGUsIGN0eCkge1xuICAgIGNvbnN0IHsgcmVwbGFjZXIgfSA9IGN0eDtcbiAgICBjb25zdCBwYWlycyA9IG5ldyBZQU1MU2VxKHNjaGVtYSk7XG4gICAgcGFpcnMudGFnID0gJ3RhZzp5YW1sLm9yZywyMDAyOnBhaXJzJztcbiAgICBsZXQgaSA9IDA7XG4gICAgaWYgKGl0ZXJhYmxlICYmIFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoaXRlcmFibGUpKVxuICAgICAgICBmb3IgKGxldCBpdCBvZiBpdGVyYWJsZSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiByZXBsYWNlciA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgICAgICBpdCA9IHJlcGxhY2VyLmNhbGwoaXRlcmFibGUsIFN0cmluZyhpKyspLCBpdCk7XG4gICAgICAgICAgICBsZXQga2V5LCB2YWx1ZTtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGl0KSkge1xuICAgICAgICAgICAgICAgIGlmIChpdC5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAga2V5ID0gaXRbMF07XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gaXRbMV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgW2tleSwgdmFsdWVdIHR1cGxlOiAke2l0fWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXQgJiYgaXQgaW5zdGFuY2VvZiBPYmplY3QpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoaXQpO1xuICAgICAgICAgICAgICAgIGlmIChrZXlzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICBrZXkgPSBrZXlzWzBdO1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGl0W2tleV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCB0dXBsZSB3aXRoIG9uZSBrZXksIG5vdCAke2tleXMubGVuZ3RofSBrZXlzYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAga2V5ID0gaXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYWlycy5pdGVtcy5wdXNoKGNyZWF0ZVBhaXIoa2V5LCB2YWx1ZSwgY3R4KSk7XG4gICAgICAgIH1cbiAgICByZXR1cm4gcGFpcnM7XG59XG5jb25zdCBwYWlycyA9IHtcbiAgICBjb2xsZWN0aW9uOiAnc2VxJyxcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjpwYWlycycsXG4gICAgcmVzb2x2ZTogcmVzb2x2ZVBhaXJzLFxuICAgIGNyZWF0ZU5vZGU6IGNyZWF0ZVBhaXJzXG59O1xuXG5leHBvcnQgeyBjcmVhdGVQYWlycywgcGFpcnMsIHJlc29sdmVQYWlycyB9O1xuIiwiaW1wb3J0IHsgaXNTY2FsYXIsIGlzUGFpciB9IGZyb20gJy4uLy4uL25vZGVzL2lkZW50aXR5LmpzJztcbmltcG9ydCB7IHRvSlMgfSBmcm9tICcuLi8uLi9ub2Rlcy90b0pTLmpzJztcbmltcG9ydCB7IFlBTUxNYXAgfSBmcm9tICcuLi8uLi9ub2Rlcy9ZQU1MTWFwLmpzJztcbmltcG9ydCB7IFlBTUxTZXEgfSBmcm9tICcuLi8uLi9ub2Rlcy9ZQU1MU2VxLmpzJztcbmltcG9ydCB7IHJlc29sdmVQYWlycywgY3JlYXRlUGFpcnMgfSBmcm9tICcuL3BhaXJzLmpzJztcblxuY2xhc3MgWUFNTE9NYXAgZXh0ZW5kcyBZQU1MU2VxIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5hZGQgPSBZQU1MTWFwLnByb3RvdHlwZS5hZGQuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5kZWxldGUgPSBZQU1MTWFwLnByb3RvdHlwZS5kZWxldGUuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5nZXQgPSBZQU1MTWFwLnByb3RvdHlwZS5nZXQuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5oYXMgPSBZQU1MTWFwLnByb3RvdHlwZS5oYXMuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5zZXQgPSBZQU1MTWFwLnByb3RvdHlwZS5zZXQuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy50YWcgPSBZQU1MT01hcC50YWc7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIElmIGBjdHhgIGlzIGdpdmVuLCB0aGUgcmV0dXJuIHR5cGUgaXMgYWN0dWFsbHkgYE1hcDx1bmtub3duLCB1bmtub3duPmAsXG4gICAgICogYnV0IFR5cGVTY3JpcHQgd29uJ3QgYWxsb3cgd2lkZW5pbmcgdGhlIHNpZ25hdHVyZSBvZiBhIGNoaWxkIG1ldGhvZC5cbiAgICAgKi9cbiAgICB0b0pTT04oXywgY3R4KSB7XG4gICAgICAgIGlmICghY3R4KVxuICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnRvSlNPTihfKTtcbiAgICAgICAgY29uc3QgbWFwID0gbmV3IE1hcCgpO1xuICAgICAgICBpZiAoY3R4Py5vbkNyZWF0ZSlcbiAgICAgICAgICAgIGN0eC5vbkNyZWF0ZShtYXApO1xuICAgICAgICBmb3IgKGNvbnN0IHBhaXIgb2YgdGhpcy5pdGVtcykge1xuICAgICAgICAgICAgbGV0IGtleSwgdmFsdWU7XG4gICAgICAgICAgICBpZiAoaXNQYWlyKHBhaXIpKSB7XG4gICAgICAgICAgICAgICAga2V5ID0gdG9KUyhwYWlyLmtleSwgJycsIGN0eCk7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB0b0pTKHBhaXIudmFsdWUsIGtleSwgY3R4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGtleSA9IHRvSlMocGFpciwgJycsIGN0eCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWFwLmhhcyhrZXkpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignT3JkZXJlZCBtYXBzIG11c3Qgbm90IGluY2x1ZGUgZHVwbGljYXRlIGtleXMnKTtcbiAgICAgICAgICAgIG1hcC5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1hcDtcbiAgICB9XG4gICAgc3RhdGljIGZyb20oc2NoZW1hLCBpdGVyYWJsZSwgY3R4KSB7XG4gICAgICAgIGNvbnN0IHBhaXJzID0gY3JlYXRlUGFpcnMoc2NoZW1hLCBpdGVyYWJsZSwgY3R4KTtcbiAgICAgICAgY29uc3Qgb21hcCA9IG5ldyB0aGlzKCk7XG4gICAgICAgIG9tYXAuaXRlbXMgPSBwYWlycy5pdGVtcztcbiAgICAgICAgcmV0dXJuIG9tYXA7XG4gICAgfVxufVxuWUFNTE9NYXAudGFnID0gJ3RhZzp5YW1sLm9yZywyMDAyOm9tYXAnO1xuY29uc3Qgb21hcCA9IHtcbiAgICBjb2xsZWN0aW9uOiAnc2VxJyxcbiAgICBpZGVudGlmeTogdmFsdWUgPT4gdmFsdWUgaW5zdGFuY2VvZiBNYXAsXG4gICAgbm9kZUNsYXNzOiBZQU1MT01hcCxcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjpvbWFwJyxcbiAgICByZXNvbHZlKHNlcSwgb25FcnJvcikge1xuICAgICAgICBjb25zdCBwYWlycyA9IHJlc29sdmVQYWlycyhzZXEsIG9uRXJyb3IpO1xuICAgICAgICBjb25zdCBzZWVuS2V5cyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHsga2V5IH0gb2YgcGFpcnMuaXRlbXMpIHtcbiAgICAgICAgICAgIGlmIChpc1NjYWxhcihrZXkpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNlZW5LZXlzLmluY2x1ZGVzKGtleS52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgb25FcnJvcihgT3JkZXJlZCBtYXBzIG11c3Qgbm90IGluY2x1ZGUgZHVwbGljYXRlIGtleXM6ICR7a2V5LnZhbHVlfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc2VlbktleXMucHVzaChrZXkudmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihuZXcgWUFNTE9NYXAoKSwgcGFpcnMpO1xuICAgIH0sXG4gICAgY3JlYXRlTm9kZTogKHNjaGVtYSwgaXRlcmFibGUsIGN0eCkgPT4gWUFNTE9NYXAuZnJvbShzY2hlbWEsIGl0ZXJhYmxlLCBjdHgpXG59O1xuXG5leHBvcnQgeyBZQU1MT01hcCwgb21hcCB9O1xuIiwiaW1wb3J0IHsgU2NhbGFyIH0gZnJvbSAnLi4vLi4vbm9kZXMvU2NhbGFyLmpzJztcblxuZnVuY3Rpb24gYm9vbFN0cmluZ2lmeSh7IHZhbHVlLCBzb3VyY2UgfSwgY3R4KSB7XG4gICAgY29uc3QgYm9vbE9iaiA9IHZhbHVlID8gdHJ1ZVRhZyA6IGZhbHNlVGFnO1xuICAgIGlmIChzb3VyY2UgJiYgYm9vbE9iai50ZXN0LnRlc3Qoc291cmNlKSlcbiAgICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICByZXR1cm4gdmFsdWUgPyBjdHgub3B0aW9ucy50cnVlU3RyIDogY3R4Lm9wdGlvbnMuZmFsc2VTdHI7XG59XG5jb25zdCB0cnVlVGFnID0ge1xuICAgIGlkZW50aWZ5OiB2YWx1ZSA9PiB2YWx1ZSA9PT0gdHJ1ZSxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOmJvb2wnLFxuICAgIHRlc3Q6IC9eKD86WXx5fFtZeV1lc3xZRVN8W1R0XXJ1ZXxUUlVFfFtPb11ufE9OKSQvLFxuICAgIHJlc29sdmU6ICgpID0+IG5ldyBTY2FsYXIodHJ1ZSksXG4gICAgc3RyaW5naWZ5OiBib29sU3RyaW5naWZ5XG59O1xuY29uc3QgZmFsc2VUYWcgPSB7XG4gICAgaWRlbnRpZnk6IHZhbHVlID0+IHZhbHVlID09PSBmYWxzZSxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOmJvb2wnLFxuICAgIHRlc3Q6IC9eKD86TnxufFtObl1vfE5PfFtGZl1hbHNlfEZBTFNFfFtPb11mZnxPRkYpJC8sXG4gICAgcmVzb2x2ZTogKCkgPT4gbmV3IFNjYWxhcihmYWxzZSksXG4gICAgc3RyaW5naWZ5OiBib29sU3RyaW5naWZ5XG59O1xuXG5leHBvcnQgeyBmYWxzZVRhZywgdHJ1ZVRhZyB9O1xuIiwiaW1wb3J0IHsgU2NhbGFyIH0gZnJvbSAnLi4vLi4vbm9kZXMvU2NhbGFyLmpzJztcbmltcG9ydCB7IHN0cmluZ2lmeU51bWJlciB9IGZyb20gJy4uLy4uL3N0cmluZ2lmeS9zdHJpbmdpZnlOdW1iZXIuanMnO1xuXG5jb25zdCBmbG9hdE5hTiA9IHtcbiAgICBpZGVudGlmeTogdmFsdWUgPT4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOmZsb2F0JyxcbiAgICB0ZXN0OiAvXig/OlstK10/XFwuKD86aW5mfEluZnxJTkYpfFxcLm5hbnxcXC5OYU58XFwuTkFOKSQvLFxuICAgIHJlc29sdmU6IChzdHIpID0+IHN0ci5zbGljZSgtMykudG9Mb3dlckNhc2UoKSA9PT0gJ25hbidcbiAgICAgICAgPyBOYU5cbiAgICAgICAgOiBzdHJbMF0gPT09ICctJ1xuICAgICAgICAgICAgPyBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFlcbiAgICAgICAgICAgIDogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLFxuICAgIHN0cmluZ2lmeTogc3RyaW5naWZ5TnVtYmVyXG59O1xuY29uc3QgZmxvYXRFeHAgPSB7XG4gICAgaWRlbnRpZnk6IHZhbHVlID0+IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjpmbG9hdCcsXG4gICAgZm9ybWF0OiAnRVhQJyxcbiAgICB0ZXN0OiAvXlstK10/KD86WzAtOV1bMC05X10qKT8oPzpcXC5bMC05X10qKT9bZUVdWy0rXT9bMC05XSskLyxcbiAgICByZXNvbHZlOiAoc3RyKSA9PiBwYXJzZUZsb2F0KHN0ci5yZXBsYWNlKC9fL2csICcnKSksXG4gICAgc3RyaW5naWZ5KG5vZGUpIHtcbiAgICAgICAgY29uc3QgbnVtID0gTnVtYmVyKG5vZGUudmFsdWUpO1xuICAgICAgICByZXR1cm4gaXNGaW5pdGUobnVtKSA/IG51bS50b0V4cG9uZW50aWFsKCkgOiBzdHJpbmdpZnlOdW1iZXIobm9kZSk7XG4gICAgfVxufTtcbmNvbnN0IGZsb2F0ID0ge1xuICAgIGlkZW50aWZ5OiB2YWx1ZSA9PiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6ZmxvYXQnLFxuICAgIHRlc3Q6IC9eWy0rXT8oPzpbMC05XVswLTlfXSopP1xcLlswLTlfXSokLyxcbiAgICByZXNvbHZlKHN0cikge1xuICAgICAgICBjb25zdCBub2RlID0gbmV3IFNjYWxhcihwYXJzZUZsb2F0KHN0ci5yZXBsYWNlKC9fL2csICcnKSkpO1xuICAgICAgICBjb25zdCBkb3QgPSBzdHIuaW5kZXhPZignLicpO1xuICAgICAgICBpZiAoZG90ICE9PSAtMSkge1xuICAgICAgICAgICAgY29uc3QgZiA9IHN0ci5zdWJzdHJpbmcoZG90ICsgMSkucmVwbGFjZSgvXy9nLCAnJyk7XG4gICAgICAgICAgICBpZiAoZltmLmxlbmd0aCAtIDFdID09PSAnMCcpXG4gICAgICAgICAgICAgICAgbm9kZS5taW5GcmFjdGlvbkRpZ2l0cyA9IGYubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH0sXG4gICAgc3RyaW5naWZ5OiBzdHJpbmdpZnlOdW1iZXJcbn07XG5cbmV4cG9ydCB7IGZsb2F0LCBmbG9hdEV4cCwgZmxvYXROYU4gfTtcbiIsImltcG9ydCB7IHN0cmluZ2lmeU51bWJlciB9IGZyb20gJy4uLy4uL3N0cmluZ2lmeS9zdHJpbmdpZnlOdW1iZXIuanMnO1xuXG5jb25zdCBpbnRJZGVudGlmeSA9ICh2YWx1ZSkgPT4gdHlwZW9mIHZhbHVlID09PSAnYmlnaW50JyB8fCBOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKTtcbmZ1bmN0aW9uIGludFJlc29sdmUoc3RyLCBvZmZzZXQsIHJhZGl4LCB7IGludEFzQmlnSW50IH0pIHtcbiAgICBjb25zdCBzaWduID0gc3RyWzBdO1xuICAgIGlmIChzaWduID09PSAnLScgfHwgc2lnbiA9PT0gJysnKVxuICAgICAgICBvZmZzZXQgKz0gMTtcbiAgICBzdHIgPSBzdHIuc3Vic3RyaW5nKG9mZnNldCkucmVwbGFjZSgvXy9nLCAnJyk7XG4gICAgaWYgKGludEFzQmlnSW50KSB7XG4gICAgICAgIHN3aXRjaCAocmFkaXgpIHtcbiAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICBzdHIgPSBgMGIke3N0cn1gO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgICAgIHN0ciA9IGAwbyR7c3RyfWA7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDE2OlxuICAgICAgICAgICAgICAgIHN0ciA9IGAweCR7c3RyfWA7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbiA9IEJpZ0ludChzdHIpO1xuICAgICAgICByZXR1cm4gc2lnbiA9PT0gJy0nID8gQmlnSW50KC0xKSAqIG4gOiBuO1xuICAgIH1cbiAgICBjb25zdCBuID0gcGFyc2VJbnQoc3RyLCByYWRpeCk7XG4gICAgcmV0dXJuIHNpZ24gPT09ICctJyA/IC0xICogbiA6IG47XG59XG5mdW5jdGlvbiBpbnRTdHJpbmdpZnkobm9kZSwgcmFkaXgsIHByZWZpeCkge1xuICAgIGNvbnN0IHsgdmFsdWUgfSA9IG5vZGU7XG4gICAgaWYgKGludElkZW50aWZ5KHZhbHVlKSkge1xuICAgICAgICBjb25zdCBzdHIgPSB2YWx1ZS50b1N0cmluZyhyYWRpeCk7XG4gICAgICAgIHJldHVybiB2YWx1ZSA8IDAgPyAnLScgKyBwcmVmaXggKyBzdHIuc3Vic3RyKDEpIDogcHJlZml4ICsgc3RyO1xuICAgIH1cbiAgICByZXR1cm4gc3RyaW5naWZ5TnVtYmVyKG5vZGUpO1xufVxuY29uc3QgaW50QmluID0ge1xuICAgIGlkZW50aWZ5OiBpbnRJZGVudGlmeSxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOmludCcsXG4gICAgZm9ybWF0OiAnQklOJyxcbiAgICB0ZXN0OiAvXlstK10/MGJbMC0xX10rJC8sXG4gICAgcmVzb2x2ZTogKHN0ciwgX29uRXJyb3IsIG9wdCkgPT4gaW50UmVzb2x2ZShzdHIsIDIsIDIsIG9wdCksXG4gICAgc3RyaW5naWZ5OiBub2RlID0+IGludFN0cmluZ2lmeShub2RlLCAyLCAnMGInKVxufTtcbmNvbnN0IGludE9jdCA9IHtcbiAgICBpZGVudGlmeTogaW50SWRlbnRpZnksXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjppbnQnLFxuICAgIGZvcm1hdDogJ09DVCcsXG4gICAgdGVzdDogL15bLStdPzBbMC03X10rJC8sXG4gICAgcmVzb2x2ZTogKHN0ciwgX29uRXJyb3IsIG9wdCkgPT4gaW50UmVzb2x2ZShzdHIsIDEsIDgsIG9wdCksXG4gICAgc3RyaW5naWZ5OiBub2RlID0+IGludFN0cmluZ2lmeShub2RlLCA4LCAnMCcpXG59O1xuY29uc3QgaW50ID0ge1xuICAgIGlkZW50aWZ5OiBpbnRJZGVudGlmeSxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOmludCcsXG4gICAgdGVzdDogL15bLStdP1swLTldWzAtOV9dKiQvLFxuICAgIHJlc29sdmU6IChzdHIsIF9vbkVycm9yLCBvcHQpID0+IGludFJlc29sdmUoc3RyLCAwLCAxMCwgb3B0KSxcbiAgICBzdHJpbmdpZnk6IHN0cmluZ2lmeU51bWJlclxufTtcbmNvbnN0IGludEhleCA9IHtcbiAgICBpZGVudGlmeTogaW50SWRlbnRpZnksXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjppbnQnLFxuICAgIGZvcm1hdDogJ0hFWCcsXG4gICAgdGVzdDogL15bLStdPzB4WzAtOWEtZkEtRl9dKyQvLFxuICAgIHJlc29sdmU6IChzdHIsIF9vbkVycm9yLCBvcHQpID0+IGludFJlc29sdmUoc3RyLCAyLCAxNiwgb3B0KSxcbiAgICBzdHJpbmdpZnk6IG5vZGUgPT4gaW50U3RyaW5naWZ5KG5vZGUsIDE2LCAnMHgnKVxufTtcblxuZXhwb3J0IHsgaW50LCBpbnRCaW4sIGludEhleCwgaW50T2N0IH07XG4iLCJpbXBvcnQgeyBpc01hcCwgaXNQYWlyLCBpc1NjYWxhciB9IGZyb20gJy4uLy4uL25vZGVzL2lkZW50aXR5LmpzJztcbmltcG9ydCB7IFBhaXIsIGNyZWF0ZVBhaXIgfSBmcm9tICcuLi8uLi9ub2Rlcy9QYWlyLmpzJztcbmltcG9ydCB7IFlBTUxNYXAsIGZpbmRQYWlyIH0gZnJvbSAnLi4vLi4vbm9kZXMvWUFNTE1hcC5qcyc7XG5cbmNsYXNzIFlBTUxTZXQgZXh0ZW5kcyBZQU1MTWFwIHtcbiAgICBjb25zdHJ1Y3RvcihzY2hlbWEpIHtcbiAgICAgICAgc3VwZXIoc2NoZW1hKTtcbiAgICAgICAgdGhpcy50YWcgPSBZQU1MU2V0LnRhZztcbiAgICB9XG4gICAgYWRkKGtleSkge1xuICAgICAgICBsZXQgcGFpcjtcbiAgICAgICAgaWYgKGlzUGFpcihrZXkpKVxuICAgICAgICAgICAgcGFpciA9IGtleTtcbiAgICAgICAgZWxzZSBpZiAoa2V5ICYmXG4gICAgICAgICAgICB0eXBlb2Yga2V5ID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgJ2tleScgaW4ga2V5ICYmXG4gICAgICAgICAgICAndmFsdWUnIGluIGtleSAmJlxuICAgICAgICAgICAga2V5LnZhbHVlID09PSBudWxsKVxuICAgICAgICAgICAgcGFpciA9IG5ldyBQYWlyKGtleS5rZXksIG51bGwpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBwYWlyID0gbmV3IFBhaXIoa2V5LCBudWxsKTtcbiAgICAgICAgY29uc3QgcHJldiA9IGZpbmRQYWlyKHRoaXMuaXRlbXMsIHBhaXIua2V5KTtcbiAgICAgICAgaWYgKCFwcmV2KVxuICAgICAgICAgICAgdGhpcy5pdGVtcy5wdXNoKHBhaXIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJZiBga2VlcFBhaXJgIGlzIGB0cnVlYCwgcmV0dXJucyB0aGUgUGFpciBtYXRjaGluZyBga2V5YC5cbiAgICAgKiBPdGhlcndpc2UsIHJldHVybnMgdGhlIHZhbHVlIG9mIHRoYXQgUGFpcidzIGtleS5cbiAgICAgKi9cbiAgICBnZXQoa2V5LCBrZWVwUGFpcikge1xuICAgICAgICBjb25zdCBwYWlyID0gZmluZFBhaXIodGhpcy5pdGVtcywga2V5KTtcbiAgICAgICAgcmV0dXJuICFrZWVwUGFpciAmJiBpc1BhaXIocGFpcilcbiAgICAgICAgICAgID8gaXNTY2FsYXIocGFpci5rZXkpXG4gICAgICAgICAgICAgICAgPyBwYWlyLmtleS52YWx1ZVxuICAgICAgICAgICAgICAgIDogcGFpci5rZXlcbiAgICAgICAgICAgIDogcGFpcjtcbiAgICB9XG4gICAgc2V0KGtleSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ2Jvb2xlYW4nKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBib29sZWFuIHZhbHVlIGZvciBzZXQoa2V5LCB2YWx1ZSkgaW4gYSBZQU1MIHNldCwgbm90ICR7dHlwZW9mIHZhbHVlfWApO1xuICAgICAgICBjb25zdCBwcmV2ID0gZmluZFBhaXIodGhpcy5pdGVtcywga2V5KTtcbiAgICAgICAgaWYgKHByZXYgJiYgIXZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLml0ZW1zLnNwbGljZSh0aGlzLml0ZW1zLmluZGV4T2YocHJldiksIDEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCFwcmV2ICYmIHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLml0ZW1zLnB1c2gobmV3IFBhaXIoa2V5KSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdG9KU09OKF8sIGN0eCkge1xuICAgICAgICByZXR1cm4gc3VwZXIudG9KU09OKF8sIGN0eCwgU2V0KTtcbiAgICB9XG4gICAgdG9TdHJpbmcoY3R4LCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKSB7XG4gICAgICAgIGlmICghY3R4KVxuICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMpO1xuICAgICAgICBpZiAodGhpcy5oYXNBbGxOdWxsVmFsdWVzKHRydWUpKVxuICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKE9iamVjdC5hc3NpZ24oe30sIGN0eCwgeyBhbGxOdWxsVmFsdWVzOiB0cnVlIH0pLCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTZXQgaXRlbXMgbXVzdCBhbGwgaGF2ZSBudWxsIHZhbHVlcycpO1xuICAgIH1cbiAgICBzdGF0aWMgZnJvbShzY2hlbWEsIGl0ZXJhYmxlLCBjdHgpIHtcbiAgICAgICAgY29uc3QgeyByZXBsYWNlciB9ID0gY3R4O1xuICAgICAgICBjb25zdCBzZXQgPSBuZXcgdGhpcyhzY2hlbWEpO1xuICAgICAgICBpZiAoaXRlcmFibGUgJiYgU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChpdGVyYWJsZSkpXG4gICAgICAgICAgICBmb3IgKGxldCB2YWx1ZSBvZiBpdGVyYWJsZSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVwbGFjZXIgPT09ICdmdW5jdGlvbicpXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gcmVwbGFjZXIuY2FsbChpdGVyYWJsZSwgdmFsdWUsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBzZXQuaXRlbXMucHVzaChjcmVhdGVQYWlyKHZhbHVlLCBudWxsLCBjdHgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNldDtcbiAgICB9XG59XG5ZQU1MU2V0LnRhZyA9ICd0YWc6eWFtbC5vcmcsMjAwMjpzZXQnO1xuY29uc3Qgc2V0ID0ge1xuICAgIGNvbGxlY3Rpb246ICdtYXAnLFxuICAgIGlkZW50aWZ5OiB2YWx1ZSA9PiB2YWx1ZSBpbnN0YW5jZW9mIFNldCxcbiAgICBub2RlQ2xhc3M6IFlBTUxTZXQsXG4gICAgZGVmYXVsdDogZmFsc2UsXG4gICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6c2V0JyxcbiAgICBjcmVhdGVOb2RlOiAoc2NoZW1hLCBpdGVyYWJsZSwgY3R4KSA9PiBZQU1MU2V0LmZyb20oc2NoZW1hLCBpdGVyYWJsZSwgY3R4KSxcbiAgICByZXNvbHZlKG1hcCwgb25FcnJvcikge1xuICAgICAgICBpZiAoaXNNYXAobWFwKSkge1xuICAgICAgICAgICAgaWYgKG1hcC5oYXNBbGxOdWxsVmFsdWVzKHRydWUpKVxuICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKG5ldyBZQU1MU2V0KCksIG1hcCk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgb25FcnJvcignU2V0IGl0ZW1zIG11c3QgYWxsIGhhdmUgbnVsbCB2YWx1ZXMnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBvbkVycm9yKCdFeHBlY3RlZCBhIG1hcHBpbmcgZm9yIHRoaXMgdGFnJyk7XG4gICAgICAgIHJldHVybiBtYXA7XG4gICAgfVxufTtcblxuZXhwb3J0IHsgWUFNTFNldCwgc2V0IH07XG4iLCJpbXBvcnQgeyBzdHJpbmdpZnlOdW1iZXIgfSBmcm9tICcuLi8uLi9zdHJpbmdpZnkvc3RyaW5naWZ5TnVtYmVyLmpzJztcblxuLyoqIEludGVybmFsIHR5cGVzIGhhbmRsZSBiaWdpbnQgYXMgbnVtYmVyLCBiZWNhdXNlIFRTIGNhbid0IGZpZ3VyZSBpdCBvdXQuICovXG5mdW5jdGlvbiBwYXJzZVNleGFnZXNpbWFsKHN0ciwgYXNCaWdJbnQpIHtcbiAgICBjb25zdCBzaWduID0gc3RyWzBdO1xuICAgIGNvbnN0IHBhcnRzID0gc2lnbiA9PT0gJy0nIHx8IHNpZ24gPT09ICcrJyA/IHN0ci5zdWJzdHJpbmcoMSkgOiBzdHI7XG4gICAgY29uc3QgbnVtID0gKG4pID0+IGFzQmlnSW50ID8gQmlnSW50KG4pIDogTnVtYmVyKG4pO1xuICAgIGNvbnN0IHJlcyA9IHBhcnRzXG4gICAgICAgIC5yZXBsYWNlKC9fL2csICcnKVxuICAgICAgICAuc3BsaXQoJzonKVxuICAgICAgICAucmVkdWNlKChyZXMsIHApID0+IHJlcyAqIG51bSg2MCkgKyBudW0ocCksIG51bSgwKSk7XG4gICAgcmV0dXJuIChzaWduID09PSAnLScgPyBudW0oLTEpICogcmVzIDogcmVzKTtcbn1cbi8qKlxuICogaGhoaDptbTpzcy5zc3NcbiAqXG4gKiBJbnRlcm5hbCB0eXBlcyBoYW5kbGUgYmlnaW50IGFzIG51bWJlciwgYmVjYXVzZSBUUyBjYW4ndCBmaWd1cmUgaXQgb3V0LlxuICovXG5mdW5jdGlvbiBzdHJpbmdpZnlTZXhhZ2VzaW1hbChub2RlKSB7XG4gICAgbGV0IHsgdmFsdWUgfSA9IG5vZGU7XG4gICAgbGV0IG51bSA9IChuKSA9PiBuO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdiaWdpbnQnKVxuICAgICAgICBudW0gPSBuID0+IEJpZ0ludChuKTtcbiAgICBlbHNlIGlmIChpc05hTih2YWx1ZSkgfHwgIWlzRmluaXRlKHZhbHVlKSlcbiAgICAgICAgcmV0dXJuIHN0cmluZ2lmeU51bWJlcihub2RlKTtcbiAgICBsZXQgc2lnbiA9ICcnO1xuICAgIGlmICh2YWx1ZSA8IDApIHtcbiAgICAgICAgc2lnbiA9ICctJztcbiAgICAgICAgdmFsdWUgKj0gbnVtKC0xKTtcbiAgICB9XG4gICAgY29uc3QgXzYwID0gbnVtKDYwKTtcbiAgICBjb25zdCBwYXJ0cyA9IFt2YWx1ZSAlIF82MF07IC8vIHNlY29uZHMsIGluY2x1ZGluZyBtc1xuICAgIGlmICh2YWx1ZSA8IDYwKSB7XG4gICAgICAgIHBhcnRzLnVuc2hpZnQoMCk7IC8vIGF0IGxlYXN0IG9uZSA6IGlzIHJlcXVpcmVkXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB2YWx1ZSA9ICh2YWx1ZSAtIHBhcnRzWzBdKSAvIF82MDtcbiAgICAgICAgcGFydHMudW5zaGlmdCh2YWx1ZSAlIF82MCk7IC8vIG1pbnV0ZXNcbiAgICAgICAgaWYgKHZhbHVlID49IDYwKSB7XG4gICAgICAgICAgICB2YWx1ZSA9ICh2YWx1ZSAtIHBhcnRzWzBdKSAvIF82MDtcbiAgICAgICAgICAgIHBhcnRzLnVuc2hpZnQodmFsdWUpOyAvLyBob3Vyc1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiAoc2lnbiArXG4gICAgICAgIHBhcnRzXG4gICAgICAgICAgICAubWFwKG4gPT4gU3RyaW5nKG4pLnBhZFN0YXJ0KDIsICcwJykpXG4gICAgICAgICAgICAuam9pbignOicpXG4gICAgICAgICAgICAucmVwbGFjZSgvMDAwMDAwXFxkKiQvLCAnJykgLy8gJSA2MCBtYXkgaW50cm9kdWNlIGVycm9yXG4gICAgKTtcbn1cbmNvbnN0IGludFRpbWUgPSB7XG4gICAgaWRlbnRpZnk6IHZhbHVlID0+IHR5cGVvZiB2YWx1ZSA9PT0gJ2JpZ2ludCcgfHwgTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSksXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjppbnQnLFxuICAgIGZvcm1hdDogJ1RJTUUnLFxuICAgIHRlc3Q6IC9eWy0rXT9bMC05XVswLTlfXSooPzo6WzAtNV0/WzAtOV0pKyQvLFxuICAgIHJlc29sdmU6IChzdHIsIF9vbkVycm9yLCB7IGludEFzQmlnSW50IH0pID0+IHBhcnNlU2V4YWdlc2ltYWwoc3RyLCBpbnRBc0JpZ0ludCksXG4gICAgc3RyaW5naWZ5OiBzdHJpbmdpZnlTZXhhZ2VzaW1hbFxufTtcbmNvbnN0IGZsb2F0VGltZSA9IHtcbiAgICBpZGVudGlmeTogdmFsdWUgPT4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOmZsb2F0JyxcbiAgICBmb3JtYXQ6ICdUSU1FJyxcbiAgICB0ZXN0OiAvXlstK10/WzAtOV1bMC05X10qKD86OlswLTVdP1swLTldKStcXC5bMC05X10qJC8sXG4gICAgcmVzb2x2ZTogc3RyID0+IHBhcnNlU2V4YWdlc2ltYWwoc3RyLCBmYWxzZSksXG4gICAgc3RyaW5naWZ5OiBzdHJpbmdpZnlTZXhhZ2VzaW1hbFxufTtcbmNvbnN0IHRpbWVzdGFtcCA9IHtcbiAgICBpZGVudGlmeTogdmFsdWUgPT4gdmFsdWUgaW5zdGFuY2VvZiBEYXRlLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6dGltZXN0YW1wJyxcbiAgICAvLyBJZiB0aGUgdGltZSB6b25lIGlzIG9taXR0ZWQsIHRoZSB0aW1lc3RhbXAgaXMgYXNzdW1lZCB0byBiZSBzcGVjaWZpZWQgaW4gVVRDLiBUaGUgdGltZSBwYXJ0XG4gICAgLy8gbWF5IGJlIG9taXR0ZWQgYWx0b2dldGhlciwgcmVzdWx0aW5nIGluIGEgZGF0ZSBmb3JtYXQuIEluIHN1Y2ggYSBjYXNlLCB0aGUgdGltZSBwYXJ0IGlzXG4gICAgLy8gYXNzdW1lZCB0byBiZSAwMDowMDowMFogKHN0YXJ0IG9mIGRheSwgVVRDKS5cbiAgICB0ZXN0OiBSZWdFeHAoJ14oWzAtOV17NH0pLShbMC05XXsxLDJ9KS0oWzAtOV17MSwyfSknICsgLy8gWVlZWS1NbS1EZFxuICAgICAgICAnKD86JyArIC8vIHRpbWUgaXMgb3B0aW9uYWxcbiAgICAgICAgJyg/OnR8VHxbIFxcXFx0XSspJyArIC8vIHQgfCBUIHwgd2hpdGVzcGFjZVxuICAgICAgICAnKFswLTldezEsMn0pOihbMC05XXsxLDJ9KTooWzAtOV17MSwyfShcXFxcLlswLTldKyk/KScgKyAvLyBIaDpNbTpTcyguc3MpP1xuICAgICAgICAnKD86WyBcXFxcdF0qKFp8Wy0rXVswMTJdP1swLTldKD86OlswLTldezJ9KT8pKT8nICsgLy8gWiB8ICs1IHwgLTAzOjMwXG4gICAgICAgICcpPyQnKSxcbiAgICByZXNvbHZlKHN0cikge1xuICAgICAgICBjb25zdCBtYXRjaCA9IHN0ci5tYXRjaCh0aW1lc3RhbXAudGVzdCk7XG4gICAgICAgIGlmICghbWF0Y2gpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJyEhdGltZXN0YW1wIGV4cGVjdHMgYSBkYXRlLCBzdGFydGluZyB3aXRoIHl5eXktbW0tZGQnKTtcbiAgICAgICAgY29uc3QgWywgeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmRdID0gbWF0Y2gubWFwKE51bWJlcik7XG4gICAgICAgIGNvbnN0IG1pbGxpc2VjID0gbWF0Y2hbN10gPyBOdW1iZXIoKG1hdGNoWzddICsgJzAwJykuc3Vic3RyKDEsIDMpKSA6IDA7XG4gICAgICAgIGxldCBkYXRlID0gRGF0ZS5VVEMoeWVhciwgbW9udGggLSAxLCBkYXksIGhvdXIgfHwgMCwgbWludXRlIHx8IDAsIHNlY29uZCB8fCAwLCBtaWxsaXNlYyk7XG4gICAgICAgIGNvbnN0IHR6ID0gbWF0Y2hbOF07XG4gICAgICAgIGlmICh0eiAmJiB0eiAhPT0gJ1onKSB7XG4gICAgICAgICAgICBsZXQgZCA9IHBhcnNlU2V4YWdlc2ltYWwodHosIGZhbHNlKTtcbiAgICAgICAgICAgIGlmIChNYXRoLmFicyhkKSA8IDMwKVxuICAgICAgICAgICAgICAgIGQgKj0gNjA7XG4gICAgICAgICAgICBkYXRlIC09IDYwMDAwICogZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IERhdGUoZGF0ZSk7XG4gICAgfSxcbiAgICBzdHJpbmdpZnk6ICh7IHZhbHVlIH0pID0+IHZhbHVlPy50b0lTT1N0cmluZygpLnJlcGxhY2UoLyhUMDA6MDA6MDApP1xcLjAwMFokLywgJycpID8/ICcnXG59O1xuXG5leHBvcnQgeyBmbG9hdFRpbWUsIGludFRpbWUsIHRpbWVzdGFtcCB9O1xuIiwiaW1wb3J0IHsgbWFwIH0gZnJvbSAnLi4vY29tbW9uL21hcC5qcyc7XG5pbXBvcnQgeyBudWxsVGFnIH0gZnJvbSAnLi4vY29tbW9uL251bGwuanMnO1xuaW1wb3J0IHsgc2VxIH0gZnJvbSAnLi4vY29tbW9uL3NlcS5qcyc7XG5pbXBvcnQgeyBzdHJpbmcgfSBmcm9tICcuLi9jb21tb24vc3RyaW5nLmpzJztcbmltcG9ydCB7IGJpbmFyeSB9IGZyb20gJy4vYmluYXJ5LmpzJztcbmltcG9ydCB7IHRydWVUYWcsIGZhbHNlVGFnIH0gZnJvbSAnLi9ib29sLmpzJztcbmltcG9ydCB7IGZsb2F0TmFOLCBmbG9hdEV4cCwgZmxvYXQgfSBmcm9tICcuL2Zsb2F0LmpzJztcbmltcG9ydCB7IGludEJpbiwgaW50T2N0LCBpbnQsIGludEhleCB9IGZyb20gJy4vaW50LmpzJztcbmltcG9ydCB7IG1lcmdlIH0gZnJvbSAnLi9tZXJnZS5qcyc7XG5pbXBvcnQgeyBvbWFwIH0gZnJvbSAnLi9vbWFwLmpzJztcbmltcG9ydCB7IHBhaXJzIH0gZnJvbSAnLi9wYWlycy5qcyc7XG5pbXBvcnQgeyBzZXQgfSBmcm9tICcuL3NldC5qcyc7XG5pbXBvcnQgeyBpbnRUaW1lLCBmbG9hdFRpbWUsIHRpbWVzdGFtcCB9IGZyb20gJy4vdGltZXN0YW1wLmpzJztcblxuY29uc3Qgc2NoZW1hID0gW1xuICAgIG1hcCxcbiAgICBzZXEsXG4gICAgc3RyaW5nLFxuICAgIG51bGxUYWcsXG4gICAgdHJ1ZVRhZyxcbiAgICBmYWxzZVRhZyxcbiAgICBpbnRCaW4sXG4gICAgaW50T2N0LFxuICAgIGludCxcbiAgICBpbnRIZXgsXG4gICAgZmxvYXROYU4sXG4gICAgZmxvYXRFeHAsXG4gICAgZmxvYXQsXG4gICAgYmluYXJ5LFxuICAgIG1lcmdlLFxuICAgIG9tYXAsXG4gICAgcGFpcnMsXG4gICAgc2V0LFxuICAgIGludFRpbWUsXG4gICAgZmxvYXRUaW1lLFxuICAgIHRpbWVzdGFtcFxuXTtcblxuZXhwb3J0IHsgc2NoZW1hIH07XG4iLCJpbXBvcnQgeyBtYXAgfSBmcm9tICcuL2NvbW1vbi9tYXAuanMnO1xuaW1wb3J0IHsgbnVsbFRhZyB9IGZyb20gJy4vY29tbW9uL251bGwuanMnO1xuaW1wb3J0IHsgc2VxIH0gZnJvbSAnLi9jb21tb24vc2VxLmpzJztcbmltcG9ydCB7IHN0cmluZyB9IGZyb20gJy4vY29tbW9uL3N0cmluZy5qcyc7XG5pbXBvcnQgeyBib29sVGFnIH0gZnJvbSAnLi9jb3JlL2Jvb2wuanMnO1xuaW1wb3J0IHsgZmxvYXROYU4sIGZsb2F0RXhwLCBmbG9hdCB9IGZyb20gJy4vY29yZS9mbG9hdC5qcyc7XG5pbXBvcnQgeyBpbnRPY3QsIGludEhleCwgaW50IH0gZnJvbSAnLi9jb3JlL2ludC5qcyc7XG5pbXBvcnQgeyBzY2hlbWEgfSBmcm9tICcuL2NvcmUvc2NoZW1hLmpzJztcbmltcG9ydCB7IHNjaGVtYSBhcyBzY2hlbWEkMSB9IGZyb20gJy4vanNvbi9zY2hlbWEuanMnO1xuaW1wb3J0IHsgYmluYXJ5IH0gZnJvbSAnLi95YW1sLTEuMS9iaW5hcnkuanMnO1xuaW1wb3J0IHsgbWVyZ2UgfSBmcm9tICcuL3lhbWwtMS4xL21lcmdlLmpzJztcbmltcG9ydCB7IG9tYXAgfSBmcm9tICcuL3lhbWwtMS4xL29tYXAuanMnO1xuaW1wb3J0IHsgcGFpcnMgfSBmcm9tICcuL3lhbWwtMS4xL3BhaXJzLmpzJztcbmltcG9ydCB7IHNjaGVtYSBhcyBzY2hlbWEkMiB9IGZyb20gJy4veWFtbC0xLjEvc2NoZW1hLmpzJztcbmltcG9ydCB7IHNldCB9IGZyb20gJy4veWFtbC0xLjEvc2V0LmpzJztcbmltcG9ydCB7IHRpbWVzdGFtcCwgaW50VGltZSwgZmxvYXRUaW1lIH0gZnJvbSAnLi95YW1sLTEuMS90aW1lc3RhbXAuanMnO1xuXG5jb25zdCBzY2hlbWFzID0gbmV3IE1hcChbXG4gICAgWydjb3JlJywgc2NoZW1hXSxcbiAgICBbJ2ZhaWxzYWZlJywgW21hcCwgc2VxLCBzdHJpbmddXSxcbiAgICBbJ2pzb24nLCBzY2hlbWEkMV0sXG4gICAgWyd5YW1sMTEnLCBzY2hlbWEkMl0sXG4gICAgWyd5YW1sLTEuMScsIHNjaGVtYSQyXVxuXSk7XG5jb25zdCB0YWdzQnlOYW1lID0ge1xuICAgIGJpbmFyeSxcbiAgICBib29sOiBib29sVGFnLFxuICAgIGZsb2F0LFxuICAgIGZsb2F0RXhwLFxuICAgIGZsb2F0TmFOLFxuICAgIGZsb2F0VGltZSxcbiAgICBpbnQsXG4gICAgaW50SGV4LFxuICAgIGludE9jdCxcbiAgICBpbnRUaW1lLFxuICAgIG1hcCxcbiAgICBtZXJnZSxcbiAgICBudWxsOiBudWxsVGFnLFxuICAgIG9tYXAsXG4gICAgcGFpcnMsXG4gICAgc2VxLFxuICAgIHNldCxcbiAgICB0aW1lc3RhbXBcbn07XG5jb25zdCBjb3JlS25vd25UYWdzID0ge1xuICAgICd0YWc6eWFtbC5vcmcsMjAwMjpiaW5hcnknOiBiaW5hcnksXG4gICAgJ3RhZzp5YW1sLm9yZywyMDAyOm1lcmdlJzogbWVyZ2UsXG4gICAgJ3RhZzp5YW1sLm9yZywyMDAyOm9tYXAnOiBvbWFwLFxuICAgICd0YWc6eWFtbC5vcmcsMjAwMjpwYWlycyc6IHBhaXJzLFxuICAgICd0YWc6eWFtbC5vcmcsMjAwMjpzZXQnOiBzZXQsXG4gICAgJ3RhZzp5YW1sLm9yZywyMDAyOnRpbWVzdGFtcCc6IHRpbWVzdGFtcFxufTtcbmZ1bmN0aW9uIGdldFRhZ3MoY3VzdG9tVGFncywgc2NoZW1hTmFtZSwgYWRkTWVyZ2VUYWcpIHtcbiAgICBjb25zdCBzY2hlbWFUYWdzID0gc2NoZW1hcy5nZXQoc2NoZW1hTmFtZSk7XG4gICAgaWYgKHNjaGVtYVRhZ3MgJiYgIWN1c3RvbVRhZ3MpIHtcbiAgICAgICAgcmV0dXJuIGFkZE1lcmdlVGFnICYmICFzY2hlbWFUYWdzLmluY2x1ZGVzKG1lcmdlKVxuICAgICAgICAgICAgPyBzY2hlbWFUYWdzLmNvbmNhdChtZXJnZSlcbiAgICAgICAgICAgIDogc2NoZW1hVGFncy5zbGljZSgpO1xuICAgIH1cbiAgICBsZXQgdGFncyA9IHNjaGVtYVRhZ3M7XG4gICAgaWYgKCF0YWdzKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGN1c3RvbVRhZ3MpKVxuICAgICAgICAgICAgdGFncyA9IFtdO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGtleXMgPSBBcnJheS5mcm9tKHNjaGVtYXMua2V5cygpKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoa2V5ID0+IGtleSAhPT0gJ3lhbWwxMScpXG4gICAgICAgICAgICAgICAgLm1hcChrZXkgPT4gSlNPTi5zdHJpbmdpZnkoa2V5KSlcbiAgICAgICAgICAgICAgICAuam9pbignLCAnKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBzY2hlbWEgXCIke3NjaGVtYU5hbWV9XCI7IHVzZSBvbmUgb2YgJHtrZXlzfSBvciBkZWZpbmUgY3VzdG9tVGFncyBhcnJheWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KGN1c3RvbVRhZ3MpKSB7XG4gICAgICAgIGZvciAoY29uc3QgdGFnIG9mIGN1c3RvbVRhZ3MpXG4gICAgICAgICAgICB0YWdzID0gdGFncy5jb25jYXQodGFnKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIGN1c3RvbVRhZ3MgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGFncyA9IGN1c3RvbVRhZ3ModGFncy5zbGljZSgpKTtcbiAgICB9XG4gICAgaWYgKGFkZE1lcmdlVGFnKVxuICAgICAgICB0YWdzID0gdGFncy5jb25jYXQobWVyZ2UpO1xuICAgIHJldHVybiB0YWdzLnJlZHVjZSgodGFncywgdGFnKSA9PiB7XG4gICAgICAgIGNvbnN0IHRhZ09iaiA9IHR5cGVvZiB0YWcgPT09ICdzdHJpbmcnID8gdGFnc0J5TmFtZVt0YWddIDogdGFnO1xuICAgICAgICBpZiAoIXRhZ09iaikge1xuICAgICAgICAgICAgY29uc3QgdGFnTmFtZSA9IEpTT04uc3RyaW5naWZ5KHRhZyk7XG4gICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModGFnc0J5TmFtZSlcbiAgICAgICAgICAgICAgICAubWFwKGtleSA9PiBKU09OLnN0cmluZ2lmeShrZXkpKVxuICAgICAgICAgICAgICAgIC5qb2luKCcsICcpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGN1c3RvbSB0YWcgJHt0YWdOYW1lfTsgdXNlIG9uZSBvZiAke2tleXN9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0YWdzLmluY2x1ZGVzKHRhZ09iaikpXG4gICAgICAgICAgICB0YWdzLnB1c2godGFnT2JqKTtcbiAgICAgICAgcmV0dXJuIHRhZ3M7XG4gICAgfSwgW10pO1xufVxuXG5leHBvcnQgeyBjb3JlS25vd25UYWdzLCBnZXRUYWdzIH07XG4iLCJpbXBvcnQgeyBNQVAsIFNDQUxBUiwgU0VRIH0gZnJvbSAnLi4vbm9kZXMvaWRlbnRpdHkuanMnO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAnLi9jb21tb24vbWFwLmpzJztcbmltcG9ydCB7IHNlcSB9IGZyb20gJy4vY29tbW9uL3NlcS5qcyc7XG5pbXBvcnQgeyBzdHJpbmcgfSBmcm9tICcuL2NvbW1vbi9zdHJpbmcuanMnO1xuaW1wb3J0IHsgZ2V0VGFncywgY29yZUtub3duVGFncyB9IGZyb20gJy4vdGFncy5qcyc7XG5cbmNvbnN0IHNvcnRNYXBFbnRyaWVzQnlLZXkgPSAoYSwgYikgPT4gYS5rZXkgPCBiLmtleSA/IC0xIDogYS5rZXkgPiBiLmtleSA/IDEgOiAwO1xuY2xhc3MgU2NoZW1hIHtcbiAgICBjb25zdHJ1Y3Rvcih7IGNvbXBhdCwgY3VzdG9tVGFncywgbWVyZ2UsIHJlc29sdmVLbm93blRhZ3MsIHNjaGVtYSwgc29ydE1hcEVudHJpZXMsIHRvU3RyaW5nRGVmYXVsdHMgfSkge1xuICAgICAgICB0aGlzLmNvbXBhdCA9IEFycmF5LmlzQXJyYXkoY29tcGF0KVxuICAgICAgICAgICAgPyBnZXRUYWdzKGNvbXBhdCwgJ2NvbXBhdCcpXG4gICAgICAgICAgICA6IGNvbXBhdFxuICAgICAgICAgICAgICAgID8gZ2V0VGFncyhudWxsLCBjb21wYXQpXG4gICAgICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICB0aGlzLm5hbWUgPSAodHlwZW9mIHNjaGVtYSA9PT0gJ3N0cmluZycgJiYgc2NoZW1hKSB8fCAnY29yZSc7XG4gICAgICAgIHRoaXMua25vd25UYWdzID0gcmVzb2x2ZUtub3duVGFncyA/IGNvcmVLbm93blRhZ3MgOiB7fTtcbiAgICAgICAgdGhpcy50YWdzID0gZ2V0VGFncyhjdXN0b21UYWdzLCB0aGlzLm5hbWUsIG1lcmdlKTtcbiAgICAgICAgdGhpcy50b1N0cmluZ09wdGlvbnMgPSB0b1N0cmluZ0RlZmF1bHRzID8/IG51bGw7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBNQVAsIHsgdmFsdWU6IG1hcCB9KTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFNDQUxBUiwgeyB2YWx1ZTogc3RyaW5nIH0pO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgU0VRLCB7IHZhbHVlOiBzZXEgfSk7XG4gICAgICAgIC8vIFVzZWQgYnkgY3JlYXRlTWFwKClcbiAgICAgICAgdGhpcy5zb3J0TWFwRW50cmllcyA9XG4gICAgICAgICAgICB0eXBlb2Ygc29ydE1hcEVudHJpZXMgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgICAgICA/IHNvcnRNYXBFbnRyaWVzXG4gICAgICAgICAgICAgICAgOiBzb3J0TWFwRW50cmllcyA9PT0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICA/IHNvcnRNYXBFbnRyaWVzQnlLZXlcbiAgICAgICAgICAgICAgICAgICAgOiBudWxsO1xuICAgIH1cbiAgICBjbG9uZSgpIHtcbiAgICAgICAgY29uc3QgY29weSA9IE9iamVjdC5jcmVhdGUoU2NoZW1hLnByb3RvdHlwZSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnModGhpcykpO1xuICAgICAgICBjb3B5LnRhZ3MgPSB0aGlzLnRhZ3Muc2xpY2UoKTtcbiAgICAgICAgcmV0dXJuIGNvcHk7XG4gICAgfVxufVxuXG5leHBvcnQgeyBTY2hlbWEgfTtcbiIsImltcG9ydCB7IGlzTm9kZSB9IGZyb20gJy4uL25vZGVzL2lkZW50aXR5LmpzJztcbmltcG9ydCB7IGNyZWF0ZVN0cmluZ2lmeUNvbnRleHQsIHN0cmluZ2lmeSB9IGZyb20gJy4vc3RyaW5naWZ5LmpzJztcbmltcG9ydCB7IGluZGVudENvbW1lbnQsIGxpbmVDb21tZW50IH0gZnJvbSAnLi9zdHJpbmdpZnlDb21tZW50LmpzJztcblxuZnVuY3Rpb24gc3RyaW5naWZ5RG9jdW1lbnQoZG9jLCBvcHRpb25zKSB7XG4gICAgY29uc3QgbGluZXMgPSBbXTtcbiAgICBsZXQgaGFzRGlyZWN0aXZlcyA9IG9wdGlvbnMuZGlyZWN0aXZlcyA9PT0gdHJ1ZTtcbiAgICBpZiAob3B0aW9ucy5kaXJlY3RpdmVzICE9PSBmYWxzZSAmJiBkb2MuZGlyZWN0aXZlcykge1xuICAgICAgICBjb25zdCBkaXIgPSBkb2MuZGlyZWN0aXZlcy50b1N0cmluZyhkb2MpO1xuICAgICAgICBpZiAoZGlyKSB7XG4gICAgICAgICAgICBsaW5lcy5wdXNoKGRpcik7XG4gICAgICAgICAgICBoYXNEaXJlY3RpdmVzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChkb2MuZGlyZWN0aXZlcy5kb2NTdGFydClcbiAgICAgICAgICAgIGhhc0RpcmVjdGl2ZXMgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoaGFzRGlyZWN0aXZlcylcbiAgICAgICAgbGluZXMucHVzaCgnLS0tJyk7XG4gICAgY29uc3QgY3R4ID0gY3JlYXRlU3RyaW5naWZ5Q29udGV4dChkb2MsIG9wdGlvbnMpO1xuICAgIGNvbnN0IHsgY29tbWVudFN0cmluZyB9ID0gY3R4Lm9wdGlvbnM7XG4gICAgaWYgKGRvYy5jb21tZW50QmVmb3JlKSB7XG4gICAgICAgIGlmIChsaW5lcy5sZW5ndGggIT09IDEpXG4gICAgICAgICAgICBsaW5lcy51bnNoaWZ0KCcnKTtcbiAgICAgICAgY29uc3QgY3MgPSBjb21tZW50U3RyaW5nKGRvYy5jb21tZW50QmVmb3JlKTtcbiAgICAgICAgbGluZXMudW5zaGlmdChpbmRlbnRDb21tZW50KGNzLCAnJykpO1xuICAgIH1cbiAgICBsZXQgY2hvbXBLZWVwID0gZmFsc2U7XG4gICAgbGV0IGNvbnRlbnRDb21tZW50ID0gbnVsbDtcbiAgICBpZiAoZG9jLmNvbnRlbnRzKSB7XG4gICAgICAgIGlmIChpc05vZGUoZG9jLmNvbnRlbnRzKSkge1xuICAgICAgICAgICAgaWYgKGRvYy5jb250ZW50cy5zcGFjZUJlZm9yZSAmJiBoYXNEaXJlY3RpdmVzKVxuICAgICAgICAgICAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgICAgICAgICAgaWYgKGRvYy5jb250ZW50cy5jb21tZW50QmVmb3JlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY3MgPSBjb21tZW50U3RyaW5nKGRvYy5jb250ZW50cy5jb21tZW50QmVmb3JlKTtcbiAgICAgICAgICAgICAgICBsaW5lcy5wdXNoKGluZGVudENvbW1lbnQoY3MsICcnKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyB0b3AtbGV2ZWwgYmxvY2sgc2NhbGFycyBuZWVkIHRvIGJlIGluZGVudGVkIGlmIGZvbGxvd2VkIGJ5IGEgY29tbWVudFxuICAgICAgICAgICAgY3R4LmZvcmNlQmxvY2tJbmRlbnQgPSAhIWRvYy5jb21tZW50O1xuICAgICAgICAgICAgY29udGVudENvbW1lbnQgPSBkb2MuY29udGVudHMuY29tbWVudDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvbkNob21wS2VlcCA9IGNvbnRlbnRDb21tZW50ID8gdW5kZWZpbmVkIDogKCkgPT4gKGNob21wS2VlcCA9IHRydWUpO1xuICAgICAgICBsZXQgYm9keSA9IHN0cmluZ2lmeShkb2MuY29udGVudHMsIGN0eCwgKCkgPT4gKGNvbnRlbnRDb21tZW50ID0gbnVsbCksIG9uQ2hvbXBLZWVwKTtcbiAgICAgICAgaWYgKGNvbnRlbnRDb21tZW50KVxuICAgICAgICAgICAgYm9keSArPSBsaW5lQ29tbWVudChib2R5LCAnJywgY29tbWVudFN0cmluZyhjb250ZW50Q29tbWVudCkpO1xuICAgICAgICBpZiAoKGJvZHlbMF0gPT09ICd8JyB8fCBib2R5WzBdID09PSAnPicpICYmXG4gICAgICAgICAgICBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXSA9PT0gJy0tLScpIHtcbiAgICAgICAgICAgIC8vIFRvcC1sZXZlbCBibG9jayBzY2FsYXJzIHdpdGggYSBwcmVjZWRpbmcgZG9jIG1hcmtlciBvdWdodCB0byB1c2UgdGhlXG4gICAgICAgICAgICAvLyBzYW1lIGxpbmUgZm9yIHRoZWlyIGhlYWRlci5cbiAgICAgICAgICAgIGxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdID0gYC0tLSAke2JvZHl9YDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBsaW5lcy5wdXNoKGJvZHkpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbGluZXMucHVzaChzdHJpbmdpZnkoZG9jLmNvbnRlbnRzLCBjdHgpKTtcbiAgICB9XG4gICAgaWYgKGRvYy5kaXJlY3RpdmVzPy5kb2NFbmQpIHtcbiAgICAgICAgaWYgKGRvYy5jb21tZW50KSB7XG4gICAgICAgICAgICBjb25zdCBjcyA9IGNvbW1lbnRTdHJpbmcoZG9jLmNvbW1lbnQpO1xuICAgICAgICAgICAgaWYgKGNzLmluY2x1ZGVzKCdcXG4nKSkge1xuICAgICAgICAgICAgICAgIGxpbmVzLnB1c2goJy4uLicpO1xuICAgICAgICAgICAgICAgIGxpbmVzLnB1c2goaW5kZW50Q29tbWVudChjcywgJycpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxpbmVzLnB1c2goYC4uLiAke2NzfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGluZXMucHVzaCgnLi4uJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGxldCBkYyA9IGRvYy5jb21tZW50O1xuICAgICAgICBpZiAoZGMgJiYgY2hvbXBLZWVwKVxuICAgICAgICAgICAgZGMgPSBkYy5yZXBsYWNlKC9eXFxuKy8sICcnKTtcbiAgICAgICAgaWYgKGRjKSB7XG4gICAgICAgICAgICBpZiAoKCFjaG9tcEtlZXAgfHwgY29udGVudENvbW1lbnQpICYmIGxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdICE9PSAnJylcbiAgICAgICAgICAgICAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICAgICAgICAgIGxpbmVzLnB1c2goaW5kZW50Q29tbWVudChjb21tZW50U3RyaW5nKGRjKSwgJycpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbGluZXMuam9pbignXFxuJykgKyAnXFxuJztcbn1cblxuZXhwb3J0IHsgc3RyaW5naWZ5RG9jdW1lbnQgfTtcbiIsImltcG9ydCB7IEFsaWFzIH0gZnJvbSAnLi4vbm9kZXMvQWxpYXMuanMnO1xuaW1wb3J0IHsgaXNFbXB0eVBhdGgsIGNvbGxlY3Rpb25Gcm9tUGF0aCB9IGZyb20gJy4uL25vZGVzL0NvbGxlY3Rpb24uanMnO1xuaW1wb3J0IHsgTk9ERV9UWVBFLCBET0MsIGlzTm9kZSwgaXNDb2xsZWN0aW9uLCBpc1NjYWxhciB9IGZyb20gJy4uL25vZGVzL2lkZW50aXR5LmpzJztcbmltcG9ydCB7IFBhaXIgfSBmcm9tICcuLi9ub2Rlcy9QYWlyLmpzJztcbmltcG9ydCB7IHRvSlMgfSBmcm9tICcuLi9ub2Rlcy90b0pTLmpzJztcbmltcG9ydCB7IFNjaGVtYSB9IGZyb20gJy4uL3NjaGVtYS9TY2hlbWEuanMnO1xuaW1wb3J0IHsgc3RyaW5naWZ5RG9jdW1lbnQgfSBmcm9tICcuLi9zdHJpbmdpZnkvc3RyaW5naWZ5RG9jdW1lbnQuanMnO1xuaW1wb3J0IHsgYW5jaG9yTmFtZXMsIGZpbmROZXdBbmNob3IsIGNyZWF0ZU5vZGVBbmNob3JzIH0gZnJvbSAnLi9hbmNob3JzLmpzJztcbmltcG9ydCB7IGFwcGx5UmV2aXZlciB9IGZyb20gJy4vYXBwbHlSZXZpdmVyLmpzJztcbmltcG9ydCB7IGNyZWF0ZU5vZGUgfSBmcm9tICcuL2NyZWF0ZU5vZGUuanMnO1xuaW1wb3J0IHsgRGlyZWN0aXZlcyB9IGZyb20gJy4vZGlyZWN0aXZlcy5qcyc7XG5cbmNsYXNzIERvY3VtZW50IHtcbiAgICBjb25zdHJ1Y3Rvcih2YWx1ZSwgcmVwbGFjZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgLyoqIEEgY29tbWVudCBiZWZvcmUgdGhpcyBEb2N1bWVudCAqL1xuICAgICAgICB0aGlzLmNvbW1lbnRCZWZvcmUgPSBudWxsO1xuICAgICAgICAvKiogQSBjb21tZW50IGltbWVkaWF0ZWx5IGFmdGVyIHRoaXMgRG9jdW1lbnQgKi9cbiAgICAgICAgdGhpcy5jb21tZW50ID0gbnVsbDtcbiAgICAgICAgLyoqIEVycm9ycyBlbmNvdW50ZXJlZCBkdXJpbmcgcGFyc2luZy4gKi9cbiAgICAgICAgdGhpcy5lcnJvcnMgPSBbXTtcbiAgICAgICAgLyoqIFdhcm5pbmdzIGVuY291bnRlcmVkIGR1cmluZyBwYXJzaW5nLiAqL1xuICAgICAgICB0aGlzLndhcm5pbmdzID0gW107XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBOT0RFX1RZUEUsIHsgdmFsdWU6IERPQyB9KTtcbiAgICAgICAgbGV0IF9yZXBsYWNlciA9IG51bGw7XG4gICAgICAgIGlmICh0eXBlb2YgcmVwbGFjZXIgPT09ICdmdW5jdGlvbicgfHwgQXJyYXkuaXNBcnJheShyZXBsYWNlcikpIHtcbiAgICAgICAgICAgIF9yZXBsYWNlciA9IHJlcGxhY2VyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCAmJiByZXBsYWNlcikge1xuICAgICAgICAgICAgb3B0aW9ucyA9IHJlcGxhY2VyO1xuICAgICAgICAgICAgcmVwbGFjZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3B0ID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgICBpbnRBc0JpZ0ludDogZmFsc2UsXG4gICAgICAgICAgICBrZWVwU291cmNlVG9rZW5zOiBmYWxzZSxcbiAgICAgICAgICAgIGxvZ0xldmVsOiAnd2FybicsXG4gICAgICAgICAgICBwcmV0dHlFcnJvcnM6IHRydWUsXG4gICAgICAgICAgICBzdHJpY3Q6IHRydWUsXG4gICAgICAgICAgICBzdHJpbmdLZXlzOiBmYWxzZSxcbiAgICAgICAgICAgIHVuaXF1ZUtleXM6IHRydWUsXG4gICAgICAgICAgICB2ZXJzaW9uOiAnMS4yJ1xuICAgICAgICB9LCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0O1xuICAgICAgICBsZXQgeyB2ZXJzaW9uIH0gPSBvcHQ7XG4gICAgICAgIGlmIChvcHRpb25zPy5fZGlyZWN0aXZlcykge1xuICAgICAgICAgICAgdGhpcy5kaXJlY3RpdmVzID0gb3B0aW9ucy5fZGlyZWN0aXZlcy5hdERvY3VtZW50KCk7XG4gICAgICAgICAgICBpZiAodGhpcy5kaXJlY3RpdmVzLnlhbWwuZXhwbGljaXQpXG4gICAgICAgICAgICAgICAgdmVyc2lvbiA9IHRoaXMuZGlyZWN0aXZlcy55YW1sLnZlcnNpb247XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhpcy5kaXJlY3RpdmVzID0gbmV3IERpcmVjdGl2ZXMoeyB2ZXJzaW9uIH0pO1xuICAgICAgICB0aGlzLnNldFNjaGVtYSh2ZXJzaW9uLCBvcHRpb25zKTtcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBXZSBjYW4ndCByZWFsbHkga25vdyB0aGF0IHRoaXMgbWF0Y2hlcyBDb250ZW50cy5cbiAgICAgICAgdGhpcy5jb250ZW50cyA9XG4gICAgICAgICAgICB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHRoaXMuY3JlYXRlTm9kZSh2YWx1ZSwgX3JlcGxhY2VyLCBvcHRpb25zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgZGVlcCBjb3B5IG9mIHRoaXMgRG9jdW1lbnQgYW5kIGl0cyBjb250ZW50cy5cbiAgICAgKlxuICAgICAqIEN1c3RvbSBOb2RlIHZhbHVlcyB0aGF0IGluaGVyaXQgZnJvbSBgT2JqZWN0YCBzdGlsbCByZWZlciB0byB0aGVpciBvcmlnaW5hbCBpbnN0YW5jZXMuXG4gICAgICovXG4gICAgY2xvbmUoKSB7XG4gICAgICAgIGNvbnN0IGNvcHkgPSBPYmplY3QuY3JlYXRlKERvY3VtZW50LnByb3RvdHlwZSwge1xuICAgICAgICAgICAgW05PREVfVFlQRV06IHsgdmFsdWU6IERPQyB9XG4gICAgICAgIH0pO1xuICAgICAgICBjb3B5LmNvbW1lbnRCZWZvcmUgPSB0aGlzLmNvbW1lbnRCZWZvcmU7XG4gICAgICAgIGNvcHkuY29tbWVudCA9IHRoaXMuY29tbWVudDtcbiAgICAgICAgY29weS5lcnJvcnMgPSB0aGlzLmVycm9ycy5zbGljZSgpO1xuICAgICAgICBjb3B5Lndhcm5pbmdzID0gdGhpcy53YXJuaW5ncy5zbGljZSgpO1xuICAgICAgICBjb3B5Lm9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLm9wdGlvbnMpO1xuICAgICAgICBpZiAodGhpcy5kaXJlY3RpdmVzKVxuICAgICAgICAgICAgY29weS5kaXJlY3RpdmVzID0gdGhpcy5kaXJlY3RpdmVzLmNsb25lKCk7XG4gICAgICAgIGNvcHkuc2NoZW1hID0gdGhpcy5zY2hlbWEuY2xvbmUoKTtcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBXZSBjYW4ndCByZWFsbHkga25vdyB0aGF0IHRoaXMgbWF0Y2hlcyBDb250ZW50cy5cbiAgICAgICAgY29weS5jb250ZW50cyA9IGlzTm9kZSh0aGlzLmNvbnRlbnRzKVxuICAgICAgICAgICAgPyB0aGlzLmNvbnRlbnRzLmNsb25lKGNvcHkuc2NoZW1hKVxuICAgICAgICAgICAgOiB0aGlzLmNvbnRlbnRzO1xuICAgICAgICBpZiAodGhpcy5yYW5nZSlcbiAgICAgICAgICAgIGNvcHkucmFuZ2UgPSB0aGlzLnJhbmdlLnNsaWNlKCk7XG4gICAgICAgIHJldHVybiBjb3B5O1xuICAgIH1cbiAgICAvKiogQWRkcyBhIHZhbHVlIHRvIHRoZSBkb2N1bWVudC4gKi9cbiAgICBhZGQodmFsdWUpIHtcbiAgICAgICAgaWYgKGFzc2VydENvbGxlY3Rpb24odGhpcy5jb250ZW50cykpXG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRzLmFkZCh2YWx1ZSk7XG4gICAgfVxuICAgIC8qKiBBZGRzIGEgdmFsdWUgdG8gdGhlIGRvY3VtZW50LiAqL1xuICAgIGFkZEluKHBhdGgsIHZhbHVlKSB7XG4gICAgICAgIGlmIChhc3NlcnRDb2xsZWN0aW9uKHRoaXMuY29udGVudHMpKVxuICAgICAgICAgICAgdGhpcy5jb250ZW50cy5hZGRJbihwYXRoLCB2YWx1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIG5ldyBgQWxpYXNgIG5vZGUsIGVuc3VyaW5nIHRoYXQgdGhlIHRhcmdldCBgbm9kZWAgaGFzIHRoZSByZXF1aXJlZCBhbmNob3IuXG4gICAgICpcbiAgICAgKiBJZiBgbm9kZWAgYWxyZWFkeSBoYXMgYW4gYW5jaG9yLCBgbmFtZWAgaXMgaWdub3JlZC5cbiAgICAgKiBPdGhlcndpc2UsIHRoZSBgbm9kZS5hbmNob3JgIHZhbHVlIHdpbGwgYmUgc2V0IHRvIGBuYW1lYCxcbiAgICAgKiBvciBpZiBhbiBhbmNob3Igd2l0aCB0aGF0IG5hbWUgaXMgYWxyZWFkeSBwcmVzZW50IGluIHRoZSBkb2N1bWVudCxcbiAgICAgKiBgbmFtZWAgd2lsbCBiZSB1c2VkIGFzIGEgcHJlZml4IGZvciBhIG5ldyB1bmlxdWUgYW5jaG9yLlxuICAgICAqIElmIGBuYW1lYCBpcyB1bmRlZmluZWQsIHRoZSBnZW5lcmF0ZWQgYW5jaG9yIHdpbGwgdXNlICdhJyBhcyBhIHByZWZpeC5cbiAgICAgKi9cbiAgICBjcmVhdGVBbGlhcyhub2RlLCBuYW1lKSB7XG4gICAgICAgIGlmICghbm9kZS5hbmNob3IpIHtcbiAgICAgICAgICAgIGNvbnN0IHByZXYgPSBhbmNob3JOYW1lcyh0aGlzKTtcbiAgICAgICAgICAgIG5vZGUuYW5jaG9yID1cbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1udWxsaXNoLWNvYWxlc2NpbmdcbiAgICAgICAgICAgICAgICAhbmFtZSB8fCBwcmV2LmhhcyhuYW1lKSA/IGZpbmROZXdBbmNob3IobmFtZSB8fCAnYScsIHByZXYpIDogbmFtZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEFsaWFzKG5vZGUuYW5jaG9yKTtcbiAgICB9XG4gICAgY3JlYXRlTm9kZSh2YWx1ZSwgcmVwbGFjZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgbGV0IF9yZXBsYWNlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHR5cGVvZiByZXBsYWNlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdmFsdWUgPSByZXBsYWNlci5jYWxsKHsgJyc6IHZhbHVlIH0sICcnLCB2YWx1ZSk7XG4gICAgICAgICAgICBfcmVwbGFjZXIgPSByZXBsYWNlcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHJlcGxhY2VyKSkge1xuICAgICAgICAgICAgY29uc3Qga2V5VG9TdHIgPSAodikgPT4gdHlwZW9mIHYgPT09ICdudW1iZXInIHx8IHYgaW5zdGFuY2VvZiBTdHJpbmcgfHwgdiBpbnN0YW5jZW9mIE51bWJlcjtcbiAgICAgICAgICAgIGNvbnN0IGFzU3RyID0gcmVwbGFjZXIuZmlsdGVyKGtleVRvU3RyKS5tYXAoU3RyaW5nKTtcbiAgICAgICAgICAgIGlmIChhc1N0ci5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgIHJlcGxhY2VyID0gcmVwbGFjZXIuY29uY2F0KGFzU3RyKTtcbiAgICAgICAgICAgIF9yZXBsYWNlciA9IHJlcGxhY2VyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCAmJiByZXBsYWNlcikge1xuICAgICAgICAgICAgb3B0aW9ucyA9IHJlcGxhY2VyO1xuICAgICAgICAgICAgcmVwbGFjZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBhbGlhc0R1cGxpY2F0ZU9iamVjdHMsIGFuY2hvclByZWZpeCwgZmxvdywga2VlcFVuZGVmaW5lZCwgb25UYWdPYmosIHRhZyB9ID0gb3B0aW9ucyA/PyB7fTtcbiAgICAgICAgY29uc3QgeyBvbkFuY2hvciwgc2V0QW5jaG9ycywgc291cmNlT2JqZWN0cyB9ID0gY3JlYXRlTm9kZUFuY2hvcnModGhpcywgXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLW51bGxpc2gtY29hbGVzY2luZ1xuICAgICAgICBhbmNob3JQcmVmaXggfHwgJ2EnKTtcbiAgICAgICAgY29uc3QgY3R4ID0ge1xuICAgICAgICAgICAgYWxpYXNEdXBsaWNhdGVPYmplY3RzOiBhbGlhc0R1cGxpY2F0ZU9iamVjdHMgPz8gdHJ1ZSxcbiAgICAgICAgICAgIGtlZXBVbmRlZmluZWQ6IGtlZXBVbmRlZmluZWQgPz8gZmFsc2UsXG4gICAgICAgICAgICBvbkFuY2hvcixcbiAgICAgICAgICAgIG9uVGFnT2JqLFxuICAgICAgICAgICAgcmVwbGFjZXI6IF9yZXBsYWNlcixcbiAgICAgICAgICAgIHNjaGVtYTogdGhpcy5zY2hlbWEsXG4gICAgICAgICAgICBzb3VyY2VPYmplY3RzXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IG5vZGUgPSBjcmVhdGVOb2RlKHZhbHVlLCB0YWcsIGN0eCk7XG4gICAgICAgIGlmIChmbG93ICYmIGlzQ29sbGVjdGlvbihub2RlKSlcbiAgICAgICAgICAgIG5vZGUuZmxvdyA9IHRydWU7XG4gICAgICAgIHNldEFuY2hvcnMoKTtcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnQgYSBrZXkgYW5kIGEgdmFsdWUgaW50byBhIGBQYWlyYCB1c2luZyB0aGUgY3VycmVudCBzY2hlbWEsXG4gICAgICogcmVjdXJzaXZlbHkgd3JhcHBpbmcgYWxsIHZhbHVlcyBhcyBgU2NhbGFyYCBvciBgQ29sbGVjdGlvbmAgbm9kZXMuXG4gICAgICovXG4gICAgY3JlYXRlUGFpcihrZXksIHZhbHVlLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgayA9IHRoaXMuY3JlYXRlTm9kZShrZXksIG51bGwsIG9wdGlvbnMpO1xuICAgICAgICBjb25zdCB2ID0gdGhpcy5jcmVhdGVOb2RlKHZhbHVlLCBudWxsLCBvcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQYWlyKGssIHYpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGEgdmFsdWUgZnJvbSB0aGUgZG9jdW1lbnQuXG4gICAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBpdGVtIHdhcyBmb3VuZCBhbmQgcmVtb3ZlZC5cbiAgICAgKi9cbiAgICBkZWxldGUoa2V5KSB7XG4gICAgICAgIHJldHVybiBhc3NlcnRDb2xsZWN0aW9uKHRoaXMuY29udGVudHMpID8gdGhpcy5jb250ZW50cy5kZWxldGUoa2V5KSA6IGZhbHNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGEgdmFsdWUgZnJvbSB0aGUgZG9jdW1lbnQuXG4gICAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBpdGVtIHdhcyBmb3VuZCBhbmQgcmVtb3ZlZC5cbiAgICAgKi9cbiAgICBkZWxldGVJbihwYXRoKSB7XG4gICAgICAgIGlmIChpc0VtcHR5UGF0aChwYXRoKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuY29udGVudHMgPT0gbnVsbClcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIFByZXN1bWVkIGltcG9zc2libGUgaWYgU3RyaWN0IGV4dGVuZHMgZmFsc2VcbiAgICAgICAgICAgIHRoaXMuY29udGVudHMgPSBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFzc2VydENvbGxlY3Rpb24odGhpcy5jb250ZW50cylcbiAgICAgICAgICAgID8gdGhpcy5jb250ZW50cy5kZWxldGVJbihwYXRoKVxuICAgICAgICAgICAgOiBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBpdGVtIGF0IGBrZXlgLCBvciBgdW5kZWZpbmVkYCBpZiBub3QgZm91bmQuIEJ5IGRlZmF1bHQgdW53cmFwc1xuICAgICAqIHNjYWxhciB2YWx1ZXMgZnJvbSB0aGVpciBzdXJyb3VuZGluZyBub2RlOyB0byBkaXNhYmxlIHNldCBga2VlcFNjYWxhcmAgdG9cbiAgICAgKiBgdHJ1ZWAgKGNvbGxlY3Rpb25zIGFyZSBhbHdheXMgcmV0dXJuZWQgaW50YWN0KS5cbiAgICAgKi9cbiAgICBnZXQoa2V5LCBrZWVwU2NhbGFyKSB7XG4gICAgICAgIHJldHVybiBpc0NvbGxlY3Rpb24odGhpcy5jb250ZW50cylcbiAgICAgICAgICAgID8gdGhpcy5jb250ZW50cy5nZXQoa2V5LCBrZWVwU2NhbGFyKVxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgaXRlbSBhdCBgcGF0aGAsIG9yIGB1bmRlZmluZWRgIGlmIG5vdCBmb3VuZC4gQnkgZGVmYXVsdCB1bndyYXBzXG4gICAgICogc2NhbGFyIHZhbHVlcyBmcm9tIHRoZWlyIHN1cnJvdW5kaW5nIG5vZGU7IHRvIGRpc2FibGUgc2V0IGBrZWVwU2NhbGFyYCB0b1xuICAgICAqIGB0cnVlYCAoY29sbGVjdGlvbnMgYXJlIGFsd2F5cyByZXR1cm5lZCBpbnRhY3QpLlxuICAgICAqL1xuICAgIGdldEluKHBhdGgsIGtlZXBTY2FsYXIpIHtcbiAgICAgICAgaWYgKGlzRW1wdHlQYXRoKHBhdGgpKVxuICAgICAgICAgICAgcmV0dXJuICFrZWVwU2NhbGFyICYmIGlzU2NhbGFyKHRoaXMuY29udGVudHMpXG4gICAgICAgICAgICAgICAgPyB0aGlzLmNvbnRlbnRzLnZhbHVlXG4gICAgICAgICAgICAgICAgOiB0aGlzLmNvbnRlbnRzO1xuICAgICAgICByZXR1cm4gaXNDb2xsZWN0aW9uKHRoaXMuY29udGVudHMpXG4gICAgICAgICAgICA/IHRoaXMuY29udGVudHMuZ2V0SW4ocGF0aCwga2VlcFNjYWxhcilcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhlIGRvY3VtZW50IGluY2x1ZGVzIGEgdmFsdWUgd2l0aCB0aGUga2V5IGBrZXlgLlxuICAgICAqL1xuICAgIGhhcyhrZXkpIHtcbiAgICAgICAgcmV0dXJuIGlzQ29sbGVjdGlvbih0aGlzLmNvbnRlbnRzKSA/IHRoaXMuY29udGVudHMuaGFzKGtleSkgOiBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSBkb2N1bWVudCBpbmNsdWRlcyBhIHZhbHVlIGF0IGBwYXRoYC5cbiAgICAgKi9cbiAgICBoYXNJbihwYXRoKSB7XG4gICAgICAgIGlmIChpc0VtcHR5UGF0aChwYXRoKSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnRzICE9PSB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiBpc0NvbGxlY3Rpb24odGhpcy5jb250ZW50cykgPyB0aGlzLmNvbnRlbnRzLmhhc0luKHBhdGgpIDogZmFsc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgYSB2YWx1ZSBpbiB0aGlzIGRvY3VtZW50LiBGb3IgYCEhc2V0YCwgYHZhbHVlYCBuZWVkcyB0byBiZSBhXG4gICAgICogYm9vbGVhbiB0byBhZGQvcmVtb3ZlIHRoZSBpdGVtIGZyb20gdGhlIHNldC5cbiAgICAgKi9cbiAgICBzZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgICBpZiAodGhpcy5jb250ZW50cyA9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIFdlIGNhbid0IHJlYWxseSBrbm93IHRoYXQgdGhpcyBtYXRjaGVzIENvbnRlbnRzLlxuICAgICAgICAgICAgdGhpcy5jb250ZW50cyA9IGNvbGxlY3Rpb25Gcm9tUGF0aCh0aGlzLnNjaGVtYSwgW2tleV0sIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhc3NlcnRDb2xsZWN0aW9uKHRoaXMuY29udGVudHMpKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRzLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIGEgdmFsdWUgaW4gdGhpcyBkb2N1bWVudC4gRm9yIGAhIXNldGAsIGB2YWx1ZWAgbmVlZHMgdG8gYmUgYVxuICAgICAqIGJvb2xlYW4gdG8gYWRkL3JlbW92ZSB0aGUgaXRlbSBmcm9tIHRoZSBzZXQuXG4gICAgICovXG4gICAgc2V0SW4ocGF0aCwgdmFsdWUpIHtcbiAgICAgICAgaWYgKGlzRW1wdHlQYXRoKHBhdGgpKSB7XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIFdlIGNhbid0IHJlYWxseSBrbm93IHRoYXQgdGhpcyBtYXRjaGVzIENvbnRlbnRzLlxuICAgICAgICAgICAgdGhpcy5jb250ZW50cyA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuY29udGVudHMgPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBXZSBjYW4ndCByZWFsbHkga25vdyB0aGF0IHRoaXMgbWF0Y2hlcyBDb250ZW50cy5cbiAgICAgICAgICAgIHRoaXMuY29udGVudHMgPSBjb2xsZWN0aW9uRnJvbVBhdGgodGhpcy5zY2hlbWEsIEFycmF5LmZyb20ocGF0aCksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhc3NlcnRDb2xsZWN0aW9uKHRoaXMuY29udGVudHMpKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRzLnNldEluKHBhdGgsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGFuZ2UgdGhlIFlBTUwgdmVyc2lvbiBhbmQgc2NoZW1hIHVzZWQgYnkgdGhlIGRvY3VtZW50LlxuICAgICAqIEEgYG51bGxgIHZlcnNpb24gZGlzYWJsZXMgc3VwcG9ydCBmb3IgZGlyZWN0aXZlcywgZXhwbGljaXQgdGFncywgYW5jaG9ycywgYW5kIGFsaWFzZXMuXG4gICAgICogSXQgYWxzbyByZXF1aXJlcyB0aGUgYHNjaGVtYWAgb3B0aW9uIHRvIGJlIGdpdmVuIGFzIGEgYFNjaGVtYWAgaW5zdGFuY2UgdmFsdWUuXG4gICAgICpcbiAgICAgKiBPdmVycmlkZXMgYWxsIHByZXZpb3VzbHkgc2V0IHNjaGVtYSBvcHRpb25zLlxuICAgICAqL1xuICAgIHNldFNjaGVtYSh2ZXJzaW9uLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2ZXJzaW9uID09PSAnbnVtYmVyJylcbiAgICAgICAgICAgIHZlcnNpb24gPSBTdHJpbmcodmVyc2lvbik7XG4gICAgICAgIGxldCBvcHQ7XG4gICAgICAgIHN3aXRjaCAodmVyc2lvbikge1xuICAgICAgICAgICAgY2FzZSAnMS4xJzpcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kaXJlY3RpdmVzKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpcmVjdGl2ZXMueWFtbC52ZXJzaW9uID0gJzEuMSc7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpcmVjdGl2ZXMgPSBuZXcgRGlyZWN0aXZlcyh7IHZlcnNpb246ICcxLjEnIH0pO1xuICAgICAgICAgICAgICAgIG9wdCA9IHsgcmVzb2x2ZUtub3duVGFnczogZmFsc2UsIHNjaGVtYTogJ3lhbWwtMS4xJyB9O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnMS4yJzpcbiAgICAgICAgICAgIGNhc2UgJ25leHQnOlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRpcmVjdGl2ZXMpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlyZWN0aXZlcy55YW1sLnZlcnNpb24gPSB2ZXJzaW9uO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXJlY3RpdmVzID0gbmV3IERpcmVjdGl2ZXMoeyB2ZXJzaW9uIH0pO1xuICAgICAgICAgICAgICAgIG9wdCA9IHsgcmVzb2x2ZUtub3duVGFnczogdHJ1ZSwgc2NoZW1hOiAnY29yZScgfTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgbnVsbDpcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kaXJlY3RpdmVzKVxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5kaXJlY3RpdmVzO1xuICAgICAgICAgICAgICAgIG9wdCA9IG51bGw7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3YgPSBKU09OLnN0cmluZ2lmeSh2ZXJzaW9uKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkICcxLjEnLCAnMS4yJyBvciBudWxsIGFzIGZpcnN0IGFyZ3VtZW50LCBidXQgZm91bmQ6ICR7c3Z9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gTm90IHVzaW5nIGBpbnN0YW5jZW9mIFNjaGVtYWAgdG8gYWxsb3cgZm9yIGR1Y2sgdHlwaW5nXG4gICAgICAgIGlmIChvcHRpb25zLnNjaGVtYSBpbnN0YW5jZW9mIE9iamVjdClcbiAgICAgICAgICAgIHRoaXMuc2NoZW1hID0gb3B0aW9ucy5zY2hlbWE7XG4gICAgICAgIGVsc2UgaWYgKG9wdClcbiAgICAgICAgICAgIHRoaXMuc2NoZW1hID0gbmV3IFNjaGVtYShPYmplY3QuYXNzaWduKG9wdCwgb3B0aW9ucykpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFdpdGggYSBudWxsIFlBTUwgdmVyc2lvbiwgdGhlIHsgc2NoZW1hOiBTY2hlbWEgfSBvcHRpb24gaXMgcmVxdWlyZWRgKTtcbiAgICB9XG4gICAgLy8ganNvbiAmIGpzb25BcmcgYXJlIG9ubHkgdXNlZCBmcm9tIHRvSlNPTigpXG4gICAgdG9KUyh7IGpzb24sIGpzb25BcmcsIG1hcEFzTWFwLCBtYXhBbGlhc0NvdW50LCBvbkFuY2hvciwgcmV2aXZlciB9ID0ge30pIHtcbiAgICAgICAgY29uc3QgY3R4ID0ge1xuICAgICAgICAgICAgYW5jaG9yczogbmV3IE1hcCgpLFxuICAgICAgICAgICAgZG9jOiB0aGlzLFxuICAgICAgICAgICAga2VlcDogIWpzb24sXG4gICAgICAgICAgICBtYXBBc01hcDogbWFwQXNNYXAgPT09IHRydWUsXG4gICAgICAgICAgICBtYXBLZXlXYXJuZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbWF4QWxpYXNDb3VudDogdHlwZW9mIG1heEFsaWFzQ291bnQgPT09ICdudW1iZXInID8gbWF4QWxpYXNDb3VudCA6IDEwMFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCByZXMgPSB0b0pTKHRoaXMuY29udGVudHMsIGpzb25BcmcgPz8gJycsIGN0eCk7XG4gICAgICAgIGlmICh0eXBlb2Ygb25BbmNob3IgPT09ICdmdW5jdGlvbicpXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHsgY291bnQsIHJlcyB9IG9mIGN0eC5hbmNob3JzLnZhbHVlcygpKVxuICAgICAgICAgICAgICAgIG9uQW5jaG9yKHJlcywgY291bnQpO1xuICAgICAgICByZXR1cm4gdHlwZW9mIHJldml2ZXIgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgID8gYXBwbHlSZXZpdmVyKHJldml2ZXIsIHsgJyc6IHJlcyB9LCAnJywgcmVzKVxuICAgICAgICAgICAgOiByZXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgSlNPTiByZXByZXNlbnRhdGlvbiBvZiB0aGUgZG9jdW1lbnQgYGNvbnRlbnRzYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBqc29uQXJnIFVzZWQgYnkgYEpTT04uc3RyaW5naWZ5YCB0byBpbmRpY2F0ZSB0aGUgYXJyYXkgaW5kZXggb3JcbiAgICAgKiAgIHByb3BlcnR5IG5hbWUuXG4gICAgICovXG4gICAgdG9KU09OKGpzb25BcmcsIG9uQW5jaG9yKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRvSlMoeyBqc29uOiB0cnVlLCBqc29uQXJnLCBtYXBBc01hcDogZmFsc2UsIG9uQW5jaG9yIH0pO1xuICAgIH1cbiAgICAvKiogQSBZQU1MIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBkb2N1bWVudC4gKi9cbiAgICB0b1N0cmluZyhvcHRpb25zID0ge30pIHtcbiAgICAgICAgaWYgKHRoaXMuZXJyb3JzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RvY3VtZW50IHdpdGggZXJyb3JzIGNhbm5vdCBiZSBzdHJpbmdpZmllZCcpO1xuICAgICAgICBpZiAoJ2luZGVudCcgaW4gb3B0aW9ucyAmJlxuICAgICAgICAgICAgKCFOdW1iZXIuaXNJbnRlZ2VyKG9wdGlvbnMuaW5kZW50KSB8fCBOdW1iZXIob3B0aW9ucy5pbmRlbnQpIDw9IDApKSB7XG4gICAgICAgICAgICBjb25zdCBzID0gSlNPTi5zdHJpbmdpZnkob3B0aW9ucy5pbmRlbnQpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBcImluZGVudFwiIG9wdGlvbiBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciwgbm90ICR7c31gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RyaW5naWZ5RG9jdW1lbnQodGhpcywgb3B0aW9ucyk7XG4gICAgfVxufVxuZnVuY3Rpb24gYXNzZXJ0Q29sbGVjdGlvbihjb250ZW50cykge1xuICAgIGlmIChpc0NvbGxlY3Rpb24oY29udGVudHMpKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGEgWUFNTCBjb2xsZWN0aW9uIGFzIGRvY3VtZW50IGNvbnRlbnRzJyk7XG59XG5cbmV4cG9ydCB7IERvY3VtZW50IH07XG4iLCJjbGFzcyBZQU1MRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IobmFtZSwgcG9zLCBjb2RlLCBtZXNzYWdlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgICAgIHRoaXMucG9zID0gcG9zO1xuICAgIH1cbn1cbmNsYXNzIFlBTUxQYXJzZUVycm9yIGV4dGVuZHMgWUFNTEVycm9yIHtcbiAgICBjb25zdHJ1Y3Rvcihwb3MsIGNvZGUsIG1lc3NhZ2UpIHtcbiAgICAgICAgc3VwZXIoJ1lBTUxQYXJzZUVycm9yJywgcG9zLCBjb2RlLCBtZXNzYWdlKTtcbiAgICB9XG59XG5jbGFzcyBZQU1MV2FybmluZyBleHRlbmRzIFlBTUxFcnJvciB7XG4gICAgY29uc3RydWN0b3IocG9zLCBjb2RlLCBtZXNzYWdlKSB7XG4gICAgICAgIHN1cGVyKCdZQU1MV2FybmluZycsIHBvcywgY29kZSwgbWVzc2FnZSk7XG4gICAgfVxufVxuY29uc3QgcHJldHRpZnlFcnJvciA9IChzcmMsIGxjKSA9PiAoZXJyb3IpID0+IHtcbiAgICBpZiAoZXJyb3IucG9zWzBdID09PSAtMSlcbiAgICAgICAgcmV0dXJuO1xuICAgIGVycm9yLmxpbmVQb3MgPSBlcnJvci5wb3MubWFwKHBvcyA9PiBsYy5saW5lUG9zKHBvcykpO1xuICAgIGNvbnN0IHsgbGluZSwgY29sIH0gPSBlcnJvci5saW5lUG9zWzBdO1xuICAgIGVycm9yLm1lc3NhZ2UgKz0gYCBhdCBsaW5lICR7bGluZX0sIGNvbHVtbiAke2NvbH1gO1xuICAgIGxldCBjaSA9IGNvbCAtIDE7XG4gICAgbGV0IGxpbmVTdHIgPSBzcmNcbiAgICAgICAgLnN1YnN0cmluZyhsYy5saW5lU3RhcnRzW2xpbmUgLSAxXSwgbGMubGluZVN0YXJ0c1tsaW5lXSlcbiAgICAgICAgLnJlcGxhY2UoL1tcXG5cXHJdKyQvLCAnJyk7XG4gICAgLy8gVHJpbSB0byBtYXggODAgY2hhcnMsIGtlZXBpbmcgY29sIHBvc2l0aW9uIG5lYXIgdGhlIG1pZGRsZVxuICAgIGlmIChjaSA+PSA2MCAmJiBsaW5lU3RyLmxlbmd0aCA+IDgwKSB7XG4gICAgICAgIGNvbnN0IHRyaW1TdGFydCA9IE1hdGgubWluKGNpIC0gMzksIGxpbmVTdHIubGVuZ3RoIC0gNzkpO1xuICAgICAgICBsaW5lU3RyID0gJ+KApicgKyBsaW5lU3RyLnN1YnN0cmluZyh0cmltU3RhcnQpO1xuICAgICAgICBjaSAtPSB0cmltU3RhcnQgLSAxO1xuICAgIH1cbiAgICBpZiAobGluZVN0ci5sZW5ndGggPiA4MClcbiAgICAgICAgbGluZVN0ciA9IGxpbmVTdHIuc3Vic3RyaW5nKDAsIDc5KSArICfigKYnO1xuICAgIC8vIEluY2x1ZGUgcHJldmlvdXMgbGluZSBpbiBjb250ZXh0IGlmIHBvaW50aW5nIGF0IGxpbmUgc3RhcnRcbiAgICBpZiAobGluZSA+IDEgJiYgL14gKiQvLnRlc3QobGluZVN0ci5zdWJzdHJpbmcoMCwgY2kpKSkge1xuICAgICAgICAvLyBSZWdleHAgd29uJ3QgbWF0Y2ggaWYgc3RhcnQgaXMgdHJpbW1lZFxuICAgICAgICBsZXQgcHJldiA9IHNyYy5zdWJzdHJpbmcobGMubGluZVN0YXJ0c1tsaW5lIC0gMl0sIGxjLmxpbmVTdGFydHNbbGluZSAtIDFdKTtcbiAgICAgICAgaWYgKHByZXYubGVuZ3RoID4gODApXG4gICAgICAgICAgICBwcmV2ID0gcHJldi5zdWJzdHJpbmcoMCwgNzkpICsgJ+KAplxcbic7XG4gICAgICAgIGxpbmVTdHIgPSBwcmV2ICsgbGluZVN0cjtcbiAgICB9XG4gICAgaWYgKC9bXiBdLy50ZXN0KGxpbmVTdHIpKSB7XG4gICAgICAgIGxldCBjb3VudCA9IDE7XG4gICAgICAgIGNvbnN0IGVuZCA9IGVycm9yLmxpbmVQb3NbMV07XG4gICAgICAgIGlmIChlbmQ/LmxpbmUgPT09IGxpbmUgJiYgZW5kLmNvbCA+IGNvbCkge1xuICAgICAgICAgICAgY291bnQgPSBNYXRoLm1heCgxLCBNYXRoLm1pbihlbmQuY29sIC0gY29sLCA4MCAtIGNpKSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcG9pbnRlciA9ICcgJy5yZXBlYXQoY2kpICsgJ14nLnJlcGVhdChjb3VudCk7XG4gICAgICAgIGVycm9yLm1lc3NhZ2UgKz0gYDpcXG5cXG4ke2xpbmVTdHJ9XFxuJHtwb2ludGVyfVxcbmA7XG4gICAgfVxufTtcblxuZXhwb3J0IHsgWUFNTEVycm9yLCBZQU1MUGFyc2VFcnJvciwgWUFNTFdhcm5pbmcsIHByZXR0aWZ5RXJyb3IgfTtcbiIsImZ1bmN0aW9uIHJlc29sdmVQcm9wcyh0b2tlbnMsIHsgZmxvdywgaW5kaWNhdG9yLCBuZXh0LCBvZmZzZXQsIG9uRXJyb3IsIHBhcmVudEluZGVudCwgc3RhcnRPbk5ld2xpbmUgfSkge1xuICAgIGxldCBzcGFjZUJlZm9yZSA9IGZhbHNlO1xuICAgIGxldCBhdE5ld2xpbmUgPSBzdGFydE9uTmV3bGluZTtcbiAgICBsZXQgaGFzU3BhY2UgPSBzdGFydE9uTmV3bGluZTtcbiAgICBsZXQgY29tbWVudCA9ICcnO1xuICAgIGxldCBjb21tZW50U2VwID0gJyc7XG4gICAgbGV0IGhhc05ld2xpbmUgPSBmYWxzZTtcbiAgICBsZXQgcmVxU3BhY2UgPSBmYWxzZTtcbiAgICBsZXQgdGFiID0gbnVsbDtcbiAgICBsZXQgYW5jaG9yID0gbnVsbDtcbiAgICBsZXQgdGFnID0gbnVsbDtcbiAgICBsZXQgbmV3bGluZUFmdGVyUHJvcCA9IG51bGw7XG4gICAgbGV0IGNvbW1hID0gbnVsbDtcbiAgICBsZXQgZm91bmQgPSBudWxsO1xuICAgIGxldCBzdGFydCA9IG51bGw7XG4gICAgZm9yIChjb25zdCB0b2tlbiBvZiB0b2tlbnMpIHtcbiAgICAgICAgaWYgKHJlcVNwYWNlKSB7XG4gICAgICAgICAgICBpZiAodG9rZW4udHlwZSAhPT0gJ3NwYWNlJyAmJlxuICAgICAgICAgICAgICAgIHRva2VuLnR5cGUgIT09ICduZXdsaW5lJyAmJlxuICAgICAgICAgICAgICAgIHRva2VuLnR5cGUgIT09ICdjb21tYScpXG4gICAgICAgICAgICAgICAgb25FcnJvcih0b2tlbi5vZmZzZXQsICdNSVNTSU5HX0NIQVInLCAnVGFncyBhbmQgYW5jaG9ycyBtdXN0IGJlIHNlcGFyYXRlZCBmcm9tIHRoZSBuZXh0IHRva2VuIGJ5IHdoaXRlIHNwYWNlJyk7XG4gICAgICAgICAgICByZXFTcGFjZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0YWIpIHtcbiAgICAgICAgICAgIGlmIChhdE5ld2xpbmUgJiYgdG9rZW4udHlwZSAhPT0gJ2NvbW1lbnQnICYmIHRva2VuLnR5cGUgIT09ICduZXdsaW5lJykge1xuICAgICAgICAgICAgICAgIG9uRXJyb3IodGFiLCAnVEFCX0FTX0lOREVOVCcsICdUYWJzIGFyZSBub3QgYWxsb3dlZCBhcyBpbmRlbnRhdGlvbicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGFiID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBzd2l0Y2ggKHRva2VuLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ3NwYWNlJzpcbiAgICAgICAgICAgICAgICAvLyBBdCB0aGUgZG9jIGxldmVsLCB0YWJzIGF0IGxpbmUgc3RhcnQgbWF5IGJlIHBhcnNlZFxuICAgICAgICAgICAgICAgIC8vIGFzIGxlYWRpbmcgd2hpdGUgc3BhY2UgcmF0aGVyIHRoYW4gaW5kZW50YXRpb24uXG4gICAgICAgICAgICAgICAgLy8gSW4gYSBmbG93IGNvbGxlY3Rpb24sIG9ubHkgdGhlIHBhcnNlciBoYW5kbGVzIGluZGVudC5cbiAgICAgICAgICAgICAgICBpZiAoIWZsb3cgJiZcbiAgICAgICAgICAgICAgICAgICAgKGluZGljYXRvciAhPT0gJ2RvYy1zdGFydCcgfHwgbmV4dD8udHlwZSAhPT0gJ2Zsb3ctY29sbGVjdGlvbicpICYmXG4gICAgICAgICAgICAgICAgICAgIHRva2VuLnNvdXJjZS5pbmNsdWRlcygnXFx0JykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGFiID0gdG9rZW47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGhhc1NwYWNlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2NvbW1lbnQnOiB7XG4gICAgICAgICAgICAgICAgaWYgKCFoYXNTcGFjZSlcbiAgICAgICAgICAgICAgICAgICAgb25FcnJvcih0b2tlbiwgJ01JU1NJTkdfQ0hBUicsICdDb21tZW50cyBtdXN0IGJlIHNlcGFyYXRlZCBmcm9tIG90aGVyIHRva2VucyBieSB3aGl0ZSBzcGFjZSBjaGFyYWN0ZXJzJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgY2IgPSB0b2tlbi5zb3VyY2Uuc3Vic3RyaW5nKDEpIHx8ICcgJztcbiAgICAgICAgICAgICAgICBpZiAoIWNvbW1lbnQpXG4gICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBjYjtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgKz0gY29tbWVudFNlcCArIGNiO1xuICAgICAgICAgICAgICAgIGNvbW1lbnRTZXAgPSAnJztcbiAgICAgICAgICAgICAgICBhdE5ld2xpbmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ25ld2xpbmUnOlxuICAgICAgICAgICAgICAgIGlmIChhdE5ld2xpbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbW1lbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50ICs9IHRva2VuLnNvdXJjZTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIWZvdW5kIHx8IGluZGljYXRvciAhPT0gJ3NlcS1pdGVtLWluZCcpXG4gICAgICAgICAgICAgICAgICAgICAgICBzcGFjZUJlZm9yZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgY29tbWVudFNlcCArPSB0b2tlbi5zb3VyY2U7XG4gICAgICAgICAgICAgICAgYXROZXdsaW5lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBoYXNOZXdsaW5lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAoYW5jaG9yIHx8IHRhZylcbiAgICAgICAgICAgICAgICAgICAgbmV3bGluZUFmdGVyUHJvcCA9IHRva2VuO1xuICAgICAgICAgICAgICAgIGhhc1NwYWNlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2FuY2hvcic6XG4gICAgICAgICAgICAgICAgaWYgKGFuY2hvcilcbiAgICAgICAgICAgICAgICAgICAgb25FcnJvcih0b2tlbiwgJ01VTFRJUExFX0FOQ0hPUlMnLCAnQSBub2RlIGNhbiBoYXZlIGF0IG1vc3Qgb25lIGFuY2hvcicpO1xuICAgICAgICAgICAgICAgIGlmICh0b2tlbi5zb3VyY2UuZW5kc1dpdGgoJzonKSlcbiAgICAgICAgICAgICAgICAgICAgb25FcnJvcih0b2tlbi5vZmZzZXQgKyB0b2tlbi5zb3VyY2UubGVuZ3RoIC0gMSwgJ0JBRF9BTElBUycsICdBbmNob3IgZW5kaW5nIGluIDogaXMgYW1iaWd1b3VzJywgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgYW5jaG9yID0gdG9rZW47XG4gICAgICAgICAgICAgICAgc3RhcnQgPz8gKHN0YXJ0ID0gdG9rZW4ub2Zmc2V0KTtcbiAgICAgICAgICAgICAgICBhdE5ld2xpbmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBoYXNTcGFjZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHJlcVNwYWNlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3RhZyc6IHtcbiAgICAgICAgICAgICAgICBpZiAodGFnKVxuICAgICAgICAgICAgICAgICAgICBvbkVycm9yKHRva2VuLCAnTVVMVElQTEVfVEFHUycsICdBIG5vZGUgY2FuIGhhdmUgYXQgbW9zdCBvbmUgdGFnJyk7XG4gICAgICAgICAgICAgICAgdGFnID0gdG9rZW47XG4gICAgICAgICAgICAgICAgc3RhcnQgPz8gKHN0YXJ0ID0gdG9rZW4ub2Zmc2V0KTtcbiAgICAgICAgICAgICAgICBhdE5ld2xpbmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBoYXNTcGFjZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHJlcVNwYWNlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgaW5kaWNhdG9yOlxuICAgICAgICAgICAgICAgIC8vIENvdWxkIGhlcmUgaGFuZGxlIHByZWNlZGluZyBjb21tZW50cyBkaWZmZXJlbnRseVxuICAgICAgICAgICAgICAgIGlmIChhbmNob3IgfHwgdGFnKVxuICAgICAgICAgICAgICAgICAgICBvbkVycm9yKHRva2VuLCAnQkFEX1BST1BfT1JERVInLCBgQW5jaG9ycyBhbmQgdGFncyBtdXN0IGJlIGFmdGVyIHRoZSAke3Rva2VuLnNvdXJjZX0gaW5kaWNhdG9yYCk7XG4gICAgICAgICAgICAgICAgaWYgKGZvdW5kKVxuICAgICAgICAgICAgICAgICAgICBvbkVycm9yKHRva2VuLCAnVU5FWFBFQ1RFRF9UT0tFTicsIGBVbmV4cGVjdGVkICR7dG9rZW4uc291cmNlfSBpbiAke2Zsb3cgPz8gJ2NvbGxlY3Rpb24nfWApO1xuICAgICAgICAgICAgICAgIGZvdW5kID0gdG9rZW47XG4gICAgICAgICAgICAgICAgYXROZXdsaW5lID1cbiAgICAgICAgICAgICAgICAgICAgaW5kaWNhdG9yID09PSAnc2VxLWl0ZW0taW5kJyB8fCBpbmRpY2F0b3IgPT09ICdleHBsaWNpdC1rZXktaW5kJztcbiAgICAgICAgICAgICAgICBoYXNTcGFjZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnY29tbWEnOlxuICAgICAgICAgICAgICAgIGlmIChmbG93KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb21tYSlcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uRXJyb3IodG9rZW4sICdVTkVYUEVDVEVEX1RPS0VOJywgYFVuZXhwZWN0ZWQgLCBpbiAke2Zsb3d9YCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbW1hID0gdG9rZW47XG4gICAgICAgICAgICAgICAgICAgIGF0TmV3bGluZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBoYXNTcGFjZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBlbHNlIGZhbGx0aHJvdWdoXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIG9uRXJyb3IodG9rZW4sICdVTkVYUEVDVEVEX1RPS0VOJywgYFVuZXhwZWN0ZWQgJHt0b2tlbi50eXBlfSB0b2tlbmApO1xuICAgICAgICAgICAgICAgIGF0TmV3bGluZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGhhc1NwYWNlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbGFzdCA9IHRva2Vuc1t0b2tlbnMubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgZW5kID0gbGFzdCA/IGxhc3Qub2Zmc2V0ICsgbGFzdC5zb3VyY2UubGVuZ3RoIDogb2Zmc2V0O1xuICAgIGlmIChyZXFTcGFjZSAmJlxuICAgICAgICBuZXh0ICYmXG4gICAgICAgIG5leHQudHlwZSAhPT0gJ3NwYWNlJyAmJlxuICAgICAgICBuZXh0LnR5cGUgIT09ICduZXdsaW5lJyAmJlxuICAgICAgICBuZXh0LnR5cGUgIT09ICdjb21tYScgJiZcbiAgICAgICAgKG5leHQudHlwZSAhPT0gJ3NjYWxhcicgfHwgbmV4dC5zb3VyY2UgIT09ICcnKSkge1xuICAgICAgICBvbkVycm9yKG5leHQub2Zmc2V0LCAnTUlTU0lOR19DSEFSJywgJ1RhZ3MgYW5kIGFuY2hvcnMgbXVzdCBiZSBzZXBhcmF0ZWQgZnJvbSB0aGUgbmV4dCB0b2tlbiBieSB3aGl0ZSBzcGFjZScpO1xuICAgIH1cbiAgICBpZiAodGFiICYmXG4gICAgICAgICgoYXROZXdsaW5lICYmIHRhYi5pbmRlbnQgPD0gcGFyZW50SW5kZW50KSB8fFxuICAgICAgICAgICAgbmV4dD8udHlwZSA9PT0gJ2Jsb2NrLW1hcCcgfHxcbiAgICAgICAgICAgIG5leHQ/LnR5cGUgPT09ICdibG9jay1zZXEnKSlcbiAgICAgICAgb25FcnJvcih0YWIsICdUQUJfQVNfSU5ERU5UJywgJ1RhYnMgYXJlIG5vdCBhbGxvd2VkIGFzIGluZGVudGF0aW9uJyk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY29tbWEsXG4gICAgICAgIGZvdW5kLFxuICAgICAgICBzcGFjZUJlZm9yZSxcbiAgICAgICAgY29tbWVudCxcbiAgICAgICAgaGFzTmV3bGluZSxcbiAgICAgICAgYW5jaG9yLFxuICAgICAgICB0YWcsXG4gICAgICAgIG5ld2xpbmVBZnRlclByb3AsXG4gICAgICAgIGVuZCxcbiAgICAgICAgc3RhcnQ6IHN0YXJ0ID8/IGVuZFxuICAgIH07XG59XG5cbmV4cG9ydCB7IHJlc29sdmVQcm9wcyB9O1xuIiwiZnVuY3Rpb24gY29udGFpbnNOZXdsaW5lKGtleSkge1xuICAgIGlmICgha2V5KVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBzd2l0Y2ggKGtleS50eXBlKSB7XG4gICAgICAgIGNhc2UgJ2FsaWFzJzpcbiAgICAgICAgY2FzZSAnc2NhbGFyJzpcbiAgICAgICAgY2FzZSAnZG91YmxlLXF1b3RlZC1zY2FsYXInOlxuICAgICAgICBjYXNlICdzaW5nbGUtcXVvdGVkLXNjYWxhcic6XG4gICAgICAgICAgICBpZiAoa2V5LnNvdXJjZS5pbmNsdWRlcygnXFxuJykpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBpZiAoa2V5LmVuZClcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHN0IG9mIGtleS5lbmQpXG4gICAgICAgICAgICAgICAgICAgIGlmIChzdC50eXBlID09PSAnbmV3bGluZScpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgY2FzZSAnZmxvdy1jb2xsZWN0aW9uJzpcbiAgICAgICAgICAgIGZvciAoY29uc3QgaXQgb2Yga2V5Lml0ZW1zKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBzdCBvZiBpdC5zdGFydClcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0LnR5cGUgPT09ICduZXdsaW5lJylcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIGlmIChpdC5zZXApXG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc3Qgb2YgaXQuc2VwKVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0LnR5cGUgPT09ICduZXdsaW5lJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAoY29udGFpbnNOZXdsaW5lKGl0LmtleSkgfHwgY29udGFpbnNOZXdsaW5lKGl0LnZhbHVlKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59XG5cbmV4cG9ydCB7IGNvbnRhaW5zTmV3bGluZSB9O1xuIiwiaW1wb3J0IHsgY29udGFpbnNOZXdsaW5lIH0gZnJvbSAnLi91dGlsLWNvbnRhaW5zLW5ld2xpbmUuanMnO1xuXG5mdW5jdGlvbiBmbG93SW5kZW50Q2hlY2soaW5kZW50LCBmYywgb25FcnJvcikge1xuICAgIGlmIChmYz8udHlwZSA9PT0gJ2Zsb3ctY29sbGVjdGlvbicpIHtcbiAgICAgICAgY29uc3QgZW5kID0gZmMuZW5kWzBdO1xuICAgICAgICBpZiAoZW5kLmluZGVudCA9PT0gaW5kZW50ICYmXG4gICAgICAgICAgICAoZW5kLnNvdXJjZSA9PT0gJ10nIHx8IGVuZC5zb3VyY2UgPT09ICd9JykgJiZcbiAgICAgICAgICAgIGNvbnRhaW5zTmV3bGluZShmYykpIHtcbiAgICAgICAgICAgIGNvbnN0IG1zZyA9ICdGbG93IGVuZCBpbmRpY2F0b3Igc2hvdWxkIGJlIG1vcmUgaW5kZW50ZWQgdGhhbiBwYXJlbnQnO1xuICAgICAgICAgICAgb25FcnJvcihlbmQsICdCQURfSU5ERU5UJywgbXNnLCB0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IHsgZmxvd0luZGVudENoZWNrIH07XG4iLCJpbXBvcnQgeyBpc1NjYWxhciB9IGZyb20gJy4uL25vZGVzL2lkZW50aXR5LmpzJztcblxuZnVuY3Rpb24gbWFwSW5jbHVkZXMoY3R4LCBpdGVtcywgc2VhcmNoKSB7XG4gICAgY29uc3QgeyB1bmlxdWVLZXlzIH0gPSBjdHgub3B0aW9ucztcbiAgICBpZiAodW5pcXVlS2V5cyA9PT0gZmFsc2UpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBpc0VxdWFsID0gdHlwZW9mIHVuaXF1ZUtleXMgPT09ICdmdW5jdGlvbidcbiAgICAgICAgPyB1bmlxdWVLZXlzXG4gICAgICAgIDogKGEsIGIpID0+IGEgPT09IGIgfHwgKGlzU2NhbGFyKGEpICYmIGlzU2NhbGFyKGIpICYmIGEudmFsdWUgPT09IGIudmFsdWUpO1xuICAgIHJldHVybiBpdGVtcy5zb21lKHBhaXIgPT4gaXNFcXVhbChwYWlyLmtleSwgc2VhcmNoKSk7XG59XG5cbmV4cG9ydCB7IG1hcEluY2x1ZGVzIH07XG4iLCJpbXBvcnQgeyBQYWlyIH0gZnJvbSAnLi4vbm9kZXMvUGFpci5qcyc7XG5pbXBvcnQgeyBZQU1MTWFwIH0gZnJvbSAnLi4vbm9kZXMvWUFNTE1hcC5qcyc7XG5pbXBvcnQgeyByZXNvbHZlUHJvcHMgfSBmcm9tICcuL3Jlc29sdmUtcHJvcHMuanMnO1xuaW1wb3J0IHsgY29udGFpbnNOZXdsaW5lIH0gZnJvbSAnLi91dGlsLWNvbnRhaW5zLW5ld2xpbmUuanMnO1xuaW1wb3J0IHsgZmxvd0luZGVudENoZWNrIH0gZnJvbSAnLi91dGlsLWZsb3ctaW5kZW50LWNoZWNrLmpzJztcbmltcG9ydCB7IG1hcEluY2x1ZGVzIH0gZnJvbSAnLi91dGlsLW1hcC1pbmNsdWRlcy5qcyc7XG5cbmNvbnN0IHN0YXJ0Q29sTXNnID0gJ0FsbCBtYXBwaW5nIGl0ZW1zIG11c3Qgc3RhcnQgYXQgdGhlIHNhbWUgY29sdW1uJztcbmZ1bmN0aW9uIHJlc29sdmVCbG9ja01hcCh7IGNvbXBvc2VOb2RlLCBjb21wb3NlRW1wdHlOb2RlIH0sIGN0eCwgYm0sIG9uRXJyb3IsIHRhZykge1xuICAgIGNvbnN0IE5vZGVDbGFzcyA9IHRhZz8ubm9kZUNsYXNzID8/IFlBTUxNYXA7XG4gICAgY29uc3QgbWFwID0gbmV3IE5vZGVDbGFzcyhjdHguc2NoZW1hKTtcbiAgICBpZiAoY3R4LmF0Um9vdClcbiAgICAgICAgY3R4LmF0Um9vdCA9IGZhbHNlO1xuICAgIGxldCBvZmZzZXQgPSBibS5vZmZzZXQ7XG4gICAgbGV0IGNvbW1lbnRFbmQgPSBudWxsO1xuICAgIGZvciAoY29uc3QgY29sbEl0ZW0gb2YgYm0uaXRlbXMpIHtcbiAgICAgICAgY29uc3QgeyBzdGFydCwga2V5LCBzZXAsIHZhbHVlIH0gPSBjb2xsSXRlbTtcbiAgICAgICAgLy8ga2V5IHByb3BlcnRpZXNcbiAgICAgICAgY29uc3Qga2V5UHJvcHMgPSByZXNvbHZlUHJvcHMoc3RhcnQsIHtcbiAgICAgICAgICAgIGluZGljYXRvcjogJ2V4cGxpY2l0LWtleS1pbmQnLFxuICAgICAgICAgICAgbmV4dDoga2V5ID8/IHNlcD8uWzBdLFxuICAgICAgICAgICAgb2Zmc2V0LFxuICAgICAgICAgICAgb25FcnJvcixcbiAgICAgICAgICAgIHBhcmVudEluZGVudDogYm0uaW5kZW50LFxuICAgICAgICAgICAgc3RhcnRPbk5ld2xpbmU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGltcGxpY2l0S2V5ID0gIWtleVByb3BzLmZvdW5kO1xuICAgICAgICBpZiAoaW1wbGljaXRLZXkpIHtcbiAgICAgICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICAgICAgICBpZiAoa2V5LnR5cGUgPT09ICdibG9jay1zZXEnKVxuICAgICAgICAgICAgICAgICAgICBvbkVycm9yKG9mZnNldCwgJ0JMT0NLX0FTX0lNUExJQ0lUX0tFWScsICdBIGJsb2NrIHNlcXVlbmNlIG1heSBub3QgYmUgdXNlZCBhcyBhbiBpbXBsaWNpdCBtYXAga2V5Jyk7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoJ2luZGVudCcgaW4ga2V5ICYmIGtleS5pbmRlbnQgIT09IGJtLmluZGVudClcbiAgICAgICAgICAgICAgICAgICAgb25FcnJvcihvZmZzZXQsICdCQURfSU5ERU5UJywgc3RhcnRDb2xNc2cpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFrZXlQcm9wcy5hbmNob3IgJiYgIWtleVByb3BzLnRhZyAmJiAhc2VwKSB7XG4gICAgICAgICAgICAgICAgY29tbWVudEVuZCA9IGtleVByb3BzLmVuZDtcbiAgICAgICAgICAgICAgICBpZiAoa2V5UHJvcHMuY29tbWVudCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWFwLmNvbW1lbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAuY29tbWVudCArPSAnXFxuJyArIGtleVByb3BzLmNvbW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcC5jb21tZW50ID0ga2V5UHJvcHMuY29tbWVudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoa2V5UHJvcHMubmV3bGluZUFmdGVyUHJvcCB8fCBjb250YWluc05ld2xpbmUoa2V5KSkge1xuICAgICAgICAgICAgICAgIG9uRXJyb3Ioa2V5ID8/IHN0YXJ0W3N0YXJ0Lmxlbmd0aCAtIDFdLCAnTVVMVElMSU5FX0lNUExJQ0lUX0tFWScsICdJbXBsaWNpdCBrZXlzIG5lZWQgdG8gYmUgb24gYSBzaW5nbGUgbGluZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGtleVByb3BzLmZvdW5kPy5pbmRlbnQgIT09IGJtLmluZGVudCkge1xuICAgICAgICAgICAgb25FcnJvcihvZmZzZXQsICdCQURfSU5ERU5UJywgc3RhcnRDb2xNc2cpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGtleSB2YWx1ZVxuICAgICAgICBjdHguYXRLZXkgPSB0cnVlO1xuICAgICAgICBjb25zdCBrZXlTdGFydCA9IGtleVByb3BzLmVuZDtcbiAgICAgICAgY29uc3Qga2V5Tm9kZSA9IGtleVxuICAgICAgICAgICAgPyBjb21wb3NlTm9kZShjdHgsIGtleSwga2V5UHJvcHMsIG9uRXJyb3IpXG4gICAgICAgICAgICA6IGNvbXBvc2VFbXB0eU5vZGUoY3R4LCBrZXlTdGFydCwgc3RhcnQsIG51bGwsIGtleVByb3BzLCBvbkVycm9yKTtcbiAgICAgICAgaWYgKGN0eC5zY2hlbWEuY29tcGF0KVxuICAgICAgICAgICAgZmxvd0luZGVudENoZWNrKGJtLmluZGVudCwga2V5LCBvbkVycm9yKTtcbiAgICAgICAgY3R4LmF0S2V5ID0gZmFsc2U7XG4gICAgICAgIGlmIChtYXBJbmNsdWRlcyhjdHgsIG1hcC5pdGVtcywga2V5Tm9kZSkpXG4gICAgICAgICAgICBvbkVycm9yKGtleVN0YXJ0LCAnRFVQTElDQVRFX0tFWScsICdNYXAga2V5cyBtdXN0IGJlIHVuaXF1ZScpO1xuICAgICAgICAvLyB2YWx1ZSBwcm9wZXJ0aWVzXG4gICAgICAgIGNvbnN0IHZhbHVlUHJvcHMgPSByZXNvbHZlUHJvcHMoc2VwID8/IFtdLCB7XG4gICAgICAgICAgICBpbmRpY2F0b3I6ICdtYXAtdmFsdWUtaW5kJyxcbiAgICAgICAgICAgIG5leHQ6IHZhbHVlLFxuICAgICAgICAgICAgb2Zmc2V0OiBrZXlOb2RlLnJhbmdlWzJdLFxuICAgICAgICAgICAgb25FcnJvcixcbiAgICAgICAgICAgIHBhcmVudEluZGVudDogYm0uaW5kZW50LFxuICAgICAgICAgICAgc3RhcnRPbk5ld2xpbmU6ICFrZXkgfHwga2V5LnR5cGUgPT09ICdibG9jay1zY2FsYXInXG4gICAgICAgIH0pO1xuICAgICAgICBvZmZzZXQgPSB2YWx1ZVByb3BzLmVuZDtcbiAgICAgICAgaWYgKHZhbHVlUHJvcHMuZm91bmQpIHtcbiAgICAgICAgICAgIGlmIChpbXBsaWNpdEtleSkge1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZT8udHlwZSA9PT0gJ2Jsb2NrLW1hcCcgJiYgIXZhbHVlUHJvcHMuaGFzTmV3bGluZSlcbiAgICAgICAgICAgICAgICAgICAgb25FcnJvcihvZmZzZXQsICdCTE9DS19BU19JTVBMSUNJVF9LRVknLCAnTmVzdGVkIG1hcHBpbmdzIGFyZSBub3QgYWxsb3dlZCBpbiBjb21wYWN0IG1hcHBpbmdzJyk7XG4gICAgICAgICAgICAgICAgaWYgKGN0eC5vcHRpb25zLnN0cmljdCAmJlxuICAgICAgICAgICAgICAgICAgICBrZXlQcm9wcy5zdGFydCA8IHZhbHVlUHJvcHMuZm91bmQub2Zmc2V0IC0gMTAyNClcbiAgICAgICAgICAgICAgICAgICAgb25FcnJvcihrZXlOb2RlLnJhbmdlLCAnS0VZX09WRVJfMTAyNF9DSEFSUycsICdUaGUgOiBpbmRpY2F0b3IgbXVzdCBiZSBhdCBtb3N0IDEwMjQgY2hhcnMgYWZ0ZXIgdGhlIHN0YXJ0IG9mIGFuIGltcGxpY2l0IGJsb2NrIG1hcHBpbmcga2V5Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyB2YWx1ZSB2YWx1ZVxuICAgICAgICAgICAgY29uc3QgdmFsdWVOb2RlID0gdmFsdWVcbiAgICAgICAgICAgICAgICA/IGNvbXBvc2VOb2RlKGN0eCwgdmFsdWUsIHZhbHVlUHJvcHMsIG9uRXJyb3IpXG4gICAgICAgICAgICAgICAgOiBjb21wb3NlRW1wdHlOb2RlKGN0eCwgb2Zmc2V0LCBzZXAsIG51bGwsIHZhbHVlUHJvcHMsIG9uRXJyb3IpO1xuICAgICAgICAgICAgaWYgKGN0eC5zY2hlbWEuY29tcGF0KVxuICAgICAgICAgICAgICAgIGZsb3dJbmRlbnRDaGVjayhibS5pbmRlbnQsIHZhbHVlLCBvbkVycm9yKTtcbiAgICAgICAgICAgIG9mZnNldCA9IHZhbHVlTm9kZS5yYW5nZVsyXTtcbiAgICAgICAgICAgIGNvbnN0IHBhaXIgPSBuZXcgUGFpcihrZXlOb2RlLCB2YWx1ZU5vZGUpO1xuICAgICAgICAgICAgaWYgKGN0eC5vcHRpb25zLmtlZXBTb3VyY2VUb2tlbnMpXG4gICAgICAgICAgICAgICAgcGFpci5zcmNUb2tlbiA9IGNvbGxJdGVtO1xuICAgICAgICAgICAgbWFwLml0ZW1zLnB1c2gocGFpcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBrZXkgd2l0aCBubyB2YWx1ZVxuICAgICAgICAgICAgaWYgKGltcGxpY2l0S2V5KVxuICAgICAgICAgICAgICAgIG9uRXJyb3Ioa2V5Tm9kZS5yYW5nZSwgJ01JU1NJTkdfQ0hBUicsICdJbXBsaWNpdCBtYXAga2V5cyBuZWVkIHRvIGJlIGZvbGxvd2VkIGJ5IG1hcCB2YWx1ZXMnKTtcbiAgICAgICAgICAgIGlmICh2YWx1ZVByb3BzLmNvbW1lbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoa2V5Tm9kZS5jb21tZW50KVxuICAgICAgICAgICAgICAgICAgICBrZXlOb2RlLmNvbW1lbnQgKz0gJ1xcbicgKyB2YWx1ZVByb3BzLmNvbW1lbnQ7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBrZXlOb2RlLmNvbW1lbnQgPSB2YWx1ZVByb3BzLmNvbW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBwYWlyID0gbmV3IFBhaXIoa2V5Tm9kZSk7XG4gICAgICAgICAgICBpZiAoY3R4Lm9wdGlvbnMua2VlcFNvdXJjZVRva2VucylcbiAgICAgICAgICAgICAgICBwYWlyLnNyY1Rva2VuID0gY29sbEl0ZW07XG4gICAgICAgICAgICBtYXAuaXRlbXMucHVzaChwYWlyKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoY29tbWVudEVuZCAmJiBjb21tZW50RW5kIDwgb2Zmc2V0KVxuICAgICAgICBvbkVycm9yKGNvbW1lbnRFbmQsICdJTVBPU1NJQkxFJywgJ01hcCBjb21tZW50IHdpdGggdHJhaWxpbmcgY29udGVudCcpO1xuICAgIG1hcC5yYW5nZSA9IFtibS5vZmZzZXQsIG9mZnNldCwgY29tbWVudEVuZCA/PyBvZmZzZXRdO1xuICAgIHJldHVybiBtYXA7XG59XG5cbmV4cG9ydCB7IHJlc29sdmVCbG9ja01hcCB9O1xuIiwiaW1wb3J0IHsgWUFNTFNlcSB9IGZyb20gJy4uL25vZGVzL1lBTUxTZXEuanMnO1xuaW1wb3J0IHsgcmVzb2x2ZVByb3BzIH0gZnJvbSAnLi9yZXNvbHZlLXByb3BzLmpzJztcbmltcG9ydCB7IGZsb3dJbmRlbnRDaGVjayB9IGZyb20gJy4vdXRpbC1mbG93LWluZGVudC1jaGVjay5qcyc7XG5cbmZ1bmN0aW9uIHJlc29sdmVCbG9ja1NlcSh7IGNvbXBvc2VOb2RlLCBjb21wb3NlRW1wdHlOb2RlIH0sIGN0eCwgYnMsIG9uRXJyb3IsIHRhZykge1xuICAgIGNvbnN0IE5vZGVDbGFzcyA9IHRhZz8ubm9kZUNsYXNzID8/IFlBTUxTZXE7XG4gICAgY29uc3Qgc2VxID0gbmV3IE5vZGVDbGFzcyhjdHguc2NoZW1hKTtcbiAgICBpZiAoY3R4LmF0Um9vdClcbiAgICAgICAgY3R4LmF0Um9vdCA9IGZhbHNlO1xuICAgIGlmIChjdHguYXRLZXkpXG4gICAgICAgIGN0eC5hdEtleSA9IGZhbHNlO1xuICAgIGxldCBvZmZzZXQgPSBicy5vZmZzZXQ7XG4gICAgbGV0IGNvbW1lbnRFbmQgPSBudWxsO1xuICAgIGZvciAoY29uc3QgeyBzdGFydCwgdmFsdWUgfSBvZiBicy5pdGVtcykge1xuICAgICAgICBjb25zdCBwcm9wcyA9IHJlc29sdmVQcm9wcyhzdGFydCwge1xuICAgICAgICAgICAgaW5kaWNhdG9yOiAnc2VxLWl0ZW0taW5kJyxcbiAgICAgICAgICAgIG5leHQ6IHZhbHVlLFxuICAgICAgICAgICAgb2Zmc2V0LFxuICAgICAgICAgICAgb25FcnJvcixcbiAgICAgICAgICAgIHBhcmVudEluZGVudDogYnMuaW5kZW50LFxuICAgICAgICAgICAgc3RhcnRPbk5ld2xpbmU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghcHJvcHMuZm91bmQpIHtcbiAgICAgICAgICAgIGlmIChwcm9wcy5hbmNob3IgfHwgcHJvcHMudGFnIHx8IHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlPy50eXBlID09PSAnYmxvY2stc2VxJylcbiAgICAgICAgICAgICAgICAgICAgb25FcnJvcihwcm9wcy5lbmQsICdCQURfSU5ERU5UJywgJ0FsbCBzZXF1ZW5jZSBpdGVtcyBtdXN0IHN0YXJ0IGF0IHRoZSBzYW1lIGNvbHVtbicpO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgb25FcnJvcihvZmZzZXQsICdNSVNTSU5HX0NIQVInLCAnU2VxdWVuY2UgaXRlbSB3aXRob3V0IC0gaW5kaWNhdG9yJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb21tZW50RW5kID0gcHJvcHMuZW5kO1xuICAgICAgICAgICAgICAgIGlmIChwcm9wcy5jb21tZW50KVxuICAgICAgICAgICAgICAgICAgICBzZXEuY29tbWVudCA9IHByb3BzLmNvbW1lbnQ7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgbm9kZSA9IHZhbHVlXG4gICAgICAgICAgICA/IGNvbXBvc2VOb2RlKGN0eCwgdmFsdWUsIHByb3BzLCBvbkVycm9yKVxuICAgICAgICAgICAgOiBjb21wb3NlRW1wdHlOb2RlKGN0eCwgcHJvcHMuZW5kLCBzdGFydCwgbnVsbCwgcHJvcHMsIG9uRXJyb3IpO1xuICAgICAgICBpZiAoY3R4LnNjaGVtYS5jb21wYXQpXG4gICAgICAgICAgICBmbG93SW5kZW50Q2hlY2soYnMuaW5kZW50LCB2YWx1ZSwgb25FcnJvcik7XG4gICAgICAgIG9mZnNldCA9IG5vZGUucmFuZ2VbMl07XG4gICAgICAgIHNlcS5pdGVtcy5wdXNoKG5vZGUpO1xuICAgIH1cbiAgICBzZXEucmFuZ2UgPSBbYnMub2Zmc2V0LCBvZmZzZXQsIGNvbW1lbnRFbmQgPz8gb2Zmc2V0XTtcbiAgICByZXR1cm4gc2VxO1xufVxuXG5leHBvcnQgeyByZXNvbHZlQmxvY2tTZXEgfTtcbiIsImZ1bmN0aW9uIHJlc29sdmVFbmQoZW5kLCBvZmZzZXQsIHJlcVNwYWNlLCBvbkVycm9yKSB7XG4gICAgbGV0IGNvbW1lbnQgPSAnJztcbiAgICBpZiAoZW5kKSB7XG4gICAgICAgIGxldCBoYXNTcGFjZSA9IGZhbHNlO1xuICAgICAgICBsZXQgc2VwID0gJyc7XG4gICAgICAgIGZvciAoY29uc3QgdG9rZW4gb2YgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB7IHNvdXJjZSwgdHlwZSB9ID0gdG9rZW47XG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdzcGFjZSc6XG4gICAgICAgICAgICAgICAgICAgIGhhc1NwYWNlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnY29tbWVudCc6IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcVNwYWNlICYmICFoYXNTcGFjZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uRXJyb3IodG9rZW4sICdNSVNTSU5HX0NIQVInLCAnQ29tbWVudHMgbXVzdCBiZSBzZXBhcmF0ZWQgZnJvbSBvdGhlciB0b2tlbnMgYnkgd2hpdGUgc3BhY2UgY2hhcmFjdGVycycpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYiA9IHNvdXJjZS5zdWJzdHJpbmcoMSkgfHwgJyAnO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbW1lbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50ID0gY2I7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgKz0gc2VwICsgY2I7XG4gICAgICAgICAgICAgICAgICAgIHNlcCA9ICcnO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSAnbmV3bGluZSc6XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb21tZW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgc2VwICs9IHNvdXJjZTtcbiAgICAgICAgICAgICAgICAgICAgaGFzU3BhY2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBvbkVycm9yKHRva2VuLCAnVU5FWFBFQ1RFRF9UT0tFTicsIGBVbmV4cGVjdGVkICR7dHlwZX0gYXQgbm9kZSBlbmRgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9mZnNldCArPSBzb3VyY2UubGVuZ3RoO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IGNvbW1lbnQsIG9mZnNldCB9O1xufVxuXG5leHBvcnQgeyByZXNvbHZlRW5kIH07XG4iLCJpbXBvcnQgeyBpc1BhaXIgfSBmcm9tICcuLi9ub2Rlcy9pZGVudGl0eS5qcyc7XG5pbXBvcnQgeyBQYWlyIH0gZnJvbSAnLi4vbm9kZXMvUGFpci5qcyc7XG5pbXBvcnQgeyBZQU1MTWFwIH0gZnJvbSAnLi4vbm9kZXMvWUFNTE1hcC5qcyc7XG5pbXBvcnQgeyBZQU1MU2VxIH0gZnJvbSAnLi4vbm9kZXMvWUFNTFNlcS5qcyc7XG5pbXBvcnQgeyByZXNvbHZlRW5kIH0gZnJvbSAnLi9yZXNvbHZlLWVuZC5qcyc7XG5pbXBvcnQgeyByZXNvbHZlUHJvcHMgfSBmcm9tICcuL3Jlc29sdmUtcHJvcHMuanMnO1xuaW1wb3J0IHsgY29udGFpbnNOZXdsaW5lIH0gZnJvbSAnLi91dGlsLWNvbnRhaW5zLW5ld2xpbmUuanMnO1xuaW1wb3J0IHsgbWFwSW5jbHVkZXMgfSBmcm9tICcuL3V0aWwtbWFwLWluY2x1ZGVzLmpzJztcblxuY29uc3QgYmxvY2tNc2cgPSAnQmxvY2sgY29sbGVjdGlvbnMgYXJlIG5vdCBhbGxvd2VkIHdpdGhpbiBmbG93IGNvbGxlY3Rpb25zJztcbmNvbnN0IGlzQmxvY2sgPSAodG9rZW4pID0+IHRva2VuICYmICh0b2tlbi50eXBlID09PSAnYmxvY2stbWFwJyB8fCB0b2tlbi50eXBlID09PSAnYmxvY2stc2VxJyk7XG5mdW5jdGlvbiByZXNvbHZlRmxvd0NvbGxlY3Rpb24oeyBjb21wb3NlTm9kZSwgY29tcG9zZUVtcHR5Tm9kZSB9LCBjdHgsIGZjLCBvbkVycm9yLCB0YWcpIHtcbiAgICBjb25zdCBpc01hcCA9IGZjLnN0YXJ0LnNvdXJjZSA9PT0gJ3snO1xuICAgIGNvbnN0IGZjTmFtZSA9IGlzTWFwID8gJ2Zsb3cgbWFwJyA6ICdmbG93IHNlcXVlbmNlJztcbiAgICBjb25zdCBOb2RlQ2xhc3MgPSAodGFnPy5ub2RlQ2xhc3MgPz8gKGlzTWFwID8gWUFNTE1hcCA6IFlBTUxTZXEpKTtcbiAgICBjb25zdCBjb2xsID0gbmV3IE5vZGVDbGFzcyhjdHguc2NoZW1hKTtcbiAgICBjb2xsLmZsb3cgPSB0cnVlO1xuICAgIGNvbnN0IGF0Um9vdCA9IGN0eC5hdFJvb3Q7XG4gICAgaWYgKGF0Um9vdClcbiAgICAgICAgY3R4LmF0Um9vdCA9IGZhbHNlO1xuICAgIGlmIChjdHguYXRLZXkpXG4gICAgICAgIGN0eC5hdEtleSA9IGZhbHNlO1xuICAgIGxldCBvZmZzZXQgPSBmYy5vZmZzZXQgKyBmYy5zdGFydC5zb3VyY2UubGVuZ3RoO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmMuaXRlbXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY29uc3QgY29sbEl0ZW0gPSBmYy5pdGVtc1tpXTtcbiAgICAgICAgY29uc3QgeyBzdGFydCwga2V5LCBzZXAsIHZhbHVlIH0gPSBjb2xsSXRlbTtcbiAgICAgICAgY29uc3QgcHJvcHMgPSByZXNvbHZlUHJvcHMoc3RhcnQsIHtcbiAgICAgICAgICAgIGZsb3c6IGZjTmFtZSxcbiAgICAgICAgICAgIGluZGljYXRvcjogJ2V4cGxpY2l0LWtleS1pbmQnLFxuICAgICAgICAgICAgbmV4dDoga2V5ID8/IHNlcD8uWzBdLFxuICAgICAgICAgICAgb2Zmc2V0LFxuICAgICAgICAgICAgb25FcnJvcixcbiAgICAgICAgICAgIHBhcmVudEluZGVudDogZmMuaW5kZW50LFxuICAgICAgICAgICAgc3RhcnRPbk5ld2xpbmU6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIXByb3BzLmZvdW5kKSB7XG4gICAgICAgICAgICBpZiAoIXByb3BzLmFuY2hvciAmJiAhcHJvcHMudGFnICYmICFzZXAgJiYgIXZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGkgPT09IDAgJiYgcHJvcHMuY29tbWEpXG4gICAgICAgICAgICAgICAgICAgIG9uRXJyb3IocHJvcHMuY29tbWEsICdVTkVYUEVDVEVEX1RPS0VOJywgYFVuZXhwZWN0ZWQgLCBpbiAke2ZjTmFtZX1gKTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChpIDwgZmMuaXRlbXMubGVuZ3RoIC0gMSlcbiAgICAgICAgICAgICAgICAgICAgb25FcnJvcihwcm9wcy5zdGFydCwgJ1VORVhQRUNURURfVE9LRU4nLCBgVW5leHBlY3RlZCBlbXB0eSBpdGVtIGluICR7ZmNOYW1lfWApO1xuICAgICAgICAgICAgICAgIGlmIChwcm9wcy5jb21tZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb2xsLmNvbW1lbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xsLmNvbW1lbnQgKz0gJ1xcbicgKyBwcm9wcy5jb21tZW50O1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xsLmNvbW1lbnQgPSBwcm9wcy5jb21tZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBvZmZzZXQgPSBwcm9wcy5lbmQ7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWlzTWFwICYmIGN0eC5vcHRpb25zLnN0cmljdCAmJiBjb250YWluc05ld2xpbmUoa2V5KSlcbiAgICAgICAgICAgICAgICBvbkVycm9yKGtleSwgLy8gY2hlY2tlZCBieSBjb250YWluc05ld2xpbmUoKVxuICAgICAgICAgICAgICAgICdNVUxUSUxJTkVfSU1QTElDSVRfS0VZJywgJ0ltcGxpY2l0IGtleXMgb2YgZmxvdyBzZXF1ZW5jZSBwYWlycyBuZWVkIHRvIGJlIG9uIGEgc2luZ2xlIGxpbmUnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgICAgICAgaWYgKHByb3BzLmNvbW1hKVxuICAgICAgICAgICAgICAgIG9uRXJyb3IocHJvcHMuY29tbWEsICdVTkVYUEVDVEVEX1RPS0VOJywgYFVuZXhwZWN0ZWQgLCBpbiAke2ZjTmFtZX1gKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICghcHJvcHMuY29tbWEpXG4gICAgICAgICAgICAgICAgb25FcnJvcihwcm9wcy5zdGFydCwgJ01JU1NJTkdfQ0hBUicsIGBNaXNzaW5nICwgYmV0d2VlbiAke2ZjTmFtZX0gaXRlbXNgKTtcbiAgICAgICAgICAgIGlmIChwcm9wcy5jb21tZW50KSB7XG4gICAgICAgICAgICAgICAgbGV0IHByZXZJdGVtQ29tbWVudCA9ICcnO1xuICAgICAgICAgICAgICAgIGxvb3A6IGZvciAoY29uc3Qgc3Qgb2Ygc3RhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdC50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdjb21tYSc6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdzcGFjZSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdjb21tZW50JzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2SXRlbUNvbW1lbnQgPSBzdC5zb3VyY2Uuc3Vic3RyaW5nKDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGxvb3A7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGxvb3A7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHByZXZJdGVtQ29tbWVudCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcHJldiA9IGNvbGwuaXRlbXNbY29sbC5pdGVtcy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzUGFpcihwcmV2KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXYgPSBwcmV2LnZhbHVlID8/IHByZXYua2V5O1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJldi5jb21tZW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgcHJldi5jb21tZW50ICs9ICdcXG4nICsgcHJldkl0ZW1Db21tZW50O1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmV2LmNvbW1lbnQgPSBwcmV2SXRlbUNvbW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIHByb3BzLmNvbW1lbnQgPSBwcm9wcy5jb21tZW50LnN1YnN0cmluZyhwcmV2SXRlbUNvbW1lbnQubGVuZ3RoICsgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghaXNNYXAgJiYgIXNlcCAmJiAhcHJvcHMuZm91bmQpIHtcbiAgICAgICAgICAgIC8vIGl0ZW0gaXMgYSB2YWx1ZSBpbiBhIHNlcVxuICAgICAgICAgICAgLy8g4oaSIGtleSAmIHNlcCBhcmUgZW1wdHksIHN0YXJ0IGRvZXMgbm90IGluY2x1ZGUgPyBvciA6XG4gICAgICAgICAgICBjb25zdCB2YWx1ZU5vZGUgPSB2YWx1ZVxuICAgICAgICAgICAgICAgID8gY29tcG9zZU5vZGUoY3R4LCB2YWx1ZSwgcHJvcHMsIG9uRXJyb3IpXG4gICAgICAgICAgICAgICAgOiBjb21wb3NlRW1wdHlOb2RlKGN0eCwgcHJvcHMuZW5kLCBzZXAsIG51bGwsIHByb3BzLCBvbkVycm9yKTtcbiAgICAgICAgICAgIGNvbGwuaXRlbXMucHVzaCh2YWx1ZU5vZGUpO1xuICAgICAgICAgICAgb2Zmc2V0ID0gdmFsdWVOb2RlLnJhbmdlWzJdO1xuICAgICAgICAgICAgaWYgKGlzQmxvY2sodmFsdWUpKVxuICAgICAgICAgICAgICAgIG9uRXJyb3IodmFsdWVOb2RlLnJhbmdlLCAnQkxPQ0tfSU5fRkxPVycsIGJsb2NrTXNnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIGl0ZW0gaXMgYSBrZXkrdmFsdWUgcGFpclxuICAgICAgICAgICAgLy8ga2V5IHZhbHVlXG4gICAgICAgICAgICBjdHguYXRLZXkgPSB0cnVlO1xuICAgICAgICAgICAgY29uc3Qga2V5U3RhcnQgPSBwcm9wcy5lbmQ7XG4gICAgICAgICAgICBjb25zdCBrZXlOb2RlID0ga2V5XG4gICAgICAgICAgICAgICAgPyBjb21wb3NlTm9kZShjdHgsIGtleSwgcHJvcHMsIG9uRXJyb3IpXG4gICAgICAgICAgICAgICAgOiBjb21wb3NlRW1wdHlOb2RlKGN0eCwga2V5U3RhcnQsIHN0YXJ0LCBudWxsLCBwcm9wcywgb25FcnJvcik7XG4gICAgICAgICAgICBpZiAoaXNCbG9jayhrZXkpKVxuICAgICAgICAgICAgICAgIG9uRXJyb3Ioa2V5Tm9kZS5yYW5nZSwgJ0JMT0NLX0lOX0ZMT1cnLCBibG9ja01zZyk7XG4gICAgICAgICAgICBjdHguYXRLZXkgPSBmYWxzZTtcbiAgICAgICAgICAgIC8vIHZhbHVlIHByb3BlcnRpZXNcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlUHJvcHMgPSByZXNvbHZlUHJvcHMoc2VwID8/IFtdLCB7XG4gICAgICAgICAgICAgICAgZmxvdzogZmNOYW1lLFxuICAgICAgICAgICAgICAgIGluZGljYXRvcjogJ21hcC12YWx1ZS1pbmQnLFxuICAgICAgICAgICAgICAgIG5leHQ6IHZhbHVlLFxuICAgICAgICAgICAgICAgIG9mZnNldDoga2V5Tm9kZS5yYW5nZVsyXSxcbiAgICAgICAgICAgICAgICBvbkVycm9yLFxuICAgICAgICAgICAgICAgIHBhcmVudEluZGVudDogZmMuaW5kZW50LFxuICAgICAgICAgICAgICAgIHN0YXJ0T25OZXdsaW5lOiBmYWxzZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAodmFsdWVQcm9wcy5mb3VuZCkge1xuICAgICAgICAgICAgICAgIGlmICghaXNNYXAgJiYgIXByb3BzLmZvdW5kICYmIGN0eC5vcHRpb25zLnN0cmljdCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2VwKVxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzdCBvZiBzZXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3QgPT09IHZhbHVlUHJvcHMuZm91bmQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdC50eXBlID09PSAnbmV3bGluZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25FcnJvcihzdCwgJ01VTFRJTElORV9JTVBMSUNJVF9LRVknLCAnSW1wbGljaXQga2V5cyBvZiBmbG93IHNlcXVlbmNlIHBhaXJzIG5lZWQgdG8gYmUgb24gYSBzaW5nbGUgbGluZScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wcy5zdGFydCA8IHZhbHVlUHJvcHMuZm91bmQub2Zmc2V0IC0gMTAyNClcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uRXJyb3IodmFsdWVQcm9wcy5mb3VuZCwgJ0tFWV9PVkVSXzEwMjRfQ0hBUlMnLCAnVGhlIDogaW5kaWNhdG9yIG11c3QgYmUgYXQgbW9zdCAxMDI0IGNoYXJzIGFmdGVyIHRoZSBzdGFydCBvZiBhbiBpbXBsaWNpdCBmbG93IHNlcXVlbmNlIGtleScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKCdzb3VyY2UnIGluIHZhbHVlICYmIHZhbHVlLnNvdXJjZT8uWzBdID09PSAnOicpXG4gICAgICAgICAgICAgICAgICAgIG9uRXJyb3IodmFsdWUsICdNSVNTSU5HX0NIQVInLCBgTWlzc2luZyBzcGFjZSBhZnRlciA6IGluICR7ZmNOYW1lfWApO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgb25FcnJvcih2YWx1ZVByb3BzLnN0YXJ0LCAnTUlTU0lOR19DSEFSJywgYE1pc3NpbmcgLCBvciA6IGJldHdlZW4gJHtmY05hbWV9IGl0ZW1zYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyB2YWx1ZSB2YWx1ZVxuICAgICAgICAgICAgY29uc3QgdmFsdWVOb2RlID0gdmFsdWVcbiAgICAgICAgICAgICAgICA/IGNvbXBvc2VOb2RlKGN0eCwgdmFsdWUsIHZhbHVlUHJvcHMsIG9uRXJyb3IpXG4gICAgICAgICAgICAgICAgOiB2YWx1ZVByb3BzLmZvdW5kXG4gICAgICAgICAgICAgICAgICAgID8gY29tcG9zZUVtcHR5Tm9kZShjdHgsIHZhbHVlUHJvcHMuZW5kLCBzZXAsIG51bGwsIHZhbHVlUHJvcHMsIG9uRXJyb3IpXG4gICAgICAgICAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgICAgIGlmICh2YWx1ZU5vZGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNCbG9jayh2YWx1ZSkpXG4gICAgICAgICAgICAgICAgICAgIG9uRXJyb3IodmFsdWVOb2RlLnJhbmdlLCAnQkxPQ0tfSU5fRkxPVycsIGJsb2NrTXNnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlUHJvcHMuY29tbWVudCkge1xuICAgICAgICAgICAgICAgIGlmIChrZXlOb2RlLmNvbW1lbnQpXG4gICAgICAgICAgICAgICAgICAgIGtleU5vZGUuY29tbWVudCArPSAnXFxuJyArIHZhbHVlUHJvcHMuY29tbWVudDtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGtleU5vZGUuY29tbWVudCA9IHZhbHVlUHJvcHMuY29tbWVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHBhaXIgPSBuZXcgUGFpcihrZXlOb2RlLCB2YWx1ZU5vZGUpO1xuICAgICAgICAgICAgaWYgKGN0eC5vcHRpb25zLmtlZXBTb3VyY2VUb2tlbnMpXG4gICAgICAgICAgICAgICAgcGFpci5zcmNUb2tlbiA9IGNvbGxJdGVtO1xuICAgICAgICAgICAgaWYgKGlzTWFwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWFwID0gY29sbDtcbiAgICAgICAgICAgICAgICBpZiAobWFwSW5jbHVkZXMoY3R4LCBtYXAuaXRlbXMsIGtleU5vZGUpKVxuICAgICAgICAgICAgICAgICAgICBvbkVycm9yKGtleVN0YXJ0LCAnRFVQTElDQVRFX0tFWScsICdNYXAga2V5cyBtdXN0IGJlIHVuaXF1ZScpO1xuICAgICAgICAgICAgICAgIG1hcC5pdGVtcy5wdXNoKHBhaXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWFwID0gbmV3IFlBTUxNYXAoY3R4LnNjaGVtYSk7XG4gICAgICAgICAgICAgICAgbWFwLmZsb3cgPSB0cnVlO1xuICAgICAgICAgICAgICAgIG1hcC5pdGVtcy5wdXNoKHBhaXIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVuZFJhbmdlID0gKHZhbHVlTm9kZSA/PyBrZXlOb2RlKS5yYW5nZTtcbiAgICAgICAgICAgICAgICBtYXAucmFuZ2UgPSBba2V5Tm9kZS5yYW5nZVswXSwgZW5kUmFuZ2VbMV0sIGVuZFJhbmdlWzJdXTtcbiAgICAgICAgICAgICAgICBjb2xsLml0ZW1zLnB1c2gobWFwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9mZnNldCA9IHZhbHVlTm9kZSA/IHZhbHVlTm9kZS5yYW5nZVsyXSA6IHZhbHVlUHJvcHMuZW5kO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGV4cGVjdGVkRW5kID0gaXNNYXAgPyAnfScgOiAnXSc7XG4gICAgY29uc3QgW2NlLCAuLi5lZV0gPSBmYy5lbmQ7XG4gICAgbGV0IGNlUG9zID0gb2Zmc2V0O1xuICAgIGlmIChjZT8uc291cmNlID09PSBleHBlY3RlZEVuZClcbiAgICAgICAgY2VQb3MgPSBjZS5vZmZzZXQgKyBjZS5zb3VyY2UubGVuZ3RoO1xuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBuYW1lID0gZmNOYW1lWzBdLnRvVXBwZXJDYXNlKCkgKyBmY05hbWUuc3Vic3RyaW5nKDEpO1xuICAgICAgICBjb25zdCBtc2cgPSBhdFJvb3RcbiAgICAgICAgICAgID8gYCR7bmFtZX0gbXVzdCBlbmQgd2l0aCBhICR7ZXhwZWN0ZWRFbmR9YFxuICAgICAgICAgICAgOiBgJHtuYW1lfSBpbiBibG9jayBjb2xsZWN0aW9uIG11c3QgYmUgc3VmZmljaWVudGx5IGluZGVudGVkIGFuZCBlbmQgd2l0aCBhICR7ZXhwZWN0ZWRFbmR9YDtcbiAgICAgICAgb25FcnJvcihvZmZzZXQsIGF0Um9vdCA/ICdNSVNTSU5HX0NIQVInIDogJ0JBRF9JTkRFTlQnLCBtc2cpO1xuICAgICAgICBpZiAoY2UgJiYgY2Uuc291cmNlLmxlbmd0aCAhPT0gMSlcbiAgICAgICAgICAgIGVlLnVuc2hpZnQoY2UpO1xuICAgIH1cbiAgICBpZiAoZWUubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBlbmQgPSByZXNvbHZlRW5kKGVlLCBjZVBvcywgY3R4Lm9wdGlvbnMuc3RyaWN0LCBvbkVycm9yKTtcbiAgICAgICAgaWYgKGVuZC5jb21tZW50KSB7XG4gICAgICAgICAgICBpZiAoY29sbC5jb21tZW50KVxuICAgICAgICAgICAgICAgIGNvbGwuY29tbWVudCArPSAnXFxuJyArIGVuZC5jb21tZW50O1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGNvbGwuY29tbWVudCA9IGVuZC5jb21tZW50O1xuICAgICAgICB9XG4gICAgICAgIGNvbGwucmFuZ2UgPSBbZmMub2Zmc2V0LCBjZVBvcywgZW5kLm9mZnNldF07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb2xsLnJhbmdlID0gW2ZjLm9mZnNldCwgY2VQb3MsIGNlUG9zXTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbGw7XG59XG5cbmV4cG9ydCB7IHJlc29sdmVGbG93Q29sbGVjdGlvbiB9O1xuIiwiaW1wb3J0IHsgaXNOb2RlIH0gZnJvbSAnLi4vbm9kZXMvaWRlbnRpdHkuanMnO1xuaW1wb3J0IHsgU2NhbGFyIH0gZnJvbSAnLi4vbm9kZXMvU2NhbGFyLmpzJztcbmltcG9ydCB7IFlBTUxNYXAgfSBmcm9tICcuLi9ub2Rlcy9ZQU1MTWFwLmpzJztcbmltcG9ydCB7IFlBTUxTZXEgfSBmcm9tICcuLi9ub2Rlcy9ZQU1MU2VxLmpzJztcbmltcG9ydCB7IHJlc29sdmVCbG9ja01hcCB9IGZyb20gJy4vcmVzb2x2ZS1ibG9jay1tYXAuanMnO1xuaW1wb3J0IHsgcmVzb2x2ZUJsb2NrU2VxIH0gZnJvbSAnLi9yZXNvbHZlLWJsb2NrLXNlcS5qcyc7XG5pbXBvcnQgeyByZXNvbHZlRmxvd0NvbGxlY3Rpb24gfSBmcm9tICcuL3Jlc29sdmUtZmxvdy1jb2xsZWN0aW9uLmpzJztcblxuZnVuY3Rpb24gcmVzb2x2ZUNvbGxlY3Rpb24oQ04sIGN0eCwgdG9rZW4sIG9uRXJyb3IsIHRhZ05hbWUsIHRhZykge1xuICAgIGNvbnN0IGNvbGwgPSB0b2tlbi50eXBlID09PSAnYmxvY2stbWFwJ1xuICAgICAgICA/IHJlc29sdmVCbG9ja01hcChDTiwgY3R4LCB0b2tlbiwgb25FcnJvciwgdGFnKVxuICAgICAgICA6IHRva2VuLnR5cGUgPT09ICdibG9jay1zZXEnXG4gICAgICAgICAgICA/IHJlc29sdmVCbG9ja1NlcShDTiwgY3R4LCB0b2tlbiwgb25FcnJvciwgdGFnKVxuICAgICAgICAgICAgOiByZXNvbHZlRmxvd0NvbGxlY3Rpb24oQ04sIGN0eCwgdG9rZW4sIG9uRXJyb3IsIHRhZyk7XG4gICAgY29uc3QgQ29sbCA9IGNvbGwuY29uc3RydWN0b3I7XG4gICAgLy8gSWYgd2UgZ290IGEgdGFnTmFtZSBtYXRjaGluZyB0aGUgY2xhc3MsIG9yIHRoZSB0YWcgbmFtZSBpcyAnIScsXG4gICAgLy8gdGhlbiB1c2UgdGhlIHRhZ05hbWUgZnJvbSB0aGUgbm9kZSBjbGFzcyB1c2VkIHRvIGNyZWF0ZSBpdC5cbiAgICBpZiAodGFnTmFtZSA9PT0gJyEnIHx8IHRhZ05hbWUgPT09IENvbGwudGFnTmFtZSkge1xuICAgICAgICBjb2xsLnRhZyA9IENvbGwudGFnTmFtZTtcbiAgICAgICAgcmV0dXJuIGNvbGw7XG4gICAgfVxuICAgIGlmICh0YWdOYW1lKVxuICAgICAgICBjb2xsLnRhZyA9IHRhZ05hbWU7XG4gICAgcmV0dXJuIGNvbGw7XG59XG5mdW5jdGlvbiBjb21wb3NlQ29sbGVjdGlvbihDTiwgY3R4LCB0b2tlbiwgcHJvcHMsIG9uRXJyb3IpIHtcbiAgICBjb25zdCB0YWdUb2tlbiA9IHByb3BzLnRhZztcbiAgICBjb25zdCB0YWdOYW1lID0gIXRhZ1Rva2VuXG4gICAgICAgID8gbnVsbFxuICAgICAgICA6IGN0eC5kaXJlY3RpdmVzLnRhZ05hbWUodGFnVG9rZW4uc291cmNlLCBtc2cgPT4gb25FcnJvcih0YWdUb2tlbiwgJ1RBR19SRVNPTFZFX0ZBSUxFRCcsIG1zZykpO1xuICAgIGlmICh0b2tlbi50eXBlID09PSAnYmxvY2stc2VxJykge1xuICAgICAgICBjb25zdCB7IGFuY2hvciwgbmV3bGluZUFmdGVyUHJvcDogbmwgfSA9IHByb3BzO1xuICAgICAgICBjb25zdCBsYXN0UHJvcCA9IGFuY2hvciAmJiB0YWdUb2tlblxuICAgICAgICAgICAgPyBhbmNob3Iub2Zmc2V0ID4gdGFnVG9rZW4ub2Zmc2V0XG4gICAgICAgICAgICAgICAgPyBhbmNob3JcbiAgICAgICAgICAgICAgICA6IHRhZ1Rva2VuXG4gICAgICAgICAgICA6IChhbmNob3IgPz8gdGFnVG9rZW4pO1xuICAgICAgICBpZiAobGFzdFByb3AgJiYgKCFubCB8fCBubC5vZmZzZXQgPCBsYXN0UHJvcC5vZmZzZXQpKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gJ01pc3NpbmcgbmV3bGluZSBhZnRlciBibG9jayBzZXF1ZW5jZSBwcm9wcyc7XG4gICAgICAgICAgICBvbkVycm9yKGxhc3RQcm9wLCAnTUlTU0lOR19DSEFSJywgbWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgZXhwVHlwZSA9IHRva2VuLnR5cGUgPT09ICdibG9jay1tYXAnXG4gICAgICAgID8gJ21hcCdcbiAgICAgICAgOiB0b2tlbi50eXBlID09PSAnYmxvY2stc2VxJ1xuICAgICAgICAgICAgPyAnc2VxJ1xuICAgICAgICAgICAgOiB0b2tlbi5zdGFydC5zb3VyY2UgPT09ICd7J1xuICAgICAgICAgICAgICAgID8gJ21hcCdcbiAgICAgICAgICAgICAgICA6ICdzZXEnO1xuICAgIC8vIHNob3J0Y3V0OiBjaGVjayBpZiBpdCdzIGEgZ2VuZXJpYyBZQU1MTWFwIG9yIFlBTUxTZXFcbiAgICAvLyBiZWZvcmUganVtcGluZyBpbnRvIHRoZSBjdXN0b20gdGFnIGxvZ2ljLlxuICAgIGlmICghdGFnVG9rZW4gfHxcbiAgICAgICAgIXRhZ05hbWUgfHxcbiAgICAgICAgdGFnTmFtZSA9PT0gJyEnIHx8XG4gICAgICAgICh0YWdOYW1lID09PSBZQU1MTWFwLnRhZ05hbWUgJiYgZXhwVHlwZSA9PT0gJ21hcCcpIHx8XG4gICAgICAgICh0YWdOYW1lID09PSBZQU1MU2VxLnRhZ05hbWUgJiYgZXhwVHlwZSA9PT0gJ3NlcScpKSB7XG4gICAgICAgIHJldHVybiByZXNvbHZlQ29sbGVjdGlvbihDTiwgY3R4LCB0b2tlbiwgb25FcnJvciwgdGFnTmFtZSk7XG4gICAgfVxuICAgIGxldCB0YWcgPSBjdHguc2NoZW1hLnRhZ3MuZmluZCh0ID0+IHQudGFnID09PSB0YWdOYW1lICYmIHQuY29sbGVjdGlvbiA9PT0gZXhwVHlwZSk7XG4gICAgaWYgKCF0YWcpIHtcbiAgICAgICAgY29uc3Qga3QgPSBjdHguc2NoZW1hLmtub3duVGFnc1t0YWdOYW1lXTtcbiAgICAgICAgaWYgKGt0Py5jb2xsZWN0aW9uID09PSBleHBUeXBlKSB7XG4gICAgICAgICAgICBjdHguc2NoZW1hLnRhZ3MucHVzaChPYmplY3QuYXNzaWduKHt9LCBrdCwgeyBkZWZhdWx0OiBmYWxzZSB9KSk7XG4gICAgICAgICAgICB0YWcgPSBrdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChrdCkge1xuICAgICAgICAgICAgICAgIG9uRXJyb3IodGFnVG9rZW4sICdCQURfQ09MTEVDVElPTl9UWVBFJywgYCR7a3QudGFnfSB1c2VkIGZvciAke2V4cFR5cGV9IGNvbGxlY3Rpb24sIGJ1dCBleHBlY3RzICR7a3QuY29sbGVjdGlvbiA/PyAnc2NhbGFyJ31gLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG9uRXJyb3IodGFnVG9rZW4sICdUQUdfUkVTT0xWRV9GQUlMRUQnLCBgVW5yZXNvbHZlZCB0YWc6ICR7dGFnTmFtZX1gLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlQ29sbGVjdGlvbihDTiwgY3R4LCB0b2tlbiwgb25FcnJvciwgdGFnTmFtZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgY29sbCA9IHJlc29sdmVDb2xsZWN0aW9uKENOLCBjdHgsIHRva2VuLCBvbkVycm9yLCB0YWdOYW1lLCB0YWcpO1xuICAgIGNvbnN0IHJlcyA9IHRhZy5yZXNvbHZlPy4oY29sbCwgbXNnID0+IG9uRXJyb3IodGFnVG9rZW4sICdUQUdfUkVTT0xWRV9GQUlMRUQnLCBtc2cpLCBjdHgub3B0aW9ucykgPz8gY29sbDtcbiAgICBjb25zdCBub2RlID0gaXNOb2RlKHJlcylcbiAgICAgICAgPyByZXNcbiAgICAgICAgOiBuZXcgU2NhbGFyKHJlcyk7XG4gICAgbm9kZS5yYW5nZSA9IGNvbGwucmFuZ2U7XG4gICAgbm9kZS50YWcgPSB0YWdOYW1lO1xuICAgIGlmICh0YWc/LmZvcm1hdClcbiAgICAgICAgbm9kZS5mb3JtYXQgPSB0YWcuZm9ybWF0O1xuICAgIHJldHVybiBub2RlO1xufVxuXG5leHBvcnQgeyBjb21wb3NlQ29sbGVjdGlvbiB9O1xuIiwiaW1wb3J0IHsgU2NhbGFyIH0gZnJvbSAnLi4vbm9kZXMvU2NhbGFyLmpzJztcblxuZnVuY3Rpb24gcmVzb2x2ZUJsb2NrU2NhbGFyKGN0eCwgc2NhbGFyLCBvbkVycm9yKSB7XG4gICAgY29uc3Qgc3RhcnQgPSBzY2FsYXIub2Zmc2V0O1xuICAgIGNvbnN0IGhlYWRlciA9IHBhcnNlQmxvY2tTY2FsYXJIZWFkZXIoc2NhbGFyLCBjdHgub3B0aW9ucy5zdHJpY3QsIG9uRXJyb3IpO1xuICAgIGlmICghaGVhZGVyKVxuICAgICAgICByZXR1cm4geyB2YWx1ZTogJycsIHR5cGU6IG51bGwsIGNvbW1lbnQ6ICcnLCByYW5nZTogW3N0YXJ0LCBzdGFydCwgc3RhcnRdIH07XG4gICAgY29uc3QgdHlwZSA9IGhlYWRlci5tb2RlID09PSAnPicgPyBTY2FsYXIuQkxPQ0tfRk9MREVEIDogU2NhbGFyLkJMT0NLX0xJVEVSQUw7XG4gICAgY29uc3QgbGluZXMgPSBzY2FsYXIuc291cmNlID8gc3BsaXRMaW5lcyhzY2FsYXIuc291cmNlKSA6IFtdO1xuICAgIC8vIGRldGVybWluZSB0aGUgZW5kIG9mIGNvbnRlbnQgJiBzdGFydCBvZiBjaG9tcGluZ1xuICAgIGxldCBjaG9tcFN0YXJ0ID0gbGluZXMubGVuZ3RoO1xuICAgIGZvciAobGV0IGkgPSBsaW5lcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gbGluZXNbaV1bMV07XG4gICAgICAgIGlmIChjb250ZW50ID09PSAnJyB8fCBjb250ZW50ID09PSAnXFxyJylcbiAgICAgICAgICAgIGNob21wU3RhcnQgPSBpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG4gICAgLy8gc2hvcnRjdXQgZm9yIGVtcHR5IGNvbnRlbnRzXG4gICAgaWYgKGNob21wU3RhcnQgPT09IDApIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBoZWFkZXIuY2hvbXAgPT09ICcrJyAmJiBsaW5lcy5sZW5ndGggPiAwXG4gICAgICAgICAgICA/ICdcXG4nLnJlcGVhdChNYXRoLm1heCgxLCBsaW5lcy5sZW5ndGggLSAxKSlcbiAgICAgICAgICAgIDogJyc7XG4gICAgICAgIGxldCBlbmQgPSBzdGFydCArIGhlYWRlci5sZW5ndGg7XG4gICAgICAgIGlmIChzY2FsYXIuc291cmNlKVxuICAgICAgICAgICAgZW5kICs9IHNjYWxhci5zb3VyY2UubGVuZ3RoO1xuICAgICAgICByZXR1cm4geyB2YWx1ZSwgdHlwZSwgY29tbWVudDogaGVhZGVyLmNvbW1lbnQsIHJhbmdlOiBbc3RhcnQsIGVuZCwgZW5kXSB9O1xuICAgIH1cbiAgICAvLyBmaW5kIHRoZSBpbmRlbnRhdGlvbiBsZXZlbCB0byB0cmltIGZyb20gc3RhcnRcbiAgICBsZXQgdHJpbUluZGVudCA9IHNjYWxhci5pbmRlbnQgKyBoZWFkZXIuaW5kZW50O1xuICAgIGxldCBvZmZzZXQgPSBzY2FsYXIub2Zmc2V0ICsgaGVhZGVyLmxlbmd0aDtcbiAgICBsZXQgY29udGVudFN0YXJ0ID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNob21wU3RhcnQ7ICsraSkge1xuICAgICAgICBjb25zdCBbaW5kZW50LCBjb250ZW50XSA9IGxpbmVzW2ldO1xuICAgICAgICBpZiAoY29udGVudCA9PT0gJycgfHwgY29udGVudCA9PT0gJ1xccicpIHtcbiAgICAgICAgICAgIGlmIChoZWFkZXIuaW5kZW50ID09PSAwICYmIGluZGVudC5sZW5ndGggPiB0cmltSW5kZW50KVxuICAgICAgICAgICAgICAgIHRyaW1JbmRlbnQgPSBpbmRlbnQubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGluZGVudC5sZW5ndGggPCB0cmltSW5kZW50KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9ICdCbG9jayBzY2FsYXJzIHdpdGggbW9yZS1pbmRlbnRlZCBsZWFkaW5nIGVtcHR5IGxpbmVzIG11c3QgdXNlIGFuIGV4cGxpY2l0IGluZGVudGF0aW9uIGluZGljYXRvcic7XG4gICAgICAgICAgICAgICAgb25FcnJvcihvZmZzZXQgKyBpbmRlbnQubGVuZ3RoLCAnTUlTU0lOR19DSEFSJywgbWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaGVhZGVyLmluZGVudCA9PT0gMClcbiAgICAgICAgICAgICAgICB0cmltSW5kZW50ID0gaW5kZW50Lmxlbmd0aDtcbiAgICAgICAgICAgIGNvbnRlbnRTdGFydCA9IGk7XG4gICAgICAgICAgICBpZiAodHJpbUluZGVudCA9PT0gMCAmJiAhY3R4LmF0Um9vdCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSAnQmxvY2sgc2NhbGFyIHZhbHVlcyBpbiBjb2xsZWN0aW9ucyBtdXN0IGJlIGluZGVudGVkJztcbiAgICAgICAgICAgICAgICBvbkVycm9yKG9mZnNldCwgJ0JBRF9JTkRFTlQnLCBtZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIG9mZnNldCArPSBpbmRlbnQubGVuZ3RoICsgY29udGVudC5sZW5ndGggKyAxO1xuICAgIH1cbiAgICAvLyBpbmNsdWRlIHRyYWlsaW5nIG1vcmUtaW5kZW50ZWQgZW1wdHkgbGluZXMgaW4gY29udGVudFxuICAgIGZvciAobGV0IGkgPSBsaW5lcy5sZW5ndGggLSAxOyBpID49IGNob21wU3RhcnQ7IC0taSkge1xuICAgICAgICBpZiAobGluZXNbaV1bMF0ubGVuZ3RoID4gdHJpbUluZGVudClcbiAgICAgICAgICAgIGNob21wU3RhcnQgPSBpICsgMTtcbiAgICB9XG4gICAgbGV0IHZhbHVlID0gJyc7XG4gICAgbGV0IHNlcCA9ICcnO1xuICAgIGxldCBwcmV2TW9yZUluZGVudGVkID0gZmFsc2U7XG4gICAgLy8gbGVhZGluZyB3aGl0ZXNwYWNlIGlzIGtlcHQgaW50YWN0XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb250ZW50U3RhcnQ7ICsraSlcbiAgICAgICAgdmFsdWUgKz0gbGluZXNbaV1bMF0uc2xpY2UodHJpbUluZGVudCkgKyAnXFxuJztcbiAgICBmb3IgKGxldCBpID0gY29udGVudFN0YXJ0OyBpIDwgY2hvbXBTdGFydDsgKytpKSB7XG4gICAgICAgIGxldCBbaW5kZW50LCBjb250ZW50XSA9IGxpbmVzW2ldO1xuICAgICAgICBvZmZzZXQgKz0gaW5kZW50Lmxlbmd0aCArIGNvbnRlbnQubGVuZ3RoICsgMTtcbiAgICAgICAgY29uc3QgY3JsZiA9IGNvbnRlbnRbY29udGVudC5sZW5ndGggLSAxXSA9PT0gJ1xccic7XG4gICAgICAgIGlmIChjcmxmKVxuICAgICAgICAgICAgY29udGVudCA9IGNvbnRlbnQuc2xpY2UoMCwgLTEpO1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgYWxyZWFkeSBjYXVnaHQgaW4gbGV4ZXIgKi9cbiAgICAgICAgaWYgKGNvbnRlbnQgJiYgaW5kZW50Lmxlbmd0aCA8IHRyaW1JbmRlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IHNyYyA9IGhlYWRlci5pbmRlbnRcbiAgICAgICAgICAgICAgICA/ICdleHBsaWNpdCBpbmRlbnRhdGlvbiBpbmRpY2F0b3InXG4gICAgICAgICAgICAgICAgOiAnZmlyc3QgbGluZSc7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gYEJsb2NrIHNjYWxhciBsaW5lcyBtdXN0IG5vdCBiZSBsZXNzIGluZGVudGVkIHRoYW4gdGhlaXIgJHtzcmN9YDtcbiAgICAgICAgICAgIG9uRXJyb3Iob2Zmc2V0IC0gY29udGVudC5sZW5ndGggLSAoY3JsZiA/IDIgOiAxKSwgJ0JBRF9JTkRFTlQnLCBtZXNzYWdlKTtcbiAgICAgICAgICAgIGluZGVudCA9ICcnO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlID09PSBTY2FsYXIuQkxPQ0tfTElURVJBTCkge1xuICAgICAgICAgICAgdmFsdWUgKz0gc2VwICsgaW5kZW50LnNsaWNlKHRyaW1JbmRlbnQpICsgY29udGVudDtcbiAgICAgICAgICAgIHNlcCA9ICdcXG4nO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGluZGVudC5sZW5ndGggPiB0cmltSW5kZW50IHx8IGNvbnRlbnRbMF0gPT09ICdcXHQnKSB7XG4gICAgICAgICAgICAvLyBtb3JlLWluZGVudGVkIGNvbnRlbnQgd2l0aGluIGEgZm9sZGVkIGJsb2NrXG4gICAgICAgICAgICBpZiAoc2VwID09PSAnICcpXG4gICAgICAgICAgICAgICAgc2VwID0gJ1xcbic7XG4gICAgICAgICAgICBlbHNlIGlmICghcHJldk1vcmVJbmRlbnRlZCAmJiBzZXAgPT09ICdcXG4nKVxuICAgICAgICAgICAgICAgIHNlcCA9ICdcXG5cXG4nO1xuICAgICAgICAgICAgdmFsdWUgKz0gc2VwICsgaW5kZW50LnNsaWNlKHRyaW1JbmRlbnQpICsgY29udGVudDtcbiAgICAgICAgICAgIHNlcCA9ICdcXG4nO1xuICAgICAgICAgICAgcHJldk1vcmVJbmRlbnRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY29udGVudCA9PT0gJycpIHtcbiAgICAgICAgICAgIC8vIGVtcHR5IGxpbmVcbiAgICAgICAgICAgIGlmIChzZXAgPT09ICdcXG4nKVxuICAgICAgICAgICAgICAgIHZhbHVlICs9ICdcXG4nO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHNlcCA9ICdcXG4nO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFsdWUgKz0gc2VwICsgY29udGVudDtcbiAgICAgICAgICAgIHNlcCA9ICcgJztcbiAgICAgICAgICAgIHByZXZNb3JlSW5kZW50ZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzd2l0Y2ggKGhlYWRlci5jaG9tcCkge1xuICAgICAgICBjYXNlICctJzpcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICcrJzpcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBjaG9tcFN0YXJ0OyBpIDwgbGluZXMubGVuZ3RoOyArK2kpXG4gICAgICAgICAgICAgICAgdmFsdWUgKz0gJ1xcbicgKyBsaW5lc1tpXVswXS5zbGljZSh0cmltSW5kZW50KTtcbiAgICAgICAgICAgIGlmICh2YWx1ZVt2YWx1ZS5sZW5ndGggLSAxXSAhPT0gJ1xcbicpXG4gICAgICAgICAgICAgICAgdmFsdWUgKz0gJ1xcbic7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHZhbHVlICs9ICdcXG4nO1xuICAgIH1cbiAgICBjb25zdCBlbmQgPSBzdGFydCArIGhlYWRlci5sZW5ndGggKyBzY2FsYXIuc291cmNlLmxlbmd0aDtcbiAgICByZXR1cm4geyB2YWx1ZSwgdHlwZSwgY29tbWVudDogaGVhZGVyLmNvbW1lbnQsIHJhbmdlOiBbc3RhcnQsIGVuZCwgZW5kXSB9O1xufVxuZnVuY3Rpb24gcGFyc2VCbG9ja1NjYWxhckhlYWRlcih7IG9mZnNldCwgcHJvcHMgfSwgc3RyaWN0LCBvbkVycm9yKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmIHNob3VsZCBub3QgaGFwcGVuICovXG4gICAgaWYgKHByb3BzWzBdLnR5cGUgIT09ICdibG9jay1zY2FsYXItaGVhZGVyJykge1xuICAgICAgICBvbkVycm9yKHByb3BzWzBdLCAnSU1QT1NTSUJMRScsICdCbG9jayBzY2FsYXIgaGVhZGVyIG5vdCBmb3VuZCcpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgeyBzb3VyY2UgfSA9IHByb3BzWzBdO1xuICAgIGNvbnN0IG1vZGUgPSBzb3VyY2VbMF07XG4gICAgbGV0IGluZGVudCA9IDA7XG4gICAgbGV0IGNob21wID0gJyc7XG4gICAgbGV0IGVycm9yID0gLTE7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzb3VyY2UubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY29uc3QgY2ggPSBzb3VyY2VbaV07XG4gICAgICAgIGlmICghY2hvbXAgJiYgKGNoID09PSAnLScgfHwgY2ggPT09ICcrJykpXG4gICAgICAgICAgICBjaG9tcCA9IGNoO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSBOdW1iZXIoY2gpO1xuICAgICAgICAgICAgaWYgKCFpbmRlbnQgJiYgbilcbiAgICAgICAgICAgICAgICBpbmRlbnQgPSBuO1xuICAgICAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09IC0xKVxuICAgICAgICAgICAgICAgIGVycm9yID0gb2Zmc2V0ICsgaTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoZXJyb3IgIT09IC0xKVxuICAgICAgICBvbkVycm9yKGVycm9yLCAnVU5FWFBFQ1RFRF9UT0tFTicsIGBCbG9jayBzY2FsYXIgaGVhZGVyIGluY2x1ZGVzIGV4dHJhIGNoYXJhY3RlcnM6ICR7c291cmNlfWApO1xuICAgIGxldCBoYXNTcGFjZSA9IGZhbHNlO1xuICAgIGxldCBjb21tZW50ID0gJyc7XG4gICAgbGV0IGxlbmd0aCA9IHNvdXJjZS5sZW5ndGg7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBwcm9wcy5sZW5ndGg7ICsraSkge1xuICAgICAgICBjb25zdCB0b2tlbiA9IHByb3BzW2ldO1xuICAgICAgICBzd2l0Y2ggKHRva2VuLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ3NwYWNlJzpcbiAgICAgICAgICAgICAgICBoYXNTcGFjZSA9IHRydWU7XG4gICAgICAgICAgICAvLyBmYWxsdGhyb3VnaFxuICAgICAgICAgICAgY2FzZSAnbmV3bGluZSc6XG4gICAgICAgICAgICAgICAgbGVuZ3RoICs9IHRva2VuLnNvdXJjZS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdjb21tZW50JzpcbiAgICAgICAgICAgICAgICBpZiAoc3RyaWN0ICYmICFoYXNTcGFjZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gJ0NvbW1lbnRzIG11c3QgYmUgc2VwYXJhdGVkIGZyb20gb3RoZXIgdG9rZW5zIGJ5IHdoaXRlIHNwYWNlIGNoYXJhY3RlcnMnO1xuICAgICAgICAgICAgICAgICAgICBvbkVycm9yKHRva2VuLCAnTUlTU0lOR19DSEFSJywgbWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxlbmd0aCArPSB0b2tlbi5zb3VyY2UubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGNvbW1lbnQgPSB0b2tlbi5zb3VyY2Uuc3Vic3RyaW5nKDEpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZXJyb3InOlxuICAgICAgICAgICAgICAgIG9uRXJyb3IodG9rZW4sICdVTkVYUEVDVEVEX1RPS0VOJywgdG9rZW4ubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgbGVuZ3RoICs9IHRva2VuLnNvdXJjZS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCBzaG91bGQgbm90IGhhcHBlbiAqL1xuICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBgVW5leHBlY3RlZCB0b2tlbiBpbiBibG9jayBzY2FsYXIgaGVhZGVyOiAke3Rva2VuLnR5cGV9YDtcbiAgICAgICAgICAgICAgICBvbkVycm9yKHRva2VuLCAnVU5FWFBFQ1RFRF9UT0tFTicsIG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRzID0gdG9rZW4uc291cmNlO1xuICAgICAgICAgICAgICAgIGlmICh0cyAmJiB0eXBlb2YgdHMgPT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgICAgICAgICBsZW5ndGggKz0gdHMubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IG1vZGUsIGluZGVudCwgY2hvbXAsIGNvbW1lbnQsIGxlbmd0aCB9O1xufVxuLyoqIEByZXR1cm5zIEFycmF5IG9mIGxpbmVzIHNwbGl0IHVwIGFzIGBbaW5kZW50LCBjb250ZW50XWAgKi9cbmZ1bmN0aW9uIHNwbGl0TGluZXMoc291cmNlKSB7XG4gICAgY29uc3Qgc3BsaXQgPSBzb3VyY2Uuc3BsaXQoL1xcbiggKikvKTtcbiAgICBjb25zdCBmaXJzdCA9IHNwbGl0WzBdO1xuICAgIGNvbnN0IG0gPSBmaXJzdC5tYXRjaCgvXiggKikvKTtcbiAgICBjb25zdCBsaW5lMCA9IG0/LlsxXVxuICAgICAgICA/IFttWzFdLCBmaXJzdC5zbGljZShtWzFdLmxlbmd0aCldXG4gICAgICAgIDogWycnLCBmaXJzdF07XG4gICAgY29uc3QgbGluZXMgPSBbbGluZTBdO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgc3BsaXQubGVuZ3RoOyBpICs9IDIpXG4gICAgICAgIGxpbmVzLnB1c2goW3NwbGl0W2ldLCBzcGxpdFtpICsgMV1dKTtcbiAgICByZXR1cm4gbGluZXM7XG59XG5cbmV4cG9ydCB7IHJlc29sdmVCbG9ja1NjYWxhciB9O1xuIiwiaW1wb3J0IHsgU2NhbGFyIH0gZnJvbSAnLi4vbm9kZXMvU2NhbGFyLmpzJztcbmltcG9ydCB7IHJlc29sdmVFbmQgfSBmcm9tICcuL3Jlc29sdmUtZW5kLmpzJztcblxuZnVuY3Rpb24gcmVzb2x2ZUZsb3dTY2FsYXIoc2NhbGFyLCBzdHJpY3QsIG9uRXJyb3IpIHtcbiAgICBjb25zdCB7IG9mZnNldCwgdHlwZSwgc291cmNlLCBlbmQgfSA9IHNjYWxhcjtcbiAgICBsZXQgX3R5cGU7XG4gICAgbGV0IHZhbHVlO1xuICAgIGNvbnN0IF9vbkVycm9yID0gKHJlbCwgY29kZSwgbXNnKSA9PiBvbkVycm9yKG9mZnNldCArIHJlbCwgY29kZSwgbXNnKTtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgY2FzZSAnc2NhbGFyJzpcbiAgICAgICAgICAgIF90eXBlID0gU2NhbGFyLlBMQUlOO1xuICAgICAgICAgICAgdmFsdWUgPSBwbGFpblZhbHVlKHNvdXJjZSwgX29uRXJyb3IpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3NpbmdsZS1xdW90ZWQtc2NhbGFyJzpcbiAgICAgICAgICAgIF90eXBlID0gU2NhbGFyLlFVT1RFX1NJTkdMRTtcbiAgICAgICAgICAgIHZhbHVlID0gc2luZ2xlUXVvdGVkVmFsdWUoc291cmNlLCBfb25FcnJvcik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnZG91YmxlLXF1b3RlZC1zY2FsYXInOlxuICAgICAgICAgICAgX3R5cGUgPSBTY2FsYXIuUVVPVEVfRE9VQkxFO1xuICAgICAgICAgICAgdmFsdWUgPSBkb3VibGVRdW90ZWRWYWx1ZShzb3VyY2UsIF9vbkVycm9yKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCBzaG91bGQgbm90IGhhcHBlbiAqL1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgb25FcnJvcihzY2FsYXIsICdVTkVYUEVDVEVEX1RPS0VOJywgYEV4cGVjdGVkIGEgZmxvdyBzY2FsYXIgdmFsdWUsIGJ1dCBmb3VuZDogJHt0eXBlfWApO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogJycsXG4gICAgICAgICAgICAgICAgdHlwZTogbnVsbCxcbiAgICAgICAgICAgICAgICBjb21tZW50OiAnJyxcbiAgICAgICAgICAgICAgICByYW5nZTogW29mZnNldCwgb2Zmc2V0ICsgc291cmNlLmxlbmd0aCwgb2Zmc2V0ICsgc291cmNlLmxlbmd0aF1cbiAgICAgICAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlRW5kID0gb2Zmc2V0ICsgc291cmNlLmxlbmd0aDtcbiAgICBjb25zdCByZSA9IHJlc29sdmVFbmQoZW5kLCB2YWx1ZUVuZCwgc3RyaWN0LCBvbkVycm9yKTtcbiAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZSxcbiAgICAgICAgdHlwZTogX3R5cGUsXG4gICAgICAgIGNvbW1lbnQ6IHJlLmNvbW1lbnQsXG4gICAgICAgIHJhbmdlOiBbb2Zmc2V0LCB2YWx1ZUVuZCwgcmUub2Zmc2V0XVxuICAgIH07XG59XG5mdW5jdGlvbiBwbGFpblZhbHVlKHNvdXJjZSwgb25FcnJvcikge1xuICAgIGxldCBiYWRDaGFyID0gJyc7XG4gICAgc3dpdGNoIChzb3VyY2VbMF0pIHtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgc2hvdWxkIG5vdCBoYXBwZW4gKi9cbiAgICAgICAgY2FzZSAnXFx0JzpcbiAgICAgICAgICAgIGJhZENoYXIgPSAnYSB0YWIgY2hhcmFjdGVyJztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICcsJzpcbiAgICAgICAgICAgIGJhZENoYXIgPSAnZmxvdyBpbmRpY2F0b3IgY2hhcmFjdGVyICwnO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJyUnOlxuICAgICAgICAgICAgYmFkQ2hhciA9ICdkaXJlY3RpdmUgaW5kaWNhdG9yIGNoYXJhY3RlciAlJztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICd8JzpcbiAgICAgICAgY2FzZSAnPic6IHtcbiAgICAgICAgICAgIGJhZENoYXIgPSBgYmxvY2sgc2NhbGFyIGluZGljYXRvciAke3NvdXJjZVswXX1gO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnQCc6XG4gICAgICAgIGNhc2UgJ2AnOiB7XG4gICAgICAgICAgICBiYWRDaGFyID0gYHJlc2VydmVkIGNoYXJhY3RlciAke3NvdXJjZVswXX1gO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGJhZENoYXIpXG4gICAgICAgIG9uRXJyb3IoMCwgJ0JBRF9TQ0FMQVJfU1RBUlQnLCBgUGxhaW4gdmFsdWUgY2Fubm90IHN0YXJ0IHdpdGggJHtiYWRDaGFyfWApO1xuICAgIHJldHVybiB1bmZvbGRMaW5lcyhzb3VyY2UpO1xufVxuZnVuY3Rpb24gc2luZ2xlUXVvdGVkVmFsdWUoc291cmNlLCBvbkVycm9yKSB7XG4gICAgaWYgKHNvdXJjZVtzb3VyY2UubGVuZ3RoIC0gMV0gIT09IFwiJ1wiIHx8IHNvdXJjZS5sZW5ndGggPT09IDEpXG4gICAgICAgIG9uRXJyb3Ioc291cmNlLmxlbmd0aCwgJ01JU1NJTkdfQ0hBUicsIFwiTWlzc2luZyBjbG9zaW5nICdxdW90ZVwiKTtcbiAgICByZXR1cm4gdW5mb2xkTGluZXMoc291cmNlLnNsaWNlKDEsIC0xKSkucmVwbGFjZSgvJycvZywgXCInXCIpO1xufVxuZnVuY3Rpb24gdW5mb2xkTGluZXMoc291cmNlKSB7XG4gICAgY29uc3QgbGluZSA9IC8oLio/KVxccj9cXG4vc3k7XG4gICAgbGV0IG1hdGNoID0gbGluZS5leGVjKHNvdXJjZSk7XG4gICAgaWYgKCFtYXRjaClcbiAgICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICAvKipcbiAgICAgKiBUaGUgbmVnYXRpdmUgbG9va2JlaGluZHMgaW4gdGhlc2UgUmVnRXhwcyBhcmUgdG9cbiAgICAgKiBwcmV2ZW50IGNhdXNpbmcgYSBwb2x5bm9taWFsIHNlYXJjaCB0aW1lIGluIGNlcnRhaW4gY2FzZXMuXG4gICAgICpcbiAgICAgKiBUaGUgdHJ5LWNhdGNoIGlzIGZvciBTYWZhcmkgPCAxNi40IGFuZCBvdGhlciBvbGQgYnJvd3NlcnM6XG4gICAgICogaHR0cHM6Ly9jYW5pdXNlLmNvbS9qcy1yZWdleHAtbG9va2JlaGluZFxuICAgICAqL1xuICAgIGxldCB0cmltRW5kLCB0cmltQm90aDtcbiAgICB0cnkge1xuICAgICAgICB0cmltRW5kID0gbmV3IFJlZ0V4cCgnKD88IVsgXFx0XSlbIFxcdF0rJCcpO1xuICAgICAgICB0cmltQm90aCA9IG5ldyBSZWdFeHAoJ15bIFxcdF0rfCg/PCFbIFxcdF0pWyBcXHRdKyQnLCAnZycpO1xuICAgIH1cbiAgICBjYXRjaCB7XG4gICAgICAgIHRyaW1FbmQgPSAvWyBcXHRdKyQvO1xuICAgICAgICB0cmltQm90aCA9IC9eWyBcXHRdK3xbIFxcdF0rJC9nO1xuICAgIH1cbiAgICBsZXQgcmVzID0gbWF0Y2hbMV0ucmVwbGFjZSh0cmltRW5kLCAnJyk7XG4gICAgbGV0IHNlcCA9ICcgJztcbiAgICBsZXQgcG9zID0gbGluZS5sYXN0SW5kZXg7XG4gICAgd2hpbGUgKChtYXRjaCA9IGxpbmUuZXhlYyhzb3VyY2UpKSkge1xuICAgICAgICBjb25zdCBsbSA9IG1hdGNoWzFdLnJlcGxhY2UodHJpbUJvdGgsICcnKTtcbiAgICAgICAgaWYgKGxtID09PSAnJykge1xuICAgICAgICAgICAgaWYgKHNlcCA9PT0gJ1xcbicpXG4gICAgICAgICAgICAgICAgcmVzICs9IHNlcDtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBzZXAgPSAnXFxuJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlcyArPSBzZXAgKyBsbTtcbiAgICAgICAgICAgIHNlcCA9ICcgJztcbiAgICAgICAgfVxuICAgICAgICBwb3MgPSBsaW5lLmxhc3RJbmRleDtcbiAgICB9XG4gICAgY29uc3QgbGFzdCA9IC9bIFxcdF0qKC4qKS9zeTtcbiAgICBsYXN0Lmxhc3RJbmRleCA9IHBvcztcbiAgICBtYXRjaCA9IGxhc3QuZXhlYyhzb3VyY2UpO1xuICAgIHJldHVybiByZXMgKyBzZXAgKyAobWF0Y2g/LlsxXSA/PyAnJyk7XG59XG5mdW5jdGlvbiBkb3VibGVRdW90ZWRWYWx1ZShzb3VyY2UsIG9uRXJyb3IpIHtcbiAgICBsZXQgcmVzID0gJyc7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzb3VyY2UubGVuZ3RoIC0gMTsgKytpKSB7XG4gICAgICAgIGNvbnN0IGNoID0gc291cmNlW2ldO1xuICAgICAgICBpZiAoY2ggPT09ICdcXHInICYmIHNvdXJjZVtpICsgMV0gPT09ICdcXG4nKVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIGlmIChjaCA9PT0gJ1xcbicpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgZm9sZCwgb2Zmc2V0IH0gPSBmb2xkTmV3bGluZShzb3VyY2UsIGkpO1xuICAgICAgICAgICAgcmVzICs9IGZvbGQ7XG4gICAgICAgICAgICBpID0gb2Zmc2V0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNoID09PSAnXFxcXCcpIHtcbiAgICAgICAgICAgIGxldCBuZXh0ID0gc291cmNlWysraV07XG4gICAgICAgICAgICBjb25zdCBjYyA9IGVzY2FwZUNvZGVzW25leHRdO1xuICAgICAgICAgICAgaWYgKGNjKVxuICAgICAgICAgICAgICAgIHJlcyArPSBjYztcbiAgICAgICAgICAgIGVsc2UgaWYgKG5leHQgPT09ICdcXG4nKSB7XG4gICAgICAgICAgICAgICAgLy8gc2tpcCBlc2NhcGVkIG5ld2xpbmVzLCBidXQgc3RpbGwgdHJpbSB0aGUgZm9sbG93aW5nIGxpbmVcbiAgICAgICAgICAgICAgICBuZXh0ID0gc291cmNlW2kgKyAxXTtcbiAgICAgICAgICAgICAgICB3aGlsZSAobmV4dCA9PT0gJyAnIHx8IG5leHQgPT09ICdcXHQnKVxuICAgICAgICAgICAgICAgICAgICBuZXh0ID0gc291cmNlWysraSArIDFdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobmV4dCA9PT0gJ1xccicgJiYgc291cmNlW2kgKyAxXSA9PT0gJ1xcbicpIHtcbiAgICAgICAgICAgICAgICAvLyBza2lwIGVzY2FwZWQgQ1JMRiBuZXdsaW5lcywgYnV0IHN0aWxsIHRyaW0gdGhlIGZvbGxvd2luZyBsaW5lXG4gICAgICAgICAgICAgICAgbmV4dCA9IHNvdXJjZVsrK2kgKyAxXTtcbiAgICAgICAgICAgICAgICB3aGlsZSAobmV4dCA9PT0gJyAnIHx8IG5leHQgPT09ICdcXHQnKVxuICAgICAgICAgICAgICAgICAgICBuZXh0ID0gc291cmNlWysraSArIDFdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobmV4dCA9PT0gJ3gnIHx8IG5leHQgPT09ICd1JyB8fCBuZXh0ID09PSAnVScpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsZW5ndGggPSBuZXh0ID09PSAneCcgPyAyIDogbmV4dCA9PT0gJ3UnID8gNCA6IDg7XG4gICAgICAgICAgICAgICAgcmVzICs9IHBhcnNlQ2hhckNvZGUoc291cmNlLCBpICsgMSwgbGVuZ3RoLCBvbkVycm9yKTtcbiAgICAgICAgICAgICAgICBpICs9IGxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJhdyA9IHNvdXJjZS5zdWJzdHIoaSAtIDEsIDIpO1xuICAgICAgICAgICAgICAgIG9uRXJyb3IoaSAtIDEsICdCQURfRFFfRVNDQVBFJywgYEludmFsaWQgZXNjYXBlIHNlcXVlbmNlICR7cmF3fWApO1xuICAgICAgICAgICAgICAgIHJlcyArPSByYXc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY2ggPT09ICcgJyB8fCBjaCA9PT0gJ1xcdCcpIHtcbiAgICAgICAgICAgIC8vIHRyaW0gdHJhaWxpbmcgd2hpdGVzcGFjZVxuICAgICAgICAgICAgY29uc3Qgd3NTdGFydCA9IGk7XG4gICAgICAgICAgICBsZXQgbmV4dCA9IHNvdXJjZVtpICsgMV07XG4gICAgICAgICAgICB3aGlsZSAobmV4dCA9PT0gJyAnIHx8IG5leHQgPT09ICdcXHQnKVxuICAgICAgICAgICAgICAgIG5leHQgPSBzb3VyY2VbKytpICsgMV07XG4gICAgICAgICAgICBpZiAobmV4dCAhPT0gJ1xcbicgJiYgIShuZXh0ID09PSAnXFxyJyAmJiBzb3VyY2VbaSArIDJdID09PSAnXFxuJykpXG4gICAgICAgICAgICAgICAgcmVzICs9IGkgPiB3c1N0YXJ0ID8gc291cmNlLnNsaWNlKHdzU3RhcnQsIGkgKyAxKSA6IGNoO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVzICs9IGNoO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChzb3VyY2Vbc291cmNlLmxlbmd0aCAtIDFdICE9PSAnXCInIHx8IHNvdXJjZS5sZW5ndGggPT09IDEpXG4gICAgICAgIG9uRXJyb3Ioc291cmNlLmxlbmd0aCwgJ01JU1NJTkdfQ0hBUicsICdNaXNzaW5nIGNsb3NpbmcgXCJxdW90ZScpO1xuICAgIHJldHVybiByZXM7XG59XG4vKipcbiAqIEZvbGQgYSBzaW5nbGUgbmV3bGluZSBpbnRvIGEgc3BhY2UsIG11bHRpcGxlIG5ld2xpbmVzIHRvIE4gLSAxIG5ld2xpbmVzLlxuICogUHJlc3VtZXMgYHNvdXJjZVtvZmZzZXRdID09PSAnXFxuJ2BcbiAqL1xuZnVuY3Rpb24gZm9sZE5ld2xpbmUoc291cmNlLCBvZmZzZXQpIHtcbiAgICBsZXQgZm9sZCA9ICcnO1xuICAgIGxldCBjaCA9IHNvdXJjZVtvZmZzZXQgKyAxXTtcbiAgICB3aGlsZSAoY2ggPT09ICcgJyB8fCBjaCA9PT0gJ1xcdCcgfHwgY2ggPT09ICdcXG4nIHx8IGNoID09PSAnXFxyJykge1xuICAgICAgICBpZiAoY2ggPT09ICdcXHInICYmIHNvdXJjZVtvZmZzZXQgKyAyXSAhPT0gJ1xcbicpXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgaWYgKGNoID09PSAnXFxuJylcbiAgICAgICAgICAgIGZvbGQgKz0gJ1xcbic7XG4gICAgICAgIG9mZnNldCArPSAxO1xuICAgICAgICBjaCA9IHNvdXJjZVtvZmZzZXQgKyAxXTtcbiAgICB9XG4gICAgaWYgKCFmb2xkKVxuICAgICAgICBmb2xkID0gJyAnO1xuICAgIHJldHVybiB7IGZvbGQsIG9mZnNldCB9O1xufVxuY29uc3QgZXNjYXBlQ29kZXMgPSB7XG4gICAgJzAnOiAnXFwwJywgLy8gbnVsbCBjaGFyYWN0ZXJcbiAgICBhOiAnXFx4MDcnLCAvLyBiZWxsIGNoYXJhY3RlclxuICAgIGI6ICdcXGInLCAvLyBiYWNrc3BhY2VcbiAgICBlOiAnXFx4MWInLCAvLyBlc2NhcGUgY2hhcmFjdGVyXG4gICAgZjogJ1xcZicsIC8vIGZvcm0gZmVlZFxuICAgIG46ICdcXG4nLCAvLyBsaW5lIGZlZWRcbiAgICByOiAnXFxyJywgLy8gY2FycmlhZ2UgcmV0dXJuXG4gICAgdDogJ1xcdCcsIC8vIGhvcml6b250YWwgdGFiXG4gICAgdjogJ1xcdicsIC8vIHZlcnRpY2FsIHRhYlxuICAgIE46ICdcXHUwMDg1JywgLy8gVW5pY29kZSBuZXh0IGxpbmVcbiAgICBfOiAnXFx1MDBhMCcsIC8vIFVuaWNvZGUgbm9uLWJyZWFraW5nIHNwYWNlXG4gICAgTDogJ1xcdTIwMjgnLCAvLyBVbmljb2RlIGxpbmUgc2VwYXJhdG9yXG4gICAgUDogJ1xcdTIwMjknLCAvLyBVbmljb2RlIHBhcmFncmFwaCBzZXBhcmF0b3JcbiAgICAnICc6ICcgJyxcbiAgICAnXCInOiAnXCInLFxuICAgICcvJzogJy8nLFxuICAgICdcXFxcJzogJ1xcXFwnLFxuICAgICdcXHQnOiAnXFx0J1xufTtcbmZ1bmN0aW9uIHBhcnNlQ2hhckNvZGUoc291cmNlLCBvZmZzZXQsIGxlbmd0aCwgb25FcnJvcikge1xuICAgIGNvbnN0IGNjID0gc291cmNlLnN1YnN0cihvZmZzZXQsIGxlbmd0aCk7XG4gICAgY29uc3Qgb2sgPSBjYy5sZW5ndGggPT09IGxlbmd0aCAmJiAvXlswLTlhLWZBLUZdKyQvLnRlc3QoY2MpO1xuICAgIGNvbnN0IGNvZGUgPSBvayA/IHBhcnNlSW50KGNjLCAxNikgOiBOYU47XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ29kZVBvaW50KGNvZGUpO1xuICAgIH1cbiAgICBjYXRjaCB7XG4gICAgICAgIGNvbnN0IHJhdyA9IHNvdXJjZS5zdWJzdHIob2Zmc2V0IC0gMiwgbGVuZ3RoICsgMik7XG4gICAgICAgIG9uRXJyb3Iob2Zmc2V0IC0gMiwgJ0JBRF9EUV9FU0NBUEUnLCBgSW52YWxpZCBlc2NhcGUgc2VxdWVuY2UgJHtyYXd9YCk7XG4gICAgICAgIHJldHVybiByYXc7XG4gICAgfVxufVxuXG5leHBvcnQgeyByZXNvbHZlRmxvd1NjYWxhciB9O1xuIiwiaW1wb3J0IHsgaXNTY2FsYXIsIFNDQUxBUiB9IGZyb20gJy4uL25vZGVzL2lkZW50aXR5LmpzJztcbmltcG9ydCB7IFNjYWxhciB9IGZyb20gJy4uL25vZGVzL1NjYWxhci5qcyc7XG5pbXBvcnQgeyByZXNvbHZlQmxvY2tTY2FsYXIgfSBmcm9tICcuL3Jlc29sdmUtYmxvY2stc2NhbGFyLmpzJztcbmltcG9ydCB7IHJlc29sdmVGbG93U2NhbGFyIH0gZnJvbSAnLi9yZXNvbHZlLWZsb3ctc2NhbGFyLmpzJztcblxuZnVuY3Rpb24gY29tcG9zZVNjYWxhcihjdHgsIHRva2VuLCB0YWdUb2tlbiwgb25FcnJvcikge1xuICAgIGNvbnN0IHsgdmFsdWUsIHR5cGUsIGNvbW1lbnQsIHJhbmdlIH0gPSB0b2tlbi50eXBlID09PSAnYmxvY2stc2NhbGFyJ1xuICAgICAgICA/IHJlc29sdmVCbG9ja1NjYWxhcihjdHgsIHRva2VuLCBvbkVycm9yKVxuICAgICAgICA6IHJlc29sdmVGbG93U2NhbGFyKHRva2VuLCBjdHgub3B0aW9ucy5zdHJpY3QsIG9uRXJyb3IpO1xuICAgIGNvbnN0IHRhZ05hbWUgPSB0YWdUb2tlblxuICAgICAgICA/IGN0eC5kaXJlY3RpdmVzLnRhZ05hbWUodGFnVG9rZW4uc291cmNlLCBtc2cgPT4gb25FcnJvcih0YWdUb2tlbiwgJ1RBR19SRVNPTFZFX0ZBSUxFRCcsIG1zZykpXG4gICAgICAgIDogbnVsbDtcbiAgICBsZXQgdGFnO1xuICAgIGlmIChjdHgub3B0aW9ucy5zdHJpbmdLZXlzICYmIGN0eC5hdEtleSkge1xuICAgICAgICB0YWcgPSBjdHguc2NoZW1hW1NDQUxBUl07XG4gICAgfVxuICAgIGVsc2UgaWYgKHRhZ05hbWUpXG4gICAgICAgIHRhZyA9IGZpbmRTY2FsYXJUYWdCeU5hbWUoY3R4LnNjaGVtYSwgdmFsdWUsIHRhZ05hbWUsIHRhZ1Rva2VuLCBvbkVycm9yKTtcbiAgICBlbHNlIGlmICh0b2tlbi50eXBlID09PSAnc2NhbGFyJylcbiAgICAgICAgdGFnID0gZmluZFNjYWxhclRhZ0J5VGVzdChjdHgsIHZhbHVlLCB0b2tlbiwgb25FcnJvcik7XG4gICAgZWxzZVxuICAgICAgICB0YWcgPSBjdHguc2NoZW1hW1NDQUxBUl07XG4gICAgbGV0IHNjYWxhcjtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCByZXMgPSB0YWcucmVzb2x2ZSh2YWx1ZSwgbXNnID0+IG9uRXJyb3IodGFnVG9rZW4gPz8gdG9rZW4sICdUQUdfUkVTT0xWRV9GQUlMRUQnLCBtc2cpLCBjdHgub3B0aW9ucyk7XG4gICAgICAgIHNjYWxhciA9IGlzU2NhbGFyKHJlcykgPyByZXMgOiBuZXcgU2NhbGFyKHJlcyk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBtc2cgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgICAgIG9uRXJyb3IodGFnVG9rZW4gPz8gdG9rZW4sICdUQUdfUkVTT0xWRV9GQUlMRUQnLCBtc2cpO1xuICAgICAgICBzY2FsYXIgPSBuZXcgU2NhbGFyKHZhbHVlKTtcbiAgICB9XG4gICAgc2NhbGFyLnJhbmdlID0gcmFuZ2U7XG4gICAgc2NhbGFyLnNvdXJjZSA9IHZhbHVlO1xuICAgIGlmICh0eXBlKVxuICAgICAgICBzY2FsYXIudHlwZSA9IHR5cGU7XG4gICAgaWYgKHRhZ05hbWUpXG4gICAgICAgIHNjYWxhci50YWcgPSB0YWdOYW1lO1xuICAgIGlmICh0YWcuZm9ybWF0KVxuICAgICAgICBzY2FsYXIuZm9ybWF0ID0gdGFnLmZvcm1hdDtcbiAgICBpZiAoY29tbWVudClcbiAgICAgICAgc2NhbGFyLmNvbW1lbnQgPSBjb21tZW50O1xuICAgIHJldHVybiBzY2FsYXI7XG59XG5mdW5jdGlvbiBmaW5kU2NhbGFyVGFnQnlOYW1lKHNjaGVtYSwgdmFsdWUsIHRhZ05hbWUsIHRhZ1Rva2VuLCBvbkVycm9yKSB7XG4gICAgaWYgKHRhZ05hbWUgPT09ICchJylcbiAgICAgICAgcmV0dXJuIHNjaGVtYVtTQ0FMQVJdOyAvLyBub24tc3BlY2lmaWMgdGFnXG4gICAgY29uc3QgbWF0Y2hXaXRoVGVzdCA9IFtdO1xuICAgIGZvciAoY29uc3QgdGFnIG9mIHNjaGVtYS50YWdzKSB7XG4gICAgICAgIGlmICghdGFnLmNvbGxlY3Rpb24gJiYgdGFnLnRhZyA9PT0gdGFnTmFtZSkge1xuICAgICAgICAgICAgaWYgKHRhZy5kZWZhdWx0ICYmIHRhZy50ZXN0KVxuICAgICAgICAgICAgICAgIG1hdGNoV2l0aFRlc3QucHVzaCh0YWcpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiB0YWc7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCB0YWcgb2YgbWF0Y2hXaXRoVGVzdClcbiAgICAgICAgaWYgKHRhZy50ZXN0Py50ZXN0KHZhbHVlKSlcbiAgICAgICAgICAgIHJldHVybiB0YWc7XG4gICAgY29uc3Qga3QgPSBzY2hlbWEua25vd25UYWdzW3RhZ05hbWVdO1xuICAgIGlmIChrdCAmJiAha3QuY29sbGVjdGlvbikge1xuICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGUga25vd24gdGFnIGlzIGF2YWlsYWJsZSBmb3Igc3RyaW5naWZ5aW5nLFxuICAgICAgICAvLyBidXQgZG9lcyBub3QgZ2V0IHVzZWQgYnkgZGVmYXVsdC5cbiAgICAgICAgc2NoZW1hLnRhZ3MucHVzaChPYmplY3QuYXNzaWduKHt9LCBrdCwgeyBkZWZhdWx0OiBmYWxzZSwgdGVzdDogdW5kZWZpbmVkIH0pKTtcbiAgICAgICAgcmV0dXJuIGt0O1xuICAgIH1cbiAgICBvbkVycm9yKHRhZ1Rva2VuLCAnVEFHX1JFU09MVkVfRkFJTEVEJywgYFVucmVzb2x2ZWQgdGFnOiAke3RhZ05hbWV9YCwgdGFnTmFtZSAhPT0gJ3RhZzp5YW1sLm9yZywyMDAyOnN0cicpO1xuICAgIHJldHVybiBzY2hlbWFbU0NBTEFSXTtcbn1cbmZ1bmN0aW9uIGZpbmRTY2FsYXJUYWdCeVRlc3QoeyBhdEtleSwgZGlyZWN0aXZlcywgc2NoZW1hIH0sIHZhbHVlLCB0b2tlbiwgb25FcnJvcikge1xuICAgIGNvbnN0IHRhZyA9IHNjaGVtYS50YWdzLmZpbmQodGFnID0+ICh0YWcuZGVmYXVsdCA9PT0gdHJ1ZSB8fCAoYXRLZXkgJiYgdGFnLmRlZmF1bHQgPT09ICdrZXknKSkgJiZcbiAgICAgICAgdGFnLnRlc3Q/LnRlc3QodmFsdWUpKSB8fCBzY2hlbWFbU0NBTEFSXTtcbiAgICBpZiAoc2NoZW1hLmNvbXBhdCkge1xuICAgICAgICBjb25zdCBjb21wYXQgPSBzY2hlbWEuY29tcGF0LmZpbmQodGFnID0+IHRhZy5kZWZhdWx0ICYmIHRhZy50ZXN0Py50ZXN0KHZhbHVlKSkgPz9cbiAgICAgICAgICAgIHNjaGVtYVtTQ0FMQVJdO1xuICAgICAgICBpZiAodGFnLnRhZyAhPT0gY29tcGF0LnRhZykge1xuICAgICAgICAgICAgY29uc3QgdHMgPSBkaXJlY3RpdmVzLnRhZ1N0cmluZyh0YWcudGFnKTtcbiAgICAgICAgICAgIGNvbnN0IGNzID0gZGlyZWN0aXZlcy50YWdTdHJpbmcoY29tcGF0LnRhZyk7XG4gICAgICAgICAgICBjb25zdCBtc2cgPSBgVmFsdWUgbWF5IGJlIHBhcnNlZCBhcyBlaXRoZXIgJHt0c30gb3IgJHtjc31gO1xuICAgICAgICAgICAgb25FcnJvcih0b2tlbiwgJ1RBR19SRVNPTFZFX0ZBSUxFRCcsIG1zZywgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRhZztcbn1cblxuZXhwb3J0IHsgY29tcG9zZVNjYWxhciB9O1xuIiwiZnVuY3Rpb24gZW1wdHlTY2FsYXJQb3NpdGlvbihvZmZzZXQsIGJlZm9yZSwgcG9zKSB7XG4gICAgaWYgKGJlZm9yZSkge1xuICAgICAgICBwb3MgPz8gKHBvcyA9IGJlZm9yZS5sZW5ndGgpO1xuICAgICAgICBmb3IgKGxldCBpID0gcG9zIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgICAgIGxldCBzdCA9IGJlZm9yZVtpXTtcbiAgICAgICAgICAgIHN3aXRjaCAoc3QudHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ3NwYWNlJzpcbiAgICAgICAgICAgICAgICBjYXNlICdjb21tZW50JzpcbiAgICAgICAgICAgICAgICBjYXNlICduZXdsaW5lJzpcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0IC09IHN0LnNvdXJjZS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVGVjaG5pY2FsbHksIGFuIGVtcHR5IHNjYWxhciBpcyBpbW1lZGlhdGVseSBhZnRlciB0aGUgbGFzdCBub24tZW1wdHlcbiAgICAgICAgICAgIC8vIG5vZGUsIGJ1dCBpdCdzIG1vcmUgdXNlZnVsIHRvIHBsYWNlIGl0IGFmdGVyIGFueSB3aGl0ZXNwYWNlLlxuICAgICAgICAgICAgc3QgPSBiZWZvcmVbKytpXTtcbiAgICAgICAgICAgIHdoaWxlIChzdD8udHlwZSA9PT0gJ3NwYWNlJykge1xuICAgICAgICAgICAgICAgIG9mZnNldCArPSBzdC5zb3VyY2UubGVuZ3RoO1xuICAgICAgICAgICAgICAgIHN0ID0gYmVmb3JlWysraV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb2Zmc2V0O1xufVxuXG5leHBvcnQgeyBlbXB0eVNjYWxhclBvc2l0aW9uIH07XG4iLCJpbXBvcnQgeyBBbGlhcyB9IGZyb20gJy4uL25vZGVzL0FsaWFzLmpzJztcbmltcG9ydCB7IGlzU2NhbGFyIH0gZnJvbSAnLi4vbm9kZXMvaWRlbnRpdHkuanMnO1xuaW1wb3J0IHsgY29tcG9zZUNvbGxlY3Rpb24gfSBmcm9tICcuL2NvbXBvc2UtY29sbGVjdGlvbi5qcyc7XG5pbXBvcnQgeyBjb21wb3NlU2NhbGFyIH0gZnJvbSAnLi9jb21wb3NlLXNjYWxhci5qcyc7XG5pbXBvcnQgeyByZXNvbHZlRW5kIH0gZnJvbSAnLi9yZXNvbHZlLWVuZC5qcyc7XG5pbXBvcnQgeyBlbXB0eVNjYWxhclBvc2l0aW9uIH0gZnJvbSAnLi91dGlsLWVtcHR5LXNjYWxhci1wb3NpdGlvbi5qcyc7XG5cbmNvbnN0IENOID0geyBjb21wb3NlTm9kZSwgY29tcG9zZUVtcHR5Tm9kZSB9O1xuZnVuY3Rpb24gY29tcG9zZU5vZGUoY3R4LCB0b2tlbiwgcHJvcHMsIG9uRXJyb3IpIHtcbiAgICBjb25zdCBhdEtleSA9IGN0eC5hdEtleTtcbiAgICBjb25zdCB7IHNwYWNlQmVmb3JlLCBjb21tZW50LCBhbmNob3IsIHRhZyB9ID0gcHJvcHM7XG4gICAgbGV0IG5vZGU7XG4gICAgbGV0IGlzU3JjVG9rZW4gPSB0cnVlO1xuICAgIHN3aXRjaCAodG9rZW4udHlwZSkge1xuICAgICAgICBjYXNlICdhbGlhcyc6XG4gICAgICAgICAgICBub2RlID0gY29tcG9zZUFsaWFzKGN0eCwgdG9rZW4sIG9uRXJyb3IpO1xuICAgICAgICAgICAgaWYgKGFuY2hvciB8fCB0YWcpXG4gICAgICAgICAgICAgICAgb25FcnJvcih0b2tlbiwgJ0FMSUFTX1BST1BTJywgJ0FuIGFsaWFzIG5vZGUgbXVzdCBub3Qgc3BlY2lmeSBhbnkgcHJvcGVydGllcycpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3NjYWxhcic6XG4gICAgICAgIGNhc2UgJ3NpbmdsZS1xdW90ZWQtc2NhbGFyJzpcbiAgICAgICAgY2FzZSAnZG91YmxlLXF1b3RlZC1zY2FsYXInOlxuICAgICAgICBjYXNlICdibG9jay1zY2FsYXInOlxuICAgICAgICAgICAgbm9kZSA9IGNvbXBvc2VTY2FsYXIoY3R4LCB0b2tlbiwgdGFnLCBvbkVycm9yKTtcbiAgICAgICAgICAgIGlmIChhbmNob3IpXG4gICAgICAgICAgICAgICAgbm9kZS5hbmNob3IgPSBhbmNob3Iuc291cmNlLnN1YnN0cmluZygxKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdibG9jay1tYXAnOlxuICAgICAgICBjYXNlICdibG9jay1zZXEnOlxuICAgICAgICBjYXNlICdmbG93LWNvbGxlY3Rpb24nOlxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBub2RlID0gY29tcG9zZUNvbGxlY3Rpb24oQ04sIGN0eCwgdG9rZW4sIHByb3BzLCBvbkVycm9yKTtcbiAgICAgICAgICAgICAgICBpZiAoYW5jaG9yKVxuICAgICAgICAgICAgICAgICAgICBub2RlLmFuY2hvciA9IGFuY2hvci5zb3VyY2Uuc3Vic3RyaW5nKDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgLy8gQWxtb3N0IGNlcnRhaW5seSBoZXJlIGR1ZSB0byBhIHN0YWNrIG92ZXJmbG93XG4gICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICAgICAgICAgICAgICBvbkVycm9yKHRva2VuLCAnUkVTT1VSQ0VfRVhIQVVTVElPTicsIG1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB0b2tlbi50eXBlID09PSAnZXJyb3InXG4gICAgICAgICAgICAgICAgPyB0b2tlbi5tZXNzYWdlXG4gICAgICAgICAgICAgICAgOiBgVW5zdXBwb3J0ZWQgdG9rZW4gKHR5cGU6ICR7dG9rZW4udHlwZX0pYDtcbiAgICAgICAgICAgIG9uRXJyb3IodG9rZW4sICdVTkVYUEVDVEVEX1RPS0VOJywgbWVzc2FnZSk7XG4gICAgICAgICAgICBpc1NyY1Rva2VuID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbm9kZSA/PyAobm9kZSA9IGNvbXBvc2VFbXB0eU5vZGUoY3R4LCB0b2tlbi5vZmZzZXQsIHVuZGVmaW5lZCwgbnVsbCwgcHJvcHMsIG9uRXJyb3IpKTtcbiAgICBpZiAoYW5jaG9yICYmIG5vZGUuYW5jaG9yID09PSAnJylcbiAgICAgICAgb25FcnJvcihhbmNob3IsICdCQURfQUxJQVMnLCAnQW5jaG9yIGNhbm5vdCBiZSBhbiBlbXB0eSBzdHJpbmcnKTtcbiAgICBpZiAoYXRLZXkgJiZcbiAgICAgICAgY3R4Lm9wdGlvbnMuc3RyaW5nS2V5cyAmJlxuICAgICAgICAoIWlzU2NhbGFyKG5vZGUpIHx8XG4gICAgICAgICAgICB0eXBlb2Ygbm9kZS52YWx1ZSAhPT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgIChub2RlLnRhZyAmJiBub2RlLnRhZyAhPT0gJ3RhZzp5YW1sLm9yZywyMDAyOnN0cicpKSkge1xuICAgICAgICBjb25zdCBtc2cgPSAnV2l0aCBzdHJpbmdLZXlzLCBhbGwga2V5cyBtdXN0IGJlIHN0cmluZ3MnO1xuICAgICAgICBvbkVycm9yKHRhZyA/PyB0b2tlbiwgJ05PTl9TVFJJTkdfS0VZJywgbXNnKTtcbiAgICB9XG4gICAgaWYgKHNwYWNlQmVmb3JlKVxuICAgICAgICBub2RlLnNwYWNlQmVmb3JlID0gdHJ1ZTtcbiAgICBpZiAoY29tbWVudCkge1xuICAgICAgICBpZiAodG9rZW4udHlwZSA9PT0gJ3NjYWxhcicgJiYgdG9rZW4uc291cmNlID09PSAnJylcbiAgICAgICAgICAgIG5vZGUuY29tbWVudCA9IGNvbW1lbnQ7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIG5vZGUuY29tbWVudEJlZm9yZSA9IGNvbW1lbnQ7XG4gICAgfVxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgVHlwZSBjaGVja2luZyBtaXNzZXMgbWVhbmluZyBvZiBpc1NyY1Rva2VuXG4gICAgaWYgKGN0eC5vcHRpb25zLmtlZXBTb3VyY2VUb2tlbnMgJiYgaXNTcmNUb2tlbilcbiAgICAgICAgbm9kZS5zcmNUb2tlbiA9IHRva2VuO1xuICAgIHJldHVybiBub2RlO1xufVxuZnVuY3Rpb24gY29tcG9zZUVtcHR5Tm9kZShjdHgsIG9mZnNldCwgYmVmb3JlLCBwb3MsIHsgc3BhY2VCZWZvcmUsIGNvbW1lbnQsIGFuY2hvciwgdGFnLCBlbmQgfSwgb25FcnJvcikge1xuICAgIGNvbnN0IHRva2VuID0ge1xuICAgICAgICB0eXBlOiAnc2NhbGFyJyxcbiAgICAgICAgb2Zmc2V0OiBlbXB0eVNjYWxhclBvc2l0aW9uKG9mZnNldCwgYmVmb3JlLCBwb3MpLFxuICAgICAgICBpbmRlbnQ6IC0xLFxuICAgICAgICBzb3VyY2U6ICcnXG4gICAgfTtcbiAgICBjb25zdCBub2RlID0gY29tcG9zZVNjYWxhcihjdHgsIHRva2VuLCB0YWcsIG9uRXJyb3IpO1xuICAgIGlmIChhbmNob3IpIHtcbiAgICAgICAgbm9kZS5hbmNob3IgPSBhbmNob3Iuc291cmNlLnN1YnN0cmluZygxKTtcbiAgICAgICAgaWYgKG5vZGUuYW5jaG9yID09PSAnJylcbiAgICAgICAgICAgIG9uRXJyb3IoYW5jaG9yLCAnQkFEX0FMSUFTJywgJ0FuY2hvciBjYW5ub3QgYmUgYW4gZW1wdHkgc3RyaW5nJyk7XG4gICAgfVxuICAgIGlmIChzcGFjZUJlZm9yZSlcbiAgICAgICAgbm9kZS5zcGFjZUJlZm9yZSA9IHRydWU7XG4gICAgaWYgKGNvbW1lbnQpIHtcbiAgICAgICAgbm9kZS5jb21tZW50ID0gY29tbWVudDtcbiAgICAgICAgbm9kZS5yYW5nZVsyXSA9IGVuZDtcbiAgICB9XG4gICAgcmV0dXJuIG5vZGU7XG59XG5mdW5jdGlvbiBjb21wb3NlQWxpYXMoeyBvcHRpb25zIH0sIHsgb2Zmc2V0LCBzb3VyY2UsIGVuZCB9LCBvbkVycm9yKSB7XG4gICAgY29uc3QgYWxpYXMgPSBuZXcgQWxpYXMoc291cmNlLnN1YnN0cmluZygxKSk7XG4gICAgaWYgKGFsaWFzLnNvdXJjZSA9PT0gJycpXG4gICAgICAgIG9uRXJyb3Iob2Zmc2V0LCAnQkFEX0FMSUFTJywgJ0FsaWFzIGNhbm5vdCBiZSBhbiBlbXB0eSBzdHJpbmcnKTtcbiAgICBpZiAoYWxpYXMuc291cmNlLmVuZHNXaXRoKCc6JykpXG4gICAgICAgIG9uRXJyb3Iob2Zmc2V0ICsgc291cmNlLmxlbmd0aCAtIDEsICdCQURfQUxJQVMnLCAnQWxpYXMgZW5kaW5nIGluIDogaXMgYW1iaWd1b3VzJywgdHJ1ZSk7XG4gICAgY29uc3QgdmFsdWVFbmQgPSBvZmZzZXQgKyBzb3VyY2UubGVuZ3RoO1xuICAgIGNvbnN0IHJlID0gcmVzb2x2ZUVuZChlbmQsIHZhbHVlRW5kLCBvcHRpb25zLnN0cmljdCwgb25FcnJvcik7XG4gICAgYWxpYXMucmFuZ2UgPSBbb2Zmc2V0LCB2YWx1ZUVuZCwgcmUub2Zmc2V0XTtcbiAgICBpZiAocmUuY29tbWVudClcbiAgICAgICAgYWxpYXMuY29tbWVudCA9IHJlLmNvbW1lbnQ7XG4gICAgcmV0dXJuIGFsaWFzO1xufVxuXG5leHBvcnQgeyBjb21wb3NlRW1wdHlOb2RlLCBjb21wb3NlTm9kZSB9O1xuIiwiaW1wb3J0IHsgRG9jdW1lbnQgfSBmcm9tICcuLi9kb2MvRG9jdW1lbnQuanMnO1xuaW1wb3J0IHsgY29tcG9zZU5vZGUsIGNvbXBvc2VFbXB0eU5vZGUgfSBmcm9tICcuL2NvbXBvc2Utbm9kZS5qcyc7XG5pbXBvcnQgeyByZXNvbHZlRW5kIH0gZnJvbSAnLi9yZXNvbHZlLWVuZC5qcyc7XG5pbXBvcnQgeyByZXNvbHZlUHJvcHMgfSBmcm9tICcuL3Jlc29sdmUtcHJvcHMuanMnO1xuXG5mdW5jdGlvbiBjb21wb3NlRG9jKG9wdGlvbnMsIGRpcmVjdGl2ZXMsIHsgb2Zmc2V0LCBzdGFydCwgdmFsdWUsIGVuZCB9LCBvbkVycm9yKSB7XG4gICAgY29uc3Qgb3B0cyA9IE9iamVjdC5hc3NpZ24oeyBfZGlyZWN0aXZlczogZGlyZWN0aXZlcyB9LCBvcHRpb25zKTtcbiAgICBjb25zdCBkb2MgPSBuZXcgRG9jdW1lbnQodW5kZWZpbmVkLCBvcHRzKTtcbiAgICBjb25zdCBjdHggPSB7XG4gICAgICAgIGF0S2V5OiBmYWxzZSxcbiAgICAgICAgYXRSb290OiB0cnVlLFxuICAgICAgICBkaXJlY3RpdmVzOiBkb2MuZGlyZWN0aXZlcyxcbiAgICAgICAgb3B0aW9uczogZG9jLm9wdGlvbnMsXG4gICAgICAgIHNjaGVtYTogZG9jLnNjaGVtYVxuICAgIH07XG4gICAgY29uc3QgcHJvcHMgPSByZXNvbHZlUHJvcHMoc3RhcnQsIHtcbiAgICAgICAgaW5kaWNhdG9yOiAnZG9jLXN0YXJ0JyxcbiAgICAgICAgbmV4dDogdmFsdWUgPz8gZW5kPy5bMF0sXG4gICAgICAgIG9mZnNldCxcbiAgICAgICAgb25FcnJvcixcbiAgICAgICAgcGFyZW50SW5kZW50OiAwLFxuICAgICAgICBzdGFydE9uTmV3bGluZTogdHJ1ZVxuICAgIH0pO1xuICAgIGlmIChwcm9wcy5mb3VuZCkge1xuICAgICAgICBkb2MuZGlyZWN0aXZlcy5kb2NTdGFydCA9IHRydWU7XG4gICAgICAgIGlmICh2YWx1ZSAmJlxuICAgICAgICAgICAgKHZhbHVlLnR5cGUgPT09ICdibG9jay1tYXAnIHx8IHZhbHVlLnR5cGUgPT09ICdibG9jay1zZXEnKSAmJlxuICAgICAgICAgICAgIXByb3BzLmhhc05ld2xpbmUpXG4gICAgICAgICAgICBvbkVycm9yKHByb3BzLmVuZCwgJ01JU1NJTkdfQ0hBUicsICdCbG9jayBjb2xsZWN0aW9uIGNhbm5vdCBzdGFydCBvbiBzYW1lIGxpbmUgd2l0aCBkaXJlY3RpdmVzLWVuZCBtYXJrZXInKTtcbiAgICB9XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBJZiBDb250ZW50cyBpcyBzZXQsIGxldCdzIHRydXN0IHRoZSB1c2VyXG4gICAgZG9jLmNvbnRlbnRzID0gdmFsdWVcbiAgICAgICAgPyBjb21wb3NlTm9kZShjdHgsIHZhbHVlLCBwcm9wcywgb25FcnJvcilcbiAgICAgICAgOiBjb21wb3NlRW1wdHlOb2RlKGN0eCwgcHJvcHMuZW5kLCBzdGFydCwgbnVsbCwgcHJvcHMsIG9uRXJyb3IpO1xuICAgIGNvbnN0IGNvbnRlbnRFbmQgPSBkb2MuY29udGVudHMucmFuZ2VbMl07XG4gICAgY29uc3QgcmUgPSByZXNvbHZlRW5kKGVuZCwgY29udGVudEVuZCwgZmFsc2UsIG9uRXJyb3IpO1xuICAgIGlmIChyZS5jb21tZW50KVxuICAgICAgICBkb2MuY29tbWVudCA9IHJlLmNvbW1lbnQ7XG4gICAgZG9jLnJhbmdlID0gW29mZnNldCwgY29udGVudEVuZCwgcmUub2Zmc2V0XTtcbiAgICByZXR1cm4gZG9jO1xufVxuXG5leHBvcnQgeyBjb21wb3NlRG9jIH07XG4iLCJpbXBvcnQgeyBEaXJlY3RpdmVzIH0gZnJvbSAnLi4vZG9jL2RpcmVjdGl2ZXMuanMnO1xuaW1wb3J0IHsgRG9jdW1lbnQgfSBmcm9tICcuLi9kb2MvRG9jdW1lbnQuanMnO1xuaW1wb3J0IHsgWUFNTFdhcm5pbmcsIFlBTUxQYXJzZUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzLmpzJztcbmltcG9ydCB7IGlzQ29sbGVjdGlvbiwgaXNQYWlyIH0gZnJvbSAnLi4vbm9kZXMvaWRlbnRpdHkuanMnO1xuaW1wb3J0IHsgY29tcG9zZURvYyB9IGZyb20gJy4vY29tcG9zZS1kb2MuanMnO1xuaW1wb3J0IHsgcmVzb2x2ZUVuZCB9IGZyb20gJy4vcmVzb2x2ZS1lbmQuanMnO1xuXG5mdW5jdGlvbiBnZXRFcnJvclBvcyhzcmMpIHtcbiAgICBpZiAodHlwZW9mIHNyYyA9PT0gJ251bWJlcicpXG4gICAgICAgIHJldHVybiBbc3JjLCBzcmMgKyAxXTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShzcmMpKVxuICAgICAgICByZXR1cm4gc3JjLmxlbmd0aCA9PT0gMiA/IHNyYyA6IFtzcmNbMF0sIHNyY1sxXV07XG4gICAgY29uc3QgeyBvZmZzZXQsIHNvdXJjZSB9ID0gc3JjO1xuICAgIHJldHVybiBbb2Zmc2V0LCBvZmZzZXQgKyAodHlwZW9mIHNvdXJjZSA9PT0gJ3N0cmluZycgPyBzb3VyY2UubGVuZ3RoIDogMSldO1xufVxuZnVuY3Rpb24gcGFyc2VQcmVsdWRlKHByZWx1ZGUpIHtcbiAgICBsZXQgY29tbWVudCA9ICcnO1xuICAgIGxldCBhdENvbW1lbnQgPSBmYWxzZTtcbiAgICBsZXQgYWZ0ZXJFbXB0eUxpbmUgPSBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByZWx1ZGUubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY29uc3Qgc291cmNlID0gcHJlbHVkZVtpXTtcbiAgICAgICAgc3dpdGNoIChzb3VyY2VbMF0pIHtcbiAgICAgICAgICAgIGNhc2UgJyMnOlxuICAgICAgICAgICAgICAgIGNvbW1lbnQgKz1cbiAgICAgICAgICAgICAgICAgICAgKGNvbW1lbnQgPT09ICcnID8gJycgOiBhZnRlckVtcHR5TGluZSA/ICdcXG5cXG4nIDogJ1xcbicpICtcbiAgICAgICAgICAgICAgICAgICAgICAgIChzb3VyY2Uuc3Vic3RyaW5nKDEpIHx8ICcgJyk7XG4gICAgICAgICAgICAgICAgYXRDb21tZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBhZnRlckVtcHR5TGluZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnJSc6XG4gICAgICAgICAgICAgICAgaWYgKHByZWx1ZGVbaSArIDFdPy5bMF0gIT09ICcjJylcbiAgICAgICAgICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICAgICAgICAgIGF0Q29tbWVudCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAvLyBUaGlzIG1heSBiZSB3cm9uZyBhZnRlciBkb2MtZW5kLCBidXQgaW4gdGhhdCBjYXNlIGl0IGRvZXNuJ3QgbWF0dGVyXG4gICAgICAgICAgICAgICAgaWYgKCFhdENvbW1lbnQpXG4gICAgICAgICAgICAgICAgICAgIGFmdGVyRW1wdHlMaW5lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBhdENvbW1lbnQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyBjb21tZW50LCBhZnRlckVtcHR5TGluZSB9O1xufVxuLyoqXG4gKiBDb21wb3NlIGEgc3RyZWFtIG9mIENTVCBub2RlcyBpbnRvIGEgc3RyZWFtIG9mIFlBTUwgRG9jdW1lbnRzLlxuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBDb21wb3NlciwgUGFyc2VyIH0gZnJvbSAneWFtbCdcbiAqXG4gKiBjb25zdCBzcmM6IHN0cmluZyA9IC4uLlxuICogY29uc3QgdG9rZW5zID0gbmV3IFBhcnNlcigpLnBhcnNlKHNyYylcbiAqIGNvbnN0IGRvY3MgPSBuZXcgQ29tcG9zZXIoKS5jb21wb3NlKHRva2VucylcbiAqIGBgYFxuICovXG5jbGFzcyBDb21wb3NlciB7XG4gICAgY29uc3RydWN0b3Iob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMuZG9jID0gbnVsbDtcbiAgICAgICAgdGhpcy5hdERpcmVjdGl2ZXMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5wcmVsdWRlID0gW107XG4gICAgICAgIHRoaXMuZXJyb3JzID0gW107XG4gICAgICAgIHRoaXMud2FybmluZ3MgPSBbXTtcbiAgICAgICAgdGhpcy5vbkVycm9yID0gKHNvdXJjZSwgY29kZSwgbWVzc2FnZSwgd2FybmluZykgPT4ge1xuICAgICAgICAgICAgY29uc3QgcG9zID0gZ2V0RXJyb3JQb3Moc291cmNlKTtcbiAgICAgICAgICAgIGlmICh3YXJuaW5nKVxuICAgICAgICAgICAgICAgIHRoaXMud2FybmluZ3MucHVzaChuZXcgWUFNTFdhcm5pbmcocG9zLCBjb2RlLCBtZXNzYWdlKSk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdGhpcy5lcnJvcnMucHVzaChuZXcgWUFNTFBhcnNlRXJyb3IocG9zLCBjb2RlLCBtZXNzYWdlKSk7XG4gICAgICAgIH07XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLW51bGxpc2gtY29hbGVzY2luZ1xuICAgICAgICB0aGlzLmRpcmVjdGl2ZXMgPSBuZXcgRGlyZWN0aXZlcyh7IHZlcnNpb246IG9wdGlvbnMudmVyc2lvbiB8fCAnMS4yJyB9KTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB9XG4gICAgZGVjb3JhdGUoZG9jLCBhZnRlckRvYykge1xuICAgICAgICBjb25zdCB7IGNvbW1lbnQsIGFmdGVyRW1wdHlMaW5lIH0gPSBwYXJzZVByZWx1ZGUodGhpcy5wcmVsdWRlKTtcbiAgICAgICAgLy9jb25zb2xlLmxvZyh7IGRjOiBkb2MuY29tbWVudCwgcHJlbHVkZSwgY29tbWVudCB9KVxuICAgICAgICBpZiAoY29tbWVudCkge1xuICAgICAgICAgICAgY29uc3QgZGMgPSBkb2MuY29udGVudHM7XG4gICAgICAgICAgICBpZiAoYWZ0ZXJEb2MpIHtcbiAgICAgICAgICAgICAgICBkb2MuY29tbWVudCA9IGRvYy5jb21tZW50ID8gYCR7ZG9jLmNvbW1lbnR9XFxuJHtjb21tZW50fWAgOiBjb21tZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYWZ0ZXJFbXB0eUxpbmUgfHwgZG9jLmRpcmVjdGl2ZXMuZG9jU3RhcnQgfHwgIWRjKSB7XG4gICAgICAgICAgICAgICAgZG9jLmNvbW1lbnRCZWZvcmUgPSBjb21tZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXNDb2xsZWN0aW9uKGRjKSAmJiAhZGMuZmxvdyAmJiBkYy5pdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IGl0ID0gZGMuaXRlbXNbMF07XG4gICAgICAgICAgICAgICAgaWYgKGlzUGFpcihpdCkpXG4gICAgICAgICAgICAgICAgICAgIGl0ID0gaXQua2V5O1xuICAgICAgICAgICAgICAgIGNvbnN0IGNiID0gaXQuY29tbWVudEJlZm9yZTtcbiAgICAgICAgICAgICAgICBpdC5jb21tZW50QmVmb3JlID0gY2IgPyBgJHtjb21tZW50fVxcbiR7Y2J9YCA6IGNvbW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjYiA9IGRjLmNvbW1lbnRCZWZvcmU7XG4gICAgICAgICAgICAgICAgZGMuY29tbWVudEJlZm9yZSA9IGNiID8gYCR7Y29tbWVudH1cXG4ke2NifWAgOiBjb21tZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChhZnRlckRvYykge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmVycm9ycy5sZW5ndGg7ICsraSlcbiAgICAgICAgICAgICAgICBkb2MuZXJyb3JzLnB1c2godGhpcy5lcnJvcnNbaV0pO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLndhcm5pbmdzLmxlbmd0aDsgKytpKVxuICAgICAgICAgICAgICAgIGRvYy53YXJuaW5ncy5wdXNoKHRoaXMud2FybmluZ3NbaV0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZG9jLmVycm9ycyA9IHRoaXMuZXJyb3JzO1xuICAgICAgICAgICAgZG9jLndhcm5pbmdzID0gdGhpcy53YXJuaW5ncztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByZWx1ZGUgPSBbXTtcbiAgICAgICAgdGhpcy5lcnJvcnMgPSBbXTtcbiAgICAgICAgdGhpcy53YXJuaW5ncyA9IFtdO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDdXJyZW50IHN0cmVhbSBzdGF0dXMgaW5mb3JtYXRpb24uXG4gICAgICpcbiAgICAgKiBNb3N0bHkgdXNlZnVsIGF0IHRoZSBlbmQgb2YgaW5wdXQgZm9yIGFuIGVtcHR5IHN0cmVhbS5cbiAgICAgKi9cbiAgICBzdHJlYW1JbmZvKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29tbWVudDogcGFyc2VQcmVsdWRlKHRoaXMucHJlbHVkZSkuY29tbWVudCxcbiAgICAgICAgICAgIGRpcmVjdGl2ZXM6IHRoaXMuZGlyZWN0aXZlcyxcbiAgICAgICAgICAgIGVycm9yczogdGhpcy5lcnJvcnMsXG4gICAgICAgICAgICB3YXJuaW5nczogdGhpcy53YXJuaW5nc1xuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb21wb3NlIHRva2VucyBpbnRvIGRvY3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmb3JjZURvYyAtIElmIHRoZSBzdHJlYW0gY29udGFpbnMgbm8gZG9jdW1lbnQsIHN0aWxsIGVtaXQgYSBmaW5hbCBkb2N1bWVudCBpbmNsdWRpbmcgYW55IGNvbW1lbnRzIGFuZCBkaXJlY3RpdmVzIHRoYXQgd291bGQgYmUgYXBwbGllZCB0byBhIHN1YnNlcXVlbnQgZG9jdW1lbnQuXG4gICAgICogQHBhcmFtIGVuZE9mZnNldCAtIFNob3VsZCBiZSBzZXQgaWYgYGZvcmNlRG9jYCBpcyBhbHNvIHNldCwgdG8gc2V0IHRoZSBkb2N1bWVudCByYW5nZSBlbmQgYW5kIHRvIGluZGljYXRlIGVycm9ycyBjb3JyZWN0bHkuXG4gICAgICovXG4gICAgKmNvbXBvc2UodG9rZW5zLCBmb3JjZURvYyA9IGZhbHNlLCBlbmRPZmZzZXQgPSAtMSkge1xuICAgICAgICBmb3IgKGNvbnN0IHRva2VuIG9mIHRva2VucylcbiAgICAgICAgICAgIHlpZWxkKiB0aGlzLm5leHQodG9rZW4pO1xuICAgICAgICB5aWVsZCogdGhpcy5lbmQoZm9yY2VEb2MsIGVuZE9mZnNldCk7XG4gICAgfVxuICAgIC8qKiBBZHZhbmNlIHRoZSBjb21wb3NlciBieSBvbmUgQ1NUIHRva2VuLiAqL1xuICAgICpuZXh0KHRva2VuKSB7XG4gICAgICAgIHN3aXRjaCAodG9rZW4udHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnZGlyZWN0aXZlJzpcbiAgICAgICAgICAgICAgICB0aGlzLmRpcmVjdGl2ZXMuYWRkKHRva2VuLnNvdXJjZSwgKG9mZnNldCwgbWVzc2FnZSwgd2FybmluZykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwb3MgPSBnZXRFcnJvclBvcyh0b2tlbik7XG4gICAgICAgICAgICAgICAgICAgIHBvc1swXSArPSBvZmZzZXQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25FcnJvcihwb3MsICdCQURfRElSRUNUSVZFJywgbWVzc2FnZSwgd2FybmluZyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5wcmVsdWRlLnB1c2godG9rZW4uc291cmNlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmF0RGlyZWN0aXZlcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdkb2N1bWVudCc6IHtcbiAgICAgICAgICAgICAgICBjb25zdCBkb2MgPSBjb21wb3NlRG9jKHRoaXMub3B0aW9ucywgdGhpcy5kaXJlY3RpdmVzLCB0b2tlbiwgdGhpcy5vbkVycm9yKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hdERpcmVjdGl2ZXMgJiYgIWRvYy5kaXJlY3RpdmVzLmRvY1N0YXJ0KVxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uRXJyb3IodG9rZW4sICdNSVNTSU5HX0NIQVInLCAnTWlzc2luZyBkaXJlY3RpdmVzLWVuZC9kb2Mtc3RhcnQgaW5kaWNhdG9yIGxpbmUnKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRlY29yYXRlKGRvYywgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRvYylcbiAgICAgICAgICAgICAgICAgICAgeWllbGQgdGhpcy5kb2M7XG4gICAgICAgICAgICAgICAgdGhpcy5kb2MgPSBkb2M7XG4gICAgICAgICAgICAgICAgdGhpcy5hdERpcmVjdGl2ZXMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ2J5dGUtb3JkZXItbWFyayc6XG4gICAgICAgICAgICBjYXNlICdzcGFjZSc6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdjb21tZW50JzpcbiAgICAgICAgICAgIGNhc2UgJ25ld2xpbmUnOlxuICAgICAgICAgICAgICAgIHRoaXMucHJlbHVkZS5wdXNoKHRva2VuLnNvdXJjZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdlcnJvcic6IHtcbiAgICAgICAgICAgICAgICBjb25zdCBtc2cgPSB0b2tlbi5zb3VyY2VcbiAgICAgICAgICAgICAgICAgICAgPyBgJHt0b2tlbi5tZXNzYWdlfTogJHtKU09OLnN0cmluZ2lmeSh0b2tlbi5zb3VyY2UpfWBcbiAgICAgICAgICAgICAgICAgICAgOiB0b2tlbi5tZXNzYWdlO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IFlBTUxQYXJzZUVycm9yKGdldEVycm9yUG9zKHRva2VuKSwgJ1VORVhQRUNURURfVE9LRU4nLCBtc2cpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmF0RGlyZWN0aXZlcyB8fCAhdGhpcy5kb2MpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXJyb3JzLnB1c2goZXJyb3IpO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kb2MuZXJyb3JzLnB1c2goZXJyb3IpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnZG9jLWVuZCc6IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZG9jKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1zZyA9ICdVbmV4cGVjdGVkIGRvYy1lbmQgd2l0aG91dCBwcmVjZWRpbmcgZG9jdW1lbnQnO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVycm9ycy5wdXNoKG5ldyBZQU1MUGFyc2VFcnJvcihnZXRFcnJvclBvcyh0b2tlbiksICdVTkVYUEVDVEVEX1RPS0VOJywgbXNnKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmRvYy5kaXJlY3RpdmVzLmRvY0VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgY29uc3QgZW5kID0gcmVzb2x2ZUVuZCh0b2tlbi5lbmQsIHRva2VuLm9mZnNldCArIHRva2VuLnNvdXJjZS5sZW5ndGgsIHRoaXMuZG9jLm9wdGlvbnMuc3RyaWN0LCB0aGlzLm9uRXJyb3IpO1xuICAgICAgICAgICAgICAgIHRoaXMuZGVjb3JhdGUodGhpcy5kb2MsIHRydWUpO1xuICAgICAgICAgICAgICAgIGlmIChlbmQuY29tbWVudCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkYyA9IHRoaXMuZG9jLmNvbW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZG9jLmNvbW1lbnQgPSBkYyA/IGAke2RjfVxcbiR7ZW5kLmNvbW1lbnR9YCA6IGVuZC5jb21tZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmRvYy5yYW5nZVsyXSA9IGVuZC5vZmZzZXQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRoaXMuZXJyb3JzLnB1c2gobmV3IFlBTUxQYXJzZUVycm9yKGdldEVycm9yUG9zKHRva2VuKSwgJ1VORVhQRUNURURfVE9LRU4nLCBgVW5zdXBwb3J0ZWQgdG9rZW4gJHt0b2tlbi50eXBlfWApKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsIGF0IGVuZCBvZiBpbnB1dCB0byB5aWVsZCBhbnkgcmVtYWluaW5nIGRvY3VtZW50LlxuICAgICAqXG4gICAgICogQHBhcmFtIGZvcmNlRG9jIC0gSWYgdGhlIHN0cmVhbSBjb250YWlucyBubyBkb2N1bWVudCwgc3RpbGwgZW1pdCBhIGZpbmFsIGRvY3VtZW50IGluY2x1ZGluZyBhbnkgY29tbWVudHMgYW5kIGRpcmVjdGl2ZXMgdGhhdCB3b3VsZCBiZSBhcHBsaWVkIHRvIGEgc3Vic2VxdWVudCBkb2N1bWVudC5cbiAgICAgKiBAcGFyYW0gZW5kT2Zmc2V0IC0gU2hvdWxkIGJlIHNldCBpZiBgZm9yY2VEb2NgIGlzIGFsc28gc2V0LCB0byBzZXQgdGhlIGRvY3VtZW50IHJhbmdlIGVuZCBhbmQgdG8gaW5kaWNhdGUgZXJyb3JzIGNvcnJlY3RseS5cbiAgICAgKi9cbiAgICAqZW5kKGZvcmNlRG9jID0gZmFsc2UsIGVuZE9mZnNldCA9IC0xKSB7XG4gICAgICAgIGlmICh0aGlzLmRvYykge1xuICAgICAgICAgICAgdGhpcy5kZWNvcmF0ZSh0aGlzLmRvYywgdHJ1ZSk7XG4gICAgICAgICAgICB5aWVsZCB0aGlzLmRvYztcbiAgICAgICAgICAgIHRoaXMuZG9jID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChmb3JjZURvYykge1xuICAgICAgICAgICAgY29uc3Qgb3B0cyA9IE9iamVjdC5hc3NpZ24oeyBfZGlyZWN0aXZlczogdGhpcy5kaXJlY3RpdmVzIH0sIHRoaXMub3B0aW9ucyk7XG4gICAgICAgICAgICBjb25zdCBkb2MgPSBuZXcgRG9jdW1lbnQodW5kZWZpbmVkLCBvcHRzKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmF0RGlyZWN0aXZlcylcbiAgICAgICAgICAgICAgICB0aGlzLm9uRXJyb3IoZW5kT2Zmc2V0LCAnTUlTU0lOR19DSEFSJywgJ01pc3NpbmcgZGlyZWN0aXZlcy1lbmQgaW5kaWNhdG9yIGxpbmUnKTtcbiAgICAgICAgICAgIGRvYy5yYW5nZSA9IFswLCBlbmRPZmZzZXQsIGVuZE9mZnNldF07XG4gICAgICAgICAgICB0aGlzLmRlY29yYXRlKGRvYywgZmFsc2UpO1xuICAgICAgICAgICAgeWllbGQgZG9jO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgeyBDb21wb3NlciB9O1xuIiwiaW1wb3J0IHsgcmVzb2x2ZUJsb2NrU2NhbGFyIH0gZnJvbSAnLi4vY29tcG9zZS9yZXNvbHZlLWJsb2NrLXNjYWxhci5qcyc7XG5pbXBvcnQgeyByZXNvbHZlRmxvd1NjYWxhciB9IGZyb20gJy4uL2NvbXBvc2UvcmVzb2x2ZS1mbG93LXNjYWxhci5qcyc7XG5pbXBvcnQgeyBZQU1MUGFyc2VFcnJvciB9IGZyb20gJy4uL2Vycm9ycy5qcyc7XG5pbXBvcnQgeyBzdHJpbmdpZnlTdHJpbmcgfSBmcm9tICcuLi9zdHJpbmdpZnkvc3RyaW5naWZ5U3RyaW5nLmpzJztcblxuZnVuY3Rpb24gcmVzb2x2ZUFzU2NhbGFyKHRva2VuLCBzdHJpY3QgPSB0cnVlLCBvbkVycm9yKSB7XG4gICAgaWYgKHRva2VuKSB7XG4gICAgICAgIGNvbnN0IF9vbkVycm9yID0gKHBvcywgY29kZSwgbWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdHlwZW9mIHBvcyA9PT0gJ251bWJlcicgPyBwb3MgOiBBcnJheS5pc0FycmF5KHBvcykgPyBwb3NbMF0gOiBwb3Mub2Zmc2V0O1xuICAgICAgICAgICAgaWYgKG9uRXJyb3IpXG4gICAgICAgICAgICAgICAgb25FcnJvcihvZmZzZXQsIGNvZGUsIG1lc3NhZ2UpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBZQU1MUGFyc2VFcnJvcihbb2Zmc2V0LCBvZmZzZXQgKyAxXSwgY29kZSwgbWVzc2FnZSk7XG4gICAgICAgIH07XG4gICAgICAgIHN3aXRjaCAodG9rZW4udHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnc2NhbGFyJzpcbiAgICAgICAgICAgIGNhc2UgJ3NpbmdsZS1xdW90ZWQtc2NhbGFyJzpcbiAgICAgICAgICAgIGNhc2UgJ2RvdWJsZS1xdW90ZWQtc2NhbGFyJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZUZsb3dTY2FsYXIodG9rZW4sIHN0cmljdCwgX29uRXJyb3IpO1xuICAgICAgICAgICAgY2FzZSAnYmxvY2stc2NhbGFyJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZUJsb2NrU2NhbGFyKHsgb3B0aW9uczogeyBzdHJpY3QgfSB9LCB0b2tlbiwgX29uRXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuLyoqXG4gKiBDcmVhdGUgYSBuZXcgc2NhbGFyIHRva2VuIHdpdGggYHZhbHVlYFxuICpcbiAqIFZhbHVlcyB0aGF0IHJlcHJlc2VudCBhbiBhY3R1YWwgc3RyaW5nIGJ1dCBtYXkgYmUgcGFyc2VkIGFzIGEgZGlmZmVyZW50IHR5cGUgc2hvdWxkIHVzZSBhIGB0eXBlYCBvdGhlciB0aGFuIGAnUExBSU4nYCxcbiAqIGFzIHRoaXMgZnVuY3Rpb24gZG9lcyBub3Qgc3VwcG9ydCBhbnkgc2NoZW1hIG9wZXJhdGlvbnMgYW5kIHdvbid0IGNoZWNrIGZvciBzdWNoIGNvbmZsaWN0cy5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdmFsdWUsIHdoaWNoIHdpbGwgaGF2ZSBpdHMgY29udGVudCBwcm9wZXJseSBpbmRlbnRlZC5cbiAqIEBwYXJhbSBjb250ZXh0LmVuZCBDb21tZW50cyBhbmQgd2hpdGVzcGFjZSBhZnRlciB0aGUgZW5kIG9mIHRoZSB2YWx1ZSwgb3IgYWZ0ZXIgdGhlIGJsb2NrIHNjYWxhciBoZWFkZXIuIElmIHVuZGVmaW5lZCwgYSBuZXdsaW5lIHdpbGwgYmUgYWRkZWQuXG4gKiBAcGFyYW0gY29udGV4dC5pbXBsaWNpdEtleSBCZWluZyB3aXRoaW4gYW4gaW1wbGljaXQga2V5IG1heSBhZmZlY3QgdGhlIHJlc29sdmVkIHR5cGUgb2YgdGhlIHRva2VuJ3MgdmFsdWUuXG4gKiBAcGFyYW0gY29udGV4dC5pbmRlbnQgVGhlIGluZGVudCBsZXZlbCBvZiB0aGUgdG9rZW4uXG4gKiBAcGFyYW0gY29udGV4dC5pbkZsb3cgSXMgdGhpcyBzY2FsYXIgd2l0aGluIGEgZmxvdyBjb2xsZWN0aW9uPyBUaGlzIG1heSBhZmZlY3QgdGhlIHJlc29sdmVkIHR5cGUgb2YgdGhlIHRva2VuJ3MgdmFsdWUuXG4gKiBAcGFyYW0gY29udGV4dC5vZmZzZXQgVGhlIG9mZnNldCBwb3NpdGlvbiBvZiB0aGUgdG9rZW4uXG4gKiBAcGFyYW0gY29udGV4dC50eXBlIFRoZSBwcmVmZXJyZWQgdHlwZSBvZiB0aGUgc2NhbGFyIHRva2VuLiBJZiB1bmRlZmluZWQsIHRoZSBwcmV2aW91cyB0eXBlIG9mIHRoZSBgdG9rZW5gIHdpbGwgYmUgdXNlZCwgZGVmYXVsdGluZyB0byBgJ1BMQUlOJ2AuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVNjYWxhclRva2VuKHZhbHVlLCBjb250ZXh0KSB7XG4gICAgY29uc3QgeyBpbXBsaWNpdEtleSA9IGZhbHNlLCBpbmRlbnQsIGluRmxvdyA9IGZhbHNlLCBvZmZzZXQgPSAtMSwgdHlwZSA9ICdQTEFJTicgfSA9IGNvbnRleHQ7XG4gICAgY29uc3Qgc291cmNlID0gc3RyaW5naWZ5U3RyaW5nKHsgdHlwZSwgdmFsdWUgfSwge1xuICAgICAgICBpbXBsaWNpdEtleSxcbiAgICAgICAgaW5kZW50OiBpbmRlbnQgPiAwID8gJyAnLnJlcGVhdChpbmRlbnQpIDogJycsXG4gICAgICAgIGluRmxvdyxcbiAgICAgICAgb3B0aW9uczogeyBibG9ja1F1b3RlOiB0cnVlLCBsaW5lV2lkdGg6IC0xIH1cbiAgICB9KTtcbiAgICBjb25zdCBlbmQgPSBjb250ZXh0LmVuZCA/PyBbXG4gICAgICAgIHsgdHlwZTogJ25ld2xpbmUnLCBvZmZzZXQ6IC0xLCBpbmRlbnQsIHNvdXJjZTogJ1xcbicgfVxuICAgIF07XG4gICAgc3dpdGNoIChzb3VyY2VbMF0pIHtcbiAgICAgICAgY2FzZSAnfCc6XG4gICAgICAgIGNhc2UgJz4nOiB7XG4gICAgICAgICAgICBjb25zdCBoZSA9IHNvdXJjZS5pbmRleE9mKCdcXG4nKTtcbiAgICAgICAgICAgIGNvbnN0IGhlYWQgPSBzb3VyY2Uuc3Vic3RyaW5nKDAsIGhlKTtcbiAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBzb3VyY2Uuc3Vic3RyaW5nKGhlICsgMSkgKyAnXFxuJztcbiAgICAgICAgICAgIGNvbnN0IHByb3BzID0gW1xuICAgICAgICAgICAgICAgIHsgdHlwZTogJ2Jsb2NrLXNjYWxhci1oZWFkZXInLCBvZmZzZXQsIGluZGVudCwgc291cmNlOiBoZWFkIH1cbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBpZiAoIWFkZEVuZHRvQmxvY2tQcm9wcyhwcm9wcywgZW5kKSlcbiAgICAgICAgICAgICAgICBwcm9wcy5wdXNoKHsgdHlwZTogJ25ld2xpbmUnLCBvZmZzZXQ6IC0xLCBpbmRlbnQsIHNvdXJjZTogJ1xcbicgfSk7XG4gICAgICAgICAgICByZXR1cm4geyB0eXBlOiAnYmxvY2stc2NhbGFyJywgb2Zmc2V0LCBpbmRlbnQsIHByb3BzLCBzb3VyY2U6IGJvZHkgfTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdcIic6XG4gICAgICAgICAgICByZXR1cm4geyB0eXBlOiAnZG91YmxlLXF1b3RlZC1zY2FsYXInLCBvZmZzZXQsIGluZGVudCwgc291cmNlLCBlbmQgfTtcbiAgICAgICAgY2FzZSBcIidcIjpcbiAgICAgICAgICAgIHJldHVybiB7IHR5cGU6ICdzaW5nbGUtcXVvdGVkLXNjYWxhcicsIG9mZnNldCwgaW5kZW50LCBzb3VyY2UsIGVuZCB9O1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIHsgdHlwZTogJ3NjYWxhcicsIG9mZnNldCwgaW5kZW50LCBzb3VyY2UsIGVuZCB9O1xuICAgIH1cbn1cbi8qKlxuICogU2V0IHRoZSB2YWx1ZSBvZiBgdG9rZW5gIHRvIHRoZSBnaXZlbiBzdHJpbmcgYHZhbHVlYCwgb3ZlcndyaXRpbmcgYW55IHByZXZpb3VzIGNvbnRlbnRzIGFuZCB0eXBlIHRoYXQgaXQgbWF5IGhhdmUuXG4gKlxuICogQmVzdCBlZmZvcnRzIGFyZSBtYWRlIHRvIHJldGFpbiBhbnkgY29tbWVudHMgcHJldmlvdXNseSBhc3NvY2lhdGVkIHdpdGggdGhlIGB0b2tlbmAsXG4gKiB0aG91Z2ggYWxsIGNvbnRlbnRzIHdpdGhpbiBhIGNvbGxlY3Rpb24ncyBgaXRlbXNgIHdpbGwgYmUgb3ZlcndyaXR0ZW4uXG4gKlxuICogVmFsdWVzIHRoYXQgcmVwcmVzZW50IGFuIGFjdHVhbCBzdHJpbmcgYnV0IG1heSBiZSBwYXJzZWQgYXMgYSBkaWZmZXJlbnQgdHlwZSBzaG91bGQgdXNlIGEgYHR5cGVgIG90aGVyIHRoYW4gYCdQTEFJTidgLFxuICogYXMgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBzdXBwb3J0IGFueSBzY2hlbWEgb3BlcmF0aW9ucyBhbmQgd29uJ3QgY2hlY2sgZm9yIHN1Y2ggY29uZmxpY3RzLlxuICpcbiAqIEBwYXJhbSB0b2tlbiBBbnkgdG9rZW4uIElmIGl0IGRvZXMgbm90IGluY2x1ZGUgYW4gYGluZGVudGAgdmFsdWUsIHRoZSB2YWx1ZSB3aWxsIGJlIHN0cmluZ2lmaWVkIGFzIGlmIGl0IHdlcmUgYW4gaW1wbGljaXQga2V5LlxuICogQHBhcmFtIHZhbHVlIFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZhbHVlLCB3aGljaCB3aWxsIGhhdmUgaXRzIGNvbnRlbnQgcHJvcGVybHkgaW5kZW50ZWQuXG4gKiBAcGFyYW0gY29udGV4dC5hZnRlcktleSBJbiBtb3N0IGNhc2VzLCB2YWx1ZXMgYWZ0ZXIgYSBrZXkgc2hvdWxkIGhhdmUgYW4gYWRkaXRpb25hbCBsZXZlbCBvZiBpbmRlbnRhdGlvbi5cbiAqIEBwYXJhbSBjb250ZXh0LmltcGxpY2l0S2V5IEJlaW5nIHdpdGhpbiBhbiBpbXBsaWNpdCBrZXkgbWF5IGFmZmVjdCB0aGUgcmVzb2x2ZWQgdHlwZSBvZiB0aGUgdG9rZW4ncyB2YWx1ZS5cbiAqIEBwYXJhbSBjb250ZXh0LmluRmxvdyBCZWluZyB3aXRoaW4gYSBmbG93IGNvbGxlY3Rpb24gbWF5IGFmZmVjdCB0aGUgcmVzb2x2ZWQgdHlwZSBvZiB0aGUgdG9rZW4ncyB2YWx1ZS5cbiAqIEBwYXJhbSBjb250ZXh0LnR5cGUgVGhlIHByZWZlcnJlZCB0eXBlIG9mIHRoZSBzY2FsYXIgdG9rZW4uIElmIHVuZGVmaW5lZCwgdGhlIHByZXZpb3VzIHR5cGUgb2YgdGhlIGB0b2tlbmAgd2lsbCBiZSB1c2VkLCBkZWZhdWx0aW5nIHRvIGAnUExBSU4nYC5cbiAqL1xuZnVuY3Rpb24gc2V0U2NhbGFyVmFsdWUodG9rZW4sIHZhbHVlLCBjb250ZXh0ID0ge30pIHtcbiAgICBsZXQgeyBhZnRlcktleSA9IGZhbHNlLCBpbXBsaWNpdEtleSA9IGZhbHNlLCBpbkZsb3cgPSBmYWxzZSwgdHlwZSB9ID0gY29udGV4dDtcbiAgICBsZXQgaW5kZW50ID0gJ2luZGVudCcgaW4gdG9rZW4gPyB0b2tlbi5pbmRlbnQgOiBudWxsO1xuICAgIGlmIChhZnRlcktleSAmJiB0eXBlb2YgaW5kZW50ID09PSAnbnVtYmVyJylcbiAgICAgICAgaW5kZW50ICs9IDI7XG4gICAgaWYgKCF0eXBlKVxuICAgICAgICBzd2l0Y2ggKHRva2VuLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ3NpbmdsZS1xdW90ZWQtc2NhbGFyJzpcbiAgICAgICAgICAgICAgICB0eXBlID0gJ1FVT1RFX1NJTkdMRSc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdkb3VibGUtcXVvdGVkLXNjYWxhcic6XG4gICAgICAgICAgICAgICAgdHlwZSA9ICdRVU9URV9ET1VCTEUnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnYmxvY2stc2NhbGFyJzoge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhlYWRlciA9IHRva2VuLnByb3BzWzBdO1xuICAgICAgICAgICAgICAgIGlmIChoZWFkZXIudHlwZSAhPT0gJ2Jsb2NrLXNjYWxhci1oZWFkZXInKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYmxvY2sgc2NhbGFyIGhlYWRlcicpO1xuICAgICAgICAgICAgICAgIHR5cGUgPSBoZWFkZXIuc291cmNlWzBdID09PSAnPicgPyAnQkxPQ0tfRk9MREVEJyA6ICdCTE9DS19MSVRFUkFMJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdHlwZSA9ICdQTEFJTic7XG4gICAgICAgIH1cbiAgICBjb25zdCBzb3VyY2UgPSBzdHJpbmdpZnlTdHJpbmcoeyB0eXBlLCB2YWx1ZSB9LCB7XG4gICAgICAgIGltcGxpY2l0S2V5OiBpbXBsaWNpdEtleSB8fCBpbmRlbnQgPT09IG51bGwsXG4gICAgICAgIGluZGVudDogaW5kZW50ICE9PSBudWxsICYmIGluZGVudCA+IDAgPyAnICcucmVwZWF0KGluZGVudCkgOiAnJyxcbiAgICAgICAgaW5GbG93LFxuICAgICAgICBvcHRpb25zOiB7IGJsb2NrUXVvdGU6IHRydWUsIGxpbmVXaWR0aDogLTEgfVxuICAgIH0pO1xuICAgIHN3aXRjaCAoc291cmNlWzBdKSB7XG4gICAgICAgIGNhc2UgJ3wnOlxuICAgICAgICBjYXNlICc+JzpcbiAgICAgICAgICAgIHNldEJsb2NrU2NhbGFyVmFsdWUodG9rZW4sIHNvdXJjZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnXCInOlxuICAgICAgICAgICAgc2V0Rmxvd1NjYWxhclZhbHVlKHRva2VuLCBzb3VyY2UsICdkb3VibGUtcXVvdGVkLXNjYWxhcicpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCInXCI6XG4gICAgICAgICAgICBzZXRGbG93U2NhbGFyVmFsdWUodG9rZW4sIHNvdXJjZSwgJ3NpbmdsZS1xdW90ZWQtc2NhbGFyJyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHNldEZsb3dTY2FsYXJWYWx1ZSh0b2tlbiwgc291cmNlLCAnc2NhbGFyJyk7XG4gICAgfVxufVxuZnVuY3Rpb24gc2V0QmxvY2tTY2FsYXJWYWx1ZSh0b2tlbiwgc291cmNlKSB7XG4gICAgY29uc3QgaGUgPSBzb3VyY2UuaW5kZXhPZignXFxuJyk7XG4gICAgY29uc3QgaGVhZCA9IHNvdXJjZS5zdWJzdHJpbmcoMCwgaGUpO1xuICAgIGNvbnN0IGJvZHkgPSBzb3VyY2Uuc3Vic3RyaW5nKGhlICsgMSkgKyAnXFxuJztcbiAgICBpZiAodG9rZW4udHlwZSA9PT0gJ2Jsb2NrLXNjYWxhcicpIHtcbiAgICAgICAgY29uc3QgaGVhZGVyID0gdG9rZW4ucHJvcHNbMF07XG4gICAgICAgIGlmIChoZWFkZXIudHlwZSAhPT0gJ2Jsb2NrLXNjYWxhci1oZWFkZXInKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGJsb2NrIHNjYWxhciBoZWFkZXInKTtcbiAgICAgICAgaGVhZGVyLnNvdXJjZSA9IGhlYWQ7XG4gICAgICAgIHRva2VuLnNvdXJjZSA9IGJvZHk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCB7IG9mZnNldCB9ID0gdG9rZW47XG4gICAgICAgIGNvbnN0IGluZGVudCA9ICdpbmRlbnQnIGluIHRva2VuID8gdG9rZW4uaW5kZW50IDogLTE7XG4gICAgICAgIGNvbnN0IHByb3BzID0gW1xuICAgICAgICAgICAgeyB0eXBlOiAnYmxvY2stc2NhbGFyLWhlYWRlcicsIG9mZnNldCwgaW5kZW50LCBzb3VyY2U6IGhlYWQgfVxuICAgICAgICBdO1xuICAgICAgICBpZiAoIWFkZEVuZHRvQmxvY2tQcm9wcyhwcm9wcywgJ2VuZCcgaW4gdG9rZW4gPyB0b2tlbi5lbmQgOiB1bmRlZmluZWQpKVxuICAgICAgICAgICAgcHJvcHMucHVzaCh7IHR5cGU6ICduZXdsaW5lJywgb2Zmc2V0OiAtMSwgaW5kZW50LCBzb3VyY2U6ICdcXG4nIH0pO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh0b2tlbikpXG4gICAgICAgICAgICBpZiAoa2V5ICE9PSAndHlwZScgJiYga2V5ICE9PSAnb2Zmc2V0JylcbiAgICAgICAgICAgICAgICBkZWxldGUgdG9rZW5ba2V5XTtcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0b2tlbiwgeyB0eXBlOiAnYmxvY2stc2NhbGFyJywgaW5kZW50LCBwcm9wcywgc291cmNlOiBib2R5IH0pO1xuICAgIH1cbn1cbi8qKiBAcmV0dXJucyBgdHJ1ZWAgaWYgbGFzdCB0b2tlbiBpcyBhIG5ld2xpbmUgKi9cbmZ1bmN0aW9uIGFkZEVuZHRvQmxvY2tQcm9wcyhwcm9wcywgZW5kKSB7XG4gICAgaWYgKGVuZClcbiAgICAgICAgZm9yIChjb25zdCBzdCBvZiBlbmQpXG4gICAgICAgICAgICBzd2l0Y2ggKHN0LnR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdzcGFjZSc6XG4gICAgICAgICAgICAgICAgY2FzZSAnY29tbWVudCc6XG4gICAgICAgICAgICAgICAgICAgIHByb3BzLnB1c2goc3QpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICduZXdsaW5lJzpcbiAgICAgICAgICAgICAgICAgICAgcHJvcHMucHVzaChzdCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIHNldEZsb3dTY2FsYXJWYWx1ZSh0b2tlbiwgc291cmNlLCB0eXBlKSB7XG4gICAgc3dpdGNoICh0b2tlbi50eXBlKSB7XG4gICAgICAgIGNhc2UgJ3NjYWxhcic6XG4gICAgICAgIGNhc2UgJ2RvdWJsZS1xdW90ZWQtc2NhbGFyJzpcbiAgICAgICAgY2FzZSAnc2luZ2xlLXF1b3RlZC1zY2FsYXInOlxuICAgICAgICAgICAgdG9rZW4udHlwZSA9IHR5cGU7XG4gICAgICAgICAgICB0b2tlbi5zb3VyY2UgPSBzb3VyY2U7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnYmxvY2stc2NhbGFyJzoge1xuICAgICAgICAgICAgY29uc3QgZW5kID0gdG9rZW4ucHJvcHMuc2xpY2UoMSk7XG4gICAgICAgICAgICBsZXQgb2EgPSBzb3VyY2UubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKHRva2VuLnByb3BzWzBdLnR5cGUgPT09ICdibG9jay1zY2FsYXItaGVhZGVyJylcbiAgICAgICAgICAgICAgICBvYSAtPSB0b2tlbi5wcm9wc1swXS5zb3VyY2UubGVuZ3RoO1xuICAgICAgICAgICAgZm9yIChjb25zdCB0b2sgb2YgZW5kKVxuICAgICAgICAgICAgICAgIHRvay5vZmZzZXQgKz0gb2E7XG4gICAgICAgICAgICBkZWxldGUgdG9rZW4ucHJvcHM7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHRva2VuLCB7IHR5cGUsIHNvdXJjZSwgZW5kIH0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnYmxvY2stbWFwJzpcbiAgICAgICAgY2FzZSAnYmxvY2stc2VxJzoge1xuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdG9rZW4ub2Zmc2V0ICsgc291cmNlLmxlbmd0aDtcbiAgICAgICAgICAgIGNvbnN0IG5sID0geyB0eXBlOiAnbmV3bGluZScsIG9mZnNldCwgaW5kZW50OiB0b2tlbi5pbmRlbnQsIHNvdXJjZTogJ1xcbicgfTtcbiAgICAgICAgICAgIGRlbGV0ZSB0b2tlbi5pdGVtcztcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24odG9rZW4sIHsgdHlwZSwgc291cmNlLCBlbmQ6IFtubF0gfSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBjb25zdCBpbmRlbnQgPSAnaW5kZW50JyBpbiB0b2tlbiA/IHRva2VuLmluZGVudCA6IC0xO1xuICAgICAgICAgICAgY29uc3QgZW5kID0gJ2VuZCcgaW4gdG9rZW4gJiYgQXJyYXkuaXNBcnJheSh0b2tlbi5lbmQpXG4gICAgICAgICAgICAgICAgPyB0b2tlbi5lbmQuZmlsdGVyKHN0ID0+IHN0LnR5cGUgPT09ICdzcGFjZScgfHxcbiAgICAgICAgICAgICAgICAgICAgc3QudHlwZSA9PT0gJ2NvbW1lbnQnIHx8XG4gICAgICAgICAgICAgICAgICAgIHN0LnR5cGUgPT09ICduZXdsaW5lJylcbiAgICAgICAgICAgICAgICA6IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModG9rZW4pKVxuICAgICAgICAgICAgICAgIGlmIChrZXkgIT09ICd0eXBlJyAmJiBrZXkgIT09ICdvZmZzZXQnKVxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgdG9rZW5ba2V5XTtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24odG9rZW4sIHsgdHlwZSwgaW5kZW50LCBzb3VyY2UsIGVuZCB9KTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IHsgY3JlYXRlU2NhbGFyVG9rZW4sIHJlc29sdmVBc1NjYWxhciwgc2V0U2NhbGFyVmFsdWUgfTtcbiIsIi8qKlxuICogU3RyaW5naWZ5IGEgQ1NUIGRvY3VtZW50LCB0b2tlbiwgb3IgY29sbGVjdGlvbiBpdGVtXG4gKlxuICogRmFpciB3YXJuaW5nOiBUaGlzIGFwcGxpZXMgbm8gdmFsaWRhdGlvbiB3aGF0c29ldmVyLCBhbmRcbiAqIHNpbXBseSBjb25jYXRlbmF0ZXMgdGhlIHNvdXJjZXMgaW4gdGhlaXIgbG9naWNhbCBvcmRlci5cbiAqL1xuY29uc3Qgc3RyaW5naWZ5ID0gKGNzdCkgPT4gJ3R5cGUnIGluIGNzdCA/IHN0cmluZ2lmeVRva2VuKGNzdCkgOiBzdHJpbmdpZnlJdGVtKGNzdCk7XG5mdW5jdGlvbiBzdHJpbmdpZnlUb2tlbih0b2tlbikge1xuICAgIHN3aXRjaCAodG9rZW4udHlwZSkge1xuICAgICAgICBjYXNlICdibG9jay1zY2FsYXInOiB7XG4gICAgICAgICAgICBsZXQgcmVzID0gJyc7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHRvayBvZiB0b2tlbi5wcm9wcylcbiAgICAgICAgICAgICAgICByZXMgKz0gc3RyaW5naWZ5VG9rZW4odG9rKTtcbiAgICAgICAgICAgIHJldHVybiByZXMgKyB0b2tlbi5zb3VyY2U7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnYmxvY2stbWFwJzpcbiAgICAgICAgY2FzZSAnYmxvY2stc2VxJzoge1xuICAgICAgICAgICAgbGV0IHJlcyA9ICcnO1xuICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHRva2VuLml0ZW1zKVxuICAgICAgICAgICAgICAgIHJlcyArPSBzdHJpbmdpZnlJdGVtKGl0ZW0pO1xuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdmbG93LWNvbGxlY3Rpb24nOiB7XG4gICAgICAgICAgICBsZXQgcmVzID0gdG9rZW4uc3RhcnQuc291cmNlO1xuICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHRva2VuLml0ZW1zKVxuICAgICAgICAgICAgICAgIHJlcyArPSBzdHJpbmdpZnlJdGVtKGl0ZW0pO1xuICAgICAgICAgICAgZm9yIChjb25zdCBzdCBvZiB0b2tlbi5lbmQpXG4gICAgICAgICAgICAgICAgcmVzICs9IHN0LnNvdXJjZTtcbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZG9jdW1lbnQnOiB7XG4gICAgICAgICAgICBsZXQgcmVzID0gc3RyaW5naWZ5SXRlbSh0b2tlbik7XG4gICAgICAgICAgICBpZiAodG9rZW4uZW5kKVxuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc3Qgb2YgdG9rZW4uZW5kKVxuICAgICAgICAgICAgICAgICAgICByZXMgKz0gc3Quc291cmNlO1xuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBsZXQgcmVzID0gdG9rZW4uc291cmNlO1xuICAgICAgICAgICAgaWYgKCdlbmQnIGluIHRva2VuICYmIHRva2VuLmVuZClcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHN0IG9mIHRva2VuLmVuZClcbiAgICAgICAgICAgICAgICAgICAgcmVzICs9IHN0LnNvdXJjZTtcbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBzdHJpbmdpZnlJdGVtKHsgc3RhcnQsIGtleSwgc2VwLCB2YWx1ZSB9KSB7XG4gICAgbGV0IHJlcyA9ICcnO1xuICAgIGZvciAoY29uc3Qgc3Qgb2Ygc3RhcnQpXG4gICAgICAgIHJlcyArPSBzdC5zb3VyY2U7XG4gICAgaWYgKGtleSlcbiAgICAgICAgcmVzICs9IHN0cmluZ2lmeVRva2VuKGtleSk7XG4gICAgaWYgKHNlcClcbiAgICAgICAgZm9yIChjb25zdCBzdCBvZiBzZXApXG4gICAgICAgICAgICByZXMgKz0gc3Quc291cmNlO1xuICAgIGlmICh2YWx1ZSlcbiAgICAgICAgcmVzICs9IHN0cmluZ2lmeVRva2VuKHZhbHVlKTtcbiAgICByZXR1cm4gcmVzO1xufVxuXG5leHBvcnQgeyBzdHJpbmdpZnkgfTtcbiIsImNvbnN0IEJSRUFLID0gU3ltYm9sKCdicmVhayB2aXNpdCcpO1xuY29uc3QgU0tJUCA9IFN5bWJvbCgnc2tpcCBjaGlsZHJlbicpO1xuY29uc3QgUkVNT1ZFID0gU3ltYm9sKCdyZW1vdmUgaXRlbScpO1xuLyoqXG4gKiBBcHBseSBhIHZpc2l0b3IgdG8gYSBDU1QgZG9jdW1lbnQgb3IgaXRlbS5cbiAqXG4gKiBXYWxrcyB0aHJvdWdoIHRoZSB0cmVlIChkZXB0aC1maXJzdCkgc3RhcnRpbmcgZnJvbSB0aGUgcm9vdCwgY2FsbGluZyBhXG4gKiBgdmlzaXRvcmAgZnVuY3Rpb24gd2l0aCB0d28gYXJndW1lbnRzIHdoZW4gZW50ZXJpbmcgZWFjaCBpdGVtOlxuICogICAtIGBpdGVtYDogVGhlIGN1cnJlbnQgaXRlbSwgd2hpY2ggaW5jbHVkZWQgdGhlIGZvbGxvd2luZyBtZW1iZXJzOlxuICogICAgIC0gYHN0YXJ0OiBTb3VyY2VUb2tlbltdYCDigJMgU291cmNlIHRva2VucyBiZWZvcmUgdGhlIGtleSBvciB2YWx1ZSxcbiAqICAgICAgIHBvc3NpYmx5IGluY2x1ZGluZyBpdHMgYW5jaG9yIG9yIHRhZy5cbiAqICAgICAtIGBrZXk/OiBUb2tlbiB8IG51bGxgIOKAkyBTZXQgZm9yIHBhaXIgdmFsdWVzLiBNYXkgdGhlbiBiZSBgbnVsbGAsIGlmXG4gKiAgICAgICB0aGUga2V5IGJlZm9yZSB0aGUgYDpgIHNlcGFyYXRvciBpcyBlbXB0eS5cbiAqICAgICAtIGBzZXA/OiBTb3VyY2VUb2tlbltdYCDigJMgU291cmNlIHRva2VucyBiZXR3ZWVuIHRoZSBrZXkgYW5kIHRoZSB2YWx1ZSxcbiAqICAgICAgIHdoaWNoIHNob3VsZCBpbmNsdWRlIHRoZSBgOmAgbWFwIHZhbHVlIGluZGljYXRvciBpZiBgdmFsdWVgIGlzIHNldC5cbiAqICAgICAtIGB2YWx1ZT86IFRva2VuYCDigJMgVGhlIHZhbHVlIG9mIGEgc2VxdWVuY2UgaXRlbSwgb3Igb2YgYSBtYXAgcGFpci5cbiAqICAgLSBgcGF0aGA6IFRoZSBzdGVwcyBmcm9tIHRoZSByb290IHRvIHRoZSBjdXJyZW50IG5vZGUsIGFzIGFuIGFycmF5IG9mXG4gKiAgICAgYFsna2V5JyB8ICd2YWx1ZScsIG51bWJlcl1gIHR1cGxlcy5cbiAqXG4gKiBUaGUgcmV0dXJuIHZhbHVlIG9mIHRoZSB2aXNpdG9yIG1heSBiZSB1c2VkIHRvIGNvbnRyb2wgdGhlIHRyYXZlcnNhbDpcbiAqICAgLSBgdW5kZWZpbmVkYCAoZGVmYXVsdCk6IERvIG5vdGhpbmcgYW5kIGNvbnRpbnVlXG4gKiAgIC0gYHZpc2l0LlNLSVBgOiBEbyBub3QgdmlzaXQgdGhlIGNoaWxkcmVuIG9mIHRoaXMgdG9rZW4sIGNvbnRpbnVlIHdpdGhcbiAqICAgICAgbmV4dCBzaWJsaW5nXG4gKiAgIC0gYHZpc2l0LkJSRUFLYDogVGVybWluYXRlIHRyYXZlcnNhbCBjb21wbGV0ZWx5XG4gKiAgIC0gYHZpc2l0LlJFTU9WRWA6IFJlbW92ZSB0aGUgY3VycmVudCBpdGVtLCB0aGVuIGNvbnRpbnVlIHdpdGggdGhlIG5leHQgb25lXG4gKiAgIC0gYG51bWJlcmA6IFNldCB0aGUgaW5kZXggb2YgdGhlIG5leHQgc3RlcC4gVGhpcyBpcyB1c2VmdWwgZXNwZWNpYWxseSBpZlxuICogICAgIHRoZSBpbmRleCBvZiB0aGUgY3VycmVudCB0b2tlbiBoYXMgY2hhbmdlZC5cbiAqICAgLSBgZnVuY3Rpb25gOiBEZWZpbmUgdGhlIG5leHQgdmlzaXRvciBmb3IgdGhpcyBpdGVtLiBBZnRlciB0aGUgb3JpZ2luYWxcbiAqICAgICB2aXNpdG9yIGlzIGNhbGxlZCBvbiBpdGVtIGVudHJ5LCBuZXh0IHZpc2l0b3JzIGFyZSBjYWxsZWQgYWZ0ZXIgaGFuZGxpbmdcbiAqICAgICBhIG5vbi1lbXB0eSBga2V5YCBhbmQgd2hlbiBleGl0aW5nIHRoZSBpdGVtLlxuICovXG5mdW5jdGlvbiB2aXNpdChjc3QsIHZpc2l0b3IpIHtcbiAgICBpZiAoJ3R5cGUnIGluIGNzdCAmJiBjc3QudHlwZSA9PT0gJ2RvY3VtZW50JylcbiAgICAgICAgY3N0ID0geyBzdGFydDogY3N0LnN0YXJ0LCB2YWx1ZTogY3N0LnZhbHVlIH07XG4gICAgX3Zpc2l0KE9iamVjdC5mcmVlemUoW10pLCBjc3QsIHZpc2l0b3IpO1xufVxuLy8gV2l0aG91dCB0aGUgYGFzIHN5bWJvbGAgY2FzdHMsIFRTIGRlY2xhcmVzIHRoZXNlIGluIHRoZSBgdmlzaXRgXG4vLyBuYW1lc3BhY2UgdXNpbmcgYHZhcmAsIGJ1dCB0aGVuIGNvbXBsYWlucyBhYm91dCB0aGF0IGJlY2F1c2Vcbi8vIGB1bmlxdWUgc3ltYm9sYCBtdXN0IGJlIGBjb25zdGAuXG4vKiogVGVybWluYXRlIHZpc2l0IHRyYXZlcnNhbCBjb21wbGV0ZWx5ICovXG52aXNpdC5CUkVBSyA9IEJSRUFLO1xuLyoqIERvIG5vdCB2aXNpdCB0aGUgY2hpbGRyZW4gb2YgdGhlIGN1cnJlbnQgaXRlbSAqL1xudmlzaXQuU0tJUCA9IFNLSVA7XG4vKiogUmVtb3ZlIHRoZSBjdXJyZW50IGl0ZW0gKi9cbnZpc2l0LlJFTU9WRSA9IFJFTU9WRTtcbi8qKiBGaW5kIHRoZSBpdGVtIGF0IGBwYXRoYCBmcm9tIGBjc3RgIGFzIHRoZSByb290ICovXG52aXNpdC5pdGVtQXRQYXRoID0gKGNzdCwgcGF0aCkgPT4ge1xuICAgIGxldCBpdGVtID0gY3N0O1xuICAgIGZvciAoY29uc3QgW2ZpZWxkLCBpbmRleF0gb2YgcGF0aCkge1xuICAgICAgICBjb25zdCB0b2sgPSBpdGVtPy5bZmllbGRdO1xuICAgICAgICBpZiAodG9rICYmICdpdGVtcycgaW4gdG9rKSB7XG4gICAgICAgICAgICBpdGVtID0gdG9rLml0ZW1zW2luZGV4XTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gaXRlbTtcbn07XG4vKipcbiAqIEdldCB0aGUgaW1tZWRpYXRlIHBhcmVudCBjb2xsZWN0aW9uIG9mIHRoZSBpdGVtIGF0IGBwYXRoYCBmcm9tIGBjc3RgIGFzIHRoZSByb290LlxuICpcbiAqIFRocm93cyBhbiBlcnJvciBpZiB0aGUgY29sbGVjdGlvbiBpcyBub3QgZm91bmQsIHdoaWNoIHNob3VsZCBuZXZlciBoYXBwZW4gaWYgdGhlIGl0ZW0gaXRzZWxmIGV4aXN0cy5cbiAqL1xudmlzaXQucGFyZW50Q29sbGVjdGlvbiA9IChjc3QsIHBhdGgpID0+IHtcbiAgICBjb25zdCBwYXJlbnQgPSB2aXNpdC5pdGVtQXRQYXRoKGNzdCwgcGF0aC5zbGljZSgwLCAtMSkpO1xuICAgIGNvbnN0IGZpZWxkID0gcGF0aFtwYXRoLmxlbmd0aCAtIDFdWzBdO1xuICAgIGNvbnN0IGNvbGwgPSBwYXJlbnQ/LltmaWVsZF07XG4gICAgaWYgKGNvbGwgJiYgJ2l0ZW1zJyBpbiBjb2xsKVxuICAgICAgICByZXR1cm4gY29sbDtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhcmVudCBjb2xsZWN0aW9uIG5vdCBmb3VuZCcpO1xufTtcbmZ1bmN0aW9uIF92aXNpdChwYXRoLCBpdGVtLCB2aXNpdG9yKSB7XG4gICAgbGV0IGN0cmwgPSB2aXNpdG9yKGl0ZW0sIHBhdGgpO1xuICAgIGlmICh0eXBlb2YgY3RybCA9PT0gJ3N5bWJvbCcpXG4gICAgICAgIHJldHVybiBjdHJsO1xuICAgIGZvciAoY29uc3QgZmllbGQgb2YgWydrZXknLCAndmFsdWUnXSkge1xuICAgICAgICBjb25zdCB0b2tlbiA9IGl0ZW1bZmllbGRdO1xuICAgICAgICBpZiAodG9rZW4gJiYgJ2l0ZW1zJyBpbiB0b2tlbikge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b2tlbi5pdGVtcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNpID0gX3Zpc2l0KE9iamVjdC5mcmVlemUocGF0aC5jb25jYXQoW1tmaWVsZCwgaV1dKSksIHRva2VuLml0ZW1zW2ldLCB2aXNpdG9yKTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNpID09PSAnbnVtYmVyJylcbiAgICAgICAgICAgICAgICAgICAgaSA9IGNpIC0gMTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjaSA9PT0gQlJFQUspXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBCUkVBSztcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjaSA9PT0gUkVNT1ZFKSB7XG4gICAgICAgICAgICAgICAgICAgIHRva2VuLml0ZW1zLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgaSAtPSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgY3RybCA9PT0gJ2Z1bmN0aW9uJyAmJiBmaWVsZCA9PT0gJ2tleScpXG4gICAgICAgICAgICAgICAgY3RybCA9IGN0cmwoaXRlbSwgcGF0aCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHR5cGVvZiBjdHJsID09PSAnZnVuY3Rpb24nID8gY3RybChpdGVtLCBwYXRoKSA6IGN0cmw7XG59XG5cbmV4cG9ydCB7IHZpc2l0IH07XG4iLCJleHBvcnQgeyBjcmVhdGVTY2FsYXJUb2tlbiwgcmVzb2x2ZUFzU2NhbGFyLCBzZXRTY2FsYXJWYWx1ZSB9IGZyb20gJy4vY3N0LXNjYWxhci5qcyc7XG5leHBvcnQgeyBzdHJpbmdpZnkgfSBmcm9tICcuL2NzdC1zdHJpbmdpZnkuanMnO1xuZXhwb3J0IHsgdmlzaXQgfSBmcm9tICcuL2NzdC12aXNpdC5qcyc7XG5cbi8qKiBUaGUgYnl0ZSBvcmRlciBtYXJrICovXG5jb25zdCBCT00gPSAnXFx1e0ZFRkZ9Jztcbi8qKiBTdGFydCBvZiBkb2MtbW9kZSAqL1xuY29uc3QgRE9DVU1FTlQgPSAnXFx4MDInOyAvLyBDMDogU3RhcnQgb2YgVGV4dFxuLyoqIFVuZXhwZWN0ZWQgZW5kIG9mIGZsb3ctbW9kZSAqL1xuY29uc3QgRkxPV19FTkQgPSAnXFx4MTgnOyAvLyBDMDogQ2FuY2VsXG4vKiogTmV4dCB0b2tlbiBpcyBhIHNjYWxhciB2YWx1ZSAqL1xuY29uc3QgU0NBTEFSID0gJ1xceDFmJzsgLy8gQzA6IFVuaXQgU2VwYXJhdG9yXG4vKiogQHJldHVybnMgYHRydWVgIGlmIGB0b2tlbmAgaXMgYSBmbG93IG9yIGJsb2NrIGNvbGxlY3Rpb24gKi9cbmNvbnN0IGlzQ29sbGVjdGlvbiA9ICh0b2tlbikgPT4gISF0b2tlbiAmJiAnaXRlbXMnIGluIHRva2VuO1xuLyoqIEByZXR1cm5zIGB0cnVlYCBpZiBgdG9rZW5gIGlzIGEgZmxvdyBvciBibG9jayBzY2FsYXI7IG5vdCBhbiBhbGlhcyAqL1xuY29uc3QgaXNTY2FsYXIgPSAodG9rZW4pID0+ICEhdG9rZW4gJiZcbiAgICAodG9rZW4udHlwZSA9PT0gJ3NjYWxhcicgfHxcbiAgICAgICAgdG9rZW4udHlwZSA9PT0gJ3NpbmdsZS1xdW90ZWQtc2NhbGFyJyB8fFxuICAgICAgICB0b2tlbi50eXBlID09PSAnZG91YmxlLXF1b3RlZC1zY2FsYXInIHx8XG4gICAgICAgIHRva2VuLnR5cGUgPT09ICdibG9jay1zY2FsYXInKTtcbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4vKiogR2V0IGEgcHJpbnRhYmxlIHJlcHJlc2VudGF0aW9uIG9mIGEgbGV4ZXIgdG9rZW4gKi9cbmZ1bmN0aW9uIHByZXR0eVRva2VuKHRva2VuKSB7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgICBjYXNlIEJPTTpcbiAgICAgICAgICAgIHJldHVybiAnPEJPTT4nO1xuICAgICAgICBjYXNlIERPQ1VNRU5UOlxuICAgICAgICAgICAgcmV0dXJuICc8RE9DPic7XG4gICAgICAgIGNhc2UgRkxPV19FTkQ6XG4gICAgICAgICAgICByZXR1cm4gJzxGTE9XX0VORD4nO1xuICAgICAgICBjYXNlIFNDQUxBUjpcbiAgICAgICAgICAgIHJldHVybiAnPFNDQUxBUj4nO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRva2VuKTtcbiAgICB9XG59XG4vKiogSWRlbnRpZnkgdGhlIHR5cGUgb2YgYSBsZXhlciB0b2tlbi4gTWF5IHJldHVybiBgbnVsbGAgZm9yIHVua25vd24gdG9rZW5zLiAqL1xuZnVuY3Rpb24gdG9rZW5UeXBlKHNvdXJjZSkge1xuICAgIHN3aXRjaCAoc291cmNlKSB7XG4gICAgICAgIGNhc2UgQk9NOlxuICAgICAgICAgICAgcmV0dXJuICdieXRlLW9yZGVyLW1hcmsnO1xuICAgICAgICBjYXNlIERPQ1VNRU5UOlxuICAgICAgICAgICAgcmV0dXJuICdkb2MtbW9kZSc7XG4gICAgICAgIGNhc2UgRkxPV19FTkQ6XG4gICAgICAgICAgICByZXR1cm4gJ2Zsb3ctZXJyb3ItZW5kJztcbiAgICAgICAgY2FzZSBTQ0FMQVI6XG4gICAgICAgICAgICByZXR1cm4gJ3NjYWxhcic7XG4gICAgICAgIGNhc2UgJy0tLSc6XG4gICAgICAgICAgICByZXR1cm4gJ2RvYy1zdGFydCc7XG4gICAgICAgIGNhc2UgJy4uLic6XG4gICAgICAgICAgICByZXR1cm4gJ2RvYy1lbmQnO1xuICAgICAgICBjYXNlICcnOlxuICAgICAgICBjYXNlICdcXG4nOlxuICAgICAgICBjYXNlICdcXHJcXG4nOlxuICAgICAgICAgICAgcmV0dXJuICduZXdsaW5lJztcbiAgICAgICAgY2FzZSAnLSc6XG4gICAgICAgICAgICByZXR1cm4gJ3NlcS1pdGVtLWluZCc7XG4gICAgICAgIGNhc2UgJz8nOlxuICAgICAgICAgICAgcmV0dXJuICdleHBsaWNpdC1rZXktaW5kJztcbiAgICAgICAgY2FzZSAnOic6XG4gICAgICAgICAgICByZXR1cm4gJ21hcC12YWx1ZS1pbmQnO1xuICAgICAgICBjYXNlICd7JzpcbiAgICAgICAgICAgIHJldHVybiAnZmxvdy1tYXAtc3RhcnQnO1xuICAgICAgICBjYXNlICd9JzpcbiAgICAgICAgICAgIHJldHVybiAnZmxvdy1tYXAtZW5kJztcbiAgICAgICAgY2FzZSAnWyc6XG4gICAgICAgICAgICByZXR1cm4gJ2Zsb3ctc2VxLXN0YXJ0JztcbiAgICAgICAgY2FzZSAnXSc6XG4gICAgICAgICAgICByZXR1cm4gJ2Zsb3ctc2VxLWVuZCc7XG4gICAgICAgIGNhc2UgJywnOlxuICAgICAgICAgICAgcmV0dXJuICdjb21tYSc7XG4gICAgfVxuICAgIHN3aXRjaCAoc291cmNlWzBdKSB7XG4gICAgICAgIGNhc2UgJyAnOlxuICAgICAgICBjYXNlICdcXHQnOlxuICAgICAgICAgICAgcmV0dXJuICdzcGFjZSc7XG4gICAgICAgIGNhc2UgJyMnOlxuICAgICAgICAgICAgcmV0dXJuICdjb21tZW50JztcbiAgICAgICAgY2FzZSAnJSc6XG4gICAgICAgICAgICByZXR1cm4gJ2RpcmVjdGl2ZS1saW5lJztcbiAgICAgICAgY2FzZSAnKic6XG4gICAgICAgICAgICByZXR1cm4gJ2FsaWFzJztcbiAgICAgICAgY2FzZSAnJic6XG4gICAgICAgICAgICByZXR1cm4gJ2FuY2hvcic7XG4gICAgICAgIGNhc2UgJyEnOlxuICAgICAgICAgICAgcmV0dXJuICd0YWcnO1xuICAgICAgICBjYXNlIFwiJ1wiOlxuICAgICAgICAgICAgcmV0dXJuICdzaW5nbGUtcXVvdGVkLXNjYWxhcic7XG4gICAgICAgIGNhc2UgJ1wiJzpcbiAgICAgICAgICAgIHJldHVybiAnZG91YmxlLXF1b3RlZC1zY2FsYXInO1xuICAgICAgICBjYXNlICd8JzpcbiAgICAgICAgY2FzZSAnPic6XG4gICAgICAgICAgICByZXR1cm4gJ2Jsb2NrLXNjYWxhci1oZWFkZXInO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IHsgQk9NLCBET0NVTUVOVCwgRkxPV19FTkQsIFNDQUxBUiwgaXNDb2xsZWN0aW9uLCBpc1NjYWxhciwgcHJldHR5VG9rZW4sIHRva2VuVHlwZSB9O1xuIiwiaW1wb3J0IHsgQk9NLCBET0NVTUVOVCwgRkxPV19FTkQsIFNDQUxBUiB9IGZyb20gJy4vY3N0LmpzJztcblxuLypcblNUQVJUIC0+IHN0cmVhbVxuXG5zdHJlYW1cbiAgZGlyZWN0aXZlIC0+IGxpbmUtZW5kIC0+IHN0cmVhbVxuICBpbmRlbnQgKyBsaW5lLWVuZCAtPiBzdHJlYW1cbiAgW2Vsc2VdIC0+IGxpbmUtc3RhcnRcblxubGluZS1lbmRcbiAgY29tbWVudCAtPiBsaW5lLWVuZFxuICBuZXdsaW5lIC0+IC5cbiAgaW5wdXQtZW5kIC0+IEVORFxuXG5saW5lLXN0YXJ0XG4gIGRvYy1zdGFydCAtPiBkb2NcbiAgZG9jLWVuZCAtPiBzdHJlYW1cbiAgW2Vsc2VdIC0+IGluZGVudCAtPiBibG9jay1zdGFydFxuXG5ibG9jay1zdGFydFxuICBzZXEtaXRlbS1zdGFydCAtPiBibG9jay1zdGFydFxuICBleHBsaWNpdC1rZXktc3RhcnQgLT4gYmxvY2stc3RhcnRcbiAgbWFwLXZhbHVlLXN0YXJ0IC0+IGJsb2NrLXN0YXJ0XG4gIFtlbHNlXSAtPiBkb2NcblxuZG9jXG4gIGxpbmUtZW5kIC0+IGxpbmUtc3RhcnRcbiAgc3BhY2VzIC0+IGRvY1xuICBhbmNob3IgLT4gZG9jXG4gIHRhZyAtPiBkb2NcbiAgZmxvdy1zdGFydCAtPiBmbG93IC0+IGRvY1xuICBmbG93LWVuZCAtPiBlcnJvciAtPiBkb2NcbiAgc2VxLWl0ZW0tc3RhcnQgLT4gZXJyb3IgLT4gZG9jXG4gIGV4cGxpY2l0LWtleS1zdGFydCAtPiBlcnJvciAtPiBkb2NcbiAgbWFwLXZhbHVlLXN0YXJ0IC0+IGRvY1xuICBhbGlhcyAtPiBkb2NcbiAgcXVvdGUtc3RhcnQgLT4gcXVvdGVkLXNjYWxhciAtPiBkb2NcbiAgYmxvY2stc2NhbGFyLWhlYWRlciAtPiBsaW5lLWVuZCAtPiBibG9jay1zY2FsYXIobWluKSAtPiBsaW5lLXN0YXJ0XG4gIFtlbHNlXSAtPiBwbGFpbi1zY2FsYXIoZmFsc2UsIG1pbikgLT4gZG9jXG5cbmZsb3dcbiAgbGluZS1lbmQgLT4gZmxvd1xuICBzcGFjZXMgLT4gZmxvd1xuICBhbmNob3IgLT4gZmxvd1xuICB0YWcgLT4gZmxvd1xuICBmbG93LXN0YXJ0IC0+IGZsb3cgLT4gZmxvd1xuICBmbG93LWVuZCAtPiAuXG4gIHNlcS1pdGVtLXN0YXJ0IC0+IGVycm9yIC0+IGZsb3dcbiAgZXhwbGljaXQta2V5LXN0YXJ0IC0+IGZsb3dcbiAgbWFwLXZhbHVlLXN0YXJ0IC0+IGZsb3dcbiAgYWxpYXMgLT4gZmxvd1xuICBxdW90ZS1zdGFydCAtPiBxdW90ZWQtc2NhbGFyIC0+IGZsb3dcbiAgY29tbWEgLT4gZmxvd1xuICBbZWxzZV0gLT4gcGxhaW4tc2NhbGFyKHRydWUsIDApIC0+IGZsb3dcblxucXVvdGVkLXNjYWxhclxuICBxdW90ZS1lbmQgLT4gLlxuICBbZWxzZV0gLT4gcXVvdGVkLXNjYWxhclxuXG5ibG9jay1zY2FsYXIobWluKVxuICBuZXdsaW5lICsgcGVlayhpbmRlbnQgPCBtaW4pIC0+IC5cbiAgW2Vsc2VdIC0+IGJsb2NrLXNjYWxhcihtaW4pXG5cbnBsYWluLXNjYWxhcihpcy1mbG93LCBtaW4pXG4gIHNjYWxhci1lbmQoaXMtZmxvdykgLT4gLlxuICBwZWVrKG5ld2xpbmUgKyAoaW5kZW50IDwgbWluKSkgLT4gLlxuICBbZWxzZV0gLT4gcGxhaW4tc2NhbGFyKG1pbilcbiovXG5mdW5jdGlvbiBpc0VtcHR5KGNoKSB7XG4gICAgc3dpdGNoIChjaCkge1xuICAgICAgICBjYXNlIHVuZGVmaW5lZDpcbiAgICAgICAgY2FzZSAnICc6XG4gICAgICAgIGNhc2UgJ1xcbic6XG4gICAgICAgIGNhc2UgJ1xccic6XG4gICAgICAgIGNhc2UgJ1xcdCc6XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5jb25zdCBoZXhEaWdpdHMgPSBuZXcgU2V0KCcwMTIzNDU2Nzg5QUJDREVGYWJjZGVmJyk7XG5jb25zdCB0YWdDaGFycyA9IG5ldyBTZXQoXCIwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei0jOy8/OkAmPSskXy4hfionKClcIik7XG5jb25zdCBmbG93SW5kaWNhdG9yQ2hhcnMgPSBuZXcgU2V0KCcsW117fScpO1xuY29uc3QgaW52YWxpZEFuY2hvckNoYXJzID0gbmV3IFNldCgnICxbXXt9XFxuXFxyXFx0Jyk7XG5jb25zdCBpc05vdEFuY2hvckNoYXIgPSAoY2gpID0+ICFjaCB8fCBpbnZhbGlkQW5jaG9yQ2hhcnMuaGFzKGNoKTtcbi8qKlxuICogU3BsaXRzIGFuIGlucHV0IHN0cmluZyBpbnRvIGxleGljYWwgdG9rZW5zLCBpLmUuIHNtYWxsZXIgc3RyaW5ncyB0aGF0IGFyZVxuICogZWFzaWx5IGlkZW50aWZpYWJsZSBieSBgdG9rZW5zLnRva2VuVHlwZSgpYC5cbiAqXG4gKiBMZXhpbmcgc3RhcnRzIGFsd2F5cyBpbiBhIFwic3RyZWFtXCIgY29udGV4dC4gSW5jb21wbGV0ZSBpbnB1dCBtYXkgYmUgYnVmZmVyZWRcbiAqIHVudGlsIGEgY29tcGxldGUgdG9rZW4gY2FuIGJlIGVtaXR0ZWQuXG4gKlxuICogSW4gYWRkaXRpb24gdG8gc2xpY2VzIG9mIHRoZSBvcmlnaW5hbCBpbnB1dCwgdGhlIGZvbGxvd2luZyBjb250cm9sIGNoYXJhY3RlcnNcbiAqIG1heSBhbHNvIGJlIGVtaXR0ZWQ6XG4gKlxuICogLSBgXFx4MDJgIChTdGFydCBvZiBUZXh0KTogQSBkb2N1bWVudCBzdGFydHMgd2l0aCB0aGUgbmV4dCB0b2tlblxuICogLSBgXFx4MThgIChDYW5jZWwpOiBVbmV4cGVjdGVkIGVuZCBvZiBmbG93LW1vZGUgKGluZGljYXRlcyBhbiBlcnJvcilcbiAqIC0gYFxceDFmYCAoVW5pdCBTZXBhcmF0b3IpOiBOZXh0IHRva2VuIGlzIGEgc2NhbGFyIHZhbHVlXG4gKiAtIGBcXHV7RkVGRn1gIChCeXRlIG9yZGVyIG1hcmspOiBFbWl0dGVkIHNlcGFyYXRlbHkgb3V0c2lkZSBkb2N1bWVudHNcbiAqL1xuY2xhc3MgTGV4ZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBidWZmZXIgbWFya3MgdGhlIGVuZCBvZlxuICAgICAgICAgKiBhbGwgaW5wdXRcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYXRFbmQgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEV4cGxpY2l0IGluZGVudCBzZXQgaW4gYmxvY2sgc2NhbGFyIGhlYWRlciwgYXMgYW4gb2Zmc2V0IGZyb20gdGhlIGN1cnJlbnRcbiAgICAgICAgICogbWluaW11bSBpbmRlbnQsIHNvIGUuZy4gc2V0IHRvIDEgZnJvbSBhIGhlYWRlciBgfDIrYC4gU2V0IHRvIC0xIGlmIG5vdFxuICAgICAgICAgKiBleHBsaWNpdGx5IHNldC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYmxvY2tTY2FsYXJJbmRlbnQgPSAtMTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEJsb2NrIHNjYWxhcnMgdGhhdCBpbmNsdWRlIGEgKyAoa2VlcCkgY2hvbXBpbmcgaW5kaWNhdG9yIGluIHRoZWlyIGhlYWRlclxuICAgICAgICAgKiBpbmNsdWRlIHRyYWlsaW5nIGVtcHR5IGxpbmVzLCB3aGljaCBhcmUgb3RoZXJ3aXNlIGV4Y2x1ZGVkIGZyb20gdGhlXG4gICAgICAgICAqIHNjYWxhcidzIGNvbnRlbnRzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5ibG9ja1NjYWxhcktlZXAgPSBmYWxzZTtcbiAgICAgICAgLyoqIEN1cnJlbnQgaW5wdXQgKi9cbiAgICAgICAgdGhpcy5idWZmZXIgPSAnJztcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZsYWcgbm90aW5nIHdoZXRoZXIgdGhlIG1hcCB2YWx1ZSBpbmRpY2F0b3IgOiBjYW4gaW1tZWRpYXRlbHkgZm9sbG93IHRoaXNcbiAgICAgICAgICogbm9kZSB3aXRoaW4gYSBmbG93IGNvbnRleHQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmZsb3dLZXkgPSBmYWxzZTtcbiAgICAgICAgLyoqIENvdW50IG9mIHN1cnJvdW5kaW5nIGZsb3cgY29sbGVjdGlvbiBsZXZlbHMuICovXG4gICAgICAgIHRoaXMuZmxvd0xldmVsID0gMDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIE1pbmltdW0gbGV2ZWwgb2YgaW5kZW50YXRpb24gcmVxdWlyZWQgZm9yIG5leHQgbGluZXMgdG8gYmUgcGFyc2VkIGFzIGFcbiAgICAgICAgICogcGFydCBvZiB0aGUgY3VycmVudCBzY2FsYXIgdmFsdWUuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmluZGVudE5leHQgPSAwO1xuICAgICAgICAvKiogSW5kZW50YXRpb24gbGV2ZWwgb2YgdGhlIGN1cnJlbnQgbGluZS4gKi9cbiAgICAgICAgdGhpcy5pbmRlbnRWYWx1ZSA9IDA7XG4gICAgICAgIC8qKiBQb3NpdGlvbiBvZiB0aGUgbmV4dCBcXG4gY2hhcmFjdGVyLiAqL1xuICAgICAgICB0aGlzLmxpbmVFbmRQb3MgPSBudWxsO1xuICAgICAgICAvKiogU3RvcmVzIHRoZSBzdGF0ZSBvZiB0aGUgbGV4ZXIgaWYgcmVhY2hpbmcgdGhlIGVuZCBvZiBpbmNwb21wbGV0ZSBpbnB1dCAqL1xuICAgICAgICB0aGlzLm5leHQgPSBudWxsO1xuICAgICAgICAvKiogQSBwb2ludGVyIHRvIGBidWZmZXJgOyB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGUgbGV4ZXIuICovXG4gICAgICAgIHRoaXMucG9zID0gMDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2VuZXJhdGUgWUFNTCB0b2tlbnMgZnJvbSB0aGUgYHNvdXJjZWAgc3RyaW5nLiBJZiBgaW5jb21wbGV0ZWAsXG4gICAgICogYSBwYXJ0IG9mIHRoZSBsYXN0IGxpbmUgbWF5IGJlIGxlZnQgYXMgYSBidWZmZXIgZm9yIHRoZSBuZXh0IGNhbGwuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBIGdlbmVyYXRvciBvZiBsZXhpY2FsIHRva2Vuc1xuICAgICAqL1xuICAgICpsZXgoc291cmNlLCBpbmNvbXBsZXRlID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKHNvdXJjZSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBzb3VyY2UgIT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcignc291cmNlIGlzIG5vdCBhIHN0cmluZycpO1xuICAgICAgICAgICAgdGhpcy5idWZmZXIgPSB0aGlzLmJ1ZmZlciA/IHRoaXMuYnVmZmVyICsgc291cmNlIDogc291cmNlO1xuICAgICAgICAgICAgdGhpcy5saW5lRW5kUG9zID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmF0RW5kID0gIWluY29tcGxldGU7XG4gICAgICAgIGxldCBuZXh0ID0gdGhpcy5uZXh0ID8/ICdzdHJlYW0nO1xuICAgICAgICB3aGlsZSAobmV4dCAmJiAoaW5jb21wbGV0ZSB8fCB0aGlzLmhhc0NoYXJzKDEpKSlcbiAgICAgICAgICAgIG5leHQgPSB5aWVsZCogdGhpcy5wYXJzZU5leHQobmV4dCk7XG4gICAgfVxuICAgIGF0TGluZUVuZCgpIHtcbiAgICAgICAgbGV0IGkgPSB0aGlzLnBvcztcbiAgICAgICAgbGV0IGNoID0gdGhpcy5idWZmZXJbaV07XG4gICAgICAgIHdoaWxlIChjaCA9PT0gJyAnIHx8IGNoID09PSAnXFx0JylcbiAgICAgICAgICAgIGNoID0gdGhpcy5idWZmZXJbKytpXTtcbiAgICAgICAgaWYgKCFjaCB8fCBjaCA9PT0gJyMnIHx8IGNoID09PSAnXFxuJylcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAoY2ggPT09ICdcXHInKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyW2kgKyAxXSA9PT0gJ1xcbic7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY2hhckF0KG4pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyW3RoaXMucG9zICsgbl07XG4gICAgfVxuICAgIGNvbnRpbnVlU2NhbGFyKG9mZnNldCkge1xuICAgICAgICBsZXQgY2ggPSB0aGlzLmJ1ZmZlcltvZmZzZXRdO1xuICAgICAgICBpZiAodGhpcy5pbmRlbnROZXh0ID4gMCkge1xuICAgICAgICAgICAgbGV0IGluZGVudCA9IDA7XG4gICAgICAgICAgICB3aGlsZSAoY2ggPT09ICcgJylcbiAgICAgICAgICAgICAgICBjaCA9IHRoaXMuYnVmZmVyWysraW5kZW50ICsgb2Zmc2V0XTtcbiAgICAgICAgICAgIGlmIChjaCA9PT0gJ1xccicpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXh0ID0gdGhpcy5idWZmZXJbaW5kZW50ICsgb2Zmc2V0ICsgMV07XG4gICAgICAgICAgICAgICAgaWYgKG5leHQgPT09ICdcXG4nIHx8ICghbmV4dCAmJiAhdGhpcy5hdEVuZCkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvZmZzZXQgKyBpbmRlbnQgKyAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNoID09PSAnXFxuJyB8fCBpbmRlbnQgPj0gdGhpcy5pbmRlbnROZXh0IHx8ICghY2ggJiYgIXRoaXMuYXRFbmQpXG4gICAgICAgICAgICAgICAgPyBvZmZzZXQgKyBpbmRlbnRcbiAgICAgICAgICAgICAgICA6IC0xO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaCA9PT0gJy0nIHx8IGNoID09PSAnLicpIHtcbiAgICAgICAgICAgIGNvbnN0IGR0ID0gdGhpcy5idWZmZXIuc3Vic3RyKG9mZnNldCwgMyk7XG4gICAgICAgICAgICBpZiAoKGR0ID09PSAnLS0tJyB8fCBkdCA9PT0gJy4uLicpICYmIGlzRW1wdHkodGhpcy5idWZmZXJbb2Zmc2V0ICsgM10pKVxuICAgICAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2Zmc2V0O1xuICAgIH1cbiAgICBnZXRMaW5lKCkge1xuICAgICAgICBsZXQgZW5kID0gdGhpcy5saW5lRW5kUG9zO1xuICAgICAgICBpZiAodHlwZW9mIGVuZCAhPT0gJ251bWJlcicgfHwgKGVuZCAhPT0gLTEgJiYgZW5kIDwgdGhpcy5wb3MpKSB7XG4gICAgICAgICAgICBlbmQgPSB0aGlzLmJ1ZmZlci5pbmRleE9mKCdcXG4nLCB0aGlzLnBvcyk7XG4gICAgICAgICAgICB0aGlzLmxpbmVFbmRQb3MgPSBlbmQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVuZCA9PT0gLTEpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hdEVuZCA/IHRoaXMuYnVmZmVyLnN1YnN0cmluZyh0aGlzLnBvcykgOiBudWxsO1xuICAgICAgICBpZiAodGhpcy5idWZmZXJbZW5kIC0gMV0gPT09ICdcXHInKVxuICAgICAgICAgICAgZW5kIC09IDE7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1ZmZlci5zdWJzdHJpbmcodGhpcy5wb3MsIGVuZCk7XG4gICAgfVxuICAgIGhhc0NoYXJzKG4pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zICsgbiA8PSB0aGlzLmJ1ZmZlci5sZW5ndGg7XG4gICAgfVxuICAgIHNldE5leHQoc3RhdGUpIHtcbiAgICAgICAgdGhpcy5idWZmZXIgPSB0aGlzLmJ1ZmZlci5zdWJzdHJpbmcodGhpcy5wb3MpO1xuICAgICAgICB0aGlzLnBvcyA9IDA7XG4gICAgICAgIHRoaXMubGluZUVuZFBvcyA9IG51bGw7XG4gICAgICAgIHRoaXMubmV4dCA9IHN0YXRlO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcGVlayhuKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1ZmZlci5zdWJzdHIodGhpcy5wb3MsIG4pO1xuICAgIH1cbiAgICAqcGFyc2VOZXh0KG5leHQpIHtcbiAgICAgICAgc3dpdGNoIChuZXh0KSB7XG4gICAgICAgICAgICBjYXNlICdzdHJlYW0nOlxuICAgICAgICAgICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5wYXJzZVN0cmVhbSgpO1xuICAgICAgICAgICAgY2FzZSAnbGluZS1zdGFydCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiB0aGlzLnBhcnNlTGluZVN0YXJ0KCk7XG4gICAgICAgICAgICBjYXNlICdibG9jay1zdGFydCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiB0aGlzLnBhcnNlQmxvY2tTdGFydCgpO1xuICAgICAgICAgICAgY2FzZSAnZG9jJzpcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucGFyc2VEb2N1bWVudCgpO1xuICAgICAgICAgICAgY2FzZSAnZmxvdyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiB0aGlzLnBhcnNlRmxvd0NvbGxlY3Rpb24oKTtcbiAgICAgICAgICAgIGNhc2UgJ3F1b3RlZC1zY2FsYXInOlxuICAgICAgICAgICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5wYXJzZVF1b3RlZFNjYWxhcigpO1xuICAgICAgICAgICAgY2FzZSAnYmxvY2stc2NhbGFyJzpcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucGFyc2VCbG9ja1NjYWxhcigpO1xuICAgICAgICAgICAgY2FzZSAncGxhaW4tc2NhbGFyJzpcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucGFyc2VQbGFpblNjYWxhcigpO1xuICAgICAgICB9XG4gICAgfVxuICAgICpwYXJzZVN0cmVhbSgpIHtcbiAgICAgICAgbGV0IGxpbmUgPSB0aGlzLmdldExpbmUoKTtcbiAgICAgICAgaWYgKGxpbmUgPT09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZXROZXh0KCdzdHJlYW0nKTtcbiAgICAgICAgaWYgKGxpbmVbMF0gPT09IEJPTSkge1xuICAgICAgICAgICAgeWllbGQqIHRoaXMucHVzaENvdW50KDEpO1xuICAgICAgICAgICAgbGluZSA9IGxpbmUuc3Vic3RyaW5nKDEpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsaW5lWzBdID09PSAnJScpIHtcbiAgICAgICAgICAgIGxldCBkaXJFbmQgPSBsaW5lLmxlbmd0aDtcbiAgICAgICAgICAgIGxldCBjcyA9IGxpbmUuaW5kZXhPZignIycpO1xuICAgICAgICAgICAgd2hpbGUgKGNzICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoID0gbGluZVtjcyAtIDFdO1xuICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJyAnIHx8IGNoID09PSAnXFx0Jykge1xuICAgICAgICAgICAgICAgICAgICBkaXJFbmQgPSBjcyAtIDE7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY3MgPSBsaW5lLmluZGV4T2YoJyMnLCBjcyArIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2ggPSBsaW5lW2RpckVuZCAtIDFdO1xuICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJyAnIHx8IGNoID09PSAnXFx0JylcbiAgICAgICAgICAgICAgICAgICAgZGlyRW5kIC09IDE7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG4gPSAoeWllbGQqIHRoaXMucHVzaENvdW50KGRpckVuZCkpICsgKHlpZWxkKiB0aGlzLnB1c2hTcGFjZXModHJ1ZSkpO1xuICAgICAgICAgICAgeWllbGQqIHRoaXMucHVzaENvdW50KGxpbmUubGVuZ3RoIC0gbik7IC8vIHBvc3NpYmxlIGNvbW1lbnRcbiAgICAgICAgICAgIHRoaXMucHVzaE5ld2xpbmUoKTtcbiAgICAgICAgICAgIHJldHVybiAnc3RyZWFtJztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5hdExpbmVFbmQoKSkge1xuICAgICAgICAgICAgY29uc3Qgc3AgPSB5aWVsZCogdGhpcy5wdXNoU3BhY2VzKHRydWUpO1xuICAgICAgICAgICAgeWllbGQqIHRoaXMucHVzaENvdW50KGxpbmUubGVuZ3RoIC0gc3ApO1xuICAgICAgICAgICAgeWllbGQqIHRoaXMucHVzaE5ld2xpbmUoKTtcbiAgICAgICAgICAgIHJldHVybiAnc3RyZWFtJztcbiAgICAgICAgfVxuICAgICAgICB5aWVsZCBET0NVTUVOVDtcbiAgICAgICAgcmV0dXJuIHlpZWxkKiB0aGlzLnBhcnNlTGluZVN0YXJ0KCk7XG4gICAgfVxuICAgICpwYXJzZUxpbmVTdGFydCgpIHtcbiAgICAgICAgY29uc3QgY2ggPSB0aGlzLmNoYXJBdCgwKTtcbiAgICAgICAgaWYgKCFjaCAmJiAhdGhpcy5hdEVuZClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNldE5leHQoJ2xpbmUtc3RhcnQnKTtcbiAgICAgICAgaWYgKGNoID09PSAnLScgfHwgY2ggPT09ICcuJykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmF0RW5kICYmICF0aGlzLmhhc0NoYXJzKDQpKVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNldE5leHQoJ2xpbmUtc3RhcnQnKTtcbiAgICAgICAgICAgIGNvbnN0IHMgPSB0aGlzLnBlZWsoMyk7XG4gICAgICAgICAgICBpZiAoKHMgPT09ICctLS0nIHx8IHMgPT09ICcuLi4nKSAmJiBpc0VtcHR5KHRoaXMuY2hhckF0KDMpKSkge1xuICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnB1c2hDb3VudCgzKTtcbiAgICAgICAgICAgICAgICB0aGlzLmluZGVudFZhbHVlID0gMDtcbiAgICAgICAgICAgICAgICB0aGlzLmluZGVudE5leHQgPSAwO1xuICAgICAgICAgICAgICAgIHJldHVybiBzID09PSAnLS0tJyA/ICdkb2MnIDogJ3N0cmVhbSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbmRlbnRWYWx1ZSA9IHlpZWxkKiB0aGlzLnB1c2hTcGFjZXMoZmFsc2UpO1xuICAgICAgICBpZiAodGhpcy5pbmRlbnROZXh0ID4gdGhpcy5pbmRlbnRWYWx1ZSAmJiAhaXNFbXB0eSh0aGlzLmNoYXJBdCgxKSkpXG4gICAgICAgICAgICB0aGlzLmluZGVudE5leHQgPSB0aGlzLmluZGVudFZhbHVlO1xuICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucGFyc2VCbG9ja1N0YXJ0KCk7XG4gICAgfVxuICAgICpwYXJzZUJsb2NrU3RhcnQoKSB7XG4gICAgICAgIGNvbnN0IFtjaDAsIGNoMV0gPSB0aGlzLnBlZWsoMik7XG4gICAgICAgIGlmICghY2gxICYmICF0aGlzLmF0RW5kKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0TmV4dCgnYmxvY2stc3RhcnQnKTtcbiAgICAgICAgaWYgKChjaDAgPT09ICctJyB8fCBjaDAgPT09ICc/JyB8fCBjaDAgPT09ICc6JykgJiYgaXNFbXB0eShjaDEpKSB7XG4gICAgICAgICAgICBjb25zdCBuID0gKHlpZWxkKiB0aGlzLnB1c2hDb3VudCgxKSkgKyAoeWllbGQqIHRoaXMucHVzaFNwYWNlcyh0cnVlKSk7XG4gICAgICAgICAgICB0aGlzLmluZGVudE5leHQgPSB0aGlzLmluZGVudFZhbHVlICsgMTtcbiAgICAgICAgICAgIHRoaXMuaW5kZW50VmFsdWUgKz0gbjtcbiAgICAgICAgICAgIHJldHVybiAnYmxvY2stc3RhcnQnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnZG9jJztcbiAgICB9XG4gICAgKnBhcnNlRG9jdW1lbnQoKSB7XG4gICAgICAgIHlpZWxkKiB0aGlzLnB1c2hTcGFjZXModHJ1ZSk7XG4gICAgICAgIGNvbnN0IGxpbmUgPSB0aGlzLmdldExpbmUoKTtcbiAgICAgICAgaWYgKGxpbmUgPT09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZXROZXh0KCdkb2MnKTtcbiAgICAgICAgbGV0IG4gPSB5aWVsZCogdGhpcy5wdXNoSW5kaWNhdG9ycygpO1xuICAgICAgICBzd2l0Y2ggKGxpbmVbbl0pIHtcbiAgICAgICAgICAgIGNhc2UgJyMnOlxuICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnB1c2hDb3VudChsaW5lLmxlbmd0aCAtIG4pO1xuICAgICAgICAgICAgLy8gZmFsbHRocm91Z2hcbiAgICAgICAgICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnB1c2hOZXdsaW5lKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiB0aGlzLnBhcnNlTGluZVN0YXJ0KCk7XG4gICAgICAgICAgICBjYXNlICd7JzpcbiAgICAgICAgICAgIGNhc2UgJ1snOlxuICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnB1c2hDb3VudCgxKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZsb3dLZXkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmZsb3dMZXZlbCA9IDE7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdmbG93JztcbiAgICAgICAgICAgIGNhc2UgJ30nOlxuICAgICAgICAgICAgY2FzZSAnXSc6XG4gICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhbiBlcnJvclxuICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnB1c2hDb3VudCgxKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2RvYyc7XG4gICAgICAgICAgICBjYXNlICcqJzpcbiAgICAgICAgICAgICAgICB5aWVsZCogdGhpcy5wdXNoVW50aWwoaXNOb3RBbmNob3JDaGFyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2RvYyc7XG4gICAgICAgICAgICBjYXNlICdcIic6XG4gICAgICAgICAgICBjYXNlIFwiJ1wiOlxuICAgICAgICAgICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5wYXJzZVF1b3RlZFNjYWxhcigpO1xuICAgICAgICAgICAgY2FzZSAnfCc6XG4gICAgICAgICAgICBjYXNlICc+JzpcbiAgICAgICAgICAgICAgICBuICs9IHlpZWxkKiB0aGlzLnBhcnNlQmxvY2tTY2FsYXJIZWFkZXIoKTtcbiAgICAgICAgICAgICAgICBuICs9IHlpZWxkKiB0aGlzLnB1c2hTcGFjZXModHJ1ZSk7XG4gICAgICAgICAgICAgICAgeWllbGQqIHRoaXMucHVzaENvdW50KGxpbmUubGVuZ3RoIC0gbik7XG4gICAgICAgICAgICAgICAgeWllbGQqIHRoaXMucHVzaE5ld2xpbmUoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucGFyc2VCbG9ja1NjYWxhcigpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucGFyc2VQbGFpblNjYWxhcigpO1xuICAgICAgICB9XG4gICAgfVxuICAgICpwYXJzZUZsb3dDb2xsZWN0aW9uKCkge1xuICAgICAgICBsZXQgbmwsIHNwO1xuICAgICAgICBsZXQgaW5kZW50ID0gLTE7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIG5sID0geWllbGQqIHRoaXMucHVzaE5ld2xpbmUoKTtcbiAgICAgICAgICAgIGlmIChubCA+IDApIHtcbiAgICAgICAgICAgICAgICBzcCA9IHlpZWxkKiB0aGlzLnB1c2hTcGFjZXMoZmFsc2UpO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5kZW50VmFsdWUgPSBpbmRlbnQgPSBzcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHNwID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNwICs9IHlpZWxkKiB0aGlzLnB1c2hTcGFjZXModHJ1ZSk7XG4gICAgICAgIH0gd2hpbGUgKG5sICsgc3AgPiAwKTtcbiAgICAgICAgY29uc3QgbGluZSA9IHRoaXMuZ2V0TGluZSgpO1xuICAgICAgICBpZiAobGluZSA9PT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNldE5leHQoJ2Zsb3cnKTtcbiAgICAgICAgaWYgKChpbmRlbnQgIT09IC0xICYmIGluZGVudCA8IHRoaXMuaW5kZW50TmV4dCAmJiBsaW5lWzBdICE9PSAnIycpIHx8XG4gICAgICAgICAgICAoaW5kZW50ID09PSAwICYmXG4gICAgICAgICAgICAgICAgKGxpbmUuc3RhcnRzV2l0aCgnLS0tJykgfHwgbGluZS5zdGFydHNXaXRoKCcuLi4nKSkgJiZcbiAgICAgICAgICAgICAgICBpc0VtcHR5KGxpbmVbM10pKSkge1xuICAgICAgICAgICAgLy8gQWxsb3dpbmcgZm9yIHRoZSB0ZXJtaW5hbCBdIG9yIH0gYXQgdGhlIHNhbWUgKHJhdGhlciB0aGFuIGdyZWF0ZXIpXG4gICAgICAgICAgICAvLyBpbmRlbnQgbGV2ZWwgYXMgdGhlIGluaXRpYWwgWyBvciB7IGlzIHRlY2huaWNhbGx5IGludmFsaWQsIGJ1dFxuICAgICAgICAgICAgLy8gZmFpbGluZyBoZXJlIHdvdWxkIGJlIHN1cnByaXNpbmcgdG8gdXNlcnMuXG4gICAgICAgICAgICBjb25zdCBhdEZsb3dFbmRNYXJrZXIgPSBpbmRlbnQgPT09IHRoaXMuaW5kZW50TmV4dCAtIDEgJiZcbiAgICAgICAgICAgICAgICB0aGlzLmZsb3dMZXZlbCA9PT0gMSAmJlxuICAgICAgICAgICAgICAgIChsaW5lWzBdID09PSAnXScgfHwgbGluZVswXSA9PT0gJ30nKTtcbiAgICAgICAgICAgIGlmICghYXRGbG93RW5kTWFya2VyKSB7XG4gICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhbiBlcnJvclxuICAgICAgICAgICAgICAgIHRoaXMuZmxvd0xldmVsID0gMDtcbiAgICAgICAgICAgICAgICB5aWVsZCBGTE9XX0VORDtcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucGFyc2VMaW5lU3RhcnQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgbiA9IDA7XG4gICAgICAgIHdoaWxlIChsaW5lW25dID09PSAnLCcpIHtcbiAgICAgICAgICAgIG4gKz0geWllbGQqIHRoaXMucHVzaENvdW50KDEpO1xuICAgICAgICAgICAgbiArPSB5aWVsZCogdGhpcy5wdXNoU3BhY2VzKHRydWUpO1xuICAgICAgICAgICAgdGhpcy5mbG93S2V5ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgbiArPSB5aWVsZCogdGhpcy5wdXNoSW5kaWNhdG9ycygpO1xuICAgICAgICBzd2l0Y2ggKGxpbmVbbl0pIHtcbiAgICAgICAgICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgICAgICAgICAgIHJldHVybiAnZmxvdyc7XG4gICAgICAgICAgICBjYXNlICcjJzpcbiAgICAgICAgICAgICAgICB5aWVsZCogdGhpcy5wdXNoQ291bnQobGluZS5sZW5ndGggLSBuKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2Zsb3cnO1xuICAgICAgICAgICAgY2FzZSAneyc6XG4gICAgICAgICAgICBjYXNlICdbJzpcbiAgICAgICAgICAgICAgICB5aWVsZCogdGhpcy5wdXNoQ291bnQoMSk7XG4gICAgICAgICAgICAgICAgdGhpcy5mbG93S2V5ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5mbG93TGV2ZWwgKz0gMTtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2Zsb3cnO1xuICAgICAgICAgICAgY2FzZSAnfSc6XG4gICAgICAgICAgICBjYXNlICddJzpcbiAgICAgICAgICAgICAgICB5aWVsZCogdGhpcy5wdXNoQ291bnQoMSk7XG4gICAgICAgICAgICAgICAgdGhpcy5mbG93S2V5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmZsb3dMZXZlbCAtPSAxO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZsb3dMZXZlbCA/ICdmbG93JyA6ICdkb2MnO1xuICAgICAgICAgICAgY2FzZSAnKic6XG4gICAgICAgICAgICAgICAgeWllbGQqIHRoaXMucHVzaFVudGlsKGlzTm90QW5jaG9yQ2hhcik7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdmbG93JztcbiAgICAgICAgICAgIGNhc2UgJ1wiJzpcbiAgICAgICAgICAgIGNhc2UgXCInXCI6XG4gICAgICAgICAgICAgICAgdGhpcy5mbG93S2V5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucGFyc2VRdW90ZWRTY2FsYXIoKTtcbiAgICAgICAgICAgIGNhc2UgJzonOiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IHRoaXMuY2hhckF0KDEpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmZsb3dLZXkgfHwgaXNFbXB0eShuZXh0KSB8fCBuZXh0ID09PSAnLCcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mbG93S2V5ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnB1c2hDb3VudCgxKTtcbiAgICAgICAgICAgICAgICAgICAgeWllbGQqIHRoaXMucHVzaFNwYWNlcyh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdmbG93JztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBmYWxsdGhyb3VnaFxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aGlzLmZsb3dLZXkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucGFyc2VQbGFpblNjYWxhcigpO1xuICAgICAgICB9XG4gICAgfVxuICAgICpwYXJzZVF1b3RlZFNjYWxhcigpIHtcbiAgICAgICAgY29uc3QgcXVvdGUgPSB0aGlzLmNoYXJBdCgwKTtcbiAgICAgICAgbGV0IGVuZCA9IHRoaXMuYnVmZmVyLmluZGV4T2YocXVvdGUsIHRoaXMucG9zICsgMSk7XG4gICAgICAgIGlmIChxdW90ZSA9PT0gXCInXCIpIHtcbiAgICAgICAgICAgIHdoaWxlIChlbmQgIT09IC0xICYmIHRoaXMuYnVmZmVyW2VuZCArIDFdID09PSBcIidcIilcbiAgICAgICAgICAgICAgICBlbmQgPSB0aGlzLmJ1ZmZlci5pbmRleE9mKFwiJ1wiLCBlbmQgKyAyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIGRvdWJsZS1xdW90ZVxuICAgICAgICAgICAgd2hpbGUgKGVuZCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBsZXQgbiA9IDA7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHRoaXMuYnVmZmVyW2VuZCAtIDEgLSBuXSA9PT0gJ1xcXFwnKVxuICAgICAgICAgICAgICAgICAgICBuICs9IDE7XG4gICAgICAgICAgICAgICAgaWYgKG4gJSAyID09PSAwKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBlbmQgPSB0aGlzLmJ1ZmZlci5pbmRleE9mKCdcIicsIGVuZCArIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIE9ubHkgbG9va2luZyBmb3IgbmV3bGluZXMgd2l0aGluIHRoZSBxdW90ZXNcbiAgICAgICAgY29uc3QgcWIgPSB0aGlzLmJ1ZmZlci5zdWJzdHJpbmcoMCwgZW5kKTtcbiAgICAgICAgbGV0IG5sID0gcWIuaW5kZXhPZignXFxuJywgdGhpcy5wb3MpO1xuICAgICAgICBpZiAobmwgIT09IC0xKSB7XG4gICAgICAgICAgICB3aGlsZSAobmwgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY3MgPSB0aGlzLmNvbnRpbnVlU2NhbGFyKG5sICsgMSk7XG4gICAgICAgICAgICAgICAgaWYgKGNzID09PSAtMSlcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgbmwgPSBxYi5pbmRleE9mKCdcXG4nLCBjcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobmwgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhbiBlcnJvciBjYXVzZWQgYnkgYW4gdW5leHBlY3RlZCB1bmluZGVudFxuICAgICAgICAgICAgICAgIGVuZCA9IG5sIC0gKHFiW25sIC0gMV0gPT09ICdcXHInID8gMiA6IDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChlbmQgPT09IC0xKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuYXRFbmQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0TmV4dCgncXVvdGVkLXNjYWxhcicpO1xuICAgICAgICAgICAgZW5kID0gdGhpcy5idWZmZXIubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIHlpZWxkKiB0aGlzLnB1c2hUb0luZGV4KGVuZCArIDEsIGZhbHNlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmxvd0xldmVsID8gJ2Zsb3cnIDogJ2RvYyc7XG4gICAgfVxuICAgICpwYXJzZUJsb2NrU2NhbGFySGVhZGVyKCkge1xuICAgICAgICB0aGlzLmJsb2NrU2NhbGFySW5kZW50ID0gLTE7XG4gICAgICAgIHRoaXMuYmxvY2tTY2FsYXJLZWVwID0gZmFsc2U7XG4gICAgICAgIGxldCBpID0gdGhpcy5wb3M7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICBjb25zdCBjaCA9IHRoaXMuYnVmZmVyWysraV07XG4gICAgICAgICAgICBpZiAoY2ggPT09ICcrJylcbiAgICAgICAgICAgICAgICB0aGlzLmJsb2NrU2NhbGFyS2VlcCA9IHRydWU7XG4gICAgICAgICAgICBlbHNlIGlmIChjaCA+ICcwJyAmJiBjaCA8PSAnOScpXG4gICAgICAgICAgICAgICAgdGhpcy5ibG9ja1NjYWxhckluZGVudCA9IE51bWJlcihjaCkgLSAxO1xuICAgICAgICAgICAgZWxzZSBpZiAoY2ggIT09ICctJylcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucHVzaFVudGlsKGNoID0+IGlzRW1wdHkoY2gpIHx8IGNoID09PSAnIycpO1xuICAgIH1cbiAgICAqcGFyc2VCbG9ja1NjYWxhcigpIHtcbiAgICAgICAgbGV0IG5sID0gdGhpcy5wb3MgLSAxOyAvLyBtYXkgYmUgLTEgaWYgdGhpcy5wb3MgPT09IDBcbiAgICAgICAgbGV0IGluZGVudCA9IDA7XG4gICAgICAgIGxldCBjaDtcbiAgICAgICAgbG9vcDogZm9yIChsZXQgaSA9IHRoaXMucG9zOyAoY2ggPSB0aGlzLmJ1ZmZlcltpXSk7ICsraSkge1xuICAgICAgICAgICAgc3dpdGNoIChjaCkge1xuICAgICAgICAgICAgICAgIGNhc2UgJyAnOlxuICAgICAgICAgICAgICAgICAgICBpbmRlbnQgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnXFxuJzpcbiAgICAgICAgICAgICAgICAgICAgbmwgPSBpO1xuICAgICAgICAgICAgICAgICAgICBpbmRlbnQgPSAwO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdcXHInOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHQgPSB0aGlzLmJ1ZmZlcltpICsgMV07XG4gICAgICAgICAgICAgICAgICAgIGlmICghbmV4dCAmJiAhdGhpcy5hdEVuZClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNldE5leHQoJ2Jsb2NrLXNjYWxhcicpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobmV4dCA9PT0gJ1xcbicpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9IC8vIGZhbGx0aHJvdWdoXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgYnJlYWsgbG9vcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNoICYmICF0aGlzLmF0RW5kKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0TmV4dCgnYmxvY2stc2NhbGFyJyk7XG4gICAgICAgIGlmIChpbmRlbnQgPj0gdGhpcy5pbmRlbnROZXh0KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5ibG9ja1NjYWxhckluZGVudCA9PT0gLTEpXG4gICAgICAgICAgICAgICAgdGhpcy5pbmRlbnROZXh0ID0gaW5kZW50O1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbmRlbnROZXh0ID1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ibG9ja1NjYWxhckluZGVudCArICh0aGlzLmluZGVudE5leHQgPT09IDAgPyAxIDogdGhpcy5pbmRlbnROZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjcyA9IHRoaXMuY29udGludWVTY2FsYXIobmwgKyAxKTtcbiAgICAgICAgICAgICAgICBpZiAoY3MgPT09IC0xKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBubCA9IHRoaXMuYnVmZmVyLmluZGV4T2YoJ1xcbicsIGNzKTtcbiAgICAgICAgICAgIH0gd2hpbGUgKG5sICE9PSAtMSk7XG4gICAgICAgICAgICBpZiAobmwgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmF0RW5kKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zZXROZXh0KCdibG9jay1zY2FsYXInKTtcbiAgICAgICAgICAgICAgICBubCA9IHRoaXMuYnVmZmVyLmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBUcmFpbGluZyBpbnN1ZmZpY2llbnRseSBpbmRlbnRlZCB0YWJzIGFyZSBpbnZhbGlkLlxuICAgICAgICAvLyBUbyBjYXRjaCB0aGF0IGR1cmluZyBwYXJzaW5nLCB3ZSBpbmNsdWRlIHRoZW0gaW4gdGhlIGJsb2NrIHNjYWxhciB2YWx1ZS5cbiAgICAgICAgbGV0IGkgPSBubCArIDE7XG4gICAgICAgIGNoID0gdGhpcy5idWZmZXJbaV07XG4gICAgICAgIHdoaWxlIChjaCA9PT0gJyAnKVxuICAgICAgICAgICAgY2ggPSB0aGlzLmJ1ZmZlclsrK2ldO1xuICAgICAgICBpZiAoY2ggPT09ICdcXHQnKSB7XG4gICAgICAgICAgICB3aGlsZSAoY2ggPT09ICdcXHQnIHx8IGNoID09PSAnICcgfHwgY2ggPT09ICdcXHInIHx8IGNoID09PSAnXFxuJylcbiAgICAgICAgICAgICAgICBjaCA9IHRoaXMuYnVmZmVyWysraV07XG4gICAgICAgICAgICBubCA9IGkgLSAxO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCF0aGlzLmJsb2NrU2NhbGFyS2VlcCkge1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgIGxldCBpID0gbmwgLSAxO1xuICAgICAgICAgICAgICAgIGxldCBjaCA9IHRoaXMuYnVmZmVyW2ldO1xuICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJ1xccicpXG4gICAgICAgICAgICAgICAgICAgIGNoID0gdGhpcy5idWZmZXJbLS1pXTtcbiAgICAgICAgICAgICAgICBjb25zdCBsYXN0Q2hhciA9IGk7IC8vIERyb3AgdGhlIGxpbmUgaWYgbGFzdCBjaGFyIG5vdCBtb3JlIGluZGVudGVkXG4gICAgICAgICAgICAgICAgd2hpbGUgKGNoID09PSAnICcpXG4gICAgICAgICAgICAgICAgICAgIGNoID0gdGhpcy5idWZmZXJbLS1pXTtcbiAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICdcXG4nICYmIGkgPj0gdGhpcy5wb3MgJiYgaSArIDEgKyBpbmRlbnQgPiBsYXN0Q2hhcilcbiAgICAgICAgICAgICAgICAgICAgbmwgPSBpO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9IHdoaWxlICh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICB5aWVsZCBTQ0FMQVI7XG4gICAgICAgIHlpZWxkKiB0aGlzLnB1c2hUb0luZGV4KG5sICsgMSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5wYXJzZUxpbmVTdGFydCgpO1xuICAgIH1cbiAgICAqcGFyc2VQbGFpblNjYWxhcigpIHtcbiAgICAgICAgY29uc3QgaW5GbG93ID0gdGhpcy5mbG93TGV2ZWwgPiAwO1xuICAgICAgICBsZXQgZW5kID0gdGhpcy5wb3MgLSAxO1xuICAgICAgICBsZXQgaSA9IHRoaXMucG9zIC0gMTtcbiAgICAgICAgbGV0IGNoO1xuICAgICAgICB3aGlsZSAoKGNoID0gdGhpcy5idWZmZXJbKytpXSkpIHtcbiAgICAgICAgICAgIGlmIChjaCA9PT0gJzonKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IHRoaXMuYnVmZmVyW2kgKyAxXTtcbiAgICAgICAgICAgICAgICBpZiAoaXNFbXB0eShuZXh0KSB8fCAoaW5GbG93ICYmIGZsb3dJbmRpY2F0b3JDaGFycy5oYXMobmV4dCkpKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBlbmQgPSBpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXNFbXB0eShjaCkpIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IHRoaXMuYnVmZmVyW2kgKyAxXTtcbiAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICdcXHInKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0ID09PSAnXFxuJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSAnXFxuJztcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgPSB0aGlzLmJ1ZmZlcltpICsgMV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgZW5kID0gaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG5leHQgPT09ICcjJyB8fCAoaW5GbG93ICYmIGZsb3dJbmRpY2F0b3JDaGFycy5oYXMobmV4dCkpKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICdcXG4nKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNzID0gdGhpcy5jb250aW51ZVNjYWxhcihpICsgMSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjcyA9PT0gLTEpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgaSA9IE1hdGgubWF4KGksIGNzIC0gMik7IC8vIHRvIGFkdmFuY2UsIGJ1dCBzdGlsbCBhY2NvdW50IGZvciAnICMnXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGluRmxvdyAmJiBmbG93SW5kaWNhdG9yQ2hhcnMuaGFzKGNoKSlcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZW5kID0gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNoICYmICF0aGlzLmF0RW5kKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0TmV4dCgncGxhaW4tc2NhbGFyJyk7XG4gICAgICAgIHlpZWxkIFNDQUxBUjtcbiAgICAgICAgeWllbGQqIHRoaXMucHVzaFRvSW5kZXgoZW5kICsgMSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBpbkZsb3cgPyAnZmxvdycgOiAnZG9jJztcbiAgICB9XG4gICAgKnB1c2hDb3VudChuKSB7XG4gICAgICAgIGlmIChuID4gMCkge1xuICAgICAgICAgICAgeWllbGQgdGhpcy5idWZmZXIuc3Vic3RyKHRoaXMucG9zLCBuKTtcbiAgICAgICAgICAgIHRoaXMucG9zICs9IG47XG4gICAgICAgICAgICByZXR1cm4gbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgKnB1c2hUb0luZGV4KGksIGFsbG93RW1wdHkpIHtcbiAgICAgICAgY29uc3QgcyA9IHRoaXMuYnVmZmVyLnNsaWNlKHRoaXMucG9zLCBpKTtcbiAgICAgICAgaWYgKHMpIHtcbiAgICAgICAgICAgIHlpZWxkIHM7XG4gICAgICAgICAgICB0aGlzLnBvcyArPSBzLmxlbmd0aDtcbiAgICAgICAgICAgIHJldHVybiBzLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhbGxvd0VtcHR5KVxuICAgICAgICAgICAgeWllbGQgJyc7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICAqcHVzaEluZGljYXRvcnMoKSB7XG4gICAgICAgIGxldCBuID0gMDtcbiAgICAgICAgbG9vcDogd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgIHN3aXRjaCAodGhpcy5jaGFyQXQoMCkpIHtcbiAgICAgICAgICAgICAgICBjYXNlICchJzpcbiAgICAgICAgICAgICAgICAgICAgbiArPSB5aWVsZCogdGhpcy5wdXNoVGFnKCk7XG4gICAgICAgICAgICAgICAgICAgIG4gKz0geWllbGQqIHRoaXMucHVzaFNwYWNlcyh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWUgbG9vcDtcbiAgICAgICAgICAgICAgICBjYXNlICcmJzpcbiAgICAgICAgICAgICAgICAgICAgbiArPSB5aWVsZCogdGhpcy5wdXNoVW50aWwoaXNOb3RBbmNob3JDaGFyKTtcbiAgICAgICAgICAgICAgICAgICAgbiArPSB5aWVsZCogdGhpcy5wdXNoU3BhY2VzKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBsb29wO1xuICAgICAgICAgICAgICAgIGNhc2UgJy0nOiAvLyB0aGlzIGlzIGFuIGVycm9yXG4gICAgICAgICAgICAgICAgY2FzZSAnPyc6IC8vIHRoaXMgaXMgYW4gZXJyb3Igb3V0c2lkZSBmbG93IGNvbGxlY3Rpb25zXG4gICAgICAgICAgICAgICAgY2FzZSAnOic6IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5GbG93ID0gdGhpcy5mbG93TGV2ZWwgPiAwO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaDEgPSB0aGlzLmNoYXJBdCgxKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzRW1wdHkoY2gxKSB8fCAoaW5GbG93ICYmIGZsb3dJbmRpY2F0b3JDaGFycy5oYXMoY2gxKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaW5GbG93KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5kZW50TmV4dCA9IHRoaXMuaW5kZW50VmFsdWUgKyAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5mbG93S2V5KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmxvd0tleSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgbiArPSB5aWVsZCogdGhpcy5wdXNoQ291bnQoMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBuICs9IHlpZWxkKiB0aGlzLnB1c2hTcGFjZXModHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBsb29wO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWsgbG9vcDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbjtcbiAgICB9XG4gICAgKnB1c2hUYWcoKSB7XG4gICAgICAgIGlmICh0aGlzLmNoYXJBdCgxKSA9PT0gJzwnKSB7XG4gICAgICAgICAgICBsZXQgaSA9IHRoaXMucG9zICsgMjtcbiAgICAgICAgICAgIGxldCBjaCA9IHRoaXMuYnVmZmVyW2ldO1xuICAgICAgICAgICAgd2hpbGUgKCFpc0VtcHR5KGNoKSAmJiBjaCAhPT0gJz4nKVxuICAgICAgICAgICAgICAgIGNoID0gdGhpcy5idWZmZXJbKytpXTtcbiAgICAgICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5wdXNoVG9JbmRleChjaCA9PT0gJz4nID8gaSArIDEgOiBpLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgaSA9IHRoaXMucG9zICsgMTtcbiAgICAgICAgICAgIGxldCBjaCA9IHRoaXMuYnVmZmVyW2ldO1xuICAgICAgICAgICAgd2hpbGUgKGNoKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRhZ0NoYXJzLmhhcyhjaCkpXG4gICAgICAgICAgICAgICAgICAgIGNoID0gdGhpcy5idWZmZXJbKytpXTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjaCA9PT0gJyUnICYmXG4gICAgICAgICAgICAgICAgICAgIGhleERpZ2l0cy5oYXModGhpcy5idWZmZXJbaSArIDFdKSAmJlxuICAgICAgICAgICAgICAgICAgICBoZXhEaWdpdHMuaGFzKHRoaXMuYnVmZmVyW2kgKyAyXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2ggPSB0aGlzLmJ1ZmZlclsoaSArPSAzKV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucHVzaFRvSW5kZXgoaSwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgICpwdXNoTmV3bGluZSgpIHtcbiAgICAgICAgY29uc3QgY2ggPSB0aGlzLmJ1ZmZlclt0aGlzLnBvc107XG4gICAgICAgIGlmIChjaCA9PT0gJ1xcbicpXG4gICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucHVzaENvdW50KDEpO1xuICAgICAgICBlbHNlIGlmIChjaCA9PT0gJ1xccicgJiYgdGhpcy5jaGFyQXQoMSkgPT09ICdcXG4nKVxuICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiB0aGlzLnB1c2hDb3VudCgyKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgICpwdXNoU3BhY2VzKGFsbG93VGFicykge1xuICAgICAgICBsZXQgaSA9IHRoaXMucG9zIC0gMTtcbiAgICAgICAgbGV0IGNoO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBjaCA9IHRoaXMuYnVmZmVyWysraV07XG4gICAgICAgIH0gd2hpbGUgKGNoID09PSAnICcgfHwgKGFsbG93VGFicyAmJiBjaCA9PT0gJ1xcdCcpKTtcbiAgICAgICAgY29uc3QgbiA9IGkgLSB0aGlzLnBvcztcbiAgICAgICAgaWYgKG4gPiAwKSB7XG4gICAgICAgICAgICB5aWVsZCB0aGlzLmJ1ZmZlci5zdWJzdHIodGhpcy5wb3MsIG4pO1xuICAgICAgICAgICAgdGhpcy5wb3MgPSBpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuO1xuICAgIH1cbiAgICAqcHVzaFVudGlsKHRlc3QpIHtcbiAgICAgICAgbGV0IGkgPSB0aGlzLnBvcztcbiAgICAgICAgbGV0IGNoID0gdGhpcy5idWZmZXJbaV07XG4gICAgICAgIHdoaWxlICghdGVzdChjaCkpXG4gICAgICAgICAgICBjaCA9IHRoaXMuYnVmZmVyWysraV07XG4gICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5wdXNoVG9JbmRleChpLCBmYWxzZSk7XG4gICAgfVxufVxuXG5leHBvcnQgeyBMZXhlciB9O1xuIiwiLyoqXG4gKiBUcmFja3MgbmV3bGluZXMgZHVyaW5nIHBhcnNpbmcgaW4gb3JkZXIgdG8gcHJvdmlkZSBhbiBlZmZpY2llbnQgQVBJIGZvclxuICogZGV0ZXJtaW5pbmcgdGhlIG9uZS1pbmRleGVkIGB7IGxpbmUsIGNvbCB9YCBwb3NpdGlvbiBmb3IgYW55IG9mZnNldFxuICogd2l0aGluIHRoZSBpbnB1dC5cbiAqL1xuY2xhc3MgTGluZUNvdW50ZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmxpbmVTdGFydHMgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNob3VsZCBiZSBjYWxsZWQgaW4gYXNjZW5kaW5nIG9yZGVyLiBPdGhlcndpc2UsIGNhbGxcbiAgICAgICAgICogYGxpbmVDb3VudGVyLmxpbmVTdGFydHMuc29ydCgpYCBiZWZvcmUgY2FsbGluZyBgbGluZVBvcygpYC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYWRkTmV3TGluZSA9IChvZmZzZXQpID0+IHRoaXMubGluZVN0YXJ0cy5wdXNoKG9mZnNldCk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQZXJmb3JtcyBhIGJpbmFyeSBzZWFyY2ggYW5kIHJldHVybnMgdGhlIDEtaW5kZXhlZCB7IGxpbmUsIGNvbCB9XG4gICAgICAgICAqIHBvc2l0aW9uIG9mIGBvZmZzZXRgLiBJZiBgbGluZSA9PT0gMGAsIGBhZGROZXdMaW5lYCBoYXMgbmV2ZXIgYmVlblxuICAgICAgICAgKiBjYWxsZWQgb3IgYG9mZnNldGAgaXMgYmVmb3JlIHRoZSBmaXJzdCBrbm93biBuZXdsaW5lLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5saW5lUG9zID0gKG9mZnNldCkgPT4ge1xuICAgICAgICAgICAgbGV0IGxvdyA9IDA7XG4gICAgICAgICAgICBsZXQgaGlnaCA9IHRoaXMubGluZVN0YXJ0cy5sZW5ndGg7XG4gICAgICAgICAgICB3aGlsZSAobG93IDwgaGlnaCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1pZCA9IChsb3cgKyBoaWdoKSA+PiAxOyAvLyBNYXRoLmZsb29yKChsb3cgKyBoaWdoKSAvIDIpXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubGluZVN0YXJ0c1ttaWRdIDwgb2Zmc2V0KVxuICAgICAgICAgICAgICAgICAgICBsb3cgPSBtaWQgKyAxO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgaGlnaCA9IG1pZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmxpbmVTdGFydHNbbG93XSA9PT0gb2Zmc2V0KVxuICAgICAgICAgICAgICAgIHJldHVybiB7IGxpbmU6IGxvdyArIDEsIGNvbDogMSB9O1xuICAgICAgICAgICAgaWYgKGxvdyA9PT0gMClcbiAgICAgICAgICAgICAgICByZXR1cm4geyBsaW5lOiAwLCBjb2w6IG9mZnNldCB9O1xuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0aGlzLmxpbmVTdGFydHNbbG93IC0gMV07XG4gICAgICAgICAgICByZXR1cm4geyBsaW5lOiBsb3csIGNvbDogb2Zmc2V0IC0gc3RhcnQgKyAxIH07XG4gICAgICAgIH07XG4gICAgfVxufVxuXG5leHBvcnQgeyBMaW5lQ291bnRlciB9O1xuIiwiaW1wb3J0IHsgdG9rZW5UeXBlIH0gZnJvbSAnLi9jc3QuanMnO1xuaW1wb3J0IHsgTGV4ZXIgfSBmcm9tICcuL2xleGVyLmpzJztcblxuZnVuY3Rpb24gaW5jbHVkZXNUb2tlbihsaXN0LCB0eXBlKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKVxuICAgICAgICBpZiAobGlzdFtpXS50eXBlID09PSB0eXBlKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gZmluZE5vbkVtcHR5SW5kZXgobGlzdCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7ICsraSkge1xuICAgICAgICBzd2l0Y2ggKGxpc3RbaV0udHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnc3BhY2UnOlxuICAgICAgICAgICAgY2FzZSAnY29tbWVudCc6XG4gICAgICAgICAgICBjYXNlICduZXdsaW5lJzpcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIC0xO1xufVxuZnVuY3Rpb24gaXNGbG93VG9rZW4odG9rZW4pIHtcbiAgICBzd2l0Y2ggKHRva2VuPy50eXBlKSB7XG4gICAgICAgIGNhc2UgJ2FsaWFzJzpcbiAgICAgICAgY2FzZSAnc2NhbGFyJzpcbiAgICAgICAgY2FzZSAnc2luZ2xlLXF1b3RlZC1zY2FsYXInOlxuICAgICAgICBjYXNlICdkb3VibGUtcXVvdGVkLXNjYWxhcic6XG4gICAgICAgIGNhc2UgJ2Zsb3ctY29sbGVjdGlvbic6XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5mdW5jdGlvbiBnZXRQcmV2UHJvcHMocGFyZW50KSB7XG4gICAgc3dpdGNoIChwYXJlbnQudHlwZSkge1xuICAgICAgICBjYXNlICdkb2N1bWVudCc6XG4gICAgICAgICAgICByZXR1cm4gcGFyZW50LnN0YXJ0O1xuICAgICAgICBjYXNlICdibG9jay1tYXAnOiB7XG4gICAgICAgICAgICBjb25zdCBpdCA9IHBhcmVudC5pdGVtc1twYXJlbnQuaXRlbXMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICByZXR1cm4gaXQuc2VwID8/IGl0LnN0YXJ0O1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2Jsb2NrLXNlcSc6XG4gICAgICAgICAgICByZXR1cm4gcGFyZW50Lml0ZW1zW3BhcmVudC5pdGVtcy5sZW5ndGggLSAxXS5zdGFydDtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgc2hvdWxkIG5vdCBoYXBwZW4gKi9cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICB9XG59XG4vKiogTm90ZTogTWF5IG1vZGlmeSBpbnB1dCBhcnJheSAqL1xuZnVuY3Rpb24gZ2V0Rmlyc3RLZXlTdGFydFByb3BzKHByZXYpIHtcbiAgICBpZiAocHJldi5sZW5ndGggPT09IDApXG4gICAgICAgIHJldHVybiBbXTtcbiAgICBsZXQgaSA9IHByZXYubGVuZ3RoO1xuICAgIGxvb3A6IHdoaWxlICgtLWkgPj0gMCkge1xuICAgICAgICBzd2l0Y2ggKHByZXZbaV0udHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnZG9jLXN0YXJ0JzpcbiAgICAgICAgICAgIGNhc2UgJ2V4cGxpY2l0LWtleS1pbmQnOlxuICAgICAgICAgICAgY2FzZSAnbWFwLXZhbHVlLWluZCc6XG4gICAgICAgICAgICBjYXNlICdzZXEtaXRlbS1pbmQnOlxuICAgICAgICAgICAgY2FzZSAnbmV3bGluZSc6XG4gICAgICAgICAgICAgICAgYnJlYWsgbG9vcDtcbiAgICAgICAgfVxuICAgIH1cbiAgICB3aGlsZSAocHJldlsrK2ldPy50eXBlID09PSAnc3BhY2UnKSB7XG4gICAgICAgIC8qIGxvb3AgKi9cbiAgICB9XG4gICAgcmV0dXJuIHByZXYuc3BsaWNlKGksIHByZXYubGVuZ3RoKTtcbn1cbmZ1bmN0aW9uIGFycmF5UHVzaEFycmF5KHRhcmdldCwgc291cmNlKSB7XG4gICAgLy8gTWF5IGV4aGF1c3QgY2FsbCBzdGFjayB3aXRoIGxhcmdlIGBzb3VyY2VgIGFycmF5XG4gICAgaWYgKHNvdXJjZS5sZW5ndGggPCAxZTUpXG4gICAgICAgIEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KHRhcmdldCwgc291cmNlKTtcbiAgICBlbHNlXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc291cmNlLmxlbmd0aDsgKytpKVxuICAgICAgICAgICAgdGFyZ2V0LnB1c2goc291cmNlW2ldKTtcbn1cbmZ1bmN0aW9uIGZpeEZsb3dTZXFJdGVtcyhmYykge1xuICAgIGlmIChmYy5zdGFydC50eXBlID09PSAnZmxvdy1zZXEtc3RhcnQnKSB7XG4gICAgICAgIGZvciAoY29uc3QgaXQgb2YgZmMuaXRlbXMpIHtcbiAgICAgICAgICAgIGlmIChpdC5zZXAgJiZcbiAgICAgICAgICAgICAgICAhaXQudmFsdWUgJiZcbiAgICAgICAgICAgICAgICAhaW5jbHVkZXNUb2tlbihpdC5zdGFydCwgJ2V4cGxpY2l0LWtleS1pbmQnKSAmJlxuICAgICAgICAgICAgICAgICFpbmNsdWRlc1Rva2VuKGl0LnNlcCwgJ21hcC12YWx1ZS1pbmQnKSkge1xuICAgICAgICAgICAgICAgIGlmIChpdC5rZXkpXG4gICAgICAgICAgICAgICAgICAgIGl0LnZhbHVlID0gaXQua2V5O1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBpdC5rZXk7XG4gICAgICAgICAgICAgICAgaWYgKGlzRmxvd1Rva2VuKGl0LnZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXQudmFsdWUuZW5kKVxuICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlQdXNoQXJyYXkoaXQudmFsdWUuZW5kLCBpdC5zZXApO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBpdC52YWx1ZS5lbmQgPSBpdC5zZXA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgYXJyYXlQdXNoQXJyYXkoaXQuc3RhcnQsIGl0LnNlcCk7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGl0LnNlcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuICogQSBZQU1MIGNvbmNyZXRlIHN5bnRheCB0cmVlIChDU1QpIHBhcnNlclxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCBzcmM6IHN0cmluZyA9IC4uLlxuICogZm9yIChjb25zdCB0b2tlbiBvZiBuZXcgUGFyc2VyKCkucGFyc2Uoc3JjKSkge1xuICogICAvLyB0b2tlbjogVG9rZW5cbiAqIH1cbiAqIGBgYFxuICpcbiAqIFRvIHVzZSB0aGUgcGFyc2VyIHdpdGggYSB1c2VyLXByb3ZpZGVkIGxleGVyOlxuICpcbiAqIGBgYHRzXG4gKiBmdW5jdGlvbiogcGFyc2Uoc291cmNlOiBzdHJpbmcsIGxleGVyOiBMZXhlcikge1xuICogICBjb25zdCBwYXJzZXIgPSBuZXcgUGFyc2VyKClcbiAqICAgZm9yIChjb25zdCBsZXhlbWUgb2YgbGV4ZXIubGV4KHNvdXJjZSkpXG4gKiAgICAgeWllbGQqIHBhcnNlci5uZXh0KGxleGVtZSlcbiAqICAgeWllbGQqIHBhcnNlci5lbmQoKVxuICogfVxuICpcbiAqIGNvbnN0IHNyYzogc3RyaW5nID0gLi4uXG4gKiBjb25zdCBsZXhlciA9IG5ldyBMZXhlcigpXG4gKiBmb3IgKGNvbnN0IHRva2VuIG9mIHBhcnNlKHNyYywgbGV4ZXIpKSB7XG4gKiAgIC8vIHRva2VuOiBUb2tlblxuICogfVxuICogYGBgXG4gKi9cbmNsYXNzIFBhcnNlciB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIG9uTmV3TGluZSAtIElmIGRlZmluZWQsIGNhbGxlZCBzZXBhcmF0ZWx5IHdpdGggdGhlIHN0YXJ0IHBvc2l0aW9uIG9mXG4gICAgICogICBlYWNoIG5ldyBsaW5lIChpbiBgcGFyc2UoKWAsIGluY2x1ZGluZyB0aGUgc3RhcnQgb2YgaW5wdXQpLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG9uTmV3TGluZSkge1xuICAgICAgICAvKiogSWYgdHJ1ZSwgc3BhY2UgYW5kIHNlcXVlbmNlIGluZGljYXRvcnMgY291bnQgYXMgaW5kZW50YXRpb24gKi9cbiAgICAgICAgdGhpcy5hdE5ld0xpbmUgPSB0cnVlO1xuICAgICAgICAvKiogSWYgdHJ1ZSwgbmV4dCB0b2tlbiBpcyBhIHNjYWxhciB2YWx1ZSAqL1xuICAgICAgICB0aGlzLmF0U2NhbGFyID0gZmFsc2U7XG4gICAgICAgIC8qKiBDdXJyZW50IGluZGVudGF0aW9uIGxldmVsICovXG4gICAgICAgIHRoaXMuaW5kZW50ID0gMDtcbiAgICAgICAgLyoqIEN1cnJlbnQgb2Zmc2V0IHNpbmNlIHRoZSBzdGFydCBvZiBwYXJzaW5nICovXG4gICAgICAgIHRoaXMub2Zmc2V0ID0gMDtcbiAgICAgICAgLyoqIE9uIHRoZSBzYW1lIGxpbmUgd2l0aCBhIGJsb2NrIG1hcCBrZXkgKi9cbiAgICAgICAgdGhpcy5vbktleUxpbmUgPSBmYWxzZTtcbiAgICAgICAgLyoqIFRvcCBpbmRpY2F0ZXMgdGhlIG5vZGUgdGhhdCdzIGN1cnJlbnRseSBiZWluZyBidWlsdCAqL1xuICAgICAgICB0aGlzLnN0YWNrID0gW107XG4gICAgICAgIC8qKiBUaGUgc291cmNlIG9mIHRoZSBjdXJyZW50IHRva2VuLCBzZXQgaW4gcGFyc2UoKSAqL1xuICAgICAgICB0aGlzLnNvdXJjZSA9ICcnO1xuICAgICAgICAvKiogVGhlIHR5cGUgb2YgdGhlIGN1cnJlbnQgdG9rZW4sIHNldCBpbiBwYXJzZSgpICovXG4gICAgICAgIHRoaXMudHlwZSA9ICcnO1xuICAgICAgICAvLyBNdXN0IGJlIGRlZmluZWQgYWZ0ZXIgYG5leHQoKWBcbiAgICAgICAgdGhpcy5sZXhlciA9IG5ldyBMZXhlcigpO1xuICAgICAgICB0aGlzLm9uTmV3TGluZSA9IG9uTmV3TGluZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUGFyc2UgYHNvdXJjZWAgYXMgYSBZQU1MIHN0cmVhbS5cbiAgICAgKiBJZiBgaW5jb21wbGV0ZWAsIGEgcGFydCBvZiB0aGUgbGFzdCBsaW5lIG1heSBiZSBsZWZ0IGFzIGEgYnVmZmVyIGZvciB0aGUgbmV4dCBjYWxsLlxuICAgICAqXG4gICAgICogRXJyb3JzIGFyZSBub3QgdGhyb3duLCBidXQgeWllbGRlZCBhcyBgeyB0eXBlOiAnZXJyb3InLCBtZXNzYWdlIH1gIHRva2Vucy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEEgZ2VuZXJhdG9yIG9mIHRva2VucyByZXByZXNlbnRpbmcgZWFjaCBkaXJlY3RpdmUsIGRvY3VtZW50LCBhbmQgb3RoZXIgc3RydWN0dXJlLlxuICAgICAqL1xuICAgICpwYXJzZShzb3VyY2UsIGluY29tcGxldGUgPSBmYWxzZSkge1xuICAgICAgICBpZiAodGhpcy5vbk5ld0xpbmUgJiYgdGhpcy5vZmZzZXQgPT09IDApXG4gICAgICAgICAgICB0aGlzLm9uTmV3TGluZSgwKTtcbiAgICAgICAgZm9yIChjb25zdCBsZXhlbWUgb2YgdGhpcy5sZXhlci5sZXgoc291cmNlLCBpbmNvbXBsZXRlKSlcbiAgICAgICAgICAgIHlpZWxkKiB0aGlzLm5leHQobGV4ZW1lKTtcbiAgICAgICAgaWYgKCFpbmNvbXBsZXRlKVxuICAgICAgICAgICAgeWllbGQqIHRoaXMuZW5kKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkdmFuY2UgdGhlIHBhcnNlciBieSB0aGUgYHNvdXJjZWAgb2Ygb25lIGxleGljYWwgdG9rZW4uXG4gICAgICovXG4gICAgKm5leHQoc291cmNlKSB7XG4gICAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgICAgICBpZiAodGhpcy5hdFNjYWxhcikge1xuICAgICAgICAgICAgdGhpcy5hdFNjYWxhciA9IGZhbHNlO1xuICAgICAgICAgICAgeWllbGQqIHRoaXMuc3RlcCgpO1xuICAgICAgICAgICAgdGhpcy5vZmZzZXQgKz0gc291cmNlLmxlbmd0aDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0eXBlID0gdG9rZW5UeXBlKHNvdXJjZSk7XG4gICAgICAgIGlmICghdHlwZSkge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGBOb3QgYSBZQU1MIHRva2VuOiAke3NvdXJjZX1gO1xuICAgICAgICAgICAgeWllbGQqIHRoaXMucG9wKHsgdHlwZTogJ2Vycm9yJywgb2Zmc2V0OiB0aGlzLm9mZnNldCwgbWVzc2FnZSwgc291cmNlIH0pO1xuICAgICAgICAgICAgdGhpcy5vZmZzZXQgKz0gc291cmNlLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlID09PSAnc2NhbGFyJykge1xuICAgICAgICAgICAgdGhpcy5hdE5ld0xpbmUgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuYXRTY2FsYXIgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy50eXBlID0gJ3NjYWxhcic7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICAgICAgeWllbGQqIHRoaXMuc3RlcCgpO1xuICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnbmV3bGluZSc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXROZXdMaW5lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmRlbnQgPSAwO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vbk5ld0xpbmUpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uTmV3TGluZSh0aGlzLm9mZnNldCArIHNvdXJjZS5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdzcGFjZSc6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmF0TmV3TGluZSAmJiBzb3VyY2VbMF0gPT09ICcgJylcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5kZW50ICs9IHNvdXJjZS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2V4cGxpY2l0LWtleS1pbmQnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ21hcC12YWx1ZS1pbmQnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ3NlcS1pdGVtLWluZCc6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmF0TmV3TGluZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5kZW50ICs9IHNvdXJjZS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2RvYy1tb2RlJzpcbiAgICAgICAgICAgICAgICBjYXNlICdmbG93LWVycm9yLWVuZCc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmF0TmV3TGluZSA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5vZmZzZXQgKz0gc291cmNlLmxlbmd0aDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKiogQ2FsbCBhdCBlbmQgb2YgaW5wdXQgdG8gcHVzaCBvdXQgYW55IHJlbWFpbmluZyBjb25zdHJ1Y3Rpb25zICovXG4gICAgKmVuZCgpIHtcbiAgICAgICAgd2hpbGUgKHRoaXMuc3RhY2subGVuZ3RoID4gMClcbiAgICAgICAgICAgIHlpZWxkKiB0aGlzLnBvcCgpO1xuICAgIH1cbiAgICBnZXQgc291cmNlVG9rZW4oKSB7XG4gICAgICAgIGNvbnN0IHN0ID0ge1xuICAgICAgICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgICAgICAgb2Zmc2V0OiB0aGlzLm9mZnNldCxcbiAgICAgICAgICAgIGluZGVudDogdGhpcy5pbmRlbnQsXG4gICAgICAgICAgICBzb3VyY2U6IHRoaXMuc291cmNlXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBzdDtcbiAgICB9XG4gICAgKnN0ZXAoKSB7XG4gICAgICAgIGNvbnN0IHRvcCA9IHRoaXMucGVlaygxKTtcbiAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gJ2RvYy1lbmQnICYmIHRvcD8udHlwZSAhPT0gJ2RvYy1lbmQnKSB7XG4gICAgICAgICAgICB3aGlsZSAodGhpcy5zdGFjay5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnBvcCgpO1xuICAgICAgICAgICAgdGhpcy5zdGFjay5wdXNoKHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnZG9jLWVuZCcsXG4gICAgICAgICAgICAgICAgb2Zmc2V0OiB0aGlzLm9mZnNldCxcbiAgICAgICAgICAgICAgICBzb3VyY2U6IHRoaXMuc291cmNlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRvcClcbiAgICAgICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5zdHJlYW0oKTtcbiAgICAgICAgc3dpdGNoICh0b3AudHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnZG9jdW1lbnQnOlxuICAgICAgICAgICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5kb2N1bWVudCh0b3ApO1xuICAgICAgICAgICAgY2FzZSAnYWxpYXMnOlxuICAgICAgICAgICAgY2FzZSAnc2NhbGFyJzpcbiAgICAgICAgICAgIGNhc2UgJ3NpbmdsZS1xdW90ZWQtc2NhbGFyJzpcbiAgICAgICAgICAgIGNhc2UgJ2RvdWJsZS1xdW90ZWQtc2NhbGFyJzpcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMuc2NhbGFyKHRvcCk7XG4gICAgICAgICAgICBjYXNlICdibG9jay1zY2FsYXInOlxuICAgICAgICAgICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5ibG9ja1NjYWxhcih0b3ApO1xuICAgICAgICAgICAgY2FzZSAnYmxvY2stbWFwJzpcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMuYmxvY2tNYXAodG9wKTtcbiAgICAgICAgICAgIGNhc2UgJ2Jsb2NrLXNlcSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiB0aGlzLmJsb2NrU2VxdWVuY2UodG9wKTtcbiAgICAgICAgICAgIGNhc2UgJ2Zsb3ctY29sbGVjdGlvbic6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiB0aGlzLmZsb3dDb2xsZWN0aW9uKHRvcCk7XG4gICAgICAgICAgICBjYXNlICdkb2MtZW5kJzpcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMuZG9jdW1lbnRFbmQodG9wKTtcbiAgICAgICAgfVxuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCBzaG91bGQgbm90IGhhcHBlbiAqL1xuICAgICAgICB5aWVsZCogdGhpcy5wb3AoKTtcbiAgICB9XG4gICAgcGVlayhuKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gbl07XG4gICAgfVxuICAgICpwb3AoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgdG9rZW4gPSBlcnJvciA/PyB0aGlzLnN0YWNrLnBvcCgpO1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgc2hvdWxkIG5vdCBoYXBwZW4gKi9cbiAgICAgICAgaWYgKCF0b2tlbikge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9ICdUcmllZCB0byBwb3AgYW4gZW1wdHkgc3RhY2snO1xuICAgICAgICAgICAgeWllbGQgeyB0eXBlOiAnZXJyb3InLCBvZmZzZXQ6IHRoaXMub2Zmc2V0LCBzb3VyY2U6ICcnLCBtZXNzYWdlIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5zdGFjay5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHlpZWxkIHRva2VuO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgdG9wID0gdGhpcy5wZWVrKDEpO1xuICAgICAgICAgICAgaWYgKHRva2VuLnR5cGUgPT09ICdibG9jay1zY2FsYXInKSB7XG4gICAgICAgICAgICAgICAgLy8gQmxvY2sgc2NhbGFycyB1c2UgdGhlaXIgcGFyZW50IHJhdGhlciB0aGFuIGhlYWRlciBpbmRlbnRcbiAgICAgICAgICAgICAgICB0b2tlbi5pbmRlbnQgPSAnaW5kZW50JyBpbiB0b3AgPyB0b3AuaW5kZW50IDogMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRva2VuLnR5cGUgPT09ICdmbG93LWNvbGxlY3Rpb24nICYmIHRvcC50eXBlID09PSAnZG9jdW1lbnQnKSB7XG4gICAgICAgICAgICAgICAgLy8gSWdub3JlIGFsbCBpbmRlbnQgZm9yIHRvcC1sZXZlbCBmbG93IGNvbGxlY3Rpb25zXG4gICAgICAgICAgICAgICAgdG9rZW4uaW5kZW50ID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0b2tlbi50eXBlID09PSAnZmxvdy1jb2xsZWN0aW9uJylcbiAgICAgICAgICAgICAgICBmaXhGbG93U2VxSXRlbXModG9rZW4pO1xuICAgICAgICAgICAgc3dpdGNoICh0b3AudHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2RvY3VtZW50JzpcbiAgICAgICAgICAgICAgICAgICAgdG9wLnZhbHVlID0gdG9rZW47XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2Jsb2NrLXNjYWxhcic6XG4gICAgICAgICAgICAgICAgICAgIHRvcC5wcm9wcy5wdXNoKHRva2VuKTsgLy8gZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnYmxvY2stbWFwJzoge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpdCA9IHRvcC5pdGVtc1t0b3AuaXRlbXMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChpdC52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9wLml0ZW1zLnB1c2goeyBzdGFydDogW10sIGtleTogdG9rZW4sIHNlcDogW10gfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uS2V5TGluZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaXQuc2VwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdC52YWx1ZSA9IHRva2VuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihpdCwgeyBrZXk6IHRva2VuLCBzZXA6IFtdIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbktleUxpbmUgPSAhaXQuZXhwbGljaXRLZXk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgJ2Jsb2NrLXNlcSc6IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXQgPSB0b3AuaXRlbXNbdG9wLml0ZW1zLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXQudmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICB0b3AuaXRlbXMucHVzaCh7IHN0YXJ0OiBbXSwgdmFsdWU6IHRva2VuIH0pO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBpdC52YWx1ZSA9IHRva2VuO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSAnZmxvdy1jb2xsZWN0aW9uJzoge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpdCA9IHRvcC5pdGVtc1t0b3AuaXRlbXMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgICAgIGlmICghaXQgfHwgaXQudmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICB0b3AuaXRlbXMucHVzaCh7IHN0YXJ0OiBbXSwga2V5OiB0b2tlbiwgc2VwOiBbXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaXQuc2VwKVxuICAgICAgICAgICAgICAgICAgICAgICAgaXQudmFsdWUgPSB0b2tlbjtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihpdCwgeyBrZXk6IHRva2VuLCBzZXA6IFtdIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0IHNob3VsZCBub3QgaGFwcGVuICovXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgeWllbGQqIHRoaXMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnBvcCh0b2tlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKHRvcC50eXBlID09PSAnZG9jdW1lbnQnIHx8XG4gICAgICAgICAgICAgICAgdG9wLnR5cGUgPT09ICdibG9jay1tYXAnIHx8XG4gICAgICAgICAgICAgICAgdG9wLnR5cGUgPT09ICdibG9jay1zZXEnKSAmJlxuICAgICAgICAgICAgICAgICh0b2tlbi50eXBlID09PSAnYmxvY2stbWFwJyB8fCB0b2tlbi50eXBlID09PSAnYmxvY2stc2VxJykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsYXN0ID0gdG9rZW4uaXRlbXNbdG9rZW4uaXRlbXMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgaWYgKGxhc3QgJiZcbiAgICAgICAgICAgICAgICAgICAgIWxhc3Quc2VwICYmXG4gICAgICAgICAgICAgICAgICAgICFsYXN0LnZhbHVlICYmXG4gICAgICAgICAgICAgICAgICAgIGxhc3Quc3RhcnQubGVuZ3RoID4gMCAmJlxuICAgICAgICAgICAgICAgICAgICBmaW5kTm9uRW1wdHlJbmRleChsYXN0LnN0YXJ0KSA9PT0gLTEgJiZcbiAgICAgICAgICAgICAgICAgICAgKHRva2VuLmluZGVudCA9PT0gMCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgbGFzdC5zdGFydC5ldmVyeShzdCA9PiBzdC50eXBlICE9PSAnY29tbWVudCcgfHwgc3QuaW5kZW50IDwgdG9rZW4uaW5kZW50KSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRvcC50eXBlID09PSAnZG9jdW1lbnQnKVxuICAgICAgICAgICAgICAgICAgICAgICAgdG9wLmVuZCA9IGxhc3Quc3RhcnQ7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvcC5pdGVtcy5wdXNoKHsgc3RhcnQ6IGxhc3Quc3RhcnQgfSk7XG4gICAgICAgICAgICAgICAgICAgIHRva2VuLml0ZW1zLnNwbGljZSgtMSwgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgICpzdHJlYW0oKSB7XG4gICAgICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdkaXJlY3RpdmUtbGluZSc6XG4gICAgICAgICAgICAgICAgeWllbGQgeyB0eXBlOiAnZGlyZWN0aXZlJywgb2Zmc2V0OiB0aGlzLm9mZnNldCwgc291cmNlOiB0aGlzLnNvdXJjZSB9O1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGNhc2UgJ2J5dGUtb3JkZXItbWFyayc6XG4gICAgICAgICAgICBjYXNlICdzcGFjZSc6XG4gICAgICAgICAgICBjYXNlICdjb21tZW50JzpcbiAgICAgICAgICAgIGNhc2UgJ25ld2xpbmUnOlxuICAgICAgICAgICAgICAgIHlpZWxkIHRoaXMuc291cmNlVG9rZW47XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgY2FzZSAnZG9jLW1vZGUnOlxuICAgICAgICAgICAgY2FzZSAnZG9jLXN0YXJ0Jzoge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRvYyA9IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2RvY3VtZW50JyxcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiB0aGlzLm9mZnNldCxcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IFtdXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy50eXBlID09PSAnZG9jLXN0YXJ0JylcbiAgICAgICAgICAgICAgICAgICAgZG9jLnN0YXJ0LnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGFjay5wdXNoKGRvYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHlpZWxkIHtcbiAgICAgICAgICAgIHR5cGU6ICdlcnJvcicsXG4gICAgICAgICAgICBvZmZzZXQ6IHRoaXMub2Zmc2V0LFxuICAgICAgICAgICAgbWVzc2FnZTogYFVuZXhwZWN0ZWQgJHt0aGlzLnR5cGV9IHRva2VuIGluIFlBTUwgc3RyZWFtYCxcbiAgICAgICAgICAgIHNvdXJjZTogdGhpcy5zb3VyY2VcbiAgICAgICAgfTtcbiAgICB9XG4gICAgKmRvY3VtZW50KGRvYykge1xuICAgICAgICBpZiAoZG9jLnZhbHVlKVxuICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiB0aGlzLmxpbmVFbmQoZG9jKTtcbiAgICAgICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2RvYy1zdGFydCc6IHtcbiAgICAgICAgICAgICAgICBpZiAoZmluZE5vbkVtcHR5SW5kZXgoZG9jLnN0YXJ0KSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgeWllbGQqIHRoaXMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnN0ZXAoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBkb2Muc3RhcnQucHVzaCh0aGlzLnNvdXJjZVRva2VuKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdhbmNob3InOlxuICAgICAgICAgICAgY2FzZSAndGFnJzpcbiAgICAgICAgICAgIGNhc2UgJ3NwYWNlJzpcbiAgICAgICAgICAgIGNhc2UgJ2NvbW1lbnQnOlxuICAgICAgICAgICAgY2FzZSAnbmV3bGluZSc6XG4gICAgICAgICAgICAgICAgZG9jLnN0YXJ0LnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJ2ID0gdGhpcy5zdGFydEJsb2NrVmFsdWUoZG9jKTtcbiAgICAgICAgaWYgKGJ2KVxuICAgICAgICAgICAgdGhpcy5zdGFjay5wdXNoKGJ2KTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB5aWVsZCB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICBvZmZzZXQ6IHRoaXMub2Zmc2V0LFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBVbmV4cGVjdGVkICR7dGhpcy50eXBlfSB0b2tlbiBpbiBZQU1MIGRvY3VtZW50YCxcbiAgICAgICAgICAgICAgICBzb3VyY2U6IHRoaXMuc291cmNlXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuICAgICpzY2FsYXIoc2NhbGFyKSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgPT09ICdtYXAtdmFsdWUtaW5kJykge1xuICAgICAgICAgICAgY29uc3QgcHJldiA9IGdldFByZXZQcm9wcyh0aGlzLnBlZWsoMikpO1xuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBnZXRGaXJzdEtleVN0YXJ0UHJvcHMocHJldik7XG4gICAgICAgICAgICBsZXQgc2VwO1xuICAgICAgICAgICAgaWYgKHNjYWxhci5lbmQpIHtcbiAgICAgICAgICAgICAgICBzZXAgPSBzY2FsYXIuZW5kO1xuICAgICAgICAgICAgICAgIHNlcC5wdXNoKHRoaXMuc291cmNlVG9rZW4pO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBzY2FsYXIuZW5kO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHNlcCA9IFt0aGlzLnNvdXJjZVRva2VuXTtcbiAgICAgICAgICAgIGNvbnN0IG1hcCA9IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnYmxvY2stbWFwJyxcbiAgICAgICAgICAgICAgICBvZmZzZXQ6IHNjYWxhci5vZmZzZXQsXG4gICAgICAgICAgICAgICAgaW5kZW50OiBzY2FsYXIuaW5kZW50LFxuICAgICAgICAgICAgICAgIGl0ZW1zOiBbeyBzdGFydCwga2V5OiBzY2FsYXIsIHNlcCB9XVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMub25LZXlMaW5lID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXSA9IG1hcDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICB5aWVsZCogdGhpcy5saW5lRW5kKHNjYWxhcik7XG4gICAgfVxuICAgICpibG9ja1NjYWxhcihzY2FsYXIpIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ3NwYWNlJzpcbiAgICAgICAgICAgIGNhc2UgJ2NvbW1lbnQnOlxuICAgICAgICAgICAgY2FzZSAnbmV3bGluZSc6XG4gICAgICAgICAgICAgICAgc2NhbGFyLnByb3BzLnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgY2FzZSAnc2NhbGFyJzpcbiAgICAgICAgICAgICAgICBzY2FsYXIuc291cmNlID0gdGhpcy5zb3VyY2U7XG4gICAgICAgICAgICAgICAgLy8gYmxvY2stc2NhbGFyIHNvdXJjZSBpbmNsdWRlcyB0cmFpbGluZyBuZXdsaW5lXG4gICAgICAgICAgICAgICAgdGhpcy5hdE5ld0xpbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5kZW50ID0gMDtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vbk5ld0xpbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5sID0gdGhpcy5zb3VyY2UuaW5kZXhPZignXFxuJykgKyAxO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAobmwgIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25OZXdMaW5lKHRoaXMub2Zmc2V0ICsgbmwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbmwgPSB0aGlzLnNvdXJjZS5pbmRleE9mKCdcXG4nLCBubCkgKyAxO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnBvcCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgc2hvdWxkIG5vdCBoYXBwZW4gKi9cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgeWllbGQqIHRoaXMucG9wKCk7XG4gICAgICAgICAgICAgICAgeWllbGQqIHRoaXMuc3RlcCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgICpibG9ja01hcChtYXApIHtcbiAgICAgICAgY29uc3QgaXQgPSBtYXAuaXRlbXNbbWFwLml0ZW1zLmxlbmd0aCAtIDFdO1xuICAgICAgICAvLyBpdC5zZXAgaXMgdHJ1ZS1pc2ggaWYgcGFpciBhbHJlYWR5IGhhcyBrZXkgb3IgOiBzZXBhcmF0b3JcbiAgICAgICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ25ld2xpbmUnOlxuICAgICAgICAgICAgICAgIHRoaXMub25LZXlMaW5lID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKGl0LnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZCA9ICdlbmQnIGluIGl0LnZhbHVlID8gaXQudmFsdWUuZW5kIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXN0ID0gQXJyYXkuaXNBcnJheShlbmQpID8gZW5kW2VuZC5sZW5ndGggLSAxXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3Q/LnR5cGUgPT09ICdjb21tZW50JylcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuZD8ucHVzaCh0aGlzLnNvdXJjZVRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgbWFwLml0ZW1zLnB1c2goeyBzdGFydDogW3RoaXMuc291cmNlVG9rZW5dIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChpdC5zZXApIHtcbiAgICAgICAgICAgICAgICAgICAgaXQuc2VwLnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpdC5zdGFydC5wdXNoKHRoaXMuc291cmNlVG9rZW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBjYXNlICdzcGFjZSc6XG4gICAgICAgICAgICBjYXNlICdjb21tZW50JzpcbiAgICAgICAgICAgICAgICBpZiAoaXQudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgbWFwLml0ZW1zLnB1c2goeyBzdGFydDogW3RoaXMuc291cmNlVG9rZW5dIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChpdC5zZXApIHtcbiAgICAgICAgICAgICAgICAgICAgaXQuc2VwLnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5hdEluZGVudGVkQ29tbWVudChpdC5zdGFydCwgbWFwLmluZGVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByZXYgPSBtYXAuaXRlbXNbbWFwLml0ZW1zLmxlbmd0aCAtIDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5kID0gcHJldj8udmFsdWU/LmVuZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGVuZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheVB1c2hBcnJheShlbmQsIGl0LnN0YXJ0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQucHVzaCh0aGlzLnNvdXJjZVRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAuaXRlbXMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGl0LnN0YXJ0LnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pbmRlbnQgPj0gbWFwLmluZGVudCkge1xuICAgICAgICAgICAgY29uc3QgYXRNYXBJbmRlbnQgPSAhdGhpcy5vbktleUxpbmUgJiYgdGhpcy5pbmRlbnQgPT09IG1hcC5pbmRlbnQ7XG4gICAgICAgICAgICBjb25zdCBhdE5leHRJdGVtID0gYXRNYXBJbmRlbnQgJiZcbiAgICAgICAgICAgICAgICAoaXQuc2VwIHx8IGl0LmV4cGxpY2l0S2V5KSAmJlxuICAgICAgICAgICAgICAgIHRoaXMudHlwZSAhPT0gJ3NlcS1pdGVtLWluZCc7XG4gICAgICAgICAgICAvLyBGb3IgZW1wdHkgbm9kZXMsIGFzc2lnbiBuZXdsaW5lLXNlcGFyYXRlZCBub3QgaW5kZW50ZWQgZW1wdHkgdG9rZW5zIHRvIGZvbGxvd2luZyBub2RlXG4gICAgICAgICAgICBsZXQgc3RhcnQgPSBbXTtcbiAgICAgICAgICAgIGlmIChhdE5leHRJdGVtICYmIGl0LnNlcCAmJiAhaXQudmFsdWUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBubCA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXQuc2VwLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ID0gaXQuc2VwW2ldO1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN0LnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ25ld2xpbmUnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5sLnB1c2goaSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdzcGFjZSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdjb21tZW50JzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3QuaW5kZW50ID4gbWFwLmluZGVudClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmwubGVuZ3RoID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmwubGVuZ3RoID0gMDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobmwubGVuZ3RoID49IDIpXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gaXQuc2VwLnNwbGljZShubFsxXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2FuY2hvcic6XG4gICAgICAgICAgICAgICAgY2FzZSAndGFnJzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKGF0TmV4dEl0ZW0gfHwgaXQudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAuaXRlbXMucHVzaCh7IHN0YXJ0IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbktleUxpbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGl0LnNlcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXQuc2VwLnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdC5zdGFydC5wdXNoKHRoaXMuc291cmNlVG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICBjYXNlICdleHBsaWNpdC1rZXktaW5kJzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpdC5zZXAgJiYgIWl0LmV4cGxpY2l0S2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdC5zdGFydC5wdXNoKHRoaXMuc291cmNlVG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaXQuZXhwbGljaXRLZXkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGF0TmV4dEl0ZW0gfHwgaXQudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAuaXRlbXMucHVzaCh7IHN0YXJ0LCBleHBsaWNpdEtleTogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2Jsb2NrLW1hcCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiB0aGlzLm9mZnNldCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQ6IHRoaXMuaW5kZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zOiBbeyBzdGFydDogW3RoaXMuc291cmNlVG9rZW5dLCBleHBsaWNpdEtleTogdHJ1ZSB9XVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbktleUxpbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgY2FzZSAnbWFwLXZhbHVlLWluZCc6XG4gICAgICAgICAgICAgICAgICAgIGlmIChpdC5leHBsaWNpdEtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpdC5zZXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5jbHVkZXNUb2tlbihpdC5zdGFydCwgJ25ld2xpbmUnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGl0LCB7IGtleTogbnVsbCwgc2VwOiBbdGhpcy5zb3VyY2VUb2tlbl0gfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IGdldEZpcnN0S2V5U3RhcnRQcm9wcyhpdC5zdGFydCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYmxvY2stbWFwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldDogdGhpcy5vZmZzZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQ6IHRoaXMuaW5kZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXM6IFt7IHN0YXJ0LCBrZXk6IG51bGwsIHNlcDogW3RoaXMuc291cmNlVG9rZW5dIH1dXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGl0LnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwLml0ZW1zLnB1c2goeyBzdGFydDogW10sIGtleTogbnVsbCwgc2VwOiBbdGhpcy5zb3VyY2VUb2tlbl0gfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpbmNsdWRlc1Rva2VuKGl0LnNlcCwgJ21hcC12YWx1ZS1pbmQnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdibG9jay1tYXAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IHRoaXMub2Zmc2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQ6IHRoaXMuaW5kZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtczogW3sgc3RhcnQsIGtleTogbnVsbCwgc2VwOiBbdGhpcy5zb3VyY2VUb2tlbl0gfV1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzRmxvd1Rva2VuKGl0LmtleSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaW5jbHVkZXNUb2tlbihpdC5zZXAsICduZXdsaW5lJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IGdldEZpcnN0S2V5U3RhcnRQcm9wcyhpdC5zdGFydCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gaXQua2V5O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlcCA9IGl0LnNlcDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXAucHVzaCh0aGlzLnNvdXJjZVRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHR5cGUgZ3VhcmQgaXMgd3JvbmcgaGVyZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBpdC5rZXk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciB0eXBlIGd1YXJkIGlzIHdyb25nIGhlcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgaXQuc2VwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdibG9jay1tYXAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IHRoaXMub2Zmc2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQ6IHRoaXMuaW5kZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtczogW3sgc3RhcnQsIGtleSwgc2VwIH1dXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzdGFydC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90IGFjdHVhbGx5IGF0IG5leHQgaXRlbVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0LnNlcCA9IGl0LnNlcC5jb25jYXQoc3RhcnQsIHRoaXMuc291cmNlVG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQuc2VwLnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWl0LnNlcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oaXQsIHsga2V5OiBudWxsLCBzZXA6IFt0aGlzLnNvdXJjZVRva2VuXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGl0LnZhbHVlIHx8IGF0TmV4dEl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAuaXRlbXMucHVzaCh7IHN0YXJ0LCBrZXk6IG51bGwsIHNlcDogW3RoaXMuc291cmNlVG9rZW5dIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaW5jbHVkZXNUb2tlbihpdC5zZXAsICdtYXAtdmFsdWUtaW5kJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYmxvY2stbWFwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiB0aGlzLm9mZnNldCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50OiB0aGlzLmluZGVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXM6IFt7IHN0YXJ0OiBbXSwga2V5OiBudWxsLCBzZXA6IFt0aGlzLnNvdXJjZVRva2VuXSB9XVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQuc2VwLnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbktleUxpbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgY2FzZSAnYWxpYXMnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ3NjYWxhcic6XG4gICAgICAgICAgICAgICAgY2FzZSAnc2luZ2xlLXF1b3RlZC1zY2FsYXInOlxuICAgICAgICAgICAgICAgIGNhc2UgJ2RvdWJsZS1xdW90ZWQtc2NhbGFyJzoge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmcyA9IHRoaXMuZmxvd1NjYWxhcih0aGlzLnR5cGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYXROZXh0SXRlbSB8fCBpdC52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWFwLml0ZW1zLnB1c2goeyBzdGFydCwga2V5OiBmcywgc2VwOiBbXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25LZXlMaW5lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpdC5zZXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaChmcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGl0LCB7IGtleTogZnMsIHNlcDogW10gfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uS2V5TGluZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJ2ID0gdGhpcy5zdGFydEJsb2NrVmFsdWUobWFwKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJ2KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnYudHlwZSA9PT0gJ2Jsb2NrLXNlcScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWl0LmV4cGxpY2l0S2V5ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0LnNlcCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaW5jbHVkZXNUb2tlbihpdC5zZXAsICduZXdsaW5lJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQqIHRoaXMucG9wKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IHRoaXMub2Zmc2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ1VuZXhwZWN0ZWQgYmxvY2stc2VxLWluZCBvbiBzYW1lIGxpbmUgd2l0aCBrZXknLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiB0aGlzLnNvdXJjZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGF0TWFwSW5kZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwLml0ZW1zLnB1c2goeyBzdGFydCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaChidik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgeWllbGQqIHRoaXMucG9wKCk7XG4gICAgICAgIHlpZWxkKiB0aGlzLnN0ZXAoKTtcbiAgICB9XG4gICAgKmJsb2NrU2VxdWVuY2Uoc2VxKSB7XG4gICAgICAgIGNvbnN0IGl0ID0gc2VxLml0ZW1zW3NlcS5pdGVtcy5sZW5ndGggLSAxXTtcbiAgICAgICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ25ld2xpbmUnOlxuICAgICAgICAgICAgICAgIGlmIChpdC52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQgPSAnZW5kJyBpbiBpdC52YWx1ZSA/IGl0LnZhbHVlLmVuZCA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFzdCA9IEFycmF5LmlzQXJyYXkoZW5kKSA/IGVuZFtlbmQubGVuZ3RoIC0gMV0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsYXN0Py50eXBlID09PSAnY29tbWVudCcpXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmQ/LnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcS5pdGVtcy5wdXNoKHsgc3RhcnQ6IFt0aGlzLnNvdXJjZVRva2VuXSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBpdC5zdGFydC5wdXNoKHRoaXMuc291cmNlVG9rZW4pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGNhc2UgJ3NwYWNlJzpcbiAgICAgICAgICAgIGNhc2UgJ2NvbW1lbnQnOlxuICAgICAgICAgICAgICAgIGlmIChpdC52YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgc2VxLml0ZW1zLnB1c2goeyBzdGFydDogW3RoaXMuc291cmNlVG9rZW5dIH0pO1xuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5hdEluZGVudGVkQ29tbWVudChpdC5zdGFydCwgc2VxLmluZGVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByZXYgPSBzZXEuaXRlbXNbc2VxLml0ZW1zLmxlbmd0aCAtIDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5kID0gcHJldj8udmFsdWU/LmVuZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGVuZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheVB1c2hBcnJheShlbmQsIGl0LnN0YXJ0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQucHVzaCh0aGlzLnNvdXJjZVRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXEuaXRlbXMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGl0LnN0YXJ0LnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGNhc2UgJ2FuY2hvcic6XG4gICAgICAgICAgICBjYXNlICd0YWcnOlxuICAgICAgICAgICAgICAgIGlmIChpdC52YWx1ZSB8fCB0aGlzLmluZGVudCA8PSBzZXEuaW5kZW50KVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBpdC5zdGFydC5wdXNoKHRoaXMuc291cmNlVG9rZW4pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGNhc2UgJ3NlcS1pdGVtLWluZCc6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaW5kZW50ICE9PSBzZXEuaW5kZW50KVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBpZiAoaXQudmFsdWUgfHwgaW5jbHVkZXNUb2tlbihpdC5zdGFydCwgJ3NlcS1pdGVtLWluZCcpKVxuICAgICAgICAgICAgICAgICAgICBzZXEuaXRlbXMucHVzaCh7IHN0YXJ0OiBbdGhpcy5zb3VyY2VUb2tlbl0gfSk7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBpdC5zdGFydC5wdXNoKHRoaXMuc291cmNlVG9rZW4pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pbmRlbnQgPiBzZXEuaW5kZW50KSB7XG4gICAgICAgICAgICBjb25zdCBidiA9IHRoaXMuc3RhcnRCbG9ja1ZhbHVlKHNlcSk7XG4gICAgICAgICAgICBpZiAoYnYpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2goYnYpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB5aWVsZCogdGhpcy5wb3AoKTtcbiAgICAgICAgeWllbGQqIHRoaXMuc3RlcCgpO1xuICAgIH1cbiAgICAqZmxvd0NvbGxlY3Rpb24oZmMpIHtcbiAgICAgICAgY29uc3QgaXQgPSBmYy5pdGVtc1tmYy5pdGVtcy5sZW5ndGggLSAxXTtcbiAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gJ2Zsb3ctZXJyb3ItZW5kJykge1xuICAgICAgICAgICAgbGV0IHRvcDtcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICB5aWVsZCogdGhpcy5wb3AoKTtcbiAgICAgICAgICAgICAgICB0b3AgPSB0aGlzLnBlZWsoMSk7XG4gICAgICAgICAgICB9IHdoaWxlICh0b3A/LnR5cGUgPT09ICdmbG93LWNvbGxlY3Rpb24nKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChmYy5lbmQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2NvbW1hJzpcbiAgICAgICAgICAgICAgICBjYXNlICdleHBsaWNpdC1rZXktaW5kJzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpdCB8fCBpdC5zZXApXG4gICAgICAgICAgICAgICAgICAgICAgICBmYy5pdGVtcy5wdXNoKHsgc3RhcnQ6IFt0aGlzLnNvdXJjZVRva2VuXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgaXQuc3RhcnQucHVzaCh0aGlzLnNvdXJjZVRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGNhc2UgJ21hcC12YWx1ZS1pbmQnOlxuICAgICAgICAgICAgICAgICAgICBpZiAoIWl0IHx8IGl0LnZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgZmMuaXRlbXMucHVzaCh7IHN0YXJ0OiBbXSwga2V5OiBudWxsLCBzZXA6IFt0aGlzLnNvdXJjZVRva2VuXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaXQuc2VwKVxuICAgICAgICAgICAgICAgICAgICAgICAgaXQuc2VwLnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oaXQsIHsga2V5OiBudWxsLCBzZXA6IFt0aGlzLnNvdXJjZVRva2VuXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3NwYWNlJzpcbiAgICAgICAgICAgICAgICBjYXNlICdjb21tZW50JzpcbiAgICAgICAgICAgICAgICBjYXNlICduZXdsaW5lJzpcbiAgICAgICAgICAgICAgICBjYXNlICdhbmNob3InOlxuICAgICAgICAgICAgICAgIGNhc2UgJ3RhZyc6XG4gICAgICAgICAgICAgICAgICAgIGlmICghaXQgfHwgaXQudmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICBmYy5pdGVtcy5wdXNoKHsgc3RhcnQ6IFt0aGlzLnNvdXJjZVRva2VuXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaXQuc2VwKVxuICAgICAgICAgICAgICAgICAgICAgICAgaXQuc2VwLnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0LnN0YXJ0LnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICBjYXNlICdhbGlhcyc6XG4gICAgICAgICAgICAgICAgY2FzZSAnc2NhbGFyJzpcbiAgICAgICAgICAgICAgICBjYXNlICdzaW5nbGUtcXVvdGVkLXNjYWxhcic6XG4gICAgICAgICAgICAgICAgY2FzZSAnZG91YmxlLXF1b3RlZC1zY2FsYXInOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZzID0gdGhpcy5mbG93U2NhbGFyKHRoaXMudHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaXQgfHwgaXQudmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICBmYy5pdGVtcy5wdXNoKHsgc3RhcnQ6IFtdLCBrZXk6IGZzLCBzZXA6IFtdIH0pO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpdC5zZXApXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2goZnMpO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGl0LCB7IGtleTogZnMsIHNlcDogW10gfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSAnZmxvdy1tYXAtZW5kJzpcbiAgICAgICAgICAgICAgICBjYXNlICdmbG93LXNlcS1lbmQnOlxuICAgICAgICAgICAgICAgICAgICBmYy5lbmQucHVzaCh0aGlzLnNvdXJjZVRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYnYgPSB0aGlzLnN0YXJ0QmxvY2tWYWx1ZShmYyk7XG4gICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSBzaG91bGQgbm90IGhhcHBlbiAqL1xuICAgICAgICAgICAgaWYgKGJ2KVxuICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaChidik7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB5aWVsZCogdGhpcy5wb3AoKTtcbiAgICAgICAgICAgICAgICB5aWVsZCogdGhpcy5zdGVwKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnQgPSB0aGlzLnBlZWsoMik7XG4gICAgICAgICAgICBpZiAocGFyZW50LnR5cGUgPT09ICdibG9jay1tYXAnICYmXG4gICAgICAgICAgICAgICAgKCh0aGlzLnR5cGUgPT09ICdtYXAtdmFsdWUtaW5kJyAmJiBwYXJlbnQuaW5kZW50ID09PSBmYy5pbmRlbnQpIHx8XG4gICAgICAgICAgICAgICAgICAgICh0aGlzLnR5cGUgPT09ICduZXdsaW5lJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgIXBhcmVudC5pdGVtc1twYXJlbnQuaXRlbXMubGVuZ3RoIC0gMV0uc2VwKSkpIHtcbiAgICAgICAgICAgICAgICB5aWVsZCogdGhpcy5wb3AoKTtcbiAgICAgICAgICAgICAgICB5aWVsZCogdGhpcy5zdGVwKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLnR5cGUgPT09ICdtYXAtdmFsdWUtaW5kJyAmJlxuICAgICAgICAgICAgICAgIHBhcmVudC50eXBlICE9PSAnZmxvdy1jb2xsZWN0aW9uJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXYgPSBnZXRQcmV2UHJvcHMocGFyZW50KTtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IGdldEZpcnN0S2V5U3RhcnRQcm9wcyhwcmV2KTtcbiAgICAgICAgICAgICAgICBmaXhGbG93U2VxSXRlbXMoZmMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlcCA9IGZjLmVuZC5zcGxpY2UoMSwgZmMuZW5kLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgc2VwLnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgY29uc3QgbWFwID0ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYmxvY2stbWFwJyxcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiBmYy5vZmZzZXQsXG4gICAgICAgICAgICAgICAgICAgIGluZGVudDogZmMuaW5kZW50LFxuICAgICAgICAgICAgICAgICAgICBpdGVtczogW3sgc3RhcnQsIGtleTogZmMsIHNlcCB9XVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdGhpcy5vbktleUxpbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXSA9IG1hcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLmxpbmVFbmQoZmMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGZsb3dTY2FsYXIodHlwZSkge1xuICAgICAgICBpZiAodGhpcy5vbk5ld0xpbmUpIHtcbiAgICAgICAgICAgIGxldCBubCA9IHRoaXMuc291cmNlLmluZGV4T2YoJ1xcbicpICsgMTtcbiAgICAgICAgICAgIHdoaWxlIChubCAhPT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMub25OZXdMaW5lKHRoaXMub2Zmc2V0ICsgbmwpO1xuICAgICAgICAgICAgICAgIG5sID0gdGhpcy5zb3VyY2UuaW5kZXhPZignXFxuJywgbmwpICsgMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgIG9mZnNldDogdGhpcy5vZmZzZXQsXG4gICAgICAgICAgICBpbmRlbnQ6IHRoaXMuaW5kZW50LFxuICAgICAgICAgICAgc291cmNlOiB0aGlzLnNvdXJjZVxuICAgICAgICB9O1xuICAgIH1cbiAgICBzdGFydEJsb2NrVmFsdWUocGFyZW50KSB7XG4gICAgICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdhbGlhcyc6XG4gICAgICAgICAgICBjYXNlICdzY2FsYXInOlxuICAgICAgICAgICAgY2FzZSAnc2luZ2xlLXF1b3RlZC1zY2FsYXInOlxuICAgICAgICAgICAgY2FzZSAnZG91YmxlLXF1b3RlZC1zY2FsYXInOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZsb3dTY2FsYXIodGhpcy50eXBlKTtcbiAgICAgICAgICAgIGNhc2UgJ2Jsb2NrLXNjYWxhci1oZWFkZXInOlxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdibG9jay1zY2FsYXInLFxuICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IHRoaXMub2Zmc2V0LFxuICAgICAgICAgICAgICAgICAgICBpbmRlbnQ6IHRoaXMuaW5kZW50LFxuICAgICAgICAgICAgICAgICAgICBwcm9wczogW3RoaXMuc291cmNlVG9rZW5dLFxuICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICcnXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNhc2UgJ2Zsb3ctbWFwLXN0YXJ0JzpcbiAgICAgICAgICAgIGNhc2UgJ2Zsb3ctc2VxLXN0YXJ0JzpcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZmxvdy1jb2xsZWN0aW9uJyxcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiB0aGlzLm9mZnNldCxcbiAgICAgICAgICAgICAgICAgICAgaW5kZW50OiB0aGlzLmluZGVudCxcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IHRoaXMuc291cmNlVG9rZW4sXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1zOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgZW5kOiBbXVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjYXNlICdzZXEtaXRlbS1pbmQnOlxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdibG9jay1zZXEnLFxuICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IHRoaXMub2Zmc2V0LFxuICAgICAgICAgICAgICAgICAgICBpbmRlbnQ6IHRoaXMuaW5kZW50LFxuICAgICAgICAgICAgICAgICAgICBpdGVtczogW3sgc3RhcnQ6IFt0aGlzLnNvdXJjZVRva2VuXSB9XVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjYXNlICdleHBsaWNpdC1rZXktaW5kJzoge1xuICAgICAgICAgICAgICAgIHRoaXMub25LZXlMaW5lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjb25zdCBwcmV2ID0gZ2V0UHJldlByb3BzKHBhcmVudCk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBnZXRGaXJzdEtleVN0YXJ0UHJvcHMocHJldik7XG4gICAgICAgICAgICAgICAgc3RhcnQucHVzaCh0aGlzLnNvdXJjZVRva2VuKTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYmxvY2stbWFwJyxcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiB0aGlzLm9mZnNldCxcbiAgICAgICAgICAgICAgICAgICAgaW5kZW50OiB0aGlzLmluZGVudCxcbiAgICAgICAgICAgICAgICAgICAgaXRlbXM6IFt7IHN0YXJ0LCBleHBsaWNpdEtleTogdHJ1ZSB9XVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdtYXAtdmFsdWUtaW5kJzoge1xuICAgICAgICAgICAgICAgIHRoaXMub25LZXlMaW5lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjb25zdCBwcmV2ID0gZ2V0UHJldlByb3BzKHBhcmVudCk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBnZXRGaXJzdEtleVN0YXJ0UHJvcHMocHJldik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2Jsb2NrLW1hcCcsXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldDogdGhpcy5vZmZzZXQsXG4gICAgICAgICAgICAgICAgICAgIGluZGVudDogdGhpcy5pbmRlbnQsXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1zOiBbeyBzdGFydCwga2V5OiBudWxsLCBzZXA6IFt0aGlzLnNvdXJjZVRva2VuXSB9XVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGF0SW5kZW50ZWRDb21tZW50KHN0YXJ0LCBpbmRlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZSAhPT0gJ2NvbW1lbnQnKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5pbmRlbnQgPD0gaW5kZW50KVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gc3RhcnQuZXZlcnkoc3QgPT4gc3QudHlwZSA9PT0gJ25ld2xpbmUnIHx8IHN0LnR5cGUgPT09ICdzcGFjZScpO1xuICAgIH1cbiAgICAqZG9jdW1lbnRFbmQoZG9jRW5kKSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgIT09ICdkb2MtbW9kZScpIHtcbiAgICAgICAgICAgIGlmIChkb2NFbmQuZW5kKVxuICAgICAgICAgICAgICAgIGRvY0VuZC5lbmQucHVzaCh0aGlzLnNvdXJjZVRva2VuKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBkb2NFbmQuZW5kID0gW3RoaXMuc291cmNlVG9rZW5dO1xuICAgICAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gJ25ld2xpbmUnKVxuICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnBvcCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgICpsaW5lRW5kKHRva2VuKSB7XG4gICAgICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdjb21tYSc6XG4gICAgICAgICAgICBjYXNlICdkb2Mtc3RhcnQnOlxuICAgICAgICAgICAgY2FzZSAnZG9jLWVuZCc6XG4gICAgICAgICAgICBjYXNlICdmbG93LXNlcS1lbmQnOlxuICAgICAgICAgICAgY2FzZSAnZmxvdy1tYXAtZW5kJzpcbiAgICAgICAgICAgIGNhc2UgJ21hcC12YWx1ZS1pbmQnOlxuICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnBvcCgpO1xuICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnN0ZXAoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ25ld2xpbmUnOlxuICAgICAgICAgICAgICAgIHRoaXMub25LZXlMaW5lID0gZmFsc2U7XG4gICAgICAgICAgICAvLyBmYWxsdGhyb3VnaFxuICAgICAgICAgICAgY2FzZSAnc3BhY2UnOlxuICAgICAgICAgICAgY2FzZSAnY29tbWVudCc6XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIC8vIGFsbCBvdGhlciB2YWx1ZXMgYXJlIGVycm9yc1xuICAgICAgICAgICAgICAgIGlmICh0b2tlbi5lbmQpXG4gICAgICAgICAgICAgICAgICAgIHRva2VuLmVuZC5wdXNoKHRoaXMuc291cmNlVG9rZW4pO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgdG9rZW4uZW5kID0gW3RoaXMuc291cmNlVG9rZW5dO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnR5cGUgPT09ICduZXdsaW5lJylcbiAgICAgICAgICAgICAgICAgICAgeWllbGQqIHRoaXMucG9wKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCB7IFBhcnNlciB9O1xuIiwiaW1wb3J0IHsgQ29tcG9zZXIgfSBmcm9tICcuL2NvbXBvc2UvY29tcG9zZXIuanMnO1xuaW1wb3J0IHsgRG9jdW1lbnQgfSBmcm9tICcuL2RvYy9Eb2N1bWVudC5qcyc7XG5pbXBvcnQgeyBwcmV0dGlmeUVycm9yLCBZQU1MUGFyc2VFcnJvciB9IGZyb20gJy4vZXJyb3JzLmpzJztcbmltcG9ydCB7IHdhcm4gfSBmcm9tICcuL2xvZy5qcyc7XG5pbXBvcnQgeyBpc0RvY3VtZW50IH0gZnJvbSAnLi9ub2Rlcy9pZGVudGl0eS5qcyc7XG5pbXBvcnQgeyBMaW5lQ291bnRlciB9IGZyb20gJy4vcGFyc2UvbGluZS1jb3VudGVyLmpzJztcbmltcG9ydCB7IFBhcnNlciB9IGZyb20gJy4vcGFyc2UvcGFyc2VyLmpzJztcblxuZnVuY3Rpb24gcGFyc2VPcHRpb25zKG9wdGlvbnMpIHtcbiAgICBjb25zdCBwcmV0dHlFcnJvcnMgPSBvcHRpb25zLnByZXR0eUVycm9ycyAhPT0gZmFsc2U7XG4gICAgY29uc3QgbGluZUNvdW50ZXIgPSBvcHRpb25zLmxpbmVDb3VudGVyIHx8IChwcmV0dHlFcnJvcnMgJiYgbmV3IExpbmVDb3VudGVyKCkpIHx8IG51bGw7XG4gICAgcmV0dXJuIHsgbGluZUNvdW50ZXIsIHByZXR0eUVycm9ycyB9O1xufVxuLyoqXG4gKiBQYXJzZSB0aGUgaW5wdXQgYXMgYSBzdHJlYW0gb2YgWUFNTCBkb2N1bWVudHMuXG4gKlxuICogRG9jdW1lbnRzIHNob3VsZCBiZSBzZXBhcmF0ZWQgZnJvbSBlYWNoIG90aGVyIGJ5IGAuLi5gIG9yIGAtLS1gIG1hcmtlciBsaW5lcy5cbiAqXG4gKiBAcmV0dXJucyBJZiBhbiBlbXB0eSBgZG9jc2AgYXJyYXkgaXMgcmV0dXJuZWQsIGl0IHdpbGwgYmUgb2YgdHlwZVxuICogICBFbXB0eVN0cmVhbSBhbmQgY29udGFpbiBhZGRpdGlvbmFsIHN0cmVhbSBpbmZvcm1hdGlvbi4gSW5cbiAqICAgVHlwZVNjcmlwdCwgeW91IHNob3VsZCB1c2UgYCdlbXB0eScgaW4gZG9jc2AgYXMgYSB0eXBlIGd1YXJkIGZvciBpdC5cbiAqL1xuZnVuY3Rpb24gcGFyc2VBbGxEb2N1bWVudHMoc291cmNlLCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCB7IGxpbmVDb3VudGVyLCBwcmV0dHlFcnJvcnMgfSA9IHBhcnNlT3B0aW9ucyhvcHRpb25zKTtcbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgUGFyc2VyKGxpbmVDb3VudGVyPy5hZGROZXdMaW5lKTtcbiAgICBjb25zdCBjb21wb3NlciA9IG5ldyBDb21wb3NlcihvcHRpb25zKTtcbiAgICBjb25zdCBkb2NzID0gQXJyYXkuZnJvbShjb21wb3Nlci5jb21wb3NlKHBhcnNlci5wYXJzZShzb3VyY2UpKSk7XG4gICAgaWYgKHByZXR0eUVycm9ycyAmJiBsaW5lQ291bnRlcilcbiAgICAgICAgZm9yIChjb25zdCBkb2Mgb2YgZG9jcykge1xuICAgICAgICAgICAgZG9jLmVycm9ycy5mb3JFYWNoKHByZXR0aWZ5RXJyb3Ioc291cmNlLCBsaW5lQ291bnRlcikpO1xuICAgICAgICAgICAgZG9jLndhcm5pbmdzLmZvckVhY2gocHJldHRpZnlFcnJvcihzb3VyY2UsIGxpbmVDb3VudGVyKSk7XG4gICAgICAgIH1cbiAgICBpZiAoZG9jcy5sZW5ndGggPiAwKVxuICAgICAgICByZXR1cm4gZG9jcztcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihbXSwgeyBlbXB0eTogdHJ1ZSB9LCBjb21wb3Nlci5zdHJlYW1JbmZvKCkpO1xufVxuLyoqIFBhcnNlIGFuIGlucHV0IHN0cmluZyBpbnRvIGEgc2luZ2xlIFlBTUwuRG9jdW1lbnQgKi9cbmZ1bmN0aW9uIHBhcnNlRG9jdW1lbnQoc291cmNlLCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCB7IGxpbmVDb3VudGVyLCBwcmV0dHlFcnJvcnMgfSA9IHBhcnNlT3B0aW9ucyhvcHRpb25zKTtcbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgUGFyc2VyKGxpbmVDb3VudGVyPy5hZGROZXdMaW5lKTtcbiAgICBjb25zdCBjb21wb3NlciA9IG5ldyBDb21wb3NlcihvcHRpb25zKTtcbiAgICAvLyBgZG9jYCBpcyBhbHdheXMgc2V0IGJ5IGNvbXBvc2UuZW5kKHRydWUpIGF0IHRoZSB2ZXJ5IGxhdGVzdFxuICAgIGxldCBkb2MgPSBudWxsO1xuICAgIGZvciAoY29uc3QgX2RvYyBvZiBjb21wb3Nlci5jb21wb3NlKHBhcnNlci5wYXJzZShzb3VyY2UpLCB0cnVlLCBzb3VyY2UubGVuZ3RoKSkge1xuICAgICAgICBpZiAoIWRvYylcbiAgICAgICAgICAgIGRvYyA9IF9kb2M7XG4gICAgICAgIGVsc2UgaWYgKGRvYy5vcHRpb25zLmxvZ0xldmVsICE9PSAnc2lsZW50Jykge1xuICAgICAgICAgICAgZG9jLmVycm9ycy5wdXNoKG5ldyBZQU1MUGFyc2VFcnJvcihfZG9jLnJhbmdlLnNsaWNlKDAsIDIpLCAnTVVMVElQTEVfRE9DUycsICdTb3VyY2UgY29udGFpbnMgbXVsdGlwbGUgZG9jdW1lbnRzOyBwbGVhc2UgdXNlIFlBTUwucGFyc2VBbGxEb2N1bWVudHMoKScpKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChwcmV0dHlFcnJvcnMgJiYgbGluZUNvdW50ZXIpIHtcbiAgICAgICAgZG9jLmVycm9ycy5mb3JFYWNoKHByZXR0aWZ5RXJyb3Ioc291cmNlLCBsaW5lQ291bnRlcikpO1xuICAgICAgICBkb2Mud2FybmluZ3MuZm9yRWFjaChwcmV0dGlmeUVycm9yKHNvdXJjZSwgbGluZUNvdW50ZXIpKTtcbiAgICB9XG4gICAgcmV0dXJuIGRvYztcbn1cbmZ1bmN0aW9uIHBhcnNlKHNyYywgcmV2aXZlciwgb3B0aW9ucykge1xuICAgIGxldCBfcmV2aXZlciA9IHVuZGVmaW5lZDtcbiAgICBpZiAodHlwZW9mIHJldml2ZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgX3Jldml2ZXIgPSByZXZpdmVyO1xuICAgIH1cbiAgICBlbHNlIGlmIChvcHRpb25zID09PSB1bmRlZmluZWQgJiYgcmV2aXZlciAmJiB0eXBlb2YgcmV2aXZlciA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgb3B0aW9ucyA9IHJldml2ZXI7XG4gICAgfVxuICAgIGNvbnN0IGRvYyA9IHBhcnNlRG9jdW1lbnQoc3JjLCBvcHRpb25zKTtcbiAgICBpZiAoIWRvYylcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgZG9jLndhcm5pbmdzLmZvckVhY2god2FybmluZyA9PiB3YXJuKGRvYy5vcHRpb25zLmxvZ0xldmVsLCB3YXJuaW5nKSk7XG4gICAgaWYgKGRvYy5lcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBpZiAoZG9jLm9wdGlvbnMubG9nTGV2ZWwgIT09ICdzaWxlbnQnKVxuICAgICAgICAgICAgdGhyb3cgZG9jLmVycm9yc1swXTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgZG9jLmVycm9ycyA9IFtdO1xuICAgIH1cbiAgICByZXR1cm4gZG9jLnRvSlMoT2JqZWN0LmFzc2lnbih7IHJldml2ZXI6IF9yZXZpdmVyIH0sIG9wdGlvbnMpKTtcbn1cbmZ1bmN0aW9uIHN0cmluZ2lmeSh2YWx1ZSwgcmVwbGFjZXIsIG9wdGlvbnMpIHtcbiAgICBsZXQgX3JlcGxhY2VyID0gbnVsbDtcbiAgICBpZiAodHlwZW9mIHJlcGxhY2VyID09PSAnZnVuY3Rpb24nIHx8IEFycmF5LmlzQXJyYXkocmVwbGFjZXIpKSB7XG4gICAgICAgIF9yZXBsYWNlciA9IHJlcGxhY2VyO1xuICAgIH1cbiAgICBlbHNlIGlmIChvcHRpb25zID09PSB1bmRlZmluZWQgJiYgcmVwbGFjZXIpIHtcbiAgICAgICAgb3B0aW9ucyA9IHJlcGxhY2VyO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdzdHJpbmcnKVxuICAgICAgICBvcHRpb25zID0gb3B0aW9ucy5sZW5ndGg7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnbnVtYmVyJykge1xuICAgICAgICBjb25zdCBpbmRlbnQgPSBNYXRoLnJvdW5kKG9wdGlvbnMpO1xuICAgICAgICBvcHRpb25zID0gaW5kZW50IDwgMSA/IHVuZGVmaW5lZCA6IGluZGVudCA+IDggPyB7IGluZGVudDogOCB9IDogeyBpbmRlbnQgfTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgeyBrZWVwVW5kZWZpbmVkIH0gPSBvcHRpb25zID8/IHJlcGxhY2VyID8/IHt9O1xuICAgICAgICBpZiAoIWtlZXBVbmRlZmluZWQpXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAoaXNEb2N1bWVudCh2YWx1ZSkgJiYgIV9yZXBsYWNlcilcbiAgICAgICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKG9wdGlvbnMpO1xuICAgIHJldHVybiBuZXcgRG9jdW1lbnQodmFsdWUsIF9yZXBsYWNlciwgb3B0aW9ucykudG9TdHJpbmcob3B0aW9ucyk7XG59XG5cbmV4cG9ydCB7IHBhcnNlLCBwYXJzZUFsbERvY3VtZW50cywgcGFyc2VEb2N1bWVudCwgc3RyaW5naWZ5IH07XG4iLCJleHBvcnQgeyBDb21wb3NlciB9IGZyb20gJy4vY29tcG9zZS9jb21wb3Nlci5qcyc7XG5leHBvcnQgeyBEb2N1bWVudCB9IGZyb20gJy4vZG9jL0RvY3VtZW50LmpzJztcbmV4cG9ydCB7IFNjaGVtYSB9IGZyb20gJy4vc2NoZW1hL1NjaGVtYS5qcyc7XG5leHBvcnQgeyBZQU1MRXJyb3IsIFlBTUxQYXJzZUVycm9yLCBZQU1MV2FybmluZyB9IGZyb20gJy4vZXJyb3JzLmpzJztcbmV4cG9ydCB7IEFsaWFzIH0gZnJvbSAnLi9ub2Rlcy9BbGlhcy5qcyc7XG5leHBvcnQgeyBpc0FsaWFzLCBpc0NvbGxlY3Rpb24sIGlzRG9jdW1lbnQsIGlzTWFwLCBpc05vZGUsIGlzUGFpciwgaXNTY2FsYXIsIGlzU2VxIH0gZnJvbSAnLi9ub2Rlcy9pZGVudGl0eS5qcyc7XG5leHBvcnQgeyBQYWlyIH0gZnJvbSAnLi9ub2Rlcy9QYWlyLmpzJztcbmV4cG9ydCB7IFNjYWxhciB9IGZyb20gJy4vbm9kZXMvU2NhbGFyLmpzJztcbmV4cG9ydCB7IFlBTUxNYXAgfSBmcm9tICcuL25vZGVzL1lBTUxNYXAuanMnO1xuZXhwb3J0IHsgWUFNTFNlcSB9IGZyb20gJy4vbm9kZXMvWUFNTFNlcS5qcyc7XG5pbXBvcnQgKiBhcyBjc3QgZnJvbSAnLi9wYXJzZS9jc3QuanMnO1xuZXhwb3J0IHsgY3N0IGFzIENTVCB9O1xuZXhwb3J0IHsgTGV4ZXIgfSBmcm9tICcuL3BhcnNlL2xleGVyLmpzJztcbmV4cG9ydCB7IExpbmVDb3VudGVyIH0gZnJvbSAnLi9wYXJzZS9saW5lLWNvdW50ZXIuanMnO1xuZXhwb3J0IHsgUGFyc2VyIH0gZnJvbSAnLi9wYXJzZS9wYXJzZXIuanMnO1xuZXhwb3J0IHsgcGFyc2UsIHBhcnNlQWxsRG9jdW1lbnRzLCBwYXJzZURvY3VtZW50LCBzdHJpbmdpZnkgfSBmcm9tICcuL3B1YmxpYy1hcGkuanMnO1xuZXhwb3J0IHsgdmlzaXQsIHZpc2l0QXN5bmMgfSBmcm9tICcuL3Zpc2l0LmpzJztcbiIsIi8vIGBleHBvcnQgKiBhcyBkZWZhdWx0IGZyb20gLi4uYCBmYWlscyBvbiBXZWJwYWNrIHY0XG4vLyBodHRwczovL2dpdGh1Yi5jb20vZWVtZWxpL3lhbWwvaXNzdWVzLzIyOFxuaW1wb3J0ICogYXMgWUFNTCBmcm9tICcuL2Rpc3QvaW5kZXguanMnXG5leHBvcnQgZGVmYXVsdCBZQU1MXG5leHBvcnQgKiBmcm9tICcuL2Rpc3QvaW5kZXguanMnXG4iLCJpbXBvcnQgeyBwYXJzZUFzcGVjdFJhdGlvLCBwYXJzZVJhbmdlU3RyaW5nLCBwYXJzZVRpbWVTdHJpbmcsIHBhcnNlVGltZXNwbGl0cyB9IGZyb20gXCIuL3V0aWxzLm1qc1wiO1xuaW1wb3J0IHsgZW5zdXJlUHJlZml4LCB0b0FycmF5LCB1bmlxIH0gZnJvbSBcIkBhbnRmdS91dGlsc1wiO1xuaW1wb3J0IFlBTUwgZnJvbSBcInlhbWxcIjtcbi8vI3JlZ2lvbiBzcmMvY29uZmlnLnRzXG5jb25zdCBSRV9RVU9URURfU1RSSU5HID0gL14oWydcIl0pLipcXDEkLztcbmNvbnN0IFJFX0ZJTEVOQU1FX1NURU0gPSAvKFteXFxcXC9dKz8pKD86XFwuXFx3Kyk/JC87XG5mdW5jdGlvbiBnZXREZWZhdWx0Q29uZmlnKCkge1xuXHRyZXR1cm4ge1xuXHRcdHRoZW1lOiBcImRlZmF1bHRcIixcblx0XHR0aXRsZTogXCJTbGlkZXZcIixcblx0XHR0aXRsZVRlbXBsYXRlOiBcIiVzIC0gU2xpZGV2XCIsXG5cdFx0YWRkb25zOiBbXSxcblx0XHRyZW1vdGVBc3NldHM6IGZhbHNlLFxuXHRcdG1vbmFjbzogdHJ1ZSxcblx0XHRtb25hY29UeXBlc1NvdXJjZTogXCJsb2NhbFwiLFxuXHRcdG1vbmFjb1R5cGVzQWRkaXRpb25hbFBhY2thZ2VzOiBbXSxcblx0XHRtb25hY29UeXBlc0lnbm9yZVBhY2thZ2VzOiBbXSxcblx0XHRtb25hY29SdW5BZGRpdGlvbmFsRGVwczogW10sXG5cdFx0bW9uYWNvUnVuVXNlU3RyaWN0OiB0cnVlLFxuXHRcdGRvd25sb2FkOiBmYWxzZSxcblx0XHRleHBvcnQ6IHt9LFxuXHRcdGluZm86IGZhbHNlLFxuXHRcdGhpZ2hsaWdodGVyOiBcInNoaWtpXCIsXG5cdFx0dHdvc2xhc2g6IHRydWUsXG5cdFx0bGluZU51bWJlcnM6IGZhbHNlLFxuXHRcdGNvbG9yU2NoZW1hOiBcImF1dG9cIixcblx0XHRyb3V0ZXJNb2RlOiBcImhpc3RvcnlcIixcblx0XHRhc3BlY3RSYXRpbzogMTYgLyA5LFxuXHRcdGNhbnZhc1dpZHRoOiA5ODAsXG5cdFx0ZXhwb3J0RmlsZW5hbWU6IFwiXCIsXG5cdFx0c2VsZWN0YWJsZTogZmFsc2UsXG5cdFx0dGhlbWVDb25maWc6IHt9LFxuXHRcdGZvbnRzOiB7fSxcblx0XHRmYXZpY29uOiBcImh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9naC9zbGlkZXZqcy9zbGlkZXYvYXNzZXRzL2Zhdmljb24ucG5nXCIsXG5cdFx0ZHJhd2luZ3M6IHt9LFxuXHRcdHBsYW50VW1sU2VydmVyOiBcImh0dHBzOi8vd3d3LnBsYW50dW1sLmNvbS9wbGFudHVtbFwiLFxuXHRcdGNvZGVDb3B5OiB0cnVlLFxuXHRcdG1hZ2ljTW92ZUNvcHk6IHRydWUsXG5cdFx0YXV0aG9yOiBcIlwiLFxuXHRcdHJlY29yZDogXCJkZXZcIixcblx0XHRjc3M6IFwidW5vY3NzXCIsXG5cdFx0cHJlc2VudGVyOiB0cnVlLFxuXHRcdGJyb3dzZXJFeHBvcnRlcjogXCJkZXZcIixcblx0XHRodG1sQXR0cnM6IHt9LFxuXHRcdHRyYW5zaXRpb246IG51bGwsXG5cdFx0ZWRpdG9yOiB0cnVlLFxuXHRcdG1jcDogdHJ1ZSxcblx0XHRjb250ZXh0TWVudTogbnVsbCxcblx0XHR3YWtlTG9jazogdHJ1ZSxcblx0XHRwd2E6IGZhbHNlLFxuXHRcdHJlbW90ZTogZmFsc2UsXG5cdFx0bWRjOiBmYWxzZSxcblx0XHRjb21hcms6IGZhbHNlLFxuXHRcdHNlb01ldGE6IHt9LFxuXHRcdG5vdGVzQXV0b1J1Ynk6IHt9LFxuXHRcdGR1cmF0aW9uOiBcIjMwbWluXCIsXG5cdFx0dGltZXI6IFwic3RvcHdhdGNoXCIsXG5cdFx0bWFnaWNNb3ZlRHVyYXRpb246IDgwMCxcblx0XHRzaGlraToge30sXG5cdFx0cHJlbG9hZEltYWdlczogdHJ1ZSxcblx0XHRjbGlja0FuaW1hdGlvbjogXCJcIlxuXHR9O1xufVxuZnVuY3Rpb24gcmVzb2x2ZUNvbmZpZyhoZWFkbWF0dGVyLCB0aGVtZU1ldGEgPSB7fSwgZmlsZXBhdGgsIHZlcmlmeSA9IGZhbHNlKSB7XG5cdGNvbnN0IHRoZW1lSGlnaHRsaWdodGVyID0gW1xuXHRcdFwicHJpc21cIixcblx0XHRcInNoaWtpXCIsXG5cdFx0XCJzaGlraWppXCJcblx0XS5pbmNsdWRlcyh0aGVtZU1ldGEuaGlnaGxpZ2h0ZXIgfHwgXCJcIikgPyB0aGVtZU1ldGEuaGlnaGxpZ2h0ZXIgOiB2b2lkIDA7XG5cdGNvbnN0IHRoZW1lQ29sb3JTY2hlbWEgPSBbXCJsaWdodFwiLCBcImRhcmtcIl0uaW5jbHVkZXModGhlbWVNZXRhLmNvbG9yU2NoZW1hIHx8IFwiXCIpID8gdGhlbWVNZXRhLmNvbG9yU2NoZW1hIDogdm9pZCAwO1xuXHRjb25zdCBkZWZhdWx0Q29uZmlnID0gZ2V0RGVmYXVsdENvbmZpZygpO1xuXHRjb25zdCBjb25maWcgPSB7XG5cdFx0Li4uZGVmYXVsdENvbmZpZyxcblx0XHRoaWdobGlnaHRlcjogdGhlbWVIaWdodGxpZ2h0ZXIgfHwgZGVmYXVsdENvbmZpZy5oaWdobGlnaHRlcixcblx0XHRjb2xvclNjaGVtYTogdGhlbWVDb2xvclNjaGVtYSB8fCBkZWZhdWx0Q29uZmlnLmNvbG9yU2NoZW1hLFxuXHRcdC4uLnRoZW1lTWV0YS5kZWZhdWx0cyxcblx0XHQuLi5oZWFkbWF0dGVyLmNvbmZpZyxcblx0XHQuLi5oZWFkbWF0dGVyLFxuXHRcdGZvbnRzOiByZXNvbHZlRm9udHMoe1xuXHRcdFx0Li4uZGVmYXVsdENvbmZpZy5mb250cyxcblx0XHRcdC4uLnRoZW1lTWV0YS5kZWZhdWx0cz8uZm9udHMsXG5cdFx0XHQuLi5oZWFkbWF0dGVyLmNvbmZpZz8uZm9udHMsXG5cdFx0XHQuLi5oZWFkbWF0dGVyPy5mb250c1xuXHRcdH0pLFxuXHRcdGRyYXdpbmdzOiByZXNvbHZlRHJhd2luZ3Moe1xuXHRcdFx0Li4udGhlbWVNZXRhLmRlZmF1bHRzPy5kcmF3aW5ncyxcblx0XHRcdC4uLmhlYWRtYXR0ZXIuY29uZmlnPy5kcmF3aW5ncyxcblx0XHRcdC4uLmhlYWRtYXR0ZXI/LmRyYXdpbmdzXG5cdFx0fSwgZmlsZXBhdGgpLFxuXHRcdGh0bWxBdHRyczoge1xuXHRcdFx0Li4uZGVmYXVsdENvbmZpZy5odG1sQXR0cnMsXG5cdFx0XHQuLi50aGVtZU1ldGEuZGVmYXVsdHM/Lmh0bWxBdHRycyxcblx0XHRcdC4uLmhlYWRtYXR0ZXIuY29uZmlnPy5odG1sQXR0cnMsXG5cdFx0XHQuLi5oZWFkbWF0dGVyPy5odG1sQXR0cnNcblx0XHR9LFxuXHRcdHRoZW1lQ29uZmlnOiB7XG5cdFx0XHQuLi5kZWZhdWx0Q29uZmlnLnRoZW1lQ29uZmlnLFxuXHRcdFx0Li4udGhlbWVNZXRhLmRlZmF1bHRzPy50aGVtZUNvbmZpZyxcblx0XHRcdC4uLmhlYWRtYXR0ZXIuY29uZmlnPy50aGVtZUNvbmZpZyxcblx0XHRcdC4uLmhlYWRtYXR0ZXI/LnRoZW1lQ29uZmlnXG5cdFx0fVxuXHR9O1xuXHRpZiAoY29uZmlnLmhpZ2hsaWdodGVyID09PSBcInNoaWtpamlcIikge1xuXHRcdGNvbnNvbGUud2FybihgW3NsaWRldl0gXCJzaGlraWppXCIgaXMgbWVyZ2VkIGJhY2sgdG8gXCJzaGlraVwiLCB5b3UgY2FuIHNhZmVseSBjaGFuZ2UgaXQgXCJoaWdobGlnaHRlcjogc2hpa2lcImApO1xuXHRcdGNvbmZpZy5oaWdobGlnaHRlciA9IFwic2hpa2lcIjtcblx0fVxuXHRpZiAoY29uZmlnLmhpZ2hsaWdodGVyID09PSBcInByaXNtXCIpIHRocm93IG5ldyBFcnJvcihgW3NsaWRldl0gXCJwcmlzbVwiIHN1cHBvcnQgaGFzIGJlZW4gZHJvcHBlZC4gUGxlYXNlIHVzZSBcImhpZ2hsaWdodGVyOiBzaGlraVwiIGluc3RlYWRgKTtcblx0aWYgKGNvbmZpZy5jb2xvclNjaGVtYSAhPT0gXCJkYXJrXCIgJiYgY29uZmlnLmNvbG9yU2NoZW1hICE9PSBcImxpZ2h0XCIpIGNvbmZpZy5jb2xvclNjaGVtYSA9IFwiYXV0b1wiO1xuXHRpZiAodGhlbWVDb2xvclNjaGVtYSAmJiBjb25maWcuY29sb3JTY2hlbWEgPT09IFwiYXV0b1wiKSBjb25maWcuY29sb3JTY2hlbWEgPSB0aGVtZUNvbG9yU2NoZW1hO1xuXHRjb25maWcuYXNwZWN0UmF0aW8gPSBwYXJzZUFzcGVjdFJhdGlvKGNvbmZpZy5hc3BlY3RSYXRpbyk7XG5cdGlmICh2ZXJpZnkpIHZlcmlmeUNvbmZpZyhjb25maWcsIHRoZW1lTWV0YSk7XG5cdHJldHVybiBjb25maWc7XG59XG5mdW5jdGlvbiB2ZXJpZnlDb25maWcoY29uZmlnLCB0aGVtZU1ldGEgPSB7fSwgd2FybiA9ICh2KSA9PiBjb25zb2xlLndhcm4oYFtzbGlkZXZdICR7dn1gKSkge1xuXHRjb25zdCB0aGVtZUhpZ2h0bGlnaHRlciA9IHRoZW1lTWV0YS5oaWdobGlnaHRlciA9PT0gXCJzaGlraVwiID8gdGhlbWVNZXRhLmhpZ2hsaWdodGVyIDogdm9pZCAwO1xuXHRjb25zdCB0aGVtZUNvbG9yU2NoZW1hID0gW1wibGlnaHRcIiwgXCJkYXJrXCJdLmluY2x1ZGVzKHRoZW1lTWV0YS5jb2xvclNjaGVtYSB8fCBcIlwiKSA/IHRoZW1lTWV0YS5jb2xvclNjaGVtYSA6IHZvaWQgMDtcblx0aWYgKHRoZW1lQ29sb3JTY2hlbWEgJiYgY29uZmlnLmNvbG9yU2NoZW1hICE9PSB0aGVtZUNvbG9yU2NoZW1hKSB3YXJuKGBDb2xvciBzY2hlbWEgXCIke2NvbmZpZy5jb2xvclNjaGVtYX1cIiBkb2VzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHRoZW1lYCk7XG5cdGlmICh0aGVtZUhpZ2h0bGlnaHRlciAmJiBjb25maWcuaGlnaGxpZ2h0ZXIgIT09IHRoZW1lSGlnaHRsaWdodGVyKSB3YXJuKGBTeW50YXggaGlnaGxpZ2h0ZXIgXCIke2NvbmZpZy5oaWdobGlnaHRlcn1cIiBkb2VzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHRoZW1lYCk7XG5cdGlmIChjb25maWcuY3NzICE9PSBcInVub2Nzc1wiKSB7XG5cdFx0d2FybihgVW5zdXBwb3J0ZWQgQXRvbWljIENTUyBlbmdpbmUgXCIke2NvbmZpZy5jc3N9XCIsIGZhbGxiYWNrIHRvIFVub0NTU2ApO1xuXHRcdGNvbmZpZy5jc3MgPSBcInVub2Nzc1wiO1xuXHR9XG59XG5mdW5jdGlvbiByZXNvbHZlRm9udHMoZm9udHMgPSB7fSkge1xuXHRjb25zdCB7IGZhbGxiYWNrcyA9IHRydWUsIGl0YWxpYyA9IGZhbHNlLCBwcm92aWRlciA9IFwiZ29vZ2xlXCIgfSA9IGZvbnRzO1xuXHRsZXQgc2FucyA9IHRvQXJyYXkoZm9udHMuc2FucykuZmxhdE1hcCgoaSkgPT4gaS5zcGxpdChcIixcIikpLm1hcCgoaSkgPT4gaS50cmltKCkpO1xuXHRsZXQgc2VyaWYgPSB0b0FycmF5KGZvbnRzLnNlcmlmKS5mbGF0TWFwKChpKSA9PiBpLnNwbGl0KFwiLFwiKSkubWFwKChpKSA9PiBpLnRyaW0oKSk7XG5cdGxldCBtb25vID0gdG9BcnJheShmb250cy5tb25vKS5mbGF0TWFwKChpKSA9PiBpLnNwbGl0KFwiLFwiKSkubWFwKChpKSA9PiBpLnRyaW0oKSk7XG5cdGNvbnN0IHdlaWdodHMgPSB0b0FycmF5KGZvbnRzLndlaWdodHMgfHwgXCIyMDAsNDAwLDYwMFwiKS5mbGF0TWFwKChpKSA9PiBpLnRvU3RyaW5nKCkuc3BsaXQoXCIsXCIpKS5tYXAoKGkpID0+IGkudHJpbSgpKTtcblx0Y29uc3QgY3VzdG9tID0gdG9BcnJheShmb250cy5jdXN0b20pLmZsYXRNYXAoKGkpID0+IGkuc3BsaXQoXCIsXCIpKS5tYXAoKGkpID0+IGkudHJpbSgpKTtcblx0Y29uc3QgbG9jYWwgPSB0b0FycmF5KGZvbnRzLmxvY2FsKS5mbGF0TWFwKChpKSA9PiBpLnNwbGl0KFwiLFwiKSkubWFwKChpKSA9PiBpLnRyaW0oKSk7XG5cdGNvbnN0IHdlYmZvbnRzID0gZm9udHMud2ViZm9udHMgPyBmb250cy53ZWJmb250cyA6IGZhbGxiYWNrcyA/IHVuaXEoW1xuXHRcdC4uLnNhbnMsXG5cdFx0Li4uc2VyaWYsXG5cdFx0Li4ubW9ubyxcblx0XHQuLi5jdXN0b21cblx0XSkuZmlsdGVyKChpKSA9PiAhbG9jYWwuaW5jbHVkZXMoaSkpIDogW107XG5cdGZ1bmN0aW9uIHRvUXVvdGVkKGZvbnQpIHtcblx0XHRpZiAoUkVfUVVPVEVEX1NUUklORy50ZXN0KGZvbnQpKSByZXR1cm4gZm9udDtcblx0XHRyZXR1cm4gYFwiJHtmb250fVwiYDtcblx0fVxuXHRpZiAoZmFsbGJhY2tzKSB7XG5cdFx0c2FucyA9IHVuaXEoW1xuXHRcdFx0Li4uc2Fucy5tYXAodG9RdW90ZWQpLFxuXHRcdFx0XCJ1aS1zYW5zLXNlcmlmXCIsXG5cdFx0XHRcInN5c3RlbS11aVwiLFxuXHRcdFx0XCItYXBwbGUtc3lzdGVtXCIsXG5cdFx0XHRcIkJsaW5rTWFjU3lzdGVtRm9udFwiLFxuXHRcdFx0XCJcXFwiU2Vnb2UgVUlcXFwiXCIsXG5cdFx0XHRcIlJvYm90b1wiLFxuXHRcdFx0XCJcXFwiSGVsdmV0aWNhIE5ldWVcXFwiXCIsXG5cdFx0XHRcIkFyaWFsXCIsXG5cdFx0XHRcIlxcXCJOb3RvIFNhbnNcXFwiXCIsXG5cdFx0XHRcInNhbnMtc2VyaWZcIixcblx0XHRcdFwiXFxcIkFwcGxlIENvbG9yIEVtb2ppXFxcIlwiLFxuXHRcdFx0XCJcXFwiU2Vnb2UgVUkgRW1vamlcXFwiXCIsXG5cdFx0XHRcIlxcXCJTZWdvZSBVSSBTeW1ib2xcXFwiXCIsXG5cdFx0XHRcIlxcXCJOb3RvIENvbG9yIEVtb2ppXFxcIlwiXG5cdFx0XSk7XG5cdFx0c2VyaWYgPSB1bmlxKFtcblx0XHRcdC4uLnNlcmlmLm1hcCh0b1F1b3RlZCksXG5cdFx0XHRcInVpLXNlcmlmXCIsXG5cdFx0XHRcIkdlb3JnaWFcIixcblx0XHRcdFwiQ2FtYnJpYVwiLFxuXHRcdFx0XCJcXFwiVGltZXMgTmV3IFJvbWFuXFxcIlwiLFxuXHRcdFx0XCJUaW1lc1wiLFxuXHRcdFx0XCJzZXJpZlwiXG5cdFx0XSk7XG5cdFx0bW9ubyA9IHVuaXEoW1xuXHRcdFx0Li4ubW9uby5tYXAodG9RdW90ZWQpLFxuXHRcdFx0XCJ1aS1tb25vc3BhY2VcIixcblx0XHRcdFwiU0ZNb25vLVJlZ3VsYXJcIixcblx0XHRcdFwiTWVubG9cIixcblx0XHRcdFwiTW9uYWNvXCIsXG5cdFx0XHRcIkNvbnNvbGFzXCIsXG5cdFx0XHRcIlxcXCJMaWJlcmF0aW9uIE1vbm9cXFwiXCIsXG5cdFx0XHRcIlxcXCJDb3VyaWVyIE5ld1xcXCJcIixcblx0XHRcdFwibW9ub3NwYWNlXCJcblx0XHRdKTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdHNhbnMsXG5cdFx0c2VyaWYsXG5cdFx0bW9ubyxcblx0XHR3ZWJmb250cyxcblx0XHRwcm92aWRlcixcblx0XHRsb2NhbCxcblx0XHRpdGFsaWMsXG5cdFx0d2VpZ2h0c1xuXHR9O1xufVxuZnVuY3Rpb24gcmVzb2x2ZURyYXdpbmdzKG9wdGlvbnMgPSB7fSwgZmlsZXBhdGgpIHtcblx0Y29uc3QgeyBlbmFibGVkID0gdHJ1ZSwgcGVyc2lzdCA9IGZhbHNlLCBwcmVzZW50ZXJPbmx5ID0gZmFsc2UsIHN5bmNBbGwgPSB0cnVlIH0gPSBvcHRpb25zO1xuXHRyZXR1cm4ge1xuXHRcdGVuYWJsZWQsXG5cdFx0cGVyc2lzdDogdHlwZW9mIHBlcnNpc3QgPT09IFwic3RyaW5nXCIgPyBwZXJzaXN0IDogcGVyc2lzdCA/IGAuc2xpZGV2L2RyYXdpbmdzJHtmaWxlcGF0aCA/IGAvJHtmaWxlcGF0aC5tYXRjaChSRV9GSUxFTkFNRV9TVEVNKT8uWzFdfWAgOiBcIlwifWAgOiBmYWxzZSxcblx0XHRwcmVzZW50ZXJPbmx5LFxuXHRcdHN5bmNBbGxcblx0fTtcbn1cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNyYy9jb3JlLnRzXG5jb25zdCBSRV9GUk9OVE1BVFRFUiA9IC9eLS0tLipcXHI/XFxuKFtcXHNcXFNdKj8pLS0tLztcbmNvbnN0IFJFX1lBTUxfQ09ERUJMT0NLID0gL15cXHMqYGBgeWE/bWwoW1xcc1xcU10qPylgYGAvO1xuY29uc3QgUkVfRE9MTEFSX0lOTElORSA9IC9cXCQuKj9cXCQvO1xuY29uc3QgUkVfRE9MTEFSX0JMT0NLID0gL1xcJFxcJC87XG5jb25zdCBSRV9NT05BQ09fQkxPQ0sgPSAvXFx7bW9uYWNvLipcXH0vO1xuY29uc3QgUkVfVFdFRVRfVEFHID0gLzxUd2VldFxcYi87XG5jb25zdCBSRV9CTFVFU0tZX1RBRyA9IC88Qmx1ZVNreVxcYi87XG5jb25zdCBSRV9NRVJNQUlEX0NPREVCTE9DSyA9IC9eYGBgbWVybWFpZC9tO1xuY29uc3QgUkVfSEVBRElORyA9IC9eKCMrKSAoLiopJC9tO1xuY29uc3QgUkVfQ09ERV9CTE9DSyA9IC9eYGBgW1xcc1xcU10rP15gYGAvZ207XG5jb25zdCBSRV9MRUFESU5HX0JBQ0tUSUNLUyA9IC9eXFxzKmArLztcbmNvbnN0IFJFX0NSTEYgPSAvXFxyP1xcbi9nO1xuZnVuY3Rpb24gYWR2YW5jZUh0bWxDb21tZW50U3RhdGUobGluZSwgaW5IdG1sQ29tbWVudCkge1xuXHRsZXQgY3Vyc29yID0gMDtcblx0d2hpbGUgKGN1cnNvciA8IGxpbmUubGVuZ3RoKSBpZiAoaW5IdG1sQ29tbWVudCkge1xuXHRcdGNvbnN0IGVuZCA9IGxpbmUuaW5kZXhPZihcIi0tPlwiLCBjdXJzb3IpO1xuXHRcdGlmIChlbmQgPCAwKSByZXR1cm4gdHJ1ZTtcblx0XHRpbkh0bWxDb21tZW50ID0gZmFsc2U7XG5cdFx0Y3Vyc29yID0gZW5kICsgMztcblx0fSBlbHNlIHtcblx0XHRjb25zdCBzdGFydCA9IGxpbmUuaW5kZXhPZihcIjwhLS1cIiwgY3Vyc29yKTtcblx0XHRpZiAoc3RhcnQgPCAwKSByZXR1cm4gZmFsc2U7XG5cdFx0Y29uc3QgZW5kID0gbGluZS5pbmRleE9mKFwiLS0+XCIsIHN0YXJ0ICsgNCk7XG5cdFx0aWYgKGVuZCA8IDApIHJldHVybiB0cnVlO1xuXHRcdGN1cnNvciA9IGVuZCArIDM7XG5cdH1cblx0cmV0dXJuIGluSHRtbENvbW1lbnQ7XG59XG5mdW5jdGlvbiBzdHJpbmdpZnkoZGF0YSkge1xuXHRyZXR1cm4gYCR7ZGF0YS5zbGlkZXMubWFwKHN0cmluZ2lmeVNsaWRlKS5qb2luKFwiXFxuXCIpLnRyaW0oKX1cXG5gO1xufVxuZnVuY3Rpb24gc3RyaW5naWZ5U2xpZGUoZGF0YSwgaWR4ID0gMCkge1xuXHRyZXR1cm4gZGF0YS5yYXcuc3RhcnRzV2l0aChcIi0tLVwiKSB8fCBpZHggPT09IDAgPyBkYXRhLnJhdyA6IGAtLS1cXG4ke2Vuc3VyZVByZWZpeChcIlxcblwiLCBkYXRhLnJhdyl9YDtcbn1cbmZ1bmN0aW9uIHByZXR0aWZ5U2xpZGUoZGF0YSkge1xuXHRkYXRhLmNvbnRlbnQgPSBkYXRhLmNvbnRlbnQudHJpbSgpID8gYFxcbiR7ZGF0YS5jb250ZW50LnRyaW0oKX1cXG5gIDogXCJcIjtcblx0ZGF0YS5yYXcgPSBkYXRhLmZyb250bWF0dGVyRG9jPy5jb250ZW50cyA/IGRhdGEuZnJvbnRtYXR0ZXJTdHlsZSA9PT0gXCJ5YW1sXCIgPyBgXFxgXFxgXFxgeWFtbFxcbiR7ZGF0YS5mcm9udG1hdHRlckRvYy50b1N0cmluZygpLnRyaW0oKX1cXG5cXGBcXGBcXGBcXG4ke2RhdGEuY29udGVudH1gIDogYC0tLVxcbiR7ZGF0YS5mcm9udG1hdHRlckRvYy50b1N0cmluZygpLnRyaW0oKX1cXG4tLS1cXG4ke2RhdGEuY29udGVudH1gIDogZGF0YS5jb250ZW50O1xuXHRpZiAoZGF0YS5ub3RlKSBkYXRhLnJhdyArPSBgXFxuPCEtLVxcbiR7ZGF0YS5ub3RlLnRyaW0oKX1cXG4tLT5cXG5gO1xuXHRyZXR1cm4gZGF0YTtcbn1cbmZ1bmN0aW9uIHByZXR0aWZ5KGRhdGEpIHtcblx0ZGF0YS5zbGlkZXMuZm9yRWFjaChwcmV0dGlmeVNsaWRlKTtcblx0cmV0dXJuIGRhdGE7XG59XG5mdW5jdGlvbiBtYXR0ZXIoY29kZSwgb3B0aW9ucykge1xuXHRsZXQgdHlwZTtcblx0bGV0IHJhdztcblx0bGV0IGNvbnRlbnQgPSBjb2RlLnJlcGxhY2UoUkVfRlJPTlRNQVRURVIsIChfLCBmKSA9PiB7XG5cdFx0dHlwZSA9IFwiZnJvbnRtYXR0ZXJcIjtcblx0XHRyYXcgPSBmO1xuXHRcdHJldHVybiBcIlwiO1xuXHR9KTtcblx0aWYgKHR5cGUgIT09IFwiZnJvbnRtYXR0ZXJcIikgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZShSRV9ZQU1MX0NPREVCTE9DSywgKF8sIGYpID0+IHtcblx0XHR0eXBlID0gXCJ5YW1sXCI7XG5cdFx0cmF3ID0gZjtcblx0XHRyZXR1cm4gXCJcIjtcblx0fSk7XG5cdGNvbnN0IGRvYyA9IHJhdyAmJiAhb3B0aW9ucy5ub1BhcnNlWUFNTCA/IFlBTUwucGFyc2VEb2N1bWVudChyYXcpIDogdm9pZCAwO1xuXHRyZXR1cm4ge1xuXHRcdHR5cGUsXG5cdFx0cmF3LFxuXHRcdGRvYyxcblx0XHRkYXRhOiBkb2M/LnRvSlNPTigpLFxuXHRcdGNvbnRlbnRcblx0fTtcbn1cbmNvbnN0IElNQUdFX0VYVEVOU0lPTlMgPSAvXFwuKD86cG5nfGpwZT9nfGdpZnxzdmd8d2VicHxhdmlmfGljb3xibXB8dGlmZj8pJC9pO1xuY29uc3QgUkVfTURfSU1BR0VfVElUTEUgPSAvXFxzKyg/OlwiW15cIl0qXCJ8J1teJ10qJylcXHMqJC87XG4vKipcbiogU3RyaXAgdGhlIG9wdGlvbmFsIENvbW1vbk1hcmsgdGl0bGUgYW5kIHRoZSBhbmdsZS1icmFja2V0IGZvcm0gZnJvbSBhXG4qIG1hcmtkb3duIGltYWdlIGRlc3RpbmF0aW9uLCBzbyBgIVthXSgveC5wbmcgXCJUaXRsZVwiKWAgeWllbGRzIGAveC5wbmdgLlxuKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZU1hcmtkb3duSW1hZ2VUYXJnZXQodGFyZ2V0KSB7XG5cdGNvbnN0IHVybCA9IHRhcmdldC50cmltKCkucmVwbGFjZShSRV9NRF9JTUFHRV9USVRMRSwgXCJcIikudHJpbSgpO1xuXHRyZXR1cm4gdXJsLnN0YXJ0c1dpdGgoXCI8XCIpICYmIHVybC5lbmRzV2l0aChcIj5cIikgPyB1cmwuc2xpY2UoMSwgLTEpLnRyaW0oKSA6IHVybDtcbn1cbi8qKlxuKiBFeHRyYWN0IGltYWdlIFVSTHMgZnJvbSBzbGlkZSBjb250ZW50IGFuZCBmcm9udG1hdHRlci5cbiogU3RyaXBzIGNvZGUgYmxvY2tzIGZpcnN0IHRvIGF2b2lkIGZhbHNlIHBvc2l0aXZlcy5cbiovXG5mdW5jdGlvbiBleHRyYWN0SW1hZ2VzVXNhZ2UoY29udGVudCwgZnJvbnRtYXR0ZXIpIHtcblx0Y29uc3QgaW1hZ2VzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcblx0Zm9yIChjb25zdCBrZXkgb2YgW1xuXHRcdFwiaW1hZ2VcIixcblx0XHRcImJhY2tncm91bmRJbWFnZVwiLFxuXHRcdFwiYmFja2dyb3VuZFwiXG5cdF0pIHtcblx0XHRjb25zdCB2YWwgPSBmcm9udG1hdHRlcltrZXldO1xuXHRcdGlmICh0eXBlb2YgdmFsID09PSBcInN0cmluZ1wiICYmIHZhbCAmJiAhdmFsLnN0YXJ0c1dpdGgoXCJkYXRhOlwiKSkge1xuXHRcdFx0aWYgKGtleSA9PT0gXCJiYWNrZ3JvdW5kXCIpIHtcblx0XHRcdFx0aWYgKElNQUdFX0VYVEVOU0lPTlMudGVzdCh2YWwpIHx8IHZhbC5zdGFydHNXaXRoKFwiL1wiKSB8fCB2YWwuc3RhcnRzV2l0aChcImh0dHBcIikpIGltYWdlcy5hZGQodmFsKTtcblx0XHRcdH0gZWxzZSBpbWFnZXMuYWRkKHZhbCk7XG5cdFx0fVxuXHR9XG5cdGNvbnN0IHN0cmlwcGVkID0gY29udGVudC5yZXBsYWNlKFJFX0NPREVfQkxPQ0ssIFwiXCIpO1xuXHRmb3IgKGNvbnN0IFssIHRhcmdldF0gb2Ygc3RyaXBwZWQubWF0Y2hBbGwoLyFcXFtbXlxcXV0qXFxdXFwoKFteKV0rKVxcKS9nKSkge1xuXHRcdGNvbnN0IHVybCA9IG5vcm1hbGl6ZU1hcmtkb3duSW1hZ2VUYXJnZXQodGFyZ2V0KTtcblx0XHRpZiAodXJsICYmICF1cmwuc3RhcnRzV2l0aChcImRhdGE6XCIpKSBpbWFnZXMuYWRkKHVybCk7XG5cdH1cblx0Zm9yIChjb25zdCBbLCB1cmxdIG9mIHN0cmlwcGVkLm1hdGNoQWxsKC9cXGIoPzpzcmN8aW1hZ2UpPVtcIiddKFteXCInXSspW1wiJ10vZykpIGlmICh1cmwgJiYgIXVybC5zdGFydHNXaXRoKFwiZGF0YTpcIikgJiYgIXVybC5pbmNsdWRlcyhcInt7XCIpICYmIElNQUdFX0VYVEVOU0lPTlMudGVzdCh1cmwpKSBpbWFnZXMuYWRkKHVybC50cmltKCkpO1xuXHRmb3IgKGNvbnN0IFssIHVybF0gb2Ygc3RyaXBwZWQubWF0Y2hBbGwoLzooPzpzcmN8aW1hZ2UpPVtcIiddJyhbXiddKyknW1wiJ10vZykpIGlmICh1cmwgJiYgIXVybC5zdGFydHNXaXRoKFwiZGF0YTpcIikgJiYgSU1BR0VfRVhURU5TSU9OUy50ZXN0KHVybCkpIGltYWdlcy5hZGQodXJsLnRyaW0oKSk7XG5cdGZvciAoY29uc3QgWywgdXJsXSBvZiBzdHJpcHBlZC5tYXRjaEFsbCgvdXJsXFwoW1wiJ10/KFteXCInKV0rKVtcIiddP1xcKS9nKSkgaWYgKHVybCAmJiAhdXJsLnN0YXJ0c1dpdGgoXCJkYXRhOlwiKSAmJiBJTUFHRV9FWFRFTlNJT05TLnRlc3QodXJsKSkgaW1hZ2VzLmFkZCh1cmwudHJpbSgpKTtcblx0cmV0dXJuIEFycmF5LmZyb20oaW1hZ2VzKTtcbn1cbmZ1bmN0aW9uIGRldGVjdEZlYXR1cmVzKGNvZGUpIHtcblx0cmV0dXJuIHtcblx0XHRrYXRleDogISFjb2RlLm1hdGNoKFJFX0RPTExBUl9JTkxJTkUpIHx8ICEhY29kZS5tYXRjaChSRV9ET0xMQVJfQkxPQ0spLFxuXHRcdG1vbmFjbzogUkVfTU9OQUNPX0JMT0NLLnRlc3QoY29kZSkgPyBzY2FuTW9uYWNvUmVmZXJlbmNlZE1vZHMoY29kZSkgOiBmYWxzZSxcblx0XHR0d2VldDogISFjb2RlLm1hdGNoKFJFX1RXRUVUX1RBRyksXG5cdFx0Ymx1ZXNreTogISFjb2RlLm1hdGNoKFJFX0JMVUVTS1lfVEFHKSxcblx0XHRtZXJtYWlkOiAhIWNvZGUubWF0Y2goUkVfTUVSTUFJRF9DT0RFQkxPQ0spXG5cdH07XG59XG5mdW5jdGlvbiBwYXJzZVNsaWRlKHJhdywgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IG1hdHRlclJlc3VsdCA9IG1hdHRlcihyYXcsIG9wdGlvbnMpO1xuXHRsZXQgbm90ZTtcblx0Y29uc3QgZnJvbnRtYXR0ZXIgPSBtYXR0ZXJSZXN1bHQuZGF0YSB8fCB7fTtcblx0bGV0IGNvbnRlbnQgPSBtYXR0ZXJSZXN1bHQuY29udGVudC50cmltKCk7XG5cdGNvbnN0IHJldmlzaW9uID0gaGFzaChyYXcudHJpbSgpKTtcblx0Y29uc3QgY29tbWVudHMgPSBBcnJheS5mcm9tKGNvbnRlbnQubWF0Y2hBbGwoLzwhLS0oW1xcc1xcU10qPyktLT4vZykpO1xuXHRpZiAoY29tbWVudHMubGVuZ3RoKSB7XG5cdFx0Y29uc3QgbGFzdCA9IGNvbW1lbnRzW2NvbW1lbnRzLmxlbmd0aCAtIDFdO1xuXHRcdGlmIChsYXN0LmluZGV4ICE9PSB2b2lkIDAgJiYgbGFzdC5pbmRleCArIGxhc3RbMF0ubGVuZ3RoID49IGNvbnRlbnQubGVuZ3RoKSB7XG5cdFx0XHRub3RlID0gbGFzdFsxXS50cmltKCk7XG5cdFx0XHRjb250ZW50ID0gY29udGVudC5zbGljZSgwLCBsYXN0LmluZGV4KS50cmltKCk7XG5cdFx0fVxuXHR9XG5cdGxldCB0aXRsZTtcblx0bGV0IGxldmVsO1xuXHRpZiAoZnJvbnRtYXR0ZXIudGl0bGUgfHwgZnJvbnRtYXR0ZXIubmFtZSkgdGl0bGUgPSBmcm9udG1hdHRlci50aXRsZSB8fCBmcm9udG1hdHRlci5uYW1lO1xuXHRlbHNlIHtcblx0XHRjb25zdCBtYXRjaCA9IGNvbnRlbnQucmVwbGFjZShSRV9DT0RFX0JMT0NLLCBcIlwiKS5tYXRjaChSRV9IRUFESU5HKTtcblx0XHR0aXRsZSA9IG1hdGNoPy5bMl0/LnRyaW0oKTtcblx0XHRsZXZlbCA9IG1hdGNoPy5bMV0/Lmxlbmd0aDtcblx0fVxuXHRpZiAoZnJvbnRtYXR0ZXIubGV2ZWwpIGxldmVsID0gZnJvbnRtYXR0ZXIubGV2ZWwgfHwgMTtcblx0Y29uc3QgaW1hZ2VzID0gZXh0cmFjdEltYWdlc1VzYWdlKGNvbnRlbnQsIGZyb250bWF0dGVyKTtcblx0cmV0dXJuIHtcblx0XHRyYXcsXG5cdFx0dGl0bGUsXG5cdFx0bGV2ZWwsXG5cdFx0cmV2aXNpb24sXG5cdFx0Y29udGVudCxcblx0XHRjb250ZW50UmF3OiBjb250ZW50LFxuXHRcdGZyb250bWF0dGVyLFxuXHRcdGZyb250bWF0dGVyU3R5bGU6IG1hdHRlclJlc3VsdC50eXBlLFxuXHRcdGZyb250bWF0dGVyRG9jOiBtYXR0ZXJSZXN1bHQuZG9jLFxuXHRcdGZyb250bWF0dGVyUmF3OiBtYXR0ZXJSZXN1bHQucmF3LFxuXHRcdG5vdGUsXG5cdFx0aW1hZ2VzXG5cdH07XG59XG5hc3luYyBmdW5jdGlvbiBwYXJzZShtYXJrZG93biwgZmlsZXBhdGgsIGV4dGVuc2lvbnMsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCBsaW5lcyA9IG1hcmtkb3duLnNwbGl0KG9wdGlvbnMucHJlc2VydmVDUiA/IFwiXFxuXCIgOiBSRV9DUkxGKTtcblx0Y29uc3Qgc2xpZGVzID0gW107XG5cdGxldCBzdGFydCA9IDA7XG5cdGxldCBjb250ZW50U3RhcnQgPSAwO1xuXHRsZXQgaW5IdG1sQ29tbWVudCA9IGZhbHNlO1xuXHRhc3luYyBmdW5jdGlvbiBzbGljZShlbmQpIHtcblx0XHRpZiAoc3RhcnQgPT09IGVuZCkgcmV0dXJuO1xuXHRcdGNvbnN0IHNsaWRlID0ge1xuXHRcdFx0Li4ucGFyc2VTbGlkZShsaW5lcy5zbGljZShzdGFydCwgZW5kKS5qb2luKFwiXFxuXCIpLCBvcHRpb25zKSxcblx0XHRcdGZpbGVwYXRoLFxuXHRcdFx0aW5kZXg6IHNsaWRlcy5sZW5ndGgsXG5cdFx0XHRzdGFydCxcblx0XHRcdGNvbnRlbnRTdGFydCxcblx0XHRcdGVuZFxuXHRcdH07XG5cdFx0aWYgKGV4dGVuc2lvbnMpIGZvciAoY29uc3QgZSBvZiBleHRlbnNpb25zKSB7XG5cdFx0XHRpZiAoZS50cmFuc2Zvcm1TbGlkZSkge1xuXHRcdFx0XHRjb25zdCBuZXdDb250ZW50ID0gYXdhaXQgZS50cmFuc2Zvcm1TbGlkZShzbGlkZS5jb250ZW50LCBzbGlkZS5mcm9udG1hdHRlcik7XG5cdFx0XHRcdGlmIChuZXdDb250ZW50ICE9PSB2b2lkIDApIHNsaWRlLmNvbnRlbnQgPSBuZXdDb250ZW50O1xuXHRcdFx0XHRpZiAodHlwZW9mIHNsaWRlLmZyb250bWF0dGVyLnRpdGxlID09PSBcInN0cmluZ1wiKSBzbGlkZS50aXRsZSA9IHNsaWRlLmZyb250bWF0dGVyLnRpdGxlO1xuXHRcdFx0XHRpZiAodHlwZW9mIHNsaWRlLmZyb250bWF0dGVyLmxldmVsID09PSBcIm51bWJlclwiKSBzbGlkZS5sZXZlbCA9IHNsaWRlLmZyb250bWF0dGVyLmxldmVsO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGUudHJhbnNmb3JtTm90ZSkge1xuXHRcdFx0XHRjb25zdCBuZXdOb3RlID0gYXdhaXQgZS50cmFuc2Zvcm1Ob3RlKHNsaWRlLm5vdGUsIHNsaWRlLmZyb250bWF0dGVyKTtcblx0XHRcdFx0aWYgKG5ld05vdGUgIT09IHZvaWQgMCkgc2xpZGUubm90ZSA9IG5ld05vdGU7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHNsaWRlcy5wdXNoKHNsaWRlKTtcblx0XHRzdGFydCA9IGVuZCArIDE7XG5cdFx0Y29udGVudFN0YXJ0ID0gZW5kICsgMTtcblx0fVxuXHRpZiAoZXh0ZW5zaW9ucykge1xuXHRcdGZvciAoY29uc3QgZSBvZiBleHRlbnNpb25zKSBpZiAoZS50cmFuc2Zvcm1SYXdMaW5lcykgYXdhaXQgZS50cmFuc2Zvcm1SYXdMaW5lcyhsaW5lcyk7XG5cdH1cblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xuXHRcdGNvbnN0IHJhd0xpbmUgPSBsaW5lc1tpXTtcblx0XHRjb25zdCBsaW5lID0gcmF3TGluZS50cmltRW5kKCk7XG5cdFx0aWYgKGluSHRtbENvbW1lbnQpIHtcblx0XHRcdGluSHRtbENvbW1lbnQgPSBhZHZhbmNlSHRtbENvbW1lbnRTdGF0ZShyYXdMaW5lLCB0cnVlKTtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblx0XHRpZiAobGluZS5zdGFydHNXaXRoKFwiLS0tXCIpKSB7XG5cdFx0XHRhd2FpdCBzbGljZShpKTtcblx0XHRcdGNvbnN0IG5leHQgPSBsaW5lc1tpICsgMV07XG5cdFx0XHRpZiAobGluZVszXSAhPT0gXCItXCIgJiYgbmV4dD8udHJpbSgpKSB7XG5cdFx0XHRcdHN0YXJ0ID0gaTtcblx0XHRcdFx0Zm9yIChpICs9IDE7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykgaWYgKGxpbmVzW2ldLnRyaW1FbmQoKSA9PT0gXCItLS1cIikgYnJlYWs7XG5cdFx0XHRcdGNvbnRlbnRTdGFydCA9IGkgKyAxO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAobGluZS50cmltU3RhcnQoKS5zdGFydHNXaXRoKFwiYGBgXCIpKSB7XG5cdFx0XHRjb25zdCBjb2RlQmxvY2tMZXZlbCA9IGxpbmUubWF0Y2goUkVfTEVBRElOR19CQUNLVElDS1MpWzBdO1xuXHRcdFx0bGV0IGogPSBpICsgMTtcblx0XHRcdGZvciAoOyBqIDwgbGluZXMubGVuZ3RoOyBqKyspIGlmIChsaW5lc1tqXS5zdGFydHNXaXRoKGNvZGVCbG9ja0xldmVsKSkgYnJlYWs7XG5cdFx0XHRpZiAoaiAhPT0gbGluZXMubGVuZ3RoKSBpID0gajtcblx0XHR9IGVsc2UgaW5IdG1sQ29tbWVudCA9IGFkdmFuY2VIdG1sQ29tbWVudFN0YXRlKHJhd0xpbmUsIGZhbHNlKTtcblx0fVxuXHRpZiAoc3RhcnQgPD0gbGluZXMubGVuZ3RoIC0gMSkgYXdhaXQgc2xpY2UobGluZXMubGVuZ3RoKTtcblx0cmV0dXJuIHtcblx0XHRmaWxlcGF0aCxcblx0XHRyYXc6IG1hcmtkb3duLFxuXHRcdHNsaWRlc1xuXHR9O1xufVxuZnVuY3Rpb24gcGFyc2VTeW5jKG1hcmtkb3duLCBmaWxlcGF0aCwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IGxpbmVzID0gbWFya2Rvd24uc3BsaXQob3B0aW9ucy5wcmVzZXJ2ZUNSID8gXCJcXG5cIiA6IFJFX0NSTEYpO1xuXHRjb25zdCBzbGlkZXMgPSBbXTtcblx0bGV0IHN0YXJ0ID0gMDtcblx0bGV0IGNvbnRlbnRTdGFydCA9IDA7XG5cdGxldCBpbkh0bWxDb21tZW50ID0gZmFsc2U7XG5cdGZ1bmN0aW9uIHNsaWNlKGVuZCkge1xuXHRcdGlmIChzdGFydCA9PT0gZW5kKSByZXR1cm47XG5cdFx0Y29uc3Qgc2xpZGUgPSB7XG5cdFx0XHQuLi5wYXJzZVNsaWRlKGxpbmVzLnNsaWNlKHN0YXJ0LCBlbmQpLmpvaW4oXCJcXG5cIiksIG9wdGlvbnMpLFxuXHRcdFx0ZmlsZXBhdGgsXG5cdFx0XHRpbmRleDogc2xpZGVzLmxlbmd0aCxcblx0XHRcdHN0YXJ0LFxuXHRcdFx0Y29udGVudFN0YXJ0LFxuXHRcdFx0ZW5kXG5cdFx0fTtcblx0XHRzbGlkZXMucHVzaChzbGlkZSk7XG5cdFx0c3RhcnQgPSBlbmQgKyAxO1xuXHRcdGNvbnRlbnRTdGFydCA9IGVuZCArIDE7XG5cdH1cblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xuXHRcdGNvbnN0IHJhd0xpbmUgPSBsaW5lc1tpXTtcblx0XHRjb25zdCBsaW5lID0gcmF3TGluZS50cmltRW5kKCk7XG5cdFx0aWYgKGluSHRtbENvbW1lbnQpIHtcblx0XHRcdGluSHRtbENvbW1lbnQgPSBhZHZhbmNlSHRtbENvbW1lbnRTdGF0ZShyYXdMaW5lLCB0cnVlKTtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblx0XHRpZiAobGluZS5zdGFydHNXaXRoKFwiLS0tXCIpKSB7XG5cdFx0XHRzbGljZShpKTtcblx0XHRcdGNvbnN0IG5leHQgPSBsaW5lc1tpICsgMV07XG5cdFx0XHRpZiAobGluZVszXSAhPT0gXCItXCIgJiYgbmV4dD8udHJpbSgpKSB7XG5cdFx0XHRcdHN0YXJ0ID0gaTtcblx0XHRcdFx0Zm9yIChpICs9IDE7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykgaWYgKGxpbmVzW2ldLnRyaW1FbmQoKSA9PT0gXCItLS1cIikgYnJlYWs7XG5cdFx0XHRcdGNvbnRlbnRTdGFydCA9IGkgKyAxO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAobGluZS50cmltU3RhcnQoKS5zdGFydHNXaXRoKFwiYGBgXCIpKSB7XG5cdFx0XHRjb25zdCBjb2RlQmxvY2tMZXZlbCA9IGxpbmUubWF0Y2goUkVfTEVBRElOR19CQUNLVElDS1MpWzBdO1xuXHRcdFx0bGV0IGogPSBpICsgMTtcblx0XHRcdGZvciAoOyBqIDwgbGluZXMubGVuZ3RoOyBqKyspIGlmIChsaW5lc1tqXS5zdGFydHNXaXRoKGNvZGVCbG9ja0xldmVsKSkgYnJlYWs7XG5cdFx0XHRpZiAoaiAhPT0gbGluZXMubGVuZ3RoKSBpID0gajtcblx0XHR9IGVsc2UgaW5IdG1sQ29tbWVudCA9IGFkdmFuY2VIdG1sQ29tbWVudFN0YXRlKHJhd0xpbmUsIGZhbHNlKTtcblx0fVxuXHRpZiAoc3RhcnQgPD0gbGluZXMubGVuZ3RoIC0gMSkgc2xpY2UobGluZXMubGVuZ3RoKTtcblx0cmV0dXJuIHtcblx0XHRmaWxlcGF0aCxcblx0XHRyYXc6IG1hcmtkb3duLFxuXHRcdHNsaWRlc1xuXHR9O1xufVxuZnVuY3Rpb24gc2Nhbk1vbmFjb1JlZmVyZW5jZWRNb2RzKG1kKSB7XG5cdGNvbnN0IHR5cGVzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcblx0Y29uc3QgZGVwcyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG5cdG1kLnJlcGxhY2UoL15gYGAoXFx3KylcXHMqXFx7bW9uYWNvKFtefV0qKVxcfVxccyooXFxTW1xcc1xcU10qPyleYGBgL2dtLCAoZnVsbCwgbGFuZyA9IFwidHNcIiwga2luZCwgY29kZSkgPT4ge1xuXHRcdGxhbmcgPSBsYW5nLnRyaW0oKTtcblx0XHRjb25zdCBpc0RlcCA9IGtpbmQgPT09IFwiLXJ1blwiO1xuXHRcdGlmIChbXG5cdFx0XHRcImpzXCIsXG5cdFx0XHRcImphdmFzY3JpcHRcIixcblx0XHRcdFwidHNcIixcblx0XHRcdFwidHlwZXNjcmlwdFwiXG5cdFx0XS5pbmNsdWRlcyhsYW5nKSkge1xuXHRcdFx0Zm9yIChjb25zdCBbLCAsIHNwZWNpZmllcl0gb2YgY29kZS5tYXRjaEFsbCgvXFxzK2Zyb21cXHMrKFtcIiddKShbLy5cXHdALV0rKVxcMS9nKSkgaWYgKHNwZWNpZmllcikge1xuXHRcdFx0XHRpZiAoIVwiLi9cIi5pbmNsdWRlcyhzcGVjaWZpZXIpKSB0eXBlcy5hZGQoc3BlY2lmaWVyKTtcblx0XHRcdFx0aWYgKGlzRGVwKSBkZXBzLmFkZChzcGVjaWZpZXIpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gXCJcIjtcblx0fSk7XG5cdHJldHVybiB7XG5cdFx0dHlwZXM6IEFycmF5LmZyb20odHlwZXMpLFxuXHRcdGRlcHM6IEFycmF5LmZyb20oZGVwcylcblx0fTtcbn1cbmZ1bmN0aW9uIGhhc2goc3RyKSB7XG5cdGxldCBoYXNoID0gMDtcblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcblx0XHRoYXNoID0gKGhhc2ggPDwgNSkgLSBoYXNoICsgc3RyLmNoYXJDb2RlQXQoaSk7XG5cdFx0aGFzaCB8PSAwO1xuXHR9XG5cdHJldHVybiBoYXNoLnRvU3RyaW5nKDM2KS5zbGljZSgwLCAxMik7XG59XG4vLyNlbmRyZWdpb25cbmV4cG9ydCB7IGRldGVjdEZlYXR1cmVzLCBleHRyYWN0SW1hZ2VzVXNhZ2UsIGdldERlZmF1bHRDb25maWcsIHBhcnNlLCBwYXJzZUFzcGVjdFJhdGlvLCBwYXJzZVJhbmdlU3RyaW5nLCBwYXJzZVNsaWRlLCBwYXJzZVN5bmMsIHBhcnNlVGltZVN0cmluZywgcGFyc2VUaW1lc3BsaXRzLCBwcmV0dGlmeSwgcHJldHRpZnlTbGlkZSwgcmVzb2x2ZUNvbmZpZywgcmVzb2x2ZUZvbnRzLCBzdHJpbmdpZnksIHN0cmluZ2lmeVNsaWRlLCB2ZXJpZnlDb25maWcgfTtcbiIsImxldCBfbGF6eU1hdGNoID0gKCkgPT4geyB2YXIgX19saWJfXz0oKCk9Pnt2YXIgbT1PYmplY3QuZGVmaW5lUHJvcGVydHksVj1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLEc9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMsVD1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LHE9KHIsZSk9Pntmb3IodmFyIG4gaW4gZSltKHIsbix7Z2V0OmVbbl0sZW51bWVyYWJsZTp0cnVlfSk7fSxIPShyLGUsbixhKT0+e2lmKGUmJnR5cGVvZiBlPT1cIm9iamVjdFwifHx0eXBlb2YgZT09XCJmdW5jdGlvblwiKWZvcihsZXQgdCBvZiBHKGUpKSFULmNhbGwocix0KSYmdCE9PW4mJm0ocix0LHtnZXQ6KCk9PmVbdF0sZW51bWVyYWJsZTohKGE9VihlLHQpKXx8YS5lbnVtZXJhYmxlfSk7cmV0dXJuIHJ9LEo9cj0+SChtKHt9LFwiX19lc01vZHVsZVwiLHt2YWx1ZTp0cnVlfSksciksdz17fTtxKHcse2RlZmF1bHQ6KCk9PnJlfSk7dmFyIEE9cj0+QXJyYXkuaXNBcnJheShyKSxkPXI9PnR5cGVvZiByPT1cImZ1bmN0aW9uXCIsUT1yPT5yLmxlbmd0aD09PTAsVz1yPT50eXBlb2Ygcj09XCJudW1iZXJcIixLPXI9PnR5cGVvZiByPT1cIm9iamVjdFwiJiZyIT09bnVsbCxYPXI9PnIgaW5zdGFuY2VvZiBSZWdFeHAsYj1yPT50eXBlb2Ygcj09XCJzdHJpbmdcIixoPXI9PnI9PT12b2lkIDAsWT1yPT57Y29uc3QgZT1uZXcgTWFwO3JldHVybiBuPT57Y29uc3QgYT1lLmdldChuKTtpZihhKXJldHVybiBhO2NvbnN0IHQ9cihuKTtyZXR1cm4gZS5zZXQobix0KSx0fX0scnI9KHIsZSxuPXt9KT0+e2NvbnN0IGE9e2NhY2hlOnt9LGlucHV0OnIsaW5kZXg6MCxpbmRleE1heDowLG9wdGlvbnM6bixvdXRwdXQ6W119O2lmKHYoZSkoYSkmJmEuaW5kZXg9PT1yLmxlbmd0aClyZXR1cm4gYS5vdXRwdXQ7dGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcGFyc2UgYXQgaW5kZXggJHthLmluZGV4TWF4fWApfSxpPShyLGUpPT5BKHIpP2VyKHIsZSk6YihyKT9hcihyLGUpOm5yKHIsZSksZXI9KHIsZSk9Pntjb25zdCBuPXt9O2Zvcihjb25zdCBhIG9mIHIpe2lmKGEubGVuZ3RoIT09MSl0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY2hhcmFjdGVyOiBcIiR7YX1cImApO2NvbnN0IHQ9YS5jaGFyQ29kZUF0KDApO25bdF09dHJ1ZTt9cmV0dXJuIGE9Pntjb25zdCB0PWEuaW5kZXgsbz1hLmlucHV0O2Zvcig7YS5pbmRleDxvLmxlbmd0aCYmby5jaGFyQ29kZUF0KGEuaW5kZXgpaW4gbjspYS5pbmRleCs9MTtjb25zdCB1PWEuaW5kZXg7aWYodT50KXtpZighaChlKSYmIWEub3B0aW9ucy5zaWxlbnQpe2NvbnN0IHM9YS5pbnB1dC5zbGljZSh0LHUpLGM9ZChlKT9lKHMsbyxTdHJpbmcodCkpOmU7aChjKXx8YS5vdXRwdXQucHVzaChjKTt9YS5pbmRleE1heD1NYXRoLm1heChhLmluZGV4TWF4LGEuaW5kZXgpO31yZXR1cm4gIHRydWV9fSxucj0ocixlKT0+e2NvbnN0IG49ci5zb3VyY2UsYT1yLmZsYWdzLnJlcGxhY2UoL3l8JC8sXCJ5XCIpLHQ9bmV3IFJlZ0V4cChuLGEpO3JldHVybiBnKG89Pnt0Lmxhc3RJbmRleD1vLmluZGV4O2NvbnN0IHU9dC5leGVjKG8uaW5wdXQpO2lmKHUpe2lmKCFoKGUpJiYhby5vcHRpb25zLnNpbGVudCl7Y29uc3Qgcz1kKGUpP2UoLi4udSxvLmlucHV0LFN0cmluZyhvLmluZGV4KSk6ZTtoKHMpfHxvLm91dHB1dC5wdXNoKHMpO31yZXR1cm4gby5pbmRleCs9dVswXS5sZW5ndGgsby5pbmRleE1heD1NYXRoLm1heChvLmluZGV4TWF4LG8uaW5kZXgpLHRydWV9ZWxzZSByZXR1cm4gIGZhbHNlfSl9LGFyPShyLGUpPT5uPT57aWYobi5pbnB1dC5zdGFydHNXaXRoKHIsbi5pbmRleCkpe2lmKCFoKGUpJiYhbi5vcHRpb25zLnNpbGVudCl7Y29uc3QgdD1kKGUpP2UocixuLmlucHV0LFN0cmluZyhuLmluZGV4KSk6ZTtoKHQpfHxuLm91dHB1dC5wdXNoKHQpO31yZXR1cm4gbi5pbmRleCs9ci5sZW5ndGgsbi5pbmRleE1heD1NYXRoLm1heChuLmluZGV4TWF4LG4uaW5kZXgpLHRydWV9ZWxzZSByZXR1cm4gIGZhbHNlfSxDPShyLGUsbixhKT0+e2NvbnN0IHQ9dihyKTtyZXR1cm4gZyhfKE0obz0+e2xldCB1PTA7Zm9yKDt1PG47KXtjb25zdCBzPW8uaW5kZXg7aWYoIXQobyl8fCh1Kz0xLG8uaW5kZXg9PT1zKSlicmVha31yZXR1cm4gdT49ZX0pKSl9LHRyPShyLGUpPT5DKHIsMCwxKSxmPShyLGUpPT5DKHIsMCwxLzApLHg9KHIsZSk9Pntjb25zdCBuPXIubWFwKHYpO3JldHVybiBnKF8oTShhPT57Zm9yKGxldCB0PTAsbz1uLmxlbmd0aDt0PG87dCsrKWlmKCFuW3RdKGEpKXJldHVybiAgZmFsc2U7cmV0dXJuICB0cnVlfSkpKX0sbD0ocixlKT0+e2NvbnN0IG49ci5tYXAodik7cmV0dXJuIGcoXyhhPT57Zm9yKGxldCB0PTAsbz1uLmxlbmd0aDt0PG87dCsrKWlmKG5bdF0oYSkpcmV0dXJuICB0cnVlO3JldHVybiAgZmFsc2V9KSl9LE09KHIsZT1mYWxzZSk9Pntjb25zdCBuPXYocik7cmV0dXJuIGE9Pntjb25zdCB0PWEuaW5kZXgsbz1hLm91dHB1dC5sZW5ndGgsdT1uKGEpO3JldHVybiAoIXV8fGUpJiYoYS5pbmRleD10LGEub3V0cHV0Lmxlbmd0aCE9PW8mJihhLm91dHB1dC5sZW5ndGg9bykpLHV9fSxfPShyLGUpPT57Y29uc3Qgbj12KHIpO3JldHVybiBufSxnPSgoKT0+e2xldCByPTA7cmV0dXJuIGU9Pntjb25zdCBuPXYoZSksYT1yKz0xO3JldHVybiB0PT57dmFyIG87aWYodC5vcHRpb25zLm1lbW9pemF0aW9uPT09ZmFsc2UpcmV0dXJuIG4odCk7Y29uc3QgdT10LmluZGV4LHM9KG89dC5jYWNoZSlbYV18fChvW2FdPW5ldyBNYXApLGM9cy5nZXQodSk7aWYoYz09PWZhbHNlKXJldHVybiAgZmFsc2U7aWYoVyhjKSlyZXR1cm4gdC5pbmRleD1jLHRydWU7aWYoYylyZXR1cm4gdC5pbmRleD1jLmluZGV4LGMub3V0cHV0Py5sZW5ndGgmJnQub3V0cHV0LnB1c2goLi4uYy5vdXRwdXQpLHRydWU7e2NvbnN0IFo9dC5vdXRwdXQubGVuZ3RoO2lmKG4odCkpe2NvbnN0IEQ9dC5pbmRleCxVPXQub3V0cHV0Lmxlbmd0aDtpZihVPlope2NvbnN0IGVlPXQub3V0cHV0LnNsaWNlKFosVSk7cy5zZXQodSx7aW5kZXg6RCxvdXRwdXQ6ZWV9KTt9ZWxzZSBzLnNldCh1LEQpO3JldHVybiAgdHJ1ZX1lbHNlIHJldHVybiBzLnNldCh1LGZhbHNlKSxmYWxzZX19fX0pKCksRT1yPT57bGV0IGU7cmV0dXJuIG49PihlfHwoZT12KHIoKSkpLGUobikpfSx2PVkocj0+e2lmKGQocikpcmV0dXJuIFEocik/RShyKTpyO2lmKGIocil8fFgocikpcmV0dXJuIGkocik7aWYoQShyKSlyZXR1cm4geChyKTtpZihLKHIpKXJldHVybiBsKE9iamVjdC52YWx1ZXMocikpO3Rocm93IG5ldyBFcnJvcihcIkludmFsaWQgcnVsZVwiKX0pLFA9XCJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5elwiLGlyPXI9PntsZXQgZT1cIlwiO2Zvcig7cj4wOyl7Y29uc3Qgbj0oci0xKSUyNjtlPVBbbl0rZSxyPU1hdGguZmxvb3IoKHItMSkvMjYpO31yZXR1cm4gZX0sTz1yPT57bGV0IGU9MDtmb3IobGV0IG49MCxhPXIubGVuZ3RoO248YTtuKyspZT1lKjI2K1AuaW5kZXhPZihyW25dKSsxO3JldHVybiBlfSxTPShyLGUpPT57aWYoZTxyKXJldHVybiBTKGUscik7Y29uc3Qgbj1bXTtmb3IoO3I8PWU7KW4ucHVzaChyKyspO3JldHVybiBufSxvcj0ocixlLG4pPT5TKHIsZSkubWFwKGE9PlN0cmluZyhhKS5wYWRTdGFydChuLFwiMFwiKSksUj0ocixlKT0+UyhPKHIpLE8oZSkpLm1hcChpcikscD1yPT5yLHo9cj0+dXIoZT0+cnIoZSxyLHttZW1vaXphdGlvbjpmYWxzZX0pLmpvaW4oXCJcIikpLHVyPXI9Pntjb25zdCBlPXt9O3JldHVybiBuPT5lW25dPz8oZVtuXT1yKG4pKX0sc3I9aSgvXlxcKlxcKlxcL1xcKiQvLFwiLipcIiksY3I9aSgvXlxcKlxcKlxcLyhcXCopPyhbIGEtekEtWjAtOS5fLV0rKSQvLChyLGUsbik9PmAuKiR7ZT9cIlwiOlwiKD86XnwvKVwifSR7bi5yZXBsYWNlQWxsKFwiLlwiLFwiXFxcXC5cIil9YCksbHI9aSgvXlxcKlxcKlxcLyhcXCopPyhbIGEtekEtWjAtOS5fLV0qKVxceyhbIGEtekEtWjAtOS5fLV0rKD86LFsgYS16QS1aMC05Ll8tXSspKilcXH0kLywocixlLG4sYSk9PmAuKiR7ZT9cIlwiOlwiKD86XnwvKVwifSR7bi5yZXBsYWNlQWxsKFwiLlwiLFwiXFxcXC5cIil9KD86JHthLnJlcGxhY2VBbGwoXCIsXCIsXCJ8XCIpLnJlcGxhY2VBbGwoXCIuXCIsXCJcXFxcLlwiKX0pYCkseT1pKC9cXFxcLi8scCkscHI9aSgvWyQuKis/Xigpe31bXFxdXFx8XS8scj0+YFxcXFwke3J9YCksdnI9aSgvLi8scCksaHI9aSgvXig/OiEhKSohKC4qKSQvLChyLGUpPT5gKD8hXiR7TChlKX0kKS4qP2ApLGRyPWkoL14oISEpKy8sXCJcIiksZnI9bChbaHIsZHJdKSx4cj1pKC9cXC8oXFwqXFwqXFwvKSsvLFwiKD86Ly4rL3wvKVwiKSxncj1pKC9eKFxcKlxcKlxcLykrLyxcIig/Ol58LiovKVwiKSxtcj1pKC9cXC8oXFwqXFwqKSQvLFwiKD86Ly4qfCQpXCIpLF9yPWkoL1xcKlxcKi8sXCIuKlwiKSxqPWwoW3hyLGdyLG1yLF9yXSksU3I9aSgvXFwqXFwvKD8hXFwqXFwqXFwvKS8sXCJbXi9dKi9cIikseXI9aSgvXFwqLyxcIlteL10qXCIpLE49bChbU3IseXJdKSxrPWkoXCI/XCIsXCJbXi9dXCIpLCRyPWkoXCJbXCIscCksd3I9aShcIl1cIixwKSxBcj1pKC9bIV5dLyxcIl4vXCIpLGJyPWkoL1thLXpdLVthLXpdfFswLTldLVswLTldL2kscCksQ3I9aSgvWyQuKis/Xigpe31bXFx8XS8scj0+YFxcXFwke3J9YCksTXI9aSgvW15cXF1dLyxwKSxFcj1sKFt5LENyLGJyLE1yXSksQj14KFskcix0cihBciksZihFciksd3JdKSxQcj1pKFwie1wiLFwiKD86XCIpLE9yPWkoXCJ9XCIsXCIpXCIpLFJyPWkoLyhcXGQrKVxcLlxcLihcXGQrKS8sKHIsZSxuKT0+b3IoK2UsK24sTWF0aC5taW4oZS5sZW5ndGgsbi5sZW5ndGgpKS5qb2luKFwifFwiKSksenI9aSgvKFthLXpdKylcXC5cXC4oW2Etel0rKS8sKHIsZSxuKT0+UihlLG4pLmpvaW4oXCJ8XCIpKSxqcj1pKC8oW0EtWl0rKVxcLlxcLihbQS1aXSspLywocixlLG4pPT5SKGUudG9Mb3dlckNhc2UoKSxuLnRvTG93ZXJDYXNlKCkpLmpvaW4oXCJ8XCIpLnRvVXBwZXJDYXNlKCkpLE5yPWwoW1JyLHpyLGpyXSksST14KFtQcixOcixPcl0pLGtyPWkoXCJ7XCIsXCIoPzpcIiksQnI9aShcIn1cIixcIilcIiksSXI9aShcIixcIixcInxcIiksRnI9aSgvWyQuKis/Xigpe1tcXF1cXHxdLyxyPT5gXFxcXCR7cn1gKSxMcj1pKC9bXn1dLyxwKSxacj1FKCgpPT5GKSxEcj1sKFtqLE4sayxCLEksWnIseSxGcixJcixMcl0pLEY9eChba3IsZihEciksQnJdKSxVcj1mKGwoW3NyLGNyLGxyLGZyLGosTixrLEIsSSxGLHkscHIsdnJdKSksVnI9VXIsR3I9eihWciksTD1HcixUcj1pKC9cXFxcLi8scCkscXI9aSgvLi8scCksSHI9aSgvXFwqXFwqXFwqKy8sXCIqXCIpLEpyPWkoLyhbXi97WyghXSlcXCpcXCovLChyLGUpPT5gJHtlfSpgKSxRcj1pKC8oXnwuKVxcKlxcKig/PVteKi8pXFxdfV0pLywocixlKT0+YCR7ZX0qYCksV3I9ZihsKFtUcixIcixKcixRcixxcl0pKSxLcj1XcixYcj16KEtyKSxZcj1YciwkPShyLGUpPT57Y29uc3Qgbj1BcnJheS5pc0FycmF5KHIpP3I6W3JdO2lmKCFuLmxlbmd0aClyZXR1cm4gIGZhbHNlO2NvbnN0IGE9bi5tYXAoJC5jb21waWxlKSx0PW4uZXZlcnkocz0+LyhcXC8oPzpcXCpcXCopP3xcXFtcXC9cXF0pJC8udGVzdChzKSksbz1lLnJlcGxhY2UoL1tcXFxcXFwvXSsvZyxcIi9cIikucmVwbGFjZSgvXFwvJC8sdD9cIi9cIjpcIlwiKTtyZXR1cm4gYS5zb21lKHM9PnMudGVzdChvKSl9OyQuY29tcGlsZT1yPT5uZXcgUmVnRXhwKGBeJHtMKFlyKHIpKX0kYCxcInNcIik7dmFyIHJlPSQ7cmV0dXJuIEoodyl9KSgpO1xuIHJldHVybiBfX2xpYl9fLmRlZmF1bHQgfHwgX19saWJfXzsgfTtcbmxldCBfbWF0Y2g7XG5jb25zdCB6ZXB0b21hdGNoID0gKHBhdGgsIHBhdHRlcm4pID0+IHtcbiAgaWYgKCFfbWF0Y2gpIHtcbiAgICBfbWF0Y2ggPSBfbGF6eU1hdGNoKCk7XG4gICAgX2xhenlNYXRjaCA9IG51bGw7XG4gIH1cbiAgcmV0dXJuIF9tYXRjaChwYXRoLCBwYXR0ZXJuKTtcbn07XG5cbmNvbnN0IF9EUklWRV9MRVRURVJfU1RBUlRfUkUgPSAvXltBLVphLXpdOlxcLy87XG5mdW5jdGlvbiBub3JtYWxpemVXaW5kb3dzUGF0aChpbnB1dCA9IFwiXCIpIHtcbiAgaWYgKCFpbnB1dCkge1xuICAgIHJldHVybiBpbnB1dDtcbiAgfVxuICByZXR1cm4gaW5wdXQucmVwbGFjZSgvXFxcXC9nLCBcIi9cIikucmVwbGFjZShfRFJJVkVfTEVUVEVSX1NUQVJUX1JFLCAocikgPT4gci50b1VwcGVyQ2FzZSgpKTtcbn1cblxuY29uc3QgX1VOQ19SRUdFWCA9IC9eWy9cXFxcXXsyfS87XG5jb25zdCBfSVNfQUJTT0xVVEVfUkUgPSAvXlsvXFxcXF0oPyFbL1xcXFxdKXxeWy9cXFxcXXsyfSg/IVxcLil8XltBLVphLXpdOlsvXFxcXF0vO1xuY29uc3QgX0RSSVZFX0xFVFRFUl9SRSA9IC9eW0EtWmEtel06JC87XG5jb25zdCBfUk9PVF9GT0xERVJfUkUgPSAvXlxcLyhbQS1aYS16XTopPyQvO1xuY29uc3QgX0VYVE5BTUVfUkUgPSAvLihcXC5bXi4vXSt8XFwuKSQvO1xuY29uc3QgX1BBVEhfUk9PVF9SRSA9IC9eWy9cXFxcXXxeW2EtekEtWl06Wy9cXFxcXS87XG5jb25zdCBzZXAgPSBcIi9cIjtcbmNvbnN0IG5vcm1hbGl6ZSA9IGZ1bmN0aW9uKHBhdGgpIHtcbiAgaWYgKHBhdGgubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFwiLlwiO1xuICB9XG4gIHBhdGggPSBub3JtYWxpemVXaW5kb3dzUGF0aChwYXRoKTtcbiAgY29uc3QgaXNVTkNQYXRoID0gcGF0aC5tYXRjaChfVU5DX1JFR0VYKTtcbiAgY29uc3QgaXNQYXRoQWJzb2x1dGUgPSBpc0Fic29sdXRlKHBhdGgpO1xuICBjb25zdCB0cmFpbGluZ1NlcGFyYXRvciA9IHBhdGhbcGF0aC5sZW5ndGggLSAxXSA9PT0gXCIvXCI7XG4gIHBhdGggPSBub3JtYWxpemVTdHJpbmcocGF0aCwgIWlzUGF0aEFic29sdXRlKTtcbiAgaWYgKHBhdGgubGVuZ3RoID09PSAwKSB7XG4gICAgaWYgKGlzUGF0aEFic29sdXRlKSB7XG4gICAgICByZXR1cm4gXCIvXCI7XG4gICAgfVxuICAgIHJldHVybiB0cmFpbGluZ1NlcGFyYXRvciA/IFwiLi9cIiA6IFwiLlwiO1xuICB9XG4gIGlmICh0cmFpbGluZ1NlcGFyYXRvcikge1xuICAgIHBhdGggKz0gXCIvXCI7XG4gIH1cbiAgaWYgKF9EUklWRV9MRVRURVJfUkUudGVzdChwYXRoKSkge1xuICAgIHBhdGggKz0gXCIvXCI7XG4gIH1cbiAgaWYgKGlzVU5DUGF0aCkge1xuICAgIGlmICghaXNQYXRoQWJzb2x1dGUpIHtcbiAgICAgIHJldHVybiBgLy8uLyR7cGF0aH1gO1xuICAgIH1cbiAgICByZXR1cm4gYC8vJHtwYXRofWA7XG4gIH1cbiAgcmV0dXJuIGlzUGF0aEFic29sdXRlICYmICFpc0Fic29sdXRlKHBhdGgpID8gYC8ke3BhdGh9YCA6IHBhdGg7XG59O1xuY29uc3Qgam9pbiA9IGZ1bmN0aW9uKC4uLnNlZ21lbnRzKSB7XG4gIGxldCBwYXRoID0gXCJcIjtcbiAgZm9yIChjb25zdCBzZWcgb2Ygc2VnbWVudHMpIHtcbiAgICBpZiAoIXNlZykge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChwYXRoLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHBhdGhUcmFpbGluZyA9IHBhdGhbcGF0aC5sZW5ndGggLSAxXSA9PT0gXCIvXCI7XG4gICAgICBjb25zdCBzZWdMZWFkaW5nID0gc2VnWzBdID09PSBcIi9cIjtcbiAgICAgIGNvbnN0IGJvdGggPSBwYXRoVHJhaWxpbmcgJiYgc2VnTGVhZGluZztcbiAgICAgIGlmIChib3RoKSB7XG4gICAgICAgIHBhdGggKz0gc2VnLnNsaWNlKDEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGF0aCArPSBwYXRoVHJhaWxpbmcgfHwgc2VnTGVhZGluZyA/IHNlZyA6IGAvJHtzZWd9YDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcGF0aCArPSBzZWc7XG4gICAgfVxuICB9XG4gIHJldHVybiBub3JtYWxpemUocGF0aCk7XG59O1xuZnVuY3Rpb24gY3dkKCkge1xuICBpZiAodHlwZW9mIHByb2Nlc3MgIT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIHByb2Nlc3MuY3dkID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gcHJvY2Vzcy5jd2QoKS5yZXBsYWNlKC9cXFxcL2csIFwiL1wiKTtcbiAgfVxuICByZXR1cm4gXCIvXCI7XG59XG5jb25zdCByZXNvbHZlID0gZnVuY3Rpb24oLi4uYXJndW1lbnRzXykge1xuICBhcmd1bWVudHNfID0gYXJndW1lbnRzXy5tYXAoKGFyZ3VtZW50KSA9PiBub3JtYWxpemVXaW5kb3dzUGF0aChhcmd1bWVudCkpO1xuICBsZXQgcmVzb2x2ZWRQYXRoID0gXCJcIjtcbiAgbGV0IHJlc29sdmVkQWJzb2x1dGUgPSBmYWxzZTtcbiAgZm9yIChsZXQgaW5kZXggPSBhcmd1bWVudHNfLmxlbmd0aCAtIDE7IGluZGV4ID49IC0xICYmICFyZXNvbHZlZEFic29sdXRlOyBpbmRleC0tKSB7XG4gICAgY29uc3QgcGF0aCA9IGluZGV4ID49IDAgPyBhcmd1bWVudHNfW2luZGV4XSA6IGN3ZCgpO1xuICAgIGlmICghcGF0aCB8fCBwYXRoLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHJlc29sdmVkUGF0aCA9IGAke3BhdGh9LyR7cmVzb2x2ZWRQYXRofWA7XG4gICAgcmVzb2x2ZWRBYnNvbHV0ZSA9IGlzQWJzb2x1dGUocGF0aCk7XG4gIH1cbiAgcmVzb2x2ZWRQYXRoID0gbm9ybWFsaXplU3RyaW5nKHJlc29sdmVkUGF0aCwgIXJlc29sdmVkQWJzb2x1dGUpO1xuICBpZiAocmVzb2x2ZWRBYnNvbHV0ZSAmJiAhaXNBYnNvbHV0ZShyZXNvbHZlZFBhdGgpKSB7XG4gICAgcmV0dXJuIGAvJHtyZXNvbHZlZFBhdGh9YDtcbiAgfVxuICByZXR1cm4gcmVzb2x2ZWRQYXRoLmxlbmd0aCA+IDAgPyByZXNvbHZlZFBhdGggOiBcIi5cIjtcbn07XG5mdW5jdGlvbiBub3JtYWxpemVTdHJpbmcocGF0aCwgYWxsb3dBYm92ZVJvb3QpIHtcbiAgbGV0IHJlcyA9IFwiXCI7XG4gIGxldCBsYXN0U2VnbWVudExlbmd0aCA9IDA7XG4gIGxldCBsYXN0U2xhc2ggPSAtMTtcbiAgbGV0IGRvdHMgPSAwO1xuICBsZXQgY2hhciA9IG51bGw7XG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPD0gcGF0aC5sZW5ndGg7ICsraW5kZXgpIHtcbiAgICBpZiAoaW5kZXggPCBwYXRoLmxlbmd0aCkge1xuICAgICAgY2hhciA9IHBhdGhbaW5kZXhdO1xuICAgIH0gZWxzZSBpZiAoY2hhciA9PT0gXCIvXCIpIHtcbiAgICAgIGJyZWFrO1xuICAgIH0gZWxzZSB7XG4gICAgICBjaGFyID0gXCIvXCI7XG4gICAgfVxuICAgIGlmIChjaGFyID09PSBcIi9cIikge1xuICAgICAgaWYgKGxhc3RTbGFzaCA9PT0gaW5kZXggLSAxIHx8IGRvdHMgPT09IDEpIDsgZWxzZSBpZiAoZG90cyA9PT0gMikge1xuICAgICAgICBpZiAocmVzLmxlbmd0aCA8IDIgfHwgbGFzdFNlZ21lbnRMZW5ndGggIT09IDIgfHwgcmVzW3Jlcy5sZW5ndGggLSAxXSAhPT0gXCIuXCIgfHwgcmVzW3Jlcy5sZW5ndGggLSAyXSAhPT0gXCIuXCIpIHtcbiAgICAgICAgICBpZiAocmVzLmxlbmd0aCA+IDIpIHtcbiAgICAgICAgICAgIGNvbnN0IGxhc3RTbGFzaEluZGV4ID0gcmVzLmxhc3RJbmRleE9mKFwiL1wiKTtcbiAgICAgICAgICAgIGlmIChsYXN0U2xhc2hJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgcmVzID0gXCJcIjtcbiAgICAgICAgICAgICAgbGFzdFNlZ21lbnRMZW5ndGggPSAwO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVzID0gcmVzLnNsaWNlKDAsIGxhc3RTbGFzaEluZGV4KTtcbiAgICAgICAgICAgICAgbGFzdFNlZ21lbnRMZW5ndGggPSByZXMubGVuZ3RoIC0gMSAtIHJlcy5sYXN0SW5kZXhPZihcIi9cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsYXN0U2xhc2ggPSBpbmRleDtcbiAgICAgICAgICAgIGRvdHMgPSAwO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfSBlbHNlIGlmIChyZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmVzID0gXCJcIjtcbiAgICAgICAgICAgIGxhc3RTZWdtZW50TGVuZ3RoID0gMDtcbiAgICAgICAgICAgIGxhc3RTbGFzaCA9IGluZGV4O1xuICAgICAgICAgICAgZG90cyA9IDA7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFsbG93QWJvdmVSb290KSB7XG4gICAgICAgICAgcmVzICs9IHJlcy5sZW5ndGggPiAwID8gXCIvLi5cIiA6IFwiLi5cIjtcbiAgICAgICAgICBsYXN0U2VnbWVudExlbmd0aCA9IDI7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChyZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHJlcyArPSBgLyR7cGF0aC5zbGljZShsYXN0U2xhc2ggKyAxLCBpbmRleCl9YDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXMgPSBwYXRoLnNsaWNlKGxhc3RTbGFzaCArIDEsIGluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBsYXN0U2VnbWVudExlbmd0aCA9IGluZGV4IC0gbGFzdFNsYXNoIC0gMTtcbiAgICAgIH1cbiAgICAgIGxhc3RTbGFzaCA9IGluZGV4O1xuICAgICAgZG90cyA9IDA7XG4gICAgfSBlbHNlIGlmIChjaGFyID09PSBcIi5cIiAmJiBkb3RzICE9PSAtMSkge1xuICAgICAgKytkb3RzO1xuICAgIH0gZWxzZSB7XG4gICAgICBkb3RzID0gLTE7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXM7XG59XG5jb25zdCBpc0Fic29sdXRlID0gZnVuY3Rpb24ocCkge1xuICByZXR1cm4gX0lTX0FCU09MVVRFX1JFLnRlc3QocCk7XG59O1xuY29uc3QgdG9OYW1lc3BhY2VkUGF0aCA9IGZ1bmN0aW9uKHApIHtcbiAgcmV0dXJuIG5vcm1hbGl6ZVdpbmRvd3NQYXRoKHApO1xufTtcbmNvbnN0IGV4dG5hbWUgPSBmdW5jdGlvbihwKSB7XG4gIGlmIChwID09PSBcIi4uXCIpIHJldHVybiBcIlwiO1xuICBjb25zdCBtYXRjaCA9IF9FWFROQU1FX1JFLmV4ZWMobm9ybWFsaXplV2luZG93c1BhdGgocCkpO1xuICByZXR1cm4gbWF0Y2ggJiYgbWF0Y2hbMV0gfHwgXCJcIjtcbn07XG5jb25zdCByZWxhdGl2ZSA9IGZ1bmN0aW9uKGZyb20sIHRvKSB7XG4gIGNvbnN0IF9mcm9tID0gcmVzb2x2ZShmcm9tKS5yZXBsYWNlKF9ST09UX0ZPTERFUl9SRSwgXCIkMVwiKS5zcGxpdChcIi9cIik7XG4gIGNvbnN0IF90byA9IHJlc29sdmUodG8pLnJlcGxhY2UoX1JPT1RfRk9MREVSX1JFLCBcIiQxXCIpLnNwbGl0KFwiL1wiKTtcbiAgaWYgKF90b1swXVsxXSA9PT0gXCI6XCIgJiYgX2Zyb21bMF1bMV0gPT09IFwiOlwiICYmIF9mcm9tWzBdICE9PSBfdG9bMF0pIHtcbiAgICByZXR1cm4gX3RvLmpvaW4oXCIvXCIpO1xuICB9XG4gIGNvbnN0IF9mcm9tQ29weSA9IFsuLi5fZnJvbV07XG4gIGZvciAoY29uc3Qgc2VnbWVudCBvZiBfZnJvbUNvcHkpIHtcbiAgICBpZiAoX3RvWzBdICE9PSBzZWdtZW50KSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgX2Zyb20uc2hpZnQoKTtcbiAgICBfdG8uc2hpZnQoKTtcbiAgfVxuICByZXR1cm4gWy4uLl9mcm9tLm1hcCgoKSA9PiBcIi4uXCIpLCAuLi5fdG9dLmpvaW4oXCIvXCIpO1xufTtcbmNvbnN0IGRpcm5hbWUgPSBmdW5jdGlvbihwKSB7XG4gIGNvbnN0IHNlZ21lbnRzID0gbm9ybWFsaXplV2luZG93c1BhdGgocCkucmVwbGFjZSgvXFwvJC8sIFwiXCIpLnNwbGl0KFwiL1wiKS5zbGljZSgwLCAtMSk7XG4gIGlmIChzZWdtZW50cy5sZW5ndGggPT09IDEgJiYgX0RSSVZFX0xFVFRFUl9SRS50ZXN0KHNlZ21lbnRzWzBdKSkge1xuICAgIHNlZ21lbnRzWzBdICs9IFwiL1wiO1xuICB9XG4gIHJldHVybiBzZWdtZW50cy5qb2luKFwiL1wiKSB8fCAoaXNBYnNvbHV0ZShwKSA/IFwiL1wiIDogXCIuXCIpO1xufTtcbmNvbnN0IGZvcm1hdCA9IGZ1bmN0aW9uKHApIHtcbiAgY29uc3QgZXh0ID0gcC5leHQgPyBwLmV4dC5zdGFydHNXaXRoKFwiLlwiKSA/IHAuZXh0IDogYC4ke3AuZXh0fWAgOiBcIlwiO1xuICBjb25zdCBzZWdtZW50cyA9IFtwLnJvb3QsIHAuZGlyLCBwLmJhc2UgPz8gKHAubmFtZSA/PyBcIlwiKSArIGV4dF0uZmlsdGVyKFxuICAgIEJvb2xlYW5cbiAgKTtcbiAgcmV0dXJuIG5vcm1hbGl6ZVdpbmRvd3NQYXRoKFxuICAgIHAucm9vdCA/IHJlc29sdmUoLi4uc2VnbWVudHMpIDogc2VnbWVudHMuam9pbihcIi9cIilcbiAgKTtcbn07XG5jb25zdCBiYXNlbmFtZSA9IGZ1bmN0aW9uKHAsIGV4dGVuc2lvbikge1xuICBjb25zdCBzZWdtZW50cyA9IG5vcm1hbGl6ZVdpbmRvd3NQYXRoKHApLnNwbGl0KFwiL1wiKTtcbiAgbGV0IGxhc3RTZWdtZW50ID0gXCJcIjtcbiAgZm9yIChsZXQgaSA9IHNlZ21lbnRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgY29uc3QgdmFsID0gc2VnbWVudHNbaV07XG4gICAgaWYgKHZhbCkge1xuICAgICAgbGFzdFNlZ21lbnQgPSB2YWw7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGV4dGVuc2lvbiAmJiBsYXN0U2VnbWVudC5lbmRzV2l0aChleHRlbnNpb24pID8gbGFzdFNlZ21lbnQuc2xpY2UoMCwgLWV4dGVuc2lvbi5sZW5ndGgpIDogbGFzdFNlZ21lbnQ7XG59O1xuY29uc3QgcGFyc2UgPSBmdW5jdGlvbihwKSB7XG4gIGNvbnN0IHJvb3QgPSBfUEFUSF9ST09UX1JFLmV4ZWMocCk/LlswXT8ucmVwbGFjZSgvXFxcXC9nLCBcIi9cIikgfHwgXCJcIjtcbiAgY29uc3QgYmFzZSA9IGJhc2VuYW1lKHApO1xuICBjb25zdCBleHRlbnNpb24gPSBleHRuYW1lKGJhc2UpO1xuICByZXR1cm4ge1xuICAgIHJvb3QsXG4gICAgZGlyOiBkaXJuYW1lKHApLFxuICAgIGJhc2UsXG4gICAgZXh0OiBleHRlbnNpb24sXG4gICAgbmFtZTogYmFzZS5zbGljZSgwLCBiYXNlLmxlbmd0aCAtIGV4dGVuc2lvbi5sZW5ndGgpXG4gIH07XG59O1xuY29uc3QgbWF0Y2hlc0dsb2IgPSAocGF0aCwgcGF0dGVybikgPT4ge1xuICByZXR1cm4gemVwdG9tYXRjaChwYXR0ZXJuLCBub3JtYWxpemUocGF0aCkpO1xufTtcblxuY29uc3QgX3BhdGggPSB7XG4gIF9fcHJvdG9fXzogbnVsbCxcbiAgYmFzZW5hbWU6IGJhc2VuYW1lLFxuICBkaXJuYW1lOiBkaXJuYW1lLFxuICBleHRuYW1lOiBleHRuYW1lLFxuICBmb3JtYXQ6IGZvcm1hdCxcbiAgaXNBYnNvbHV0ZTogaXNBYnNvbHV0ZSxcbiAgam9pbjogam9pbixcbiAgbWF0Y2hlc0dsb2I6IG1hdGNoZXNHbG9iLFxuICBub3JtYWxpemU6IG5vcm1hbGl6ZSxcbiAgbm9ybWFsaXplU3RyaW5nOiBub3JtYWxpemVTdHJpbmcsXG4gIHBhcnNlOiBwYXJzZSxcbiAgcmVsYXRpdmU6IHJlbGF0aXZlLFxuICByZXNvbHZlOiByZXNvbHZlLFxuICBzZXA6IHNlcCxcbiAgdG9OYW1lc3BhY2VkUGF0aDogdG9OYW1lc3BhY2VkUGF0aFxufTtcblxuZXhwb3J0IHsgX3BhdGggYXMgXywgbm9ybWFsaXplU3RyaW5nIGFzIGEsIHJlbGF0aXZlIGFzIGIsIGJhc2VuYW1lIGFzIGMsIGRpcm5hbWUgYXMgZCwgZXh0bmFtZSBhcyBlLCBmb3JtYXQgYXMgZiwgbm9ybWFsaXplV2luZG93c1BhdGggYXMgZywgaXNBYnNvbHV0ZSBhcyBpLCBqb2luIGFzIGosIG1hdGNoZXNHbG9iIGFzIG0sIG5vcm1hbGl6ZSBhcyBuLCBwYXJzZSBhcyBwLCByZXNvbHZlIGFzIHIsIHNlcCBhcyBzLCB0b05hbWVzcGFjZWRQYXRoIGFzIHQgfTtcbiIsImltcG9ydCB7IHBhcnNlQXNwZWN0UmF0aW8sIHBhcnNlUmFuZ2VTdHJpbmcsIHBhcnNlVGltZVN0cmluZywgcGFyc2VUaW1lc3BsaXRzIH0gZnJvbSBcIi4vdXRpbHMubWpzXCI7XG5pbXBvcnQgeyBkZXRlY3RGZWF0dXJlcywgZXh0cmFjdEltYWdlc1VzYWdlLCBnZXREZWZhdWx0Q29uZmlnLCBwYXJzZSwgcGFyc2VTbGlkZSwgcGFyc2VTeW5jLCBwcmV0dGlmeSwgcHJldHRpZnlTbGlkZSwgcmVzb2x2ZUNvbmZpZywgcmVzb2x2ZUZvbnRzLCBzdHJpbmdpZnksIHN0cmluZ2lmeVNsaWRlLCB2ZXJpZnlDb25maWcgfSBmcm9tIFwiLi9jb3JlLm1qc1wiO1xuaW1wb3J0IHsgc2xhc2ggfSBmcm9tIFwiQGFudGZ1L3V0aWxzXCI7XG5pbXBvcnQgWUFNTCBmcm9tIFwieWFtbFwiO1xuaW1wb3J0IHsgZXhpc3RzU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgeyByZWFkRmlsZSwgd3JpdGVGaWxlIH0gZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IGRpcm5hbWUsIGlzQWJzb2x1dGUsIHJlbGF0aXZlLCByZXNvbHZlIH0gZnJvbSBcInBhdGhlXCI7XG4vLyNyZWdpb24gc3JjL2ZzLnRzXG4vKipcbiogV2hldGhlciBgZmlsZVBhdGhgIHJlc29sdmVzIGluc2lkZSBhbnkgb2YgYHJvb3RzYCAobm8gYC4uYCBlc2NhcGUpLlxuKiBJbmxpbmVkIGhlcmUgKHJhdGhlciB0aGFuIGltcG9ydGVkIGZyb20gdGhlIGBzbGlkZXZgIHBhY2thZ2UpIGJlY2F1c2VcbiogYEBzbGlkZXYvcGFyc2VyYCBtdXN0IHN0YXkgaW5kZXBlbmRlbnQgb2YgYEBzbGlkZXYvc2xpZGV2YC5cbiovXG5mdW5jdGlvbiBpc1BhdGhJbnNpZGVSb290cyhmaWxlUGF0aCwgcm9vdHMpIHtcblx0cmV0dXJuIHJvb3RzLnNvbWUoKHJvb3QpID0+IHtcblx0XHRjb25zdCByZWwgPSByZWxhdGl2ZShyb290LCBmaWxlUGF0aCk7XG5cdFx0cmV0dXJuIHJlbCA9PT0gXCJcIiB8fCAhIXJlbCAmJiAhcmVsLnN0YXJ0c1dpdGgoXCIuLlwiKSAmJiAhaXNBYnNvbHV0ZShyZWwpO1xuXHR9KTtcbn1cbmNvbnN0IFJFX0ZST05UTUFUVEVSX1NUQVJUID0gL14tLS0oPzpbXi1dLiopPyQvO1xuY29uc3QgUkVfQkxBTktfTElORSA9IC9eXFxzKiQvO1xuY29uc3QgUkVfRlJPTlRNQVRURVJfRU5EID0gL14tLS0kLztcbmNvbnN0IFJFX0NSTEYgPSAvXFxyP1xcbi9nO1xubGV0IHByZXBhcnNlckV4dGVuc2lvbkxvYWRlciA9IG51bGw7XG5mdW5jdGlvbiBpbmplY3RQcmVwYXJzZXJFeHRlbnNpb25Mb2FkZXIoZm4pIHtcblx0cHJlcGFyc2VyRXh0ZW5zaW9uTG9hZGVyID0gZm47XG59XG5hc3luYyBmdW5jdGlvbiBsb2FkKG9wdGlvbnMsIGZpbGVwYXRoLCBzb3VyY2VzID0ge30sIG1vZGUpIHtcblx0Y29uc3QgbG9hZFNvdXJjZSA9IHR5cGVvZiBzb3VyY2VzID09PSBcImZ1bmN0aW9uXCIgPyBzb3VyY2VzIDogYXN5bmMgKHBhdGgpID0+IHNvdXJjZXNbcGF0aF0gPz8gcmVhZEZpbGUocGF0aCwgXCJ1dGYtOFwiKTtcblx0Y29uc3QgbWFya2Rvd24gPSBhd2FpdCBsb2FkU291cmNlKGZpbGVwYXRoKTtcblx0bGV0IGV4dGVuc2lvbnM7XG5cdGlmIChwcmVwYXJzZXJFeHRlbnNpb25Mb2FkZXIpIHtcblx0XHRjb25zdCBsaW5lcyA9IG1hcmtkb3duLnNwbGl0KFJFX0NSTEYpO1xuXHRcdGxldCBobSA9IFwiXCI7XG5cdFx0aWYgKFJFX0ZST05UTUFUVEVSX1NUQVJULnRlc3QobGluZXNbMF0pICYmICFsaW5lc1sxXT8ubWF0Y2goUkVfQkxBTktfTElORSkpIHtcblx0XHRcdGxldCBoRW5kID0gMTtcblx0XHRcdHdoaWxlIChoRW5kIDwgbGluZXMubGVuZ3RoICYmICFSRV9GUk9OVE1BVFRFUl9FTkQudGVzdChsaW5lc1toRW5kXS50cmltRW5kKCkpKSBoRW5kKys7XG5cdFx0XHRobSA9IGxpbmVzLnNsaWNlKDEsIGhFbmQpLmpvaW4oXCJcXG5cIik7XG5cdFx0fVxuXHRcdGNvbnN0IG8gPSBZQU1MLnBhcnNlKGhtKSA/PyB7fTtcblx0XHRleHRlbnNpb25zID0gYXdhaXQgcHJlcGFyc2VyRXh0ZW5zaW9uTG9hZGVyKG9wdGlvbnMucm9vdHMsIG8sIGZpbGVwYXRoLCBtb2RlKTtcblx0fVxuXHRjb25zdCBtYXJrZG93bkZpbGVzID0ge307XG5cdGNvbnN0IHdhdGNoRmlsZXMgPSB7fTtcblx0Y29uc3Qgc2xpZGVzID0gW107XG5cdGFzeW5jIGZ1bmN0aW9uIGxvYWRNYXJrZG93bihwYXRoLCByYW5nZSwgZnJvbnRtYXR0ZXJPdmVycmlkZSwgaW1wb3J0ZXJzKSB7XG5cdFx0bGV0IG1kID0gbWFya2Rvd25GaWxlc1twYXRoXTtcblx0XHRpZiAoIW1kKSB7XG5cdFx0XHRjb25zdCByYXcgPSBhd2FpdCBsb2FkU291cmNlKHBhdGgpO1xuXHRcdFx0bWQgPSBhd2FpdCBwYXJzZShyYXcsIHBhdGgsIGV4dGVuc2lvbnMpO1xuXHRcdFx0bWFya2Rvd25GaWxlc1twYXRoXSA9IG1kO1xuXHRcdFx0d2F0Y2hGaWxlc1twYXRoXSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG5cdFx0fVxuXHRcdGNvbnN0IGRpcmVjdEltcG9ydGVyID0gaW1wb3J0ZXJzPy5hdCgtMSk7XG5cdFx0Zm9yIChjb25zdCBpbmRleCBvZiBwYXJzZVJhbmdlU3RyaW5nKG1kLnNsaWRlcy5sZW5ndGgsIHJhbmdlKSkge1xuXHRcdFx0Y29uc3Qgc3ViU2xpZGUgPSBtZC5zbGlkZXNbaW5kZXggLSAxXTtcblx0XHRcdGlmICghc3ViU2xpZGUpIHtcblx0XHRcdFx0bWQuZXJyb3JzID8/PSBbXTtcblx0XHRcdFx0bWQuZXJyb3JzLnB1c2goe1xuXHRcdFx0XHRcdHJvdzogMCxcblx0XHRcdFx0XHRtZXNzYWdlOiBgU2xpZGUgJHtpbmRleH0gZG9lcyBub3QgZXhpc3QgaW4gXCIke3BhdGh9XCIsIHdoaWNoIGhhcyAke21kLnNsaWRlcy5sZW5ndGh9IHNsaWRlc2Bcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXHRcdFx0dHJ5IHtcblx0XHRcdFx0YXdhaXQgbG9hZFNsaWRlKG1kLCBzdWJTbGlkZSwgZnJvbnRtYXR0ZXJPdmVycmlkZSwgaW1wb3J0ZXJzKTtcblx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0bWQuZXJyb3JzID8/PSBbXTtcblx0XHRcdFx0bWQuZXJyb3JzLnB1c2goe1xuXHRcdFx0XHRcdHJvdzogc3ViU2xpZGUuc3RhcnQsXG5cdFx0XHRcdFx0bWVzc2FnZTogYEVycm9yIHdoZW4gbG9hZGluZyBzbGlkZTogJHtlfWBcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGRpcmVjdEltcG9ydGVyKSAoZGlyZWN0SW1wb3J0ZXIuaW1wb3J0cyA/Pz0gW10pLnB1c2goc3ViU2xpZGUpO1xuXHRcdH1cblx0XHRyZXR1cm4gbWQ7XG5cdH1cblx0YXN5bmMgZnVuY3Rpb24gbG9hZFNsaWRlKG1kLCBzbGlkZSwgZnJvbnRtYXR0ZXJPdmVycmlkZSwgaW1wb3J0Q2hhaW4pIHtcblx0XHRpZiAoc2xpZGUuZnJvbnRtYXR0ZXIuZGlzYWJsZWQgfHwgc2xpZGUuZnJvbnRtYXR0ZXIuaGlkZSkgcmV0dXJuO1xuXHRcdGlmIChzbGlkZS5mcm9udG1hdHRlci5zcmMpIHtcblx0XHRcdGNvbnN0IFtyYXdQYXRoLCByYW5nZVJhd10gPSBzbGlkZS5mcm9udG1hdHRlci5zcmMuc3BsaXQoXCIjXCIpO1xuXHRcdFx0Y29uc3QgcGF0aCA9IHNsYXNoKHJhd1BhdGguc3RhcnRzV2l0aChcIi9cIikgPyByZXNvbHZlKG9wdGlvbnMudXNlclJvb3QsIHJhd1BhdGguc3Vic3RyaW5nKDEpKSA6IHJlc29sdmUoZGlybmFtZShzbGlkZS5maWxlcGF0aCksIHJhd1BhdGgpKTtcblx0XHRcdGZyb250bWF0dGVyT3ZlcnJpZGUgPSB7XG5cdFx0XHRcdC4uLnNsaWRlLmZyb250bWF0dGVyLFxuXHRcdFx0XHQuLi5mcm9udG1hdHRlck92ZXJyaWRlXG5cdFx0XHR9O1xuXHRcdFx0ZGVsZXRlIGZyb250bWF0dGVyT3ZlcnJpZGUuc3JjO1xuXHRcdFx0Y29uc3QgYW5jZXN0b3JQYXRocyA9IG5ldyBTZXQoKGltcG9ydENoYWluID8/IFtdKS5tYXAoKHMpID0+IHMuZmlsZXBhdGgpKTtcblx0XHRcdGlmIChwYXRoID09PSBzbGlkZS5maWxlcGF0aCB8fCBhbmNlc3RvclBhdGhzLmhhcyhwYXRoKSkge1xuXHRcdFx0XHRtZC5lcnJvcnMgPz89IFtdO1xuXHRcdFx0XHRtZC5lcnJvcnMucHVzaCh7XG5cdFx0XHRcdFx0cm93OiBzbGlkZS5zdGFydCxcblx0XHRcdFx0XHRtZXNzYWdlOiBgQ2lyY3VsYXIgaW1wb3J0IGRldGVjdGVkIGZvciBcIiR7c2xpZGUuZnJvbnRtYXR0ZXIuc3JjfVwiICgke3BhdGh9KWBcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGlmIChvcHRpb25zLmFsbG93ZWRSb290cyAmJiAhaXNQYXRoSW5zaWRlUm9vdHMocGF0aCwgb3B0aW9ucy5hbGxvd2VkUm9vdHMpKSB7XG5cdFx0XHRcdG1kLmVycm9ycyA/Pz0gW107XG5cdFx0XHRcdG1kLmVycm9ycy5wdXNoKHtcblx0XHRcdFx0XHRyb3c6IHNsaWRlLnN0YXJ0LFxuXHRcdFx0XHRcdG1lc3NhZ2U6IGBJbXBvcnRlZCBtYXJrZG93biBlc2NhcGVzIHRoZSBwcm9qZWN0IHJvb3Q6ICR7cGF0aH1gXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSBlbHNlIGlmICghZXhpc3RzU3luYyhwYXRoKSkge1xuXHRcdFx0XHRtZC5lcnJvcnMgPz89IFtdO1xuXHRcdFx0XHRtZC5lcnJvcnMucHVzaCh7XG5cdFx0XHRcdFx0cm93OiBzbGlkZS5zdGFydCxcblx0XHRcdFx0XHRtZXNzYWdlOiBgSW1wb3J0ZWQgbWFya2Rvd24gZmlsZSBub3QgZm91bmQ6ICR7cGF0aH1gXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSBlbHNlIGF3YWl0IGxvYWRNYXJrZG93bihwYXRoLCByYW5nZVJhdywgZnJvbnRtYXR0ZXJPdmVycmlkZSwgaW1wb3J0Q2hhaW4gPyBbLi4uaW1wb3J0Q2hhaW4sIHNsaWRlXSA6IFtzbGlkZV0pO1xuXHRcdH0gZWxzZSBzbGlkZXMucHVzaCh7XG5cdFx0XHRmcm9udG1hdHRlcjoge1xuXHRcdFx0XHQuLi5zbGlkZS5mcm9udG1hdHRlcixcblx0XHRcdFx0Li4uZnJvbnRtYXR0ZXJPdmVycmlkZVxuXHRcdFx0fSxcblx0XHRcdGNvbnRlbnQ6IHNsaWRlLmNvbnRlbnQsXG5cdFx0XHRyZXZpc2lvbjogc2xpZGUucmV2aXNpb24sXG5cdFx0XHRmcm9udG1hdHRlclJhdzogc2xpZGUuZnJvbnRtYXR0ZXJSYXcsXG5cdFx0XHRub3RlOiBzbGlkZS5ub3RlLFxuXHRcdFx0dGl0bGU6IHNsaWRlLnRpdGxlLFxuXHRcdFx0bGV2ZWw6IHNsaWRlLmxldmVsLFxuXHRcdFx0aW5kZXg6IHNsaWRlcy5sZW5ndGgsXG5cdFx0XHRpbXBvcnRDaGFpbixcblx0XHRcdHNvdXJjZTogc2xpZGVcblx0XHR9KTtcblx0fVxuXHRjb25zdCBlbnRyeSA9IGF3YWl0IGxvYWRNYXJrZG93bihzbGFzaChmaWxlcGF0aCkpO1xuXHRjb25zdCBoZWFkbWF0dGVyID0geyAuLi5lbnRyeS5zbGlkZXNbMF0/LmZyb250bWF0dGVyIH07XG5cdGlmIChzbGlkZXNbMF0/LnRpdGxlKSBoZWFkbWF0dGVyLnRpdGxlID8/PSBzbGlkZXNbMF0udGl0bGU7XG5cdHJldHVybiB7XG5cdFx0c2xpZGVzLFxuXHRcdGVudHJ5LFxuXHRcdGhlYWRtYXR0ZXIsXG5cdFx0ZmVhdHVyZXM6IGRldGVjdEZlYXR1cmVzKHNsaWRlcy5tYXAoKHMpID0+IHMuc291cmNlLnJhdykuam9pbihcIlwiKSksXG5cdFx0bWFya2Rvd25GaWxlcyxcblx0XHR3YXRjaEZpbGVzXG5cdH07XG59XG5hc3luYyBmdW5jdGlvbiBzYXZlKG1hcmtkb3duKSB7XG5cdGNvbnN0IGZpbGVDb250ZW50ID0gc3RyaW5naWZ5KG1hcmtkb3duKTtcblx0YXdhaXQgd3JpdGVGaWxlKG1hcmtkb3duLmZpbGVwYXRoLCBmaWxlQ29udGVudCwgXCJ1dGYtOFwiKTtcblx0cmV0dXJuIGZpbGVDb250ZW50O1xufVxuLy8jZW5kcmVnaW9uXG5leHBvcnQgeyBkZXRlY3RGZWF0dXJlcywgZXh0cmFjdEltYWdlc1VzYWdlLCBnZXREZWZhdWx0Q29uZmlnLCBpbmplY3RQcmVwYXJzZXJFeHRlbnNpb25Mb2FkZXIsIGlzUGF0aEluc2lkZVJvb3RzLCBsb2FkLCBwYXJzZSwgcGFyc2VBc3BlY3RSYXRpbywgcGFyc2VSYW5nZVN0cmluZywgcGFyc2VTbGlkZSwgcGFyc2VTeW5jLCBwYXJzZVRpbWVTdHJpbmcsIHBhcnNlVGltZXNwbGl0cywgcHJldHRpZnksIHByZXR0aWZ5U2xpZGUsIHJlc29sdmVDb25maWcsIHJlc29sdmVGb250cywgc2F2ZSwgc3RyaW5naWZ5LCBzdHJpbmdpZnlTbGlkZSwgdmVyaWZ5Q29uZmlnIH07XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8vIE5vdGVzOiBBZGQgbmV3IE5vZGUgdHlwZXNcbi8vIDEuIEFkZCBuZXcgTm9kZSB0eXBlIHRvIEFTVE5vZGVUeXBlc1xuLy8gMi4gVXBkYXRlIHR4dG5vZGUubWRcbi8vIDMuIEFkZCB0ZXN0IHRvIHBhY2thZ2VzL0B0ZXh0bGludC90eXBlcy90ZXN0L1J1bGUvVHh0Tm9kZS10ZXN0LnRzXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkFTVE5vZGVUeXBlcyA9IHZvaWQgMDtcbi8qKlxuICogQVNUTm9kZVR5cGVzIGlzIGEgbGlzdCBvZiBBU1ROb2RlIHR5cGUuXG4gKi9cbnZhciBBU1ROb2RlVHlwZXM7XG4oZnVuY3Rpb24gKEFTVE5vZGVUeXBlcykge1xuICAgIEFTVE5vZGVUeXBlc1tcIkRvY3VtZW50XCJdID0gXCJEb2N1bWVudFwiO1xuICAgIEFTVE5vZGVUeXBlc1tcIkRvY3VtZW50RXhpdFwiXSA9IFwiRG9jdW1lbnQ6ZXhpdFwiO1xuICAgIEFTVE5vZGVUeXBlc1tcIlBhcmFncmFwaFwiXSA9IFwiUGFyYWdyYXBoXCI7XG4gICAgQVNUTm9kZVR5cGVzW1wiUGFyYWdyYXBoRXhpdFwiXSA9IFwiUGFyYWdyYXBoOmV4aXRcIjtcbiAgICBBU1ROb2RlVHlwZXNbXCJCbG9ja1F1b3RlXCJdID0gXCJCbG9ja1F1b3RlXCI7XG4gICAgQVNUTm9kZVR5cGVzW1wiQmxvY2tRdW90ZUV4aXRcIl0gPSBcIkJsb2NrUXVvdGU6ZXhpdFwiO1xuICAgIEFTVE5vZGVUeXBlc1tcIkxpc3RJdGVtXCJdID0gXCJMaXN0SXRlbVwiO1xuICAgIEFTVE5vZGVUeXBlc1tcIkxpc3RJdGVtRXhpdFwiXSA9IFwiTGlzdEl0ZW06ZXhpdFwiO1xuICAgIEFTVE5vZGVUeXBlc1tcIkxpc3RcIl0gPSBcIkxpc3RcIjtcbiAgICBBU1ROb2RlVHlwZXNbXCJMaXN0RXhpdFwiXSA9IFwiTGlzdDpleGl0XCI7XG4gICAgQVNUTm9kZVR5cGVzW1wiSGVhZGVyXCJdID0gXCJIZWFkZXJcIjtcbiAgICBBU1ROb2RlVHlwZXNbXCJIZWFkZXJFeGl0XCJdID0gXCJIZWFkZXI6ZXhpdFwiO1xuICAgIEFTVE5vZGVUeXBlc1tcIkNvZGVCbG9ja1wiXSA9IFwiQ29kZUJsb2NrXCI7XG4gICAgQVNUTm9kZVR5cGVzW1wiQ29kZUJsb2NrRXhpdFwiXSA9IFwiQ29kZUJsb2NrOmV4aXRcIjtcbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCB1c2UgSHRtbCBpbnN0ZWFkIG9mIGl0XG4gICAgICovXG4gICAgQVNUTm9kZVR5cGVzW1wiSHRtbEJsb2NrXCJdID0gXCJIdG1sQmxvY2tcIjtcbiAgICBBU1ROb2RlVHlwZXNbXCJIdG1sQmxvY2tFeGl0XCJdID0gXCJIdG1sQmxvY2s6ZXhpdFwiO1xuICAgIEFTVE5vZGVUeXBlc1tcIkhvcml6b250YWxSdWxlXCJdID0gXCJIb3Jpem9udGFsUnVsZVwiO1xuICAgIEFTVE5vZGVUeXBlc1tcIkhvcml6b250YWxSdWxlRXhpdFwiXSA9IFwiSG9yaXpvbnRhbFJ1bGU6ZXhpdFwiO1xuICAgIEFTVE5vZGVUeXBlc1tcIkNvbW1lbnRcIl0gPSBcIkNvbW1lbnRcIjtcbiAgICBBU1ROb2RlVHlwZXNbXCJDb21tZW50RXhpdFwiXSA9IFwiQ29tbWVudDpleGl0XCI7XG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBBU1ROb2RlVHlwZXNbXCJSZWZlcmVuY2VEZWZcIl0gPSBcIlJlZmVyZW5jZURlZlwiO1xuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgQVNUTm9kZVR5cGVzW1wiUmVmZXJlbmNlRGVmRXhpdFwiXSA9IFwiUmVmZXJlbmNlRGVmOmV4aXRcIjtcbiAgICAvLyBpbmxpbmVcbiAgICBBU1ROb2RlVHlwZXNbXCJTdHJcIl0gPSBcIlN0clwiO1xuICAgIEFTVE5vZGVUeXBlc1tcIlN0ckV4aXRcIl0gPSBcIlN0cjpleGl0XCI7XG4gICAgQVNUTm9kZVR5cGVzW1wiQnJlYWtcIl0gPSBcIkJyZWFrXCI7XG4gICAgQVNUTm9kZVR5cGVzW1wiQnJlYWtFeGl0XCJdID0gXCJCcmVhazpleGl0XCI7XG4gICAgQVNUTm9kZVR5cGVzW1wiRW1waGFzaXNcIl0gPSBcIkVtcGhhc2lzXCI7XG4gICAgQVNUTm9kZVR5cGVzW1wiRW1waGFzaXNFeGl0XCJdID0gXCJFbXBoYXNpczpleGl0XCI7XG4gICAgQVNUTm9kZVR5cGVzW1wiU3Ryb25nXCJdID0gXCJTdHJvbmdcIjtcbiAgICBBU1ROb2RlVHlwZXNbXCJTdHJvbmdFeGl0XCJdID0gXCJTdHJvbmc6ZXhpdFwiO1xuICAgIEFTVE5vZGVUeXBlc1tcIkh0bWxcIl0gPSBcIkh0bWxcIjtcbiAgICBBU1ROb2RlVHlwZXNbXCJIdG1sRXhpdFwiXSA9IFwiSHRtbDpleGl0XCI7XG4gICAgQVNUTm9kZVR5cGVzW1wiTGlua1wiXSA9IFwiTGlua1wiO1xuICAgIEFTVE5vZGVUeXBlc1tcIkxpbmtFeGl0XCJdID0gXCJMaW5rOmV4aXRcIjtcbiAgICBBU1ROb2RlVHlwZXNbXCJMaW5rUmVmZXJlbmNlXCJdID0gXCJMaW5rUmVmZXJlbmNlXCI7XG4gICAgQVNUTm9kZVR5cGVzW1wiTGlua1JlZmVyZW5jZUV4aXRcIl0gPSBcIkxpbmtSZWZlcmVuY2U6ZXhpdFwiO1xuICAgIEFTVE5vZGVUeXBlc1tcIkltYWdlXCJdID0gXCJJbWFnZVwiO1xuICAgIEFTVE5vZGVUeXBlc1tcIkltYWdlRXhpdFwiXSA9IFwiSW1hZ2U6ZXhpdFwiO1xuICAgIEFTVE5vZGVUeXBlc1tcIkltYWdlUmVmZXJlbmNlXCJdID0gXCJJbWFnZVJlZmVyZW5jZVwiO1xuICAgIEFTVE5vZGVUeXBlc1tcIkltYWdlUmVmZXJlbmNlRXhpdFwiXSA9IFwiSW1hZ2VSZWZlcmVuY2U6ZXhpdFwiO1xuICAgIEFTVE5vZGVUeXBlc1tcIkRlZmluaXRpb25cIl0gPSBcIkRlZmluaXRpb25cIjtcbiAgICBBU1ROb2RlVHlwZXNbXCJEZWZpbml0aW9uRXhpdFwiXSA9IFwiRGVmaW5pdGlvbjpleGl0XCI7XG4gICAgQVNUTm9kZVR5cGVzW1wiQ29kZVwiXSA9IFwiQ29kZVwiO1xuICAgIEFTVE5vZGVUeXBlc1tcIkNvZGVFeGl0XCJdID0gXCJDb2RlOmV4aXRcIjtcbiAgICBBU1ROb2RlVHlwZXNbXCJEZWxldGVcIl0gPSBcIkRlbGV0ZVwiO1xuICAgIEFTVE5vZGVUeXBlc1tcIkRlbGV0ZUV4aXRcIl0gPSBcIkRlbGV0ZTpleGl0XCI7XG4gICAgLy8gVGFibGUgaXMgc3VwcG9ydGVkIGluIHRleHRsaW50IHYxMytcbiAgICBBU1ROb2RlVHlwZXNbXCJUYWJsZVwiXSA9IFwiVGFibGVcIjtcbiAgICBBU1ROb2RlVHlwZXNbXCJUYWJsZUV4aXRcIl0gPSBcIlRhYmxlOmV4aXRcIjtcbiAgICBBU1ROb2RlVHlwZXNbXCJUYWJsZVJvd1wiXSA9IFwiVGFibGVSb3dcIjtcbiAgICBBU1ROb2RlVHlwZXNbXCJUYWJsZVJvd0V4aXRcIl0gPSBcIlRhYmxlUm93OmV4aXRcIjtcbiAgICBBU1ROb2RlVHlwZXNbXCJUYWJsZUNlbGxcIl0gPSBcIlRhYmxlQ2VsbFwiO1xuICAgIEFTVE5vZGVUeXBlc1tcIlRhYmxlQ2VsbEV4aXRcIl0gPSBcIlRhYmxlQ2VsbDpleGl0XCI7XG59KShBU1ROb2RlVHlwZXMgfHwgKGV4cG9ydHMuQVNUTm9kZVR5cGVzID0gQVNUTm9kZVR5cGVzID0ge30pKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFTVE5vZGVUeXBlcy5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuQVNUTm9kZVR5cGVzID0gdm9pZCAwO1xudmFyIEFTVE5vZGVUeXBlc19qc18xID0gcmVxdWlyZShcIi4vQVNUTm9kZVR5cGVzLmpzXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQVNUTm9kZVR5cGVzXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBBU1ROb2RlVHlwZXNfanNfMS5BU1ROb2RlVHlwZXM7IH0gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBhc3Rfbm9kZV90eXBlc18xID0gcmVxdWlyZShcIkB0ZXh0bGludC9hc3Qtbm9kZS10eXBlc1wiKTtcbi8qKlxuICogUnVsZUhlbHBlciBpcyBoZWxwZXIgY2xhc3MgZm9yIHRleHRsaW50LlxuICogQGNsYXNzIFJ1bGVIZWxwZXJcbiAqL1xudmFyIFJ1bGVIZWxwZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZSBSdWxlSGVscGVyIHdpdGggUnVsZUNvbnRleHQgb2JqZWN0LlxuICAgICAqIEBwYXJhbSBydWxlQ29udGV4dCB0aGUgcnVsZUNvbnRleHQgaXMgY29udGV4dCBvYmplY3Qgb2YgdGhlIHJ1bGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gUnVsZUhlbHBlcihydWxlQ29udGV4dCkge1xuICAgICAgICB0aGlzLl9ydWxlQ29udGV4dCA9IHJ1bGVDb250ZXh0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgcGFyZW50cyBvZiBub2RlLlxuICAgICAqIFRoZSBwYXJlbnQgbm9kZXMgYXJlIHJldHVybmVkIGluIG9yZGVyIGZyb20gdGhlIGNsb3Nlc3QgcGFyZW50IHRvIHRoZSBvdXRlciBvbmVzLlxuICAgICAqIHtAbGluayBub2RlfSBpcyBub3QgY29udGFpbmVkIGluIHRoZSByZXN1bHRzLlxuICAgICAqIEBwYXJhbSB7VHh0Tm9kZX0gbm9kZSB0aGUgbm9kZSBpcyBzdGFydCBwb2ludC5cbiAgICAgKi9cbiAgICBSdWxlSGVscGVyLnByb3RvdHlwZS5nZXRQYXJlbnRzID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgICB2YXIgcGFyZW50ID0gbm9kZS5wYXJlbnQ7XG4gICAgICAgIHdoaWxlIChwYXJlbnQgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2gocGFyZW50KTtcbiAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybiB0cnVlIGlmIGBub2RlYCBpcyB3cmFwcGVkIGFueSBvbmUgb2Ygbm9kZSB7QGxpbmsgdHlwZXN9LlxuICAgICAqIEBwYXJhbSB7VHh0Tm9kZX0gbm9kZSBpcyB0YXJnZXQgbm9kZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IHR5cGVzIGFyZSB3cmFwcGVkIHRhcmdldCBub2RlXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgUnVsZUhlbHBlci5wcm90b3R5cGUuaXNDaGlsZE5vZGUgPSBmdW5jdGlvbiAobm9kZSwgdHlwZXMpIHtcbiAgICAgICAgdmFyIHBhcmVudHMgPSB0aGlzLmdldFBhcmVudHMobm9kZSk7XG4gICAgICAgIHZhciBwYXJlbnRzVHlwZXMgPSBwYXJlbnRzLm1hcChmdW5jdGlvbiAocGFyZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyZW50LnR5cGU7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdHlwZXMuc29tZShmdW5jdGlvbiAodHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuIHBhcmVudHNUeXBlcy5zb21lKGZ1bmN0aW9uIChwYXJlbnRUeXBlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcmVudFR5cGUgPT09IHR5cGU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgbm9kZSBpcyBTdHIgbm9kZSBhbmQgZmlsbCBmb2xsb3dpbmcgY29uZGl0aW9uc1xuICAgICAqXG4gICAgICogLSB0aGUgbm9kZSBpcyBTdHIgbm9kZVxuICAgICAqIC0gdGhlIG5vZGUgaXMgdW5kZXIgdGhlIFBhcmFncmFwaCBub2RlXG4gICAgICogLSB0aGUgbm9kZSBpcyBub3QgdW5kZXIgdGhlIEJsb2NrUXVvdGVcbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZnVsIGZvciBjb21tb24gdXNlLWNhc2UuXG4gICAgICogSWYgeW91IHdhbnQgdG8gbGludCBTdHIgbm9kZSwgYnV0IHlvdSBub3Qgd2FudCB0byBsaW50IHN0eWxlZCBub2RlLCB0aGlzIGZ1bmN0aW9uIGlzIHVzZWZ1bC5cbiAgICAgKiBzdHlsZWQgbm9kZSBpcyBMaW5rLCBTdHJvbmcsIEJsb2NrUXVvdGUsIEhlYWRlciBldGMuLi5cbiAgICAgKiBPcHBvc2l0ZSBvZiBpdCwgcGxhaW4gc3RyIG5vZGUgaXMganVzdCB1bmRlciB0aGUgUGFyYWdyYXBoIG5vZGUuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogUmV0dXJuIHRydWVcbiAgICAgKlxuICAgICAqIC0tLVxuICAgICAqIHN0ciBzdHIgc3RyXG4gICAgICogLSBsaXN0IHRleHRcbiAgICAgKiAtLS1cbiAgICAgKlxuICAgICAqIFJldHVybiBmYWxzZVxuICAgICAqXG4gICAgICogLS0tLVxuICAgICAqICMgSGVhZGVyXG4gICAgICogIVthbHQgdGV4dF0oaHR0cHM6Ly9leGFtcGxlLmNvbSlcbiAgICAgKiBbbGluayB0aXRsZV0oaHR0cHM6Ly9leGFtcGxlLmNvbSlcbiAgICAgKiA+IEJsb2NrUXVvdGVcbiAgICAgKiAqKlN0cm9uZyoqXG4gICAgICogW15mb290bm90ZV06IHRleHQgdGV4dFxuICAgICAqIC0tLS1cbiAgICAgKlxuICAgICAqIFN1bW1hcnk6XG4gICAgICpcbiAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgbm9kZSBpcyBwbGFpbiB0ZXh0LlxuICAgICAqIEluIG90aGVyIHdvcmRzLCByZXR1cm4gZmFsc2UgaWYgdGhlIG5vZGUgaXMgc3R5bGVkXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbm9kZVxuICAgICAqL1xuICAgIFJ1bGVIZWxwZXIucHJvdG90eXBlLmlzUGxhaW5TdHJOb2RlID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAobm9kZS50eXBlICE9PSBhc3Rfbm9kZV90eXBlc18xLkFTVE5vZGVUeXBlcy5TdHIpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKChfYSA9IG5vZGUucGFyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudHlwZSkgIT09IGFzdF9ub2RlX3R5cGVzXzEuQVNUTm9kZVR5cGVzLlBhcmFncmFwaCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBpc0luVW5jb250cm9sbGFibGVOb2RlID0gdGhpcy5pc0NoaWxkTm9kZShub2RlLCBbXG4gICAgICAgICAgICAvLyA8YmxvY2txdW90ZT4gaXMgQmxvY2sgbm9kZSBpbiBodG1sLiBJdCBjYW4gaGFzIFByYWdhcmFwaCBub2RlIGFzIGNoaWxkcmVuXG4gICAgICAgICAgICBhc3Rfbm9kZV90eXBlc18xLkFTVE5vZGVUeXBlcy5CbG9ja1F1b3RlXG4gICAgICAgIF0pO1xuICAgICAgICByZXR1cm4gIWlzSW5VbmNvbnRyb2xsYWJsZU5vZGU7XG4gICAgfTtcbiAgICByZXR1cm4gUnVsZUhlbHBlcjtcbn0oKSk7XG5leHBvcnRzLmRlZmF1bHQgPSBSdWxlSGVscGVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGV4dGxpbnQtcnVsZS1oZWxwZXIuanMubWFwIiwiJ3VzZSBzdHJpY3QnXG5cbm1vZHVsZS5leHBvcnRzID0gY29udmVydFxuXG5mdW5jdGlvbiBjb252ZXJ0KHRlc3QpIHtcbiAgaWYgKHRlc3QgPT0gbnVsbCkge1xuICAgIHJldHVybiBva1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0ZXN0ID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB0eXBlRmFjdG9yeSh0ZXN0KVxuICB9XG5cbiAgaWYgKHR5cGVvZiB0ZXN0ID09PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiAnbGVuZ3RoJyBpbiB0ZXN0ID8gYW55RmFjdG9yeSh0ZXN0KSA6IGFsbEZhY3RvcnkodGVzdClcbiAgfVxuXG4gIGlmICh0eXBlb2YgdGVzdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB0ZXN0XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGZ1bmN0aW9uLCBzdHJpbmcsIG9yIG9iamVjdCBhcyB0ZXN0Jylcbn1cblxuLy8gVXRpbGl0eSBhc3NlcnQgZWFjaCBwcm9wZXJ0eSBpbiBgdGVzdGAgaXMgcmVwcmVzZW50ZWQgaW4gYG5vZGVgLCBhbmQgZWFjaFxuLy8gdmFsdWVzIGFyZSBzdHJpY3RseSBlcXVhbC5cbmZ1bmN0aW9uIGFsbEZhY3RvcnkodGVzdCkge1xuICByZXR1cm4gYWxsXG5cbiAgZnVuY3Rpb24gYWxsKG5vZGUpIHtcbiAgICB2YXIga2V5XG5cbiAgICBmb3IgKGtleSBpbiB0ZXN0KSB7XG4gICAgICBpZiAobm9kZVtrZXldICE9PSB0ZXN0W2tleV0pIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlXG4gIH1cbn1cblxuZnVuY3Rpb24gYW55RmFjdG9yeSh0ZXN0cykge1xuICB2YXIgY2hlY2tzID0gW11cbiAgdmFyIGluZGV4ID0gLTFcblxuICB3aGlsZSAoKytpbmRleCA8IHRlc3RzLmxlbmd0aCkge1xuICAgIGNoZWNrc1tpbmRleF0gPSBjb252ZXJ0KHRlc3RzW2luZGV4XSlcbiAgfVxuXG4gIHJldHVybiBhbnlcblxuICBmdW5jdGlvbiBhbnkoKSB7XG4gICAgdmFyIGluZGV4ID0gLTFcblxuICAgIHdoaWxlICgrK2luZGV4IDwgY2hlY2tzLmxlbmd0aCkge1xuICAgICAgaWYgKGNoZWNrc1tpbmRleF0uYXBwbHkodGhpcywgYXJndW1lbnRzKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbi8vIFV0aWxpdHkgdG8gY29udmVydCBhIHN0cmluZyBpbnRvIGEgZnVuY3Rpb24gd2hpY2ggY2hlY2tzIGEgZ2l2ZW4gbm9kZeKAmXMgdHlwZVxuLy8gZm9yIHNhaWQgc3RyaW5nLlxuZnVuY3Rpb24gdHlwZUZhY3RvcnkodGVzdCkge1xuICByZXR1cm4gdHlwZVxuXG4gIGZ1bmN0aW9uIHR5cGUobm9kZSkge1xuICAgIHJldHVybiBCb29sZWFuKG5vZGUgJiYgbm9kZS50eXBlID09PSB0ZXN0KVxuICB9XG59XG5cbi8vIFV0aWxpdHkgdG8gcmV0dXJuIHRydWUuXG5mdW5jdGlvbiBvaygpIHtcbiAgcmV0dXJuIHRydWVcbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gaWRlbnRpdHlcbmZ1bmN0aW9uIGlkZW50aXR5KGQpIHtcbiAgcmV0dXJuIGRcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5tb2R1bGUuZXhwb3J0cyA9IHZpc2l0UGFyZW50c1xuXG52YXIgY29udmVydCA9IHJlcXVpcmUoJ3VuaXN0LXV0aWwtaXMvY29udmVydCcpXG52YXIgY29sb3IgPSByZXF1aXJlKCcuL2NvbG9yJylcblxudmFyIENPTlRJTlVFID0gdHJ1ZVxudmFyIFNLSVAgPSAnc2tpcCdcbnZhciBFWElUID0gZmFsc2VcblxudmlzaXRQYXJlbnRzLkNPTlRJTlVFID0gQ09OVElOVUVcbnZpc2l0UGFyZW50cy5TS0lQID0gU0tJUFxudmlzaXRQYXJlbnRzLkVYSVQgPSBFWElUXG5cbmZ1bmN0aW9uIHZpc2l0UGFyZW50cyh0cmVlLCB0ZXN0LCB2aXNpdG9yLCByZXZlcnNlKSB7XG4gIHZhciBzdGVwXG4gIHZhciBpc1xuXG4gIGlmICh0eXBlb2YgdGVzdCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgdmlzaXRvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldmVyc2UgPSB2aXNpdG9yXG4gICAgdmlzaXRvciA9IHRlc3RcbiAgICB0ZXN0ID0gbnVsbFxuICB9XG5cbiAgaXMgPSBjb252ZXJ0KHRlc3QpXG4gIHN0ZXAgPSByZXZlcnNlID8gLTEgOiAxXG5cbiAgZmFjdG9yeSh0cmVlLCBudWxsLCBbXSkoKVxuXG4gIGZ1bmN0aW9uIGZhY3Rvcnkobm9kZSwgaW5kZXgsIHBhcmVudHMpIHtcbiAgICB2YXIgdmFsdWUgPSB0eXBlb2Ygbm9kZSA9PT0gJ29iamVjdCcgJiYgbm9kZSAhPT0gbnVsbCA/IG5vZGUgOiB7fVxuICAgIHZhciBuYW1lXG5cbiAgICBpZiAodHlwZW9mIHZhbHVlLnR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBuYW1lID1cbiAgICAgICAgdHlwZW9mIHZhbHVlLnRhZ05hbWUgPT09ICdzdHJpbmcnXG4gICAgICAgICAgPyB2YWx1ZS50YWdOYW1lXG4gICAgICAgICAgOiB0eXBlb2YgdmFsdWUubmFtZSA9PT0gJ3N0cmluZydcbiAgICAgICAgICA/IHZhbHVlLm5hbWVcbiAgICAgICAgICA6IHVuZGVmaW5lZFxuXG4gICAgICB2aXNpdC5kaXNwbGF5TmFtZSA9XG4gICAgICAgICdub2RlICgnICsgY29sb3IodmFsdWUudHlwZSArIChuYW1lID8gJzwnICsgbmFtZSArICc+JyA6ICcnKSkgKyAnKSdcbiAgICB9XG5cbiAgICByZXR1cm4gdmlzaXRcblxuICAgIGZ1bmN0aW9uIHZpc2l0KCkge1xuICAgICAgdmFyIGdyYW5kcGFyZW50cyA9IHBhcmVudHMuY29uY2F0KG5vZGUpXG4gICAgICB2YXIgcmVzdWx0ID0gW11cbiAgICAgIHZhciBzdWJyZXN1bHRcbiAgICAgIHZhciBvZmZzZXRcblxuICAgICAgaWYgKCF0ZXN0IHx8IGlzKG5vZGUsIGluZGV4LCBwYXJlbnRzW3BhcmVudHMubGVuZ3RoIC0gMV0gfHwgbnVsbCkpIHtcbiAgICAgICAgcmVzdWx0ID0gdG9SZXN1bHQodmlzaXRvcihub2RlLCBwYXJlbnRzKSlcblxuICAgICAgICBpZiAocmVzdWx0WzBdID09PSBFWElUKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlLmNoaWxkcmVuICYmIHJlc3VsdFswXSAhPT0gU0tJUCkge1xuICAgICAgICBvZmZzZXQgPSAocmV2ZXJzZSA/IG5vZGUuY2hpbGRyZW4ubGVuZ3RoIDogLTEpICsgc3RlcFxuXG4gICAgICAgIHdoaWxlIChvZmZzZXQgPiAtMSAmJiBvZmZzZXQgPCBub2RlLmNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICAgIHN1YnJlc3VsdCA9IGZhY3Rvcnkobm9kZS5jaGlsZHJlbltvZmZzZXRdLCBvZmZzZXQsIGdyYW5kcGFyZW50cykoKVxuXG4gICAgICAgICAgaWYgKHN1YnJlc3VsdFswXSA9PT0gRVhJVCkge1xuICAgICAgICAgICAgcmV0dXJuIHN1YnJlc3VsdFxuICAgICAgICAgIH1cblxuICAgICAgICAgIG9mZnNldCA9XG4gICAgICAgICAgICB0eXBlb2Ygc3VicmVzdWx0WzFdID09PSAnbnVtYmVyJyA/IHN1YnJlc3VsdFsxXSA6IG9mZnNldCArIHN0ZXBcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHRvUmVzdWx0KHZhbHVlKSB7XG4gIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICdsZW5ndGgnIGluIHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBbQ09OVElOVUUsIHZhbHVlXVxuICB9XG5cbiAgcmV0dXJuIFt2YWx1ZV1cbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5tb2R1bGUuZXhwb3J0cyA9IHZpc2l0XG5cbnZhciB2aXNpdFBhcmVudHMgPSByZXF1aXJlKCd1bmlzdC11dGlsLXZpc2l0LXBhcmVudHMnKVxuXG52YXIgQ09OVElOVUUgPSB2aXNpdFBhcmVudHMuQ09OVElOVUVcbnZhciBTS0lQID0gdmlzaXRQYXJlbnRzLlNLSVBcbnZhciBFWElUID0gdmlzaXRQYXJlbnRzLkVYSVRcblxudmlzaXQuQ09OVElOVUUgPSBDT05USU5VRVxudmlzaXQuU0tJUCA9IFNLSVBcbnZpc2l0LkVYSVQgPSBFWElUXG5cbmZ1bmN0aW9uIHZpc2l0KHRyZWUsIHRlc3QsIHZpc2l0b3IsIHJldmVyc2UpIHtcbiAgaWYgKHR5cGVvZiB0ZXN0ID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB2aXNpdG9yICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV2ZXJzZSA9IHZpc2l0b3JcbiAgICB2aXNpdG9yID0gdGVzdFxuICAgIHRlc3QgPSBudWxsXG4gIH1cblxuICB2aXNpdFBhcmVudHModHJlZSwgdGVzdCwgb3ZlcmxvYWQsIHJldmVyc2UpXG5cbiAgZnVuY3Rpb24gb3ZlcmxvYWQobm9kZSwgcGFyZW50cykge1xuICAgIHZhciBwYXJlbnQgPSBwYXJlbnRzW3BhcmVudHMubGVuZ3RoIC0gMV1cbiAgICB2YXIgaW5kZXggPSBwYXJlbnQgPyBwYXJlbnQuY2hpbGRyZW4uaW5kZXhPZihub2RlKSA6IG51bGxcbiAgICByZXR1cm4gdmlzaXRvcihub2RlLCBpbmRleCwgcGFyZW50KVxuICB9XG59XG4iLCIvLyBMSUNFTlNFIDogTUlUXG5cInVzZSBzdHJpY3RcIjtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciB1bmlzdF91dGlsX3Zpc2l0XzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcInVuaXN0LXV0aWwtdmlzaXRcIikpO1xuLyoqXG4gKiBJZ25vcmUgbm9kZSBtYW5hZ2VyIHRoYXQgbWFuYWdlciBpZ25vcmVkIHJhbmdlcy5cbiAqXG4gKi9cbnZhciBJZ25vcmVOb2RlTWFuYWdlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBJZ25vcmVOb2RlTWFuYWdlcigpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtbbnVtYmVyLG51bWJlcl1bXX1cbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX2lnbm9yZWRSYW5nZUxpc3QgPSBbXTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KElnbm9yZU5vZGVNYW5hZ2VyLnByb3RvdHlwZSwgXCJpZ25vcmVkUmFuZ2VzXCIsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEByZXR1cm5zIHsobnVtYmVyKVtdW119XG4gICAgICAgICAqL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9pZ25vcmVkUmFuZ2VMaXN0O1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgLyoqXG4gICAgICogfC4uLi4uLi58XG4gICAgICogXiAgICAgICBeXG4gICAgICogSWdub3JlZCBSYW5nZVxuICAgICAqXG4gICAgICogICAgfC4uLi4uLi4ufFxuICAgICAqICAgIF5cbiAgICAgKiAgaW5kZXhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXhcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBJZ25vcmVOb2RlTWFuYWdlci5wcm90b3R5cGUuaXNJZ25vcmVkSW5kZXggPSBmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lnbm9yZWRSYW5nZUxpc3Quc29tZShmdW5jdGlvbiAocmFuZ2UpIHtcbiAgICAgICAgICAgIHZhciBzdGFydCA9IHJhbmdlWzBdLCBlbmQgPSByYW5nZVsxXTtcbiAgICAgICAgICAgIHJldHVybiBzdGFydCA8PSBpbmRleCAmJiBpbmRleCA8IGVuZDtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1tudW1iZXIsIG51bWJlcl19IGFSYW5nZVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqIEBkZXByZWNhdGVkIFRoaXMgbWV0aG9kIHdpbGwgYmUgcmVtb3ZlZFxuICAgICAqL1xuICAgIElnbm9yZU5vZGVNYW5hZ2VyLnByb3RvdHlwZS5pc0lnbm9yZWRSYW5nZSA9IGZ1bmN0aW9uIChhUmFuZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNJZ25vcmVkSW5kZXgoYVJhbmdlWzBdKSB8fCB0aGlzLmlzSWdub3JlZEluZGV4KGFSYW5nZVsxXSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gbm9kZVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIElnbm9yZU5vZGVNYW5hZ2VyLnByb3RvdHlwZS5pc0lnbm9yZWQgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0lnbm9yZWRSYW5nZShub2RlLnJhbmdlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIGFkZCBub2RlIHRvIGlnbm9yZSByYW5nZSBsaXN0XG4gICAgICogQHBhcmFtIHtUeHROb2RlfSBub2RlXG4gICAgICovXG4gICAgSWdub3JlTm9kZU1hbmFnZXIucHJvdG90eXBlLmlnbm9yZSA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIHRoaXMuaWdub3JlUmFuZ2Uobm9kZS5yYW5nZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBhZGQgcmFuZ2UgdG8gaWdub3JlIHJhbmdlIGxpc3RcbiAgICAgKiBAcGFyYW0ge1tudW1iZXIsIG51bWJlcl19IHJhbmdlXG4gICAgICovXG4gICAgSWdub3JlTm9kZU1hbmFnZXIucHJvdG90eXBlLmlnbm9yZVJhbmdlID0gZnVuY3Rpb24gKHJhbmdlKSB7XG4gICAgICAgIHRoaXMuX2lnbm9yZWRSYW5nZUxpc3QucHVzaChyYW5nZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBpZ25vcmUgY2hpbGRyZW4gbm9kZSBvZiBgbm9kZWAsXG4gICAgICogaWYgdGhlIGNoaWxkcmVuIG5vZGUgaGFzIHRoZSB0eXBlIHRoYXQgaXMgaW5jbHVkZWQgaW4gYGlnbm9yZWROb2RlVHlwZXNgLlxuICAgICAqIEBwYXJhbSB7VHh0Tm9kZX0gdGFyZ2V0Tm9kZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IGlnbm9yZWROb2RlVHlwZXNcbiAgICAgKi9cbiAgICBJZ25vcmVOb2RlTWFuYWdlci5wcm90b3R5cGUuaWdub3JlQ2hpbGRyZW5CeVR5cGVzID0gZnVuY3Rpb24gKHRhcmdldE5vZGUsIGlnbm9yZWROb2RlVHlwZXMpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgKDAsIHVuaXN0X3V0aWxfdmlzaXRfMS5kZWZhdWx0KSh0YXJnZXROb2RlLCBmdW5jdGlvbiAodmlzaXRlZE5vZGUpIHtcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IHR5cGUgaXMgVHh0Tm9kZVR5cGVcbiAgICAgICAgICAgIGlmIChpZ25vcmVkTm9kZVR5cGVzLmluY2x1ZGVzKHZpc2l0ZWROb2RlLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuaWdub3JlKHZpc2l0ZWROb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gSWdub3JlTm9kZU1hbmFnZXI7XG59KCkpO1xuZXhwb3J0cy5kZWZhdWx0ID0gSWdub3JlTm9kZU1hbmFnZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1JZ25vcmVOb2RlTWFuYWdlci5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gIENvcHlyaWdodCAoQykgMjAxNCBZdXN1a2UgU3V6dWtpIDx1dGF0YW5lLnRlYUBnbWFpbC5jb20+XG5cbiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuXG4gICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodFxuICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHRcbiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGVcbiAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG5cbiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiAgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuICBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuICBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgPENPUFlSSUdIVCBIT0xERVI+IEJFIExJQUJMRSBGT1IgQU5ZXG4gIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTXG4gIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUztcbiAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EXG4gIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4gIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRlxuICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuYmluYXJ5U2VhcmNoID0gZXhwb3J0cy51cHBlckJvdW5kID0gZXhwb3J0cy5sb3dlckJvdW5kID0gZXhwb3J0cy5jb21wYXJlID0gdm9pZCAwO1xuZnVuY3Rpb24gY29tcGFyZSh2MSwgdjIpIHtcbiAgICByZXR1cm4gdjEgPCB2Mjtcbn1cbmV4cG9ydHMuY29tcGFyZSA9IGNvbXBhcmU7XG5mdW5jdGlvbiB1cHBlckJvdW5kKGFycmF5LCB2YWx1ZSwgY29tcCA9IGNvbXBhcmUpIHtcbiAgICBsZXQgbGVuID0gYXJyYXkubGVuZ3RoO1xuICAgIGxldCBpID0gMDtcbiAgICB3aGlsZSAobGVuKSB7XG4gICAgICAgIGxldCBkaWZmID0gbGVuID4+PiAxO1xuICAgICAgICBsZXQgY3Vyc29yID0gaSArIGRpZmY7XG4gICAgICAgIGlmIChjb21wKHZhbHVlLCBhcnJheVtjdXJzb3JdKSkge1xuICAgICAgICAgICAgbGVuID0gZGlmZjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGkgPSBjdXJzb3IgKyAxO1xuICAgICAgICAgICAgbGVuIC09IGRpZmYgKyAxO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpO1xufVxuZXhwb3J0cy51cHBlckJvdW5kID0gdXBwZXJCb3VuZDtcbmZ1bmN0aW9uIGxvd2VyQm91bmQoYXJyYXksIHZhbHVlLCBjb21wID0gY29tcGFyZSkge1xuICAgIGxldCBsZW4gPSBhcnJheS5sZW5ndGg7XG4gICAgbGV0IGkgPSAwO1xuICAgIHdoaWxlIChsZW4pIHtcbiAgICAgICAgbGV0IGRpZmYgPSBsZW4gPj4+IDE7XG4gICAgICAgIGxldCBjdXJzb3IgPSBpICsgZGlmZjtcbiAgICAgICAgaWYgKGNvbXAoYXJyYXlbY3Vyc29yXSwgdmFsdWUpKSB7XG4gICAgICAgICAgICBpID0gY3Vyc29yICsgMTtcbiAgICAgICAgICAgIGxlbiAtPSBkaWZmICsgMTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxlbiA9IGRpZmY7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGk7XG59XG5leHBvcnRzLmxvd2VyQm91bmQgPSBsb3dlckJvdW5kO1xuZnVuY3Rpb24gYmluYXJ5U2VhcmNoKGFycmF5LCB2YWx1ZSwgY29tcCA9IGNvbXBhcmUpIHtcbiAgICBsZXQgY3Vyc29yID0gbG93ZXJCb3VuZChhcnJheSwgdmFsdWUsIGNvbXApO1xuICAgIHJldHVybiBjdXJzb3IgIT09IGFycmF5Lmxlbmd0aCAmJiAhY29tcCh2YWx1ZSwgYXJyYXlbY3Vyc29yXSk7XG59XG5leHBvcnRzLmJpbmFyeVNlYXJjaCA9IGJpbmFyeVNlYXJjaDtcbi8qIHZpbTogc2V0IHN3PTQgdHM9NCBldCB0dz04MCA6ICovXG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gIENvcHlyaWdodCAoQykgMjAxNCBZdXN1a2UgU3V6dWtpIDx1dGF0YW5lLnRlYUBnbWFpbC5jb20+XG5cbiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuXG4gICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodFxuICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHRcbiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGVcbiAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG5cbiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiAgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuICBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuICBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgPENPUFlSSUdIVCBIT0xERVI+IEJFIExJQUJMRSBGT1IgQU5ZXG4gIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTXG4gIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUztcbiAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EXG4gIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4gIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRlxuICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuU3RydWN0dXJlZFNvdXJjZSA9IHZvaWQgMDtcbmNvbnN0IGJvdW5kYXJ5XzEgPSByZXF1aXJlKFwiYm91bmRhcnlcIik7XG4vKipcbiAqIFN0cnVjdHVyZWRTb3VyY2VcbiAqL1xuY2xhc3MgU3RydWN0dXJlZFNvdXJjZSB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdHMgU3RydWN0dXJlZFNvdXJjZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgLSBzb3VyY2UgY29kZSB0ZXh0LlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHNvdXJjZSkge1xuICAgICAgICB0aGlzLmluZGljZSA9IFswXTtcbiAgICAgICAgbGV0IHJlZ2V4cCA9IC9bXFxyXFxuXFx1MjAyOFxcdTIwMjldL2c7XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IHNvdXJjZS5sZW5ndGg7XG4gICAgICAgIHJlZ2V4cC5sYXN0SW5kZXggPSAwO1xuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHJlZ2V4cC5leGVjKHNvdXJjZSk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGluZGV4ID0gcmVzdWx0LmluZGV4O1xuICAgICAgICAgICAgaWYgKHNvdXJjZS5jaGFyQ29kZUF0KGluZGV4KSA9PT0gMHgwRCAvKiAnXFxyJyAqLyAmJlxuICAgICAgICAgICAgICAgIHNvdXJjZS5jaGFyQ29kZUF0KGluZGV4ICsgMSkgPT09IDB4MEEgLyogJ1xcbicgKi8pIHtcbiAgICAgICAgICAgICAgICBpbmRleCArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IG5leHRJbmRleCA9IGluZGV4ICsgMTtcbiAgICAgICAgICAgIC8vIElmIHRoZXJlJ3MgYSBsYXN0IGxpbmUgdGVybWluYXRvciwgd2UgcHVzaCBpdCB0byB0aGUgaW5kaWNlLlxuICAgICAgICAgICAgLy8gU28gdXNlIDwgaW5zdGVhZCBvZiA8PS5cbiAgICAgICAgICAgIGlmIChsZW5ndGggPCBuZXh0SW5kZXgpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuaW5kaWNlLnB1c2gobmV4dEluZGV4KTtcbiAgICAgICAgICAgIHJlZ2V4cC5sYXN0SW5kZXggPSBuZXh0SW5kZXg7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IGxpbmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmluZGljZS5sZW5ndGg7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U291cmNlTG9jYXRpb259IGxvYyAtIGxvY2F0aW9uIGluZGljYXRvci5cbiAgICAgKiBAcmV0dXJuIHtbIG51bWJlciwgbnVtYmVyIF19IHJhbmdlLlxuICAgICAqL1xuICAgIGxvY2F0aW9uVG9SYW5nZShsb2MpIHtcbiAgICAgICAgcmV0dXJuIFt0aGlzLnBvc2l0aW9uVG9JbmRleChsb2Muc3RhcnQpLCB0aGlzLnBvc2l0aW9uVG9JbmRleChsb2MuZW5kKV07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7WyBudW1iZXIsIG51bWJlciBdfSByYW5nZSAtIHBhaXIgb2YgaW5kaWNlLlxuICAgICAqIEByZXR1cm4ge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbi5cbiAgICAgKi9cbiAgICByYW5nZVRvTG9jYXRpb24ocmFuZ2UpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN0YXJ0OiB0aGlzLmluZGV4VG9Qb3NpdGlvbihyYW5nZVswXSksXG4gICAgICAgICAgICBlbmQ6IHRoaXMuaW5kZXhUb1Bvc2l0aW9uKHJhbmdlWzFdKVxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1NvdXJjZVBvc2l0aW9ufSBwb3MgLSBwb3NpdGlvbiBpbmRpY2F0b3IuXG4gICAgICogQHJldHVybiB7bnVtYmVyfSBpbmRleC5cbiAgICAgKi9cbiAgICBwb3NpdGlvblRvSW5kZXgocG9zKSB7XG4gICAgICAgIC8vIExpbmUgbnVtYmVyIHN0YXJ0cyB3aXRoIDEuXG4gICAgICAgIC8vIENvbHVtbiBudW1iZXIgc3RhcnRzIHdpdGggMC5cbiAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5pbmRpY2VbcG9zLmxpbmUgLSAxXTtcbiAgICAgICAgcmV0dXJuIHN0YXJ0ICsgcG9zLmNvbHVtbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gaW5kZXggdG8gdGhlIHNvdXJjZSBjb2RlLlxuICAgICAqIEByZXR1cm4ge1NvdXJjZVBvc2l0aW9ufSBwb3NpdGlvbi5cbiAgICAgKi9cbiAgICBpbmRleFRvUG9zaXRpb24oaW5kZXgpIHtcbiAgICAgICAgY29uc3Qgc3RhcnRMaW5lID0gKDAsIGJvdW5kYXJ5XzEudXBwZXJCb3VuZCkodGhpcy5pbmRpY2UsIGluZGV4KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGxpbmU6IHN0YXJ0TGluZSxcbiAgICAgICAgICAgIGNvbHVtbjogaW5kZXggLSB0aGlzLmluZGljZVtzdGFydExpbmUgLSAxXVxuICAgICAgICB9O1xuICAgIH1cbn1cbmV4cG9ydHMuU3RydWN0dXJlZFNvdXJjZSA9IFN0cnVjdHVyZWRTb3VyY2U7XG4vKiB2aW06IHNldCBzdz00IHRzPTQgZXQgdHc9ODAgOiAqL1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3RydWN0dXJlZC1zb3VyY2UuanMubWFwIiwiLy8gTElDRU5TRSA6IE1JVFxuXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlNvdXJjZUxvY2F0aW9uID0gdm9pZCAwO1xudmFyIHN0cnVjdHVyZWRfc291cmNlXzEgPSByZXF1aXJlKFwic3RydWN0dXJlZC1zb3VyY2VcIik7XG52YXIgU291cmNlTG9jYXRpb24gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gU291cmNlTG9jYXRpb24odGV4dCkge1xuICAgICAgICB0aGlzLnNvdXJjZSA9IG5ldyBzdHJ1Y3R1cmVkX3NvdXJjZV8xLlN0cnVjdHVyZWRTb3VyY2UodGV4dCk7XG4gICAgfVxuICAgIFNvdXJjZUxvY2F0aW9uLnByb3RvdHlwZS50b0Fic29sdXRlTG9jYXRpb24gPSBmdW5jdGlvbiAobm9kZSwgcGFkZGluZykge1xuICAgICAgICB2YXIgbm9kZVJhbmdlID0gbm9kZS5yYW5nZTtcbiAgICAgICAgdmFyIGxpbmUgPSBub2RlLmxvYy5zdGFydC5saW5lO1xuICAgICAgICB2YXIgY29sdW1uID0gbm9kZS5sb2Muc3RhcnQuY29sdW1uO1xuICAgICAgICAvLyB3aGVuIHVzZSB7aW5kZXh9XG4gICAgICAgIGlmIChwYWRkaW5nLmluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHZhciBwYWRkaW5nSW5kZXggPSBwYWRkaW5nLmluZGV4O1xuICAgICAgICAgICAgcmV0dXJuIG5vZGVSYW5nZVswXSArIHBhZGRpbmdJbmRleDtcbiAgICAgICAgfVxuICAgICAgICAvLyB3aGVuIHVzZSB7bGluZSwgY29sdW1ufVxuICAgICAgICBpZiAocGFkZGluZy5saW5lICE9PSB1bmRlZmluZWQgJiYgcGFkZGluZy5jb2x1bW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdmFyIGFkZGVkTGluZSA9IGxpbmUgKyBwYWRkaW5nLmxpbmU7XG4gICAgICAgICAgICAvLyB3aGVuIHJlcG9ydCB3aXRoIHBhZGRpbmcge2xpbmUsIGNvbHVtbn0sIG1lc3NhZ2UuY29sdW1uIHNob3VsZCBiZSAwICsgcGFkZGluZy5jb2x1bW4uXG4gICAgICAgICAgICAvLyBJbiBvdGhlciB3b3JkLCBwYWRkaW5nIGxpbmUgPiAwIGFuZCBtZXNzYWdlLmNvbHVtbiBzdGFydCB3aXRoIDAuXG4gICAgICAgICAgICBpZiAocGFkZGluZy5jb2x1bW4gPiAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc291cmNlLnBvc2l0aW9uVG9JbmRleCh7XG4gICAgICAgICAgICAgICAgICAgIGxpbmU6IGFkZGVkTGluZSxcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBwYWRkaW5nLmNvbHVtblxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc291cmNlLnBvc2l0aW9uVG9JbmRleCh7XG4gICAgICAgICAgICAgICAgICAgIGxpbmU6IGFkZGVkTGluZSxcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBjb2x1bW5cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyB3aGVuIHVzZSB7IGxpbmUgfSBvbmx5XG4gICAgICAgIGlmIChwYWRkaW5nLmxpbmUgIT09IHVuZGVmaW5lZCAmJiBwYWRkaW5nLmxpbmUgPiAwKSB7XG4gICAgICAgICAgICB2YXIgYWRkZWRMaW5lID0gbGluZSArIHBhZGRpbmcubGluZTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNvdXJjZS5wb3NpdGlvblRvSW5kZXgoe1xuICAgICAgICAgICAgICAgIGxpbmU6IGFkZGVkTGluZSxcbiAgICAgICAgICAgICAgICBjb2x1bW46IGNvbHVtblxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vZGVSYW5nZVswXTtcbiAgICB9O1xuICAgIHJldHVybiBTb3VyY2VMb2NhdGlvbjtcbn0oKSk7XG5leHBvcnRzLlNvdXJjZUxvY2F0aW9uID0gU291cmNlTG9jYXRpb247XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Tb3VyY2VMb2NhdGlvbi5qcy5tYXAiLCIvLyBNSVQgwqkgMjAxOCBhenVcblwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy53cmFwUmVwb3J0SGFuZGxlciA9IHdyYXBSZXBvcnRIYW5kbGVyO1xudmFyIHRleHRsaW50X3J1bGVfaGVscGVyXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vdGV4dGxpbnQtcnVsZS1oZWxwZXJcIikpO1xudmFyIElnbm9yZU5vZGVNYW5hZ2VyXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vSWdub3JlTm9kZU1hbmFnZXJcIikpO1xudmFyIFNvdXJjZUxvY2F0aW9uXzEgPSByZXF1aXJlKFwiLi9Tb3VyY2VMb2NhdGlvblwiKTtcbi8qKlxuICpcbiAqIEBwYXJhbSBjb250ZXh0XG4gKiBAcGFyYW0gb3B0aW9uc1xuICogQHBhcmFtIGhhbmRsZXJcbiAqL1xuZnVuY3Rpb24gd3JhcFJlcG9ydEhhbmRsZXIoY29udGV4dCwgb3B0aW9ucywgaGFuZGxlcikge1xuICAgIHZhciBpZ25vcmVOb2RlVHlwZXMgPSBvcHRpb25zLmlnbm9yZU5vZGVUeXBlcyB8fCBbXTtcbiAgICB2YXIgaWdub3JlTm9kZU1hbmFnZXIgPSBuZXcgSWdub3JlTm9kZU1hbmFnZXJfMS5kZWZhdWx0KCk7XG4gICAgdmFyIHJ1bGVIZWxwZXIgPSBuZXcgdGV4dGxpbnRfcnVsZV9oZWxwZXJfMS5kZWZhdWx0KGNvbnRleHQpO1xuICAgIHZhciB0ZXh0ID0gY29udGV4dC5nZXRTb3VyY2UoKTtcbiAgICB2YXIgc291cmNlTG9jYXRpb24gPSBuZXcgU291cmNlTG9jYXRpb25fMS5Tb3VyY2VMb2NhdGlvbih0ZXh0KTtcbiAgICB2YXIgcmVwb3J0SWZVbmlnbm9yZWQgPSBmdW5jdGlvbiByZXBvcnRJZlVuaWdub3JlZChub2RlLCBydWxlRXJyb3IpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gc291cmNlTG9jYXRpb24udG9BYnNvbHV0ZUxvY2F0aW9uKG5vZGUsIHJ1bGVFcnJvcik7XG4gICAgICAgIGlmIChpZ25vcmVOb2RlTWFuYWdlci5pc0lnbm9yZWRJbmRleChpbmRleCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29udGV4dC5yZXBvcnQobm9kZSwgcnVsZUVycm9yKTtcbiAgICB9O1xuICAgIHZhciBoYW5kbGVycyA9IGhhbmRsZXIocmVwb3J0SWZVbmlnbm9yZWQpO1xuICAgIE9iamVjdC5rZXlzKGhhbmRsZXJzKS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlVHlwZSkge1xuICAgICAgICB2YXIgbm9kZUhhbmRsZXIgPSBoYW5kbGVyc1tub2RlVHlwZV07XG4gICAgICAgIHZhciB3cmFwcGVkTm9kZUhhbmRsZXIgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICAgICAgLy8gY2hpbGQgbm9kZXNcbiAgICAgICAgICAgIGlnbm9yZU5vZGVNYW5hZ2VyLmlnbm9yZUNoaWxkcmVuQnlUeXBlcyhub2RlLCBpZ25vcmVOb2RlVHlwZXMpO1xuICAgICAgICAgICAgLy8gcGFyZW50IG5vZGVcbiAgICAgICAgICAgIGlmIChydWxlSGVscGVyLmlzQ2hpbGROb2RlKG5vZGUsIGlnbm9yZU5vZGVUeXBlcykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIW5vZGVIYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5vZGVIYW5kbGVyKG5vZGUpO1xuICAgICAgICB9O1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBpZ25vcmVcbiAgICAgICAgaGFuZGxlcnNbbm9kZVR5cGVdID0gd3JhcHBlZE5vZGVIYW5kbGVyO1xuICAgIH0pO1xuICAgIHJldHVybiBoYW5kbGVycztcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXdyYXAtcmVwb3J0LWhhbmRsZXIuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLndyYXBSZXBvcnRIYW5kbGVyID0gZXhwb3J0cy5SdWxlSGVscGVyID0gZXhwb3J0cy5JZ25vcmVOb2RlTWFuYWdlciA9IHZvaWQgMDtcbnZhciB0ZXh0bGludF9ydWxlX2hlbHBlcl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL3RleHRsaW50LXJ1bGUtaGVscGVyXCIpKTtcbmV4cG9ydHMuUnVsZUhlbHBlciA9IHRleHRsaW50X3J1bGVfaGVscGVyXzEuZGVmYXVsdDtcbnZhciBJZ25vcmVOb2RlTWFuYWdlcl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL0lnbm9yZU5vZGVNYW5hZ2VyXCIpKTtcbmV4cG9ydHMuSWdub3JlTm9kZU1hbmFnZXIgPSBJZ25vcmVOb2RlTWFuYWdlcl8xLmRlZmF1bHQ7XG52YXIgd3JhcF9yZXBvcnRfaGFuZGxlcl8xID0gcmVxdWlyZShcIi4vd3JhcC1yZXBvcnQtaGFuZGxlclwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIndyYXBSZXBvcnRIYW5kbGVyXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB3cmFwX3JlcG9ydF9oYW5kbGVyXzEud3JhcFJlcG9ydEhhbmRsZXI7IH0gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCIvLyBMSUNFTlNFIDogTUlUXG5cInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMucmVwb3J0ID0gZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF90ZXh0bGludFJ1bGVIZWxwZXIgPSByZXF1aXJlKFwidGV4dGxpbnQtcnVsZS1oZWxwZXJcIik7XG52YXIgSGFua2FrdVJlZ0V4cCA9IC8oW1xcdWZmNjEtXFx1ZmY5Zl0rKS9nO1xudmFyIHJlcG9ydCA9IGZ1bmN0aW9uIHJlcG9ydGVyKGNvbnRleHQpIHtcbiAgdmFyIHtcbiAgICBTeW50YXgsXG4gICAgUnVsZUVycm9yLFxuICAgIGZpeGVyLFxuICAgIHJlcG9ydCxcbiAgICBsb2NhdG9yLFxuICAgIGdldFNvdXJjZVxuICB9ID0gY29udGV4dDtcbiAgdmFyIGhlbHBlciA9IG5ldyBfdGV4dGxpbnRSdWxlSGVscGVyLlJ1bGVIZWxwZXIoY29udGV4dCk7XG4gIHJldHVybiB7XG4gICAgW1N5bnRheC5TdHJdKG5vZGUpIHtcbiAgICAgIGlmICghaGVscGVyLmlzUGxhaW5TdHJOb2RlKG5vZGUpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZhciBub2RlVGV4dCA9IGdldFNvdXJjZShub2RlKTtcbiAgICAgIGZvciAodmFyIG1hdGNoIG9mIG5vZGVUZXh0Lm1hdGNoQWxsKEhhbmtha3VSZWdFeHApKSB7XG4gICAgICAgIHZhciBfbWF0Y2gkaW5kZXg7XG4gICAgICAgIHZhciB0ZXh0ID0gbWF0Y2hbMF07XG4gICAgICAgIHZhciBpbmRleCA9IChfbWF0Y2gkaW5kZXggPSBtYXRjaC5pbmRleCkgIT09IG51bGwgJiYgX21hdGNoJGluZGV4ICE9PSB2b2lkIDAgPyBfbWF0Y2gkaW5kZXggOiAwO1xuICAgICAgICB2YXIgcmFuZ2UgPSBbaW5kZXgsIGluZGV4ICsgdGV4dC5sZW5ndGhdO1xuICAgICAgICB2YXIgcnVsZUVycm9yID0gbmV3IFJ1bGVFcnJvcihcIkRpc2FsbG93IHRvIHVzZSBcXHU1MzRBXFx1ODlEMlxcdTMwQUJcXHUzMEJGXFx1MzBBQlxcdTMwQ0E6IFxcXCJcIi5jb25jYXQodGV4dCwgXCJcXFwiXCIpLCB7XG4gICAgICAgICAgcGFkZGluZzogbG9jYXRvci5yYW5nZShyYW5nZSksXG4gICAgICAgICAgZml4OiBmaXhlci5yZXBsYWNlVGV4dFJhbmdlKHJhbmdlLCB0ZXh0Lm5vcm1hbGl6ZSgnTkZLQycpKVxuICAgICAgICB9KTtcbiAgICAgICAgcmVwb3J0KG5vZGUsIHJ1bGVFcnJvcik7XG4gICAgICB9XG4gICAgfVxuICB9O1xufTtcbmV4cG9ydHMucmVwb3J0ID0gcmVwb3J0O1xudmFyIF9kZWZhdWx0ID0ge1xuICBsaW50ZXI6IHJlcG9ydCxcbiAgZml4ZXI6IHJlcG9ydFxufTtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGV4dGxpbnQtcnVsZS1uby1oYW5rYWt1LWthbmEuanMubWFwIiwiaW1wb3J0IHsgZmluZEZvcmVpZ25DamtDaGFyYWN0ZXJzSW5KYXBhbmVzZSB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliL3NyYyc7XG5pbXBvcnQgdHlwZSB7IFRleHRsaW50S2VybmVsUnVsZSB9IGZyb20gJ0B0ZXh0bGludC9rZXJuZWwnO1xuXG4vLyBDaGVja3MgdGhlIHdob2xlIHNvdXJjZSBleGNlcHQgY29kZSBhbmQgSFRNTCBjb21tZW50cyAoc3BlYWtlciBub3RlcyksIHNpbmNlIHZpc2libGUgc2xpZGUgdGV4dCBhbHNvIGxpdmVzIGluXG4vLyBibG9jayBIVE1MLCBpbWFnZSBhbHQgdGV4dCwgYW5kIG90aGVyIG5vZGVzIHRoYXQgYSBwZXItbm9kZS10eXBlIHZpc2l0b3Igd291bGQgbWlzcy5cbmV4cG9ydCBjb25zdCBub0NoaW5lc2VLb3JlYW46IFRleHRsaW50S2VybmVsUnVsZVsncnVsZSddID0gKHsgZ2V0U291cmNlLCBsb2NhdG9yLCByZXBvcnQsIFJ1bGVFcnJvciwgU3ludGF4IH0pID0+IHtcbiAgY29uc3QgY29kZVJhbmdlczogKHJlYWRvbmx5IFtudW1iZXIsIG51bWJlcl0pW10gPSBbXTtcbiAgcmV0dXJuIHtcbiAgICBbU3ludGF4LkNvZGVdKG5vZGUpIHtcbiAgICAgIGNvZGVSYW5nZXMucHVzaChub2RlLnJhbmdlKTtcbiAgICB9LFxuICAgIFtTeW50YXguQ29kZUJsb2NrXShub2RlKSB7XG4gICAgICBjb2RlUmFuZ2VzLnB1c2gobm9kZS5yYW5nZSk7XG4gICAgfSxcbiAgICBbU3ludGF4LkRvY3VtZW50RXhpdF0obm9kZSkge1xuICAgICAgbGV0IHRleHQgPSBnZXRTb3VyY2Uobm9kZSk7XG4gICAgICBmb3IgKGNvbnN0IFtzdGFydCwgZW5kXSBvZiBjb2RlUmFuZ2VzKSB7XG4gICAgICAgIHRleHQgPSB0ZXh0LnNsaWNlKDAsIHN0YXJ0KSArICcgJy5yZXBlYXQoZW5kIC0gc3RhcnQpICsgdGV4dC5zbGljZShlbmQpO1xuICAgICAgfVxuICAgICAgdGV4dCA9IHRleHQucmVwbGFjZUFsbCgvPCEtLVtcXHNcXFNdKj8tLT58PChjb2RlfHByZXxzY3JpcHR8c3R5bGUpKD89W1xccy8+XSlbXFxzXFxTXSo/PFxcL1xcMVxccyo+L2dpLCAobm9uUHJvc2UpID0+XG4gICAgICAgICcgJy5yZXBlYXQobm9uUHJvc2UubGVuZ3RoKVxuICAgICAgKTtcbiAgICAgIGNvbnN0IHJhbmdlczogW251bWJlciwgbnVtYmVyXVtdID0gW107XG4gICAgICBmb3IgKGNvbnN0IHsgMDogY2hhciwgaW5kZXggfSBvZiB0ZXh0Lm1hdGNoQWxsKC8uL2d1KSkge1xuICAgICAgICBpZiAoZmluZEZvcmVpZ25DamtDaGFyYWN0ZXJzSW5KYXBhbmVzZShjaGFyKS5sZW5ndGggPT09IDApIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCBsYXN0ID0gcmFuZ2VzLmF0KC0xKTtcbiAgICAgICAgaWYgKGxhc3Q/LlsxXSA9PT0gaW5kZXgpIGxhc3RbMV0gKz0gY2hhci5sZW5ndGg7XG4gICAgICAgIGVsc2UgcmFuZ2VzLnB1c2goW2luZGV4LCBpbmRleCArIGNoYXIubGVuZ3RoXSk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IHJhbmdlIG9mIHJhbmdlcykge1xuICAgICAgICByZXBvcnQoXG4gICAgICAgICAgbm9kZSxcbiAgICAgICAgICBuZXcgUnVsZUVycm9yKGBDaGluZXNlIG9yIEtvcmVhbiB0ZXh0IFwiJHt0ZXh0LnNsaWNlKC4uLnJhbmdlKX1cIiBpcyBkaXNhbGxvd2VkLmAsIHtcbiAgICAgICAgICAgIHBhZGRpbmc6IGxvY2F0b3IucmFuZ2UocmFuZ2UpLFxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcbn07XG4iLCJpbXBvcnQgeyBnZXRFcnJvck1lc3NhZ2UgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi9zcmMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9hZCB9IGZyb20gJ0BzbGlkZXYvcGFyc2VyL2ZzJztcbmltcG9ydCB7IFRleHRsaW50S2VybmVsLCB0eXBlIFRleHRsaW50S2VybmVsUnVsZSB9IGZyb20gJ0B0ZXh0bGludC9rZXJuZWwnO1xuaW1wb3J0IHsgbW9kdWxlSW50ZXJvcCB9IGZyb20gJ0B0ZXh0bGludC9tb2R1bGUtaW50ZXJvcCc7XG4vLyBUaGUgcGlubmVkIHBhY2thZ2UgaGFzIG5vIG5hbWVkIFByb2Nlc3NvciBleHBvcnQ7IGl0cyBkZWZhdWx0IGltcG9ydCBhbHNvIGZhaWxzIE5vZGVOZXh0IHR5cGluZy5cbmltcG9ydCB7IE1hcmtkb3duUHJvY2Vzc29yIH0gZnJvbSAnQHRleHRsaW50L3RleHRsaW50LXBsdWdpbi1tYXJrZG93bi9saWIvc3JjL01hcmtkb3duUHJvY2Vzc29yLmpzJztcbmltcG9ydCBub0ludmFsaWRDb250cm9sQ2hhcmFjdGVyIGZyb20gJ0B0ZXh0bGludC1ydWxlL3RleHRsaW50LXJ1bGUtbm8taW52YWxpZC1jb250cm9sLWNoYXJhY3Rlcic7XG5pbXBvcnQgbm9IYW5rYWt1S2FuYSBmcm9tICd0ZXh0bGludC1ydWxlLW5vLWhhbmtha3Uta2FuYSc7XG5pbXBvcnQgbm9aZXJvV2lkdGhTcGFjZXMgZnJvbSAndGV4dGxpbnQtcnVsZS1uby16ZXJvLXdpZHRoLXNwYWNlcyc7XG5cbmltcG9ydCB7IG5vQ2hpbmVzZUtvcmVhbiB9IGZyb20gJy4vbm9DaGluZXNlS29yZWFuUnVsZS5qcyc7XG5cbmNvbnN0IHJ1bGVzOiBUZXh0bGludEtlcm5lbFJ1bGVbXSA9IFtcbiAgeyBydWxlSWQ6ICduby1pbnZhbGlkLWNvbnRyb2wtY2hhcmFjdGVyJywgcnVsZTogbW9kdWxlSW50ZXJvcChub0ludmFsaWRDb250cm9sQ2hhcmFjdGVyKSB9LFxuICB7IHJ1bGVJZDogJ25vLWhhbmtha3Uta2FuYScsIHJ1bGU6IG1vZHVsZUludGVyb3Aobm9IYW5rYWt1S2FuYSkgfSxcbiAgeyBydWxlSWQ6ICduby16ZXJvLXdpZHRoLXNwYWNlcycsIHJ1bGU6IG1vZHVsZUludGVyb3Aobm9aZXJvV2lkdGhTcGFjZXMpIH0sXG4gIHsgcnVsZUlkOiAnbm8tY2hpbmVzZS1rb3JlYW4nLCBydWxlOiBub0NoaW5lc2VLb3JlYW4gfSxcbl07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaW50U2xpZGV2VGV4dChkZWNrUGF0aDogc3RyaW5nLCB3b3Jrc3BhY2VSb290OiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zb2xlLmluZm8oYFRleHRsaW50OiAke2RlY2tQYXRofWApO1xuICBjb25zdCB1c2VyUm9vdCA9IHBhdGguZGlybmFtZShkZWNrUGF0aCk7XG4gIGxldCBkYXRhOiBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIGxvYWQ+PjtcbiAgdHJ5IHtcbiAgICBkYXRhID0gYXdhaXQgbG9hZCh7IHJvb3RzOiBbdXNlclJvb3RdLCB1c2VyUm9vdCwgYWxsb3dlZFJvb3RzOiBbd29ya3NwYWNlUm9vdCwgdXNlclJvb3RdIH0sIGRlY2tQYXRoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKGAke2RlY2tQYXRofTogJHtnZXRFcnJvck1lc3NhZ2UoZXJyb3IpfWApO1xuICAgIHJldHVybiAxO1xuICB9XG4gIGNvbnN0IGtlcm5lbCA9IG5ldyBUZXh0bGludEtlcm5lbCgpO1xuICBsZXQgZXhpdENvZGUgPSAwO1xuICBmb3IgKGNvbnN0IGZpbGUgb2YgT2JqZWN0LnZhbHVlcyhkYXRhLm1hcmtkb3duRmlsZXMpKSB7XG4gICAgY29uc3QgZGlhZ25vc3RpY3MgPSAoZmlsZS5lcnJvcnMgPz8gW10pLm1hcCgoZXJyb3IpID0+IGAke2ZpbGUuZmlsZXBhdGh9OiR7ZXJyb3Iucm93ICsgMX06MTogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgIGZvciAoY29uc3QgZGlhZ25vc3RpYyBvZiBuZXcgU2V0KGRpYWdub3N0aWNzKSkge1xuICAgICAgY29uc29sZS5lcnJvcihkaWFnbm9zdGljKTtcbiAgICAgIGV4aXRDb2RlID0gMTtcbiAgICB9XG4gIH1cbiAgY29uc3QgY2hlY2tlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IHsgc291cmNlIH0gb2YgZGF0YS5zbGlkZXMpIHtcbiAgICBjb25zdCBrZXkgPSBgJHtzb3VyY2UuZmlsZXBhdGh9OiR7c291cmNlLmluZGV4fWA7XG4gICAgaWYgKGNoZWNrZWQuaGFzKGtleSkpIGNvbnRpbnVlO1xuICAgIGNoZWNrZWQuYWRkKGtleSk7XG4gICAgLy8gVGhlIHBhcnNlciBhbHdheXMgc2V0cyBjb250ZW50U3RhcnQgPj0gc3RhcnQsIGJ1dCBpdCBjYW4gZXhjZWVkIGVuZCBhZnRlciBhIGZpbmFsIHNlcGFyYXRvciB3aXRob3V0IGEgYmxhbmsgbGluZS5cbiAgICBjb25zdCBjb250ZW50U3RhcnQgPSBzb3VyY2UuY29udGVudFN0YXJ0ID4gc291cmNlLmVuZCA/IHNvdXJjZS5zdGFydCA6IHNvdXJjZS5jb250ZW50U3RhcnQ7XG4gICAgY29uc3QgdGV4dCA9IHNvdXJjZS5yYXdcbiAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgIC5zbGljZShjb250ZW50U3RhcnQgLSBzb3VyY2Uuc3RhcnQpXG4gICAgICAuam9pbignXFxuJyk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQga2VybmVsLmxpbnRUZXh0KHRleHQsIHtcbiAgICAgIGZpbGVQYXRoOiBzb3VyY2UuZmlsZXBhdGgsXG4gICAgICBleHQ6ICcubWQnLFxuICAgICAgcGx1Z2luczogW3sgcGx1Z2luSWQ6ICdtYXJrZG93bicsIHBsdWdpbjogeyBQcm9jZXNzb3I6IE1hcmtkb3duUHJvY2Vzc29yIH0gfV0sXG4gICAgICBydWxlcyxcbiAgICB9KTtcbiAgICBmb3IgKGNvbnN0IG1lc3NhZ2Ugb2YgcmVzdWx0Lm1lc3NhZ2VzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBgJHtzb3VyY2UuZmlsZXBhdGh9OiR7Y29udGVudFN0YXJ0ICsgbWVzc2FnZS5saW5lfToke21lc3NhZ2UuY29sdW1ufTogJHttZXNzYWdlLm1lc3NhZ2V9ICgke21lc3NhZ2UucnVsZUlkfSlgXG4gICAgICApO1xuICAgICAgZXhpdENvZGUgPSAxO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZXhpdENvZGU7XG59XG4iXSwieF9nb29nbGVfaWdub3JlTGlzdCI6WzEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LDE1LDE2LDE3LDE4LDE5LDIwLDIxLDIyLDIzLDI0LDI1LDI2LDI3LDI4LDI5LDMwLDMxLDMyLDMzLDM0LDM1LDM2LDM3LDM4LDM5LDQwLDQxLDQyLDQzLDQ0LDQ1LDQ2LDQ3LDQ4LDQ5LDUwLDUxLDUyLDUzLDU0LDU1LDU2LDU3LDU4LDU5LDYwLDYxLDYyLDYzLDY0LDY1LDY2LDY3LDY4LDY5LDcwLDcxLDcyLDczLDc0LDc1LDc2LDc3LDc4LDc5LDgwLDgxLDgyLDgzLDg0LDg1LDg2LDg3LDg4LDg5LDkwLDkxLDkyXSwibWFwcGluZ3MiOiIyb0NBRUEsTUFBTSxFQUFlLHFCQUNmLEVBQVksa0JBaUJaLGtCQUFtQyxJQUFJLElBQzNDLCtSQUNGLEVBRUEsSUFBSSxFQXlCSixTQUFnQixHQUFtQyxFQUFjLEVBQWMsR0FBYyxDQUMzRixJQUFNLEVBQW9CLElBQUksSUFBSSxFQUFZLFVBQVUsTUFBTSxDQUFDLEVBQ3pELEVBQVksSUFBa0IsR0FBc0IsRUFDcEQsa0JBQWEsSUFBSSxJQUN2QixJQUFLLElBQU0sS0FBUSxFQUFLLFVBQVUsTUFBTSxFQUNsQyxFQUFrQixJQUFJLENBQUksSUFFNUIsRUFBYSxLQUFLLENBQUksR0FDckIsRUFBVSxLQUFLLENBQUksSUFBTSxDQUFDLEVBQVMsSUFBSSxDQUFJLEdBQUssRUFBaUMsSUFBSSxDQUFJLEtBRTFGLEVBQVcsSUFB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
144
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpZGV2VGV4dGxpbnQtQjQ5WDZvUjUuanMiLCJuYW1lcyI6WyJTQ0FMQVIiLCJpc1NjYWxhciIsImlzQ29sbGVjdGlvbiIsIkJSRUFLIiwiU0tJUCIsIlJFTU9WRSIsInZpc2l0IiwiaXNDb2xsZWN0aW9uIiwiaXNTY2FsYXIiLCJpc1NjYWxhciIsImlzQ29sbGVjdGlvbiIsImlzQ29sbGVjdGlvbiIsIlNDQUxBUiIsImlzQ29sbGVjdGlvbiIsImlzU2NhbGFyIiwiaXNTY2FsYXIiLCJpc0NvbGxlY3Rpb24iLCJzdHJpbmdpZnkiLCJpc0NvbGxlY3Rpb24iLCJpc1NjYWxhciIsInN0cmluZ2lmeSIsImlzU2NhbGFyIiwic3RyaW5naWZ5IiwiaXNTY2FsYXIiLCJpc1NjYWxhciIsImZsb2F0TmFOIiwiZmxvYXRFeHAiLCJmbG9hdCIsImludElkZW50aWZ5IiwiaW50UmVzb2x2ZSIsImludFN0cmluZ2lmeSIsImludE9jdCIsImludCIsImludEhleCIsInNjaGVtYSIsImludE9jdCIsImludCIsImludEhleCIsImZsb2F0TmFOIiwiZmxvYXRFeHAiLCJmbG9hdCIsImludElkZW50aWZ5Iiwic2NoZW1hIiwiaXNTY2FsYXIiLCJpc1NjYWxhciIsInNjaGVtYSIsInNjaGVtYSQyIiwiU0NBTEFSIiwic3RyaW5naWZ5IiwiaXNDb2xsZWN0aW9uIiwiaXNTY2FsYXIiLCJpc1NjYWxhciIsIlNDQUxBUiIsImlzU2NhbGFyIiwiaXNTY2FsYXIiLCJpc0NvbGxlY3Rpb24iLCJzdHJpbmdpZnkiLCJwYXJzZSIsIllBTUwiLCJSRV9DUkxGIiwiWUFNTCIsIllBTUwiLCJub0hhbmtha3VLYW5hIl0sInNvdXJjZXMiOlsiLi4vLi4vc2hhcmVkLWxpYi9zcmMvZm9yZWlnbkNqay50cyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9AYW50ZnUvdXRpbHMvZGlzdC9pbmRleC5tanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvQHNsaWRldi9wYXJzZXIvZGlzdC91dGlscy5tanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvbm9kZXMvaWRlbnRpdHkuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3QvdmlzaXQuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3QvZG9jL2RpcmVjdGl2ZXMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3QvZG9jL2FuY2hvcnMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3QvZG9jL2FwcGx5UmV2aXZlci5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9ub2Rlcy90b0pTLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L25vZGVzL05vZGUuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvbm9kZXMvQWxpYXMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvbm9kZXMvU2NhbGFyLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L2RvYy9jcmVhdGVOb2RlLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L25vZGVzL0NvbGxlY3Rpb24uanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvc3RyaW5naWZ5L3N0cmluZ2lmeUNvbW1lbnQuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvc3RyaW5naWZ5L2ZvbGRGbG93TGluZXMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvc3RyaW5naWZ5L3N0cmluZ2lmeVN0cmluZy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9zdHJpbmdpZnkvc3RyaW5naWZ5LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3N0cmluZ2lmeS9zdHJpbmdpZnlQYWlyLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L2xvZy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9zY2hlbWEveWFtbC0xLjEvbWVyZ2UuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvbm9kZXMvYWRkUGFpclRvSlNNYXAuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvbm9kZXMvUGFpci5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9zdHJpbmdpZnkvc3RyaW5naWZ5Q29sbGVjdGlvbi5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9ub2Rlcy9ZQU1MTWFwLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3NjaGVtYS9jb21tb24vbWFwLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L25vZGVzL1lBTUxTZXEuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvc2NoZW1hL2NvbW1vbi9zZXEuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvc2NoZW1hL2NvbW1vbi9zdHJpbmcuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvc2NoZW1hL2NvbW1vbi9udWxsLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3NjaGVtYS9jb3JlL2Jvb2wuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvc3RyaW5naWZ5L3N0cmluZ2lmeU51bWJlci5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9zY2hlbWEvY29yZS9mbG9hdC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9zY2hlbWEvY29yZS9pbnQuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvc2NoZW1hL2NvcmUvc2NoZW1hLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3NjaGVtYS9qc29uL3NjaGVtYS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9zY2hlbWEveWFtbC0xLjEvYmluYXJ5LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3NjaGVtYS95YW1sLTEuMS9wYWlycy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9zY2hlbWEveWFtbC0xLjEvb21hcC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9zY2hlbWEveWFtbC0xLjEvYm9vbC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9zY2hlbWEveWFtbC0xLjEvZmxvYXQuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvc2NoZW1hL3lhbWwtMS4xL2ludC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9zY2hlbWEveWFtbC0xLjEvc2V0LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3NjaGVtYS95YW1sLTEuMS90aW1lc3RhbXAuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvc2NoZW1hL3lhbWwtMS4xL3NjaGVtYS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9zY2hlbWEvdGFncy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9zY2hlbWEvU2NoZW1hLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3N0cmluZ2lmeS9zdHJpbmdpZnlEb2N1bWVudC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9kb2MvRG9jdW1lbnQuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3QvZXJyb3JzLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L2NvbXBvc2UvcmVzb2x2ZS1wcm9wcy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9jb21wb3NlL3V0aWwtY29udGFpbnMtbmV3bGluZS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9jb21wb3NlL3V0aWwtZmxvdy1pbmRlbnQtY2hlY2suanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3QvY29tcG9zZS91dGlsLW1hcC1pbmNsdWRlcy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9jb21wb3NlL3Jlc29sdmUtYmxvY2stbWFwLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L2NvbXBvc2UvcmVzb2x2ZS1ibG9jay1zZXEuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3QvY29tcG9zZS9yZXNvbHZlLWVuZC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9jb21wb3NlL3Jlc29sdmUtZmxvdy1jb2xsZWN0aW9uLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L2NvbXBvc2UvY29tcG9zZS1jb2xsZWN0aW9uLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L2NvbXBvc2UvcmVzb2x2ZS1ibG9jay1zY2FsYXIuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3QvY29tcG9zZS9yZXNvbHZlLWZsb3ctc2NhbGFyLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L2NvbXBvc2UvY29tcG9zZS1zY2FsYXIuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3QvY29tcG9zZS91dGlsLWVtcHR5LXNjYWxhci1wb3NpdGlvbi5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9jb21wb3NlL2NvbXBvc2Utbm9kZS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9jb21wb3NlL2NvbXBvc2UtZG9jLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L2NvbXBvc2UvY29tcG9zZXIuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3QvcGFyc2UvY3N0LXNjYWxhci5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9wYXJzZS9jc3Qtc3RyaW5naWZ5LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3BhcnNlL2NzdC12aXNpdC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9wYXJzZS9jc3QuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3QvcGFyc2UvbGV4ZXIuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3QvcGFyc2UvbGluZS1jb3VudGVyLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3BhcnNlL3BhcnNlci5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9wdWJsaWMtYXBpLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L2luZGV4LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9pbmRleC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9Ac2xpZGV2L3BhcnNlci9kaXN0L2NvcmUubWpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3BhdGhlL2Rpc3Qvc2hhcmVkL3BhdGhlLk0tZVRodE5aLm1qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9Ac2xpZGV2L3BhcnNlci9kaXN0L2ZzLm1qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9AdGV4dGxpbnQvYXN0LW5vZGUtdHlwZXMvbGliL3NyYy9BU1ROb2RlVHlwZXMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvQHRleHRsaW50L2FzdC1ub2RlLXR5cGVzL2xpYi9zcmMvaW5kZXguanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvdGV4dGxpbnQtcnVsZS1oZWxwZXIvbGliL3RleHRsaW50LXJ1bGUtaGVscGVyLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3VuaXN0LXV0aWwtaXMvY29udmVydC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy91bmlzdC11dGlsLXZpc2l0LXBhcmVudHMvY29sb3IuYnJvd3Nlci5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy91bmlzdC11dGlsLXZpc2l0LXBhcmVudHMvaW5kZXguanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvdW5pc3QtdXRpbC12aXNpdC9pbmRleC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy90ZXh0bGludC1ydWxlLWhlbHBlci9saWIvSWdub3JlTm9kZU1hbmFnZXIuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvYm91bmRhcnkvbGliL2luZGV4LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0cnVjdHVyZWQtc291cmNlL2xpYi9zdHJ1Y3R1cmVkLXNvdXJjZS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy90ZXh0bGludC1ydWxlLWhlbHBlci9saWIvU291cmNlTG9jYXRpb24uanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvdGV4dGxpbnQtcnVsZS1oZWxwZXIvbGliL3dyYXAtcmVwb3J0LWhhbmRsZXIuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvdGV4dGxpbnQtcnVsZS1oZWxwZXIvbGliL2luZGV4LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3RleHRsaW50LXJ1bGUtbm8taGFua2FrdS1rYW5hL2xpYi90ZXh0bGludC1ydWxlLW5vLWhhbmtha3Uta2FuYS5qcyIsIi4uL3NyYy91dGlscy9ub0NoaW5lc2VLb3JlYW5SdWxlLnRzIiwiLi4vc3JjL3V0aWxzL3NsaWRldlRleHRsaW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIEZvcmVpZ25DamtMYW5ndWFnZSA9ICdjaGluZXNlJyB8ICdrb3JlYW4nO1xuXG5jb25zdCBIQU5HVUxfUkVHRVggPSAvXFxwe1NjcmlwdD1IYW5ndWx9L3U7XG5jb25zdCBIQU5fUkVHRVggPSAvXFxwe1NjcmlwdD1IYW59L3U7XG4vLyBKSVMgWCAwMjA4IGNhbm5vdCBlbmNvZGUgdGhlc2UgSsWNecWNIGthbmppLCB3aGljaCB3ZXJlIGFkZGVkIGluIDIwMTAuXG5jb25zdCBKT1lPX0tBTkpJX09VVFNJREVfSklTX1hfMDIwOCA9ICfwoK6f5aGh5Ymd6aCwJztcbi8vIEthbmppIGZvciBKYXBhbmVzZSBuYW1lcyAoZS5nLiwg6auZLCDvqJEsIOa/tSwg5qCBKSB0aGF0IENoaW5lc2UgcHJvc2UgcmFyZWx5IGNvbnRhaW5zOiB0aGUgTkZLQyBmb3JtcyBvZiB0aGVcbi8vIFdpbmRvd3MtMzFKIE5FQy1zZWxlY3RlZCBJQk0gYW5kIElCTSBleHRlbnNpb24ga2FuamkgdGhhdCBuZWl0aGVyIEpJUyBYIDAyMDgsIEJpZzUsIG5vciBHQjIzMTIgZW5jb2RlcywgcGx1cyDwoK63IGZyb21cbi8vIEpJUyBYIDAyMTMuIE5GS0MgZm9ybXMgYXJlIGxpc3RlZCBiZWNhdXNlIHRoZSBsb29rdXAgcnVucyBhZnRlciBORktDIG5vcm1hbGl6YXRpb24gKGUuZy4sIFUrRkEyMCBiZWNvbWVzIFUrODYxMikuXG4vLyBTb21lIGFsc28gYXBwZWFyIGluIENoaW5lc2UgbmFtZXMgKGUuZy4sIOWWhiksIGJ1dCBwcm9zZSB0aGF0IG1peGVzIENoaW5lc2UgaW50byBKYXBhbmVzZSBoYXJkbHkgY29udGFpbnMgdGhlbS5cbi8vIEV4dGVuc2lvbiBrYW5qaSB0aGF0IEJpZzUgb3IgR0IyMzEyIGVuY29kZXMgKGUuZy4sIOW+tywg54CoKSBzdGF5IENoaW5lc2UgYmVjYXVzZSBDaGluZXNlIHByb3NlIHVzZXMgdGhlbS5cbmNvbnN0IEpBUEFORVNFX05BTUVfS0FOSklfT1VUU0lERV9KSVNfWF8wMjA4ID1cbiAgJ+S7vOS8g+S8ueS+iuS/v+WBguWDmOWDtOWFiuWFpOWGneWHrOWIleWKnOWKr+WMh+WMpOWOk+WPneWSiuWSnOWWhuWdmeWdpeWerOWfiOWisuWki+Wlm+WlneWlo+WwnuWyuuWzteW1k+W1reW2ueW3kOW8oeW8tOW9heaDnuaEkeaEsOaGmOaIk+aKpuaVjuaYnuaYu+aZs+aav+abuuabu+acjuadpuaggeahkuajj+aosOaps+arouarpOa2lua3uOa+tea/teeEj+eKseeKvueMpOeOveeUgeehuueksOerp+eunue1iOe3lue9h+iNouiRiOiTnOiYkuigh+ijteiknOiot+i0kumDnumElemHnumHpemIvOmJmemJt+mNiOmPhumanemar+mcs+mcu+mdjemdj+mdkemdlemrmemtsumuj+musemuu+mwgO+oju+oj++oke+ok++olO+on++ooe+oo++opO+op++oqO+oqfCgrrcnO1xuLy8gQ2hhcmFjdGVycyBKSVMgWCAwMjA4IGNhbiBlbmNvZGUgYnV0IG1vZGVybiBKYXBhbmVzZSBwcm9zZSBkb2VzIG5vdCB1c2U6XG4vLyAtIG9sZCBmb3JtcyAoa3nFq2ppdGFpKSBvZiBKxY15xY0ga2FuamksIGZyb20gdGhlIGBreXVqaXRhaWAgbnBtIHBhY2thZ2UgYW5kIFVuaWhhbidzIGtKYXBhbmVzZU9sZFZhcmlhbnQsXG4vLyAgIGV4Y2VwdCB0aG9zZSBzdGlsbCBjb21tb24gaW4gSmFwYW5lc2Ugd29yZHMgb3IgbmFtZXMgKGUuZy4sIOaHiSBpbiDmhbbmh4ksIOa+pCwg6YKKLCDpvo0sIOiXnSBpbiDmnbHkuqzol53ooZPlpKflraYsIOezuuOBmSlcbi8vIC0gQ2hpbmVzZSBmdW5jdGlvbiB3b3JkcyB0aGF0IEphcGFuZXNlIHdyaXRlcyBpbiBrYW5hIChlLmcuLCDlgJEsIOmAmSwg6bq8LCDlvogsIOaAjiwg6LefLCDlmJspIGFuZCBzdHJheSBzaW1wbGlmaWVkIGZvcm1zIChlLmcuLCDkuKopXG4vLyAtIHRyYWRpdGlvbmFsIENoaW5lc2UgY2hhcmFjdGVycyB0aGF0IG5laXRoZXIgdGFibGUgY292ZXJzIGJ1dCBKYXBhbmVzZSBuZXZlciB1c2VzOiDnorwsIOiIiSwg6Y+ILCDpm5Zcbi8vIE90aGVyIENoaW5lc2Utb25seSBjb250ZW50IGNoYXJhY3RlcnMgKGUuZy4sIOWqvSwg6LGsKSBhcmUgbm90IGxpc3RlZCBiZWNhdXNlIHNlcGFyYXRpbmcgdGhlbSBmcm9tIHJhcmUga2Fuamlcbi8vIHRoYXQgSmFwYW5lc2UgcHJvc2UgZG9lcyB1c2UgKGUuZy4sIOS5lumboiwg55GV55a1LCDpvZ/pvawsIOS/r+eesCkgbmVlZHMgSmFwYW5lc2UgdXNhZ2UgZnJlcXVlbmNpZXMuXG5jb25zdCBDSElORVNFX0NIQVJBQ1RFUlNfSU5fSklTX1hfMDIwOCA9IG5ldyBTZXQoXG4gICfkuKrkuZjkuoLkup7ku47kvZvkvoblgJHlgYflgrPlg57lg7nlhInlhZLlhanlhozliITlianlio3lipHli57li7Pli7Xli7jljYDljbflj4PlkKzlkYDlkq/lk4flk6bllJTllq7lmJvlmrTlm5Hlm5jlnIjlnIvlnI3lnJPlnJblnJjloq7lo5Plo5jlo57lo6Tlo6/lo7nlo7vlo73lpaflpazlp5nlrYPlrbjlr6Llr6blr6vlr7blsIflsIjlsI3lsYblsazls73lt5bluLblub/lu6Llu6Plu7PlvYjlvojlvpHlvp7mgI7mgYbmg6Hmg7HmhLzmhZjmh7fmiIDmiLDmiLLmi4Lmi5Tmi5zmjL7mj5LmkJbmkJzmk4fmk5Tmk5rmk6fmk7TmlJzmlJ3mlLbmlYjmlY3mlZXmlbjmlrfmmZ3mm4nmnIPmop3mo6fmpq7mqILmqJPmqJ7mqKPmqqLmrIrmrZDmraHmrbjmrpjmrrzmr4bmsKPmspLmt6jmt7rmu6/mu7/mvZvmvoHmv5Xmv5/ngaPnh4jnh5Lnh5/niJDniK3niLLniqfni7nnjajnjbXnjbjnjbvnk6PnlavnlbbnlornmaHnmbznm5znm6Hnoo7norznpZXnpqrnpq7nqLHnqLvnqZfnqannq4rnq53nsrnntbLntpPnuKPnuLHnuL3nuannuarnubznuoznupbnvLrnvZDogbLogb3ogoXohabohr3oh5/oh7roiIfoiInoiIroiI3oiJboibfojorojpbokKzol4/ol6XomZXomZ/onqLon7LooLbooLvooZ7oo53opYPoprropr3op4Dop7jorKDorYnora/orb3oroDorororpPorprosZDosavosrPos6PotIrot5/ouJDovJXovYnovqjovq3ovq/pgJnpgZnpgZ7pgbLphLDphonphqvph4Dph4vpjKLpjq3pj4jpkLXpkYTpkZvpl5zpmbfpmqjpmqrpmrHpmrjpm5bpm5npm5zpnLjpnYjpnZzpoY/poa/po5zpo67ppJjppKDpqLfpqYXpqZfpqZvpq5Ppq5Tpq67prKrpt4Tpub3puqXpurzpu4/pu5jpu57pu6jpvYrpvZLpvaHpvpwnXG4pO1xuXG5sZXQgamFwYW5lc2VLYW5qaTogU2V0PHN0cmluZz4gfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogRGV0ZWN0cyBDaGluZXNlIG9yIEtvcmVhbiBjaGFyYWN0ZXJzIG1peGVkIGludG8gSmFwYW5lc2UgdGV4dCwgc3VjaCBhcyBMTE0tZ2VuZXJhdGVkIEphcGFuZXNlIHByb3NlLlxuICogU2VlIHtAbGluayBmaW5kRm9yZWlnbkNqa0NoYXJhY3RlcnNJbkphcGFuZXNlfSBmb3Igd2hpY2ggY2hhcmFjdGVycyBjb3VudCBhbmQgaG93IGBhbGxvd2VkVGV4dGAgd29ya3MuXG4gKiBSZXR1cm5zIHRoZSBkZXRlY3RlZCBsYW5ndWFnZXMsIG9yIGFuIGVtcHR5IGFycmF5IGlmIG5vbmUgYXJlIGZvdW5kLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0Rm9yZWlnbkNqa0luSmFwYW5lc2UodGV4dDogc3RyaW5nLCBhbGxvd2VkVGV4dD86IHN0cmluZyk6IEZvcmVpZ25DamtMYW5ndWFnZVtdIHtcbiAgY29uc3QgY2hhcmFjdGVycyA9IGZpbmRGb3JlaWduQ2prQ2hhcmFjdGVyc0luSmFwYW5lc2UodGV4dCwgYWxsb3dlZFRleHQpO1xuICBjb25zdCBsYW5ndWFnZXM6IEZvcmVpZ25DamtMYW5ndWFnZVtdID0gW107XG4gIGlmIChjaGFyYWN0ZXJzLnNvbWUoKGNoYXIpID0+ICFIQU5HVUxfUkVHRVgudGVzdChjaGFyKSkpIGxhbmd1YWdlcy5wdXNoKCdjaGluZXNlJyk7XG4gIGlmIChjaGFyYWN0ZXJzLnNvbWUoKGNoYXIpID0+IEhBTkdVTF9SRUdFWC50ZXN0KGNoYXIpKSkgbGFuZ3VhZ2VzLnB1c2goJ2tvcmVhbicpO1xuICByZXR1cm4gbGFuZ3VhZ2VzO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGRpc3RpbmN0IENoaW5lc2Ugb3IgS29yZWFuIGNoYXJhY3RlcnMgbWl4ZWQgaW50byBKYXBhbmVzZSB0ZXh0LCBORktDLW5vcm1hbGl6ZWQsIGluIG9yZGVyIG9mIGFwcGVhcmFuY2UuXG4gKiBBIGthbmppIGlzIHRyZWF0ZWQgYXMgQ2hpbmVzZSB3aGVuIGl0IGlzIG91dHNpZGUgSklTIFggMDIwOCAoZXhjZXB0IHRoZSBmb3VyIErFjXnFjSBrYW5qaSDwoK6f5aGh5Ymd6aCwIGFuZCBKYXBhbmVzZSBuYW1lXG4gKiBrYW5qaSB0aGF0IG5laXRoZXIgQmlnNSBub3IgR0IyMzEyIGVuY29kZXMsIGUuZy4sIOmrmSwg76iRLCDwoK63KSBvciBpcyBvbmUgb2YgdGhlIGxpc3RlZCBvbGQgZm9ybXMsIENoaW5lc2UgZnVuY3Rpb25cbiAqIHdvcmRzLCBvciBvdGhlciBDaGluZXNlLW9ubHkgY2hhcmFjdGVycyB0aGF0IG1vZGVybiBKYXBhbmVzZSBwcm9zZSBkb2VzIG5vdCB1c2UgKGUuZy4sIOWwjSwg5ZyLLCDpgJksIOWAkSwg5b6ILCDnorwpLlxuICogT2xkIGZvcm1zIGluIG5hbWVzIHRoYXQgQ2hpbmVzZSBwcm9zZSBhbHNvIHVzZXMgKGUuZy4sIOWciywg6IiHLCDlvrcpIGFyZSB0aGVyZWZvcmUgYWxzbyByZXBvcnRlZCwgd2hpbGUgQ2hpbmVzZVxuICogY29udGFpbmluZyBub25lIG9mIHRoZXNlIGNoYXJhY3RlcnMgKGUuZy4sIOacgOWQjui/lOWbnuetlOahiCwg6LGs6IKJKSBpcyBub3QuXG4gKiBDaGFyYWN0ZXJzIHRoYXQgYWxzbyBvY2N1ciBpbiBgYWxsb3dlZFRleHRgIGFyZSBub3QgcmVwb3J0ZWQsIHNvIHBhc3NpbmcgdGhlIGlucHV0IHRoYXQgYW4gTExNIG1heSBxdW90ZVxuICogKGUuZy4sIHRoZSBwcm9tcHQsIGEgcXVlc3Rpb24sIG9yIGFuIGVycm9yIG1lc3NhZ2UpIGtlZXBzIHF1b3RlZCBuYW1lcyBhbmQgY29kZSBmcm9tIGJlaW5nIHJlcG9ydGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZEZvcmVpZ25DamtDaGFyYWN0ZXJzSW5KYXBhbmVzZSh0ZXh0OiBzdHJpbmcsIGFsbG93ZWRUZXh0ID0gJycpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGFsbG93ZWRDaGFyYWN0ZXJzID0gbmV3IFNldChhbGxvd2VkVGV4dC5ub3JtYWxpemUoJ05GS0MnKSk7XG4gIGNvbnN0IGthbmppU2V0ID0gKGphcGFuZXNlS2FuamkgPz89IGJ1aWxkSmFwYW5lc2VLYW5qaVNldCgpKTtcbiAgY29uc3QgY2hhcmFjdGVycyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IGNoYXIgb2YgdGV4dC5ub3JtYWxpemUoJ05GS0MnKSkge1xuICAgIGlmIChhbGxvd2VkQ2hhcmFjdGVycy5oYXMoY2hhcikpIGNvbnRpbnVlO1xuICAgIGlmIChcbiAgICAgIEhBTkdVTF9SRUdFWC50ZXN0KGNoYXIpIHx8XG4gICAgICAoSEFOX1JFR0VYLnRlc3QoY2hhcikgJiYgKCFrYW5qaVNldC5oYXMoY2hhcikgfHwgQ0hJTkVTRV9DSEFSQUNURVJTX0lOX0pJU19YXzAyMDguaGFzKGNoYXIpKSlcbiAgICApIHtcbiAgICAgIGNoYXJhY3RlcnMuYWRkKGNoYXIpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gWy4uLmNoYXJhY3RlcnNdO1xufVxuXG5mdW5jdGlvbiBidWlsZEphcGFuZXNlS2FuamlTZXQoKTogU2V0PHN0cmluZz4ge1xuICAvLyBUaGUgV0hBVFdHIGBzaGlmdF9qaXNgIGRlY29kZXIgaXMgV2luZG93cy0zMUosIHNvIHNraXAgaXRzIHZlbmRvci1leHRlbnNpb24gbGVhZCBieXRlcyAoMHhFRC0weEZDKSB0byBrZWVwIEpJUyBYIDAyMDggb25seS5cbiAgY29uc3QgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2Rlcignc2hpZnRfamlzJyk7XG4gIGNvbnN0IGthbmppU2V0ID0gbmV3IFNldChKT1lPX0tBTkpJX09VVFNJREVfSklTX1hfMDIwOCArIEpBUEFORVNFX05BTUVfS0FOSklfT1VUU0lERV9KSVNfWF8wMjA4KTtcbiAgZm9yIChsZXQgbGVhZCA9IDB4ODE7IGxlYWQgPD0gMHhFQTsgbGVhZCsrKSB7XG4gICAgaWYgKGxlYWQgPj0gMHhBMCAmJiBsZWFkIDw9IDB4REYpIGNvbnRpbnVlO1xuICAgIGZvciAobGV0IHRyYWlsID0gMHg0MDsgdHJhaWwgPD0gMHhGQzsgdHJhaWwrKykge1xuICAgICAga2FuamlTZXQuYWRkKGRlY29kZXIuZGVjb2RlKG5ldyBVaW50OEFycmF5KFtsZWFkLCB0cmFpbF0pKSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBrYW5qaVNldDtcbn1cbiIsImZ1bmN0aW9uIGNsYW1wKG4sIG1pbiwgbWF4KSB7XG4gIHJldHVybiBNYXRoLm1pbihtYXgsIE1hdGgubWF4KG1pbiwgbikpO1xufVxuZnVuY3Rpb24gc3VtKC4uLmFyZ3MpIHtcbiAgcmV0dXJuIGZsYXR0ZW5BcnJheWFibGUoYXJncykucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMCk7XG59XG5mdW5jdGlvbiBsZXJwKG1pbiwgbWF4LCB0KSB7XG4gIGNvbnN0IGludGVycG9sYXRpb24gPSBjbGFtcCh0LCAwLCAxKTtcbiAgcmV0dXJuIG1pbiArIChtYXggLSBtaW4pICogaW50ZXJwb2xhdGlvbjtcbn1cbmZ1bmN0aW9uIHJlbWFwKG4sIGluTWluLCBpbk1heCwgb3V0TWluLCBvdXRNYXgpIHtcbiAgY29uc3QgaW50ZXJwb2xhdGlvbiA9IChuIC0gaW5NaW4pIC8gKGluTWF4IC0gaW5NaW4pO1xuICByZXR1cm4gbGVycChvdXRNaW4sIG91dE1heCwgaW50ZXJwb2xhdGlvbik7XG59XG5cbmZ1bmN0aW9uIHRvQXJyYXkoYXJyYXkpIHtcbiAgYXJyYXkgPSBhcnJheSA/PyBbXTtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYXJyYXkpID8gYXJyYXkgOiBbYXJyYXldO1xufVxuZnVuY3Rpb24gZmxhdHRlbkFycmF5YWJsZShhcnJheSkge1xuICByZXR1cm4gdG9BcnJheShhcnJheSkuZmxhdCgxKTtcbn1cbmZ1bmN0aW9uIG1lcmdlQXJyYXlhYmxlKC4uLmFyZ3MpIHtcbiAgcmV0dXJuIGFyZ3MuZmxhdE1hcCgoaSkgPT4gdG9BcnJheShpKSk7XG59XG5mdW5jdGlvbiBwYXJ0aXRpb24oYXJyYXksIC4uLmZpbHRlcnMpIHtcbiAgY29uc3QgcmVzdWx0ID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogZmlsdGVycy5sZW5ndGggKyAxIH0pLmZpbGwobnVsbCkubWFwKCgpID0+IFtdKTtcbiAgYXJyYXkuZm9yRWFjaCgoZSwgaWR4LCBhcnIpID0+IHtcbiAgICBsZXQgaSA9IDA7XG4gICAgZm9yIChjb25zdCBmaWx0ZXIgb2YgZmlsdGVycykge1xuICAgICAgaWYgKGZpbHRlcihlLCBpZHgsIGFycikpIHtcbiAgICAgICAgcmVzdWx0W2ldLnB1c2goZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGkgKz0gMTtcbiAgICB9XG4gICAgcmVzdWx0W2ldLnB1c2goZSk7XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gdW5pcShhcnJheSkge1xuICByZXR1cm4gQXJyYXkuZnJvbShuZXcgU2V0KGFycmF5KSk7XG59XG5mdW5jdGlvbiB1bmlxdWVCeShhcnJheSwgZXF1YWxGbikge1xuICByZXR1cm4gYXJyYXkucmVkdWNlKChhY2MsIGN1cikgPT4ge1xuICAgIGNvbnN0IGluZGV4ID0gYWNjLmZpbmRJbmRleCgoaXRlbSkgPT4gZXF1YWxGbihjdXIsIGl0ZW0pKTtcbiAgICBpZiAoaW5kZXggPT09IC0xKVxuICAgICAgYWNjLnB1c2goY3VyKTtcbiAgICByZXR1cm4gYWNjO1xuICB9LCBbXSk7XG59XG5mdW5jdGlvbiBsYXN0KGFycmF5KSB7XG4gIHJldHVybiBhdChhcnJheSwgLTEpO1xufVxuZnVuY3Rpb24gcmVtb3ZlKGFycmF5LCB2YWx1ZSkge1xuICBpZiAoIWFycmF5KVxuICAgIHJldHVybiBmYWxzZTtcbiAgY29uc3QgaW5kZXggPSBhcnJheS5pbmRleE9mKHZhbHVlKTtcbiAgaWYgKGluZGV4ID49IDApIHtcbiAgICBhcnJheS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGF0KGFycmF5LCBpbmRleCkge1xuICBjb25zdCBsZW4gPSBhcnJheS5sZW5ndGg7XG4gIGlmICghbGVuKVxuICAgIHJldHVybiB2b2lkIDA7XG4gIGlmIChpbmRleCA8IDApXG4gICAgaW5kZXggKz0gbGVuO1xuICByZXR1cm4gYXJyYXlbaW5kZXhdO1xufVxuZnVuY3Rpb24gcmFuZ2UoLi4uYXJncykge1xuICBsZXQgc3RhcnQsIHN0b3AsIHN0ZXA7XG4gIGlmIChhcmdzLmxlbmd0aCA9PT0gMSkge1xuICAgIHN0YXJ0ID0gMDtcbiAgICBzdGVwID0gMTtcbiAgICBbc3RvcF0gPSBhcmdzO1xuICB9IGVsc2Uge1xuICAgIFtzdGFydCwgc3RvcCwgc3RlcCA9IDFdID0gYXJncztcbiAgfVxuICBjb25zdCBhcnIgPSBbXTtcbiAgbGV0IGN1cnJlbnQgPSBzdGFydDtcbiAgd2hpbGUgKGN1cnJlbnQgPCBzdG9wKSB7XG4gICAgYXJyLnB1c2goY3VycmVudCk7XG4gICAgY3VycmVudCArPSBzdGVwIHx8IDE7XG4gIH1cbiAgcmV0dXJuIGFycjtcbn1cbmZ1bmN0aW9uIG1vdmUoYXJyLCBmcm9tLCB0bykge1xuICBhcnIuc3BsaWNlKHRvLCAwLCBhcnIuc3BsaWNlKGZyb20sIDEpWzBdKTtcbiAgcmV0dXJuIGFycjtcbn1cbmZ1bmN0aW9uIGNsYW1wQXJyYXlSYW5nZShuLCBhcnIpIHtcbiAgcmV0dXJuIGNsYW1wKG4sIDAsIGFyci5sZW5ndGggLSAxKTtcbn1cbmZ1bmN0aW9uIHNhbXBsZShhcnIsIHF1YW50aXR5KSB7XG4gIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBxdWFudGl0eSB9LCAoXykgPT4gYXJyW01hdGgucm91bmQoTWF0aC5yYW5kb20oKSAqIChhcnIubGVuZ3RoIC0gMSkpXSk7XG59XG5mdW5jdGlvbiBzaHVmZmxlKGFycmF5KSB7XG4gIGZvciAobGV0IGkgPSBhcnJheS5sZW5ndGggLSAxOyBpID4gMDsgaS0tKSB7XG4gICAgY29uc3QgaiA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChpICsgMSkpO1xuICAgIFthcnJheVtpXSwgYXJyYXlbal1dID0gW2FycmF5W2pdLCBhcnJheVtpXV07XG4gIH1cbiAgcmV0dXJuIGFycmF5O1xufVxuZnVuY3Rpb24gZmlsdGVySW5QbGFjZShhcnJheSwgcHJlZGljYXRlKSB7XG4gIGZvciAobGV0IGkgPSBhcnJheS5sZW5ndGg7IGktLTsgaSA+PSAwKSB7XG4gICAgaWYgKCFwcmVkaWNhdGUoYXJyYXlbaV0sIGksIGFycmF5KSlcbiAgICAgIGFycmF5LnNwbGljZShpLCAxKTtcbiAgfVxuICByZXR1cm4gYXJyYXk7XG59XG5cbmZ1bmN0aW9uIGFzc2VydChjb25kaXRpb24sIG1lc3NhZ2UpIHtcbiAgaWYgKCFjb25kaXRpb24pXG4gICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xufVxuY29uc3QgdG9TdHJpbmcgPSAodikgPT4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHYpO1xuZnVuY3Rpb24gZ2V0VHlwZU5hbWUodikge1xuICBpZiAodiA9PT0gbnVsbClcbiAgICByZXR1cm4gXCJudWxsXCI7XG4gIGNvbnN0IHR5cGUgPSB0b1N0cmluZyh2KS5zbGljZSg4LCAtMSkudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIHR5cGVvZiB2ID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiB2ID09PSBcImZ1bmN0aW9uXCIgPyB0eXBlIDogdHlwZW9mIHY7XG59XG5mdW5jdGlvbiBub29wKCkge1xufVxuXG5mdW5jdGlvbiBpc0RlZXBFcXVhbCh2YWx1ZTEsIHZhbHVlMikge1xuICBjb25zdCB0eXBlMSA9IGdldFR5cGVOYW1lKHZhbHVlMSk7XG4gIGNvbnN0IHR5cGUyID0gZ2V0VHlwZU5hbWUodmFsdWUyKTtcbiAgaWYgKHR5cGUxICE9PSB0eXBlMilcbiAgICByZXR1cm4gZmFsc2U7XG4gIGlmICh0eXBlMSA9PT0gXCJhcnJheVwiKSB7XG4gICAgaWYgKHZhbHVlMS5sZW5ndGggIT09IHZhbHVlMi5sZW5ndGgpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHZhbHVlMS5ldmVyeSgoaXRlbSwgaSkgPT4ge1xuICAgICAgcmV0dXJuIGlzRGVlcEVxdWFsKGl0ZW0sIHZhbHVlMltpXSk7XG4gICAgfSk7XG4gIH1cbiAgaWYgKHR5cGUxID09PSBcIm9iamVjdFwiKSB7XG4gICAgY29uc3Qga2V5QXJyID0gT2JqZWN0LmtleXModmFsdWUxKTtcbiAgICBpZiAoa2V5QXJyLmxlbmd0aCAhPT0gT2JqZWN0LmtleXModmFsdWUyKS5sZW5ndGgpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIGtleUFyci5ldmVyeSgoa2V5KSA9PiB7XG4gICAgICByZXR1cm4gaXNEZWVwRXF1YWwodmFsdWUxW2tleV0sIHZhbHVlMltrZXldKTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gT2JqZWN0LmlzKHZhbHVlMSwgdmFsdWUyKTtcbn1cblxuZnVuY3Rpb24gYmF0Y2hJbnZva2UoZnVuY3Rpb25zKSB7XG4gIGZ1bmN0aW9ucy5mb3JFYWNoKChmbikgPT4gZm4gJiYgZm4oKSk7XG59XG5mdW5jdGlvbiBpbnZva2UoZm4pIHtcbiAgcmV0dXJuIGZuKCk7XG59XG5mdW5jdGlvbiB0YXAodmFsdWUsIGNhbGxiYWNrKSB7XG4gIGNhbGxiYWNrKHZhbHVlKTtcbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiBub3ROdWxsaXNoKHYpIHtcbiAgcmV0dXJuIHYgIT0gbnVsbDtcbn1cbmZ1bmN0aW9uIG5vTnVsbCh2KSB7XG4gIHJldHVybiB2ICE9PSBudWxsO1xufVxuZnVuY3Rpb24gbm90VW5kZWZpbmVkKHYpIHtcbiAgcmV0dXJuIHYgIT09IHZvaWQgMDtcbn1cbmZ1bmN0aW9uIGlzVHJ1dGh5KHYpIHtcbiAgcmV0dXJuIEJvb2xlYW4odik7XG59XG5cbmNvbnN0IGlzRGVmID0gKHZhbCkgPT4gdHlwZW9mIHZhbCAhPT0gXCJ1bmRlZmluZWRcIjtcbmNvbnN0IGlzQm9vbGVhbiA9ICh2YWwpID0+IHR5cGVvZiB2YWwgPT09IFwiYm9vbGVhblwiO1xuY29uc3QgaXNGdW5jdGlvbiA9ICh2YWwpID0+IHR5cGVvZiB2YWwgPT09IFwiZnVuY3Rpb25cIjtcbmNvbnN0IGlzTnVtYmVyID0gKHZhbCkgPT4gdHlwZW9mIHZhbCA9PT0gXCJudW1iZXJcIjtcbmNvbnN0IGlzU3RyaW5nID0gKHZhbCkgPT4gdHlwZW9mIHZhbCA9PT0gXCJzdHJpbmdcIjtcbmNvbnN0IGlzT2JqZWN0ID0gKHZhbCkgPT4gdG9TdHJpbmcodmFsKSA9PT0gXCJbb2JqZWN0IE9iamVjdF1cIjtcbmNvbnN0IGlzVW5kZWZpbmVkID0gKHZhbCkgPT4gdG9TdHJpbmcodmFsKSA9PT0gXCJbb2JqZWN0IFVuZGVmaW5lZF1cIjtcbmNvbnN0IGlzTnVsbCA9ICh2YWwpID0+IHRvU3RyaW5nKHZhbCkgPT09IFwiW29iamVjdCBOdWxsXVwiO1xuY29uc3QgaXNSZWdFeHAgPSAodmFsKSA9PiB0b1N0cmluZyh2YWwpID09PSBcIltvYmplY3QgUmVnRXhwXVwiO1xuY29uc3QgaXNEYXRlID0gKHZhbCkgPT4gdG9TdHJpbmcodmFsKSA9PT0gXCJbb2JqZWN0IERhdGVdXCI7XG5mdW5jdGlvbiBpc1ByaW1pdGl2ZSh2YWwpIHtcbiAgcmV0dXJuICF2YWwgfHwgT2JqZWN0KHZhbCkgIT09IHZhbDtcbn1cbmNvbnN0IGlzV2luZG93ID0gKHZhbCkgPT4gdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0b1N0cmluZyh2YWwpID09PSBcIltvYmplY3QgV2luZG93XVwiO1xuY29uc3QgaXNCcm93c2VyID0gdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIjtcblxuZnVuY3Rpb24gc2xhc2goc3RyKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZSgvXFxcXC9nLCBcIi9cIik7XG59XG5mdW5jdGlvbiBlbnN1cmVQcmVmaXgocHJlZml4LCBzdHIpIHtcbiAgaWYgKCFzdHIuc3RhcnRzV2l0aChwcmVmaXgpKVxuICAgIHJldHVybiBwcmVmaXggKyBzdHI7XG4gIHJldHVybiBzdHI7XG59XG5mdW5jdGlvbiBlbnN1cmVTdWZmaXgoc3VmZml4LCBzdHIpIHtcbiAgaWYgKCFzdHIuZW5kc1dpdGgoc3VmZml4KSlcbiAgICByZXR1cm4gc3RyICsgc3VmZml4O1xuICByZXR1cm4gc3RyO1xufVxuZnVuY3Rpb24gdGVtcGxhdGUoc3RyLCAuLi5hcmdzKSB7XG4gIGNvbnN0IFtmaXJzdEFyZywgZmFsbGJhY2tdID0gYXJncztcbiAgaWYgKGlzT2JqZWN0KGZpcnN0QXJnKSkge1xuICAgIGNvbnN0IHZhcnMgPSBmaXJzdEFyZztcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoL1xceyhcXHcrKVxcfS9nLCAoXywga2V5KSA9PiB2YXJzW2tleV0gfHwgKCh0eXBlb2YgZmFsbGJhY2sgPT09IFwiZnVuY3Rpb25cIiA/IGZhbGxiYWNrKGtleSkgOiBmYWxsYmFjaykgPz8ga2V5KSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKC9cXHsoXFxkKylcXH0vZywgKF8sIGtleSkgPT4ge1xuICAgICAgY29uc3QgaW5kZXggPSBOdW1iZXIoa2V5KTtcbiAgICAgIGlmIChOdW1iZXIuaXNOYU4oaW5kZXgpKVxuICAgICAgICByZXR1cm4ga2V5O1xuICAgICAgcmV0dXJuIGFyZ3NbaW5kZXhdO1xuICAgIH0pO1xuICB9XG59XG5jb25zdCB1cmxBbHBoYWJldCA9IFwidXNlYW5kb20tMjZUMTk4MzQwUFg3NXB4SkFDS1ZFUllNSU5EQlVTSFdPTEZfR1FaYmZnaGprbHF2d3l6cmljdFwiO1xuZnVuY3Rpb24gcmFuZG9tU3RyKHNpemUgPSAxNiwgZGljdCA9IHVybEFscGhhYmV0KSB7XG4gIGxldCBpZCA9IFwiXCI7XG4gIGxldCBpID0gc2l6ZTtcbiAgY29uc3QgbGVuID0gZGljdC5sZW5ndGg7XG4gIHdoaWxlIChpLS0pXG4gICAgaWQgKz0gZGljdFtNYXRoLnJhbmRvbSgpICogbGVuIHwgMF07XG4gIHJldHVybiBpZDtcbn1cbmZ1bmN0aW9uIGNhcGl0YWxpemUoc3RyKSB7XG4gIHJldHVybiBzdHJbMF0udG9VcHBlckNhc2UoKSArIHN0ci5zbGljZSgxKS50b0xvd2VyQ2FzZSgpO1xufVxuY29uc3QgX3JlRnVsbFdzID0gL15cXHMqJC87XG5mdW5jdGlvbiB1bmluZGVudChzdHIpIHtcbiAgY29uc3QgbGluZXMgPSAodHlwZW9mIHN0ciA9PT0gXCJzdHJpbmdcIiA/IHN0ciA6IHN0clswXSkuc3BsaXQoXCJcXG5cIik7XG4gIGNvbnN0IHdoaXRlc3BhY2VMaW5lcyA9IGxpbmVzLm1hcCgobGluZSkgPT4gX3JlRnVsbFdzLnRlc3QobGluZSkpO1xuICBjb25zdCBjb21tb25JbmRlbnQgPSBsaW5lcy5yZWR1Y2UoKG1pbiwgbGluZSwgaWR4KSA9PiB7XG4gICAgaWYgKHdoaXRlc3BhY2VMaW5lc1tpZHhdKVxuICAgICAgcmV0dXJuIG1pbjtcbiAgICBjb25zdCBpbmRlbnQgPSBsaW5lLm1hdGNoKC9eXFxzKi8pPy5bMF0ubGVuZ3RoO1xuICAgIHJldHVybiBpbmRlbnQgPT09IHZvaWQgMCA/IG1pbiA6IE1hdGgubWluKG1pbiwgaW5kZW50KTtcbiAgfSwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTtcbiAgbGV0IGVtcHR5TGluZXNIZWFkID0gMDtcbiAgd2hpbGUgKGVtcHR5TGluZXNIZWFkIDwgbGluZXMubGVuZ3RoICYmIHdoaXRlc3BhY2VMaW5lc1tlbXB0eUxpbmVzSGVhZF0pXG4gICAgZW1wdHlMaW5lc0hlYWQrKztcbiAgbGV0IGVtcHR5TGluZXNUYWlsID0gMDtcbiAgd2hpbGUgKGVtcHR5TGluZXNUYWlsIDwgbGluZXMubGVuZ3RoICYmIHdoaXRlc3BhY2VMaW5lc1tsaW5lcy5sZW5ndGggLSBlbXB0eUxpbmVzVGFpbCAtIDFdKVxuICAgIGVtcHR5TGluZXNUYWlsKys7XG4gIHJldHVybiBsaW5lcy5zbGljZShlbXB0eUxpbmVzSGVhZCwgbGluZXMubGVuZ3RoIC0gZW1wdHlMaW5lc1RhaWwpLm1hcCgobGluZSkgPT4gbGluZS5zbGljZShjb21tb25JbmRlbnQpKS5qb2luKFwiXFxuXCIpO1xufVxuXG5mdW5jdGlvbiBvYmplY3RNYXAob2JqLCBmbikge1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5lbnRyaWVzKG9iaikubWFwKChbaywgdl0pID0+IGZuKGssIHYpKS5maWx0ZXIobm90TnVsbGlzaClcbiAgKTtcbn1cbmZ1bmN0aW9uIGlzS2V5T2Yob2JqLCBrKSB7XG4gIHJldHVybiBrIGluIG9iajtcbn1cbmZ1bmN0aW9uIG9iamVjdEtleXMob2JqKSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhvYmopO1xufVxuZnVuY3Rpb24gb2JqZWN0RW50cmllcyhvYmopIHtcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKG9iaik7XG59XG5mdW5jdGlvbiBkZWVwTWVyZ2UodGFyZ2V0LCAuLi5zb3VyY2VzKSB7XG4gIGlmICghc291cmNlcy5sZW5ndGgpXG4gICAgcmV0dXJuIHRhcmdldDtcbiAgY29uc3Qgc291cmNlID0gc291cmNlcy5zaGlmdCgpO1xuICBpZiAoc291cmNlID09PSB2b2lkIDApXG4gICAgcmV0dXJuIHRhcmdldDtcbiAgaWYgKGlzTWVyZ2FibGVPYmplY3QodGFyZ2V0KSAmJiBpc01lcmdhYmxlT2JqZWN0KHNvdXJjZSkpIHtcbiAgICBvYmplY3RLZXlzKHNvdXJjZSkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBpZiAoa2V5ID09PSBcIl9fcHJvdG9fX1wiIHx8IGtleSA9PT0gXCJjb25zdHJ1Y3RvclwiIHx8IGtleSA9PT0gXCJwcm90b3R5cGVcIilcbiAgICAgICAgcmV0dXJuO1xuICAgICAgaWYgKGlzTWVyZ2FibGVPYmplY3Qoc291cmNlW2tleV0pKSB7XG4gICAgICAgIGlmICghdGFyZ2V0W2tleV0pXG4gICAgICAgICAgdGFyZ2V0W2tleV0gPSB7fTtcbiAgICAgICAgaWYgKGlzTWVyZ2FibGVPYmplY3QodGFyZ2V0W2tleV0pKSB7XG4gICAgICAgICAgZGVlcE1lcmdlKHRhcmdldFtrZXldLCBzb3VyY2Vba2V5XSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICByZXR1cm4gZGVlcE1lcmdlKHRhcmdldCwgLi4uc291cmNlcyk7XG59XG5mdW5jdGlvbiBkZWVwTWVyZ2VXaXRoQXJyYXkodGFyZ2V0LCAuLi5zb3VyY2VzKSB7XG4gIGlmICghc291cmNlcy5sZW5ndGgpXG4gICAgcmV0dXJuIHRhcmdldDtcbiAgY29uc3Qgc291cmNlID0gc291cmNlcy5zaGlmdCgpO1xuICBpZiAoc291cmNlID09PSB2b2lkIDApXG4gICAgcmV0dXJuIHRhcmdldDtcbiAgaWYgKEFycmF5LmlzQXJyYXkodGFyZ2V0KSAmJiBBcnJheS5pc0FycmF5KHNvdXJjZSkpXG4gICAgdGFyZ2V0LnB1c2goLi4uc291cmNlKTtcbiAgaWYgKGlzTWVyZ2FibGVPYmplY3QodGFyZ2V0KSAmJiBpc01lcmdhYmxlT2JqZWN0KHNvdXJjZSkpIHtcbiAgICBvYmplY3RLZXlzKHNvdXJjZSkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBpZiAoa2V5ID09PSBcIl9fcHJvdG9fX1wiIHx8IGtleSA9PT0gXCJjb25zdHJ1Y3RvclwiIHx8IGtleSA9PT0gXCJwcm90b3R5cGVcIilcbiAgICAgICAgcmV0dXJuO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc291cmNlW2tleV0pKSB7XG4gICAgICAgIGlmICghdGFyZ2V0W2tleV0pXG4gICAgICAgICAgdGFyZ2V0W2tleV0gPSBbXTtcbiAgICAgICAgZGVlcE1lcmdlV2l0aEFycmF5KHRhcmdldFtrZXldLCBzb3VyY2Vba2V5XSk7XG4gICAgICB9IGVsc2UgaWYgKGlzTWVyZ2FibGVPYmplY3Qoc291cmNlW2tleV0pKSB7XG4gICAgICAgIGlmICghdGFyZ2V0W2tleV0pXG4gICAgICAgICAgdGFyZ2V0W2tleV0gPSB7fTtcbiAgICAgICAgZGVlcE1lcmdlV2l0aEFycmF5KHRhcmdldFtrZXldLCBzb3VyY2Vba2V5XSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHJldHVybiBkZWVwTWVyZ2VXaXRoQXJyYXkodGFyZ2V0LCAuLi5zb3VyY2VzKTtcbn1cbmZ1bmN0aW9uIGlzTWVyZ2FibGVPYmplY3QoaXRlbSkge1xuICByZXR1cm4gaXNPYmplY3QoaXRlbSkgJiYgIUFycmF5LmlzQXJyYXkoaXRlbSk7XG59XG5mdW5jdGlvbiBvYmplY3RQaWNrKG9iaiwga2V5cywgb21pdFVuZGVmaW5lZCA9IGZhbHNlKSB7XG4gIHJldHVybiBrZXlzLnJlZHVjZSgobiwgaykgPT4ge1xuICAgIGlmIChrIGluIG9iaikge1xuICAgICAgaWYgKCFvbWl0VW5kZWZpbmVkIHx8IG9ialtrXSAhPT0gdm9pZCAwKVxuICAgICAgICBuW2tdID0gb2JqW2tdO1xuICAgIH1cbiAgICByZXR1cm4gbjtcbiAgfSwge30pO1xufVxuZnVuY3Rpb24gb2JqZWN0T21pdChvYmosIGtleXMsIG9taXRVbmRlZmluZWQgPSBmYWxzZSkge1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKG9iaikuZmlsdGVyKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICByZXR1cm4gKCFvbWl0VW5kZWZpbmVkIHx8IHZhbHVlICE9PSB2b2lkIDApICYmICFrZXlzLmluY2x1ZGVzKGtleSk7XG4gIH0pKTtcbn1cbmZ1bmN0aW9uIGNsZWFyVW5kZWZpbmVkKG9iaikge1xuICBPYmplY3Qua2V5cyhvYmopLmZvckVhY2goKGtleSkgPT4gb2JqW2tleV0gPT09IHZvaWQgMCA/IGRlbGV0ZSBvYmpba2V5XSA6IHt9KTtcbiAgcmV0dXJuIG9iajtcbn1cbmZ1bmN0aW9uIGhhc093blByb3BlcnR5KG9iaiwgdikge1xuICBpZiAob2JqID09IG51bGwpXG4gICAgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgdik7XG59XG5jb25zdCBfb2JqZWN0SWRNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcbmZ1bmN0aW9uIG9iamVjdElkKG9iaikge1xuICBpZiAoaXNQcmltaXRpdmUob2JqKSlcbiAgICByZXR1cm4gb2JqO1xuICBpZiAoIV9vYmplY3RJZE1hcC5oYXMob2JqKSkge1xuICAgIF9vYmplY3RJZE1hcC5zZXQob2JqLCByYW5kb21TdHIoKSk7XG4gIH1cbiAgcmV0dXJuIF9vYmplY3RJZE1hcC5nZXQob2JqKTtcbn1cblxuLypcbkhvdyBpdCB3b3JrczpcbmB0aGlzLiNoZWFkYCBpcyBhbiBpbnN0YW5jZSBvZiBgTm9kZWAgd2hpY2gga2VlcHMgdHJhY2sgb2YgaXRzIGN1cnJlbnQgdmFsdWUgYW5kIG5lc3RzIGFub3RoZXIgaW5zdGFuY2Ugb2YgYE5vZGVgIHRoYXQga2VlcHMgdGhlIHZhbHVlIHRoYXQgY29tZXMgYWZ0ZXIgaXQuIFdoZW4gYSB2YWx1ZSBpcyBwcm92aWRlZCB0byBgLmVucXVldWUoKWAsIHRoZSBjb2RlIG5lZWRzIHRvIGl0ZXJhdGUgdGhyb3VnaCBgdGhpcy4jaGVhZGAsIGdvaW5nIGRlZXBlciBhbmQgZGVlcGVyIHRvIGZpbmQgdGhlIGxhc3QgdmFsdWUuIEhvd2V2ZXIsIGl0ZXJhdGluZyB0aHJvdWdoIGV2ZXJ5IHNpbmdsZSBpdGVtIGlzIHNsb3cuIFRoaXMgcHJvYmxlbSBpcyBzb2x2ZWQgYnkgc2F2aW5nIGEgcmVmZXJlbmNlIHRvIHRoZSBsYXN0IHZhbHVlIGFzIGB0aGlzLiN0YWlsYCBzbyB0aGF0IGl0IGNhbiByZWZlcmVuY2UgaXQgdG8gYWRkIGEgbmV3IHZhbHVlLlxuKi9cblxuY2xhc3MgTm9kZSB7XG5cdHZhbHVlO1xuXHRuZXh0O1xuXG5cdGNvbnN0cnVjdG9yKHZhbHVlKSB7XG5cdFx0dGhpcy52YWx1ZSA9IHZhbHVlO1xuXHR9XG59XG5cbmNsYXNzIFF1ZXVlIHtcblx0I2hlYWQ7XG5cdCN0YWlsO1xuXHQjc2l6ZTtcblxuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHR0aGlzLmNsZWFyKCk7XG5cdH1cblxuXHRlbnF1ZXVlKHZhbHVlKSB7XG5cdFx0Y29uc3Qgbm9kZSA9IG5ldyBOb2RlKHZhbHVlKTtcblxuXHRcdGlmICh0aGlzLiNoZWFkKSB7XG5cdFx0XHR0aGlzLiN0YWlsLm5leHQgPSBub2RlO1xuXHRcdFx0dGhpcy4jdGFpbCA9IG5vZGU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuI2hlYWQgPSBub2RlO1xuXHRcdFx0dGhpcy4jdGFpbCA9IG5vZGU7XG5cdFx0fVxuXG5cdFx0dGhpcy4jc2l6ZSsrO1xuXHR9XG5cblx0ZGVxdWV1ZSgpIHtcblx0XHRjb25zdCBjdXJyZW50ID0gdGhpcy4jaGVhZDtcblx0XHRpZiAoIWN1cnJlbnQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR0aGlzLiNoZWFkID0gdGhpcy4jaGVhZC5uZXh0O1xuXHRcdHRoaXMuI3NpemUtLTtcblx0XHRyZXR1cm4gY3VycmVudC52YWx1ZTtcblx0fVxuXG5cdHBlZWsoKSB7XG5cdFx0aWYgKCF0aGlzLiNoZWFkKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuI2hlYWQudmFsdWU7XG5cblx0XHQvLyBUT0RPOiBOb2RlLmpzIDE4LlxuXHRcdC8vIHJldHVybiB0aGlzLiNoZWFkPy52YWx1ZTtcblx0fVxuXG5cdGNsZWFyKCkge1xuXHRcdHRoaXMuI2hlYWQgPSB1bmRlZmluZWQ7XG5cdFx0dGhpcy4jdGFpbCA9IHVuZGVmaW5lZDtcblx0XHR0aGlzLiNzaXplID0gMDtcblx0fVxuXG5cdGdldCBzaXplKCkge1xuXHRcdHJldHVybiB0aGlzLiNzaXplO1xuXHR9XG5cblx0KiBbU3ltYm9sLml0ZXJhdG9yXSgpIHtcblx0XHRsZXQgY3VycmVudCA9IHRoaXMuI2hlYWQ7XG5cblx0XHR3aGlsZSAoY3VycmVudCkge1xuXHRcdFx0eWllbGQgY3VycmVudC52YWx1ZTtcblx0XHRcdGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7XG5cdFx0fVxuXHR9XG5cblx0KiBkcmFpbigpIHtcblx0XHR3aGlsZSAodGhpcy4jaGVhZCkge1xuXHRcdFx0eWllbGQgdGhpcy5kZXF1ZXVlKCk7XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIHBMaW1pdChjb25jdXJyZW5jeSkge1xuXHR2YWxpZGF0ZUNvbmN1cnJlbmN5KGNvbmN1cnJlbmN5KTtcblxuXHRjb25zdCBxdWV1ZSA9IG5ldyBRdWV1ZSgpO1xuXHRsZXQgYWN0aXZlQ291bnQgPSAwO1xuXG5cdGNvbnN0IHJlc3VtZU5leHQgPSAoKSA9PiB7XG5cdFx0Ly8gUHJvY2VzcyB0aGUgbmV4dCBxdWV1ZWQgZnVuY3Rpb24gaWYgd2UncmUgdW5kZXIgdGhlIGNvbmN1cnJlbmN5IGxpbWl0XG5cdFx0aWYgKGFjdGl2ZUNvdW50IDwgY29uY3VycmVuY3kgJiYgcXVldWUuc2l6ZSA+IDApIHtcblx0XHRcdGFjdGl2ZUNvdW50Kys7XG5cdFx0XHRxdWV1ZS5kZXF1ZXVlKCkoKTtcblx0XHR9XG5cdH07XG5cblx0Y29uc3QgbmV4dCA9ICgpID0+IHtcblx0XHRhY3RpdmVDb3VudC0tO1xuXHRcdHJlc3VtZU5leHQoKTtcblx0fTtcblxuXHRjb25zdCBydW4gPSBhc3luYyAoZnVuY3Rpb25fLCByZXNvbHZlLCBhcmd1bWVudHNfKSA9PiB7XG5cdFx0Ly8gRXhlY3V0ZSB0aGUgZnVuY3Rpb24gYW5kIGNhcHR1cmUgdGhlIHJlc3VsdCBwcm9taXNlXG5cdFx0Y29uc3QgcmVzdWx0ID0gKGFzeW5jICgpID0+IGZ1bmN0aW9uXyguLi5hcmd1bWVudHNfKSkoKTtcblxuXHRcdC8vIFJlc29sdmUgaW1tZWRpYXRlbHkgd2l0aCB0aGUgcHJvbWlzZSAoZG9uJ3Qgd2FpdCBmb3IgY29tcGxldGlvbilcblx0XHRyZXNvbHZlKHJlc3VsdCk7XG5cblx0XHQvLyBXYWl0IGZvciB0aGUgZnVuY3Rpb24gdG8gY29tcGxldGUgKHN1Y2Nlc3Mgb3IgZmFpbHVyZSlcblx0XHQvLyBXZSBjYXRjaCBlcnJvcnMgaGVyZSB0byBwcmV2ZW50IHVuaGFuZGxlZCByZWplY3Rpb25zLFxuXHRcdC8vIGJ1dCB0aGUgb3JpZ2luYWwgcHJvbWlzZSByZWplY3Rpb24gaXMgcHJlc2VydmVkIGZvciB0aGUgY2FsbGVyXG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHJlc3VsdDtcblx0XHR9IGNhdGNoIHt9XG5cblx0XHQvLyBEZWNyZW1lbnQgYWN0aXZlIGNvdW50IGFuZCBwcm9jZXNzIG5leHQgcXVldWVkIGZ1bmN0aW9uXG5cdFx0bmV4dCgpO1xuXHR9O1xuXG5cdGNvbnN0IGVucXVldWUgPSAoZnVuY3Rpb25fLCByZXNvbHZlLCBhcmd1bWVudHNfKSA9PiB7XG5cdFx0Ly8gUXVldWUgdGhlIGludGVybmFsIHJlc29sdmUgZnVuY3Rpb24gaW5zdGVhZCBvZiB0aGUgcnVuIGZ1bmN0aW9uXG5cdFx0Ly8gdG8gcHJlc2VydmUgdGhlIGFzeW5jaHJvbm91cyBleGVjdXRpb24gY29udGV4dC5cblx0XHRuZXcgUHJvbWlzZShpbnRlcm5hbFJlc29sdmUgPT4geyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHByb21pc2UvcGFyYW0tbmFtZXNcblx0XHRcdHF1ZXVlLmVucXVldWUoaW50ZXJuYWxSZXNvbHZlKTtcblx0XHR9KS50aGVuKHJ1bi5iaW5kKHVuZGVmaW5lZCwgZnVuY3Rpb25fLCByZXNvbHZlLCBhcmd1bWVudHNfKSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcHJvbWlzZS9wcmVmZXItYXdhaXQtdG8tdGhlblxuXG5cdFx0Ly8gU3RhcnQgcHJvY2Vzc2luZyBpbW1lZGlhdGVseSBpZiB3ZSBoYXZlbid0IHJlYWNoZWQgdGhlIGNvbmN1cnJlbmN5IGxpbWl0XG5cdFx0aWYgKGFjdGl2ZUNvdW50IDwgY29uY3VycmVuY3kpIHtcblx0XHRcdHJlc3VtZU5leHQoKTtcblx0XHR9XG5cdH07XG5cblx0Y29uc3QgZ2VuZXJhdG9yID0gKGZ1bmN0aW9uXywgLi4uYXJndW1lbnRzXykgPT4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG5cdFx0ZW5xdWV1ZShmdW5jdGlvbl8sIHJlc29sdmUsIGFyZ3VtZW50c18pO1xuXHR9KTtcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydGllcyhnZW5lcmF0b3IsIHtcblx0XHRhY3RpdmVDb3VudDoge1xuXHRcdFx0Z2V0OiAoKSA9PiBhY3RpdmVDb3VudCxcblx0XHR9LFxuXHRcdHBlbmRpbmdDb3VudDoge1xuXHRcdFx0Z2V0OiAoKSA9PiBxdWV1ZS5zaXplLFxuXHRcdH0sXG5cdFx0Y2xlYXJRdWV1ZToge1xuXHRcdFx0dmFsdWUoKSB7XG5cdFx0XHRcdHF1ZXVlLmNsZWFyKCk7XG5cdFx0XHR9LFxuXHRcdH0sXG5cdFx0Y29uY3VycmVuY3k6IHtcblx0XHRcdGdldDogKCkgPT4gY29uY3VycmVuY3ksXG5cblx0XHRcdHNldChuZXdDb25jdXJyZW5jeSkge1xuXHRcdFx0XHR2YWxpZGF0ZUNvbmN1cnJlbmN5KG5ld0NvbmN1cnJlbmN5KTtcblx0XHRcdFx0Y29uY3VycmVuY3kgPSBuZXdDb25jdXJyZW5jeTtcblxuXHRcdFx0XHRxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG5cdFx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVubW9kaWZpZWQtbG9vcC1jb25kaXRpb25cblx0XHRcdFx0XHR3aGlsZSAoYWN0aXZlQ291bnQgPCBjb25jdXJyZW5jeSAmJiBxdWV1ZS5zaXplID4gMCkge1xuXHRcdFx0XHRcdFx0cmVzdW1lTmV4dCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9LFxuXHRcdH0sXG5cdFx0bWFwOiB7XG5cdFx0XHRhc3luYyB2YWx1ZShhcnJheSwgZnVuY3Rpb25fKSB7XG5cdFx0XHRcdGNvbnN0IHByb21pc2VzID0gYXJyYXkubWFwKCh2YWx1ZSwgaW5kZXgpID0+IHRoaXMoZnVuY3Rpb25fLCB2YWx1ZSwgaW5kZXgpKTtcblx0XHRcdFx0cmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKTtcblx0XHRcdH0sXG5cdFx0fSxcblx0fSk7XG5cblx0cmV0dXJuIGdlbmVyYXRvcjtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVDb25jdXJyZW5jeShjb25jdXJyZW5jeSkge1xuXHRpZiAoISgoTnVtYmVyLmlzSW50ZWdlcihjb25jdXJyZW5jeSkgfHwgY29uY3VycmVuY3kgPT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSkgJiYgY29uY3VycmVuY3kgPiAwKSkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGBjb25jdXJyZW5jeWAgdG8gYmUgYSBudW1iZXIgZnJvbSAxIGFuZCB1cCcpO1xuXHR9XG59XG5cbmNvbnN0IFZPSUQgPSBTeW1ib2woXCJwLXZvaWRcIik7XG5jbGFzcyBQSW5zdGFuY2UgZXh0ZW5kcyBQcm9taXNlIHtcbiAgY29uc3RydWN0b3IoaXRlbXMgPSBbXSwgb3B0aW9ucykge1xuICAgIHN1cGVyKCgpID0+IHtcbiAgICB9KTtcbiAgICB0aGlzLml0ZW1zID0gaXRlbXM7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgfVxuICBwcm9taXNlcyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG4gIGdldCBwcm9taXNlKCkge1xuICAgIGxldCBiYXRjaDtcbiAgICBjb25zdCBpdGVtcyA9IFsuLi5BcnJheS5mcm9tKHRoaXMuaXRlbXMpLCAuLi5BcnJheS5mcm9tKHRoaXMucHJvbWlzZXMpXTtcbiAgICBpZiAodGhpcy5vcHRpb25zPy5jb25jdXJyZW5jeSkge1xuICAgICAgY29uc3QgbGltaXQgPSBwTGltaXQodGhpcy5vcHRpb25zLmNvbmN1cnJlbmN5KTtcbiAgICAgIGJhdGNoID0gUHJvbWlzZS5hbGwoaXRlbXMubWFwKChwMikgPT4gbGltaXQoKCkgPT4gcDIpKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJhdGNoID0gUHJvbWlzZS5hbGwoaXRlbXMpO1xuICAgIH1cbiAgICByZXR1cm4gYmF0Y2gudGhlbigobCkgPT4gbC5maWx0ZXIoKGkpID0+IGkgIT09IFZPSUQpKTtcbiAgfVxuICBhZGQoLi4uYXJncykge1xuICAgIGFyZ3MuZm9yRWFjaCgoaSkgPT4ge1xuICAgICAgdGhpcy5wcm9taXNlcy5hZGQoaSk7XG4gICAgfSk7XG4gIH1cbiAgbWFwKGZuKSB7XG4gICAgcmV0dXJuIG5ldyBQSW5zdGFuY2UoXG4gICAgICBBcnJheS5mcm9tKHRoaXMuaXRlbXMpLm1hcChhc3luYyAoaSwgaWR4KSA9PiB7XG4gICAgICAgIGNvbnN0IHYgPSBhd2FpdCBpO1xuICAgICAgICBpZiAodiA9PT0gVk9JRClcbiAgICAgICAgICByZXR1cm4gVk9JRDtcbiAgICAgICAgcmV0dXJuIGZuKHYsIGlkeCk7XG4gICAgICB9KSxcbiAgICAgIHRoaXMub3B0aW9uc1xuICAgICk7XG4gIH1cbiAgZmlsdGVyKGZuKSB7XG4gICAgcmV0dXJuIG5ldyBQSW5zdGFuY2UoXG4gICAgICBBcnJheS5mcm9tKHRoaXMuaXRlbXMpLm1hcChhc3luYyAoaSwgaWR4KSA9PiB7XG4gICAgICAgIGNvbnN0IHYgPSBhd2FpdCBpO1xuICAgICAgICBjb25zdCByID0gYXdhaXQgZm4odiwgaWR4KTtcbiAgICAgICAgaWYgKCFyKVxuICAgICAgICAgIHJldHVybiBWT0lEO1xuICAgICAgICByZXR1cm4gdjtcbiAgICAgIH0pLFxuICAgICAgdGhpcy5vcHRpb25zXG4gICAgKTtcbiAgfVxuICBmb3JFYWNoKGZuKSB7XG4gICAgcmV0dXJuIHRoaXMubWFwKGZuKS50aGVuKCk7XG4gIH1cbiAgcmVkdWNlKGZuLCBpbml0aWFsVmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9taXNlLnRoZW4oKGFycmF5KSA9PiBhcnJheS5yZWR1Y2UoZm4sIGluaXRpYWxWYWx1ZSkpO1xuICB9XG4gIGNsZWFyKCkge1xuICAgIHRoaXMucHJvbWlzZXMuY2xlYXIoKTtcbiAgfVxuICB0aGVuKG9uZnVsZmlsbGVkLCBvbnJlamVjdGVkKSB7XG4gICAgcmV0dXJuIHRoaXMucHJvbWlzZS50aGVuKG9uZnVsZmlsbGVkLCBvbnJlamVjdGVkKTtcbiAgfVxuICBjYXRjaChmbikge1xuICAgIHJldHVybiB0aGlzLnByb21pc2UuY2F0Y2goZm4pO1xuICB9XG4gIGZpbmFsbHkoZm4pIHtcbiAgICByZXR1cm4gdGhpcy5wcm9taXNlLmZpbmFsbHkoZm4pO1xuICB9XG59XG5mdW5jdGlvbiBwKGl0ZW1zLCBvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgUEluc3RhbmNlKGl0ZW1zLCBvcHRpb25zKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlU2luZ2xldG9uUHJvbWlzZShmbikge1xuICBsZXQgX3Byb21pc2U7XG4gIGZ1bmN0aW9uIHdyYXBwZXIoKSB7XG4gICAgaWYgKCFfcHJvbWlzZSlcbiAgICAgIF9wcm9taXNlID0gZm4oKTtcbiAgICByZXR1cm4gX3Byb21pc2U7XG4gIH1cbiAgd3JhcHBlci5yZXNldCA9IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBfcHJldiA9IF9wcm9taXNlO1xuICAgIF9wcm9taXNlID0gdm9pZCAwO1xuICAgIGlmIChfcHJldilcbiAgICAgIGF3YWl0IF9wcmV2O1xuICB9O1xuICByZXR1cm4gd3JhcHBlcjtcbn1cbmZ1bmN0aW9uIHNsZWVwKG1zLCBjYWxsYmFjaykge1xuICByZXR1cm4gbmV3IFByb21pc2UoXG4gICAgKHJlc29sdmUpID0+IHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgY2FsbGJhY2s/LigpO1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0sIG1zKVxuICApO1xufVxuZnVuY3Rpb24gY3JlYXRlUHJvbWlzZUxvY2soKSB7XG4gIGNvbnN0IGxvY2tzID0gW107XG4gIHJldHVybiB7XG4gICAgYXN5bmMgcnVuKGZuKSB7XG4gICAgICBjb25zdCBwID0gZm4oKTtcbiAgICAgIGxvY2tzLnB1c2gocCk7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgcDtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHJlbW92ZShsb2NrcywgcCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBhc3luYyB3YWl0KCkge1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKGxvY2tzKTtcbiAgICB9LFxuICAgIGlzV2FpdGluZygpIHtcbiAgICAgIHJldHVybiBCb29sZWFuKGxvY2tzLmxlbmd0aCk7XG4gICAgfSxcbiAgICBjbGVhcigpIHtcbiAgICAgIGxvY2tzLmxlbmd0aCA9IDA7XG4gICAgfVxuICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlQ29udHJvbGxlZFByb21pc2UoKSB7XG4gIGxldCByZXNvbHZlLCByZWplY3Q7XG4gIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZSgoX3Jlc29sdmUsIF9yZWplY3QpID0+IHtcbiAgICByZXNvbHZlID0gX3Jlc29sdmU7XG4gICAgcmVqZWN0ID0gX3JlamVjdDtcbiAgfSk7XG4gIHByb21pc2UucmVzb2x2ZSA9IHJlc29sdmU7XG4gIHByb21pc2UucmVqZWN0ID0gcmVqZWN0O1xuICByZXR1cm4gcHJvbWlzZTtcbn1cblxuY29uc3QgdGltZXN0YW1wID0gKCkgPT4gK0RhdGUubm93KCk7XG5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVmaW5lZCxuby1wYXJhbS1yZWFzc2lnbixuby1zaGFkb3cgKi9cblxuLyoqXG4gKiBUaHJvdHRsZSBleGVjdXRpb24gb2YgYSBmdW5jdGlvbi4gRXNwZWNpYWxseSB1c2VmdWwgZm9yIHJhdGUgbGltaXRpbmdcbiAqIGV4ZWN1dGlvbiBvZiBoYW5kbGVycyBvbiBldmVudHMgbGlrZSByZXNpemUgYW5kIHNjcm9sbC5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gZGVsYXkgLSAgICAgICAgICAgICAgICAgIEEgemVyby1vci1ncmVhdGVyIGRlbGF5IGluIG1pbGxpc2Vjb25kcy4gRm9yIGV2ZW50IGNhbGxiYWNrcywgdmFsdWVzIGFyb3VuZCAxMDAgb3IgMjUwIChvciBldmVuIGhpZ2hlcilcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgbW9zdCB1c2VmdWwuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayAtICAgICAgICAgICAgICAgQSBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCBhZnRlciBkZWxheSBtaWxsaXNlY29uZHMuIFRoZSBgdGhpc2AgY29udGV4dCBhbmQgYWxsIGFyZ3VtZW50cyBhcmUgcGFzc2VkIHRocm91Z2gsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMtaXMsIHRvIGBjYWxsYmFja2Agd2hlbiB0aGUgdGhyb3R0bGVkLWZ1bmN0aW9uIGlzIGV4ZWN1dGVkLlxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXSAtICAgICAgICAgICAgICBBbiBvYmplY3QgdG8gY29uZmlndXJlIG9wdGlvbnMuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLm5vVHJhaWxpbmddIC0gICBPcHRpb25hbCwgZGVmYXVsdHMgdG8gZmFsc2UuIElmIG5vVHJhaWxpbmcgaXMgdHJ1ZSwgY2FsbGJhY2sgd2lsbCBvbmx5IGV4ZWN1dGUgZXZlcnkgYGRlbGF5YCBtaWxsaXNlY29uZHNcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSB0aGUgdGhyb3R0bGVkLWZ1bmN0aW9uIGlzIGJlaW5nIGNhbGxlZC4gSWYgbm9UcmFpbGluZyBpcyBmYWxzZSBvciB1bnNwZWNpZmllZCwgY2FsbGJhY2sgd2lsbCBiZSBleGVjdXRlZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uZSBmaW5hbCB0aW1lIGFmdGVyIHRoZSBsYXN0IHRocm90dGxlZC1mdW5jdGlvbiBjYWxsLiAoQWZ0ZXIgdGhlIHRocm90dGxlZC1mdW5jdGlvbiBoYXMgbm90IGJlZW4gY2FsbGVkIGZvclxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBkZWxheWAgbWlsbGlzZWNvbmRzLCB0aGUgaW50ZXJuYWwgY291bnRlciBpcyByZXNldCkuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLm5vTGVhZGluZ10gLSAgIE9wdGlvbmFsLCBkZWZhdWx0cyB0byBmYWxzZS4gSWYgbm9MZWFkaW5nIGlzIGZhbHNlLCB0aGUgZmlyc3QgdGhyb3R0bGVkLWZ1bmN0aW9uIGNhbGwgd2lsbCBleGVjdXRlIGNhbGxiYWNrXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1tZWRpYXRlbHkuIElmIG5vTGVhZGluZyBpcyB0cnVlLCB0aGUgZmlyc3QgdGhlIGNhbGxiYWNrIGV4ZWN1dGlvbiB3aWxsIGJlIHNraXBwZWQuIEl0IHNob3VsZCBiZSBub3RlZCB0aGF0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgd2lsbCBuZXZlciBleGVjdXRlZCBpZiBib3RoIG5vTGVhZGluZyA9IHRydWUgYW5kIG5vVHJhaWxpbmcgPSB0cnVlLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5kZWJvdW5jZU1vZGVdIC0gSWYgYGRlYm91bmNlTW9kZWAgaXMgdHJ1ZSAoYXQgYmVnaW4pLCBzY2hlZHVsZSBgY2xlYXJgIHRvIGV4ZWN1dGUgYWZ0ZXIgYGRlbGF5YCBtcy4gSWYgYGRlYm91bmNlTW9kZWAgaXNcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAoYXQgZW5kKSwgc2NoZWR1bGUgYGNhbGxiYWNrYCB0byBleGVjdXRlIGFmdGVyIGBkZWxheWAgbXMuXG4gKlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBBIG5ldywgdGhyb3R0bGVkLCBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gdGhyb3R0bGUkMSAoZGVsYXksIGNhbGxiYWNrLCBvcHRpb25zKSB7XG4gIHZhciBfcmVmID0gb3B0aW9ucyB8fCB7fSxcbiAgICAgIF9yZWYkbm9UcmFpbGluZyA9IF9yZWYubm9UcmFpbGluZyxcbiAgICAgIG5vVHJhaWxpbmcgPSBfcmVmJG5vVHJhaWxpbmcgPT09IHZvaWQgMCA/IGZhbHNlIDogX3JlZiRub1RyYWlsaW5nLFxuICAgICAgX3JlZiRub0xlYWRpbmcgPSBfcmVmLm5vTGVhZGluZyxcbiAgICAgIG5vTGVhZGluZyA9IF9yZWYkbm9MZWFkaW5nID09PSB2b2lkIDAgPyBmYWxzZSA6IF9yZWYkbm9MZWFkaW5nLFxuICAgICAgX3JlZiRkZWJvdW5jZU1vZGUgPSBfcmVmLmRlYm91bmNlTW9kZSxcbiAgICAgIGRlYm91bmNlTW9kZSA9IF9yZWYkZGVib3VuY2VNb2RlID09PSB2b2lkIDAgPyB1bmRlZmluZWQgOiBfcmVmJGRlYm91bmNlTW9kZTtcbiAgLypcbiAgICogQWZ0ZXIgd3JhcHBlciBoYXMgc3RvcHBlZCBiZWluZyBjYWxsZWQsIHRoaXMgdGltZW91dCBlbnN1cmVzIHRoYXRcbiAgICogYGNhbGxiYWNrYCBpcyBleGVjdXRlZCBhdCB0aGUgcHJvcGVyIHRpbWVzIGluIGB0aHJvdHRsZWAgYW5kIGBlbmRgXG4gICAqIGRlYm91bmNlIG1vZGVzLlxuICAgKi9cblxuXG4gIHZhciB0aW1lb3V0SUQ7XG4gIHZhciBjYW5jZWxsZWQgPSBmYWxzZTsgLy8gS2VlcCB0cmFjayBvZiB0aGUgbGFzdCB0aW1lIGBjYWxsYmFja2Agd2FzIGV4ZWN1dGVkLlxuXG4gIHZhciBsYXN0RXhlYyA9IDA7IC8vIEZ1bmN0aW9uIHRvIGNsZWFyIGV4aXN0aW5nIHRpbWVvdXRcblxuICBmdW5jdGlvbiBjbGVhckV4aXN0aW5nVGltZW91dCgpIHtcbiAgICBpZiAodGltZW91dElEKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZW91dElEKTtcbiAgICB9XG4gIH0gLy8gRnVuY3Rpb24gdG8gY2FuY2VsIG5leHQgZXhlY1xuXG5cbiAgZnVuY3Rpb24gY2FuY2VsKG9wdGlvbnMpIHtcbiAgICB2YXIgX3JlZjIgPSBvcHRpb25zIHx8IHt9LFxuICAgICAgICBfcmVmMiR1cGNvbWluZ09ubHkgPSBfcmVmMi51cGNvbWluZ09ubHksXG4gICAgICAgIHVwY29taW5nT25seSA9IF9yZWYyJHVwY29taW5nT25seSA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcmVmMiR1cGNvbWluZ09ubHk7XG5cbiAgICBjbGVhckV4aXN0aW5nVGltZW91dCgpO1xuICAgIGNhbmNlbGxlZCA9ICF1cGNvbWluZ09ubHk7XG4gIH1cbiAgLypcbiAgICogVGhlIGB3cmFwcGVyYCBmdW5jdGlvbiBlbmNhcHN1bGF0ZXMgYWxsIG9mIHRoZSB0aHJvdHRsaW5nIC8gZGVib3VuY2luZ1xuICAgKiBmdW5jdGlvbmFsaXR5IGFuZCB3aGVuIGV4ZWN1dGVkIHdpbGwgbGltaXQgdGhlIHJhdGUgYXQgd2hpY2ggYGNhbGxiYWNrYFxuICAgKiBpcyBleGVjdXRlZC5cbiAgICovXG5cblxuICBmdW5jdGlvbiB3cmFwcGVyKCkge1xuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmd1bWVudHNfID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJndW1lbnRzX1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIGVsYXBzZWQgPSBEYXRlLm5vdygpIC0gbGFzdEV4ZWM7XG5cbiAgICBpZiAoY2FuY2VsbGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBFeGVjdXRlIGBjYWxsYmFja2AgYW5kIHVwZGF0ZSB0aGUgYGxhc3RFeGVjYCB0aW1lc3RhbXAuXG5cblxuICAgIGZ1bmN0aW9uIGV4ZWMoKSB7XG4gICAgICBsYXN0RXhlYyA9IERhdGUubm93KCk7XG4gICAgICBjYWxsYmFjay5hcHBseShzZWxmLCBhcmd1bWVudHNfKTtcbiAgICB9XG4gICAgLypcbiAgICAgKiBJZiBgZGVib3VuY2VNb2RlYCBpcyB0cnVlIChhdCBiZWdpbikgdGhpcyBpcyB1c2VkIHRvIGNsZWFyIHRoZSBmbGFnXG4gICAgICogdG8gYWxsb3cgZnV0dXJlIGBjYWxsYmFja2AgZXhlY3V0aW9ucy5cbiAgICAgKi9cblxuXG4gICAgZnVuY3Rpb24gY2xlYXIoKSB7XG4gICAgICB0aW1lb3V0SUQgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKCFub0xlYWRpbmcgJiYgZGVib3VuY2VNb2RlICYmICF0aW1lb3V0SUQpIHtcbiAgICAgIC8qXG4gICAgICAgKiBTaW5jZSBgd3JhcHBlcmAgaXMgYmVpbmcgY2FsbGVkIGZvciB0aGUgZmlyc3QgdGltZSBhbmRcbiAgICAgICAqIGBkZWJvdW5jZU1vZGVgIGlzIHRydWUgKGF0IGJlZ2luKSwgZXhlY3V0ZSBgY2FsbGJhY2tgXG4gICAgICAgKiBhbmQgbm9MZWFkaW5nICE9IHRydWUuXG4gICAgICAgKi9cbiAgICAgIGV4ZWMoKTtcbiAgICB9XG5cbiAgICBjbGVhckV4aXN0aW5nVGltZW91dCgpO1xuXG4gICAgaWYgKGRlYm91bmNlTW9kZSA9PT0gdW5kZWZpbmVkICYmIGVsYXBzZWQgPiBkZWxheSkge1xuICAgICAgaWYgKG5vTGVhZGluZykge1xuICAgICAgICAvKlxuICAgICAgICAgKiBJbiB0aHJvdHRsZSBtb2RlIHdpdGggbm9MZWFkaW5nLCBpZiBgZGVsYXlgIHRpbWUgaGFzXG4gICAgICAgICAqIGJlZW4gZXhjZWVkZWQsIHVwZGF0ZSBgbGFzdEV4ZWNgIGFuZCBzY2hlZHVsZSBgY2FsbGJhY2tgXG4gICAgICAgICAqIHRvIGV4ZWN1dGUgYWZ0ZXIgYGRlbGF5YCBtcy5cbiAgICAgICAgICovXG4gICAgICAgIGxhc3RFeGVjID0gRGF0ZS5ub3coKTtcblxuICAgICAgICBpZiAoIW5vVHJhaWxpbmcpIHtcbiAgICAgICAgICB0aW1lb3V0SUQgPSBzZXRUaW1lb3V0KGRlYm91bmNlTW9kZSA/IGNsZWFyIDogZXhlYywgZGVsYXkpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvKlxuICAgICAgICAgKiBJbiB0aHJvdHRsZSBtb2RlIHdpdGhvdXQgbm9MZWFkaW5nLCBpZiBgZGVsYXlgIHRpbWUgaGFzIGJlZW4gZXhjZWVkZWQsIGV4ZWN1dGVcbiAgICAgICAgICogYGNhbGxiYWNrYC5cbiAgICAgICAgICovXG4gICAgICAgIGV4ZWMoKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG5vVHJhaWxpbmcgIT09IHRydWUpIHtcbiAgICAgIC8qXG4gICAgICAgKiBJbiB0cmFpbGluZyB0aHJvdHRsZSBtb2RlLCBzaW5jZSBgZGVsYXlgIHRpbWUgaGFzIG5vdCBiZWVuXG4gICAgICAgKiBleGNlZWRlZCwgc2NoZWR1bGUgYGNhbGxiYWNrYCB0byBleGVjdXRlIGBkZWxheWAgbXMgYWZ0ZXIgbW9zdFxuICAgICAgICogcmVjZW50IGV4ZWN1dGlvbi5cbiAgICAgICAqXG4gICAgICAgKiBJZiBgZGVib3VuY2VNb2RlYCBpcyB0cnVlIChhdCBiZWdpbiksIHNjaGVkdWxlIGBjbGVhcmAgdG8gZXhlY3V0ZVxuICAgICAgICogYWZ0ZXIgYGRlbGF5YCBtcy5cbiAgICAgICAqXG4gICAgICAgKiBJZiBgZGVib3VuY2VNb2RlYCBpcyBmYWxzZSAoYXQgZW5kKSwgc2NoZWR1bGUgYGNhbGxiYWNrYCB0b1xuICAgICAgICogZXhlY3V0ZSBhZnRlciBgZGVsYXlgIG1zLlxuICAgICAgICovXG4gICAgICB0aW1lb3V0SUQgPSBzZXRUaW1lb3V0KGRlYm91bmNlTW9kZSA/IGNsZWFyIDogZXhlYywgZGVib3VuY2VNb2RlID09PSB1bmRlZmluZWQgPyBkZWxheSAtIGVsYXBzZWQgOiBkZWxheSk7XG4gICAgfVxuICB9XG5cbiAgd3JhcHBlci5jYW5jZWwgPSBjYW5jZWw7IC8vIFJldHVybiB0aGUgd3JhcHBlciBmdW5jdGlvbi5cblxuICByZXR1cm4gd3JhcHBlcjtcbn1cblxuLyogZXNsaW50LWRpc2FibGUgbm8tdW5kZWZpbmVkICovXG4vKipcbiAqIERlYm91bmNlIGV4ZWN1dGlvbiBvZiBhIGZ1bmN0aW9uLiBEZWJvdW5jaW5nLCB1bmxpa2UgdGhyb3R0bGluZyxcbiAqIGd1YXJhbnRlZXMgdGhhdCBhIGZ1bmN0aW9uIGlzIG9ubHkgZXhlY3V0ZWQgYSBzaW5nbGUgdGltZSwgZWl0aGVyIGF0IHRoZVxuICogdmVyeSBiZWdpbm5pbmcgb2YgYSBzZXJpZXMgb2YgY2FsbHMsIG9yIGF0IHRoZSB2ZXJ5IGVuZC5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gZGVsYXkgLSAgICAgICAgICAgICAgIEEgemVyby1vci1ncmVhdGVyIGRlbGF5IGluIG1pbGxpc2Vjb25kcy4gRm9yIGV2ZW50IGNhbGxiYWNrcywgdmFsdWVzIGFyb3VuZCAxMDAgb3IgMjUwIChvciBldmVuIGhpZ2hlcikgYXJlIG1vc3QgdXNlZnVsLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgLSAgICAgICAgICBBIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIGFmdGVyIGRlbGF5IG1pbGxpc2Vjb25kcy4gVGhlIGB0aGlzYCBjb250ZXh0IGFuZCBhbGwgYXJndW1lbnRzIGFyZSBwYXNzZWQgdGhyb3VnaCwgYXMtaXMsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBgY2FsbGJhY2tgIHdoZW4gdGhlIGRlYm91bmNlZC1mdW5jdGlvbiBpcyBleGVjdXRlZC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc10gLSAgICAgICAgICAgQW4gb2JqZWN0IHRvIGNvbmZpZ3VyZSBvcHRpb25zLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5hdEJlZ2luXSAtICBPcHRpb25hbCwgZGVmYXVsdHMgdG8gZmFsc2UuIElmIGF0QmVnaW4gaXMgZmFsc2Ugb3IgdW5zcGVjaWZpZWQsIGNhbGxiYWNrIHdpbGwgb25seSBiZSBleGVjdXRlZCBgZGVsYXlgIG1pbGxpc2Vjb25kc1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXIgdGhlIGxhc3QgZGVib3VuY2VkLWZ1bmN0aW9uIGNhbGwuIElmIGF0QmVnaW4gaXMgdHJ1ZSwgY2FsbGJhY2sgd2lsbCBiZSBleGVjdXRlZCBvbmx5IGF0IHRoZSBmaXJzdCBkZWJvdW5jZWQtZnVuY3Rpb24gY2FsbC5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBZnRlciB0aGUgdGhyb3R0bGVkLWZ1bmN0aW9uIGhhcyBub3QgYmVlbiBjYWxsZWQgZm9yIGBkZWxheWAgbWlsbGlzZWNvbmRzLCB0aGUgaW50ZXJuYWwgY291bnRlciBpcyByZXNldCkuXG4gKlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBBIG5ldywgZGVib3VuY2VkIGZ1bmN0aW9uLlxuICovXG5cbmZ1bmN0aW9uIGRlYm91bmNlJDEgKGRlbGF5LCBjYWxsYmFjaywgb3B0aW9ucykge1xuICB2YXIgX3JlZiA9IG9wdGlvbnMgfHwge30sXG4gICAgICBfcmVmJGF0QmVnaW4gPSBfcmVmLmF0QmVnaW4sXG4gICAgICBhdEJlZ2luID0gX3JlZiRhdEJlZ2luID09PSB2b2lkIDAgPyBmYWxzZSA6IF9yZWYkYXRCZWdpbjtcblxuICByZXR1cm4gdGhyb3R0bGUkMShkZWxheSwgY2FsbGJhY2ssIHtcbiAgICBkZWJvdW5jZU1vZGU6IGF0QmVnaW4gIT09IGZhbHNlXG4gIH0pO1xufVxuXG5mdW5jdGlvbiB0aHJvdHRsZSguLi5hcmdzKSB7XG4gIHJldHVybiB0aHJvdHRsZSQxKC4uLmFyZ3MpO1xufVxuZnVuY3Rpb24gZGVib3VuY2UoLi4uYXJncykge1xuICByZXR1cm4gZGVib3VuY2UkMSguLi5hcmdzKTtcbn1cblxuZXhwb3J0IHsgYXNzZXJ0LCBhdCwgYmF0Y2hJbnZva2UsIGNhcGl0YWxpemUsIGNsYW1wLCBjbGFtcEFycmF5UmFuZ2UsIGNsZWFyVW5kZWZpbmVkLCBjcmVhdGVDb250cm9sbGVkUHJvbWlzZSwgY3JlYXRlUHJvbWlzZUxvY2ssIGNyZWF0ZVNpbmdsZXRvblByb21pc2UsIGRlYm91bmNlLCBkZWVwTWVyZ2UsIGRlZXBNZXJnZVdpdGhBcnJheSwgZW5zdXJlUHJlZml4LCBlbnN1cmVTdWZmaXgsIGZpbHRlckluUGxhY2UsIGZsYXR0ZW5BcnJheWFibGUsIGdldFR5cGVOYW1lLCBoYXNPd25Qcm9wZXJ0eSwgaW52b2tlLCBpc0Jvb2xlYW4sIGlzQnJvd3NlciwgaXNEYXRlLCBpc0RlZXBFcXVhbCwgaXNEZWYsIGlzRnVuY3Rpb24sIGlzS2V5T2YsIGlzTnVsbCwgaXNOdW1iZXIsIGlzT2JqZWN0LCBpc1ByaW1pdGl2ZSwgaXNSZWdFeHAsIGlzU3RyaW5nLCBpc1RydXRoeSwgaXNVbmRlZmluZWQsIGlzV2luZG93LCBsYXN0LCBsZXJwLCBtZXJnZUFycmF5YWJsZSwgbW92ZSwgbm9OdWxsLCBub29wLCBub3ROdWxsaXNoLCBub3RVbmRlZmluZWQsIG9iamVjdEVudHJpZXMsIG9iamVjdElkLCBvYmplY3RLZXlzLCBvYmplY3RNYXAsIG9iamVjdE9taXQsIG9iamVjdFBpY2ssIHAsIHBhcnRpdGlvbiwgcmFuZG9tU3RyLCByYW5nZSwgcmVtYXAsIHJlbW92ZSwgc2FtcGxlLCBzaHVmZmxlLCBzbGFzaCwgc2xlZXAsIHN1bSwgdGFwLCB0ZW1wbGF0ZSwgdGhyb3R0bGUsIHRpbWVzdGFtcCwgdG9BcnJheSwgdG9TdHJpbmcsIHVuaW5kZW50LCB1bmlxLCB1bmlxdWVCeSB9O1xuIiwiaW1wb3J0IHsgaXNOdW1iZXIsIHJhbmdlLCB1bmlxIH0gZnJvbSBcIkBhbnRmdS91dGlsc1wiO1xuLy8jcmVnaW9uIHNyYy90aW1lc3BsaXQvdGltZXN0cmluZy50c1xuLyoqXG4qIFBhcnNlIHRpbWVzdGFtcCBpbnRvIHNlY29uZHNcbipcbiogQWNjZXB0czpcbiogLSAxMDo1MC4xXG4qIC0gMTBzXG4qIC0gNW1cbiogLSAzbWluXG4qIC0gM21pbnMgNXNlY3NcbiogLSAxMC41bTNzXG4qIC0gKzEwc1xuKiAtIDFoMTBtMzBzXG4qIC0gMWg0c1xuKiAtIDE6MToxXG4qL1xuY29uc3QgUkVfQUxQSEEgPSAvW2Etel0vaTtcbmZ1bmN0aW9uIHBhcnNlVGltZVN0cmluZyh0aW1lc3RhbXApIHtcblx0aWYgKHR5cGVvZiB0aW1lc3RhbXAgPT09IFwibnVtYmVyXCIpIHJldHVybiB7XG5cdFx0c2Vjb25kczogdGltZXN0YW1wLFxuXHRcdHJlbGF0aXZlOiBmYWxzZVxuXHR9O1xuXHRjb25zdCByZWxhdGl2ZSA9IHRpbWVzdGFtcC5zdGFydHNXaXRoKFwiK1wiKTtcblx0aWYgKHJlbGF0aXZlKSB0aW1lc3RhbXAgPSB0aW1lc3RhbXAuc2xpY2UoMSk7XG5cdGxldCBzZWNvbmRzID0gMDtcblx0aWYgKHRpbWVzdGFtcC5pbmNsdWRlcyhcIjpcIikpIHtcblx0XHRjb25zdCBwYXJ0cyA9IHRpbWVzdGFtcC5zcGxpdChcIjpcIikubWFwKE51bWJlcik7XG5cdFx0bGV0IGggPSAwO1xuXHRcdGxldCBtID0gMDtcblx0XHRsZXQgcyA9IDA7XG5cdFx0aWYgKHBhcnRzLmxlbmd0aCA9PT0gMykge1xuXHRcdFx0aCA9IHBhcnRzWzBdO1xuXHRcdFx0bSA9IHBhcnRzWzFdO1xuXHRcdFx0cyA9IHBhcnRzWzJdO1xuXHRcdH0gZWxzZSBpZiAocGFydHMubGVuZ3RoID09PSAyKSB7XG5cdFx0XHRtID0gcGFydHNbMF07XG5cdFx0XHRzID0gcGFydHNbMV07XG5cdFx0fSBlbHNlIGlmIChwYXJ0cy5sZW5ndGggPT09IDEpIHMgPSBwYXJ0c1swXTtcblx0XHRlbHNlIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIHRpbWVzdGFtcCBmb3JtYXRcIik7XG5cdFx0aWYgKE51bWJlci5pc05hTihoKSB8fCBOdW1iZXIuaXNOYU4obSkgfHwgTnVtYmVyLmlzTmFOKHMpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCB0aW1lc3RhbXAgZm9ybWF0XCIpO1xuXHRcdHNlY29uZHMgPSAoaCB8fCAwKSAqIDM2MDAgKyAobSB8fCAwKSAqIDYwICsgKHMgfHwgMCk7XG5cdH0gZWxzZSBpZiAoIVJFX0FMUEhBLnRlc3QodGltZXN0YW1wKSkge1xuXHRcdHNlY29uZHMgPSBOdW1iZXIodGltZXN0YW1wKTtcblx0XHRpZiAoTnVtYmVyLmlzTmFOKHNlY29uZHMpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCB0aW1lc3RhbXAgZm9ybWF0XCIpO1xuXHR9IGVsc2Uge1xuXHRcdGNvbnN0IHVuaXRNYXAgPSB7XG5cdFx0XHRzOiAxLFxuXHRcdFx0c2VjOiAxLFxuXHRcdFx0c2VjczogMSxcblx0XHRcdG06IDYwLFxuXHRcdFx0bWluOiA2MCxcblx0XHRcdG1pbnM6IDYwLFxuXHRcdFx0aDogMzYwMCxcblx0XHRcdGhyOiAzNjAwLFxuXHRcdFx0aHJzOiAzNjAwLFxuXHRcdFx0aG91cjogMzYwMCxcblx0XHRcdGhvdXJzOiAzNjAwLFxuXHRcdFx0ZGF5OiA4NjQwMCxcblx0XHRcdGRheXM6IDg2NDAwLFxuXHRcdFx0d2VlazogNjA0ODAwLFxuXHRcdFx0d2Vla3M6IDYwNDgwMCxcblx0XHRcdG1vbnRoOiAyNjI5NzQ2LFxuXHRcdFx0bW9udGhzOiAyNjI5NzQ2LFxuXHRcdFx0eWVhcjogMzE1NTY5NTIsXG5cdFx0XHR5ZWFyczogMzE1NTY5NTJcblx0XHR9O1xuXHRcdGNvbnN0IHJlZ2V4ID0gLyhbXFxkLl0rKShbYS16XSspL2dpO1xuXHRcdGNvbnN0IG1hdGNoZXMgPSB0aW1lc3RhbXAubWF0Y2hBbGwocmVnZXgpO1xuXHRcdGlmIChtYXRjaGVzKSBmb3IgKGNvbnN0IG1hdGNoIG9mIG1hdGNoZXMpIHtcblx0XHRcdGNvbnN0IHZhbHVlID0gTnVtYmVyKG1hdGNoWzFdKTtcblx0XHRcdGlmIChOdW1iZXIuaXNOYU4odmFsdWUpKSB0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIHRpbWVzdGFtcCB2YWx1ZTogJHttYXRjaFsxXX1gKTtcblx0XHRcdGNvbnN0IHVuaXQgPSBtYXRjaFsyXS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0aWYgKCEodW5pdCBpbiB1bml0TWFwKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCB0aW1lc3RhbXAgdW5pdDogJHt1bml0fWApO1xuXHRcdFx0c2Vjb25kcyArPSB2YWx1ZSAqIHVuaXRNYXBbdW5pdF07XG5cdFx0fVxuXHRcdGNvbnN0IHJlbWFpbmluZyA9IHRpbWVzdGFtcC5yZXBsYWNlKHJlZ2V4LCBcIlwiKS50cmltKCk7XG5cdFx0aWYgKHJlbWFpbmluZykgdGhyb3cgbmV3IFR5cGVFcnJvcihgVW5rbm93biB0aW1lc3RhbXAgcmVtYWluaW5nOiAke3JlbWFpbmluZ31gKTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdHNlY29uZHMsXG5cdFx0cmVsYXRpdmVcblx0fTtcbn1cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNyYy90aW1lc3BsaXQvdGltZXNwbGl0LnRzXG5mdW5jdGlvbiBwYXJzZVRpbWVzcGxpdHMoaW5wdXRzKSB7XG5cdGxldCB0cyA9IDA7XG5cdGNvbnN0IG91dHB1dHMgPSBbXTtcblx0bGV0IGN1cnJlbnQgPSB7XG5cdFx0dGltZXN0YW1wU3RhcnQ6IHRzLFxuXHRcdHRpbWVzdGFtcEVuZDogdHMsXG5cdFx0bm9TdGFydDogMCxcblx0XHRub0VuZDogMCxcblx0XHR0aXRsZTogXCJbc3RhcnRdXCJcblx0fTtcblx0b3V0cHV0cy5wdXNoKGN1cnJlbnQpO1xuXHRmb3IgKGNvbnN0IGlucHV0IG9mIGlucHV0cykge1xuXHRcdGNvbnN0IHRpbWUgPSBwYXJzZVRpbWVTdHJpbmcoaW5wdXQudGltZXNwbGl0KTtcblx0XHRjb25zdCBlbmQgPSB0aW1lLnJlbGF0aXZlID8gdHMgKyB0aW1lLnNlY29uZHMgOiB0aW1lLnNlY29uZHM7XG5cdFx0aWYgKGVuZCA8IHRzKSB0aHJvdyBuZXcgRXJyb3IoYFRpbWVzcGxpdCBlbmQgJHtlbmR9IGlzIGJlZm9yZSBzdGFydCAke3RzfWApO1xuXHRcdGN1cnJlbnQudGltZXN0YW1wRW5kID0gZW5kO1xuXHRcdGN1cnJlbnQubm9FbmQgPSBpbnB1dC5ubztcblx0XHRpZiAoaW5wdXQudGl0bGUpIGN1cnJlbnQudGl0bGUgPSBpbnB1dC50aXRsZTtcblx0XHR0cyA9IGVuZDtcblx0XHRjdXJyZW50ID0ge1xuXHRcdFx0dGltZXN0YW1wU3RhcnQ6IGVuZCxcblx0XHRcdHRpbWVzdGFtcEVuZDogZW5kLFxuXHRcdFx0bm9TdGFydDogaW5wdXQubm8sXG5cdFx0XHRub0VuZDogaW5wdXQubm9cblx0XHR9O1xuXHRcdG91dHB1dHMucHVzaChjdXJyZW50KTtcblx0fVxuXHRyZXR1cm4gb3V0cHV0cztcbn1cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNyYy91dGlscy50c1xuY29uc3QgUkVfQVNQRUNUX1JBVElPX1NFUEFSQVRPUiA9IC9bOi94fF0vO1xuLyoqXG4qIDEsMy01LDggPT4gWzEsIDMsIDQsIDUsIDhdXG4qL1xuZnVuY3Rpb24gcGFyc2VSYW5nZVN0cmluZyh0b3RhbCwgcmFuZ2VTdHIpIHtcblx0aWYgKCFyYW5nZVN0ciB8fCByYW5nZVN0ciA9PT0gXCJhbGxcIiB8fCByYW5nZVN0ciA9PT0gXCIqXCIpIHJldHVybiByYW5nZSgxLCB0b3RhbCArIDEpO1xuXHRpZiAocmFuZ2VTdHIgPT09IFwibm9uZVwiKSByZXR1cm4gW107XG5cdGNvbnN0IGluZGV4ZXMgPSBbXTtcblx0Zm9yIChjb25zdCBwYXJ0IG9mIHJhbmdlU3RyLnNwbGl0KC9bLDtdL2cpKSBpZiAoIXBhcnQuaW5jbHVkZXMoXCItXCIpKSBpbmRleGVzLnB1c2goK3BhcnQpO1xuXHRlbHNlIHtcblx0XHRjb25zdCBbc3RhcnQsIGVuZF0gPSBwYXJ0LnNwbGl0KFwiLVwiLCAyKTtcblx0XHRpbmRleGVzLnB1c2goLi4ucmFuZ2UoK3N0YXJ0LCAhZW5kID8gdG90YWwgKyAxIDogK2VuZCArIDEpKTtcblx0fVxuXHRyZXR1cm4gdW5pcShpbmRleGVzKS5maWx0ZXIoKGkpID0+IGkgPD0gdG90YWwpLnNvcnQoKGEsIGIpID0+IGEgLSBiKTtcbn1cbi8qKlxuKiBBY2NlcHRzIGAxNi85YCBgMToxYCBgM3g0YFxuKi9cbmZ1bmN0aW9uIHBhcnNlQXNwZWN0UmF0aW8oc3RyKSB7XG5cdGlmIChpc051bWJlcihzdHIpKSByZXR1cm4gc3RyO1xuXHRpZiAoIU51bWJlci5pc05hTigrc3RyKSkgcmV0dXJuICtzdHI7XG5cdGNvbnN0IFt3U3RyID0gXCJcIiwgaFN0ciA9IFwiXCJdID0gc3RyLnNwbGl0KFJFX0FTUEVDVF9SQVRJT19TRVBBUkFUT1IpO1xuXHRjb25zdCB3ID0gTnVtYmVyLnBhcnNlRmxvYXQod1N0ci50cmltKCkpO1xuXHRjb25zdCBoID0gTnVtYmVyLnBhcnNlRmxvYXQoaFN0ci50cmltKCkpO1xuXHRpZiAoTnVtYmVyLmlzTmFOKHcpIHx8IE51bWJlci5pc05hTihoKSB8fCBoID09PSAwKSB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgYXNwZWN0IHJhdGlvIFwiJHtzdHJ9XCJgKTtcblx0cmV0dXJuIHcgLyBoO1xufVxuLy8jZW5kcmVnaW9uXG5leHBvcnQgeyBwYXJzZUFzcGVjdFJhdGlvLCBwYXJzZVJhbmdlU3RyaW5nLCBwYXJzZVRpbWVTdHJpbmcsIHBhcnNlVGltZXNwbGl0cyB9O1xuIiwiY29uc3QgQUxJQVMgPSBTeW1ib2wuZm9yKCd5YW1sLmFsaWFzJyk7XG5jb25zdCBET0MgPSBTeW1ib2wuZm9yKCd5YW1sLmRvY3VtZW50Jyk7XG5jb25zdCBNQVAgPSBTeW1ib2wuZm9yKCd5YW1sLm1hcCcpO1xuY29uc3QgUEFJUiA9IFN5bWJvbC5mb3IoJ3lhbWwucGFpcicpO1xuY29uc3QgU0NBTEFSID0gU3ltYm9sLmZvcigneWFtbC5zY2FsYXInKTtcbmNvbnN0IFNFUSA9IFN5bWJvbC5mb3IoJ3lhbWwuc2VxJyk7XG5jb25zdCBOT0RFX1RZUEUgPSBTeW1ib2wuZm9yKCd5YW1sLm5vZGUudHlwZScpO1xuY29uc3QgaXNBbGlhcyA9IChub2RlKSA9PiAhIW5vZGUgJiYgdHlwZW9mIG5vZGUgPT09ICdvYmplY3QnICYmIG5vZGVbTk9ERV9UWVBFXSA9PT0gQUxJQVM7XG5jb25zdCBpc0RvY3VtZW50ID0gKG5vZGUpID0+ICEhbm9kZSAmJiB0eXBlb2Ygbm9kZSA9PT0gJ29iamVjdCcgJiYgbm9kZVtOT0RFX1RZUEVdID09PSBET0M7XG5jb25zdCBpc01hcCA9IChub2RlKSA9PiAhIW5vZGUgJiYgdHlwZW9mIG5vZGUgPT09ICdvYmplY3QnICYmIG5vZGVbTk9ERV9UWVBFXSA9PT0gTUFQO1xuY29uc3QgaXNQYWlyID0gKG5vZGUpID0+ICEhbm9kZSAmJiB0eXBlb2Ygbm9kZSA9PT0gJ29iamVjdCcgJiYgbm9kZVtOT0RFX1RZUEVdID09PSBQQUlSO1xuY29uc3QgaXNTY2FsYXIgPSAobm9kZSkgPT4gISFub2RlICYmIHR5cGVvZiBub2RlID09PSAnb2JqZWN0JyAmJiBub2RlW05PREVfVFlQRV0gPT09IFNDQUxBUjtcbmNvbnN0IGlzU2VxID0gKG5vZGUpID0+ICEhbm9kZSAmJiB0eXBlb2Ygbm9kZSA9PT0gJ29iamVjdCcgJiYgbm9kZVtOT0RFX1RZUEVdID09PSBTRVE7XG5mdW5jdGlvbiBpc0NvbGxlY3Rpb24obm9kZSkge1xuICAgIGlmIChub2RlICYmIHR5cGVvZiBub2RlID09PSAnb2JqZWN0JylcbiAgICAgICAgc3dpdGNoIChub2RlW05PREVfVFlQRV0pIHtcbiAgICAgICAgICAgIGNhc2UgTUFQOlxuICAgICAgICAgICAgY2FzZSBTRVE6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBpc05vZGUobm9kZSkge1xuICAgIGlmIChub2RlICYmIHR5cGVvZiBub2RlID09PSAnb2JqZWN0JylcbiAgICAgICAgc3dpdGNoIChub2RlW05PREVfVFlQRV0pIHtcbiAgICAgICAgICAgIGNhc2UgQUxJQVM6XG4gICAgICAgICAgICBjYXNlIE1BUDpcbiAgICAgICAgICAgIGNhc2UgU0NBTEFSOlxuICAgICAgICAgICAgY2FzZSBTRVE6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5jb25zdCBoYXNBbmNob3IgPSAobm9kZSkgPT4gKGlzU2NhbGFyKG5vZGUpIHx8IGlzQ29sbGVjdGlvbihub2RlKSkgJiYgISFub2RlLmFuY2hvcjtcblxuZXhwb3J0IHsgQUxJQVMsIERPQywgTUFQLCBOT0RFX1RZUEUsIFBBSVIsIFNDQUxBUiwgU0VRLCBoYXNBbmNob3IsIGlzQWxpYXMsIGlzQ29sbGVjdGlvbiwgaXNEb2N1bWVudCwgaXNNYXAsIGlzTm9kZSwgaXNQYWlyLCBpc1NjYWxhciwgaXNTZXEgfTtcbiIsImltcG9ydCB7IGlzRG9jdW1lbnQsIGlzTm9kZSwgaXNQYWlyLCBpc0NvbGxlY3Rpb24sIGlzTWFwLCBpc1NlcSwgaXNTY2FsYXIsIGlzQWxpYXMgfSBmcm9tICcuL25vZGVzL2lkZW50aXR5LmpzJztcblxuY29uc3QgQlJFQUsgPSBTeW1ib2woJ2JyZWFrIHZpc2l0Jyk7XG5jb25zdCBTS0lQID0gU3ltYm9sKCdza2lwIGNoaWxkcmVuJyk7XG5jb25zdCBSRU1PVkUgPSBTeW1ib2woJ3JlbW92ZSBub2RlJyk7XG4vKipcbiAqIEFwcGx5IGEgdmlzaXRvciB0byBhbiBBU1Qgbm9kZSBvciBkb2N1bWVudC5cbiAqXG4gKiBXYWxrcyB0aHJvdWdoIHRoZSB0cmVlIChkZXB0aC1maXJzdCkgc3RhcnRpbmcgZnJvbSBgbm9kZWAsIGNhbGxpbmcgYVxuICogYHZpc2l0b3JgIGZ1bmN0aW9uIHdpdGggdGhyZWUgYXJndW1lbnRzOlxuICogICAtIGBrZXlgOiBGb3Igc2VxdWVuY2UgdmFsdWVzIGFuZCBtYXAgYFBhaXJgLCB0aGUgbm9kZSdzIGluZGV4IGluIHRoZVxuICogICAgIGNvbGxlY3Rpb24uIFdpdGhpbiBhIGBQYWlyYCwgYCdrZXknYCBvciBgJ3ZhbHVlJ2AsIGNvcnJlc3BvbmRpbmdseS5cbiAqICAgICBgbnVsbGAgZm9yIHRoZSByb290IG5vZGUuXG4gKiAgIC0gYG5vZGVgOiBUaGUgY3VycmVudCBub2RlLlxuICogICAtIGBwYXRoYDogVGhlIGFuY2VzdHJ5IG9mIHRoZSBjdXJyZW50IG5vZGUuXG4gKlxuICogVGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgdmlzaXRvciBtYXkgYmUgdXNlZCB0byBjb250cm9sIHRoZSB0cmF2ZXJzYWw6XG4gKiAgIC0gYHVuZGVmaW5lZGAgKGRlZmF1bHQpOiBEbyBub3RoaW5nIGFuZCBjb250aW51ZVxuICogICAtIGB2aXNpdC5TS0lQYDogRG8gbm90IHZpc2l0IHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUsIGNvbnRpbnVlIHdpdGggbmV4dFxuICogICAgIHNpYmxpbmdcbiAqICAgLSBgdmlzaXQuQlJFQUtgOiBUZXJtaW5hdGUgdHJhdmVyc2FsIGNvbXBsZXRlbHlcbiAqICAgLSBgdmlzaXQuUkVNT1ZFYDogUmVtb3ZlIHRoZSBjdXJyZW50IG5vZGUsIHRoZW4gY29udGludWUgd2l0aCB0aGUgbmV4dCBvbmVcbiAqICAgLSBgTm9kZWA6IFJlcGxhY2UgdGhlIGN1cnJlbnQgbm9kZSwgdGhlbiBjb250aW51ZSBieSB2aXNpdGluZyBpdFxuICogICAtIGBudW1iZXJgOiBXaGlsZSBpdGVyYXRpbmcgdGhlIGl0ZW1zIG9mIGEgc2VxdWVuY2Ugb3IgbWFwLCBzZXQgdGhlIGluZGV4XG4gKiAgICAgb2YgdGhlIG5leHQgc3RlcC4gVGhpcyBpcyB1c2VmdWwgZXNwZWNpYWxseSBpZiB0aGUgaW5kZXggb2YgdGhlIGN1cnJlbnRcbiAqICAgICBub2RlIGhhcyBjaGFuZ2VkLlxuICpcbiAqIElmIGB2aXNpdG9yYCBpcyBhIHNpbmdsZSBmdW5jdGlvbiwgaXQgd2lsbCBiZSBjYWxsZWQgd2l0aCBhbGwgdmFsdWVzXG4gKiBlbmNvdW50ZXJlZCBpbiB0aGUgdHJlZSwgaW5jbHVkaW5nIGUuZy4gYG51bGxgIHZhbHVlcy4gQWx0ZXJuYXRpdmVseSxcbiAqIHNlcGFyYXRlIHZpc2l0b3IgZnVuY3Rpb25zIG1heSBiZSBkZWZpbmVkIGZvciBlYWNoIGBNYXBgLCBgUGFpcmAsIGBTZXFgLFxuICogYEFsaWFzYCBhbmQgYFNjYWxhcmAgbm9kZS4gVG8gZGVmaW5lIHRoZSBzYW1lIHZpc2l0b3IgZnVuY3Rpb24gZm9yIG1vcmUgdGhhblxuICogb25lIG5vZGUgdHlwZSwgdXNlIHRoZSBgQ29sbGVjdGlvbmAgKG1hcCBhbmQgc2VxKSwgYFZhbHVlYCAobWFwLCBzZXEgJiBzY2FsYXIpXG4gKiBhbmQgYE5vZGVgIChhbGlhcywgbWFwLCBzZXEgJiBzY2FsYXIpIHRhcmdldHMuIE9mIGFsbCB0aGVzZSwgb25seSB0aGUgbW9zdFxuICogc3BlY2lmaWMgZGVmaW5lZCBvbmUgd2lsbCBiZSB1c2VkIGZvciBlYWNoIG5vZGUuXG4gKi9cbmZ1bmN0aW9uIHZpc2l0KG5vZGUsIHZpc2l0b3IpIHtcbiAgICBjb25zdCB2aXNpdG9yXyA9IGluaXRWaXNpdG9yKHZpc2l0b3IpO1xuICAgIGlmIChpc0RvY3VtZW50KG5vZGUpKSB7XG4gICAgICAgIGNvbnN0IGNkID0gdmlzaXRfKG51bGwsIG5vZGUuY29udGVudHMsIHZpc2l0b3JfLCBPYmplY3QuZnJlZXplKFtub2RlXSkpO1xuICAgICAgICBpZiAoY2QgPT09IFJFTU9WRSlcbiAgICAgICAgICAgIG5vZGUuY29udGVudHMgPSBudWxsO1xuICAgIH1cbiAgICBlbHNlXG4gICAgICAgIHZpc2l0XyhudWxsLCBub2RlLCB2aXNpdG9yXywgT2JqZWN0LmZyZWV6ZShbXSkpO1xufVxuLy8gV2l0aG91dCB0aGUgYGFzIHN5bWJvbGAgY2FzdHMsIFRTIGRlY2xhcmVzIHRoZXNlIGluIHRoZSBgdmlzaXRgXG4vLyBuYW1lc3BhY2UgdXNpbmcgYHZhcmAsIGJ1dCB0aGVuIGNvbXBsYWlucyBhYm91dCB0aGF0IGJlY2F1c2Vcbi8vIGB1bmlxdWUgc3ltYm9sYCBtdXN0IGJlIGBjb25zdGAuXG4vKiogVGVybWluYXRlIHZpc2l0IHRyYXZlcnNhbCBjb21wbGV0ZWx5ICovXG52aXNpdC5CUkVBSyA9IEJSRUFLO1xuLyoqIERvIG5vdCB2aXNpdCB0aGUgY2hpbGRyZW4gb2YgdGhlIGN1cnJlbnQgbm9kZSAqL1xudmlzaXQuU0tJUCA9IFNLSVA7XG4vKiogUmVtb3ZlIHRoZSBjdXJyZW50IG5vZGUgKi9cbnZpc2l0LlJFTU9WRSA9IFJFTU9WRTtcbmZ1bmN0aW9uIHZpc2l0XyhrZXksIG5vZGUsIHZpc2l0b3IsIHBhdGgpIHtcbiAgICBjb25zdCBjdHJsID0gY2FsbFZpc2l0b3Ioa2V5LCBub2RlLCB2aXNpdG9yLCBwYXRoKTtcbiAgICBpZiAoaXNOb2RlKGN0cmwpIHx8IGlzUGFpcihjdHJsKSkge1xuICAgICAgICByZXBsYWNlTm9kZShrZXksIHBhdGgsIGN0cmwpO1xuICAgICAgICByZXR1cm4gdmlzaXRfKGtleSwgY3RybCwgdmlzaXRvciwgcGF0aCk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgY3RybCAhPT0gJ3N5bWJvbCcpIHtcbiAgICAgICAgaWYgKGlzQ29sbGVjdGlvbihub2RlKSkge1xuICAgICAgICAgICAgcGF0aCA9IE9iamVjdC5mcmVlemUocGF0aC5jb25jYXQobm9kZSkpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLml0ZW1zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2kgPSB2aXNpdF8oaSwgbm9kZS5pdGVtc1tpXSwgdmlzaXRvciwgcGF0aCk7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjaSA9PT0gJ251bWJlcicpXG4gICAgICAgICAgICAgICAgICAgIGkgPSBjaSAtIDE7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoY2kgPT09IEJSRUFLKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gQlJFQUs7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoY2kgPT09IFJFTU9WRSkge1xuICAgICAgICAgICAgICAgICAgICBub2RlLml0ZW1zLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgaSAtPSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc1BhaXIobm9kZSkpIHtcbiAgICAgICAgICAgIHBhdGggPSBPYmplY3QuZnJlZXplKHBhdGguY29uY2F0KG5vZGUpKTtcbiAgICAgICAgICAgIGNvbnN0IGNrID0gdmlzaXRfKCdrZXknLCBub2RlLmtleSwgdmlzaXRvciwgcGF0aCk7XG4gICAgICAgICAgICBpZiAoY2sgPT09IEJSRUFLKVxuICAgICAgICAgICAgICAgIHJldHVybiBCUkVBSztcbiAgICAgICAgICAgIGVsc2UgaWYgKGNrID09PSBSRU1PVkUpXG4gICAgICAgICAgICAgICAgbm9kZS5rZXkgPSBudWxsO1xuICAgICAgICAgICAgY29uc3QgY3YgPSB2aXNpdF8oJ3ZhbHVlJywgbm9kZS52YWx1ZSwgdmlzaXRvciwgcGF0aCk7XG4gICAgICAgICAgICBpZiAoY3YgPT09IEJSRUFLKVxuICAgICAgICAgICAgICAgIHJldHVybiBCUkVBSztcbiAgICAgICAgICAgIGVsc2UgaWYgKGN2ID09PSBSRU1PVkUpXG4gICAgICAgICAgICAgICAgbm9kZS52YWx1ZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGN0cmw7XG59XG4vKipcbiAqIEFwcGx5IGFuIGFzeW5jIHZpc2l0b3IgdG8gYW4gQVNUIG5vZGUgb3IgZG9jdW1lbnQuXG4gKlxuICogV2Fsa3MgdGhyb3VnaCB0aGUgdHJlZSAoZGVwdGgtZmlyc3QpIHN0YXJ0aW5nIGZyb20gYG5vZGVgLCBjYWxsaW5nIGFcbiAqIGB2aXNpdG9yYCBmdW5jdGlvbiB3aXRoIHRocmVlIGFyZ3VtZW50czpcbiAqICAgLSBga2V5YDogRm9yIHNlcXVlbmNlIHZhbHVlcyBhbmQgbWFwIGBQYWlyYCwgdGhlIG5vZGUncyBpbmRleCBpbiB0aGVcbiAqICAgICBjb2xsZWN0aW9uLiBXaXRoaW4gYSBgUGFpcmAsIGAna2V5J2Agb3IgYCd2YWx1ZSdgLCBjb3JyZXNwb25kaW5nbHkuXG4gKiAgICAgYG51bGxgIGZvciB0aGUgcm9vdCBub2RlLlxuICogICAtIGBub2RlYDogVGhlIGN1cnJlbnQgbm9kZS5cbiAqICAgLSBgcGF0aGA6IFRoZSBhbmNlc3RyeSBvZiB0aGUgY3VycmVudCBub2RlLlxuICpcbiAqIFRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIHZpc2l0b3IgbWF5IGJlIHVzZWQgdG8gY29udHJvbCB0aGUgdHJhdmVyc2FsOlxuICogICAtIGBQcm9taXNlYDogTXVzdCByZXNvbHZlIHRvIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlc1xuICogICAtIGB1bmRlZmluZWRgIChkZWZhdWx0KTogRG8gbm90aGluZyBhbmQgY29udGludWVcbiAqICAgLSBgdmlzaXQuU0tJUGA6IERvIG5vdCB2aXNpdCB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlLCBjb250aW51ZSB3aXRoIG5leHRcbiAqICAgICBzaWJsaW5nXG4gKiAgIC0gYHZpc2l0LkJSRUFLYDogVGVybWluYXRlIHRyYXZlcnNhbCBjb21wbGV0ZWx5XG4gKiAgIC0gYHZpc2l0LlJFTU9WRWA6IFJlbW92ZSB0aGUgY3VycmVudCBub2RlLCB0aGVuIGNvbnRpbnVlIHdpdGggdGhlIG5leHQgb25lXG4gKiAgIC0gYE5vZGVgOiBSZXBsYWNlIHRoZSBjdXJyZW50IG5vZGUsIHRoZW4gY29udGludWUgYnkgdmlzaXRpbmcgaXRcbiAqICAgLSBgbnVtYmVyYDogV2hpbGUgaXRlcmF0aW5nIHRoZSBpdGVtcyBvZiBhIHNlcXVlbmNlIG9yIG1hcCwgc2V0IHRoZSBpbmRleFxuICogICAgIG9mIHRoZSBuZXh0IHN0ZXAuIFRoaXMgaXMgdXNlZnVsIGVzcGVjaWFsbHkgaWYgdGhlIGluZGV4IG9mIHRoZSBjdXJyZW50XG4gKiAgICAgbm9kZSBoYXMgY2hhbmdlZC5cbiAqXG4gKiBJZiBgdmlzaXRvcmAgaXMgYSBzaW5nbGUgZnVuY3Rpb24sIGl0IHdpbGwgYmUgY2FsbGVkIHdpdGggYWxsIHZhbHVlc1xuICogZW5jb3VudGVyZWQgaW4gdGhlIHRyZWUsIGluY2x1ZGluZyBlLmcuIGBudWxsYCB2YWx1ZXMuIEFsdGVybmF0aXZlbHksXG4gKiBzZXBhcmF0ZSB2aXNpdG9yIGZ1bmN0aW9ucyBtYXkgYmUgZGVmaW5lZCBmb3IgZWFjaCBgTWFwYCwgYFBhaXJgLCBgU2VxYCxcbiAqIGBBbGlhc2AgYW5kIGBTY2FsYXJgIG5vZGUuIFRvIGRlZmluZSB0aGUgc2FtZSB2aXNpdG9yIGZ1bmN0aW9uIGZvciBtb3JlIHRoYW5cbiAqIG9uZSBub2RlIHR5cGUsIHVzZSB0aGUgYENvbGxlY3Rpb25gIChtYXAgYW5kIHNlcSksIGBWYWx1ZWAgKG1hcCwgc2VxICYgc2NhbGFyKVxuICogYW5kIGBOb2RlYCAoYWxpYXMsIG1hcCwgc2VxICYgc2NhbGFyKSB0YXJnZXRzLiBPZiBhbGwgdGhlc2UsIG9ubHkgdGhlIG1vc3RcbiAqIHNwZWNpZmljIGRlZmluZWQgb25lIHdpbGwgYmUgdXNlZCBmb3IgZWFjaCBub2RlLlxuICovXG5hc3luYyBmdW5jdGlvbiB2aXNpdEFzeW5jKG5vZGUsIHZpc2l0b3IpIHtcbiAgICBjb25zdCB2aXNpdG9yXyA9IGluaXRWaXNpdG9yKHZpc2l0b3IpO1xuICAgIGlmIChpc0RvY3VtZW50KG5vZGUpKSB7XG4gICAgICAgIGNvbnN0IGNkID0gYXdhaXQgdmlzaXRBc3luY18obnVsbCwgbm9kZS5jb250ZW50cywgdmlzaXRvcl8sIE9iamVjdC5mcmVlemUoW25vZGVdKSk7XG4gICAgICAgIGlmIChjZCA9PT0gUkVNT1ZFKVxuICAgICAgICAgICAgbm9kZS5jb250ZW50cyA9IG51bGw7XG4gICAgfVxuICAgIGVsc2VcbiAgICAgICAgYXdhaXQgdmlzaXRBc3luY18obnVsbCwgbm9kZSwgdmlzaXRvcl8sIE9iamVjdC5mcmVlemUoW10pKTtcbn1cbi8vIFdpdGhvdXQgdGhlIGBhcyBzeW1ib2xgIGNhc3RzLCBUUyBkZWNsYXJlcyB0aGVzZSBpbiB0aGUgYHZpc2l0YFxuLy8gbmFtZXNwYWNlIHVzaW5nIGB2YXJgLCBidXQgdGhlbiBjb21wbGFpbnMgYWJvdXQgdGhhdCBiZWNhdXNlXG4vLyBgdW5pcXVlIHN5bWJvbGAgbXVzdCBiZSBgY29uc3RgLlxuLyoqIFRlcm1pbmF0ZSB2aXNpdCB0cmF2ZXJzYWwgY29tcGxldGVseSAqL1xudmlzaXRBc3luYy5CUkVBSyA9IEJSRUFLO1xuLyoqIERvIG5vdCB2aXNpdCB0aGUgY2hpbGRyZW4gb2YgdGhlIGN1cnJlbnQgbm9kZSAqL1xudmlzaXRBc3luYy5TS0lQID0gU0tJUDtcbi8qKiBSZW1vdmUgdGhlIGN1cnJlbnQgbm9kZSAqL1xudmlzaXRBc3luYy5SRU1PVkUgPSBSRU1PVkU7XG5hc3luYyBmdW5jdGlvbiB2aXNpdEFzeW5jXyhrZXksIG5vZGUsIHZpc2l0b3IsIHBhdGgpIHtcbiAgICBjb25zdCBjdHJsID0gYXdhaXQgY2FsbFZpc2l0b3Ioa2V5LCBub2RlLCB2aXNpdG9yLCBwYXRoKTtcbiAgICBpZiAoaXNOb2RlKGN0cmwpIHx8IGlzUGFpcihjdHJsKSkge1xuICAgICAgICByZXBsYWNlTm9kZShrZXksIHBhdGgsIGN0cmwpO1xuICAgICAgICByZXR1cm4gdmlzaXRBc3luY18oa2V5LCBjdHJsLCB2aXNpdG9yLCBwYXRoKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjdHJsICE9PSAnc3ltYm9sJykge1xuICAgICAgICBpZiAoaXNDb2xsZWN0aW9uKG5vZGUpKSB7XG4gICAgICAgICAgICBwYXRoID0gT2JqZWN0LmZyZWV6ZShwYXRoLmNvbmNhdChub2RlKSk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUuaXRlbXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjaSA9IGF3YWl0IHZpc2l0QXN5bmNfKGksIG5vZGUuaXRlbXNbaV0sIHZpc2l0b3IsIHBhdGgpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY2kgPT09ICdudW1iZXInKVxuICAgICAgICAgICAgICAgICAgICBpID0gY2kgLSAxO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNpID09PSBCUkVBSylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJSRUFLO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNpID09PSBSRU1PVkUpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5pdGVtcy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgICAgIGkgLT0gMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNQYWlyKG5vZGUpKSB7XG4gICAgICAgICAgICBwYXRoID0gT2JqZWN0LmZyZWV6ZShwYXRoLmNvbmNhdChub2RlKSk7XG4gICAgICAgICAgICBjb25zdCBjayA9IGF3YWl0IHZpc2l0QXN5bmNfKCdrZXknLCBub2RlLmtleSwgdmlzaXRvciwgcGF0aCk7XG4gICAgICAgICAgICBpZiAoY2sgPT09IEJSRUFLKVxuICAgICAgICAgICAgICAgIHJldHVybiBCUkVBSztcbiAgICAgICAgICAgIGVsc2UgaWYgKGNrID09PSBSRU1PVkUpXG4gICAgICAgICAgICAgICAgbm9kZS5rZXkgPSBudWxsO1xuICAgICAgICAgICAgY29uc3QgY3YgPSBhd2FpdCB2aXNpdEFzeW5jXygndmFsdWUnLCBub2RlLnZhbHVlLCB2aXNpdG9yLCBwYXRoKTtcbiAgICAgICAgICAgIGlmIChjdiA9PT0gQlJFQUspXG4gICAgICAgICAgICAgICAgcmV0dXJuIEJSRUFLO1xuICAgICAgICAgICAgZWxzZSBpZiAoY3YgPT09IFJFTU9WRSlcbiAgICAgICAgICAgICAgICBub2RlLnZhbHVlID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY3RybDtcbn1cbmZ1bmN0aW9uIGluaXRWaXNpdG9yKHZpc2l0b3IpIHtcbiAgICBpZiAodHlwZW9mIHZpc2l0b3IgPT09ICdvYmplY3QnICYmXG4gICAgICAgICh2aXNpdG9yLkNvbGxlY3Rpb24gfHwgdmlzaXRvci5Ob2RlIHx8IHZpc2l0b3IuVmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgIEFsaWFzOiB2aXNpdG9yLk5vZGUsXG4gICAgICAgICAgICBNYXA6IHZpc2l0b3IuTm9kZSxcbiAgICAgICAgICAgIFNjYWxhcjogdmlzaXRvci5Ob2RlLFxuICAgICAgICAgICAgU2VxOiB2aXNpdG9yLk5vZGVcbiAgICAgICAgfSwgdmlzaXRvci5WYWx1ZSAmJiB7XG4gICAgICAgICAgICBNYXA6IHZpc2l0b3IuVmFsdWUsXG4gICAgICAgICAgICBTY2FsYXI6IHZpc2l0b3IuVmFsdWUsXG4gICAgICAgICAgICBTZXE6IHZpc2l0b3IuVmFsdWVcbiAgICAgICAgfSwgdmlzaXRvci5Db2xsZWN0aW9uICYmIHtcbiAgICAgICAgICAgIE1hcDogdmlzaXRvci5Db2xsZWN0aW9uLFxuICAgICAgICAgICAgU2VxOiB2aXNpdG9yLkNvbGxlY3Rpb25cbiAgICAgICAgfSwgdmlzaXRvcik7XG4gICAgfVxuICAgIHJldHVybiB2aXNpdG9yO1xufVxuZnVuY3Rpb24gY2FsbFZpc2l0b3Ioa2V5LCBub2RlLCB2aXNpdG9yLCBwYXRoKSB7XG4gICAgaWYgKHR5cGVvZiB2aXNpdG9yID09PSAnZnVuY3Rpb24nKVxuICAgICAgICByZXR1cm4gdmlzaXRvcihrZXksIG5vZGUsIHBhdGgpO1xuICAgIGlmIChpc01hcChub2RlKSlcbiAgICAgICAgcmV0dXJuIHZpc2l0b3IuTWFwPy4oa2V5LCBub2RlLCBwYXRoKTtcbiAgICBpZiAoaXNTZXEobm9kZSkpXG4gICAgICAgIHJldHVybiB2aXNpdG9yLlNlcT8uKGtleSwgbm9kZSwgcGF0aCk7XG4gICAgaWYgKGlzUGFpcihub2RlKSlcbiAgICAgICAgcmV0dXJuIHZpc2l0b3IuUGFpcj8uKGtleSwgbm9kZSwgcGF0aCk7XG4gICAgaWYgKGlzU2NhbGFyKG5vZGUpKVxuICAgICAgICByZXR1cm4gdmlzaXRvci5TY2FsYXI/LihrZXksIG5vZGUsIHBhdGgpO1xuICAgIGlmIChpc0FsaWFzKG5vZGUpKVxuICAgICAgICByZXR1cm4gdmlzaXRvci5BbGlhcz8uKGtleSwgbm9kZSwgcGF0aCk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbmZ1bmN0aW9uIHJlcGxhY2VOb2RlKGtleSwgcGF0aCwgbm9kZSkge1xuICAgIGNvbnN0IHBhcmVudCA9IHBhdGhbcGF0aC5sZW5ndGggLSAxXTtcbiAgICBpZiAoaXNDb2xsZWN0aW9uKHBhcmVudCkpIHtcbiAgICAgICAgcGFyZW50Lml0ZW1zW2tleV0gPSBub2RlO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc1BhaXIocGFyZW50KSkge1xuICAgICAgICBpZiAoa2V5ID09PSAna2V5JylcbiAgICAgICAgICAgIHBhcmVudC5rZXkgPSBub2RlO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBwYXJlbnQudmFsdWUgPSBub2RlO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc0RvY3VtZW50KHBhcmVudCkpIHtcbiAgICAgICAgcGFyZW50LmNvbnRlbnRzID0gbm9kZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IHB0ID0gaXNBbGlhcyhwYXJlbnQpID8gJ2FsaWFzJyA6ICdzY2FsYXInO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCByZXBsYWNlIG5vZGUgd2l0aCAke3B0fSBwYXJlbnRgKTtcbiAgICB9XG59XG5cbmV4cG9ydCB7IHZpc2l0LCB2aXNpdEFzeW5jIH07XG4iLCJpbXBvcnQgeyBpc05vZGUgfSBmcm9tICcuLi9ub2Rlcy9pZGVudGl0eS5qcyc7XG5pbXBvcnQgeyB2aXNpdCB9IGZyb20gJy4uL3Zpc2l0LmpzJztcblxuY29uc3QgZXNjYXBlQ2hhcnMgPSB7XG4gICAgJyEnOiAnJTIxJyxcbiAgICAnLCc6ICclMkMnLFxuICAgICdbJzogJyU1QicsXG4gICAgJ10nOiAnJTVEJyxcbiAgICAneyc6ICclN0InLFxuICAgICd9JzogJyU3RCdcbn07XG5jb25zdCBlc2NhcGVUYWdOYW1lID0gKHRuKSA9PiB0bi5yZXBsYWNlKC9bISxbXFxde31dL2csIGNoID0+IGVzY2FwZUNoYXJzW2NoXSk7XG5jbGFzcyBEaXJlY3RpdmVzIHtcbiAgICBjb25zdHJ1Y3Rvcih5YW1sLCB0YWdzKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgZGlyZWN0aXZlcy1lbmQvZG9jLXN0YXJ0IG1hcmtlciBgLS0tYC4gSWYgYG51bGxgLCBhIG1hcmtlciBtYXkgc3RpbGwgYmVcbiAgICAgICAgICogaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50J3Mgc3RyaW5naWZpZWQgcmVwcmVzZW50YXRpb24uXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmRvY1N0YXJ0ID0gbnVsbDtcbiAgICAgICAgLyoqIFRoZSBkb2MtZW5kIG1hcmtlciBgLi4uYC4gICovXG4gICAgICAgIHRoaXMuZG9jRW5kID0gZmFsc2U7XG4gICAgICAgIHRoaXMueWFtbCA9IE9iamVjdC5hc3NpZ24oe30sIERpcmVjdGl2ZXMuZGVmYXVsdFlhbWwsIHlhbWwpO1xuICAgICAgICB0aGlzLnRhZ3MgPSBPYmplY3QuYXNzaWduKHt9LCBEaXJlY3RpdmVzLmRlZmF1bHRUYWdzLCB0YWdzKTtcbiAgICB9XG4gICAgY2xvbmUoKSB7XG4gICAgICAgIGNvbnN0IGNvcHkgPSBuZXcgRGlyZWN0aXZlcyh0aGlzLnlhbWwsIHRoaXMudGFncyk7XG4gICAgICAgIGNvcHkuZG9jU3RhcnQgPSB0aGlzLmRvY1N0YXJ0O1xuICAgICAgICByZXR1cm4gY29weTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRHVyaW5nIHBhcnNpbmcsIGdldCBhIERpcmVjdGl2ZXMgaW5zdGFuY2UgZm9yIHRoZSBjdXJyZW50IGRvY3VtZW50IGFuZFxuICAgICAqIHVwZGF0ZSB0aGUgc3RyZWFtIHN0YXRlIGFjY29yZGluZyB0byB0aGUgY3VycmVudCB2ZXJzaW9uJ3Mgc3BlYy5cbiAgICAgKi9cbiAgICBhdERvY3VtZW50KCkge1xuICAgICAgICBjb25zdCByZXMgPSBuZXcgRGlyZWN0aXZlcyh0aGlzLnlhbWwsIHRoaXMudGFncyk7XG4gICAgICAgIHN3aXRjaCAodGhpcy55YW1sLnZlcnNpb24pIHtcbiAgICAgICAgICAgIGNhc2UgJzEuMSc6XG4gICAgICAgICAgICAgICAgdGhpcy5hdE5leHREb2N1bWVudCA9IHRydWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICcxLjInOlxuICAgICAgICAgICAgICAgIHRoaXMuYXROZXh0RG9jdW1lbnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLnlhbWwgPSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGxpY2l0OiBEaXJlY3RpdmVzLmRlZmF1bHRZYW1sLmV4cGxpY2l0LFxuICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOiAnMS4yJ1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdGhpcy50YWdzID0gT2JqZWN0LmFzc2lnbih7fSwgRGlyZWN0aXZlcy5kZWZhdWx0VGFncyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIG9uRXJyb3IgLSBNYXkgYmUgY2FsbGVkIGV2ZW4gaWYgdGhlIGFjdGlvbiB3YXMgc3VjY2Vzc2Z1bFxuICAgICAqIEByZXR1cm5zIGB0cnVlYCBvbiBzdWNjZXNzXG4gICAgICovXG4gICAgYWRkKGxpbmUsIG9uRXJyb3IpIHtcbiAgICAgICAgaWYgKHRoaXMuYXROZXh0RG9jdW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMueWFtbCA9IHsgZXhwbGljaXQ6IERpcmVjdGl2ZXMuZGVmYXVsdFlhbWwuZXhwbGljaXQsIHZlcnNpb246ICcxLjEnIH07XG4gICAgICAgICAgICB0aGlzLnRhZ3MgPSBPYmplY3QuYXNzaWduKHt9LCBEaXJlY3RpdmVzLmRlZmF1bHRUYWdzKTtcbiAgICAgICAgICAgIHRoaXMuYXROZXh0RG9jdW1lbnQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXJ0cyA9IGxpbmUudHJpbSgpLnNwbGl0KC9bIFxcdF0rLyk7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBwYXJ0cy5zaGlmdCgpO1xuICAgICAgICBzd2l0Y2ggKG5hbWUpIHtcbiAgICAgICAgICAgIGNhc2UgJyVUQUcnOiB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCAhPT0gMikge1xuICAgICAgICAgICAgICAgICAgICBvbkVycm9yKDAsICclVEFHIGRpcmVjdGl2ZSBzaG91bGQgY29udGFpbiBleGFjdGx5IHR3byBwYXJ0cycpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoIDwgMilcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgW2hhbmRsZSwgcHJlZml4XSA9IHBhcnRzO1xuICAgICAgICAgICAgICAgIHRoaXMudGFnc1toYW5kbGVdID0gcHJlZml4O1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnJVlBTUwnOiB7XG4gICAgICAgICAgICAgICAgdGhpcy55YW1sLmV4cGxpY2l0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIG9uRXJyb3IoMCwgJyVZQU1MIGRpcmVjdGl2ZSBzaG91bGQgY29udGFpbiBleGFjdGx5IG9uZSBwYXJ0Jyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgW3ZlcnNpb25dID0gcGFydHM7XG4gICAgICAgICAgICAgICAgaWYgKHZlcnNpb24gPT09ICcxLjEnIHx8IHZlcnNpb24gPT09ICcxLjInKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMueWFtbC52ZXJzaW9uID0gdmVyc2lvbjtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpc1ZhbGlkID0gL15cXGQrXFwuXFxkKyQvLnRlc3QodmVyc2lvbik7XG4gICAgICAgICAgICAgICAgICAgIG9uRXJyb3IoNiwgYFVuc3VwcG9ydGVkIFlBTUwgdmVyc2lvbiAke3ZlcnNpb259YCwgaXNWYWxpZCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIG9uRXJyb3IoMCwgYFVua25vd24gZGlyZWN0aXZlICR7bmFtZX1gLCB0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVzb2x2ZXMgYSB0YWcsIG1hdGNoaW5nIGhhbmRsZXMgdG8gdGhvc2UgZGVmaW5lZCBpbiAlVEFHIGRpcmVjdGl2ZXMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBSZXNvbHZlZCB0YWcsIHdoaWNoIG1heSBhbHNvIGJlIHRoZSBub24tc3BlY2lmaWMgdGFnIGAnISdgIG9yIGFcbiAgICAgKiAgIGAnIWxvY2FsJ2AgdGFnLCBvciBgbnVsbGAgaWYgdW5yZXNvbHZhYmxlLlxuICAgICAqL1xuICAgIHRhZ05hbWUoc291cmNlLCBvbkVycm9yKSB7XG4gICAgICAgIGlmIChzb3VyY2UgPT09ICchJylcbiAgICAgICAgICAgIHJldHVybiAnISc7IC8vIG5vbi1zcGVjaWZpYyB0YWdcbiAgICAgICAgaWYgKHNvdXJjZVswXSAhPT0gJyEnKSB7XG4gICAgICAgICAgICBvbkVycm9yKGBOb3QgYSB2YWxpZCB0YWc6ICR7c291cmNlfWApO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNvdXJjZVsxXSA9PT0gJzwnKSB7XG4gICAgICAgICAgICBjb25zdCB2ZXJiYXRpbSA9IHNvdXJjZS5zbGljZSgyLCAtMSk7XG4gICAgICAgICAgICBpZiAodmVyYmF0aW0gPT09ICchJyB8fCB2ZXJiYXRpbSA9PT0gJyEhJykge1xuICAgICAgICAgICAgICAgIG9uRXJyb3IoYFZlcmJhdGltIHRhZ3MgYXJlbid0IHJlc29sdmVkLCBzbyAke3NvdXJjZX0gaXMgaW52YWxpZC5gKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzb3VyY2Vbc291cmNlLmxlbmd0aCAtIDFdICE9PSAnPicpXG4gICAgICAgICAgICAgICAgb25FcnJvcignVmVyYmF0aW0gdGFncyBtdXN0IGVuZCB3aXRoIGEgPicpO1xuICAgICAgICAgICAgcmV0dXJuIHZlcmJhdGltO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IFssIGhhbmRsZSwgc3VmZml4XSA9IHNvdXJjZS5tYXRjaCgvXiguKiEpKFteIV0qKSQvcyk7XG4gICAgICAgIGlmICghc3VmZml4KVxuICAgICAgICAgICAgb25FcnJvcihgVGhlICR7c291cmNlfSB0YWcgaGFzIG5vIHN1ZmZpeGApO1xuICAgICAgICBjb25zdCBwcmVmaXggPSB0aGlzLnRhZ3NbaGFuZGxlXTtcbiAgICAgICAgaWYgKHByZWZpeCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4ICsgZGVjb2RlVVJJQ29tcG9uZW50KHN1ZmZpeCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBvbkVycm9yKFN0cmluZyhlcnJvcikpO1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChoYW5kbGUgPT09ICchJylcbiAgICAgICAgICAgIHJldHVybiBzb3VyY2U7IC8vIGxvY2FsIHRhZ1xuICAgICAgICBvbkVycm9yKGBDb3VsZCBub3QgcmVzb2x2ZSB0YWc6ICR7c291cmNlfWApO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2l2ZW4gYSBmdWxseSByZXNvbHZlZCB0YWcsIHJldHVybnMgaXRzIHByaW50YWJsZSBzdHJpbmcgZm9ybSxcbiAgICAgKiB0YWtpbmcgaW50byBhY2NvdW50IGN1cnJlbnQgdGFnIHByZWZpeGVzIGFuZCBkZWZhdWx0cy5cbiAgICAgKi9cbiAgICB0YWdTdHJpbmcodGFnKSB7XG4gICAgICAgIGZvciAoY29uc3QgW2hhbmRsZSwgcHJlZml4XSBvZiBPYmplY3QuZW50cmllcyh0aGlzLnRhZ3MpKSB7XG4gICAgICAgICAgICBpZiAodGFnLnN0YXJ0c1dpdGgocHJlZml4KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlICsgZXNjYXBlVGFnTmFtZSh0YWcuc3Vic3RyaW5nKHByZWZpeC5sZW5ndGgpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGFnWzBdID09PSAnIScgPyB0YWcgOiBgITwke3RhZ30+YDtcbiAgICB9XG4gICAgdG9TdHJpbmcoZG9jKSB7XG4gICAgICAgIGNvbnN0IGxpbmVzID0gdGhpcy55YW1sLmV4cGxpY2l0XG4gICAgICAgICAgICA/IFtgJVlBTUwgJHt0aGlzLnlhbWwudmVyc2lvbiB8fCAnMS4yJ31gXVxuICAgICAgICAgICAgOiBbXTtcbiAgICAgICAgY29uc3QgdGFnRW50cmllcyA9IE9iamVjdC5lbnRyaWVzKHRoaXMudGFncyk7XG4gICAgICAgIGxldCB0YWdOYW1lcztcbiAgICAgICAgaWYgKGRvYyAmJiB0YWdFbnRyaWVzLmxlbmd0aCA+IDAgJiYgaXNOb2RlKGRvYy5jb250ZW50cykpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZ3MgPSB7fTtcbiAgICAgICAgICAgIHZpc2l0KGRvYy5jb250ZW50cywgKF9rZXksIG5vZGUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaXNOb2RlKG5vZGUpICYmIG5vZGUudGFnKVxuICAgICAgICAgICAgICAgICAgICB0YWdzW25vZGUudGFnXSA9IHRydWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRhZ05hbWVzID0gT2JqZWN0LmtleXModGFncyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGFnTmFtZXMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBbaGFuZGxlLCBwcmVmaXhdIG9mIHRhZ0VudHJpZXMpIHtcbiAgICAgICAgICAgIGlmIChoYW5kbGUgPT09ICchIScgJiYgcHJlZml4ID09PSAndGFnOnlhbWwub3JnLDIwMDI6JylcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICghZG9jIHx8IHRhZ05hbWVzLnNvbWUodG4gPT4gdG4uc3RhcnRzV2l0aChwcmVmaXgpKSlcbiAgICAgICAgICAgICAgICBsaW5lcy5wdXNoKGAlVEFHICR7aGFuZGxlfSAke3ByZWZpeH1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG4gICAgfVxufVxuRGlyZWN0aXZlcy5kZWZhdWx0WWFtbCA9IHsgZXhwbGljaXQ6IGZhbHNlLCB2ZXJzaW9uOiAnMS4yJyB9O1xuRGlyZWN0aXZlcy5kZWZhdWx0VGFncyA9IHsgJyEhJzogJ3RhZzp5YW1sLm9yZywyMDAyOicgfTtcblxuZXhwb3J0IHsgRGlyZWN0aXZlcyB9O1xuIiwiaW1wb3J0IHsgaXNTY2FsYXIsIGlzQ29sbGVjdGlvbiB9IGZyb20gJy4uL25vZGVzL2lkZW50aXR5LmpzJztcbmltcG9ydCB7IHZpc2l0IH0gZnJvbSAnLi4vdmlzaXQuanMnO1xuXG4vKipcbiAqIFZlcmlmeSB0aGF0IHRoZSBpbnB1dCBzdHJpbmcgaXMgYSB2YWxpZCBhbmNob3IuXG4gKlxuICogV2lsbCB0aHJvdyBvbiBlcnJvcnMuXG4gKi9cbmZ1bmN0aW9uIGFuY2hvcklzVmFsaWQoYW5jaG9yKSB7XG4gICAgaWYgKC9bXFx4MDAtXFx4MTlcXHMsW1xcXXt9XS8udGVzdChhbmNob3IpKSB7XG4gICAgICAgIGNvbnN0IHNhID0gSlNPTi5zdHJpbmdpZnkoYW5jaG9yKTtcbiAgICAgICAgY29uc3QgbXNnID0gYEFuY2hvciBtdXN0IG5vdCBjb250YWluIHdoaXRlc3BhY2Ugb3IgY29udHJvbCBjaGFyYWN0ZXJzOiAke3NhfWA7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIGFuY2hvck5hbWVzKHJvb3QpIHtcbiAgICBjb25zdCBhbmNob3JzID0gbmV3IFNldCgpO1xuICAgIHZpc2l0KHJvb3QsIHtcbiAgICAgICAgVmFsdWUoX2tleSwgbm9kZSkge1xuICAgICAgICAgICAgaWYgKG5vZGUuYW5jaG9yKVxuICAgICAgICAgICAgICAgIGFuY2hvcnMuYWRkKG5vZGUuYW5jaG9yKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBhbmNob3JzO1xufVxuLyoqIEZpbmQgYSBuZXcgYW5jaG9yIG5hbWUgd2l0aCB0aGUgZ2l2ZW4gYHByZWZpeGAgYW5kIGEgb25lLWluZGV4ZWQgc3VmZml4LiAqL1xuZnVuY3Rpb24gZmluZE5ld0FuY2hvcihwcmVmaXgsIGV4Y2x1ZGUpIHtcbiAgICBmb3IgKGxldCBpID0gMTsgdHJ1ZTsgKytpKSB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBgJHtwcmVmaXh9JHtpfWA7XG4gICAgICAgIGlmICghZXhjbHVkZS5oYXMobmFtZSkpXG4gICAgICAgICAgICByZXR1cm4gbmFtZTtcbiAgICB9XG59XG5mdW5jdGlvbiBjcmVhdGVOb2RlQW5jaG9ycyhkb2MsIHByZWZpeCkge1xuICAgIGNvbnN0IGFsaWFzT2JqZWN0cyA9IFtdO1xuICAgIGNvbnN0IHNvdXJjZU9iamVjdHMgPSBuZXcgTWFwKCk7XG4gICAgbGV0IHByZXZBbmNob3JzID0gbnVsbDtcbiAgICByZXR1cm4ge1xuICAgICAgICBvbkFuY2hvcjogKHNvdXJjZSkgPT4ge1xuICAgICAgICAgICAgYWxpYXNPYmplY3RzLnB1c2goc291cmNlKTtcbiAgICAgICAgICAgIHByZXZBbmNob3JzID8/IChwcmV2QW5jaG9ycyA9IGFuY2hvck5hbWVzKGRvYykpO1xuICAgICAgICAgICAgY29uc3QgYW5jaG9yID0gZmluZE5ld0FuY2hvcihwcmVmaXgsIHByZXZBbmNob3JzKTtcbiAgICAgICAgICAgIHByZXZBbmNob3JzLmFkZChhbmNob3IpO1xuICAgICAgICAgICAgcmV0dXJuIGFuY2hvcjtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFdpdGggY2lyY3VsYXIgcmVmZXJlbmNlcywgdGhlIHNvdXJjZSBub2RlIGlzIG9ubHkgcmVzb2x2ZWQgYWZ0ZXIgYWxsXG4gICAgICAgICAqIG9mIGl0cyBjaGlsZCBub2RlcyBhcmUuIFRoaXMgaXMgd2h5IGFuY2hvcnMgYXJlIHNldCBvbmx5IGFmdGVyIGFsbCBvZlxuICAgICAgICAgKiB0aGUgbm9kZXMgaGF2ZSBiZWVuIGNyZWF0ZWQuXG4gICAgICAgICAqL1xuICAgICAgICBzZXRBbmNob3JzOiAoKSA9PiB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHNvdXJjZSBvZiBhbGlhc09iamVjdHMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWYgPSBzb3VyY2VPYmplY3RzLmdldChzb3VyY2UpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVmID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgICAgICAgICByZWYuYW5jaG9yICYmXG4gICAgICAgICAgICAgICAgICAgIChpc1NjYWxhcihyZWYubm9kZSkgfHwgaXNDb2xsZWN0aW9uKHJlZi5ub2RlKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVmLm5vZGUuYW5jaG9yID0gcmVmLmFuY2hvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCdGYWlsZWQgdG8gcmVzb2x2ZSByZXBlYXRlZCBvYmplY3QgKHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4pJyk7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yLnNvdXJjZSA9IHNvdXJjZTtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBzb3VyY2VPYmplY3RzXG4gICAgfTtcbn1cblxuZXhwb3J0IHsgYW5jaG9ySXNWYWxpZCwgYW5jaG9yTmFtZXMsIGNyZWF0ZU5vZGVBbmNob3JzLCBmaW5kTmV3QW5jaG9yIH07XG4iLCIvKipcbiAqIEFwcGxpZXMgdGhlIEpTT04ucGFyc2UgcmV2aXZlciBhbGdvcml0aG0gYXMgZGVmaW5lZCBpbiB0aGUgRUNNQS0yNjIgc3BlYyxcbiAqIGluIHNlY3Rpb24gMjQuNS4xLjEgXCJSdW50aW1lIFNlbWFudGljczogSW50ZXJuYWxpemVKU09OUHJvcGVydHlcIiBvZiB0aGVcbiAqIDIwMjEgZWRpdGlvbjogaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1qc29uLnBhcnNlXG4gKlxuICogSW5jbHVkZXMgZXh0ZW5zaW9ucyBmb3IgaGFuZGxpbmcgTWFwIGFuZCBTZXQgb2JqZWN0cy5cbiAqL1xuZnVuY3Rpb24gYXBwbHlSZXZpdmVyKHJldml2ZXIsIG9iaiwga2V5LCB2YWwpIHtcbiAgICBpZiAodmFsICYmIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB2YWwubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2MCA9IHZhbFtpXTtcbiAgICAgICAgICAgICAgICBjb25zdCB2MSA9IGFwcGx5UmV2aXZlcihyZXZpdmVyLCB2YWwsIFN0cmluZyhpKSwgdjApO1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tYXJyYXktZGVsZXRlXG4gICAgICAgICAgICAgICAgaWYgKHYxID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB2YWxbaV07XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodjEgIT09IHYwKVxuICAgICAgICAgICAgICAgICAgICB2YWxbaV0gPSB2MTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh2YWwgaW5zdGFuY2VvZiBNYXApIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgayBvZiBBcnJheS5mcm9tKHZhbC5rZXlzKCkpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdjAgPSB2YWwuZ2V0KGspO1xuICAgICAgICAgICAgICAgIGNvbnN0IHYxID0gYXBwbHlSZXZpdmVyKHJldml2ZXIsIHZhbCwgaywgdjApO1xuICAgICAgICAgICAgICAgIGlmICh2MSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICB2YWwuZGVsZXRlKGspO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHYxICE9PSB2MClcbiAgICAgICAgICAgICAgICAgICAgdmFsLnNldChrLCB2MSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodmFsIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHYwIG9mIEFycmF5LmZyb20odmFsKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHYxID0gYXBwbHlSZXZpdmVyKHJldml2ZXIsIHZhbCwgdjAsIHYwKTtcbiAgICAgICAgICAgICAgICBpZiAodjEgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgdmFsLmRlbGV0ZSh2MCk7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodjEgIT09IHYwKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbC5kZWxldGUodjApO1xuICAgICAgICAgICAgICAgICAgICB2YWwuYWRkKHYxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtrLCB2MF0gb2YgT2JqZWN0LmVudHJpZXModmFsKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHYxID0gYXBwbHlSZXZpdmVyKHJldml2ZXIsIHZhbCwgaywgdjApO1xuICAgICAgICAgICAgICAgIGlmICh2MSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgdmFsW2tdO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHYxICE9PSB2MClcbiAgICAgICAgICAgICAgICAgICAgdmFsW2tdID0gdjE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldml2ZXIuY2FsbChvYmosIGtleSwgdmFsKTtcbn1cblxuZXhwb3J0IHsgYXBwbHlSZXZpdmVyIH07XG4iLCJpbXBvcnQgeyBoYXNBbmNob3IgfSBmcm9tICcuL2lkZW50aXR5LmpzJztcblxuLyoqXG4gKiBSZWN1cnNpdmVseSBjb252ZXJ0IGFueSBub2RlIG9yIGl0cyBjb250ZW50cyB0byBuYXRpdmUgSmF2YVNjcmlwdFxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBpbnB1dCB2YWx1ZVxuICogQHBhcmFtIGFyZyAtIElmIGB2YWx1ZWAgZGVmaW5lcyBhIGB0b0pTT04oKWAgbWV0aG9kLCB1c2UgdGhpc1xuICogICBhcyBpdHMgZmlyc3QgYXJndW1lbnRcbiAqIEBwYXJhbSBjdHggLSBDb252ZXJzaW9uIGNvbnRleHQsIG9yaWdpbmFsbHkgc2V0IGluIERvY3VtZW50I3RvSlMoKS4gSWZcbiAqICAgYHsga2VlcDogdHJ1ZSB9YCBpcyBub3Qgc2V0LCBvdXRwdXQgc2hvdWxkIGJlIHN1aXRhYmxlIGZvciBKU09OXG4gKiAgIHN0cmluZ2lmaWNhdGlvbi5cbiAqL1xuZnVuY3Rpb24gdG9KUyh2YWx1ZSwgYXJnLCBjdHgpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1yZXR1cm5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpXG4gICAgICAgIHJldHVybiB2YWx1ZS5tYXAoKHYsIGkpID0+IHRvSlModiwgU3RyaW5nKGkpLCBjdHgpKTtcbiAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlLnRvSlNPTiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1jYWxsXG4gICAgICAgIGlmICghY3R4IHx8ICFoYXNBbmNob3IodmFsdWUpKVxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnRvSlNPTihhcmcsIGN0eCk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB7IGFsaWFzQ291bnQ6IDAsIGNvdW50OiAxLCByZXM6IHVuZGVmaW5lZCB9O1xuICAgICAgICBjdHguYW5jaG9ycy5zZXQodmFsdWUsIGRhdGEpO1xuICAgICAgICBjdHgub25DcmVhdGUgPSByZXMgPT4ge1xuICAgICAgICAgICAgZGF0YS5yZXMgPSByZXM7XG4gICAgICAgICAgICBkZWxldGUgY3R4Lm9uQ3JlYXRlO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCByZXMgPSB2YWx1ZS50b0pTT04oYXJnLCBjdHgpO1xuICAgICAgICBpZiAoY3R4Lm9uQ3JlYXRlKVxuICAgICAgICAgICAgY3R4Lm9uQ3JlYXRlKHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdiaWdpbnQnICYmICFjdHg/LmtlZXApXG4gICAgICAgIHJldHVybiBOdW1iZXIodmFsdWUpO1xuICAgIHJldHVybiB2YWx1ZTtcbn1cblxuZXhwb3J0IHsgdG9KUyB9O1xuIiwiaW1wb3J0IHsgYXBwbHlSZXZpdmVyIH0gZnJvbSAnLi4vZG9jL2FwcGx5UmV2aXZlci5qcyc7XG5pbXBvcnQgeyBOT0RFX1RZUEUsIGlzRG9jdW1lbnQgfSBmcm9tICcuL2lkZW50aXR5LmpzJztcbmltcG9ydCB7IHRvSlMgfSBmcm9tICcuL3RvSlMuanMnO1xuXG5jbGFzcyBOb2RlQmFzZSB7XG4gICAgY29uc3RydWN0b3IodHlwZSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgTk9ERV9UWVBFLCB7IHZhbHVlOiB0eXBlIH0pO1xuICAgIH1cbiAgICAvKiogQ3JlYXRlIGEgY29weSBvZiB0aGlzIG5vZGUuICAqL1xuICAgIGNsb25lKCkge1xuICAgICAgICBjb25zdCBjb3B5ID0gT2JqZWN0LmNyZWF0ZShPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcyksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHRoaXMpKTtcbiAgICAgICAgaWYgKHRoaXMucmFuZ2UpXG4gICAgICAgICAgICBjb3B5LnJhbmdlID0gdGhpcy5yYW5nZS5zbGljZSgpO1xuICAgICAgICByZXR1cm4gY29weTtcbiAgICB9XG4gICAgLyoqIEEgcGxhaW4gSmF2YVNjcmlwdCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG5vZGUuICovXG4gICAgdG9KUyhkb2MsIHsgbWFwQXNNYXAsIG1heEFsaWFzQ291bnQsIG9uQW5jaG9yLCByZXZpdmVyIH0gPSB7fSkge1xuICAgICAgICBpZiAoIWlzRG9jdW1lbnQoZG9jKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0EgZG9jdW1lbnQgYXJndW1lbnQgaXMgcmVxdWlyZWQnKTtcbiAgICAgICAgY29uc3QgY3R4ID0ge1xuICAgICAgICAgICAgYW5jaG9yczogbmV3IE1hcCgpLFxuICAgICAgICAgICAgZG9jLFxuICAgICAgICAgICAga2VlcDogdHJ1ZSxcbiAgICAgICAgICAgIG1hcEFzTWFwOiBtYXBBc01hcCA9PT0gdHJ1ZSxcbiAgICAgICAgICAgIG1hcEtleVdhcm5lZDogZmFsc2UsXG4gICAgICAgICAgICBtYXhBbGlhc0NvdW50OiB0eXBlb2YgbWF4QWxpYXNDb3VudCA9PT0gJ251bWJlcicgPyBtYXhBbGlhc0NvdW50IDogMTAwXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlcyA9IHRvSlModGhpcywgJycsIGN0eCk7XG4gICAgICAgIGlmICh0eXBlb2Ygb25BbmNob3IgPT09ICdmdW5jdGlvbicpXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHsgY291bnQsIHJlcyB9IG9mIGN0eC5hbmNob3JzLnZhbHVlcygpKVxuICAgICAgICAgICAgICAgIG9uQW5jaG9yKHJlcywgY291bnQpO1xuICAgICAgICByZXR1cm4gdHlwZW9mIHJldml2ZXIgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgID8gYXBwbHlSZXZpdmVyKHJldml2ZXIsIHsgJyc6IHJlcyB9LCAnJywgcmVzKVxuICAgICAgICAgICAgOiByZXM7XG4gICAgfVxufVxuXG5leHBvcnQgeyBOb2RlQmFzZSB9O1xuIiwiaW1wb3J0IHsgYW5jaG9ySXNWYWxpZCB9IGZyb20gJy4uL2RvYy9hbmNob3JzLmpzJztcbmltcG9ydCB7IHZpc2l0IH0gZnJvbSAnLi4vdmlzaXQuanMnO1xuaW1wb3J0IHsgQUxJQVMsIGlzQWxpYXMsIGlzQ29sbGVjdGlvbiwgaXNQYWlyLCBoYXNBbmNob3IgfSBmcm9tICcuL2lkZW50aXR5LmpzJztcbmltcG9ydCB7IE5vZGVCYXNlIH0gZnJvbSAnLi9Ob2RlLmpzJztcbmltcG9ydCB7IHRvSlMgfSBmcm9tICcuL3RvSlMuanMnO1xuXG5jbGFzcyBBbGlhcyBleHRlbmRzIE5vZGVCYXNlIHtcbiAgICBjb25zdHJ1Y3Rvcihzb3VyY2UpIHtcbiAgICAgICAgc3VwZXIoQUxJQVMpO1xuICAgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICd0YWcnLCB7XG4gICAgICAgICAgICBzZXQoKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBbGlhcyBub2RlcyBjYW5ub3QgaGF2ZSB0YWdzJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXNvbHZlIHRoZSB2YWx1ZSBvZiB0aGlzIGFsaWFzIHdpdGhpbiBgZG9jYCwgZmluZGluZyB0aGUgbGFzdFxuICAgICAqIGluc3RhbmNlIG9mIHRoZSBgc291cmNlYCBhbmNob3IgYmVmb3JlIHRoaXMgbm9kZS5cbiAgICAgKi9cbiAgICByZXNvbHZlKGRvYywgY3R4KSB7XG4gICAgICAgIGlmIChjdHg/Lm1heEFsaWFzQ291bnQgPT09IDApXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoJ0FsaWFzIHJlc29sdXRpb24gaXMgZGlzYWJsZWQnKTtcbiAgICAgICAgbGV0IG5vZGVzO1xuICAgICAgICBpZiAoY3R4Py5hbGlhc1Jlc29sdmVDYWNoZSkge1xuICAgICAgICAgICAgbm9kZXMgPSBjdHguYWxpYXNSZXNvbHZlQ2FjaGU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBub2RlcyA9IFtdO1xuICAgICAgICAgICAgdmlzaXQoZG9jLCB7XG4gICAgICAgICAgICAgICAgTm9kZTogKF9rZXksIG5vZGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzQWxpYXMobm9kZSkgfHwgaGFzQW5jaG9yKG5vZGUpKVxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXMucHVzaChub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChjdHgpXG4gICAgICAgICAgICAgICAgY3R4LmFsaWFzUmVzb2x2ZUNhY2hlID0gbm9kZXM7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGZvdW5kID0gdW5kZWZpbmVkO1xuICAgICAgICBmb3IgKGNvbnN0IG5vZGUgb2Ygbm9kZXMpIHtcbiAgICAgICAgICAgIGlmIChub2RlID09PSB0aGlzKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgaWYgKG5vZGUuYW5jaG9yID09PSB0aGlzLnNvdXJjZSlcbiAgICAgICAgICAgICAgICBmb3VuZCA9IG5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZvdW5kICYmIGN0eCkge1xuICAgICAgICAgICAgY29uc3QgeyBhbmNob3JzLCBkb2MsIG1heEFsaWFzQ291bnQgfSA9IGN0eDtcbiAgICAgICAgICAgIGxldCBkYXRhID0gYW5jaG9ycy5nZXQoZm91bmQpO1xuICAgICAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgICAgICAgLy8gUmVzb2x2ZSBhbmNob3JzIGZvciBOb2RlLnByb3RvdHlwZS50b0pTKClcbiAgICAgICAgICAgICAgICB0b0pTKGZvdW5kLCBudWxsLCBjdHgpO1xuICAgICAgICAgICAgICAgIGRhdGEgPSBhbmNob3JzLmdldChmb3VuZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgICAgICAgIGlmIChkYXRhPy5yZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1zZyA9ICdUaGlzIHNob3VsZCBub3QgaGFwcGVuOiBBbGlhcyBhbmNob3Igd2FzIG5vdCByZXNvbHZlZD8nO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihtc2cpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1heEFsaWFzQ291bnQgPj0gMCkge1xuICAgICAgICAgICAgICAgIGRhdGEuY291bnQgKz0gMTtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5hbGlhc0NvdW50ID09PSAwKVxuICAgICAgICAgICAgICAgICAgICBkYXRhLmFsaWFzQ291bnQgPSBnZXRBbGlhc0NvdW50KGRvYywgZm91bmQsIGFuY2hvcnMpO1xuICAgICAgICAgICAgICAgIGlmIChkYXRhLmNvdW50ICogZGF0YS5hbGlhc0NvdW50ID4gbWF4QWxpYXNDb3VudCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtc2cgPSAnRXhjZXNzaXZlIGFsaWFzIGNvdW50IGluZGljYXRlcyBhIHJlc291cmNlIGV4aGF1c3Rpb24gYXR0YWNrJztcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKG1zZyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmb3VuZDtcbiAgICB9XG4gICAgdG9KU09OKF9hcmcsIGN0eCkge1xuICAgICAgICBpZiAoIWN0eClcbiAgICAgICAgICAgIHJldHVybiB7IHNvdXJjZTogdGhpcy5zb3VyY2UgfTtcbiAgICAgICAgY29uc3Qgc291cmNlID0gdGhpcy5yZXNvbHZlKGN0eC5kb2MsIGN0eCk7XG4gICAgICAgIGlmICghc291cmNlKSB7XG4gICAgICAgICAgICBjb25zdCBtc2cgPSBgVW5yZXNvbHZlZCBhbGlhcyAodGhlIGFuY2hvciBtdXN0IGJlIHNldCBiZWZvcmUgdGhlIGFsaWFzKTogJHt0aGlzLnNvdXJjZX1gO1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKG1zZyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGN0eC5hbmNob3JzLmdldChzb3VyY2UpLnJlcztcbiAgICB9XG4gICAgdG9TdHJpbmcoY3R4LCBfb25Db21tZW50LCBfb25DaG9tcEtlZXApIHtcbiAgICAgICAgY29uc3Qgc3JjID0gYCoke3RoaXMuc291cmNlfWA7XG4gICAgICAgIGlmIChjdHgpIHtcbiAgICAgICAgICAgIGFuY2hvcklzVmFsaWQodGhpcy5zb3VyY2UpO1xuICAgICAgICAgICAgaWYgKGN0eC5vcHRpb25zLnZlcmlmeUFsaWFzT3JkZXIgJiYgIWN0eC5hbmNob3JzLmhhcyh0aGlzLnNvdXJjZSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtc2cgPSBgVW5yZXNvbHZlZCBhbGlhcyAodGhlIGFuY2hvciBtdXN0IGJlIHNldCBiZWZvcmUgdGhlIGFsaWFzKTogJHt0aGlzLnNvdXJjZX1gO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGN0eC5pbXBsaWNpdEtleSlcbiAgICAgICAgICAgICAgICByZXR1cm4gYCR7c3JjfSBgO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzcmM7XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0QWxpYXNDb3VudChkb2MsIG5vZGUsIGFuY2hvcnMpIHtcbiAgICBpZiAoaXNBbGlhcyhub2RlKSkge1xuICAgICAgICBjb25zdCBzb3VyY2UgPSBub2RlLnJlc29sdmUoZG9jKTtcbiAgICAgICAgY29uc3QgYW5jaG9yID0gYW5jaG9ycyAmJiBzb3VyY2UgJiYgYW5jaG9ycy5nZXQoc291cmNlKTtcbiAgICAgICAgcmV0dXJuIGFuY2hvciA/IGFuY2hvci5jb3VudCAqIGFuY2hvci5hbGlhc0NvdW50IDogMDtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNDb2xsZWN0aW9uKG5vZGUpKSB7XG4gICAgICAgIGxldCBjb3VudCA9IDA7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBub2RlLml0ZW1zKSB7XG4gICAgICAgICAgICBjb25zdCBjID0gZ2V0QWxpYXNDb3VudChkb2MsIGl0ZW0sIGFuY2hvcnMpO1xuICAgICAgICAgICAgaWYgKGMgPiBjb3VudClcbiAgICAgICAgICAgICAgICBjb3VudCA9IGM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvdW50O1xuICAgIH1cbiAgICBlbHNlIGlmIChpc1BhaXIobm9kZSkpIHtcbiAgICAgICAgY29uc3Qga2MgPSBnZXRBbGlhc0NvdW50KGRvYywgbm9kZS5rZXksIGFuY2hvcnMpO1xuICAgICAgICBjb25zdCB2YyA9IGdldEFsaWFzQ291bnQoZG9jLCBub2RlLnZhbHVlLCBhbmNob3JzKTtcbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KGtjLCB2Yyk7XG4gICAgfVxuICAgIHJldHVybiAxO1xufVxuXG5leHBvcnQgeyBBbGlhcyB9O1xuIiwiaW1wb3J0IHsgU0NBTEFSIH0gZnJvbSAnLi9pZGVudGl0eS5qcyc7XG5pbXBvcnQgeyBOb2RlQmFzZSB9IGZyb20gJy4vTm9kZS5qcyc7XG5pbXBvcnQgeyB0b0pTIH0gZnJvbSAnLi90b0pTLmpzJztcblxuY29uc3QgaXNTY2FsYXJWYWx1ZSA9ICh2YWx1ZSkgPT4gIXZhbHVlIHx8ICh0eXBlb2YgdmFsdWUgIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0Jyk7XG5jbGFzcyBTY2FsYXIgZXh0ZW5kcyBOb2RlQmFzZSB7XG4gICAgY29uc3RydWN0b3IodmFsdWUpIHtcbiAgICAgICAgc3VwZXIoU0NBTEFSKTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICB0b0pTT04oYXJnLCBjdHgpIHtcbiAgICAgICAgcmV0dXJuIGN0eD8ua2VlcCA/IHRoaXMudmFsdWUgOiB0b0pTKHRoaXMudmFsdWUsIGFyZywgY3R4KTtcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiBTdHJpbmcodGhpcy52YWx1ZSk7XG4gICAgfVxufVxuU2NhbGFyLkJMT0NLX0ZPTERFRCA9ICdCTE9DS19GT0xERUQnO1xuU2NhbGFyLkJMT0NLX0xJVEVSQUwgPSAnQkxPQ0tfTElURVJBTCc7XG5TY2FsYXIuUExBSU4gPSAnUExBSU4nO1xuU2NhbGFyLlFVT1RFX0RPVUJMRSA9ICdRVU9URV9ET1VCTEUnO1xuU2NhbGFyLlFVT1RFX1NJTkdMRSA9ICdRVU9URV9TSU5HTEUnO1xuXG5leHBvcnQgeyBTY2FsYXIsIGlzU2NhbGFyVmFsdWUgfTtcbiIsImltcG9ydCB7IEFsaWFzIH0gZnJvbSAnLi4vbm9kZXMvQWxpYXMuanMnO1xuaW1wb3J0IHsgaXNOb2RlLCBpc1BhaXIsIE1BUCwgU0VRLCBpc0RvY3VtZW50IH0gZnJvbSAnLi4vbm9kZXMvaWRlbnRpdHkuanMnO1xuaW1wb3J0IHsgU2NhbGFyIH0gZnJvbSAnLi4vbm9kZXMvU2NhbGFyLmpzJztcblxuY29uc3QgZGVmYXVsdFRhZ1ByZWZpeCA9ICd0YWc6eWFtbC5vcmcsMjAwMjonO1xuZnVuY3Rpb24gZmluZFRhZ09iamVjdCh2YWx1ZSwgdGFnTmFtZSwgdGFncykge1xuICAgIGlmICh0YWdOYW1lKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoID0gdGFncy5maWx0ZXIodCA9PiB0LnRhZyA9PT0gdGFnTmFtZSk7XG4gICAgICAgIGNvbnN0IHRhZ09iaiA9IG1hdGNoLmZpbmQodCA9PiAhdC5mb3JtYXQpID8/IG1hdGNoWzBdO1xuICAgICAgICBpZiAoIXRhZ09iailcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGFnICR7dGFnTmFtZX0gbm90IGZvdW5kYCk7XG4gICAgICAgIHJldHVybiB0YWdPYmo7XG4gICAgfVxuICAgIHJldHVybiB0YWdzLmZpbmQodCA9PiB0LmlkZW50aWZ5Py4odmFsdWUpICYmICF0LmZvcm1hdCk7XG59XG5mdW5jdGlvbiBjcmVhdGVOb2RlKHZhbHVlLCB0YWdOYW1lLCBjdHgpIHtcbiAgICBpZiAoaXNEb2N1bWVudCh2YWx1ZSkpXG4gICAgICAgIHZhbHVlID0gdmFsdWUuY29udGVudHM7XG4gICAgaWYgKGlzTm9kZSh2YWx1ZSkpXG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICBpZiAoaXNQYWlyKHZhbHVlKSkge1xuICAgICAgICBjb25zdCBtYXAgPSBjdHguc2NoZW1hW01BUF0uY3JlYXRlTm9kZT8uKGN0eC5zY2hlbWEsIG51bGwsIGN0eCk7XG4gICAgICAgIG1hcC5pdGVtcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG1hcDtcbiAgICB9XG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nIHx8XG4gICAgICAgIHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyIHx8XG4gICAgICAgIHZhbHVlIGluc3RhbmNlb2YgQm9vbGVhbiB8fFxuICAgICAgICAodHlwZW9mIEJpZ0ludCAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsdWUgaW5zdGFuY2VvZiBCaWdJbnQpIC8vIG5vdCBzdXBwb3J0ZWQgZXZlcnl3aGVyZVxuICAgICkge1xuICAgICAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXNlcmlhbGl6ZWpzb25wcm9wZXJ0eVxuICAgICAgICB2YWx1ZSA9IHZhbHVlLnZhbHVlT2YoKTtcbiAgICB9XG4gICAgY29uc3QgeyBhbGlhc0R1cGxpY2F0ZU9iamVjdHMsIG9uQW5jaG9yLCBvblRhZ09iaiwgc2NoZW1hLCBzb3VyY2VPYmplY3RzIH0gPSBjdHg7XG4gICAgLy8gRGV0ZWN0IGR1cGxpY2F0ZSByZWZlcmVuY2VzIHRvIHRoZSBzYW1lIG9iamVjdCAmIHVzZSBBbGlhcyBub2RlcyBmb3IgYWxsXG4gICAgLy8gYWZ0ZXIgZmlyc3QuIFRoZSBgcmVmYCB3cmFwcGVyIGFsbG93cyBmb3IgY2lyY3VsYXIgcmVmZXJlbmNlcyB0byByZXNvbHZlLlxuICAgIGxldCByZWYgPSB1bmRlZmluZWQ7XG4gICAgaWYgKGFsaWFzRHVwbGljYXRlT2JqZWN0cyAmJiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJlZiA9IHNvdXJjZU9iamVjdHMuZ2V0KHZhbHVlKTtcbiAgICAgICAgaWYgKHJlZikge1xuICAgICAgICAgICAgcmVmLmFuY2hvciA/PyAocmVmLmFuY2hvciA9IG9uQW5jaG9yKHZhbHVlKSk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEFsaWFzKHJlZi5hbmNob3IpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVmID0geyBhbmNob3I6IG51bGwsIG5vZGU6IG51bGwgfTtcbiAgICAgICAgICAgIHNvdXJjZU9iamVjdHMuc2V0KHZhbHVlLCByZWYpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICh0YWdOYW1lPy5zdGFydHNXaXRoKCchIScpKVxuICAgICAgICB0YWdOYW1lID0gZGVmYXVsdFRhZ1ByZWZpeCArIHRhZ05hbWUuc2xpY2UoMik7XG4gICAgbGV0IHRhZ09iaiA9IGZpbmRUYWdPYmplY3QodmFsdWUsIHRhZ05hbWUsIHNjaGVtYS50YWdzKTtcbiAgICBpZiAoIXRhZ09iaikge1xuICAgICAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlLnRvSlNPTiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtY2FsbFxuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS50b0pTT04oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBuZXcgU2NhbGFyKHZhbHVlKTtcbiAgICAgICAgICAgIGlmIChyZWYpXG4gICAgICAgICAgICAgICAgcmVmLm5vZGUgPSBub2RlO1xuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgdGFnT2JqID1cbiAgICAgICAgICAgIHZhbHVlIGluc3RhbmNlb2YgTWFwXG4gICAgICAgICAgICAgICAgPyBzY2hlbWFbTUFQXVxuICAgICAgICAgICAgICAgIDogU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdCh2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgPyBzY2hlbWFbU0VRXVxuICAgICAgICAgICAgICAgICAgICA6IHNjaGVtYVtNQVBdO1xuICAgIH1cbiAgICBpZiAob25UYWdPYmopIHtcbiAgICAgICAgb25UYWdPYmoodGFnT2JqKTtcbiAgICAgICAgZGVsZXRlIGN0eC5vblRhZ09iajtcbiAgICB9XG4gICAgY29uc3Qgbm9kZSA9IHRhZ09iaj8uY3JlYXRlTm9kZVxuICAgICAgICA/IHRhZ09iai5jcmVhdGVOb2RlKGN0eC5zY2hlbWEsIHZhbHVlLCBjdHgpXG4gICAgICAgIDogdHlwZW9mIHRhZ09iaj8ubm9kZUNsYXNzPy5mcm9tID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgICA/IHRhZ09iai5ub2RlQ2xhc3MuZnJvbShjdHguc2NoZW1hLCB2YWx1ZSwgY3R4KVxuICAgICAgICAgICAgOiBuZXcgU2NhbGFyKHZhbHVlKTtcbiAgICBpZiAodGFnTmFtZSlcbiAgICAgICAgbm9kZS50YWcgPSB0YWdOYW1lO1xuICAgIGVsc2UgaWYgKCF0YWdPYmouZGVmYXVsdClcbiAgICAgICAgbm9kZS50YWcgPSB0YWdPYmoudGFnO1xuICAgIGlmIChyZWYpXG4gICAgICAgIHJlZi5ub2RlID0gbm9kZTtcbiAgICByZXR1cm4gbm9kZTtcbn1cblxuZXhwb3J0IHsgY3JlYXRlTm9kZSB9O1xuIiwiaW1wb3J0IHsgY3JlYXRlTm9kZSB9IGZyb20gJy4uL2RvYy9jcmVhdGVOb2RlLmpzJztcbmltcG9ydCB7IGlzTm9kZSwgaXNQYWlyLCBpc0NvbGxlY3Rpb24sIGlzU2NhbGFyIH0gZnJvbSAnLi9pZGVudGl0eS5qcyc7XG5pbXBvcnQgeyBOb2RlQmFzZSB9IGZyb20gJy4vTm9kZS5qcyc7XG5cbmZ1bmN0aW9uIGNvbGxlY3Rpb25Gcm9tUGF0aChzY2hlbWEsIHBhdGgsIHZhbHVlKSB7XG4gICAgbGV0IHYgPSB2YWx1ZTtcbiAgICBmb3IgKGxldCBpID0gcGF0aC5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICBjb25zdCBrID0gcGF0aFtpXTtcbiAgICAgICAgaWYgKHR5cGVvZiBrID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNJbnRlZ2VyKGspICYmIGsgPj0gMCkge1xuICAgICAgICAgICAgY29uc3QgYSA9IFtdO1xuICAgICAgICAgICAgYVtrXSA9IHY7XG4gICAgICAgICAgICB2ID0gYTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHYgPSBuZXcgTWFwKFtbaywgdl1dKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlTm9kZSh2LCB1bmRlZmluZWQsIHtcbiAgICAgICAgYWxpYXNEdXBsaWNhdGVPYmplY3RzOiBmYWxzZSxcbiAgICAgICAga2VlcFVuZGVmaW5lZDogZmFsc2UsXG4gICAgICAgIG9uQW5jaG9yOiAoKSA9PiB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgc2hvdWxkIG5vdCBoYXBwZW4sIHBsZWFzZSByZXBvcnQgYSBidWcuJyk7XG4gICAgICAgIH0sXG4gICAgICAgIHNjaGVtYSxcbiAgICAgICAgc291cmNlT2JqZWN0czogbmV3IE1hcCgpXG4gICAgfSk7XG59XG4vLyBUeXBlIGd1YXJkIGlzIGludGVudGlvbmFsbHkgYSBsaXR0bGUgd3Jvbmcgc28gYXMgdG8gYmUgbW9yZSB1c2VmdWwsXG4vLyBhcyBpdCBkb2VzIG5vdCBjb3ZlciB1bnR5cGFibGUgZW1wdHkgbm9uLXN0cmluZyBpdGVyYWJsZXMgKGUuZy4gW10pLlxuY29uc3QgaXNFbXB0eVBhdGggPSAocGF0aCkgPT4gcGF0aCA9PSBudWxsIHx8XG4gICAgKHR5cGVvZiBwYXRoID09PSAnb2JqZWN0JyAmJiAhIXBhdGhbU3ltYm9sLml0ZXJhdG9yXSgpLm5leHQoKS5kb25lKTtcbmNsYXNzIENvbGxlY3Rpb24gZXh0ZW5kcyBOb2RlQmFzZSB7XG4gICAgY29uc3RydWN0b3IodHlwZSwgc2NoZW1hKSB7XG4gICAgICAgIHN1cGVyKHR5cGUpO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3NjaGVtYScsIHtcbiAgICAgICAgICAgIHZhbHVlOiBzY2hlbWEsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBjb3B5IG9mIHRoaXMgY29sbGVjdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzY2hlbWEgLSBJZiBkZWZpbmVkLCBvdmVyd3JpdGVzIHRoZSBvcmlnaW5hbCdzIHNjaGVtYVxuICAgICAqL1xuICAgIGNsb25lKHNjaGVtYSkge1xuICAgICAgICBjb25zdCBjb3B5ID0gT2JqZWN0LmNyZWF0ZShPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcyksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHRoaXMpKTtcbiAgICAgICAgaWYgKHNjaGVtYSlcbiAgICAgICAgICAgIGNvcHkuc2NoZW1hID0gc2NoZW1hO1xuICAgICAgICBjb3B5Lml0ZW1zID0gY29weS5pdGVtcy5tYXAoaXQgPT4gaXNOb2RlKGl0KSB8fCBpc1BhaXIoaXQpID8gaXQuY2xvbmUoc2NoZW1hKSA6IGl0KTtcbiAgICAgICAgaWYgKHRoaXMucmFuZ2UpXG4gICAgICAgICAgICBjb3B5LnJhbmdlID0gdGhpcy5yYW5nZS5zbGljZSgpO1xuICAgICAgICByZXR1cm4gY29weTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIHZhbHVlIHRvIHRoZSBjb2xsZWN0aW9uLiBGb3IgYCEhbWFwYCBhbmQgYCEhb21hcGAgdGhlIHZhbHVlIG11c3RcbiAgICAgKiBiZSBhIFBhaXIgaW5zdGFuY2Ugb3IgYSBgeyBrZXksIHZhbHVlIH1gIG9iamVjdCwgd2hpY2ggbWF5IG5vdCBoYXZlIGEga2V5XG4gICAgICogdGhhdCBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgbWFwLlxuICAgICAqL1xuICAgIGFkZEluKHBhdGgsIHZhbHVlKSB7XG4gICAgICAgIGlmIChpc0VtcHR5UGF0aChwYXRoKSlcbiAgICAgICAgICAgIHRoaXMuYWRkKHZhbHVlKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBba2V5LCAuLi5yZXN0XSA9IHBhdGg7XG4gICAgICAgICAgICBjb25zdCBub2RlID0gdGhpcy5nZXQoa2V5LCB0cnVlKTtcbiAgICAgICAgICAgIGlmIChpc0NvbGxlY3Rpb24obm9kZSkpXG4gICAgICAgICAgICAgICAgbm9kZS5hZGRJbihyZXN0LCB2YWx1ZSk7XG4gICAgICAgICAgICBlbHNlIGlmIChub2RlID09PSB1bmRlZmluZWQgJiYgdGhpcy5zY2hlbWEpXG4gICAgICAgICAgICAgICAgdGhpcy5zZXQoa2V5LCBjb2xsZWN0aW9uRnJvbVBhdGgodGhpcy5zY2hlbWEsIHJlc3QsIHZhbHVlKSk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBZQU1MIGNvbGxlY3Rpb24gYXQgJHtrZXl9LiBSZW1haW5pbmcgcGF0aDogJHtyZXN0fWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYSB2YWx1ZSBmcm9tIHRoZSBjb2xsZWN0aW9uLlxuICAgICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgaXRlbSB3YXMgZm91bmQgYW5kIHJlbW92ZWQuXG4gICAgICovXG4gICAgZGVsZXRlSW4ocGF0aCkge1xuICAgICAgICBjb25zdCBba2V5LCAuLi5yZXN0XSA9IHBhdGg7XG4gICAgICAgIGlmIChyZXN0Lmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRlbGV0ZShrZXkpO1xuICAgICAgICBjb25zdCBub2RlID0gdGhpcy5nZXQoa2V5LCB0cnVlKTtcbiAgICAgICAgaWYgKGlzQ29sbGVjdGlvbihub2RlKSlcbiAgICAgICAgICAgIHJldHVybiBub2RlLmRlbGV0ZUluKHJlc3QpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIFlBTUwgY29sbGVjdGlvbiBhdCAke2tleX0uIFJlbWFpbmluZyBwYXRoOiAke3Jlc3R9YCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgaXRlbSBhdCBga2V5YCwgb3IgYHVuZGVmaW5lZGAgaWYgbm90IGZvdW5kLiBCeSBkZWZhdWx0IHVud3JhcHNcbiAgICAgKiBzY2FsYXIgdmFsdWVzIGZyb20gdGhlaXIgc3Vycm91bmRpbmcgbm9kZTsgdG8gZGlzYWJsZSBzZXQgYGtlZXBTY2FsYXJgIHRvXG4gICAgICogYHRydWVgIChjb2xsZWN0aW9ucyBhcmUgYWx3YXlzIHJldHVybmVkIGludGFjdCkuXG4gICAgICovXG4gICAgZ2V0SW4ocGF0aCwga2VlcFNjYWxhcikge1xuICAgICAgICBjb25zdCBba2V5LCAuLi5yZXN0XSA9IHBhdGg7XG4gICAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLmdldChrZXksIHRydWUpO1xuICAgICAgICBpZiAocmVzdC5sZW5ndGggPT09IDApXG4gICAgICAgICAgICByZXR1cm4gIWtlZXBTY2FsYXIgJiYgaXNTY2FsYXIobm9kZSkgPyBub2RlLnZhbHVlIDogbm9kZTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIGlzQ29sbGVjdGlvbihub2RlKSA/IG5vZGUuZ2V0SW4ocmVzdCwga2VlcFNjYWxhcikgOiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGhhc0FsbE51bGxWYWx1ZXMoYWxsb3dTY2FsYXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXRlbXMuZXZlcnkobm9kZSA9PiB7XG4gICAgICAgICAgICBpZiAoIWlzUGFpcihub2RlKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBjb25zdCBuID0gbm9kZS52YWx1ZTtcbiAgICAgICAgICAgIHJldHVybiAobiA9PSBudWxsIHx8XG4gICAgICAgICAgICAgICAgKGFsbG93U2NhbGFyICYmXG4gICAgICAgICAgICAgICAgICAgIGlzU2NhbGFyKG4pICYmXG4gICAgICAgICAgICAgICAgICAgIG4udmFsdWUgPT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgICAgICAhbi5jb21tZW50QmVmb3JlICYmXG4gICAgICAgICAgICAgICAgICAgICFuLmNvbW1lbnQgJiZcbiAgICAgICAgICAgICAgICAgICAgIW4udGFnKSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhlIGNvbGxlY3Rpb24gaW5jbHVkZXMgYSB2YWx1ZSB3aXRoIHRoZSBrZXkgYGtleWAuXG4gICAgICovXG4gICAgaGFzSW4ocGF0aCkge1xuICAgICAgICBjb25zdCBba2V5LCAuLi5yZXN0XSA9IHBhdGg7XG4gICAgICAgIGlmIChyZXN0Lmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmhhcyhrZXkpO1xuICAgICAgICBjb25zdCBub2RlID0gdGhpcy5nZXQoa2V5LCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIGlzQ29sbGVjdGlvbihub2RlKSA/IG5vZGUuaGFzSW4ocmVzdCkgOiBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyBhIHZhbHVlIGluIHRoaXMgY29sbGVjdGlvbi4gRm9yIGAhIXNldGAsIGB2YWx1ZWAgbmVlZHMgdG8gYmUgYVxuICAgICAqIGJvb2xlYW4gdG8gYWRkL3JlbW92ZSB0aGUgaXRlbSBmcm9tIHRoZSBzZXQuXG4gICAgICovXG4gICAgc2V0SW4ocGF0aCwgdmFsdWUpIHtcbiAgICAgICAgY29uc3QgW2tleSwgLi4ucmVzdF0gPSBwYXRoO1xuICAgICAgICBpZiAocmVzdC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuZ2V0KGtleSwgdHJ1ZSk7XG4gICAgICAgICAgICBpZiAoaXNDb2xsZWN0aW9uKG5vZGUpKVxuICAgICAgICAgICAgICAgIG5vZGUuc2V0SW4ocmVzdCwgdmFsdWUpO1xuICAgICAgICAgICAgZWxzZSBpZiAobm9kZSA9PT0gdW5kZWZpbmVkICYmIHRoaXMuc2NoZW1hKVxuICAgICAgICAgICAgICAgIHRoaXMuc2V0KGtleSwgY29sbGVjdGlvbkZyb21QYXRoKHRoaXMuc2NoZW1hLCByZXN0LCB2YWx1ZSkpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgWUFNTCBjb2xsZWN0aW9uIGF0ICR7a2V5fS4gUmVtYWluaW5nIHBhdGg6ICR7cmVzdH1gKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IHsgQ29sbGVjdGlvbiwgY29sbGVjdGlvbkZyb21QYXRoLCBpc0VtcHR5UGF0aCB9O1xuIiwiLyoqXG4gKiBTdHJpbmdpZmllcyBhIGNvbW1lbnQuXG4gKlxuICogRW1wdHkgY29tbWVudCBsaW5lcyBhcmUgbGVmdCBlbXB0eSxcbiAqIGxpbmVzIGNvbnNpc3Rpbmcgb2YgYSBzaW5nbGUgc3BhY2UgYXJlIHJlcGxhY2VkIGJ5IGAjYCxcbiAqIGFuZCBhbGwgb3RoZXIgbGluZXMgYXJlIHByZWZpeGVkIHdpdGggYSBgI2AuXG4gKi9cbmNvbnN0IHN0cmluZ2lmeUNvbW1lbnQgPSAoc3RyKSA9PiBzdHIucmVwbGFjZSgvXig/ISQpKD86ICQpPy9nbSwgJyMnKTtcbmZ1bmN0aW9uIGluZGVudENvbW1lbnQoY29tbWVudCwgaW5kZW50KSB7XG4gICAgaWYgKC9eXFxuKyQvLnRlc3QoY29tbWVudCkpXG4gICAgICAgIHJldHVybiBjb21tZW50LnN1YnN0cmluZygxKTtcbiAgICByZXR1cm4gaW5kZW50ID8gY29tbWVudC5yZXBsYWNlKC9eKD8hICokKS9nbSwgaW5kZW50KSA6IGNvbW1lbnQ7XG59XG5jb25zdCBsaW5lQ29tbWVudCA9IChzdHIsIGluZGVudCwgY29tbWVudCkgPT4gc3RyLmVuZHNXaXRoKCdcXG4nKVxuICAgID8gaW5kZW50Q29tbWVudChjb21tZW50LCBpbmRlbnQpXG4gICAgOiBjb21tZW50LmluY2x1ZGVzKCdcXG4nKVxuICAgICAgICA/ICdcXG4nICsgaW5kZW50Q29tbWVudChjb21tZW50LCBpbmRlbnQpXG4gICAgICAgIDogKHN0ci5lbmRzV2l0aCgnICcpID8gJycgOiAnICcpICsgY29tbWVudDtcblxuZXhwb3J0IHsgaW5kZW50Q29tbWVudCwgbGluZUNvbW1lbnQsIHN0cmluZ2lmeUNvbW1lbnQgfTtcbiIsImNvbnN0IEZPTERfRkxPVyA9ICdmbG93JztcbmNvbnN0IEZPTERfQkxPQ0sgPSAnYmxvY2snO1xuY29uc3QgRk9MRF9RVU9URUQgPSAncXVvdGVkJztcbi8qKlxuICogVHJpZXMgdG8ga2VlcCBpbnB1dCBhdCB1cCB0byBgbGluZVdpZHRoYCBjaGFyYWN0ZXJzLCBzcGxpdHRpbmcgb25seSBvbiBzcGFjZXNcbiAqIG5vdCBmb2xsb3dlZCBieSBuZXdsaW5lcyBvciBzcGFjZXMgdW5sZXNzIGBtb2RlYCBpcyBgJ3F1b3RlZCdgLiBMaW5lcyBhcmVcbiAqIHRlcm1pbmF0ZWQgd2l0aCBgXFxuYCBhbmQgc3RhcnRlZCB3aXRoIGBpbmRlbnRgLlxuICovXG5mdW5jdGlvbiBmb2xkRmxvd0xpbmVzKHRleHQsIGluZGVudCwgbW9kZSA9ICdmbG93JywgeyBpbmRlbnRBdFN0YXJ0LCBsaW5lV2lkdGggPSA4MCwgbWluQ29udGVudFdpZHRoID0gMjAsIG9uRm9sZCwgb25PdmVyZmxvdyB9ID0ge30pIHtcbiAgICBpZiAoIWxpbmVXaWR0aCB8fCBsaW5lV2lkdGggPCAwKVxuICAgICAgICByZXR1cm4gdGV4dDtcbiAgICBpZiAobGluZVdpZHRoIDwgbWluQ29udGVudFdpZHRoKVxuICAgICAgICBtaW5Db250ZW50V2lkdGggPSAwO1xuICAgIGNvbnN0IGVuZFN0ZXAgPSBNYXRoLm1heCgxICsgbWluQ29udGVudFdpZHRoLCAxICsgbGluZVdpZHRoIC0gaW5kZW50Lmxlbmd0aCk7XG4gICAgaWYgKHRleHQubGVuZ3RoIDw9IGVuZFN0ZXApXG4gICAgICAgIHJldHVybiB0ZXh0O1xuICAgIGNvbnN0IGZvbGRzID0gW107XG4gICAgY29uc3QgZXNjYXBlZEZvbGRzID0ge307XG4gICAgbGV0IGVuZCA9IGxpbmVXaWR0aCAtIGluZGVudC5sZW5ndGg7XG4gICAgaWYgKHR5cGVvZiBpbmRlbnRBdFN0YXJ0ID09PSAnbnVtYmVyJykge1xuICAgICAgICBpZiAoaW5kZW50QXRTdGFydCA+IGxpbmVXaWR0aCAtIE1hdGgubWF4KDIsIG1pbkNvbnRlbnRXaWR0aCkpXG4gICAgICAgICAgICBmb2xkcy5wdXNoKDApO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBlbmQgPSBsaW5lV2lkdGggLSBpbmRlbnRBdFN0YXJ0O1xuICAgIH1cbiAgICBsZXQgc3BsaXQgPSB1bmRlZmluZWQ7XG4gICAgbGV0IHByZXYgPSB1bmRlZmluZWQ7XG4gICAgbGV0IG92ZXJmbG93ID0gZmFsc2U7XG4gICAgbGV0IGkgPSAtMTtcbiAgICBsZXQgZXNjU3RhcnQgPSAtMTtcbiAgICBsZXQgZXNjRW5kID0gLTE7XG4gICAgaWYgKG1vZGUgPT09IEZPTERfQkxPQ0spIHtcbiAgICAgICAgaSA9IGNvbnN1bWVNb3JlSW5kZW50ZWRMaW5lcyh0ZXh0LCBpLCBpbmRlbnQubGVuZ3RoKTtcbiAgICAgICAgaWYgKGkgIT09IC0xKVxuICAgICAgICAgICAgZW5kID0gaSArIGVuZFN0ZXA7XG4gICAgfVxuICAgIGZvciAobGV0IGNoOyAoY2ggPSB0ZXh0WyhpICs9IDEpXSk7KSB7XG4gICAgICAgIGlmIChtb2RlID09PSBGT0xEX1FVT1RFRCAmJiBjaCA9PT0gJ1xcXFwnKSB7XG4gICAgICAgICAgICBlc2NTdGFydCA9IGk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRleHRbaSArIDFdKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAneCc6XG4gICAgICAgICAgICAgICAgICAgIGkgKz0gMztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAndSc6XG4gICAgICAgICAgICAgICAgICAgIGkgKz0gNTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnVSc6XG4gICAgICAgICAgICAgICAgICAgIGkgKz0gOTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZXNjRW5kID0gaTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2ggPT09ICdcXG4nKSB7XG4gICAgICAgICAgICBpZiAobW9kZSA9PT0gRk9MRF9CTE9DSylcbiAgICAgICAgICAgICAgICBpID0gY29uc3VtZU1vcmVJbmRlbnRlZExpbmVzKHRleHQsIGksIGluZGVudC5sZW5ndGgpO1xuICAgICAgICAgICAgZW5kID0gaSArIGluZGVudC5sZW5ndGggKyBlbmRTdGVwO1xuICAgICAgICAgICAgc3BsaXQgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoY2ggPT09ICcgJyAmJlxuICAgICAgICAgICAgICAgIHByZXYgJiZcbiAgICAgICAgICAgICAgICBwcmV2ICE9PSAnICcgJiZcbiAgICAgICAgICAgICAgICBwcmV2ICE9PSAnXFxuJyAmJlxuICAgICAgICAgICAgICAgIHByZXYgIT09ICdcXHQnKSB7XG4gICAgICAgICAgICAgICAgLy8gc3BhY2Ugc3Vycm91bmRlZCBieSBub24tc3BhY2UgY2FuIGJlIHJlcGxhY2VkIHdpdGggbmV3bGluZSArIGluZGVudFxuICAgICAgICAgICAgICAgIGNvbnN0IG5leHQgPSB0ZXh0W2kgKyAxXTtcbiAgICAgICAgICAgICAgICBpZiAobmV4dCAmJiBuZXh0ICE9PSAnICcgJiYgbmV4dCAhPT0gJ1xcbicgJiYgbmV4dCAhPT0gJ1xcdCcpXG4gICAgICAgICAgICAgICAgICAgIHNwbGl0ID0gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpID49IGVuZCkge1xuICAgICAgICAgICAgICAgIGlmIChzcGxpdCkge1xuICAgICAgICAgICAgICAgICAgICBmb2xkcy5wdXNoKHNwbGl0KTtcbiAgICAgICAgICAgICAgICAgICAgZW5kID0gc3BsaXQgKyBlbmRTdGVwO1xuICAgICAgICAgICAgICAgICAgICBzcGxpdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobW9kZSA9PT0gRk9MRF9RVU9URUQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gd2hpdGUtc3BhY2UgY29sbGVjdGVkIGF0IGVuZCBtYXkgc3RyZXRjaCBwYXN0IGxpbmVXaWR0aFxuICAgICAgICAgICAgICAgICAgICB3aGlsZSAocHJldiA9PT0gJyAnIHx8IHByZXYgPT09ICdcXHQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmV2ID0gY2g7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaCA9IHRleHRbKGkgKz0gMSldO1xuICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3cgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIEFjY291bnQgZm9yIG5ld2xpbmUgZXNjYXBlLCBidXQgZG9uJ3QgYnJlYWsgcHJlY2VkaW5nIGVzY2FwZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBqID0gaSA+IGVzY0VuZCArIDEgPyBpIC0gMiA6IGVzY1N0YXJ0IC0gMTtcbiAgICAgICAgICAgICAgICAgICAgLy8gQmFpbCBvdXQgaWYgbGluZVdpZHRoICYgbWluQ29udGVudFdpZHRoIGFyZSBzaG9ydGVyIHRoYW4gYW4gZXNjYXBlIHN0cmluZ1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXNjYXBlZEZvbGRzW2pdKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgICAgICAgICAgICAgICAgIGZvbGRzLnB1c2goaik7XG4gICAgICAgICAgICAgICAgICAgIGVzY2FwZWRGb2xkc1tqXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGVuZCA9IGogKyBlbmRTdGVwO1xuICAgICAgICAgICAgICAgICAgICBzcGxpdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG92ZXJmbG93ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcHJldiA9IGNoO1xuICAgIH1cbiAgICBpZiAob3ZlcmZsb3cgJiYgb25PdmVyZmxvdylcbiAgICAgICAgb25PdmVyZmxvdygpO1xuICAgIGlmIChmb2xkcy5sZW5ndGggPT09IDApXG4gICAgICAgIHJldHVybiB0ZXh0O1xuICAgIGlmIChvbkZvbGQpXG4gICAgICAgIG9uRm9sZCgpO1xuICAgIGxldCByZXMgPSB0ZXh0LnNsaWNlKDAsIGZvbGRzWzBdKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZvbGRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNvbnN0IGZvbGQgPSBmb2xkc1tpXTtcbiAgICAgICAgY29uc3QgZW5kID0gZm9sZHNbaSArIDFdIHx8IHRleHQubGVuZ3RoO1xuICAgICAgICBpZiAoZm9sZCA9PT0gMClcbiAgICAgICAgICAgIHJlcyA9IGBcXG4ke2luZGVudH0ke3RleHQuc2xpY2UoMCwgZW5kKX1gO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChtb2RlID09PSBGT0xEX1FVT1RFRCAmJiBlc2NhcGVkRm9sZHNbZm9sZF0pXG4gICAgICAgICAgICAgICAgcmVzICs9IGAke3RleHRbZm9sZF19XFxcXGA7XG4gICAgICAgICAgICByZXMgKz0gYFxcbiR7aW5kZW50fSR7dGV4dC5zbGljZShmb2xkICsgMSwgZW5kKX1gO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG4vKipcbiAqIFByZXN1bWVzIGBpICsgMWAgaXMgYXQgdGhlIHN0YXJ0IG9mIGEgbGluZVxuICogQHJldHVybnMgaW5kZXggb2YgbGFzdCBuZXdsaW5lIGluIG1vcmUtaW5kZW50ZWQgYmxvY2tcbiAqL1xuZnVuY3Rpb24gY29uc3VtZU1vcmVJbmRlbnRlZExpbmVzKHRleHQsIGksIGluZGVudCkge1xuICAgIGxldCBlbmQgPSBpO1xuICAgIGxldCBzdGFydCA9IGkgKyAxO1xuICAgIGxldCBjaCA9IHRleHRbc3RhcnRdO1xuICAgIHdoaWxlIChjaCA9PT0gJyAnIHx8IGNoID09PSAnXFx0Jykge1xuICAgICAgICBpZiAoaSA8IHN0YXJ0ICsgaW5kZW50KSB7XG4gICAgICAgICAgICBjaCA9IHRleHRbKytpXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICBjaCA9IHRleHRbKytpXTtcbiAgICAgICAgICAgIH0gd2hpbGUgKGNoICYmIGNoICE9PSAnXFxuJyk7XG4gICAgICAgICAgICBlbmQgPSBpO1xuICAgICAgICAgICAgc3RhcnQgPSBpICsgMTtcbiAgICAgICAgICAgIGNoID0gdGV4dFtzdGFydF07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGVuZDtcbn1cblxuZXhwb3J0IHsgRk9MRF9CTE9DSywgRk9MRF9GTE9XLCBGT0xEX1FVT1RFRCwgZm9sZEZsb3dMaW5lcyB9O1xuIiwiaW1wb3J0IHsgU2NhbGFyIH0gZnJvbSAnLi4vbm9kZXMvU2NhbGFyLmpzJztcbmltcG9ydCB7IGZvbGRGbG93TGluZXMsIEZPTERfRkxPVywgRk9MRF9RVU9URUQsIEZPTERfQkxPQ0sgfSBmcm9tICcuL2ZvbGRGbG93TGluZXMuanMnO1xuXG5jb25zdCBnZXRGb2xkT3B0aW9ucyA9IChjdHgsIGlzQmxvY2spID0+ICh7XG4gICAgaW5kZW50QXRTdGFydDogaXNCbG9jayA/IGN0eC5pbmRlbnQubGVuZ3RoIDogY3R4LmluZGVudEF0U3RhcnQsXG4gICAgbGluZVdpZHRoOiBjdHgub3B0aW9ucy5saW5lV2lkdGgsXG4gICAgbWluQ29udGVudFdpZHRoOiBjdHgub3B0aW9ucy5taW5Db250ZW50V2lkdGhcbn0pO1xuLy8gQWxzbyBjaGVja3MgZm9yIGxpbmVzIHN0YXJ0aW5nIHdpdGggJSwgYXMgcGFyc2luZyB0aGUgb3V0cHV0IGFzIFlBTUwgMS4xIHdpbGxcbi8vIHByZXN1bWUgdGhhdCdzIHN0YXJ0aW5nIGEgbmV3IGRvY3VtZW50LlxuY29uc3QgY29udGFpbnNEb2N1bWVudE1hcmtlciA9IChzdHIpID0+IC9eKCV8LS0tfFxcLlxcLlxcLikvbS50ZXN0KHN0cik7XG5mdW5jdGlvbiBsaW5lTGVuZ3RoT3ZlckxpbWl0KHN0ciwgbGluZVdpZHRoLCBpbmRlbnRMZW5ndGgpIHtcbiAgICBpZiAoIWxpbmVXaWR0aCB8fCBsaW5lV2lkdGggPCAwKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgbGltaXQgPSBsaW5lV2lkdGggLSBpbmRlbnRMZW5ndGg7XG4gICAgY29uc3Qgc3RyTGVuID0gc3RyLmxlbmd0aDtcbiAgICBpZiAoc3RyTGVuIDw9IGxpbWl0KVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDAsIHN0YXJ0ID0gMDsgaSA8IHN0ckxlbjsgKytpKSB7XG4gICAgICAgIGlmIChzdHJbaV0gPT09ICdcXG4nKSB7XG4gICAgICAgICAgICBpZiAoaSAtIHN0YXJ0ID4gbGltaXQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBzdGFydCA9IGkgKyAxO1xuICAgICAgICAgICAgaWYgKHN0ckxlbiAtIHN0YXJ0IDw9IGxpbWl0KVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIGRvdWJsZVF1b3RlZFN0cmluZyh2YWx1ZSwgY3R4KSB7XG4gICAgY29uc3QganNvbiA9IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICBpZiAoY3R4Lm9wdGlvbnMuZG91YmxlUXVvdGVkQXNKU09OKVxuICAgICAgICByZXR1cm4ganNvbjtcbiAgICBjb25zdCB7IGltcGxpY2l0S2V5IH0gPSBjdHg7XG4gICAgY29uc3QgbWluTXVsdGlMaW5lTGVuZ3RoID0gY3R4Lm9wdGlvbnMuZG91YmxlUXVvdGVkTWluTXVsdGlMaW5lTGVuZ3RoO1xuICAgIGNvbnN0IGluZGVudCA9IGN0eC5pbmRlbnQgfHwgKGNvbnRhaW5zRG9jdW1lbnRNYXJrZXIodmFsdWUpID8gJyAgJyA6ICcnKTtcbiAgICBsZXQgc3RyID0gJyc7XG4gICAgbGV0IHN0YXJ0ID0gMDtcbiAgICBmb3IgKGxldCBpID0gMCwgY2ggPSBqc29uW2ldOyBjaDsgY2ggPSBqc29uWysraV0pIHtcbiAgICAgICAgaWYgKGNoID09PSAnICcgJiYganNvbltpICsgMV0gPT09ICdcXFxcJyAmJiBqc29uW2kgKyAyXSA9PT0gJ24nKSB7XG4gICAgICAgICAgICAvLyBzcGFjZSBiZWZvcmUgbmV3bGluZSBuZWVkcyB0byBiZSBlc2NhcGVkIHRvIG5vdCBiZSBmb2xkZWRcbiAgICAgICAgICAgIHN0ciArPSBqc29uLnNsaWNlKHN0YXJ0LCBpKSArICdcXFxcICc7XG4gICAgICAgICAgICBpICs9IDE7XG4gICAgICAgICAgICBzdGFydCA9IGk7XG4gICAgICAgICAgICBjaCA9ICdcXFxcJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2ggPT09ICdcXFxcJylcbiAgICAgICAgICAgIHN3aXRjaCAoanNvbltpICsgMV0pIHtcbiAgICAgICAgICAgICAgICBjYXNlICd1JzpcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IGpzb24uc2xpY2Uoc3RhcnQsIGkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29kZSA9IGpzb24uc3Vic3RyKGkgKyAyLCA0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoY29kZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzAwMDAnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gJ1xcXFwwJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnMDAwNyc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSAnXFxcXGEnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcwMDBiJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9ICdcXFxcdic7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzAwMWInOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gJ1xcXFxlJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnMDA4NSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSAnXFxcXE4nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcwMGEwJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9ICdcXFxcXyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzIwMjgnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gJ1xcXFxMJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnMjAyOSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSAnXFxcXFAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZS5zdWJzdHIoMCwgMikgPT09ICcwMCcpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gJ1xcXFx4JyArIGNvZGUuc3Vic3RyKDIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0ganNvbi5zdWJzdHIoaSwgNik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpICs9IDU7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IGkgKyAxO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ24nOlxuICAgICAgICAgICAgICAgICAgICBpZiAoaW1wbGljaXRLZXkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGpzb25baSArIDJdID09PSAnXCInIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBqc29uLmxlbmd0aCA8IG1pbk11bHRpTGluZUxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9sZGluZyB3aWxsIGVhdCBmaXJzdCBuZXdsaW5lXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0ganNvbi5zbGljZShzdGFydCwgaSkgKyAnXFxuXFxuJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChqc29uW2kgKyAyXSA9PT0gJ1xcXFwnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAganNvbltpICsgM10gPT09ICduJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzb25baSArIDRdICE9PSAnXCInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9ICdcXG4nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgKz0gMjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBpbmRlbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzcGFjZSBhZnRlciBuZXdsaW5lIG5lZWRzIHRvIGJlIGVzY2FwZWQgdG8gbm90IGJlIGZvbGRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpzb25baSArIDJdID09PSAnICcpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9ICdcXFxcJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGkgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gaSArIDE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICAgICAgfVxuICAgIH1cbiAgICBzdHIgPSBzdGFydCA/IHN0ciArIGpzb24uc2xpY2Uoc3RhcnQpIDoganNvbjtcbiAgICByZXR1cm4gaW1wbGljaXRLZXlcbiAgICAgICAgPyBzdHJcbiAgICAgICAgOiBmb2xkRmxvd0xpbmVzKHN0ciwgaW5kZW50LCBGT0xEX1FVT1RFRCwgZ2V0Rm9sZE9wdGlvbnMoY3R4LCBmYWxzZSkpO1xufVxuZnVuY3Rpb24gc2luZ2xlUXVvdGVkU3RyaW5nKHZhbHVlLCBjdHgpIHtcbiAgICBpZiAoY3R4Lm9wdGlvbnMuc2luZ2xlUXVvdGUgPT09IGZhbHNlIHx8XG4gICAgICAgIChjdHguaW1wbGljaXRLZXkgJiYgdmFsdWUuaW5jbHVkZXMoJ1xcbicpKSB8fFxuICAgICAgICAvWyBcXHRdXFxufFxcblsgXFx0XS8udGVzdCh2YWx1ZSkgLy8gc2luZ2xlIHF1b3RlZCBzdHJpbmcgY2FuJ3QgaGF2ZSBsZWFkaW5nIG9yIHRyYWlsaW5nIHdoaXRlc3BhY2UgYXJvdW5kIG5ld2xpbmVcbiAgICApXG4gICAgICAgIHJldHVybiBkb3VibGVRdW90ZWRTdHJpbmcodmFsdWUsIGN0eCk7XG4gICAgY29uc3QgaW5kZW50ID0gY3R4LmluZGVudCB8fCAoY29udGFpbnNEb2N1bWVudE1hcmtlcih2YWx1ZSkgPyAnICAnIDogJycpO1xuICAgIGNvbnN0IHJlcyA9IFwiJ1wiICsgdmFsdWUucmVwbGFjZSgvJy9nLCBcIicnXCIpLnJlcGxhY2UoL1xcbisvZywgYCQmXFxuJHtpbmRlbnR9YCkgKyBcIidcIjtcbiAgICByZXR1cm4gY3R4LmltcGxpY2l0S2V5XG4gICAgICAgID8gcmVzXG4gICAgICAgIDogZm9sZEZsb3dMaW5lcyhyZXMsIGluZGVudCwgRk9MRF9GTE9XLCBnZXRGb2xkT3B0aW9ucyhjdHgsIGZhbHNlKSk7XG59XG5mdW5jdGlvbiBxdW90ZWRTdHJpbmcodmFsdWUsIGN0eCkge1xuICAgIGNvbnN0IHsgc2luZ2xlUXVvdGUgfSA9IGN0eC5vcHRpb25zO1xuICAgIGxldCBxcztcbiAgICBpZiAoc2luZ2xlUXVvdGUgPT09IGZhbHNlKVxuICAgICAgICBxcyA9IGRvdWJsZVF1b3RlZFN0cmluZztcbiAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgaGFzRG91YmxlID0gdmFsdWUuaW5jbHVkZXMoJ1wiJyk7XG4gICAgICAgIGNvbnN0IGhhc1NpbmdsZSA9IHZhbHVlLmluY2x1ZGVzKFwiJ1wiKTtcbiAgICAgICAgaWYgKGhhc0RvdWJsZSAmJiAhaGFzU2luZ2xlKVxuICAgICAgICAgICAgcXMgPSBzaW5nbGVRdW90ZWRTdHJpbmc7XG4gICAgICAgIGVsc2UgaWYgKGhhc1NpbmdsZSAmJiAhaGFzRG91YmxlKVxuICAgICAgICAgICAgcXMgPSBkb3VibGVRdW90ZWRTdHJpbmc7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHFzID0gc2luZ2xlUXVvdGUgPyBzaW5nbGVRdW90ZWRTdHJpbmcgOiBkb3VibGVRdW90ZWRTdHJpbmc7XG4gICAgfVxuICAgIHJldHVybiBxcyh2YWx1ZSwgY3R4KTtcbn1cbi8vIFRoZSBuZWdhdGl2ZSBsb29rYmVoaW5kIGF2b2lkcyBhIHBvbHlub21pYWwgc2VhcmNoLFxuLy8gYnV0IGlzbid0IHN1cHBvcnRlZCB5ZXQgb24gU2FmYXJpOiBodHRwczovL2Nhbml1c2UuY29tL2pzLXJlZ2V4cC1sb29rYmVoaW5kXG5sZXQgYmxvY2tFbmROZXdsaW5lcztcbnRyeSB7XG4gICAgYmxvY2tFbmROZXdsaW5lcyA9IG5ldyBSZWdFeHAoJyhefCg/PCFcXG4pKVxcbisoPyFcXG58JCknLCAnZycpO1xufVxuY2F0Y2gge1xuICAgIGJsb2NrRW5kTmV3bGluZXMgPSAvXFxuKyg/IVxcbnwkKS9nO1xufVxuZnVuY3Rpb24gYmxvY2tTdHJpbmcoeyBjb21tZW50LCB0eXBlLCB2YWx1ZSB9LCBjdHgsIG9uQ29tbWVudCwgb25DaG9tcEtlZXApIHtcbiAgICBjb25zdCB7IGJsb2NrUXVvdGUsIGNvbW1lbnRTdHJpbmcsIGxpbmVXaWR0aCB9ID0gY3R4Lm9wdGlvbnM7XG4gICAgLy8gMS4gQmxvY2sgY2FuJ3QgZW5kIGluIHdoaXRlc3BhY2UgdW5sZXNzIHRoZSBsYXN0IGxpbmUgaXMgbm9uLWVtcHR5LlxuICAgIC8vIDIuIFN0cmluZ3MgY29uc2lzdGluZyBvZiBvbmx5IHdoaXRlc3BhY2UgYXJlIGJlc3QgcmVuZGVyZWQgZXhwbGljaXRseS5cbiAgICBpZiAoIWJsb2NrUXVvdGUgfHwgL1xcbltcXHQgXSskLy50ZXN0KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gcXVvdGVkU3RyaW5nKHZhbHVlLCBjdHgpO1xuICAgIH1cbiAgICBjb25zdCBpbmRlbnQgPSBjdHguaW5kZW50IHx8XG4gICAgICAgIChjdHguZm9yY2VCbG9ja0luZGVudCB8fCBjb250YWluc0RvY3VtZW50TWFya2VyKHZhbHVlKSA/ICcgICcgOiAnJyk7XG4gICAgY29uc3QgbGl0ZXJhbCA9IGJsb2NrUXVvdGUgPT09ICdsaXRlcmFsJ1xuICAgICAgICA/IHRydWVcbiAgICAgICAgOiBibG9ja1F1b3RlID09PSAnZm9sZGVkJyB8fCB0eXBlID09PSBTY2FsYXIuQkxPQ0tfRk9MREVEXG4gICAgICAgICAgICA/IGZhbHNlXG4gICAgICAgICAgICA6IHR5cGUgPT09IFNjYWxhci5CTE9DS19MSVRFUkFMXG4gICAgICAgICAgICAgICAgPyB0cnVlXG4gICAgICAgICAgICAgICAgOiAhbGluZUxlbmd0aE92ZXJMaW1pdCh2YWx1ZSwgbGluZVdpZHRoLCBpbmRlbnQubGVuZ3RoKTtcbiAgICBpZiAoIXZhbHVlKVxuICAgICAgICByZXR1cm4gbGl0ZXJhbCA/ICd8XFxuJyA6ICc+XFxuJztcbiAgICAvLyBkZXRlcm1pbmUgY2hvbXBpbmcgZnJvbSB3aGl0ZXNwYWNlIGF0IHZhbHVlIGVuZFxuICAgIGxldCBjaG9tcDtcbiAgICBsZXQgZW5kU3RhcnQ7XG4gICAgZm9yIChlbmRTdGFydCA9IHZhbHVlLmxlbmd0aDsgZW5kU3RhcnQgPiAwOyAtLWVuZFN0YXJ0KSB7XG4gICAgICAgIGNvbnN0IGNoID0gdmFsdWVbZW5kU3RhcnQgLSAxXTtcbiAgICAgICAgaWYgKGNoICE9PSAnXFxuJyAmJiBjaCAhPT0gJ1xcdCcgJiYgY2ggIT09ICcgJylcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBsZXQgZW5kID0gdmFsdWUuc3Vic3RyaW5nKGVuZFN0YXJ0KTtcbiAgICBjb25zdCBlbmRObFBvcyA9IGVuZC5pbmRleE9mKCdcXG4nKTtcbiAgICBpZiAoZW5kTmxQb3MgPT09IC0xKSB7XG4gICAgICAgIGNob21wID0gJy0nOyAvLyBzdHJpcFxuICAgIH1cbiAgICBlbHNlIGlmICh2YWx1ZSA9PT0gZW5kIHx8IGVuZE5sUG9zICE9PSBlbmQubGVuZ3RoIC0gMSkge1xuICAgICAgICBjaG9tcCA9ICcrJzsgLy8ga2VlcFxuICAgICAgICBpZiAob25DaG9tcEtlZXApXG4gICAgICAgICAgICBvbkNob21wS2VlcCgpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY2hvbXAgPSAnJzsgLy8gY2xpcFxuICAgIH1cbiAgICBpZiAoZW5kKSB7XG4gICAgICAgIHZhbHVlID0gdmFsdWUuc2xpY2UoMCwgLWVuZC5sZW5ndGgpO1xuICAgICAgICBpZiAoZW5kW2VuZC5sZW5ndGggLSAxXSA9PT0gJ1xcbicpXG4gICAgICAgICAgICBlbmQgPSBlbmQuc2xpY2UoMCwgLTEpO1xuICAgICAgICBlbmQgPSBlbmQucmVwbGFjZShibG9ja0VuZE5ld2xpbmVzLCBgJCYke2luZGVudH1gKTtcbiAgICB9XG4gICAgLy8gZGV0ZXJtaW5lIGluZGVudCBpbmRpY2F0b3IgZnJvbSB3aGl0ZXNwYWNlIGF0IHZhbHVlIHN0YXJ0XG4gICAgbGV0IHN0YXJ0V2l0aFNwYWNlID0gZmFsc2U7XG4gICAgbGV0IHN0YXJ0RW5kO1xuICAgIGxldCBzdGFydE5sUG9zID0gLTE7XG4gICAgZm9yIChzdGFydEVuZCA9IDA7IHN0YXJ0RW5kIDwgdmFsdWUubGVuZ3RoOyArK3N0YXJ0RW5kKSB7XG4gICAgICAgIGNvbnN0IGNoID0gdmFsdWVbc3RhcnRFbmRdO1xuICAgICAgICBpZiAoY2ggPT09ICcgJylcbiAgICAgICAgICAgIHN0YXJ0V2l0aFNwYWNlID0gdHJ1ZTtcbiAgICAgICAgZWxzZSBpZiAoY2ggPT09ICdcXG4nKVxuICAgICAgICAgICAgc3RhcnRObFBvcyA9IHN0YXJ0RW5kO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG4gICAgbGV0IHN0YXJ0ID0gdmFsdWUuc3Vic3RyaW5nKDAsIHN0YXJ0TmxQb3MgPCBzdGFydEVuZCA/IHN0YXJ0TmxQb3MgKyAxIDogc3RhcnRFbmQpO1xuICAgIGlmIChzdGFydCkge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlLnN1YnN0cmluZyhzdGFydC5sZW5ndGgpO1xuICAgICAgICBzdGFydCA9IHN0YXJ0LnJlcGxhY2UoL1xcbisvZywgYCQmJHtpbmRlbnR9YCk7XG4gICAgfVxuICAgIGNvbnN0IGluZGVudFNpemUgPSBpbmRlbnQgPyAnMicgOiAnMSc7IC8vIHJvb3QgaXMgYXQgLTFcbiAgICAvLyBMZWFkaW5nIHwgb3IgPiBpcyBhZGRlZCBsYXRlclxuICAgIGxldCBoZWFkZXIgPSAoc3RhcnRXaXRoU3BhY2UgPyBpbmRlbnRTaXplIDogJycpICsgY2hvbXA7XG4gICAgaWYgKGNvbW1lbnQpIHtcbiAgICAgICAgaGVhZGVyICs9ICcgJyArIGNvbW1lbnRTdHJpbmcoY29tbWVudC5yZXBsYWNlKC8gP1tcXHJcXG5dKy9nLCAnICcpKTtcbiAgICAgICAgaWYgKG9uQ29tbWVudClcbiAgICAgICAgICAgIG9uQ29tbWVudCgpO1xuICAgIH1cbiAgICBpZiAoIWxpdGVyYWwpIHtcbiAgICAgICAgY29uc3QgZm9sZGVkVmFsdWUgPSB2YWx1ZVxuICAgICAgICAgICAgLnJlcGxhY2UoL1xcbisvZywgJ1xcbiQmJylcbiAgICAgICAgICAgIC5yZXBsYWNlKC8oPzpefFxcbikoW1xcdCBdLiopKD86KFtcXG5cXHQgXSopXFxuKD8hW1xcblxcdCBdKSk/L2csICckMSQyJykgLy8gbW9yZS1pbmRlbnRlZCBsaW5lcyBhcmVuJ3QgZm9sZGVkXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICBeIG1vcmUtaW5kLiBeIGVtcHR5ICAgICBeIGNhcHR1cmUgbmV4dCBlbXB0eSBsaW5lcyBvbmx5IGF0IGVuZCBvZiBpbmRlbnRcbiAgICAgICAgICAgIC5yZXBsYWNlKC9cXG4rL2csIGAkJiR7aW5kZW50fWApO1xuICAgICAgICBsZXQgbGl0ZXJhbEZhbGxiYWNrID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IGZvbGRPcHRpb25zID0gZ2V0Rm9sZE9wdGlvbnMoY3R4LCB0cnVlKTtcbiAgICAgICAgaWYgKGJsb2NrUXVvdGUgIT09ICdmb2xkZWQnICYmIHR5cGUgIT09IFNjYWxhci5CTE9DS19GT0xERUQpIHtcbiAgICAgICAgICAgIGZvbGRPcHRpb25zLm9uT3ZlcmZsb3cgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgbGl0ZXJhbEZhbGxiYWNrID0gdHJ1ZTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYm9keSA9IGZvbGRGbG93TGluZXMoYCR7c3RhcnR9JHtmb2xkZWRWYWx1ZX0ke2VuZH1gLCBpbmRlbnQsIEZPTERfQkxPQ0ssIGZvbGRPcHRpb25zKTtcbiAgICAgICAgaWYgKCFsaXRlcmFsRmFsbGJhY2spXG4gICAgICAgICAgICByZXR1cm4gYD4ke2hlYWRlcn1cXG4ke2luZGVudH0ke2JvZHl9YDtcbiAgICB9XG4gICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9cXG4rL2csIGAkJiR7aW5kZW50fWApO1xuICAgIHJldHVybiBgfCR7aGVhZGVyfVxcbiR7aW5kZW50fSR7c3RhcnR9JHt2YWx1ZX0ke2VuZH1gO1xufVxuZnVuY3Rpb24gcGxhaW5TdHJpbmcoaXRlbSwgY3R4LCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKSB7XG4gICAgY29uc3QgeyB0eXBlLCB2YWx1ZSB9ID0gaXRlbTtcbiAgICBjb25zdCB7IGFjdHVhbFN0cmluZywgaW1wbGljaXRLZXksIGluZGVudCwgaW5kZW50U3RlcCwgaW5GbG93IH0gPSBjdHg7XG4gICAgaWYgKChpbXBsaWNpdEtleSAmJiB2YWx1ZS5pbmNsdWRlcygnXFxuJykpIHx8XG4gICAgICAgIChpbkZsb3cgJiYgL1tbXFxde30sXS8udGVzdCh2YWx1ZSkpKSB7XG4gICAgICAgIHJldHVybiBxdW90ZWRTdHJpbmcodmFsdWUsIGN0eCk7XG4gICAgfVxuICAgIGlmICgvXltcXG5cXHQgLFtcXF17fSMmKiF8PidcIiVAYF18Xls/LV0kfF5bPy1dWyBcXHRdfFtcXG46XVsgXFx0XXxbIFxcdF1cXG58W1xcblxcdCBdI3xbXFxuXFx0IDpdJC8udGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgLy8gbm90IGFsbG93ZWQ6XG4gICAgICAgIC8vIC0gJy0nIG9yICc/J1xuICAgICAgICAvLyAtIHN0YXJ0IHdpdGggYW4gaW5kaWNhdG9yIGNoYXJhY3RlciAoZXhjZXB0IFs/Oi1dKSBvciAvWz8tXSAvXG4gICAgICAgIC8vIC0gJ1xcbiAnLCAnOiAnIG9yICcgXFxuJyBhbnl3aGVyZVxuICAgICAgICAvLyAtICcjJyBub3QgcHJlY2VkZWQgYnkgYSBub24tc3BhY2UgY2hhclxuICAgICAgICAvLyAtIGVuZCB3aXRoICcgJyBvciAnOidcbiAgICAgICAgcmV0dXJuIGltcGxpY2l0S2V5IHx8IGluRmxvdyB8fCAhdmFsdWUuaW5jbHVkZXMoJ1xcbicpXG4gICAgICAgICAgICA/IHF1b3RlZFN0cmluZyh2YWx1ZSwgY3R4KVxuICAgICAgICAgICAgOiBibG9ja1N0cmluZyhpdGVtLCBjdHgsIG9uQ29tbWVudCwgb25DaG9tcEtlZXApO1xuICAgIH1cbiAgICBpZiAoIWltcGxpY2l0S2V5ICYmXG4gICAgICAgICFpbkZsb3cgJiZcbiAgICAgICAgdHlwZSAhPT0gU2NhbGFyLlBMQUlOICYmXG4gICAgICAgIHZhbHVlLmluY2x1ZGVzKCdcXG4nKSkge1xuICAgICAgICAvLyBXaGVyZSBhbGxvd2VkICYgdHlwZSBub3Qgc2V0IGV4cGxpY2l0bHksIHByZWZlciBibG9jayBzdHlsZSBmb3IgbXVsdGlsaW5lIHN0cmluZ3NcbiAgICAgICAgcmV0dXJuIGJsb2NrU3RyaW5nKGl0ZW0sIGN0eCwgb25Db21tZW50LCBvbkNob21wS2VlcCk7XG4gICAgfVxuICAgIGlmIChjb250YWluc0RvY3VtZW50TWFya2VyKHZhbHVlKSkge1xuICAgICAgICBpZiAoaW5kZW50ID09PSAnJykge1xuICAgICAgICAgICAgY3R4LmZvcmNlQmxvY2tJbmRlbnQgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIGJsb2NrU3RyaW5nKGl0ZW0sIGN0eCwgb25Db21tZW50LCBvbkNob21wS2VlcCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaW1wbGljaXRLZXkgJiYgaW5kZW50ID09PSBpbmRlbnRTdGVwKSB7XG4gICAgICAgICAgICByZXR1cm4gcXVvdGVkU3RyaW5nKHZhbHVlLCBjdHgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHN0ciA9IHZhbHVlLnJlcGxhY2UoL1xcbisvZywgYCQmXFxuJHtpbmRlbnR9YCk7XG4gICAgLy8gVmVyaWZ5IHRoYXQgb3V0cHV0IHdpbGwgYmUgcGFyc2VkIGFzIGEgc3RyaW5nLCBhcyBlLmcuIHBsYWluIG51bWJlcnMgYW5kXG4gICAgLy8gYm9vbGVhbnMgZ2V0IHBhcnNlZCB3aXRoIHRob3NlIHR5cGVzIGluIHYxLjIgKGUuZy4gJzQyJywgJ3RydWUnICYgJzAuOWUtMycpLFxuICAgIC8vIGFuZCBvdGhlcnMgaW4gdjEuMS5cbiAgICBpZiAoYWN0dWFsU3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHRlc3QgPSAodGFnKSA9PiB0YWcuZGVmYXVsdCAmJiB0YWcudGFnICE9PSAndGFnOnlhbWwub3JnLDIwMDI6c3RyJyAmJiB0YWcudGVzdD8udGVzdChzdHIpO1xuICAgICAgICBjb25zdCB7IGNvbXBhdCwgdGFncyB9ID0gY3R4LmRvYy5zY2hlbWE7XG4gICAgICAgIGlmICh0YWdzLnNvbWUodGVzdCkgfHwgY29tcGF0Py5zb21lKHRlc3QpKVxuICAgICAgICAgICAgcmV0dXJuIHF1b3RlZFN0cmluZyh2YWx1ZSwgY3R4KTtcbiAgICB9XG4gICAgcmV0dXJuIGltcGxpY2l0S2V5XG4gICAgICAgID8gc3RyXG4gICAgICAgIDogZm9sZEZsb3dMaW5lcyhzdHIsIGluZGVudCwgRk9MRF9GTE9XLCBnZXRGb2xkT3B0aW9ucyhjdHgsIGZhbHNlKSk7XG59XG5mdW5jdGlvbiBzdHJpbmdpZnlTdHJpbmcoaXRlbSwgY3R4LCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKSB7XG4gICAgY29uc3QgeyBpbXBsaWNpdEtleSwgaW5GbG93IH0gPSBjdHg7XG4gICAgY29uc3Qgc3MgPSB0eXBlb2YgaXRlbS52YWx1ZSA9PT0gJ3N0cmluZydcbiAgICAgICAgPyBpdGVtXG4gICAgICAgIDogT2JqZWN0LmFzc2lnbih7fSwgaXRlbSwgeyB2YWx1ZTogU3RyaW5nKGl0ZW0udmFsdWUpIH0pO1xuICAgIGxldCB7IHR5cGUgfSA9IGl0ZW07XG4gICAgaWYgKHR5cGUgIT09IFNjYWxhci5RVU9URV9ET1VCTEUpIHtcbiAgICAgICAgLy8gZm9yY2UgZG91YmxlIHF1b3RlcyBvbiBjb250cm9sIGNoYXJhY3RlcnMgJiB1bnBhaXJlZCBzdXJyb2dhdGVzXG4gICAgICAgIGlmICgvW1xceDAwLVxceDA4XFx4MGItXFx4MWZcXHg3Zi1cXHg5ZlxcdXtEODAwfS1cXHV7REZGRn1dL3UudGVzdChzcy52YWx1ZSkpXG4gICAgICAgICAgICB0eXBlID0gU2NhbGFyLlFVT1RFX0RPVUJMRTtcbiAgICB9XG4gICAgY29uc3QgX3N0cmluZ2lmeSA9IChfdHlwZSkgPT4ge1xuICAgICAgICBzd2l0Y2ggKF90eXBlKSB7XG4gICAgICAgICAgICBjYXNlIFNjYWxhci5CTE9DS19GT0xERUQ6XG4gICAgICAgICAgICBjYXNlIFNjYWxhci5CTE9DS19MSVRFUkFMOlxuICAgICAgICAgICAgICAgIHJldHVybiBpbXBsaWNpdEtleSB8fCBpbkZsb3dcbiAgICAgICAgICAgICAgICAgICAgPyBxdW90ZWRTdHJpbmcoc3MudmFsdWUsIGN0eCkgLy8gYmxvY2tzIGFyZSBub3QgdmFsaWQgaW5zaWRlIGZsb3cgY29udGFpbmVyc1xuICAgICAgICAgICAgICAgICAgICA6IGJsb2NrU3RyaW5nKHNzLCBjdHgsIG9uQ29tbWVudCwgb25DaG9tcEtlZXApO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXIuUVVPVEVfRE9VQkxFOlxuICAgICAgICAgICAgICAgIHJldHVybiBkb3VibGVRdW90ZWRTdHJpbmcoc3MudmFsdWUsIGN0eCk7XG4gICAgICAgICAgICBjYXNlIFNjYWxhci5RVU9URV9TSU5HTEU6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNpbmdsZVF1b3RlZFN0cmluZyhzcy52YWx1ZSwgY3R4KTtcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyLlBMQUlOOlxuICAgICAgICAgICAgICAgIHJldHVybiBwbGFpblN0cmluZyhzcywgY3R4LCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGxldCByZXMgPSBfc3RyaW5naWZ5KHR5cGUpO1xuICAgIGlmIChyZXMgPT09IG51bGwpIHtcbiAgICAgICAgY29uc3QgeyBkZWZhdWx0S2V5VHlwZSwgZGVmYXVsdFN0cmluZ1R5cGUgfSA9IGN0eC5vcHRpb25zO1xuICAgICAgICBjb25zdCB0ID0gKGltcGxpY2l0S2V5ICYmIGRlZmF1bHRLZXlUeXBlKSB8fCBkZWZhdWx0U3RyaW5nVHlwZTtcbiAgICAgICAgcmVzID0gX3N0cmluZ2lmeSh0KTtcbiAgICAgICAgaWYgKHJlcyA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgZGVmYXVsdCBzdHJpbmcgdHlwZSAke3R9YCk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG5cbmV4cG9ydCB7IHN0cmluZ2lmeVN0cmluZyB9O1xuIiwiaW1wb3J0IHsgYW5jaG9ySXNWYWxpZCB9IGZyb20gJy4uL2RvYy9hbmNob3JzLmpzJztcbmltcG9ydCB7IGlzUGFpciwgaXNBbGlhcywgaXNOb2RlLCBpc1NjYWxhciwgaXNDb2xsZWN0aW9uIH0gZnJvbSAnLi4vbm9kZXMvaWRlbnRpdHkuanMnO1xuaW1wb3J0IHsgc3RyaW5naWZ5Q29tbWVudCB9IGZyb20gJy4vc3RyaW5naWZ5Q29tbWVudC5qcyc7XG5pbXBvcnQgeyBzdHJpbmdpZnlTdHJpbmcgfSBmcm9tICcuL3N0cmluZ2lmeVN0cmluZy5qcyc7XG5cbmZ1bmN0aW9uIGNyZWF0ZVN0cmluZ2lmeUNvbnRleHQoZG9jLCBvcHRpb25zKSB7XG4gICAgY29uc3Qgb3B0ID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICAgIGJsb2NrUXVvdGU6IHRydWUsXG4gICAgICAgIGNvbW1lbnRTdHJpbmc6IHN0cmluZ2lmeUNvbW1lbnQsXG4gICAgICAgIGRlZmF1bHRLZXlUeXBlOiBudWxsLFxuICAgICAgICBkZWZhdWx0U3RyaW5nVHlwZTogJ1BMQUlOJyxcbiAgICAgICAgZGlyZWN0aXZlczogbnVsbCxcbiAgICAgICAgZG91YmxlUXVvdGVkQXNKU09OOiBmYWxzZSxcbiAgICAgICAgZG91YmxlUXVvdGVkTWluTXVsdGlMaW5lTGVuZ3RoOiA0MCxcbiAgICAgICAgZmFsc2VTdHI6ICdmYWxzZScsXG4gICAgICAgIGZsb3dDb2xsZWN0aW9uUGFkZGluZzogdHJ1ZSxcbiAgICAgICAgaW5kZW50U2VxOiB0cnVlLFxuICAgICAgICBsaW5lV2lkdGg6IDgwLFxuICAgICAgICBtaW5Db250ZW50V2lkdGg6IDIwLFxuICAgICAgICBudWxsU3RyOiAnbnVsbCcsXG4gICAgICAgIHNpbXBsZUtleXM6IGZhbHNlLFxuICAgICAgICBzaW5nbGVRdW90ZTogbnVsbCxcbiAgICAgICAgdHJhaWxpbmdDb21tYTogZmFsc2UsXG4gICAgICAgIHRydWVTdHI6ICd0cnVlJyxcbiAgICAgICAgdmVyaWZ5QWxpYXNPcmRlcjogdHJ1ZVxuICAgIH0sIGRvYy5zY2hlbWEudG9TdHJpbmdPcHRpb25zLCBvcHRpb25zKTtcbiAgICBsZXQgaW5GbG93O1xuICAgIHN3aXRjaCAob3B0LmNvbGxlY3Rpb25TdHlsZSkge1xuICAgICAgICBjYXNlICdibG9jayc6XG4gICAgICAgICAgICBpbkZsb3cgPSBmYWxzZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdmbG93JzpcbiAgICAgICAgICAgIGluRmxvdyA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGluRmxvdyA9IG51bGw7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGFuY2hvcnM6IG5ldyBTZXQoKSxcbiAgICAgICAgZG9jLFxuICAgICAgICBmbG93Q29sbGVjdGlvblBhZGRpbmc6IG9wdC5mbG93Q29sbGVjdGlvblBhZGRpbmcgPyAnICcgOiAnJyxcbiAgICAgICAgaW5kZW50OiAnJyxcbiAgICAgICAgaW5kZW50U3RlcDogdHlwZW9mIG9wdC5pbmRlbnQgPT09ICdudW1iZXInID8gJyAnLnJlcGVhdChvcHQuaW5kZW50KSA6ICcgICcsXG4gICAgICAgIGluRmxvdyxcbiAgICAgICAgb3B0aW9uczogb3B0XG4gICAgfTtcbn1cbmZ1bmN0aW9uIGdldFRhZ09iamVjdCh0YWdzLCBpdGVtKSB7XG4gICAgaWYgKGl0ZW0udGFnKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoID0gdGFncy5maWx0ZXIodCA9PiB0LnRhZyA9PT0gaXRlbS50YWcpO1xuICAgICAgICBpZiAobWF0Y2gubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJldHVybiBtYXRjaC5maW5kKHQgPT4gdC5mb3JtYXQgPT09IGl0ZW0uZm9ybWF0KSA/PyBtYXRjaFswXTtcbiAgICB9XG4gICAgbGV0IHRhZ09iaiA9IHVuZGVmaW5lZDtcbiAgICBsZXQgb2JqO1xuICAgIGlmIChpc1NjYWxhcihpdGVtKSkge1xuICAgICAgICBvYmogPSBpdGVtLnZhbHVlO1xuICAgICAgICBsZXQgbWF0Y2ggPSB0YWdzLmZpbHRlcih0ID0+IHQuaWRlbnRpZnk/LihvYmopKTtcbiAgICAgICAgaWYgKG1hdGNoLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIGNvbnN0IHRlc3RNYXRjaCA9IG1hdGNoLmZpbHRlcih0ID0+IHQudGVzdCk7XG4gICAgICAgICAgICBpZiAodGVzdE1hdGNoLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgbWF0Y2ggPSB0ZXN0TWF0Y2g7XG4gICAgICAgIH1cbiAgICAgICAgdGFnT2JqID1cbiAgICAgICAgICAgIG1hdGNoLmZpbmQodCA9PiB0LmZvcm1hdCA9PT0gaXRlbS5mb3JtYXQpID8/IG1hdGNoLmZpbmQodCA9PiAhdC5mb3JtYXQpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgb2JqID0gaXRlbTtcbiAgICAgICAgdGFnT2JqID0gdGFncy5maW5kKHQgPT4gdC5ub2RlQ2xhc3MgJiYgb2JqIGluc3RhbmNlb2YgdC5ub2RlQ2xhc3MpO1xuICAgIH1cbiAgICBpZiAoIXRhZ09iaikge1xuICAgICAgICBjb25zdCBuYW1lID0gb2JqPy5jb25zdHJ1Y3Rvcj8ubmFtZSA/PyAob2JqID09PSBudWxsID8gJ251bGwnIDogdHlwZW9mIG9iaik7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVGFnIG5vdCByZXNvbHZlZCBmb3IgJHtuYW1lfSB2YWx1ZWApO1xuICAgIH1cbiAgICByZXR1cm4gdGFnT2JqO1xufVxuLy8gbmVlZHMgdG8gYmUgY2FsbGVkIGJlZm9yZSB2YWx1ZSBzdHJpbmdpZmllciB0byBhbGxvdyBmb3IgY2lyY3VsYXIgYW5jaG9yIHJlZnNcbmZ1bmN0aW9uIHN0cmluZ2lmeVByb3BzKG5vZGUsIHRhZ09iaiwgeyBhbmNob3JzLCBkb2MgfSkge1xuICAgIGlmICghZG9jLmRpcmVjdGl2ZXMpXG4gICAgICAgIHJldHVybiAnJztcbiAgICBjb25zdCBwcm9wcyA9IFtdO1xuICAgIGNvbnN0IGFuY2hvciA9IChpc1NjYWxhcihub2RlKSB8fCBpc0NvbGxlY3Rpb24obm9kZSkpICYmIG5vZGUuYW5jaG9yO1xuICAgIGlmIChhbmNob3IgJiYgYW5jaG9ySXNWYWxpZChhbmNob3IpKSB7XG4gICAgICAgIGFuY2hvcnMuYWRkKGFuY2hvcik7XG4gICAgICAgIHByb3BzLnB1c2goYCYke2FuY2hvcn1gKTtcbiAgICB9XG4gICAgY29uc3QgdGFnID0gbm9kZS50YWcgPz8gKHRhZ09iai5kZWZhdWx0ID8gbnVsbCA6IHRhZ09iai50YWcpO1xuICAgIGlmICh0YWcpXG4gICAgICAgIHByb3BzLnB1c2goZG9jLmRpcmVjdGl2ZXMudGFnU3RyaW5nKHRhZykpO1xuICAgIHJldHVybiBwcm9wcy5qb2luKCcgJyk7XG59XG5mdW5jdGlvbiBzdHJpbmdpZnkoaXRlbSwgY3R4LCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKSB7XG4gICAgaWYgKGlzUGFpcihpdGVtKSlcbiAgICAgICAgcmV0dXJuIGl0ZW0udG9TdHJpbmcoY3R4LCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKTtcbiAgICBpZiAoaXNBbGlhcyhpdGVtKSkge1xuICAgICAgICBpZiAoY3R4LmRvYy5kaXJlY3RpdmVzKVxuICAgICAgICAgICAgcmV0dXJuIGl0ZW0udG9TdHJpbmcoY3R4KTtcbiAgICAgICAgaWYgKGN0eC5yZXNvbHZlZEFsaWFzZXM/LmhhcyhpdGVtKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgQ2Fubm90IHN0cmluZ2lmeSBjaXJjdWxhciBzdHJ1Y3R1cmUgd2l0aG91dCBhbGlhcyBub2Rlc2ApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGN0eC5yZXNvbHZlZEFsaWFzZXMpXG4gICAgICAgICAgICAgICAgY3R4LnJlc29sdmVkQWxpYXNlcy5hZGQoaXRlbSk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgY3R4LnJlc29sdmVkQWxpYXNlcyA9IG5ldyBTZXQoW2l0ZW1dKTtcbiAgICAgICAgICAgIGl0ZW0gPSBpdGVtLnJlc29sdmUoY3R4LmRvYyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV0IHRhZ09iaiA9IHVuZGVmaW5lZDtcbiAgICBjb25zdCBub2RlID0gaXNOb2RlKGl0ZW0pXG4gICAgICAgID8gaXRlbVxuICAgICAgICA6IGN0eC5kb2MuY3JlYXRlTm9kZShpdGVtLCB7IG9uVGFnT2JqOiBvID0+ICh0YWdPYmogPSBvKSB9KTtcbiAgICB0YWdPYmogPz8gKHRhZ09iaiA9IGdldFRhZ09iamVjdChjdHguZG9jLnNjaGVtYS50YWdzLCBub2RlKSk7XG4gICAgY29uc3QgcHJvcHMgPSBzdHJpbmdpZnlQcm9wcyhub2RlLCB0YWdPYmosIGN0eCk7XG4gICAgaWYgKHByb3BzLmxlbmd0aCA+IDApXG4gICAgICAgIGN0eC5pbmRlbnRBdFN0YXJ0ID0gKGN0eC5pbmRlbnRBdFN0YXJ0ID8/IDApICsgcHJvcHMubGVuZ3RoICsgMTtcbiAgICBjb25zdCBzdHIgPSB0eXBlb2YgdGFnT2JqLnN0cmluZ2lmeSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICA/IHRhZ09iai5zdHJpbmdpZnkobm9kZSwgY3R4LCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKVxuICAgICAgICA6IGlzU2NhbGFyKG5vZGUpXG4gICAgICAgICAgICA/IHN0cmluZ2lmeVN0cmluZyhub2RlLCBjdHgsIG9uQ29tbWVudCwgb25DaG9tcEtlZXApXG4gICAgICAgICAgICA6IG5vZGUudG9TdHJpbmcoY3R4LCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKTtcbiAgICBpZiAoIXByb3BzKVxuICAgICAgICByZXR1cm4gc3RyO1xuICAgIHJldHVybiBpc1NjYWxhcihub2RlKSB8fCBzdHJbMF0gPT09ICd7JyB8fCBzdHJbMF0gPT09ICdbJ1xuICAgICAgICA/IGAke3Byb3BzfSAke3N0cn1gXG4gICAgICAgIDogYCR7cHJvcHN9XFxuJHtjdHguaW5kZW50fSR7c3RyfWA7XG59XG5cbmV4cG9ydCB7IGNyZWF0ZVN0cmluZ2lmeUNvbnRleHQsIHN0cmluZ2lmeSB9O1xuIiwiaW1wb3J0IHsgaXNDb2xsZWN0aW9uLCBpc05vZGUsIGlzU2NhbGFyLCBpc1NlcSB9IGZyb20gJy4uL25vZGVzL2lkZW50aXR5LmpzJztcbmltcG9ydCB7IFNjYWxhciB9IGZyb20gJy4uL25vZGVzL1NjYWxhci5qcyc7XG5pbXBvcnQgeyBzdHJpbmdpZnkgfSBmcm9tICcuL3N0cmluZ2lmeS5qcyc7XG5pbXBvcnQgeyBsaW5lQ29tbWVudCwgaW5kZW50Q29tbWVudCB9IGZyb20gJy4vc3RyaW5naWZ5Q29tbWVudC5qcyc7XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeVBhaXIoeyBrZXksIHZhbHVlIH0sIGN0eCwgb25Db21tZW50LCBvbkNob21wS2VlcCkge1xuICAgIGNvbnN0IHsgYWxsTnVsbFZhbHVlcywgZG9jLCBpbmRlbnQsIGluZGVudFN0ZXAsIG9wdGlvbnM6IHsgY29tbWVudFN0cmluZywgaW5kZW50U2VxLCBzaW1wbGVLZXlzIH0gfSA9IGN0eDtcbiAgICBsZXQga2V5Q29tbWVudCA9IChpc05vZGUoa2V5KSAmJiBrZXkuY29tbWVudCkgfHwgbnVsbDtcbiAgICBpZiAoc2ltcGxlS2V5cykge1xuICAgICAgICBpZiAoa2V5Q29tbWVudCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXaXRoIHNpbXBsZSBrZXlzLCBrZXkgbm9kZXMgY2Fubm90IGhhdmUgY29tbWVudHMnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNDb2xsZWN0aW9uKGtleSkgfHwgKCFpc05vZGUoa2V5KSAmJiB0eXBlb2Yga2V5ID09PSAnb2JqZWN0JykpIHtcbiAgICAgICAgICAgIGNvbnN0IG1zZyA9ICdXaXRoIHNpbXBsZSBrZXlzLCBjb2xsZWN0aW9uIGNhbm5vdCBiZSB1c2VkIGFzIGEga2V5IHZhbHVlJztcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxldCBleHBsaWNpdEtleSA9ICFzaW1wbGVLZXlzICYmXG4gICAgICAgICgha2V5IHx8XG4gICAgICAgICAgICAoa2V5Q29tbWVudCAmJiB2YWx1ZSA9PSBudWxsICYmICFjdHguaW5GbG93KSB8fFxuICAgICAgICAgICAgaXNDb2xsZWN0aW9uKGtleSkgfHxcbiAgICAgICAgICAgIChpc1NjYWxhcihrZXkpXG4gICAgICAgICAgICAgICAgPyBrZXkudHlwZSA9PT0gU2NhbGFyLkJMT0NLX0ZPTERFRCB8fCBrZXkudHlwZSA9PT0gU2NhbGFyLkJMT0NLX0xJVEVSQUxcbiAgICAgICAgICAgICAgICA6IHR5cGVvZiBrZXkgPT09ICdvYmplY3QnKSk7XG4gICAgY3R4ID0gT2JqZWN0LmFzc2lnbih7fSwgY3R4LCB7XG4gICAgICAgIGFsbE51bGxWYWx1ZXM6IGZhbHNlLFxuICAgICAgICBpbXBsaWNpdEtleTogIWV4cGxpY2l0S2V5ICYmIChzaW1wbGVLZXlzIHx8ICFhbGxOdWxsVmFsdWVzKSxcbiAgICAgICAgaW5kZW50OiBpbmRlbnQgKyBpbmRlbnRTdGVwXG4gICAgfSk7XG4gICAgbGV0IGtleUNvbW1lbnREb25lID0gZmFsc2U7XG4gICAgbGV0IGNob21wS2VlcCA9IGZhbHNlO1xuICAgIGxldCBzdHIgPSBzdHJpbmdpZnkoa2V5LCBjdHgsICgpID0+IChrZXlDb21tZW50RG9uZSA9IHRydWUpLCAoKSA9PiAoY2hvbXBLZWVwID0gdHJ1ZSkpO1xuICAgIGlmICghZXhwbGljaXRLZXkgJiYgIWN0eC5pbkZsb3cgJiYgc3RyLmxlbmd0aCA+IDEwMjQpIHtcbiAgICAgICAgaWYgKHNpbXBsZUtleXMpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dpdGggc2ltcGxlIGtleXMsIHNpbmdsZSBsaW5lIHNjYWxhciBtdXN0IG5vdCBzcGFuIG1vcmUgdGhhbiAxMDI0IGNoYXJhY3RlcnMnKTtcbiAgICAgICAgZXhwbGljaXRLZXkgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoY3R4LmluRmxvdykge1xuICAgICAgICBpZiAoYWxsTnVsbFZhbHVlcyB8fCB2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoa2V5Q29tbWVudERvbmUgJiYgb25Db21tZW50KVxuICAgICAgICAgICAgICAgIG9uQ29tbWVudCgpO1xuICAgICAgICAgICAgcmV0dXJuIHN0ciA9PT0gJycgPyAnPycgOiBleHBsaWNpdEtleSA/IGA/ICR7c3RyfWAgOiBzdHI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoKGFsbE51bGxWYWx1ZXMgJiYgIXNpbXBsZUtleXMpIHx8ICh2YWx1ZSA9PSBudWxsICYmIGV4cGxpY2l0S2V5KSkge1xuICAgICAgICBzdHIgPSBgPyAke3N0cn1gO1xuICAgICAgICBpZiAoa2V5Q29tbWVudCAmJiAha2V5Q29tbWVudERvbmUpIHtcbiAgICAgICAgICAgIHN0ciArPSBsaW5lQ29tbWVudChzdHIsIGN0eC5pbmRlbnQsIGNvbW1lbnRTdHJpbmcoa2V5Q29tbWVudCkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNob21wS2VlcCAmJiBvbkNob21wS2VlcClcbiAgICAgICAgICAgIG9uQ2hvbXBLZWVwKCk7XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuICAgIGlmIChrZXlDb21tZW50RG9uZSlcbiAgICAgICAga2V5Q29tbWVudCA9IG51bGw7XG4gICAgaWYgKGV4cGxpY2l0S2V5KSB7XG4gICAgICAgIGlmIChrZXlDb21tZW50KVxuICAgICAgICAgICAgc3RyICs9IGxpbmVDb21tZW50KHN0ciwgY3R4LmluZGVudCwgY29tbWVudFN0cmluZyhrZXlDb21tZW50KSk7XG4gICAgICAgIHN0ciA9IGA/ICR7c3RyfVxcbiR7aW5kZW50fTpgO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgc3RyID0gYCR7c3RyfTpgO1xuICAgICAgICBpZiAoa2V5Q29tbWVudClcbiAgICAgICAgICAgIHN0ciArPSBsaW5lQ29tbWVudChzdHIsIGN0eC5pbmRlbnQsIGNvbW1lbnRTdHJpbmcoa2V5Q29tbWVudCkpO1xuICAgIH1cbiAgICBsZXQgdnNiLCB2Y2IsIHZhbHVlQ29tbWVudDtcbiAgICBpZiAoaXNOb2RlKHZhbHVlKSkge1xuICAgICAgICB2c2IgPSAhIXZhbHVlLnNwYWNlQmVmb3JlO1xuICAgICAgICB2Y2IgPSB2YWx1ZS5jb21tZW50QmVmb3JlO1xuICAgICAgICB2YWx1ZUNvbW1lbnQgPSB2YWx1ZS5jb21tZW50O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdnNiID0gZmFsc2U7XG4gICAgICAgIHZjYiA9IG51bGw7XG4gICAgICAgIHZhbHVlQ29tbWVudCA9IG51bGw7XG4gICAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKVxuICAgICAgICAgICAgdmFsdWUgPSBkb2MuY3JlYXRlTm9kZSh2YWx1ZSk7XG4gICAgfVxuICAgIGN0eC5pbXBsaWNpdEtleSA9IGZhbHNlO1xuICAgIGlmICghZXhwbGljaXRLZXkgJiYgIWtleUNvbW1lbnQgJiYgaXNTY2FsYXIodmFsdWUpKVxuICAgICAgICBjdHguaW5kZW50QXRTdGFydCA9IHN0ci5sZW5ndGggKyAxO1xuICAgIGNob21wS2VlcCA9IGZhbHNlO1xuICAgIGlmICghaW5kZW50U2VxICYmXG4gICAgICAgIGluZGVudFN0ZXAubGVuZ3RoID49IDIgJiZcbiAgICAgICAgIWN0eC5pbkZsb3cgJiZcbiAgICAgICAgIWV4cGxpY2l0S2V5ICYmXG4gICAgICAgIGlzU2VxKHZhbHVlKSAmJlxuICAgICAgICAhdmFsdWUuZmxvdyAmJlxuICAgICAgICAhdmFsdWUudGFnICYmXG4gICAgICAgICF2YWx1ZS5hbmNob3IpIHtcbiAgICAgICAgLy8gSWYgaW5kZW50U2VxID09PSBmYWxzZSwgY29uc2lkZXIgJy0gJyBhcyBwYXJ0IG9mIGluZGVudGF0aW9uIHdoZXJlIHBvc3NpYmxlXG4gICAgICAgIGN0eC5pbmRlbnQgPSBjdHguaW5kZW50LnN1YnN0cmluZygyKTtcbiAgICB9XG4gICAgbGV0IHZhbHVlQ29tbWVudERvbmUgPSBmYWxzZTtcbiAgICBjb25zdCB2YWx1ZVN0ciA9IHN0cmluZ2lmeSh2YWx1ZSwgY3R4LCAoKSA9PiAodmFsdWVDb21tZW50RG9uZSA9IHRydWUpLCAoKSA9PiAoY2hvbXBLZWVwID0gdHJ1ZSkpO1xuICAgIGxldCB3cyA9ICcgJztcbiAgICBpZiAoa2V5Q29tbWVudCB8fCB2c2IgfHwgdmNiKSB7XG4gICAgICAgIHdzID0gdnNiID8gJ1xcbicgOiAnJztcbiAgICAgICAgaWYgKHZjYikge1xuICAgICAgICAgICAgY29uc3QgY3MgPSBjb21tZW50U3RyaW5nKHZjYik7XG4gICAgICAgICAgICB3cyArPSBgXFxuJHtpbmRlbnRDb21tZW50KGNzLCBjdHguaW5kZW50KX1gO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZVN0ciA9PT0gJycgJiYgIWN0eC5pbkZsb3cpIHtcbiAgICAgICAgICAgIGlmICh3cyA9PT0gJ1xcbicgJiYgdmFsdWVDb21tZW50KVxuICAgICAgICAgICAgICAgIHdzID0gJ1xcblxcbic7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB3cyArPSBgXFxuJHtjdHguaW5kZW50fWA7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoIWV4cGxpY2l0S2V5ICYmIGlzQ29sbGVjdGlvbih2YWx1ZSkpIHtcbiAgICAgICAgY29uc3QgdnMwID0gdmFsdWVTdHJbMF07XG4gICAgICAgIGNvbnN0IG5sMCA9IHZhbHVlU3RyLmluZGV4T2YoJ1xcbicpO1xuICAgICAgICBjb25zdCBoYXNOZXdsaW5lID0gbmwwICE9PSAtMTtcbiAgICAgICAgY29uc3QgZmxvdyA9IGN0eC5pbkZsb3cgPz8gdmFsdWUuZmxvdyA/PyB2YWx1ZS5pdGVtcy5sZW5ndGggPT09IDA7XG4gICAgICAgIGlmIChoYXNOZXdsaW5lIHx8ICFmbG93KSB7XG4gICAgICAgICAgICBsZXQgaGFzUHJvcHNMaW5lID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAoaGFzTmV3bGluZSAmJiAodnMwID09PSAnJicgfHwgdnMwID09PSAnIScpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNwMCA9IHZhbHVlU3RyLmluZGV4T2YoJyAnKTtcbiAgICAgICAgICAgICAgICBpZiAodnMwID09PSAnJicgJiZcbiAgICAgICAgICAgICAgICAgICAgc3AwICE9PSAtMSAmJlxuICAgICAgICAgICAgICAgICAgICBzcDAgPCBubDAgJiZcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVTdHJbc3AwICsgMV0gPT09ICchJykge1xuICAgICAgICAgICAgICAgICAgICBzcDAgPSB2YWx1ZVN0ci5pbmRleE9mKCcgJywgc3AwICsgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChzcDAgPT09IC0xIHx8IG5sMCA8IHNwMClcbiAgICAgICAgICAgICAgICAgICAgaGFzUHJvcHNMaW5lID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaGFzUHJvcHNMaW5lKVxuICAgICAgICAgICAgICAgIHdzID0gYFxcbiR7Y3R4LmluZGVudH1gO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKHZhbHVlU3RyID09PSAnJyB8fCB2YWx1ZVN0clswXSA9PT0gJ1xcbicpIHtcbiAgICAgICAgd3MgPSAnJztcbiAgICB9XG4gICAgc3RyICs9IHdzICsgdmFsdWVTdHI7XG4gICAgaWYgKGN0eC5pbkZsb3cpIHtcbiAgICAgICAgaWYgKHZhbHVlQ29tbWVudERvbmUgJiYgb25Db21tZW50KVxuICAgICAgICAgICAgb25Db21tZW50KCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHZhbHVlQ29tbWVudCAmJiAhdmFsdWVDb21tZW50RG9uZSkge1xuICAgICAgICBzdHIgKz0gbGluZUNvbW1lbnQoc3RyLCBjdHguaW5kZW50LCBjb21tZW50U3RyaW5nKHZhbHVlQ29tbWVudCkpO1xuICAgIH1cbiAgICBlbHNlIGlmIChjaG9tcEtlZXAgJiYgb25DaG9tcEtlZXApIHtcbiAgICAgICAgb25DaG9tcEtlZXAoKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0cjtcbn1cblxuZXhwb3J0IHsgc3RyaW5naWZ5UGFpciB9O1xuIiwiZnVuY3Rpb24gZGVidWcobG9nTGV2ZWwsIC4uLm1lc3NhZ2VzKSB7XG4gICAgaWYgKGxvZ0xldmVsID09PSAnZGVidWcnKVxuICAgICAgICBjb25zb2xlLmxvZyguLi5tZXNzYWdlcyk7XG59XG5mdW5jdGlvbiB3YXJuKGxvZ0xldmVsLCB3YXJuaW5nKSB7XG4gICAgaWYgKGxvZ0xldmVsID09PSAnZGVidWcnIHx8IGxvZ0xldmVsID09PSAnd2FybicpIHtcbiAgICAgICAgY29uc29sZS53YXJuKHdhcm5pbmcpO1xuICAgIH1cbn1cblxuZXhwb3J0IHsgZGVidWcsIHdhcm4gfTtcbiIsImltcG9ydCB7IGlzU2NhbGFyLCBpc1NlcSwgaXNBbGlhcywgaXNNYXAgfSBmcm9tICcuLi8uLi9ub2Rlcy9pZGVudGl0eS5qcyc7XG5pbXBvcnQgeyBTY2FsYXIgfSBmcm9tICcuLi8uLi9ub2Rlcy9TY2FsYXIuanMnO1xuXG4vLyBJZiB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGEgbWVyZ2Uga2V5IGlzIGEgc2luZ2xlIG1hcHBpbmcgbm9kZSwgZWFjaCBvZlxuLy8gaXRzIGtleS92YWx1ZSBwYWlycyBpcyBpbnNlcnRlZCBpbnRvIHRoZSBjdXJyZW50IG1hcHBpbmcsIHVubGVzcyB0aGUga2V5XG4vLyBhbHJlYWR5IGV4aXN0cyBpbiBpdC4gSWYgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWVyZ2Uga2V5IGlzIGFcbi8vIHNlcXVlbmNlLCB0aGVuIHRoaXMgc2VxdWVuY2UgaXMgZXhwZWN0ZWQgdG8gY29udGFpbiBtYXBwaW5nIG5vZGVzIGFuZCBlYWNoXG4vLyBvZiB0aGVzZSBub2RlcyBpcyBtZXJnZWQgaW4gdHVybiBhY2NvcmRpbmcgdG8gaXRzIG9yZGVyIGluIHRoZSBzZXF1ZW5jZS5cbi8vIEtleXMgaW4gbWFwcGluZyBub2RlcyBlYXJsaWVyIGluIHRoZSBzZXF1ZW5jZSBvdmVycmlkZSBrZXlzIHNwZWNpZmllZCBpblxuLy8gbGF0ZXIgbWFwcGluZyBub2Rlcy4gLS0gaHR0cDovL3lhbWwub3JnL3R5cGUvbWVyZ2UuaHRtbFxuY29uc3QgTUVSR0VfS0VZID0gJzw8JztcbmNvbnN0IG1lcmdlID0ge1xuICAgIGlkZW50aWZ5OiB2YWx1ZSA9PiB2YWx1ZSA9PT0gTUVSR0VfS0VZIHx8XG4gICAgICAgICh0eXBlb2YgdmFsdWUgPT09ICdzeW1ib2wnICYmIHZhbHVlLmRlc2NyaXB0aW9uID09PSBNRVJHRV9LRVkpLFxuICAgIGRlZmF1bHQ6ICdrZXknLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOm1lcmdlJyxcbiAgICB0ZXN0OiAvXjw8JC8sXG4gICAgcmVzb2x2ZTogKCkgPT4gT2JqZWN0LmFzc2lnbihuZXcgU2NhbGFyKFN5bWJvbChNRVJHRV9LRVkpKSwge1xuICAgICAgICBhZGRUb0pTTWFwOiBhZGRNZXJnZVRvSlNNYXBcbiAgICB9KSxcbiAgICBzdHJpbmdpZnk6ICgpID0+IE1FUkdFX0tFWVxufTtcbmNvbnN0IGlzTWVyZ2VLZXkgPSAoY3R4LCBrZXkpID0+IChtZXJnZS5pZGVudGlmeShrZXkpIHx8XG4gICAgKGlzU2NhbGFyKGtleSkgJiZcbiAgICAgICAgKCFrZXkudHlwZSB8fCBrZXkudHlwZSA9PT0gU2NhbGFyLlBMQUlOKSAmJlxuICAgICAgICBtZXJnZS5pZGVudGlmeShrZXkudmFsdWUpKSkgJiZcbiAgICBjdHg/LmRvYy5zY2hlbWEudGFncy5zb21lKHRhZyA9PiB0YWcudGFnID09PSBtZXJnZS50YWcgJiYgdGFnLmRlZmF1bHQpO1xuZnVuY3Rpb24gYWRkTWVyZ2VUb0pTTWFwKGN0eCwgbWFwLCB2YWx1ZSkge1xuICAgIGNvbnN0IHNvdXJjZSA9IHJlc29sdmVBbGlhc1ZhbHVlKGN0eCwgdmFsdWUpO1xuICAgIGlmIChpc1NlcShzb3VyY2UpKVxuICAgICAgICBmb3IgKGNvbnN0IGl0IG9mIHNvdXJjZS5pdGVtcylcbiAgICAgICAgICAgIG1lcmdlVmFsdWUoY3R4LCBtYXAsIGl0KTtcbiAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHNvdXJjZSkpXG4gICAgICAgIGZvciAoY29uc3QgaXQgb2Ygc291cmNlKVxuICAgICAgICAgICAgbWVyZ2VWYWx1ZShjdHgsIG1hcCwgaXQpO1xuICAgIGVsc2VcbiAgICAgICAgbWVyZ2VWYWx1ZShjdHgsIG1hcCwgc291cmNlKTtcbn1cbmZ1bmN0aW9uIG1lcmdlVmFsdWUoY3R4LCBtYXAsIHZhbHVlKSB7XG4gICAgY29uc3Qgc291cmNlID0gcmVzb2x2ZUFsaWFzVmFsdWUoY3R4LCB2YWx1ZSk7XG4gICAgaWYgKCFpc01hcChzb3VyY2UpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01lcmdlIHNvdXJjZXMgbXVzdCBiZSBtYXBzIG9yIG1hcCBhbGlhc2VzJyk7XG4gICAgY29uc3Qgc3JjTWFwID0gc291cmNlLnRvSlNPTihudWxsLCBjdHgsIE1hcCk7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2Ygc3JjTWFwKSB7XG4gICAgICAgIGlmIChtYXAgaW5zdGFuY2VvZiBNYXApIHtcbiAgICAgICAgICAgIGlmICghbWFwLmhhcyhrZXkpKVxuICAgICAgICAgICAgICAgIG1hcC5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobWFwIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgICAgICAgICBtYXAuYWRkKGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtYXAsIGtleSkpIHtcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtYXAsIGtleSwge1xuICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWFwO1xufVxuZnVuY3Rpb24gcmVzb2x2ZUFsaWFzVmFsdWUoY3R4LCB2YWx1ZSkge1xuICAgIHJldHVybiBjdHggJiYgaXNBbGlhcyh2YWx1ZSkgPyB2YWx1ZS5yZXNvbHZlKGN0eC5kb2MsIGN0eCkgOiB2YWx1ZTtcbn1cblxuZXhwb3J0IHsgYWRkTWVyZ2VUb0pTTWFwLCBpc01lcmdlS2V5LCBtZXJnZSB9O1xuIiwiaW1wb3J0IHsgd2FybiB9IGZyb20gJy4uL2xvZy5qcyc7XG5pbXBvcnQgeyBpc01lcmdlS2V5LCBhZGRNZXJnZVRvSlNNYXAgfSBmcm9tICcuLi9zY2hlbWEveWFtbC0xLjEvbWVyZ2UuanMnO1xuaW1wb3J0IHsgY3JlYXRlU3RyaW5naWZ5Q29udGV4dCB9IGZyb20gJy4uL3N0cmluZ2lmeS9zdHJpbmdpZnkuanMnO1xuaW1wb3J0IHsgaXNOb2RlIH0gZnJvbSAnLi9pZGVudGl0eS5qcyc7XG5pbXBvcnQgeyB0b0pTIH0gZnJvbSAnLi90b0pTLmpzJztcblxuZnVuY3Rpb24gYWRkUGFpclRvSlNNYXAoY3R4LCBtYXAsIHsga2V5LCB2YWx1ZSB9KSB7XG4gICAgaWYgKGlzTm9kZShrZXkpICYmIGtleS5hZGRUb0pTTWFwKVxuICAgICAgICBrZXkuYWRkVG9KU01hcChjdHgsIG1hcCwgdmFsdWUpO1xuICAgIC8vIFRPRE86IFNob3VsZCBkcm9wIHRoaXMgc3BlY2lhbCBjYXNlIGZvciBiYXJlIDw8IGhhbmRsaW5nXG4gICAgZWxzZSBpZiAoaXNNZXJnZUtleShjdHgsIGtleSkpXG4gICAgICAgIGFkZE1lcmdlVG9KU01hcChjdHgsIG1hcCwgdmFsdWUpO1xuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBqc0tleSA9IHRvSlMoa2V5LCAnJywgY3R4KTtcbiAgICAgICAgaWYgKG1hcCBpbnN0YW5jZW9mIE1hcCkge1xuICAgICAgICAgICAgbWFwLnNldChqc0tleSwgdG9KUyh2YWx1ZSwganNLZXksIGN0eCkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG1hcCBpbnN0YW5jZW9mIFNldCkge1xuICAgICAgICAgICAgbWFwLmFkZChqc0tleSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBzdHJpbmdLZXkgPSBzdHJpbmdpZnlLZXkoa2V5LCBqc0tleSwgY3R4KTtcbiAgICAgICAgICAgIGNvbnN0IGpzVmFsdWUgPSB0b0pTKHZhbHVlLCBzdHJpbmdLZXksIGN0eCk7XG4gICAgICAgICAgICBpZiAoc3RyaW5nS2V5IGluIG1hcClcbiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobWFwLCBzdHJpbmdLZXksIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGpzVmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBtYXBbc3RyaW5nS2V5XSA9IGpzVmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1hcDtcbn1cbmZ1bmN0aW9uIHN0cmluZ2lmeUtleShrZXksIGpzS2V5LCBjdHgpIHtcbiAgICBpZiAoanNLZXkgPT09IG51bGwpXG4gICAgICAgIHJldHVybiAnJztcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWJhc2UtdG8tc3RyaW5nXG4gICAgaWYgKHR5cGVvZiBqc0tleSAhPT0gJ29iamVjdCcpXG4gICAgICAgIHJldHVybiBTdHJpbmcoanNLZXkpO1xuICAgIGlmIChpc05vZGUoa2V5KSAmJiBjdHg/LmRvYykge1xuICAgICAgICBjb25zdCBzdHJDdHggPSBjcmVhdGVTdHJpbmdpZnlDb250ZXh0KGN0eC5kb2MsIHt9KTtcbiAgICAgICAgc3RyQ3R4LmFuY2hvcnMgPSBuZXcgU2V0KCk7XG4gICAgICAgIGZvciAoY29uc3Qgbm9kZSBvZiBjdHguYW5jaG9ycy5rZXlzKCkpXG4gICAgICAgICAgICBzdHJDdHguYW5jaG9ycy5hZGQobm9kZS5hbmNob3IpO1xuICAgICAgICBzdHJDdHguaW5GbG93ID0gdHJ1ZTtcbiAgICAgICAgc3RyQ3R4LmluU3RyaW5naWZ5S2V5ID0gdHJ1ZTtcbiAgICAgICAgY29uc3Qgc3RyS2V5ID0ga2V5LnRvU3RyaW5nKHN0ckN0eCk7XG4gICAgICAgIGlmICghY3R4Lm1hcEtleVdhcm5lZCkge1xuICAgICAgICAgICAgbGV0IGpzb25TdHIgPSBKU09OLnN0cmluZ2lmeShzdHJLZXkpO1xuICAgICAgICAgICAgaWYgKGpzb25TdHIubGVuZ3RoID4gNDApXG4gICAgICAgICAgICAgICAganNvblN0ciA9IGpzb25TdHIuc3Vic3RyaW5nKDAsIDM2KSArICcuLi5cIic7XG4gICAgICAgICAgICB3YXJuKGN0eC5kb2Mub3B0aW9ucy5sb2dMZXZlbCwgYEtleXMgd2l0aCBjb2xsZWN0aW9uIHZhbHVlcyB3aWxsIGJlIHN0cmluZ2lmaWVkIGR1ZSB0byBKUyBPYmplY3QgcmVzdHJpY3Rpb25zOiAke2pzb25TdHJ9LiBTZXQgbWFwQXNNYXA6IHRydWUgdG8gdXNlIG9iamVjdCBrZXlzLmApO1xuICAgICAgICAgICAgY3R4Lm1hcEtleVdhcm5lZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0cktleTtcbiAgICB9XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGpzS2V5KTtcbn1cblxuZXhwb3J0IHsgYWRkUGFpclRvSlNNYXAgfTtcbiIsImltcG9ydCB7IGNyZWF0ZU5vZGUgfSBmcm9tICcuLi9kb2MvY3JlYXRlTm9kZS5qcyc7XG5pbXBvcnQgeyBzdHJpbmdpZnlQYWlyIH0gZnJvbSAnLi4vc3RyaW5naWZ5L3N0cmluZ2lmeVBhaXIuanMnO1xuaW1wb3J0IHsgYWRkUGFpclRvSlNNYXAgfSBmcm9tICcuL2FkZFBhaXJUb0pTTWFwLmpzJztcbmltcG9ydCB7IE5PREVfVFlQRSwgUEFJUiwgaXNOb2RlIH0gZnJvbSAnLi9pZGVudGl0eS5qcyc7XG5cbmZ1bmN0aW9uIGNyZWF0ZVBhaXIoa2V5LCB2YWx1ZSwgY3R4KSB7XG4gICAgY29uc3QgayA9IGNyZWF0ZU5vZGUoa2V5LCB1bmRlZmluZWQsIGN0eCk7XG4gICAgY29uc3QgdiA9IGNyZWF0ZU5vZGUodmFsdWUsIHVuZGVmaW5lZCwgY3R4KTtcbiAgICByZXR1cm4gbmV3IFBhaXIoaywgdik7XG59XG5jbGFzcyBQYWlyIHtcbiAgICBjb25zdHJ1Y3RvcihrZXksIHZhbHVlID0gbnVsbCkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgTk9ERV9UWVBFLCB7IHZhbHVlOiBQQUlSIH0pO1xuICAgICAgICB0aGlzLmtleSA9IGtleTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICBjbG9uZShzY2hlbWEpIHtcbiAgICAgICAgbGV0IHsga2V5LCB2YWx1ZSB9ID0gdGhpcztcbiAgICAgICAgaWYgKGlzTm9kZShrZXkpKVxuICAgICAgICAgICAga2V5ID0ga2V5LmNsb25lKHNjaGVtYSk7XG4gICAgICAgIGlmIChpc05vZGUodmFsdWUpKVxuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5jbG9uZShzY2hlbWEpO1xuICAgICAgICByZXR1cm4gbmV3IFBhaXIoa2V5LCB2YWx1ZSk7XG4gICAgfVxuICAgIHRvSlNPTihfLCBjdHgpIHtcbiAgICAgICAgY29uc3QgcGFpciA9IGN0eD8ubWFwQXNNYXAgPyBuZXcgTWFwKCkgOiB7fTtcbiAgICAgICAgcmV0dXJuIGFkZFBhaXJUb0pTTWFwKGN0eCwgcGFpciwgdGhpcyk7XG4gICAgfVxuICAgIHRvU3RyaW5nKGN0eCwgb25Db21tZW50LCBvbkNob21wS2VlcCkge1xuICAgICAgICByZXR1cm4gY3R4Py5kb2NcbiAgICAgICAgICAgID8gc3RyaW5naWZ5UGFpcih0aGlzLCBjdHgsIG9uQ29tbWVudCwgb25DaG9tcEtlZXApXG4gICAgICAgICAgICA6IEpTT04uc3RyaW5naWZ5KHRoaXMpO1xuICAgIH1cbn1cblxuZXhwb3J0IHsgUGFpciwgY3JlYXRlUGFpciB9O1xuIiwiaW1wb3J0IHsgaXNOb2RlLCBpc1BhaXIgfSBmcm9tICcuLi9ub2Rlcy9pZGVudGl0eS5qcyc7XG5pbXBvcnQgeyBzdHJpbmdpZnkgfSBmcm9tICcuL3N0cmluZ2lmeS5qcyc7XG5pbXBvcnQgeyBsaW5lQ29tbWVudCwgaW5kZW50Q29tbWVudCB9IGZyb20gJy4vc3RyaW5naWZ5Q29tbWVudC5qcyc7XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeUNvbGxlY3Rpb24oY29sbGVjdGlvbiwgY3R4LCBvcHRpb25zKSB7XG4gICAgY29uc3QgZmxvdyA9IGN0eC5pbkZsb3cgPz8gY29sbGVjdGlvbi5mbG93O1xuICAgIGNvbnN0IHN0cmluZ2lmeSA9IGZsb3cgPyBzdHJpbmdpZnlGbG93Q29sbGVjdGlvbiA6IHN0cmluZ2lmeUJsb2NrQ29sbGVjdGlvbjtcbiAgICByZXR1cm4gc3RyaW5naWZ5KGNvbGxlY3Rpb24sIGN0eCwgb3B0aW9ucyk7XG59XG5mdW5jdGlvbiBzdHJpbmdpZnlCbG9ja0NvbGxlY3Rpb24oeyBjb21tZW50LCBpdGVtcyB9LCBjdHgsIHsgYmxvY2tJdGVtUHJlZml4LCBmbG93Q2hhcnMsIGl0ZW1JbmRlbnQsIG9uQ2hvbXBLZWVwLCBvbkNvbW1lbnQgfSkge1xuICAgIGNvbnN0IHsgaW5kZW50LCBvcHRpb25zOiB7IGNvbW1lbnRTdHJpbmcgfSB9ID0gY3R4O1xuICAgIGNvbnN0IGl0ZW1DdHggPSBPYmplY3QuYXNzaWduKHt9LCBjdHgsIHsgaW5kZW50OiBpdGVtSW5kZW50LCB0eXBlOiBudWxsIH0pO1xuICAgIGxldCBjaG9tcEtlZXAgPSBmYWxzZTsgLy8gZmxhZyBmb3IgdGhlIHByZWNlZGluZyBub2RlJ3Mgc3RhdHVzXG4gICAgY29uc3QgbGluZXMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSBpdGVtc1tpXTtcbiAgICAgICAgbGV0IGNvbW1lbnQgPSBudWxsO1xuICAgICAgICBpZiAoaXNOb2RlKGl0ZW0pKSB7XG4gICAgICAgICAgICBpZiAoIWNob21wS2VlcCAmJiBpdGVtLnNwYWNlQmVmb3JlKVxuICAgICAgICAgICAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgICAgICAgICAgYWRkQ29tbWVudEJlZm9yZShjdHgsIGxpbmVzLCBpdGVtLmNvbW1lbnRCZWZvcmUsIGNob21wS2VlcCk7XG4gICAgICAgICAgICBpZiAoaXRlbS5jb21tZW50KVxuICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBpdGVtLmNvbW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNQYWlyKGl0ZW0pKSB7XG4gICAgICAgICAgICBjb25zdCBpayA9IGlzTm9kZShpdGVtLmtleSkgPyBpdGVtLmtleSA6IG51bGw7XG4gICAgICAgICAgICBpZiAoaWspIHtcbiAgICAgICAgICAgICAgICBpZiAoIWNob21wS2VlcCAmJiBpay5zcGFjZUJlZm9yZSlcbiAgICAgICAgICAgICAgICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgICAgICAgICAgICAgYWRkQ29tbWVudEJlZm9yZShjdHgsIGxpbmVzLCBpay5jb21tZW50QmVmb3JlLCBjaG9tcEtlZXApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNob21wS2VlcCA9IGZhbHNlO1xuICAgICAgICBsZXQgc3RyID0gc3RyaW5naWZ5KGl0ZW0sIGl0ZW1DdHgsICgpID0+IChjb21tZW50ID0gbnVsbCksICgpID0+IChjaG9tcEtlZXAgPSB0cnVlKSk7XG4gICAgICAgIGlmIChjb21tZW50KVxuICAgICAgICAgICAgc3RyICs9IGxpbmVDb21tZW50KHN0ciwgaXRlbUluZGVudCwgY29tbWVudFN0cmluZyhjb21tZW50KSk7XG4gICAgICAgIGlmIChjaG9tcEtlZXAgJiYgY29tbWVudClcbiAgICAgICAgICAgIGNob21wS2VlcCA9IGZhbHNlO1xuICAgICAgICBsaW5lcy5wdXNoKGJsb2NrSXRlbVByZWZpeCArIHN0cik7XG4gICAgfVxuICAgIGxldCBzdHI7XG4gICAgaWYgKGxpbmVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBzdHIgPSBmbG93Q2hhcnMuc3RhcnQgKyBmbG93Q2hhcnMuZW5kO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgc3RyID0gbGluZXNbMF07XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgbGluZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGNvbnN0IGxpbmUgPSBsaW5lc1tpXTtcbiAgICAgICAgICAgIHN0ciArPSBsaW5lID8gYFxcbiR7aW5kZW50fSR7bGluZX1gIDogJ1xcbic7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNvbW1lbnQpIHtcbiAgICAgICAgc3RyICs9ICdcXG4nICsgaW5kZW50Q29tbWVudChjb21tZW50U3RyaW5nKGNvbW1lbnQpLCBpbmRlbnQpO1xuICAgICAgICBpZiAob25Db21tZW50KVxuICAgICAgICAgICAgb25Db21tZW50KCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGNob21wS2VlcCAmJiBvbkNob21wS2VlcClcbiAgICAgICAgb25DaG9tcEtlZXAoKTtcbiAgICByZXR1cm4gc3RyO1xufVxuZnVuY3Rpb24gc3RyaW5naWZ5Rmxvd0NvbGxlY3Rpb24oeyBpdGVtcyB9LCBjdHgsIHsgZmxvd0NoYXJzLCBpdGVtSW5kZW50IH0pIHtcbiAgICBjb25zdCB7IGluZGVudCwgaW5kZW50U3RlcCwgZmxvd0NvbGxlY3Rpb25QYWRkaW5nOiBmY1BhZGRpbmcsIG9wdGlvbnM6IHsgY29tbWVudFN0cmluZyB9IH0gPSBjdHg7XG4gICAgaXRlbUluZGVudCArPSBpbmRlbnRTdGVwO1xuICAgIGNvbnN0IGl0ZW1DdHggPSBPYmplY3QuYXNzaWduKHt9LCBjdHgsIHtcbiAgICAgICAgaW5kZW50OiBpdGVtSW5kZW50LFxuICAgICAgICBpbkZsb3c6IHRydWUsXG4gICAgICAgIHR5cGU6IG51bGxcbiAgICB9KTtcbiAgICBsZXQgcmVxTmV3bGluZSA9IGZhbHNlO1xuICAgIGxldCBsaW5lc0F0VmFsdWUgPSAwO1xuICAgIGNvbnN0IGxpbmVzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7ICsraSkge1xuICAgICAgICBjb25zdCBpdGVtID0gaXRlbXNbaV07XG4gICAgICAgIGxldCBjb21tZW50ID0gbnVsbDtcbiAgICAgICAgaWYgKGlzTm9kZShpdGVtKSkge1xuICAgICAgICAgICAgaWYgKGl0ZW0uc3BhY2VCZWZvcmUpXG4gICAgICAgICAgICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgICAgICAgICBhZGRDb21tZW50QmVmb3JlKGN0eCwgbGluZXMsIGl0ZW0uY29tbWVudEJlZm9yZSwgZmFsc2UpO1xuICAgICAgICAgICAgaWYgKGl0ZW0uY29tbWVudClcbiAgICAgICAgICAgICAgICBjb21tZW50ID0gaXRlbS5jb21tZW50O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzUGFpcihpdGVtKSkge1xuICAgICAgICAgICAgY29uc3QgaWsgPSBpc05vZGUoaXRlbS5rZXkpID8gaXRlbS5rZXkgOiBudWxsO1xuICAgICAgICAgICAgaWYgKGlrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlrLnNwYWNlQmVmb3JlKVxuICAgICAgICAgICAgICAgICAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICAgICAgICAgICAgICBhZGRDb21tZW50QmVmb3JlKGN0eCwgbGluZXMsIGlrLmNvbW1lbnRCZWZvcmUsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBpZiAoaWsuY29tbWVudClcbiAgICAgICAgICAgICAgICAgICAgcmVxTmV3bGluZSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBpdiA9IGlzTm9kZShpdGVtLnZhbHVlKSA/IGl0ZW0udmFsdWUgOiBudWxsO1xuICAgICAgICAgICAgaWYgKGl2KSB7XG4gICAgICAgICAgICAgICAgaWYgKGl2LmNvbW1lbnQpXG4gICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBpdi5jb21tZW50O1xuICAgICAgICAgICAgICAgIGlmIChpdi5jb21tZW50QmVmb3JlKVxuICAgICAgICAgICAgICAgICAgICByZXFOZXdsaW5lID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGl0ZW0udmFsdWUgPT0gbnVsbCAmJiBpaz8uY29tbWVudCkge1xuICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBpay5jb21tZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjb21tZW50KVxuICAgICAgICAgICAgcmVxTmV3bGluZSA9IHRydWU7XG4gICAgICAgIGxldCBzdHIgPSBzdHJpbmdpZnkoaXRlbSwgaXRlbUN0eCwgKCkgPT4gKGNvbW1lbnQgPSBudWxsKSk7XG4gICAgICAgIHJlcU5ld2xpbmUgfHwgKHJlcU5ld2xpbmUgPSBsaW5lcy5sZW5ndGggPiBsaW5lc0F0VmFsdWUgfHwgc3RyLmluY2x1ZGVzKCdcXG4nKSk7XG4gICAgICAgIGlmIChpIDwgaXRlbXMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgc3RyICs9ICcsJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjdHgub3B0aW9ucy50cmFpbGluZ0NvbW1hKSB7XG4gICAgICAgICAgICBpZiAoY3R4Lm9wdGlvbnMubGluZVdpZHRoID4gMCkge1xuICAgICAgICAgICAgICAgIHJlcU5ld2xpbmUgfHwgKHJlcU5ld2xpbmUgPSBsaW5lcy5yZWR1Y2UoKHN1bSwgbGluZSkgPT4gc3VtICsgbGluZS5sZW5ndGggKyAyLCAyKSArXG4gICAgICAgICAgICAgICAgICAgIChzdHIubGVuZ3RoICsgMikgPlxuICAgICAgICAgICAgICAgICAgICBjdHgub3B0aW9ucy5saW5lV2lkdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlcU5ld2xpbmUpIHtcbiAgICAgICAgICAgICAgICBzdHIgKz0gJywnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjb21tZW50KVxuICAgICAgICAgICAgc3RyICs9IGxpbmVDb21tZW50KHN0ciwgaXRlbUluZGVudCwgY29tbWVudFN0cmluZyhjb21tZW50KSk7XG4gICAgICAgIGxpbmVzLnB1c2goc3RyKTtcbiAgICAgICAgbGluZXNBdFZhbHVlID0gbGluZXMubGVuZ3RoO1xuICAgIH1cbiAgICBjb25zdCB7IHN0YXJ0LCBlbmQgfSA9IGZsb3dDaGFycztcbiAgICBpZiAobGluZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBzdGFydCArIGVuZDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlmICghcmVxTmV3bGluZSkge1xuICAgICAgICAgICAgY29uc3QgbGVuID0gbGluZXMucmVkdWNlKChzdW0sIGxpbmUpID0+IHN1bSArIGxpbmUubGVuZ3RoICsgMiwgMik7XG4gICAgICAgICAgICByZXFOZXdsaW5lID0gY3R4Lm9wdGlvbnMubGluZVdpZHRoID4gMCAmJiBsZW4gPiBjdHgub3B0aW9ucy5saW5lV2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlcU5ld2xpbmUpIHtcbiAgICAgICAgICAgIGxldCBzdHIgPSBzdGFydDtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcylcbiAgICAgICAgICAgICAgICBzdHIgKz0gbGluZSA/IGBcXG4ke2luZGVudFN0ZXB9JHtpbmRlbnR9JHtsaW5lfWAgOiAnXFxuJztcbiAgICAgICAgICAgIHJldHVybiBgJHtzdHJ9XFxuJHtpbmRlbnR9JHtlbmR9YDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBgJHtzdGFydH0ke2ZjUGFkZGluZ30ke2xpbmVzLmpvaW4oJyAnKX0ke2ZjUGFkZGluZ30ke2VuZH1gO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gYWRkQ29tbWVudEJlZm9yZSh7IGluZGVudCwgb3B0aW9uczogeyBjb21tZW50U3RyaW5nIH0gfSwgbGluZXMsIGNvbW1lbnQsIGNob21wS2VlcCkge1xuICAgIGlmIChjb21tZW50ICYmIGNob21wS2VlcClcbiAgICAgICAgY29tbWVudCA9IGNvbW1lbnQucmVwbGFjZSgvXlxcbisvLCAnJyk7XG4gICAgaWYgKGNvbW1lbnQpIHtcbiAgICAgICAgY29uc3QgaWMgPSBpbmRlbnRDb21tZW50KGNvbW1lbnRTdHJpbmcoY29tbWVudCksIGluZGVudCk7XG4gICAgICAgIGxpbmVzLnB1c2goaWMudHJpbVN0YXJ0KCkpOyAvLyBBdm9pZCBkb3VibGUgaW5kZW50IG9uIGZpcnN0IGxpbmVcbiAgICB9XG59XG5cbmV4cG9ydCB7IHN0cmluZ2lmeUNvbGxlY3Rpb24gfTtcbiIsImltcG9ydCB7IHN0cmluZ2lmeUNvbGxlY3Rpb24gfSBmcm9tICcuLi9zdHJpbmdpZnkvc3RyaW5naWZ5Q29sbGVjdGlvbi5qcyc7XG5pbXBvcnQgeyBhZGRQYWlyVG9KU01hcCB9IGZyb20gJy4vYWRkUGFpclRvSlNNYXAuanMnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbiB9IGZyb20gJy4vQ29sbGVjdGlvbi5qcyc7XG5pbXBvcnQgeyBNQVAsIGlzUGFpciwgaXNTY2FsYXIgfSBmcm9tICcuL2lkZW50aXR5LmpzJztcbmltcG9ydCB7IFBhaXIsIGNyZWF0ZVBhaXIgfSBmcm9tICcuL1BhaXIuanMnO1xuaW1wb3J0IHsgaXNTY2FsYXJWYWx1ZSB9IGZyb20gJy4vU2NhbGFyLmpzJztcblxuZnVuY3Rpb24gZmluZFBhaXIoaXRlbXMsIGtleSkge1xuICAgIGNvbnN0IGsgPSBpc1NjYWxhcihrZXkpID8ga2V5LnZhbHVlIDoga2V5O1xuICAgIGZvciAoY29uc3QgaXQgb2YgaXRlbXMpIHtcbiAgICAgICAgaWYgKGlzUGFpcihpdCkpIHtcbiAgICAgICAgICAgIGlmIChpdC5rZXkgPT09IGtleSB8fCBpdC5rZXkgPT09IGspXG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0O1xuICAgICAgICAgICAgaWYgKGlzU2NhbGFyKGl0LmtleSkgJiYgaXQua2V5LnZhbHVlID09PSBrKVxuICAgICAgICAgICAgICAgIHJldHVybiBpdDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xufVxuY2xhc3MgWUFNTE1hcCBleHRlbmRzIENvbGxlY3Rpb24ge1xuICAgIHN0YXRpYyBnZXQgdGFnTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuICd0YWc6eWFtbC5vcmcsMjAwMjptYXAnO1xuICAgIH1cbiAgICBjb25zdHJ1Y3RvcihzY2hlbWEpIHtcbiAgICAgICAgc3VwZXIoTUFQLCBzY2hlbWEpO1xuICAgICAgICB0aGlzLml0ZW1zID0gW107XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgZ2VuZXJpYyBjb2xsZWN0aW9uIHBhcnNpbmcgbWV0aG9kIHRoYXQgY2FuIGJlIGV4dGVuZGVkXG4gICAgICogdG8gb3RoZXIgbm9kZSBjbGFzc2VzIHRoYXQgaW5oZXJpdCBmcm9tIFlBTUxNYXBcbiAgICAgKi9cbiAgICBzdGF0aWMgZnJvbShzY2hlbWEsIG9iaiwgY3R4KSB7XG4gICAgICAgIGNvbnN0IHsga2VlcFVuZGVmaW5lZCwgcmVwbGFjZXIgfSA9IGN0eDtcbiAgICAgICAgY29uc3QgbWFwID0gbmV3IHRoaXMoc2NoZW1hKTtcbiAgICAgICAgY29uc3QgYWRkID0gKGtleSwgdmFsdWUpID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcmVwbGFjZXIgPT09ICdmdW5jdGlvbicpXG4gICAgICAgICAgICAgICAgdmFsdWUgPSByZXBsYWNlci5jYWxsKG9iaiwga2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHJlcGxhY2VyKSAmJiAhcmVwbGFjZXIuaW5jbHVkZXMoa2V5KSlcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCB8fCBrZWVwVW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgIG1hcC5pdGVtcy5wdXNoKGNyZWF0ZVBhaXIoa2V5LCB2YWx1ZSwgY3R4KSk7XG4gICAgICAgIH07XG4gICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBNYXApIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIG9iailcbiAgICAgICAgICAgICAgICBhZGQoa2V5LCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAob2JqICYmIHR5cGVvZiBvYmogPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhvYmopKVxuICAgICAgICAgICAgICAgIGFkZChrZXksIG9ialtrZXldKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHNjaGVtYS5zb3J0TWFwRW50cmllcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgbWFwLml0ZW1zLnNvcnQoc2NoZW1hLnNvcnRNYXBFbnRyaWVzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWFwO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgdmFsdWUgdG8gdGhlIGNvbGxlY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3ZlcndyaXRlIC0gSWYgbm90IHNldCBgdHJ1ZWAsIHVzaW5nIGEga2V5IHRoYXQgaXMgYWxyZWFkeSBpbiB0aGVcbiAgICAgKiAgIGNvbGxlY3Rpb24gd2lsbCB0aHJvdy4gT3RoZXJ3aXNlLCBvdmVyd3JpdGVzIHRoZSBwcmV2aW91cyB2YWx1ZS5cbiAgICAgKi9cbiAgICBhZGQocGFpciwgb3ZlcndyaXRlKSB7XG4gICAgICAgIGxldCBfcGFpcjtcbiAgICAgICAgaWYgKGlzUGFpcihwYWlyKSlcbiAgICAgICAgICAgIF9wYWlyID0gcGFpcjtcbiAgICAgICAgZWxzZSBpZiAoIXBhaXIgfHwgdHlwZW9mIHBhaXIgIT09ICdvYmplY3QnIHx8ICEoJ2tleScgaW4gcGFpcikpIHtcbiAgICAgICAgICAgIC8vIEluIFR5cGVTY3JpcHQsIHRoaXMgbmV2ZXIgaGFwcGVucy5cbiAgICAgICAgICAgIF9wYWlyID0gbmV3IFBhaXIocGFpciwgcGFpcj8udmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIF9wYWlyID0gbmV3IFBhaXIocGFpci5rZXksIHBhaXIudmFsdWUpO1xuICAgICAgICBjb25zdCBwcmV2ID0gZmluZFBhaXIodGhpcy5pdGVtcywgX3BhaXIua2V5KTtcbiAgICAgICAgY29uc3Qgc29ydEVudHJpZXMgPSB0aGlzLnNjaGVtYT8uc29ydE1hcEVudHJpZXM7XG4gICAgICAgIGlmIChwcmV2KSB7XG4gICAgICAgICAgICBpZiAoIW92ZXJ3cml0ZSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEtleSAke19wYWlyLmtleX0gYWxyZWFkeSBzZXRgKTtcbiAgICAgICAgICAgIC8vIEZvciBzY2FsYXJzLCBrZWVwIHRoZSBvbGQgbm9kZSAmIGl0cyBjb21tZW50cyBhbmQgYW5jaG9yc1xuICAgICAgICAgICAgaWYgKGlzU2NhbGFyKHByZXYudmFsdWUpICYmIGlzU2NhbGFyVmFsdWUoX3BhaXIudmFsdWUpKVxuICAgICAgICAgICAgICAgIHByZXYudmFsdWUudmFsdWUgPSBfcGFpci52YWx1ZTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBwcmV2LnZhbHVlID0gX3BhaXIudmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc29ydEVudHJpZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGkgPSB0aGlzLml0ZW1zLmZpbmRJbmRleChpdGVtID0+IHNvcnRFbnRyaWVzKF9wYWlyLCBpdGVtKSA8IDApO1xuICAgICAgICAgICAgaWYgKGkgPT09IC0xKVxuICAgICAgICAgICAgICAgIHRoaXMuaXRlbXMucHVzaChfcGFpcik7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdGhpcy5pdGVtcy5zcGxpY2UoaSwgMCwgX3BhaXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5pdGVtcy5wdXNoKF9wYWlyKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBkZWxldGUoa2V5KSB7XG4gICAgICAgIGNvbnN0IGl0ID0gZmluZFBhaXIodGhpcy5pdGVtcywga2V5KTtcbiAgICAgICAgaWYgKCFpdClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgZGVsID0gdGhpcy5pdGVtcy5zcGxpY2UodGhpcy5pdGVtcy5pbmRleE9mKGl0KSwgMSk7XG4gICAgICAgIHJldHVybiBkZWwubGVuZ3RoID4gMDtcbiAgICB9XG4gICAgZ2V0KGtleSwga2VlcFNjYWxhcikge1xuICAgICAgICBjb25zdCBpdCA9IGZpbmRQYWlyKHRoaXMuaXRlbXMsIGtleSk7XG4gICAgICAgIGNvbnN0IG5vZGUgPSBpdD8udmFsdWU7XG4gICAgICAgIHJldHVybiAoIWtlZXBTY2FsYXIgJiYgaXNTY2FsYXIobm9kZSkgPyBub2RlLnZhbHVlIDogbm9kZSkgPz8gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBoYXMoa2V5KSB7XG4gICAgICAgIHJldHVybiAhIWZpbmRQYWlyKHRoaXMuaXRlbXMsIGtleSk7XG4gICAgfVxuICAgIHNldChrZXksIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuYWRkKG5ldyBQYWlyKGtleSwgdmFsdWUpLCB0cnVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIGN0eCAtIENvbnZlcnNpb24gY29udGV4dCwgb3JpZ2luYWxseSBzZXQgaW4gRG9jdW1lbnQjdG9KUygpXG4gICAgICogQHBhcmFtIHtDbGFzc30gVHlwZSAtIElmIHNldCwgZm9yY2VzIHRoZSByZXR1cm5lZCBjb2xsZWN0aW9uIHR5cGVcbiAgICAgKiBAcmV0dXJucyBJbnN0YW5jZSBvZiBUeXBlLCBNYXAsIG9yIE9iamVjdFxuICAgICAqL1xuICAgIHRvSlNPTihfLCBjdHgsIFR5cGUpIHtcbiAgICAgICAgY29uc3QgbWFwID0gVHlwZSA/IG5ldyBUeXBlKCkgOiBjdHg/Lm1hcEFzTWFwID8gbmV3IE1hcCgpIDoge307XG4gICAgICAgIGlmIChjdHg/Lm9uQ3JlYXRlKVxuICAgICAgICAgICAgY3R4Lm9uQ3JlYXRlKG1hcCk7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLml0ZW1zKVxuICAgICAgICAgICAgYWRkUGFpclRvSlNNYXAoY3R4LCBtYXAsIGl0ZW0pO1xuICAgICAgICByZXR1cm4gbWFwO1xuICAgIH1cbiAgICB0b1N0cmluZyhjdHgsIG9uQ29tbWVudCwgb25DaG9tcEtlZXApIHtcbiAgICAgICAgaWYgKCFjdHgpXG4gICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcyk7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLml0ZW1zKSB7XG4gICAgICAgICAgICBpZiAoIWlzUGFpcihpdGVtKSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1hcCBpdGVtcyBtdXN0IGFsbCBiZSBwYWlyczsgZm91bmQgJHtKU09OLnN0cmluZ2lmeShpdGVtKX0gaW5zdGVhZGApO1xuICAgICAgICB9XG4gICAgICAgIGlmICghY3R4LmFsbE51bGxWYWx1ZXMgJiYgdGhpcy5oYXNBbGxOdWxsVmFsdWVzKGZhbHNlKSlcbiAgICAgICAgICAgIGN0eCA9IE9iamVjdC5hc3NpZ24oe30sIGN0eCwgeyBhbGxOdWxsVmFsdWVzOiB0cnVlIH0pO1xuICAgICAgICByZXR1cm4gc3RyaW5naWZ5Q29sbGVjdGlvbih0aGlzLCBjdHgsIHtcbiAgICAgICAgICAgIGJsb2NrSXRlbVByZWZpeDogJycsXG4gICAgICAgICAgICBmbG93Q2hhcnM6IHsgc3RhcnQ6ICd7JywgZW5kOiAnfScgfSxcbiAgICAgICAgICAgIGl0ZW1JbmRlbnQ6IGN0eC5pbmRlbnQgfHwgJycsXG4gICAgICAgICAgICBvbkNob21wS2VlcCxcbiAgICAgICAgICAgIG9uQ29tbWVudFxuICAgICAgICB9KTtcbiAgICB9XG59XG5cbmV4cG9ydCB7IFlBTUxNYXAsIGZpbmRQYWlyIH07XG4iLCJpbXBvcnQgeyBpc01hcCB9IGZyb20gJy4uLy4uL25vZGVzL2lkZW50aXR5LmpzJztcbmltcG9ydCB7IFlBTUxNYXAgfSBmcm9tICcuLi8uLi9ub2Rlcy9ZQU1MTWFwLmpzJztcblxuY29uc3QgbWFwID0ge1xuICAgIGNvbGxlY3Rpb246ICdtYXAnLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgbm9kZUNsYXNzOiBZQU1MTWFwLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOm1hcCcsXG4gICAgcmVzb2x2ZShtYXAsIG9uRXJyb3IpIHtcbiAgICAgICAgaWYgKCFpc01hcChtYXApKVxuICAgICAgICAgICAgb25FcnJvcignRXhwZWN0ZWQgYSBtYXBwaW5nIGZvciB0aGlzIHRhZycpO1xuICAgICAgICByZXR1cm4gbWFwO1xuICAgIH0sXG4gICAgY3JlYXRlTm9kZTogKHNjaGVtYSwgb2JqLCBjdHgpID0+IFlBTUxNYXAuZnJvbShzY2hlbWEsIG9iaiwgY3R4KVxufTtcblxuZXhwb3J0IHsgbWFwIH07XG4iLCJpbXBvcnQgeyBjcmVhdGVOb2RlIH0gZnJvbSAnLi4vZG9jL2NyZWF0ZU5vZGUuanMnO1xuaW1wb3J0IHsgc3RyaW5naWZ5Q29sbGVjdGlvbiB9IGZyb20gJy4uL3N0cmluZ2lmeS9zdHJpbmdpZnlDb2xsZWN0aW9uLmpzJztcbmltcG9ydCB7IENvbGxlY3Rpb24gfSBmcm9tICcuL0NvbGxlY3Rpb24uanMnO1xuaW1wb3J0IHsgU0VRLCBpc1NjYWxhciB9IGZyb20gJy4vaWRlbnRpdHkuanMnO1xuaW1wb3J0IHsgaXNTY2FsYXJWYWx1ZSB9IGZyb20gJy4vU2NhbGFyLmpzJztcbmltcG9ydCB7IHRvSlMgfSBmcm9tICcuL3RvSlMuanMnO1xuXG5jbGFzcyBZQU1MU2VxIGV4dGVuZHMgQ29sbGVjdGlvbiB7XG4gICAgc3RhdGljIGdldCB0YWdOYW1lKCkge1xuICAgICAgICByZXR1cm4gJ3RhZzp5YW1sLm9yZywyMDAyOnNlcSc7XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKHNjaGVtYSkge1xuICAgICAgICBzdXBlcihTRVEsIHNjaGVtYSk7XG4gICAgICAgIHRoaXMuaXRlbXMgPSBbXTtcbiAgICB9XG4gICAgYWRkKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuaXRlbXMucHVzaCh2YWx1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYSB2YWx1ZSBmcm9tIHRoZSBjb2xsZWN0aW9uLlxuICAgICAqXG4gICAgICogYGtleWAgbXVzdCBjb250YWluIGEgcmVwcmVzZW50YXRpb24gb2YgYW4gaW50ZWdlciBmb3IgdGhpcyB0byBzdWNjZWVkLlxuICAgICAqIEl0IG1heSBiZSB3cmFwcGVkIGluIGEgYFNjYWxhcmAuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGl0ZW0gd2FzIGZvdW5kIGFuZCByZW1vdmVkLlxuICAgICAqL1xuICAgIGRlbGV0ZShrZXkpIHtcbiAgICAgICAgY29uc3QgaWR4ID0gYXNJdGVtSW5kZXgoa2V5KTtcbiAgICAgICAgaWYgKHR5cGVvZiBpZHggIT09ICdudW1iZXInKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjb25zdCBkZWwgPSB0aGlzLml0ZW1zLnNwbGljZShpZHgsIDEpO1xuICAgICAgICByZXR1cm4gZGVsLmxlbmd0aCA+IDA7XG4gICAgfVxuICAgIGdldChrZXksIGtlZXBTY2FsYXIpIHtcbiAgICAgICAgY29uc3QgaWR4ID0gYXNJdGVtSW5kZXgoa2V5KTtcbiAgICAgICAgaWYgKHR5cGVvZiBpZHggIT09ICdudW1iZXInKVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgaXQgPSB0aGlzLml0ZW1zW2lkeF07XG4gICAgICAgIHJldHVybiAha2VlcFNjYWxhciAmJiBpc1NjYWxhcihpdCkgPyBpdC52YWx1ZSA6IGl0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhlIGNvbGxlY3Rpb24gaW5jbHVkZXMgYSB2YWx1ZSB3aXRoIHRoZSBrZXkgYGtleWAuXG4gICAgICpcbiAgICAgKiBga2V5YCBtdXN0IGNvbnRhaW4gYSByZXByZXNlbnRhdGlvbiBvZiBhbiBpbnRlZ2VyIGZvciB0aGlzIHRvIHN1Y2NlZWQuXG4gICAgICogSXQgbWF5IGJlIHdyYXBwZWQgaW4gYSBgU2NhbGFyYC5cbiAgICAgKi9cbiAgICBoYXMoa2V5KSB7XG4gICAgICAgIGNvbnN0IGlkeCA9IGFzSXRlbUluZGV4KGtleSk7XG4gICAgICAgIHJldHVybiB0eXBlb2YgaWR4ID09PSAnbnVtYmVyJyAmJiBpZHggPCB0aGlzLml0ZW1zLmxlbmd0aDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyBhIHZhbHVlIGluIHRoaXMgY29sbGVjdGlvbi4gRm9yIGAhIXNldGAsIGB2YWx1ZWAgbmVlZHMgdG8gYmUgYVxuICAgICAqIGJvb2xlYW4gdG8gYWRkL3JlbW92ZSB0aGUgaXRlbSBmcm9tIHRoZSBzZXQuXG4gICAgICpcbiAgICAgKiBJZiBga2V5YCBkb2VzIG5vdCBjb250YWluIGEgcmVwcmVzZW50YXRpb24gb2YgYW4gaW50ZWdlciwgdGhpcyB3aWxsIHRocm93LlxuICAgICAqIEl0IG1heSBiZSB3cmFwcGVkIGluIGEgYFNjYWxhcmAuXG4gICAgICovXG4gICAgc2V0KGtleSwgdmFsdWUpIHtcbiAgICAgICAgY29uc3QgaWR4ID0gYXNJdGVtSW5kZXgoa2V5KTtcbiAgICAgICAgaWYgKHR5cGVvZiBpZHggIT09ICdudW1iZXInKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBhIHZhbGlkIGluZGV4LCBub3QgJHtrZXl9LmApO1xuICAgICAgICBjb25zdCBwcmV2ID0gdGhpcy5pdGVtc1tpZHhdO1xuICAgICAgICBpZiAoaXNTY2FsYXIocHJldikgJiYgaXNTY2FsYXJWYWx1ZSh2YWx1ZSkpXG4gICAgICAgICAgICBwcmV2LnZhbHVlID0gdmFsdWU7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRoaXMuaXRlbXNbaWR4XSA9IHZhbHVlO1xuICAgIH1cbiAgICB0b0pTT04oXywgY3R4KSB7XG4gICAgICAgIGNvbnN0IHNlcSA9IFtdO1xuICAgICAgICBpZiAoY3R4Py5vbkNyZWF0ZSlcbiAgICAgICAgICAgIGN0eC5vbkNyZWF0ZShzZXEpO1xuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLml0ZW1zKVxuICAgICAgICAgICAgc2VxLnB1c2godG9KUyhpdGVtLCBTdHJpbmcoaSsrKSwgY3R4KSk7XG4gICAgICAgIHJldHVybiBzZXE7XG4gICAgfVxuICAgIHRvU3RyaW5nKGN0eCwgb25Db21tZW50LCBvbkNob21wS2VlcCkge1xuICAgICAgICBpZiAoIWN0eClcbiAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzKTtcbiAgICAgICAgcmV0dXJuIHN0cmluZ2lmeUNvbGxlY3Rpb24odGhpcywgY3R4LCB7XG4gICAgICAgICAgICBibG9ja0l0ZW1QcmVmaXg6ICctICcsXG4gICAgICAgICAgICBmbG93Q2hhcnM6IHsgc3RhcnQ6ICdbJywgZW5kOiAnXScgfSxcbiAgICAgICAgICAgIGl0ZW1JbmRlbnQ6IChjdHguaW5kZW50IHx8ICcnKSArICcgICcsXG4gICAgICAgICAgICBvbkNob21wS2VlcCxcbiAgICAgICAgICAgIG9uQ29tbWVudFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIGZyb20oc2NoZW1hLCBvYmosIGN0eCkge1xuICAgICAgICBjb25zdCB7IHJlcGxhY2VyIH0gPSBjdHg7XG4gICAgICAgIGNvbnN0IHNlcSA9IG5ldyB0aGlzKHNjaGVtYSk7XG4gICAgICAgIGlmIChvYmogJiYgU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChvYmopKSB7XG4gICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICBmb3IgKGxldCBpdCBvZiBvYmopIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlcGxhY2VyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IG9iaiBpbnN0YW5jZW9mIFNldCA/IGl0IDogU3RyaW5nKGkrKyk7XG4gICAgICAgICAgICAgICAgICAgIGl0ID0gcmVwbGFjZXIuY2FsbChvYmosIGtleSwgaXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzZXEuaXRlbXMucHVzaChjcmVhdGVOb2RlKGl0LCB1bmRlZmluZWQsIGN0eCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZXE7XG4gICAgfVxufVxuZnVuY3Rpb24gYXNJdGVtSW5kZXgoa2V5KSB7XG4gICAgbGV0IGlkeCA9IGlzU2NhbGFyKGtleSkgPyBrZXkudmFsdWUgOiBrZXk7XG4gICAgaWYgKGlkeCAmJiB0eXBlb2YgaWR4ID09PSAnc3RyaW5nJylcbiAgICAgICAgaWR4ID0gTnVtYmVyKGlkeCk7XG4gICAgcmV0dXJuIHR5cGVvZiBpZHggPT09ICdudW1iZXInICYmIE51bWJlci5pc0ludGVnZXIoaWR4KSAmJiBpZHggPj0gMFxuICAgICAgICA/IGlkeFxuICAgICAgICA6IG51bGw7XG59XG5cbmV4cG9ydCB7IFlBTUxTZXEgfTtcbiIsImltcG9ydCB7IGlzU2VxIH0gZnJvbSAnLi4vLi4vbm9kZXMvaWRlbnRpdHkuanMnO1xuaW1wb3J0IHsgWUFNTFNlcSB9IGZyb20gJy4uLy4uL25vZGVzL1lBTUxTZXEuanMnO1xuXG5jb25zdCBzZXEgPSB7XG4gICAgY29sbGVjdGlvbjogJ3NlcScsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgICBub2RlQ2xhc3M6IFlBTUxTZXEsXG4gICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6c2VxJyxcbiAgICByZXNvbHZlKHNlcSwgb25FcnJvcikge1xuICAgICAgICBpZiAoIWlzU2VxKHNlcSkpXG4gICAgICAgICAgICBvbkVycm9yKCdFeHBlY3RlZCBhIHNlcXVlbmNlIGZvciB0aGlzIHRhZycpO1xuICAgICAgICByZXR1cm4gc2VxO1xuICAgIH0sXG4gICAgY3JlYXRlTm9kZTogKHNjaGVtYSwgb2JqLCBjdHgpID0+IFlBTUxTZXEuZnJvbShzY2hlbWEsIG9iaiwgY3R4KVxufTtcblxuZXhwb3J0IHsgc2VxIH07XG4iLCJpbXBvcnQgeyBzdHJpbmdpZnlTdHJpbmcgfSBmcm9tICcuLi8uLi9zdHJpbmdpZnkvc3RyaW5naWZ5U3RyaW5nLmpzJztcblxuY29uc3Qgc3RyaW5nID0ge1xuICAgIGlkZW50aWZ5OiB2YWx1ZSA9PiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6c3RyJyxcbiAgICByZXNvbHZlOiBzdHIgPT4gc3RyLFxuICAgIHN0cmluZ2lmeShpdGVtLCBjdHgsIG9uQ29tbWVudCwgb25DaG9tcEtlZXApIHtcbiAgICAgICAgY3R4ID0gT2JqZWN0LmFzc2lnbih7IGFjdHVhbFN0cmluZzogdHJ1ZSB9LCBjdHgpO1xuICAgICAgICByZXR1cm4gc3RyaW5naWZ5U3RyaW5nKGl0ZW0sIGN0eCwgb25Db21tZW50LCBvbkNob21wS2VlcCk7XG4gICAgfVxufTtcblxuZXhwb3J0IHsgc3RyaW5nIH07XG4iLCJpbXBvcnQgeyBTY2FsYXIgfSBmcm9tICcuLi8uLi9ub2Rlcy9TY2FsYXIuanMnO1xuXG5jb25zdCBudWxsVGFnID0ge1xuICAgIGlkZW50aWZ5OiB2YWx1ZSA9PiB2YWx1ZSA9PSBudWxsLFxuICAgIGNyZWF0ZU5vZGU6ICgpID0+IG5ldyBTY2FsYXIobnVsbCksXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjpudWxsJyxcbiAgICB0ZXN0OiAvXig/On58W05uXXVsbHxOVUxMKT8kLyxcbiAgICByZXNvbHZlOiAoKSA9PiBuZXcgU2NhbGFyKG51bGwpLFxuICAgIHN0cmluZ2lmeTogKHsgc291cmNlIH0sIGN0eCkgPT4gdHlwZW9mIHNvdXJjZSA9PT0gJ3N0cmluZycgJiYgbnVsbFRhZy50ZXN0LnRlc3Qoc291cmNlKVxuICAgICAgICA/IHNvdXJjZVxuICAgICAgICA6IGN0eC5vcHRpb25zLm51bGxTdHJcbn07XG5cbmV4cG9ydCB7IG51bGxUYWcgfTtcbiIsImltcG9ydCB7IFNjYWxhciB9IGZyb20gJy4uLy4uL25vZGVzL1NjYWxhci5qcyc7XG5cbmNvbnN0IGJvb2xUYWcgPSB7XG4gICAgaWRlbnRpZnk6IHZhbHVlID0+IHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6Ym9vbCcsXG4gICAgdGVzdDogL14oPzpbVHRdcnVlfFRSVUV8W0ZmXWFsc2V8RkFMU0UpJC8sXG4gICAgcmVzb2x2ZTogc3RyID0+IG5ldyBTY2FsYXIoc3RyWzBdID09PSAndCcgfHwgc3RyWzBdID09PSAnVCcpLFxuICAgIHN0cmluZ2lmeSh7IHNvdXJjZSwgdmFsdWUgfSwgY3R4KSB7XG4gICAgICAgIGlmIChzb3VyY2UgJiYgYm9vbFRhZy50ZXN0LnRlc3Qoc291cmNlKSkge1xuICAgICAgICAgICAgY29uc3Qgc3YgPSBzb3VyY2VbMF0gPT09ICd0JyB8fCBzb3VyY2VbMF0gPT09ICdUJztcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gc3YpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWUgPyBjdHgub3B0aW9ucy50cnVlU3RyIDogY3R4Lm9wdGlvbnMuZmFsc2VTdHI7XG4gICAgfVxufTtcblxuZXhwb3J0IHsgYm9vbFRhZyB9O1xuIiwiZnVuY3Rpb24gc3RyaW5naWZ5TnVtYmVyKHsgZm9ybWF0LCBtaW5GcmFjdGlvbkRpZ2l0cywgdGFnLCB2YWx1ZSB9KSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2JpZ2ludCcpXG4gICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICAgIGNvbnN0IG51bSA9IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgPyB2YWx1ZSA6IE51bWJlcih2YWx1ZSk7XG4gICAgaWYgKCFpc0Zpbml0ZShudW0pKVxuICAgICAgICByZXR1cm4gaXNOYU4obnVtKSA/ICcubmFuJyA6IG51bSA8IDAgPyAnLS5pbmYnIDogJy5pbmYnO1xuICAgIGxldCBuID0gT2JqZWN0LmlzKHZhbHVlLCAtMCkgPyAnLTAnIDogSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICAgIGlmICghZm9ybWF0ICYmXG4gICAgICAgIG1pbkZyYWN0aW9uRGlnaXRzICYmXG4gICAgICAgICghdGFnIHx8IHRhZyA9PT0gJ3RhZzp5YW1sLm9yZywyMDAyOmZsb2F0JykgJiZcbiAgICAgICAgL14tP1xcZC8udGVzdChuKSAmJlxuICAgICAgICAhbi5pbmNsdWRlcygnZScpKSB7XG4gICAgICAgIGxldCBpID0gbi5pbmRleE9mKCcuJyk7XG4gICAgICAgIGlmIChpIDwgMCkge1xuICAgICAgICAgICAgaSA9IG4ubGVuZ3RoO1xuICAgICAgICAgICAgbiArPSAnLic7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGQgPSBtaW5GcmFjdGlvbkRpZ2l0cyAtIChuLmxlbmd0aCAtIGkgLSAxKTtcbiAgICAgICAgd2hpbGUgKGQtLSA+IDApXG4gICAgICAgICAgICBuICs9ICcwJztcbiAgICB9XG4gICAgcmV0dXJuIG47XG59XG5cbmV4cG9ydCB7IHN0cmluZ2lmeU51bWJlciB9O1xuIiwiaW1wb3J0IHsgU2NhbGFyIH0gZnJvbSAnLi4vLi4vbm9kZXMvU2NhbGFyLmpzJztcbmltcG9ydCB7IHN0cmluZ2lmeU51bWJlciB9IGZyb20gJy4uLy4uL3N0cmluZ2lmeS9zdHJpbmdpZnlOdW1iZXIuanMnO1xuXG5jb25zdCBmbG9hdE5hTiA9IHtcbiAgICBpZGVudGlmeTogdmFsdWUgPT4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOmZsb2F0JyxcbiAgICB0ZXN0OiAvXig/OlstK10/XFwuKD86aW5mfEluZnxJTkYpfFxcLm5hbnxcXC5OYU58XFwuTkFOKSQvLFxuICAgIHJlc29sdmU6IHN0ciA9PiBzdHIuc2xpY2UoLTMpLnRvTG93ZXJDYXNlKCkgPT09ICduYW4nXG4gICAgICAgID8gTmFOXG4gICAgICAgIDogc3RyWzBdID09PSAnLSdcbiAgICAgICAgICAgID8gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZXG4gICAgICAgICAgICA6IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSxcbiAgICBzdHJpbmdpZnk6IHN0cmluZ2lmeU51bWJlclxufTtcbmNvbnN0IGZsb2F0RXhwID0ge1xuICAgIGlkZW50aWZ5OiB2YWx1ZSA9PiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6ZmxvYXQnLFxuICAgIGZvcm1hdDogJ0VYUCcsXG4gICAgdGVzdDogL15bLStdPyg/OlxcLlswLTldK3xbMC05XSsoPzpcXC5bMC05XSopPylbZUVdWy0rXT9bMC05XSskLyxcbiAgICByZXNvbHZlOiBzdHIgPT4gcGFyc2VGbG9hdChzdHIpLFxuICAgIHN0cmluZ2lmeShub2RlKSB7XG4gICAgICAgIGNvbnN0IG51bSA9IE51bWJlcihub2RlLnZhbHVlKTtcbiAgICAgICAgcmV0dXJuIGlzRmluaXRlKG51bSkgPyBudW0udG9FeHBvbmVudGlhbCgpIDogc3RyaW5naWZ5TnVtYmVyKG5vZGUpO1xuICAgIH1cbn07XG5jb25zdCBmbG9hdCA9IHtcbiAgICBpZGVudGlmeTogdmFsdWUgPT4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOmZsb2F0JyxcbiAgICB0ZXN0OiAvXlstK10/KD86XFwuWzAtOV0rfFswLTldK1xcLlswLTldKikkLyxcbiAgICByZXNvbHZlKHN0cikge1xuICAgICAgICBjb25zdCBub2RlID0gbmV3IFNjYWxhcihwYXJzZUZsb2F0KHN0cikpO1xuICAgICAgICBjb25zdCBkb3QgPSBzdHIuaW5kZXhPZignLicpO1xuICAgICAgICBpZiAoZG90ICE9PSAtMSAmJiBzdHJbc3RyLmxlbmd0aCAtIDFdID09PSAnMCcpXG4gICAgICAgICAgICBub2RlLm1pbkZyYWN0aW9uRGlnaXRzID0gc3RyLmxlbmd0aCAtIGRvdCAtIDE7XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH0sXG4gICAgc3RyaW5naWZ5OiBzdHJpbmdpZnlOdW1iZXJcbn07XG5cbmV4cG9ydCB7IGZsb2F0LCBmbG9hdEV4cCwgZmxvYXROYU4gfTtcbiIsImltcG9ydCB7IHN0cmluZ2lmeU51bWJlciB9IGZyb20gJy4uLy4uL3N0cmluZ2lmeS9zdHJpbmdpZnlOdW1iZXIuanMnO1xuXG5jb25zdCBpbnRJZGVudGlmeSA9ICh2YWx1ZSkgPT4gdHlwZW9mIHZhbHVlID09PSAnYmlnaW50JyB8fCBOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKTtcbmNvbnN0IGludFJlc29sdmUgPSAoc3RyLCBvZmZzZXQsIHJhZGl4LCB7IGludEFzQmlnSW50IH0pID0+IChpbnRBc0JpZ0ludCA/IEJpZ0ludChzdHIpIDogcGFyc2VJbnQoc3RyLnN1YnN0cmluZyhvZmZzZXQpLCByYWRpeCkpO1xuZnVuY3Rpb24gaW50U3RyaW5naWZ5KG5vZGUsIHJhZGl4LCBwcmVmaXgpIHtcbiAgICBjb25zdCB7IHZhbHVlIH0gPSBub2RlO1xuICAgIGlmIChpbnRJZGVudGlmeSh2YWx1ZSkgJiYgdmFsdWUgPj0gMClcbiAgICAgICAgcmV0dXJuIHByZWZpeCArIHZhbHVlLnRvU3RyaW5nKHJhZGl4KTtcbiAgICByZXR1cm4gc3RyaW5naWZ5TnVtYmVyKG5vZGUpO1xufVxuY29uc3QgaW50T2N0ID0ge1xuICAgIGlkZW50aWZ5OiB2YWx1ZSA9PiBpbnRJZGVudGlmeSh2YWx1ZSkgJiYgdmFsdWUgPj0gMCxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOmludCcsXG4gICAgZm9ybWF0OiAnT0NUJyxcbiAgICB0ZXN0OiAvXjBvWzAtN10rJC8sXG4gICAgcmVzb2x2ZTogKHN0ciwgX29uRXJyb3IsIG9wdCkgPT4gaW50UmVzb2x2ZShzdHIsIDIsIDgsIG9wdCksXG4gICAgc3RyaW5naWZ5OiBub2RlID0+IGludFN0cmluZ2lmeShub2RlLCA4LCAnMG8nKVxufTtcbmNvbnN0IGludCA9IHtcbiAgICBpZGVudGlmeTogaW50SWRlbnRpZnksXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjppbnQnLFxuICAgIHRlc3Q6IC9eWy0rXT9bMC05XSskLyxcbiAgICByZXNvbHZlOiAoc3RyLCBfb25FcnJvciwgb3B0KSA9PiBpbnRSZXNvbHZlKHN0ciwgMCwgMTAsIG9wdCksXG4gICAgc3RyaW5naWZ5OiBzdHJpbmdpZnlOdW1iZXJcbn07XG5jb25zdCBpbnRIZXggPSB7XG4gICAgaWRlbnRpZnk6IHZhbHVlID0+IGludElkZW50aWZ5KHZhbHVlKSAmJiB2YWx1ZSA+PSAwLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6aW50JyxcbiAgICBmb3JtYXQ6ICdIRVgnLFxuICAgIHRlc3Q6IC9eMHhbMC05YS1mQS1GXSskLyxcbiAgICByZXNvbHZlOiAoc3RyLCBfb25FcnJvciwgb3B0KSA9PiBpbnRSZXNvbHZlKHN0ciwgMiwgMTYsIG9wdCksXG4gICAgc3RyaW5naWZ5OiBub2RlID0+IGludFN0cmluZ2lmeShub2RlLCAxNiwgJzB4Jylcbn07XG5cbmV4cG9ydCB7IGludCwgaW50SGV4LCBpbnRPY3QgfTtcbiIsImltcG9ydCB7IG1hcCB9IGZyb20gJy4uL2NvbW1vbi9tYXAuanMnO1xuaW1wb3J0IHsgbnVsbFRhZyB9IGZyb20gJy4uL2NvbW1vbi9udWxsLmpzJztcbmltcG9ydCB7IHNlcSB9IGZyb20gJy4uL2NvbW1vbi9zZXEuanMnO1xuaW1wb3J0IHsgc3RyaW5nIH0gZnJvbSAnLi4vY29tbW9uL3N0cmluZy5qcyc7XG5pbXBvcnQgeyBib29sVGFnIH0gZnJvbSAnLi9ib29sLmpzJztcbmltcG9ydCB7IGZsb2F0TmFOLCBmbG9hdEV4cCwgZmxvYXQgfSBmcm9tICcuL2Zsb2F0LmpzJztcbmltcG9ydCB7IGludE9jdCwgaW50LCBpbnRIZXggfSBmcm9tICcuL2ludC5qcyc7XG5cbmNvbnN0IHNjaGVtYSA9IFtcbiAgICBtYXAsXG4gICAgc2VxLFxuICAgIHN0cmluZyxcbiAgICBudWxsVGFnLFxuICAgIGJvb2xUYWcsXG4gICAgaW50T2N0LFxuICAgIGludCxcbiAgICBpbnRIZXgsXG4gICAgZmxvYXROYU4sXG4gICAgZmxvYXRFeHAsXG4gICAgZmxvYXRcbl07XG5cbmV4cG9ydCB7IHNjaGVtYSB9O1xuIiwiaW1wb3J0IHsgU2NhbGFyIH0gZnJvbSAnLi4vLi4vbm9kZXMvU2NhbGFyLmpzJztcbmltcG9ydCB7IG1hcCB9IGZyb20gJy4uL2NvbW1vbi9tYXAuanMnO1xuaW1wb3J0IHsgc2VxIH0gZnJvbSAnLi4vY29tbW9uL3NlcS5qcyc7XG5cbmZ1bmN0aW9uIGludElkZW50aWZ5KHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2JpZ2ludCcgfHwgTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSk7XG59XG5jb25zdCBzdHJpbmdpZnlKU09OID0gKHsgdmFsdWUgfSkgPT4gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuY29uc3QganNvblNjYWxhcnMgPSBbXG4gICAge1xuICAgICAgICBpZGVudGlmeTogdmFsdWUgPT4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyxcbiAgICAgICAgZGVmYXVsdDogdHJ1ZSxcbiAgICAgICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6c3RyJyxcbiAgICAgICAgcmVzb2x2ZTogc3RyID0+IHN0cixcbiAgICAgICAgc3RyaW5naWZ5OiBzdHJpbmdpZnlKU09OXG4gICAgfSxcbiAgICB7XG4gICAgICAgIGlkZW50aWZ5OiB2YWx1ZSA9PiB2YWx1ZSA9PSBudWxsLFxuICAgICAgICBjcmVhdGVOb2RlOiAoKSA9PiBuZXcgU2NhbGFyKG51bGwpLFxuICAgICAgICBkZWZhdWx0OiB0cnVlLFxuICAgICAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjpudWxsJyxcbiAgICAgICAgdGVzdDogL15udWxsJC8sXG4gICAgICAgIHJlc29sdmU6ICgpID0+IG51bGwsXG4gICAgICAgIHN0cmluZ2lmeTogc3RyaW5naWZ5SlNPTlxuICAgIH0sXG4gICAge1xuICAgICAgICBpZGVudGlmeTogdmFsdWUgPT4gdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOmJvb2wnLFxuICAgICAgICB0ZXN0OiAvXnRydWUkfF5mYWxzZSQvLFxuICAgICAgICByZXNvbHZlOiBzdHIgPT4gc3RyID09PSAndHJ1ZScsXG4gICAgICAgIHN0cmluZ2lmeTogc3RyaW5naWZ5SlNPTlxuICAgIH0sXG4gICAge1xuICAgICAgICBpZGVudGlmeTogaW50SWRlbnRpZnksXG4gICAgICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOmludCcsXG4gICAgICAgIHRlc3Q6IC9eLT8oPzowfFsxLTldWzAtOV0qKSQvLFxuICAgICAgICByZXNvbHZlOiAoc3RyLCBfb25FcnJvciwgeyBpbnRBc0JpZ0ludCB9KSA9PiBpbnRBc0JpZ0ludCA/IEJpZ0ludChzdHIpIDogcGFyc2VJbnQoc3RyLCAxMCksXG4gICAgICAgIHN0cmluZ2lmeTogKHsgdmFsdWUgfSkgPT4gaW50SWRlbnRpZnkodmFsdWUpID8gdmFsdWUudG9TdHJpbmcoKSA6IEpTT04uc3RyaW5naWZ5KHZhbHVlKVxuICAgIH0sXG4gICAge1xuICAgICAgICBpZGVudGlmeTogdmFsdWUgPT4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyxcbiAgICAgICAgZGVmYXVsdDogdHJ1ZSxcbiAgICAgICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6ZmxvYXQnLFxuICAgICAgICB0ZXN0OiAvXi0/KD86MHxbMS05XVswLTldKikoPzpcXC5bMC05XSopPyg/OltlRV1bLStdP1swLTldKyk/JC8sXG4gICAgICAgIHJlc29sdmU6IHN0ciA9PiBwYXJzZUZsb2F0KHN0ciksXG4gICAgICAgIHN0cmluZ2lmeTogc3RyaW5naWZ5SlNPTlxuICAgIH1cbl07XG5jb25zdCBqc29uRXJyb3IgPSB7XG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgICB0YWc6ICcnLFxuICAgIHRlc3Q6IC9eLyxcbiAgICByZXNvbHZlKHN0ciwgb25FcnJvcikge1xuICAgICAgICBvbkVycm9yKGBVbnJlc29sdmVkIHBsYWluIHNjYWxhciAke0pTT04uc3RyaW5naWZ5KHN0cil9YCk7XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxufTtcbmNvbnN0IHNjaGVtYSA9IFttYXAsIHNlcV0uY29uY2F0KGpzb25TY2FsYXJzLCBqc29uRXJyb3IpO1xuXG5leHBvcnQgeyBzY2hlbWEgfTtcbiIsImltcG9ydCB7IFNjYWxhciB9IGZyb20gJy4uLy4uL25vZGVzL1NjYWxhci5qcyc7XG5pbXBvcnQgeyBzdHJpbmdpZnlTdHJpbmcgfSBmcm9tICcuLi8uLi9zdHJpbmdpZnkvc3RyaW5naWZ5U3RyaW5nLmpzJztcblxuY29uc3QgYmluYXJ5ID0ge1xuICAgIGlkZW50aWZ5OiB2YWx1ZSA9PiB2YWx1ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXksIC8vIEJ1ZmZlciBpbmhlcml0cyBmcm9tIFVpbnQ4QXJyYXlcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjpiaW5hcnknLFxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBCdWZmZXIgaW4gbm9kZSBhbmQgYW4gVWludDhBcnJheSBpbiBicm93c2Vyc1xuICAgICAqXG4gICAgICogVG8gdXNlIHRoZSByZXN1bHRpbmcgYnVmZmVyIGFzIGFuIGltYWdlLCB5b3UnbGwgd2FudCB0byBkbyBzb21ldGhpbmcgbGlrZTpcbiAgICAgKlxuICAgICAqICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtidWZmZXJdLCB7IHR5cGU6ICdpbWFnZS9qcGVnJyB9KVxuICAgICAqICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3Bob3RvJykuc3JjID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKVxuICAgICAqL1xuICAgIHJlc29sdmUoc3JjLCBvbkVycm9yKSB7XG4gICAgICAgIGlmICh0eXBlb2YgYXRvYiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgLy8gT24gSUUgMTEsIGF0b2IoKSBjYW4ndCBoYW5kbGUgbmV3bGluZXNcbiAgICAgICAgICAgIGNvbnN0IHN0ciA9IGF0b2Ioc3JjLnJlcGxhY2UoL1tcXG5cXHJdL2csICcnKSk7XG4gICAgICAgICAgICBjb25zdCBidWZmZXIgPSBuZXcgVWludDhBcnJheShzdHIubGVuZ3RoKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKVxuICAgICAgICAgICAgICAgIGJ1ZmZlcltpXSA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG9uRXJyb3IoJ1RoaXMgZW52aXJvbm1lbnQgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nIGJpbmFyeSB0YWdzOyBlaXRoZXIgQnVmZmVyIG9yIGF0b2IgaXMgcmVxdWlyZWQnKTtcbiAgICAgICAgICAgIHJldHVybiBzcmM7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIHN0cmluZ2lmeSh7IGNvbW1lbnQsIHR5cGUsIHZhbHVlIH0sIGN0eCwgb25Db21tZW50LCBvbkNob21wS2VlcCkge1xuICAgICAgICBpZiAoIXZhbHVlKVxuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICBjb25zdCBidWYgPSB2YWx1ZTsgLy8gY2hlY2tlZCBlYXJsaWVyIGJ5IGJpbmFyeS5pZGVudGlmeSgpXG4gICAgICAgIGxldCBzdHI7XG4gICAgICAgIGlmICh0eXBlb2YgYnRvYSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgbGV0IHMgPSAnJztcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnVmLmxlbmd0aDsgKytpKVxuICAgICAgICAgICAgICAgIHMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0pO1xuICAgICAgICAgICAgc3RyID0gYnRvYShzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBlbnZpcm9ubWVudCBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgYmluYXJ5IHRhZ3M7IGVpdGhlciBCdWZmZXIgb3IgYnRvYSBpcyByZXF1aXJlZCcpO1xuICAgICAgICB9XG4gICAgICAgIHR5cGUgPz8gKHR5cGUgPSBTY2FsYXIuQkxPQ0tfTElURVJBTCk7XG4gICAgICAgIGlmICh0eXBlICE9PSBTY2FsYXIuUVVPVEVfRE9VQkxFKSB7XG4gICAgICAgICAgICBjb25zdCBsaW5lV2lkdGggPSBNYXRoLm1heChjdHgub3B0aW9ucy5saW5lV2lkdGggLSBjdHguaW5kZW50Lmxlbmd0aCwgY3R4Lm9wdGlvbnMubWluQ29udGVudFdpZHRoKTtcbiAgICAgICAgICAgIGNvbnN0IG4gPSBNYXRoLmNlaWwoc3RyLmxlbmd0aCAvIGxpbmVXaWR0aCk7XG4gICAgICAgICAgICBjb25zdCBsaW5lcyA9IG5ldyBBcnJheShuKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBvID0gMDsgaSA8IG47ICsraSwgbyArPSBsaW5lV2lkdGgpIHtcbiAgICAgICAgICAgICAgICBsaW5lc1tpXSA9IHN0ci5zdWJzdHIobywgbGluZVdpZHRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0ciA9IGxpbmVzLmpvaW4odHlwZSA9PT0gU2NhbGFyLkJMT0NLX0xJVEVSQUwgPyAnXFxuJyA6ICcgJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0cmluZ2lmeVN0cmluZyh7IGNvbW1lbnQsIHR5cGUsIHZhbHVlOiBzdHIgfSwgY3R4LCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKTtcbiAgICB9XG59O1xuXG5leHBvcnQgeyBiaW5hcnkgfTtcbiIsImltcG9ydCB7IGlzU2VxLCBpc1BhaXIsIGlzTWFwIH0gZnJvbSAnLi4vLi4vbm9kZXMvaWRlbnRpdHkuanMnO1xuaW1wb3J0IHsgY3JlYXRlUGFpciwgUGFpciB9IGZyb20gJy4uLy4uL25vZGVzL1BhaXIuanMnO1xuaW1wb3J0IHsgU2NhbGFyIH0gZnJvbSAnLi4vLi4vbm9kZXMvU2NhbGFyLmpzJztcbmltcG9ydCB7IFlBTUxTZXEgfSBmcm9tICcuLi8uLi9ub2Rlcy9ZQU1MU2VxLmpzJztcblxuZnVuY3Rpb24gcmVzb2x2ZVBhaXJzKHNlcSwgb25FcnJvcikge1xuICAgIGlmIChpc1NlcShzZXEpKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VxLml0ZW1zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBsZXQgaXRlbSA9IHNlcS5pdGVtc1tpXTtcbiAgICAgICAgICAgIGlmIChpc1BhaXIoaXRlbSkpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBlbHNlIGlmIChpc01hcChpdGVtKSkge1xuICAgICAgICAgICAgICAgIGlmIChpdGVtLml0ZW1zLmxlbmd0aCA+IDEpXG4gICAgICAgICAgICAgICAgICAgIG9uRXJyb3IoJ0VhY2ggcGFpciBtdXN0IGhhdmUgaXRzIG93biBzZXF1ZW5jZSBpbmRpY2F0b3InKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwYWlyID0gaXRlbS5pdGVtc1swXSB8fCBuZXcgUGFpcihuZXcgU2NhbGFyKG51bGwpKTtcbiAgICAgICAgICAgICAgICBpZiAoaXRlbS5jb21tZW50QmVmb3JlKVxuICAgICAgICAgICAgICAgICAgICBwYWlyLmtleS5jb21tZW50QmVmb3JlID0gcGFpci5rZXkuY29tbWVudEJlZm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBgJHtpdGVtLmNvbW1lbnRCZWZvcmV9XFxuJHtwYWlyLmtleS5jb21tZW50QmVmb3JlfWBcbiAgICAgICAgICAgICAgICAgICAgICAgIDogaXRlbS5jb21tZW50QmVmb3JlO1xuICAgICAgICAgICAgICAgIGlmIChpdGVtLmNvbW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY24gPSBwYWlyLnZhbHVlID8/IHBhaXIua2V5O1xuICAgICAgICAgICAgICAgICAgICBjbi5jb21tZW50ID0gY24uY29tbWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBgJHtpdGVtLmNvbW1lbnR9XFxuJHtjbi5jb21tZW50fWBcbiAgICAgICAgICAgICAgICAgICAgICAgIDogaXRlbS5jb21tZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpdGVtID0gcGFpcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNlcS5pdGVtc1tpXSA9IGlzUGFpcihpdGVtKSA/IGl0ZW0gOiBuZXcgUGFpcihpdGVtKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlXG4gICAgICAgIG9uRXJyb3IoJ0V4cGVjdGVkIGEgc2VxdWVuY2UgZm9yIHRoaXMgdGFnJyk7XG4gICAgcmV0dXJuIHNlcTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVBhaXJzKHNjaGVtYSwgaXRlcmFibGUsIGN0eCkge1xuICAgIGNvbnN0IHsgcmVwbGFjZXIgfSA9IGN0eDtcbiAgICBjb25zdCBwYWlycyA9IG5ldyBZQU1MU2VxKHNjaGVtYSk7XG4gICAgcGFpcnMudGFnID0gJ3RhZzp5YW1sLm9yZywyMDAyOnBhaXJzJztcbiAgICBsZXQgaSA9IDA7XG4gICAgaWYgKGl0ZXJhYmxlICYmIFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoaXRlcmFibGUpKVxuICAgICAgICBmb3IgKGxldCBpdCBvZiBpdGVyYWJsZSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiByZXBsYWNlciA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgICAgICBpdCA9IHJlcGxhY2VyLmNhbGwoaXRlcmFibGUsIFN0cmluZyhpKyspLCBpdCk7XG4gICAgICAgICAgICBsZXQga2V5LCB2YWx1ZTtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGl0KSkge1xuICAgICAgICAgICAgICAgIGlmIChpdC5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAga2V5ID0gaXRbMF07XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gaXRbMV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgW2tleSwgdmFsdWVdIHR1cGxlOiAke2l0fWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXQgJiYgaXQgaW5zdGFuY2VvZiBPYmplY3QpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoaXQpO1xuICAgICAgICAgICAgICAgIGlmIChrZXlzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICBrZXkgPSBrZXlzWzBdO1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGl0W2tleV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCB0dXBsZSB3aXRoIG9uZSBrZXksIG5vdCAke2tleXMubGVuZ3RofSBrZXlzYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAga2V5ID0gaXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYWlycy5pdGVtcy5wdXNoKGNyZWF0ZVBhaXIoa2V5LCB2YWx1ZSwgY3R4KSk7XG4gICAgICAgIH1cbiAgICByZXR1cm4gcGFpcnM7XG59XG5jb25zdCBwYWlycyA9IHtcbiAgICBjb2xsZWN0aW9uOiAnc2VxJyxcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjpwYWlycycsXG4gICAgcmVzb2x2ZTogcmVzb2x2ZVBhaXJzLFxuICAgIGNyZWF0ZU5vZGU6IGNyZWF0ZVBhaXJzXG59O1xuXG5leHBvcnQgeyBjcmVhdGVQYWlycywgcGFpcnMsIHJlc29sdmVQYWlycyB9O1xuIiwiaW1wb3J0IHsgaXNTY2FsYXIsIGlzUGFpciB9IGZyb20gJy4uLy4uL25vZGVzL2lkZW50aXR5LmpzJztcbmltcG9ydCB7IHRvSlMgfSBmcm9tICcuLi8uLi9ub2Rlcy90b0pTLmpzJztcbmltcG9ydCB7IFlBTUxNYXAgfSBmcm9tICcuLi8uLi9ub2Rlcy9ZQU1MTWFwLmpzJztcbmltcG9ydCB7IFlBTUxTZXEgfSBmcm9tICcuLi8uLi9ub2Rlcy9ZQU1MU2VxLmpzJztcbmltcG9ydCB7IHJlc29sdmVQYWlycywgY3JlYXRlUGFpcnMgfSBmcm9tICcuL3BhaXJzLmpzJztcblxuY2xhc3MgWUFNTE9NYXAgZXh0ZW5kcyBZQU1MU2VxIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5hZGQgPSBZQU1MTWFwLnByb3RvdHlwZS5hZGQuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5kZWxldGUgPSBZQU1MTWFwLnByb3RvdHlwZS5kZWxldGUuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5nZXQgPSBZQU1MTWFwLnByb3RvdHlwZS5nZXQuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5oYXMgPSBZQU1MTWFwLnByb3RvdHlwZS5oYXMuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5zZXQgPSBZQU1MTWFwLnByb3RvdHlwZS5zZXQuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy50YWcgPSBZQU1MT01hcC50YWc7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIElmIGBjdHhgIGlzIGdpdmVuLCB0aGUgcmV0dXJuIHR5cGUgaXMgYWN0dWFsbHkgYE1hcDx1bmtub3duLCB1bmtub3duPmAsXG4gICAgICogYnV0IFR5cGVTY3JpcHQgd29uJ3QgYWxsb3cgd2lkZW5pbmcgdGhlIHNpZ25hdHVyZSBvZiBhIGNoaWxkIG1ldGhvZC5cbiAgICAgKi9cbiAgICB0b0pTT04oXywgY3R4KSB7XG4gICAgICAgIGlmICghY3R4KVxuICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnRvSlNPTihfKTtcbiAgICAgICAgY29uc3QgbWFwID0gbmV3IE1hcCgpO1xuICAgICAgICBpZiAoY3R4Py5vbkNyZWF0ZSlcbiAgICAgICAgICAgIGN0eC5vbkNyZWF0ZShtYXApO1xuICAgICAgICBmb3IgKGNvbnN0IHBhaXIgb2YgdGhpcy5pdGVtcykge1xuICAgICAgICAgICAgbGV0IGtleSwgdmFsdWU7XG4gICAgICAgICAgICBpZiAoaXNQYWlyKHBhaXIpKSB7XG4gICAgICAgICAgICAgICAga2V5ID0gdG9KUyhwYWlyLmtleSwgJycsIGN0eCk7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB0b0pTKHBhaXIudmFsdWUsIGtleSwgY3R4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGtleSA9IHRvSlMocGFpciwgJycsIGN0eCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWFwLmhhcyhrZXkpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignT3JkZXJlZCBtYXBzIG11c3Qgbm90IGluY2x1ZGUgZHVwbGljYXRlIGtleXMnKTtcbiAgICAgICAgICAgIG1hcC5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1hcDtcbiAgICB9XG4gICAgc3RhdGljIGZyb20oc2NoZW1hLCBpdGVyYWJsZSwgY3R4KSB7XG4gICAgICAgIGNvbnN0IHBhaXJzID0gY3JlYXRlUGFpcnMoc2NoZW1hLCBpdGVyYWJsZSwgY3R4KTtcbiAgICAgICAgY29uc3Qgb21hcCA9IG5ldyB0aGlzKCk7XG4gICAgICAgIG9tYXAuaXRlbXMgPSBwYWlycy5pdGVtcztcbiAgICAgICAgcmV0dXJuIG9tYXA7XG4gICAgfVxufVxuWUFNTE9NYXAudGFnID0gJ3RhZzp5YW1sLm9yZywyMDAyOm9tYXAnO1xuY29uc3Qgb21hcCA9IHtcbiAgICBjb2xsZWN0aW9uOiAnc2VxJyxcbiAgICBpZGVudGlmeTogdmFsdWUgPT4gdmFsdWUgaW5zdGFuY2VvZiBNYXAsXG4gICAgbm9kZUNsYXNzOiBZQU1MT01hcCxcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjpvbWFwJyxcbiAgICByZXNvbHZlKHNlcSwgb25FcnJvcikge1xuICAgICAgICBjb25zdCBwYWlycyA9IHJlc29sdmVQYWlycyhzZXEsIG9uRXJyb3IpO1xuICAgICAgICBjb25zdCBzZWVuS2V5cyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHsga2V5IH0gb2YgcGFpcnMuaXRlbXMpIHtcbiAgICAgICAgICAgIGlmIChpc1NjYWxhcihrZXkpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNlZW5LZXlzLmluY2x1ZGVzKGtleS52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgb25FcnJvcihgT3JkZXJlZCBtYXBzIG11c3Qgbm90IGluY2x1ZGUgZHVwbGljYXRlIGtleXM6ICR7a2V5LnZhbHVlfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc2VlbktleXMucHVzaChrZXkudmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihuZXcgWUFNTE9NYXAoKSwgcGFpcnMpO1xuICAgIH0sXG4gICAgY3JlYXRlTm9kZTogKHNjaGVtYSwgaXRlcmFibGUsIGN0eCkgPT4gWUFNTE9NYXAuZnJvbShzY2hlbWEsIGl0ZXJhYmxlLCBjdHgpXG59O1xuXG5leHBvcnQgeyBZQU1MT01hcCwgb21hcCB9O1xuIiwiaW1wb3J0IHsgU2NhbGFyIH0gZnJvbSAnLi4vLi4vbm9kZXMvU2NhbGFyLmpzJztcblxuZnVuY3Rpb24gYm9vbFN0cmluZ2lmeSh7IHZhbHVlLCBzb3VyY2UgfSwgY3R4KSB7XG4gICAgY29uc3QgYm9vbE9iaiA9IHZhbHVlID8gdHJ1ZVRhZyA6IGZhbHNlVGFnO1xuICAgIGlmIChzb3VyY2UgJiYgYm9vbE9iai50ZXN0LnRlc3Qoc291cmNlKSlcbiAgICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICByZXR1cm4gdmFsdWUgPyBjdHgub3B0aW9ucy50cnVlU3RyIDogY3R4Lm9wdGlvbnMuZmFsc2VTdHI7XG59XG5jb25zdCB0cnVlVGFnID0ge1xuICAgIGlkZW50aWZ5OiB2YWx1ZSA9PiB2YWx1ZSA9PT0gdHJ1ZSxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOmJvb2wnLFxuICAgIHRlc3Q6IC9eKD86WXx5fFtZeV1lc3xZRVN8W1R0XXJ1ZXxUUlVFfFtPb11ufE9OKSQvLFxuICAgIHJlc29sdmU6ICgpID0+IG5ldyBTY2FsYXIodHJ1ZSksXG4gICAgc3RyaW5naWZ5OiBib29sU3RyaW5naWZ5XG59O1xuY29uc3QgZmFsc2VUYWcgPSB7XG4gICAgaWRlbnRpZnk6IHZhbHVlID0+IHZhbHVlID09PSBmYWxzZSxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOmJvb2wnLFxuICAgIHRlc3Q6IC9eKD86TnxufFtObl1vfE5PfFtGZl1hbHNlfEZBTFNFfFtPb11mZnxPRkYpJC8sXG4gICAgcmVzb2x2ZTogKCkgPT4gbmV3IFNjYWxhcihmYWxzZSksXG4gICAgc3RyaW5naWZ5OiBib29sU3RyaW5naWZ5XG59O1xuXG5leHBvcnQgeyBmYWxzZVRhZywgdHJ1ZVRhZyB9O1xuIiwiaW1wb3J0IHsgU2NhbGFyIH0gZnJvbSAnLi4vLi4vbm9kZXMvU2NhbGFyLmpzJztcbmltcG9ydCB7IHN0cmluZ2lmeU51bWJlciB9IGZyb20gJy4uLy4uL3N0cmluZ2lmeS9zdHJpbmdpZnlOdW1iZXIuanMnO1xuXG5jb25zdCBmbG9hdE5hTiA9IHtcbiAgICBpZGVudGlmeTogdmFsdWUgPT4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOmZsb2F0JyxcbiAgICB0ZXN0OiAvXig/OlstK10/XFwuKD86aW5mfEluZnxJTkYpfFxcLm5hbnxcXC5OYU58XFwuTkFOKSQvLFxuICAgIHJlc29sdmU6IChzdHIpID0+IHN0ci5zbGljZSgtMykudG9Mb3dlckNhc2UoKSA9PT0gJ25hbidcbiAgICAgICAgPyBOYU5cbiAgICAgICAgOiBzdHJbMF0gPT09ICctJ1xuICAgICAgICAgICAgPyBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFlcbiAgICAgICAgICAgIDogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLFxuICAgIHN0cmluZ2lmeTogc3RyaW5naWZ5TnVtYmVyXG59O1xuY29uc3QgZmxvYXRFeHAgPSB7XG4gICAgaWRlbnRpZnk6IHZhbHVlID0+IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjpmbG9hdCcsXG4gICAgZm9ybWF0OiAnRVhQJyxcbiAgICB0ZXN0OiAvXlstK10/KD86WzAtOV1bMC05X10qKT8oPzpcXC5bMC05X10qKT9bZUVdWy0rXT9bMC05XSskLyxcbiAgICByZXNvbHZlOiAoc3RyKSA9PiBwYXJzZUZsb2F0KHN0ci5yZXBsYWNlKC9fL2csICcnKSksXG4gICAgc3RyaW5naWZ5KG5vZGUpIHtcbiAgICAgICAgY29uc3QgbnVtID0gTnVtYmVyKG5vZGUudmFsdWUpO1xuICAgICAgICByZXR1cm4gaXNGaW5pdGUobnVtKSA/IG51bS50b0V4cG9uZW50aWFsKCkgOiBzdHJpbmdpZnlOdW1iZXIobm9kZSk7XG4gICAgfVxufTtcbmNvbnN0IGZsb2F0ID0ge1xuICAgIGlkZW50aWZ5OiB2YWx1ZSA9PiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6ZmxvYXQnLFxuICAgIHRlc3Q6IC9eWy0rXT8oPzpbMC05XVswLTlfXSopP1xcLlswLTlfXSokLyxcbiAgICByZXNvbHZlKHN0cikge1xuICAgICAgICBjb25zdCBub2RlID0gbmV3IFNjYWxhcihwYXJzZUZsb2F0KHN0ci5yZXBsYWNlKC9fL2csICcnKSkpO1xuICAgICAgICBjb25zdCBkb3QgPSBzdHIuaW5kZXhPZignLicpO1xuICAgICAgICBpZiAoZG90ICE9PSAtMSkge1xuICAgICAgICAgICAgY29uc3QgZiA9IHN0ci5zdWJzdHJpbmcoZG90ICsgMSkucmVwbGFjZSgvXy9nLCAnJyk7XG4gICAgICAgICAgICBpZiAoZltmLmxlbmd0aCAtIDFdID09PSAnMCcpXG4gICAgICAgICAgICAgICAgbm9kZS5taW5GcmFjdGlvbkRpZ2l0cyA9IGYubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH0sXG4gICAgc3RyaW5naWZ5OiBzdHJpbmdpZnlOdW1iZXJcbn07XG5cbmV4cG9ydCB7IGZsb2F0LCBmbG9hdEV4cCwgZmxvYXROYU4gfTtcbiIsImltcG9ydCB7IHN0cmluZ2lmeU51bWJlciB9IGZyb20gJy4uLy4uL3N0cmluZ2lmeS9zdHJpbmdpZnlOdW1iZXIuanMnO1xuXG5jb25zdCBpbnRJZGVudGlmeSA9ICh2YWx1ZSkgPT4gdHlwZW9mIHZhbHVlID09PSAnYmlnaW50JyB8fCBOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKTtcbmZ1bmN0aW9uIGludFJlc29sdmUoc3RyLCBvZmZzZXQsIHJhZGl4LCB7IGludEFzQmlnSW50IH0pIHtcbiAgICBjb25zdCBzaWduID0gc3RyWzBdO1xuICAgIGlmIChzaWduID09PSAnLScgfHwgc2lnbiA9PT0gJysnKVxuICAgICAgICBvZmZzZXQgKz0gMTtcbiAgICBzdHIgPSBzdHIuc3Vic3RyaW5nKG9mZnNldCkucmVwbGFjZSgvXy9nLCAnJyk7XG4gICAgaWYgKGludEFzQmlnSW50KSB7XG4gICAgICAgIHN3aXRjaCAocmFkaXgpIHtcbiAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICBzdHIgPSBgMGIke3N0cn1gO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgICAgIHN0ciA9IGAwbyR7c3RyfWA7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDE2OlxuICAgICAgICAgICAgICAgIHN0ciA9IGAweCR7c3RyfWA7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbiA9IEJpZ0ludChzdHIpO1xuICAgICAgICByZXR1cm4gc2lnbiA9PT0gJy0nID8gQmlnSW50KC0xKSAqIG4gOiBuO1xuICAgIH1cbiAgICBjb25zdCBuID0gcGFyc2VJbnQoc3RyLCByYWRpeCk7XG4gICAgcmV0dXJuIHNpZ24gPT09ICctJyA/IC0xICogbiA6IG47XG59XG5mdW5jdGlvbiBpbnRTdHJpbmdpZnkobm9kZSwgcmFkaXgsIHByZWZpeCkge1xuICAgIGNvbnN0IHsgdmFsdWUgfSA9IG5vZGU7XG4gICAgaWYgKGludElkZW50aWZ5KHZhbHVlKSkge1xuICAgICAgICBjb25zdCBzdHIgPSB2YWx1ZS50b1N0cmluZyhyYWRpeCk7XG4gICAgICAgIHJldHVybiB2YWx1ZSA8IDAgPyAnLScgKyBwcmVmaXggKyBzdHIuc3Vic3RyKDEpIDogcHJlZml4ICsgc3RyO1xuICAgIH1cbiAgICByZXR1cm4gc3RyaW5naWZ5TnVtYmVyKG5vZGUpO1xufVxuY29uc3QgaW50QmluID0ge1xuICAgIGlkZW50aWZ5OiBpbnRJZGVudGlmeSxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOmludCcsXG4gICAgZm9ybWF0OiAnQklOJyxcbiAgICB0ZXN0OiAvXlstK10/MGJbMC0xX10rJC8sXG4gICAgcmVzb2x2ZTogKHN0ciwgX29uRXJyb3IsIG9wdCkgPT4gaW50UmVzb2x2ZShzdHIsIDIsIDIsIG9wdCksXG4gICAgc3RyaW5naWZ5OiBub2RlID0+IGludFN0cmluZ2lmeShub2RlLCAyLCAnMGInKVxufTtcbmNvbnN0IGludE9jdCA9IHtcbiAgICBpZGVudGlmeTogaW50SWRlbnRpZnksXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjppbnQnLFxuICAgIGZvcm1hdDogJ09DVCcsXG4gICAgdGVzdDogL15bLStdPzBbMC03X10rJC8sXG4gICAgcmVzb2x2ZTogKHN0ciwgX29uRXJyb3IsIG9wdCkgPT4gaW50UmVzb2x2ZShzdHIsIDEsIDgsIG9wdCksXG4gICAgc3RyaW5naWZ5OiBub2RlID0+IGludFN0cmluZ2lmeShub2RlLCA4LCAnMCcpXG59O1xuY29uc3QgaW50ID0ge1xuICAgIGlkZW50aWZ5OiBpbnRJZGVudGlmeSxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOmludCcsXG4gICAgdGVzdDogL15bLStdP1swLTldWzAtOV9dKiQvLFxuICAgIHJlc29sdmU6IChzdHIsIF9vbkVycm9yLCBvcHQpID0+IGludFJlc29sdmUoc3RyLCAwLCAxMCwgb3B0KSxcbiAgICBzdHJpbmdpZnk6IHN0cmluZ2lmeU51bWJlclxufTtcbmNvbnN0IGludEhleCA9IHtcbiAgICBpZGVudGlmeTogaW50SWRlbnRpZnksXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjppbnQnLFxuICAgIGZvcm1hdDogJ0hFWCcsXG4gICAgdGVzdDogL15bLStdPzB4WzAtOWEtZkEtRl9dKyQvLFxuICAgIHJlc29sdmU6IChzdHIsIF9vbkVycm9yLCBvcHQpID0+IGludFJlc29sdmUoc3RyLCAyLCAxNiwgb3B0KSxcbiAgICBzdHJpbmdpZnk6IG5vZGUgPT4gaW50U3RyaW5naWZ5KG5vZGUsIDE2LCAnMHgnKVxufTtcblxuZXhwb3J0IHsgaW50LCBpbnRCaW4sIGludEhleCwgaW50T2N0IH07XG4iLCJpbXBvcnQgeyBpc01hcCwgaXNQYWlyLCBpc1NjYWxhciB9IGZyb20gJy4uLy4uL25vZGVzL2lkZW50aXR5LmpzJztcbmltcG9ydCB7IFBhaXIsIGNyZWF0ZVBhaXIgfSBmcm9tICcuLi8uLi9ub2Rlcy9QYWlyLmpzJztcbmltcG9ydCB7IFlBTUxNYXAsIGZpbmRQYWlyIH0gZnJvbSAnLi4vLi4vbm9kZXMvWUFNTE1hcC5qcyc7XG5cbmNsYXNzIFlBTUxTZXQgZXh0ZW5kcyBZQU1MTWFwIHtcbiAgICBjb25zdHJ1Y3RvcihzY2hlbWEpIHtcbiAgICAgICAgc3VwZXIoc2NoZW1hKTtcbiAgICAgICAgdGhpcy50YWcgPSBZQU1MU2V0LnRhZztcbiAgICB9XG4gICAgYWRkKGtleSkge1xuICAgICAgICBsZXQgcGFpcjtcbiAgICAgICAgaWYgKGlzUGFpcihrZXkpKVxuICAgICAgICAgICAgcGFpciA9IGtleTtcbiAgICAgICAgZWxzZSBpZiAoa2V5ICYmXG4gICAgICAgICAgICB0eXBlb2Yga2V5ID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgJ2tleScgaW4ga2V5ICYmXG4gICAgICAgICAgICAndmFsdWUnIGluIGtleSAmJlxuICAgICAgICAgICAga2V5LnZhbHVlID09PSBudWxsKVxuICAgICAgICAgICAgcGFpciA9IG5ldyBQYWlyKGtleS5rZXksIG51bGwpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBwYWlyID0gbmV3IFBhaXIoa2V5LCBudWxsKTtcbiAgICAgICAgY29uc3QgcHJldiA9IGZpbmRQYWlyKHRoaXMuaXRlbXMsIHBhaXIua2V5KTtcbiAgICAgICAgaWYgKCFwcmV2KVxuICAgICAgICAgICAgdGhpcy5pdGVtcy5wdXNoKHBhaXIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJZiBga2VlcFBhaXJgIGlzIGB0cnVlYCwgcmV0dXJucyB0aGUgUGFpciBtYXRjaGluZyBga2V5YC5cbiAgICAgKiBPdGhlcndpc2UsIHJldHVybnMgdGhlIHZhbHVlIG9mIHRoYXQgUGFpcidzIGtleS5cbiAgICAgKi9cbiAgICBnZXQoa2V5LCBrZWVwUGFpcikge1xuICAgICAgICBjb25zdCBwYWlyID0gZmluZFBhaXIodGhpcy5pdGVtcywga2V5KTtcbiAgICAgICAgcmV0dXJuICFrZWVwUGFpciAmJiBpc1BhaXIocGFpcilcbiAgICAgICAgICAgID8gaXNTY2FsYXIocGFpci5rZXkpXG4gICAgICAgICAgICAgICAgPyBwYWlyLmtleS52YWx1ZVxuICAgICAgICAgICAgICAgIDogcGFpci5rZXlcbiAgICAgICAgICAgIDogcGFpcjtcbiAgICB9XG4gICAgc2V0KGtleSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ2Jvb2xlYW4nKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBib29sZWFuIHZhbHVlIGZvciBzZXQoa2V5LCB2YWx1ZSkgaW4gYSBZQU1MIHNldCwgbm90ICR7dHlwZW9mIHZhbHVlfWApO1xuICAgICAgICBjb25zdCBwcmV2ID0gZmluZFBhaXIodGhpcy5pdGVtcywga2V5KTtcbiAgICAgICAgaWYgKHByZXYgJiYgIXZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLml0ZW1zLnNwbGljZSh0aGlzLml0ZW1zLmluZGV4T2YocHJldiksIDEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCFwcmV2ICYmIHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLml0ZW1zLnB1c2gobmV3IFBhaXIoa2V5KSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdG9KU09OKF8sIGN0eCkge1xuICAgICAgICByZXR1cm4gc3VwZXIudG9KU09OKF8sIGN0eCwgU2V0KTtcbiAgICB9XG4gICAgdG9TdHJpbmcoY3R4LCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKSB7XG4gICAgICAgIGlmICghY3R4KVxuICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMpO1xuICAgICAgICBpZiAodGhpcy5oYXNBbGxOdWxsVmFsdWVzKHRydWUpKVxuICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKE9iamVjdC5hc3NpZ24oe30sIGN0eCwgeyBhbGxOdWxsVmFsdWVzOiB0cnVlIH0pLCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTZXQgaXRlbXMgbXVzdCBhbGwgaGF2ZSBudWxsIHZhbHVlcycpO1xuICAgIH1cbiAgICBzdGF0aWMgZnJvbShzY2hlbWEsIGl0ZXJhYmxlLCBjdHgpIHtcbiAgICAgICAgY29uc3QgeyByZXBsYWNlciB9ID0gY3R4O1xuICAgICAgICBjb25zdCBzZXQgPSBuZXcgdGhpcyhzY2hlbWEpO1xuICAgICAgICBpZiAoaXRlcmFibGUgJiYgU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChpdGVyYWJsZSkpXG4gICAgICAgICAgICBmb3IgKGxldCB2YWx1ZSBvZiBpdGVyYWJsZSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVwbGFjZXIgPT09ICdmdW5jdGlvbicpXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gcmVwbGFjZXIuY2FsbChpdGVyYWJsZSwgdmFsdWUsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBzZXQuaXRlbXMucHVzaChjcmVhdGVQYWlyKHZhbHVlLCBudWxsLCBjdHgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNldDtcbiAgICB9XG59XG5ZQU1MU2V0LnRhZyA9ICd0YWc6eWFtbC5vcmcsMjAwMjpzZXQnO1xuY29uc3Qgc2V0ID0ge1xuICAgIGNvbGxlY3Rpb246ICdtYXAnLFxuICAgIGlkZW50aWZ5OiB2YWx1ZSA9PiB2YWx1ZSBpbnN0YW5jZW9mIFNldCxcbiAgICBub2RlQ2xhc3M6IFlBTUxTZXQsXG4gICAgZGVmYXVsdDogZmFsc2UsXG4gICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6c2V0JyxcbiAgICBjcmVhdGVOb2RlOiAoc2NoZW1hLCBpdGVyYWJsZSwgY3R4KSA9PiBZQU1MU2V0LmZyb20oc2NoZW1hLCBpdGVyYWJsZSwgY3R4KSxcbiAgICByZXNvbHZlKG1hcCwgb25FcnJvcikge1xuICAgICAgICBpZiAoaXNNYXAobWFwKSkge1xuICAgICAgICAgICAgaWYgKG1hcC5oYXNBbGxOdWxsVmFsdWVzKHRydWUpKVxuICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKG5ldyBZQU1MU2V0KCksIG1hcCk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgb25FcnJvcignU2V0IGl0ZW1zIG11c3QgYWxsIGhhdmUgbnVsbCB2YWx1ZXMnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBvbkVycm9yKCdFeHBlY3RlZCBhIG1hcHBpbmcgZm9yIHRoaXMgdGFnJyk7XG4gICAgICAgIHJldHVybiBtYXA7XG4gICAgfVxufTtcblxuZXhwb3J0IHsgWUFNTFNldCwgc2V0IH07XG4iLCJpbXBvcnQgeyBzdHJpbmdpZnlOdW1iZXIgfSBmcm9tICcuLi8uLi9zdHJpbmdpZnkvc3RyaW5naWZ5TnVtYmVyLmpzJztcblxuLyoqIEludGVybmFsIHR5cGVzIGhhbmRsZSBiaWdpbnQgYXMgbnVtYmVyLCBiZWNhdXNlIFRTIGNhbid0IGZpZ3VyZSBpdCBvdXQuICovXG5mdW5jdGlvbiBwYXJzZVNleGFnZXNpbWFsKHN0ciwgYXNCaWdJbnQpIHtcbiAgICBjb25zdCBzaWduID0gc3RyWzBdO1xuICAgIGNvbnN0IHBhcnRzID0gc2lnbiA9PT0gJy0nIHx8IHNpZ24gPT09ICcrJyA/IHN0ci5zdWJzdHJpbmcoMSkgOiBzdHI7XG4gICAgY29uc3QgbnVtID0gKG4pID0+IGFzQmlnSW50ID8gQmlnSW50KG4pIDogTnVtYmVyKG4pO1xuICAgIGNvbnN0IHJlcyA9IHBhcnRzXG4gICAgICAgIC5yZXBsYWNlKC9fL2csICcnKVxuICAgICAgICAuc3BsaXQoJzonKVxuICAgICAgICAucmVkdWNlKChyZXMsIHApID0+IHJlcyAqIG51bSg2MCkgKyBudW0ocCksIG51bSgwKSk7XG4gICAgcmV0dXJuIChzaWduID09PSAnLScgPyBudW0oLTEpICogcmVzIDogcmVzKTtcbn1cbi8qKlxuICogaGhoaDptbTpzcy5zc3NcbiAqXG4gKiBJbnRlcm5hbCB0eXBlcyBoYW5kbGUgYmlnaW50IGFzIG51bWJlciwgYmVjYXVzZSBUUyBjYW4ndCBmaWd1cmUgaXQgb3V0LlxuICovXG5mdW5jdGlvbiBzdHJpbmdpZnlTZXhhZ2VzaW1hbChub2RlKSB7XG4gICAgbGV0IHsgdmFsdWUgfSA9IG5vZGU7XG4gICAgbGV0IG51bSA9IChuKSA9PiBuO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdiaWdpbnQnKVxuICAgICAgICBudW0gPSBuID0+IEJpZ0ludChuKTtcbiAgICBlbHNlIGlmIChpc05hTih2YWx1ZSkgfHwgIWlzRmluaXRlKHZhbHVlKSlcbiAgICAgICAgcmV0dXJuIHN0cmluZ2lmeU51bWJlcihub2RlKTtcbiAgICBsZXQgc2lnbiA9ICcnO1xuICAgIGlmICh2YWx1ZSA8IDApIHtcbiAgICAgICAgc2lnbiA9ICctJztcbiAgICAgICAgdmFsdWUgKj0gbnVtKC0xKTtcbiAgICB9XG4gICAgY29uc3QgXzYwID0gbnVtKDYwKTtcbiAgICBjb25zdCBwYXJ0cyA9IFt2YWx1ZSAlIF82MF07IC8vIHNlY29uZHMsIGluY2x1ZGluZyBtc1xuICAgIGlmICh2YWx1ZSA8IDYwKSB7XG4gICAgICAgIHBhcnRzLnVuc2hpZnQoMCk7IC8vIGF0IGxlYXN0IG9uZSA6IGlzIHJlcXVpcmVkXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB2YWx1ZSA9ICh2YWx1ZSAtIHBhcnRzWzBdKSAvIF82MDtcbiAgICAgICAgcGFydHMudW5zaGlmdCh2YWx1ZSAlIF82MCk7IC8vIG1pbnV0ZXNcbiAgICAgICAgaWYgKHZhbHVlID49IDYwKSB7XG4gICAgICAgICAgICB2YWx1ZSA9ICh2YWx1ZSAtIHBhcnRzWzBdKSAvIF82MDtcbiAgICAgICAgICAgIHBhcnRzLnVuc2hpZnQodmFsdWUpOyAvLyBob3Vyc1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiAoc2lnbiArXG4gICAgICAgIHBhcnRzXG4gICAgICAgICAgICAubWFwKG4gPT4gU3RyaW5nKG4pLnBhZFN0YXJ0KDIsICcwJykpXG4gICAgICAgICAgICAuam9pbignOicpXG4gICAgICAgICAgICAucmVwbGFjZSgvMDAwMDAwXFxkKiQvLCAnJykgLy8gJSA2MCBtYXkgaW50cm9kdWNlIGVycm9yXG4gICAgKTtcbn1cbmNvbnN0IGludFRpbWUgPSB7XG4gICAgaWRlbnRpZnk6IHZhbHVlID0+IHR5cGVvZiB2YWx1ZSA9PT0gJ2JpZ2ludCcgfHwgTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSksXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjppbnQnLFxuICAgIGZvcm1hdDogJ1RJTUUnLFxuICAgIHRlc3Q6IC9eWy0rXT9bMC05XVswLTlfXSooPzo6WzAtNV0/WzAtOV0pKyQvLFxuICAgIHJlc29sdmU6IChzdHIsIF9vbkVycm9yLCB7IGludEFzQmlnSW50IH0pID0+IHBhcnNlU2V4YWdlc2ltYWwoc3RyLCBpbnRBc0JpZ0ludCksXG4gICAgc3RyaW5naWZ5OiBzdHJpbmdpZnlTZXhhZ2VzaW1hbFxufTtcbmNvbnN0IGZsb2F0VGltZSA9IHtcbiAgICBpZGVudGlmeTogdmFsdWUgPT4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOmZsb2F0JyxcbiAgICBmb3JtYXQ6ICdUSU1FJyxcbiAgICB0ZXN0OiAvXlstK10/WzAtOV1bMC05X10qKD86OlswLTVdP1swLTldKStcXC5bMC05X10qJC8sXG4gICAgcmVzb2x2ZTogc3RyID0+IHBhcnNlU2V4YWdlc2ltYWwoc3RyLCBmYWxzZSksXG4gICAgc3RyaW5naWZ5OiBzdHJpbmdpZnlTZXhhZ2VzaW1hbFxufTtcbmNvbnN0IHRpbWVzdGFtcCA9IHtcbiAgICBpZGVudGlmeTogdmFsdWUgPT4gdmFsdWUgaW5zdGFuY2VvZiBEYXRlLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6dGltZXN0YW1wJyxcbiAgICAvLyBJZiB0aGUgdGltZSB6b25lIGlzIG9taXR0ZWQsIHRoZSB0aW1lc3RhbXAgaXMgYXNzdW1lZCB0byBiZSBzcGVjaWZpZWQgaW4gVVRDLiBUaGUgdGltZSBwYXJ0XG4gICAgLy8gbWF5IGJlIG9taXR0ZWQgYWx0b2dldGhlciwgcmVzdWx0aW5nIGluIGEgZGF0ZSBmb3JtYXQuIEluIHN1Y2ggYSBjYXNlLCB0aGUgdGltZSBwYXJ0IGlzXG4gICAgLy8gYXNzdW1lZCB0byBiZSAwMDowMDowMFogKHN0YXJ0IG9mIGRheSwgVVRDKS5cbiAgICB0ZXN0OiBSZWdFeHAoJ14oWzAtOV17NH0pLShbMC05XXsxLDJ9KS0oWzAtOV17MSwyfSknICsgLy8gWVlZWS1NbS1EZFxuICAgICAgICAnKD86JyArIC8vIHRpbWUgaXMgb3B0aW9uYWxcbiAgICAgICAgJyg/OnR8VHxbIFxcXFx0XSspJyArIC8vIHQgfCBUIHwgd2hpdGVzcGFjZVxuICAgICAgICAnKFswLTldezEsMn0pOihbMC05XXsxLDJ9KTooWzAtOV17MSwyfShcXFxcLlswLTldKyk/KScgKyAvLyBIaDpNbTpTcyguc3MpP1xuICAgICAgICAnKD86WyBcXFxcdF0qKFp8Wy0rXVswMTJdP1swLTldKD86OlswLTldezJ9KT8pKT8nICsgLy8gWiB8ICs1IHwgLTAzOjMwXG4gICAgICAgICcpPyQnKSxcbiAgICByZXNvbHZlKHN0cikge1xuICAgICAgICBjb25zdCBtYXRjaCA9IHN0ci5tYXRjaCh0aW1lc3RhbXAudGVzdCk7XG4gICAgICAgIGlmICghbWF0Y2gpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJyEhdGltZXN0YW1wIGV4cGVjdHMgYSBkYXRlLCBzdGFydGluZyB3aXRoIHl5eXktbW0tZGQnKTtcbiAgICAgICAgY29uc3QgWywgeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmRdID0gbWF0Y2gubWFwKE51bWJlcik7XG4gICAgICAgIGNvbnN0IG1pbGxpc2VjID0gbWF0Y2hbN10gPyBOdW1iZXIoKG1hdGNoWzddICsgJzAwJykuc3Vic3RyKDEsIDMpKSA6IDA7XG4gICAgICAgIGxldCBkYXRlID0gRGF0ZS5VVEMoeWVhciwgbW9udGggLSAxLCBkYXksIGhvdXIgfHwgMCwgbWludXRlIHx8IDAsIHNlY29uZCB8fCAwLCBtaWxsaXNlYyk7XG4gICAgICAgIGNvbnN0IHR6ID0gbWF0Y2hbOF07XG4gICAgICAgIGlmICh0eiAmJiB0eiAhPT0gJ1onKSB7XG4gICAgICAgICAgICBsZXQgZCA9IHBhcnNlU2V4YWdlc2ltYWwodHosIGZhbHNlKTtcbiAgICAgICAgICAgIGlmIChNYXRoLmFicyhkKSA8IDMwKVxuICAgICAgICAgICAgICAgIGQgKj0gNjA7XG4gICAgICAgICAgICBkYXRlIC09IDYwMDAwICogZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IERhdGUoZGF0ZSk7XG4gICAgfSxcbiAgICBzdHJpbmdpZnk6ICh7IHZhbHVlIH0pID0+IHZhbHVlPy50b0lTT1N0cmluZygpLnJlcGxhY2UoLyhUMDA6MDA6MDApP1xcLjAwMFokLywgJycpID8/ICcnXG59O1xuXG5leHBvcnQgeyBmbG9hdFRpbWUsIGludFRpbWUsIHRpbWVzdGFtcCB9O1xuIiwiaW1wb3J0IHsgbWFwIH0gZnJvbSAnLi4vY29tbW9uL21hcC5qcyc7XG5pbXBvcnQgeyBudWxsVGFnIH0gZnJvbSAnLi4vY29tbW9uL251bGwuanMnO1xuaW1wb3J0IHsgc2VxIH0gZnJvbSAnLi4vY29tbW9uL3NlcS5qcyc7XG5pbXBvcnQgeyBzdHJpbmcgfSBmcm9tICcuLi9jb21tb24vc3RyaW5nLmpzJztcbmltcG9ydCB7IGJpbmFyeSB9IGZyb20gJy4vYmluYXJ5LmpzJztcbmltcG9ydCB7IHRydWVUYWcsIGZhbHNlVGFnIH0gZnJvbSAnLi9ib29sLmpzJztcbmltcG9ydCB7IGZsb2F0TmFOLCBmbG9hdEV4cCwgZmxvYXQgfSBmcm9tICcuL2Zsb2F0LmpzJztcbmltcG9ydCB7IGludEJpbiwgaW50T2N0LCBpbnQsIGludEhleCB9IGZyb20gJy4vaW50LmpzJztcbmltcG9ydCB7IG1lcmdlIH0gZnJvbSAnLi9tZXJnZS5qcyc7XG5pbXBvcnQgeyBvbWFwIH0gZnJvbSAnLi9vbWFwLmpzJztcbmltcG9ydCB7IHBhaXJzIH0gZnJvbSAnLi9wYWlycy5qcyc7XG5pbXBvcnQgeyBzZXQgfSBmcm9tICcuL3NldC5qcyc7XG5pbXBvcnQgeyBpbnRUaW1lLCBmbG9hdFRpbWUsIHRpbWVzdGFtcCB9IGZyb20gJy4vdGltZXN0YW1wLmpzJztcblxuY29uc3Qgc2NoZW1hID0gW1xuICAgIG1hcCxcbiAgICBzZXEsXG4gICAgc3RyaW5nLFxuICAgIG51bGxUYWcsXG4gICAgdHJ1ZVRhZyxcbiAgICBmYWxzZVRhZyxcbiAgICBpbnRCaW4sXG4gICAgaW50T2N0LFxuICAgIGludCxcbiAgICBpbnRIZXgsXG4gICAgZmxvYXROYU4sXG4gICAgZmxvYXRFeHAsXG4gICAgZmxvYXQsXG4gICAgYmluYXJ5LFxuICAgIG1lcmdlLFxuICAgIG9tYXAsXG4gICAgcGFpcnMsXG4gICAgc2V0LFxuICAgIGludFRpbWUsXG4gICAgZmxvYXRUaW1lLFxuICAgIHRpbWVzdGFtcFxuXTtcblxuZXhwb3J0IHsgc2NoZW1hIH07XG4iLCJpbXBvcnQgeyBtYXAgfSBmcm9tICcuL2NvbW1vbi9tYXAuanMnO1xuaW1wb3J0IHsgbnVsbFRhZyB9IGZyb20gJy4vY29tbW9uL251bGwuanMnO1xuaW1wb3J0IHsgc2VxIH0gZnJvbSAnLi9jb21tb24vc2VxLmpzJztcbmltcG9ydCB7IHN0cmluZyB9IGZyb20gJy4vY29tbW9uL3N0cmluZy5qcyc7XG5pbXBvcnQgeyBib29sVGFnIH0gZnJvbSAnLi9jb3JlL2Jvb2wuanMnO1xuaW1wb3J0IHsgZmxvYXROYU4sIGZsb2F0RXhwLCBmbG9hdCB9IGZyb20gJy4vY29yZS9mbG9hdC5qcyc7XG5pbXBvcnQgeyBpbnRPY3QsIGludEhleCwgaW50IH0gZnJvbSAnLi9jb3JlL2ludC5qcyc7XG5pbXBvcnQgeyBzY2hlbWEgfSBmcm9tICcuL2NvcmUvc2NoZW1hLmpzJztcbmltcG9ydCB7IHNjaGVtYSBhcyBzY2hlbWEkMSB9IGZyb20gJy4vanNvbi9zY2hlbWEuanMnO1xuaW1wb3J0IHsgYmluYXJ5IH0gZnJvbSAnLi95YW1sLTEuMS9iaW5hcnkuanMnO1xuaW1wb3J0IHsgbWVyZ2UgfSBmcm9tICcuL3lhbWwtMS4xL21lcmdlLmpzJztcbmltcG9ydCB7IG9tYXAgfSBmcm9tICcuL3lhbWwtMS4xL29tYXAuanMnO1xuaW1wb3J0IHsgcGFpcnMgfSBmcm9tICcuL3lhbWwtMS4xL3BhaXJzLmpzJztcbmltcG9ydCB7IHNjaGVtYSBhcyBzY2hlbWEkMiB9IGZyb20gJy4veWFtbC0xLjEvc2NoZW1hLmpzJztcbmltcG9ydCB7IHNldCB9IGZyb20gJy4veWFtbC0xLjEvc2V0LmpzJztcbmltcG9ydCB7IHRpbWVzdGFtcCwgaW50VGltZSwgZmxvYXRUaW1lIH0gZnJvbSAnLi95YW1sLTEuMS90aW1lc3RhbXAuanMnO1xuXG5jb25zdCBzY2hlbWFzID0gbmV3IE1hcChbXG4gICAgWydjb3JlJywgc2NoZW1hXSxcbiAgICBbJ2ZhaWxzYWZlJywgW21hcCwgc2VxLCBzdHJpbmddXSxcbiAgICBbJ2pzb24nLCBzY2hlbWEkMV0sXG4gICAgWyd5YW1sMTEnLCBzY2hlbWEkMl0sXG4gICAgWyd5YW1sLTEuMScsIHNjaGVtYSQyXVxuXSk7XG5jb25zdCB0YWdzQnlOYW1lID0ge1xuICAgIGJpbmFyeSxcbiAgICBib29sOiBib29sVGFnLFxuICAgIGZsb2F0LFxuICAgIGZsb2F0RXhwLFxuICAgIGZsb2F0TmFOLFxuICAgIGZsb2F0VGltZSxcbiAgICBpbnQsXG4gICAgaW50SGV4LFxuICAgIGludE9jdCxcbiAgICBpbnRUaW1lLFxuICAgIG1hcCxcbiAgICBtZXJnZSxcbiAgICBudWxsOiBudWxsVGFnLFxuICAgIG9tYXAsXG4gICAgcGFpcnMsXG4gICAgc2VxLFxuICAgIHNldCxcbiAgICB0aW1lc3RhbXBcbn07XG5jb25zdCBjb3JlS25vd25UYWdzID0ge1xuICAgICd0YWc6eWFtbC5vcmcsMjAwMjpiaW5hcnknOiBiaW5hcnksXG4gICAgJ3RhZzp5YW1sLm9yZywyMDAyOm1lcmdlJzogbWVyZ2UsXG4gICAgJ3RhZzp5YW1sLm9yZywyMDAyOm9tYXAnOiBvbWFwLFxuICAgICd0YWc6eWFtbC5vcmcsMjAwMjpwYWlycyc6IHBhaXJzLFxuICAgICd0YWc6eWFtbC5vcmcsMjAwMjpzZXQnOiBzZXQsXG4gICAgJ3RhZzp5YW1sLm9yZywyMDAyOnRpbWVzdGFtcCc6IHRpbWVzdGFtcFxufTtcbmZ1bmN0aW9uIGdldFRhZ3MoY3VzdG9tVGFncywgc2NoZW1hTmFtZSwgYWRkTWVyZ2VUYWcpIHtcbiAgICBjb25zdCBzY2hlbWFUYWdzID0gc2NoZW1hcy5nZXQoc2NoZW1hTmFtZSk7XG4gICAgaWYgKHNjaGVtYVRhZ3MgJiYgIWN1c3RvbVRhZ3MpIHtcbiAgICAgICAgcmV0dXJuIGFkZE1lcmdlVGFnICYmICFzY2hlbWFUYWdzLmluY2x1ZGVzKG1lcmdlKVxuICAgICAgICAgICAgPyBzY2hlbWFUYWdzLmNvbmNhdChtZXJnZSlcbiAgICAgICAgICAgIDogc2NoZW1hVGFncy5zbGljZSgpO1xuICAgIH1cbiAgICBsZXQgdGFncyA9IHNjaGVtYVRhZ3M7XG4gICAgaWYgKCF0YWdzKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGN1c3RvbVRhZ3MpKVxuICAgICAgICAgICAgdGFncyA9IFtdO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGtleXMgPSBBcnJheS5mcm9tKHNjaGVtYXMua2V5cygpKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoa2V5ID0+IGtleSAhPT0gJ3lhbWwxMScpXG4gICAgICAgICAgICAgICAgLm1hcChrZXkgPT4gSlNPTi5zdHJpbmdpZnkoa2V5KSlcbiAgICAgICAgICAgICAgICAuam9pbignLCAnKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBzY2hlbWEgXCIke3NjaGVtYU5hbWV9XCI7IHVzZSBvbmUgb2YgJHtrZXlzfSBvciBkZWZpbmUgY3VzdG9tVGFncyBhcnJheWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KGN1c3RvbVRhZ3MpKSB7XG4gICAgICAgIGZvciAoY29uc3QgdGFnIG9mIGN1c3RvbVRhZ3MpXG4gICAgICAgICAgICB0YWdzID0gdGFncy5jb25jYXQodGFnKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIGN1c3RvbVRhZ3MgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGFncyA9IGN1c3RvbVRhZ3ModGFncy5zbGljZSgpKTtcbiAgICB9XG4gICAgaWYgKGFkZE1lcmdlVGFnKVxuICAgICAgICB0YWdzID0gdGFncy5jb25jYXQobWVyZ2UpO1xuICAgIHJldHVybiB0YWdzLnJlZHVjZSgodGFncywgdGFnKSA9PiB7XG4gICAgICAgIGNvbnN0IHRhZ09iaiA9IHR5cGVvZiB0YWcgPT09ICdzdHJpbmcnID8gdGFnc0J5TmFtZVt0YWddIDogdGFnO1xuICAgICAgICBpZiAoIXRhZ09iaikge1xuICAgICAgICAgICAgY29uc3QgdGFnTmFtZSA9IEpTT04uc3RyaW5naWZ5KHRhZyk7XG4gICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModGFnc0J5TmFtZSlcbiAgICAgICAgICAgICAgICAubWFwKGtleSA9PiBKU09OLnN0cmluZ2lmeShrZXkpKVxuICAgICAgICAgICAgICAgIC5qb2luKCcsICcpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGN1c3RvbSB0YWcgJHt0YWdOYW1lfTsgdXNlIG9uZSBvZiAke2tleXN9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0YWdzLmluY2x1ZGVzKHRhZ09iaikpXG4gICAgICAgICAgICB0YWdzLnB1c2godGFnT2JqKTtcbiAgICAgICAgcmV0dXJuIHRhZ3M7XG4gICAgfSwgW10pO1xufVxuXG5leHBvcnQgeyBjb3JlS25vd25UYWdzLCBnZXRUYWdzIH07XG4iLCJpbXBvcnQgeyBNQVAsIFNDQUxBUiwgU0VRIH0gZnJvbSAnLi4vbm9kZXMvaWRlbnRpdHkuanMnO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAnLi9jb21tb24vbWFwLmpzJztcbmltcG9ydCB7IHNlcSB9IGZyb20gJy4vY29tbW9uL3NlcS5qcyc7XG5pbXBvcnQgeyBzdHJpbmcgfSBmcm9tICcuL2NvbW1vbi9zdHJpbmcuanMnO1xuaW1wb3J0IHsgZ2V0VGFncywgY29yZUtub3duVGFncyB9IGZyb20gJy4vdGFncy5qcyc7XG5cbmNvbnN0IHNvcnRNYXBFbnRyaWVzQnlLZXkgPSAoYSwgYikgPT4gYS5rZXkgPCBiLmtleSA/IC0xIDogYS5rZXkgPiBiLmtleSA/IDEgOiAwO1xuY2xhc3MgU2NoZW1hIHtcbiAgICBjb25zdHJ1Y3Rvcih7IGNvbXBhdCwgY3VzdG9tVGFncywgbWVyZ2UsIHJlc29sdmVLbm93blRhZ3MsIHNjaGVtYSwgc29ydE1hcEVudHJpZXMsIHRvU3RyaW5nRGVmYXVsdHMgfSkge1xuICAgICAgICB0aGlzLmNvbXBhdCA9IEFycmF5LmlzQXJyYXkoY29tcGF0KVxuICAgICAgICAgICAgPyBnZXRUYWdzKGNvbXBhdCwgJ2NvbXBhdCcpXG4gICAgICAgICAgICA6IGNvbXBhdFxuICAgICAgICAgICAgICAgID8gZ2V0VGFncyhudWxsLCBjb21wYXQpXG4gICAgICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICB0aGlzLm5hbWUgPSAodHlwZW9mIHNjaGVtYSA9PT0gJ3N0cmluZycgJiYgc2NoZW1hKSB8fCAnY29yZSc7XG4gICAgICAgIHRoaXMua25vd25UYWdzID0gcmVzb2x2ZUtub3duVGFncyA/IGNvcmVLbm93blRhZ3MgOiB7fTtcbiAgICAgICAgdGhpcy50YWdzID0gZ2V0VGFncyhjdXN0b21UYWdzLCB0aGlzLm5hbWUsIG1lcmdlKTtcbiAgICAgICAgdGhpcy50b1N0cmluZ09wdGlvbnMgPSB0b1N0cmluZ0RlZmF1bHRzID8/IG51bGw7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBNQVAsIHsgdmFsdWU6IG1hcCB9KTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFNDQUxBUiwgeyB2YWx1ZTogc3RyaW5nIH0pO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgU0VRLCB7IHZhbHVlOiBzZXEgfSk7XG4gICAgICAgIC8vIFVzZWQgYnkgY3JlYXRlTWFwKClcbiAgICAgICAgdGhpcy5zb3J0TWFwRW50cmllcyA9XG4gICAgICAgICAgICB0eXBlb2Ygc29ydE1hcEVudHJpZXMgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgICAgICA/IHNvcnRNYXBFbnRyaWVzXG4gICAgICAgICAgICAgICAgOiBzb3J0TWFwRW50cmllcyA9PT0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICA/IHNvcnRNYXBFbnRyaWVzQnlLZXlcbiAgICAgICAgICAgICAgICAgICAgOiBudWxsO1xuICAgIH1cbiAgICBjbG9uZSgpIHtcbiAgICAgICAgY29uc3QgY29weSA9IE9iamVjdC5jcmVhdGUoU2NoZW1hLnByb3RvdHlwZSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnModGhpcykpO1xuICAgICAgICBjb3B5LnRhZ3MgPSB0aGlzLnRhZ3Muc2xpY2UoKTtcbiAgICAgICAgcmV0dXJuIGNvcHk7XG4gICAgfVxufVxuXG5leHBvcnQgeyBTY2hlbWEgfTtcbiIsImltcG9ydCB7IGlzTm9kZSB9IGZyb20gJy4uL25vZGVzL2lkZW50aXR5LmpzJztcbmltcG9ydCB7IGNyZWF0ZVN0cmluZ2lmeUNvbnRleHQsIHN0cmluZ2lmeSB9IGZyb20gJy4vc3RyaW5naWZ5LmpzJztcbmltcG9ydCB7IGluZGVudENvbW1lbnQsIGxpbmVDb21tZW50IH0gZnJvbSAnLi9zdHJpbmdpZnlDb21tZW50LmpzJztcblxuZnVuY3Rpb24gc3RyaW5naWZ5RG9jdW1lbnQoZG9jLCBvcHRpb25zKSB7XG4gICAgY29uc3QgbGluZXMgPSBbXTtcbiAgICBsZXQgaGFzRGlyZWN0aXZlcyA9IG9wdGlvbnMuZGlyZWN0aXZlcyA9PT0gdHJ1ZTtcbiAgICBpZiAob3B0aW9ucy5kaXJlY3RpdmVzICE9PSBmYWxzZSAmJiBkb2MuZGlyZWN0aXZlcykge1xuICAgICAgICBjb25zdCBkaXIgPSBkb2MuZGlyZWN0aXZlcy50b1N0cmluZyhkb2MpO1xuICAgICAgICBpZiAoZGlyKSB7XG4gICAgICAgICAgICBsaW5lcy5wdXNoKGRpcik7XG4gICAgICAgICAgICBoYXNEaXJlY3RpdmVzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChkb2MuZGlyZWN0aXZlcy5kb2NTdGFydClcbiAgICAgICAgICAgIGhhc0RpcmVjdGl2ZXMgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoaGFzRGlyZWN0aXZlcylcbiAgICAgICAgbGluZXMucHVzaCgnLS0tJyk7XG4gICAgY29uc3QgY3R4ID0gY3JlYXRlU3RyaW5naWZ5Q29udGV4dChkb2MsIG9wdGlvbnMpO1xuICAgIGNvbnN0IHsgY29tbWVudFN0cmluZyB9ID0gY3R4Lm9wdGlvbnM7XG4gICAgaWYgKGRvYy5jb21tZW50QmVmb3JlKSB7XG4gICAgICAgIGlmIChsaW5lcy5sZW5ndGggIT09IDEpXG4gICAgICAgICAgICBsaW5lcy51bnNoaWZ0KCcnKTtcbiAgICAgICAgY29uc3QgY3MgPSBjb21tZW50U3RyaW5nKGRvYy5jb21tZW50QmVmb3JlKTtcbiAgICAgICAgbGluZXMudW5zaGlmdChpbmRlbnRDb21tZW50KGNzLCAnJykpO1xuICAgIH1cbiAgICBsZXQgY2hvbXBLZWVwID0gZmFsc2U7XG4gICAgbGV0IGNvbnRlbnRDb21tZW50ID0gbnVsbDtcbiAgICBpZiAoZG9jLmNvbnRlbnRzKSB7XG4gICAgICAgIGlmIChpc05vZGUoZG9jLmNvbnRlbnRzKSkge1xuICAgICAgICAgICAgaWYgKGRvYy5jb250ZW50cy5zcGFjZUJlZm9yZSAmJiBoYXNEaXJlY3RpdmVzKVxuICAgICAgICAgICAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgICAgICAgICAgaWYgKGRvYy5jb250ZW50cy5jb21tZW50QmVmb3JlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY3MgPSBjb21tZW50U3RyaW5nKGRvYy5jb250ZW50cy5jb21tZW50QmVmb3JlKTtcbiAgICAgICAgICAgICAgICBsaW5lcy5wdXNoKGluZGVudENvbW1lbnQoY3MsICcnKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyB0b3AtbGV2ZWwgYmxvY2sgc2NhbGFycyBuZWVkIHRvIGJlIGluZGVudGVkIGlmIGZvbGxvd2VkIGJ5IGEgY29tbWVudFxuICAgICAgICAgICAgY3R4LmZvcmNlQmxvY2tJbmRlbnQgPSAhIWRvYy5jb21tZW50O1xuICAgICAgICAgICAgY29udGVudENvbW1lbnQgPSBkb2MuY29udGVudHMuY29tbWVudDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvbkNob21wS2VlcCA9IGNvbnRlbnRDb21tZW50ID8gdW5kZWZpbmVkIDogKCkgPT4gKGNob21wS2VlcCA9IHRydWUpO1xuICAgICAgICBsZXQgYm9keSA9IHN0cmluZ2lmeShkb2MuY29udGVudHMsIGN0eCwgKCkgPT4gKGNvbnRlbnRDb21tZW50ID0gbnVsbCksIG9uQ2hvbXBLZWVwKTtcbiAgICAgICAgaWYgKGNvbnRlbnRDb21tZW50KVxuICAgICAgICAgICAgYm9keSArPSBsaW5lQ29tbWVudChib2R5LCAnJywgY29tbWVudFN0cmluZyhjb250ZW50Q29tbWVudCkpO1xuICAgICAgICBpZiAoKGJvZHlbMF0gPT09ICd8JyB8fCBib2R5WzBdID09PSAnPicpICYmXG4gICAgICAgICAgICBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXSA9PT0gJy0tLScpIHtcbiAgICAgICAgICAgIC8vIFRvcC1sZXZlbCBibG9jayBzY2FsYXJzIHdpdGggYSBwcmVjZWRpbmcgZG9jIG1hcmtlciBvdWdodCB0byB1c2UgdGhlXG4gICAgICAgICAgICAvLyBzYW1lIGxpbmUgZm9yIHRoZWlyIGhlYWRlci5cbiAgICAgICAgICAgIGxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdID0gYC0tLSAke2JvZHl9YDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBsaW5lcy5wdXNoKGJvZHkpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbGluZXMucHVzaChzdHJpbmdpZnkoZG9jLmNvbnRlbnRzLCBjdHgpKTtcbiAgICB9XG4gICAgaWYgKGRvYy5kaXJlY3RpdmVzPy5kb2NFbmQpIHtcbiAgICAgICAgaWYgKGRvYy5jb21tZW50KSB7XG4gICAgICAgICAgICBjb25zdCBjcyA9IGNvbW1lbnRTdHJpbmcoZG9jLmNvbW1lbnQpO1xuICAgICAgICAgICAgaWYgKGNzLmluY2x1ZGVzKCdcXG4nKSkge1xuICAgICAgICAgICAgICAgIGxpbmVzLnB1c2goJy4uLicpO1xuICAgICAgICAgICAgICAgIGxpbmVzLnB1c2goaW5kZW50Q29tbWVudChjcywgJycpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxpbmVzLnB1c2goYC4uLiAke2NzfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGluZXMucHVzaCgnLi4uJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGxldCBkYyA9IGRvYy5jb21tZW50O1xuICAgICAgICBpZiAoZGMgJiYgY2hvbXBLZWVwKVxuICAgICAgICAgICAgZGMgPSBkYy5yZXBsYWNlKC9eXFxuKy8sICcnKTtcbiAgICAgICAgaWYgKGRjKSB7XG4gICAgICAgICAgICBpZiAoKCFjaG9tcEtlZXAgfHwgY29udGVudENvbW1lbnQpICYmIGxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdICE9PSAnJylcbiAgICAgICAgICAgICAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICAgICAgICAgIGxpbmVzLnB1c2goaW5kZW50Q29tbWVudChjb21tZW50U3RyaW5nKGRjKSwgJycpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbGluZXMuam9pbignXFxuJykgKyAnXFxuJztcbn1cblxuZXhwb3J0IHsgc3RyaW5naWZ5RG9jdW1lbnQgfTtcbiIsImltcG9ydCB7IEFsaWFzIH0gZnJvbSAnLi4vbm9kZXMvQWxpYXMuanMnO1xuaW1wb3J0IHsgaXNFbXB0eVBhdGgsIGNvbGxlY3Rpb25Gcm9tUGF0aCB9IGZyb20gJy4uL25vZGVzL0NvbGxlY3Rpb24uanMnO1xuaW1wb3J0IHsgTk9ERV9UWVBFLCBET0MsIGlzTm9kZSwgaXNDb2xsZWN0aW9uLCBpc1NjYWxhciB9IGZyb20gJy4uL25vZGVzL2lkZW50aXR5LmpzJztcbmltcG9ydCB7IFBhaXIgfSBmcm9tICcuLi9ub2Rlcy9QYWlyLmpzJztcbmltcG9ydCB7IHRvSlMgfSBmcm9tICcuLi9ub2Rlcy90b0pTLmpzJztcbmltcG9ydCB7IFNjaGVtYSB9IGZyb20gJy4uL3NjaGVtYS9TY2hlbWEuanMnO1xuaW1wb3J0IHsgc3RyaW5naWZ5RG9jdW1lbnQgfSBmcm9tICcuLi9zdHJpbmdpZnkvc3RyaW5naWZ5RG9jdW1lbnQuanMnO1xuaW1wb3J0IHsgYW5jaG9yTmFtZXMsIGZpbmROZXdBbmNob3IsIGNyZWF0ZU5vZGVBbmNob3JzIH0gZnJvbSAnLi9hbmNob3JzLmpzJztcbmltcG9ydCB7IGFwcGx5UmV2aXZlciB9IGZyb20gJy4vYXBwbHlSZXZpdmVyLmpzJztcbmltcG9ydCB7IGNyZWF0ZU5vZGUgfSBmcm9tICcuL2NyZWF0ZU5vZGUuanMnO1xuaW1wb3J0IHsgRGlyZWN0aXZlcyB9IGZyb20gJy4vZGlyZWN0aXZlcy5qcyc7XG5cbmNsYXNzIERvY3VtZW50IHtcbiAgICBjb25zdHJ1Y3Rvcih2YWx1ZSwgcmVwbGFjZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgLyoqIEEgY29tbWVudCBiZWZvcmUgdGhpcyBEb2N1bWVudCAqL1xuICAgICAgICB0aGlzLmNvbW1lbnRCZWZvcmUgPSBudWxsO1xuICAgICAgICAvKiogQSBjb21tZW50IGltbWVkaWF0ZWx5IGFmdGVyIHRoaXMgRG9jdW1lbnQgKi9cbiAgICAgICAgdGhpcy5jb21tZW50ID0gbnVsbDtcbiAgICAgICAgLyoqIEVycm9ycyBlbmNvdW50ZXJlZCBkdXJpbmcgcGFyc2luZy4gKi9cbiAgICAgICAgdGhpcy5lcnJvcnMgPSBbXTtcbiAgICAgICAgLyoqIFdhcm5pbmdzIGVuY291bnRlcmVkIGR1cmluZyBwYXJzaW5nLiAqL1xuICAgICAgICB0aGlzLndhcm5pbmdzID0gW107XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBOT0RFX1RZUEUsIHsgdmFsdWU6IERPQyB9KTtcbiAgICAgICAgbGV0IF9yZXBsYWNlciA9IG51bGw7XG4gICAgICAgIGlmICh0eXBlb2YgcmVwbGFjZXIgPT09ICdmdW5jdGlvbicgfHwgQXJyYXkuaXNBcnJheShyZXBsYWNlcikpIHtcbiAgICAgICAgICAgIF9yZXBsYWNlciA9IHJlcGxhY2VyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCAmJiByZXBsYWNlcikge1xuICAgICAgICAgICAgb3B0aW9ucyA9IHJlcGxhY2VyO1xuICAgICAgICAgICAgcmVwbGFjZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3B0ID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgICBpbnRBc0JpZ0ludDogZmFsc2UsXG4gICAgICAgICAgICBrZWVwU291cmNlVG9rZW5zOiBmYWxzZSxcbiAgICAgICAgICAgIGxvZ0xldmVsOiAnd2FybicsXG4gICAgICAgICAgICBwcmV0dHlFcnJvcnM6IHRydWUsXG4gICAgICAgICAgICBzdHJpY3Q6IHRydWUsXG4gICAgICAgICAgICBzdHJpbmdLZXlzOiBmYWxzZSxcbiAgICAgICAgICAgIHVuaXF1ZUtleXM6IHRydWUsXG4gICAgICAgICAgICB2ZXJzaW9uOiAnMS4yJ1xuICAgICAgICB9LCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0O1xuICAgICAgICBsZXQgeyB2ZXJzaW9uIH0gPSBvcHQ7XG4gICAgICAgIGlmIChvcHRpb25zPy5fZGlyZWN0aXZlcykge1xuICAgICAgICAgICAgdGhpcy5kaXJlY3RpdmVzID0gb3B0aW9ucy5fZGlyZWN0aXZlcy5hdERvY3VtZW50KCk7XG4gICAgICAgICAgICBpZiAodGhpcy5kaXJlY3RpdmVzLnlhbWwuZXhwbGljaXQpXG4gICAgICAgICAgICAgICAgdmVyc2lvbiA9IHRoaXMuZGlyZWN0aXZlcy55YW1sLnZlcnNpb247XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhpcy5kaXJlY3RpdmVzID0gbmV3IERpcmVjdGl2ZXMoeyB2ZXJzaW9uIH0pO1xuICAgICAgICB0aGlzLnNldFNjaGVtYSh2ZXJzaW9uLCBvcHRpb25zKTtcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBXZSBjYW4ndCByZWFsbHkga25vdyB0aGF0IHRoaXMgbWF0Y2hlcyBDb250ZW50cy5cbiAgICAgICAgdGhpcy5jb250ZW50cyA9XG4gICAgICAgICAgICB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHRoaXMuY3JlYXRlTm9kZSh2YWx1ZSwgX3JlcGxhY2VyLCBvcHRpb25zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgZGVlcCBjb3B5IG9mIHRoaXMgRG9jdW1lbnQgYW5kIGl0cyBjb250ZW50cy5cbiAgICAgKlxuICAgICAqIEN1c3RvbSBOb2RlIHZhbHVlcyB0aGF0IGluaGVyaXQgZnJvbSBgT2JqZWN0YCBzdGlsbCByZWZlciB0byB0aGVpciBvcmlnaW5hbCBpbnN0YW5jZXMuXG4gICAgICovXG4gICAgY2xvbmUoKSB7XG4gICAgICAgIGNvbnN0IGNvcHkgPSBPYmplY3QuY3JlYXRlKERvY3VtZW50LnByb3RvdHlwZSwge1xuICAgICAgICAgICAgW05PREVfVFlQRV06IHsgdmFsdWU6IERPQyB9XG4gICAgICAgIH0pO1xuICAgICAgICBjb3B5LmNvbW1lbnRCZWZvcmUgPSB0aGlzLmNvbW1lbnRCZWZvcmU7XG4gICAgICAgIGNvcHkuY29tbWVudCA9IHRoaXMuY29tbWVudDtcbiAgICAgICAgY29weS5lcnJvcnMgPSB0aGlzLmVycm9ycy5zbGljZSgpO1xuICAgICAgICBjb3B5Lndhcm5pbmdzID0gdGhpcy53YXJuaW5ncy5zbGljZSgpO1xuICAgICAgICBjb3B5Lm9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLm9wdGlvbnMpO1xuICAgICAgICBpZiAodGhpcy5kaXJlY3RpdmVzKVxuICAgICAgICAgICAgY29weS5kaXJlY3RpdmVzID0gdGhpcy5kaXJlY3RpdmVzLmNsb25lKCk7XG4gICAgICAgIGNvcHkuc2NoZW1hID0gdGhpcy5zY2hlbWEuY2xvbmUoKTtcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBXZSBjYW4ndCByZWFsbHkga25vdyB0aGF0IHRoaXMgbWF0Y2hlcyBDb250ZW50cy5cbiAgICAgICAgY29weS5jb250ZW50cyA9IGlzTm9kZSh0aGlzLmNvbnRlbnRzKVxuICAgICAgICAgICAgPyB0aGlzLmNvbnRlbnRzLmNsb25lKGNvcHkuc2NoZW1hKVxuICAgICAgICAgICAgOiB0aGlzLmNvbnRlbnRzO1xuICAgICAgICBpZiAodGhpcy5yYW5nZSlcbiAgICAgICAgICAgIGNvcHkucmFuZ2UgPSB0aGlzLnJhbmdlLnNsaWNlKCk7XG4gICAgICAgIHJldHVybiBjb3B5O1xuICAgIH1cbiAgICAvKiogQWRkcyBhIHZhbHVlIHRvIHRoZSBkb2N1bWVudC4gKi9cbiAgICBhZGQodmFsdWUpIHtcbiAgICAgICAgaWYgKGFzc2VydENvbGxlY3Rpb24odGhpcy5jb250ZW50cykpXG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRzLmFkZCh2YWx1ZSk7XG4gICAgfVxuICAgIC8qKiBBZGRzIGEgdmFsdWUgdG8gdGhlIGRvY3VtZW50LiAqL1xuICAgIGFkZEluKHBhdGgsIHZhbHVlKSB7XG4gICAgICAgIGlmIChhc3NlcnRDb2xsZWN0aW9uKHRoaXMuY29udGVudHMpKVxuICAgICAgICAgICAgdGhpcy5jb250ZW50cy5hZGRJbihwYXRoLCB2YWx1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIG5ldyBgQWxpYXNgIG5vZGUsIGVuc3VyaW5nIHRoYXQgdGhlIHRhcmdldCBgbm9kZWAgaGFzIHRoZSByZXF1aXJlZCBhbmNob3IuXG4gICAgICpcbiAgICAgKiBJZiBgbm9kZWAgYWxyZWFkeSBoYXMgYW4gYW5jaG9yLCBgbmFtZWAgaXMgaWdub3JlZC5cbiAgICAgKiBPdGhlcndpc2UsIHRoZSBgbm9kZS5hbmNob3JgIHZhbHVlIHdpbGwgYmUgc2V0IHRvIGBuYW1lYCxcbiAgICAgKiBvciBpZiBhbiBhbmNob3Igd2l0aCB0aGF0IG5hbWUgaXMgYWxyZWFkeSBwcmVzZW50IGluIHRoZSBkb2N1bWVudCxcbiAgICAgKiBgbmFtZWAgd2lsbCBiZSB1c2VkIGFzIGEgcHJlZml4IGZvciBhIG5ldyB1bmlxdWUgYW5jaG9yLlxuICAgICAqIElmIGBuYW1lYCBpcyB1bmRlZmluZWQsIHRoZSBnZW5lcmF0ZWQgYW5jaG9yIHdpbGwgdXNlICdhJyBhcyBhIHByZWZpeC5cbiAgICAgKi9cbiAgICBjcmVhdGVBbGlhcyhub2RlLCBuYW1lKSB7XG4gICAgICAgIGlmICghbm9kZS5hbmNob3IpIHtcbiAgICAgICAgICAgIGNvbnN0IHByZXYgPSBhbmNob3JOYW1lcyh0aGlzKTtcbiAgICAgICAgICAgIG5vZGUuYW5jaG9yID1cbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1udWxsaXNoLWNvYWxlc2NpbmdcbiAgICAgICAgICAgICAgICAhbmFtZSB8fCBwcmV2LmhhcyhuYW1lKSA/IGZpbmROZXdBbmNob3IobmFtZSB8fCAnYScsIHByZXYpIDogbmFtZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEFsaWFzKG5vZGUuYW5jaG9yKTtcbiAgICB9XG4gICAgY3JlYXRlTm9kZSh2YWx1ZSwgcmVwbGFjZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgbGV0IF9yZXBsYWNlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHR5cGVvZiByZXBsYWNlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdmFsdWUgPSByZXBsYWNlci5jYWxsKHsgJyc6IHZhbHVlIH0sICcnLCB2YWx1ZSk7XG4gICAgICAgICAgICBfcmVwbGFjZXIgPSByZXBsYWNlcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHJlcGxhY2VyKSkge1xuICAgICAgICAgICAgY29uc3Qga2V5VG9TdHIgPSAodikgPT4gdHlwZW9mIHYgPT09ICdudW1iZXInIHx8IHYgaW5zdGFuY2VvZiBTdHJpbmcgfHwgdiBpbnN0YW5jZW9mIE51bWJlcjtcbiAgICAgICAgICAgIGNvbnN0IGFzU3RyID0gcmVwbGFjZXIuZmlsdGVyKGtleVRvU3RyKS5tYXAoU3RyaW5nKTtcbiAgICAgICAgICAgIGlmIChhc1N0ci5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgIHJlcGxhY2VyID0gcmVwbGFjZXIuY29uY2F0KGFzU3RyKTtcbiAgICAgICAgICAgIF9yZXBsYWNlciA9IHJlcGxhY2VyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCAmJiByZXBsYWNlcikge1xuICAgICAgICAgICAgb3B0aW9ucyA9IHJlcGxhY2VyO1xuICAgICAgICAgICAgcmVwbGFjZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBhbGlhc0R1cGxpY2F0ZU9iamVjdHMsIGFuY2hvclByZWZpeCwgZmxvdywga2VlcFVuZGVmaW5lZCwgb25UYWdPYmosIHRhZyB9ID0gb3B0aW9ucyA/PyB7fTtcbiAgICAgICAgY29uc3QgeyBvbkFuY2hvciwgc2V0QW5jaG9ycywgc291cmNlT2JqZWN0cyB9ID0gY3JlYXRlTm9kZUFuY2hvcnModGhpcywgXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLW51bGxpc2gtY29hbGVzY2luZ1xuICAgICAgICBhbmNob3JQcmVmaXggfHwgJ2EnKTtcbiAgICAgICAgY29uc3QgY3R4ID0ge1xuICAgICAgICAgICAgYWxpYXNEdXBsaWNhdGVPYmplY3RzOiBhbGlhc0R1cGxpY2F0ZU9iamVjdHMgPz8gdHJ1ZSxcbiAgICAgICAgICAgIGtlZXBVbmRlZmluZWQ6IGtlZXBVbmRlZmluZWQgPz8gZmFsc2UsXG4gICAgICAgICAgICBvbkFuY2hvcixcbiAgICAgICAgICAgIG9uVGFnT2JqLFxuICAgICAgICAgICAgcmVwbGFjZXI6IF9yZXBsYWNlcixcbiAgICAgICAgICAgIHNjaGVtYTogdGhpcy5zY2hlbWEsXG4gICAgICAgICAgICBzb3VyY2VPYmplY3RzXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IG5vZGUgPSBjcmVhdGVOb2RlKHZhbHVlLCB0YWcsIGN0eCk7XG4gICAgICAgIGlmIChmbG93ICYmIGlzQ29sbGVjdGlvbihub2RlKSlcbiAgICAgICAgICAgIG5vZGUuZmxvdyA9IHRydWU7XG4gICAgICAgIHNldEFuY2hvcnMoKTtcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnQgYSBrZXkgYW5kIGEgdmFsdWUgaW50byBhIGBQYWlyYCB1c2luZyB0aGUgY3VycmVudCBzY2hlbWEsXG4gICAgICogcmVjdXJzaXZlbHkgd3JhcHBpbmcgYWxsIHZhbHVlcyBhcyBgU2NhbGFyYCBvciBgQ29sbGVjdGlvbmAgbm9kZXMuXG4gICAgICovXG4gICAgY3JlYXRlUGFpcihrZXksIHZhbHVlLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgayA9IHRoaXMuY3JlYXRlTm9kZShrZXksIG51bGwsIG9wdGlvbnMpO1xuICAgICAgICBjb25zdCB2ID0gdGhpcy5jcmVhdGVOb2RlKHZhbHVlLCBudWxsLCBvcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQYWlyKGssIHYpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGEgdmFsdWUgZnJvbSB0aGUgZG9jdW1lbnQuXG4gICAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBpdGVtIHdhcyBmb3VuZCBhbmQgcmVtb3ZlZC5cbiAgICAgKi9cbiAgICBkZWxldGUoa2V5KSB7XG4gICAgICAgIHJldHVybiBhc3NlcnRDb2xsZWN0aW9uKHRoaXMuY29udGVudHMpID8gdGhpcy5jb250ZW50cy5kZWxldGUoa2V5KSA6IGZhbHNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGEgdmFsdWUgZnJvbSB0aGUgZG9jdW1lbnQuXG4gICAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBpdGVtIHdhcyBmb3VuZCBhbmQgcmVtb3ZlZC5cbiAgICAgKi9cbiAgICBkZWxldGVJbihwYXRoKSB7XG4gICAgICAgIGlmIChpc0VtcHR5UGF0aChwYXRoKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuY29udGVudHMgPT0gbnVsbClcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIFByZXN1bWVkIGltcG9zc2libGUgaWYgU3RyaWN0IGV4dGVuZHMgZmFsc2VcbiAgICAgICAgICAgIHRoaXMuY29udGVudHMgPSBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFzc2VydENvbGxlY3Rpb24odGhpcy5jb250ZW50cylcbiAgICAgICAgICAgID8gdGhpcy5jb250ZW50cy5kZWxldGVJbihwYXRoKVxuICAgICAgICAgICAgOiBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBpdGVtIGF0IGBrZXlgLCBvciBgdW5kZWZpbmVkYCBpZiBub3QgZm91bmQuIEJ5IGRlZmF1bHQgdW53cmFwc1xuICAgICAqIHNjYWxhciB2YWx1ZXMgZnJvbSB0aGVpciBzdXJyb3VuZGluZyBub2RlOyB0byBkaXNhYmxlIHNldCBga2VlcFNjYWxhcmAgdG9cbiAgICAgKiBgdHJ1ZWAgKGNvbGxlY3Rpb25zIGFyZSBhbHdheXMgcmV0dXJuZWQgaW50YWN0KS5cbiAgICAgKi9cbiAgICBnZXQoa2V5LCBrZWVwU2NhbGFyKSB7XG4gICAgICAgIHJldHVybiBpc0NvbGxlY3Rpb24odGhpcy5jb250ZW50cylcbiAgICAgICAgICAgID8gdGhpcy5jb250ZW50cy5nZXQoa2V5LCBrZWVwU2NhbGFyKVxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgaXRlbSBhdCBgcGF0aGAsIG9yIGB1bmRlZmluZWRgIGlmIG5vdCBmb3VuZC4gQnkgZGVmYXVsdCB1bndyYXBzXG4gICAgICogc2NhbGFyIHZhbHVlcyBmcm9tIHRoZWlyIHN1cnJvdW5kaW5nIG5vZGU7IHRvIGRpc2FibGUgc2V0IGBrZWVwU2NhbGFyYCB0b1xuICAgICAqIGB0cnVlYCAoY29sbGVjdGlvbnMgYXJlIGFsd2F5cyByZXR1cm5lZCBpbnRhY3QpLlxuICAgICAqL1xuICAgIGdldEluKHBhdGgsIGtlZXBTY2FsYXIpIHtcbiAgICAgICAgaWYgKGlzRW1wdHlQYXRoKHBhdGgpKVxuICAgICAgICAgICAgcmV0dXJuICFrZWVwU2NhbGFyICYmIGlzU2NhbGFyKHRoaXMuY29udGVudHMpXG4gICAgICAgICAgICAgICAgPyB0aGlzLmNvbnRlbnRzLnZhbHVlXG4gICAgICAgICAgICAgICAgOiB0aGlzLmNvbnRlbnRzO1xuICAgICAgICByZXR1cm4gaXNDb2xsZWN0aW9uKHRoaXMuY29udGVudHMpXG4gICAgICAgICAgICA/IHRoaXMuY29udGVudHMuZ2V0SW4ocGF0aCwga2VlcFNjYWxhcilcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhlIGRvY3VtZW50IGluY2x1ZGVzIGEgdmFsdWUgd2l0aCB0aGUga2V5IGBrZXlgLlxuICAgICAqL1xuICAgIGhhcyhrZXkpIHtcbiAgICAgICAgcmV0dXJuIGlzQ29sbGVjdGlvbih0aGlzLmNvbnRlbnRzKSA/IHRoaXMuY29udGVudHMuaGFzKGtleSkgOiBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSBkb2N1bWVudCBpbmNsdWRlcyBhIHZhbHVlIGF0IGBwYXRoYC5cbiAgICAgKi9cbiAgICBoYXNJbihwYXRoKSB7XG4gICAgICAgIGlmIChpc0VtcHR5UGF0aChwYXRoKSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnRzICE9PSB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiBpc0NvbGxlY3Rpb24odGhpcy5jb250ZW50cykgPyB0aGlzLmNvbnRlbnRzLmhhc0luKHBhdGgpIDogZmFsc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgYSB2YWx1ZSBpbiB0aGlzIGRvY3VtZW50LiBGb3IgYCEhc2V0YCwgYHZhbHVlYCBuZWVkcyB0byBiZSBhXG4gICAgICogYm9vbGVhbiB0byBhZGQvcmVtb3ZlIHRoZSBpdGVtIGZyb20gdGhlIHNldC5cbiAgICAgKi9cbiAgICBzZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgICBpZiAodGhpcy5jb250ZW50cyA9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIFdlIGNhbid0IHJlYWxseSBrbm93IHRoYXQgdGhpcyBtYXRjaGVzIENvbnRlbnRzLlxuICAgICAgICAgICAgdGhpcy5jb250ZW50cyA9IGNvbGxlY3Rpb25Gcm9tUGF0aCh0aGlzLnNjaGVtYSwgW2tleV0sIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhc3NlcnRDb2xsZWN0aW9uKHRoaXMuY29udGVudHMpKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRzLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIGEgdmFsdWUgaW4gdGhpcyBkb2N1bWVudC4gRm9yIGAhIXNldGAsIGB2YWx1ZWAgbmVlZHMgdG8gYmUgYVxuICAgICAqIGJvb2xlYW4gdG8gYWRkL3JlbW92ZSB0aGUgaXRlbSBmcm9tIHRoZSBzZXQuXG4gICAgICovXG4gICAgc2V0SW4ocGF0aCwgdmFsdWUpIHtcbiAgICAgICAgaWYgKGlzRW1wdHlQYXRoKHBhdGgpKSB7XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIFdlIGNhbid0IHJlYWxseSBrbm93IHRoYXQgdGhpcyBtYXRjaGVzIENvbnRlbnRzLlxuICAgICAgICAgICAgdGhpcy5jb250ZW50cyA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuY29udGVudHMgPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBXZSBjYW4ndCByZWFsbHkga25vdyB0aGF0IHRoaXMgbWF0Y2hlcyBDb250ZW50cy5cbiAgICAgICAgICAgIHRoaXMuY29udGVudHMgPSBjb2xsZWN0aW9uRnJvbVBhdGgodGhpcy5zY2hlbWEsIEFycmF5LmZyb20ocGF0aCksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhc3NlcnRDb2xsZWN0aW9uKHRoaXMuY29udGVudHMpKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRzLnNldEluKHBhdGgsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGFuZ2UgdGhlIFlBTUwgdmVyc2lvbiBhbmQgc2NoZW1hIHVzZWQgYnkgdGhlIGRvY3VtZW50LlxuICAgICAqIEEgYG51bGxgIHZlcnNpb24gZGlzYWJsZXMgc3VwcG9ydCBmb3IgZGlyZWN0aXZlcywgZXhwbGljaXQgdGFncywgYW5jaG9ycywgYW5kIGFsaWFzZXMuXG4gICAgICogSXQgYWxzbyByZXF1aXJlcyB0aGUgYHNjaGVtYWAgb3B0aW9uIHRvIGJlIGdpdmVuIGFzIGEgYFNjaGVtYWAgaW5zdGFuY2UgdmFsdWUuXG4gICAgICpcbiAgICAgKiBPdmVycmlkZXMgYWxsIHByZXZpb3VzbHkgc2V0IHNjaGVtYSBvcHRpb25zLlxuICAgICAqL1xuICAgIHNldFNjaGVtYSh2ZXJzaW9uLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2ZXJzaW9uID09PSAnbnVtYmVyJylcbiAgICAgICAgICAgIHZlcnNpb24gPSBTdHJpbmcodmVyc2lvbik7XG4gICAgICAgIGxldCBvcHQ7XG4gICAgICAgIHN3aXRjaCAodmVyc2lvbikge1xuICAgICAgICAgICAgY2FzZSAnMS4xJzpcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kaXJlY3RpdmVzKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpcmVjdGl2ZXMueWFtbC52ZXJzaW9uID0gJzEuMSc7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpcmVjdGl2ZXMgPSBuZXcgRGlyZWN0aXZlcyh7IHZlcnNpb246ICcxLjEnIH0pO1xuICAgICAgICAgICAgICAgIG9wdCA9IHsgcmVzb2x2ZUtub3duVGFnczogZmFsc2UsIHNjaGVtYTogJ3lhbWwtMS4xJyB9O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnMS4yJzpcbiAgICAgICAgICAgIGNhc2UgJ25leHQnOlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRpcmVjdGl2ZXMpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlyZWN0aXZlcy55YW1sLnZlcnNpb24gPSB2ZXJzaW9uO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXJlY3RpdmVzID0gbmV3IERpcmVjdGl2ZXMoeyB2ZXJzaW9uIH0pO1xuICAgICAgICAgICAgICAgIG9wdCA9IHsgcmVzb2x2ZUtub3duVGFnczogdHJ1ZSwgc2NoZW1hOiAnY29yZScgfTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgbnVsbDpcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kaXJlY3RpdmVzKVxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5kaXJlY3RpdmVzO1xuICAgICAgICAgICAgICAgIG9wdCA9IG51bGw7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3YgPSBKU09OLnN0cmluZ2lmeSh2ZXJzaW9uKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkICcxLjEnLCAnMS4yJyBvciBudWxsIGFzIGZpcnN0IGFyZ3VtZW50LCBidXQgZm91bmQ6ICR7c3Z9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gTm90IHVzaW5nIGBpbnN0YW5jZW9mIFNjaGVtYWAgdG8gYWxsb3cgZm9yIGR1Y2sgdHlwaW5nXG4gICAgICAgIGlmIChvcHRpb25zLnNjaGVtYSBpbnN0YW5jZW9mIE9iamVjdClcbiAgICAgICAgICAgIHRoaXMuc2NoZW1hID0gb3B0aW9ucy5zY2hlbWE7XG4gICAgICAgIGVsc2UgaWYgKG9wdClcbiAgICAgICAgICAgIHRoaXMuc2NoZW1hID0gbmV3IFNjaGVtYShPYmplY3QuYXNzaWduKG9wdCwgb3B0aW9ucykpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFdpdGggYSBudWxsIFlBTUwgdmVyc2lvbiwgdGhlIHsgc2NoZW1hOiBTY2hlbWEgfSBvcHRpb24gaXMgcmVxdWlyZWRgKTtcbiAgICB9XG4gICAgLy8ganNvbiAmIGpzb25BcmcgYXJlIG9ubHkgdXNlZCBmcm9tIHRvSlNPTigpXG4gICAgdG9KUyh7IGpzb24sIGpzb25BcmcsIG1hcEFzTWFwLCBtYXhBbGlhc0NvdW50LCBvbkFuY2hvciwgcmV2aXZlciB9ID0ge30pIHtcbiAgICAgICAgY29uc3QgY3R4ID0ge1xuICAgICAgICAgICAgYW5jaG9yczogbmV3IE1hcCgpLFxuICAgICAgICAgICAgZG9jOiB0aGlzLFxuICAgICAgICAgICAga2VlcDogIWpzb24sXG4gICAgICAgICAgICBtYXBBc01hcDogbWFwQXNNYXAgPT09IHRydWUsXG4gICAgICAgICAgICBtYXBLZXlXYXJuZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbWF4QWxpYXNDb3VudDogdHlwZW9mIG1heEFsaWFzQ291bnQgPT09ICdudW1iZXInID8gbWF4QWxpYXNDb3VudCA6IDEwMFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCByZXMgPSB0b0pTKHRoaXMuY29udGVudHMsIGpzb25BcmcgPz8gJycsIGN0eCk7XG4gICAgICAgIGlmICh0eXBlb2Ygb25BbmNob3IgPT09ICdmdW5jdGlvbicpXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHsgY291bnQsIHJlcyB9IG9mIGN0eC5hbmNob3JzLnZhbHVlcygpKVxuICAgICAgICAgICAgICAgIG9uQW5jaG9yKHJlcywgY291bnQpO1xuICAgICAgICByZXR1cm4gdHlwZW9mIHJldml2ZXIgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgID8gYXBwbHlSZXZpdmVyKHJldml2ZXIsIHsgJyc6IHJlcyB9LCAnJywgcmVzKVxuICAgICAgICAgICAgOiByZXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgSlNPTiByZXByZXNlbnRhdGlvbiBvZiB0aGUgZG9jdW1lbnQgYGNvbnRlbnRzYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBqc29uQXJnIFVzZWQgYnkgYEpTT04uc3RyaW5naWZ5YCB0byBpbmRpY2F0ZSB0aGUgYXJyYXkgaW5kZXggb3JcbiAgICAgKiAgIHByb3BlcnR5IG5hbWUuXG4gICAgICovXG4gICAgdG9KU09OKGpzb25BcmcsIG9uQW5jaG9yKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRvSlMoeyBqc29uOiB0cnVlLCBqc29uQXJnLCBtYXBBc01hcDogZmFsc2UsIG9uQW5jaG9yIH0pO1xuICAgIH1cbiAgICAvKiogQSBZQU1MIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBkb2N1bWVudC4gKi9cbiAgICB0b1N0cmluZyhvcHRpb25zID0ge30pIHtcbiAgICAgICAgaWYgKHRoaXMuZXJyb3JzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RvY3VtZW50IHdpdGggZXJyb3JzIGNhbm5vdCBiZSBzdHJpbmdpZmllZCcpO1xuICAgICAgICBpZiAoJ2luZGVudCcgaW4gb3B0aW9ucyAmJlxuICAgICAgICAgICAgKCFOdW1iZXIuaXNJbnRlZ2VyKG9wdGlvbnMuaW5kZW50KSB8fCBOdW1iZXIob3B0aW9ucy5pbmRlbnQpIDw9IDApKSB7XG4gICAgICAgICAgICBjb25zdCBzID0gSlNPTi5zdHJpbmdpZnkob3B0aW9ucy5pbmRlbnQpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBcImluZGVudFwiIG9wdGlvbiBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciwgbm90ICR7c31gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RyaW5naWZ5RG9jdW1lbnQodGhpcywgb3B0aW9ucyk7XG4gICAgfVxufVxuZnVuY3Rpb24gYXNzZXJ0Q29sbGVjdGlvbihjb250ZW50cykge1xuICAgIGlmIChpc0NvbGxlY3Rpb24oY29udGVudHMpKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGEgWUFNTCBjb2xsZWN0aW9uIGFzIGRvY3VtZW50IGNvbnRlbnRzJyk7XG59XG5cbmV4cG9ydCB7IERvY3VtZW50IH07XG4iLCJjbGFzcyBZQU1MRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IobmFtZSwgcG9zLCBjb2RlLCBtZXNzYWdlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgICAgIHRoaXMucG9zID0gcG9zO1xuICAgIH1cbn1cbmNsYXNzIFlBTUxQYXJzZUVycm9yIGV4dGVuZHMgWUFNTEVycm9yIHtcbiAgICBjb25zdHJ1Y3Rvcihwb3MsIGNvZGUsIG1lc3NhZ2UpIHtcbiAgICAgICAgc3VwZXIoJ1lBTUxQYXJzZUVycm9yJywgcG9zLCBjb2RlLCBtZXNzYWdlKTtcbiAgICB9XG59XG5jbGFzcyBZQU1MV2FybmluZyBleHRlbmRzIFlBTUxFcnJvciB7XG4gICAgY29uc3RydWN0b3IocG9zLCBjb2RlLCBtZXNzYWdlKSB7XG4gICAgICAgIHN1cGVyKCdZQU1MV2FybmluZycsIHBvcywgY29kZSwgbWVzc2FnZSk7XG4gICAgfVxufVxuY29uc3QgcHJldHRpZnlFcnJvciA9IChzcmMsIGxjKSA9PiAoZXJyb3IpID0+IHtcbiAgICBpZiAoZXJyb3IucG9zWzBdID09PSAtMSlcbiAgICAgICAgcmV0dXJuO1xuICAgIGVycm9yLmxpbmVQb3MgPSBlcnJvci5wb3MubWFwKHBvcyA9PiBsYy5saW5lUG9zKHBvcykpO1xuICAgIGNvbnN0IHsgbGluZSwgY29sIH0gPSBlcnJvci5saW5lUG9zWzBdO1xuICAgIGVycm9yLm1lc3NhZ2UgKz0gYCBhdCBsaW5lICR7bGluZX0sIGNvbHVtbiAke2NvbH1gO1xuICAgIGxldCBjaSA9IGNvbCAtIDE7XG4gICAgbGV0IGxpbmVTdHIgPSBzcmNcbiAgICAgICAgLnN1YnN0cmluZyhsYy5saW5lU3RhcnRzW2xpbmUgLSAxXSwgbGMubGluZVN0YXJ0c1tsaW5lXSlcbiAgICAgICAgLnJlcGxhY2UoL1tcXG5cXHJdKyQvLCAnJyk7XG4gICAgLy8gVHJpbSB0byBtYXggODAgY2hhcnMsIGtlZXBpbmcgY29sIHBvc2l0aW9uIG5lYXIgdGhlIG1pZGRsZVxuICAgIGlmIChjaSA+PSA2MCAmJiBsaW5lU3RyLmxlbmd0aCA+IDgwKSB7XG4gICAgICAgIGNvbnN0IHRyaW1TdGFydCA9IE1hdGgubWluKGNpIC0gMzksIGxpbmVTdHIubGVuZ3RoIC0gNzkpO1xuICAgICAgICBsaW5lU3RyID0gJ+KApicgKyBsaW5lU3RyLnN1YnN0cmluZyh0cmltU3RhcnQpO1xuICAgICAgICBjaSAtPSB0cmltU3RhcnQgLSAxO1xuICAgIH1cbiAgICBpZiAobGluZVN0ci5sZW5ndGggPiA4MClcbiAgICAgICAgbGluZVN0ciA9IGxpbmVTdHIuc3Vic3RyaW5nKDAsIDc5KSArICfigKYnO1xuICAgIC8vIEluY2x1ZGUgcHJldmlvdXMgbGluZSBpbiBjb250ZXh0IGlmIHBvaW50aW5nIGF0IGxpbmUgc3RhcnRcbiAgICBpZiAobGluZSA+IDEgJiYgL14gKiQvLnRlc3QobGluZVN0ci5zdWJzdHJpbmcoMCwgY2kpKSkge1xuICAgICAgICAvLyBSZWdleHAgd29uJ3QgbWF0Y2ggaWYgc3RhcnQgaXMgdHJpbW1lZFxuICAgICAgICBsZXQgcHJldiA9IHNyYy5zdWJzdHJpbmcobGMubGluZVN0YXJ0c1tsaW5lIC0gMl0sIGxjLmxpbmVTdGFydHNbbGluZSAtIDFdKTtcbiAgICAgICAgaWYgKHByZXYubGVuZ3RoID4gODApXG4gICAgICAgICAgICBwcmV2ID0gcHJldi5zdWJzdHJpbmcoMCwgNzkpICsgJ+KAplxcbic7XG4gICAgICAgIGxpbmVTdHIgPSBwcmV2ICsgbGluZVN0cjtcbiAgICB9XG4gICAgaWYgKC9bXiBdLy50ZXN0KGxpbmVTdHIpKSB7XG4gICAgICAgIGxldCBjb3VudCA9IDE7XG4gICAgICAgIGNvbnN0IGVuZCA9IGVycm9yLmxpbmVQb3NbMV07XG4gICAgICAgIGlmIChlbmQ/LmxpbmUgPT09IGxpbmUgJiYgZW5kLmNvbCA+IGNvbCkge1xuICAgICAgICAgICAgY291bnQgPSBNYXRoLm1heCgxLCBNYXRoLm1pbihlbmQuY29sIC0gY29sLCA4MCAtIGNpKSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcG9pbnRlciA9ICcgJy5yZXBlYXQoY2kpICsgJ14nLnJlcGVhdChjb3VudCk7XG4gICAgICAgIGVycm9yLm1lc3NhZ2UgKz0gYDpcXG5cXG4ke2xpbmVTdHJ9XFxuJHtwb2ludGVyfVxcbmA7XG4gICAgfVxufTtcblxuZXhwb3J0IHsgWUFNTEVycm9yLCBZQU1MUGFyc2VFcnJvciwgWUFNTFdhcm5pbmcsIHByZXR0aWZ5RXJyb3IgfTtcbiIsImZ1bmN0aW9uIHJlc29sdmVQcm9wcyh0b2tlbnMsIHsgZmxvdywgaW5kaWNhdG9yLCBuZXh0LCBvZmZzZXQsIG9uRXJyb3IsIHBhcmVudEluZGVudCwgc3RhcnRPbk5ld2xpbmUgfSkge1xuICAgIGxldCBzcGFjZUJlZm9yZSA9IGZhbHNlO1xuICAgIGxldCBhdE5ld2xpbmUgPSBzdGFydE9uTmV3bGluZTtcbiAgICBsZXQgaGFzU3BhY2UgPSBzdGFydE9uTmV3bGluZTtcbiAgICBsZXQgY29tbWVudCA9ICcnO1xuICAgIGxldCBjb21tZW50U2VwID0gJyc7XG4gICAgbGV0IGhhc05ld2xpbmUgPSBmYWxzZTtcbiAgICBsZXQgcmVxU3BhY2UgPSBmYWxzZTtcbiAgICBsZXQgdGFiID0gbnVsbDtcbiAgICBsZXQgYW5jaG9yID0gbnVsbDtcbiAgICBsZXQgdGFnID0gbnVsbDtcbiAgICBsZXQgbmV3bGluZUFmdGVyUHJvcCA9IG51bGw7XG4gICAgbGV0IGNvbW1hID0gbnVsbDtcbiAgICBsZXQgZm91bmQgPSBudWxsO1xuICAgIGxldCBzdGFydCA9IG51bGw7XG4gICAgZm9yIChjb25zdCB0b2tlbiBvZiB0b2tlbnMpIHtcbiAgICAgICAgaWYgKHJlcVNwYWNlKSB7XG4gICAgICAgICAgICBpZiAodG9rZW4udHlwZSAhPT0gJ3NwYWNlJyAmJlxuICAgICAgICAgICAgICAgIHRva2VuLnR5cGUgIT09ICduZXdsaW5lJyAmJlxuICAgICAgICAgICAgICAgIHRva2VuLnR5cGUgIT09ICdjb21tYScpXG4gICAgICAgICAgICAgICAgb25FcnJvcih0b2tlbi5vZmZzZXQsICdNSVNTSU5HX0NIQVInLCAnVGFncyBhbmQgYW5jaG9ycyBtdXN0IGJlIHNlcGFyYXRlZCBmcm9tIHRoZSBuZXh0IHRva2VuIGJ5IHdoaXRlIHNwYWNlJyk7XG4gICAgICAgICAgICByZXFTcGFjZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0YWIpIHtcbiAgICAgICAgICAgIGlmIChhdE5ld2xpbmUgJiYgdG9rZW4udHlwZSAhPT0gJ2NvbW1lbnQnICYmIHRva2VuLnR5cGUgIT09ICduZXdsaW5lJykge1xuICAgICAgICAgICAgICAgIG9uRXJyb3IodGFiLCAnVEFCX0FTX0lOREVOVCcsICdUYWJzIGFyZSBub3QgYWxsb3dlZCBhcyBpbmRlbnRhdGlvbicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGFiID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBzd2l0Y2ggKHRva2VuLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ3NwYWNlJzpcbiAgICAgICAgICAgICAgICAvLyBBdCB0aGUgZG9jIGxldmVsLCB0YWJzIGF0IGxpbmUgc3RhcnQgbWF5IGJlIHBhcnNlZFxuICAgICAgICAgICAgICAgIC8vIGFzIGxlYWRpbmcgd2hpdGUgc3BhY2UgcmF0aGVyIHRoYW4gaW5kZW50YXRpb24uXG4gICAgICAgICAgICAgICAgLy8gSW4gYSBmbG93IGNvbGxlY3Rpb24sIG9ubHkgdGhlIHBhcnNlciBoYW5kbGVzIGluZGVudC5cbiAgICAgICAgICAgICAgICBpZiAoIWZsb3cgJiZcbiAgICAgICAgICAgICAgICAgICAgKGluZGljYXRvciAhPT0gJ2RvYy1zdGFydCcgfHwgbmV4dD8udHlwZSAhPT0gJ2Zsb3ctY29sbGVjdGlvbicpICYmXG4gICAgICAgICAgICAgICAgICAgIHRva2VuLnNvdXJjZS5pbmNsdWRlcygnXFx0JykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGFiID0gdG9rZW47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGhhc1NwYWNlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2NvbW1lbnQnOiB7XG4gICAgICAgICAgICAgICAgaWYgKCFoYXNTcGFjZSlcbiAgICAgICAgICAgICAgICAgICAgb25FcnJvcih0b2tlbiwgJ01JU1NJTkdfQ0hBUicsICdDb21tZW50cyBtdXN0IGJlIHNlcGFyYXRlZCBmcm9tIG90aGVyIHRva2VucyBieSB3aGl0ZSBzcGFjZSBjaGFyYWN0ZXJzJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgY2IgPSB0b2tlbi5zb3VyY2Uuc3Vic3RyaW5nKDEpIHx8ICcgJztcbiAgICAgICAgICAgICAgICBpZiAoIWNvbW1lbnQpXG4gICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBjYjtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgKz0gY29tbWVudFNlcCArIGNiO1xuICAgICAgICAgICAgICAgIGNvbW1lbnRTZXAgPSAnJztcbiAgICAgICAgICAgICAgICBhdE5ld2xpbmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ25ld2xpbmUnOlxuICAgICAgICAgICAgICAgIGlmIChhdE5ld2xpbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbW1lbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50ICs9IHRva2VuLnNvdXJjZTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIWZvdW5kIHx8IGluZGljYXRvciAhPT0gJ3NlcS1pdGVtLWluZCcpXG4gICAgICAgICAgICAgICAgICAgICAgICBzcGFjZUJlZm9yZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgY29tbWVudFNlcCArPSB0b2tlbi5zb3VyY2U7XG4gICAgICAgICAgICAgICAgYXROZXdsaW5lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBoYXNOZXdsaW5lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAoYW5jaG9yIHx8IHRhZylcbiAgICAgICAgICAgICAgICAgICAgbmV3bGluZUFmdGVyUHJvcCA9IHRva2VuO1xuICAgICAgICAgICAgICAgIGhhc1NwYWNlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2FuY2hvcic6XG4gICAgICAgICAgICAgICAgaWYgKGFuY2hvcilcbiAgICAgICAgICAgICAgICAgICAgb25FcnJvcih0b2tlbiwgJ01VTFRJUExFX0FOQ0hPUlMnLCAnQSBub2RlIGNhbiBoYXZlIGF0IG1vc3Qgb25lIGFuY2hvcicpO1xuICAgICAgICAgICAgICAgIGlmICh0b2tlbi5zb3VyY2UuZW5kc1dpdGgoJzonKSlcbiAgICAgICAgICAgICAgICAgICAgb25FcnJvcih0b2tlbi5vZmZzZXQgKyB0b2tlbi5zb3VyY2UubGVuZ3RoIC0gMSwgJ0JBRF9BTElBUycsICdBbmNob3IgZW5kaW5nIGluIDogaXMgYW1iaWd1b3VzJywgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgYW5jaG9yID0gdG9rZW47XG4gICAgICAgICAgICAgICAgc3RhcnQgPz8gKHN0YXJ0ID0gdG9rZW4ub2Zmc2V0KTtcbiAgICAgICAgICAgICAgICBhdE5ld2xpbmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBoYXNTcGFjZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHJlcVNwYWNlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3RhZyc6IHtcbiAgICAgICAgICAgICAgICBpZiAodGFnKVxuICAgICAgICAgICAgICAgICAgICBvbkVycm9yKHRva2VuLCAnTVVMVElQTEVfVEFHUycsICdBIG5vZGUgY2FuIGhhdmUgYXQgbW9zdCBvbmUgdGFnJyk7XG4gICAgICAgICAgICAgICAgdGFnID0gdG9rZW47XG4gICAgICAgICAgICAgICAgc3RhcnQgPz8gKHN0YXJ0ID0gdG9rZW4ub2Zmc2V0KTtcbiAgICAgICAgICAgICAgICBhdE5ld2xpbmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBoYXNTcGFjZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHJlcVNwYWNlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgaW5kaWNhdG9yOlxuICAgICAgICAgICAgICAgIC8vIENvdWxkIGhlcmUgaGFuZGxlIHByZWNlZGluZyBjb21tZW50cyBkaWZmZXJlbnRseVxuICAgICAgICAgICAgICAgIGlmIChhbmNob3IgfHwgdGFnKVxuICAgICAgICAgICAgICAgICAgICBvbkVycm9yKHRva2VuLCAnQkFEX1BST1BfT1JERVInLCBgQW5jaG9ycyBhbmQgdGFncyBtdXN0IGJlIGFmdGVyIHRoZSAke3Rva2VuLnNvdXJjZX0gaW5kaWNhdG9yYCk7XG4gICAgICAgICAgICAgICAgaWYgKGZvdW5kKVxuICAgICAgICAgICAgICAgICAgICBvbkVycm9yKHRva2VuLCAnVU5FWFBFQ1RFRF9UT0tFTicsIGBVbmV4cGVjdGVkICR7dG9rZW4uc291cmNlfSBpbiAke2Zsb3cgPz8gJ2NvbGxlY3Rpb24nfWApO1xuICAgICAgICAgICAgICAgIGZvdW5kID0gdG9rZW47XG4gICAgICAgICAgICAgICAgYXROZXdsaW5lID1cbiAgICAgICAgICAgICAgICAgICAgaW5kaWNhdG9yID09PSAnc2VxLWl0ZW0taW5kJyB8fCBpbmRpY2F0b3IgPT09ICdleHBsaWNpdC1rZXktaW5kJztcbiAgICAgICAgICAgICAgICBoYXNTcGFjZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnY29tbWEnOlxuICAgICAgICAgICAgICAgIGlmIChmbG93KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb21tYSlcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uRXJyb3IodG9rZW4sICdVTkVYUEVDVEVEX1RPS0VOJywgYFVuZXhwZWN0ZWQgLCBpbiAke2Zsb3d9YCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbW1hID0gdG9rZW47XG4gICAgICAgICAgICAgICAgICAgIGF0TmV3bGluZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBoYXNTcGFjZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBlbHNlIGZhbGx0aHJvdWdoXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIG9uRXJyb3IodG9rZW4sICdVTkVYUEVDVEVEX1RPS0VOJywgYFVuZXhwZWN0ZWQgJHt0b2tlbi50eXBlfSB0b2tlbmApO1xuICAgICAgICAgICAgICAgIGF0TmV3bGluZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGhhc1NwYWNlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbGFzdCA9IHRva2Vuc1t0b2tlbnMubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgZW5kID0gbGFzdCA/IGxhc3Qub2Zmc2V0ICsgbGFzdC5zb3VyY2UubGVuZ3RoIDogb2Zmc2V0O1xuICAgIGlmIChyZXFTcGFjZSAmJlxuICAgICAgICBuZXh0ICYmXG4gICAgICAgIG5leHQudHlwZSAhPT0gJ3NwYWNlJyAmJlxuICAgICAgICBuZXh0LnR5cGUgIT09ICduZXdsaW5lJyAmJlxuICAgICAgICBuZXh0LnR5cGUgIT09ICdjb21tYScgJiZcbiAgICAgICAgKG5leHQudHlwZSAhPT0gJ3NjYWxhcicgfHwgbmV4dC5zb3VyY2UgIT09ICcnKSkge1xuICAgICAgICBvbkVycm9yKG5leHQub2Zmc2V0LCAnTUlTU0lOR19DSEFSJywgJ1RhZ3MgYW5kIGFuY2hvcnMgbXVzdCBiZSBzZXBhcmF0ZWQgZnJvbSB0aGUgbmV4dCB0b2tlbiBieSB3aGl0ZSBzcGFjZScpO1xuICAgIH1cbiAgICBpZiAodGFiICYmXG4gICAgICAgICgoYXROZXdsaW5lICYmIHRhYi5pbmRlbnQgPD0gcGFyZW50SW5kZW50KSB8fFxuICAgICAgICAgICAgbmV4dD8udHlwZSA9PT0gJ2Jsb2NrLW1hcCcgfHxcbiAgICAgICAgICAgIG5leHQ/LnR5cGUgPT09ICdibG9jay1zZXEnKSlcbiAgICAgICAgb25FcnJvcih0YWIsICdUQUJfQVNfSU5ERU5UJywgJ1RhYnMgYXJlIG5vdCBhbGxvd2VkIGFzIGluZGVudGF0aW9uJyk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY29tbWEsXG4gICAgICAgIGZvdW5kLFxuICAgICAgICBzcGFjZUJlZm9yZSxcbiAgICAgICAgY29tbWVudCxcbiAgICAgICAgaGFzTmV3bGluZSxcbiAgICAgICAgYW5jaG9yLFxuICAgICAgICB0YWcsXG4gICAgICAgIG5ld2xpbmVBZnRlclByb3AsXG4gICAgICAgIGVuZCxcbiAgICAgICAgc3RhcnQ6IHN0YXJ0ID8/IGVuZFxuICAgIH07XG59XG5cbmV4cG9ydCB7IHJlc29sdmVQcm9wcyB9O1xuIiwiZnVuY3Rpb24gY29udGFpbnNOZXdsaW5lKGtleSkge1xuICAgIGlmICgha2V5KVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBzd2l0Y2ggKGtleS50eXBlKSB7XG4gICAgICAgIGNhc2UgJ2FsaWFzJzpcbiAgICAgICAgY2FzZSAnc2NhbGFyJzpcbiAgICAgICAgY2FzZSAnZG91YmxlLXF1b3RlZC1zY2FsYXInOlxuICAgICAgICBjYXNlICdzaW5nbGUtcXVvdGVkLXNjYWxhcic6XG4gICAgICAgICAgICBpZiAoa2V5LnNvdXJjZS5pbmNsdWRlcygnXFxuJykpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBpZiAoa2V5LmVuZClcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHN0IG9mIGtleS5lbmQpXG4gICAgICAgICAgICAgICAgICAgIGlmIChzdC50eXBlID09PSAnbmV3bGluZScpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgY2FzZSAnZmxvdy1jb2xsZWN0aW9uJzpcbiAgICAgICAgICAgIGZvciAoY29uc3QgaXQgb2Yga2V5Lml0ZW1zKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBzdCBvZiBpdC5zdGFydClcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0LnR5cGUgPT09ICduZXdsaW5lJylcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIGlmIChpdC5zZXApXG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc3Qgb2YgaXQuc2VwKVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0LnR5cGUgPT09ICduZXdsaW5lJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAoY29udGFpbnNOZXdsaW5lKGl0LmtleSkgfHwgY29udGFpbnNOZXdsaW5lKGl0LnZhbHVlKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59XG5cbmV4cG9ydCB7IGNvbnRhaW5zTmV3bGluZSB9O1xuIiwiaW1wb3J0IHsgY29udGFpbnNOZXdsaW5lIH0gZnJvbSAnLi91dGlsLWNvbnRhaW5zLW5ld2xpbmUuanMnO1xuXG5mdW5jdGlvbiBmbG93SW5kZW50Q2hlY2soaW5kZW50LCBmYywgb25FcnJvcikge1xuICAgIGlmIChmYz8udHlwZSA9PT0gJ2Zsb3ctY29sbGVjdGlvbicpIHtcbiAgICAgICAgY29uc3QgZW5kID0gZmMuZW5kWzBdO1xuICAgICAgICBpZiAoZW5kLmluZGVudCA9PT0gaW5kZW50ICYmXG4gICAgICAgICAgICAoZW5kLnNvdXJjZSA9PT0gJ10nIHx8IGVuZC5zb3VyY2UgPT09ICd9JykgJiZcbiAgICAgICAgICAgIGNvbnRhaW5zTmV3bGluZShmYykpIHtcbiAgICAgICAgICAgIGNvbnN0IG1zZyA9ICdGbG93IGVuZCBpbmRpY2F0b3Igc2hvdWxkIGJlIG1vcmUgaW5kZW50ZWQgdGhhbiBwYXJlbnQnO1xuICAgICAgICAgICAgb25FcnJvcihlbmQsICdCQURfSU5ERU5UJywgbXNnLCB0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IHsgZmxvd0luZGVudENoZWNrIH07XG4iLCJpbXBvcnQgeyBpc1NjYWxhciB9IGZyb20gJy4uL25vZGVzL2lkZW50aXR5LmpzJztcblxuZnVuY3Rpb24gbWFwSW5jbHVkZXMoY3R4LCBpdGVtcywgc2VhcmNoKSB7XG4gICAgY29uc3QgeyB1bmlxdWVLZXlzIH0gPSBjdHgub3B0aW9ucztcbiAgICBpZiAodW5pcXVlS2V5cyA9PT0gZmFsc2UpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBpc0VxdWFsID0gdHlwZW9mIHVuaXF1ZUtleXMgPT09ICdmdW5jdGlvbidcbiAgICAgICAgPyB1bmlxdWVLZXlzXG4gICAgICAgIDogKGEsIGIpID0+IGEgPT09IGIgfHwgKGlzU2NhbGFyKGEpICYmIGlzU2NhbGFyKGIpICYmIGEudmFsdWUgPT09IGIudmFsdWUpO1xuICAgIHJldHVybiBpdGVtcy5zb21lKHBhaXIgPT4gaXNFcXVhbChwYWlyLmtleSwgc2VhcmNoKSk7XG59XG5cbmV4cG9ydCB7IG1hcEluY2x1ZGVzIH07XG4iLCJpbXBvcnQgeyBQYWlyIH0gZnJvbSAnLi4vbm9kZXMvUGFpci5qcyc7XG5pbXBvcnQgeyBZQU1MTWFwIH0gZnJvbSAnLi4vbm9kZXMvWUFNTE1hcC5qcyc7XG5pbXBvcnQgeyByZXNvbHZlUHJvcHMgfSBmcm9tICcuL3Jlc29sdmUtcHJvcHMuanMnO1xuaW1wb3J0IHsgY29udGFpbnNOZXdsaW5lIH0gZnJvbSAnLi91dGlsLWNvbnRhaW5zLW5ld2xpbmUuanMnO1xuaW1wb3J0IHsgZmxvd0luZGVudENoZWNrIH0gZnJvbSAnLi91dGlsLWZsb3ctaW5kZW50LWNoZWNrLmpzJztcbmltcG9ydCB7IG1hcEluY2x1ZGVzIH0gZnJvbSAnLi91dGlsLW1hcC1pbmNsdWRlcy5qcyc7XG5cbmNvbnN0IHN0YXJ0Q29sTXNnID0gJ0FsbCBtYXBwaW5nIGl0ZW1zIG11c3Qgc3RhcnQgYXQgdGhlIHNhbWUgY29sdW1uJztcbmZ1bmN0aW9uIHJlc29sdmVCbG9ja01hcCh7IGNvbXBvc2VOb2RlLCBjb21wb3NlRW1wdHlOb2RlIH0sIGN0eCwgYm0sIG9uRXJyb3IsIHRhZykge1xuICAgIGNvbnN0IE5vZGVDbGFzcyA9IHRhZz8ubm9kZUNsYXNzID8/IFlBTUxNYXA7XG4gICAgY29uc3QgbWFwID0gbmV3IE5vZGVDbGFzcyhjdHguc2NoZW1hKTtcbiAgICBpZiAoY3R4LmF0Um9vdClcbiAgICAgICAgY3R4LmF0Um9vdCA9IGZhbHNlO1xuICAgIGxldCBvZmZzZXQgPSBibS5vZmZzZXQ7XG4gICAgbGV0IGNvbW1lbnRFbmQgPSBudWxsO1xuICAgIGZvciAoY29uc3QgY29sbEl0ZW0gb2YgYm0uaXRlbXMpIHtcbiAgICAgICAgY29uc3QgeyBzdGFydCwga2V5LCBzZXAsIHZhbHVlIH0gPSBjb2xsSXRlbTtcbiAgICAgICAgLy8ga2V5IHByb3BlcnRpZXNcbiAgICAgICAgY29uc3Qga2V5UHJvcHMgPSByZXNvbHZlUHJvcHMoc3RhcnQsIHtcbiAgICAgICAgICAgIGluZGljYXRvcjogJ2V4cGxpY2l0LWtleS1pbmQnLFxuICAgICAgICAgICAgbmV4dDoga2V5ID8/IHNlcD8uWzBdLFxuICAgICAgICAgICAgb2Zmc2V0LFxuICAgICAgICAgICAgb25FcnJvcixcbiAgICAgICAgICAgIHBhcmVudEluZGVudDogYm0uaW5kZW50LFxuICAgICAgICAgICAgc3RhcnRPbk5ld2xpbmU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGltcGxpY2l0S2V5ID0gIWtleVByb3BzLmZvdW5kO1xuICAgICAgICBpZiAoaW1wbGljaXRLZXkpIHtcbiAgICAgICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICAgICAgICBpZiAoa2V5LnR5cGUgPT09ICdibG9jay1zZXEnKVxuICAgICAgICAgICAgICAgICAgICBvbkVycm9yKG9mZnNldCwgJ0JMT0NLX0FTX0lNUExJQ0lUX0tFWScsICdBIGJsb2NrIHNlcXVlbmNlIG1heSBub3QgYmUgdXNlZCBhcyBhbiBpbXBsaWNpdCBtYXAga2V5Jyk7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoJ2luZGVudCcgaW4ga2V5ICYmIGtleS5pbmRlbnQgIT09IGJtLmluZGVudClcbiAgICAgICAgICAgICAgICAgICAgb25FcnJvcihvZmZzZXQsICdCQURfSU5ERU5UJywgc3RhcnRDb2xNc2cpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFrZXlQcm9wcy5hbmNob3IgJiYgIWtleVByb3BzLnRhZyAmJiAhc2VwKSB7XG4gICAgICAgICAgICAgICAgY29tbWVudEVuZCA9IGtleVByb3BzLmVuZDtcbiAgICAgICAgICAgICAgICBpZiAoa2V5UHJvcHMuY29tbWVudCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWFwLmNvbW1lbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAuY29tbWVudCArPSAnXFxuJyArIGtleVByb3BzLmNvbW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcC5jb21tZW50ID0ga2V5UHJvcHMuY29tbWVudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoa2V5UHJvcHMubmV3bGluZUFmdGVyUHJvcCB8fCBjb250YWluc05ld2xpbmUoa2V5KSkge1xuICAgICAgICAgICAgICAgIG9uRXJyb3Ioa2V5ID8/IHN0YXJ0W3N0YXJ0Lmxlbmd0aCAtIDFdLCAnTVVMVElMSU5FX0lNUExJQ0lUX0tFWScsICdJbXBsaWNpdCBrZXlzIG5lZWQgdG8gYmUgb24gYSBzaW5nbGUgbGluZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGtleVByb3BzLmZvdW5kPy5pbmRlbnQgIT09IGJtLmluZGVudCkge1xuICAgICAgICAgICAgb25FcnJvcihvZmZzZXQsICdCQURfSU5ERU5UJywgc3RhcnRDb2xNc2cpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGtleSB2YWx1ZVxuICAgICAgICBjdHguYXRLZXkgPSB0cnVlO1xuICAgICAgICBjb25zdCBrZXlTdGFydCA9IGtleVByb3BzLmVuZDtcbiAgICAgICAgY29uc3Qga2V5Tm9kZSA9IGtleVxuICAgICAgICAgICAgPyBjb21wb3NlTm9kZShjdHgsIGtleSwga2V5UHJvcHMsIG9uRXJyb3IpXG4gICAgICAgICAgICA6IGNvbXBvc2VFbXB0eU5vZGUoY3R4LCBrZXlTdGFydCwgc3RhcnQsIG51bGwsIGtleVByb3BzLCBvbkVycm9yKTtcbiAgICAgICAgaWYgKGN0eC5zY2hlbWEuY29tcGF0KVxuICAgICAgICAgICAgZmxvd0luZGVudENoZWNrKGJtLmluZGVudCwga2V5LCBvbkVycm9yKTtcbiAgICAgICAgY3R4LmF0S2V5ID0gZmFsc2U7XG4gICAgICAgIGlmIChtYXBJbmNsdWRlcyhjdHgsIG1hcC5pdGVtcywga2V5Tm9kZSkpXG4gICAgICAgICAgICBvbkVycm9yKGtleVN0YXJ0LCAnRFVQTElDQVRFX0tFWScsICdNYXAga2V5cyBtdXN0IGJlIHVuaXF1ZScpO1xuICAgICAgICAvLyB2YWx1ZSBwcm9wZXJ0aWVzXG4gICAgICAgIGNvbnN0IHZhbHVlUHJvcHMgPSByZXNvbHZlUHJvcHMoc2VwID8/IFtdLCB7XG4gICAgICAgICAgICBpbmRpY2F0b3I6ICdtYXAtdmFsdWUtaW5kJyxcbiAgICAgICAgICAgIG5leHQ6IHZhbHVlLFxuICAgICAgICAgICAgb2Zmc2V0OiBrZXlOb2RlLnJhbmdlWzJdLFxuICAgICAgICAgICAgb25FcnJvcixcbiAgICAgICAgICAgIHBhcmVudEluZGVudDogYm0uaW5kZW50LFxuICAgICAgICAgICAgc3RhcnRPbk5ld2xpbmU6ICFrZXkgfHwga2V5LnR5cGUgPT09ICdibG9jay1zY2FsYXInXG4gICAgICAgIH0pO1xuICAgICAgICBvZmZzZXQgPSB2YWx1ZVByb3BzLmVuZDtcbiAgICAgICAgaWYgKHZhbHVlUHJvcHMuZm91bmQpIHtcbiAgICAgICAgICAgIGlmIChpbXBsaWNpdEtleSkge1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZT8udHlwZSA9PT0gJ2Jsb2NrLW1hcCcgJiYgIXZhbHVlUHJvcHMuaGFzTmV3bGluZSlcbiAgICAgICAgICAgICAgICAgICAgb25FcnJvcihvZmZzZXQsICdCTE9DS19BU19JTVBMSUNJVF9LRVknLCAnTmVzdGVkIG1hcHBpbmdzIGFyZSBub3QgYWxsb3dlZCBpbiBjb21wYWN0IG1hcHBpbmdzJyk7XG4gICAgICAgICAgICAgICAgaWYgKGN0eC5vcHRpb25zLnN0cmljdCAmJlxuICAgICAgICAgICAgICAgICAgICBrZXlQcm9wcy5zdGFydCA8IHZhbHVlUHJvcHMuZm91bmQub2Zmc2V0IC0gMTAyNClcbiAgICAgICAgICAgICAgICAgICAgb25FcnJvcihrZXlOb2RlLnJhbmdlLCAnS0VZX09WRVJfMTAyNF9DSEFSUycsICdUaGUgOiBpbmRpY2F0b3IgbXVzdCBiZSBhdCBtb3N0IDEwMjQgY2hhcnMgYWZ0ZXIgdGhlIHN0YXJ0IG9mIGFuIGltcGxpY2l0IGJsb2NrIG1hcHBpbmcga2V5Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyB2YWx1ZSB2YWx1ZVxuICAgICAgICAgICAgY29uc3QgdmFsdWVOb2RlID0gdmFsdWVcbiAgICAgICAgICAgICAgICA/IGNvbXBvc2VOb2RlKGN0eCwgdmFsdWUsIHZhbHVlUHJvcHMsIG9uRXJyb3IpXG4gICAgICAgICAgICAgICAgOiBjb21wb3NlRW1wdHlOb2RlKGN0eCwgb2Zmc2V0LCBzZXAsIG51bGwsIHZhbHVlUHJvcHMsIG9uRXJyb3IpO1xuICAgICAgICAgICAgaWYgKGN0eC5zY2hlbWEuY29tcGF0KVxuICAgICAgICAgICAgICAgIGZsb3dJbmRlbnRDaGVjayhibS5pbmRlbnQsIHZhbHVlLCBvbkVycm9yKTtcbiAgICAgICAgICAgIG9mZnNldCA9IHZhbHVlTm9kZS5yYW5nZVsyXTtcbiAgICAgICAgICAgIGNvbnN0IHBhaXIgPSBuZXcgUGFpcihrZXlOb2RlLCB2YWx1ZU5vZGUpO1xuICAgICAgICAgICAgaWYgKGN0eC5vcHRpb25zLmtlZXBTb3VyY2VUb2tlbnMpXG4gICAgICAgICAgICAgICAgcGFpci5zcmNUb2tlbiA9IGNvbGxJdGVtO1xuICAgICAgICAgICAgbWFwLml0ZW1zLnB1c2gocGFpcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBrZXkgd2l0aCBubyB2YWx1ZVxuICAgICAgICAgICAgaWYgKGltcGxpY2l0S2V5KVxuICAgICAgICAgICAgICAgIG9uRXJyb3Ioa2V5Tm9kZS5yYW5nZSwgJ01JU1NJTkdfQ0hBUicsICdJbXBsaWNpdCBtYXAga2V5cyBuZWVkIHRvIGJlIGZvbGxvd2VkIGJ5IG1hcCB2YWx1ZXMnKTtcbiAgICAgICAgICAgIGlmICh2YWx1ZVByb3BzLmNvbW1lbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoa2V5Tm9kZS5jb21tZW50KVxuICAgICAgICAgICAgICAgICAgICBrZXlOb2RlLmNvbW1lbnQgKz0gJ1xcbicgKyB2YWx1ZVByb3BzLmNvbW1lbnQ7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBrZXlOb2RlLmNvbW1lbnQgPSB2YWx1ZVByb3BzLmNvbW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBwYWlyID0gbmV3IFBhaXIoa2V5Tm9kZSk7XG4gICAgICAgICAgICBpZiAoY3R4Lm9wdGlvbnMua2VlcFNvdXJjZVRva2VucylcbiAgICAgICAgICAgICAgICBwYWlyLnNyY1Rva2VuID0gY29sbEl0ZW07XG4gICAgICAgICAgICBtYXAuaXRlbXMucHVzaChwYWlyKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoY29tbWVudEVuZCAmJiBjb21tZW50RW5kIDwgb2Zmc2V0KVxuICAgICAgICBvbkVycm9yKGNvbW1lbnRFbmQsICdJTVBPU1NJQkxFJywgJ01hcCBjb21tZW50IHdpdGggdHJhaWxpbmcgY29udGVudCcpO1xuICAgIG1hcC5yYW5nZSA9IFtibS5vZmZzZXQsIG9mZnNldCwgY29tbWVudEVuZCA/PyBvZmZzZXRdO1xuICAgIHJldHVybiBtYXA7XG59XG5cbmV4cG9ydCB7IHJlc29sdmVCbG9ja01hcCB9O1xuIiwiaW1wb3J0IHsgWUFNTFNlcSB9IGZyb20gJy4uL25vZGVzL1lBTUxTZXEuanMnO1xuaW1wb3J0IHsgcmVzb2x2ZVByb3BzIH0gZnJvbSAnLi9yZXNvbHZlLXByb3BzLmpzJztcbmltcG9ydCB7IGZsb3dJbmRlbnRDaGVjayB9IGZyb20gJy4vdXRpbC1mbG93LWluZGVudC1jaGVjay5qcyc7XG5cbmZ1bmN0aW9uIHJlc29sdmVCbG9ja1NlcSh7IGNvbXBvc2VOb2RlLCBjb21wb3NlRW1wdHlOb2RlIH0sIGN0eCwgYnMsIG9uRXJyb3IsIHRhZykge1xuICAgIGNvbnN0IE5vZGVDbGFzcyA9IHRhZz8ubm9kZUNsYXNzID8/IFlBTUxTZXE7XG4gICAgY29uc3Qgc2VxID0gbmV3IE5vZGVDbGFzcyhjdHguc2NoZW1hKTtcbiAgICBpZiAoY3R4LmF0Um9vdClcbiAgICAgICAgY3R4LmF0Um9vdCA9IGZhbHNlO1xuICAgIGlmIChjdHguYXRLZXkpXG4gICAgICAgIGN0eC5hdEtleSA9IGZhbHNlO1xuICAgIGxldCBvZmZzZXQgPSBicy5vZmZzZXQ7XG4gICAgbGV0IGNvbW1lbnRFbmQgPSBudWxsO1xuICAgIGZvciAoY29uc3QgeyBzdGFydCwgdmFsdWUgfSBvZiBicy5pdGVtcykge1xuICAgICAgICBjb25zdCBwcm9wcyA9IHJlc29sdmVQcm9wcyhzdGFydCwge1xuICAgICAgICAgICAgaW5kaWNhdG9yOiAnc2VxLWl0ZW0taW5kJyxcbiAgICAgICAgICAgIG5leHQ6IHZhbHVlLFxuICAgICAgICAgICAgb2Zmc2V0LFxuICAgICAgICAgICAgb25FcnJvcixcbiAgICAgICAgICAgIHBhcmVudEluZGVudDogYnMuaW5kZW50LFxuICAgICAgICAgICAgc3RhcnRPbk5ld2xpbmU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghcHJvcHMuZm91bmQpIHtcbiAgICAgICAgICAgIGlmIChwcm9wcy5hbmNob3IgfHwgcHJvcHMudGFnIHx8IHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlPy50eXBlID09PSAnYmxvY2stc2VxJylcbiAgICAgICAgICAgICAgICAgICAgb25FcnJvcihwcm9wcy5lbmQsICdCQURfSU5ERU5UJywgJ0FsbCBzZXF1ZW5jZSBpdGVtcyBtdXN0IHN0YXJ0IGF0IHRoZSBzYW1lIGNvbHVtbicpO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgb25FcnJvcihvZmZzZXQsICdNSVNTSU5HX0NIQVInLCAnU2VxdWVuY2UgaXRlbSB3aXRob3V0IC0gaW5kaWNhdG9yJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb21tZW50RW5kID0gcHJvcHMuZW5kO1xuICAgICAgICAgICAgICAgIGlmIChwcm9wcy5jb21tZW50KVxuICAgICAgICAgICAgICAgICAgICBzZXEuY29tbWVudCA9IHByb3BzLmNvbW1lbnQ7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgbm9kZSA9IHZhbHVlXG4gICAgICAgICAgICA/IGNvbXBvc2VOb2RlKGN0eCwgdmFsdWUsIHByb3BzLCBvbkVycm9yKVxuICAgICAgICAgICAgOiBjb21wb3NlRW1wdHlOb2RlKGN0eCwgcHJvcHMuZW5kLCBzdGFydCwgbnVsbCwgcHJvcHMsIG9uRXJyb3IpO1xuICAgICAgICBpZiAoY3R4LnNjaGVtYS5jb21wYXQpXG4gICAgICAgICAgICBmbG93SW5kZW50Q2hlY2soYnMuaW5kZW50LCB2YWx1ZSwgb25FcnJvcik7XG4gICAgICAgIG9mZnNldCA9IG5vZGUucmFuZ2VbMl07XG4gICAgICAgIHNlcS5pdGVtcy5wdXNoKG5vZGUpO1xuICAgIH1cbiAgICBzZXEucmFuZ2UgPSBbYnMub2Zmc2V0LCBvZmZzZXQsIGNvbW1lbnRFbmQgPz8gb2Zmc2V0XTtcbiAgICByZXR1cm4gc2VxO1xufVxuXG5leHBvcnQgeyByZXNvbHZlQmxvY2tTZXEgfTtcbiIsImZ1bmN0aW9uIHJlc29sdmVFbmQoZW5kLCBvZmZzZXQsIHJlcVNwYWNlLCBvbkVycm9yKSB7XG4gICAgbGV0IGNvbW1lbnQgPSAnJztcbiAgICBpZiAoZW5kKSB7XG4gICAgICAgIGxldCBoYXNTcGFjZSA9IGZhbHNlO1xuICAgICAgICBsZXQgc2VwID0gJyc7XG4gICAgICAgIGZvciAoY29uc3QgdG9rZW4gb2YgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB7IHNvdXJjZSwgdHlwZSB9ID0gdG9rZW47XG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdzcGFjZSc6XG4gICAgICAgICAgICAgICAgICAgIGhhc1NwYWNlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnY29tbWVudCc6IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcVNwYWNlICYmICFoYXNTcGFjZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uRXJyb3IodG9rZW4sICdNSVNTSU5HX0NIQVInLCAnQ29tbWVudHMgbXVzdCBiZSBzZXBhcmF0ZWQgZnJvbSBvdGhlciB0b2tlbnMgYnkgd2hpdGUgc3BhY2UgY2hhcmFjdGVycycpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYiA9IHNvdXJjZS5zdWJzdHJpbmcoMSkgfHwgJyAnO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbW1lbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50ID0gY2I7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgKz0gc2VwICsgY2I7XG4gICAgICAgICAgICAgICAgICAgIHNlcCA9ICcnO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSAnbmV3bGluZSc6XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb21tZW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgc2VwICs9IHNvdXJjZTtcbiAgICAgICAgICAgICAgICAgICAgaGFzU3BhY2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBvbkVycm9yKHRva2VuLCAnVU5FWFBFQ1RFRF9UT0tFTicsIGBVbmV4cGVjdGVkICR7dHlwZX0gYXQgbm9kZSBlbmRgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9mZnNldCArPSBzb3VyY2UubGVuZ3RoO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IGNvbW1lbnQsIG9mZnNldCB9O1xufVxuXG5leHBvcnQgeyByZXNvbHZlRW5kIH07XG4iLCJpbXBvcnQgeyBpc1BhaXIgfSBmcm9tICcuLi9ub2Rlcy9pZGVudGl0eS5qcyc7XG5pbXBvcnQgeyBQYWlyIH0gZnJvbSAnLi4vbm9kZXMvUGFpci5qcyc7XG5pbXBvcnQgeyBZQU1MTWFwIH0gZnJvbSAnLi4vbm9kZXMvWUFNTE1hcC5qcyc7XG5pbXBvcnQgeyBZQU1MU2VxIH0gZnJvbSAnLi4vbm9kZXMvWUFNTFNlcS5qcyc7XG5pbXBvcnQgeyByZXNvbHZlRW5kIH0gZnJvbSAnLi9yZXNvbHZlLWVuZC5qcyc7XG5pbXBvcnQgeyByZXNvbHZlUHJvcHMgfSBmcm9tICcuL3Jlc29sdmUtcHJvcHMuanMnO1xuaW1wb3J0IHsgY29udGFpbnNOZXdsaW5lIH0gZnJvbSAnLi91dGlsLWNvbnRhaW5zLW5ld2xpbmUuanMnO1xuaW1wb3J0IHsgbWFwSW5jbHVkZXMgfSBmcm9tICcuL3V0aWwtbWFwLWluY2x1ZGVzLmpzJztcblxuY29uc3QgYmxvY2tNc2cgPSAnQmxvY2sgY29sbGVjdGlvbnMgYXJlIG5vdCBhbGxvd2VkIHdpdGhpbiBmbG93IGNvbGxlY3Rpb25zJztcbmNvbnN0IGlzQmxvY2sgPSAodG9rZW4pID0+IHRva2VuICYmICh0b2tlbi50eXBlID09PSAnYmxvY2stbWFwJyB8fCB0b2tlbi50eXBlID09PSAnYmxvY2stc2VxJyk7XG5mdW5jdGlvbiByZXNvbHZlRmxvd0NvbGxlY3Rpb24oeyBjb21wb3NlTm9kZSwgY29tcG9zZUVtcHR5Tm9kZSB9LCBjdHgsIGZjLCBvbkVycm9yLCB0YWcpIHtcbiAgICBjb25zdCBpc01hcCA9IGZjLnN0YXJ0LnNvdXJjZSA9PT0gJ3snO1xuICAgIGNvbnN0IGZjTmFtZSA9IGlzTWFwID8gJ2Zsb3cgbWFwJyA6ICdmbG93IHNlcXVlbmNlJztcbiAgICBjb25zdCBOb2RlQ2xhc3MgPSAodGFnPy5ub2RlQ2xhc3MgPz8gKGlzTWFwID8gWUFNTE1hcCA6IFlBTUxTZXEpKTtcbiAgICBjb25zdCBjb2xsID0gbmV3IE5vZGVDbGFzcyhjdHguc2NoZW1hKTtcbiAgICBjb2xsLmZsb3cgPSB0cnVlO1xuICAgIGNvbnN0IGF0Um9vdCA9IGN0eC5hdFJvb3Q7XG4gICAgaWYgKGF0Um9vdClcbiAgICAgICAgY3R4LmF0Um9vdCA9IGZhbHNlO1xuICAgIGlmIChjdHguYXRLZXkpXG4gICAgICAgIGN0eC5hdEtleSA9IGZhbHNlO1xuICAgIGxldCBvZmZzZXQgPSBmYy5vZmZzZXQgKyBmYy5zdGFydC5zb3VyY2UubGVuZ3RoO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmMuaXRlbXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY29uc3QgY29sbEl0ZW0gPSBmYy5pdGVtc1tpXTtcbiAgICAgICAgY29uc3QgeyBzdGFydCwga2V5LCBzZXAsIHZhbHVlIH0gPSBjb2xsSXRlbTtcbiAgICAgICAgY29uc3QgcHJvcHMgPSByZXNvbHZlUHJvcHMoc3RhcnQsIHtcbiAgICAgICAgICAgIGZsb3c6IGZjTmFtZSxcbiAgICAgICAgICAgIGluZGljYXRvcjogJ2V4cGxpY2l0LWtleS1pbmQnLFxuICAgICAgICAgICAgbmV4dDoga2V5ID8/IHNlcD8uWzBdLFxuICAgICAgICAgICAgb2Zmc2V0LFxuICAgICAgICAgICAgb25FcnJvcixcbiAgICAgICAgICAgIHBhcmVudEluZGVudDogZmMuaW5kZW50LFxuICAgICAgICAgICAgc3RhcnRPbk5ld2xpbmU6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIXByb3BzLmZvdW5kKSB7XG4gICAgICAgICAgICBpZiAoIXByb3BzLmFuY2hvciAmJiAhcHJvcHMudGFnICYmICFzZXAgJiYgIXZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGkgPT09IDAgJiYgcHJvcHMuY29tbWEpXG4gICAgICAgICAgICAgICAgICAgIG9uRXJyb3IocHJvcHMuY29tbWEsICdVTkVYUEVDVEVEX1RPS0VOJywgYFVuZXhwZWN0ZWQgLCBpbiAke2ZjTmFtZX1gKTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChpIDwgZmMuaXRlbXMubGVuZ3RoIC0gMSlcbiAgICAgICAgICAgICAgICAgICAgb25FcnJvcihwcm9wcy5zdGFydCwgJ1VORVhQRUNURURfVE9LRU4nLCBgVW5leHBlY3RlZCBlbXB0eSBpdGVtIGluICR7ZmNOYW1lfWApO1xuICAgICAgICAgICAgICAgIGlmIChwcm9wcy5jb21tZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb2xsLmNvbW1lbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xsLmNvbW1lbnQgKz0gJ1xcbicgKyBwcm9wcy5jb21tZW50O1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xsLmNvbW1lbnQgPSBwcm9wcy5jb21tZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBvZmZzZXQgPSBwcm9wcy5lbmQ7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWlzTWFwICYmIGN0eC5vcHRpb25zLnN0cmljdCAmJiBjb250YWluc05ld2xpbmUoa2V5KSlcbiAgICAgICAgICAgICAgICBvbkVycm9yKGtleSwgLy8gY2hlY2tlZCBieSBjb250YWluc05ld2xpbmUoKVxuICAgICAgICAgICAgICAgICdNVUxUSUxJTkVfSU1QTElDSVRfS0VZJywgJ0ltcGxpY2l0IGtleXMgb2YgZmxvdyBzZXF1ZW5jZSBwYWlycyBuZWVkIHRvIGJlIG9uIGEgc2luZ2xlIGxpbmUnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgICAgICAgaWYgKHByb3BzLmNvbW1hKVxuICAgICAgICAgICAgICAgIG9uRXJyb3IocHJvcHMuY29tbWEsICdVTkVYUEVDVEVEX1RPS0VOJywgYFVuZXhwZWN0ZWQgLCBpbiAke2ZjTmFtZX1gKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICghcHJvcHMuY29tbWEpXG4gICAgICAgICAgICAgICAgb25FcnJvcihwcm9wcy5zdGFydCwgJ01JU1NJTkdfQ0hBUicsIGBNaXNzaW5nICwgYmV0d2VlbiAke2ZjTmFtZX0gaXRlbXNgKTtcbiAgICAgICAgICAgIGlmIChwcm9wcy5jb21tZW50KSB7XG4gICAgICAgICAgICAgICAgbGV0IHByZXZJdGVtQ29tbWVudCA9ICcnO1xuICAgICAgICAgICAgICAgIGxvb3A6IGZvciAoY29uc3Qgc3Qgb2Ygc3RhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdC50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdjb21tYSc6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdzcGFjZSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdjb21tZW50JzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2SXRlbUNvbW1lbnQgPSBzdC5zb3VyY2Uuc3Vic3RyaW5nKDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGxvb3A7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGxvb3A7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHByZXZJdGVtQ29tbWVudCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcHJldiA9IGNvbGwuaXRlbXNbY29sbC5pdGVtcy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzUGFpcihwcmV2KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXYgPSBwcmV2LnZhbHVlID8/IHByZXYua2V5O1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJldi5jb21tZW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgcHJldi5jb21tZW50ICs9ICdcXG4nICsgcHJldkl0ZW1Db21tZW50O1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmV2LmNvbW1lbnQgPSBwcmV2SXRlbUNvbW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIHByb3BzLmNvbW1lbnQgPSBwcm9wcy5jb21tZW50LnN1YnN0cmluZyhwcmV2SXRlbUNvbW1lbnQubGVuZ3RoICsgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghaXNNYXAgJiYgIXNlcCAmJiAhcHJvcHMuZm91bmQpIHtcbiAgICAgICAgICAgIC8vIGl0ZW0gaXMgYSB2YWx1ZSBpbiBhIHNlcVxuICAgICAgICAgICAgLy8g4oaSIGtleSAmIHNlcCBhcmUgZW1wdHksIHN0YXJ0IGRvZXMgbm90IGluY2x1ZGUgPyBvciA6XG4gICAgICAgICAgICBjb25zdCB2YWx1ZU5vZGUgPSB2YWx1ZVxuICAgICAgICAgICAgICAgID8gY29tcG9zZU5vZGUoY3R4LCB2YWx1ZSwgcHJvcHMsIG9uRXJyb3IpXG4gICAgICAgICAgICAgICAgOiBjb21wb3NlRW1wdHlOb2RlKGN0eCwgcHJvcHMuZW5kLCBzZXAsIG51bGwsIHByb3BzLCBvbkVycm9yKTtcbiAgICAgICAgICAgIGNvbGwuaXRlbXMucHVzaCh2YWx1ZU5vZGUpO1xuICAgICAgICAgICAgb2Zmc2V0ID0gdmFsdWVOb2RlLnJhbmdlWzJdO1xuICAgICAgICAgICAgaWYgKGlzQmxvY2sodmFsdWUpKVxuICAgICAgICAgICAgICAgIG9uRXJyb3IodmFsdWVOb2RlLnJhbmdlLCAnQkxPQ0tfSU5fRkxPVycsIGJsb2NrTXNnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIGl0ZW0gaXMgYSBrZXkrdmFsdWUgcGFpclxuICAgICAgICAgICAgLy8ga2V5IHZhbHVlXG4gICAgICAgICAgICBjdHguYXRLZXkgPSB0cnVlO1xuICAgICAgICAgICAgY29uc3Qga2V5U3RhcnQgPSBwcm9wcy5lbmQ7XG4gICAgICAgICAgICBjb25zdCBrZXlOb2RlID0ga2V5XG4gICAgICAgICAgICAgICAgPyBjb21wb3NlTm9kZShjdHgsIGtleSwgcHJvcHMsIG9uRXJyb3IpXG4gICAgICAgICAgICAgICAgOiBjb21wb3NlRW1wdHlOb2RlKGN0eCwga2V5U3RhcnQsIHN0YXJ0LCBudWxsLCBwcm9wcywgb25FcnJvcik7XG4gICAgICAgICAgICBpZiAoaXNCbG9jayhrZXkpKVxuICAgICAgICAgICAgICAgIG9uRXJyb3Ioa2V5Tm9kZS5yYW5nZSwgJ0JMT0NLX0lOX0ZMT1cnLCBibG9ja01zZyk7XG4gICAgICAgICAgICBjdHguYXRLZXkgPSBmYWxzZTtcbiAgICAgICAgICAgIC8vIHZhbHVlIHByb3BlcnRpZXNcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlUHJvcHMgPSByZXNvbHZlUHJvcHMoc2VwID8/IFtdLCB7XG4gICAgICAgICAgICAgICAgZmxvdzogZmNOYW1lLFxuICAgICAgICAgICAgICAgIGluZGljYXRvcjogJ21hcC12YWx1ZS1pbmQnLFxuICAgICAgICAgICAgICAgIG5leHQ6IHZhbHVlLFxuICAgICAgICAgICAgICAgIG9mZnNldDoga2V5Tm9kZS5yYW5nZVsyXSxcbiAgICAgICAgICAgICAgICBvbkVycm9yLFxuICAgICAgICAgICAgICAgIHBhcmVudEluZGVudDogZmMuaW5kZW50LFxuICAgICAgICAgICAgICAgIHN0YXJ0T25OZXdsaW5lOiBmYWxzZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAodmFsdWVQcm9wcy5mb3VuZCkge1xuICAgICAgICAgICAgICAgIGlmICghaXNNYXAgJiYgIXByb3BzLmZvdW5kICYmIGN0eC5vcHRpb25zLnN0cmljdCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2VwKVxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzdCBvZiBzZXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3QgPT09IHZhbHVlUHJvcHMuZm91bmQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdC50eXBlID09PSAnbmV3bGluZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25FcnJvcihzdCwgJ01VTFRJTElORV9JTVBMSUNJVF9LRVknLCAnSW1wbGljaXQga2V5cyBvZiBmbG93IHNlcXVlbmNlIHBhaXJzIG5lZWQgdG8gYmUgb24gYSBzaW5nbGUgbGluZScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wcy5zdGFydCA8IHZhbHVlUHJvcHMuZm91bmQub2Zmc2V0IC0gMTAyNClcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uRXJyb3IodmFsdWVQcm9wcy5mb3VuZCwgJ0tFWV9PVkVSXzEwMjRfQ0hBUlMnLCAnVGhlIDogaW5kaWNhdG9yIG11c3QgYmUgYXQgbW9zdCAxMDI0IGNoYXJzIGFmdGVyIHRoZSBzdGFydCBvZiBhbiBpbXBsaWNpdCBmbG93IHNlcXVlbmNlIGtleScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKCdzb3VyY2UnIGluIHZhbHVlICYmIHZhbHVlLnNvdXJjZT8uWzBdID09PSAnOicpXG4gICAgICAgICAgICAgICAgICAgIG9uRXJyb3IodmFsdWUsICdNSVNTSU5HX0NIQVInLCBgTWlzc2luZyBzcGFjZSBhZnRlciA6IGluICR7ZmNOYW1lfWApO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgb25FcnJvcih2YWx1ZVByb3BzLnN0YXJ0LCAnTUlTU0lOR19DSEFSJywgYE1pc3NpbmcgLCBvciA6IGJldHdlZW4gJHtmY05hbWV9IGl0ZW1zYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyB2YWx1ZSB2YWx1ZVxuICAgICAgICAgICAgY29uc3QgdmFsdWVOb2RlID0gdmFsdWVcbiAgICAgICAgICAgICAgICA/IGNvbXBvc2VOb2RlKGN0eCwgdmFsdWUsIHZhbHVlUHJvcHMsIG9uRXJyb3IpXG4gICAgICAgICAgICAgICAgOiB2YWx1ZVByb3BzLmZvdW5kXG4gICAgICAgICAgICAgICAgICAgID8gY29tcG9zZUVtcHR5Tm9kZShjdHgsIHZhbHVlUHJvcHMuZW5kLCBzZXAsIG51bGwsIHZhbHVlUHJvcHMsIG9uRXJyb3IpXG4gICAgICAgICAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgICAgIGlmICh2YWx1ZU5vZGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNCbG9jayh2YWx1ZSkpXG4gICAgICAgICAgICAgICAgICAgIG9uRXJyb3IodmFsdWVOb2RlLnJhbmdlLCAnQkxPQ0tfSU5fRkxPVycsIGJsb2NrTXNnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlUHJvcHMuY29tbWVudCkge1xuICAgICAgICAgICAgICAgIGlmIChrZXlOb2RlLmNvbW1lbnQpXG4gICAgICAgICAgICAgICAgICAgIGtleU5vZGUuY29tbWVudCArPSAnXFxuJyArIHZhbHVlUHJvcHMuY29tbWVudDtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGtleU5vZGUuY29tbWVudCA9IHZhbHVlUHJvcHMuY29tbWVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHBhaXIgPSBuZXcgUGFpcihrZXlOb2RlLCB2YWx1ZU5vZGUpO1xuICAgICAgICAgICAgaWYgKGN0eC5vcHRpb25zLmtlZXBTb3VyY2VUb2tlbnMpXG4gICAgICAgICAgICAgICAgcGFpci5zcmNUb2tlbiA9IGNvbGxJdGVtO1xuICAgICAgICAgICAgaWYgKGlzTWFwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWFwID0gY29sbDtcbiAgICAgICAgICAgICAgICBpZiAobWFwSW5jbHVkZXMoY3R4LCBtYXAuaXRlbXMsIGtleU5vZGUpKVxuICAgICAgICAgICAgICAgICAgICBvbkVycm9yKGtleVN0YXJ0LCAnRFVQTElDQVRFX0tFWScsICdNYXAga2V5cyBtdXN0IGJlIHVuaXF1ZScpO1xuICAgICAgICAgICAgICAgIG1hcC5pdGVtcy5wdXNoKHBhaXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWFwID0gbmV3IFlBTUxNYXAoY3R4LnNjaGVtYSk7XG4gICAgICAgICAgICAgICAgbWFwLmZsb3cgPSB0cnVlO1xuICAgICAgICAgICAgICAgIG1hcC5pdGVtcy5wdXNoKHBhaXIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVuZFJhbmdlID0gKHZhbHVlTm9kZSA/PyBrZXlOb2RlKS5yYW5nZTtcbiAgICAgICAgICAgICAgICBtYXAucmFuZ2UgPSBba2V5Tm9kZS5yYW5nZVswXSwgZW5kUmFuZ2VbMV0sIGVuZFJhbmdlWzJdXTtcbiAgICAgICAgICAgICAgICBjb2xsLml0ZW1zLnB1c2gobWFwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9mZnNldCA9IHZhbHVlTm9kZSA/IHZhbHVlTm9kZS5yYW5nZVsyXSA6IHZhbHVlUHJvcHMuZW5kO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGV4cGVjdGVkRW5kID0gaXNNYXAgPyAnfScgOiAnXSc7XG4gICAgY29uc3QgW2NlLCAuLi5lZV0gPSBmYy5lbmQ7XG4gICAgbGV0IGNlUG9zID0gb2Zmc2V0O1xuICAgIGlmIChjZT8uc291cmNlID09PSBleHBlY3RlZEVuZClcbiAgICAgICAgY2VQb3MgPSBjZS5vZmZzZXQgKyBjZS5zb3VyY2UubGVuZ3RoO1xuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBuYW1lID0gZmNOYW1lWzBdLnRvVXBwZXJDYXNlKCkgKyBmY05hbWUuc3Vic3RyaW5nKDEpO1xuICAgICAgICBjb25zdCBtc2cgPSBhdFJvb3RcbiAgICAgICAgICAgID8gYCR7bmFtZX0gbXVzdCBlbmQgd2l0aCBhICR7ZXhwZWN0ZWRFbmR9YFxuICAgICAgICAgICAgOiBgJHtuYW1lfSBpbiBibG9jayBjb2xsZWN0aW9uIG11c3QgYmUgc3VmZmljaWVudGx5IGluZGVudGVkIGFuZCBlbmQgd2l0aCBhICR7ZXhwZWN0ZWRFbmR9YDtcbiAgICAgICAgb25FcnJvcihvZmZzZXQsIGF0Um9vdCA/ICdNSVNTSU5HX0NIQVInIDogJ0JBRF9JTkRFTlQnLCBtc2cpO1xuICAgICAgICBpZiAoY2UgJiYgY2Uuc291cmNlLmxlbmd0aCAhPT0gMSlcbiAgICAgICAgICAgIGVlLnVuc2hpZnQoY2UpO1xuICAgIH1cbiAgICBpZiAoZWUubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBlbmQgPSByZXNvbHZlRW5kKGVlLCBjZVBvcywgY3R4Lm9wdGlvbnMuc3RyaWN0LCBvbkVycm9yKTtcbiAgICAgICAgaWYgKGVuZC5jb21tZW50KSB7XG4gICAgICAgICAgICBpZiAoY29sbC5jb21tZW50KVxuICAgICAgICAgICAgICAgIGNvbGwuY29tbWVudCArPSAnXFxuJyArIGVuZC5jb21tZW50O1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGNvbGwuY29tbWVudCA9IGVuZC5jb21tZW50O1xuICAgICAgICB9XG4gICAgICAgIGNvbGwucmFuZ2UgPSBbZmMub2Zmc2V0LCBjZVBvcywgZW5kLm9mZnNldF07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb2xsLnJhbmdlID0gW2ZjLm9mZnNldCwgY2VQb3MsIGNlUG9zXTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbGw7XG59XG5cbmV4cG9ydCB7IHJlc29sdmVGbG93Q29sbGVjdGlvbiB9O1xuIiwiaW1wb3J0IHsgaXNOb2RlIH0gZnJvbSAnLi4vbm9kZXMvaWRlbnRpdHkuanMnO1xuaW1wb3J0IHsgU2NhbGFyIH0gZnJvbSAnLi4vbm9kZXMvU2NhbGFyLmpzJztcbmltcG9ydCB7IFlBTUxNYXAgfSBmcm9tICcuLi9ub2Rlcy9ZQU1MTWFwLmpzJztcbmltcG9ydCB7IFlBTUxTZXEgfSBmcm9tICcuLi9ub2Rlcy9ZQU1MU2VxLmpzJztcbmltcG9ydCB7IHJlc29sdmVCbG9ja01hcCB9IGZyb20gJy4vcmVzb2x2ZS1ibG9jay1tYXAuanMnO1xuaW1wb3J0IHsgcmVzb2x2ZUJsb2NrU2VxIH0gZnJvbSAnLi9yZXNvbHZlLWJsb2NrLXNlcS5qcyc7XG5pbXBvcnQgeyByZXNvbHZlRmxvd0NvbGxlY3Rpb24gfSBmcm9tICcuL3Jlc29sdmUtZmxvdy1jb2xsZWN0aW9uLmpzJztcblxuZnVuY3Rpb24gcmVzb2x2ZUNvbGxlY3Rpb24oQ04sIGN0eCwgdG9rZW4sIG9uRXJyb3IsIHRhZ05hbWUsIHRhZykge1xuICAgIGNvbnN0IGNvbGwgPSB0b2tlbi50eXBlID09PSAnYmxvY2stbWFwJ1xuICAgICAgICA/IHJlc29sdmVCbG9ja01hcChDTiwgY3R4LCB0b2tlbiwgb25FcnJvciwgdGFnKVxuICAgICAgICA6IHRva2VuLnR5cGUgPT09ICdibG9jay1zZXEnXG4gICAgICAgICAgICA/IHJlc29sdmVCbG9ja1NlcShDTiwgY3R4LCB0b2tlbiwgb25FcnJvciwgdGFnKVxuICAgICAgICAgICAgOiByZXNvbHZlRmxvd0NvbGxlY3Rpb24oQ04sIGN0eCwgdG9rZW4sIG9uRXJyb3IsIHRhZyk7XG4gICAgY29uc3QgQ29sbCA9IGNvbGwuY29uc3RydWN0b3I7XG4gICAgLy8gSWYgd2UgZ290IGEgdGFnTmFtZSBtYXRjaGluZyB0aGUgY2xhc3MsIG9yIHRoZSB0YWcgbmFtZSBpcyAnIScsXG4gICAgLy8gdGhlbiB1c2UgdGhlIHRhZ05hbWUgZnJvbSB0aGUgbm9kZSBjbGFzcyB1c2VkIHRvIGNyZWF0ZSBpdC5cbiAgICBpZiAodGFnTmFtZSA9PT0gJyEnIHx8IHRhZ05hbWUgPT09IENvbGwudGFnTmFtZSkge1xuICAgICAgICBjb2xsLnRhZyA9IENvbGwudGFnTmFtZTtcbiAgICAgICAgcmV0dXJuIGNvbGw7XG4gICAgfVxuICAgIGlmICh0YWdOYW1lKVxuICAgICAgICBjb2xsLnRhZyA9IHRhZ05hbWU7XG4gICAgcmV0dXJuIGNvbGw7XG59XG5mdW5jdGlvbiBjb21wb3NlQ29sbGVjdGlvbihDTiwgY3R4LCB0b2tlbiwgcHJvcHMsIG9uRXJyb3IpIHtcbiAgICBjb25zdCB0YWdUb2tlbiA9IHByb3BzLnRhZztcbiAgICBjb25zdCB0YWdOYW1lID0gIXRhZ1Rva2VuXG4gICAgICAgID8gbnVsbFxuICAgICAgICA6IGN0eC5kaXJlY3RpdmVzLnRhZ05hbWUodGFnVG9rZW4uc291cmNlLCBtc2cgPT4gb25FcnJvcih0YWdUb2tlbiwgJ1RBR19SRVNPTFZFX0ZBSUxFRCcsIG1zZykpO1xuICAgIGlmICh0b2tlbi50eXBlID09PSAnYmxvY2stc2VxJykge1xuICAgICAgICBjb25zdCB7IGFuY2hvciwgbmV3bGluZUFmdGVyUHJvcDogbmwgfSA9IHByb3BzO1xuICAgICAgICBjb25zdCBsYXN0UHJvcCA9IGFuY2hvciAmJiB0YWdUb2tlblxuICAgICAgICAgICAgPyBhbmNob3Iub2Zmc2V0ID4gdGFnVG9rZW4ub2Zmc2V0XG4gICAgICAgICAgICAgICAgPyBhbmNob3JcbiAgICAgICAgICAgICAgICA6IHRhZ1Rva2VuXG4gICAgICAgICAgICA6IChhbmNob3IgPz8gdGFnVG9rZW4pO1xuICAgICAgICBpZiAobGFzdFByb3AgJiYgKCFubCB8fCBubC5vZmZzZXQgPCBsYXN0UHJvcC5vZmZzZXQpKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gJ01pc3NpbmcgbmV3bGluZSBhZnRlciBibG9jayBzZXF1ZW5jZSBwcm9wcyc7XG4gICAgICAgICAgICBvbkVycm9yKGxhc3RQcm9wLCAnTUlTU0lOR19DSEFSJywgbWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgZXhwVHlwZSA9IHRva2VuLnR5cGUgPT09ICdibG9jay1tYXAnXG4gICAgICAgID8gJ21hcCdcbiAgICAgICAgOiB0b2tlbi50eXBlID09PSAnYmxvY2stc2VxJ1xuICAgICAgICAgICAgPyAnc2VxJ1xuICAgICAgICAgICAgOiB0b2tlbi5zdGFydC5zb3VyY2UgPT09ICd7J1xuICAgICAgICAgICAgICAgID8gJ21hcCdcbiAgICAgICAgICAgICAgICA6ICdzZXEnO1xuICAgIC8vIHNob3J0Y3V0OiBjaGVjayBpZiBpdCdzIGEgZ2VuZXJpYyBZQU1MTWFwIG9yIFlBTUxTZXFcbiAgICAvLyBiZWZvcmUganVtcGluZyBpbnRvIHRoZSBjdXN0b20gdGFnIGxvZ2ljLlxuICAgIGlmICghdGFnVG9rZW4gfHxcbiAgICAgICAgIXRhZ05hbWUgfHxcbiAgICAgICAgdGFnTmFtZSA9PT0gJyEnIHx8XG4gICAgICAgICh0YWdOYW1lID09PSBZQU1MTWFwLnRhZ05hbWUgJiYgZXhwVHlwZSA9PT0gJ21hcCcpIHx8XG4gICAgICAgICh0YWdOYW1lID09PSBZQU1MU2VxLnRhZ05hbWUgJiYgZXhwVHlwZSA9PT0gJ3NlcScpKSB7XG4gICAgICAgIHJldHVybiByZXNvbHZlQ29sbGVjdGlvbihDTiwgY3R4LCB0b2tlbiwgb25FcnJvciwgdGFnTmFtZSk7XG4gICAgfVxuICAgIGxldCB0YWcgPSBjdHguc2NoZW1hLnRhZ3MuZmluZCh0ID0+IHQudGFnID09PSB0YWdOYW1lICYmIHQuY29sbGVjdGlvbiA9PT0gZXhwVHlwZSk7XG4gICAgaWYgKCF0YWcpIHtcbiAgICAgICAgY29uc3Qga3QgPSBjdHguc2NoZW1hLmtub3duVGFnc1t0YWdOYW1lXTtcbiAgICAgICAgaWYgKGt0Py5jb2xsZWN0aW9uID09PSBleHBUeXBlKSB7XG4gICAgICAgICAgICBjdHguc2NoZW1hLnRhZ3MucHVzaChPYmplY3QuYXNzaWduKHt9LCBrdCwgeyBkZWZhdWx0OiBmYWxzZSB9KSk7XG4gICAgICAgICAgICB0YWcgPSBrdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChrdCkge1xuICAgICAgICAgICAgICAgIG9uRXJyb3IodGFnVG9rZW4sICdCQURfQ09MTEVDVElPTl9UWVBFJywgYCR7a3QudGFnfSB1c2VkIGZvciAke2V4cFR5cGV9IGNvbGxlY3Rpb24sIGJ1dCBleHBlY3RzICR7a3QuY29sbGVjdGlvbiA/PyAnc2NhbGFyJ31gLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG9uRXJyb3IodGFnVG9rZW4sICdUQUdfUkVTT0xWRV9GQUlMRUQnLCBgVW5yZXNvbHZlZCB0YWc6ICR7dGFnTmFtZX1gLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlQ29sbGVjdGlvbihDTiwgY3R4LCB0b2tlbiwgb25FcnJvciwgdGFnTmFtZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgY29sbCA9IHJlc29sdmVDb2xsZWN0aW9uKENOLCBjdHgsIHRva2VuLCBvbkVycm9yLCB0YWdOYW1lLCB0YWcpO1xuICAgIGNvbnN0IHJlcyA9IHRhZy5yZXNvbHZlPy4oY29sbCwgbXNnID0+IG9uRXJyb3IodGFnVG9rZW4sICdUQUdfUkVTT0xWRV9GQUlMRUQnLCBtc2cpLCBjdHgub3B0aW9ucykgPz8gY29sbDtcbiAgICBjb25zdCBub2RlID0gaXNOb2RlKHJlcylcbiAgICAgICAgPyByZXNcbiAgICAgICAgOiBuZXcgU2NhbGFyKHJlcyk7XG4gICAgbm9kZS5yYW5nZSA9IGNvbGwucmFuZ2U7XG4gICAgbm9kZS50YWcgPSB0YWdOYW1lO1xuICAgIGlmICh0YWc/LmZvcm1hdClcbiAgICAgICAgbm9kZS5mb3JtYXQgPSB0YWcuZm9ybWF0O1xuICAgIHJldHVybiBub2RlO1xufVxuXG5leHBvcnQgeyBjb21wb3NlQ29sbGVjdGlvbiB9O1xuIiwiaW1wb3J0IHsgU2NhbGFyIH0gZnJvbSAnLi4vbm9kZXMvU2NhbGFyLmpzJztcblxuZnVuY3Rpb24gcmVzb2x2ZUJsb2NrU2NhbGFyKGN0eCwgc2NhbGFyLCBvbkVycm9yKSB7XG4gICAgY29uc3Qgc3RhcnQgPSBzY2FsYXIub2Zmc2V0O1xuICAgIGNvbnN0IGhlYWRlciA9IHBhcnNlQmxvY2tTY2FsYXJIZWFkZXIoc2NhbGFyLCBjdHgub3B0aW9ucy5zdHJpY3QsIG9uRXJyb3IpO1xuICAgIGlmICghaGVhZGVyKVxuICAgICAgICByZXR1cm4geyB2YWx1ZTogJycsIHR5cGU6IG51bGwsIGNvbW1lbnQ6ICcnLCByYW5nZTogW3N0YXJ0LCBzdGFydCwgc3RhcnRdIH07XG4gICAgY29uc3QgdHlwZSA9IGhlYWRlci5tb2RlID09PSAnPicgPyBTY2FsYXIuQkxPQ0tfRk9MREVEIDogU2NhbGFyLkJMT0NLX0xJVEVSQUw7XG4gICAgY29uc3QgbGluZXMgPSBzY2FsYXIuc291cmNlID8gc3BsaXRMaW5lcyhzY2FsYXIuc291cmNlKSA6IFtdO1xuICAgIC8vIGRldGVybWluZSB0aGUgZW5kIG9mIGNvbnRlbnQgJiBzdGFydCBvZiBjaG9tcGluZ1xuICAgIGxldCBjaG9tcFN0YXJ0ID0gbGluZXMubGVuZ3RoO1xuICAgIGZvciAobGV0IGkgPSBsaW5lcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gbGluZXNbaV1bMV07XG4gICAgICAgIGlmIChjb250ZW50ID09PSAnJyB8fCBjb250ZW50ID09PSAnXFxyJylcbiAgICAgICAgICAgIGNob21wU3RhcnQgPSBpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG4gICAgLy8gc2hvcnRjdXQgZm9yIGVtcHR5IGNvbnRlbnRzXG4gICAgaWYgKGNob21wU3RhcnQgPT09IDApIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBoZWFkZXIuY2hvbXAgPT09ICcrJyAmJiBsaW5lcy5sZW5ndGggPiAwXG4gICAgICAgICAgICA/ICdcXG4nLnJlcGVhdChNYXRoLm1heCgxLCBsaW5lcy5sZW5ndGggLSAxKSlcbiAgICAgICAgICAgIDogJyc7XG4gICAgICAgIGxldCBlbmQgPSBzdGFydCArIGhlYWRlci5sZW5ndGg7XG4gICAgICAgIGlmIChzY2FsYXIuc291cmNlKVxuICAgICAgICAgICAgZW5kICs9IHNjYWxhci5zb3VyY2UubGVuZ3RoO1xuICAgICAgICByZXR1cm4geyB2YWx1ZSwgdHlwZSwgY29tbWVudDogaGVhZGVyLmNvbW1lbnQsIHJhbmdlOiBbc3RhcnQsIGVuZCwgZW5kXSB9O1xuICAgIH1cbiAgICAvLyBmaW5kIHRoZSBpbmRlbnRhdGlvbiBsZXZlbCB0byB0cmltIGZyb20gc3RhcnRcbiAgICBsZXQgdHJpbUluZGVudCA9IHNjYWxhci5pbmRlbnQgKyBoZWFkZXIuaW5kZW50O1xuICAgIGxldCBvZmZzZXQgPSBzY2FsYXIub2Zmc2V0ICsgaGVhZGVyLmxlbmd0aDtcbiAgICBsZXQgY29udGVudFN0YXJ0ID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNob21wU3RhcnQ7ICsraSkge1xuICAgICAgICBjb25zdCBbaW5kZW50LCBjb250ZW50XSA9IGxpbmVzW2ldO1xuICAgICAgICBpZiAoY29udGVudCA9PT0gJycgfHwgY29udGVudCA9PT0gJ1xccicpIHtcbiAgICAgICAgICAgIGlmIChoZWFkZXIuaW5kZW50ID09PSAwICYmIGluZGVudC5sZW5ndGggPiB0cmltSW5kZW50KVxuICAgICAgICAgICAgICAgIHRyaW1JbmRlbnQgPSBpbmRlbnQubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGluZGVudC5sZW5ndGggPCB0cmltSW5kZW50KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9ICdCbG9jayBzY2FsYXJzIHdpdGggbW9yZS1pbmRlbnRlZCBsZWFkaW5nIGVtcHR5IGxpbmVzIG11c3QgdXNlIGFuIGV4cGxpY2l0IGluZGVudGF0aW9uIGluZGljYXRvcic7XG4gICAgICAgICAgICAgICAgb25FcnJvcihvZmZzZXQgKyBpbmRlbnQubGVuZ3RoLCAnTUlTU0lOR19DSEFSJywgbWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaGVhZGVyLmluZGVudCA9PT0gMClcbiAgICAgICAgICAgICAgICB0cmltSW5kZW50ID0gaW5kZW50Lmxlbmd0aDtcbiAgICAgICAgICAgIGNvbnRlbnRTdGFydCA9IGk7XG4gICAgICAgICAgICBpZiAodHJpbUluZGVudCA9PT0gMCAmJiAhY3R4LmF0Um9vdCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSAnQmxvY2sgc2NhbGFyIHZhbHVlcyBpbiBjb2xsZWN0aW9ucyBtdXN0IGJlIGluZGVudGVkJztcbiAgICAgICAgICAgICAgICBvbkVycm9yKG9mZnNldCwgJ0JBRF9JTkRFTlQnLCBtZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIG9mZnNldCArPSBpbmRlbnQubGVuZ3RoICsgY29udGVudC5sZW5ndGggKyAxO1xuICAgIH1cbiAgICAvLyBpbmNsdWRlIHRyYWlsaW5nIG1vcmUtaW5kZW50ZWQgZW1wdHkgbGluZXMgaW4gY29udGVudFxuICAgIGZvciAobGV0IGkgPSBsaW5lcy5sZW5ndGggLSAxOyBpID49IGNob21wU3RhcnQ7IC0taSkge1xuICAgICAgICBpZiAobGluZXNbaV1bMF0ubGVuZ3RoID4gdHJpbUluZGVudClcbiAgICAgICAgICAgIGNob21wU3RhcnQgPSBpICsgMTtcbiAgICB9XG4gICAgbGV0IHZhbHVlID0gJyc7XG4gICAgbGV0IHNlcCA9ICcnO1xuICAgIGxldCBwcmV2TW9yZUluZGVudGVkID0gZmFsc2U7XG4gICAgLy8gbGVhZGluZyB3aGl0ZXNwYWNlIGlzIGtlcHQgaW50YWN0XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb250ZW50U3RhcnQ7ICsraSlcbiAgICAgICAgdmFsdWUgKz0gbGluZXNbaV1bMF0uc2xpY2UodHJpbUluZGVudCkgKyAnXFxuJztcbiAgICBmb3IgKGxldCBpID0gY29udGVudFN0YXJ0OyBpIDwgY2hvbXBTdGFydDsgKytpKSB7XG4gICAgICAgIGxldCBbaW5kZW50LCBjb250ZW50XSA9IGxpbmVzW2ldO1xuICAgICAgICBvZmZzZXQgKz0gaW5kZW50Lmxlbmd0aCArIGNvbnRlbnQubGVuZ3RoICsgMTtcbiAgICAgICAgY29uc3QgY3JsZiA9IGNvbnRlbnRbY29udGVudC5sZW5ndGggLSAxXSA9PT0gJ1xccic7XG4gICAgICAgIGlmIChjcmxmKVxuICAgICAgICAgICAgY29udGVudCA9IGNvbnRlbnQuc2xpY2UoMCwgLTEpO1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgYWxyZWFkeSBjYXVnaHQgaW4gbGV4ZXIgKi9cbiAgICAgICAgaWYgKGNvbnRlbnQgJiYgaW5kZW50Lmxlbmd0aCA8IHRyaW1JbmRlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IHNyYyA9IGhlYWRlci5pbmRlbnRcbiAgICAgICAgICAgICAgICA/ICdleHBsaWNpdCBpbmRlbnRhdGlvbiBpbmRpY2F0b3InXG4gICAgICAgICAgICAgICAgOiAnZmlyc3QgbGluZSc7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gYEJsb2NrIHNjYWxhciBsaW5lcyBtdXN0IG5vdCBiZSBsZXNzIGluZGVudGVkIHRoYW4gdGhlaXIgJHtzcmN9YDtcbiAgICAgICAgICAgIG9uRXJyb3Iob2Zmc2V0IC0gY29udGVudC5sZW5ndGggLSAoY3JsZiA/IDIgOiAxKSwgJ0JBRF9JTkRFTlQnLCBtZXNzYWdlKTtcbiAgICAgICAgICAgIGluZGVudCA9ICcnO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlID09PSBTY2FsYXIuQkxPQ0tfTElURVJBTCkge1xuICAgICAgICAgICAgdmFsdWUgKz0gc2VwICsgaW5kZW50LnNsaWNlKHRyaW1JbmRlbnQpICsgY29udGVudDtcbiAgICAgICAgICAgIHNlcCA9ICdcXG4nO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGluZGVudC5sZW5ndGggPiB0cmltSW5kZW50IHx8IGNvbnRlbnRbMF0gPT09ICdcXHQnKSB7XG4gICAgICAgICAgICAvLyBtb3JlLWluZGVudGVkIGNvbnRlbnQgd2l0aGluIGEgZm9sZGVkIGJsb2NrXG4gICAgICAgICAgICBpZiAoc2VwID09PSAnICcpXG4gICAgICAgICAgICAgICAgc2VwID0gJ1xcbic7XG4gICAgICAgICAgICBlbHNlIGlmICghcHJldk1vcmVJbmRlbnRlZCAmJiBzZXAgPT09ICdcXG4nKVxuICAgICAgICAgICAgICAgIHNlcCA9ICdcXG5cXG4nO1xuICAgICAgICAgICAgdmFsdWUgKz0gc2VwICsgaW5kZW50LnNsaWNlKHRyaW1JbmRlbnQpICsgY29udGVudDtcbiAgICAgICAgICAgIHNlcCA9ICdcXG4nO1xuICAgICAgICAgICAgcHJldk1vcmVJbmRlbnRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY29udGVudCA9PT0gJycpIHtcbiAgICAgICAgICAgIC8vIGVtcHR5IGxpbmVcbiAgICAgICAgICAgIGlmIChzZXAgPT09ICdcXG4nKVxuICAgICAgICAgICAgICAgIHZhbHVlICs9ICdcXG4nO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHNlcCA9ICdcXG4nO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFsdWUgKz0gc2VwICsgY29udGVudDtcbiAgICAgICAgICAgIHNlcCA9ICcgJztcbiAgICAgICAgICAgIHByZXZNb3JlSW5kZW50ZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzd2l0Y2ggKGhlYWRlci5jaG9tcCkge1xuICAgICAgICBjYXNlICctJzpcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICcrJzpcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBjaG9tcFN0YXJ0OyBpIDwgbGluZXMubGVuZ3RoOyArK2kpXG4gICAgICAgICAgICAgICAgdmFsdWUgKz0gJ1xcbicgKyBsaW5lc1tpXVswXS5zbGljZSh0cmltSW5kZW50KTtcbiAgICAgICAgICAgIGlmICh2YWx1ZVt2YWx1ZS5sZW5ndGggLSAxXSAhPT0gJ1xcbicpXG4gICAgICAgICAgICAgICAgdmFsdWUgKz0gJ1xcbic7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHZhbHVlICs9ICdcXG4nO1xuICAgIH1cbiAgICBjb25zdCBlbmQgPSBzdGFydCArIGhlYWRlci5sZW5ndGggKyBzY2FsYXIuc291cmNlLmxlbmd0aDtcbiAgICByZXR1cm4geyB2YWx1ZSwgdHlwZSwgY29tbWVudDogaGVhZGVyLmNvbW1lbnQsIHJhbmdlOiBbc3RhcnQsIGVuZCwgZW5kXSB9O1xufVxuZnVuY3Rpb24gcGFyc2VCbG9ja1NjYWxhckhlYWRlcih7IG9mZnNldCwgcHJvcHMgfSwgc3RyaWN0LCBvbkVycm9yKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmIHNob3VsZCBub3QgaGFwcGVuICovXG4gICAgaWYgKHByb3BzWzBdLnR5cGUgIT09ICdibG9jay1zY2FsYXItaGVhZGVyJykge1xuICAgICAgICBvbkVycm9yKHByb3BzWzBdLCAnSU1QT1NTSUJMRScsICdCbG9jayBzY2FsYXIgaGVhZGVyIG5vdCBmb3VuZCcpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgeyBzb3VyY2UgfSA9IHByb3BzWzBdO1xuICAgIGNvbnN0IG1vZGUgPSBzb3VyY2VbMF07XG4gICAgbGV0IGluZGVudCA9IDA7XG4gICAgbGV0IGNob21wID0gJyc7XG4gICAgbGV0IGVycm9yID0gLTE7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzb3VyY2UubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY29uc3QgY2ggPSBzb3VyY2VbaV07XG4gICAgICAgIGlmICghY2hvbXAgJiYgKGNoID09PSAnLScgfHwgY2ggPT09ICcrJykpXG4gICAgICAgICAgICBjaG9tcCA9IGNoO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSBOdW1iZXIoY2gpO1xuICAgICAgICAgICAgaWYgKCFpbmRlbnQgJiYgbilcbiAgICAgICAgICAgICAgICBpbmRlbnQgPSBuO1xuICAgICAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09IC0xKVxuICAgICAgICAgICAgICAgIGVycm9yID0gb2Zmc2V0ICsgaTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoZXJyb3IgIT09IC0xKVxuICAgICAgICBvbkVycm9yKGVycm9yLCAnVU5FWFBFQ1RFRF9UT0tFTicsIGBCbG9jayBzY2FsYXIgaGVhZGVyIGluY2x1ZGVzIGV4dHJhIGNoYXJhY3RlcnM6ICR7c291cmNlfWApO1xuICAgIGxldCBoYXNTcGFjZSA9IGZhbHNlO1xuICAgIGxldCBjb21tZW50ID0gJyc7XG4gICAgbGV0IGxlbmd0aCA9IHNvdXJjZS5sZW5ndGg7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBwcm9wcy5sZW5ndGg7ICsraSkge1xuICAgICAgICBjb25zdCB0b2tlbiA9IHByb3BzW2ldO1xuICAgICAgICBzd2l0Y2ggKHRva2VuLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ3NwYWNlJzpcbiAgICAgICAgICAgICAgICBoYXNTcGFjZSA9IHRydWU7XG4gICAgICAgICAgICAvLyBmYWxsdGhyb3VnaFxuICAgICAgICAgICAgY2FzZSAnbmV3bGluZSc6XG4gICAgICAgICAgICAgICAgbGVuZ3RoICs9IHRva2VuLnNvdXJjZS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdjb21tZW50JzpcbiAgICAgICAgICAgICAgICBpZiAoc3RyaWN0ICYmICFoYXNTcGFjZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gJ0NvbW1lbnRzIG11c3QgYmUgc2VwYXJhdGVkIGZyb20gb3RoZXIgdG9rZW5zIGJ5IHdoaXRlIHNwYWNlIGNoYXJhY3RlcnMnO1xuICAgICAgICAgICAgICAgICAgICBvbkVycm9yKHRva2VuLCAnTUlTU0lOR19DSEFSJywgbWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxlbmd0aCArPSB0b2tlbi5zb3VyY2UubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGNvbW1lbnQgPSB0b2tlbi5zb3VyY2Uuc3Vic3RyaW5nKDEpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZXJyb3InOlxuICAgICAgICAgICAgICAgIG9uRXJyb3IodG9rZW4sICdVTkVYUEVDVEVEX1RPS0VOJywgdG9rZW4ubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgbGVuZ3RoICs9IHRva2VuLnNvdXJjZS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCBzaG91bGQgbm90IGhhcHBlbiAqL1xuICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBgVW5leHBlY3RlZCB0b2tlbiBpbiBibG9jayBzY2FsYXIgaGVhZGVyOiAke3Rva2VuLnR5cGV9YDtcbiAgICAgICAgICAgICAgICBvbkVycm9yKHRva2VuLCAnVU5FWFBFQ1RFRF9UT0tFTicsIG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRzID0gdG9rZW4uc291cmNlO1xuICAgICAgICAgICAgICAgIGlmICh0cyAmJiB0eXBlb2YgdHMgPT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgICAgICAgICBsZW5ndGggKz0gdHMubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IG1vZGUsIGluZGVudCwgY2hvbXAsIGNvbW1lbnQsIGxlbmd0aCB9O1xufVxuLyoqIEByZXR1cm5zIEFycmF5IG9mIGxpbmVzIHNwbGl0IHVwIGFzIGBbaW5kZW50LCBjb250ZW50XWAgKi9cbmZ1bmN0aW9uIHNwbGl0TGluZXMoc291cmNlKSB7XG4gICAgY29uc3Qgc3BsaXQgPSBzb3VyY2Uuc3BsaXQoL1xcbiggKikvKTtcbiAgICBjb25zdCBmaXJzdCA9IHNwbGl0WzBdO1xuICAgIGNvbnN0IG0gPSBmaXJzdC5tYXRjaCgvXiggKikvKTtcbiAgICBjb25zdCBsaW5lMCA9IG0/LlsxXVxuICAgICAgICA/IFttWzFdLCBmaXJzdC5zbGljZShtWzFdLmxlbmd0aCldXG4gICAgICAgIDogWycnLCBmaXJzdF07XG4gICAgY29uc3QgbGluZXMgPSBbbGluZTBdO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgc3BsaXQubGVuZ3RoOyBpICs9IDIpXG4gICAgICAgIGxpbmVzLnB1c2goW3NwbGl0W2ldLCBzcGxpdFtpICsgMV1dKTtcbiAgICByZXR1cm4gbGluZXM7XG59XG5cbmV4cG9ydCB7IHJlc29sdmVCbG9ja1NjYWxhciB9O1xuIiwiaW1wb3J0IHsgU2NhbGFyIH0gZnJvbSAnLi4vbm9kZXMvU2NhbGFyLmpzJztcbmltcG9ydCB7IHJlc29sdmVFbmQgfSBmcm9tICcuL3Jlc29sdmUtZW5kLmpzJztcblxuZnVuY3Rpb24gcmVzb2x2ZUZsb3dTY2FsYXIoc2NhbGFyLCBzdHJpY3QsIG9uRXJyb3IpIHtcbiAgICBjb25zdCB7IG9mZnNldCwgdHlwZSwgc291cmNlLCBlbmQgfSA9IHNjYWxhcjtcbiAgICBsZXQgX3R5cGU7XG4gICAgbGV0IHZhbHVlO1xuICAgIGNvbnN0IF9vbkVycm9yID0gKHJlbCwgY29kZSwgbXNnKSA9PiBvbkVycm9yKG9mZnNldCArIHJlbCwgY29kZSwgbXNnKTtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgY2FzZSAnc2NhbGFyJzpcbiAgICAgICAgICAgIF90eXBlID0gU2NhbGFyLlBMQUlOO1xuICAgICAgICAgICAgdmFsdWUgPSBwbGFpblZhbHVlKHNvdXJjZSwgX29uRXJyb3IpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3NpbmdsZS1xdW90ZWQtc2NhbGFyJzpcbiAgICAgICAgICAgIF90eXBlID0gU2NhbGFyLlFVT1RFX1NJTkdMRTtcbiAgICAgICAgICAgIHZhbHVlID0gc2luZ2xlUXVvdGVkVmFsdWUoc291cmNlLCBfb25FcnJvcik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnZG91YmxlLXF1b3RlZC1zY2FsYXInOlxuICAgICAgICAgICAgX3R5cGUgPSBTY2FsYXIuUVVPVEVfRE9VQkxFO1xuICAgICAgICAgICAgdmFsdWUgPSBkb3VibGVRdW90ZWRWYWx1ZShzb3VyY2UsIF9vbkVycm9yKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCBzaG91bGQgbm90IGhhcHBlbiAqL1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgb25FcnJvcihzY2FsYXIsICdVTkVYUEVDVEVEX1RPS0VOJywgYEV4cGVjdGVkIGEgZmxvdyBzY2FsYXIgdmFsdWUsIGJ1dCBmb3VuZDogJHt0eXBlfWApO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogJycsXG4gICAgICAgICAgICAgICAgdHlwZTogbnVsbCxcbiAgICAgICAgICAgICAgICBjb21tZW50OiAnJyxcbiAgICAgICAgICAgICAgICByYW5nZTogW29mZnNldCwgb2Zmc2V0ICsgc291cmNlLmxlbmd0aCwgb2Zmc2V0ICsgc291cmNlLmxlbmd0aF1cbiAgICAgICAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlRW5kID0gb2Zmc2V0ICsgc291cmNlLmxlbmd0aDtcbiAgICBjb25zdCByZSA9IHJlc29sdmVFbmQoZW5kLCB2YWx1ZUVuZCwgc3RyaWN0LCBvbkVycm9yKTtcbiAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZSxcbiAgICAgICAgdHlwZTogX3R5cGUsXG4gICAgICAgIGNvbW1lbnQ6IHJlLmNvbW1lbnQsXG4gICAgICAgIHJhbmdlOiBbb2Zmc2V0LCB2YWx1ZUVuZCwgcmUub2Zmc2V0XVxuICAgIH07XG59XG5mdW5jdGlvbiBwbGFpblZhbHVlKHNvdXJjZSwgb25FcnJvcikge1xuICAgIGxldCBiYWRDaGFyID0gJyc7XG4gICAgc3dpdGNoIChzb3VyY2VbMF0pIHtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgc2hvdWxkIG5vdCBoYXBwZW4gKi9cbiAgICAgICAgY2FzZSAnXFx0JzpcbiAgICAgICAgICAgIGJhZENoYXIgPSAnYSB0YWIgY2hhcmFjdGVyJztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICcsJzpcbiAgICAgICAgICAgIGJhZENoYXIgPSAnZmxvdyBpbmRpY2F0b3IgY2hhcmFjdGVyICwnO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJyUnOlxuICAgICAgICAgICAgYmFkQ2hhciA9ICdkaXJlY3RpdmUgaW5kaWNhdG9yIGNoYXJhY3RlciAlJztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICd8JzpcbiAgICAgICAgY2FzZSAnPic6IHtcbiAgICAgICAgICAgIGJhZENoYXIgPSBgYmxvY2sgc2NhbGFyIGluZGljYXRvciAke3NvdXJjZVswXX1gO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnQCc6XG4gICAgICAgIGNhc2UgJ2AnOiB7XG4gICAgICAgICAgICBiYWRDaGFyID0gYHJlc2VydmVkIGNoYXJhY3RlciAke3NvdXJjZVswXX1gO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGJhZENoYXIpXG4gICAgICAgIG9uRXJyb3IoMCwgJ0JBRF9TQ0FMQVJfU1RBUlQnLCBgUGxhaW4gdmFsdWUgY2Fubm90IHN0YXJ0IHdpdGggJHtiYWRDaGFyfWApO1xuICAgIHJldHVybiB1bmZvbGRMaW5lcyhzb3VyY2UpO1xufVxuZnVuY3Rpb24gc2luZ2xlUXVvdGVkVmFsdWUoc291cmNlLCBvbkVycm9yKSB7XG4gICAgaWYgKHNvdXJjZVtzb3VyY2UubGVuZ3RoIC0gMV0gIT09IFwiJ1wiIHx8IHNvdXJjZS5sZW5ndGggPT09IDEpXG4gICAgICAgIG9uRXJyb3Ioc291cmNlLmxlbmd0aCwgJ01JU1NJTkdfQ0hBUicsIFwiTWlzc2luZyBjbG9zaW5nICdxdW90ZVwiKTtcbiAgICByZXR1cm4gdW5mb2xkTGluZXMoc291cmNlLnNsaWNlKDEsIC0xKSkucmVwbGFjZSgvJycvZywgXCInXCIpO1xufVxuZnVuY3Rpb24gdW5mb2xkTGluZXMoc291cmNlKSB7XG4gICAgY29uc3QgbGluZSA9IC8oLio/KVxccj9cXG4vc3k7XG4gICAgbGV0IG1hdGNoID0gbGluZS5leGVjKHNvdXJjZSk7XG4gICAgaWYgKCFtYXRjaClcbiAgICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICAvKipcbiAgICAgKiBUaGUgbmVnYXRpdmUgbG9va2JlaGluZHMgaW4gdGhlc2UgUmVnRXhwcyBhcmUgdG9cbiAgICAgKiBwcmV2ZW50IGNhdXNpbmcgYSBwb2x5bm9taWFsIHNlYXJjaCB0aW1lIGluIGNlcnRhaW4gY2FzZXMuXG4gICAgICpcbiAgICAgKiBUaGUgdHJ5LWNhdGNoIGlzIGZvciBTYWZhcmkgPCAxNi40IGFuZCBvdGhlciBvbGQgYnJvd3NlcnM6XG4gICAgICogaHR0cHM6Ly9jYW5pdXNlLmNvbS9qcy1yZWdleHAtbG9va2JlaGluZFxuICAgICAqL1xuICAgIGxldCB0cmltRW5kLCB0cmltQm90aDtcbiAgICB0cnkge1xuICAgICAgICB0cmltRW5kID0gbmV3IFJlZ0V4cCgnKD88IVsgXFx0XSlbIFxcdF0rJCcpO1xuICAgICAgICB0cmltQm90aCA9IG5ldyBSZWdFeHAoJ15bIFxcdF0rfCg/PCFbIFxcdF0pWyBcXHRdKyQnLCAnZycpO1xuICAgIH1cbiAgICBjYXRjaCB7XG4gICAgICAgIHRyaW1FbmQgPSAvWyBcXHRdKyQvO1xuICAgICAgICB0cmltQm90aCA9IC9eWyBcXHRdK3xbIFxcdF0rJC9nO1xuICAgIH1cbiAgICBsZXQgcmVzID0gbWF0Y2hbMV0ucmVwbGFjZSh0cmltRW5kLCAnJyk7XG4gICAgbGV0IHNlcCA9ICcgJztcbiAgICBsZXQgcG9zID0gbGluZS5sYXN0SW5kZXg7XG4gICAgd2hpbGUgKChtYXRjaCA9IGxpbmUuZXhlYyhzb3VyY2UpKSkge1xuICAgICAgICBjb25zdCBsbSA9IG1hdGNoWzFdLnJlcGxhY2UodHJpbUJvdGgsICcnKTtcbiAgICAgICAgaWYgKGxtID09PSAnJykge1xuICAgICAgICAgICAgaWYgKHNlcCA9PT0gJ1xcbicpXG4gICAgICAgICAgICAgICAgcmVzICs9IHNlcDtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBzZXAgPSAnXFxuJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlcyArPSBzZXAgKyBsbTtcbiAgICAgICAgICAgIHNlcCA9ICcgJztcbiAgICAgICAgfVxuICAgICAgICBwb3MgPSBsaW5lLmxhc3RJbmRleDtcbiAgICB9XG4gICAgY29uc3QgbGFzdCA9IC9bIFxcdF0qKC4qKS9zeTtcbiAgICBsYXN0Lmxhc3RJbmRleCA9IHBvcztcbiAgICBtYXRjaCA9IGxhc3QuZXhlYyhzb3VyY2UpO1xuICAgIHJldHVybiByZXMgKyBzZXAgKyAobWF0Y2g/LlsxXSA/PyAnJyk7XG59XG5mdW5jdGlvbiBkb3VibGVRdW90ZWRWYWx1ZShzb3VyY2UsIG9uRXJyb3IpIHtcbiAgICBsZXQgcmVzID0gJyc7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzb3VyY2UubGVuZ3RoIC0gMTsgKytpKSB7XG4gICAgICAgIGNvbnN0IGNoID0gc291cmNlW2ldO1xuICAgICAgICBpZiAoY2ggPT09ICdcXHInICYmIHNvdXJjZVtpICsgMV0gPT09ICdcXG4nKVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIGlmIChjaCA9PT0gJ1xcbicpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgZm9sZCwgb2Zmc2V0IH0gPSBmb2xkTmV3bGluZShzb3VyY2UsIGkpO1xuICAgICAgICAgICAgcmVzICs9IGZvbGQ7XG4gICAgICAgICAgICBpID0gb2Zmc2V0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNoID09PSAnXFxcXCcpIHtcbiAgICAgICAgICAgIGxldCBuZXh0ID0gc291cmNlWysraV07XG4gICAgICAgICAgICBjb25zdCBjYyA9IGVzY2FwZUNvZGVzW25leHRdO1xuICAgICAgICAgICAgaWYgKGNjKVxuICAgICAgICAgICAgICAgIHJlcyArPSBjYztcbiAgICAgICAgICAgIGVsc2UgaWYgKG5leHQgPT09ICdcXG4nKSB7XG4gICAgICAgICAgICAgICAgLy8gc2tpcCBlc2NhcGVkIG5ld2xpbmVzLCBidXQgc3RpbGwgdHJpbSB0aGUgZm9sbG93aW5nIGxpbmVcbiAgICAgICAgICAgICAgICBuZXh0ID0gc291cmNlW2kgKyAxXTtcbiAgICAgICAgICAgICAgICB3aGlsZSAobmV4dCA9PT0gJyAnIHx8IG5leHQgPT09ICdcXHQnKVxuICAgICAgICAgICAgICAgICAgICBuZXh0ID0gc291cmNlWysraSArIDFdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobmV4dCA9PT0gJ1xccicgJiYgc291cmNlW2kgKyAxXSA9PT0gJ1xcbicpIHtcbiAgICAgICAgICAgICAgICAvLyBza2lwIGVzY2FwZWQgQ1JMRiBuZXdsaW5lcywgYnV0IHN0aWxsIHRyaW0gdGhlIGZvbGxvd2luZyBsaW5lXG4gICAgICAgICAgICAgICAgbmV4dCA9IHNvdXJjZVsrK2kgKyAxXTtcbiAgICAgICAgICAgICAgICB3aGlsZSAobmV4dCA9PT0gJyAnIHx8IG5leHQgPT09ICdcXHQnKVxuICAgICAgICAgICAgICAgICAgICBuZXh0ID0gc291cmNlWysraSArIDFdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobmV4dCA9PT0gJ3gnIHx8IG5leHQgPT09ICd1JyB8fCBuZXh0ID09PSAnVScpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsZW5ndGggPSBuZXh0ID09PSAneCcgPyAyIDogbmV4dCA9PT0gJ3UnID8gNCA6IDg7XG4gICAgICAgICAgICAgICAgcmVzICs9IHBhcnNlQ2hhckNvZGUoc291cmNlLCBpICsgMSwgbGVuZ3RoLCBvbkVycm9yKTtcbiAgICAgICAgICAgICAgICBpICs9IGxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJhdyA9IHNvdXJjZS5zdWJzdHIoaSAtIDEsIDIpO1xuICAgICAgICAgICAgICAgIG9uRXJyb3IoaSAtIDEsICdCQURfRFFfRVNDQVBFJywgYEludmFsaWQgZXNjYXBlIHNlcXVlbmNlICR7cmF3fWApO1xuICAgICAgICAgICAgICAgIHJlcyArPSByYXc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY2ggPT09ICcgJyB8fCBjaCA9PT0gJ1xcdCcpIHtcbiAgICAgICAgICAgIC8vIHRyaW0gdHJhaWxpbmcgd2hpdGVzcGFjZVxuICAgICAgICAgICAgY29uc3Qgd3NTdGFydCA9IGk7XG4gICAgICAgICAgICBsZXQgbmV4dCA9IHNvdXJjZVtpICsgMV07XG4gICAgICAgICAgICB3aGlsZSAobmV4dCA9PT0gJyAnIHx8IG5leHQgPT09ICdcXHQnKVxuICAgICAgICAgICAgICAgIG5leHQgPSBzb3VyY2VbKytpICsgMV07XG4gICAgICAgICAgICBpZiAobmV4dCAhPT0gJ1xcbicgJiYgIShuZXh0ID09PSAnXFxyJyAmJiBzb3VyY2VbaSArIDJdID09PSAnXFxuJykpXG4gICAgICAgICAgICAgICAgcmVzICs9IGkgPiB3c1N0YXJ0ID8gc291cmNlLnNsaWNlKHdzU3RhcnQsIGkgKyAxKSA6IGNoO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVzICs9IGNoO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChzb3VyY2Vbc291cmNlLmxlbmd0aCAtIDFdICE9PSAnXCInIHx8IHNvdXJjZS5sZW5ndGggPT09IDEpXG4gICAgICAgIG9uRXJyb3Ioc291cmNlLmxlbmd0aCwgJ01JU1NJTkdfQ0hBUicsICdNaXNzaW5nIGNsb3NpbmcgXCJxdW90ZScpO1xuICAgIHJldHVybiByZXM7XG59XG4vKipcbiAqIEZvbGQgYSBzaW5nbGUgbmV3bGluZSBpbnRvIGEgc3BhY2UsIG11bHRpcGxlIG5ld2xpbmVzIHRvIE4gLSAxIG5ld2xpbmVzLlxuICogUHJlc3VtZXMgYHNvdXJjZVtvZmZzZXRdID09PSAnXFxuJ2BcbiAqL1xuZnVuY3Rpb24gZm9sZE5ld2xpbmUoc291cmNlLCBvZmZzZXQpIHtcbiAgICBsZXQgZm9sZCA9ICcnO1xuICAgIGxldCBjaCA9IHNvdXJjZVtvZmZzZXQgKyAxXTtcbiAgICB3aGlsZSAoY2ggPT09ICcgJyB8fCBjaCA9PT0gJ1xcdCcgfHwgY2ggPT09ICdcXG4nIHx8IGNoID09PSAnXFxyJykge1xuICAgICAgICBpZiAoY2ggPT09ICdcXHInICYmIHNvdXJjZVtvZmZzZXQgKyAyXSAhPT0gJ1xcbicpXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgaWYgKGNoID09PSAnXFxuJylcbiAgICAgICAgICAgIGZvbGQgKz0gJ1xcbic7XG4gICAgICAgIG9mZnNldCArPSAxO1xuICAgICAgICBjaCA9IHNvdXJjZVtvZmZzZXQgKyAxXTtcbiAgICB9XG4gICAgaWYgKCFmb2xkKVxuICAgICAgICBmb2xkID0gJyAnO1xuICAgIHJldHVybiB7IGZvbGQsIG9mZnNldCB9O1xufVxuY29uc3QgZXNjYXBlQ29kZXMgPSB7XG4gICAgJzAnOiAnXFwwJywgLy8gbnVsbCBjaGFyYWN0ZXJcbiAgICBhOiAnXFx4MDcnLCAvLyBiZWxsIGNoYXJhY3RlclxuICAgIGI6ICdcXGInLCAvLyBiYWNrc3BhY2VcbiAgICBlOiAnXFx4MWInLCAvLyBlc2NhcGUgY2hhcmFjdGVyXG4gICAgZjogJ1xcZicsIC8vIGZvcm0gZmVlZFxuICAgIG46ICdcXG4nLCAvLyBsaW5lIGZlZWRcbiAgICByOiAnXFxyJywgLy8gY2FycmlhZ2UgcmV0dXJuXG4gICAgdDogJ1xcdCcsIC8vIGhvcml6b250YWwgdGFiXG4gICAgdjogJ1xcdicsIC8vIHZlcnRpY2FsIHRhYlxuICAgIE46ICdcXHUwMDg1JywgLy8gVW5pY29kZSBuZXh0IGxpbmVcbiAgICBfOiAnXFx1MDBhMCcsIC8vIFVuaWNvZGUgbm9uLWJyZWFraW5nIHNwYWNlXG4gICAgTDogJ1xcdTIwMjgnLCAvLyBVbmljb2RlIGxpbmUgc2VwYXJhdG9yXG4gICAgUDogJ1xcdTIwMjknLCAvLyBVbmljb2RlIHBhcmFncmFwaCBzZXBhcmF0b3JcbiAgICAnICc6ICcgJyxcbiAgICAnXCInOiAnXCInLFxuICAgICcvJzogJy8nLFxuICAgICdcXFxcJzogJ1xcXFwnLFxuICAgICdcXHQnOiAnXFx0J1xufTtcbmZ1bmN0aW9uIHBhcnNlQ2hhckNvZGUoc291cmNlLCBvZmZzZXQsIGxlbmd0aCwgb25FcnJvcikge1xuICAgIGNvbnN0IGNjID0gc291cmNlLnN1YnN0cihvZmZzZXQsIGxlbmd0aCk7XG4gICAgY29uc3Qgb2sgPSBjYy5sZW5ndGggPT09IGxlbmd0aCAmJiAvXlswLTlhLWZBLUZdKyQvLnRlc3QoY2MpO1xuICAgIGNvbnN0IGNvZGUgPSBvayA/IHBhcnNlSW50KGNjLCAxNikgOiBOYU47XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ29kZVBvaW50KGNvZGUpO1xuICAgIH1cbiAgICBjYXRjaCB7XG4gICAgICAgIGNvbnN0IHJhdyA9IHNvdXJjZS5zdWJzdHIob2Zmc2V0IC0gMiwgbGVuZ3RoICsgMik7XG4gICAgICAgIG9uRXJyb3Iob2Zmc2V0IC0gMiwgJ0JBRF9EUV9FU0NBUEUnLCBgSW52YWxpZCBlc2NhcGUgc2VxdWVuY2UgJHtyYXd9YCk7XG4gICAgICAgIHJldHVybiByYXc7XG4gICAgfVxufVxuXG5leHBvcnQgeyByZXNvbHZlRmxvd1NjYWxhciB9O1xuIiwiaW1wb3J0IHsgaXNTY2FsYXIsIFNDQUxBUiB9IGZyb20gJy4uL25vZGVzL2lkZW50aXR5LmpzJztcbmltcG9ydCB7IFNjYWxhciB9IGZyb20gJy4uL25vZGVzL1NjYWxhci5qcyc7XG5pbXBvcnQgeyByZXNvbHZlQmxvY2tTY2FsYXIgfSBmcm9tICcuL3Jlc29sdmUtYmxvY2stc2NhbGFyLmpzJztcbmltcG9ydCB7IHJlc29sdmVGbG93U2NhbGFyIH0gZnJvbSAnLi9yZXNvbHZlLWZsb3ctc2NhbGFyLmpzJztcblxuZnVuY3Rpb24gY29tcG9zZVNjYWxhcihjdHgsIHRva2VuLCB0YWdUb2tlbiwgb25FcnJvcikge1xuICAgIGNvbnN0IHsgdmFsdWUsIHR5cGUsIGNvbW1lbnQsIHJhbmdlIH0gPSB0b2tlbi50eXBlID09PSAnYmxvY2stc2NhbGFyJ1xuICAgICAgICA/IHJlc29sdmVCbG9ja1NjYWxhcihjdHgsIHRva2VuLCBvbkVycm9yKVxuICAgICAgICA6IHJlc29sdmVGbG93U2NhbGFyKHRva2VuLCBjdHgub3B0aW9ucy5zdHJpY3QsIG9uRXJyb3IpO1xuICAgIGNvbnN0IHRhZ05hbWUgPSB0YWdUb2tlblxuICAgICAgICA/IGN0eC5kaXJlY3RpdmVzLnRhZ05hbWUodGFnVG9rZW4uc291cmNlLCBtc2cgPT4gb25FcnJvcih0YWdUb2tlbiwgJ1RBR19SRVNPTFZFX0ZBSUxFRCcsIG1zZykpXG4gICAgICAgIDogbnVsbDtcbiAgICBsZXQgdGFnO1xuICAgIGlmIChjdHgub3B0aW9ucy5zdHJpbmdLZXlzICYmIGN0eC5hdEtleSkge1xuICAgICAgICB0YWcgPSBjdHguc2NoZW1hW1NDQUxBUl07XG4gICAgfVxuICAgIGVsc2UgaWYgKHRhZ05hbWUpXG4gICAgICAgIHRhZyA9IGZpbmRTY2FsYXJUYWdCeU5hbWUoY3R4LnNjaGVtYSwgdmFsdWUsIHRhZ05hbWUsIHRhZ1Rva2VuLCBvbkVycm9yKTtcbiAgICBlbHNlIGlmICh0b2tlbi50eXBlID09PSAnc2NhbGFyJylcbiAgICAgICAgdGFnID0gZmluZFNjYWxhclRhZ0J5VGVzdChjdHgsIHZhbHVlLCB0b2tlbiwgb25FcnJvcik7XG4gICAgZWxzZVxuICAgICAgICB0YWcgPSBjdHguc2NoZW1hW1NDQUxBUl07XG4gICAgbGV0IHNjYWxhcjtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCByZXMgPSB0YWcucmVzb2x2ZSh2YWx1ZSwgbXNnID0+IG9uRXJyb3IodGFnVG9rZW4gPz8gdG9rZW4sICdUQUdfUkVTT0xWRV9GQUlMRUQnLCBtc2cpLCBjdHgub3B0aW9ucyk7XG4gICAgICAgIHNjYWxhciA9IGlzU2NhbGFyKHJlcykgPyByZXMgOiBuZXcgU2NhbGFyKHJlcyk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBtc2cgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgICAgIG9uRXJyb3IodGFnVG9rZW4gPz8gdG9rZW4sICdUQUdfUkVTT0xWRV9GQUlMRUQnLCBtc2cpO1xuICAgICAgICBzY2FsYXIgPSBuZXcgU2NhbGFyKHZhbHVlKTtcbiAgICB9XG4gICAgc2NhbGFyLnJhbmdlID0gcmFuZ2U7XG4gICAgc2NhbGFyLnNvdXJjZSA9IHZhbHVlO1xuICAgIGlmICh0eXBlKVxuICAgICAgICBzY2FsYXIudHlwZSA9IHR5cGU7XG4gICAgaWYgKHRhZ05hbWUpXG4gICAgICAgIHNjYWxhci50YWcgPSB0YWdOYW1lO1xuICAgIGlmICh0YWcuZm9ybWF0KVxuICAgICAgICBzY2FsYXIuZm9ybWF0ID0gdGFnLmZvcm1hdDtcbiAgICBpZiAoY29tbWVudClcbiAgICAgICAgc2NhbGFyLmNvbW1lbnQgPSBjb21tZW50O1xuICAgIHJldHVybiBzY2FsYXI7XG59XG5mdW5jdGlvbiBmaW5kU2NhbGFyVGFnQnlOYW1lKHNjaGVtYSwgdmFsdWUsIHRhZ05hbWUsIHRhZ1Rva2VuLCBvbkVycm9yKSB7XG4gICAgaWYgKHRhZ05hbWUgPT09ICchJylcbiAgICAgICAgcmV0dXJuIHNjaGVtYVtTQ0FMQVJdOyAvLyBub24tc3BlY2lmaWMgdGFnXG4gICAgY29uc3QgbWF0Y2hXaXRoVGVzdCA9IFtdO1xuICAgIGZvciAoY29uc3QgdGFnIG9mIHNjaGVtYS50YWdzKSB7XG4gICAgICAgIGlmICghdGFnLmNvbGxlY3Rpb24gJiYgdGFnLnRhZyA9PT0gdGFnTmFtZSkge1xuICAgICAgICAgICAgaWYgKHRhZy5kZWZhdWx0ICYmIHRhZy50ZXN0KVxuICAgICAgICAgICAgICAgIG1hdGNoV2l0aFRlc3QucHVzaCh0YWcpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiB0YWc7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCB0YWcgb2YgbWF0Y2hXaXRoVGVzdClcbiAgICAgICAgaWYgKHRhZy50ZXN0Py50ZXN0KHZhbHVlKSlcbiAgICAgICAgICAgIHJldHVybiB0YWc7XG4gICAgY29uc3Qga3QgPSBzY2hlbWEua25vd25UYWdzW3RhZ05hbWVdO1xuICAgIGlmIChrdCAmJiAha3QuY29sbGVjdGlvbikge1xuICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGUga25vd24gdGFnIGlzIGF2YWlsYWJsZSBmb3Igc3RyaW5naWZ5aW5nLFxuICAgICAgICAvLyBidXQgZG9lcyBub3QgZ2V0IHVzZWQgYnkgZGVmYXVsdC5cbiAgICAgICAgc2NoZW1hLnRhZ3MucHVzaChPYmplY3QuYXNzaWduKHt9LCBrdCwgeyBkZWZhdWx0OiBmYWxzZSwgdGVzdDogdW5kZWZpbmVkIH0pKTtcbiAgICAgICAgcmV0dXJuIGt0O1xuICAgIH1cbiAgICBvbkVycm9yKHRhZ1Rva2VuLCAnVEFHX1JFU09MVkVfRkFJTEVEJywgYFVucmVzb2x2ZWQgdGFnOiAke3RhZ05hbWV9YCwgdGFnTmFtZSAhPT0gJ3RhZzp5YW1sLm9yZywyMDAyOnN0cicpO1xuICAgIHJldHVybiBzY2hlbWFbU0NBTEFSXTtcbn1cbmZ1bmN0aW9uIGZpbmRTY2FsYXJUYWdCeVRlc3QoeyBhdEtleSwgZGlyZWN0aXZlcywgc2NoZW1hIH0sIHZhbHVlLCB0b2tlbiwgb25FcnJvcikge1xuICAgIGNvbnN0IHRhZyA9IHNjaGVtYS50YWdzLmZpbmQodGFnID0+ICh0YWcuZGVmYXVsdCA9PT0gdHJ1ZSB8fCAoYXRLZXkgJiYgdGFnLmRlZmF1bHQgPT09ICdrZXknKSkgJiZcbiAgICAgICAgdGFnLnRlc3Q/LnRlc3QodmFsdWUpKSB8fCBzY2hlbWFbU0NBTEFSXTtcbiAgICBpZiAoc2NoZW1hLmNvbXBhdCkge1xuICAgICAgICBjb25zdCBjb21wYXQgPSBzY2hlbWEuY29tcGF0LmZpbmQodGFnID0+IHRhZy5kZWZhdWx0ICYmIHRhZy50ZXN0Py50ZXN0KHZhbHVlKSkgPz9cbiAgICAgICAgICAgIHNjaGVtYVtTQ0FMQVJdO1xuICAgICAgICBpZiAodGFnLnRhZyAhPT0gY29tcGF0LnRhZykge1xuICAgICAgICAgICAgY29uc3QgdHMgPSBkaXJlY3RpdmVzLnRhZ1N0cmluZyh0YWcudGFnKTtcbiAgICAgICAgICAgIGNvbnN0IGNzID0gZGlyZWN0aXZlcy50YWdTdHJpbmcoY29tcGF0LnRhZyk7XG4gICAgICAgICAgICBjb25zdCBtc2cgPSBgVmFsdWUgbWF5IGJlIHBhcnNlZCBhcyBlaXRoZXIgJHt0c30gb3IgJHtjc31gO1xuICAgICAgICAgICAgb25FcnJvcih0b2tlbiwgJ1RBR19SRVNPTFZFX0ZBSUxFRCcsIG1zZywgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRhZztcbn1cblxuZXhwb3J0IHsgY29tcG9zZVNjYWxhciB9O1xuIiwiZnVuY3Rpb24gZW1wdHlTY2FsYXJQb3NpdGlvbihvZmZzZXQsIGJlZm9yZSwgcG9zKSB7XG4gICAgaWYgKGJlZm9yZSkge1xuICAgICAgICBwb3MgPz8gKHBvcyA9IGJlZm9yZS5sZW5ndGgpO1xuICAgICAgICBmb3IgKGxldCBpID0gcG9zIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgICAgIGxldCBzdCA9IGJlZm9yZVtpXTtcbiAgICAgICAgICAgIHN3aXRjaCAoc3QudHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ3NwYWNlJzpcbiAgICAgICAgICAgICAgICBjYXNlICdjb21tZW50JzpcbiAgICAgICAgICAgICAgICBjYXNlICduZXdsaW5lJzpcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0IC09IHN0LnNvdXJjZS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVGVjaG5pY2FsbHksIGFuIGVtcHR5IHNjYWxhciBpcyBpbW1lZGlhdGVseSBhZnRlciB0aGUgbGFzdCBub24tZW1wdHlcbiAgICAgICAgICAgIC8vIG5vZGUsIGJ1dCBpdCdzIG1vcmUgdXNlZnVsIHRvIHBsYWNlIGl0IGFmdGVyIGFueSB3aGl0ZXNwYWNlLlxuICAgICAgICAgICAgc3QgPSBiZWZvcmVbKytpXTtcbiAgICAgICAgICAgIHdoaWxlIChzdD8udHlwZSA9PT0gJ3NwYWNlJykge1xuICAgICAgICAgICAgICAgIG9mZnNldCArPSBzdC5zb3VyY2UubGVuZ3RoO1xuICAgICAgICAgICAgICAgIHN0ID0gYmVmb3JlWysraV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb2Zmc2V0O1xufVxuXG5leHBvcnQgeyBlbXB0eVNjYWxhclBvc2l0aW9uIH07XG4iLCJpbXBvcnQgeyBBbGlhcyB9IGZyb20gJy4uL25vZGVzL0FsaWFzLmpzJztcbmltcG9ydCB7IGlzU2NhbGFyIH0gZnJvbSAnLi4vbm9kZXMvaWRlbnRpdHkuanMnO1xuaW1wb3J0IHsgY29tcG9zZUNvbGxlY3Rpb24gfSBmcm9tICcuL2NvbXBvc2UtY29sbGVjdGlvbi5qcyc7XG5pbXBvcnQgeyBjb21wb3NlU2NhbGFyIH0gZnJvbSAnLi9jb21wb3NlLXNjYWxhci5qcyc7XG5pbXBvcnQgeyByZXNvbHZlRW5kIH0gZnJvbSAnLi9yZXNvbHZlLWVuZC5qcyc7XG5pbXBvcnQgeyBlbXB0eVNjYWxhclBvc2l0aW9uIH0gZnJvbSAnLi91dGlsLWVtcHR5LXNjYWxhci1wb3NpdGlvbi5qcyc7XG5cbmNvbnN0IENOID0geyBjb21wb3NlTm9kZSwgY29tcG9zZUVtcHR5Tm9kZSB9O1xuZnVuY3Rpb24gY29tcG9zZU5vZGUoY3R4LCB0b2tlbiwgcHJvcHMsIG9uRXJyb3IpIHtcbiAgICBjb25zdCBhdEtleSA9IGN0eC5hdEtleTtcbiAgICBjb25zdCB7IHNwYWNlQmVmb3JlLCBjb21tZW50LCBhbmNob3IsIHRhZyB9ID0gcHJvcHM7XG4gICAgbGV0IG5vZGU7XG4gICAgbGV0IGlzU3JjVG9rZW4gPSB0cnVlO1xuICAgIHN3aXRjaCAodG9rZW4udHlwZSkge1xuICAgICAgICBjYXNlICdhbGlhcyc6XG4gICAgICAgICAgICBub2RlID0gY29tcG9zZUFsaWFzKGN0eCwgdG9rZW4sIG9uRXJyb3IpO1xuICAgICAgICAgICAgaWYgKGFuY2hvciB8fCB0YWcpXG4gICAgICAgICAgICAgICAgb25FcnJvcih0b2tlbiwgJ0FMSUFTX1BST1BTJywgJ0FuIGFsaWFzIG5vZGUgbXVzdCBub3Qgc3BlY2lmeSBhbnkgcHJvcGVydGllcycpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3NjYWxhcic6XG4gICAgICAgIGNhc2UgJ3NpbmdsZS1xdW90ZWQtc2NhbGFyJzpcbiAgICAgICAgY2FzZSAnZG91YmxlLXF1b3RlZC1zY2FsYXInOlxuICAgICAgICBjYXNlICdibG9jay1zY2FsYXInOlxuICAgICAgICAgICAgbm9kZSA9IGNvbXBvc2VTY2FsYXIoY3R4LCB0b2tlbiwgdGFnLCBvbkVycm9yKTtcbiAgICAgICAgICAgIGlmIChhbmNob3IpXG4gICAgICAgICAgICAgICAgbm9kZS5hbmNob3IgPSBhbmNob3Iuc291cmNlLnN1YnN0cmluZygxKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdibG9jay1tYXAnOlxuICAgICAgICBjYXNlICdibG9jay1zZXEnOlxuICAgICAgICBjYXNlICdmbG93LWNvbGxlY3Rpb24nOlxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBub2RlID0gY29tcG9zZUNvbGxlY3Rpb24oQ04sIGN0eCwgdG9rZW4sIHByb3BzLCBvbkVycm9yKTtcbiAgICAgICAgICAgICAgICBpZiAoYW5jaG9yKVxuICAgICAgICAgICAgICAgICAgICBub2RlLmFuY2hvciA9IGFuY2hvci5zb3VyY2Uuc3Vic3RyaW5nKDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgLy8gQWxtb3N0IGNlcnRhaW5seSBoZXJlIGR1ZSB0byBhIHN0YWNrIG92ZXJmbG93XG4gICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICAgICAgICAgICAgICBvbkVycm9yKHRva2VuLCAnUkVTT1VSQ0VfRVhIQVVTVElPTicsIG1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB0b2tlbi50eXBlID09PSAnZXJyb3InXG4gICAgICAgICAgICAgICAgPyB0b2tlbi5tZXNzYWdlXG4gICAgICAgICAgICAgICAgOiBgVW5zdXBwb3J0ZWQgdG9rZW4gKHR5cGU6ICR7dG9rZW4udHlwZX0pYDtcbiAgICAgICAgICAgIG9uRXJyb3IodG9rZW4sICdVTkVYUEVDVEVEX1RPS0VOJywgbWVzc2FnZSk7XG4gICAgICAgICAgICBpc1NyY1Rva2VuID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbm9kZSA/PyAobm9kZSA9IGNvbXBvc2VFbXB0eU5vZGUoY3R4LCB0b2tlbi5vZmZzZXQsIHVuZGVmaW5lZCwgbnVsbCwgcHJvcHMsIG9uRXJyb3IpKTtcbiAgICBpZiAoYW5jaG9yICYmIG5vZGUuYW5jaG9yID09PSAnJylcbiAgICAgICAgb25FcnJvcihhbmNob3IsICdCQURfQUxJQVMnLCAnQW5jaG9yIGNhbm5vdCBiZSBhbiBlbXB0eSBzdHJpbmcnKTtcbiAgICBpZiAoYXRLZXkgJiZcbiAgICAgICAgY3R4Lm9wdGlvbnMuc3RyaW5nS2V5cyAmJlxuICAgICAgICAoIWlzU2NhbGFyKG5vZGUpIHx8XG4gICAgICAgICAgICB0eXBlb2Ygbm9kZS52YWx1ZSAhPT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgIChub2RlLnRhZyAmJiBub2RlLnRhZyAhPT0gJ3RhZzp5YW1sLm9yZywyMDAyOnN0cicpKSkge1xuICAgICAgICBjb25zdCBtc2cgPSAnV2l0aCBzdHJpbmdLZXlzLCBhbGwga2V5cyBtdXN0IGJlIHN0cmluZ3MnO1xuICAgICAgICBvbkVycm9yKHRhZyA/PyB0b2tlbiwgJ05PTl9TVFJJTkdfS0VZJywgbXNnKTtcbiAgICB9XG4gICAgaWYgKHNwYWNlQmVmb3JlKVxuICAgICAgICBub2RlLnNwYWNlQmVmb3JlID0gdHJ1ZTtcbiAgICBpZiAoY29tbWVudCkge1xuICAgICAgICBpZiAodG9rZW4udHlwZSA9PT0gJ3NjYWxhcicgJiYgdG9rZW4uc291cmNlID09PSAnJylcbiAgICAgICAgICAgIG5vZGUuY29tbWVudCA9IGNvbW1lbnQ7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIG5vZGUuY29tbWVudEJlZm9yZSA9IGNvbW1lbnQ7XG4gICAgfVxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgVHlwZSBjaGVja2luZyBtaXNzZXMgbWVhbmluZyBvZiBpc1NyY1Rva2VuXG4gICAgaWYgKGN0eC5vcHRpb25zLmtlZXBTb3VyY2VUb2tlbnMgJiYgaXNTcmNUb2tlbilcbiAgICAgICAgbm9kZS5zcmNUb2tlbiA9IHRva2VuO1xuICAgIHJldHVybiBub2RlO1xufVxuZnVuY3Rpb24gY29tcG9zZUVtcHR5Tm9kZShjdHgsIG9mZnNldCwgYmVmb3JlLCBwb3MsIHsgc3BhY2VCZWZvcmUsIGNvbW1lbnQsIGFuY2hvciwgdGFnLCBlbmQgfSwgb25FcnJvcikge1xuICAgIGNvbnN0IHRva2VuID0ge1xuICAgICAgICB0eXBlOiAnc2NhbGFyJyxcbiAgICAgICAgb2Zmc2V0OiBlbXB0eVNjYWxhclBvc2l0aW9uKG9mZnNldCwgYmVmb3JlLCBwb3MpLFxuICAgICAgICBpbmRlbnQ6IC0xLFxuICAgICAgICBzb3VyY2U6ICcnXG4gICAgfTtcbiAgICBjb25zdCBub2RlID0gY29tcG9zZVNjYWxhcihjdHgsIHRva2VuLCB0YWcsIG9uRXJyb3IpO1xuICAgIGlmIChhbmNob3IpIHtcbiAgICAgICAgbm9kZS5hbmNob3IgPSBhbmNob3Iuc291cmNlLnN1YnN0cmluZygxKTtcbiAgICAgICAgaWYgKG5vZGUuYW5jaG9yID09PSAnJylcbiAgICAgICAgICAgIG9uRXJyb3IoYW5jaG9yLCAnQkFEX0FMSUFTJywgJ0FuY2hvciBjYW5ub3QgYmUgYW4gZW1wdHkgc3RyaW5nJyk7XG4gICAgfVxuICAgIGlmIChzcGFjZUJlZm9yZSlcbiAgICAgICAgbm9kZS5zcGFjZUJlZm9yZSA9IHRydWU7XG4gICAgaWYgKGNvbW1lbnQpIHtcbiAgICAgICAgbm9kZS5jb21tZW50ID0gY29tbWVudDtcbiAgICAgICAgbm9kZS5yYW5nZVsyXSA9IGVuZDtcbiAgICB9XG4gICAgcmV0dXJuIG5vZGU7XG59XG5mdW5jdGlvbiBjb21wb3NlQWxpYXMoeyBvcHRpb25zIH0sIHsgb2Zmc2V0LCBzb3VyY2UsIGVuZCB9LCBvbkVycm9yKSB7XG4gICAgY29uc3QgYWxpYXMgPSBuZXcgQWxpYXMoc291cmNlLnN1YnN0cmluZygxKSk7XG4gICAgaWYgKGFsaWFzLnNvdXJjZSA9PT0gJycpXG4gICAgICAgIG9uRXJyb3Iob2Zmc2V0LCAnQkFEX0FMSUFTJywgJ0FsaWFzIGNhbm5vdCBiZSBhbiBlbXB0eSBzdHJpbmcnKTtcbiAgICBpZiAoYWxpYXMuc291cmNlLmVuZHNXaXRoKCc6JykpXG4gICAgICAgIG9uRXJyb3Iob2Zmc2V0ICsgc291cmNlLmxlbmd0aCAtIDEsICdCQURfQUxJQVMnLCAnQWxpYXMgZW5kaW5nIGluIDogaXMgYW1iaWd1b3VzJywgdHJ1ZSk7XG4gICAgY29uc3QgdmFsdWVFbmQgPSBvZmZzZXQgKyBzb3VyY2UubGVuZ3RoO1xuICAgIGNvbnN0IHJlID0gcmVzb2x2ZUVuZChlbmQsIHZhbHVlRW5kLCBvcHRpb25zLnN0cmljdCwgb25FcnJvcik7XG4gICAgYWxpYXMucmFuZ2UgPSBbb2Zmc2V0LCB2YWx1ZUVuZCwgcmUub2Zmc2V0XTtcbiAgICBpZiAocmUuY29tbWVudClcbiAgICAgICAgYWxpYXMuY29tbWVudCA9IHJlLmNvbW1lbnQ7XG4gICAgcmV0dXJuIGFsaWFzO1xufVxuXG5leHBvcnQgeyBjb21wb3NlRW1wdHlOb2RlLCBjb21wb3NlTm9kZSB9O1xuIiwiaW1wb3J0IHsgRG9jdW1lbnQgfSBmcm9tICcuLi9kb2MvRG9jdW1lbnQuanMnO1xuaW1wb3J0IHsgY29tcG9zZU5vZGUsIGNvbXBvc2VFbXB0eU5vZGUgfSBmcm9tICcuL2NvbXBvc2Utbm9kZS5qcyc7XG5pbXBvcnQgeyByZXNvbHZlRW5kIH0gZnJvbSAnLi9yZXNvbHZlLWVuZC5qcyc7XG5pbXBvcnQgeyByZXNvbHZlUHJvcHMgfSBmcm9tICcuL3Jlc29sdmUtcHJvcHMuanMnO1xuXG5mdW5jdGlvbiBjb21wb3NlRG9jKG9wdGlvbnMsIGRpcmVjdGl2ZXMsIHsgb2Zmc2V0LCBzdGFydCwgdmFsdWUsIGVuZCB9LCBvbkVycm9yKSB7XG4gICAgY29uc3Qgb3B0cyA9IE9iamVjdC5hc3NpZ24oeyBfZGlyZWN0aXZlczogZGlyZWN0aXZlcyB9LCBvcHRpb25zKTtcbiAgICBjb25zdCBkb2MgPSBuZXcgRG9jdW1lbnQodW5kZWZpbmVkLCBvcHRzKTtcbiAgICBjb25zdCBjdHggPSB7XG4gICAgICAgIGF0S2V5OiBmYWxzZSxcbiAgICAgICAgYXRSb290OiB0cnVlLFxuICAgICAgICBkaXJlY3RpdmVzOiBkb2MuZGlyZWN0aXZlcyxcbiAgICAgICAgb3B0aW9uczogZG9jLm9wdGlvbnMsXG4gICAgICAgIHNjaGVtYTogZG9jLnNjaGVtYVxuICAgIH07XG4gICAgY29uc3QgcHJvcHMgPSByZXNvbHZlUHJvcHMoc3RhcnQsIHtcbiAgICAgICAgaW5kaWNhdG9yOiAnZG9jLXN0YXJ0JyxcbiAgICAgICAgbmV4dDogdmFsdWUgPz8gZW5kPy5bMF0sXG4gICAgICAgIG9mZnNldCxcbiAgICAgICAgb25FcnJvcixcbiAgICAgICAgcGFyZW50SW5kZW50OiAwLFxuICAgICAgICBzdGFydE9uTmV3bGluZTogdHJ1ZVxuICAgIH0pO1xuICAgIGlmIChwcm9wcy5mb3VuZCkge1xuICAgICAgICBkb2MuZGlyZWN0aXZlcy5kb2NTdGFydCA9IHRydWU7XG4gICAgICAgIGlmICh2YWx1ZSAmJlxuICAgICAgICAgICAgKHZhbHVlLnR5cGUgPT09ICdibG9jay1tYXAnIHx8IHZhbHVlLnR5cGUgPT09ICdibG9jay1zZXEnKSAmJlxuICAgICAgICAgICAgIXByb3BzLmhhc05ld2xpbmUpXG4gICAgICAgICAgICBvbkVycm9yKHByb3BzLmVuZCwgJ01JU1NJTkdfQ0hBUicsICdCbG9jayBjb2xsZWN0aW9uIGNhbm5vdCBzdGFydCBvbiBzYW1lIGxpbmUgd2l0aCBkaXJlY3RpdmVzLWVuZCBtYXJrZXInKTtcbiAgICB9XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBJZiBDb250ZW50cyBpcyBzZXQsIGxldCdzIHRydXN0IHRoZSB1c2VyXG4gICAgZG9jLmNvbnRlbnRzID0gdmFsdWVcbiAgICAgICAgPyBjb21wb3NlTm9kZShjdHgsIHZhbHVlLCBwcm9wcywgb25FcnJvcilcbiAgICAgICAgOiBjb21wb3NlRW1wdHlOb2RlKGN0eCwgcHJvcHMuZW5kLCBzdGFydCwgbnVsbCwgcHJvcHMsIG9uRXJyb3IpO1xuICAgIGNvbnN0IGNvbnRlbnRFbmQgPSBkb2MuY29udGVudHMucmFuZ2VbMl07XG4gICAgY29uc3QgcmUgPSByZXNvbHZlRW5kKGVuZCwgY29udGVudEVuZCwgZmFsc2UsIG9uRXJyb3IpO1xuICAgIGlmIChyZS5jb21tZW50KVxuICAgICAgICBkb2MuY29tbWVudCA9IHJlLmNvbW1lbnQ7XG4gICAgZG9jLnJhbmdlID0gW29mZnNldCwgY29udGVudEVuZCwgcmUub2Zmc2V0XTtcbiAgICByZXR1cm4gZG9jO1xufVxuXG5leHBvcnQgeyBjb21wb3NlRG9jIH07XG4iLCJpbXBvcnQgeyBEaXJlY3RpdmVzIH0gZnJvbSAnLi4vZG9jL2RpcmVjdGl2ZXMuanMnO1xuaW1wb3J0IHsgRG9jdW1lbnQgfSBmcm9tICcuLi9kb2MvRG9jdW1lbnQuanMnO1xuaW1wb3J0IHsgWUFNTFdhcm5pbmcsIFlBTUxQYXJzZUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzLmpzJztcbmltcG9ydCB7IGlzQ29sbGVjdGlvbiwgaXNQYWlyIH0gZnJvbSAnLi4vbm9kZXMvaWRlbnRpdHkuanMnO1xuaW1wb3J0IHsgY29tcG9zZURvYyB9IGZyb20gJy4vY29tcG9zZS1kb2MuanMnO1xuaW1wb3J0IHsgcmVzb2x2ZUVuZCB9IGZyb20gJy4vcmVzb2x2ZS1lbmQuanMnO1xuXG5mdW5jdGlvbiBnZXRFcnJvclBvcyhzcmMpIHtcbiAgICBpZiAodHlwZW9mIHNyYyA9PT0gJ251bWJlcicpXG4gICAgICAgIHJldHVybiBbc3JjLCBzcmMgKyAxXTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShzcmMpKVxuICAgICAgICByZXR1cm4gc3JjLmxlbmd0aCA9PT0gMiA/IHNyYyA6IFtzcmNbMF0sIHNyY1sxXV07XG4gICAgY29uc3QgeyBvZmZzZXQsIHNvdXJjZSB9ID0gc3JjO1xuICAgIHJldHVybiBbb2Zmc2V0LCBvZmZzZXQgKyAodHlwZW9mIHNvdXJjZSA9PT0gJ3N0cmluZycgPyBzb3VyY2UubGVuZ3RoIDogMSldO1xufVxuZnVuY3Rpb24gcGFyc2VQcmVsdWRlKHByZWx1ZGUpIHtcbiAgICBsZXQgY29tbWVudCA9ICcnO1xuICAgIGxldCBhdENvbW1lbnQgPSBmYWxzZTtcbiAgICBsZXQgYWZ0ZXJFbXB0eUxpbmUgPSBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByZWx1ZGUubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY29uc3Qgc291cmNlID0gcHJlbHVkZVtpXTtcbiAgICAgICAgc3dpdGNoIChzb3VyY2VbMF0pIHtcbiAgICAgICAgICAgIGNhc2UgJyMnOlxuICAgICAgICAgICAgICAgIGNvbW1lbnQgKz1cbiAgICAgICAgICAgICAgICAgICAgKGNvbW1lbnQgPT09ICcnID8gJycgOiBhZnRlckVtcHR5TGluZSA/ICdcXG5cXG4nIDogJ1xcbicpICtcbiAgICAgICAgICAgICAgICAgICAgICAgIChzb3VyY2Uuc3Vic3RyaW5nKDEpIHx8ICcgJyk7XG4gICAgICAgICAgICAgICAgYXRDb21tZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBhZnRlckVtcHR5TGluZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnJSc6XG4gICAgICAgICAgICAgICAgaWYgKHByZWx1ZGVbaSArIDFdPy5bMF0gIT09ICcjJylcbiAgICAgICAgICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICAgICAgICAgIGF0Q29tbWVudCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAvLyBUaGlzIG1heSBiZSB3cm9uZyBhZnRlciBkb2MtZW5kLCBidXQgaW4gdGhhdCBjYXNlIGl0IGRvZXNuJ3QgbWF0dGVyXG4gICAgICAgICAgICAgICAgaWYgKCFhdENvbW1lbnQpXG4gICAgICAgICAgICAgICAgICAgIGFmdGVyRW1wdHlMaW5lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBhdENvbW1lbnQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyBjb21tZW50LCBhZnRlckVtcHR5TGluZSB9O1xufVxuLyoqXG4gKiBDb21wb3NlIGEgc3RyZWFtIG9mIENTVCBub2RlcyBpbnRvIGEgc3RyZWFtIG9mIFlBTUwgRG9jdW1lbnRzLlxuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBDb21wb3NlciwgUGFyc2VyIH0gZnJvbSAneWFtbCdcbiAqXG4gKiBjb25zdCBzcmM6IHN0cmluZyA9IC4uLlxuICogY29uc3QgdG9rZW5zID0gbmV3IFBhcnNlcigpLnBhcnNlKHNyYylcbiAqIGNvbnN0IGRvY3MgPSBuZXcgQ29tcG9zZXIoKS5jb21wb3NlKHRva2VucylcbiAqIGBgYFxuICovXG5jbGFzcyBDb21wb3NlciB7XG4gICAgY29uc3RydWN0b3Iob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMuZG9jID0gbnVsbDtcbiAgICAgICAgdGhpcy5hdERpcmVjdGl2ZXMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5wcmVsdWRlID0gW107XG4gICAgICAgIHRoaXMuZXJyb3JzID0gW107XG4gICAgICAgIHRoaXMud2FybmluZ3MgPSBbXTtcbiAgICAgICAgdGhpcy5vbkVycm9yID0gKHNvdXJjZSwgY29kZSwgbWVzc2FnZSwgd2FybmluZykgPT4ge1xuICAgICAgICAgICAgY29uc3QgcG9zID0gZ2V0RXJyb3JQb3Moc291cmNlKTtcbiAgICAgICAgICAgIGlmICh3YXJuaW5nKVxuICAgICAgICAgICAgICAgIHRoaXMud2FybmluZ3MucHVzaChuZXcgWUFNTFdhcm5pbmcocG9zLCBjb2RlLCBtZXNzYWdlKSk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdGhpcy5lcnJvcnMucHVzaChuZXcgWUFNTFBhcnNlRXJyb3IocG9zLCBjb2RlLCBtZXNzYWdlKSk7XG4gICAgICAgIH07XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLW51bGxpc2gtY29hbGVzY2luZ1xuICAgICAgICB0aGlzLmRpcmVjdGl2ZXMgPSBuZXcgRGlyZWN0aXZlcyh7IHZlcnNpb246IG9wdGlvbnMudmVyc2lvbiB8fCAnMS4yJyB9KTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB9XG4gICAgZGVjb3JhdGUoZG9jLCBhZnRlckRvYykge1xuICAgICAgICBjb25zdCB7IGNvbW1lbnQsIGFmdGVyRW1wdHlMaW5lIH0gPSBwYXJzZVByZWx1ZGUodGhpcy5wcmVsdWRlKTtcbiAgICAgICAgLy9jb25zb2xlLmxvZyh7IGRjOiBkb2MuY29tbWVudCwgcHJlbHVkZSwgY29tbWVudCB9KVxuICAgICAgICBpZiAoY29tbWVudCkge1xuICAgICAgICAgICAgY29uc3QgZGMgPSBkb2MuY29udGVudHM7XG4gICAgICAgICAgICBpZiAoYWZ0ZXJEb2MpIHtcbiAgICAgICAgICAgICAgICBkb2MuY29tbWVudCA9IGRvYy5jb21tZW50ID8gYCR7ZG9jLmNvbW1lbnR9XFxuJHtjb21tZW50fWAgOiBjb21tZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYWZ0ZXJFbXB0eUxpbmUgfHwgZG9jLmRpcmVjdGl2ZXMuZG9jU3RhcnQgfHwgIWRjKSB7XG4gICAgICAgICAgICAgICAgZG9jLmNvbW1lbnRCZWZvcmUgPSBjb21tZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXNDb2xsZWN0aW9uKGRjKSAmJiAhZGMuZmxvdyAmJiBkYy5pdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IGl0ID0gZGMuaXRlbXNbMF07XG4gICAgICAgICAgICAgICAgaWYgKGlzUGFpcihpdCkpXG4gICAgICAgICAgICAgICAgICAgIGl0ID0gaXQua2V5O1xuICAgICAgICAgICAgICAgIGNvbnN0IGNiID0gaXQuY29tbWVudEJlZm9yZTtcbiAgICAgICAgICAgICAgICBpdC5jb21tZW50QmVmb3JlID0gY2IgPyBgJHtjb21tZW50fVxcbiR7Y2J9YCA6IGNvbW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjYiA9IGRjLmNvbW1lbnRCZWZvcmU7XG4gICAgICAgICAgICAgICAgZGMuY29tbWVudEJlZm9yZSA9IGNiID8gYCR7Y29tbWVudH1cXG4ke2NifWAgOiBjb21tZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChhZnRlckRvYykge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmVycm9ycy5sZW5ndGg7ICsraSlcbiAgICAgICAgICAgICAgICBkb2MuZXJyb3JzLnB1c2godGhpcy5lcnJvcnNbaV0pO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLndhcm5pbmdzLmxlbmd0aDsgKytpKVxuICAgICAgICAgICAgICAgIGRvYy53YXJuaW5ncy5wdXNoKHRoaXMud2FybmluZ3NbaV0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZG9jLmVycm9ycyA9IHRoaXMuZXJyb3JzO1xuICAgICAgICAgICAgZG9jLndhcm5pbmdzID0gdGhpcy53YXJuaW5ncztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByZWx1ZGUgPSBbXTtcbiAgICAgICAgdGhpcy5lcnJvcnMgPSBbXTtcbiAgICAgICAgdGhpcy53YXJuaW5ncyA9IFtdO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDdXJyZW50IHN0cmVhbSBzdGF0dXMgaW5mb3JtYXRpb24uXG4gICAgICpcbiAgICAgKiBNb3N0bHkgdXNlZnVsIGF0IHRoZSBlbmQgb2YgaW5wdXQgZm9yIGFuIGVtcHR5IHN0cmVhbS5cbiAgICAgKi9cbiAgICBzdHJlYW1JbmZvKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29tbWVudDogcGFyc2VQcmVsdWRlKHRoaXMucHJlbHVkZSkuY29tbWVudCxcbiAgICAgICAgICAgIGRpcmVjdGl2ZXM6IHRoaXMuZGlyZWN0aXZlcyxcbiAgICAgICAgICAgIGVycm9yczogdGhpcy5lcnJvcnMsXG4gICAgICAgICAgICB3YXJuaW5nczogdGhpcy53YXJuaW5nc1xuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb21wb3NlIHRva2VucyBpbnRvIGRvY3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmb3JjZURvYyAtIElmIHRoZSBzdHJlYW0gY29udGFpbnMgbm8gZG9jdW1lbnQsIHN0aWxsIGVtaXQgYSBmaW5hbCBkb2N1bWVudCBpbmNsdWRpbmcgYW55IGNvbW1lbnRzIGFuZCBkaXJlY3RpdmVzIHRoYXQgd291bGQgYmUgYXBwbGllZCB0byBhIHN1YnNlcXVlbnQgZG9jdW1lbnQuXG4gICAgICogQHBhcmFtIGVuZE9mZnNldCAtIFNob3VsZCBiZSBzZXQgaWYgYGZvcmNlRG9jYCBpcyBhbHNvIHNldCwgdG8gc2V0IHRoZSBkb2N1bWVudCByYW5nZSBlbmQgYW5kIHRvIGluZGljYXRlIGVycm9ycyBjb3JyZWN0bHkuXG4gICAgICovXG4gICAgKmNvbXBvc2UodG9rZW5zLCBmb3JjZURvYyA9IGZhbHNlLCBlbmRPZmZzZXQgPSAtMSkge1xuICAgICAgICBmb3IgKGNvbnN0IHRva2VuIG9mIHRva2VucylcbiAgICAgICAgICAgIHlpZWxkKiB0aGlzLm5leHQodG9rZW4pO1xuICAgICAgICB5aWVsZCogdGhpcy5lbmQoZm9yY2VEb2MsIGVuZE9mZnNldCk7XG4gICAgfVxuICAgIC8qKiBBZHZhbmNlIHRoZSBjb21wb3NlciBieSBvbmUgQ1NUIHRva2VuLiAqL1xuICAgICpuZXh0KHRva2VuKSB7XG4gICAgICAgIHN3aXRjaCAodG9rZW4udHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnZGlyZWN0aXZlJzpcbiAgICAgICAgICAgICAgICB0aGlzLmRpcmVjdGl2ZXMuYWRkKHRva2VuLnNvdXJjZSwgKG9mZnNldCwgbWVzc2FnZSwgd2FybmluZykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwb3MgPSBnZXRFcnJvclBvcyh0b2tlbik7XG4gICAgICAgICAgICAgICAgICAgIHBvc1swXSArPSBvZmZzZXQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25FcnJvcihwb3MsICdCQURfRElSRUNUSVZFJywgbWVzc2FnZSwgd2FybmluZyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5wcmVsdWRlLnB1c2godG9rZW4uc291cmNlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmF0RGlyZWN0aXZlcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdkb2N1bWVudCc6IHtcbiAgICAgICAgICAgICAgICBjb25zdCBkb2MgPSBjb21wb3NlRG9jKHRoaXMub3B0aW9ucywgdGhpcy5kaXJlY3RpdmVzLCB0b2tlbiwgdGhpcy5vbkVycm9yKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hdERpcmVjdGl2ZXMgJiYgIWRvYy5kaXJlY3RpdmVzLmRvY1N0YXJ0KVxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uRXJyb3IodG9rZW4sICdNSVNTSU5HX0NIQVInLCAnTWlzc2luZyBkaXJlY3RpdmVzLWVuZC9kb2Mtc3RhcnQgaW5kaWNhdG9yIGxpbmUnKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRlY29yYXRlKGRvYywgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRvYylcbiAgICAgICAgICAgICAgICAgICAgeWllbGQgdGhpcy5kb2M7XG4gICAgICAgICAgICAgICAgdGhpcy5kb2MgPSBkb2M7XG4gICAgICAgICAgICAgICAgdGhpcy5hdERpcmVjdGl2ZXMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ2J5dGUtb3JkZXItbWFyayc6XG4gICAgICAgICAgICBjYXNlICdzcGFjZSc6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdjb21tZW50JzpcbiAgICAgICAgICAgIGNhc2UgJ25ld2xpbmUnOlxuICAgICAgICAgICAgICAgIHRoaXMucHJlbHVkZS5wdXNoKHRva2VuLnNvdXJjZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdlcnJvcic6IHtcbiAgICAgICAgICAgICAgICBjb25zdCBtc2cgPSB0b2tlbi5zb3VyY2VcbiAgICAgICAgICAgICAgICAgICAgPyBgJHt0b2tlbi5tZXNzYWdlfTogJHtKU09OLnN0cmluZ2lmeSh0b2tlbi5zb3VyY2UpfWBcbiAgICAgICAgICAgICAgICAgICAgOiB0b2tlbi5tZXNzYWdlO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IFlBTUxQYXJzZUVycm9yKGdldEVycm9yUG9zKHRva2VuKSwgJ1VORVhQRUNURURfVE9LRU4nLCBtc2cpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmF0RGlyZWN0aXZlcyB8fCAhdGhpcy5kb2MpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXJyb3JzLnB1c2goZXJyb3IpO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kb2MuZXJyb3JzLnB1c2goZXJyb3IpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnZG9jLWVuZCc6IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZG9jKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1zZyA9ICdVbmV4cGVjdGVkIGRvYy1lbmQgd2l0aG91dCBwcmVjZWRpbmcgZG9jdW1lbnQnO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVycm9ycy5wdXNoKG5ldyBZQU1MUGFyc2VFcnJvcihnZXRFcnJvclBvcyh0b2tlbiksICdVTkVYUEVDVEVEX1RPS0VOJywgbXNnKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmRvYy5kaXJlY3RpdmVzLmRvY0VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgY29uc3QgZW5kID0gcmVzb2x2ZUVuZCh0b2tlbi5lbmQsIHRva2VuLm9mZnNldCArIHRva2VuLnNvdXJjZS5sZW5ndGgsIHRoaXMuZG9jLm9wdGlvbnMuc3RyaWN0LCB0aGlzLm9uRXJyb3IpO1xuICAgICAgICAgICAgICAgIHRoaXMuZGVjb3JhdGUodGhpcy5kb2MsIHRydWUpO1xuICAgICAgICAgICAgICAgIGlmIChlbmQuY29tbWVudCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkYyA9IHRoaXMuZG9jLmNvbW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZG9jLmNvbW1lbnQgPSBkYyA/IGAke2RjfVxcbiR7ZW5kLmNvbW1lbnR9YCA6IGVuZC5jb21tZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmRvYy5yYW5nZVsyXSA9IGVuZC5vZmZzZXQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRoaXMuZXJyb3JzLnB1c2gobmV3IFlBTUxQYXJzZUVycm9yKGdldEVycm9yUG9zKHRva2VuKSwgJ1VORVhQRUNURURfVE9LRU4nLCBgVW5zdXBwb3J0ZWQgdG9rZW4gJHt0b2tlbi50eXBlfWApKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsIGF0IGVuZCBvZiBpbnB1dCB0byB5aWVsZCBhbnkgcmVtYWluaW5nIGRvY3VtZW50LlxuICAgICAqXG4gICAgICogQHBhcmFtIGZvcmNlRG9jIC0gSWYgdGhlIHN0cmVhbSBjb250YWlucyBubyBkb2N1bWVudCwgc3RpbGwgZW1pdCBhIGZpbmFsIGRvY3VtZW50IGluY2x1ZGluZyBhbnkgY29tbWVudHMgYW5kIGRpcmVjdGl2ZXMgdGhhdCB3b3VsZCBiZSBhcHBsaWVkIHRvIGEgc3Vic2VxdWVudCBkb2N1bWVudC5cbiAgICAgKiBAcGFyYW0gZW5kT2Zmc2V0IC0gU2hvdWxkIGJlIHNldCBpZiBgZm9yY2VEb2NgIGlzIGFsc28gc2V0LCB0byBzZXQgdGhlIGRvY3VtZW50IHJhbmdlIGVuZCBhbmQgdG8gaW5kaWNhdGUgZXJyb3JzIGNvcnJlY3RseS5cbiAgICAgKi9cbiAgICAqZW5kKGZvcmNlRG9jID0gZmFsc2UsIGVuZE9mZnNldCA9IC0xKSB7XG4gICAgICAgIGlmICh0aGlzLmRvYykge1xuICAgICAgICAgICAgdGhpcy5kZWNvcmF0ZSh0aGlzLmRvYywgdHJ1ZSk7XG4gICAgICAgICAgICB5aWVsZCB0aGlzLmRvYztcbiAgICAgICAgICAgIHRoaXMuZG9jID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChmb3JjZURvYykge1xuICAgICAgICAgICAgY29uc3Qgb3B0cyA9IE9iamVjdC5hc3NpZ24oeyBfZGlyZWN0aXZlczogdGhpcy5kaXJlY3RpdmVzIH0sIHRoaXMub3B0aW9ucyk7XG4gICAgICAgICAgICBjb25zdCBkb2MgPSBuZXcgRG9jdW1lbnQodW5kZWZpbmVkLCBvcHRzKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmF0RGlyZWN0aXZlcylcbiAgICAgICAgICAgICAgICB0aGlzLm9uRXJyb3IoZW5kT2Zmc2V0LCAnTUlTU0lOR19DSEFSJywgJ01pc3NpbmcgZGlyZWN0aXZlcy1lbmQgaW5kaWNhdG9yIGxpbmUnKTtcbiAgICAgICAgICAgIGRvYy5yYW5nZSA9IFswLCBlbmRPZmZzZXQsIGVuZE9mZnNldF07XG4gICAgICAgICAgICB0aGlzLmRlY29yYXRlKGRvYywgZmFsc2UpO1xuICAgICAgICAgICAgeWllbGQgZG9jO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgeyBDb21wb3NlciB9O1xuIiwiaW1wb3J0IHsgcmVzb2x2ZUJsb2NrU2NhbGFyIH0gZnJvbSAnLi4vY29tcG9zZS9yZXNvbHZlLWJsb2NrLXNjYWxhci5qcyc7XG5pbXBvcnQgeyByZXNvbHZlRmxvd1NjYWxhciB9IGZyb20gJy4uL2NvbXBvc2UvcmVzb2x2ZS1mbG93LXNjYWxhci5qcyc7XG5pbXBvcnQgeyBZQU1MUGFyc2VFcnJvciB9IGZyb20gJy4uL2Vycm9ycy5qcyc7XG5pbXBvcnQgeyBzdHJpbmdpZnlTdHJpbmcgfSBmcm9tICcuLi9zdHJpbmdpZnkvc3RyaW5naWZ5U3RyaW5nLmpzJztcblxuZnVuY3Rpb24gcmVzb2x2ZUFzU2NhbGFyKHRva2VuLCBzdHJpY3QgPSB0cnVlLCBvbkVycm9yKSB7XG4gICAgaWYgKHRva2VuKSB7XG4gICAgICAgIGNvbnN0IF9vbkVycm9yID0gKHBvcywgY29kZSwgbWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdHlwZW9mIHBvcyA9PT0gJ251bWJlcicgPyBwb3MgOiBBcnJheS5pc0FycmF5KHBvcykgPyBwb3NbMF0gOiBwb3Mub2Zmc2V0O1xuICAgICAgICAgICAgaWYgKG9uRXJyb3IpXG4gICAgICAgICAgICAgICAgb25FcnJvcihvZmZzZXQsIGNvZGUsIG1lc3NhZ2UpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBZQU1MUGFyc2VFcnJvcihbb2Zmc2V0LCBvZmZzZXQgKyAxXSwgY29kZSwgbWVzc2FnZSk7XG4gICAgICAgIH07XG4gICAgICAgIHN3aXRjaCAodG9rZW4udHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnc2NhbGFyJzpcbiAgICAgICAgICAgIGNhc2UgJ3NpbmdsZS1xdW90ZWQtc2NhbGFyJzpcbiAgICAgICAgICAgIGNhc2UgJ2RvdWJsZS1xdW90ZWQtc2NhbGFyJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZUZsb3dTY2FsYXIodG9rZW4sIHN0cmljdCwgX29uRXJyb3IpO1xuICAgICAgICAgICAgY2FzZSAnYmxvY2stc2NhbGFyJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZUJsb2NrU2NhbGFyKHsgb3B0aW9uczogeyBzdHJpY3QgfSB9LCB0b2tlbiwgX29uRXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuLyoqXG4gKiBDcmVhdGUgYSBuZXcgc2NhbGFyIHRva2VuIHdpdGggYHZhbHVlYFxuICpcbiAqIFZhbHVlcyB0aGF0IHJlcHJlc2VudCBhbiBhY3R1YWwgc3RyaW5nIGJ1dCBtYXkgYmUgcGFyc2VkIGFzIGEgZGlmZmVyZW50IHR5cGUgc2hvdWxkIHVzZSBhIGB0eXBlYCBvdGhlciB0aGFuIGAnUExBSU4nYCxcbiAqIGFzIHRoaXMgZnVuY3Rpb24gZG9lcyBub3Qgc3VwcG9ydCBhbnkgc2NoZW1hIG9wZXJhdGlvbnMgYW5kIHdvbid0IGNoZWNrIGZvciBzdWNoIGNvbmZsaWN0cy5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdmFsdWUsIHdoaWNoIHdpbGwgaGF2ZSBpdHMgY29udGVudCBwcm9wZXJseSBpbmRlbnRlZC5cbiAqIEBwYXJhbSBjb250ZXh0LmVuZCBDb21tZW50cyBhbmQgd2hpdGVzcGFjZSBhZnRlciB0aGUgZW5kIG9mIHRoZSB2YWx1ZSwgb3IgYWZ0ZXIgdGhlIGJsb2NrIHNjYWxhciBoZWFkZXIuIElmIHVuZGVmaW5lZCwgYSBuZXdsaW5lIHdpbGwgYmUgYWRkZWQuXG4gKiBAcGFyYW0gY29udGV4dC5pbXBsaWNpdEtleSBCZWluZyB3aXRoaW4gYW4gaW1wbGljaXQga2V5IG1heSBhZmZlY3QgdGhlIHJlc29sdmVkIHR5cGUgb2YgdGhlIHRva2VuJ3MgdmFsdWUuXG4gKiBAcGFyYW0gY29udGV4dC5pbmRlbnQgVGhlIGluZGVudCBsZXZlbCBvZiB0aGUgdG9rZW4uXG4gKiBAcGFyYW0gY29udGV4dC5pbkZsb3cgSXMgdGhpcyBzY2FsYXIgd2l0aGluIGEgZmxvdyBjb2xsZWN0aW9uPyBUaGlzIG1heSBhZmZlY3QgdGhlIHJlc29sdmVkIHR5cGUgb2YgdGhlIHRva2VuJ3MgdmFsdWUuXG4gKiBAcGFyYW0gY29udGV4dC5vZmZzZXQgVGhlIG9mZnNldCBwb3NpdGlvbiBvZiB0aGUgdG9rZW4uXG4gKiBAcGFyYW0gY29udGV4dC50eXBlIFRoZSBwcmVmZXJyZWQgdHlwZSBvZiB0aGUgc2NhbGFyIHRva2VuLiBJZiB1bmRlZmluZWQsIHRoZSBwcmV2aW91cyB0eXBlIG9mIHRoZSBgdG9rZW5gIHdpbGwgYmUgdXNlZCwgZGVmYXVsdGluZyB0byBgJ1BMQUlOJ2AuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVNjYWxhclRva2VuKHZhbHVlLCBjb250ZXh0KSB7XG4gICAgY29uc3QgeyBpbXBsaWNpdEtleSA9IGZhbHNlLCBpbmRlbnQsIGluRmxvdyA9IGZhbHNlLCBvZmZzZXQgPSAtMSwgdHlwZSA9ICdQTEFJTicgfSA9IGNvbnRleHQ7XG4gICAgY29uc3Qgc291cmNlID0gc3RyaW5naWZ5U3RyaW5nKHsgdHlwZSwgdmFsdWUgfSwge1xuICAgICAgICBpbXBsaWNpdEtleSxcbiAgICAgICAgaW5kZW50OiBpbmRlbnQgPiAwID8gJyAnLnJlcGVhdChpbmRlbnQpIDogJycsXG4gICAgICAgIGluRmxvdyxcbiAgICAgICAgb3B0aW9uczogeyBibG9ja1F1b3RlOiB0cnVlLCBsaW5lV2lkdGg6IC0xIH1cbiAgICB9KTtcbiAgICBjb25zdCBlbmQgPSBjb250ZXh0LmVuZCA/PyBbXG4gICAgICAgIHsgdHlwZTogJ25ld2xpbmUnLCBvZmZzZXQ6IC0xLCBpbmRlbnQsIHNvdXJjZTogJ1xcbicgfVxuICAgIF07XG4gICAgc3dpdGNoIChzb3VyY2VbMF0pIHtcbiAgICAgICAgY2FzZSAnfCc6XG4gICAgICAgIGNhc2UgJz4nOiB7XG4gICAgICAgICAgICBjb25zdCBoZSA9IHNvdXJjZS5pbmRleE9mKCdcXG4nKTtcbiAgICAgICAgICAgIGNvbnN0IGhlYWQgPSBzb3VyY2Uuc3Vic3RyaW5nKDAsIGhlKTtcbiAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBzb3VyY2Uuc3Vic3RyaW5nKGhlICsgMSkgKyAnXFxuJztcbiAgICAgICAgICAgIGNvbnN0IHByb3BzID0gW1xuICAgICAgICAgICAgICAgIHsgdHlwZTogJ2Jsb2NrLXNjYWxhci1oZWFkZXInLCBvZmZzZXQsIGluZGVudCwgc291cmNlOiBoZWFkIH1cbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBpZiAoIWFkZEVuZHRvQmxvY2tQcm9wcyhwcm9wcywgZW5kKSlcbiAgICAgICAgICAgICAgICBwcm9wcy5wdXNoKHsgdHlwZTogJ25ld2xpbmUnLCBvZmZzZXQ6IC0xLCBpbmRlbnQsIHNvdXJjZTogJ1xcbicgfSk7XG4gICAgICAgICAgICByZXR1cm4geyB0eXBlOiAnYmxvY2stc2NhbGFyJywgb2Zmc2V0LCBpbmRlbnQsIHByb3BzLCBzb3VyY2U6IGJvZHkgfTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdcIic6XG4gICAgICAgICAgICByZXR1cm4geyB0eXBlOiAnZG91YmxlLXF1b3RlZC1zY2FsYXInLCBvZmZzZXQsIGluZGVudCwgc291cmNlLCBlbmQgfTtcbiAgICAgICAgY2FzZSBcIidcIjpcbiAgICAgICAgICAgIHJldHVybiB7IHR5cGU6ICdzaW5nbGUtcXVvdGVkLXNjYWxhcicsIG9mZnNldCwgaW5kZW50LCBzb3VyY2UsIGVuZCB9O1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIHsgdHlwZTogJ3NjYWxhcicsIG9mZnNldCwgaW5kZW50LCBzb3VyY2UsIGVuZCB9O1xuICAgIH1cbn1cbi8qKlxuICogU2V0IHRoZSB2YWx1ZSBvZiBgdG9rZW5gIHRvIHRoZSBnaXZlbiBzdHJpbmcgYHZhbHVlYCwgb3ZlcndyaXRpbmcgYW55IHByZXZpb3VzIGNvbnRlbnRzIGFuZCB0eXBlIHRoYXQgaXQgbWF5IGhhdmUuXG4gKlxuICogQmVzdCBlZmZvcnRzIGFyZSBtYWRlIHRvIHJldGFpbiBhbnkgY29tbWVudHMgcHJldmlvdXNseSBhc3NvY2lhdGVkIHdpdGggdGhlIGB0b2tlbmAsXG4gKiB0aG91Z2ggYWxsIGNvbnRlbnRzIHdpdGhpbiBhIGNvbGxlY3Rpb24ncyBgaXRlbXNgIHdpbGwgYmUgb3ZlcndyaXR0ZW4uXG4gKlxuICogVmFsdWVzIHRoYXQgcmVwcmVzZW50IGFuIGFjdHVhbCBzdHJpbmcgYnV0IG1heSBiZSBwYXJzZWQgYXMgYSBkaWZmZXJlbnQgdHlwZSBzaG91bGQgdXNlIGEgYHR5cGVgIG90aGVyIHRoYW4gYCdQTEFJTidgLFxuICogYXMgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBzdXBwb3J0IGFueSBzY2hlbWEgb3BlcmF0aW9ucyBhbmQgd29uJ3QgY2hlY2sgZm9yIHN1Y2ggY29uZmxpY3RzLlxuICpcbiAqIEBwYXJhbSB0b2tlbiBBbnkgdG9rZW4uIElmIGl0IGRvZXMgbm90IGluY2x1ZGUgYW4gYGluZGVudGAgdmFsdWUsIHRoZSB2YWx1ZSB3aWxsIGJlIHN0cmluZ2lmaWVkIGFzIGlmIGl0IHdlcmUgYW4gaW1wbGljaXQga2V5LlxuICogQHBhcmFtIHZhbHVlIFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZhbHVlLCB3aGljaCB3aWxsIGhhdmUgaXRzIGNvbnRlbnQgcHJvcGVybHkgaW5kZW50ZWQuXG4gKiBAcGFyYW0gY29udGV4dC5hZnRlcktleSBJbiBtb3N0IGNhc2VzLCB2YWx1ZXMgYWZ0ZXIgYSBrZXkgc2hvdWxkIGhhdmUgYW4gYWRkaXRpb25hbCBsZXZlbCBvZiBpbmRlbnRhdGlvbi5cbiAqIEBwYXJhbSBjb250ZXh0LmltcGxpY2l0S2V5IEJlaW5nIHdpdGhpbiBhbiBpbXBsaWNpdCBrZXkgbWF5IGFmZmVjdCB0aGUgcmVzb2x2ZWQgdHlwZSBvZiB0aGUgdG9rZW4ncyB2YWx1ZS5cbiAqIEBwYXJhbSBjb250ZXh0LmluRmxvdyBCZWluZyB3aXRoaW4gYSBmbG93IGNvbGxlY3Rpb24gbWF5IGFmZmVjdCB0aGUgcmVzb2x2ZWQgdHlwZSBvZiB0aGUgdG9rZW4ncyB2YWx1ZS5cbiAqIEBwYXJhbSBjb250ZXh0LnR5cGUgVGhlIHByZWZlcnJlZCB0eXBlIG9mIHRoZSBzY2FsYXIgdG9rZW4uIElmIHVuZGVmaW5lZCwgdGhlIHByZXZpb3VzIHR5cGUgb2YgdGhlIGB0b2tlbmAgd2lsbCBiZSB1c2VkLCBkZWZhdWx0aW5nIHRvIGAnUExBSU4nYC5cbiAqL1xuZnVuY3Rpb24gc2V0U2NhbGFyVmFsdWUodG9rZW4sIHZhbHVlLCBjb250ZXh0ID0ge30pIHtcbiAgICBsZXQgeyBhZnRlcktleSA9IGZhbHNlLCBpbXBsaWNpdEtleSA9IGZhbHNlLCBpbkZsb3cgPSBmYWxzZSwgdHlwZSB9ID0gY29udGV4dDtcbiAgICBsZXQgaW5kZW50ID0gJ2luZGVudCcgaW4gdG9rZW4gPyB0b2tlbi5pbmRlbnQgOiBudWxsO1xuICAgIGlmIChhZnRlcktleSAmJiB0eXBlb2YgaW5kZW50ID09PSAnbnVtYmVyJylcbiAgICAgICAgaW5kZW50ICs9IDI7XG4gICAgaWYgKCF0eXBlKVxuICAgICAgICBzd2l0Y2ggKHRva2VuLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ3NpbmdsZS1xdW90ZWQtc2NhbGFyJzpcbiAgICAgICAgICAgICAgICB0eXBlID0gJ1FVT1RFX1NJTkdMRSc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdkb3VibGUtcXVvdGVkLXNjYWxhcic6XG4gICAgICAgICAgICAgICAgdHlwZSA9ICdRVU9URV9ET1VCTEUnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnYmxvY2stc2NhbGFyJzoge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhlYWRlciA9IHRva2VuLnByb3BzWzBdO1xuICAgICAgICAgICAgICAgIGlmIChoZWFkZXIudHlwZSAhPT0gJ2Jsb2NrLXNjYWxhci1oZWFkZXInKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYmxvY2sgc2NhbGFyIGhlYWRlcicpO1xuICAgICAgICAgICAgICAgIHR5cGUgPSBoZWFkZXIuc291cmNlWzBdID09PSAnPicgPyAnQkxPQ0tfRk9MREVEJyA6ICdCTE9DS19MSVRFUkFMJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdHlwZSA9ICdQTEFJTic7XG4gICAgICAgIH1cbiAgICBjb25zdCBzb3VyY2UgPSBzdHJpbmdpZnlTdHJpbmcoeyB0eXBlLCB2YWx1ZSB9LCB7XG4gICAgICAgIGltcGxpY2l0S2V5OiBpbXBsaWNpdEtleSB8fCBpbmRlbnQgPT09IG51bGwsXG4gICAgICAgIGluZGVudDogaW5kZW50ICE9PSBudWxsICYmIGluZGVudCA+IDAgPyAnICcucmVwZWF0KGluZGVudCkgOiAnJyxcbiAgICAgICAgaW5GbG93LFxuICAgICAgICBvcHRpb25zOiB7IGJsb2NrUXVvdGU6IHRydWUsIGxpbmVXaWR0aDogLTEgfVxuICAgIH0pO1xuICAgIHN3aXRjaCAoc291cmNlWzBdKSB7XG4gICAgICAgIGNhc2UgJ3wnOlxuICAgICAgICBjYXNlICc+JzpcbiAgICAgICAgICAgIHNldEJsb2NrU2NhbGFyVmFsdWUodG9rZW4sIHNvdXJjZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnXCInOlxuICAgICAgICAgICAgc2V0Rmxvd1NjYWxhclZhbHVlKHRva2VuLCBzb3VyY2UsICdkb3VibGUtcXVvdGVkLXNjYWxhcicpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCInXCI6XG4gICAgICAgICAgICBzZXRGbG93U2NhbGFyVmFsdWUodG9rZW4sIHNvdXJjZSwgJ3NpbmdsZS1xdW90ZWQtc2NhbGFyJyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHNldEZsb3dTY2FsYXJWYWx1ZSh0b2tlbiwgc291cmNlLCAnc2NhbGFyJyk7XG4gICAgfVxufVxuZnVuY3Rpb24gc2V0QmxvY2tTY2FsYXJWYWx1ZSh0b2tlbiwgc291cmNlKSB7XG4gICAgY29uc3QgaGUgPSBzb3VyY2UuaW5kZXhPZignXFxuJyk7XG4gICAgY29uc3QgaGVhZCA9IHNvdXJjZS5zdWJzdHJpbmcoMCwgaGUpO1xuICAgIGNvbnN0IGJvZHkgPSBzb3VyY2Uuc3Vic3RyaW5nKGhlICsgMSkgKyAnXFxuJztcbiAgICBpZiAodG9rZW4udHlwZSA9PT0gJ2Jsb2NrLXNjYWxhcicpIHtcbiAgICAgICAgY29uc3QgaGVhZGVyID0gdG9rZW4ucHJvcHNbMF07XG4gICAgICAgIGlmIChoZWFkZXIudHlwZSAhPT0gJ2Jsb2NrLXNjYWxhci1oZWFkZXInKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGJsb2NrIHNjYWxhciBoZWFkZXInKTtcbiAgICAgICAgaGVhZGVyLnNvdXJjZSA9IGhlYWQ7XG4gICAgICAgIHRva2VuLnNvdXJjZSA9IGJvZHk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCB7IG9mZnNldCB9ID0gdG9rZW47XG4gICAgICAgIGNvbnN0IGluZGVudCA9ICdpbmRlbnQnIGluIHRva2VuID8gdG9rZW4uaW5kZW50IDogLTE7XG4gICAgICAgIGNvbnN0IHByb3BzID0gW1xuICAgICAgICAgICAgeyB0eXBlOiAnYmxvY2stc2NhbGFyLWhlYWRlcicsIG9mZnNldCwgaW5kZW50LCBzb3VyY2U6IGhlYWQgfVxuICAgICAgICBdO1xuICAgICAgICBpZiAoIWFkZEVuZHRvQmxvY2tQcm9wcyhwcm9wcywgJ2VuZCcgaW4gdG9rZW4gPyB0b2tlbi5lbmQgOiB1bmRlZmluZWQpKVxuICAgICAgICAgICAgcHJvcHMucHVzaCh7IHR5cGU6ICduZXdsaW5lJywgb2Zmc2V0OiAtMSwgaW5kZW50LCBzb3VyY2U6ICdcXG4nIH0pO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh0b2tlbikpXG4gICAgICAgICAgICBpZiAoa2V5ICE9PSAndHlwZScgJiYga2V5ICE9PSAnb2Zmc2V0JylcbiAgICAgICAgICAgICAgICBkZWxldGUgdG9rZW5ba2V5XTtcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0b2tlbiwgeyB0eXBlOiAnYmxvY2stc2NhbGFyJywgaW5kZW50LCBwcm9wcywgc291cmNlOiBib2R5IH0pO1xuICAgIH1cbn1cbi8qKiBAcmV0dXJucyBgdHJ1ZWAgaWYgbGFzdCB0b2tlbiBpcyBhIG5ld2xpbmUgKi9cbmZ1bmN0aW9uIGFkZEVuZHRvQmxvY2tQcm9wcyhwcm9wcywgZW5kKSB7XG4gICAgaWYgKGVuZClcbiAgICAgICAgZm9yIChjb25zdCBzdCBvZiBlbmQpXG4gICAgICAgICAgICBzd2l0Y2ggKHN0LnR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdzcGFjZSc6XG4gICAgICAgICAgICAgICAgY2FzZSAnY29tbWVudCc6XG4gICAgICAgICAgICAgICAgICAgIHByb3BzLnB1c2goc3QpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICduZXdsaW5lJzpcbiAgICAgICAgICAgICAgICAgICAgcHJvcHMucHVzaChzdCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIHNldEZsb3dTY2FsYXJWYWx1ZSh0b2tlbiwgc291cmNlLCB0eXBlKSB7XG4gICAgc3dpdGNoICh0b2tlbi50eXBlKSB7XG4gICAgICAgIGNhc2UgJ3NjYWxhcic6XG4gICAgICAgIGNhc2UgJ2RvdWJsZS1xdW90ZWQtc2NhbGFyJzpcbiAgICAgICAgY2FzZSAnc2luZ2xlLXF1b3RlZC1zY2FsYXInOlxuICAgICAgICAgICAgdG9rZW4udHlwZSA9IHR5cGU7XG4gICAgICAgICAgICB0b2tlbi5zb3VyY2UgPSBzb3VyY2U7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnYmxvY2stc2NhbGFyJzoge1xuICAgICAgICAgICAgY29uc3QgZW5kID0gdG9rZW4ucHJvcHMuc2xpY2UoMSk7XG4gICAgICAgICAgICBsZXQgb2EgPSBzb3VyY2UubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKHRva2VuLnByb3BzWzBdLnR5cGUgPT09ICdibG9jay1zY2FsYXItaGVhZGVyJylcbiAgICAgICAgICAgICAgICBvYSAtPSB0b2tlbi5wcm9wc1swXS5zb3VyY2UubGVuZ3RoO1xuICAgICAgICAgICAgZm9yIChjb25zdCB0b2sgb2YgZW5kKVxuICAgICAgICAgICAgICAgIHRvay5vZmZzZXQgKz0gb2E7XG4gICAgICAgICAgICBkZWxldGUgdG9rZW4ucHJvcHM7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHRva2VuLCB7IHR5cGUsIHNvdXJjZSwgZW5kIH0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnYmxvY2stbWFwJzpcbiAgICAgICAgY2FzZSAnYmxvY2stc2VxJzoge1xuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdG9rZW4ub2Zmc2V0ICsgc291cmNlLmxlbmd0aDtcbiAgICAgICAgICAgIGNvbnN0IG5sID0geyB0eXBlOiAnbmV3bGluZScsIG9mZnNldCwgaW5kZW50OiB0b2tlbi5pbmRlbnQsIHNvdXJjZTogJ1xcbicgfTtcbiAgICAgICAgICAgIGRlbGV0ZSB0b2tlbi5pdGVtcztcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24odG9rZW4sIHsgdHlwZSwgc291cmNlLCBlbmQ6IFtubF0gfSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBjb25zdCBpbmRlbnQgPSAnaW5kZW50JyBpbiB0b2tlbiA/IHRva2VuLmluZGVudCA6IC0xO1xuICAgICAgICAgICAgY29uc3QgZW5kID0gJ2VuZCcgaW4gdG9rZW4gJiYgQXJyYXkuaXNBcnJheSh0b2tlbi5lbmQpXG4gICAgICAgICAgICAgICAgPyB0b2tlbi5lbmQuZmlsdGVyKHN0ID0+IHN0LnR5cGUgPT09ICdzcGFjZScgfHxcbiAgICAgICAgICAgICAgICAgICAgc3QudHlwZSA9PT0gJ2NvbW1lbnQnIHx8XG4gICAgICAgICAgICAgICAgICAgIHN0LnR5cGUgPT09ICduZXdsaW5lJylcbiAgICAgICAgICAgICAgICA6IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModG9rZW4pKVxuICAgICAgICAgICAgICAgIGlmIChrZXkgIT09ICd0eXBlJyAmJiBrZXkgIT09ICdvZmZzZXQnKVxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgdG9rZW5ba2V5XTtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24odG9rZW4sIHsgdHlwZSwgaW5kZW50LCBzb3VyY2UsIGVuZCB9KTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IHsgY3JlYXRlU2NhbGFyVG9rZW4sIHJlc29sdmVBc1NjYWxhciwgc2V0U2NhbGFyVmFsdWUgfTtcbiIsIi8qKlxuICogU3RyaW5naWZ5IGEgQ1NUIGRvY3VtZW50LCB0b2tlbiwgb3IgY29sbGVjdGlvbiBpdGVtXG4gKlxuICogRmFpciB3YXJuaW5nOiBUaGlzIGFwcGxpZXMgbm8gdmFsaWRhdGlvbiB3aGF0c29ldmVyLCBhbmRcbiAqIHNpbXBseSBjb25jYXRlbmF0ZXMgdGhlIHNvdXJjZXMgaW4gdGhlaXIgbG9naWNhbCBvcmRlci5cbiAqL1xuY29uc3Qgc3RyaW5naWZ5ID0gKGNzdCkgPT4gJ3R5cGUnIGluIGNzdCA/IHN0cmluZ2lmeVRva2VuKGNzdCkgOiBzdHJpbmdpZnlJdGVtKGNzdCk7XG5mdW5jdGlvbiBzdHJpbmdpZnlUb2tlbih0b2tlbikge1xuICAgIHN3aXRjaCAodG9rZW4udHlwZSkge1xuICAgICAgICBjYXNlICdibG9jay1zY2FsYXInOiB7XG4gICAgICAgICAgICBsZXQgcmVzID0gJyc7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHRvayBvZiB0b2tlbi5wcm9wcylcbiAgICAgICAgICAgICAgICByZXMgKz0gc3RyaW5naWZ5VG9rZW4odG9rKTtcbiAgICAgICAgICAgIHJldHVybiByZXMgKyB0b2tlbi5zb3VyY2U7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnYmxvY2stbWFwJzpcbiAgICAgICAgY2FzZSAnYmxvY2stc2VxJzoge1xuICAgICAgICAgICAgbGV0IHJlcyA9ICcnO1xuICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHRva2VuLml0ZW1zKVxuICAgICAgICAgICAgICAgIHJlcyArPSBzdHJpbmdpZnlJdGVtKGl0ZW0pO1xuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdmbG93LWNvbGxlY3Rpb24nOiB7XG4gICAgICAgICAgICBsZXQgcmVzID0gdG9rZW4uc3RhcnQuc291cmNlO1xuICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHRva2VuLml0ZW1zKVxuICAgICAgICAgICAgICAgIHJlcyArPSBzdHJpbmdpZnlJdGVtKGl0ZW0pO1xuICAgICAgICAgICAgZm9yIChjb25zdCBzdCBvZiB0b2tlbi5lbmQpXG4gICAgICAgICAgICAgICAgcmVzICs9IHN0LnNvdXJjZTtcbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZG9jdW1lbnQnOiB7XG4gICAgICAgICAgICBsZXQgcmVzID0gc3RyaW5naWZ5SXRlbSh0b2tlbik7XG4gICAgICAgICAgICBpZiAodG9rZW4uZW5kKVxuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc3Qgb2YgdG9rZW4uZW5kKVxuICAgICAgICAgICAgICAgICAgICByZXMgKz0gc3Quc291cmNlO1xuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBsZXQgcmVzID0gdG9rZW4uc291cmNlO1xuICAgICAgICAgICAgaWYgKCdlbmQnIGluIHRva2VuICYmIHRva2VuLmVuZClcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHN0IG9mIHRva2VuLmVuZClcbiAgICAgICAgICAgICAgICAgICAgcmVzICs9IHN0LnNvdXJjZTtcbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBzdHJpbmdpZnlJdGVtKHsgc3RhcnQsIGtleSwgc2VwLCB2YWx1ZSB9KSB7XG4gICAgbGV0IHJlcyA9ICcnO1xuICAgIGZvciAoY29uc3Qgc3Qgb2Ygc3RhcnQpXG4gICAgICAgIHJlcyArPSBzdC5zb3VyY2U7XG4gICAgaWYgKGtleSlcbiAgICAgICAgcmVzICs9IHN0cmluZ2lmeVRva2VuKGtleSk7XG4gICAgaWYgKHNlcClcbiAgICAgICAgZm9yIChjb25zdCBzdCBvZiBzZXApXG4gICAgICAgICAgICByZXMgKz0gc3Quc291cmNlO1xuICAgIGlmICh2YWx1ZSlcbiAgICAgICAgcmVzICs9IHN0cmluZ2lmeVRva2VuKHZhbHVlKTtcbiAgICByZXR1cm4gcmVzO1xufVxuXG5leHBvcnQgeyBzdHJpbmdpZnkgfTtcbiIsImNvbnN0IEJSRUFLID0gU3ltYm9sKCdicmVhayB2aXNpdCcpO1xuY29uc3QgU0tJUCA9IFN5bWJvbCgnc2tpcCBjaGlsZHJlbicpO1xuY29uc3QgUkVNT1ZFID0gU3ltYm9sKCdyZW1vdmUgaXRlbScpO1xuLyoqXG4gKiBBcHBseSBhIHZpc2l0b3IgdG8gYSBDU1QgZG9jdW1lbnQgb3IgaXRlbS5cbiAqXG4gKiBXYWxrcyB0aHJvdWdoIHRoZSB0cmVlIChkZXB0aC1maXJzdCkgc3RhcnRpbmcgZnJvbSB0aGUgcm9vdCwgY2FsbGluZyBhXG4gKiBgdmlzaXRvcmAgZnVuY3Rpb24gd2l0aCB0d28gYXJndW1lbnRzIHdoZW4gZW50ZXJpbmcgZWFjaCBpdGVtOlxuICogICAtIGBpdGVtYDogVGhlIGN1cnJlbnQgaXRlbSwgd2hpY2ggaW5jbHVkZWQgdGhlIGZvbGxvd2luZyBtZW1iZXJzOlxuICogICAgIC0gYHN0YXJ0OiBTb3VyY2VUb2tlbltdYCDigJMgU291cmNlIHRva2VucyBiZWZvcmUgdGhlIGtleSBvciB2YWx1ZSxcbiAqICAgICAgIHBvc3NpYmx5IGluY2x1ZGluZyBpdHMgYW5jaG9yIG9yIHRhZy5cbiAqICAgICAtIGBrZXk/OiBUb2tlbiB8IG51bGxgIOKAkyBTZXQgZm9yIHBhaXIgdmFsdWVzLiBNYXkgdGhlbiBiZSBgbnVsbGAsIGlmXG4gKiAgICAgICB0aGUga2V5IGJlZm9yZSB0aGUgYDpgIHNlcGFyYXRvciBpcyBlbXB0eS5cbiAqICAgICAtIGBzZXA/OiBTb3VyY2VUb2tlbltdYCDigJMgU291cmNlIHRva2VucyBiZXR3ZWVuIHRoZSBrZXkgYW5kIHRoZSB2YWx1ZSxcbiAqICAgICAgIHdoaWNoIHNob3VsZCBpbmNsdWRlIHRoZSBgOmAgbWFwIHZhbHVlIGluZGljYXRvciBpZiBgdmFsdWVgIGlzIHNldC5cbiAqICAgICAtIGB2YWx1ZT86IFRva2VuYCDigJMgVGhlIHZhbHVlIG9mIGEgc2VxdWVuY2UgaXRlbSwgb3Igb2YgYSBtYXAgcGFpci5cbiAqICAgLSBgcGF0aGA6IFRoZSBzdGVwcyBmcm9tIHRoZSByb290IHRvIHRoZSBjdXJyZW50IG5vZGUsIGFzIGFuIGFycmF5IG9mXG4gKiAgICAgYFsna2V5JyB8ICd2YWx1ZScsIG51bWJlcl1gIHR1cGxlcy5cbiAqXG4gKiBUaGUgcmV0dXJuIHZhbHVlIG9mIHRoZSB2aXNpdG9yIG1heSBiZSB1c2VkIHRvIGNvbnRyb2wgdGhlIHRyYXZlcnNhbDpcbiAqICAgLSBgdW5kZWZpbmVkYCAoZGVmYXVsdCk6IERvIG5vdGhpbmcgYW5kIGNvbnRpbnVlXG4gKiAgIC0gYHZpc2l0LlNLSVBgOiBEbyBub3QgdmlzaXQgdGhlIGNoaWxkcmVuIG9mIHRoaXMgdG9rZW4sIGNvbnRpbnVlIHdpdGhcbiAqICAgICAgbmV4dCBzaWJsaW5nXG4gKiAgIC0gYHZpc2l0LkJSRUFLYDogVGVybWluYXRlIHRyYXZlcnNhbCBjb21wbGV0ZWx5XG4gKiAgIC0gYHZpc2l0LlJFTU9WRWA6IFJlbW92ZSB0aGUgY3VycmVudCBpdGVtLCB0aGVuIGNvbnRpbnVlIHdpdGggdGhlIG5leHQgb25lXG4gKiAgIC0gYG51bWJlcmA6IFNldCB0aGUgaW5kZXggb2YgdGhlIG5leHQgc3RlcC4gVGhpcyBpcyB1c2VmdWwgZXNwZWNpYWxseSBpZlxuICogICAgIHRoZSBpbmRleCBvZiB0aGUgY3VycmVudCB0b2tlbiBoYXMgY2hhbmdlZC5cbiAqICAgLSBgZnVuY3Rpb25gOiBEZWZpbmUgdGhlIG5leHQgdmlzaXRvciBmb3IgdGhpcyBpdGVtLiBBZnRlciB0aGUgb3JpZ2luYWxcbiAqICAgICB2aXNpdG9yIGlzIGNhbGxlZCBvbiBpdGVtIGVudHJ5LCBuZXh0IHZpc2l0b3JzIGFyZSBjYWxsZWQgYWZ0ZXIgaGFuZGxpbmdcbiAqICAgICBhIG5vbi1lbXB0eSBga2V5YCBhbmQgd2hlbiBleGl0aW5nIHRoZSBpdGVtLlxuICovXG5mdW5jdGlvbiB2aXNpdChjc3QsIHZpc2l0b3IpIHtcbiAgICBpZiAoJ3R5cGUnIGluIGNzdCAmJiBjc3QudHlwZSA9PT0gJ2RvY3VtZW50JylcbiAgICAgICAgY3N0ID0geyBzdGFydDogY3N0LnN0YXJ0LCB2YWx1ZTogY3N0LnZhbHVlIH07XG4gICAgX3Zpc2l0KE9iamVjdC5mcmVlemUoW10pLCBjc3QsIHZpc2l0b3IpO1xufVxuLy8gV2l0aG91dCB0aGUgYGFzIHN5bWJvbGAgY2FzdHMsIFRTIGRlY2xhcmVzIHRoZXNlIGluIHRoZSBgdmlzaXRgXG4vLyBuYW1lc3BhY2UgdXNpbmcgYHZhcmAsIGJ1dCB0aGVuIGNvbXBsYWlucyBhYm91dCB0aGF0IGJlY2F1c2Vcbi8vIGB1bmlxdWUgc3ltYm9sYCBtdXN0IGJlIGBjb25zdGAuXG4vKiogVGVybWluYXRlIHZpc2l0IHRyYXZlcnNhbCBjb21wbGV0ZWx5ICovXG52aXNpdC5CUkVBSyA9IEJSRUFLO1xuLyoqIERvIG5vdCB2aXNpdCB0aGUgY2hpbGRyZW4gb2YgdGhlIGN1cnJlbnQgaXRlbSAqL1xudmlzaXQuU0tJUCA9IFNLSVA7XG4vKiogUmVtb3ZlIHRoZSBjdXJyZW50IGl0ZW0gKi9cbnZpc2l0LlJFTU9WRSA9IFJFTU9WRTtcbi8qKiBGaW5kIHRoZSBpdGVtIGF0IGBwYXRoYCBmcm9tIGBjc3RgIGFzIHRoZSByb290ICovXG52aXNpdC5pdGVtQXRQYXRoID0gKGNzdCwgcGF0aCkgPT4ge1xuICAgIGxldCBpdGVtID0gY3N0O1xuICAgIGZvciAoY29uc3QgW2ZpZWxkLCBpbmRleF0gb2YgcGF0aCkge1xuICAgICAgICBjb25zdCB0b2sgPSBpdGVtPy5bZmllbGRdO1xuICAgICAgICBpZiAodG9rICYmICdpdGVtcycgaW4gdG9rKSB7XG4gICAgICAgICAgICBpdGVtID0gdG9rLml0ZW1zW2luZGV4XTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gaXRlbTtcbn07XG4vKipcbiAqIEdldCB0aGUgaW1tZWRpYXRlIHBhcmVudCBjb2xsZWN0aW9uIG9mIHRoZSBpdGVtIGF0IGBwYXRoYCBmcm9tIGBjc3RgIGFzIHRoZSByb290LlxuICpcbiAqIFRocm93cyBhbiBlcnJvciBpZiB0aGUgY29sbGVjdGlvbiBpcyBub3QgZm91bmQsIHdoaWNoIHNob3VsZCBuZXZlciBoYXBwZW4gaWYgdGhlIGl0ZW0gaXRzZWxmIGV4aXN0cy5cbiAqL1xudmlzaXQucGFyZW50Q29sbGVjdGlvbiA9IChjc3QsIHBhdGgpID0+IHtcbiAgICBjb25zdCBwYXJlbnQgPSB2aXNpdC5pdGVtQXRQYXRoKGNzdCwgcGF0aC5zbGljZSgwLCAtMSkpO1xuICAgIGNvbnN0IGZpZWxkID0gcGF0aFtwYXRoLmxlbmd0aCAtIDFdWzBdO1xuICAgIGNvbnN0IGNvbGwgPSBwYXJlbnQ/LltmaWVsZF07XG4gICAgaWYgKGNvbGwgJiYgJ2l0ZW1zJyBpbiBjb2xsKVxuICAgICAgICByZXR1cm4gY29sbDtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhcmVudCBjb2xsZWN0aW9uIG5vdCBmb3VuZCcpO1xufTtcbmZ1bmN0aW9uIF92aXNpdChwYXRoLCBpdGVtLCB2aXNpdG9yKSB7XG4gICAgbGV0IGN0cmwgPSB2aXNpdG9yKGl0ZW0sIHBhdGgpO1xuICAgIGlmICh0eXBlb2YgY3RybCA9PT0gJ3N5bWJvbCcpXG4gICAgICAgIHJldHVybiBjdHJsO1xuICAgIGZvciAoY29uc3QgZmllbGQgb2YgWydrZXknLCAndmFsdWUnXSkge1xuICAgICAgICBjb25zdCB0b2tlbiA9IGl0ZW1bZmllbGRdO1xuICAgICAgICBpZiAodG9rZW4gJiYgJ2l0ZW1zJyBpbiB0b2tlbikge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b2tlbi5pdGVtcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNpID0gX3Zpc2l0KE9iamVjdC5mcmVlemUocGF0aC5jb25jYXQoW1tmaWVsZCwgaV1dKSksIHRva2VuLml0ZW1zW2ldLCB2aXNpdG9yKTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNpID09PSAnbnVtYmVyJylcbiAgICAgICAgICAgICAgICAgICAgaSA9IGNpIC0gMTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjaSA9PT0gQlJFQUspXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBCUkVBSztcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjaSA9PT0gUkVNT1ZFKSB7XG4gICAgICAgICAgICAgICAgICAgIHRva2VuLml0ZW1zLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgaSAtPSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgY3RybCA9PT0gJ2Z1bmN0aW9uJyAmJiBmaWVsZCA9PT0gJ2tleScpXG4gICAgICAgICAgICAgICAgY3RybCA9IGN0cmwoaXRlbSwgcGF0aCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHR5cGVvZiBjdHJsID09PSAnZnVuY3Rpb24nID8gY3RybChpdGVtLCBwYXRoKSA6IGN0cmw7XG59XG5cbmV4cG9ydCB7IHZpc2l0IH07XG4iLCJleHBvcnQgeyBjcmVhdGVTY2FsYXJUb2tlbiwgcmVzb2x2ZUFzU2NhbGFyLCBzZXRTY2FsYXJWYWx1ZSB9IGZyb20gJy4vY3N0LXNjYWxhci5qcyc7XG5leHBvcnQgeyBzdHJpbmdpZnkgfSBmcm9tICcuL2NzdC1zdHJpbmdpZnkuanMnO1xuZXhwb3J0IHsgdmlzaXQgfSBmcm9tICcuL2NzdC12aXNpdC5qcyc7XG5cbi8qKiBUaGUgYnl0ZSBvcmRlciBtYXJrICovXG5jb25zdCBCT00gPSAnXFx1e0ZFRkZ9Jztcbi8qKiBTdGFydCBvZiBkb2MtbW9kZSAqL1xuY29uc3QgRE9DVU1FTlQgPSAnXFx4MDInOyAvLyBDMDogU3RhcnQgb2YgVGV4dFxuLyoqIFVuZXhwZWN0ZWQgZW5kIG9mIGZsb3ctbW9kZSAqL1xuY29uc3QgRkxPV19FTkQgPSAnXFx4MTgnOyAvLyBDMDogQ2FuY2VsXG4vKiogTmV4dCB0b2tlbiBpcyBhIHNjYWxhciB2YWx1ZSAqL1xuY29uc3QgU0NBTEFSID0gJ1xceDFmJzsgLy8gQzA6IFVuaXQgU2VwYXJhdG9yXG4vKiogQHJldHVybnMgYHRydWVgIGlmIGB0b2tlbmAgaXMgYSBmbG93IG9yIGJsb2NrIGNvbGxlY3Rpb24gKi9cbmNvbnN0IGlzQ29sbGVjdGlvbiA9ICh0b2tlbikgPT4gISF0b2tlbiAmJiAnaXRlbXMnIGluIHRva2VuO1xuLyoqIEByZXR1cm5zIGB0cnVlYCBpZiBgdG9rZW5gIGlzIGEgZmxvdyBvciBibG9jayBzY2FsYXI7IG5vdCBhbiBhbGlhcyAqL1xuY29uc3QgaXNTY2FsYXIgPSAodG9rZW4pID0+ICEhdG9rZW4gJiZcbiAgICAodG9rZW4udHlwZSA9PT0gJ3NjYWxhcicgfHxcbiAgICAgICAgdG9rZW4udHlwZSA9PT0gJ3NpbmdsZS1xdW90ZWQtc2NhbGFyJyB8fFxuICAgICAgICB0b2tlbi50eXBlID09PSAnZG91YmxlLXF1b3RlZC1zY2FsYXInIHx8XG4gICAgICAgIHRva2VuLnR5cGUgPT09ICdibG9jay1zY2FsYXInKTtcbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4vKiogR2V0IGEgcHJpbnRhYmxlIHJlcHJlc2VudGF0aW9uIG9mIGEgbGV4ZXIgdG9rZW4gKi9cbmZ1bmN0aW9uIHByZXR0eVRva2VuKHRva2VuKSB7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgICBjYXNlIEJPTTpcbiAgICAgICAgICAgIHJldHVybiAnPEJPTT4nO1xuICAgICAgICBjYXNlIERPQ1VNRU5UOlxuICAgICAgICAgICAgcmV0dXJuICc8RE9DPic7XG4gICAgICAgIGNhc2UgRkxPV19FTkQ6XG4gICAgICAgICAgICByZXR1cm4gJzxGTE9XX0VORD4nO1xuICAgICAgICBjYXNlIFNDQUxBUjpcbiAgICAgICAgICAgIHJldHVybiAnPFNDQUxBUj4nO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRva2VuKTtcbiAgICB9XG59XG4vKiogSWRlbnRpZnkgdGhlIHR5cGUgb2YgYSBsZXhlciB0b2tlbi4gTWF5IHJldHVybiBgbnVsbGAgZm9yIHVua25vd24gdG9rZW5zLiAqL1xuZnVuY3Rpb24gdG9rZW5UeXBlKHNvdXJjZSkge1xuICAgIHN3aXRjaCAoc291cmNlKSB7XG4gICAgICAgIGNhc2UgQk9NOlxuICAgICAgICAgICAgcmV0dXJuICdieXRlLW9yZGVyLW1hcmsnO1xuICAgICAgICBjYXNlIERPQ1VNRU5UOlxuICAgICAgICAgICAgcmV0dXJuICdkb2MtbW9kZSc7XG4gICAgICAgIGNhc2UgRkxPV19FTkQ6XG4gICAgICAgICAgICByZXR1cm4gJ2Zsb3ctZXJyb3ItZW5kJztcbiAgICAgICAgY2FzZSBTQ0FMQVI6XG4gICAgICAgICAgICByZXR1cm4gJ3NjYWxhcic7XG4gICAgICAgIGNhc2UgJy0tLSc6XG4gICAgICAgICAgICByZXR1cm4gJ2RvYy1zdGFydCc7XG4gICAgICAgIGNhc2UgJy4uLic6XG4gICAgICAgICAgICByZXR1cm4gJ2RvYy1lbmQnO1xuICAgICAgICBjYXNlICcnOlxuICAgICAgICBjYXNlICdcXG4nOlxuICAgICAgICBjYXNlICdcXHJcXG4nOlxuICAgICAgICAgICAgcmV0dXJuICduZXdsaW5lJztcbiAgICAgICAgY2FzZSAnLSc6XG4gICAgICAgICAgICByZXR1cm4gJ3NlcS1pdGVtLWluZCc7XG4gICAgICAgIGNhc2UgJz8nOlxuICAgICAgICAgICAgcmV0dXJuICdleHBsaWNpdC1rZXktaW5kJztcbiAgICAgICAgY2FzZSAnOic6XG4gICAgICAgICAgICByZXR1cm4gJ21hcC12YWx1ZS1pbmQnO1xuICAgICAgICBjYXNlICd7JzpcbiAgICAgICAgICAgIHJldHVybiAnZmxvdy1tYXAtc3RhcnQnO1xuICAgICAgICBjYXNlICd9JzpcbiAgICAgICAgICAgIHJldHVybiAnZmxvdy1tYXAtZW5kJztcbiAgICAgICAgY2FzZSAnWyc6XG4gICAgICAgICAgICByZXR1cm4gJ2Zsb3ctc2VxLXN0YXJ0JztcbiAgICAgICAgY2FzZSAnXSc6XG4gICAgICAgICAgICByZXR1cm4gJ2Zsb3ctc2VxLWVuZCc7XG4gICAgICAgIGNhc2UgJywnOlxuICAgICAgICAgICAgcmV0dXJuICdjb21tYSc7XG4gICAgfVxuICAgIHN3aXRjaCAoc291cmNlWzBdKSB7XG4gICAgICAgIGNhc2UgJyAnOlxuICAgICAgICBjYXNlICdcXHQnOlxuICAgICAgICAgICAgcmV0dXJuICdzcGFjZSc7XG4gICAgICAgIGNhc2UgJyMnOlxuICAgICAgICAgICAgcmV0dXJuICdjb21tZW50JztcbiAgICAgICAgY2FzZSAnJSc6XG4gICAgICAgICAgICByZXR1cm4gJ2RpcmVjdGl2ZS1saW5lJztcbiAgICAgICAgY2FzZSAnKic6XG4gICAgICAgICAgICByZXR1cm4gJ2FsaWFzJztcbiAgICAgICAgY2FzZSAnJic6XG4gICAgICAgICAgICByZXR1cm4gJ2FuY2hvcic7XG4gICAgICAgIGNhc2UgJyEnOlxuICAgICAgICAgICAgcmV0dXJuICd0YWcnO1xuICAgICAgICBjYXNlIFwiJ1wiOlxuICAgICAgICAgICAgcmV0dXJuICdzaW5nbGUtcXVvdGVkLXNjYWxhcic7XG4gICAgICAgIGNhc2UgJ1wiJzpcbiAgICAgICAgICAgIHJldHVybiAnZG91YmxlLXF1b3RlZC1zY2FsYXInO1xuICAgICAgICBjYXNlICd8JzpcbiAgICAgICAgY2FzZSAnPic6XG4gICAgICAgICAgICByZXR1cm4gJ2Jsb2NrLXNjYWxhci1oZWFkZXInO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IHsgQk9NLCBET0NVTUVOVCwgRkxPV19FTkQsIFNDQUxBUiwgaXNDb2xsZWN0aW9uLCBpc1NjYWxhciwgcHJldHR5VG9rZW4sIHRva2VuVHlwZSB9O1xuIiwiaW1wb3J0IHsgQk9NLCBET0NVTUVOVCwgRkxPV19FTkQsIFNDQUxBUiB9IGZyb20gJy4vY3N0LmpzJztcblxuLypcblNUQVJUIC0+IHN0cmVhbVxuXG5zdHJlYW1cbiAgZGlyZWN0aXZlIC0+IGxpbmUtZW5kIC0+IHN0cmVhbVxuICBpbmRlbnQgKyBsaW5lLWVuZCAtPiBzdHJlYW1cbiAgW2Vsc2VdIC0+IGxpbmUtc3RhcnRcblxubGluZS1lbmRcbiAgY29tbWVudCAtPiBsaW5lLWVuZFxuICBuZXdsaW5lIC0+IC5cbiAgaW5wdXQtZW5kIC0+IEVORFxuXG5saW5lLXN0YXJ0XG4gIGRvYy1zdGFydCAtPiBkb2NcbiAgZG9jLWVuZCAtPiBzdHJlYW1cbiAgW2Vsc2VdIC0+IGluZGVudCAtPiBibG9jay1zdGFydFxuXG5ibG9jay1zdGFydFxuICBzZXEtaXRlbS1zdGFydCAtPiBibG9jay1zdGFydFxuICBleHBsaWNpdC1rZXktc3RhcnQgLT4gYmxvY2stc3RhcnRcbiAgbWFwLXZhbHVlLXN0YXJ0IC0+IGJsb2NrLXN0YXJ0XG4gIFtlbHNlXSAtPiBkb2NcblxuZG9jXG4gIGxpbmUtZW5kIC0+IGxpbmUtc3RhcnRcbiAgc3BhY2VzIC0+IGRvY1xuICBhbmNob3IgLT4gZG9jXG4gIHRhZyAtPiBkb2NcbiAgZmxvdy1zdGFydCAtPiBmbG93IC0+IGRvY1xuICBmbG93LWVuZCAtPiBlcnJvciAtPiBkb2NcbiAgc2VxLWl0ZW0tc3RhcnQgLT4gZXJyb3IgLT4gZG9jXG4gIGV4cGxpY2l0LWtleS1zdGFydCAtPiBlcnJvciAtPiBkb2NcbiAgbWFwLXZhbHVlLXN0YXJ0IC0+IGRvY1xuICBhbGlhcyAtPiBkb2NcbiAgcXVvdGUtc3RhcnQgLT4gcXVvdGVkLXNjYWxhciAtPiBkb2NcbiAgYmxvY2stc2NhbGFyLWhlYWRlciAtPiBsaW5lLWVuZCAtPiBibG9jay1zY2FsYXIobWluKSAtPiBsaW5lLXN0YXJ0XG4gIFtlbHNlXSAtPiBwbGFpbi1zY2FsYXIoZmFsc2UsIG1pbikgLT4gZG9jXG5cbmZsb3dcbiAgbGluZS1lbmQgLT4gZmxvd1xuICBzcGFjZXMgLT4gZmxvd1xuICBhbmNob3IgLT4gZmxvd1xuICB0YWcgLT4gZmxvd1xuICBmbG93LXN0YXJ0IC0+IGZsb3cgLT4gZmxvd1xuICBmbG93LWVuZCAtPiAuXG4gIHNlcS1pdGVtLXN0YXJ0IC0+IGVycm9yIC0+IGZsb3dcbiAgZXhwbGljaXQta2V5LXN0YXJ0IC0+IGZsb3dcbiAgbWFwLXZhbHVlLXN0YXJ0IC0+IGZsb3dcbiAgYWxpYXMgLT4gZmxvd1xuICBxdW90ZS1zdGFydCAtPiBxdW90ZWQtc2NhbGFyIC0+IGZsb3dcbiAgY29tbWEgLT4gZmxvd1xuICBbZWxzZV0gLT4gcGxhaW4tc2NhbGFyKHRydWUsIDApIC0+IGZsb3dcblxucXVvdGVkLXNjYWxhclxuICBxdW90ZS1lbmQgLT4gLlxuICBbZWxzZV0gLT4gcXVvdGVkLXNjYWxhclxuXG5ibG9jay1zY2FsYXIobWluKVxuICBuZXdsaW5lICsgcGVlayhpbmRlbnQgPCBtaW4pIC0+IC5cbiAgW2Vsc2VdIC0+IGJsb2NrLXNjYWxhcihtaW4pXG5cbnBsYWluLXNjYWxhcihpcy1mbG93LCBtaW4pXG4gIHNjYWxhci1lbmQoaXMtZmxvdykgLT4gLlxuICBwZWVrKG5ld2xpbmUgKyAoaW5kZW50IDwgbWluKSkgLT4gLlxuICBbZWxzZV0gLT4gcGxhaW4tc2NhbGFyKG1pbilcbiovXG5mdW5jdGlvbiBpc0VtcHR5KGNoKSB7XG4gICAgc3dpdGNoIChjaCkge1xuICAgICAgICBjYXNlIHVuZGVmaW5lZDpcbiAgICAgICAgY2FzZSAnICc6XG4gICAgICAgIGNhc2UgJ1xcbic6XG4gICAgICAgIGNhc2UgJ1xccic6XG4gICAgICAgIGNhc2UgJ1xcdCc6XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5jb25zdCBoZXhEaWdpdHMgPSBuZXcgU2V0KCcwMTIzNDU2Nzg5QUJDREVGYWJjZGVmJyk7XG5jb25zdCB0YWdDaGFycyA9IG5ldyBTZXQoXCIwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei0jOy8/OkAmPSskXy4hfionKClcIik7XG5jb25zdCBmbG93SW5kaWNhdG9yQ2hhcnMgPSBuZXcgU2V0KCcsW117fScpO1xuY29uc3QgaW52YWxpZEFuY2hvckNoYXJzID0gbmV3IFNldCgnICxbXXt9XFxuXFxyXFx0Jyk7XG5jb25zdCBpc05vdEFuY2hvckNoYXIgPSAoY2gpID0+ICFjaCB8fCBpbnZhbGlkQW5jaG9yQ2hhcnMuaGFzKGNoKTtcbi8qKlxuICogU3BsaXRzIGFuIGlucHV0IHN0cmluZyBpbnRvIGxleGljYWwgdG9rZW5zLCBpLmUuIHNtYWxsZXIgc3RyaW5ncyB0aGF0IGFyZVxuICogZWFzaWx5IGlkZW50aWZpYWJsZSBieSBgdG9rZW5zLnRva2VuVHlwZSgpYC5cbiAqXG4gKiBMZXhpbmcgc3RhcnRzIGFsd2F5cyBpbiBhIFwic3RyZWFtXCIgY29udGV4dC4gSW5jb21wbGV0ZSBpbnB1dCBtYXkgYmUgYnVmZmVyZWRcbiAqIHVudGlsIGEgY29tcGxldGUgdG9rZW4gY2FuIGJlIGVtaXR0ZWQuXG4gKlxuICogSW4gYWRkaXRpb24gdG8gc2xpY2VzIG9mIHRoZSBvcmlnaW5hbCBpbnB1dCwgdGhlIGZvbGxvd2luZyBjb250cm9sIGNoYXJhY3RlcnNcbiAqIG1heSBhbHNvIGJlIGVtaXR0ZWQ6XG4gKlxuICogLSBgXFx4MDJgIChTdGFydCBvZiBUZXh0KTogQSBkb2N1bWVudCBzdGFydHMgd2l0aCB0aGUgbmV4dCB0b2tlblxuICogLSBgXFx4MThgIChDYW5jZWwpOiBVbmV4cGVjdGVkIGVuZCBvZiBmbG93LW1vZGUgKGluZGljYXRlcyBhbiBlcnJvcilcbiAqIC0gYFxceDFmYCAoVW5pdCBTZXBhcmF0b3IpOiBOZXh0IHRva2VuIGlzIGEgc2NhbGFyIHZhbHVlXG4gKiAtIGBcXHV7RkVGRn1gIChCeXRlIG9yZGVyIG1hcmspOiBFbWl0dGVkIHNlcGFyYXRlbHkgb3V0c2lkZSBkb2N1bWVudHNcbiAqL1xuY2xhc3MgTGV4ZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBidWZmZXIgbWFya3MgdGhlIGVuZCBvZlxuICAgICAgICAgKiBhbGwgaW5wdXRcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYXRFbmQgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEV4cGxpY2l0IGluZGVudCBzZXQgaW4gYmxvY2sgc2NhbGFyIGhlYWRlciwgYXMgYW4gb2Zmc2V0IGZyb20gdGhlIGN1cnJlbnRcbiAgICAgICAgICogbWluaW11bSBpbmRlbnQsIHNvIGUuZy4gc2V0IHRvIDEgZnJvbSBhIGhlYWRlciBgfDIrYC4gU2V0IHRvIC0xIGlmIG5vdFxuICAgICAgICAgKiBleHBsaWNpdGx5IHNldC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYmxvY2tTY2FsYXJJbmRlbnQgPSAtMTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEJsb2NrIHNjYWxhcnMgdGhhdCBpbmNsdWRlIGEgKyAoa2VlcCkgY2hvbXBpbmcgaW5kaWNhdG9yIGluIHRoZWlyIGhlYWRlclxuICAgICAgICAgKiBpbmNsdWRlIHRyYWlsaW5nIGVtcHR5IGxpbmVzLCB3aGljaCBhcmUgb3RoZXJ3aXNlIGV4Y2x1ZGVkIGZyb20gdGhlXG4gICAgICAgICAqIHNjYWxhcidzIGNvbnRlbnRzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5ibG9ja1NjYWxhcktlZXAgPSBmYWxzZTtcbiAgICAgICAgLyoqIEN1cnJlbnQgaW5wdXQgKi9cbiAgICAgICAgdGhpcy5idWZmZXIgPSAnJztcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZsYWcgbm90aW5nIHdoZXRoZXIgdGhlIG1hcCB2YWx1ZSBpbmRpY2F0b3IgOiBjYW4gaW1tZWRpYXRlbHkgZm9sbG93IHRoaXNcbiAgICAgICAgICogbm9kZSB3aXRoaW4gYSBmbG93IGNvbnRleHQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmZsb3dLZXkgPSBmYWxzZTtcbiAgICAgICAgLyoqIENvdW50IG9mIHN1cnJvdW5kaW5nIGZsb3cgY29sbGVjdGlvbiBsZXZlbHMuICovXG4gICAgICAgIHRoaXMuZmxvd0xldmVsID0gMDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIE1pbmltdW0gbGV2ZWwgb2YgaW5kZW50YXRpb24gcmVxdWlyZWQgZm9yIG5leHQgbGluZXMgdG8gYmUgcGFyc2VkIGFzIGFcbiAgICAgICAgICogcGFydCBvZiB0aGUgY3VycmVudCBzY2FsYXIgdmFsdWUuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmluZGVudE5leHQgPSAwO1xuICAgICAgICAvKiogSW5kZW50YXRpb24gbGV2ZWwgb2YgdGhlIGN1cnJlbnQgbGluZS4gKi9cbiAgICAgICAgdGhpcy5pbmRlbnRWYWx1ZSA9IDA7XG4gICAgICAgIC8qKiBQb3NpdGlvbiBvZiB0aGUgbmV4dCBcXG4gY2hhcmFjdGVyLiAqL1xuICAgICAgICB0aGlzLmxpbmVFbmRQb3MgPSBudWxsO1xuICAgICAgICAvKiogU3RvcmVzIHRoZSBzdGF0ZSBvZiB0aGUgbGV4ZXIgaWYgcmVhY2hpbmcgdGhlIGVuZCBvZiBpbmNwb21wbGV0ZSBpbnB1dCAqL1xuICAgICAgICB0aGlzLm5leHQgPSBudWxsO1xuICAgICAgICAvKiogQSBwb2ludGVyIHRvIGBidWZmZXJgOyB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGUgbGV4ZXIuICovXG4gICAgICAgIHRoaXMucG9zID0gMDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2VuZXJhdGUgWUFNTCB0b2tlbnMgZnJvbSB0aGUgYHNvdXJjZWAgc3RyaW5nLiBJZiBgaW5jb21wbGV0ZWAsXG4gICAgICogYSBwYXJ0IG9mIHRoZSBsYXN0IGxpbmUgbWF5IGJlIGxlZnQgYXMgYSBidWZmZXIgZm9yIHRoZSBuZXh0IGNhbGwuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBIGdlbmVyYXRvciBvZiBsZXhpY2FsIHRva2Vuc1xuICAgICAqL1xuICAgICpsZXgoc291cmNlLCBpbmNvbXBsZXRlID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKHNvdXJjZSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBzb3VyY2UgIT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcignc291cmNlIGlzIG5vdCBhIHN0cmluZycpO1xuICAgICAgICAgICAgdGhpcy5idWZmZXIgPSB0aGlzLmJ1ZmZlciA/IHRoaXMuYnVmZmVyICsgc291cmNlIDogc291cmNlO1xuICAgICAgICAgICAgdGhpcy5saW5lRW5kUG9zID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmF0RW5kID0gIWluY29tcGxldGU7XG4gICAgICAgIGxldCBuZXh0ID0gdGhpcy5uZXh0ID8/ICdzdHJlYW0nO1xuICAgICAgICB3aGlsZSAobmV4dCAmJiAoaW5jb21wbGV0ZSB8fCB0aGlzLmhhc0NoYXJzKDEpKSlcbiAgICAgICAgICAgIG5leHQgPSB5aWVsZCogdGhpcy5wYXJzZU5leHQobmV4dCk7XG4gICAgfVxuICAgIGF0TGluZUVuZCgpIHtcbiAgICAgICAgbGV0IGkgPSB0aGlzLnBvcztcbiAgICAgICAgbGV0IGNoID0gdGhpcy5idWZmZXJbaV07XG4gICAgICAgIHdoaWxlIChjaCA9PT0gJyAnIHx8IGNoID09PSAnXFx0JylcbiAgICAgICAgICAgIGNoID0gdGhpcy5idWZmZXJbKytpXTtcbiAgICAgICAgaWYgKCFjaCB8fCBjaCA9PT0gJyMnIHx8IGNoID09PSAnXFxuJylcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAoY2ggPT09ICdcXHInKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyW2kgKyAxXSA9PT0gJ1xcbic7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY2hhckF0KG4pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyW3RoaXMucG9zICsgbl07XG4gICAgfVxuICAgIGNvbnRpbnVlU2NhbGFyKG9mZnNldCkge1xuICAgICAgICBsZXQgY2ggPSB0aGlzLmJ1ZmZlcltvZmZzZXRdO1xuICAgICAgICBpZiAodGhpcy5pbmRlbnROZXh0ID4gMCkge1xuICAgICAgICAgICAgbGV0IGluZGVudCA9IDA7XG4gICAgICAgICAgICB3aGlsZSAoY2ggPT09ICcgJylcbiAgICAgICAgICAgICAgICBjaCA9IHRoaXMuYnVmZmVyWysraW5kZW50ICsgb2Zmc2V0XTtcbiAgICAgICAgICAgIGlmIChjaCA9PT0gJ1xccicpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXh0ID0gdGhpcy5idWZmZXJbaW5kZW50ICsgb2Zmc2V0ICsgMV07XG4gICAgICAgICAgICAgICAgaWYgKG5leHQgPT09ICdcXG4nIHx8ICghbmV4dCAmJiAhdGhpcy5hdEVuZCkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvZmZzZXQgKyBpbmRlbnQgKyAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNoID09PSAnXFxuJyB8fCBpbmRlbnQgPj0gdGhpcy5pbmRlbnROZXh0IHx8ICghY2ggJiYgIXRoaXMuYXRFbmQpXG4gICAgICAgICAgICAgICAgPyBvZmZzZXQgKyBpbmRlbnRcbiAgICAgICAgICAgICAgICA6IC0xO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaCA9PT0gJy0nIHx8IGNoID09PSAnLicpIHtcbiAgICAgICAgICAgIGNvbnN0IGR0ID0gdGhpcy5idWZmZXIuc3Vic3RyKG9mZnNldCwgMyk7XG4gICAgICAgICAgICBpZiAoKGR0ID09PSAnLS0tJyB8fCBkdCA9PT0gJy4uLicpICYmIGlzRW1wdHkodGhpcy5idWZmZXJbb2Zmc2V0ICsgM10pKVxuICAgICAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2Zmc2V0O1xuICAgIH1cbiAgICBnZXRMaW5lKCkge1xuICAgICAgICBsZXQgZW5kID0gdGhpcy5saW5lRW5kUG9zO1xuICAgICAgICBpZiAodHlwZW9mIGVuZCAhPT0gJ251bWJlcicgfHwgKGVuZCAhPT0gLTEgJiYgZW5kIDwgdGhpcy5wb3MpKSB7XG4gICAgICAgICAgICBlbmQgPSB0aGlzLmJ1ZmZlci5pbmRleE9mKCdcXG4nLCB0aGlzLnBvcyk7XG4gICAgICAgICAgICB0aGlzLmxpbmVFbmRQb3MgPSBlbmQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVuZCA9PT0gLTEpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hdEVuZCA/IHRoaXMuYnVmZmVyLnN1YnN0cmluZyh0aGlzLnBvcykgOiBudWxsO1xuICAgICAgICBpZiAodGhpcy5idWZmZXJbZW5kIC0gMV0gPT09ICdcXHInKVxuICAgICAgICAgICAgZW5kIC09IDE7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1ZmZlci5zdWJzdHJpbmcodGhpcy5wb3MsIGVuZCk7XG4gICAgfVxuICAgIGhhc0NoYXJzKG4pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zICsgbiA8PSB0aGlzLmJ1ZmZlci5sZW5ndGg7XG4gICAgfVxuICAgIHNldE5leHQoc3RhdGUpIHtcbiAgICAgICAgdGhpcy5idWZmZXIgPSB0aGlzLmJ1ZmZlci5zdWJzdHJpbmcodGhpcy5wb3MpO1xuICAgICAgICB0aGlzLnBvcyA9IDA7XG4gICAgICAgIHRoaXMubGluZUVuZFBvcyA9IG51bGw7XG4gICAgICAgIHRoaXMubmV4dCA9IHN0YXRlO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcGVlayhuKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1ZmZlci5zdWJzdHIodGhpcy5wb3MsIG4pO1xuICAgIH1cbiAgICAqcGFyc2VOZXh0KG5leHQpIHtcbiAgICAgICAgc3dpdGNoIChuZXh0KSB7XG4gICAgICAgICAgICBjYXNlICdzdHJlYW0nOlxuICAgICAgICAgICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5wYXJzZVN0cmVhbSgpO1xuICAgICAgICAgICAgY2FzZSAnbGluZS1zdGFydCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiB0aGlzLnBhcnNlTGluZVN0YXJ0KCk7XG4gICAgICAgICAgICBjYXNlICdibG9jay1zdGFydCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiB0aGlzLnBhcnNlQmxvY2tTdGFydCgpO1xuICAgICAgICAgICAgY2FzZSAnZG9jJzpcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucGFyc2VEb2N1bWVudCgpO1xuICAgICAgICAgICAgY2FzZSAnZmxvdyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiB0aGlzLnBhcnNlRmxvd0NvbGxlY3Rpb24oKTtcbiAgICAgICAgICAgIGNhc2UgJ3F1b3RlZC1zY2FsYXInOlxuICAgICAgICAgICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5wYXJzZVF1b3RlZFNjYWxhcigpO1xuICAgICAgICAgICAgY2FzZSAnYmxvY2stc2NhbGFyJzpcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucGFyc2VCbG9ja1NjYWxhcigpO1xuICAgICAgICAgICAgY2FzZSAncGxhaW4tc2NhbGFyJzpcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucGFyc2VQbGFpblNjYWxhcigpO1xuICAgICAgICB9XG4gICAgfVxuICAgICpwYXJzZVN0cmVhbSgpIHtcbiAgICAgICAgbGV0IGxpbmUgPSB0aGlzLmdldExpbmUoKTtcbiAgICAgICAgaWYgKGxpbmUgPT09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZXROZXh0KCdzdHJlYW0nKTtcbiAgICAgICAgaWYgKGxpbmVbMF0gPT09IEJPTSkge1xuICAgICAgICAgICAgeWllbGQqIHRoaXMucHVzaENvdW50KDEpO1xuICAgICAgICAgICAgbGluZSA9IGxpbmUuc3Vic3RyaW5nKDEpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsaW5lWzBdID09PSAnJScpIHtcbiAgICAgICAgICAgIGxldCBkaXJFbmQgPSBsaW5lLmxlbmd0aDtcbiAgICAgICAgICAgIGxldCBjcyA9IGxpbmUuaW5kZXhPZignIycpO1xuICAgICAgICAgICAgd2hpbGUgKGNzICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoID0gbGluZVtjcyAtIDFdO1xuICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJyAnIHx8IGNoID09PSAnXFx0Jykge1xuICAgICAgICAgICAgICAgICAgICBkaXJFbmQgPSBjcyAtIDE7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY3MgPSBsaW5lLmluZGV4T2YoJyMnLCBjcyArIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2ggPSBsaW5lW2RpckVuZCAtIDFdO1xuICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJyAnIHx8IGNoID09PSAnXFx0JylcbiAgICAgICAgICAgICAgICAgICAgZGlyRW5kIC09IDE7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG4gPSAoeWllbGQqIHRoaXMucHVzaENvdW50KGRpckVuZCkpICsgKHlpZWxkKiB0aGlzLnB1c2hTcGFjZXModHJ1ZSkpO1xuICAgICAgICAgICAgeWllbGQqIHRoaXMucHVzaENvdW50KGxpbmUubGVuZ3RoIC0gbik7IC8vIHBvc3NpYmxlIGNvbW1lbnRcbiAgICAgICAgICAgIHRoaXMucHVzaE5ld2xpbmUoKTtcbiAgICAgICAgICAgIHJldHVybiAnc3RyZWFtJztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5hdExpbmVFbmQoKSkge1xuICAgICAgICAgICAgY29uc3Qgc3AgPSB5aWVsZCogdGhpcy5wdXNoU3BhY2VzKHRydWUpO1xuICAgICAgICAgICAgeWllbGQqIHRoaXMucHVzaENvdW50KGxpbmUubGVuZ3RoIC0gc3ApO1xuICAgICAgICAgICAgeWllbGQqIHRoaXMucHVzaE5ld2xpbmUoKTtcbiAgICAgICAgICAgIHJldHVybiAnc3RyZWFtJztcbiAgICAgICAgfVxuICAgICAgICB5aWVsZCBET0NVTUVOVDtcbiAgICAgICAgcmV0dXJuIHlpZWxkKiB0aGlzLnBhcnNlTGluZVN0YXJ0KCk7XG4gICAgfVxuICAgICpwYXJzZUxpbmVTdGFydCgpIHtcbiAgICAgICAgY29uc3QgY2ggPSB0aGlzLmNoYXJBdCgwKTtcbiAgICAgICAgaWYgKCFjaCAmJiAhdGhpcy5hdEVuZClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNldE5leHQoJ2xpbmUtc3RhcnQnKTtcbiAgICAgICAgaWYgKGNoID09PSAnLScgfHwgY2ggPT09ICcuJykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmF0RW5kICYmICF0aGlzLmhhc0NoYXJzKDQpKVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNldE5leHQoJ2xpbmUtc3RhcnQnKTtcbiAgICAgICAgICAgIGNvbnN0IHMgPSB0aGlzLnBlZWsoMyk7XG4gICAgICAgICAgICBpZiAoKHMgPT09ICctLS0nIHx8IHMgPT09ICcuLi4nKSAmJiBpc0VtcHR5KHRoaXMuY2hhckF0KDMpKSkge1xuICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnB1c2hDb3VudCgzKTtcbiAgICAgICAgICAgICAgICB0aGlzLmluZGVudFZhbHVlID0gMDtcbiAgICAgICAgICAgICAgICB0aGlzLmluZGVudE5leHQgPSAwO1xuICAgICAgICAgICAgICAgIHJldHVybiBzID09PSAnLS0tJyA/ICdkb2MnIDogJ3N0cmVhbSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbmRlbnRWYWx1ZSA9IHlpZWxkKiB0aGlzLnB1c2hTcGFjZXMoZmFsc2UpO1xuICAgICAgICBpZiAodGhpcy5pbmRlbnROZXh0ID4gdGhpcy5pbmRlbnRWYWx1ZSAmJiAhaXNFbXB0eSh0aGlzLmNoYXJBdCgxKSkpXG4gICAgICAgICAgICB0aGlzLmluZGVudE5leHQgPSB0aGlzLmluZGVudFZhbHVlO1xuICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucGFyc2VCbG9ja1N0YXJ0KCk7XG4gICAgfVxuICAgICpwYXJzZUJsb2NrU3RhcnQoKSB7XG4gICAgICAgIGNvbnN0IFtjaDAsIGNoMV0gPSB0aGlzLnBlZWsoMik7XG4gICAgICAgIGlmICghY2gxICYmICF0aGlzLmF0RW5kKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0TmV4dCgnYmxvY2stc3RhcnQnKTtcbiAgICAgICAgaWYgKChjaDAgPT09ICctJyB8fCBjaDAgPT09ICc/JyB8fCBjaDAgPT09ICc6JykgJiYgaXNFbXB0eShjaDEpKSB7XG4gICAgICAgICAgICBjb25zdCBuID0gKHlpZWxkKiB0aGlzLnB1c2hDb3VudCgxKSkgKyAoeWllbGQqIHRoaXMucHVzaFNwYWNlcyh0cnVlKSk7XG4gICAgICAgICAgICB0aGlzLmluZGVudE5leHQgPSB0aGlzLmluZGVudFZhbHVlICsgMTtcbiAgICAgICAgICAgIHRoaXMuaW5kZW50VmFsdWUgKz0gbjtcbiAgICAgICAgICAgIHJldHVybiAnYmxvY2stc3RhcnQnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnZG9jJztcbiAgICB9XG4gICAgKnBhcnNlRG9jdW1lbnQoKSB7XG4gICAgICAgIHlpZWxkKiB0aGlzLnB1c2hTcGFjZXModHJ1ZSk7XG4gICAgICAgIGNvbnN0IGxpbmUgPSB0aGlzLmdldExpbmUoKTtcbiAgICAgICAgaWYgKGxpbmUgPT09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZXROZXh0KCdkb2MnKTtcbiAgICAgICAgbGV0IG4gPSB5aWVsZCogdGhpcy5wdXNoSW5kaWNhdG9ycygpO1xuICAgICAgICBzd2l0Y2ggKGxpbmVbbl0pIHtcbiAgICAgICAgICAgIGNhc2UgJyMnOlxuICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnB1c2hDb3VudChsaW5lLmxlbmd0aCAtIG4pO1xuICAgICAgICAgICAgLy8gZmFsbHRocm91Z2hcbiAgICAgICAgICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnB1c2hOZXdsaW5lKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiB0aGlzLnBhcnNlTGluZVN0YXJ0KCk7XG4gICAgICAgICAgICBjYXNlICd7JzpcbiAgICAgICAgICAgIGNhc2UgJ1snOlxuICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnB1c2hDb3VudCgxKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZsb3dLZXkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmZsb3dMZXZlbCA9IDE7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdmbG93JztcbiAgICAgICAgICAgIGNhc2UgJ30nOlxuICAgICAgICAgICAgY2FzZSAnXSc6XG4gICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhbiBlcnJvclxuICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnB1c2hDb3VudCgxKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2RvYyc7XG4gICAgICAgICAgICBjYXNlICcqJzpcbiAgICAgICAgICAgICAgICB5aWVsZCogdGhpcy5wdXNoVW50aWwoaXNOb3RBbmNob3JDaGFyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2RvYyc7XG4gICAgICAgICAgICBjYXNlICdcIic6XG4gICAgICAgICAgICBjYXNlIFwiJ1wiOlxuICAgICAgICAgICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5wYXJzZVF1b3RlZFNjYWxhcigpO1xuICAgICAgICAgICAgY2FzZSAnfCc6XG4gICAgICAgICAgICBjYXNlICc+JzpcbiAgICAgICAgICAgICAgICBuICs9IHlpZWxkKiB0aGlzLnBhcnNlQmxvY2tTY2FsYXJIZWFkZXIoKTtcbiAgICAgICAgICAgICAgICBuICs9IHlpZWxkKiB0aGlzLnB1c2hTcGFjZXModHJ1ZSk7XG4gICAgICAgICAgICAgICAgeWllbGQqIHRoaXMucHVzaENvdW50KGxpbmUubGVuZ3RoIC0gbik7XG4gICAgICAgICAgICAgICAgeWllbGQqIHRoaXMucHVzaE5ld2xpbmUoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucGFyc2VCbG9ja1NjYWxhcigpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucGFyc2VQbGFpblNjYWxhcigpO1xuICAgICAgICB9XG4gICAgfVxuICAgICpwYXJzZUZsb3dDb2xsZWN0aW9uKCkge1xuICAgICAgICBsZXQgbmwsIHNwO1xuICAgICAgICBsZXQgaW5kZW50ID0gLTE7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIG5sID0geWllbGQqIHRoaXMucHVzaE5ld2xpbmUoKTtcbiAgICAgICAgICAgIGlmIChubCA+IDApIHtcbiAgICAgICAgICAgICAgICBzcCA9IHlpZWxkKiB0aGlzLnB1c2hTcGFjZXMoZmFsc2UpO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5kZW50VmFsdWUgPSBpbmRlbnQgPSBzcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHNwID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNwICs9IHlpZWxkKiB0aGlzLnB1c2hTcGFjZXModHJ1ZSk7XG4gICAgICAgIH0gd2hpbGUgKG5sICsgc3AgPiAwKTtcbiAgICAgICAgY29uc3QgbGluZSA9IHRoaXMuZ2V0TGluZSgpO1xuICAgICAgICBpZiAobGluZSA9PT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNldE5leHQoJ2Zsb3cnKTtcbiAgICAgICAgaWYgKChpbmRlbnQgIT09IC0xICYmIGluZGVudCA8IHRoaXMuaW5kZW50TmV4dCAmJiBsaW5lWzBdICE9PSAnIycpIHx8XG4gICAgICAgICAgICAoaW5kZW50ID09PSAwICYmXG4gICAgICAgICAgICAgICAgKGxpbmUuc3RhcnRzV2l0aCgnLS0tJykgfHwgbGluZS5zdGFydHNXaXRoKCcuLi4nKSkgJiZcbiAgICAgICAgICAgICAgICBpc0VtcHR5KGxpbmVbM10pKSkge1xuICAgICAgICAgICAgLy8gQWxsb3dpbmcgZm9yIHRoZSB0ZXJtaW5hbCBdIG9yIH0gYXQgdGhlIHNhbWUgKHJhdGhlciB0aGFuIGdyZWF0ZXIpXG4gICAgICAgICAgICAvLyBpbmRlbnQgbGV2ZWwgYXMgdGhlIGluaXRpYWwgWyBvciB7IGlzIHRlY2huaWNhbGx5IGludmFsaWQsIGJ1dFxuICAgICAgICAgICAgLy8gZmFpbGluZyBoZXJlIHdvdWxkIGJlIHN1cnByaXNpbmcgdG8gdXNlcnMuXG4gICAgICAgICAgICBjb25zdCBhdEZsb3dFbmRNYXJrZXIgPSBpbmRlbnQgPT09IHRoaXMuaW5kZW50TmV4dCAtIDEgJiZcbiAgICAgICAgICAgICAgICB0aGlzLmZsb3dMZXZlbCA9PT0gMSAmJlxuICAgICAgICAgICAgICAgIChsaW5lWzBdID09PSAnXScgfHwgbGluZVswXSA9PT0gJ30nKTtcbiAgICAgICAgICAgIGlmICghYXRGbG93RW5kTWFya2VyKSB7XG4gICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhbiBlcnJvclxuICAgICAgICAgICAgICAgIHRoaXMuZmxvd0xldmVsID0gMDtcbiAgICAgICAgICAgICAgICB5aWVsZCBGTE9XX0VORDtcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucGFyc2VMaW5lU3RhcnQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgbiA9IDA7XG4gICAgICAgIHdoaWxlIChsaW5lW25dID09PSAnLCcpIHtcbiAgICAgICAgICAgIG4gKz0geWllbGQqIHRoaXMucHVzaENvdW50KDEpO1xuICAgICAgICAgICAgbiArPSB5aWVsZCogdGhpcy5wdXNoU3BhY2VzKHRydWUpO1xuICAgICAgICAgICAgdGhpcy5mbG93S2V5ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgbiArPSB5aWVsZCogdGhpcy5wdXNoSW5kaWNhdG9ycygpO1xuICAgICAgICBzd2l0Y2ggKGxpbmVbbl0pIHtcbiAgICAgICAgICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgICAgICAgICAgIHJldHVybiAnZmxvdyc7XG4gICAgICAgICAgICBjYXNlICcjJzpcbiAgICAgICAgICAgICAgICB5aWVsZCogdGhpcy5wdXNoQ291bnQobGluZS5sZW5ndGggLSBuKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2Zsb3cnO1xuICAgICAgICAgICAgY2FzZSAneyc6XG4gICAgICAgICAgICBjYXNlICdbJzpcbiAgICAgICAgICAgICAgICB5aWVsZCogdGhpcy5wdXNoQ291bnQoMSk7XG4gICAgICAgICAgICAgICAgdGhpcy5mbG93S2V5ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5mbG93TGV2ZWwgKz0gMTtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2Zsb3cnO1xuICAgICAgICAgICAgY2FzZSAnfSc6XG4gICAgICAgICAgICBjYXNlICddJzpcbiAgICAgICAgICAgICAgICB5aWVsZCogdGhpcy5wdXNoQ291bnQoMSk7XG4gICAgICAgICAgICAgICAgdGhpcy5mbG93S2V5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmZsb3dMZXZlbCAtPSAxO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZsb3dMZXZlbCA/ICdmbG93JyA6ICdkb2MnO1xuICAgICAgICAgICAgY2FzZSAnKic6XG4gICAgICAgICAgICAgICAgeWllbGQqIHRoaXMucHVzaFVudGlsKGlzTm90QW5jaG9yQ2hhcik7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdmbG93JztcbiAgICAgICAgICAgIGNhc2UgJ1wiJzpcbiAgICAgICAgICAgIGNhc2UgXCInXCI6XG4gICAgICAgICAgICAgICAgdGhpcy5mbG93S2V5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucGFyc2VRdW90ZWRTY2FsYXIoKTtcbiAgICAgICAgICAgIGNhc2UgJzonOiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IHRoaXMuY2hhckF0KDEpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmZsb3dLZXkgfHwgaXNFbXB0eShuZXh0KSB8fCBuZXh0ID09PSAnLCcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mbG93S2V5ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnB1c2hDb3VudCgxKTtcbiAgICAgICAgICAgICAgICAgICAgeWllbGQqIHRoaXMucHVzaFNwYWNlcyh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdmbG93JztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBmYWxsdGhyb3VnaFxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aGlzLmZsb3dLZXkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucGFyc2VQbGFpblNjYWxhcigpO1xuICAgICAgICB9XG4gICAgfVxuICAgICpwYXJzZVF1b3RlZFNjYWxhcigpIHtcbiAgICAgICAgY29uc3QgcXVvdGUgPSB0aGlzLmNoYXJBdCgwKTtcbiAgICAgICAgbGV0IGVuZCA9IHRoaXMuYnVmZmVyLmluZGV4T2YocXVvdGUsIHRoaXMucG9zICsgMSk7XG4gICAgICAgIGlmIChxdW90ZSA9PT0gXCInXCIpIHtcbiAgICAgICAgICAgIHdoaWxlIChlbmQgIT09IC0xICYmIHRoaXMuYnVmZmVyW2VuZCArIDFdID09PSBcIidcIilcbiAgICAgICAgICAgICAgICBlbmQgPSB0aGlzLmJ1ZmZlci5pbmRleE9mKFwiJ1wiLCBlbmQgKyAyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIGRvdWJsZS1xdW90ZVxuICAgICAgICAgICAgd2hpbGUgKGVuZCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBsZXQgbiA9IDA7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHRoaXMuYnVmZmVyW2VuZCAtIDEgLSBuXSA9PT0gJ1xcXFwnKVxuICAgICAgICAgICAgICAgICAgICBuICs9IDE7XG4gICAgICAgICAgICAgICAgaWYgKG4gJSAyID09PSAwKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBlbmQgPSB0aGlzLmJ1ZmZlci5pbmRleE9mKCdcIicsIGVuZCArIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIE9ubHkgbG9va2luZyBmb3IgbmV3bGluZXMgd2l0aGluIHRoZSBxdW90ZXNcbiAgICAgICAgY29uc3QgcWIgPSB0aGlzLmJ1ZmZlci5zdWJzdHJpbmcoMCwgZW5kKTtcbiAgICAgICAgbGV0IG5sID0gcWIuaW5kZXhPZignXFxuJywgdGhpcy5wb3MpO1xuICAgICAgICBpZiAobmwgIT09IC0xKSB7XG4gICAgICAgICAgICB3aGlsZSAobmwgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY3MgPSB0aGlzLmNvbnRpbnVlU2NhbGFyKG5sICsgMSk7XG4gICAgICAgICAgICAgICAgaWYgKGNzID09PSAtMSlcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgbmwgPSBxYi5pbmRleE9mKCdcXG4nLCBjcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobmwgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhbiBlcnJvciBjYXVzZWQgYnkgYW4gdW5leHBlY3RlZCB1bmluZGVudFxuICAgICAgICAgICAgICAgIGVuZCA9IG5sIC0gKHFiW25sIC0gMV0gPT09ICdcXHInID8gMiA6IDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChlbmQgPT09IC0xKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuYXRFbmQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0TmV4dCgncXVvdGVkLXNjYWxhcicpO1xuICAgICAgICAgICAgZW5kID0gdGhpcy5idWZmZXIubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIHlpZWxkKiB0aGlzLnB1c2hUb0luZGV4KGVuZCArIDEsIGZhbHNlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmxvd0xldmVsID8gJ2Zsb3cnIDogJ2RvYyc7XG4gICAgfVxuICAgICpwYXJzZUJsb2NrU2NhbGFySGVhZGVyKCkge1xuICAgICAgICB0aGlzLmJsb2NrU2NhbGFySW5kZW50ID0gLTE7XG4gICAgICAgIHRoaXMuYmxvY2tTY2FsYXJLZWVwID0gZmFsc2U7XG4gICAgICAgIGxldCBpID0gdGhpcy5wb3M7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICBjb25zdCBjaCA9IHRoaXMuYnVmZmVyWysraV07XG4gICAgICAgICAgICBpZiAoY2ggPT09ICcrJylcbiAgICAgICAgICAgICAgICB0aGlzLmJsb2NrU2NhbGFyS2VlcCA9IHRydWU7XG4gICAgICAgICAgICBlbHNlIGlmIChjaCA+ICcwJyAmJiBjaCA8PSAnOScpXG4gICAgICAgICAgICAgICAgdGhpcy5ibG9ja1NjYWxhckluZGVudCA9IE51bWJlcihjaCkgLSAxO1xuICAgICAgICAgICAgZWxzZSBpZiAoY2ggIT09ICctJylcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucHVzaFVudGlsKGNoID0+IGlzRW1wdHkoY2gpIHx8IGNoID09PSAnIycpO1xuICAgIH1cbiAgICAqcGFyc2VCbG9ja1NjYWxhcigpIHtcbiAgICAgICAgbGV0IG5sID0gdGhpcy5wb3MgLSAxOyAvLyBtYXkgYmUgLTEgaWYgdGhpcy5wb3MgPT09IDBcbiAgICAgICAgbGV0IGluZGVudCA9IDA7XG4gICAgICAgIGxldCBjaDtcbiAgICAgICAgbG9vcDogZm9yIChsZXQgaSA9IHRoaXMucG9zOyAoY2ggPSB0aGlzLmJ1ZmZlcltpXSk7ICsraSkge1xuICAgICAgICAgICAgc3dpdGNoIChjaCkge1xuICAgICAgICAgICAgICAgIGNhc2UgJyAnOlxuICAgICAgICAgICAgICAgICAgICBpbmRlbnQgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnXFxuJzpcbiAgICAgICAgICAgICAgICAgICAgbmwgPSBpO1xuICAgICAgICAgICAgICAgICAgICBpbmRlbnQgPSAwO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdcXHInOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHQgPSB0aGlzLmJ1ZmZlcltpICsgMV07XG4gICAgICAgICAgICAgICAgICAgIGlmICghbmV4dCAmJiAhdGhpcy5hdEVuZClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNldE5leHQoJ2Jsb2NrLXNjYWxhcicpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobmV4dCA9PT0gJ1xcbicpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9IC8vIGZhbGx0aHJvdWdoXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgYnJlYWsgbG9vcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNoICYmICF0aGlzLmF0RW5kKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0TmV4dCgnYmxvY2stc2NhbGFyJyk7XG4gICAgICAgIGlmIChpbmRlbnQgPj0gdGhpcy5pbmRlbnROZXh0KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5ibG9ja1NjYWxhckluZGVudCA9PT0gLTEpXG4gICAgICAgICAgICAgICAgdGhpcy5pbmRlbnROZXh0ID0gaW5kZW50O1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbmRlbnROZXh0ID1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ibG9ja1NjYWxhckluZGVudCArICh0aGlzLmluZGVudE5leHQgPT09IDAgPyAxIDogdGhpcy5pbmRlbnROZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjcyA9IHRoaXMuY29udGludWVTY2FsYXIobmwgKyAxKTtcbiAgICAgICAgICAgICAgICBpZiAoY3MgPT09IC0xKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBubCA9IHRoaXMuYnVmZmVyLmluZGV4T2YoJ1xcbicsIGNzKTtcbiAgICAgICAgICAgIH0gd2hpbGUgKG5sICE9PSAtMSk7XG4gICAgICAgICAgICBpZiAobmwgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmF0RW5kKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zZXROZXh0KCdibG9jay1zY2FsYXInKTtcbiAgICAgICAgICAgICAgICBubCA9IHRoaXMuYnVmZmVyLmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBUcmFpbGluZyBpbnN1ZmZpY2llbnRseSBpbmRlbnRlZCB0YWJzIGFyZSBpbnZhbGlkLlxuICAgICAgICAvLyBUbyBjYXRjaCB0aGF0IGR1cmluZyBwYXJzaW5nLCB3ZSBpbmNsdWRlIHRoZW0gaW4gdGhlIGJsb2NrIHNjYWxhciB2YWx1ZS5cbiAgICAgICAgbGV0IGkgPSBubCArIDE7XG4gICAgICAgIGNoID0gdGhpcy5idWZmZXJbaV07XG4gICAgICAgIHdoaWxlIChjaCA9PT0gJyAnKVxuICAgICAgICAgICAgY2ggPSB0aGlzLmJ1ZmZlclsrK2ldO1xuICAgICAgICBpZiAoY2ggPT09ICdcXHQnKSB7XG4gICAgICAgICAgICB3aGlsZSAoY2ggPT09ICdcXHQnIHx8IGNoID09PSAnICcgfHwgY2ggPT09ICdcXHInIHx8IGNoID09PSAnXFxuJylcbiAgICAgICAgICAgICAgICBjaCA9IHRoaXMuYnVmZmVyWysraV07XG4gICAgICAgICAgICBubCA9IGkgLSAxO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCF0aGlzLmJsb2NrU2NhbGFyS2VlcCkge1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgIGxldCBpID0gbmwgLSAxO1xuICAgICAgICAgICAgICAgIGxldCBjaCA9IHRoaXMuYnVmZmVyW2ldO1xuICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJ1xccicpXG4gICAgICAgICAgICAgICAgICAgIGNoID0gdGhpcy5idWZmZXJbLS1pXTtcbiAgICAgICAgICAgICAgICBjb25zdCBsYXN0Q2hhciA9IGk7IC8vIERyb3AgdGhlIGxpbmUgaWYgbGFzdCBjaGFyIG5vdCBtb3JlIGluZGVudGVkXG4gICAgICAgICAgICAgICAgd2hpbGUgKGNoID09PSAnICcpXG4gICAgICAgICAgICAgICAgICAgIGNoID0gdGhpcy5idWZmZXJbLS1pXTtcbiAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICdcXG4nICYmIGkgPj0gdGhpcy5wb3MgJiYgaSArIDEgKyBpbmRlbnQgPiBsYXN0Q2hhcilcbiAgICAgICAgICAgICAgICAgICAgbmwgPSBpO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9IHdoaWxlICh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICB5aWVsZCBTQ0FMQVI7XG4gICAgICAgIHlpZWxkKiB0aGlzLnB1c2hUb0luZGV4KG5sICsgMSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5wYXJzZUxpbmVTdGFydCgpO1xuICAgIH1cbiAgICAqcGFyc2VQbGFpblNjYWxhcigpIHtcbiAgICAgICAgY29uc3QgaW5GbG93ID0gdGhpcy5mbG93TGV2ZWwgPiAwO1xuICAgICAgICBsZXQgZW5kID0gdGhpcy5wb3MgLSAxO1xuICAgICAgICBsZXQgaSA9IHRoaXMucG9zIC0gMTtcbiAgICAgICAgbGV0IGNoO1xuICAgICAgICB3aGlsZSAoKGNoID0gdGhpcy5idWZmZXJbKytpXSkpIHtcbiAgICAgICAgICAgIGlmIChjaCA9PT0gJzonKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IHRoaXMuYnVmZmVyW2kgKyAxXTtcbiAgICAgICAgICAgICAgICBpZiAoaXNFbXB0eShuZXh0KSB8fCAoaW5GbG93ICYmIGZsb3dJbmRpY2F0b3JDaGFycy5oYXMobmV4dCkpKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBlbmQgPSBpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXNFbXB0eShjaCkpIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IHRoaXMuYnVmZmVyW2kgKyAxXTtcbiAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICdcXHInKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0ID09PSAnXFxuJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSAnXFxuJztcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgPSB0aGlzLmJ1ZmZlcltpICsgMV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgZW5kID0gaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG5leHQgPT09ICcjJyB8fCAoaW5GbG93ICYmIGZsb3dJbmRpY2F0b3JDaGFycy5oYXMobmV4dCkpKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICdcXG4nKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNzID0gdGhpcy5jb250aW51ZVNjYWxhcihpICsgMSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjcyA9PT0gLTEpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgaSA9IE1hdGgubWF4KGksIGNzIC0gMik7IC8vIHRvIGFkdmFuY2UsIGJ1dCBzdGlsbCBhY2NvdW50IGZvciAnICMnXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGluRmxvdyAmJiBmbG93SW5kaWNhdG9yQ2hhcnMuaGFzKGNoKSlcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZW5kID0gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNoICYmICF0aGlzLmF0RW5kKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0TmV4dCgncGxhaW4tc2NhbGFyJyk7XG4gICAgICAgIHlpZWxkIFNDQUxBUjtcbiAgICAgICAgeWllbGQqIHRoaXMucHVzaFRvSW5kZXgoZW5kICsgMSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBpbkZsb3cgPyAnZmxvdycgOiAnZG9jJztcbiAgICB9XG4gICAgKnB1c2hDb3VudChuKSB7XG4gICAgICAgIGlmIChuID4gMCkge1xuICAgICAgICAgICAgeWllbGQgdGhpcy5idWZmZXIuc3Vic3RyKHRoaXMucG9zLCBuKTtcbiAgICAgICAgICAgIHRoaXMucG9zICs9IG47XG4gICAgICAgICAgICByZXR1cm4gbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgKnB1c2hUb0luZGV4KGksIGFsbG93RW1wdHkpIHtcbiAgICAgICAgY29uc3QgcyA9IHRoaXMuYnVmZmVyLnNsaWNlKHRoaXMucG9zLCBpKTtcbiAgICAgICAgaWYgKHMpIHtcbiAgICAgICAgICAgIHlpZWxkIHM7XG4gICAgICAgICAgICB0aGlzLnBvcyArPSBzLmxlbmd0aDtcbiAgICAgICAgICAgIHJldHVybiBzLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhbGxvd0VtcHR5KVxuICAgICAgICAgICAgeWllbGQgJyc7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICAqcHVzaEluZGljYXRvcnMoKSB7XG4gICAgICAgIGxldCBuID0gMDtcbiAgICAgICAgbG9vcDogd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgIHN3aXRjaCAodGhpcy5jaGFyQXQoMCkpIHtcbiAgICAgICAgICAgICAgICBjYXNlICchJzpcbiAgICAgICAgICAgICAgICAgICAgbiArPSB5aWVsZCogdGhpcy5wdXNoVGFnKCk7XG4gICAgICAgICAgICAgICAgICAgIG4gKz0geWllbGQqIHRoaXMucHVzaFNwYWNlcyh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWUgbG9vcDtcbiAgICAgICAgICAgICAgICBjYXNlICcmJzpcbiAgICAgICAgICAgICAgICAgICAgbiArPSB5aWVsZCogdGhpcy5wdXNoVW50aWwoaXNOb3RBbmNob3JDaGFyKTtcbiAgICAgICAgICAgICAgICAgICAgbiArPSB5aWVsZCogdGhpcy5wdXNoU3BhY2VzKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBsb29wO1xuICAgICAgICAgICAgICAgIGNhc2UgJy0nOiAvLyB0aGlzIGlzIGFuIGVycm9yXG4gICAgICAgICAgICAgICAgY2FzZSAnPyc6IC8vIHRoaXMgaXMgYW4gZXJyb3Igb3V0c2lkZSBmbG93IGNvbGxlY3Rpb25zXG4gICAgICAgICAgICAgICAgY2FzZSAnOic6IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5GbG93ID0gdGhpcy5mbG93TGV2ZWwgPiAwO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaDEgPSB0aGlzLmNoYXJBdCgxKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzRW1wdHkoY2gxKSB8fCAoaW5GbG93ICYmIGZsb3dJbmRpY2F0b3JDaGFycy5oYXMoY2gxKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaW5GbG93KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5kZW50TmV4dCA9IHRoaXMuaW5kZW50VmFsdWUgKyAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5mbG93S2V5KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmxvd0tleSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgbiArPSB5aWVsZCogdGhpcy5wdXNoQ291bnQoMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBuICs9IHlpZWxkKiB0aGlzLnB1c2hTcGFjZXModHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBsb29wO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWsgbG9vcDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbjtcbiAgICB9XG4gICAgKnB1c2hUYWcoKSB7XG4gICAgICAgIGlmICh0aGlzLmNoYXJBdCgxKSA9PT0gJzwnKSB7XG4gICAgICAgICAgICBsZXQgaSA9IHRoaXMucG9zICsgMjtcbiAgICAgICAgICAgIGxldCBjaCA9IHRoaXMuYnVmZmVyW2ldO1xuICAgICAgICAgICAgd2hpbGUgKCFpc0VtcHR5KGNoKSAmJiBjaCAhPT0gJz4nKVxuICAgICAgICAgICAgICAgIGNoID0gdGhpcy5idWZmZXJbKytpXTtcbiAgICAgICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5wdXNoVG9JbmRleChjaCA9PT0gJz4nID8gaSArIDEgOiBpLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgaSA9IHRoaXMucG9zICsgMTtcbiAgICAgICAgICAgIGxldCBjaCA9IHRoaXMuYnVmZmVyW2ldO1xuICAgICAgICAgICAgd2hpbGUgKGNoKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRhZ0NoYXJzLmhhcyhjaCkpXG4gICAgICAgICAgICAgICAgICAgIGNoID0gdGhpcy5idWZmZXJbKytpXTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjaCA9PT0gJyUnICYmXG4gICAgICAgICAgICAgICAgICAgIGhleERpZ2l0cy5oYXModGhpcy5idWZmZXJbaSArIDFdKSAmJlxuICAgICAgICAgICAgICAgICAgICBoZXhEaWdpdHMuaGFzKHRoaXMuYnVmZmVyW2kgKyAyXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2ggPSB0aGlzLmJ1ZmZlclsoaSArPSAzKV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucHVzaFRvSW5kZXgoaSwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgICpwdXNoTmV3bGluZSgpIHtcbiAgICAgICAgY29uc3QgY2ggPSB0aGlzLmJ1ZmZlclt0aGlzLnBvc107XG4gICAgICAgIGlmIChjaCA9PT0gJ1xcbicpXG4gICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucHVzaENvdW50KDEpO1xuICAgICAgICBlbHNlIGlmIChjaCA9PT0gJ1xccicgJiYgdGhpcy5jaGFyQXQoMSkgPT09ICdcXG4nKVxuICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiB0aGlzLnB1c2hDb3VudCgyKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgICpwdXNoU3BhY2VzKGFsbG93VGFicykge1xuICAgICAgICBsZXQgaSA9IHRoaXMucG9zIC0gMTtcbiAgICAgICAgbGV0IGNoO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBjaCA9IHRoaXMuYnVmZmVyWysraV07XG4gICAgICAgIH0gd2hpbGUgKGNoID09PSAnICcgfHwgKGFsbG93VGFicyAmJiBjaCA9PT0gJ1xcdCcpKTtcbiAgICAgICAgY29uc3QgbiA9IGkgLSB0aGlzLnBvcztcbiAgICAgICAgaWYgKG4gPiAwKSB7XG4gICAgICAgICAgICB5aWVsZCB0aGlzLmJ1ZmZlci5zdWJzdHIodGhpcy5wb3MsIG4pO1xuICAgICAgICAgICAgdGhpcy5wb3MgPSBpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuO1xuICAgIH1cbiAgICAqcHVzaFVudGlsKHRlc3QpIHtcbiAgICAgICAgbGV0IGkgPSB0aGlzLnBvcztcbiAgICAgICAgbGV0IGNoID0gdGhpcy5idWZmZXJbaV07XG4gICAgICAgIHdoaWxlICghdGVzdChjaCkpXG4gICAgICAgICAgICBjaCA9IHRoaXMuYnVmZmVyWysraV07XG4gICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5wdXNoVG9JbmRleChpLCBmYWxzZSk7XG4gICAgfVxufVxuXG5leHBvcnQgeyBMZXhlciB9O1xuIiwiLyoqXG4gKiBUcmFja3MgbmV3bGluZXMgZHVyaW5nIHBhcnNpbmcgaW4gb3JkZXIgdG8gcHJvdmlkZSBhbiBlZmZpY2llbnQgQVBJIGZvclxuICogZGV0ZXJtaW5pbmcgdGhlIG9uZS1pbmRleGVkIGB7IGxpbmUsIGNvbCB9YCBwb3NpdGlvbiBmb3IgYW55IG9mZnNldFxuICogd2l0aGluIHRoZSBpbnB1dC5cbiAqL1xuY2xhc3MgTGluZUNvdW50ZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmxpbmVTdGFydHMgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNob3VsZCBiZSBjYWxsZWQgaW4gYXNjZW5kaW5nIG9yZGVyLiBPdGhlcndpc2UsIGNhbGxcbiAgICAgICAgICogYGxpbmVDb3VudGVyLmxpbmVTdGFydHMuc29ydCgpYCBiZWZvcmUgY2FsbGluZyBgbGluZVBvcygpYC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYWRkTmV3TGluZSA9IChvZmZzZXQpID0+IHRoaXMubGluZVN0YXJ0cy5wdXNoKG9mZnNldCk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQZXJmb3JtcyBhIGJpbmFyeSBzZWFyY2ggYW5kIHJldHVybnMgdGhlIDEtaW5kZXhlZCB7IGxpbmUsIGNvbCB9XG4gICAgICAgICAqIHBvc2l0aW9uIG9mIGBvZmZzZXRgLiBJZiBgbGluZSA9PT0gMGAsIGBhZGROZXdMaW5lYCBoYXMgbmV2ZXIgYmVlblxuICAgICAgICAgKiBjYWxsZWQgb3IgYG9mZnNldGAgaXMgYmVmb3JlIHRoZSBmaXJzdCBrbm93biBuZXdsaW5lLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5saW5lUG9zID0gKG9mZnNldCkgPT4ge1xuICAgICAgICAgICAgbGV0IGxvdyA9IDA7XG4gICAgICAgICAgICBsZXQgaGlnaCA9IHRoaXMubGluZVN0YXJ0cy5sZW5ndGg7XG4gICAgICAgICAgICB3aGlsZSAobG93IDwgaGlnaCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1pZCA9IChsb3cgKyBoaWdoKSA+PiAxOyAvLyBNYXRoLmZsb29yKChsb3cgKyBoaWdoKSAvIDIpXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubGluZVN0YXJ0c1ttaWRdIDwgb2Zmc2V0KVxuICAgICAgICAgICAgICAgICAgICBsb3cgPSBtaWQgKyAxO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgaGlnaCA9IG1pZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmxpbmVTdGFydHNbbG93XSA9PT0gb2Zmc2V0KVxuICAgICAgICAgICAgICAgIHJldHVybiB7IGxpbmU6IGxvdyArIDEsIGNvbDogMSB9O1xuICAgICAgICAgICAgaWYgKGxvdyA9PT0gMClcbiAgICAgICAgICAgICAgICByZXR1cm4geyBsaW5lOiAwLCBjb2w6IG9mZnNldCB9O1xuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0aGlzLmxpbmVTdGFydHNbbG93IC0gMV07XG4gICAgICAgICAgICByZXR1cm4geyBsaW5lOiBsb3csIGNvbDogb2Zmc2V0IC0gc3RhcnQgKyAxIH07XG4gICAgICAgIH07XG4gICAgfVxufVxuXG5leHBvcnQgeyBMaW5lQ291bnRlciB9O1xuIiwiaW1wb3J0IHsgdG9rZW5UeXBlIH0gZnJvbSAnLi9jc3QuanMnO1xuaW1wb3J0IHsgTGV4ZXIgfSBmcm9tICcuL2xleGVyLmpzJztcblxuZnVuY3Rpb24gaW5jbHVkZXNUb2tlbihsaXN0LCB0eXBlKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKVxuICAgICAgICBpZiAobGlzdFtpXS50eXBlID09PSB0eXBlKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gZmluZE5vbkVtcHR5SW5kZXgobGlzdCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7ICsraSkge1xuICAgICAgICBzd2l0Y2ggKGxpc3RbaV0udHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnc3BhY2UnOlxuICAgICAgICAgICAgY2FzZSAnY29tbWVudCc6XG4gICAgICAgICAgICBjYXNlICduZXdsaW5lJzpcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIC0xO1xufVxuZnVuY3Rpb24gaXNGbG93VG9rZW4odG9rZW4pIHtcbiAgICBzd2l0Y2ggKHRva2VuPy50eXBlKSB7XG4gICAgICAgIGNhc2UgJ2FsaWFzJzpcbiAgICAgICAgY2FzZSAnc2NhbGFyJzpcbiAgICAgICAgY2FzZSAnc2luZ2xlLXF1b3RlZC1zY2FsYXInOlxuICAgICAgICBjYXNlICdkb3VibGUtcXVvdGVkLXNjYWxhcic6XG4gICAgICAgIGNhc2UgJ2Zsb3ctY29sbGVjdGlvbic6XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5mdW5jdGlvbiBnZXRQcmV2UHJvcHMocGFyZW50KSB7XG4gICAgc3dpdGNoIChwYXJlbnQudHlwZSkge1xuICAgICAgICBjYXNlICdkb2N1bWVudCc6XG4gICAgICAgICAgICByZXR1cm4gcGFyZW50LnN0YXJ0O1xuICAgICAgICBjYXNlICdibG9jay1tYXAnOiB7XG4gICAgICAgICAgICBjb25zdCBpdCA9IHBhcmVudC5pdGVtc1twYXJlbnQuaXRlbXMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICByZXR1cm4gaXQuc2VwID8/IGl0LnN0YXJ0O1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2Jsb2NrLXNlcSc6XG4gICAgICAgICAgICByZXR1cm4gcGFyZW50Lml0ZW1zW3BhcmVudC5pdGVtcy5sZW5ndGggLSAxXS5zdGFydDtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgc2hvdWxkIG5vdCBoYXBwZW4gKi9cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICB9XG59XG4vKiogTm90ZTogTWF5IG1vZGlmeSBpbnB1dCBhcnJheSAqL1xuZnVuY3Rpb24gZ2V0Rmlyc3RLZXlTdGFydFByb3BzKHByZXYpIHtcbiAgICBpZiAocHJldi5sZW5ndGggPT09IDApXG4gICAgICAgIHJldHVybiBbXTtcbiAgICBsZXQgaSA9IHByZXYubGVuZ3RoO1xuICAgIGxvb3A6IHdoaWxlICgtLWkgPj0gMCkge1xuICAgICAgICBzd2l0Y2ggKHByZXZbaV0udHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnZG9jLXN0YXJ0JzpcbiAgICAgICAgICAgIGNhc2UgJ2V4cGxpY2l0LWtleS1pbmQnOlxuICAgICAgICAgICAgY2FzZSAnbWFwLXZhbHVlLWluZCc6XG4gICAgICAgICAgICBjYXNlICdzZXEtaXRlbS1pbmQnOlxuICAgICAgICAgICAgY2FzZSAnbmV3bGluZSc6XG4gICAgICAgICAgICAgICAgYnJlYWsgbG9vcDtcbiAgICAgICAgfVxuICAgIH1cbiAgICB3aGlsZSAocHJldlsrK2ldPy50eXBlID09PSAnc3BhY2UnKSB7XG4gICAgICAgIC8qIGxvb3AgKi9cbiAgICB9XG4gICAgcmV0dXJuIHByZXYuc3BsaWNlKGksIHByZXYubGVuZ3RoKTtcbn1cbmZ1bmN0aW9uIGFycmF5UHVzaEFycmF5KHRhcmdldCwgc291cmNlKSB7XG4gICAgLy8gTWF5IGV4aGF1c3QgY2FsbCBzdGFjayB3aXRoIGxhcmdlIGBzb3VyY2VgIGFycmF5XG4gICAgaWYgKHNvdXJjZS5sZW5ndGggPCAxZTUpXG4gICAgICAgIEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KHRhcmdldCwgc291cmNlKTtcbiAgICBlbHNlXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc291cmNlLmxlbmd0aDsgKytpKVxuICAgICAgICAgICAgdGFyZ2V0LnB1c2goc291cmNlW2ldKTtcbn1cbmZ1bmN0aW9uIGZpeEZsb3dTZXFJdGVtcyhmYykge1xuICAgIGlmIChmYy5zdGFydC50eXBlID09PSAnZmxvdy1zZXEtc3RhcnQnKSB7XG4gICAgICAgIGZvciAoY29uc3QgaXQgb2YgZmMuaXRlbXMpIHtcbiAgICAgICAgICAgIGlmIChpdC5zZXAgJiZcbiAgICAgICAgICAgICAgICAhaXQudmFsdWUgJiZcbiAgICAgICAgICAgICAgICAhaW5jbHVkZXNUb2tlbihpdC5zdGFydCwgJ2V4cGxpY2l0LWtleS1pbmQnKSAmJlxuICAgICAgICAgICAgICAgICFpbmNsdWRlc1Rva2VuKGl0LnNlcCwgJ21hcC12YWx1ZS1pbmQnKSkge1xuICAgICAgICAgICAgICAgIGlmIChpdC5rZXkpXG4gICAgICAgICAgICAgICAgICAgIGl0LnZhbHVlID0gaXQua2V5O1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBpdC5rZXk7XG4gICAgICAgICAgICAgICAgaWYgKGlzRmxvd1Rva2VuKGl0LnZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXQudmFsdWUuZW5kKVxuICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlQdXNoQXJyYXkoaXQudmFsdWUuZW5kLCBpdC5zZXApO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBpdC52YWx1ZS5lbmQgPSBpdC5zZXA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgYXJyYXlQdXNoQXJyYXkoaXQuc3RhcnQsIGl0LnNlcCk7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGl0LnNlcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuICogQSBZQU1MIGNvbmNyZXRlIHN5bnRheCB0cmVlIChDU1QpIHBhcnNlclxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCBzcmM6IHN0cmluZyA9IC4uLlxuICogZm9yIChjb25zdCB0b2tlbiBvZiBuZXcgUGFyc2VyKCkucGFyc2Uoc3JjKSkge1xuICogICAvLyB0b2tlbjogVG9rZW5cbiAqIH1cbiAqIGBgYFxuICpcbiAqIFRvIHVzZSB0aGUgcGFyc2VyIHdpdGggYSB1c2VyLXByb3ZpZGVkIGxleGVyOlxuICpcbiAqIGBgYHRzXG4gKiBmdW5jdGlvbiogcGFyc2Uoc291cmNlOiBzdHJpbmcsIGxleGVyOiBMZXhlcikge1xuICogICBjb25zdCBwYXJzZXIgPSBuZXcgUGFyc2VyKClcbiAqICAgZm9yIChjb25zdCBsZXhlbWUgb2YgbGV4ZXIubGV4KHNvdXJjZSkpXG4gKiAgICAgeWllbGQqIHBhcnNlci5uZXh0KGxleGVtZSlcbiAqICAgeWllbGQqIHBhcnNlci5lbmQoKVxuICogfVxuICpcbiAqIGNvbnN0IHNyYzogc3RyaW5nID0gLi4uXG4gKiBjb25zdCBsZXhlciA9IG5ldyBMZXhlcigpXG4gKiBmb3IgKGNvbnN0IHRva2VuIG9mIHBhcnNlKHNyYywgbGV4ZXIpKSB7XG4gKiAgIC8vIHRva2VuOiBUb2tlblxuICogfVxuICogYGBgXG4gKi9cbmNsYXNzIFBhcnNlciB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIG9uTmV3TGluZSAtIElmIGRlZmluZWQsIGNhbGxlZCBzZXBhcmF0ZWx5IHdpdGggdGhlIHN0YXJ0IHBvc2l0aW9uIG9mXG4gICAgICogICBlYWNoIG5ldyBsaW5lIChpbiBgcGFyc2UoKWAsIGluY2x1ZGluZyB0aGUgc3RhcnQgb2YgaW5wdXQpLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG9uTmV3TGluZSkge1xuICAgICAgICAvKiogSWYgdHJ1ZSwgc3BhY2UgYW5kIHNlcXVlbmNlIGluZGljYXRvcnMgY291bnQgYXMgaW5kZW50YXRpb24gKi9cbiAgICAgICAgdGhpcy5hdE5ld0xpbmUgPSB0cnVlO1xuICAgICAgICAvKiogSWYgdHJ1ZSwgbmV4dCB0b2tlbiBpcyBhIHNjYWxhciB2YWx1ZSAqL1xuICAgICAgICB0aGlzLmF0U2NhbGFyID0gZmFsc2U7XG4gICAgICAgIC8qKiBDdXJyZW50IGluZGVudGF0aW9uIGxldmVsICovXG4gICAgICAgIHRoaXMuaW5kZW50ID0gMDtcbiAgICAgICAgLyoqIEN1cnJlbnQgb2Zmc2V0IHNpbmNlIHRoZSBzdGFydCBvZiBwYXJzaW5nICovXG4gICAgICAgIHRoaXMub2Zmc2V0ID0gMDtcbiAgICAgICAgLyoqIE9uIHRoZSBzYW1lIGxpbmUgd2l0aCBhIGJsb2NrIG1hcCBrZXkgKi9cbiAgICAgICAgdGhpcy5vbktleUxpbmUgPSBmYWxzZTtcbiAgICAgICAgLyoqIFRvcCBpbmRpY2F0ZXMgdGhlIG5vZGUgdGhhdCdzIGN1cnJlbnRseSBiZWluZyBidWlsdCAqL1xuICAgICAgICB0aGlzLnN0YWNrID0gW107XG4gICAgICAgIC8qKiBUaGUgc291cmNlIG9mIHRoZSBjdXJyZW50IHRva2VuLCBzZXQgaW4gcGFyc2UoKSAqL1xuICAgICAgICB0aGlzLnNvdXJjZSA9ICcnO1xuICAgICAgICAvKiogVGhlIHR5cGUgb2YgdGhlIGN1cnJlbnQgdG9rZW4sIHNldCBpbiBwYXJzZSgpICovXG4gICAgICAgIHRoaXMudHlwZSA9ICcnO1xuICAgICAgICAvLyBNdXN0IGJlIGRlZmluZWQgYWZ0ZXIgYG5leHQoKWBcbiAgICAgICAgdGhpcy5sZXhlciA9IG5ldyBMZXhlcigpO1xuICAgICAgICB0aGlzLm9uTmV3TGluZSA9IG9uTmV3TGluZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUGFyc2UgYHNvdXJjZWAgYXMgYSBZQU1MIHN0cmVhbS5cbiAgICAgKiBJZiBgaW5jb21wbGV0ZWAsIGEgcGFydCBvZiB0aGUgbGFzdCBsaW5lIG1heSBiZSBsZWZ0IGFzIGEgYnVmZmVyIGZvciB0aGUgbmV4dCBjYWxsLlxuICAgICAqXG4gICAgICogRXJyb3JzIGFyZSBub3QgdGhyb3duLCBidXQgeWllbGRlZCBhcyBgeyB0eXBlOiAnZXJyb3InLCBtZXNzYWdlIH1gIHRva2Vucy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEEgZ2VuZXJhdG9yIG9mIHRva2VucyByZXByZXNlbnRpbmcgZWFjaCBkaXJlY3RpdmUsIGRvY3VtZW50LCBhbmQgb3RoZXIgc3RydWN0dXJlLlxuICAgICAqL1xuICAgICpwYXJzZShzb3VyY2UsIGluY29tcGxldGUgPSBmYWxzZSkge1xuICAgICAgICBpZiAodGhpcy5vbk5ld0xpbmUgJiYgdGhpcy5vZmZzZXQgPT09IDApXG4gICAgICAgICAgICB0aGlzLm9uTmV3TGluZSgwKTtcbiAgICAgICAgZm9yIChjb25zdCBsZXhlbWUgb2YgdGhpcy5sZXhlci5sZXgoc291cmNlLCBpbmNvbXBsZXRlKSlcbiAgICAgICAgICAgIHlpZWxkKiB0aGlzLm5leHQobGV4ZW1lKTtcbiAgICAgICAgaWYgKCFpbmNvbXBsZXRlKVxuICAgICAgICAgICAgeWllbGQqIHRoaXMuZW5kKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkdmFuY2UgdGhlIHBhcnNlciBieSB0aGUgYHNvdXJjZWAgb2Ygb25lIGxleGljYWwgdG9rZW4uXG4gICAgICovXG4gICAgKm5leHQoc291cmNlKSB7XG4gICAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgICAgICBpZiAodGhpcy5hdFNjYWxhcikge1xuICAgICAgICAgICAgdGhpcy5hdFNjYWxhciA9IGZhbHNlO1xuICAgICAgICAgICAgeWllbGQqIHRoaXMuc3RlcCgpO1xuICAgICAgICAgICAgdGhpcy5vZmZzZXQgKz0gc291cmNlLmxlbmd0aDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0eXBlID0gdG9rZW5UeXBlKHNvdXJjZSk7XG4gICAgICAgIGlmICghdHlwZSkge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGBOb3QgYSBZQU1MIHRva2VuOiAke3NvdXJjZX1gO1xuICAgICAgICAgICAgeWllbGQqIHRoaXMucG9wKHsgdHlwZTogJ2Vycm9yJywgb2Zmc2V0OiB0aGlzLm9mZnNldCwgbWVzc2FnZSwgc291cmNlIH0pO1xuICAgICAgICAgICAgdGhpcy5vZmZzZXQgKz0gc291cmNlLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlID09PSAnc2NhbGFyJykge1xuICAgICAgICAgICAgdGhpcy5hdE5ld0xpbmUgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuYXRTY2FsYXIgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy50eXBlID0gJ3NjYWxhcic7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICAgICAgeWllbGQqIHRoaXMuc3RlcCgpO1xuICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnbmV3bGluZSc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXROZXdMaW5lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmRlbnQgPSAwO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vbk5ld0xpbmUpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uTmV3TGluZSh0aGlzLm9mZnNldCArIHNvdXJjZS5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdzcGFjZSc6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmF0TmV3TGluZSAmJiBzb3VyY2VbMF0gPT09ICcgJylcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5kZW50ICs9IHNvdXJjZS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2V4cGxpY2l0LWtleS1pbmQnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ21hcC12YWx1ZS1pbmQnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ3NlcS1pdGVtLWluZCc6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmF0TmV3TGluZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5kZW50ICs9IHNvdXJjZS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2RvYy1tb2RlJzpcbiAgICAgICAgICAgICAgICBjYXNlICdmbG93LWVycm9yLWVuZCc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmF0TmV3TGluZSA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5vZmZzZXQgKz0gc291cmNlLmxlbmd0aDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKiogQ2FsbCBhdCBlbmQgb2YgaW5wdXQgdG8gcHVzaCBvdXQgYW55IHJlbWFpbmluZyBjb25zdHJ1Y3Rpb25zICovXG4gICAgKmVuZCgpIHtcbiAgICAgICAgd2hpbGUgKHRoaXMuc3RhY2subGVuZ3RoID4gMClcbiAgICAgICAgICAgIHlpZWxkKiB0aGlzLnBvcCgpO1xuICAgIH1cbiAgICBnZXQgc291cmNlVG9rZW4oKSB7XG4gICAgICAgIGNvbnN0IHN0ID0ge1xuICAgICAgICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgICAgICAgb2Zmc2V0OiB0aGlzLm9mZnNldCxcbiAgICAgICAgICAgIGluZGVudDogdGhpcy5pbmRlbnQsXG4gICAgICAgICAgICBzb3VyY2U6IHRoaXMuc291cmNlXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBzdDtcbiAgICB9XG4gICAgKnN0ZXAoKSB7XG4gICAgICAgIGNvbnN0IHRvcCA9IHRoaXMucGVlaygxKTtcbiAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gJ2RvYy1lbmQnICYmIHRvcD8udHlwZSAhPT0gJ2RvYy1lbmQnKSB7XG4gICAgICAgICAgICB3aGlsZSAodGhpcy5zdGFjay5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnBvcCgpO1xuICAgICAgICAgICAgdGhpcy5zdGFjay5wdXNoKHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnZG9jLWVuZCcsXG4gICAgICAgICAgICAgICAgb2Zmc2V0OiB0aGlzLm9mZnNldCxcbiAgICAgICAgICAgICAgICBzb3VyY2U6IHRoaXMuc291cmNlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRvcClcbiAgICAgICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5zdHJlYW0oKTtcbiAgICAgICAgc3dpdGNoICh0b3AudHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnZG9jdW1lbnQnOlxuICAgICAgICAgICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5kb2N1bWVudCh0b3ApO1xuICAgICAgICAgICAgY2FzZSAnYWxpYXMnOlxuICAgICAgICAgICAgY2FzZSAnc2NhbGFyJzpcbiAgICAgICAgICAgIGNhc2UgJ3NpbmdsZS1xdW90ZWQtc2NhbGFyJzpcbiAgICAgICAgICAgIGNhc2UgJ2RvdWJsZS1xdW90ZWQtc2NhbGFyJzpcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMuc2NhbGFyKHRvcCk7XG4gICAgICAgICAgICBjYXNlICdibG9jay1zY2FsYXInOlxuICAgICAgICAgICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5ibG9ja1NjYWxhcih0b3ApO1xuICAgICAgICAgICAgY2FzZSAnYmxvY2stbWFwJzpcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMuYmxvY2tNYXAodG9wKTtcbiAgICAgICAgICAgIGNhc2UgJ2Jsb2NrLXNlcSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiB0aGlzLmJsb2NrU2VxdWVuY2UodG9wKTtcbiAgICAgICAgICAgIGNhc2UgJ2Zsb3ctY29sbGVjdGlvbic6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiB0aGlzLmZsb3dDb2xsZWN0aW9uKHRvcCk7XG4gICAgICAgICAgICBjYXNlICdkb2MtZW5kJzpcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMuZG9jdW1lbnRFbmQodG9wKTtcbiAgICAgICAgfVxuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCBzaG91bGQgbm90IGhhcHBlbiAqL1xuICAgICAgICB5aWVsZCogdGhpcy5wb3AoKTtcbiAgICB9XG4gICAgcGVlayhuKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gbl07XG4gICAgfVxuICAgICpwb3AoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgdG9rZW4gPSBlcnJvciA/PyB0aGlzLnN0YWNrLnBvcCgpO1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgc2hvdWxkIG5vdCBoYXBwZW4gKi9cbiAgICAgICAgaWYgKCF0b2tlbikge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9ICdUcmllZCB0byBwb3AgYW4gZW1wdHkgc3RhY2snO1xuICAgICAgICAgICAgeWllbGQgeyB0eXBlOiAnZXJyb3InLCBvZmZzZXQ6IHRoaXMub2Zmc2V0LCBzb3VyY2U6ICcnLCBtZXNzYWdlIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5zdGFjay5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHlpZWxkIHRva2VuO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgdG9wID0gdGhpcy5wZWVrKDEpO1xuICAgICAgICAgICAgaWYgKHRva2VuLnR5cGUgPT09ICdibG9jay1zY2FsYXInKSB7XG4gICAgICAgICAgICAgICAgLy8gQmxvY2sgc2NhbGFycyB1c2UgdGhlaXIgcGFyZW50IHJhdGhlciB0aGFuIGhlYWRlciBpbmRlbnRcbiAgICAgICAgICAgICAgICB0b2tlbi5pbmRlbnQgPSAnaW5kZW50JyBpbiB0b3AgPyB0b3AuaW5kZW50IDogMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRva2VuLnR5cGUgPT09ICdmbG93LWNvbGxlY3Rpb24nICYmIHRvcC50eXBlID09PSAnZG9jdW1lbnQnKSB7XG4gICAgICAgICAgICAgICAgLy8gSWdub3JlIGFsbCBpbmRlbnQgZm9yIHRvcC1sZXZlbCBmbG93IGNvbGxlY3Rpb25zXG4gICAgICAgICAgICAgICAgdG9rZW4uaW5kZW50ID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0b2tlbi50eXBlID09PSAnZmxvdy1jb2xsZWN0aW9uJylcbiAgICAgICAgICAgICAgICBmaXhGbG93U2VxSXRlbXModG9rZW4pO1xuICAgICAgICAgICAgc3dpdGNoICh0b3AudHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2RvY3VtZW50JzpcbiAgICAgICAgICAgICAgICAgICAgdG9wLnZhbHVlID0gdG9rZW47XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2Jsb2NrLXNjYWxhcic6XG4gICAgICAgICAgICAgICAgICAgIHRvcC5wcm9wcy5wdXNoKHRva2VuKTsgLy8gZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnYmxvY2stbWFwJzoge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpdCA9IHRvcC5pdGVtc1t0b3AuaXRlbXMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChpdC52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9wLml0ZW1zLnB1c2goeyBzdGFydDogW10sIGtleTogdG9rZW4sIHNlcDogW10gfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uS2V5TGluZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaXQuc2VwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdC52YWx1ZSA9IHRva2VuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihpdCwgeyBrZXk6IHRva2VuLCBzZXA6IFtdIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbktleUxpbmUgPSAhaXQuZXhwbGljaXRLZXk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgJ2Jsb2NrLXNlcSc6IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXQgPSB0b3AuaXRlbXNbdG9wLml0ZW1zLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXQudmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICB0b3AuaXRlbXMucHVzaCh7IHN0YXJ0OiBbXSwgdmFsdWU6IHRva2VuIH0pO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBpdC52YWx1ZSA9IHRva2VuO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSAnZmxvdy1jb2xsZWN0aW9uJzoge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpdCA9IHRvcC5pdGVtc1t0b3AuaXRlbXMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgICAgIGlmICghaXQgfHwgaXQudmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICB0b3AuaXRlbXMucHVzaCh7IHN0YXJ0OiBbXSwga2V5OiB0b2tlbiwgc2VwOiBbXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaXQuc2VwKVxuICAgICAgICAgICAgICAgICAgICAgICAgaXQudmFsdWUgPSB0b2tlbjtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihpdCwgeyBrZXk6IHRva2VuLCBzZXA6IFtdIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0IHNob3VsZCBub3QgaGFwcGVuICovXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgeWllbGQqIHRoaXMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnBvcCh0b2tlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKHRvcC50eXBlID09PSAnZG9jdW1lbnQnIHx8XG4gICAgICAgICAgICAgICAgdG9wLnR5cGUgPT09ICdibG9jay1tYXAnIHx8XG4gICAgICAgICAgICAgICAgdG9wLnR5cGUgPT09ICdibG9jay1zZXEnKSAmJlxuICAgICAgICAgICAgICAgICh0b2tlbi50eXBlID09PSAnYmxvY2stbWFwJyB8fCB0b2tlbi50eXBlID09PSAnYmxvY2stc2VxJykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsYXN0ID0gdG9rZW4uaXRlbXNbdG9rZW4uaXRlbXMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgaWYgKGxhc3QgJiZcbiAgICAgICAgICAgICAgICAgICAgIWxhc3Quc2VwICYmXG4gICAgICAgICAgICAgICAgICAgICFsYXN0LnZhbHVlICYmXG4gICAgICAgICAgICAgICAgICAgIGxhc3Quc3RhcnQubGVuZ3RoID4gMCAmJlxuICAgICAgICAgICAgICAgICAgICBmaW5kTm9uRW1wdHlJbmRleChsYXN0LnN0YXJ0KSA9PT0gLTEgJiZcbiAgICAgICAgICAgICAgICAgICAgKHRva2VuLmluZGVudCA9PT0gMCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgbGFzdC5zdGFydC5ldmVyeShzdCA9PiBzdC50eXBlICE9PSAnY29tbWVudCcgfHwgc3QuaW5kZW50IDwgdG9rZW4uaW5kZW50KSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRvcC50eXBlID09PSAnZG9jdW1lbnQnKVxuICAgICAgICAgICAgICAgICAgICAgICAgdG9wLmVuZCA9IGxhc3Quc3RhcnQ7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvcC5pdGVtcy5wdXNoKHsgc3RhcnQ6IGxhc3Quc3RhcnQgfSk7XG4gICAgICAgICAgICAgICAgICAgIHRva2VuLml0ZW1zLnNwbGljZSgtMSwgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgICpzdHJlYW0oKSB7XG4gICAgICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdkaXJlY3RpdmUtbGluZSc6XG4gICAgICAgICAgICAgICAgeWllbGQgeyB0eXBlOiAnZGlyZWN0aXZlJywgb2Zmc2V0OiB0aGlzLm9mZnNldCwgc291cmNlOiB0aGlzLnNvdXJjZSB9O1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGNhc2UgJ2J5dGUtb3JkZXItbWFyayc6XG4gICAgICAgICAgICBjYXNlICdzcGFjZSc6XG4gICAgICAgICAgICBjYXNlICdjb21tZW50JzpcbiAgICAgICAgICAgIGNhc2UgJ25ld2xpbmUnOlxuICAgICAgICAgICAgICAgIHlpZWxkIHRoaXMuc291cmNlVG9rZW47XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgY2FzZSAnZG9jLW1vZGUnOlxuICAgICAgICAgICAgY2FzZSAnZG9jLXN0YXJ0Jzoge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRvYyA9IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2RvY3VtZW50JyxcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiB0aGlzLm9mZnNldCxcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IFtdXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy50eXBlID09PSAnZG9jLXN0YXJ0JylcbiAgICAgICAgICAgICAgICAgICAgZG9jLnN0YXJ0LnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGFjay5wdXNoKGRvYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHlpZWxkIHtcbiAgICAgICAgICAgIHR5cGU6ICdlcnJvcicsXG4gICAgICAgICAgICBvZmZzZXQ6IHRoaXMub2Zmc2V0LFxuICAgICAgICAgICAgbWVzc2FnZTogYFVuZXhwZWN0ZWQgJHt0aGlzLnR5cGV9IHRva2VuIGluIFlBTUwgc3RyZWFtYCxcbiAgICAgICAgICAgIHNvdXJjZTogdGhpcy5zb3VyY2VcbiAgICAgICAgfTtcbiAgICB9XG4gICAgKmRvY3VtZW50KGRvYykge1xuICAgICAgICBpZiAoZG9jLnZhbHVlKVxuICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiB0aGlzLmxpbmVFbmQoZG9jKTtcbiAgICAgICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2RvYy1zdGFydCc6IHtcbiAgICAgICAgICAgICAgICBpZiAoZmluZE5vbkVtcHR5SW5kZXgoZG9jLnN0YXJ0KSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgeWllbGQqIHRoaXMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnN0ZXAoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBkb2Muc3RhcnQucHVzaCh0aGlzLnNvdXJjZVRva2VuKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdhbmNob3InOlxuICAgICAgICAgICAgY2FzZSAndGFnJzpcbiAgICAgICAgICAgIGNhc2UgJ3NwYWNlJzpcbiAgICAgICAgICAgIGNhc2UgJ2NvbW1lbnQnOlxuICAgICAgICAgICAgY2FzZSAnbmV3bGluZSc6XG4gICAgICAgICAgICAgICAgZG9jLnN0YXJ0LnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJ2ID0gdGhpcy5zdGFydEJsb2NrVmFsdWUoZG9jKTtcbiAgICAgICAgaWYgKGJ2KVxuICAgICAgICAgICAgdGhpcy5zdGFjay5wdXNoKGJ2KTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB5aWVsZCB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICBvZmZzZXQ6IHRoaXMub2Zmc2V0LFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBVbmV4cGVjdGVkICR7dGhpcy50eXBlfSB0b2tlbiBpbiBZQU1MIGRvY3VtZW50YCxcbiAgICAgICAgICAgICAgICBzb3VyY2U6IHRoaXMuc291cmNlXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuICAgICpzY2FsYXIoc2NhbGFyKSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgPT09ICdtYXAtdmFsdWUtaW5kJykge1xuICAgICAgICAgICAgY29uc3QgcHJldiA9IGdldFByZXZQcm9wcyh0aGlzLnBlZWsoMikpO1xuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBnZXRGaXJzdEtleVN0YXJ0UHJvcHMocHJldik7XG4gICAgICAgICAgICBsZXQgc2VwO1xuICAgICAgICAgICAgaWYgKHNjYWxhci5lbmQpIHtcbiAgICAgICAgICAgICAgICBzZXAgPSBzY2FsYXIuZW5kO1xuICAgICAgICAgICAgICAgIHNlcC5wdXNoKHRoaXMuc291cmNlVG9rZW4pO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBzY2FsYXIuZW5kO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHNlcCA9IFt0aGlzLnNvdXJjZVRva2VuXTtcbiAgICAgICAgICAgIGNvbnN0IG1hcCA9IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnYmxvY2stbWFwJyxcbiAgICAgICAgICAgICAgICBvZmZzZXQ6IHNjYWxhci5vZmZzZXQsXG4gICAgICAgICAgICAgICAgaW5kZW50OiBzY2FsYXIuaW5kZW50LFxuICAgICAgICAgICAgICAgIGl0ZW1zOiBbeyBzdGFydCwga2V5OiBzY2FsYXIsIHNlcCB9XVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMub25LZXlMaW5lID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXSA9IG1hcDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICB5aWVsZCogdGhpcy5saW5lRW5kKHNjYWxhcik7XG4gICAgfVxuICAgICpibG9ja1NjYWxhcihzY2FsYXIpIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ3NwYWNlJzpcbiAgICAgICAgICAgIGNhc2UgJ2NvbW1lbnQnOlxuICAgICAgICAgICAgY2FzZSAnbmV3bGluZSc6XG4gICAgICAgICAgICAgICAgc2NhbGFyLnByb3BzLnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgY2FzZSAnc2NhbGFyJzpcbiAgICAgICAgICAgICAgICBzY2FsYXIuc291cmNlID0gdGhpcy5zb3VyY2U7XG4gICAgICAgICAgICAgICAgLy8gYmxvY2stc2NhbGFyIHNvdXJjZSBpbmNsdWRlcyB0cmFpbGluZyBuZXdsaW5lXG4gICAgICAgICAgICAgICAgdGhpcy5hdE5ld0xpbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5kZW50ID0gMDtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vbk5ld0xpbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5sID0gdGhpcy5zb3VyY2UuaW5kZXhPZignXFxuJykgKyAxO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAobmwgIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25OZXdMaW5lKHRoaXMub2Zmc2V0ICsgbmwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbmwgPSB0aGlzLnNvdXJjZS5pbmRleE9mKCdcXG4nLCBubCkgKyAxO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnBvcCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgc2hvdWxkIG5vdCBoYXBwZW4gKi9cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgeWllbGQqIHRoaXMucG9wKCk7XG4gICAgICAgICAgICAgICAgeWllbGQqIHRoaXMuc3RlcCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgICpibG9ja01hcChtYXApIHtcbiAgICAgICAgY29uc3QgaXQgPSBtYXAuaXRlbXNbbWFwLml0ZW1zLmxlbmd0aCAtIDFdO1xuICAgICAgICAvLyBpdC5zZXAgaXMgdHJ1ZS1pc2ggaWYgcGFpciBhbHJlYWR5IGhhcyBrZXkgb3IgOiBzZXBhcmF0b3JcbiAgICAgICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ25ld2xpbmUnOlxuICAgICAgICAgICAgICAgIHRoaXMub25LZXlMaW5lID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKGl0LnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZCA9ICdlbmQnIGluIGl0LnZhbHVlID8gaXQudmFsdWUuZW5kIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXN0ID0gQXJyYXkuaXNBcnJheShlbmQpID8gZW5kW2VuZC5sZW5ndGggLSAxXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3Q/LnR5cGUgPT09ICdjb21tZW50JylcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuZD8ucHVzaCh0aGlzLnNvdXJjZVRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgbWFwLml0ZW1zLnB1c2goeyBzdGFydDogW3RoaXMuc291cmNlVG9rZW5dIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChpdC5zZXApIHtcbiAgICAgICAgICAgICAgICAgICAgaXQuc2VwLnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpdC5zdGFydC5wdXNoKHRoaXMuc291cmNlVG9rZW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBjYXNlICdzcGFjZSc6XG4gICAgICAgICAgICBjYXNlICdjb21tZW50JzpcbiAgICAgICAgICAgICAgICBpZiAoaXQudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgbWFwLml0ZW1zLnB1c2goeyBzdGFydDogW3RoaXMuc291cmNlVG9rZW5dIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChpdC5zZXApIHtcbiAgICAgICAgICAgICAgICAgICAgaXQuc2VwLnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5hdEluZGVudGVkQ29tbWVudChpdC5zdGFydCwgbWFwLmluZGVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByZXYgPSBtYXAuaXRlbXNbbWFwLml0ZW1zLmxlbmd0aCAtIDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5kID0gcHJldj8udmFsdWU/LmVuZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGVuZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheVB1c2hBcnJheShlbmQsIGl0LnN0YXJ0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQucHVzaCh0aGlzLnNvdXJjZVRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAuaXRlbXMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGl0LnN0YXJ0LnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pbmRlbnQgPj0gbWFwLmluZGVudCkge1xuICAgICAgICAgICAgY29uc3QgYXRNYXBJbmRlbnQgPSAhdGhpcy5vbktleUxpbmUgJiYgdGhpcy5pbmRlbnQgPT09IG1hcC5pbmRlbnQ7XG4gICAgICAgICAgICBjb25zdCBhdE5leHRJdGVtID0gYXRNYXBJbmRlbnQgJiZcbiAgICAgICAgICAgICAgICAoaXQuc2VwIHx8IGl0LmV4cGxpY2l0S2V5KSAmJlxuICAgICAgICAgICAgICAgIHRoaXMudHlwZSAhPT0gJ3NlcS1pdGVtLWluZCc7XG4gICAgICAgICAgICAvLyBGb3IgZW1wdHkgbm9kZXMsIGFzc2lnbiBuZXdsaW5lLXNlcGFyYXRlZCBub3QgaW5kZW50ZWQgZW1wdHkgdG9rZW5zIHRvIGZvbGxvd2luZyBub2RlXG4gICAgICAgICAgICBsZXQgc3RhcnQgPSBbXTtcbiAgICAgICAgICAgIGlmIChhdE5leHRJdGVtICYmIGl0LnNlcCAmJiAhaXQudmFsdWUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBubCA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXQuc2VwLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ID0gaXQuc2VwW2ldO1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN0LnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ25ld2xpbmUnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5sLnB1c2goaSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdzcGFjZSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdjb21tZW50JzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3QuaW5kZW50ID4gbWFwLmluZGVudClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmwubGVuZ3RoID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmwubGVuZ3RoID0gMDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobmwubGVuZ3RoID49IDIpXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gaXQuc2VwLnNwbGljZShubFsxXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2FuY2hvcic6XG4gICAgICAgICAgICAgICAgY2FzZSAndGFnJzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKGF0TmV4dEl0ZW0gfHwgaXQudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAuaXRlbXMucHVzaCh7IHN0YXJ0IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbktleUxpbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGl0LnNlcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXQuc2VwLnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdC5zdGFydC5wdXNoKHRoaXMuc291cmNlVG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICBjYXNlICdleHBsaWNpdC1rZXktaW5kJzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpdC5zZXAgJiYgIWl0LmV4cGxpY2l0S2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdC5zdGFydC5wdXNoKHRoaXMuc291cmNlVG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaXQuZXhwbGljaXRLZXkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGF0TmV4dEl0ZW0gfHwgaXQudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAuaXRlbXMucHVzaCh7IHN0YXJ0LCBleHBsaWNpdEtleTogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2Jsb2NrLW1hcCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiB0aGlzLm9mZnNldCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQ6IHRoaXMuaW5kZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zOiBbeyBzdGFydDogW3RoaXMuc291cmNlVG9rZW5dLCBleHBsaWNpdEtleTogdHJ1ZSB9XVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbktleUxpbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgY2FzZSAnbWFwLXZhbHVlLWluZCc6XG4gICAgICAgICAgICAgICAgICAgIGlmIChpdC5leHBsaWNpdEtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpdC5zZXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5jbHVkZXNUb2tlbihpdC5zdGFydCwgJ25ld2xpbmUnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGl0LCB7IGtleTogbnVsbCwgc2VwOiBbdGhpcy5zb3VyY2VUb2tlbl0gfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IGdldEZpcnN0S2V5U3RhcnRQcm9wcyhpdC5zdGFydCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYmxvY2stbWFwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldDogdGhpcy5vZmZzZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQ6IHRoaXMuaW5kZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXM6IFt7IHN0YXJ0LCBrZXk6IG51bGwsIHNlcDogW3RoaXMuc291cmNlVG9rZW5dIH1dXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGl0LnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwLml0ZW1zLnB1c2goeyBzdGFydDogW10sIGtleTogbnVsbCwgc2VwOiBbdGhpcy5zb3VyY2VUb2tlbl0gfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpbmNsdWRlc1Rva2VuKGl0LnNlcCwgJ21hcC12YWx1ZS1pbmQnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdibG9jay1tYXAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IHRoaXMub2Zmc2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQ6IHRoaXMuaW5kZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtczogW3sgc3RhcnQsIGtleTogbnVsbCwgc2VwOiBbdGhpcy5zb3VyY2VUb2tlbl0gfV1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzRmxvd1Rva2VuKGl0LmtleSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaW5jbHVkZXNUb2tlbihpdC5zZXAsICduZXdsaW5lJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IGdldEZpcnN0S2V5U3RhcnRQcm9wcyhpdC5zdGFydCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gaXQua2V5O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlcCA9IGl0LnNlcDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXAucHVzaCh0aGlzLnNvdXJjZVRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHR5cGUgZ3VhcmQgaXMgd3JvbmcgaGVyZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBpdC5rZXk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciB0eXBlIGd1YXJkIGlzIHdyb25nIGhlcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgaXQuc2VwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdibG9jay1tYXAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IHRoaXMub2Zmc2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQ6IHRoaXMuaW5kZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtczogW3sgc3RhcnQsIGtleSwgc2VwIH1dXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzdGFydC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90IGFjdHVhbGx5IGF0IG5leHQgaXRlbVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0LnNlcCA9IGl0LnNlcC5jb25jYXQoc3RhcnQsIHRoaXMuc291cmNlVG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQuc2VwLnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWl0LnNlcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oaXQsIHsga2V5OiBudWxsLCBzZXA6IFt0aGlzLnNvdXJjZVRva2VuXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGl0LnZhbHVlIHx8IGF0TmV4dEl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAuaXRlbXMucHVzaCh7IHN0YXJ0LCBrZXk6IG51bGwsIHNlcDogW3RoaXMuc291cmNlVG9rZW5dIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaW5jbHVkZXNUb2tlbihpdC5zZXAsICdtYXAtdmFsdWUtaW5kJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYmxvY2stbWFwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiB0aGlzLm9mZnNldCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50OiB0aGlzLmluZGVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXM6IFt7IHN0YXJ0OiBbXSwga2V5OiBudWxsLCBzZXA6IFt0aGlzLnNvdXJjZVRva2VuXSB9XVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQuc2VwLnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbktleUxpbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgY2FzZSAnYWxpYXMnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ3NjYWxhcic6XG4gICAgICAgICAgICAgICAgY2FzZSAnc2luZ2xlLXF1b3RlZC1zY2FsYXInOlxuICAgICAgICAgICAgICAgIGNhc2UgJ2RvdWJsZS1xdW90ZWQtc2NhbGFyJzoge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmcyA9IHRoaXMuZmxvd1NjYWxhcih0aGlzLnR5cGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYXROZXh0SXRlbSB8fCBpdC52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWFwLml0ZW1zLnB1c2goeyBzdGFydCwga2V5OiBmcywgc2VwOiBbXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25LZXlMaW5lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpdC5zZXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaChmcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGl0LCB7IGtleTogZnMsIHNlcDogW10gfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uS2V5TGluZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJ2ID0gdGhpcy5zdGFydEJsb2NrVmFsdWUobWFwKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJ2KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnYudHlwZSA9PT0gJ2Jsb2NrLXNlcScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWl0LmV4cGxpY2l0S2V5ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0LnNlcCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaW5jbHVkZXNUb2tlbihpdC5zZXAsICduZXdsaW5lJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQqIHRoaXMucG9wKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IHRoaXMub2Zmc2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ1VuZXhwZWN0ZWQgYmxvY2stc2VxLWluZCBvbiBzYW1lIGxpbmUgd2l0aCBrZXknLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiB0aGlzLnNvdXJjZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGF0TWFwSW5kZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwLml0ZW1zLnB1c2goeyBzdGFydCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaChidik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgeWllbGQqIHRoaXMucG9wKCk7XG4gICAgICAgIHlpZWxkKiB0aGlzLnN0ZXAoKTtcbiAgICB9XG4gICAgKmJsb2NrU2VxdWVuY2Uoc2VxKSB7XG4gICAgICAgIGNvbnN0IGl0ID0gc2VxLml0ZW1zW3NlcS5pdGVtcy5sZW5ndGggLSAxXTtcbiAgICAgICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ25ld2xpbmUnOlxuICAgICAgICAgICAgICAgIGlmIChpdC52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQgPSAnZW5kJyBpbiBpdC52YWx1ZSA/IGl0LnZhbHVlLmVuZCA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFzdCA9IEFycmF5LmlzQXJyYXkoZW5kKSA/IGVuZFtlbmQubGVuZ3RoIC0gMV0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsYXN0Py50eXBlID09PSAnY29tbWVudCcpXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmQ/LnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcS5pdGVtcy5wdXNoKHsgc3RhcnQ6IFt0aGlzLnNvdXJjZVRva2VuXSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBpdC5zdGFydC5wdXNoKHRoaXMuc291cmNlVG9rZW4pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGNhc2UgJ3NwYWNlJzpcbiAgICAgICAgICAgIGNhc2UgJ2NvbW1lbnQnOlxuICAgICAgICAgICAgICAgIGlmIChpdC52YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgc2VxLml0ZW1zLnB1c2goeyBzdGFydDogW3RoaXMuc291cmNlVG9rZW5dIH0pO1xuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5hdEluZGVudGVkQ29tbWVudChpdC5zdGFydCwgc2VxLmluZGVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByZXYgPSBzZXEuaXRlbXNbc2VxLml0ZW1zLmxlbmd0aCAtIDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5kID0gcHJldj8udmFsdWU/LmVuZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGVuZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheVB1c2hBcnJheShlbmQsIGl0LnN0YXJ0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQucHVzaCh0aGlzLnNvdXJjZVRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXEuaXRlbXMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGl0LnN0YXJ0LnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGNhc2UgJ2FuY2hvcic6XG4gICAgICAgICAgICBjYXNlICd0YWcnOlxuICAgICAgICAgICAgICAgIGlmIChpdC52YWx1ZSB8fCB0aGlzLmluZGVudCA8PSBzZXEuaW5kZW50KVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBpdC5zdGFydC5wdXNoKHRoaXMuc291cmNlVG9rZW4pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGNhc2UgJ3NlcS1pdGVtLWluZCc6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaW5kZW50ICE9PSBzZXEuaW5kZW50KVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBpZiAoaXQudmFsdWUgfHwgaW5jbHVkZXNUb2tlbihpdC5zdGFydCwgJ3NlcS1pdGVtLWluZCcpKVxuICAgICAgICAgICAgICAgICAgICBzZXEuaXRlbXMucHVzaCh7IHN0YXJ0OiBbdGhpcy5zb3VyY2VUb2tlbl0gfSk7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBpdC5zdGFydC5wdXNoKHRoaXMuc291cmNlVG9rZW4pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pbmRlbnQgPiBzZXEuaW5kZW50KSB7XG4gICAgICAgICAgICBjb25zdCBidiA9IHRoaXMuc3RhcnRCbG9ja1ZhbHVlKHNlcSk7XG4gICAgICAgICAgICBpZiAoYnYpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2goYnYpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB5aWVsZCogdGhpcy5wb3AoKTtcbiAgICAgICAgeWllbGQqIHRoaXMuc3RlcCgpO1xuICAgIH1cbiAgICAqZmxvd0NvbGxlY3Rpb24oZmMpIHtcbiAgICAgICAgY29uc3QgaXQgPSBmYy5pdGVtc1tmYy5pdGVtcy5sZW5ndGggLSAxXTtcbiAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gJ2Zsb3ctZXJyb3ItZW5kJykge1xuICAgICAgICAgICAgbGV0IHRvcDtcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICB5aWVsZCogdGhpcy5wb3AoKTtcbiAgICAgICAgICAgICAgICB0b3AgPSB0aGlzLnBlZWsoMSk7XG4gICAgICAgICAgICB9IHdoaWxlICh0b3A/LnR5cGUgPT09ICdmbG93LWNvbGxlY3Rpb24nKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChmYy5lbmQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2NvbW1hJzpcbiAgICAgICAgICAgICAgICBjYXNlICdleHBsaWNpdC1rZXktaW5kJzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpdCB8fCBpdC5zZXApXG4gICAgICAgICAgICAgICAgICAgICAgICBmYy5pdGVtcy5wdXNoKHsgc3RhcnQ6IFt0aGlzLnNvdXJjZVRva2VuXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgaXQuc3RhcnQucHVzaCh0aGlzLnNvdXJjZVRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGNhc2UgJ21hcC12YWx1ZS1pbmQnOlxuICAgICAgICAgICAgICAgICAgICBpZiAoIWl0IHx8IGl0LnZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgZmMuaXRlbXMucHVzaCh7IHN0YXJ0OiBbXSwga2V5OiBudWxsLCBzZXA6IFt0aGlzLnNvdXJjZVRva2VuXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaXQuc2VwKVxuICAgICAgICAgICAgICAgICAgICAgICAgaXQuc2VwLnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oaXQsIHsga2V5OiBudWxsLCBzZXA6IFt0aGlzLnNvdXJjZVRva2VuXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3NwYWNlJzpcbiAgICAgICAgICAgICAgICBjYXNlICdjb21tZW50JzpcbiAgICAgICAgICAgICAgICBjYXNlICduZXdsaW5lJzpcbiAgICAgICAgICAgICAgICBjYXNlICdhbmNob3InOlxuICAgICAgICAgICAgICAgIGNhc2UgJ3RhZyc6XG4gICAgICAgICAgICAgICAgICAgIGlmICghaXQgfHwgaXQudmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICBmYy5pdGVtcy5wdXNoKHsgc3RhcnQ6IFt0aGlzLnNvdXJjZVRva2VuXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaXQuc2VwKVxuICAgICAgICAgICAgICAgICAgICAgICAgaXQuc2VwLnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0LnN0YXJ0LnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICBjYXNlICdhbGlhcyc6XG4gICAgICAgICAgICAgICAgY2FzZSAnc2NhbGFyJzpcbiAgICAgICAgICAgICAgICBjYXNlICdzaW5nbGUtcXVvdGVkLXNjYWxhcic6XG4gICAgICAgICAgICAgICAgY2FzZSAnZG91YmxlLXF1b3RlZC1zY2FsYXInOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZzID0gdGhpcy5mbG93U2NhbGFyKHRoaXMudHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaXQgfHwgaXQudmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICBmYy5pdGVtcy5wdXNoKHsgc3RhcnQ6IFtdLCBrZXk6IGZzLCBzZXA6IFtdIH0pO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpdC5zZXApXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2goZnMpO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGl0LCB7IGtleTogZnMsIHNlcDogW10gfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSAnZmxvdy1tYXAtZW5kJzpcbiAgICAgICAgICAgICAgICBjYXNlICdmbG93LXNlcS1lbmQnOlxuICAgICAgICAgICAgICAgICAgICBmYy5lbmQucHVzaCh0aGlzLnNvdXJjZVRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYnYgPSB0aGlzLnN0YXJ0QmxvY2tWYWx1ZShmYyk7XG4gICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSBzaG91bGQgbm90IGhhcHBlbiAqL1xuICAgICAgICAgICAgaWYgKGJ2KVxuICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaChidik7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB5aWVsZCogdGhpcy5wb3AoKTtcbiAgICAgICAgICAgICAgICB5aWVsZCogdGhpcy5zdGVwKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnQgPSB0aGlzLnBlZWsoMik7XG4gICAgICAgICAgICBpZiAocGFyZW50LnR5cGUgPT09ICdibG9jay1tYXAnICYmXG4gICAgICAgICAgICAgICAgKCh0aGlzLnR5cGUgPT09ICdtYXAtdmFsdWUtaW5kJyAmJiBwYXJlbnQuaW5kZW50ID09PSBmYy5pbmRlbnQpIHx8XG4gICAgICAgICAgICAgICAgICAgICh0aGlzLnR5cGUgPT09ICduZXdsaW5lJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgIXBhcmVudC5pdGVtc1twYXJlbnQuaXRlbXMubGVuZ3RoIC0gMV0uc2VwKSkpIHtcbiAgICAgICAgICAgICAgICB5aWVsZCogdGhpcy5wb3AoKTtcbiAgICAgICAgICAgICAgICB5aWVsZCogdGhpcy5zdGVwKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLnR5cGUgPT09ICdtYXAtdmFsdWUtaW5kJyAmJlxuICAgICAgICAgICAgICAgIHBhcmVudC50eXBlICE9PSAnZmxvdy1jb2xsZWN0aW9uJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXYgPSBnZXRQcmV2UHJvcHMocGFyZW50KTtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IGdldEZpcnN0S2V5U3RhcnRQcm9wcyhwcmV2KTtcbiAgICAgICAgICAgICAgICBmaXhGbG93U2VxSXRlbXMoZmMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlcCA9IGZjLmVuZC5zcGxpY2UoMSwgZmMuZW5kLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgc2VwLnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgY29uc3QgbWFwID0ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYmxvY2stbWFwJyxcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiBmYy5vZmZzZXQsXG4gICAgICAgICAgICAgICAgICAgIGluZGVudDogZmMuaW5kZW50LFxuICAgICAgICAgICAgICAgICAgICBpdGVtczogW3sgc3RhcnQsIGtleTogZmMsIHNlcCB9XVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdGhpcy5vbktleUxpbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXSA9IG1hcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLmxpbmVFbmQoZmMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGZsb3dTY2FsYXIodHlwZSkge1xuICAgICAgICBpZiAodGhpcy5vbk5ld0xpbmUpIHtcbiAgICAgICAgICAgIGxldCBubCA9IHRoaXMuc291cmNlLmluZGV4T2YoJ1xcbicpICsgMTtcbiAgICAgICAgICAgIHdoaWxlIChubCAhPT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMub25OZXdMaW5lKHRoaXMub2Zmc2V0ICsgbmwpO1xuICAgICAgICAgICAgICAgIG5sID0gdGhpcy5zb3VyY2UuaW5kZXhPZignXFxuJywgbmwpICsgMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgIG9mZnNldDogdGhpcy5vZmZzZXQsXG4gICAgICAgICAgICBpbmRlbnQ6IHRoaXMuaW5kZW50LFxuICAgICAgICAgICAgc291cmNlOiB0aGlzLnNvdXJjZVxuICAgICAgICB9O1xuICAgIH1cbiAgICBzdGFydEJsb2NrVmFsdWUocGFyZW50KSB7XG4gICAgICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdhbGlhcyc6XG4gICAgICAgICAgICBjYXNlICdzY2FsYXInOlxuICAgICAgICAgICAgY2FzZSAnc2luZ2xlLXF1b3RlZC1zY2FsYXInOlxuICAgICAgICAgICAgY2FzZSAnZG91YmxlLXF1b3RlZC1zY2FsYXInOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZsb3dTY2FsYXIodGhpcy50eXBlKTtcbiAgICAgICAgICAgIGNhc2UgJ2Jsb2NrLXNjYWxhci1oZWFkZXInOlxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdibG9jay1zY2FsYXInLFxuICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IHRoaXMub2Zmc2V0LFxuICAgICAgICAgICAgICAgICAgICBpbmRlbnQ6IHRoaXMuaW5kZW50LFxuICAgICAgICAgICAgICAgICAgICBwcm9wczogW3RoaXMuc291cmNlVG9rZW5dLFxuICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICcnXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNhc2UgJ2Zsb3ctbWFwLXN0YXJ0JzpcbiAgICAgICAgICAgIGNhc2UgJ2Zsb3ctc2VxLXN0YXJ0JzpcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZmxvdy1jb2xsZWN0aW9uJyxcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiB0aGlzLm9mZnNldCxcbiAgICAgICAgICAgICAgICAgICAgaW5kZW50OiB0aGlzLmluZGVudCxcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IHRoaXMuc291cmNlVG9rZW4sXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1zOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgZW5kOiBbXVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjYXNlICdzZXEtaXRlbS1pbmQnOlxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdibG9jay1zZXEnLFxuICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IHRoaXMub2Zmc2V0LFxuICAgICAgICAgICAgICAgICAgICBpbmRlbnQ6IHRoaXMuaW5kZW50LFxuICAgICAgICAgICAgICAgICAgICBpdGVtczogW3sgc3RhcnQ6IFt0aGlzLnNvdXJjZVRva2VuXSB9XVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjYXNlICdleHBsaWNpdC1rZXktaW5kJzoge1xuICAgICAgICAgICAgICAgIHRoaXMub25LZXlMaW5lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjb25zdCBwcmV2ID0gZ2V0UHJldlByb3BzKHBhcmVudCk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBnZXRGaXJzdEtleVN0YXJ0UHJvcHMocHJldik7XG4gICAgICAgICAgICAgICAgc3RhcnQucHVzaCh0aGlzLnNvdXJjZVRva2VuKTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYmxvY2stbWFwJyxcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiB0aGlzLm9mZnNldCxcbiAgICAgICAgICAgICAgICAgICAgaW5kZW50OiB0aGlzLmluZGVudCxcbiAgICAgICAgICAgICAgICAgICAgaXRlbXM6IFt7IHN0YXJ0LCBleHBsaWNpdEtleTogdHJ1ZSB9XVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdtYXAtdmFsdWUtaW5kJzoge1xuICAgICAgICAgICAgICAgIHRoaXMub25LZXlMaW5lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjb25zdCBwcmV2ID0gZ2V0UHJldlByb3BzKHBhcmVudCk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBnZXRGaXJzdEtleVN0YXJ0UHJvcHMocHJldik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2Jsb2NrLW1hcCcsXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldDogdGhpcy5vZmZzZXQsXG4gICAgICAgICAgICAgICAgICAgIGluZGVudDogdGhpcy5pbmRlbnQsXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1zOiBbeyBzdGFydCwga2V5OiBudWxsLCBzZXA6IFt0aGlzLnNvdXJjZVRva2VuXSB9XVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGF0SW5kZW50ZWRDb21tZW50KHN0YXJ0LCBpbmRlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZSAhPT0gJ2NvbW1lbnQnKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5pbmRlbnQgPD0gaW5kZW50KVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gc3RhcnQuZXZlcnkoc3QgPT4gc3QudHlwZSA9PT0gJ25ld2xpbmUnIHx8IHN0LnR5cGUgPT09ICdzcGFjZScpO1xuICAgIH1cbiAgICAqZG9jdW1lbnRFbmQoZG9jRW5kKSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgIT09ICdkb2MtbW9kZScpIHtcbiAgICAgICAgICAgIGlmIChkb2NFbmQuZW5kKVxuICAgICAgICAgICAgICAgIGRvY0VuZC5lbmQucHVzaCh0aGlzLnNvdXJjZVRva2VuKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBkb2NFbmQuZW5kID0gW3RoaXMuc291cmNlVG9rZW5dO1xuICAgICAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gJ25ld2xpbmUnKVxuICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnBvcCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgICpsaW5lRW5kKHRva2VuKSB7XG4gICAgICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdjb21tYSc6XG4gICAgICAgICAgICBjYXNlICdkb2Mtc3RhcnQnOlxuICAgICAgICAgICAgY2FzZSAnZG9jLWVuZCc6XG4gICAgICAgICAgICBjYXNlICdmbG93LXNlcS1lbmQnOlxuICAgICAgICAgICAgY2FzZSAnZmxvdy1tYXAtZW5kJzpcbiAgICAgICAgICAgIGNhc2UgJ21hcC12YWx1ZS1pbmQnOlxuICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnBvcCgpO1xuICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnN0ZXAoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ25ld2xpbmUnOlxuICAgICAgICAgICAgICAgIHRoaXMub25LZXlMaW5lID0gZmFsc2U7XG4gICAgICAgICAgICAvLyBmYWxsdGhyb3VnaFxuICAgICAgICAgICAgY2FzZSAnc3BhY2UnOlxuICAgICAgICAgICAgY2FzZSAnY29tbWVudCc6XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIC8vIGFsbCBvdGhlciB2YWx1ZXMgYXJlIGVycm9yc1xuICAgICAgICAgICAgICAgIGlmICh0b2tlbi5lbmQpXG4gICAgICAgICAgICAgICAgICAgIHRva2VuLmVuZC5wdXNoKHRoaXMuc291cmNlVG9rZW4pO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgdG9rZW4uZW5kID0gW3RoaXMuc291cmNlVG9rZW5dO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnR5cGUgPT09ICduZXdsaW5lJylcbiAgICAgICAgICAgICAgICAgICAgeWllbGQqIHRoaXMucG9wKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCB7IFBhcnNlciB9O1xuIiwiaW1wb3J0IHsgQ29tcG9zZXIgfSBmcm9tICcuL2NvbXBvc2UvY29tcG9zZXIuanMnO1xuaW1wb3J0IHsgRG9jdW1lbnQgfSBmcm9tICcuL2RvYy9Eb2N1bWVudC5qcyc7XG5pbXBvcnQgeyBwcmV0dGlmeUVycm9yLCBZQU1MUGFyc2VFcnJvciB9IGZyb20gJy4vZXJyb3JzLmpzJztcbmltcG9ydCB7IHdhcm4gfSBmcm9tICcuL2xvZy5qcyc7XG5pbXBvcnQgeyBpc0RvY3VtZW50IH0gZnJvbSAnLi9ub2Rlcy9pZGVudGl0eS5qcyc7XG5pbXBvcnQgeyBMaW5lQ291bnRlciB9IGZyb20gJy4vcGFyc2UvbGluZS1jb3VudGVyLmpzJztcbmltcG9ydCB7IFBhcnNlciB9IGZyb20gJy4vcGFyc2UvcGFyc2VyLmpzJztcblxuZnVuY3Rpb24gcGFyc2VPcHRpb25zKG9wdGlvbnMpIHtcbiAgICBjb25zdCBwcmV0dHlFcnJvcnMgPSBvcHRpb25zLnByZXR0eUVycm9ycyAhPT0gZmFsc2U7XG4gICAgY29uc3QgbGluZUNvdW50ZXIgPSBvcHRpb25zLmxpbmVDb3VudGVyIHx8IChwcmV0dHlFcnJvcnMgJiYgbmV3IExpbmVDb3VudGVyKCkpIHx8IG51bGw7XG4gICAgcmV0dXJuIHsgbGluZUNvdW50ZXIsIHByZXR0eUVycm9ycyB9O1xufVxuLyoqXG4gKiBQYXJzZSB0aGUgaW5wdXQgYXMgYSBzdHJlYW0gb2YgWUFNTCBkb2N1bWVudHMuXG4gKlxuICogRG9jdW1lbnRzIHNob3VsZCBiZSBzZXBhcmF0ZWQgZnJvbSBlYWNoIG90aGVyIGJ5IGAuLi5gIG9yIGAtLS1gIG1hcmtlciBsaW5lcy5cbiAqXG4gKiBAcmV0dXJucyBJZiBhbiBlbXB0eSBgZG9jc2AgYXJyYXkgaXMgcmV0dXJuZWQsIGl0IHdpbGwgYmUgb2YgdHlwZVxuICogICBFbXB0eVN0cmVhbSBhbmQgY29udGFpbiBhZGRpdGlvbmFsIHN0cmVhbSBpbmZvcm1hdGlvbi4gSW5cbiAqICAgVHlwZVNjcmlwdCwgeW91IHNob3VsZCB1c2UgYCdlbXB0eScgaW4gZG9jc2AgYXMgYSB0eXBlIGd1YXJkIGZvciBpdC5cbiAqL1xuZnVuY3Rpb24gcGFyc2VBbGxEb2N1bWVudHMoc291cmNlLCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCB7IGxpbmVDb3VudGVyLCBwcmV0dHlFcnJvcnMgfSA9IHBhcnNlT3B0aW9ucyhvcHRpb25zKTtcbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgUGFyc2VyKGxpbmVDb3VudGVyPy5hZGROZXdMaW5lKTtcbiAgICBjb25zdCBjb21wb3NlciA9IG5ldyBDb21wb3NlcihvcHRpb25zKTtcbiAgICBjb25zdCBkb2NzID0gQXJyYXkuZnJvbShjb21wb3Nlci5jb21wb3NlKHBhcnNlci5wYXJzZShzb3VyY2UpKSk7XG4gICAgaWYgKHByZXR0eUVycm9ycyAmJiBsaW5lQ291bnRlcilcbiAgICAgICAgZm9yIChjb25zdCBkb2Mgb2YgZG9jcykge1xuICAgICAgICAgICAgZG9jLmVycm9ycy5mb3JFYWNoKHByZXR0aWZ5RXJyb3Ioc291cmNlLCBsaW5lQ291bnRlcikpO1xuICAgICAgICAgICAgZG9jLndhcm5pbmdzLmZvckVhY2gocHJldHRpZnlFcnJvcihzb3VyY2UsIGxpbmVDb3VudGVyKSk7XG4gICAgICAgIH1cbiAgICBpZiAoZG9jcy5sZW5ndGggPiAwKVxuICAgICAgICByZXR1cm4gZG9jcztcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihbXSwgeyBlbXB0eTogdHJ1ZSB9LCBjb21wb3Nlci5zdHJlYW1JbmZvKCkpO1xufVxuLyoqIFBhcnNlIGFuIGlucHV0IHN0cmluZyBpbnRvIGEgc2luZ2xlIFlBTUwuRG9jdW1lbnQgKi9cbmZ1bmN0aW9uIHBhcnNlRG9jdW1lbnQoc291cmNlLCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCB7IGxpbmVDb3VudGVyLCBwcmV0dHlFcnJvcnMgfSA9IHBhcnNlT3B0aW9ucyhvcHRpb25zKTtcbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgUGFyc2VyKGxpbmVDb3VudGVyPy5hZGROZXdMaW5lKTtcbiAgICBjb25zdCBjb21wb3NlciA9IG5ldyBDb21wb3NlcihvcHRpb25zKTtcbiAgICAvLyBgZG9jYCBpcyBhbHdheXMgc2V0IGJ5IGNvbXBvc2UuZW5kKHRydWUpIGF0IHRoZSB2ZXJ5IGxhdGVzdFxuICAgIGxldCBkb2MgPSBudWxsO1xuICAgIGZvciAoY29uc3QgX2RvYyBvZiBjb21wb3Nlci5jb21wb3NlKHBhcnNlci5wYXJzZShzb3VyY2UpLCB0cnVlLCBzb3VyY2UubGVuZ3RoKSkge1xuICAgICAgICBpZiAoIWRvYylcbiAgICAgICAgICAgIGRvYyA9IF9kb2M7XG4gICAgICAgIGVsc2UgaWYgKGRvYy5vcHRpb25zLmxvZ0xldmVsICE9PSAnc2lsZW50Jykge1xuICAgICAgICAgICAgZG9jLmVycm9ycy5wdXNoKG5ldyBZQU1MUGFyc2VFcnJvcihfZG9jLnJhbmdlLnNsaWNlKDAsIDIpLCAnTVVMVElQTEVfRE9DUycsICdTb3VyY2UgY29udGFpbnMgbXVsdGlwbGUgZG9jdW1lbnRzOyBwbGVhc2UgdXNlIFlBTUwucGFyc2VBbGxEb2N1bWVudHMoKScpKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChwcmV0dHlFcnJvcnMgJiYgbGluZUNvdW50ZXIpIHtcbiAgICAgICAgZG9jLmVycm9ycy5mb3JFYWNoKHByZXR0aWZ5RXJyb3Ioc291cmNlLCBsaW5lQ291bnRlcikpO1xuICAgICAgICBkb2Mud2FybmluZ3MuZm9yRWFjaChwcmV0dGlmeUVycm9yKHNvdXJjZSwgbGluZUNvdW50ZXIpKTtcbiAgICB9XG4gICAgcmV0dXJuIGRvYztcbn1cbmZ1bmN0aW9uIHBhcnNlKHNyYywgcmV2aXZlciwgb3B0aW9ucykge1xuICAgIGxldCBfcmV2aXZlciA9IHVuZGVmaW5lZDtcbiAgICBpZiAodHlwZW9mIHJldml2ZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgX3Jldml2ZXIgPSByZXZpdmVyO1xuICAgIH1cbiAgICBlbHNlIGlmIChvcHRpb25zID09PSB1bmRlZmluZWQgJiYgcmV2aXZlciAmJiB0eXBlb2YgcmV2aXZlciA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgb3B0aW9ucyA9IHJldml2ZXI7XG4gICAgfVxuICAgIGNvbnN0IGRvYyA9IHBhcnNlRG9jdW1lbnQoc3JjLCBvcHRpb25zKTtcbiAgICBpZiAoIWRvYylcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgZG9jLndhcm5pbmdzLmZvckVhY2god2FybmluZyA9PiB3YXJuKGRvYy5vcHRpb25zLmxvZ0xldmVsLCB3YXJuaW5nKSk7XG4gICAgaWYgKGRvYy5lcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBpZiAoZG9jLm9wdGlvbnMubG9nTGV2ZWwgIT09ICdzaWxlbnQnKVxuICAgICAgICAgICAgdGhyb3cgZG9jLmVycm9yc1swXTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgZG9jLmVycm9ycyA9IFtdO1xuICAgIH1cbiAgICByZXR1cm4gZG9jLnRvSlMoT2JqZWN0LmFzc2lnbih7IHJldml2ZXI6IF9yZXZpdmVyIH0sIG9wdGlvbnMpKTtcbn1cbmZ1bmN0aW9uIHN0cmluZ2lmeSh2YWx1ZSwgcmVwbGFjZXIsIG9wdGlvbnMpIHtcbiAgICBsZXQgX3JlcGxhY2VyID0gbnVsbDtcbiAgICBpZiAodHlwZW9mIHJlcGxhY2VyID09PSAnZnVuY3Rpb24nIHx8IEFycmF5LmlzQXJyYXkocmVwbGFjZXIpKSB7XG4gICAgICAgIF9yZXBsYWNlciA9IHJlcGxhY2VyO1xuICAgIH1cbiAgICBlbHNlIGlmIChvcHRpb25zID09PSB1bmRlZmluZWQgJiYgcmVwbGFjZXIpIHtcbiAgICAgICAgb3B0aW9ucyA9IHJlcGxhY2VyO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdzdHJpbmcnKVxuICAgICAgICBvcHRpb25zID0gb3B0aW9ucy5sZW5ndGg7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnbnVtYmVyJykge1xuICAgICAgICBjb25zdCBpbmRlbnQgPSBNYXRoLnJvdW5kKG9wdGlvbnMpO1xuICAgICAgICBvcHRpb25zID0gaW5kZW50IDwgMSA/IHVuZGVmaW5lZCA6IGluZGVudCA+IDggPyB7IGluZGVudDogOCB9IDogeyBpbmRlbnQgfTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgeyBrZWVwVW5kZWZpbmVkIH0gPSBvcHRpb25zID8/IHJlcGxhY2VyID8/IHt9O1xuICAgICAgICBpZiAoIWtlZXBVbmRlZmluZWQpXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAoaXNEb2N1bWVudCh2YWx1ZSkgJiYgIV9yZXBsYWNlcilcbiAgICAgICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKG9wdGlvbnMpO1xuICAgIHJldHVybiBuZXcgRG9jdW1lbnQodmFsdWUsIF9yZXBsYWNlciwgb3B0aW9ucykudG9TdHJpbmcob3B0aW9ucyk7XG59XG5cbmV4cG9ydCB7IHBhcnNlLCBwYXJzZUFsbERvY3VtZW50cywgcGFyc2VEb2N1bWVudCwgc3RyaW5naWZ5IH07XG4iLCJleHBvcnQgeyBDb21wb3NlciB9IGZyb20gJy4vY29tcG9zZS9jb21wb3Nlci5qcyc7XG5leHBvcnQgeyBEb2N1bWVudCB9IGZyb20gJy4vZG9jL0RvY3VtZW50LmpzJztcbmV4cG9ydCB7IFNjaGVtYSB9IGZyb20gJy4vc2NoZW1hL1NjaGVtYS5qcyc7XG5leHBvcnQgeyBZQU1MRXJyb3IsIFlBTUxQYXJzZUVycm9yLCBZQU1MV2FybmluZyB9IGZyb20gJy4vZXJyb3JzLmpzJztcbmV4cG9ydCB7IEFsaWFzIH0gZnJvbSAnLi9ub2Rlcy9BbGlhcy5qcyc7XG5leHBvcnQgeyBpc0FsaWFzLCBpc0NvbGxlY3Rpb24sIGlzRG9jdW1lbnQsIGlzTWFwLCBpc05vZGUsIGlzUGFpciwgaXNTY2FsYXIsIGlzU2VxIH0gZnJvbSAnLi9ub2Rlcy9pZGVudGl0eS5qcyc7XG5leHBvcnQgeyBQYWlyIH0gZnJvbSAnLi9ub2Rlcy9QYWlyLmpzJztcbmV4cG9ydCB7IFNjYWxhciB9IGZyb20gJy4vbm9kZXMvU2NhbGFyLmpzJztcbmV4cG9ydCB7IFlBTUxNYXAgfSBmcm9tICcuL25vZGVzL1lBTUxNYXAuanMnO1xuZXhwb3J0IHsgWUFNTFNlcSB9IGZyb20gJy4vbm9kZXMvWUFNTFNlcS5qcyc7XG5pbXBvcnQgKiBhcyBjc3QgZnJvbSAnLi9wYXJzZS9jc3QuanMnO1xuZXhwb3J0IHsgY3N0IGFzIENTVCB9O1xuZXhwb3J0IHsgTGV4ZXIgfSBmcm9tICcuL3BhcnNlL2xleGVyLmpzJztcbmV4cG9ydCB7IExpbmVDb3VudGVyIH0gZnJvbSAnLi9wYXJzZS9saW5lLWNvdW50ZXIuanMnO1xuZXhwb3J0IHsgUGFyc2VyIH0gZnJvbSAnLi9wYXJzZS9wYXJzZXIuanMnO1xuZXhwb3J0IHsgcGFyc2UsIHBhcnNlQWxsRG9jdW1lbnRzLCBwYXJzZURvY3VtZW50LCBzdHJpbmdpZnkgfSBmcm9tICcuL3B1YmxpYy1hcGkuanMnO1xuZXhwb3J0IHsgdmlzaXQsIHZpc2l0QXN5bmMgfSBmcm9tICcuL3Zpc2l0LmpzJztcbiIsIi8vIGBleHBvcnQgKiBhcyBkZWZhdWx0IGZyb20gLi4uYCBmYWlscyBvbiBXZWJwYWNrIHY0XG4vLyBodHRwczovL2dpdGh1Yi5jb20vZWVtZWxpL3lhbWwvaXNzdWVzLzIyOFxuaW1wb3J0ICogYXMgWUFNTCBmcm9tICcuL2Rpc3QvaW5kZXguanMnXG5leHBvcnQgZGVmYXVsdCBZQU1MXG5leHBvcnQgKiBmcm9tICcuL2Rpc3QvaW5kZXguanMnXG4iLCJpbXBvcnQgeyBwYXJzZUFzcGVjdFJhdGlvLCBwYXJzZVJhbmdlU3RyaW5nLCBwYXJzZVRpbWVTdHJpbmcsIHBhcnNlVGltZXNwbGl0cyB9IGZyb20gXCIuL3V0aWxzLm1qc1wiO1xuaW1wb3J0IHsgZW5zdXJlUHJlZml4LCB0b0FycmF5LCB1bmlxIH0gZnJvbSBcIkBhbnRmdS91dGlsc1wiO1xuaW1wb3J0IFlBTUwgZnJvbSBcInlhbWxcIjtcbi8vI3JlZ2lvbiBzcmMvY29uZmlnLnRzXG5jb25zdCBSRV9RVU9URURfU1RSSU5HID0gL14oWydcIl0pLipcXDEkLztcbmNvbnN0IFJFX0ZJTEVOQU1FX1NURU0gPSAvKFteXFxcXC9dKz8pKD86XFwuXFx3Kyk/JC87XG5mdW5jdGlvbiBnZXREZWZhdWx0Q29uZmlnKCkge1xuXHRyZXR1cm4ge1xuXHRcdHRoZW1lOiBcImRlZmF1bHRcIixcblx0XHR0aXRsZTogXCJTbGlkZXZcIixcblx0XHR0aXRsZVRlbXBsYXRlOiBcIiVzIC0gU2xpZGV2XCIsXG5cdFx0YWRkb25zOiBbXSxcblx0XHRyZW1vdGVBc3NldHM6IGZhbHNlLFxuXHRcdG1vbmFjbzogdHJ1ZSxcblx0XHRtb25hY29UeXBlc1NvdXJjZTogXCJsb2NhbFwiLFxuXHRcdG1vbmFjb1R5cGVzQWRkaXRpb25hbFBhY2thZ2VzOiBbXSxcblx0XHRtb25hY29UeXBlc0lnbm9yZVBhY2thZ2VzOiBbXSxcblx0XHRtb25hY29SdW5BZGRpdGlvbmFsRGVwczogW10sXG5cdFx0bW9uYWNvUnVuVXNlU3RyaWN0OiB0cnVlLFxuXHRcdGRvd25sb2FkOiBmYWxzZSxcblx0XHRleHBvcnQ6IHt9LFxuXHRcdGluZm86IGZhbHNlLFxuXHRcdGhpZ2hsaWdodGVyOiBcInNoaWtpXCIsXG5cdFx0dHdvc2xhc2g6IHRydWUsXG5cdFx0bGluZU51bWJlcnM6IGZhbHNlLFxuXHRcdGNvbG9yU2NoZW1hOiBcImF1dG9cIixcblx0XHRyb3V0ZXJNb2RlOiBcImhpc3RvcnlcIixcblx0XHRhc3BlY3RSYXRpbzogMTYgLyA5LFxuXHRcdGNhbnZhc1dpZHRoOiA5ODAsXG5cdFx0ZXhwb3J0RmlsZW5hbWU6IFwiXCIsXG5cdFx0c2VsZWN0YWJsZTogZmFsc2UsXG5cdFx0dGhlbWVDb25maWc6IHt9LFxuXHRcdGZvbnRzOiB7fSxcblx0XHRmYXZpY29uOiBcImh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9naC9zbGlkZXZqcy9zbGlkZXYvYXNzZXRzL2Zhdmljb24ucG5nXCIsXG5cdFx0ZHJhd2luZ3M6IHt9LFxuXHRcdHBsYW50VW1sU2VydmVyOiBcImh0dHBzOi8vd3d3LnBsYW50dW1sLmNvbS9wbGFudHVtbFwiLFxuXHRcdGNvZGVDb3B5OiB0cnVlLFxuXHRcdG1hZ2ljTW92ZUNvcHk6IHRydWUsXG5cdFx0YXV0aG9yOiBcIlwiLFxuXHRcdHJlY29yZDogXCJkZXZcIixcblx0XHRjc3M6IFwidW5vY3NzXCIsXG5cdFx0cHJlc2VudGVyOiB0cnVlLFxuXHRcdGJyb3dzZXJFeHBvcnRlcjogXCJkZXZcIixcblx0XHRodG1sQXR0cnM6IHt9LFxuXHRcdHRyYW5zaXRpb246IG51bGwsXG5cdFx0ZWRpdG9yOiB0cnVlLFxuXHRcdG1jcDogdHJ1ZSxcblx0XHRjb250ZXh0TWVudTogbnVsbCxcblx0XHR3YWtlTG9jazogdHJ1ZSxcblx0XHRwd2E6IGZhbHNlLFxuXHRcdHJlbW90ZTogZmFsc2UsXG5cdFx0bWRjOiBmYWxzZSxcblx0XHRjb21hcms6IGZhbHNlLFxuXHRcdHNlb01ldGE6IHt9LFxuXHRcdG5vdGVzQXV0b1J1Ynk6IHt9LFxuXHRcdGR1cmF0aW9uOiBcIjMwbWluXCIsXG5cdFx0dGltZXI6IFwic3RvcHdhdGNoXCIsXG5cdFx0bWFnaWNNb3ZlRHVyYXRpb246IDgwMCxcblx0XHRzaGlraToge30sXG5cdFx0cHJlbG9hZEltYWdlczogdHJ1ZSxcblx0XHRjbGlja0FuaW1hdGlvbjogXCJcIlxuXHR9O1xufVxuZnVuY3Rpb24gcmVzb2x2ZUNvbmZpZyhoZWFkbWF0dGVyLCB0aGVtZU1ldGEgPSB7fSwgZmlsZXBhdGgsIHZlcmlmeSA9IGZhbHNlKSB7XG5cdGNvbnN0IHRoZW1lSGlnaHRsaWdodGVyID0gW1xuXHRcdFwicHJpc21cIixcblx0XHRcInNoaWtpXCIsXG5cdFx0XCJzaGlraWppXCJcblx0XS5pbmNsdWRlcyh0aGVtZU1ldGEuaGlnaGxpZ2h0ZXIgfHwgXCJcIikgPyB0aGVtZU1ldGEuaGlnaGxpZ2h0ZXIgOiB2b2lkIDA7XG5cdGNvbnN0IHRoZW1lQ29sb3JTY2hlbWEgPSBbXCJsaWdodFwiLCBcImRhcmtcIl0uaW5jbHVkZXModGhlbWVNZXRhLmNvbG9yU2NoZW1hIHx8IFwiXCIpID8gdGhlbWVNZXRhLmNvbG9yU2NoZW1hIDogdm9pZCAwO1xuXHRjb25zdCBkZWZhdWx0Q29uZmlnID0gZ2V0RGVmYXVsdENvbmZpZygpO1xuXHRjb25zdCBjb25maWcgPSB7XG5cdFx0Li4uZGVmYXVsdENvbmZpZyxcblx0XHRoaWdobGlnaHRlcjogdGhlbWVIaWdodGxpZ2h0ZXIgfHwgZGVmYXVsdENvbmZpZy5oaWdobGlnaHRlcixcblx0XHRjb2xvclNjaGVtYTogdGhlbWVDb2xvclNjaGVtYSB8fCBkZWZhdWx0Q29uZmlnLmNvbG9yU2NoZW1hLFxuXHRcdC4uLnRoZW1lTWV0YS5kZWZhdWx0cyxcblx0XHQuLi5oZWFkbWF0dGVyLmNvbmZpZyxcblx0XHQuLi5oZWFkbWF0dGVyLFxuXHRcdGZvbnRzOiByZXNvbHZlRm9udHMoe1xuXHRcdFx0Li4uZGVmYXVsdENvbmZpZy5mb250cyxcblx0XHRcdC4uLnRoZW1lTWV0YS5kZWZhdWx0cz8uZm9udHMsXG5cdFx0XHQuLi5oZWFkbWF0dGVyLmNvbmZpZz8uZm9udHMsXG5cdFx0XHQuLi5oZWFkbWF0dGVyPy5mb250c1xuXHRcdH0pLFxuXHRcdGRyYXdpbmdzOiByZXNvbHZlRHJhd2luZ3Moe1xuXHRcdFx0Li4udGhlbWVNZXRhLmRlZmF1bHRzPy5kcmF3aW5ncyxcblx0XHRcdC4uLmhlYWRtYXR0ZXIuY29uZmlnPy5kcmF3aW5ncyxcblx0XHRcdC4uLmhlYWRtYXR0ZXI/LmRyYXdpbmdzXG5cdFx0fSwgZmlsZXBhdGgpLFxuXHRcdGh0bWxBdHRyczoge1xuXHRcdFx0Li4uZGVmYXVsdENvbmZpZy5odG1sQXR0cnMsXG5cdFx0XHQuLi50aGVtZU1ldGEuZGVmYXVsdHM/Lmh0bWxBdHRycyxcblx0XHRcdC4uLmhlYWRtYXR0ZXIuY29uZmlnPy5odG1sQXR0cnMsXG5cdFx0XHQuLi5oZWFkbWF0dGVyPy5odG1sQXR0cnNcblx0XHR9LFxuXHRcdHRoZW1lQ29uZmlnOiB7XG5cdFx0XHQuLi5kZWZhdWx0Q29uZmlnLnRoZW1lQ29uZmlnLFxuXHRcdFx0Li4udGhlbWVNZXRhLmRlZmF1bHRzPy50aGVtZUNvbmZpZyxcblx0XHRcdC4uLmhlYWRtYXR0ZXIuY29uZmlnPy50aGVtZUNvbmZpZyxcblx0XHRcdC4uLmhlYWRtYXR0ZXI/LnRoZW1lQ29uZmlnXG5cdFx0fVxuXHR9O1xuXHRpZiAoY29uZmlnLmhpZ2hsaWdodGVyID09PSBcInNoaWtpamlcIikge1xuXHRcdGNvbnNvbGUud2FybihgW3NsaWRldl0gXCJzaGlraWppXCIgaXMgbWVyZ2VkIGJhY2sgdG8gXCJzaGlraVwiLCB5b3UgY2FuIHNhZmVseSBjaGFuZ2UgaXQgXCJoaWdobGlnaHRlcjogc2hpa2lcImApO1xuXHRcdGNvbmZpZy5oaWdobGlnaHRlciA9IFwic2hpa2lcIjtcblx0fVxuXHRpZiAoY29uZmlnLmhpZ2hsaWdodGVyID09PSBcInByaXNtXCIpIHRocm93IG5ldyBFcnJvcihgW3NsaWRldl0gXCJwcmlzbVwiIHN1cHBvcnQgaGFzIGJlZW4gZHJvcHBlZC4gUGxlYXNlIHVzZSBcImhpZ2hsaWdodGVyOiBzaGlraVwiIGluc3RlYWRgKTtcblx0aWYgKGNvbmZpZy5jb2xvclNjaGVtYSAhPT0gXCJkYXJrXCIgJiYgY29uZmlnLmNvbG9yU2NoZW1hICE9PSBcImxpZ2h0XCIpIGNvbmZpZy5jb2xvclNjaGVtYSA9IFwiYXV0b1wiO1xuXHRpZiAodGhlbWVDb2xvclNjaGVtYSAmJiBjb25maWcuY29sb3JTY2hlbWEgPT09IFwiYXV0b1wiKSBjb25maWcuY29sb3JTY2hlbWEgPSB0aGVtZUNvbG9yU2NoZW1hO1xuXHRjb25maWcuYXNwZWN0UmF0aW8gPSBwYXJzZUFzcGVjdFJhdGlvKGNvbmZpZy5hc3BlY3RSYXRpbyk7XG5cdGlmICh2ZXJpZnkpIHZlcmlmeUNvbmZpZyhjb25maWcsIHRoZW1lTWV0YSk7XG5cdHJldHVybiBjb25maWc7XG59XG5mdW5jdGlvbiB2ZXJpZnlDb25maWcoY29uZmlnLCB0aGVtZU1ldGEgPSB7fSwgd2FybiA9ICh2KSA9PiBjb25zb2xlLndhcm4oYFtzbGlkZXZdICR7dn1gKSkge1xuXHRjb25zdCB0aGVtZUhpZ2h0bGlnaHRlciA9IHRoZW1lTWV0YS5oaWdobGlnaHRlciA9PT0gXCJzaGlraVwiID8gdGhlbWVNZXRhLmhpZ2hsaWdodGVyIDogdm9pZCAwO1xuXHRjb25zdCB0aGVtZUNvbG9yU2NoZW1hID0gW1wibGlnaHRcIiwgXCJkYXJrXCJdLmluY2x1ZGVzKHRoZW1lTWV0YS5jb2xvclNjaGVtYSB8fCBcIlwiKSA/IHRoZW1lTWV0YS5jb2xvclNjaGVtYSA6IHZvaWQgMDtcblx0aWYgKHRoZW1lQ29sb3JTY2hlbWEgJiYgY29uZmlnLmNvbG9yU2NoZW1hICE9PSB0aGVtZUNvbG9yU2NoZW1hKSB3YXJuKGBDb2xvciBzY2hlbWEgXCIke2NvbmZpZy5jb2xvclNjaGVtYX1cIiBkb2VzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHRoZW1lYCk7XG5cdGlmICh0aGVtZUhpZ2h0bGlnaHRlciAmJiBjb25maWcuaGlnaGxpZ2h0ZXIgIT09IHRoZW1lSGlnaHRsaWdodGVyKSB3YXJuKGBTeW50YXggaGlnaGxpZ2h0ZXIgXCIke2NvbmZpZy5oaWdobGlnaHRlcn1cIiBkb2VzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHRoZW1lYCk7XG5cdGlmIChjb25maWcuY3NzICE9PSBcInVub2Nzc1wiKSB7XG5cdFx0d2FybihgVW5zdXBwb3J0ZWQgQXRvbWljIENTUyBlbmdpbmUgXCIke2NvbmZpZy5jc3N9XCIsIGZhbGxiYWNrIHRvIFVub0NTU2ApO1xuXHRcdGNvbmZpZy5jc3MgPSBcInVub2Nzc1wiO1xuXHR9XG59XG5mdW5jdGlvbiByZXNvbHZlRm9udHMoZm9udHMgPSB7fSkge1xuXHRjb25zdCB7IGZhbGxiYWNrcyA9IHRydWUsIGl0YWxpYyA9IGZhbHNlLCBwcm92aWRlciA9IFwiZ29vZ2xlXCIgfSA9IGZvbnRzO1xuXHRsZXQgc2FucyA9IHRvQXJyYXkoZm9udHMuc2FucykuZmxhdE1hcCgoaSkgPT4gaS5zcGxpdChcIixcIikpLm1hcCgoaSkgPT4gaS50cmltKCkpO1xuXHRsZXQgc2VyaWYgPSB0b0FycmF5KGZvbnRzLnNlcmlmKS5mbGF0TWFwKChpKSA9PiBpLnNwbGl0KFwiLFwiKSkubWFwKChpKSA9PiBpLnRyaW0oKSk7XG5cdGxldCBtb25vID0gdG9BcnJheShmb250cy5tb25vKS5mbGF0TWFwKChpKSA9PiBpLnNwbGl0KFwiLFwiKSkubWFwKChpKSA9PiBpLnRyaW0oKSk7XG5cdGNvbnN0IHdlaWdodHMgPSB0b0FycmF5KGZvbnRzLndlaWdodHMgfHwgXCIyMDAsNDAwLDYwMFwiKS5mbGF0TWFwKChpKSA9PiBpLnRvU3RyaW5nKCkuc3BsaXQoXCIsXCIpKS5tYXAoKGkpID0+IGkudHJpbSgpKTtcblx0Y29uc3QgY3VzdG9tID0gdG9BcnJheShmb250cy5jdXN0b20pLmZsYXRNYXAoKGkpID0+IGkuc3BsaXQoXCIsXCIpKS5tYXAoKGkpID0+IGkudHJpbSgpKTtcblx0Y29uc3QgbG9jYWwgPSB0b0FycmF5KGZvbnRzLmxvY2FsKS5mbGF0TWFwKChpKSA9PiBpLnNwbGl0KFwiLFwiKSkubWFwKChpKSA9PiBpLnRyaW0oKSk7XG5cdGNvbnN0IHdlYmZvbnRzID0gZm9udHMud2ViZm9udHMgPyBmb250cy53ZWJmb250cyA6IGZhbGxiYWNrcyA/IHVuaXEoW1xuXHRcdC4uLnNhbnMsXG5cdFx0Li4uc2VyaWYsXG5cdFx0Li4ubW9ubyxcblx0XHQuLi5jdXN0b21cblx0XSkuZmlsdGVyKChpKSA9PiAhbG9jYWwuaW5jbHVkZXMoaSkpIDogW107XG5cdGZ1bmN0aW9uIHRvUXVvdGVkKGZvbnQpIHtcblx0XHRpZiAoUkVfUVVPVEVEX1NUUklORy50ZXN0KGZvbnQpKSByZXR1cm4gZm9udDtcblx0XHRyZXR1cm4gYFwiJHtmb250fVwiYDtcblx0fVxuXHRpZiAoZmFsbGJhY2tzKSB7XG5cdFx0c2FucyA9IHVuaXEoW1xuXHRcdFx0Li4uc2Fucy5tYXAodG9RdW90ZWQpLFxuXHRcdFx0XCJ1aS1zYW5zLXNlcmlmXCIsXG5cdFx0XHRcInN5c3RlbS11aVwiLFxuXHRcdFx0XCItYXBwbGUtc3lzdGVtXCIsXG5cdFx0XHRcIkJsaW5rTWFjU3lzdGVtRm9udFwiLFxuXHRcdFx0XCJcXFwiU2Vnb2UgVUlcXFwiXCIsXG5cdFx0XHRcIlJvYm90b1wiLFxuXHRcdFx0XCJcXFwiSGVsdmV0aWNhIE5ldWVcXFwiXCIsXG5cdFx0XHRcIkFyaWFsXCIsXG5cdFx0XHRcIlxcXCJOb3RvIFNhbnNcXFwiXCIsXG5cdFx0XHRcInNhbnMtc2VyaWZcIixcblx0XHRcdFwiXFxcIkFwcGxlIENvbG9yIEVtb2ppXFxcIlwiLFxuXHRcdFx0XCJcXFwiU2Vnb2UgVUkgRW1vamlcXFwiXCIsXG5cdFx0XHRcIlxcXCJTZWdvZSBVSSBTeW1ib2xcXFwiXCIsXG5cdFx0XHRcIlxcXCJOb3RvIENvbG9yIEVtb2ppXFxcIlwiXG5cdFx0XSk7XG5cdFx0c2VyaWYgPSB1bmlxKFtcblx0XHRcdC4uLnNlcmlmLm1hcCh0b1F1b3RlZCksXG5cdFx0XHRcInVpLXNlcmlmXCIsXG5cdFx0XHRcIkdlb3JnaWFcIixcblx0XHRcdFwiQ2FtYnJpYVwiLFxuXHRcdFx0XCJcXFwiVGltZXMgTmV3IFJvbWFuXFxcIlwiLFxuXHRcdFx0XCJUaW1lc1wiLFxuXHRcdFx0XCJzZXJpZlwiXG5cdFx0XSk7XG5cdFx0bW9ubyA9IHVuaXEoW1xuXHRcdFx0Li4ubW9uby5tYXAodG9RdW90ZWQpLFxuXHRcdFx0XCJ1aS1tb25vc3BhY2VcIixcblx0XHRcdFwiU0ZNb25vLVJlZ3VsYXJcIixcblx0XHRcdFwiTWVubG9cIixcblx0XHRcdFwiTW9uYWNvXCIsXG5cdFx0XHRcIkNvbnNvbGFzXCIsXG5cdFx0XHRcIlxcXCJMaWJlcmF0aW9uIE1vbm9cXFwiXCIsXG5cdFx0XHRcIlxcXCJDb3VyaWVyIE5ld1xcXCJcIixcblx0XHRcdFwibW9ub3NwYWNlXCJcblx0XHRdKTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdHNhbnMsXG5cdFx0c2VyaWYsXG5cdFx0bW9ubyxcblx0XHR3ZWJmb250cyxcblx0XHRwcm92aWRlcixcblx0XHRsb2NhbCxcblx0XHRpdGFsaWMsXG5cdFx0d2VpZ2h0c1xuXHR9O1xufVxuZnVuY3Rpb24gcmVzb2x2ZURyYXdpbmdzKG9wdGlvbnMgPSB7fSwgZmlsZXBhdGgpIHtcblx0Y29uc3QgeyBlbmFibGVkID0gdHJ1ZSwgcGVyc2lzdCA9IGZhbHNlLCBwcmVzZW50ZXJPbmx5ID0gZmFsc2UsIHN5bmNBbGwgPSB0cnVlIH0gPSBvcHRpb25zO1xuXHRyZXR1cm4ge1xuXHRcdGVuYWJsZWQsXG5cdFx0cGVyc2lzdDogdHlwZW9mIHBlcnNpc3QgPT09IFwic3RyaW5nXCIgPyBwZXJzaXN0IDogcGVyc2lzdCA/IGAuc2xpZGV2L2RyYXdpbmdzJHtmaWxlcGF0aCA/IGAvJHtmaWxlcGF0aC5tYXRjaChSRV9GSUxFTkFNRV9TVEVNKT8uWzFdfWAgOiBcIlwifWAgOiBmYWxzZSxcblx0XHRwcmVzZW50ZXJPbmx5LFxuXHRcdHN5bmNBbGxcblx0fTtcbn1cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNyYy9jb3JlLnRzXG5jb25zdCBSRV9GUk9OVE1BVFRFUiA9IC9eLS0tLipcXHI/XFxuKFtcXHNcXFNdKj8pLS0tLztcbmNvbnN0IFJFX1lBTUxfQ09ERUJMT0NLID0gL15cXHMqYGBgeWE/bWwoW1xcc1xcU10qPylgYGAvO1xuY29uc3QgUkVfRE9MTEFSX0lOTElORSA9IC9cXCQuKj9cXCQvO1xuY29uc3QgUkVfRE9MTEFSX0JMT0NLID0gL1xcJFxcJC87XG5jb25zdCBSRV9NT05BQ09fQkxPQ0sgPSAvXFx7bW9uYWNvLipcXH0vO1xuY29uc3QgUkVfVFdFRVRfVEFHID0gLzxUd2VldFxcYi87XG5jb25zdCBSRV9CTFVFU0tZX1RBRyA9IC88Qmx1ZVNreVxcYi87XG5jb25zdCBSRV9NRVJNQUlEX0NPREVCTE9DSyA9IC9eYGBgbWVybWFpZC9tO1xuY29uc3QgUkVfSEVBRElORyA9IC9eKCMrKSAoLiopJC9tO1xuY29uc3QgUkVfQ09ERV9CTE9DSyA9IC9eYGBgW1xcc1xcU10rP15gYGAvZ207XG5jb25zdCBSRV9MRUFESU5HX0JBQ0tUSUNLUyA9IC9eXFxzKmArLztcbmNvbnN0IFJFX0NSTEYgPSAvXFxyP1xcbi9nO1xuZnVuY3Rpb24gYWR2YW5jZUh0bWxDb21tZW50U3RhdGUobGluZSwgaW5IdG1sQ29tbWVudCkge1xuXHRsZXQgY3Vyc29yID0gMDtcblx0d2hpbGUgKGN1cnNvciA8IGxpbmUubGVuZ3RoKSBpZiAoaW5IdG1sQ29tbWVudCkge1xuXHRcdGNvbnN0IGVuZCA9IGxpbmUuaW5kZXhPZihcIi0tPlwiLCBjdXJzb3IpO1xuXHRcdGlmIChlbmQgPCAwKSByZXR1cm4gdHJ1ZTtcblx0XHRpbkh0bWxDb21tZW50ID0gZmFsc2U7XG5cdFx0Y3Vyc29yID0gZW5kICsgMztcblx0fSBlbHNlIHtcblx0XHRjb25zdCBzdGFydCA9IGxpbmUuaW5kZXhPZihcIjwhLS1cIiwgY3Vyc29yKTtcblx0XHRpZiAoc3RhcnQgPCAwKSByZXR1cm4gZmFsc2U7XG5cdFx0Y29uc3QgZW5kID0gbGluZS5pbmRleE9mKFwiLS0+XCIsIHN0YXJ0ICsgNCk7XG5cdFx0aWYgKGVuZCA8IDApIHJldHVybiB0cnVlO1xuXHRcdGN1cnNvciA9IGVuZCArIDM7XG5cdH1cblx0cmV0dXJuIGluSHRtbENvbW1lbnQ7XG59XG5mdW5jdGlvbiBzdHJpbmdpZnkoZGF0YSkge1xuXHRyZXR1cm4gYCR7ZGF0YS5zbGlkZXMubWFwKHN0cmluZ2lmeVNsaWRlKS5qb2luKFwiXFxuXCIpLnRyaW0oKX1cXG5gO1xufVxuZnVuY3Rpb24gc3RyaW5naWZ5U2xpZGUoZGF0YSwgaWR4ID0gMCkge1xuXHRyZXR1cm4gZGF0YS5yYXcuc3RhcnRzV2l0aChcIi0tLVwiKSB8fCBpZHggPT09IDAgPyBkYXRhLnJhdyA6IGAtLS1cXG4ke2Vuc3VyZVByZWZpeChcIlxcblwiLCBkYXRhLnJhdyl9YDtcbn1cbmZ1bmN0aW9uIHByZXR0aWZ5U2xpZGUoZGF0YSkge1xuXHRkYXRhLmNvbnRlbnQgPSBkYXRhLmNvbnRlbnQudHJpbSgpID8gYFxcbiR7ZGF0YS5jb250ZW50LnRyaW0oKX1cXG5gIDogXCJcIjtcblx0ZGF0YS5yYXcgPSBkYXRhLmZyb250bWF0dGVyRG9jPy5jb250ZW50cyA/IGRhdGEuZnJvbnRtYXR0ZXJTdHlsZSA9PT0gXCJ5YW1sXCIgPyBgXFxgXFxgXFxgeWFtbFxcbiR7ZGF0YS5mcm9udG1hdHRlckRvYy50b1N0cmluZygpLnRyaW0oKX1cXG5cXGBcXGBcXGBcXG4ke2RhdGEuY29udGVudH1gIDogYC0tLVxcbiR7ZGF0YS5mcm9udG1hdHRlckRvYy50b1N0cmluZygpLnRyaW0oKX1cXG4tLS1cXG4ke2RhdGEuY29udGVudH1gIDogZGF0YS5jb250ZW50O1xuXHRpZiAoZGF0YS5ub3RlKSBkYXRhLnJhdyArPSBgXFxuPCEtLVxcbiR7ZGF0YS5ub3RlLnRyaW0oKX1cXG4tLT5cXG5gO1xuXHRyZXR1cm4gZGF0YTtcbn1cbmZ1bmN0aW9uIHByZXR0aWZ5KGRhdGEpIHtcblx0ZGF0YS5zbGlkZXMuZm9yRWFjaChwcmV0dGlmeVNsaWRlKTtcblx0cmV0dXJuIGRhdGE7XG59XG5mdW5jdGlvbiBtYXR0ZXIoY29kZSwgb3B0aW9ucykge1xuXHRsZXQgdHlwZTtcblx0bGV0IHJhdztcblx0bGV0IGNvbnRlbnQgPSBjb2RlLnJlcGxhY2UoUkVfRlJPTlRNQVRURVIsIChfLCBmKSA9PiB7XG5cdFx0dHlwZSA9IFwiZnJvbnRtYXR0ZXJcIjtcblx0XHRyYXcgPSBmO1xuXHRcdHJldHVybiBcIlwiO1xuXHR9KTtcblx0aWYgKHR5cGUgIT09IFwiZnJvbnRtYXR0ZXJcIikgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZShSRV9ZQU1MX0NPREVCTE9DSywgKF8sIGYpID0+IHtcblx0XHR0eXBlID0gXCJ5YW1sXCI7XG5cdFx0cmF3ID0gZjtcblx0XHRyZXR1cm4gXCJcIjtcblx0fSk7XG5cdGNvbnN0IGRvYyA9IHJhdyAmJiAhb3B0aW9ucy5ub1BhcnNlWUFNTCA/IFlBTUwucGFyc2VEb2N1bWVudChyYXcpIDogdm9pZCAwO1xuXHRyZXR1cm4ge1xuXHRcdHR5cGUsXG5cdFx0cmF3LFxuXHRcdGRvYyxcblx0XHRkYXRhOiBkb2M/LnRvSlNPTigpLFxuXHRcdGNvbnRlbnRcblx0fTtcbn1cbmNvbnN0IElNQUdFX0VYVEVOU0lPTlMgPSAvXFwuKD86cG5nfGpwZT9nfGdpZnxzdmd8d2VicHxhdmlmfGljb3xibXB8dGlmZj8pJC9pO1xuY29uc3QgUkVfTURfSU1BR0VfVElUTEUgPSAvXFxzKyg/OlwiW15cIl0qXCJ8J1teJ10qJylcXHMqJC87XG4vKipcbiogU3RyaXAgdGhlIG9wdGlvbmFsIENvbW1vbk1hcmsgdGl0bGUgYW5kIHRoZSBhbmdsZS1icmFja2V0IGZvcm0gZnJvbSBhXG4qIG1hcmtkb3duIGltYWdlIGRlc3RpbmF0aW9uLCBzbyBgIVthXSgveC5wbmcgXCJUaXRsZVwiKWAgeWllbGRzIGAveC5wbmdgLlxuKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZU1hcmtkb3duSW1hZ2VUYXJnZXQodGFyZ2V0KSB7XG5cdGNvbnN0IHVybCA9IHRhcmdldC50cmltKCkucmVwbGFjZShSRV9NRF9JTUFHRV9USVRMRSwgXCJcIikudHJpbSgpO1xuXHRyZXR1cm4gdXJsLnN0YXJ0c1dpdGgoXCI8XCIpICYmIHVybC5lbmRzV2l0aChcIj5cIikgPyB1cmwuc2xpY2UoMSwgLTEpLnRyaW0oKSA6IHVybDtcbn1cbi8qKlxuKiBFeHRyYWN0IGltYWdlIFVSTHMgZnJvbSBzbGlkZSBjb250ZW50IGFuZCBmcm9udG1hdHRlci5cbiogU3RyaXBzIGNvZGUgYmxvY2tzIGZpcnN0IHRvIGF2b2lkIGZhbHNlIHBvc2l0aXZlcy5cbiovXG5mdW5jdGlvbiBleHRyYWN0SW1hZ2VzVXNhZ2UoY29udGVudCwgZnJvbnRtYXR0ZXIpIHtcblx0Y29uc3QgaW1hZ2VzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcblx0Zm9yIChjb25zdCBrZXkgb2YgW1xuXHRcdFwiaW1hZ2VcIixcblx0XHRcImJhY2tncm91bmRJbWFnZVwiLFxuXHRcdFwiYmFja2dyb3VuZFwiXG5cdF0pIHtcblx0XHRjb25zdCB2YWwgPSBmcm9udG1hdHRlcltrZXldO1xuXHRcdGlmICh0eXBlb2YgdmFsID09PSBcInN0cmluZ1wiICYmIHZhbCAmJiAhdmFsLnN0YXJ0c1dpdGgoXCJkYXRhOlwiKSkge1xuXHRcdFx0aWYgKGtleSA9PT0gXCJiYWNrZ3JvdW5kXCIpIHtcblx0XHRcdFx0aWYgKElNQUdFX0VYVEVOU0lPTlMudGVzdCh2YWwpIHx8IHZhbC5zdGFydHNXaXRoKFwiL1wiKSB8fCB2YWwuc3RhcnRzV2l0aChcImh0dHBcIikpIGltYWdlcy5hZGQodmFsKTtcblx0XHRcdH0gZWxzZSBpbWFnZXMuYWRkKHZhbCk7XG5cdFx0fVxuXHR9XG5cdGNvbnN0IHN0cmlwcGVkID0gY29udGVudC5yZXBsYWNlKFJFX0NPREVfQkxPQ0ssIFwiXCIpO1xuXHRmb3IgKGNvbnN0IFssIHRhcmdldF0gb2Ygc3RyaXBwZWQubWF0Y2hBbGwoLyFcXFtbXlxcXV0qXFxdXFwoKFteKV0rKVxcKS9nKSkge1xuXHRcdGNvbnN0IHVybCA9IG5vcm1hbGl6ZU1hcmtkb3duSW1hZ2VUYXJnZXQodGFyZ2V0KTtcblx0XHRpZiAodXJsICYmICF1cmwuc3RhcnRzV2l0aChcImRhdGE6XCIpKSBpbWFnZXMuYWRkKHVybCk7XG5cdH1cblx0Zm9yIChjb25zdCBbLCB1cmxdIG9mIHN0cmlwcGVkLm1hdGNoQWxsKC9cXGIoPzpzcmN8aW1hZ2UpPVtcIiddKFteXCInXSspW1wiJ10vZykpIGlmICh1cmwgJiYgIXVybC5zdGFydHNXaXRoKFwiZGF0YTpcIikgJiYgIXVybC5pbmNsdWRlcyhcInt7XCIpICYmIElNQUdFX0VYVEVOU0lPTlMudGVzdCh1cmwpKSBpbWFnZXMuYWRkKHVybC50cmltKCkpO1xuXHRmb3IgKGNvbnN0IFssIHVybF0gb2Ygc3RyaXBwZWQubWF0Y2hBbGwoLzooPzpzcmN8aW1hZ2UpPVtcIiddJyhbXiddKyknW1wiJ10vZykpIGlmICh1cmwgJiYgIXVybC5zdGFydHNXaXRoKFwiZGF0YTpcIikgJiYgSU1BR0VfRVhURU5TSU9OUy50ZXN0KHVybCkpIGltYWdlcy5hZGQodXJsLnRyaW0oKSk7XG5cdGZvciAoY29uc3QgWywgdXJsXSBvZiBzdHJpcHBlZC5tYXRjaEFsbCgvdXJsXFwoW1wiJ10/KFteXCInKV0rKVtcIiddP1xcKS9nKSkgaWYgKHVybCAmJiAhdXJsLnN0YXJ0c1dpdGgoXCJkYXRhOlwiKSAmJiBJTUFHRV9FWFRFTlNJT05TLnRlc3QodXJsKSkgaW1hZ2VzLmFkZCh1cmwudHJpbSgpKTtcblx0cmV0dXJuIEFycmF5LmZyb20oaW1hZ2VzKTtcbn1cbmZ1bmN0aW9uIGRldGVjdEZlYXR1cmVzKGNvZGUpIHtcblx0cmV0dXJuIHtcblx0XHRrYXRleDogISFjb2RlLm1hdGNoKFJFX0RPTExBUl9JTkxJTkUpIHx8ICEhY29kZS5tYXRjaChSRV9ET0xMQVJfQkxPQ0spLFxuXHRcdG1vbmFjbzogUkVfTU9OQUNPX0JMT0NLLnRlc3QoY29kZSkgPyBzY2FuTW9uYWNvUmVmZXJlbmNlZE1vZHMoY29kZSkgOiBmYWxzZSxcblx0XHR0d2VldDogISFjb2RlLm1hdGNoKFJFX1RXRUVUX1RBRyksXG5cdFx0Ymx1ZXNreTogISFjb2RlLm1hdGNoKFJFX0JMVUVTS1lfVEFHKSxcblx0XHRtZXJtYWlkOiAhIWNvZGUubWF0Y2goUkVfTUVSTUFJRF9DT0RFQkxPQ0spXG5cdH07XG59XG5mdW5jdGlvbiBwYXJzZVNsaWRlKHJhdywgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IG1hdHRlclJlc3VsdCA9IG1hdHRlcihyYXcsIG9wdGlvbnMpO1xuXHRsZXQgbm90ZTtcblx0Y29uc3QgZnJvbnRtYXR0ZXIgPSBtYXR0ZXJSZXN1bHQuZGF0YSB8fCB7fTtcblx0bGV0IGNvbnRlbnQgPSBtYXR0ZXJSZXN1bHQuY29udGVudC50cmltKCk7XG5cdGNvbnN0IHJldmlzaW9uID0gaGFzaChyYXcudHJpbSgpKTtcblx0Y29uc3QgY29tbWVudHMgPSBBcnJheS5mcm9tKGNvbnRlbnQubWF0Y2hBbGwoLzwhLS0oW1xcc1xcU10qPyktLT4vZykpO1xuXHRpZiAoY29tbWVudHMubGVuZ3RoKSB7XG5cdFx0Y29uc3QgbGFzdCA9IGNvbW1lbnRzW2NvbW1lbnRzLmxlbmd0aCAtIDFdO1xuXHRcdGlmIChsYXN0LmluZGV4ICE9PSB2b2lkIDAgJiYgbGFzdC5pbmRleCArIGxhc3RbMF0ubGVuZ3RoID49IGNvbnRlbnQubGVuZ3RoKSB7XG5cdFx0XHRub3RlID0gbGFzdFsxXS50cmltKCk7XG5cdFx0XHRjb250ZW50ID0gY29udGVudC5zbGljZSgwLCBsYXN0LmluZGV4KS50cmltKCk7XG5cdFx0fVxuXHR9XG5cdGxldCB0aXRsZTtcblx0bGV0IGxldmVsO1xuXHRpZiAoZnJvbnRtYXR0ZXIudGl0bGUgfHwgZnJvbnRtYXR0ZXIubmFtZSkgdGl0bGUgPSBmcm9udG1hdHRlci50aXRsZSB8fCBmcm9udG1hdHRlci5uYW1lO1xuXHRlbHNlIHtcblx0XHRjb25zdCBtYXRjaCA9IGNvbnRlbnQucmVwbGFjZShSRV9DT0RFX0JMT0NLLCBcIlwiKS5tYXRjaChSRV9IRUFESU5HKTtcblx0XHR0aXRsZSA9IG1hdGNoPy5bMl0/LnRyaW0oKTtcblx0XHRsZXZlbCA9IG1hdGNoPy5bMV0/Lmxlbmd0aDtcblx0fVxuXHRpZiAoZnJvbnRtYXR0ZXIubGV2ZWwpIGxldmVsID0gZnJvbnRtYXR0ZXIubGV2ZWwgfHwgMTtcblx0Y29uc3QgaW1hZ2VzID0gZXh0cmFjdEltYWdlc1VzYWdlKGNvbnRlbnQsIGZyb250bWF0dGVyKTtcblx0cmV0dXJuIHtcblx0XHRyYXcsXG5cdFx0dGl0bGUsXG5cdFx0bGV2ZWwsXG5cdFx0cmV2aXNpb24sXG5cdFx0Y29udGVudCxcblx0XHRjb250ZW50UmF3OiBjb250ZW50LFxuXHRcdGZyb250bWF0dGVyLFxuXHRcdGZyb250bWF0dGVyU3R5bGU6IG1hdHRlclJlc3VsdC50eXBlLFxuXHRcdGZyb250bWF0dGVyRG9jOiBtYXR0ZXJSZXN1bHQuZG9jLFxuXHRcdGZyb250bWF0dGVyUmF3OiBtYXR0ZXJSZXN1bHQucmF3LFxuXHRcdG5vdGUsXG5cdFx0aW1hZ2VzXG5cdH07XG59XG5hc3luYyBmdW5jdGlvbiBwYXJzZShtYXJrZG93biwgZmlsZXBhdGgsIGV4dGVuc2lvbnMsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCBsaW5lcyA9IG1hcmtkb3duLnNwbGl0KG9wdGlvbnMucHJlc2VydmVDUiA/IFwiXFxuXCIgOiBSRV9DUkxGKTtcblx0Y29uc3Qgc2xpZGVzID0gW107XG5cdGxldCBzdGFydCA9IDA7XG5cdGxldCBjb250ZW50U3RhcnQgPSAwO1xuXHRsZXQgaW5IdG1sQ29tbWVudCA9IGZhbHNlO1xuXHRhc3luYyBmdW5jdGlvbiBzbGljZShlbmQpIHtcblx0XHRpZiAoc3RhcnQgPT09IGVuZCkgcmV0dXJuO1xuXHRcdGNvbnN0IHNsaWRlID0ge1xuXHRcdFx0Li4ucGFyc2VTbGlkZShsaW5lcy5zbGljZShzdGFydCwgZW5kKS5qb2luKFwiXFxuXCIpLCBvcHRpb25zKSxcblx0XHRcdGZpbGVwYXRoLFxuXHRcdFx0aW5kZXg6IHNsaWRlcy5sZW5ndGgsXG5cdFx0XHRzdGFydCxcblx0XHRcdGNvbnRlbnRTdGFydCxcblx0XHRcdGVuZFxuXHRcdH07XG5cdFx0aWYgKGV4dGVuc2lvbnMpIGZvciAoY29uc3QgZSBvZiBleHRlbnNpb25zKSB7XG5cdFx0XHRpZiAoZS50cmFuc2Zvcm1TbGlkZSkge1xuXHRcdFx0XHRjb25zdCBuZXdDb250ZW50ID0gYXdhaXQgZS50cmFuc2Zvcm1TbGlkZShzbGlkZS5jb250ZW50LCBzbGlkZS5mcm9udG1hdHRlcik7XG5cdFx0XHRcdGlmIChuZXdDb250ZW50ICE9PSB2b2lkIDApIHNsaWRlLmNvbnRlbnQgPSBuZXdDb250ZW50O1xuXHRcdFx0XHRpZiAodHlwZW9mIHNsaWRlLmZyb250bWF0dGVyLnRpdGxlID09PSBcInN0cmluZ1wiKSBzbGlkZS50aXRsZSA9IHNsaWRlLmZyb250bWF0dGVyLnRpdGxlO1xuXHRcdFx0XHRpZiAodHlwZW9mIHNsaWRlLmZyb250bWF0dGVyLmxldmVsID09PSBcIm51bWJlclwiKSBzbGlkZS5sZXZlbCA9IHNsaWRlLmZyb250bWF0dGVyLmxldmVsO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGUudHJhbnNmb3JtTm90ZSkge1xuXHRcdFx0XHRjb25zdCBuZXdOb3RlID0gYXdhaXQgZS50cmFuc2Zvcm1Ob3RlKHNsaWRlLm5vdGUsIHNsaWRlLmZyb250bWF0dGVyKTtcblx0XHRcdFx0aWYgKG5ld05vdGUgIT09IHZvaWQgMCkgc2xpZGUubm90ZSA9IG5ld05vdGU7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHNsaWRlcy5wdXNoKHNsaWRlKTtcblx0XHRzdGFydCA9IGVuZCArIDE7XG5cdFx0Y29udGVudFN0YXJ0ID0gZW5kICsgMTtcblx0fVxuXHRpZiAoZXh0ZW5zaW9ucykge1xuXHRcdGZvciAoY29uc3QgZSBvZiBleHRlbnNpb25zKSBpZiAoZS50cmFuc2Zvcm1SYXdMaW5lcykgYXdhaXQgZS50cmFuc2Zvcm1SYXdMaW5lcyhsaW5lcyk7XG5cdH1cblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xuXHRcdGNvbnN0IHJhd0xpbmUgPSBsaW5lc1tpXTtcblx0XHRjb25zdCBsaW5lID0gcmF3TGluZS50cmltRW5kKCk7XG5cdFx0aWYgKGluSHRtbENvbW1lbnQpIHtcblx0XHRcdGluSHRtbENvbW1lbnQgPSBhZHZhbmNlSHRtbENvbW1lbnRTdGF0ZShyYXdMaW5lLCB0cnVlKTtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblx0XHRpZiAobGluZS5zdGFydHNXaXRoKFwiLS0tXCIpKSB7XG5cdFx0XHRhd2FpdCBzbGljZShpKTtcblx0XHRcdGNvbnN0IG5leHQgPSBsaW5lc1tpICsgMV07XG5cdFx0XHRpZiAobGluZVszXSAhPT0gXCItXCIgJiYgbmV4dD8udHJpbSgpKSB7XG5cdFx0XHRcdHN0YXJ0ID0gaTtcblx0XHRcdFx0Zm9yIChpICs9IDE7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykgaWYgKGxpbmVzW2ldLnRyaW1FbmQoKSA9PT0gXCItLS1cIikgYnJlYWs7XG5cdFx0XHRcdGNvbnRlbnRTdGFydCA9IGkgKyAxO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAobGluZS50cmltU3RhcnQoKS5zdGFydHNXaXRoKFwiYGBgXCIpKSB7XG5cdFx0XHRjb25zdCBjb2RlQmxvY2tMZXZlbCA9IGxpbmUubWF0Y2goUkVfTEVBRElOR19CQUNLVElDS1MpWzBdO1xuXHRcdFx0bGV0IGogPSBpICsgMTtcblx0XHRcdGZvciAoOyBqIDwgbGluZXMubGVuZ3RoOyBqKyspIGlmIChsaW5lc1tqXS5zdGFydHNXaXRoKGNvZGVCbG9ja0xldmVsKSkgYnJlYWs7XG5cdFx0XHRpZiAoaiAhPT0gbGluZXMubGVuZ3RoKSBpID0gajtcblx0XHR9IGVsc2UgaW5IdG1sQ29tbWVudCA9IGFkdmFuY2VIdG1sQ29tbWVudFN0YXRlKHJhd0xpbmUsIGZhbHNlKTtcblx0fVxuXHRpZiAoc3RhcnQgPD0gbGluZXMubGVuZ3RoIC0gMSkgYXdhaXQgc2xpY2UobGluZXMubGVuZ3RoKTtcblx0cmV0dXJuIHtcblx0XHRmaWxlcGF0aCxcblx0XHRyYXc6IG1hcmtkb3duLFxuXHRcdHNsaWRlc1xuXHR9O1xufVxuZnVuY3Rpb24gcGFyc2VTeW5jKG1hcmtkb3duLCBmaWxlcGF0aCwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IGxpbmVzID0gbWFya2Rvd24uc3BsaXQob3B0aW9ucy5wcmVzZXJ2ZUNSID8gXCJcXG5cIiA6IFJFX0NSTEYpO1xuXHRjb25zdCBzbGlkZXMgPSBbXTtcblx0bGV0IHN0YXJ0ID0gMDtcblx0bGV0IGNvbnRlbnRTdGFydCA9IDA7XG5cdGxldCBpbkh0bWxDb21tZW50ID0gZmFsc2U7XG5cdGZ1bmN0aW9uIHNsaWNlKGVuZCkge1xuXHRcdGlmIChzdGFydCA9PT0gZW5kKSByZXR1cm47XG5cdFx0Y29uc3Qgc2xpZGUgPSB7XG5cdFx0XHQuLi5wYXJzZVNsaWRlKGxpbmVzLnNsaWNlKHN0YXJ0LCBlbmQpLmpvaW4oXCJcXG5cIiksIG9wdGlvbnMpLFxuXHRcdFx0ZmlsZXBhdGgsXG5cdFx0XHRpbmRleDogc2xpZGVzLmxlbmd0aCxcblx0XHRcdHN0YXJ0LFxuXHRcdFx0Y29udGVudFN0YXJ0LFxuXHRcdFx0ZW5kXG5cdFx0fTtcblx0XHRzbGlkZXMucHVzaChzbGlkZSk7XG5cdFx0c3RhcnQgPSBlbmQgKyAxO1xuXHRcdGNvbnRlbnRTdGFydCA9IGVuZCArIDE7XG5cdH1cblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xuXHRcdGNvbnN0IHJhd0xpbmUgPSBsaW5lc1tpXTtcblx0XHRjb25zdCBsaW5lID0gcmF3TGluZS50cmltRW5kKCk7XG5cdFx0aWYgKGluSHRtbENvbW1lbnQpIHtcblx0XHRcdGluSHRtbENvbW1lbnQgPSBhZHZhbmNlSHRtbENvbW1lbnRTdGF0ZShyYXdMaW5lLCB0cnVlKTtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblx0XHRpZiAobGluZS5zdGFydHNXaXRoKFwiLS0tXCIpKSB7XG5cdFx0XHRzbGljZShpKTtcblx0XHRcdGNvbnN0IG5leHQgPSBsaW5lc1tpICsgMV07XG5cdFx0XHRpZiAobGluZVszXSAhPT0gXCItXCIgJiYgbmV4dD8udHJpbSgpKSB7XG5cdFx0XHRcdHN0YXJ0ID0gaTtcblx0XHRcdFx0Zm9yIChpICs9IDE7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykgaWYgKGxpbmVzW2ldLnRyaW1FbmQoKSA9PT0gXCItLS1cIikgYnJlYWs7XG5cdFx0XHRcdGNvbnRlbnRTdGFydCA9IGkgKyAxO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAobGluZS50cmltU3RhcnQoKS5zdGFydHNXaXRoKFwiYGBgXCIpKSB7XG5cdFx0XHRjb25zdCBjb2RlQmxvY2tMZXZlbCA9IGxpbmUubWF0Y2goUkVfTEVBRElOR19CQUNLVElDS1MpWzBdO1xuXHRcdFx0bGV0IGogPSBpICsgMTtcblx0XHRcdGZvciAoOyBqIDwgbGluZXMubGVuZ3RoOyBqKyspIGlmIChsaW5lc1tqXS5zdGFydHNXaXRoKGNvZGVCbG9ja0xldmVsKSkgYnJlYWs7XG5cdFx0XHRpZiAoaiAhPT0gbGluZXMubGVuZ3RoKSBpID0gajtcblx0XHR9IGVsc2UgaW5IdG1sQ29tbWVudCA9IGFkdmFuY2VIdG1sQ29tbWVudFN0YXRlKHJhd0xpbmUsIGZhbHNlKTtcblx0fVxuXHRpZiAoc3RhcnQgPD0gbGluZXMubGVuZ3RoIC0gMSkgc2xpY2UobGluZXMubGVuZ3RoKTtcblx0cmV0dXJuIHtcblx0XHRmaWxlcGF0aCxcblx0XHRyYXc6IG1hcmtkb3duLFxuXHRcdHNsaWRlc1xuXHR9O1xufVxuZnVuY3Rpb24gc2Nhbk1vbmFjb1JlZmVyZW5jZWRNb2RzKG1kKSB7XG5cdGNvbnN0IHR5cGVzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcblx0Y29uc3QgZGVwcyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG5cdG1kLnJlcGxhY2UoL15gYGAoXFx3KylcXHMqXFx7bW9uYWNvKFtefV0qKVxcfVxccyooXFxTW1xcc1xcU10qPyleYGBgL2dtLCAoZnVsbCwgbGFuZyA9IFwidHNcIiwga2luZCwgY29kZSkgPT4ge1xuXHRcdGxhbmcgPSBsYW5nLnRyaW0oKTtcblx0XHRjb25zdCBpc0RlcCA9IGtpbmQgPT09IFwiLXJ1blwiO1xuXHRcdGlmIChbXG5cdFx0XHRcImpzXCIsXG5cdFx0XHRcImphdmFzY3JpcHRcIixcblx0XHRcdFwidHNcIixcblx0XHRcdFwidHlwZXNjcmlwdFwiXG5cdFx0XS5pbmNsdWRlcyhsYW5nKSkge1xuXHRcdFx0Zm9yIChjb25zdCBbLCAsIHNwZWNpZmllcl0gb2YgY29kZS5tYXRjaEFsbCgvXFxzK2Zyb21cXHMrKFtcIiddKShbLy5cXHdALV0rKVxcMS9nKSkgaWYgKHNwZWNpZmllcikge1xuXHRcdFx0XHRpZiAoIVwiLi9cIi5pbmNsdWRlcyhzcGVjaWZpZXIpKSB0eXBlcy5hZGQoc3BlY2lmaWVyKTtcblx0XHRcdFx0aWYgKGlzRGVwKSBkZXBzLmFkZChzcGVjaWZpZXIpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gXCJcIjtcblx0fSk7XG5cdHJldHVybiB7XG5cdFx0dHlwZXM6IEFycmF5LmZyb20odHlwZXMpLFxuXHRcdGRlcHM6IEFycmF5LmZyb20oZGVwcylcblx0fTtcbn1cbmZ1bmN0aW9uIGhhc2goc3RyKSB7XG5cdGxldCBoYXNoID0gMDtcblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcblx0XHRoYXNoID0gKGhhc2ggPDwgNSkgLSBoYXNoICsgc3RyLmNoYXJDb2RlQXQoaSk7XG5cdFx0aGFzaCB8PSAwO1xuXHR9XG5cdHJldHVybiBoYXNoLnRvU3RyaW5nKDM2KS5zbGljZSgwLCAxMik7XG59XG4vLyNlbmRyZWdpb25cbmV4cG9ydCB7IGRldGVjdEZlYXR1cmVzLCBleHRyYWN0SW1hZ2VzVXNhZ2UsIGdldERlZmF1bHRDb25maWcsIHBhcnNlLCBwYXJzZUFzcGVjdFJhdGlvLCBwYXJzZVJhbmdlU3RyaW5nLCBwYXJzZVNsaWRlLCBwYXJzZVN5bmMsIHBhcnNlVGltZVN0cmluZywgcGFyc2VUaW1lc3BsaXRzLCBwcmV0dGlmeSwgcHJldHRpZnlTbGlkZSwgcmVzb2x2ZUNvbmZpZywgcmVzb2x2ZUZvbnRzLCBzdHJpbmdpZnksIHN0cmluZ2lmeVNsaWRlLCB2ZXJpZnlDb25maWcgfTtcbiIsImxldCBfbGF6eU1hdGNoID0gKCkgPT4geyB2YXIgX19saWJfXz0oKCk9Pnt2YXIgbT1PYmplY3QuZGVmaW5lUHJvcGVydHksVj1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLEc9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMsVD1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LHE9KHIsZSk9Pntmb3IodmFyIG4gaW4gZSltKHIsbix7Z2V0OmVbbl0sZW51bWVyYWJsZTp0cnVlfSk7fSxIPShyLGUsbixhKT0+e2lmKGUmJnR5cGVvZiBlPT1cIm9iamVjdFwifHx0eXBlb2YgZT09XCJmdW5jdGlvblwiKWZvcihsZXQgdCBvZiBHKGUpKSFULmNhbGwocix0KSYmdCE9PW4mJm0ocix0LHtnZXQ6KCk9PmVbdF0sZW51bWVyYWJsZTohKGE9VihlLHQpKXx8YS5lbnVtZXJhYmxlfSk7cmV0dXJuIHJ9LEo9cj0+SChtKHt9LFwiX19lc01vZHVsZVwiLHt2YWx1ZTp0cnVlfSksciksdz17fTtxKHcse2RlZmF1bHQ6KCk9PnJlfSk7dmFyIEE9cj0+QXJyYXkuaXNBcnJheShyKSxkPXI9PnR5cGVvZiByPT1cImZ1bmN0aW9uXCIsUT1yPT5yLmxlbmd0aD09PTAsVz1yPT50eXBlb2Ygcj09XCJudW1iZXJcIixLPXI9PnR5cGVvZiByPT1cIm9iamVjdFwiJiZyIT09bnVsbCxYPXI9PnIgaW5zdGFuY2VvZiBSZWdFeHAsYj1yPT50eXBlb2Ygcj09XCJzdHJpbmdcIixoPXI9PnI9PT12b2lkIDAsWT1yPT57Y29uc3QgZT1uZXcgTWFwO3JldHVybiBuPT57Y29uc3QgYT1lLmdldChuKTtpZihhKXJldHVybiBhO2NvbnN0IHQ9cihuKTtyZXR1cm4gZS5zZXQobix0KSx0fX0scnI9KHIsZSxuPXt9KT0+e2NvbnN0IGE9e2NhY2hlOnt9LGlucHV0OnIsaW5kZXg6MCxpbmRleE1heDowLG9wdGlvbnM6bixvdXRwdXQ6W119O2lmKHYoZSkoYSkmJmEuaW5kZXg9PT1yLmxlbmd0aClyZXR1cm4gYS5vdXRwdXQ7dGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcGFyc2UgYXQgaW5kZXggJHthLmluZGV4TWF4fWApfSxpPShyLGUpPT5BKHIpP2VyKHIsZSk6YihyKT9hcihyLGUpOm5yKHIsZSksZXI9KHIsZSk9Pntjb25zdCBuPXt9O2Zvcihjb25zdCBhIG9mIHIpe2lmKGEubGVuZ3RoIT09MSl0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY2hhcmFjdGVyOiBcIiR7YX1cImApO2NvbnN0IHQ9YS5jaGFyQ29kZUF0KDApO25bdF09dHJ1ZTt9cmV0dXJuIGE9Pntjb25zdCB0PWEuaW5kZXgsbz1hLmlucHV0O2Zvcig7YS5pbmRleDxvLmxlbmd0aCYmby5jaGFyQ29kZUF0KGEuaW5kZXgpaW4gbjspYS5pbmRleCs9MTtjb25zdCB1PWEuaW5kZXg7aWYodT50KXtpZighaChlKSYmIWEub3B0aW9ucy5zaWxlbnQpe2NvbnN0IHM9YS5pbnB1dC5zbGljZSh0LHUpLGM9ZChlKT9lKHMsbyxTdHJpbmcodCkpOmU7aChjKXx8YS5vdXRwdXQucHVzaChjKTt9YS5pbmRleE1heD1NYXRoLm1heChhLmluZGV4TWF4LGEuaW5kZXgpO31yZXR1cm4gIHRydWV9fSxucj0ocixlKT0+e2NvbnN0IG49ci5zb3VyY2UsYT1yLmZsYWdzLnJlcGxhY2UoL3l8JC8sXCJ5XCIpLHQ9bmV3IFJlZ0V4cChuLGEpO3JldHVybiBnKG89Pnt0Lmxhc3RJbmRleD1vLmluZGV4O2NvbnN0IHU9dC5leGVjKG8uaW5wdXQpO2lmKHUpe2lmKCFoKGUpJiYhby5vcHRpb25zLnNpbGVudCl7Y29uc3Qgcz1kKGUpP2UoLi4udSxvLmlucHV0LFN0cmluZyhvLmluZGV4KSk6ZTtoKHMpfHxvLm91dHB1dC5wdXNoKHMpO31yZXR1cm4gby5pbmRleCs9dVswXS5sZW5ndGgsby5pbmRleE1heD1NYXRoLm1heChvLmluZGV4TWF4LG8uaW5kZXgpLHRydWV9ZWxzZSByZXR1cm4gIGZhbHNlfSl9LGFyPShyLGUpPT5uPT57aWYobi5pbnB1dC5zdGFydHNXaXRoKHIsbi5pbmRleCkpe2lmKCFoKGUpJiYhbi5vcHRpb25zLnNpbGVudCl7Y29uc3QgdD1kKGUpP2UocixuLmlucHV0LFN0cmluZyhuLmluZGV4KSk6ZTtoKHQpfHxuLm91dHB1dC5wdXNoKHQpO31yZXR1cm4gbi5pbmRleCs9ci5sZW5ndGgsbi5pbmRleE1heD1NYXRoLm1heChuLmluZGV4TWF4LG4uaW5kZXgpLHRydWV9ZWxzZSByZXR1cm4gIGZhbHNlfSxDPShyLGUsbixhKT0+e2NvbnN0IHQ9dihyKTtyZXR1cm4gZyhfKE0obz0+e2xldCB1PTA7Zm9yKDt1PG47KXtjb25zdCBzPW8uaW5kZXg7aWYoIXQobyl8fCh1Kz0xLG8uaW5kZXg9PT1zKSlicmVha31yZXR1cm4gdT49ZX0pKSl9LHRyPShyLGUpPT5DKHIsMCwxKSxmPShyLGUpPT5DKHIsMCwxLzApLHg9KHIsZSk9Pntjb25zdCBuPXIubWFwKHYpO3JldHVybiBnKF8oTShhPT57Zm9yKGxldCB0PTAsbz1uLmxlbmd0aDt0PG87dCsrKWlmKCFuW3RdKGEpKXJldHVybiAgZmFsc2U7cmV0dXJuICB0cnVlfSkpKX0sbD0ocixlKT0+e2NvbnN0IG49ci5tYXAodik7cmV0dXJuIGcoXyhhPT57Zm9yKGxldCB0PTAsbz1uLmxlbmd0aDt0PG87dCsrKWlmKG5bdF0oYSkpcmV0dXJuICB0cnVlO3JldHVybiAgZmFsc2V9KSl9LE09KHIsZT1mYWxzZSk9Pntjb25zdCBuPXYocik7cmV0dXJuIGE9Pntjb25zdCB0PWEuaW5kZXgsbz1hLm91dHB1dC5sZW5ndGgsdT1uKGEpO3JldHVybiAoIXV8fGUpJiYoYS5pbmRleD10LGEub3V0cHV0Lmxlbmd0aCE9PW8mJihhLm91dHB1dC5sZW5ndGg9bykpLHV9fSxfPShyLGUpPT57Y29uc3Qgbj12KHIpO3JldHVybiBufSxnPSgoKT0+e2xldCByPTA7cmV0dXJuIGU9Pntjb25zdCBuPXYoZSksYT1yKz0xO3JldHVybiB0PT57dmFyIG87aWYodC5vcHRpb25zLm1lbW9pemF0aW9uPT09ZmFsc2UpcmV0dXJuIG4odCk7Y29uc3QgdT10LmluZGV4LHM9KG89dC5jYWNoZSlbYV18fChvW2FdPW5ldyBNYXApLGM9cy5nZXQodSk7aWYoYz09PWZhbHNlKXJldHVybiAgZmFsc2U7aWYoVyhjKSlyZXR1cm4gdC5pbmRleD1jLHRydWU7aWYoYylyZXR1cm4gdC5pbmRleD1jLmluZGV4LGMub3V0cHV0Py5sZW5ndGgmJnQub3V0cHV0LnB1c2goLi4uYy5vdXRwdXQpLHRydWU7e2NvbnN0IFo9dC5vdXRwdXQubGVuZ3RoO2lmKG4odCkpe2NvbnN0IEQ9dC5pbmRleCxVPXQub3V0cHV0Lmxlbmd0aDtpZihVPlope2NvbnN0IGVlPXQub3V0cHV0LnNsaWNlKFosVSk7cy5zZXQodSx7aW5kZXg6RCxvdXRwdXQ6ZWV9KTt9ZWxzZSBzLnNldCh1LEQpO3JldHVybiAgdHJ1ZX1lbHNlIHJldHVybiBzLnNldCh1LGZhbHNlKSxmYWxzZX19fX0pKCksRT1yPT57bGV0IGU7cmV0dXJuIG49PihlfHwoZT12KHIoKSkpLGUobikpfSx2PVkocj0+e2lmKGQocikpcmV0dXJuIFEocik/RShyKTpyO2lmKGIocil8fFgocikpcmV0dXJuIGkocik7aWYoQShyKSlyZXR1cm4geChyKTtpZihLKHIpKXJldHVybiBsKE9iamVjdC52YWx1ZXMocikpO3Rocm93IG5ldyBFcnJvcihcIkludmFsaWQgcnVsZVwiKX0pLFA9XCJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5elwiLGlyPXI9PntsZXQgZT1cIlwiO2Zvcig7cj4wOyl7Y29uc3Qgbj0oci0xKSUyNjtlPVBbbl0rZSxyPU1hdGguZmxvb3IoKHItMSkvMjYpO31yZXR1cm4gZX0sTz1yPT57bGV0IGU9MDtmb3IobGV0IG49MCxhPXIubGVuZ3RoO248YTtuKyspZT1lKjI2K1AuaW5kZXhPZihyW25dKSsxO3JldHVybiBlfSxTPShyLGUpPT57aWYoZTxyKXJldHVybiBTKGUscik7Y29uc3Qgbj1bXTtmb3IoO3I8PWU7KW4ucHVzaChyKyspO3JldHVybiBufSxvcj0ocixlLG4pPT5TKHIsZSkubWFwKGE9PlN0cmluZyhhKS5wYWRTdGFydChuLFwiMFwiKSksUj0ocixlKT0+UyhPKHIpLE8oZSkpLm1hcChpcikscD1yPT5yLHo9cj0+dXIoZT0+cnIoZSxyLHttZW1vaXphdGlvbjpmYWxzZX0pLmpvaW4oXCJcIikpLHVyPXI9Pntjb25zdCBlPXt9O3JldHVybiBuPT5lW25dPz8oZVtuXT1yKG4pKX0sc3I9aSgvXlxcKlxcKlxcL1xcKiQvLFwiLipcIiksY3I9aSgvXlxcKlxcKlxcLyhcXCopPyhbIGEtekEtWjAtOS5fLV0rKSQvLChyLGUsbik9PmAuKiR7ZT9cIlwiOlwiKD86XnwvKVwifSR7bi5yZXBsYWNlQWxsKFwiLlwiLFwiXFxcXC5cIil9YCksbHI9aSgvXlxcKlxcKlxcLyhcXCopPyhbIGEtekEtWjAtOS5fLV0qKVxceyhbIGEtekEtWjAtOS5fLV0rKD86LFsgYS16QS1aMC05Ll8tXSspKilcXH0kLywocixlLG4sYSk9PmAuKiR7ZT9cIlwiOlwiKD86XnwvKVwifSR7bi5yZXBsYWNlQWxsKFwiLlwiLFwiXFxcXC5cIil9KD86JHthLnJlcGxhY2VBbGwoXCIsXCIsXCJ8XCIpLnJlcGxhY2VBbGwoXCIuXCIsXCJcXFxcLlwiKX0pYCkseT1pKC9cXFxcLi8scCkscHI9aSgvWyQuKis/Xigpe31bXFxdXFx8XS8scj0+YFxcXFwke3J9YCksdnI9aSgvLi8scCksaHI9aSgvXig/OiEhKSohKC4qKSQvLChyLGUpPT5gKD8hXiR7TChlKX0kKS4qP2ApLGRyPWkoL14oISEpKy8sXCJcIiksZnI9bChbaHIsZHJdKSx4cj1pKC9cXC8oXFwqXFwqXFwvKSsvLFwiKD86Ly4rL3wvKVwiKSxncj1pKC9eKFxcKlxcKlxcLykrLyxcIig/Ol58LiovKVwiKSxtcj1pKC9cXC8oXFwqXFwqKSQvLFwiKD86Ly4qfCQpXCIpLF9yPWkoL1xcKlxcKi8sXCIuKlwiKSxqPWwoW3hyLGdyLG1yLF9yXSksU3I9aSgvXFwqXFwvKD8hXFwqXFwqXFwvKS8sXCJbXi9dKi9cIikseXI9aSgvXFwqLyxcIlteL10qXCIpLE49bChbU3IseXJdKSxrPWkoXCI/XCIsXCJbXi9dXCIpLCRyPWkoXCJbXCIscCksd3I9aShcIl1cIixwKSxBcj1pKC9bIV5dLyxcIl4vXCIpLGJyPWkoL1thLXpdLVthLXpdfFswLTldLVswLTldL2kscCksQ3I9aSgvWyQuKis/Xigpe31bXFx8XS8scj0+YFxcXFwke3J9YCksTXI9aSgvW15cXF1dLyxwKSxFcj1sKFt5LENyLGJyLE1yXSksQj14KFskcix0cihBciksZihFciksd3JdKSxQcj1pKFwie1wiLFwiKD86XCIpLE9yPWkoXCJ9XCIsXCIpXCIpLFJyPWkoLyhcXGQrKVxcLlxcLihcXGQrKS8sKHIsZSxuKT0+b3IoK2UsK24sTWF0aC5taW4oZS5sZW5ndGgsbi5sZW5ndGgpKS5qb2luKFwifFwiKSksenI9aSgvKFthLXpdKylcXC5cXC4oW2Etel0rKS8sKHIsZSxuKT0+UihlLG4pLmpvaW4oXCJ8XCIpKSxqcj1pKC8oW0EtWl0rKVxcLlxcLihbQS1aXSspLywocixlLG4pPT5SKGUudG9Mb3dlckNhc2UoKSxuLnRvTG93ZXJDYXNlKCkpLmpvaW4oXCJ8XCIpLnRvVXBwZXJDYXNlKCkpLE5yPWwoW1JyLHpyLGpyXSksST14KFtQcixOcixPcl0pLGtyPWkoXCJ7XCIsXCIoPzpcIiksQnI9aShcIn1cIixcIilcIiksSXI9aShcIixcIixcInxcIiksRnI9aSgvWyQuKis/Xigpe1tcXF1cXHxdLyxyPT5gXFxcXCR7cn1gKSxMcj1pKC9bXn1dLyxwKSxacj1FKCgpPT5GKSxEcj1sKFtqLE4sayxCLEksWnIseSxGcixJcixMcl0pLEY9eChba3IsZihEciksQnJdKSxVcj1mKGwoW3NyLGNyLGxyLGZyLGosTixrLEIsSSxGLHkscHIsdnJdKSksVnI9VXIsR3I9eihWciksTD1HcixUcj1pKC9cXFxcLi8scCkscXI9aSgvLi8scCksSHI9aSgvXFwqXFwqXFwqKy8sXCIqXCIpLEpyPWkoLyhbXi97WyghXSlcXCpcXCovLChyLGUpPT5gJHtlfSpgKSxRcj1pKC8oXnwuKVxcKlxcKig/PVteKi8pXFxdfV0pLywocixlKT0+YCR7ZX0qYCksV3I9ZihsKFtUcixIcixKcixRcixxcl0pKSxLcj1XcixYcj16KEtyKSxZcj1YciwkPShyLGUpPT57Y29uc3Qgbj1BcnJheS5pc0FycmF5KHIpP3I6W3JdO2lmKCFuLmxlbmd0aClyZXR1cm4gIGZhbHNlO2NvbnN0IGE9bi5tYXAoJC5jb21waWxlKSx0PW4uZXZlcnkocz0+LyhcXC8oPzpcXCpcXCopP3xcXFtcXC9cXF0pJC8udGVzdChzKSksbz1lLnJlcGxhY2UoL1tcXFxcXFwvXSsvZyxcIi9cIikucmVwbGFjZSgvXFwvJC8sdD9cIi9cIjpcIlwiKTtyZXR1cm4gYS5zb21lKHM9PnMudGVzdChvKSl9OyQuY29tcGlsZT1yPT5uZXcgUmVnRXhwKGBeJHtMKFlyKHIpKX0kYCxcInNcIik7dmFyIHJlPSQ7cmV0dXJuIEoodyl9KSgpO1xuIHJldHVybiBfX2xpYl9fLmRlZmF1bHQgfHwgX19saWJfXzsgfTtcbmxldCBfbWF0Y2g7XG5jb25zdCB6ZXB0b21hdGNoID0gKHBhdGgsIHBhdHRlcm4pID0+IHtcbiAgaWYgKCFfbWF0Y2gpIHtcbiAgICBfbWF0Y2ggPSBfbGF6eU1hdGNoKCk7XG4gICAgX2xhenlNYXRjaCA9IG51bGw7XG4gIH1cbiAgcmV0dXJuIF9tYXRjaChwYXRoLCBwYXR0ZXJuKTtcbn07XG5cbmNvbnN0IF9EUklWRV9MRVRURVJfU1RBUlRfUkUgPSAvXltBLVphLXpdOlxcLy87XG5mdW5jdGlvbiBub3JtYWxpemVXaW5kb3dzUGF0aChpbnB1dCA9IFwiXCIpIHtcbiAgaWYgKCFpbnB1dCkge1xuICAgIHJldHVybiBpbnB1dDtcbiAgfVxuICByZXR1cm4gaW5wdXQucmVwbGFjZSgvXFxcXC9nLCBcIi9cIikucmVwbGFjZShfRFJJVkVfTEVUVEVSX1NUQVJUX1JFLCAocikgPT4gci50b1VwcGVyQ2FzZSgpKTtcbn1cblxuY29uc3QgX1VOQ19SRUdFWCA9IC9eWy9cXFxcXXsyfS87XG5jb25zdCBfSVNfQUJTT0xVVEVfUkUgPSAvXlsvXFxcXF0oPyFbL1xcXFxdKXxeWy9cXFxcXXsyfSg/IVxcLil8XltBLVphLXpdOlsvXFxcXF0vO1xuY29uc3QgX0RSSVZFX0xFVFRFUl9SRSA9IC9eW0EtWmEtel06JC87XG5jb25zdCBfUk9PVF9GT0xERVJfUkUgPSAvXlxcLyhbQS1aYS16XTopPyQvO1xuY29uc3QgX0VYVE5BTUVfUkUgPSAvLihcXC5bXi4vXSt8XFwuKSQvO1xuY29uc3QgX1BBVEhfUk9PVF9SRSA9IC9eWy9cXFxcXXxeW2EtekEtWl06Wy9cXFxcXS87XG5jb25zdCBzZXAgPSBcIi9cIjtcbmNvbnN0IG5vcm1hbGl6ZSA9IGZ1bmN0aW9uKHBhdGgpIHtcbiAgaWYgKHBhdGgubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFwiLlwiO1xuICB9XG4gIHBhdGggPSBub3JtYWxpemVXaW5kb3dzUGF0aChwYXRoKTtcbiAgY29uc3QgaXNVTkNQYXRoID0gcGF0aC5tYXRjaChfVU5DX1JFR0VYKTtcbiAgY29uc3QgaXNQYXRoQWJzb2x1dGUgPSBpc0Fic29sdXRlKHBhdGgpO1xuICBjb25zdCB0cmFpbGluZ1NlcGFyYXRvciA9IHBhdGhbcGF0aC5sZW5ndGggLSAxXSA9PT0gXCIvXCI7XG4gIHBhdGggPSBub3JtYWxpemVTdHJpbmcocGF0aCwgIWlzUGF0aEFic29sdXRlKTtcbiAgaWYgKHBhdGgubGVuZ3RoID09PSAwKSB7XG4gICAgaWYgKGlzUGF0aEFic29sdXRlKSB7XG4gICAgICByZXR1cm4gXCIvXCI7XG4gICAgfVxuICAgIHJldHVybiB0cmFpbGluZ1NlcGFyYXRvciA/IFwiLi9cIiA6IFwiLlwiO1xuICB9XG4gIGlmICh0cmFpbGluZ1NlcGFyYXRvcikge1xuICAgIHBhdGggKz0gXCIvXCI7XG4gIH1cbiAgaWYgKF9EUklWRV9MRVRURVJfUkUudGVzdChwYXRoKSkge1xuICAgIHBhdGggKz0gXCIvXCI7XG4gIH1cbiAgaWYgKGlzVU5DUGF0aCkge1xuICAgIGlmICghaXNQYXRoQWJzb2x1dGUpIHtcbiAgICAgIHJldHVybiBgLy8uLyR7cGF0aH1gO1xuICAgIH1cbiAgICByZXR1cm4gYC8vJHtwYXRofWA7XG4gIH1cbiAgcmV0dXJuIGlzUGF0aEFic29sdXRlICYmICFpc0Fic29sdXRlKHBhdGgpID8gYC8ke3BhdGh9YCA6IHBhdGg7XG59O1xuY29uc3Qgam9pbiA9IGZ1bmN0aW9uKC4uLnNlZ21lbnRzKSB7XG4gIGxldCBwYXRoID0gXCJcIjtcbiAgZm9yIChjb25zdCBzZWcgb2Ygc2VnbWVudHMpIHtcbiAgICBpZiAoIXNlZykge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChwYXRoLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHBhdGhUcmFpbGluZyA9IHBhdGhbcGF0aC5sZW5ndGggLSAxXSA9PT0gXCIvXCI7XG4gICAgICBjb25zdCBzZWdMZWFkaW5nID0gc2VnWzBdID09PSBcIi9cIjtcbiAgICAgIGNvbnN0IGJvdGggPSBwYXRoVHJhaWxpbmcgJiYgc2VnTGVhZGluZztcbiAgICAgIGlmIChib3RoKSB7XG4gICAgICAgIHBhdGggKz0gc2VnLnNsaWNlKDEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGF0aCArPSBwYXRoVHJhaWxpbmcgfHwgc2VnTGVhZGluZyA/IHNlZyA6IGAvJHtzZWd9YDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcGF0aCArPSBzZWc7XG4gICAgfVxuICB9XG4gIHJldHVybiBub3JtYWxpemUocGF0aCk7XG59O1xuZnVuY3Rpb24gY3dkKCkge1xuICBpZiAodHlwZW9mIHByb2Nlc3MgIT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIHByb2Nlc3MuY3dkID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gcHJvY2Vzcy5jd2QoKS5yZXBsYWNlKC9cXFxcL2csIFwiL1wiKTtcbiAgfVxuICByZXR1cm4gXCIvXCI7XG59XG5jb25zdCByZXNvbHZlID0gZnVuY3Rpb24oLi4uYXJndW1lbnRzXykge1xuICBhcmd1bWVudHNfID0gYXJndW1lbnRzXy5tYXAoKGFyZ3VtZW50KSA9PiBub3JtYWxpemVXaW5kb3dzUGF0aChhcmd1bWVudCkpO1xuICBsZXQgcmVzb2x2ZWRQYXRoID0gXCJcIjtcbiAgbGV0IHJlc29sdmVkQWJzb2x1dGUgPSBmYWxzZTtcbiAgZm9yIChsZXQgaW5kZXggPSBhcmd1bWVudHNfLmxlbmd0aCAtIDE7IGluZGV4ID49IC0xICYmICFyZXNvbHZlZEFic29sdXRlOyBpbmRleC0tKSB7XG4gICAgY29uc3QgcGF0aCA9IGluZGV4ID49IDAgPyBhcmd1bWVudHNfW2luZGV4XSA6IGN3ZCgpO1xuICAgIGlmICghcGF0aCB8fCBwYXRoLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHJlc29sdmVkUGF0aCA9IGAke3BhdGh9LyR7cmVzb2x2ZWRQYXRofWA7XG4gICAgcmVzb2x2ZWRBYnNvbHV0ZSA9IGlzQWJzb2x1dGUocGF0aCk7XG4gIH1cbiAgcmVzb2x2ZWRQYXRoID0gbm9ybWFsaXplU3RyaW5nKHJlc29sdmVkUGF0aCwgIXJlc29sdmVkQWJzb2x1dGUpO1xuICBpZiAocmVzb2x2ZWRBYnNvbHV0ZSAmJiAhaXNBYnNvbHV0ZShyZXNvbHZlZFBhdGgpKSB7XG4gICAgcmV0dXJuIGAvJHtyZXNvbHZlZFBhdGh9YDtcbiAgfVxuICByZXR1cm4gcmVzb2x2ZWRQYXRoLmxlbmd0aCA+IDAgPyByZXNvbHZlZFBhdGggOiBcIi5cIjtcbn07XG5mdW5jdGlvbiBub3JtYWxpemVTdHJpbmcocGF0aCwgYWxsb3dBYm92ZVJvb3QpIHtcbiAgbGV0IHJlcyA9IFwiXCI7XG4gIGxldCBsYXN0U2VnbWVudExlbmd0aCA9IDA7XG4gIGxldCBsYXN0U2xhc2ggPSAtMTtcbiAgbGV0IGRvdHMgPSAwO1xuICBsZXQgY2hhciA9IG51bGw7XG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPD0gcGF0aC5sZW5ndGg7ICsraW5kZXgpIHtcbiAgICBpZiAoaW5kZXggPCBwYXRoLmxlbmd0aCkge1xuICAgICAgY2hhciA9IHBhdGhbaW5kZXhdO1xuICAgIH0gZWxzZSBpZiAoY2hhciA9PT0gXCIvXCIpIHtcbiAgICAgIGJyZWFrO1xuICAgIH0gZWxzZSB7XG4gICAgICBjaGFyID0gXCIvXCI7XG4gICAgfVxuICAgIGlmIChjaGFyID09PSBcIi9cIikge1xuICAgICAgaWYgKGxhc3RTbGFzaCA9PT0gaW5kZXggLSAxIHx8IGRvdHMgPT09IDEpIDsgZWxzZSBpZiAoZG90cyA9PT0gMikge1xuICAgICAgICBpZiAocmVzLmxlbmd0aCA8IDIgfHwgbGFzdFNlZ21lbnRMZW5ndGggIT09IDIgfHwgcmVzW3Jlcy5sZW5ndGggLSAxXSAhPT0gXCIuXCIgfHwgcmVzW3Jlcy5sZW5ndGggLSAyXSAhPT0gXCIuXCIpIHtcbiAgICAgICAgICBpZiAocmVzLmxlbmd0aCA+IDIpIHtcbiAgICAgICAgICAgIGNvbnN0IGxhc3RTbGFzaEluZGV4ID0gcmVzLmxhc3RJbmRleE9mKFwiL1wiKTtcbiAgICAgICAgICAgIGlmIChsYXN0U2xhc2hJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgcmVzID0gXCJcIjtcbiAgICAgICAgICAgICAgbGFzdFNlZ21lbnRMZW5ndGggPSAwO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVzID0gcmVzLnNsaWNlKDAsIGxhc3RTbGFzaEluZGV4KTtcbiAgICAgICAgICAgICAgbGFzdFNlZ21lbnRMZW5ndGggPSByZXMubGVuZ3RoIC0gMSAtIHJlcy5sYXN0SW5kZXhPZihcIi9cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsYXN0U2xhc2ggPSBpbmRleDtcbiAgICAgICAgICAgIGRvdHMgPSAwO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfSBlbHNlIGlmIChyZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmVzID0gXCJcIjtcbiAgICAgICAgICAgIGxhc3RTZWdtZW50TGVuZ3RoID0gMDtcbiAgICAgICAgICAgIGxhc3RTbGFzaCA9IGluZGV4O1xuICAgICAgICAgICAgZG90cyA9IDA7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFsbG93QWJvdmVSb290KSB7XG4gICAgICAgICAgcmVzICs9IHJlcy5sZW5ndGggPiAwID8gXCIvLi5cIiA6IFwiLi5cIjtcbiAgICAgICAgICBsYXN0U2VnbWVudExlbmd0aCA9IDI7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChyZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHJlcyArPSBgLyR7cGF0aC5zbGljZShsYXN0U2xhc2ggKyAxLCBpbmRleCl9YDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXMgPSBwYXRoLnNsaWNlKGxhc3RTbGFzaCArIDEsIGluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBsYXN0U2VnbWVudExlbmd0aCA9IGluZGV4IC0gbGFzdFNsYXNoIC0gMTtcbiAgICAgIH1cbiAgICAgIGxhc3RTbGFzaCA9IGluZGV4O1xuICAgICAgZG90cyA9IDA7XG4gICAgfSBlbHNlIGlmIChjaGFyID09PSBcIi5cIiAmJiBkb3RzICE9PSAtMSkge1xuICAgICAgKytkb3RzO1xuICAgIH0gZWxzZSB7XG4gICAgICBkb3RzID0gLTE7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXM7XG59XG5jb25zdCBpc0Fic29sdXRlID0gZnVuY3Rpb24ocCkge1xuICByZXR1cm4gX0lTX0FCU09MVVRFX1JFLnRlc3QocCk7XG59O1xuY29uc3QgdG9OYW1lc3BhY2VkUGF0aCA9IGZ1bmN0aW9uKHApIHtcbiAgcmV0dXJuIG5vcm1hbGl6ZVdpbmRvd3NQYXRoKHApO1xufTtcbmNvbnN0IGV4dG5hbWUgPSBmdW5jdGlvbihwKSB7XG4gIGlmIChwID09PSBcIi4uXCIpIHJldHVybiBcIlwiO1xuICBjb25zdCBtYXRjaCA9IF9FWFROQU1FX1JFLmV4ZWMobm9ybWFsaXplV2luZG93c1BhdGgocCkpO1xuICByZXR1cm4gbWF0Y2ggJiYgbWF0Y2hbMV0gfHwgXCJcIjtcbn07XG5jb25zdCByZWxhdGl2ZSA9IGZ1bmN0aW9uKGZyb20sIHRvKSB7XG4gIGNvbnN0IF9mcm9tID0gcmVzb2x2ZShmcm9tKS5yZXBsYWNlKF9ST09UX0ZPTERFUl9SRSwgXCIkMVwiKS5zcGxpdChcIi9cIik7XG4gIGNvbnN0IF90byA9IHJlc29sdmUodG8pLnJlcGxhY2UoX1JPT1RfRk9MREVSX1JFLCBcIiQxXCIpLnNwbGl0KFwiL1wiKTtcbiAgaWYgKF90b1swXVsxXSA9PT0gXCI6XCIgJiYgX2Zyb21bMF1bMV0gPT09IFwiOlwiICYmIF9mcm9tWzBdICE9PSBfdG9bMF0pIHtcbiAgICByZXR1cm4gX3RvLmpvaW4oXCIvXCIpO1xuICB9XG4gIGNvbnN0IF9mcm9tQ29weSA9IFsuLi5fZnJvbV07XG4gIGZvciAoY29uc3Qgc2VnbWVudCBvZiBfZnJvbUNvcHkpIHtcbiAgICBpZiAoX3RvWzBdICE9PSBzZWdtZW50KSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgX2Zyb20uc2hpZnQoKTtcbiAgICBfdG8uc2hpZnQoKTtcbiAgfVxuICByZXR1cm4gWy4uLl9mcm9tLm1hcCgoKSA9PiBcIi4uXCIpLCAuLi5fdG9dLmpvaW4oXCIvXCIpO1xufTtcbmNvbnN0IGRpcm5hbWUgPSBmdW5jdGlvbihwKSB7XG4gIGNvbnN0IHNlZ21lbnRzID0gbm9ybWFsaXplV2luZG93c1BhdGgocCkucmVwbGFjZSgvXFwvJC8sIFwiXCIpLnNwbGl0KFwiL1wiKS5zbGljZSgwLCAtMSk7XG4gIGlmIChzZWdtZW50cy5sZW5ndGggPT09IDEgJiYgX0RSSVZFX0xFVFRFUl9SRS50ZXN0KHNlZ21lbnRzWzBdKSkge1xuICAgIHNlZ21lbnRzWzBdICs9IFwiL1wiO1xuICB9XG4gIHJldHVybiBzZWdtZW50cy5qb2luKFwiL1wiKSB8fCAoaXNBYnNvbHV0ZShwKSA/IFwiL1wiIDogXCIuXCIpO1xufTtcbmNvbnN0IGZvcm1hdCA9IGZ1bmN0aW9uKHApIHtcbiAgY29uc3QgZXh0ID0gcC5leHQgPyBwLmV4dC5zdGFydHNXaXRoKFwiLlwiKSA/IHAuZXh0IDogYC4ke3AuZXh0fWAgOiBcIlwiO1xuICBjb25zdCBzZWdtZW50cyA9IFtwLnJvb3QsIHAuZGlyLCBwLmJhc2UgPz8gKHAubmFtZSA/PyBcIlwiKSArIGV4dF0uZmlsdGVyKFxuICAgIEJvb2xlYW5cbiAgKTtcbiAgcmV0dXJuIG5vcm1hbGl6ZVdpbmRvd3NQYXRoKFxuICAgIHAucm9vdCA/IHJlc29sdmUoLi4uc2VnbWVudHMpIDogc2VnbWVudHMuam9pbihcIi9cIilcbiAgKTtcbn07XG5jb25zdCBiYXNlbmFtZSA9IGZ1bmN0aW9uKHAsIGV4dGVuc2lvbikge1xuICBjb25zdCBzZWdtZW50cyA9IG5vcm1hbGl6ZVdpbmRvd3NQYXRoKHApLnNwbGl0KFwiL1wiKTtcbiAgbGV0IGxhc3RTZWdtZW50ID0gXCJcIjtcbiAgZm9yIChsZXQgaSA9IHNlZ21lbnRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgY29uc3QgdmFsID0gc2VnbWVudHNbaV07XG4gICAgaWYgKHZhbCkge1xuICAgICAgbGFzdFNlZ21lbnQgPSB2YWw7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGV4dGVuc2lvbiAmJiBsYXN0U2VnbWVudC5lbmRzV2l0aChleHRlbnNpb24pID8gbGFzdFNlZ21lbnQuc2xpY2UoMCwgLWV4dGVuc2lvbi5sZW5ndGgpIDogbGFzdFNlZ21lbnQ7XG59O1xuY29uc3QgcGFyc2UgPSBmdW5jdGlvbihwKSB7XG4gIGNvbnN0IHJvb3QgPSBfUEFUSF9ST09UX1JFLmV4ZWMocCk/LlswXT8ucmVwbGFjZSgvXFxcXC9nLCBcIi9cIikgfHwgXCJcIjtcbiAgY29uc3QgYmFzZSA9IGJhc2VuYW1lKHApO1xuICBjb25zdCBleHRlbnNpb24gPSBleHRuYW1lKGJhc2UpO1xuICByZXR1cm4ge1xuICAgIHJvb3QsXG4gICAgZGlyOiBkaXJuYW1lKHApLFxuICAgIGJhc2UsXG4gICAgZXh0OiBleHRlbnNpb24sXG4gICAgbmFtZTogYmFzZS5zbGljZSgwLCBiYXNlLmxlbmd0aCAtIGV4dGVuc2lvbi5sZW5ndGgpXG4gIH07XG59O1xuY29uc3QgbWF0Y2hlc0dsb2IgPSAocGF0aCwgcGF0dGVybikgPT4ge1xuICByZXR1cm4gemVwdG9tYXRjaChwYXR0ZXJuLCBub3JtYWxpemUocGF0aCkpO1xufTtcblxuY29uc3QgX3BhdGggPSB7XG4gIF9fcHJvdG9fXzogbnVsbCxcbiAgYmFzZW5hbWU6IGJhc2VuYW1lLFxuICBkaXJuYW1lOiBkaXJuYW1lLFxuICBleHRuYW1lOiBleHRuYW1lLFxuICBmb3JtYXQ6IGZvcm1hdCxcbiAgaXNBYnNvbHV0ZTogaXNBYnNvbHV0ZSxcbiAgam9pbjogam9pbixcbiAgbWF0Y2hlc0dsb2I6IG1hdGNoZXNHbG9iLFxuICBub3JtYWxpemU6IG5vcm1hbGl6ZSxcbiAgbm9ybWFsaXplU3RyaW5nOiBub3JtYWxpemVTdHJpbmcsXG4gIHBhcnNlOiBwYXJzZSxcbiAgcmVsYXRpdmU6IHJlbGF0aXZlLFxuICByZXNvbHZlOiByZXNvbHZlLFxuICBzZXA6IHNlcCxcbiAgdG9OYW1lc3BhY2VkUGF0aDogdG9OYW1lc3BhY2VkUGF0aFxufTtcblxuZXhwb3J0IHsgX3BhdGggYXMgXywgbm9ybWFsaXplU3RyaW5nIGFzIGEsIHJlbGF0aXZlIGFzIGIsIGJhc2VuYW1lIGFzIGMsIGRpcm5hbWUgYXMgZCwgZXh0bmFtZSBhcyBlLCBmb3JtYXQgYXMgZiwgbm9ybWFsaXplV2luZG93c1BhdGggYXMgZywgaXNBYnNvbHV0ZSBhcyBpLCBqb2luIGFzIGosIG1hdGNoZXNHbG9iIGFzIG0sIG5vcm1hbGl6ZSBhcyBuLCBwYXJzZSBhcyBwLCByZXNvbHZlIGFzIHIsIHNlcCBhcyBzLCB0b05hbWVzcGFjZWRQYXRoIGFzIHQgfTtcbiIsImltcG9ydCB7IHBhcnNlQXNwZWN0UmF0aW8sIHBhcnNlUmFuZ2VTdHJpbmcsIHBhcnNlVGltZVN0cmluZywgcGFyc2VUaW1lc3BsaXRzIH0gZnJvbSBcIi4vdXRpbHMubWpzXCI7XG5pbXBvcnQgeyBkZXRlY3RGZWF0dXJlcywgZXh0cmFjdEltYWdlc1VzYWdlLCBnZXREZWZhdWx0Q29uZmlnLCBwYXJzZSwgcGFyc2VTbGlkZSwgcGFyc2VTeW5jLCBwcmV0dGlmeSwgcHJldHRpZnlTbGlkZSwgcmVzb2x2ZUNvbmZpZywgcmVzb2x2ZUZvbnRzLCBzdHJpbmdpZnksIHN0cmluZ2lmeVNsaWRlLCB2ZXJpZnlDb25maWcgfSBmcm9tIFwiLi9jb3JlLm1qc1wiO1xuaW1wb3J0IHsgc2xhc2ggfSBmcm9tIFwiQGFudGZ1L3V0aWxzXCI7XG5pbXBvcnQgWUFNTCBmcm9tIFwieWFtbFwiO1xuaW1wb3J0IHsgZXhpc3RzU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgeyByZWFkRmlsZSwgd3JpdGVGaWxlIH0gZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IGRpcm5hbWUsIGlzQWJzb2x1dGUsIHJlbGF0aXZlLCByZXNvbHZlIH0gZnJvbSBcInBhdGhlXCI7XG4vLyNyZWdpb24gc3JjL2ZzLnRzXG4vKipcbiogV2hldGhlciBgZmlsZVBhdGhgIHJlc29sdmVzIGluc2lkZSBhbnkgb2YgYHJvb3RzYCAobm8gYC4uYCBlc2NhcGUpLlxuKiBJbmxpbmVkIGhlcmUgKHJhdGhlciB0aGFuIGltcG9ydGVkIGZyb20gdGhlIGBzbGlkZXZgIHBhY2thZ2UpIGJlY2F1c2VcbiogYEBzbGlkZXYvcGFyc2VyYCBtdXN0IHN0YXkgaW5kZXBlbmRlbnQgb2YgYEBzbGlkZXYvc2xpZGV2YC5cbiovXG5mdW5jdGlvbiBpc1BhdGhJbnNpZGVSb290cyhmaWxlUGF0aCwgcm9vdHMpIHtcblx0cmV0dXJuIHJvb3RzLnNvbWUoKHJvb3QpID0+IHtcblx0XHRjb25zdCByZWwgPSByZWxhdGl2ZShyb290LCBmaWxlUGF0aCk7XG5cdFx0cmV0dXJuIHJlbCA9PT0gXCJcIiB8fCAhIXJlbCAmJiAhcmVsLnN0YXJ0c1dpdGgoXCIuLlwiKSAmJiAhaXNBYnNvbHV0ZShyZWwpO1xuXHR9KTtcbn1cbmNvbnN0IFJFX0ZST05UTUFUVEVSX1NUQVJUID0gL14tLS0oPzpbXi1dLiopPyQvO1xuY29uc3QgUkVfQkxBTktfTElORSA9IC9eXFxzKiQvO1xuY29uc3QgUkVfRlJPTlRNQVRURVJfRU5EID0gL14tLS0kLztcbmNvbnN0IFJFX0NSTEYgPSAvXFxyP1xcbi9nO1xubGV0IHByZXBhcnNlckV4dGVuc2lvbkxvYWRlciA9IG51bGw7XG5mdW5jdGlvbiBpbmplY3RQcmVwYXJzZXJFeHRlbnNpb25Mb2FkZXIoZm4pIHtcblx0cHJlcGFyc2VyRXh0ZW5zaW9uTG9hZGVyID0gZm47XG59XG5hc3luYyBmdW5jdGlvbiBsb2FkKG9wdGlvbnMsIGZpbGVwYXRoLCBzb3VyY2VzID0ge30sIG1vZGUpIHtcblx0Y29uc3QgbG9hZFNvdXJjZSA9IHR5cGVvZiBzb3VyY2VzID09PSBcImZ1bmN0aW9uXCIgPyBzb3VyY2VzIDogYXN5bmMgKHBhdGgpID0+IHNvdXJjZXNbcGF0aF0gPz8gcmVhZEZpbGUocGF0aCwgXCJ1dGYtOFwiKTtcblx0Y29uc3QgbWFya2Rvd24gPSBhd2FpdCBsb2FkU291cmNlKGZpbGVwYXRoKTtcblx0bGV0IGV4dGVuc2lvbnM7XG5cdGlmIChwcmVwYXJzZXJFeHRlbnNpb25Mb2FkZXIpIHtcblx0XHRjb25zdCBsaW5lcyA9IG1hcmtkb3duLnNwbGl0KFJFX0NSTEYpO1xuXHRcdGxldCBobSA9IFwiXCI7XG5cdFx0aWYgKFJFX0ZST05UTUFUVEVSX1NUQVJULnRlc3QobGluZXNbMF0pICYmICFsaW5lc1sxXT8ubWF0Y2goUkVfQkxBTktfTElORSkpIHtcblx0XHRcdGxldCBoRW5kID0gMTtcblx0XHRcdHdoaWxlIChoRW5kIDwgbGluZXMubGVuZ3RoICYmICFSRV9GUk9OVE1BVFRFUl9FTkQudGVzdChsaW5lc1toRW5kXS50cmltRW5kKCkpKSBoRW5kKys7XG5cdFx0XHRobSA9IGxpbmVzLnNsaWNlKDEsIGhFbmQpLmpvaW4oXCJcXG5cIik7XG5cdFx0fVxuXHRcdGNvbnN0IG8gPSBZQU1MLnBhcnNlKGhtKSA/PyB7fTtcblx0XHRleHRlbnNpb25zID0gYXdhaXQgcHJlcGFyc2VyRXh0ZW5zaW9uTG9hZGVyKG9wdGlvbnMucm9vdHMsIG8sIGZpbGVwYXRoLCBtb2RlKTtcblx0fVxuXHRjb25zdCBtYXJrZG93bkZpbGVzID0ge307XG5cdGNvbnN0IHdhdGNoRmlsZXMgPSB7fTtcblx0Y29uc3Qgc2xpZGVzID0gW107XG5cdGFzeW5jIGZ1bmN0aW9uIGxvYWRNYXJrZG93bihwYXRoLCByYW5nZSwgZnJvbnRtYXR0ZXJPdmVycmlkZSwgaW1wb3J0ZXJzKSB7XG5cdFx0bGV0IG1kID0gbWFya2Rvd25GaWxlc1twYXRoXTtcblx0XHRpZiAoIW1kKSB7XG5cdFx0XHRjb25zdCByYXcgPSBhd2FpdCBsb2FkU291cmNlKHBhdGgpO1xuXHRcdFx0bWQgPSBhd2FpdCBwYXJzZShyYXcsIHBhdGgsIGV4dGVuc2lvbnMpO1xuXHRcdFx0bWFya2Rvd25GaWxlc1twYXRoXSA9IG1kO1xuXHRcdFx0d2F0Y2hGaWxlc1twYXRoXSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG5cdFx0fVxuXHRcdGNvbnN0IGRpcmVjdEltcG9ydGVyID0gaW1wb3J0ZXJzPy5hdCgtMSk7XG5cdFx0Zm9yIChjb25zdCBpbmRleCBvZiBwYXJzZVJhbmdlU3RyaW5nKG1kLnNsaWRlcy5sZW5ndGgsIHJhbmdlKSkge1xuXHRcdFx0Y29uc3Qgc3ViU2xpZGUgPSBtZC5zbGlkZXNbaW5kZXggLSAxXTtcblx0XHRcdGlmICghc3ViU2xpZGUpIHtcblx0XHRcdFx0bWQuZXJyb3JzID8/PSBbXTtcblx0XHRcdFx0bWQuZXJyb3JzLnB1c2goe1xuXHRcdFx0XHRcdHJvdzogMCxcblx0XHRcdFx0XHRtZXNzYWdlOiBgU2xpZGUgJHtpbmRleH0gZG9lcyBub3QgZXhpc3QgaW4gXCIke3BhdGh9XCIsIHdoaWNoIGhhcyAke21kLnNsaWRlcy5sZW5ndGh9IHNsaWRlc2Bcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXHRcdFx0dHJ5IHtcblx0XHRcdFx0YXdhaXQgbG9hZFNsaWRlKG1kLCBzdWJTbGlkZSwgZnJvbnRtYXR0ZXJPdmVycmlkZSwgaW1wb3J0ZXJzKTtcblx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0bWQuZXJyb3JzID8/PSBbXTtcblx0XHRcdFx0bWQuZXJyb3JzLnB1c2goe1xuXHRcdFx0XHRcdHJvdzogc3ViU2xpZGUuc3RhcnQsXG5cdFx0XHRcdFx0bWVzc2FnZTogYEVycm9yIHdoZW4gbG9hZGluZyBzbGlkZTogJHtlfWBcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGRpcmVjdEltcG9ydGVyKSAoZGlyZWN0SW1wb3J0ZXIuaW1wb3J0cyA/Pz0gW10pLnB1c2goc3ViU2xpZGUpO1xuXHRcdH1cblx0XHRyZXR1cm4gbWQ7XG5cdH1cblx0YXN5bmMgZnVuY3Rpb24gbG9hZFNsaWRlKG1kLCBzbGlkZSwgZnJvbnRtYXR0ZXJPdmVycmlkZSwgaW1wb3J0Q2hhaW4pIHtcblx0XHRpZiAoc2xpZGUuZnJvbnRtYXR0ZXIuZGlzYWJsZWQgfHwgc2xpZGUuZnJvbnRtYXR0ZXIuaGlkZSkgcmV0dXJuO1xuXHRcdGlmIChzbGlkZS5mcm9udG1hdHRlci5zcmMpIHtcblx0XHRcdGNvbnN0IFtyYXdQYXRoLCByYW5nZVJhd10gPSBzbGlkZS5mcm9udG1hdHRlci5zcmMuc3BsaXQoXCIjXCIpO1xuXHRcdFx0Y29uc3QgcGF0aCA9IHNsYXNoKHJhd1BhdGguc3RhcnRzV2l0aChcIi9cIikgPyByZXNvbHZlKG9wdGlvbnMudXNlclJvb3QsIHJhd1BhdGguc3Vic3RyaW5nKDEpKSA6IHJlc29sdmUoZGlybmFtZShzbGlkZS5maWxlcGF0aCksIHJhd1BhdGgpKTtcblx0XHRcdGZyb250bWF0dGVyT3ZlcnJpZGUgPSB7XG5cdFx0XHRcdC4uLnNsaWRlLmZyb250bWF0dGVyLFxuXHRcdFx0XHQuLi5mcm9udG1hdHRlck92ZXJyaWRlXG5cdFx0XHR9O1xuXHRcdFx0ZGVsZXRlIGZyb250bWF0dGVyT3ZlcnJpZGUuc3JjO1xuXHRcdFx0Y29uc3QgYW5jZXN0b3JQYXRocyA9IG5ldyBTZXQoKGltcG9ydENoYWluID8/IFtdKS5tYXAoKHMpID0+IHMuZmlsZXBhdGgpKTtcblx0XHRcdGlmIChwYXRoID09PSBzbGlkZS5maWxlcGF0aCB8fCBhbmNlc3RvclBhdGhzLmhhcyhwYXRoKSkge1xuXHRcdFx0XHRtZC5lcnJvcnMgPz89IFtdO1xuXHRcdFx0XHRtZC5lcnJvcnMucHVzaCh7XG5cdFx0XHRcdFx0cm93OiBzbGlkZS5zdGFydCxcblx0XHRcdFx0XHRtZXNzYWdlOiBgQ2lyY3VsYXIgaW1wb3J0IGRldGVjdGVkIGZvciBcIiR7c2xpZGUuZnJvbnRtYXR0ZXIuc3JjfVwiICgke3BhdGh9KWBcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGlmIChvcHRpb25zLmFsbG93ZWRSb290cyAmJiAhaXNQYXRoSW5zaWRlUm9vdHMocGF0aCwgb3B0aW9ucy5hbGxvd2VkUm9vdHMpKSB7XG5cdFx0XHRcdG1kLmVycm9ycyA/Pz0gW107XG5cdFx0XHRcdG1kLmVycm9ycy5wdXNoKHtcblx0XHRcdFx0XHRyb3c6IHNsaWRlLnN0YXJ0LFxuXHRcdFx0XHRcdG1lc3NhZ2U6IGBJbXBvcnRlZCBtYXJrZG93biBlc2NhcGVzIHRoZSBwcm9qZWN0IHJvb3Q6ICR7cGF0aH1gXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSBlbHNlIGlmICghZXhpc3RzU3luYyhwYXRoKSkge1xuXHRcdFx0XHRtZC5lcnJvcnMgPz89IFtdO1xuXHRcdFx0XHRtZC5lcnJvcnMucHVzaCh7XG5cdFx0XHRcdFx0cm93OiBzbGlkZS5zdGFydCxcblx0XHRcdFx0XHRtZXNzYWdlOiBgSW1wb3J0ZWQgbWFya2Rvd24gZmlsZSBub3QgZm91bmQ6ICR7cGF0aH1gXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSBlbHNlIGF3YWl0IGxvYWRNYXJrZG93bihwYXRoLCByYW5nZVJhdywgZnJvbnRtYXR0ZXJPdmVycmlkZSwgaW1wb3J0Q2hhaW4gPyBbLi4uaW1wb3J0Q2hhaW4sIHNsaWRlXSA6IFtzbGlkZV0pO1xuXHRcdH0gZWxzZSBzbGlkZXMucHVzaCh7XG5cdFx0XHRmcm9udG1hdHRlcjoge1xuXHRcdFx0XHQuLi5zbGlkZS5mcm9udG1hdHRlcixcblx0XHRcdFx0Li4uZnJvbnRtYXR0ZXJPdmVycmlkZVxuXHRcdFx0fSxcblx0XHRcdGNvbnRlbnQ6IHNsaWRlLmNvbnRlbnQsXG5cdFx0XHRyZXZpc2lvbjogc2xpZGUucmV2aXNpb24sXG5cdFx0XHRmcm9udG1hdHRlclJhdzogc2xpZGUuZnJvbnRtYXR0ZXJSYXcsXG5cdFx0XHRub3RlOiBzbGlkZS5ub3RlLFxuXHRcdFx0dGl0bGU6IHNsaWRlLnRpdGxlLFxuXHRcdFx0bGV2ZWw6IHNsaWRlLmxldmVsLFxuXHRcdFx0aW5kZXg6IHNsaWRlcy5sZW5ndGgsXG5cdFx0XHRpbXBvcnRDaGFpbixcblx0XHRcdHNvdXJjZTogc2xpZGVcblx0XHR9KTtcblx0fVxuXHRjb25zdCBlbnRyeSA9IGF3YWl0IGxvYWRNYXJrZG93bihzbGFzaChmaWxlcGF0aCkpO1xuXHRjb25zdCBoZWFkbWF0dGVyID0geyAuLi5lbnRyeS5zbGlkZXNbMF0/LmZyb250bWF0dGVyIH07XG5cdGlmIChzbGlkZXNbMF0/LnRpdGxlKSBoZWFkbWF0dGVyLnRpdGxlID8/PSBzbGlkZXNbMF0udGl0bGU7XG5cdHJldHVybiB7XG5cdFx0c2xpZGVzLFxuXHRcdGVudHJ5LFxuXHRcdGhlYWRtYXR0ZXIsXG5cdFx0ZmVhdHVyZXM6IGRldGVjdEZlYXR1cmVzKHNsaWRlcy5tYXAoKHMpID0+IHMuc291cmNlLnJhdykuam9pbihcIlwiKSksXG5cdFx0bWFya2Rvd25GaWxlcyxcblx0XHR3YXRjaEZpbGVzXG5cdH07XG59XG5hc3luYyBmdW5jdGlvbiBzYXZlKG1hcmtkb3duKSB7XG5cdGNvbnN0IGZpbGVDb250ZW50ID0gc3RyaW5naWZ5KG1hcmtkb3duKTtcblx0YXdhaXQgd3JpdGVGaWxlKG1hcmtkb3duLmZpbGVwYXRoLCBmaWxlQ29udGVudCwgXCJ1dGYtOFwiKTtcblx0cmV0dXJuIGZpbGVDb250ZW50O1xufVxuLy8jZW5kcmVnaW9uXG5leHBvcnQgeyBkZXRlY3RGZWF0dXJlcywgZXh0cmFjdEltYWdlc1VzYWdlLCBnZXREZWZhdWx0Q29uZmlnLCBpbmplY3RQcmVwYXJzZXJFeHRlbnNpb25Mb2FkZXIsIGlzUGF0aEluc2lkZVJvb3RzLCBsb2FkLCBwYXJzZSwgcGFyc2VBc3BlY3RSYXRpbywgcGFyc2VSYW5nZVN0cmluZywgcGFyc2VTbGlkZSwgcGFyc2VTeW5jLCBwYXJzZVRpbWVTdHJpbmcsIHBhcnNlVGltZXNwbGl0cywgcHJldHRpZnksIHByZXR0aWZ5U2xpZGUsIHJlc29sdmVDb25maWcsIHJlc29sdmVGb250cywgc2F2ZSwgc3RyaW5naWZ5LCBzdHJpbmdpZnlTbGlkZSwgdmVyaWZ5Q29uZmlnIH07XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8vIE5vdGVzOiBBZGQgbmV3IE5vZGUgdHlwZXNcbi8vIDEuIEFkZCBuZXcgTm9kZSB0eXBlIHRvIEFTVE5vZGVUeXBlc1xuLy8gMi4gVXBkYXRlIHR4dG5vZGUubWRcbi8vIDMuIEFkZCB0ZXN0IHRvIHBhY2thZ2VzL0B0ZXh0bGludC90eXBlcy90ZXN0L1J1bGUvVHh0Tm9kZS10ZXN0LnRzXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkFTVE5vZGVUeXBlcyA9IHZvaWQgMDtcbi8qKlxuICogQVNUTm9kZVR5cGVzIGlzIGEgbGlzdCBvZiBBU1ROb2RlIHR5cGUuXG4gKi9cbnZhciBBU1ROb2RlVHlwZXM7XG4oZnVuY3Rpb24gKEFTVE5vZGVUeXBlcykge1xuICAgIEFTVE5vZGVUeXBlc1tcIkRvY3VtZW50XCJdID0gXCJEb2N1bWVudFwiO1xuICAgIEFTVE5vZGVUeXBlc1tcIkRvY3VtZW50RXhpdFwiXSA9IFwiRG9jdW1lbnQ6ZXhpdFwiO1xuICAgIEFTVE5vZGVUeXBlc1tcIlBhcmFncmFwaFwiXSA9IFwiUGFyYWdyYXBoXCI7XG4gICAgQVNUTm9kZVR5cGVzW1wiUGFyYWdyYXBoRXhpdFwiXSA9IFwiUGFyYWdyYXBoOmV4aXRcIjtcbiAgICBBU1ROb2RlVHlwZXNbXCJCbG9ja1F1b3RlXCJdID0gXCJCbG9ja1F1b3RlXCI7XG4gICAgQVNUTm9kZVR5cGVzW1wiQmxvY2tRdW90ZUV4aXRcIl0gPSBcIkJsb2NrUXVvdGU6ZXhpdFwiO1xuICAgIEFTVE5vZGVUeXBlc1tcIkxpc3RJdGVtXCJdID0gXCJMaXN0SXRlbVwiO1xuICAgIEFTVE5vZGVUeXBlc1tcIkxpc3RJdGVtRXhpdFwiXSA9IFwiTGlzdEl0ZW06ZXhpdFwiO1xuICAgIEFTVE5vZGVUeXBlc1tcIkxpc3RcIl0gPSBcIkxpc3RcIjtcbiAgICBBU1ROb2RlVHlwZXNbXCJMaXN0RXhpdFwiXSA9IFwiTGlzdDpleGl0XCI7XG4gICAgQVNUTm9kZVR5cGVzW1wiSGVhZGVyXCJdID0gXCJIZWFkZXJcIjtcbiAgICBBU1ROb2RlVHlwZXNbXCJIZWFkZXJFeGl0XCJdID0gXCJIZWFkZXI6ZXhpdFwiO1xuICAgIEFTVE5vZGVUeXBlc1tcIkNvZGVCbG9ja1wiXSA9IFwiQ29kZUJsb2NrXCI7XG4gICAgQVNUTm9kZVR5cGVzW1wiQ29kZUJsb2NrRXhpdFwiXSA9IFwiQ29kZUJsb2NrOmV4aXRcIjtcbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCB1c2UgSHRtbCBpbnN0ZWFkIG9mIGl0XG4gICAgICovXG4gICAgQVNUTm9kZVR5cGVzW1wiSHRtbEJsb2NrXCJdID0gXCJIdG1sQmxvY2tcIjtcbiAgICBBU1ROb2RlVHlwZXNbXCJIdG1sQmxvY2tFeGl0XCJdID0gXCJIdG1sQmxvY2s6ZXhpdFwiO1xuICAgIEFTVE5vZGVUeXBlc1tcIkhvcml6b250YWxSdWxlXCJdID0gXCJIb3Jpem9udGFsUnVsZVwiO1xuICAgIEFTVE5vZGVUeXBlc1tcIkhvcml6b250YWxSdWxlRXhpdFwiXSA9IFwiSG9yaXpvbnRhbFJ1bGU6ZXhpdFwiO1xuICAgIEFTVE5vZGVUeXBlc1tcIkNvbW1lbnRcIl0gPSBcIkNvbW1lbnRcIjtcbiAgICBBU1ROb2RlVHlwZXNbXCJDb21tZW50RXhpdFwiXSA9IFwiQ29tbWVudDpleGl0XCI7XG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBBU1ROb2RlVHlwZXNbXCJSZWZlcmVuY2VEZWZcIl0gPSBcIlJlZmVyZW5jZURlZlwiO1xuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgQVNUTm9kZVR5cGVzW1wiUmVmZXJlbmNlRGVmRXhpdFwiXSA9IFwiUmVmZXJlbmNlRGVmOmV4aXRcIjtcbiAgICAvLyBpbmxpbmVcbiAgICBBU1ROb2RlVHlwZXNbXCJTdHJcIl0gPSBcIlN0clwiO1xuICAgIEFTVE5vZGVUeXBlc1tcIlN0ckV4aXRcIl0gPSBcIlN0cjpleGl0XCI7XG4gICAgQVNUTm9kZVR5cGVzW1wiQnJlYWtcIl0gPSBcIkJyZWFrXCI7XG4gICAgQVNUTm9kZVR5cGVzW1wiQnJlYWtFeGl0XCJdID0gXCJCcmVhazpleGl0XCI7XG4gICAgQVNUTm9kZVR5cGVzW1wiRW1waGFzaXNcIl0gPSBcIkVtcGhhc2lzXCI7XG4gICAgQVNUTm9kZVR5cGVzW1wiRW1waGFzaXNFeGl0XCJdID0gXCJFbXBoYXNpczpleGl0XCI7XG4gICAgQVNUTm9kZVR5cGVzW1wiU3Ryb25nXCJdID0gXCJTdHJvbmdcIjtcbiAgICBBU1ROb2RlVHlwZXNbXCJTdHJvbmdFeGl0XCJdID0gXCJTdHJvbmc6ZXhpdFwiO1xuICAgIEFTVE5vZGVUeXBlc1tcIkh0bWxcIl0gPSBcIkh0bWxcIjtcbiAgICBBU1ROb2RlVHlwZXNbXCJIdG1sRXhpdFwiXSA9IFwiSHRtbDpleGl0XCI7XG4gICAgQVNUTm9kZVR5cGVzW1wiTGlua1wiXSA9IFwiTGlua1wiO1xuICAgIEFTVE5vZGVUeXBlc1tcIkxpbmtFeGl0XCJdID0gXCJMaW5rOmV4aXRcIjtcbiAgICBBU1ROb2RlVHlwZXNbXCJMaW5rUmVmZXJlbmNlXCJdID0gXCJMaW5rUmVmZXJlbmNlXCI7XG4gICAgQVNUTm9kZVR5cGVzW1wiTGlua1JlZmVyZW5jZUV4aXRcIl0gPSBcIkxpbmtSZWZlcmVuY2U6ZXhpdFwiO1xuICAgIEFTVE5vZGVUeXBlc1tcIkltYWdlXCJdID0gXCJJbWFnZVwiO1xuICAgIEFTVE5vZGVUeXBlc1tcIkltYWdlRXhpdFwiXSA9IFwiSW1hZ2U6ZXhpdFwiO1xuICAgIEFTVE5vZGVUeXBlc1tcIkltYWdlUmVmZXJlbmNlXCJdID0gXCJJbWFnZVJlZmVyZW5jZVwiO1xuICAgIEFTVE5vZGVUeXBlc1tcIkltYWdlUmVmZXJlbmNlRXhpdFwiXSA9IFwiSW1hZ2VSZWZlcmVuY2U6ZXhpdFwiO1xuICAgIEFTVE5vZGVUeXBlc1tcIkRlZmluaXRpb25cIl0gPSBcIkRlZmluaXRpb25cIjtcbiAgICBBU1ROb2RlVHlwZXNbXCJEZWZpbml0aW9uRXhpdFwiXSA9IFwiRGVmaW5pdGlvbjpleGl0XCI7XG4gICAgQVNUTm9kZVR5cGVzW1wiQ29kZVwiXSA9IFwiQ29kZVwiO1xuICAgIEFTVE5vZGVUeXBlc1tcIkNvZGVFeGl0XCJdID0gXCJDb2RlOmV4aXRcIjtcbiAgICBBU1ROb2RlVHlwZXNbXCJEZWxldGVcIl0gPSBcIkRlbGV0ZVwiO1xuICAgIEFTVE5vZGVUeXBlc1tcIkRlbGV0ZUV4aXRcIl0gPSBcIkRlbGV0ZTpleGl0XCI7XG4gICAgLy8gVGFibGUgaXMgc3VwcG9ydGVkIGluIHRleHRsaW50IHYxMytcbiAgICBBU1ROb2RlVHlwZXNbXCJUYWJsZVwiXSA9IFwiVGFibGVcIjtcbiAgICBBU1ROb2RlVHlwZXNbXCJUYWJsZUV4aXRcIl0gPSBcIlRhYmxlOmV4aXRcIjtcbiAgICBBU1ROb2RlVHlwZXNbXCJUYWJsZVJvd1wiXSA9IFwiVGFibGVSb3dcIjtcbiAgICBBU1ROb2RlVHlwZXNbXCJUYWJsZVJvd0V4aXRcIl0gPSBcIlRhYmxlUm93OmV4aXRcIjtcbiAgICBBU1ROb2RlVHlwZXNbXCJUYWJsZUNlbGxcIl0gPSBcIlRhYmxlQ2VsbFwiO1xuICAgIEFTVE5vZGVUeXBlc1tcIlRhYmxlQ2VsbEV4aXRcIl0gPSBcIlRhYmxlQ2VsbDpleGl0XCI7XG59KShBU1ROb2RlVHlwZXMgfHwgKGV4cG9ydHMuQVNUTm9kZVR5cGVzID0gQVNUTm9kZVR5cGVzID0ge30pKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFTVE5vZGVUeXBlcy5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuQVNUTm9kZVR5cGVzID0gdm9pZCAwO1xudmFyIEFTVE5vZGVUeXBlc19qc18xID0gcmVxdWlyZShcIi4vQVNUTm9kZVR5cGVzLmpzXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQVNUTm9kZVR5cGVzXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBBU1ROb2RlVHlwZXNfanNfMS5BU1ROb2RlVHlwZXM7IH0gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBhc3Rfbm9kZV90eXBlc18xID0gcmVxdWlyZShcIkB0ZXh0bGludC9hc3Qtbm9kZS10eXBlc1wiKTtcbi8qKlxuICogUnVsZUhlbHBlciBpcyBoZWxwZXIgY2xhc3MgZm9yIHRleHRsaW50LlxuICogQGNsYXNzIFJ1bGVIZWxwZXJcbiAqL1xudmFyIFJ1bGVIZWxwZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZSBSdWxlSGVscGVyIHdpdGggUnVsZUNvbnRleHQgb2JqZWN0LlxuICAgICAqIEBwYXJhbSBydWxlQ29udGV4dCB0aGUgcnVsZUNvbnRleHQgaXMgY29udGV4dCBvYmplY3Qgb2YgdGhlIHJ1bGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gUnVsZUhlbHBlcihydWxlQ29udGV4dCkge1xuICAgICAgICB0aGlzLl9ydWxlQ29udGV4dCA9IHJ1bGVDb250ZXh0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgcGFyZW50cyBvZiBub2RlLlxuICAgICAqIFRoZSBwYXJlbnQgbm9kZXMgYXJlIHJldHVybmVkIGluIG9yZGVyIGZyb20gdGhlIGNsb3Nlc3QgcGFyZW50IHRvIHRoZSBvdXRlciBvbmVzLlxuICAgICAqIHtAbGluayBub2RlfSBpcyBub3QgY29udGFpbmVkIGluIHRoZSByZXN1bHRzLlxuICAgICAqIEBwYXJhbSB7VHh0Tm9kZX0gbm9kZSB0aGUgbm9kZSBpcyBzdGFydCBwb2ludC5cbiAgICAgKi9cbiAgICBSdWxlSGVscGVyLnByb3RvdHlwZS5nZXRQYXJlbnRzID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgICB2YXIgcGFyZW50ID0gbm9kZS5wYXJlbnQ7XG4gICAgICAgIHdoaWxlIChwYXJlbnQgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2gocGFyZW50KTtcbiAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybiB0cnVlIGlmIGBub2RlYCBpcyB3cmFwcGVkIGFueSBvbmUgb2Ygbm9kZSB7QGxpbmsgdHlwZXN9LlxuICAgICAqIEBwYXJhbSB7VHh0Tm9kZX0gbm9kZSBpcyB0YXJnZXQgbm9kZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IHR5cGVzIGFyZSB3cmFwcGVkIHRhcmdldCBub2RlXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgUnVsZUhlbHBlci5wcm90b3R5cGUuaXNDaGlsZE5vZGUgPSBmdW5jdGlvbiAobm9kZSwgdHlwZXMpIHtcbiAgICAgICAgdmFyIHBhcmVudHMgPSB0aGlzLmdldFBhcmVudHMobm9kZSk7XG4gICAgICAgIHZhciBwYXJlbnRzVHlwZXMgPSBwYXJlbnRzLm1hcChmdW5jdGlvbiAocGFyZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyZW50LnR5cGU7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdHlwZXMuc29tZShmdW5jdGlvbiAodHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuIHBhcmVudHNUeXBlcy5zb21lKGZ1bmN0aW9uIChwYXJlbnRUeXBlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcmVudFR5cGUgPT09IHR5cGU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgbm9kZSBpcyBTdHIgbm9kZSBhbmQgZmlsbCBmb2xsb3dpbmcgY29uZGl0aW9uc1xuICAgICAqXG4gICAgICogLSB0aGUgbm9kZSBpcyBTdHIgbm9kZVxuICAgICAqIC0gdGhlIG5vZGUgaXMgdW5kZXIgdGhlIFBhcmFncmFwaCBub2RlXG4gICAgICogLSB0aGUgbm9kZSBpcyBub3QgdW5kZXIgdGhlIEJsb2NrUXVvdGVcbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZnVsIGZvciBjb21tb24gdXNlLWNhc2UuXG4gICAgICogSWYgeW91IHdhbnQgdG8gbGludCBTdHIgbm9kZSwgYnV0IHlvdSBub3Qgd2FudCB0byBsaW50IHN0eWxlZCBub2RlLCB0aGlzIGZ1bmN0aW9uIGlzIHVzZWZ1bC5cbiAgICAgKiBzdHlsZWQgbm9kZSBpcyBMaW5rLCBTdHJvbmcsIEJsb2NrUXVvdGUsIEhlYWRlciBldGMuLi5cbiAgICAgKiBPcHBvc2l0ZSBvZiBpdCwgcGxhaW4gc3RyIG5vZGUgaXMganVzdCB1bmRlciB0aGUgUGFyYWdyYXBoIG5vZGUuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogUmV0dXJuIHRydWVcbiAgICAgKlxuICAgICAqIC0tLVxuICAgICAqIHN0ciBzdHIgc3RyXG4gICAgICogLSBsaXN0IHRleHRcbiAgICAgKiAtLS1cbiAgICAgKlxuICAgICAqIFJldHVybiBmYWxzZVxuICAgICAqXG4gICAgICogLS0tLVxuICAgICAqICMgSGVhZGVyXG4gICAgICogIVthbHQgdGV4dF0oaHR0cHM6Ly9leGFtcGxlLmNvbSlcbiAgICAgKiBbbGluayB0aXRsZV0oaHR0cHM6Ly9leGFtcGxlLmNvbSlcbiAgICAgKiA+IEJsb2NrUXVvdGVcbiAgICAgKiAqKlN0cm9uZyoqXG4gICAgICogW15mb290bm90ZV06IHRleHQgdGV4dFxuICAgICAqIC0tLS1cbiAgICAgKlxuICAgICAqIFN1bW1hcnk6XG4gICAgICpcbiAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgbm9kZSBpcyBwbGFpbiB0ZXh0LlxuICAgICAqIEluIG90aGVyIHdvcmRzLCByZXR1cm4gZmFsc2UgaWYgdGhlIG5vZGUgaXMgc3R5bGVkXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbm9kZVxuICAgICAqL1xuICAgIFJ1bGVIZWxwZXIucHJvdG90eXBlLmlzUGxhaW5TdHJOb2RlID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAobm9kZS50eXBlICE9PSBhc3Rfbm9kZV90eXBlc18xLkFTVE5vZGVUeXBlcy5TdHIpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKChfYSA9IG5vZGUucGFyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudHlwZSkgIT09IGFzdF9ub2RlX3R5cGVzXzEuQVNUTm9kZVR5cGVzLlBhcmFncmFwaCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBpc0luVW5jb250cm9sbGFibGVOb2RlID0gdGhpcy5pc0NoaWxkTm9kZShub2RlLCBbXG4gICAgICAgICAgICAvLyA8YmxvY2txdW90ZT4gaXMgQmxvY2sgbm9kZSBpbiBodG1sLiBJdCBjYW4gaGFzIFByYWdhcmFwaCBub2RlIGFzIGNoaWxkcmVuXG4gICAgICAgICAgICBhc3Rfbm9kZV90eXBlc18xLkFTVE5vZGVUeXBlcy5CbG9ja1F1b3RlXG4gICAgICAgIF0pO1xuICAgICAgICByZXR1cm4gIWlzSW5VbmNvbnRyb2xsYWJsZU5vZGU7XG4gICAgfTtcbiAgICByZXR1cm4gUnVsZUhlbHBlcjtcbn0oKSk7XG5leHBvcnRzLmRlZmF1bHQgPSBSdWxlSGVscGVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGV4dGxpbnQtcnVsZS1oZWxwZXIuanMubWFwIiwiJ3VzZSBzdHJpY3QnXG5cbm1vZHVsZS5leHBvcnRzID0gY29udmVydFxuXG5mdW5jdGlvbiBjb252ZXJ0KHRlc3QpIHtcbiAgaWYgKHRlc3QgPT0gbnVsbCkge1xuICAgIHJldHVybiBva1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0ZXN0ID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB0eXBlRmFjdG9yeSh0ZXN0KVxuICB9XG5cbiAgaWYgKHR5cGVvZiB0ZXN0ID09PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiAnbGVuZ3RoJyBpbiB0ZXN0ID8gYW55RmFjdG9yeSh0ZXN0KSA6IGFsbEZhY3RvcnkodGVzdClcbiAgfVxuXG4gIGlmICh0eXBlb2YgdGVzdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB0ZXN0XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGZ1bmN0aW9uLCBzdHJpbmcsIG9yIG9iamVjdCBhcyB0ZXN0Jylcbn1cblxuLy8gVXRpbGl0eSBhc3NlcnQgZWFjaCBwcm9wZXJ0eSBpbiBgdGVzdGAgaXMgcmVwcmVzZW50ZWQgaW4gYG5vZGVgLCBhbmQgZWFjaFxuLy8gdmFsdWVzIGFyZSBzdHJpY3RseSBlcXVhbC5cbmZ1bmN0aW9uIGFsbEZhY3RvcnkodGVzdCkge1xuICByZXR1cm4gYWxsXG5cbiAgZnVuY3Rpb24gYWxsKG5vZGUpIHtcbiAgICB2YXIga2V5XG5cbiAgICBmb3IgKGtleSBpbiB0ZXN0KSB7XG4gICAgICBpZiAobm9kZVtrZXldICE9PSB0ZXN0W2tleV0pIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlXG4gIH1cbn1cblxuZnVuY3Rpb24gYW55RmFjdG9yeSh0ZXN0cykge1xuICB2YXIgY2hlY2tzID0gW11cbiAgdmFyIGluZGV4ID0gLTFcblxuICB3aGlsZSAoKytpbmRleCA8IHRlc3RzLmxlbmd0aCkge1xuICAgIGNoZWNrc1tpbmRleF0gPSBjb252ZXJ0KHRlc3RzW2luZGV4XSlcbiAgfVxuXG4gIHJldHVybiBhbnlcblxuICBmdW5jdGlvbiBhbnkoKSB7XG4gICAgdmFyIGluZGV4ID0gLTFcblxuICAgIHdoaWxlICgrK2luZGV4IDwgY2hlY2tzLmxlbmd0aCkge1xuICAgICAgaWYgKGNoZWNrc1tpbmRleF0uYXBwbHkodGhpcywgYXJndW1lbnRzKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbi8vIFV0aWxpdHkgdG8gY29udmVydCBhIHN0cmluZyBpbnRvIGEgZnVuY3Rpb24gd2hpY2ggY2hlY2tzIGEgZ2l2ZW4gbm9kZeKAmXMgdHlwZVxuLy8gZm9yIHNhaWQgc3RyaW5nLlxuZnVuY3Rpb24gdHlwZUZhY3RvcnkodGVzdCkge1xuICByZXR1cm4gdHlwZVxuXG4gIGZ1bmN0aW9uIHR5cGUobm9kZSkge1xuICAgIHJldHVybiBCb29sZWFuKG5vZGUgJiYgbm9kZS50eXBlID09PSB0ZXN0KVxuICB9XG59XG5cbi8vIFV0aWxpdHkgdG8gcmV0dXJuIHRydWUuXG5mdW5jdGlvbiBvaygpIHtcbiAgcmV0dXJuIHRydWVcbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gaWRlbnRpdHlcbmZ1bmN0aW9uIGlkZW50aXR5KGQpIHtcbiAgcmV0dXJuIGRcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5tb2R1bGUuZXhwb3J0cyA9IHZpc2l0UGFyZW50c1xuXG52YXIgY29udmVydCA9IHJlcXVpcmUoJ3VuaXN0LXV0aWwtaXMvY29udmVydCcpXG52YXIgY29sb3IgPSByZXF1aXJlKCcuL2NvbG9yJylcblxudmFyIENPTlRJTlVFID0gdHJ1ZVxudmFyIFNLSVAgPSAnc2tpcCdcbnZhciBFWElUID0gZmFsc2VcblxudmlzaXRQYXJlbnRzLkNPTlRJTlVFID0gQ09OVElOVUVcbnZpc2l0UGFyZW50cy5TS0lQID0gU0tJUFxudmlzaXRQYXJlbnRzLkVYSVQgPSBFWElUXG5cbmZ1bmN0aW9uIHZpc2l0UGFyZW50cyh0cmVlLCB0ZXN0LCB2aXNpdG9yLCByZXZlcnNlKSB7XG4gIHZhciBzdGVwXG4gIHZhciBpc1xuXG4gIGlmICh0eXBlb2YgdGVzdCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgdmlzaXRvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldmVyc2UgPSB2aXNpdG9yXG4gICAgdmlzaXRvciA9IHRlc3RcbiAgICB0ZXN0ID0gbnVsbFxuICB9XG5cbiAgaXMgPSBjb252ZXJ0KHRlc3QpXG4gIHN0ZXAgPSByZXZlcnNlID8gLTEgOiAxXG5cbiAgZmFjdG9yeSh0cmVlLCBudWxsLCBbXSkoKVxuXG4gIGZ1bmN0aW9uIGZhY3Rvcnkobm9kZSwgaW5kZXgsIHBhcmVudHMpIHtcbiAgICB2YXIgdmFsdWUgPSB0eXBlb2Ygbm9kZSA9PT0gJ29iamVjdCcgJiYgbm9kZSAhPT0gbnVsbCA/IG5vZGUgOiB7fVxuICAgIHZhciBuYW1lXG5cbiAgICBpZiAodHlwZW9mIHZhbHVlLnR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBuYW1lID1cbiAgICAgICAgdHlwZW9mIHZhbHVlLnRhZ05hbWUgPT09ICdzdHJpbmcnXG4gICAgICAgICAgPyB2YWx1ZS50YWdOYW1lXG4gICAgICAgICAgOiB0eXBlb2YgdmFsdWUubmFtZSA9PT0gJ3N0cmluZydcbiAgICAgICAgICA/IHZhbHVlLm5hbWVcbiAgICAgICAgICA6IHVuZGVmaW5lZFxuXG4gICAgICB2aXNpdC5kaXNwbGF5TmFtZSA9XG4gICAgICAgICdub2RlICgnICsgY29sb3IodmFsdWUudHlwZSArIChuYW1lID8gJzwnICsgbmFtZSArICc+JyA6ICcnKSkgKyAnKSdcbiAgICB9XG5cbiAgICByZXR1cm4gdmlzaXRcblxuICAgIGZ1bmN0aW9uIHZpc2l0KCkge1xuICAgICAgdmFyIGdyYW5kcGFyZW50cyA9IHBhcmVudHMuY29uY2F0KG5vZGUpXG4gICAgICB2YXIgcmVzdWx0ID0gW11cbiAgICAgIHZhciBzdWJyZXN1bHRcbiAgICAgIHZhciBvZmZzZXRcblxuICAgICAgaWYgKCF0ZXN0IHx8IGlzKG5vZGUsIGluZGV4LCBwYXJlbnRzW3BhcmVudHMubGVuZ3RoIC0gMV0gfHwgbnVsbCkpIHtcbiAgICAgICAgcmVzdWx0ID0gdG9SZXN1bHQodmlzaXRvcihub2RlLCBwYXJlbnRzKSlcblxuICAgICAgICBpZiAocmVzdWx0WzBdID09PSBFWElUKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlLmNoaWxkcmVuICYmIHJlc3VsdFswXSAhPT0gU0tJUCkge1xuICAgICAgICBvZmZzZXQgPSAocmV2ZXJzZSA/IG5vZGUuY2hpbGRyZW4ubGVuZ3RoIDogLTEpICsgc3RlcFxuXG4gICAgICAgIHdoaWxlIChvZmZzZXQgPiAtMSAmJiBvZmZzZXQgPCBub2RlLmNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICAgIHN1YnJlc3VsdCA9IGZhY3Rvcnkobm9kZS5jaGlsZHJlbltvZmZzZXRdLCBvZmZzZXQsIGdyYW5kcGFyZW50cykoKVxuXG4gICAgICAgICAgaWYgKHN1YnJlc3VsdFswXSA9PT0gRVhJVCkge1xuICAgICAgICAgICAgcmV0dXJuIHN1YnJlc3VsdFxuICAgICAgICAgIH1cblxuICAgICAgICAgIG9mZnNldCA9XG4gICAgICAgICAgICB0eXBlb2Ygc3VicmVzdWx0WzFdID09PSAnbnVtYmVyJyA/IHN1YnJlc3VsdFsxXSA6IG9mZnNldCArIHN0ZXBcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHRvUmVzdWx0KHZhbHVlKSB7XG4gIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICdsZW5ndGgnIGluIHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBbQ09OVElOVUUsIHZhbHVlXVxuICB9XG5cbiAgcmV0dXJuIFt2YWx1ZV1cbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5tb2R1bGUuZXhwb3J0cyA9IHZpc2l0XG5cbnZhciB2aXNpdFBhcmVudHMgPSByZXF1aXJlKCd1bmlzdC11dGlsLXZpc2l0LXBhcmVudHMnKVxuXG52YXIgQ09OVElOVUUgPSB2aXNpdFBhcmVudHMuQ09OVElOVUVcbnZhciBTS0lQID0gdmlzaXRQYXJlbnRzLlNLSVBcbnZhciBFWElUID0gdmlzaXRQYXJlbnRzLkVYSVRcblxudmlzaXQuQ09OVElOVUUgPSBDT05USU5VRVxudmlzaXQuU0tJUCA9IFNLSVBcbnZpc2l0LkVYSVQgPSBFWElUXG5cbmZ1bmN0aW9uIHZpc2l0KHRyZWUsIHRlc3QsIHZpc2l0b3IsIHJldmVyc2UpIHtcbiAgaWYgKHR5cGVvZiB0ZXN0ID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB2aXNpdG9yICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV2ZXJzZSA9IHZpc2l0b3JcbiAgICB2aXNpdG9yID0gdGVzdFxuICAgIHRlc3QgPSBudWxsXG4gIH1cblxuICB2aXNpdFBhcmVudHModHJlZSwgdGVzdCwgb3ZlcmxvYWQsIHJldmVyc2UpXG5cbiAgZnVuY3Rpb24gb3ZlcmxvYWQobm9kZSwgcGFyZW50cykge1xuICAgIHZhciBwYXJlbnQgPSBwYXJlbnRzW3BhcmVudHMubGVuZ3RoIC0gMV1cbiAgICB2YXIgaW5kZXggPSBwYXJlbnQgPyBwYXJlbnQuY2hpbGRyZW4uaW5kZXhPZihub2RlKSA6IG51bGxcbiAgICByZXR1cm4gdmlzaXRvcihub2RlLCBpbmRleCwgcGFyZW50KVxuICB9XG59XG4iLCIvLyBMSUNFTlNFIDogTUlUXG5cInVzZSBzdHJpY3RcIjtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciB1bmlzdF91dGlsX3Zpc2l0XzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcInVuaXN0LXV0aWwtdmlzaXRcIikpO1xuLyoqXG4gKiBJZ25vcmUgbm9kZSBtYW5hZ2VyIHRoYXQgbWFuYWdlciBpZ25vcmVkIHJhbmdlcy5cbiAqXG4gKi9cbnZhciBJZ25vcmVOb2RlTWFuYWdlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBJZ25vcmVOb2RlTWFuYWdlcigpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtbbnVtYmVyLG51bWJlcl1bXX1cbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX2lnbm9yZWRSYW5nZUxpc3QgPSBbXTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KElnbm9yZU5vZGVNYW5hZ2VyLnByb3RvdHlwZSwgXCJpZ25vcmVkUmFuZ2VzXCIsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEByZXR1cm5zIHsobnVtYmVyKVtdW119XG4gICAgICAgICAqL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9pZ25vcmVkUmFuZ2VMaXN0O1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgLyoqXG4gICAgICogfC4uLi4uLi58XG4gICAgICogXiAgICAgICBeXG4gICAgICogSWdub3JlZCBSYW5nZVxuICAgICAqXG4gICAgICogICAgfC4uLi4uLi4ufFxuICAgICAqICAgIF5cbiAgICAgKiAgaW5kZXhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXhcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBJZ25vcmVOb2RlTWFuYWdlci5wcm90b3R5cGUuaXNJZ25vcmVkSW5kZXggPSBmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lnbm9yZWRSYW5nZUxpc3Quc29tZShmdW5jdGlvbiAocmFuZ2UpIHtcbiAgICAgICAgICAgIHZhciBzdGFydCA9IHJhbmdlWzBdLCBlbmQgPSByYW5nZVsxXTtcbiAgICAgICAgICAgIHJldHVybiBzdGFydCA8PSBpbmRleCAmJiBpbmRleCA8IGVuZDtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1tudW1iZXIsIG51bWJlcl19IGFSYW5nZVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqIEBkZXByZWNhdGVkIFRoaXMgbWV0aG9kIHdpbGwgYmUgcmVtb3ZlZFxuICAgICAqL1xuICAgIElnbm9yZU5vZGVNYW5hZ2VyLnByb3RvdHlwZS5pc0lnbm9yZWRSYW5nZSA9IGZ1bmN0aW9uIChhUmFuZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNJZ25vcmVkSW5kZXgoYVJhbmdlWzBdKSB8fCB0aGlzLmlzSWdub3JlZEluZGV4KGFSYW5nZVsxXSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gbm9kZVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIElnbm9yZU5vZGVNYW5hZ2VyLnByb3RvdHlwZS5pc0lnbm9yZWQgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0lnbm9yZWRSYW5nZShub2RlLnJhbmdlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIGFkZCBub2RlIHRvIGlnbm9yZSByYW5nZSBsaXN0XG4gICAgICogQHBhcmFtIHtUeHROb2RlfSBub2RlXG4gICAgICovXG4gICAgSWdub3JlTm9kZU1hbmFnZXIucHJvdG90eXBlLmlnbm9yZSA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIHRoaXMuaWdub3JlUmFuZ2Uobm9kZS5yYW5nZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBhZGQgcmFuZ2UgdG8gaWdub3JlIHJhbmdlIGxpc3RcbiAgICAgKiBAcGFyYW0ge1tudW1iZXIsIG51bWJlcl19IHJhbmdlXG4gICAgICovXG4gICAgSWdub3JlTm9kZU1hbmFnZXIucHJvdG90eXBlLmlnbm9yZVJhbmdlID0gZnVuY3Rpb24gKHJhbmdlKSB7XG4gICAgICAgIHRoaXMuX2lnbm9yZWRSYW5nZUxpc3QucHVzaChyYW5nZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBpZ25vcmUgY2hpbGRyZW4gbm9kZSBvZiBgbm9kZWAsXG4gICAgICogaWYgdGhlIGNoaWxkcmVuIG5vZGUgaGFzIHRoZSB0eXBlIHRoYXQgaXMgaW5jbHVkZWQgaW4gYGlnbm9yZWROb2RlVHlwZXNgLlxuICAgICAqIEBwYXJhbSB7VHh0Tm9kZX0gdGFyZ2V0Tm9kZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IGlnbm9yZWROb2RlVHlwZXNcbiAgICAgKi9cbiAgICBJZ25vcmVOb2RlTWFuYWdlci5wcm90b3R5cGUuaWdub3JlQ2hpbGRyZW5CeVR5cGVzID0gZnVuY3Rpb24gKHRhcmdldE5vZGUsIGlnbm9yZWROb2RlVHlwZXMpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgKDAsIHVuaXN0X3V0aWxfdmlzaXRfMS5kZWZhdWx0KSh0YXJnZXROb2RlLCBmdW5jdGlvbiAodmlzaXRlZE5vZGUpIHtcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IHR5cGUgaXMgVHh0Tm9kZVR5cGVcbiAgICAgICAgICAgIGlmIChpZ25vcmVkTm9kZVR5cGVzLmluY2x1ZGVzKHZpc2l0ZWROb2RlLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuaWdub3JlKHZpc2l0ZWROb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gSWdub3JlTm9kZU1hbmFnZXI7XG59KCkpO1xuZXhwb3J0cy5kZWZhdWx0ID0gSWdub3JlTm9kZU1hbmFnZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1JZ25vcmVOb2RlTWFuYWdlci5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gIENvcHlyaWdodCAoQykgMjAxNCBZdXN1a2UgU3V6dWtpIDx1dGF0YW5lLnRlYUBnbWFpbC5jb20+XG5cbiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuXG4gICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodFxuICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHRcbiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGVcbiAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG5cbiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiAgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuICBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuICBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgPENPUFlSSUdIVCBIT0xERVI+IEJFIExJQUJMRSBGT1IgQU5ZXG4gIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTXG4gIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUztcbiAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EXG4gIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4gIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRlxuICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuYmluYXJ5U2VhcmNoID0gZXhwb3J0cy51cHBlckJvdW5kID0gZXhwb3J0cy5sb3dlckJvdW5kID0gZXhwb3J0cy5jb21wYXJlID0gdm9pZCAwO1xuZnVuY3Rpb24gY29tcGFyZSh2MSwgdjIpIHtcbiAgICByZXR1cm4gdjEgPCB2Mjtcbn1cbmV4cG9ydHMuY29tcGFyZSA9IGNvbXBhcmU7XG5mdW5jdGlvbiB1cHBlckJvdW5kKGFycmF5LCB2YWx1ZSwgY29tcCA9IGNvbXBhcmUpIHtcbiAgICBsZXQgbGVuID0gYXJyYXkubGVuZ3RoO1xuICAgIGxldCBpID0gMDtcbiAgICB3aGlsZSAobGVuKSB7XG4gICAgICAgIGxldCBkaWZmID0gbGVuID4+PiAxO1xuICAgICAgICBsZXQgY3Vyc29yID0gaSArIGRpZmY7XG4gICAgICAgIGlmIChjb21wKHZhbHVlLCBhcnJheVtjdXJzb3JdKSkge1xuICAgICAgICAgICAgbGVuID0gZGlmZjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGkgPSBjdXJzb3IgKyAxO1xuICAgICAgICAgICAgbGVuIC09IGRpZmYgKyAxO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpO1xufVxuZXhwb3J0cy51cHBlckJvdW5kID0gdXBwZXJCb3VuZDtcbmZ1bmN0aW9uIGxvd2VyQm91bmQoYXJyYXksIHZhbHVlLCBjb21wID0gY29tcGFyZSkge1xuICAgIGxldCBsZW4gPSBhcnJheS5sZW5ndGg7XG4gICAgbGV0IGkgPSAwO1xuICAgIHdoaWxlIChsZW4pIHtcbiAgICAgICAgbGV0IGRpZmYgPSBsZW4gPj4+IDE7XG4gICAgICAgIGxldCBjdXJzb3IgPSBpICsgZGlmZjtcbiAgICAgICAgaWYgKGNvbXAoYXJyYXlbY3Vyc29yXSwgdmFsdWUpKSB7XG4gICAgICAgICAgICBpID0gY3Vyc29yICsgMTtcbiAgICAgICAgICAgIGxlbiAtPSBkaWZmICsgMTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxlbiA9IGRpZmY7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGk7XG59XG5leHBvcnRzLmxvd2VyQm91bmQgPSBsb3dlckJvdW5kO1xuZnVuY3Rpb24gYmluYXJ5U2VhcmNoKGFycmF5LCB2YWx1ZSwgY29tcCA9IGNvbXBhcmUpIHtcbiAgICBsZXQgY3Vyc29yID0gbG93ZXJCb3VuZChhcnJheSwgdmFsdWUsIGNvbXApO1xuICAgIHJldHVybiBjdXJzb3IgIT09IGFycmF5Lmxlbmd0aCAmJiAhY29tcCh2YWx1ZSwgYXJyYXlbY3Vyc29yXSk7XG59XG5leHBvcnRzLmJpbmFyeVNlYXJjaCA9IGJpbmFyeVNlYXJjaDtcbi8qIHZpbTogc2V0IHN3PTQgdHM9NCBldCB0dz04MCA6ICovXG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gIENvcHlyaWdodCAoQykgMjAxNCBZdXN1a2UgU3V6dWtpIDx1dGF0YW5lLnRlYUBnbWFpbC5jb20+XG5cbiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuXG4gICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodFxuICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHRcbiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGVcbiAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG5cbiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiAgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuICBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuICBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgPENPUFlSSUdIVCBIT0xERVI+IEJFIExJQUJMRSBGT1IgQU5ZXG4gIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTXG4gIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUztcbiAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EXG4gIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4gIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRlxuICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuU3RydWN0dXJlZFNvdXJjZSA9IHZvaWQgMDtcbmNvbnN0IGJvdW5kYXJ5XzEgPSByZXF1aXJlKFwiYm91bmRhcnlcIik7XG4vKipcbiAqIFN0cnVjdHVyZWRTb3VyY2VcbiAqL1xuY2xhc3MgU3RydWN0dXJlZFNvdXJjZSB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdHMgU3RydWN0dXJlZFNvdXJjZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgLSBzb3VyY2UgY29kZSB0ZXh0LlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHNvdXJjZSkge1xuICAgICAgICB0aGlzLmluZGljZSA9IFswXTtcbiAgICAgICAgbGV0IHJlZ2V4cCA9IC9bXFxyXFxuXFx1MjAyOFxcdTIwMjldL2c7XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IHNvdXJjZS5sZW5ndGg7XG4gICAgICAgIHJlZ2V4cC5sYXN0SW5kZXggPSAwO1xuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHJlZ2V4cC5leGVjKHNvdXJjZSk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGluZGV4ID0gcmVzdWx0LmluZGV4O1xuICAgICAgICAgICAgaWYgKHNvdXJjZS5jaGFyQ29kZUF0KGluZGV4KSA9PT0gMHgwRCAvKiAnXFxyJyAqLyAmJlxuICAgICAgICAgICAgICAgIHNvdXJjZS5jaGFyQ29kZUF0KGluZGV4ICsgMSkgPT09IDB4MEEgLyogJ1xcbicgKi8pIHtcbiAgICAgICAgICAgICAgICBpbmRleCArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IG5leHRJbmRleCA9IGluZGV4ICsgMTtcbiAgICAgICAgICAgIC8vIElmIHRoZXJlJ3MgYSBsYXN0IGxpbmUgdGVybWluYXRvciwgd2UgcHVzaCBpdCB0byB0aGUgaW5kaWNlLlxuICAgICAgICAgICAgLy8gU28gdXNlIDwgaW5zdGVhZCBvZiA8PS5cbiAgICAgICAgICAgIGlmIChsZW5ndGggPCBuZXh0SW5kZXgpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuaW5kaWNlLnB1c2gobmV4dEluZGV4KTtcbiAgICAgICAgICAgIHJlZ2V4cC5sYXN0SW5kZXggPSBuZXh0SW5kZXg7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IGxpbmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmluZGljZS5sZW5ndGg7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U291cmNlTG9jYXRpb259IGxvYyAtIGxvY2F0aW9uIGluZGljYXRvci5cbiAgICAgKiBAcmV0dXJuIHtbIG51bWJlciwgbnVtYmVyIF19IHJhbmdlLlxuICAgICAqL1xuICAgIGxvY2F0aW9uVG9SYW5nZShsb2MpIHtcbiAgICAgICAgcmV0dXJuIFt0aGlzLnBvc2l0aW9uVG9JbmRleChsb2Muc3RhcnQpLCB0aGlzLnBvc2l0aW9uVG9JbmRleChsb2MuZW5kKV07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7WyBudW1iZXIsIG51bWJlciBdfSByYW5nZSAtIHBhaXIgb2YgaW5kaWNlLlxuICAgICAqIEByZXR1cm4ge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbi5cbiAgICAgKi9cbiAgICByYW5nZVRvTG9jYXRpb24ocmFuZ2UpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN0YXJ0OiB0aGlzLmluZGV4VG9Qb3NpdGlvbihyYW5nZVswXSksXG4gICAgICAgICAgICBlbmQ6IHRoaXMuaW5kZXhUb1Bvc2l0aW9uKHJhbmdlWzFdKVxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1NvdXJjZVBvc2l0aW9ufSBwb3MgLSBwb3NpdGlvbiBpbmRpY2F0b3IuXG4gICAgICogQHJldHVybiB7bnVtYmVyfSBpbmRleC5cbiAgICAgKi9cbiAgICBwb3NpdGlvblRvSW5kZXgocG9zKSB7XG4gICAgICAgIC8vIExpbmUgbnVtYmVyIHN0YXJ0cyB3aXRoIDEuXG4gICAgICAgIC8vIENvbHVtbiBudW1iZXIgc3RhcnRzIHdpdGggMC5cbiAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5pbmRpY2VbcG9zLmxpbmUgLSAxXTtcbiAgICAgICAgcmV0dXJuIHN0YXJ0ICsgcG9zLmNvbHVtbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gaW5kZXggdG8gdGhlIHNvdXJjZSBjb2RlLlxuICAgICAqIEByZXR1cm4ge1NvdXJjZVBvc2l0aW9ufSBwb3NpdGlvbi5cbiAgICAgKi9cbiAgICBpbmRleFRvUG9zaXRpb24oaW5kZXgpIHtcbiAgICAgICAgY29uc3Qgc3RhcnRMaW5lID0gKDAsIGJvdW5kYXJ5XzEudXBwZXJCb3VuZCkodGhpcy5pbmRpY2UsIGluZGV4KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGxpbmU6IHN0YXJ0TGluZSxcbiAgICAgICAgICAgIGNvbHVtbjogaW5kZXggLSB0aGlzLmluZGljZVtzdGFydExpbmUgLSAxXVxuICAgICAgICB9O1xuICAgIH1cbn1cbmV4cG9ydHMuU3RydWN0dXJlZFNvdXJjZSA9IFN0cnVjdHVyZWRTb3VyY2U7XG4vKiB2aW06IHNldCBzdz00IHRzPTQgZXQgdHc9ODAgOiAqL1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3RydWN0dXJlZC1zb3VyY2UuanMubWFwIiwiLy8gTElDRU5TRSA6IE1JVFxuXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlNvdXJjZUxvY2F0aW9uID0gdm9pZCAwO1xudmFyIHN0cnVjdHVyZWRfc291cmNlXzEgPSByZXF1aXJlKFwic3RydWN0dXJlZC1zb3VyY2VcIik7XG52YXIgU291cmNlTG9jYXRpb24gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gU291cmNlTG9jYXRpb24odGV4dCkge1xuICAgICAgICB0aGlzLnNvdXJjZSA9IG5ldyBzdHJ1Y3R1cmVkX3NvdXJjZV8xLlN0cnVjdHVyZWRTb3VyY2UodGV4dCk7XG4gICAgfVxuICAgIFNvdXJjZUxvY2F0aW9uLnByb3RvdHlwZS50b0Fic29sdXRlTG9jYXRpb24gPSBmdW5jdGlvbiAobm9kZSwgcGFkZGluZykge1xuICAgICAgICB2YXIgbm9kZVJhbmdlID0gbm9kZS5yYW5nZTtcbiAgICAgICAgdmFyIGxpbmUgPSBub2RlLmxvYy5zdGFydC5saW5lO1xuICAgICAgICB2YXIgY29sdW1uID0gbm9kZS5sb2Muc3RhcnQuY29sdW1uO1xuICAgICAgICAvLyB3aGVuIHVzZSB7aW5kZXh9XG4gICAgICAgIGlmIChwYWRkaW5nLmluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHZhciBwYWRkaW5nSW5kZXggPSBwYWRkaW5nLmluZGV4O1xuICAgICAgICAgICAgcmV0dXJuIG5vZGVSYW5nZVswXSArIHBhZGRpbmdJbmRleDtcbiAgICAgICAgfVxuICAgICAgICAvLyB3aGVuIHVzZSB7bGluZSwgY29sdW1ufVxuICAgICAgICBpZiAocGFkZGluZy5saW5lICE9PSB1bmRlZmluZWQgJiYgcGFkZGluZy5jb2x1bW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdmFyIGFkZGVkTGluZSA9IGxpbmUgKyBwYWRkaW5nLmxpbmU7XG4gICAgICAgICAgICAvLyB3aGVuIHJlcG9ydCB3aXRoIHBhZGRpbmcge2xpbmUsIGNvbHVtbn0sIG1lc3NhZ2UuY29sdW1uIHNob3VsZCBiZSAwICsgcGFkZGluZy5jb2x1bW4uXG4gICAgICAgICAgICAvLyBJbiBvdGhlciB3b3JkLCBwYWRkaW5nIGxpbmUgPiAwIGFuZCBtZXNzYWdlLmNvbHVtbiBzdGFydCB3aXRoIDAuXG4gICAgICAgICAgICBpZiAocGFkZGluZy5jb2x1bW4gPiAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc291cmNlLnBvc2l0aW9uVG9JbmRleCh7XG4gICAgICAgICAgICAgICAgICAgIGxpbmU6IGFkZGVkTGluZSxcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBwYWRkaW5nLmNvbHVtblxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc291cmNlLnBvc2l0aW9uVG9JbmRleCh7XG4gICAgICAgICAgICAgICAgICAgIGxpbmU6IGFkZGVkTGluZSxcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBjb2x1bW5cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyB3aGVuIHVzZSB7IGxpbmUgfSBvbmx5XG4gICAgICAgIGlmIChwYWRkaW5nLmxpbmUgIT09IHVuZGVmaW5lZCAmJiBwYWRkaW5nLmxpbmUgPiAwKSB7XG4gICAgICAgICAgICB2YXIgYWRkZWRMaW5lID0gbGluZSArIHBhZGRpbmcubGluZTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNvdXJjZS5wb3NpdGlvblRvSW5kZXgoe1xuICAgICAgICAgICAgICAgIGxpbmU6IGFkZGVkTGluZSxcbiAgICAgICAgICAgICAgICBjb2x1bW46IGNvbHVtblxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vZGVSYW5nZVswXTtcbiAgICB9O1xuICAgIHJldHVybiBTb3VyY2VMb2NhdGlvbjtcbn0oKSk7XG5leHBvcnRzLlNvdXJjZUxvY2F0aW9uID0gU291cmNlTG9jYXRpb247XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Tb3VyY2VMb2NhdGlvbi5qcy5tYXAiLCIvLyBNSVQgwqkgMjAxOCBhenVcblwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy53cmFwUmVwb3J0SGFuZGxlciA9IHdyYXBSZXBvcnRIYW5kbGVyO1xudmFyIHRleHRsaW50X3J1bGVfaGVscGVyXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vdGV4dGxpbnQtcnVsZS1oZWxwZXJcIikpO1xudmFyIElnbm9yZU5vZGVNYW5hZ2VyXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vSWdub3JlTm9kZU1hbmFnZXJcIikpO1xudmFyIFNvdXJjZUxvY2F0aW9uXzEgPSByZXF1aXJlKFwiLi9Tb3VyY2VMb2NhdGlvblwiKTtcbi8qKlxuICpcbiAqIEBwYXJhbSBjb250ZXh0XG4gKiBAcGFyYW0gb3B0aW9uc1xuICogQHBhcmFtIGhhbmRsZXJcbiAqL1xuZnVuY3Rpb24gd3JhcFJlcG9ydEhhbmRsZXIoY29udGV4dCwgb3B0aW9ucywgaGFuZGxlcikge1xuICAgIHZhciBpZ25vcmVOb2RlVHlwZXMgPSBvcHRpb25zLmlnbm9yZU5vZGVUeXBlcyB8fCBbXTtcbiAgICB2YXIgaWdub3JlTm9kZU1hbmFnZXIgPSBuZXcgSWdub3JlTm9kZU1hbmFnZXJfMS5kZWZhdWx0KCk7XG4gICAgdmFyIHJ1bGVIZWxwZXIgPSBuZXcgdGV4dGxpbnRfcnVsZV9oZWxwZXJfMS5kZWZhdWx0KGNvbnRleHQpO1xuICAgIHZhciB0ZXh0ID0gY29udGV4dC5nZXRTb3VyY2UoKTtcbiAgICB2YXIgc291cmNlTG9jYXRpb24gPSBuZXcgU291cmNlTG9jYXRpb25fMS5Tb3VyY2VMb2NhdGlvbih0ZXh0KTtcbiAgICB2YXIgcmVwb3J0SWZVbmlnbm9yZWQgPSBmdW5jdGlvbiByZXBvcnRJZlVuaWdub3JlZChub2RlLCBydWxlRXJyb3IpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gc291cmNlTG9jYXRpb24udG9BYnNvbHV0ZUxvY2F0aW9uKG5vZGUsIHJ1bGVFcnJvcik7XG4gICAgICAgIGlmIChpZ25vcmVOb2RlTWFuYWdlci5pc0lnbm9yZWRJbmRleChpbmRleCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29udGV4dC5yZXBvcnQobm9kZSwgcnVsZUVycm9yKTtcbiAgICB9O1xuICAgIHZhciBoYW5kbGVycyA9IGhhbmRsZXIocmVwb3J0SWZVbmlnbm9yZWQpO1xuICAgIE9iamVjdC5rZXlzKGhhbmRsZXJzKS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlVHlwZSkge1xuICAgICAgICB2YXIgbm9kZUhhbmRsZXIgPSBoYW5kbGVyc1tub2RlVHlwZV07XG4gICAgICAgIHZhciB3cmFwcGVkTm9kZUhhbmRsZXIgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICAgICAgLy8gY2hpbGQgbm9kZXNcbiAgICAgICAgICAgIGlnbm9yZU5vZGVNYW5hZ2VyLmlnbm9yZUNoaWxkcmVuQnlUeXBlcyhub2RlLCBpZ25vcmVOb2RlVHlwZXMpO1xuICAgICAgICAgICAgLy8gcGFyZW50IG5vZGVcbiAgICAgICAgICAgIGlmIChydWxlSGVscGVyLmlzQ2hpbGROb2RlKG5vZGUsIGlnbm9yZU5vZGVUeXBlcykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIW5vZGVIYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5vZGVIYW5kbGVyKG5vZGUpO1xuICAgICAgICB9O1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBpZ25vcmVcbiAgICAgICAgaGFuZGxlcnNbbm9kZVR5cGVdID0gd3JhcHBlZE5vZGVIYW5kbGVyO1xuICAgIH0pO1xuICAgIHJldHVybiBoYW5kbGVycztcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXdyYXAtcmVwb3J0LWhhbmRsZXIuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLndyYXBSZXBvcnRIYW5kbGVyID0gZXhwb3J0cy5SdWxlSGVscGVyID0gZXhwb3J0cy5JZ25vcmVOb2RlTWFuYWdlciA9IHZvaWQgMDtcbnZhciB0ZXh0bGludF9ydWxlX2hlbHBlcl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL3RleHRsaW50LXJ1bGUtaGVscGVyXCIpKTtcbmV4cG9ydHMuUnVsZUhlbHBlciA9IHRleHRsaW50X3J1bGVfaGVscGVyXzEuZGVmYXVsdDtcbnZhciBJZ25vcmVOb2RlTWFuYWdlcl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL0lnbm9yZU5vZGVNYW5hZ2VyXCIpKTtcbmV4cG9ydHMuSWdub3JlTm9kZU1hbmFnZXIgPSBJZ25vcmVOb2RlTWFuYWdlcl8xLmRlZmF1bHQ7XG52YXIgd3JhcF9yZXBvcnRfaGFuZGxlcl8xID0gcmVxdWlyZShcIi4vd3JhcC1yZXBvcnQtaGFuZGxlclwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIndyYXBSZXBvcnRIYW5kbGVyXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB3cmFwX3JlcG9ydF9oYW5kbGVyXzEud3JhcFJlcG9ydEhhbmRsZXI7IH0gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCIvLyBMSUNFTlNFIDogTUlUXG5cInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMucmVwb3J0ID0gZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF90ZXh0bGludFJ1bGVIZWxwZXIgPSByZXF1aXJlKFwidGV4dGxpbnQtcnVsZS1oZWxwZXJcIik7XG52YXIgSGFua2FrdVJlZ0V4cCA9IC8oW1xcdWZmNjEtXFx1ZmY5Zl0rKS9nO1xudmFyIHJlcG9ydCA9IGZ1bmN0aW9uIHJlcG9ydGVyKGNvbnRleHQpIHtcbiAgdmFyIHtcbiAgICBTeW50YXgsXG4gICAgUnVsZUVycm9yLFxuICAgIGZpeGVyLFxuICAgIHJlcG9ydCxcbiAgICBsb2NhdG9yLFxuICAgIGdldFNvdXJjZVxuICB9ID0gY29udGV4dDtcbiAgdmFyIGhlbHBlciA9IG5ldyBfdGV4dGxpbnRSdWxlSGVscGVyLlJ1bGVIZWxwZXIoY29udGV4dCk7XG4gIHJldHVybiB7XG4gICAgW1N5bnRheC5TdHJdKG5vZGUpIHtcbiAgICAgIGlmICghaGVscGVyLmlzUGxhaW5TdHJOb2RlKG5vZGUpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZhciBub2RlVGV4dCA9IGdldFNvdXJjZShub2RlKTtcbiAgICAgIGZvciAodmFyIG1hdGNoIG9mIG5vZGVUZXh0Lm1hdGNoQWxsKEhhbmtha3VSZWdFeHApKSB7XG4gICAgICAgIHZhciBfbWF0Y2gkaW5kZXg7XG4gICAgICAgIHZhciB0ZXh0ID0gbWF0Y2hbMF07XG4gICAgICAgIHZhciBpbmRleCA9IChfbWF0Y2gkaW5kZXggPSBtYXRjaC5pbmRleCkgIT09IG51bGwgJiYgX21hdGNoJGluZGV4ICE9PSB2b2lkIDAgPyBfbWF0Y2gkaW5kZXggOiAwO1xuICAgICAgICB2YXIgcmFuZ2UgPSBbaW5kZXgsIGluZGV4ICsgdGV4dC5sZW5ndGhdO1xuICAgICAgICB2YXIgcnVsZUVycm9yID0gbmV3IFJ1bGVFcnJvcihcIkRpc2FsbG93IHRvIHVzZSBcXHU1MzRBXFx1ODlEMlxcdTMwQUJcXHUzMEJGXFx1MzBBQlxcdTMwQ0E6IFxcXCJcIi5jb25jYXQodGV4dCwgXCJcXFwiXCIpLCB7XG4gICAgICAgICAgcGFkZGluZzogbG9jYXRvci5yYW5nZShyYW5nZSksXG4gICAgICAgICAgZml4OiBmaXhlci5yZXBsYWNlVGV4dFJhbmdlKHJhbmdlLCB0ZXh0Lm5vcm1hbGl6ZSgnTkZLQycpKVxuICAgICAgICB9KTtcbiAgICAgICAgcmVwb3J0KG5vZGUsIHJ1bGVFcnJvcik7XG4gICAgICB9XG4gICAgfVxuICB9O1xufTtcbmV4cG9ydHMucmVwb3J0ID0gcmVwb3J0O1xudmFyIF9kZWZhdWx0ID0ge1xuICBsaW50ZXI6IHJlcG9ydCxcbiAgZml4ZXI6IHJlcG9ydFxufTtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGV4dGxpbnQtcnVsZS1uby1oYW5rYWt1LWthbmEuanMubWFwIiwiaW1wb3J0IHsgZmluZEZvcmVpZ25DamtDaGFyYWN0ZXJzSW5KYXBhbmVzZSB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliL3NyYyc7XG5pbXBvcnQgdHlwZSB7IFRleHRsaW50S2VybmVsUnVsZSB9IGZyb20gJ0B0ZXh0bGludC9rZXJuZWwnO1xuXG4vLyBDaGVja3MgdGhlIHdob2xlIHNvdXJjZSBleGNlcHQgY29kZSBhbmQgSFRNTCBjb21tZW50cyAoc3BlYWtlciBub3RlcyksIHNpbmNlIHZpc2libGUgc2xpZGUgdGV4dCBhbHNvIGxpdmVzIGluXG4vLyBibG9jayBIVE1MLCBpbWFnZSBhbHQgdGV4dCwgYW5kIG90aGVyIG5vZGVzIHRoYXQgYSBwZXItbm9kZS10eXBlIHZpc2l0b3Igd291bGQgbWlzcy5cbmV4cG9ydCBjb25zdCBub0NoaW5lc2VLb3JlYW46IFRleHRsaW50S2VybmVsUnVsZVsncnVsZSddID0gKHsgZ2V0U291cmNlLCBsb2NhdG9yLCByZXBvcnQsIFJ1bGVFcnJvciwgU3ludGF4IH0pID0+IHtcbiAgY29uc3QgY29kZVJhbmdlczogKHJlYWRvbmx5IFtudW1iZXIsIG51bWJlcl0pW10gPSBbXTtcbiAgcmV0dXJuIHtcbiAgICBbU3ludGF4LkNvZGVdKG5vZGUpIHtcbiAgICAgIGNvZGVSYW5nZXMucHVzaChub2RlLnJhbmdlKTtcbiAgICB9LFxuICAgIFtTeW50YXguQ29kZUJsb2NrXShub2RlKSB7XG4gICAgICBjb2RlUmFuZ2VzLnB1c2gobm9kZS5yYW5nZSk7XG4gICAgfSxcbiAgICBbU3ludGF4LkRvY3VtZW50RXhpdF0obm9kZSkge1xuICAgICAgbGV0IHRleHQgPSBnZXRTb3VyY2Uobm9kZSk7XG4gICAgICBmb3IgKGNvbnN0IFtzdGFydCwgZW5kXSBvZiBjb2RlUmFuZ2VzKSB7XG4gICAgICAgIHRleHQgPSB0ZXh0LnNsaWNlKDAsIHN0YXJ0KSArICcgJy5yZXBlYXQoZW5kIC0gc3RhcnQpICsgdGV4dC5zbGljZShlbmQpO1xuICAgICAgfVxuICAgICAgdGV4dCA9IHRleHQucmVwbGFjZUFsbCgvPCEtLVtcXHNcXFNdKj8tLT58PChjb2RlfHByZXxzY3JpcHR8c3R5bGUpKD89W1xccy8+XSlbXFxzXFxTXSo/PFxcL1xcMVxccyo+L2dpLCAobm9uUHJvc2UpID0+XG4gICAgICAgICcgJy5yZXBlYXQobm9uUHJvc2UubGVuZ3RoKVxuICAgICAgKTtcbiAgICAgIGNvbnN0IHJhbmdlczogW251bWJlciwgbnVtYmVyXVtdID0gW107XG4gICAgICBmb3IgKGNvbnN0IHsgMDogY2hhciwgaW5kZXggfSBvZiB0ZXh0Lm1hdGNoQWxsKC8uL2d1KSkge1xuICAgICAgICBpZiAoZmluZEZvcmVpZ25DamtDaGFyYWN0ZXJzSW5KYXBhbmVzZShjaGFyKS5sZW5ndGggPT09IDApIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCBsYXN0ID0gcmFuZ2VzLmF0KC0xKTtcbiAgICAgICAgaWYgKGxhc3Q/LlsxXSA9PT0gaW5kZXgpIGxhc3RbMV0gKz0gY2hhci5sZW5ndGg7XG4gICAgICAgIGVsc2UgcmFuZ2VzLnB1c2goW2luZGV4LCBpbmRleCArIGNoYXIubGVuZ3RoXSk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IHJhbmdlIG9mIHJhbmdlcykge1xuICAgICAgICByZXBvcnQoXG4gICAgICAgICAgbm9kZSxcbiAgICAgICAgICBuZXcgUnVsZUVycm9yKGBDaGluZXNlIG9yIEtvcmVhbiB0ZXh0IFwiJHt0ZXh0LnNsaWNlKC4uLnJhbmdlKX1cIiBpcyBkaXNhbGxvd2VkLmAsIHtcbiAgICAgICAgICAgIHBhZGRpbmc6IGxvY2F0b3IucmFuZ2UocmFuZ2UpLFxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcbn07XG4iLCJpbXBvcnQgeyBnZXRFcnJvck1lc3NhZ2UgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi9zcmMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9hZCB9IGZyb20gJ0BzbGlkZXYvcGFyc2VyL2ZzJztcbmltcG9ydCB7IFRleHRsaW50S2VybmVsLCB0eXBlIFRleHRsaW50S2VybmVsUnVsZSB9IGZyb20gJ0B0ZXh0bGludC9rZXJuZWwnO1xuaW1wb3J0IHsgbW9kdWxlSW50ZXJvcCB9IGZyb20gJ0B0ZXh0bGludC9tb2R1bGUtaW50ZXJvcCc7XG4vLyBUaGUgcGlubmVkIHBhY2thZ2UgaGFzIG5vIG5hbWVkIFByb2Nlc3NvciBleHBvcnQ7IGl0cyBkZWZhdWx0IGltcG9ydCBhbHNvIGZhaWxzIE5vZGVOZXh0IHR5cGluZy5cbmltcG9ydCB7IE1hcmtkb3duUHJvY2Vzc29yIH0gZnJvbSAnQHRleHRsaW50L3RleHRsaW50LXBsdWdpbi1tYXJrZG93bi9saWIvc3JjL01hcmtkb3duUHJvY2Vzc29yLmpzJztcbmltcG9ydCBub0ludmFsaWRDb250cm9sQ2hhcmFjdGVyIGZyb20gJ0B0ZXh0bGludC1ydWxlL3RleHRsaW50LXJ1bGUtbm8taW52YWxpZC1jb250cm9sLWNoYXJhY3Rlcic7XG5pbXBvcnQgbm9IYW5rYWt1S2FuYSBmcm9tICd0ZXh0bGludC1ydWxlLW5vLWhhbmtha3Uta2FuYSc7XG5pbXBvcnQgbm9aZXJvV2lkdGhTcGFjZXMgZnJvbSAndGV4dGxpbnQtcnVsZS1uby16ZXJvLXdpZHRoLXNwYWNlcyc7XG5cbmltcG9ydCB7IG5vQ2hpbmVzZUtvcmVhbiB9IGZyb20gJy4vbm9DaGluZXNlS29yZWFuUnVsZS5qcyc7XG5cbmNvbnN0IHJ1bGVzOiBUZXh0bGludEtlcm5lbFJ1bGVbXSA9IFtcbiAgeyBydWxlSWQ6ICduby1pbnZhbGlkLWNvbnRyb2wtY2hhcmFjdGVyJywgcnVsZTogbW9kdWxlSW50ZXJvcChub0ludmFsaWRDb250cm9sQ2hhcmFjdGVyKSB9LFxuICB7IHJ1bGVJZDogJ25vLWhhbmtha3Uta2FuYScsIHJ1bGU6IG1vZHVsZUludGVyb3Aobm9IYW5rYWt1S2FuYSkgfSxcbiAgeyBydWxlSWQ6ICduby16ZXJvLXdpZHRoLXNwYWNlcycsIHJ1bGU6IG1vZHVsZUludGVyb3Aobm9aZXJvV2lkdGhTcGFjZXMpIH0sXG4gIHsgcnVsZUlkOiAnbm8tY2hpbmVzZS1rb3JlYW4nLCBydWxlOiBub0NoaW5lc2VLb3JlYW4gfSxcbl07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaW50U2xpZGV2VGV4dChkZWNrUGF0aDogc3RyaW5nLCB3b3Jrc3BhY2VSb290OiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zb2xlLmluZm8oYFRleHRsaW50OiAke2RlY2tQYXRofWApO1xuICBjb25zdCB1c2VyUm9vdCA9IHBhdGguZGlybmFtZShkZWNrUGF0aCk7XG4gIGxldCBkYXRhOiBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIGxvYWQ+PjtcbiAgdHJ5IHtcbiAgICBkYXRhID0gYXdhaXQgbG9hZCh7IHJvb3RzOiBbdXNlclJvb3RdLCB1c2VyUm9vdCwgYWxsb3dlZFJvb3RzOiBbd29ya3NwYWNlUm9vdCwgdXNlclJvb3RdIH0sIGRlY2tQYXRoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKGAke2RlY2tQYXRofTogJHtnZXRFcnJvck1lc3NhZ2UoZXJyb3IpfWApO1xuICAgIHJldHVybiAxO1xuICB9XG4gIGNvbnN0IGtlcm5lbCA9IG5ldyBUZXh0bGludEtlcm5lbCgpO1xuICBsZXQgZXhpdENvZGUgPSAwO1xuICBmb3IgKGNvbnN0IGZpbGUgb2YgT2JqZWN0LnZhbHVlcyhkYXRhLm1hcmtkb3duRmlsZXMpKSB7XG4gICAgY29uc3QgZGlhZ25vc3RpY3MgPSAoZmlsZS5lcnJvcnMgPz8gW10pLm1hcCgoZXJyb3IpID0+IGAke2ZpbGUuZmlsZXBhdGh9OiR7ZXJyb3Iucm93ICsgMX06MTogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgIGZvciAoY29uc3QgZGlhZ25vc3RpYyBvZiBuZXcgU2V0KGRpYWdub3N0aWNzKSkge1xuICAgICAgY29uc29sZS5lcnJvcihkaWFnbm9zdGljKTtcbiAgICAgIGV4aXRDb2RlID0gMTtcbiAgICB9XG4gIH1cbiAgY29uc3QgY2hlY2tlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IHsgc291cmNlIH0gb2YgZGF0YS5zbGlkZXMpIHtcbiAgICBjb25zdCBrZXkgPSBgJHtzb3VyY2UuZmlsZXBhdGh9OiR7c291cmNlLmluZGV4fWA7XG4gICAgaWYgKGNoZWNrZWQuaGFzKGtleSkpIGNvbnRpbnVlO1xuICAgIGNoZWNrZWQuYWRkKGtleSk7XG4gICAgLy8gVGhlIHBhcnNlciBhbHdheXMgc2V0cyBjb250ZW50U3RhcnQgPj0gc3RhcnQsIGJ1dCBpdCBjYW4gZXhjZWVkIGVuZCBhZnRlciBhIGZpbmFsIHNlcGFyYXRvciB3aXRob3V0IGEgYmxhbmsgbGluZS5cbiAgICBjb25zdCBjb250ZW50U3RhcnQgPSBzb3VyY2UuY29udGVudFN0YXJ0ID4gc291cmNlLmVuZCA/IHNvdXJjZS5zdGFydCA6IHNvdXJjZS5jb250ZW50U3RhcnQ7XG4gICAgY29uc3QgdGV4dCA9IHNvdXJjZS5yYXdcbiAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgIC5zbGljZShjb250ZW50U3RhcnQgLSBzb3VyY2Uuc3RhcnQpXG4gICAgICAuam9pbignXFxuJyk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQga2VybmVsLmxpbnRUZXh0KHRleHQsIHtcbiAgICAgIGZpbGVQYXRoOiBzb3VyY2UuZmlsZXBhdGgsXG4gICAgICBleHQ6ICcubWQnLFxuICAgICAgcGx1Z2luczogW3sgcGx1Z2luSWQ6ICdtYXJrZG93bicsIHBsdWdpbjogeyBQcm9jZXNzb3I6IE1hcmtkb3duUHJvY2Vzc29yIH0gfV0sXG4gICAgICBydWxlcyxcbiAgICB9KTtcbiAgICBmb3IgKGNvbnN0IG1lc3NhZ2Ugb2YgcmVzdWx0Lm1lc3NhZ2VzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBgJHtzb3VyY2UuZmlsZXBhdGh9OiR7Y29udGVudFN0YXJ0ICsgbWVzc2FnZS5saW5lfToke21lc3NhZ2UuY29sdW1ufTogJHttZXNzYWdlLm1lc3NhZ2V9ICgke21lc3NhZ2UucnVsZUlkfSlgXG4gICAgICApO1xuICAgICAgZXhpdENvZGUgPSAxO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZXhpdENvZGU7XG59XG4iXSwieF9nb29nbGVfaWdub3JlTGlzdCI6WzEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LDE1LDE2LDE3LDE4LDE5LDIwLDIxLDIyLDIzLDI0LDI1LDI2LDI3LDI4LDI5LDMwLDMxLDMyLDMzLDM0LDM1LDM2LDM3LDM4LDM5LDQwLDQxLDQyLDQzLDQ0LDQ1LDQ2LDQ3LDQ4LDQ5LDUwLDUxLDUyLDUzLDU0LDU1LDU2LDU3LDU4LDU5LDYwLDYxLDYyLDYzLDY0LDY1LDY2LDY3LDY4LDY5LDcwLDcxLDcyLDczLDc0LDc1LDc2LDc3LDc4LDc5LDgwLDgxLDgyLDgzLDg0LDg1LDg2LDg3LDg4LDg5LDkwLDkxLDkyXSwibWFwcGluZ3MiOiIyb0NBRUEsTUFBTSxFQUFlLHFCQUNmLEVBQVksa0JBaUJaLGtCQUFtQyxJQUFJLElBQzNDLCtSQUNGLEVBRUEsSUFBSSxFQXlCSixTQUFnQixHQUFtQyxFQUFjLEVBQWMsR0FBYyxDQUMzRixJQUFNLEVBQW9CLElBQUksSUFBSSxFQUFZLFVBQVUsTUFBTSxDQUFDLEVBQ3pELEVBQVksSUFBa0IsR0FBc0IsRUFDcEQsa0JBQWEsSUFBSSxJQUN2QixJQUFLLElBQU0sS0FBUSxFQUFLLFVBQVUsTUFBTSxFQUNsQyxFQUFrQixJQUFJLENBQUksSUFFNUIsRUFBYSxLQUFLLENBQUksR0FDckIsRUFBVSxLQUFLLENBQUksSUFBTSxDQUFDLEVBQVMsSUFBSSxDQUFJLEdBQUssRUFBaUMsSUFBSSxDQUFJLEtBRTFGLEVBQVcsSUFB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