@willbooster/wb 7.6.6 → 7.6.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +2 -2
- package/package.json +7 -7
package/dist/index.js
CHANGED
|
@@ -30,5 +30,5 @@ let H;!function(e){e.BOOLEAN="boolean",e.STRING="string",e.NUMBER="number",e.ARR
|
|
|
30
30
|
* Copyright (c) 2016, Contributors
|
|
31
31
|
* SPDX-License-Identifier: ISC
|
|
32
32
|
*/
|
|
33
|
-
var J,G,K;const Q=process&&process.env&&process.env.YARGS_MIN_NODE_VERSION?Number(process.env.YARGS_MIN_NODE_VERSION):12,X=null!==(G=null===(J=null===process||void 0===process?void 0:process.versions)||void 0===J?void 0:J.node)&&void 0!==G?G:null===(K=null===process||void 0===process?void 0:process.version)||void 0===K?void 0:K.slice(1);if(X){if(Number(X.match(/^([^.]+)/)[1])<Q)throw Error(`yargs parser supports a minimum Node.js version of ${Q}. Read our version support policy: https://github.com/yargs/yargs-parser#supported-nodejs-versions`)}const Z=process?process.env:{},ee=new class{constructor(e){H=e}parse(e,t){const n=Object.assign({alias:void 0,array:void 0,boolean:void 0,config:void 0,configObjects:void 0,configuration:void 0,coerce:void 0,count:void 0,default:void 0,envPrefix:void 0,narg:void 0,normalize:void 0,string:void 0,number:void 0,__:void 0,key:void 0},t),s=function(e){if(Array.isArray(e))return e.map((e=>"string"!=typeof e?e+"":e));e=e.trim();let t=0,n=null,s=null,i=null;const r=[];for(let o=0;o<e.length;o++)n=s,s=e.charAt(o)," "!==s||i?(s===i?i=null:"'"!==s&&'"'!==s||i||(i=s),r[t]||(r[t]=""),r[t]+=s):" "!==n&&t++;return r}(e),i="string"==typeof e,r=function(e){const t=[],n=Object.create(null);let s=!0;Object.keys(e).forEach((function(n){t.push([].concat(e[n],n))}));for(;s;){s=!1;for(let e=0;e<t.length;e++)for(let n=e+1;n<t.length;n++){if(t[e].filter((function(e){return-1!==t[n].indexOf(e)})).length){t[e]=t[e].concat(t[n]),t.splice(n,1),s=!0;break}}}return t.forEach((function(e){const t=(e=e.filter((function(e,t,n){return n.indexOf(e)===t}))).pop();void 0!==t&&"string"==typeof t&&(n[t]=e)})),n}(Object.assign(Object.create(null),n.alias)),o=Object.assign({"boolean-negation":!0,"camel-case-expansion":!0,"combine-arrays":!1,"dot-notation":!0,"duplicate-arguments-array":!0,"flatten-duplicate-arrays":!0,"greedy-arrays":!0,"halt-at-non-option":!1,"nargs-eats-options":!1,"negation-prefix":"no-","parse-numbers":!0,"parse-positional-numbers":!0,"populate--":!1,"set-placeholder-key":!1,"short-option-groups":!0,"strip-aliased":!1,"strip-dashed":!1,"unknown-options-as-args":!1},n.configuration),a=Object.assign(Object.create(null),n.default),c=n.configObjects||[],l=n.envPrefix,h=o["populate--"],d=h?"--":"_",u=Object.create(null),f=Object.create(null),p=n.__||H.format,g={aliases:Object.create(null),arrays:Object.create(null),bools:Object.create(null),strings:Object.create(null),numbers:Object.create(null),counts:Object.create(null),normalize:Object.create(null),configs:Object.create(null),nargs:Object.create(null),coercions:Object.create(null),keys:[]},m=/^-([0-9]+(\.[0-9]+)?|\.[0-9]+)$/,y=new RegExp("^--"+o["negation-prefix"]+"(.+)");[].concat(n.array||[]).filter(Boolean).forEach((function(e){const t="object"==typeof e?e.key:e,n=Object.keys(e).map((function(e){return{boolean:"bools",string:"strings",number:"numbers"}[e]})).filter(Boolean).pop();n&&(g[n][t]=!0),g.arrays[t]=!0,g.keys.push(t)})),[].concat(n.boolean||[]).filter(Boolean).forEach((function(e){g.bools[e]=!0,g.keys.push(e)})),[].concat(n.string||[]).filter(Boolean).forEach((function(e){g.strings[e]=!0,g.keys.push(e)})),[].concat(n.number||[]).filter(Boolean).forEach((function(e){g.numbers[e]=!0,g.keys.push(e)})),[].concat(n.count||[]).filter(Boolean).forEach((function(e){g.counts[e]=!0,g.keys.push(e)})),[].concat(n.normalize||[]).filter(Boolean).forEach((function(e){g.normalize[e]=!0,g.keys.push(e)})),"object"==typeof n.narg&&Object.entries(n.narg).forEach((([e,t])=>{"number"==typeof t&&(g.nargs[e]=t,g.keys.push(e))})),"object"==typeof n.coerce&&Object.entries(n.coerce).forEach((([e,t])=>{"function"==typeof t&&(g.coercions[e]=t,g.keys.push(e))})),void 0!==n.config&&(Array.isArray(n.config)||"string"==typeof n.config?[].concat(n.config).filter(Boolean).forEach((function(e){g.configs[e]=!0})):"object"==typeof n.config&&Object.entries(n.config).forEach((([e,t])=>{"boolean"!=typeof t&&"function"!=typeof t||(g.configs[e]=t)}))),function(...e){e.forEach((function(e){Object.keys(e||{}).forEach((function(e){g.aliases[e]||(g.aliases[e]=[].concat(r[e]||[]),g.aliases[e].concat(e).forEach((function(t){if(/-/.test(t)&&o["camel-case-expansion"]){const n=B(t);n!==e&&-1===g.aliases[e].indexOf(n)&&(g.aliases[e].push(n),u[n]=!0)}})),g.aliases[e].concat(e).forEach((function(t){if(t.length>1&&/[A-Z]/.test(t)&&o["camel-case-expansion"]){const n=L(t,"-");n!==e&&-1===g.aliases[e].indexOf(n)&&(g.aliases[e].push(n),u[n]=!0)}})),g.aliases[e].forEach((function(t){g.aliases[t]=[e].concat(g.aliases[e].filter((function(e){return t!==e})))})))}))}))}(n.key,r,n.default,g.arrays),Object.keys(a).forEach((function(e){(g.aliases[e]||[]).forEach((function(t){a[t]=a[e]}))}));let b=null;Object.keys(g.counts).find((e=>D(e,g.arrays)?(b=Error(p("Invalid configuration: %s, opts.count excludes opts.array.",e)),!0):!!D(e,g.nargs)&&(b=Error(p("Invalid configuration: %s, opts.count excludes opts.narg.",e)),!0)));let v=[];const w=Object.assign(Object.create(null),{_:[]}),O={};for(let e=0;e<s.length;e++){const t=s[e],n=t.replace(/^-{3,}/,"---");let i,r,a,c,l,h;if("--"!==t&&/^-/.test(t)&&R(t))E(t);else{if(n.match(/^---+(=|$)/)){E(t);continue}if(t.match(/^--.+=/)||!o["short-option-groups"]&&t.match(/^-.+=/))c=t.match(/^--?([^=]+)=([\s\S]*)$/),null!==c&&Array.isArray(c)&&c.length>=3&&(D(c[1],g.arrays)?e=A(e,c[1],s,c[2]):!1!==D(c[1],g.nargs)?e=k(e,c[1],s,c[2]):j(c[1],c[2],!0));else if(t.match(y)&&o["boolean-negation"])c=t.match(y),null!==c&&Array.isArray(c)&&c.length>=2&&(r=c[1],j(r,!!D(r,g.arrays)&&[!1]));else if(t.match(/^--.+/)||!o["short-option-groups"]&&t.match(/^-[^-]+/))c=t.match(/^--?(.+)/),null!==c&&Array.isArray(c)&&c.length>=2&&(r=c[1],D(r,g.arrays)?e=A(e,r,s):!1!==D(r,g.nargs)?e=k(e,r,s):(l=s[e+1],void 0===l||l.match(/^-/)&&!l.match(m)||D(r,g.bools)||D(r,g.counts)?/^(true|false)$/.test(l)?(j(r,l),e++):j(r,W(r)):(j(r,l),e++)));else if(t.match(/^-.\..+=/))c=t.match(/^-([^=]+)=([\s\S]*)$/),null!==c&&Array.isArray(c)&&c.length>=3&&j(c[1],c[2]);else if(t.match(/^-.\..+/)&&!t.match(m))l=s[e+1],c=t.match(/^-(.\..+)/),null!==c&&Array.isArray(c)&&c.length>=2&&(r=c[1],void 0===l||l.match(/^-/)||D(r,g.bools)||D(r,g.counts)?j(r,W(r)):(j(r,l),e++));else if(t.match(/^-[^-]+/)&&!t.match(m)){a=t.slice(1,-1).split(""),i=!1;for(let n=0;n<a.length;n++){if(l=t.slice(n+2),a[n+1]&&"="===a[n+1]){h=t.slice(n+3),r=a[n],D(r,g.arrays)?e=A(e,r,s,h):!1!==D(r,g.nargs)?e=k(e,r,s,h):j(r,h),i=!0;break}if("-"!==l){if(/[A-Za-z]/.test(a[n])&&/^-?\d+(\.\d*)?(e-?\d+)?$/.test(l)&&!1===D(l,g.bools)){j(a[n],l),i=!0;break}if(a[n+1]&&a[n+1].match(/\W/)){j(a[n],l),i=!0;break}j(a[n],W(a[n]))}else j(a[n],l)}r=t.slice(-1)[0],i||"-"===r||(D(r,g.arrays)?e=A(e,r,s):!1!==D(r,g.nargs)?e=k(e,r,s):(l=s[e+1],void 0===l||/^(-|--)[^-]/.test(l)&&!l.match(m)||D(r,g.bools)||D(r,g.counts)?/^(true|false)$/.test(l)?(j(r,l),e++):j(r,W(r)):(j(r,l),e++)))}else if(t.match(/^-[0-9]$/)&&t.match(m)&&D(t.slice(1),g.bools))r=t.slice(1),j(r,W(r));else{if("--"===t){v=s.slice(e+1);break}if(o["halt-at-non-option"]){v=s.slice(e);break}E(t)}}}function E(e){const t=x("_",e);"string"!=typeof t&&"number"!=typeof t||w._.push(t)}function k(e,t,n,s){let i,r=D(t,g.nargs);if(r="number"!=typeof r||isNaN(r)?1:r,0===r)return z(s)||(b=Error(p("Argument unexpected for: %s",t))),j(t,W(t)),e;let a=z(s)?0:1;if(o["nargs-eats-options"])n.length-(e+1)+a<r&&(b=Error(p("Not enough arguments following: %s",t))),a=r;else{for(i=e+1;i<n.length&&(!n[i].match(/^-[^0-9]/)||n[i].match(m)||R(n[i]));i++)a++;a<r&&(b=Error(p("Not enough arguments following: %s",t)))}let c=Math.min(a,r);for(!z(s)&&c>0&&(j(t,s),c--),i=e+1;i<c+e+1;i++)j(t,n[i]);return e+c}function A(e,t,n,s){let r=[],c=s||n[e+1];const l=D(t,g.nargs);if(D(t,g.bools)&&!/^(true|false)$/.test(c))r.push(!0);else if(z(c)||z(s)&&/^-/.test(c)&&!m.test(c)&&!R(c)){if(void 0!==a[t]){const e=a[t];r=Array.isArray(e)?e:[e]}}else{z(s)||r.push(_(t,s,!0));for(let s=e+1;s<n.length&&!(!o["greedy-arrays"]&&r.length>0||l&&"number"==typeof l&&r.length>=l)&&(c=n[s],!/^-/.test(c)||m.test(c)||R(c));s++)e=s,r.push(_(t,c,i))}return"number"==typeof l&&(l&&r.length<l||isNaN(l)&&0===r.length)&&(b=Error(p("Not enough arguments following: %s",t))),j(t,r),e}function j(e,t,n=i){if(/-/.test(e)&&o["camel-case-expansion"]){const t=e.split(".").map((function(e){return B(e)})).join(".");$(e,t)}const s=_(e,t,n),r=e.split(".");if(M(w,r,s),g.aliases[e]&&g.aliases[e].forEach((function(e){const t=e.split(".");M(w,t,s)})),r.length>1&&o["dot-notation"]&&(g.aliases[r[0]]||[]).forEach((function(t){let n=t.split(".");const i=[].concat(r);i.shift(),n=n.concat(i),(g.aliases[e]||[]).includes(n.join("."))||M(w,n,s)})),D(e,g.normalize)&&!D(e,g.arrays)){[e].concat(g.aliases[e]||[]).forEach((function(e){Object.defineProperty(O,e,{enumerable:!0,get:()=>t,set(e){t="string"==typeof e?H.normalize(e):e}})}))}}function $(e,t){g.aliases[e]&&g.aliases[e].length||(g.aliases[e]=[t],u[t]=!0),g.aliases[t]&&g.aliases[t].length||$(t,e)}function _(e,t,n){n&&(t=function(e){return"string"!=typeof e||"'"!==e[0]&&'"'!==e[0]||e[e.length-1]!==e[0]?e:e.substring(1,e.length-1)}(t)),(D(e,g.bools)||D(e,g.counts))&&"string"==typeof t&&(t="true"===t);let s=Array.isArray(t)?t.map((function(t){return x(e,t)})):x(e,t);return D(e,g.counts)&&(z(s)||"boolean"==typeof s)&&(s=Y()),D(e,g.normalize)&&D(e,g.arrays)&&(s=Array.isArray(t)?t.map((e=>H.normalize(e))):H.normalize(t)),s}function x(e,t){if(!o["parse-positional-numbers"]&&"_"===e)return t;if(!D(e,g.strings)&&!D(e,g.bools)&&!Array.isArray(t)){(V(t)&&o["parse-numbers"]&&Number.isSafeInteger(Math.floor(parseFloat(`${t}`)))||!z(t)&&D(e,g.numbers))&&(t=Number(t))}return t}function C(e,t){Object.keys(e).forEach((function(n){const s=e[n],i=t?t+"."+n:n;"object"==typeof s&&null!==s&&!Array.isArray(s)&&o["dot-notation"]?C(s,i):(!N(w,i.split("."))||D(i,g.arrays)&&o["combine-arrays"])&&j(i,s)}))}function S(e,t){if(void 0===l)return;const n="string"==typeof l?l:"",s=H.env();Object.keys(s).forEach((function(i){if(""===n||0===i.lastIndexOf(n,0)){const r=i.split("__").map((function(e,t){return 0===t&&(e=e.substring(n.length)),B(e)}));(t&&g.configs[r.join(".")]||!t)&&!N(e,r)&&j(r.join("."),s[i])}}))}function P(e,t,n,s=!1){Object.keys(n).forEach((function(i){N(e,i.split("."))||(M(e,i.split("."),n[i]),s&&(f[i]=!0),(t[i]||[]).forEach((function(t){N(e,t.split("."))||M(e,t.split("."),n[i])})))}))}function N(e,t){let n=e;o["dot-notation"]||(t=[t.join(".")]),t.slice(0,-1).forEach((function(e){n=n[e]||{}}));const s=t[t.length-1];return"object"==typeof n&&s in n}function M(e,t,n){let s=e;o["dot-notation"]||(t=[t.join(".")]),t.slice(0,-1).forEach((function(e){e=q(e),"object"==typeof s&&void 0===s[e]&&(s[e]={}),"object"!=typeof s[e]||Array.isArray(s[e])?(Array.isArray(s[e])?s[e].push({}):s[e]=[s[e],{}],s=s[e][s[e].length-1]):s=s[e]}));const i=q(t[t.length-1]),r=D(t.join("."),g.arrays),a=Array.isArray(n);let c=o["duplicate-arguments-array"];!c&&D(i,g.nargs)&&(c=!0,(!z(s[i])&&1===g.nargs[i]||Array.isArray(s[i])&&s[i].length===g.nargs[i])&&(s[i]=void 0)),n===Y()?s[i]=Y(s[i]):Array.isArray(s[i])?c&&r&&a?s[i]=o["flatten-duplicate-arrays"]?s[i].concat(n):(Array.isArray(s[i][0])?s[i]:[s[i]]).concat([n]):c||Boolean(r)!==Boolean(a)?s[i]=s[i].concat([n]):s[i]=n:void 0===s[i]&&r?s[i]=a?n:[n]:!c||void 0===s[i]||D(i,g.counts)||D(i,g.bools)?s[i]=n:s[i]=[s[i],n]}function D(e,t){const n=[].concat(g.aliases[e]||[],e),s=Object.keys(t),i=n.find((e=>s.includes(e)));return!!i&&t[i]}function I(e){const t=Object.keys(g);return[].concat(t.map((e=>g[e]))).some((function(t){return Array.isArray(t)?t.includes(e):t[e]}))}function R(e){return o["unknown-options-as-args"]&&function(e){if(e=e.replace(/^-{3,}/,"--"),e.match(m))return!1;if(function(e){if(e.match(m)||!e.match(/^-[^-]+/))return!1;let t,n=!0;const s=e.slice(1).split("");for(let i=0;i<s.length;i++){if(t=e.slice(i+2),!I(s[i])){n=!1;break}if(s[i+1]&&"="===s[i+1]||"-"===t||/[A-Za-z]/.test(s[i])&&/^-?\d+(\.\d*)?(e-?\d+)?$/.test(t)||s[i+1]&&s[i+1].match(/\W/))break}return n}(e))return!1;return!function(e,...t){return[].concat(...t).some((function(t){const n=e.match(t);return n&&I(n[1])}))}(e,/^-+([^=]+?)=[\s\S]*$/,y,/^-+([^=]+?)$/,/^-+([^=]+?)-$/,/^-+([^=]+?\d+)$/,/^-+([^=]+?)\W+.*$/)}(e)}function W(e){return D(e,g.bools)||D(e,g.counts)||!(`${e}`in a)?(t=function(e){let t=U.BOOLEAN;return D(e,g.strings)?t=U.STRING:D(e,g.numbers)?t=U.NUMBER:D(e,g.bools)?t=U.BOOLEAN:D(e,g.arrays)&&(t=U.ARRAY),t}(e),{[U.BOOLEAN]:!0,[U.STRING]:"",[U.NUMBER]:void 0,[U.ARRAY]:[]}[t]):a[e];var t}function z(e){return void 0===e}return S(w,!0),S(w,!1),function(e){const t=Object.create(null);P(t,g.aliases,a),Object.keys(g.configs).forEach((function(n){const s=e[n]||t[n];if(s)try{let e=null;const t=H.resolve(H.cwd(),s),i=g.configs[n];if("function"==typeof i){try{e=i(t)}catch(t){e=t}if(e instanceof Error)return void(b=e)}else e=H.require(t);C(e)}catch(t){"PermissionDenied"===t.name?b=t:e[n]&&(b=Error(p("Invalid JSON config file: %s",s)))}}))}(w),void 0!==c&&c.forEach((function(e){C(e)})),P(w,g.aliases,a,!0),function(e){let t;const n=new Set;Object.keys(e).forEach((function(s){if(!n.has(s)&&(t=D(s,g.coercions),"function"==typeof t))try{const i=x(s,t(e[s]));[].concat(g.aliases[s]||[],s).forEach((t=>{n.add(t),e[t]=i}))}catch(e){b=e}}))}(w),o["set-placeholder-key"]&&function(e){g.keys.forEach((t=>{~t.indexOf(".")||void 0===e[t]&&(e[t]=void 0)}))}(w),Object.keys(g.counts).forEach((function(e){N(w,e.split("."))||j(e,0)})),h&&v.length&&(w[d]=[]),v.forEach((function(e){w[d].push(e)})),o["camel-case-expansion"]&&o["strip-dashed"]&&Object.keys(w).filter((e=>"--"!==e&&e.includes("-"))).forEach((e=>{delete w[e]})),o["strip-aliased"]&&[].concat(...Object.keys(r).map((e=>r[e]))).forEach((e=>{o["camel-case-expansion"]&&e.includes("-")&&delete w[e.split(".").map((e=>B(e))).join(".")],delete w[e]})),{aliases:Object.assign({},g.aliases),argv:Object.assign(O,w),configuration:o,defaulted:Object.assign({},f),error:b,newAliases:Object.assign({},u)}}}({cwd:process.cwd,env:()=>Z,format:p,normalize:s,resolve:t,require:e=>{if("undefined"!=typeof require)return require(e);if(e.match(/\.json$/))return JSON.parse(u(e,"utf8"));throw Error("only .json config files are supported in ESM")}}),te=function(e,t){return ee.parse(e.slice(),t).argv};function ne(){return process.versions.electron&&!process.defaultApp?0:1}te.detailed=function(e,t){return ee.parse(e.slice(),t)},te.camelCase=B,te.decamelize=L,te.looksLikeNumber=V;class se extends Error{constructor(e){super(e||"yargs error"),this.name="YError",Error.captureStackTrace&&Error.captureStackTrace(this,se)}}var ie={fs:{readFileSync:u,writeFile:f},format:p,resolve:t,exists:e=>{try{return h(e).isFile()}catch(e){return!1}}};let re;class oe{constructor(e){e=e||{},this.directory=e.directory||"./locales",this.updateFiles="boolean"!=typeof e.updateFiles||e.updateFiles,this.locale=e.locale||"en",this.fallbackToLanguage="boolean"!=typeof e.fallbackToLanguage||e.fallbackToLanguage,this.cache=Object.create(null),this.writeQueue=[]}__(...e){if("string"!=typeof arguments[0])return this._taggedLiteral(arguments[0],...arguments);const t=e.shift();let n=function(){};return"function"==typeof e[e.length-1]&&(n=e.pop()),n=n||function(){},this.cache[this.locale]||this._readLocaleFile(),!this.cache[this.locale][t]&&this.updateFiles?(this.cache[this.locale][t]=t,this._enqueueWrite({directory:this.directory,locale:this.locale,cb:n})):n(),re.format.apply(re.format,[this.cache[this.locale][t]||t].concat(e))}__n(){const e=Array.prototype.slice.call(arguments),t=e.shift(),n=e.shift(),s=e.shift();let i=function(){};"function"==typeof e[e.length-1]&&(i=e.pop()),this.cache[this.locale]||this._readLocaleFile();let r=1===s?t:n;if(this.cache[this.locale][t]){r=this.cache[this.locale][t][1===s?"one":"other"]}!this.cache[this.locale][t]&&this.updateFiles?(this.cache[this.locale][t]={one:t,other:n},this._enqueueWrite({directory:this.directory,locale:this.locale,cb:i})):i();const o=[r];return~r.indexOf("%d")&&o.push(s),re.format.apply(re.format,o.concat(e))}setLocale(e){this.locale=e}getLocale(){return this.locale}updateLocale(e){this.cache[this.locale]||this._readLocaleFile();for(const t in e)Object.prototype.hasOwnProperty.call(e,t)&&(this.cache[this.locale][t]=e[t])}_taggedLiteral(e,...t){let n="";return e.forEach((function(e,s){const i=t[s+1];n+=e,void 0!==i&&(n+="%s")})),this.__.apply(this,[n].concat([].slice.call(t,1)))}_enqueueWrite(e){this.writeQueue.push(e),1===this.writeQueue.length&&this._processWriteQueue()}_processWriteQueue(){const e=this,t=this.writeQueue[0],n=t.directory,s=t.locale,i=t.cb,r=this._resolveLocaleFile(n,s),o=JSON.stringify(this.cache[s],null,2);re.fs.writeFile(r,o,"utf-8",(function(t){e.writeQueue.shift(),e.writeQueue.length>0&&e._processWriteQueue(),i(t)}))}_readLocaleFile(){let e={};const t=this._resolveLocaleFile(this.directory,this.locale);try{re.fs.readFileSync&&(e=JSON.parse(re.fs.readFileSync(t,"utf-8")))}catch(n){if(n instanceof SyntaxError&&(n.message="syntax error in "+t),"ENOENT"!==n.code)throw n;e={}}this.cache[this.locale]=e}_resolveLocaleFile(e,t){let n=re.resolve(e,"./",t+".json");if(this.fallbackToLanguage&&!this._fileExistsSync(n)&&~t.lastIndexOf("_")){const s=re.resolve(e,"./",t.split("_")[0]+".json");this._fileExistsSync(s)&&(n=s)}return n}_fileExistsSync(e){return re.exists(e)}}const ae="loading a directory of commands is not supported yet for ESM";let ce;try{ce=m(import.meta.url)}catch(e){ce=process.cwd()}var le,he={assert:{notStrictEqual:a,strictEqual:c},cliui:function(e){return function(e,t){return W=t,new I({width:(null==e?void 0:e.width)||("object"==typeof process&&process.stdout&&process.stdout.columns?process.stdout.columns:80),wrap:null==e?void 0:e.wrap})}(e,{stringWidth:e=>[...e].length,stripAnsi:T,wrap:F})},findUp:function(e,s){let i,r=t(".",e);for(h(r).isDirectory()||(r=n(r));;){if(i=s(r,d(r)),i)return t(r,i);if(r=n(i=r),i===r)break}},getEnv:e=>process.env[e],inspect:g,getCallerFile:()=>{throw new se(ae)},getProcessArgvBin:function(){return process.argv[ne()]},mainFilename:ce.substring(0,ce.lastIndexOf("node_modules"))||process.cwd(),Parser:te,path:{basename:i,dirname:n,extname:r,relative:o,resolve:t},process:{argv:()=>process.argv,cwd:process.cwd,emitWarning:(e,t)=>process.emitWarning(e,t),execPath:()=>process.execPath,exit:process.exit,nextTick:process.nextTick,stdColumns:void 0!==process.stdout.columns?process.stdout.columns:null},readFileSync:u,require:()=>{throw new se("require is not supported by ESM")},requireDirectory:()=>{throw new se(ae)},stringWidth:e=>[...e].length,y18n:(le={directory:t(ce,"../../../locales"),updateFiles:!1},function(e,t){re=t;const n=new oe(e);return{__:n.__.bind(n),__n:n.__n.bind(n),setLocale:n.setLocale.bind(n),getLocale:n.getLocale.bind(n),updateLocale:n.updateLocale.bind(n),locale:n.locale}}(le,ie))};function de(e,t,n,s){n.assert.notStrictEqual(e,t,s)}function ue(e,t){t.assert.strictEqual(typeof e,"string")}function fe(e){return Object.keys(e)}function pe(e){return!!e&&!!e.then&&"function"==typeof e.then}function ge(e){const t=e.replace(/\s{2,}/g," ").split(/\s+(?![^[]*]|[^<]*>)/),n=/\.*[\][<>]/g,s=t.shift();if(!s)throw new Error(`No command found in: ${e}`);const i={cmd:s.replace(n,""),demanded:[],optional:[]};return t.forEach(((e,s)=>{let r=!1;e=e.replace(/\s/g,""),/\.+[\]>]/.test(e)&&s===t.length-1&&(r=!0),/^\[/.test(e)?i.optional.push({cmd:e.replace(n,"").split("|"),variadic:r}):i.demanded.push({cmd:e.replace(n,"").split("|"),variadic:r})})),i}const me=["first","second","third","fourth","fifth","sixth"];function ye(e,t,n){try{let s=0;const[i,r,o]="object"==typeof e?[{demanded:[],optional:[]},e,t]:[ge(`cmd ${e}`),t,n],a=[].slice.call(r);for(;a.length&&void 0===a[a.length-1];)a.pop();const c=o||a.length;if(c<i.demanded.length)throw new se(`Not enough arguments provided. Expected ${i.demanded.length} but received ${a.length}.`);const l=i.demanded.length+i.optional.length;if(c>l)throw new se(`Too many arguments provided. Expected max ${l} but received ${c}.`);i.demanded.forEach((e=>{const t=be(a.shift());0===e.cmd.filter((e=>e===t||"*"===e)).length&&ve(t,e.cmd,s),s+=1})),i.optional.forEach((e=>{if(0===a.length)return;const t=be(a.shift());0===e.cmd.filter((e=>e===t||"*"===e)).length&&ve(t,e.cmd,s),s+=1}))}catch(e){console.warn(e.stack)}}function be(e){return Array.isArray(e)?"array":null===e?"null":typeof e}function ve(e,t,n){throw new se(`Invalid ${me[n]||"manyith"} argument. Expected ${t.join(" or ")} but received ${e}.`)}class we{constructor(e){this.globalMiddleware=[],this.frozens=[],this.yargs=e}addMiddleware(e,t,n=!0,s=!1){if(ye("<array|function> [boolean] [boolean] [boolean]",[e,t,n],arguments.length),Array.isArray(e)){for(let s=0;s<e.length;s++){if("function"!=typeof e[s])throw Error("middleware must be a function");const i=e[s];i.applyBeforeValidation=t,i.global=n}Array.prototype.push.apply(this.globalMiddleware,e)}else if("function"==typeof e){const i=e;i.applyBeforeValidation=t,i.global=n,i.mutates=s,this.globalMiddleware.push(e)}return this.yargs}addCoerceMiddleware(e,t){const n=this.yargs.getAliases();return this.globalMiddleware=this.globalMiddleware.filter((e=>{const s=[...n[t]||[],t];return!e.option||!s.includes(e.option)})),e.option=t,this.addMiddleware(e,!0,!0,!0)}getMiddleware(){return this.globalMiddleware}freeze(){this.frozens.push([...this.globalMiddleware])}unfreeze(){const e=this.frozens.pop();void 0!==e&&(this.globalMiddleware=e)}reset(){this.globalMiddleware=this.globalMiddleware.filter((e=>e.global))}}function Oe(e,t,n,s){return n.reduce(((e,n)=>{if(n.applyBeforeValidation!==s)return e;if(n.mutates){if(n.applied)return e;n.applied=!0}if(pe(e))return e.then((e=>Promise.all([e,n(e,t)]))).then((([e,t])=>Object.assign(e,t)));{const s=n(e,t);return pe(s)?s.then((t=>Object.assign(e,t))):Object.assign(e,s)}}),e)}function Ee(e,t,n=(e=>{throw e})){try{const n="function"==typeof e?e():e;return pe(n)?n.then((e=>t(e))):t(n)}catch(e){return n(e)}}const ke=/(^\*)|(^\$0)/;class Ae{constructor(e,t,n,s){this.requireCache=new Set,this.handlers={},this.aliasMap={},this.frozens=[],this.shim=s,this.usage=e,this.globalMiddleware=n,this.validation=t}addDirectory(e,t,n,s){"boolean"!=typeof(s=s||{}).recurse&&(s.recurse=!1),Array.isArray(s.extensions)||(s.extensions=["js"]);const i="function"==typeof s.visit?s.visit:e=>e;s.visit=(e,t,n)=>{const s=i(e,t,n);if(s){if(this.requireCache.has(t))return s;this.requireCache.add(t),this.addHandler(s)}return s},this.shim.requireDirectory({require:t,filename:n},e,s)}addHandler(e,t,n,s,i,r){let o=[];const a=function(e){return e?e.map((e=>(e.applyBeforeValidation=!1,e))):[]}(i);if(s=s||(()=>{}),Array.isArray(e))if(function(e){return e.every((e=>"string"==typeof e))}(e))[e,...o]=e;else for(const t of e)this.addHandler(t);else{if(function(e){return"object"==typeof e&&!Array.isArray(e)}(e)){let t=Array.isArray(e.command)||"string"==typeof e.command?e.command:this.moduleName(e);return e.aliases&&(t=[].concat(t).concat(e.aliases)),void this.addHandler(t,this.extractDesc(e),e.builder,e.handler,e.middlewares,e.deprecated)}if(je(n))return void this.addHandler([e].concat(o),t,n.builder,n.handler,n.middlewares,n.deprecated)}if("string"==typeof e){const i=ge(e);o=o.map((e=>ge(e).cmd));let c=!1;const l=[i.cmd].concat(o).filter((e=>!ke.test(e)||(c=!0,!1)));0===l.length&&c&&l.push("$0"),c&&(i.cmd=l[0],o=l.slice(1),e=e.replace(ke,i.cmd)),o.forEach((e=>{this.aliasMap[e]=i.cmd})),!1!==t&&this.usage.command(e,t,c,o,r),this.handlers[i.cmd]={original:e,description:t,handler:s,builder:n||{},middlewares:a,deprecated:r,demanded:i.demanded,optional:i.optional},c&&(this.defaultCommand=this.handlers[i.cmd])}}getCommandHandlers(){return this.handlers}getCommands(){return Object.keys(this.handlers).concat(Object.keys(this.aliasMap))}hasDefaultCommand(){return!!this.defaultCommand}runCommand(e,t,n,s,i,r){const o=this.handlers[e]||this.handlers[this.aliasMap[e]]||this.defaultCommand,a=t.getInternalMethods().getContext(),c=a.commands.slice(),l=!e;e&&(a.commands.push(e),a.fullCommands.push(o.original));const h=this.applyBuilderUpdateUsageAndParse(l,o,t,n.aliases,c,s,i,r);return pe(h)?h.then((e=>this.applyMiddlewareAndGetResult(l,o,e.innerArgv,a,i,e.aliases,t))):this.applyMiddlewareAndGetResult(l,o,h.innerArgv,a,i,h.aliases,t)}applyBuilderUpdateUsageAndParse(e,t,n,s,i,r,o,a){const c=t.builder;let l=n;if($e(c)){n.getInternalMethods().getUsageInstance().freeze();const h=c(n.getInternalMethods().reset(s),a);if(pe(h))return h.then((s=>{var a;return l=(a=s)&&"function"==typeof a.getInternalMethods?s:n,this.parseAndUpdateUsage(e,t,l,i,r,o)}))}else(function(e){return"object"==typeof e})(c)&&(n.getInternalMethods().getUsageInstance().freeze(),l=n.getInternalMethods().reset(s),Object.keys(t.builder).forEach((e=>{l.option(e,c[e])})));return this.parseAndUpdateUsage(e,t,l,i,r,o)}parseAndUpdateUsage(e,t,n,s,i,r){e&&n.getInternalMethods().getUsageInstance().unfreeze(!0),this.shouldUpdateUsage(n)&&n.getInternalMethods().getUsageInstance().usage(this.usageFromParentCommandsCommandHandler(s,t),t.description);const o=n.getInternalMethods().runYargsParserAndExecuteCommands(null,void 0,!0,i,r);return pe(o)?o.then((e=>({aliases:n.parsed.aliases,innerArgv:e}))):{aliases:n.parsed.aliases,innerArgv:o}}shouldUpdateUsage(e){return!e.getInternalMethods().getUsageInstance().getUsageDisabled()&&0===e.getInternalMethods().getUsageInstance().getUsage().length}usageFromParentCommandsCommandHandler(e,t){const n=ke.test(t.original)?t.original.replace(ke,"").trim():t.original,s=e.filter((e=>!ke.test(e)));return s.push(n),`$0 ${s.join(" ")}`}handleValidationAndGetResult(e,t,n,s,i,r,o,a){if(!r.getInternalMethods().getHasOutput()){const t=r.getInternalMethods().runValidation(i,a,r.parsed.error,e);n=Ee(n,(e=>(t(e),e)))}if(t.handler&&!r.getInternalMethods().getHasOutput()){r.getInternalMethods().setHasOutput();const s=!!r.getOptions().configuration["populate--"];r.getInternalMethods().postProcess(n,s,!1,!1),n=Ee(n=Oe(n,r,o,!1),(e=>{const n=t.handler(e);return pe(n)?n.then((()=>e)):e})),e||r.getInternalMethods().getUsageInstance().cacheHelpMessage(),pe(n)&&!r.getInternalMethods().hasParseCallback()&&n.catch((e=>{try{r.getInternalMethods().getUsageInstance().fail(null,e)}catch(e){}}))}return e||(s.commands.pop(),s.fullCommands.pop()),n}applyMiddlewareAndGetResult(e,t,n,s,i,r,o){let a={};if(i)return n;o.getInternalMethods().getHasOutput()||(a=this.populatePositionals(t,n,s,o));const c=this.globalMiddleware.getMiddleware().slice(0).concat(t.middlewares),l=Oe(n,o,c,!0);return pe(l)?l.then((n=>this.handleValidationAndGetResult(e,t,n,s,r,o,c,a))):this.handleValidationAndGetResult(e,t,l,s,r,o,c,a)}populatePositionals(e,t,n,s){t._=t._.slice(n.commands.length);const i=e.demanded.slice(0),r=e.optional.slice(0),o={};for(this.validation.positionalCount(i.length,t._.length);i.length;){const e=i.shift();this.populatePositional(e,t,o)}for(;r.length;){const e=r.shift();this.populatePositional(e,t,o)}return t._=n.commands.concat(t._.map((e=>""+e))),this.postProcessPositionals(t,o,this.cmdToParseOptions(e.original),s),o}populatePositional(e,t,n){const s=e.cmd[0];e.variadic?n[s]=t._.splice(0).map(String):t._.length&&(n[s]=[String(t._.shift())])}cmdToParseOptions(e){const t={array:[],default:{},alias:{},demand:{}},n=ge(e);return n.demanded.forEach((e=>{const[n,...s]=e.cmd;e.variadic&&(t.array.push(n),t.default[n]=[]),t.alias[n]=s,t.demand[n]=!0})),n.optional.forEach((e=>{const[n,...s]=e.cmd;e.variadic&&(t.array.push(n),t.default[n]=[]),t.alias[n]=s})),t}postProcessPositionals(e,t,n,s){const i=Object.assign({},s.getOptions());i.default=Object.assign(n.default,i.default);for(const e of Object.keys(n.alias))i.alias[e]=(i.alias[e]||[]).concat(n.alias[e]);i.array=i.array.concat(n.array),i.config={};const r=[];if(Object.keys(t).forEach((e=>{t[e].map((t=>{i.configuration["unknown-options-as-args"]&&(i.key[e]=!0),r.push(`--${e}`),r.push(t)}))})),!r.length)return;const o=Object.assign({},i.configuration,{"populate--":!1}),a=this.shim.Parser.detailed(r,Object.assign({},i,{configuration:o}));if(a.error)s.getInternalMethods().getUsageInstance().fail(a.error.message,a.error);else{const n=Object.keys(t);Object.keys(t).forEach((e=>{n.push(...a.aliases[e])})),Object.keys(a.argv).forEach((i=>{n.includes(i)&&(t[i]||(t[i]=a.argv[i]),!this.isInConfigs(s,i)&&!this.isDefaulted(s,i)&&Object.prototype.hasOwnProperty.call(e,i)&&Object.prototype.hasOwnProperty.call(a.argv,i)&&(Array.isArray(e[i])||Array.isArray(a.argv[i]))?e[i]=[].concat(e[i],a.argv[i]):e[i]=a.argv[i])}))}}isDefaulted(e,t){const{default:n}=e.getOptions();return Object.prototype.hasOwnProperty.call(n,t)||Object.prototype.hasOwnProperty.call(n,this.shim.Parser.camelCase(t))}isInConfigs(e,t){const{configObjects:n}=e.getOptions();return n.some((e=>Object.prototype.hasOwnProperty.call(e,t)))||n.some((e=>Object.prototype.hasOwnProperty.call(e,this.shim.Parser.camelCase(t))))}runDefaultBuilderOn(e){if(!this.defaultCommand)return;if(this.shouldUpdateUsage(e)){const t=ke.test(this.defaultCommand.original)?this.defaultCommand.original:this.defaultCommand.original.replace(/^[^[\]<>]*/,"$0 ");e.getInternalMethods().getUsageInstance().usage(t,this.defaultCommand.description)}const t=this.defaultCommand.builder;if($e(t))return t(e,!0);je(t)||Object.keys(t).forEach((n=>{e.option(n,t[n])}))}moduleName(e){const t=function(e){if("undefined"==typeof require)return null;for(let t,n=0,s=Object.keys(require.cache);n<s.length;n++)if(t=require.cache[s[n]],t.exports===e)return t;return null}(e);if(!t)throw new Error(`No command name given for module: ${this.shim.inspect(e)}`);return this.commandFromFilename(t.filename)}commandFromFilename(e){return this.shim.path.basename(e,this.shim.path.extname(e))}extractDesc({describe:e,description:t,desc:n}){for(const s of[e,t,n]){if("string"==typeof s||!1===s)return s;de(s,!0,this.shim)}return!1}freeze(){this.frozens.push({handlers:this.handlers,aliasMap:this.aliasMap,defaultCommand:this.defaultCommand})}unfreeze(){const e=this.frozens.pop();de(e,void 0,this.shim),({handlers:this.handlers,aliasMap:this.aliasMap,defaultCommand:this.defaultCommand}=e)}reset(){return this.handlers={},this.aliasMap={},this.defaultCommand=void 0,this.requireCache=new Set,this}}function je(e){return"object"==typeof e&&!!e.builder&&"function"==typeof e.handler}function $e(e){return"function"==typeof e}function _e(e={},t=(()=>!0)){const n={};return fe(e).forEach((s=>{t(s,e[s])&&(n[s]=e[s])})),n}function xe(e){"undefined"!=typeof process&&[process.stdout,process.stderr].forEach((t=>{const n=t;n._handle&&n.isTTY&&"function"==typeof n._handle.setBlocking&&n._handle.setBlocking(e)}))}function Ce(e){return"boolean"==typeof e}function Se(e,t){const n=t.y18n.__,s={},i=[];s.failFn=function(e){i.push(e)};let r=null,o=null,a=!0;s.showHelpOnFail=function(t=!0,n){const[i,c]="string"==typeof t?[!0,t]:[t,n];return e.getInternalMethods().isGlobalContext()&&(o=c),r=c,a=i,s};let c=!1;s.fail=function(t,n){const l=e.getInternalMethods().getLoggerInstance();if(!i.length){if(e.getExitProcess()&&xe(!0),!c){c=!0,a&&(e.showHelp("error"),l.error()),(t||n)&&l.error(t||n);const s=r||o;s&&((t||n)&&l.error(""),l.error(s))}if(n=n||new se(t),e.getExitProcess())return e.exit(1);if(e.getInternalMethods().hasParseCallback())return e.exit(1,n);throw n}for(let e=i.length-1;e>=0;--e){const r=i[e];if(Ce(r)){if(n)throw n;if(t)throw Error(t)}else r(t,n,s)}};let l=[],h=!1;s.usage=(e,t)=>null===e?(h=!0,l=[],s):(h=!1,l.push([e,t||""]),s),s.getUsage=()=>l,s.getUsageDisabled=()=>h,s.getPositionalGroupName=()=>n("Positionals:");let d=[];s.example=(e,t)=>{d.push([e,t||""])};let u=[];s.command=function(e,t,n,s,i=!1){n&&(u=u.map((e=>(e[2]=!1,e)))),u.push([e,t||"",n,s,i])},s.getCommands=()=>u;let f={};s.describe=function(e,t){Array.isArray(e)?e.forEach((e=>{s.describe(e,t)})):"object"==typeof e?Object.keys(e).forEach((t=>{s.describe(t,e[t])})):f[e]=t},s.getDescriptions=()=>f;let p=[];s.epilog=e=>{p.push(e)};let g,m=!1;s.wrap=e=>{m=!0,g=e},s.getWrap=()=>t.getEnv("YARGS_DISABLE_WRAP")?null:(m||(g=function(){const e=80;return t.process.stdColumns?Math.min(e,t.process.stdColumns):e}(),m=!0),g);const y="__yargsString__:";function b(e,n,s){let i=0;return Array.isArray(e)||(e=Object.values(e).map((e=>[e]))),e.forEach((e=>{i=Math.max(t.stringWidth(s?`${s} ${Me(e[0])}`:Me(e[0]))+Ne(e[0]),i)})),n&&(i=Math.min(i,parseInt((.5*n).toString(),10))),i}let v;function w(t){return e.getOptions().hiddenOptions.indexOf(t)<0||e.parsed.argv[e.getOptions().showHiddenOpt]}function O(e,t){let s=`[${n("default:")} `;if(void 0===e&&!t)return null;if(t)s+=t;else switch(typeof e){case"string":s+=`"${e}"`;break;case"object":s+=JSON.stringify(e);break;default:s+=e}return`${s}]`}s.deferY18nLookup=e=>y+e,s.help=function(){if(v)return v;!function(){const t=e.getDemandedOptions(),n=e.getOptions();(Object.keys(n.alias)||[]).forEach((i=>{n.alias[i].forEach((r=>{f[r]&&s.describe(i,f[r]),r in t&&e.demandOption(i,t[r]),n.boolean.includes(r)&&e.boolean(i),n.count.includes(r)&&e.count(i),n.string.includes(r)&&e.string(i),n.normalize.includes(r)&&e.normalize(i),n.array.includes(r)&&e.array(i),n.number.includes(r)&&e.number(i)}))}))}();const i=e.customScriptName?e.$0:t.path.basename(e.$0),r=e.getDemandedOptions(),o=e.getDemandedCommands(),a=e.getDeprecatedOptions(),c=e.getGroups(),g=e.getOptions();let m=[];m=m.concat(Object.keys(f)),m=m.concat(Object.keys(r)),m=m.concat(Object.keys(o)),m=m.concat(Object.keys(g.default)),m=m.filter(w),m=Object.keys(m.reduce(((e,t)=>("_"!==t&&(e[t]=!0),e)),{}));const E=s.getWrap(),k=t.cliui({width:E,wrap:!!E});if(!h)if(l.length)l.forEach((e=>{k.div({text:`${e[0].replace(/\$0/g,i)}`}),e[1]&&k.div({text:`${e[1]}`,padding:[1,0,0,0]})})),k.div();else if(u.length){let e=null;e=o._?`${i} <${n("command")}>\n`:`${i} [${n("command")}]\n`,k.div(`${e}`)}if(u.length>1||1===u.length&&!u[0][2]){k.div(n("Commands:"));const t=e.getInternalMethods().getContext(),s=t.commands.length?`${t.commands.join(" ")} `:"";!0===e.getInternalMethods().getParserConfiguration()["sort-commands"]&&(u=u.sort(((e,t)=>e[0].localeCompare(t[0]))));const r=i?`${i} `:"";u.forEach((e=>{const t=`${r}${s}${e[0].replace(/^\$0 ?/,"")}`;k.span({text:t,padding:[0,2,0,2],width:b(u,E,`${i}${s}`)+4},{text:e[1]});const o=[];e[2]&&o.push(`[${n("default")}]`),e[3]&&e[3].length&&o.push(`[${n("aliases:")} ${e[3].join(", ")}]`),e[4]&&("string"==typeof e[4]?o.push(`[${n("deprecated: %s",e[4])}]`):o.push(`[${n("deprecated")}]`)),o.length?k.div({text:o.join(" "),padding:[0,0,0,2],align:"right"}):k.div()})),k.div()}const A=(Object.keys(g.alias)||[]).concat(Object.keys(e.parsed.newAliases)||[]);m=m.filter((t=>!e.parsed.newAliases[t]&&A.every((e=>-1===(g.alias[e]||[]).indexOf(t)))));const j=n("Options:");c[j]||(c[j]=[]),function(e,t,n,s){let i=[],r=null;Object.keys(n).forEach((e=>{i=i.concat(n[e])})),e.forEach((e=>{r=[e].concat(t[e]),r.some((e=>-1!==i.indexOf(e)))||n[s].push(e)}))}(m,g.alias,c,j);const $=e=>/^--/.test(Me(e)),_=Object.keys(c).filter((e=>c[e].length>0)).map((e=>({groupName:e,normalizedKeys:c[e].filter(w).map((e=>{if(A.includes(e))return e;for(let t,n=0;void 0!==(t=A[n]);n++)if((g.alias[t]||[]).includes(e))return t;return e}))}))).filter((({normalizedKeys:e})=>e.length>0)).map((({groupName:e,normalizedKeys:t})=>{const n=t.reduce(((t,n)=>(t[n]=[n].concat(g.alias[n]||[]).map((t=>e===s.getPositionalGroupName()?t:(/^[0-9]$/.test(t)?g.boolean.includes(n)?"-":"--":t.length>1?"--":"-")+t)).sort(((e,t)=>$(e)===$(t)?0:$(e)?1:-1)).join(", "),t)),{});return{groupName:e,normalizedKeys:t,switches:n}}));if(_.filter((({groupName:e})=>e!==s.getPositionalGroupName())).some((({normalizedKeys:e,switches:t})=>!e.every((e=>$(t[e])))))&&_.filter((({groupName:e})=>e!==s.getPositionalGroupName())).forEach((({normalizedKeys:e,switches:t})=>{e.forEach((e=>{var n,s;$(t[e])&&(t[e]=(n=t[e],s=4,Pe(n)?{text:n.text,indentation:n.indentation+s}:{text:n,indentation:s}))}))})),_.forEach((({groupName:t,normalizedKeys:i,switches:o})=>{k.div(t),i.forEach((t=>{const i=o[t];let c=f[t]||"",l=null;c.includes(y)&&(c=n(c.substring(16))),g.boolean.includes(t)&&(l=`[${n("boolean")}]`),g.count.includes(t)&&(l=`[${n("count")}]`),g.string.includes(t)&&(l=`[${n("string")}]`),g.normalize.includes(t)&&(l=`[${n("string")}]`),g.array.includes(t)&&(l=`[${n("array")}]`),g.number.includes(t)&&(l=`[${n("number")}]`);const h=[t in a?(d=a[t],"string"==typeof d?`[${n("deprecated: %s",d)}]`:`[${n("deprecated")}]`):null,l,t in r?`[${n("required")}]`:null,g.choices&&g.choices[t]?`[${n("choices:")} ${s.stringifiedValues(g.choices[t])}]`:null,O(g.default[t],g.defaultDescription[t])].filter(Boolean).join(" ");var d;k.span({text:Me(i),padding:[0,2,0,2+Ne(i)],width:b(o,E)+4},c);const u=!0===e.getInternalMethods().getUsageConfiguration()["hide-types"];h&&!u?k.div({text:h,padding:[0,0,0,2],align:"right"}):k.div()})),k.div()})),d.length&&(k.div(n("Examples:")),d.forEach((e=>{e[0]=e[0].replace(/\$0/g,i)})),d.forEach((e=>{""===e[1]?k.div({text:e[0],padding:[0,2,0,2]}):k.div({text:e[0],padding:[0,2,0,2],width:b(d,E)+4},{text:e[1]})})),k.div()),p.length>0){const e=p.map((e=>e.replace(/\$0/g,i))).join("\n");k.div(`${e}\n`)}return k.toString().replace(/\s*$/,"")},s.cacheHelpMessage=function(){v=this.help()},s.clearCachedHelpMessage=function(){v=void 0},s.hasCachedHelpMessage=function(){return!!v},s.showHelp=t=>{const n=e.getInternalMethods().getLoggerInstance();t||(t="error");("function"==typeof t?t:n[t])(s.help())},s.functionDescription=e=>["(",e.name?t.Parser.decamelize(e.name,"-"):n("generated-value"),")"].join(""),s.stringifiedValues=function(e,t){let n="";const s=t||", ",i=[].concat(e);return e&&i.length?(i.forEach((e=>{n.length&&(n+=s),n+=JSON.stringify(e)})),n):n};let E=null;s.version=e=>{E=e},s.showVersion=t=>{const n=e.getInternalMethods().getLoggerInstance();t||(t="error");("function"==typeof t?t:n[t])(E)},s.reset=function(e){return r=null,c=!1,l=[],h=!1,p=[],d=[],u=[],f=_e(f,(t=>!e[t])),s};const k=[];return s.freeze=function(){k.push({failMessage:r,failureOutput:c,usages:l,usageDisabled:h,epilogs:p,examples:d,commands:u,descriptions:f})},s.unfreeze=function(e=!1){const t=k.pop();t&&(e?(f={...t.descriptions,...f},u=[...t.commands,...u],l=[...t.usages,...l],d=[...t.examples,...d],p=[...t.epilogs,...p]):({failMessage:r,failureOutput:c,usages:l,usageDisabled:h,epilogs:p,examples:d,commands:u,descriptions:f}=t))},s}function Pe(e){return"object"==typeof e}function Ne(e){return Pe(e)?e.indentation:0}function Me(e){return Pe(e)?e.text:e}class De{constructor(e,t,n,s){var i,r,o;this.yargs=e,this.usage=t,this.command=n,this.shim=s,this.completionKey="get-yargs-completions",this.aliases=null,this.customCompletionFunction=null,this.indexAfterLastReset=0,this.zshShell=null!==(o=(null===(i=this.shim.getEnv("SHELL"))||void 0===i?void 0:i.includes("zsh"))||(null===(r=this.shim.getEnv("ZSH_NAME"))||void 0===r?void 0:r.includes("zsh")))&&void 0!==o&&o}defaultCompletion(e,t,n,s){const i=this.command.getCommandHandlers();for(let t=0,n=e.length;t<n;++t)if(i[e[t]]&&i[e[t]].builder){const n=i[e[t]].builder;if($e(n)){this.indexAfterLastReset=t+1;const e=this.yargs.getInternalMethods().reset();return n(e,!0),e.argv}}const r=[];this.commandCompletions(r,e,n),this.optionCompletions(r,e,t,n),this.choicesFromOptionsCompletions(r,e,t,n),this.choicesFromPositionalsCompletions(r,e,t,n),s(null,r)}commandCompletions(e,t,n){const s=this.yargs.getInternalMethods().getContext().commands;n.match(/^-/)||s[s.length-1]===n||this.previousArgHasChoices(t)||this.usage.getCommands().forEach((n=>{const s=ge(n[0]).cmd;if(-1===t.indexOf(s))if(this.zshShell){const t=n[1]||"";e.push(s.replace(/:/g,"\\:")+":"+t)}else e.push(s)}))}optionCompletions(e,t,n,s){if((s.match(/^-/)||""===s&&0===e.length)&&!this.previousArgHasChoices(t)){const n=this.yargs.getOptions(),i=this.yargs.getGroups()[this.usage.getPositionalGroupName()]||[];Object.keys(n.key).forEach((r=>{const o=!!n.configuration["boolean-negation"]&&n.boolean.includes(r);i.includes(r)||n.hiddenOptions.includes(r)||this.argsContainKey(t,r,o)||this.completeOptionKey(r,e,s,o&&!!n.default[r])}))}}choicesFromOptionsCompletions(e,t,n,s){if(this.previousArgHasChoices(t)){const n=this.getPreviousArgChoices(t);n&&n.length>0&&e.push(...n.map((e=>e.replace(/:/g,"\\:"))))}}choicesFromPositionalsCompletions(e,t,n,s){if(""===s&&e.length>0&&this.previousArgHasChoices(t))return;const i=this.yargs.getGroups()[this.usage.getPositionalGroupName()]||[],r=Math.max(this.indexAfterLastReset,this.yargs.getInternalMethods().getContext().commands.length+1),o=i[n._.length-r-1];if(!o)return;const a=this.yargs.getOptions().choices[o]||[];for(const t of a)t.startsWith(s)&&e.push(t.replace(/:/g,"\\:"))}getPreviousArgChoices(e){if(e.length<1)return;let t=e[e.length-1],n="";if(!t.startsWith("-")&&e.length>1&&(n=t,t=e[e.length-2]),!t.startsWith("-"))return;const s=t.replace(/^-+/,""),i=this.yargs.getOptions(),r=[s,...this.yargs.getAliases()[s]||[]];let o;for(const e of r)if(Object.prototype.hasOwnProperty.call(i.key,e)&&Array.isArray(i.choices[e])){o=i.choices[e];break}return o?o.filter((e=>!n||e.startsWith(n))):void 0}previousArgHasChoices(e){const t=this.getPreviousArgChoices(e);return void 0!==t&&t.length>0}argsContainKey(e,t,n){const s=t=>-1!==e.indexOf((/^[^0-9]$/.test(t)?"-":"--")+t);if(s(t))return!0;if(n&&s(`no-${t}`))return!0;if(this.aliases)for(const e of this.aliases[t])if(s(e))return!0;return!1}completeOptionKey(e,t,n,s){var i,r,o,a;let c=e;if(this.zshShell){const t=this.usage.getDescriptions(),n=null===(r=null===(i=null==this?void 0:this.aliases)||void 0===i?void 0:i[e])||void 0===r?void 0:r.find((e=>{const n=t[e];return"string"==typeof n&&n.length>0})),s=n?t[n]:void 0,l=null!==(a=null!==(o=t[e])&&void 0!==o?o:s)&&void 0!==a?a:"";c=`${e.replace(/:/g,"\\:")}:${l.replace("__yargsString__:","").replace(/(\r\n|\n|\r)/gm," ")}`}const l=!(e=>/^--/.test(e))(n)&&(e=>/^[^0-9]$/.test(e))(e)?"-":"--";t.push(l+c),s&&t.push(l+"no-"+c)}customCompletion(e,t,n,s){if(de(this.customCompletionFunction,null,this.shim),this.customCompletionFunction.length<3){const e=this.customCompletionFunction(n,t);return pe(e)?e.then((e=>{this.shim.process.nextTick((()=>{s(null,e)}))})).catch((e=>{this.shim.process.nextTick((()=>{s(e,void 0)}))})):s(null,e)}return function(e){return e.length>3}(this.customCompletionFunction)?this.customCompletionFunction(n,t,((i=s)=>this.defaultCompletion(e,t,n,i)),(e=>{s(null,e)})):this.customCompletionFunction(n,t,(e=>{s(null,e)}))}getCompletion(e,t){const n=e.length?e[e.length-1]:"",s=this.yargs.parse(e,!0),i=this.customCompletionFunction?s=>this.customCompletion(e,s,n,t):s=>this.defaultCompletion(e,s,n,t);return pe(s)?s.then(i):i(s)}generateCompletionScript(e,t){let n=this.zshShell?'#compdef {{app_name}}\n###-begin-{{app_name}}-completions-###\n#\n# yargs command completion script\n#\n# Installation: {{app_path}} {{completion_command}} >> ~/.zshrc\n# or {{app_path}} {{completion_command}} >> ~/.zprofile on OSX.\n#\n_{{app_name}}_yargs_completions()\n{\n local reply\n local si=$IFS\n IFS=$\'\n\' reply=($(COMP_CWORD="$((CURRENT-1))" COMP_LINE="$BUFFER" COMP_POINT="$CURSOR" {{app_path}} --get-yargs-completions "${words[@]}"))\n IFS=$si\n _describe \'values\' reply\n}\ncompdef _{{app_name}}_yargs_completions {{app_name}}\n###-end-{{app_name}}-completions-###\n':'###-begin-{{app_name}}-completions-###\n#\n# yargs command completion script\n#\n# Installation: {{app_path}} {{completion_command}} >> ~/.bashrc\n# or {{app_path}} {{completion_command}} >> ~/.bash_profile on OSX.\n#\n_{{app_name}}_yargs_completions()\n{\n local cur_word args type_list\n\n cur_word="${COMP_WORDS[COMP_CWORD]}"\n args=("${COMP_WORDS[@]}")\n\n # ask yargs to generate completions.\n type_list=$({{app_path}} --get-yargs-completions "${args[@]}")\n\n COMPREPLY=( $(compgen -W "${type_list}" -- ${cur_word}) )\n\n # if no match was found, fall back to filename completion\n if [ ${#COMPREPLY[@]} -eq 0 ]; then\n COMPREPLY=()\n fi\n\n return 0\n}\ncomplete -o bashdefault -o default -F _{{app_name}}_yargs_completions {{app_name}}\n###-end-{{app_name}}-completions-###\n';const s=this.shim.path.basename(e);return e.match(/\.js$/)&&(e=`./${e}`),n=n.replace(/{{app_name}}/g,s),n=n.replace(/{{completion_command}}/g,t),n.replace(/{{app_path}}/g,e)}registerFunction(e){this.customCompletionFunction=e}setParsed(e){this.aliases=e.aliases}}function Ie(e,t){if(0===e.length)return t.length;if(0===t.length)return e.length;const n=[];let s,i;for(s=0;s<=t.length;s++)n[s]=[s];for(i=0;i<=e.length;i++)n[0][i]=i;for(s=1;s<=t.length;s++)for(i=1;i<=e.length;i++)t.charAt(s-1)===e.charAt(i-1)?n[s][i]=n[s-1][i-1]:s>1&&i>1&&t.charAt(s-2)===e.charAt(i-1)&&t.charAt(s-1)===e.charAt(i-2)?n[s][i]=n[s-2][i-2]+1:n[s][i]=Math.min(n[s-1][i-1]+1,Math.min(n[s][i-1]+1,n[s-1][i]+1));return n[t.length][e.length]}const Re=["$0","--","_"];let We,ze=[];function Te(e,t,n,s){We=s;let i={};if(Object.prototype.hasOwnProperty.call(e,"extends")){if("string"!=typeof e.extends)return i;const s=/\.json|\..*rc$/.test(e.extends);let r=null;if(s)r=function(e,t){return We.path.resolve(e,t)}(t,e.extends);else try{r=require.resolve(e.extends)}catch(t){return e}!function(e){if(ze.indexOf(e)>-1)throw new se(`Circular extended configurations: '${e}'.`)}(r),ze.push(r),i=s?JSON.parse(We.readFileSync(r,"utf8")):require(e.extends),delete e.extends,i=Te(i,We.path.dirname(r),n,We)}return ze=[],n?Fe(i,e):Object.assign({},i,e)}function Fe(e,t){const n={};function s(e){return e&&"object"==typeof e&&!Array.isArray(e)}Object.assign(n,e);for(const i of Object.keys(t))s(t[i])&&s(n[i])?n[i]=Fe(e[i],t[i]):n[i]=t[i];return n}var Be,Le,Ve,Ue,He,Ye,qe,Je,Ge,Ke,Qe,Xe,Ze,et,tt,nt,st,it,rt,ot,at,ct,lt,ht,dt,ut,ft,pt,gt,mt,yt,bt,vt,wt,Ot,Et=function(e,t,n,s,i){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!i)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!i:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?i.call(e,n):i?i.value=n:t.set(e,n),n},kt=function(e,t,n,s){if("a"===n&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===n?s:"a"===n?s.call(e):s?s.value:t.get(e)};const At=Symbol("copyDoubleDash"),jt=Symbol("copyDoubleDash"),$t=Symbol("deleteFromParserHintObject"),_t=Symbol("emitWarning"),xt=Symbol("freeze"),Ct=Symbol("getDollarZero"),St=Symbol("getParserConfiguration"),Pt=Symbol("getUsageConfiguration"),Nt=Symbol("guessLocale"),Mt=Symbol("guessVersion"),Dt=Symbol("parsePositionalNumbers"),It=Symbol("pkgUp"),Rt=Symbol("populateParserHintArray"),Wt=Symbol("populateParserHintSingleValueDictionary"),zt=Symbol("populateParserHintArrayDictionary"),Tt=Symbol("populateParserHintDictionary"),Ft=Symbol("sanitizeKey"),Bt=Symbol("setKey"),Lt=Symbol("unfreeze"),Vt=Symbol("validateAsync"),Ut=Symbol("getCommandInstance"),Ht=Symbol("getContext"),Yt=Symbol("getHasOutput"),qt=Symbol("getLoggerInstance"),Jt=Symbol("getParseContext"),Gt=Symbol("getUsageInstance"),Kt=Symbol("getValidationInstance"),Qt=Symbol("hasParseCallback"),Xt=Symbol("isGlobalContext"),Zt=Symbol("postProcess"),en=Symbol("rebase"),tn=Symbol("reset"),nn=Symbol("runYargsParserAndExecuteCommands"),sn=Symbol("runValidation"),rn=Symbol("setHasOutput"),on=Symbol("kTrackManuallySetKeys");class an{constructor(e=[],t,n,s){this.customScriptName=!1,this.parsed=!1,Be.set(this,void 0),Le.set(this,void 0),Ve.set(this,{commands:[],fullCommands:[]}),Ue.set(this,null),He.set(this,null),Ye.set(this,"show-hidden"),qe.set(this,null),Je.set(this,!0),Ge.set(this,{}),Ke.set(this,!0),Qe.set(this,[]),Xe.set(this,void 0),Ze.set(this,{}),et.set(this,!1),tt.set(this,null),nt.set(this,!0),st.set(this,void 0),it.set(this,""),rt.set(this,void 0),ot.set(this,void 0),at.set(this,{}),ct.set(this,null),lt.set(this,null),ht.set(this,{}),dt.set(this,{}),ut.set(this,void 0),ft.set(this,!1),pt.set(this,void 0),gt.set(this,!1),mt.set(this,!1),yt.set(this,!1),bt.set(this,void 0),vt.set(this,{}),wt.set(this,null),Ot.set(this,void 0),Et(this,pt,s,"f"),Et(this,ut,e,"f"),Et(this,Le,t,"f"),Et(this,ot,n,"f"),Et(this,Xe,new we(this),"f"),this.$0=this[Ct](),this[tn](),Et(this,Be,kt(this,Be,"f"),"f"),Et(this,bt,kt(this,bt,"f"),"f"),Et(this,Ot,kt(this,Ot,"f"),"f"),Et(this,rt,kt(this,rt,"f"),"f"),kt(this,rt,"f").showHiddenOpt=kt(this,Ye,"f"),Et(this,st,this[jt](),"f")}addHelpOpt(e,t){return ye("[string|boolean] [string]",[e,t],arguments.length),kt(this,tt,"f")&&(this[$t](kt(this,tt,"f")),Et(this,tt,null,"f")),!1===e&&void 0===t||(Et(this,tt,"string"==typeof e?e:"help","f"),this.boolean(kt(this,tt,"f")),this.describe(kt(this,tt,"f"),t||kt(this,bt,"f").deferY18nLookup("Show help"))),this}help(e,t){return this.addHelpOpt(e,t)}addShowHiddenOpt(e,t){if(ye("[string|boolean] [string]",[e,t],arguments.length),!1===e&&void 0===t)return this;const n="string"==typeof e?e:kt(this,Ye,"f");return this.boolean(n),this.describe(n,t||kt(this,bt,"f").deferY18nLookup("Show hidden options")),kt(this,rt,"f").showHiddenOpt=n,this}showHidden(e,t){return this.addShowHiddenOpt(e,t)}alias(e,t){return ye("<object|string|array> [string|array]",[e,t],arguments.length),this[zt](this.alias.bind(this),"alias",e,t),this}array(e){return ye("<array|string>",[e],arguments.length),this[Rt]("array",e),this[on](e),this}boolean(e){return ye("<array|string>",[e],arguments.length),this[Rt]("boolean",e),this[on](e),this}check(e,t){return ye("<function> [boolean]",[e,t],arguments.length),this.middleware(((t,n)=>Ee((()=>e(t,n.getOptions())),(n=>(n?("string"==typeof n||n instanceof Error)&&kt(this,bt,"f").fail(n.toString(),n):kt(this,bt,"f").fail(kt(this,pt,"f").y18n.__("Argument check failed: %s",e.toString())),t)),(e=>(kt(this,bt,"f").fail(e.message?e.message:e.toString(),e),t)))),!1,t),this}choices(e,t){return ye("<object|string|array> [string|array]",[e,t],arguments.length),this[zt](this.choices.bind(this),"choices",e,t),this}coerce(e,t){if(ye("<object|string|array> [function]",[e,t],arguments.length),Array.isArray(e)){if(!t)throw new se("coerce callback must be provided");for(const n of e)this.coerce(n,t);return this}if("object"==typeof e){for(const t of Object.keys(e))this.coerce(t,e[t]);return this}if(!t)throw new se("coerce callback must be provided");return kt(this,rt,"f").key[e]=!0,kt(this,Xe,"f").addCoerceMiddleware(((n,s)=>{let i;return Object.prototype.hasOwnProperty.call(n,e)?Ee((()=>(i=s.getAliases(),t(n[e]))),(t=>{n[e]=t;const r=s.getInternalMethods().getParserConfiguration()["strip-aliased"];if(i[e]&&!0!==r)for(const s of i[e])n[s]=t;return n}),(e=>{throw new se(e.message)})):n}),e),this}conflicts(e,t){return ye("<string|object> [string|array]",[e,t],arguments.length),kt(this,Ot,"f").conflicts(e,t),this}config(e="config",t,n){return ye("[object|string] [string|function] [function]",[e,t,n],arguments.length),"object"!=typeof e||Array.isArray(e)?("function"==typeof t&&(n=t,t=void 0),this.describe(e,t||kt(this,bt,"f").deferY18nLookup("Path to JSON config file")),(Array.isArray(e)?e:[e]).forEach((e=>{kt(this,rt,"f").config[e]=n||!0})),this):(e=Te(e,kt(this,Le,"f"),this[St]()["deep-merge-config"]||!1,kt(this,pt,"f")),kt(this,rt,"f").configObjects=(kt(this,rt,"f").configObjects||[]).concat(e),this)}completion(e,t,n){return ye("[string] [string|boolean|function] [function]",[e,t,n],arguments.length),"function"==typeof t&&(n=t,t=void 0),Et(this,He,e||kt(this,He,"f")||"completion","f"),t||!1===t||(t="generate completion script"),this.command(kt(this,He,"f"),t),n&&kt(this,Ue,"f").registerFunction(n),this}command(e,t,n,s,i,r){return ye("<string|array|object> [string|boolean] [function|object] [function] [array] [boolean|string]",[e,t,n,s,i,r],arguments.length),kt(this,Be,"f").addHandler(e,t,n,s,i,r),this}commands(e,t,n,s,i,r){return this.command(e,t,n,s,i,r)}commandDir(e,t){ye("<string> [object]",[e,t],arguments.length);const n=kt(this,ot,"f")||kt(this,pt,"f").require;return kt(this,Be,"f").addDirectory(e,n,kt(this,pt,"f").getCallerFile(),t),this}count(e){return ye("<array|string>",[e],arguments.length),this[Rt]("count",e),this[on](e),this}default(e,t,n){return ye("<object|string|array> [*] [string]",[e,t,n],arguments.length),n&&(ue(e,kt(this,pt,"f")),kt(this,rt,"f").defaultDescription[e]=n),"function"==typeof t&&(ue(e,kt(this,pt,"f")),kt(this,rt,"f").defaultDescription[e]||(kt(this,rt,"f").defaultDescription[e]=kt(this,bt,"f").functionDescription(t)),t=t.call()),this[Wt](this.default.bind(this),"default",e,t),this}defaults(e,t,n){return this.default(e,t,n)}demandCommand(e=1,t,n,s){return ye("[number] [number|string] [string|null|undefined] [string|null|undefined]",[e,t,n,s],arguments.length),"number"!=typeof t&&(n=t,t=1/0),this.global("_",!1),kt(this,rt,"f").demandedCommands._={min:e,max:t,minMsg:n,maxMsg:s},this}demand(e,t,n){return Array.isArray(t)?(t.forEach((e=>{de(n,!0,kt(this,pt,"f")),this.demandOption(e,n)})),t=1/0):"number"!=typeof t&&(n=t,t=1/0),"number"==typeof e?(de(n,!0,kt(this,pt,"f")),this.demandCommand(e,t,n,n)):Array.isArray(e)?e.forEach((e=>{de(n,!0,kt(this,pt,"f")),this.demandOption(e,n)})):"string"==typeof n?this.demandOption(e,n):!0!==n&&void 0!==n||this.demandOption(e),this}demandOption(e,t){return ye("<object|string|array> [string]",[e,t],arguments.length),this[Wt](this.demandOption.bind(this),"demandedOptions",e,t),this}deprecateOption(e,t){return ye("<string> [string|boolean]",[e,t],arguments.length),kt(this,rt,"f").deprecatedOptions[e]=t,this}describe(e,t){return ye("<object|string|array> [string]",[e,t],arguments.length),this[Bt](e,!0),kt(this,bt,"f").describe(e,t),this}detectLocale(e){return ye("<boolean>",[e],arguments.length),Et(this,Je,e,"f"),this}env(e){return ye("[string|boolean]",[e],arguments.length),!1===e?delete kt(this,rt,"f").envPrefix:kt(this,rt,"f").envPrefix=e||"",this}epilogue(e){return ye("<string>",[e],arguments.length),kt(this,bt,"f").epilog(e),this}epilog(e){return this.epilogue(e)}example(e,t){return ye("<string|array> [string]",[e,t],arguments.length),Array.isArray(e)?e.forEach((e=>this.example(...e))):kt(this,bt,"f").example(e,t),this}exit(e,t){Et(this,et,!0,"f"),Et(this,qe,t,"f"),kt(this,Ke,"f")&&kt(this,pt,"f").process.exit(e)}exitProcess(e=!0){return ye("[boolean]",[e],arguments.length),Et(this,Ke,e,"f"),this}fail(e){if(ye("<function|boolean>",[e],arguments.length),"boolean"==typeof e&&!1!==e)throw new se("Invalid first argument. Expected function or boolean 'false'");return kt(this,bt,"f").failFn(e),this}getAliases(){return this.parsed?this.parsed.aliases:{}}async getCompletion(e,t){return ye("<array> [function]",[e,t],arguments.length),t?kt(this,Ue,"f").getCompletion(e,t):new Promise(((t,n)=>{kt(this,Ue,"f").getCompletion(e,((e,s)=>{e?n(e):t(s)}))}))}getDemandedOptions(){return ye([],0),kt(this,rt,"f").demandedOptions}getDemandedCommands(){return ye([],0),kt(this,rt,"f").demandedCommands}getDeprecatedOptions(){return ye([],0),kt(this,rt,"f").deprecatedOptions}getDetectLocale(){return kt(this,Je,"f")}getExitProcess(){return kt(this,Ke,"f")}getGroups(){return Object.assign({},kt(this,Ze,"f"),kt(this,dt,"f"))}getHelp(){if(Et(this,et,!0,"f"),!kt(this,bt,"f").hasCachedHelpMessage()){if(!this.parsed){const e=this[nn](kt(this,ut,"f"),void 0,void 0,0,!0);if(pe(e))return e.then((()=>kt(this,bt,"f").help()))}const e=kt(this,Be,"f").runDefaultBuilderOn(this);if(pe(e))return e.then((()=>kt(this,bt,"f").help()))}return Promise.resolve(kt(this,bt,"f").help())}getOptions(){return kt(this,rt,"f")}getStrict(){return kt(this,gt,"f")}getStrictCommands(){return kt(this,mt,"f")}getStrictOptions(){return kt(this,yt,"f")}global(e,t){return ye("<string|array> [boolean]",[e,t],arguments.length),e=[].concat(e),!1!==t?kt(this,rt,"f").local=kt(this,rt,"f").local.filter((t=>-1===e.indexOf(t))):e.forEach((e=>{kt(this,rt,"f").local.includes(e)||kt(this,rt,"f").local.push(e)})),this}group(e,t){ye("<string|array> <string>",[e,t],arguments.length);const n=kt(this,dt,"f")[t]||kt(this,Ze,"f")[t];kt(this,dt,"f")[t]&&delete kt(this,dt,"f")[t];const s={};return kt(this,Ze,"f")[t]=(n||[]).concat(e).filter((e=>!s[e]&&(s[e]=!0))),this}hide(e){return ye("<string>",[e],arguments.length),kt(this,rt,"f").hiddenOptions.push(e),this}implies(e,t){return ye("<string|object> [number|string|array]",[e,t],arguments.length),kt(this,Ot,"f").implies(e,t),this}locale(e){return ye("[string]",[e],arguments.length),void 0===e?(this[Nt](),kt(this,pt,"f").y18n.getLocale()):(Et(this,Je,!1,"f"),kt(this,pt,"f").y18n.setLocale(e),this)}middleware(e,t,n){return kt(this,Xe,"f").addMiddleware(e,!!t,n)}nargs(e,t){return ye("<string|object|array> [number]",[e,t],arguments.length),this[Wt](this.nargs.bind(this),"narg",e,t),this}normalize(e){return ye("<array|string>",[e],arguments.length),this[Rt]("normalize",e),this}number(e){return ye("<array|string>",[e],arguments.length),this[Rt]("number",e),this[on](e),this}option(e,t){if(ye("<string|object> [object]",[e,t],arguments.length),"object"==typeof e)Object.keys(e).forEach((t=>{this.options(t,e[t])}));else{"object"!=typeof t&&(t={}),this[on](e),!kt(this,wt,"f")||"version"!==e&&"version"!==(null==t?void 0:t.alias)||this[_t](['"version" is a reserved word.',"Please do one of the following:",'- Disable version with `yargs.version(false)` if using "version" as an option',"- Use the built-in `yargs.version` method instead (if applicable)","- Use a different option key","https://yargs.js.org/docs/#api-reference-version"].join("\n"),void 0,"versionWarning"),kt(this,rt,"f").key[e]=!0,t.alias&&this.alias(e,t.alias);const n=t.deprecate||t.deprecated;n&&this.deprecateOption(e,n);const s=t.demand||t.required||t.require;s&&this.demand(e,s),t.demandOption&&this.demandOption(e,"string"==typeof t.demandOption?t.demandOption:void 0),t.conflicts&&this.conflicts(e,t.conflicts),"default"in t&&this.default(e,t.default),void 0!==t.implies&&this.implies(e,t.implies),void 0!==t.nargs&&this.nargs(e,t.nargs),t.config&&this.config(e,t.configParser),t.normalize&&this.normalize(e),t.choices&&this.choices(e,t.choices),t.coerce&&this.coerce(e,t.coerce),t.group&&this.group(e,t.group),(t.boolean||"boolean"===t.type)&&(this.boolean(e),t.alias&&this.boolean(t.alias)),(t.array||"array"===t.type)&&(this.array(e),t.alias&&this.array(t.alias)),(t.number||"number"===t.type)&&(this.number(e),t.alias&&this.number(t.alias)),(t.string||"string"===t.type)&&(this.string(e),t.alias&&this.string(t.alias)),(t.count||"count"===t.type)&&this.count(e),"boolean"==typeof t.global&&this.global(e,t.global),t.defaultDescription&&(kt(this,rt,"f").defaultDescription[e]=t.defaultDescription),t.skipValidation&&this.skipValidation(e);const i=t.describe||t.description||t.desc,r=kt(this,bt,"f").getDescriptions();Object.prototype.hasOwnProperty.call(r,e)&&"string"!=typeof i||this.describe(e,i),t.hidden&&this.hide(e),t.requiresArg&&this.requiresArg(e)}return this}options(e,t){return this.option(e,t)}parse(e,t,n){ye("[string|array] [function|boolean|object] [function]",[e,t,n],arguments.length),this[xt](),void 0===e&&(e=kt(this,ut,"f")),"object"==typeof t&&(Et(this,lt,t,"f"),t=n),"function"==typeof t&&(Et(this,ct,t,"f"),t=!1),t||Et(this,ut,e,"f"),kt(this,ct,"f")&&Et(this,Ke,!1,"f");const s=this[nn](e,!!t),i=this.parsed;return kt(this,Ue,"f").setParsed(this.parsed),pe(s)?s.then((e=>(kt(this,ct,"f")&&kt(this,ct,"f").call(this,kt(this,qe,"f"),e,kt(this,it,"f")),e))).catch((e=>{throw kt(this,ct,"f")&&kt(this,ct,"f")(e,this.parsed.argv,kt(this,it,"f")),e})).finally((()=>{this[Lt](),this.parsed=i})):(kt(this,ct,"f")&&kt(this,ct,"f").call(this,kt(this,qe,"f"),s,kt(this,it,"f")),this[Lt](),this.parsed=i,s)}parseAsync(e,t,n){const s=this.parse(e,t,n);return pe(s)?s:Promise.resolve(s)}parseSync(e,t,n){const s=this.parse(e,t,n);if(pe(s))throw new se(".parseSync() must not be used with asynchronous builders, handlers, or middleware");return s}parserConfiguration(e){return ye("<object>",[e],arguments.length),Et(this,at,e,"f"),this}pkgConf(e,t){ye("<string> [string]",[e,t],arguments.length);let n=null;const s=this[It](t||kt(this,Le,"f"));return s[e]&&"object"==typeof s[e]&&(n=Te(s[e],t||kt(this,Le,"f"),this[St]()["deep-merge-config"]||!1,kt(this,pt,"f")),kt(this,rt,"f").configObjects=(kt(this,rt,"f").configObjects||[]).concat(n)),this}positional(e,t){ye("<string> <object>",[e,t],arguments.length);const n=["default","defaultDescription","implies","normalize","choices","conflicts","coerce","type","describe","desc","description","alias"];t=_e(t,((e,t)=>!("type"===e&&!["string","number","boolean"].includes(t))&&n.includes(e)));const s=kt(this,Ve,"f").fullCommands[kt(this,Ve,"f").fullCommands.length-1],i=s?kt(this,Be,"f").cmdToParseOptions(s):{array:[],alias:{},default:{},demand:{}};return fe(i).forEach((n=>{const s=i[n];Array.isArray(s)?-1!==s.indexOf(e)&&(t[n]=!0):s[e]&&!(n in t)&&(t[n]=s[e])})),this.group(e,kt(this,bt,"f").getPositionalGroupName()),this.option(e,t)}recommendCommands(e=!0){return ye("[boolean]",[e],arguments.length),Et(this,ft,e,"f"),this}required(e,t,n){return this.demand(e,t,n)}require(e,t,n){return this.demand(e,t,n)}requiresArg(e){return ye("<array|string|object> [number]",[e],arguments.length),"string"==typeof e&&kt(this,rt,"f").narg[e]||this[Wt](this.requiresArg.bind(this),"narg",e,NaN),this}showCompletionScript(e,t){return ye("[string] [string]",[e,t],arguments.length),e=e||this.$0,kt(this,st,"f").log(kt(this,Ue,"f").generateCompletionScript(e,t||kt(this,He,"f")||"completion")),this}showHelp(e){if(ye("[string|function]",[e],arguments.length),Et(this,et,!0,"f"),!kt(this,bt,"f").hasCachedHelpMessage()){if(!this.parsed){const t=this[nn](kt(this,ut,"f"),void 0,void 0,0,!0);if(pe(t))return t.then((()=>{kt(this,bt,"f").showHelp(e)})),this}const t=kt(this,Be,"f").runDefaultBuilderOn(this);if(pe(t))return t.then((()=>{kt(this,bt,"f").showHelp(e)})),this}return kt(this,bt,"f").showHelp(e),this}scriptName(e){return this.customScriptName=!0,this.$0=e,this}showHelpOnFail(e,t){return ye("[boolean|string] [string]",[e,t],arguments.length),kt(this,bt,"f").showHelpOnFail(e,t),this}showVersion(e){return ye("[string|function]",[e],arguments.length),kt(this,bt,"f").showVersion(e),this}skipValidation(e){return ye("<array|string>",[e],arguments.length),this[Rt]("skipValidation",e),this}strict(e){return ye("[boolean]",[e],arguments.length),Et(this,gt,!1!==e,"f"),this}strictCommands(e){return ye("[boolean]",[e],arguments.length),Et(this,mt,!1!==e,"f"),this}strictOptions(e){return ye("[boolean]",[e],arguments.length),Et(this,yt,!1!==e,"f"),this}string(e){return ye("<array|string>",[e],arguments.length),this[Rt]("string",e),this[on](e),this}terminalWidth(){return ye([],0),kt(this,pt,"f").process.stdColumns}updateLocale(e){return this.updateStrings(e)}updateStrings(e){return ye("<object>",[e],arguments.length),Et(this,Je,!1,"f"),kt(this,pt,"f").y18n.updateLocale(e),this}usage(e,t,n,s){if(ye("<string|null|undefined> [string|boolean] [function|object] [function]",[e,t,n,s],arguments.length),void 0!==t){if(de(e,null,kt(this,pt,"f")),(e||"").match(/^\$0( |$)/))return this.command(e,t,n,s);throw new se(".usage() description must start with $0 if being used as alias for .command()")}return kt(this,bt,"f").usage(e),this}usageConfiguration(e){return ye("<object>",[e],arguments.length),Et(this,vt,e,"f"),this}version(e,t,n){const s="version";if(ye("[boolean|string] [string] [string]",[e,t,n],arguments.length),kt(this,wt,"f")&&(this[$t](kt(this,wt,"f")),kt(this,bt,"f").version(void 0),Et(this,wt,null,"f")),0===arguments.length)n=this[Mt](),e=s;else if(1===arguments.length){if(!1===e)return this;n=e,e=s}else 2===arguments.length&&(n=t,t=void 0);return Et(this,wt,"string"==typeof e?e:s,"f"),t=t||kt(this,bt,"f").deferY18nLookup("Show version number"),kt(this,bt,"f").version(n||void 0),this.boolean(kt(this,wt,"f")),this.describe(kt(this,wt,"f"),t),this}wrap(e){return ye("<number|null|undefined>",[e],arguments.length),kt(this,bt,"f").wrap(e),this}[(Be=new WeakMap,Le=new WeakMap,Ve=new WeakMap,Ue=new WeakMap,He=new WeakMap,Ye=new WeakMap,qe=new WeakMap,Je=new WeakMap,Ge=new WeakMap,Ke=new WeakMap,Qe=new WeakMap,Xe=new WeakMap,Ze=new WeakMap,et=new WeakMap,tt=new WeakMap,nt=new WeakMap,st=new WeakMap,it=new WeakMap,rt=new WeakMap,ot=new WeakMap,at=new WeakMap,ct=new WeakMap,lt=new WeakMap,ht=new WeakMap,dt=new WeakMap,ut=new WeakMap,ft=new WeakMap,pt=new WeakMap,gt=new WeakMap,mt=new WeakMap,yt=new WeakMap,bt=new WeakMap,vt=new WeakMap,wt=new WeakMap,Ot=new WeakMap,At)](e){if(!e._||!e["--"])return e;e._.push.apply(e._,e["--"]);try{delete e["--"]}catch(e){}return e}[jt](){return{log:(...e)=>{this[Qt]()||console.log(...e),Et(this,et,!0,"f"),kt(this,it,"f").length&&Et(this,it,kt(this,it,"f")+"\n","f"),Et(this,it,kt(this,it,"f")+e.join(" "),"f")},error:(...e)=>{this[Qt]()||console.error(...e),Et(this,et,!0,"f"),kt(this,it,"f").length&&Et(this,it,kt(this,it,"f")+"\n","f"),Et(this,it,kt(this,it,"f")+e.join(" "),"f")}}}[$t](e){fe(kt(this,rt,"f")).forEach((t=>{if("configObjects"===t)return;const n=kt(this,rt,"f")[t];Array.isArray(n)?n.includes(e)&&n.splice(n.indexOf(e),1):"object"==typeof n&&delete n[e]})),delete kt(this,bt,"f").getDescriptions()[e]}[_t](e,t,n){kt(this,Ge,"f")[n]||(kt(this,pt,"f").process.emitWarning(e,t),kt(this,Ge,"f")[n]=!0)}[xt](){kt(this,Qe,"f").push({options:kt(this,rt,"f"),configObjects:kt(this,rt,"f").configObjects.slice(0),exitProcess:kt(this,Ke,"f"),groups:kt(this,Ze,"f"),strict:kt(this,gt,"f"),strictCommands:kt(this,mt,"f"),strictOptions:kt(this,yt,"f"),completionCommand:kt(this,He,"f"),output:kt(this,it,"f"),exitError:kt(this,qe,"f"),hasOutput:kt(this,et,"f"),parsed:this.parsed,parseFn:kt(this,ct,"f"),parseContext:kt(this,lt,"f")}),kt(this,bt,"f").freeze(),kt(this,Ot,"f").freeze(),kt(this,Be,"f").freeze(),kt(this,Xe,"f").freeze()}[Ct](){let e,t="";return e=/\b(node|iojs|electron)(\.exe)?$/.test(kt(this,pt,"f").process.argv()[0])?kt(this,pt,"f").process.argv().slice(1,2):kt(this,pt,"f").process.argv().slice(0,1),t=e.map((e=>{const t=this[en](kt(this,Le,"f"),e);return e.match(/^(\/|([a-zA-Z]:)?\\)/)&&t.length<e.length?t:e})).join(" ").trim(),kt(this,pt,"f").getEnv("_")&&kt(this,pt,"f").getProcessArgvBin()===kt(this,pt,"f").getEnv("_")&&(t=kt(this,pt,"f").getEnv("_").replace(`${kt(this,pt,"f").path.dirname(kt(this,pt,"f").process.execPath())}/`,"")),t}[St](){return kt(this,at,"f")}[Pt](){return kt(this,vt,"f")}[Nt](){if(!kt(this,Je,"f"))return;const e=kt(this,pt,"f").getEnv("LC_ALL")||kt(this,pt,"f").getEnv("LC_MESSAGES")||kt(this,pt,"f").getEnv("LANG")||kt(this,pt,"f").getEnv("LANGUAGE")||"en_US";this.locale(e.replace(/[.:].*/,""))}[Mt](){return this[It]().version||"unknown"}[Dt](e){const t=e["--"]?e["--"]:e._;for(let e,n=0;void 0!==(e=t[n]);n++)kt(this,pt,"f").Parser.looksLikeNumber(e)&&Number.isSafeInteger(Math.floor(parseFloat(`${e}`)))&&(t[n]=Number(e));return e}[It](e){const t=e||"*";if(kt(this,ht,"f")[t])return kt(this,ht,"f")[t];let n={};try{let t=e||kt(this,pt,"f").mainFilename;!e&&kt(this,pt,"f").path.extname(t)&&(t=kt(this,pt,"f").path.dirname(t));const s=kt(this,pt,"f").findUp(t,((e,t)=>t.includes("package.json")?"package.json":void 0));de(s,void 0,kt(this,pt,"f")),n=JSON.parse(kt(this,pt,"f").readFileSync(s,"utf8"))}catch(e){}return kt(this,ht,"f")[t]=n||{},kt(this,ht,"f")[t]}[Rt](e,t){(t=[].concat(t)).forEach((t=>{t=this[Ft](t),kt(this,rt,"f")[e].push(t)}))}[Wt](e,t,n,s){this[Tt](e,t,n,s,((e,t,n)=>{kt(this,rt,"f")[e][t]=n}))}[zt](e,t,n,s){this[Tt](e,t,n,s,((e,t,n)=>{kt(this,rt,"f")[e][t]=(kt(this,rt,"f")[e][t]||[]).concat(n)}))}[Tt](e,t,n,s,i){if(Array.isArray(n))n.forEach((t=>{e(t,s)}));else if((e=>"object"==typeof e)(n))for(const t of fe(n))e(t,n[t]);else i(t,this[Ft](n),s)}[Ft](e){return"__proto__"===e?"___proto___":e}[Bt](e,t){return this[Wt](this[Bt].bind(this),"key",e,t),this}[Lt](){var e,t,n,s,i,r,o,a,c,l,h,d;const u=kt(this,Qe,"f").pop();let f;de(u,void 0,kt(this,pt,"f")),e=this,t=this,n=this,s=this,i=this,r=this,o=this,a=this,c=this,l=this,h=this,d=this,({options:{set value(t){Et(e,rt,t,"f")}}.value,configObjects:f,exitProcess:{set value(e){Et(t,Ke,e,"f")}}.value,groups:{set value(e){Et(n,Ze,e,"f")}}.value,output:{set value(e){Et(s,it,e,"f")}}.value,exitError:{set value(e){Et(i,qe,e,"f")}}.value,hasOutput:{set value(e){Et(r,et,e,"f")}}.value,parsed:this.parsed,strict:{set value(e){Et(o,gt,e,"f")}}.value,strictCommands:{set value(e){Et(a,mt,e,"f")}}.value,strictOptions:{set value(e){Et(c,yt,e,"f")}}.value,completionCommand:{set value(e){Et(l,He,e,"f")}}.value,parseFn:{set value(e){Et(h,ct,e,"f")}}.value,parseContext:{set value(e){Et(d,lt,e,"f")}}.value}=u),kt(this,rt,"f").configObjects=f,kt(this,bt,"f").unfreeze(),kt(this,Ot,"f").unfreeze(),kt(this,Be,"f").unfreeze(),kt(this,Xe,"f").unfreeze()}[Vt](e,t){return Ee(t,(t=>(e(t),t)))}getInternalMethods(){return{getCommandInstance:this[Ut].bind(this),getContext:this[Ht].bind(this),getHasOutput:this[Yt].bind(this),getLoggerInstance:this[qt].bind(this),getParseContext:this[Jt].bind(this),getParserConfiguration:this[St].bind(this),getUsageConfiguration:this[Pt].bind(this),getUsageInstance:this[Gt].bind(this),getValidationInstance:this[Kt].bind(this),hasParseCallback:this[Qt].bind(this),isGlobalContext:this[Xt].bind(this),postProcess:this[Zt].bind(this),reset:this[tn].bind(this),runValidation:this[sn].bind(this),runYargsParserAndExecuteCommands:this[nn].bind(this),setHasOutput:this[rn].bind(this)}}[Ut](){return kt(this,Be,"f")}[Ht](){return kt(this,Ve,"f")}[Yt](){return kt(this,et,"f")}[qt](){return kt(this,st,"f")}[Jt](){return kt(this,lt,"f")||{}}[Gt](){return kt(this,bt,"f")}[Kt](){return kt(this,Ot,"f")}[Qt](){return!!kt(this,ct,"f")}[Xt](){return kt(this,nt,"f")}[Zt](e,t,n,s){if(n)return e;if(pe(e))return e;t||(e=this[At](e));return(this[St]()["parse-positional-numbers"]||void 0===this[St]()["parse-positional-numbers"])&&(e=this[Dt](e)),s&&(e=Oe(e,this,kt(this,Xe,"f").getMiddleware(),!1)),e}[tn](e={}){Et(this,rt,kt(this,rt,"f")||{},"f");const t={};t.local=kt(this,rt,"f").local||[],t.configObjects=kt(this,rt,"f").configObjects||[];const n={};t.local.forEach((t=>{n[t]=!0,(e[t]||[]).forEach((e=>{n[e]=!0}))})),Object.assign(kt(this,dt,"f"),Object.keys(kt(this,Ze,"f")).reduce(((e,t)=>{const s=kt(this,Ze,"f")[t].filter((e=>!(e in n)));return s.length>0&&(e[t]=s),e}),{})),Et(this,Ze,{},"f");return["array","boolean","string","skipValidation","count","normalize","number","hiddenOptions"].forEach((e=>{t[e]=(kt(this,rt,"f")[e]||[]).filter((e=>!n[e]))})),["narg","key","alias","default","defaultDescription","config","choices","demandedOptions","demandedCommands","deprecatedOptions"].forEach((e=>{t[e]=_e(kt(this,rt,"f")[e],(e=>!n[e]))})),t.envPrefix=kt(this,rt,"f").envPrefix,Et(this,rt,t,"f"),Et(this,bt,kt(this,bt,"f")?kt(this,bt,"f").reset(n):Se(this,kt(this,pt,"f")),"f"),Et(this,Ot,kt(this,Ot,"f")?kt(this,Ot,"f").reset(n):function(e,t,n){const s=n.y18n.__,i=n.y18n.__n,r={nonOptionCount:function(n){const s=e.getDemandedCommands(),r=n._.length+(n["--"]?n["--"].length:0)-e.getInternalMethods().getContext().commands.length;s._&&(r<s._.min||r>s._.max)&&(r<s._.min?void 0!==s._.minMsg?t.fail(s._.minMsg?s._.minMsg.replace(/\$0/g,r.toString()).replace(/\$1/,s._.min.toString()):null):t.fail(i("Not enough non-option arguments: got %s, need at least %s","Not enough non-option arguments: got %s, need at least %s",r,r.toString(),s._.min.toString())):r>s._.max&&(void 0!==s._.maxMsg?t.fail(s._.maxMsg?s._.maxMsg.replace(/\$0/g,r.toString()).replace(/\$1/,s._.max.toString()):null):t.fail(i("Too many non-option arguments: got %s, maximum of %s","Too many non-option arguments: got %s, maximum of %s",r,r.toString(),s._.max.toString()))))},positionalCount:function(e,n){n<e&&t.fail(i("Not enough non-option arguments: got %s, need at least %s","Not enough non-option arguments: got %s, need at least %s",n,n+"",e+""))},requiredArguments:function(e,n){let s=null;for(const t of Object.keys(n))Object.prototype.hasOwnProperty.call(e,t)&&void 0!==e[t]||(s=s||{},s[t]=n[t]);if(s){const e=[];for(const t of Object.keys(s)){const n=s[t];n&&e.indexOf(n)<0&&e.push(n)}const n=e.length?`\n${e.join("\n")}`:"";t.fail(i("Missing required argument: %s","Missing required arguments: %s",Object.keys(s).length,Object.keys(s).join(", ")+n))}},unknownArguments:function(n,s,o,a,c=!0){var l;const h=e.getInternalMethods().getCommandInstance().getCommands(),d=[],u=e.getInternalMethods().getContext();if(Object.keys(n).forEach((t=>{Re.includes(t)||Object.prototype.hasOwnProperty.call(o,t)||Object.prototype.hasOwnProperty.call(e.getInternalMethods().getParseContext(),t)||r.isValidAndSomeAliasIsNotNew(t,s)||d.push(t)})),c&&(u.commands.length>0||h.length>0||a)&&n._.slice(u.commands.length).forEach((e=>{h.includes(""+e)||d.push(""+e)})),c){const t=(null===(l=e.getDemandedCommands()._)||void 0===l?void 0:l.max)||0,s=u.commands.length+t;s<n._.length&&n._.slice(s).forEach((e=>{e=String(e),u.commands.includes(e)||d.includes(e)||d.push(e)}))}d.length&&t.fail(i("Unknown argument: %s","Unknown arguments: %s",d.length,d.map((e=>e.trim()?e:`"${e}"`)).join(", ")))},unknownCommands:function(n){const s=e.getInternalMethods().getCommandInstance().getCommands(),r=[],o=e.getInternalMethods().getContext();return(o.commands.length>0||s.length>0)&&n._.slice(o.commands.length).forEach((e=>{s.includes(""+e)||r.push(""+e)})),r.length>0&&(t.fail(i("Unknown command: %s","Unknown commands: %s",r.length,r.join(", "))),!0)},isValidAndSomeAliasIsNotNew:function(t,n){if(!Object.prototype.hasOwnProperty.call(n,t))return!1;const s=e.parsed.newAliases;return[t,...n[t]].some((e=>!Object.prototype.hasOwnProperty.call(s,e)||!s[t]))},limitedChoices:function(n){const i=e.getOptions(),r={};if(!Object.keys(i.choices).length)return;Object.keys(n).forEach((e=>{-1===Re.indexOf(e)&&Object.prototype.hasOwnProperty.call(i.choices,e)&&[].concat(n[e]).forEach((t=>{-1===i.choices[e].indexOf(t)&&void 0!==t&&(r[e]=(r[e]||[]).concat(t))}))}));const o=Object.keys(r);if(!o.length)return;let a=s("Invalid values:");o.forEach((e=>{a+=`\n ${s("Argument: %s, Given: %s, Choices: %s",e,t.stringifiedValues(r[e]),t.stringifiedValues(i.choices[e]))}`})),t.fail(a)}};let o={};function a(e,t){const n=Number(t);return"number"==typeof(t=isNaN(n)?t:n)?t=e._.length>=t:t.match(/^--no-.+/)?(t=t.match(/^--no-(.+)/)[1],t=!Object.prototype.hasOwnProperty.call(e,t)):t=Object.prototype.hasOwnProperty.call(e,t),t}r.implies=function(t,s){ye("<string|object> [array|number|string]",[t,s],arguments.length),"object"==typeof t?Object.keys(t).forEach((e=>{r.implies(e,t[e])})):(e.global(t),o[t]||(o[t]=[]),Array.isArray(s)?s.forEach((e=>r.implies(t,e))):(de(s,void 0,n),o[t].push(s)))},r.getImplied=function(){return o},r.implications=function(e){const n=[];if(Object.keys(o).forEach((t=>{const s=t;(o[t]||[]).forEach((t=>{let i=s;const r=t;i=a(e,i),t=a(e,t),i&&!t&&n.push(` ${s} -> ${r}`)}))})),n.length){let e=`${s("Implications failed:")}\n`;n.forEach((t=>{e+=t})),t.fail(e)}};let c={};r.conflicts=function(t,n){ye("<string|object> [array|string]",[t,n],arguments.length),"object"==typeof t?Object.keys(t).forEach((e=>{r.conflicts(e,t[e])})):(e.global(t),c[t]||(c[t]=[]),Array.isArray(n)?n.forEach((e=>r.conflicts(t,e))):c[t].push(n))},r.getConflicting=()=>c,r.conflicting=function(i){Object.keys(i).forEach((e=>{c[e]&&c[e].forEach((n=>{n&&void 0!==i[e]&&void 0!==i[n]&&t.fail(s("Arguments %s and %s are mutually exclusive",e,n))}))})),e.getInternalMethods().getParserConfiguration()["strip-dashed"]&&Object.keys(c).forEach((e=>{c[e].forEach((r=>{r&&void 0!==i[n.Parser.camelCase(e)]&&void 0!==i[n.Parser.camelCase(r)]&&t.fail(s("Arguments %s and %s are mutually exclusive",e,r))}))}))},r.recommendCommands=function(e,n){n=n.sort(((e,t)=>t.length-e.length));let i=null,r=1/0;for(let t,s=0;void 0!==(t=n[s]);s++){const n=Ie(e,t);n<=3&&n<r&&(r=n,i=t)}i&&t.fail(s("Did you mean %s?",i))},r.reset=function(e){return o=_e(o,(t=>!e[t])),c=_e(c,(t=>!e[t])),r};const l=[];return r.freeze=function(){l.push({implied:o,conflicting:c})},r.unfreeze=function(){const e=l.pop();de(e,void 0,n),({implied:o,conflicting:c}=e)},r}(this,kt(this,bt,"f"),kt(this,pt,"f")),"f"),Et(this,Be,kt(this,Be,"f")?kt(this,Be,"f").reset():function(e,t,n,s){return new Ae(e,t,n,s)}(kt(this,bt,"f"),kt(this,Ot,"f"),kt(this,Xe,"f"),kt(this,pt,"f")),"f"),kt(this,Ue,"f")||Et(this,Ue,function(e,t,n,s){return new De(e,t,n,s)}(this,kt(this,bt,"f"),kt(this,Be,"f"),kt(this,pt,"f")),"f"),kt(this,Xe,"f").reset(),Et(this,He,null,"f"),Et(this,it,"","f"),Et(this,qe,null,"f"),Et(this,et,!1,"f"),this.parsed=!1,this}[en](e,t){return kt(this,pt,"f").path.relative(e,t)}[nn](e,t,n,s=0,i=!1){let r=!!n||i;e=e||kt(this,ut,"f"),kt(this,rt,"f").__=kt(this,pt,"f").y18n.__,kt(this,rt,"f").configuration=this[St]();const o=!!kt(this,rt,"f").configuration["populate--"],a=Object.assign({},kt(this,rt,"f").configuration,{"populate--":!0}),c=kt(this,pt,"f").Parser.detailed(e,Object.assign({},kt(this,rt,"f"),{configuration:{"parse-positional-numbers":!1,...a}})),l=Object.assign(c.argv,kt(this,lt,"f"));let h;const d=c.aliases;let u=!1,f=!1;Object.keys(l).forEach((e=>{e===kt(this,tt,"f")&&l[e]?u=!0:e===kt(this,wt,"f")&&l[e]&&(f=!0)})),l.$0=this.$0,this.parsed=c,0===s&&kt(this,bt,"f").clearCachedHelpMessage();try{if(this[Nt](),t)return this[Zt](l,o,!!n,!1);if(kt(this,tt,"f")){[kt(this,tt,"f")].concat(d[kt(this,tt,"f")]||[]).filter((e=>e.length>1)).includes(""+l._[l._.length-1])&&(l._.pop(),u=!0)}Et(this,nt,!1,"f");const a=kt(this,Be,"f").getCommands(),p=kt(this,Ue,"f").completionKey in l,g=u||p||i;if(l._.length){if(a.length){let e;for(let t,r=s||0;void 0!==l._[r];r++){if(t=String(l._[r]),a.includes(t)&&t!==kt(this,He,"f")){const e=kt(this,Be,"f").runCommand(t,this,c,r+1,i,u||f||i);return this[Zt](e,o,!!n,!1)}if(!e&&t!==kt(this,He,"f")){e=t;break}}!kt(this,Be,"f").hasDefaultCommand()&&kt(this,ft,"f")&&e&&!g&&kt(this,Ot,"f").recommendCommands(e,a)}kt(this,He,"f")&&l._.includes(kt(this,He,"f"))&&!p&&(kt(this,Ke,"f")&&xe(!0),this.showCompletionScript(),this.exit(0))}if(kt(this,Be,"f").hasDefaultCommand()&&!g){const e=kt(this,Be,"f").runCommand(null,this,c,0,i,u||f||i);return this[Zt](e,o,!!n,!1)}if(p){kt(this,Ke,"f")&&xe(!0);const t=(e=[].concat(e)).slice(e.indexOf(`--${kt(this,Ue,"f").completionKey}`)+1);return kt(this,Ue,"f").getCompletion(t,((e,t)=>{if(e)throw new se(e.message);(t||[]).forEach((e=>{kt(this,st,"f").log(e)})),this.exit(0)})),this[Zt](l,!o,!!n,!1)}if(kt(this,et,"f")||(u?(kt(this,Ke,"f")&&xe(!0),r=!0,this.showHelp("log"),this.exit(0)):f&&(kt(this,Ke,"f")&&xe(!0),r=!0,kt(this,bt,"f").showVersion("log"),this.exit(0))),!r&&kt(this,rt,"f").skipValidation.length>0&&(r=Object.keys(l).some((e=>kt(this,rt,"f").skipValidation.indexOf(e)>=0&&!0===l[e]))),!r){if(c.error)throw new se(c.error.message);if(!p){const e=this[sn](d,{},c.error);n||(h=Oe(l,this,kt(this,Xe,"f").getMiddleware(),!0)),h=this[Vt](e,null!=h?h:l),pe(h)&&!n&&(h=h.then((()=>Oe(l,this,kt(this,Xe,"f").getMiddleware(),!1))))}}}catch(e){if(!(e instanceof se))throw e;kt(this,bt,"f").fail(e.message,e)}return this[Zt](null!=h?h:l,o,!!n,!0)}[sn](e,t,n,s){const i={...this.getDemandedOptions()};return r=>{if(n)throw new se(n.message);kt(this,Ot,"f").nonOptionCount(r),kt(this,Ot,"f").requiredArguments(r,i);let o=!1;kt(this,mt,"f")&&(o=kt(this,Ot,"f").unknownCommands(r)),kt(this,gt,"f")&&!o?kt(this,Ot,"f").unknownArguments(r,e,t,!!s):kt(this,yt,"f")&&kt(this,Ot,"f").unknownArguments(r,e,{},!1,!1),kt(this,Ot,"f").limitedChoices(r),kt(this,Ot,"f").implications(r),kt(this,Ot,"f").conflicting(r)}}[rn](){Et(this,et,!0,"f")}[on](e){if("string"==typeof e)kt(this,rt,"f").key[e]=!0;else for(const t of e)kt(this,rt,"f").key[t]=!0}}const cn=(ln=he,(e=[],t=ln.process.cwd(),n)=>{const s=new an(e,t,n,ln);return Object.defineProperty(s,"argv",{get:()=>s.parse(),enumerable:!0}),s.help(),s.version(),s});var ln;function hn(e){if(Object(e)!==e)throw TypeError("right-hand side of 'in' should be an object, got "+(null!==e?typeof e:"null"));return e}function dn(e,t,n){"symbol"==typeof t&&(t=(t=t.description)?"["+t+"]":"");try{Object.defineProperty(e,"name",{configurable:!0,value:n?n+" "+t:t})}catch(e){}return e}function un(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}const fn=process.argv[0].endsWith("/bun"),pn=fn?"bun --bun run":"node",gn=fn?"bun --bun run":"yarn";let mn;const yn=function({cacheDuration:e=Number.POSITIVE_INFINITY,caches:t,calcKey:n=(e=>function(e,t=0){const[n,s]=function(e,t=0){let n=3735928559^t,s=1103547991^t;for(let t,i=0;i<e.length;i++)t=e.codePointAt(i),n=Math.imul(n^t,2654435761),s=Math.imul(s^t,1597334677);return n=Math.imul(n^n>>>16,2246822507),n^=Math.imul(s^s>>>13,3266489909),s=Math.imul(s^s>>>16,2246822507),s^=Math.imul(n^n>>>13,3266489909),[s>>>0,n>>>0]}(e,t);return e.length.toString(36)+n.toString(36).padStart(7,"0")+s.toString(36).padStart(7,"0")}(JSON.stringify(e))),maxCachedArgsSize:s=100,maxCachedThisSize:i=10}={}){return function(r,o){if("getter"===o?.kind){const n=new Map;return t?.push(n),function(){const t=Date.now();if(n.has(this)){const[s,i]=n.get(this);if(t-i<=e)return s}const s=r.call(this);if(n.size>=i){const e=n.keys().next().value;n.delete(e)}return n.set(this,[s,t]),s}}{const a=new Map;return t?.push(a),function(...t){const c=n(t);let l=a.get(this);const h=Date.now();if(l){if(l.has(c)){const[t,n]=l.get(c);if(h-n<=e)return t}}else{if(l=new Map,a.size>=i){const e=a.keys().next().value;a.delete(e)}a.set(this,l)}const d=o?r.call(this,...t):r(...t);if(l.size>=s){const e=l.keys().next().value;l.delete(e)}return l.set(c,[d,h]),d}}}}({maxCachedThisSize:Number.MAX_SAFE_INTEGER,maxCachedArgsSize:1});class bn{static{[mn]=function(e,t,n,s,i,r){var o,a,c,l,h,d,u,f=Symbol.metadata||Symbol.for("Symbol.metadata"),p=Object.defineProperty,g=Object.create,m=[g(null),g(null)],y=t.length;function b(t,n,s){return function(i,r){n&&(r=i,i=e);for(var o=0;o<t.length;o++)r=t[o].apply(i,s?[r]:[]);return s?r:i}}function v(e,t,n,s){if("function"!=typeof e&&(s||void 0!==e))throw new TypeError(t+" must "+(n||"be")+" a function"+(s?"":" or undefined"));return e}function w(e,t,n,s,i,r,c,l,h,d,u){function f(e){if(!u(e))throw new TypeError("Attempted to access private element on non-instance")}var g=[].concat(t[0]),y=t[3],w=!c,O=1===i,E=3===i,k=4===i,A=2===i;function j(t,n,s){return function(i,r){return n&&(r=i,i=e),s&&s(i),$[t].call(i,r)}}if(!w){var $={},_=[],x=E?"get":k||O?"set":"value";if(h?(d||O?$={get:dn((function(){return y(this)}),s,"get"),set:function(e){t[4](this,e)}}:$[x]=y,d||dn($[x],s,A?"":x)):d||($=Object.getOwnPropertyDescriptor(e,s)),!d&&!h){if((a=m[+l][s])&&7!=(a^i))throw Error("Decorating two elements with the same name ("+$[x].name+") is not supported yet");m[+l][s]=i<3?1:i}}for(var C=e,S=g.length-1;S>=0;S-=n?2:1){var P=v(g[S],"A decorator","be",!0),N=n?g[S-1]:void 0,M={},D={kind:["field","accessor","method","getter","setter","class"][i],name:s,metadata:o,addInitializer:function(e,t){if(e.v)throw new TypeError("attempted to call addInitializer after decoration was finished");v(t,"An initializer","be",!0),r.push(t)}.bind(null,M)};if(w)a=P.call(N,C,D),M.v=1,v(a,"class decorators","return")&&(C=a);else if(D.static=l,D.private=h,a=D.access={has:h?u.bind():function(e){return s in e}},k||(a.get=h?A?function(e){return f(e),$.value}:j("get",0,f):function(e){return e[s]}),A||E||(a.set=h?j("set",0,f):function(e,t){e[s]=t}),C=P.call(N,O?{get:$.get,set:$.set}:$[x],D),M.v=1,O){if("object"==typeof C&&C)(a=v(C.get,"accessor.get"))&&($.get=a),(a=v(C.set,"accessor.set"))&&($.set=a),(a=v(C.init,"accessor.init"))&&_.unshift(a);else if(void 0!==C)throw new TypeError("accessor decorators must return an object with get, set, or init properties or undefined")}else v(C,(d?"field":"method")+" decorators","return")&&(d?_.unshift(C):$[x]=C)}return i<2&&c.push(b(_,l,1),b(r,l,0)),d||w||(h?O?c.splice(-1,0,j("get",l),j("set",l)):c.push(A?$[x]:v.call.bind($[x])):p(e,s,$)),C}function O(e){return p(e,f,{configurable:!0,enumerable:!0,value:o})}return o=g(null==o?null:o),h=[],d=function(e){e&&h.push(b(e))},u=function(t,s){for(var r=0;r<n.length;r++){var o=n[r],a=o[1],d=7&a;if((8&a)==t&&!d==s){var u=o[2],f=!!o[3],p=16&a;w(t?e:e.prototype,o,p,f?"#"+u:un(u),d,d<2?[]:t?l=l||[]:c=c||[],h,!!t,f,s,t&&f?function(t){return hn(t)===e}:i)}}},u(8,0),u(0,0),u(8,1),u(0,1),d(c),d(l),a=h,y||O(e),{e:a,get c(){var n=[];return y&&[O(e=w(e,[t],s,e.name,5,n)),b(n,1)]}}}(this,[],[[yn,3,"isBunAvailable"],[yn,3,"buildCommand"],[yn,3,"rootDirPath"],[yn,3,"dockerfile"],[yn,3,"hasDockerfile"],[yn,3,"hasSourceCode"],[yn,3,"name"],[yn,3,"dockerImageName"],[yn,3,"env"],[yn,3,"packageJson"],[yn,3,"hasPrisma"],[yn,3,"dockerPackageJson"],[yn,3,"binExists"]]).e}argv=void mn(this);pathByName=new Map;constructor(t,n,s){this._dirPath=e.resolve(t),this.argv=n,this.loadEnv=s}get isBunAvailable(){try{return/(^|\n)bun\s/.test(l.readFileSync(e.join(this.rootDirPath,".tool-versions"),"utf8"))}catch{return!1}}get buildCommand(){return fn?"true":this.packageJson.scripts?.build?.includes("buildIfNeeded")?"yarn build":"YARN wb buildIfNeeded "+(this.argv.verbose?"--verbose":"")}get dirPath(){return this._dirPath}get rootDirPath(){return l.existsSync(e.join(this.dirPath,"..","..","package.json"))?e.resolve(this.dirPath,"..",".."):this.dirPath}get dockerfile(){return l.readFileSync(this.findFile("Dockerfile"),"utf8")}get hasDockerfile(){try{return!!this.findFile("Dockerfile")}catch{return!1}}get hasSourceCode(){return l.existsSync(e.join(this.dirPath,"src"))}get name(){return this.packageJson.name||"unknown"}get dockerImageName(){return(this.packageJson.name||"unknown").replaceAll("@","").replaceAll("/","-")}get env(){return this.loadEnv?{...C(this.argv,this.dirPath),...process.env}:process.env}get packageJson(){return JSON.parse(l.readFileSync(e.join(this.dirPath,"package.json"),"utf8"))}get hasPrisma(){return!(!this.packageJson.dependencies?.prisma&&!this.packageJson.devDependencies?.prisma)}get dockerPackageJson(){return e.dirname(this.findFile("Dockerfile"))===this.dirPath?this.packageJson:JSON.parse(l.readFileSync(e.join(e.dirname(this.findFile("Dockerfile")),"package.json"),"utf8"))}get binExists(){let t=!1,n=this.dirPath;for(;;){const s=e.join(n,"node_modules",".bin");if(l.existsSync(s)&&(this.env.PATH=`${s}:${this.env.PATH}`,t=!0),l.existsSync(e.join(n,".git")))break;const i=e.dirname(n);if(n===i)break;n=i}return t}findFile(t){let n=this.pathByName.get(t);if(n)return n;if(n=[t,e.join("..","..",t)].map((t=>e.resolve(this.dirPath,t))).find((e=>l.existsSync(e))),!n)throw new Error(`File not found: ${t}`);return this.pathByName.set(t,n),n}}function vn(t,n=!0,s){if(s??=process.cwd(),l.existsSync(e.join(s,"package.json")))return new bn(s,t,n)}async function wn(t,n=!0,s){const i=function(t,n=!0,s){if(s??=process.cwd(),!l.existsSync(e.join(s,"package.json")))return;const i=new bn(s,t,n);let r=i;if(!i.packageJson.workspaces&&e.dirname(s).endsWith("/packages")){const i=e.resolve(s,"..","..");l.existsSync(e.join(i,"package.json"))&&(r=new bn(i,t,n))}return{root:r,self:i}}(t,n,s);if(i)return{...i,all:i.root===i.self?await On(t,i.root,n):[i.self]}}async function On(t,n,s){const i=[n],r=n.packageJson.workspaces;if(!Array.isArray(r))return i;const o=[],a=[];for(const t of r.map((t=>e.join(n.dirPath,t))))l.existsSync(t)?a.push(t):o.push(t);a.push(...await E(o,{dot:!0,onlyDirectories:!0}));for(const n of a)l.existsSync(e.join(n,"package.json"))&&i.push(new bn(n,t,s));return i}const En={command:"buildIfNeeded",describe:"Build code if changes are detected",builder:{command:{description:"A build command",type:"string",default:"yarn build",alias:"c"}},async handler(t){await async function(t,n){const s=await vn(t,!0,n);if(!s)return console.error(O.red("No project found.")),!0;if(!l.existsSync(e.join(s.rootDirPath,".git")))return kn(s,t),!0;const[i,r,o]=await async function(t,n){const s=e.resolve(t.dirPath,"node_modules",".cache","build"),i=e.resolve(s,"last-build");await l.promises.mkdir(s,{recursive:!0});const r=w("sha256"),o=y.execSync("git rev-parse HEAD",{cwd:t.dirPath}).toString().trim();r.update(o);const a=JSON.stringify(Object.entries(t.env).filter((([e])=>!An.has(e))).sort((([e],[t])=>e.localeCompare(t))));r.update(a),await async function(e,t,n){return new Promise((s=>{const i=y.spawnSync("git",["diff","--name-only"],{cwd:e.dirPath,env:e.env,stdio:"pipe",encoding:"utf8"}).stdout.trim().split("\n").map((t=>"test"===e.env.WB_ENV?t.replace(/packages\/scripts\/test-fixtures\/[^/]+\//,""):t)).filter((e=>(jn.some((t=>e.includes(t)))||$n.some((t=>e.endsWith(t))))&&!_n.some((t=>e.includes(t)))));t.verbose&&console.info(`Changed files: ${i.join(", ")}`);const r=y.spawn("git",["diff","--",...i],{cwd:e.rootDirPath});r.stdout?.on("data",(e=>{n.update(e),t.verbose&&(console.info(e.toString()),console.info("Hash:",n.copy().digest("hex")))})),r.on("close",(()=>{s()}))}))}(t,n,r);const c=r.digest("hex"),h=await async function(e){try{return await e()}catch(e){if("object"==typeof e&&e&&"code"in e&&"ENOENT"===e.code)return;throw e}}((()=>l.promises.readFile(i,"utf8")));return[h===c,i,c]}(s,t);if(i)return console.info(O.green(`Skip to run '${t.command}' 💫`)),!1;if(!kn(s,t))return;t.dryRun||await l.promises.writeFile(r,o,"utf8");return!0}(t)}};function kn(e,t){if(console.info(O.green(`Run '${t.command}'`)),!t.dryRun){const n=y.spawnSync(t.command??"",{cwd:e.dirPath,env:e.env,shell:!0,stdio:"inherit"});if(0!==n.status)return process.exitCode=n.status??1,!1}return!0}const An=new Set(["CI","PWDEBUG","TMPDIR"]);const jn=["src/","public/"],$n=[".js",".cjs",".mjs",".jsx",".ts",".cts",".mts",".tsx",".json",".browserslistrc","package.json","yarn.lock"],_n=["test/","tests/","__tests__/","test-fixtures/"];function*xn(e,t){for(const n of t)console.info(`Running "${e}" for ${n.name} ...`),yield n}const Cn={command:"optimizeForDockerBuild",describe:"Optimize configuration when building a Docker image",builder:{outside:{description:"Whether the optimization is executed outside a docker container or not",type:"boolean",alias:"o"}},async handler(t){const n=await wn(t);n||(console.error(O.red("No project found.")),process.exit(1));for(const s of xn("optimizeForDockerBuild",n.all)){const n=s.packageJson,i=["dependencies","devDependencies"];for(const e of i){const t=n[e]||{};for(const[e,n]of Object.entries(t))n?.startsWith("git@github.com:")&&(t[e]=`./${e}`)}if(Sn(t,n),Pn(n),Nn(n),t.dryRun)continue;const r=t.outside?e.join(s.dirPath,"dist"):s.dirPath;await l.promises.mkdir(r,{recursive:!0}),await l.promises.writeFile(e.join(r,"package.json"),JSON.stringify(n),"utf8")}t.dryRun||t.outside||y.spawnSync("yarn",{stdio:"inherit"})}};function Sn(e,t){if(!e.outside)return void delete t.devDependencies;const n=t.devDependencies||{},s=["artillery","concurrently","conventional-changelog-conventionalcommits","eslint","husky","imagemin","jest","kill-port","lint-staged","open-cli","playwright","prettier","pinst","sort-package-json","wait-on","semantic-release","vitest"];for(const t of Object.keys(n))(s.some((e=>t.includes(e)))||!e.outside&&t.includes("willbooster")&&t.includes("config"))&&delete n[t]}function Pn(e){const t=["check","deploy","format","lint","start","test"],n=["pinst ","husky "],s=e.scripts||{};for(const[e,i]of Object.entries(s))(t.some((t=>e.includes(t)))||n.some((e=>i.includes(e)||i.trim()===e.trim())))&&delete s[e]}function Nn(e){delete e.private,delete e.publishConfig,delete e.prettier}const Mn=new class{deploy(e){return"PRISMA migrate deploy"}deployForce(e,t){const n=e.packageJson.dependencies?.blitz?"db":"prisma";return`rm -Rf ${n}/mount/prod.sqlite3*; PRISMA migrate reset --force && rm -Rf ${n}/mount/prod.sqlite3*\n && litestream restore -o ${n}/mount/prod.sqlite3 ${t} && ALLOW_TO_SKIP_SEED=0 PRISMA migrate deploy`}litestream(e){return`${pn} -e '\nconst { PrismaClient } = require("@prisma/client");\nnew PrismaClient().$queryRaw\`PRAGMA journal_mode = WAL;\`\n .catch((error) => { console.log("Failed due to:", error); process.exit(1); });\n'`}migrate(e){return`PRISMA migrate deploy && PRISMA generate && ${this.seed(e)}`}migrateDev(e){return"PRISMA migrate dev"}reset(e){return`PRISMA migrate reset --force --skip-seed && ${this.seed(e)}`}restore(e,t,n){return`rm -Rf ${e.packageJson.dependencies?.blitz?"db":"prisma"}/restored.sqlite3; GOOGLE_APPLICATION_CREDENTIALS=gcp-sa-key.json litestream restore -o ${n} ${t}`}seed(e,t){return e.packageJson.dependencies?.blitz?"YARN blitz db seed"+(t?` -f ${t}`:""):t?"BUN build-ts run prisma/seeds.ts":e.packageJson.prisma?.seed?"YARN prisma db seed":'if [ -e "prisma/seeds.ts" ]; then BUN build-ts run prisma/seeds.ts; fi'}studio(t,n){let s="";if(n)try{new URL(n),s=`DATABASE_URL=${n} `}catch{const t=e.resolve(n);console.info(n,t),s=`DATABASE_URL=file://${t} `}return`${s}PRISMA studio`}},Dn=new Set;async function In(e){try{await A(e)}catch{}}const Rn=new j,Wn={exitIfFailed:!0};async function zn(e,t,n,s=Wn){const[i,r]=Fn(e,t);if(Bn(i,t),n.verbose&&Bn(r,t,"Start (raw)",!0),n.dryRun)return Ln(i,0,s),0;const o=r.match(/http-get:\/\/127.0.0.1:(\d+)/)?.[1];r.includes("wait-on")&&o&&!r.includes("docker run")&&await async function(e){await In(e);const t=async()=>{Dn.has(e)||(Dn.add(e),await In(e))};for(const e of["beforeExit","SIGINT","SIGTERM","SIGQUIT"])process.on(e,t)}(Number(o));const a=await M(r,void 0,{cwd:t.dirPath,env:t.env,shell:!0,stdio:"inherit",timeout:s?.timeout,killOnExit:!0,verbose:n.verbose});return Ln(i,a.status,s),a.status??1}function Tn(e,t,n,s=Wn){return Rn.run((async()=>{const[i,r]=Fn(e,t);if(Bn(i,t,"Start (parallel)",!0),n.dryRun)return Bn(i,t,"Started (log)"),n.verbose&&Bn(r,t,"Started (raw)",!0),void Ln(i,0,s);const o=await M(r,void 0,{cwd:t.dirPath,env:t.env,shell:!0,stdio:"pipe",timeout:s?.timeout,mergeOutAndError:!0,killOnExit:!0,verbose:n.verbose});Bn(i,t,"Started (log)"),n.verbose&&Bn(r,t,"Started (raw)",!0);const a=o.stdout.trim();a&&console.info(a),Ln(i,o.status,s)}))}function Fn(e,t){let n=e.replaceAll("\n","").replaceAll(/\s\s+/g," ").replaceAll("PRISMA ",t.packageJson.dependencies?.blitz?"YARN blitz prisma ":"YARN prisma ").replaceAll("BUN ",t.isBunAvailable?"bun --bun run ":"YARN ");return fn&&(n=n.replaceAll("build-ts run","bun --bun run").replaceAll("dist/index.js","src/index.ts").replaceAll(/(YARN )?vitest run/g,"bun test").replaceAll(" --color --passWithNoTests --allowOnly","")),n=n.trim(),[n.replaceAll("YARN ",`${gn} `),n.replaceAll("YARN ",!fn&&t.binExists?"":`${gn} `)]}function Bn(e,t,n="Start",s=!1){console.info("\n"+(s?O.gray:O.cyan)(O.bold(`${n}:`),e)+O.gray(` at ${t.dirPath}`))}function Ln(e,t,n){0===t?console.info(O.green(O.bold("Finished:"),e)):(console.info(O.red(O.bold(`Failed (exit code ${t}): `),e)),!1!==n.exitIfFailed&&process.exit(t??1))}const Vn={},Un={command:"prisma",describe:"Run prisma commands",builder:e=>e.command(Hn).command(qn).command(Jn).command(Gn).command(Kn).command(Qn).command(Xn).command(Zn).command(es).command(ts).demandCommand(),handler(){}},Hn={command:"deploy",describe:"Apply migration to DB without initializing it",builder:Vn,async handler(e){const t=await ns(e);for(const n of xn("prisma deploy",t))await zn(Mn.deploy(n),n,e)}},Yn={...Vn,"backup-path":{description:"Whether to skip actual command execution",demandOption:!0,type:"string",alias:"b"}},qn={command:"deploy-force <backup-path>",describe:"Force to apply migration to DB utilizing Litestream's backup without initializing it",builder:Yn,async handler(e){const t=await ns(e);for(const n of xn("prisma deploy-force",t))await zn(Mn.deployForce(n,e.backupPath),n,e)}},Jn={command:"litestream",describe:"Setup DB for Litestream",builder:Vn,async handler(e){const t=await ns(e);for(const n of xn("prisma litestream",t))await zn(Mn.litestream(n),n,e)}},Gn={command:"migrate",describe:"Apply migration to DB with initializing it",builder:Vn,async handler(e){const t=await ns(e);for(const n of xn("prisma migrate",t))await zn(Mn.migrate(n),n,e)}},Kn={command:"migrate-dev",describe:"Create a migration file",builder:Vn,async handler(e){const t=await ns(e);for(const n of xn("prisma migrate-dev",t))await zn(Mn.migrateDev(n),n,e)}},Qn={command:"reset",describe:"Reset DB",builder:Vn,async handler(e){const t=await ns(e);for(const n of xn("prisma reset",t))await zn(Mn.reset(n),n,e)}},Xn={command:"restore <backup-path>",describe:"Restore DB from Litestream's backup",builder:{...Yn,output:{description:'Output path of the restored database. Defaults to "<db|prisma>/restored.sqlite3".',type:"string"}},async handler(e){const t=await ns(e);for(const n of xn("prisma restore",t)){const t=e.output||(n.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3");await zn(Mn.restore(n,e.backupPath,t),n,e)}}},Zn={command:"seed",describe:"Populate DB with seed data",builder:{...Vn,file:{alias:"f",description:"Path of the seed script.",type:"string"}},async handler(e){const t=await ns(e);for(const n of xn("prisma seed",t))await zn(Mn.seed(n,e.file),n,e)}},es={command:"studio [db-url-or-path]",describe:"Open Prisma Studio",builder:{...Vn,"db-url-or-path":{description:"URL or path to the database",type:"string"},restored:{description:"Whether to open the default restored database (<db|prisma>/restored.sqlite3).",type:"boolean"}},async handler(e){if(e.restored&&e.dbUrlOrPath)throw new Error("You cannot specify both --restored and --db-url-or-path.");const t=await ns(e);for(const n of xn("prisma studio",t)){const t=e.restored?n.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3":e.dbUrlOrPath?.toString();await zn(Mn.studio(n,t),n,e)}}},ts={command:"$0 [args..]",describe:"Pass the command and arguments to prisma as is",builder:{args:{type:"array"}},async handler(e){const t=await ns(e),n=`${e.args?.join(" ")??""}`.trimEnd();for(const s of xn(`prisma ${n}`,t))await zn(`PRISMA ${n}`,s,e)}};async function ns(e){const t=await wn(e);t||(console.error(O.red("No project found.")),process.exit(1));const n=t.all.filter((e=>e.packageJson.dependencies?.prisma||e.packageJson.devDependencies?.prisma));return 0===n.length&&(console.error(O.red("No prisma project found.")),process.exit(1)),n}const ss={command:"retry [command] [args...]",describe:"Retry the given command until it succeeds",builder:{retry:{description:"A maximum retry count",type:"number",alias:"r",default:3}},async handler(e){const t=vn(e);t||(console.error(O.red("No project found.")),process.exit(1));const n=[e.command,...e.args??[],...e._.slice(1)].filter(Boolean);let s=0;for(let i=0;i<e.retry;i++)if(i>0&&console.info(`\n${O.yellow(`#${i} Retrying: ${n.join(" ")}`)}`),s=await zn(n.join(" "),t,e,{exitIfFailed:!1}),0===s)return;process.exit(s)}},is=["express","fastify","elysia"],rs={command:"setup",describe:"Setup development environment. .env files are ignored.",builder:{},async handler(e){await async function(e,t){const n=await wn(e,!1,t);n||(console.error(O.red("No project found.")),process.exit(1));for(const t of xn("setup",n.all)){const s=await _.readdir(t.dirPath,{withFileTypes:!0});if(t===n.root){if("darwin"===x.platform()){const n=["pstree"];t.hasDockerfile&&n.push("expect"),await Tn(`brew install ${n.join(" ")}`,t,e)}s.some((e=>e.isFile()&&e.name.includes("-version")))&&await zn("asdf install",t,e)}if(s.some((e=>e.isFile()&&"pyproject.toml"===e.name))){await Tn("poetry config virtualenvs.in-project true",t,e),await Tn("poetry config virtualenvs.prefer-active-python true",t,e);const[,n]=y.execSync("asdf current python").toString().trim().split(/\s+/);await Tn(`poetry env use ${n}`,t,e),await Rn.promiseAll(),await zn("poetry run pip install --upgrade pip",t,e),await zn("poetry install --ansi",t,e)}const i=t.packageJson.dependencies??{},r=t.packageJson.devDependencies||{},o=t.packageJson.scripts??{},a=[];let c=[];i.blitz||i.next||r["@remix-run/dev"]?(a.push("pm2"),c.push("concurrently","open-cli","vitest","wait-on")):is.some((e=>i[e]))&&(a.push("pm2"),c.push("concurrently","vitest","wait-on")),fn&&(c=c.filter((e=>"vitest"!==e))),a.length>0&&await zn(`yarn add ${a.join(" ")}`,t,e),c.length>0&&await zn(`yarn add -D ${c.join(" ")}`,t,e),o["gen-code"]&&await zn("yarn gen-code",t,e)}}(e)}};const os=new class{buildDevImage(t,n){const s=t.dockerPackageJson.scripts?.["docker/build/prepare"]?"yarn run docker/build/prepare && ":"";return`cd ${e.dirname(t.findFile("Dockerfile"))}\n && ${s}YARN wb optimizeForDockerBuild --outside\n && YARN wb retry -- docker build -t ${t.dockerImageName}\n --build-arg ARCH=$([ $(uname -m) = 'arm64' ] && echo arm64 || echo amd64)\n --build-arg WB_ENV=${t.env.WB_ENV}\n --build-arg WB_VERSION=${n} .`}stopAndStart(e,t=!1,n="",s=""){return`${this.stop(e)} && ${t?"unbuffer ":""}${this.start(e,n,s)}`}start(e,t="",n=""){return function(e,t){const n=async()=>{if(Dn.has(e))return;Dn.add(e),Bn(e,t);const{status:n}=v(e,{cwd:t.dirPath,shell:!0,stdio:"inherit"});Ln(e,n,{})};for(const e of["beforeExit","SIGINT","SIGTERM","SIGQUIT"])process.on(e,n)}(this.stop(e),e),`docker run --rm -it -p 8080:8080 --name ${e.dockerImageName} ${t} ${e.dockerImageName} ${n}`}stop(e){return`true $(docker rm -f $(docker container ls -q -f name=${e.dockerImageName}) 2> /dev/null)`}stopAll(){return"true $(docker rm -f $(docker ps -q) 2> /dev/null)"}};class as{constructor(e=Number(process.env.PORT)||3e3){this.defaultPort=e}buildDocker(e,t="development"){return os.buildDevImage(e,t)}startDocker(e,t){return`${this.buildDocker(e)}\n && YARN concurrently --raw --kill-others-on-fail\n "${os.stopAndStart(e,!1,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}"\n "${this.waitAndOpenApp(e,t,8080)}"`}testE2E(e,t,{playwrightArgs:n="test tests/e2e",prismaDirectory:s,startCommand:i}){const r=e.env.WB_ENV;return`WB_ENV=${r} NEXT_PUBLIC_WB_ENV=${r} APP_ENV=${r} PORT=8080 YARN concurrently --kill-others --raw --success first\n "rm -Rf ${s}/mount && ${i} && exit 1"\n "concurrently --kill-others-on-fail --raw 'wait-on -t 600000 -i 2000 http-get://127.0.0.1:8080' 'BUN playwright install --with-deps'\n && BUN playwright ${n.replace("tests/e2e",t.target||"tests/e2e")}"`}testE2EDev(e,t,{playwrightArgs:n="test tests/e2e",startCommand:s}){const i=e.env.WB_ENV;return`WB_ENV=${i} NEXT_PUBLIC_WB_ENV=${i} APP_ENV=${i} PORT=8080 YARN concurrently --kill-others --raw --success first\n "${s} && exit 1"\n "concurrently --kill-others-on-fail --raw 'wait-on -t 600000 -i 2000 http-get://127.0.0.1:8080' 'BUN playwright install --with-deps'\n && BUN playwright ${n.replace("tests/e2e",t.target||"tests/e2e")}"`}testUnit(e,t){return`WB_ENV=${e.env.WB_ENV} YARN vitest run ${t.target||"tests/unit"} --color --passWithNoTests --allowOnly`}waitApp(e,t,n=this.defaultPort){return`wait-on -t 10000 http-get://127.0.0.1:${n} 2> /dev/null\n || wait-on -t 10000 -i 500 http-get://127.0.0.1:${n} 2> /dev/null\n || wait-on -t 10000 -i 1000 http-get://127.0.0.1:${n} 2> /dev/null\n || wait-on -t 10000 -i 2000 http-get://127.0.0.1:${n} 2> /dev/null\n || wait-on -t 20000 -i 4000 http-get://127.0.0.1:${n} 2> /dev/null\n || wait-on -t 60000 -i 5000 http-get://127.0.0.1:${n}`}waitAndOpenApp(e,t,n=this.defaultPort){return`${this.waitApp(e,t,n)} || wait-on http-get://127.0.0.1:${n} && open-cli "http://\${HOST:-localhost}:${n}"`}}const cs=new class extends as{constructor(){super()}start(e,t){return`${e.env.WB_ENV?`APP_ENV=${e.env.WB_ENV} `:""}YARN concurrently --raw --kill-others-on-fail\n "blitz dev ${t.normalizedArgsText??""}"\n "${this.waitAndOpenApp(e,t)}"`}startProduction(e,t,n){return`${e.env.WB_ENV?`APP_ENV=${e.env.WB_ENV} `:""}NODE_ENV=production YARN concurrently --raw --kill-others-on-fail\n "${Mn.reset(e)} && ${e.buildCommand} && PORT=${n} pm2-runtime start ${e.findFile("ecosystem.config.cjs")} ${t.normalizedArgsText??""}"\n "${this.waitAndOpenApp(e,t,n)}"`}testE2E(e,t,{playwrightArgs:n,startCommand:s=`${Mn.reset(e)} && ${e.buildCommand} && pm2-runtime start ${e.findFile("ecosystem.config.cjs")}`}){return super.testE2E(e,t,{playwrightArgs:n,prismaDirectory:"db",startCommand:s})}testE2EDev(e,t,{playwrightArgs:n,startCommand:s="blitz dev -p 8080"}){return super.testE2EDev(e,t,{playwrightArgs:n,startCommand:s})}testStart(e,t){return`YARN concurrently --kill-others --raw --success first "blitz dev" "${this.waitApp(e,t)}"`}};const ls=new class extends as{constructor(){super()}start(e,t){return`YARN build-ts run src/index.ts ${t.watch?"--watch":""} -- ${t.normalizedArgsText??""}`}startDocker(e,t){return`${this.buildDocker(e)} && ${os.stopAndStart(e,!1,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}`}startProduction(e,t,n=8080){return`NODE_ENV=production ${e.buildCommand} && NODE_ENV=production PORT=\${PORT:-${n}} ${pn} dist/index.js ${t.normalizedArgsText??""}`}testE2E(e,t,{startCommand:n=`if [ -e "prisma" ]; then prisma migrate reset --force --skip-generate; fi && (${this.startProduction(e,t)})`}){return`NODE_ENV=production WB_ENV=${e.env.WB_ENV} PORT=8080 YARN concurrently --kill-others --raw --success first\n "${n} && exit 1"\n "wait-on -t 600000 -i 2000 http-get://127.0.0.1:8080 && vitest run ${t.target||"tests/e2e"} --color --passWithNoTests --allowOnly"`}testE2EDev(e,t,{startCommand:n}){return`NODE_ENV=production WB_ENV=${e.env.WB_ENV} PORT=8080 YARN concurrently --kill-others --raw --success first\n "${n||this.start(e,t)} && exit 1"\n "wait-on -t 600000 -i 2000 http-get://127.0.0.1:8080 && vitest run ${t.target||"tests/e2e"} --color --passWithNoTests --allowOnly"`}testStart(e,t){return`YARN concurrently --kill-others --raw --success first "${this.start(e,t)}" "${this.waitApp(e,t)}"`}};const hs=new class extends as{constructor(){super()}start(e,t){return`YARN concurrently --raw --kill-others-on-fail\n "next dev --turbo ${t.normalizedArgsText??""}"\n "${this.waitAndOpenApp(e,t)}"`}startProduction(e,t,n){return`NODE_ENV=production YARN concurrently --raw --kill-others-on-fail\n "${[...e.hasPrisma?[Mn.reset(e)]:[],e.buildCommand,`PORT=${n} pm2-runtime start ${e.findFile("ecosystem.config.cjs")} ${t.normalizedArgsText??""}`].join(" && ")}"\n "${this.waitAndOpenApp(e,t,n)}"`}testE2E(e,t,n){return super.testE2E(e,t,{playwrightArgs:n.playwrightArgs,prismaDirectory:"db",startCommand:n.startCommand??[...e.hasPrisma?[Mn.reset(e)]:[],e.buildCommand,`pm2-runtime start ${e.findFile("ecosystem.config.cjs")}`].join(" && ")})}testE2EDev(e,t,{startCommand:n="next dev --turbo -p 8080"}){return super.testE2EDev(e,t,{startCommand:n})}testStart(e,t){return`YARN concurrently --kill-others --raw --success first "next dev --turbo" "${this.waitApp(e,t)}"`}};const ds=new class extends as{constructor(){super()}start(e,t){return`YARN build-ts run src/index.ts ${t.watch?"--watch":""} -- ${t.normalizedArgsText??""}`}startDocker(e,t){return`${this.buildDocker(e)} && ${os.stopAndStart(e,!1,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}`}startProduction(e,t){return`NODE_ENV=production ${e.buildCommand} && NODE_ENV=production ${pn} dist/index.js ${t.normalizedArgsText??""}`}testE2E(){return"echo 'do nothing.'"}testE2EDev(){return"echo 'do nothing.'"}testStart(){return"echo 'do nothing.'"}};const us=new class extends as{constructor(){super()}start(e,t){return`YARN concurrently --raw --kill-others-on-fail\n "remix dev ${t.normalizedArgsText??""}"\n "${this.waitAndOpenApp(e,t)}"`}startProduction(e,t,n){return`NODE_ENV=production YARN concurrently --raw --kill-others-on-fail\n "${Mn.reset(e)} && ${e.buildCommand} && PORT=${n} pm2-runtime start ${e.findFile("ecosystem.config.cjs")} ${t.normalizedArgsText??""}"\n "${this.waitAndOpenApp(e,t,n)}"`}testE2E(e,t,{playwrightArgs:n,startCommand:s=`${Mn.reset(e)} && ${e.buildCommand} && pm2-runtime start ${e.findFile("ecosystem.config.cjs")}`}){return super.testE2E(e,t,{playwrightArgs:n,prismaDirectory:"prisma",startCommand:s})}testE2EDev(e,t,{playwrightArgs:n,startCommand:s="remix dev"}){return super.testE2EDev(e,t,{playwrightArgs:n,startCommand:s})}testStart(e,t){return`YARN concurrently --kill-others --raw --success first "remix dev" "${this.waitApp(e,t)}"`}},fs={command:"start [args..]",describe:"Start app",builder:{watch:{description:"Whether to watch files",type:"boolean"},args:{description:"Arguments for core command",type:"array",alias:"a",default:[]},"docker-options":{description:'Arguments for "docker run"',type:"array",default:[]},mode:{description:"Start mode: dev[elopment] (default) | staging | docker | docker-debug",type:"string",alias:"m"}},async handler(e){!function(e){e.normalizedArgsText=[...e.args??[],...e._?.slice(1)??[]].map((e=>`'${e}'`)).join(" "),e.normalizedDockerOptionsText=(e.dockerOptions??[]).map((e=>`'${e}'`)).join(" ")}(e);const t=await wn(e);t||(console.error(O.red("No project found.")),process.exit(1));for(const n of t.all){const t=n.packageJson.dependencies||{},s=n.packageJson.devDependencies||{};let i;if(t.blitz)i=cs;else if(t.next)i=hs;else if(s["@remix-run/dev"])i=us;else if(is.some((e=>t[e]))&&!t["firebase-functions"]||n.hasDockerfile&&/EXPOSE\s+8080/.test(n.dockerfile))i=ls;else{if(!t["build-ts"]&&!s["build-ts"])continue;i=ds}switch(console.info(`Running "start" for ${n.name} ...`),e.mode||"dev"){case"dev":case"development":{const s=ps(t,"development");await zn(`${s}${i.start(n,e)}`,n,e);break}case"staging":{const s=ps(t,"staging");await zn(`${s}${i.startProduction(n,e,8080)}`,n,e);break}case"docker":{const s=ps(t,"staging");await zn(`${s}${i.startDocker(n,e)}`,n,e);break}case"docker-debug":{const s=ps(t,"staging");e.normalizedArgsText="'/bin/bash'",await zn(`${s}${i.startDocker(n,e)}`,n,e);break}default:throw new Error(`Unknown start mode: ${e.mode}`)}}}};function ps(e,t){process.env.WB_ENV||=t;let n=`WB_ENV=${process.env.WB_ENV} `;return e.next&&(process.env.NEXT_PUBLIC_WB_ENV=process.env.WB_ENV,n+=`NEXT_PUBLIC_WB_ENV=${process.env.WB_ENV} `),n}const gs={command:"test",describe:"Test project",builder:{ci:{description:"Whether to run tests on CI",type:"boolean"},e2e:{description:"Whether to run e2e tests. You may pass mode as argument: none | headless (default) | headless-dev | headed | headed-dev | docker | docker-debug | debug | generate | trace",type:"string"},start:{description:"Whether to run start tests",type:"boolean"},unit:{description:"Whether to run unit tests",type:"boolean"},"unit-timeout":{description:"Timeout for unit tests",type:"number"},target:{description:"Test target",type:"string",alias:"t"}},async handler(t){await async function(t){const n=await wn(t);n||(console.error(O.red("No project found.")),process.exit(1));n.all.length>1&&(process.env.CI="1");process.env.FORCE_COLOR||="3",process.env.WB_ENV||="test";for(const s of n.all){const n=s.packageJson.dependencies||{},i=s.packageJson.devDependencies||{};let r;r=n.blitz?cs:n.next?hs:i["@remix-run/dev"]?us:is.some((e=>n[e]))&&!n["firebase-functions"]?ls:ds,console.info(`Running "test" for ${s.name} ...`);const o=[];if(!t.ci){switch((t.unit||!t.start&&void 0===t.e2e)&&o.push(zn(r.testUnit(s,t),s,t,{timeout:t.unitTimeout})),t.start&&o.push(zn(r.testStart(s,t),s,t)),await Promise.all(o),t.e2e){case void 0:case"none":continue;case"":case"headless":await zn(r.testE2E(s,t,{}),s,t);continue;case"headless-dev":await zn(r.testE2EDev(s,t,{}),s,t);continue;case"docker":await ms(s,t,r);continue;case"docker-debug":await ms(s,t,r,`test ${t.target||"tests/e2e"} --debug`);continue}if(n.blitz||n.next||i["@remix-run/dev"])switch(t.e2e){case"headed":await zn(r.testE2E(s,t,{playwrightArgs:`test ${t.target||"tests/e2e"} --headed`}),s,t);continue;case"headed-dev":await zn(r.testE2EDev(s,t,{playwrightArgs:`test ${t.target||"tests/e2e"} --headed`}),s,t);continue;case"debug":await zn(r.testE2E(s,t,{playwrightArgs:`test ${t.target||"tests/e2e"} --debug`}),s,t);continue;case"generate":await zn(r.testE2E(s,t,{playwrightArgs:"codegen http://localhost:8080"}),s,t);continue;case"trace":await zn("BUN playwright show-trace",s,t);continue}throw new Error(`Unknown e2e mode: ${t.e2e}`)}{const n=N(e.join(s.dirPath,"tests","unit")),i=N(e.join(s.dirPath,"tests","e2e"));if(await Tn(os.stopAll(),s,t),!1!==t.unit&&await n&&await Tn(r.testUnit(s,t).replaceAll(" --allowOnly",""),s,t,{timeout:t.unitTimeout}),!1!==t.start&&await Tn(r.testStart(s,t),s,t),await Rn.promiseAll(),"none"!==t.e2e&&await i){s.hasDockerfile&&await zn(`${r.buildDocker(s,"test")}`,s,t);const e=s.hasDockerfile?{startCommand:os.stopAndStart(s,!0)}:{};process.exitCode=await zn(r.testE2E(s,t,e).replaceAll(" --allowOnly",""),s,t,{exitIfFailed:!1}),await zn(os.stop(s),s,t)}}}}(t)}};async function ms(e,t,n,s){await zn(`${n.buildDocker(e,"test")}`,e,t),process.exitCode=await zn(`${n.testE2E(e,t,{playwrightArgs:s,startCommand:os.stopAndStart(e,!0)})}`,e,t,{exitIfFailed:!1}),await zn(os.stop(e),e,t)}const ys={command:"typecheck",describe:"Run type checking. .env files are ignored.",builder:{},async handler(e){const t=await wn(e,!1);t||(console.error(O.red("No project found.")),process.exit(1));for(const n of t.all){const s=[];if(n.packageJson.workspaces?n.hasSourceCode&&(n.packageJson.dependencies?.typescript||n.packageJson.devDependencies?.typescript)&&s.push("BUN tsc --noEmit --Pretty"):((n.packageJson.dependencies?.typescript||n.packageJson.devDependencies?.typescript)&&s.push("BUN tsc --noEmit --Pretty"),n.packageJson.devDependencies?.pyright&&s.push("YARN pyright")),0===s.length)continue;console.info(`Running "typecheck" for ${n.name} ...`),t.all.length>1&&(n.env.CI="1"),n.env.FORCE_COLOR||="3";if(0!==await zn(s.join(" && "),n,e)){(JSON.parse(await _.readFile("package.json","utf8")).dependencies||{}).blitz&&console.info(O.yellow('Please try "yarn gen-code" if you face unknown type errors.'))}}}},bs={...ys,command:"tc"},vs={env:{description:".env files to be loaded.",type:"array"},"cascade-env":{description:"Environment to load cascading .env files (e.g., `.env`, `.env.<environment>`, `.env.local` and `.env.<environment>.local`). Preferred over `cascade-node-env` and `auto-cascade-env`.",type:"string"},"cascade-node-env":{description:'Same with --cascade-env=<NODE_ENV || "development">. Preferred over `auto-cascade-env`.',type:"boolean"},"auto-cascade-env":{description:'Same with --cascade-env=<WB_ENV || NODE_ENV || "development">.',type:"boolean",default:!0},"include-root-env":{description:"Include .env files in root directory if the project is in a monorepo and --env option is not used.",type:"boolean",default:!0},"check-env":{description:"Check whether the keys of the loaded .env files are same with the given .env file.",type:"string",default:".env.example"},verbose:{description:"Whether to show verbose information",type:"boolean",alias:"v"},"working-dir":{description:"A working directory",type:"string",alias:"w"},"dry-run":{description:"Whether to skip actual command execution",type:"boolean",alias:"d"}};var ws;await cn((ws=process.argv,ws.slice(ne()+1))).scriptName("wb").options(vs).middleware((t=>{const n=t["working-dir"];if(n){const t=e.resolve(n);process.chdir(t)}!function(e){e.PATH&&e.BERRY_BIN_FOLDER&&(e.PATH=e.PATH.replace(`${e.BERRY_BIN_FOLDER}:`,"").replaceAll(/\/private\/var\/folders\/[^:]+:/g,"").replaceAll(/\/var\/tmp\/[^:]+:/g,"").replaceAll(/\/tmp\/[^:]+:/g,""));for(const t of Object.keys(e)){const n=t.toUpperCase();(n.startsWith("NPM_")||n.startsWith("YARN_")||n.startsWith("BERRY_")||"PROJECT_CWD"===n||"INIT_CWD"===n)&&delete e[t]}}(process.env)})).command(En).command(Cn).command(Un).command(ss).command(rs).command(fs).command(gs).command(ys).command(bs).demandCommand().strict().help().argv;for(const e of["SIGINT","SIGTERM","SIGQUIT"])process.on(e,(()=>process.exit()));
|
|
34
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvZW52LnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9leGlzdHMudHMiLCIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL3NwYXduLnRzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NsaXVpL2J1aWxkL2xpYi9pbmRleC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jbGl1aS9idWlsZC9saWIvc3RyaW5nLXV0aWxzLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhcmdzLXBhcnNlci9idWlsZC9saWIvc3RyaW5nLXV0aWxzLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhcmdzLXBhcnNlci9idWlsZC9saWIveWFyZ3MtcGFyc2VyLXR5cGVzLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhcmdzLXBhcnNlci9idWlsZC9saWIveWFyZ3MtcGFyc2VyLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhcmdzLXBhcnNlci9idWlsZC9saWIvaW5kZXguanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFyZ3MtcGFyc2VyL2J1aWxkL2xpYi90b2tlbml6ZS1hcmctc3RyaW5nLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhcmdzL2J1aWxkL2xpYi91dGlscy9wcm9jZXNzLWFyZ3YuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFyZ3MvYnVpbGQvbGliL3llcnJvci5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95MThuL2J1aWxkL2xpYi9wbGF0Zm9ybS1zaGltcy9ub2RlLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3kxOG4vYnVpbGQvbGliL2luZGV4LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3kxOG4vaW5kZXgubWpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhcmdzL2xpYi9wbGF0Zm9ybS1zaGltcy9lc20ubWpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NsaXVpL2luZGV4Lm1qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9lc2NhbGFkZS9zeW5jL2luZGV4Lm1qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YXJncy9idWlsZC9saWIvdHlwaW5ncy9jb21tb24tdHlwZXMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFyZ3MvYnVpbGQvbGliL3V0aWxzL2lzLXByb21pc2UuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFyZ3MvYnVpbGQvbGliL3BhcnNlLWNvbW1hbmQuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFyZ3MvYnVpbGQvbGliL2FyZ3NlcnQuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFyZ3MvYnVpbGQvbGliL21pZGRsZXdhcmUuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFyZ3MvYnVpbGQvbGliL3V0aWxzL21heWJlLWFzeW5jLXJlc3VsdC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YXJncy9idWlsZC9saWIvY29tbWFuZC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YXJncy9idWlsZC9saWIveWFyZ3MtZmFjdG9yeS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YXJncy9idWlsZC9saWIvdXRpbHMvd2hpY2gtbW9kdWxlLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhcmdzL2J1aWxkL2xpYi91dGlscy9vYmotZmlsdGVyLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhcmdzL2J1aWxkL2xpYi91dGlscy9zZXQtYmxvY2tpbmcuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFyZ3MvYnVpbGQvbGliL3VzYWdlLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhcmdzL2J1aWxkL2xpYi9jb21wbGV0aW9uLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhcmdzL2J1aWxkL2xpYi9jb21wbGV0aW9uLXRlbXBsYXRlcy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YXJncy9idWlsZC9saWIvdXRpbHMvbGV2ZW5zaHRlaW4uanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFyZ3MvYnVpbGQvbGliL3ZhbGlkYXRpb24uanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFyZ3MvYnVpbGQvbGliL3V0aWxzL2FwcGx5LWV4dGVuZHMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFyZ3MvaW5kZXgubWpzIiwiLi4vc3JjL3V0aWxzL3J1bnRpbWUudHMiLCIuLi9zcmMvcHJvamVjdC50cyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvbWVtb2l6ZS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvaGFzaC5qcyIsIi4uL3NyYy9jb21tYW5kcy9idWlsZElmTmVlZGVkLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi9zcmMvZXJyb3IudHMiLCIuLi9zcmMvY29tbWFuZHMvY29tbWFuZFV0aWxzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL29wdGltaXplRm9yRG9ja2VyQnVpbGQudHMiLCIuLi9zcmMvc2NyaXB0cy9wcmlzbWFTY3JpcHRzLnRzIiwiLi4vc3JjL3V0aWxzL3Byb2Nlc3MudHMiLCIuLi9zcmMvdXRpbHMvcHJvbWlzZVBvb2wudHMiLCIuLi9zcmMvc2NyaXB0cy9ydW4udHMiLCIuLi9zcmMvY29tbWFuZHMvcHJpc21hLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3JldHJ5LnRzIiwiLi4vc3JjL2NvbW1hbmRzL2NvbnN0YW50cy50cyIsIi4uL3NyYy9jb21tYW5kcy9zZXR1cC50cyIsIi4uL3NyYy9zY3JpcHRzL2RvY2tlclNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vYmxpdHpTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL2h0dHBTZXJ2ZXJTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL25leHRTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL3BsYWluQXBwU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9yZW1peFNjcmlwdHMudHMiLCIuLi9zcmMvY29tbWFuZHMvc3RhcnQudHMiLCIuLi9zcmMvc2NyaXB0cy9idWlsZGVyLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3Rlc3QudHMiLCIuLi9zcmMvY29tbWFuZHMvdHlwZWNoZWNrLnRzIiwiLi4vc3JjL3NoYXJlZE9wdGlvbnNCdWlsZGVyLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gJ2RvdGVudic7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuZXhwb3J0IGNvbnN0IHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYgPSB7XG4gIGVudjoge1xuICAgIGRlc2NyaXB0aW9uOiAnLmVudiBmaWxlcyB0byBiZSBsb2FkZWQuJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxuICAnY2FzY2FkZS1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnRW52aXJvbm1lbnQgdG8gbG9hZCBjYXNjYWRpbmcgLmVudiBmaWxlcyAoZS5nLiwgYC5lbnZgLCBgLmVudi48ZW52aXJvbm1lbnQ+YCwgYC5lbnYubG9jYWxgIGFuZCBgLmVudi48ZW52aXJvbm1lbnQ+LmxvY2FsYCkuIFByZWZlcnJlZCBvdmVyIGBjYXNjYWRlLW5vZGUtZW52YCBhbmQgYGF1dG8tY2FzY2FkZS1lbnZgLicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG4gICdjYXNjYWRlLW5vZGUtZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnU2FtZSB3aXRoIC0tY2FzY2FkZS1lbnY9PE5PREVfRU5WIHx8IFwiZGV2ZWxvcG1lbnRcIj4uIFByZWZlcnJlZCBvdmVyIGBhdXRvLWNhc2NhZGUtZW52YC4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgJ2F1dG8tY2FzY2FkZS1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdTYW1lIHdpdGggLS1jYXNjYWRlLWVudj08V0JfRU5WIHx8IE5PREVfRU5WIHx8IFwiZGV2ZWxvcG1lbnRcIj4uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgfSxcbiAgJ2luY2x1ZGUtcm9vdC1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdJbmNsdWRlIC5lbnYgZmlsZXMgaW4gcm9vdCBkaXJlY3RvcnkgaWYgdGhlIHByb2plY3QgaXMgaW4gYSBtb25vcmVwbyBhbmQgLS1lbnYgb3B0aW9uIGlzIG5vdCB1c2VkLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gIH0sXG4gICdjaGVjay1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdDaGVjayB3aGV0aGVyIHRoZSBrZXlzIG9mIHRoZSBsb2FkZWQgLmVudiBmaWxlcyBhcmUgc2FtZSB3aXRoIHRoZSBnaXZlbiAuZW52IGZpbGUuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBkZWZhdWx0OiAnLmVudi5leGFtcGxlJyxcbiAgfSxcbiAgdmVyYm9zZToge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBzaG93IHZlcmJvc2UgaW5mb3JtYXRpb24nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBhbGlhczogJ3YnLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgRW52UmVhZGVyT3B0aW9ucyA9IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnY+Pj47XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiByZWFkcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBgLmVudmAgZmlsZXMuIE5vdGUgaXQgZG9lcyBub3QgYXNzaWduIHRoZW0gaW4gYHByb2Nlc3MuZW52YC5cbiAqICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZEVudmlyb25tZW50VmFyaWFibGVzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBjd2Q6IHN0cmluZyxcbiAgY2FjaGVFbmFibGVkID0gdHJ1ZVxuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGxldCBlbnZQYXRocyA9IChhcmd2LmVudiA/PyBbXSkubWFwKChlbnZQYXRoKSA9PiBwYXRoLnJlc29sdmUoY3dkLCBlbnZQYXRoLnRvU3RyaW5nKCkpKTtcbiAgY29uc3QgY2FzY2FkZSA9XG4gICAgYXJndi5jYXNjYWRlRW52ID8/XG4gICAgKGFyZ3YuY2FzY2FkZU5vZGVFbnZcbiAgICAgID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgfHwgJ2RldmVsb3BtZW50J1xuICAgICAgOiBhcmd2LmF1dG9DYXNjYWRlRW52XG4gICAgICAgID8gcHJvY2Vzcy5lbnYuV0JfRU5WIHx8IHByb2Nlc3MuZW52Lk5PREVfRU5WIHx8ICdkZXZlbG9wbWVudCdcbiAgICAgICAgOiB1bmRlZmluZWQpO1xuICBpZiAodHlwZW9mIGNhc2NhZGUgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKGVudlBhdGhzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZW52UGF0aHMucHVzaChwYXRoLmpvaW4oY3dkLCAnLmVudicpKTtcbiAgICAgIGlmIChhcmd2LmluY2x1ZGVSb290RW52KSB7XG4gICAgICAgIGNvbnN0IHJvb3RQYXRoID0gcGF0aC5yZXNvbHZlKGN3ZCwgJy4uJywgJy4uJyk7XG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihyb290UGF0aCwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgICAgICAgIGVudlBhdGhzLnB1c2gocGF0aC5qb2luKHJvb3RQYXRoLCAnLmVudicpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBlbnZQYXRocyA9IGVudlBhdGhzLmZsYXRNYXAoKGVudlBhdGgpID0+XG4gICAgICBjYXNjYWRlXG4gICAgICAgID8gW2Ake2VudlBhdGh9LiR7Y2FzY2FkZX0ubG9jYWxgLCBgJHtlbnZQYXRofS5sb2NhbGAsIGAke2VudlBhdGh9LiR7Y2FzY2FkZX1gLCBlbnZQYXRoXVxuICAgICAgICA6IFtgJHtlbnZQYXRofS5sb2NhbGAsIGVudlBhdGhdXG4gICAgKTtcbiAgfVxuICBlbnZQYXRocyA9IGVudlBhdGhzLm1hcCgoZW52UGF0aCkgPT4gcGF0aC5yZWxhdGl2ZShjd2QsIGVudlBhdGgpKTtcbiAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgIGNvbnNvbGUuaW5mbyhgV0JfRU5WOiAke3Byb2Nlc3MuZW52LldCX0VOVn0sIE5PREVfRU5WOiAke3Byb2Nlc3MuZW52Lk5PREVfRU5WfWApO1xuICAgIGNvbnNvbGUuaW5mbygnUmVhZGluZyBlbnYgZmlsZXM6JywgZW52UGF0aHMpO1xuICB9XG5cbiAgbGV0IGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgY29uc3Qgb3JnRW52VmFycyA9IHsgLi4ucHJvY2Vzcy5lbnYgfTtcbiAgZm9yIChjb25zdCBlbnZQYXRoIG9mIGVudlBhdGhzKSB7XG4gICAgZW52VmFycyA9IHsgLi4ucmVhZEVudkZpbGUocGF0aC5qb2luKGN3ZCwgZW52UGF0aCksIGNhY2hlRW5hYmxlZCksIC4uLmVudlZhcnMgfTtcbiAgICBsZXQgY291bnQgPSAwO1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGVudlZhcnMpKSB7XG4gICAgICBpZiAob3JnRW52VmFyc1trZXldICE9PSB2YWx1ZSkge1xuICAgICAgICBvcmdFbnZWYXJzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgY291bnQrKztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNvdW50ID4gMCkge1xuICAgICAgY29uc29sZS5pbmZvKGBSZWFkICR7Y291bnR9IGVudmlyb25tZW50IHZhcmlhYmxlczpgLCBlbnZQYXRoKTtcbiAgICB9XG4gIH1cblxuICBpZiAoYXJndi5jaGVja0Vudikge1xuICAgIGNvbnN0IGV4YW1wbGVLZXlzID0gT2JqZWN0LmtleXMocmVhZEVudkZpbGUocGF0aC5qb2luKGN3ZCwgYXJndi5jaGVja0VudiksIGNhY2hlRW5hYmxlZCkgfHwge30pO1xuICAgIGNvbnN0IG1pc3NpbmdLZXlzID0gZXhhbXBsZUtleXMuZmlsdGVyKChrZXkpID0+ICEoa2V5IGluIGVudlZhcnMpKTtcbiAgICBpZiAobWlzc2luZ0tleXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBbJHtlbnZQYXRocy5qb2luKCcsICcpfV06IFske21pc3NpbmdLZXlzLmpvaW4oJywgJyl9XWApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZW52VmFycztcbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHJlYWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gYC5lbnZgIGZpbGVzIGFuZCBhc3NpZ24gdGhlbSBpbiBgcHJvY2Vzcy5lbnZgLlxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkQW5kQXBwbHlFbnZpcm9ubWVudFZhcmlhYmxlcyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgY3dkOiBzdHJpbmcsXG4gIGNhY2hlRW5hYmxlZCA9IHRydWVcbik6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBlbnZWYXJzID0gcmVhZEVudmlyb25tZW50VmFyaWFibGVzKGFyZ3YsIGN3ZCwgY2FjaGVFbmFibGVkKTtcbiAgT2JqZWN0LmFzc2lnbihwcm9jZXNzLmVudiwgZW52VmFycyk7XG4gIHJldHVybiBlbnZWYXJzO1xufVxuXG5jb25zdCBjYWNoZWRFbnZWYXJzID0gbmV3IE1hcDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KCk7XG5cbmZ1bmN0aW9uIHJlYWRFbnZGaWxlKGZpbGVQYXRoOiBzdHJpbmcsIGNhY2hlRW5hYmxlZCA9IHRydWUpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgY2FjaGVkID0gY2FjaGVFbmFibGVkICYmIGNhY2hlZEVudlZhcnMuZ2V0KGZpbGVQYXRoKTtcbiAgaWYgKGNhY2hlZCkgcmV0dXJuIGNhY2hlZDtcblxuICBjb25zdCBwYXJzZWQgPSBjb25maWcoeyBwYXRoOiBwYXRoLnJlc29sdmUoZmlsZVBhdGgpLCBwcm9jZXNzRW52OiB7fSB9KS5wYXJzZWQgPz8ge307XG4gIGlmIChjYWNoZUVuYWJsZWQpIHtcbiAgICBjYWNoZWRFbnZWYXJzLnNldChmaWxlUGF0aCwgcGFyc2VkKTtcbiAgfVxuICByZXR1cm4gcGFyc2VkO1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmVtb3ZlcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgcmVsYXRlZCB0byBucG0gYW5kIHlhcm4gZnJvbSB0aGUgZ2l2ZW4gZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMoZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPik6IHZvaWQge1xuICAvLyBSZW1vdmUgbnBtICYgeWFybiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBwcm9jZXNzLmVudlxuICBpZiAoZW52VmFycy5QQVRIICYmIGVudlZhcnMuQkVSUllfQklOX0ZPTERFUikge1xuICAgIGVudlZhcnMuUEFUSCA9IGVudlZhcnMuUEFUSC5yZXBsYWNlKGAke2VudlZhcnMuQkVSUllfQklOX0ZPTERFUn06YCwgJycpXG4gICAgICAvLyBUZW1wb3JhcnkgZGlyZWN0b3J5IGluIG1hY09TXG4gICAgICAucmVwbGFjZUFsbCgvXFwvcHJpdmF0ZVxcL3ZhclxcL2ZvbGRlcnNcXC9bXjpdKzovZywgJycpXG4gICAgICAvLyBUZW1wb3JhcnkgZGlyZWN0b3JpZXMgaW4gTGludXhcbiAgICAgIC5yZXBsYWNlQWxsKC9cXC92YXJcXC90bXBcXC9bXjpdKzovZywgJycpXG4gICAgICAucmVwbGFjZUFsbCgvXFwvdG1wXFwvW146XSs6L2csICcnKTtcbiAgfVxuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhlbnZWYXJzKSkge1xuICAgIGNvbnN0IHVwcGVyS2V5ID0ga2V5LnRvVXBwZXJDYXNlKCk7XG4gICAgaWYgKFxuICAgICAgdXBwZXJLZXkuc3RhcnRzV2l0aCgnTlBNXycpIHx8XG4gICAgICB1cHBlcktleS5zdGFydHNXaXRoKCdZQVJOXycpIHx8XG4gICAgICB1cHBlcktleS5zdGFydHNXaXRoKCdCRVJSWV8nKSB8fFxuICAgICAgdXBwZXJLZXkgPT09ICdQUk9KRUNUX0NXRCcgfHxcbiAgICAgIHVwcGVyS2V5ID09PSAnSU5JVF9DV0QnXG4gICAgKSB7XG4gICAgICBkZWxldGUgZW52VmFyc1trZXldO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZXhpc3RzQXN5bmMoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBmcy5hY2Nlc3MoZmlsZVBhdGgsIGZzLmNvbnN0YW50cy5GX09LLCAoZXJyKSA9PiB7XG4gICAgICByZXNvbHZlKCFlcnIpO1xuICAgIH0pO1xuICB9KTtcbn1cbiIsImltcG9ydCB0eXBlIHtcbiAgU3Bhd25PcHRpb25zLFxuICBTcGF3bk9wdGlvbnNXaXRob3V0U3RkaW8sXG4gIFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlLFxuICBTcGF3blN5bmNSZXR1cm5zLFxuICBTdGRpb051bGwsXG4gIFN0ZGlvUGlwZSxcbn0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB7IHNwYXduIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHRyZWVLaWxsIGZyb20gJ3RyZWUta2lsbCc7XG5cbmV4cG9ydCB0eXBlIFNwYXduQXN5bmNSZXR1cm5zID0gT21pdDxTcGF3blN5bmNSZXR1cm5zPHN0cmluZz4sICdvdXRwdXQnIHwgJ2Vycm9yJz47XG5cbmV4cG9ydCB0eXBlIFNwYXduQXN5bmNPcHRpb25zID0gKFxuICB8IFNwYXduT3B0aW9uc1dpdGhvdXRTdGRpb1xuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvUGlwZSwgU3RkaW9QaXBlLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9QaXBlLCBTdGRpb1BpcGUsIFN0ZGlvTnVsbD5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb1BpcGUsIFN0ZGlvTnVsbCwgU3RkaW9QaXBlPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvTnVsbCwgU3RkaW9QaXBlLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9QaXBlLCBTdGRpb051bGwsIFN0ZGlvTnVsbD5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb051bGwsIFN0ZGlvUGlwZSwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvTnVsbCwgU3RkaW9OdWxsLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9OdWxsLCBTdGRpb051bGwsIFN0ZGlvTnVsbD5cbiAgfCBTcGF3bk9wdGlvbnNcbikgJiB7XG4gIGlucHV0Pzogc3RyaW5nO1xuICBtZXJnZU91dEFuZEVycm9yPzogYm9vbGVhbjtcbiAga2lsbE9uRXhpdD86IGJvb2xlYW47XG4gIHZlcmJvc2U/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNwYXduQXN5bmMoXG4gIGNvbW1hbmQ6IHN0cmluZyxcbiAgYXJncz86IFJlYWRvbmx5QXJyYXk8c3RyaW5nPixcbiAgb3B0aW9ucz86IFNwYXduQXN5bmNPcHRpb25zXG4pOiBQcm9taXNlPFNwYXduQXN5bmNSZXR1cm5zPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHByb2MgPSBzcGF3bihjb21tYW5kLCBhcmdzID8/IFtdLCBvcHRpb25zID8/IHt9KTtcbiAgICAgIC8vIGBzZXRFbmNvZGluZ2AgaXMgdW5kZWZpbmVkIGluIEJ1blxuICAgICAgcHJvYy5zdGRvdXQ/LnNldEVuY29kaW5nPy4oJ3V0ZjgnKTtcbiAgICAgIHByb2Muc3RkZXJyPy5zZXRFbmNvZGluZz8uKCd1dGY4Jyk7XG5cbiAgICAgIGxldCBzdGRvdXQgPSAnJztcbiAgICAgIGxldCBzdGRlcnIgPSAnJztcbiAgICAgIHByb2Muc3Rkb3V0Py5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgICAgIHN0ZG91dCArPSBkYXRhO1xuICAgICAgfSk7XG4gICAgICBwcm9jLnN0ZGVycj8ub24oJ2RhdGEnLCAoZGF0YSkgPT4ge1xuICAgICAgICBpZiAob3B0aW9ucz8ubWVyZ2VPdXRBbmRFcnJvcikge1xuICAgICAgICAgIHN0ZG91dCArPSBkYXRhO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0ZGVyciArPSBkYXRhO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgbGV0IHN0b3BwZWQgPSBmYWxzZTtcbiAgICAgIGNvbnN0IHN0b3BQcm9jZXNzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAoc3RvcHBlZCB8fCAhcHJvYy5waWQpIHJldHVybjtcblxuICAgICAgICBzdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKG9wdGlvbnM/LnZlcmJvc2UpIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oYHRyZWVLaWxsKCR7cHJvYy5waWR9KWApO1xuICAgICAgICB9XG4gICAgICAgIHRyZWVLaWxsKHByb2MucGlkKTtcbiAgICAgIH07XG4gICAgICBpZiAob3B0aW9ucz8ua2lsbE9uRXhpdCkge1xuICAgICAgICBwcm9jZXNzLm9uKCdiZWZvcmVFeGl0Jywgc3RvcFByb2Nlc3MpO1xuICAgICAgICBwcm9jZXNzLm9uKCdTSUdJTlQnLCBzdG9wUHJvY2Vzcyk7XG4gICAgICB9XG5cbiAgICAgIHByb2Mub24oJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ2JlZm9yZUV4aXQnLCBzdG9wUHJvY2Vzcyk7XG4gICAgICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ1NJR0lOVCcsIHN0b3BQcm9jZXNzKTtcbiAgICAgICAgcHJvYy5yZW1vdmVBbGxMaXN0ZW5lcnMoJ2Nsb3NlJyk7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9KTtcbiAgICAgIHByb2Mub24oJ2Nsb3NlJywgKGNvZGU6IG51bWJlciB8IG51bGwsIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCBudWxsKSA9PiB7XG4gICAgICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ2JlZm9yZUV4aXQnLCBzdG9wUHJvY2Vzcyk7XG4gICAgICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ1NJR0lOVCcsIHN0b3BQcm9jZXNzKTtcbiAgICAgICAgaWYgKHByb2MucGlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdQcm9jZXNzIGhhcyBubyBwaWQuJykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgcGlkOiBwcm9jLnBpZCxcbiAgICAgICAgICAgIHN0ZG91dCxcbiAgICAgICAgICAgIHN0ZGVycixcbiAgICAgICAgICAgIHN0YXR1czogY29kZSxcbiAgICAgICAgICAgIHNpZ25hbCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmIChvcHRpb25zPy5pbnB1dCkge1xuICAgICAgICBwcm9jLnN0ZGluPy53cml0ZShvcHRpb25zLmlucHV0KTtcbiAgICAgICAgcHJvYy5zdGRpbj8uZW5kKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJlamVjdChlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcbmNvbnN0IGFsaWduID0ge1xuICAgIHJpZ2h0OiBhbGlnblJpZ2h0LFxuICAgIGNlbnRlcjogYWxpZ25DZW50ZXJcbn07XG5jb25zdCB0b3AgPSAwO1xuY29uc3QgcmlnaHQgPSAxO1xuY29uc3QgYm90dG9tID0gMjtcbmNvbnN0IGxlZnQgPSAzO1xuZXhwb3J0IGNsYXNzIFVJIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdGhpcy53aWR0aCA9IG9wdHMud2lkdGg7XG4gICAgICAgIHRoaXMud3JhcCA9IChfYSA9IG9wdHMud3JhcCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdHJ1ZTtcbiAgICAgICAgdGhpcy5yb3dzID0gW107XG4gICAgfVxuICAgIHNwYW4oLi4uYXJncykge1xuICAgICAgICBjb25zdCBjb2xzID0gdGhpcy5kaXYoLi4uYXJncyk7XG4gICAgICAgIGNvbHMuc3BhbiA9IHRydWU7XG4gICAgfVxuICAgIHJlc2V0T3V0cHV0KCkge1xuICAgICAgICB0aGlzLnJvd3MgPSBbXTtcbiAgICB9XG4gICAgZGl2KC4uLmFyZ3MpIHtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmRpdignJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMud3JhcCAmJiB0aGlzLnNob3VsZEFwcGx5TGF5b3V0RFNMKC4uLmFyZ3MpICYmIHR5cGVvZiBhcmdzWzBdID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXBwbHlMYXlvdXREU0woYXJnc1swXSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29scyA9IGFyZ3MubWFwKGFyZyA9PiB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGFyZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb2xGcm9tU3RyaW5nKGFyZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXJnO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5yb3dzLnB1c2goY29scyk7XG4gICAgICAgIHJldHVybiBjb2xzO1xuICAgIH1cbiAgICBzaG91bGRBcHBseUxheW91dERTTCguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiBhcmdzLmxlbmd0aCA9PT0gMSAmJiB0eXBlb2YgYXJnc1swXSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgICAgIC9bXFx0XFxuXS8udGVzdChhcmdzWzBdKTtcbiAgICB9XG4gICAgYXBwbHlMYXlvdXREU0woc3RyKSB7XG4gICAgICAgIGNvbnN0IHJvd3MgPSBzdHIuc3BsaXQoJ1xcbicpLm1hcChyb3cgPT4gcm93LnNwbGl0KCdcXHQnKSk7XG4gICAgICAgIGxldCBsZWZ0Q29sdW1uV2lkdGggPSAwO1xuICAgICAgICAvLyBzaW1wbGUgaGV1cmlzdGljIGZvciBsYXlvdXQsIG1ha2Ugc3VyZSB0aGVcbiAgICAgICAgLy8gc2Vjb25kIGNvbHVtbiBsaW5lcyB1cCBhbG9uZyB0aGUgbGVmdC1oYW5kLlxuICAgICAgICAvLyBkb24ndCBhbGxvdyB0aGUgZmlyc3QgY29sdW1uIHRvIHRha2UgdXAgbW9yZVxuICAgICAgICAvLyB0aGFuIDUwJSBvZiB0aGUgc2NyZWVuLlxuICAgICAgICByb3dzLmZvckVhY2goY29sdW1ucyA9PiB7XG4gICAgICAgICAgICBpZiAoY29sdW1ucy5sZW5ndGggPiAxICYmIG1peGluLnN0cmluZ1dpZHRoKGNvbHVtbnNbMF0pID4gbGVmdENvbHVtbldpZHRoKSB7XG4gICAgICAgICAgICAgICAgbGVmdENvbHVtbldpZHRoID0gTWF0aC5taW4oTWF0aC5mbG9vcih0aGlzLndpZHRoICogMC41KSwgbWl4aW4uc3RyaW5nV2lkdGgoY29sdW1uc1swXSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgLy8gZ2VuZXJhdGUgYSB0YWJsZTpcbiAgICAgICAgLy8gIHJlcGxhY2luZyAnICcgd2l0aCBwYWRkaW5nIGNhbGN1bGF0aW9ucy5cbiAgICAgICAgLy8gIHVzaW5nIHRoZSBhbGdvcml0aG1pY2FsbHkgZ2VuZXJhdGVkIHdpZHRoLlxuICAgICAgICByb3dzLmZvckVhY2goY29sdW1ucyA9PiB7XG4gICAgICAgICAgICB0aGlzLmRpdiguLi5jb2x1bW5zLm1hcCgociwgaSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHRleHQ6IHIudHJpbSgpLFxuICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiB0aGlzLm1lYXN1cmVQYWRkaW5nKHIpLFxuICAgICAgICAgICAgICAgICAgICB3aWR0aDogKGkgPT09IDAgJiYgY29sdW1ucy5sZW5ndGggPiAxKSA/IGxlZnRDb2x1bW5XaWR0aCA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5yb3dzW3RoaXMucm93cy5sZW5ndGggLSAxXTtcbiAgICB9XG4gICAgY29sRnJvbVN0cmluZyh0ZXh0KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0ZXh0LFxuICAgICAgICAgICAgcGFkZGluZzogdGhpcy5tZWFzdXJlUGFkZGluZyh0ZXh0KVxuICAgICAgICB9O1xuICAgIH1cbiAgICBtZWFzdXJlUGFkZGluZyhzdHIpIHtcbiAgICAgICAgLy8gbWVhc3VyZSBwYWRkaW5nIHdpdGhvdXQgYW5zaSBlc2NhcGUgY29kZXNcbiAgICAgICAgY29uc3Qgbm9BbnNpID0gbWl4aW4uc3RyaXBBbnNpKHN0cik7XG4gICAgICAgIHJldHVybiBbMCwgbm9BbnNpLm1hdGNoKC9cXHMqJC8pWzBdLmxlbmd0aCwgMCwgbm9BbnNpLm1hdGNoKC9eXFxzKi8pWzBdLmxlbmd0aF07XG4gICAgfVxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICBjb25zdCBsaW5lcyA9IFtdO1xuICAgICAgICB0aGlzLnJvd3MuZm9yRWFjaChyb3cgPT4ge1xuICAgICAgICAgICAgdGhpcy5yb3dUb1N0cmluZyhyb3csIGxpbmVzKTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGRvbid0IGRpc3BsYXkgYW55IGxpbmVzIHdpdGggdGhlXG4gICAgICAgIC8vIGhpZGRlbiBmbGFnIHNldC5cbiAgICAgICAgcmV0dXJuIGxpbmVzXG4gICAgICAgICAgICAuZmlsdGVyKGxpbmUgPT4gIWxpbmUuaGlkZGVuKVxuICAgICAgICAgICAgLm1hcChsaW5lID0+IGxpbmUudGV4dClcbiAgICAgICAgICAgIC5qb2luKCdcXG4nKTtcbiAgICB9XG4gICAgcm93VG9TdHJpbmcocm93LCBsaW5lcykge1xuICAgICAgICB0aGlzLnJhc3Rlcml6ZShyb3cpLmZvckVhY2goKHJyb3csIHIpID0+IHtcbiAgICAgICAgICAgIGxldCBzdHIgPSAnJztcbiAgICAgICAgICAgIHJyb3cuZm9yRWFjaCgoY29sLCBjKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyB3aWR0aCB9ID0gcm93W2NdOyAvLyB0aGUgd2lkdGggd2l0aCBwYWRkaW5nLlxuICAgICAgICAgICAgICAgIGNvbnN0IHdyYXBXaWR0aCA9IHRoaXMubmVnYXRlUGFkZGluZyhyb3dbY10pOyAvLyB0aGUgd2lkdGggd2l0aG91dCBwYWRkaW5nLlxuICAgICAgICAgICAgICAgIGxldCB0cyA9IGNvbDsgLy8gdGVtcG9yYXJ5IHN0cmluZyB1c2VkIGR1cmluZyBhbGlnbm1lbnQvcGFkZGluZy5cbiAgICAgICAgICAgICAgICBpZiAod3JhcFdpZHRoID4gbWl4aW4uc3RyaW5nV2lkdGgoY29sKSkge1xuICAgICAgICAgICAgICAgICAgICB0cyArPSAnICcucmVwZWF0KHdyYXBXaWR0aCAtIG1peGluLnN0cmluZ1dpZHRoKGNvbCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBhbGlnbiB0aGUgc3RyaW5nIHdpdGhpbiBpdHMgY29sdW1uLlxuICAgICAgICAgICAgICAgIGlmIChyb3dbY10uYWxpZ24gJiYgcm93W2NdLmFsaWduICE9PSAnbGVmdCcgJiYgdGhpcy53cmFwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZuID0gYWxpZ25bcm93W2NdLmFsaWduXTtcbiAgICAgICAgICAgICAgICAgICAgdHMgPSBmbih0cywgd3JhcFdpZHRoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1peGluLnN0cmluZ1dpZHRoKHRzKSA8IHdyYXBXaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHMgKz0gJyAnLnJlcGVhdCgod2lkdGggfHwgMCkgLSBtaXhpbi5zdHJpbmdXaWR0aCh0cykgLSAxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBhcHBseSBib3JkZXIgYW5kIHBhZGRpbmcgdG8gc3RyaW5nLlxuICAgICAgICAgICAgICAgIGNvbnN0IHBhZGRpbmcgPSByb3dbY10ucGFkZGluZyB8fCBbMCwgMCwgMCwgMF07XG4gICAgICAgICAgICAgICAgaWYgKHBhZGRpbmdbbGVmdF0pIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyICs9ICcgJy5yZXBlYXQocGFkZGluZ1tsZWZ0XSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN0ciArPSBhZGRCb3JkZXIocm93W2NdLCB0cywgJ3wgJyk7XG4gICAgICAgICAgICAgICAgc3RyICs9IHRzO1xuICAgICAgICAgICAgICAgIHN0ciArPSBhZGRCb3JkZXIocm93W2NdLCB0cywgJyB8Jyk7XG4gICAgICAgICAgICAgICAgaWYgKHBhZGRpbmdbcmlnaHRdKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0ciArPSAnICcucmVwZWF0KHBhZGRpbmdbcmlnaHRdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gaWYgcHJpb3Igcm93IGlzIHNwYW4sIHRyeSB0byByZW5kZXIgdGhlXG4gICAgICAgICAgICAgICAgLy8gY3VycmVudCByb3cgb24gdGhlIHByaW9yIGxpbmUuXG4gICAgICAgICAgICAgICAgaWYgKHIgPT09IDAgJiYgbGluZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBzdHIgPSB0aGlzLnJlbmRlcklubGluZShzdHIsIGxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIHJlbW92ZSB0cmFpbGluZyB3aGl0ZXNwYWNlLlxuICAgICAgICAgICAgbGluZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgdGV4dDogc3RyLnJlcGxhY2UoLyArJC8sICcnKSxcbiAgICAgICAgICAgICAgICBzcGFuOiByb3cuc3BhblxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbGluZXM7XG4gICAgfVxuICAgIC8vIGlmIHRoZSBmdWxsICdzb3VyY2UnIGNhbiByZW5kZXIgaW5cbiAgICAvLyB0aGUgdGFyZ2V0IGxpbmUsIGRvIHNvLlxuICAgIHJlbmRlcklubGluZShzb3VyY2UsIHByZXZpb3VzTGluZSkge1xuICAgICAgICBjb25zdCBtYXRjaCA9IHNvdXJjZS5tYXRjaCgvXiAqLyk7XG4gICAgICAgIGNvbnN0IGxlYWRpbmdXaGl0ZXNwYWNlID0gbWF0Y2ggPyBtYXRjaFswXS5sZW5ndGggOiAwO1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBwcmV2aW91c0xpbmUudGV4dDtcbiAgICAgICAgY29uc3QgdGFyZ2V0VGV4dFdpZHRoID0gbWl4aW4uc3RyaW5nV2lkdGgodGFyZ2V0LnRyaW1SaWdodCgpKTtcbiAgICAgICAgaWYgKCFwcmV2aW91c0xpbmUuc3Bhbikge1xuICAgICAgICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBpZiB3ZSdyZSBub3QgYXBwbHlpbmcgd3JhcHBpbmcgbG9naWMsXG4gICAgICAgIC8vIGp1c3QgYWx3YXlzIGFwcGVuZCB0byB0aGUgc3Bhbi5cbiAgICAgICAgaWYgKCF0aGlzLndyYXApIHtcbiAgICAgICAgICAgIHByZXZpb3VzTGluZS5oaWRkZW4gPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIHRhcmdldCArIHNvdXJjZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGVhZGluZ1doaXRlc3BhY2UgPCB0YXJnZXRUZXh0V2lkdGgpIHtcbiAgICAgICAgICAgIHJldHVybiBzb3VyY2U7XG4gICAgICAgIH1cbiAgICAgICAgcHJldmlvdXNMaW5lLmhpZGRlbiA9IHRydWU7XG4gICAgICAgIHJldHVybiB0YXJnZXQudHJpbVJpZ2h0KCkgKyAnICcucmVwZWF0KGxlYWRpbmdXaGl0ZXNwYWNlIC0gdGFyZ2V0VGV4dFdpZHRoKSArIHNvdXJjZS50cmltTGVmdCgpO1xuICAgIH1cbiAgICByYXN0ZXJpemUocm93KSB7XG4gICAgICAgIGNvbnN0IHJyb3dzID0gW107XG4gICAgICAgIGNvbnN0IHdpZHRocyA9IHRoaXMuY29sdW1uV2lkdGhzKHJvdyk7XG4gICAgICAgIGxldCB3cmFwcGVkO1xuICAgICAgICAvLyB3b3JkIHdyYXAgYWxsIGNvbHVtbnMsIGFuZCBjcmVhdGVcbiAgICAgICAgLy8gYSBkYXRhLXN0cnVjdHVyZSB0aGF0IGlzIGVhc3kgdG8gcmFzdGVyaXplLlxuICAgICAgICByb3cuZm9yRWFjaCgoY29sLCBjKSA9PiB7XG4gICAgICAgICAgICAvLyBsZWF2ZSByb29tIGZvciBsZWZ0IGFuZCByaWdodCBwYWRkaW5nLlxuICAgICAgICAgICAgY29sLndpZHRoID0gd2lkdGhzW2NdO1xuICAgICAgICAgICAgaWYgKHRoaXMud3JhcCkge1xuICAgICAgICAgICAgICAgIHdyYXBwZWQgPSBtaXhpbi53cmFwKGNvbC50ZXh0LCB0aGlzLm5lZ2F0ZVBhZGRpbmcoY29sKSwgeyBoYXJkOiB0cnVlIH0pLnNwbGl0KCdcXG4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHdyYXBwZWQgPSBjb2wudGV4dC5zcGxpdCgnXFxuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY29sLmJvcmRlcikge1xuICAgICAgICAgICAgICAgIHdyYXBwZWQudW5zaGlmdCgnLicgKyAnLScucmVwZWF0KHRoaXMubmVnYXRlUGFkZGluZyhjb2wpICsgMikgKyAnLicpO1xuICAgICAgICAgICAgICAgIHdyYXBwZWQucHVzaChcIidcIiArICctJy5yZXBlYXQodGhpcy5uZWdhdGVQYWRkaW5nKGNvbCkgKyAyKSArIFwiJ1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGFkZCB0b3AgYW5kIGJvdHRvbSBwYWRkaW5nLlxuICAgICAgICAgICAgaWYgKGNvbC5wYWRkaW5nKSB7XG4gICAgICAgICAgICAgICAgd3JhcHBlZC51bnNoaWZ0KC4uLm5ldyBBcnJheShjb2wucGFkZGluZ1t0b3BdIHx8IDApLmZpbGwoJycpKTtcbiAgICAgICAgICAgICAgICB3cmFwcGVkLnB1c2goLi4ubmV3IEFycmF5KGNvbC5wYWRkaW5nW2JvdHRvbV0gfHwgMCkuZmlsbCgnJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd3JhcHBlZC5mb3JFYWNoKChzdHIsIHIpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXJyb3dzW3JdKSB7XG4gICAgICAgICAgICAgICAgICAgIHJyb3dzLnB1c2goW10pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBycm93ID0gcnJvd3Nbcl07XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJyb3dbaV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcnJvdy5wdXNoKCcnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBycm93LnB1c2goc3RyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJyb3dzO1xuICAgIH1cbiAgICBuZWdhdGVQYWRkaW5nKGNvbCkge1xuICAgICAgICBsZXQgd3JhcFdpZHRoID0gY29sLndpZHRoIHx8IDA7XG4gICAgICAgIGlmIChjb2wucGFkZGluZykge1xuICAgICAgICAgICAgd3JhcFdpZHRoIC09IChjb2wucGFkZGluZ1tsZWZ0XSB8fCAwKSArIChjb2wucGFkZGluZ1tyaWdodF0gfHwgMCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbC5ib3JkZXIpIHtcbiAgICAgICAgICAgIHdyYXBXaWR0aCAtPSA0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cmFwV2lkdGg7XG4gICAgfVxuICAgIGNvbHVtbldpZHRocyhyb3cpIHtcbiAgICAgICAgaWYgKCF0aGlzLndyYXApIHtcbiAgICAgICAgICAgIHJldHVybiByb3cubWFwKGNvbCA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbC53aWR0aCB8fCBtaXhpbi5zdHJpbmdXaWR0aChjb2wudGV4dCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgdW5zZXQgPSByb3cubGVuZ3RoO1xuICAgICAgICBsZXQgcmVtYWluaW5nV2lkdGggPSB0aGlzLndpZHRoO1xuICAgICAgICAvLyBjb2x1bW4gd2lkdGhzIGNhbiBiZSBzZXQgaW4gY29uZmlnLlxuICAgICAgICBjb25zdCB3aWR0aHMgPSByb3cubWFwKGNvbCA9PiB7XG4gICAgICAgICAgICBpZiAoY29sLndpZHRoKSB7XG4gICAgICAgICAgICAgICAgdW5zZXQtLTtcbiAgICAgICAgICAgICAgICByZW1haW5pbmdXaWR0aCAtPSBjb2wud2lkdGg7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbC53aWR0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBhbnkgdW5zZXQgd2lkdGhzIHNob3VsZCBiZSBjYWxjdWxhdGVkLlxuICAgICAgICBjb25zdCB1bnNldFdpZHRoID0gdW5zZXQgPyBNYXRoLmZsb29yKHJlbWFpbmluZ1dpZHRoIC8gdW5zZXQpIDogMDtcbiAgICAgICAgcmV0dXJuIHdpZHRocy5tYXAoKHcsIGkpID0+IHtcbiAgICAgICAgICAgIGlmICh3ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5tYXgodW5zZXRXaWR0aCwgX21pbldpZHRoKHJvd1tpXSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHc7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGFkZEJvcmRlcihjb2wsIHRzLCBzdHlsZSkge1xuICAgIGlmIChjb2wuYm9yZGVyKSB7XG4gICAgICAgIGlmICgvWy4nXS0rWy4nXS8udGVzdCh0cykpIHtcbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHMudHJpbSgpLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHN0eWxlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnICAnO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG59XG4vLyBjYWxjdWxhdGVzIHRoZSBtaW5pbXVtIHdpZHRoIG9mXG4vLyBhIGNvbHVtbiwgYmFzZWQgb24gcGFkZGluZyBwcmVmZXJlbmNlcy5cbmZ1bmN0aW9uIF9taW5XaWR0aChjb2wpIHtcbiAgICBjb25zdCBwYWRkaW5nID0gY29sLnBhZGRpbmcgfHwgW107XG4gICAgY29uc3QgbWluV2lkdGggPSAxICsgKHBhZGRpbmdbbGVmdF0gfHwgMCkgKyAocGFkZGluZ1tyaWdodF0gfHwgMCk7XG4gICAgaWYgKGNvbC5ib3JkZXIpIHtcbiAgICAgICAgcmV0dXJuIG1pbldpZHRoICsgNDtcbiAgICB9XG4gICAgcmV0dXJuIG1pbldpZHRoO1xufVxuZnVuY3Rpb24gZ2V0V2luZG93V2lkdGgoKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQ6IGRlcGVuZHMgb24gdGVybWluYWwgKi9cbiAgICBpZiAodHlwZW9mIHByb2Nlc3MgPT09ICdvYmplY3QnICYmIHByb2Nlc3Muc3Rkb3V0ICYmIHByb2Nlc3Muc3Rkb3V0LmNvbHVtbnMpIHtcbiAgICAgICAgcmV0dXJuIHByb2Nlc3Muc3Rkb3V0LmNvbHVtbnM7XG4gICAgfVxuICAgIHJldHVybiA4MDtcbn1cbmZ1bmN0aW9uIGFsaWduUmlnaHQoc3RyLCB3aWR0aCkge1xuICAgIHN0ciA9IHN0ci50cmltKCk7XG4gICAgY29uc3Qgc3RyV2lkdGggPSBtaXhpbi5zdHJpbmdXaWR0aChzdHIpO1xuICAgIGlmIChzdHJXaWR0aCA8IHdpZHRoKSB7XG4gICAgICAgIHJldHVybiAnICcucmVwZWF0KHdpZHRoIC0gc3RyV2lkdGgpICsgc3RyO1xuICAgIH1cbiAgICByZXR1cm4gc3RyO1xufVxuZnVuY3Rpb24gYWxpZ25DZW50ZXIoc3RyLCB3aWR0aCkge1xuICAgIHN0ciA9IHN0ci50cmltKCk7XG4gICAgY29uc3Qgc3RyV2lkdGggPSBtaXhpbi5zdHJpbmdXaWR0aChzdHIpO1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgaWYgKHN0cldpZHRoID49IHdpZHRoKSB7XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuICAgIHJldHVybiAnICcucmVwZWF0KCh3aWR0aCAtIHN0cldpZHRoKSA+PiAxKSArIHN0cjtcbn1cbmxldCBtaXhpbjtcbmV4cG9ydCBmdW5jdGlvbiBjbGl1aShvcHRzLCBfbWl4aW4pIHtcbiAgICBtaXhpbiA9IF9taXhpbjtcbiAgICByZXR1cm4gbmV3IFVJKHtcbiAgICAgICAgd2lkdGg6IChvcHRzID09PSBudWxsIHx8IG9wdHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdHMud2lkdGgpIHx8IGdldFdpbmRvd1dpZHRoKCksXG4gICAgICAgIHdyYXA6IG9wdHMgPT09IG51bGwgfHwgb3B0cyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0cy53cmFwXG4gICAgfSk7XG59XG4iLCIvLyBNaW5pbWFsIHJlcGxhY2VtZW50IGZvciBhbnNpIHN0cmluZyBoZWxwZXJzIFwid3JhcC1hbnNpXCIgYW5kIFwic3RyaXAtYW5zaVwiLlxuLy8gdG8gZmFjaWxpdGF0ZSBFU00gYW5kIERlbm8gbW9kdWxlcy5cbi8vIFRPRE86IGxvb2sgYXQgcG9ydGluZyBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS93cmFwLWFuc2kgdG8gRVNNLlxuLy8gVGhlIG5wbSBhcHBsaWNhdGlvblxuLy8gQ29weXJpZ2h0IChjKSBucG0sIEluYy4gYW5kIENvbnRyaWJ1dG9yc1xuLy8gTGljZW5zZWQgb24gdGhlIHRlcm1zIG9mIFRoZSBBcnRpc3RpYyBMaWNlbnNlIDIuMFxuLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vbnBtL2NsaS9ibG9iLzRjNjVjZDk1MmJjODYyNzgxMTczNWJlYTc2YjliMTEwY2M0ZmM4MGUvbGliL3V0aWxzL2Fuc2ktdHJpbS5qc1xuY29uc3QgYW5zaSA9IG5ldyBSZWdFeHAoJ1xceDFiKD86XFxcXFsoPzpcXFxcZCtbQUJDREVGR0pLU1RtXXxcXFxcZCs7XFxcXGQrW0hmbV18JyArXG4gICAgJ1xcXFxkKztcXFxcZCs7XFxcXGQrbXw2bnxzfHV8XFxcXD8yNVtsaF0pfFxcXFx3KScsICdnJyk7XG5leHBvcnQgZnVuY3Rpb24gc3RyaXBBbnNpKHN0cikge1xuICAgIHJldHVybiBzdHIucmVwbGFjZShhbnNpLCAnJyk7XG59XG5leHBvcnQgZnVuY3Rpb24gd3JhcChzdHIsIHdpZHRoKSB7XG4gICAgY29uc3QgW3N0YXJ0LCBlbmRdID0gc3RyLm1hdGNoKGFuc2kpIHx8IFsnJywgJyddO1xuICAgIHN0ciA9IHN0cmlwQW5zaShzdHIpO1xuICAgIGxldCB3cmFwcGVkID0gJyc7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGkgIT09IDAgJiYgKGkgJSB3aWR0aCkgPT09IDApIHtcbiAgICAgICAgICAgIHdyYXBwZWQgKz0gJ1xcbic7XG4gICAgICAgIH1cbiAgICAgICAgd3JhcHBlZCArPSBzdHIuY2hhckF0KGkpO1xuICAgIH1cbiAgICBpZiAoc3RhcnQgJiYgZW5kKSB7XG4gICAgICAgIHdyYXBwZWQgPSBgJHtzdGFydH0ke3dyYXBwZWR9JHtlbmR9YDtcbiAgICB9XG4gICAgcmV0dXJuIHdyYXBwZWQ7XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYsIENvbnRyaWJ1dG9yc1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IElTQ1xuICovXG5leHBvcnQgZnVuY3Rpb24gY2FtZWxDYXNlKHN0cikge1xuICAgIC8vIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSBhbiBhcmd1bWVudCBpcyBwcm92aWRlZCBhcyBjYW1lbCBjYXNlLCBlLmcuLCBmb29CYXIuXG4gICAgLy8gYnkgZW5zdXJpbmcgdGhhdCB0aGUgc3RyaW5nIGlzbid0IGFscmVhZHkgbWl4ZWQgY2FzZTpcbiAgICBjb25zdCBpc0NhbWVsQ2FzZSA9IHN0ciAhPT0gc3RyLnRvTG93ZXJDYXNlKCkgJiYgc3RyICE9PSBzdHIudG9VcHBlckNhc2UoKTtcbiAgICBpZiAoIWlzQ2FtZWxDYXNlKSB7XG4gICAgICAgIHN0ciA9IHN0ci50b0xvd2VyQ2FzZSgpO1xuICAgIH1cbiAgICBpZiAoc3RyLmluZGV4T2YoJy0nKSA9PT0gLTEgJiYgc3RyLmluZGV4T2YoJ18nKSA9PT0gLTEpIHtcbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGxldCBjYW1lbGNhc2UgPSAnJztcbiAgICAgICAgbGV0IG5leHRDaHJVcHBlciA9IGZhbHNlO1xuICAgICAgICBjb25zdCBsZWFkaW5nSHlwaGVucyA9IHN0ci5tYXRjaCgvXi0rLyk7XG4gICAgICAgIGZvciAobGV0IGkgPSBsZWFkaW5nSHlwaGVucyA/IGxlYWRpbmdIeXBoZW5zWzBdLmxlbmd0aCA6IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjaHIgPSBzdHIuY2hhckF0KGkpO1xuICAgICAgICAgICAgaWYgKG5leHRDaHJVcHBlcikge1xuICAgICAgICAgICAgICAgIG5leHRDaHJVcHBlciA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGNociA9IGNoci50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGkgIT09IDAgJiYgKGNociA9PT0gJy0nIHx8IGNociA9PT0gJ18nKSkge1xuICAgICAgICAgICAgICAgIG5leHRDaHJVcHBlciA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaHIgIT09ICctJyAmJiBjaHIgIT09ICdfJykge1xuICAgICAgICAgICAgICAgIGNhbWVsY2FzZSArPSBjaHI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNhbWVsY2FzZTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gZGVjYW1lbGl6ZShzdHIsIGpvaW5TdHJpbmcpIHtcbiAgICBjb25zdCBsb3dlcmNhc2UgPSBzdHIudG9Mb3dlckNhc2UoKTtcbiAgICBqb2luU3RyaW5nID0gam9pblN0cmluZyB8fCAnLSc7XG4gICAgbGV0IG5vdENhbWVsY2FzZSA9ICcnO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGNockxvd2VyID0gbG93ZXJjYXNlLmNoYXJBdChpKTtcbiAgICAgICAgY29uc3QgY2hyU3RyaW5nID0gc3RyLmNoYXJBdChpKTtcbiAgICAgICAgaWYgKGNockxvd2VyICE9PSBjaHJTdHJpbmcgJiYgaSA+IDApIHtcbiAgICAgICAgICAgIG5vdENhbWVsY2FzZSArPSBgJHtqb2luU3RyaW5nfSR7bG93ZXJjYXNlLmNoYXJBdChpKX1gO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbm90Q2FtZWxjYXNlICs9IGNoclN0cmluZztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbm90Q2FtZWxjYXNlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGxvb2tzTGlrZU51bWJlcih4KSB7XG4gICAgaWYgKHggPT09IG51bGwgfHwgeCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgLy8gaWYgbG9hZGVkIGZyb20gY29uZmlnLCBtYXkgYWxyZWFkeSBiZSBhIG51bWJlci5cbiAgICBpZiAodHlwZW9mIHggPT09ICdudW1iZXInKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAvLyBoZXhhZGVjaW1hbC5cbiAgICBpZiAoL14weFswLTlhLWZdKyQvaS50ZXN0KHgpKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAvLyBkb24ndCB0cmVhdCAwMTIzIGFzIGEgbnVtYmVyOyBhcyBpdCBkcm9wcyB0aGUgbGVhZGluZyAnMCcuXG4gICAgaWYgKC9eMFteLl0vLnRlc3QoeCkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gL15bLV0/KD86XFxkKyg/OlxcLlxcZCopP3xcXC5cXGQrKShlWy0rXT9cXGQrKT8kLy50ZXN0KHgpO1xufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IChjKSAyMDE2LCBDb250cmlidXRvcnNcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBJU0NcbiAqL1xuZXhwb3J0IHZhciBEZWZhdWx0VmFsdWVzRm9yVHlwZUtleTtcbihmdW5jdGlvbiAoRGVmYXVsdFZhbHVlc0ZvclR5cGVLZXkpIHtcbiAgICBEZWZhdWx0VmFsdWVzRm9yVHlwZUtleVtcIkJPT0xFQU5cIl0gPSBcImJvb2xlYW5cIjtcbiAgICBEZWZhdWx0VmFsdWVzRm9yVHlwZUtleVtcIlNUUklOR1wiXSA9IFwic3RyaW5nXCI7XG4gICAgRGVmYXVsdFZhbHVlc0ZvclR5cGVLZXlbXCJOVU1CRVJcIl0gPSBcIm51bWJlclwiO1xuICAgIERlZmF1bHRWYWx1ZXNGb3JUeXBlS2V5W1wiQVJSQVlcIl0gPSBcImFycmF5XCI7XG59KShEZWZhdWx0VmFsdWVzRm9yVHlwZUtleSB8fCAoRGVmYXVsdFZhbHVlc0ZvclR5cGVLZXkgPSB7fSkpO1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IChjKSAyMDE2LCBDb250cmlidXRvcnNcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBJU0NcbiAqL1xuaW1wb3J0IHsgdG9rZW5pemVBcmdTdHJpbmcgfSBmcm9tICcuL3Rva2VuaXplLWFyZy1zdHJpbmcuanMnO1xuaW1wb3J0IHsgRGVmYXVsdFZhbHVlc0ZvclR5cGVLZXkgfSBmcm9tICcuL3lhcmdzLXBhcnNlci10eXBlcy5qcyc7XG5pbXBvcnQgeyBjYW1lbENhc2UsIGRlY2FtZWxpemUsIGxvb2tzTGlrZU51bWJlciB9IGZyb20gJy4vc3RyaW5nLXV0aWxzLmpzJztcbmxldCBtaXhpbjtcbmV4cG9ydCBjbGFzcyBZYXJnc1BhcnNlciB7XG4gICAgY29uc3RydWN0b3IoX21peGluKSB7XG4gICAgICAgIG1peGluID0gX21peGluO1xuICAgIH1cbiAgICBwYXJzZShhcmdzSW5wdXQsIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3Qgb3B0cyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAgICAgYWxpYXM6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGFycmF5OiB1bmRlZmluZWQsXG4gICAgICAgICAgICBib29sZWFuOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBjb25maWc6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGNvbmZpZ09iamVjdHM6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGNvbmZpZ3VyYXRpb246IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGNvZXJjZTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgY291bnQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGVudlByZWZpeDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgbmFyZzogdW5kZWZpbmVkLFxuICAgICAgICAgICAgbm9ybWFsaXplOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBzdHJpbmc6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG51bWJlcjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgX186IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGtleTogdW5kZWZpbmVkXG4gICAgICAgIH0sIG9wdGlvbnMpO1xuICAgICAgICAvLyBhbGxvdyBhIHN0cmluZyBhcmd1bWVudCB0byBiZSBwYXNzZWQgaW4gcmF0aGVyXG4gICAgICAgIC8vIHRoYW4gYW4gYXJndiBhcnJheS5cbiAgICAgICAgY29uc3QgYXJncyA9IHRva2VuaXplQXJnU3RyaW5nKGFyZ3NJbnB1dCk7XG4gICAgICAgIC8vIHRva2VuaXplQXJnU3RyaW5nIGFkZHMgZXh0cmEgcXVvdGVzIHRvIGFyZ3MgaWYgYXJnc0lucHV0IGlzIGEgc3RyaW5nXG4gICAgICAgIC8vIG9ubHkgc3RyaXAgdGhvc2UgZXh0cmEgcXVvdGVzIGluIHByb2Nlc3NWYWx1ZSBpZiBhcmdzSW5wdXQgaXMgYSBzdHJpbmdcbiAgICAgICAgY29uc3QgaW5wdXRJc1N0cmluZyA9IHR5cGVvZiBhcmdzSW5wdXQgPT09ICdzdHJpbmcnO1xuICAgICAgICAvLyBhbGlhc2VzIG1pZ2h0IGhhdmUgdHJhbnNpdGl2ZSByZWxhdGlvbnNoaXBzLCBub3JtYWxpemUgdGhpcy5cbiAgICAgICAgY29uc3QgYWxpYXNlcyA9IGNvbWJpbmVBbGlhc2VzKE9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShudWxsKSwgb3B0cy5hbGlhcykpO1xuICAgICAgICBjb25zdCBjb25maWd1cmF0aW9uID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgICAnYm9vbGVhbi1uZWdhdGlvbic6IHRydWUsXG4gICAgICAgICAgICAnY2FtZWwtY2FzZS1leHBhbnNpb24nOiB0cnVlLFxuICAgICAgICAgICAgJ2NvbWJpbmUtYXJyYXlzJzogZmFsc2UsXG4gICAgICAgICAgICAnZG90LW5vdGF0aW9uJzogdHJ1ZSxcbiAgICAgICAgICAgICdkdXBsaWNhdGUtYXJndW1lbnRzLWFycmF5JzogdHJ1ZSxcbiAgICAgICAgICAgICdmbGF0dGVuLWR1cGxpY2F0ZS1hcnJheXMnOiB0cnVlLFxuICAgICAgICAgICAgJ2dyZWVkeS1hcnJheXMnOiB0cnVlLFxuICAgICAgICAgICAgJ2hhbHQtYXQtbm9uLW9wdGlvbic6IGZhbHNlLFxuICAgICAgICAgICAgJ25hcmdzLWVhdHMtb3B0aW9ucyc6IGZhbHNlLFxuICAgICAgICAgICAgJ25lZ2F0aW9uLXByZWZpeCc6ICduby0nLFxuICAgICAgICAgICAgJ3BhcnNlLW51bWJlcnMnOiB0cnVlLFxuICAgICAgICAgICAgJ3BhcnNlLXBvc2l0aW9uYWwtbnVtYmVycyc6IHRydWUsXG4gICAgICAgICAgICAncG9wdWxhdGUtLSc6IGZhbHNlLFxuICAgICAgICAgICAgJ3NldC1wbGFjZWhvbGRlci1rZXknOiBmYWxzZSxcbiAgICAgICAgICAgICdzaG9ydC1vcHRpb24tZ3JvdXBzJzogdHJ1ZSxcbiAgICAgICAgICAgICdzdHJpcC1hbGlhc2VkJzogZmFsc2UsXG4gICAgICAgICAgICAnc3RyaXAtZGFzaGVkJzogZmFsc2UsXG4gICAgICAgICAgICAndW5rbm93bi1vcHRpb25zLWFzLWFyZ3MnOiBmYWxzZVxuICAgICAgICB9LCBvcHRzLmNvbmZpZ3VyYXRpb24pO1xuICAgICAgICBjb25zdCBkZWZhdWx0cyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShudWxsKSwgb3B0cy5kZWZhdWx0KTtcbiAgICAgICAgY29uc3QgY29uZmlnT2JqZWN0cyA9IG9wdHMuY29uZmlnT2JqZWN0cyB8fCBbXTtcbiAgICAgICAgY29uc3QgZW52UHJlZml4ID0gb3B0cy5lbnZQcmVmaXg7XG4gICAgICAgIGNvbnN0IG5vdEZsYWdzT3B0aW9uID0gY29uZmlndXJhdGlvblsncG9wdWxhdGUtLSddO1xuICAgICAgICBjb25zdCBub3RGbGFnc0FyZ3YgPSBub3RGbGFnc09wdGlvbiA/ICctLScgOiAnXyc7XG4gICAgICAgIGNvbnN0IG5ld0FsaWFzZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBjb25zdCBkZWZhdWx0ZWQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAvLyBhbGxvdyBhIGkxOG4gaGFuZGxlciB0byBiZSBwYXNzZWQgaW4sIGRlZmF1bHQgdG8gYSBmYWtlIG9uZSAodXRpbC5mb3JtYXQpLlxuICAgICAgICBjb25zdCBfXyA9IG9wdHMuX18gfHwgbWl4aW4uZm9ybWF0O1xuICAgICAgICBjb25zdCBmbGFncyA9IHtcbiAgICAgICAgICAgIGFsaWFzZXM6IE9iamVjdC5jcmVhdGUobnVsbCksXG4gICAgICAgICAgICBhcnJheXM6IE9iamVjdC5jcmVhdGUobnVsbCksXG4gICAgICAgICAgICBib29sczogT2JqZWN0LmNyZWF0ZShudWxsKSxcbiAgICAgICAgICAgIHN0cmluZ3M6IE9iamVjdC5jcmVhdGUobnVsbCksXG4gICAgICAgICAgICBudW1iZXJzOiBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgICAgICAgY291bnRzOiBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgICAgICAgbm9ybWFsaXplOiBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgICAgICAgY29uZmlnczogT2JqZWN0LmNyZWF0ZShudWxsKSxcbiAgICAgICAgICAgIG5hcmdzOiBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgICAgICAgY29lcmNpb25zOiBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgICAgICAga2V5czogW11cbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgbmVnYXRpdmUgPSAvXi0oWzAtOV0rKFxcLlswLTldKyk/fFxcLlswLTldKykkLztcbiAgICAgICAgY29uc3QgbmVnYXRlZEJvb2xlYW4gPSBuZXcgUmVnRXhwKCdeLS0nICsgY29uZmlndXJhdGlvblsnbmVnYXRpb24tcHJlZml4J10gKyAnKC4rKScpO1xuICAgICAgICBbXS5jb25jYXQob3B0cy5hcnJheSB8fCBbXSkuZmlsdGVyKEJvb2xlYW4pLmZvckVhY2goZnVuY3Rpb24gKG9wdCkge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gdHlwZW9mIG9wdCA9PT0gJ29iamVjdCcgPyBvcHQua2V5IDogb3B0O1xuICAgICAgICAgICAgLy8gYXNzaWduIHRvIGZsYWdzW2Jvb2xzfHN0cmluZ3N8bnVtYmVyc11cbiAgICAgICAgICAgIGNvbnN0IGFzc2lnbm1lbnQgPSBPYmplY3Qua2V5cyhvcHQpLm1hcChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYXJyYXlGbGFnS2V5cyA9IHtcbiAgICAgICAgICAgICAgICAgICAgYm9vbGVhbjogJ2Jvb2xzJyxcbiAgICAgICAgICAgICAgICAgICAgc3RyaW5nOiAnc3RyaW5ncycsXG4gICAgICAgICAgICAgICAgICAgIG51bWJlcjogJ251bWJlcnMnXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXlGbGFnS2V5c1trZXldO1xuICAgICAgICAgICAgfSkuZmlsdGVyKEJvb2xlYW4pLnBvcCgpO1xuICAgICAgICAgICAgLy8gYXNzaWduIGtleSB0byBiZSBjb2VyY2VkXG4gICAgICAgICAgICBpZiAoYXNzaWdubWVudCkge1xuICAgICAgICAgICAgICAgIGZsYWdzW2Fzc2lnbm1lbnRdW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmxhZ3MuYXJyYXlzW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgZmxhZ3Mua2V5cy5wdXNoKGtleSk7XG4gICAgICAgIH0pO1xuICAgICAgICBbXS5jb25jYXQob3B0cy5ib29sZWFuIHx8IFtdKS5maWx0ZXIoQm9vbGVhbikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICBmbGFncy5ib29sc1trZXldID0gdHJ1ZTtcbiAgICAgICAgICAgIGZsYWdzLmtleXMucHVzaChrZXkpO1xuICAgICAgICB9KTtcbiAgICAgICAgW10uY29uY2F0KG9wdHMuc3RyaW5nIHx8IFtdKS5maWx0ZXIoQm9vbGVhbikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICBmbGFncy5zdHJpbmdzW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgZmxhZ3Mua2V5cy5wdXNoKGtleSk7XG4gICAgICAgIH0pO1xuICAgICAgICBbXS5jb25jYXQob3B0cy5udW1iZXIgfHwgW10pLmZpbHRlcihCb29sZWFuKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgIGZsYWdzLm51bWJlcnNba2V5XSA9IHRydWU7XG4gICAgICAgICAgICBmbGFncy5rZXlzLnB1c2goa2V5KTtcbiAgICAgICAgfSk7XG4gICAgICAgIFtdLmNvbmNhdChvcHRzLmNvdW50IHx8IFtdKS5maWx0ZXIoQm9vbGVhbikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICBmbGFncy5jb3VudHNba2V5XSA9IHRydWU7XG4gICAgICAgICAgICBmbGFncy5rZXlzLnB1c2goa2V5KTtcbiAgICAgICAgfSk7XG4gICAgICAgIFtdLmNvbmNhdChvcHRzLm5vcm1hbGl6ZSB8fCBbXSkuZmlsdGVyKEJvb2xlYW4pLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgZmxhZ3Mubm9ybWFsaXplW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgZmxhZ3Mua2V5cy5wdXNoKGtleSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodHlwZW9mIG9wdHMubmFyZyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKG9wdHMubmFyZykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3MubmFyZ3Nba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBmbGFncy5rZXlzLnB1c2goa2V5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG9wdHMuY29lcmNlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMob3B0cy5jb2VyY2UpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3MuY29lcmNpb25zW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3Mua2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBvcHRzLmNvbmZpZyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9wdHMuY29uZmlnKSB8fCB0eXBlb2Ygb3B0cy5jb25maWcgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgO1xuICAgICAgICAgICAgICAgIFtdLmNvbmNhdChvcHRzLmNvbmZpZykuZmlsdGVyKEJvb2xlYW4pLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgICAgICBmbGFncy5jb25maWdzW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIG9wdHMuY29uZmlnID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKG9wdHMuY29uZmlnKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MuY29uZmlnc1trZXldID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBjcmVhdGUgYSBsb29rdXAgdGFibGUgdGhhdCB0YWtlcyBpbnRvIGFjY291bnQgYWxsXG4gICAgICAgIC8vIGNvbWJpbmF0aW9ucyBvZiBhbGlhc2VzOiB7ZjogWydmb28nXSwgZm9vOiBbJ2YnXX1cbiAgICAgICAgZXh0ZW5kQWxpYXNlcyhvcHRzLmtleSwgYWxpYXNlcywgb3B0cy5kZWZhdWx0LCBmbGFncy5hcnJheXMpO1xuICAgICAgICAvLyBhcHBseSBkZWZhdWx0IHZhbHVlcyB0byBhbGwgYWxpYXNlcy5cbiAgICAgICAgT2JqZWN0LmtleXMoZGVmYXVsdHMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgKGZsYWdzLmFsaWFzZXNba2V5XSB8fCBbXSkuZm9yRWFjaChmdW5jdGlvbiAoYWxpYXMpIHtcbiAgICAgICAgICAgICAgICBkZWZhdWx0c1thbGlhc10gPSBkZWZhdWx0c1trZXldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgZXJyb3IgPSBudWxsO1xuICAgICAgICBjaGVja0NvbmZpZ3VyYXRpb24oKTtcbiAgICAgICAgbGV0IG5vdEZsYWdzID0gW107XG4gICAgICAgIGNvbnN0IGFyZ3YgPSBPYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobnVsbCksIHsgXzogW10gfSk7XG4gICAgICAgIC8vIFRPRE8oYmNvZSk6IGZvciB0aGUgZmlyc3QgcGFzcyBhdCByZW1vdmluZyBvYmplY3QgcHJvdG90eXBlICB3ZSBkaWRuJ3RcbiAgICAgICAgLy8gcmVtb3ZlIGFsbCBwcm90b3R5cGVzIGZyb20gb2JqZWN0cyByZXR1cm5lZCBieSB0aGlzIEFQSSwgd2UgbWlnaHQgd2FudFxuICAgICAgICAvLyB0byBncmFkdWFsbHkgbW92ZSB0b3dhcmRzIGRvaW5nIHNvLlxuICAgICAgICBjb25zdCBhcmd2UmV0dXJuID0ge307XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgYXJnID0gYXJnc1tpXTtcbiAgICAgICAgICAgIGNvbnN0IHRydW5jYXRlZEFyZyA9IGFyZy5yZXBsYWNlKC9eLXszLH0vLCAnLS0tJyk7XG4gICAgICAgICAgICBsZXQgYnJva2VuO1xuICAgICAgICAgICAgbGV0IGtleTtcbiAgICAgICAgICAgIGxldCBsZXR0ZXJzO1xuICAgICAgICAgICAgbGV0IG07XG4gICAgICAgICAgICBsZXQgbmV4dDtcbiAgICAgICAgICAgIGxldCB2YWx1ZTtcbiAgICAgICAgICAgIC8vIGFueSB1bmtub3duIG9wdGlvbiAoZXhjZXB0IGZvciBlbmQtb2Ytb3B0aW9ucywgXCItLVwiKVxuICAgICAgICAgICAgaWYgKGFyZyAhPT0gJy0tJyAmJiAvXi0vLnRlc3QoYXJnKSAmJiBpc1Vua25vd25PcHRpb25Bc0FyZyhhcmcpKSB7XG4gICAgICAgICAgICAgICAgcHVzaFBvc2l0aW9uYWwoYXJnKTtcbiAgICAgICAgICAgICAgICAvLyAtLS0sIC0tLT0sIC0tLS0sIGV0YyxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRydW5jYXRlZEFyZy5tYXRjaCgvXi0tLSsoPXwkKS8pKSB7XG4gICAgICAgICAgICAgICAgLy8gb3B0aW9ucyB3aXRob3V0IGtleSBuYW1lIGFyZSBpbnZhbGlkLlxuICAgICAgICAgICAgICAgIHB1c2hQb3NpdGlvbmFsKGFyZyk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgLy8gLS0gc2VwYXJhdGVkIGJ5ID1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGFyZy5tYXRjaCgvXi0tLis9LykgfHwgKCFjb25maWd1cmF0aW9uWydzaG9ydC1vcHRpb24tZ3JvdXBzJ10gJiYgYXJnLm1hdGNoKC9eLS4rPS8pKSkge1xuICAgICAgICAgICAgICAgIC8vIFVzaW5nIFtcXHNcXFNdIGluc3RlYWQgb2YgLiBiZWNhdXNlIGpzIGRvZXNuJ3Qgc3VwcG9ydCB0aGVcbiAgICAgICAgICAgICAgICAvLyAnZG90YWxsJyByZWdleCBtb2RpZmllci4gU2VlOlxuICAgICAgICAgICAgICAgIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzEwNjgzMDgvMTMyMTZcbiAgICAgICAgICAgICAgICBtID0gYXJnLm1hdGNoKC9eLS0/KFtePV0rKT0oW1xcc1xcU10qKSQvKTtcbiAgICAgICAgICAgICAgICAvLyBhcnJheXMgZm9ybWF0ID0gJy0tZj1hIGIgYydcbiAgICAgICAgICAgICAgICBpZiAobSAhPT0gbnVsbCAmJiBBcnJheS5pc0FycmF5KG0pICYmIG0ubGVuZ3RoID49IDMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoZWNrQWxsQWxpYXNlcyhtWzFdLCBmbGFncy5hcnJheXMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpID0gZWF0QXJyYXkoaSwgbVsxXSwgYXJncywgbVsyXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2tBbGxBbGlhc2VzKG1bMV0sIGZsYWdzLm5hcmdzKSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5hcmdzIGZvcm1hdCA9ICctLWY9bW9ua2V5IHdhc2hpbmcgY2F0J1xuICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGVhdE5hcmdzKGksIG1bMV0sIGFyZ3MsIG1bMl0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKG1bMV0sIG1bMl0sIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYXJnLm1hdGNoKG5lZ2F0ZWRCb29sZWFuKSAmJiBjb25maWd1cmF0aW9uWydib29sZWFuLW5lZ2F0aW9uJ10pIHtcbiAgICAgICAgICAgICAgICBtID0gYXJnLm1hdGNoKG5lZ2F0ZWRCb29sZWFuKTtcbiAgICAgICAgICAgICAgICBpZiAobSAhPT0gbnVsbCAmJiBBcnJheS5pc0FycmF5KG0pICYmIG0ubGVuZ3RoID49IDIpIHtcbiAgICAgICAgICAgICAgICAgICAga2V5ID0gbVsxXTtcbiAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYXJyYXlzKSA/IFtmYWxzZV0gOiBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIC0tIHNlcGFyYXRlZCBieSBzcGFjZS5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGFyZy5tYXRjaCgvXi0tLisvKSB8fCAoIWNvbmZpZ3VyYXRpb25bJ3Nob3J0LW9wdGlvbi1ncm91cHMnXSAmJiBhcmcubWF0Y2goL14tW14tXSsvKSkpIHtcbiAgICAgICAgICAgICAgICBtID0gYXJnLm1hdGNoKC9eLS0/KC4rKS8pO1xuICAgICAgICAgICAgICAgIGlmIChtICE9PSBudWxsICYmIEFycmF5LmlzQXJyYXkobSkgJiYgbS5sZW5ndGggPj0gMikge1xuICAgICAgICAgICAgICAgICAgICBrZXkgPSBtWzFdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYXJyYXlzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJyYXkgZm9ybWF0ID0gJy0tZm9vIGEgYiBjJ1xuICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGVhdEFycmF5KGksIGtleSwgYXJncyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MubmFyZ3MpICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmFyZ3MgZm9ybWF0ID0gJy0tZm9vIGEgYiBjJ1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2hvdWxkIGJlIHRydXRoeSBldmVuIGlmOiBmbGFncy5uYXJnc1trZXldID09PSAwXG4gICAgICAgICAgICAgICAgICAgICAgICBpID0gZWF0TmFyZ3MoaSwga2V5LCBhcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgPSBhcmdzW2kgKyAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0ICE9PSB1bmRlZmluZWQgJiYgKCFuZXh0Lm1hdGNoKC9eLS8pIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dC5tYXRjaChuZWdhdGl2ZSkpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIWNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLmJvb2xzKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICFjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5jb3VudHMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgbmV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoL14odHJ1ZXxmYWxzZSkkLy50ZXN0KG5leHQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgbmV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgZGVmYXVsdFZhbHVlKGtleSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGRvdC1ub3RhdGlvbiBmbGFnIHNlcGFyYXRlZCBieSAnPScuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChhcmcubWF0Y2goL14tLlxcLi4rPS8pKSB7XG4gICAgICAgICAgICAgICAgbSA9IGFyZy5tYXRjaCgvXi0oW149XSspPShbXFxzXFxTXSopJC8pO1xuICAgICAgICAgICAgICAgIGlmIChtICE9PSBudWxsICYmIEFycmF5LmlzQXJyYXkobSkgJiYgbS5sZW5ndGggPj0gMykge1xuICAgICAgICAgICAgICAgICAgICBzZXRBcmcobVsxXSwgbVsyXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGRvdC1ub3RhdGlvbiBmbGFnIHNlcGFyYXRlZCBieSBzcGFjZS5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGFyZy5tYXRjaCgvXi0uXFwuLisvKSAmJiAhYXJnLm1hdGNoKG5lZ2F0aXZlKSkge1xuICAgICAgICAgICAgICAgIG5leHQgPSBhcmdzW2kgKyAxXTtcbiAgICAgICAgICAgICAgICBtID0gYXJnLm1hdGNoKC9eLSguXFwuLispLyk7XG4gICAgICAgICAgICAgICAgaWYgKG0gIT09IG51bGwgJiYgQXJyYXkuaXNBcnJheShtKSAmJiBtLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIGtleSA9IG1bMV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0ICE9PSB1bmRlZmluZWQgJiYgIW5leHQubWF0Y2goL14tLykgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICFjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5ib29scykgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICFjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5jb3VudHMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRBcmcoa2V5LCBuZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEFyZyhrZXksIGRlZmF1bHRWYWx1ZShrZXkpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGFyZy5tYXRjaCgvXi1bXi1dKy8pICYmICFhcmcubWF0Y2gobmVnYXRpdmUpKSB7XG4gICAgICAgICAgICAgICAgbGV0dGVycyA9IGFyZy5zbGljZSgxLCAtMSkuc3BsaXQoJycpO1xuICAgICAgICAgICAgICAgIGJyb2tlbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbGV0dGVycy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICBuZXh0ID0gYXJnLnNsaWNlKGogKyAyKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxldHRlcnNbaiArIDFdICYmIGxldHRlcnNbaiArIDFdID09PSAnPScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gYXJnLnNsaWNlKGogKyAzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IGxldHRlcnNbal07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYXJyYXlzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFycmF5IGZvcm1hdCA9ICctZj1hIGIgYydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gZWF0QXJyYXkoaSwga2V5LCBhcmdzLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5uYXJncykgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmFyZ3MgZm9ybWF0ID0gJy1mPW1vbmtleSB3YXNoaW5nIGNhdCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gZWF0TmFyZ3MoaSwga2V5LCBhcmdzLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRBcmcoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicm9rZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHQgPT09ICctJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGxldHRlcnNbal0sIG5leHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gY3VycmVudCBsZXR0ZXIgaXMgYW4gYWxwaGFiZXRpYyBjaGFyYWN0ZXIgYW5kIG5leHQgdmFsdWUgaXMgYSBudW1iZXJcbiAgICAgICAgICAgICAgICAgICAgaWYgKC9bQS1aYS16XS8udGVzdChsZXR0ZXJzW2pdKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgL14tP1xcZCsoXFwuXFxkKik/KGUtP1xcZCspPyQvLnRlc3QobmV4dCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrQWxsQWxpYXNlcyhuZXh0LCBmbGFncy5ib29scykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRBcmcobGV0dGVyc1tqXSwgbmV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicm9rZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGxldHRlcnNbaiArIDFdICYmIGxldHRlcnNbaiArIDFdLm1hdGNoKC9cXFcvKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGxldHRlcnNbal0sIG5leHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJva2VuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGxldHRlcnNbal0sIGRlZmF1bHRWYWx1ZShsZXR0ZXJzW2pdKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAga2V5ID0gYXJnLnNsaWNlKC0xKVswXTtcbiAgICAgICAgICAgICAgICBpZiAoIWJyb2tlbiAmJiBrZXkgIT09ICctJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYXJyYXlzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJyYXkgZm9ybWF0ID0gJy1mIGEgYiBjJ1xuICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGVhdEFycmF5KGksIGtleSwgYXJncyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MubmFyZ3MpICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmFyZ3MgZm9ybWF0ID0gJy1mIGEgYiBjJ1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2hvdWxkIGJlIHRydXRoeSBldmVuIGlmOiBmbGFncy5uYXJnc1trZXldID09PSAwXG4gICAgICAgICAgICAgICAgICAgICAgICBpID0gZWF0TmFyZ3MoaSwga2V5LCBhcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgPSBhcmdzW2kgKyAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0ICE9PSB1bmRlZmluZWQgJiYgKCEvXigtfC0tKVteLV0vLnRlc3QobmV4dCkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0Lm1hdGNoKG5lZ2F0aXZlKSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYm9vbHMpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIWNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLmNvdW50cykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRBcmcoa2V5LCBuZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgvXih0cnVlfGZhbHNlKSQvLnRlc3QobmV4dCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRBcmcoa2V5LCBuZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRBcmcoa2V5LCBkZWZhdWx0VmFsdWUoa2V5KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChhcmcubWF0Y2goL14tWzAtOV0kLykgJiZcbiAgICAgICAgICAgICAgICBhcmcubWF0Y2gobmVnYXRpdmUpICYmXG4gICAgICAgICAgICAgICAgY2hlY2tBbGxBbGlhc2VzKGFyZy5zbGljZSgxKSwgZmxhZ3MuYm9vbHMpKSB7XG4gICAgICAgICAgICAgICAgLy8gc2luZ2xlLWRpZ2l0IGJvb2xlYW4gYWxpYXMsIGUuZzogeGFyZ3MgLTBcbiAgICAgICAgICAgICAgICBrZXkgPSBhcmcuc2xpY2UoMSk7XG4gICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgZGVmYXVsdFZhbHVlKGtleSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYXJnID09PSAnLS0nKSB7XG4gICAgICAgICAgICAgICAgbm90RmxhZ3MgPSBhcmdzLnNsaWNlKGkgKyAxKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNvbmZpZ3VyYXRpb25bJ2hhbHQtYXQtbm9uLW9wdGlvbiddKSB7XG4gICAgICAgICAgICAgICAgbm90RmxhZ3MgPSBhcmdzLnNsaWNlKGkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcHVzaFBvc2l0aW9uYWwoYXJnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBvcmRlciBvZiBwcmVjZWRlbmNlOlxuICAgICAgICAvLyAxLiBjb21tYW5kIGxpbmUgYXJnXG4gICAgICAgIC8vIDIuIHZhbHVlIGZyb20gZW52IHZhclxuICAgICAgICAvLyAzLiB2YWx1ZSBmcm9tIGNvbmZpZyBmaWxlXG4gICAgICAgIC8vIDQuIHZhbHVlIGZyb20gY29uZmlnIG9iamVjdHNcbiAgICAgICAgLy8gNS4gY29uZmlndXJlZCBkZWZhdWx0IHZhbHVlXG4gICAgICAgIGFwcGx5RW52VmFycyhhcmd2LCB0cnVlKTsgLy8gc3BlY2lhbCBjYXNlOiBjaGVjayBlbnYgdmFycyB0aGF0IHBvaW50IHRvIGNvbmZpZyBmaWxlXG4gICAgICAgIGFwcGx5RW52VmFycyhhcmd2LCBmYWxzZSk7XG4gICAgICAgIHNldENvbmZpZyhhcmd2KTtcbiAgICAgICAgc2V0Q29uZmlnT2JqZWN0cygpO1xuICAgICAgICBhcHBseURlZmF1bHRzQW5kQWxpYXNlcyhhcmd2LCBmbGFncy5hbGlhc2VzLCBkZWZhdWx0cywgdHJ1ZSk7XG4gICAgICAgIGFwcGx5Q29lcmNpb25zKGFyZ3YpO1xuICAgICAgICBpZiAoY29uZmlndXJhdGlvblsnc2V0LXBsYWNlaG9sZGVyLWtleSddKVxuICAgICAgICAgICAgc2V0UGxhY2Vob2xkZXJLZXlzKGFyZ3YpO1xuICAgICAgICAvLyBmb3IgYW55IGNvdW50cyBlaXRoZXIgbm90IGluIGFyZ3Mgb3Igd2l0aG91dCBhbiBleHBsaWNpdCBkZWZhdWx0LCBzZXQgdG8gMFxuICAgICAgICBPYmplY3Qua2V5cyhmbGFncy5jb3VudHMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgaWYgKCFoYXNLZXkoYXJndiwga2V5LnNwbGl0KCcuJykpKVxuICAgICAgICAgICAgICAgIHNldEFyZyhrZXksIDApO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gJy0tJyBkZWZhdWx0cyB0byB1bmRlZmluZWQuXG4gICAgICAgIGlmIChub3RGbGFnc09wdGlvbiAmJiBub3RGbGFncy5sZW5ndGgpXG4gICAgICAgICAgICBhcmd2W25vdEZsYWdzQXJndl0gPSBbXTtcbiAgICAgICAgbm90RmxhZ3MuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICBhcmd2W25vdEZsYWdzQXJndl0ucHVzaChrZXkpO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb25bJ2NhbWVsLWNhc2UtZXhwYW5zaW9uJ10gJiYgY29uZmlndXJhdGlvblsnc3RyaXAtZGFzaGVkJ10pIHtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGFyZ3YpLmZpbHRlcihrZXkgPT4ga2V5ICE9PSAnLS0nICYmIGtleS5pbmNsdWRlcygnLScpKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGFyZ3Zba2V5XTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWd1cmF0aW9uWydzdHJpcC1hbGlhc2VkJ10pIHtcbiAgICAgICAgICAgIDtcbiAgICAgICAgICAgIFtdLmNvbmNhdCguLi5PYmplY3Qua2V5cyhhbGlhc2VzKS5tYXAoayA9PiBhbGlhc2VzW2tdKSkuZm9yRWFjaChhbGlhcyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb25bJ2NhbWVsLWNhc2UtZXhwYW5zaW9uJ10gJiYgYWxpYXMuaW5jbHVkZXMoJy0nKSkge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgYXJndlthbGlhcy5zcGxpdCgnLicpLm1hcChwcm9wID0+IGNhbWVsQ2FzZShwcm9wKSkuam9pbignLicpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGVsZXRlIGFyZ3ZbYWxpYXNdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUHVzaCBhcmd1bWVudCBpbnRvIHBvc2l0aW9uYWwgYXJyYXksIGFwcGx5aW5nIG51bWVyaWMgY29lcmNpb246XG4gICAgICAgIGZ1bmN0aW9uIHB1c2hQb3NpdGlvbmFsKGFyZykge1xuICAgICAgICAgICAgY29uc3QgbWF5YmVDb2VyY2VkTnVtYmVyID0gbWF5YmVDb2VyY2VOdW1iZXIoJ18nLCBhcmcpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBtYXliZUNvZXJjZWROdW1iZXIgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBtYXliZUNvZXJjZWROdW1iZXIgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgYXJndi5fLnB1c2gobWF5YmVDb2VyY2VkTnVtYmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBob3cgbWFueSBhcmd1bWVudHMgc2hvdWxkIHdlIGNvbnN1bWUsIGJhc2VkXG4gICAgICAgIC8vIG9uIHRoZSBuYXJncyBvcHRpb24/XG4gICAgICAgIGZ1bmN0aW9uIGVhdE5hcmdzKGksIGtleSwgYXJncywgYXJnQWZ0ZXJFcXVhbFNpZ24pIHtcbiAgICAgICAgICAgIGxldCBpaTtcbiAgICAgICAgICAgIGxldCB0b0VhdCA9IGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLm5hcmdzKTtcbiAgICAgICAgICAgIC8vIE5hTiBoYXMgYSBzcGVjaWFsIG1lYW5pbmcgZm9yIHRoZSBhcnJheSB0eXBlLCBpbmRpY2F0aW5nIHRoYXQgb25lIG9yXG4gICAgICAgICAgICAvLyBtb3JlIHZhbHVlcyBhcmUgZXhwZWN0ZWQuXG4gICAgICAgICAgICB0b0VhdCA9IHR5cGVvZiB0b0VhdCAhPT0gJ251bWJlcicgfHwgaXNOYU4odG9FYXQpID8gMSA6IHRvRWF0O1xuICAgICAgICAgICAgaWYgKHRvRWF0ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChhcmdBZnRlckVxdWFsU2lnbikpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBFcnJvcihfXygnQXJndW1lbnQgdW5leHBlY3RlZCBmb3I6ICVzJywga2V5KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNldEFyZyhrZXksIGRlZmF1bHRWYWx1ZShrZXkpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBhdmFpbGFibGUgPSBpc1VuZGVmaW5lZChhcmdBZnRlckVxdWFsU2lnbikgPyAwIDogMTtcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uWyduYXJncy1lYXRzLW9wdGlvbnMnXSkge1xuICAgICAgICAgICAgICAgIC8vIGNsYXNzaWMgYmVoYXZpb3IsIHlhcmdzIGVhdHMgcG9zaXRpb25hbCBhbmQgZGFzaCBhcmd1bWVudHMuXG4gICAgICAgICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIC0gKGkgKyAxKSArIGF2YWlsYWJsZSA8IHRvRWF0KSB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yID0gRXJyb3IoX18oJ05vdCBlbm91Z2ggYXJndW1lbnRzIGZvbGxvd2luZzogJXMnLCBrZXkpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYXZhaWxhYmxlID0gdG9FYXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBuYXJncyB3aWxsIG5vdCBjb25zdW1lIGZsYWcgYXJndW1lbnRzLCBlLmcuLCAtYWJjLCAtLWZvbyxcbiAgICAgICAgICAgICAgICAvLyBhbmQgdGVybWluYXRlcyB3aGVuIG9uZSBpcyBvYnNlcnZlZC5cbiAgICAgICAgICAgICAgICBmb3IgKGlpID0gaSArIDE7IGlpIDwgYXJncy5sZW5ndGg7IGlpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFhcmdzW2lpXS5tYXRjaCgvXi1bXjAtOV0vKSB8fCBhcmdzW2lpXS5tYXRjaChuZWdhdGl2ZSkgfHwgaXNVbmtub3duT3B0aW9uQXNBcmcoYXJnc1tpaV0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlKys7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoYXZhaWxhYmxlIDwgdG9FYXQpXG4gICAgICAgICAgICAgICAgICAgIGVycm9yID0gRXJyb3IoX18oJ05vdCBlbm91Z2ggYXJndW1lbnRzIGZvbGxvd2luZzogJXMnLCBrZXkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBjb25zdW1lZCA9IE1hdGgubWluKGF2YWlsYWJsZSwgdG9FYXQpO1xuICAgICAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChhcmdBZnRlckVxdWFsU2lnbikgJiYgY29uc3VtZWQgPiAwKSB7XG4gICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgYXJnQWZ0ZXJFcXVhbFNpZ24pO1xuICAgICAgICAgICAgICAgIGNvbnN1bWVkLS07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGlpID0gaSArIDE7IGlpIDwgKGNvbnN1bWVkICsgaSArIDEpOyBpaSsrKSB7XG4gICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgYXJnc1tpaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIChpICsgY29uc3VtZWQpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGlmIGFuIG9wdGlvbiBpcyBhbiBhcnJheSwgZWF0IGFsbCBub24taHlwaGVuYXRlZCBhcmd1bWVudHNcbiAgICAgICAgLy8gZm9sbG93aW5nIGl0Li4uIFlVTSFcbiAgICAgICAgLy8gZS5nLiwgLS1mb28gYXBwbGUgYmFuYW5hIGNhdCBiZWNvbWVzIFtcImFwcGxlXCIsIFwiYmFuYW5hXCIsIFwiY2F0XCJdXG4gICAgICAgIGZ1bmN0aW9uIGVhdEFycmF5KGksIGtleSwgYXJncywgYXJnQWZ0ZXJFcXVhbFNpZ24pIHtcbiAgICAgICAgICAgIGxldCBhcmdzVG9TZXQgPSBbXTtcbiAgICAgICAgICAgIGxldCBuZXh0ID0gYXJnQWZ0ZXJFcXVhbFNpZ24gfHwgYXJnc1tpICsgMV07XG4gICAgICAgICAgICAvLyBJZiBib3RoIGFycmF5IGFuZCBuYXJncyBhcmUgY29uZmlndXJlZCwgZW5mb3JjZSB0aGUgbmFyZ3MgY291bnQ6XG4gICAgICAgICAgICBjb25zdCBuYXJnc0NvdW50ID0gY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MubmFyZ3MpO1xuICAgICAgICAgICAgaWYgKGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLmJvb2xzKSAmJiAhKC9eKHRydWV8ZmFsc2UpJC8udGVzdChuZXh0KSkpIHtcbiAgICAgICAgICAgICAgICBhcmdzVG9TZXQucHVzaCh0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlzVW5kZWZpbmVkKG5leHQpIHx8XG4gICAgICAgICAgICAgICAgKGlzVW5kZWZpbmVkKGFyZ0FmdGVyRXF1YWxTaWduKSAmJiAvXi0vLnRlc3QobmV4dCkgJiYgIW5lZ2F0aXZlLnRlc3QobmV4dCkgJiYgIWlzVW5rbm93bk9wdGlvbkFzQXJnKG5leHQpKSkge1xuICAgICAgICAgICAgICAgIC8vIGZvciBrZXlzIHdpdGhvdXQgdmFsdWUgPT0+IGFyZ3NUb1NldCByZW1haW5zIGFuIGVtcHR5IFtdXG4gICAgICAgICAgICAgICAgLy8gc2V0IHVzZXIgZGVmYXVsdCB2YWx1ZSwgaWYgYXZhaWxhYmxlXG4gICAgICAgICAgICAgICAgaWYgKGRlZmF1bHRzW2tleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWZWYWwgPSBkZWZhdWx0c1trZXldO1xuICAgICAgICAgICAgICAgICAgICBhcmdzVG9TZXQgPSBBcnJheS5pc0FycmF5KGRlZlZhbCkgPyBkZWZWYWwgOiBbZGVmVmFsXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyB2YWx1ZSBpbiAtLW9wdGlvbj12YWx1ZSBpcyBlYXRlbiBhcyBpc1xuICAgICAgICAgICAgICAgIGlmICghaXNVbmRlZmluZWQoYXJnQWZ0ZXJFcXVhbFNpZ24pKSB7XG4gICAgICAgICAgICAgICAgICAgIGFyZ3NUb1NldC5wdXNoKHByb2Nlc3NWYWx1ZShrZXksIGFyZ0FmdGVyRXF1YWxTaWduLCB0cnVlKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGlpID0gaSArIDE7IGlpIDwgYXJncy5sZW5ndGg7IGlpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCghY29uZmlndXJhdGlvblsnZ3JlZWR5LWFycmF5cyddICYmIGFyZ3NUb1NldC5sZW5ndGggPiAwKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgKG5hcmdzQ291bnQgJiYgdHlwZW9mIG5hcmdzQ291bnQgPT09ICdudW1iZXInICYmIGFyZ3NUb1NldC5sZW5ndGggPj0gbmFyZ3NDb3VudCkpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgbmV4dCA9IGFyZ3NbaWldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoL14tLy50ZXN0KG5leHQpICYmICFuZWdhdGl2ZS50ZXN0KG5leHQpICYmICFpc1Vua25vd25PcHRpb25Bc0FyZyhuZXh0KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBpID0gaWk7XG4gICAgICAgICAgICAgICAgICAgIGFyZ3NUb1NldC5wdXNoKHByb2Nlc3NWYWx1ZShrZXksIG5leHQsIGlucHV0SXNTdHJpbmcpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBJZiBib3RoIGFycmF5IGFuZCBuYXJncyBhcmUgY29uZmlndXJlZCwgY3JlYXRlIGFuIGVycm9yIGlmIGxlc3MgdGhhblxuICAgICAgICAgICAgLy8gbmFyZ3MgcG9zaXRpb25hbHMgd2VyZSBmb3VuZC4gTmFOIGhhcyBzcGVjaWFsIG1lYW5pbmcsIGluZGljYXRpbmdcbiAgICAgICAgICAgIC8vIHRoYXQgYXQgbGVhc3Qgb25lIHZhbHVlIGlzIHJlcXVpcmVkIChtb3JlIGFyZSBva2F5KS5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgbmFyZ3NDb3VudCA9PT0gJ251bWJlcicgJiYgKChuYXJnc0NvdW50ICYmIGFyZ3NUb1NldC5sZW5ndGggPCBuYXJnc0NvdW50KSB8fFxuICAgICAgICAgICAgICAgIChpc05hTihuYXJnc0NvdW50KSAmJiBhcmdzVG9TZXQubGVuZ3RoID09PSAwKSkpIHtcbiAgICAgICAgICAgICAgICBlcnJvciA9IEVycm9yKF9fKCdOb3QgZW5vdWdoIGFyZ3VtZW50cyBmb2xsb3dpbmc6ICVzJywga2V5KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXRBcmcoa2V5LCBhcmdzVG9TZXQpO1xuICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gc2V0QXJnKGtleSwgdmFsLCBzaG91bGRTdHJpcFF1b3RlcyA9IGlucHV0SXNTdHJpbmcpIHtcbiAgICAgICAgICAgIGlmICgvLS8udGVzdChrZXkpICYmIGNvbmZpZ3VyYXRpb25bJ2NhbWVsLWNhc2UtZXhwYW5zaW9uJ10pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhbGlhcyA9IGtleS5zcGxpdCgnLicpLm1hcChmdW5jdGlvbiAocHJvcCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FtZWxDYXNlKHByb3ApO1xuICAgICAgICAgICAgICAgIH0pLmpvaW4oJy4nKTtcbiAgICAgICAgICAgICAgICBhZGROZXdBbGlhcyhrZXksIGFsaWFzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcHJvY2Vzc1ZhbHVlKGtleSwgdmFsLCBzaG91bGRTdHJpcFF1b3Rlcyk7XG4gICAgICAgICAgICBjb25zdCBzcGxpdEtleSA9IGtleS5zcGxpdCgnLicpO1xuICAgICAgICAgICAgc2V0S2V5KGFyZ3YsIHNwbGl0S2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICAvLyBoYW5kbGUgcG9wdWxhdGluZyBhbGlhc2VzIG9mIHRoZSBmdWxsIGtleVxuICAgICAgICAgICAgaWYgKGZsYWdzLmFsaWFzZXNba2V5XSkge1xuICAgICAgICAgICAgICAgIGZsYWdzLmFsaWFzZXNba2V5XS5mb3JFYWNoKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleVByb3BlcnRpZXMgPSB4LnNwbGl0KCcuJyk7XG4gICAgICAgICAgICAgICAgICAgIHNldEtleShhcmd2LCBrZXlQcm9wZXJ0aWVzLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBoYW5kbGUgcG9wdWxhdGluZyBhbGlhc2VzIG9mIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBkb3Qtbm90YXRpb24ga2V5XG4gICAgICAgICAgICBpZiAoc3BsaXRLZXkubGVuZ3RoID4gMSAmJiBjb25maWd1cmF0aW9uWydkb3Qtbm90YXRpb24nXSkge1xuICAgICAgICAgICAgICAgIDtcbiAgICAgICAgICAgICAgICAoZmxhZ3MuYWxpYXNlc1tzcGxpdEtleVswXV0gfHwgW10pLmZvckVhY2goZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGtleVByb3BlcnRpZXMgPSB4LnNwbGl0KCcuJyk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGV4cGFuZCBhbGlhcyB3aXRoIG5lc3RlZCBvYmplY3RzIGluIGtleVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhID0gW10uY29uY2F0KHNwbGl0S2V5KTtcbiAgICAgICAgICAgICAgICAgICAgYS5zaGlmdCgpOyAvLyBudWtlIHRoZSBvbGQga2V5LlxuICAgICAgICAgICAgICAgICAgICBrZXlQcm9wZXJ0aWVzID0ga2V5UHJvcGVydGllcy5jb25jYXQoYSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHBvcHVsYXRlIGFsaWFzIG9ubHkgaWYgaXMgbm90IGFscmVhZHkgYW4gYWxpYXMgb2YgdGhlIGZ1bGwga2V5XG4gICAgICAgICAgICAgICAgICAgIC8vIChhbHJlYWR5IHBvcHVsYXRlZCBhYm92ZSlcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEoZmxhZ3MuYWxpYXNlc1trZXldIHx8IFtdKS5pbmNsdWRlcyhrZXlQcm9wZXJ0aWVzLmpvaW4oJy4nKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEtleShhcmd2LCBrZXlQcm9wZXJ0aWVzLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFNldCBub3JtYWxpemUgZ2V0dGVyIGFuZCBzZXR0ZXIgd2hlbiBrZXkgaXMgaW4gJ25vcm1hbGl6ZScgYnV0IGlzbid0IGFuIGFycmF5XG4gICAgICAgICAgICBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3Mubm9ybWFsaXplKSAmJiAhY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYXJyYXlzKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGtleXMgPSBba2V5XS5jb25jYXQoZmxhZ3MuYWxpYXNlc1trZXldIHx8IFtdKTtcbiAgICAgICAgICAgICAgICBrZXlzLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoYXJndlJldHVybiwga2V5LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0KCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0KHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IG1peGluLm5vcm1hbGl6ZSh2YWx1ZSkgOiB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gYWRkTmV3QWxpYXMoa2V5LCBhbGlhcykge1xuICAgICAgICAgICAgaWYgKCEoZmxhZ3MuYWxpYXNlc1trZXldICYmIGZsYWdzLmFsaWFzZXNba2V5XS5sZW5ndGgpKSB7XG4gICAgICAgICAgICAgICAgZmxhZ3MuYWxpYXNlc1trZXldID0gW2FsaWFzXTtcbiAgICAgICAgICAgICAgICBuZXdBbGlhc2VzW2FsaWFzXSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIShmbGFncy5hbGlhc2VzW2FsaWFzXSAmJiBmbGFncy5hbGlhc2VzW2FsaWFzXS5sZW5ndGgpKSB7XG4gICAgICAgICAgICAgICAgYWRkTmV3QWxpYXMoYWxpYXMsIGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gcHJvY2Vzc1ZhbHVlKGtleSwgdmFsLCBzaG91bGRTdHJpcFF1b3Rlcykge1xuICAgICAgICAgICAgLy8gc3RyaW5ncyBtYXkgYmUgcXVvdGVkLCBjbGVhbiB0aGlzIHVwIGFzIHdlIGFzc2lnbiB2YWx1ZXMuXG4gICAgICAgICAgICBpZiAoc2hvdWxkU3RyaXBRdW90ZXMpIHtcbiAgICAgICAgICAgICAgICB2YWwgPSBzdHJpcFF1b3Rlcyh2YWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gaGFuZGxlIHBhcnNpbmcgYm9vbGVhbiBhcmd1bWVudHMgLS1mb289dHJ1ZSAtLWJhciBmYWxzZS5cbiAgICAgICAgICAgIGlmIChjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5ib29scykgfHwgY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuY291bnRzKSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJylcbiAgICAgICAgICAgICAgICAgICAgdmFsID0gdmFsID09PSAndHJ1ZSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBBcnJheS5pc0FycmF5KHZhbClcbiAgICAgICAgICAgICAgICA/IHZhbC5tYXAoZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG1heWJlQ29lcmNlTnVtYmVyKGtleSwgdik7IH0pXG4gICAgICAgICAgICAgICAgOiBtYXliZUNvZXJjZU51bWJlcihrZXksIHZhbCk7XG4gICAgICAgICAgICAvLyBpbmNyZW1lbnQgYSBjb3VudCBnaXZlbiBhcyBhcmcgKGVpdGhlciBubyB2YWx1ZSBvciB2YWx1ZSBwYXJzZWQgYXMgYm9vbGVhbilcbiAgICAgICAgICAgIGlmIChjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5jb3VudHMpICYmIChpc1VuZGVmaW5lZCh2YWx1ZSkgfHwgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBpbmNyZW1lbnQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFNldCBub3JtYWxpemVkIHZhbHVlIHdoZW4ga2V5IGlzIGluICdub3JtYWxpemUnIGFuZCBpbiAnYXJyYXlzJ1xuICAgICAgICAgICAgaWYgKGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLm5vcm1hbGl6ZSkgJiYgY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYXJyYXlzKSkge1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbCkpXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsLm1hcCgodmFsKSA9PiB7IHJldHVybiBtaXhpbi5ub3JtYWxpemUodmFsKTsgfSk7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG1peGluLm5vcm1hbGl6ZSh2YWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIG1heWJlQ29lcmNlTnVtYmVyKGtleSwgdmFsdWUpIHtcbiAgICAgICAgICAgIGlmICghY29uZmlndXJhdGlvblsncGFyc2UtcG9zaXRpb25hbC1udW1iZXJzJ10gJiYga2V5ID09PSAnXycpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgaWYgKCFjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5zdHJpbmdzKSAmJiAhY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYm9vbHMpICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNob3VsZENvZXJjZU51bWJlciA9IGxvb2tzTGlrZU51bWJlcih2YWx1ZSkgJiYgY29uZmlndXJhdGlvblsncGFyc2UtbnVtYmVycyddICYmIChOdW1iZXIuaXNTYWZlSW50ZWdlcihNYXRoLmZsb29yKHBhcnNlRmxvYXQoYCR7dmFsdWV9YCkpKSk7XG4gICAgICAgICAgICAgICAgaWYgKHNob3VsZENvZXJjZU51bWJlciB8fCAoIWlzVW5kZWZpbmVkKHZhbHVlKSAmJiBjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5udW1iZXJzKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBOdW1iZXIodmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBzZXQgYXJncyBmcm9tIGNvbmZpZy5qc29uIGZpbGUsIHRoaXMgc2hvdWxkIGJlXG4gICAgICAgIC8vIGFwcGxpZWQgbGFzdCBzbyB0aGF0IGRlZmF1bHRzIGNhbiBiZSBhcHBsaWVkLlxuICAgICAgICBmdW5jdGlvbiBzZXRDb25maWcoYXJndikge1xuICAgICAgICAgICAgY29uc3QgY29uZmlnTG9va3VwID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgICAgIC8vIGV4cGFuZCBkZWZhdWx0cy9hbGlhc2VzLCBpbi1jYXNlIGFueSBoYXBwZW4gdG8gcmVmZXJlbmNlXG4gICAgICAgICAgICAvLyB0aGUgY29uZmlnLmpzb24gZmlsZS5cbiAgICAgICAgICAgIGFwcGx5RGVmYXVsdHNBbmRBbGlhc2VzKGNvbmZpZ0xvb2t1cCwgZmxhZ3MuYWxpYXNlcywgZGVmYXVsdHMpO1xuICAgICAgICAgICAgT2JqZWN0LmtleXMoZmxhZ3MuY29uZmlncykuZm9yRWFjaChmdW5jdGlvbiAoY29uZmlnS2V5KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29uZmlnUGF0aCA9IGFyZ3ZbY29uZmlnS2V5XSB8fCBjb25maWdMb29rdXBbY29uZmlnS2V5XTtcbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnUGF0aCkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbmZpZyA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNvbHZlZENvbmZpZ1BhdGggPSBtaXhpbi5yZXNvbHZlKG1peGluLmN3ZCgpLCBjb25maWdQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVDb25maWcgPSBmbGFncy5jb25maWdzW2NvbmZpZ0tleV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlc29sdmVDb25maWcgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcgPSByZXNvbHZlQ29uZmlnKHJlc29sdmVkQ29uZmlnUGF0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvciA9IGNvbmZpZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IG1peGluLnJlcXVpcmUocmVzb2x2ZWRDb25maWdQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHNldENvbmZpZ09iamVjdChjb25maWcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGVubyB3aWxsIHJlY2VpdmUgYSBQZXJtaXNzaW9uRGVuaWVkIGVycm9yIGlmIGFuIGF0dGVtcHQgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hZGUgdG8gbG9hZCBjb25maWcgd2l0aG91dCB0aGUgLS1hbGxvdy1yZWFkIGZsYWc6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXgubmFtZSA9PT0gJ1Blcm1pc3Npb25EZW5pZWQnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gZXg7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmd2W2NvbmZpZ0tleV0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBFcnJvcihfXygnSW52YWxpZCBKU09OIGNvbmZpZyBmaWxlOiAlcycsIGNvbmZpZ1BhdGgpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIHNldCBhcmdzIGZyb20gY29uZmlnIG9iamVjdC5cbiAgICAgICAgLy8gaXQgcmVjdXJzaXZlbHkgY2hlY2tzIG5lc3RlZCBvYmplY3RzLlxuICAgICAgICBmdW5jdGlvbiBzZXRDb25maWdPYmplY3QoY29uZmlnLCBwcmV2KSB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhjb25maWcpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY29uZmlnW2tleV07XG4gICAgICAgICAgICAgICAgY29uc3QgZnVsbEtleSA9IHByZXYgPyBwcmV2ICsgJy4nICsga2V5IDoga2V5O1xuICAgICAgICAgICAgICAgIC8vIGlmIHRoZSB2YWx1ZSBpcyBhbiBpbm5lciBvYmplY3QgYW5kIHdlIGhhdmUgZG90LW5vdGF0aW9uXG4gICAgICAgICAgICAgICAgLy8gZW5hYmxlZCwgdHJlYXQgaW5uZXIgb2JqZWN0cyBpbiBjb25maWcgdGhlIHNhbWUgYXNcbiAgICAgICAgICAgICAgICAvLyBoZWF2aWx5IG5lc3RlZCBkb3Qgbm90YXRpb25zIChmb28uYmFyLmFwcGxlKS5cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgY29uZmlndXJhdGlvblsnZG90LW5vdGF0aW9uJ10pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHZhbHVlIGlzIGFuIG9iamVjdCBidXQgbm90IGFuIGFycmF5LCBjaGVjayBuZXN0ZWQgb2JqZWN0XG4gICAgICAgICAgICAgICAgICAgIHNldENvbmZpZ09iamVjdCh2YWx1ZSwgZnVsbEtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBzZXR0aW5nIGFyZ3VtZW50cyB2aWEgQ0xJIHRha2VzIHByZWNlZGVuY2Ugb3ZlclxuICAgICAgICAgICAgICAgICAgICAvLyB2YWx1ZXMgd2l0aGluIHRoZSBjb25maWcgZmlsZS5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNLZXkoYXJndiwgZnVsbEtleS5zcGxpdCgnLicpKSB8fCAoY2hlY2tBbGxBbGlhc2VzKGZ1bGxLZXksIGZsYWdzLmFycmF5cykgJiYgY29uZmlndXJhdGlvblsnY29tYmluZS1hcnJheXMnXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEFyZyhmdWxsS2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBzZXQgYWxsIGNvbmZpZyBvYmplY3RzIHBhc3NlZCBpbiBvcHRzXG4gICAgICAgIGZ1bmN0aW9uIHNldENvbmZpZ09iamVjdHMoKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNvbmZpZ09iamVjdHMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgY29uZmlnT2JqZWN0cy5mb3JFYWNoKGZ1bmN0aW9uIChjb25maWdPYmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0Q29uZmlnT2JqZWN0KGNvbmZpZ09iamVjdCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gYXBwbHlFbnZWYXJzKGFyZ3YsIGNvbmZpZ09ubHkpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZW52UHJlZml4ID09PSAndW5kZWZpbmVkJylcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBjb25zdCBwcmVmaXggPSB0eXBlb2YgZW52UHJlZml4ID09PSAnc3RyaW5nJyA/IGVudlByZWZpeCA6ICcnO1xuICAgICAgICAgICAgY29uc3QgZW52ID0gbWl4aW4uZW52KCk7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhlbnYpLmZvckVhY2goZnVuY3Rpb24gKGVudlZhcikge1xuICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT09ICcnIHx8IGVudlZhci5sYXN0SW5kZXhPZihwcmVmaXgsIDApID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGdldCBhcnJheSBvZiBuZXN0ZWQga2V5cyBhbmQgY29udmVydCB0aGVtIHRvIGNhbWVsIGNhc2VcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5cyA9IGVudlZhci5zcGxpdCgnX18nKS5tYXAoZnVuY3Rpb24gKGtleSwgaSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBrZXkuc3Vic3RyaW5nKHByZWZpeC5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbWVsQ2FzZShrZXkpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCgoY29uZmlnT25seSAmJiBmbGFncy5jb25maWdzW2tleXMuam9pbignLicpXSkgfHwgIWNvbmZpZ09ubHkpICYmICFoYXNLZXkoYXJndiwga2V5cykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEFyZyhrZXlzLmpvaW4oJy4nKSwgZW52W2VudlZhcl0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gYXBwbHlDb2VyY2lvbnMoYXJndikge1xuICAgICAgICAgICAgbGV0IGNvZXJjZTtcbiAgICAgICAgICAgIGNvbnN0IGFwcGxpZWQgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhhcmd2KS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWFwcGxpZWQuaGFzKGtleSkpIHsgLy8gSWYgd2UgaGF2ZW4ndCBhbHJlYWR5IGNvZXJjZWQgdGhpcyBvcHRpb24gdmlhIG9uZSBvZiBpdHMgYWxpYXNlc1xuICAgICAgICAgICAgICAgICAgICBjb2VyY2UgPSBjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5jb2VyY2lvbnMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvZXJjZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IG1heWJlQ29lcmNlTnVtYmVyKGtleSwgY29lcmNlKGFyZ3Zba2V5XSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChbXS5jb25jYXQoZmxhZ3MuYWxpYXNlc1trZXldIHx8IFtdLCBrZXkpKS5mb3JFYWNoKGFsaSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpZWQuYWRkKGFsaSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3ZbYWxpXSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gZXJyO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gc2V0UGxhY2Vob2xkZXJLZXlzKGFyZ3YpIHtcbiAgICAgICAgICAgIGZsYWdzLmtleXMuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gZG9uJ3Qgc2V0IHBsYWNlaG9sZGVyIGtleXMgZm9yIGRvdCBub3RhdGlvbiBvcHRpb25zICdmb28uYmFyJy5cbiAgICAgICAgICAgICAgICBpZiAofmtleS5pbmRleE9mKCcuJykpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGFyZ3Zba2V5XSA9PT0gJ3VuZGVmaW5lZCcpXG4gICAgICAgICAgICAgICAgICAgIGFyZ3Zba2V5XSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGFyZ3Y7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gYXBwbHlEZWZhdWx0c0FuZEFsaWFzZXMob2JqLCBhbGlhc2VzLCBkZWZhdWx0cywgY2FuTG9nID0gZmFsc2UpIHtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGRlZmF1bHRzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWhhc0tleShvYmosIGtleS5zcGxpdCgnLicpKSkge1xuICAgICAgICAgICAgICAgICAgICBzZXRLZXkob2JqLCBrZXkuc3BsaXQoJy4nKSwgZGVmYXVsdHNba2V5XSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjYW5Mb2cpXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0ZWRba2V5XSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIChhbGlhc2VzW2tleV0gfHwgW10pLmZvckVhY2goZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNLZXkob2JqLCB4LnNwbGl0KCcuJykpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEtleShvYmosIHguc3BsaXQoJy4nKSwgZGVmYXVsdHNba2V5XSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGhhc0tleShvYmosIGtleXMpIHtcbiAgICAgICAgICAgIGxldCBvID0gb2JqO1xuICAgICAgICAgICAgaWYgKCFjb25maWd1cmF0aW9uWydkb3Qtbm90YXRpb24nXSlcbiAgICAgICAgICAgICAgICBrZXlzID0gW2tleXMuam9pbignLicpXTtcbiAgICAgICAgICAgIGtleXMuc2xpY2UoMCwgLTEpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgIG8gPSAob1trZXldIHx8IHt9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3Qga2V5ID0ga2V5c1trZXlzLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBvICE9PSAnb2JqZWN0JylcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIGtleSBpbiBvO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHNldEtleShvYmosIGtleXMsIHZhbHVlKSB7XG4gICAgICAgICAgICBsZXQgbyA9IG9iajtcbiAgICAgICAgICAgIGlmICghY29uZmlndXJhdGlvblsnZG90LW5vdGF0aW9uJ10pXG4gICAgICAgICAgICAgICAga2V5cyA9IFtrZXlzLmpvaW4oJy4nKV07XG4gICAgICAgICAgICBrZXlzLnNsaWNlKDAsIC0xKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgICAvLyBUT0RPKGJjb2UpOiBpbiB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uIG9mIHlhcmdzLCBzd2l0Y2ggdG9cbiAgICAgICAgICAgICAgICAvLyBPYmplY3QuY3JlYXRlKG51bGwpIGZvciBkb3Qgbm90YXRpb246XG4gICAgICAgICAgICAgICAga2V5ID0gc2FuaXRpemVLZXkoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG8gPT09ICdvYmplY3QnICYmIG9ba2V5XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIG9ba2V5XSA9IHt9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9ba2V5XSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShvW2tleV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVuc3VyZSB0aGF0IG9ba2V5XSBpcyBhbiBhcnJheSwgYW5kIHRoYXQgdGhlIGxhc3QgaXRlbSBpcyBhbiBlbXB0eSBvYmplY3QuXG4gICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9ba2V5XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9ba2V5XS5wdXNoKHt9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9ba2V5XSA9IFtvW2tleV0sIHt9XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyB3ZSB3YW50IHRvIHVwZGF0ZSB0aGUgZW1wdHkgb2JqZWN0IGF0IHRoZSBlbmQgb2YgdGhlIG9ba2V5XSBhcnJheSwgc28gc2V0IG8gdG8gdGhhdCBvYmplY3RcbiAgICAgICAgICAgICAgICAgICAgbyA9IG9ba2V5XVtvW2tleV0ubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBvID0gb1trZXldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gVE9ETyhiY29lKTogaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvbiBvZiB5YXJncywgc3dpdGNoIHRvXG4gICAgICAgICAgICAvLyBPYmplY3QuY3JlYXRlKG51bGwpIGZvciBkb3Qgbm90YXRpb246XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBzYW5pdGl6ZUtleShrZXlzW2tleXMubGVuZ3RoIC0gMV0pO1xuICAgICAgICAgICAgY29uc3QgaXNUeXBlQXJyYXkgPSBjaGVja0FsbEFsaWFzZXMoa2V5cy5qb2luKCcuJyksIGZsYWdzLmFycmF5cyk7XG4gICAgICAgICAgICBjb25zdCBpc1ZhbHVlQXJyYXkgPSBBcnJheS5pc0FycmF5KHZhbHVlKTtcbiAgICAgICAgICAgIGxldCBkdXBsaWNhdGUgPSBjb25maWd1cmF0aW9uWydkdXBsaWNhdGUtYXJndW1lbnRzLWFycmF5J107XG4gICAgICAgICAgICAvLyBuYXJncyBoYXMgaGlnaGVyIHByaW9yaXR5IHRoYW4gZHVwbGljYXRlXG4gICAgICAgICAgICBpZiAoIWR1cGxpY2F0ZSAmJiBjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5uYXJncykpIHtcbiAgICAgICAgICAgICAgICBkdXBsaWNhdGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmICgoIWlzVW5kZWZpbmVkKG9ba2V5XSkgJiYgZmxhZ3MubmFyZ3Nba2V5XSA9PT0gMSkgfHwgKEFycmF5LmlzQXJyYXkob1trZXldKSAmJiBvW2tleV0ubGVuZ3RoID09PSBmbGFncy5uYXJnc1trZXldKSkge1xuICAgICAgICAgICAgICAgICAgICBvW2tleV0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHZhbHVlID09PSBpbmNyZW1lbnQoKSkge1xuICAgICAgICAgICAgICAgIG9ba2V5XSA9IGluY3JlbWVudChvW2tleV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShvW2tleV0pKSB7XG4gICAgICAgICAgICAgICAgaWYgKGR1cGxpY2F0ZSAmJiBpc1R5cGVBcnJheSAmJiBpc1ZhbHVlQXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgb1trZXldID0gY29uZmlndXJhdGlvblsnZmxhdHRlbi1kdXBsaWNhdGUtYXJyYXlzJ10gPyBvW2tleV0uY29uY2F0KHZhbHVlKSA6IChBcnJheS5pc0FycmF5KG9ba2V5XVswXSkgPyBvW2tleV0gOiBbb1trZXldXSkuY29uY2F0KFt2YWx1ZV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICghZHVwbGljYXRlICYmIEJvb2xlYW4oaXNUeXBlQXJyYXkpID09PSBCb29sZWFuKGlzVmFsdWVBcnJheSkpIHtcbiAgICAgICAgICAgICAgICAgICAgb1trZXldID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBvW2tleV0gPSBvW2tleV0uY29uY2F0KFt2YWx1ZV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG9ba2V5XSA9PT0gdW5kZWZpbmVkICYmIGlzVHlwZUFycmF5KSB7XG4gICAgICAgICAgICAgICAgb1trZXldID0gaXNWYWx1ZUFycmF5ID8gdmFsdWUgOiBbdmFsdWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZHVwbGljYXRlICYmICEob1trZXldID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgICBjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5jb3VudHMpIHx8XG4gICAgICAgICAgICAgICAgY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYm9vbHMpKSkge1xuICAgICAgICAgICAgICAgIG9ba2V5XSA9IFtvW2tleV0sIHZhbHVlXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG9ba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGV4dGVuZCB0aGUgYWxpYXNlcyBsaXN0IHdpdGggaW5mZXJyZWQgYWxpYXNlcy5cbiAgICAgICAgZnVuY3Rpb24gZXh0ZW5kQWxpYXNlcyguLi5hcmdzKSB7XG4gICAgICAgICAgICBhcmdzLmZvckVhY2goZnVuY3Rpb24gKG9iaikge1xuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKG9iaiB8fCB7fSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHNob3J0LWNpcmN1aXQgaWYgd2UndmUgYWxyZWFkeSBhZGRlZCBhIGtleVxuICAgICAgICAgICAgICAgICAgICAvLyB0byB0aGUgYWxpYXNlcyBhcnJheSwgZm9yIGV4YW1wbGUgaXQgbWlnaHRcbiAgICAgICAgICAgICAgICAgICAgLy8gZXhpc3QgaW4gYm90aCAnb3B0cy5kZWZhdWx0JyBhbmQgJ29wdHMua2V5Jy5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGZsYWdzLmFsaWFzZXNba2V5XSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3MuYWxpYXNlc1trZXldID0gW10uY29uY2F0KGFsaWFzZXNba2V5XSB8fCBbXSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIEZvciBcIi0tb3B0aW9uLW5hbWVcIiwgYWxzbyBzZXQgYXJndi5vcHRpb25OYW1lXG4gICAgICAgICAgICAgICAgICAgIGZsYWdzLmFsaWFzZXNba2V5XS5jb25jYXQoa2V5KS5mb3JFYWNoKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoLy0vLnRlc3QoeCkgJiYgY29uZmlndXJhdGlvblsnY2FtZWwtY2FzZS1leHBhbnNpb24nXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGMgPSBjYW1lbENhc2UoeCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgIT09IGtleSAmJiBmbGFncy5hbGlhc2VzW2tleV0uaW5kZXhPZihjKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MuYWxpYXNlc1trZXldLnB1c2goYyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0FsaWFzZXNbY10gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIEZvciBcIi0tb3B0aW9uTmFtZVwiLCBhbHNvIHNldCBhcmd2WydvcHRpb24tbmFtZSddXG4gICAgICAgICAgICAgICAgICAgIGZsYWdzLmFsaWFzZXNba2V5XS5jb25jYXQoa2V5KS5mb3JFYWNoKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoeC5sZW5ndGggPiAxICYmIC9bQS1aXS8udGVzdCh4KSAmJiBjb25maWd1cmF0aW9uWydjYW1lbC1jYXNlLWV4cGFuc2lvbiddKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYyA9IGRlY2FtZWxpemUoeCwgJy0nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyAhPT0ga2V5ICYmIGZsYWdzLmFsaWFzZXNba2V5XS5pbmRleE9mKGMpID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncy5hbGlhc2VzW2tleV0ucHVzaChjKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3QWxpYXNlc1tjXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3MuYWxpYXNlc1trZXldLmZvckVhY2goZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLmFsaWFzZXNbeF0gPSBba2V5XS5jb25jYXQoZmxhZ3MuYWxpYXNlc1trZXldLmZpbHRlcihmdW5jdGlvbiAoeSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4ICE9PSB5O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWcpIHtcbiAgICAgICAgICAgIGNvbnN0IHRvQ2hlY2sgPSBbXS5jb25jYXQoZmxhZ3MuYWxpYXNlc1trZXldIHx8IFtdLCBrZXkpO1xuICAgICAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGZsYWcpO1xuICAgICAgICAgICAgY29uc3Qgc2V0QWxpYXMgPSB0b0NoZWNrLmZpbmQoa2V5ID0+IGtleXMuaW5jbHVkZXMoa2V5KSk7XG4gICAgICAgICAgICByZXR1cm4gc2V0QWxpYXMgPyBmbGFnW3NldEFsaWFzXSA6IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGhhc0FueUZsYWcoa2V5KSB7XG4gICAgICAgICAgICBjb25zdCBmbGFnc0tleXMgPSBPYmplY3Qua2V5cyhmbGFncyk7XG4gICAgICAgICAgICBjb25zdCB0b0NoZWNrID0gW10uY29uY2F0KGZsYWdzS2V5cy5tYXAoayA9PiBmbGFnc1trXSkpO1xuICAgICAgICAgICAgcmV0dXJuIHRvQ2hlY2suc29tZShmdW5jdGlvbiAoZmxhZykge1xuICAgICAgICAgICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KGZsYWcpID8gZmxhZy5pbmNsdWRlcyhrZXkpIDogZmxhZ1trZXldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gaGFzRmxhZ3NNYXRjaGluZyhhcmcsIC4uLnBhdHRlcm5zKSB7XG4gICAgICAgICAgICBjb25zdCB0b0NoZWNrID0gW10uY29uY2F0KC4uLnBhdHRlcm5zKTtcbiAgICAgICAgICAgIHJldHVybiB0b0NoZWNrLnNvbWUoZnVuY3Rpb24gKHBhdHRlcm4pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXRjaCA9IGFyZy5tYXRjaChwYXR0ZXJuKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2ggJiYgaGFzQW55RmxhZyhtYXRjaFsxXSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBiYXNlZCBvbiBhIHNpbXBsaWZpZWQgdmVyc2lvbiBvZiB0aGUgc2hvcnQgZmxhZyBncm91cCBwYXJzaW5nIGxvZ2ljXG4gICAgICAgIGZ1bmN0aW9uIGhhc0FsbFNob3J0RmxhZ3MoYXJnKSB7XG4gICAgICAgICAgICAvLyBpZiB0aGlzIGlzIGEgbmVnYXRpdmUgbnVtYmVyLCBvciBkb2Vzbid0IHN0YXJ0IHdpdGggYSBzaW5nbGUgaHlwaGVuLCBpdCdzIG5vdCBhIHNob3J0IGZsYWcgZ3JvdXBcbiAgICAgICAgICAgIGlmIChhcmcubWF0Y2gobmVnYXRpdmUpIHx8ICFhcmcubWF0Y2goL14tW14tXSsvKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBoYXNBbGxGbGFncyA9IHRydWU7XG4gICAgICAgICAgICBsZXQgbmV4dDtcbiAgICAgICAgICAgIGNvbnN0IGxldHRlcnMgPSBhcmcuc2xpY2UoMSkuc3BsaXQoJycpO1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBsZXR0ZXJzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgbmV4dCA9IGFyZy5zbGljZShqICsgMik7XG4gICAgICAgICAgICAgICAgaWYgKCFoYXNBbnlGbGFnKGxldHRlcnNbal0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGhhc0FsbEZsYWdzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoKGxldHRlcnNbaiArIDFdICYmIGxldHRlcnNbaiArIDFdID09PSAnPScpIHx8XG4gICAgICAgICAgICAgICAgICAgIG5leHQgPT09ICctJyB8fFxuICAgICAgICAgICAgICAgICAgICAoL1tBLVphLXpdLy50ZXN0KGxldHRlcnNbal0pICYmIC9eLT9cXGQrKFxcLlxcZCopPyhlLT9cXGQrKT8kLy50ZXN0KG5leHQpKSB8fFxuICAgICAgICAgICAgICAgICAgICAobGV0dGVyc1tqICsgMV0gJiYgbGV0dGVyc1tqICsgMV0ubWF0Y2goL1xcVy8pKSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaGFzQWxsRmxhZ3M7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gaXNVbmtub3duT3B0aW9uQXNBcmcoYXJnKSB7XG4gICAgICAgICAgICByZXR1cm4gY29uZmlndXJhdGlvblsndW5rbm93bi1vcHRpb25zLWFzLWFyZ3MnXSAmJiBpc1Vua25vd25PcHRpb24oYXJnKTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBpc1Vua25vd25PcHRpb24oYXJnKSB7XG4gICAgICAgICAgICBhcmcgPSBhcmcucmVwbGFjZSgvXi17Myx9LywgJy0tJyk7XG4gICAgICAgICAgICAvLyBpZ25vcmUgbmVnYXRpdmUgbnVtYmVyc1xuICAgICAgICAgICAgaWYgKGFyZy5tYXRjaChuZWdhdGl2ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBpZiB0aGlzIGlzIGEgc2hvcnQgb3B0aW9uIGdyb3VwIGFuZCBhbGwgb2YgdGhlbSBhcmUgY29uZmlndXJlZCwgaXQgaXNuJ3QgdW5rbm93blxuICAgICAgICAgICAgaWYgKGhhc0FsbFNob3J0RmxhZ3MoYXJnKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGUuZy4gJy0tY291bnQ9MidcbiAgICAgICAgICAgIGNvbnN0IGZsYWdXaXRoRXF1YWxzID0gL14tKyhbXj1dKz8pPVtcXHNcXFNdKiQvO1xuICAgICAgICAgICAgLy8gZS5nLiAnLWEnIG9yICctLWFyZydcbiAgICAgICAgICAgIGNvbnN0IG5vcm1hbEZsYWcgPSAvXi0rKFtePV0rPykkLztcbiAgICAgICAgICAgIC8vIGUuZy4gJy1hLSdcbiAgICAgICAgICAgIGNvbnN0IGZsYWdFbmRpbmdJbkh5cGhlbiA9IC9eLSsoW149XSs/KS0kLztcbiAgICAgICAgICAgIC8vIGUuZy4gJy1hYmMxMjMnXG4gICAgICAgICAgICBjb25zdCBmbGFnRW5kaW5nSW5EaWdpdHMgPSAvXi0rKFtePV0rP1xcZCspJC87XG4gICAgICAgICAgICAvLyBlLmcuICctYS91c3IvbG9jYWwnXG4gICAgICAgICAgICBjb25zdCBmbGFnRW5kaW5nSW5Ob25Xb3JkQ2hhcmFjdGVycyA9IC9eLSsoW149XSs/KVxcVysuKiQvO1xuICAgICAgICAgICAgLy8gY2hlY2sgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBmbGFnIHN0eWxlcywgaW5jbHVkaW5nIG5lZ2F0ZWRCb29sZWFuLCBhIHBhdHRlcm4gZGVmaW5lZCBuZWFyIHRoZSBzdGFydCBvZiB0aGUgcGFyc2UgbWV0aG9kXG4gICAgICAgICAgICByZXR1cm4gIWhhc0ZsYWdzTWF0Y2hpbmcoYXJnLCBmbGFnV2l0aEVxdWFscywgbmVnYXRlZEJvb2xlYW4sIG5vcm1hbEZsYWcsIGZsYWdFbmRpbmdJbkh5cGhlbiwgZmxhZ0VuZGluZ0luRGlnaXRzLCBmbGFnRW5kaW5nSW5Ob25Xb3JkQ2hhcmFjdGVycyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbWFrZSBhIGJlc3QgZWZmb3J0IHRvIHBpY2sgYSBkZWZhdWx0IHZhbHVlXG4gICAgICAgIC8vIGZvciBhbiBvcHRpb24gYmFzZWQgb24gbmFtZSBhbmQgdHlwZS5cbiAgICAgICAgZnVuY3Rpb24gZGVmYXVsdFZhbHVlKGtleSkge1xuICAgICAgICAgICAgaWYgKCFjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5ib29scykgJiZcbiAgICAgICAgICAgICAgICAhY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuY291bnRzKSAmJlxuICAgICAgICAgICAgICAgIGAke2tleX1gIGluIGRlZmF1bHRzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRzW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdEZvclR5cGUoZ3Vlc3NUeXBlKGtleSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIHJldHVybiBhIGRlZmF1bHQgdmFsdWUsIGdpdmVuIHRoZSB0eXBlIG9mIGEgZmxhZy4sXG4gICAgICAgIGZ1bmN0aW9uIGRlZmF1bHRGb3JUeXBlKHR5cGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlZiA9IHtcbiAgICAgICAgICAgICAgICBbRGVmYXVsdFZhbHVlc0ZvclR5cGVLZXkuQk9PTEVBTl06IHRydWUsXG4gICAgICAgICAgICAgICAgW0RlZmF1bHRWYWx1ZXNGb3JUeXBlS2V5LlNUUklOR106ICcnLFxuICAgICAgICAgICAgICAgIFtEZWZhdWx0VmFsdWVzRm9yVHlwZUtleS5OVU1CRVJdOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgW0RlZmF1bHRWYWx1ZXNGb3JUeXBlS2V5LkFSUkFZXTogW11cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gZGVmW3R5cGVdO1xuICAgICAgICB9XG4gICAgICAgIC8vIGdpdmVuIGEgZmxhZywgZW5mb3JjZSBhIGRlZmF1bHQgdHlwZS5cbiAgICAgICAgZnVuY3Rpb24gZ3Vlc3NUeXBlKGtleSkge1xuICAgICAgICAgICAgbGV0IHR5cGUgPSBEZWZhdWx0VmFsdWVzRm9yVHlwZUtleS5CT09MRUFOO1xuICAgICAgICAgICAgaWYgKGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLnN0cmluZ3MpKVxuICAgICAgICAgICAgICAgIHR5cGUgPSBEZWZhdWx0VmFsdWVzRm9yVHlwZUtleS5TVFJJTkc7XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5udW1iZXJzKSlcbiAgICAgICAgICAgICAgICB0eXBlID0gRGVmYXVsdFZhbHVlc0ZvclR5cGVLZXkuTlVNQkVSO1xuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYm9vbHMpKVxuICAgICAgICAgICAgICAgIHR5cGUgPSBEZWZhdWx0VmFsdWVzRm9yVHlwZUtleS5CT09MRUFOO1xuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYXJyYXlzKSlcbiAgICAgICAgICAgICAgICB0eXBlID0gRGVmYXVsdFZhbHVlc0ZvclR5cGVLZXkuQVJSQVk7XG4gICAgICAgICAgICByZXR1cm4gdHlwZTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBpc1VuZGVmaW5lZChudW0pIHtcbiAgICAgICAgICAgIHJldHVybiBudW0gPT09IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBjaGVjayB1c2VyIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgZm9yIGluY29uc2lzdGVuY2llc1xuICAgICAgICBmdW5jdGlvbiBjaGVja0NvbmZpZ3VyYXRpb24oKSB7XG4gICAgICAgICAgICAvLyBjb3VudCBrZXlzIHNob3VsZCBub3QgYmUgc2V0IGFzIGFycmF5L25hcmdcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGZsYWdzLmNvdW50cykuZmluZChrZXkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5hcnJheXMpKSB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yID0gRXJyb3IoX18oJ0ludmFsaWQgY29uZmlndXJhdGlvbjogJXMsIG9wdHMuY291bnQgZXhjbHVkZXMgb3B0cy5hcnJheS4nLCBrZXkpKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLm5hcmdzKSkge1xuICAgICAgICAgICAgICAgICAgICBlcnJvciA9IEVycm9yKF9fKCdJbnZhbGlkIGNvbmZpZ3VyYXRpb246ICVzLCBvcHRzLmNvdW50IGV4Y2x1ZGVzIG9wdHMubmFyZy4nLCBrZXkpKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhbGlhc2VzOiBPYmplY3QuYXNzaWduKHt9LCBmbGFncy5hbGlhc2VzKSxcbiAgICAgICAgICAgIGFyZ3Y6IE9iamVjdC5hc3NpZ24oYXJndlJldHVybiwgYXJndiksXG4gICAgICAgICAgICBjb25maWd1cmF0aW9uOiBjb25maWd1cmF0aW9uLFxuICAgICAgICAgICAgZGVmYXVsdGVkOiBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0ZWQpLFxuICAgICAgICAgICAgZXJyb3I6IGVycm9yLFxuICAgICAgICAgICAgbmV3QWxpYXNlczogT2JqZWN0LmFzc2lnbih7fSwgbmV3QWxpYXNlcylcbiAgICAgICAgfTtcbiAgICB9XG59XG4vLyBpZiBhbnkgYWxpYXNlcyByZWZlcmVuY2UgZWFjaCBvdGhlciwgd2Ugc2hvdWxkXG4vLyBtZXJnZSB0aGVtIHRvZ2V0aGVyLlxuZnVuY3Rpb24gY29tYmluZUFsaWFzZXMoYWxpYXNlcykge1xuICAgIGNvbnN0IGFsaWFzQXJyYXlzID0gW107XG4gICAgY29uc3QgY29tYmluZWQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGxldCBjaGFuZ2UgPSB0cnVlO1xuICAgIC8vIHR1cm4gYWxpYXMgbG9va3VwIGhhc2gge2tleTogWydhbGlhczEnLCAnYWxpYXMyJ119IGludG9cbiAgICAvLyBhIHNpbXBsZSBhcnJheSBbJ2tleScsICdhbGlhczEnLCAnYWxpYXMyJ11cbiAgICBPYmplY3Qua2V5cyhhbGlhc2VzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgYWxpYXNBcnJheXMucHVzaChbXS5jb25jYXQoYWxpYXNlc1trZXldLCBrZXkpKTtcbiAgICB9KTtcbiAgICAvLyBjb21iaW5lIGFycmF5cyB1bnRpbCB6ZXJvIGNoYW5nZXMgYXJlXG4gICAgLy8gbWFkZSBpbiBhbiBpdGVyYXRpb24uXG4gICAgd2hpbGUgKGNoYW5nZSkge1xuICAgICAgICBjaGFuZ2UgPSBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbGlhc0FycmF5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgaWkgPSBpICsgMTsgaWkgPCBhbGlhc0FycmF5cy5sZW5ndGg7IGlpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbnRlcnNlY3QgPSBhbGlhc0FycmF5c1tpXS5maWx0ZXIoZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFsaWFzQXJyYXlzW2lpXS5pbmRleE9mKHYpICE9PSAtMTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoaW50ZXJzZWN0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBhbGlhc0FycmF5c1tpXSA9IGFsaWFzQXJyYXlzW2ldLmNvbmNhdChhbGlhc0FycmF5c1tpaV0pO1xuICAgICAgICAgICAgICAgICAgICBhbGlhc0FycmF5cy5zcGxpY2UoaWksIDEpO1xuICAgICAgICAgICAgICAgICAgICBjaGFuZ2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gbWFwIGFycmF5cyBiYWNrIHRvIHRoZSBoYXNoLWxvb2t1cCAoZGUtZHVwZSB3aGlsZVxuICAgIC8vIHdlJ3JlIGF0IGl0KS5cbiAgICBhbGlhc0FycmF5cy5mb3JFYWNoKGZ1bmN0aW9uIChhbGlhc0FycmF5KSB7XG4gICAgICAgIGFsaWFzQXJyYXkgPSBhbGlhc0FycmF5LmZpbHRlcihmdW5jdGlvbiAodiwgaSwgc2VsZikge1xuICAgICAgICAgICAgcmV0dXJuIHNlbGYuaW5kZXhPZih2KSA9PT0gaTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGxhc3RBbGlhcyA9IGFsaWFzQXJyYXkucG9wKCk7XG4gICAgICAgIGlmIChsYXN0QWxpYXMgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgbGFzdEFsaWFzID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29tYmluZWRbbGFzdEFsaWFzXSA9IGFsaWFzQXJyYXk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gY29tYmluZWQ7XG59XG4vLyB0aGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuIGEgY291bnQgaXMgZ2l2ZW4gYXMgYW4gYXJnXG4vLyBpdCBpcyBOT1QgY2FsbGVkIHRvIHNldCBhIGRlZmF1bHQgdmFsdWVcbi8vIHRodXMgd2UgY2FuIHN0YXJ0IHRoZSBjb3VudCBhdCAxIGluc3RlYWQgb2YgMFxuZnVuY3Rpb24gaW5jcmVtZW50KG9yaWcpIHtcbiAgICByZXR1cm4gb3JpZyAhPT0gdW5kZWZpbmVkID8gb3JpZyArIDEgOiAxO1xufVxuLy8gVE9ETyhiY29lKTogaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvbiBvZiB5YXJncywgc3dpdGNoIHRvXG4vLyBPYmplY3QuY3JlYXRlKG51bGwpIGZvciBkb3Qgbm90YXRpb246XG5mdW5jdGlvbiBzYW5pdGl6ZUtleShrZXkpIHtcbiAgICBpZiAoa2V5ID09PSAnX19wcm90b19fJylcbiAgICAgICAgcmV0dXJuICdfX19wcm90b19fXyc7XG4gICAgcmV0dXJuIGtleTtcbn1cbmZ1bmN0aW9uIHN0cmlwUXVvdGVzKHZhbCkge1xuICAgIHJldHVybiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgKHZhbFswXSA9PT0gXCInXCIgfHwgdmFsWzBdID09PSAnXCInKSAmJlxuICAgICAgICB2YWxbdmFsLmxlbmd0aCAtIDFdID09PSB2YWxbMF0pXG4gICAgICAgID8gdmFsLnN1YnN0cmluZygxLCB2YWwubGVuZ3RoIC0gMSlcbiAgICAgICAgOiB2YWw7XG59XG4iLCIvKipcbiAqIEBmaWxlb3ZlcnZpZXcgTWFpbiBlbnRyeXBvaW50IGZvciBsaWJyYXJpZXMgdXNpbmcgeWFyZ3MtcGFyc2VyIGluIE5vZGUuanNcbiAqIENKUyBhbmQgRVNNIGVudmlyb25tZW50cy5cbiAqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IChjKSAyMDE2LCBDb250cmlidXRvcnNcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBJU0NcbiAqL1xudmFyIF9hLCBfYiwgX2M7XG5pbXBvcnQgeyBmb3JtYXQgfSBmcm9tICd1dGlsJztcbmltcG9ydCB7IG5vcm1hbGl6ZSwgcmVzb2x2ZSB9IGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgY2FtZWxDYXNlLCBkZWNhbWVsaXplLCBsb29rc0xpa2VOdW1iZXIgfSBmcm9tICcuL3N0cmluZy11dGlscy5qcyc7XG5pbXBvcnQgeyBZYXJnc1BhcnNlciB9IGZyb20gJy4veWFyZ3MtcGFyc2VyLmpzJztcbmltcG9ydCB7IHJlYWRGaWxlU3luYyB9IGZyb20gJ2ZzJztcbi8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20veWFyZ3MveWFyZ3MtcGFyc2VyI3N1cHBvcnRlZC1ub2RlanMtdmVyc2lvbnMgZm9yIG91clxuLy8gdmVyc2lvbiBzdXBwb3J0IHBvbGljeS4gVGhlIFlBUkdTX01JTl9OT0RFX1ZFUlNJT04gaXMgdXNlZCBmb3IgdGVzdGluZyBvbmx5LlxuY29uc3QgbWluTm9kZVZlcnNpb24gPSAocHJvY2VzcyAmJiBwcm9jZXNzLmVudiAmJiBwcm9jZXNzLmVudi5ZQVJHU19NSU5fTk9ERV9WRVJTSU9OKVxuICAgID8gTnVtYmVyKHByb2Nlc3MuZW52LllBUkdTX01JTl9OT0RFX1ZFUlNJT04pXG4gICAgOiAxMjtcbmNvbnN0IG5vZGVWZXJzaW9uID0gKF9iID0gKF9hID0gcHJvY2VzcyA9PT0gbnVsbCB8fCBwcm9jZXNzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwcm9jZXNzLnZlcnNpb25zKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Eubm9kZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogKF9jID0gcHJvY2VzcyA9PT0gbnVsbCB8fCBwcm9jZXNzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwcm9jZXNzLnZlcnNpb24pID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5zbGljZSgxKTtcbmlmIChub2RlVmVyc2lvbikge1xuICAgIGNvbnN0IG1ham9yID0gTnVtYmVyKG5vZGVWZXJzaW9uLm1hdGNoKC9eKFteLl0rKS8pWzFdKTtcbiAgICBpZiAobWFqb3IgPCBtaW5Ob2RlVmVyc2lvbikge1xuICAgICAgICB0aHJvdyBFcnJvcihgeWFyZ3MgcGFyc2VyIHN1cHBvcnRzIGEgbWluaW11bSBOb2RlLmpzIHZlcnNpb24gb2YgJHttaW5Ob2RlVmVyc2lvbn0uIFJlYWQgb3VyIHZlcnNpb24gc3VwcG9ydCBwb2xpY3k6IGh0dHBzOi8vZ2l0aHViLmNvbS95YXJncy95YXJncy1wYXJzZXIjc3VwcG9ydGVkLW5vZGVqcy12ZXJzaW9uc2ApO1xuICAgIH1cbn1cbi8vIENyZWF0ZXMgYSB5YXJncy1wYXJzZXIgaW5zdGFuY2UgdXNpbmcgTm9kZS5qcyBzdGFuZGFyZCBsaWJyYXJpZXM6XG5jb25zdCBlbnYgPSBwcm9jZXNzID8gcHJvY2Vzcy5lbnYgOiB7fTtcbmNvbnN0IHBhcnNlciA9IG5ldyBZYXJnc1BhcnNlcih7XG4gICAgY3dkOiBwcm9jZXNzLmN3ZCxcbiAgICBlbnY6ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIGVudjtcbiAgICB9LFxuICAgIGZvcm1hdCxcbiAgICBub3JtYWxpemUsXG4gICAgcmVzb2x2ZSxcbiAgICAvLyBUT0RPOiBmaWd1cmUgIG91dCBhICB3YXkgdG8gY29tYmluZSBFU00gYW5kIENKUyBjb3ZlcmFnZSwgc3VjaCAgdGhhdFxuICAgIC8vIHdlIGNhbiBleGVyY2lzZSBhbGwgdGhlIGxpbmVzIGJlbG93OlxuICAgIHJlcXVpcmU6IChwYXRoKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgcmVxdWlyZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJldHVybiByZXF1aXJlKHBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHBhdGgubWF0Y2goL1xcLmpzb24kLykpIHtcbiAgICAgICAgICAgIC8vIEFkZHJlc3NlczogaHR0cHM6Ly9naXRodWIuY29tL3lhcmdzL3lhcmdzL2lzc3Vlcy8yMDQwXG4gICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShyZWFkRmlsZVN5bmMocGF0aCwgJ3V0ZjgnKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcignb25seSAuanNvbiBjb25maWcgZmlsZXMgYXJlIHN1cHBvcnRlZCBpbiBFU00nKTtcbiAgICAgICAgfVxuICAgIH1cbn0pO1xuY29uc3QgeWFyZ3NQYXJzZXIgPSBmdW5jdGlvbiBQYXJzZXIoYXJncywgb3B0cykge1xuICAgIGNvbnN0IHJlc3VsdCA9IHBhcnNlci5wYXJzZShhcmdzLnNsaWNlKCksIG9wdHMpO1xuICAgIHJldHVybiByZXN1bHQuYXJndjtcbn07XG55YXJnc1BhcnNlci5kZXRhaWxlZCA9IGZ1bmN0aW9uIChhcmdzLCBvcHRzKSB7XG4gICAgcmV0dXJuIHBhcnNlci5wYXJzZShhcmdzLnNsaWNlKCksIG9wdHMpO1xufTtcbnlhcmdzUGFyc2VyLmNhbWVsQ2FzZSA9IGNhbWVsQ2FzZTtcbnlhcmdzUGFyc2VyLmRlY2FtZWxpemUgPSBkZWNhbWVsaXplO1xueWFyZ3NQYXJzZXIubG9va3NMaWtlTnVtYmVyID0gbG9va3NMaWtlTnVtYmVyO1xuZXhwb3J0IGRlZmF1bHQgeWFyZ3NQYXJzZXI7XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYsIENvbnRyaWJ1dG9yc1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IElTQ1xuICovXG4vLyB0YWtlIGFuIHVuLXNwbGl0IGFyZ3Ygc3RyaW5nIGFuZCB0b2tlbml6ZSBpdC5cbmV4cG9ydCBmdW5jdGlvbiB0b2tlbml6ZUFyZ1N0cmluZyhhcmdTdHJpbmcpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhcmdTdHJpbmcpKSB7XG4gICAgICAgIHJldHVybiBhcmdTdHJpbmcubWFwKGUgPT4gdHlwZW9mIGUgIT09ICdzdHJpbmcnID8gZSArICcnIDogZSk7XG4gICAgfVxuICAgIGFyZ1N0cmluZyA9IGFyZ1N0cmluZy50cmltKCk7XG4gICAgbGV0IGkgPSAwO1xuICAgIGxldCBwcmV2QyA9IG51bGw7XG4gICAgbGV0IGMgPSBudWxsO1xuICAgIGxldCBvcGVuaW5nID0gbnVsbDtcbiAgICBjb25zdCBhcmdzID0gW107XG4gICAgZm9yIChsZXQgaWkgPSAwOyBpaSA8IGFyZ1N0cmluZy5sZW5ndGg7IGlpKyspIHtcbiAgICAgICAgcHJldkMgPSBjO1xuICAgICAgICBjID0gYXJnU3RyaW5nLmNoYXJBdChpaSk7XG4gICAgICAgIC8vIHNwbGl0IG9uIHNwYWNlcyB1bmxlc3Mgd2UncmUgaW4gcXVvdGVzLlxuICAgICAgICBpZiAoYyA9PT0gJyAnICYmICFvcGVuaW5nKSB7XG4gICAgICAgICAgICBpZiAoIShwcmV2QyA9PT0gJyAnKSkge1xuICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIGRvbid0IHNwbGl0IHRoZSBzdHJpbmcgaWYgd2UncmUgaW4gbWF0Y2hpbmdcbiAgICAgICAgLy8gb3BlbmluZyBvciBjbG9zaW5nIHNpbmdsZSBhbmQgZG91YmxlIHF1b3Rlcy5cbiAgICAgICAgaWYgKGMgPT09IG9wZW5pbmcpIHtcbiAgICAgICAgICAgIG9wZW5pbmcgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKChjID09PSBcIidcIiB8fCBjID09PSAnXCInKSAmJiAhb3BlbmluZykge1xuICAgICAgICAgICAgb3BlbmluZyA9IGM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFhcmdzW2ldKVxuICAgICAgICAgICAgYXJnc1tpXSA9ICcnO1xuICAgICAgICBhcmdzW2ldICs9IGM7XG4gICAgfVxuICAgIHJldHVybiBhcmdzO1xufVxuIiwiZnVuY3Rpb24gZ2V0UHJvY2Vzc0FyZ3ZCaW5JbmRleCgpIHtcbiAgICBpZiAoaXNCdW5kbGVkRWxlY3Ryb25BcHAoKSlcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgcmV0dXJuIDE7XG59XG5mdW5jdGlvbiBpc0J1bmRsZWRFbGVjdHJvbkFwcCgpIHtcbiAgICByZXR1cm4gaXNFbGVjdHJvbkFwcCgpICYmICFwcm9jZXNzLmRlZmF1bHRBcHA7XG59XG5mdW5jdGlvbiBpc0VsZWN0cm9uQXBwKCkge1xuICAgIHJldHVybiAhIXByb2Nlc3MudmVyc2lvbnMuZWxlY3Ryb247XG59XG5leHBvcnQgZnVuY3Rpb24gaGlkZUJpbihhcmd2KSB7XG4gICAgcmV0dXJuIGFyZ3Yuc2xpY2UoZ2V0UHJvY2Vzc0FyZ3ZCaW5JbmRleCgpICsgMSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0UHJvY2Vzc0FyZ3ZCaW4oKSB7XG4gICAgcmV0dXJuIHByb2Nlc3MuYXJndltnZXRQcm9jZXNzQXJndkJpbkluZGV4KCldO1xufVxuIiwiZXhwb3J0IGNsYXNzIFlFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3Rvcihtc2cpIHtcbiAgICAgICAgc3VwZXIobXNnIHx8ICd5YXJncyBlcnJvcicpO1xuICAgICAgICB0aGlzLm5hbWUgPSAnWUVycm9yJztcbiAgICAgICAgaWYgKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKSB7XG4gICAgICAgICAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBZRXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgcmVhZEZpbGVTeW5jLCBzdGF0U3luYywgd3JpdGVGaWxlIH0gZnJvbSAnZnMnO1xuaW1wb3J0IHsgZm9ybWF0IH0gZnJvbSAndXRpbCc7XG5pbXBvcnQgeyByZXNvbHZlIH0gZnJvbSAncGF0aCc7XG5leHBvcnQgZGVmYXVsdCB7XG4gICAgZnM6IHtcbiAgICAgICAgcmVhZEZpbGVTeW5jLFxuICAgICAgICB3cml0ZUZpbGVcbiAgICB9LFxuICAgIGZvcm1hdCxcbiAgICByZXNvbHZlLFxuICAgIGV4aXN0czogKGZpbGUpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBzdGF0U3luYyhmaWxlKS5pc0ZpbGUoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG59O1xuIiwibGV0IHNoaW07XG5jbGFzcyBZMThOIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIC8vIGNvbmZpZ3VyYWJsZSBvcHRpb25zLlxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fTtcbiAgICAgICAgdGhpcy5kaXJlY3RvcnkgPSBvcHRzLmRpcmVjdG9yeSB8fCAnLi9sb2NhbGVzJztcbiAgICAgICAgdGhpcy51cGRhdGVGaWxlcyA9IHR5cGVvZiBvcHRzLnVwZGF0ZUZpbGVzID09PSAnYm9vbGVhbicgPyBvcHRzLnVwZGF0ZUZpbGVzIDogdHJ1ZTtcbiAgICAgICAgdGhpcy5sb2NhbGUgPSBvcHRzLmxvY2FsZSB8fCAnZW4nO1xuICAgICAgICB0aGlzLmZhbGxiYWNrVG9MYW5ndWFnZSA9IHR5cGVvZiBvcHRzLmZhbGxiYWNrVG9MYW5ndWFnZSA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5mYWxsYmFja1RvTGFuZ3VhZ2UgOiB0cnVlO1xuICAgICAgICAvLyBpbnRlcm5hbCBzdHVmZi5cbiAgICAgICAgdGhpcy5jYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIHRoaXMud3JpdGVRdWV1ZSA9IFtdO1xuICAgIH1cbiAgICBfXyguLi5hcmdzKSB7XG4gICAgICAgIGlmICh0eXBlb2YgYXJndW1lbnRzWzBdICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3RhZ2dlZExpdGVyYWwoYXJndW1lbnRzWzBdLCAuLi5hcmd1bWVudHMpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0ciA9IGFyZ3Muc2hpZnQoKTtcbiAgICAgICAgbGV0IGNiID0gZnVuY3Rpb24gKCkgeyB9OyAvLyBzdGFydCB3aXRoIG5vb3AuXG4gICAgICAgIGlmICh0eXBlb2YgYXJnc1thcmdzLmxlbmd0aCAtIDFdID09PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgY2IgPSBhcmdzLnBvcCgpO1xuICAgICAgICBjYiA9IGNiIHx8IGZ1bmN0aW9uICgpIHsgfTsgLy8gbm9vcC5cbiAgICAgICAgaWYgKCF0aGlzLmNhY2hlW3RoaXMubG9jYWxlXSlcbiAgICAgICAgICAgIHRoaXMuX3JlYWRMb2NhbGVGaWxlKCk7XG4gICAgICAgIC8vIHdlJ3ZlIG9ic2VydmVkIGEgbmV3IHN0cmluZywgdXBkYXRlIHRoZSBsYW5ndWFnZSBmaWxlLlxuICAgICAgICBpZiAoIXRoaXMuY2FjaGVbdGhpcy5sb2NhbGVdW3N0cl0gJiYgdGhpcy51cGRhdGVGaWxlcykge1xuICAgICAgICAgICAgdGhpcy5jYWNoZVt0aGlzLmxvY2FsZV1bc3RyXSA9IHN0cjtcbiAgICAgICAgICAgIC8vIGluY2x1ZGUgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGFuZCBsb2NhbGUsXG4gICAgICAgICAgICAvLyBzaW5jZSB0aGVzZSB2YWx1ZXMgY291bGQgY2hhbmdlIGJlZm9yZSB0aGVcbiAgICAgICAgICAgIC8vIHdyaXRlIGlzIHBlcmZvcm1lZC5cbiAgICAgICAgICAgIHRoaXMuX2VucXVldWVXcml0ZSh7XG4gICAgICAgICAgICAgICAgZGlyZWN0b3J5OiB0aGlzLmRpcmVjdG9yeSxcbiAgICAgICAgICAgICAgICBsb2NhbGU6IHRoaXMubG9jYWxlLFxuICAgICAgICAgICAgICAgIGNiXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNiKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNoaW0uZm9ybWF0LmFwcGx5KHNoaW0uZm9ybWF0LCBbdGhpcy5jYWNoZVt0aGlzLmxvY2FsZV1bc3RyXSB8fCBzdHJdLmNvbmNhdChhcmdzKSk7XG4gICAgfVxuICAgIF9fbigpIHtcbiAgICAgICAgY29uc3QgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG4gICAgICAgIGNvbnN0IHNpbmd1bGFyID0gYXJncy5zaGlmdCgpO1xuICAgICAgICBjb25zdCBwbHVyYWwgPSBhcmdzLnNoaWZ0KCk7XG4gICAgICAgIGNvbnN0IHF1YW50aXR5ID0gYXJncy5zaGlmdCgpO1xuICAgICAgICBsZXQgY2IgPSBmdW5jdGlvbiAoKSB7IH07IC8vIHN0YXJ0IHdpdGggbm9vcC5cbiAgICAgICAgaWYgKHR5cGVvZiBhcmdzW2FyZ3MubGVuZ3RoIC0gMV0gPT09ICdmdW5jdGlvbicpXG4gICAgICAgICAgICBjYiA9IGFyZ3MucG9wKCk7XG4gICAgICAgIGlmICghdGhpcy5jYWNoZVt0aGlzLmxvY2FsZV0pXG4gICAgICAgICAgICB0aGlzLl9yZWFkTG9jYWxlRmlsZSgpO1xuICAgICAgICBsZXQgc3RyID0gcXVhbnRpdHkgPT09IDEgPyBzaW5ndWxhciA6IHBsdXJhbDtcbiAgICAgICAgaWYgKHRoaXMuY2FjaGVbdGhpcy5sb2NhbGVdW3Npbmd1bGFyXSkge1xuICAgICAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmNhY2hlW3RoaXMubG9jYWxlXVtzaW5ndWxhcl07XG4gICAgICAgICAgICBzdHIgPSBlbnRyeVtxdWFudGl0eSA9PT0gMSA/ICdvbmUnIDogJ290aGVyJ107XG4gICAgICAgIH1cbiAgICAgICAgLy8gd2UndmUgb2JzZXJ2ZWQgYSBuZXcgc3RyaW5nLCB1cGRhdGUgdGhlIGxhbmd1YWdlIGZpbGUuXG4gICAgICAgIGlmICghdGhpcy5jYWNoZVt0aGlzLmxvY2FsZV1bc2luZ3VsYXJdICYmIHRoaXMudXBkYXRlRmlsZXMpIHtcbiAgICAgICAgICAgIHRoaXMuY2FjaGVbdGhpcy5sb2NhbGVdW3Npbmd1bGFyXSA9IHtcbiAgICAgICAgICAgICAgICBvbmU6IHNpbmd1bGFyLFxuICAgICAgICAgICAgICAgIG90aGVyOiBwbHVyYWxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICAvLyBpbmNsdWRlIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBhbmQgbG9jYWxlLFxuICAgICAgICAgICAgLy8gc2luY2UgdGhlc2UgdmFsdWVzIGNvdWxkIGNoYW5nZSBiZWZvcmUgdGhlXG4gICAgICAgICAgICAvLyB3cml0ZSBpcyBwZXJmb3JtZWQuXG4gICAgICAgICAgICB0aGlzLl9lbnF1ZXVlV3JpdGUoe1xuICAgICAgICAgICAgICAgIGRpcmVjdG9yeTogdGhpcy5kaXJlY3RvcnksXG4gICAgICAgICAgICAgICAgbG9jYWxlOiB0aGlzLmxvY2FsZSxcbiAgICAgICAgICAgICAgICBjYlxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjYigpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGlmIGEgJWQgcGxhY2Vob2xkZXIgaXMgcHJvdmlkZWQsIGFkZCBxdWFudGl0eVxuICAgICAgICAvLyB0byB0aGUgYXJndW1lbnRzIGV4cGFuZGVkIGJ5IHV0aWwuZm9ybWF0LlxuICAgICAgICBjb25zdCB2YWx1ZXMgPSBbc3RyXTtcbiAgICAgICAgaWYgKH5zdHIuaW5kZXhPZignJWQnKSlcbiAgICAgICAgICAgIHZhbHVlcy5wdXNoKHF1YW50aXR5KTtcbiAgICAgICAgcmV0dXJuIHNoaW0uZm9ybWF0LmFwcGx5KHNoaW0uZm9ybWF0LCB2YWx1ZXMuY29uY2F0KGFyZ3MpKTtcbiAgICB9XG4gICAgc2V0TG9jYWxlKGxvY2FsZSkge1xuICAgICAgICB0aGlzLmxvY2FsZSA9IGxvY2FsZTtcbiAgICB9XG4gICAgZ2V0TG9jYWxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGU7XG4gICAgfVxuICAgIHVwZGF0ZUxvY2FsZShvYmopIHtcbiAgICAgICAgaWYgKCF0aGlzLmNhY2hlW3RoaXMubG9jYWxlXSlcbiAgICAgICAgICAgIHRoaXMuX3JlYWRMb2NhbGVGaWxlKCk7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNhY2hlW3RoaXMubG9jYWxlXVtrZXldID0gb2JqW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgX3RhZ2dlZExpdGVyYWwocGFydHMsIC4uLmFyZ3MpIHtcbiAgICAgICAgbGV0IHN0ciA9ICcnO1xuICAgICAgICBwYXJ0cy5mb3JFYWNoKGZ1bmN0aW9uIChwYXJ0LCBpKSB7XG4gICAgICAgICAgICBjb25zdCBhcmcgPSBhcmdzW2kgKyAxXTtcbiAgICAgICAgICAgIHN0ciArPSBwYXJ0O1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBhcmcgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgc3RyICs9ICclcyc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5fXy5hcHBseSh0aGlzLCBbc3RyXS5jb25jYXQoW10uc2xpY2UuY2FsbChhcmdzLCAxKSkpO1xuICAgIH1cbiAgICBfZW5xdWV1ZVdyaXRlKHdvcmspIHtcbiAgICAgICAgdGhpcy53cml0ZVF1ZXVlLnB1c2god29yayk7XG4gICAgICAgIGlmICh0aGlzLndyaXRlUXVldWUubGVuZ3RoID09PSAxKVxuICAgICAgICAgICAgdGhpcy5fcHJvY2Vzc1dyaXRlUXVldWUoKTtcbiAgICB9XG4gICAgX3Byb2Nlc3NXcml0ZVF1ZXVlKCkge1xuICAgICAgICBjb25zdCBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGNvbnN0IHdvcmsgPSB0aGlzLndyaXRlUXVldWVbMF07XG4gICAgICAgIC8vIGRlc3RydWN0dXJlIHRoZSBlbnF1ZXVlZCB3b3JrLlxuICAgICAgICBjb25zdCBkaXJlY3RvcnkgPSB3b3JrLmRpcmVjdG9yeTtcbiAgICAgICAgY29uc3QgbG9jYWxlID0gd29yay5sb2NhbGU7XG4gICAgICAgIGNvbnN0IGNiID0gd29yay5jYjtcbiAgICAgICAgY29uc3QgbGFuZ3VhZ2VGaWxlID0gdGhpcy5fcmVzb2x2ZUxvY2FsZUZpbGUoZGlyZWN0b3J5LCBsb2NhbGUpO1xuICAgICAgICBjb25zdCBzZXJpYWxpemVkTG9jYWxlID0gSlNPTi5zdHJpbmdpZnkodGhpcy5jYWNoZVtsb2NhbGVdLCBudWxsLCAyKTtcbiAgICAgICAgc2hpbS5mcy53cml0ZUZpbGUobGFuZ3VhZ2VGaWxlLCBzZXJpYWxpemVkTG9jYWxlLCAndXRmLTgnLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICBfdGhpcy53cml0ZVF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgICAgICBpZiAoX3RoaXMud3JpdGVRdWV1ZS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgIF90aGlzLl9wcm9jZXNzV3JpdGVRdWV1ZSgpO1xuICAgICAgICAgICAgY2IoZXJyKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIF9yZWFkTG9jYWxlRmlsZSgpIHtcbiAgICAgICAgbGV0IGxvY2FsZUxvb2t1cCA9IHt9O1xuICAgICAgICBjb25zdCBsYW5ndWFnZUZpbGUgPSB0aGlzLl9yZXNvbHZlTG9jYWxlRmlsZSh0aGlzLmRpcmVjdG9yeSwgdGhpcy5sb2NhbGUpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB1c2luZyBhIGJ1bmRsZXIgc3VjaCBhcyB3ZWJwYWNrLCByZWFkRmlsZVN5bmMgbWF5IG5vdCBiZSBkZWZpbmVkOlxuICAgICAgICAgICAgaWYgKHNoaW0uZnMucmVhZEZpbGVTeW5jKSB7XG4gICAgICAgICAgICAgICAgbG9jYWxlTG9va3VwID0gSlNPTi5wYXJzZShzaGltLmZzLnJlYWRGaWxlU3luYyhsYW5ndWFnZUZpbGUsICd1dGYtOCcpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBpZiAoZXJyIGluc3RhbmNlb2YgU3ludGF4RXJyb3IpIHtcbiAgICAgICAgICAgICAgICBlcnIubWVzc2FnZSA9ICdzeW50YXggZXJyb3IgaW4gJyArIGxhbmd1YWdlRmlsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlcnIuY29kZSA9PT0gJ0VOT0VOVCcpXG4gICAgICAgICAgICAgICAgbG9jYWxlTG9va3VwID0ge307XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2FjaGVbdGhpcy5sb2NhbGVdID0gbG9jYWxlTG9va3VwO1xuICAgIH1cbiAgICBfcmVzb2x2ZUxvY2FsZUZpbGUoZGlyZWN0b3J5LCBsb2NhbGUpIHtcbiAgICAgICAgbGV0IGZpbGUgPSBzaGltLnJlc29sdmUoZGlyZWN0b3J5LCAnLi8nLCBsb2NhbGUgKyAnLmpzb24nKTtcbiAgICAgICAgaWYgKHRoaXMuZmFsbGJhY2tUb0xhbmd1YWdlICYmICF0aGlzLl9maWxlRXhpc3RzU3luYyhmaWxlKSAmJiB+bG9jYWxlLmxhc3RJbmRleE9mKCdfJykpIHtcbiAgICAgICAgICAgIC8vIGF0dGVtcHQgZmFsbGJhY2sgdG8gbGFuZ3VhZ2Ugb25seVxuICAgICAgICAgICAgY29uc3QgbGFuZ3VhZ2VGaWxlID0gc2hpbS5yZXNvbHZlKGRpcmVjdG9yeSwgJy4vJywgbG9jYWxlLnNwbGl0KCdfJylbMF0gKyAnLmpzb24nKTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9maWxlRXhpc3RzU3luYyhsYW5ndWFnZUZpbGUpKVxuICAgICAgICAgICAgICAgIGZpbGUgPSBsYW5ndWFnZUZpbGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpbGU7XG4gICAgfVxuICAgIF9maWxlRXhpc3RzU3luYyhmaWxlKSB7XG4gICAgICAgIHJldHVybiBzaGltLmV4aXN0cyhmaWxlKTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24geTE4bihvcHRzLCBfc2hpbSkge1xuICAgIHNoaW0gPSBfc2hpbTtcbiAgICBjb25zdCB5MThuID0gbmV3IFkxOE4ob3B0cyk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgX186IHkxOG4uX18uYmluZCh5MThuKSxcbiAgICAgICAgX19uOiB5MThuLl9fbi5iaW5kKHkxOG4pLFxuICAgICAgICBzZXRMb2NhbGU6IHkxOG4uc2V0TG9jYWxlLmJpbmQoeTE4biksXG4gICAgICAgIGdldExvY2FsZTogeTE4bi5nZXRMb2NhbGUuYmluZCh5MThuKSxcbiAgICAgICAgdXBkYXRlTG9jYWxlOiB5MThuLnVwZGF0ZUxvY2FsZS5iaW5kKHkxOG4pLFxuICAgICAgICBsb2NhbGU6IHkxOG4ubG9jYWxlXG4gICAgfTtcbn1cbiIsImltcG9ydCBzaGltIGZyb20gJy4vYnVpbGQvbGliL3BsYXRmb3JtLXNoaW1zL25vZGUuanMnXG5pbXBvcnQgeyB5MThuIGFzIF95MThuIH0gZnJvbSAnLi9idWlsZC9saWIvaW5kZXguanMnXG5cbmNvbnN0IHkxOG4gPSAob3B0cykgPT4ge1xuICByZXR1cm4gX3kxOG4ob3B0cywgc2hpbSlcbn1cblxuZXhwb3J0IGRlZmF1bHQgeTE4blxuIiwiJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IG5vdFN0cmljdEVxdWFsLCBzdHJpY3RFcXVhbCB9IGZyb20gJ2Fzc2VydCdcbmltcG9ydCBjbGl1aSBmcm9tICdjbGl1aSdcbmltcG9ydCBlc2NhbGFkZSBmcm9tICdlc2NhbGFkZS9zeW5jJ1xuaW1wb3J0IHsgaW5zcGVjdCB9IGZyb20gJ3V0aWwnXG5pbXBvcnQgeyByZWFkRmlsZVN5bmMgfSBmcm9tICdmcydcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tICd1cmwnO1xuaW1wb3J0IFBhcnNlciBmcm9tICd5YXJncy1wYXJzZXInXG5pbXBvcnQgeyBiYXNlbmFtZSwgZGlybmFtZSwgZXh0bmFtZSwgcmVsYXRpdmUsIHJlc29sdmUgfSBmcm9tICdwYXRoJ1xuaW1wb3J0IHsgZ2V0UHJvY2Vzc0FyZ3ZCaW4gfSBmcm9tICcuLi8uLi9idWlsZC9saWIvdXRpbHMvcHJvY2Vzcy1hcmd2LmpzJ1xuaW1wb3J0IHsgWUVycm9yIH0gZnJvbSAnLi4vLi4vYnVpbGQvbGliL3llcnJvci5qcydcbmltcG9ydCB5MThuIGZyb20gJ3kxOG4nXG5cbmNvbnN0IFJFUVVJUkVfRVJST1IgPSAncmVxdWlyZSBpcyBub3Qgc3VwcG9ydGVkIGJ5IEVTTSdcbmNvbnN0IFJFUVVJUkVfRElSRUNUT1JZX0VSUk9SID0gJ2xvYWRpbmcgYSBkaXJlY3Rvcnkgb2YgY29tbWFuZHMgaXMgbm90IHN1cHBvcnRlZCB5ZXQgZm9yIEVTTSdcblxubGV0IF9fZGlybmFtZTtcbnRyeSB7XG4gIF9fZGlybmFtZSA9IGZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKTtcbn0gY2F0Y2ggKGUpIHtcbiAgX19kaXJuYW1lID0gcHJvY2Vzcy5jd2QoKTtcbn1cbmNvbnN0IG1haW5GaWxlbmFtZSA9IF9fZGlybmFtZS5zdWJzdHJpbmcoMCwgX19kaXJuYW1lLmxhc3RJbmRleE9mKCdub2RlX21vZHVsZXMnKSk7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgYXNzZXJ0OiB7XG4gICAgbm90U3RyaWN0RXF1YWwsXG4gICAgc3RyaWN0RXF1YWxcbiAgfSxcbiAgY2xpdWksXG4gIGZpbmRVcDogZXNjYWxhZGUsXG4gIGdldEVudjogKGtleSkgPT4ge1xuICAgIHJldHVybiBwcm9jZXNzLmVudltrZXldXG4gIH0sXG4gIGluc3BlY3QsXG4gIGdldENhbGxlckZpbGU6ICgpID0+IHtcbiAgICB0aHJvdyBuZXcgWUVycm9yKFJFUVVJUkVfRElSRUNUT1JZX0VSUk9SKVxuICB9LFxuICBnZXRQcm9jZXNzQXJndkJpbixcbiAgbWFpbkZpbGVuYW1lOiBtYWluRmlsZW5hbWUgfHwgcHJvY2Vzcy5jd2QoKSxcbiAgUGFyc2VyLFxuICBwYXRoOiB7XG4gICAgYmFzZW5hbWUsXG4gICAgZGlybmFtZSxcbiAgICBleHRuYW1lLFxuICAgIHJlbGF0aXZlLFxuICAgIHJlc29sdmVcbiAgfSxcbiAgcHJvY2Vzczoge1xuICAgIGFyZ3Y6ICgpID0+IHByb2Nlc3MuYXJndixcbiAgICBjd2Q6IHByb2Nlc3MuY3dkLFxuICAgIGVtaXRXYXJuaW5nOiAod2FybmluZywgdHlwZSkgPT4gcHJvY2Vzcy5lbWl0V2FybmluZyh3YXJuaW5nLCB0eXBlKSxcbiAgICBleGVjUGF0aDogKCkgPT4gcHJvY2Vzcy5leGVjUGF0aCxcbiAgICBleGl0OiBwcm9jZXNzLmV4aXQsXG4gICAgbmV4dFRpY2s6IHByb2Nlc3MubmV4dFRpY2ssXG4gICAgc3RkQ29sdW1uczogdHlwZW9mIHByb2Nlc3Muc3Rkb3V0LmNvbHVtbnMgIT09ICd1bmRlZmluZWQnID8gcHJvY2Vzcy5zdGRvdXQuY29sdW1ucyA6IG51bGxcbiAgfSxcbiAgcmVhZEZpbGVTeW5jLFxuICByZXF1aXJlOiAoKSA9PiB7XG4gICAgdGhyb3cgbmV3IFlFcnJvcihSRVFVSVJFX0VSUk9SKVxuICB9LFxuICByZXF1aXJlRGlyZWN0b3J5OiAoKSA9PiB7XG4gICAgdGhyb3cgbmV3IFlFcnJvcihSRVFVSVJFX0RJUkVDVE9SWV9FUlJPUilcbiAgfSxcbiAgc3RyaW5nV2lkdGg6IChzdHIpID0+IHtcbiAgICByZXR1cm4gWy4uLnN0cl0ubGVuZ3RoXG4gIH0sXG4gIHkxOG46IHkxOG4oe1xuICAgIGRpcmVjdG9yeTogcmVzb2x2ZShfX2Rpcm5hbWUsICcuLi8uLi8uLi9sb2NhbGVzJyksXG4gICAgdXBkYXRlRmlsZXM6IGZhbHNlXG4gIH0pXG59XG4iLCIvLyBCb290c3RyYXAgY2xpdWkgd2l0aCBDb21tb25KUyBkZXBlbmRlbmNpZXM6XG5pbXBvcnQgeyBjbGl1aSB9IGZyb20gJy4vYnVpbGQvbGliL2luZGV4LmpzJ1xuaW1wb3J0IHsgd3JhcCwgc3RyaXBBbnNpIH0gZnJvbSAnLi9idWlsZC9saWIvc3RyaW5nLXV0aWxzLmpzJ1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1aSAob3B0cykge1xuICByZXR1cm4gY2xpdWkob3B0cywge1xuICAgIHN0cmluZ1dpZHRoOiAoc3RyKSA9PiB7XG4gICAgICByZXR1cm4gWy4uLnN0cl0ubGVuZ3RoXG4gICAgfSxcbiAgICBzdHJpcEFuc2ksXG4gICAgd3JhcFxuICB9KVxufVxuIiwiaW1wb3J0IHsgZGlybmFtZSwgcmVzb2x2ZSB9IGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgcmVhZGRpclN5bmMsIHN0YXRTeW5jIH0gZnJvbSAnZnMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoc3RhcnQsIGNhbGxiYWNrKSB7XG5cdGxldCBkaXIgPSByZXNvbHZlKCcuJywgc3RhcnQpO1xuXHRsZXQgdG1wLCBzdGF0cyA9IHN0YXRTeW5jKGRpcik7XG5cblx0aWYgKCFzdGF0cy5pc0RpcmVjdG9yeSgpKSB7XG5cdFx0ZGlyID0gZGlybmFtZShkaXIpO1xuXHR9XG5cblx0d2hpbGUgKHRydWUpIHtcblx0XHR0bXAgPSBjYWxsYmFjayhkaXIsIHJlYWRkaXJTeW5jKGRpcikpO1xuXHRcdGlmICh0bXApIHJldHVybiByZXNvbHZlKGRpciwgdG1wKTtcblx0XHRkaXIgPSBkaXJuYW1lKHRtcCA9IGRpcik7XG5cdFx0aWYgKHRtcCA9PT0gZGlyKSBicmVhaztcblx0fVxufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGFzc2VydE5vdFN0cmljdEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIHNoaW0sIG1lc3NhZ2UpIHtcbiAgICBzaGltLmFzc2VydC5ub3RTdHJpY3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRTaW5nbGVLZXkoYWN0dWFsLCBzaGltKSB7XG4gICAgc2hpbS5hc3NlcnQuc3RyaWN0RXF1YWwodHlwZW9mIGFjdHVhbCwgJ3N0cmluZycpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG9iamVjdEtleXMob2JqZWN0KSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKG9iamVjdCk7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gaXNQcm9taXNlKG1heWJlUHJvbWlzZSkge1xuICAgIHJldHVybiAoISFtYXliZVByb21pc2UgJiZcbiAgICAgICAgISFtYXliZVByb21pc2UudGhlbiAmJlxuICAgICAgICB0eXBlb2YgbWF5YmVQcm9taXNlLnRoZW4gPT09ICdmdW5jdGlvbicpO1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQ29tbWFuZChjbWQpIHtcbiAgICBjb25zdCBleHRyYVNwYWNlc1N0cmlwcGVkQ29tbWFuZCA9IGNtZC5yZXBsYWNlKC9cXHN7Mix9L2csICcgJyk7XG4gICAgY29uc3Qgc3BsaXRDb21tYW5kID0gZXh0cmFTcGFjZXNTdHJpcHBlZENvbW1hbmQuc3BsaXQoL1xccysoPyFbXltdKl18W148XSo+KS8pO1xuICAgIGNvbnN0IGJyZWdleCA9IC9cXC4qW1xcXVs8Pl0vZztcbiAgICBjb25zdCBmaXJzdENvbW1hbmQgPSBzcGxpdENvbW1hbmQuc2hpZnQoKTtcbiAgICBpZiAoIWZpcnN0Q29tbWFuZClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBjb21tYW5kIGZvdW5kIGluOiAke2NtZH1gKTtcbiAgICBjb25zdCBwYXJzZWRDb21tYW5kID0ge1xuICAgICAgICBjbWQ6IGZpcnN0Q29tbWFuZC5yZXBsYWNlKGJyZWdleCwgJycpLFxuICAgICAgICBkZW1hbmRlZDogW10sXG4gICAgICAgIG9wdGlvbmFsOiBbXSxcbiAgICB9O1xuICAgIHNwbGl0Q29tbWFuZC5mb3JFYWNoKChjbWQsIGkpID0+IHtcbiAgICAgICAgbGV0IHZhcmlhZGljID0gZmFsc2U7XG4gICAgICAgIGNtZCA9IGNtZC5yZXBsYWNlKC9cXHMvZywgJycpO1xuICAgICAgICBpZiAoL1xcLitbXFxdPl0vLnRlc3QoY21kKSAmJiBpID09PSBzcGxpdENvbW1hbmQubGVuZ3RoIC0gMSlcbiAgICAgICAgICAgIHZhcmlhZGljID0gdHJ1ZTtcbiAgICAgICAgaWYgKC9eXFxbLy50ZXN0KGNtZCkpIHtcbiAgICAgICAgICAgIHBhcnNlZENvbW1hbmQub3B0aW9uYWwucHVzaCh7XG4gICAgICAgICAgICAgICAgY21kOiBjbWQucmVwbGFjZShicmVnZXgsICcnKS5zcGxpdCgnfCcpLFxuICAgICAgICAgICAgICAgIHZhcmlhZGljLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBwYXJzZWRDb21tYW5kLmRlbWFuZGVkLnB1c2goe1xuICAgICAgICAgICAgICAgIGNtZDogY21kLnJlcGxhY2UoYnJlZ2V4LCAnJykuc3BsaXQoJ3wnKSxcbiAgICAgICAgICAgICAgICB2YXJpYWRpYyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHBhcnNlZENvbW1hbmQ7XG59XG4iLCJpbXBvcnQgeyBZRXJyb3IgfSBmcm9tICcuL3llcnJvci5qcyc7XG5pbXBvcnQgeyBwYXJzZUNvbW1hbmQgfSBmcm9tICcuL3BhcnNlLWNvbW1hbmQuanMnO1xuY29uc3QgcG9zaXRpb25OYW1lID0gWydmaXJzdCcsICdzZWNvbmQnLCAndGhpcmQnLCAnZm91cnRoJywgJ2ZpZnRoJywgJ3NpeHRoJ107XG5leHBvcnQgZnVuY3Rpb24gYXJnc2VydChhcmcxLCBhcmcyLCBhcmczKSB7XG4gICAgZnVuY3Rpb24gcGFyc2VBcmdzKCkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIGFyZzEgPT09ICdvYmplY3QnXG4gICAgICAgICAgICA/IFt7IGRlbWFuZGVkOiBbXSwgb3B0aW9uYWw6IFtdIH0sIGFyZzEsIGFyZzJdXG4gICAgICAgICAgICA6IFtcbiAgICAgICAgICAgICAgICBwYXJzZUNvbW1hbmQoYGNtZCAke2FyZzF9YCksXG4gICAgICAgICAgICAgICAgYXJnMixcbiAgICAgICAgICAgICAgICBhcmczLFxuICAgICAgICAgICAgXTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgbGV0IHBvc2l0aW9uID0gMDtcbiAgICAgICAgY29uc3QgW3BhcnNlZCwgY2FsbGVyQXJndW1lbnRzLCBfbGVuZ3RoXSA9IHBhcnNlQXJncygpO1xuICAgICAgICBjb25zdCBhcmdzID0gW10uc2xpY2UuY2FsbChjYWxsZXJBcmd1bWVudHMpO1xuICAgICAgICB3aGlsZSAoYXJncy5sZW5ndGggJiYgYXJnc1thcmdzLmxlbmd0aCAtIDFdID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICBhcmdzLnBvcCgpO1xuICAgICAgICBjb25zdCBsZW5ndGggPSBfbGVuZ3RoIHx8IGFyZ3MubGVuZ3RoO1xuICAgICAgICBpZiAobGVuZ3RoIDwgcGFyc2VkLmRlbWFuZGVkLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFlFcnJvcihgTm90IGVub3VnaCBhcmd1bWVudHMgcHJvdmlkZWQuIEV4cGVjdGVkICR7cGFyc2VkLmRlbWFuZGVkLmxlbmd0aH0gYnV0IHJlY2VpdmVkICR7YXJncy5sZW5ndGh9LmApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRvdGFsQ29tbWFuZHMgPSBwYXJzZWQuZGVtYW5kZWQubGVuZ3RoICsgcGFyc2VkLm9wdGlvbmFsLmxlbmd0aDtcbiAgICAgICAgaWYgKGxlbmd0aCA+IHRvdGFsQ29tbWFuZHMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBZRXJyb3IoYFRvbyBtYW55IGFyZ3VtZW50cyBwcm92aWRlZC4gRXhwZWN0ZWQgbWF4ICR7dG90YWxDb21tYW5kc30gYnV0IHJlY2VpdmVkICR7bGVuZ3RofS5gKTtcbiAgICAgICAgfVxuICAgICAgICBwYXJzZWQuZGVtYW5kZWQuZm9yRWFjaChkZW1hbmRlZCA9PiB7XG4gICAgICAgICAgICBjb25zdCBhcmcgPSBhcmdzLnNoaWZ0KCk7XG4gICAgICAgICAgICBjb25zdCBvYnNlcnZlZFR5cGUgPSBndWVzc1R5cGUoYXJnKTtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoaW5nVHlwZXMgPSBkZW1hbmRlZC5jbWQuZmlsdGVyKHR5cGUgPT4gdHlwZSA9PT0gb2JzZXJ2ZWRUeXBlIHx8IHR5cGUgPT09ICcqJyk7XG4gICAgICAgICAgICBpZiAobWF0Y2hpbmdUeXBlcy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICAgICAgYXJndW1lbnRUeXBlRXJyb3Iob2JzZXJ2ZWRUeXBlLCBkZW1hbmRlZC5jbWQsIHBvc2l0aW9uKTtcbiAgICAgICAgICAgIHBvc2l0aW9uICs9IDE7XG4gICAgICAgIH0pO1xuICAgICAgICBwYXJzZWQub3B0aW9uYWwuZm9yRWFjaChvcHRpb25hbCA9PiB7XG4gICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgY29uc3QgYXJnID0gYXJncy5zaGlmdCgpO1xuICAgICAgICAgICAgY29uc3Qgb2JzZXJ2ZWRUeXBlID0gZ3Vlc3NUeXBlKGFyZyk7XG4gICAgICAgICAgICBjb25zdCBtYXRjaGluZ1R5cGVzID0gb3B0aW9uYWwuY21kLmZpbHRlcih0eXBlID0+IHR5cGUgPT09IG9ic2VydmVkVHlwZSB8fCB0eXBlID09PSAnKicpO1xuICAgICAgICAgICAgaWYgKG1hdGNoaW5nVHlwZXMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgICAgIGFyZ3VtZW50VHlwZUVycm9yKG9ic2VydmVkVHlwZSwgb3B0aW9uYWwuY21kLCBwb3NpdGlvbik7XG4gICAgICAgICAgICBwb3NpdGlvbiArPSAxO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLndhcm4oZXJyLnN0YWNrKTtcbiAgICB9XG59XG5mdW5jdGlvbiBndWVzc1R5cGUoYXJnKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYXJnKSkge1xuICAgICAgICByZXR1cm4gJ2FycmF5JztcbiAgICB9XG4gICAgZWxzZSBpZiAoYXJnID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAnbnVsbCc7XG4gICAgfVxuICAgIHJldHVybiB0eXBlb2YgYXJnO1xufVxuZnVuY3Rpb24gYXJndW1lbnRUeXBlRXJyb3Iob2JzZXJ2ZWRUeXBlLCBhbGxvd2VkVHlwZXMsIHBvc2l0aW9uKSB7XG4gICAgdGhyb3cgbmV3IFlFcnJvcihgSW52YWxpZCAke3Bvc2l0aW9uTmFtZVtwb3NpdGlvbl0gfHwgJ21hbnlpdGgnfSBhcmd1bWVudC4gRXhwZWN0ZWQgJHthbGxvd2VkVHlwZXMuam9pbignIG9yICcpfSBidXQgcmVjZWl2ZWQgJHtvYnNlcnZlZFR5cGV9LmApO1xufVxuIiwiaW1wb3J0IHsgYXJnc2VydCB9IGZyb20gJy4vYXJnc2VydC5qcyc7XG5pbXBvcnQgeyBpc1Byb21pc2UgfSBmcm9tICcuL3V0aWxzL2lzLXByb21pc2UuanMnO1xuZXhwb3J0IGNsYXNzIEdsb2JhbE1pZGRsZXdhcmUge1xuICAgIGNvbnN0cnVjdG9yKHlhcmdzKSB7XG4gICAgICAgIHRoaXMuZ2xvYmFsTWlkZGxld2FyZSA9IFtdO1xuICAgICAgICB0aGlzLmZyb3plbnMgPSBbXTtcbiAgICAgICAgdGhpcy55YXJncyA9IHlhcmdzO1xuICAgIH1cbiAgICBhZGRNaWRkbGV3YXJlKGNhbGxiYWNrLCBhcHBseUJlZm9yZVZhbGlkYXRpb24sIGdsb2JhbCA9IHRydWUsIG11dGF0ZXMgPSBmYWxzZSkge1xuICAgICAgICBhcmdzZXJ0KCc8YXJyYXl8ZnVuY3Rpb24+IFtib29sZWFuXSBbYm9vbGVhbl0gW2Jvb2xlYW5dJywgW2NhbGxiYWNrLCBhcHBseUJlZm9yZVZhbGlkYXRpb24sIGdsb2JhbF0sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjYWxsYmFjaykpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2FsbGJhY2subGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrW2ldICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKCdtaWRkbGV3YXJlIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBtID0gY2FsbGJhY2tbaV07XG4gICAgICAgICAgICAgICAgbS5hcHBseUJlZm9yZVZhbGlkYXRpb24gPSBhcHBseUJlZm9yZVZhbGlkYXRpb247XG4gICAgICAgICAgICAgICAgbS5nbG9iYWwgPSBnbG9iYWw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseSh0aGlzLmdsb2JhbE1pZGRsZXdhcmUsIGNhbGxiYWNrKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNvbnN0IG0gPSBjYWxsYmFjaztcbiAgICAgICAgICAgIG0uYXBwbHlCZWZvcmVWYWxpZGF0aW9uID0gYXBwbHlCZWZvcmVWYWxpZGF0aW9uO1xuICAgICAgICAgICAgbS5nbG9iYWwgPSBnbG9iYWw7XG4gICAgICAgICAgICBtLm11dGF0ZXMgPSBtdXRhdGVzO1xuICAgICAgICAgICAgdGhpcy5nbG9iYWxNaWRkbGV3YXJlLnB1c2goY2FsbGJhY2spO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnlhcmdzO1xuICAgIH1cbiAgICBhZGRDb2VyY2VNaWRkbGV3YXJlKGNhbGxiYWNrLCBvcHRpb24pIHtcbiAgICAgICAgY29uc3QgYWxpYXNlcyA9IHRoaXMueWFyZ3MuZ2V0QWxpYXNlcygpO1xuICAgICAgICB0aGlzLmdsb2JhbE1pZGRsZXdhcmUgPSB0aGlzLmdsb2JhbE1pZGRsZXdhcmUuZmlsdGVyKG0gPT4ge1xuICAgICAgICAgICAgY29uc3QgdG9DaGVjayA9IFsuLi4oYWxpYXNlc1tvcHRpb25dIHx8IFtdKSwgb3B0aW9uXTtcbiAgICAgICAgICAgIGlmICghbS5vcHRpb24pXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuICF0b0NoZWNrLmluY2x1ZGVzKG0ub3B0aW9uKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNhbGxiYWNrLm9wdGlvbiA9IG9wdGlvbjtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkTWlkZGxld2FyZShjYWxsYmFjaywgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7XG4gICAgfVxuICAgIGdldE1pZGRsZXdhcmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdsb2JhbE1pZGRsZXdhcmU7XG4gICAgfVxuICAgIGZyZWV6ZSgpIHtcbiAgICAgICAgdGhpcy5mcm96ZW5zLnB1c2goWy4uLnRoaXMuZ2xvYmFsTWlkZGxld2FyZV0pO1xuICAgIH1cbiAgICB1bmZyZWV6ZSgpIHtcbiAgICAgICAgY29uc3QgZnJvemVuID0gdGhpcy5mcm96ZW5zLnBvcCgpO1xuICAgICAgICBpZiAoZnJvemVuICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB0aGlzLmdsb2JhbE1pZGRsZXdhcmUgPSBmcm96ZW47XG4gICAgfVxuICAgIHJlc2V0KCkge1xuICAgICAgICB0aGlzLmdsb2JhbE1pZGRsZXdhcmUgPSB0aGlzLmdsb2JhbE1pZGRsZXdhcmUuZmlsdGVyKG0gPT4gbS5nbG9iYWwpO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBjb21tYW5kTWlkZGxld2FyZUZhY3RvcnkoY29tbWFuZE1pZGRsZXdhcmUpIHtcbiAgICBpZiAoIWNvbW1hbmRNaWRkbGV3YXJlKVxuICAgICAgICByZXR1cm4gW107XG4gICAgcmV0dXJuIGNvbW1hbmRNaWRkbGV3YXJlLm1hcChtaWRkbGV3YXJlID0+IHtcbiAgICAgICAgbWlkZGxld2FyZS5hcHBseUJlZm9yZVZhbGlkYXRpb24gPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIG1pZGRsZXdhcmU7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXBwbHlNaWRkbGV3YXJlKGFyZ3YsIHlhcmdzLCBtaWRkbGV3YXJlcywgYmVmb3JlVmFsaWRhdGlvbikge1xuICAgIHJldHVybiBtaWRkbGV3YXJlcy5yZWR1Y2UoKGFjYywgbWlkZGxld2FyZSkgPT4ge1xuICAgICAgICBpZiAobWlkZGxld2FyZS5hcHBseUJlZm9yZVZhbGlkYXRpb24gIT09IGJlZm9yZVZhbGlkYXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1pZGRsZXdhcmUubXV0YXRlcykge1xuICAgICAgICAgICAgaWYgKG1pZGRsZXdhcmUuYXBwbGllZClcbiAgICAgICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICAgICAgbWlkZGxld2FyZS5hcHBsaWVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNQcm9taXNlKGFjYykpIHtcbiAgICAgICAgICAgIHJldHVybiBhY2NcbiAgICAgICAgICAgICAgICAudGhlbihpbml0aWFsT2JqID0+IFByb21pc2UuYWxsKFtpbml0aWFsT2JqLCBtaWRkbGV3YXJlKGluaXRpYWxPYmosIHlhcmdzKV0pKVxuICAgICAgICAgICAgICAgIC50aGVuKChbaW5pdGlhbE9iaiwgbWlkZGxld2FyZU9ial0pID0+IE9iamVjdC5hc3NpZ24oaW5pdGlhbE9iaiwgbWlkZGxld2FyZU9iaikpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gbWlkZGxld2FyZShhY2MsIHlhcmdzKTtcbiAgICAgICAgICAgIHJldHVybiBpc1Byb21pc2UocmVzdWx0KVxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRoZW4obWlkZGxld2FyZU9iaiA9PiBPYmplY3QuYXNzaWduKGFjYywgbWlkZGxld2FyZU9iaikpXG4gICAgICAgICAgICAgICAgOiBPYmplY3QuYXNzaWduKGFjYywgcmVzdWx0KTtcbiAgICAgICAgfVxuICAgIH0sIGFyZ3YpO1xufVxuIiwiaW1wb3J0IHsgaXNQcm9taXNlIH0gZnJvbSAnLi9pcy1wcm9taXNlLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBtYXliZUFzeW5jUmVzdWx0KGdldFJlc3VsdCwgcmVzdWx0SGFuZGxlciwgZXJyb3JIYW5kbGVyID0gKGVycikgPT4ge1xuICAgIHRocm93IGVycjtcbn0pIHtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBpc0Z1bmN0aW9uKGdldFJlc3VsdCkgPyBnZXRSZXN1bHQoKSA6IGdldFJlc3VsdDtcbiAgICAgICAgcmV0dXJuIGlzUHJvbWlzZShyZXN1bHQpXG4gICAgICAgICAgICA/IHJlc3VsdC50aGVuKChyZXN1bHQpID0+IHJlc3VsdEhhbmRsZXIocmVzdWx0KSlcbiAgICAgICAgICAgIDogcmVzdWx0SGFuZGxlcihyZXN1bHQpO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJldHVybiBlcnJvckhhbmRsZXIoZXJyKTtcbiAgICB9XG59XG5mdW5jdGlvbiBpc0Z1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiB0eXBlb2YgYXJnID09PSAnZnVuY3Rpb24nO1xufVxuIiwiaW1wb3J0IHsgYXNzZXJ0Tm90U3RyaWN0RXF1YWwsIH0gZnJvbSAnLi90eXBpbmdzL2NvbW1vbi10eXBlcy5qcyc7XG5pbXBvcnQgeyBpc1Byb21pc2UgfSBmcm9tICcuL3V0aWxzL2lzLXByb21pc2UuanMnO1xuaW1wb3J0IHsgYXBwbHlNaWRkbGV3YXJlLCBjb21tYW5kTWlkZGxld2FyZUZhY3RvcnksIH0gZnJvbSAnLi9taWRkbGV3YXJlLmpzJztcbmltcG9ydCB7IHBhcnNlQ29tbWFuZCB9IGZyb20gJy4vcGFyc2UtY29tbWFuZC5qcyc7XG5pbXBvcnQgeyBpc1lhcmdzSW5zdGFuY2UsIH0gZnJvbSAnLi95YXJncy1mYWN0b3J5LmpzJztcbmltcG9ydCB7IG1heWJlQXN5bmNSZXN1bHQgfSBmcm9tICcuL3V0aWxzL21heWJlLWFzeW5jLXJlc3VsdC5qcyc7XG5pbXBvcnQgd2hpY2hNb2R1bGUgZnJvbSAnLi91dGlscy93aGljaC1tb2R1bGUuanMnO1xuY29uc3QgREVGQVVMVF9NQVJLRVIgPSAvKF5cXCopfCheXFwkMCkvO1xuZXhwb3J0IGNsYXNzIENvbW1hbmRJbnN0YW5jZSB7XG4gICAgY29uc3RydWN0b3IodXNhZ2UsIHZhbGlkYXRpb24sIGdsb2JhbE1pZGRsZXdhcmUsIHNoaW0pIHtcbiAgICAgICAgdGhpcy5yZXF1aXJlQ2FjaGUgPSBuZXcgU2V0KCk7XG4gICAgICAgIHRoaXMuaGFuZGxlcnMgPSB7fTtcbiAgICAgICAgdGhpcy5hbGlhc01hcCA9IHt9O1xuICAgICAgICB0aGlzLmZyb3plbnMgPSBbXTtcbiAgICAgICAgdGhpcy5zaGltID0gc2hpbTtcbiAgICAgICAgdGhpcy51c2FnZSA9IHVzYWdlO1xuICAgICAgICB0aGlzLmdsb2JhbE1pZGRsZXdhcmUgPSBnbG9iYWxNaWRkbGV3YXJlO1xuICAgICAgICB0aGlzLnZhbGlkYXRpb24gPSB2YWxpZGF0aW9uO1xuICAgIH1cbiAgICBhZGREaXJlY3RvcnkoZGlyLCByZXEsIGNhbGxlckZpbGUsIG9wdHMpIHtcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge307XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0cy5yZWN1cnNlICE9PSAnYm9vbGVhbicpXG4gICAgICAgICAgICBvcHRzLnJlY3Vyc2UgPSBmYWxzZTtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KG9wdHMuZXh0ZW5zaW9ucykpXG4gICAgICAgICAgICBvcHRzLmV4dGVuc2lvbnMgPSBbJ2pzJ107XG4gICAgICAgIGNvbnN0IHBhcmVudFZpc2l0ID0gdHlwZW9mIG9wdHMudmlzaXQgPT09ICdmdW5jdGlvbicgPyBvcHRzLnZpc2l0IDogKG8pID0+IG87XG4gICAgICAgIG9wdHMudmlzaXQgPSAob2JqLCBqb2luZWQsIGZpbGVuYW1lKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB2aXNpdGVkID0gcGFyZW50VmlzaXQob2JqLCBqb2luZWQsIGZpbGVuYW1lKTtcbiAgICAgICAgICAgIGlmICh2aXNpdGVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVxdWlyZUNhY2hlLmhhcyhqb2luZWQpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmlzaXRlZDtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVxdWlyZUNhY2hlLmFkZChqb2luZWQpO1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkSGFuZGxlcih2aXNpdGVkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB2aXNpdGVkO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLnNoaW0ucmVxdWlyZURpcmVjdG9yeSh7IHJlcXVpcmU6IHJlcSwgZmlsZW5hbWU6IGNhbGxlckZpbGUgfSwgZGlyLCBvcHRzKTtcbiAgICB9XG4gICAgYWRkSGFuZGxlcihjbWQsIGRlc2NyaXB0aW9uLCBidWlsZGVyLCBoYW5kbGVyLCBjb21tYW5kTWlkZGxld2FyZSwgZGVwcmVjYXRlZCkge1xuICAgICAgICBsZXQgYWxpYXNlcyA9IFtdO1xuICAgICAgICBjb25zdCBtaWRkbGV3YXJlcyA9IGNvbW1hbmRNaWRkbGV3YXJlRmFjdG9yeShjb21tYW5kTWlkZGxld2FyZSk7XG4gICAgICAgIGhhbmRsZXIgPSBoYW5kbGVyIHx8ICgoKSA9PiB7IH0pO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjbWQpKSB7XG4gICAgICAgICAgICBpZiAoaXNDb21tYW5kQW5kQWxpYXNlcyhjbWQpKSB7XG4gICAgICAgICAgICAgICAgW2NtZCwgLi4uYWxpYXNlc10gPSBjbWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGNvbW1hbmQgb2YgY21kKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkSGFuZGxlcihjb21tYW5kKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNDb21tYW5kSGFuZGxlckRlZmluaXRpb24oY21kKSkge1xuICAgICAgICAgICAgbGV0IGNvbW1hbmQgPSBBcnJheS5pc0FycmF5KGNtZC5jb21tYW5kKSB8fCB0eXBlb2YgY21kLmNvbW1hbmQgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICAgICAgPyBjbWQuY29tbWFuZFxuICAgICAgICAgICAgICAgIDogdGhpcy5tb2R1bGVOYW1lKGNtZCk7XG4gICAgICAgICAgICBpZiAoY21kLmFsaWFzZXMpXG4gICAgICAgICAgICAgICAgY29tbWFuZCA9IFtdLmNvbmNhdChjb21tYW5kKS5jb25jYXQoY21kLmFsaWFzZXMpO1xuICAgICAgICAgICAgdGhpcy5hZGRIYW5kbGVyKGNvbW1hbmQsIHRoaXMuZXh0cmFjdERlc2MoY21kKSwgY21kLmJ1aWxkZXIsIGNtZC5oYW5kbGVyLCBjbWQubWlkZGxld2FyZXMsIGNtZC5kZXByZWNhdGVkKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc0NvbW1hbmRCdWlsZGVyRGVmaW5pdGlvbihidWlsZGVyKSkge1xuICAgICAgICAgICAgdGhpcy5hZGRIYW5kbGVyKFtjbWRdLmNvbmNhdChhbGlhc2VzKSwgZGVzY3JpcHRpb24sIGJ1aWxkZXIuYnVpbGRlciwgYnVpbGRlci5oYW5kbGVyLCBidWlsZGVyLm1pZGRsZXdhcmVzLCBidWlsZGVyLmRlcHJlY2F0ZWQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgY21kID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkQ29tbWFuZCA9IHBhcnNlQ29tbWFuZChjbWQpO1xuICAgICAgICAgICAgYWxpYXNlcyA9IGFsaWFzZXMubWFwKGFsaWFzID0+IHBhcnNlQ29tbWFuZChhbGlhcykuY21kKTtcbiAgICAgICAgICAgIGxldCBpc0RlZmF1bHQgPSBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZEFsaWFzZXMgPSBbcGFyc2VkQ29tbWFuZC5jbWRdLmNvbmNhdChhbGlhc2VzKS5maWx0ZXIoYyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKERFRkFVTFRfTUFSS0VSLnRlc3QoYykpIHtcbiAgICAgICAgICAgICAgICAgICAgaXNEZWZhdWx0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHBhcnNlZEFsaWFzZXMubGVuZ3RoID09PSAwICYmIGlzRGVmYXVsdClcbiAgICAgICAgICAgICAgICBwYXJzZWRBbGlhc2VzLnB1c2goJyQwJyk7XG4gICAgICAgICAgICBpZiAoaXNEZWZhdWx0KSB7XG4gICAgICAgICAgICAgICAgcGFyc2VkQ29tbWFuZC5jbWQgPSBwYXJzZWRBbGlhc2VzWzBdO1xuICAgICAgICAgICAgICAgIGFsaWFzZXMgPSBwYXJzZWRBbGlhc2VzLnNsaWNlKDEpO1xuICAgICAgICAgICAgICAgIGNtZCA9IGNtZC5yZXBsYWNlKERFRkFVTFRfTUFSS0VSLCBwYXJzZWRDb21tYW5kLmNtZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhbGlhc2VzLmZvckVhY2goYWxpYXMgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuYWxpYXNNYXBbYWxpYXNdID0gcGFyc2VkQ29tbWFuZC5jbWQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChkZXNjcmlwdGlvbiAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVzYWdlLmNvbW1hbmQoY21kLCBkZXNjcmlwdGlvbiwgaXNEZWZhdWx0LCBhbGlhc2VzLCBkZXByZWNhdGVkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuaGFuZGxlcnNbcGFyc2VkQ29tbWFuZC5jbWRdID0ge1xuICAgICAgICAgICAgICAgIG9yaWdpbmFsOiBjbWQsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgICAgaGFuZGxlcixcbiAgICAgICAgICAgICAgICBidWlsZGVyOiBidWlsZGVyIHx8IHt9LFxuICAgICAgICAgICAgICAgIG1pZGRsZXdhcmVzLFxuICAgICAgICAgICAgICAgIGRlcHJlY2F0ZWQsXG4gICAgICAgICAgICAgICAgZGVtYW5kZWQ6IHBhcnNlZENvbW1hbmQuZGVtYW5kZWQsXG4gICAgICAgICAgICAgICAgb3B0aW9uYWw6IHBhcnNlZENvbW1hbmQub3B0aW9uYWwsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKGlzRGVmYXVsdClcbiAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRDb21tYW5kID0gdGhpcy5oYW5kbGVyc1twYXJzZWRDb21tYW5kLmNtZF07XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0Q29tbWFuZEhhbmRsZXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVycztcbiAgICB9XG4gICAgZ2V0Q29tbWFuZHMoKSB7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmhhbmRsZXJzKS5jb25jYXQoT2JqZWN0LmtleXModGhpcy5hbGlhc01hcCkpO1xuICAgIH1cbiAgICBoYXNEZWZhdWx0Q29tbWFuZCgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5kZWZhdWx0Q29tbWFuZDtcbiAgICB9XG4gICAgcnVuQ29tbWFuZChjb21tYW5kLCB5YXJncywgcGFyc2VkLCBjb21tYW5kSW5kZXgsIGhlbHBPbmx5LCBoZWxwT3JWZXJzaW9uU2V0KSB7XG4gICAgICAgIGNvbnN0IGNvbW1hbmRIYW5kbGVyID0gdGhpcy5oYW5kbGVyc1tjb21tYW5kXSB8fFxuICAgICAgICAgICAgdGhpcy5oYW5kbGVyc1t0aGlzLmFsaWFzTWFwW2NvbW1hbmRdXSB8fFxuICAgICAgICAgICAgdGhpcy5kZWZhdWx0Q29tbWFuZDtcbiAgICAgICAgY29uc3QgY3VycmVudENvbnRleHQgPSB5YXJncy5nZXRJbnRlcm5hbE1ldGhvZHMoKS5nZXRDb250ZXh0KCk7XG4gICAgICAgIGNvbnN0IHBhcmVudENvbW1hbmRzID0gY3VycmVudENvbnRleHQuY29tbWFuZHMuc2xpY2UoKTtcbiAgICAgICAgY29uc3QgaXNEZWZhdWx0Q29tbWFuZCA9ICFjb21tYW5kO1xuICAgICAgICBpZiAoY29tbWFuZCkge1xuICAgICAgICAgICAgY3VycmVudENvbnRleHQuY29tbWFuZHMucHVzaChjb21tYW5kKTtcbiAgICAgICAgICAgIGN1cnJlbnRDb250ZXh0LmZ1bGxDb21tYW5kcy5wdXNoKGNvbW1hbmRIYW5kbGVyLm9yaWdpbmFsKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBidWlsZGVyUmVzdWx0ID0gdGhpcy5hcHBseUJ1aWxkZXJVcGRhdGVVc2FnZUFuZFBhcnNlKGlzRGVmYXVsdENvbW1hbmQsIGNvbW1hbmRIYW5kbGVyLCB5YXJncywgcGFyc2VkLmFsaWFzZXMsIHBhcmVudENvbW1hbmRzLCBjb21tYW5kSW5kZXgsIGhlbHBPbmx5LCBoZWxwT3JWZXJzaW9uU2V0KTtcbiAgICAgICAgcmV0dXJuIGlzUHJvbWlzZShidWlsZGVyUmVzdWx0KVxuICAgICAgICAgICAgPyBidWlsZGVyUmVzdWx0LnRoZW4ocmVzdWx0ID0+IHRoaXMuYXBwbHlNaWRkbGV3YXJlQW5kR2V0UmVzdWx0KGlzRGVmYXVsdENvbW1hbmQsIGNvbW1hbmRIYW5kbGVyLCByZXN1bHQuaW5uZXJBcmd2LCBjdXJyZW50Q29udGV4dCwgaGVscE9ubHksIHJlc3VsdC5hbGlhc2VzLCB5YXJncykpXG4gICAgICAgICAgICA6IHRoaXMuYXBwbHlNaWRkbGV3YXJlQW5kR2V0UmVzdWx0KGlzRGVmYXVsdENvbW1hbmQsIGNvbW1hbmRIYW5kbGVyLCBidWlsZGVyUmVzdWx0LmlubmVyQXJndiwgY3VycmVudENvbnRleHQsIGhlbHBPbmx5LCBidWlsZGVyUmVzdWx0LmFsaWFzZXMsIHlhcmdzKTtcbiAgICB9XG4gICAgYXBwbHlCdWlsZGVyVXBkYXRlVXNhZ2VBbmRQYXJzZShpc0RlZmF1bHRDb21tYW5kLCBjb21tYW5kSGFuZGxlciwgeWFyZ3MsIGFsaWFzZXMsIHBhcmVudENvbW1hbmRzLCBjb21tYW5kSW5kZXgsIGhlbHBPbmx5LCBoZWxwT3JWZXJzaW9uU2V0KSB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBjb21tYW5kSGFuZGxlci5idWlsZGVyO1xuICAgICAgICBsZXQgaW5uZXJZYXJncyA9IHlhcmdzO1xuICAgICAgICBpZiAoaXNDb21tYW5kQnVpbGRlckNhbGxiYWNrKGJ1aWxkZXIpKSB7XG4gICAgICAgICAgICB5YXJncy5nZXRJbnRlcm5hbE1ldGhvZHMoKS5nZXRVc2FnZUluc3RhbmNlKCkuZnJlZXplKCk7XG4gICAgICAgICAgICBjb25zdCBidWlsZGVyT3V0cHV0ID0gYnVpbGRlcih5YXJncy5nZXRJbnRlcm5hbE1ldGhvZHMoKS5yZXNldChhbGlhc2VzKSwgaGVscE9yVmVyc2lvblNldCk7XG4gICAgICAgICAgICBpZiAoaXNQcm9taXNlKGJ1aWxkZXJPdXRwdXQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXJPdXRwdXQudGhlbihvdXRwdXQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpbm5lcllhcmdzID0gaXNZYXJnc0luc3RhbmNlKG91dHB1dCkgPyBvdXRwdXQgOiB5YXJncztcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VBbmRVcGRhdGVVc2FnZShpc0RlZmF1bHRDb21tYW5kLCBjb21tYW5kSGFuZGxlciwgaW5uZXJZYXJncywgcGFyZW50Q29tbWFuZHMsIGNvbW1hbmRJbmRleCwgaGVscE9ubHkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzQ29tbWFuZEJ1aWxkZXJPcHRpb25EZWZpbml0aW9ucyhidWlsZGVyKSkge1xuICAgICAgICAgICAgeWFyZ3MuZ2V0SW50ZXJuYWxNZXRob2RzKCkuZ2V0VXNhZ2VJbnN0YW5jZSgpLmZyZWV6ZSgpO1xuICAgICAgICAgICAgaW5uZXJZYXJncyA9IHlhcmdzLmdldEludGVybmFsTWV0aG9kcygpLnJlc2V0KGFsaWFzZXMpO1xuICAgICAgICAgICAgT2JqZWN0LmtleXMoY29tbWFuZEhhbmRsZXIuYnVpbGRlcikuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgICAgIGlubmVyWWFyZ3Mub3B0aW9uKGtleSwgYnVpbGRlcltrZXldKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlQW5kVXBkYXRlVXNhZ2UoaXNEZWZhdWx0Q29tbWFuZCwgY29tbWFuZEhhbmRsZXIsIGlubmVyWWFyZ3MsIHBhcmVudENvbW1hbmRzLCBjb21tYW5kSW5kZXgsIGhlbHBPbmx5KTtcbiAgICB9XG4gICAgcGFyc2VBbmRVcGRhdGVVc2FnZShpc0RlZmF1bHRDb21tYW5kLCBjb21tYW5kSGFuZGxlciwgaW5uZXJZYXJncywgcGFyZW50Q29tbWFuZHMsIGNvbW1hbmRJbmRleCwgaGVscE9ubHkpIHtcbiAgICAgICAgaWYgKGlzRGVmYXVsdENvbW1hbmQpXG4gICAgICAgICAgICBpbm5lcllhcmdzLmdldEludGVybmFsTWV0aG9kcygpLmdldFVzYWdlSW5zdGFuY2UoKS51bmZyZWV6ZSh0cnVlKTtcbiAgICAgICAgaWYgKHRoaXMuc2hvdWxkVXBkYXRlVXNhZ2UoaW5uZXJZYXJncykpIHtcbiAgICAgICAgICAgIGlubmVyWWFyZ3NcbiAgICAgICAgICAgICAgICAuZ2V0SW50ZXJuYWxNZXRob2RzKClcbiAgICAgICAgICAgICAgICAuZ2V0VXNhZ2VJbnN0YW5jZSgpXG4gICAgICAgICAgICAgICAgLnVzYWdlKHRoaXMudXNhZ2VGcm9tUGFyZW50Q29tbWFuZHNDb21tYW5kSGFuZGxlcihwYXJlbnRDb21tYW5kcywgY29tbWFuZEhhbmRsZXIpLCBjb21tYW5kSGFuZGxlci5kZXNjcmlwdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW5uZXJBcmd2ID0gaW5uZXJZYXJnc1xuICAgICAgICAgICAgLmdldEludGVybmFsTWV0aG9kcygpXG4gICAgICAgICAgICAucnVuWWFyZ3NQYXJzZXJBbmRFeGVjdXRlQ29tbWFuZHMobnVsbCwgdW5kZWZpbmVkLCB0cnVlLCBjb21tYW5kSW5kZXgsIGhlbHBPbmx5KTtcbiAgICAgICAgcmV0dXJuIGlzUHJvbWlzZShpbm5lckFyZ3YpXG4gICAgICAgICAgICA/IGlubmVyQXJndi50aGVuKGFyZ3YgPT4gKHtcbiAgICAgICAgICAgICAgICBhbGlhc2VzOiBpbm5lcllhcmdzLnBhcnNlZC5hbGlhc2VzLFxuICAgICAgICAgICAgICAgIGlubmVyQXJndjogYXJndixcbiAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgYWxpYXNlczogaW5uZXJZYXJncy5wYXJzZWQuYWxpYXNlcyxcbiAgICAgICAgICAgICAgICBpbm5lckFyZ3Y6IGlubmVyQXJndixcbiAgICAgICAgICAgIH07XG4gICAgfVxuICAgIHNob3VsZFVwZGF0ZVVzYWdlKHlhcmdzKSB7XG4gICAgICAgIHJldHVybiAoIXlhcmdzLmdldEludGVybmFsTWV0aG9kcygpLmdldFVzYWdlSW5zdGFuY2UoKS5nZXRVc2FnZURpc2FibGVkKCkgJiZcbiAgICAgICAgICAgIHlhcmdzLmdldEludGVybmFsTWV0aG9kcygpLmdldFVzYWdlSW5zdGFuY2UoKS5nZXRVc2FnZSgpLmxlbmd0aCA9PT0gMCk7XG4gICAgfVxuICAgIHVzYWdlRnJvbVBhcmVudENvbW1hbmRzQ29tbWFuZEhhbmRsZXIocGFyZW50Q29tbWFuZHMsIGNvbW1hbmRIYW5kbGVyKSB7XG4gICAgICAgIGNvbnN0IGMgPSBERUZBVUxUX01BUktFUi50ZXN0KGNvbW1hbmRIYW5kbGVyLm9yaWdpbmFsKVxuICAgICAgICAgICAgPyBjb21tYW5kSGFuZGxlci5vcmlnaW5hbC5yZXBsYWNlKERFRkFVTFRfTUFSS0VSLCAnJykudHJpbSgpXG4gICAgICAgICAgICA6IGNvbW1hbmRIYW5kbGVyLm9yaWdpbmFsO1xuICAgICAgICBjb25zdCBwYyA9IHBhcmVudENvbW1hbmRzLmZpbHRlcihjID0+IHtcbiAgICAgICAgICAgIHJldHVybiAhREVGQVVMVF9NQVJLRVIudGVzdChjKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHBjLnB1c2goYyk7XG4gICAgICAgIHJldHVybiBgJDAgJHtwYy5qb2luKCcgJyl9YDtcbiAgICB9XG4gICAgaGFuZGxlVmFsaWRhdGlvbkFuZEdldFJlc3VsdChpc0RlZmF1bHRDb21tYW5kLCBjb21tYW5kSGFuZGxlciwgaW5uZXJBcmd2LCBjdXJyZW50Q29udGV4dCwgYWxpYXNlcywgeWFyZ3MsIG1pZGRsZXdhcmVzLCBwb3NpdGlvbmFsTWFwKSB7XG4gICAgICAgIGlmICgheWFyZ3MuZ2V0SW50ZXJuYWxNZXRob2RzKCkuZ2V0SGFzT3V0cHV0KCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbGlkYXRpb24gPSB5YXJnc1xuICAgICAgICAgICAgICAgIC5nZXRJbnRlcm5hbE1ldGhvZHMoKVxuICAgICAgICAgICAgICAgIC5ydW5WYWxpZGF0aW9uKGFsaWFzZXMsIHBvc2l0aW9uYWxNYXAsIHlhcmdzLnBhcnNlZC5lcnJvciwgaXNEZWZhdWx0Q29tbWFuZCk7XG4gICAgICAgICAgICBpbm5lckFyZ3YgPSBtYXliZUFzeW5jUmVzdWx0KGlubmVyQXJndiwgcmVzdWx0ID0+IHtcbiAgICAgICAgICAgICAgICB2YWxpZGF0aW9uKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb21tYW5kSGFuZGxlci5oYW5kbGVyICYmICF5YXJncy5nZXRJbnRlcm5hbE1ldGhvZHMoKS5nZXRIYXNPdXRwdXQoKSkge1xuICAgICAgICAgICAgeWFyZ3MuZ2V0SW50ZXJuYWxNZXRob2RzKCkuc2V0SGFzT3V0cHV0KCk7XG4gICAgICAgICAgICBjb25zdCBwb3B1bGF0ZURvdWJsZURhc2ggPSAhIXlhcmdzLmdldE9wdGlvbnMoKS5jb25maWd1cmF0aW9uWydwb3B1bGF0ZS0tJ107XG4gICAgICAgICAgICB5YXJnc1xuICAgICAgICAgICAgICAgIC5nZXRJbnRlcm5hbE1ldGhvZHMoKVxuICAgICAgICAgICAgICAgIC5wb3N0UHJvY2Vzcyhpbm5lckFyZ3YsIHBvcHVsYXRlRG91YmxlRGFzaCwgZmFsc2UsIGZhbHNlKTtcbiAgICAgICAgICAgIGlubmVyQXJndiA9IGFwcGx5TWlkZGxld2FyZShpbm5lckFyZ3YsIHlhcmdzLCBtaWRkbGV3YXJlcywgZmFsc2UpO1xuICAgICAgICAgICAgaW5uZXJBcmd2ID0gbWF5YmVBc3luY1Jlc3VsdChpbm5lckFyZ3YsIHJlc3VsdCA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlclJlc3VsdCA9IGNvbW1hbmRIYW5kbGVyLmhhbmRsZXIocmVzdWx0KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNQcm9taXNlKGhhbmRsZXJSZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgID8gaGFuZGxlclJlc3VsdC50aGVuKCgpID0+IHJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgOiByZXN1bHQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghaXNEZWZhdWx0Q29tbWFuZCkge1xuICAgICAgICAgICAgICAgIHlhcmdzLmdldEludGVybmFsTWV0aG9kcygpLmdldFVzYWdlSW5zdGFuY2UoKS5jYWNoZUhlbHBNZXNzYWdlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNQcm9taXNlKGlubmVyQXJndikgJiZcbiAgICAgICAgICAgICAgICAheWFyZ3MuZ2V0SW50ZXJuYWxNZXRob2RzKCkuaGFzUGFyc2VDYWxsYmFjaygpKSB7XG4gICAgICAgICAgICAgICAgaW5uZXJBcmd2LmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHlhcmdzLmdldEludGVybmFsTWV0aG9kcygpLmdldFVzYWdlSW5zdGFuY2UoKS5mYWlsKG51bGwsIGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoX2Vycikge1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc0RlZmF1bHRDb21tYW5kKSB7XG4gICAgICAgICAgICBjdXJyZW50Q29udGV4dC5jb21tYW5kcy5wb3AoKTtcbiAgICAgICAgICAgIGN1cnJlbnRDb250ZXh0LmZ1bGxDb21tYW5kcy5wb3AoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5uZXJBcmd2O1xuICAgIH1cbiAgICBhcHBseU1pZGRsZXdhcmVBbmRHZXRSZXN1bHQoaXNEZWZhdWx0Q29tbWFuZCwgY29tbWFuZEhhbmRsZXIsIGlubmVyQXJndiwgY3VycmVudENvbnRleHQsIGhlbHBPbmx5LCBhbGlhc2VzLCB5YXJncykge1xuICAgICAgICBsZXQgcG9zaXRpb25hbE1hcCA9IHt9O1xuICAgICAgICBpZiAoaGVscE9ubHkpXG4gICAgICAgICAgICByZXR1cm4gaW5uZXJBcmd2O1xuICAgICAgICBpZiAoIXlhcmdzLmdldEludGVybmFsTWV0aG9kcygpLmdldEhhc091dHB1dCgpKSB7XG4gICAgICAgICAgICBwb3NpdGlvbmFsTWFwID0gdGhpcy5wb3B1bGF0ZVBvc2l0aW9uYWxzKGNvbW1hbmRIYW5kbGVyLCBpbm5lckFyZ3YsIGN1cnJlbnRDb250ZXh0LCB5YXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbWlkZGxld2FyZXMgPSB0aGlzLmdsb2JhbE1pZGRsZXdhcmVcbiAgICAgICAgICAgIC5nZXRNaWRkbGV3YXJlKClcbiAgICAgICAgICAgIC5zbGljZSgwKVxuICAgICAgICAgICAgLmNvbmNhdChjb21tYW5kSGFuZGxlci5taWRkbGV3YXJlcyk7XG4gICAgICAgIGNvbnN0IG1heWJlUHJvbWlzZUFyZ3YgPSBhcHBseU1pZGRsZXdhcmUoaW5uZXJBcmd2LCB5YXJncywgbWlkZGxld2FyZXMsIHRydWUpO1xuICAgICAgICByZXR1cm4gaXNQcm9taXNlKG1heWJlUHJvbWlzZUFyZ3YpXG4gICAgICAgICAgICA/IG1heWJlUHJvbWlzZUFyZ3YudGhlbihyZXNvbHZlZElubmVyQXJndiA9PiB0aGlzLmhhbmRsZVZhbGlkYXRpb25BbmRHZXRSZXN1bHQoaXNEZWZhdWx0Q29tbWFuZCwgY29tbWFuZEhhbmRsZXIsIHJlc29sdmVkSW5uZXJBcmd2LCBjdXJyZW50Q29udGV4dCwgYWxpYXNlcywgeWFyZ3MsIG1pZGRsZXdhcmVzLCBwb3NpdGlvbmFsTWFwKSlcbiAgICAgICAgICAgIDogdGhpcy5oYW5kbGVWYWxpZGF0aW9uQW5kR2V0UmVzdWx0KGlzRGVmYXVsdENvbW1hbmQsIGNvbW1hbmRIYW5kbGVyLCBtYXliZVByb21pc2VBcmd2LCBjdXJyZW50Q29udGV4dCwgYWxpYXNlcywgeWFyZ3MsIG1pZGRsZXdhcmVzLCBwb3NpdGlvbmFsTWFwKTtcbiAgICB9XG4gICAgcG9wdWxhdGVQb3NpdGlvbmFscyhjb21tYW5kSGFuZGxlciwgYXJndiwgY29udGV4dCwgeWFyZ3MpIHtcbiAgICAgICAgYXJndi5fID0gYXJndi5fLnNsaWNlKGNvbnRleHQuY29tbWFuZHMubGVuZ3RoKTtcbiAgICAgICAgY29uc3QgZGVtYW5kZWQgPSBjb21tYW5kSGFuZGxlci5kZW1hbmRlZC5zbGljZSgwKTtcbiAgICAgICAgY29uc3Qgb3B0aW9uYWwgPSBjb21tYW5kSGFuZGxlci5vcHRpb25hbC5zbGljZSgwKTtcbiAgICAgICAgY29uc3QgcG9zaXRpb25hbE1hcCA9IHt9O1xuICAgICAgICB0aGlzLnZhbGlkYXRpb24ucG9zaXRpb25hbENvdW50KGRlbWFuZGVkLmxlbmd0aCwgYXJndi5fLmxlbmd0aCk7XG4gICAgICAgIHdoaWxlIChkZW1hbmRlZC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlbWFuZCA9IGRlbWFuZGVkLnNoaWZ0KCk7XG4gICAgICAgICAgICB0aGlzLnBvcHVsYXRlUG9zaXRpb25hbChkZW1hbmQsIGFyZ3YsIHBvc2l0aW9uYWxNYXApO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChvcHRpb25hbC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IG1heWJlID0gb3B0aW9uYWwuc2hpZnQoKTtcbiAgICAgICAgICAgIHRoaXMucG9wdWxhdGVQb3NpdGlvbmFsKG1heWJlLCBhcmd2LCBwb3NpdGlvbmFsTWFwKTtcbiAgICAgICAgfVxuICAgICAgICBhcmd2Ll8gPSBjb250ZXh0LmNvbW1hbmRzLmNvbmNhdChhcmd2Ll8ubWFwKGEgPT4gJycgKyBhKSk7XG4gICAgICAgIHRoaXMucG9zdFByb2Nlc3NQb3NpdGlvbmFscyhhcmd2LCBwb3NpdGlvbmFsTWFwLCB0aGlzLmNtZFRvUGFyc2VPcHRpb25zKGNvbW1hbmRIYW5kbGVyLm9yaWdpbmFsKSwgeWFyZ3MpO1xuICAgICAgICByZXR1cm4gcG9zaXRpb25hbE1hcDtcbiAgICB9XG4gICAgcG9wdWxhdGVQb3NpdGlvbmFsKHBvc2l0aW9uYWwsIGFyZ3YsIHBvc2l0aW9uYWxNYXApIHtcbiAgICAgICAgY29uc3QgY21kID0gcG9zaXRpb25hbC5jbWRbMF07XG4gICAgICAgIGlmIChwb3NpdGlvbmFsLnZhcmlhZGljKSB7XG4gICAgICAgICAgICBwb3NpdGlvbmFsTWFwW2NtZF0gPSBhcmd2Ll8uc3BsaWNlKDApLm1hcChTdHJpbmcpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGFyZ3YuXy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgcG9zaXRpb25hbE1hcFtjbWRdID0gW1N0cmluZyhhcmd2Ll8uc2hpZnQoKSldO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNtZFRvUGFyc2VPcHRpb25zKGNtZFN0cmluZykge1xuICAgICAgICBjb25zdCBwYXJzZU9wdGlvbnMgPSB7XG4gICAgICAgICAgICBhcnJheTogW10sXG4gICAgICAgICAgICBkZWZhdWx0OiB7fSxcbiAgICAgICAgICAgIGFsaWFzOiB7fSxcbiAgICAgICAgICAgIGRlbWFuZDoge30sXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlQ29tbWFuZChjbWRTdHJpbmcpO1xuICAgICAgICBwYXJzZWQuZGVtYW5kZWQuZm9yRWFjaChkID0+IHtcbiAgICAgICAgICAgIGNvbnN0IFtjbWQsIC4uLmFsaWFzZXNdID0gZC5jbWQ7XG4gICAgICAgICAgICBpZiAoZC52YXJpYWRpYykge1xuICAgICAgICAgICAgICAgIHBhcnNlT3B0aW9ucy5hcnJheS5wdXNoKGNtZCk7XG4gICAgICAgICAgICAgICAgcGFyc2VPcHRpb25zLmRlZmF1bHRbY21kXSA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGFyc2VPcHRpb25zLmFsaWFzW2NtZF0gPSBhbGlhc2VzO1xuICAgICAgICAgICAgcGFyc2VPcHRpb25zLmRlbWFuZFtjbWRdID0gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHBhcnNlZC5vcHRpb25hbC5mb3JFYWNoKG8gPT4ge1xuICAgICAgICAgICAgY29uc3QgW2NtZCwgLi4uYWxpYXNlc10gPSBvLmNtZDtcbiAgICAgICAgICAgIGlmIChvLnZhcmlhZGljKSB7XG4gICAgICAgICAgICAgICAgcGFyc2VPcHRpb25zLmFycmF5LnB1c2goY21kKTtcbiAgICAgICAgICAgICAgICBwYXJzZU9wdGlvbnMuZGVmYXVsdFtjbWRdID0gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYXJzZU9wdGlvbnMuYWxpYXNbY21kXSA9IGFsaWFzZXM7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcGFyc2VPcHRpb25zO1xuICAgIH1cbiAgICBwb3N0UHJvY2Vzc1Bvc2l0aW9uYWxzKGFyZ3YsIHBvc2l0aW9uYWxNYXAsIHBhcnNlT3B0aW9ucywgeWFyZ3MpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHlhcmdzLmdldE9wdGlvbnMoKSk7XG4gICAgICAgIG9wdGlvbnMuZGVmYXVsdCA9IE9iamVjdC5hc3NpZ24ocGFyc2VPcHRpb25zLmRlZmF1bHQsIG9wdGlvbnMuZGVmYXVsdCk7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHBhcnNlT3B0aW9ucy5hbGlhcykpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuYWxpYXNba2V5XSA9IChvcHRpb25zLmFsaWFzW2tleV0gfHwgW10pLmNvbmNhdChwYXJzZU9wdGlvbnMuYWxpYXNba2V5XSk7XG4gICAgICAgIH1cbiAgICAgICAgb3B0aW9ucy5hcnJheSA9IG9wdGlvbnMuYXJyYXkuY29uY2F0KHBhcnNlT3B0aW9ucy5hcnJheSk7XG4gICAgICAgIG9wdGlvbnMuY29uZmlnID0ge307XG4gICAgICAgIGNvbnN0IHVucGFyc2VkID0gW107XG4gICAgICAgIE9iamVjdC5rZXlzKHBvc2l0aW9uYWxNYXApLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgIHBvc2l0aW9uYWxNYXBba2V5XS5tYXAodmFsdWUgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmNvbmZpZ3VyYXRpb25bJ3Vua25vd24tb3B0aW9ucy1hcy1hcmdzJ10pXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMua2V5W2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIHVucGFyc2VkLnB1c2goYC0tJHtrZXl9YCk7XG4gICAgICAgICAgICAgICAgdW5wYXJzZWQucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghdW5wYXJzZWQubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBjb25zdCBjb25maWcgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLmNvbmZpZ3VyYXRpb24sIHtcbiAgICAgICAgICAgICdwb3B1bGF0ZS0tJzogZmFsc2UsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBwYXJzZWQgPSB0aGlzLnNoaW0uUGFyc2VyLmRldGFpbGVkKHVucGFyc2VkLCBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLCB7XG4gICAgICAgICAgICBjb25maWd1cmF0aW9uOiBjb25maWcsXG4gICAgICAgIH0pKTtcbiAgICAgICAgaWYgKHBhcnNlZC5lcnJvcikge1xuICAgICAgICAgICAgeWFyZ3NcbiAgICAgICAgICAgICAgICAuZ2V0SW50ZXJuYWxNZXRob2RzKClcbiAgICAgICAgICAgICAgICAuZ2V0VXNhZ2VJbnN0YW5jZSgpXG4gICAgICAgICAgICAgICAgLmZhaWwocGFyc2VkLmVycm9yLm1lc3NhZ2UsIHBhcnNlZC5lcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBwb3NpdGlvbmFsS2V5cyA9IE9iamVjdC5rZXlzKHBvc2l0aW9uYWxNYXApO1xuICAgICAgICAgICAgT2JqZWN0LmtleXMocG9zaXRpb25hbE1hcCkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uYWxLZXlzLnB1c2goLi4ucGFyc2VkLmFsaWFzZXNba2V5XSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKHBhcnNlZC5hcmd2KS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uYWxLZXlzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwb3NpdGlvbmFsTWFwW2tleV0pXG4gICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbmFsTWFwW2tleV0gPSBwYXJzZWQuYXJndltrZXldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNJbkNvbmZpZ3MoeWFyZ3MsIGtleSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICF0aGlzLmlzRGVmYXVsdGVkKHlhcmdzLCBrZXkpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYXJndiwga2V5KSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHBhcnNlZC5hcmd2LCBrZXkpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAoQXJyYXkuaXNBcnJheShhcmd2W2tleV0pIHx8IEFycmF5LmlzQXJyYXkocGFyc2VkLmFyZ3Zba2V5XSkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmd2W2tleV0gPSBbXS5jb25jYXQoYXJndltrZXldLCBwYXJzZWQuYXJndltrZXldKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3Zba2V5XSA9IHBhcnNlZC5hcmd2W2tleV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpc0RlZmF1bHRlZCh5YXJncywga2V5KSB7XG4gICAgICAgIGNvbnN0IHsgZGVmYXVsdDogZGVmYXVsdHMgfSA9IHlhcmdzLmdldE9wdGlvbnMoKTtcbiAgICAgICAgcmV0dXJuIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGVmYXVsdHMsIGtleSkgfHxcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkZWZhdWx0cywgdGhpcy5zaGltLlBhcnNlci5jYW1lbENhc2Uoa2V5KSkpO1xuICAgIH1cbiAgICBpc0luQ29uZmlncyh5YXJncywga2V5KSB7XG4gICAgICAgIGNvbnN0IHsgY29uZmlnT2JqZWN0cyB9ID0geWFyZ3MuZ2V0T3B0aW9ucygpO1xuICAgICAgICByZXR1cm4gKGNvbmZpZ09iamVjdHMuc29tZShjID0+IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjLCBrZXkpKSB8fFxuICAgICAgICAgICAgY29uZmlnT2JqZWN0cy5zb21lKGMgPT4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGMsIHRoaXMuc2hpbS5QYXJzZXIuY2FtZWxDYXNlKGtleSkpKSk7XG4gICAgfVxuICAgIHJ1bkRlZmF1bHRCdWlsZGVyT24oeWFyZ3MpIHtcbiAgICAgICAgaWYgKCF0aGlzLmRlZmF1bHRDb21tYW5kKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpZiAodGhpcy5zaG91bGRVcGRhdGVVc2FnZSh5YXJncykpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbW1hbmRTdHJpbmcgPSBERUZBVUxUX01BUktFUi50ZXN0KHRoaXMuZGVmYXVsdENvbW1hbmQub3JpZ2luYWwpXG4gICAgICAgICAgICAgICAgPyB0aGlzLmRlZmF1bHRDb21tYW5kLm9yaWdpbmFsXG4gICAgICAgICAgICAgICAgOiB0aGlzLmRlZmF1bHRDb21tYW5kLm9yaWdpbmFsLnJlcGxhY2UoL15bXltcXF08Pl0qLywgJyQwICcpO1xuICAgICAgICAgICAgeWFyZ3NcbiAgICAgICAgICAgICAgICAuZ2V0SW50ZXJuYWxNZXRob2RzKClcbiAgICAgICAgICAgICAgICAuZ2V0VXNhZ2VJbnN0YW5jZSgpXG4gICAgICAgICAgICAgICAgLnVzYWdlKGNvbW1hbmRTdHJpbmcsIHRoaXMuZGVmYXVsdENvbW1hbmQuZGVzY3JpcHRpb24pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSB0aGlzLmRlZmF1bHRDb21tYW5kLmJ1aWxkZXI7XG4gICAgICAgIGlmIChpc0NvbW1hbmRCdWlsZGVyQ2FsbGJhY2soYnVpbGRlcikpIHtcbiAgICAgICAgICAgIHJldHVybiBidWlsZGVyKHlhcmdzLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghaXNDb21tYW5kQnVpbGRlckRlZmluaXRpb24oYnVpbGRlcikpIHtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGJ1aWxkZXIpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgICAgICB5YXJncy5vcHRpb24oa2V5LCBidWlsZGVyW2tleV0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgbW9kdWxlTmFtZShvYmopIHtcbiAgICAgICAgY29uc3QgbW9kID0gd2hpY2hNb2R1bGUob2JqKTtcbiAgICAgICAgaWYgKCFtb2QpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGNvbW1hbmQgbmFtZSBnaXZlbiBmb3IgbW9kdWxlOiAke3RoaXMuc2hpbS5pbnNwZWN0KG9iail9YCk7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbW1hbmRGcm9tRmlsZW5hbWUobW9kLmZpbGVuYW1lKTtcbiAgICB9XG4gICAgY29tbWFuZEZyb21GaWxlbmFtZShmaWxlbmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5zaGltLnBhdGguYmFzZW5hbWUoZmlsZW5hbWUsIHRoaXMuc2hpbS5wYXRoLmV4dG5hbWUoZmlsZW5hbWUpKTtcbiAgICB9XG4gICAgZXh0cmFjdERlc2MoeyBkZXNjcmliZSwgZGVzY3JpcHRpb24sIGRlc2MgfSkge1xuICAgICAgICBmb3IgKGNvbnN0IHRlc3Qgb2YgW2Rlc2NyaWJlLCBkZXNjcmlwdGlvbiwgZGVzY10pIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGVzdCA9PT0gJ3N0cmluZycgfHwgdGVzdCA9PT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRlc3Q7XG4gICAgICAgICAgICBhc3NlcnROb3RTdHJpY3RFcXVhbCh0ZXN0LCB0cnVlLCB0aGlzLnNoaW0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZnJlZXplKCkge1xuICAgICAgICB0aGlzLmZyb3plbnMucHVzaCh7XG4gICAgICAgICAgICBoYW5kbGVyczogdGhpcy5oYW5kbGVycyxcbiAgICAgICAgICAgIGFsaWFzTWFwOiB0aGlzLmFsaWFzTWFwLFxuICAgICAgICAgICAgZGVmYXVsdENvbW1hbmQ6IHRoaXMuZGVmYXVsdENvbW1hbmQsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB1bmZyZWV6ZSgpIHtcbiAgICAgICAgY29uc3QgZnJvemVuID0gdGhpcy5mcm96ZW5zLnBvcCgpO1xuICAgICAgICBhc3NlcnROb3RTdHJpY3RFcXVhbChmcm96ZW4sIHVuZGVmaW5lZCwgdGhpcy5zaGltKTtcbiAgICAgICAgKHtcbiAgICAgICAgICAgIGhhbmRsZXJzOiB0aGlzLmhhbmRsZXJzLFxuICAgICAgICAgICAgYWxpYXNNYXA6IHRoaXMuYWxpYXNNYXAsXG4gICAgICAgICAgICBkZWZhdWx0Q29tbWFuZDogdGhpcy5kZWZhdWx0Q29tbWFuZCxcbiAgICAgICAgfSA9IGZyb3plbik7XG4gICAgfVxuICAgIHJlc2V0KCkge1xuICAgICAgICB0aGlzLmhhbmRsZXJzID0ge307XG4gICAgICAgIHRoaXMuYWxpYXNNYXAgPSB7fTtcbiAgICAgICAgdGhpcy5kZWZhdWx0Q29tbWFuZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5yZXF1aXJlQ2FjaGUgPSBuZXcgU2V0KCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBjb21tYW5kKHVzYWdlLCB2YWxpZGF0aW9uLCBnbG9iYWxNaWRkbGV3YXJlLCBzaGltKSB7XG4gICAgcmV0dXJuIG5ldyBDb21tYW5kSW5zdGFuY2UodXNhZ2UsIHZhbGlkYXRpb24sIGdsb2JhbE1pZGRsZXdhcmUsIHNoaW0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQ29tbWFuZEJ1aWxkZXJEZWZpbml0aW9uKGJ1aWxkZXIpIHtcbiAgICByZXR1cm4gKHR5cGVvZiBidWlsZGVyID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAhIWJ1aWxkZXIuYnVpbGRlciAmJlxuICAgICAgICB0eXBlb2YgYnVpbGRlci5oYW5kbGVyID09PSAnZnVuY3Rpb24nKTtcbn1cbmZ1bmN0aW9uIGlzQ29tbWFuZEFuZEFsaWFzZXMoY21kKSB7XG4gICAgcmV0dXJuIGNtZC5ldmVyeShjID0+IHR5cGVvZiBjID09PSAnc3RyaW5nJyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNDb21tYW5kQnVpbGRlckNhbGxiYWNrKGJ1aWxkZXIpIHtcbiAgICByZXR1cm4gdHlwZW9mIGJ1aWxkZXIgPT09ICdmdW5jdGlvbic7XG59XG5mdW5jdGlvbiBpc0NvbW1hbmRCdWlsZGVyT3B0aW9uRGVmaW5pdGlvbnMoYnVpbGRlcikge1xuICAgIHJldHVybiB0eXBlb2YgYnVpbGRlciA9PT0gJ29iamVjdCc7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNDb21tYW5kSGFuZGxlckRlZmluaXRpb24oY21kKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBjbWQgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KGNtZCk7XG59XG4iLCJ2YXIgX19jbGFzc1ByaXZhdGVGaWVsZFNldCA9ICh0aGlzICYmIHRoaXMuX19jbGFzc1ByaXZhdGVGaWVsZFNldCkgfHwgZnVuY3Rpb24gKHJlY2VpdmVyLCBzdGF0ZSwgdmFsdWUsIGtpbmQsIGYpIHtcbiAgICBpZiAoa2luZCA9PT0gXCJtXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIG1ldGhvZCBpcyBub3Qgd3JpdGFibGVcIik7XG4gICAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgc2V0dGVyXCIpO1xuICAgIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHdyaXRlIHByaXZhdGUgbWVtYmVyIHRvIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XG4gICAgcmV0dXJuIChraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlciwgdmFsdWUpIDogZiA/IGYudmFsdWUgPSB2YWx1ZSA6IHN0YXRlLnNldChyZWNlaXZlciwgdmFsdWUpKSwgdmFsdWU7XG59O1xudmFyIF9fY2xhc3NQcml2YXRlRmllbGRHZXQgPSAodGhpcyAmJiB0aGlzLl9fY2xhc3NQcml2YXRlRmllbGRHZXQpIHx8IGZ1bmN0aW9uIChyZWNlaXZlciwgc3RhdGUsIGtpbmQsIGYpIHtcbiAgICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBnZXR0ZXJcIik7XG4gICAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgIT09IHN0YXRlIHx8ICFmIDogIXN0YXRlLmhhcyhyZWNlaXZlcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgcmVhZCBwcml2YXRlIG1lbWJlciBmcm9tIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XG4gICAgcmV0dXJuIGtpbmQgPT09IFwibVwiID8gZiA6IGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyKSA6IGYgPyBmLnZhbHVlIDogc3RhdGUuZ2V0KHJlY2VpdmVyKTtcbn07XG52YXIgX1lhcmdzSW5zdGFuY2VfY29tbWFuZCwgX1lhcmdzSW5zdGFuY2VfY3dkLCBfWWFyZ3NJbnN0YW5jZV9jb250ZXh0LCBfWWFyZ3NJbnN0YW5jZV9jb21wbGV0aW9uLCBfWWFyZ3NJbnN0YW5jZV9jb21wbGV0aW9uQ29tbWFuZCwgX1lhcmdzSW5zdGFuY2VfZGVmYXVsdFNob3dIaWRkZW5PcHQsIF9ZYXJnc0luc3RhbmNlX2V4aXRFcnJvciwgX1lhcmdzSW5zdGFuY2VfZGV0ZWN0TG9jYWxlLCBfWWFyZ3NJbnN0YW5jZV9lbWl0dGVkV2FybmluZ3MsIF9ZYXJnc0luc3RhbmNlX2V4aXRQcm9jZXNzLCBfWWFyZ3NJbnN0YW5jZV9mcm96ZW5zLCBfWWFyZ3NJbnN0YW5jZV9nbG9iYWxNaWRkbGV3YXJlLCBfWWFyZ3NJbnN0YW5jZV9ncm91cHMsIF9ZYXJnc0luc3RhbmNlX2hhc091dHB1dCwgX1lhcmdzSW5zdGFuY2VfaGVscE9wdCwgX1lhcmdzSW5zdGFuY2VfaXNHbG9iYWxDb250ZXh0LCBfWWFyZ3NJbnN0YW5jZV9sb2dnZXIsIF9ZYXJnc0luc3RhbmNlX291dHB1dCwgX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucywgX1lhcmdzSW5zdGFuY2VfcGFyZW50UmVxdWlyZSwgX1lhcmdzSW5zdGFuY2VfcGFyc2VyQ29uZmlnLCBfWWFyZ3NJbnN0YW5jZV9wYXJzZUZuLCBfWWFyZ3NJbnN0YW5jZV9wYXJzZUNvbnRleHQsIF9ZYXJnc0luc3RhbmNlX3BrZ3MsIF9ZYXJnc0luc3RhbmNlX3ByZXNlcnZlZEdyb3VwcywgX1lhcmdzSW5zdGFuY2VfcHJvY2Vzc0FyZ3MsIF9ZYXJnc0luc3RhbmNlX3JlY29tbWVuZENvbW1hbmRzLCBfWWFyZ3NJbnN0YW5jZV9zaGltLCBfWWFyZ3NJbnN0YW5jZV9zdHJpY3QsIF9ZYXJnc0luc3RhbmNlX3N0cmljdENvbW1hbmRzLCBfWWFyZ3NJbnN0YW5jZV9zdHJpY3RPcHRpb25zLCBfWWFyZ3NJbnN0YW5jZV91c2FnZSwgX1lhcmdzSW5zdGFuY2VfdXNhZ2VDb25maWcsIF9ZYXJnc0luc3RhbmNlX3ZlcnNpb25PcHQsIF9ZYXJnc0luc3RhbmNlX3ZhbGlkYXRpb247XG5pbXBvcnQgeyBjb21tYW5kIGFzIENvbW1hbmQsIH0gZnJvbSAnLi9jb21tYW5kLmpzJztcbmltcG9ydCB7IGFzc2VydE5vdFN0cmljdEVxdWFsLCBhc3NlcnRTaW5nbGVLZXksIG9iamVjdEtleXMsIH0gZnJvbSAnLi90eXBpbmdzL2NvbW1vbi10eXBlcy5qcyc7XG5pbXBvcnQgeyBZRXJyb3IgfSBmcm9tICcuL3llcnJvci5qcyc7XG5pbXBvcnQgeyB1c2FnZSBhcyBVc2FnZSB9IGZyb20gJy4vdXNhZ2UuanMnO1xuaW1wb3J0IHsgYXJnc2VydCB9IGZyb20gJy4vYXJnc2VydC5qcyc7XG5pbXBvcnQgeyBjb21wbGV0aW9uIGFzIENvbXBsZXRpb24sIH0gZnJvbSAnLi9jb21wbGV0aW9uLmpzJztcbmltcG9ydCB7IHZhbGlkYXRpb24gYXMgVmFsaWRhdGlvbiwgfSBmcm9tICcuL3ZhbGlkYXRpb24uanMnO1xuaW1wb3J0IHsgb2JqRmlsdGVyIH0gZnJvbSAnLi91dGlscy9vYmotZmlsdGVyLmpzJztcbmltcG9ydCB7IGFwcGx5RXh0ZW5kcyB9IGZyb20gJy4vdXRpbHMvYXBwbHktZXh0ZW5kcy5qcyc7XG5pbXBvcnQgeyBhcHBseU1pZGRsZXdhcmUsIEdsb2JhbE1pZGRsZXdhcmUsIH0gZnJvbSAnLi9taWRkbGV3YXJlLmpzJztcbmltcG9ydCB7IGlzUHJvbWlzZSB9IGZyb20gJy4vdXRpbHMvaXMtcHJvbWlzZS5qcyc7XG5pbXBvcnQgeyBtYXliZUFzeW5jUmVzdWx0IH0gZnJvbSAnLi91dGlscy9tYXliZS1hc3luYy1yZXN1bHQuanMnO1xuaW1wb3J0IHNldEJsb2NraW5nIGZyb20gJy4vdXRpbHMvc2V0LWJsb2NraW5nLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBZYXJnc0ZhY3RvcnkoX3NoaW0pIHtcbiAgICByZXR1cm4gKHByb2Nlc3NBcmdzID0gW10sIGN3ZCA9IF9zaGltLnByb2Nlc3MuY3dkKCksIHBhcmVudFJlcXVpcmUpID0+IHtcbiAgICAgICAgY29uc3QgeWFyZ3MgPSBuZXcgWWFyZ3NJbnN0YW5jZShwcm9jZXNzQXJncywgY3dkLCBwYXJlbnRSZXF1aXJlLCBfc2hpbSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh5YXJncywgJ2FyZ3YnLCB7XG4gICAgICAgICAgICBnZXQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4geWFyZ3MucGFyc2UoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgICAgeWFyZ3MuaGVscCgpO1xuICAgICAgICB5YXJncy52ZXJzaW9uKCk7XG4gICAgICAgIHJldHVybiB5YXJncztcbiAgICB9O1xufVxuY29uc3Qga0NvcHlEb3VibGVEYXNoID0gU3ltYm9sKCdjb3B5RG91YmxlRGFzaCcpO1xuY29uc3Qga0NyZWF0ZUxvZ2dlciA9IFN5bWJvbCgnY29weURvdWJsZURhc2gnKTtcbmNvbnN0IGtEZWxldGVGcm9tUGFyc2VySGludE9iamVjdCA9IFN5bWJvbCgnZGVsZXRlRnJvbVBhcnNlckhpbnRPYmplY3QnKTtcbmNvbnN0IGtFbWl0V2FybmluZyA9IFN5bWJvbCgnZW1pdFdhcm5pbmcnKTtcbmNvbnN0IGtGcmVlemUgPSBTeW1ib2woJ2ZyZWV6ZScpO1xuY29uc3Qga0dldERvbGxhclplcm8gPSBTeW1ib2woJ2dldERvbGxhclplcm8nKTtcbmNvbnN0IGtHZXRQYXJzZXJDb25maWd1cmF0aW9uID0gU3ltYm9sKCdnZXRQYXJzZXJDb25maWd1cmF0aW9uJyk7XG5jb25zdCBrR2V0VXNhZ2VDb25maWd1cmF0aW9uID0gU3ltYm9sKCdnZXRVc2FnZUNvbmZpZ3VyYXRpb24nKTtcbmNvbnN0IGtHdWVzc0xvY2FsZSA9IFN5bWJvbCgnZ3Vlc3NMb2NhbGUnKTtcbmNvbnN0IGtHdWVzc1ZlcnNpb24gPSBTeW1ib2woJ2d1ZXNzVmVyc2lvbicpO1xuY29uc3Qga1BhcnNlUG9zaXRpb25hbE51bWJlcnMgPSBTeW1ib2woJ3BhcnNlUG9zaXRpb25hbE51bWJlcnMnKTtcbmNvbnN0IGtQa2dVcCA9IFN5bWJvbCgncGtnVXAnKTtcbmNvbnN0IGtQb3B1bGF0ZVBhcnNlckhpbnRBcnJheSA9IFN5bWJvbCgncG9wdWxhdGVQYXJzZXJIaW50QXJyYXknKTtcbmNvbnN0IGtQb3B1bGF0ZVBhcnNlckhpbnRTaW5nbGVWYWx1ZURpY3Rpb25hcnkgPSBTeW1ib2woJ3BvcHVsYXRlUGFyc2VySGludFNpbmdsZVZhbHVlRGljdGlvbmFyeScpO1xuY29uc3Qga1BvcHVsYXRlUGFyc2VySGludEFycmF5RGljdGlvbmFyeSA9IFN5bWJvbCgncG9wdWxhdGVQYXJzZXJIaW50QXJyYXlEaWN0aW9uYXJ5Jyk7XG5jb25zdCBrUG9wdWxhdGVQYXJzZXJIaW50RGljdGlvbmFyeSA9IFN5bWJvbCgncG9wdWxhdGVQYXJzZXJIaW50RGljdGlvbmFyeScpO1xuY29uc3Qga1Nhbml0aXplS2V5ID0gU3ltYm9sKCdzYW5pdGl6ZUtleScpO1xuY29uc3Qga1NldEtleSA9IFN5bWJvbCgnc2V0S2V5Jyk7XG5jb25zdCBrVW5mcmVlemUgPSBTeW1ib2woJ3VuZnJlZXplJyk7XG5jb25zdCBrVmFsaWRhdGVBc3luYyA9IFN5bWJvbCgndmFsaWRhdGVBc3luYycpO1xuY29uc3Qga0dldENvbW1hbmRJbnN0YW5jZSA9IFN5bWJvbCgnZ2V0Q29tbWFuZEluc3RhbmNlJyk7XG5jb25zdCBrR2V0Q29udGV4dCA9IFN5bWJvbCgnZ2V0Q29udGV4dCcpO1xuY29uc3Qga0dldEhhc091dHB1dCA9IFN5bWJvbCgnZ2V0SGFzT3V0cHV0Jyk7XG5jb25zdCBrR2V0TG9nZ2VySW5zdGFuY2UgPSBTeW1ib2woJ2dldExvZ2dlckluc3RhbmNlJyk7XG5jb25zdCBrR2V0UGFyc2VDb250ZXh0ID0gU3ltYm9sKCdnZXRQYXJzZUNvbnRleHQnKTtcbmNvbnN0IGtHZXRVc2FnZUluc3RhbmNlID0gU3ltYm9sKCdnZXRVc2FnZUluc3RhbmNlJyk7XG5jb25zdCBrR2V0VmFsaWRhdGlvbkluc3RhbmNlID0gU3ltYm9sKCdnZXRWYWxpZGF0aW9uSW5zdGFuY2UnKTtcbmNvbnN0IGtIYXNQYXJzZUNhbGxiYWNrID0gU3ltYm9sKCdoYXNQYXJzZUNhbGxiYWNrJyk7XG5jb25zdCBrSXNHbG9iYWxDb250ZXh0ID0gU3ltYm9sKCdpc0dsb2JhbENvbnRleHQnKTtcbmNvbnN0IGtQb3N0UHJvY2VzcyA9IFN5bWJvbCgncG9zdFByb2Nlc3MnKTtcbmNvbnN0IGtSZWJhc2UgPSBTeW1ib2woJ3JlYmFzZScpO1xuY29uc3Qga1Jlc2V0ID0gU3ltYm9sKCdyZXNldCcpO1xuY29uc3Qga1J1bllhcmdzUGFyc2VyQW5kRXhlY3V0ZUNvbW1hbmRzID0gU3ltYm9sKCdydW5ZYXJnc1BhcnNlckFuZEV4ZWN1dGVDb21tYW5kcycpO1xuY29uc3Qga1J1blZhbGlkYXRpb24gPSBTeW1ib2woJ3J1blZhbGlkYXRpb24nKTtcbmNvbnN0IGtTZXRIYXNPdXRwdXQgPSBTeW1ib2woJ3NldEhhc091dHB1dCcpO1xuY29uc3Qga1RyYWNrTWFudWFsbHlTZXRLZXlzID0gU3ltYm9sKCdrVHJhY2tNYW51YWxseVNldEtleXMnKTtcbmV4cG9ydCBjbGFzcyBZYXJnc0luc3RhbmNlIHtcbiAgICBjb25zdHJ1Y3Rvcihwcm9jZXNzQXJncyA9IFtdLCBjd2QsIHBhcmVudFJlcXVpcmUsIHNoaW0pIHtcbiAgICAgICAgdGhpcy5jdXN0b21TY3JpcHROYW1lID0gZmFsc2U7XG4gICAgICAgIHRoaXMucGFyc2VkID0gZmFsc2U7XG4gICAgICAgIF9ZYXJnc0luc3RhbmNlX2NvbW1hbmQuc2V0KHRoaXMsIHZvaWQgMCk7XG4gICAgICAgIF9ZYXJnc0luc3RhbmNlX2N3ZC5zZXQodGhpcywgdm9pZCAwKTtcbiAgICAgICAgX1lhcmdzSW5zdGFuY2VfY29udGV4dC5zZXQodGhpcywgeyBjb21tYW5kczogW10sIGZ1bGxDb21tYW5kczogW10gfSk7XG4gICAgICAgIF9ZYXJnc0luc3RhbmNlX2NvbXBsZXRpb24uc2V0KHRoaXMsIG51bGwpO1xuICAgICAgICBfWWFyZ3NJbnN0YW5jZV9jb21wbGV0aW9uQ29tbWFuZC5zZXQodGhpcywgbnVsbCk7XG4gICAgICAgIF9ZYXJnc0luc3RhbmNlX2RlZmF1bHRTaG93SGlkZGVuT3B0LnNldCh0aGlzLCAnc2hvdy1oaWRkZW4nKTtcbiAgICAgICAgX1lhcmdzSW5zdGFuY2VfZXhpdEVycm9yLnNldCh0aGlzLCBudWxsKTtcbiAgICAgICAgX1lhcmdzSW5zdGFuY2VfZGV0ZWN0TG9jYWxlLnNldCh0aGlzLCB0cnVlKTtcbiAgICAgICAgX1lhcmdzSW5zdGFuY2VfZW1pdHRlZFdhcm5pbmdzLnNldCh0aGlzLCB7fSk7XG4gICAgICAgIF9ZYXJnc0luc3RhbmNlX2V4aXRQcm9jZXNzLnNldCh0aGlzLCB0cnVlKTtcbiAgICAgICAgX1lhcmdzSW5zdGFuY2VfZnJvemVucy5zZXQodGhpcywgW10pO1xuICAgICAgICBfWWFyZ3NJbnN0YW5jZV9nbG9iYWxNaWRkbGV3YXJlLnNldCh0aGlzLCB2b2lkIDApO1xuICAgICAgICBfWWFyZ3NJbnN0YW5jZV9ncm91cHMuc2V0KHRoaXMsIHt9KTtcbiAgICAgICAgX1lhcmdzSW5zdGFuY2VfaGFzT3V0cHV0LnNldCh0aGlzLCBmYWxzZSk7XG4gICAgICAgIF9ZYXJnc0luc3RhbmNlX2hlbHBPcHQuc2V0KHRoaXMsIG51bGwpO1xuICAgICAgICBfWWFyZ3NJbnN0YW5jZV9pc0dsb2JhbENvbnRleHQuc2V0KHRoaXMsIHRydWUpO1xuICAgICAgICBfWWFyZ3NJbnN0YW5jZV9sb2dnZXIuc2V0KHRoaXMsIHZvaWQgMCk7XG4gICAgICAgIF9ZYXJnc0luc3RhbmNlX291dHB1dC5zZXQodGhpcywgJycpO1xuICAgICAgICBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLnNldCh0aGlzLCB2b2lkIDApO1xuICAgICAgICBfWWFyZ3NJbnN0YW5jZV9wYXJlbnRSZXF1aXJlLnNldCh0aGlzLCB2b2lkIDApO1xuICAgICAgICBfWWFyZ3NJbnN0YW5jZV9wYXJzZXJDb25maWcuc2V0KHRoaXMsIHt9KTtcbiAgICAgICAgX1lhcmdzSW5zdGFuY2VfcGFyc2VGbi5zZXQodGhpcywgbnVsbCk7XG4gICAgICAgIF9ZYXJnc0luc3RhbmNlX3BhcnNlQ29udGV4dC5zZXQodGhpcywgbnVsbCk7XG4gICAgICAgIF9ZYXJnc0luc3RhbmNlX3BrZ3Muc2V0KHRoaXMsIHt9KTtcbiAgICAgICAgX1lhcmdzSW5zdGFuY2VfcHJlc2VydmVkR3JvdXBzLnNldCh0aGlzLCB7fSk7XG4gICAgICAgIF9ZYXJnc0luc3RhbmNlX3Byb2Nlc3NBcmdzLnNldCh0aGlzLCB2b2lkIDApO1xuICAgICAgICBfWWFyZ3NJbnN0YW5jZV9yZWNvbW1lbmRDb21tYW5kcy5zZXQodGhpcywgZmFsc2UpO1xuICAgICAgICBfWWFyZ3NJbnN0YW5jZV9zaGltLnNldCh0aGlzLCB2b2lkIDApO1xuICAgICAgICBfWWFyZ3NJbnN0YW5jZV9zdHJpY3Quc2V0KHRoaXMsIGZhbHNlKTtcbiAgICAgICAgX1lhcmdzSW5zdGFuY2Vfc3RyaWN0Q29tbWFuZHMuc2V0KHRoaXMsIGZhbHNlKTtcbiAgICAgICAgX1lhcmdzSW5zdGFuY2Vfc3RyaWN0T3B0aW9ucy5zZXQodGhpcywgZmFsc2UpO1xuICAgICAgICBfWWFyZ3NJbnN0YW5jZV91c2FnZS5zZXQodGhpcywgdm9pZCAwKTtcbiAgICAgICAgX1lhcmdzSW5zdGFuY2VfdXNhZ2VDb25maWcuc2V0KHRoaXMsIHt9KTtcbiAgICAgICAgX1lhcmdzSW5zdGFuY2VfdmVyc2lvbk9wdC5zZXQodGhpcywgbnVsbCk7XG4gICAgICAgIF9ZYXJnc0luc3RhbmNlX3ZhbGlkYXRpb24uc2V0KHRoaXMsIHZvaWQgMCk7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc2hpbSwgc2hpbSwgXCJmXCIpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3Byb2Nlc3NBcmdzLCBwcm9jZXNzQXJncywgXCJmXCIpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2N3ZCwgY3dkLCBcImZcIik7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfcGFyZW50UmVxdWlyZSwgcGFyZW50UmVxdWlyZSwgXCJmXCIpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2dsb2JhbE1pZGRsZXdhcmUsIG5ldyBHbG9iYWxNaWRkbGV3YXJlKHRoaXMpLCBcImZcIik7XG4gICAgICAgIHRoaXMuJDAgPSB0aGlzW2tHZXREb2xsYXJaZXJvXSgpO1xuICAgICAgICB0aGlzW2tSZXNldF0oKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9jb21tYW5kLCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2NvbW1hbmQsIFwiZlwiKSwgXCJmXCIpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBcImZcIiksIFwiZlwiKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV92YWxpZGF0aW9uLCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3ZhbGlkYXRpb24sIFwiZlwiKSwgXCJmXCIpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucywgXCJmXCIpLCBcImZcIik7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucywgXCJmXCIpLnNob3dIaWRkZW5PcHQgPSBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2RlZmF1bHRTaG93SGlkZGVuT3B0LCBcImZcIik7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfbG9nZ2VyLCB0aGlzW2tDcmVhdGVMb2dnZXJdKCksIFwiZlwiKTtcbiAgICB9XG4gICAgYWRkSGVscE9wdChvcHQsIG1zZykge1xuICAgICAgICBjb25zdCBkZWZhdWx0SGVscE9wdCA9ICdoZWxwJztcbiAgICAgICAgYXJnc2VydCgnW3N0cmluZ3xib29sZWFuXSBbc3RyaW5nXScsIFtvcHQsIG1zZ10sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICBpZiAoX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9oZWxwT3B0LCBcImZcIikpIHtcbiAgICAgICAgICAgIHRoaXNba0RlbGV0ZUZyb21QYXJzZXJIaW50T2JqZWN0XShfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2hlbHBPcHQsIFwiZlwiKSk7XG4gICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2hlbHBPcHQsIG51bGwsIFwiZlwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0ID09PSBmYWxzZSAmJiBtc2cgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2hlbHBPcHQsIHR5cGVvZiBvcHQgPT09ICdzdHJpbmcnID8gb3B0IDogZGVmYXVsdEhlbHBPcHQsIFwiZlwiKTtcbiAgICAgICAgdGhpcy5ib29sZWFuKF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfaGVscE9wdCwgXCJmXCIpKTtcbiAgICAgICAgdGhpcy5kZXNjcmliZShfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2hlbHBPcHQsIFwiZlwiKSwgbXNnIHx8IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdXNhZ2UsIFwiZlwiKS5kZWZlclkxOG5Mb29rdXAoJ1Nob3cgaGVscCcpKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGhlbHAob3B0LCBtc2cpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkSGVscE9wdChvcHQsIG1zZyk7XG4gICAgfVxuICAgIGFkZFNob3dIaWRkZW5PcHQob3B0LCBtc2cpIHtcbiAgICAgICAgYXJnc2VydCgnW3N0cmluZ3xib29sZWFuXSBbc3RyaW5nXScsIFtvcHQsIG1zZ10sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICBpZiAob3B0ID09PSBmYWxzZSAmJiBtc2cgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICBjb25zdCBzaG93SGlkZGVuT3B0ID0gdHlwZW9mIG9wdCA9PT0gJ3N0cmluZycgPyBvcHQgOiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2RlZmF1bHRTaG93SGlkZGVuT3B0LCBcImZcIik7XG4gICAgICAgIHRoaXMuYm9vbGVhbihzaG93SGlkZGVuT3B0KTtcbiAgICAgICAgdGhpcy5kZXNjcmliZShzaG93SGlkZGVuT3B0LCBtc2cgfHwgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV91c2FnZSwgXCJmXCIpLmRlZmVyWTE4bkxvb2t1cCgnU2hvdyBoaWRkZW4gb3B0aW9ucycpKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBcImZcIikuc2hvd0hpZGRlbk9wdCA9IHNob3dIaWRkZW5PcHQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBzaG93SGlkZGVuKG9wdCwgbXNnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZFNob3dIaWRkZW5PcHQob3B0LCBtc2cpO1xuICAgIH1cbiAgICBhbGlhcyhrZXksIHZhbHVlKSB7XG4gICAgICAgIGFyZ3NlcnQoJzxvYmplY3R8c3RyaW5nfGFycmF5PiBbc3RyaW5nfGFycmF5XScsIFtrZXksIHZhbHVlXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIHRoaXNba1BvcHVsYXRlUGFyc2VySGludEFycmF5RGljdGlvbmFyeV0odGhpcy5hbGlhcy5iaW5kKHRoaXMpLCAnYWxpYXMnLCBrZXksIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGFycmF5KGtleXMpIHtcbiAgICAgICAgYXJnc2VydCgnPGFycmF5fHN0cmluZz4nLCBba2V5c10sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICB0aGlzW2tQb3B1bGF0ZVBhcnNlckhpbnRBcnJheV0oJ2FycmF5Jywga2V5cyk7XG4gICAgICAgIHRoaXNba1RyYWNrTWFudWFsbHlTZXRLZXlzXShrZXlzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGJvb2xlYW4oa2V5cykge1xuICAgICAgICBhcmdzZXJ0KCc8YXJyYXl8c3RyaW5nPicsIFtrZXlzXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIHRoaXNba1BvcHVsYXRlUGFyc2VySGludEFycmF5XSgnYm9vbGVhbicsIGtleXMpO1xuICAgICAgICB0aGlzW2tUcmFja01hbnVhbGx5U2V0S2V5c10oa2V5cyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBjaGVjayhmLCBnbG9iYWwpIHtcbiAgICAgICAgYXJnc2VydCgnPGZ1bmN0aW9uPiBbYm9vbGVhbl0nLCBbZiwgZ2xvYmFsXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIHRoaXMubWlkZGxld2FyZSgoYXJndiwgX3lhcmdzKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbWF5YmVBc3luY1Jlc3VsdCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGYoYXJndiwgX3lhcmdzLmdldE9wdGlvbnMoKSk7XG4gICAgICAgICAgICB9LCAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV91c2FnZSwgXCJmXCIpLmZhaWwoX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9zaGltLCBcImZcIikueTE4bi5fXygnQXJndW1lbnQgY2hlY2sgZmFpbGVkOiAlcycsIGYudG9TdHJpbmcoKSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgcmVzdWx0ID09PSAnc3RyaW5nJyB8fCByZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBcImZcIikuZmFpbChyZXN1bHQudG9TdHJpbmcoKSwgcmVzdWx0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFyZ3Y7XG4gICAgICAgICAgICB9LCAoZXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV91c2FnZSwgXCJmXCIpLmZhaWwoZXJyLm1lc3NhZ2UgPyBlcnIubWVzc2FnZSA6IGVyci50b1N0cmluZygpLCBlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBhcmd2O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sIGZhbHNlLCBnbG9iYWwpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgY2hvaWNlcyhrZXksIHZhbHVlKSB7XG4gICAgICAgIGFyZ3NlcnQoJzxvYmplY3R8c3RyaW5nfGFycmF5PiBbc3RyaW5nfGFycmF5XScsIFtrZXksIHZhbHVlXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIHRoaXNba1BvcHVsYXRlUGFyc2VySGludEFycmF5RGljdGlvbmFyeV0odGhpcy5jaG9pY2VzLmJpbmQodGhpcyksICdjaG9pY2VzJywga2V5LCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBjb2VyY2Uoa2V5cywgdmFsdWUpIHtcbiAgICAgICAgYXJnc2VydCgnPG9iamVjdHxzdHJpbmd8YXJyYXk+IFtmdW5jdGlvbl0nLCBba2V5cywgdmFsdWVdLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoa2V5cykpIHtcbiAgICAgICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWUVycm9yKCdjb2VyY2UgY2FsbGJhY2sgbXVzdCBiZSBwcm92aWRlZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgICAgICAgICAgIHRoaXMuY29lcmNlKGtleSwgdmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIGtleXMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhrZXlzKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29lcmNlKGtleSwga2V5c1trZXldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBZRXJyb3IoJ2NvZXJjZSBjYWxsYmFjayBtdXN0IGJlIHByb3ZpZGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBcImZcIikua2V5W2tleXNdID0gdHJ1ZTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9nbG9iYWxNaWRkbGV3YXJlLCBcImZcIikuYWRkQ29lcmNlTWlkZGxld2FyZSgoYXJndiwgeWFyZ3MpID0+IHtcbiAgICAgICAgICAgIGxldCBhbGlhc2VzO1xuICAgICAgICAgICAgY29uc3Qgc2hvdWxkQ29lcmNlID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGFyZ3YsIGtleXMpO1xuICAgICAgICAgICAgaWYgKCFzaG91bGRDb2VyY2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXJndjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBtYXliZUFzeW5jUmVzdWx0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBhbGlhc2VzID0geWFyZ3MuZ2V0QWxpYXNlcygpO1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZShhcmd2W2tleXNdKTtcbiAgICAgICAgICAgIH0sIChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICBhcmd2W2tleXNdID0gcmVzdWx0O1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0cmlwQWxpYXNlZCA9IHlhcmdzXG4gICAgICAgICAgICAgICAgICAgIC5nZXRJbnRlcm5hbE1ldGhvZHMoKVxuICAgICAgICAgICAgICAgICAgICAuZ2V0UGFyc2VyQ29uZmlndXJhdGlvbigpWydzdHJpcC1hbGlhc2VkJ107XG4gICAgICAgICAgICAgICAgaWYgKGFsaWFzZXNba2V5c10gJiYgc3RyaXBBbGlhc2VkICE9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYWxpYXMgb2YgYWxpYXNlc1trZXlzXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJndlthbGlhc10gPSByZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFyZ3Y7XG4gICAgICAgICAgICB9LCAoZXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFlFcnJvcihlcnIubWVzc2FnZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSwga2V5cyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBjb25mbGljdHMoa2V5MSwga2V5Mikge1xuICAgICAgICBhcmdzZXJ0KCc8c3RyaW5nfG9iamVjdD4gW3N0cmluZ3xhcnJheV0nLCBba2V5MSwga2V5Ml0sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3ZhbGlkYXRpb24sIFwiZlwiKS5jb25mbGljdHMoa2V5MSwga2V5Mik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBjb25maWcoa2V5ID0gJ2NvbmZpZycsIG1zZywgcGFyc2VGbikge1xuICAgICAgICBhcmdzZXJ0KCdbb2JqZWN0fHN0cmluZ10gW3N0cmluZ3xmdW5jdGlvbl0gW2Z1bmN0aW9uXScsIFtrZXksIG1zZywgcGFyc2VGbl0sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICBpZiAodHlwZW9mIGtleSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoa2V5KSkge1xuICAgICAgICAgICAga2V5ID0gYXBwbHlFeHRlbmRzKGtleSwgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9jd2QsIFwiZlwiKSwgdGhpc1trR2V0UGFyc2VyQ29uZmlndXJhdGlvbl0oKVsnZGVlcC1tZXJnZS1jb25maWcnXSB8fCBmYWxzZSwgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9zaGltLCBcImZcIikpO1xuICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBcImZcIikuY29uZmlnT2JqZWN0cyA9IChfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKS5jb25maWdPYmplY3RzIHx8IFtdKS5jb25jYXQoa2V5KTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgbXNnID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBwYXJzZUZuID0gbXNnO1xuICAgICAgICAgICAgbXNnID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGVzY3JpYmUoa2V5LCBtc2cgfHwgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV91c2FnZSwgXCJmXCIpLmRlZmVyWTE4bkxvb2t1cCgnUGF0aCB0byBKU09OIGNvbmZpZyBmaWxlJykpO1xuICAgICAgICAoQXJyYXkuaXNBcnJheShrZXkpID8ga2V5IDogW2tleV0pLmZvckVhY2goayA9PiB7XG4gICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKS5jb25maWdba10gPSBwYXJzZUZuIHx8IHRydWU7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgY29tcGxldGlvbihjbWQsIGRlc2MsIGZuKSB7XG4gICAgICAgIGFyZ3NlcnQoJ1tzdHJpbmddIFtzdHJpbmd8Ym9vbGVhbnxmdW5jdGlvbl0gW2Z1bmN0aW9uXScsIFtjbWQsIGRlc2MsIGZuXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIGlmICh0eXBlb2YgZGVzYyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgZm4gPSBkZXNjO1xuICAgICAgICAgICAgZGVzYyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2NvbXBsZXRpb25Db21tYW5kLCBjbWQgfHwgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9jb21wbGV0aW9uQ29tbWFuZCwgXCJmXCIpIHx8ICdjb21wbGV0aW9uJywgXCJmXCIpO1xuICAgICAgICBpZiAoIWRlc2MgJiYgZGVzYyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGRlc2MgPSAnZ2VuZXJhdGUgY29tcGxldGlvbiBzY3JpcHQnO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29tbWFuZChfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2NvbXBsZXRpb25Db21tYW5kLCBcImZcIiksIGRlc2MpO1xuICAgICAgICBpZiAoZm4pXG4gICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2NvbXBsZXRpb24sIFwiZlwiKS5yZWdpc3RlckZ1bmN0aW9uKGZuKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGNvbW1hbmQoY21kLCBkZXNjcmlwdGlvbiwgYnVpbGRlciwgaGFuZGxlciwgbWlkZGxld2FyZXMsIGRlcHJlY2F0ZWQpIHtcbiAgICAgICAgYXJnc2VydCgnPHN0cmluZ3xhcnJheXxvYmplY3Q+IFtzdHJpbmd8Ym9vbGVhbl0gW2Z1bmN0aW9ufG9iamVjdF0gW2Z1bmN0aW9uXSBbYXJyYXldIFtib29sZWFufHN0cmluZ10nLCBbY21kLCBkZXNjcmlwdGlvbiwgYnVpbGRlciwgaGFuZGxlciwgbWlkZGxld2FyZXMsIGRlcHJlY2F0ZWRdLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9jb21tYW5kLCBcImZcIikuYWRkSGFuZGxlcihjbWQsIGRlc2NyaXB0aW9uLCBidWlsZGVyLCBoYW5kbGVyLCBtaWRkbGV3YXJlcywgZGVwcmVjYXRlZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBjb21tYW5kcyhjbWQsIGRlc2NyaXB0aW9uLCBidWlsZGVyLCBoYW5kbGVyLCBtaWRkbGV3YXJlcywgZGVwcmVjYXRlZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb21tYW5kKGNtZCwgZGVzY3JpcHRpb24sIGJ1aWxkZXIsIGhhbmRsZXIsIG1pZGRsZXdhcmVzLCBkZXByZWNhdGVkKTtcbiAgICB9XG4gICAgY29tbWFuZERpcihkaXIsIG9wdHMpIHtcbiAgICAgICAgYXJnc2VydCgnPHN0cmluZz4gW29iamVjdF0nLCBbZGlyLCBvcHRzXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIGNvbnN0IHJlcSA9IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfcGFyZW50UmVxdWlyZSwgXCJmXCIpIHx8IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc2hpbSwgXCJmXCIpLnJlcXVpcmU7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfY29tbWFuZCwgXCJmXCIpLmFkZERpcmVjdG9yeShkaXIsIHJlcSwgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9zaGltLCBcImZcIikuZ2V0Q2FsbGVyRmlsZSgpLCBvcHRzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGNvdW50KGtleXMpIHtcbiAgICAgICAgYXJnc2VydCgnPGFycmF5fHN0cmluZz4nLCBba2V5c10sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICB0aGlzW2tQb3B1bGF0ZVBhcnNlckhpbnRBcnJheV0oJ2NvdW50Jywga2V5cyk7XG4gICAgICAgIHRoaXNba1RyYWNrTWFudWFsbHlTZXRLZXlzXShrZXlzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGRlZmF1bHQoa2V5LCB2YWx1ZSwgZGVmYXVsdERlc2NyaXB0aW9uKSB7XG4gICAgICAgIGFyZ3NlcnQoJzxvYmplY3R8c3RyaW5nfGFycmF5PiBbKl0gW3N0cmluZ10nLCBba2V5LCB2YWx1ZSwgZGVmYXVsdERlc2NyaXB0aW9uXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIGlmIChkZWZhdWx0RGVzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIGFzc2VydFNpbmdsZUtleShrZXksIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc2hpbSwgXCJmXCIpKTtcbiAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucywgXCJmXCIpLmRlZmF1bHREZXNjcmlwdGlvbltrZXldID0gZGVmYXVsdERlc2NyaXB0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGFzc2VydFNpbmdsZUtleShrZXksIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc2hpbSwgXCJmXCIpKTtcbiAgICAgICAgICAgIGlmICghX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBcImZcIikuZGVmYXVsdERlc2NyaXB0aW9uW2tleV0pXG4gICAgICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBcImZcIikuZGVmYXVsdERlc2NyaXB0aW9uW2tleV0gPVxuICAgICAgICAgICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBcImZcIikuZnVuY3Rpb25EZXNjcmlwdGlvbih2YWx1ZSk7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLmNhbGwoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzW2tQb3B1bGF0ZVBhcnNlckhpbnRTaW5nbGVWYWx1ZURpY3Rpb25hcnldKHRoaXMuZGVmYXVsdC5iaW5kKHRoaXMpLCAnZGVmYXVsdCcsIGtleSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZGVmYXVsdHMoa2V5LCB2YWx1ZSwgZGVmYXVsdERlc2NyaXB0aW9uKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRlZmF1bHQoa2V5LCB2YWx1ZSwgZGVmYXVsdERlc2NyaXB0aW9uKTtcbiAgICB9XG4gICAgZGVtYW5kQ29tbWFuZChtaW4gPSAxLCBtYXgsIG1pbk1zZywgbWF4TXNnKSB7XG4gICAgICAgIGFyZ3NlcnQoJ1tudW1iZXJdIFtudW1iZXJ8c3RyaW5nXSBbc3RyaW5nfG51bGx8dW5kZWZpbmVkXSBbc3RyaW5nfG51bGx8dW5kZWZpbmVkXScsIFttaW4sIG1heCwgbWluTXNnLCBtYXhNc2ddLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgaWYgKHR5cGVvZiBtYXggIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBtaW5Nc2cgPSBtYXg7XG4gICAgICAgICAgICBtYXggPSBJbmZpbml0eTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmdsb2JhbCgnXycsIGZhbHNlKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBcImZcIikuZGVtYW5kZWRDb21tYW5kcy5fID0ge1xuICAgICAgICAgICAgbWluLFxuICAgICAgICAgICAgbWF4LFxuICAgICAgICAgICAgbWluTXNnLFxuICAgICAgICAgICAgbWF4TXNnLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZGVtYW5kKGtleXMsIG1heCwgbXNnKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG1heCkpIHtcbiAgICAgICAgICAgIG1heC5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICAgICAgYXNzZXJ0Tm90U3RyaWN0RXF1YWwobXNnLCB0cnVlLCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3NoaW0sIFwiZlwiKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5kZW1hbmRPcHRpb24oa2V5LCBtc2cpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBtYXggPSBJbmZpbml0eTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgbWF4ICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgbXNnID0gbWF4O1xuICAgICAgICAgICAgbWF4ID0gSW5maW5pdHk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBrZXlzID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgYXNzZXJ0Tm90U3RyaWN0RXF1YWwobXNnLCB0cnVlLCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3NoaW0sIFwiZlwiKSk7XG4gICAgICAgICAgICB0aGlzLmRlbWFuZENvbW1hbmQoa2V5cywgbWF4LCBtc2csIG1zZyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShrZXlzKSkge1xuICAgICAgICAgICAga2V5cy5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICAgICAgYXNzZXJ0Tm90U3RyaWN0RXF1YWwobXNnLCB0cnVlLCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3NoaW0sIFwiZlwiKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5kZW1hbmRPcHRpb24oa2V5LCBtc2cpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG1zZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlbWFuZE9wdGlvbihrZXlzLCBtc2cpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobXNnID09PSB0cnVlIHx8IHR5cGVvZiBtc2cgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZW1hbmRPcHRpb24oa2V5cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGRlbWFuZE9wdGlvbihrZXlzLCBtc2cpIHtcbiAgICAgICAgYXJnc2VydCgnPG9iamVjdHxzdHJpbmd8YXJyYXk+IFtzdHJpbmddJywgW2tleXMsIG1zZ10sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICB0aGlzW2tQb3B1bGF0ZVBhcnNlckhpbnRTaW5nbGVWYWx1ZURpY3Rpb25hcnldKHRoaXMuZGVtYW5kT3B0aW9uLmJpbmQodGhpcyksICdkZW1hbmRlZE9wdGlvbnMnLCBrZXlzLCBtc2cpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZGVwcmVjYXRlT3B0aW9uKG9wdGlvbiwgbWVzc2FnZSkge1xuICAgICAgICBhcmdzZXJ0KCc8c3RyaW5nPiBbc3RyaW5nfGJvb2xlYW5dJywgW29wdGlvbiwgbWVzc2FnZV0sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKS5kZXByZWNhdGVkT3B0aW9uc1tvcHRpb25dID0gbWVzc2FnZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGRlc2NyaWJlKGtleXMsIGRlc2NyaXB0aW9uKSB7XG4gICAgICAgIGFyZ3NlcnQoJzxvYmplY3R8c3RyaW5nfGFycmF5PiBbc3RyaW5nXScsIFtrZXlzLCBkZXNjcmlwdGlvbl0sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICB0aGlzW2tTZXRLZXldKGtleXMsIHRydWUpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBcImZcIikuZGVzY3JpYmUoa2V5cywgZGVzY3JpcHRpb24pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZGV0ZWN0TG9jYWxlKGRldGVjdCkge1xuICAgICAgICBhcmdzZXJ0KCc8Ym9vbGVhbj4nLCBbZGV0ZWN0XSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfZGV0ZWN0TG9jYWxlLCBkZXRlY3QsIFwiZlwiKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGVudihwcmVmaXgpIHtcbiAgICAgICAgYXJnc2VydCgnW3N0cmluZ3xib29sZWFuXScsIFtwcmVmaXhdLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgaWYgKHByZWZpeCA9PT0gZmFsc2UpXG4gICAgICAgICAgICBkZWxldGUgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBcImZcIikuZW52UHJlZml4O1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKS5lbnZQcmVmaXggPSBwcmVmaXggfHwgJyc7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBlcGlsb2d1ZShtc2cpIHtcbiAgICAgICAgYXJnc2VydCgnPHN0cmluZz4nLCBbbXNnXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdXNhZ2UsIFwiZlwiKS5lcGlsb2cobXNnKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGVwaWxvZyhtc2cpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXBpbG9ndWUobXNnKTtcbiAgICB9XG4gICAgZXhhbXBsZShjbWQsIGRlc2NyaXB0aW9uKSB7XG4gICAgICAgIGFyZ3NlcnQoJzxzdHJpbmd8YXJyYXk+IFtzdHJpbmddJywgW2NtZCwgZGVzY3JpcHRpb25dLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY21kKSkge1xuICAgICAgICAgICAgY21kLmZvckVhY2goZXhhbXBsZVBhcmFtcyA9PiB0aGlzLmV4YW1wbGUoLi4uZXhhbXBsZVBhcmFtcykpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV91c2FnZSwgXCJmXCIpLmV4YW1wbGUoY21kLCBkZXNjcmlwdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGV4aXQoY29kZSwgZXJyKSB7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfaGFzT3V0cHV0LCB0cnVlLCBcImZcIik7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfZXhpdEVycm9yLCBlcnIsIFwiZlwiKTtcbiAgICAgICAgaWYgKF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfZXhpdFByb2Nlc3MsIFwiZlwiKSlcbiAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc2hpbSwgXCJmXCIpLnByb2Nlc3MuZXhpdChjb2RlKTtcbiAgICB9XG4gICAgZXhpdFByb2Nlc3MoZW5hYmxlZCA9IHRydWUpIHtcbiAgICAgICAgYXJnc2VydCgnW2Jvb2xlYW5dJywgW2VuYWJsZWRdLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9leGl0UHJvY2VzcywgZW5hYmxlZCwgXCJmXCIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZmFpbChmKSB7XG4gICAgICAgIGFyZ3NlcnQoJzxmdW5jdGlvbnxib29sZWFuPicsIFtmXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIGlmICh0eXBlb2YgZiA9PT0gJ2Jvb2xlYW4nICYmIGYgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgWUVycm9yKFwiSW52YWxpZCBmaXJzdCBhcmd1bWVudC4gRXhwZWN0ZWQgZnVuY3Rpb24gb3IgYm9vbGVhbiAnZmFsc2UnXCIpO1xuICAgICAgICB9XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdXNhZ2UsIFwiZlwiKS5mYWlsRm4oZik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBnZXRBbGlhc2VzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZWQgPyB0aGlzLnBhcnNlZC5hbGlhc2VzIDoge307XG4gICAgfVxuICAgIGFzeW5jIGdldENvbXBsZXRpb24oYXJncywgZG9uZSkge1xuICAgICAgICBhcmdzZXJ0KCc8YXJyYXk+IFtmdW5jdGlvbl0nLCBbYXJncywgZG9uZV0sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICBpZiAoIWRvbmUpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9jb21wbGV0aW9uLCBcImZcIikuZ2V0Q29tcGxldGlvbihhcmdzLCAoZXJyLCBjb21wbGV0aW9ucykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoY29tcGxldGlvbnMpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9jb21wbGV0aW9uLCBcImZcIikuZ2V0Q29tcGxldGlvbihhcmdzLCBkb25lKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXREZW1hbmRlZE9wdGlvbnMoKSB7XG4gICAgICAgIGFyZ3NlcnQoW10sIDApO1xuICAgICAgICByZXR1cm4gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBcImZcIikuZGVtYW5kZWRPcHRpb25zO1xuICAgIH1cbiAgICBnZXREZW1hbmRlZENvbW1hbmRzKCkge1xuICAgICAgICBhcmdzZXJ0KFtdLCAwKTtcbiAgICAgICAgcmV0dXJuIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucywgXCJmXCIpLmRlbWFuZGVkQ29tbWFuZHM7XG4gICAgfVxuICAgIGdldERlcHJlY2F0ZWRPcHRpb25zKCkge1xuICAgICAgICBhcmdzZXJ0KFtdLCAwKTtcbiAgICAgICAgcmV0dXJuIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucywgXCJmXCIpLmRlcHJlY2F0ZWRPcHRpb25zO1xuICAgIH1cbiAgICBnZXREZXRlY3RMb2NhbGUoKSB7XG4gICAgICAgIHJldHVybiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2RldGVjdExvY2FsZSwgXCJmXCIpO1xuICAgIH1cbiAgICBnZXRFeGl0UHJvY2VzcygpIHtcbiAgICAgICAgcmV0dXJuIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfZXhpdFByb2Nlc3MsIFwiZlwiKTtcbiAgICB9XG4gICAgZ2V0R3JvdXBzKCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9ncm91cHMsIFwiZlwiKSwgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9wcmVzZXJ2ZWRHcm91cHMsIFwiZlwiKSk7XG4gICAgfVxuICAgIGdldEhlbHAoKSB7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfaGFzT3V0cHV0LCB0cnVlLCBcImZcIik7XG4gICAgICAgIGlmICghX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV91c2FnZSwgXCJmXCIpLmhhc0NhY2hlZEhlbHBNZXNzYWdlKCkpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5wYXJzZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZSA9IHRoaXNba1J1bllhcmdzUGFyc2VyQW5kRXhlY3V0ZUNvbW1hbmRzXShfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3Byb2Nlc3NBcmdzLCBcImZcIiksIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCAwLCB0cnVlKTtcbiAgICAgICAgICAgICAgICBpZiAoaXNQcm9taXNlKHBhcnNlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2UudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV91c2FnZSwgXCJmXCIpLmhlbHAoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYnVpbGRlclJlc3BvbnNlID0gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9jb21tYW5kLCBcImZcIikucnVuRGVmYXVsdEJ1aWxkZXJPbih0aGlzKTtcbiAgICAgICAgICAgIGlmIChpc1Byb21pc2UoYnVpbGRlclJlc3BvbnNlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBidWlsZGVyUmVzcG9uc2UudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBcImZcIikuaGVscCgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV91c2FnZSwgXCJmXCIpLmhlbHAoKSk7XG4gICAgfVxuICAgIGdldE9wdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKTtcbiAgICB9XG4gICAgZ2V0U3RyaWN0KCkge1xuICAgICAgICByZXR1cm4gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9zdHJpY3QsIFwiZlwiKTtcbiAgICB9XG4gICAgZ2V0U3RyaWN0Q29tbWFuZHMoKSB7XG4gICAgICAgIHJldHVybiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3N0cmljdENvbW1hbmRzLCBcImZcIik7XG4gICAgfVxuICAgIGdldFN0cmljdE9wdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3N0cmljdE9wdGlvbnMsIFwiZlwiKTtcbiAgICB9XG4gICAgZ2xvYmFsKGdsb2JhbHMsIGdsb2JhbCkge1xuICAgICAgICBhcmdzZXJ0KCc8c3RyaW5nfGFycmF5PiBbYm9vbGVhbl0nLCBbZ2xvYmFscywgZ2xvYmFsXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIGdsb2JhbHMgPSBbXS5jb25jYXQoZ2xvYmFscyk7XG4gICAgICAgIGlmIChnbG9iYWwgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKS5sb2NhbCA9IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucywgXCJmXCIpLmxvY2FsLmZpbHRlcihsID0+IGdsb2JhbHMuaW5kZXhPZihsKSA9PT0gLTEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZ2xvYmFscy5mb3JFYWNoKGcgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBcImZcIikubG9jYWwuaW5jbHVkZXMoZykpXG4gICAgICAgICAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucywgXCJmXCIpLmxvY2FsLnB1c2goZyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZ3JvdXAob3B0cywgZ3JvdXBOYW1lKSB7XG4gICAgICAgIGFyZ3NlcnQoJzxzdHJpbmd8YXJyYXk+IDxzdHJpbmc+JywgW29wdHMsIGdyb3VwTmFtZV0sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICBjb25zdCBleGlzdGluZyA9IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfcHJlc2VydmVkR3JvdXBzLCBcImZcIilbZ3JvdXBOYW1lXSB8fCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2dyb3VwcywgXCJmXCIpW2dyb3VwTmFtZV07XG4gICAgICAgIGlmIChfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3ByZXNlcnZlZEdyb3VwcywgXCJmXCIpW2dyb3VwTmFtZV0pIHtcbiAgICAgICAgICAgIGRlbGV0ZSBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3ByZXNlcnZlZEdyb3VwcywgXCJmXCIpW2dyb3VwTmFtZV07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2VlbiA9IHt9O1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2dyb3VwcywgXCJmXCIpW2dyb3VwTmFtZV0gPSAoZXhpc3RpbmcgfHwgW10pLmNvbmNhdChvcHRzKS5maWx0ZXIoa2V5ID0+IHtcbiAgICAgICAgICAgIGlmIChzZWVuW2tleV0pXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIChzZWVuW2tleV0gPSB0cnVlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBoaWRlKGtleSkge1xuICAgICAgICBhcmdzZXJ0KCc8c3RyaW5nPicsIFtrZXldLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBcImZcIikuaGlkZGVuT3B0aW9ucy5wdXNoKGtleSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBpbXBsaWVzKGtleSwgdmFsdWUpIHtcbiAgICAgICAgYXJnc2VydCgnPHN0cmluZ3xvYmplY3Q+IFtudW1iZXJ8c3RyaW5nfGFycmF5XScsIFtrZXksIHZhbHVlXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdmFsaWRhdGlvbiwgXCJmXCIpLmltcGxpZXMoa2V5LCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBsb2NhbGUobG9jYWxlKSB7XG4gICAgICAgIGFyZ3NlcnQoJ1tzdHJpbmddJywgW2xvY2FsZV0sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICBpZiAobG9jYWxlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXNba0d1ZXNzTG9jYWxlXSgpO1xuICAgICAgICAgICAgcmV0dXJuIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc2hpbSwgXCJmXCIpLnkxOG4uZ2V0TG9jYWxlKCk7XG4gICAgICAgIH1cbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9kZXRlY3RMb2NhbGUsIGZhbHNlLCBcImZcIik7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc2hpbSwgXCJmXCIpLnkxOG4uc2V0TG9jYWxlKGxvY2FsZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBtaWRkbGV3YXJlKGNhbGxiYWNrLCBhcHBseUJlZm9yZVZhbGlkYXRpb24sIGdsb2JhbCkge1xuICAgICAgICByZXR1cm4gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9nbG9iYWxNaWRkbGV3YXJlLCBcImZcIikuYWRkTWlkZGxld2FyZShjYWxsYmFjaywgISFhcHBseUJlZm9yZVZhbGlkYXRpb24sIGdsb2JhbCk7XG4gICAgfVxuICAgIG5hcmdzKGtleSwgdmFsdWUpIHtcbiAgICAgICAgYXJnc2VydCgnPHN0cmluZ3xvYmplY3R8YXJyYXk+IFtudW1iZXJdJywgW2tleSwgdmFsdWVdLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgdGhpc1trUG9wdWxhdGVQYXJzZXJIaW50U2luZ2xlVmFsdWVEaWN0aW9uYXJ5XSh0aGlzLm5hcmdzLmJpbmQodGhpcyksICduYXJnJywga2V5LCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBub3JtYWxpemUoa2V5cykge1xuICAgICAgICBhcmdzZXJ0KCc8YXJyYXl8c3RyaW5nPicsIFtrZXlzXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIHRoaXNba1BvcHVsYXRlUGFyc2VySGludEFycmF5XSgnbm9ybWFsaXplJywga2V5cyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBudW1iZXIoa2V5cykge1xuICAgICAgICBhcmdzZXJ0KCc8YXJyYXl8c3RyaW5nPicsIFtrZXlzXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIHRoaXNba1BvcHVsYXRlUGFyc2VySGludEFycmF5XSgnbnVtYmVyJywga2V5cyk7XG4gICAgICAgIHRoaXNba1RyYWNrTWFudWFsbHlTZXRLZXlzXShrZXlzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIG9wdGlvbihrZXksIG9wdCkge1xuICAgICAgICBhcmdzZXJ0KCc8c3RyaW5nfG9iamVjdD4gW29iamVjdF0nLCBba2V5LCBvcHRdLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgaWYgKHR5cGVvZiBrZXkgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhrZXkpLmZvckVhY2goayA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zKGssIGtleVtrXSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0ICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgIG9wdCA9IHt9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpc1trVHJhY2tNYW51YWxseVNldEtleXNdKGtleSk7XG4gICAgICAgICAgICBpZiAoX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV92ZXJzaW9uT3B0LCBcImZcIikgJiYgKGtleSA9PT0gJ3ZlcnNpb24nIHx8IChvcHQgPT09IG51bGwgfHwgb3B0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHQuYWxpYXMpID09PSAndmVyc2lvbicpKSB7XG4gICAgICAgICAgICAgICAgdGhpc1trRW1pdFdhcm5pbmddKFtcbiAgICAgICAgICAgICAgICAgICAgJ1widmVyc2lvblwiIGlzIGEgcmVzZXJ2ZWQgd29yZC4nLFxuICAgICAgICAgICAgICAgICAgICAnUGxlYXNlIGRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOicsXG4gICAgICAgICAgICAgICAgICAgICctIERpc2FibGUgdmVyc2lvbiB3aXRoIGB5YXJncy52ZXJzaW9uKGZhbHNlKWAgaWYgdXNpbmcgXCJ2ZXJzaW9uXCIgYXMgYW4gb3B0aW9uJyxcbiAgICAgICAgICAgICAgICAgICAgJy0gVXNlIHRoZSBidWlsdC1pbiBgeWFyZ3MudmVyc2lvbmAgbWV0aG9kIGluc3RlYWQgKGlmIGFwcGxpY2FibGUpJyxcbiAgICAgICAgICAgICAgICAgICAgJy0gVXNlIGEgZGlmZmVyZW50IG9wdGlvbiBrZXknLFxuICAgICAgICAgICAgICAgICAgICAnaHR0cHM6Ly95YXJncy5qcy5vcmcvZG9jcy8jYXBpLXJlZmVyZW5jZS12ZXJzaW9uJyxcbiAgICAgICAgICAgICAgICBdLmpvaW4oJ1xcbicpLCB1bmRlZmluZWQsICd2ZXJzaW9uV2FybmluZycpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBcImZcIikua2V5W2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgaWYgKG9wdC5hbGlhcylcbiAgICAgICAgICAgICAgICB0aGlzLmFsaWFzKGtleSwgb3B0LmFsaWFzKTtcbiAgICAgICAgICAgIGNvbnN0IGRlcHJlY2F0ZSA9IG9wdC5kZXByZWNhdGUgfHwgb3B0LmRlcHJlY2F0ZWQ7XG4gICAgICAgICAgICBpZiAoZGVwcmVjYXRlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXByZWNhdGVPcHRpb24oa2V5LCBkZXByZWNhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZGVtYW5kID0gb3B0LmRlbWFuZCB8fCBvcHQucmVxdWlyZWQgfHwgb3B0LnJlcXVpcmU7XG4gICAgICAgICAgICBpZiAoZGVtYW5kKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZW1hbmQoa2V5LCBkZW1hbmQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdC5kZW1hbmRPcHRpb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlbWFuZE9wdGlvbihrZXksIHR5cGVvZiBvcHQuZGVtYW5kT3B0aW9uID09PSAnc3RyaW5nJyA/IG9wdC5kZW1hbmRPcHRpb24gOiB1bmRlZmluZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdC5jb25mbGljdHMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZsaWN0cyhrZXksIG9wdC5jb25mbGljdHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCdkZWZhdWx0JyBpbiBvcHQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHQoa2V5LCBvcHQuZGVmYXVsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0LmltcGxpZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW1wbGllcyhrZXksIG9wdC5pbXBsaWVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvcHQubmFyZ3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMubmFyZ3Moa2V5LCBvcHQubmFyZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdC5jb25maWcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZyhrZXksIG9wdC5jb25maWdQYXJzZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdC5ub3JtYWxpemUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5vcm1hbGl6ZShrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdC5jaG9pY2VzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaG9pY2VzKGtleSwgb3B0LmNob2ljZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdC5jb2VyY2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvZXJjZShrZXksIG9wdC5jb2VyY2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdC5ncm91cCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZ3JvdXAoa2V5LCBvcHQuZ3JvdXApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdC5ib29sZWFuIHx8IG9wdC50eXBlID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJvb2xlYW4oa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAob3B0LmFsaWFzKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmJvb2xlYW4ob3B0LmFsaWFzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvcHQuYXJyYXkgfHwgb3B0LnR5cGUgPT09ICdhcnJheScpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFycmF5KGtleSk7XG4gICAgICAgICAgICAgICAgaWYgKG9wdC5hbGlhcylcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hcnJheShvcHQuYWxpYXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdC5udW1iZXIgfHwgb3B0LnR5cGUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5udW1iZXIoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAob3B0LmFsaWFzKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLm51bWJlcihvcHQuYWxpYXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdC5zdHJpbmcgfHwgb3B0LnR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdHJpbmcoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAob3B0LmFsaWFzKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0cmluZyhvcHQuYWxpYXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdC5jb3VudCB8fCBvcHQudHlwZSA9PT0gJ2NvdW50Jykge1xuICAgICAgICAgICAgICAgIHRoaXMuY291bnQoa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0Lmdsb2JhbCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5nbG9iYWwoa2V5LCBvcHQuZ2xvYmFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvcHQuZGVmYXVsdERlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBcImZcIikuZGVmYXVsdERlc2NyaXB0aW9uW2tleV0gPSBvcHQuZGVmYXVsdERlc2NyaXB0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdC5za2lwVmFsaWRhdGlvbikge1xuICAgICAgICAgICAgICAgIHRoaXMuc2tpcFZhbGlkYXRpb24oa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGRlc2MgPSBvcHQuZGVzY3JpYmUgfHwgb3B0LmRlc2NyaXB0aW9uIHx8IG9wdC5kZXNjO1xuICAgICAgICAgICAgY29uc3QgZGVzY3JpcHRpb25zID0gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV91c2FnZSwgXCJmXCIpLmdldERlc2NyaXB0aW9ucygpO1xuICAgICAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGVzY3JpcHRpb25zLCBrZXkpIHx8XG4gICAgICAgICAgICAgICAgdHlwZW9mIGRlc2MgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXNjcmliZShrZXksIGRlc2MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdC5oaWRkZW4pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhpZGUoa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvcHQucmVxdWlyZXNBcmcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlcXVpcmVzQXJnKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIG9wdGlvbnMoa2V5LCBvcHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9uKGtleSwgb3B0KTtcbiAgICB9XG4gICAgcGFyc2UoYXJncywgc2hvcnRDaXJjdWl0LCBfcGFyc2VGbikge1xuICAgICAgICBhcmdzZXJ0KCdbc3RyaW5nfGFycmF5XSBbZnVuY3Rpb258Ym9vbGVhbnxvYmplY3RdIFtmdW5jdGlvbl0nLCBbYXJncywgc2hvcnRDaXJjdWl0LCBfcGFyc2VGbl0sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICB0aGlzW2tGcmVlemVdKCk7XG4gICAgICAgIGlmICh0eXBlb2YgYXJncyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGFyZ3MgPSBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3Byb2Nlc3NBcmdzLCBcImZcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBzaG9ydENpcmN1aXQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3BhcnNlQ29udGV4dCwgc2hvcnRDaXJjdWl0LCBcImZcIik7XG4gICAgICAgICAgICBzaG9ydENpcmN1aXQgPSBfcGFyc2VGbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHNob3J0Q2lyY3VpdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9wYXJzZUZuLCBzaG9ydENpcmN1aXQsIFwiZlwiKTtcbiAgICAgICAgICAgIHNob3J0Q2lyY3VpdCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghc2hvcnRDaXJjdWl0KVxuICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9wcm9jZXNzQXJncywgYXJncywgXCJmXCIpO1xuICAgICAgICBpZiAoX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9wYXJzZUZuLCBcImZcIikpXG4gICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2V4aXRQcm9jZXNzLCBmYWxzZSwgXCJmXCIpO1xuICAgICAgICBjb25zdCBwYXJzZWQgPSB0aGlzW2tSdW5ZYXJnc1BhcnNlckFuZEV4ZWN1dGVDb21tYW5kc10oYXJncywgISFzaG9ydENpcmN1aXQpO1xuICAgICAgICBjb25zdCB0bXBQYXJzZWQgPSB0aGlzLnBhcnNlZDtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9jb21wbGV0aW9uLCBcImZcIikuc2V0UGFyc2VkKHRoaXMucGFyc2VkKTtcbiAgICAgICAgaWYgKGlzUHJvbWlzZShwYXJzZWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VkXG4gICAgICAgICAgICAgICAgLnRoZW4oYXJndiA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfcGFyc2VGbiwgXCJmXCIpKVxuICAgICAgICAgICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3BhcnNlRm4sIFwiZlwiKS5jYWxsKHRoaXMsIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfZXhpdEVycm9yLCBcImZcIiksIGFyZ3YsIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3V0cHV0LCBcImZcIikpO1xuICAgICAgICAgICAgICAgIHJldHVybiBhcmd2O1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9wYXJzZUZuLCBcImZcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9wYXJzZUZuLCBcImZcIikoZXJyLCB0aGlzLnBhcnNlZC5hcmd2LCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX291dHB1dCwgXCJmXCIpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuZmluYWxseSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpc1trVW5mcmVlemVdKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5wYXJzZWQgPSB0bXBQYXJzZWQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3BhcnNlRm4sIFwiZlwiKSlcbiAgICAgICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3BhcnNlRm4sIFwiZlwiKS5jYWxsKHRoaXMsIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfZXhpdEVycm9yLCBcImZcIiksIHBhcnNlZCwgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vdXRwdXQsIFwiZlwiKSk7XG4gICAgICAgICAgICB0aGlzW2tVbmZyZWV6ZV0oKTtcbiAgICAgICAgICAgIHRoaXMucGFyc2VkID0gdG1wUGFyc2VkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXJzZWQ7XG4gICAgfVxuICAgIHBhcnNlQXN5bmMoYXJncywgc2hvcnRDaXJjdWl0LCBfcGFyc2VGbikge1xuICAgICAgICBjb25zdCBtYXliZVByb21pc2UgPSB0aGlzLnBhcnNlKGFyZ3MsIHNob3J0Q2lyY3VpdCwgX3BhcnNlRm4pO1xuICAgICAgICByZXR1cm4gIWlzUHJvbWlzZShtYXliZVByb21pc2UpXG4gICAgICAgICAgICA/IFByb21pc2UucmVzb2x2ZShtYXliZVByb21pc2UpXG4gICAgICAgICAgICA6IG1heWJlUHJvbWlzZTtcbiAgICB9XG4gICAgcGFyc2VTeW5jKGFyZ3MsIHNob3J0Q2lyY3VpdCwgX3BhcnNlRm4pIHtcbiAgICAgICAgY29uc3QgbWF5YmVQcm9taXNlID0gdGhpcy5wYXJzZShhcmdzLCBzaG9ydENpcmN1aXQsIF9wYXJzZUZuKTtcbiAgICAgICAgaWYgKGlzUHJvbWlzZShtYXliZVByb21pc2UpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgWUVycm9yKCcucGFyc2VTeW5jKCkgbXVzdCBub3QgYmUgdXNlZCB3aXRoIGFzeW5jaHJvbm91cyBidWlsZGVycywgaGFuZGxlcnMsIG9yIG1pZGRsZXdhcmUnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWF5YmVQcm9taXNlO1xuICAgIH1cbiAgICBwYXJzZXJDb25maWd1cmF0aW9uKGNvbmZpZykge1xuICAgICAgICBhcmdzZXJ0KCc8b2JqZWN0PicsIFtjb25maWddLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9wYXJzZXJDb25maWcsIGNvbmZpZywgXCJmXCIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcGtnQ29uZihrZXksIHJvb3RQYXRoKSB7XG4gICAgICAgIGFyZ3NlcnQoJzxzdHJpbmc+IFtzdHJpbmddJywgW2tleSwgcm9vdFBhdGhdLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgbGV0IGNvbmYgPSBudWxsO1xuICAgICAgICBjb25zdCBvYmogPSB0aGlzW2tQa2dVcF0ocm9vdFBhdGggfHwgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9jd2QsIFwiZlwiKSk7XG4gICAgICAgIGlmIChvYmpba2V5XSAmJiB0eXBlb2Ygb2JqW2tleV0gPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBjb25mID0gYXBwbHlFeHRlbmRzKG9ialtrZXldLCByb290UGF0aCB8fCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2N3ZCwgXCJmXCIpLCB0aGlzW2tHZXRQYXJzZXJDb25maWd1cmF0aW9uXSgpWydkZWVwLW1lcmdlLWNvbmZpZyddIHx8IGZhbHNlLCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3NoaW0sIFwiZlwiKSk7XG4gICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKS5jb25maWdPYmplY3RzID0gKF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucywgXCJmXCIpLmNvbmZpZ09iamVjdHMgfHwgW10pLmNvbmNhdChjb25mKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcG9zaXRpb25hbChrZXksIG9wdHMpIHtcbiAgICAgICAgYXJnc2VydCgnPHN0cmluZz4gPG9iamVjdD4nLCBba2V5LCBvcHRzXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIGNvbnN0IHN1cHBvcnRlZE9wdHMgPSBbXG4gICAgICAgICAgICAnZGVmYXVsdCcsXG4gICAgICAgICAgICAnZGVmYXVsdERlc2NyaXB0aW9uJyxcbiAgICAgICAgICAgICdpbXBsaWVzJyxcbiAgICAgICAgICAgICdub3JtYWxpemUnLFxuICAgICAgICAgICAgJ2Nob2ljZXMnLFxuICAgICAgICAgICAgJ2NvbmZsaWN0cycsXG4gICAgICAgICAgICAnY29lcmNlJyxcbiAgICAgICAgICAgICd0eXBlJyxcbiAgICAgICAgICAgICdkZXNjcmliZScsXG4gICAgICAgICAgICAnZGVzYycsXG4gICAgICAgICAgICAnZGVzY3JpcHRpb24nLFxuICAgICAgICAgICAgJ2FsaWFzJyxcbiAgICAgICAgXTtcbiAgICAgICAgb3B0cyA9IG9iakZpbHRlcihvcHRzLCAoaywgdikgPT4ge1xuICAgICAgICAgICAgaWYgKGsgPT09ICd0eXBlJyAmJiAhWydzdHJpbmcnLCAnbnVtYmVyJywgJ2Jvb2xlYW4nXS5pbmNsdWRlcyh2KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gc3VwcG9ydGVkT3B0cy5pbmNsdWRlcyhrKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGZ1bGxDb21tYW5kID0gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9jb250ZXh0LCBcImZcIikuZnVsbENvbW1hbmRzW19fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfY29udGV4dCwgXCJmXCIpLmZ1bGxDb21tYW5kcy5sZW5ndGggLSAxXTtcbiAgICAgICAgY29uc3QgcGFyc2VPcHRpb25zID0gZnVsbENvbW1hbmRcbiAgICAgICAgICAgID8gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9jb21tYW5kLCBcImZcIikuY21kVG9QYXJzZU9wdGlvbnMoZnVsbENvbW1hbmQpXG4gICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICBhcnJheTogW10sXG4gICAgICAgICAgICAgICAgYWxpYXM6IHt9LFxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHt9LFxuICAgICAgICAgICAgICAgIGRlbWFuZDoge30sXG4gICAgICAgICAgICB9O1xuICAgICAgICBvYmplY3RLZXlzKHBhcnNlT3B0aW9ucykuZm9yRWFjaChwayA9PiB7XG4gICAgICAgICAgICBjb25zdCBwYXJzZU9wdGlvbiA9IHBhcnNlT3B0aW9uc1twa107XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwYXJzZU9wdGlvbikpIHtcbiAgICAgICAgICAgICAgICBpZiAocGFyc2VPcHRpb24uaW5kZXhPZihrZXkpICE9PSAtMSlcbiAgICAgICAgICAgICAgICAgICAgb3B0c1twa10gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnNlT3B0aW9uW2tleV0gJiYgIShwayBpbiBvcHRzKSlcbiAgICAgICAgICAgICAgICAgICAgb3B0c1twa10gPSBwYXJzZU9wdGlvbltrZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5ncm91cChrZXksIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdXNhZ2UsIFwiZlwiKS5nZXRQb3NpdGlvbmFsR3JvdXBOYW1lKCkpO1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb24oa2V5LCBvcHRzKTtcbiAgICB9XG4gICAgcmVjb21tZW5kQ29tbWFuZHMocmVjb21tZW5kID0gdHJ1ZSkge1xuICAgICAgICBhcmdzZXJ0KCdbYm9vbGVhbl0nLCBbcmVjb21tZW5kXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfcmVjb21tZW5kQ29tbWFuZHMsIHJlY29tbWVuZCwgXCJmXCIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcmVxdWlyZWQoa2V5cywgbWF4LCBtc2cpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVtYW5kKGtleXMsIG1heCwgbXNnKTtcbiAgICB9XG4gICAgcmVxdWlyZShrZXlzLCBtYXgsIG1zZykge1xuICAgICAgICByZXR1cm4gdGhpcy5kZW1hbmQoa2V5cywgbWF4LCBtc2cpO1xuICAgIH1cbiAgICByZXF1aXJlc0FyZyhrZXlzKSB7XG4gICAgICAgIGFyZ3NlcnQoJzxhcnJheXxzdHJpbmd8b2JqZWN0PiBbbnVtYmVyXScsIFtrZXlzXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIGlmICh0eXBlb2Yga2V5cyA9PT0gJ3N0cmluZycgJiYgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBcImZcIikubmFyZ1trZXlzXSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzW2tQb3B1bGF0ZVBhcnNlckhpbnRTaW5nbGVWYWx1ZURpY3Rpb25hcnldKHRoaXMucmVxdWlyZXNBcmcuYmluZCh0aGlzKSwgJ25hcmcnLCBrZXlzLCBOYU4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBzaG93Q29tcGxldGlvblNjcmlwdCgkMCwgY21kKSB7XG4gICAgICAgIGFyZ3NlcnQoJ1tzdHJpbmddIFtzdHJpbmddJywgWyQwLCBjbWRdLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgJDAgPSAkMCB8fCB0aGlzLiQwO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2xvZ2dlciwgXCJmXCIpLmxvZyhfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2NvbXBsZXRpb24sIFwiZlwiKS5nZW5lcmF0ZUNvbXBsZXRpb25TY3JpcHQoJDAsIGNtZCB8fCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2NvbXBsZXRpb25Db21tYW5kLCBcImZcIikgfHwgJ2NvbXBsZXRpb24nKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBzaG93SGVscChsZXZlbCkge1xuICAgICAgICBhcmdzZXJ0KCdbc3RyaW5nfGZ1bmN0aW9uXScsIFtsZXZlbF0sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2hhc091dHB1dCwgdHJ1ZSwgXCJmXCIpO1xuICAgICAgICBpZiAoIV9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdXNhZ2UsIFwiZlwiKS5oYXNDYWNoZWRIZWxwTWVzc2FnZSgpKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMucGFyc2VkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2UgPSB0aGlzW2tSdW5ZYXJnc1BhcnNlckFuZEV4ZWN1dGVDb21tYW5kc10oX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9wcm9jZXNzQXJncywgXCJmXCIpLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgMCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKGlzUHJvbWlzZShwYXJzZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyc2UudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBcImZcIikuc2hvd0hlbHAobGV2ZWwpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYnVpbGRlclJlc3BvbnNlID0gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9jb21tYW5kLCBcImZcIikucnVuRGVmYXVsdEJ1aWxkZXJPbih0aGlzKTtcbiAgICAgICAgICAgIGlmIChpc1Byb21pc2UoYnVpbGRlclJlc3BvbnNlKSkge1xuICAgICAgICAgICAgICAgIGJ1aWxkZXJSZXNwb25zZS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV91c2FnZSwgXCJmXCIpLnNob3dIZWxwKGxldmVsKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBcImZcIikuc2hvd0hlbHAobGV2ZWwpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgc2NyaXB0TmFtZShzY3JpcHROYW1lKSB7XG4gICAgICAgIHRoaXMuY3VzdG9tU2NyaXB0TmFtZSA9IHRydWU7XG4gICAgICAgIHRoaXMuJDAgPSBzY3JpcHROYW1lO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgc2hvd0hlbHBPbkZhaWwoZW5hYmxlZCwgbWVzc2FnZSkge1xuICAgICAgICBhcmdzZXJ0KCdbYm9vbGVhbnxzdHJpbmddIFtzdHJpbmddJywgW2VuYWJsZWQsIG1lc3NhZ2VdLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV91c2FnZSwgXCJmXCIpLnNob3dIZWxwT25GYWlsKGVuYWJsZWQsIG1lc3NhZ2UpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgc2hvd1ZlcnNpb24obGV2ZWwpIHtcbiAgICAgICAgYXJnc2VydCgnW3N0cmluZ3xmdW5jdGlvbl0nLCBbbGV2ZWxdLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV91c2FnZSwgXCJmXCIpLnNob3dWZXJzaW9uKGxldmVsKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHNraXBWYWxpZGF0aW9uKGtleXMpIHtcbiAgICAgICAgYXJnc2VydCgnPGFycmF5fHN0cmluZz4nLCBba2V5c10sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICB0aGlzW2tQb3B1bGF0ZVBhcnNlckhpbnRBcnJheV0oJ3NraXBWYWxpZGF0aW9uJywga2V5cyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBzdHJpY3QoZW5hYmxlZCkge1xuICAgICAgICBhcmdzZXJ0KCdbYm9vbGVhbl0nLCBbZW5hYmxlZF0sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3N0cmljdCwgZW5hYmxlZCAhPT0gZmFsc2UsIFwiZlwiKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHN0cmljdENvbW1hbmRzKGVuYWJsZWQpIHtcbiAgICAgICAgYXJnc2VydCgnW2Jvb2xlYW5dJywgW2VuYWJsZWRdLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9zdHJpY3RDb21tYW5kcywgZW5hYmxlZCAhPT0gZmFsc2UsIFwiZlwiKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHN0cmljdE9wdGlvbnMoZW5hYmxlZCkge1xuICAgICAgICBhcmdzZXJ0KCdbYm9vbGVhbl0nLCBbZW5hYmxlZF0sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3N0cmljdE9wdGlvbnMsIGVuYWJsZWQgIT09IGZhbHNlLCBcImZcIik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBzdHJpbmcoa2V5cykge1xuICAgICAgICBhcmdzZXJ0KCc8YXJyYXl8c3RyaW5nPicsIFtrZXlzXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIHRoaXNba1BvcHVsYXRlUGFyc2VySGludEFycmF5XSgnc3RyaW5nJywga2V5cyk7XG4gICAgICAgIHRoaXNba1RyYWNrTWFudWFsbHlTZXRLZXlzXShrZXlzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHRlcm1pbmFsV2lkdGgoKSB7XG4gICAgICAgIGFyZ3NlcnQoW10sIDApO1xuICAgICAgICByZXR1cm4gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9zaGltLCBcImZcIikucHJvY2Vzcy5zdGRDb2x1bW5zO1xuICAgIH1cbiAgICB1cGRhdGVMb2NhbGUob2JqKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZVN0cmluZ3Mob2JqKTtcbiAgICB9XG4gICAgdXBkYXRlU3RyaW5ncyhvYmopIHtcbiAgICAgICAgYXJnc2VydCgnPG9iamVjdD4nLCBbb2JqXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfZGV0ZWN0TG9jYWxlLCBmYWxzZSwgXCJmXCIpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3NoaW0sIFwiZlwiKS55MThuLnVwZGF0ZUxvY2FsZShvYmopO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdXNhZ2UobXNnLCBkZXNjcmlwdGlvbiwgYnVpbGRlciwgaGFuZGxlcikge1xuICAgICAgICBhcmdzZXJ0KCc8c3RyaW5nfG51bGx8dW5kZWZpbmVkPiBbc3RyaW5nfGJvb2xlYW5dIFtmdW5jdGlvbnxvYmplY3RdIFtmdW5jdGlvbl0nLCBbbXNnLCBkZXNjcmlwdGlvbiwgYnVpbGRlciwgaGFuZGxlcl0sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICBpZiAoZGVzY3JpcHRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgYXNzZXJ0Tm90U3RyaWN0RXF1YWwobXNnLCBudWxsLCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3NoaW0sIFwiZlwiKSk7XG4gICAgICAgICAgICBpZiAoKG1zZyB8fCAnJykubWF0Y2goL15cXCQwKCB8JCkvKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbW1hbmQobXNnLCBkZXNjcmlwdGlvbiwgYnVpbGRlciwgaGFuZGxlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWUVycm9yKCcudXNhZ2UoKSBkZXNjcmlwdGlvbiBtdXN0IHN0YXJ0IHdpdGggJDAgaWYgYmVpbmcgdXNlZCBhcyBhbGlhcyBmb3IgLmNvbW1hbmQoKScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV91c2FnZSwgXCJmXCIpLnVzYWdlKG1zZyk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgIH1cbiAgICB1c2FnZUNvbmZpZ3VyYXRpb24oY29uZmlnKSB7XG4gICAgICAgIGFyZ3NlcnQoJzxvYmplY3Q+JywgW2NvbmZpZ10sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlQ29uZmlnLCBjb25maWcsIFwiZlwiKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHZlcnNpb24ob3B0LCBtc2csIHZlcikge1xuICAgICAgICBjb25zdCBkZWZhdWx0VmVyc2lvbk9wdCA9ICd2ZXJzaW9uJztcbiAgICAgICAgYXJnc2VydCgnW2Jvb2xlYW58c3RyaW5nXSBbc3RyaW5nXSBbc3RyaW5nXScsIFtvcHQsIG1zZywgdmVyXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIGlmIChfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3ZlcnNpb25PcHQsIFwiZlwiKSkge1xuICAgICAgICAgICAgdGhpc1trRGVsZXRlRnJvbVBhcnNlckhpbnRPYmplY3RdKF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdmVyc2lvbk9wdCwgXCJmXCIpKTtcbiAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdXNhZ2UsIFwiZlwiKS52ZXJzaW9uKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3ZlcnNpb25PcHQsIG51bGwsIFwiZlwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdmVyID0gdGhpc1trR3Vlc3NWZXJzaW9uXSgpO1xuICAgICAgICAgICAgb3B0ID0gZGVmYXVsdFZlcnNpb25PcHQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgaWYgKG9wdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZlciA9IG9wdDtcbiAgICAgICAgICAgIG9wdCA9IGRlZmF1bHRWZXJzaW9uT3B0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIHZlciA9IG1zZztcbiAgICAgICAgICAgIG1zZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3ZlcnNpb25PcHQsIHR5cGVvZiBvcHQgPT09ICdzdHJpbmcnID8gb3B0IDogZGVmYXVsdFZlcnNpb25PcHQsIFwiZlwiKTtcbiAgICAgICAgbXNnID0gbXNnIHx8IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdXNhZ2UsIFwiZlwiKS5kZWZlclkxOG5Mb29rdXAoJ1Nob3cgdmVyc2lvbiBudW1iZXInKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV91c2FnZSwgXCJmXCIpLnZlcnNpb24odmVyIHx8IHVuZGVmaW5lZCk7XG4gICAgICAgIHRoaXMuYm9vbGVhbihfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3ZlcnNpb25PcHQsIFwiZlwiKSk7XG4gICAgICAgIHRoaXMuZGVzY3JpYmUoX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV92ZXJzaW9uT3B0LCBcImZcIiksIG1zZyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB3cmFwKGNvbHMpIHtcbiAgICAgICAgYXJnc2VydCgnPG51bWJlcnxudWxsfHVuZGVmaW5lZD4nLCBbY29sc10sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBcImZcIikud3JhcChjb2xzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIFsoX1lhcmdzSW5zdGFuY2VfY29tbWFuZCA9IG5ldyBXZWFrTWFwKCksIF9ZYXJnc0luc3RhbmNlX2N3ZCA9IG5ldyBXZWFrTWFwKCksIF9ZYXJnc0luc3RhbmNlX2NvbnRleHQgPSBuZXcgV2Vha01hcCgpLCBfWWFyZ3NJbnN0YW5jZV9jb21wbGV0aW9uID0gbmV3IFdlYWtNYXAoKSwgX1lhcmdzSW5zdGFuY2VfY29tcGxldGlvbkNvbW1hbmQgPSBuZXcgV2Vha01hcCgpLCBfWWFyZ3NJbnN0YW5jZV9kZWZhdWx0U2hvd0hpZGRlbk9wdCA9IG5ldyBXZWFrTWFwKCksIF9ZYXJnc0luc3RhbmNlX2V4aXRFcnJvciA9IG5ldyBXZWFrTWFwKCksIF9ZYXJnc0luc3RhbmNlX2RldGVjdExvY2FsZSA9IG5ldyBXZWFrTWFwKCksIF9ZYXJnc0luc3RhbmNlX2VtaXR0ZWRXYXJuaW5ncyA9IG5ldyBXZWFrTWFwKCksIF9ZYXJnc0luc3RhbmNlX2V4aXRQcm9jZXNzID0gbmV3IFdlYWtNYXAoKSwgX1lhcmdzSW5zdGFuY2VfZnJvemVucyA9IG5ldyBXZWFrTWFwKCksIF9ZYXJnc0luc3RhbmNlX2dsb2JhbE1pZGRsZXdhcmUgPSBuZXcgV2Vha01hcCgpLCBfWWFyZ3NJbnN0YW5jZV9ncm91cHMgPSBuZXcgV2Vha01hcCgpLCBfWWFyZ3NJbnN0YW5jZV9oYXNPdXRwdXQgPSBuZXcgV2Vha01hcCgpLCBfWWFyZ3NJbnN0YW5jZV9oZWxwT3B0ID0gbmV3IFdlYWtNYXAoKSwgX1lhcmdzSW5zdGFuY2VfaXNHbG9iYWxDb250ZXh0ID0gbmV3IFdlYWtNYXAoKSwgX1lhcmdzSW5zdGFuY2VfbG9nZ2VyID0gbmV3IFdlYWtNYXAoKSwgX1lhcmdzSW5zdGFuY2Vfb3V0cHV0ID0gbmV3IFdlYWtNYXAoKSwgX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucyA9IG5ldyBXZWFrTWFwKCksIF9ZYXJnc0luc3RhbmNlX3BhcmVudFJlcXVpcmUgPSBuZXcgV2Vha01hcCgpLCBfWWFyZ3NJbnN0YW5jZV9wYXJzZXJDb25maWcgPSBuZXcgV2Vha01hcCgpLCBfWWFyZ3NJbnN0YW5jZV9wYXJzZUZuID0gbmV3IFdlYWtNYXAoKSwgX1lhcmdzSW5zdGFuY2VfcGFyc2VDb250ZXh0ID0gbmV3IFdlYWtNYXAoKSwgX1lhcmdzSW5zdGFuY2VfcGtncyA9IG5ldyBXZWFrTWFwKCksIF9ZYXJnc0luc3RhbmNlX3ByZXNlcnZlZEdyb3VwcyA9IG5ldyBXZWFrTWFwKCksIF9ZYXJnc0luc3RhbmNlX3Byb2Nlc3NBcmdzID0gbmV3IFdlYWtNYXAoKSwgX1lhcmdzSW5zdGFuY2VfcmVjb21tZW5kQ29tbWFuZHMgPSBuZXcgV2Vha01hcCgpLCBfWWFyZ3NJbnN0YW5jZV9zaGltID0gbmV3IFdlYWtNYXAoKSwgX1lhcmdzSW5zdGFuY2Vfc3RyaWN0ID0gbmV3IFdlYWtNYXAoKSwgX1lhcmdzSW5zdGFuY2Vfc3RyaWN0Q29tbWFuZHMgPSBuZXcgV2Vha01hcCgpLCBfWWFyZ3NJbnN0YW5jZV9zdHJpY3RPcHRpb25zID0gbmV3IFdlYWtNYXAoKSwgX1lhcmdzSW5zdGFuY2VfdXNhZ2UgPSBuZXcgV2Vha01hcCgpLCBfWWFyZ3NJbnN0YW5jZV91c2FnZUNvbmZpZyA9IG5ldyBXZWFrTWFwKCksIF9ZYXJnc0luc3RhbmNlX3ZlcnNpb25PcHQgPSBuZXcgV2Vha01hcCgpLCBfWWFyZ3NJbnN0YW5jZV92YWxpZGF0aW9uID0gbmV3IFdlYWtNYXAoKSwga0NvcHlEb3VibGVEYXNoKV0oYXJndikge1xuICAgICAgICBpZiAoIWFyZ3YuXyB8fCAhYXJndlsnLS0nXSlcbiAgICAgICAgICAgIHJldHVybiBhcmd2O1xuICAgICAgICBhcmd2Ll8ucHVzaC5hcHBseShhcmd2Ll8sIGFyZ3ZbJy0tJ10pO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZGVsZXRlIGFyZ3ZbJy0tJ107XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKF9lcnIpIHsgfVxuICAgICAgICByZXR1cm4gYXJndjtcbiAgICB9XG4gICAgW2tDcmVhdGVMb2dnZXJdKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbG9nOiAoLi4uYXJncykgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghdGhpc1trSGFzUGFyc2VDYWxsYmFja10oKSlcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coLi4uYXJncyk7XG4gICAgICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9oYXNPdXRwdXQsIHRydWUsIFwiZlwiKTtcbiAgICAgICAgICAgICAgICBpZiAoX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vdXRwdXQsIFwiZlwiKS5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3V0cHV0LCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX291dHB1dCwgXCJmXCIpICsgJ1xcbicsIFwiZlwiKTtcbiAgICAgICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX291dHB1dCwgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vdXRwdXQsIFwiZlwiKSArIGFyZ3Muam9pbignICcpLCBcImZcIik7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3I6ICguLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzW2tIYXNQYXJzZUNhbGxiYWNrXSgpKVxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKC4uLmFyZ3MpO1xuICAgICAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfaGFzT3V0cHV0LCB0cnVlLCBcImZcIik7XG4gICAgICAgICAgICAgICAgaWYgKF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3V0cHV0LCBcImZcIikubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX291dHB1dCwgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vdXRwdXQsIFwiZlwiKSArICdcXG4nLCBcImZcIik7XG4gICAgICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vdXRwdXQsIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3V0cHV0LCBcImZcIikgKyBhcmdzLmpvaW4oJyAnKSwgXCJmXCIpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgW2tEZWxldGVGcm9tUGFyc2VySGludE9iamVjdF0ob3B0aW9uS2V5KSB7XG4gICAgICAgIG9iamVjdEtleXMoX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBcImZcIikpLmZvckVhY2goKGhpbnRLZXkpID0+IHtcbiAgICAgICAgICAgIGlmICgoKGtleSkgPT4ga2V5ID09PSAnY29uZmlnT2JqZWN0cycpKGhpbnRLZXkpKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IGhpbnQgPSBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKVtoaW50S2V5XTtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGhpbnQpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGhpbnQuaW5jbHVkZXMob3B0aW9uS2V5KSlcbiAgICAgICAgICAgICAgICAgICAgaGludC5zcGxpY2UoaGludC5pbmRleE9mKG9wdGlvbktleSksIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIGhpbnQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGhpbnRbb3B0aW9uS2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGRlbGV0ZSBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBcImZcIikuZ2V0RGVzY3JpcHRpb25zKClbb3B0aW9uS2V5XTtcbiAgICB9XG4gICAgW2tFbWl0V2FybmluZ10od2FybmluZywgdHlwZSwgZGVkdXBsaWNhdGlvbklkKSB7XG4gICAgICAgIGlmICghX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9lbWl0dGVkV2FybmluZ3MsIFwiZlwiKVtkZWR1cGxpY2F0aW9uSWRdKSB7XG4gICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3NoaW0sIFwiZlwiKS5wcm9jZXNzLmVtaXRXYXJuaW5nKHdhcm5pbmcsIHR5cGUpO1xuICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9lbWl0dGVkV2FybmluZ3MsIFwiZlwiKVtkZWR1cGxpY2F0aW9uSWRdID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBba0ZyZWV6ZV0oKSB7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfZnJvemVucywgXCJmXCIpLnB1c2goe1xuICAgICAgICAgICAgb3B0aW9uczogX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBcImZcIiksXG4gICAgICAgICAgICBjb25maWdPYmplY3RzOiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKS5jb25maWdPYmplY3RzLnNsaWNlKDApLFxuICAgICAgICAgICAgZXhpdFByb2Nlc3M6IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfZXhpdFByb2Nlc3MsIFwiZlwiKSxcbiAgICAgICAgICAgIGdyb3VwczogX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9ncm91cHMsIFwiZlwiKSxcbiAgICAgICAgICAgIHN0cmljdDogX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9zdHJpY3QsIFwiZlwiKSxcbiAgICAgICAgICAgIHN0cmljdENvbW1hbmRzOiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3N0cmljdENvbW1hbmRzLCBcImZcIiksXG4gICAgICAgICAgICBzdHJpY3RPcHRpb25zOiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3N0cmljdE9wdGlvbnMsIFwiZlwiKSxcbiAgICAgICAgICAgIGNvbXBsZXRpb25Db21tYW5kOiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2NvbXBsZXRpb25Db21tYW5kLCBcImZcIiksXG4gICAgICAgICAgICBvdXRwdXQ6IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3V0cHV0LCBcImZcIiksXG4gICAgICAgICAgICBleGl0RXJyb3I6IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfZXhpdEVycm9yLCBcImZcIiksXG4gICAgICAgICAgICBoYXNPdXRwdXQ6IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfaGFzT3V0cHV0LCBcImZcIiksXG4gICAgICAgICAgICBwYXJzZWQ6IHRoaXMucGFyc2VkLFxuICAgICAgICAgICAgcGFyc2VGbjogX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9wYXJzZUZuLCBcImZcIiksXG4gICAgICAgICAgICBwYXJzZUNvbnRleHQ6IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfcGFyc2VDb250ZXh0LCBcImZcIiksXG4gICAgICAgIH0pO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBcImZcIikuZnJlZXplKCk7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdmFsaWRhdGlvbiwgXCJmXCIpLmZyZWV6ZSgpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2NvbW1hbmQsIFwiZlwiKS5mcmVlemUoKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9nbG9iYWxNaWRkbGV3YXJlLCBcImZcIikuZnJlZXplKCk7XG4gICAgfVxuICAgIFtrR2V0RG9sbGFyWmVyb10oKSB7XG4gICAgICAgIGxldCAkMCA9ICcnO1xuICAgICAgICBsZXQgZGVmYXVsdCQwO1xuICAgICAgICBpZiAoL1xcYihub2RlfGlvanN8ZWxlY3Ryb24pKFxcLmV4ZSk/JC8udGVzdChfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3NoaW0sIFwiZlwiKS5wcm9jZXNzLmFyZ3YoKVswXSkpIHtcbiAgICAgICAgICAgIGRlZmF1bHQkMCA9IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc2hpbSwgXCJmXCIpLnByb2Nlc3MuYXJndigpLnNsaWNlKDEsIDIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZGVmYXVsdCQwID0gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9zaGltLCBcImZcIikucHJvY2Vzcy5hcmd2KCkuc2xpY2UoMCwgMSk7XG4gICAgICAgIH1cbiAgICAgICAgJDAgPSBkZWZhdWx0JDBcbiAgICAgICAgICAgIC5tYXAoeCA9PiB7XG4gICAgICAgICAgICBjb25zdCBiID0gdGhpc1trUmViYXNlXShfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2N3ZCwgXCJmXCIpLCB4KTtcbiAgICAgICAgICAgIHJldHVybiB4Lm1hdGNoKC9eKFxcL3woW2EtekEtWl06KT9cXFxcKS8pICYmIGIubGVuZ3RoIDwgeC5sZW5ndGggPyBiIDogeDtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5qb2luKCcgJylcbiAgICAgICAgICAgIC50cmltKCk7XG4gICAgICAgIGlmIChfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3NoaW0sIFwiZlwiKS5nZXRFbnYoJ18nKSAmJlxuICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9zaGltLCBcImZcIikuZ2V0UHJvY2Vzc0FyZ3ZCaW4oKSA9PT0gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9zaGltLCBcImZcIikuZ2V0RW52KCdfJykpIHtcbiAgICAgICAgICAgICQwID0gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9zaGltLCBcImZcIilcbiAgICAgICAgICAgICAgICAuZ2V0RW52KCdfJylcbiAgICAgICAgICAgICAgICAucmVwbGFjZShgJHtfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3NoaW0sIFwiZlwiKS5wYXRoLmRpcm5hbWUoX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9zaGltLCBcImZcIikucHJvY2Vzcy5leGVjUGF0aCgpKX0vYCwgJycpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAkMDtcbiAgICB9XG4gICAgW2tHZXRQYXJzZXJDb25maWd1cmF0aW9uXSgpIHtcbiAgICAgICAgcmV0dXJuIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfcGFyc2VyQ29uZmlnLCBcImZcIik7XG4gICAgfVxuICAgIFtrR2V0VXNhZ2VDb25maWd1cmF0aW9uXSgpIHtcbiAgICAgICAgcmV0dXJuIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdXNhZ2VDb25maWcsIFwiZlwiKTtcbiAgICB9XG4gICAgW2tHdWVzc0xvY2FsZV0oKSB7XG4gICAgICAgIGlmICghX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9kZXRlY3RMb2NhbGUsIFwiZlwiKSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY29uc3QgbG9jYWxlID0gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9zaGltLCBcImZcIikuZ2V0RW52KCdMQ19BTEwnKSB8fFxuICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9zaGltLCBcImZcIikuZ2V0RW52KCdMQ19NRVNTQUdFUycpIHx8XG4gICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3NoaW0sIFwiZlwiKS5nZXRFbnYoJ0xBTkcnKSB8fFxuICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9zaGltLCBcImZcIikuZ2V0RW52KCdMQU5HVUFHRScpIHx8XG4gICAgICAgICAgICAnZW5fVVMnO1xuICAgICAgICB0aGlzLmxvY2FsZShsb2NhbGUucmVwbGFjZSgvWy46XS4qLywgJycpKTtcbiAgICB9XG4gICAgW2tHdWVzc1ZlcnNpb25dKCkge1xuICAgICAgICBjb25zdCBvYmogPSB0aGlzW2tQa2dVcF0oKTtcbiAgICAgICAgcmV0dXJuIG9iai52ZXJzaW9uIHx8ICd1bmtub3duJztcbiAgICB9XG4gICAgW2tQYXJzZVBvc2l0aW9uYWxOdW1iZXJzXShhcmd2KSB7XG4gICAgICAgIGNvbnN0IGFyZ3MgPSBhcmd2WyctLSddID8gYXJndlsnLS0nXSA6IGFyZ3YuXztcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGFyZzsgKGFyZyA9IGFyZ3NbaV0pICE9PSB1bmRlZmluZWQ7IGkrKykge1xuICAgICAgICAgICAgaWYgKF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc2hpbSwgXCJmXCIpLlBhcnNlci5sb29rc0xpa2VOdW1iZXIoYXJnKSAmJlxuICAgICAgICAgICAgICAgIE51bWJlci5pc1NhZmVJbnRlZ2VyKE1hdGguZmxvb3IocGFyc2VGbG9hdChgJHthcmd9YCkpKSkge1xuICAgICAgICAgICAgICAgIGFyZ3NbaV0gPSBOdW1iZXIoYXJnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXJndjtcbiAgICB9XG4gICAgW2tQa2dVcF0ocm9vdFBhdGgpIHtcbiAgICAgICAgY29uc3QgbnBhdGggPSByb290UGF0aCB8fCAnKic7XG4gICAgICAgIGlmIChfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3BrZ3MsIFwiZlwiKVtucGF0aF0pXG4gICAgICAgICAgICByZXR1cm4gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9wa2dzLCBcImZcIilbbnBhdGhdO1xuICAgICAgICBsZXQgb2JqID0ge307XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgc3RhcnREaXIgPSByb290UGF0aCB8fCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3NoaW0sIFwiZlwiKS5tYWluRmlsZW5hbWU7XG4gICAgICAgICAgICBpZiAoIXJvb3RQYXRoICYmIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc2hpbSwgXCJmXCIpLnBhdGguZXh0bmFtZShzdGFydERpcikpIHtcbiAgICAgICAgICAgICAgICBzdGFydERpciA9IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc2hpbSwgXCJmXCIpLnBhdGguZGlybmFtZShzdGFydERpcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBwa2dKc29uUGF0aCA9IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc2hpbSwgXCJmXCIpLmZpbmRVcChzdGFydERpciwgKGRpciwgbmFtZXMpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAobmFtZXMuaW5jbHVkZXMoJ3BhY2thZ2UuanNvbicpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAncGFja2FnZS5qc29uJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBhc3NlcnROb3RTdHJpY3RFcXVhbChwa2dKc29uUGF0aCwgdW5kZWZpbmVkLCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3NoaW0sIFwiZlwiKSk7XG4gICAgICAgICAgICBvYmogPSBKU09OLnBhcnNlKF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc2hpbSwgXCJmXCIpLnJlYWRGaWxlU3luYyhwa2dKc29uUGF0aCwgJ3V0ZjgnKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKF9ub29wKSB7IH1cbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9wa2dzLCBcImZcIilbbnBhdGhdID0gb2JqIHx8IHt9O1xuICAgICAgICByZXR1cm4gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9wa2dzLCBcImZcIilbbnBhdGhdO1xuICAgIH1cbiAgICBba1BvcHVsYXRlUGFyc2VySGludEFycmF5XSh0eXBlLCBrZXlzKSB7XG4gICAgICAgIGtleXMgPSBbXS5jb25jYXQoa2V5cyk7XG4gICAgICAgIGtleXMuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAga2V5ID0gdGhpc1trU2FuaXRpemVLZXldKGtleSk7XG4gICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKVt0eXBlXS5wdXNoKGtleSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBba1BvcHVsYXRlUGFyc2VySGludFNpbmdsZVZhbHVlRGljdGlvbmFyeV0oYnVpbGRlciwgdHlwZSwga2V5LCB2YWx1ZSkge1xuICAgICAgICB0aGlzW2tQb3B1bGF0ZVBhcnNlckhpbnREaWN0aW9uYXJ5XShidWlsZGVyLCB0eXBlLCBrZXksIHZhbHVlLCAodHlwZSwga2V5LCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBcImZcIilbdHlwZV1ba2V5XSA9IHZhbHVlO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgW2tQb3B1bGF0ZVBhcnNlckhpbnRBcnJheURpY3Rpb25hcnldKGJ1aWxkZXIsIHR5cGUsIGtleSwgdmFsdWUpIHtcbiAgICAgICAgdGhpc1trUG9wdWxhdGVQYXJzZXJIaW50RGljdGlvbmFyeV0oYnVpbGRlciwgdHlwZSwga2V5LCB2YWx1ZSwgKHR5cGUsIGtleSwgdmFsdWUpID0+IHtcbiAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucywgXCJmXCIpW3R5cGVdW2tleV0gPSAoX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBcImZcIilbdHlwZV1ba2V5XSB8fCBbXSkuY29uY2F0KHZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIFtrUG9wdWxhdGVQYXJzZXJIaW50RGljdGlvbmFyeV0oYnVpbGRlciwgdHlwZSwga2V5LCB2YWx1ZSwgc2luZ2xlS2V5SGFuZGxlcikge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShrZXkpKSB7XG4gICAgICAgICAgICBrZXkuZm9yRWFjaChrID0+IHtcbiAgICAgICAgICAgICAgICBidWlsZGVyKGssIHZhbHVlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCgoa2V5KSA9PiB0eXBlb2Yga2V5ID09PSAnb2JqZWN0Jykoa2V5KSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBrIG9mIG9iamVjdEtleXMoa2V5KSkge1xuICAgICAgICAgICAgICAgIGJ1aWxkZXIoaywga2V5W2tdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHNpbmdsZUtleUhhbmRsZXIodHlwZSwgdGhpc1trU2FuaXRpemVLZXldKGtleSksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBba1Nhbml0aXplS2V5XShrZXkpIHtcbiAgICAgICAgaWYgKGtleSA9PT0gJ19fcHJvdG9fXycpXG4gICAgICAgICAgICByZXR1cm4gJ19fX3Byb3RvX19fJztcbiAgICAgICAgcmV0dXJuIGtleTtcbiAgICB9XG4gICAgW2tTZXRLZXldKGtleSwgc2V0KSB7XG4gICAgICAgIHRoaXNba1BvcHVsYXRlUGFyc2VySGludFNpbmdsZVZhbHVlRGljdGlvbmFyeV0odGhpc1trU2V0S2V5XS5iaW5kKHRoaXMpLCAna2V5Jywga2V5LCBzZXQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgW2tVbmZyZWV6ZV0oKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZywgX2gsIF9qLCBfaywgX2wsIF9tO1xuICAgICAgICBjb25zdCBmcm96ZW4gPSBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2Zyb3plbnMsIFwiZlwiKS5wb3AoKTtcbiAgICAgICAgYXNzZXJ0Tm90U3RyaWN0RXF1YWwoZnJvemVuLCB1bmRlZmluZWQsIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc2hpbSwgXCJmXCIpKTtcbiAgICAgICAgbGV0IGNvbmZpZ09iamVjdHM7XG4gICAgICAgIChfYSA9IHRoaXMsIF9iID0gdGhpcywgX2MgPSB0aGlzLCBfZCA9IHRoaXMsIF9lID0gdGhpcywgX2YgPSB0aGlzLCBfZyA9IHRoaXMsIF9oID0gdGhpcywgX2ogPSB0aGlzLCBfayA9IHRoaXMsIF9sID0gdGhpcywgX20gPSB0aGlzLCB7XG4gICAgICAgICAgICBvcHRpb25zOiAoeyBzZXQgdmFsdWUoX28pIHsgX19jbGFzc1ByaXZhdGVGaWVsZFNldChfYSwgX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucywgX28sIFwiZlwiKTsgfSB9KS52YWx1ZSxcbiAgICAgICAgICAgIGNvbmZpZ09iamVjdHMsXG4gICAgICAgICAgICBleGl0UHJvY2VzczogKHsgc2V0IHZhbHVlKF9vKSB7IF9fY2xhc3NQcml2YXRlRmllbGRTZXQoX2IsIF9ZYXJnc0luc3RhbmNlX2V4aXRQcm9jZXNzLCBfbywgXCJmXCIpOyB9IH0pLnZhbHVlLFxuICAgICAgICAgICAgZ3JvdXBzOiAoeyBzZXQgdmFsdWUoX28pIHsgX19jbGFzc1ByaXZhdGVGaWVsZFNldChfYywgX1lhcmdzSW5zdGFuY2VfZ3JvdXBzLCBfbywgXCJmXCIpOyB9IH0pLnZhbHVlLFxuICAgICAgICAgICAgb3V0cHV0OiAoeyBzZXQgdmFsdWUoX28pIHsgX19jbGFzc1ByaXZhdGVGaWVsZFNldChfZCwgX1lhcmdzSW5zdGFuY2Vfb3V0cHV0LCBfbywgXCJmXCIpOyB9IH0pLnZhbHVlLFxuICAgICAgICAgICAgZXhpdEVycm9yOiAoeyBzZXQgdmFsdWUoX28pIHsgX19jbGFzc1ByaXZhdGVGaWVsZFNldChfZSwgX1lhcmdzSW5zdGFuY2VfZXhpdEVycm9yLCBfbywgXCJmXCIpOyB9IH0pLnZhbHVlLFxuICAgICAgICAgICAgaGFzT3V0cHV0OiAoeyBzZXQgdmFsdWUoX28pIHsgX19jbGFzc1ByaXZhdGVGaWVsZFNldChfZiwgX1lhcmdzSW5zdGFuY2VfaGFzT3V0cHV0LCBfbywgXCJmXCIpOyB9IH0pLnZhbHVlLFxuICAgICAgICAgICAgcGFyc2VkOiB0aGlzLnBhcnNlZCxcbiAgICAgICAgICAgIHN0cmljdDogKHsgc2V0IHZhbHVlKF9vKSB7IF9fY2xhc3NQcml2YXRlRmllbGRTZXQoX2csIF9ZYXJnc0luc3RhbmNlX3N0cmljdCwgX28sIFwiZlwiKTsgfSB9KS52YWx1ZSxcbiAgICAgICAgICAgIHN0cmljdENvbW1hbmRzOiAoeyBzZXQgdmFsdWUoX28pIHsgX19jbGFzc1ByaXZhdGVGaWVsZFNldChfaCwgX1lhcmdzSW5zdGFuY2Vfc3RyaWN0Q29tbWFuZHMsIF9vLCBcImZcIik7IH0gfSkudmFsdWUsXG4gICAgICAgICAgICBzdHJpY3RPcHRpb25zOiAoeyBzZXQgdmFsdWUoX28pIHsgX19jbGFzc1ByaXZhdGVGaWVsZFNldChfaiwgX1lhcmdzSW5zdGFuY2Vfc3RyaWN0T3B0aW9ucywgX28sIFwiZlwiKTsgfSB9KS52YWx1ZSxcbiAgICAgICAgICAgIGNvbXBsZXRpb25Db21tYW5kOiAoeyBzZXQgdmFsdWUoX28pIHsgX19jbGFzc1ByaXZhdGVGaWVsZFNldChfaywgX1lhcmdzSW5zdGFuY2VfY29tcGxldGlvbkNvbW1hbmQsIF9vLCBcImZcIik7IH0gfSkudmFsdWUsXG4gICAgICAgICAgICBwYXJzZUZuOiAoeyBzZXQgdmFsdWUoX28pIHsgX19jbGFzc1ByaXZhdGVGaWVsZFNldChfbCwgX1lhcmdzSW5zdGFuY2VfcGFyc2VGbiwgX28sIFwiZlwiKTsgfSB9KS52YWx1ZSxcbiAgICAgICAgICAgIHBhcnNlQ29udGV4dDogKHsgc2V0IHZhbHVlKF9vKSB7IF9fY2xhc3NQcml2YXRlRmllbGRTZXQoX20sIF9ZYXJnc0luc3RhbmNlX3BhcnNlQ29udGV4dCwgX28sIFwiZlwiKTsgfSB9KS52YWx1ZSxcbiAgICAgICAgfSA9IGZyb3plbik7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucywgXCJmXCIpLmNvbmZpZ09iamVjdHMgPSBjb25maWdPYmplY3RzO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBcImZcIikudW5mcmVlemUoKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV92YWxpZGF0aW9uLCBcImZcIikudW5mcmVlemUoKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9jb21tYW5kLCBcImZcIikudW5mcmVlemUoKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9nbG9iYWxNaWRkbGV3YXJlLCBcImZcIikudW5mcmVlemUoKTtcbiAgICB9XG4gICAgW2tWYWxpZGF0ZUFzeW5jXSh2YWxpZGF0aW9uLCBhcmd2KSB7XG4gICAgICAgIHJldHVybiBtYXliZUFzeW5jUmVzdWx0KGFyZ3YsIHJlc3VsdCA9PiB7XG4gICAgICAgICAgICB2YWxpZGF0aW9uKHJlc3VsdCk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0SW50ZXJuYWxNZXRob2RzKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZ2V0Q29tbWFuZEluc3RhbmNlOiB0aGlzW2tHZXRDb21tYW5kSW5zdGFuY2VdLmJpbmQodGhpcyksXG4gICAgICAgICAgICBnZXRDb250ZXh0OiB0aGlzW2tHZXRDb250ZXh0XS5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgZ2V0SGFzT3V0cHV0OiB0aGlzW2tHZXRIYXNPdXRwdXRdLmJpbmQodGhpcyksXG4gICAgICAgICAgICBnZXRMb2dnZXJJbnN0YW5jZTogdGhpc1trR2V0TG9nZ2VySW5zdGFuY2VdLmJpbmQodGhpcyksXG4gICAgICAgICAgICBnZXRQYXJzZUNvbnRleHQ6IHRoaXNba0dldFBhcnNlQ29udGV4dF0uYmluZCh0aGlzKSxcbiAgICAgICAgICAgIGdldFBhcnNlckNvbmZpZ3VyYXRpb246IHRoaXNba0dldFBhcnNlckNvbmZpZ3VyYXRpb25dLmJpbmQodGhpcyksXG4gICAgICAgICAgICBnZXRVc2FnZUNvbmZpZ3VyYXRpb246IHRoaXNba0dldFVzYWdlQ29uZmlndXJhdGlvbl0uYmluZCh0aGlzKSxcbiAgICAgICAgICAgIGdldFVzYWdlSW5zdGFuY2U6IHRoaXNba0dldFVzYWdlSW5zdGFuY2VdLmJpbmQodGhpcyksXG4gICAgICAgICAgICBnZXRWYWxpZGF0aW9uSW5zdGFuY2U6IHRoaXNba0dldFZhbGlkYXRpb25JbnN0YW5jZV0uYmluZCh0aGlzKSxcbiAgICAgICAgICAgIGhhc1BhcnNlQ2FsbGJhY2s6IHRoaXNba0hhc1BhcnNlQ2FsbGJhY2tdLmJpbmQodGhpcyksXG4gICAgICAgICAgICBpc0dsb2JhbENvbnRleHQ6IHRoaXNba0lzR2xvYmFsQ29udGV4dF0uYmluZCh0aGlzKSxcbiAgICAgICAgICAgIHBvc3RQcm9jZXNzOiB0aGlzW2tQb3N0UHJvY2Vzc10uYmluZCh0aGlzKSxcbiAgICAgICAgICAgIHJlc2V0OiB0aGlzW2tSZXNldF0uYmluZCh0aGlzKSxcbiAgICAgICAgICAgIHJ1blZhbGlkYXRpb246IHRoaXNba1J1blZhbGlkYXRpb25dLmJpbmQodGhpcyksXG4gICAgICAgICAgICBydW5ZYXJnc1BhcnNlckFuZEV4ZWN1dGVDb21tYW5kczogdGhpc1trUnVuWWFyZ3NQYXJzZXJBbmRFeGVjdXRlQ29tbWFuZHNdLmJpbmQodGhpcyksXG4gICAgICAgICAgICBzZXRIYXNPdXRwdXQ6IHRoaXNba1NldEhhc091dHB1dF0uYmluZCh0aGlzKSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgW2tHZXRDb21tYW5kSW5zdGFuY2VdKCkge1xuICAgICAgICByZXR1cm4gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9jb21tYW5kLCBcImZcIik7XG4gICAgfVxuICAgIFtrR2V0Q29udGV4dF0oKSB7XG4gICAgICAgIHJldHVybiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2NvbnRleHQsIFwiZlwiKTtcbiAgICB9XG4gICAgW2tHZXRIYXNPdXRwdXRdKCkge1xuICAgICAgICByZXR1cm4gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9oYXNPdXRwdXQsIFwiZlwiKTtcbiAgICB9XG4gICAgW2tHZXRMb2dnZXJJbnN0YW5jZV0oKSB7XG4gICAgICAgIHJldHVybiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2xvZ2dlciwgXCJmXCIpO1xuICAgIH1cbiAgICBba0dldFBhcnNlQ29udGV4dF0oKSB7XG4gICAgICAgIHJldHVybiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3BhcnNlQ29udGV4dCwgXCJmXCIpIHx8IHt9O1xuICAgIH1cbiAgICBba0dldFVzYWdlSW5zdGFuY2VdKCkge1xuICAgICAgICByZXR1cm4gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV91c2FnZSwgXCJmXCIpO1xuICAgIH1cbiAgICBba0dldFZhbGlkYXRpb25JbnN0YW5jZV0oKSB7XG4gICAgICAgIHJldHVybiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3ZhbGlkYXRpb24sIFwiZlwiKTtcbiAgICB9XG4gICAgW2tIYXNQYXJzZUNhbGxiYWNrXSgpIHtcbiAgICAgICAgcmV0dXJuICEhX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9wYXJzZUZuLCBcImZcIik7XG4gICAgfVxuICAgIFtrSXNHbG9iYWxDb250ZXh0XSgpIHtcbiAgICAgICAgcmV0dXJuIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfaXNHbG9iYWxDb250ZXh0LCBcImZcIik7XG4gICAgfVxuICAgIFtrUG9zdFByb2Nlc3NdKGFyZ3YsIHBvcHVsYXRlRG91YmxlRGFzaCwgY2FsbGVkRnJvbUNvbW1hbmQsIHJ1bkdsb2JhbE1pZGRsZXdhcmUpIHtcbiAgICAgICAgaWYgKGNhbGxlZEZyb21Db21tYW5kKVxuICAgICAgICAgICAgcmV0dXJuIGFyZ3Y7XG4gICAgICAgIGlmIChpc1Byb21pc2UoYXJndikpXG4gICAgICAgICAgICByZXR1cm4gYXJndjtcbiAgICAgICAgaWYgKCFwb3B1bGF0ZURvdWJsZURhc2gpIHtcbiAgICAgICAgICAgIGFyZ3YgPSB0aGlzW2tDb3B5RG91YmxlRGFzaF0oYXJndik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFyc2VQb3NpdGlvbmFsTnVtYmVycyA9IHRoaXNba0dldFBhcnNlckNvbmZpZ3VyYXRpb25dKClbJ3BhcnNlLXBvc2l0aW9uYWwtbnVtYmVycyddIHx8XG4gICAgICAgICAgICB0aGlzW2tHZXRQYXJzZXJDb25maWd1cmF0aW9uXSgpWydwYXJzZS1wb3NpdGlvbmFsLW51bWJlcnMnXSA9PT0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAocGFyc2VQb3NpdGlvbmFsTnVtYmVycykge1xuICAgICAgICAgICAgYXJndiA9IHRoaXNba1BhcnNlUG9zaXRpb25hbE51bWJlcnNdKGFyZ3YpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChydW5HbG9iYWxNaWRkbGV3YXJlKSB7XG4gICAgICAgICAgICBhcmd2ID0gYXBwbHlNaWRkbGV3YXJlKGFyZ3YsIHRoaXMsIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfZ2xvYmFsTWlkZGxld2FyZSwgXCJmXCIpLmdldE1pZGRsZXdhcmUoKSwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcmd2O1xuICAgIH1cbiAgICBba1Jlc2V0XShhbGlhc2VzID0ge30pIHtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKSB8fCB7fSwgXCJmXCIpO1xuICAgICAgICBjb25zdCB0bXBPcHRpb25zID0ge307XG4gICAgICAgIHRtcE9wdGlvbnMubG9jYWwgPSBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKS5sb2NhbCB8fCBbXTtcbiAgICAgICAgdG1wT3B0aW9ucy5jb25maWdPYmplY3RzID0gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBcImZcIikuY29uZmlnT2JqZWN0cyB8fCBbXTtcbiAgICAgICAgY29uc3QgbG9jYWxMb29rdXAgPSB7fTtcbiAgICAgICAgdG1wT3B0aW9ucy5sb2NhbC5mb3JFYWNoKGwgPT4ge1xuICAgICAgICAgICAgbG9jYWxMb29rdXBbbF0gPSB0cnVlO1xuICAgICAgICAgICAgKGFsaWFzZXNbbF0gfHwgW10pLmZvckVhY2goYSA9PiB7XG4gICAgICAgICAgICAgICAgbG9jYWxMb29rdXBbYV0gPSB0cnVlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBPYmplY3QuYXNzaWduKF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfcHJlc2VydmVkR3JvdXBzLCBcImZcIiksIE9iamVjdC5rZXlzKF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfZ3JvdXBzLCBcImZcIikpLnJlZHVjZSgoYWNjLCBncm91cE5hbWUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGtleXMgPSBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2dyb3VwcywgXCJmXCIpW2dyb3VwTmFtZV0uZmlsdGVyKGtleSA9PiAhKGtleSBpbiBsb2NhbExvb2t1cCkpO1xuICAgICAgICAgICAgaWYgKGtleXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGFjY1tncm91cE5hbWVdID0ga2V5cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH0sIHt9KSk7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfZ3JvdXBzLCB7fSwgXCJmXCIpO1xuICAgICAgICBjb25zdCBhcnJheU9wdGlvbnMgPSBbXG4gICAgICAgICAgICAnYXJyYXknLFxuICAgICAgICAgICAgJ2Jvb2xlYW4nLFxuICAgICAgICAgICAgJ3N0cmluZycsXG4gICAgICAgICAgICAnc2tpcFZhbGlkYXRpb24nLFxuICAgICAgICAgICAgJ2NvdW50JyxcbiAgICAgICAgICAgICdub3JtYWxpemUnLFxuICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgICAgICAnaGlkZGVuT3B0aW9ucycsXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IG9iamVjdE9wdGlvbnMgPSBbXG4gICAgICAgICAgICAnbmFyZycsXG4gICAgICAgICAgICAna2V5JyxcbiAgICAgICAgICAgICdhbGlhcycsXG4gICAgICAgICAgICAnZGVmYXVsdCcsXG4gICAgICAgICAgICAnZGVmYXVsdERlc2NyaXB0aW9uJyxcbiAgICAgICAgICAgICdjb25maWcnLFxuICAgICAgICAgICAgJ2Nob2ljZXMnLFxuICAgICAgICAgICAgJ2RlbWFuZGVkT3B0aW9ucycsXG4gICAgICAgICAgICAnZGVtYW5kZWRDb21tYW5kcycsXG4gICAgICAgICAgICAnZGVwcmVjYXRlZE9wdGlvbnMnLFxuICAgICAgICBdO1xuICAgICAgICBhcnJheU9wdGlvbnMuZm9yRWFjaChrID0+IHtcbiAgICAgICAgICAgIHRtcE9wdGlvbnNba10gPSAoX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBcImZcIilba10gfHwgW10pLmZpbHRlcigoaykgPT4gIWxvY2FsTG9va3VwW2tdKTtcbiAgICAgICAgfSk7XG4gICAgICAgIG9iamVjdE9wdGlvbnMuZm9yRWFjaCgoaykgPT4ge1xuICAgICAgICAgICAgdG1wT3B0aW9uc1trXSA9IG9iakZpbHRlcihfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKVtrXSwgayA9PiAhbG9jYWxMb29rdXBba10pO1xuICAgICAgICB9KTtcbiAgICAgICAgdG1wT3B0aW9ucy5lbnZQcmVmaXggPSBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKS5lbnZQcmVmaXg7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucywgdG1wT3B0aW9ucywgXCJmXCIpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBcImZcIilcbiAgICAgICAgICAgID8gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV91c2FnZSwgXCJmXCIpLnJlc2V0KGxvY2FsTG9va3VwKVxuICAgICAgICAgICAgOiBVc2FnZSh0aGlzLCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3NoaW0sIFwiZlwiKSksIFwiZlwiKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV92YWxpZGF0aW9uLCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3ZhbGlkYXRpb24sIFwiZlwiKVxuICAgICAgICAgICAgPyBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3ZhbGlkYXRpb24sIFwiZlwiKS5yZXNldChsb2NhbExvb2t1cClcbiAgICAgICAgICAgIDogVmFsaWRhdGlvbih0aGlzLCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBcImZcIiksIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc2hpbSwgXCJmXCIpKSwgXCJmXCIpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2NvbW1hbmQsIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfY29tbWFuZCwgXCJmXCIpXG4gICAgICAgICAgICA/IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfY29tbWFuZCwgXCJmXCIpLnJlc2V0KClcbiAgICAgICAgICAgIDogQ29tbWFuZChfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBcImZcIiksIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdmFsaWRhdGlvbiwgXCJmXCIpLCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2dsb2JhbE1pZGRsZXdhcmUsIFwiZlwiKSwgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9zaGltLCBcImZcIikpLCBcImZcIik7XG4gICAgICAgIGlmICghX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9jb21wbGV0aW9uLCBcImZcIikpXG4gICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2NvbXBsZXRpb24sIENvbXBsZXRpb24odGhpcywgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV91c2FnZSwgXCJmXCIpLCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2NvbW1hbmQsIFwiZlwiKSwgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9zaGltLCBcImZcIikpLCBcImZcIik7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfZ2xvYmFsTWlkZGxld2FyZSwgXCJmXCIpLnJlc2V0KCk7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfY29tcGxldGlvbkNvbW1hbmQsIG51bGwsIFwiZlwiKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vdXRwdXQsICcnLCBcImZcIik7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfZXhpdEVycm9yLCBudWxsLCBcImZcIik7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfaGFzT3V0cHV0LCBmYWxzZSwgXCJmXCIpO1xuICAgICAgICB0aGlzLnBhcnNlZCA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgW2tSZWJhc2VdKGJhc2UsIGRpcikge1xuICAgICAgICByZXR1cm4gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9zaGltLCBcImZcIikucGF0aC5yZWxhdGl2ZShiYXNlLCBkaXIpO1xuICAgIH1cbiAgICBba1J1bllhcmdzUGFyc2VyQW5kRXhlY3V0ZUNvbW1hbmRzXShhcmdzLCBzaG9ydENpcmN1aXQsIGNhbGxlZEZyb21Db21tYW5kLCBjb21tYW5kSW5kZXggPSAwLCBoZWxwT25seSA9IGZhbHNlKSB7XG4gICAgICAgIGxldCBza2lwVmFsaWRhdGlvbiA9ICEhY2FsbGVkRnJvbUNvbW1hbmQgfHwgaGVscE9ubHk7XG4gICAgICAgIGFyZ3MgPSBhcmdzIHx8IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfcHJvY2Vzc0FyZ3MsIFwiZlwiKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBcImZcIikuX18gPSBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3NoaW0sIFwiZlwiKS55MThuLl9fO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKS5jb25maWd1cmF0aW9uID0gdGhpc1trR2V0UGFyc2VyQ29uZmlndXJhdGlvbl0oKTtcbiAgICAgICAgY29uc3QgcG9wdWxhdGVEb3VibGVEYXNoID0gISFfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKS5jb25maWd1cmF0aW9uWydwb3B1bGF0ZS0tJ107XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IE9iamVjdC5hc3NpZ24oe30sIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucywgXCJmXCIpLmNvbmZpZ3VyYXRpb24sIHtcbiAgICAgICAgICAgICdwb3B1bGF0ZS0tJzogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc2hpbSwgXCJmXCIpLlBhcnNlci5kZXRhaWxlZChhcmdzLCBPYmplY3QuYXNzaWduKHt9LCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKSwge1xuICAgICAgICAgICAgY29uZmlndXJhdGlvbjogeyAncGFyc2UtcG9zaXRpb25hbC1udW1iZXJzJzogZmFsc2UsIC4uLmNvbmZpZyB9LFxuICAgICAgICB9KSk7XG4gICAgICAgIGNvbnN0IGFyZ3YgPSBPYmplY3QuYXNzaWduKHBhcnNlZC5hcmd2LCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3BhcnNlQ29udGV4dCwgXCJmXCIpKTtcbiAgICAgICAgbGV0IGFyZ3ZQcm9taXNlID0gdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBhbGlhc2VzID0gcGFyc2VkLmFsaWFzZXM7XG4gICAgICAgIGxldCBoZWxwT3B0U2V0ID0gZmFsc2U7XG4gICAgICAgIGxldCB2ZXJzaW9uT3B0U2V0ID0gZmFsc2U7XG4gICAgICAgIE9iamVjdC5rZXlzKGFyZ3YpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgIGlmIChrZXkgPT09IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfaGVscE9wdCwgXCJmXCIpICYmIGFyZ3Zba2V5XSkge1xuICAgICAgICAgICAgICAgIGhlbHBPcHRTZXQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoa2V5ID09PSBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3ZlcnNpb25PcHQsIFwiZlwiKSAmJiBhcmd2W2tleV0pIHtcbiAgICAgICAgICAgICAgICB2ZXJzaW9uT3B0U2V0ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGFyZ3YuJDAgPSB0aGlzLiQwO1xuICAgICAgICB0aGlzLnBhcnNlZCA9IHBhcnNlZDtcbiAgICAgICAgaWYgKGNvbW1hbmRJbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV91c2FnZSwgXCJmXCIpLmNsZWFyQ2FjaGVkSGVscE1lc3NhZ2UoKTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpc1trR3Vlc3NMb2NhbGVdKCk7XG4gICAgICAgICAgICBpZiAoc2hvcnRDaXJjdWl0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNba1Bvc3RQcm9jZXNzXShhcmd2LCBwb3B1bGF0ZURvdWJsZURhc2gsICEhY2FsbGVkRnJvbUNvbW1hbmQsIGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2hlbHBPcHQsIFwiZlwiKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhlbHBDbWRzID0gW19fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfaGVscE9wdCwgXCJmXCIpXVxuICAgICAgICAgICAgICAgICAgICAuY29uY2F0KGFsaWFzZXNbX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9oZWxwT3B0LCBcImZcIildIHx8IFtdKVxuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGsgPT4gay5sZW5ndGggPiAxKTtcbiAgICAgICAgICAgICAgICBpZiAoaGVscENtZHMuaW5jbHVkZXMoJycgKyBhcmd2Ll9bYXJndi5fLmxlbmd0aCAtIDFdKSkge1xuICAgICAgICAgICAgICAgICAgICBhcmd2Ll8ucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIGhlbHBPcHRTZXQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfaXNHbG9iYWxDb250ZXh0LCBmYWxzZSwgXCJmXCIpO1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlcktleXMgPSBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2NvbW1hbmQsIFwiZlwiKS5nZXRDb21tYW5kcygpO1xuICAgICAgICAgICAgY29uc3QgcmVxdWVzdENvbXBsZXRpb25zID0gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9jb21wbGV0aW9uLCBcImZcIikuY29tcGxldGlvbktleSBpbiBhcmd2O1xuICAgICAgICAgICAgY29uc3Qgc2tpcFJlY29tbWVuZGF0aW9uID0gaGVscE9wdFNldCB8fCByZXF1ZXN0Q29tcGxldGlvbnMgfHwgaGVscE9ubHk7XG4gICAgICAgICAgICBpZiAoYXJndi5fLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyS2V5cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZpcnN0VW5rbm93bkNvbW1hbmQ7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBjb21tYW5kSW5kZXggfHwgMCwgY21kOyBhcmd2Ll9baV0gIT09IHVuZGVmaW5lZDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbWQgPSBTdHJpbmcoYXJndi5fW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyS2V5cy5pbmNsdWRlcyhjbWQpICYmIGNtZCAhPT0gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9jb21wbGV0aW9uQ29tbWFuZCwgXCJmXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5uZXJBcmd2ID0gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9jb21tYW5kLCBcImZcIikucnVuQ29tbWFuZChjbWQsIHRoaXMsIHBhcnNlZCwgaSArIDEsIGhlbHBPbmx5LCBoZWxwT3B0U2V0IHx8IHZlcnNpb25PcHRTZXQgfHwgaGVscE9ubHkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW2tQb3N0UHJvY2Vzc10oaW5uZXJBcmd2LCBwb3B1bGF0ZURvdWJsZURhc2gsICEhY2FsbGVkRnJvbUNvbW1hbmQsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFmaXJzdFVua25vd25Db21tYW5kICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kICE9PSBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2NvbXBsZXRpb25Db21tYW5kLCBcImZcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFVua25vd25Db21tYW5kID0gY21kO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9jb21tYW5kLCBcImZcIikuaGFzRGVmYXVsdENvbW1hbmQoKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9yZWNvbW1lbmRDb21tYW5kcywgXCJmXCIpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFVua25vd25Db21tYW5kICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAhc2tpcFJlY29tbWVuZGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3ZhbGlkYXRpb24sIFwiZlwiKS5yZWNvbW1lbmRDb21tYW5kcyhmaXJzdFVua25vd25Db21tYW5kLCBoYW5kbGVyS2V5cyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfY29tcGxldGlvbkNvbW1hbmQsIFwiZlwiKSAmJlxuICAgICAgICAgICAgICAgICAgICBhcmd2Ll8uaW5jbHVkZXMoX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9jb21wbGV0aW9uQ29tbWFuZCwgXCJmXCIpKSAmJlxuICAgICAgICAgICAgICAgICAgICAhcmVxdWVzdENvbXBsZXRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2V4aXRQcm9jZXNzLCBcImZcIikpXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRCbG9ja2luZyh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93Q29tcGxldGlvblNjcmlwdCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmV4aXQoMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfY29tbWFuZCwgXCJmXCIpLmhhc0RlZmF1bHRDb21tYW5kKCkgJiYgIXNraXBSZWNvbW1lbmRhdGlvbikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlubmVyQXJndiA9IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfY29tbWFuZCwgXCJmXCIpLnJ1bkNvbW1hbmQobnVsbCwgdGhpcywgcGFyc2VkLCAwLCBoZWxwT25seSwgaGVscE9wdFNldCB8fCB2ZXJzaW9uT3B0U2V0IHx8IGhlbHBPbmx5KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1trUG9zdFByb2Nlc3NdKGlubmVyQXJndiwgcG9wdWxhdGVEb3VibGVEYXNoLCAhIWNhbGxlZEZyb21Db21tYW5kLCBmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVxdWVzdENvbXBsZXRpb25zKSB7XG4gICAgICAgICAgICAgICAgaWYgKF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfZXhpdFByb2Nlc3MsIFwiZlwiKSlcbiAgICAgICAgICAgICAgICAgICAgc2V0QmxvY2tpbmcodHJ1ZSk7XG4gICAgICAgICAgICAgICAgYXJncyA9IFtdLmNvbmNhdChhcmdzKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb21wbGV0aW9uQXJncyA9IGFyZ3Muc2xpY2UoYXJncy5pbmRleE9mKGAtLSR7X19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9jb21wbGV0aW9uLCBcImZcIikuY29tcGxldGlvbktleX1gKSArIDEpO1xuICAgICAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfY29tcGxldGlvbiwgXCJmXCIpLmdldENvbXBsZXRpb24oY29tcGxldGlvbkFyZ3MsIChlcnIsIGNvbXBsZXRpb25zKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnIpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWUVycm9yKGVyci5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgKGNvbXBsZXRpb25zIHx8IFtdKS5mb3JFYWNoKGNvbXBsZXRpb24gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9sb2dnZXIsIFwiZlwiKS5sb2coY29tcGxldGlvbik7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmV4aXQoMCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNba1Bvc3RQcm9jZXNzXShhcmd2LCAhcG9wdWxhdGVEb3VibGVEYXNoLCAhIWNhbGxlZEZyb21Db21tYW5kLCBmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIV9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfaGFzT3V0cHV0LCBcImZcIikpIHtcbiAgICAgICAgICAgICAgICBpZiAoaGVscE9wdFNldCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9leGl0UHJvY2VzcywgXCJmXCIpKVxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0QmxvY2tpbmcodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHNraXBWYWxpZGF0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93SGVscCgnbG9nJyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhpdCgwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodmVyc2lvbk9wdFNldCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9leGl0UHJvY2VzcywgXCJmXCIpKVxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0QmxvY2tpbmcodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHNraXBWYWxpZGF0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV91c2FnZSwgXCJmXCIpLnNob3dWZXJzaW9uKCdsb2cnKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5leGl0KDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghc2tpcFZhbGlkYXRpb24gJiYgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBcImZcIikuc2tpcFZhbGlkYXRpb24ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHNraXBWYWxpZGF0aW9uID0gT2JqZWN0LmtleXMoYXJndikuc29tZShrZXkgPT4gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBcImZcIikuc2tpcFZhbGlkYXRpb24uaW5kZXhPZihrZXkpID49IDAgJiYgYXJndltrZXldID09PSB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghc2tpcFZhbGlkYXRpb24pIHtcbiAgICAgICAgICAgICAgICBpZiAocGFyc2VkLmVycm9yKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWUVycm9yKHBhcnNlZC5lcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICBpZiAoIXJlcXVlc3RDb21wbGV0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWxpZGF0aW9uID0gdGhpc1trUnVuVmFsaWRhdGlvbl0oYWxpYXNlcywge30sIHBhcnNlZC5lcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY2FsbGVkRnJvbUNvbW1hbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3ZQcm9taXNlID0gYXBwbHlNaWRkbGV3YXJlKGFyZ3YsIHRoaXMsIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfZ2xvYmFsTWlkZGxld2FyZSwgXCJmXCIpLmdldE1pZGRsZXdhcmUoKSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYXJndlByb21pc2UgPSB0aGlzW2tWYWxpZGF0ZUFzeW5jXSh2YWxpZGF0aW9uLCBhcmd2UHJvbWlzZSAhPT0gbnVsbCAmJiBhcmd2UHJvbWlzZSAhPT0gdm9pZCAwID8gYXJndlByb21pc2UgOiBhcmd2KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzUHJvbWlzZShhcmd2UHJvbWlzZSkgJiYgIWNhbGxlZEZyb21Db21tYW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmd2UHJvbWlzZSA9IGFyZ3ZQcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhcHBseU1pZGRsZXdhcmUoYXJndiwgdGhpcywgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9nbG9iYWxNaWRkbGV3YXJlLCBcImZcIikuZ2V0TWlkZGxld2FyZSgpLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBpZiAoZXJyIGluc3RhbmNlb2YgWUVycm9yKVxuICAgICAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdXNhZ2UsIFwiZlwiKS5mYWlsKGVyci5tZXNzYWdlLCBlcnIpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpc1trUG9zdFByb2Nlc3NdKGFyZ3ZQcm9taXNlICE9PSBudWxsICYmIGFyZ3ZQcm9taXNlICE9PSB2b2lkIDAgPyBhcmd2UHJvbWlzZSA6IGFyZ3YsIHBvcHVsYXRlRG91YmxlRGFzaCwgISFjYWxsZWRGcm9tQ29tbWFuZCwgdHJ1ZSk7XG4gICAgfVxuICAgIFtrUnVuVmFsaWRhdGlvbl0oYWxpYXNlcywgcG9zaXRpb25hbE1hcCwgcGFyc2VFcnJvcnMsIGlzRGVmYXVsdENvbW1hbmQpIHtcbiAgICAgICAgY29uc3QgZGVtYW5kZWRPcHRpb25zID0geyAuLi50aGlzLmdldERlbWFuZGVkT3B0aW9ucygpIH07XG4gICAgICAgIHJldHVybiAoYXJndikgPT4ge1xuICAgICAgICAgICAgaWYgKHBhcnNlRXJyb3JzKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBZRXJyb3IocGFyc2VFcnJvcnMubWVzc2FnZSk7XG4gICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3ZhbGlkYXRpb24sIFwiZlwiKS5ub25PcHRpb25Db3VudChhcmd2KTtcbiAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdmFsaWRhdGlvbiwgXCJmXCIpLnJlcXVpcmVkQXJndW1lbnRzKGFyZ3YsIGRlbWFuZGVkT3B0aW9ucyk7XG4gICAgICAgICAgICBsZXQgZmFpbGVkU3RyaWN0Q29tbWFuZHMgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3N0cmljdENvbW1hbmRzLCBcImZcIikpIHtcbiAgICAgICAgICAgICAgICBmYWlsZWRTdHJpY3RDb21tYW5kcyA9IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdmFsaWRhdGlvbiwgXCJmXCIpLnVua25vd25Db21tYW5kcyhhcmd2KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3N0cmljdCwgXCJmXCIpICYmICFmYWlsZWRTdHJpY3RDb21tYW5kcykge1xuICAgICAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdmFsaWRhdGlvbiwgXCJmXCIpLnVua25vd25Bcmd1bWVudHMoYXJndiwgYWxpYXNlcywgcG9zaXRpb25hbE1hcCwgISFpc0RlZmF1bHRDb21tYW5kKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc3RyaWN0T3B0aW9ucywgXCJmXCIpKSB7XG4gICAgICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV92YWxpZGF0aW9uLCBcImZcIikudW5rbm93bkFyZ3VtZW50cyhhcmd2LCBhbGlhc2VzLCB7fSwgZmFsc2UsIGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdmFsaWRhdGlvbiwgXCJmXCIpLmxpbWl0ZWRDaG9pY2VzKGFyZ3YpO1xuICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV92YWxpZGF0aW9uLCBcImZcIikuaW1wbGljYXRpb25zKGFyZ3YpO1xuICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV92YWxpZGF0aW9uLCBcImZcIikuY29uZmxpY3RpbmcoYXJndik7XG4gICAgICAgIH07XG4gICAgfVxuICAgIFtrU2V0SGFzT3V0cHV0XSgpIHtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9oYXNPdXRwdXQsIHRydWUsIFwiZlwiKTtcbiAgICB9XG4gICAgW2tUcmFja01hbnVhbGx5U2V0S2V5c10oa2V5cykge1xuICAgICAgICBpZiAodHlwZW9mIGtleXMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKS5rZXlba2V5c10gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZm9yIChjb25zdCBrIG9mIGtleXMpIHtcbiAgICAgICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKS5rZXlba10gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGlzWWFyZ3NJbnN0YW5jZSh5KSB7XG4gICAgcmV0dXJuICEheSAmJiB0eXBlb2YgeS5nZXRJbnRlcm5hbE1ldGhvZHMgPT09ICdmdW5jdGlvbic7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB3aGljaE1vZHVsZShleHBvcnRlZCkge1xuICAgIGlmICh0eXBlb2YgcmVxdWlyZSA9PT0gJ3VuZGVmaW5lZCcpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGZvciAobGV0IGkgPSAwLCBmaWxlcyA9IE9iamVjdC5rZXlzKHJlcXVpcmUuY2FjaGUpLCBtb2Q7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBtb2QgPSByZXF1aXJlLmNhY2hlW2ZpbGVzW2ldXTtcbiAgICAgICAgaWYgKG1vZC5leHBvcnRzID09PSBleHBvcnRlZClcbiAgICAgICAgICAgIHJldHVybiBtb2Q7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuIiwiaW1wb3J0IHsgb2JqZWN0S2V5cyB9IGZyb20gJy4uL3R5cGluZ3MvY29tbW9uLXR5cGVzLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBvYmpGaWx0ZXIob3JpZ2luYWwgPSB7fSwgZmlsdGVyID0gKCkgPT4gdHJ1ZSkge1xuICAgIGNvbnN0IG9iaiA9IHt9O1xuICAgIG9iamVjdEtleXMob3JpZ2luYWwpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgaWYgKGZpbHRlcihrZXksIG9yaWdpbmFsW2tleV0pKSB7XG4gICAgICAgICAgICBvYmpba2V5XSA9IG9yaWdpbmFsW2tleV07XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gb2JqO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc2V0QmxvY2tpbmcoYmxvY2tpbmcpIHtcbiAgICBpZiAodHlwZW9mIHByb2Nlc3MgPT09ICd1bmRlZmluZWQnKVxuICAgICAgICByZXR1cm47XG4gICAgW3Byb2Nlc3Muc3Rkb3V0LCBwcm9jZXNzLnN0ZGVycl0uZm9yRWFjaChfc3RyZWFtID0+IHtcbiAgICAgICAgY29uc3Qgc3RyZWFtID0gX3N0cmVhbTtcbiAgICAgICAgaWYgKHN0cmVhbS5faGFuZGxlICYmXG4gICAgICAgICAgICBzdHJlYW0uaXNUVFkgJiZcbiAgICAgICAgICAgIHR5cGVvZiBzdHJlYW0uX2hhbmRsZS5zZXRCbG9ja2luZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgc3RyZWFtLl9oYW5kbGUuc2V0QmxvY2tpbmcoYmxvY2tpbmcpO1xuICAgICAgICB9XG4gICAgfSk7XG59XG4iLCJpbXBvcnQgeyBvYmpGaWx0ZXIgfSBmcm9tICcuL3V0aWxzL29iai1maWx0ZXIuanMnO1xuaW1wb3J0IHsgWUVycm9yIH0gZnJvbSAnLi95ZXJyb3IuanMnO1xuaW1wb3J0IHNldEJsb2NraW5nIGZyb20gJy4vdXRpbHMvc2V0LWJsb2NraW5nLmpzJztcbmZ1bmN0aW9uIGlzQm9vbGVhbihmYWlsKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBmYWlsID09PSAnYm9vbGVhbic7XG59XG5leHBvcnQgZnVuY3Rpb24gdXNhZ2UoeWFyZ3MsIHNoaW0pIHtcbiAgICBjb25zdCBfXyA9IHNoaW0ueTE4bi5fXztcbiAgICBjb25zdCBzZWxmID0ge307XG4gICAgY29uc3QgZmFpbHMgPSBbXTtcbiAgICBzZWxmLmZhaWxGbiA9IGZ1bmN0aW9uIGZhaWxGbihmKSB7XG4gICAgICAgIGZhaWxzLnB1c2goZik7XG4gICAgfTtcbiAgICBsZXQgZmFpbE1lc3NhZ2UgPSBudWxsO1xuICAgIGxldCBnbG9iYWxGYWlsTWVzc2FnZSA9IG51bGw7XG4gICAgbGV0IHNob3dIZWxwT25GYWlsID0gdHJ1ZTtcbiAgICBzZWxmLnNob3dIZWxwT25GYWlsID0gZnVuY3Rpb24gc2hvd0hlbHBPbkZhaWxGbihhcmcxID0gdHJ1ZSwgYXJnMikge1xuICAgICAgICBjb25zdCBbZW5hYmxlZCwgbWVzc2FnZV0gPSB0eXBlb2YgYXJnMSA9PT0gJ3N0cmluZycgPyBbdHJ1ZSwgYXJnMV0gOiBbYXJnMSwgYXJnMl07XG4gICAgICAgIGlmICh5YXJncy5nZXRJbnRlcm5hbE1ldGhvZHMoKS5pc0dsb2JhbENvbnRleHQoKSkge1xuICAgICAgICAgICAgZ2xvYmFsRmFpbE1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgICB9XG4gICAgICAgIGZhaWxNZXNzYWdlID0gbWVzc2FnZTtcbiAgICAgICAgc2hvd0hlbHBPbkZhaWwgPSBlbmFibGVkO1xuICAgICAgICByZXR1cm4gc2VsZjtcbiAgICB9O1xuICAgIGxldCBmYWlsdXJlT3V0cHV0ID0gZmFsc2U7XG4gICAgc2VsZi5mYWlsID0gZnVuY3Rpb24gZmFpbChtc2csIGVycikge1xuICAgICAgICBjb25zdCBsb2dnZXIgPSB5YXJncy5nZXRJbnRlcm5hbE1ldGhvZHMoKS5nZXRMb2dnZXJJbnN0YW5jZSgpO1xuICAgICAgICBpZiAoZmFpbHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gZmFpbHMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmYWlsID0gZmFpbHNbaV07XG4gICAgICAgICAgICAgICAgaWYgKGlzQm9vbGVhbihmYWlsKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChtc2cpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihtc2cpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZmFpbChtc2csIGVyciwgc2VsZik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHlhcmdzLmdldEV4aXRQcm9jZXNzKCkpXG4gICAgICAgICAgICAgICAgc2V0QmxvY2tpbmcodHJ1ZSk7XG4gICAgICAgICAgICBpZiAoIWZhaWx1cmVPdXRwdXQpIHtcbiAgICAgICAgICAgICAgICBmYWlsdXJlT3V0cHV0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAoc2hvd0hlbHBPbkZhaWwpIHtcbiAgICAgICAgICAgICAgICAgICAgeWFyZ3Muc2hvd0hlbHAoJ2Vycm9yJyk7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobXNnIHx8IGVycilcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKG1zZyB8fCBlcnIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGdsb2JhbE9yQ29tbWFuZEZhaWxNZXNzYWdlID0gZmFpbE1lc3NhZ2UgfHwgZ2xvYmFsRmFpbE1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgaWYgKGdsb2JhbE9yQ29tbWFuZEZhaWxNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtc2cgfHwgZXJyKVxuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCcnKTtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGdsb2JhbE9yQ29tbWFuZEZhaWxNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlcnIgPSBlcnIgfHwgbmV3IFlFcnJvcihtc2cpO1xuICAgICAgICAgICAgaWYgKHlhcmdzLmdldEV4aXRQcm9jZXNzKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geWFyZ3MuZXhpdCgxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHlhcmdzLmdldEludGVybmFsTWV0aG9kcygpLmhhc1BhcnNlQ2FsbGJhY2soKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB5YXJncy5leGl0KDEsIGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGxldCB1c2FnZXMgPSBbXTtcbiAgICBsZXQgdXNhZ2VEaXNhYmxlZCA9IGZhbHNlO1xuICAgIHNlbGYudXNhZ2UgPSAobXNnLCBkZXNjcmlwdGlvbikgPT4ge1xuICAgICAgICBpZiAobXNnID09PSBudWxsKSB7XG4gICAgICAgICAgICB1c2FnZURpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHVzYWdlcyA9IFtdO1xuICAgICAgICAgICAgcmV0dXJuIHNlbGY7XG4gICAgICAgIH1cbiAgICAgICAgdXNhZ2VEaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICB1c2FnZXMucHVzaChbbXNnLCBkZXNjcmlwdGlvbiB8fCAnJ10pO1xuICAgICAgICByZXR1cm4gc2VsZjtcbiAgICB9O1xuICAgIHNlbGYuZ2V0VXNhZ2UgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiB1c2FnZXM7XG4gICAgfTtcbiAgICBzZWxmLmdldFVzYWdlRGlzYWJsZWQgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiB1c2FnZURpc2FibGVkO1xuICAgIH07XG4gICAgc2VsZi5nZXRQb3NpdGlvbmFsR3JvdXBOYW1lID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gX18oJ1Bvc2l0aW9uYWxzOicpO1xuICAgIH07XG4gICAgbGV0IGV4YW1wbGVzID0gW107XG4gICAgc2VsZi5leGFtcGxlID0gKGNtZCwgZGVzY3JpcHRpb24pID0+IHtcbiAgICAgICAgZXhhbXBsZXMucHVzaChbY21kLCBkZXNjcmlwdGlvbiB8fCAnJ10pO1xuICAgIH07XG4gICAgbGV0IGNvbW1hbmRzID0gW107XG4gICAgc2VsZi5jb21tYW5kID0gZnVuY3Rpb24gY29tbWFuZChjbWQsIGRlc2NyaXB0aW9uLCBpc0RlZmF1bHQsIGFsaWFzZXMsIGRlcHJlY2F0ZWQgPSBmYWxzZSkge1xuICAgICAgICBpZiAoaXNEZWZhdWx0KSB7XG4gICAgICAgICAgICBjb21tYW5kcyA9IGNvbW1hbmRzLm1hcChjbWRBcnJheSA9PiB7XG4gICAgICAgICAgICAgICAgY21kQXJyYXlbMl0gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gY21kQXJyYXk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb21tYW5kcy5wdXNoKFtjbWQsIGRlc2NyaXB0aW9uIHx8ICcnLCBpc0RlZmF1bHQsIGFsaWFzZXMsIGRlcHJlY2F0ZWRdKTtcbiAgICB9O1xuICAgIHNlbGYuZ2V0Q29tbWFuZHMgPSAoKSA9PiBjb21tYW5kcztcbiAgICBsZXQgZGVzY3JpcHRpb25zID0ge307XG4gICAgc2VsZi5kZXNjcmliZSA9IGZ1bmN0aW9uIGRlc2NyaWJlKGtleU9yS2V5cywgZGVzYykge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShrZXlPcktleXMpKSB7XG4gICAgICAgICAgICBrZXlPcktleXMuZm9yRWFjaChrID0+IHtcbiAgICAgICAgICAgICAgICBzZWxmLmRlc2NyaWJlKGssIGRlc2MpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIGtleU9yS2V5cyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGtleU9yS2V5cykuZm9yRWFjaChrID0+IHtcbiAgICAgICAgICAgICAgICBzZWxmLmRlc2NyaWJlKGssIGtleU9yS2V5c1trXSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uc1trZXlPcktleXNdID0gZGVzYztcbiAgICAgICAgfVxuICAgIH07XG4gICAgc2VsZi5nZXREZXNjcmlwdGlvbnMgPSAoKSA9PiBkZXNjcmlwdGlvbnM7XG4gICAgbGV0IGVwaWxvZ3MgPSBbXTtcbiAgICBzZWxmLmVwaWxvZyA9IG1zZyA9PiB7XG4gICAgICAgIGVwaWxvZ3MucHVzaChtc2cpO1xuICAgIH07XG4gICAgbGV0IHdyYXBTZXQgPSBmYWxzZTtcbiAgICBsZXQgd3JhcDtcbiAgICBzZWxmLndyYXAgPSBjb2xzID0+IHtcbiAgICAgICAgd3JhcFNldCA9IHRydWU7XG4gICAgICAgIHdyYXAgPSBjb2xzO1xuICAgIH07XG4gICAgc2VsZi5nZXRXcmFwID0gKCkgPT4ge1xuICAgICAgICBpZiAoc2hpbS5nZXRFbnYoJ1lBUkdTX0RJU0FCTEVfV1JBUCcpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXdyYXBTZXQpIHtcbiAgICAgICAgICAgIHdyYXAgPSB3aW5kb3dXaWR0aCgpO1xuICAgICAgICAgICAgd3JhcFNldCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyYXA7XG4gICAgfTtcbiAgICBjb25zdCBkZWZlclkxOG5Mb29rdXBQcmVmaXggPSAnX195YXJnc1N0cmluZ19fOic7XG4gICAgc2VsZi5kZWZlclkxOG5Mb29rdXAgPSBzdHIgPT4gZGVmZXJZMThuTG9va3VwUHJlZml4ICsgc3RyO1xuICAgIHNlbGYuaGVscCA9IGZ1bmN0aW9uIGhlbHAoKSB7XG4gICAgICAgIGlmIChjYWNoZWRIZWxwTWVzc2FnZSlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRIZWxwTWVzc2FnZTtcbiAgICAgICAgbm9ybWFsaXplQWxpYXNlcygpO1xuICAgICAgICBjb25zdCBiYXNlJDAgPSB5YXJncy5jdXN0b21TY3JpcHROYW1lXG4gICAgICAgICAgICA/IHlhcmdzLiQwXG4gICAgICAgICAgICA6IHNoaW0ucGF0aC5iYXNlbmFtZSh5YXJncy4kMCk7XG4gICAgICAgIGNvbnN0IGRlbWFuZGVkT3B0aW9ucyA9IHlhcmdzLmdldERlbWFuZGVkT3B0aW9ucygpO1xuICAgICAgICBjb25zdCBkZW1hbmRlZENvbW1hbmRzID0geWFyZ3MuZ2V0RGVtYW5kZWRDb21tYW5kcygpO1xuICAgICAgICBjb25zdCBkZXByZWNhdGVkT3B0aW9ucyA9IHlhcmdzLmdldERlcHJlY2F0ZWRPcHRpb25zKCk7XG4gICAgICAgIGNvbnN0IGdyb3VwcyA9IHlhcmdzLmdldEdyb3VwcygpO1xuICAgICAgICBjb25zdCBvcHRpb25zID0geWFyZ3MuZ2V0T3B0aW9ucygpO1xuICAgICAgICBsZXQga2V5cyA9IFtdO1xuICAgICAgICBrZXlzID0ga2V5cy5jb25jYXQoT2JqZWN0LmtleXMoZGVzY3JpcHRpb25zKSk7XG4gICAgICAgIGtleXMgPSBrZXlzLmNvbmNhdChPYmplY3Qua2V5cyhkZW1hbmRlZE9wdGlvbnMpKTtcbiAgICAgICAga2V5cyA9IGtleXMuY29uY2F0KE9iamVjdC5rZXlzKGRlbWFuZGVkQ29tbWFuZHMpKTtcbiAgICAgICAga2V5cyA9IGtleXMuY29uY2F0KE9iamVjdC5rZXlzKG9wdGlvbnMuZGVmYXVsdCkpO1xuICAgICAgICBrZXlzID0ga2V5cy5maWx0ZXIoZmlsdGVySGlkZGVuT3B0aW9ucyk7XG4gICAgICAgIGtleXMgPSBPYmplY3Qua2V5cyhrZXlzLnJlZHVjZSgoYWNjLCBrZXkpID0+IHtcbiAgICAgICAgICAgIGlmIChrZXkgIT09ICdfJylcbiAgICAgICAgICAgICAgICBhY2Nba2V5XSA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9LCB7fSkpO1xuICAgICAgICBjb25zdCB0aGVXcmFwID0gc2VsZi5nZXRXcmFwKCk7XG4gICAgICAgIGNvbnN0IHVpID0gc2hpbS5jbGl1aSh7XG4gICAgICAgICAgICB3aWR0aDogdGhlV3JhcCxcbiAgICAgICAgICAgIHdyYXA6ICEhdGhlV3JhcCxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghdXNhZ2VEaXNhYmxlZCkge1xuICAgICAgICAgICAgaWYgKHVzYWdlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB1c2FnZXMuZm9yRWFjaCh1c2FnZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHVpLmRpdih7IHRleHQ6IGAke3VzYWdlWzBdLnJlcGxhY2UoL1xcJDAvZywgYmFzZSQwKX1gIH0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAodXNhZ2VbMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVpLmRpdih7IHRleHQ6IGAke3VzYWdlWzFdfWAsIHBhZGRpbmc6IFsxLCAwLCAwLCAwXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHVpLmRpdigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY29tbWFuZHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgbGV0IHUgPSBudWxsO1xuICAgICAgICAgICAgICAgIGlmIChkZW1hbmRlZENvbW1hbmRzLl8pIHtcbiAgICAgICAgICAgICAgICAgICAgdSA9IGAke2Jhc2UkMH0gPCR7X18oJ2NvbW1hbmQnKX0+XFxuYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHUgPSBgJHtiYXNlJDB9IFske19fKCdjb21tYW5kJyl9XVxcbmA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHVpLmRpdihgJHt1fWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjb21tYW5kcy5sZW5ndGggPiAxIHx8IChjb21tYW5kcy5sZW5ndGggPT09IDEgJiYgIWNvbW1hbmRzWzBdWzJdKSkge1xuICAgICAgICAgICAgdWkuZGl2KF9fKCdDb21tYW5kczonKSk7XG4gICAgICAgICAgICBjb25zdCBjb250ZXh0ID0geWFyZ3MuZ2V0SW50ZXJuYWxNZXRob2RzKCkuZ2V0Q29udGV4dCgpO1xuICAgICAgICAgICAgY29uc3QgcGFyZW50Q29tbWFuZHMgPSBjb250ZXh0LmNvbW1hbmRzLmxlbmd0aFxuICAgICAgICAgICAgICAgID8gYCR7Y29udGV4dC5jb21tYW5kcy5qb2luKCcgJyl9IGBcbiAgICAgICAgICAgICAgICA6ICcnO1xuICAgICAgICAgICAgaWYgKHlhcmdzLmdldEludGVybmFsTWV0aG9kcygpLmdldFBhcnNlckNvbmZpZ3VyYXRpb24oKVsnc29ydC1jb21tYW5kcyddID09PVxuICAgICAgICAgICAgICAgIHRydWUpIHtcbiAgICAgICAgICAgICAgICBjb21tYW5kcyA9IGNvbW1hbmRzLnNvcnQoKGEsIGIpID0+IGFbMF0ubG9jYWxlQ29tcGFyZShiWzBdKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBwcmVmaXggPSBiYXNlJDAgPyBgJHtiYXNlJDB9IGAgOiAnJztcbiAgICAgICAgICAgIGNvbW1hbmRzLmZvckVhY2goY29tbWFuZCA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29tbWFuZFN0cmluZyA9IGAke3ByZWZpeH0ke3BhcmVudENvbW1hbmRzfSR7Y29tbWFuZFswXS5yZXBsYWNlKC9eXFwkMCA/LywgJycpfWA7XG4gICAgICAgICAgICAgICAgdWkuc3Bhbih7XG4gICAgICAgICAgICAgICAgICAgIHRleHQ6IGNvbW1hbmRTdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IFswLCAyLCAwLCAyXSxcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IG1heFdpZHRoKGNvbW1hbmRzLCB0aGVXcmFwLCBgJHtiYXNlJDB9JHtwYXJlbnRDb21tYW5kc31gKSArIDQsXG4gICAgICAgICAgICAgICAgfSwgeyB0ZXh0OiBjb21tYW5kWzFdIH0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGhpbnRzID0gW107XG4gICAgICAgICAgICAgICAgaWYgKGNvbW1hbmRbMl0pXG4gICAgICAgICAgICAgICAgICAgIGhpbnRzLnB1c2goYFske19fKCdkZWZhdWx0Jyl9XWApO1xuICAgICAgICAgICAgICAgIGlmIChjb21tYW5kWzNdICYmIGNvbW1hbmRbM10ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGhpbnRzLnB1c2goYFske19fKCdhbGlhc2VzOicpfSAke2NvbW1hbmRbM10uam9pbignLCAnKX1dYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjb21tYW5kWzRdKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29tbWFuZFs0XSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhpbnRzLnB1c2goYFske19fKCdkZXByZWNhdGVkOiAlcycsIGNvbW1hbmRbNF0pfV1gKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhpbnRzLnB1c2goYFske19fKCdkZXByZWNhdGVkJyl9XWApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChoaW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdWkuZGl2KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IGhpbnRzLmpvaW4oJyAnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IFswLCAwLCAwLCAyXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduOiAncmlnaHQnLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHVpLmRpdigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdWkuZGl2KCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYWxpYXNLZXlzID0gKE9iamVjdC5rZXlzKG9wdGlvbnMuYWxpYXMpIHx8IFtdKS5jb25jYXQoT2JqZWN0LmtleXMoeWFyZ3MucGFyc2VkLm5ld0FsaWFzZXMpIHx8IFtdKTtcbiAgICAgICAga2V5cyA9IGtleXMuZmlsdGVyKGtleSA9PiAheWFyZ3MucGFyc2VkLm5ld0FsaWFzZXNba2V5XSAmJlxuICAgICAgICAgICAgYWxpYXNLZXlzLmV2ZXJ5KGFsaWFzID0+IChvcHRpb25zLmFsaWFzW2FsaWFzXSB8fCBbXSkuaW5kZXhPZihrZXkpID09PSAtMSkpO1xuICAgICAgICBjb25zdCBkZWZhdWx0R3JvdXAgPSBfXygnT3B0aW9uczonKTtcbiAgICAgICAgaWYgKCFncm91cHNbZGVmYXVsdEdyb3VwXSlcbiAgICAgICAgICAgIGdyb3Vwc1tkZWZhdWx0R3JvdXBdID0gW107XG4gICAgICAgIGFkZFVuZ3JvdXBlZEtleXMoa2V5cywgb3B0aW9ucy5hbGlhcywgZ3JvdXBzLCBkZWZhdWx0R3JvdXApO1xuICAgICAgICBjb25zdCBpc0xvbmdTd2l0Y2ggPSAoc3cpID0+IC9eLS0vLnRlc3QoZ2V0VGV4dChzdykpO1xuICAgICAgICBjb25zdCBkaXNwbGF5ZWRHcm91cHMgPSBPYmplY3Qua2V5cyhncm91cHMpXG4gICAgICAgICAgICAuZmlsdGVyKGdyb3VwTmFtZSA9PiBncm91cHNbZ3JvdXBOYW1lXS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgLm1hcChncm91cE5hbWUgPT4ge1xuICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZEtleXMgPSBncm91cHNbZ3JvdXBOYW1lXVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoZmlsdGVySGlkZGVuT3B0aW9ucylcbiAgICAgICAgICAgICAgICAubWFwKGtleSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGFsaWFzS2V5cy5pbmNsdWRlcyhrZXkpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ga2V5O1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBhbGlhc0tleTsgKGFsaWFzS2V5ID0gYWxpYXNLZXlzW2ldKSAhPT0gdW5kZWZpbmVkOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKChvcHRpb25zLmFsaWFzW2FsaWFzS2V5XSB8fCBbXSkuaW5jbHVkZXMoa2V5KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhbGlhc0tleTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGtleTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHsgZ3JvdXBOYW1lLCBub3JtYWxpemVkS2V5cyB9O1xuICAgICAgICB9KVxuICAgICAgICAgICAgLmZpbHRlcigoeyBub3JtYWxpemVkS2V5cyB9KSA9PiBub3JtYWxpemVkS2V5cy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgLm1hcCgoeyBncm91cE5hbWUsIG5vcm1hbGl6ZWRLZXlzIH0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHN3aXRjaGVzID0gbm9ybWFsaXplZEtleXMucmVkdWNlKChhY2MsIGtleSkgPT4ge1xuICAgICAgICAgICAgICAgIGFjY1trZXldID0gW2tleV1cbiAgICAgICAgICAgICAgICAgICAgLmNvbmNhdChvcHRpb25zLmFsaWFzW2tleV0gfHwgW10pXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoc3cgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZ3JvdXBOYW1lID09PSBzZWxmLmdldFBvc2l0aW9uYWxHcm91cE5hbWUoKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdztcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCgvXlswLTldJC8udGVzdChzdylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG9wdGlvbnMuYm9vbGVhbi5pbmNsdWRlcyhrZXkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJy0nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJy0tJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc3cubGVuZ3RoID4gMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICctLSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnLScpICsgc3cpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLnNvcnQoKHN3MSwgc3cyKSA9PiBpc0xvbmdTd2l0Y2goc3cxKSA9PT0gaXNMb25nU3dpdGNoKHN3MilcbiAgICAgICAgICAgICAgICAgICAgPyAwXG4gICAgICAgICAgICAgICAgICAgIDogaXNMb25nU3dpdGNoKHN3MSlcbiAgICAgICAgICAgICAgICAgICAgICAgID8gMVxuICAgICAgICAgICAgICAgICAgICAgICAgOiAtMSlcbiAgICAgICAgICAgICAgICAgICAgLmpvaW4oJywgJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgICAgIH0sIHt9KTtcbiAgICAgICAgICAgIHJldHVybiB7IGdyb3VwTmFtZSwgbm9ybWFsaXplZEtleXMsIHN3aXRjaGVzIH07XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBzaG9ydFN3aXRjaGVzVXNlZCA9IGRpc3BsYXllZEdyb3Vwc1xuICAgICAgICAgICAgLmZpbHRlcigoeyBncm91cE5hbWUgfSkgPT4gZ3JvdXBOYW1lICE9PSBzZWxmLmdldFBvc2l0aW9uYWxHcm91cE5hbWUoKSlcbiAgICAgICAgICAgIC5zb21lKCh7IG5vcm1hbGl6ZWRLZXlzLCBzd2l0Y2hlcyB9KSA9PiAhbm9ybWFsaXplZEtleXMuZXZlcnkoa2V5ID0+IGlzTG9uZ1N3aXRjaChzd2l0Y2hlc1trZXldKSkpO1xuICAgICAgICBpZiAoc2hvcnRTd2l0Y2hlc1VzZWQpIHtcbiAgICAgICAgICAgIGRpc3BsYXllZEdyb3Vwc1xuICAgICAgICAgICAgICAgIC5maWx0ZXIoKHsgZ3JvdXBOYW1lIH0pID0+IGdyb3VwTmFtZSAhPT0gc2VsZi5nZXRQb3NpdGlvbmFsR3JvdXBOYW1lKCkpXG4gICAgICAgICAgICAgICAgLmZvckVhY2goKHsgbm9ybWFsaXplZEtleXMsIHN3aXRjaGVzIH0pID0+IHtcbiAgICAgICAgICAgICAgICBub3JtYWxpemVkS2V5cy5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0xvbmdTd2l0Y2goc3dpdGNoZXNba2V5XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaGVzW2tleV0gPSBhZGRJbmRlbnRhdGlvbihzd2l0Y2hlc1trZXldLCAnLXgsICcubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZGlzcGxheWVkR3JvdXBzLmZvckVhY2goKHsgZ3JvdXBOYW1lLCBub3JtYWxpemVkS2V5cywgc3dpdGNoZXMgfSkgPT4ge1xuICAgICAgICAgICAgdWkuZGl2KGdyb3VwTmFtZSk7XG4gICAgICAgICAgICBub3JtYWxpemVkS2V5cy5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qga3N3aXRjaCA9IHN3aXRjaGVzW2tleV07XG4gICAgICAgICAgICAgICAgbGV0IGRlc2MgPSBkZXNjcmlwdGlvbnNba2V5XSB8fCAnJztcbiAgICAgICAgICAgICAgICBsZXQgdHlwZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKGRlc2MuaW5jbHVkZXMoZGVmZXJZMThuTG9va3VwUHJlZml4KSlcbiAgICAgICAgICAgICAgICAgICAgZGVzYyA9IF9fKGRlc2Muc3Vic3RyaW5nKGRlZmVyWTE4bkxvb2t1cFByZWZpeC5sZW5ndGgpKTtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5ib29sZWFuLmluY2x1ZGVzKGtleSkpXG4gICAgICAgICAgICAgICAgICAgIHR5cGUgPSBgWyR7X18oJ2Jvb2xlYW4nKX1dYDtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5jb3VudC5pbmNsdWRlcyhrZXkpKVxuICAgICAgICAgICAgICAgICAgICB0eXBlID0gYFske19fKCdjb3VudCcpfV1gO1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnN0cmluZy5pbmNsdWRlcyhrZXkpKVxuICAgICAgICAgICAgICAgICAgICB0eXBlID0gYFske19fKCdzdHJpbmcnKX1dYDtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5ub3JtYWxpemUuaW5jbHVkZXMoa2V5KSlcbiAgICAgICAgICAgICAgICAgICAgdHlwZSA9IGBbJHtfXygnc3RyaW5nJyl9XWA7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuYXJyYXkuaW5jbHVkZXMoa2V5KSlcbiAgICAgICAgICAgICAgICAgICAgdHlwZSA9IGBbJHtfXygnYXJyYXknKX1dYDtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5udW1iZXIuaW5jbHVkZXMoa2V5KSlcbiAgICAgICAgICAgICAgICAgICAgdHlwZSA9IGBbJHtfXygnbnVtYmVyJyl9XWA7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVwcmVjYXRlZEV4dHJhID0gKGRlcHJlY2F0ZWQpID0+IHR5cGVvZiBkZXByZWNhdGVkID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgICAgICAgICA/IGBbJHtfXygnZGVwcmVjYXRlZDogJXMnLCBkZXByZWNhdGVkKX1dYFxuICAgICAgICAgICAgICAgICAgICA6IGBbJHtfXygnZGVwcmVjYXRlZCcpfV1gO1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4dHJhID0gW1xuICAgICAgICAgICAgICAgICAgICBrZXkgaW4gZGVwcmVjYXRlZE9wdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgICAgID8gZGVwcmVjYXRlZEV4dHJhKGRlcHJlY2F0ZWRPcHRpb25zW2tleV0pXG4gICAgICAgICAgICAgICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICAgICAgICAgIGtleSBpbiBkZW1hbmRlZE9wdGlvbnMgPyBgWyR7X18oJ3JlcXVpcmVkJyl9XWAgOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmNob2ljZXMgJiYgb3B0aW9ucy5jaG9pY2VzW2tleV1cbiAgICAgICAgICAgICAgICAgICAgICAgID8gYFske19fKCdjaG9pY2VzOicpfSAke3NlbGYuc3RyaW5naWZpZWRWYWx1ZXMob3B0aW9ucy5jaG9pY2VzW2tleV0pfV1gXG4gICAgICAgICAgICAgICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRTdHJpbmcob3B0aW9ucy5kZWZhdWx0W2tleV0sIG9wdGlvbnMuZGVmYXVsdERlc2NyaXB0aW9uW2tleV0pLFxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgICAgICAgICAgICAgICAuam9pbignICcpO1xuICAgICAgICAgICAgICAgIHVpLnNwYW4oe1xuICAgICAgICAgICAgICAgICAgICB0ZXh0OiBnZXRUZXh0KGtzd2l0Y2gpLFxuICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiBbMCwgMiwgMCwgMiArIGdldEluZGVudGF0aW9uKGtzd2l0Y2gpXSxcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IG1heFdpZHRoKHN3aXRjaGVzLCB0aGVXcmFwKSArIDQsXG4gICAgICAgICAgICAgICAgfSwgZGVzYyk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2hvdWxkSGlkZU9wdGlvbkV4dHJhcyA9IHlhcmdzLmdldEludGVybmFsTWV0aG9kcygpLmdldFVzYWdlQ29uZmlndXJhdGlvbigpWydoaWRlLXR5cGVzJ10gPT09XG4gICAgICAgICAgICAgICAgICAgIHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKGV4dHJhICYmICFzaG91bGRIaWRlT3B0aW9uRXh0cmFzKVxuICAgICAgICAgICAgICAgICAgICB1aS5kaXYoeyB0ZXh0OiBleHRyYSwgcGFkZGluZzogWzAsIDAsIDAsIDJdLCBhbGlnbjogJ3JpZ2h0JyB9KTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHVpLmRpdigpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB1aS5kaXYoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChleGFtcGxlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHVpLmRpdihfXygnRXhhbXBsZXM6JykpO1xuICAgICAgICAgICAgZXhhbXBsZXMuZm9yRWFjaChleGFtcGxlID0+IHtcbiAgICAgICAgICAgICAgICBleGFtcGxlWzBdID0gZXhhbXBsZVswXS5yZXBsYWNlKC9cXCQwL2csIGJhc2UkMCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGV4YW1wbGVzLmZvckVhY2goZXhhbXBsZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGV4YW1wbGVbMV0gPT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHVpLmRpdih7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBleGFtcGxlWzBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogWzAsIDIsIDAsIDJdLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHVpLmRpdih7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBleGFtcGxlWzBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogWzAsIDIsIDAsIDJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IG1heFdpZHRoKGV4YW1wbGVzLCB0aGVXcmFwKSArIDQsXG4gICAgICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IGV4YW1wbGVbMV0sXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdWkuZGl2KCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVwaWxvZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgZSA9IGVwaWxvZ3NcbiAgICAgICAgICAgICAgICAubWFwKGVwaWxvZyA9PiBlcGlsb2cucmVwbGFjZSgvXFwkMC9nLCBiYXNlJDApKVxuICAgICAgICAgICAgICAgIC5qb2luKCdcXG4nKTtcbiAgICAgICAgICAgIHVpLmRpdihgJHtlfVxcbmApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1aS50b1N0cmluZygpLnJlcGxhY2UoL1xccyokLywgJycpO1xuICAgIH07XG4gICAgZnVuY3Rpb24gbWF4V2lkdGgodGFibGUsIHRoZVdyYXAsIG1vZGlmaWVyKSB7XG4gICAgICAgIGxldCB3aWR0aCA9IDA7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh0YWJsZSkpIHtcbiAgICAgICAgICAgIHRhYmxlID0gT2JqZWN0LnZhbHVlcyh0YWJsZSkubWFwKHYgPT4gW3ZdKTtcbiAgICAgICAgfVxuICAgICAgICB0YWJsZS5mb3JFYWNoKHYgPT4ge1xuICAgICAgICAgICAgd2lkdGggPSBNYXRoLm1heChzaGltLnN0cmluZ1dpZHRoKG1vZGlmaWVyID8gYCR7bW9kaWZpZXJ9ICR7Z2V0VGV4dCh2WzBdKX1gIDogZ2V0VGV4dCh2WzBdKSkgKyBnZXRJbmRlbnRhdGlvbih2WzBdKSwgd2lkdGgpO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHRoZVdyYXApXG4gICAgICAgICAgICB3aWR0aCA9IE1hdGgubWluKHdpZHRoLCBwYXJzZUludCgodGhlV3JhcCAqIDAuNSkudG9TdHJpbmcoKSwgMTApKTtcbiAgICAgICAgcmV0dXJuIHdpZHRoO1xuICAgIH1cbiAgICBmdW5jdGlvbiBub3JtYWxpemVBbGlhc2VzKCkge1xuICAgICAgICBjb25zdCBkZW1hbmRlZE9wdGlvbnMgPSB5YXJncy5nZXREZW1hbmRlZE9wdGlvbnMoKTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHlhcmdzLmdldE9wdGlvbnMoKTtcbiAgICAgICAgKE9iamVjdC5rZXlzKG9wdGlvbnMuYWxpYXMpIHx8IFtdKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICBvcHRpb25zLmFsaWFzW2tleV0uZm9yRWFjaChhbGlhcyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGRlc2NyaXB0aW9uc1thbGlhc10pXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuZGVzY3JpYmUoa2V5LCBkZXNjcmlwdGlvbnNbYWxpYXNdKTtcbiAgICAgICAgICAgICAgICBpZiAoYWxpYXMgaW4gZGVtYW5kZWRPcHRpb25zKVxuICAgICAgICAgICAgICAgICAgICB5YXJncy5kZW1hbmRPcHRpb24oa2V5LCBkZW1hbmRlZE9wdGlvbnNbYWxpYXNdKTtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5ib29sZWFuLmluY2x1ZGVzKGFsaWFzKSlcbiAgICAgICAgICAgICAgICAgICAgeWFyZ3MuYm9vbGVhbihrZXkpO1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmNvdW50LmluY2x1ZGVzKGFsaWFzKSlcbiAgICAgICAgICAgICAgICAgICAgeWFyZ3MuY291bnQoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5zdHJpbmcuaW5jbHVkZXMoYWxpYXMpKVxuICAgICAgICAgICAgICAgICAgICB5YXJncy5zdHJpbmcoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5ub3JtYWxpemUuaW5jbHVkZXMoYWxpYXMpKVxuICAgICAgICAgICAgICAgICAgICB5YXJncy5ub3JtYWxpemUoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5hcnJheS5pbmNsdWRlcyhhbGlhcykpXG4gICAgICAgICAgICAgICAgICAgIHlhcmdzLmFycmF5KGtleSk7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMubnVtYmVyLmluY2x1ZGVzKGFsaWFzKSlcbiAgICAgICAgICAgICAgICAgICAgeWFyZ3MubnVtYmVyKGtleSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGxldCBjYWNoZWRIZWxwTWVzc2FnZTtcbiAgICBzZWxmLmNhY2hlSGVscE1lc3NhZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNhY2hlZEhlbHBNZXNzYWdlID0gdGhpcy5oZWxwKCk7XG4gICAgfTtcbiAgICBzZWxmLmNsZWFyQ2FjaGVkSGVscE1lc3NhZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNhY2hlZEhlbHBNZXNzYWdlID0gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgc2VsZi5oYXNDYWNoZWRIZWxwTWVzc2FnZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICEhY2FjaGVkSGVscE1lc3NhZ2U7XG4gICAgfTtcbiAgICBmdW5jdGlvbiBhZGRVbmdyb3VwZWRLZXlzKGtleXMsIGFsaWFzZXMsIGdyb3VwcywgZGVmYXVsdEdyb3VwKSB7XG4gICAgICAgIGxldCBncm91cGVkS2V5cyA9IFtdO1xuICAgICAgICBsZXQgdG9DaGVjayA9IG51bGw7XG4gICAgICAgIE9iamVjdC5rZXlzKGdyb3VwcykuZm9yRWFjaChncm91cCA9PiB7XG4gICAgICAgICAgICBncm91cGVkS2V5cyA9IGdyb3VwZWRLZXlzLmNvbmNhdChncm91cHNbZ3JvdXBdKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGtleXMuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgdG9DaGVjayA9IFtrZXldLmNvbmNhdChhbGlhc2VzW2tleV0pO1xuICAgICAgICAgICAgaWYgKCF0b0NoZWNrLnNvbWUoayA9PiBncm91cGVkS2V5cy5pbmRleE9mKGspICE9PSAtMSkpIHtcbiAgICAgICAgICAgICAgICBncm91cHNbZGVmYXVsdEdyb3VwXS5wdXNoKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZ3JvdXBlZEtleXM7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGZpbHRlckhpZGRlbk9wdGlvbnMoa2V5KSB7XG4gICAgICAgIHJldHVybiAoeWFyZ3MuZ2V0T3B0aW9ucygpLmhpZGRlbk9wdGlvbnMuaW5kZXhPZihrZXkpIDwgMCB8fFxuICAgICAgICAgICAgeWFyZ3MucGFyc2VkLmFyZ3ZbeWFyZ3MuZ2V0T3B0aW9ucygpLnNob3dIaWRkZW5PcHRdKTtcbiAgICB9XG4gICAgc2VsZi5zaG93SGVscCA9IChsZXZlbCkgPT4ge1xuICAgICAgICBjb25zdCBsb2dnZXIgPSB5YXJncy5nZXRJbnRlcm5hbE1ldGhvZHMoKS5nZXRMb2dnZXJJbnN0YW5jZSgpO1xuICAgICAgICBpZiAoIWxldmVsKVxuICAgICAgICAgICAgbGV2ZWwgPSAnZXJyb3InO1xuICAgICAgICBjb25zdCBlbWl0ID0gdHlwZW9mIGxldmVsID09PSAnZnVuY3Rpb24nID8gbGV2ZWwgOiBsb2dnZXJbbGV2ZWxdO1xuICAgICAgICBlbWl0KHNlbGYuaGVscCgpKTtcbiAgICB9O1xuICAgIHNlbGYuZnVuY3Rpb25EZXNjcmlwdGlvbiA9IGZuID0+IHtcbiAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSBmbi5uYW1lXG4gICAgICAgICAgICA/IHNoaW0uUGFyc2VyLmRlY2FtZWxpemUoZm4ubmFtZSwgJy0nKVxuICAgICAgICAgICAgOiBfXygnZ2VuZXJhdGVkLXZhbHVlJyk7XG4gICAgICAgIHJldHVybiBbJygnLCBkZXNjcmlwdGlvbiwgJyknXS5qb2luKCcnKTtcbiAgICB9O1xuICAgIHNlbGYuc3RyaW5naWZpZWRWYWx1ZXMgPSBmdW5jdGlvbiBzdHJpbmdpZmllZFZhbHVlcyh2YWx1ZXMsIHNlcGFyYXRvcikge1xuICAgICAgICBsZXQgc3RyaW5nID0gJyc7XG4gICAgICAgIGNvbnN0IHNlcCA9IHNlcGFyYXRvciB8fCAnLCAnO1xuICAgICAgICBjb25zdCBhcnJheSA9IFtdLmNvbmNhdCh2YWx1ZXMpO1xuICAgICAgICBpZiAoIXZhbHVlcyB8fCAhYXJyYXkubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIHN0cmluZztcbiAgICAgICAgYXJyYXkuZm9yRWFjaCh2YWx1ZSA9PiB7XG4gICAgICAgICAgICBpZiAoc3RyaW5nLmxlbmd0aClcbiAgICAgICAgICAgICAgICBzdHJpbmcgKz0gc2VwO1xuICAgICAgICAgICAgc3RyaW5nICs9IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBzdHJpbmc7XG4gICAgfTtcbiAgICBmdW5jdGlvbiBkZWZhdWx0U3RyaW5nKHZhbHVlLCBkZWZhdWx0RGVzY3JpcHRpb24pIHtcbiAgICAgICAgbGV0IHN0cmluZyA9IGBbJHtfXygnZGVmYXVsdDonKX0gYDtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgIWRlZmF1bHREZXNjcmlwdGlvbilcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBpZiAoZGVmYXVsdERlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgICBzdHJpbmcgKz0gZGVmYXVsdERlc2NyaXB0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICAgICAgICAgICAgICBzdHJpbmcgKz0gYFwiJHt2YWx1ZX1cImA7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgICAgICAgICAgICAgIHN0cmluZyArPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHN0cmluZyArPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYCR7c3RyaW5nfV1gO1xuICAgIH1cbiAgICBmdW5jdGlvbiB3aW5kb3dXaWR0aCgpIHtcbiAgICAgICAgY29uc3QgbWF4V2lkdGggPSA4MDtcbiAgICAgICAgaWYgKHNoaW0ucHJvY2Vzcy5zdGRDb2x1bW5zKSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5taW4obWF4V2lkdGgsIHNoaW0ucHJvY2Vzcy5zdGRDb2x1bW5zKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBtYXhXaWR0aDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsZXQgdmVyc2lvbiA9IG51bGw7XG4gICAgc2VsZi52ZXJzaW9uID0gdmVyID0+IHtcbiAgICAgICAgdmVyc2lvbiA9IHZlcjtcbiAgICB9O1xuICAgIHNlbGYuc2hvd1ZlcnNpb24gPSBsZXZlbCA9PiB7XG4gICAgICAgIGNvbnN0IGxvZ2dlciA9IHlhcmdzLmdldEludGVybmFsTWV0aG9kcygpLmdldExvZ2dlckluc3RhbmNlKCk7XG4gICAgICAgIGlmICghbGV2ZWwpXG4gICAgICAgICAgICBsZXZlbCA9ICdlcnJvcic7XG4gICAgICAgIGNvbnN0IGVtaXQgPSB0eXBlb2YgbGV2ZWwgPT09ICdmdW5jdGlvbicgPyBsZXZlbCA6IGxvZ2dlcltsZXZlbF07XG4gICAgICAgIGVtaXQodmVyc2lvbik7XG4gICAgfTtcbiAgICBzZWxmLnJlc2V0ID0gZnVuY3Rpb24gcmVzZXQobG9jYWxMb29rdXApIHtcbiAgICAgICAgZmFpbE1lc3NhZ2UgPSBudWxsO1xuICAgICAgICBmYWlsdXJlT3V0cHV0ID0gZmFsc2U7XG4gICAgICAgIHVzYWdlcyA9IFtdO1xuICAgICAgICB1c2FnZURpc2FibGVkID0gZmFsc2U7XG4gICAgICAgIGVwaWxvZ3MgPSBbXTtcbiAgICAgICAgZXhhbXBsZXMgPSBbXTtcbiAgICAgICAgY29tbWFuZHMgPSBbXTtcbiAgICAgICAgZGVzY3JpcHRpb25zID0gb2JqRmlsdGVyKGRlc2NyaXB0aW9ucywgayA9PiAhbG9jYWxMb29rdXBba10pO1xuICAgICAgICByZXR1cm4gc2VsZjtcbiAgICB9O1xuICAgIGNvbnN0IGZyb3plbnMgPSBbXTtcbiAgICBzZWxmLmZyZWV6ZSA9IGZ1bmN0aW9uIGZyZWV6ZSgpIHtcbiAgICAgICAgZnJvemVucy5wdXNoKHtcbiAgICAgICAgICAgIGZhaWxNZXNzYWdlLFxuICAgICAgICAgICAgZmFpbHVyZU91dHB1dCxcbiAgICAgICAgICAgIHVzYWdlcyxcbiAgICAgICAgICAgIHVzYWdlRGlzYWJsZWQsXG4gICAgICAgICAgICBlcGlsb2dzLFxuICAgICAgICAgICAgZXhhbXBsZXMsXG4gICAgICAgICAgICBjb21tYW5kcyxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9ucyxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBzZWxmLnVuZnJlZXplID0gZnVuY3Rpb24gdW5mcmVlemUoZGVmYXVsdENvbW1hbmQgPSBmYWxzZSkge1xuICAgICAgICBjb25zdCBmcm96ZW4gPSBmcm96ZW5zLnBvcCgpO1xuICAgICAgICBpZiAoIWZyb3plbilcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgaWYgKGRlZmF1bHRDb21tYW5kKSB7XG4gICAgICAgICAgICBkZXNjcmlwdGlvbnMgPSB7IC4uLmZyb3plbi5kZXNjcmlwdGlvbnMsIC4uLmRlc2NyaXB0aW9ucyB9O1xuICAgICAgICAgICAgY29tbWFuZHMgPSBbLi4uZnJvemVuLmNvbW1hbmRzLCAuLi5jb21tYW5kc107XG4gICAgICAgICAgICB1c2FnZXMgPSBbLi4uZnJvemVuLnVzYWdlcywgLi4udXNhZ2VzXTtcbiAgICAgICAgICAgIGV4YW1wbGVzID0gWy4uLmZyb3plbi5leGFtcGxlcywgLi4uZXhhbXBsZXNdO1xuICAgICAgICAgICAgZXBpbG9ncyA9IFsuLi5mcm96ZW4uZXBpbG9ncywgLi4uZXBpbG9nc107XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAoe1xuICAgICAgICAgICAgICAgIGZhaWxNZXNzYWdlLFxuICAgICAgICAgICAgICAgIGZhaWx1cmVPdXRwdXQsXG4gICAgICAgICAgICAgICAgdXNhZ2VzLFxuICAgICAgICAgICAgICAgIHVzYWdlRGlzYWJsZWQsXG4gICAgICAgICAgICAgICAgZXBpbG9ncyxcbiAgICAgICAgICAgICAgICBleGFtcGxlcyxcbiAgICAgICAgICAgICAgICBjb21tYW5kcyxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbnMsXG4gICAgICAgICAgICB9ID0gZnJvemVuKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIHNlbGY7XG59XG5mdW5jdGlvbiBpc0luZGVudGVkVGV4dCh0ZXh0KSB7XG4gICAgcmV0dXJuIHR5cGVvZiB0ZXh0ID09PSAnb2JqZWN0Jztcbn1cbmZ1bmN0aW9uIGFkZEluZGVudGF0aW9uKHRleHQsIGluZGVudCkge1xuICAgIHJldHVybiBpc0luZGVudGVkVGV4dCh0ZXh0KVxuICAgICAgICA/IHsgdGV4dDogdGV4dC50ZXh0LCBpbmRlbnRhdGlvbjogdGV4dC5pbmRlbnRhdGlvbiArIGluZGVudCB9XG4gICAgICAgIDogeyB0ZXh0LCBpbmRlbnRhdGlvbjogaW5kZW50IH07XG59XG5mdW5jdGlvbiBnZXRJbmRlbnRhdGlvbih0ZXh0KSB7XG4gICAgcmV0dXJuIGlzSW5kZW50ZWRUZXh0KHRleHQpID8gdGV4dC5pbmRlbnRhdGlvbiA6IDA7XG59XG5mdW5jdGlvbiBnZXRUZXh0KHRleHQpIHtcbiAgICByZXR1cm4gaXNJbmRlbnRlZFRleHQodGV4dCkgPyB0ZXh0LnRleHQgOiB0ZXh0O1xufVxuIiwiaW1wb3J0IHsgaXNDb21tYW5kQnVpbGRlckNhbGxiYWNrIH0gZnJvbSAnLi9jb21tYW5kLmpzJztcbmltcG9ydCB7IGFzc2VydE5vdFN0cmljdEVxdWFsIH0gZnJvbSAnLi90eXBpbmdzL2NvbW1vbi10eXBlcy5qcyc7XG5pbXBvcnQgKiBhcyB0ZW1wbGF0ZXMgZnJvbSAnLi9jb21wbGV0aW9uLXRlbXBsYXRlcy5qcyc7XG5pbXBvcnQgeyBpc1Byb21pc2UgfSBmcm9tICcuL3V0aWxzL2lzLXByb21pc2UuanMnO1xuaW1wb3J0IHsgcGFyc2VDb21tYW5kIH0gZnJvbSAnLi9wYXJzZS1jb21tYW5kLmpzJztcbmV4cG9ydCBjbGFzcyBDb21wbGV0aW9uIHtcbiAgICBjb25zdHJ1Y3Rvcih5YXJncywgdXNhZ2UsIGNvbW1hbmQsIHNoaW0pIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgICAgIHRoaXMueWFyZ3MgPSB5YXJncztcbiAgICAgICAgdGhpcy51c2FnZSA9IHVzYWdlO1xuICAgICAgICB0aGlzLmNvbW1hbmQgPSBjb21tYW5kO1xuICAgICAgICB0aGlzLnNoaW0gPSBzaGltO1xuICAgICAgICB0aGlzLmNvbXBsZXRpb25LZXkgPSAnZ2V0LXlhcmdzLWNvbXBsZXRpb25zJztcbiAgICAgICAgdGhpcy5hbGlhc2VzID0gbnVsbDtcbiAgICAgICAgdGhpcy5jdXN0b21Db21wbGV0aW9uRnVuY3Rpb24gPSBudWxsO1xuICAgICAgICB0aGlzLmluZGV4QWZ0ZXJMYXN0UmVzZXQgPSAwO1xuICAgICAgICB0aGlzLnpzaFNoZWxsID1cbiAgICAgICAgICAgIChfYyA9ICgoKF9hID0gdGhpcy5zaGltLmdldEVudignU0hFTEwnKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmluY2x1ZGVzKCd6c2gnKSkgfHxcbiAgICAgICAgICAgICAgICAoKF9iID0gdGhpcy5zaGltLmdldEVudignWlNIX05BTUUnKSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmluY2x1ZGVzKCd6c2gnKSkpKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBmYWxzZTtcbiAgICB9XG4gICAgZGVmYXVsdENvbXBsZXRpb24oYXJncywgYXJndiwgY3VycmVudCwgZG9uZSkge1xuICAgICAgICBjb25zdCBoYW5kbGVycyA9IHRoaXMuY29tbWFuZC5nZXRDb21tYW5kSGFuZGxlcnMoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gYXJncy5sZW5ndGg7IGkgPCBpaTsgKytpKSB7XG4gICAgICAgICAgICBpZiAoaGFuZGxlcnNbYXJnc1tpXV0gJiYgaGFuZGxlcnNbYXJnc1tpXV0uYnVpbGRlcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBoYW5kbGVyc1thcmdzW2ldXS5idWlsZGVyO1xuICAgICAgICAgICAgICAgIGlmIChpc0NvbW1hbmRCdWlsZGVyQ2FsbGJhY2soYnVpbGRlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmRleEFmdGVyTGFzdFJlc2V0ID0gaSArIDE7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHkgPSB0aGlzLnlhcmdzLmdldEludGVybmFsTWV0aG9kcygpLnJlc2V0KCk7XG4gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIoeSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB5LmFyZ3Y7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbXBsZXRpb25zID0gW107XG4gICAgICAgIHRoaXMuY29tbWFuZENvbXBsZXRpb25zKGNvbXBsZXRpb25zLCBhcmdzLCBjdXJyZW50KTtcbiAgICAgICAgdGhpcy5vcHRpb25Db21wbGV0aW9ucyhjb21wbGV0aW9ucywgYXJncywgYXJndiwgY3VycmVudCk7XG4gICAgICAgIHRoaXMuY2hvaWNlc0Zyb21PcHRpb25zQ29tcGxldGlvbnMoY29tcGxldGlvbnMsIGFyZ3MsIGFyZ3YsIGN1cnJlbnQpO1xuICAgICAgICB0aGlzLmNob2ljZXNGcm9tUG9zaXRpb25hbHNDb21wbGV0aW9ucyhjb21wbGV0aW9ucywgYXJncywgYXJndiwgY3VycmVudCk7XG4gICAgICAgIGRvbmUobnVsbCwgY29tcGxldGlvbnMpO1xuICAgIH1cbiAgICBjb21tYW5kQ29tcGxldGlvbnMoY29tcGxldGlvbnMsIGFyZ3MsIGN1cnJlbnQpIHtcbiAgICAgICAgY29uc3QgcGFyZW50Q29tbWFuZHMgPSB0aGlzLnlhcmdzXG4gICAgICAgICAgICAuZ2V0SW50ZXJuYWxNZXRob2RzKClcbiAgICAgICAgICAgIC5nZXRDb250ZXh0KCkuY29tbWFuZHM7XG4gICAgICAgIGlmICghY3VycmVudC5tYXRjaCgvXi0vKSAmJlxuICAgICAgICAgICAgcGFyZW50Q29tbWFuZHNbcGFyZW50Q29tbWFuZHMubGVuZ3RoIC0gMV0gIT09IGN1cnJlbnQgJiZcbiAgICAgICAgICAgICF0aGlzLnByZXZpb3VzQXJnSGFzQ2hvaWNlcyhhcmdzKSkge1xuICAgICAgICAgICAgdGhpcy51c2FnZS5nZXRDb21tYW5kcygpLmZvckVhY2godXNhZ2VDb21tYW5kID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb21tYW5kTmFtZSA9IHBhcnNlQ29tbWFuZCh1c2FnZUNvbW1hbmRbMF0pLmNtZDtcbiAgICAgICAgICAgICAgICBpZiAoYXJncy5pbmRleE9mKGNvbW1hbmROYW1lKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnpzaFNoZWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9ucy5wdXNoKGNvbW1hbmROYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlc2MgPSB1c2FnZUNvbW1hbmRbMV0gfHwgJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9ucy5wdXNoKGNvbW1hbmROYW1lLnJlcGxhY2UoLzovZywgJ1xcXFw6JykgKyAnOicgKyBkZXNjKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIG9wdGlvbkNvbXBsZXRpb25zKGNvbXBsZXRpb25zLCBhcmdzLCBhcmd2LCBjdXJyZW50KSB7XG4gICAgICAgIGlmICgoY3VycmVudC5tYXRjaCgvXi0vKSB8fCAoY3VycmVudCA9PT0gJycgJiYgY29tcGxldGlvbnMubGVuZ3RoID09PSAwKSkgJiZcbiAgICAgICAgICAgICF0aGlzLnByZXZpb3VzQXJnSGFzQ2hvaWNlcyhhcmdzKSkge1xuICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMueWFyZ3MuZ2V0T3B0aW9ucygpO1xuICAgICAgICAgICAgY29uc3QgcG9zaXRpb25hbEtleXMgPSB0aGlzLnlhcmdzLmdldEdyb3VwcygpW3RoaXMudXNhZ2UuZ2V0UG9zaXRpb25hbEdyb3VwTmFtZSgpXSB8fCBbXTtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKG9wdGlvbnMua2V5KS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmVnYWJsZSA9ICEhb3B0aW9ucy5jb25maWd1cmF0aW9uWydib29sZWFuLW5lZ2F0aW9uJ10gJiZcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5ib29sZWFuLmluY2x1ZGVzKGtleSk7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNQb3NpdGlvbmFsS2V5ID0gcG9zaXRpb25hbEtleXMuaW5jbHVkZXMoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAoIWlzUG9zaXRpb25hbEtleSAmJlxuICAgICAgICAgICAgICAgICAgICAhb3B0aW9ucy5oaWRkZW5PcHRpb25zLmluY2x1ZGVzKGtleSkgJiZcbiAgICAgICAgICAgICAgICAgICAgIXRoaXMuYXJnc0NvbnRhaW5LZXkoYXJncywga2V5LCBuZWdhYmxlKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBsZXRlT3B0aW9uS2V5KGtleSwgY29tcGxldGlvbnMsIGN1cnJlbnQsIG5lZ2FibGUgJiYgISFvcHRpb25zLmRlZmF1bHRba2V5XSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2hvaWNlc0Zyb21PcHRpb25zQ29tcGxldGlvbnMoY29tcGxldGlvbnMsIGFyZ3MsIGFyZ3YsIGN1cnJlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMucHJldmlvdXNBcmdIYXNDaG9pY2VzKGFyZ3MpKSB7XG4gICAgICAgICAgICBjb25zdCBjaG9pY2VzID0gdGhpcy5nZXRQcmV2aW91c0FyZ0Nob2ljZXMoYXJncyk7XG4gICAgICAgICAgICBpZiAoY2hvaWNlcyAmJiBjaG9pY2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBjb21wbGV0aW9ucy5wdXNoKC4uLmNob2ljZXMubWFwKGMgPT4gYy5yZXBsYWNlKC86L2csICdcXFxcOicpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2hvaWNlc0Zyb21Qb3NpdGlvbmFsc0NvbXBsZXRpb25zKGNvbXBsZXRpb25zLCBhcmdzLCBhcmd2LCBjdXJyZW50KSB7XG4gICAgICAgIGlmIChjdXJyZW50ID09PSAnJyAmJlxuICAgICAgICAgICAgY29tcGxldGlvbnMubGVuZ3RoID4gMCAmJlxuICAgICAgICAgICAgdGhpcy5wcmV2aW91c0FyZ0hhc0Nob2ljZXMoYXJncykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwb3NpdGlvbmFsS2V5cyA9IHRoaXMueWFyZ3MuZ2V0R3JvdXBzKClbdGhpcy51c2FnZS5nZXRQb3NpdGlvbmFsR3JvdXBOYW1lKCldIHx8IFtdO1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBNYXRoLm1heCh0aGlzLmluZGV4QWZ0ZXJMYXN0UmVzZXQsIHRoaXMueWFyZ3MuZ2V0SW50ZXJuYWxNZXRob2RzKCkuZ2V0Q29udGV4dCgpLmNvbW1hbmRzLmxlbmd0aCArXG4gICAgICAgICAgICAxKTtcbiAgICAgICAgY29uc3QgcG9zaXRpb25hbEtleSA9IHBvc2l0aW9uYWxLZXlzW2FyZ3YuXy5sZW5ndGggLSBvZmZzZXQgLSAxXTtcbiAgICAgICAgaWYgKCFwb3NpdGlvbmFsS2V5KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2hvaWNlcyA9IHRoaXMueWFyZ3MuZ2V0T3B0aW9ucygpLmNob2ljZXNbcG9zaXRpb25hbEtleV0gfHwgW107XG4gICAgICAgIGZvciAoY29uc3QgY2hvaWNlIG9mIGNob2ljZXMpIHtcbiAgICAgICAgICAgIGlmIChjaG9pY2Uuc3RhcnRzV2l0aChjdXJyZW50KSkge1xuICAgICAgICAgICAgICAgIGNvbXBsZXRpb25zLnB1c2goY2hvaWNlLnJlcGxhY2UoLzovZywgJ1xcXFw6JykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGdldFByZXZpb3VzQXJnQ2hvaWNlcyhhcmdzKSB7XG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA8IDEpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGxldCBwcmV2aW91c0FyZyA9IGFyZ3NbYXJncy5sZW5ndGggLSAxXTtcbiAgICAgICAgbGV0IGZpbHRlciA9ICcnO1xuICAgICAgICBpZiAoIXByZXZpb3VzQXJnLnN0YXJ0c1dpdGgoJy0nKSAmJiBhcmdzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIGZpbHRlciA9IHByZXZpb3VzQXJnO1xuICAgICAgICAgICAgcHJldmlvdXNBcmcgPSBhcmdzW2FyZ3MubGVuZ3RoIC0gMl07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFwcmV2aW91c0FyZy5zdGFydHNXaXRoKCctJykpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNvbnN0IHByZXZpb3VzQXJnS2V5ID0gcHJldmlvdXNBcmcucmVwbGFjZSgvXi0rLywgJycpO1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy55YXJncy5nZXRPcHRpb25zKCk7XG4gICAgICAgIGNvbnN0IHBvc3NpYmxlQWxpYXNlcyA9IFtcbiAgICAgICAgICAgIHByZXZpb3VzQXJnS2V5LFxuICAgICAgICAgICAgLi4uKHRoaXMueWFyZ3MuZ2V0QWxpYXNlcygpW3ByZXZpb3VzQXJnS2V5XSB8fCBbXSksXG4gICAgICAgIF07XG4gICAgICAgIGxldCBjaG9pY2VzO1xuICAgICAgICBmb3IgKGNvbnN0IHBvc3NpYmxlQWxpYXMgb2YgcG9zc2libGVBbGlhc2VzKSB7XG4gICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9wdGlvbnMua2V5LCBwb3NzaWJsZUFsaWFzKSAmJlxuICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkob3B0aW9ucy5jaG9pY2VzW3Bvc3NpYmxlQWxpYXNdKSkge1xuICAgICAgICAgICAgICAgIGNob2ljZXMgPSBvcHRpb25zLmNob2ljZXNbcG9zc2libGVBbGlhc107XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNob2ljZXMpIHtcbiAgICAgICAgICAgIHJldHVybiBjaG9pY2VzLmZpbHRlcihjaG9pY2UgPT4gIWZpbHRlciB8fCBjaG9pY2Uuc3RhcnRzV2l0aChmaWx0ZXIpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcmV2aW91c0FyZ0hhc0Nob2ljZXMoYXJncykge1xuICAgICAgICBjb25zdCBjaG9pY2VzID0gdGhpcy5nZXRQcmV2aW91c0FyZ0Nob2ljZXMoYXJncyk7XG4gICAgICAgIHJldHVybiBjaG9pY2VzICE9PSB1bmRlZmluZWQgJiYgY2hvaWNlcy5sZW5ndGggPiAwO1xuICAgIH1cbiAgICBhcmdzQ29udGFpbktleShhcmdzLCBrZXksIG5lZ2FibGUpIHtcbiAgICAgICAgY29uc3QgYXJnc0NvbnRhaW5zID0gKHMpID0+IGFyZ3MuaW5kZXhPZigoL15bXjAtOV0kLy50ZXN0KHMpID8gJy0nIDogJy0tJykgKyBzKSAhPT0gLTE7XG4gICAgICAgIGlmIChhcmdzQ29udGFpbnMoa2V5KSlcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAobmVnYWJsZSAmJiBhcmdzQ29udGFpbnMoYG5vLSR7a2V5fWApKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmICh0aGlzLmFsaWFzZXMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgYWxpYXMgb2YgdGhpcy5hbGlhc2VzW2tleV0pIHtcbiAgICAgICAgICAgICAgICBpZiAoYXJnc0NvbnRhaW5zKGFsaWFzKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb21wbGV0ZU9wdGlvbktleShrZXksIGNvbXBsZXRpb25zLCBjdXJyZW50LCBuZWdhYmxlKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZDtcbiAgICAgICAgbGV0IGtleVdpdGhEZXNjID0ga2V5O1xuICAgICAgICBpZiAodGhpcy56c2hTaGVsbCkge1xuICAgICAgICAgICAgY29uc3QgZGVzY3MgPSB0aGlzLnVzYWdlLmdldERlc2NyaXB0aW9ucygpO1xuICAgICAgICAgICAgY29uc3QgYWxpYXNLZXkgPSAoX2IgPSAoX2EgPSB0aGlzID09PSBudWxsIHx8IHRoaXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRoaXMuYWxpYXNlcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hW2tleV0pID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5maW5kKGFsaWFzID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBkZXNjID0gZGVzY3NbYWxpYXNdO1xuICAgICAgICAgICAgICAgIHJldHVybiB0eXBlb2YgZGVzYyA9PT0gJ3N0cmluZycgJiYgZGVzYy5sZW5ndGggPiAwO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBkZXNjRnJvbUFsaWFzID0gYWxpYXNLZXkgPyBkZXNjc1thbGlhc0tleV0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBkZXNjID0gKF9kID0gKF9jID0gZGVzY3Nba2V5XSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogZGVzY0Zyb21BbGlhcykgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogJyc7XG4gICAgICAgICAgICBrZXlXaXRoRGVzYyA9IGAke2tleS5yZXBsYWNlKC86L2csICdcXFxcOicpfToke2Rlc2NcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgnX195YXJnc1N0cmluZ19fOicsICcnKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8oXFxyXFxufFxcbnxcXHIpL2dtLCAnICcpfWA7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3RhcnRzQnlUd29EYXNoZXMgPSAocykgPT4gL14tLS8udGVzdChzKTtcbiAgICAgICAgY29uc3QgaXNTaG9ydE9wdGlvbiA9IChzKSA9PiAvXlteMC05XSQvLnRlc3Qocyk7XG4gICAgICAgIGNvbnN0IGRhc2hlcyA9ICFzdGFydHNCeVR3b0Rhc2hlcyhjdXJyZW50KSAmJiBpc1Nob3J0T3B0aW9uKGtleSkgPyAnLScgOiAnLS0nO1xuICAgICAgICBjb21wbGV0aW9ucy5wdXNoKGRhc2hlcyArIGtleVdpdGhEZXNjKTtcbiAgICAgICAgaWYgKG5lZ2FibGUpIHtcbiAgICAgICAgICAgIGNvbXBsZXRpb25zLnB1c2goZGFzaGVzICsgJ25vLScgKyBrZXlXaXRoRGVzYyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY3VzdG9tQ29tcGxldGlvbihhcmdzLCBhcmd2LCBjdXJyZW50LCBkb25lKSB7XG4gICAgICAgIGFzc2VydE5vdFN0cmljdEVxdWFsKHRoaXMuY3VzdG9tQ29tcGxldGlvbkZ1bmN0aW9uLCBudWxsLCB0aGlzLnNoaW0pO1xuICAgICAgICBpZiAoaXNTeW5jQ29tcGxldGlvbkZ1bmN0aW9uKHRoaXMuY3VzdG9tQ29tcGxldGlvbkZ1bmN0aW9uKSkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5jdXN0b21Db21wbGV0aW9uRnVuY3Rpb24oY3VycmVudCwgYXJndik7XG4gICAgICAgICAgICBpZiAoaXNQcm9taXNlKHJlc3VsdCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICAgICAgICAgICAgICAgIC50aGVuKGxpc3QgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNoaW0ucHJvY2Vzcy5uZXh0VGljaygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb25lKG51bGwsIGxpc3QpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaGltLnByb2Nlc3MubmV4dFRpY2soKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZG9uZShlcnIsIHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGRvbmUobnVsbCwgcmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc0ZhbGxiYWNrQ29tcGxldGlvbkZ1bmN0aW9uKHRoaXMuY3VzdG9tQ29tcGxldGlvbkZ1bmN0aW9uKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3VzdG9tQ29tcGxldGlvbkZ1bmN0aW9uKGN1cnJlbnQsIGFyZ3YsIChvbkNvbXBsZXRlZCA9IGRvbmUpID0+IHRoaXMuZGVmYXVsdENvbXBsZXRpb24oYXJncywgYXJndiwgY3VycmVudCwgb25Db21wbGV0ZWQpLCBjb21wbGV0aW9ucyA9PiB7XG4gICAgICAgICAgICAgICAgZG9uZShudWxsLCBjb21wbGV0aW9ucyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmN1c3RvbUNvbXBsZXRpb25GdW5jdGlvbihjdXJyZW50LCBhcmd2LCBjb21wbGV0aW9ucyA9PiB7XG4gICAgICAgICAgICAgICAgZG9uZShudWxsLCBjb21wbGV0aW9ucyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXRDb21wbGV0aW9uKGFyZ3MsIGRvbmUpIHtcbiAgICAgICAgY29uc3QgY3VycmVudCA9IGFyZ3MubGVuZ3RoID8gYXJnc1thcmdzLmxlbmd0aCAtIDFdIDogJyc7XG4gICAgICAgIGNvbnN0IGFyZ3YgPSB0aGlzLnlhcmdzLnBhcnNlKGFyZ3MsIHRydWUpO1xuICAgICAgICBjb25zdCBjb21wbGV0aW9uRnVuY3Rpb24gPSB0aGlzLmN1c3RvbUNvbXBsZXRpb25GdW5jdGlvblxuICAgICAgICAgICAgPyAoYXJndikgPT4gdGhpcy5jdXN0b21Db21wbGV0aW9uKGFyZ3MsIGFyZ3YsIGN1cnJlbnQsIGRvbmUpXG4gICAgICAgICAgICA6IChhcmd2KSA9PiB0aGlzLmRlZmF1bHRDb21wbGV0aW9uKGFyZ3MsIGFyZ3YsIGN1cnJlbnQsIGRvbmUpO1xuICAgICAgICByZXR1cm4gaXNQcm9taXNlKGFyZ3YpXG4gICAgICAgICAgICA/IGFyZ3YudGhlbihjb21wbGV0aW9uRnVuY3Rpb24pXG4gICAgICAgICAgICA6IGNvbXBsZXRpb25GdW5jdGlvbihhcmd2KTtcbiAgICB9XG4gICAgZ2VuZXJhdGVDb21wbGV0aW9uU2NyaXB0KCQwLCBjbWQpIHtcbiAgICAgICAgbGV0IHNjcmlwdCA9IHRoaXMuenNoU2hlbGxcbiAgICAgICAgICAgID8gdGVtcGxhdGVzLmNvbXBsZXRpb25ac2hUZW1wbGF0ZVxuICAgICAgICAgICAgOiB0ZW1wbGF0ZXMuY29tcGxldGlvblNoVGVtcGxhdGU7XG4gICAgICAgIGNvbnN0IG5hbWUgPSB0aGlzLnNoaW0ucGF0aC5iYXNlbmFtZSgkMCk7XG4gICAgICAgIGlmICgkMC5tYXRjaCgvXFwuanMkLykpXG4gICAgICAgICAgICAkMCA9IGAuLyR7JDB9YDtcbiAgICAgICAgc2NyaXB0ID0gc2NyaXB0LnJlcGxhY2UoL3t7YXBwX25hbWV9fS9nLCBuYW1lKTtcbiAgICAgICAgc2NyaXB0ID0gc2NyaXB0LnJlcGxhY2UoL3t7Y29tcGxldGlvbl9jb21tYW5kfX0vZywgY21kKTtcbiAgICAgICAgcmV0dXJuIHNjcmlwdC5yZXBsYWNlKC97e2FwcF9wYXRofX0vZywgJDApO1xuICAgIH1cbiAgICByZWdpc3RlckZ1bmN0aW9uKGZuKSB7XG4gICAgICAgIHRoaXMuY3VzdG9tQ29tcGxldGlvbkZ1bmN0aW9uID0gZm47XG4gICAgfVxuICAgIHNldFBhcnNlZChwYXJzZWQpIHtcbiAgICAgICAgdGhpcy5hbGlhc2VzID0gcGFyc2VkLmFsaWFzZXM7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBsZXRpb24oeWFyZ3MsIHVzYWdlLCBjb21tYW5kLCBzaGltKSB7XG4gICAgcmV0dXJuIG5ldyBDb21wbGV0aW9uKHlhcmdzLCB1c2FnZSwgY29tbWFuZCwgc2hpbSk7XG59XG5mdW5jdGlvbiBpc1N5bmNDb21wbGV0aW9uRnVuY3Rpb24oY29tcGxldGlvbkZ1bmN0aW9uKSB7XG4gICAgcmV0dXJuIGNvbXBsZXRpb25GdW5jdGlvbi5sZW5ndGggPCAzO1xufVxuZnVuY3Rpb24gaXNGYWxsYmFja0NvbXBsZXRpb25GdW5jdGlvbihjb21wbGV0aW9uRnVuY3Rpb24pIHtcbiAgICByZXR1cm4gY29tcGxldGlvbkZ1bmN0aW9uLmxlbmd0aCA+IDM7XG59XG4iLCJleHBvcnQgY29uc3QgY29tcGxldGlvblNoVGVtcGxhdGUgPSBgIyMjLWJlZ2luLXt7YXBwX25hbWV9fS1jb21wbGV0aW9ucy0jIyNcbiNcbiMgeWFyZ3MgY29tbWFuZCBjb21wbGV0aW9uIHNjcmlwdFxuI1xuIyBJbnN0YWxsYXRpb246IHt7YXBwX3BhdGh9fSB7e2NvbXBsZXRpb25fY29tbWFuZH19ID4+IH4vLmJhc2hyY1xuIyAgICBvciB7e2FwcF9wYXRofX0ge3tjb21wbGV0aW9uX2NvbW1hbmR9fSA+PiB+Ly5iYXNoX3Byb2ZpbGUgb24gT1NYLlxuI1xuX3t7YXBwX25hbWV9fV95YXJnc19jb21wbGV0aW9ucygpXG57XG4gICAgbG9jYWwgY3VyX3dvcmQgYXJncyB0eXBlX2xpc3RcblxuICAgIGN1cl93b3JkPVwiXFwke0NPTVBfV09SRFNbQ09NUF9DV09SRF19XCJcbiAgICBhcmdzPShcIlxcJHtDT01QX1dPUkRTW0BdfVwiKVxuXG4gICAgIyBhc2sgeWFyZ3MgdG8gZ2VuZXJhdGUgY29tcGxldGlvbnMuXG4gICAgdHlwZV9saXN0PSQoe3thcHBfcGF0aH19IC0tZ2V0LXlhcmdzLWNvbXBsZXRpb25zIFwiXFwke2FyZ3NbQF19XCIpXG5cbiAgICBDT01QUkVQTFk9KCAkKGNvbXBnZW4gLVcgXCJcXCR7dHlwZV9saXN0fVwiIC0tIFxcJHtjdXJfd29yZH0pIClcblxuICAgICMgaWYgbm8gbWF0Y2ggd2FzIGZvdW5kLCBmYWxsIGJhY2sgdG8gZmlsZW5hbWUgY29tcGxldGlvblxuICAgIGlmIFsgXFwkeyNDT01QUkVQTFlbQF19IC1lcSAwIF07IHRoZW5cbiAgICAgIENPTVBSRVBMWT0oKVxuICAgIGZpXG5cbiAgICByZXR1cm4gMFxufVxuY29tcGxldGUgLW8gYmFzaGRlZmF1bHQgLW8gZGVmYXVsdCAtRiBfe3thcHBfbmFtZX19X3lhcmdzX2NvbXBsZXRpb25zIHt7YXBwX25hbWV9fVxuIyMjLWVuZC17e2FwcF9uYW1lfX0tY29tcGxldGlvbnMtIyMjXG5gO1xuZXhwb3J0IGNvbnN0IGNvbXBsZXRpb25ac2hUZW1wbGF0ZSA9IGAjY29tcGRlZiB7e2FwcF9uYW1lfX1cbiMjIy1iZWdpbi17e2FwcF9uYW1lfX0tY29tcGxldGlvbnMtIyMjXG4jXG4jIHlhcmdzIGNvbW1hbmQgY29tcGxldGlvbiBzY3JpcHRcbiNcbiMgSW5zdGFsbGF0aW9uOiB7e2FwcF9wYXRofX0ge3tjb21wbGV0aW9uX2NvbW1hbmR9fSA+PiB+Ly56c2hyY1xuIyAgICBvciB7e2FwcF9wYXRofX0ge3tjb21wbGV0aW9uX2NvbW1hbmR9fSA+PiB+Ly56cHJvZmlsZSBvbiBPU1guXG4jXG5fe3thcHBfbmFtZX19X3lhcmdzX2NvbXBsZXRpb25zKClcbntcbiAgbG9jYWwgcmVwbHlcbiAgbG9jYWwgc2k9JElGU1xuICBJRlM9JCdcXG4nIHJlcGx5PSgkKENPTVBfQ1dPUkQ9XCIkKChDVVJSRU5ULTEpKVwiIENPTVBfTElORT1cIiRCVUZGRVJcIiBDT01QX1BPSU5UPVwiJENVUlNPUlwiIHt7YXBwX3BhdGh9fSAtLWdldC15YXJncy1jb21wbGV0aW9ucyBcIlxcJHt3b3Jkc1tAXX1cIikpXG4gIElGUz0kc2lcbiAgX2Rlc2NyaWJlICd2YWx1ZXMnIHJlcGx5XG59XG5jb21wZGVmIF97e2FwcF9uYW1lfX1feWFyZ3NfY29tcGxldGlvbnMge3thcHBfbmFtZX19XG4jIyMtZW5kLXt7YXBwX25hbWV9fS1jb21wbGV0aW9ucy0jIyNcbmA7XG4iLCJleHBvcnQgZnVuY3Rpb24gbGV2ZW5zaHRlaW4oYSwgYikge1xuICAgIGlmIChhLmxlbmd0aCA9PT0gMClcbiAgICAgICAgcmV0dXJuIGIubGVuZ3RoO1xuICAgIGlmIChiLmxlbmd0aCA9PT0gMClcbiAgICAgICAgcmV0dXJuIGEubGVuZ3RoO1xuICAgIGNvbnN0IG1hdHJpeCA9IFtdO1xuICAgIGxldCBpO1xuICAgIGZvciAoaSA9IDA7IGkgPD0gYi5sZW5ndGg7IGkrKykge1xuICAgICAgICBtYXRyaXhbaV0gPSBbaV07XG4gICAgfVxuICAgIGxldCBqO1xuICAgIGZvciAoaiA9IDA7IGogPD0gYS5sZW5ndGg7IGorKykge1xuICAgICAgICBtYXRyaXhbMF1bal0gPSBqO1xuICAgIH1cbiAgICBmb3IgKGkgPSAxOyBpIDw9IGIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZm9yIChqID0gMTsgaiA8PSBhLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBpZiAoYi5jaGFyQXQoaSAtIDEpID09PSBhLmNoYXJBdChqIC0gMSkpIHtcbiAgICAgICAgICAgICAgICBtYXRyaXhbaV1bal0gPSBtYXRyaXhbaSAtIDFdW2ogLSAxXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChpID4gMSAmJlxuICAgICAgICAgICAgICAgICAgICBqID4gMSAmJlxuICAgICAgICAgICAgICAgICAgICBiLmNoYXJBdChpIC0gMikgPT09IGEuY2hhckF0KGogLSAxKSAmJlxuICAgICAgICAgICAgICAgICAgICBiLmNoYXJBdChpIC0gMSkgPT09IGEuY2hhckF0KGogLSAyKSkge1xuICAgICAgICAgICAgICAgICAgICBtYXRyaXhbaV1bal0gPSBtYXRyaXhbaSAtIDJdW2ogLSAyXSArIDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBtYXRyaXhbaV1bal0gPSBNYXRoLm1pbihtYXRyaXhbaSAtIDFdW2ogLSAxXSArIDEsIE1hdGgubWluKG1hdHJpeFtpXVtqIC0gMV0gKyAxLCBtYXRyaXhbaSAtIDFdW2pdICsgMSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWF0cml4W2IubGVuZ3RoXVthLmxlbmd0aF07XG59XG4iLCJpbXBvcnQgeyBhcmdzZXJ0IH0gZnJvbSAnLi9hcmdzZXJ0LmpzJztcbmltcG9ydCB7IGFzc2VydE5vdFN0cmljdEVxdWFsLCB9IGZyb20gJy4vdHlwaW5ncy9jb21tb24tdHlwZXMuanMnO1xuaW1wb3J0IHsgbGV2ZW5zaHRlaW4gYXMgZGlzdGFuY2UgfSBmcm9tICcuL3V0aWxzL2xldmVuc2h0ZWluLmpzJztcbmltcG9ydCB7IG9iakZpbHRlciB9IGZyb20gJy4vdXRpbHMvb2JqLWZpbHRlci5qcyc7XG5jb25zdCBzcGVjaWFsS2V5cyA9IFsnJDAnLCAnLS0nLCAnXyddO1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRpb24oeWFyZ3MsIHVzYWdlLCBzaGltKSB7XG4gICAgY29uc3QgX18gPSBzaGltLnkxOG4uX187XG4gICAgY29uc3QgX19uID0gc2hpbS55MThuLl9fbjtcbiAgICBjb25zdCBzZWxmID0ge307XG4gICAgc2VsZi5ub25PcHRpb25Db3VudCA9IGZ1bmN0aW9uIG5vbk9wdGlvbkNvdW50KGFyZ3YpIHtcbiAgICAgICAgY29uc3QgZGVtYW5kZWRDb21tYW5kcyA9IHlhcmdzLmdldERlbWFuZGVkQ29tbWFuZHMoKTtcbiAgICAgICAgY29uc3QgcG9zaXRpb25hbENvdW50ID0gYXJndi5fLmxlbmd0aCArIChhcmd2WyctLSddID8gYXJndlsnLS0nXS5sZW5ndGggOiAwKTtcbiAgICAgICAgY29uc3QgX3MgPSBwb3NpdGlvbmFsQ291bnQgLSB5YXJncy5nZXRJbnRlcm5hbE1ldGhvZHMoKS5nZXRDb250ZXh0KCkuY29tbWFuZHMubGVuZ3RoO1xuICAgICAgICBpZiAoZGVtYW5kZWRDb21tYW5kcy5fICYmXG4gICAgICAgICAgICAoX3MgPCBkZW1hbmRlZENvbW1hbmRzLl8ubWluIHx8IF9zID4gZGVtYW5kZWRDb21tYW5kcy5fLm1heCkpIHtcbiAgICAgICAgICAgIGlmIChfcyA8IGRlbWFuZGVkQ29tbWFuZHMuXy5taW4pIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVtYW5kZWRDb21tYW5kcy5fLm1pbk1zZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHVzYWdlLmZhaWwoZGVtYW5kZWRDb21tYW5kcy5fLm1pbk1zZ1xuICAgICAgICAgICAgICAgICAgICAgICAgPyBkZW1hbmRlZENvbW1hbmRzLl8ubWluTXNnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcJDAvZywgX3MudG9TdHJpbmcoKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFwkMS8sIGRlbWFuZGVkQ29tbWFuZHMuXy5taW4udG9TdHJpbmcoKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB1c2FnZS5mYWlsKF9fbignTm90IGVub3VnaCBub24tb3B0aW9uIGFyZ3VtZW50czogZ290ICVzLCBuZWVkIGF0IGxlYXN0ICVzJywgJ05vdCBlbm91Z2ggbm9uLW9wdGlvbiBhcmd1bWVudHM6IGdvdCAlcywgbmVlZCBhdCBsZWFzdCAlcycsIF9zLCBfcy50b1N0cmluZygpLCBkZW1hbmRlZENvbW1hbmRzLl8ubWluLnRvU3RyaW5nKCkpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChfcyA+IGRlbWFuZGVkQ29tbWFuZHMuXy5tYXgpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVtYW5kZWRDb21tYW5kcy5fLm1heE1zZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHVzYWdlLmZhaWwoZGVtYW5kZWRDb21tYW5kcy5fLm1heE1zZ1xuICAgICAgICAgICAgICAgICAgICAgICAgPyBkZW1hbmRlZENvbW1hbmRzLl8ubWF4TXNnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcJDAvZywgX3MudG9TdHJpbmcoKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFwkMS8sIGRlbWFuZGVkQ29tbWFuZHMuXy5tYXgudG9TdHJpbmcoKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB1c2FnZS5mYWlsKF9fbignVG9vIG1hbnkgbm9uLW9wdGlvbiBhcmd1bWVudHM6IGdvdCAlcywgbWF4aW11bSBvZiAlcycsICdUb28gbWFueSBub24tb3B0aW9uIGFyZ3VtZW50czogZ290ICVzLCBtYXhpbXVtIG9mICVzJywgX3MsIF9zLnRvU3RyaW5nKCksIGRlbWFuZGVkQ29tbWFuZHMuXy5tYXgudG9TdHJpbmcoKSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgc2VsZi5wb3NpdGlvbmFsQ291bnQgPSBmdW5jdGlvbiBwb3NpdGlvbmFsQ291bnQocmVxdWlyZWQsIG9ic2VydmVkKSB7XG4gICAgICAgIGlmIChvYnNlcnZlZCA8IHJlcXVpcmVkKSB7XG4gICAgICAgICAgICB1c2FnZS5mYWlsKF9fbignTm90IGVub3VnaCBub24tb3B0aW9uIGFyZ3VtZW50czogZ290ICVzLCBuZWVkIGF0IGxlYXN0ICVzJywgJ05vdCBlbm91Z2ggbm9uLW9wdGlvbiBhcmd1bWVudHM6IGdvdCAlcywgbmVlZCBhdCBsZWFzdCAlcycsIG9ic2VydmVkLCBvYnNlcnZlZCArICcnLCByZXF1aXJlZCArICcnKSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHNlbGYucmVxdWlyZWRBcmd1bWVudHMgPSBmdW5jdGlvbiByZXF1aXJlZEFyZ3VtZW50cyhhcmd2LCBkZW1hbmRlZE9wdGlvbnMpIHtcbiAgICAgICAgbGV0IG1pc3NpbmcgPSBudWxsO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhkZW1hbmRlZE9wdGlvbnMpKSB7XG4gICAgICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhcmd2LCBrZXkpIHx8XG4gICAgICAgICAgICAgICAgdHlwZW9mIGFyZ3Zba2V5XSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBtaXNzaW5nID0gbWlzc2luZyB8fCB7fTtcbiAgICAgICAgICAgICAgICBtaXNzaW5nW2tleV0gPSBkZW1hbmRlZE9wdGlvbnNba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobWlzc2luZykge1xuICAgICAgICAgICAgY29uc3QgY3VzdG9tTXNncyA9IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMobWlzc2luZykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtc2cgPSBtaXNzaW5nW2tleV07XG4gICAgICAgICAgICAgICAgaWYgKG1zZyAmJiBjdXN0b21Nc2dzLmluZGV4T2YobXNnKSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY3VzdG9tTXNncy5wdXNoKG1zZyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgY3VzdG9tTXNnID0gY3VzdG9tTXNncy5sZW5ndGggPyBgXFxuJHtjdXN0b21Nc2dzLmpvaW4oJ1xcbicpfWAgOiAnJztcbiAgICAgICAgICAgIHVzYWdlLmZhaWwoX19uKCdNaXNzaW5nIHJlcXVpcmVkIGFyZ3VtZW50OiAlcycsICdNaXNzaW5nIHJlcXVpcmVkIGFyZ3VtZW50czogJXMnLCBPYmplY3Qua2V5cyhtaXNzaW5nKS5sZW5ndGgsIE9iamVjdC5rZXlzKG1pc3NpbmcpLmpvaW4oJywgJykgKyBjdXN0b21Nc2cpKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgc2VsZi51bmtub3duQXJndW1lbnRzID0gZnVuY3Rpb24gdW5rbm93bkFyZ3VtZW50cyhhcmd2LCBhbGlhc2VzLCBwb3NpdGlvbmFsTWFwLCBpc0RlZmF1bHRDb21tYW5kLCBjaGVja1Bvc2l0aW9uYWxzID0gdHJ1ZSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IGNvbW1hbmRLZXlzID0geWFyZ3NcbiAgICAgICAgICAgIC5nZXRJbnRlcm5hbE1ldGhvZHMoKVxuICAgICAgICAgICAgLmdldENvbW1hbmRJbnN0YW5jZSgpXG4gICAgICAgICAgICAuZ2V0Q29tbWFuZHMoKTtcbiAgICAgICAgY29uc3QgdW5rbm93biA9IFtdO1xuICAgICAgICBjb25zdCBjdXJyZW50Q29udGV4dCA9IHlhcmdzLmdldEludGVybmFsTWV0aG9kcygpLmdldENvbnRleHQoKTtcbiAgICAgICAgT2JqZWN0LmtleXMoYXJndikuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgaWYgKCFzcGVjaWFsS2V5cy5pbmNsdWRlcyhrZXkpICYmXG4gICAgICAgICAgICAgICAgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChwb3NpdGlvbmFsTWFwLCBrZXkpICYmXG4gICAgICAgICAgICAgICAgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh5YXJncy5nZXRJbnRlcm5hbE1ldGhvZHMoKS5nZXRQYXJzZUNvbnRleHQoKSwga2V5KSAmJlxuICAgICAgICAgICAgICAgICFzZWxmLmlzVmFsaWRBbmRTb21lQWxpYXNJc05vdE5ldyhrZXksIGFsaWFzZXMpKSB7XG4gICAgICAgICAgICAgICAgdW5rbm93bi5wdXNoKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoY2hlY2tQb3NpdGlvbmFscyAmJlxuICAgICAgICAgICAgKGN1cnJlbnRDb250ZXh0LmNvbW1hbmRzLmxlbmd0aCA+IDAgfHxcbiAgICAgICAgICAgICAgICBjb21tYW5kS2V5cy5sZW5ndGggPiAwIHx8XG4gICAgICAgICAgICAgICAgaXNEZWZhdWx0Q29tbWFuZCkpIHtcbiAgICAgICAgICAgIGFyZ3YuXy5zbGljZShjdXJyZW50Q29udGV4dC5jb21tYW5kcy5sZW5ndGgpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWNvbW1hbmRLZXlzLmluY2x1ZGVzKCcnICsga2V5KSkge1xuICAgICAgICAgICAgICAgICAgICB1bmtub3duLnB1c2goJycgKyBrZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGVja1Bvc2l0aW9uYWxzKSB7XG4gICAgICAgICAgICBjb25zdCBkZW1hbmRlZENvbW1hbmRzID0geWFyZ3MuZ2V0RGVtYW5kZWRDb21tYW5kcygpO1xuICAgICAgICAgICAgY29uc3QgbWF4Tm9uT3B0RGVtYW5kZWQgPSAoKF9hID0gZGVtYW5kZWRDb21tYW5kcy5fKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubWF4KSB8fCAwO1xuICAgICAgICAgICAgY29uc3QgZXhwZWN0ZWQgPSBjdXJyZW50Q29udGV4dC5jb21tYW5kcy5sZW5ndGggKyBtYXhOb25PcHREZW1hbmRlZDtcbiAgICAgICAgICAgIGlmIChleHBlY3RlZCA8IGFyZ3YuXy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBhcmd2Ll8uc2xpY2UoZXhwZWN0ZWQpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgICAgICAgICAga2V5ID0gU3RyaW5nKGtleSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY3VycmVudENvbnRleHQuY29tbWFuZHMuaW5jbHVkZXMoa2V5KSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgIXVua25vd24uaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdW5rbm93bi5wdXNoKGtleSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodW5rbm93bi5sZW5ndGgpIHtcbiAgICAgICAgICAgIHVzYWdlLmZhaWwoX19uKCdVbmtub3duIGFyZ3VtZW50OiAlcycsICdVbmtub3duIGFyZ3VtZW50czogJXMnLCB1bmtub3duLmxlbmd0aCwgdW5rbm93bi5tYXAocyA9PiAocy50cmltKCkgPyBzIDogYFwiJHtzfVwiYCkpLmpvaW4oJywgJykpKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgc2VsZi51bmtub3duQ29tbWFuZHMgPSBmdW5jdGlvbiB1bmtub3duQ29tbWFuZHMoYXJndikge1xuICAgICAgICBjb25zdCBjb21tYW5kS2V5cyA9IHlhcmdzXG4gICAgICAgICAgICAuZ2V0SW50ZXJuYWxNZXRob2RzKClcbiAgICAgICAgICAgIC5nZXRDb21tYW5kSW5zdGFuY2UoKVxuICAgICAgICAgICAgLmdldENvbW1hbmRzKCk7XG4gICAgICAgIGNvbnN0IHVua25vd24gPSBbXTtcbiAgICAgICAgY29uc3QgY3VycmVudENvbnRleHQgPSB5YXJncy5nZXRJbnRlcm5hbE1ldGhvZHMoKS5nZXRDb250ZXh0KCk7XG4gICAgICAgIGlmIChjdXJyZW50Q29udGV4dC5jb21tYW5kcy5sZW5ndGggPiAwIHx8IGNvbW1hbmRLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGFyZ3YuXy5zbGljZShjdXJyZW50Q29udGV4dC5jb21tYW5kcy5sZW5ndGgpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWNvbW1hbmRLZXlzLmluY2x1ZGVzKCcnICsga2V5KSkge1xuICAgICAgICAgICAgICAgICAgICB1bmtub3duLnB1c2goJycgKyBrZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1bmtub3duLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHVzYWdlLmZhaWwoX19uKCdVbmtub3duIGNvbW1hbmQ6ICVzJywgJ1Vua25vd24gY29tbWFuZHM6ICVzJywgdW5rbm93bi5sZW5ndGgsIHVua25vd24uam9pbignLCAnKSkpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHNlbGYuaXNWYWxpZEFuZFNvbWVBbGlhc0lzTm90TmV3ID0gZnVuY3Rpb24gaXNWYWxpZEFuZFNvbWVBbGlhc0lzTm90TmV3KGtleSwgYWxpYXNlcykge1xuICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhbGlhc2VzLCBrZXkpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmV3QWxpYXNlcyA9IHlhcmdzLnBhcnNlZC5uZXdBbGlhc2VzO1xuICAgICAgICByZXR1cm4gW2tleSwgLi4uYWxpYXNlc1trZXldXS5zb21lKGEgPT4gIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuZXdBbGlhc2VzLCBhKSB8fCAhbmV3QWxpYXNlc1trZXldKTtcbiAgICB9O1xuICAgIHNlbGYubGltaXRlZENob2ljZXMgPSBmdW5jdGlvbiBsaW1pdGVkQ2hvaWNlcyhhcmd2KSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB5YXJncy5nZXRPcHRpb25zKCk7XG4gICAgICAgIGNvbnN0IGludmFsaWQgPSB7fTtcbiAgICAgICAgaWYgKCFPYmplY3Qua2V5cyhvcHRpb25zLmNob2ljZXMpLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgT2JqZWN0LmtleXMoYXJndikuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgaWYgKHNwZWNpYWxLZXlzLmluZGV4T2Yoa2V5KSA9PT0gLTEgJiZcbiAgICAgICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob3B0aW9ucy5jaG9pY2VzLCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgW10uY29uY2F0KGFyZ3Zba2V5XSkuZm9yRWFjaCh2YWx1ZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmNob2ljZXNba2V5XS5pbmRleE9mKHZhbHVlKSA9PT0gLTEgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRba2V5XSA9IChpbnZhbGlkW2tleV0gfHwgW10pLmNvbmNhdCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGludmFsaWRLZXlzID0gT2JqZWN0LmtleXMoaW52YWxpZCk7XG4gICAgICAgIGlmICghaW52YWxpZEtleXMubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBsZXQgbXNnID0gX18oJ0ludmFsaWQgdmFsdWVzOicpO1xuICAgICAgICBpbnZhbGlkS2V5cy5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICBtc2cgKz0gYFxcbiAgJHtfXygnQXJndW1lbnQ6ICVzLCBHaXZlbjogJXMsIENob2ljZXM6ICVzJywga2V5LCB1c2FnZS5zdHJpbmdpZmllZFZhbHVlcyhpbnZhbGlkW2tleV0pLCB1c2FnZS5zdHJpbmdpZmllZFZhbHVlcyhvcHRpb25zLmNob2ljZXNba2V5XSkpfWA7XG4gICAgICAgIH0pO1xuICAgICAgICB1c2FnZS5mYWlsKG1zZyk7XG4gICAgfTtcbiAgICBsZXQgaW1wbGllZCA9IHt9O1xuICAgIHNlbGYuaW1wbGllcyA9IGZ1bmN0aW9uIGltcGxpZXMoa2V5LCB2YWx1ZSkge1xuICAgICAgICBhcmdzZXJ0KCc8c3RyaW5nfG9iamVjdD4gW2FycmF5fG51bWJlcnxzdHJpbmddJywgW2tleSwgdmFsdWVdLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgaWYgKHR5cGVvZiBrZXkgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhrZXkpLmZvckVhY2goayA9PiB7XG4gICAgICAgICAgICAgICAgc2VsZi5pbXBsaWVzKGssIGtleVtrXSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHlhcmdzLmdsb2JhbChrZXkpO1xuICAgICAgICAgICAgaWYgKCFpbXBsaWVkW2tleV0pIHtcbiAgICAgICAgICAgICAgICBpbXBsaWVkW2tleV0gPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHZhbHVlLmZvckVhY2goaSA9PiBzZWxmLmltcGxpZXMoa2V5LCBpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBhc3NlcnROb3RTdHJpY3RFcXVhbCh2YWx1ZSwgdW5kZWZpbmVkLCBzaGltKTtcbiAgICAgICAgICAgICAgICBpbXBsaWVkW2tleV0ucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHNlbGYuZ2V0SW1wbGllZCA9IGZ1bmN0aW9uIGdldEltcGxpZWQoKSB7XG4gICAgICAgIHJldHVybiBpbXBsaWVkO1xuICAgIH07XG4gICAgZnVuY3Rpb24ga2V5RXhpc3RzKGFyZ3YsIHZhbCkge1xuICAgICAgICBjb25zdCBudW0gPSBOdW1iZXIodmFsKTtcbiAgICAgICAgdmFsID0gaXNOYU4obnVtKSA/IHZhbCA6IG51bTtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICB2YWwgPSBhcmd2Ll8ubGVuZ3RoID49IHZhbDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh2YWwubWF0Y2goL14tLW5vLS4rLykpIHtcbiAgICAgICAgICAgIHZhbCA9IHZhbC5tYXRjaCgvXi0tbm8tKC4rKS8pWzFdO1xuICAgICAgICAgICAgdmFsID0gIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhcmd2LCB2YWwpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFsID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGFyZ3YsIHZhbCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICB9XG4gICAgc2VsZi5pbXBsaWNhdGlvbnMgPSBmdW5jdGlvbiBpbXBsaWNhdGlvbnMoYXJndikge1xuICAgICAgICBjb25zdCBpbXBseUZhaWwgPSBbXTtcbiAgICAgICAgT2JqZWN0LmtleXMoaW1wbGllZCkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb3JpZ0tleSA9IGtleTtcbiAgICAgICAgICAgIChpbXBsaWVkW2tleV0gfHwgW10pLmZvckVhY2godmFsdWUgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBrZXkgPSBvcmlnS2V5O1xuICAgICAgICAgICAgICAgIGNvbnN0IG9yaWdWYWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIGtleSA9IGtleUV4aXN0cyhhcmd2LCBrZXkpO1xuICAgICAgICAgICAgICAgIHZhbHVlID0ga2V5RXhpc3RzKGFyZ3YsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBpZiAoa2V5ICYmICF2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBpbXBseUZhaWwucHVzaChgICR7b3JpZ0tleX0gLT4gJHtvcmlnVmFsdWV9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoaW1wbHlGYWlsLmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IG1zZyA9IGAke19fKCdJbXBsaWNhdGlvbnMgZmFpbGVkOicpfVxcbmA7XG4gICAgICAgICAgICBpbXBseUZhaWwuZm9yRWFjaCh2YWx1ZSA9PiB7XG4gICAgICAgICAgICAgICAgbXNnICs9IHZhbHVlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB1c2FnZS5mYWlsKG1zZyk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGxldCBjb25mbGljdGluZyA9IHt9O1xuICAgIHNlbGYuY29uZmxpY3RzID0gZnVuY3Rpb24gY29uZmxpY3RzKGtleSwgdmFsdWUpIHtcbiAgICAgICAgYXJnc2VydCgnPHN0cmluZ3xvYmplY3Q+IFthcnJheXxzdHJpbmddJywgW2tleSwgdmFsdWVdLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgaWYgKHR5cGVvZiBrZXkgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhrZXkpLmZvckVhY2goayA9PiB7XG4gICAgICAgICAgICAgICAgc2VsZi5jb25mbGljdHMoaywga2V5W2tdKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgeWFyZ3MuZ2xvYmFsKGtleSk7XG4gICAgICAgICAgICBpZiAoIWNvbmZsaWN0aW5nW2tleV0pIHtcbiAgICAgICAgICAgICAgICBjb25mbGljdGluZ1trZXldID0gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZS5mb3JFYWNoKGkgPT4gc2VsZi5jb25mbGljdHMoa2V5LCBpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25mbGljdGluZ1trZXldLnB1c2godmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBzZWxmLmdldENvbmZsaWN0aW5nID0gKCkgPT4gY29uZmxpY3Rpbmc7XG4gICAgc2VsZi5jb25mbGljdGluZyA9IGZ1bmN0aW9uIGNvbmZsaWN0aW5nRm4oYXJndikge1xuICAgICAgICBPYmplY3Qua2V5cyhhcmd2KS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICBpZiAoY29uZmxpY3Rpbmdba2V5XSkge1xuICAgICAgICAgICAgICAgIGNvbmZsaWN0aW5nW2tleV0uZm9yRWFjaCh2YWx1ZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAmJiBhcmd2W2tleV0gIT09IHVuZGVmaW5lZCAmJiBhcmd2W3ZhbHVlXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1c2FnZS5mYWlsKF9fKCdBcmd1bWVudHMgJXMgYW5kICVzIGFyZSBtdXR1YWxseSBleGNsdXNpdmUnLCBrZXksIHZhbHVlKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh5YXJncy5nZXRJbnRlcm5hbE1ldGhvZHMoKS5nZXRQYXJzZXJDb25maWd1cmF0aW9uKClbJ3N0cmlwLWRhc2hlZCddKSB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhjb25mbGljdGluZykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbmZsaWN0aW5nW2tleV0uZm9yRWFjaCh2YWx1ZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJndltzaGltLlBhcnNlci5jYW1lbENhc2Uoa2V5KV0gIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJndltzaGltLlBhcnNlci5jYW1lbENhc2UodmFsdWUpXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1c2FnZS5mYWlsKF9fKCdBcmd1bWVudHMgJXMgYW5kICVzIGFyZSBtdXR1YWxseSBleGNsdXNpdmUnLCBrZXksIHZhbHVlKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBzZWxmLnJlY29tbWVuZENvbW1hbmRzID0gZnVuY3Rpb24gcmVjb21tZW5kQ29tbWFuZHMoY21kLCBwb3RlbnRpYWxDb21tYW5kcykge1xuICAgICAgICBjb25zdCB0aHJlc2hvbGQgPSAzO1xuICAgICAgICBwb3RlbnRpYWxDb21tYW5kcyA9IHBvdGVudGlhbENvbW1hbmRzLnNvcnQoKGEsIGIpID0+IGIubGVuZ3RoIC0gYS5sZW5ndGgpO1xuICAgICAgICBsZXQgcmVjb21tZW5kZWQgPSBudWxsO1xuICAgICAgICBsZXQgYmVzdERpc3RhbmNlID0gSW5maW5pdHk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBjYW5kaWRhdGU7IChjYW5kaWRhdGUgPSBwb3RlbnRpYWxDb21tYW5kc1tpXSkgIT09IHVuZGVmaW5lZDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBkID0gZGlzdGFuY2UoY21kLCBjYW5kaWRhdGUpO1xuICAgICAgICAgICAgaWYgKGQgPD0gdGhyZXNob2xkICYmIGQgPCBiZXN0RGlzdGFuY2UpIHtcbiAgICAgICAgICAgICAgICBiZXN0RGlzdGFuY2UgPSBkO1xuICAgICAgICAgICAgICAgIHJlY29tbWVuZGVkID0gY2FuZGlkYXRlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChyZWNvbW1lbmRlZClcbiAgICAgICAgICAgIHVzYWdlLmZhaWwoX18oJ0RpZCB5b3UgbWVhbiAlcz8nLCByZWNvbW1lbmRlZCkpO1xuICAgIH07XG4gICAgc2VsZi5yZXNldCA9IGZ1bmN0aW9uIHJlc2V0KGxvY2FsTG9va3VwKSB7XG4gICAgICAgIGltcGxpZWQgPSBvYmpGaWx0ZXIoaW1wbGllZCwgayA9PiAhbG9jYWxMb29rdXBba10pO1xuICAgICAgICBjb25mbGljdGluZyA9IG9iakZpbHRlcihjb25mbGljdGluZywgayA9PiAhbG9jYWxMb29rdXBba10pO1xuICAgICAgICByZXR1cm4gc2VsZjtcbiAgICB9O1xuICAgIGNvbnN0IGZyb3plbnMgPSBbXTtcbiAgICBzZWxmLmZyZWV6ZSA9IGZ1bmN0aW9uIGZyZWV6ZSgpIHtcbiAgICAgICAgZnJvemVucy5wdXNoKHtcbiAgICAgICAgICAgIGltcGxpZWQsXG4gICAgICAgICAgICBjb25mbGljdGluZyxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBzZWxmLnVuZnJlZXplID0gZnVuY3Rpb24gdW5mcmVlemUoKSB7XG4gICAgICAgIGNvbnN0IGZyb3plbiA9IGZyb3plbnMucG9wKCk7XG4gICAgICAgIGFzc2VydE5vdFN0cmljdEVxdWFsKGZyb3plbiwgdW5kZWZpbmVkLCBzaGltKTtcbiAgICAgICAgKHsgaW1wbGllZCwgY29uZmxpY3RpbmcgfSA9IGZyb3plbik7XG4gICAgfTtcbiAgICByZXR1cm4gc2VsZjtcbn1cbiIsImltcG9ydCB7IFlFcnJvciB9IGZyb20gJy4uL3llcnJvci5qcyc7XG5sZXQgcHJldmlvdXNseVZpc2l0ZWRDb25maWdzID0gW107XG5sZXQgc2hpbTtcbmV4cG9ydCBmdW5jdGlvbiBhcHBseUV4dGVuZHMoY29uZmlnLCBjd2QsIG1lcmdlRXh0ZW5kcywgX3NoaW0pIHtcbiAgICBzaGltID0gX3NoaW07XG4gICAgbGV0IGRlZmF1bHRDb25maWcgPSB7fTtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgJ2V4dGVuZHMnKSkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5leHRlbmRzICE9PSAnc3RyaW5nJylcbiAgICAgICAgICAgIHJldHVybiBkZWZhdWx0Q29uZmlnO1xuICAgICAgICBjb25zdCBpc1BhdGggPSAvXFwuanNvbnxcXC4uKnJjJC8udGVzdChjb25maWcuZXh0ZW5kcyk7XG4gICAgICAgIGxldCBwYXRoVG9EZWZhdWx0ID0gbnVsbDtcbiAgICAgICAgaWYgKCFpc1BhdGgpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcGF0aFRvRGVmYXVsdCA9IHJlcXVpcmUucmVzb2x2ZShjb25maWcuZXh0ZW5kcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoX2Vycikge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb25maWc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBwYXRoVG9EZWZhdWx0ID0gZ2V0UGF0aFRvRGVmYXVsdENvbmZpZyhjd2QsIGNvbmZpZy5leHRlbmRzKTtcbiAgICAgICAgfVxuICAgICAgICBjaGVja0ZvckNpcmN1bGFyRXh0ZW5kcyhwYXRoVG9EZWZhdWx0KTtcbiAgICAgICAgcHJldmlvdXNseVZpc2l0ZWRDb25maWdzLnB1c2gocGF0aFRvRGVmYXVsdCk7XG4gICAgICAgIGRlZmF1bHRDb25maWcgPSBpc1BhdGhcbiAgICAgICAgICAgID8gSlNPTi5wYXJzZShzaGltLnJlYWRGaWxlU3luYyhwYXRoVG9EZWZhdWx0LCAndXRmOCcpKVxuICAgICAgICAgICAgOiByZXF1aXJlKGNvbmZpZy5leHRlbmRzKTtcbiAgICAgICAgZGVsZXRlIGNvbmZpZy5leHRlbmRzO1xuICAgICAgICBkZWZhdWx0Q29uZmlnID0gYXBwbHlFeHRlbmRzKGRlZmF1bHRDb25maWcsIHNoaW0ucGF0aC5kaXJuYW1lKHBhdGhUb0RlZmF1bHQpLCBtZXJnZUV4dGVuZHMsIHNoaW0pO1xuICAgIH1cbiAgICBwcmV2aW91c2x5VmlzaXRlZENvbmZpZ3MgPSBbXTtcbiAgICByZXR1cm4gbWVyZ2VFeHRlbmRzXG4gICAgICAgID8gbWVyZ2VEZWVwKGRlZmF1bHRDb25maWcsIGNvbmZpZylcbiAgICAgICAgOiBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0Q29uZmlnLCBjb25maWcpO1xufVxuZnVuY3Rpb24gY2hlY2tGb3JDaXJjdWxhckV4dGVuZHMoY2ZnUGF0aCkge1xuICAgIGlmIChwcmV2aW91c2x5VmlzaXRlZENvbmZpZ3MuaW5kZXhPZihjZmdQYXRoKSA+IC0xKSB7XG4gICAgICAgIHRocm93IG5ldyBZRXJyb3IoYENpcmN1bGFyIGV4dGVuZGVkIGNvbmZpZ3VyYXRpb25zOiAnJHtjZmdQYXRofScuYCk7XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0UGF0aFRvRGVmYXVsdENvbmZpZyhjd2QsIHBhdGhUb0V4dGVuZCkge1xuICAgIHJldHVybiBzaGltLnBhdGgucmVzb2x2ZShjd2QsIHBhdGhUb0V4dGVuZCk7XG59XG5mdW5jdGlvbiBtZXJnZURlZXAoY29uZmlnMSwgY29uZmlnMikge1xuICAgIGNvbnN0IHRhcmdldCA9IHt9O1xuICAgIGZ1bmN0aW9uIGlzT2JqZWN0KG9iaikge1xuICAgICAgICByZXR1cm4gb2JqICYmIHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KG9iaik7XG4gICAgfVxuICAgIE9iamVjdC5hc3NpZ24odGFyZ2V0LCBjb25maWcxKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhjb25maWcyKSkge1xuICAgICAgICBpZiAoaXNPYmplY3QoY29uZmlnMltrZXldKSAmJiBpc09iamVjdCh0YXJnZXRba2V5XSkpIHtcbiAgICAgICAgICAgIHRhcmdldFtrZXldID0gbWVyZ2VEZWVwKGNvbmZpZzFba2V5XSwgY29uZmlnMltrZXldKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRhcmdldFtrZXldID0gY29uZmlnMltrZXldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXQ7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIEJvb3RzdHJhcHMgeWFyZ3MgZm9yIEVTTTpcbmltcG9ydCBlc21QbGF0Zm9ybVNoaW0gZnJvbSAnLi9saWIvcGxhdGZvcm0tc2hpbXMvZXNtLm1qcyc7XG5pbXBvcnQge1lhcmdzRmFjdG9yeX0gZnJvbSAnLi9idWlsZC9saWIveWFyZ3MtZmFjdG9yeS5qcyc7XG5cbmNvbnN0IFlhcmdzID0gWWFyZ3NGYWN0b3J5KGVzbVBsYXRmb3JtU2hpbSk7XG5leHBvcnQgZGVmYXVsdCBZYXJncztcbiIsImV4cG9ydCBjb25zdCBpc1J1bm5pbmdPbkJ1biA9IHByb2Nlc3MuYXJndlswXS5lbmRzV2l0aCgnL2J1bicpO1xuXG5leHBvcnQgY29uc3QgcnVudGltZVdpdGhBcmdzID0gaXNSdW5uaW5nT25CdW4gPyAnYnVuIC0tYnVuIHJ1bicgOiAnbm9kZSc7XG5leHBvcnQgY29uc3QgcGFja2FnZU1hbmFnZXJXaXRoQXJncyA9IGlzUnVubmluZ09uQnVuID8gJ2J1biAtLWJ1biBydW4nIDogJ3lhcm4nO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBFbnZSZWFkZXJPcHRpb25zIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHsgcmVhZEVudmlyb25tZW50VmFyaWFibGVzIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHsgbWVtb2l6ZUZhY3RvcnkgfSBmcm9tICdhdC1kZWNvcmF0b3JzJztcbmltcG9ydCB7IGdsb2JieSB9IGZyb20gJ2dsb2JieSc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgaXNSdW5uaW5nT25CdW4gfSBmcm9tICcuL3V0aWxzL3J1bnRpbWUuanMnO1xuXG5jb25zdCBtZW1vaXplID0gbWVtb2l6ZUZhY3RvcnkoeyBtYXhDYWNoZWRUaGlzU2l6ZTogTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIsIG1heENhY2hlZEFyZ3NTaXplOiAxIH0pO1xuXG5leHBvcnQgY2xhc3MgUHJvamVjdCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXJndjogRW52UmVhZGVyT3B0aW9ucztcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkRW52OiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IHBhdGhCeU5hbWUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2RpclBhdGg6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihkaXJQYXRoOiBzdHJpbmcsIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsIGxvYWRFbnY6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9kaXJQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgpO1xuICAgIHRoaXMuYXJndiA9IGFyZ3Y7XG4gICAgdGhpcy5sb2FkRW52ID0gbG9hZEVudjtcbiAgfVxuXG4gIEBtZW1vaXplXG4gIGdldCBpc0J1bkF2YWlsYWJsZSgpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIC8oXnxcXG4pYnVuXFxzLy50ZXN0KGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4odGhpcy5yb290RGlyUGF0aCwgJy50b29sLXZlcnNpb25zJyksICd1dGY4JykpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIEBtZW1vaXplXG4gIGdldCBidWlsZENvbW1hbmQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gaXNSdW5uaW5nT25CdW5cbiAgICAgID8gJ3RydWUnXG4gICAgICA6IHRoaXMucGFja2FnZUpzb24uc2NyaXB0cz8uYnVpbGQ/LmluY2x1ZGVzKCdidWlsZElmTmVlZGVkJylcbiAgICAgICAgPyAneWFybiBidWlsZCdcbiAgICAgICAgOiBgWUFSTiB3YiBidWlsZElmTmVlZGVkICR7dGhpcy5hcmd2LnZlcmJvc2UgPyAnLS12ZXJib3NlJyA6ICcnfWA7XG4gIH1cblxuICBnZXQgZGlyUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kaXJQYXRoO1xuICB9XG5cbiAgQG1lbW9pemVcbiAgZ2V0IHJvb3REaXJQYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJy4uJywgJy4uJywgJ3BhY2thZ2UuanNvbicpKVxuICAgICAgPyBwYXRoLnJlc29sdmUodGhpcy5kaXJQYXRoLCAnLi4nLCAnLi4nKVxuICAgICAgOiB0aGlzLmRpclBhdGg7XG4gIH1cblxuICBAbWVtb2l6ZVxuICBnZXQgZG9ja2VyZmlsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBmcy5yZWFkRmlsZVN5bmModGhpcy5maW5kRmlsZSgnRG9ja2VyZmlsZScpLCAndXRmOCcpO1xuICB9XG5cbiAgQG1lbW9pemVcbiAgZ2V0IGhhc0RvY2tlcmZpbGUoKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAhIXRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBAbWVtb2l6ZVxuICBnZXQgaGFzU291cmNlQ29kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAnc3JjJykpO1xuICB9XG5cbiAgQG1lbW9pemVcbiAgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wYWNrYWdlSnNvbi5uYW1lIHx8ICd1bmtub3duJztcbiAgfVxuXG4gIEBtZW1vaXplXG4gIGdldCBkb2NrZXJJbWFnZU5hbWUoKTogc3RyaW5nIHtcbiAgICBjb25zdCBuYW1lID0gdGhpcy5wYWNrYWdlSnNvbi5uYW1lIHx8ICd1bmtub3duJztcbiAgICByZXR1cm4gbmFtZS5yZXBsYWNlQWxsKCdAJywgJycpLnJlcGxhY2VBbGwoJy8nLCAnLScpO1xuICB9XG5cbiAgQG1lbW9pemVcbiAgZ2V0IGVudigpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICByZXR1cm4gdGhpcy5sb2FkRW52ID8geyAuLi5yZWFkRW52aXJvbm1lbnRWYXJpYWJsZXModGhpcy5hcmd2LCB0aGlzLmRpclBhdGgpLCAuLi5wcm9jZXNzLmVudiB9IDogcHJvY2Vzcy5lbnY7XG4gIH1cblxuICBAbWVtb2l6ZVxuICBnZXQgcGFja2FnZUpzb24oKTogUGFja2FnZUpzb24ge1xuICAgIHJldHVybiBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAncGFja2FnZS5qc29uJyksICd1dGY4JykpO1xuICB9XG5cbiAgQG1lbW9pemVcbiAgZ2V0IGhhc1ByaXNtYSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEodGhpcy5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LlsncHJpc21hJ10gfHwgdGhpcy5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LlsncHJpc21hJ10pO1xuICB9XG5cbiAgQG1lbW9pemVcbiAgZ2V0IGRvY2tlclBhY2thZ2VKc29uKCk6IFBhY2thZ2VKc29uIHtcbiAgICByZXR1cm4gcGF0aC5kaXJuYW1lKHRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSkgPT09IHRoaXMuZGlyUGF0aFxuICAgICAgPyB0aGlzLnBhY2thZ2VKc29uXG4gICAgICA6IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihwYXRoLmRpcm5hbWUodGhpcy5maW5kRmlsZSgnRG9ja2VyZmlsZScpKSwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpKTtcbiAgfVxuXG4gIEBtZW1vaXplXG4gIGdldCBiaW5FeGlzdHMoKTogYm9vbGVhbiB7XG4gICAgbGV0IGJpbkZvdW5kID0gZmFsc2U7XG4gICAgbGV0IGN1cnJlbnRQYXRoID0gdGhpcy5kaXJQYXRoO1xuICAgIGZvciAoOzspIHtcbiAgICAgIGNvbnN0IGJpblBhdGggPSBwYXRoLmpvaW4oY3VycmVudFBhdGgsICdub2RlX21vZHVsZXMnLCAnLmJpbicpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoYmluUGF0aCkpIHtcbiAgICAgICAgdGhpcy5lbnYuUEFUSCA9IGAke2JpblBhdGh9OiR7dGhpcy5lbnYuUEFUSH1gO1xuICAgICAgICBiaW5Gb3VuZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihjdXJyZW50UGF0aCwgJy5naXQnKSkpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjb25zdCBwYXJlbnRQYXRoID0gcGF0aC5kaXJuYW1lKGN1cnJlbnRQYXRoKTtcbiAgICAgIGlmIChjdXJyZW50UGF0aCA9PT0gcGFyZW50UGF0aCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGN1cnJlbnRQYXRoID0gcGFyZW50UGF0aDtcbiAgICB9XG4gICAgcmV0dXJuIGJpbkZvdW5kO1xuICB9XG5cbiAgZmluZEZpbGUoZmlsZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IGZpbGVQYXRoID0gdGhpcy5wYXRoQnlOYW1lLmdldChmaWxlTmFtZSk7XG4gICAgaWYgKGZpbGVQYXRoKSByZXR1cm4gZmlsZVBhdGg7XG5cbiAgICBmaWxlUGF0aCA9IFtmaWxlTmFtZSwgcGF0aC5qb2luKCcuLicsICcuLicsIGZpbGVOYW1lKV1cbiAgICAgIC5tYXAoKHApID0+IHBhdGgucmVzb2x2ZSh0aGlzLmRpclBhdGgsIHApKVxuICAgICAgLmZpbmQoKHApID0+IGZzLmV4aXN0c1N5bmMocCkpO1xuICAgIGlmICghZmlsZVBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmlsZSBub3QgZm91bmQ6ICR7ZmlsZU5hbWV9YCk7XG4gICAgfVxuICAgIHRoaXMucGF0aEJ5TmFtZS5zZXQoZmlsZU5hbWUsIGZpbGVQYXRoKTtcbiAgICByZXR1cm4gZmlsZVBhdGg7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBGb3VuZFByb2plY3RzIHtcbiAgcm9vdDogUHJvamVjdDtcbiAgc2VsZjogUHJvamVjdDtcbiAgYWxsOiBQcm9qZWN0W107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kU2VsZlByb2plY3QoYXJndjogRW52UmVhZGVyT3B0aW9ucywgbG9hZEVudiA9IHRydWUsIGRpclBhdGg/OiBzdHJpbmcpOiBQcm9qZWN0IHwgdW5kZWZpbmVkIHtcbiAgZGlyUGF0aCA/Pz0gcHJvY2Vzcy5jd2QoKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSByZXR1cm47XG5cbiAgcmV0dXJuIG5ldyBQcm9qZWN0KGRpclBhdGgsIGFyZ3YsIGxvYWRFbnYpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmluZEFsbFByb2plY3RzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBsb2FkRW52ID0gdHJ1ZSxcbiAgZGlyUGF0aD86IHN0cmluZ1xuKTogUHJvbWlzZTxGb3VuZFByb2plY3RzIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHJvb3RBbmRTZWxmUHJvamVjdHMgPSBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyhhcmd2LCBsb2FkRW52LCBkaXJQYXRoKTtcbiAgaWYgKCFyb290QW5kU2VsZlByb2plY3RzKSByZXR1cm47XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5yb290QW5kU2VsZlByb2plY3RzLFxuICAgIGFsbDpcbiAgICAgIHJvb3RBbmRTZWxmUHJvamVjdHMucm9vdCA9PT0gcm9vdEFuZFNlbGZQcm9qZWN0cy5zZWxmXG4gICAgICAgID8gYXdhaXQgZ2V0QWxsUHJvamVjdHMoYXJndiwgcm9vdEFuZFNlbGZQcm9qZWN0cy5yb290LCBsb2FkRW52KVxuICAgICAgICA6IFtyb290QW5kU2VsZlByb2plY3RzLnNlbGZdLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZFJvb3RBbmRTZWxmUHJvamVjdHMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGxvYWRFbnYgPSB0cnVlLFxuICBkaXJQYXRoPzogc3RyaW5nXG4pOiBPbWl0PEZvdW5kUHJvamVjdHMsICdhbGwnPiB8IHVuZGVmaW5lZCB7XG4gIGRpclBhdGggPz89IHByb2Nlc3MuY3dkKCk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkgcmV0dXJuO1xuXG4gIGNvbnN0IHRoaXNQcm9qZWN0ID0gbmV3IFByb2plY3QoZGlyUGF0aCwgYXJndiwgbG9hZEVudik7XG4gIGxldCByb290UHJvamVjdCA9IHRoaXNQcm9qZWN0O1xuICBpZiAoIXRoaXNQcm9qZWN0LnBhY2thZ2VKc29uLndvcmtzcGFjZXMgJiYgcGF0aC5kaXJuYW1lKGRpclBhdGgpLmVuZHNXaXRoKCcvcGFja2FnZXMnKSkge1xuICAgIGNvbnN0IHJvb3REaXJQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICcuLicsICcuLicpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihyb290RGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgICAgcm9vdFByb2plY3QgPSBuZXcgUHJvamVjdChyb290RGlyUGF0aCwgYXJndiwgbG9hZEVudik7XG4gICAgfVxuICB9XG4gIHJldHVybiB7IHJvb3Q6IHJvb3RQcm9qZWN0LCBzZWxmOiB0aGlzUHJvamVjdCB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRBbGxQcm9qZWN0cyhhcmd2OiBFbnZSZWFkZXJPcHRpb25zLCByb290UHJvamVjdDogUHJvamVjdCwgbG9hZEVudjogYm9vbGVhbik6IFByb21pc2U8UHJvamVjdFtdPiB7XG4gIGNvbnN0IGFsbFByb2plY3RzID0gW3Jvb3RQcm9qZWN0XTtcblxuICBjb25zdCB3b3Jrc3BhY2UgPSByb290UHJvamVjdC5wYWNrYWdlSnNvbi53b3Jrc3BhY2VzO1xuICBpZiAoIUFycmF5LmlzQXJyYXkod29ya3NwYWNlKSkgcmV0dXJuIGFsbFByb2plY3RzO1xuXG4gIGNvbnN0IGdsb2JQYXR0ZXJuOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBwYWNrYWdlRGlyczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCB3b3Jrc3BhY2VQYXRoIG9mIHdvcmtzcGFjZS5tYXAoKHdzOiBzdHJpbmcpID0+IHBhdGguam9pbihyb290UHJvamVjdC5kaXJQYXRoLCB3cykpKSB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMod29ya3NwYWNlUGF0aCkpIHtcbiAgICAgIHBhY2thZ2VEaXJzLnB1c2god29ya3NwYWNlUGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdsb2JQYXR0ZXJuLnB1c2god29ya3NwYWNlUGF0aCk7XG4gICAgfVxuICB9XG4gIHBhY2thZ2VEaXJzLnB1c2goLi4uKGF3YWl0IGdsb2JieShnbG9iUGF0dGVybiwgeyBkb3Q6IHRydWUsIG9ubHlEaXJlY3RvcmllczogdHJ1ZSB9KSkpO1xuICBmb3IgKGNvbnN0IHN1YlBhY2thZ2VEaXJQYXRoIG9mIHBhY2thZ2VEaXJzKSB7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihzdWJQYWNrYWdlRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkgY29udGludWU7XG5cbiAgICBhbGxQcm9qZWN0cy5wdXNoKG5ldyBQcm9qZWN0KHN1YlBhY2thZ2VEaXJQYXRoLCBhcmd2LCBsb2FkRW52KSk7XG4gIH1cbiAgcmV0dXJuIGFsbFByb2plY3RzO1xufVxuIiwiaW1wb3J0e2N5cmI2NEhhc2hXaXRoTGVuZ3RoIGFzIGV9ZnJvbVwiLi9oYXNoLmpzXCI7Y29uc3QgdD1zKCk7ZnVuY3Rpb24gcyh7Y2FjaGVEdXJhdGlvbjp0PU51bWJlci5QT1NJVElWRV9JTkZJTklUWSxjYWNoZXM6cyxjYWxjS2V5Om49KHQ9PmUoSlNPTi5zdHJpbmdpZnkodCkpKSxtYXhDYWNoZWRBcmdzU2l6ZTppPTEwMCxtYXhDYWNoZWRUaGlzU2l6ZTpjPTEwfT17fSl7cmV0dXJuIGZ1bmN0aW9uKGUsbyl7aWYoXCJnZXR0ZXJcIj09PW8/LmtpbmQpe2NvbnN0IG49bmV3IE1hcDtyZXR1cm4gcz8ucHVzaChuKSxmdW5jdGlvbigpe2NvbnN0IHM9RGF0ZS5ub3coKTtpZihuLmhhcyh0aGlzKSl7Y29uc3RbZSxpXT1uLmdldCh0aGlzKTtpZihzLWk8PXQpcmV0dXJuIGV9Y29uc3QgaT1lLmNhbGwodGhpcyk7aWYobi5zaXplPj1jKXtjb25zdCBlPW4ua2V5cygpLm5leHQoKS52YWx1ZTtuLmRlbGV0ZShlKX1yZXR1cm4gbi5zZXQodGhpcyxbaSxzXSksaX19e2NvbnN0IHI9bmV3IE1hcDtyZXR1cm4gcz8ucHVzaChyKSxmdW5jdGlvbiguLi5zKXtjb25zdCBhPW4ocyk7bGV0IGg9ci5nZXQodGhpcyk7Y29uc3QgdT1EYXRlLm5vdygpO2lmKGgpe2lmKGguaGFzKGEpKXtjb25zdFtlLHNdPWguZ2V0KGEpO2lmKHUtczw9dClyZXR1cm4gZX19ZWxzZXtpZihoPW5ldyBNYXAsci5zaXplPj1jKXtjb25zdCBlPXIua2V5cygpLm5leHQoKS52YWx1ZTtyLmRlbGV0ZShlKX1yLnNldCh0aGlzLGgpfWNvbnN0IGY9bz9lLmNhbGwodGhpcywuLi5zKTplKC4uLnMpO2lmKGguc2l6ZT49aSl7Y29uc3QgZT1oLmtleXMoKS5uZXh0KCkudmFsdWU7aC5kZWxldGUoZSl9cmV0dXJuIGguc2V0KGEsW2YsdV0pLGZ9fX19ZXhwb3J0e3QgYXMgbWVtb2l6ZSxzIGFzIG1lbW9pemVGYWN0b3J5fTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1lbW9pemUuanMubWFwXG4iLCJmdW5jdGlvbiB0KHQsbj0wKXtjb25zdFtpLHJdPWZ1bmN0aW9uKHQsbj0wKXtsZXQgaT0zNzM1OTI4NTU5Xm4scj0xMTAzNTQ3OTkxXm47Zm9yKGxldCBuLGE9MDthPHQubGVuZ3RoO2ErKyluPXQuY29kZVBvaW50QXQoYSksaT1NYXRoLmltdWwoaV5uLDI2NTQ0MzU3NjEpLHI9TWF0aC5pbXVsKHJebiwxNTk3MzM0Njc3KTtyZXR1cm4gaT1NYXRoLmltdWwoaV5pPj4+MTYsMjI0NjgyMjUwNyksaV49TWF0aC5pbXVsKHJecj4+PjEzLDMyNjY0ODk5MDkpLHI9TWF0aC5pbXVsKHJecj4+PjE2LDIyNDY4MjI1MDcpLHJePU1hdGguaW11bChpXmk+Pj4xMywzMjY2NDg5OTA5KSxbcj4+PjAsaT4+PjBdfSh0LG4pO3JldHVybiB0Lmxlbmd0aC50b1N0cmluZygzNikraS50b1N0cmluZygzNikucGFkU3RhcnQoNyxcIjBcIikrci50b1N0cmluZygzNikucGFkU3RhcnQoNyxcIjBcIil9ZXhwb3J0e3QgYXMgY3lyYjY0SGFzaFdpdGhMZW5ndGh9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aGFzaC5qcy5tYXBcbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgdHlwZSB7IEhhc2ggfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgaWdub3JlRW5vZW50QXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgY29tbWFuZDoge1xuICAgIGRlc2NyaXB0aW9uOiAnQSBidWlsZCBjb21tYW5kJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBkZWZhdWx0OiAneWFybiBidWlsZCcsXG4gICAgYWxpYXM6ICdjJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBidWlsZElmTmVlZGVkQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdidWlsZElmTmVlZGVkJyxcbiAgZGVzY3JpYmU6ICdCdWlsZCBjb2RlIGlmIGNoYW5nZXMgYXJlIGRldGVjdGVkJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgYXdhaXQgYnVpbGRJZk5lZWRlZChhcmd2KTtcbiAgfSxcbn07XG5cbmZ1bmN0aW9uIGJ1aWxkKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+Pj4pOiBib29sZWFuIHtcbiAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKGBSdW4gJyR7YXJndi5jb21tYW5kfSdgKSk7XG4gIGlmICghYXJndi5kcnlSdW4pIHtcbiAgICBjb25zdCByZXQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhhcmd2LmNvbW1hbmQgPz8gJycsIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBwcm9qZWN0LmVudixcbiAgICAgIHNoZWxsOiB0cnVlLFxuICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB9KTtcbiAgICBpZiAocmV0LnN0YXR1cyAhPT0gMCkge1xuICAgICAgcHJvY2Vzcy5leGl0Q29kZSA9IHJldC5zdGF0dXMgPz8gMTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZElmTmVlZGVkKFxuICAvLyBUZXN0IGNvZGUgcmVxdWlyZXMgUGFydGlhbDwuLi4+XG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+Pj4sXG4gIHByb2plY3RQYXRoRm9yVGVzdGluZz86IHN0cmluZ1xuKTogUHJvbWlzZTxib29sZWFuIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHByb2plY3QgPSBhd2FpdCBmaW5kU2VsZlByb2plY3QoYXJndiwgdHJ1ZSwgcHJvamVjdFBhdGhGb3JUZXN0aW5nKTtcbiAgaWYgKCFwcm9qZWN0KSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LnJvb3REaXJQYXRoLCAnLmdpdCcpKSkge1xuICAgIGJ1aWxkKHByb2plY3QsIGFyZ3YpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc3QgW2NhblNraXAsIGNhY2hlRmlsZVBhdGgsIGNvbnRlbnRIYXNoXSA9IGF3YWl0IGNhblNraXBCdWlsZChwcm9qZWN0LCBhcmd2KTtcbiAgaWYgKGNhblNraXApIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oYFNraXAgdG8gcnVuICcke2FyZ3YuY29tbWFuZH0nIPCfkqtgKSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFidWlsZChwcm9qZWN0LCBhcmd2KSkgcmV0dXJuO1xuXG4gIGlmICghYXJndi5kcnlSdW4pIHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoY2FjaGVGaWxlUGF0aCwgY29udGVudEhhc2gsICd1dGY4Jyk7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmNvbnN0IGlnbm9yaW5nRW52VmFyTmFtZXMgPSBuZXcgU2V0KFsnQ0knLCAnUFdERUJVRycsICdUTVBESVInXSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjYW5Ta2lwQnVpbGQoXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+Pj5cbik6IFByb21pc2U8W2Jvb2xlYW4sIHN0cmluZywgc3RyaW5nXT4ge1xuICBjb25zdCBjYWNoZURpcmVjdG9yeVBhdGggPSBwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCAnbm9kZV9tb2R1bGVzJywgJy5jYWNoZScsICdidWlsZCcpO1xuICBjb25zdCBjYWNoZUZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNhY2hlRGlyZWN0b3J5UGF0aCwgJ2xhc3QtYnVpbGQnKTtcbiAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIoY2FjaGVEaXJlY3RvcnlQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICBjb25zdCBoYXNoID0gY3JlYXRlSGFzaCgnc2hhMjU2Jyk7XG5cbiAgY29uc3QgY29tbWl0SGFzaCA9IGNoaWxkX3Byb2Nlc3MuZXhlY1N5bmMoJ2dpdCByZXYtcGFyc2UgSEVBRCcsIHsgY3dkOiBwcm9qZWN0LmRpclBhdGggfSkudG9TdHJpbmcoKS50cmltKCk7XG4gIGhhc2gudXBkYXRlKGNvbW1pdEhhc2gpO1xuXG4gIGNvbnN0IGVudmlyb25tZW50SnNvbiA9IEpTT04uc3RyaW5naWZ5KFxuICAgIE9iamVjdC5lbnRyaWVzKHByb2plY3QuZW52KVxuICAgICAgLmZpbHRlcigoW2tleV0pID0+ICFpZ25vcmluZ0VudlZhck5hbWVzLmhhcyhrZXkpKVxuICAgICAgLnNvcnQoKFtrZXkxXSwgW2tleTJdKSA9PiBrZXkxLmxvY2FsZUNvbXBhcmUoa2V5MikpXG4gICk7XG4gIGhhc2gudXBkYXRlKGVudmlyb25tZW50SnNvbik7XG5cbiAgYXdhaXQgdXBkYXRlSGFzaFdpdGhEaWZmUmVzdWx0KHByb2plY3QsIGFyZ3YsIGhhc2gpO1xuICBjb25zdCBjb250ZW50SGFzaCA9IGhhc2guZGlnZXN0KCdoZXgnKTtcblxuICBjb25zdCBjYWNoZWRDb250ZW50SGFzaCA9IGF3YWl0IGlnbm9yZUVub2VudEFzeW5jKCgpID0+IGZzLnByb21pc2VzLnJlYWRGaWxlKGNhY2hlRmlsZVBhdGgsICd1dGY4JykpO1xuICByZXR1cm4gW2NhY2hlZENvbnRlbnRIYXNoID09PSBjb250ZW50SGFzaCwgY2FjaGVGaWxlUGF0aCwgY29udGVudEhhc2hdO1xufVxuXG5jb25zdCBpbmNsdWRlUGF0dGVybnMgPSBbJ3NyYy8nLCAncHVibGljLyddO1xuY29uc3QgaW5jbHVkZVN1ZmZpeCA9IFtcbiAgJy5qcycsXG4gICcuY2pzJyxcbiAgJy5tanMnLFxuICAnLmpzeCcsXG4gICcudHMnLFxuICAnLmN0cycsXG4gICcubXRzJyxcbiAgJy50c3gnLFxuICAnLmpzb24nLFxuICAnLmJyb3dzZXJzbGlzdHJjJyxcbiAgLy8gQmVjYXVzZSBzb21lIGJ1aWxkIGNvbW1hbmRzIGFmZmVjdGVkIGJ5IGNoYW5nZXMgaW4gYHBhY2thZ2UuanNvbmBcbiAgJ3BhY2thZ2UuanNvbicsXG4gICd5YXJuLmxvY2snLFxuXTtcbmNvbnN0IGV4Y2x1ZGVQYXR0ZXJucyA9IFsndGVzdC8nLCAndGVzdHMvJywgJ19fdGVzdHNfXy8nLCAndGVzdC1maXh0dXJlcy8nXTtcblxuYXN5bmMgZnVuY3Rpb24gdXBkYXRlSGFzaFdpdGhEaWZmUmVzdWx0KFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+LFxuICBoYXNoOiBIYXNoXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoJ2dpdCcsIFsnZGlmZicsICctLW5hbWUtb25seSddLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogcHJvamVjdC5lbnYsXG4gICAgICBzdGRpbzogJ3BpcGUnLFxuICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICB9KTtcbiAgICBjb25zdCBmaWxlUGF0aHMgPSByZXQuc3Rkb3V0XG4gICAgICAudHJpbSgpXG4gICAgICAuc3BsaXQoJ1xcbicpXG4gICAgICAubWFwKChmaWxlUGF0aCkgPT5cbiAgICAgICAgcHJvamVjdC5lbnYuV0JfRU5WID09PSAndGVzdCcgPyBmaWxlUGF0aC5yZXBsYWNlKC9wYWNrYWdlc1xcL3NjcmlwdHNcXC90ZXN0LWZpeHR1cmVzXFwvW14vXStcXC8vLCAnJykgOiBmaWxlUGF0aFxuICAgICAgKTtcbiAgICBjb25zdCBmaWx0ZXJlZEZpbGVQYXRocyA9IGZpbGVQYXRocy5maWx0ZXIoXG4gICAgICAoZmlsZVBhdGgpID0+XG4gICAgICAgIChpbmNsdWRlUGF0dGVybnMuc29tZSgocGF0dGVybikgPT4gZmlsZVBhdGguaW5jbHVkZXMocGF0dGVybikpIHx8XG4gICAgICAgICAgaW5jbHVkZVN1ZmZpeC5zb21lKChzdWZmaXgpID0+IGZpbGVQYXRoLmVuZHNXaXRoKHN1ZmZpeCkpKSAmJlxuICAgICAgICAhZXhjbHVkZVBhdHRlcm5zLnNvbWUoKHBhdHRlcm4pID0+IGZpbGVQYXRoLmluY2x1ZGVzKHBhdHRlcm4pKVxuICAgICk7XG4gICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBDaGFuZ2VkIGZpbGVzOiAke2ZpbHRlcmVkRmlsZVBhdGhzLmpvaW4oJywgJyl9YCk7XG4gICAgfVxuXG4gICAgLy8gJ2dpdCBkaWZmIC0tJyB3b3JrcyBvbmx5IG9uIHJvb3REaXJQYXRoXG4gICAgY29uc3QgcHJvYyA9IGNoaWxkX3Byb2Nlc3Muc3Bhd24oJ2dpdCcsIFsnZGlmZicsICctLScsIC4uLmZpbHRlcmVkRmlsZVBhdGhzXSwgeyBjd2Q6IHByb2plY3Qucm9vdERpclBhdGggfSk7XG4gICAgcHJvYy5zdGRvdXQ/Lm9uKCdkYXRhJywgKGRhdGEpID0+IHtcbiAgICAgIGhhc2gudXBkYXRlKGRhdGEpO1xuICAgICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgICBjb25zb2xlLmluZm8oZGF0YS50b1N0cmluZygpKTtcbiAgICAgICAgY29uc29sZS5pbmZvKCdIYXNoOicsIGhhc2guY29weSgpLmRpZ2VzdCgnaGV4JykpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHByb2Mub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pO1xuICB9KTtcbn1cbiIsImltcG9ydCB7IHNsZWVwIH0gZnJvbSAnLi9zbGVlcC5qcyc7XG5cbi8qKlxuICogQ29udmVydCBhbiBvYmplY3QgdG8gYW4gZXJyb3IuXG4gKiBAcGFyYW0gb2JqIFRoZSBvYmplY3QgdG8gY29udmVydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVycm9yaWZ5KG9iajogdW5rbm93bik6IEVycm9yIHtcbiAgaWYgKG9iaiBpbnN0YW5jZW9mIEVycm9yKSByZXR1cm4gb2JqO1xuICBpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpIHJldHVybiBuZXcgRXJyb3Iob2JqKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IEVycm9yKEpTT04uc3RyaW5naWZ5KG9iaikpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbmV3IEVycm9yKFN0cmluZyhvYmopKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlRXJyb3I8VD4oZm46ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZ25vcmVFbm9lbnQ8VD4oZm46ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlnbm9yZUVycm9yQXN5bmM8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFbm9lbnRBc3luYzxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBmbigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICYmICdjb2RlJyBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJldHJ5T3B0aW9ucyB7XG4gIGJlZm9yZVJldHJ5PzogKGVycm9yOiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBoYW5kbGVFcnJvcj86IChlcnJvcjogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgcmV0cnlDb3VudD86IG51bWJlcjtcbiAgcmV0cnlMb2dnZXI/OiAobWVzc2FnZTogc3RyaW5nKSA9PiB2b2lkO1xuICBzbGVlcE1pbGxpc2Vjb25kcz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBSZXRyeSB0aGUgZ2l2ZW4gZnVuY3Rpb24uXG4gKiBAcGFyYW0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmV0cnkuXG4gKiBAcGFyYW0gYmVmb3JlUmV0cnkgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgaW1tZWRpYXRlbHkgYmVmb3JlIHJldHJ5aW5nLlxuICogQHBhcmFtIGhhbmRsZUVycm9yIFRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gYW4gZXJyb3Igb2NjdXJzLlxuICogQHBhcmFtIHJldHJ5Q291bnQgVGhlIG1heGltdW0gbnVtYmVyIG9mIHJldHJpZXMuXG4gKiBAcGFyYW0gcmV0cnlMb2dnZXIgVGhlIGZ1bmN0aW9uIHRvIGxvZyByZXRyeWluZy5cbiAqIEBwYXJhbSBzbGVlcE1pbGxpc2Vjb25kcyBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBzbGVlcCBiZWZvcmUgcmV0cnlpbmcuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3aXRoUmV0cnk8VD4oXG4gIGZ1bmM6IChmYWlsZWRDb3VudDogbnVtYmVyKSA9PiBQcm9taXNlPFQ+LFxuICB7IGJlZm9yZVJldHJ5LCBoYW5kbGVFcnJvciwgcmV0cnlDb3VudCA9IDMsIHJldHJ5TG9nZ2VyLCBzbGVlcE1pbGxpc2Vjb25kcyA9IDAgfTogUmV0cnlPcHRpb25zID0ge31cbik6IFByb21pc2U8VD4ge1xuICBsZXQgZmFpbGVkQ291bnQgPSAwO1xuICBmb3IgKDs7KSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmdW5jKGZhaWxlZENvdW50KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgYXdhaXQgaGFuZGxlRXJyb3I/LihlcnJvcik7XG4gICAgICBmYWlsZWRDb3VudCsrO1xuICAgICAgaWYgKGZhaWxlZENvdW50ID49IHJldHJ5Q291bnQpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBpZiAoc2xlZXBNaWxsaXNlY29uZHMgPiAwKSB7XG4gICAgICAgIGF3YWl0IHNsZWVwKHNsZWVwTWlsbGlzZWNvbmRzKTtcbiAgICAgIH1cbiAgICAgIHJldHJ5TG9nZ2VyPy4oYFJldHJ5IGR1ZSB0bzogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3Iuc3RhY2sgOiBlcnJvcn1gKTtcbiAgICAgIGF3YWl0IGJlZm9yZVJldHJ5Py4oZXJyb3IpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiogcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKGNvbW1hbmROYW1lOiBzdHJpbmcsIHByb2plY3RzOiBQcm9qZWN0W10pOiBHZW5lcmF0b3I8UHJvamVjdCwgdm9pZCwgdW5rbm93bj4ge1xuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmluZm8oYFJ1bm5pbmcgXCIke2NvbW1hbmROYW1lfVwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICB5aWVsZCBwcm9qZWN0O1xuICB9XG59XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kQWxsUHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcblxuaW1wb3J0IHsgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kVXRpbHMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICBvdXRzaWRlOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRoZSBvcHRpbWl6YXRpb24gaXMgZXhlY3V0ZWQgb3V0c2lkZSBhIGRvY2tlciBjb250YWluZXIgb3Igbm90JyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6ICdvJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdvcHRpbWl6ZUZvckRvY2tlckJ1aWxkJyxcbiAgZGVzY3JpYmU6ICdPcHRpbWl6ZSBjb25maWd1cmF0aW9uIHdoZW4gYnVpbGRpbmcgYSBEb2NrZXIgaW1hZ2UnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmRBbGxQcm9qZWN0cyhhcmd2KTtcbiAgICBpZiAoIXByb2plY3RzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgnb3B0aW1pemVGb3JEb2NrZXJCdWlsZCcsIHByb2plY3RzLmFsbCkpIHtcbiAgICAgIGNvbnN0IHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiA9IHByb2plY3QucGFja2FnZUpzb247XG4gICAgICBjb25zdCBrZXlzID0gWydkZXBlbmRlbmNpZXMnLCAnZGV2RGVwZW5kZW5jaWVzJ10gYXMgY29uc3Q7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgIGNvbnN0IGRlcHMgPSBwYWNrYWdlSnNvbltrZXldIHx8IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZGVwcykpIHtcbiAgICAgICAgICBpZiAodmFsdWU/LnN0YXJ0c1dpdGgoJ2dpdEBnaXRodWIuY29tOicpKSB7XG4gICAgICAgICAgICBkZXBzW25hbWVdID0gYC4vJHtuYW1lfWA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG9wdGltaXplRGV2RGVwZW5kZW5jaWVzKGFyZ3YsIHBhY2thZ2VKc29uKTtcblxuICAgICAgb3B0aW1pemVTY3JpcHRzKHBhY2thZ2VKc29uKTtcblxuICAgICAgb3B0aW1pemVSb290UHJvcHMocGFja2FnZUpzb24pO1xuXG4gICAgICBpZiAoYXJndi5kcnlSdW4pIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBkaXN0RGlyUGF0aCA9IGFyZ3Yub3V0c2lkZSA/IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICdkaXN0JykgOiBwcm9qZWN0LmRpclBhdGg7XG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihkaXN0RGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKGRpc3REaXJQYXRoLCAncGFja2FnZS5qc29uJyksIEpTT04uc3RyaW5naWZ5KHBhY2thZ2VKc29uKSwgJ3V0ZjgnKTtcbiAgICB9XG4gICAgaWYgKCFhcmd2LmRyeVJ1biAmJiAhYXJndi5vdXRzaWRlKSB7XG4gICAgICBjaGlsZF9wcm9jZXNzLnNwYXduU3luYygneWFybicsIHtcbiAgICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcbn07XG5cbmZ1bmN0aW9uIG9wdGltaXplRGV2RGVwZW5kZW5jaWVzKGFyZ3Y6IEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+LCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgaWYgKCFhcmd2Lm91dHNpZGUpIHtcbiAgICBkZWxldGUgcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGRldkRlcHMgPSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgfHwge307XG4gIGNvbnN0IG5hbWVXb3Jkc1RvQmVSZW1vdmVkID0gW1xuICAgICdhcnRpbGxlcnknLFxuICAgICdjb25jdXJyZW50bHknLFxuICAgICdjb252ZW50aW9uYWwtY2hhbmdlbG9nLWNvbnZlbnRpb25hbGNvbW1pdHMnLFxuICAgICdlc2xpbnQnLFxuICAgICdodXNreScsXG4gICAgJ2ltYWdlbWluJyxcbiAgICAnamVzdCcsXG4gICAgJ2tpbGwtcG9ydCcsXG4gICAgJ2xpbnQtc3RhZ2VkJyxcbiAgICAnb3Blbi1jbGknLFxuICAgICdwbGF5d3JpZ2h0JyxcbiAgICAncHJldHRpZXInLFxuICAgICdwaW5zdCcsXG4gICAgJ3NvcnQtcGFja2FnZS1qc29uJyxcbiAgICAnd2FpdC1vbicsXG4gICAgJ3NlbWFudGljLXJlbGVhc2UnLFxuICAgICd2aXRlc3QnLFxuICBdO1xuICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmtleXMoZGV2RGVwcykpIHtcbiAgICBpZiAoXG4gICAgICBuYW1lV29yZHNUb0JlUmVtb3ZlZC5zb21lKCh3b3JkKSA9PiBuYW1lLmluY2x1ZGVzKHdvcmQpKSB8fFxuICAgICAgKCFhcmd2Lm91dHNpZGUgJiYgbmFtZS5pbmNsdWRlcygnd2lsbGJvb3N0ZXInKSAmJiBuYW1lLmluY2x1ZGVzKCdjb25maWcnKSlcbiAgICApIHtcbiAgICAgIGRlbGV0ZSBkZXZEZXBzW25hbWVdO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBvcHRpbWl6ZVNjcmlwdHMocGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGNvbnN0IG5hbWVXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzID0gWydjaGVjaycsICdkZXBsb3knLCAnZm9ybWF0JywgJ2xpbnQnLCAnc3RhcnQnLCAndGVzdCddO1xuICBjb25zdCBjb250ZW50V29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cyA9IFsncGluc3QgJywgJ2h1c2t5ICddO1xuICBjb25zdCBzY3JpcHRzID0gKHBhY2thZ2VKc29uLnNjcmlwdHMgfHwge30pIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGZvciAoY29uc3QgW25hbWUsIGNvbnRlbnRdIG9mIE9iamVjdC5lbnRyaWVzKHNjcmlwdHMpKSB7XG4gICAgaWYgKFxuICAgICAgbmFtZVdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMuc29tZSgod29yZCkgPT4gbmFtZS5pbmNsdWRlcyh3b3JkKSkgfHxcbiAgICAgIC8vIFN1cHBvcnQgXCJodXNreVwiIHNpbmNlIGh1c2t5IHY5IHJlcXVpcmVzIGBcInBvc3RpbnN0YWxsXCI6IFwiaHVza3lcImBcbiAgICAgIGNvbnRlbnRXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzLnNvbWUoKHdvcmQpID0+IGNvbnRlbnQuaW5jbHVkZXMod29yZCkgfHwgY29udGVudC50cmltKCkgPT09IHdvcmQudHJpbSgpKVxuICAgICkge1xuICAgICAgZGVsZXRlIHNjcmlwdHNbbmFtZV07XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG9wdGltaXplUm9vdFByb3BzKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBkZWxldGUgcGFja2FnZUpzb24ucHJpdmF0ZTtcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnB1Ymxpc2hDb25maWc7XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5wcmV0dGllcjtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVudGltZVdpdGhBcmdzIH0gZnJvbSAnLi4vdXRpbHMvcnVudGltZS5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBQcmlzbWEgY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFBSSVNNQWAgaXMgcmVwbGFjZWQgd2l0aCBgWUFSTiBwcmlzbWFgIG9yIGBZQVJOIGJsaXR6IHByaXNtYWBcbiAqIGFuZCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgUHJpc21hU2NyaXB0cyB7XG4gIGRlcGxveShfOiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ1BSSVNNQSBtaWdyYXRlIGRlcGxveSc7XG4gIH1cblxuICBkZXBsb3lGb3JjZShwcm9qZWN0OiBQcm9qZWN0LCBiYWNrdXBQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRpck5hbWUgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uWydibGl0eiddID8gJ2RiJyA6ICdwcmlzbWEnO1xuICAgIC8vIERvbid0IHNraXAgXCJtaWdyYXRlIGRlcGxveVwiIGJlY2F1c2UgcmVzdG9yZWQgZGF0YWJhc2UgbWF5IGJlIG9sZGVyIHRoYW4gdGhlIGN1cnJlbnQgc2NoZW1hLlxuICAgIHJldHVybiBgcm0gLVJmICR7ZGlyTmFtZX0vbW91bnQvcHJvZC5zcWxpdGUzKjsgUFJJU01BIG1pZ3JhdGUgcmVzZXQgLS1mb3JjZSAmJiBybSAtUmYgJHtkaXJOYW1lfS9tb3VudC9wcm9kLnNxbGl0ZTMqXG4gICAgICAmJiBsaXRlc3RyZWFtIHJlc3RvcmUgLW8gJHtkaXJOYW1lfS9tb3VudC9wcm9kLnNxbGl0ZTMgJHtiYWNrdXBQYXRofSAmJiBBTExPV19UT19TS0lQX1NFRUQ9MCBQUklTTUEgbWlncmF0ZSBkZXBsb3lgO1xuICB9XG5cbiAgbGl0ZXN0cmVhbShfOiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7cnVudGltZVdpdGhBcmdzfSAtZSAnXG5jb25zdCB7IFByaXNtYUNsaWVudCB9ID0gcmVxdWlyZShcIkBwcmlzbWEvY2xpZW50XCIpO1xubmV3IFByaXNtYUNsaWVudCgpLiRxdWVyeVJhd1xcYFBSQUdNQSBqb3VybmFsX21vZGUgPSBXQUw7XFxgXG4gIC5jYXRjaCgoZXJyb3IpID0+IHsgY29uc29sZS5sb2coXCJGYWlsZWQgZHVlIHRvOlwiLCBlcnJvcik7IHByb2Nlc3MuZXhpdCgxKTsgfSk7XG4nYDtcbiAgfVxuXG4gIG1pZ3JhdGUocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBQUklTTUEgbWlncmF0ZSBkZXBsb3kgJiYgUFJJU01BIGdlbmVyYXRlICYmICR7dGhpcy5zZWVkKHByb2plY3QpfWA7XG4gIH1cblxuICBtaWdyYXRlRGV2KF86IFByb2plY3QpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUFJJU01BIG1pZ3JhdGUgZGV2YDtcbiAgfVxuXG4gIHJlc2V0KHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIC8vIGNmLiBodHRwczovL3d3dy5wcmlzbWEuaW8vZG9jcy9ndWlkZXMvZGF0YWJhc2Uvc2VlZC1kYXRhYmFzZSNpbnRlZ3JhdGVkLXNlZWRpbmctd2l0aC1wcmlzbWEtbWlncmF0ZVxuICAgIC8vIEJsaXR6IGRvZXMgbm90IHRyaWdnZXIgc2VlZCBhdXRvbWF0aWNhbGx5LCBzbyB3ZSBuZWVkIHRvIHJ1biBpdCBtYW51YWxseS5cbiAgICByZXR1cm4gYFBSSVNNQSBtaWdyYXRlIHJlc2V0IC0tZm9yY2UgLS1za2lwLXNlZWQgJiYgJHt0aGlzLnNlZWQocHJvamVjdCl9YDtcbiAgICAvLyBJJ20gbm90IHN1cmUgd2h5IHdlIG5lZWQgdG8gcmVtb3ZlIGFsbCBzcWxpdGUgZmlsZXMsIHNvIEkgY29tbWVudGVkIG91dCB0aGUgZm9sbG93aW5nIGxpbmUuXG4gICAgLy8gcmV0dXJuIGB0cnVlICQocm0gLVJmIGRiLyoqLyouc3FsaXRlKiAyPiAvZGV2L251bGwpICYmIHRydWUgJChybSAtUmYgcHJpc21hLyoqLyouc3FsaXRlKiAyPiAvZGV2L251bGwpICYmIFBSSVNNQSBtaWdyYXRlIHJlc2V0IC0tZm9yY2UgLS1za2lwLXNlZWQgJiYgJHt0aGlzLnNlZWQoKX1gO1xuICB9XG5cbiAgcmVzdG9yZShwcm9qZWN0OiBQcm9qZWN0LCBiYWNrdXBQYXRoOiBzdHJpbmcsIG91dHB1dFBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgZGlyTmFtZSA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5bJ2JsaXR6J10gPyAnZGInIDogJ3ByaXNtYSc7XG4gICAgcmV0dXJuIGBybSAtUmYgJHtkaXJOYW1lfS9yZXN0b3JlZC5zcWxpdGUzOyBHT09HTEVfQVBQTElDQVRJT05fQ1JFREVOVElBTFM9Z2NwLXNhLWtleS5qc29uIGxpdGVzdHJlYW0gcmVzdG9yZSAtbyAke291dHB1dFBhdGh9ICR7YmFja3VwUGF0aH1gO1xuICB9XG5cbiAgc2VlZChwcm9qZWN0OiBQcm9qZWN0LCBzY3JpcHRQYXRoPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LlsnYmxpdHonXSlcbiAgICAgIHJldHVybiBgWUFSTiBibGl0eiBkYiBzZWVkJHtzY3JpcHRQYXRoID8gYCAtZiAke3NjcmlwdFBhdGh9YCA6ICcnfWA7XG4gICAgaWYgKHNjcmlwdFBhdGgpIHJldHVybiAnQlVOIGJ1aWxkLXRzIHJ1biBwcmlzbWEvc2VlZHMudHMnO1xuICAgIGlmICgocHJvamVjdC5wYWNrYWdlSnNvbi5wcmlzbWEgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHVuZGVmaW5lZCk/Llsnc2VlZCddKSByZXR1cm4gYFlBUk4gcHJpc21hIGRiIHNlZWRgO1xuICAgIHJldHVybiBgaWYgWyAtZSBcInByaXNtYS9zZWVkcy50c1wiIF07IHRoZW4gQlVOIGJ1aWxkLXRzIHJ1biBwcmlzbWEvc2VlZHMudHM7IGZpYDtcbiAgfVxuXG4gIHN0dWRpbyhfOiBQcm9qZWN0LCBkYlVybE9yUGF0aD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IHByZWZpeCA9ICcnO1xuICAgIGlmIChkYlVybE9yUGF0aCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbmV3IFVSTChkYlVybE9yUGF0aCk7XG4gICAgICAgIHByZWZpeCA9IGBEQVRBQkFTRV9VUkw9JHtkYlVybE9yUGF0aH0gYDtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSBwYXRoLnJlc29sdmUoZGJVcmxPclBhdGgpO1xuICAgICAgICBjb25zb2xlLmluZm8oZGJVcmxPclBhdGgsIGFic29sdXRlUGF0aCk7XG4gICAgICAgIHByZWZpeCA9IGBEQVRBQkFTRV9VUkw9ZmlsZTovLyR7YWJzb2x1dGVQYXRofSBgO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYCR7cHJlZml4fVBSSVNNQSBzdHVkaW9gO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBwcmlzbWFTY3JpcHRzID0gbmV3IFByaXNtYVNjcmlwdHMoKTtcbiIsImltcG9ydCB7IHNwYXduU3luYyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCBraWxsUG9ydFByb2Nlc3MgZnJvbSAna2lsbC1wb3J0JztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkLCBwcmludFN0YXJ0IH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuXG5jb25zdCBraWxsZWQgPSBuZXcgU2V0PG51bWJlciB8IHN0cmluZz4oKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGtpbGxQb3J0UHJvY2Vzc0ltbWVkaWF0ZWx5QW5kT25FeGl0KHBvcnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBraWxsUG9ydFByb2Nlc3NIYW5kbGluZ0Vycm9ycyhwb3J0KTtcbiAgY29uc3Qga2lsbEZ1bmMgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgaWYgKGtpbGxlZC5oYXMocG9ydCkpIHJldHVybjtcblxuICAgIGtpbGxlZC5hZGQocG9ydCk7XG4gICAgYXdhaXQga2lsbFBvcnRQcm9jZXNzSGFuZGxpbmdFcnJvcnMocG9ydCk7XG4gIH07XG4gIGZvciAoY29uc3Qgc2lnbmFsIG9mIFsnYmVmb3JlRXhpdCcsICdTSUdJTlQnLCAnU0lHVEVSTScsICdTSUdRVUlUJ10pIHtcbiAgICBwcm9jZXNzLm9uKHNpZ25hbCwga2lsbEZ1bmMpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGtpbGxQb3J0UHJvY2Vzc0hhbmRsaW5nRXJyb3JzKHBvcnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGF3YWl0IGtpbGxQb3J0UHJvY2Vzcyhwb3J0KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmNPbkV4aXQoc2NyaXB0OiBzdHJpbmcsIHByb2plY3Q6IFByb2plY3QpOiB2b2lkIHtcbiAgY29uc3Qga2lsbEZ1bmMgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgaWYgKGtpbGxlZC5oYXMoc2NyaXB0KSkgcmV0dXJuO1xuXG4gICAga2lsbGVkLmFkZChzY3JpcHQpO1xuICAgIHByaW50U3RhcnQoc2NyaXB0LCBwcm9qZWN0KTtcbiAgICBjb25zdCB7IHN0YXR1cyB9ID0gc3Bhd25TeW5jKHNjcmlwdCwgeyBjd2Q6IHByb2plY3QuZGlyUGF0aCwgc2hlbGw6IHRydWUsIHN0ZGlvOiAnaW5oZXJpdCcgfSk7XG4gICAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChzY3JpcHQsIHN0YXR1cywge30pO1xuICB9O1xuICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ2JlZm9yZUV4aXQnLCAnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddKSB7XG4gICAgcHJvY2Vzcy5vbihzaWduYWwsIGtpbGxGdW5jKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgUHJvbWlzZVBvb2wgfSBmcm9tICdtaW5pbWFsLXByb21pc2UtcG9vbCc7XG5cbmV4cG9ydCBjb25zdCBwcm9taXNlUG9vbCA9IG5ldyBQcm9taXNlUG9vbCgpO1xuIiwiaW1wb3J0IHsgc3Bhd25Bc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsga2lsbFBvcnRQcm9jZXNzSW1tZWRpYXRlbHlBbmRPbkV4aXQgfSBmcm9tICcuLi91dGlscy9wcm9jZXNzLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgaXNSdW5uaW5nT25CdW4sIHBhY2thZ2VNYW5hZ2VyV2l0aEFyZ3MgfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxuaW50ZXJmYWNlIE9wdGlvbnMge1xuICBleGl0SWZGYWlsZWQ/OiBib29sZWFuO1xuICB0aW1lb3V0PzogbnVtYmVyO1xufVxuXG5jb25zdCBkZWZhdWx0T3B0aW9uczogT3B0aW9ucyA9IHtcbiAgZXhpdElmRmFpbGVkOiB0cnVlLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bldpdGhTcGF3bihcbiAgc2NyaXB0OiBzdHJpbmcsXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4+LFxuICBvcHRzOiBPcHRpb25zID0gZGVmYXVsdE9wdGlvbnNcbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IFtwcmludGFibGVTY3JpcHQsIHJ1bm5hYmxlU2NyaXB0XSA9IG5vcm1hbGl6ZVNjcmlwdChzY3JpcHQsIHByb2plY3QpO1xuICBwcmludFN0YXJ0KHByaW50YWJsZVNjcmlwdCwgcHJvamVjdCk7XG4gIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICBwcmludFN0YXJ0KHJ1bm5hYmxlU2NyaXB0LCBwcm9qZWN0LCAnU3RhcnQgKHJhdyknLCB0cnVlKTtcbiAgfVxuICBpZiAoYXJndi5kcnlSdW4pIHtcbiAgICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKHByaW50YWJsZVNjcmlwdCwgMCwgb3B0cyk7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBjb25zdCBwb3J0ID0gcnVubmFibGVTY3JpcHQubWF0Y2goL2h0dHAtZ2V0OlxcL1xcLzEyNy4wLjAuMTooXFxkKykvKT8uWzFdO1xuICBpZiAocnVubmFibGVTY3JpcHQuaW5jbHVkZXMoJ3dhaXQtb24nKSAmJiBwb3J0ICYmICFydW5uYWJsZVNjcmlwdC5pbmNsdWRlcygnZG9ja2VyIHJ1bicpKSB7XG4gICAgYXdhaXQga2lsbFBvcnRQcm9jZXNzSW1tZWRpYXRlbHlBbmRPbkV4aXQoTnVtYmVyKHBvcnQpKTtcbiAgfVxuICBjb25zdCByZXQgPSBhd2FpdCBzcGF3bkFzeW5jKHJ1bm5hYmxlU2NyaXB0LCB1bmRlZmluZWQsIHtcbiAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICBlbnY6IHByb2plY3QuZW52LFxuICAgIHNoZWxsOiB0cnVlLFxuICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgdGltZW91dDogb3B0cz8udGltZW91dCxcbiAgICBraWxsT25FeGl0OiB0cnVlLFxuICAgIHZlcmJvc2U6IGFyZ3YudmVyYm9zZSxcbiAgfSk7XG4gIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQocHJpbnRhYmxlU2NyaXB0LCByZXQuc3RhdHVzLCBvcHRzKTtcbiAgcmV0dXJuIHJldC5zdGF0dXMgPz8gMTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoXG4gIHNjcmlwdDogc3RyaW5nLFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+PixcbiAgb3B0czogT3B0aW9ucyA9IGRlZmF1bHRPcHRpb25zXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIHByb21pc2VQb29sLnJ1bihhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgW3ByaW50YWJsZVNjcmlwdCwgcnVubmFibGVTY3JpcHRdID0gbm9ybWFsaXplU2NyaXB0KHNjcmlwdCwgcHJvamVjdCk7XG4gICAgcHJpbnRTdGFydChwcmludGFibGVTY3JpcHQsIHByb2plY3QsICdTdGFydCAocGFyYWxsZWwpJywgdHJ1ZSk7XG4gICAgaWYgKGFyZ3YuZHJ5UnVuKSB7XG4gICAgICBwcmludFN0YXJ0KHByaW50YWJsZVNjcmlwdCwgcHJvamVjdCwgJ1N0YXJ0ZWQgKGxvZyknKTtcbiAgICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgICAgcHJpbnRTdGFydChydW5uYWJsZVNjcmlwdCwgcHJvamVjdCwgJ1N0YXJ0ZWQgKHJhdyknLCB0cnVlKTtcbiAgICAgIH1cbiAgICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQocHJpbnRhYmxlU2NyaXB0LCAwLCBvcHRzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByZXQgPSBhd2FpdCBzcGF3bkFzeW5jKHJ1bm5hYmxlU2NyaXB0LCB1bmRlZmluZWQsIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBwcm9qZWN0LmVudixcbiAgICAgIHNoZWxsOiB0cnVlLFxuICAgICAgc3RkaW86ICdwaXBlJyxcbiAgICAgIHRpbWVvdXQ6IG9wdHM/LnRpbWVvdXQsXG4gICAgICBtZXJnZU91dEFuZEVycm9yOiB0cnVlLFxuICAgICAga2lsbE9uRXhpdDogdHJ1ZSxcbiAgICAgIHZlcmJvc2U6IGFyZ3YudmVyYm9zZSxcbiAgICB9KTtcbiAgICBwcmludFN0YXJ0KHByaW50YWJsZVNjcmlwdCwgcHJvamVjdCwgJ1N0YXJ0ZWQgKGxvZyknKTtcbiAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICBwcmludFN0YXJ0KHJ1bm5hYmxlU2NyaXB0LCBwcm9qZWN0LCAnU3RhcnRlZCAocmF3KScsIHRydWUpO1xuICAgIH1cbiAgICBjb25zdCBvdXQgPSByZXQuc3Rkb3V0LnRyaW0oKTtcbiAgICBpZiAob3V0KSBjb25zb2xlLmluZm8ob3V0KTtcbiAgICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKHByaW50YWJsZVNjcmlwdCwgcmV0LnN0YXR1cywgb3B0cyk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVTY3JpcHQoc2NyaXB0OiBzdHJpbmcsIHByb2plY3Q6IFByb2plY3QpOiBbc3RyaW5nLCBzdHJpbmddIHtcbiAgbGV0IG5ld1NjcmlwdCA9IHNjcmlwdFxuICAgIC5yZXBsYWNlQWxsKCdcXG4nLCAnJylcbiAgICAucmVwbGFjZUFsbCgvXFxzXFxzKy9nLCAnICcpXG4gICAgLnJlcGxhY2VBbGwoJ1BSSVNNQSAnLCBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uWydibGl0eiddID8gJ1lBUk4gYmxpdHogcHJpc21hICcgOiAnWUFSTiBwcmlzbWEgJylcbiAgICAucmVwbGFjZUFsbCgnQlVOICcsIHByb2plY3QuaXNCdW5BdmFpbGFibGUgPyAnYnVuIC0tYnVuIHJ1biAnIDogJ1lBUk4gJyk7XG4gIGlmIChpc1J1bm5pbmdPbkJ1bikge1xuICAgIG5ld1NjcmlwdCA9IG5ld1NjcmlwdFxuICAgICAgLnJlcGxhY2VBbGwoJ2J1aWxkLXRzIHJ1bicsICdidW4gLS1idW4gcnVuJylcbiAgICAgIC5yZXBsYWNlQWxsKCdkaXN0L2luZGV4LmpzJywgJ3NyYy9pbmRleC50cycpXG4gICAgICAucmVwbGFjZUFsbCgvKFlBUk4gKT92aXRlc3QgcnVuL2csICdidW4gdGVzdCcpXG4gICAgICAucmVwbGFjZUFsbCgnIC0tY29sb3IgLS1wYXNzV2l0aE5vVGVzdHMgLS1hbGxvd09ubHknLCAnJyk7XG4gIH1cbiAgbmV3U2NyaXB0ID0gbmV3U2NyaXB0LnRyaW0oKTtcbiAgcmV0dXJuIFtcbiAgICBuZXdTY3JpcHQucmVwbGFjZUFsbCgnWUFSTiAnLCBgJHtwYWNrYWdlTWFuYWdlcldpdGhBcmdzfSBgKSxcbiAgICBuZXdTY3JpcHQucmVwbGFjZUFsbCgnWUFSTiAnLCAhaXNSdW5uaW5nT25CdW4gJiYgcHJvamVjdC5iaW5FeGlzdHMgPyAnJyA6IGAke3BhY2thZ2VNYW5hZ2VyV2l0aEFyZ3N9IGApLFxuICBdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0OiBzdHJpbmcsIHByb2plY3Q6IFByb2plY3QsIHByZWZpeCA9ICdTdGFydCcsIHdlYWsgPSBmYWxzZSk6IHZvaWQge1xuICBjb25zb2xlLmluZm8oXG4gICAgJ1xcbicgK1xuICAgICAgKHdlYWsgPyBjaGFsay5ncmF5IDogY2hhbGsuY3lhbikoY2hhbGsuYm9sZChgJHtwcmVmaXh9OmApLCBub3JtYWxpemVkU2NyaXB0KSArXG4gICAgICBjaGFsay5ncmF5KGAgYXQgJHtwcm9qZWN0LmRpclBhdGh9YClcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQoXG4gIHNjcmlwdDogc3RyaW5nLFxuICBleGl0Q29kZTogbnVtYmVyIHwgbnVsbCxcbiAgb3B0czogT21pdDxPcHRpb25zLCAndGltZW91dCc+XG4pOiB2b2lkIHtcbiAgaWYgKGV4aXRDb2RlID09PSAwKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKGNoYWxrLmJvbGQoJ0ZpbmlzaGVkOicpLCBzY3JpcHQpKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsucmVkKGNoYWxrLmJvbGQoYEZhaWxlZCAoZXhpdCBjb2RlICR7ZXhpdENvZGV9KTogYCksIHNjcmlwdCkpO1xuICAgIGlmIChvcHRzLmV4aXRJZkZhaWxlZCAhPT0gZmFsc2UpIHtcbiAgICAgIHByb2Nlc3MuZXhpdChleGl0Q29kZSA/PyAxKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgRW52UmVhZGVyT3B0aW9ucyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZEFsbFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBwcmlzbWFTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9wcmlzbWFTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcblxuaW1wb3J0IHsgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kVXRpbHMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBwcmlzbWFDb21tYW5kOiBDb21tYW5kTW9kdWxlID0ge1xuICBjb21tYW5kOiAncHJpc21hJyxcbiAgZGVzY3JpYmU6ICdSdW4gcHJpc21hIGNvbW1hbmRzJyxcbiAgYnVpbGRlcjogKHlhcmdzKSA9PiB7XG4gICAgcmV0dXJuIHlhcmdzXG4gICAgICAuY29tbWFuZChkZXBsb3lDb21tYW5kKVxuICAgICAgLmNvbW1hbmQoZGVwbG95Rm9yY2VDb21tYW5kKVxuICAgICAgLmNvbW1hbmQobGl0ZXN0cmVhbUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChtaWdyYXRlQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKG1pZ3JhdGVEZXZDb21tYW5kKVxuICAgICAgLmNvbW1hbmQocmVzZXRDb21tYW5kKVxuICAgICAgLmNvbW1hbmQocmVzdG9yZUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChzZWVkQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKHN0dWRpb0NvbW1hbmQpXG4gICAgICAuY29tbWFuZChkZWZhdWx0Q29tbWFuZClcbiAgICAgIC5kZW1hbmRDb21tYW5kKCk7XG4gIH0sXG4gIGhhbmRsZXIoKSB7XG4gICAgLy8gRG8gbm90aGluZ1xuICB9LFxufTtcblxuY29uc3QgZGVwbG95Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdkZXBsb3knLFxuICBkZXNjcmliZTogJ0FwcGx5IG1pZ3JhdGlvbiB0byBEQiB3aXRob3V0IGluaXRpYWxpemluZyBpdCcsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSBkZXBsb3knLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLmRlcGxveShwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgZGVwbG95Rm9yY2VCdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICAnYmFja3VwLXBhdGgnOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHNraXAgYWN0dWFsIGNvbW1hbmQgZXhlY3V0aW9uJyxcbiAgICBkZW1hbmRPcHRpb246IHRydWUsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICdiJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IGRlcGxveUZvcmNlQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBkZXBsb3lGb3JjZUJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2RlcGxveS1mb3JjZSA8YmFja3VwLXBhdGg+JyxcbiAgZGVzY3JpYmU6IFwiRm9yY2UgdG8gYXBwbHkgbWlncmF0aW9uIHRvIERCIHV0aWxpemluZyBMaXRlc3RyZWFtJ3MgYmFja3VwIHdpdGhvdXQgaW5pdGlhbGl6aW5nIGl0XCIsXG4gIGJ1aWxkZXI6IGRlcGxveUZvcmNlQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIGRlcGxveS1mb3JjZScsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMuZGVwbG95Rm9yY2UocHJvamVjdCwgYXJndi5iYWNrdXBQYXRoKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgbGl0ZXN0cmVhbUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnbGl0ZXN0cmVhbScsXG4gIGRlc2NyaWJlOiAnU2V0dXAgREIgZm9yIExpdGVzdHJlYW0nLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgbGl0ZXN0cmVhbScsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMubGl0ZXN0cmVhbShwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgbWlncmF0ZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnbWlncmF0ZScsXG4gIGRlc2NyaWJlOiAnQXBwbHkgbWlncmF0aW9uIHRvIERCIHdpdGggaW5pdGlhbGl6aW5nIGl0JyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIG1pZ3JhdGUnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLm1pZ3JhdGUocHJvamVjdCksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IG1pZ3JhdGVEZXZDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ21pZ3JhdGUtZGV2JyxcbiAgZGVzY3JpYmU6ICdDcmVhdGUgYSBtaWdyYXRpb24gZmlsZScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSBtaWdyYXRlLWRldicsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMubWlncmF0ZURldihwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgcmVzZXRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3Jlc2V0JyxcbiAgZGVzY3JpYmU6ICdSZXNldCBEQicsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSByZXNldCcsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMucmVzZXQocHJvamVjdCksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IHJlc3RvcmVCdWlsZGVyID0ge1xuICAuLi5kZXBsb3lGb3JjZUJ1aWxkZXIsXG4gIG91dHB1dDoge1xuICAgIGRlc2NyaXB0aW9uOiAnT3V0cHV0IHBhdGggb2YgdGhlIHJlc3RvcmVkIGRhdGFiYXNlLiBEZWZhdWx0cyB0byBcIjxkYnxwcmlzbWE+L3Jlc3RvcmVkLnNxbGl0ZTNcIi4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgcmVzdG9yZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgcmVzdG9yZUJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3Jlc3RvcmUgPGJhY2t1cC1wYXRoPicsXG4gIGRlc2NyaWJlOiBcIlJlc3RvcmUgREIgZnJvbSBMaXRlc3RyZWFtJ3MgYmFja3VwXCIsXG4gIGJ1aWxkZXI6IHJlc3RvcmVCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgcmVzdG9yZScsIGFsbFByb2plY3RzKSkge1xuICAgICAgY29uc3Qgb3V0cHV0ID1cbiAgICAgICAgYXJndi5vdXRwdXQgfHxcbiAgICAgICAgKHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5bJ2JsaXR6J10gPyAnZGIvcmVzdG9yZWQuc3FsaXRlMycgOiAncHJpc21hL3Jlc3RvcmVkLnNxbGl0ZTMnKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLnJlc3RvcmUocHJvamVjdCwgYXJndi5iYWNrdXBQYXRoLCBvdXRwdXQpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBzZWVkQnVpbGRlciA9IHtcbiAgLi4uYnVpbGRlcixcbiAgZmlsZToge1xuICAgIGFsaWFzOiAnZicsXG4gICAgZGVzY3JpcHRpb246ICdQYXRoIG9mIHRoZSBzZWVkIHNjcmlwdC4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3Qgc2VlZENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2VlZEJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3NlZWQnLFxuICBkZXNjcmliZTogJ1BvcHVsYXRlIERCIHdpdGggc2VlZCBkYXRhJyxcbiAgYnVpbGRlcjogc2VlZEJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSBzZWVkJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5zZWVkKHByb2plY3QsIGFyZ3YuZmlsZSksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IHN0dWRpb0J1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gICdkYi11cmwtb3ItcGF0aCc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1VSTCBvciBwYXRoIHRvIHRoZSBkYXRhYmFzZScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG4gIHJlc3RvcmVkOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIG9wZW4gdGhlIGRlZmF1bHQgcmVzdG9yZWQgZGF0YWJhc2UgKDxkYnxwcmlzbWE+L3Jlc3RvcmVkLnNxbGl0ZTMpLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3Qgc3R1ZGlvQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzdHVkaW9CdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzdHVkaW8gW2RiLXVybC1vci1wYXRoXScsXG4gIGRlc2NyaWJlOiAnT3BlbiBQcmlzbWEgU3R1ZGlvJyxcbiAgYnVpbGRlcjogc3R1ZGlvQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgaWYgKGFyZ3YucmVzdG9yZWQgJiYgYXJndi5kYlVybE9yUGF0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgY2Fubm90IHNwZWNpZnkgYm90aCAtLXJlc3RvcmVkIGFuZCAtLWRiLXVybC1vci1wYXRoLicpO1xuICAgIH1cblxuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSBzdHVkaW8nLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGNvbnN0IGRiVXJsT3JQYXRoID0gYXJndi5yZXN0b3JlZFxuICAgICAgICA/IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5bJ2JsaXR6J11cbiAgICAgICAgICA/ICdkYi9yZXN0b3JlZC5zcWxpdGUzJ1xuICAgICAgICAgIDogJ3ByaXNtYS9yZXN0b3JlZC5zcWxpdGUzJ1xuICAgICAgICA6IGFyZ3YuZGJVcmxPclBhdGg/LnRvU3RyaW5nKCk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5zdHVkaW8ocHJvamVjdCwgZGJVcmxPclBhdGgpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBkZWZhdWx0Q29tbWFuZEJ1aWxkZXIgPSB7IGFyZ3M6IHsgdHlwZTogJ2FycmF5JyB9IH0gYXMgY29uc3Q7XG5cbmNvbnN0IGRlZmF1bHRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGRlZmF1bHRDb21tYW5kQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnJDAgW2FyZ3MuLl0nLFxuICBkZXNjcmliZTogJ1Bhc3MgdGhlIGNvbW1hbmQgYW5kIGFyZ3VtZW50cyB0byBwcmlzbWEgYXMgaXMnLFxuICBidWlsZGVyOiBkZWZhdWx0Q29tbWFuZEJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHNjcmlwdCA9IGAke2FyZ3YuYXJncz8uam9pbignICcpID8/ICcnfWAudHJpbUVuZCgpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoYHByaXNtYSAke3NjcmlwdH1gLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgUFJJU01BICR7c2NyaXB0fWAsIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmFzeW5jIGZ1bmN0aW9uIGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2OiBFbnZSZWFkZXJPcHRpb25zKTogUHJvbWlzZTxQcm9qZWN0W10+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kQWxsUHJvamVjdHMoYXJndik7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgY29uc3QgZmlsdGVyZWQgPSBwcm9qZWN0cy5hbGwuZmlsdGVyKFxuICAgIChwcm9qZWN0KSA9PiBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uWydwcmlzbWEnXSB8fCBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8uWydwcmlzbWEnXVxuICApO1xuICBpZiAoZmlsdGVyZWQubGVuZ3RoID09PSAwKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByaXNtYSBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbiAgcmV0dXJuIGZpbHRlcmVkO1xufVxuIiwiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24gfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICByZXRyeToge1xuICAgIGRlc2NyaXB0aW9uOiAnQSBtYXhpbXVtIHJldHJ5IGNvdW50JyxcbiAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICBhbGlhczogJ3InLFxuICAgIGRlZmF1bHQ6IDMsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBhcmd1bWVudHNCdWlsZGVyID0ge1xuICBjb21tYW5kOiB7XG4gICAgZGVzY3JpcHRpb246ICdBIGNvbW1hbmQgdG8gcmV0cnknLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxuICBhcmdzOiB7XG4gICAgZGVzY3JpcHRpb246ICdBcmd1bWVudHMgZm9yIHRoZSBjb21tYW5kJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IHJldHJ5Q29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ3JldHJ5IFtjb21tYW5kXSBbYXJncy4uLl0nLFxuICBkZXNjcmliZTogJ1JldHJ5IHRoZSBnaXZlbiBjb21tYW5kIHVudGlsIGl0IHN1Y2NlZWRzJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2KTtcbiAgICBpZiAoIXByb2plY3QpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBjbWRBbmRBcmdzID0gW2FyZ3YuY29tbWFuZCwgLi4uKGFyZ3YuYXJncyA/PyBbXSksIC4uLmFyZ3YuXy5zbGljZSgxKV0uZmlsdGVyKEJvb2xlYW4pO1xuICAgIGxldCBsYXN0U3RhdHVzID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3YucmV0cnk7IGkrKykge1xuICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhgXFxuJHtjaGFsay55ZWxsb3coYCMke2l9IFJldHJ5aW5nOiAke2NtZEFuZEFyZ3Muam9pbignICcpfWApfWApO1xuICAgICAgfVxuICAgICAgLy8gVE9ETzogc2hvdWxkIHdlIGFkZCBzaW5nbGUgcXVvdGVzIGFyb3VuZCBlYWNoIGFyZ3VtZW50P1xuICAgICAgbGFzdFN0YXR1cyA9IGF3YWl0IHJ1bldpdGhTcGF3bihjbWRBbmRBcmdzLmpvaW4oJyAnKSwgcHJvamVjdCwgYXJndiwge1xuICAgICAgICBleGl0SWZGYWlsZWQ6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgICBpZiAobGFzdFN0YXR1cyA9PT0gMCkgcmV0dXJuO1xuICAgIH1cbiAgICBwcm9jZXNzLmV4aXQobGFzdFN0YXR1cyk7XG4gIH0sXG59O1xuIiwiZXhwb3J0IGNvbnN0IGh0dHBTZXJ2ZXJQYWNrYWdlcyA9IFsnZXhwcmVzcycsICdmYXN0aWZ5JywgJ2VseXNpYSddO1xuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBvcyBmcm9tICdub2RlOm9zJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kQWxsUHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biwgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgaXNSdW5uaW5nT25CdW4gfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxuaW1wb3J0IHsgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kVXRpbHMuanMnO1xuaW1wb3J0IHsgaHR0cFNlcnZlclBhY2thZ2VzIH0gZnJvbSAnLi9jb25zdGFudHMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBzZXR1cENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc2V0dXAnLFxuICBkZXNjcmliZTogJ1NldHVwIGRldmVsb3BtZW50IGVudmlyb25tZW50LiAuZW52IGZpbGVzIGFyZSBpZ25vcmVkLicsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IHNldHVwKGFyZ3YpO1xuICB9LFxufTtcblxuLy8gVGVzdCBjb2RlIHJlcXVpcmVzIFBhcnRpYWw8Li4uPlxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwKFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+LFxuICBwcm9qZWN0UGF0aEZvclRlc3Rpbmc/OiBzdHJpbmdcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmRBbGxQcm9qZWN0cyhhcmd2LCBmYWxzZSwgcHJvamVjdFBhdGhGb3JUZXN0aW5nKTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdzZXR1cCcsIHByb2plY3RzLmFsbCkpIHtcbiAgICBjb25zdCBkaXJlbnRzID0gYXdhaXQgZnMucmVhZGRpcihwcm9qZWN0LmRpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICBpZiAocHJvamVjdCA9PT0gcHJvamVjdHMucm9vdCkge1xuICAgICAgaWYgKG9zLnBsYXRmb3JtKCkgPT09ICdkYXJ3aW4nKSB7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VzID0gWydwc3RyZWUnXTtcbiAgICAgICAgaWYgKHByb2plY3QuaGFzRG9ja2VyZmlsZSkge1xuICAgICAgICAgIHBhY2thZ2VzLnB1c2goJ2V4cGVjdCcpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYGJyZXcgaW5zdGFsbCAke3BhY2thZ2VzLmpvaW4oJyAnKX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRpcmVudHMuc29tZSgoZCkgPT4gZC5pc0ZpbGUoKSAmJiBkLm5hbWUuaW5jbHVkZXMoJy12ZXJzaW9uJykpKSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bignYXNkZiBpbnN0YWxsJywgcHJvamVjdCwgYXJndik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGRpcmVudHMuc29tZSgoZCkgPT4gZC5pc0ZpbGUoKSAmJiBkLm5hbWUgPT09ICdweXByb2plY3QudG9tbCcpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKCdwb2V0cnkgY29uZmlnIHZpcnR1YWxlbnZzLmluLXByb2plY3QgdHJ1ZScsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCgncG9ldHJ5IGNvbmZpZyB2aXJ0dWFsZW52cy5wcmVmZXItYWN0aXZlLXB5dGhvbiB0cnVlJywgcHJvamVjdCwgYXJndik7XG4gICAgICBjb25zdCBbLCB2ZXJzaW9uXSA9IGNoaWxkX3Byb2Nlc3MuZXhlY1N5bmMoJ2FzZGYgY3VycmVudCBweXRob24nKS50b1N0cmluZygpLnRyaW0oKS5zcGxpdCgvXFxzKy8pO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChgcG9ldHJ5IGVudiB1c2UgJHt2ZXJzaW9ufWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKCdwb2V0cnkgcnVuIHBpcCBpbnN0YWxsIC0tdXBncmFkZSBwaXAnLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bigncG9ldHJ5IGluc3RhbGwgLS1hbnNpJywgcHJvamVjdCwgYXJndik7XG4gICAgfVxuXG4gICAgY29uc3QgZGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgIGNvbnN0IGRldkRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyB8fCB7fTtcbiAgICBjb25zdCBzY3JpcHRzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzID8/IHt9O1xuICAgIGNvbnN0IG5ld0RlcHM6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IG5ld0RldkRlcHM6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKGRlcHNbJ2JsaXR6J10gfHwgZGVwc1snbmV4dCddKSB7XG4gICAgICBuZXdEZXBzLnB1c2goJ3BtMicpO1xuICAgICAgbmV3RGV2RGVwcy5wdXNoKCdjb25jdXJyZW50bHknLCAnb3Blbi1jbGknLCAndml0ZXN0JywgJ3dhaXQtb24nKTtcbiAgICB9IGVsc2UgaWYgKGRldkRlcHNbJ0ByZW1peC1ydW4vZGV2J10pIHtcbiAgICAgIG5ld0RlcHMucHVzaCgncG0yJyk7XG4gICAgICBuZXdEZXZEZXBzLnB1c2goJ2NvbmN1cnJlbnRseScsICdvcGVuLWNsaScsICd2aXRlc3QnLCAnd2FpdC1vbicpO1xuICAgIH0gZWxzZSBpZiAoaHR0cFNlcnZlclBhY2thZ2VzLnNvbWUoKHApID0+IGRlcHNbcF0pKSB7XG4gICAgICBuZXdEZXBzLnB1c2goJ3BtMicpO1xuICAgICAgbmV3RGV2RGVwcy5wdXNoKCdjb25jdXJyZW50bHknLCAndml0ZXN0JywgJ3dhaXQtb24nKTtcbiAgICB9XG4gICAgaWYgKGlzUnVubmluZ09uQnVuKSB7XG4gICAgICBuZXdEZXZEZXBzID0gbmV3RGV2RGVwcy5maWx0ZXIoKGRlcCkgPT4gZGVwICE9PSAndml0ZXN0Jyk7XG4gICAgfVxuICAgIGlmIChuZXdEZXBzLmxlbmd0aCA+IDApIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgeWFybiBhZGQgJHtuZXdEZXBzLmpvaW4oJyAnKX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gICAgaWYgKG5ld0RldkRlcHMubGVuZ3RoID4gMCkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGB5YXJuIGFkZCAtRCAke25ld0RldkRlcHMuam9pbignICcpfWAsIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgICBpZiAoc2NyaXB0c1snZ2VuLWNvZGUnXSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKCd5YXJuIGdlbi1jb2RlJywgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHNwYXduU3luY09uRXhpdCB9IGZyb20gJy4uL3V0aWxzL3Byb2Nlc3MuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgRG9ja2VyIGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBEb2NrZXJTY3JpcHRzIHtcbiAgYnVpbGREZXZJbWFnZShwcm9qZWN0OiBQcm9qZWN0LCB2ZXJzaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIGUuZy4gY29kaW5nLWJvb3N0ZXIgdXNlcyBgXCJkb2NrZXIvYnVpbGQvcHJlcGFyZVwiOiBcInRvdWNoIGRyaWxsLXVzZXJzLmNzdlwiLGBcbiAgICBjb25zdCBwcmVmaXggPSBwcm9qZWN0LmRvY2tlclBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZG9ja2VyL2J1aWxkL3ByZXBhcmUnXVxuICAgICAgPyAneWFybiBydW4gZG9ja2VyL2J1aWxkL3ByZXBhcmUgJiYgJ1xuICAgICAgOiAnJztcbiAgICByZXR1cm4gYGNkICR7cGF0aC5kaXJuYW1lKHByb2plY3QuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSl9XG4gICAgJiYgJHtwcmVmaXh9WUFSTiB3YiBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkIC0tb3V0c2lkZVxuICAgICYmIFlBUk4gd2IgcmV0cnkgLS0gZG9ja2VyIGJ1aWxkIC10ICR7cHJvamVjdC5kb2NrZXJJbWFnZU5hbWV9XG4gICAgICAgIC0tYnVpbGQtYXJnIEFSQ0g9JChbICQodW5hbWUgLW0pID0gJ2FybTY0JyBdICYmIGVjaG8gYXJtNjQgfHwgZWNobyBhbWQ2NClcbiAgICAgICAgLS1idWlsZC1hcmcgV0JfRU5WPSR7cHJvamVjdC5lbnYuV0JfRU5WfVxuICAgICAgICAtLWJ1aWxkLWFyZyBXQl9WRVJTSU9OPSR7dmVyc2lvbn0gLmA7XG4gIH1cbiAgc3RvcEFuZFN0YXJ0KHByb2plY3Q6IFByb2plY3QsIHVuYnVmZmVyID0gZmFsc2UsIGFkZGl0aW9uYWxPcHRpb25zID0gJycsIGFkZGl0aW9uYWxBcmdzID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLnN0b3AocHJvamVjdCl9ICYmICR7dW5idWZmZXIgPyAndW5idWZmZXIgJyA6ICcnfSR7dGhpcy5zdGFydChcbiAgICAgIHByb2plY3QsXG4gICAgICBhZGRpdGlvbmFsT3B0aW9ucyxcbiAgICAgIGFkZGl0aW9uYWxBcmdzXG4gICAgKX1gO1xuICB9XG4gIHN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycsIGFkZGl0aW9uYWxBcmdzID0gJycpOiBzdHJpbmcge1xuICAgIHNwYXduU3luY09uRXhpdCh0aGlzLnN0b3AocHJvamVjdCksIHByb2plY3QpO1xuICAgIHJldHVybiBgZG9ja2VyIHJ1biAtLXJtIC1pdCAtcCA4MDgwOjgwODAgLS1uYW1lICR7cHJvamVjdC5kb2NrZXJJbWFnZU5hbWV9ICR7YWRkaXRpb25hbE9wdGlvbnN9ICR7cHJvamVjdC5kb2NrZXJJbWFnZU5hbWV9ICR7YWRkaXRpb25hbEFyZ3N9YDtcbiAgfVxuXG4gIHN0b3AocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGB0cnVlICQoZG9ja2VyIHJtIC1mICQoZG9ja2VyIGNvbnRhaW5lciBscyAtcSAtZiBuYW1lPSR7cHJvamVjdC5kb2NrZXJJbWFnZU5hbWV9KSAyPiAvZGV2L251bGwpYDtcbiAgfVxuXG4gIHN0b3BBbGwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYHRydWUgJChkb2NrZXIgcm0gLWYgJChkb2NrZXIgcHMgLXEpIDI+IC9kZXYvbnVsbClgO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBkb2NrZXJTY3JpcHRzID0gbmV3IERvY2tlclNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgVGVzdEFyZ3YgfSBmcm9tICcuLi8uLi9jb21tYW5kcy90ZXN0LmpzJztcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vZG9ja2VyU2NyaXB0cy5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVzdEUyRURldk9wdGlvbnMge1xuICAvLyAnLS1lMmUgZ2VuZXJhdGUnIGNhbGxzICdjb2RlZ2VuIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MCdcbiAgcGxheXdyaWdodEFyZ3M/OiBzdHJpbmc7XG4gIHN0YXJ0Q29tbWFuZD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUZXN0RTJFT3B0aW9ucyBleHRlbmRzIFRlc3RFMkVEZXZPcHRpb25zIHtcbiAgcHJpc21hRGlyZWN0b3J5Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgYW4gYXBwLlxuICogTm90ZSB0aGF0IFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlU2NyaXB0cyB7XG4gIHByb3RlY3RlZCBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGRlZmF1bHRQb3J0ID0gTnVtYmVyKHByb2Nlc3MuZW52LlBPUlQpIHx8IDMwMDApIHt9XG5cbiAgYnVpbGREb2NrZXIocHJvamVjdDogUHJvamVjdCwgdmVyc2lvbiA9ICdkZXZlbG9wbWVudCcpOiBzdHJpbmcge1xuICAgIHJldHVybiBkb2NrZXJTY3JpcHRzLmJ1aWxkRGV2SW1hZ2UocHJvamVjdCwgdmVyc2lvbik7XG4gIH1cblxuICBhYnN0cmFjdCBzdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nO1xuXG4gIGFic3RyYWN0IHN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2LCBwb3J0OiBudW1iZXIpOiBzdHJpbmc7XG5cbiAgc3RhcnREb2NrZXIocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuYnVpbGREb2NrZXIocHJvamVjdCl9XG4gICAgICAmJiBZQVJOIGNvbmN1cnJlbnRseSAtLXJhdyAtLWtpbGwtb3RoZXJzLW9uLWZhaWxcbiAgICAgICAgXCIke2RvY2tlclNjcmlwdHMuc3RvcEFuZFN0YXJ0KFxuICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgYXJndi5ub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQgPz8gJycsXG4gICAgICAgICAgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJydcbiAgICAgICAgKX1cIlxuICAgICAgICBcIiR7dGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0LCBhcmd2LCA4MDgwKX1cImA7XG4gIH1cblxuICB0ZXN0RTJFKFxuICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgYXJndjogVGVzdEFyZ3YsXG4gICAgeyBwbGF5d3JpZ2h0QXJncyA9ICd0ZXN0IHRlc3RzL2UyZScsIHByaXNtYURpcmVjdG9yeSwgc3RhcnRDb21tYW5kIH06IFRlc3RFMkVPcHRpb25zXG4gICk6IHN0cmluZyB7XG4gICAgLy8gQmFzaWNhbGx5LCBgcGxheXdyaWdodGAgKG5vdCBgeWFybiBwbGF5d3JpZ2h0YCkgc2hvdWxkIHdvcmssXG4gICAgLy8gYnV0IGl0IGRvZXNuJ3Qgd29yayBvbiBhIHByb2plY3QgZGVwZW5kaW5nIG9uIGBhcnRpbGxlcnktZW5naW5lLXBsYXl3cmlnaHRgLlxuICAgIC8vIFNvIHdlIHVzZSBgeWFybiBwbGF5d3JpZ2h0YCBpbnN0ZWFkIG9mIGBwbGF5d3JpZ2h0YCBoZXJlLlxuICAgIGNvbnN0IGVudiA9IHByb2plY3QuZW52LldCX0VOVjtcbiAgICByZXR1cm4gYFdCX0VOVj0ke2Vudn0gTkVYVF9QVUJMSUNfV0JfRU5WPSR7ZW52fSBBUFBfRU5WPSR7ZW52fSBQT1JUPTgwODAgWUFSTiBjb25jdXJyZW50bHkgLS1raWxsLW90aGVycyAtLXJhdyAtLXN1Y2Nlc3MgZmlyc3RcbiAgICAgIFwicm0gLVJmICR7cHJpc21hRGlyZWN0b3J5fS9tb3VudCAmJiAke3N0YXJ0Q29tbWFuZH0gJiYgZXhpdCAxXCJcbiAgICAgIFwiY29uY3VycmVudGx5IC0ta2lsbC1vdGhlcnMtb24tZmFpbCAtLXJhdyAnd2FpdC1vbiAtdCA2MDAwMDAgLWkgMjAwMCBodHRwLWdldDovLzEyNy4wLjAuMTo4MDgwJyAnQlVOIHBsYXl3cmlnaHQgaW5zdGFsbCAtLXdpdGgtZGVwcydcbiAgICAgICAgJiYgQlVOIHBsYXl3cmlnaHQgJHtwbGF5d3JpZ2h0QXJncy5yZXBsYWNlKCd0ZXN0cy9lMmUnLCBhcmd2LnRhcmdldCB8fCAndGVzdHMvZTJlJyl9XCJgO1xuICB9XG5cbiAgdGVzdEUyRURldihcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGFyZ3Y6IFRlc3RBcmd2LFxuICAgIHsgcGxheXdyaWdodEFyZ3MgPSAndGVzdCB0ZXN0cy9lMmUnLCBzdGFydENvbW1hbmQgfTogVGVzdEUyRURldk9wdGlvbnNcbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCBlbnYgPSBwcm9qZWN0LmVudi5XQl9FTlY7XG4gICAgcmV0dXJuIGBXQl9FTlY9JHtlbnZ9IE5FWFRfUFVCTElDX1dCX0VOVj0ke2Vudn0gQVBQX0VOVj0ke2Vudn0gUE9SVD04MDgwIFlBUk4gY29uY3VycmVudGx5IC0ta2lsbC1vdGhlcnMgLS1yYXcgLS1zdWNjZXNzIGZpcnN0XG4gICAgICBcIiR7c3RhcnRDb21tYW5kfSAmJiBleGl0IDFcIlxuICAgICAgXCJjb25jdXJyZW50bHkgLS1raWxsLW90aGVycy1vbi1mYWlsIC0tcmF3ICd3YWl0LW9uIC10IDYwMDAwMCAtaSAyMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOjgwODAnICdCVU4gcGxheXdyaWdodCBpbnN0YWxsIC0td2l0aC1kZXBzJ1xuICAgICAgICAmJiBCVU4gcGxheXdyaWdodCAke3BsYXl3cmlnaHRBcmdzLnJlcGxhY2UoJ3Rlc3RzL2UyZScsIGFyZ3YudGFyZ2V0IHx8ICd0ZXN0cy9lMmUnKX1cImA7XG4gIH1cblxuICBhYnN0cmFjdCB0ZXN0U3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZztcblxuICB0ZXN0VW5pdChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndik6IHN0cmluZyB7XG4gICAgLy8gU2luY2UgdGhpcyBjb21tYW5kIGlzIHJlZmVycmVkIGZyb20gb3RoZXIgY29tbWFuZHMsIHdlIGhhdmUgdG8gdXNlIFwidml0ZXN0IHJ1blwiIChub24taW50ZXJhY3RpdmUgbW9kZSkuXG4gICAgcmV0dXJuIGBXQl9FTlY9JHtwcm9qZWN0LmVudi5XQl9FTlZ9IFlBUk4gdml0ZXN0IHJ1biAke2FyZ3YudGFyZ2V0IHx8ICd0ZXN0cy91bml0J30gLS1jb2xvciAtLXBhc3NXaXRoTm9UZXN0cyAtLWFsbG93T25seWA7XG4gIH1cblxuICBwcm90ZWN0ZWQgd2FpdEFwcChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2LCBwb3J0ID0gdGhpcy5kZWZhdWx0UG9ydCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGB3YWl0LW9uIC10IDEwMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDEwMDAwIC1pIDUwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCAxMDAwMCAtaSAxMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDEwMDAwIC1pIDIwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgMjAwMDAgLWkgNDAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCA2MDAwMCAtaSA1MDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH1gO1xuICB9XG5cbiAgcHJvdGVjdGVkIHdhaXRBbmRPcGVuQXBwKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YsIHBvcnQgPSB0aGlzLmRlZmF1bHRQb3J0KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy53YWl0QXBwKFxuICAgICAgcHJvamVjdCxcbiAgICAgIGFyZ3YsXG4gICAgICBwb3J0XG4gICAgKX0gfHwgd2FpdC1vbiBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9ICYmIG9wZW4tY2xpIFwiaHR0cDovL1xcJHtIT1NUOi1sb2NhbGhvc3R9OiR7cG9ydH1cImA7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgVGVzdEFyZ3YgfSBmcm9tICcuLi8uLi9jb21tYW5kcy90ZXN0LmpzJztcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBwcmlzbWFTY3JpcHRzIH0gZnJvbSAnLi4vcHJpc21hU2NyaXB0cy5qcyc7XG5cbmltcG9ydCB0eXBlIHsgVGVzdEUyRURldk9wdGlvbnMsIFRlc3RFMkVPcHRpb25zIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgQmxpdHouanMgY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIEJsaXR6U2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIGNvbnN0IGFwcEVudiA9IHByb2plY3QuZW52LldCX0VOViA/IGBBUFBfRU5WPSR7cHJvamVjdC5lbnYuV0JfRU5WfSBgIDogJyc7XG4gICAgcmV0dXJuIGAke2FwcEVudn1ZQVJOIGNvbmN1cnJlbnRseSAtLXJhdyAtLWtpbGwtb3RoZXJzLW9uLWZhaWxcbiAgICAgIFwiYmxpdHogZGV2ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9XCJcbiAgICAgIFwiJHt0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QsIGFyZ3YpfVwiYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2LCBwb3J0OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IGFwcEVudiA9IHByb2plY3QuZW52LldCX0VOViA/IGBBUFBfRU5WPSR7cHJvamVjdC5lbnYuV0JfRU5WfSBgIDogJyc7XG4gICAgcmV0dXJuIGAke2FwcEVudn1OT0RFX0VOVj1wcm9kdWN0aW9uIFlBUk4gY29uY3VycmVudGx5IC0tcmF3IC0ta2lsbC1vdGhlcnMtb24tZmFpbFxuICAgICAgXCIke3ByaXNtYVNjcmlwdHMucmVzZXQocHJvamVjdCl9ICYmICR7cHJvamVjdC5idWlsZENvbW1hbmR9ICYmIFBPUlQ9JHtwb3J0fSBwbTItcnVudGltZSBzdGFydCAke3Byb2plY3QuZmluZEZpbGUoXG4gICAgICAgICdlY29zeXN0ZW0uY29uZmlnLmNqcydcbiAgICAgICl9ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9XCJcbiAgICAgIFwiJHt0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QsIGFyZ3YsIHBvcnQpfVwiYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkUoXG4gICAgcHJvamVjdDogUHJvamVjdCxcbiAgICBhcmd2OiBUZXN0QXJndixcbiAgICB7XG4gICAgICBwbGF5d3JpZ2h0QXJncyxcbiAgICAgIHN0YXJ0Q29tbWFuZCA9IGAke3ByaXNtYVNjcmlwdHMucmVzZXQocHJvamVjdCl9ICYmICR7XG4gICAgICAgIHByb2plY3QuYnVpbGRDb21tYW5kXG4gICAgICB9ICYmIHBtMi1ydW50aW1lIHN0YXJ0ICR7cHJvamVjdC5maW5kRmlsZSgnZWNvc3lzdGVtLmNvbmZpZy5janMnKX1gLFxuICAgIH06IFRlc3RFMkVPcHRpb25zXG4gICk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN1cGVyLnRlc3RFMkUocHJvamVjdCwgYXJndiwge1xuICAgICAgcGxheXdyaWdodEFyZ3MsXG4gICAgICBwcmlzbWFEaXJlY3Rvcnk6ICdkYicsXG4gICAgICBzdGFydENvbW1hbmQsXG4gICAgfSk7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFRGV2KFxuICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgYXJndjogVGVzdEFyZ3YsXG4gICAgeyBwbGF5d3JpZ2h0QXJncywgc3RhcnRDb21tYW5kID0gJ2JsaXR6IGRldiAtcCA4MDgwJyB9OiBUZXN0RTJFRGV2T3B0aW9uc1xuICApOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXBlci50ZXN0RTJFRGV2KHByb2plY3QsIGFyZ3YsIHsgcGxheXdyaWdodEFyZ3MsIHN0YXJ0Q29tbWFuZCB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RTdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFlBUk4gY29uY3VycmVudGx5IC0ta2lsbC1vdGhlcnMgLS1yYXcgLS1zdWNjZXNzIGZpcnN0IFwiYmxpdHogZGV2XCIgXCIke3RoaXMud2FpdEFwcChwcm9qZWN0LCBhcmd2KX1cImA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGJsaXR6U2NyaXB0cyA9IG5ldyBCbGl0elNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgVGVzdEFyZ3YgfSBmcm9tICcuLi8uLi9jb21tYW5kcy90ZXN0LmpzJztcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVudGltZVdpdGhBcmdzIH0gZnJvbSAnLi4vLi4vdXRpbHMvcnVudGltZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IGRvY2tlclNjcmlwdHMgfSBmcm9tICcuLi9kb2NrZXJTY3JpcHRzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBUZXN0RTJFRGV2T3B0aW9ucywgVGVzdEUyRU9wdGlvbnMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBhbiBhcHAgdGhhdCB1dGlsaXplcyBhbiBIVFRQIHNlcnZlciBsaWtlIGV4cHJlc3MuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIEh0dHBTZXJ2ZXJTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBZQVJOIGJ1aWxkLXRzIHJ1biBzcmMvaW5kZXgudHMgJHthcmd2LndhdGNoID8gJy0td2F0Y2gnIDogJyd9IC0tICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YDtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0RG9ja2VyKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLmJ1aWxkRG9ja2VyKHByb2plY3QpfSAmJiAke2RvY2tlclNjcmlwdHMuc3RvcEFuZFN0YXJ0KFxuICAgICAgcHJvamVjdCxcbiAgICAgIGZhbHNlLFxuICAgICAgYXJndi5ub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQgPz8gJycsXG4gICAgICBhcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ1xuICAgICl9YDtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2LCBwb3J0ID0gODA4MCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBOT0RFX0VOVj1wcm9kdWN0aW9uICR7XG4gICAgICBwcm9qZWN0LmJ1aWxkQ29tbWFuZFxuICAgIH0gJiYgTk9ERV9FTlY9cHJvZHVjdGlvbiBQT1JUPVxcJHtQT1JUOi0ke3BvcnR9fSAke3J1bnRpbWVXaXRoQXJnc30gZGlzdC9pbmRleC5qcyAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWA7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFKFxuICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgYXJndjogVGVzdEFyZ3YsXG4gICAge1xuICAgICAgc3RhcnRDb21tYW5kID0gYGlmIFsgLWUgXCJwcmlzbWFcIiBdOyB0aGVuIHByaXNtYSBtaWdyYXRlIHJlc2V0IC0tZm9yY2UgLS1za2lwLWdlbmVyYXRlOyBmaSAmJiAoJHt0aGlzLnN0YXJ0UHJvZHVjdGlvbihcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgYXJndlxuICAgICAgKX0pYCxcbiAgICB9OiBUZXN0RTJFT3B0aW9uc1xuICApOiBzdHJpbmcge1xuICAgIHJldHVybiBgTk9ERV9FTlY9cHJvZHVjdGlvbiBXQl9FTlY9JHtwcm9qZWN0LmVudi5XQl9FTlZ9IFBPUlQ9ODA4MCBZQVJOIGNvbmN1cnJlbnRseSAtLWtpbGwtb3RoZXJzIC0tcmF3IC0tc3VjY2VzcyBmaXJzdFxuICAgICAgXCIke3N0YXJ0Q29tbWFuZH0gJiYgZXhpdCAxXCJcbiAgICAgIFwid2FpdC1vbiAtdCA2MDAwMDAgLWkgMjAwMCBodHRwLWdldDovLzEyNy4wLjAuMTo4MDgwICYmIHZpdGVzdCBydW4gJHthcmd2LnRhcmdldCB8fCAndGVzdHMvZTJlJ30gLS1jb2xvciAtLXBhc3NXaXRoTm9UZXN0cyAtLWFsbG93T25seVwiYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkVEZXYocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YsIHsgc3RhcnRDb21tYW5kIH06IFRlc3RFMkVEZXZPcHRpb25zKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYE5PREVfRU5WPXByb2R1Y3Rpb24gV0JfRU5WPSR7XG4gICAgICBwcm9qZWN0LmVudi5XQl9FTlZcbiAgICB9IFBPUlQ9ODA4MCBZQVJOIGNvbmN1cnJlbnRseSAtLWtpbGwtb3RoZXJzIC0tcmF3IC0tc3VjY2VzcyBmaXJzdFxuICAgICAgXCIke3N0YXJ0Q29tbWFuZCB8fCB0aGlzLnN0YXJ0KHByb2plY3QsIGFyZ3YpfSAmJiBleGl0IDFcIlxuICAgICAgXCJ3YWl0LW9uIC10IDYwMDAwMCAtaSAyMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOjgwODAgJiYgdml0ZXN0IHJ1biAke2FyZ3YudGFyZ2V0IHx8ICd0ZXN0cy9lMmUnfSAtLWNvbG9yIC0tcGFzc1dpdGhOb1Rlc3RzIC0tYWxsb3dPbmx5XCJgO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdFN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWUFSTiBjb25jdXJyZW50bHkgLS1raWxsLW90aGVycyAtLXJhdyAtLXN1Y2Nlc3MgZmlyc3QgXCIke3RoaXMuc3RhcnQocHJvamVjdCwgYXJndil9XCIgXCIke3RoaXMud2FpdEFwcChcbiAgICAgIHByb2plY3QsXG4gICAgICBhcmd2XG4gICAgKX1cImA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGh0dHBTZXJ2ZXJTY3JpcHRzID0gbmV3IEh0dHBTZXJ2ZXJTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFRlc3RBcmd2IH0gZnJvbSAnLi4vLi4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgcHJpc21hU2NyaXB0cyB9IGZyb20gJy4uL3ByaXNtYVNjcmlwdHMuanMnO1xuXG5pbXBvcnQgdHlwZSB7IFRlc3RFMkVEZXZPcHRpb25zLCBUZXN0RTJFT3B0aW9ucyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIE5leHQuanMgY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIE5leHRTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBZQVJOIGNvbmN1cnJlbnRseSAtLXJhdyAtLWtpbGwtb3RoZXJzLW9uLWZhaWxcbiAgICAgIFwibmV4dCBkZXYgLS10dXJibyAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfVwiXG4gICAgICBcIiR7dGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0LCBhcmd2KX1cImA7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydFByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndiwgcG9ydDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYE5PREVfRU5WPXByb2R1Y3Rpb24gWUFSTiBjb25jdXJyZW50bHkgLS1yYXcgLS1raWxsLW90aGVycy1vbi1mYWlsXG4gICAgICBcIiR7W1xuICAgICAgICAuLi4ocHJvamVjdC5oYXNQcmlzbWEgPyBbcHJpc21hU2NyaXB0cy5yZXNldChwcm9qZWN0KV0gOiBbXSksXG4gICAgICAgIHByb2plY3QuYnVpbGRDb21tYW5kLFxuICAgICAgICBgUE9SVD0ke3BvcnR9IHBtMi1ydW50aW1lIHN0YXJ0ICR7cHJvamVjdC5maW5kRmlsZSgnZWNvc3lzdGVtLmNvbmZpZy5janMnKX0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLFxuICAgICAgXS5qb2luKCcgJiYgJyl9XCJcbiAgICAgIFwiJHt0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QsIGFyZ3YsIHBvcnQpfVwiYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkUocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YsIG9wdGlvbnM6IFRlc3RFMkVPcHRpb25zKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VwZXIudGVzdEUyRShwcm9qZWN0LCBhcmd2LCB7XG4gICAgICBwbGF5d3JpZ2h0QXJnczogb3B0aW9ucy5wbGF5d3JpZ2h0QXJncyxcbiAgICAgIHByaXNtYURpcmVjdG9yeTogJ2RiJyxcbiAgICAgIHN0YXJ0Q29tbWFuZDpcbiAgICAgICAgb3B0aW9ucy5zdGFydENvbW1hbmQgPz9cbiAgICAgICAgW1xuICAgICAgICAgIC4uLihwcm9qZWN0Lmhhc1ByaXNtYSA/IFtwcmlzbWFTY3JpcHRzLnJlc2V0KHByb2plY3QpXSA6IFtdKSxcbiAgICAgICAgICBwcm9qZWN0LmJ1aWxkQ29tbWFuZCxcbiAgICAgICAgICBgcG0yLXJ1bnRpbWUgc3RhcnQgJHtwcm9qZWN0LmZpbmRGaWxlKCdlY29zeXN0ZW0uY29uZmlnLmNqcycpfWAsXG4gICAgICAgIF0uam9pbignICYmICcpLFxuICAgIH0pO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRURldihcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGFyZ3Y6IFRlc3RBcmd2LFxuICAgIHsgc3RhcnRDb21tYW5kID0gJ25leHQgZGV2IC0tdHVyYm8gLXAgODA4MCcgfTogVGVzdEUyRURldk9wdGlvbnNcbiAgKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VwZXIudGVzdEUyRURldihwcm9qZWN0LCBhcmd2LCB7IHN0YXJ0Q29tbWFuZCB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RTdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFlBUk4gY29uY3VycmVudGx5IC0ta2lsbC1vdGhlcnMgLS1yYXcgLS1zdWNjZXNzIGZpcnN0IFwibmV4dCBkZXYgLS10dXJib1wiIFwiJHt0aGlzLndhaXRBcHAocHJvamVjdCwgYXJndil9XCJgO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBuZXh0U2NyaXB0cyA9IG5ldyBOZXh0U2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW50aW1lV2l0aEFyZ3MgfSBmcm9tICcuLi8uLi91dGlscy9ydW50aW1lLmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL2RvY2tlclNjcmlwdHMuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgYW4gYXBwIHRoYXQgdXRpbGl6ZXMgYW4gSFRUUCBzZXJ2ZXIgbGlrZSBleHByZXNzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBQbGFpbkFwcFNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFlBUk4gYnVpbGQtdHMgcnVuIHNyYy9pbmRleC50cyAke2FyZ3Yud2F0Y2ggPyAnLS13YXRjaCcgOiAnJ30gLS0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnREb2NrZXIocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuYnVpbGREb2NrZXIocHJvamVjdCl9ICYmICR7ZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQoXG4gICAgICBwcm9qZWN0LFxuICAgICAgZmFsc2UsXG4gICAgICBhcmd2Lm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA/PyAnJyxcbiAgICAgIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnXG4gICAgKX1gO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnRQcm9kdWN0aW9uKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgTk9ERV9FTlY9cHJvZHVjdGlvbiAke3Byb2plY3QuYnVpbGRDb21tYW5kfSAmJiBOT0RFX0VOVj1wcm9kdWN0aW9uICR7cnVudGltZVdpdGhBcmdzfSBkaXN0L2luZGV4LmpzICR7XG4gICAgICBhcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ1xuICAgIH1gO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgZWNobyAnZG8gbm90aGluZy4nYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkVEZXYoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYGVjaG8gJ2RvIG5vdGhpbmcuJ2A7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0U3RhcnQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYGVjaG8gJ2RvIG5vdGhpbmcuJ2A7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHBsYWluQXBwU2NyaXB0cyA9IG5ldyBQbGFpbkFwcFNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgVGVzdEFyZ3YgfSBmcm9tICcuLi8uLi9jb21tYW5kcy90ZXN0LmpzJztcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBwcmlzbWFTY3JpcHRzIH0gZnJvbSAnLi4vcHJpc21hU2NyaXB0cy5qcyc7XG5cbmltcG9ydCB0eXBlIHsgVGVzdEUyRURldk9wdGlvbnMsIFRlc3RFMkVPcHRpb25zIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgUmVtaXggY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFJlbWl4U2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWUFSTiBjb25jdXJyZW50bHkgLS1yYXcgLS1raWxsLW90aGVycy1vbi1mYWlsXG4gICAgICBcInJlbWl4IGRldiAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfVwiXG4gICAgICBcIiR7dGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0LCBhcmd2KX1cImA7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydFByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndiwgcG9ydDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYE5PREVfRU5WPXByb2R1Y3Rpb24gWUFSTiBjb25jdXJyZW50bHkgLS1yYXcgLS1raWxsLW90aGVycy1vbi1mYWlsXG4gICAgICBcIiR7cHJpc21hU2NyaXB0cy5yZXNldChwcm9qZWN0KX0gJiYgJHtwcm9qZWN0LmJ1aWxkQ29tbWFuZH0gJiYgUE9SVD0ke3BvcnR9IHBtMi1ydW50aW1lIHN0YXJ0ICR7cHJvamVjdC5maW5kRmlsZShcbiAgICAgICAgJ2Vjb3N5c3RlbS5jb25maWcuY2pzJ1xuICAgICAgKX0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31cIlxuICAgICAgXCIke3RoaXMud2FpdEFuZE9wZW5BcHAocHJvamVjdCwgYXJndiwgcG9ydCl9XCJgO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRShcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGFyZ3Y6IFRlc3RBcmd2LFxuICAgIHtcbiAgICAgIHBsYXl3cmlnaHRBcmdzLFxuICAgICAgc3RhcnRDb21tYW5kID0gYCR7cHJpc21hU2NyaXB0cy5yZXNldChwcm9qZWN0KX0gJiYgJHtcbiAgICAgICAgcHJvamVjdC5idWlsZENvbW1hbmRcbiAgICAgIH0gJiYgcG0yLXJ1bnRpbWUgc3RhcnQgJHtwcm9qZWN0LmZpbmRGaWxlKCdlY29zeXN0ZW0uY29uZmlnLmNqcycpfWAsXG4gICAgfTogVGVzdEUyRU9wdGlvbnNcbiAgKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VwZXIudGVzdEUyRShwcm9qZWN0LCBhcmd2LCB7IHBsYXl3cmlnaHRBcmdzLCBwcmlzbWFEaXJlY3Rvcnk6ICdwcmlzbWEnLCBzdGFydENvbW1hbmQgfSk7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFRGV2KFxuICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgYXJndjogVGVzdEFyZ3YsXG4gICAgeyBwbGF5d3JpZ2h0QXJncywgc3RhcnRDb21tYW5kID0gJ3JlbWl4IGRldicgfTogVGVzdEUyRURldk9wdGlvbnNcbiAgKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VwZXIudGVzdEUyRURldihwcm9qZWN0LCBhcmd2LCB7IHBsYXl3cmlnaHRBcmdzLCBzdGFydENvbW1hbmQgfSk7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0U3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBZQVJOIGNvbmN1cnJlbnRseSAtLWtpbGwtb3RoZXJzIC0tcmF3IC0tc3VjY2VzcyBmaXJzdCBcInJlbWl4IGRldlwiIFwiJHt0aGlzLndhaXRBcHAocHJvamVjdCwgYXJndil9XCJgO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCByZW1peFNjcmlwdHMgPSBuZXcgUmVtaXhTY3JpcHRzKCk7XG4iLCJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kQWxsUHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IG5vcm1hbGl6ZUFyZ3MsIHNjcmlwdE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2NyaXB0cy9idWlsZGVyLmpzJztcbmltcG9ydCB0eXBlIHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBibGl0elNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9ibGl0elNjcmlwdHMuanMnO1xuaW1wb3J0IHsgaHR0cFNlcnZlclNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9odHRwU2VydmVyU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBuZXh0U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL25leHRTY3JpcHRzLmpzJztcbmltcG9ydCB7IHBsYWluQXBwU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3BsYWluQXBwU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyByZW1peFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9yZW1peFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuaW1wb3J0IHsgaHR0cFNlcnZlclBhY2thZ2VzIH0gZnJvbSAnLi9jb25zdGFudHMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICAuLi5zY3JpcHRPcHRpb25zQnVpbGRlcixcbiAgbW9kZToge1xuICAgIGRlc2NyaXB0aW9uOiAnU3RhcnQgbW9kZTogZGV2W2Vsb3BtZW50XSAoZGVmYXVsdCkgfCBzdGFnaW5nIHwgZG9ja2VyIHwgZG9ja2VyLWRlYnVnJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ20nLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IHN0YXJ0Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzdGFydCBbYXJncy4uXScsXG4gIGRlc2NyaWJlOiAnU3RhcnQgYXBwJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgbm9ybWFsaXplQXJncyhhcmd2KTtcblxuICAgIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZEFsbFByb2plY3RzKGFyZ3YpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMuYWxsKSB7XG4gICAgICBjb25zdCBkZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgfHwge307XG4gICAgICBjb25zdCBkZXZEZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgfHwge307XG4gICAgICBsZXQgc2NyaXB0czogQmFzZVNjcmlwdHM7XG4gICAgICBpZiAoZGVwc1snYmxpdHonXSkge1xuICAgICAgICBzY3JpcHRzID0gYmxpdHpTY3JpcHRzO1xuICAgICAgfSBlbHNlIGlmIChkZXBzWyduZXh0J10pIHtcbiAgICAgICAgc2NyaXB0cyA9IG5leHRTY3JpcHRzO1xuICAgICAgfSBlbHNlIGlmIChkZXZEZXBzWydAcmVtaXgtcnVuL2RldiddKSB7XG4gICAgICAgIHNjcmlwdHMgPSByZW1peFNjcmlwdHM7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAoaHR0cFNlcnZlclBhY2thZ2VzLnNvbWUoKHApID0+IGRlcHNbcF0pICYmICFkZXBzWydmaXJlYmFzZS1mdW5jdGlvbnMnXSkgfHxcbiAgICAgICAgKHByb2plY3QuaGFzRG9ja2VyZmlsZSAmJiAvRVhQT1NFXFxzKzgwODAvLnRlc3QocHJvamVjdC5kb2NrZXJmaWxlKSlcbiAgICAgICkge1xuICAgICAgICBzY3JpcHRzID0gaHR0cFNlcnZlclNjcmlwdHM7XG4gICAgICB9IGVsc2UgaWYgKGRlcHNbJ2J1aWxkLXRzJ10gfHwgZGV2RGVwc1snYnVpbGQtdHMnXSkge1xuICAgICAgICBzY3JpcHRzID0gcGxhaW5BcHBTY3JpcHRzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zb2xlLmluZm8oYFJ1bm5pbmcgXCJzdGFydFwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICAgIHN3aXRjaCAoYXJndi5tb2RlIHx8ICdkZXYnKSB7XG4gICAgICAgIGNhc2UgJ2Rldic6XG4gICAgICAgIGNhc2UgJ2RldmVsb3BtZW50Jzoge1xuICAgICAgICAgIGNvbnN0IHByZWZpeCA9IGNvbmZpZ3VyZUVudmlyb25tZW50VmFyaWFibGVzKGRlcHMsICdkZXZlbG9wbWVudCcpO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtwcmVmaXh9JHtzY3JpcHRzLnN0YXJ0KHByb2plY3QsIGFyZ3YpfWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3N0YWdpbmcnOiB7XG4gICAgICAgICAgY29uc3QgcHJlZml4ID0gY29uZmlndXJlRW52aXJvbm1lbnRWYXJpYWJsZXMoZGVwcywgJ3N0YWdpbmcnKTtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7cHJlZml4fSR7c2NyaXB0cy5zdGFydFByb2R1Y3Rpb24ocHJvamVjdCwgYXJndiwgODA4MCl9YCwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZG9ja2VyJzoge1xuICAgICAgICAgIGNvbnN0IHByZWZpeCA9IGNvbmZpZ3VyZUVudmlyb25tZW50VmFyaWFibGVzKGRlcHMsICdzdGFnaW5nJyk7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3ByZWZpeH0ke3NjcmlwdHMuc3RhcnREb2NrZXIocHJvamVjdCwgYXJndil9YCwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZG9ja2VyLWRlYnVnJzoge1xuICAgICAgICAgIGNvbnN0IHByZWZpeCA9IGNvbmZpZ3VyZUVudmlyb25tZW50VmFyaWFibGVzKGRlcHMsICdzdGFnaW5nJyk7XG4gICAgICAgICAgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPSBgJy9iaW4vYmFzaCdgO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtwcmVmaXh9JHtzY3JpcHRzLnN0YXJ0RG9ja2VyKHByb2plY3QsIGFyZ3YpfWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gc3RhcnQgbW9kZTogJHthcmd2Lm1vZGV9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBjb25maWd1cmVFbnZpcm9ubWVudFZhcmlhYmxlcyhkZXBzOiBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+LCB3YkVudjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSB3YkVudjtcbiAgbGV0IHByZWZpeCA9IGBXQl9FTlY9JHtwcm9jZXNzLmVudi5XQl9FTlZ9IGA7XG4gIGlmIChkZXBzWyduZXh0J10pIHtcbiAgICBwcm9jZXNzLmVudi5ORVhUX1BVQkxJQ19XQl9FTlYgPSBwcm9jZXNzLmVudi5XQl9FTlY7XG4gICAgcHJlZml4ICs9IGBORVhUX1BVQkxJQ19XQl9FTlY9JHtwcm9jZXNzLmVudi5XQl9FTlZ9IGA7XG4gIH1cbiAgcmV0dXJuIHByZWZpeDtcbn1cbiIsImltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5leHBvcnQgY29uc3Qgc2NyaXB0T3B0aW9uc0J1aWxkZXIgPSB7XG4gIHdhdGNoOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHdhdGNoIGZpbGVzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIGFyZ3M6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0FyZ3VtZW50cyBmb3IgY29yZSBjb21tYW5kJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICAgIGFsaWFzOiAnYScsXG4gICAgZGVmYXVsdDogW10sXG4gIH0sXG4gICdkb2NrZXItb3B0aW9ucyc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0FyZ3VtZW50cyBmb3IgXCJkb2NrZXIgcnVuXCInLFxuICAgIHR5cGU6ICdhcnJheScsXG4gICAgZGVmYXVsdDogW10sXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBTY3JpcHRBcmd2ID0gUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2NyaXB0T3B0aW9uc0J1aWxkZXI+Pj4gJiB7XG4gIG5vcm1hbGl6ZWRBcmdzVGV4dD86IHN0cmluZztcbiAgbm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0Pzogc3RyaW5nO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUFyZ3MoXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNjcmlwdE9wdGlvbnNCdWlsZGVyPj4+XG4pOiB2b2lkIHtcbiAgKGFyZ3YgYXMgU2NyaXB0QXJndikubm9ybWFsaXplZEFyZ3NUZXh0ID0gWy4uLihhcmd2LmFyZ3MgPz8gW10pLCAuLi4oYXJndi5fPy5zbGljZSgxKSA/PyBbXSldXG4gICAgLm1hcCgoYXJnKSA9PiBgJyR7YXJnfSdgKVxuICAgIC5qb2luKCcgJyk7XG4gIChhcmd2IGFzIFNjcmlwdEFyZ3YpLm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA9IChhcmd2LmRvY2tlck9wdGlvbnMgPz8gW10pLm1hcCgoYXJnKSA9PiBgJyR7YXJnfSdgKS5qb2luKCcgJyk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBleGlzdHNBc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kQWxsUHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2NyaXB0T3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zY3JpcHRzL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZG9ja2VyU2NyaXB0cy5qcyc7XG5pbXBvcnQgdHlwZSB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgYmxpdHpTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmxpdHpTY3JpcHRzLmpzJztcbmltcG9ydCB7IGh0dHBTZXJ2ZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vaHR0cFNlcnZlclNjcmlwdHMuanMnO1xuaW1wb3J0IHsgbmV4dFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9uZXh0U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwbGFpbkFwcFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9wbGFpbkFwcFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcmVtaXhTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcmVtaXhTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biwgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW1wb3J0IHsgaHR0cFNlcnZlclBhY2thZ2VzIH0gZnJvbSAnLi9jb25zdGFudHMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICBjaToge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBydW4gdGVzdHMgb24gQ0knLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgZTJlOiB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnV2hldGhlciB0byBydW4gZTJlIHRlc3RzLiBZb3UgbWF5IHBhc3MgbW9kZSBhcyBhcmd1bWVudDogbm9uZSB8IGhlYWRsZXNzIChkZWZhdWx0KSB8IGhlYWRsZXNzLWRldiB8IGhlYWRlZCB8IGhlYWRlZC1kZXYgfCBkb2NrZXIgfCBkb2NrZXItZGVidWcgfCBkZWJ1ZyB8IGdlbmVyYXRlIHwgdHJhY2UnLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxuICBzdGFydDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBydW4gc3RhcnQgdGVzdHMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgdW5pdDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBydW4gdW5pdCB0ZXN0cycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICAndW5pdC10aW1lb3V0Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnVGltZW91dCBmb3IgdW5pdCB0ZXN0cycsXG4gICAgdHlwZTogJ251bWJlcicsXG4gIH0sXG4gIHRhcmdldDoge1xuICAgIGRlc2NyaXB0aW9uOiAnVGVzdCB0YXJnZXQnLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAndCcsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBUZXN0QXJndiA9IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2NyaXB0T3B0aW9uc0J1aWxkZXI+Pj47XG5cbmV4cG9ydCBjb25zdCB0ZXN0Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICd0ZXN0JyxcbiAgZGVzY3JpYmU6ICdUZXN0IHByb2plY3QnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCB0ZXN0KGFyZ3YpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3QoXG4gIGFyZ3Y6IEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj5cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmRBbGxQcm9qZWN0cyhhcmd2KTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBpZiAocHJvamVjdHMuYWxsLmxlbmd0aCA+IDEpIHtcbiAgICAvLyBEaXNhYmxlIGludGVyYWN0aXZlIG1vZGVcbiAgICBwcm9jZXNzLmVudi5DSSA9ICcxJztcbiAgfVxuICBwcm9jZXNzLmVudi5GT1JDRV9DT0xPUiB8fD0gJzMnO1xuICBwcm9jZXNzLmVudi5XQl9FTlYgfHw9ICd0ZXN0JztcblxuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMuYWxsKSB7XG4gICAgY29uc3QgZGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzIHx8IHt9O1xuICAgIGNvbnN0IGRldkRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyB8fCB7fTtcbiAgICBsZXQgc2NyaXB0czogQmFzZVNjcmlwdHM7XG4gICAgaWYgKGRlcHNbJ2JsaXR6J10pIHtcbiAgICAgIHNjcmlwdHMgPSBibGl0elNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXBzWyduZXh0J10pIHtcbiAgICAgIHNjcmlwdHMgPSBuZXh0U2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGRldkRlcHNbJ0ByZW1peC1ydW4vZGV2J10pIHtcbiAgICAgIHNjcmlwdHMgPSByZW1peFNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChodHRwU2VydmVyUGFja2FnZXMuc29tZSgocCkgPT4gZGVwc1twXSkgJiYgIWRlcHNbJ2ZpcmViYXNlLWZ1bmN0aW9ucyddKSB7XG4gICAgICBzY3JpcHRzID0gaHR0cFNlcnZlclNjcmlwdHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNjcmlwdHMgPSBwbGFpbkFwcFNjcmlwdHM7XG4gICAgfVxuXG4gICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwidGVzdFwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICBjb25zdCBwcm9taXNlczogUHJvbWlzZTx1bmtub3duPltdID0gW107XG4gICAgaWYgKGFyZ3YuY2kpIHtcbiAgICAgIGNvbnN0IHVuaXRUZXN0c0V4aXN0UHJvbWlzZSA9IGV4aXN0c0FzeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0cycsICd1bml0JykpO1xuICAgICAgY29uc3QgZTJlVGVzdHNFeGlzdFByb21pc2UgPSBleGlzdHNBc3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAndGVzdHMnLCAnZTJlJykpO1xuXG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGRvY2tlclNjcmlwdHMuc3RvcEFsbCgpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIGlmIChhcmd2LnVuaXQgIT09IGZhbHNlICYmIChhd2FpdCB1bml0VGVzdHNFeGlzdFByb21pc2UpKSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoc2NyaXB0cy50ZXN0VW5pdChwcm9qZWN0LCBhcmd2KS5yZXBsYWNlQWxsKCcgLS1hbGxvd09ubHknLCAnJyksIHByb2plY3QsIGFyZ3YsIHtcbiAgICAgICAgICB0aW1lb3V0OiBhcmd2LnVuaXRUaW1lb3V0LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChhcmd2LnN0YXJ0ICE9PSBmYWxzZSkge1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKHNjcmlwdHMudGVzdFN0YXJ0KHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICAgIC8vIENoZWNrIHBsYXl3cmlnaHQgaW5zdGFsbGF0aW9uIGJlY2F1c2UgLS1jaSBpbmNsdWRlcyAtLWUyZSBpbXBsaWNpdGx5XG4gICAgICBpZiAoYXJndi5lMmUgIT09ICdub25lJyAmJiAoYXdhaXQgZTJlVGVzdHNFeGlzdFByb21pc2UpKSB7XG4gICAgICAgIGlmIChwcm9qZWN0Lmhhc0RvY2tlcmZpbGUpIHtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7c2NyaXB0cy5idWlsZERvY2tlcihwcm9qZWN0LCAndGVzdCcpfWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBwcm9qZWN0Lmhhc0RvY2tlcmZpbGVcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgc3RhcnRDb21tYW5kOiBkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChwcm9qZWN0LCB0cnVlKSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IHt9O1xuICAgICAgICBwcm9jZXNzLmV4aXRDb2RlID0gYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICAgIHNjcmlwdHMudGVzdEUyRShwcm9qZWN0LCBhcmd2LCBvcHRpb25zKS5yZXBsYWNlQWxsKCcgLS1hbGxvd09ubHknLCAnJyksXG4gICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICBhcmd2LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGV4aXRJZkZhaWxlZDogZmFsc2UsXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oZG9ja2VyU2NyaXB0cy5zdG9wKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChhcmd2LnVuaXQgfHwgKCFhcmd2LnN0YXJ0ICYmIGFyZ3YuZTJlID09PSB1bmRlZmluZWQpKSB7XG4gICAgICBwcm9taXNlcy5wdXNoKHJ1bldpdGhTcGF3bihzY3JpcHRzLnRlc3RVbml0KHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2LCB7IHRpbWVvdXQ6IGFyZ3YudW5pdFRpbWVvdXQgfSkpO1xuICAgIH1cbiAgICBpZiAoYXJndi5zdGFydCkge1xuICAgICAgcHJvbWlzZXMucHVzaChydW5XaXRoU3Bhd24oc2NyaXB0cy50ZXN0U3RhcnQocHJvamVjdCwgYXJndiksIHByb2plY3QsIGFyZ3YpKTtcbiAgICB9XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgIC8vIERvbid0IGNoZWNrIHBsYXl3cmlnaHQgaW5zdGFsbGF0aW9uIGJlY2F1c2UgLS1lMmUgaXMgc2V0IGV4cGxpY2l0bHlcbiAgICBzd2l0Y2ggKGFyZ3YuZTJlKSB7XG4gICAgICBjYXNlIHVuZGVmaW5lZDpcbiAgICAgIGNhc2UgJ25vbmUnOiB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY2FzZSAnJzpcbiAgICAgIGNhc2UgJ2hlYWRsZXNzJzoge1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oc2NyaXB0cy50ZXN0RTJFKHByb2plY3QsIGFyZ3YsIHt9KSwgcHJvamVjdCwgYXJndik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY2FzZSAnaGVhZGxlc3MtZGV2Jzoge1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oc2NyaXB0cy50ZXN0RTJFRGV2KHByb2plY3QsIGFyZ3YsIHt9KSwgcHJvamVjdCwgYXJndik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY2FzZSAnZG9ja2VyJzoge1xuICAgICAgICBhd2FpdCB0ZXN0T25Eb2NrZXIocHJvamVjdCwgYXJndiwgc2NyaXB0cyk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY2FzZSAnZG9ja2VyLWRlYnVnJzoge1xuICAgICAgICBhd2FpdCB0ZXN0T25Eb2NrZXIocHJvamVjdCwgYXJndiwgc2NyaXB0cywgYHRlc3QgJHthcmd2LnRhcmdldCB8fCAndGVzdHMvZTJlJ30gLS1kZWJ1Z2ApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGRlcHNbJ2JsaXR6J10gfHwgZGVwc1snbmV4dCddIHx8IGRldkRlcHNbJ0ByZW1peC1ydW4vZGV2J10pIHtcbiAgICAgIHN3aXRjaCAoYXJndi5lMmUpIHtcbiAgICAgICAgY2FzZSAnaGVhZGVkJzoge1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgICAgIHNjcmlwdHMudGVzdEUyRShwcm9qZWN0LCBhcmd2LCB7IHBsYXl3cmlnaHRBcmdzOiBgdGVzdCAke2FyZ3YudGFyZ2V0IHx8ICd0ZXN0cy9lMmUnfSAtLWhlYWRlZGAgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgYXJndlxuICAgICAgICAgICk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnaGVhZGVkLWRldic6IHtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgICBzY3JpcHRzLnRlc3RFMkVEZXYocHJvamVjdCwgYXJndiwgeyBwbGF5d3JpZ2h0QXJnczogYHRlc3QgJHthcmd2LnRhcmdldCB8fCAndGVzdHMvZTJlJ30gLS1oZWFkZWRgIH0pLFxuICAgICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAgIGFyZ3ZcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2RlYnVnJzoge1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgICAgIHNjcmlwdHMudGVzdEUyRShwcm9qZWN0LCBhcmd2LCB7IHBsYXl3cmlnaHRBcmdzOiBgdGVzdCAke2FyZ3YudGFyZ2V0IHx8ICd0ZXN0cy9lMmUnfSAtLWRlYnVnYCB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICBhcmd2XG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdnZW5lcmF0ZSc6IHtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgICBzY3JpcHRzLnRlc3RFMkUocHJvamVjdCwgYXJndiwgeyBwbGF5d3JpZ2h0QXJnczogJ2NvZGVnZW4gaHR0cDovL2xvY2FsaG9zdDo4MDgwJyB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICBhcmd2XG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICd0cmFjZSc6IHtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYEJVTiBwbGF5d3JpZ2h0IHNob3ctdHJhY2VgLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gZTJlIG1vZGU6ICR7YXJndi5lMmV9YCk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gdGVzdE9uRG9ja2VyKFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+LFxuICBzY3JpcHRzOiBCYXNlU2NyaXB0cyxcbiAgcGxheXdyaWdodEFyZ3M/OiBzdHJpbmdcbik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7c2NyaXB0cy5idWlsZERvY2tlcihwcm9qZWN0LCAndGVzdCcpfWAsIHByb2plY3QsIGFyZ3YpO1xuICBwcm9jZXNzLmV4aXRDb2RlID0gYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgIGAke3NjcmlwdHMudGVzdEUyRShwcm9qZWN0LCBhcmd2LCB7XG4gICAgICBwbGF5d3JpZ2h0QXJncyxcbiAgICAgIHN0YXJ0Q29tbWFuZDogZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQocHJvamVjdCwgdHJ1ZSksXG4gICAgfSl9YCxcbiAgICBwcm9qZWN0LFxuICAgIGFyZ3YsXG4gICAgeyBleGl0SWZGYWlsZWQ6IGZhbHNlIH1cbiAgKTtcbiAgYXdhaXQgcnVuV2l0aFNwYXduKGRvY2tlclNjcmlwdHMuc3RvcChwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZEFsbFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24gfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCB0eXBlQ2hlY2tDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ3R5cGVjaGVjaycsXG4gIGRlc2NyaWJlOiAnUnVuIHR5cGUgY2hlY2tpbmcuIC5lbnYgZmlsZXMgYXJlIGlnbm9yZWQuJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kQWxsUHJvamVjdHMoYXJndiwgZmFsc2UpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMuYWxsKSB7XG4gICAgICBjb25zdCBjb21tYW5kczogc3RyaW5nW10gPSBbXTtcbiAgICAgIGlmICghcHJvamVjdC5wYWNrYWdlSnNvbi53b3Jrc3BhY2VzKSB7XG4gICAgICAgIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8udHlwZXNjcmlwdCB8fCBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8udHlwZXNjcmlwdCkge1xuICAgICAgICAgIGNvbW1hbmRzLnB1c2goJ0JVTiB0c2MgLS1ub0VtaXQgLS1QcmV0dHknKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LnB5cmlnaHQpIHtcbiAgICAgICAgICBjb21tYW5kcy5wdXNoKCdZQVJOIHB5cmlnaHQnKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgcHJvamVjdC5oYXNTb3VyY2VDb2RlICYmXG4gICAgICAgIChwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8udHlwZXNjcmlwdCB8fCBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8udHlwZXNjcmlwdClcbiAgICAgICkge1xuICAgICAgICBjb21tYW5kcy5wdXNoKCdCVU4gdHNjIC0tbm9FbWl0IC0tUHJldHR5Jyk7XG4gICAgICB9XG4gICAgICBpZiAoY29tbWFuZHMubGVuZ3RoID09PSAwKSBjb250aW51ZTtcblxuICAgICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwidHlwZWNoZWNrXCIgZm9yICR7cHJvamVjdC5uYW1lfSAuLi5gKTtcblxuICAgICAgaWYgKHByb2plY3RzLmFsbC5sZW5ndGggPiAxKSB7XG4gICAgICAgIC8vIERpc2FibGUgaW50ZXJhY3RpdmUgbW9kZVxuICAgICAgICBwcm9qZWN0LmVudlsnQ0knXSA9ICcxJztcbiAgICAgIH1cbiAgICAgIHByb2plY3QuZW52WydGT1JDRV9DT0xPUiddIHx8PSAnMyc7XG5cbiAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuV2l0aFNwYXduKGNvbW1hbmRzLmpvaW4oJyAmJiAnKSwgcHJvamVjdCwgYXJndik7XG4gICAgICBpZiAoZXhpdENvZGUgIT09IDApIHtcbiAgICAgICAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGF3YWl0IGZzLnJlYWRGaWxlKCdwYWNrYWdlLmpzb24nLCAndXRmOCcpKSBhcyBQYWNrYWdlSnNvbjtcbiAgICAgICAgY29uc3QgZGVwcyA9IHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyB8fCB7fTtcbiAgICAgICAgaWYgKGRlcHNbJ2JsaXR6J10pIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oY2hhbGsueWVsbG93KCdQbGVhc2UgdHJ5IFwieWFybiBnZW4tY29kZVwiIGlmIHlvdSBmYWNlIHVua25vd24gdHlwZSBlcnJvcnMuJykpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IHRjQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4gPSB7XG4gIC4uLnR5cGVDaGVja0NvbW1hbmQsXG4gIGNvbW1hbmQ6ICd0YycsXG59O1xuIiwiaW1wb3J0IHsgeWFyZ3NPcHRpb25zQnVpbGRlckZvckVudiB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcblxuZXhwb3J0IGNvbnN0IHNoYXJlZE9wdGlvbnNCdWlsZGVyID0ge1xuICAuLi55YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52LFxuICAvLyBUaGlzIG9wdGlvbiBpcyBmb3IgZGVidWdnaW5nIG1haW5seS5cbiAgJ3dvcmtpbmctZGlyJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnQSB3b3JraW5nIGRpcmVjdG9yeScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICd3JyxcbiAgfSxcbiAgJ2RyeS1ydW4nOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHNraXAgYWN0dWFsIGNvbW1hbmQgZXhlY3V0aW9uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6ICdkJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgeWFyZ3MgZnJvbSAneWFyZ3MnO1xuaW1wb3J0IHsgaGlkZUJpbiB9IGZyb20gJ3lhcmdzL2hlbHBlcnMnO1xuXG5pbXBvcnQgeyBidWlsZElmTmVlZGVkQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvYnVpbGRJZk5lZWRlZC5qcyc7XG5pbXBvcnQgeyBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvb3B0aW1pemVGb3JEb2NrZXJCdWlsZC5qcyc7XG5pbXBvcnQgeyBwcmlzbWFDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9wcmlzbWEuanMnO1xuaW1wb3J0IHsgcmV0cnlDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9yZXRyeS5qcyc7XG5pbXBvcnQgeyBzZXR1cENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3NldHVwLmpzJztcbmltcG9ydCB7IHN0YXJ0Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvc3RhcnQuanMnO1xuaW1wb3J0IHsgdGVzdENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHsgdGNDb21tYW5kLCB0eXBlQ2hlY2tDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy90eXBlY2hlY2suanMnO1xuaW1wb3J0IHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuYXdhaXQgeWFyZ3MoaGlkZUJpbihwcm9jZXNzLmFyZ3YpKVxuICAuc2NyaXB0TmFtZSgnd2InKVxuICAub3B0aW9ucyhzaGFyZWRPcHRpb25zQnVpbGRlcilcbiAgLm1pZGRsZXdhcmUoKGFyZ3YpID0+IHtcbiAgICBjb25zdCB3b3JraW5nRGlyID0gYXJndlsnd29ya2luZy1kaXInXTtcbiAgICBpZiAod29ya2luZ0Rpcikge1xuICAgICAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZSh3b3JraW5nRGlyKTtcbiAgICAgIHByb2Nlc3MuY2hkaXIoZGlyUGF0aCk7XG4gICAgfVxuXG4gICAgcmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzKHByb2Nlc3MuZW52KTtcbiAgfSlcbiAgLmNvbW1hbmQoYnVpbGRJZk5lZWRlZENvbW1hbmQpXG4gIC5jb21tYW5kKG9wdGltaXplRm9yRG9ja2VyQnVpbGRDb21tYW5kKVxuICAuY29tbWFuZChwcmlzbWFDb21tYW5kKVxuICAuY29tbWFuZChyZXRyeUNvbW1hbmQpXG4gIC5jb21tYW5kKHNldHVwQ29tbWFuZClcbiAgLmNvbW1hbmQoc3RhcnRDb21tYW5kKVxuICAuY29tbWFuZCh0ZXN0Q29tbWFuZClcbiAgLmNvbW1hbmQodHlwZUNoZWNrQ29tbWFuZClcbiAgLmNvbW1hbmQodGNDb21tYW5kKVxuICAuZGVtYW5kQ29tbWFuZCgpXG4gIC5zdHJpY3QoKVxuICAuaGVscCgpLmFyZ3Y7XG5cbmZvciAoY29uc3Qgc2lnbmFsIG9mIFsnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddKSB7XG4gIHByb2Nlc3Mub24oc2lnbmFsLCAoKSA9PiBwcm9jZXNzLmV4aXQoKSk7XG59XG4iXSwibmFtZXMiOlsicmVhZEVudmlyb25tZW50VmFyaWFibGVzIiwiYXJndiIsImN3ZCIsImNhY2hlRW5hYmxlZCIsImVudlBhdGhzIiwiZW52IiwibWFwIiwiZW52UGF0aCIsInBhdGgiLCJyZXNvbHZlIiwidG9TdHJpbmciLCJjYXNjYWRlIiwiY2FzY2FkZUVudiIsImNhc2NhZGVOb2RlRW52IiwicHJvY2VzcyIsIk5PREVfRU5WIiwiYXV0b0Nhc2NhZGVFbnYiLCJXQl9FTlYiLCJ1bmRlZmluZWQiLCJsZW5ndGgiLCJwdXNoIiwiam9pbiIsImluY2x1ZGVSb290RW52Iiwicm9vdFBhdGgiLCJmcyIsImV4aXN0c1N5bmMiLCJmbGF0TWFwIiwicmVsYXRpdmUiLCJ2ZXJib3NlIiwiY29uc29sZSIsImluZm8iLCJlbnZWYXJzIiwib3JnRW52VmFycyIsInJlYWRFbnZGaWxlIiwiY291bnQiLCJrZXkiLCJ2YWx1ZSIsIk9iamVjdCIsImVudHJpZXMiLCJjaGVja0VudiIsIm1pc3NpbmdLZXlzIiwia2V5cyIsImZpbHRlciIsIkVycm9yIiwiY2FjaGVkRW52VmFycyIsIk1hcCIsImZpbGVQYXRoIiwiY2FjaGVkIiwiZ2V0IiwicGFyc2VkIiwiY29uZmlnIiwicHJvY2Vzc0VudiIsInNldCIsImV4aXN0c0FzeW5jIiwiUHJvbWlzZSIsImFjY2VzcyIsImNvbnN0YW50cyIsIkZfT0siLCJlcnIiLCJhc3luYyIsInNwYXduQXN5bmMiLCJjb21tYW5kIiwiYXJncyIsIm9wdGlvbnMiLCJyZWplY3QiLCJwcm9jIiwic3Bhd24iLCJzdGRvdXQiLCJzZXRFbmNvZGluZyIsInN0ZGVyciIsIm9uIiwiZGF0YSIsIm1lcmdlT3V0QW5kRXJyb3IiLCJzdG9wcGVkIiwic3RvcFByb2Nlc3MiLCJwaWQiLCJ0cmVlS2lsbCIsImtpbGxPbkV4aXQiLCJlcnJvciIsInJlbW92ZUxpc3RlbmVyIiwicmVtb3ZlQWxsTGlzdGVuZXJzIiwiY29kZSIsInNpZ25hbCIsInN0YXR1cyIsImlucHV0Iiwic3RkaW4iLCJ3cml0ZSIsImVuZCIsImFsaWduIiwicmlnaHQiLCJzdHIiLCJ3aWR0aCIsInRyaW0iLCJzdHJXaWR0aCIsIm1peGluIiwic3RyaW5nV2lkdGgiLCJyZXBlYXQiLCJjZW50ZXIiLCJVSSIsImNvbnN0cnVjdG9yIiwib3B0cyIsIl9hIiwidGhpcyIsIndyYXAiLCJyb3dzIiwic3BhbiIsImRpdiIsInJlc2V0T3V0cHV0Iiwic2hvdWxkQXBwbHlMYXlvdXREU0wiLCJhcHBseUxheW91dERTTCIsImNvbHMiLCJhcmciLCJjb2xGcm9tU3RyaW5nIiwidGVzdCIsInNwbGl0Iiwicm93IiwibGVmdENvbHVtbldpZHRoIiwiZm9yRWFjaCIsImNvbHVtbnMiLCJNYXRoIiwibWluIiwiZmxvb3IiLCJyIiwiaSIsInRleHQiLCJwYWRkaW5nIiwibWVhc3VyZVBhZGRpbmciLCJub0Fuc2kiLCJzdHJpcEFuc2kiLCJtYXRjaCIsImxpbmVzIiwicm93VG9TdHJpbmciLCJsaW5lIiwiaGlkZGVuIiwicmFzdGVyaXplIiwicnJvdyIsImNvbCIsImMiLCJ3cmFwV2lkdGgiLCJuZWdhdGVQYWRkaW5nIiwidHMiLCJmbiIsImFkZEJvcmRlciIsInJlbmRlcklubGluZSIsInJlcGxhY2UiLCJzb3VyY2UiLCJwcmV2aW91c0xpbmUiLCJsZWFkaW5nV2hpdGVzcGFjZSIsInRhcmdldCIsInRhcmdldFRleHRXaWR0aCIsInRyaW1SaWdodCIsInRyaW1MZWZ0IiwicnJvd3MiLCJ3aWR0aHMiLCJjb2x1bW5XaWR0aHMiLCJ3cmFwcGVkIiwiaGFyZCIsImJvcmRlciIsInVuc2hpZnQiLCJBcnJheSIsImZpbGwiLCJ1bnNldCIsInJlbWFpbmluZ1dpZHRoIiwidW5zZXRXaWR0aCIsInciLCJtYXgiLCJtaW5XaWR0aCIsIl9taW5XaWR0aCIsInN0eWxlIiwiYW5zaSIsIlJlZ0V4cCIsInN0YXJ0IiwiY2hhckF0IiwiY2FtZWxDYXNlIiwidG9Mb3dlckNhc2UiLCJ0b1VwcGVyQ2FzZSIsImluZGV4T2YiLCJjYW1lbGNhc2UiLCJuZXh0Q2hyVXBwZXIiLCJsZWFkaW5nSHlwaGVucyIsImNociIsImRlY2FtZWxpemUiLCJqb2luU3RyaW5nIiwibG93ZXJjYXNlIiwibm90Q2FtZWxjYXNlIiwiY2hyTG93ZXIiLCJjaHJTdHJpbmciLCJsb29rc0xpa2VOdW1iZXIiLCJ4IiwiRGVmYXVsdFZhbHVlc0ZvclR5cGVLZXkiLCJpbmNyZW1lbnQiLCJvcmlnIiwic2FuaXRpemVLZXkiLCJfYiIsIl9jIiwibWluTm9kZVZlcnNpb24iLCJZQVJHU19NSU5fTk9ERV9WRVJTSU9OIiwiTnVtYmVyIiwibm9kZVZlcnNpb24iLCJ2ZXJzaW9ucyIsIm5vZGUiLCJ2ZXJzaW9uIiwic2xpY2UiLCJwYXJzZXIiLCJfbWl4aW4iLCJwYXJzZSIsImFyZ3NJbnB1dCIsImFzc2lnbiIsImFsaWFzIiwiYXJyYXkiLCJib29sZWFuIiwiY29uZmlnT2JqZWN0cyIsImNvbmZpZ3VyYXRpb24iLCJjb2VyY2UiLCJkZWZhdWx0IiwiZW52UHJlZml4IiwibmFyZyIsIm5vcm1hbGl6ZSIsInN0cmluZyIsIm51bWJlciIsIl9fIiwiYXJnU3RyaW5nIiwiaXNBcnJheSIsImUiLCJwcmV2QyIsIm9wZW5pbmciLCJpaSIsInRva2VuaXplQXJnU3RyaW5nIiwiaW5wdXRJc1N0cmluZyIsImFsaWFzZXMiLCJhbGlhc0FycmF5cyIsImNvbWJpbmVkIiwiY3JlYXRlIiwiY2hhbmdlIiwiY29uY2F0IiwidiIsInNwbGljZSIsImFsaWFzQXJyYXkiLCJsYXN0QWxpYXMiLCJzZWxmIiwicG9wIiwiY29tYmluZUFsaWFzZXMiLCJkZWZhdWx0cyIsIm5vdEZsYWdzT3B0aW9uIiwibm90RmxhZ3NBcmd2IiwibmV3QWxpYXNlcyIsImRlZmF1bHRlZCIsImZvcm1hdCIsImZsYWdzIiwiYXJyYXlzIiwiYm9vbHMiLCJzdHJpbmdzIiwibnVtYmVycyIsImNvdW50cyIsImNvbmZpZ3MiLCJuYXJncyIsImNvZXJjaW9ucyIsIm5lZ2F0aXZlIiwibmVnYXRlZEJvb2xlYW4iLCJCb29sZWFuIiwib3B0IiwiYXNzaWdubWVudCIsIm9iaiIsInkiLCJleHRlbmRBbGlhc2VzIiwiZmluZCIsImNoZWNrQWxsQWxpYXNlcyIsIm5vdEZsYWdzIiwiXyIsImFyZ3ZSZXR1cm4iLCJ0cnVuY2F0ZWRBcmciLCJicm9rZW4iLCJsZXR0ZXJzIiwibSIsIm5leHQiLCJpc1Vua25vd25PcHRpb25Bc0FyZyIsInB1c2hQb3NpdGlvbmFsIiwiZWF0QXJyYXkiLCJlYXROYXJncyIsInNldEFyZyIsImRlZmF1bHRWYWx1ZSIsImoiLCJtYXliZUNvZXJjZWROdW1iZXIiLCJtYXliZUNvZXJjZU51bWJlciIsImFyZ0FmdGVyRXF1YWxTaWduIiwidG9FYXQiLCJpc05hTiIsImlzVW5kZWZpbmVkIiwiYXZhaWxhYmxlIiwiY29uc3VtZWQiLCJhcmdzVG9TZXQiLCJuYXJnc0NvdW50IiwiZGVmVmFsIiwicHJvY2Vzc1ZhbHVlIiwidmFsIiwic2hvdWxkU3RyaXBRdW90ZXMiLCJwcm9wIiwiYWRkTmV3QWxpYXMiLCJzcGxpdEtleSIsInNldEtleSIsImtleVByb3BlcnRpZXMiLCJhIiwic2hpZnQiLCJpbmNsdWRlcyIsImRlZmluZVByb3BlcnR5IiwiZW51bWVyYWJsZSIsInN1YnN0cmluZyIsInN0cmlwUXVvdGVzIiwiaXNTYWZlSW50ZWdlciIsInBhcnNlRmxvYXQiLCJzZXRDb25maWdPYmplY3QiLCJwcmV2IiwiZnVsbEtleSIsImhhc0tleSIsImFwcGx5RW52VmFycyIsImNvbmZpZ09ubHkiLCJwcmVmaXgiLCJlbnZWYXIiLCJsYXN0SW5kZXhPZiIsImFwcGx5RGVmYXVsdHNBbmRBbGlhc2VzIiwiY2FuTG9nIiwibyIsImlzVHlwZUFycmF5IiwiaXNWYWx1ZUFycmF5IiwiZHVwbGljYXRlIiwiZmxhZyIsInRvQ2hlY2siLCJzZXRBbGlhcyIsImhhc0FueUZsYWciLCJmbGFnc0tleXMiLCJrIiwic29tZSIsImhhc0FsbEZsYWdzIiwiaGFzQWxsU2hvcnRGbGFncyIsInBhdHRlcm5zIiwicGF0dGVybiIsImhhc0ZsYWdzTWF0Y2hpbmciLCJpc1Vua25vd25PcHRpb24iLCJ0eXBlIiwiQk9PTEVBTiIsIlNUUklORyIsIk5VTUJFUiIsIkFSUkFZIiwiZ3Vlc3NUeXBlIiwibnVtIiwiY29uZmlnTG9va3VwIiwiY29uZmlnS2V5IiwiY29uZmlnUGF0aCIsInJlc29sdmVkQ29uZmlnUGF0aCIsInJlc29sdmVDb25maWciLCJyZXF1aXJlIiwiZXgiLCJuYW1lIiwic2V0Q29uZmlnIiwiY29uZmlnT2JqZWN0IiwiYXBwbGllZCIsIlNldCIsImhhcyIsImFsaSIsImFkZCIsImFwcGx5Q29lcmNpb25zIiwic2V0UGxhY2Vob2xkZXJLZXlzIiwiSlNPTiIsInJlYWRGaWxlU3luYyIsInlhcmdzUGFyc2VyIiwiZ2V0UHJvY2Vzc0FyZ3ZCaW5JbmRleCIsImVsZWN0cm9uIiwiZGVmYXVsdEFwcCIsImRldGFpbGVkIiwiWUVycm9yIiwibXNnIiwic3VwZXIiLCJjYXB0dXJlU3RhY2tUcmFjZSIsInNoaW0kMyIsIndyaXRlRmlsZSIsImV4aXN0cyIsImZpbGUiLCJzdGF0U3luYyIsImlzRmlsZSIsInNoaW0iLCJZMThOIiwiZGlyZWN0b3J5IiwidXBkYXRlRmlsZXMiLCJsb2NhbGUiLCJmYWxsYmFja1RvTGFuZ3VhZ2UiLCJjYWNoZSIsIndyaXRlUXVldWUiLCJhcmd1bWVudHMiLCJfdGFnZ2VkTGl0ZXJhbCIsImNiIiwiX3JlYWRMb2NhbGVGaWxlIiwiX2VucXVldWVXcml0ZSIsImFwcGx5IiwiX19uIiwicHJvdG90eXBlIiwiY2FsbCIsInNpbmd1bGFyIiwicGx1cmFsIiwicXVhbnRpdHkiLCJvbmUiLCJvdGhlciIsInZhbHVlcyIsInNldExvY2FsZSIsImdldExvY2FsZSIsInVwZGF0ZUxvY2FsZSIsImhhc093blByb3BlcnR5IiwicGFydHMiLCJwYXJ0Iiwid29yayIsIl9wcm9jZXNzV3JpdGVRdWV1ZSIsIl90aGlzIiwibGFuZ3VhZ2VGaWxlIiwiX3Jlc29sdmVMb2NhbGVGaWxlIiwic2VyaWFsaXplZExvY2FsZSIsInN0cmluZ2lmeSIsImxvY2FsZUxvb2t1cCIsIlN5bnRheEVycm9yIiwibWVzc2FnZSIsIl9maWxlRXhpc3RzU3luYyIsIlJFUVVJUkVfRElSRUNUT1JZX0VSUk9SIiwiX19kaXJuYW1lIiwiZmlsZVVSTFRvUGF0aCIsInVybCIsInNoaW0kMSIsImFzc2VydCIsIm5vdFN0cmljdEVxdWFsIiwic3RyaWN0RXF1YWwiLCJjbGl1aSIsImZpbmRVcCIsImNhbGxiYWNrIiwidG1wIiwiZGlyIiwiaXNEaXJlY3RvcnkiLCJkaXJuYW1lIiwicmVhZGRpclN5bmMiLCJnZXRFbnYiLCJpbnNwZWN0IiwiZ2V0Q2FsbGVyRmlsZSIsImdldFByb2Nlc3NBcmd2QmluIiwibWFpbkZpbGVuYW1lIiwiUGFyc2VyIiwiYmFzZW5hbWUiLCJleHRuYW1lIiwiZW1pdFdhcm5pbmciLCJ3YXJuaW5nIiwiZXhlY1BhdGgiLCJleGl0IiwibmV4dFRpY2siLCJzdGRDb2x1bW5zIiwicmVxdWlyZURpcmVjdG9yeSIsInkxOG4iLCJfc2hpbSIsImJpbmQiLCJfeTE4biIsImFzc2VydE5vdFN0cmljdEVxdWFsIiwiYWN0dWFsIiwiZXhwZWN0ZWQiLCJhc3NlcnRTaW5nbGVLZXkiLCJvYmplY3RLZXlzIiwib2JqZWN0IiwiaXNQcm9taXNlIiwibWF5YmVQcm9taXNlIiwidGhlbiIsInBhcnNlQ29tbWFuZCIsImNtZCIsInNwbGl0Q29tbWFuZCIsImJyZWdleCIsImZpcnN0Q29tbWFuZCIsInBhcnNlZENvbW1hbmQiLCJkZW1hbmRlZCIsIm9wdGlvbmFsIiwidmFyaWFkaWMiLCJwb3NpdGlvbk5hbWUiLCJhcmdzZXJ0IiwiYXJnMSIsImFyZzIiLCJhcmczIiwicG9zaXRpb24iLCJjYWxsZXJBcmd1bWVudHMiLCJfbGVuZ3RoIiwidG90YWxDb21tYW5kcyIsIm9ic2VydmVkVHlwZSIsImFyZ3VtZW50VHlwZUVycm9yIiwid2FybiIsInN0YWNrIiwiYWxsb3dlZFR5cGVzIiwiR2xvYmFsTWlkZGxld2FyZSIsInlhcmdzIiwiZ2xvYmFsTWlkZGxld2FyZSIsImZyb3plbnMiLCJhZGRNaWRkbGV3YXJlIiwiYXBwbHlCZWZvcmVWYWxpZGF0aW9uIiwiZ2xvYmFsIiwibXV0YXRlcyIsImFkZENvZXJjZU1pZGRsZXdhcmUiLCJvcHRpb24iLCJnZXRBbGlhc2VzIiwiZ2V0TWlkZGxld2FyZSIsImZyZWV6ZSIsInVuZnJlZXplIiwiZnJvemVuIiwicmVzZXQiLCJhcHBseU1pZGRsZXdhcmUiLCJtaWRkbGV3YXJlcyIsImJlZm9yZVZhbGlkYXRpb24iLCJyZWR1Y2UiLCJhY2MiLCJtaWRkbGV3YXJlIiwiaW5pdGlhbE9iaiIsImFsbCIsIm1pZGRsZXdhcmVPYmoiLCJyZXN1bHQiLCJtYXliZUFzeW5jUmVzdWx0IiwiZ2V0UmVzdWx0IiwicmVzdWx0SGFuZGxlciIsImVycm9ySGFuZGxlciIsIkRFRkFVTFRfTUFSS0VSIiwiQ29tbWFuZEluc3RhbmNlIiwidXNhZ2UiLCJ2YWxpZGF0aW9uIiwicmVxdWlyZUNhY2hlIiwiaGFuZGxlcnMiLCJhbGlhc01hcCIsImFkZERpcmVjdG9yeSIsInJlcSIsImNhbGxlckZpbGUiLCJyZWN1cnNlIiwiZXh0ZW5zaW9ucyIsInBhcmVudFZpc2l0IiwidmlzaXQiLCJqb2luZWQiLCJmaWxlbmFtZSIsInZpc2l0ZWQiLCJhZGRIYW5kbGVyIiwiZGVzY3JpcHRpb24iLCJidWlsZGVyIiwiaGFuZGxlciIsImNvbW1hbmRNaWRkbGV3YXJlIiwiZGVwcmVjYXRlZCIsImNvbW1hbmRNaWRkbGV3YXJlRmFjdG9yeSIsImV2ZXJ5IiwiaXNDb21tYW5kQW5kQWxpYXNlcyIsImlzQ29tbWFuZEhhbmRsZXJEZWZpbml0aW9uIiwibW9kdWxlTmFtZSIsImV4dHJhY3REZXNjIiwiaXNDb21tYW5kQnVpbGRlckRlZmluaXRpb24iLCJpc0RlZmF1bHQiLCJwYXJzZWRBbGlhc2VzIiwib3JpZ2luYWwiLCJkZWZhdWx0Q29tbWFuZCIsImdldENvbW1hbmRIYW5kbGVycyIsImdldENvbW1hbmRzIiwiaGFzRGVmYXVsdENvbW1hbmQiLCJydW5Db21tYW5kIiwiY29tbWFuZEluZGV4IiwiaGVscE9ubHkiLCJoZWxwT3JWZXJzaW9uU2V0IiwiY29tbWFuZEhhbmRsZXIiLCJjdXJyZW50Q29udGV4dCIsImdldEludGVybmFsTWV0aG9kcyIsImdldENvbnRleHQiLCJwYXJlbnRDb21tYW5kcyIsImNvbW1hbmRzIiwiaXNEZWZhdWx0Q29tbWFuZCIsImZ1bGxDb21tYW5kcyIsImJ1aWxkZXJSZXN1bHQiLCJhcHBseUJ1aWxkZXJVcGRhdGVVc2FnZUFuZFBhcnNlIiwiYXBwbHlNaWRkbGV3YXJlQW5kR2V0UmVzdWx0IiwiaW5uZXJBcmd2IiwiaW5uZXJZYXJncyIsImlzQ29tbWFuZEJ1aWxkZXJDYWxsYmFjayIsImdldFVzYWdlSW5zdGFuY2UiLCJidWlsZGVyT3V0cHV0Iiwib3V0cHV0IiwicGFyc2VBbmRVcGRhdGVVc2FnZSIsImlzQ29tbWFuZEJ1aWxkZXJPcHRpb25EZWZpbml0aW9ucyIsInNob3VsZFVwZGF0ZVVzYWdlIiwidXNhZ2VGcm9tUGFyZW50Q29tbWFuZHNDb21tYW5kSGFuZGxlciIsInJ1bllhcmdzUGFyc2VyQW5kRXhlY3V0ZUNvbW1hbmRzIiwiZ2V0VXNhZ2VEaXNhYmxlZCIsImdldFVzYWdlIiwicGMiLCJoYW5kbGVWYWxpZGF0aW9uQW5kR2V0UmVzdWx0IiwicG9zaXRpb25hbE1hcCIsImdldEhhc091dHB1dCIsInJ1blZhbGlkYXRpb24iLCJzZXRIYXNPdXRwdXQiLCJwb3B1bGF0ZURvdWJsZURhc2giLCJnZXRPcHRpb25zIiwicG9zdFByb2Nlc3MiLCJoYW5kbGVyUmVzdWx0IiwiY2FjaGVIZWxwTWVzc2FnZSIsImhhc1BhcnNlQ2FsbGJhY2siLCJjYXRjaCIsImZhaWwiLCJfZXJyIiwicG9wdWxhdGVQb3NpdGlvbmFscyIsIm1heWJlUHJvbWlzZUFyZ3YiLCJyZXNvbHZlZElubmVyQXJndiIsImNvbnRleHQiLCJwb3NpdGlvbmFsQ291bnQiLCJkZW1hbmQiLCJwb3B1bGF0ZVBvc2l0aW9uYWwiLCJtYXliZSIsInBvc3RQcm9jZXNzUG9zaXRpb25hbHMiLCJjbWRUb1BhcnNlT3B0aW9ucyIsInBvc2l0aW9uYWwiLCJTdHJpbmciLCJjbWRTdHJpbmciLCJwYXJzZU9wdGlvbnMiLCJkIiwidW5wYXJzZWQiLCJwb3NpdGlvbmFsS2V5cyIsImlzSW5Db25maWdzIiwiaXNEZWZhdWx0ZWQiLCJydW5EZWZhdWx0QnVpbGRlck9uIiwiY29tbWFuZFN0cmluZyIsIm1vZCIsImV4cG9ydGVkIiwiZmlsZXMiLCJleHBvcnRzIiwid2hpY2hNb2R1bGUiLCJjb21tYW5kRnJvbUZpbGVuYW1lIiwiZGVzY3JpYmUiLCJkZXNjIiwib2JqRmlsdGVyIiwic2V0QmxvY2tpbmciLCJibG9ja2luZyIsIl9zdHJlYW0iLCJzdHJlYW0iLCJfaGFuZGxlIiwiaXNUVFkiLCJpc0Jvb2xlYW4iLCJmYWlscyIsImZhaWxGbiIsImYiLCJmYWlsTWVzc2FnZSIsImdsb2JhbEZhaWxNZXNzYWdlIiwic2hvd0hlbHBPbkZhaWwiLCJlbmFibGVkIiwiaXNHbG9iYWxDb250ZXh0IiwiZmFpbHVyZU91dHB1dCIsImxvZ2dlciIsImdldExvZ2dlckluc3RhbmNlIiwiZ2V0RXhpdFByb2Nlc3MiLCJzaG93SGVscCIsImdsb2JhbE9yQ29tbWFuZEZhaWxNZXNzYWdlIiwidXNhZ2VzIiwidXNhZ2VEaXNhYmxlZCIsImdldFBvc2l0aW9uYWxHcm91cE5hbWUiLCJleGFtcGxlcyIsImV4YW1wbGUiLCJjbWRBcnJheSIsImRlc2NyaXB0aW9ucyIsImtleU9yS2V5cyIsImdldERlc2NyaXB0aW9ucyIsImVwaWxvZ3MiLCJlcGlsb2ciLCJ3cmFwU2V0IiwiZ2V0V3JhcCIsIm1heFdpZHRoIiwid2luZG93V2lkdGgiLCJkZWZlclkxOG5Mb29rdXBQcmVmaXgiLCJ0YWJsZSIsInRoZVdyYXAiLCJtb2RpZmllciIsImdldFRleHQiLCJnZXRJbmRlbnRhdGlvbiIsInBhcnNlSW50IiwiY2FjaGVkSGVscE1lc3NhZ2UiLCJmaWx0ZXJIaWRkZW5PcHRpb25zIiwiaGlkZGVuT3B0aW9ucyIsInNob3dIaWRkZW5PcHQiLCJkZWZhdWx0U3RyaW5nIiwiZGVmYXVsdERlc2NyaXB0aW9uIiwiZGVmZXJZMThuTG9va3VwIiwiaGVscCIsImRlbWFuZGVkT3B0aW9ucyIsImdldERlbWFuZGVkT3B0aW9ucyIsImRlbWFuZE9wdGlvbiIsIm5vcm1hbGl6ZUFsaWFzZXMiLCJiYXNlJDAiLCJjdXN0b21TY3JpcHROYW1lIiwiJDAiLCJkZW1hbmRlZENvbW1hbmRzIiwiZ2V0RGVtYW5kZWRDb21tYW5kcyIsImRlcHJlY2F0ZWRPcHRpb25zIiwiZ2V0RGVwcmVjYXRlZE9wdGlvbnMiLCJncm91cHMiLCJnZXRHcm91cHMiLCJ1aSIsInUiLCJnZXRQYXJzZXJDb25maWd1cmF0aW9uIiwic29ydCIsImIiLCJsb2NhbGVDb21wYXJlIiwiaGludHMiLCJhbGlhc0tleXMiLCJkZWZhdWx0R3JvdXAiLCJncm91cGVkS2V5cyIsImdyb3VwIiwiYWRkVW5ncm91cGVkS2V5cyIsImlzTG9uZ1N3aXRjaCIsInN3IiwiZGlzcGxheWVkR3JvdXBzIiwiZ3JvdXBOYW1lIiwibm9ybWFsaXplZEtleXMiLCJhbGlhc0tleSIsInN3aXRjaGVzIiwic3cxIiwic3cyIiwiaW5kZW50IiwiaXNJbmRlbnRlZFRleHQiLCJpbmRlbnRhdGlvbiIsImtzd2l0Y2giLCJleHRyYSIsImNob2ljZXMiLCJzdHJpbmdpZmllZFZhbHVlcyIsInNob3VsZEhpZGVPcHRpb25FeHRyYXMiLCJnZXRVc2FnZUNvbmZpZ3VyYXRpb24iLCJjbGVhckNhY2hlZEhlbHBNZXNzYWdlIiwiaGFzQ2FjaGVkSGVscE1lc3NhZ2UiLCJsZXZlbCIsImZ1bmN0aW9uRGVzY3JpcHRpb24iLCJzZXBhcmF0b3IiLCJzZXAiLCJ2ZXIiLCJzaG93VmVyc2lvbiIsImxvY2FsTG9va3VwIiwiQ29tcGxldGlvbiIsImNvbXBsZXRpb25LZXkiLCJjdXN0b21Db21wbGV0aW9uRnVuY3Rpb24iLCJpbmRleEFmdGVyTGFzdFJlc2V0IiwienNoU2hlbGwiLCJkZWZhdWx0Q29tcGxldGlvbiIsImN1cnJlbnQiLCJkb25lIiwiY29tcGxldGlvbnMiLCJjb21tYW5kQ29tcGxldGlvbnMiLCJvcHRpb25Db21wbGV0aW9ucyIsImNob2ljZXNGcm9tT3B0aW9uc0NvbXBsZXRpb25zIiwiY2hvaWNlc0Zyb21Qb3NpdGlvbmFsc0NvbXBsZXRpb25zIiwicHJldmlvdXNBcmdIYXNDaG9pY2VzIiwidXNhZ2VDb21tYW5kIiwiY29tbWFuZE5hbWUiLCJuZWdhYmxlIiwiYXJnc0NvbnRhaW5LZXkiLCJjb21wbGV0ZU9wdGlvbktleSIsImdldFByZXZpb3VzQXJnQ2hvaWNlcyIsIm9mZnNldCIsInBvc2l0aW9uYWxLZXkiLCJjaG9pY2UiLCJzdGFydHNXaXRoIiwicHJldmlvdXNBcmciLCJwcmV2aW91c0FyZ0tleSIsInBvc3NpYmxlQWxpYXNlcyIsInBvc3NpYmxlQWxpYXMiLCJhcmdzQ29udGFpbnMiLCJzIiwiX2QiLCJrZXlXaXRoRGVzYyIsImRlc2NzIiwiZGVzY0Zyb21BbGlhcyIsImRhc2hlcyIsInN0YXJ0c0J5VHdvRGFzaGVzIiwiaXNTaG9ydE9wdGlvbiIsImN1c3RvbUNvbXBsZXRpb24iLCJsaXN0IiwiY29tcGxldGlvbkZ1bmN0aW9uIiwiaXNGYWxsYmFja0NvbXBsZXRpb25GdW5jdGlvbiIsIm9uQ29tcGxldGVkIiwiZ2V0Q29tcGxldGlvbiIsImdlbmVyYXRlQ29tcGxldGlvblNjcmlwdCIsInNjcmlwdCIsInJlZ2lzdGVyRnVuY3Rpb24iLCJzZXRQYXJzZWQiLCJsZXZlbnNodGVpbiIsIm1hdHJpeCIsInNwZWNpYWxLZXlzIiwicHJldmlvdXNseVZpc2l0ZWRDb25maWdzIiwiYXBwbHlFeHRlbmRzIiwibWVyZ2VFeHRlbmRzIiwiZGVmYXVsdENvbmZpZyIsImV4dGVuZHMiLCJpc1BhdGgiLCJwYXRoVG9EZWZhdWx0IiwicGF0aFRvRXh0ZW5kIiwiZ2V0UGF0aFRvRGVmYXVsdENvbmZpZyIsImNmZ1BhdGgiLCJjaGVja0ZvckNpcmN1bGFyRXh0ZW5kcyIsIm1lcmdlRGVlcCIsImNvbmZpZzEiLCJjb25maWcyIiwiaXNPYmplY3QiLCJfWWFyZ3NJbnN0YW5jZV9jb21tYW5kIiwiX1lhcmdzSW5zdGFuY2VfY3dkIiwiX1lhcmdzSW5zdGFuY2VfY29udGV4dCIsIl9ZYXJnc0luc3RhbmNlX2NvbXBsZXRpb24iLCJfWWFyZ3NJbnN0YW5jZV9jb21wbGV0aW9uQ29tbWFuZCIsIl9ZYXJnc0luc3RhbmNlX2RlZmF1bHRTaG93SGlkZGVuT3B0IiwiX1lhcmdzSW5zdGFuY2VfZXhpdEVycm9yIiwiX1lhcmdzSW5zdGFuY2VfZGV0ZWN0TG9jYWxlIiwiX1lhcmdzSW5zdGFuY2VfZW1pdHRlZFdhcm5pbmdzIiwiX1lhcmdzSW5zdGFuY2VfZXhpdFByb2Nlc3MiLCJfWWFyZ3NJbnN0YW5jZV9mcm96ZW5zIiwiX1lhcmdzSW5zdGFuY2VfZ2xvYmFsTWlkZGxld2FyZSIsIl9ZYXJnc0luc3RhbmNlX2dyb3VwcyIsIl9ZYXJnc0luc3RhbmNlX2hhc091dHB1dCIsIl9ZYXJnc0luc3RhbmNlX2hlbHBPcHQiLCJfWWFyZ3NJbnN0YW5jZV9pc0dsb2JhbENvbnRleHQiLCJfWWFyZ3NJbnN0YW5jZV9sb2dnZXIiLCJfWWFyZ3NJbnN0YW5jZV9vdXRwdXQiLCJfWWFyZ3NJbnN0YW5jZV9vcHRpb25zIiwiX1lhcmdzSW5zdGFuY2VfcGFyZW50UmVxdWlyZSIsIl9ZYXJnc0luc3RhbmNlX3BhcnNlckNvbmZpZyIsIl9ZYXJnc0luc3RhbmNlX3BhcnNlRm4iLCJfWWFyZ3NJbnN0YW5jZV9wYXJzZUNvbnRleHQiLCJfWWFyZ3NJbnN0YW5jZV9wa2dzIiwiX1lhcmdzSW5zdGFuY2VfcHJlc2VydmVkR3JvdXBzIiwiX1lhcmdzSW5zdGFuY2VfcHJvY2Vzc0FyZ3MiLCJfWWFyZ3NJbnN0YW5jZV9yZWNvbW1lbmRDb21tYW5kcyIsIl9ZYXJnc0luc3RhbmNlX3NoaW0iLCJfWWFyZ3NJbnN0YW5jZV9zdHJpY3QiLCJfWWFyZ3NJbnN0YW5jZV9zdHJpY3RDb21tYW5kcyIsIl9ZYXJnc0luc3RhbmNlX3N0cmljdE9wdGlvbnMiLCJfWWFyZ3NJbnN0YW5jZV91c2FnZSIsIl9ZYXJnc0luc3RhbmNlX3VzYWdlQ29uZmlnIiwiX1lhcmdzSW5zdGFuY2VfdmVyc2lvbk9wdCIsIl9ZYXJnc0luc3RhbmNlX3ZhbGlkYXRpb24iLCJfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0IiwicmVjZWl2ZXIiLCJzdGF0ZSIsImtpbmQiLCJUeXBlRXJyb3IiLCJfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0Iiwia0NvcHlEb3VibGVEYXNoIiwiU3ltYm9sIiwia0NyZWF0ZUxvZ2dlciIsImtEZWxldGVGcm9tUGFyc2VySGludE9iamVjdCIsImtFbWl0V2FybmluZyIsImtGcmVlemUiLCJrR2V0RG9sbGFyWmVybyIsImtHZXRQYXJzZXJDb25maWd1cmF0aW9uIiwia0dldFVzYWdlQ29uZmlndXJhdGlvbiIsImtHdWVzc0xvY2FsZSIsImtHdWVzc1ZlcnNpb24iLCJrUGFyc2VQb3NpdGlvbmFsTnVtYmVycyIsImtQa2dVcCIsImtQb3B1bGF0ZVBhcnNlckhpbnRBcnJheSIsImtQb3B1bGF0ZVBhcnNlckhpbnRTaW5nbGVWYWx1ZURpY3Rpb25hcnkiLCJrUG9wdWxhdGVQYXJzZXJIaW50QXJyYXlEaWN0aW9uYXJ5Iiwia1BvcHVsYXRlUGFyc2VySGludERpY3Rpb25hcnkiLCJrU2FuaXRpemVLZXkiLCJrU2V0S2V5Iiwia1VuZnJlZXplIiwia1ZhbGlkYXRlQXN5bmMiLCJrR2V0Q29tbWFuZEluc3RhbmNlIiwia0dldENvbnRleHQiLCJrR2V0SGFzT3V0cHV0Iiwia0dldExvZ2dlckluc3RhbmNlIiwia0dldFBhcnNlQ29udGV4dCIsImtHZXRVc2FnZUluc3RhbmNlIiwia0dldFZhbGlkYXRpb25JbnN0YW5jZSIsImtIYXNQYXJzZUNhbGxiYWNrIiwia0lzR2xvYmFsQ29udGV4dCIsImtQb3N0UHJvY2VzcyIsImtSZWJhc2UiLCJrUmVzZXQiLCJrUnVuWWFyZ3NQYXJzZXJBbmRFeGVjdXRlQ29tbWFuZHMiLCJrUnVuVmFsaWRhdGlvbiIsImtTZXRIYXNPdXRwdXQiLCJrVHJhY2tNYW51YWxseVNldEtleXMiLCJZYXJnc0luc3RhbmNlIiwicHJvY2Vzc0FyZ3MiLCJwYXJlbnRSZXF1aXJlIiwiYWRkSGVscE9wdCIsImFkZFNob3dIaWRkZW5PcHQiLCJzaG93SGlkZGVuIiwiY2hlY2siLCJfeWFyZ3MiLCJzdHJpcEFsaWFzZWQiLCJjb25mbGljdHMiLCJrZXkxIiwia2V5MiIsInBhcnNlRm4iLCJjb21wbGV0aW9uIiwiY29tbWFuZERpciIsImRlbWFuZENvbW1hbmQiLCJtaW5Nc2ciLCJtYXhNc2ciLCJJbmZpbml0eSIsImRlcHJlY2F0ZU9wdGlvbiIsImRldGVjdExvY2FsZSIsImRldGVjdCIsImVwaWxvZ3VlIiwiZXhhbXBsZVBhcmFtcyIsImV4aXRQcm9jZXNzIiwiZ2V0RGV0ZWN0TG9jYWxlIiwiZ2V0SGVscCIsImJ1aWxkZXJSZXNwb25zZSIsImdldFN0cmljdCIsImdldFN0cmljdENvbW1hbmRzIiwiZ2V0U3RyaWN0T3B0aW9ucyIsImdsb2JhbHMiLCJsb2NhbCIsImwiLCJnIiwiZXhpc3RpbmciLCJzZWVuIiwiaGlkZSIsImltcGxpZXMiLCJkZXByZWNhdGUiLCJyZXF1aXJlZCIsImNvbmZpZ1BhcnNlciIsInNraXBWYWxpZGF0aW9uIiwicmVxdWlyZXNBcmciLCJzaG9ydENpcmN1aXQiLCJfcGFyc2VGbiIsInRtcFBhcnNlZCIsImZpbmFsbHkiLCJwYXJzZUFzeW5jIiwicGFyc2VTeW5jIiwicGFyc2VyQ29uZmlndXJhdGlvbiIsInBrZ0NvbmYiLCJjb25mIiwic3VwcG9ydGVkT3B0cyIsImZ1bGxDb21tYW5kIiwicGsiLCJwYXJzZU9wdGlvbiIsInJlY29tbWVuZENvbW1hbmRzIiwicmVjb21tZW5kIiwiTmFOIiwic2hvd0NvbXBsZXRpb25TY3JpcHQiLCJsb2ciLCJzY3JpcHROYW1lIiwic3RyaWN0Iiwic3RyaWN0Q29tbWFuZHMiLCJzdHJpY3RPcHRpb25zIiwidGVybWluYWxXaWR0aCIsInVwZGF0ZVN0cmluZ3MiLCJ1c2FnZUNvbmZpZ3VyYXRpb24iLCJkZWZhdWx0VmVyc2lvbk9wdCIsIldlYWtNYXAiLCJvcHRpb25LZXkiLCJoaW50S2V5IiwiaGludCIsImRlZHVwbGljYXRpb25JZCIsImNvbXBsZXRpb25Db21tYW5kIiwiZXhpdEVycm9yIiwiaGFzT3V0cHV0IiwicGFyc2VDb250ZXh0IiwiZGVmYXVsdCQwIiwibnBhdGgiLCJzdGFydERpciIsInBrZ0pzb25QYXRoIiwibmFtZXMiLCJfbm9vcCIsInNpbmdsZUtleUhhbmRsZXIiLCJfZSIsIl9mIiwiX2ciLCJfaCIsIl9qIiwiX2siLCJfbCIsIl9tIiwiX28iLCJnZXRDb21tYW5kSW5zdGFuY2UiLCJnZXRQYXJzZUNvbnRleHQiLCJnZXRWYWxpZGF0aW9uSW5zdGFuY2UiLCJjYWxsZWRGcm9tQ29tbWFuZCIsInJ1bkdsb2JhbE1pZGRsZXdhcmUiLCJ0bXBPcHRpb25zIiwiVXNhZ2UiLCJfcyIsIm9ic2VydmVkIiwibWlzc2luZyIsImN1c3RvbU1zZ3MiLCJjdXN0b21Nc2ciLCJjaGVja1Bvc2l0aW9uYWxzIiwiY29tbWFuZEtleXMiLCJ1bmtub3duIiwiaXNWYWxpZEFuZFNvbWVBbGlhc0lzTm90TmV3IiwibWF4Tm9uT3B0RGVtYW5kZWQiLCJpbnZhbGlkIiwiaW52YWxpZEtleXMiLCJpbXBsaWVkIiwia2V5RXhpc3RzIiwiZ2V0SW1wbGllZCIsImltcGxpY2F0aW9ucyIsImltcGx5RmFpbCIsIm9yaWdLZXkiLCJvcmlnVmFsdWUiLCJjb25mbGljdGluZyIsImdldENvbmZsaWN0aW5nIiwicG90ZW50aWFsQ29tbWFuZHMiLCJyZWNvbW1lbmRlZCIsImJlc3REaXN0YW5jZSIsImNhbmRpZGF0ZSIsImRpc3RhbmNlIiwiVmFsaWRhdGlvbiIsIkNvbW1hbmQiLCJiYXNlIiwiYXJndlByb21pc2UiLCJoZWxwT3B0U2V0IiwidmVyc2lvbk9wdFNldCIsImhhbmRsZXJLZXlzIiwicmVxdWVzdENvbXBsZXRpb25zIiwic2tpcFJlY29tbWVuZGF0aW9uIiwiZmlyc3RVbmtub3duQ29tbWFuZCIsImNvbXBsZXRpb25BcmdzIiwicGFyc2VFcnJvcnMiLCJub25PcHRpb25Db3VudCIsInJlcXVpcmVkQXJndW1lbnRzIiwiZmFpbGVkU3RyaWN0Q29tbWFuZHMiLCJ1bmtub3duQ29tbWFuZHMiLCJ1bmtub3duQXJndW1lbnRzIiwibGltaXRlZENob2ljZXMiLCJZYXJncyIsImVzbVBsYXRmb3JtU2hpbSIsImlzUnVubmluZ09uQnVuIiwiZW5kc1dpdGgiLCJydW50aW1lV2l0aEFyZ3MiLCJwYWNrYWdlTWFuYWdlcldpdGhBcmdzIiwibWVtb2l6ZSIsImNhY2hlRHVyYXRpb24iLCJ0IiwiUE9TSVRJVkVfSU5GSU5JVFkiLCJjYWNoZXMiLCJjYWxjS2V5IiwibiIsImNvZGVQb2ludEF0IiwiaW11bCIsInBhZFN0YXJ0IiwibWF4Q2FjaGVkQXJnc1NpemUiLCJtYXhDYWNoZWRUaGlzU2l6ZSIsIkRhdGUiLCJub3ciLCJzaXplIiwiZGVsZXRlIiwiaCIsIm1lbW9pemVGYWN0b3J5IiwiTUFYX1NBRkVfSU5URUdFUiIsIlByb2plY3QiLCJfaW5pdFByb3RvIiwiX2FwcGx5RGVjcyIsInBhdGhCeU5hbWUiLCJkaXJQYXRoIiwibG9hZEVudiIsIl9kaXJQYXRoIiwiaXNCdW5BdmFpbGFibGUiLCJyb290RGlyUGF0aCIsImJ1aWxkQ29tbWFuZCIsInBhY2thZ2VKc29uIiwic2NyaXB0cyIsImJ1aWxkIiwiZG9ja2VyZmlsZSIsImZpbmRGaWxlIiwiaGFzRG9ja2VyZmlsZSIsImhhc1NvdXJjZUNvZGUiLCJkb2NrZXJJbWFnZU5hbWUiLCJyZXBsYWNlQWxsIiwiaGFzUHJpc21hIiwiZGVwZW5kZW5jaWVzIiwiZGV2RGVwZW5kZW5jaWVzIiwiZG9ja2VyUGFja2FnZUpzb24iLCJiaW5FeGlzdHMiLCJiaW5Gb3VuZCIsImN1cnJlbnRQYXRoIiwiYmluUGF0aCIsIlBBVEgiLCJwYXJlbnRQYXRoIiwiZmlsZU5hbWUiLCJwIiwiZmluZFNlbGZQcm9qZWN0IiwiZmluZEFsbFByb2plY3RzIiwicm9vdEFuZFNlbGZQcm9qZWN0cyIsInRoaXNQcm9qZWN0Iiwicm9vdFByb2plY3QiLCJ3b3Jrc3BhY2VzIiwicm9vdCIsImZpbmRSb290QW5kU2VsZlByb2plY3RzIiwiZ2V0QWxsUHJvamVjdHMiLCJhbGxQcm9qZWN0cyIsIndvcmtzcGFjZSIsImdsb2JQYXR0ZXJuIiwicGFja2FnZURpcnMiLCJ3b3Jrc3BhY2VQYXRoIiwid3MiLCJnbG9iYnkiLCJkb3QiLCJvbmx5RGlyZWN0b3JpZXMiLCJzdWJQYWNrYWdlRGlyUGF0aCIsImJ1aWxkSWZOZWVkZWRDb21tYW5kIiwicHJvamVjdFBhdGhGb3JUZXN0aW5nIiwicHJvamVjdCIsImNoYWxrIiwicmVkIiwiY2FuU2tpcCIsImNhY2hlRmlsZVBhdGgiLCJjb250ZW50SGFzaCIsImNhY2hlRGlyZWN0b3J5UGF0aCIsInByb21pc2VzIiwibWtkaXIiLCJyZWN1cnNpdmUiLCJoYXNoIiwiY3JlYXRlSGFzaCIsImNvbW1pdEhhc2giLCJjaGlsZF9wcm9jZXNzIiwiZXhlY1N5bmMiLCJ1cGRhdGUiLCJlbnZpcm9ubWVudEpzb24iLCJpZ25vcmluZ0VudlZhck5hbWVzIiwiZmlsdGVyZWRGaWxlUGF0aHMiLCJzcGF3blN5bmMiLCJzdGRpbyIsImVuY29kaW5nIiwiaW5jbHVkZVBhdHRlcm5zIiwiaW5jbHVkZVN1ZmZpeCIsInN1ZmZpeCIsImV4Y2x1ZGVQYXR0ZXJucyIsImNvcHkiLCJkaWdlc3QiLCJ1cGRhdGVIYXNoV2l0aERpZmZSZXN1bHQiLCJjYWNoZWRDb250ZW50SGFzaCIsImlnbm9yZUVub2VudEFzeW5jIiwicmVhZEZpbGUiLCJjYW5Ta2lwQnVpbGQiLCJncmVlbiIsImRyeVJ1biIsImJ1aWxkSWZOZWVkZWQiLCJyZXQiLCJzaGVsbCIsImV4aXRDb2RlIiwicHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kIiwicHJvamVjdHMiLCJvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZCIsIm91dHNpZGUiLCJkZXBzIiwib3B0aW1pemVEZXZEZXBlbmRlbmNpZXMiLCJvcHRpbWl6ZVNjcmlwdHMiLCJvcHRpbWl6ZVJvb3RQcm9wcyIsImRpc3REaXJQYXRoIiwiZGV2RGVwcyIsIm5hbWVXb3Jkc1RvQmVSZW1vdmVkIiwid29yZCIsIm5hbWVXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzIiwiY29udGVudFdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMiLCJjb250ZW50IiwicHJpdmF0ZSIsInB1Ymxpc2hDb25maWciLCJwcmV0dGllciIsInByaXNtYVNjcmlwdHMiLCJkZXBsb3kiLCJkZXBsb3lGb3JjZSIsImJhY2t1cFBhdGgiLCJkaXJOYW1lIiwibGl0ZXN0cmVhbSIsIm1pZ3JhdGUiLCJzZWVkIiwibWlncmF0ZURldiIsInJlc3RvcmUiLCJvdXRwdXRQYXRoIiwic2NyaXB0UGF0aCIsInByaXNtYSIsInN0dWRpbyIsImRiVXJsT3JQYXRoIiwiVVJMIiwiYWJzb2x1dGVQYXRoIiwia2lsbGVkIiwia2lsbFBvcnRQcm9jZXNzSGFuZGxpbmdFcnJvcnMiLCJwb3J0Iiwia2lsbFBvcnRQcm9jZXNzIiwicHJvbWlzZVBvb2wiLCJQcm9taXNlUG9vbCIsImRlZmF1bHRPcHRpb25zIiwiZXhpdElmRmFpbGVkIiwicnVuV2l0aFNwYXduIiwicHJpbnRhYmxlU2NyaXB0IiwicnVubmFibGVTY3JpcHQiLCJub3JtYWxpemVTY3JpcHQiLCJwcmludFN0YXJ0IiwicHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZCIsImtpbGxGdW5jIiwia2lsbFBvcnRQcm9jZXNzSW1tZWRpYXRlbHlBbmRPbkV4aXQiLCJ0aW1lb3V0IiwicnVuV2l0aFNwYXduSW5QYXJhbGxlbCIsInJ1biIsIm91dCIsIm5ld1NjcmlwdCIsIm5vcm1hbGl6ZWRTY3JpcHQiLCJ3ZWFrIiwiZ3JheSIsImN5YW4iLCJib2xkIiwicHJpc21hQ29tbWFuZCIsImRlcGxveUNvbW1hbmQiLCJkZXBsb3lGb3JjZUNvbW1hbmQiLCJsaXRlc3RyZWFtQ29tbWFuZCIsIm1pZ3JhdGVDb21tYW5kIiwibWlncmF0ZURldkNvbW1hbmQiLCJyZXNldENvbW1hbmQiLCJyZXN0b3JlQ29tbWFuZCIsInNlZWRDb21tYW5kIiwic3R1ZGlvQ29tbWFuZCIsImZpbmRQcmlzbWFQcm9qZWN0cyIsImRlcGxveUZvcmNlQnVpbGRlciIsInJlc3RvcmVkIiwidHJpbUVuZCIsImZpbHRlcmVkIiwicmV0cnlDb21tYW5kIiwicmV0cnkiLCJjbWRBbmRBcmdzIiwibGFzdFN0YXR1cyIsInllbGxvdyIsImh0dHBTZXJ2ZXJQYWNrYWdlcyIsInNldHVwQ29tbWFuZCIsImRpcmVudHMiLCJyZWFkZGlyIiwid2l0aEZpbGVUeXBlcyIsIm9zIiwicGxhdGZvcm0iLCJwYWNrYWdlcyIsInByb21pc2VBbGwiLCJuZXdEZXBzIiwibmV3RGV2RGVwcyIsImRlcCIsInNldHVwIiwiZG9ja2VyU2NyaXB0cyIsImJ1aWxkRGV2SW1hZ2UiLCJzdG9wQW5kU3RhcnQiLCJ1bmJ1ZmZlciIsImFkZGl0aW9uYWxPcHRpb25zIiwiYWRkaXRpb25hbEFyZ3MiLCJzdG9wIiwic3Bhd25TeW5jT25FeGl0Iiwic3RvcEFsbCIsIkJhc2VTY3JpcHRzIiwiZGVmYXVsdFBvcnQiLCJQT1JUIiwiYnVpbGREb2NrZXIiLCJzdGFydERvY2tlciIsIm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCIsIm5vcm1hbGl6ZWRBcmdzVGV4dCIsIndhaXRBbmRPcGVuQXBwIiwidGVzdEUyRSIsInBsYXl3cmlnaHRBcmdzIiwicHJpc21hRGlyZWN0b3J5Iiwic3RhcnRDb21tYW5kIiwidGVzdEUyRURldiIsInRlc3RVbml0Iiwid2FpdEFwcCIsImJsaXR6U2NyaXB0cyIsInN0YXJ0UHJvZHVjdGlvbiIsInRlc3RTdGFydCIsImh0dHBTZXJ2ZXJTY3JpcHRzIiwid2F0Y2giLCJuZXh0U2NyaXB0cyIsInBsYWluQXBwU2NyaXB0cyIsInJlbWl4U2NyaXB0cyIsIm1vZGUiLCJkb2NrZXJPcHRpb25zIiwibm9ybWFsaXplQXJncyIsImNvbmZpZ3VyZUVudmlyb25tZW50VmFyaWFibGVzIiwid2JFbnYiLCJORVhUX1BVQkxJQ19XQl9FTlYiLCJ0ZXN0Q29tbWFuZCIsImNpIiwiZTJlIiwidW5pdCIsIkNJIiwiRk9SQ0VfQ09MT1IiLCJ1bml0VGltZW91dCIsInRlc3RPbkRvY2tlciIsInVuaXRUZXN0c0V4aXN0UHJvbWlzZSIsImUyZVRlc3RzRXhpc3RQcm9taXNlIiwidHlwZUNoZWNrQ29tbWFuZCIsInR5cGVzY3JpcHQiLCJweXJpZ2h0IiwidGNDb21tYW5kIiwic2hhcmVkT3B0aW9uc0J1aWxkZXIiLCJ3b3JraW5nRGlyIiwiY2hkaXIiLCJCRVJSWV9CSU5fRk9MREVSIiwidXBwZXJLZXkiLCJyZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRW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S3NESzlDeWpCLFdBQVcsTUFDWHYyQixRQUFRaXNDLElBQ1Jyd0IsWUFBWTFmLElBQ1gsTUFBTWd3QyxFQUFhaHdDLEVBQUssZUFDeEIsR0FBSWd3QyxFQUFZLENBQ2QsTUFBTTFPLEVBQVUvZ0MsRUFBS0MsUUFBUXd2QyxHQUM3Qm52QyxRQUFRb3ZDLE1BQU0zTyxFQUNoQixFaEVpSEcsU0FBOEN4L0IsR0FFL0NBLEVBQVErZ0MsTUFBUS9nQyxFQUFRb3VDLG1CQUMxQnB1QyxFQUFRK2dDLEtBQU8vZ0MsRUFBUStnQyxLQUFLOTVCLFFBQVEsR0FBR2pILEVBQVFvdUMsb0JBQXFCLElBRWpFOU4sV0FBVyxtQ0FBb0MsSUFFL0NBLFdBQVcsc0JBQXVCLElBQ2xDQSxXQUFXLGlCQUFrQixLQUVsQyxJQUFLLE1BQU1sZ0MsS0FBT0UsT0FBT0ksS0FBS1YsR0FBVSxDQUN0QyxNQUFNcXVDLEVBQVdqdUMsRUFBSTRJLGVBRW5CcWxDLEVBQVNwaEIsV0FBVyxTQUNwQm9oQixFQUFTcGhCLFdBQVcsVUFDcEJvaEIsRUFBU3BoQixXQUFXLFdBQ1AsZ0JBQWJvaEIsR0FDYSxhQUFiQSxXQUVPcnVDLEVBQVFJLEVBRW5CLENBQ0YsQ2dFcklJa3VDLENBQXFDdnZDLFFBQVFULElBQUksSUFFbER3RCxRQUFRd2dDLElBQ1J4Z0MsUUFBUW1qQyxJQUNSbmpDLFFBQVE4bUMsSUFDUjltQyxRQUFRNm5DLElBQ1I3bkMsUUFBUW1vQyxJQUNSbm9DLFFBQVFtcUMsSUFDUm5xQyxRQUFRcXJDLElBQ1JyckMsUUFBUStyQyxJQUNSL3JDLFFBQVFrc0MsSUFDUnhZLGdCQUNBZ0QsU0FDQW5RLE9BQU9ucUIsS0FFVixJQUFLLE1BQU1pRixJQUFVLENBQUMsU0FBVSxVQUFXLFdBQ3pDcEUsUUFBUXdELEdBQUdZLEdBQVEsSUFBTXBFLFFBQVFnYiIsInhfZ29vZ2xlX2lnbm9yZUxpc3QiOlszLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LDE1LDE2LDE3LDE4LDE5LDIwLDIxLDIyLDIzLDI0LDI1LDI2LDI3LDI4LDI5LDMwLDMxLDMyLDMzLDM0LDM1LDM4LDM5XX0=
|
|
33
|
+
var J,G,K;const Q=process&&process.env&&process.env.YARGS_MIN_NODE_VERSION?Number(process.env.YARGS_MIN_NODE_VERSION):12,X=null!==(G=null===(J=null===process||void 0===process?void 0:process.versions)||void 0===J?void 0:J.node)&&void 0!==G?G:null===(K=null===process||void 0===process?void 0:process.version)||void 0===K?void 0:K.slice(1);if(X){if(Number(X.match(/^([^.]+)/)[1])<Q)throw Error(`yargs parser supports a minimum Node.js version of ${Q}. Read our version support policy: https://github.com/yargs/yargs-parser#supported-nodejs-versions`)}const Z=process?process.env:{},ee=new class{constructor(e){H=e}parse(e,t){const n=Object.assign({alias:void 0,array:void 0,boolean:void 0,config:void 0,configObjects:void 0,configuration:void 0,coerce:void 0,count:void 0,default:void 0,envPrefix:void 0,narg:void 0,normalize:void 0,string:void 0,number:void 0,__:void 0,key:void 0},t),s=function(e){if(Array.isArray(e))return e.map((e=>"string"!=typeof e?e+"":e));e=e.trim();let t=0,n=null,s=null,i=null;const r=[];for(let o=0;o<e.length;o++)n=s,s=e.charAt(o)," "!==s||i?(s===i?i=null:"'"!==s&&'"'!==s||i||(i=s),r[t]||(r[t]=""),r[t]+=s):" "!==n&&t++;return r}(e),i="string"==typeof e,r=function(e){const t=[],n=Object.create(null);let s=!0;Object.keys(e).forEach((function(n){t.push([].concat(e[n],n))}));for(;s;){s=!1;for(let e=0;e<t.length;e++)for(let n=e+1;n<t.length;n++){if(t[e].filter((function(e){return-1!==t[n].indexOf(e)})).length){t[e]=t[e].concat(t[n]),t.splice(n,1),s=!0;break}}}return t.forEach((function(e){const t=(e=e.filter((function(e,t,n){return n.indexOf(e)===t}))).pop();void 0!==t&&"string"==typeof t&&(n[t]=e)})),n}(Object.assign(Object.create(null),n.alias)),o=Object.assign({"boolean-negation":!0,"camel-case-expansion":!0,"combine-arrays":!1,"dot-notation":!0,"duplicate-arguments-array":!0,"flatten-duplicate-arrays":!0,"greedy-arrays":!0,"halt-at-non-option":!1,"nargs-eats-options":!1,"negation-prefix":"no-","parse-numbers":!0,"parse-positional-numbers":!0,"populate--":!1,"set-placeholder-key":!1,"short-option-groups":!0,"strip-aliased":!1,"strip-dashed":!1,"unknown-options-as-args":!1},n.configuration),a=Object.assign(Object.create(null),n.default),c=n.configObjects||[],l=n.envPrefix,h=o["populate--"],d=h?"--":"_",u=Object.create(null),f=Object.create(null),p=n.__||H.format,g={aliases:Object.create(null),arrays:Object.create(null),bools:Object.create(null),strings:Object.create(null),numbers:Object.create(null),counts:Object.create(null),normalize:Object.create(null),configs:Object.create(null),nargs:Object.create(null),coercions:Object.create(null),keys:[]},m=/^-([0-9]+(\.[0-9]+)?|\.[0-9]+)$/,y=new RegExp("^--"+o["negation-prefix"]+"(.+)");[].concat(n.array||[]).filter(Boolean).forEach((function(e){const t="object"==typeof e?e.key:e,n=Object.keys(e).map((function(e){return{boolean:"bools",string:"strings",number:"numbers"}[e]})).filter(Boolean).pop();n&&(g[n][t]=!0),g.arrays[t]=!0,g.keys.push(t)})),[].concat(n.boolean||[]).filter(Boolean).forEach((function(e){g.bools[e]=!0,g.keys.push(e)})),[].concat(n.string||[]).filter(Boolean).forEach((function(e){g.strings[e]=!0,g.keys.push(e)})),[].concat(n.number||[]).filter(Boolean).forEach((function(e){g.numbers[e]=!0,g.keys.push(e)})),[].concat(n.count||[]).filter(Boolean).forEach((function(e){g.counts[e]=!0,g.keys.push(e)})),[].concat(n.normalize||[]).filter(Boolean).forEach((function(e){g.normalize[e]=!0,g.keys.push(e)})),"object"==typeof n.narg&&Object.entries(n.narg).forEach((([e,t])=>{"number"==typeof t&&(g.nargs[e]=t,g.keys.push(e))})),"object"==typeof n.coerce&&Object.entries(n.coerce).forEach((([e,t])=>{"function"==typeof t&&(g.coercions[e]=t,g.keys.push(e))})),void 0!==n.config&&(Array.isArray(n.config)||"string"==typeof n.config?[].concat(n.config).filter(Boolean).forEach((function(e){g.configs[e]=!0})):"object"==typeof n.config&&Object.entries(n.config).forEach((([e,t])=>{"boolean"!=typeof t&&"function"!=typeof t||(g.configs[e]=t)}))),function(...e){e.forEach((function(e){Object.keys(e||{}).forEach((function(e){g.aliases[e]||(g.aliases[e]=[].concat(r[e]||[]),g.aliases[e].concat(e).forEach((function(t){if(/-/.test(t)&&o["camel-case-expansion"]){const n=B(t);n!==e&&-1===g.aliases[e].indexOf(n)&&(g.aliases[e].push(n),u[n]=!0)}})),g.aliases[e].concat(e).forEach((function(t){if(t.length>1&&/[A-Z]/.test(t)&&o["camel-case-expansion"]){const n=L(t,"-");n!==e&&-1===g.aliases[e].indexOf(n)&&(g.aliases[e].push(n),u[n]=!0)}})),g.aliases[e].forEach((function(t){g.aliases[t]=[e].concat(g.aliases[e].filter((function(e){return t!==e})))})))}))}))}(n.key,r,n.default,g.arrays),Object.keys(a).forEach((function(e){(g.aliases[e]||[]).forEach((function(t){a[t]=a[e]}))}));let b=null;Object.keys(g.counts).find((e=>D(e,g.arrays)?(b=Error(p("Invalid configuration: %s, opts.count excludes opts.array.",e)),!0):!!D(e,g.nargs)&&(b=Error(p("Invalid configuration: %s, opts.count excludes opts.narg.",e)),!0)));let v=[];const w=Object.assign(Object.create(null),{_:[]}),O={};for(let e=0;e<s.length;e++){const t=s[e],n=t.replace(/^-{3,}/,"---");let i,r,a,c,l,h;if("--"!==t&&/^-/.test(t)&&R(t))E(t);else{if(n.match(/^---+(=|$)/)){E(t);continue}if(t.match(/^--.+=/)||!o["short-option-groups"]&&t.match(/^-.+=/))c=t.match(/^--?([^=]+)=([\s\S]*)$/),null!==c&&Array.isArray(c)&&c.length>=3&&(D(c[1],g.arrays)?e=A(e,c[1],s,c[2]):!1!==D(c[1],g.nargs)?e=k(e,c[1],s,c[2]):j(c[1],c[2],!0));else if(t.match(y)&&o["boolean-negation"])c=t.match(y),null!==c&&Array.isArray(c)&&c.length>=2&&(r=c[1],j(r,!!D(r,g.arrays)&&[!1]));else if(t.match(/^--.+/)||!o["short-option-groups"]&&t.match(/^-[^-]+/))c=t.match(/^--?(.+)/),null!==c&&Array.isArray(c)&&c.length>=2&&(r=c[1],D(r,g.arrays)?e=A(e,r,s):!1!==D(r,g.nargs)?e=k(e,r,s):(l=s[e+1],void 0===l||l.match(/^-/)&&!l.match(m)||D(r,g.bools)||D(r,g.counts)?/^(true|false)$/.test(l)?(j(r,l),e++):j(r,W(r)):(j(r,l),e++)));else if(t.match(/^-.\..+=/))c=t.match(/^-([^=]+)=([\s\S]*)$/),null!==c&&Array.isArray(c)&&c.length>=3&&j(c[1],c[2]);else if(t.match(/^-.\..+/)&&!t.match(m))l=s[e+1],c=t.match(/^-(.\..+)/),null!==c&&Array.isArray(c)&&c.length>=2&&(r=c[1],void 0===l||l.match(/^-/)||D(r,g.bools)||D(r,g.counts)?j(r,W(r)):(j(r,l),e++));else if(t.match(/^-[^-]+/)&&!t.match(m)){a=t.slice(1,-1).split(""),i=!1;for(let n=0;n<a.length;n++){if(l=t.slice(n+2),a[n+1]&&"="===a[n+1]){h=t.slice(n+3),r=a[n],D(r,g.arrays)?e=A(e,r,s,h):!1!==D(r,g.nargs)?e=k(e,r,s,h):j(r,h),i=!0;break}if("-"!==l){if(/[A-Za-z]/.test(a[n])&&/^-?\d+(\.\d*)?(e-?\d+)?$/.test(l)&&!1===D(l,g.bools)){j(a[n],l),i=!0;break}if(a[n+1]&&a[n+1].match(/\W/)){j(a[n],l),i=!0;break}j(a[n],W(a[n]))}else j(a[n],l)}r=t.slice(-1)[0],i||"-"===r||(D(r,g.arrays)?e=A(e,r,s):!1!==D(r,g.nargs)?e=k(e,r,s):(l=s[e+1],void 0===l||/^(-|--)[^-]/.test(l)&&!l.match(m)||D(r,g.bools)||D(r,g.counts)?/^(true|false)$/.test(l)?(j(r,l),e++):j(r,W(r)):(j(r,l),e++)))}else if(t.match(/^-[0-9]$/)&&t.match(m)&&D(t.slice(1),g.bools))r=t.slice(1),j(r,W(r));else{if("--"===t){v=s.slice(e+1);break}if(o["halt-at-non-option"]){v=s.slice(e);break}E(t)}}}function E(e){const t=x("_",e);"string"!=typeof t&&"number"!=typeof t||w._.push(t)}function k(e,t,n,s){let i,r=D(t,g.nargs);if(r="number"!=typeof r||isNaN(r)?1:r,0===r)return z(s)||(b=Error(p("Argument unexpected for: %s",t))),j(t,W(t)),e;let a=z(s)?0:1;if(o["nargs-eats-options"])n.length-(e+1)+a<r&&(b=Error(p("Not enough arguments following: %s",t))),a=r;else{for(i=e+1;i<n.length&&(!n[i].match(/^-[^0-9]/)||n[i].match(m)||R(n[i]));i++)a++;a<r&&(b=Error(p("Not enough arguments following: %s",t)))}let c=Math.min(a,r);for(!z(s)&&c>0&&(j(t,s),c--),i=e+1;i<c+e+1;i++)j(t,n[i]);return e+c}function A(e,t,n,s){let r=[],c=s||n[e+1];const l=D(t,g.nargs);if(D(t,g.bools)&&!/^(true|false)$/.test(c))r.push(!0);else if(z(c)||z(s)&&/^-/.test(c)&&!m.test(c)&&!R(c)){if(void 0!==a[t]){const e=a[t];r=Array.isArray(e)?e:[e]}}else{z(s)||r.push(_(t,s,!0));for(let s=e+1;s<n.length&&!(!o["greedy-arrays"]&&r.length>0||l&&"number"==typeof l&&r.length>=l)&&(c=n[s],!/^-/.test(c)||m.test(c)||R(c));s++)e=s,r.push(_(t,c,i))}return"number"==typeof l&&(l&&r.length<l||isNaN(l)&&0===r.length)&&(b=Error(p("Not enough arguments following: %s",t))),j(t,r),e}function j(e,t,n=i){if(/-/.test(e)&&o["camel-case-expansion"]){const t=e.split(".").map((function(e){return B(e)})).join(".");$(e,t)}const s=_(e,t,n),r=e.split(".");if(M(w,r,s),g.aliases[e]&&g.aliases[e].forEach((function(e){const t=e.split(".");M(w,t,s)})),r.length>1&&o["dot-notation"]&&(g.aliases[r[0]]||[]).forEach((function(t){let n=t.split(".");const i=[].concat(r);i.shift(),n=n.concat(i),(g.aliases[e]||[]).includes(n.join("."))||M(w,n,s)})),D(e,g.normalize)&&!D(e,g.arrays)){[e].concat(g.aliases[e]||[]).forEach((function(e){Object.defineProperty(O,e,{enumerable:!0,get:()=>t,set(e){t="string"==typeof e?H.normalize(e):e}})}))}}function $(e,t){g.aliases[e]&&g.aliases[e].length||(g.aliases[e]=[t],u[t]=!0),g.aliases[t]&&g.aliases[t].length||$(t,e)}function _(e,t,n){n&&(t=function(e){return"string"!=typeof e||"'"!==e[0]&&'"'!==e[0]||e[e.length-1]!==e[0]?e:e.substring(1,e.length-1)}(t)),(D(e,g.bools)||D(e,g.counts))&&"string"==typeof t&&(t="true"===t);let s=Array.isArray(t)?t.map((function(t){return x(e,t)})):x(e,t);return D(e,g.counts)&&(z(s)||"boolean"==typeof s)&&(s=Y()),D(e,g.normalize)&&D(e,g.arrays)&&(s=Array.isArray(t)?t.map((e=>H.normalize(e))):H.normalize(t)),s}function x(e,t){if(!o["parse-positional-numbers"]&&"_"===e)return t;if(!D(e,g.strings)&&!D(e,g.bools)&&!Array.isArray(t)){(V(t)&&o["parse-numbers"]&&Number.isSafeInteger(Math.floor(parseFloat(`${t}`)))||!z(t)&&D(e,g.numbers))&&(t=Number(t))}return t}function C(e,t){Object.keys(e).forEach((function(n){const s=e[n],i=t?t+"."+n:n;"object"==typeof s&&null!==s&&!Array.isArray(s)&&o["dot-notation"]?C(s,i):(!N(w,i.split("."))||D(i,g.arrays)&&o["combine-arrays"])&&j(i,s)}))}function S(e,t){if(void 0===l)return;const n="string"==typeof l?l:"",s=H.env();Object.keys(s).forEach((function(i){if(""===n||0===i.lastIndexOf(n,0)){const r=i.split("__").map((function(e,t){return 0===t&&(e=e.substring(n.length)),B(e)}));(t&&g.configs[r.join(".")]||!t)&&!N(e,r)&&j(r.join("."),s[i])}}))}function P(e,t,n,s=!1){Object.keys(n).forEach((function(i){N(e,i.split("."))||(M(e,i.split("."),n[i]),s&&(f[i]=!0),(t[i]||[]).forEach((function(t){N(e,t.split("."))||M(e,t.split("."),n[i])})))}))}function N(e,t){let n=e;o["dot-notation"]||(t=[t.join(".")]),t.slice(0,-1).forEach((function(e){n=n[e]||{}}));const s=t[t.length-1];return"object"==typeof n&&s in n}function M(e,t,n){let s=e;o["dot-notation"]||(t=[t.join(".")]),t.slice(0,-1).forEach((function(e){e=q(e),"object"==typeof s&&void 0===s[e]&&(s[e]={}),"object"!=typeof s[e]||Array.isArray(s[e])?(Array.isArray(s[e])?s[e].push({}):s[e]=[s[e],{}],s=s[e][s[e].length-1]):s=s[e]}));const i=q(t[t.length-1]),r=D(t.join("."),g.arrays),a=Array.isArray(n);let c=o["duplicate-arguments-array"];!c&&D(i,g.nargs)&&(c=!0,(!z(s[i])&&1===g.nargs[i]||Array.isArray(s[i])&&s[i].length===g.nargs[i])&&(s[i]=void 0)),n===Y()?s[i]=Y(s[i]):Array.isArray(s[i])?c&&r&&a?s[i]=o["flatten-duplicate-arrays"]?s[i].concat(n):(Array.isArray(s[i][0])?s[i]:[s[i]]).concat([n]):c||Boolean(r)!==Boolean(a)?s[i]=s[i].concat([n]):s[i]=n:void 0===s[i]&&r?s[i]=a?n:[n]:!c||void 0===s[i]||D(i,g.counts)||D(i,g.bools)?s[i]=n:s[i]=[s[i],n]}function D(e,t){const n=[].concat(g.aliases[e]||[],e),s=Object.keys(t),i=n.find((e=>s.includes(e)));return!!i&&t[i]}function I(e){const t=Object.keys(g);return[].concat(t.map((e=>g[e]))).some((function(t){return Array.isArray(t)?t.includes(e):t[e]}))}function R(e){return o["unknown-options-as-args"]&&function(e){if(e=e.replace(/^-{3,}/,"--"),e.match(m))return!1;if(function(e){if(e.match(m)||!e.match(/^-[^-]+/))return!1;let t,n=!0;const s=e.slice(1).split("");for(let i=0;i<s.length;i++){if(t=e.slice(i+2),!I(s[i])){n=!1;break}if(s[i+1]&&"="===s[i+1]||"-"===t||/[A-Za-z]/.test(s[i])&&/^-?\d+(\.\d*)?(e-?\d+)?$/.test(t)||s[i+1]&&s[i+1].match(/\W/))break}return n}(e))return!1;return!function(e,...t){return[].concat(...t).some((function(t){const n=e.match(t);return n&&I(n[1])}))}(e,/^-+([^=]+?)=[\s\S]*$/,y,/^-+([^=]+?)$/,/^-+([^=]+?)-$/,/^-+([^=]+?\d+)$/,/^-+([^=]+?)\W+.*$/)}(e)}function W(e){return D(e,g.bools)||D(e,g.counts)||!(`${e}`in a)?(t=function(e){let t=U.BOOLEAN;return D(e,g.strings)?t=U.STRING:D(e,g.numbers)?t=U.NUMBER:D(e,g.bools)?t=U.BOOLEAN:D(e,g.arrays)&&(t=U.ARRAY),t}(e),{[U.BOOLEAN]:!0,[U.STRING]:"",[U.NUMBER]:void 0,[U.ARRAY]:[]}[t]):a[e];var t}function z(e){return void 0===e}return S(w,!0),S(w,!1),function(e){const t=Object.create(null);P(t,g.aliases,a),Object.keys(g.configs).forEach((function(n){const s=e[n]||t[n];if(s)try{let e=null;const t=H.resolve(H.cwd(),s),i=g.configs[n];if("function"==typeof i){try{e=i(t)}catch(t){e=t}if(e instanceof Error)return void(b=e)}else e=H.require(t);C(e)}catch(t){"PermissionDenied"===t.name?b=t:e[n]&&(b=Error(p("Invalid JSON config file: %s",s)))}}))}(w),void 0!==c&&c.forEach((function(e){C(e)})),P(w,g.aliases,a,!0),function(e){let t;const n=new Set;Object.keys(e).forEach((function(s){if(!n.has(s)&&(t=D(s,g.coercions),"function"==typeof t))try{const i=x(s,t(e[s]));[].concat(g.aliases[s]||[],s).forEach((t=>{n.add(t),e[t]=i}))}catch(e){b=e}}))}(w),o["set-placeholder-key"]&&function(e){g.keys.forEach((t=>{~t.indexOf(".")||void 0===e[t]&&(e[t]=void 0)}))}(w),Object.keys(g.counts).forEach((function(e){N(w,e.split("."))||j(e,0)})),h&&v.length&&(w[d]=[]),v.forEach((function(e){w[d].push(e)})),o["camel-case-expansion"]&&o["strip-dashed"]&&Object.keys(w).filter((e=>"--"!==e&&e.includes("-"))).forEach((e=>{delete w[e]})),o["strip-aliased"]&&[].concat(...Object.keys(r).map((e=>r[e]))).forEach((e=>{o["camel-case-expansion"]&&e.includes("-")&&delete w[e.split(".").map((e=>B(e))).join(".")],delete w[e]})),{aliases:Object.assign({},g.aliases),argv:Object.assign(O,w),configuration:o,defaulted:Object.assign({},f),error:b,newAliases:Object.assign({},u)}}}({cwd:process.cwd,env:()=>Z,format:p,normalize:s,resolve:t,require:e=>{if("undefined"!=typeof require)return require(e);if(e.match(/\.json$/))return JSON.parse(u(e,"utf8"));throw Error("only .json config files are supported in ESM")}}),te=function(e,t){return ee.parse(e.slice(),t).argv};function ne(){return process.versions.electron&&!process.defaultApp?0:1}te.detailed=function(e,t){return ee.parse(e.slice(),t)},te.camelCase=B,te.decamelize=L,te.looksLikeNumber=V;class se extends Error{constructor(e){super(e||"yargs error"),this.name="YError",Error.captureStackTrace&&Error.captureStackTrace(this,se)}}var ie={fs:{readFileSync:u,writeFile:f},format:p,resolve:t,exists:e=>{try{return h(e).isFile()}catch(e){return!1}}};let re;class oe{constructor(e){e=e||{},this.directory=e.directory||"./locales",this.updateFiles="boolean"!=typeof e.updateFiles||e.updateFiles,this.locale=e.locale||"en",this.fallbackToLanguage="boolean"!=typeof e.fallbackToLanguage||e.fallbackToLanguage,this.cache=Object.create(null),this.writeQueue=[]}__(...e){if("string"!=typeof arguments[0])return this._taggedLiteral(arguments[0],...arguments);const t=e.shift();let n=function(){};return"function"==typeof e[e.length-1]&&(n=e.pop()),n=n||function(){},this.cache[this.locale]||this._readLocaleFile(),!this.cache[this.locale][t]&&this.updateFiles?(this.cache[this.locale][t]=t,this._enqueueWrite({directory:this.directory,locale:this.locale,cb:n})):n(),re.format.apply(re.format,[this.cache[this.locale][t]||t].concat(e))}__n(){const e=Array.prototype.slice.call(arguments),t=e.shift(),n=e.shift(),s=e.shift();let i=function(){};"function"==typeof e[e.length-1]&&(i=e.pop()),this.cache[this.locale]||this._readLocaleFile();let r=1===s?t:n;if(this.cache[this.locale][t]){r=this.cache[this.locale][t][1===s?"one":"other"]}!this.cache[this.locale][t]&&this.updateFiles?(this.cache[this.locale][t]={one:t,other:n},this._enqueueWrite({directory:this.directory,locale:this.locale,cb:i})):i();const o=[r];return~r.indexOf("%d")&&o.push(s),re.format.apply(re.format,o.concat(e))}setLocale(e){this.locale=e}getLocale(){return this.locale}updateLocale(e){this.cache[this.locale]||this._readLocaleFile();for(const t in e)Object.prototype.hasOwnProperty.call(e,t)&&(this.cache[this.locale][t]=e[t])}_taggedLiteral(e,...t){let n="";return e.forEach((function(e,s){const i=t[s+1];n+=e,void 0!==i&&(n+="%s")})),this.__.apply(this,[n].concat([].slice.call(t,1)))}_enqueueWrite(e){this.writeQueue.push(e),1===this.writeQueue.length&&this._processWriteQueue()}_processWriteQueue(){const e=this,t=this.writeQueue[0],n=t.directory,s=t.locale,i=t.cb,r=this._resolveLocaleFile(n,s),o=JSON.stringify(this.cache[s],null,2);re.fs.writeFile(r,o,"utf-8",(function(t){e.writeQueue.shift(),e.writeQueue.length>0&&e._processWriteQueue(),i(t)}))}_readLocaleFile(){let e={};const t=this._resolveLocaleFile(this.directory,this.locale);try{re.fs.readFileSync&&(e=JSON.parse(re.fs.readFileSync(t,"utf-8")))}catch(n){if(n instanceof SyntaxError&&(n.message="syntax error in "+t),"ENOENT"!==n.code)throw n;e={}}this.cache[this.locale]=e}_resolveLocaleFile(e,t){let n=re.resolve(e,"./",t+".json");if(this.fallbackToLanguage&&!this._fileExistsSync(n)&&~t.lastIndexOf("_")){const s=re.resolve(e,"./",t.split("_")[0]+".json");this._fileExistsSync(s)&&(n=s)}return n}_fileExistsSync(e){return re.exists(e)}}const ae="loading a directory of commands is not supported yet for ESM";let ce;try{ce=m(import.meta.url)}catch(e){ce=process.cwd()}var le,he={assert:{notStrictEqual:a,strictEqual:c},cliui:function(e){return function(e,t){return W=t,new I({width:(null==e?void 0:e.width)||("object"==typeof process&&process.stdout&&process.stdout.columns?process.stdout.columns:80),wrap:null==e?void 0:e.wrap})}(e,{stringWidth:e=>[...e].length,stripAnsi:T,wrap:F})},findUp:function(e,s){let i,r=t(".",e);for(h(r).isDirectory()||(r=n(r));;){if(i=s(r,d(r)),i)return t(r,i);if(r=n(i=r),i===r)break}},getEnv:e=>process.env[e],inspect:g,getCallerFile:()=>{throw new se(ae)},getProcessArgvBin:function(){return process.argv[ne()]},mainFilename:ce.substring(0,ce.lastIndexOf("node_modules"))||process.cwd(),Parser:te,path:{basename:i,dirname:n,extname:r,relative:o,resolve:t},process:{argv:()=>process.argv,cwd:process.cwd,emitWarning:(e,t)=>process.emitWarning(e,t),execPath:()=>process.execPath,exit:process.exit,nextTick:process.nextTick,stdColumns:void 0!==process.stdout.columns?process.stdout.columns:null},readFileSync:u,require:()=>{throw new se("require is not supported by ESM")},requireDirectory:()=>{throw new se(ae)},stringWidth:e=>[...e].length,y18n:(le={directory:t(ce,"../../../locales"),updateFiles:!1},function(e,t){re=t;const n=new oe(e);return{__:n.__.bind(n),__n:n.__n.bind(n),setLocale:n.setLocale.bind(n),getLocale:n.getLocale.bind(n),updateLocale:n.updateLocale.bind(n),locale:n.locale}}(le,ie))};function de(e,t,n,s){n.assert.notStrictEqual(e,t,s)}function ue(e,t){t.assert.strictEqual(typeof e,"string")}function fe(e){return Object.keys(e)}function pe(e){return!!e&&!!e.then&&"function"==typeof e.then}function ge(e){const t=e.replace(/\s{2,}/g," ").split(/\s+(?![^[]*]|[^<]*>)/),n=/\.*[\][<>]/g,s=t.shift();if(!s)throw new Error(`No command found in: ${e}`);const i={cmd:s.replace(n,""),demanded:[],optional:[]};return t.forEach(((e,s)=>{let r=!1;e=e.replace(/\s/g,""),/\.+[\]>]/.test(e)&&s===t.length-1&&(r=!0),/^\[/.test(e)?i.optional.push({cmd:e.replace(n,"").split("|"),variadic:r}):i.demanded.push({cmd:e.replace(n,"").split("|"),variadic:r})})),i}const me=["first","second","third","fourth","fifth","sixth"];function ye(e,t,n){try{let s=0;const[i,r,o]="object"==typeof e?[{demanded:[],optional:[]},e,t]:[ge(`cmd ${e}`),t,n],a=[].slice.call(r);for(;a.length&&void 0===a[a.length-1];)a.pop();const c=o||a.length;if(c<i.demanded.length)throw new se(`Not enough arguments provided. Expected ${i.demanded.length} but received ${a.length}.`);const l=i.demanded.length+i.optional.length;if(c>l)throw new se(`Too many arguments provided. Expected max ${l} but received ${c}.`);i.demanded.forEach((e=>{const t=be(a.shift());0===e.cmd.filter((e=>e===t||"*"===e)).length&&ve(t,e.cmd,s),s+=1})),i.optional.forEach((e=>{if(0===a.length)return;const t=be(a.shift());0===e.cmd.filter((e=>e===t||"*"===e)).length&&ve(t,e.cmd,s),s+=1}))}catch(e){console.warn(e.stack)}}function be(e){return Array.isArray(e)?"array":null===e?"null":typeof e}function ve(e,t,n){throw new se(`Invalid ${me[n]||"manyith"} argument. Expected ${t.join(" or ")} but received ${e}.`)}class we{constructor(e){this.globalMiddleware=[],this.frozens=[],this.yargs=e}addMiddleware(e,t,n=!0,s=!1){if(ye("<array|function> [boolean] [boolean] [boolean]",[e,t,n],arguments.length),Array.isArray(e)){for(let s=0;s<e.length;s++){if("function"!=typeof e[s])throw Error("middleware must be a function");const i=e[s];i.applyBeforeValidation=t,i.global=n}Array.prototype.push.apply(this.globalMiddleware,e)}else if("function"==typeof e){const i=e;i.applyBeforeValidation=t,i.global=n,i.mutates=s,this.globalMiddleware.push(e)}return this.yargs}addCoerceMiddleware(e,t){const n=this.yargs.getAliases();return this.globalMiddleware=this.globalMiddleware.filter((e=>{const s=[...n[t]||[],t];return!e.option||!s.includes(e.option)})),e.option=t,this.addMiddleware(e,!0,!0,!0)}getMiddleware(){return this.globalMiddleware}freeze(){this.frozens.push([...this.globalMiddleware])}unfreeze(){const e=this.frozens.pop();void 0!==e&&(this.globalMiddleware=e)}reset(){this.globalMiddleware=this.globalMiddleware.filter((e=>e.global))}}function Oe(e,t,n,s){return n.reduce(((e,n)=>{if(n.applyBeforeValidation!==s)return e;if(n.mutates){if(n.applied)return e;n.applied=!0}if(pe(e))return e.then((e=>Promise.all([e,n(e,t)]))).then((([e,t])=>Object.assign(e,t)));{const s=n(e,t);return pe(s)?s.then((t=>Object.assign(e,t))):Object.assign(e,s)}}),e)}function Ee(e,t,n=(e=>{throw e})){try{const n="function"==typeof e?e():e;return pe(n)?n.then((e=>t(e))):t(n)}catch(e){return n(e)}}const ke=/(^\*)|(^\$0)/;class Ae{constructor(e,t,n,s){this.requireCache=new Set,this.handlers={},this.aliasMap={},this.frozens=[],this.shim=s,this.usage=e,this.globalMiddleware=n,this.validation=t}addDirectory(e,t,n,s){"boolean"!=typeof(s=s||{}).recurse&&(s.recurse=!1),Array.isArray(s.extensions)||(s.extensions=["js"]);const i="function"==typeof s.visit?s.visit:e=>e;s.visit=(e,t,n)=>{const s=i(e,t,n);if(s){if(this.requireCache.has(t))return s;this.requireCache.add(t),this.addHandler(s)}return s},this.shim.requireDirectory({require:t,filename:n},e,s)}addHandler(e,t,n,s,i,r){let o=[];const a=function(e){return e?e.map((e=>(e.applyBeforeValidation=!1,e))):[]}(i);if(s=s||(()=>{}),Array.isArray(e))if(function(e){return e.every((e=>"string"==typeof e))}(e))[e,...o]=e;else for(const t of e)this.addHandler(t);else{if(function(e){return"object"==typeof e&&!Array.isArray(e)}(e)){let t=Array.isArray(e.command)||"string"==typeof e.command?e.command:this.moduleName(e);return e.aliases&&(t=[].concat(t).concat(e.aliases)),void this.addHandler(t,this.extractDesc(e),e.builder,e.handler,e.middlewares,e.deprecated)}if(je(n))return void this.addHandler([e].concat(o),t,n.builder,n.handler,n.middlewares,n.deprecated)}if("string"==typeof e){const i=ge(e);o=o.map((e=>ge(e).cmd));let c=!1;const l=[i.cmd].concat(o).filter((e=>!ke.test(e)||(c=!0,!1)));0===l.length&&c&&l.push("$0"),c&&(i.cmd=l[0],o=l.slice(1),e=e.replace(ke,i.cmd)),o.forEach((e=>{this.aliasMap[e]=i.cmd})),!1!==t&&this.usage.command(e,t,c,o,r),this.handlers[i.cmd]={original:e,description:t,handler:s,builder:n||{},middlewares:a,deprecated:r,demanded:i.demanded,optional:i.optional},c&&(this.defaultCommand=this.handlers[i.cmd])}}getCommandHandlers(){return this.handlers}getCommands(){return Object.keys(this.handlers).concat(Object.keys(this.aliasMap))}hasDefaultCommand(){return!!this.defaultCommand}runCommand(e,t,n,s,i,r){const o=this.handlers[e]||this.handlers[this.aliasMap[e]]||this.defaultCommand,a=t.getInternalMethods().getContext(),c=a.commands.slice(),l=!e;e&&(a.commands.push(e),a.fullCommands.push(o.original));const h=this.applyBuilderUpdateUsageAndParse(l,o,t,n.aliases,c,s,i,r);return pe(h)?h.then((e=>this.applyMiddlewareAndGetResult(l,o,e.innerArgv,a,i,e.aliases,t))):this.applyMiddlewareAndGetResult(l,o,h.innerArgv,a,i,h.aliases,t)}applyBuilderUpdateUsageAndParse(e,t,n,s,i,r,o,a){const c=t.builder;let l=n;if($e(c)){n.getInternalMethods().getUsageInstance().freeze();const h=c(n.getInternalMethods().reset(s),a);if(pe(h))return h.then((s=>{var a;return l=(a=s)&&"function"==typeof a.getInternalMethods?s:n,this.parseAndUpdateUsage(e,t,l,i,r,o)}))}else(function(e){return"object"==typeof e})(c)&&(n.getInternalMethods().getUsageInstance().freeze(),l=n.getInternalMethods().reset(s),Object.keys(t.builder).forEach((e=>{l.option(e,c[e])})));return this.parseAndUpdateUsage(e,t,l,i,r,o)}parseAndUpdateUsage(e,t,n,s,i,r){e&&n.getInternalMethods().getUsageInstance().unfreeze(!0),this.shouldUpdateUsage(n)&&n.getInternalMethods().getUsageInstance().usage(this.usageFromParentCommandsCommandHandler(s,t),t.description);const o=n.getInternalMethods().runYargsParserAndExecuteCommands(null,void 0,!0,i,r);return pe(o)?o.then((e=>({aliases:n.parsed.aliases,innerArgv:e}))):{aliases:n.parsed.aliases,innerArgv:o}}shouldUpdateUsage(e){return!e.getInternalMethods().getUsageInstance().getUsageDisabled()&&0===e.getInternalMethods().getUsageInstance().getUsage().length}usageFromParentCommandsCommandHandler(e,t){const n=ke.test(t.original)?t.original.replace(ke,"").trim():t.original,s=e.filter((e=>!ke.test(e)));return s.push(n),`$0 ${s.join(" ")}`}handleValidationAndGetResult(e,t,n,s,i,r,o,a){if(!r.getInternalMethods().getHasOutput()){const t=r.getInternalMethods().runValidation(i,a,r.parsed.error,e);n=Ee(n,(e=>(t(e),e)))}if(t.handler&&!r.getInternalMethods().getHasOutput()){r.getInternalMethods().setHasOutput();const s=!!r.getOptions().configuration["populate--"];r.getInternalMethods().postProcess(n,s,!1,!1),n=Ee(n=Oe(n,r,o,!1),(e=>{const n=t.handler(e);return pe(n)?n.then((()=>e)):e})),e||r.getInternalMethods().getUsageInstance().cacheHelpMessage(),pe(n)&&!r.getInternalMethods().hasParseCallback()&&n.catch((e=>{try{r.getInternalMethods().getUsageInstance().fail(null,e)}catch(e){}}))}return e||(s.commands.pop(),s.fullCommands.pop()),n}applyMiddlewareAndGetResult(e,t,n,s,i,r,o){let a={};if(i)return n;o.getInternalMethods().getHasOutput()||(a=this.populatePositionals(t,n,s,o));const c=this.globalMiddleware.getMiddleware().slice(0).concat(t.middlewares),l=Oe(n,o,c,!0);return pe(l)?l.then((n=>this.handleValidationAndGetResult(e,t,n,s,r,o,c,a))):this.handleValidationAndGetResult(e,t,l,s,r,o,c,a)}populatePositionals(e,t,n,s){t._=t._.slice(n.commands.length);const i=e.demanded.slice(0),r=e.optional.slice(0),o={};for(this.validation.positionalCount(i.length,t._.length);i.length;){const e=i.shift();this.populatePositional(e,t,o)}for(;r.length;){const e=r.shift();this.populatePositional(e,t,o)}return t._=n.commands.concat(t._.map((e=>""+e))),this.postProcessPositionals(t,o,this.cmdToParseOptions(e.original),s),o}populatePositional(e,t,n){const s=e.cmd[0];e.variadic?n[s]=t._.splice(0).map(String):t._.length&&(n[s]=[String(t._.shift())])}cmdToParseOptions(e){const t={array:[],default:{},alias:{},demand:{}},n=ge(e);return n.demanded.forEach((e=>{const[n,...s]=e.cmd;e.variadic&&(t.array.push(n),t.default[n]=[]),t.alias[n]=s,t.demand[n]=!0})),n.optional.forEach((e=>{const[n,...s]=e.cmd;e.variadic&&(t.array.push(n),t.default[n]=[]),t.alias[n]=s})),t}postProcessPositionals(e,t,n,s){const i=Object.assign({},s.getOptions());i.default=Object.assign(n.default,i.default);for(const e of Object.keys(n.alias))i.alias[e]=(i.alias[e]||[]).concat(n.alias[e]);i.array=i.array.concat(n.array),i.config={};const r=[];if(Object.keys(t).forEach((e=>{t[e].map((t=>{i.configuration["unknown-options-as-args"]&&(i.key[e]=!0),r.push(`--${e}`),r.push(t)}))})),!r.length)return;const o=Object.assign({},i.configuration,{"populate--":!1}),a=this.shim.Parser.detailed(r,Object.assign({},i,{configuration:o}));if(a.error)s.getInternalMethods().getUsageInstance().fail(a.error.message,a.error);else{const n=Object.keys(t);Object.keys(t).forEach((e=>{n.push(...a.aliases[e])})),Object.keys(a.argv).forEach((i=>{n.includes(i)&&(t[i]||(t[i]=a.argv[i]),!this.isInConfigs(s,i)&&!this.isDefaulted(s,i)&&Object.prototype.hasOwnProperty.call(e,i)&&Object.prototype.hasOwnProperty.call(a.argv,i)&&(Array.isArray(e[i])||Array.isArray(a.argv[i]))?e[i]=[].concat(e[i],a.argv[i]):e[i]=a.argv[i])}))}}isDefaulted(e,t){const{default:n}=e.getOptions();return Object.prototype.hasOwnProperty.call(n,t)||Object.prototype.hasOwnProperty.call(n,this.shim.Parser.camelCase(t))}isInConfigs(e,t){const{configObjects:n}=e.getOptions();return n.some((e=>Object.prototype.hasOwnProperty.call(e,t)))||n.some((e=>Object.prototype.hasOwnProperty.call(e,this.shim.Parser.camelCase(t))))}runDefaultBuilderOn(e){if(!this.defaultCommand)return;if(this.shouldUpdateUsage(e)){const t=ke.test(this.defaultCommand.original)?this.defaultCommand.original:this.defaultCommand.original.replace(/^[^[\]<>]*/,"$0 ");e.getInternalMethods().getUsageInstance().usage(t,this.defaultCommand.description)}const t=this.defaultCommand.builder;if($e(t))return t(e,!0);je(t)||Object.keys(t).forEach((n=>{e.option(n,t[n])}))}moduleName(e){const t=function(e){if("undefined"==typeof require)return null;for(let t,n=0,s=Object.keys(require.cache);n<s.length;n++)if(t=require.cache[s[n]],t.exports===e)return t;return null}(e);if(!t)throw new Error(`No command name given for module: ${this.shim.inspect(e)}`);return this.commandFromFilename(t.filename)}commandFromFilename(e){return this.shim.path.basename(e,this.shim.path.extname(e))}extractDesc({describe:e,description:t,desc:n}){for(const s of[e,t,n]){if("string"==typeof s||!1===s)return s;de(s,!0,this.shim)}return!1}freeze(){this.frozens.push({handlers:this.handlers,aliasMap:this.aliasMap,defaultCommand:this.defaultCommand})}unfreeze(){const e=this.frozens.pop();de(e,void 0,this.shim),({handlers:this.handlers,aliasMap:this.aliasMap,defaultCommand:this.defaultCommand}=e)}reset(){return this.handlers={},this.aliasMap={},this.defaultCommand=void 0,this.requireCache=new Set,this}}function je(e){return"object"==typeof e&&!!e.builder&&"function"==typeof e.handler}function $e(e){return"function"==typeof e}function _e(e={},t=(()=>!0)){const n={};return fe(e).forEach((s=>{t(s,e[s])&&(n[s]=e[s])})),n}function xe(e){"undefined"!=typeof process&&[process.stdout,process.stderr].forEach((t=>{const n=t;n._handle&&n.isTTY&&"function"==typeof n._handle.setBlocking&&n._handle.setBlocking(e)}))}function Ce(e){return"boolean"==typeof e}function Se(e,t){const n=t.y18n.__,s={},i=[];s.failFn=function(e){i.push(e)};let r=null,o=null,a=!0;s.showHelpOnFail=function(t=!0,n){const[i,c]="string"==typeof t?[!0,t]:[t,n];return e.getInternalMethods().isGlobalContext()&&(o=c),r=c,a=i,s};let c=!1;s.fail=function(t,n){const l=e.getInternalMethods().getLoggerInstance();if(!i.length){if(e.getExitProcess()&&xe(!0),!c){c=!0,a&&(e.showHelp("error"),l.error()),(t||n)&&l.error(t||n);const s=r||o;s&&((t||n)&&l.error(""),l.error(s))}if(n=n||new se(t),e.getExitProcess())return e.exit(1);if(e.getInternalMethods().hasParseCallback())return e.exit(1,n);throw n}for(let e=i.length-1;e>=0;--e){const r=i[e];if(Ce(r)){if(n)throw n;if(t)throw Error(t)}else r(t,n,s)}};let l=[],h=!1;s.usage=(e,t)=>null===e?(h=!0,l=[],s):(h=!1,l.push([e,t||""]),s),s.getUsage=()=>l,s.getUsageDisabled=()=>h,s.getPositionalGroupName=()=>n("Positionals:");let d=[];s.example=(e,t)=>{d.push([e,t||""])};let u=[];s.command=function(e,t,n,s,i=!1){n&&(u=u.map((e=>(e[2]=!1,e)))),u.push([e,t||"",n,s,i])},s.getCommands=()=>u;let f={};s.describe=function(e,t){Array.isArray(e)?e.forEach((e=>{s.describe(e,t)})):"object"==typeof e?Object.keys(e).forEach((t=>{s.describe(t,e[t])})):f[e]=t},s.getDescriptions=()=>f;let p=[];s.epilog=e=>{p.push(e)};let g,m=!1;s.wrap=e=>{m=!0,g=e},s.getWrap=()=>t.getEnv("YARGS_DISABLE_WRAP")?null:(m||(g=function(){const e=80;return t.process.stdColumns?Math.min(e,t.process.stdColumns):e}(),m=!0),g);const y="__yargsString__:";function b(e,n,s){let i=0;return Array.isArray(e)||(e=Object.values(e).map((e=>[e]))),e.forEach((e=>{i=Math.max(t.stringWidth(s?`${s} ${Me(e[0])}`:Me(e[0]))+Ne(e[0]),i)})),n&&(i=Math.min(i,parseInt((.5*n).toString(),10))),i}let v;function w(t){return e.getOptions().hiddenOptions.indexOf(t)<0||e.parsed.argv[e.getOptions().showHiddenOpt]}function O(e,t){let s=`[${n("default:")} `;if(void 0===e&&!t)return null;if(t)s+=t;else switch(typeof e){case"string":s+=`"${e}"`;break;case"object":s+=JSON.stringify(e);break;default:s+=e}return`${s}]`}s.deferY18nLookup=e=>y+e,s.help=function(){if(v)return v;!function(){const t=e.getDemandedOptions(),n=e.getOptions();(Object.keys(n.alias)||[]).forEach((i=>{n.alias[i].forEach((r=>{f[r]&&s.describe(i,f[r]),r in t&&e.demandOption(i,t[r]),n.boolean.includes(r)&&e.boolean(i),n.count.includes(r)&&e.count(i),n.string.includes(r)&&e.string(i),n.normalize.includes(r)&&e.normalize(i),n.array.includes(r)&&e.array(i),n.number.includes(r)&&e.number(i)}))}))}();const i=e.customScriptName?e.$0:t.path.basename(e.$0),r=e.getDemandedOptions(),o=e.getDemandedCommands(),a=e.getDeprecatedOptions(),c=e.getGroups(),g=e.getOptions();let m=[];m=m.concat(Object.keys(f)),m=m.concat(Object.keys(r)),m=m.concat(Object.keys(o)),m=m.concat(Object.keys(g.default)),m=m.filter(w),m=Object.keys(m.reduce(((e,t)=>("_"!==t&&(e[t]=!0),e)),{}));const E=s.getWrap(),k=t.cliui({width:E,wrap:!!E});if(!h)if(l.length)l.forEach((e=>{k.div({text:`${e[0].replace(/\$0/g,i)}`}),e[1]&&k.div({text:`${e[1]}`,padding:[1,0,0,0]})})),k.div();else if(u.length){let e=null;e=o._?`${i} <${n("command")}>\n`:`${i} [${n("command")}]\n`,k.div(`${e}`)}if(u.length>1||1===u.length&&!u[0][2]){k.div(n("Commands:"));const t=e.getInternalMethods().getContext(),s=t.commands.length?`${t.commands.join(" ")} `:"";!0===e.getInternalMethods().getParserConfiguration()["sort-commands"]&&(u=u.sort(((e,t)=>e[0].localeCompare(t[0]))));const r=i?`${i} `:"";u.forEach((e=>{const t=`${r}${s}${e[0].replace(/^\$0 ?/,"")}`;k.span({text:t,padding:[0,2,0,2],width:b(u,E,`${i}${s}`)+4},{text:e[1]});const o=[];e[2]&&o.push(`[${n("default")}]`),e[3]&&e[3].length&&o.push(`[${n("aliases:")} ${e[3].join(", ")}]`),e[4]&&("string"==typeof e[4]?o.push(`[${n("deprecated: %s",e[4])}]`):o.push(`[${n("deprecated")}]`)),o.length?k.div({text:o.join(" "),padding:[0,0,0,2],align:"right"}):k.div()})),k.div()}const A=(Object.keys(g.alias)||[]).concat(Object.keys(e.parsed.newAliases)||[]);m=m.filter((t=>!e.parsed.newAliases[t]&&A.every((e=>-1===(g.alias[e]||[]).indexOf(t)))));const j=n("Options:");c[j]||(c[j]=[]),function(e,t,n,s){let i=[],r=null;Object.keys(n).forEach((e=>{i=i.concat(n[e])})),e.forEach((e=>{r=[e].concat(t[e]),r.some((e=>-1!==i.indexOf(e)))||n[s].push(e)}))}(m,g.alias,c,j);const $=e=>/^--/.test(Me(e)),_=Object.keys(c).filter((e=>c[e].length>0)).map((e=>({groupName:e,normalizedKeys:c[e].filter(w).map((e=>{if(A.includes(e))return e;for(let t,n=0;void 0!==(t=A[n]);n++)if((g.alias[t]||[]).includes(e))return t;return e}))}))).filter((({normalizedKeys:e})=>e.length>0)).map((({groupName:e,normalizedKeys:t})=>{const n=t.reduce(((t,n)=>(t[n]=[n].concat(g.alias[n]||[]).map((t=>e===s.getPositionalGroupName()?t:(/^[0-9]$/.test(t)?g.boolean.includes(n)?"-":"--":t.length>1?"--":"-")+t)).sort(((e,t)=>$(e)===$(t)?0:$(e)?1:-1)).join(", "),t)),{});return{groupName:e,normalizedKeys:t,switches:n}}));if(_.filter((({groupName:e})=>e!==s.getPositionalGroupName())).some((({normalizedKeys:e,switches:t})=>!e.every((e=>$(t[e])))))&&_.filter((({groupName:e})=>e!==s.getPositionalGroupName())).forEach((({normalizedKeys:e,switches:t})=>{e.forEach((e=>{var n,s;$(t[e])&&(t[e]=(n=t[e],s=4,Pe(n)?{text:n.text,indentation:n.indentation+s}:{text:n,indentation:s}))}))})),_.forEach((({groupName:t,normalizedKeys:i,switches:o})=>{k.div(t),i.forEach((t=>{const i=o[t];let c=f[t]||"",l=null;c.includes(y)&&(c=n(c.substring(16))),g.boolean.includes(t)&&(l=`[${n("boolean")}]`),g.count.includes(t)&&(l=`[${n("count")}]`),g.string.includes(t)&&(l=`[${n("string")}]`),g.normalize.includes(t)&&(l=`[${n("string")}]`),g.array.includes(t)&&(l=`[${n("array")}]`),g.number.includes(t)&&(l=`[${n("number")}]`);const h=[t in a?(d=a[t],"string"==typeof d?`[${n("deprecated: %s",d)}]`:`[${n("deprecated")}]`):null,l,t in r?`[${n("required")}]`:null,g.choices&&g.choices[t]?`[${n("choices:")} ${s.stringifiedValues(g.choices[t])}]`:null,O(g.default[t],g.defaultDescription[t])].filter(Boolean).join(" ");var d;k.span({text:Me(i),padding:[0,2,0,2+Ne(i)],width:b(o,E)+4},c);const u=!0===e.getInternalMethods().getUsageConfiguration()["hide-types"];h&&!u?k.div({text:h,padding:[0,0,0,2],align:"right"}):k.div()})),k.div()})),d.length&&(k.div(n("Examples:")),d.forEach((e=>{e[0]=e[0].replace(/\$0/g,i)})),d.forEach((e=>{""===e[1]?k.div({text:e[0],padding:[0,2,0,2]}):k.div({text:e[0],padding:[0,2,0,2],width:b(d,E)+4},{text:e[1]})})),k.div()),p.length>0){const e=p.map((e=>e.replace(/\$0/g,i))).join("\n");k.div(`${e}\n`)}return k.toString().replace(/\s*$/,"")},s.cacheHelpMessage=function(){v=this.help()},s.clearCachedHelpMessage=function(){v=void 0},s.hasCachedHelpMessage=function(){return!!v},s.showHelp=t=>{const n=e.getInternalMethods().getLoggerInstance();t||(t="error");("function"==typeof t?t:n[t])(s.help())},s.functionDescription=e=>["(",e.name?t.Parser.decamelize(e.name,"-"):n("generated-value"),")"].join(""),s.stringifiedValues=function(e,t){let n="";const s=t||", ",i=[].concat(e);return e&&i.length?(i.forEach((e=>{n.length&&(n+=s),n+=JSON.stringify(e)})),n):n};let E=null;s.version=e=>{E=e},s.showVersion=t=>{const n=e.getInternalMethods().getLoggerInstance();t||(t="error");("function"==typeof t?t:n[t])(E)},s.reset=function(e){return r=null,c=!1,l=[],h=!1,p=[],d=[],u=[],f=_e(f,(t=>!e[t])),s};const k=[];return s.freeze=function(){k.push({failMessage:r,failureOutput:c,usages:l,usageDisabled:h,epilogs:p,examples:d,commands:u,descriptions:f})},s.unfreeze=function(e=!1){const t=k.pop();t&&(e?(f={...t.descriptions,...f},u=[...t.commands,...u],l=[...t.usages,...l],d=[...t.examples,...d],p=[...t.epilogs,...p]):({failMessage:r,failureOutput:c,usages:l,usageDisabled:h,epilogs:p,examples:d,commands:u,descriptions:f}=t))},s}function Pe(e){return"object"==typeof e}function Ne(e){return Pe(e)?e.indentation:0}function Me(e){return Pe(e)?e.text:e}class De{constructor(e,t,n,s){var i,r,o;this.yargs=e,this.usage=t,this.command=n,this.shim=s,this.completionKey="get-yargs-completions",this.aliases=null,this.customCompletionFunction=null,this.indexAfterLastReset=0,this.zshShell=null!==(o=(null===(i=this.shim.getEnv("SHELL"))||void 0===i?void 0:i.includes("zsh"))||(null===(r=this.shim.getEnv("ZSH_NAME"))||void 0===r?void 0:r.includes("zsh")))&&void 0!==o&&o}defaultCompletion(e,t,n,s){const i=this.command.getCommandHandlers();for(let t=0,n=e.length;t<n;++t)if(i[e[t]]&&i[e[t]].builder){const n=i[e[t]].builder;if($e(n)){this.indexAfterLastReset=t+1;const e=this.yargs.getInternalMethods().reset();return n(e,!0),e.argv}}const r=[];this.commandCompletions(r,e,n),this.optionCompletions(r,e,t,n),this.choicesFromOptionsCompletions(r,e,t,n),this.choicesFromPositionalsCompletions(r,e,t,n),s(null,r)}commandCompletions(e,t,n){const s=this.yargs.getInternalMethods().getContext().commands;n.match(/^-/)||s[s.length-1]===n||this.previousArgHasChoices(t)||this.usage.getCommands().forEach((n=>{const s=ge(n[0]).cmd;if(-1===t.indexOf(s))if(this.zshShell){const t=n[1]||"";e.push(s.replace(/:/g,"\\:")+":"+t)}else e.push(s)}))}optionCompletions(e,t,n,s){if((s.match(/^-/)||""===s&&0===e.length)&&!this.previousArgHasChoices(t)){const n=this.yargs.getOptions(),i=this.yargs.getGroups()[this.usage.getPositionalGroupName()]||[];Object.keys(n.key).forEach((r=>{const o=!!n.configuration["boolean-negation"]&&n.boolean.includes(r);i.includes(r)||n.hiddenOptions.includes(r)||this.argsContainKey(t,r,o)||this.completeOptionKey(r,e,s,o&&!!n.default[r])}))}}choicesFromOptionsCompletions(e,t,n,s){if(this.previousArgHasChoices(t)){const n=this.getPreviousArgChoices(t);n&&n.length>0&&e.push(...n.map((e=>e.replace(/:/g,"\\:"))))}}choicesFromPositionalsCompletions(e,t,n,s){if(""===s&&e.length>0&&this.previousArgHasChoices(t))return;const i=this.yargs.getGroups()[this.usage.getPositionalGroupName()]||[],r=Math.max(this.indexAfterLastReset,this.yargs.getInternalMethods().getContext().commands.length+1),o=i[n._.length-r-1];if(!o)return;const a=this.yargs.getOptions().choices[o]||[];for(const t of a)t.startsWith(s)&&e.push(t.replace(/:/g,"\\:"))}getPreviousArgChoices(e){if(e.length<1)return;let t=e[e.length-1],n="";if(!t.startsWith("-")&&e.length>1&&(n=t,t=e[e.length-2]),!t.startsWith("-"))return;const s=t.replace(/^-+/,""),i=this.yargs.getOptions(),r=[s,...this.yargs.getAliases()[s]||[]];let o;for(const e of r)if(Object.prototype.hasOwnProperty.call(i.key,e)&&Array.isArray(i.choices[e])){o=i.choices[e];break}return o?o.filter((e=>!n||e.startsWith(n))):void 0}previousArgHasChoices(e){const t=this.getPreviousArgChoices(e);return void 0!==t&&t.length>0}argsContainKey(e,t,n){const s=t=>-1!==e.indexOf((/^[^0-9]$/.test(t)?"-":"--")+t);if(s(t))return!0;if(n&&s(`no-${t}`))return!0;if(this.aliases)for(const e of this.aliases[t])if(s(e))return!0;return!1}completeOptionKey(e,t,n,s){var i,r,o,a;let c=e;if(this.zshShell){const t=this.usage.getDescriptions(),n=null===(r=null===(i=null==this?void 0:this.aliases)||void 0===i?void 0:i[e])||void 0===r?void 0:r.find((e=>{const n=t[e];return"string"==typeof n&&n.length>0})),s=n?t[n]:void 0,l=null!==(a=null!==(o=t[e])&&void 0!==o?o:s)&&void 0!==a?a:"";c=`${e.replace(/:/g,"\\:")}:${l.replace("__yargsString__:","").replace(/(\r\n|\n|\r)/gm," ")}`}const l=!(e=>/^--/.test(e))(n)&&(e=>/^[^0-9]$/.test(e))(e)?"-":"--";t.push(l+c),s&&t.push(l+"no-"+c)}customCompletion(e,t,n,s){if(de(this.customCompletionFunction,null,this.shim),this.customCompletionFunction.length<3){const e=this.customCompletionFunction(n,t);return pe(e)?e.then((e=>{this.shim.process.nextTick((()=>{s(null,e)}))})).catch((e=>{this.shim.process.nextTick((()=>{s(e,void 0)}))})):s(null,e)}return function(e){return e.length>3}(this.customCompletionFunction)?this.customCompletionFunction(n,t,((i=s)=>this.defaultCompletion(e,t,n,i)),(e=>{s(null,e)})):this.customCompletionFunction(n,t,(e=>{s(null,e)}))}getCompletion(e,t){const n=e.length?e[e.length-1]:"",s=this.yargs.parse(e,!0),i=this.customCompletionFunction?s=>this.customCompletion(e,s,n,t):s=>this.defaultCompletion(e,s,n,t);return pe(s)?s.then(i):i(s)}generateCompletionScript(e,t){let n=this.zshShell?'#compdef {{app_name}}\n###-begin-{{app_name}}-completions-###\n#\n# yargs command completion script\n#\n# Installation: {{app_path}} {{completion_command}} >> ~/.zshrc\n# or {{app_path}} {{completion_command}} >> ~/.zprofile on OSX.\n#\n_{{app_name}}_yargs_completions()\n{\n local reply\n local si=$IFS\n IFS=$\'\n\' reply=($(COMP_CWORD="$((CURRENT-1))" COMP_LINE="$BUFFER" COMP_POINT="$CURSOR" {{app_path}} --get-yargs-completions "${words[@]}"))\n IFS=$si\n _describe \'values\' reply\n}\ncompdef _{{app_name}}_yargs_completions {{app_name}}\n###-end-{{app_name}}-completions-###\n':'###-begin-{{app_name}}-completions-###\n#\n# yargs command completion script\n#\n# Installation: {{app_path}} {{completion_command}} >> ~/.bashrc\n# or {{app_path}} {{completion_command}} >> ~/.bash_profile on OSX.\n#\n_{{app_name}}_yargs_completions()\n{\n local cur_word args type_list\n\n cur_word="${COMP_WORDS[COMP_CWORD]}"\n args=("${COMP_WORDS[@]}")\n\n # ask yargs to generate completions.\n type_list=$({{app_path}} --get-yargs-completions "${args[@]}")\n\n COMPREPLY=( $(compgen -W "${type_list}" -- ${cur_word}) )\n\n # if no match was found, fall back to filename completion\n if [ ${#COMPREPLY[@]} -eq 0 ]; then\n COMPREPLY=()\n fi\n\n return 0\n}\ncomplete -o bashdefault -o default -F _{{app_name}}_yargs_completions {{app_name}}\n###-end-{{app_name}}-completions-###\n';const s=this.shim.path.basename(e);return e.match(/\.js$/)&&(e=`./${e}`),n=n.replace(/{{app_name}}/g,s),n=n.replace(/{{completion_command}}/g,t),n.replace(/{{app_path}}/g,e)}registerFunction(e){this.customCompletionFunction=e}setParsed(e){this.aliases=e.aliases}}function Ie(e,t){if(0===e.length)return t.length;if(0===t.length)return e.length;const n=[];let s,i;for(s=0;s<=t.length;s++)n[s]=[s];for(i=0;i<=e.length;i++)n[0][i]=i;for(s=1;s<=t.length;s++)for(i=1;i<=e.length;i++)t.charAt(s-1)===e.charAt(i-1)?n[s][i]=n[s-1][i-1]:s>1&&i>1&&t.charAt(s-2)===e.charAt(i-1)&&t.charAt(s-1)===e.charAt(i-2)?n[s][i]=n[s-2][i-2]+1:n[s][i]=Math.min(n[s-1][i-1]+1,Math.min(n[s][i-1]+1,n[s-1][i]+1));return n[t.length][e.length]}const Re=["$0","--","_"];let We,ze=[];function Te(e,t,n,s){We=s;let i={};if(Object.prototype.hasOwnProperty.call(e,"extends")){if("string"!=typeof e.extends)return i;const s=/\.json|\..*rc$/.test(e.extends);let r=null;if(s)r=function(e,t){return We.path.resolve(e,t)}(t,e.extends);else try{r=require.resolve(e.extends)}catch(t){return e}!function(e){if(ze.indexOf(e)>-1)throw new se(`Circular extended configurations: '${e}'.`)}(r),ze.push(r),i=s?JSON.parse(We.readFileSync(r,"utf8")):require(e.extends),delete e.extends,i=Te(i,We.path.dirname(r),n,We)}return ze=[],n?Fe(i,e):Object.assign({},i,e)}function Fe(e,t){const n={};function s(e){return e&&"object"==typeof e&&!Array.isArray(e)}Object.assign(n,e);for(const i of Object.keys(t))s(t[i])&&s(n[i])?n[i]=Fe(e[i],t[i]):n[i]=t[i];return n}var Be,Le,Ve,Ue,He,Ye,qe,Je,Ge,Ke,Qe,Xe,Ze,et,tt,nt,st,it,rt,ot,at,ct,lt,ht,dt,ut,ft,pt,gt,mt,yt,bt,vt,wt,Ot,Et=function(e,t,n,s,i){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!i)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!i:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?i.call(e,n):i?i.value=n:t.set(e,n),n},kt=function(e,t,n,s){if("a"===n&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===n?s:"a"===n?s.call(e):s?s.value:t.get(e)};const At=Symbol("copyDoubleDash"),jt=Symbol("copyDoubleDash"),$t=Symbol("deleteFromParserHintObject"),_t=Symbol("emitWarning"),xt=Symbol("freeze"),Ct=Symbol("getDollarZero"),St=Symbol("getParserConfiguration"),Pt=Symbol("getUsageConfiguration"),Nt=Symbol("guessLocale"),Mt=Symbol("guessVersion"),Dt=Symbol("parsePositionalNumbers"),It=Symbol("pkgUp"),Rt=Symbol("populateParserHintArray"),Wt=Symbol("populateParserHintSingleValueDictionary"),zt=Symbol("populateParserHintArrayDictionary"),Tt=Symbol("populateParserHintDictionary"),Ft=Symbol("sanitizeKey"),Bt=Symbol("setKey"),Lt=Symbol("unfreeze"),Vt=Symbol("validateAsync"),Ut=Symbol("getCommandInstance"),Ht=Symbol("getContext"),Yt=Symbol("getHasOutput"),qt=Symbol("getLoggerInstance"),Jt=Symbol("getParseContext"),Gt=Symbol("getUsageInstance"),Kt=Symbol("getValidationInstance"),Qt=Symbol("hasParseCallback"),Xt=Symbol("isGlobalContext"),Zt=Symbol("postProcess"),en=Symbol("rebase"),tn=Symbol("reset"),nn=Symbol("runYargsParserAndExecuteCommands"),sn=Symbol("runValidation"),rn=Symbol("setHasOutput"),on=Symbol("kTrackManuallySetKeys");class an{constructor(e=[],t,n,s){this.customScriptName=!1,this.parsed=!1,Be.set(this,void 0),Le.set(this,void 0),Ve.set(this,{commands:[],fullCommands:[]}),Ue.set(this,null),He.set(this,null),Ye.set(this,"show-hidden"),qe.set(this,null),Je.set(this,!0),Ge.set(this,{}),Ke.set(this,!0),Qe.set(this,[]),Xe.set(this,void 0),Ze.set(this,{}),et.set(this,!1),tt.set(this,null),nt.set(this,!0),st.set(this,void 0),it.set(this,""),rt.set(this,void 0),ot.set(this,void 0),at.set(this,{}),ct.set(this,null),lt.set(this,null),ht.set(this,{}),dt.set(this,{}),ut.set(this,void 0),ft.set(this,!1),pt.set(this,void 0),gt.set(this,!1),mt.set(this,!1),yt.set(this,!1),bt.set(this,void 0),vt.set(this,{}),wt.set(this,null),Ot.set(this,void 0),Et(this,pt,s,"f"),Et(this,ut,e,"f"),Et(this,Le,t,"f"),Et(this,ot,n,"f"),Et(this,Xe,new we(this),"f"),this.$0=this[Ct](),this[tn](),Et(this,Be,kt(this,Be,"f"),"f"),Et(this,bt,kt(this,bt,"f"),"f"),Et(this,Ot,kt(this,Ot,"f"),"f"),Et(this,rt,kt(this,rt,"f"),"f"),kt(this,rt,"f").showHiddenOpt=kt(this,Ye,"f"),Et(this,st,this[jt](),"f")}addHelpOpt(e,t){return ye("[string|boolean] [string]",[e,t],arguments.length),kt(this,tt,"f")&&(this[$t](kt(this,tt,"f")),Et(this,tt,null,"f")),!1===e&&void 0===t||(Et(this,tt,"string"==typeof e?e:"help","f"),this.boolean(kt(this,tt,"f")),this.describe(kt(this,tt,"f"),t||kt(this,bt,"f").deferY18nLookup("Show help"))),this}help(e,t){return this.addHelpOpt(e,t)}addShowHiddenOpt(e,t){if(ye("[string|boolean] [string]",[e,t],arguments.length),!1===e&&void 0===t)return this;const n="string"==typeof e?e:kt(this,Ye,"f");return this.boolean(n),this.describe(n,t||kt(this,bt,"f").deferY18nLookup("Show hidden options")),kt(this,rt,"f").showHiddenOpt=n,this}showHidden(e,t){return this.addShowHiddenOpt(e,t)}alias(e,t){return ye("<object|string|array> [string|array]",[e,t],arguments.length),this[zt](this.alias.bind(this),"alias",e,t),this}array(e){return ye("<array|string>",[e],arguments.length),this[Rt]("array",e),this[on](e),this}boolean(e){return ye("<array|string>",[e],arguments.length),this[Rt]("boolean",e),this[on](e),this}check(e,t){return ye("<function> [boolean]",[e,t],arguments.length),this.middleware(((t,n)=>Ee((()=>e(t,n.getOptions())),(n=>(n?("string"==typeof n||n instanceof Error)&&kt(this,bt,"f").fail(n.toString(),n):kt(this,bt,"f").fail(kt(this,pt,"f").y18n.__("Argument check failed: %s",e.toString())),t)),(e=>(kt(this,bt,"f").fail(e.message?e.message:e.toString(),e),t)))),!1,t),this}choices(e,t){return ye("<object|string|array> [string|array]",[e,t],arguments.length),this[zt](this.choices.bind(this),"choices",e,t),this}coerce(e,t){if(ye("<object|string|array> [function]",[e,t],arguments.length),Array.isArray(e)){if(!t)throw new se("coerce callback must be provided");for(const n of e)this.coerce(n,t);return this}if("object"==typeof e){for(const t of Object.keys(e))this.coerce(t,e[t]);return this}if(!t)throw new se("coerce callback must be provided");return kt(this,rt,"f").key[e]=!0,kt(this,Xe,"f").addCoerceMiddleware(((n,s)=>{let i;return Object.prototype.hasOwnProperty.call(n,e)?Ee((()=>(i=s.getAliases(),t(n[e]))),(t=>{n[e]=t;const r=s.getInternalMethods().getParserConfiguration()["strip-aliased"];if(i[e]&&!0!==r)for(const s of i[e])n[s]=t;return n}),(e=>{throw new se(e.message)})):n}),e),this}conflicts(e,t){return ye("<string|object> [string|array]",[e,t],arguments.length),kt(this,Ot,"f").conflicts(e,t),this}config(e="config",t,n){return ye("[object|string] [string|function] [function]",[e,t,n],arguments.length),"object"!=typeof e||Array.isArray(e)?("function"==typeof t&&(n=t,t=void 0),this.describe(e,t||kt(this,bt,"f").deferY18nLookup("Path to JSON config file")),(Array.isArray(e)?e:[e]).forEach((e=>{kt(this,rt,"f").config[e]=n||!0})),this):(e=Te(e,kt(this,Le,"f"),this[St]()["deep-merge-config"]||!1,kt(this,pt,"f")),kt(this,rt,"f").configObjects=(kt(this,rt,"f").configObjects||[]).concat(e),this)}completion(e,t,n){return ye("[string] [string|boolean|function] [function]",[e,t,n],arguments.length),"function"==typeof t&&(n=t,t=void 0),Et(this,He,e||kt(this,He,"f")||"completion","f"),t||!1===t||(t="generate completion script"),this.command(kt(this,He,"f"),t),n&&kt(this,Ue,"f").registerFunction(n),this}command(e,t,n,s,i,r){return ye("<string|array|object> [string|boolean] [function|object] [function] [array] [boolean|string]",[e,t,n,s,i,r],arguments.length),kt(this,Be,"f").addHandler(e,t,n,s,i,r),this}commands(e,t,n,s,i,r){return this.command(e,t,n,s,i,r)}commandDir(e,t){ye("<string> [object]",[e,t],arguments.length);const n=kt(this,ot,"f")||kt(this,pt,"f").require;return kt(this,Be,"f").addDirectory(e,n,kt(this,pt,"f").getCallerFile(),t),this}count(e){return ye("<array|string>",[e],arguments.length),this[Rt]("count",e),this[on](e),this}default(e,t,n){return ye("<object|string|array> [*] [string]",[e,t,n],arguments.length),n&&(ue(e,kt(this,pt,"f")),kt(this,rt,"f").defaultDescription[e]=n),"function"==typeof t&&(ue(e,kt(this,pt,"f")),kt(this,rt,"f").defaultDescription[e]||(kt(this,rt,"f").defaultDescription[e]=kt(this,bt,"f").functionDescription(t)),t=t.call()),this[Wt](this.default.bind(this),"default",e,t),this}defaults(e,t,n){return this.default(e,t,n)}demandCommand(e=1,t,n,s){return ye("[number] [number|string] [string|null|undefined] [string|null|undefined]",[e,t,n,s],arguments.length),"number"!=typeof t&&(n=t,t=1/0),this.global("_",!1),kt(this,rt,"f").demandedCommands._={min:e,max:t,minMsg:n,maxMsg:s},this}demand(e,t,n){return Array.isArray(t)?(t.forEach((e=>{de(n,!0,kt(this,pt,"f")),this.demandOption(e,n)})),t=1/0):"number"!=typeof t&&(n=t,t=1/0),"number"==typeof e?(de(n,!0,kt(this,pt,"f")),this.demandCommand(e,t,n,n)):Array.isArray(e)?e.forEach((e=>{de(n,!0,kt(this,pt,"f")),this.demandOption(e,n)})):"string"==typeof n?this.demandOption(e,n):!0!==n&&void 0!==n||this.demandOption(e),this}demandOption(e,t){return ye("<object|string|array> [string]",[e,t],arguments.length),this[Wt](this.demandOption.bind(this),"demandedOptions",e,t),this}deprecateOption(e,t){return ye("<string> [string|boolean]",[e,t],arguments.length),kt(this,rt,"f").deprecatedOptions[e]=t,this}describe(e,t){return ye("<object|string|array> [string]",[e,t],arguments.length),this[Bt](e,!0),kt(this,bt,"f").describe(e,t),this}detectLocale(e){return ye("<boolean>",[e],arguments.length),Et(this,Je,e,"f"),this}env(e){return ye("[string|boolean]",[e],arguments.length),!1===e?delete kt(this,rt,"f").envPrefix:kt(this,rt,"f").envPrefix=e||"",this}epilogue(e){return ye("<string>",[e],arguments.length),kt(this,bt,"f").epilog(e),this}epilog(e){return this.epilogue(e)}example(e,t){return ye("<string|array> [string]",[e,t],arguments.length),Array.isArray(e)?e.forEach((e=>this.example(...e))):kt(this,bt,"f").example(e,t),this}exit(e,t){Et(this,et,!0,"f"),Et(this,qe,t,"f"),kt(this,Ke,"f")&&kt(this,pt,"f").process.exit(e)}exitProcess(e=!0){return ye("[boolean]",[e],arguments.length),Et(this,Ke,e,"f"),this}fail(e){if(ye("<function|boolean>",[e],arguments.length),"boolean"==typeof e&&!1!==e)throw new se("Invalid first argument. Expected function or boolean 'false'");return kt(this,bt,"f").failFn(e),this}getAliases(){return this.parsed?this.parsed.aliases:{}}async getCompletion(e,t){return ye("<array> [function]",[e,t],arguments.length),t?kt(this,Ue,"f").getCompletion(e,t):new Promise(((t,n)=>{kt(this,Ue,"f").getCompletion(e,((e,s)=>{e?n(e):t(s)}))}))}getDemandedOptions(){return ye([],0),kt(this,rt,"f").demandedOptions}getDemandedCommands(){return ye([],0),kt(this,rt,"f").demandedCommands}getDeprecatedOptions(){return ye([],0),kt(this,rt,"f").deprecatedOptions}getDetectLocale(){return kt(this,Je,"f")}getExitProcess(){return kt(this,Ke,"f")}getGroups(){return Object.assign({},kt(this,Ze,"f"),kt(this,dt,"f"))}getHelp(){if(Et(this,et,!0,"f"),!kt(this,bt,"f").hasCachedHelpMessage()){if(!this.parsed){const e=this[nn](kt(this,ut,"f"),void 0,void 0,0,!0);if(pe(e))return e.then((()=>kt(this,bt,"f").help()))}const e=kt(this,Be,"f").runDefaultBuilderOn(this);if(pe(e))return e.then((()=>kt(this,bt,"f").help()))}return Promise.resolve(kt(this,bt,"f").help())}getOptions(){return kt(this,rt,"f")}getStrict(){return kt(this,gt,"f")}getStrictCommands(){return kt(this,mt,"f")}getStrictOptions(){return kt(this,yt,"f")}global(e,t){return ye("<string|array> [boolean]",[e,t],arguments.length),e=[].concat(e),!1!==t?kt(this,rt,"f").local=kt(this,rt,"f").local.filter((t=>-1===e.indexOf(t))):e.forEach((e=>{kt(this,rt,"f").local.includes(e)||kt(this,rt,"f").local.push(e)})),this}group(e,t){ye("<string|array> <string>",[e,t],arguments.length);const n=kt(this,dt,"f")[t]||kt(this,Ze,"f")[t];kt(this,dt,"f")[t]&&delete kt(this,dt,"f")[t];const s={};return kt(this,Ze,"f")[t]=(n||[]).concat(e).filter((e=>!s[e]&&(s[e]=!0))),this}hide(e){return ye("<string>",[e],arguments.length),kt(this,rt,"f").hiddenOptions.push(e),this}implies(e,t){return ye("<string|object> [number|string|array]",[e,t],arguments.length),kt(this,Ot,"f").implies(e,t),this}locale(e){return ye("[string]",[e],arguments.length),void 0===e?(this[Nt](),kt(this,pt,"f").y18n.getLocale()):(Et(this,Je,!1,"f"),kt(this,pt,"f").y18n.setLocale(e),this)}middleware(e,t,n){return kt(this,Xe,"f").addMiddleware(e,!!t,n)}nargs(e,t){return ye("<string|object|array> [number]",[e,t],arguments.length),this[Wt](this.nargs.bind(this),"narg",e,t),this}normalize(e){return ye("<array|string>",[e],arguments.length),this[Rt]("normalize",e),this}number(e){return ye("<array|string>",[e],arguments.length),this[Rt]("number",e),this[on](e),this}option(e,t){if(ye("<string|object> [object]",[e,t],arguments.length),"object"==typeof e)Object.keys(e).forEach((t=>{this.options(t,e[t])}));else{"object"!=typeof t&&(t={}),this[on](e),!kt(this,wt,"f")||"version"!==e&&"version"!==(null==t?void 0:t.alias)||this[_t](['"version" is a reserved word.',"Please do one of the following:",'- Disable version with `yargs.version(false)` if using "version" as an option',"- Use the built-in `yargs.version` method instead (if applicable)","- Use a different option key","https://yargs.js.org/docs/#api-reference-version"].join("\n"),void 0,"versionWarning"),kt(this,rt,"f").key[e]=!0,t.alias&&this.alias(e,t.alias);const n=t.deprecate||t.deprecated;n&&this.deprecateOption(e,n);const s=t.demand||t.required||t.require;s&&this.demand(e,s),t.demandOption&&this.demandOption(e,"string"==typeof t.demandOption?t.demandOption:void 0),t.conflicts&&this.conflicts(e,t.conflicts),"default"in t&&this.default(e,t.default),void 0!==t.implies&&this.implies(e,t.implies),void 0!==t.nargs&&this.nargs(e,t.nargs),t.config&&this.config(e,t.configParser),t.normalize&&this.normalize(e),t.choices&&this.choices(e,t.choices),t.coerce&&this.coerce(e,t.coerce),t.group&&this.group(e,t.group),(t.boolean||"boolean"===t.type)&&(this.boolean(e),t.alias&&this.boolean(t.alias)),(t.array||"array"===t.type)&&(this.array(e),t.alias&&this.array(t.alias)),(t.number||"number"===t.type)&&(this.number(e),t.alias&&this.number(t.alias)),(t.string||"string"===t.type)&&(this.string(e),t.alias&&this.string(t.alias)),(t.count||"count"===t.type)&&this.count(e),"boolean"==typeof t.global&&this.global(e,t.global),t.defaultDescription&&(kt(this,rt,"f").defaultDescription[e]=t.defaultDescription),t.skipValidation&&this.skipValidation(e);const i=t.describe||t.description||t.desc,r=kt(this,bt,"f").getDescriptions();Object.prototype.hasOwnProperty.call(r,e)&&"string"!=typeof i||this.describe(e,i),t.hidden&&this.hide(e),t.requiresArg&&this.requiresArg(e)}return this}options(e,t){return this.option(e,t)}parse(e,t,n){ye("[string|array] [function|boolean|object] [function]",[e,t,n],arguments.length),this[xt](),void 0===e&&(e=kt(this,ut,"f")),"object"==typeof t&&(Et(this,lt,t,"f"),t=n),"function"==typeof t&&(Et(this,ct,t,"f"),t=!1),t||Et(this,ut,e,"f"),kt(this,ct,"f")&&Et(this,Ke,!1,"f");const s=this[nn](e,!!t),i=this.parsed;return kt(this,Ue,"f").setParsed(this.parsed),pe(s)?s.then((e=>(kt(this,ct,"f")&&kt(this,ct,"f").call(this,kt(this,qe,"f"),e,kt(this,it,"f")),e))).catch((e=>{throw kt(this,ct,"f")&&kt(this,ct,"f")(e,this.parsed.argv,kt(this,it,"f")),e})).finally((()=>{this[Lt](),this.parsed=i})):(kt(this,ct,"f")&&kt(this,ct,"f").call(this,kt(this,qe,"f"),s,kt(this,it,"f")),this[Lt](),this.parsed=i,s)}parseAsync(e,t,n){const s=this.parse(e,t,n);return pe(s)?s:Promise.resolve(s)}parseSync(e,t,n){const s=this.parse(e,t,n);if(pe(s))throw new se(".parseSync() must not be used with asynchronous builders, handlers, or middleware");return s}parserConfiguration(e){return ye("<object>",[e],arguments.length),Et(this,at,e,"f"),this}pkgConf(e,t){ye("<string> [string]",[e,t],arguments.length);let n=null;const s=this[It](t||kt(this,Le,"f"));return s[e]&&"object"==typeof s[e]&&(n=Te(s[e],t||kt(this,Le,"f"),this[St]()["deep-merge-config"]||!1,kt(this,pt,"f")),kt(this,rt,"f").configObjects=(kt(this,rt,"f").configObjects||[]).concat(n)),this}positional(e,t){ye("<string> <object>",[e,t],arguments.length);const n=["default","defaultDescription","implies","normalize","choices","conflicts","coerce","type","describe","desc","description","alias"];t=_e(t,((e,t)=>!("type"===e&&!["string","number","boolean"].includes(t))&&n.includes(e)));const s=kt(this,Ve,"f").fullCommands[kt(this,Ve,"f").fullCommands.length-1],i=s?kt(this,Be,"f").cmdToParseOptions(s):{array:[],alias:{},default:{},demand:{}};return fe(i).forEach((n=>{const s=i[n];Array.isArray(s)?-1!==s.indexOf(e)&&(t[n]=!0):s[e]&&!(n in t)&&(t[n]=s[e])})),this.group(e,kt(this,bt,"f").getPositionalGroupName()),this.option(e,t)}recommendCommands(e=!0){return ye("[boolean]",[e],arguments.length),Et(this,ft,e,"f"),this}required(e,t,n){return this.demand(e,t,n)}require(e,t,n){return this.demand(e,t,n)}requiresArg(e){return ye("<array|string|object> [number]",[e],arguments.length),"string"==typeof e&&kt(this,rt,"f").narg[e]||this[Wt](this.requiresArg.bind(this),"narg",e,NaN),this}showCompletionScript(e,t){return ye("[string] [string]",[e,t],arguments.length),e=e||this.$0,kt(this,st,"f").log(kt(this,Ue,"f").generateCompletionScript(e,t||kt(this,He,"f")||"completion")),this}showHelp(e){if(ye("[string|function]",[e],arguments.length),Et(this,et,!0,"f"),!kt(this,bt,"f").hasCachedHelpMessage()){if(!this.parsed){const t=this[nn](kt(this,ut,"f"),void 0,void 0,0,!0);if(pe(t))return t.then((()=>{kt(this,bt,"f").showHelp(e)})),this}const t=kt(this,Be,"f").runDefaultBuilderOn(this);if(pe(t))return t.then((()=>{kt(this,bt,"f").showHelp(e)})),this}return kt(this,bt,"f").showHelp(e),this}scriptName(e){return this.customScriptName=!0,this.$0=e,this}showHelpOnFail(e,t){return ye("[boolean|string] [string]",[e,t],arguments.length),kt(this,bt,"f").showHelpOnFail(e,t),this}showVersion(e){return ye("[string|function]",[e],arguments.length),kt(this,bt,"f").showVersion(e),this}skipValidation(e){return ye("<array|string>",[e],arguments.length),this[Rt]("skipValidation",e),this}strict(e){return ye("[boolean]",[e],arguments.length),Et(this,gt,!1!==e,"f"),this}strictCommands(e){return ye("[boolean]",[e],arguments.length),Et(this,mt,!1!==e,"f"),this}strictOptions(e){return ye("[boolean]",[e],arguments.length),Et(this,yt,!1!==e,"f"),this}string(e){return ye("<array|string>",[e],arguments.length),this[Rt]("string",e),this[on](e),this}terminalWidth(){return ye([],0),kt(this,pt,"f").process.stdColumns}updateLocale(e){return this.updateStrings(e)}updateStrings(e){return ye("<object>",[e],arguments.length),Et(this,Je,!1,"f"),kt(this,pt,"f").y18n.updateLocale(e),this}usage(e,t,n,s){if(ye("<string|null|undefined> [string|boolean] [function|object] [function]",[e,t,n,s],arguments.length),void 0!==t){if(de(e,null,kt(this,pt,"f")),(e||"").match(/^\$0( |$)/))return this.command(e,t,n,s);throw new se(".usage() description must start with $0 if being used as alias for .command()")}return kt(this,bt,"f").usage(e),this}usageConfiguration(e){return ye("<object>",[e],arguments.length),Et(this,vt,e,"f"),this}version(e,t,n){const s="version";if(ye("[boolean|string] [string] [string]",[e,t,n],arguments.length),kt(this,wt,"f")&&(this[$t](kt(this,wt,"f")),kt(this,bt,"f").version(void 0),Et(this,wt,null,"f")),0===arguments.length)n=this[Mt](),e=s;else if(1===arguments.length){if(!1===e)return this;n=e,e=s}else 2===arguments.length&&(n=t,t=void 0);return Et(this,wt,"string"==typeof e?e:s,"f"),t=t||kt(this,bt,"f").deferY18nLookup("Show version number"),kt(this,bt,"f").version(n||void 0),this.boolean(kt(this,wt,"f")),this.describe(kt(this,wt,"f"),t),this}wrap(e){return ye("<number|null|undefined>",[e],arguments.length),kt(this,bt,"f").wrap(e),this}[(Be=new WeakMap,Le=new WeakMap,Ve=new WeakMap,Ue=new WeakMap,He=new WeakMap,Ye=new WeakMap,qe=new WeakMap,Je=new WeakMap,Ge=new WeakMap,Ke=new WeakMap,Qe=new WeakMap,Xe=new WeakMap,Ze=new WeakMap,et=new WeakMap,tt=new WeakMap,nt=new WeakMap,st=new WeakMap,it=new WeakMap,rt=new WeakMap,ot=new WeakMap,at=new WeakMap,ct=new WeakMap,lt=new WeakMap,ht=new WeakMap,dt=new WeakMap,ut=new WeakMap,ft=new WeakMap,pt=new WeakMap,gt=new WeakMap,mt=new WeakMap,yt=new WeakMap,bt=new WeakMap,vt=new WeakMap,wt=new WeakMap,Ot=new WeakMap,At)](e){if(!e._||!e["--"])return e;e._.push.apply(e._,e["--"]);try{delete e["--"]}catch(e){}return e}[jt](){return{log:(...e)=>{this[Qt]()||console.log(...e),Et(this,et,!0,"f"),kt(this,it,"f").length&&Et(this,it,kt(this,it,"f")+"\n","f"),Et(this,it,kt(this,it,"f")+e.join(" "),"f")},error:(...e)=>{this[Qt]()||console.error(...e),Et(this,et,!0,"f"),kt(this,it,"f").length&&Et(this,it,kt(this,it,"f")+"\n","f"),Et(this,it,kt(this,it,"f")+e.join(" "),"f")}}}[$t](e){fe(kt(this,rt,"f")).forEach((t=>{if("configObjects"===t)return;const n=kt(this,rt,"f")[t];Array.isArray(n)?n.includes(e)&&n.splice(n.indexOf(e),1):"object"==typeof n&&delete n[e]})),delete kt(this,bt,"f").getDescriptions()[e]}[_t](e,t,n){kt(this,Ge,"f")[n]||(kt(this,pt,"f").process.emitWarning(e,t),kt(this,Ge,"f")[n]=!0)}[xt](){kt(this,Qe,"f").push({options:kt(this,rt,"f"),configObjects:kt(this,rt,"f").configObjects.slice(0),exitProcess:kt(this,Ke,"f"),groups:kt(this,Ze,"f"),strict:kt(this,gt,"f"),strictCommands:kt(this,mt,"f"),strictOptions:kt(this,yt,"f"),completionCommand:kt(this,He,"f"),output:kt(this,it,"f"),exitError:kt(this,qe,"f"),hasOutput:kt(this,et,"f"),parsed:this.parsed,parseFn:kt(this,ct,"f"),parseContext:kt(this,lt,"f")}),kt(this,bt,"f").freeze(),kt(this,Ot,"f").freeze(),kt(this,Be,"f").freeze(),kt(this,Xe,"f").freeze()}[Ct](){let e,t="";return e=/\b(node|iojs|electron)(\.exe)?$/.test(kt(this,pt,"f").process.argv()[0])?kt(this,pt,"f").process.argv().slice(1,2):kt(this,pt,"f").process.argv().slice(0,1),t=e.map((e=>{const t=this[en](kt(this,Le,"f"),e);return e.match(/^(\/|([a-zA-Z]:)?\\)/)&&t.length<e.length?t:e})).join(" ").trim(),kt(this,pt,"f").getEnv("_")&&kt(this,pt,"f").getProcessArgvBin()===kt(this,pt,"f").getEnv("_")&&(t=kt(this,pt,"f").getEnv("_").replace(`${kt(this,pt,"f").path.dirname(kt(this,pt,"f").process.execPath())}/`,"")),t}[St](){return kt(this,at,"f")}[Pt](){return kt(this,vt,"f")}[Nt](){if(!kt(this,Je,"f"))return;const e=kt(this,pt,"f").getEnv("LC_ALL")||kt(this,pt,"f").getEnv("LC_MESSAGES")||kt(this,pt,"f").getEnv("LANG")||kt(this,pt,"f").getEnv("LANGUAGE")||"en_US";this.locale(e.replace(/[.:].*/,""))}[Mt](){return this[It]().version||"unknown"}[Dt](e){const t=e["--"]?e["--"]:e._;for(let e,n=0;void 0!==(e=t[n]);n++)kt(this,pt,"f").Parser.looksLikeNumber(e)&&Number.isSafeInteger(Math.floor(parseFloat(`${e}`)))&&(t[n]=Number(e));return e}[It](e){const t=e||"*";if(kt(this,ht,"f")[t])return kt(this,ht,"f")[t];let n={};try{let t=e||kt(this,pt,"f").mainFilename;!e&&kt(this,pt,"f").path.extname(t)&&(t=kt(this,pt,"f").path.dirname(t));const s=kt(this,pt,"f").findUp(t,((e,t)=>t.includes("package.json")?"package.json":void 0));de(s,void 0,kt(this,pt,"f")),n=JSON.parse(kt(this,pt,"f").readFileSync(s,"utf8"))}catch(e){}return kt(this,ht,"f")[t]=n||{},kt(this,ht,"f")[t]}[Rt](e,t){(t=[].concat(t)).forEach((t=>{t=this[Ft](t),kt(this,rt,"f")[e].push(t)}))}[Wt](e,t,n,s){this[Tt](e,t,n,s,((e,t,n)=>{kt(this,rt,"f")[e][t]=n}))}[zt](e,t,n,s){this[Tt](e,t,n,s,((e,t,n)=>{kt(this,rt,"f")[e][t]=(kt(this,rt,"f")[e][t]||[]).concat(n)}))}[Tt](e,t,n,s,i){if(Array.isArray(n))n.forEach((t=>{e(t,s)}));else if((e=>"object"==typeof e)(n))for(const t of fe(n))e(t,n[t]);else i(t,this[Ft](n),s)}[Ft](e){return"__proto__"===e?"___proto___":e}[Bt](e,t){return this[Wt](this[Bt].bind(this),"key",e,t),this}[Lt](){var e,t,n,s,i,r,o,a,c,l,h,d;const u=kt(this,Qe,"f").pop();let f;de(u,void 0,kt(this,pt,"f")),e=this,t=this,n=this,s=this,i=this,r=this,o=this,a=this,c=this,l=this,h=this,d=this,({options:{set value(t){Et(e,rt,t,"f")}}.value,configObjects:f,exitProcess:{set value(e){Et(t,Ke,e,"f")}}.value,groups:{set value(e){Et(n,Ze,e,"f")}}.value,output:{set value(e){Et(s,it,e,"f")}}.value,exitError:{set value(e){Et(i,qe,e,"f")}}.value,hasOutput:{set value(e){Et(r,et,e,"f")}}.value,parsed:this.parsed,strict:{set value(e){Et(o,gt,e,"f")}}.value,strictCommands:{set value(e){Et(a,mt,e,"f")}}.value,strictOptions:{set value(e){Et(c,yt,e,"f")}}.value,completionCommand:{set value(e){Et(l,He,e,"f")}}.value,parseFn:{set value(e){Et(h,ct,e,"f")}}.value,parseContext:{set value(e){Et(d,lt,e,"f")}}.value}=u),kt(this,rt,"f").configObjects=f,kt(this,bt,"f").unfreeze(),kt(this,Ot,"f").unfreeze(),kt(this,Be,"f").unfreeze(),kt(this,Xe,"f").unfreeze()}[Vt](e,t){return Ee(t,(t=>(e(t),t)))}getInternalMethods(){return{getCommandInstance:this[Ut].bind(this),getContext:this[Ht].bind(this),getHasOutput:this[Yt].bind(this),getLoggerInstance:this[qt].bind(this),getParseContext:this[Jt].bind(this),getParserConfiguration:this[St].bind(this),getUsageConfiguration:this[Pt].bind(this),getUsageInstance:this[Gt].bind(this),getValidationInstance:this[Kt].bind(this),hasParseCallback:this[Qt].bind(this),isGlobalContext:this[Xt].bind(this),postProcess:this[Zt].bind(this),reset:this[tn].bind(this),runValidation:this[sn].bind(this),runYargsParserAndExecuteCommands:this[nn].bind(this),setHasOutput:this[rn].bind(this)}}[Ut](){return kt(this,Be,"f")}[Ht](){return kt(this,Ve,"f")}[Yt](){return kt(this,et,"f")}[qt](){return kt(this,st,"f")}[Jt](){return kt(this,lt,"f")||{}}[Gt](){return kt(this,bt,"f")}[Kt](){return kt(this,Ot,"f")}[Qt](){return!!kt(this,ct,"f")}[Xt](){return kt(this,nt,"f")}[Zt](e,t,n,s){if(n)return e;if(pe(e))return e;t||(e=this[At](e));return(this[St]()["parse-positional-numbers"]||void 0===this[St]()["parse-positional-numbers"])&&(e=this[Dt](e)),s&&(e=Oe(e,this,kt(this,Xe,"f").getMiddleware(),!1)),e}[tn](e={}){Et(this,rt,kt(this,rt,"f")||{},"f");const t={};t.local=kt(this,rt,"f").local||[],t.configObjects=kt(this,rt,"f").configObjects||[];const n={};t.local.forEach((t=>{n[t]=!0,(e[t]||[]).forEach((e=>{n[e]=!0}))})),Object.assign(kt(this,dt,"f"),Object.keys(kt(this,Ze,"f")).reduce(((e,t)=>{const s=kt(this,Ze,"f")[t].filter((e=>!(e in n)));return s.length>0&&(e[t]=s),e}),{})),Et(this,Ze,{},"f");return["array","boolean","string","skipValidation","count","normalize","number","hiddenOptions"].forEach((e=>{t[e]=(kt(this,rt,"f")[e]||[]).filter((e=>!n[e]))})),["narg","key","alias","default","defaultDescription","config","choices","demandedOptions","demandedCommands","deprecatedOptions"].forEach((e=>{t[e]=_e(kt(this,rt,"f")[e],(e=>!n[e]))})),t.envPrefix=kt(this,rt,"f").envPrefix,Et(this,rt,t,"f"),Et(this,bt,kt(this,bt,"f")?kt(this,bt,"f").reset(n):Se(this,kt(this,pt,"f")),"f"),Et(this,Ot,kt(this,Ot,"f")?kt(this,Ot,"f").reset(n):function(e,t,n){const s=n.y18n.__,i=n.y18n.__n,r={nonOptionCount:function(n){const s=e.getDemandedCommands(),r=n._.length+(n["--"]?n["--"].length:0)-e.getInternalMethods().getContext().commands.length;s._&&(r<s._.min||r>s._.max)&&(r<s._.min?void 0!==s._.minMsg?t.fail(s._.minMsg?s._.minMsg.replace(/\$0/g,r.toString()).replace(/\$1/,s._.min.toString()):null):t.fail(i("Not enough non-option arguments: got %s, need at least %s","Not enough non-option arguments: got %s, need at least %s",r,r.toString(),s._.min.toString())):r>s._.max&&(void 0!==s._.maxMsg?t.fail(s._.maxMsg?s._.maxMsg.replace(/\$0/g,r.toString()).replace(/\$1/,s._.max.toString()):null):t.fail(i("Too many non-option arguments: got %s, maximum of %s","Too many non-option arguments: got %s, maximum of %s",r,r.toString(),s._.max.toString()))))},positionalCount:function(e,n){n<e&&t.fail(i("Not enough non-option arguments: got %s, need at least %s","Not enough non-option arguments: got %s, need at least %s",n,n+"",e+""))},requiredArguments:function(e,n){let s=null;for(const t of Object.keys(n))Object.prototype.hasOwnProperty.call(e,t)&&void 0!==e[t]||(s=s||{},s[t]=n[t]);if(s){const e=[];for(const t of Object.keys(s)){const n=s[t];n&&e.indexOf(n)<0&&e.push(n)}const n=e.length?`\n${e.join("\n")}`:"";t.fail(i("Missing required argument: %s","Missing required arguments: %s",Object.keys(s).length,Object.keys(s).join(", ")+n))}},unknownArguments:function(n,s,o,a,c=!0){var l;const h=e.getInternalMethods().getCommandInstance().getCommands(),d=[],u=e.getInternalMethods().getContext();if(Object.keys(n).forEach((t=>{Re.includes(t)||Object.prototype.hasOwnProperty.call(o,t)||Object.prototype.hasOwnProperty.call(e.getInternalMethods().getParseContext(),t)||r.isValidAndSomeAliasIsNotNew(t,s)||d.push(t)})),c&&(u.commands.length>0||h.length>0||a)&&n._.slice(u.commands.length).forEach((e=>{h.includes(""+e)||d.push(""+e)})),c){const t=(null===(l=e.getDemandedCommands()._)||void 0===l?void 0:l.max)||0,s=u.commands.length+t;s<n._.length&&n._.slice(s).forEach((e=>{e=String(e),u.commands.includes(e)||d.includes(e)||d.push(e)}))}d.length&&t.fail(i("Unknown argument: %s","Unknown arguments: %s",d.length,d.map((e=>e.trim()?e:`"${e}"`)).join(", ")))},unknownCommands:function(n){const s=e.getInternalMethods().getCommandInstance().getCommands(),r=[],o=e.getInternalMethods().getContext();return(o.commands.length>0||s.length>0)&&n._.slice(o.commands.length).forEach((e=>{s.includes(""+e)||r.push(""+e)})),r.length>0&&(t.fail(i("Unknown command: %s","Unknown commands: %s",r.length,r.join(", "))),!0)},isValidAndSomeAliasIsNotNew:function(t,n){if(!Object.prototype.hasOwnProperty.call(n,t))return!1;const s=e.parsed.newAliases;return[t,...n[t]].some((e=>!Object.prototype.hasOwnProperty.call(s,e)||!s[t]))},limitedChoices:function(n){const i=e.getOptions(),r={};if(!Object.keys(i.choices).length)return;Object.keys(n).forEach((e=>{-1===Re.indexOf(e)&&Object.prototype.hasOwnProperty.call(i.choices,e)&&[].concat(n[e]).forEach((t=>{-1===i.choices[e].indexOf(t)&&void 0!==t&&(r[e]=(r[e]||[]).concat(t))}))}));const o=Object.keys(r);if(!o.length)return;let a=s("Invalid values:");o.forEach((e=>{a+=`\n ${s("Argument: %s, Given: %s, Choices: %s",e,t.stringifiedValues(r[e]),t.stringifiedValues(i.choices[e]))}`})),t.fail(a)}};let o={};function a(e,t){const n=Number(t);return"number"==typeof(t=isNaN(n)?t:n)?t=e._.length>=t:t.match(/^--no-.+/)?(t=t.match(/^--no-(.+)/)[1],t=!Object.prototype.hasOwnProperty.call(e,t)):t=Object.prototype.hasOwnProperty.call(e,t),t}r.implies=function(t,s){ye("<string|object> [array|number|string]",[t,s],arguments.length),"object"==typeof t?Object.keys(t).forEach((e=>{r.implies(e,t[e])})):(e.global(t),o[t]||(o[t]=[]),Array.isArray(s)?s.forEach((e=>r.implies(t,e))):(de(s,void 0,n),o[t].push(s)))},r.getImplied=function(){return o},r.implications=function(e){const n=[];if(Object.keys(o).forEach((t=>{const s=t;(o[t]||[]).forEach((t=>{let i=s;const r=t;i=a(e,i),t=a(e,t),i&&!t&&n.push(` ${s} -> ${r}`)}))})),n.length){let e=`${s("Implications failed:")}\n`;n.forEach((t=>{e+=t})),t.fail(e)}};let c={};r.conflicts=function(t,n){ye("<string|object> [array|string]",[t,n],arguments.length),"object"==typeof t?Object.keys(t).forEach((e=>{r.conflicts(e,t[e])})):(e.global(t),c[t]||(c[t]=[]),Array.isArray(n)?n.forEach((e=>r.conflicts(t,e))):c[t].push(n))},r.getConflicting=()=>c,r.conflicting=function(i){Object.keys(i).forEach((e=>{c[e]&&c[e].forEach((n=>{n&&void 0!==i[e]&&void 0!==i[n]&&t.fail(s("Arguments %s and %s are mutually exclusive",e,n))}))})),e.getInternalMethods().getParserConfiguration()["strip-dashed"]&&Object.keys(c).forEach((e=>{c[e].forEach((r=>{r&&void 0!==i[n.Parser.camelCase(e)]&&void 0!==i[n.Parser.camelCase(r)]&&t.fail(s("Arguments %s and %s are mutually exclusive",e,r))}))}))},r.recommendCommands=function(e,n){n=n.sort(((e,t)=>t.length-e.length));let i=null,r=1/0;for(let t,s=0;void 0!==(t=n[s]);s++){const n=Ie(e,t);n<=3&&n<r&&(r=n,i=t)}i&&t.fail(s("Did you mean %s?",i))},r.reset=function(e){return o=_e(o,(t=>!e[t])),c=_e(c,(t=>!e[t])),r};const l=[];return r.freeze=function(){l.push({implied:o,conflicting:c})},r.unfreeze=function(){const e=l.pop();de(e,void 0,n),({implied:o,conflicting:c}=e)},r}(this,kt(this,bt,"f"),kt(this,pt,"f")),"f"),Et(this,Be,kt(this,Be,"f")?kt(this,Be,"f").reset():function(e,t,n,s){return new Ae(e,t,n,s)}(kt(this,bt,"f"),kt(this,Ot,"f"),kt(this,Xe,"f"),kt(this,pt,"f")),"f"),kt(this,Ue,"f")||Et(this,Ue,function(e,t,n,s){return new De(e,t,n,s)}(this,kt(this,bt,"f"),kt(this,Be,"f"),kt(this,pt,"f")),"f"),kt(this,Xe,"f").reset(),Et(this,He,null,"f"),Et(this,it,"","f"),Et(this,qe,null,"f"),Et(this,et,!1,"f"),this.parsed=!1,this}[en](e,t){return kt(this,pt,"f").path.relative(e,t)}[nn](e,t,n,s=0,i=!1){let r=!!n||i;e=e||kt(this,ut,"f"),kt(this,rt,"f").__=kt(this,pt,"f").y18n.__,kt(this,rt,"f").configuration=this[St]();const o=!!kt(this,rt,"f").configuration["populate--"],a=Object.assign({},kt(this,rt,"f").configuration,{"populate--":!0}),c=kt(this,pt,"f").Parser.detailed(e,Object.assign({},kt(this,rt,"f"),{configuration:{"parse-positional-numbers":!1,...a}})),l=Object.assign(c.argv,kt(this,lt,"f"));let h;const d=c.aliases;let u=!1,f=!1;Object.keys(l).forEach((e=>{e===kt(this,tt,"f")&&l[e]?u=!0:e===kt(this,wt,"f")&&l[e]&&(f=!0)})),l.$0=this.$0,this.parsed=c,0===s&&kt(this,bt,"f").clearCachedHelpMessage();try{if(this[Nt](),t)return this[Zt](l,o,!!n,!1);if(kt(this,tt,"f")){[kt(this,tt,"f")].concat(d[kt(this,tt,"f")]||[]).filter((e=>e.length>1)).includes(""+l._[l._.length-1])&&(l._.pop(),u=!0)}Et(this,nt,!1,"f");const a=kt(this,Be,"f").getCommands(),p=kt(this,Ue,"f").completionKey in l,g=u||p||i;if(l._.length){if(a.length){let e;for(let t,r=s||0;void 0!==l._[r];r++){if(t=String(l._[r]),a.includes(t)&&t!==kt(this,He,"f")){const e=kt(this,Be,"f").runCommand(t,this,c,r+1,i,u||f||i);return this[Zt](e,o,!!n,!1)}if(!e&&t!==kt(this,He,"f")){e=t;break}}!kt(this,Be,"f").hasDefaultCommand()&&kt(this,ft,"f")&&e&&!g&&kt(this,Ot,"f").recommendCommands(e,a)}kt(this,He,"f")&&l._.includes(kt(this,He,"f"))&&!p&&(kt(this,Ke,"f")&&xe(!0),this.showCompletionScript(),this.exit(0))}if(kt(this,Be,"f").hasDefaultCommand()&&!g){const e=kt(this,Be,"f").runCommand(null,this,c,0,i,u||f||i);return this[Zt](e,o,!!n,!1)}if(p){kt(this,Ke,"f")&&xe(!0);const t=(e=[].concat(e)).slice(e.indexOf(`--${kt(this,Ue,"f").completionKey}`)+1);return kt(this,Ue,"f").getCompletion(t,((e,t)=>{if(e)throw new se(e.message);(t||[]).forEach((e=>{kt(this,st,"f").log(e)})),this.exit(0)})),this[Zt](l,!o,!!n,!1)}if(kt(this,et,"f")||(u?(kt(this,Ke,"f")&&xe(!0),r=!0,this.showHelp("log"),this.exit(0)):f&&(kt(this,Ke,"f")&&xe(!0),r=!0,kt(this,bt,"f").showVersion("log"),this.exit(0))),!r&&kt(this,rt,"f").skipValidation.length>0&&(r=Object.keys(l).some((e=>kt(this,rt,"f").skipValidation.indexOf(e)>=0&&!0===l[e]))),!r){if(c.error)throw new se(c.error.message);if(!p){const e=this[sn](d,{},c.error);n||(h=Oe(l,this,kt(this,Xe,"f").getMiddleware(),!0)),h=this[Vt](e,null!=h?h:l),pe(h)&&!n&&(h=h.then((()=>Oe(l,this,kt(this,Xe,"f").getMiddleware(),!1))))}}}catch(e){if(!(e instanceof se))throw e;kt(this,bt,"f").fail(e.message,e)}return this[Zt](null!=h?h:l,o,!!n,!0)}[sn](e,t,n,s){const i={...this.getDemandedOptions()};return r=>{if(n)throw new se(n.message);kt(this,Ot,"f").nonOptionCount(r),kt(this,Ot,"f").requiredArguments(r,i);let o=!1;kt(this,mt,"f")&&(o=kt(this,Ot,"f").unknownCommands(r)),kt(this,gt,"f")&&!o?kt(this,Ot,"f").unknownArguments(r,e,t,!!s):kt(this,yt,"f")&&kt(this,Ot,"f").unknownArguments(r,e,{},!1,!1),kt(this,Ot,"f").limitedChoices(r),kt(this,Ot,"f").implications(r),kt(this,Ot,"f").conflicting(r)}}[rn](){Et(this,et,!0,"f")}[on](e){if("string"==typeof e)kt(this,rt,"f").key[e]=!0;else for(const t of e)kt(this,rt,"f").key[t]=!0}}const cn=(ln=he,(e=[],t=ln.process.cwd(),n)=>{const s=new an(e,t,n,ln);return Object.defineProperty(s,"argv",{get:()=>s.parse(),enumerable:!0}),s.help(),s.version(),s});var ln;function hn(e){if(Object(e)!==e)throw TypeError("right-hand side of 'in' should be an object, got "+(null!==e?typeof e:"null"));return e}function dn(e,t,n){"symbol"==typeof t&&(t=(t=t.description)?"["+t+"]":"");try{Object.defineProperty(e,"name",{configurable:!0,value:n?n+" "+t:t})}catch(e){}return e}function un(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}const fn=process.argv[0].endsWith("/bun")||process.env.npm_execpath?.endsWith("/bun"),pn=fn?"bun --bun run":"node",gn=fn?"bun --bun run":"yarn";let mn;const yn=function({cacheDuration:e=Number.POSITIVE_INFINITY,caches:t,calcKey:n=(e=>function(e,t=0){const[n,s]=function(e,t=0){let n=3735928559^t,s=1103547991^t;for(let t,i=0;i<e.length;i++)t=e.codePointAt(i),n=Math.imul(n^t,2654435761),s=Math.imul(s^t,1597334677);return n=Math.imul(n^n>>>16,2246822507),n^=Math.imul(s^s>>>13,3266489909),s=Math.imul(s^s>>>16,2246822507),s^=Math.imul(n^n>>>13,3266489909),[s>>>0,n>>>0]}(e,t);return e.length.toString(36)+n.toString(36).padStart(7,"0")+s.toString(36).padStart(7,"0")}(JSON.stringify(e))),maxCachedArgsSize:s=100,maxCachedThisSize:i=10}={}){return function(r,o){if("getter"===o?.kind){const n=new Map;return t?.push(n),function(){const t=Date.now();if(n.has(this)){const[s,i]=n.get(this);if(t-i<=e)return s}const s=r.call(this);if(n.size>=i){const e=n.keys().next().value;n.delete(e)}return n.set(this,[s,t]),s}}{const a=new Map;return t?.push(a),function(...t){const c=n(t);let l=a.get(this);const h=Date.now();if(l){if(l.has(c)){const[t,n]=l.get(c);if(h-n<=e)return t}}else{if(l=new Map,a.size>=i){const e=a.keys().next().value;a.delete(e)}a.set(this,l)}const d=o?r.call(this,...t):r(...t);if(l.size>=s){const e=l.keys().next().value;l.delete(e)}return l.set(c,[d,h]),d}}}}({maxCachedThisSize:Number.MAX_SAFE_INTEGER,maxCachedArgsSize:1});class bn{static{[mn]=function(e,t,n,s,i,r){var o,a,c,l,h,d,u,f=Symbol.metadata||Symbol.for("Symbol.metadata"),p=Object.defineProperty,g=Object.create,m=[g(null),g(null)],y=t.length;function b(t,n,s){return function(i,r){n&&(r=i,i=e);for(var o=0;o<t.length;o++)r=t[o].apply(i,s?[r]:[]);return s?r:i}}function v(e,t,n,s){if("function"!=typeof e&&(s||void 0!==e))throw new TypeError(t+" must "+(n||"be")+" a function"+(s?"":" or undefined"));return e}function w(e,t,n,s,i,r,c,l,h,d,u){function f(e){if(!u(e))throw new TypeError("Attempted to access private element on non-instance")}var g=[].concat(t[0]),y=t[3],w=!c,O=1===i,E=3===i,k=4===i,A=2===i;function j(t,n,s){return function(i,r){return n&&(r=i,i=e),s&&s(i),$[t].call(i,r)}}if(!w){var $={},_=[],x=E?"get":k||O?"set":"value";if(h?(d||O?$={get:dn((function(){return y(this)}),s,"get"),set:function(e){t[4](this,e)}}:$[x]=y,d||dn($[x],s,A?"":x)):d||($=Object.getOwnPropertyDescriptor(e,s)),!d&&!h){if((a=m[+l][s])&&7!=(a^i))throw Error("Decorating two elements with the same name ("+$[x].name+") is not supported yet");m[+l][s]=i<3?1:i}}for(var C=e,S=g.length-1;S>=0;S-=n?2:1){var P=v(g[S],"A decorator","be",!0),N=n?g[S-1]:void 0,M={},D={kind:["field","accessor","method","getter","setter","class"][i],name:s,metadata:o,addInitializer:function(e,t){if(e.v)throw new TypeError("attempted to call addInitializer after decoration was finished");v(t,"An initializer","be",!0),r.push(t)}.bind(null,M)};if(w)a=P.call(N,C,D),M.v=1,v(a,"class decorators","return")&&(C=a);else if(D.static=l,D.private=h,a=D.access={has:h?u.bind():function(e){return s in e}},k||(a.get=h?A?function(e){return f(e),$.value}:j("get",0,f):function(e){return e[s]}),A||E||(a.set=h?j("set",0,f):function(e,t){e[s]=t}),C=P.call(N,O?{get:$.get,set:$.set}:$[x],D),M.v=1,O){if("object"==typeof C&&C)(a=v(C.get,"accessor.get"))&&($.get=a),(a=v(C.set,"accessor.set"))&&($.set=a),(a=v(C.init,"accessor.init"))&&_.unshift(a);else if(void 0!==C)throw new TypeError("accessor decorators must return an object with get, set, or init properties or undefined")}else v(C,(d?"field":"method")+" decorators","return")&&(d?_.unshift(C):$[x]=C)}return i<2&&c.push(b(_,l,1),b(r,l,0)),d||w||(h?O?c.splice(-1,0,j("get",l),j("set",l)):c.push(A?$[x]:v.call.bind($[x])):p(e,s,$)),C}function O(e){return p(e,f,{configurable:!0,enumerable:!0,value:o})}return o=g(null==o?null:o),h=[],d=function(e){e&&h.push(b(e))},u=function(t,s){for(var r=0;r<n.length;r++){var o=n[r],a=o[1],d=7&a;if((8&a)==t&&!d==s){var u=o[2],f=!!o[3],p=16&a;w(t?e:e.prototype,o,p,f?"#"+u:un(u),d,d<2?[]:t?l=l||[]:c=c||[],h,!!t,f,s,t&&f?function(t){return hn(t)===e}:i)}}},u(8,0),u(0,0),u(8,1),u(0,1),d(c),d(l),a=h,y||O(e),{e:a,get c(){var n=[];return y&&[O(e=w(e,[t],s,e.name,5,n)),b(n,1)]}}}(this,[],[[yn,3,"isBunAvailable"],[yn,3,"buildCommand"],[yn,3,"rootDirPath"],[yn,3,"dockerfile"],[yn,3,"hasDockerfile"],[yn,3,"hasSourceCode"],[yn,3,"name"],[yn,3,"dockerImageName"],[yn,3,"env"],[yn,3,"packageJson"],[yn,3,"hasPrisma"],[yn,3,"dockerPackageJson"],[yn,3,"binExists"]]).e}argv=void mn(this);pathByName=new Map;constructor(t,n,s){this._dirPath=e.resolve(t),this.argv=n,this.loadEnv=s}get isBunAvailable(){try{return/(^|\n)bun\s/.test(l.readFileSync(e.join(this.rootDirPath,".tool-versions"),"utf8"))}catch{return!1}}get buildCommand(){return fn?"true":this.packageJson.scripts?.build?.includes("buildIfNeeded")?"yarn build":"YARN wb buildIfNeeded "+(this.argv.verbose?"--verbose":"")}get dirPath(){return this._dirPath}get rootDirPath(){return l.existsSync(e.join(this.dirPath,"..","..","package.json"))?e.resolve(this.dirPath,"..",".."):this.dirPath}get dockerfile(){return l.readFileSync(this.findFile("Dockerfile"),"utf8")}get hasDockerfile(){try{return!!this.findFile("Dockerfile")}catch{return!1}}get hasSourceCode(){return l.existsSync(e.join(this.dirPath,"src"))}get name(){return this.packageJson.name||"unknown"}get dockerImageName(){return(this.packageJson.name||"unknown").replaceAll("@","").replaceAll("/","-")}get env(){return this.loadEnv?{...C(this.argv,this.dirPath),...process.env}:process.env}get packageJson(){return JSON.parse(l.readFileSync(e.join(this.dirPath,"package.json"),"utf8"))}get hasPrisma(){return!(!this.packageJson.dependencies?.prisma&&!this.packageJson.devDependencies?.prisma)}get dockerPackageJson(){return e.dirname(this.findFile("Dockerfile"))===this.dirPath?this.packageJson:JSON.parse(l.readFileSync(e.join(e.dirname(this.findFile("Dockerfile")),"package.json"),"utf8"))}get binExists(){let t=!1,n=this.dirPath;for(;;){const s=e.join(n,"node_modules",".bin");if(l.existsSync(s)&&(this.env.PATH=`${s}:${this.env.PATH}`,t=!0),l.existsSync(e.join(n,".git")))break;const i=e.dirname(n);if(n===i)break;n=i}return t}findFile(t){let n=this.pathByName.get(t);if(n)return n;if(n=[t,e.join("..","..",t)].map((t=>e.resolve(this.dirPath,t))).find((e=>l.existsSync(e))),!n)throw new Error(`File not found: ${t}`);return this.pathByName.set(t,n),n}}function vn(t,n=!0,s){if(s??=process.cwd(),l.existsSync(e.join(s,"package.json")))return new bn(s,t,n)}async function wn(t,n=!0,s){const i=function(t,n=!0,s){if(s??=process.cwd(),!l.existsSync(e.join(s,"package.json")))return;const i=new bn(s,t,n);let r=i;if(!i.packageJson.workspaces&&e.dirname(s).endsWith("/packages")){const i=e.resolve(s,"..","..");l.existsSync(e.join(i,"package.json"))&&(r=new bn(i,t,n))}return{root:r,self:i}}(t,n,s);if(i)return{...i,all:i.root===i.self?await On(t,i.root,n):[i.self]}}async function On(t,n,s){const i=[n],r=n.packageJson.workspaces;if(!Array.isArray(r))return i;const o=[],a=[];for(const t of r.map((t=>e.join(n.dirPath,t))))l.existsSync(t)?a.push(t):o.push(t);a.push(...await E(o,{dot:!0,onlyDirectories:!0}));for(const n of a)l.existsSync(e.join(n,"package.json"))&&i.push(new bn(n,t,s));return i}const En={command:"buildIfNeeded",describe:"Build code if changes are detected",builder:{command:{description:"A build command",type:"string",default:"yarn build",alias:"c"}},async handler(t){await async function(t,n){const s=await vn(t,!0,n);if(!s)return console.error(O.red("No project found.")),!0;if(!l.existsSync(e.join(s.rootDirPath,".git")))return kn(s,t),!0;const[i,r,o]=await async function(t,n){const s=e.resolve(t.dirPath,"node_modules",".cache","build"),i=e.resolve(s,"last-build");await l.promises.mkdir(s,{recursive:!0});const r=w("sha256"),o=y.execSync("git rev-parse HEAD",{cwd:t.dirPath}).toString().trim();r.update(o);const a=JSON.stringify(Object.entries(t.env).filter((([e])=>!An.has(e))).sort((([e],[t])=>e.localeCompare(t))));r.update(a),await async function(e,t,n){return new Promise((s=>{const i=y.spawnSync("git",["diff","--name-only"],{cwd:e.dirPath,env:e.env,stdio:"pipe",encoding:"utf8"}).stdout.trim().split("\n").map((t=>"test"===e.env.WB_ENV?t.replace(/packages\/scripts\/test-fixtures\/[^/]+\//,""):t)).filter((e=>(jn.some((t=>e.includes(t)))||$n.some((t=>e.endsWith(t))))&&!_n.some((t=>e.includes(t)))));t.verbose&&console.info(`Changed files: ${i.join(", ")}`);const r=y.spawn("git",["diff","--",...i],{cwd:e.rootDirPath});r.stdout?.on("data",(e=>{n.update(e),t.verbose&&(console.info(e.toString()),console.info("Hash:",n.copy().digest("hex")))})),r.on("close",(()=>{s()}))}))}(t,n,r);const c=r.digest("hex"),h=await async function(e){try{return await e()}catch(e){if("object"==typeof e&&e&&"code"in e&&"ENOENT"===e.code)return;throw e}}((()=>l.promises.readFile(i,"utf8")));return[h===c,i,c]}(s,t);if(i)return console.info(O.green(`Skip to run '${t.command}' 💫`)),!1;if(!kn(s,t))return;t.dryRun||await l.promises.writeFile(r,o,"utf8");return!0}(t)}};function kn(e,t){if(console.info(O.green(`Run '${t.command}'`)),!t.dryRun){const n=y.spawnSync(t.command??"",{cwd:e.dirPath,env:e.env,shell:!0,stdio:"inherit"});if(0!==n.status)return process.exitCode=n.status??1,!1}return!0}const An=new Set(["CI","PWDEBUG","TMPDIR"]);const jn=["src/","public/"],$n=[".js",".cjs",".mjs",".jsx",".ts",".cts",".mts",".tsx",".json",".browserslistrc","package.json","yarn.lock"],_n=["test/","tests/","__tests__/","test-fixtures/"];function*xn(e,t){for(const n of t)console.info(`Running "${e}" for ${n.name} ...`),yield n}const Cn={command:"optimizeForDockerBuild",describe:"Optimize configuration when building a Docker image",builder:{outside:{description:"Whether the optimization is executed outside a docker container or not",type:"boolean",alias:"o"}},async handler(t){const n=await wn(t);n||(console.error(O.red("No project found.")),process.exit(1));for(const s of xn("optimizeForDockerBuild",n.all)){const n=s.packageJson,i=["dependencies","devDependencies"];for(const e of i){const t=n[e]||{};for(const[e,n]of Object.entries(t))n?.startsWith("git@github.com:")&&(t[e]=`./${e}`)}if(Sn(t,n),Pn(n),Nn(n),t.dryRun)continue;const r=t.outside?e.join(s.dirPath,"dist"):s.dirPath;await l.promises.mkdir(r,{recursive:!0}),await l.promises.writeFile(e.join(r,"package.json"),JSON.stringify(n),"utf8")}t.dryRun||t.outside||y.spawnSync("yarn",{stdio:"inherit"})}};function Sn(e,t){if(!e.outside)return void delete t.devDependencies;const n=t.devDependencies||{},s=["artillery","concurrently","conventional-changelog-conventionalcommits","eslint","husky","imagemin","jest","kill-port","lint-staged","open-cli","playwright","prettier","pinst","sort-package-json","wait-on","semantic-release","vitest"];for(const t of Object.keys(n))(s.some((e=>t.includes(e)))||!e.outside&&t.includes("willbooster")&&t.includes("config"))&&delete n[t]}function Pn(e){const t=["check","deploy","format","lint","start","test"],n=["pinst ","husky "],s=e.scripts||{};for(const[e,i]of Object.entries(s))(t.some((t=>e.includes(t)))||n.some((e=>i.includes(e)||i.trim()===e.trim())))&&delete s[e]}function Nn(e){delete e.private,delete e.publishConfig,delete e.prettier}const Mn=new class{deploy(e){return"PRISMA migrate deploy"}deployForce(e,t){const n=e.packageJson.dependencies?.blitz?"db":"prisma";return`rm -Rf ${n}/mount/prod.sqlite3*; PRISMA migrate reset --force && rm -Rf ${n}/mount/prod.sqlite3*\n && litestream restore -o ${n}/mount/prod.sqlite3 ${t} && ALLOW_TO_SKIP_SEED=0 PRISMA migrate deploy`}litestream(e){return`${pn} -e '\nconst { PrismaClient } = require("@prisma/client");\nnew PrismaClient().$queryRaw\`PRAGMA journal_mode = WAL;\`\n .catch((error) => { console.log("Failed due to:", error); process.exit(1); });\n'`}migrate(e){return`PRISMA migrate deploy && PRISMA generate && ${this.seed(e)}`}migrateDev(e){return"PRISMA migrate dev"}reset(e){return`PRISMA migrate reset --force --skip-seed && ${this.seed(e)}`}restore(e,t,n){return`rm -Rf ${e.packageJson.dependencies?.blitz?"db":"prisma"}/restored.sqlite3; GOOGLE_APPLICATION_CREDENTIALS=gcp-sa-key.json litestream restore -o ${n} ${t}`}seed(e,t){return e.packageJson.dependencies?.blitz?"YARN blitz db seed"+(t?` -f ${t}`:""):t?"BUN build-ts run prisma/seeds.ts":e.packageJson.prisma?.seed?"YARN prisma db seed":'if [ -e "prisma/seeds.ts" ]; then BUN build-ts run prisma/seeds.ts; fi'}studio(t,n){let s="";if(n)try{new URL(n),s=`DATABASE_URL=${n} `}catch{const t=e.resolve(n);console.info(n,t),s=`DATABASE_URL=file://${t} `}return`${s}PRISMA studio`}},Dn=new Set;async function In(e){try{await A(e)}catch{}}const Rn=new j,Wn={exitIfFailed:!0};async function zn(e,t,n,s=Wn){const[i,r]=Fn(e,t);if(Bn(i,t),n.verbose&&Bn(r,t,"Start (raw)",!0),n.dryRun)return Ln(i,0,s),0;const o=r.match(/http-get:\/\/127.0.0.1:(\d+)/)?.[1];r.includes("wait-on")&&o&&!r.includes("docker run")&&await async function(e){await In(e);const t=async()=>{Dn.has(e)||(Dn.add(e),await In(e))};for(const e of["beforeExit","SIGINT","SIGTERM","SIGQUIT"])process.on(e,t)}(Number(o));const a=await M(r,void 0,{cwd:t.dirPath,env:t.env,shell:!0,stdio:"inherit",timeout:s?.timeout,killOnExit:!0,verbose:n.verbose});return Ln(i,a.status,s),a.status??1}function Tn(e,t,n,s=Wn){return Rn.run((async()=>{const[i,r]=Fn(e,t);if(Bn(i,t,"Start (parallel)",!0),n.dryRun)return Bn(i,t,"Started (log)"),n.verbose&&Bn(r,t,"Started (raw)",!0),void Ln(i,0,s);const o=await M(r,void 0,{cwd:t.dirPath,env:t.env,shell:!0,stdio:"pipe",timeout:s?.timeout,mergeOutAndError:!0,killOnExit:!0,verbose:n.verbose});Bn(i,t,"Started (log)"),n.verbose&&Bn(r,t,"Started (raw)",!0);const a=o.stdout.trim();a&&console.info(a),Ln(i,o.status,s)}))}function Fn(e,t){let n=e.replaceAll("\n","").replaceAll(/\s\s+/g," ").replaceAll("PRISMA ",t.packageJson.dependencies?.blitz?"YARN blitz prisma ":"YARN prisma ").replaceAll("BUN ",t.isBunAvailable?"bun --bun run ":"YARN ");return fn&&(n=n.replaceAll("build-ts run","bun --bun run").replaceAll("dist/index.js","src/index.ts").replaceAll(/(YARN )?vitest run/g,"bun test").replaceAll(" --color --passWithNoTests --allowOnly","")),n=n.trim(),[n.replaceAll("YARN ",`${gn} `),n.replaceAll("YARN ",!fn&&t.binExists?"":`${gn} `)]}function Bn(e,t,n="Start",s=!1){console.info("\n"+(s?O.gray:O.cyan)(O.bold(`${n}:`),e)+O.gray(` at ${t.dirPath}`))}function Ln(e,t,n){0===t?console.info(O.green(O.bold("Finished:"),e)):(console.info(O.red(O.bold(`Failed (exit code ${t}): `),e)),!1!==n.exitIfFailed&&process.exit(t??1))}const Vn={},Un={command:"prisma",describe:"Run prisma commands",builder:e=>e.command(Hn).command(qn).command(Jn).command(Gn).command(Kn).command(Qn).command(Xn).command(Zn).command(es).command(ts).demandCommand(),handler(){}},Hn={command:"deploy",describe:"Apply migration to DB without initializing it",builder:Vn,async handler(e){const t=await ns(e);for(const n of xn("prisma deploy",t))await zn(Mn.deploy(n),n,e)}},Yn={...Vn,"backup-path":{description:"Whether to skip actual command execution",demandOption:!0,type:"string",alias:"b"}},qn={command:"deploy-force <backup-path>",describe:"Force to apply migration to DB utilizing Litestream's backup without initializing it",builder:Yn,async handler(e){const t=await ns(e);for(const n of xn("prisma deploy-force",t))await zn(Mn.deployForce(n,e.backupPath),n,e)}},Jn={command:"litestream",describe:"Setup DB for Litestream",builder:Vn,async handler(e){const t=await ns(e);for(const n of xn("prisma litestream",t))await zn(Mn.litestream(n),n,e)}},Gn={command:"migrate",describe:"Apply migration to DB with initializing it",builder:Vn,async handler(e){const t=await ns(e);for(const n of xn("prisma migrate",t))await zn(Mn.migrate(n),n,e)}},Kn={command:"migrate-dev",describe:"Create a migration file",builder:Vn,async handler(e){const t=await ns(e);for(const n of xn("prisma migrate-dev",t))await zn(Mn.migrateDev(n),n,e)}},Qn={command:"reset",describe:"Reset DB",builder:Vn,async handler(e){const t=await ns(e);for(const n of xn("prisma reset",t))await zn(Mn.reset(n),n,e)}},Xn={command:"restore <backup-path>",describe:"Restore DB from Litestream's backup",builder:{...Yn,output:{description:'Output path of the restored database. Defaults to "<db|prisma>/restored.sqlite3".',type:"string"}},async handler(e){const t=await ns(e);for(const n of xn("prisma restore",t)){const t=e.output||(n.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3");await zn(Mn.restore(n,e.backupPath,t),n,e)}}},Zn={command:"seed",describe:"Populate DB with seed data",builder:{...Vn,file:{alias:"f",description:"Path of the seed script.",type:"string"}},async handler(e){const t=await ns(e);for(const n of xn("prisma seed",t))await zn(Mn.seed(n,e.file),n,e)}},es={command:"studio [db-url-or-path]",describe:"Open Prisma Studio",builder:{...Vn,"db-url-or-path":{description:"URL or path to the database",type:"string"},restored:{description:"Whether to open the default restored database (<db|prisma>/restored.sqlite3).",type:"boolean"}},async handler(e){if(e.restored&&e.dbUrlOrPath)throw new Error("You cannot specify both --restored and --db-url-or-path.");const t=await ns(e);for(const n of xn("prisma studio",t)){const t=e.restored?n.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3":e.dbUrlOrPath?.toString();await zn(Mn.studio(n,t),n,e)}}},ts={command:"$0 [args..]",describe:"Pass the command and arguments to prisma as is",builder:{args:{type:"array"}},async handler(e){const t=await ns(e),n=`${e.args?.join(" ")??""}`.trimEnd();for(const s of xn(`prisma ${n}`,t))await zn(`PRISMA ${n}`,s,e)}};async function ns(e){const t=await wn(e);t||(console.error(O.red("No project found.")),process.exit(1));const n=t.all.filter((e=>e.packageJson.dependencies?.prisma||e.packageJson.devDependencies?.prisma));return 0===n.length&&(console.error(O.red("No prisma project found.")),process.exit(1)),n}const ss={command:"retry [command] [args...]",describe:"Retry the given command until it succeeds",builder:{retry:{description:"A maximum retry count",type:"number",alias:"r",default:3}},async handler(e){const t=vn(e);t||(console.error(O.red("No project found.")),process.exit(1));const n=[e.command,...e.args??[],...e._.slice(1)].filter(Boolean);let s=0;for(let i=0;i<e.retry;i++)if(i>0&&console.info(`\n${O.yellow(`#${i} Retrying: ${n.join(" ")}`)}`),s=await zn(n.join(" "),t,e,{exitIfFailed:!1}),0===s)return;process.exit(s)}},is=["express","fastify","elysia"],rs={command:"setup",describe:"Setup development environment. .env files are ignored.",builder:{},async handler(e){await async function(e,t){const n=await wn(e,!1,t);n||(console.error(O.red("No project found.")),process.exit(1));for(const t of xn("setup",n.all)){const s=await _.readdir(t.dirPath,{withFileTypes:!0});if(t===n.root){if("darwin"===x.platform()){const n=["pstree"];t.hasDockerfile&&n.push("expect"),await Tn(`brew install ${n.join(" ")}`,t,e)}s.some((e=>e.isFile()&&e.name.includes("-version")))&&await zn("asdf install",t,e)}if(s.some((e=>e.isFile()&&"pyproject.toml"===e.name))){await Tn("poetry config virtualenvs.in-project true",t,e),await Tn("poetry config virtualenvs.prefer-active-python true",t,e);const[,n]=y.execSync("asdf current python").toString().trim().split(/\s+/);await Tn(`poetry env use ${n}`,t,e),await Rn.promiseAll(),await zn("poetry run pip install --upgrade pip",t,e),await zn("poetry install --ansi",t,e)}const i=t.packageJson.dependencies??{},r=t.packageJson.devDependencies||{},o=t.packageJson.scripts??{},a=[];let c=[];i.blitz||i.next||r["@remix-run/dev"]?(a.push("pm2"),c.push("concurrently","open-cli","vitest","wait-on")):is.some((e=>i[e]))&&(a.push("pm2"),c.push("concurrently","vitest","wait-on")),fn&&(c=c.filter((e=>"vitest"!==e))),a.length>0&&await zn(`yarn add ${a.join(" ")}`,t,e),c.length>0&&await zn(`yarn add -D ${c.join(" ")}`,t,e),o["gen-code"]&&await zn("yarn gen-code",t,e)}}(e)}};const os=new class{buildDevImage(t,n){const s=t.dockerPackageJson.scripts?.["docker/build/prepare"]?"yarn run docker/build/prepare && ":"";return`cd ${e.dirname(t.findFile("Dockerfile"))}\n && ${s}YARN wb optimizeForDockerBuild --outside\n && YARN wb retry -- docker build -t ${t.dockerImageName}\n --build-arg ARCH=$([ $(uname -m) = 'arm64' ] && echo arm64 || echo amd64)\n --build-arg WB_ENV=${t.env.WB_ENV}\n --build-arg WB_VERSION=${n} .`}stopAndStart(e,t=!1,n="",s=""){return`${this.stop(e)} && ${t?"unbuffer ":""}${this.start(e,n,s)}`}start(e,t="",n=""){return function(e,t){const n=async()=>{if(Dn.has(e))return;Dn.add(e),Bn(e,t);const{status:n}=v(e,{cwd:t.dirPath,shell:!0,stdio:"inherit"});Ln(e,n,{})};for(const e of["beforeExit","SIGINT","SIGTERM","SIGQUIT"])process.on(e,n)}(this.stop(e),e),`docker run --rm -it -p 8080:8080 --name ${e.dockerImageName} ${t} ${e.dockerImageName} ${n}`}stop(e){return`true $(docker rm -f $(docker container ls -q -f name=${e.dockerImageName}) 2> /dev/null)`}stopAll(){return"true $(docker rm -f $(docker ps -q) 2> /dev/null)"}};class as{constructor(e=Number(process.env.PORT)||3e3){this.defaultPort=e}buildDocker(e,t="development"){return os.buildDevImage(e,t)}startDocker(e,t){return`${this.buildDocker(e)}\n && YARN concurrently --raw --kill-others-on-fail\n "${os.stopAndStart(e,!1,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}"\n "${this.waitAndOpenApp(e,t,8080)}"`}testE2E(e,t,{playwrightArgs:n="test tests/e2e",prismaDirectory:s,startCommand:i}){const r=e.env.WB_ENV;return`WB_ENV=${r} NEXT_PUBLIC_WB_ENV=${r} APP_ENV=${r} PORT=8080 YARN concurrently --kill-others --raw --success first\n "rm -Rf ${s}/mount && ${i} && exit 1"\n "concurrently --kill-others-on-fail --raw 'wait-on -t 600000 -i 2000 http-get://127.0.0.1:8080' 'BUN playwright install --with-deps'\n && BUN playwright ${n.replace("tests/e2e",t.target||"tests/e2e")}"`}testE2EDev(e,t,{playwrightArgs:n="test tests/e2e",startCommand:s}){const i=e.env.WB_ENV;return`WB_ENV=${i} NEXT_PUBLIC_WB_ENV=${i} APP_ENV=${i} PORT=8080 YARN concurrently --kill-others --raw --success first\n "${s} && exit 1"\n "concurrently --kill-others-on-fail --raw 'wait-on -t 600000 -i 2000 http-get://127.0.0.1:8080' 'BUN playwright install --with-deps'\n && BUN playwright ${n.replace("tests/e2e",t.target||"tests/e2e")}"`}testUnit(e,t){return`WB_ENV=${e.env.WB_ENV} YARN vitest run ${t.target||"tests/unit"} --color --passWithNoTests --allowOnly`}waitApp(e,t,n=this.defaultPort){return`wait-on -t 10000 http-get://127.0.0.1:${n} 2> /dev/null\n || wait-on -t 10000 -i 500 http-get://127.0.0.1:${n} 2> /dev/null\n || wait-on -t 10000 -i 1000 http-get://127.0.0.1:${n} 2> /dev/null\n || wait-on -t 10000 -i 2000 http-get://127.0.0.1:${n} 2> /dev/null\n || wait-on -t 20000 -i 4000 http-get://127.0.0.1:${n} 2> /dev/null\n || wait-on -t 60000 -i 5000 http-get://127.0.0.1:${n}`}waitAndOpenApp(e,t,n=this.defaultPort){return`${this.waitApp(e,t,n)} || wait-on http-get://127.0.0.1:${n} && open-cli "http://\${HOST:-localhost}:${n}"`}}const cs=new class extends as{constructor(){super()}start(e,t){return`${e.env.WB_ENV?`APP_ENV=${e.env.WB_ENV} `:""}YARN concurrently --raw --kill-others-on-fail\n "blitz dev ${t.normalizedArgsText??""}"\n "${this.waitAndOpenApp(e,t)}"`}startProduction(e,t,n){return`${e.env.WB_ENV?`APP_ENV=${e.env.WB_ENV} `:""}NODE_ENV=production YARN concurrently --raw --kill-others-on-fail\n "${Mn.reset(e)} && ${e.buildCommand} && PORT=${n} pm2-runtime start ${e.findFile("ecosystem.config.cjs")} ${t.normalizedArgsText??""}"\n "${this.waitAndOpenApp(e,t,n)}"`}testE2E(e,t,{playwrightArgs:n,startCommand:s=`${Mn.reset(e)} && ${e.buildCommand} && pm2-runtime start ${e.findFile("ecosystem.config.cjs")}`}){return super.testE2E(e,t,{playwrightArgs:n,prismaDirectory:"db",startCommand:s})}testE2EDev(e,t,{playwrightArgs:n,startCommand:s="blitz dev -p 8080"}){return super.testE2EDev(e,t,{playwrightArgs:n,startCommand:s})}testStart(e,t){return`YARN concurrently --kill-others --raw --success first "blitz dev" "${this.waitApp(e,t)}"`}};const ls=new class extends as{constructor(){super()}start(e,t){return`YARN build-ts run src/index.ts ${t.watch?"--watch":""} -- ${t.normalizedArgsText??""}`}startDocker(e,t){return`${this.buildDocker(e)} && ${os.stopAndStart(e,!1,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}`}startProduction(e,t,n=8080){return`NODE_ENV=production ${e.buildCommand} && NODE_ENV=production PORT=\${PORT:-${n}} ${pn} dist/index.js ${t.normalizedArgsText??""}`}testE2E(e,t,{startCommand:n=`if [ -e "prisma" ]; then prisma migrate reset --force --skip-generate; fi && (${this.startProduction(e,t)})`}){return`NODE_ENV=production WB_ENV=${e.env.WB_ENV} PORT=8080 YARN concurrently --kill-others --raw --success first\n "${n} && exit 1"\n "wait-on -t 600000 -i 2000 http-get://127.0.0.1:8080 && vitest run ${t.target||"tests/e2e"} --color --passWithNoTests --allowOnly"`}testE2EDev(e,t,{startCommand:n}){return`NODE_ENV=production WB_ENV=${e.env.WB_ENV} PORT=8080 YARN concurrently --kill-others --raw --success first\n "${n||this.start(e,t)} && exit 1"\n "wait-on -t 600000 -i 2000 http-get://127.0.0.1:8080 && vitest run ${t.target||"tests/e2e"} --color --passWithNoTests --allowOnly"`}testStart(e,t){return`YARN concurrently --kill-others --raw --success first "${this.start(e,t)}" "${this.waitApp(e,t)}"`}};const hs=new class extends as{constructor(){super()}start(e,t){return`YARN concurrently --raw --kill-others-on-fail\n "next dev --turbo ${t.normalizedArgsText??""}"\n "${this.waitAndOpenApp(e,t)}"`}startProduction(e,t,n){return`NODE_ENV=production YARN concurrently --raw --kill-others-on-fail\n "${[...e.hasPrisma?[Mn.reset(e)]:[],e.buildCommand,`PORT=${n} pm2-runtime start ${e.findFile("ecosystem.config.cjs")} ${t.normalizedArgsText??""}`].join(" && ")}"\n "${this.waitAndOpenApp(e,t,n)}"`}testE2E(e,t,n){return super.testE2E(e,t,{playwrightArgs:n.playwrightArgs,prismaDirectory:"db",startCommand:n.startCommand??[...e.hasPrisma?[Mn.reset(e)]:[],e.buildCommand,`pm2-runtime start ${e.findFile("ecosystem.config.cjs")}`].join(" && ")})}testE2EDev(e,t,{startCommand:n="next dev --turbo -p 8080"}){return super.testE2EDev(e,t,{startCommand:n})}testStart(e,t){return`YARN concurrently --kill-others --raw --success first "next dev --turbo" "${this.waitApp(e,t)}"`}};const ds=new class extends as{constructor(){super()}start(e,t){return`YARN build-ts run src/index.ts ${t.watch?"--watch":""} -- ${t.normalizedArgsText??""}`}startDocker(e,t){return`${this.buildDocker(e)} && ${os.stopAndStart(e,!1,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}`}startProduction(e,t){return`NODE_ENV=production ${e.buildCommand} && NODE_ENV=production ${pn} dist/index.js ${t.normalizedArgsText??""}`}testE2E(){return"echo 'do nothing.'"}testE2EDev(){return"echo 'do nothing.'"}testStart(){return"echo 'do nothing.'"}};const us=new class extends as{constructor(){super()}start(e,t){return`YARN concurrently --raw --kill-others-on-fail\n "remix dev ${t.normalizedArgsText??""}"\n "${this.waitAndOpenApp(e,t)}"`}startProduction(e,t,n){return`NODE_ENV=production YARN concurrently --raw --kill-others-on-fail\n "${Mn.reset(e)} && ${e.buildCommand} && PORT=${n} pm2-runtime start ${e.findFile("ecosystem.config.cjs")} ${t.normalizedArgsText??""}"\n "${this.waitAndOpenApp(e,t,n)}"`}testE2E(e,t,{playwrightArgs:n,startCommand:s=`${Mn.reset(e)} && ${e.buildCommand} && pm2-runtime start ${e.findFile("ecosystem.config.cjs")}`}){return super.testE2E(e,t,{playwrightArgs:n,prismaDirectory:"prisma",startCommand:s})}testE2EDev(e,t,{playwrightArgs:n,startCommand:s="remix dev"}){return super.testE2EDev(e,t,{playwrightArgs:n,startCommand:s})}testStart(e,t){return`YARN concurrently --kill-others --raw --success first "remix dev" "${this.waitApp(e,t)}"`}},fs={command:"start [args..]",describe:"Start app",builder:{watch:{description:"Whether to watch files",type:"boolean"},args:{description:"Arguments for core command",type:"array",alias:"a",default:[]},"docker-options":{description:'Arguments for "docker run"',type:"array",default:[]},mode:{description:"Start mode: dev[elopment] (default) | staging | docker | docker-debug",type:"string",alias:"m"}},async handler(e){!function(e){e.normalizedArgsText=[...e.args??[],...e._?.slice(1)??[]].map((e=>`'${e}'`)).join(" "),e.normalizedDockerOptionsText=(e.dockerOptions??[]).map((e=>`'${e}'`)).join(" ")}(e);const t=await wn(e);t||(console.error(O.red("No project found.")),process.exit(1));for(const n of t.all){const t=n.packageJson.dependencies||{},s=n.packageJson.devDependencies||{};let i;if(t.blitz)i=cs;else if(t.next)i=hs;else if(s["@remix-run/dev"])i=us;else if(is.some((e=>t[e]))&&!t["firebase-functions"]||n.hasDockerfile&&/EXPOSE\s+8080/.test(n.dockerfile))i=ls;else{if(!t["build-ts"]&&!s["build-ts"])continue;i=ds}switch(console.info(`Running "start" for ${n.name} ...`),e.mode||"dev"){case"dev":case"development":{const s=ps(t,"development");await zn(`${s}${i.start(n,e)}`,n,e);break}case"staging":{const s=ps(t,"staging");await zn(`${s}${i.startProduction(n,e,8080)}`,n,e);break}case"docker":{const s=ps(t,"staging");await zn(`${s}${i.startDocker(n,e)}`,n,e);break}case"docker-debug":{const s=ps(t,"staging");e.normalizedArgsText="'/bin/bash'",await zn(`${s}${i.startDocker(n,e)}`,n,e);break}default:throw new Error(`Unknown start mode: ${e.mode}`)}}}};function ps(e,t){process.env.WB_ENV||=t;let n=`WB_ENV=${process.env.WB_ENV} `;return e.next&&(process.env.NEXT_PUBLIC_WB_ENV=process.env.WB_ENV,n+=`NEXT_PUBLIC_WB_ENV=${process.env.WB_ENV} `),n}const gs={command:"test",describe:"Test project",builder:{ci:{description:"Whether to run tests on CI",type:"boolean"},e2e:{description:"Whether to run e2e tests. You may pass mode as argument: none | headless (default) | headless-dev | headed | headed-dev | docker | docker-debug | debug | generate | trace",type:"string"},start:{description:"Whether to run start tests",type:"boolean"},unit:{description:"Whether to run unit tests",type:"boolean"},"unit-timeout":{description:"Timeout for unit tests",type:"number"},target:{description:"Test target",type:"string",alias:"t"}},async handler(t){await async function(t){const n=await wn(t);n||(console.error(O.red("No project found.")),process.exit(1));n.all.length>1&&(process.env.CI="1");process.env.FORCE_COLOR||="3",process.env.WB_ENV||="test";for(const s of n.all){const n=s.packageJson.dependencies||{},i=s.packageJson.devDependencies||{};let r;r=n.blitz?cs:n.next?hs:i["@remix-run/dev"]?us:is.some((e=>n[e]))&&!n["firebase-functions"]?ls:ds,console.info(`Running "test" for ${s.name} ...`);const o=[];if(!t.ci){switch((t.unit||!t.start&&void 0===t.e2e)&&o.push(zn(r.testUnit(s,t),s,t,{timeout:t.unitTimeout})),t.start&&o.push(zn(r.testStart(s,t),s,t)),await Promise.all(o),t.e2e){case void 0:case"none":continue;case"":case"headless":await zn(r.testE2E(s,t,{}),s,t);continue;case"headless-dev":await zn(r.testE2EDev(s,t,{}),s,t);continue;case"docker":await ms(s,t,r);continue;case"docker-debug":await ms(s,t,r,`test ${t.target||"tests/e2e"} --debug`);continue}if(n.blitz||n.next||i["@remix-run/dev"])switch(t.e2e){case"headed":await zn(r.testE2E(s,t,{playwrightArgs:`test ${t.target||"tests/e2e"} --headed`}),s,t);continue;case"headed-dev":await zn(r.testE2EDev(s,t,{playwrightArgs:`test ${t.target||"tests/e2e"} --headed`}),s,t);continue;case"debug":await zn(r.testE2E(s,t,{playwrightArgs:`test ${t.target||"tests/e2e"} --debug`}),s,t);continue;case"generate":await zn(r.testE2E(s,t,{playwrightArgs:"codegen http://localhost:8080"}),s,t);continue;case"trace":await zn("BUN playwright show-trace",s,t);continue}throw new Error(`Unknown e2e mode: ${t.e2e}`)}{const n=N(e.join(s.dirPath,"tests","unit")),i=N(e.join(s.dirPath,"tests","e2e"));if(await Tn(os.stopAll(),s,t),!1!==t.unit&&await n&&await Tn(r.testUnit(s,t).replaceAll(" --allowOnly",""),s,t,{timeout:t.unitTimeout}),!1!==t.start&&await Tn(r.testStart(s,t),s,t),await Rn.promiseAll(),"none"!==t.e2e&&await i){s.hasDockerfile&&await zn(`${r.buildDocker(s,"test")}`,s,t);const e=s.hasDockerfile?{startCommand:os.stopAndStart(s,!0)}:{};process.exitCode=await zn(r.testE2E(s,t,e).replaceAll(" --allowOnly",""),s,t,{exitIfFailed:!1}),await zn(os.stop(s),s,t)}}}}(t)}};async function ms(e,t,n,s){await zn(`${n.buildDocker(e,"test")}`,e,t),process.exitCode=await zn(`${n.testE2E(e,t,{playwrightArgs:s,startCommand:os.stopAndStart(e,!0)})}`,e,t,{exitIfFailed:!1}),await zn(os.stop(e),e,t)}const ys={command:"typecheck",describe:"Run type checking. .env files are ignored.",builder:{},async handler(e){const t=await wn(e,!1);t||(console.error(O.red("No project found.")),process.exit(1));for(const n of t.all){const s=[];if(n.packageJson.workspaces?n.hasSourceCode&&(n.packageJson.dependencies?.typescript||n.packageJson.devDependencies?.typescript)&&s.push("BUN tsc --noEmit --Pretty"):((n.packageJson.dependencies?.typescript||n.packageJson.devDependencies?.typescript)&&s.push("BUN tsc --noEmit --Pretty"),n.packageJson.devDependencies?.pyright&&s.push("YARN pyright")),0===s.length)continue;console.info(`Running "typecheck" for ${n.name} ...`),t.all.length>1&&(n.env.CI="1"),n.env.FORCE_COLOR||="3";if(0!==await zn(s.join(" && "),n,e)){(JSON.parse(await _.readFile("package.json","utf8")).dependencies||{}).blitz&&console.info(O.yellow('Please try "yarn gen-code" if you face unknown type errors.'))}}}},bs={...ys,command:"tc"},vs={env:{description:".env files to be loaded.",type:"array"},"cascade-env":{description:"Environment to load cascading .env files (e.g., `.env`, `.env.<environment>`, `.env.local` and `.env.<environment>.local`). Preferred over `cascade-node-env` and `auto-cascade-env`.",type:"string"},"cascade-node-env":{description:'Same with --cascade-env=<NODE_ENV || "development">. Preferred over `auto-cascade-env`.',type:"boolean"},"auto-cascade-env":{description:'Same with --cascade-env=<WB_ENV || NODE_ENV || "development">.',type:"boolean",default:!0},"include-root-env":{description:"Include .env files in root directory if the project is in a monorepo and --env option is not used.",type:"boolean",default:!0},"check-env":{description:"Check whether the keys of the loaded .env files are same with the given .env file.",type:"string",default:".env.example"},verbose:{description:"Whether to show verbose information",type:"boolean",alias:"v"},"working-dir":{description:"A working directory",type:"string",alias:"w"},"dry-run":{description:"Whether to skip actual command execution",type:"boolean",alias:"d"}};var ws;await cn((ws=process.argv,ws.slice(ne()+1))).scriptName("wb").options(vs).middleware((t=>{const n=t["working-dir"];if(n){const t=e.resolve(n);process.chdir(t)}!function(e){e.PATH&&e.BERRY_BIN_FOLDER&&(e.PATH=e.PATH.replace(`${e.BERRY_BIN_FOLDER}:`,"").replaceAll(/\/private\/var\/folders\/[^:]+:/g,"").replaceAll(/\/var\/tmp\/[^:]+:/g,"").replaceAll(/\/tmp\/[^:]+:/g,""));for(const t of Object.keys(e)){const n=t.toUpperCase();(n.startsWith("NPM_")||n.startsWith("YARN_")||n.startsWith("BERRY_")||"PROJECT_CWD"===n||"INIT_CWD"===n)&&delete e[t]}}(process.env)})).command(En).command(Cn).command(Un).command(ss).command(rs).command(fs).command(gs).command(ys).command(bs).demandCommand().strict().help().argv;for(const e of["SIGINT","SIGTERM","SIGQUIT"])process.on(e,(()=>process.exit()));
|
|
34
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvZW52LnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9leGlzdHMudHMiLCIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL3NwYXduLnRzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NsaXVpL2J1aWxkL2xpYi9pbmRleC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jbGl1aS9idWlsZC9saWIvc3RyaW5nLXV0aWxzLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhcmdzLXBhcnNlci9idWlsZC9saWIvc3RyaW5nLXV0aWxzLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhcmdzLXBhcnNlci9idWlsZC9saWIveWFyZ3MtcGFyc2VyLXR5cGVzLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhcmdzLXBhcnNlci9idWlsZC9saWIveWFyZ3MtcGFyc2VyLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhcmdzLXBhcnNlci9idWlsZC9saWIvaW5kZXguanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFyZ3MtcGFyc2VyL2J1aWxkL2xpYi90b2tlbml6ZS1hcmctc3RyaW5nLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhcmdzL2J1aWxkL2xpYi91dGlscy9wcm9jZXNzLWFyZ3YuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFyZ3MvYnVpbGQvbGliL3llcnJvci5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95MThuL2J1aWxkL2xpYi9wbGF0Zm9ybS1zaGltcy9ub2RlLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3kxOG4vYnVpbGQvbGliL2luZGV4LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3kxOG4vaW5kZXgubWpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhcmdzL2xpYi9wbGF0Zm9ybS1zaGltcy9lc20ubWpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NsaXVpL2luZGV4Lm1qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9lc2NhbGFkZS9zeW5jL2luZGV4Lm1qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YXJncy9idWlsZC9saWIvdHlwaW5ncy9jb21tb24tdHlwZXMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFyZ3MvYnVpbGQvbGliL3V0aWxzL2lzLXByb21pc2UuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFyZ3MvYnVpbGQvbGliL3BhcnNlLWNvbW1hbmQuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFyZ3MvYnVpbGQvbGliL2FyZ3NlcnQuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFyZ3MvYnVpbGQvbGliL21pZGRsZXdhcmUuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFyZ3MvYnVpbGQvbGliL3V0aWxzL21heWJlLWFzeW5jLXJlc3VsdC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YXJncy9idWlsZC9saWIvY29tbWFuZC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YXJncy9idWlsZC9saWIveWFyZ3MtZmFjdG9yeS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YXJncy9idWlsZC9saWIvdXRpbHMvd2hpY2gtbW9kdWxlLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhcmdzL2J1aWxkL2xpYi91dGlscy9vYmotZmlsdGVyLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhcmdzL2J1aWxkL2xpYi91dGlscy9zZXQtYmxvY2tpbmcuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFyZ3MvYnVpbGQvbGliL3VzYWdlLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhcmdzL2J1aWxkL2xpYi9jb21wbGV0aW9uLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhcmdzL2J1aWxkL2xpYi9jb21wbGV0aW9uLXRlbXBsYXRlcy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YXJncy9idWlsZC9saWIvdXRpbHMvbGV2ZW5zaHRlaW4uanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFyZ3MvYnVpbGQvbGliL3ZhbGlkYXRpb24uanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFyZ3MvYnVpbGQvbGliL3V0aWxzL2FwcGx5LWV4dGVuZHMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFyZ3MvaW5kZXgubWpzIiwiLi4vc3JjL3V0aWxzL3J1bnRpbWUudHMiLCIuLi9zcmMvcHJvamVjdC50cyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvbWVtb2l6ZS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvaGFzaC5qcyIsIi4uL3NyYy9jb21tYW5kcy9idWlsZElmTmVlZGVkLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi9zcmMvZXJyb3IudHMiLCIuLi9zcmMvY29tbWFuZHMvY29tbWFuZFV0aWxzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL29wdGltaXplRm9yRG9ja2VyQnVpbGQudHMiLCIuLi9zcmMvc2NyaXB0cy9wcmlzbWFTY3JpcHRzLnRzIiwiLi4vc3JjL3V0aWxzL3Byb2Nlc3MudHMiLCIuLi9zcmMvdXRpbHMvcHJvbWlzZVBvb2wudHMiLCIuLi9zcmMvc2NyaXB0cy9ydW4udHMiLCIuLi9zcmMvY29tbWFuZHMvcHJpc21hLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3JldHJ5LnRzIiwiLi4vc3JjL2NvbW1hbmRzL2NvbnN0YW50cy50cyIsIi4uL3NyYy9jb21tYW5kcy9zZXR1cC50cyIsIi4uL3NyYy9zY3JpcHRzL2RvY2tlclNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vYmxpdHpTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL2h0dHBTZXJ2ZXJTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL25leHRTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL3BsYWluQXBwU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9yZW1peFNjcmlwdHMudHMiLCIuLi9zcmMvY29tbWFuZHMvc3RhcnQudHMiLCIuLi9zcmMvc2NyaXB0cy9idWlsZGVyLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3Rlc3QudHMiLCIuLi9zcmMvY29tbWFuZHMvdHlwZWNoZWNrLnRzIiwiLi4vc3JjL3NoYXJlZE9wdGlvbnNCdWlsZGVyLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gJ2RvdGVudic7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuZXhwb3J0IGNvbnN0IHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYgPSB7XG4gIGVudjoge1xuICAgIGRlc2NyaXB0aW9uOiAnLmVudiBmaWxlcyB0byBiZSBsb2FkZWQuJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxuICAnY2FzY2FkZS1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnRW52aXJvbm1lbnQgdG8gbG9hZCBjYXNjYWRpbmcgLmVudiBmaWxlcyAoZS5nLiwgYC5lbnZgLCBgLmVudi48ZW52aXJvbm1lbnQ+YCwgYC5lbnYubG9jYWxgIGFuZCBgLmVudi48ZW52aXJvbm1lbnQ+LmxvY2FsYCkuIFByZWZlcnJlZCBvdmVyIGBjYXNjYWRlLW5vZGUtZW52YCBhbmQgYGF1dG8tY2FzY2FkZS1lbnZgLicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG4gICdjYXNjYWRlLW5vZGUtZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnU2FtZSB3aXRoIC0tY2FzY2FkZS1lbnY9PE5PREVfRU5WIHx8IFwiZGV2ZWxvcG1lbnRcIj4uIFByZWZlcnJlZCBvdmVyIGBhdXRvLWNhc2NhZGUtZW52YC4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgJ2F1dG8tY2FzY2FkZS1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdTYW1lIHdpdGggLS1jYXNjYWRlLWVudj08V0JfRU5WIHx8IE5PREVfRU5WIHx8IFwiZGV2ZWxvcG1lbnRcIj4uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgfSxcbiAgJ2luY2x1ZGUtcm9vdC1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdJbmNsdWRlIC5lbnYgZmlsZXMgaW4gcm9vdCBkaXJlY3RvcnkgaWYgdGhlIHByb2plY3QgaXMgaW4gYSBtb25vcmVwbyBhbmQgLS1lbnYgb3B0aW9uIGlzIG5vdCB1c2VkLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gIH0sXG4gICdjaGVjay1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdDaGVjayB3aGV0aGVyIHRoZSBrZXlzIG9mIHRoZSBsb2FkZWQgLmVudiBmaWxlcyBhcmUgc2FtZSB3aXRoIHRoZSBnaXZlbiAuZW52IGZpbGUuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBkZWZhdWx0OiAnLmVudi5leGFtcGxlJyxcbiAgfSxcbiAgdmVyYm9zZToge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBzaG93IHZlcmJvc2UgaW5mb3JtYXRpb24nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBhbGlhczogJ3YnLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgRW52UmVhZGVyT3B0aW9ucyA9IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnY+Pj47XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiByZWFkcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBgLmVudmAgZmlsZXMuIE5vdGUgaXQgZG9lcyBub3QgYXNzaWduIHRoZW0gaW4gYHByb2Nlc3MuZW52YC5cbiAqICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZEVudmlyb25tZW50VmFyaWFibGVzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBjd2Q6IHN0cmluZyxcbiAgY2FjaGVFbmFibGVkID0gdHJ1ZVxuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGxldCBlbnZQYXRocyA9IChhcmd2LmVudiA/PyBbXSkubWFwKChlbnZQYXRoKSA9PiBwYXRoLnJlc29sdmUoY3dkLCBlbnZQYXRoLnRvU3RyaW5nKCkpKTtcbiAgY29uc3QgY2FzY2FkZSA9XG4gICAgYXJndi5jYXNjYWRlRW52ID8/XG4gICAgKGFyZ3YuY2FzY2FkZU5vZGVFbnZcbiAgICAgID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgfHwgJ2RldmVsb3BtZW50J1xuICAgICAgOiBhcmd2LmF1dG9DYXNjYWRlRW52XG4gICAgICAgID8gcHJvY2Vzcy5lbnYuV0JfRU5WIHx8IHByb2Nlc3MuZW52Lk5PREVfRU5WIHx8ICdkZXZlbG9wbWVudCdcbiAgICAgICAgOiB1bmRlZmluZWQpO1xuICBpZiAodHlwZW9mIGNhc2NhZGUgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKGVudlBhdGhzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZW52UGF0aHMucHVzaChwYXRoLmpvaW4oY3dkLCAnLmVudicpKTtcbiAgICAgIGlmIChhcmd2LmluY2x1ZGVSb290RW52KSB7XG4gICAgICAgIGNvbnN0IHJvb3RQYXRoID0gcGF0aC5yZXNvbHZlKGN3ZCwgJy4uJywgJy4uJyk7XG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihyb290UGF0aCwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgICAgICAgIGVudlBhdGhzLnB1c2gocGF0aC5qb2luKHJvb3RQYXRoLCAnLmVudicpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBlbnZQYXRocyA9IGVudlBhdGhzLmZsYXRNYXAoKGVudlBhdGgpID0+XG4gICAgICBjYXNjYWRlXG4gICAgICAgID8gW2Ake2VudlBhdGh9LiR7Y2FzY2FkZX0ubG9jYWxgLCBgJHtlbnZQYXRofS5sb2NhbGAsIGAke2VudlBhdGh9LiR7Y2FzY2FkZX1gLCBlbnZQYXRoXVxuICAgICAgICA6IFtgJHtlbnZQYXRofS5sb2NhbGAsIGVudlBhdGhdXG4gICAgKTtcbiAgfVxuICBlbnZQYXRocyA9IGVudlBhdGhzLm1hcCgoZW52UGF0aCkgPT4gcGF0aC5yZWxhdGl2ZShjd2QsIGVudlBhdGgpKTtcbiAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgIGNvbnNvbGUuaW5mbyhgV0JfRU5WOiAke3Byb2Nlc3MuZW52LldCX0VOVn0sIE5PREVfRU5WOiAke3Byb2Nlc3MuZW52Lk5PREVfRU5WfWApO1xuICAgIGNvbnNvbGUuaW5mbygnUmVhZGluZyBlbnYgZmlsZXM6JywgZW52UGF0aHMpO1xuICB9XG5cbiAgbGV0IGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgY29uc3Qgb3JnRW52VmFycyA9IHsgLi4ucHJvY2Vzcy5lbnYgfTtcbiAgZm9yIChjb25zdCBlbnZQYXRoIG9mIGVudlBhdGhzKSB7XG4gICAgZW52VmFycyA9IHsgLi4ucmVhZEVudkZpbGUocGF0aC5qb2luKGN3ZCwgZW52UGF0aCksIGNhY2hlRW5hYmxlZCksIC4uLmVudlZhcnMgfTtcbiAgICBsZXQgY291bnQgPSAwO1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGVudlZhcnMpKSB7XG4gICAgICBpZiAob3JnRW52VmFyc1trZXldICE9PSB2YWx1ZSkge1xuICAgICAgICBvcmdFbnZWYXJzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgY291bnQrKztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNvdW50ID4gMCkge1xuICAgICAgY29uc29sZS5pbmZvKGBSZWFkICR7Y291bnR9IGVudmlyb25tZW50IHZhcmlhYmxlczpgLCBlbnZQYXRoKTtcbiAgICB9XG4gIH1cblxuICBpZiAoYXJndi5jaGVja0Vudikge1xuICAgIGNvbnN0IGV4YW1wbGVLZXlzID0gT2JqZWN0LmtleXMocmVhZEVudkZpbGUocGF0aC5qb2luKGN3ZCwgYXJndi5jaGVja0VudiksIGNhY2hlRW5hYmxlZCkgfHwge30pO1xuICAgIGNvbnN0IG1pc3NpbmdLZXlzID0gZXhhbXBsZUtleXMuZmlsdGVyKChrZXkpID0+ICEoa2V5IGluIGVudlZhcnMpKTtcbiAgICBpZiAobWlzc2luZ0tleXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBbJHtlbnZQYXRocy5qb2luKCcsICcpfV06IFske21pc3NpbmdLZXlzLmpvaW4oJywgJyl9XWApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZW52VmFycztcbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHJlYWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gYC5lbnZgIGZpbGVzIGFuZCBhc3NpZ24gdGhlbSBpbiBgcHJvY2Vzcy5lbnZgLlxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkQW5kQXBwbHlFbnZpcm9ubWVudFZhcmlhYmxlcyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgY3dkOiBzdHJpbmcsXG4gIGNhY2hlRW5hYmxlZCA9IHRydWVcbik6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBlbnZWYXJzID0gcmVhZEVudmlyb25tZW50VmFyaWFibGVzKGFyZ3YsIGN3ZCwgY2FjaGVFbmFibGVkKTtcbiAgT2JqZWN0LmFzc2lnbihwcm9jZXNzLmVudiwgZW52VmFycyk7XG4gIHJldHVybiBlbnZWYXJzO1xufVxuXG5jb25zdCBjYWNoZWRFbnZWYXJzID0gbmV3IE1hcDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KCk7XG5cbmZ1bmN0aW9uIHJlYWRFbnZGaWxlKGZpbGVQYXRoOiBzdHJpbmcsIGNhY2hlRW5hYmxlZCA9IHRydWUpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgY2FjaGVkID0gY2FjaGVFbmFibGVkICYmIGNhY2hlZEVudlZhcnMuZ2V0KGZpbGVQYXRoKTtcbiAgaWYgKGNhY2hlZCkgcmV0dXJuIGNhY2hlZDtcblxuICBjb25zdCBwYXJzZWQgPSBjb25maWcoeyBwYXRoOiBwYXRoLnJlc29sdmUoZmlsZVBhdGgpLCBwcm9jZXNzRW52OiB7fSB9KS5wYXJzZWQgPz8ge307XG4gIGlmIChjYWNoZUVuYWJsZWQpIHtcbiAgICBjYWNoZWRFbnZWYXJzLnNldChmaWxlUGF0aCwgcGFyc2VkKTtcbiAgfVxuICByZXR1cm4gcGFyc2VkO1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmVtb3ZlcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgcmVsYXRlZCB0byBucG0gYW5kIHlhcm4gZnJvbSB0aGUgZ2l2ZW4gZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMoZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPik6IHZvaWQge1xuICAvLyBSZW1vdmUgbnBtICYgeWFybiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBwcm9jZXNzLmVudlxuICBpZiAoZW52VmFycy5QQVRIICYmIGVudlZhcnMuQkVSUllfQklOX0ZPTERFUikge1xuICAgIGVudlZhcnMuUEFUSCA9IGVudlZhcnMuUEFUSC5yZXBsYWNlKGAke2VudlZhcnMuQkVSUllfQklOX0ZPTERFUn06YCwgJycpXG4gICAgICAvLyBUZW1wb3JhcnkgZGlyZWN0b3J5IGluIG1hY09TXG4gICAgICAucmVwbGFjZUFsbCgvXFwvcHJpdmF0ZVxcL3ZhclxcL2ZvbGRlcnNcXC9bXjpdKzovZywgJycpXG4gICAgICAvLyBUZW1wb3JhcnkgZGlyZWN0b3JpZXMgaW4gTGludXhcbiAgICAgIC5yZXBsYWNlQWxsKC9cXC92YXJcXC90bXBcXC9bXjpdKzovZywgJycpXG4gICAgICAucmVwbGFjZUFsbCgvXFwvdG1wXFwvW146XSs6L2csICcnKTtcbiAgfVxuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhlbnZWYXJzKSkge1xuICAgIGNvbnN0IHVwcGVyS2V5ID0ga2V5LnRvVXBwZXJDYXNlKCk7XG4gICAgaWYgKFxuICAgICAgdXBwZXJLZXkuc3RhcnRzV2l0aCgnTlBNXycpIHx8XG4gICAgICB1cHBlcktleS5zdGFydHNXaXRoKCdZQVJOXycpIHx8XG4gICAgICB1cHBlcktleS5zdGFydHNXaXRoKCdCRVJSWV8nKSB8fFxuICAgICAgdXBwZXJLZXkgPT09ICdQUk9KRUNUX0NXRCcgfHxcbiAgICAgIHVwcGVyS2V5ID09PSAnSU5JVF9DV0QnXG4gICAgKSB7XG4gICAgICBkZWxldGUgZW52VmFyc1trZXldO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZXhpc3RzQXN5bmMoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBmcy5hY2Nlc3MoZmlsZVBhdGgsIGZzLmNvbnN0YW50cy5GX09LLCAoZXJyKSA9PiB7XG4gICAgICByZXNvbHZlKCFlcnIpO1xuICAgIH0pO1xuICB9KTtcbn1cbiIsImltcG9ydCB0eXBlIHtcbiAgU3Bhd25PcHRpb25zLFxuICBTcGF3bk9wdGlvbnNXaXRob3V0U3RkaW8sXG4gIFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlLFxuICBTcGF3blN5bmNSZXR1cm5zLFxuICBTdGRpb051bGwsXG4gIFN0ZGlvUGlwZSxcbn0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB7IHNwYXduIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHRyZWVLaWxsIGZyb20gJ3RyZWUta2lsbCc7XG5cbmV4cG9ydCB0eXBlIFNwYXduQXN5bmNSZXR1cm5zID0gT21pdDxTcGF3blN5bmNSZXR1cm5zPHN0cmluZz4sICdvdXRwdXQnIHwgJ2Vycm9yJz47XG5cbmV4cG9ydCB0eXBlIFNwYXduQXN5bmNPcHRpb25zID0gKFxuICB8IFNwYXduT3B0aW9uc1dpdGhvdXRTdGRpb1xuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvUGlwZSwgU3RkaW9QaXBlLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9QaXBlLCBTdGRpb1BpcGUsIFN0ZGlvTnVsbD5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb1BpcGUsIFN0ZGlvTnVsbCwgU3RkaW9QaXBlPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvTnVsbCwgU3RkaW9QaXBlLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9QaXBlLCBTdGRpb051bGwsIFN0ZGlvTnVsbD5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb051bGwsIFN0ZGlvUGlwZSwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvTnVsbCwgU3RkaW9OdWxsLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9OdWxsLCBTdGRpb051bGwsIFN0ZGlvTnVsbD5cbiAgfCBTcGF3bk9wdGlvbnNcbikgJiB7XG4gIGlucHV0Pzogc3RyaW5nO1xuICBtZXJnZU91dEFuZEVycm9yPzogYm9vbGVhbjtcbiAga2lsbE9uRXhpdD86IGJvb2xlYW47XG4gIHZlcmJvc2U/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNwYXduQXN5bmMoXG4gIGNvbW1hbmQ6IHN0cmluZyxcbiAgYXJncz86IFJlYWRvbmx5QXJyYXk8c3RyaW5nPixcbiAgb3B0aW9ucz86IFNwYXduQXN5bmNPcHRpb25zXG4pOiBQcm9taXNlPFNwYXduQXN5bmNSZXR1cm5zPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHByb2MgPSBzcGF3bihjb21tYW5kLCBhcmdzID8/IFtdLCBvcHRpb25zID8/IHt9KTtcbiAgICAgIC8vIGBzZXRFbmNvZGluZ2AgaXMgdW5kZWZpbmVkIGluIEJ1blxuICAgICAgcHJvYy5zdGRvdXQ/LnNldEVuY29kaW5nPy4oJ3V0ZjgnKTtcbiAgICAgIHByb2Muc3RkZXJyPy5zZXRFbmNvZGluZz8uKCd1dGY4Jyk7XG5cbiAgICAgIGxldCBzdGRvdXQgPSAnJztcbiAgICAgIGxldCBzdGRlcnIgPSAnJztcbiAgICAgIHByb2Muc3Rkb3V0Py5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgICAgIHN0ZG91dCArPSBkYXRhO1xuICAgICAgfSk7XG4gICAgICBwcm9jLnN0ZGVycj8ub24oJ2RhdGEnLCAoZGF0YSkgPT4ge1xuICAgICAgICBpZiAob3B0aW9ucz8ubWVyZ2VPdXRBbmRFcnJvcikge1xuICAgICAgICAgIHN0ZG91dCArPSBkYXRhO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0ZGVyciArPSBkYXRhO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgbGV0IHN0b3BwZWQgPSBmYWxzZTtcbiAgICAgIGNvbnN0IHN0b3BQcm9jZXNzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAoc3RvcHBlZCB8fCAhcHJvYy5waWQpIHJldHVybjtcblxuICAgICAgICBzdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKG9wdGlvbnM/LnZlcmJvc2UpIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oYHRyZWVLaWxsKCR7cHJvYy5waWR9KWApO1xuICAgICAgICB9XG4gICAgICAgIHRyZWVLaWxsKHByb2MucGlkKTtcbiAgICAgIH07XG4gICAgICBpZiAob3B0aW9ucz8ua2lsbE9uRXhpdCkge1xuICAgICAgICBwcm9jZXNzLm9uKCdiZWZvcmVFeGl0Jywgc3RvcFByb2Nlc3MpO1xuICAgICAgICBwcm9jZXNzLm9uKCdTSUdJTlQnLCBzdG9wUHJvY2Vzcyk7XG4gICAgICB9XG5cbiAgICAgIHByb2Mub24oJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ2JlZm9yZUV4aXQnLCBzdG9wUHJvY2Vzcyk7XG4gICAgICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ1NJR0lOVCcsIHN0b3BQcm9jZXNzKTtcbiAgICAgICAgcHJvYy5yZW1vdmVBbGxMaXN0ZW5lcnMoJ2Nsb3NlJyk7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9KTtcbiAgICAgIHByb2Mub24oJ2Nsb3NlJywgKGNvZGU6IG51bWJlciB8IG51bGwsIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCBudWxsKSA9PiB7XG4gICAgICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ2JlZm9yZUV4aXQnLCBzdG9wUHJvY2Vzcyk7XG4gICAgICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ1NJR0lOVCcsIHN0b3BQcm9jZXNzKTtcbiAgICAgICAgaWYgKHByb2MucGlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdQcm9jZXNzIGhhcyBubyBwaWQuJykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgcGlkOiBwcm9jLnBpZCxcbiAgICAgICAgICAgIHN0ZG91dCxcbiAgICAgICAgICAgIHN0ZGVycixcbiAgICAgICAgICAgIHN0YXR1czogY29kZSxcbiAgICAgICAgICAgIHNpZ25hbCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmIChvcHRpb25zPy5pbnB1dCkge1xuICAgICAgICBwcm9jLnN0ZGluPy53cml0ZShvcHRpb25zLmlucHV0KTtcbiAgICAgICAgcHJvYy5zdGRpbj8uZW5kKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJlamVjdChlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcbmNvbnN0IGFsaWduID0ge1xuICAgIHJpZ2h0OiBhbGlnblJpZ2h0LFxuICAgIGNlbnRlcjogYWxpZ25DZW50ZXJcbn07XG5jb25zdCB0b3AgPSAwO1xuY29uc3QgcmlnaHQgPSAxO1xuY29uc3QgYm90dG9tID0gMjtcbmNvbnN0IGxlZnQgPSAzO1xuZXhwb3J0IGNsYXNzIFVJIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdGhpcy53aWR0aCA9IG9wdHMud2lkdGg7XG4gICAgICAgIHRoaXMud3JhcCA9IChfYSA9IG9wdHMud3JhcCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdHJ1ZTtcbiAgICAgICAgdGhpcy5yb3dzID0gW107XG4gICAgfVxuICAgIHNwYW4oLi4uYXJncykge1xuICAgICAgICBjb25zdCBjb2xzID0gdGhpcy5kaXYoLi4uYXJncyk7XG4gICAgICAgIGNvbHMuc3BhbiA9IHRydWU7XG4gICAgfVxuICAgIHJlc2V0T3V0cHV0KCkge1xuICAgICAgICB0aGlzLnJvd3MgPSBbXTtcbiAgICB9XG4gICAgZGl2KC4uLmFyZ3MpIHtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmRpdignJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMud3JhcCAmJiB0aGlzLnNob3VsZEFwcGx5TGF5b3V0RFNMKC4uLmFyZ3MpICYmIHR5cGVvZiBhcmdzWzBdID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXBwbHlMYXlvdXREU0woYXJnc1swXSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29scyA9IGFyZ3MubWFwKGFyZyA9PiB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGFyZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb2xGcm9tU3RyaW5nKGFyZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXJnO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5yb3dzLnB1c2goY29scyk7XG4gICAgICAgIHJldHVybiBjb2xzO1xuICAgIH1cbiAgICBzaG91bGRBcHBseUxheW91dERTTCguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiBhcmdzLmxlbmd0aCA9PT0gMSAmJiB0eXBlb2YgYXJnc1swXSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgICAgIC9bXFx0XFxuXS8udGVzdChhcmdzWzBdKTtcbiAgICB9XG4gICAgYXBwbHlMYXlvdXREU0woc3RyKSB7XG4gICAgICAgIGNvbnN0IHJvd3MgPSBzdHIuc3BsaXQoJ1xcbicpLm1hcChyb3cgPT4gcm93LnNwbGl0KCdcXHQnKSk7XG4gICAgICAgIGxldCBsZWZ0Q29sdW1uV2lkdGggPSAwO1xuICAgICAgICAvLyBzaW1wbGUgaGV1cmlzdGljIGZvciBsYXlvdXQsIG1ha2Ugc3VyZSB0aGVcbiAgICAgICAgLy8gc2Vjb25kIGNvbHVtbiBsaW5lcyB1cCBhbG9uZyB0aGUgbGVmdC1oYW5kLlxuICAgICAgICAvLyBkb24ndCBhbGxvdyB0aGUgZmlyc3QgY29sdW1uIHRvIHRha2UgdXAgbW9yZVxuICAgICAgICAvLyB0aGFuIDUwJSBvZiB0aGUgc2NyZWVuLlxuICAgICAgICByb3dzLmZvckVhY2goY29sdW1ucyA9PiB7XG4gICAgICAgICAgICBpZiAoY29sdW1ucy5sZW5ndGggPiAxICYmIG1peGluLnN0cmluZ1dpZHRoKGNvbHVtbnNbMF0pID4gbGVmdENvbHVtbldpZHRoKSB7XG4gICAgICAgICAgICAgICAgbGVmdENvbHVtbldpZHRoID0gTWF0aC5taW4oTWF0aC5mbG9vcih0aGlzLndpZHRoICogMC41KSwgbWl4aW4uc3RyaW5nV2lkdGgoY29sdW1uc1swXSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgLy8gZ2VuZXJhdGUgYSB0YWJsZTpcbiAgICAgICAgLy8gIHJlcGxhY2luZyAnICcgd2l0aCBwYWRkaW5nIGNhbGN1bGF0aW9ucy5cbiAgICAgICAgLy8gIHVzaW5nIHRoZSBhbGdvcml0aG1pY2FsbHkgZ2VuZXJhdGVkIHdpZHRoLlxuICAgICAgICByb3dzLmZvckVhY2goY29sdW1ucyA9PiB7XG4gICAgICAgICAgICB0aGlzLmRpdiguLi5jb2x1bW5zLm1hcCgociwgaSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHRleHQ6IHIudHJpbSgpLFxuICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiB0aGlzLm1lYXN1cmVQYWRkaW5nKHIpLFxuICAgICAgICAgICAgICAgICAgICB3aWR0aDogKGkgPT09IDAgJiYgY29sdW1ucy5sZW5ndGggPiAxKSA/IGxlZnRDb2x1bW5XaWR0aCA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5yb3dzW3RoaXMucm93cy5sZW5ndGggLSAxXTtcbiAgICB9XG4gICAgY29sRnJvbVN0cmluZyh0ZXh0KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0ZXh0LFxuICAgICAgICAgICAgcGFkZGluZzogdGhpcy5tZWFzdXJlUGFkZGluZyh0ZXh0KVxuICAgICAgICB9O1xuICAgIH1cbiAgICBtZWFzdXJlUGFkZGluZyhzdHIpIHtcbiAgICAgICAgLy8gbWVhc3VyZSBwYWRkaW5nIHdpdGhvdXQgYW5zaSBlc2NhcGUgY29kZXNcbiAgICAgICAgY29uc3Qgbm9BbnNpID0gbWl4aW4uc3RyaXBBbnNpKHN0cik7XG4gICAgICAgIHJldHVybiBbMCwgbm9BbnNpLm1hdGNoKC9cXHMqJC8pWzBdLmxlbmd0aCwgMCwgbm9BbnNpLm1hdGNoKC9eXFxzKi8pWzBdLmxlbmd0aF07XG4gICAgfVxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICBjb25zdCBsaW5lcyA9IFtdO1xuICAgICAgICB0aGlzLnJvd3MuZm9yRWFjaChyb3cgPT4ge1xuICAgICAgICAgICAgdGhpcy5yb3dUb1N0cmluZyhyb3csIGxpbmVzKTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGRvbid0IGRpc3BsYXkgYW55IGxpbmVzIHdpdGggdGhlXG4gICAgICAgIC8vIGhpZGRlbiBmbGFnIHNldC5cbiAgICAgICAgcmV0dXJuIGxpbmVzXG4gICAgICAgICAgICAuZmlsdGVyKGxpbmUgPT4gIWxpbmUuaGlkZGVuKVxuICAgICAgICAgICAgLm1hcChsaW5lID0+IGxpbmUudGV4dClcbiAgICAgICAgICAgIC5qb2luKCdcXG4nKTtcbiAgICB9XG4gICAgcm93VG9TdHJpbmcocm93LCBsaW5lcykge1xuICAgICAgICB0aGlzLnJhc3Rlcml6ZShyb3cpLmZvckVhY2goKHJyb3csIHIpID0+IHtcbiAgICAgICAgICAgIGxldCBzdHIgPSAnJztcbiAgICAgICAgICAgIHJyb3cuZm9yRWFjaCgoY29sLCBjKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyB3aWR0aCB9ID0gcm93W2NdOyAvLyB0aGUgd2lkdGggd2l0aCBwYWRkaW5nLlxuICAgICAgICAgICAgICAgIGNvbnN0IHdyYXBXaWR0aCA9IHRoaXMubmVnYXRlUGFkZGluZyhyb3dbY10pOyAvLyB0aGUgd2lkdGggd2l0aG91dCBwYWRkaW5nLlxuICAgICAgICAgICAgICAgIGxldCB0cyA9IGNvbDsgLy8gdGVtcG9yYXJ5IHN0cmluZyB1c2VkIGR1cmluZyBhbGlnbm1lbnQvcGFkZGluZy5cbiAgICAgICAgICAgICAgICBpZiAod3JhcFdpZHRoID4gbWl4aW4uc3RyaW5nV2lkdGgoY29sKSkge1xuICAgICAgICAgICAgICAgICAgICB0cyArPSAnICcucmVwZWF0KHdyYXBXaWR0aCAtIG1peGluLnN0cmluZ1dpZHRoKGNvbCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBhbGlnbiB0aGUgc3RyaW5nIHdpdGhpbiBpdHMgY29sdW1uLlxuICAgICAgICAgICAgICAgIGlmIChyb3dbY10uYWxpZ24gJiYgcm93W2NdLmFsaWduICE9PSAnbGVmdCcgJiYgdGhpcy53cmFwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZuID0gYWxpZ25bcm93W2NdLmFsaWduXTtcbiAgICAgICAgICAgICAgICAgICAgdHMgPSBmbih0cywgd3JhcFdpZHRoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1peGluLnN0cmluZ1dpZHRoKHRzKSA8IHdyYXBXaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHMgKz0gJyAnLnJlcGVhdCgod2lkdGggfHwgMCkgLSBtaXhpbi5zdHJpbmdXaWR0aCh0cykgLSAxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBhcHBseSBib3JkZXIgYW5kIHBhZGRpbmcgdG8gc3RyaW5nLlxuICAgICAgICAgICAgICAgIGNvbnN0IHBhZGRpbmcgPSByb3dbY10ucGFkZGluZyB8fCBbMCwgMCwgMCwgMF07XG4gICAgICAgICAgICAgICAgaWYgKHBhZGRpbmdbbGVmdF0pIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyICs9ICcgJy5yZXBlYXQocGFkZGluZ1tsZWZ0XSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN0ciArPSBhZGRCb3JkZXIocm93W2NdLCB0cywgJ3wgJyk7XG4gICAgICAgICAgICAgICAgc3RyICs9IHRzO1xuICAgICAgICAgICAgICAgIHN0ciArPSBhZGRCb3JkZXIocm93W2NdLCB0cywgJyB8Jyk7XG4gICAgICAgICAgICAgICAgaWYgKHBhZGRpbmdbcmlnaHRdKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0ciArPSAnICcucmVwZWF0KHBhZGRpbmdbcmlnaHRdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gaWYgcHJpb3Igcm93IGlzIHNwYW4sIHRyeSB0byByZW5kZXIgdGhlXG4gICAgICAgICAgICAgICAgLy8gY3VycmVudCByb3cgb24gdGhlIHByaW9yIGxpbmUuXG4gICAgICAgICAgICAgICAgaWYgKHIgPT09IDAgJiYgbGluZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBzdHIgPSB0aGlzLnJlbmRlcklubGluZShzdHIsIGxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIHJlbW92ZSB0cmFpbGluZyB3aGl0ZXNwYWNlLlxuICAgICAgICAgICAgbGluZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgdGV4dDogc3RyLnJlcGxhY2UoLyArJC8sICcnKSxcbiAgICAgICAgICAgICAgICBzcGFuOiByb3cuc3BhblxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbGluZXM7XG4gICAgfVxuICAgIC8vIGlmIHRoZSBmdWxsICdzb3VyY2UnIGNhbiByZW5kZXIgaW5cbiAgICAvLyB0aGUgdGFyZ2V0IGxpbmUsIGRvIHNvLlxuICAgIHJlbmRlcklubGluZShzb3VyY2UsIHByZXZpb3VzTGluZSkge1xuICAgICAgICBjb25zdCBtYXRjaCA9IHNvdXJjZS5tYXRjaCgvXiAqLyk7XG4gICAgICAgIGNvbnN0IGxlYWRpbmdXaGl0ZXNwYWNlID0gbWF0Y2ggPyBtYXRjaFswXS5sZW5ndGggOiAwO1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBwcmV2aW91c0xpbmUudGV4dDtcbiAgICAgICAgY29uc3QgdGFyZ2V0VGV4dFdpZHRoID0gbWl4aW4uc3RyaW5nV2lkdGgodGFyZ2V0LnRyaW1SaWdodCgpKTtcbiAgICAgICAgaWYgKCFwcmV2aW91c0xpbmUuc3Bhbikge1xuICAgICAgICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBpZiB3ZSdyZSBub3QgYXBwbHlpbmcgd3JhcHBpbmcgbG9naWMsXG4gICAgICAgIC8vIGp1c3QgYWx3YXlzIGFwcGVuZCB0byB0aGUgc3Bhbi5cbiAgICAgICAgaWYgKCF0aGlzLndyYXApIHtcbiAgICAgICAgICAgIHByZXZpb3VzTGluZS5oaWRkZW4gPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIHRhcmdldCArIHNvdXJjZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGVhZGluZ1doaXRlc3BhY2UgPCB0YXJnZXRUZXh0V2lkdGgpIHtcbiAgICAgICAgICAgIHJldHVybiBzb3VyY2U7XG4gICAgICAgIH1cbiAgICAgICAgcHJldmlvdXNMaW5lLmhpZGRlbiA9IHRydWU7XG4gICAgICAgIHJldHVybiB0YXJnZXQudHJpbVJpZ2h0KCkgKyAnICcucmVwZWF0KGxlYWRpbmdXaGl0ZXNwYWNlIC0gdGFyZ2V0VGV4dFdpZHRoKSArIHNvdXJjZS50cmltTGVmdCgpO1xuICAgIH1cbiAgICByYXN0ZXJpemUocm93KSB7XG4gICAgICAgIGNvbnN0IHJyb3dzID0gW107XG4gICAgICAgIGNvbnN0IHdpZHRocyA9IHRoaXMuY29sdW1uV2lkdGhzKHJvdyk7XG4gICAgICAgIGxldCB3cmFwcGVkO1xuICAgICAgICAvLyB3b3JkIHdyYXAgYWxsIGNvbHVtbnMsIGFuZCBjcmVhdGVcbiAgICAgICAgLy8gYSBkYXRhLXN0cnVjdHVyZSB0aGF0IGlzIGVhc3kgdG8gcmFzdGVyaXplLlxuICAgICAgICByb3cuZm9yRWFjaCgoY29sLCBjKSA9PiB7XG4gICAgICAgICAgICAvLyBsZWF2ZSByb29tIGZvciBsZWZ0IGFuZCByaWdodCBwYWRkaW5nLlxuICAgICAgICAgICAgY29sLndpZHRoID0gd2lkdGhzW2NdO1xuICAgICAgICAgICAgaWYgKHRoaXMud3JhcCkge1xuICAgICAgICAgICAgICAgIHdyYXBwZWQgPSBtaXhpbi53cmFwKGNvbC50ZXh0LCB0aGlzLm5lZ2F0ZVBhZGRpbmcoY29sKSwgeyBoYXJkOiB0cnVlIH0pLnNwbGl0KCdcXG4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHdyYXBwZWQgPSBjb2wudGV4dC5zcGxpdCgnXFxuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY29sLmJvcmRlcikge1xuICAgICAgICAgICAgICAgIHdyYXBwZWQudW5zaGlmdCgnLicgKyAnLScucmVwZWF0KHRoaXMubmVnYXRlUGFkZGluZyhjb2wpICsgMikgKyAnLicpO1xuICAgICAgICAgICAgICAgIHdyYXBwZWQucHVzaChcIidcIiArICctJy5yZXBlYXQodGhpcy5uZWdhdGVQYWRkaW5nKGNvbCkgKyAyKSArIFwiJ1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGFkZCB0b3AgYW5kIGJvdHRvbSBwYWRkaW5nLlxuICAgICAgICAgICAgaWYgKGNvbC5wYWRkaW5nKSB7XG4gICAgICAgICAgICAgICAgd3JhcHBlZC51bnNoaWZ0KC4uLm5ldyBBcnJheShjb2wucGFkZGluZ1t0b3BdIHx8IDApLmZpbGwoJycpKTtcbiAgICAgICAgICAgICAgICB3cmFwcGVkLnB1c2goLi4ubmV3IEFycmF5KGNvbC5wYWRkaW5nW2JvdHRvbV0gfHwgMCkuZmlsbCgnJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd3JhcHBlZC5mb3JFYWNoKChzdHIsIHIpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXJyb3dzW3JdKSB7XG4gICAgICAgICAgICAgICAgICAgIHJyb3dzLnB1c2goW10pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBycm93ID0gcnJvd3Nbcl07XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJyb3dbaV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcnJvdy5wdXNoKCcnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBycm93LnB1c2goc3RyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJyb3dzO1xuICAgIH1cbiAgICBuZWdhdGVQYWRkaW5nKGNvbCkge1xuICAgICAgICBsZXQgd3JhcFdpZHRoID0gY29sLndpZHRoIHx8IDA7XG4gICAgICAgIGlmIChjb2wucGFkZGluZykge1xuICAgICAgICAgICAgd3JhcFdpZHRoIC09IChjb2wucGFkZGluZ1tsZWZ0XSB8fCAwKSArIChjb2wucGFkZGluZ1tyaWdodF0gfHwgMCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbC5ib3JkZXIpIHtcbiAgICAgICAgICAgIHdyYXBXaWR0aCAtPSA0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cmFwV2lkdGg7XG4gICAgfVxuICAgIGNvbHVtbldpZHRocyhyb3cpIHtcbiAgICAgICAgaWYgKCF0aGlzLndyYXApIHtcbiAgICAgICAgICAgIHJldHVybiByb3cubWFwKGNvbCA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbC53aWR0aCB8fCBtaXhpbi5zdHJpbmdXaWR0aChjb2wudGV4dCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgdW5zZXQgPSByb3cubGVuZ3RoO1xuICAgICAgICBsZXQgcmVtYWluaW5nV2lkdGggPSB0aGlzLndpZHRoO1xuICAgICAgICAvLyBjb2x1bW4gd2lkdGhzIGNhbiBiZSBzZXQgaW4gY29uZmlnLlxuICAgICAgICBjb25zdCB3aWR0aHMgPSByb3cubWFwKGNvbCA9PiB7XG4gICAgICAgICAgICBpZiAoY29sLndpZHRoKSB7XG4gICAgICAgICAgICAgICAgdW5zZXQtLTtcbiAgICAgICAgICAgICAgICByZW1haW5pbmdXaWR0aCAtPSBjb2wud2lkdGg7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbC53aWR0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBhbnkgdW5zZXQgd2lkdGhzIHNob3VsZCBiZSBjYWxjdWxhdGVkLlxuICAgICAgICBjb25zdCB1bnNldFdpZHRoID0gdW5zZXQgPyBNYXRoLmZsb29yKHJlbWFpbmluZ1dpZHRoIC8gdW5zZXQpIDogMDtcbiAgICAgICAgcmV0dXJuIHdpZHRocy5tYXAoKHcsIGkpID0+IHtcbiAgICAgICAgICAgIGlmICh3ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5tYXgodW5zZXRXaWR0aCwgX21pbldpZHRoKHJvd1tpXSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHc7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGFkZEJvcmRlcihjb2wsIHRzLCBzdHlsZSkge1xuICAgIGlmIChjb2wuYm9yZGVyKSB7XG4gICAgICAgIGlmICgvWy4nXS0rWy4nXS8udGVzdCh0cykpIHtcbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHMudHJpbSgpLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHN0eWxlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnICAnO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG59XG4vLyBjYWxjdWxhdGVzIHRoZSBtaW5pbXVtIHdpZHRoIG9mXG4vLyBhIGNvbHVtbiwgYmFzZWQgb24gcGFkZGluZyBwcmVmZXJlbmNlcy5cbmZ1bmN0aW9uIF9taW5XaWR0aChjb2wpIHtcbiAgICBjb25zdCBwYWRkaW5nID0gY29sLnBhZGRpbmcgfHwgW107XG4gICAgY29uc3QgbWluV2lkdGggPSAxICsgKHBhZGRpbmdbbGVmdF0gfHwgMCkgKyAocGFkZGluZ1tyaWdodF0gfHwgMCk7XG4gICAgaWYgKGNvbC5ib3JkZXIpIHtcbiAgICAgICAgcmV0dXJuIG1pbldpZHRoICsgNDtcbiAgICB9XG4gICAgcmV0dXJuIG1pbldpZHRoO1xufVxuZnVuY3Rpb24gZ2V0V2luZG93V2lkdGgoKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQ6IGRlcGVuZHMgb24gdGVybWluYWwgKi9cbiAgICBpZiAodHlwZW9mIHByb2Nlc3MgPT09ICdvYmplY3QnICYmIHByb2Nlc3Muc3Rkb3V0ICYmIHByb2Nlc3Muc3Rkb3V0LmNvbHVtbnMpIHtcbiAgICAgICAgcmV0dXJuIHByb2Nlc3Muc3Rkb3V0LmNvbHVtbnM7XG4gICAgfVxuICAgIHJldHVybiA4MDtcbn1cbmZ1bmN0aW9uIGFsaWduUmlnaHQoc3RyLCB3aWR0aCkge1xuICAgIHN0ciA9IHN0ci50cmltKCk7XG4gICAgY29uc3Qgc3RyV2lkdGggPSBtaXhpbi5zdHJpbmdXaWR0aChzdHIpO1xuICAgIGlmIChzdHJXaWR0aCA8IHdpZHRoKSB7XG4gICAgICAgIHJldHVybiAnICcucmVwZWF0KHdpZHRoIC0gc3RyV2lkdGgpICsgc3RyO1xuICAgIH1cbiAgICByZXR1cm4gc3RyO1xufVxuZnVuY3Rpb24gYWxpZ25DZW50ZXIoc3RyLCB3aWR0aCkge1xuICAgIHN0ciA9IHN0ci50cmltKCk7XG4gICAgY29uc3Qgc3RyV2lkdGggPSBtaXhpbi5zdHJpbmdXaWR0aChzdHIpO1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgaWYgKHN0cldpZHRoID49IHdpZHRoKSB7XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuICAgIHJldHVybiAnICcucmVwZWF0KCh3aWR0aCAtIHN0cldpZHRoKSA+PiAxKSArIHN0cjtcbn1cbmxldCBtaXhpbjtcbmV4cG9ydCBmdW5jdGlvbiBjbGl1aShvcHRzLCBfbWl4aW4pIHtcbiAgICBtaXhpbiA9IF9taXhpbjtcbiAgICByZXR1cm4gbmV3IFVJKHtcbiAgICAgICAgd2lkdGg6IChvcHRzID09PSBudWxsIHx8IG9wdHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdHMud2lkdGgpIHx8IGdldFdpbmRvd1dpZHRoKCksXG4gICAgICAgIHdyYXA6IG9wdHMgPT09IG51bGwgfHwgb3B0cyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0cy53cmFwXG4gICAgfSk7XG59XG4iLCIvLyBNaW5pbWFsIHJlcGxhY2VtZW50IGZvciBhbnNpIHN0cmluZyBoZWxwZXJzIFwid3JhcC1hbnNpXCIgYW5kIFwic3RyaXAtYW5zaVwiLlxuLy8gdG8gZmFjaWxpdGF0ZSBFU00gYW5kIERlbm8gbW9kdWxlcy5cbi8vIFRPRE86IGxvb2sgYXQgcG9ydGluZyBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS93cmFwLWFuc2kgdG8gRVNNLlxuLy8gVGhlIG5wbSBhcHBsaWNhdGlvblxuLy8gQ29weXJpZ2h0IChjKSBucG0sIEluYy4gYW5kIENvbnRyaWJ1dG9yc1xuLy8gTGljZW5zZWQgb24gdGhlIHRlcm1zIG9mIFRoZSBBcnRpc3RpYyBMaWNlbnNlIDIuMFxuLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vbnBtL2NsaS9ibG9iLzRjNjVjZDk1MmJjODYyNzgxMTczNWJlYTc2YjliMTEwY2M0ZmM4MGUvbGliL3V0aWxzL2Fuc2ktdHJpbS5qc1xuY29uc3QgYW5zaSA9IG5ldyBSZWdFeHAoJ1xceDFiKD86XFxcXFsoPzpcXFxcZCtbQUJDREVGR0pLU1RtXXxcXFxcZCs7XFxcXGQrW0hmbV18JyArXG4gICAgJ1xcXFxkKztcXFxcZCs7XFxcXGQrbXw2bnxzfHV8XFxcXD8yNVtsaF0pfFxcXFx3KScsICdnJyk7XG5leHBvcnQgZnVuY3Rpb24gc3RyaXBBbnNpKHN0cikge1xuICAgIHJldHVybiBzdHIucmVwbGFjZShhbnNpLCAnJyk7XG59XG5leHBvcnQgZnVuY3Rpb24gd3JhcChzdHIsIHdpZHRoKSB7XG4gICAgY29uc3QgW3N0YXJ0LCBlbmRdID0gc3RyLm1hdGNoKGFuc2kpIHx8IFsnJywgJyddO1xuICAgIHN0ciA9IHN0cmlwQW5zaShzdHIpO1xuICAgIGxldCB3cmFwcGVkID0gJyc7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGkgIT09IDAgJiYgKGkgJSB3aWR0aCkgPT09IDApIHtcbiAgICAgICAgICAgIHdyYXBwZWQgKz0gJ1xcbic7XG4gICAgICAgIH1cbiAgICAgICAgd3JhcHBlZCArPSBzdHIuY2hhckF0KGkpO1xuICAgIH1cbiAgICBpZiAoc3RhcnQgJiYgZW5kKSB7XG4gICAgICAgIHdyYXBwZWQgPSBgJHtzdGFydH0ke3dyYXBwZWR9JHtlbmR9YDtcbiAgICB9XG4gICAgcmV0dXJuIHdyYXBwZWQ7XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYsIENvbnRyaWJ1dG9yc1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IElTQ1xuICovXG5leHBvcnQgZnVuY3Rpb24gY2FtZWxDYXNlKHN0cikge1xuICAgIC8vIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSBhbiBhcmd1bWVudCBpcyBwcm92aWRlZCBhcyBjYW1lbCBjYXNlLCBlLmcuLCBmb29CYXIuXG4gICAgLy8gYnkgZW5zdXJpbmcgdGhhdCB0aGUgc3RyaW5nIGlzbid0IGFscmVhZHkgbWl4ZWQgY2FzZTpcbiAgICBjb25zdCBpc0NhbWVsQ2FzZSA9IHN0ciAhPT0gc3RyLnRvTG93ZXJDYXNlKCkgJiYgc3RyICE9PSBzdHIudG9VcHBlckNhc2UoKTtcbiAgICBpZiAoIWlzQ2FtZWxDYXNlKSB7XG4gICAgICAgIHN0ciA9IHN0ci50b0xvd2VyQ2FzZSgpO1xuICAgIH1cbiAgICBpZiAoc3RyLmluZGV4T2YoJy0nKSA9PT0gLTEgJiYgc3RyLmluZGV4T2YoJ18nKSA9PT0gLTEpIHtcbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGxldCBjYW1lbGNhc2UgPSAnJztcbiAgICAgICAgbGV0IG5leHRDaHJVcHBlciA9IGZhbHNlO1xuICAgICAgICBjb25zdCBsZWFkaW5nSHlwaGVucyA9IHN0ci5tYXRjaCgvXi0rLyk7XG4gICAgICAgIGZvciAobGV0IGkgPSBsZWFkaW5nSHlwaGVucyA/IGxlYWRpbmdIeXBoZW5zWzBdLmxlbmd0aCA6IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjaHIgPSBzdHIuY2hhckF0KGkpO1xuICAgICAgICAgICAgaWYgKG5leHRDaHJVcHBlcikge1xuICAgICAgICAgICAgICAgIG5leHRDaHJVcHBlciA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGNociA9IGNoci50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGkgIT09IDAgJiYgKGNociA9PT0gJy0nIHx8IGNociA9PT0gJ18nKSkge1xuICAgICAgICAgICAgICAgIG5leHRDaHJVcHBlciA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaHIgIT09ICctJyAmJiBjaHIgIT09ICdfJykge1xuICAgICAgICAgICAgICAgIGNhbWVsY2FzZSArPSBjaHI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNhbWVsY2FzZTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gZGVjYW1lbGl6ZShzdHIsIGpvaW5TdHJpbmcpIHtcbiAgICBjb25zdCBsb3dlcmNhc2UgPSBzdHIudG9Mb3dlckNhc2UoKTtcbiAgICBqb2luU3RyaW5nID0gam9pblN0cmluZyB8fCAnLSc7XG4gICAgbGV0IG5vdENhbWVsY2FzZSA9ICcnO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGNockxvd2VyID0gbG93ZXJjYXNlLmNoYXJBdChpKTtcbiAgICAgICAgY29uc3QgY2hyU3RyaW5nID0gc3RyLmNoYXJBdChpKTtcbiAgICAgICAgaWYgKGNockxvd2VyICE9PSBjaHJTdHJpbmcgJiYgaSA+IDApIHtcbiAgICAgICAgICAgIG5vdENhbWVsY2FzZSArPSBgJHtqb2luU3RyaW5nfSR7bG93ZXJjYXNlLmNoYXJBdChpKX1gO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbm90Q2FtZWxjYXNlICs9IGNoclN0cmluZztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbm90Q2FtZWxjYXNlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGxvb2tzTGlrZU51bWJlcih4KSB7XG4gICAgaWYgKHggPT09IG51bGwgfHwgeCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgLy8gaWYgbG9hZGVkIGZyb20gY29uZmlnLCBtYXkgYWxyZWFkeSBiZSBhIG51bWJlci5cbiAgICBpZiAodHlwZW9mIHggPT09ICdudW1iZXInKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAvLyBoZXhhZGVjaW1hbC5cbiAgICBpZiAoL14weFswLTlhLWZdKyQvaS50ZXN0KHgpKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAvLyBkb24ndCB0cmVhdCAwMTIzIGFzIGEgbnVtYmVyOyBhcyBpdCBkcm9wcyB0aGUgbGVhZGluZyAnMCcuXG4gICAgaWYgKC9eMFteLl0vLnRlc3QoeCkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gL15bLV0/KD86XFxkKyg/OlxcLlxcZCopP3xcXC5cXGQrKShlWy0rXT9cXGQrKT8kLy50ZXN0KHgpO1xufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IChjKSAyMDE2LCBDb250cmlidXRvcnNcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBJU0NcbiAqL1xuZXhwb3J0IHZhciBEZWZhdWx0VmFsdWVzRm9yVHlwZUtleTtcbihmdW5jdGlvbiAoRGVmYXVsdFZhbHVlc0ZvclR5cGVLZXkpIHtcbiAgICBEZWZhdWx0VmFsdWVzRm9yVHlwZUtleVtcIkJPT0xFQU5cIl0gPSBcImJvb2xlYW5cIjtcbiAgICBEZWZhdWx0VmFsdWVzRm9yVHlwZUtleVtcIlNUUklOR1wiXSA9IFwic3RyaW5nXCI7XG4gICAgRGVmYXVsdFZhbHVlc0ZvclR5cGVLZXlbXCJOVU1CRVJcIl0gPSBcIm51bWJlclwiO1xuICAgIERlZmF1bHRWYWx1ZXNGb3JUeXBlS2V5W1wiQVJSQVlcIl0gPSBcImFycmF5XCI7XG59KShEZWZhdWx0VmFsdWVzRm9yVHlwZUtleSB8fCAoRGVmYXVsdFZhbHVlc0ZvclR5cGVLZXkgPSB7fSkpO1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IChjKSAyMDE2LCBDb250cmlidXRvcnNcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBJU0NcbiAqL1xuaW1wb3J0IHsgdG9rZW5pemVBcmdTdHJpbmcgfSBmcm9tICcuL3Rva2VuaXplLWFyZy1zdHJpbmcuanMnO1xuaW1wb3J0IHsgRGVmYXVsdFZhbHVlc0ZvclR5cGVLZXkgfSBmcm9tICcuL3lhcmdzLXBhcnNlci10eXBlcy5qcyc7XG5pbXBvcnQgeyBjYW1lbENhc2UsIGRlY2FtZWxpemUsIGxvb2tzTGlrZU51bWJlciB9IGZyb20gJy4vc3RyaW5nLXV0aWxzLmpzJztcbmxldCBtaXhpbjtcbmV4cG9ydCBjbGFzcyBZYXJnc1BhcnNlciB7XG4gICAgY29uc3RydWN0b3IoX21peGluKSB7XG4gICAgICAgIG1peGluID0gX21peGluO1xuICAgIH1cbiAgICBwYXJzZShhcmdzSW5wdXQsIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3Qgb3B0cyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAgICAgYWxpYXM6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGFycmF5OiB1bmRlZmluZWQsXG4gICAgICAgICAgICBib29sZWFuOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBjb25maWc6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGNvbmZpZ09iamVjdHM6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGNvbmZpZ3VyYXRpb246IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGNvZXJjZTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgY291bnQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGVudlByZWZpeDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgbmFyZzogdW5kZWZpbmVkLFxuICAgICAgICAgICAgbm9ybWFsaXplOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBzdHJpbmc6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG51bWJlcjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgX186IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGtleTogdW5kZWZpbmVkXG4gICAgICAgIH0sIG9wdGlvbnMpO1xuICAgICAgICAvLyBhbGxvdyBhIHN0cmluZyBhcmd1bWVudCB0byBiZSBwYXNzZWQgaW4gcmF0aGVyXG4gICAgICAgIC8vIHRoYW4gYW4gYXJndiBhcnJheS5cbiAgICAgICAgY29uc3QgYXJncyA9IHRva2VuaXplQXJnU3RyaW5nKGFyZ3NJbnB1dCk7XG4gICAgICAgIC8vIHRva2VuaXplQXJnU3RyaW5nIGFkZHMgZXh0cmEgcXVvdGVzIHRvIGFyZ3MgaWYgYXJnc0lucHV0IGlzIGEgc3RyaW5nXG4gICAgICAgIC8vIG9ubHkgc3RyaXAgdGhvc2UgZXh0cmEgcXVvdGVzIGluIHByb2Nlc3NWYWx1ZSBpZiBhcmdzSW5wdXQgaXMgYSBzdHJpbmdcbiAgICAgICAgY29uc3QgaW5wdXRJc1N0cmluZyA9IHR5cGVvZiBhcmdzSW5wdXQgPT09ICdzdHJpbmcnO1xuICAgICAgICAvLyBhbGlhc2VzIG1pZ2h0IGhhdmUgdHJhbnNpdGl2ZSByZWxhdGlvbnNoaXBzLCBub3JtYWxpemUgdGhpcy5cbiAgICAgICAgY29uc3QgYWxpYXNlcyA9IGNvbWJpbmVBbGlhc2VzKE9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShudWxsKSwgb3B0cy5hbGlhcykpO1xuICAgICAgICBjb25zdCBjb25maWd1cmF0aW9uID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgICAnYm9vbGVhbi1uZWdhdGlvbic6IHRydWUsXG4gICAgICAgICAgICAnY2FtZWwtY2FzZS1leHBhbnNpb24nOiB0cnVlLFxuICAgICAgICAgICAgJ2NvbWJpbmUtYXJyYXlzJzogZmFsc2UsXG4gICAgICAgICAgICAnZG90LW5vdGF0aW9uJzogdHJ1ZSxcbiAgICAgICAgICAgICdkdXBsaWNhdGUtYXJndW1lbnRzLWFycmF5JzogdHJ1ZSxcbiAgICAgICAgICAgICdmbGF0dGVuLWR1cGxpY2F0ZS1hcnJheXMnOiB0cnVlLFxuICAgICAgICAgICAgJ2dyZWVkeS1hcnJheXMnOiB0cnVlLFxuICAgICAgICAgICAgJ2hhbHQtYXQtbm9uLW9wdGlvbic6IGZhbHNlLFxuICAgICAgICAgICAgJ25hcmdzLWVhdHMtb3B0aW9ucyc6IGZhbHNlLFxuICAgICAgICAgICAgJ25lZ2F0aW9uLXByZWZpeCc6ICduby0nLFxuICAgICAgICAgICAgJ3BhcnNlLW51bWJlcnMnOiB0cnVlLFxuICAgICAgICAgICAgJ3BhcnNlLXBvc2l0aW9uYWwtbnVtYmVycyc6IHRydWUsXG4gICAgICAgICAgICAncG9wdWxhdGUtLSc6IGZhbHNlLFxuICAgICAgICAgICAgJ3NldC1wbGFjZWhvbGRlci1rZXknOiBmYWxzZSxcbiAgICAgICAgICAgICdzaG9ydC1vcHRpb24tZ3JvdXBzJzogdHJ1ZSxcbiAgICAgICAgICAgICdzdHJpcC1hbGlhc2VkJzogZmFsc2UsXG4gICAgICAgICAgICAnc3RyaXAtZGFzaGVkJzogZmFsc2UsXG4gICAgICAgICAgICAndW5rbm93bi1vcHRpb25zLWFzLWFyZ3MnOiBmYWxzZVxuICAgICAgICB9LCBvcHRzLmNvbmZpZ3VyYXRpb24pO1xuICAgICAgICBjb25zdCBkZWZhdWx0cyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShudWxsKSwgb3B0cy5kZWZhdWx0KTtcbiAgICAgICAgY29uc3QgY29uZmlnT2JqZWN0cyA9IG9wdHMuY29uZmlnT2JqZWN0cyB8fCBbXTtcbiAgICAgICAgY29uc3QgZW52UHJlZml4ID0gb3B0cy5lbnZQcmVmaXg7XG4gICAgICAgIGNvbnN0IG5vdEZsYWdzT3B0aW9uID0gY29uZmlndXJhdGlvblsncG9wdWxhdGUtLSddO1xuICAgICAgICBjb25zdCBub3RGbGFnc0FyZ3YgPSBub3RGbGFnc09wdGlvbiA/ICctLScgOiAnXyc7XG4gICAgICAgIGNvbnN0IG5ld0FsaWFzZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBjb25zdCBkZWZhdWx0ZWQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAvLyBhbGxvdyBhIGkxOG4gaGFuZGxlciB0byBiZSBwYXNzZWQgaW4sIGRlZmF1bHQgdG8gYSBmYWtlIG9uZSAodXRpbC5mb3JtYXQpLlxuICAgICAgICBjb25zdCBfXyA9IG9wdHMuX18gfHwgbWl4aW4uZm9ybWF0O1xuICAgICAgICBjb25zdCBmbGFncyA9IHtcbiAgICAgICAgICAgIGFsaWFzZXM6IE9iamVjdC5jcmVhdGUobnVsbCksXG4gICAgICAgICAgICBhcnJheXM6IE9iamVjdC5jcmVhdGUobnVsbCksXG4gICAgICAgICAgICBib29sczogT2JqZWN0LmNyZWF0ZShudWxsKSxcbiAgICAgICAgICAgIHN0cmluZ3M6IE9iamVjdC5jcmVhdGUobnVsbCksXG4gICAgICAgICAgICBudW1iZXJzOiBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgICAgICAgY291bnRzOiBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgICAgICAgbm9ybWFsaXplOiBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgICAgICAgY29uZmlnczogT2JqZWN0LmNyZWF0ZShudWxsKSxcbiAgICAgICAgICAgIG5hcmdzOiBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgICAgICAgY29lcmNpb25zOiBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgICAgICAga2V5czogW11cbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgbmVnYXRpdmUgPSAvXi0oWzAtOV0rKFxcLlswLTldKyk/fFxcLlswLTldKykkLztcbiAgICAgICAgY29uc3QgbmVnYXRlZEJvb2xlYW4gPSBuZXcgUmVnRXhwKCdeLS0nICsgY29uZmlndXJhdGlvblsnbmVnYXRpb24tcHJlZml4J10gKyAnKC4rKScpO1xuICAgICAgICBbXS5jb25jYXQob3B0cy5hcnJheSB8fCBbXSkuZmlsdGVyKEJvb2xlYW4pLmZvckVhY2goZnVuY3Rpb24gKG9wdCkge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gdHlwZW9mIG9wdCA9PT0gJ29iamVjdCcgPyBvcHQua2V5IDogb3B0O1xuICAgICAgICAgICAgLy8gYXNzaWduIHRvIGZsYWdzW2Jvb2xzfHN0cmluZ3N8bnVtYmVyc11cbiAgICAgICAgICAgIGNvbnN0IGFzc2lnbm1lbnQgPSBPYmplY3Qua2V5cyhvcHQpLm1hcChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYXJyYXlGbGFnS2V5cyA9IHtcbiAgICAgICAgICAgICAgICAgICAgYm9vbGVhbjogJ2Jvb2xzJyxcbiAgICAgICAgICAgICAgICAgICAgc3RyaW5nOiAnc3RyaW5ncycsXG4gICAgICAgICAgICAgICAgICAgIG51bWJlcjogJ251bWJlcnMnXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXlGbGFnS2V5c1trZXldO1xuICAgICAgICAgICAgfSkuZmlsdGVyKEJvb2xlYW4pLnBvcCgpO1xuICAgICAgICAgICAgLy8gYXNzaWduIGtleSB0byBiZSBjb2VyY2VkXG4gICAgICAgICAgICBpZiAoYXNzaWdubWVudCkge1xuICAgICAgICAgICAgICAgIGZsYWdzW2Fzc2lnbm1lbnRdW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmxhZ3MuYXJyYXlzW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgZmxhZ3Mua2V5cy5wdXNoKGtleSk7XG4gICAgICAgIH0pO1xuICAgICAgICBbXS5jb25jYXQob3B0cy5ib29sZWFuIHx8IFtdKS5maWx0ZXIoQm9vbGVhbikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICBmbGFncy5ib29sc1trZXldID0gdHJ1ZTtcbiAgICAgICAgICAgIGZsYWdzLmtleXMucHVzaChrZXkpO1xuICAgICAgICB9KTtcbiAgICAgICAgW10uY29uY2F0KG9wdHMuc3RyaW5nIHx8IFtdKS5maWx0ZXIoQm9vbGVhbikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICBmbGFncy5zdHJpbmdzW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgZmxhZ3Mua2V5cy5wdXNoKGtleSk7XG4gICAgICAgIH0pO1xuICAgICAgICBbXS5jb25jYXQob3B0cy5udW1iZXIgfHwgW10pLmZpbHRlcihCb29sZWFuKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgIGZsYWdzLm51bWJlcnNba2V5XSA9IHRydWU7XG4gICAgICAgICAgICBmbGFncy5rZXlzLnB1c2goa2V5KTtcbiAgICAgICAgfSk7XG4gICAgICAgIFtdLmNvbmNhdChvcHRzLmNvdW50IHx8IFtdKS5maWx0ZXIoQm9vbGVhbikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICBmbGFncy5jb3VudHNba2V5XSA9IHRydWU7XG4gICAgICAgICAgICBmbGFncy5rZXlzLnB1c2goa2V5KTtcbiAgICAgICAgfSk7XG4gICAgICAgIFtdLmNvbmNhdChvcHRzLm5vcm1hbGl6ZSB8fCBbXSkuZmlsdGVyKEJvb2xlYW4pLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgZmxhZ3Mubm9ybWFsaXplW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgZmxhZ3Mua2V5cy5wdXNoKGtleSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodHlwZW9mIG9wdHMubmFyZyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKG9wdHMubmFyZykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3MubmFyZ3Nba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBmbGFncy5rZXlzLnB1c2goa2V5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG9wdHMuY29lcmNlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMob3B0cy5jb2VyY2UpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3MuY29lcmNpb25zW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3Mua2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBvcHRzLmNvbmZpZyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9wdHMuY29uZmlnKSB8fCB0eXBlb2Ygb3B0cy5jb25maWcgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgO1xuICAgICAgICAgICAgICAgIFtdLmNvbmNhdChvcHRzLmNvbmZpZykuZmlsdGVyKEJvb2xlYW4pLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgICAgICBmbGFncy5jb25maWdzW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIG9wdHMuY29uZmlnID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKG9wdHMuY29uZmlnKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MuY29uZmlnc1trZXldID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBjcmVhdGUgYSBsb29rdXAgdGFibGUgdGhhdCB0YWtlcyBpbnRvIGFjY291bnQgYWxsXG4gICAgICAgIC8vIGNvbWJpbmF0aW9ucyBvZiBhbGlhc2VzOiB7ZjogWydmb28nXSwgZm9vOiBbJ2YnXX1cbiAgICAgICAgZXh0ZW5kQWxpYXNlcyhvcHRzLmtleSwgYWxpYXNlcywgb3B0cy5kZWZhdWx0LCBmbGFncy5hcnJheXMpO1xuICAgICAgICAvLyBhcHBseSBkZWZhdWx0IHZhbHVlcyB0byBhbGwgYWxpYXNlcy5cbiAgICAgICAgT2JqZWN0LmtleXMoZGVmYXVsdHMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgKGZsYWdzLmFsaWFzZXNba2V5XSB8fCBbXSkuZm9yRWFjaChmdW5jdGlvbiAoYWxpYXMpIHtcbiAgICAgICAgICAgICAgICBkZWZhdWx0c1thbGlhc10gPSBkZWZhdWx0c1trZXldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgZXJyb3IgPSBudWxsO1xuICAgICAgICBjaGVja0NvbmZpZ3VyYXRpb24oKTtcbiAgICAgICAgbGV0IG5vdEZsYWdzID0gW107XG4gICAgICAgIGNvbnN0IGFyZ3YgPSBPYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobnVsbCksIHsgXzogW10gfSk7XG4gICAgICAgIC8vIFRPRE8oYmNvZSk6IGZvciB0aGUgZmlyc3QgcGFzcyBhdCByZW1vdmluZyBvYmplY3QgcHJvdG90eXBlICB3ZSBkaWRuJ3RcbiAgICAgICAgLy8gcmVtb3ZlIGFsbCBwcm90b3R5cGVzIGZyb20gb2JqZWN0cyByZXR1cm5lZCBieSB0aGlzIEFQSSwgd2UgbWlnaHQgd2FudFxuICAgICAgICAvLyB0byBncmFkdWFsbHkgbW92ZSB0b3dhcmRzIGRvaW5nIHNvLlxuICAgICAgICBjb25zdCBhcmd2UmV0dXJuID0ge307XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgYXJnID0gYXJnc1tpXTtcbiAgICAgICAgICAgIGNvbnN0IHRydW5jYXRlZEFyZyA9IGFyZy5yZXBsYWNlKC9eLXszLH0vLCAnLS0tJyk7XG4gICAgICAgICAgICBsZXQgYnJva2VuO1xuICAgICAgICAgICAgbGV0IGtleTtcbiAgICAgICAgICAgIGxldCBsZXR0ZXJzO1xuICAgICAgICAgICAgbGV0IG07XG4gICAgICAgICAgICBsZXQgbmV4dDtcbiAgICAgICAgICAgIGxldCB2YWx1ZTtcbiAgICAgICAgICAgIC8vIGFueSB1bmtub3duIG9wdGlvbiAoZXhjZXB0IGZvciBlbmQtb2Ytb3B0aW9ucywgXCItLVwiKVxuICAgICAgICAgICAgaWYgKGFyZyAhPT0gJy0tJyAmJiAvXi0vLnRlc3QoYXJnKSAmJiBpc1Vua25vd25PcHRpb25Bc0FyZyhhcmcpKSB7XG4gICAgICAgICAgICAgICAgcHVzaFBvc2l0aW9uYWwoYXJnKTtcbiAgICAgICAgICAgICAgICAvLyAtLS0sIC0tLT0sIC0tLS0sIGV0YyxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRydW5jYXRlZEFyZy5tYXRjaCgvXi0tLSsoPXwkKS8pKSB7XG4gICAgICAgICAgICAgICAgLy8gb3B0aW9ucyB3aXRob3V0IGtleSBuYW1lIGFyZSBpbnZhbGlkLlxuICAgICAgICAgICAgICAgIHB1c2hQb3NpdGlvbmFsKGFyZyk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgLy8gLS0gc2VwYXJhdGVkIGJ5ID1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGFyZy5tYXRjaCgvXi0tLis9LykgfHwgKCFjb25maWd1cmF0aW9uWydzaG9ydC1vcHRpb24tZ3JvdXBzJ10gJiYgYXJnLm1hdGNoKC9eLS4rPS8pKSkge1xuICAgICAgICAgICAgICAgIC8vIFVzaW5nIFtcXHNcXFNdIGluc3RlYWQgb2YgLiBiZWNhdXNlIGpzIGRvZXNuJ3Qgc3VwcG9ydCB0aGVcbiAgICAgICAgICAgICAgICAvLyAnZG90YWxsJyByZWdleCBtb2RpZmllci4gU2VlOlxuICAgICAgICAgICAgICAgIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzEwNjgzMDgvMTMyMTZcbiAgICAgICAgICAgICAgICBtID0gYXJnLm1hdGNoKC9eLS0/KFtePV0rKT0oW1xcc1xcU10qKSQvKTtcbiAgICAgICAgICAgICAgICAvLyBhcnJheXMgZm9ybWF0ID0gJy0tZj1hIGIgYydcbiAgICAgICAgICAgICAgICBpZiAobSAhPT0gbnVsbCAmJiBBcnJheS5pc0FycmF5KG0pICYmIG0ubGVuZ3RoID49IDMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoZWNrQWxsQWxpYXNlcyhtWzFdLCBmbGFncy5hcnJheXMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpID0gZWF0QXJyYXkoaSwgbVsxXSwgYXJncywgbVsyXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2tBbGxBbGlhc2VzKG1bMV0sIGZsYWdzLm5hcmdzKSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5hcmdzIGZvcm1hdCA9ICctLWY9bW9ua2V5IHdhc2hpbmcgY2F0J1xuICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGVhdE5hcmdzKGksIG1bMV0sIGFyZ3MsIG1bMl0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKG1bMV0sIG1bMl0sIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYXJnLm1hdGNoKG5lZ2F0ZWRCb29sZWFuKSAmJiBjb25maWd1cmF0aW9uWydib29sZWFuLW5lZ2F0aW9uJ10pIHtcbiAgICAgICAgICAgICAgICBtID0gYXJnLm1hdGNoKG5lZ2F0ZWRCb29sZWFuKTtcbiAgICAgICAgICAgICAgICBpZiAobSAhPT0gbnVsbCAmJiBBcnJheS5pc0FycmF5KG0pICYmIG0ubGVuZ3RoID49IDIpIHtcbiAgICAgICAgICAgICAgICAgICAga2V5ID0gbVsxXTtcbiAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYXJyYXlzKSA/IFtmYWxzZV0gOiBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIC0tIHNlcGFyYXRlZCBieSBzcGFjZS5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGFyZy5tYXRjaCgvXi0tLisvKSB8fCAoIWNvbmZpZ3VyYXRpb25bJ3Nob3J0LW9wdGlvbi1ncm91cHMnXSAmJiBhcmcubWF0Y2goL14tW14tXSsvKSkpIHtcbiAgICAgICAgICAgICAgICBtID0gYXJnLm1hdGNoKC9eLS0/KC4rKS8pO1xuICAgICAgICAgICAgICAgIGlmIChtICE9PSBudWxsICYmIEFycmF5LmlzQXJyYXkobSkgJiYgbS5sZW5ndGggPj0gMikge1xuICAgICAgICAgICAgICAgICAgICBrZXkgPSBtWzFdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYXJyYXlzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJyYXkgZm9ybWF0ID0gJy0tZm9vIGEgYiBjJ1xuICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGVhdEFycmF5KGksIGtleSwgYXJncyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MubmFyZ3MpICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmFyZ3MgZm9ybWF0ID0gJy0tZm9vIGEgYiBjJ1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2hvdWxkIGJlIHRydXRoeSBldmVuIGlmOiBmbGFncy5uYXJnc1trZXldID09PSAwXG4gICAgICAgICAgICAgICAgICAgICAgICBpID0gZWF0TmFyZ3MoaSwga2V5LCBhcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgPSBhcmdzW2kgKyAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0ICE9PSB1bmRlZmluZWQgJiYgKCFuZXh0Lm1hdGNoKC9eLS8pIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dC5tYXRjaChuZWdhdGl2ZSkpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIWNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLmJvb2xzKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICFjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5jb3VudHMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgbmV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoL14odHJ1ZXxmYWxzZSkkLy50ZXN0KG5leHQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgbmV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgZGVmYXVsdFZhbHVlKGtleSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGRvdC1ub3RhdGlvbiBmbGFnIHNlcGFyYXRlZCBieSAnPScuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChhcmcubWF0Y2goL14tLlxcLi4rPS8pKSB7XG4gICAgICAgICAgICAgICAgbSA9IGFyZy5tYXRjaCgvXi0oW149XSspPShbXFxzXFxTXSopJC8pO1xuICAgICAgICAgICAgICAgIGlmIChtICE9PSBudWxsICYmIEFycmF5LmlzQXJyYXkobSkgJiYgbS5sZW5ndGggPj0gMykge1xuICAgICAgICAgICAgICAgICAgICBzZXRBcmcobVsxXSwgbVsyXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGRvdC1ub3RhdGlvbiBmbGFnIHNlcGFyYXRlZCBieSBzcGFjZS5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGFyZy5tYXRjaCgvXi0uXFwuLisvKSAmJiAhYXJnLm1hdGNoKG5lZ2F0aXZlKSkge1xuICAgICAgICAgICAgICAgIG5leHQgPSBhcmdzW2kgKyAxXTtcbiAgICAgICAgICAgICAgICBtID0gYXJnLm1hdGNoKC9eLSguXFwuLispLyk7XG4gICAgICAgICAgICAgICAgaWYgKG0gIT09IG51bGwgJiYgQXJyYXkuaXNBcnJheShtKSAmJiBtLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIGtleSA9IG1bMV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0ICE9PSB1bmRlZmluZWQgJiYgIW5leHQubWF0Y2goL14tLykgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICFjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5ib29scykgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICFjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5jb3VudHMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRBcmcoa2V5LCBuZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEFyZyhrZXksIGRlZmF1bHRWYWx1ZShrZXkpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGFyZy5tYXRjaCgvXi1bXi1dKy8pICYmICFhcmcubWF0Y2gobmVnYXRpdmUpKSB7XG4gICAgICAgICAgICAgICAgbGV0dGVycyA9IGFyZy5zbGljZSgxLCAtMSkuc3BsaXQoJycpO1xuICAgICAgICAgICAgICAgIGJyb2tlbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbGV0dGVycy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICBuZXh0ID0gYXJnLnNsaWNlKGogKyAyKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxldHRlcnNbaiArIDFdICYmIGxldHRlcnNbaiArIDFdID09PSAnPScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gYXJnLnNsaWNlKGogKyAzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IGxldHRlcnNbal07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYXJyYXlzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFycmF5IGZvcm1hdCA9ICctZj1hIGIgYydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gZWF0QXJyYXkoaSwga2V5LCBhcmdzLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5uYXJncykgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmFyZ3MgZm9ybWF0ID0gJy1mPW1vbmtleSB3YXNoaW5nIGNhdCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gZWF0TmFyZ3MoaSwga2V5LCBhcmdzLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRBcmcoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicm9rZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHQgPT09ICctJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGxldHRlcnNbal0sIG5leHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gY3VycmVudCBsZXR0ZXIgaXMgYW4gYWxwaGFiZXRpYyBjaGFyYWN0ZXIgYW5kIG5leHQgdmFsdWUgaXMgYSBudW1iZXJcbiAgICAgICAgICAgICAgICAgICAgaWYgKC9bQS1aYS16XS8udGVzdChsZXR0ZXJzW2pdKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgL14tP1xcZCsoXFwuXFxkKik/KGUtP1xcZCspPyQvLnRlc3QobmV4dCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrQWxsQWxpYXNlcyhuZXh0LCBmbGFncy5ib29scykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRBcmcobGV0dGVyc1tqXSwgbmV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicm9rZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGxldHRlcnNbaiArIDFdICYmIGxldHRlcnNbaiArIDFdLm1hdGNoKC9cXFcvKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGxldHRlcnNbal0sIG5leHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJva2VuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGxldHRlcnNbal0sIGRlZmF1bHRWYWx1ZShsZXR0ZXJzW2pdKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAga2V5ID0gYXJnLnNsaWNlKC0xKVswXTtcbiAgICAgICAgICAgICAgICBpZiAoIWJyb2tlbiAmJiBrZXkgIT09ICctJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYXJyYXlzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJyYXkgZm9ybWF0ID0gJy1mIGEgYiBjJ1xuICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGVhdEFycmF5KGksIGtleSwgYXJncyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MubmFyZ3MpICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmFyZ3MgZm9ybWF0ID0gJy1mIGEgYiBjJ1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2hvdWxkIGJlIHRydXRoeSBldmVuIGlmOiBmbGFncy5uYXJnc1trZXldID09PSAwXG4gICAgICAgICAgICAgICAgICAgICAgICBpID0gZWF0TmFyZ3MoaSwga2V5LCBhcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgPSBhcmdzW2kgKyAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0ICE9PSB1bmRlZmluZWQgJiYgKCEvXigtfC0tKVteLV0vLnRlc3QobmV4dCkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0Lm1hdGNoKG5lZ2F0aXZlKSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYm9vbHMpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIWNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLmNvdW50cykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRBcmcoa2V5LCBuZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgvXih0cnVlfGZhbHNlKSQvLnRlc3QobmV4dCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRBcmcoa2V5LCBuZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRBcmcoa2V5LCBkZWZhdWx0VmFsdWUoa2V5KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChhcmcubWF0Y2goL14tWzAtOV0kLykgJiZcbiAgICAgICAgICAgICAgICBhcmcubWF0Y2gobmVnYXRpdmUpICYmXG4gICAgICAgICAgICAgICAgY2hlY2tBbGxBbGlhc2VzKGFyZy5zbGljZSgxKSwgZmxhZ3MuYm9vbHMpKSB7XG4gICAgICAgICAgICAgICAgLy8gc2luZ2xlLWRpZ2l0IGJvb2xlYW4gYWxpYXMsIGUuZzogeGFyZ3MgLTBcbiAgICAgICAgICAgICAgICBrZXkgPSBhcmcuc2xpY2UoMSk7XG4gICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgZGVmYXVsdFZhbHVlKGtleSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYXJnID09PSAnLS0nKSB7XG4gICAgICAgICAgICAgICAgbm90RmxhZ3MgPSBhcmdzLnNsaWNlKGkgKyAxKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNvbmZpZ3VyYXRpb25bJ2hhbHQtYXQtbm9uLW9wdGlvbiddKSB7XG4gICAgICAgICAgICAgICAgbm90RmxhZ3MgPSBhcmdzLnNsaWNlKGkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcHVzaFBvc2l0aW9uYWwoYXJnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBvcmRlciBvZiBwcmVjZWRlbmNlOlxuICAgICAgICAvLyAxLiBjb21tYW5kIGxpbmUgYXJnXG4gICAgICAgIC8vIDIuIHZhbHVlIGZyb20gZW52IHZhclxuICAgICAgICAvLyAzLiB2YWx1ZSBmcm9tIGNvbmZpZyBmaWxlXG4gICAgICAgIC8vIDQuIHZhbHVlIGZyb20gY29uZmlnIG9iamVjdHNcbiAgICAgICAgLy8gNS4gY29uZmlndXJlZCBkZWZhdWx0IHZhbHVlXG4gICAgICAgIGFwcGx5RW52VmFycyhhcmd2LCB0cnVlKTsgLy8gc3BlY2lhbCBjYXNlOiBjaGVjayBlbnYgdmFycyB0aGF0IHBvaW50IHRvIGNvbmZpZyBmaWxlXG4gICAgICAgIGFwcGx5RW52VmFycyhhcmd2LCBmYWxzZSk7XG4gICAgICAgIHNldENvbmZpZyhhcmd2KTtcbiAgICAgICAgc2V0Q29uZmlnT2JqZWN0cygpO1xuICAgICAgICBhcHBseURlZmF1bHRzQW5kQWxpYXNlcyhhcmd2LCBmbGFncy5hbGlhc2VzLCBkZWZhdWx0cywgdHJ1ZSk7XG4gICAgICAgIGFwcGx5Q29lcmNpb25zKGFyZ3YpO1xuICAgICAgICBpZiAoY29uZmlndXJhdGlvblsnc2V0LXBsYWNlaG9sZGVyLWtleSddKVxuICAgICAgICAgICAgc2V0UGxhY2Vob2xkZXJLZXlzKGFyZ3YpO1xuICAgICAgICAvLyBmb3IgYW55IGNvdW50cyBlaXRoZXIgbm90IGluIGFyZ3Mgb3Igd2l0aG91dCBhbiBleHBsaWNpdCBkZWZhdWx0LCBzZXQgdG8gMFxuICAgICAgICBPYmplY3Qua2V5cyhmbGFncy5jb3VudHMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgaWYgKCFoYXNLZXkoYXJndiwga2V5LnNwbGl0KCcuJykpKVxuICAgICAgICAgICAgICAgIHNldEFyZyhrZXksIDApO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gJy0tJyBkZWZhdWx0cyB0byB1bmRlZmluZWQuXG4gICAgICAgIGlmIChub3RGbGFnc09wdGlvbiAmJiBub3RGbGFncy5sZW5ndGgpXG4gICAgICAgICAgICBhcmd2W25vdEZsYWdzQXJndl0gPSBbXTtcbiAgICAgICAgbm90RmxhZ3MuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICBhcmd2W25vdEZsYWdzQXJndl0ucHVzaChrZXkpO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb25bJ2NhbWVsLWNhc2UtZXhwYW5zaW9uJ10gJiYgY29uZmlndXJhdGlvblsnc3RyaXAtZGFzaGVkJ10pIHtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGFyZ3YpLmZpbHRlcihrZXkgPT4ga2V5ICE9PSAnLS0nICYmIGtleS5pbmNsdWRlcygnLScpKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGFyZ3Zba2V5XTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWd1cmF0aW9uWydzdHJpcC1hbGlhc2VkJ10pIHtcbiAgICAgICAgICAgIDtcbiAgICAgICAgICAgIFtdLmNvbmNhdCguLi5PYmplY3Qua2V5cyhhbGlhc2VzKS5tYXAoayA9PiBhbGlhc2VzW2tdKSkuZm9yRWFjaChhbGlhcyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb25bJ2NhbWVsLWNhc2UtZXhwYW5zaW9uJ10gJiYgYWxpYXMuaW5jbHVkZXMoJy0nKSkge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgYXJndlthbGlhcy5zcGxpdCgnLicpLm1hcChwcm9wID0+IGNhbWVsQ2FzZShwcm9wKSkuam9pbignLicpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGVsZXRlIGFyZ3ZbYWxpYXNdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUHVzaCBhcmd1bWVudCBpbnRvIHBvc2l0aW9uYWwgYXJyYXksIGFwcGx5aW5nIG51bWVyaWMgY29lcmNpb246XG4gICAgICAgIGZ1bmN0aW9uIHB1c2hQb3NpdGlvbmFsKGFyZykge1xuICAgICAgICAgICAgY29uc3QgbWF5YmVDb2VyY2VkTnVtYmVyID0gbWF5YmVDb2VyY2VOdW1iZXIoJ18nLCBhcmcpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBtYXliZUNvZXJjZWROdW1iZXIgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBtYXliZUNvZXJjZWROdW1iZXIgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgYXJndi5fLnB1c2gobWF5YmVDb2VyY2VkTnVtYmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBob3cgbWFueSBhcmd1bWVudHMgc2hvdWxkIHdlIGNvbnN1bWUsIGJhc2VkXG4gICAgICAgIC8vIG9uIHRoZSBuYXJncyBvcHRpb24/XG4gICAgICAgIGZ1bmN0aW9uIGVhdE5hcmdzKGksIGtleSwgYXJncywgYXJnQWZ0ZXJFcXVhbFNpZ24pIHtcbiAgICAgICAgICAgIGxldCBpaTtcbiAgICAgICAgICAgIGxldCB0b0VhdCA9IGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLm5hcmdzKTtcbiAgICAgICAgICAgIC8vIE5hTiBoYXMgYSBzcGVjaWFsIG1lYW5pbmcgZm9yIHRoZSBhcnJheSB0eXBlLCBpbmRpY2F0aW5nIHRoYXQgb25lIG9yXG4gICAgICAgICAgICAvLyBtb3JlIHZhbHVlcyBhcmUgZXhwZWN0ZWQuXG4gICAgICAgICAgICB0b0VhdCA9IHR5cGVvZiB0b0VhdCAhPT0gJ251bWJlcicgfHwgaXNOYU4odG9FYXQpID8gMSA6IHRvRWF0O1xuICAgICAgICAgICAgaWYgKHRvRWF0ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChhcmdBZnRlckVxdWFsU2lnbikpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBFcnJvcihfXygnQXJndW1lbnQgdW5leHBlY3RlZCBmb3I6ICVzJywga2V5KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNldEFyZyhrZXksIGRlZmF1bHRWYWx1ZShrZXkpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBhdmFpbGFibGUgPSBpc1VuZGVmaW5lZChhcmdBZnRlckVxdWFsU2lnbikgPyAwIDogMTtcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uWyduYXJncy1lYXRzLW9wdGlvbnMnXSkge1xuICAgICAgICAgICAgICAgIC8vIGNsYXNzaWMgYmVoYXZpb3IsIHlhcmdzIGVhdHMgcG9zaXRpb25hbCBhbmQgZGFzaCBhcmd1bWVudHMuXG4gICAgICAgICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIC0gKGkgKyAxKSArIGF2YWlsYWJsZSA8IHRvRWF0KSB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yID0gRXJyb3IoX18oJ05vdCBlbm91Z2ggYXJndW1lbnRzIGZvbGxvd2luZzogJXMnLCBrZXkpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYXZhaWxhYmxlID0gdG9FYXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBuYXJncyB3aWxsIG5vdCBjb25zdW1lIGZsYWcgYXJndW1lbnRzLCBlLmcuLCAtYWJjLCAtLWZvbyxcbiAgICAgICAgICAgICAgICAvLyBhbmQgdGVybWluYXRlcyB3aGVuIG9uZSBpcyBvYnNlcnZlZC5cbiAgICAgICAgICAgICAgICBmb3IgKGlpID0gaSArIDE7IGlpIDwgYXJncy5sZW5ndGg7IGlpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFhcmdzW2lpXS5tYXRjaCgvXi1bXjAtOV0vKSB8fCBhcmdzW2lpXS5tYXRjaChuZWdhdGl2ZSkgfHwgaXNVbmtub3duT3B0aW9uQXNBcmcoYXJnc1tpaV0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlKys7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoYXZhaWxhYmxlIDwgdG9FYXQpXG4gICAgICAgICAgICAgICAgICAgIGVycm9yID0gRXJyb3IoX18oJ05vdCBlbm91Z2ggYXJndW1lbnRzIGZvbGxvd2luZzogJXMnLCBrZXkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBjb25zdW1lZCA9IE1hdGgubWluKGF2YWlsYWJsZSwgdG9FYXQpO1xuICAgICAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChhcmdBZnRlckVxdWFsU2lnbikgJiYgY29uc3VtZWQgPiAwKSB7XG4gICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgYXJnQWZ0ZXJFcXVhbFNpZ24pO1xuICAgICAgICAgICAgICAgIGNvbnN1bWVkLS07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGlpID0gaSArIDE7IGlpIDwgKGNvbnN1bWVkICsgaSArIDEpOyBpaSsrKSB7XG4gICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgYXJnc1tpaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIChpICsgY29uc3VtZWQpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGlmIGFuIG9wdGlvbiBpcyBhbiBhcnJheSwgZWF0IGFsbCBub24taHlwaGVuYXRlZCBhcmd1bWVudHNcbiAgICAgICAgLy8gZm9sbG93aW5nIGl0Li4uIFlVTSFcbiAgICAgICAgLy8gZS5nLiwgLS1mb28gYXBwbGUgYmFuYW5hIGNhdCBiZWNvbWVzIFtcImFwcGxlXCIsIFwiYmFuYW5hXCIsIFwiY2F0XCJdXG4gICAgICAgIGZ1bmN0aW9uIGVhdEFycmF5KGksIGtleSwgYXJncywgYXJnQWZ0ZXJFcXVhbFNpZ24pIHtcbiAgICAgICAgICAgIGxldCBhcmdzVG9TZXQgPSBbXTtcbiAgICAgICAgICAgIGxldCBuZXh0ID0gYXJnQWZ0ZXJFcXVhbFNpZ24gfHwgYXJnc1tpICsgMV07XG4gICAgICAgICAgICAvLyBJZiBib3RoIGFycmF5IGFuZCBuYXJncyBhcmUgY29uZmlndXJlZCwgZW5mb3JjZSB0aGUgbmFyZ3MgY291bnQ6XG4gICAgICAgICAgICBjb25zdCBuYXJnc0NvdW50ID0gY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MubmFyZ3MpO1xuICAgICAgICAgICAgaWYgKGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLmJvb2xzKSAmJiAhKC9eKHRydWV8ZmFsc2UpJC8udGVzdChuZXh0KSkpIHtcbiAgICAgICAgICAgICAgICBhcmdzVG9TZXQucHVzaCh0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlzVW5kZWZpbmVkKG5leHQpIHx8XG4gICAgICAgICAgICAgICAgKGlzVW5kZWZpbmVkKGFyZ0FmdGVyRXF1YWxTaWduKSAmJiAvXi0vLnRlc3QobmV4dCkgJiYgIW5lZ2F0aXZlLnRlc3QobmV4dCkgJiYgIWlzVW5rbm93bk9wdGlvbkFzQXJnKG5leHQpKSkge1xuICAgICAgICAgICAgICAgIC8vIGZvciBrZXlzIHdpdGhvdXQgdmFsdWUgPT0+IGFyZ3NUb1NldCByZW1haW5zIGFuIGVtcHR5IFtdXG4gICAgICAgICAgICAgICAgLy8gc2V0IHVzZXIgZGVmYXVsdCB2YWx1ZSwgaWYgYXZhaWxhYmxlXG4gICAgICAgICAgICAgICAgaWYgKGRlZmF1bHRzW2tleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWZWYWwgPSBkZWZhdWx0c1trZXldO1xuICAgICAgICAgICAgICAgICAgICBhcmdzVG9TZXQgPSBBcnJheS5pc0FycmF5KGRlZlZhbCkgPyBkZWZWYWwgOiBbZGVmVmFsXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyB2YWx1ZSBpbiAtLW9wdGlvbj12YWx1ZSBpcyBlYXRlbiBhcyBpc1xuICAgICAgICAgICAgICAgIGlmICghaXNVbmRlZmluZWQoYXJnQWZ0ZXJFcXVhbFNpZ24pKSB7XG4gICAgICAgICAgICAgICAgICAgIGFyZ3NUb1NldC5wdXNoKHByb2Nlc3NWYWx1ZShrZXksIGFyZ0FmdGVyRXF1YWxTaWduLCB0cnVlKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGlpID0gaSArIDE7IGlpIDwgYXJncy5sZW5ndGg7IGlpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCghY29uZmlndXJhdGlvblsnZ3JlZWR5LWFycmF5cyddICYmIGFyZ3NUb1NldC5sZW5ndGggPiAwKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgKG5hcmdzQ291bnQgJiYgdHlwZW9mIG5hcmdzQ291bnQgPT09ICdudW1iZXInICYmIGFyZ3NUb1NldC5sZW5ndGggPj0gbmFyZ3NDb3VudCkpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgbmV4dCA9IGFyZ3NbaWldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoL14tLy50ZXN0KG5leHQpICYmICFuZWdhdGl2ZS50ZXN0KG5leHQpICYmICFpc1Vua25vd25PcHRpb25Bc0FyZyhuZXh0KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBpID0gaWk7XG4gICAgICAgICAgICAgICAgICAgIGFyZ3NUb1NldC5wdXNoKHByb2Nlc3NWYWx1ZShrZXksIG5leHQsIGlucHV0SXNTdHJpbmcpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBJZiBib3RoIGFycmF5IGFuZCBuYXJncyBhcmUgY29uZmlndXJlZCwgY3JlYXRlIGFuIGVycm9yIGlmIGxlc3MgdGhhblxuICAgICAgICAgICAgLy8gbmFyZ3MgcG9zaXRpb25hbHMgd2VyZSBmb3VuZC4gTmFOIGhhcyBzcGVjaWFsIG1lYW5pbmcsIGluZGljYXRpbmdcbiAgICAgICAgICAgIC8vIHRoYXQgYXQgbGVhc3Qgb25lIHZhbHVlIGlzIHJlcXVpcmVkIChtb3JlIGFyZSBva2F5KS5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgbmFyZ3NDb3VudCA9PT0gJ251bWJlcicgJiYgKChuYXJnc0NvdW50ICYmIGFyZ3NUb1NldC5sZW5ndGggPCBuYXJnc0NvdW50KSB8fFxuICAgICAgICAgICAgICAgIChpc05hTihuYXJnc0NvdW50KSAmJiBhcmdzVG9TZXQubGVuZ3RoID09PSAwKSkpIHtcbiAgICAgICAgICAgICAgICBlcnJvciA9IEVycm9yKF9fKCdOb3QgZW5vdWdoIGFyZ3VtZW50cyBmb2xsb3dpbmc6ICVzJywga2V5KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXRBcmcoa2V5LCBhcmdzVG9TZXQpO1xuICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gc2V0QXJnKGtleSwgdmFsLCBzaG91bGRTdHJpcFF1b3RlcyA9IGlucHV0SXNTdHJpbmcpIHtcbiAgICAgICAgICAgIGlmICgvLS8udGVzdChrZXkpICYmIGNvbmZpZ3VyYXRpb25bJ2NhbWVsLWNhc2UtZXhwYW5zaW9uJ10pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhbGlhcyA9IGtleS5zcGxpdCgnLicpLm1hcChmdW5jdGlvbiAocHJvcCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FtZWxDYXNlKHByb3ApO1xuICAgICAgICAgICAgICAgIH0pLmpvaW4oJy4nKTtcbiAgICAgICAgICAgICAgICBhZGROZXdBbGlhcyhrZXksIGFsaWFzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcHJvY2Vzc1ZhbHVlKGtleSwgdmFsLCBzaG91bGRTdHJpcFF1b3Rlcyk7XG4gICAgICAgICAgICBjb25zdCBzcGxpdEtleSA9IGtleS5zcGxpdCgnLicpO1xuICAgICAgICAgICAgc2V0S2V5KGFyZ3YsIHNwbGl0S2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICAvLyBoYW5kbGUgcG9wdWxhdGluZyBhbGlhc2VzIG9mIHRoZSBmdWxsIGtleVxuICAgICAgICAgICAgaWYgKGZsYWdzLmFsaWFzZXNba2V5XSkge1xuICAgICAgICAgICAgICAgIGZsYWdzLmFsaWFzZXNba2V5XS5mb3JFYWNoKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleVByb3BlcnRpZXMgPSB4LnNwbGl0KCcuJyk7XG4gICAgICAgICAgICAgICAgICAgIHNldEtleShhcmd2LCBrZXlQcm9wZXJ0aWVzLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBoYW5kbGUgcG9wdWxhdGluZyBhbGlhc2VzIG9mIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBkb3Qtbm90YXRpb24ga2V5XG4gICAgICAgICAgICBpZiAoc3BsaXRLZXkubGVuZ3RoID4gMSAmJiBjb25maWd1cmF0aW9uWydkb3Qtbm90YXRpb24nXSkge1xuICAgICAgICAgICAgICAgIDtcbiAgICAgICAgICAgICAgICAoZmxhZ3MuYWxpYXNlc1tzcGxpdEtleVswXV0gfHwgW10pLmZvckVhY2goZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGtleVByb3BlcnRpZXMgPSB4LnNwbGl0KCcuJyk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGV4cGFuZCBhbGlhcyB3aXRoIG5lc3RlZCBvYmplY3RzIGluIGtleVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhID0gW10uY29uY2F0KHNwbGl0S2V5KTtcbiAgICAgICAgICAgICAgICAgICAgYS5zaGlmdCgpOyAvLyBudWtlIHRoZSBvbGQga2V5LlxuICAgICAgICAgICAgICAgICAgICBrZXlQcm9wZXJ0aWVzID0ga2V5UHJvcGVydGllcy5jb25jYXQoYSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHBvcHVsYXRlIGFsaWFzIG9ubHkgaWYgaXMgbm90IGFscmVhZHkgYW4gYWxpYXMgb2YgdGhlIGZ1bGwga2V5XG4gICAgICAgICAgICAgICAgICAgIC8vIChhbHJlYWR5IHBvcHVsYXRlZCBhYm92ZSlcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEoZmxhZ3MuYWxpYXNlc1trZXldIHx8IFtdKS5pbmNsdWRlcyhrZXlQcm9wZXJ0aWVzLmpvaW4oJy4nKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEtleShhcmd2LCBrZXlQcm9wZXJ0aWVzLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFNldCBub3JtYWxpemUgZ2V0dGVyIGFuZCBzZXR0ZXIgd2hlbiBrZXkgaXMgaW4gJ25vcm1hbGl6ZScgYnV0IGlzbid0IGFuIGFycmF5XG4gICAgICAgICAgICBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3Mubm9ybWFsaXplKSAmJiAhY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYXJyYXlzKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGtleXMgPSBba2V5XS5jb25jYXQoZmxhZ3MuYWxpYXNlc1trZXldIHx8IFtdKTtcbiAgICAgICAgICAgICAgICBrZXlzLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoYXJndlJldHVybiwga2V5LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0KCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0KHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IG1peGluLm5vcm1hbGl6ZSh2YWx1ZSkgOiB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gYWRkTmV3QWxpYXMoa2V5LCBhbGlhcykge1xuICAgICAgICAgICAgaWYgKCEoZmxhZ3MuYWxpYXNlc1trZXldICYmIGZsYWdzLmFsaWFzZXNba2V5XS5sZW5ndGgpKSB7XG4gICAgICAgICAgICAgICAgZmxhZ3MuYWxpYXNlc1trZXldID0gW2FsaWFzXTtcbiAgICAgICAgICAgICAgICBuZXdBbGlhc2VzW2FsaWFzXSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIShmbGFncy5hbGlhc2VzW2FsaWFzXSAmJiBmbGFncy5hbGlhc2VzW2FsaWFzXS5sZW5ndGgpKSB7XG4gICAgICAgICAgICAgICAgYWRkTmV3QWxpYXMoYWxpYXMsIGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gcHJvY2Vzc1ZhbHVlKGtleSwgdmFsLCBzaG91bGRTdHJpcFF1b3Rlcykge1xuICAgICAgICAgICAgLy8gc3RyaW5ncyBtYXkgYmUgcXVvdGVkLCBjbGVhbiB0aGlzIHVwIGFzIHdlIGFzc2lnbiB2YWx1ZXMuXG4gICAgICAgICAgICBpZiAoc2hvdWxkU3RyaXBRdW90ZXMpIHtcbiAgICAgICAgICAgICAgICB2YWwgPSBzdHJpcFF1b3Rlcyh2YWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gaGFuZGxlIHBhcnNpbmcgYm9vbGVhbiBhcmd1bWVudHMgLS1mb289dHJ1ZSAtLWJhciBmYWxzZS5cbiAgICAgICAgICAgIGlmIChjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5ib29scykgfHwgY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuY291bnRzKSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJylcbiAgICAgICAgICAgICAgICAgICAgdmFsID0gdmFsID09PSAndHJ1ZSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBBcnJheS5pc0FycmF5KHZhbClcbiAgICAgICAgICAgICAgICA/IHZhbC5tYXAoZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG1heWJlQ29lcmNlTnVtYmVyKGtleSwgdik7IH0pXG4gICAgICAgICAgICAgICAgOiBtYXliZUNvZXJjZU51bWJlcihrZXksIHZhbCk7XG4gICAgICAgICAgICAvLyBpbmNyZW1lbnQgYSBjb3VudCBnaXZlbiBhcyBhcmcgKGVpdGhlciBubyB2YWx1ZSBvciB2YWx1ZSBwYXJzZWQgYXMgYm9vbGVhbilcbiAgICAgICAgICAgIGlmIChjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5jb3VudHMpICYmIChpc1VuZGVmaW5lZCh2YWx1ZSkgfHwgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBpbmNyZW1lbnQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFNldCBub3JtYWxpemVkIHZhbHVlIHdoZW4ga2V5IGlzIGluICdub3JtYWxpemUnIGFuZCBpbiAnYXJyYXlzJ1xuICAgICAgICAgICAgaWYgKGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLm5vcm1hbGl6ZSkgJiYgY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYXJyYXlzKSkge1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbCkpXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsLm1hcCgodmFsKSA9PiB7IHJldHVybiBtaXhpbi5ub3JtYWxpemUodmFsKTsgfSk7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG1peGluLm5vcm1hbGl6ZSh2YWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIG1heWJlQ29lcmNlTnVtYmVyKGtleSwgdmFsdWUpIHtcbiAgICAgICAgICAgIGlmICghY29uZmlndXJhdGlvblsncGFyc2UtcG9zaXRpb25hbC1udW1iZXJzJ10gJiYga2V5ID09PSAnXycpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgaWYgKCFjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5zdHJpbmdzKSAmJiAhY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYm9vbHMpICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNob3VsZENvZXJjZU51bWJlciA9IGxvb2tzTGlrZU51bWJlcih2YWx1ZSkgJiYgY29uZmlndXJhdGlvblsncGFyc2UtbnVtYmVycyddICYmIChOdW1iZXIuaXNTYWZlSW50ZWdlcihNYXRoLmZsb29yKHBhcnNlRmxvYXQoYCR7dmFsdWV9YCkpKSk7XG4gICAgICAgICAgICAgICAgaWYgKHNob3VsZENvZXJjZU51bWJlciB8fCAoIWlzVW5kZWZpbmVkKHZhbHVlKSAmJiBjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5udW1iZXJzKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBOdW1iZXIodmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBzZXQgYXJncyBmcm9tIGNvbmZpZy5qc29uIGZpbGUsIHRoaXMgc2hvdWxkIGJlXG4gICAgICAgIC8vIGFwcGxpZWQgbGFzdCBzbyB0aGF0IGRlZmF1bHRzIGNhbiBiZSBhcHBsaWVkLlxuICAgICAgICBmdW5jdGlvbiBzZXRDb25maWcoYXJndikge1xuICAgICAgICAgICAgY29uc3QgY29uZmlnTG9va3VwID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgICAgIC8vIGV4cGFuZCBkZWZhdWx0cy9hbGlhc2VzLCBpbi1jYXNlIGFueSBoYXBwZW4gdG8gcmVmZXJlbmNlXG4gICAgICAgICAgICAvLyB0aGUgY29uZmlnLmpzb24gZmlsZS5cbiAgICAgICAgICAgIGFwcGx5RGVmYXVsdHNBbmRBbGlhc2VzKGNvbmZpZ0xvb2t1cCwgZmxhZ3MuYWxpYXNlcywgZGVmYXVsdHMpO1xuICAgICAgICAgICAgT2JqZWN0LmtleXMoZmxhZ3MuY29uZmlncykuZm9yRWFjaChmdW5jdGlvbiAoY29uZmlnS2V5KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29uZmlnUGF0aCA9IGFyZ3ZbY29uZmlnS2V5XSB8fCBjb25maWdMb29rdXBbY29uZmlnS2V5XTtcbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnUGF0aCkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbmZpZyA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNvbHZlZENvbmZpZ1BhdGggPSBtaXhpbi5yZXNvbHZlKG1peGluLmN3ZCgpLCBjb25maWdQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVDb25maWcgPSBmbGFncy5jb25maWdzW2NvbmZpZ0tleV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlc29sdmVDb25maWcgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcgPSByZXNvbHZlQ29uZmlnKHJlc29sdmVkQ29uZmlnUGF0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvciA9IGNvbmZpZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IG1peGluLnJlcXVpcmUocmVzb2x2ZWRDb25maWdQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHNldENvbmZpZ09iamVjdChjb25maWcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGVubyB3aWxsIHJlY2VpdmUgYSBQZXJtaXNzaW9uRGVuaWVkIGVycm9yIGlmIGFuIGF0dGVtcHQgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hZGUgdG8gbG9hZCBjb25maWcgd2l0aG91dCB0aGUgLS1hbGxvdy1yZWFkIGZsYWc6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXgubmFtZSA9PT0gJ1Blcm1pc3Npb25EZW5pZWQnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gZXg7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmd2W2NvbmZpZ0tleV0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBFcnJvcihfXygnSW52YWxpZCBKU09OIGNvbmZpZyBmaWxlOiAlcycsIGNvbmZpZ1BhdGgpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIHNldCBhcmdzIGZyb20gY29uZmlnIG9iamVjdC5cbiAgICAgICAgLy8gaXQgcmVjdXJzaXZlbHkgY2hlY2tzIG5lc3RlZCBvYmplY3RzLlxuICAgICAgICBmdW5jdGlvbiBzZXRDb25maWdPYmplY3QoY29uZmlnLCBwcmV2KSB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhjb25maWcpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY29uZmlnW2tleV07XG4gICAgICAgICAgICAgICAgY29uc3QgZnVsbEtleSA9IHByZXYgPyBwcmV2ICsgJy4nICsga2V5IDoga2V5O1xuICAgICAgICAgICAgICAgIC8vIGlmIHRoZSB2YWx1ZSBpcyBhbiBpbm5lciBvYmplY3QgYW5kIHdlIGhhdmUgZG90LW5vdGF0aW9uXG4gICAgICAgICAgICAgICAgLy8gZW5hYmxlZCwgdHJlYXQgaW5uZXIgb2JqZWN0cyBpbiBjb25maWcgdGhlIHNhbWUgYXNcbiAgICAgICAgICAgICAgICAvLyBoZWF2aWx5IG5lc3RlZCBkb3Qgbm90YXRpb25zIChmb28uYmFyLmFwcGxlKS5cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgY29uZmlndXJhdGlvblsnZG90LW5vdGF0aW9uJ10pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHZhbHVlIGlzIGFuIG9iamVjdCBidXQgbm90IGFuIGFycmF5LCBjaGVjayBuZXN0ZWQgb2JqZWN0XG4gICAgICAgICAgICAgICAgICAgIHNldENvbmZpZ09iamVjdCh2YWx1ZSwgZnVsbEtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBzZXR0aW5nIGFyZ3VtZW50cyB2aWEgQ0xJIHRha2VzIHByZWNlZGVuY2Ugb3ZlclxuICAgICAgICAgICAgICAgICAgICAvLyB2YWx1ZXMgd2l0aGluIHRoZSBjb25maWcgZmlsZS5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNLZXkoYXJndiwgZnVsbEtleS5zcGxpdCgnLicpKSB8fCAoY2hlY2tBbGxBbGlhc2VzKGZ1bGxLZXksIGZsYWdzLmFycmF5cykgJiYgY29uZmlndXJhdGlvblsnY29tYmluZS1hcnJheXMnXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEFyZyhmdWxsS2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBzZXQgYWxsIGNvbmZpZyBvYmplY3RzIHBhc3NlZCBpbiBvcHRzXG4gICAgICAgIGZ1bmN0aW9uIHNldENvbmZpZ09iamVjdHMoKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNvbmZpZ09iamVjdHMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgY29uZmlnT2JqZWN0cy5mb3JFYWNoKGZ1bmN0aW9uIChjb25maWdPYmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0Q29uZmlnT2JqZWN0KGNvbmZpZ09iamVjdCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gYXBwbHlFbnZWYXJzKGFyZ3YsIGNvbmZpZ09ubHkpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZW52UHJlZml4ID09PSAndW5kZWZpbmVkJylcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBjb25zdCBwcmVmaXggPSB0eXBlb2YgZW52UHJlZml4ID09PSAnc3RyaW5nJyA/IGVudlByZWZpeCA6ICcnO1xuICAgICAgICAgICAgY29uc3QgZW52ID0gbWl4aW4uZW52KCk7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhlbnYpLmZvckVhY2goZnVuY3Rpb24gKGVudlZhcikge1xuICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT09ICcnIHx8IGVudlZhci5sYXN0SW5kZXhPZihwcmVmaXgsIDApID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGdldCBhcnJheSBvZiBuZXN0ZWQga2V5cyBhbmQgY29udmVydCB0aGVtIHRvIGNhbWVsIGNhc2VcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5cyA9IGVudlZhci5zcGxpdCgnX18nKS5tYXAoZnVuY3Rpb24gKGtleSwgaSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBrZXkuc3Vic3RyaW5nKHByZWZpeC5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbWVsQ2FzZShrZXkpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCgoY29uZmlnT25seSAmJiBmbGFncy5jb25maWdzW2tleXMuam9pbignLicpXSkgfHwgIWNvbmZpZ09ubHkpICYmICFoYXNLZXkoYXJndiwga2V5cykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEFyZyhrZXlzLmpvaW4oJy4nKSwgZW52W2VudlZhcl0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gYXBwbHlDb2VyY2lvbnMoYXJndikge1xuICAgICAgICAgICAgbGV0IGNvZXJjZTtcbiAgICAgICAgICAgIGNvbnN0IGFwcGxpZWQgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhhcmd2KS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWFwcGxpZWQuaGFzKGtleSkpIHsgLy8gSWYgd2UgaGF2ZW4ndCBhbHJlYWR5IGNvZXJjZWQgdGhpcyBvcHRpb24gdmlhIG9uZSBvZiBpdHMgYWxpYXNlc1xuICAgICAgICAgICAgICAgICAgICBjb2VyY2UgPSBjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5jb2VyY2lvbnMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvZXJjZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IG1heWJlQ29lcmNlTnVtYmVyKGtleSwgY29lcmNlKGFyZ3Zba2V5XSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChbXS5jb25jYXQoZmxhZ3MuYWxpYXNlc1trZXldIHx8IFtdLCBrZXkpKS5mb3JFYWNoKGFsaSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpZWQuYWRkKGFsaSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3ZbYWxpXSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gZXJyO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gc2V0UGxhY2Vob2xkZXJLZXlzKGFyZ3YpIHtcbiAgICAgICAgICAgIGZsYWdzLmtleXMuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gZG9uJ3Qgc2V0IHBsYWNlaG9sZGVyIGtleXMgZm9yIGRvdCBub3RhdGlvbiBvcHRpb25zICdmb28uYmFyJy5cbiAgICAgICAgICAgICAgICBpZiAofmtleS5pbmRleE9mKCcuJykpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGFyZ3Zba2V5XSA9PT0gJ3VuZGVmaW5lZCcpXG4gICAgICAgICAgICAgICAgICAgIGFyZ3Zba2V5XSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGFyZ3Y7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gYXBwbHlEZWZhdWx0c0FuZEFsaWFzZXMob2JqLCBhbGlhc2VzLCBkZWZhdWx0cywgY2FuTG9nID0gZmFsc2UpIHtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGRlZmF1bHRzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWhhc0tleShvYmosIGtleS5zcGxpdCgnLicpKSkge1xuICAgICAgICAgICAgICAgICAgICBzZXRLZXkob2JqLCBrZXkuc3BsaXQoJy4nKSwgZGVmYXVsdHNba2V5XSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjYW5Mb2cpXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0ZWRba2V5XSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIChhbGlhc2VzW2tleV0gfHwgW10pLmZvckVhY2goZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNLZXkob2JqLCB4LnNwbGl0KCcuJykpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEtleShvYmosIHguc3BsaXQoJy4nKSwgZGVmYXVsdHNba2V5XSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGhhc0tleShvYmosIGtleXMpIHtcbiAgICAgICAgICAgIGxldCBvID0gb2JqO1xuICAgICAgICAgICAgaWYgKCFjb25maWd1cmF0aW9uWydkb3Qtbm90YXRpb24nXSlcbiAgICAgICAgICAgICAgICBrZXlzID0gW2tleXMuam9pbignLicpXTtcbiAgICAgICAgICAgIGtleXMuc2xpY2UoMCwgLTEpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgIG8gPSAob1trZXldIHx8IHt9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3Qga2V5ID0ga2V5c1trZXlzLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBvICE9PSAnb2JqZWN0JylcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIGtleSBpbiBvO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHNldEtleShvYmosIGtleXMsIHZhbHVlKSB7XG4gICAgICAgICAgICBsZXQgbyA9IG9iajtcbiAgICAgICAgICAgIGlmICghY29uZmlndXJhdGlvblsnZG90LW5vdGF0aW9uJ10pXG4gICAgICAgICAgICAgICAga2V5cyA9IFtrZXlzLmpvaW4oJy4nKV07XG4gICAgICAgICAgICBrZXlzLnNsaWNlKDAsIC0xKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgICAvLyBUT0RPKGJjb2UpOiBpbiB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uIG9mIHlhcmdzLCBzd2l0Y2ggdG9cbiAgICAgICAgICAgICAgICAvLyBPYmplY3QuY3JlYXRlKG51bGwpIGZvciBkb3Qgbm90YXRpb246XG4gICAgICAgICAgICAgICAga2V5ID0gc2FuaXRpemVLZXkoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG8gPT09ICdvYmplY3QnICYmIG9ba2V5XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIG9ba2V5XSA9IHt9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9ba2V5XSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShvW2tleV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVuc3VyZSB0aGF0IG9ba2V5XSBpcyBhbiBhcnJheSwgYW5kIHRoYXQgdGhlIGxhc3QgaXRlbSBpcyBhbiBlbXB0eSBvYmplY3QuXG4gICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9ba2V5XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9ba2V5XS5wdXNoKHt9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9ba2V5XSA9IFtvW2tleV0sIHt9XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyB3ZSB3YW50IHRvIHVwZGF0ZSB0aGUgZW1wdHkgb2JqZWN0IGF0IHRoZSBlbmQgb2YgdGhlIG9ba2V5XSBhcnJheSwgc28gc2V0IG8gdG8gdGhhdCBvYmplY3RcbiAgICAgICAgICAgICAgICAgICAgbyA9IG9ba2V5XVtvW2tleV0ubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBvID0gb1trZXldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gVE9ETyhiY29lKTogaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvbiBvZiB5YXJncywgc3dpdGNoIHRvXG4gICAgICAgICAgICAvLyBPYmplY3QuY3JlYXRlKG51bGwpIGZvciBkb3Qgbm90YXRpb246XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBzYW5pdGl6ZUtleShrZXlzW2tleXMubGVuZ3RoIC0gMV0pO1xuICAgICAgICAgICAgY29uc3QgaXNUeXBlQXJyYXkgPSBjaGVja0FsbEFsaWFzZXMoa2V5cy5qb2luKCcuJyksIGZsYWdzLmFycmF5cyk7XG4gICAgICAgICAgICBjb25zdCBpc1ZhbHVlQXJyYXkgPSBBcnJheS5pc0FycmF5KHZhbHVlKTtcbiAgICAgICAgICAgIGxldCBkdXBsaWNhdGUgPSBjb25maWd1cmF0aW9uWydkdXBsaWNhdGUtYXJndW1lbnRzLWFycmF5J107XG4gICAgICAgICAgICAvLyBuYXJncyBoYXMgaGlnaGVyIHByaW9yaXR5IHRoYW4gZHVwbGljYXRlXG4gICAgICAgICAgICBpZiAoIWR1cGxpY2F0ZSAmJiBjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5uYXJncykpIHtcbiAgICAgICAgICAgICAgICBkdXBsaWNhdGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmICgoIWlzVW5kZWZpbmVkKG9ba2V5XSkgJiYgZmxhZ3MubmFyZ3Nba2V5XSA9PT0gMSkgfHwgKEFycmF5LmlzQXJyYXkob1trZXldKSAmJiBvW2tleV0ubGVuZ3RoID09PSBmbGFncy5uYXJnc1trZXldKSkge1xuICAgICAgICAgICAgICAgICAgICBvW2tleV0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHZhbHVlID09PSBpbmNyZW1lbnQoKSkge1xuICAgICAgICAgICAgICAgIG9ba2V5XSA9IGluY3JlbWVudChvW2tleV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShvW2tleV0pKSB7XG4gICAgICAgICAgICAgICAgaWYgKGR1cGxpY2F0ZSAmJiBpc1R5cGVBcnJheSAmJiBpc1ZhbHVlQXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgb1trZXldID0gY29uZmlndXJhdGlvblsnZmxhdHRlbi1kdXBsaWNhdGUtYXJyYXlzJ10gPyBvW2tleV0uY29uY2F0KHZhbHVlKSA6IChBcnJheS5pc0FycmF5KG9ba2V5XVswXSkgPyBvW2tleV0gOiBbb1trZXldXSkuY29uY2F0KFt2YWx1ZV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICghZHVwbGljYXRlICYmIEJvb2xlYW4oaXNUeXBlQXJyYXkpID09PSBCb29sZWFuKGlzVmFsdWVBcnJheSkpIHtcbiAgICAgICAgICAgICAgICAgICAgb1trZXldID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBvW2tleV0gPSBvW2tleV0uY29uY2F0KFt2YWx1ZV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG9ba2V5XSA9PT0gdW5kZWZpbmVkICYmIGlzVHlwZUFycmF5KSB7XG4gICAgICAgICAgICAgICAgb1trZXldID0gaXNWYWx1ZUFycmF5ID8gdmFsdWUgOiBbdmFsdWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZHVwbGljYXRlICYmICEob1trZXldID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgICBjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5jb3VudHMpIHx8XG4gICAgICAgICAgICAgICAgY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYm9vbHMpKSkge1xuICAgICAgICAgICAgICAgIG9ba2V5XSA9IFtvW2tleV0sIHZhbHVlXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG9ba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGV4dGVuZCB0aGUgYWxpYXNlcyBsaXN0IHdpdGggaW5mZXJyZWQgYWxpYXNlcy5cbiAgICAgICAgZnVuY3Rpb24gZXh0ZW5kQWxpYXNlcyguLi5hcmdzKSB7XG4gICAgICAgICAgICBhcmdzLmZvckVhY2goZnVuY3Rpb24gKG9iaikge1xuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKG9iaiB8fCB7fSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHNob3J0LWNpcmN1aXQgaWYgd2UndmUgYWxyZWFkeSBhZGRlZCBhIGtleVxuICAgICAgICAgICAgICAgICAgICAvLyB0byB0aGUgYWxpYXNlcyBhcnJheSwgZm9yIGV4YW1wbGUgaXQgbWlnaHRcbiAgICAgICAgICAgICAgICAgICAgLy8gZXhpc3QgaW4gYm90aCAnb3B0cy5kZWZhdWx0JyBhbmQgJ29wdHMua2V5Jy5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGZsYWdzLmFsaWFzZXNba2V5XSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3MuYWxpYXNlc1trZXldID0gW10uY29uY2F0KGFsaWFzZXNba2V5XSB8fCBbXSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIEZvciBcIi0tb3B0aW9uLW5hbWVcIiwgYWxzbyBzZXQgYXJndi5vcHRpb25OYW1lXG4gICAgICAgICAgICAgICAgICAgIGZsYWdzLmFsaWFzZXNba2V5XS5jb25jYXQoa2V5KS5mb3JFYWNoKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoLy0vLnRlc3QoeCkgJiYgY29uZmlndXJhdGlvblsnY2FtZWwtY2FzZS1leHBhbnNpb24nXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGMgPSBjYW1lbENhc2UoeCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgIT09IGtleSAmJiBmbGFncy5hbGlhc2VzW2tleV0uaW5kZXhPZihjKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MuYWxpYXNlc1trZXldLnB1c2goYyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0FsaWFzZXNbY10gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIEZvciBcIi0tb3B0aW9uTmFtZVwiLCBhbHNvIHNldCBhcmd2WydvcHRpb24tbmFtZSddXG4gICAgICAgICAgICAgICAgICAgIGZsYWdzLmFsaWFzZXNba2V5XS5jb25jYXQoa2V5KS5mb3JFYWNoKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoeC5sZW5ndGggPiAxICYmIC9bQS1aXS8udGVzdCh4KSAmJiBjb25maWd1cmF0aW9uWydjYW1lbC1jYXNlLWV4cGFuc2lvbiddKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYyA9IGRlY2FtZWxpemUoeCwgJy0nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyAhPT0ga2V5ICYmIGZsYWdzLmFsaWFzZXNba2V5XS5pbmRleE9mKGMpID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncy5hbGlhc2VzW2tleV0ucHVzaChjKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3QWxpYXNlc1tjXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3MuYWxpYXNlc1trZXldLmZvckVhY2goZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLmFsaWFzZXNbeF0gPSBba2V5XS5jb25jYXQoZmxhZ3MuYWxpYXNlc1trZXldLmZpbHRlcihmdW5jdGlvbiAoeSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4ICE9PSB5O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWcpIHtcbiAgICAgICAgICAgIGNvbnN0IHRvQ2hlY2sgPSBbXS5jb25jYXQoZmxhZ3MuYWxpYXNlc1trZXldIHx8IFtdLCBrZXkpO1xuICAgICAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGZsYWcpO1xuICAgICAgICAgICAgY29uc3Qgc2V0QWxpYXMgPSB0b0NoZWNrLmZpbmQoa2V5ID0+IGtleXMuaW5jbHVkZXMoa2V5KSk7XG4gICAgICAgICAgICByZXR1cm4gc2V0QWxpYXMgPyBmbGFnW3NldEFsaWFzXSA6IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGhhc0FueUZsYWcoa2V5KSB7XG4gICAgICAgICAgICBjb25zdCBmbGFnc0tleXMgPSBPYmplY3Qua2V5cyhmbGFncyk7XG4gICAgICAgICAgICBjb25zdCB0b0NoZWNrID0gW10uY29uY2F0KGZsYWdzS2V5cy5tYXAoayA9PiBmbGFnc1trXSkpO1xuICAgICAgICAgICAgcmV0dXJuIHRvQ2hlY2suc29tZShmdW5jdGlvbiAoZmxhZykge1xuICAgICAgICAgICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KGZsYWcpID8gZmxhZy5pbmNsdWRlcyhrZXkpIDogZmxhZ1trZXldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gaGFzRmxhZ3NNYXRjaGluZyhhcmcsIC4uLnBhdHRlcm5zKSB7XG4gICAgICAgICAgICBjb25zdCB0b0NoZWNrID0gW10uY29uY2F0KC4uLnBhdHRlcm5zKTtcbiAgICAgICAgICAgIHJldHVybiB0b0NoZWNrLnNvbWUoZnVuY3Rpb24gKHBhdHRlcm4pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXRjaCA9IGFyZy5tYXRjaChwYXR0ZXJuKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2ggJiYgaGFzQW55RmxhZyhtYXRjaFsxXSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBiYXNlZCBvbiBhIHNpbXBsaWZpZWQgdmVyc2lvbiBvZiB0aGUgc2hvcnQgZmxhZyBncm91cCBwYXJzaW5nIGxvZ2ljXG4gICAgICAgIGZ1bmN0aW9uIGhhc0FsbFNob3J0RmxhZ3MoYXJnKSB7XG4gICAgICAgICAgICAvLyBpZiB0aGlzIGlzIGEgbmVnYXRpdmUgbnVtYmVyLCBvciBkb2Vzbid0IHN0YXJ0IHdpdGggYSBzaW5nbGUgaHlwaGVuLCBpdCdzIG5vdCBhIHNob3J0IGZsYWcgZ3JvdXBcbiAgICAgICAgICAgIGlmIChhcmcubWF0Y2gobmVnYXRpdmUpIHx8ICFhcmcubWF0Y2goL14tW14tXSsvKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBoYXNBbGxGbGFncyA9IHRydWU7XG4gICAgICAgICAgICBsZXQgbmV4dDtcbiAgICAgICAgICAgIGNvbnN0IGxldHRlcnMgPSBhcmcuc2xpY2UoMSkuc3BsaXQoJycpO1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBsZXR0ZXJzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgbmV4dCA9IGFyZy5zbGljZShqICsgMik7XG4gICAgICAgICAgICAgICAgaWYgKCFoYXNBbnlGbGFnKGxldHRlcnNbal0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGhhc0FsbEZsYWdzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoKGxldHRlcnNbaiArIDFdICYmIGxldHRlcnNbaiArIDFdID09PSAnPScpIHx8XG4gICAgICAgICAgICAgICAgICAgIG5leHQgPT09ICctJyB8fFxuICAgICAgICAgICAgICAgICAgICAoL1tBLVphLXpdLy50ZXN0KGxldHRlcnNbal0pICYmIC9eLT9cXGQrKFxcLlxcZCopPyhlLT9cXGQrKT8kLy50ZXN0KG5leHQpKSB8fFxuICAgICAgICAgICAgICAgICAgICAobGV0dGVyc1tqICsgMV0gJiYgbGV0dGVyc1tqICsgMV0ubWF0Y2goL1xcVy8pKSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaGFzQWxsRmxhZ3M7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gaXNVbmtub3duT3B0aW9uQXNBcmcoYXJnKSB7XG4gICAgICAgICAgICByZXR1cm4gY29uZmlndXJhdGlvblsndW5rbm93bi1vcHRpb25zLWFzLWFyZ3MnXSAmJiBpc1Vua25vd25PcHRpb24oYXJnKTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBpc1Vua25vd25PcHRpb24oYXJnKSB7XG4gICAgICAgICAgICBhcmcgPSBhcmcucmVwbGFjZSgvXi17Myx9LywgJy0tJyk7XG4gICAgICAgICAgICAvLyBpZ25vcmUgbmVnYXRpdmUgbnVtYmVyc1xuICAgICAgICAgICAgaWYgKGFyZy5tYXRjaChuZWdhdGl2ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBpZiB0aGlzIGlzIGEgc2hvcnQgb3B0aW9uIGdyb3VwIGFuZCBhbGwgb2YgdGhlbSBhcmUgY29uZmlndXJlZCwgaXQgaXNuJ3QgdW5rbm93blxuICAgICAgICAgICAgaWYgKGhhc0FsbFNob3J0RmxhZ3MoYXJnKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGUuZy4gJy0tY291bnQ9MidcbiAgICAgICAgICAgIGNvbnN0IGZsYWdXaXRoRXF1YWxzID0gL14tKyhbXj1dKz8pPVtcXHNcXFNdKiQvO1xuICAgICAgICAgICAgLy8gZS5nLiAnLWEnIG9yICctLWFyZydcbiAgICAgICAgICAgIGNvbnN0IG5vcm1hbEZsYWcgPSAvXi0rKFtePV0rPykkLztcbiAgICAgICAgICAgIC8vIGUuZy4gJy1hLSdcbiAgICAgICAgICAgIGNvbnN0IGZsYWdFbmRpbmdJbkh5cGhlbiA9IC9eLSsoW149XSs/KS0kLztcbiAgICAgICAgICAgIC8vIGUuZy4gJy1hYmMxMjMnXG4gICAgICAgICAgICBjb25zdCBmbGFnRW5kaW5nSW5EaWdpdHMgPSAvXi0rKFtePV0rP1xcZCspJC87XG4gICAgICAgICAgICAvLyBlLmcuICctYS91c3IvbG9jYWwnXG4gICAgICAgICAgICBjb25zdCBmbGFnRW5kaW5nSW5Ob25Xb3JkQ2hhcmFjdGVycyA9IC9eLSsoW149XSs/KVxcVysuKiQvO1xuICAgICAgICAgICAgLy8gY2hlY2sgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBmbGFnIHN0eWxlcywgaW5jbHVkaW5nIG5lZ2F0ZWRCb29sZWFuLCBhIHBhdHRlcm4gZGVmaW5lZCBuZWFyIHRoZSBzdGFydCBvZiB0aGUgcGFyc2UgbWV0aG9kXG4gICAgICAgICAgICByZXR1cm4gIWhhc0ZsYWdzTWF0Y2hpbmcoYXJnLCBmbGFnV2l0aEVxdWFscywgbmVnYXRlZEJvb2xlYW4sIG5vcm1hbEZsYWcsIGZsYWdFbmRpbmdJbkh5cGhlbiwgZmxhZ0VuZGluZ0luRGlnaXRzLCBmbGFnRW5kaW5nSW5Ob25Xb3JkQ2hhcmFjdGVycyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbWFrZSBhIGJlc3QgZWZmb3J0IHRvIHBpY2sgYSBkZWZhdWx0IHZhbHVlXG4gICAgICAgIC8vIGZvciBhbiBvcHRpb24gYmFzZWQgb24gbmFtZSBhbmQgdHlwZS5cbiAgICAgICAgZnVuY3Rpb24gZGVmYXVsdFZhbHVlKGtleSkge1xuICAgICAgICAgICAgaWYgKCFjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5ib29scykgJiZcbiAgICAgICAgICAgICAgICAhY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuY291bnRzKSAmJlxuICAgICAgICAgICAgICAgIGAke2tleX1gIGluIGRlZmF1bHRzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRzW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdEZvclR5cGUoZ3Vlc3NUeXBlKGtleSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIHJldHVybiBhIGRlZmF1bHQgdmFsdWUsIGdpdmVuIHRoZSB0eXBlIG9mIGEgZmxhZy4sXG4gICAgICAgIGZ1bmN0aW9uIGRlZmF1bHRGb3JUeXBlKHR5cGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlZiA9IHtcbiAgICAgICAgICAgICAgICBbRGVmYXVsdFZhbHVlc0ZvclR5cGVLZXkuQk9PTEVBTl06IHRydWUsXG4gICAgICAgICAgICAgICAgW0RlZmF1bHRWYWx1ZXNGb3JUeXBlS2V5LlNUUklOR106ICcnLFxuICAgICAgICAgICAgICAgIFtEZWZhdWx0VmFsdWVzRm9yVHlwZUtleS5OVU1CRVJdOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgW0RlZmF1bHRWYWx1ZXNGb3JUeXBlS2V5LkFSUkFZXTogW11cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gZGVmW3R5cGVdO1xuICAgICAgICB9XG4gICAgICAgIC8vIGdpdmVuIGEgZmxhZywgZW5mb3JjZSBhIGRlZmF1bHQgdHlwZS5cbiAgICAgICAgZnVuY3Rpb24gZ3Vlc3NUeXBlKGtleSkge1xuICAgICAgICAgICAgbGV0IHR5cGUgPSBEZWZhdWx0VmFsdWVzRm9yVHlwZUtleS5CT09MRUFOO1xuICAgICAgICAgICAgaWYgKGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLnN0cmluZ3MpKVxuICAgICAgICAgICAgICAgIHR5cGUgPSBEZWZhdWx0VmFsdWVzRm9yVHlwZUtleS5TVFJJTkc7XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5udW1iZXJzKSlcbiAgICAgICAgICAgICAgICB0eXBlID0gRGVmYXVsdFZhbHVlc0ZvclR5cGVLZXkuTlVNQkVSO1xuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYm9vbHMpKVxuICAgICAgICAgICAgICAgIHR5cGUgPSBEZWZhdWx0VmFsdWVzRm9yVHlwZUtleS5CT09MRUFOO1xuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYXJyYXlzKSlcbiAgICAgICAgICAgICAgICB0eXBlID0gRGVmYXVsdFZhbHVlc0ZvclR5cGVLZXkuQVJSQVk7XG4gICAgICAgICAgICByZXR1cm4gdHlwZTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBpc1VuZGVmaW5lZChudW0pIHtcbiAgICAgICAgICAgIHJldHVybiBudW0gPT09IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBjaGVjayB1c2VyIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgZm9yIGluY29uc2lzdGVuY2llc1xuICAgICAgICBmdW5jdGlvbiBjaGVja0NvbmZpZ3VyYXRpb24oKSB7XG4gICAgICAgICAgICAvLyBjb3VudCBrZXlzIHNob3VsZCBub3QgYmUgc2V0IGFzIGFycmF5L25hcmdcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGZsYWdzLmNvdW50cykuZmluZChrZXkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5hcnJheXMpKSB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yID0gRXJyb3IoX18oJ0ludmFsaWQgY29uZmlndXJhdGlvbjogJXMsIG9wdHMuY291bnQgZXhjbHVkZXMgb3B0cy5hcnJheS4nLCBrZXkpKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLm5hcmdzKSkge1xuICAgICAgICAgICAgICAgICAgICBlcnJvciA9IEVycm9yKF9fKCdJbnZhbGlkIGNvbmZpZ3VyYXRpb246ICVzLCBvcHRzLmNvdW50IGV4Y2x1ZGVzIG9wdHMubmFyZy4nLCBrZXkpKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhbGlhc2VzOiBPYmplY3QuYXNzaWduKHt9LCBmbGFncy5hbGlhc2VzKSxcbiAgICAgICAgICAgIGFyZ3Y6IE9iamVjdC5hc3NpZ24oYXJndlJldHVybiwgYXJndiksXG4gICAgICAgICAgICBjb25maWd1cmF0aW9uOiBjb25maWd1cmF0aW9uLFxuICAgICAgICAgICAgZGVmYXVsdGVkOiBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0ZWQpLFxuICAgICAgICAgICAgZXJyb3I6IGVycm9yLFxuICAgICAgICAgICAgbmV3QWxpYXNlczogT2JqZWN0LmFzc2lnbih7fSwgbmV3QWxpYXNlcylcbiAgICAgICAgfTtcbiAgICB9XG59XG4vLyBpZiBhbnkgYWxpYXNlcyByZWZlcmVuY2UgZWFjaCBvdGhlciwgd2Ugc2hvdWxkXG4vLyBtZXJnZSB0aGVtIHRvZ2V0aGVyLlxuZnVuY3Rpb24gY29tYmluZUFsaWFzZXMoYWxpYXNlcykge1xuICAgIGNvbnN0IGFsaWFzQXJyYXlzID0gW107XG4gICAgY29uc3QgY29tYmluZWQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGxldCBjaGFuZ2UgPSB0cnVlO1xuICAgIC8vIHR1cm4gYWxpYXMgbG9va3VwIGhhc2gge2tleTogWydhbGlhczEnLCAnYWxpYXMyJ119IGludG9cbiAgICAvLyBhIHNpbXBsZSBhcnJheSBbJ2tleScsICdhbGlhczEnLCAnYWxpYXMyJ11cbiAgICBPYmplY3Qua2V5cyhhbGlhc2VzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgYWxpYXNBcnJheXMucHVzaChbXS5jb25jYXQoYWxpYXNlc1trZXldLCBrZXkpKTtcbiAgICB9KTtcbiAgICAvLyBjb21iaW5lIGFycmF5cyB1bnRpbCB6ZXJvIGNoYW5nZXMgYXJlXG4gICAgLy8gbWFkZSBpbiBhbiBpdGVyYXRpb24uXG4gICAgd2hpbGUgKGNoYW5nZSkge1xuICAgICAgICBjaGFuZ2UgPSBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbGlhc0FycmF5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgaWkgPSBpICsgMTsgaWkgPCBhbGlhc0FycmF5cy5sZW5ndGg7IGlpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbnRlcnNlY3QgPSBhbGlhc0FycmF5c1tpXS5maWx0ZXIoZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFsaWFzQXJyYXlzW2lpXS5pbmRleE9mKHYpICE9PSAtMTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoaW50ZXJzZWN0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBhbGlhc0FycmF5c1tpXSA9IGFsaWFzQXJyYXlzW2ldLmNvbmNhdChhbGlhc0FycmF5c1tpaV0pO1xuICAgICAgICAgICAgICAgICAgICBhbGlhc0FycmF5cy5zcGxpY2UoaWksIDEpO1xuICAgICAgICAgICAgICAgICAgICBjaGFuZ2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gbWFwIGFycmF5cyBiYWNrIHRvIHRoZSBoYXNoLWxvb2t1cCAoZGUtZHVwZSB3aGlsZVxuICAgIC8vIHdlJ3JlIGF0IGl0KS5cbiAgICBhbGlhc0FycmF5cy5mb3JFYWNoKGZ1bmN0aW9uIChhbGlhc0FycmF5KSB7XG4gICAgICAgIGFsaWFzQXJyYXkgPSBhbGlhc0FycmF5LmZpbHRlcihmdW5jdGlvbiAodiwgaSwgc2VsZikge1xuICAgICAgICAgICAgcmV0dXJuIHNlbGYuaW5kZXhPZih2KSA9PT0gaTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGxhc3RBbGlhcyA9IGFsaWFzQXJyYXkucG9wKCk7XG4gICAgICAgIGlmIChsYXN0QWxpYXMgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgbGFzdEFsaWFzID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29tYmluZWRbbGFzdEFsaWFzXSA9IGFsaWFzQXJyYXk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gY29tYmluZWQ7XG59XG4vLyB0aGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuIGEgY291bnQgaXMgZ2l2ZW4gYXMgYW4gYXJnXG4vLyBpdCBpcyBOT1QgY2FsbGVkIHRvIHNldCBhIGRlZmF1bHQgdmFsdWVcbi8vIHRodXMgd2UgY2FuIHN0YXJ0IHRoZSBjb3VudCBhdCAxIGluc3RlYWQgb2YgMFxuZnVuY3Rpb24gaW5jcmVtZW50KG9yaWcpIHtcbiAgICByZXR1cm4gb3JpZyAhPT0gdW5kZWZpbmVkID8gb3JpZyArIDEgOiAxO1xufVxuLy8gVE9ETyhiY29lKTogaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvbiBvZiB5YXJncywgc3dpdGNoIHRvXG4vLyBPYmplY3QuY3JlYXRlKG51bGwpIGZvciBkb3Qgbm90YXRpb246XG5mdW5jdGlvbiBzYW5pdGl6ZUtleShrZXkpIHtcbiAgICBpZiAoa2V5ID09PSAnX19wcm90b19fJylcbiAgICAgICAgcmV0dXJuICdfX19wcm90b19fXyc7XG4gICAgcmV0dXJuIGtleTtcbn1cbmZ1bmN0aW9uIHN0cmlwUXVvdGVzKHZhbCkge1xuICAgIHJldHVybiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgKHZhbFswXSA9PT0gXCInXCIgfHwgdmFsWzBdID09PSAnXCInKSAmJlxuICAgICAgICB2YWxbdmFsLmxlbmd0aCAtIDFdID09PSB2YWxbMF0pXG4gICAgICAgID8gdmFsLnN1YnN0cmluZygxLCB2YWwubGVuZ3RoIC0gMSlcbiAgICAgICAgOiB2YWw7XG59XG4iLCIvKipcbiAqIEBmaWxlb3ZlcnZpZXcgTWFpbiBlbnRyeXBvaW50IGZvciBsaWJyYXJpZXMgdXNpbmcgeWFyZ3MtcGFyc2VyIGluIE5vZGUuanNcbiAqIENKUyBhbmQgRVNNIGVudmlyb25tZW50cy5cbiAqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IChjKSAyMDE2LCBDb250cmlidXRvcnNcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBJU0NcbiAqL1xudmFyIF9hLCBfYiwgX2M7XG5pbXBvcnQgeyBmb3JtYXQgfSBmcm9tICd1dGlsJztcbmltcG9ydCB7IG5vcm1hbGl6ZSwgcmVzb2x2ZSB9IGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgY2FtZWxDYXNlLCBkZWNhbWVsaXplLCBsb29rc0xpa2VOdW1iZXIgfSBmcm9tICcuL3N0cmluZy11dGlscy5qcyc7XG5pbXBvcnQgeyBZYXJnc1BhcnNlciB9IGZyb20gJy4veWFyZ3MtcGFyc2VyLmpzJztcbmltcG9ydCB7IHJlYWRGaWxlU3luYyB9IGZyb20gJ2ZzJztcbi8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20veWFyZ3MveWFyZ3MtcGFyc2VyI3N1cHBvcnRlZC1ub2RlanMtdmVyc2lvbnMgZm9yIG91clxuLy8gdmVyc2lvbiBzdXBwb3J0IHBvbGljeS4gVGhlIFlBUkdTX01JTl9OT0RFX1ZFUlNJT04gaXMgdXNlZCBmb3IgdGVzdGluZyBvbmx5LlxuY29uc3QgbWluTm9kZVZlcnNpb24gPSAocHJvY2VzcyAmJiBwcm9jZXNzLmVudiAmJiBwcm9jZXNzLmVudi5ZQVJHU19NSU5fTk9ERV9WRVJTSU9OKVxuICAgID8gTnVtYmVyKHByb2Nlc3MuZW52LllBUkdTX01JTl9OT0RFX1ZFUlNJT04pXG4gICAgOiAxMjtcbmNvbnN0IG5vZGVWZXJzaW9uID0gKF9iID0gKF9hID0gcHJvY2VzcyA9PT0gbnVsbCB8fCBwcm9jZXNzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwcm9jZXNzLnZlcnNpb25zKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Eubm9kZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogKF9jID0gcHJvY2VzcyA9PT0gbnVsbCB8fCBwcm9jZXNzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwcm9jZXNzLnZlcnNpb24pID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5zbGljZSgxKTtcbmlmIChub2RlVmVyc2lvbikge1xuICAgIGNvbnN0IG1ham9yID0gTnVtYmVyKG5vZGVWZXJzaW9uLm1hdGNoKC9eKFteLl0rKS8pWzFdKTtcbiAgICBpZiAobWFqb3IgPCBtaW5Ob2RlVmVyc2lvbikge1xuICAgICAgICB0aHJvdyBFcnJvcihgeWFyZ3MgcGFyc2VyIHN1cHBvcnRzIGEgbWluaW11bSBOb2RlLmpzIHZlcnNpb24gb2YgJHttaW5Ob2RlVmVyc2lvbn0uIFJlYWQgb3VyIHZlcnNpb24gc3VwcG9ydCBwb2xpY3k6IGh0dHBzOi8vZ2l0aHViLmNvbS95YXJncy95YXJncy1wYXJzZXIjc3VwcG9ydGVkLW5vZGVqcy12ZXJzaW9uc2ApO1xuICAgIH1cbn1cbi8vIENyZWF0ZXMgYSB5YXJncy1wYXJzZXIgaW5zdGFuY2UgdXNpbmcgTm9kZS5qcyBzdGFuZGFyZCBsaWJyYXJpZXM6XG5jb25zdCBlbnYgPSBwcm9jZXNzID8gcHJvY2Vzcy5lbnYgOiB7fTtcbmNvbnN0IHBhcnNlciA9IG5ldyBZYXJnc1BhcnNlcih7XG4gICAgY3dkOiBwcm9jZXNzLmN3ZCxcbiAgICBlbnY6ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIGVudjtcbiAgICB9LFxuICAgIGZvcm1hdCxcbiAgICBub3JtYWxpemUsXG4gICAgcmVzb2x2ZSxcbiAgICAvLyBUT0RPOiBmaWd1cmUgIG91dCBhICB3YXkgdG8gY29tYmluZSBFU00gYW5kIENKUyBjb3ZlcmFnZSwgc3VjaCAgdGhhdFxuICAgIC8vIHdlIGNhbiBleGVyY2lzZSBhbGwgdGhlIGxpbmVzIGJlbG93OlxuICAgIHJlcXVpcmU6IChwYXRoKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgcmVxdWlyZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJldHVybiByZXF1aXJlKHBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHBhdGgubWF0Y2goL1xcLmpzb24kLykpIHtcbiAgICAgICAgICAgIC8vIEFkZHJlc3NlczogaHR0cHM6Ly9naXRodWIuY29tL3lhcmdzL3lhcmdzL2lzc3Vlcy8yMDQwXG4gICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShyZWFkRmlsZVN5bmMocGF0aCwgJ3V0ZjgnKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcignb25seSAuanNvbiBjb25maWcgZmlsZXMgYXJlIHN1cHBvcnRlZCBpbiBFU00nKTtcbiAgICAgICAgfVxuICAgIH1cbn0pO1xuY29uc3QgeWFyZ3NQYXJzZXIgPSBmdW5jdGlvbiBQYXJzZXIoYXJncywgb3B0cykge1xuICAgIGNvbnN0IHJlc3VsdCA9IHBhcnNlci5wYXJzZShhcmdzLnNsaWNlKCksIG9wdHMpO1xuICAgIHJldHVybiByZXN1bHQuYXJndjtcbn07XG55YXJnc1BhcnNlci5kZXRhaWxlZCA9IGZ1bmN0aW9uIChhcmdzLCBvcHRzKSB7XG4gICAgcmV0dXJuIHBhcnNlci5wYXJzZShhcmdzLnNsaWNlKCksIG9wdHMpO1xufTtcbnlhcmdzUGFyc2VyLmNhbWVsQ2FzZSA9IGNhbWVsQ2FzZTtcbnlhcmdzUGFyc2VyLmRlY2FtZWxpemUgPSBkZWNhbWVsaXplO1xueWFyZ3NQYXJzZXIubG9va3NMaWtlTnVtYmVyID0gbG9va3NMaWtlTnVtYmVyO1xuZXhwb3J0IGRlZmF1bHQgeWFyZ3NQYXJzZXI7XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYsIENvbnRyaWJ1dG9yc1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IElTQ1xuICovXG4vLyB0YWtlIGFuIHVuLXNwbGl0IGFyZ3Ygc3RyaW5nIGFuZCB0b2tlbml6ZSBpdC5cbmV4cG9ydCBmdW5jdGlvbiB0b2tlbml6ZUFyZ1N0cmluZyhhcmdTdHJpbmcpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhcmdTdHJpbmcpKSB7XG4gICAgICAgIHJldHVybiBhcmdTdHJpbmcubWFwKGUgPT4gdHlwZW9mIGUgIT09ICdzdHJpbmcnID8gZSArICcnIDogZSk7XG4gICAgfVxuICAgIGFyZ1N0cmluZyA9IGFyZ1N0cmluZy50cmltKCk7XG4gICAgbGV0IGkgPSAwO1xuICAgIGxldCBwcmV2QyA9IG51bGw7XG4gICAgbGV0IGMgPSBudWxsO1xuICAgIGxldCBvcGVuaW5nID0gbnVsbDtcbiAgICBjb25zdCBhcmdzID0gW107XG4gICAgZm9yIChsZXQgaWkgPSAwOyBpaSA8IGFyZ1N0cmluZy5sZW5ndGg7IGlpKyspIHtcbiAgICAgICAgcHJldkMgPSBjO1xuICAgICAgICBjID0gYXJnU3RyaW5nLmNoYXJBdChpaSk7XG4gICAgICAgIC8vIHNwbGl0IG9uIHNwYWNlcyB1bmxlc3Mgd2UncmUgaW4gcXVvdGVzLlxuICAgICAgICBpZiAoYyA9PT0gJyAnICYmICFvcGVuaW5nKSB7XG4gICAgICAgICAgICBpZiAoIShwcmV2QyA9PT0gJyAnKSkge1xuICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIGRvbid0IHNwbGl0IHRoZSBzdHJpbmcgaWYgd2UncmUgaW4gbWF0Y2hpbmdcbiAgICAgICAgLy8gb3BlbmluZyBvciBjbG9zaW5nIHNpbmdsZSBhbmQgZG91YmxlIHF1b3Rlcy5cbiAgICAgICAgaWYgKGMgPT09IG9wZW5pbmcpIHtcbiAgICAgICAgICAgIG9wZW5pbmcgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKChjID09PSBcIidcIiB8fCBjID09PSAnXCInKSAmJiAhb3BlbmluZykge1xuICAgICAgICAgICAgb3BlbmluZyA9IGM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFhcmdzW2ldKVxuICAgICAgICAgICAgYXJnc1tpXSA9ICcnO1xuICAgICAgICBhcmdzW2ldICs9IGM7XG4gICAgfVxuICAgIHJldHVybiBhcmdzO1xufVxuIiwiZnVuY3Rpb24gZ2V0UHJvY2Vzc0FyZ3ZCaW5JbmRleCgpIHtcbiAgICBpZiAoaXNCdW5kbGVkRWxlY3Ryb25BcHAoKSlcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgcmV0dXJuIDE7XG59XG5mdW5jdGlvbiBpc0J1bmRsZWRFbGVjdHJvbkFwcCgpIHtcbiAgICByZXR1cm4gaXNFbGVjdHJvbkFwcCgpICYmICFwcm9jZXNzLmRlZmF1bHRBcHA7XG59XG5mdW5jdGlvbiBpc0VsZWN0cm9uQXBwKCkge1xuICAgIHJldHVybiAhIXByb2Nlc3MudmVyc2lvbnMuZWxlY3Ryb247XG59XG5leHBvcnQgZnVuY3Rpb24gaGlkZUJpbihhcmd2KSB7XG4gICAgcmV0dXJuIGFyZ3Yuc2xpY2UoZ2V0UHJvY2Vzc0FyZ3ZCaW5JbmRleCgpICsgMSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0UHJvY2Vzc0FyZ3ZCaW4oKSB7XG4gICAgcmV0dXJuIHByb2Nlc3MuYXJndltnZXRQcm9jZXNzQXJndkJpbkluZGV4KCldO1xufVxuIiwiZXhwb3J0IGNsYXNzIFlFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3Rvcihtc2cpIHtcbiAgICAgICAgc3VwZXIobXNnIHx8ICd5YXJncyBlcnJvcicpO1xuICAgICAgICB0aGlzLm5hbWUgPSAnWUVycm9yJztcbiAgICAgICAgaWYgKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKSB7XG4gICAgICAgICAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBZRXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgcmVhZEZpbGVTeW5jLCBzdGF0U3luYywgd3JpdGVGaWxlIH0gZnJvbSAnZnMnO1xuaW1wb3J0IHsgZm9ybWF0IH0gZnJvbSAndXRpbCc7XG5pbXBvcnQgeyByZXNvbHZlIH0gZnJvbSAncGF0aCc7XG5leHBvcnQgZGVmYXVsdCB7XG4gICAgZnM6IHtcbiAgICAgICAgcmVhZEZpbGVTeW5jLFxuICAgICAgICB3cml0ZUZpbGVcbiAgICB9LFxuICAgIGZvcm1hdCxcbiAgICByZXNvbHZlLFxuICAgIGV4aXN0czogKGZpbGUpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBzdGF0U3luYyhmaWxlKS5pc0ZpbGUoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG59O1xuIiwibGV0IHNoaW07XG5jbGFzcyBZMThOIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIC8vIGNvbmZpZ3VyYWJsZSBvcHRpb25zLlxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fTtcbiAgICAgICAgdGhpcy5kaXJlY3RvcnkgPSBvcHRzLmRpcmVjdG9yeSB8fCAnLi9sb2NhbGVzJztcbiAgICAgICAgdGhpcy51cGRhdGVGaWxlcyA9IHR5cGVvZiBvcHRzLnVwZGF0ZUZpbGVzID09PSAnYm9vbGVhbicgPyBvcHRzLnVwZGF0ZUZpbGVzIDogdHJ1ZTtcbiAgICAgICAgdGhpcy5sb2NhbGUgPSBvcHRzLmxvY2FsZSB8fCAnZW4nO1xuICAgICAgICB0aGlzLmZhbGxiYWNrVG9MYW5ndWFnZSA9IHR5cGVvZiBvcHRzLmZhbGxiYWNrVG9MYW5ndWFnZSA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5mYWxsYmFja1RvTGFuZ3VhZ2UgOiB0cnVlO1xuICAgICAgICAvLyBpbnRlcm5hbCBzdHVmZi5cbiAgICAgICAgdGhpcy5jYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIHRoaXMud3JpdGVRdWV1ZSA9IFtdO1xuICAgIH1cbiAgICBfXyguLi5hcmdzKSB7XG4gICAgICAgIGlmICh0eXBlb2YgYXJndW1lbnRzWzBdICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3RhZ2dlZExpdGVyYWwoYXJndW1lbnRzWzBdLCAuLi5hcmd1bWVudHMpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0ciA9IGFyZ3Muc2hpZnQoKTtcbiAgICAgICAgbGV0IGNiID0gZnVuY3Rpb24gKCkgeyB9OyAvLyBzdGFydCB3aXRoIG5vb3AuXG4gICAgICAgIGlmICh0eXBlb2YgYXJnc1thcmdzLmxlbmd0aCAtIDFdID09PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgY2IgPSBhcmdzLnBvcCgpO1xuICAgICAgICBjYiA9IGNiIHx8IGZ1bmN0aW9uICgpIHsgfTsgLy8gbm9vcC5cbiAgICAgICAgaWYgKCF0aGlzLmNhY2hlW3RoaXMubG9jYWxlXSlcbiAgICAgICAgICAgIHRoaXMuX3JlYWRMb2NhbGVGaWxlKCk7XG4gICAgICAgIC8vIHdlJ3ZlIG9ic2VydmVkIGEgbmV3IHN0cmluZywgdXBkYXRlIHRoZSBsYW5ndWFnZSBmaWxlLlxuICAgICAgICBpZiAoIXRoaXMuY2FjaGVbdGhpcy5sb2NhbGVdW3N0cl0gJiYgdGhpcy51cGRhdGVGaWxlcykge1xuICAgICAgICAgICAgdGhpcy5jYWNoZVt0aGlzLmxvY2FsZV1bc3RyXSA9IHN0cjtcbiAgICAgICAgICAgIC8vIGluY2x1ZGUgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGFuZCBsb2NhbGUsXG4gICAgICAgICAgICAvLyBzaW5jZSB0aGVzZSB2YWx1ZXMgY291bGQgY2hhbmdlIGJlZm9yZSB0aGVcbiAgICAgICAgICAgIC8vIHdyaXRlIGlzIHBlcmZvcm1lZC5cbiAgICAgICAgICAgIHRoaXMuX2VucXVldWVXcml0ZSh7XG4gICAgICAgICAgICAgICAgZGlyZWN0b3J5OiB0aGlzLmRpcmVjdG9yeSxcbiAgICAgICAgICAgICAgICBsb2NhbGU6IHRoaXMubG9jYWxlLFxuICAgICAgICAgICAgICAgIGNiXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNiKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNoaW0uZm9ybWF0LmFwcGx5KHNoaW0uZm9ybWF0LCBbdGhpcy5jYWNoZVt0aGlzLmxvY2FsZV1bc3RyXSB8fCBzdHJdLmNvbmNhdChhcmdzKSk7XG4gICAgfVxuICAgIF9fbigpIHtcbiAgICAgICAgY29uc3QgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG4gICAgICAgIGNvbnN0IHNpbmd1bGFyID0gYXJncy5zaGlmdCgpO1xuICAgICAgICBjb25zdCBwbHVyYWwgPSBhcmdzLnNoaWZ0KCk7XG4gICAgICAgIGNvbnN0IHF1YW50aXR5ID0gYXJncy5zaGlmdCgpO1xuICAgICAgICBsZXQgY2IgPSBmdW5jdGlvbiAoKSB7IH07IC8vIHN0YXJ0IHdpdGggbm9vcC5cbiAgICAgICAgaWYgKHR5cGVvZiBhcmdzW2FyZ3MubGVuZ3RoIC0gMV0gPT09ICdmdW5jdGlvbicpXG4gICAgICAgICAgICBjYiA9IGFyZ3MucG9wKCk7XG4gICAgICAgIGlmICghdGhpcy5jYWNoZVt0aGlzLmxvY2FsZV0pXG4gICAgICAgICAgICB0aGlzLl9yZWFkTG9jYWxlRmlsZSgpO1xuICAgICAgICBsZXQgc3RyID0gcXVhbnRpdHkgPT09IDEgPyBzaW5ndWxhciA6IHBsdXJhbDtcbiAgICAgICAgaWYgKHRoaXMuY2FjaGVbdGhpcy5sb2NhbGVdW3Npbmd1bGFyXSkge1xuICAgICAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmNhY2hlW3RoaXMubG9jYWxlXVtzaW5ndWxhcl07XG4gICAgICAgICAgICBzdHIgPSBlbnRyeVtxdWFudGl0eSA9PT0gMSA/ICdvbmUnIDogJ290aGVyJ107XG4gICAgICAgIH1cbiAgICAgICAgLy8gd2UndmUgb2JzZXJ2ZWQgYSBuZXcgc3RyaW5nLCB1cGRhdGUgdGhlIGxhbmd1YWdlIGZpbGUuXG4gICAgICAgIGlmICghdGhpcy5jYWNoZVt0aGlzLmxvY2FsZV1bc2luZ3VsYXJdICYmIHRoaXMudXBkYXRlRmlsZXMpIHtcbiAgICAgICAgICAgIHRoaXMuY2FjaGVbdGhpcy5sb2NhbGVdW3Npbmd1bGFyXSA9IHtcbiAgICAgICAgICAgICAgICBvbmU6IHNpbmd1bGFyLFxuICAgICAgICAgICAgICAgIG90aGVyOiBwbHVyYWxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICAvLyBpbmNsdWRlIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBhbmQgbG9jYWxlLFxuICAgICAgICAgICAgLy8gc2luY2UgdGhlc2UgdmFsdWVzIGNvdWxkIGNoYW5nZSBiZWZvcmUgdGhlXG4gICAgICAgICAgICAvLyB3cml0ZSBpcyBwZXJmb3JtZWQuXG4gICAgICAgICAgICB0aGlzLl9lbnF1ZXVlV3JpdGUoe1xuICAgICAgICAgICAgICAgIGRpcmVjdG9yeTogdGhpcy5kaXJlY3RvcnksXG4gICAgICAgICAgICAgICAgbG9jYWxlOiB0aGlzLmxvY2FsZSxcbiAgICAgICAgICAgICAgICBjYlxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjYigpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGlmIGEgJWQgcGxhY2Vob2xkZXIgaXMgcHJvdmlkZWQsIGFkZCBxdWFudGl0eVxuICAgICAgICAvLyB0byB0aGUgYXJndW1lbnRzIGV4cGFuZGVkIGJ5IHV0aWwuZm9ybWF0LlxuICAgICAgICBjb25zdCB2YWx1ZXMgPSBbc3RyXTtcbiAgICAgICAgaWYgKH5zdHIuaW5kZXhPZignJWQnKSlcbiAgICAgICAgICAgIHZhbHVlcy5wdXNoKHF1YW50aXR5KTtcbiAgICAgICAgcmV0dXJuIHNoaW0uZm9ybWF0LmFwcGx5KHNoaW0uZm9ybWF0LCB2YWx1ZXMuY29uY2F0KGFyZ3MpKTtcbiAgICB9XG4gICAgc2V0TG9jYWxlKGxvY2FsZSkge1xuICAgICAgICB0aGlzLmxvY2FsZSA9IGxvY2FsZTtcbiAgICB9XG4gICAgZ2V0TG9jYWxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGU7XG4gICAgfVxuICAgIHVwZGF0ZUxvY2FsZShvYmopIHtcbiAgICAgICAgaWYgKCF0aGlzLmNhY2hlW3RoaXMubG9jYWxlXSlcbiAgICAgICAgICAgIHRoaXMuX3JlYWRMb2NhbGVGaWxlKCk7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNhY2hlW3RoaXMubG9jYWxlXVtrZXldID0gb2JqW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgX3RhZ2dlZExpdGVyYWwocGFydHMsIC4uLmFyZ3MpIHtcbiAgICAgICAgbGV0IHN0ciA9ICcnO1xuICAgICAgICBwYXJ0cy5mb3JFYWNoKGZ1bmN0aW9uIChwYXJ0LCBpKSB7XG4gICAgICAgICAgICBjb25zdCBhcmcgPSBhcmdzW2kgKyAxXTtcbiAgICAgICAgICAgIHN0ciArPSBwYXJ0O1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBhcmcgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgc3RyICs9ICclcyc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5fXy5hcHBseSh0aGlzLCBbc3RyXS5jb25jYXQoW10uc2xpY2UuY2FsbChhcmdzLCAxKSkpO1xuICAgIH1cbiAgICBfZW5xdWV1ZVdyaXRlKHdvcmspIHtcbiAgICAgICAgdGhpcy53cml0ZVF1ZXVlLnB1c2god29yayk7XG4gICAgICAgIGlmICh0aGlzLndyaXRlUXVldWUubGVuZ3RoID09PSAxKVxuICAgICAgICAgICAgdGhpcy5fcHJvY2Vzc1dyaXRlUXVldWUoKTtcbiAgICB9XG4gICAgX3Byb2Nlc3NXcml0ZVF1ZXVlKCkge1xuICAgICAgICBjb25zdCBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGNvbnN0IHdvcmsgPSB0aGlzLndyaXRlUXVldWVbMF07XG4gICAgICAgIC8vIGRlc3RydWN0dXJlIHRoZSBlbnF1ZXVlZCB3b3JrLlxuICAgICAgICBjb25zdCBkaXJlY3RvcnkgPSB3b3JrLmRpcmVjdG9yeTtcbiAgICAgICAgY29uc3QgbG9jYWxlID0gd29yay5sb2NhbGU7XG4gICAgICAgIGNvbnN0IGNiID0gd29yay5jYjtcbiAgICAgICAgY29uc3QgbGFuZ3VhZ2VGaWxlID0gdGhpcy5fcmVzb2x2ZUxvY2FsZUZpbGUoZGlyZWN0b3J5LCBsb2NhbGUpO1xuICAgICAgICBjb25zdCBzZXJpYWxpemVkTG9jYWxlID0gSlNPTi5zdHJpbmdpZnkodGhpcy5jYWNoZVtsb2NhbGVdLCBudWxsLCAyKTtcbiAgICAgICAgc2hpbS5mcy53cml0ZUZpbGUobGFuZ3VhZ2VGaWxlLCBzZXJpYWxpemVkTG9jYWxlLCAndXRmLTgnLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICBfdGhpcy53cml0ZVF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgICAgICBpZiAoX3RoaXMud3JpdGVRdWV1ZS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgIF90aGlzLl9wcm9jZXNzV3JpdGVRdWV1ZSgpO1xuICAgICAgICAgICAgY2IoZXJyKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIF9yZWFkTG9jYWxlRmlsZSgpIHtcbiAgICAgICAgbGV0IGxvY2FsZUxvb2t1cCA9IHt9O1xuICAgICAgICBjb25zdCBsYW5ndWFnZUZpbGUgPSB0aGlzLl9yZXNvbHZlTG9jYWxlRmlsZSh0aGlzLmRpcmVjdG9yeSwgdGhpcy5sb2NhbGUpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB1c2luZyBhIGJ1bmRsZXIgc3VjaCBhcyB3ZWJwYWNrLCByZWFkRmlsZVN5bmMgbWF5IG5vdCBiZSBkZWZpbmVkOlxuICAgICAgICAgICAgaWYgKHNoaW0uZnMucmVhZEZpbGVTeW5jKSB7XG4gICAgICAgICAgICAgICAgbG9jYWxlTG9va3VwID0gSlNPTi5wYXJzZShzaGltLmZzLnJlYWRGaWxlU3luYyhsYW5ndWFnZUZpbGUsICd1dGYtOCcpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBpZiAoZXJyIGluc3RhbmNlb2YgU3ludGF4RXJyb3IpIHtcbiAgICAgICAgICAgICAgICBlcnIubWVzc2FnZSA9ICdzeW50YXggZXJyb3IgaW4gJyArIGxhbmd1YWdlRmlsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlcnIuY29kZSA9PT0gJ0VOT0VOVCcpXG4gICAgICAgICAgICAgICAgbG9jYWxlTG9va3VwID0ge307XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2FjaGVbdGhpcy5sb2NhbGVdID0gbG9jYWxlTG9va3VwO1xuICAgIH1cbiAgICBfcmVzb2x2ZUxvY2FsZUZpbGUoZGlyZWN0b3J5LCBsb2NhbGUpIHtcbiAgICAgICAgbGV0IGZpbGUgPSBzaGltLnJlc29sdmUoZGlyZWN0b3J5LCAnLi8nLCBsb2NhbGUgKyAnLmpzb24nKTtcbiAgICAgICAgaWYgKHRoaXMuZmFsbGJhY2tUb0xhbmd1YWdlICYmICF0aGlzLl9maWxlRXhpc3RzU3luYyhmaWxlKSAmJiB+bG9jYWxlLmxhc3RJbmRleE9mKCdfJykpIHtcbiAgICAgICAgICAgIC8vIGF0dGVtcHQgZmFsbGJhY2sgdG8gbGFuZ3VhZ2Ugb25seVxuICAgICAgICAgICAgY29uc3QgbGFuZ3VhZ2VGaWxlID0gc2hpbS5yZXNvbHZlKGRpcmVjdG9yeSwgJy4vJywgbG9jYWxlLnNwbGl0KCdfJylbMF0gKyAnLmpzb24nKTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9maWxlRXhpc3RzU3luYyhsYW5ndWFnZUZpbGUpKVxuICAgICAgICAgICAgICAgIGZpbGUgPSBsYW5ndWFnZUZpbGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpbGU7XG4gICAgfVxuICAgIF9maWxlRXhpc3RzU3luYyhmaWxlKSB7XG4gICAgICAgIHJldHVybiBzaGltLmV4aXN0cyhmaWxlKTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24geTE4bihvcHRzLCBfc2hpbSkge1xuICAgIHNoaW0gPSBfc2hpbTtcbiAgICBjb25zdCB5MThuID0gbmV3IFkxOE4ob3B0cyk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgX186IHkxOG4uX18uYmluZCh5MThuKSxcbiAgICAgICAgX19uOiB5MThuLl9fbi5iaW5kKHkxOG4pLFxuICAgICAgICBzZXRMb2NhbGU6IHkxOG4uc2V0TG9jYWxlLmJpbmQoeTE4biksXG4gICAgICAgIGdldExvY2FsZTogeTE4bi5nZXRMb2NhbGUuYmluZCh5MThuKSxcbiAgICAgICAgdXBkYXRlTG9jYWxlOiB5MThuLnVwZGF0ZUxvY2FsZS5iaW5kKHkxOG4pLFxuICAgICAgICBsb2NhbGU6IHkxOG4ubG9jYWxlXG4gICAgfTtcbn1cbiIsImltcG9ydCBzaGltIGZyb20gJy4vYnVpbGQvbGliL3BsYXRmb3JtLXNoaW1zL25vZGUuanMnXG5pbXBvcnQgeyB5MThuIGFzIF95MThuIH0gZnJvbSAnLi9idWlsZC9saWIvaW5kZXguanMnXG5cbmNvbnN0IHkxOG4gPSAob3B0cykgPT4ge1xuICByZXR1cm4gX3kxOG4ob3B0cywgc2hpbSlcbn1cblxuZXhwb3J0IGRlZmF1bHQgeTE4blxuIiwiJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IG5vdFN0cmljdEVxdWFsLCBzdHJpY3RFcXVhbCB9IGZyb20gJ2Fzc2VydCdcbmltcG9ydCBjbGl1aSBmcm9tICdjbGl1aSdcbmltcG9ydCBlc2NhbGFkZSBmcm9tICdlc2NhbGFkZS9zeW5jJ1xuaW1wb3J0IHsgaW5zcGVjdCB9IGZyb20gJ3V0aWwnXG5pbXBvcnQgeyByZWFkRmlsZVN5bmMgfSBmcm9tICdmcydcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tICd1cmwnO1xuaW1wb3J0IFBhcnNlciBmcm9tICd5YXJncy1wYXJzZXInXG5pbXBvcnQgeyBiYXNlbmFtZSwgZGlybmFtZSwgZXh0bmFtZSwgcmVsYXRpdmUsIHJlc29sdmUgfSBmcm9tICdwYXRoJ1xuaW1wb3J0IHsgZ2V0UHJvY2Vzc0FyZ3ZCaW4gfSBmcm9tICcuLi8uLi9idWlsZC9saWIvdXRpbHMvcHJvY2Vzcy1hcmd2LmpzJ1xuaW1wb3J0IHsgWUVycm9yIH0gZnJvbSAnLi4vLi4vYnVpbGQvbGliL3llcnJvci5qcydcbmltcG9ydCB5MThuIGZyb20gJ3kxOG4nXG5cbmNvbnN0IFJFUVVJUkVfRVJST1IgPSAncmVxdWlyZSBpcyBub3Qgc3VwcG9ydGVkIGJ5IEVTTSdcbmNvbnN0IFJFUVVJUkVfRElSRUNUT1JZX0VSUk9SID0gJ2xvYWRpbmcgYSBkaXJlY3Rvcnkgb2YgY29tbWFuZHMgaXMgbm90IHN1cHBvcnRlZCB5ZXQgZm9yIEVTTSdcblxubGV0IF9fZGlybmFtZTtcbnRyeSB7XG4gIF9fZGlybmFtZSA9IGZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKTtcbn0gY2F0Y2ggKGUpIHtcbiAgX19kaXJuYW1lID0gcHJvY2Vzcy5jd2QoKTtcbn1cbmNvbnN0IG1haW5GaWxlbmFtZSA9IF9fZGlybmFtZS5zdWJzdHJpbmcoMCwgX19kaXJuYW1lLmxhc3RJbmRleE9mKCdub2RlX21vZHVsZXMnKSk7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgYXNzZXJ0OiB7XG4gICAgbm90U3RyaWN0RXF1YWwsXG4gICAgc3RyaWN0RXF1YWxcbiAgfSxcbiAgY2xpdWksXG4gIGZpbmRVcDogZXNjYWxhZGUsXG4gIGdldEVudjogKGtleSkgPT4ge1xuICAgIHJldHVybiBwcm9jZXNzLmVudltrZXldXG4gIH0sXG4gIGluc3BlY3QsXG4gIGdldENhbGxlckZpbGU6ICgpID0+IHtcbiAgICB0aHJvdyBuZXcgWUVycm9yKFJFUVVJUkVfRElSRUNUT1JZX0VSUk9SKVxuICB9LFxuICBnZXRQcm9jZXNzQXJndkJpbixcbiAgbWFpbkZpbGVuYW1lOiBtYWluRmlsZW5hbWUgfHwgcHJvY2Vzcy5jd2QoKSxcbiAgUGFyc2VyLFxuICBwYXRoOiB7XG4gICAgYmFzZW5hbWUsXG4gICAgZGlybmFtZSxcbiAgICBleHRuYW1lLFxuICAgIHJlbGF0aXZlLFxuICAgIHJlc29sdmVcbiAgfSxcbiAgcHJvY2Vzczoge1xuICAgIGFyZ3Y6ICgpID0+IHByb2Nlc3MuYXJndixcbiAgICBjd2Q6IHByb2Nlc3MuY3dkLFxuICAgIGVtaXRXYXJuaW5nOiAod2FybmluZywgdHlwZSkgPT4gcHJvY2Vzcy5lbWl0V2FybmluZyh3YXJuaW5nLCB0eXBlKSxcbiAgICBleGVjUGF0aDogKCkgPT4gcHJvY2Vzcy5leGVjUGF0aCxcbiAgICBleGl0OiBwcm9jZXNzLmV4aXQsXG4gICAgbmV4dFRpY2s6IHByb2Nlc3MubmV4dFRpY2ssXG4gICAgc3RkQ29sdW1uczogdHlwZW9mIHByb2Nlc3Muc3Rkb3V0LmNvbHVtbnMgIT09ICd1bmRlZmluZWQnID8gcHJvY2Vzcy5zdGRvdXQuY29sdW1ucyA6IG51bGxcbiAgfSxcbiAgcmVhZEZpbGVTeW5jLFxuICByZXF1aXJlOiAoKSA9PiB7XG4gICAgdGhyb3cgbmV3IFlFcnJvcihSRVFVSVJFX0VSUk9SKVxuICB9LFxuICByZXF1aXJlRGlyZWN0b3J5OiAoKSA9PiB7XG4gICAgdGhyb3cgbmV3IFlFcnJvcihSRVFVSVJFX0RJUkVDVE9SWV9FUlJPUilcbiAgfSxcbiAgc3RyaW5nV2lkdGg6IChzdHIpID0+IHtcbiAgICByZXR1cm4gWy4uLnN0cl0ubGVuZ3RoXG4gIH0sXG4gIHkxOG46IHkxOG4oe1xuICAgIGRpcmVjdG9yeTogcmVzb2x2ZShfX2Rpcm5hbWUsICcuLi8uLi8uLi9sb2NhbGVzJyksXG4gICAgdXBkYXRlRmlsZXM6IGZhbHNlXG4gIH0pXG59XG4iLCIvLyBCb290c3RyYXAgY2xpdWkgd2l0aCBDb21tb25KUyBkZXBlbmRlbmNpZXM6XG5pbXBvcnQgeyBjbGl1aSB9IGZyb20gJy4vYnVpbGQvbGliL2luZGV4LmpzJ1xuaW1wb3J0IHsgd3JhcCwgc3RyaXBBbnNpIH0gZnJvbSAnLi9idWlsZC9saWIvc3RyaW5nLXV0aWxzLmpzJ1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1aSAob3B0cykge1xuICByZXR1cm4gY2xpdWkob3B0cywge1xuICAgIHN0cmluZ1dpZHRoOiAoc3RyKSA9PiB7XG4gICAgICByZXR1cm4gWy4uLnN0cl0ubGVuZ3RoXG4gICAgfSxcbiAgICBzdHJpcEFuc2ksXG4gICAgd3JhcFxuICB9KVxufVxuIiwiaW1wb3J0IHsgZGlybmFtZSwgcmVzb2x2ZSB9IGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgcmVhZGRpclN5bmMsIHN0YXRTeW5jIH0gZnJvbSAnZnMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoc3RhcnQsIGNhbGxiYWNrKSB7XG5cdGxldCBkaXIgPSByZXNvbHZlKCcuJywgc3RhcnQpO1xuXHRsZXQgdG1wLCBzdGF0cyA9IHN0YXRTeW5jKGRpcik7XG5cblx0aWYgKCFzdGF0cy5pc0RpcmVjdG9yeSgpKSB7XG5cdFx0ZGlyID0gZGlybmFtZShkaXIpO1xuXHR9XG5cblx0d2hpbGUgKHRydWUpIHtcblx0XHR0bXAgPSBjYWxsYmFjayhkaXIsIHJlYWRkaXJTeW5jKGRpcikpO1xuXHRcdGlmICh0bXApIHJldHVybiByZXNvbHZlKGRpciwgdG1wKTtcblx0XHRkaXIgPSBkaXJuYW1lKHRtcCA9IGRpcik7XG5cdFx0aWYgKHRtcCA9PT0gZGlyKSBicmVhaztcblx0fVxufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGFzc2VydE5vdFN0cmljdEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIHNoaW0sIG1lc3NhZ2UpIHtcbiAgICBzaGltLmFzc2VydC5ub3RTdHJpY3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRTaW5nbGVLZXkoYWN0dWFsLCBzaGltKSB7XG4gICAgc2hpbS5hc3NlcnQuc3RyaWN0RXF1YWwodHlwZW9mIGFjdHVhbCwgJ3N0cmluZycpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG9iamVjdEtleXMob2JqZWN0KSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKG9iamVjdCk7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gaXNQcm9taXNlKG1heWJlUHJvbWlzZSkge1xuICAgIHJldHVybiAoISFtYXliZVByb21pc2UgJiZcbiAgICAgICAgISFtYXliZVByb21pc2UudGhlbiAmJlxuICAgICAgICB0eXBlb2YgbWF5YmVQcm9taXNlLnRoZW4gPT09ICdmdW5jdGlvbicpO1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQ29tbWFuZChjbWQpIHtcbiAgICBjb25zdCBleHRyYVNwYWNlc1N0cmlwcGVkQ29tbWFuZCA9IGNtZC5yZXBsYWNlKC9cXHN7Mix9L2csICcgJyk7XG4gICAgY29uc3Qgc3BsaXRDb21tYW5kID0gZXh0cmFTcGFjZXNTdHJpcHBlZENvbW1hbmQuc3BsaXQoL1xccysoPyFbXltdKl18W148XSo+KS8pO1xuICAgIGNvbnN0IGJyZWdleCA9IC9cXC4qW1xcXVs8Pl0vZztcbiAgICBjb25zdCBmaXJzdENvbW1hbmQgPSBzcGxpdENvbW1hbmQuc2hpZnQoKTtcbiAgICBpZiAoIWZpcnN0Q29tbWFuZClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBjb21tYW5kIGZvdW5kIGluOiAke2NtZH1gKTtcbiAgICBjb25zdCBwYXJzZWRDb21tYW5kID0ge1xuICAgICAgICBjbWQ6IGZpcnN0Q29tbWFuZC5yZXBsYWNlKGJyZWdleCwgJycpLFxuICAgICAgICBkZW1hbmRlZDogW10sXG4gICAgICAgIG9wdGlvbmFsOiBbXSxcbiAgICB9O1xuICAgIHNwbGl0Q29tbWFuZC5mb3JFYWNoKChjbWQsIGkpID0+IHtcbiAgICAgICAgbGV0IHZhcmlhZGljID0gZmFsc2U7XG4gICAgICAgIGNtZCA9IGNtZC5yZXBsYWNlKC9cXHMvZywgJycpO1xuICAgICAgICBpZiAoL1xcLitbXFxdPl0vLnRlc3QoY21kKSAmJiBpID09PSBzcGxpdENvbW1hbmQubGVuZ3RoIC0gMSlcbiAgICAgICAgICAgIHZhcmlhZGljID0gdHJ1ZTtcbiAgICAgICAgaWYgKC9eXFxbLy50ZXN0KGNtZCkpIHtcbiAgICAgICAgICAgIHBhcnNlZENvbW1hbmQub3B0aW9uYWwucHVzaCh7XG4gICAgICAgICAgICAgICAgY21kOiBjbWQucmVwbGFjZShicmVnZXgsICcnKS5zcGxpdCgnfCcpLFxuICAgICAgICAgICAgICAgIHZhcmlhZGljLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBwYXJzZWRDb21tYW5kLmRlbWFuZGVkLnB1c2goe1xuICAgICAgICAgICAgICAgIGNtZDogY21kLnJlcGxhY2UoYnJlZ2V4LCAnJykuc3BsaXQoJ3wnKSxcbiAgICAgICAgICAgICAgICB2YXJpYWRpYyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHBhcnNlZENvbW1hbmQ7XG59XG4iLCJpbXBvcnQgeyBZRXJyb3IgfSBmcm9tICcuL3llcnJvci5qcyc7XG5pbXBvcnQgeyBwYXJzZUNvbW1hbmQgfSBmcm9tICcuL3BhcnNlLWNvbW1hbmQuanMnO1xuY29uc3QgcG9zaXRpb25OYW1lID0gWydmaXJzdCcsICdzZWNvbmQnLCAndGhpcmQnLCAnZm91cnRoJywgJ2ZpZnRoJywgJ3NpeHRoJ107XG5leHBvcnQgZnVuY3Rpb24gYXJnc2VydChhcmcxLCBhcmcyLCBhcmczKSB7XG4gICAgZnVuY3Rpb24gcGFyc2VBcmdzKCkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIGFyZzEgPT09ICdvYmplY3QnXG4gICAgICAgICAgICA/IFt7IGRlbWFuZGVkOiBbXSwgb3B0aW9uYWw6IFtdIH0sIGFyZzEsIGFyZzJdXG4gICAgICAgICAgICA6IFtcbiAgICAgICAgICAgICAgICBwYXJzZUNvbW1hbmQoYGNtZCAke2FyZzF9YCksXG4gICAgICAgICAgICAgICAgYXJnMixcbiAgICAgICAgICAgICAgICBhcmczLFxuICAgICAgICAgICAgXTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgbGV0IHBvc2l0aW9uID0gMDtcbiAgICAgICAgY29uc3QgW3BhcnNlZCwgY2FsbGVyQXJndW1lbnRzLCBfbGVuZ3RoXSA9IHBhcnNlQXJncygpO1xuICAgICAgICBjb25zdCBhcmdzID0gW10uc2xpY2UuY2FsbChjYWxsZXJBcmd1bWVudHMpO1xuICAgICAgICB3aGlsZSAoYXJncy5sZW5ndGggJiYgYXJnc1thcmdzLmxlbmd0aCAtIDFdID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICBhcmdzLnBvcCgpO1xuICAgICAgICBjb25zdCBsZW5ndGggPSBfbGVuZ3RoIHx8IGFyZ3MubGVuZ3RoO1xuICAgICAgICBpZiAobGVuZ3RoIDwgcGFyc2VkLmRlbWFuZGVkLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFlFcnJvcihgTm90IGVub3VnaCBhcmd1bWVudHMgcHJvdmlkZWQuIEV4cGVjdGVkICR7cGFyc2VkLmRlbWFuZGVkLmxlbmd0aH0gYnV0IHJlY2VpdmVkICR7YXJncy5sZW5ndGh9LmApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRvdGFsQ29tbWFuZHMgPSBwYXJzZWQuZGVtYW5kZWQubGVuZ3RoICsgcGFyc2VkLm9wdGlvbmFsLmxlbmd0aDtcbiAgICAgICAgaWYgKGxlbmd0aCA+IHRvdGFsQ29tbWFuZHMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBZRXJyb3IoYFRvbyBtYW55IGFyZ3VtZW50cyBwcm92aWRlZC4gRXhwZWN0ZWQgbWF4ICR7dG90YWxDb21tYW5kc30gYnV0IHJlY2VpdmVkICR7bGVuZ3RofS5gKTtcbiAgICAgICAgfVxuICAgICAgICBwYXJzZWQuZGVtYW5kZWQuZm9yRWFjaChkZW1hbmRlZCA9PiB7XG4gICAgICAgICAgICBjb25zdCBhcmcgPSBhcmdzLnNoaWZ0KCk7XG4gICAgICAgICAgICBjb25zdCBvYnNlcnZlZFR5cGUgPSBndWVzc1R5cGUoYXJnKTtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoaW5nVHlwZXMgPSBkZW1hbmRlZC5jbWQuZmlsdGVyKHR5cGUgPT4gdHlwZSA9PT0gb2JzZXJ2ZWRUeXBlIHx8IHR5cGUgPT09ICcqJyk7XG4gICAgICAgICAgICBpZiAobWF0Y2hpbmdUeXBlcy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICAgICAgYXJndW1lbnRUeXBlRXJyb3Iob2JzZXJ2ZWRUeXBlLCBkZW1hbmRlZC5jbWQsIHBvc2l0aW9uKTtcbiAgICAgICAgICAgIHBvc2l0aW9uICs9IDE7XG4gICAgICAgIH0pO1xuICAgICAgICBwYXJzZWQub3B0aW9uYWwuZm9yRWFjaChvcHRpb25hbCA9PiB7XG4gICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgY29uc3QgYXJnID0gYXJncy5zaGlmdCgpO1xuICAgICAgICAgICAgY29uc3Qgb2JzZXJ2ZWRUeXBlID0gZ3Vlc3NUeXBlKGFyZyk7XG4gICAgICAgICAgICBjb25zdCBtYXRjaGluZ1R5cGVzID0gb3B0aW9uYWwuY21kLmZpbHRlcih0eXBlID0+IHR5cGUgPT09IG9ic2VydmVkVHlwZSB8fCB0eXBlID09PSAnKicpO1xuICAgICAgICAgICAgaWYgKG1hdGNoaW5nVHlwZXMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgICAgIGFyZ3VtZW50VHlwZUVycm9yKG9ic2VydmVkVHlwZSwgb3B0aW9uYWwuY21kLCBwb3NpdGlvbik7XG4gICAgICAgICAgICBwb3NpdGlvbiArPSAxO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLndhcm4oZXJyLnN0YWNrKTtcbiAgICB9XG59XG5mdW5jdGlvbiBndWVzc1R5cGUoYXJnKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYXJnKSkge1xuICAgICAgICByZXR1cm4gJ2FycmF5JztcbiAgICB9XG4gICAgZWxzZSBpZiAoYXJnID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAnbnVsbCc7XG4gICAgfVxuICAgIHJldHVybiB0eXBlb2YgYXJnO1xufVxuZnVuY3Rpb24gYXJndW1lbnRUeXBlRXJyb3Iob2JzZXJ2ZWRUeXBlLCBhbGxvd2VkVHlwZXMsIHBvc2l0aW9uKSB7XG4gICAgdGhyb3cgbmV3IFlFcnJvcihgSW52YWxpZCAke3Bvc2l0aW9uTmFtZVtwb3NpdGlvbl0gfHwgJ21hbnlpdGgnfSBhcmd1bWVudC4gRXhwZWN0ZWQgJHthbGxvd2VkVHlwZXMuam9pbignIG9yICcpfSBidXQgcmVjZWl2ZWQgJHtvYnNlcnZlZFR5cGV9LmApO1xufVxuIiwiaW1wb3J0IHsgYXJnc2VydCB9IGZyb20gJy4vYXJnc2VydC5qcyc7XG5pbXBvcnQgeyBpc1Byb21pc2UgfSBmcm9tICcuL3V0aWxzL2lzLXByb21pc2UuanMnO1xuZXhwb3J0IGNsYXNzIEdsb2JhbE1pZGRsZXdhcmUge1xuICAgIGNvbnN0cnVjdG9yKHlhcmdzKSB7XG4gICAgICAgIHRoaXMuZ2xvYmFsTWlkZGxld2FyZSA9IFtdO1xuICAgICAgICB0aGlzLmZyb3plbnMgPSBbXTtcbiAgICAgICAgdGhpcy55YXJncyA9IHlhcmdzO1xuICAgIH1cbiAgICBhZGRNaWRkbGV3YXJlKGNhbGxiYWNrLCBhcHBseUJlZm9yZVZhbGlkYXRpb24sIGdsb2JhbCA9IHRydWUsIG11dGF0ZXMgPSBmYWxzZSkge1xuICAgICAgICBhcmdzZXJ0KCc8YXJyYXl8ZnVuY3Rpb24+IFtib29sZWFuXSBbYm9vbGVhbl0gW2Jvb2xlYW5dJywgW2NhbGxiYWNrLCBhcHBseUJlZm9yZVZhbGlkYXRpb24sIGdsb2JhbF0sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjYWxsYmFjaykpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2FsbGJhY2subGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrW2ldICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKCdtaWRkbGV3YXJlIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBtID0gY2FsbGJhY2tbaV07XG4gICAgICAgICAgICAgICAgbS5hcHBseUJlZm9yZVZhbGlkYXRpb24gPSBhcHBseUJlZm9yZVZhbGlkYXRpb247XG4gICAgICAgICAgICAgICAgbS5nbG9iYWwgPSBnbG9iYWw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseSh0aGlzLmdsb2JhbE1pZGRsZXdhcmUsIGNhbGxiYWNrKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNvbnN0IG0gPSBjYWxsYmFjaztcbiAgICAgICAgICAgIG0uYXBwbHlCZWZvcmVWYWxpZGF0aW9uID0gYXBwbHlCZWZvcmVWYWxpZGF0aW9uO1xuICAgICAgICAgICAgbS5nbG9iYWwgPSBnbG9iYWw7XG4gICAgICAgICAgICBtLm11dGF0ZXMgPSBtdXRhdGVzO1xuICAgICAgICAgICAgdGhpcy5nbG9iYWxNaWRkbGV3YXJlLnB1c2goY2FsbGJhY2spO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnlhcmdzO1xuICAgIH1cbiAgICBhZGRDb2VyY2VNaWRkbGV3YXJlKGNhbGxiYWNrLCBvcHRpb24pIHtcbiAgICAgICAgY29uc3QgYWxpYXNlcyA9IHRoaXMueWFyZ3MuZ2V0QWxpYXNlcygpO1xuICAgICAgICB0aGlzLmdsb2JhbE1pZGRsZXdhcmUgPSB0aGlzLmdsb2JhbE1pZGRsZXdhcmUuZmlsdGVyKG0gPT4ge1xuICAgICAgICAgICAgY29uc3QgdG9DaGVjayA9IFsuLi4oYWxpYXNlc1tvcHRpb25dIHx8IFtdKSwgb3B0aW9uXTtcbiAgICAgICAgICAgIGlmICghbS5vcHRpb24pXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuICF0b0NoZWNrLmluY2x1ZGVzKG0ub3B0aW9uKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNhbGxiYWNrLm9wdGlvbiA9IG9wdGlvbjtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkTWlkZGxld2FyZShjYWxsYmFjaywgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7XG4gICAgfVxuICAgIGdldE1pZGRsZXdhcmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdsb2JhbE1pZGRsZXdhcmU7XG4gICAgfVxuICAgIGZyZWV6ZSgpIHtcbiAgICAgICAgdGhpcy5mcm96ZW5zLnB1c2goWy4uLnRoaXMuZ2xvYmFsTWlkZGxld2FyZV0pO1xuICAgIH1cbiAgICB1bmZyZWV6ZSgpIHtcbiAgICAgICAgY29uc3QgZnJvemVuID0gdGhpcy5mcm96ZW5zLnBvcCgpO1xuICAgICAgICBpZiAoZnJvemVuICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB0aGlzLmdsb2JhbE1pZGRsZXdhcmUgPSBmcm96ZW47XG4gICAgfVxuICAgIHJlc2V0KCkge1xuICAgICAgICB0aGlzLmdsb2JhbE1pZGRsZXdhcmUgPSB0aGlzLmdsb2JhbE1pZGRsZXdhcmUuZmlsdGVyKG0gPT4gbS5nbG9iYWwpO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBjb21tYW5kTWlkZGxld2FyZUZhY3RvcnkoY29tbWFuZE1pZGRsZXdhcmUpIHtcbiAgICBpZiAoIWNvbW1hbmRNaWRkbGV3YXJlKVxuICAgICAgICByZXR1cm4gW107XG4gICAgcmV0dXJuIGNvbW1hbmRNaWRkbGV3YXJlLm1hcChtaWRkbGV3YXJlID0+IHtcbiAgICAgICAgbWlkZGxld2FyZS5hcHBseUJlZm9yZVZhbGlkYXRpb24gPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIG1pZGRsZXdhcmU7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXBwbHlNaWRkbGV3YXJlKGFyZ3YsIHlhcmdzLCBtaWRkbGV3YXJlcywgYmVmb3JlVmFsaWRhdGlvbikge1xuICAgIHJldHVybiBtaWRkbGV3YXJlcy5yZWR1Y2UoKGFjYywgbWlkZGxld2FyZSkgPT4ge1xuICAgICAgICBpZiAobWlkZGxld2FyZS5hcHBseUJlZm9yZVZhbGlkYXRpb24gIT09IGJlZm9yZVZhbGlkYXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1pZGRsZXdhcmUubXV0YXRlcykge1xuICAgICAgICAgICAgaWYgKG1pZGRsZXdhcmUuYXBwbGllZClcbiAgICAgICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICAgICAgbWlkZGxld2FyZS5hcHBsaWVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNQcm9taXNlKGFjYykpIHtcbiAgICAgICAgICAgIHJldHVybiBhY2NcbiAgICAgICAgICAgICAgICAudGhlbihpbml0aWFsT2JqID0+IFByb21pc2UuYWxsKFtpbml0aWFsT2JqLCBtaWRkbGV3YXJlKGluaXRpYWxPYmosIHlhcmdzKV0pKVxuICAgICAgICAgICAgICAgIC50aGVuKChbaW5pdGlhbE9iaiwgbWlkZGxld2FyZU9ial0pID0+IE9iamVjdC5hc3NpZ24oaW5pdGlhbE9iaiwgbWlkZGxld2FyZU9iaikpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gbWlkZGxld2FyZShhY2MsIHlhcmdzKTtcbiAgICAgICAgICAgIHJldHVybiBpc1Byb21pc2UocmVzdWx0KVxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRoZW4obWlkZGxld2FyZU9iaiA9PiBPYmplY3QuYXNzaWduKGFjYywgbWlkZGxld2FyZU9iaikpXG4gICAgICAgICAgICAgICAgOiBPYmplY3QuYXNzaWduKGFjYywgcmVzdWx0KTtcbiAgICAgICAgfVxuICAgIH0sIGFyZ3YpO1xufVxuIiwiaW1wb3J0IHsgaXNQcm9taXNlIH0gZnJvbSAnLi9pcy1wcm9taXNlLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBtYXliZUFzeW5jUmVzdWx0KGdldFJlc3VsdCwgcmVzdWx0SGFuZGxlciwgZXJyb3JIYW5kbGVyID0gKGVycikgPT4ge1xuICAgIHRocm93IGVycjtcbn0pIHtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBpc0Z1bmN0aW9uKGdldFJlc3VsdCkgPyBnZXRSZXN1bHQoKSA6IGdldFJlc3VsdDtcbiAgICAgICAgcmV0dXJuIGlzUHJvbWlzZShyZXN1bHQpXG4gICAgICAgICAgICA/IHJlc3VsdC50aGVuKChyZXN1bHQpID0+IHJlc3VsdEhhbmRsZXIocmVzdWx0KSlcbiAgICAgICAgICAgIDogcmVzdWx0SGFuZGxlcihyZXN1bHQpO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJldHVybiBlcnJvckhhbmRsZXIoZXJyKTtcbiAgICB9XG59XG5mdW5jdGlvbiBpc0Z1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiB0eXBlb2YgYXJnID09PSAnZnVuY3Rpb24nO1xufVxuIiwiaW1wb3J0IHsgYXNzZXJ0Tm90U3RyaWN0RXF1YWwsIH0gZnJvbSAnLi90eXBpbmdzL2NvbW1vbi10eXBlcy5qcyc7XG5pbXBvcnQgeyBpc1Byb21pc2UgfSBmcm9tICcuL3V0aWxzL2lzLXByb21pc2UuanMnO1xuaW1wb3J0IHsgYXBwbHlNaWRkbGV3YXJlLCBjb21tYW5kTWlkZGxld2FyZUZhY3RvcnksIH0gZnJvbSAnLi9taWRkbGV3YXJlLmpzJztcbmltcG9ydCB7IHBhcnNlQ29tbWFuZCB9IGZyb20gJy4vcGFyc2UtY29tbWFuZC5qcyc7XG5pbXBvcnQgeyBpc1lhcmdzSW5zdGFuY2UsIH0gZnJvbSAnLi95YXJncy1mYWN0b3J5LmpzJztcbmltcG9ydCB7IG1heWJlQXN5bmNSZXN1bHQgfSBmcm9tICcuL3V0aWxzL21heWJlLWFzeW5jLXJlc3VsdC5qcyc7XG5pbXBvcnQgd2hpY2hNb2R1bGUgZnJvbSAnLi91dGlscy93aGljaC1tb2R1bGUuanMnO1xuY29uc3QgREVGQVVMVF9NQVJLRVIgPSAvKF5cXCopfCheXFwkMCkvO1xuZXhwb3J0IGNsYXNzIENvbW1hbmRJbnN0YW5jZSB7XG4gICAgY29uc3RydWN0b3IodXNhZ2UsIHZhbGlkYXRpb24sIGdsb2JhbE1pZGRsZXdhcmUsIHNoaW0pIHtcbiAgICAgICAgdGhpcy5yZXF1aXJlQ2FjaGUgPSBuZXcgU2V0KCk7XG4gICAgICAgIHRoaXMuaGFuZGxlcnMgPSB7fTtcbiAgICAgICAgdGhpcy5hbGlhc01hcCA9IHt9O1xuICAgICAgICB0aGlzLmZyb3plbnMgPSBbXTtcbiAgICAgICAgdGhpcy5zaGltID0gc2hpbTtcbiAgICAgICAgdGhpcy51c2FnZSA9IHVzYWdlO1xuICAgICAgICB0aGlzLmdsb2JhbE1pZGRsZXdhcmUgPSBnbG9iYWxNaWRkbGV3YXJlO1xuICAgICAgICB0aGlzLnZhbGlkYXRpb24gPSB2YWxpZGF0aW9uO1xuICAgIH1cbiAgICBhZGREaXJlY3RvcnkoZGlyLCByZXEsIGNhbGxlckZpbGUsIG9wdHMpIHtcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge307XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0cy5yZWN1cnNlICE9PSAnYm9vbGVhbicpXG4gICAgICAgICAgICBvcHRzLnJlY3Vyc2UgPSBmYWxzZTtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KG9wdHMuZXh0ZW5zaW9ucykpXG4gICAgICAgICAgICBvcHRzLmV4dGVuc2lvbnMgPSBbJ2pzJ107XG4gICAgICAgIGNvbnN0IHBhcmVudFZpc2l0ID0gdHlwZW9mIG9wdHMudmlzaXQgPT09ICdmdW5jdGlvbicgPyBvcHRzLnZpc2l0IDogKG8pID0+IG87XG4gICAgICAgIG9wdHMudmlzaXQgPSAob2JqLCBqb2luZWQsIGZpbGVuYW1lKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB2aXNpdGVkID0gcGFyZW50VmlzaXQob2JqLCBqb2luZWQsIGZpbGVuYW1lKTtcbiAgICAgICAgICAgIGlmICh2aXNpdGVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVxdWlyZUNhY2hlLmhhcyhqb2luZWQpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmlzaXRlZDtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVxdWlyZUNhY2hlLmFkZChqb2luZWQpO1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkSGFuZGxlcih2aXNpdGVkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB2aXNpdGVkO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLnNoaW0ucmVxdWlyZURpcmVjdG9yeSh7IHJlcXVpcmU6IHJlcSwgZmlsZW5hbWU6IGNhbGxlckZpbGUgfSwgZGlyLCBvcHRzKTtcbiAgICB9XG4gICAgYWRkSGFuZGxlcihjbWQsIGRlc2NyaXB0aW9uLCBidWlsZGVyLCBoYW5kbGVyLCBjb21tYW5kTWlkZGxld2FyZSwgZGVwcmVjYXRlZCkge1xuICAgICAgICBsZXQgYWxpYXNlcyA9IFtdO1xuICAgICAgICBjb25zdCBtaWRkbGV3YXJlcyA9IGNvbW1hbmRNaWRkbGV3YXJlRmFjdG9yeShjb21tYW5kTWlkZGxld2FyZSk7XG4gICAgICAgIGhhbmRsZXIgPSBoYW5kbGVyIHx8ICgoKSA9PiB7IH0pO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjbWQpKSB7XG4gICAgICAgICAgICBpZiAoaXNDb21tYW5kQW5kQWxpYXNlcyhjbWQpKSB7XG4gICAgICAgICAgICAgICAgW2NtZCwgLi4uYWxpYXNlc10gPSBjbWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGNvbW1hbmQgb2YgY21kKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkSGFuZGxlcihjb21tYW5kKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNDb21tYW5kSGFuZGxlckRlZmluaXRpb24oY21kKSkge1xuICAgICAgICAgICAgbGV0IGNvbW1hbmQgPSBBcnJheS5pc0FycmF5KGNtZC5jb21tYW5kKSB8fCB0eXBlb2YgY21kLmNvbW1hbmQgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICAgICAgPyBjbWQuY29tbWFuZFxuICAgICAgICAgICAgICAgIDogdGhpcy5tb2R1bGVOYW1lKGNtZCk7XG4gICAgICAgICAgICBpZiAoY21kLmFsaWFzZXMpXG4gICAgICAgICAgICAgICAgY29tbWFuZCA9IFtdLmNvbmNhdChjb21tYW5kKS5jb25jYXQoY21kLmFsaWFzZXMpO1xuICAgICAgICAgICAgdGhpcy5hZGRIYW5kbGVyKGNvbW1hbmQsIHRoaXMuZXh0cmFjdERlc2MoY21kKSwgY21kLmJ1aWxkZXIsIGNtZC5oYW5kbGVyLCBjbWQubWlkZGxld2FyZXMsIGNtZC5kZXByZWNhdGVkKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc0NvbW1hbmRCdWlsZGVyRGVmaW5pdGlvbihidWlsZGVyKSkge1xuICAgICAgICAgICAgdGhpcy5hZGRIYW5kbGVyKFtjbWRdLmNvbmNhdChhbGlhc2VzKSwgZGVzY3JpcHRpb24sIGJ1aWxkZXIuYnVpbGRlciwgYnVpbGRlci5oYW5kbGVyLCBidWlsZGVyLm1pZGRsZXdhcmVzLCBidWlsZGVyLmRlcHJlY2F0ZWQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgY21kID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkQ29tbWFuZCA9IHBhcnNlQ29tbWFuZChjbWQpO1xuICAgICAgICAgICAgYWxpYXNlcyA9IGFsaWFzZXMubWFwKGFsaWFzID0+IHBhcnNlQ29tbWFuZChhbGlhcykuY21kKTtcbiAgICAgICAgICAgIGxldCBpc0RlZmF1bHQgPSBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZEFsaWFzZXMgPSBbcGFyc2VkQ29tbWFuZC5jbWRdLmNvbmNhdChhbGlhc2VzKS5maWx0ZXIoYyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKERFRkFVTFRfTUFSS0VSLnRlc3QoYykpIHtcbiAgICAgICAgICAgICAgICAgICAgaXNEZWZhdWx0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHBhcnNlZEFsaWFzZXMubGVuZ3RoID09PSAwICYmIGlzRGVmYXVsdClcbiAgICAgICAgICAgICAgICBwYXJzZWRBbGlhc2VzLnB1c2goJyQwJyk7XG4gICAgICAgICAgICBpZiAoaXNEZWZhdWx0KSB7XG4gICAgICAgICAgICAgICAgcGFyc2VkQ29tbWFuZC5jbWQgPSBwYXJzZWRBbGlhc2VzWzBdO1xuICAgICAgICAgICAgICAgIGFsaWFzZXMgPSBwYXJzZWRBbGlhc2VzLnNsaWNlKDEpO1xuICAgICAgICAgICAgICAgIGNtZCA9IGNtZC5yZXBsYWNlKERFRkFVTFRfTUFSS0VSLCBwYXJzZWRDb21tYW5kLmNtZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhbGlhc2VzLmZvckVhY2goYWxpYXMgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuYWxpYXNNYXBbYWxpYXNdID0gcGFyc2VkQ29tbWFuZC5jbWQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChkZXNjcmlwdGlvbiAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVzYWdlLmNvbW1hbmQoY21kLCBkZXNjcmlwdGlvbiwgaXNEZWZhdWx0LCBhbGlhc2VzLCBkZXByZWNhdGVkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuaGFuZGxlcnNbcGFyc2VkQ29tbWFuZC5jbWRdID0ge1xuICAgICAgICAgICAgICAgIG9yaWdpbmFsOiBjbWQsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgICAgaGFuZGxlcixcbiAgICAgICAgICAgICAgICBidWlsZGVyOiBidWlsZGVyIHx8IHt9LFxuICAgICAgICAgICAgICAgIG1pZGRsZXdhcmVzLFxuICAgICAgICAgICAgICAgIGRlcHJlY2F0ZWQsXG4gICAgICAgICAgICAgICAgZGVtYW5kZWQ6IHBhcnNlZENvbW1hbmQuZGVtYW5kZWQsXG4gICAgICAgICAgICAgICAgb3B0aW9uYWw6IHBhcnNlZENvbW1hbmQub3B0aW9uYWwsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKGlzRGVmYXVsdClcbiAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRDb21tYW5kID0gdGhpcy5oYW5kbGVyc1twYXJzZWRDb21tYW5kLmNtZF07XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0Q29tbWFuZEhhbmRsZXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVycztcbiAgICB9XG4gICAgZ2V0Q29tbWFuZHMoKSB7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmhhbmRsZXJzKS5jb25jYXQoT2JqZWN0LmtleXModGhpcy5hbGlhc01hcCkpO1xuICAgIH1cbiAgICBoYXNEZWZhdWx0Q29tbWFuZCgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5kZWZhdWx0Q29tbWFuZDtcbiAgICB9XG4gICAgcnVuQ29tbWFuZChjb21tYW5kLCB5YXJncywgcGFyc2VkLCBjb21tYW5kSW5kZXgsIGhlbHBPbmx5LCBoZWxwT3JWZXJzaW9uU2V0KSB7XG4gICAgICAgIGNvbnN0IGNvbW1hbmRIYW5kbGVyID0gdGhpcy5oYW5kbGVyc1tjb21tYW5kXSB8fFxuICAgICAgICAgICAgdGhpcy5oYW5kbGVyc1t0aGlzLmFsaWFzTWFwW2NvbW1hbmRdXSB8fFxuICAgICAgICAgICAgdGhpcy5kZWZhdWx0Q29tbWFuZDtcbiAgICAgICAgY29uc3QgY3VycmVudENvbnRleHQgPSB5YXJncy5nZXRJbnRlcm5hbE1ldGhvZHMoKS5nZXRDb250ZXh0KCk7XG4gICAgICAgIGNvbnN0IHBhcmVudENvbW1hbmRzID0gY3VycmVudENvbnRleHQuY29tbWFuZHMuc2xpY2UoKTtcbiAgICAgICAgY29uc3QgaXNEZWZhdWx0Q29tbWFuZCA9ICFjb21tYW5kO1xuICAgICAgICBpZiAoY29tbWFuZCkge1xuICAgICAgICAgICAgY3VycmVudENvbnRleHQuY29tbWFuZHMucHVzaChjb21tYW5kKTtcbiAgICAgICAgICAgIGN1cnJlbnRDb250ZXh0LmZ1bGxDb21tYW5kcy5wdXNoKGNvbW1hbmRIYW5kbGVyLm9yaWdpbmFsKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBidWlsZGVyUmVzdWx0ID0gdGhpcy5hcHBseUJ1aWxkZXJVcGRhdGVVc2FnZUFuZFBhcnNlKGlzRGVmYXVsdENvbW1hbmQsIGNvbW1hbmRIYW5kbGVyLCB5YXJncywgcGFyc2VkLmFsaWFzZXMsIHBhcmVudENvbW1hbmRzLCBjb21tYW5kSW5kZXgsIGhlbHBPbmx5LCBoZWxwT3JWZXJzaW9uU2V0KTtcbiAgICAgICAgcmV0dXJuIGlzUHJvbWlzZShidWlsZGVyUmVzdWx0KVxuICAgICAgICAgICAgPyBidWlsZGVyUmVzdWx0LnRoZW4ocmVzdWx0ID0+IHRoaXMuYXBwbHlNaWRkbGV3YXJlQW5kR2V0UmVzdWx0KGlzRGVmYXVsdENvbW1hbmQsIGNvbW1hbmRIYW5kbGVyLCByZXN1bHQuaW5uZXJBcmd2LCBjdXJyZW50Q29udGV4dCwgaGVscE9ubHksIHJlc3VsdC5hbGlhc2VzLCB5YXJncykpXG4gICAgICAgICAgICA6IHRoaXMuYXBwbHlNaWRkbGV3YXJlQW5kR2V0UmVzdWx0KGlzRGVmYXVsdENvbW1hbmQsIGNvbW1hbmRIYW5kbGVyLCBidWlsZGVyUmVzdWx0LmlubmVyQXJndiwgY3VycmVudENvbnRleHQsIGhlbHBPbmx5LCBidWlsZGVyUmVzdWx0LmFsaWFzZXMsIHlhcmdzKTtcbiAgICB9XG4gICAgYXBwbHlCdWlsZGVyVXBkYXRlVXNhZ2VBbmRQYXJzZShpc0RlZmF1bHRDb21tYW5kLCBjb21tYW5kSGFuZGxlciwgeWFyZ3MsIGFsaWFzZXMsIHBhcmVudENvbW1hbmRzLCBjb21tYW5kSW5kZXgsIGhlbHBPbmx5LCBoZWxwT3JWZXJzaW9uU2V0KSB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBjb21tYW5kSGFuZGxlci5idWlsZGVyO1xuICAgICAgICBsZXQgaW5uZXJZYXJncyA9IHlhcmdzO1xuICAgICAgICBpZiAoaXNDb21tYW5kQnVpbGRlckNhbGxiYWNrKGJ1aWxkZXIpKSB7XG4gICAgICAgICAgICB5YXJncy5nZXRJbnRlcm5hbE1ldGhvZHMoKS5nZXRVc2FnZUluc3RhbmNlKCkuZnJlZXplKCk7XG4gICAgICAgICAgICBjb25zdCBidWlsZGVyT3V0cHV0ID0gYnVpbGRlcih5YXJncy5nZXRJbnRlcm5hbE1ldGhvZHMoKS5yZXNldChhbGlhc2VzKSwgaGVscE9yVmVyc2lvblNldCk7XG4gICAgICAgICAgICBpZiAoaXNQcm9taXNlKGJ1aWxkZXJPdXRwdXQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXJPdXRwdXQudGhlbihvdXRwdXQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpbm5lcllhcmdzID0gaXNZYXJnc0luc3RhbmNlKG91dHB1dCkgPyBvdXRwdXQgOiB5YXJncztcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VBbmRVcGRhdGVVc2FnZShpc0RlZmF1bHRDb21tYW5kLCBjb21tYW5kSGFuZGxlciwgaW5uZXJZYXJncywgcGFyZW50Q29tbWFuZHMsIGNvbW1hbmRJbmRleCwgaGVscE9ubHkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzQ29tbWFuZEJ1aWxkZXJPcHRpb25EZWZpbml0aW9ucyhidWlsZGVyKSkge1xuICAgICAgICAgICAgeWFyZ3MuZ2V0SW50ZXJuYWxNZXRob2RzKCkuZ2V0VXNhZ2VJbnN0YW5jZSgpLmZyZWV6ZSgpO1xuICAgICAgICAgICAgaW5uZXJZYXJncyA9IHlhcmdzLmdldEludGVybmFsTWV0aG9kcygpLnJlc2V0KGFsaWFzZXMpO1xuICAgICAgICAgICAgT2JqZWN0LmtleXMoY29tbWFuZEhhbmRsZXIuYnVpbGRlcikuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgICAgIGlubmVyWWFyZ3Mub3B0aW9uKGtleSwgYnVpbGRlcltrZXldKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlQW5kVXBkYXRlVXNhZ2UoaXNEZWZhdWx0Q29tbWFuZCwgY29tbWFuZEhhbmRsZXIsIGlubmVyWWFyZ3MsIHBhcmVudENvbW1hbmRzLCBjb21tYW5kSW5kZXgsIGhlbHBPbmx5KTtcbiAgICB9XG4gICAgcGFyc2VBbmRVcGRhdGVVc2FnZShpc0RlZmF1bHRDb21tYW5kLCBjb21tYW5kSGFuZGxlciwgaW5uZXJZYXJncywgcGFyZW50Q29tbWFuZHMsIGNvbW1hbmRJbmRleCwgaGVscE9ubHkpIHtcbiAgICAgICAgaWYgKGlzRGVmYXVsdENvbW1hbmQpXG4gICAgICAgICAgICBpbm5lcllhcmdzLmdldEludGVybmFsTWV0aG9kcygpLmdldFVzYWdlSW5zdGFuY2UoKS51bmZyZWV6ZSh0cnVlKTtcbiAgICAgICAgaWYgKHRoaXMuc2hvdWxkVXBkYXRlVXNhZ2UoaW5uZXJZYXJncykpIHtcbiAgICAgICAgICAgIGlubmVyWWFyZ3NcbiAgICAgICAgICAgICAgICAuZ2V0SW50ZXJuYWxNZXRob2RzKClcbiAgICAgICAgICAgICAgICAuZ2V0VXNhZ2VJbnN0YW5jZSgpXG4gICAgICAgICAgICAgICAgLnVzYWdlKHRoaXMudXNhZ2VGcm9tUGFyZW50Q29tbWFuZHNDb21tYW5kSGFuZGxlcihwYXJlbnRDb21tYW5kcywgY29tbWFuZEhhbmRsZXIpLCBjb21tYW5kSGFuZGxlci5kZXNjcmlwdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW5uZXJBcmd2ID0gaW5uZXJZYXJnc1xuICAgICAgICAgICAgLmdldEludGVybmFsTWV0aG9kcygpXG4gICAgICAgICAgICAucnVuWWFyZ3NQYXJzZXJBbmRFeGVjdXRlQ29tbWFuZHMobnVsbCwgdW5kZWZpbmVkLCB0cnVlLCBjb21tYW5kSW5kZXgsIGhlbHBPbmx5KTtcbiAgICAgICAgcmV0dXJuIGlzUHJvbWlzZShpbm5lckFyZ3YpXG4gICAgICAgICAgICA/IGlubmVyQXJndi50aGVuKGFyZ3YgPT4gKHtcbiAgICAgICAgICAgICAgICBhbGlhc2VzOiBpbm5lcllhcmdzLnBhcnNlZC5hbGlhc2VzLFxuICAgICAgICAgICAgICAgIGlubmVyQXJndjogYXJndixcbiAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgYWxpYXNlczogaW5uZXJZYXJncy5wYXJzZWQuYWxpYXNlcyxcbiAgICAgICAgICAgICAgICBpbm5lckFyZ3Y6IGlubmVyQXJndixcbiAgICAgICAgICAgIH07XG4gICAgfVxuICAgIHNob3VsZFVwZGF0ZVVzYWdlKHlhcmdzKSB7XG4gICAgICAgIHJldHVybiAoIXlhcmdzLmdldEludGVybmFsTWV0aG9kcygpLmdldFVzYWdlSW5zdGFuY2UoKS5nZXRVc2FnZURpc2FibGVkKCkgJiZcbiAgICAgICAgICAgIHlhcmdzLmdldEludGVybmFsTWV0aG9kcygpLmdldFVzYWdlSW5zdGFuY2UoKS5nZXRVc2FnZSgpLmxlbmd0aCA9PT0gMCk7XG4gICAgfVxuICAgIHVzYWdlRnJvbVBhcmVudENvbW1hbmRzQ29tbWFuZEhhbmRsZXIocGFyZW50Q29tbWFuZHMsIGNvbW1hbmRIYW5kbGVyKSB7XG4gICAgICAgIGNvbnN0IGMgPSBERUZBVUxUX01BUktFUi50ZXN0KGNvbW1hbmRIYW5kbGVyLm9yaWdpbmFsKVxuICAgICAgICAgICAgPyBjb21tYW5kSGFuZGxlci5vcmlnaW5hbC5yZXBsYWNlKERFRkFVTFRfTUFSS0VSLCAnJykudHJpbSgpXG4gICAgICAgICAgICA6IGNvbW1hbmRIYW5kbGVyLm9yaWdpbmFsO1xuICAgICAgICBjb25zdCBwYyA9IHBhcmVudENvbW1hbmRzLmZpbHRlcihjID0+IHtcbiAgICAgICAgICAgIHJldHVybiAhREVGQVVMVF9NQVJLRVIudGVzdChjKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHBjLnB1c2goYyk7XG4gICAgICAgIHJldHVybiBgJDAgJHtwYy5qb2luKCcgJyl9YDtcbiAgICB9XG4gICAgaGFuZGxlVmFsaWRhdGlvbkFuZEdldFJlc3VsdChpc0RlZmF1bHRDb21tYW5kLCBjb21tYW5kSGFuZGxlciwgaW5uZXJBcmd2LCBjdXJyZW50Q29udGV4dCwgYWxpYXNlcywgeWFyZ3MsIG1pZGRsZXdhcmVzLCBwb3NpdGlvbmFsTWFwKSB7XG4gICAgICAgIGlmICgheWFyZ3MuZ2V0SW50ZXJuYWxNZXRob2RzKCkuZ2V0SGFzT3V0cHV0KCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbGlkYXRpb24gPSB5YXJnc1xuICAgICAgICAgICAgICAgIC5nZXRJbnRlcm5hbE1ldGhvZHMoKVxuICAgICAgICAgICAgICAgIC5ydW5WYWxpZGF0aW9uKGFsaWFzZXMsIHBvc2l0aW9uYWxNYXAsIHlhcmdzLnBhcnNlZC5lcnJvciwgaXNEZWZhdWx0Q29tbWFuZCk7XG4gICAgICAgICAgICBpbm5lckFyZ3YgPSBtYXliZUFzeW5jUmVzdWx0KGlubmVyQXJndiwgcmVzdWx0ID0+IHtcbiAgICAgICAgICAgICAgICB2YWxpZGF0aW9uKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb21tYW5kSGFuZGxlci5oYW5kbGVyICYmICF5YXJncy5nZXRJbnRlcm5hbE1ldGhvZHMoKS5nZXRIYXNPdXRwdXQoKSkge1xuICAgICAgICAgICAgeWFyZ3MuZ2V0SW50ZXJuYWxNZXRob2RzKCkuc2V0SGFzT3V0cHV0KCk7XG4gICAgICAgICAgICBjb25zdCBwb3B1bGF0ZURvdWJsZURhc2ggPSAhIXlhcmdzLmdldE9wdGlvbnMoKS5jb25maWd1cmF0aW9uWydwb3B1bGF0ZS0tJ107XG4gICAgICAgICAgICB5YXJnc1xuICAgICAgICAgICAgICAgIC5nZXRJbnRlcm5hbE1ldGhvZHMoKVxuICAgICAgICAgICAgICAgIC5wb3N0UHJvY2Vzcyhpbm5lckFyZ3YsIHBvcHVsYXRlRG91YmxlRGFzaCwgZmFsc2UsIGZhbHNlKTtcbiAgICAgICAgICAgIGlubmVyQXJndiA9IGFwcGx5TWlkZGxld2FyZShpbm5lckFyZ3YsIHlhcmdzLCBtaWRkbGV3YXJlcywgZmFsc2UpO1xuICAgICAgICAgICAgaW5uZXJBcmd2ID0gbWF5YmVBc3luY1Jlc3VsdChpbm5lckFyZ3YsIHJlc3VsdCA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlclJlc3VsdCA9IGNvbW1hbmRIYW5kbGVyLmhhbmRsZXIocmVzdWx0KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNQcm9taXNlKGhhbmRsZXJSZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgID8gaGFuZGxlclJlc3VsdC50aGVuKCgpID0+IHJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgOiByZXN1bHQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghaXNEZWZhdWx0Q29tbWFuZCkge1xuICAgICAgICAgICAgICAgIHlhcmdzLmdldEludGVybmFsTWV0aG9kcygpLmdldFVzYWdlSW5zdGFuY2UoKS5jYWNoZUhlbHBNZXNzYWdlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNQcm9taXNlKGlubmVyQXJndikgJiZcbiAgICAgICAgICAgICAgICAheWFyZ3MuZ2V0SW50ZXJuYWxNZXRob2RzKCkuaGFzUGFyc2VDYWxsYmFjaygpKSB7XG4gICAgICAgICAgICAgICAgaW5uZXJBcmd2LmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHlhcmdzLmdldEludGVybmFsTWV0aG9kcygpLmdldFVzYWdlSW5zdGFuY2UoKS5mYWlsKG51bGwsIGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoX2Vycikge1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc0RlZmF1bHRDb21tYW5kKSB7XG4gICAgICAgICAgICBjdXJyZW50Q29udGV4dC5jb21tYW5kcy5wb3AoKTtcbiAgICAgICAgICAgIGN1cnJlbnRDb250ZXh0LmZ1bGxDb21tYW5kcy5wb3AoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5uZXJBcmd2O1xuICAgIH1cbiAgICBhcHBseU1pZGRsZXdhcmVBbmRHZXRSZXN1bHQoaXNEZWZhdWx0Q29tbWFuZCwgY29tbWFuZEhhbmRsZXIsIGlubmVyQXJndiwgY3VycmVudENvbnRleHQsIGhlbHBPbmx5LCBhbGlhc2VzLCB5YXJncykge1xuICAgICAgICBsZXQgcG9zaXRpb25hbE1hcCA9IHt9O1xuICAgICAgICBpZiAoaGVscE9ubHkpXG4gICAgICAgICAgICByZXR1cm4gaW5uZXJBcmd2O1xuICAgICAgICBpZiAoIXlhcmdzLmdldEludGVybmFsTWV0aG9kcygpLmdldEhhc091dHB1dCgpKSB7XG4gICAgICAgICAgICBwb3NpdGlvbmFsTWFwID0gdGhpcy5wb3B1bGF0ZVBvc2l0aW9uYWxzKGNvbW1hbmRIYW5kbGVyLCBpbm5lckFyZ3YsIGN1cnJlbnRDb250ZXh0LCB5YXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbWlkZGxld2FyZXMgPSB0aGlzLmdsb2JhbE1pZGRsZXdhcmVcbiAgICAgICAgICAgIC5nZXRNaWRkbGV3YXJlKClcbiAgICAgICAgICAgIC5zbGljZSgwKVxuICAgICAgICAgICAgLmNvbmNhdChjb21tYW5kSGFuZGxlci5taWRkbGV3YXJlcyk7XG4gICAgICAgIGNvbnN0IG1heWJlUHJvbWlzZUFyZ3YgPSBhcHBseU1pZGRsZXdhcmUoaW5uZXJBcmd2LCB5YXJncywgbWlkZGxld2FyZXMsIHRydWUpO1xuICAgICAgICByZXR1cm4gaXNQcm9taXNlKG1heWJlUHJvbWlzZUFyZ3YpXG4gICAgICAgICAgICA/IG1heWJlUHJvbWlzZUFyZ3YudGhlbihyZXNvbHZlZElubmVyQXJndiA9PiB0aGlzLmhhbmRsZVZhbGlkYXRpb25BbmRHZXRSZXN1bHQoaXNEZWZhdWx0Q29tbWFuZCwgY29tbWFuZEhhbmRsZXIsIHJlc29sdmVkSW5uZXJBcmd2LCBjdXJyZW50Q29udGV4dCwgYWxpYXNlcywgeWFyZ3MsIG1pZGRsZXdhcmVzLCBwb3NpdGlvbmFsTWFwKSlcbiAgICAgICAgICAgIDogdGhpcy5oYW5kbGVWYWxpZGF0aW9uQW5kR2V0UmVzdWx0KGlzRGVmYXVsdENvbW1hbmQsIGNvbW1hbmRIYW5kbGVyLCBtYXliZVByb21pc2VBcmd2LCBjdXJyZW50Q29udGV4dCwgYWxpYXNlcywgeWFyZ3MsIG1pZGRsZXdhcmVzLCBwb3NpdGlvbmFsTWFwKTtcbiAgICB9XG4gICAgcG9wdWxhdGVQb3NpdGlvbmFscyhjb21tYW5kSGFuZGxlciwgYXJndiwgY29udGV4dCwgeWFyZ3MpIHtcbiAgICAgICAgYXJndi5fID0gYXJndi5fLnNsaWNlKGNvbnRleHQuY29tbWFuZHMubGVuZ3RoKTtcbiAgICAgICAgY29uc3QgZGVtYW5kZWQgPSBjb21tYW5kSGFuZGxlci5kZW1hbmRlZC5zbGljZSgwKTtcbiAgICAgICAgY29uc3Qgb3B0aW9uYWwgPSBjb21tYW5kSGFuZGxlci5vcHRpb25hbC5zbGljZSgwKTtcbiAgICAgICAgY29uc3QgcG9zaXRpb25hbE1hcCA9IHt9O1xuICAgICAgICB0aGlzLnZhbGlkYXRpb24ucG9zaXRpb25hbENvdW50KGRlbWFuZGVkLmxlbmd0aCwgYXJndi5fLmxlbmd0aCk7XG4gICAgICAgIHdoaWxlIChkZW1hbmRlZC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlbWFuZCA9IGRlbWFuZGVkLnNoaWZ0KCk7XG4gICAgICAgICAgICB0aGlzLnBvcHVsYXRlUG9zaXRpb25hbChkZW1hbmQsIGFyZ3YsIHBvc2l0aW9uYWxNYXApO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChvcHRpb25hbC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IG1heWJlID0gb3B0aW9uYWwuc2hpZnQoKTtcbiAgICAgICAgICAgIHRoaXMucG9wdWxhdGVQb3NpdGlvbmFsKG1heWJlLCBhcmd2LCBwb3NpdGlvbmFsTWFwKTtcbiAgICAgICAgfVxuICAgICAgICBhcmd2Ll8gPSBjb250ZXh0LmNvbW1hbmRzLmNvbmNhdChhcmd2Ll8ubWFwKGEgPT4gJycgKyBhKSk7XG4gICAgICAgIHRoaXMucG9zdFByb2Nlc3NQb3NpdGlvbmFscyhhcmd2LCBwb3NpdGlvbmFsTWFwLCB0aGlzLmNtZFRvUGFyc2VPcHRpb25zKGNvbW1hbmRIYW5kbGVyLm9yaWdpbmFsKSwgeWFyZ3MpO1xuICAgICAgICByZXR1cm4gcG9zaXRpb25hbE1hcDtcbiAgICB9XG4gICAgcG9wdWxhdGVQb3NpdGlvbmFsKHBvc2l0aW9uYWwsIGFyZ3YsIHBvc2l0aW9uYWxNYXApIHtcbiAgICAgICAgY29uc3QgY21kID0gcG9zaXRpb25hbC5jbWRbMF07XG4gICAgICAgIGlmIChwb3NpdGlvbmFsLnZhcmlhZGljKSB7XG4gICAgICAgICAgICBwb3NpdGlvbmFsTWFwW2NtZF0gPSBhcmd2Ll8uc3BsaWNlKDApLm1hcChTdHJpbmcpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGFyZ3YuXy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgcG9zaXRpb25hbE1hcFtjbWRdID0gW1N0cmluZyhhcmd2Ll8uc2hpZnQoKSldO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNtZFRvUGFyc2VPcHRpb25zKGNtZFN0cmluZykge1xuICAgICAgICBjb25zdCBwYXJzZU9wdGlvbnMgPSB7XG4gICAgICAgICAgICBhcnJheTogW10sXG4gICAgICAgICAgICBkZWZhdWx0OiB7fSxcbiAgICAgICAgICAgIGFsaWFzOiB7fSxcbiAgICAgICAgICAgIGRlbWFuZDoge30sXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlQ29tbWFuZChjbWRTdHJpbmcpO1xuICAgICAgICBwYXJzZWQuZGVtYW5kZWQuZm9yRWFjaChkID0+IHtcbiAgICAgICAgICAgIGNvbnN0IFtjbWQsIC4uLmFsaWFzZXNdID0gZC5jbWQ7XG4gICAgICAgICAgICBpZiAoZC52YXJpYWRpYykge1xuICAgICAgICAgICAgICAgIHBhcnNlT3B0aW9ucy5hcnJheS5wdXNoKGNtZCk7XG4gICAgICAgICAgICAgICAgcGFyc2VPcHRpb25zLmRlZmF1bHRbY21kXSA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGFyc2VPcHRpb25zLmFsaWFzW2NtZF0gPSBhbGlhc2VzO1xuICAgICAgICAgICAgcGFyc2VPcHRpb25zLmRlbWFuZFtjbWRdID0gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHBhcnNlZC5vcHRpb25hbC5mb3JFYWNoKG8gPT4ge1xuICAgICAgICAgICAgY29uc3QgW2NtZCwgLi4uYWxpYXNlc10gPSBvLmNtZDtcbiAgICAgICAgICAgIGlmIChvLnZhcmlhZGljKSB7XG4gICAgICAgICAgICAgICAgcGFyc2VPcHRpb25zLmFycmF5LnB1c2goY21kKTtcbiAgICAgICAgICAgICAgICBwYXJzZU9wdGlvbnMuZGVmYXVsdFtjbWRdID0gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYXJzZU9wdGlvbnMuYWxpYXNbY21kXSA9IGFsaWFzZXM7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcGFyc2VPcHRpb25zO1xuICAgIH1cbiAgICBwb3N0UHJvY2Vzc1Bvc2l0aW9uYWxzKGFyZ3YsIHBvc2l0aW9uYWxNYXAsIHBhcnNlT3B0aW9ucywgeWFyZ3MpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHlhcmdzLmdldE9wdGlvbnMoKSk7XG4gICAgICAgIG9wdGlvbnMuZGVmYXVsdCA9IE9iamVjdC5hc3NpZ24ocGFyc2VPcHRpb25zLmRlZmF1bHQsIG9wdGlvbnMuZGVmYXVsdCk7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHBhcnNlT3B0aW9ucy5hbGlhcykpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuYWxpYXNba2V5XSA9IChvcHRpb25zLmFsaWFzW2tleV0gfHwgW10pLmNvbmNhdChwYXJzZU9wdGlvbnMuYWxpYXNba2V5XSk7XG4gICAgICAgIH1cbiAgICAgICAgb3B0aW9ucy5hcnJheSA9IG9wdGlvbnMuYXJyYXkuY29uY2F0KHBhcnNlT3B0aW9ucy5hcnJheSk7XG4gICAgICAgIG9wdGlvbnMuY29uZmlnID0ge307XG4gICAgICAgIGNvbnN0IHVucGFyc2VkID0gW107XG4gICAgICAgIE9iamVjdC5rZXlzKHBvc2l0aW9uYWxNYXApLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgIHBvc2l0aW9uYWxNYXBba2V5XS5tYXAodmFsdWUgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmNvbmZpZ3VyYXRpb25bJ3Vua25vd24tb3B0aW9ucy1hcy1hcmdzJ10pXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMua2V5W2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIHVucGFyc2VkLnB1c2goYC0tJHtrZXl9YCk7XG4gICAgICAgICAgICAgICAgdW5wYXJzZWQucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghdW5wYXJzZWQubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBjb25zdCBjb25maWcgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLmNvbmZpZ3VyYXRpb24sIHtcbiAgICAgICAgICAgICdwb3B1bGF0ZS0tJzogZmFsc2UsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBwYXJzZWQgPSB0aGlzLnNoaW0uUGFyc2VyLmRldGFpbGVkKHVucGFyc2VkLCBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLCB7XG4gICAgICAgICAgICBjb25maWd1cmF0aW9uOiBjb25maWcsXG4gICAgICAgIH0pKTtcbiAgICAgICAgaWYgKHBhcnNlZC5lcnJvcikge1xuICAgICAgICAgICAgeWFyZ3NcbiAgICAgICAgICAgICAgICAuZ2V0SW50ZXJuYWxNZXRob2RzKClcbiAgICAgICAgICAgICAgICAuZ2V0VXNhZ2VJbnN0YW5jZSgpXG4gICAgICAgICAgICAgICAgLmZhaWwocGFyc2VkLmVycm9yLm1lc3NhZ2UsIHBhcnNlZC5lcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBwb3NpdGlvbmFsS2V5cyA9IE9iamVjdC5rZXlzKHBvc2l0aW9uYWxNYXApO1xuICAgICAgICAgICAgT2JqZWN0LmtleXMocG9zaXRpb25hbE1hcCkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uYWxLZXlzLnB1c2goLi4ucGFyc2VkLmFsaWFzZXNba2V5XSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKHBhcnNlZC5hcmd2KS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uYWxLZXlzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwb3NpdGlvbmFsTWFwW2tleV0pXG4gICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbmFsTWFwW2tleV0gPSBwYXJzZWQuYXJndltrZXldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNJbkNvbmZpZ3MoeWFyZ3MsIGtleSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICF0aGlzLmlzRGVmYXVsdGVkKHlhcmdzLCBrZXkpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYXJndiwga2V5KSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHBhcnNlZC5hcmd2LCBrZXkpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAoQXJyYXkuaXNBcnJheShhcmd2W2tleV0pIHx8IEFycmF5LmlzQXJyYXkocGFyc2VkLmFyZ3Zba2V5XSkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmd2W2tleV0gPSBbXS5jb25jYXQoYXJndltrZXldLCBwYXJzZWQuYXJndltrZXldKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3Zba2V5XSA9IHBhcnNlZC5hcmd2W2tleV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpc0RlZmF1bHRlZCh5YXJncywga2V5KSB7XG4gICAgICAgIGNvbnN0IHsgZGVmYXVsdDogZGVmYXVsdHMgfSA9IHlhcmdzLmdldE9wdGlvbnMoKTtcbiAgICAgICAgcmV0dXJuIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGVmYXVsdHMsIGtleSkgfHxcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkZWZhdWx0cywgdGhpcy5zaGltLlBhcnNlci5jYW1lbENhc2Uoa2V5KSkpO1xuICAgIH1cbiAgICBpc0luQ29uZmlncyh5YXJncywga2V5KSB7XG4gICAgICAgIGNvbnN0IHsgY29uZmlnT2JqZWN0cyB9ID0geWFyZ3MuZ2V0T3B0aW9ucygpO1xuICAgICAgICByZXR1cm4gKGNvbmZpZ09iamVjdHMuc29tZShjID0+IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjLCBrZXkpKSB8fFxuICAgICAgICAgICAgY29uZmlnT2JqZWN0cy5zb21lKGMgPT4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGMsIHRoaXMuc2hpbS5QYXJzZXIuY2FtZWxDYXNlKGtleSkpKSk7XG4gICAgfVxuICAgIHJ1bkRlZmF1bHRCdWlsZGVyT24oeWFyZ3MpIHtcbiAgICAgICAgaWYgKCF0aGlzLmRlZmF1bHRDb21tYW5kKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpZiAodGhpcy5zaG91bGRVcGRhdGVVc2FnZSh5YXJncykpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbW1hbmRTdHJpbmcgPSBERUZBVUxUX01BUktFUi50ZXN0KHRoaXMuZGVmYXVsdENvbW1hbmQub3JpZ2luYWwpXG4gICAgICAgICAgICAgICAgPyB0aGlzLmRlZmF1bHRDb21tYW5kLm9yaWdpbmFsXG4gICAgICAgICAgICAgICAgOiB0aGlzLmRlZmF1bHRDb21tYW5kLm9yaWdpbmFsLnJlcGxhY2UoL15bXltcXF08Pl0qLywgJyQwICcpO1xuICAgICAgICAgICAgeWFyZ3NcbiAgICAgICAgICAgICAgICAuZ2V0SW50ZXJuYWxNZXRob2RzKClcbiAgICAgICAgICAgICAgICAuZ2V0VXNhZ2VJbnN0YW5jZSgpXG4gICAgICAgICAgICAgICAgLnVzYWdlKGNvbW1hbmRTdHJpbmcsIHRoaXMuZGVmYXVsdENvbW1hbmQuZGVzY3JpcHRpb24pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSB0aGlzLmRlZmF1bHRDb21tYW5kLmJ1aWxkZXI7XG4gICAgICAgIGlmIChpc0NvbW1hbmRCdWlsZGVyQ2FsbGJhY2soYnVpbGRlcikpIHtcbiAgICAgICAgICAgIHJldHVybiBidWlsZGVyKHlhcmdzLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghaXNDb21tYW5kQnVpbGRlckRlZmluaXRpb24oYnVpbGRlcikpIHtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGJ1aWxkZXIpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgICAgICB5YXJncy5vcHRpb24oa2V5LCBidWlsZGVyW2tleV0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgbW9kdWxlTmFtZShvYmopIHtcbiAgICAgICAgY29uc3QgbW9kID0gd2hpY2hNb2R1bGUob2JqKTtcbiAgICAgICAgaWYgKCFtb2QpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGNvbW1hbmQgbmFtZSBnaXZlbiBmb3IgbW9kdWxlOiAke3RoaXMuc2hpbS5pbnNwZWN0KG9iail9YCk7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbW1hbmRGcm9tRmlsZW5hbWUobW9kLmZpbGVuYW1lKTtcbiAgICB9XG4gICAgY29tbWFuZEZyb21GaWxlbmFtZShmaWxlbmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5zaGltLnBhdGguYmFzZW5hbWUoZmlsZW5hbWUsIHRoaXMuc2hpbS5wYXRoLmV4dG5hbWUoZmlsZW5hbWUpKTtcbiAgICB9XG4gICAgZXh0cmFjdERlc2MoeyBkZXNjcmliZSwgZGVzY3JpcHRpb24sIGRlc2MgfSkge1xuICAgICAgICBmb3IgKGNvbnN0IHRlc3Qgb2YgW2Rlc2NyaWJlLCBkZXNjcmlwdGlvbiwgZGVzY10pIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGVzdCA9PT0gJ3N0cmluZycgfHwgdGVzdCA9PT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRlc3Q7XG4gICAgICAgICAgICBhc3NlcnROb3RTdHJpY3RFcXVhbCh0ZXN0LCB0cnVlLCB0aGlzLnNoaW0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZnJlZXplKCkge1xuICAgICAgICB0aGlzLmZyb3plbnMucHVzaCh7XG4gICAgICAgICAgICBoYW5kbGVyczogdGhpcy5oYW5kbGVycyxcbiAgICAgICAgICAgIGFsaWFzTWFwOiB0aGlzLmFsaWFzTWFwLFxuICAgICAgICAgICAgZGVmYXVsdENvbW1hbmQ6IHRoaXMuZGVmYXVsdENvbW1hbmQsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB1bmZyZWV6ZSgpIHtcbiAgICAgICAgY29uc3QgZnJvemVuID0gdGhpcy5mcm96ZW5zLnBvcCgpO1xuICAgICAgICBhc3NlcnROb3RTdHJpY3RFcXVhbChmcm96ZW4sIHVuZGVmaW5lZCwgdGhpcy5zaGltKTtcbiAgICAgICAgKHtcbiAgICAgICAgICAgIGhhbmRsZXJzOiB0aGlzLmhhbmRsZXJzLFxuICAgICAgICAgICAgYWxpYXNNYXA6IHRoaXMuYWxpYXNNYXAsXG4gICAgICAgICAgICBkZWZhdWx0Q29tbWFuZDogdGhpcy5kZWZhdWx0Q29tbWFuZCxcbiAgICAgICAgfSA9IGZyb3plbik7XG4gICAgfVxuICAgIHJlc2V0KCkge1xuICAgICAgICB0aGlzLmhhbmRsZXJzID0ge307XG4gICAgICAgIHRoaXMuYWxpYXNNYXAgPSB7fTtcbiAgICAgICAgdGhpcy5kZWZhdWx0Q29tbWFuZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5yZXF1aXJlQ2FjaGUgPSBuZXcgU2V0KCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBjb21tYW5kKHVzYWdlLCB2YWxpZGF0aW9uLCBnbG9iYWxNaWRkbGV3YXJlLCBzaGltKSB7XG4gICAgcmV0dXJuIG5ldyBDb21tYW5kSW5zdGFuY2UodXNhZ2UsIHZhbGlkYXRpb24sIGdsb2JhbE1pZGRsZXdhcmUsIHNoaW0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQ29tbWFuZEJ1aWxkZXJEZWZpbml0aW9uKGJ1aWxkZXIpIHtcbiAgICByZXR1cm4gKHR5cGVvZiBidWlsZGVyID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAhIWJ1aWxkZXIuYnVpbGRlciAmJlxuICAgICAgICB0eXBlb2YgYnVpbGRlci5oYW5kbGVyID09PSAnZnVuY3Rpb24nKTtcbn1cbmZ1bmN0aW9uIGlzQ29tbWFuZEFuZEFsaWFzZXMoY21kKSB7XG4gICAgcmV0dXJuIGNtZC5ldmVyeShjID0+IHR5cGVvZiBjID09PSAnc3RyaW5nJyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNDb21tYW5kQnVpbGRlckNhbGxiYWNrKGJ1aWxkZXIpIHtcbiAgICByZXR1cm4gdHlwZW9mIGJ1aWxkZXIgPT09ICdmdW5jdGlvbic7XG59XG5mdW5jdGlvbiBpc0NvbW1hbmRCdWlsZGVyT3B0aW9uRGVmaW5pdGlvbnMoYnVpbGRlcikge1xuICAgIHJldHVybiB0eXBlb2YgYnVpbGRlciA9PT0gJ29iamVjdCc7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNDb21tYW5kSGFuZGxlckRlZmluaXRpb24oY21kKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBjbWQgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KGNtZCk7XG59XG4iLCJ2YXIgX19jbGFzc1ByaXZhdGVGaWVsZFNldCA9ICh0aGlzICYmIHRoaXMuX19jbGFzc1ByaXZhdGVGaWVsZFNldCkgfHwgZnVuY3Rpb24gKHJlY2VpdmVyLCBzdGF0ZSwgdmFsdWUsIGtpbmQsIGYpIHtcbiAgICBpZiAoa2luZCA9PT0gXCJtXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIG1ldGhvZCBpcyBub3Qgd3JpdGFibGVcIik7XG4gICAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgc2V0dGVyXCIpO1xuICAgIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHdyaXRlIHByaXZhdGUgbWVtYmVyIHRvIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XG4gICAgcmV0dXJuIChraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlciwgdmFsdWUpIDogZiA/IGYudmFsdWUgPSB2YWx1ZSA6IHN0YXRlLnNldChyZWNlaXZlciwgdmFsdWUpKSwgdmFsdWU7XG59O1xudmFyIF9fY2xhc3NQcml2YXRlRmllbGRHZXQgPSAodGhpcyAmJiB0aGlzLl9fY2xhc3NQcml2YXRlRmllbGRHZXQpIHx8IGZ1bmN0aW9uIChyZWNlaXZlciwgc3RhdGUsIGtpbmQsIGYpIHtcbiAgICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBnZXR0ZXJcIik7XG4gICAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgIT09IHN0YXRlIHx8ICFmIDogIXN0YXRlLmhhcyhyZWNlaXZlcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgcmVhZCBwcml2YXRlIG1lbWJlciBmcm9tIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XG4gICAgcmV0dXJuIGtpbmQgPT09IFwibVwiID8gZiA6IGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyKSA6IGYgPyBmLnZhbHVlIDogc3RhdGUuZ2V0KHJlY2VpdmVyKTtcbn07XG52YXIgX1lhcmdzSW5zdGFuY2VfY29tbWFuZCwgX1lhcmdzSW5zdGFuY2VfY3dkLCBfWWFyZ3NJbnN0YW5jZV9jb250ZXh0LCBfWWFyZ3NJbnN0YW5jZV9jb21wbGV0aW9uLCBfWWFyZ3NJbnN0YW5jZV9jb21wbGV0aW9uQ29tbWFuZCwgX1lhcmdzSW5zdGFuY2VfZGVmYXVsdFNob3dIaWRkZW5PcHQsIF9ZYXJnc0luc3RhbmNlX2V4aXRFcnJvciwgX1lhcmdzSW5zdGFuY2VfZGV0ZWN0TG9jYWxlLCBfWWFyZ3NJbnN0YW5jZV9lbWl0dGVkV2FybmluZ3MsIF9ZYXJnc0luc3RhbmNlX2V4aXRQcm9jZXNzLCBfWWFyZ3NJbnN0YW5jZV9mcm96ZW5zLCBfWWFyZ3NJbnN0YW5jZV9nbG9iYWxNaWRkbGV3YXJlLCBfWWFyZ3NJbnN0YW5jZV9ncm91cHMsIF9ZYXJnc0luc3RhbmNlX2hhc091dHB1dCwgX1lhcmdzSW5zdGFuY2VfaGVscE9wdCwgX1lhcmdzSW5zdGFuY2VfaXNHbG9iYWxDb250ZXh0LCBfWWFyZ3NJbnN0YW5jZV9sb2dnZXIsIF9ZYXJnc0luc3RhbmNlX291dHB1dCwgX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucywgX1lhcmdzSW5zdGFuY2VfcGFyZW50UmVxdWlyZSwgX1lhcmdzSW5zdGFuY2VfcGFyc2VyQ29uZmlnLCBfWWFyZ3NJbnN0YW5jZV9wYXJzZUZuLCBfWWFyZ3NJbnN0YW5jZV9wYXJzZUNvbnRleHQsIF9ZYXJnc0luc3RhbmNlX3BrZ3MsIF9ZYXJnc0luc3RhbmNlX3ByZXNlcnZlZEdyb3VwcywgX1lhcmdzSW5zdGFuY2VfcHJvY2Vzc0FyZ3MsIF9ZYXJnc0luc3RhbmNlX3JlY29tbWVuZENvbW1hbmRzLCBfWWFyZ3NJbnN0YW5jZV9zaGltLCBfWWFyZ3NJbnN0YW5jZV9zdHJpY3QsIF9ZYXJnc0luc3RhbmNlX3N0cmljdENvbW1hbmRzLCBfWWFyZ3NJbnN0YW5jZV9zdHJpY3RPcHRpb25zLCBfWWFyZ3NJbnN0YW5jZV91c2FnZSwgX1lhcmdzSW5zdGFuY2VfdXNhZ2VDb25maWcsIF9ZYXJnc0luc3RhbmNlX3ZlcnNpb25PcHQsIF9ZYXJnc0luc3RhbmNlX3ZhbGlkYXRpb247XG5pbXBvcnQgeyBjb21tYW5kIGFzIENvbW1hbmQsIH0gZnJvbSAnLi9jb21tYW5kLmpzJztcbmltcG9ydCB7IGFzc2VydE5vdFN0cmljdEVxdWFsLCBhc3NlcnRTaW5nbGVLZXksIG9iamVjdEtleXMsIH0gZnJvbSAnLi90eXBpbmdzL2NvbW1vbi10eXBlcy5qcyc7XG5pbXBvcnQgeyBZRXJyb3IgfSBmcm9tICcuL3llcnJvci5qcyc7XG5pbXBvcnQgeyB1c2FnZSBhcyBVc2FnZSB9IGZyb20gJy4vdXNhZ2UuanMnO1xuaW1wb3J0IHsgYXJnc2VydCB9IGZyb20gJy4vYXJnc2VydC5qcyc7XG5pbXBvcnQgeyBjb21wbGV0aW9uIGFzIENvbXBsZXRpb24sIH0gZnJvbSAnLi9jb21wbGV0aW9uLmpzJztcbmltcG9ydCB7IHZhbGlkYXRpb24gYXMgVmFsaWRhdGlvbiwgfSBmcm9tICcuL3ZhbGlkYXRpb24uanMnO1xuaW1wb3J0IHsgb2JqRmlsdGVyIH0gZnJvbSAnLi91dGlscy9vYmotZmlsdGVyLmpzJztcbmltcG9ydCB7IGFwcGx5RXh0ZW5kcyB9IGZyb20gJy4vdXRpbHMvYXBwbHktZXh0ZW5kcy5qcyc7XG5pbXBvcnQgeyBhcHBseU1pZGRsZXdhcmUsIEdsb2JhbE1pZGRsZXdhcmUsIH0gZnJvbSAnLi9taWRkbGV3YXJlLmpzJztcbmltcG9ydCB7IGlzUHJvbWlzZSB9IGZyb20gJy4vdXRpbHMvaXMtcHJvbWlzZS5qcyc7XG5pbXBvcnQgeyBtYXliZUFzeW5jUmVzdWx0IH0gZnJvbSAnLi91dGlscy9tYXliZS1hc3luYy1yZXN1bHQuanMnO1xuaW1wb3J0IHNldEJsb2NraW5nIGZyb20gJy4vdXRpbHMvc2V0LWJsb2NraW5nLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBZYXJnc0ZhY3RvcnkoX3NoaW0pIHtcbiAgICByZXR1cm4gKHByb2Nlc3NBcmdzID0gW10sIGN3ZCA9IF9zaGltLnByb2Nlc3MuY3dkKCksIHBhcmVudFJlcXVpcmUpID0+IHtcbiAgICAgICAgY29uc3QgeWFyZ3MgPSBuZXcgWWFyZ3NJbnN0YW5jZShwcm9jZXNzQXJncywgY3dkLCBwYXJlbnRSZXF1aXJlLCBfc2hpbSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh5YXJncywgJ2FyZ3YnLCB7XG4gICAgICAgICAgICBnZXQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4geWFyZ3MucGFyc2UoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgICAgeWFyZ3MuaGVscCgpO1xuICAgICAgICB5YXJncy52ZXJzaW9uKCk7XG4gICAgICAgIHJldHVybiB5YXJncztcbiAgICB9O1xufVxuY29uc3Qga0NvcHlEb3VibGVEYXNoID0gU3ltYm9sKCdjb3B5RG91YmxlRGFzaCcpO1xuY29uc3Qga0NyZWF0ZUxvZ2dlciA9IFN5bWJvbCgnY29weURvdWJsZURhc2gnKTtcbmNvbnN0IGtEZWxldGVGcm9tUGFyc2VySGludE9iamVjdCA9IFN5bWJvbCgnZGVsZXRlRnJvbVBhcnNlckhpbnRPYmplY3QnKTtcbmNvbnN0IGtFbWl0V2FybmluZyA9IFN5bWJvbCgnZW1pdFdhcm5pbmcnKTtcbmNvbnN0IGtGcmVlemUgPSBTeW1ib2woJ2ZyZWV6ZScpO1xuY29uc3Qga0dldERvbGxhclplcm8gPSBTeW1ib2woJ2dldERvbGxhclplcm8nKTtcbmNvbnN0IGtHZXRQYXJzZXJDb25maWd1cmF0aW9uID0gU3ltYm9sKCdnZXRQYXJzZXJDb25maWd1cmF0aW9uJyk7XG5jb25zdCBrR2V0VXNhZ2VDb25maWd1cmF0aW9uID0gU3ltYm9sKCdnZXRVc2FnZUNvbmZpZ3VyYXRpb24nKTtcbmNvbnN0IGtHdWVzc0xvY2FsZSA9IFN5bWJvbCgnZ3Vlc3NMb2NhbGUnKTtcbmNvbnN0IGtHdWVzc1ZlcnNpb24gPSBTeW1ib2woJ2d1ZXNzVmVyc2lvbicpO1xuY29uc3Qga1BhcnNlUG9zaXRpb25hbE51bWJlcnMgPSBTeW1ib2woJ3BhcnNlUG9zaXRpb25hbE51bWJlcnMnKTtcbmNvbnN0IGtQa2dVcCA9IFN5bWJvbCgncGtnVXAnKTtcbmNvbnN0IGtQb3B1bGF0ZVBhcnNlckhpbnRBcnJheSA9IFN5bWJvbCgncG9wdWxhdGVQYXJzZXJIaW50QXJyYXknKTtcbmNvbnN0IGtQb3B1bGF0ZVBhcnNlckhpbnRTaW5nbGVWYWx1ZURpY3Rpb25hcnkgPSBTeW1ib2woJ3BvcHVsYXRlUGFyc2VySGludFNpbmdsZVZhbHVlRGljdGlvbmFyeScpO1xuY29uc3Qga1BvcHVsYXRlUGFyc2VySGludEFycmF5RGljdGlvbmFyeSA9IFN5bWJvbCgncG9wdWxhdGVQYXJzZXJIaW50QXJyYXlEaWN0aW9uYXJ5Jyk7XG5jb25zdCBrUG9wdWxhdGVQYXJzZXJIaW50RGljdGlvbmFyeSA9IFN5bWJvbCgncG9wdWxhdGVQYXJzZXJIaW50RGljdGlvbmFyeScpO1xuY29uc3Qga1Nhbml0aXplS2V5ID0gU3ltYm9sKCdzYW5pdGl6ZUtleScpO1xuY29uc3Qga1NldEtleSA9IFN5bWJvbCgnc2V0S2V5Jyk7XG5jb25zdCBrVW5mcmVlemUgPSBTeW1ib2woJ3VuZnJlZXplJyk7XG5jb25zdCBrVmFsaWRhdGVBc3luYyA9IFN5bWJvbCgndmFsaWRhdGVBc3luYycpO1xuY29uc3Qga0dldENvbW1hbmRJbnN0YW5jZSA9IFN5bWJvbCgnZ2V0Q29tbWFuZEluc3RhbmNlJyk7XG5jb25zdCBrR2V0Q29udGV4dCA9IFN5bWJvbCgnZ2V0Q29udGV4dCcpO1xuY29uc3Qga0dldEhhc091dHB1dCA9IFN5bWJvbCgnZ2V0SGFzT3V0cHV0Jyk7XG5jb25zdCBrR2V0TG9nZ2VySW5zdGFuY2UgPSBTeW1ib2woJ2dldExvZ2dlckluc3RhbmNlJyk7XG5jb25zdCBrR2V0UGFyc2VDb250ZXh0ID0gU3ltYm9sKCdnZXRQYXJzZUNvbnRleHQnKTtcbmNvbnN0IGtHZXRVc2FnZUluc3RhbmNlID0gU3ltYm9sKCdnZXRVc2FnZUluc3RhbmNlJyk7XG5jb25zdCBrR2V0VmFsaWRhdGlvbkluc3RhbmNlID0gU3ltYm9sKCdnZXRWYWxpZGF0aW9uSW5zdGFuY2UnKTtcbmNvbnN0IGtIYXNQYXJzZUNhbGxiYWNrID0gU3ltYm9sKCdoYXNQYXJzZUNhbGxiYWNrJyk7XG5jb25zdCBrSXNHbG9iYWxDb250ZXh0ID0gU3ltYm9sKCdpc0dsb2JhbENvbnRleHQnKTtcbmNvbnN0IGtQb3N0UHJvY2VzcyA9IFN5bWJvbCgncG9zdFByb2Nlc3MnKTtcbmNvbnN0IGtSZWJhc2UgPSBTeW1ib2woJ3JlYmFzZScpO1xuY29uc3Qga1Jlc2V0ID0gU3ltYm9sKCdyZXNldCcpO1xuY29uc3Qga1J1bllhcmdzUGFyc2VyQW5kRXhlY3V0ZUNvbW1hbmRzID0gU3ltYm9sKCdydW5ZYXJnc1BhcnNlckFuZEV4ZWN1dGVDb21tYW5kcycpO1xuY29uc3Qga1J1blZhbGlkYXRpb24gPSBTeW1ib2woJ3J1blZhbGlkYXRpb24nKTtcbmNvbnN0IGtTZXRIYXNPdXRwdXQgPSBTeW1ib2woJ3NldEhhc091dHB1dCcpO1xuY29uc3Qga1RyYWNrTWFudWFsbHlTZXRLZXlzID0gU3ltYm9sKCdrVHJhY2tNYW51YWxseVNldEtleXMnKTtcbmV4cG9ydCBjbGFzcyBZYXJnc0luc3RhbmNlIHtcbiAgICBjb25zdHJ1Y3Rvcihwcm9jZXNzQXJncyA9IFtdLCBjd2QsIHBhcmVudFJlcXVpcmUsIHNoaW0pIHtcbiAgICAgICAgdGhpcy5jdXN0b21TY3JpcHROYW1lID0gZmFsc2U7XG4gICAgICAgIHRoaXMucGFyc2VkID0gZmFsc2U7XG4gICAgICAgIF9ZYXJnc0luc3RhbmNlX2NvbW1hbmQuc2V0KHRoaXMsIHZvaWQgMCk7XG4gICAgICAgIF9ZYXJnc0luc3RhbmNlX2N3ZC5zZXQodGhpcywgdm9pZCAwKTtcbiAgICAgICAgX1lhcmdzSW5zdGFuY2VfY29udGV4dC5zZXQodGhpcywgeyBjb21tYW5kczogW10sIGZ1bGxDb21tYW5kczogW10gfSk7XG4gICAgICAgIF9ZYXJnc0luc3RhbmNlX2NvbXBsZXRpb24uc2V0KHRoaXMsIG51bGwpO1xuICAgICAgICBfWWFyZ3NJbnN0YW5jZV9jb21wbGV0aW9uQ29tbWFuZC5zZXQodGhpcywgbnVsbCk7XG4gICAgICAgIF9ZYXJnc0luc3RhbmNlX2RlZmF1bHRTaG93SGlkZGVuT3B0LnNldCh0aGlzLCAnc2hvdy1oaWRkZW4nKTtcbiAgICAgICAgX1lhcmdzSW5zdGFuY2VfZXhpdEVycm9yLnNldCh0aGlzLCBudWxsKTtcbiAgICAgICAgX1lhcmdzSW5zdGFuY2VfZGV0ZWN0TG9jYWxlLnNldCh0aGlzLCB0cnVlKTtcbiAgICAgICAgX1lhcmdzSW5zdGFuY2VfZW1pdHRlZFdhcm5pbmdzLnNldCh0aGlzLCB7fSk7XG4gICAgICAgIF9ZYXJnc0luc3RhbmNlX2V4aXRQcm9jZXNzLnNldCh0aGlzLCB0cnVlKTtcbiAgICAgICAgX1lhcmdzSW5zdGFuY2VfZnJvemVucy5zZXQodGhpcywgW10pO1xuICAgICAgICBfWWFyZ3NJbnN0YW5jZV9nbG9iYWxNaWRkbGV3YXJlLnNldCh0aGlzLCB2b2lkIDApO1xuICAgICAgICBfWWFyZ3NJbnN0YW5jZV9ncm91cHMuc2V0KHRoaXMsIHt9KTtcbiAgICAgICAgX1lhcmdzSW5zdGFuY2VfaGFzT3V0cHV0LnNldCh0aGlzLCBmYWxzZSk7XG4gICAgICAgIF9ZYXJnc0luc3RhbmNlX2hlbHBPcHQuc2V0KHRoaXMsIG51bGwpO1xuICAgICAgICBfWWFyZ3NJbnN0YW5jZV9pc0dsb2JhbENvbnRleHQuc2V0KHRoaXMsIHRydWUpO1xuICAgICAgICBfWWFyZ3NJbnN0YW5jZV9sb2dnZXIuc2V0KHRoaXMsIHZvaWQgMCk7XG4gICAgICAgIF9ZYXJnc0luc3RhbmNlX291dHB1dC5zZXQodGhpcywgJycpO1xuICAgICAgICBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLnNldCh0aGlzLCB2b2lkIDApO1xuICAgICAgICBfWWFyZ3NJbnN0YW5jZV9wYXJlbnRSZXF1aXJlLnNldCh0aGlzLCB2b2lkIDApO1xuICAgICAgICBfWWFyZ3NJbnN0YW5jZV9wYXJzZXJDb25maWcuc2V0KHRoaXMsIHt9KTtcbiAgICAgICAgX1lhcmdzSW5zdGFuY2VfcGFyc2VGbi5zZXQodGhpcywgbnVsbCk7XG4gICAgICAgIF9ZYXJnc0luc3RhbmNlX3BhcnNlQ29udGV4dC5zZXQodGhpcywgbnVsbCk7XG4gICAgICAgIF9ZYXJnc0luc3RhbmNlX3BrZ3Muc2V0KHRoaXMsIHt9KTtcbiAgICAgICAgX1lhcmdzSW5zdGFuY2VfcHJlc2VydmVkR3JvdXBzLnNldCh0aGlzLCB7fSk7XG4gICAgICAgIF9ZYXJnc0luc3RhbmNlX3Byb2Nlc3NBcmdzLnNldCh0aGlzLCB2b2lkIDApO1xuICAgICAgICBfWWFyZ3NJbnN0YW5jZV9yZWNvbW1lbmRDb21tYW5kcy5zZXQodGhpcywgZmFsc2UpO1xuICAgICAgICBfWWFyZ3NJbnN0YW5jZV9zaGltLnNldCh0aGlzLCB2b2lkIDApO1xuICAgICAgICBfWWFyZ3NJbnN0YW5jZV9zdHJpY3Quc2V0KHRoaXMsIGZhbHNlKTtcbiAgICAgICAgX1lhcmdzSW5zdGFuY2Vfc3RyaWN0Q29tbWFuZHMuc2V0KHRoaXMsIGZhbHNlKTtcbiAgICAgICAgX1lhcmdzSW5zdGFuY2Vfc3RyaWN0T3B0aW9ucy5zZXQodGhpcywgZmFsc2UpO1xuICAgICAgICBfWWFyZ3NJbnN0YW5jZV91c2FnZS5zZXQodGhpcywgdm9pZCAwKTtcbiAgICAgICAgX1lhcmdzSW5zdGFuY2VfdXNhZ2VDb25maWcuc2V0KHRoaXMsIHt9KTtcbiAgICAgICAgX1lhcmdzSW5zdGFuY2VfdmVyc2lvbk9wdC5zZXQodGhpcywgbnVsbCk7XG4gICAgICAgIF9ZYXJnc0luc3RhbmNlX3ZhbGlkYXRpb24uc2V0KHRoaXMsIHZvaWQgMCk7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc2hpbSwgc2hpbSwgXCJmXCIpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3Byb2Nlc3NBcmdzLCBwcm9jZXNzQXJncywgXCJmXCIpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2N3ZCwgY3dkLCBcImZcIik7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfcGFyZW50UmVxdWlyZSwgcGFyZW50UmVxdWlyZSwgXCJmXCIpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2dsb2JhbE1pZGRsZXdhcmUsIG5ldyBHbG9iYWxNaWRkbGV3YXJlKHRoaXMpLCBcImZcIik7XG4gICAgICAgIHRoaXMuJDAgPSB0aGlzW2tHZXREb2xsYXJaZXJvXSgpO1xuICAgICAgICB0aGlzW2tSZXNldF0oKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9jb21tYW5kLCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2NvbW1hbmQsIFwiZlwiKSwgXCJmXCIpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBcImZcIiksIFwiZlwiKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV92YWxpZGF0aW9uLCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3ZhbGlkYXRpb24sIFwiZlwiKSwgXCJmXCIpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucywgXCJmXCIpLCBcImZcIik7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucywgXCJmXCIpLnNob3dIaWRkZW5PcHQgPSBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2RlZmF1bHRTaG93SGlkZGVuT3B0LCBcImZcIik7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfbG9nZ2VyLCB0aGlzW2tDcmVhdGVMb2dnZXJdKCksIFwiZlwiKTtcbiAgICB9XG4gICAgYWRkSGVscE9wdChvcHQsIG1zZykge1xuICAgICAgICBjb25zdCBkZWZhdWx0SGVscE9wdCA9ICdoZWxwJztcbiAgICAgICAgYXJnc2VydCgnW3N0cmluZ3xib29sZWFuXSBbc3RyaW5nXScsIFtvcHQsIG1zZ10sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICBpZiAoX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9oZWxwT3B0LCBcImZcIikpIHtcbiAgICAgICAgICAgIHRoaXNba0RlbGV0ZUZyb21QYXJzZXJIaW50T2JqZWN0XShfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2hlbHBPcHQsIFwiZlwiKSk7XG4gICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2hlbHBPcHQsIG51bGwsIFwiZlwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0ID09PSBmYWxzZSAmJiBtc2cgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2hlbHBPcHQsIHR5cGVvZiBvcHQgPT09ICdzdHJpbmcnID8gb3B0IDogZGVmYXVsdEhlbHBPcHQsIFwiZlwiKTtcbiAgICAgICAgdGhpcy5ib29sZWFuKF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfaGVscE9wdCwgXCJmXCIpKTtcbiAgICAgICAgdGhpcy5kZXNjcmliZShfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2hlbHBPcHQsIFwiZlwiKSwgbXNnIHx8IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdXNhZ2UsIFwiZlwiKS5kZWZlclkxOG5Mb29rdXAoJ1Nob3cgaGVscCcpKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGhlbHAob3B0LCBtc2cpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkSGVscE9wdChvcHQsIG1zZyk7XG4gICAgfVxuICAgIGFkZFNob3dIaWRkZW5PcHQob3B0LCBtc2cpIHtcbiAgICAgICAgYXJnc2VydCgnW3N0cmluZ3xib29sZWFuXSBbc3RyaW5nXScsIFtvcHQsIG1zZ10sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICBpZiAob3B0ID09PSBmYWxzZSAmJiBtc2cgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICBjb25zdCBzaG93SGlkZGVuT3B0ID0gdHlwZW9mIG9wdCA9PT0gJ3N0cmluZycgPyBvcHQgOiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2RlZmF1bHRTaG93SGlkZGVuT3B0LCBcImZcIik7XG4gICAgICAgIHRoaXMuYm9vbGVhbihzaG93SGlkZGVuT3B0KTtcbiAgICAgICAgdGhpcy5kZXNjcmliZShzaG93SGlkZGVuT3B0LCBtc2cgfHwgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV91c2FnZSwgXCJmXCIpLmRlZmVyWTE4bkxvb2t1cCgnU2hvdyBoaWRkZW4gb3B0aW9ucycpKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBcImZcIikuc2hvd0hpZGRlbk9wdCA9IHNob3dIaWRkZW5PcHQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBzaG93SGlkZGVuKG9wdCwgbXNnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZFNob3dIaWRkZW5PcHQob3B0LCBtc2cpO1xuICAgIH1cbiAgICBhbGlhcyhrZXksIHZhbHVlKSB7XG4gICAgICAgIGFyZ3NlcnQoJzxvYmplY3R8c3RyaW5nfGFycmF5PiBbc3RyaW5nfGFycmF5XScsIFtrZXksIHZhbHVlXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIHRoaXNba1BvcHVsYXRlUGFyc2VySGludEFycmF5RGljdGlvbmFyeV0odGhpcy5hbGlhcy5iaW5kKHRoaXMpLCAnYWxpYXMnLCBrZXksIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGFycmF5KGtleXMpIHtcbiAgICAgICAgYXJnc2VydCgnPGFycmF5fHN0cmluZz4nLCBba2V5c10sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICB0aGlzW2tQb3B1bGF0ZVBhcnNlckhpbnRBcnJheV0oJ2FycmF5Jywga2V5cyk7XG4gICAgICAgIHRoaXNba1RyYWNrTWFudWFsbHlTZXRLZXlzXShrZXlzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGJvb2xlYW4oa2V5cykge1xuICAgICAgICBhcmdzZXJ0KCc8YXJyYXl8c3RyaW5nPicsIFtrZXlzXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIHRoaXNba1BvcHVsYXRlUGFyc2VySGludEFycmF5XSgnYm9vbGVhbicsIGtleXMpO1xuICAgICAgICB0aGlzW2tUcmFja01hbnVhbGx5U2V0S2V5c10oa2V5cyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBjaGVjayhmLCBnbG9iYWwpIHtcbiAgICAgICAgYXJnc2VydCgnPGZ1bmN0aW9uPiBbYm9vbGVhbl0nLCBbZiwgZ2xvYmFsXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIHRoaXMubWlkZGxld2FyZSgoYXJndiwgX3lhcmdzKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbWF5YmVBc3luY1Jlc3VsdCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGYoYXJndiwgX3lhcmdzLmdldE9wdGlvbnMoKSk7XG4gICAgICAgICAgICB9LCAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV91c2FnZSwgXCJmXCIpLmZhaWwoX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9zaGltLCBcImZcIikueTE4bi5fXygnQXJndW1lbnQgY2hlY2sgZmFpbGVkOiAlcycsIGYudG9TdHJpbmcoKSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgcmVzdWx0ID09PSAnc3RyaW5nJyB8fCByZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBcImZcIikuZmFpbChyZXN1bHQudG9TdHJpbmcoKSwgcmVzdWx0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFyZ3Y7XG4gICAgICAgICAgICB9LCAoZXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV91c2FnZSwgXCJmXCIpLmZhaWwoZXJyLm1lc3NhZ2UgPyBlcnIubWVzc2FnZSA6IGVyci50b1N0cmluZygpLCBlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBhcmd2O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sIGZhbHNlLCBnbG9iYWwpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgY2hvaWNlcyhrZXksIHZhbHVlKSB7XG4gICAgICAgIGFyZ3NlcnQoJzxvYmplY3R8c3RyaW5nfGFycmF5PiBbc3RyaW5nfGFycmF5XScsIFtrZXksIHZhbHVlXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIHRoaXNba1BvcHVsYXRlUGFyc2VySGludEFycmF5RGljdGlvbmFyeV0odGhpcy5jaG9pY2VzLmJpbmQodGhpcyksICdjaG9pY2VzJywga2V5LCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBjb2VyY2Uoa2V5cywgdmFsdWUpIHtcbiAgICAgICAgYXJnc2VydCgnPG9iamVjdHxzdHJpbmd8YXJyYXk+IFtmdW5jdGlvbl0nLCBba2V5cywgdmFsdWVdLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoa2V5cykpIHtcbiAgICAgICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWUVycm9yKCdjb2VyY2UgY2FsbGJhY2sgbXVzdCBiZSBwcm92aWRlZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgICAgICAgICAgIHRoaXMuY29lcmNlKGtleSwgdmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIGtleXMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhrZXlzKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29lcmNlKGtleSwga2V5c1trZXldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBZRXJyb3IoJ2NvZXJjZSBjYWxsYmFjayBtdXN0IGJlIHByb3ZpZGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBcImZcIikua2V5W2tleXNdID0gdHJ1ZTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9nbG9iYWxNaWRkbGV3YXJlLCBcImZcIikuYWRkQ29lcmNlTWlkZGxld2FyZSgoYXJndiwgeWFyZ3MpID0+IHtcbiAgICAgICAgICAgIGxldCBhbGlhc2VzO1xuICAgICAgICAgICAgY29uc3Qgc2hvdWxkQ29lcmNlID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGFyZ3YsIGtleXMpO1xuICAgICAgICAgICAgaWYgKCFzaG91bGRDb2VyY2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXJndjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBtYXliZUFzeW5jUmVzdWx0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBhbGlhc2VzID0geWFyZ3MuZ2V0QWxpYXNlcygpO1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZShhcmd2W2tleXNdKTtcbiAgICAgICAgICAgIH0sIChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICBhcmd2W2tleXNdID0gcmVzdWx0O1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0cmlwQWxpYXNlZCA9IHlhcmdzXG4gICAgICAgICAgICAgICAgICAgIC5nZXRJbnRlcm5hbE1ldGhvZHMoKVxuICAgICAgICAgICAgICAgICAgICAuZ2V0UGFyc2VyQ29uZmlndXJhdGlvbigpWydzdHJpcC1hbGlhc2VkJ107XG4gICAgICAgICAgICAgICAgaWYgKGFsaWFzZXNba2V5c10gJiYgc3RyaXBBbGlhc2VkICE9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYWxpYXMgb2YgYWxpYXNlc1trZXlzXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJndlthbGlhc10gPSByZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFyZ3Y7XG4gICAgICAgICAgICB9LCAoZXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFlFcnJvcihlcnIubWVzc2FnZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSwga2V5cyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBjb25mbGljdHMoa2V5MSwga2V5Mikge1xuICAgICAgICBhcmdzZXJ0KCc8c3RyaW5nfG9iamVjdD4gW3N0cmluZ3xhcnJheV0nLCBba2V5MSwga2V5Ml0sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3ZhbGlkYXRpb24sIFwiZlwiKS5jb25mbGljdHMoa2V5MSwga2V5Mik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBjb25maWcoa2V5ID0gJ2NvbmZpZycsIG1zZywgcGFyc2VGbikge1xuICAgICAgICBhcmdzZXJ0KCdbb2JqZWN0fHN0cmluZ10gW3N0cmluZ3xmdW5jdGlvbl0gW2Z1bmN0aW9uXScsIFtrZXksIG1zZywgcGFyc2VGbl0sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICBpZiAodHlwZW9mIGtleSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoa2V5KSkge1xuICAgICAgICAgICAga2V5ID0gYXBwbHlFeHRlbmRzKGtleSwgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9jd2QsIFwiZlwiKSwgdGhpc1trR2V0UGFyc2VyQ29uZmlndXJhdGlvbl0oKVsnZGVlcC1tZXJnZS1jb25maWcnXSB8fCBmYWxzZSwgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9zaGltLCBcImZcIikpO1xuICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBcImZcIikuY29uZmlnT2JqZWN0cyA9IChfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKS5jb25maWdPYmplY3RzIHx8IFtdKS5jb25jYXQoa2V5KTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgbXNnID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBwYXJzZUZuID0gbXNnO1xuICAgICAgICAgICAgbXNnID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGVzY3JpYmUoa2V5LCBtc2cgfHwgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV91c2FnZSwgXCJmXCIpLmRlZmVyWTE4bkxvb2t1cCgnUGF0aCB0byBKU09OIGNvbmZpZyBmaWxlJykpO1xuICAgICAgICAoQXJyYXkuaXNBcnJheShrZXkpID8ga2V5IDogW2tleV0pLmZvckVhY2goayA9PiB7XG4gICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKS5jb25maWdba10gPSBwYXJzZUZuIHx8IHRydWU7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgY29tcGxldGlvbihjbWQsIGRlc2MsIGZuKSB7XG4gICAgICAgIGFyZ3NlcnQoJ1tzdHJpbmddIFtzdHJpbmd8Ym9vbGVhbnxmdW5jdGlvbl0gW2Z1bmN0aW9uXScsIFtjbWQsIGRlc2MsIGZuXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIGlmICh0eXBlb2YgZGVzYyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgZm4gPSBkZXNjO1xuICAgICAgICAgICAgZGVzYyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2NvbXBsZXRpb25Db21tYW5kLCBjbWQgfHwgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9jb21wbGV0aW9uQ29tbWFuZCwgXCJmXCIpIHx8ICdjb21wbGV0aW9uJywgXCJmXCIpO1xuICAgICAgICBpZiAoIWRlc2MgJiYgZGVzYyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGRlc2MgPSAnZ2VuZXJhdGUgY29tcGxldGlvbiBzY3JpcHQnO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29tbWFuZChfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2NvbXBsZXRpb25Db21tYW5kLCBcImZcIiksIGRlc2MpO1xuICAgICAgICBpZiAoZm4pXG4gICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2NvbXBsZXRpb24sIFwiZlwiKS5yZWdpc3RlckZ1bmN0aW9uKGZuKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGNvbW1hbmQoY21kLCBkZXNjcmlwdGlvbiwgYnVpbGRlciwgaGFuZGxlciwgbWlkZGxld2FyZXMsIGRlcHJlY2F0ZWQpIHtcbiAgICAgICAgYXJnc2VydCgnPHN0cmluZ3xhcnJheXxvYmplY3Q+IFtzdHJpbmd8Ym9vbGVhbl0gW2Z1bmN0aW9ufG9iamVjdF0gW2Z1bmN0aW9uXSBbYXJyYXldIFtib29sZWFufHN0cmluZ10nLCBbY21kLCBkZXNjcmlwdGlvbiwgYnVpbGRlciwgaGFuZGxlciwgbWlkZGxld2FyZXMsIGRlcHJlY2F0ZWRdLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9jb21tYW5kLCBcImZcIikuYWRkSGFuZGxlcihjbWQsIGRlc2NyaXB0aW9uLCBidWlsZGVyLCBoYW5kbGVyLCBtaWRkbGV3YXJlcywgZGVwcmVjYXRlZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBjb21tYW5kcyhjbWQsIGRlc2NyaXB0aW9uLCBidWlsZGVyLCBoYW5kbGVyLCBtaWRkbGV3YXJlcywgZGVwcmVjYXRlZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb21tYW5kKGNtZCwgZGVzY3JpcHRpb24sIGJ1aWxkZXIsIGhhbmRsZXIsIG1pZGRsZXdhcmVzLCBkZXByZWNhdGVkKTtcbiAgICB9XG4gICAgY29tbWFuZERpcihkaXIsIG9wdHMpIHtcbiAgICAgICAgYXJnc2VydCgnPHN0cmluZz4gW29iamVjdF0nLCBbZGlyLCBvcHRzXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIGNvbnN0IHJlcSA9IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfcGFyZW50UmVxdWlyZSwgXCJmXCIpIHx8IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc2hpbSwgXCJmXCIpLnJlcXVpcmU7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfY29tbWFuZCwgXCJmXCIpLmFkZERpcmVjdG9yeShkaXIsIHJlcSwgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9zaGltLCBcImZcIikuZ2V0Q2FsbGVyRmlsZSgpLCBvcHRzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGNvdW50KGtleXMpIHtcbiAgICAgICAgYXJnc2VydCgnPGFycmF5fHN0cmluZz4nLCBba2V5c10sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICB0aGlzW2tQb3B1bGF0ZVBhcnNlckhpbnRBcnJheV0oJ2NvdW50Jywga2V5cyk7XG4gICAgICAgIHRoaXNba1RyYWNrTWFudWFsbHlTZXRLZXlzXShrZXlzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGRlZmF1bHQoa2V5LCB2YWx1ZSwgZGVmYXVsdERlc2NyaXB0aW9uKSB7XG4gICAgICAgIGFyZ3NlcnQoJzxvYmplY3R8c3RyaW5nfGFycmF5PiBbKl0gW3N0cmluZ10nLCBba2V5LCB2YWx1ZSwgZGVmYXVsdERlc2NyaXB0aW9uXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIGlmIChkZWZhdWx0RGVzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIGFzc2VydFNpbmdsZUtleShrZXksIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc2hpbSwgXCJmXCIpKTtcbiAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucywgXCJmXCIpLmRlZmF1bHREZXNjcmlwdGlvbltrZXldID0gZGVmYXVsdERlc2NyaXB0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGFzc2VydFNpbmdsZUtleShrZXksIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc2hpbSwgXCJmXCIpKTtcbiAgICAgICAgICAgIGlmICghX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBcImZcIikuZGVmYXVsdERlc2NyaXB0aW9uW2tleV0pXG4gICAgICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBcImZcIikuZGVmYXVsdERlc2NyaXB0aW9uW2tleV0gPVxuICAgICAgICAgICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBcImZcIikuZnVuY3Rpb25EZXNjcmlwdGlvbih2YWx1ZSk7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLmNhbGwoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzW2tQb3B1bGF0ZVBhcnNlckhpbnRTaW5nbGVWYWx1ZURpY3Rpb25hcnldKHRoaXMuZGVmYXVsdC5iaW5kKHRoaXMpLCAnZGVmYXVsdCcsIGtleSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZGVmYXVsdHMoa2V5LCB2YWx1ZSwgZGVmYXVsdERlc2NyaXB0aW9uKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRlZmF1bHQoa2V5LCB2YWx1ZSwgZGVmYXVsdERlc2NyaXB0aW9uKTtcbiAgICB9XG4gICAgZGVtYW5kQ29tbWFuZChtaW4gPSAxLCBtYXgsIG1pbk1zZywgbWF4TXNnKSB7XG4gICAgICAgIGFyZ3NlcnQoJ1tudW1iZXJdIFtudW1iZXJ8c3RyaW5nXSBbc3RyaW5nfG51bGx8dW5kZWZpbmVkXSBbc3RyaW5nfG51bGx8dW5kZWZpbmVkXScsIFttaW4sIG1heCwgbWluTXNnLCBtYXhNc2ddLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgaWYgKHR5cGVvZiBtYXggIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBtaW5Nc2cgPSBtYXg7XG4gICAgICAgICAgICBtYXggPSBJbmZpbml0eTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmdsb2JhbCgnXycsIGZhbHNlKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBcImZcIikuZGVtYW5kZWRDb21tYW5kcy5fID0ge1xuICAgICAgICAgICAgbWluLFxuICAgICAgICAgICAgbWF4LFxuICAgICAgICAgICAgbWluTXNnLFxuICAgICAgICAgICAgbWF4TXNnLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZGVtYW5kKGtleXMsIG1heCwgbXNnKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG1heCkpIHtcbiAgICAgICAgICAgIG1heC5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICAgICAgYXNzZXJ0Tm90U3RyaWN0RXF1YWwobXNnLCB0cnVlLCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3NoaW0sIFwiZlwiKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5kZW1hbmRPcHRpb24oa2V5LCBtc2cpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBtYXggPSBJbmZpbml0eTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgbWF4ICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgbXNnID0gbWF4O1xuICAgICAgICAgICAgbWF4ID0gSW5maW5pdHk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBrZXlzID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgYXNzZXJ0Tm90U3RyaWN0RXF1YWwobXNnLCB0cnVlLCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3NoaW0sIFwiZlwiKSk7XG4gICAgICAgICAgICB0aGlzLmRlbWFuZENvbW1hbmQoa2V5cywgbWF4LCBtc2csIG1zZyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShrZXlzKSkge1xuICAgICAgICAgICAga2V5cy5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICAgICAgYXNzZXJ0Tm90U3RyaWN0RXF1YWwobXNnLCB0cnVlLCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3NoaW0sIFwiZlwiKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5kZW1hbmRPcHRpb24oa2V5LCBtc2cpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG1zZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlbWFuZE9wdGlvbihrZXlzLCBtc2cpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobXNnID09PSB0cnVlIHx8IHR5cGVvZiBtc2cgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZW1hbmRPcHRpb24oa2V5cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGRlbWFuZE9wdGlvbihrZXlzLCBtc2cpIHtcbiAgICAgICAgYXJnc2VydCgnPG9iamVjdHxzdHJpbmd8YXJyYXk+IFtzdHJpbmddJywgW2tleXMsIG1zZ10sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICB0aGlzW2tQb3B1bGF0ZVBhcnNlckhpbnRTaW5nbGVWYWx1ZURpY3Rpb25hcnldKHRoaXMuZGVtYW5kT3B0aW9uLmJpbmQodGhpcyksICdkZW1hbmRlZE9wdGlvbnMnLCBrZXlzLCBtc2cpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZGVwcmVjYXRlT3B0aW9uKG9wdGlvbiwgbWVzc2FnZSkge1xuICAgICAgICBhcmdzZXJ0KCc8c3RyaW5nPiBbc3RyaW5nfGJvb2xlYW5dJywgW29wdGlvbiwgbWVzc2FnZV0sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKS5kZXByZWNhdGVkT3B0aW9uc1tvcHRpb25dID0gbWVzc2FnZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGRlc2NyaWJlKGtleXMsIGRlc2NyaXB0aW9uKSB7XG4gICAgICAgIGFyZ3NlcnQoJzxvYmplY3R8c3RyaW5nfGFycmF5PiBbc3RyaW5nXScsIFtrZXlzLCBkZXNjcmlwdGlvbl0sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICB0aGlzW2tTZXRLZXldKGtleXMsIHRydWUpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBcImZcIikuZGVzY3JpYmUoa2V5cywgZGVzY3JpcHRpb24pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZGV0ZWN0TG9jYWxlKGRldGVjdCkge1xuICAgICAgICBhcmdzZXJ0KCc8Ym9vbGVhbj4nLCBbZGV0ZWN0XSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfZGV0ZWN0TG9jYWxlLCBkZXRlY3QsIFwiZlwiKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGVudihwcmVmaXgpIHtcbiAgICAgICAgYXJnc2VydCgnW3N0cmluZ3xib29sZWFuXScsIFtwcmVmaXhdLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgaWYgKHByZWZpeCA9PT0gZmFsc2UpXG4gICAgICAgICAgICBkZWxldGUgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBcImZcIikuZW52UHJlZml4O1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKS5lbnZQcmVmaXggPSBwcmVmaXggfHwgJyc7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBlcGlsb2d1ZShtc2cpIHtcbiAgICAgICAgYXJnc2VydCgnPHN0cmluZz4nLCBbbXNnXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdXNhZ2UsIFwiZlwiKS5lcGlsb2cobXNnKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGVwaWxvZyhtc2cpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXBpbG9ndWUobXNnKTtcbiAgICB9XG4gICAgZXhhbXBsZShjbWQsIGRlc2NyaXB0aW9uKSB7XG4gICAgICAgIGFyZ3NlcnQoJzxzdHJpbmd8YXJyYXk+IFtzdHJpbmddJywgW2NtZCwgZGVzY3JpcHRpb25dLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY21kKSkge1xuICAgICAgICAgICAgY21kLmZvckVhY2goZXhhbXBsZVBhcmFtcyA9PiB0aGlzLmV4YW1wbGUoLi4uZXhhbXBsZVBhcmFtcykpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV91c2FnZSwgXCJmXCIpLmV4YW1wbGUoY21kLCBkZXNjcmlwdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGV4aXQoY29kZSwgZXJyKSB7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfaGFzT3V0cHV0LCB0cnVlLCBcImZcIik7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfZXhpdEVycm9yLCBlcnIsIFwiZlwiKTtcbiAgICAgICAgaWYgKF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfZXhpdFByb2Nlc3MsIFwiZlwiKSlcbiAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc2hpbSwgXCJmXCIpLnByb2Nlc3MuZXhpdChjb2RlKTtcbiAgICB9XG4gICAgZXhpdFByb2Nlc3MoZW5hYmxlZCA9IHRydWUpIHtcbiAgICAgICAgYXJnc2VydCgnW2Jvb2xlYW5dJywgW2VuYWJsZWRdLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9leGl0UHJvY2VzcywgZW5hYmxlZCwgXCJmXCIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZmFpbChmKSB7XG4gICAgICAgIGFyZ3NlcnQoJzxmdW5jdGlvbnxib29sZWFuPicsIFtmXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIGlmICh0eXBlb2YgZiA9PT0gJ2Jvb2xlYW4nICYmIGYgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgWUVycm9yKFwiSW52YWxpZCBmaXJzdCBhcmd1bWVudC4gRXhwZWN0ZWQgZnVuY3Rpb24gb3IgYm9vbGVhbiAnZmFsc2UnXCIpO1xuICAgICAgICB9XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdXNhZ2UsIFwiZlwiKS5mYWlsRm4oZik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBnZXRBbGlhc2VzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZWQgPyB0aGlzLnBhcnNlZC5hbGlhc2VzIDoge307XG4gICAgfVxuICAgIGFzeW5jIGdldENvbXBsZXRpb24oYXJncywgZG9uZSkge1xuICAgICAgICBhcmdzZXJ0KCc8YXJyYXk+IFtmdW5jdGlvbl0nLCBbYXJncywgZG9uZV0sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICBpZiAoIWRvbmUpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9jb21wbGV0aW9uLCBcImZcIikuZ2V0Q29tcGxldGlvbihhcmdzLCAoZXJyLCBjb21wbGV0aW9ucykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoY29tcGxldGlvbnMpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9jb21wbGV0aW9uLCBcImZcIikuZ2V0Q29tcGxldGlvbihhcmdzLCBkb25lKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXREZW1hbmRlZE9wdGlvbnMoKSB7XG4gICAgICAgIGFyZ3NlcnQoW10sIDApO1xuICAgICAgICByZXR1cm4gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBcImZcIikuZGVtYW5kZWRPcHRpb25zO1xuICAgIH1cbiAgICBnZXREZW1hbmRlZENvbW1hbmRzKCkge1xuICAgICAgICBhcmdzZXJ0KFtdLCAwKTtcbiAgICAgICAgcmV0dXJuIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucywgXCJmXCIpLmRlbWFuZGVkQ29tbWFuZHM7XG4gICAgfVxuICAgIGdldERlcHJlY2F0ZWRPcHRpb25zKCkge1xuICAgICAgICBhcmdzZXJ0KFtdLCAwKTtcbiAgICAgICAgcmV0dXJuIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucywgXCJmXCIpLmRlcHJlY2F0ZWRPcHRpb25zO1xuICAgIH1cbiAgICBnZXREZXRlY3RMb2NhbGUoKSB7XG4gICAgICAgIHJldHVybiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2RldGVjdExvY2FsZSwgXCJmXCIpO1xuICAgIH1cbiAgICBnZXRFeGl0UHJvY2VzcygpIHtcbiAgICAgICAgcmV0dXJuIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfZXhpdFByb2Nlc3MsIFwiZlwiKTtcbiAgICB9XG4gICAgZ2V0R3JvdXBzKCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9ncm91cHMsIFwiZlwiKSwgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9wcmVzZXJ2ZWRHcm91cHMsIFwiZlwiKSk7XG4gICAgfVxuICAgIGdldEhlbHAoKSB7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfaGFzT3V0cHV0LCB0cnVlLCBcImZcIik7XG4gICAgICAgIGlmICghX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV91c2FnZSwgXCJmXCIpLmhhc0NhY2hlZEhlbHBNZXNzYWdlKCkpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5wYXJzZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZSA9IHRoaXNba1J1bllhcmdzUGFyc2VyQW5kRXhlY3V0ZUNvbW1hbmRzXShfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3Byb2Nlc3NBcmdzLCBcImZcIiksIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCAwLCB0cnVlKTtcbiAgICAgICAgICAgICAgICBpZiAoaXNQcm9taXNlKHBhcnNlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2UudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV91c2FnZSwgXCJmXCIpLmhlbHAoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYnVpbGRlclJlc3BvbnNlID0gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9jb21tYW5kLCBcImZcIikucnVuRGVmYXVsdEJ1aWxkZXJPbih0aGlzKTtcbiAgICAgICAgICAgIGlmIChpc1Byb21pc2UoYnVpbGRlclJlc3BvbnNlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBidWlsZGVyUmVzcG9uc2UudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBcImZcIikuaGVscCgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV91c2FnZSwgXCJmXCIpLmhlbHAoKSk7XG4gICAgfVxuICAgIGdldE9wdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKTtcbiAgICB9XG4gICAgZ2V0U3RyaWN0KCkge1xuICAgICAgICByZXR1cm4gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9zdHJpY3QsIFwiZlwiKTtcbiAgICB9XG4gICAgZ2V0U3RyaWN0Q29tbWFuZHMoKSB7XG4gICAgICAgIHJldHVybiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3N0cmljdENvbW1hbmRzLCBcImZcIik7XG4gICAgfVxuICAgIGdldFN0cmljdE9wdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3N0cmljdE9wdGlvbnMsIFwiZlwiKTtcbiAgICB9XG4gICAgZ2xvYmFsKGdsb2JhbHMsIGdsb2JhbCkge1xuICAgICAgICBhcmdzZXJ0KCc8c3RyaW5nfGFycmF5PiBbYm9vbGVhbl0nLCBbZ2xvYmFscywgZ2xvYmFsXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIGdsb2JhbHMgPSBbXS5jb25jYXQoZ2xvYmFscyk7XG4gICAgICAgIGlmIChnbG9iYWwgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKS5sb2NhbCA9IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucywgXCJmXCIpLmxvY2FsLmZpbHRlcihsID0+IGdsb2JhbHMuaW5kZXhPZihsKSA9PT0gLTEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZ2xvYmFscy5mb3JFYWNoKGcgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBcImZcIikubG9jYWwuaW5jbHVkZXMoZykpXG4gICAgICAgICAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucywgXCJmXCIpLmxvY2FsLnB1c2goZyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZ3JvdXAob3B0cywgZ3JvdXBOYW1lKSB7XG4gICAgICAgIGFyZ3NlcnQoJzxzdHJpbmd8YXJyYXk+IDxzdHJpbmc+JywgW29wdHMsIGdyb3VwTmFtZV0sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICBjb25zdCBleGlzdGluZyA9IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfcHJlc2VydmVkR3JvdXBzLCBcImZcIilbZ3JvdXBOYW1lXSB8fCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2dyb3VwcywgXCJmXCIpW2dyb3VwTmFtZV07XG4gICAgICAgIGlmIChfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3ByZXNlcnZlZEdyb3VwcywgXCJmXCIpW2dyb3VwTmFtZV0pIHtcbiAgICAgICAgICAgIGRlbGV0ZSBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3ByZXNlcnZlZEdyb3VwcywgXCJmXCIpW2dyb3VwTmFtZV07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2VlbiA9IHt9O1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2dyb3VwcywgXCJmXCIpW2dyb3VwTmFtZV0gPSAoZXhpc3RpbmcgfHwgW10pLmNvbmNhdChvcHRzKS5maWx0ZXIoa2V5ID0+IHtcbiAgICAgICAgICAgIGlmIChzZWVuW2tleV0pXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIChzZWVuW2tleV0gPSB0cnVlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBoaWRlKGtleSkge1xuICAgICAgICBhcmdzZXJ0KCc8c3RyaW5nPicsIFtrZXldLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBcImZcIikuaGlkZGVuT3B0aW9ucy5wdXNoKGtleSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBpbXBsaWVzKGtleSwgdmFsdWUpIHtcbiAgICAgICAgYXJnc2VydCgnPHN0cmluZ3xvYmplY3Q+IFtudW1iZXJ8c3RyaW5nfGFycmF5XScsIFtrZXksIHZhbHVlXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdmFsaWRhdGlvbiwgXCJmXCIpLmltcGxpZXMoa2V5LCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBsb2NhbGUobG9jYWxlKSB7XG4gICAgICAgIGFyZ3NlcnQoJ1tzdHJpbmddJywgW2xvY2FsZV0sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICBpZiAobG9jYWxlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXNba0d1ZXNzTG9jYWxlXSgpO1xuICAgICAgICAgICAgcmV0dXJuIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc2hpbSwgXCJmXCIpLnkxOG4uZ2V0TG9jYWxlKCk7XG4gICAgICAgIH1cbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9kZXRlY3RMb2NhbGUsIGZhbHNlLCBcImZcIik7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc2hpbSwgXCJmXCIpLnkxOG4uc2V0TG9jYWxlKGxvY2FsZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBtaWRkbGV3YXJlKGNhbGxiYWNrLCBhcHBseUJlZm9yZVZhbGlkYXRpb24sIGdsb2JhbCkge1xuICAgICAgICByZXR1cm4gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9nbG9iYWxNaWRkbGV3YXJlLCBcImZcIikuYWRkTWlkZGxld2FyZShjYWxsYmFjaywgISFhcHBseUJlZm9yZVZhbGlkYXRpb24sIGdsb2JhbCk7XG4gICAgfVxuICAgIG5hcmdzKGtleSwgdmFsdWUpIHtcbiAgICAgICAgYXJnc2VydCgnPHN0cmluZ3xvYmplY3R8YXJyYXk+IFtudW1iZXJdJywgW2tleSwgdmFsdWVdLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgdGhpc1trUG9wdWxhdGVQYXJzZXJIaW50U2luZ2xlVmFsdWVEaWN0aW9uYXJ5XSh0aGlzLm5hcmdzLmJpbmQodGhpcyksICduYXJnJywga2V5LCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBub3JtYWxpemUoa2V5cykge1xuICAgICAgICBhcmdzZXJ0KCc8YXJyYXl8c3RyaW5nPicsIFtrZXlzXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIHRoaXNba1BvcHVsYXRlUGFyc2VySGludEFycmF5XSgnbm9ybWFsaXplJywga2V5cyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBudW1iZXIoa2V5cykge1xuICAgICAgICBhcmdzZXJ0KCc8YXJyYXl8c3RyaW5nPicsIFtrZXlzXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIHRoaXNba1BvcHVsYXRlUGFyc2VySGludEFycmF5XSgnbnVtYmVyJywga2V5cyk7XG4gICAgICAgIHRoaXNba1RyYWNrTWFudWFsbHlTZXRLZXlzXShrZXlzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIG9wdGlvbihrZXksIG9wdCkge1xuICAgICAgICBhcmdzZXJ0KCc8c3RyaW5nfG9iamVjdD4gW29iamVjdF0nLCBba2V5LCBvcHRdLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgaWYgKHR5cGVvZiBrZXkgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhrZXkpLmZvckVhY2goayA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zKGssIGtleVtrXSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0ICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgIG9wdCA9IHt9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpc1trVHJhY2tNYW51YWxseVNldEtleXNdKGtleSk7XG4gICAgICAgICAgICBpZiAoX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV92ZXJzaW9uT3B0LCBcImZcIikgJiYgKGtleSA9PT0gJ3ZlcnNpb24nIHx8IChvcHQgPT09IG51bGwgfHwgb3B0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHQuYWxpYXMpID09PSAndmVyc2lvbicpKSB7XG4gICAgICAgICAgICAgICAgdGhpc1trRW1pdFdhcm5pbmddKFtcbiAgICAgICAgICAgICAgICAgICAgJ1widmVyc2lvblwiIGlzIGEgcmVzZXJ2ZWQgd29yZC4nLFxuICAgICAgICAgICAgICAgICAgICAnUGxlYXNlIGRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOicsXG4gICAgICAgICAgICAgICAgICAgICctIERpc2FibGUgdmVyc2lvbiB3aXRoIGB5YXJncy52ZXJzaW9uKGZhbHNlKWAgaWYgdXNpbmcgXCJ2ZXJzaW9uXCIgYXMgYW4gb3B0aW9uJyxcbiAgICAgICAgICAgICAgICAgICAgJy0gVXNlIHRoZSBidWlsdC1pbiBgeWFyZ3MudmVyc2lvbmAgbWV0aG9kIGluc3RlYWQgKGlmIGFwcGxpY2FibGUpJyxcbiAgICAgICAgICAgICAgICAgICAgJy0gVXNlIGEgZGlmZmVyZW50IG9wdGlvbiBrZXknLFxuICAgICAgICAgICAgICAgICAgICAnaHR0cHM6Ly95YXJncy5qcy5vcmcvZG9jcy8jYXBpLXJlZmVyZW5jZS12ZXJzaW9uJyxcbiAgICAgICAgICAgICAgICBdLmpvaW4oJ1xcbicpLCB1bmRlZmluZWQsICd2ZXJzaW9uV2FybmluZycpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBcImZcIikua2V5W2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgaWYgKG9wdC5hbGlhcylcbiAgICAgICAgICAgICAgICB0aGlzLmFsaWFzKGtleSwgb3B0LmFsaWFzKTtcbiAgICAgICAgICAgIGNvbnN0IGRlcHJlY2F0ZSA9IG9wdC5kZXByZWNhdGUgfHwgb3B0LmRlcHJlY2F0ZWQ7XG4gICAgICAgICAgICBpZiAoZGVwcmVjYXRlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXByZWNhdGVPcHRpb24oa2V5LCBkZXByZWNhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZGVtYW5kID0gb3B0LmRlbWFuZCB8fCBvcHQucmVxdWlyZWQgfHwgb3B0LnJlcXVpcmU7XG4gICAgICAgICAgICBpZiAoZGVtYW5kKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZW1hbmQoa2V5LCBkZW1hbmQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdC5kZW1hbmRPcHRpb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlbWFuZE9wdGlvbihrZXksIHR5cGVvZiBvcHQuZGVtYW5kT3B0aW9uID09PSAnc3RyaW5nJyA/IG9wdC5kZW1hbmRPcHRpb24gOiB1bmRlZmluZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdC5jb25mbGljdHMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZsaWN0cyhrZXksIG9wdC5jb25mbGljdHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCdkZWZhdWx0JyBpbiBvcHQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHQoa2V5LCBvcHQuZGVmYXVsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0LmltcGxpZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW1wbGllcyhrZXksIG9wdC5pbXBsaWVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvcHQubmFyZ3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMubmFyZ3Moa2V5LCBvcHQubmFyZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdC5jb25maWcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZyhrZXksIG9wdC5jb25maWdQYXJzZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdC5ub3JtYWxpemUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5vcm1hbGl6ZShrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdC5jaG9pY2VzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaG9pY2VzKGtleSwgb3B0LmNob2ljZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdC5jb2VyY2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvZXJjZShrZXksIG9wdC5jb2VyY2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdC5ncm91cCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZ3JvdXAoa2V5LCBvcHQuZ3JvdXApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdC5ib29sZWFuIHx8IG9wdC50eXBlID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJvb2xlYW4oa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAob3B0LmFsaWFzKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmJvb2xlYW4ob3B0LmFsaWFzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvcHQuYXJyYXkgfHwgb3B0LnR5cGUgPT09ICdhcnJheScpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFycmF5KGtleSk7XG4gICAgICAgICAgICAgICAgaWYgKG9wdC5hbGlhcylcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hcnJheShvcHQuYWxpYXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdC5udW1iZXIgfHwgb3B0LnR5cGUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5udW1iZXIoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAob3B0LmFsaWFzKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLm51bWJlcihvcHQuYWxpYXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdC5zdHJpbmcgfHwgb3B0LnR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdHJpbmcoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAob3B0LmFsaWFzKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0cmluZyhvcHQuYWxpYXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdC5jb3VudCB8fCBvcHQudHlwZSA9PT0gJ2NvdW50Jykge1xuICAgICAgICAgICAgICAgIHRoaXMuY291bnQoa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0Lmdsb2JhbCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5nbG9iYWwoa2V5LCBvcHQuZ2xvYmFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvcHQuZGVmYXVsdERlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBcImZcIikuZGVmYXVsdERlc2NyaXB0aW9uW2tleV0gPSBvcHQuZGVmYXVsdERlc2NyaXB0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdC5za2lwVmFsaWRhdGlvbikge1xuICAgICAgICAgICAgICAgIHRoaXMuc2tpcFZhbGlkYXRpb24oa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGRlc2MgPSBvcHQuZGVzY3JpYmUgfHwgb3B0LmRlc2NyaXB0aW9uIHx8IG9wdC5kZXNjO1xuICAgICAgICAgICAgY29uc3QgZGVzY3JpcHRpb25zID0gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV91c2FnZSwgXCJmXCIpLmdldERlc2NyaXB0aW9ucygpO1xuICAgICAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGVzY3JpcHRpb25zLCBrZXkpIHx8XG4gICAgICAgICAgICAgICAgdHlwZW9mIGRlc2MgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXNjcmliZShrZXksIGRlc2MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdC5oaWRkZW4pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhpZGUoa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvcHQucmVxdWlyZXNBcmcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlcXVpcmVzQXJnKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIG9wdGlvbnMoa2V5LCBvcHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9uKGtleSwgb3B0KTtcbiAgICB9XG4gICAgcGFyc2UoYXJncywgc2hvcnRDaXJjdWl0LCBfcGFyc2VGbikge1xuICAgICAgICBhcmdzZXJ0KCdbc3RyaW5nfGFycmF5XSBbZnVuY3Rpb258Ym9vbGVhbnxvYmplY3RdIFtmdW5jdGlvbl0nLCBbYXJncywgc2hvcnRDaXJjdWl0LCBfcGFyc2VGbl0sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICB0aGlzW2tGcmVlemVdKCk7XG4gICAgICAgIGlmICh0eXBlb2YgYXJncyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGFyZ3MgPSBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3Byb2Nlc3NBcmdzLCBcImZcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBzaG9ydENpcmN1aXQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3BhcnNlQ29udGV4dCwgc2hvcnRDaXJjdWl0LCBcImZcIik7XG4gICAgICAgICAgICBzaG9ydENpcmN1aXQgPSBfcGFyc2VGbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHNob3J0Q2lyY3VpdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9wYXJzZUZuLCBzaG9ydENpcmN1aXQsIFwiZlwiKTtcbiAgICAgICAgICAgIHNob3J0Q2lyY3VpdCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghc2hvcnRDaXJjdWl0KVxuICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9wcm9jZXNzQXJncywgYXJncywgXCJmXCIpO1xuICAgICAgICBpZiAoX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9wYXJzZUZuLCBcImZcIikpXG4gICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2V4aXRQcm9jZXNzLCBmYWxzZSwgXCJmXCIpO1xuICAgICAgICBjb25zdCBwYXJzZWQgPSB0aGlzW2tSdW5ZYXJnc1BhcnNlckFuZEV4ZWN1dGVDb21tYW5kc10oYXJncywgISFzaG9ydENpcmN1aXQpO1xuICAgICAgICBjb25zdCB0bXBQYXJzZWQgPSB0aGlzLnBhcnNlZDtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9jb21wbGV0aW9uLCBcImZcIikuc2V0UGFyc2VkKHRoaXMucGFyc2VkKTtcbiAgICAgICAgaWYgKGlzUHJvbWlzZShwYXJzZWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VkXG4gICAgICAgICAgICAgICAgLnRoZW4oYXJndiA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfcGFyc2VGbiwgXCJmXCIpKVxuICAgICAgICAgICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3BhcnNlRm4sIFwiZlwiKS5jYWxsKHRoaXMsIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfZXhpdEVycm9yLCBcImZcIiksIGFyZ3YsIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3V0cHV0LCBcImZcIikpO1xuICAgICAgICAgICAgICAgIHJldHVybiBhcmd2O1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9wYXJzZUZuLCBcImZcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9wYXJzZUZuLCBcImZcIikoZXJyLCB0aGlzLnBhcnNlZC5hcmd2LCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX291dHB1dCwgXCJmXCIpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuZmluYWxseSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpc1trVW5mcmVlemVdKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5wYXJzZWQgPSB0bXBQYXJzZWQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3BhcnNlRm4sIFwiZlwiKSlcbiAgICAgICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3BhcnNlRm4sIFwiZlwiKS5jYWxsKHRoaXMsIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfZXhpdEVycm9yLCBcImZcIiksIHBhcnNlZCwgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vdXRwdXQsIFwiZlwiKSk7XG4gICAgICAgICAgICB0aGlzW2tVbmZyZWV6ZV0oKTtcbiAgICAgICAgICAgIHRoaXMucGFyc2VkID0gdG1wUGFyc2VkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXJzZWQ7XG4gICAgfVxuICAgIHBhcnNlQXN5bmMoYXJncywgc2hvcnRDaXJjdWl0LCBfcGFyc2VGbikge1xuICAgICAgICBjb25zdCBtYXliZVByb21pc2UgPSB0aGlzLnBhcnNlKGFyZ3MsIHNob3J0Q2lyY3VpdCwgX3BhcnNlRm4pO1xuICAgICAgICByZXR1cm4gIWlzUHJvbWlzZShtYXliZVByb21pc2UpXG4gICAgICAgICAgICA/IFByb21pc2UucmVzb2x2ZShtYXliZVByb21pc2UpXG4gICAgICAgICAgICA6IG1heWJlUHJvbWlzZTtcbiAgICB9XG4gICAgcGFyc2VTeW5jKGFyZ3MsIHNob3J0Q2lyY3VpdCwgX3BhcnNlRm4pIHtcbiAgICAgICAgY29uc3QgbWF5YmVQcm9taXNlID0gdGhpcy5wYXJzZShhcmdzLCBzaG9ydENpcmN1aXQsIF9wYXJzZUZuKTtcbiAgICAgICAgaWYgKGlzUHJvbWlzZShtYXliZVByb21pc2UpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgWUVycm9yKCcucGFyc2VTeW5jKCkgbXVzdCBub3QgYmUgdXNlZCB3aXRoIGFzeW5jaHJvbm91cyBidWlsZGVycywgaGFuZGxlcnMsIG9yIG1pZGRsZXdhcmUnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWF5YmVQcm9taXNlO1xuICAgIH1cbiAgICBwYXJzZXJDb25maWd1cmF0aW9uKGNvbmZpZykge1xuICAgICAgICBhcmdzZXJ0KCc8b2JqZWN0PicsIFtjb25maWddLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9wYXJzZXJDb25maWcsIGNvbmZpZywgXCJmXCIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcGtnQ29uZihrZXksIHJvb3RQYXRoKSB7XG4gICAgICAgIGFyZ3NlcnQoJzxzdHJpbmc+IFtzdHJpbmddJywgW2tleSwgcm9vdFBhdGhdLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgbGV0IGNvbmYgPSBudWxsO1xuICAgICAgICBjb25zdCBvYmogPSB0aGlzW2tQa2dVcF0ocm9vdFBhdGggfHwgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9jd2QsIFwiZlwiKSk7XG4gICAgICAgIGlmIChvYmpba2V5XSAmJiB0eXBlb2Ygb2JqW2tleV0gPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBjb25mID0gYXBwbHlFeHRlbmRzKG9ialtrZXldLCByb290UGF0aCB8fCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2N3ZCwgXCJmXCIpLCB0aGlzW2tHZXRQYXJzZXJDb25maWd1cmF0aW9uXSgpWydkZWVwLW1lcmdlLWNvbmZpZyddIHx8IGZhbHNlLCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3NoaW0sIFwiZlwiKSk7XG4gICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKS5jb25maWdPYmplY3RzID0gKF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucywgXCJmXCIpLmNvbmZpZ09iamVjdHMgfHwgW10pLmNvbmNhdChjb25mKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcG9zaXRpb25hbChrZXksIG9wdHMpIHtcbiAgICAgICAgYXJnc2VydCgnPHN0cmluZz4gPG9iamVjdD4nLCBba2V5LCBvcHRzXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIGNvbnN0IHN1cHBvcnRlZE9wdHMgPSBbXG4gICAgICAgICAgICAnZGVmYXVsdCcsXG4gICAgICAgICAgICAnZGVmYXVsdERlc2NyaXB0aW9uJyxcbiAgICAgICAgICAgICdpbXBsaWVzJyxcbiAgICAgICAgICAgICdub3JtYWxpemUnLFxuICAgICAgICAgICAgJ2Nob2ljZXMnLFxuICAgICAgICAgICAgJ2NvbmZsaWN0cycsXG4gICAgICAgICAgICAnY29lcmNlJyxcbiAgICAgICAgICAgICd0eXBlJyxcbiAgICAgICAgICAgICdkZXNjcmliZScsXG4gICAgICAgICAgICAnZGVzYycsXG4gICAgICAgICAgICAnZGVzY3JpcHRpb24nLFxuICAgICAgICAgICAgJ2FsaWFzJyxcbiAgICAgICAgXTtcbiAgICAgICAgb3B0cyA9IG9iakZpbHRlcihvcHRzLCAoaywgdikgPT4ge1xuICAgICAgICAgICAgaWYgKGsgPT09ICd0eXBlJyAmJiAhWydzdHJpbmcnLCAnbnVtYmVyJywgJ2Jvb2xlYW4nXS5pbmNsdWRlcyh2KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gc3VwcG9ydGVkT3B0cy5pbmNsdWRlcyhrKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGZ1bGxDb21tYW5kID0gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9jb250ZXh0LCBcImZcIikuZnVsbENvbW1hbmRzW19fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfY29udGV4dCwgXCJmXCIpLmZ1bGxDb21tYW5kcy5sZW5ndGggLSAxXTtcbiAgICAgICAgY29uc3QgcGFyc2VPcHRpb25zID0gZnVsbENvbW1hbmRcbiAgICAgICAgICAgID8gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9jb21tYW5kLCBcImZcIikuY21kVG9QYXJzZU9wdGlvbnMoZnVsbENvbW1hbmQpXG4gICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICBhcnJheTogW10sXG4gICAgICAgICAgICAgICAgYWxpYXM6IHt9LFxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHt9LFxuICAgICAgICAgICAgICAgIGRlbWFuZDoge30sXG4gICAgICAgICAgICB9O1xuICAgICAgICBvYmplY3RLZXlzKHBhcnNlT3B0aW9ucykuZm9yRWFjaChwayA9PiB7XG4gICAgICAgICAgICBjb25zdCBwYXJzZU9wdGlvbiA9IHBhcnNlT3B0aW9uc1twa107XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwYXJzZU9wdGlvbikpIHtcbiAgICAgICAgICAgICAgICBpZiAocGFyc2VPcHRpb24uaW5kZXhPZihrZXkpICE9PSAtMSlcbiAgICAgICAgICAgICAgICAgICAgb3B0c1twa10gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnNlT3B0aW9uW2tleV0gJiYgIShwayBpbiBvcHRzKSlcbiAgICAgICAgICAgICAgICAgICAgb3B0c1twa10gPSBwYXJzZU9wdGlvbltrZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5ncm91cChrZXksIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdXNhZ2UsIFwiZlwiKS5nZXRQb3NpdGlvbmFsR3JvdXBOYW1lKCkpO1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb24oa2V5LCBvcHRzKTtcbiAgICB9XG4gICAgcmVjb21tZW5kQ29tbWFuZHMocmVjb21tZW5kID0gdHJ1ZSkge1xuICAgICAgICBhcmdzZXJ0KCdbYm9vbGVhbl0nLCBbcmVjb21tZW5kXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfcmVjb21tZW5kQ29tbWFuZHMsIHJlY29tbWVuZCwgXCJmXCIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcmVxdWlyZWQoa2V5cywgbWF4LCBtc2cpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVtYW5kKGtleXMsIG1heCwgbXNnKTtcbiAgICB9XG4gICAgcmVxdWlyZShrZXlzLCBtYXgsIG1zZykge1xuICAgICAgICByZXR1cm4gdGhpcy5kZW1hbmQoa2V5cywgbWF4LCBtc2cpO1xuICAgIH1cbiAgICByZXF1aXJlc0FyZyhrZXlzKSB7XG4gICAgICAgIGFyZ3NlcnQoJzxhcnJheXxzdHJpbmd8b2JqZWN0PiBbbnVtYmVyXScsIFtrZXlzXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIGlmICh0eXBlb2Yga2V5cyA9PT0gJ3N0cmluZycgJiYgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBcImZcIikubmFyZ1trZXlzXSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzW2tQb3B1bGF0ZVBhcnNlckhpbnRTaW5nbGVWYWx1ZURpY3Rpb25hcnldKHRoaXMucmVxdWlyZXNBcmcuYmluZCh0aGlzKSwgJ25hcmcnLCBrZXlzLCBOYU4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBzaG93Q29tcGxldGlvblNjcmlwdCgkMCwgY21kKSB7XG4gICAgICAgIGFyZ3NlcnQoJ1tzdHJpbmddIFtzdHJpbmddJywgWyQwLCBjbWRdLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgJDAgPSAkMCB8fCB0aGlzLiQwO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2xvZ2dlciwgXCJmXCIpLmxvZyhfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2NvbXBsZXRpb24sIFwiZlwiKS5nZW5lcmF0ZUNvbXBsZXRpb25TY3JpcHQoJDAsIGNtZCB8fCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2NvbXBsZXRpb25Db21tYW5kLCBcImZcIikgfHwgJ2NvbXBsZXRpb24nKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBzaG93SGVscChsZXZlbCkge1xuICAgICAgICBhcmdzZXJ0KCdbc3RyaW5nfGZ1bmN0aW9uXScsIFtsZXZlbF0sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2hhc091dHB1dCwgdHJ1ZSwgXCJmXCIpO1xuICAgICAgICBpZiAoIV9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdXNhZ2UsIFwiZlwiKS5oYXNDYWNoZWRIZWxwTWVzc2FnZSgpKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMucGFyc2VkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2UgPSB0aGlzW2tSdW5ZYXJnc1BhcnNlckFuZEV4ZWN1dGVDb21tYW5kc10oX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9wcm9jZXNzQXJncywgXCJmXCIpLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgMCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKGlzUHJvbWlzZShwYXJzZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyc2UudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBcImZcIikuc2hvd0hlbHAobGV2ZWwpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYnVpbGRlclJlc3BvbnNlID0gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9jb21tYW5kLCBcImZcIikucnVuRGVmYXVsdEJ1aWxkZXJPbih0aGlzKTtcbiAgICAgICAgICAgIGlmIChpc1Byb21pc2UoYnVpbGRlclJlc3BvbnNlKSkge1xuICAgICAgICAgICAgICAgIGJ1aWxkZXJSZXNwb25zZS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV91c2FnZSwgXCJmXCIpLnNob3dIZWxwKGxldmVsKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBcImZcIikuc2hvd0hlbHAobGV2ZWwpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgc2NyaXB0TmFtZShzY3JpcHROYW1lKSB7XG4gICAgICAgIHRoaXMuY3VzdG9tU2NyaXB0TmFtZSA9IHRydWU7XG4gICAgICAgIHRoaXMuJDAgPSBzY3JpcHROYW1lO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgc2hvd0hlbHBPbkZhaWwoZW5hYmxlZCwgbWVzc2FnZSkge1xuICAgICAgICBhcmdzZXJ0KCdbYm9vbGVhbnxzdHJpbmddIFtzdHJpbmddJywgW2VuYWJsZWQsIG1lc3NhZ2VdLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV91c2FnZSwgXCJmXCIpLnNob3dIZWxwT25GYWlsKGVuYWJsZWQsIG1lc3NhZ2UpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgc2hvd1ZlcnNpb24obGV2ZWwpIHtcbiAgICAgICAgYXJnc2VydCgnW3N0cmluZ3xmdW5jdGlvbl0nLCBbbGV2ZWxdLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV91c2FnZSwgXCJmXCIpLnNob3dWZXJzaW9uKGxldmVsKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHNraXBWYWxpZGF0aW9uKGtleXMpIHtcbiAgICAgICAgYXJnc2VydCgnPGFycmF5fHN0cmluZz4nLCBba2V5c10sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICB0aGlzW2tQb3B1bGF0ZVBhcnNlckhpbnRBcnJheV0oJ3NraXBWYWxpZGF0aW9uJywga2V5cyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBzdHJpY3QoZW5hYmxlZCkge1xuICAgICAgICBhcmdzZXJ0KCdbYm9vbGVhbl0nLCBbZW5hYmxlZF0sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3N0cmljdCwgZW5hYmxlZCAhPT0gZmFsc2UsIFwiZlwiKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHN0cmljdENvbW1hbmRzKGVuYWJsZWQpIHtcbiAgICAgICAgYXJnc2VydCgnW2Jvb2xlYW5dJywgW2VuYWJsZWRdLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9zdHJpY3RDb21tYW5kcywgZW5hYmxlZCAhPT0gZmFsc2UsIFwiZlwiKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHN0cmljdE9wdGlvbnMoZW5hYmxlZCkge1xuICAgICAgICBhcmdzZXJ0KCdbYm9vbGVhbl0nLCBbZW5hYmxlZF0sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3N0cmljdE9wdGlvbnMsIGVuYWJsZWQgIT09IGZhbHNlLCBcImZcIik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBzdHJpbmcoa2V5cykge1xuICAgICAgICBhcmdzZXJ0KCc8YXJyYXl8c3RyaW5nPicsIFtrZXlzXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIHRoaXNba1BvcHVsYXRlUGFyc2VySGludEFycmF5XSgnc3RyaW5nJywga2V5cyk7XG4gICAgICAgIHRoaXNba1RyYWNrTWFudWFsbHlTZXRLZXlzXShrZXlzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHRlcm1pbmFsV2lkdGgoKSB7XG4gICAgICAgIGFyZ3NlcnQoW10sIDApO1xuICAgICAgICByZXR1cm4gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9zaGltLCBcImZcIikucHJvY2Vzcy5zdGRDb2x1bW5zO1xuICAgIH1cbiAgICB1cGRhdGVMb2NhbGUob2JqKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZVN0cmluZ3Mob2JqKTtcbiAgICB9XG4gICAgdXBkYXRlU3RyaW5ncyhvYmopIHtcbiAgICAgICAgYXJnc2VydCgnPG9iamVjdD4nLCBbb2JqXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfZGV0ZWN0TG9jYWxlLCBmYWxzZSwgXCJmXCIpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3NoaW0sIFwiZlwiKS55MThuLnVwZGF0ZUxvY2FsZShvYmopO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdXNhZ2UobXNnLCBkZXNjcmlwdGlvbiwgYnVpbGRlciwgaGFuZGxlcikge1xuICAgICAgICBhcmdzZXJ0KCc8c3RyaW5nfG51bGx8dW5kZWZpbmVkPiBbc3RyaW5nfGJvb2xlYW5dIFtmdW5jdGlvbnxvYmplY3RdIFtmdW5jdGlvbl0nLCBbbXNnLCBkZXNjcmlwdGlvbiwgYnVpbGRlciwgaGFuZGxlcl0sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICBpZiAoZGVzY3JpcHRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgYXNzZXJ0Tm90U3RyaWN0RXF1YWwobXNnLCBudWxsLCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3NoaW0sIFwiZlwiKSk7XG4gICAgICAgICAgICBpZiAoKG1zZyB8fCAnJykubWF0Y2goL15cXCQwKCB8JCkvKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbW1hbmQobXNnLCBkZXNjcmlwdGlvbiwgYnVpbGRlciwgaGFuZGxlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWUVycm9yKCcudXNhZ2UoKSBkZXNjcmlwdGlvbiBtdXN0IHN0YXJ0IHdpdGggJDAgaWYgYmVpbmcgdXNlZCBhcyBhbGlhcyBmb3IgLmNvbW1hbmQoKScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV91c2FnZSwgXCJmXCIpLnVzYWdlKG1zZyk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgIH1cbiAgICB1c2FnZUNvbmZpZ3VyYXRpb24oY29uZmlnKSB7XG4gICAgICAgIGFyZ3NlcnQoJzxvYmplY3Q+JywgW2NvbmZpZ10sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlQ29uZmlnLCBjb25maWcsIFwiZlwiKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHZlcnNpb24ob3B0LCBtc2csIHZlcikge1xuICAgICAgICBjb25zdCBkZWZhdWx0VmVyc2lvbk9wdCA9ICd2ZXJzaW9uJztcbiAgICAgICAgYXJnc2VydCgnW2Jvb2xlYW58c3RyaW5nXSBbc3RyaW5nXSBbc3RyaW5nXScsIFtvcHQsIG1zZywgdmVyXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIGlmIChfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3ZlcnNpb25PcHQsIFwiZlwiKSkge1xuICAgICAgICAgICAgdGhpc1trRGVsZXRlRnJvbVBhcnNlckhpbnRPYmplY3RdKF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdmVyc2lvbk9wdCwgXCJmXCIpKTtcbiAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdXNhZ2UsIFwiZlwiKS52ZXJzaW9uKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3ZlcnNpb25PcHQsIG51bGwsIFwiZlwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdmVyID0gdGhpc1trR3Vlc3NWZXJzaW9uXSgpO1xuICAgICAgICAgICAgb3B0ID0gZGVmYXVsdFZlcnNpb25PcHQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgaWYgKG9wdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZlciA9IG9wdDtcbiAgICAgICAgICAgIG9wdCA9IGRlZmF1bHRWZXJzaW9uT3B0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIHZlciA9IG1zZztcbiAgICAgICAgICAgIG1zZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3ZlcnNpb25PcHQsIHR5cGVvZiBvcHQgPT09ICdzdHJpbmcnID8gb3B0IDogZGVmYXVsdFZlcnNpb25PcHQsIFwiZlwiKTtcbiAgICAgICAgbXNnID0gbXNnIHx8IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdXNhZ2UsIFwiZlwiKS5kZWZlclkxOG5Mb29rdXAoJ1Nob3cgdmVyc2lvbiBudW1iZXInKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV91c2FnZSwgXCJmXCIpLnZlcnNpb24odmVyIHx8IHVuZGVmaW5lZCk7XG4gICAgICAgIHRoaXMuYm9vbGVhbihfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3ZlcnNpb25PcHQsIFwiZlwiKSk7XG4gICAgICAgIHRoaXMuZGVzY3JpYmUoX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV92ZXJzaW9uT3B0LCBcImZcIiksIG1zZyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB3cmFwKGNvbHMpIHtcbiAgICAgICAgYXJnc2VydCgnPG51bWJlcnxudWxsfHVuZGVmaW5lZD4nLCBbY29sc10sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBcImZcIikud3JhcChjb2xzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIFsoX1lhcmdzSW5zdGFuY2VfY29tbWFuZCA9IG5ldyBXZWFrTWFwKCksIF9ZYXJnc0luc3RhbmNlX2N3ZCA9IG5ldyBXZWFrTWFwKCksIF9ZYXJnc0luc3RhbmNlX2NvbnRleHQgPSBuZXcgV2Vha01hcCgpLCBfWWFyZ3NJbnN0YW5jZV9jb21wbGV0aW9uID0gbmV3IFdlYWtNYXAoKSwgX1lhcmdzSW5zdGFuY2VfY29tcGxldGlvbkNvbW1hbmQgPSBuZXcgV2Vha01hcCgpLCBfWWFyZ3NJbnN0YW5jZV9kZWZhdWx0U2hvd0hpZGRlbk9wdCA9IG5ldyBXZWFrTWFwKCksIF9ZYXJnc0luc3RhbmNlX2V4aXRFcnJvciA9IG5ldyBXZWFrTWFwKCksIF9ZYXJnc0luc3RhbmNlX2RldGVjdExvY2FsZSA9IG5ldyBXZWFrTWFwKCksIF9ZYXJnc0luc3RhbmNlX2VtaXR0ZWRXYXJuaW5ncyA9IG5ldyBXZWFrTWFwKCksIF9ZYXJnc0luc3RhbmNlX2V4aXRQcm9jZXNzID0gbmV3IFdlYWtNYXAoKSwgX1lhcmdzSW5zdGFuY2VfZnJvemVucyA9IG5ldyBXZWFrTWFwKCksIF9ZYXJnc0luc3RhbmNlX2dsb2JhbE1pZGRsZXdhcmUgPSBuZXcgV2Vha01hcCgpLCBfWWFyZ3NJbnN0YW5jZV9ncm91cHMgPSBuZXcgV2Vha01hcCgpLCBfWWFyZ3NJbnN0YW5jZV9oYXNPdXRwdXQgPSBuZXcgV2Vha01hcCgpLCBfWWFyZ3NJbnN0YW5jZV9oZWxwT3B0ID0gbmV3IFdlYWtNYXAoKSwgX1lhcmdzSW5zdGFuY2VfaXNHbG9iYWxDb250ZXh0ID0gbmV3IFdlYWtNYXAoKSwgX1lhcmdzSW5zdGFuY2VfbG9nZ2VyID0gbmV3IFdlYWtNYXAoKSwgX1lhcmdzSW5zdGFuY2Vfb3V0cHV0ID0gbmV3IFdlYWtNYXAoKSwgX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucyA9IG5ldyBXZWFrTWFwKCksIF9ZYXJnc0luc3RhbmNlX3BhcmVudFJlcXVpcmUgPSBuZXcgV2Vha01hcCgpLCBfWWFyZ3NJbnN0YW5jZV9wYXJzZXJDb25maWcgPSBuZXcgV2Vha01hcCgpLCBfWWFyZ3NJbnN0YW5jZV9wYXJzZUZuID0gbmV3IFdlYWtNYXAoKSwgX1lhcmdzSW5zdGFuY2VfcGFyc2VDb250ZXh0ID0gbmV3IFdlYWtNYXAoKSwgX1lhcmdzSW5zdGFuY2VfcGtncyA9IG5ldyBXZWFrTWFwKCksIF9ZYXJnc0luc3RhbmNlX3ByZXNlcnZlZEdyb3VwcyA9IG5ldyBXZWFrTWFwKCksIF9ZYXJnc0luc3RhbmNlX3Byb2Nlc3NBcmdzID0gbmV3IFdlYWtNYXAoKSwgX1lhcmdzSW5zdGFuY2VfcmVjb21tZW5kQ29tbWFuZHMgPSBuZXcgV2Vha01hcCgpLCBfWWFyZ3NJbnN0YW5jZV9zaGltID0gbmV3IFdlYWtNYXAoKSwgX1lhcmdzSW5zdGFuY2Vfc3RyaWN0ID0gbmV3IFdlYWtNYXAoKSwgX1lhcmdzSW5zdGFuY2Vfc3RyaWN0Q29tbWFuZHMgPSBuZXcgV2Vha01hcCgpLCBfWWFyZ3NJbnN0YW5jZV9zdHJpY3RPcHRpb25zID0gbmV3IFdlYWtNYXAoKSwgX1lhcmdzSW5zdGFuY2VfdXNhZ2UgPSBuZXcgV2Vha01hcCgpLCBfWWFyZ3NJbnN0YW5jZV91c2FnZUNvbmZpZyA9IG5ldyBXZWFrTWFwKCksIF9ZYXJnc0luc3RhbmNlX3ZlcnNpb25PcHQgPSBuZXcgV2Vha01hcCgpLCBfWWFyZ3NJbnN0YW5jZV92YWxpZGF0aW9uID0gbmV3IFdlYWtNYXAoKSwga0NvcHlEb3VibGVEYXNoKV0oYXJndikge1xuICAgICAgICBpZiAoIWFyZ3YuXyB8fCAhYXJndlsnLS0nXSlcbiAgICAgICAgICAgIHJldHVybiBhcmd2O1xuICAgICAgICBhcmd2Ll8ucHVzaC5hcHBseShhcmd2Ll8sIGFyZ3ZbJy0tJ10pO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZGVsZXRlIGFyZ3ZbJy0tJ107XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKF9lcnIpIHsgfVxuICAgICAgICByZXR1cm4gYXJndjtcbiAgICB9XG4gICAgW2tDcmVhdGVMb2dnZXJdKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbG9nOiAoLi4uYXJncykgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghdGhpc1trSGFzUGFyc2VDYWxsYmFja10oKSlcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coLi4uYXJncyk7XG4gICAgICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9oYXNPdXRwdXQsIHRydWUsIFwiZlwiKTtcbiAgICAgICAgICAgICAgICBpZiAoX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vdXRwdXQsIFwiZlwiKS5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3V0cHV0LCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX291dHB1dCwgXCJmXCIpICsgJ1xcbicsIFwiZlwiKTtcbiAgICAgICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX291dHB1dCwgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vdXRwdXQsIFwiZlwiKSArIGFyZ3Muam9pbignICcpLCBcImZcIik7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3I6ICguLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzW2tIYXNQYXJzZUNhbGxiYWNrXSgpKVxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKC4uLmFyZ3MpO1xuICAgICAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfaGFzT3V0cHV0LCB0cnVlLCBcImZcIik7XG4gICAgICAgICAgICAgICAgaWYgKF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3V0cHV0LCBcImZcIikubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX291dHB1dCwgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vdXRwdXQsIFwiZlwiKSArICdcXG4nLCBcImZcIik7XG4gICAgICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vdXRwdXQsIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3V0cHV0LCBcImZcIikgKyBhcmdzLmpvaW4oJyAnKSwgXCJmXCIpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgW2tEZWxldGVGcm9tUGFyc2VySGludE9iamVjdF0ob3B0aW9uS2V5KSB7XG4gICAgICAgIG9iamVjdEtleXMoX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBcImZcIikpLmZvckVhY2goKGhpbnRLZXkpID0+IHtcbiAgICAgICAgICAgIGlmICgoKGtleSkgPT4ga2V5ID09PSAnY29uZmlnT2JqZWN0cycpKGhpbnRLZXkpKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IGhpbnQgPSBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKVtoaW50S2V5XTtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGhpbnQpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGhpbnQuaW5jbHVkZXMob3B0aW9uS2V5KSlcbiAgICAgICAgICAgICAgICAgICAgaGludC5zcGxpY2UoaGludC5pbmRleE9mKG9wdGlvbktleSksIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIGhpbnQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGhpbnRbb3B0aW9uS2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGRlbGV0ZSBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBcImZcIikuZ2V0RGVzY3JpcHRpb25zKClbb3B0aW9uS2V5XTtcbiAgICB9XG4gICAgW2tFbWl0V2FybmluZ10od2FybmluZywgdHlwZSwgZGVkdXBsaWNhdGlvbklkKSB7XG4gICAgICAgIGlmICghX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9lbWl0dGVkV2FybmluZ3MsIFwiZlwiKVtkZWR1cGxpY2F0aW9uSWRdKSB7XG4gICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3NoaW0sIFwiZlwiKS5wcm9jZXNzLmVtaXRXYXJuaW5nKHdhcm5pbmcsIHR5cGUpO1xuICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9lbWl0dGVkV2FybmluZ3MsIFwiZlwiKVtkZWR1cGxpY2F0aW9uSWRdID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBba0ZyZWV6ZV0oKSB7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfZnJvemVucywgXCJmXCIpLnB1c2goe1xuICAgICAgICAgICAgb3B0aW9uczogX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBcImZcIiksXG4gICAgICAgICAgICBjb25maWdPYmplY3RzOiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKS5jb25maWdPYmplY3RzLnNsaWNlKDApLFxuICAgICAgICAgICAgZXhpdFByb2Nlc3M6IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfZXhpdFByb2Nlc3MsIFwiZlwiKSxcbiAgICAgICAgICAgIGdyb3VwczogX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9ncm91cHMsIFwiZlwiKSxcbiAgICAgICAgICAgIHN0cmljdDogX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9zdHJpY3QsIFwiZlwiKSxcbiAgICAgICAgICAgIHN0cmljdENvbW1hbmRzOiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3N0cmljdENvbW1hbmRzLCBcImZcIiksXG4gICAgICAgICAgICBzdHJpY3RPcHRpb25zOiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3N0cmljdE9wdGlvbnMsIFwiZlwiKSxcbiAgICAgICAgICAgIGNvbXBsZXRpb25Db21tYW5kOiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2NvbXBsZXRpb25Db21tYW5kLCBcImZcIiksXG4gICAgICAgICAgICBvdXRwdXQ6IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3V0cHV0LCBcImZcIiksXG4gICAgICAgICAgICBleGl0RXJyb3I6IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfZXhpdEVycm9yLCBcImZcIiksXG4gICAgICAgICAgICBoYXNPdXRwdXQ6IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfaGFzT3V0cHV0LCBcImZcIiksXG4gICAgICAgICAgICBwYXJzZWQ6IHRoaXMucGFyc2VkLFxuICAgICAgICAgICAgcGFyc2VGbjogX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9wYXJzZUZuLCBcImZcIiksXG4gICAgICAgICAgICBwYXJzZUNvbnRleHQ6IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfcGFyc2VDb250ZXh0LCBcImZcIiksXG4gICAgICAgIH0pO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBcImZcIikuZnJlZXplKCk7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdmFsaWRhdGlvbiwgXCJmXCIpLmZyZWV6ZSgpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2NvbW1hbmQsIFwiZlwiKS5mcmVlemUoKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9nbG9iYWxNaWRkbGV3YXJlLCBcImZcIikuZnJlZXplKCk7XG4gICAgfVxuICAgIFtrR2V0RG9sbGFyWmVyb10oKSB7XG4gICAgICAgIGxldCAkMCA9ICcnO1xuICAgICAgICBsZXQgZGVmYXVsdCQwO1xuICAgICAgICBpZiAoL1xcYihub2RlfGlvanN8ZWxlY3Ryb24pKFxcLmV4ZSk/JC8udGVzdChfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3NoaW0sIFwiZlwiKS5wcm9jZXNzLmFyZ3YoKVswXSkpIHtcbiAgICAgICAgICAgIGRlZmF1bHQkMCA9IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc2hpbSwgXCJmXCIpLnByb2Nlc3MuYXJndigpLnNsaWNlKDEsIDIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZGVmYXVsdCQwID0gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9zaGltLCBcImZcIikucHJvY2Vzcy5hcmd2KCkuc2xpY2UoMCwgMSk7XG4gICAgICAgIH1cbiAgICAgICAgJDAgPSBkZWZhdWx0JDBcbiAgICAgICAgICAgIC5tYXAoeCA9PiB7XG4gICAgICAgICAgICBjb25zdCBiID0gdGhpc1trUmViYXNlXShfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2N3ZCwgXCJmXCIpLCB4KTtcbiAgICAgICAgICAgIHJldHVybiB4Lm1hdGNoKC9eKFxcL3woW2EtekEtWl06KT9cXFxcKS8pICYmIGIubGVuZ3RoIDwgeC5sZW5ndGggPyBiIDogeDtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5qb2luKCcgJylcbiAgICAgICAgICAgIC50cmltKCk7XG4gICAgICAgIGlmIChfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3NoaW0sIFwiZlwiKS5nZXRFbnYoJ18nKSAmJlxuICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9zaGltLCBcImZcIikuZ2V0UHJvY2Vzc0FyZ3ZCaW4oKSA9PT0gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9zaGltLCBcImZcIikuZ2V0RW52KCdfJykpIHtcbiAgICAgICAgICAgICQwID0gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9zaGltLCBcImZcIilcbiAgICAgICAgICAgICAgICAuZ2V0RW52KCdfJylcbiAgICAgICAgICAgICAgICAucmVwbGFjZShgJHtfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3NoaW0sIFwiZlwiKS5wYXRoLmRpcm5hbWUoX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9zaGltLCBcImZcIikucHJvY2Vzcy5leGVjUGF0aCgpKX0vYCwgJycpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAkMDtcbiAgICB9XG4gICAgW2tHZXRQYXJzZXJDb25maWd1cmF0aW9uXSgpIHtcbiAgICAgICAgcmV0dXJuIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfcGFyc2VyQ29uZmlnLCBcImZcIik7XG4gICAgfVxuICAgIFtrR2V0VXNhZ2VDb25maWd1cmF0aW9uXSgpIHtcbiAgICAgICAgcmV0dXJuIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdXNhZ2VDb25maWcsIFwiZlwiKTtcbiAgICB9XG4gICAgW2tHdWVzc0xvY2FsZV0oKSB7XG4gICAgICAgIGlmICghX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9kZXRlY3RMb2NhbGUsIFwiZlwiKSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY29uc3QgbG9jYWxlID0gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9zaGltLCBcImZcIikuZ2V0RW52KCdMQ19BTEwnKSB8fFxuICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9zaGltLCBcImZcIikuZ2V0RW52KCdMQ19NRVNTQUdFUycpIHx8XG4gICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3NoaW0sIFwiZlwiKS5nZXRFbnYoJ0xBTkcnKSB8fFxuICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9zaGltLCBcImZcIikuZ2V0RW52KCdMQU5HVUFHRScpIHx8XG4gICAgICAgICAgICAnZW5fVVMnO1xuICAgICAgICB0aGlzLmxvY2FsZShsb2NhbGUucmVwbGFjZSgvWy46XS4qLywgJycpKTtcbiAgICB9XG4gICAgW2tHdWVzc1ZlcnNpb25dKCkge1xuICAgICAgICBjb25zdCBvYmogPSB0aGlzW2tQa2dVcF0oKTtcbiAgICAgICAgcmV0dXJuIG9iai52ZXJzaW9uIHx8ICd1bmtub3duJztcbiAgICB9XG4gICAgW2tQYXJzZVBvc2l0aW9uYWxOdW1iZXJzXShhcmd2KSB7XG4gICAgICAgIGNvbnN0IGFyZ3MgPSBhcmd2WyctLSddID8gYXJndlsnLS0nXSA6IGFyZ3YuXztcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGFyZzsgKGFyZyA9IGFyZ3NbaV0pICE9PSB1bmRlZmluZWQ7IGkrKykge1xuICAgICAgICAgICAgaWYgKF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc2hpbSwgXCJmXCIpLlBhcnNlci5sb29rc0xpa2VOdW1iZXIoYXJnKSAmJlxuICAgICAgICAgICAgICAgIE51bWJlci5pc1NhZmVJbnRlZ2VyKE1hdGguZmxvb3IocGFyc2VGbG9hdChgJHthcmd9YCkpKSkge1xuICAgICAgICAgICAgICAgIGFyZ3NbaV0gPSBOdW1iZXIoYXJnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXJndjtcbiAgICB9XG4gICAgW2tQa2dVcF0ocm9vdFBhdGgpIHtcbiAgICAgICAgY29uc3QgbnBhdGggPSByb290UGF0aCB8fCAnKic7XG4gICAgICAgIGlmIChfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3BrZ3MsIFwiZlwiKVtucGF0aF0pXG4gICAgICAgICAgICByZXR1cm4gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9wa2dzLCBcImZcIilbbnBhdGhdO1xuICAgICAgICBsZXQgb2JqID0ge307XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgc3RhcnREaXIgPSByb290UGF0aCB8fCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3NoaW0sIFwiZlwiKS5tYWluRmlsZW5hbWU7XG4gICAgICAgICAgICBpZiAoIXJvb3RQYXRoICYmIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc2hpbSwgXCJmXCIpLnBhdGguZXh0bmFtZShzdGFydERpcikpIHtcbiAgICAgICAgICAgICAgICBzdGFydERpciA9IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc2hpbSwgXCJmXCIpLnBhdGguZGlybmFtZShzdGFydERpcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBwa2dKc29uUGF0aCA9IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc2hpbSwgXCJmXCIpLmZpbmRVcChzdGFydERpciwgKGRpciwgbmFtZXMpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAobmFtZXMuaW5jbHVkZXMoJ3BhY2thZ2UuanNvbicpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAncGFja2FnZS5qc29uJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBhc3NlcnROb3RTdHJpY3RFcXVhbChwa2dKc29uUGF0aCwgdW5kZWZpbmVkLCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3NoaW0sIFwiZlwiKSk7XG4gICAgICAgICAgICBvYmogPSBKU09OLnBhcnNlKF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc2hpbSwgXCJmXCIpLnJlYWRGaWxlU3luYyhwa2dKc29uUGF0aCwgJ3V0ZjgnKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKF9ub29wKSB7IH1cbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9wa2dzLCBcImZcIilbbnBhdGhdID0gb2JqIHx8IHt9O1xuICAgICAgICByZXR1cm4gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9wa2dzLCBcImZcIilbbnBhdGhdO1xuICAgIH1cbiAgICBba1BvcHVsYXRlUGFyc2VySGludEFycmF5XSh0eXBlLCBrZXlzKSB7XG4gICAgICAgIGtleXMgPSBbXS5jb25jYXQoa2V5cyk7XG4gICAgICAgIGtleXMuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAga2V5ID0gdGhpc1trU2FuaXRpemVLZXldKGtleSk7XG4gICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKVt0eXBlXS5wdXNoKGtleSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBba1BvcHVsYXRlUGFyc2VySGludFNpbmdsZVZhbHVlRGljdGlvbmFyeV0oYnVpbGRlciwgdHlwZSwga2V5LCB2YWx1ZSkge1xuICAgICAgICB0aGlzW2tQb3B1bGF0ZVBhcnNlckhpbnREaWN0aW9uYXJ5XShidWlsZGVyLCB0eXBlLCBrZXksIHZhbHVlLCAodHlwZSwga2V5LCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBcImZcIilbdHlwZV1ba2V5XSA9IHZhbHVlO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgW2tQb3B1bGF0ZVBhcnNlckhpbnRBcnJheURpY3Rpb25hcnldKGJ1aWxkZXIsIHR5cGUsIGtleSwgdmFsdWUpIHtcbiAgICAgICAgdGhpc1trUG9wdWxhdGVQYXJzZXJIaW50RGljdGlvbmFyeV0oYnVpbGRlciwgdHlwZSwga2V5LCB2YWx1ZSwgKHR5cGUsIGtleSwgdmFsdWUpID0+IHtcbiAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucywgXCJmXCIpW3R5cGVdW2tleV0gPSAoX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBcImZcIilbdHlwZV1ba2V5XSB8fCBbXSkuY29uY2F0KHZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIFtrUG9wdWxhdGVQYXJzZXJIaW50RGljdGlvbmFyeV0oYnVpbGRlciwgdHlwZSwga2V5LCB2YWx1ZSwgc2luZ2xlS2V5SGFuZGxlcikge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShrZXkpKSB7XG4gICAgICAgICAgICBrZXkuZm9yRWFjaChrID0+IHtcbiAgICAgICAgICAgICAgICBidWlsZGVyKGssIHZhbHVlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCgoa2V5KSA9PiB0eXBlb2Yga2V5ID09PSAnb2JqZWN0Jykoa2V5KSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBrIG9mIG9iamVjdEtleXMoa2V5KSkge1xuICAgICAgICAgICAgICAgIGJ1aWxkZXIoaywga2V5W2tdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHNpbmdsZUtleUhhbmRsZXIodHlwZSwgdGhpc1trU2FuaXRpemVLZXldKGtleSksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBba1Nhbml0aXplS2V5XShrZXkpIHtcbiAgICAgICAgaWYgKGtleSA9PT0gJ19fcHJvdG9fXycpXG4gICAgICAgICAgICByZXR1cm4gJ19fX3Byb3RvX19fJztcbiAgICAgICAgcmV0dXJuIGtleTtcbiAgICB9XG4gICAgW2tTZXRLZXldKGtleSwgc2V0KSB7XG4gICAgICAgIHRoaXNba1BvcHVsYXRlUGFyc2VySGludFNpbmdsZVZhbHVlRGljdGlvbmFyeV0odGhpc1trU2V0S2V5XS5iaW5kKHRoaXMpLCAna2V5Jywga2V5LCBzZXQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgW2tVbmZyZWV6ZV0oKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZywgX2gsIF9qLCBfaywgX2wsIF9tO1xuICAgICAgICBjb25zdCBmcm96ZW4gPSBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2Zyb3plbnMsIFwiZlwiKS5wb3AoKTtcbiAgICAgICAgYXNzZXJ0Tm90U3RyaWN0RXF1YWwoZnJvemVuLCB1bmRlZmluZWQsIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc2hpbSwgXCJmXCIpKTtcbiAgICAgICAgbGV0IGNvbmZpZ09iamVjdHM7XG4gICAgICAgIChfYSA9IHRoaXMsIF9iID0gdGhpcywgX2MgPSB0aGlzLCBfZCA9IHRoaXMsIF9lID0gdGhpcywgX2YgPSB0aGlzLCBfZyA9IHRoaXMsIF9oID0gdGhpcywgX2ogPSB0aGlzLCBfayA9IHRoaXMsIF9sID0gdGhpcywgX20gPSB0aGlzLCB7XG4gICAgICAgICAgICBvcHRpb25zOiAoeyBzZXQgdmFsdWUoX28pIHsgX19jbGFzc1ByaXZhdGVGaWVsZFNldChfYSwgX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucywgX28sIFwiZlwiKTsgfSB9KS52YWx1ZSxcbiAgICAgICAgICAgIGNvbmZpZ09iamVjdHMsXG4gICAgICAgICAgICBleGl0UHJvY2VzczogKHsgc2V0IHZhbHVlKF9vKSB7IF9fY2xhc3NQcml2YXRlRmllbGRTZXQoX2IsIF9ZYXJnc0luc3RhbmNlX2V4aXRQcm9jZXNzLCBfbywgXCJmXCIpOyB9IH0pLnZhbHVlLFxuICAgICAgICAgICAgZ3JvdXBzOiAoeyBzZXQgdmFsdWUoX28pIHsgX19jbGFzc1ByaXZhdGVGaWVsZFNldChfYywgX1lhcmdzSW5zdGFuY2VfZ3JvdXBzLCBfbywgXCJmXCIpOyB9IH0pLnZhbHVlLFxuICAgICAgICAgICAgb3V0cHV0OiAoeyBzZXQgdmFsdWUoX28pIHsgX19jbGFzc1ByaXZhdGVGaWVsZFNldChfZCwgX1lhcmdzSW5zdGFuY2Vfb3V0cHV0LCBfbywgXCJmXCIpOyB9IH0pLnZhbHVlLFxuICAgICAgICAgICAgZXhpdEVycm9yOiAoeyBzZXQgdmFsdWUoX28pIHsgX19jbGFzc1ByaXZhdGVGaWVsZFNldChfZSwgX1lhcmdzSW5zdGFuY2VfZXhpdEVycm9yLCBfbywgXCJmXCIpOyB9IH0pLnZhbHVlLFxuICAgICAgICAgICAgaGFzT3V0cHV0OiAoeyBzZXQgdmFsdWUoX28pIHsgX19jbGFzc1ByaXZhdGVGaWVsZFNldChfZiwgX1lhcmdzSW5zdGFuY2VfaGFzT3V0cHV0LCBfbywgXCJmXCIpOyB9IH0pLnZhbHVlLFxuICAgICAgICAgICAgcGFyc2VkOiB0aGlzLnBhcnNlZCxcbiAgICAgICAgICAgIHN0cmljdDogKHsgc2V0IHZhbHVlKF9vKSB7IF9fY2xhc3NQcml2YXRlRmllbGRTZXQoX2csIF9ZYXJnc0luc3RhbmNlX3N0cmljdCwgX28sIFwiZlwiKTsgfSB9KS52YWx1ZSxcbiAgICAgICAgICAgIHN0cmljdENvbW1hbmRzOiAoeyBzZXQgdmFsdWUoX28pIHsgX19jbGFzc1ByaXZhdGVGaWVsZFNldChfaCwgX1lhcmdzSW5zdGFuY2Vfc3RyaWN0Q29tbWFuZHMsIF9vLCBcImZcIik7IH0gfSkudmFsdWUsXG4gICAgICAgICAgICBzdHJpY3RPcHRpb25zOiAoeyBzZXQgdmFsdWUoX28pIHsgX19jbGFzc1ByaXZhdGVGaWVsZFNldChfaiwgX1lhcmdzSW5zdGFuY2Vfc3RyaWN0T3B0aW9ucywgX28sIFwiZlwiKTsgfSB9KS52YWx1ZSxcbiAgICAgICAgICAgIGNvbXBsZXRpb25Db21tYW5kOiAoeyBzZXQgdmFsdWUoX28pIHsgX19jbGFzc1ByaXZhdGVGaWVsZFNldChfaywgX1lhcmdzSW5zdGFuY2VfY29tcGxldGlvbkNvbW1hbmQsIF9vLCBcImZcIik7IH0gfSkudmFsdWUsXG4gICAgICAgICAgICBwYXJzZUZuOiAoeyBzZXQgdmFsdWUoX28pIHsgX19jbGFzc1ByaXZhdGVGaWVsZFNldChfbCwgX1lhcmdzSW5zdGFuY2VfcGFyc2VGbiwgX28sIFwiZlwiKTsgfSB9KS52YWx1ZSxcbiAgICAgICAgICAgIHBhcnNlQ29udGV4dDogKHsgc2V0IHZhbHVlKF9vKSB7IF9fY2xhc3NQcml2YXRlRmllbGRTZXQoX20sIF9ZYXJnc0luc3RhbmNlX3BhcnNlQ29udGV4dCwgX28sIFwiZlwiKTsgfSB9KS52YWx1ZSxcbiAgICAgICAgfSA9IGZyb3plbik7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucywgXCJmXCIpLmNvbmZpZ09iamVjdHMgPSBjb25maWdPYmplY3RzO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBcImZcIikudW5mcmVlemUoKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV92YWxpZGF0aW9uLCBcImZcIikudW5mcmVlemUoKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9jb21tYW5kLCBcImZcIikudW5mcmVlemUoKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9nbG9iYWxNaWRkbGV3YXJlLCBcImZcIikudW5mcmVlemUoKTtcbiAgICB9XG4gICAgW2tWYWxpZGF0ZUFzeW5jXSh2YWxpZGF0aW9uLCBhcmd2KSB7XG4gICAgICAgIHJldHVybiBtYXliZUFzeW5jUmVzdWx0KGFyZ3YsIHJlc3VsdCA9PiB7XG4gICAgICAgICAgICB2YWxpZGF0aW9uKHJlc3VsdCk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0SW50ZXJuYWxNZXRob2RzKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZ2V0Q29tbWFuZEluc3RhbmNlOiB0aGlzW2tHZXRDb21tYW5kSW5zdGFuY2VdLmJpbmQodGhpcyksXG4gICAgICAgICAgICBnZXRDb250ZXh0OiB0aGlzW2tHZXRDb250ZXh0XS5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgZ2V0SGFzT3V0cHV0OiB0aGlzW2tHZXRIYXNPdXRwdXRdLmJpbmQodGhpcyksXG4gICAgICAgICAgICBnZXRMb2dnZXJJbnN0YW5jZTogdGhpc1trR2V0TG9nZ2VySW5zdGFuY2VdLmJpbmQodGhpcyksXG4gICAgICAgICAgICBnZXRQYXJzZUNvbnRleHQ6IHRoaXNba0dldFBhcnNlQ29udGV4dF0uYmluZCh0aGlzKSxcbiAgICAgICAgICAgIGdldFBhcnNlckNvbmZpZ3VyYXRpb246IHRoaXNba0dldFBhcnNlckNvbmZpZ3VyYXRpb25dLmJpbmQodGhpcyksXG4gICAgICAgICAgICBnZXRVc2FnZUNvbmZpZ3VyYXRpb246IHRoaXNba0dldFVzYWdlQ29uZmlndXJhdGlvbl0uYmluZCh0aGlzKSxcbiAgICAgICAgICAgIGdldFVzYWdlSW5zdGFuY2U6IHRoaXNba0dldFVzYWdlSW5zdGFuY2VdLmJpbmQodGhpcyksXG4gICAgICAgICAgICBnZXRWYWxpZGF0aW9uSW5zdGFuY2U6IHRoaXNba0dldFZhbGlkYXRpb25JbnN0YW5jZV0uYmluZCh0aGlzKSxcbiAgICAgICAgICAgIGhhc1BhcnNlQ2FsbGJhY2s6IHRoaXNba0hhc1BhcnNlQ2FsbGJhY2tdLmJpbmQodGhpcyksXG4gICAgICAgICAgICBpc0dsb2JhbENvbnRleHQ6IHRoaXNba0lzR2xvYmFsQ29udGV4dF0uYmluZCh0aGlzKSxcbiAgICAgICAgICAgIHBvc3RQcm9jZXNzOiB0aGlzW2tQb3N0UHJvY2Vzc10uYmluZCh0aGlzKSxcbiAgICAgICAgICAgIHJlc2V0OiB0aGlzW2tSZXNldF0uYmluZCh0aGlzKSxcbiAgICAgICAgICAgIHJ1blZhbGlkYXRpb246IHRoaXNba1J1blZhbGlkYXRpb25dLmJpbmQodGhpcyksXG4gICAgICAgICAgICBydW5ZYXJnc1BhcnNlckFuZEV4ZWN1dGVDb21tYW5kczogdGhpc1trUnVuWWFyZ3NQYXJzZXJBbmRFeGVjdXRlQ29tbWFuZHNdLmJpbmQodGhpcyksXG4gICAgICAgICAgICBzZXRIYXNPdXRwdXQ6IHRoaXNba1NldEhhc091dHB1dF0uYmluZCh0aGlzKSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgW2tHZXRDb21tYW5kSW5zdGFuY2VdKCkge1xuICAgICAgICByZXR1cm4gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9jb21tYW5kLCBcImZcIik7XG4gICAgfVxuICAgIFtrR2V0Q29udGV4dF0oKSB7XG4gICAgICAgIHJldHVybiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2NvbnRleHQsIFwiZlwiKTtcbiAgICB9XG4gICAgW2tHZXRIYXNPdXRwdXRdKCkge1xuICAgICAgICByZXR1cm4gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9oYXNPdXRwdXQsIFwiZlwiKTtcbiAgICB9XG4gICAgW2tHZXRMb2dnZXJJbnN0YW5jZV0oKSB7XG4gICAgICAgIHJldHVybiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2xvZ2dlciwgXCJmXCIpO1xuICAgIH1cbiAgICBba0dldFBhcnNlQ29udGV4dF0oKSB7XG4gICAgICAgIHJldHVybiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3BhcnNlQ29udGV4dCwgXCJmXCIpIHx8IHt9O1xuICAgIH1cbiAgICBba0dldFVzYWdlSW5zdGFuY2VdKCkge1xuICAgICAgICByZXR1cm4gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV91c2FnZSwgXCJmXCIpO1xuICAgIH1cbiAgICBba0dldFZhbGlkYXRpb25JbnN0YW5jZV0oKSB7XG4gICAgICAgIHJldHVybiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3ZhbGlkYXRpb24sIFwiZlwiKTtcbiAgICB9XG4gICAgW2tIYXNQYXJzZUNhbGxiYWNrXSgpIHtcbiAgICAgICAgcmV0dXJuICEhX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9wYXJzZUZuLCBcImZcIik7XG4gICAgfVxuICAgIFtrSXNHbG9iYWxDb250ZXh0XSgpIHtcbiAgICAgICAgcmV0dXJuIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfaXNHbG9iYWxDb250ZXh0LCBcImZcIik7XG4gICAgfVxuICAgIFtrUG9zdFByb2Nlc3NdKGFyZ3YsIHBvcHVsYXRlRG91YmxlRGFzaCwgY2FsbGVkRnJvbUNvbW1hbmQsIHJ1bkdsb2JhbE1pZGRsZXdhcmUpIHtcbiAgICAgICAgaWYgKGNhbGxlZEZyb21Db21tYW5kKVxuICAgICAgICAgICAgcmV0dXJuIGFyZ3Y7XG4gICAgICAgIGlmIChpc1Byb21pc2UoYXJndikpXG4gICAgICAgICAgICByZXR1cm4gYXJndjtcbiAgICAgICAgaWYgKCFwb3B1bGF0ZURvdWJsZURhc2gpIHtcbiAgICAgICAgICAgIGFyZ3YgPSB0aGlzW2tDb3B5RG91YmxlRGFzaF0oYXJndik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFyc2VQb3NpdGlvbmFsTnVtYmVycyA9IHRoaXNba0dldFBhcnNlckNvbmZpZ3VyYXRpb25dKClbJ3BhcnNlLXBvc2l0aW9uYWwtbnVtYmVycyddIHx8XG4gICAgICAgICAgICB0aGlzW2tHZXRQYXJzZXJDb25maWd1cmF0aW9uXSgpWydwYXJzZS1wb3NpdGlvbmFsLW51bWJlcnMnXSA9PT0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAocGFyc2VQb3NpdGlvbmFsTnVtYmVycykge1xuICAgICAgICAgICAgYXJndiA9IHRoaXNba1BhcnNlUG9zaXRpb25hbE51bWJlcnNdKGFyZ3YpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChydW5HbG9iYWxNaWRkbGV3YXJlKSB7XG4gICAgICAgICAgICBhcmd2ID0gYXBwbHlNaWRkbGV3YXJlKGFyZ3YsIHRoaXMsIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfZ2xvYmFsTWlkZGxld2FyZSwgXCJmXCIpLmdldE1pZGRsZXdhcmUoKSwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcmd2O1xuICAgIH1cbiAgICBba1Jlc2V0XShhbGlhc2VzID0ge30pIHtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKSB8fCB7fSwgXCJmXCIpO1xuICAgICAgICBjb25zdCB0bXBPcHRpb25zID0ge307XG4gICAgICAgIHRtcE9wdGlvbnMubG9jYWwgPSBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKS5sb2NhbCB8fCBbXTtcbiAgICAgICAgdG1wT3B0aW9ucy5jb25maWdPYmplY3RzID0gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBcImZcIikuY29uZmlnT2JqZWN0cyB8fCBbXTtcbiAgICAgICAgY29uc3QgbG9jYWxMb29rdXAgPSB7fTtcbiAgICAgICAgdG1wT3B0aW9ucy5sb2NhbC5mb3JFYWNoKGwgPT4ge1xuICAgICAgICAgICAgbG9jYWxMb29rdXBbbF0gPSB0cnVlO1xuICAgICAgICAgICAgKGFsaWFzZXNbbF0gfHwgW10pLmZvckVhY2goYSA9PiB7XG4gICAgICAgICAgICAgICAgbG9jYWxMb29rdXBbYV0gPSB0cnVlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBPYmplY3QuYXNzaWduKF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfcHJlc2VydmVkR3JvdXBzLCBcImZcIiksIE9iamVjdC5rZXlzKF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfZ3JvdXBzLCBcImZcIikpLnJlZHVjZSgoYWNjLCBncm91cE5hbWUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGtleXMgPSBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2dyb3VwcywgXCJmXCIpW2dyb3VwTmFtZV0uZmlsdGVyKGtleSA9PiAhKGtleSBpbiBsb2NhbExvb2t1cCkpO1xuICAgICAgICAgICAgaWYgKGtleXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGFjY1tncm91cE5hbWVdID0ga2V5cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH0sIHt9KSk7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfZ3JvdXBzLCB7fSwgXCJmXCIpO1xuICAgICAgICBjb25zdCBhcnJheU9wdGlvbnMgPSBbXG4gICAgICAgICAgICAnYXJyYXknLFxuICAgICAgICAgICAgJ2Jvb2xlYW4nLFxuICAgICAgICAgICAgJ3N0cmluZycsXG4gICAgICAgICAgICAnc2tpcFZhbGlkYXRpb24nLFxuICAgICAgICAgICAgJ2NvdW50JyxcbiAgICAgICAgICAgICdub3JtYWxpemUnLFxuICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgICAgICAnaGlkZGVuT3B0aW9ucycsXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IG9iamVjdE9wdGlvbnMgPSBbXG4gICAgICAgICAgICAnbmFyZycsXG4gICAgICAgICAgICAna2V5JyxcbiAgICAgICAgICAgICdhbGlhcycsXG4gICAgICAgICAgICAnZGVmYXVsdCcsXG4gICAgICAgICAgICAnZGVmYXVsdERlc2NyaXB0aW9uJyxcbiAgICAgICAgICAgICdjb25maWcnLFxuICAgICAgICAgICAgJ2Nob2ljZXMnLFxuICAgICAgICAgICAgJ2RlbWFuZGVkT3B0aW9ucycsXG4gICAgICAgICAgICAnZGVtYW5kZWRDb21tYW5kcycsXG4gICAgICAgICAgICAnZGVwcmVjYXRlZE9wdGlvbnMnLFxuICAgICAgICBdO1xuICAgICAgICBhcnJheU9wdGlvbnMuZm9yRWFjaChrID0+IHtcbiAgICAgICAgICAgIHRtcE9wdGlvbnNba10gPSAoX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBcImZcIilba10gfHwgW10pLmZpbHRlcigoaykgPT4gIWxvY2FsTG9va3VwW2tdKTtcbiAgICAgICAgfSk7XG4gICAgICAgIG9iamVjdE9wdGlvbnMuZm9yRWFjaCgoaykgPT4ge1xuICAgICAgICAgICAgdG1wT3B0aW9uc1trXSA9IG9iakZpbHRlcihfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKVtrXSwgayA9PiAhbG9jYWxMb29rdXBba10pO1xuICAgICAgICB9KTtcbiAgICAgICAgdG1wT3B0aW9ucy5lbnZQcmVmaXggPSBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKS5lbnZQcmVmaXg7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucywgdG1wT3B0aW9ucywgXCJmXCIpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBcImZcIilcbiAgICAgICAgICAgID8gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV91c2FnZSwgXCJmXCIpLnJlc2V0KGxvY2FsTG9va3VwKVxuICAgICAgICAgICAgOiBVc2FnZSh0aGlzLCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3NoaW0sIFwiZlwiKSksIFwiZlwiKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV92YWxpZGF0aW9uLCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3ZhbGlkYXRpb24sIFwiZlwiKVxuICAgICAgICAgICAgPyBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3ZhbGlkYXRpb24sIFwiZlwiKS5yZXNldChsb2NhbExvb2t1cClcbiAgICAgICAgICAgIDogVmFsaWRhdGlvbih0aGlzLCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBcImZcIiksIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc2hpbSwgXCJmXCIpKSwgXCJmXCIpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2NvbW1hbmQsIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfY29tbWFuZCwgXCJmXCIpXG4gICAgICAgICAgICA/IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfY29tbWFuZCwgXCJmXCIpLnJlc2V0KClcbiAgICAgICAgICAgIDogQ29tbWFuZChfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBcImZcIiksIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdmFsaWRhdGlvbiwgXCJmXCIpLCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2dsb2JhbE1pZGRsZXdhcmUsIFwiZlwiKSwgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9zaGltLCBcImZcIikpLCBcImZcIik7XG4gICAgICAgIGlmICghX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9jb21wbGV0aW9uLCBcImZcIikpXG4gICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2NvbXBsZXRpb24sIENvbXBsZXRpb24odGhpcywgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV91c2FnZSwgXCJmXCIpLCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2NvbW1hbmQsIFwiZlwiKSwgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9zaGltLCBcImZcIikpLCBcImZcIik7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfZ2xvYmFsTWlkZGxld2FyZSwgXCJmXCIpLnJlc2V0KCk7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfY29tcGxldGlvbkNvbW1hbmQsIG51bGwsIFwiZlwiKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vdXRwdXQsICcnLCBcImZcIik7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfZXhpdEVycm9yLCBudWxsLCBcImZcIik7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfaGFzT3V0cHV0LCBmYWxzZSwgXCJmXCIpO1xuICAgICAgICB0aGlzLnBhcnNlZCA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgW2tSZWJhc2VdKGJhc2UsIGRpcikge1xuICAgICAgICByZXR1cm4gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9zaGltLCBcImZcIikucGF0aC5yZWxhdGl2ZShiYXNlLCBkaXIpO1xuICAgIH1cbiAgICBba1J1bllhcmdzUGFyc2VyQW5kRXhlY3V0ZUNvbW1hbmRzXShhcmdzLCBzaG9ydENpcmN1aXQsIGNhbGxlZEZyb21Db21tYW5kLCBjb21tYW5kSW5kZXggPSAwLCBoZWxwT25seSA9IGZhbHNlKSB7XG4gICAgICAgIGxldCBza2lwVmFsaWRhdGlvbiA9ICEhY2FsbGVkRnJvbUNvbW1hbmQgfHwgaGVscE9ubHk7XG4gICAgICAgIGFyZ3MgPSBhcmdzIHx8IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfcHJvY2Vzc0FyZ3MsIFwiZlwiKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBcImZcIikuX18gPSBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3NoaW0sIFwiZlwiKS55MThuLl9fO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKS5jb25maWd1cmF0aW9uID0gdGhpc1trR2V0UGFyc2VyQ29uZmlndXJhdGlvbl0oKTtcbiAgICAgICAgY29uc3QgcG9wdWxhdGVEb3VibGVEYXNoID0gISFfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKS5jb25maWd1cmF0aW9uWydwb3B1bGF0ZS0tJ107XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IE9iamVjdC5hc3NpZ24oe30sIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucywgXCJmXCIpLmNvbmZpZ3VyYXRpb24sIHtcbiAgICAgICAgICAgICdwb3B1bGF0ZS0tJzogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc2hpbSwgXCJmXCIpLlBhcnNlci5kZXRhaWxlZChhcmdzLCBPYmplY3QuYXNzaWduKHt9LCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKSwge1xuICAgICAgICAgICAgY29uZmlndXJhdGlvbjogeyAncGFyc2UtcG9zaXRpb25hbC1udW1iZXJzJzogZmFsc2UsIC4uLmNvbmZpZyB9LFxuICAgICAgICB9KSk7XG4gICAgICAgIGNvbnN0IGFyZ3YgPSBPYmplY3QuYXNzaWduKHBhcnNlZC5hcmd2LCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3BhcnNlQ29udGV4dCwgXCJmXCIpKTtcbiAgICAgICAgbGV0IGFyZ3ZQcm9taXNlID0gdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBhbGlhc2VzID0gcGFyc2VkLmFsaWFzZXM7XG4gICAgICAgIGxldCBoZWxwT3B0U2V0ID0gZmFsc2U7XG4gICAgICAgIGxldCB2ZXJzaW9uT3B0U2V0ID0gZmFsc2U7XG4gICAgICAgIE9iamVjdC5rZXlzKGFyZ3YpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgIGlmIChrZXkgPT09IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfaGVscE9wdCwgXCJmXCIpICYmIGFyZ3Zba2V5XSkge1xuICAgICAgICAgICAgICAgIGhlbHBPcHRTZXQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoa2V5ID09PSBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3ZlcnNpb25PcHQsIFwiZlwiKSAmJiBhcmd2W2tleV0pIHtcbiAgICAgICAgICAgICAgICB2ZXJzaW9uT3B0U2V0ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGFyZ3YuJDAgPSB0aGlzLiQwO1xuICAgICAgICB0aGlzLnBhcnNlZCA9IHBhcnNlZDtcbiAgICAgICAgaWYgKGNvbW1hbmRJbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV91c2FnZSwgXCJmXCIpLmNsZWFyQ2FjaGVkSGVscE1lc3NhZ2UoKTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpc1trR3Vlc3NMb2NhbGVdKCk7XG4gICAgICAgICAgICBpZiAoc2hvcnRDaXJjdWl0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNba1Bvc3RQcm9jZXNzXShhcmd2LCBwb3B1bGF0ZURvdWJsZURhc2gsICEhY2FsbGVkRnJvbUNvbW1hbmQsIGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2hlbHBPcHQsIFwiZlwiKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhlbHBDbWRzID0gW19fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfaGVscE9wdCwgXCJmXCIpXVxuICAgICAgICAgICAgICAgICAgICAuY29uY2F0KGFsaWFzZXNbX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9oZWxwT3B0LCBcImZcIildIHx8IFtdKVxuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGsgPT4gay5sZW5ndGggPiAxKTtcbiAgICAgICAgICAgICAgICBpZiAoaGVscENtZHMuaW5jbHVkZXMoJycgKyBhcmd2Ll9bYXJndi5fLmxlbmd0aCAtIDFdKSkge1xuICAgICAgICAgICAgICAgICAgICBhcmd2Ll8ucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIGhlbHBPcHRTZXQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfaXNHbG9iYWxDb250ZXh0LCBmYWxzZSwgXCJmXCIpO1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlcktleXMgPSBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2NvbW1hbmQsIFwiZlwiKS5nZXRDb21tYW5kcygpO1xuICAgICAgICAgICAgY29uc3QgcmVxdWVzdENvbXBsZXRpb25zID0gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9jb21wbGV0aW9uLCBcImZcIikuY29tcGxldGlvbktleSBpbiBhcmd2O1xuICAgICAgICAgICAgY29uc3Qgc2tpcFJlY29tbWVuZGF0aW9uID0gaGVscE9wdFNldCB8fCByZXF1ZXN0Q29tcGxldGlvbnMgfHwgaGVscE9ubHk7XG4gICAgICAgICAgICBpZiAoYXJndi5fLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyS2V5cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZpcnN0VW5rbm93bkNvbW1hbmQ7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBjb21tYW5kSW5kZXggfHwgMCwgY21kOyBhcmd2Ll9baV0gIT09IHVuZGVmaW5lZDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbWQgPSBTdHJpbmcoYXJndi5fW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyS2V5cy5pbmNsdWRlcyhjbWQpICYmIGNtZCAhPT0gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9jb21wbGV0aW9uQ29tbWFuZCwgXCJmXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5uZXJBcmd2ID0gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9jb21tYW5kLCBcImZcIikucnVuQ29tbWFuZChjbWQsIHRoaXMsIHBhcnNlZCwgaSArIDEsIGhlbHBPbmx5LCBoZWxwT3B0U2V0IHx8IHZlcnNpb25PcHRTZXQgfHwgaGVscE9ubHkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW2tQb3N0UHJvY2Vzc10oaW5uZXJBcmd2LCBwb3B1bGF0ZURvdWJsZURhc2gsICEhY2FsbGVkRnJvbUNvbW1hbmQsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFmaXJzdFVua25vd25Db21tYW5kICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kICE9PSBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2NvbXBsZXRpb25Db21tYW5kLCBcImZcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFVua25vd25Db21tYW5kID0gY21kO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9jb21tYW5kLCBcImZcIikuaGFzRGVmYXVsdENvbW1hbmQoKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9yZWNvbW1lbmRDb21tYW5kcywgXCJmXCIpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFVua25vd25Db21tYW5kICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAhc2tpcFJlY29tbWVuZGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3ZhbGlkYXRpb24sIFwiZlwiKS5yZWNvbW1lbmRDb21tYW5kcyhmaXJzdFVua25vd25Db21tYW5kLCBoYW5kbGVyS2V5cyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfY29tcGxldGlvbkNvbW1hbmQsIFwiZlwiKSAmJlxuICAgICAgICAgICAgICAgICAgICBhcmd2Ll8uaW5jbHVkZXMoX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9jb21wbGV0aW9uQ29tbWFuZCwgXCJmXCIpKSAmJlxuICAgICAgICAgICAgICAgICAgICAhcmVxdWVzdENvbXBsZXRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2V4aXRQcm9jZXNzLCBcImZcIikpXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRCbG9ja2luZyh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93Q29tcGxldGlvblNjcmlwdCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmV4aXQoMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfY29tbWFuZCwgXCJmXCIpLmhhc0RlZmF1bHRDb21tYW5kKCkgJiYgIXNraXBSZWNvbW1lbmRhdGlvbikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlubmVyQXJndiA9IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfY29tbWFuZCwgXCJmXCIpLnJ1bkNvbW1hbmQobnVsbCwgdGhpcywgcGFyc2VkLCAwLCBoZWxwT25seSwgaGVscE9wdFNldCB8fCB2ZXJzaW9uT3B0U2V0IHx8IGhlbHBPbmx5KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1trUG9zdFByb2Nlc3NdKGlubmVyQXJndiwgcG9wdWxhdGVEb3VibGVEYXNoLCAhIWNhbGxlZEZyb21Db21tYW5kLCBmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVxdWVzdENvbXBsZXRpb25zKSB7XG4gICAgICAgICAgICAgICAgaWYgKF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfZXhpdFByb2Nlc3MsIFwiZlwiKSlcbiAgICAgICAgICAgICAgICAgICAgc2V0QmxvY2tpbmcodHJ1ZSk7XG4gICAgICAgICAgICAgICAgYXJncyA9IFtdLmNvbmNhdChhcmdzKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb21wbGV0aW9uQXJncyA9IGFyZ3Muc2xpY2UoYXJncy5pbmRleE9mKGAtLSR7X19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9jb21wbGV0aW9uLCBcImZcIikuY29tcGxldGlvbktleX1gKSArIDEpO1xuICAgICAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfY29tcGxldGlvbiwgXCJmXCIpLmdldENvbXBsZXRpb24oY29tcGxldGlvbkFyZ3MsIChlcnIsIGNvbXBsZXRpb25zKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnIpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWUVycm9yKGVyci5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgKGNvbXBsZXRpb25zIHx8IFtdKS5mb3JFYWNoKGNvbXBsZXRpb24gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9sb2dnZXIsIFwiZlwiKS5sb2coY29tcGxldGlvbik7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmV4aXQoMCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNba1Bvc3RQcm9jZXNzXShhcmd2LCAhcG9wdWxhdGVEb3VibGVEYXNoLCAhIWNhbGxlZEZyb21Db21tYW5kLCBmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIV9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfaGFzT3V0cHV0LCBcImZcIikpIHtcbiAgICAgICAgICAgICAgICBpZiAoaGVscE9wdFNldCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9leGl0UHJvY2VzcywgXCJmXCIpKVxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0QmxvY2tpbmcodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHNraXBWYWxpZGF0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93SGVscCgnbG9nJyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhpdCgwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodmVyc2lvbk9wdFNldCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9leGl0UHJvY2VzcywgXCJmXCIpKVxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0QmxvY2tpbmcodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHNraXBWYWxpZGF0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV91c2FnZSwgXCJmXCIpLnNob3dWZXJzaW9uKCdsb2cnKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5leGl0KDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghc2tpcFZhbGlkYXRpb24gJiYgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBcImZcIikuc2tpcFZhbGlkYXRpb24ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHNraXBWYWxpZGF0aW9uID0gT2JqZWN0LmtleXMoYXJndikuc29tZShrZXkgPT4gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBcImZcIikuc2tpcFZhbGlkYXRpb24uaW5kZXhPZihrZXkpID49IDAgJiYgYXJndltrZXldID09PSB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghc2tpcFZhbGlkYXRpb24pIHtcbiAgICAgICAgICAgICAgICBpZiAocGFyc2VkLmVycm9yKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWUVycm9yKHBhcnNlZC5lcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICBpZiAoIXJlcXVlc3RDb21wbGV0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWxpZGF0aW9uID0gdGhpc1trUnVuVmFsaWRhdGlvbl0oYWxpYXNlcywge30sIHBhcnNlZC5lcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY2FsbGVkRnJvbUNvbW1hbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3ZQcm9taXNlID0gYXBwbHlNaWRkbGV3YXJlKGFyZ3YsIHRoaXMsIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfZ2xvYmFsTWlkZGxld2FyZSwgXCJmXCIpLmdldE1pZGRsZXdhcmUoKSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYXJndlByb21pc2UgPSB0aGlzW2tWYWxpZGF0ZUFzeW5jXSh2YWxpZGF0aW9uLCBhcmd2UHJvbWlzZSAhPT0gbnVsbCAmJiBhcmd2UHJvbWlzZSAhPT0gdm9pZCAwID8gYXJndlByb21pc2UgOiBhcmd2KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzUHJvbWlzZShhcmd2UHJvbWlzZSkgJiYgIWNhbGxlZEZyb21Db21tYW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmd2UHJvbWlzZSA9IGFyZ3ZQcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhcHBseU1pZGRsZXdhcmUoYXJndiwgdGhpcywgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9nbG9iYWxNaWRkbGV3YXJlLCBcImZcIikuZ2V0TWlkZGxld2FyZSgpLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBpZiAoZXJyIGluc3RhbmNlb2YgWUVycm9yKVxuICAgICAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdXNhZ2UsIFwiZlwiKS5mYWlsKGVyci5tZXNzYWdlLCBlcnIpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpc1trUG9zdFByb2Nlc3NdKGFyZ3ZQcm9taXNlICE9PSBudWxsICYmIGFyZ3ZQcm9taXNlICE9PSB2b2lkIDAgPyBhcmd2UHJvbWlzZSA6IGFyZ3YsIHBvcHVsYXRlRG91YmxlRGFzaCwgISFjYWxsZWRGcm9tQ29tbWFuZCwgdHJ1ZSk7XG4gICAgfVxuICAgIFtrUnVuVmFsaWRhdGlvbl0oYWxpYXNlcywgcG9zaXRpb25hbE1hcCwgcGFyc2VFcnJvcnMsIGlzRGVmYXVsdENvbW1hbmQpIHtcbiAgICAgICAgY29uc3QgZGVtYW5kZWRPcHRpb25zID0geyAuLi50aGlzLmdldERlbWFuZGVkT3B0aW9ucygpIH07XG4gICAgICAgIHJldHVybiAoYXJndikgPT4ge1xuICAgICAgICAgICAgaWYgKHBhcnNlRXJyb3JzKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBZRXJyb3IocGFyc2VFcnJvcnMubWVzc2FnZSk7XG4gICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3ZhbGlkYXRpb24sIFwiZlwiKS5ub25PcHRpb25Db3VudChhcmd2KTtcbiAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdmFsaWRhdGlvbiwgXCJmXCIpLnJlcXVpcmVkQXJndW1lbnRzKGFyZ3YsIGRlbWFuZGVkT3B0aW9ucyk7XG4gICAgICAgICAgICBsZXQgZmFpbGVkU3RyaWN0Q29tbWFuZHMgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3N0cmljdENvbW1hbmRzLCBcImZcIikpIHtcbiAgICAgICAgICAgICAgICBmYWlsZWRTdHJpY3RDb21tYW5kcyA9IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdmFsaWRhdGlvbiwgXCJmXCIpLnVua25vd25Db21tYW5kcyhhcmd2KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3N0cmljdCwgXCJmXCIpICYmICFmYWlsZWRTdHJpY3RDb21tYW5kcykge1xuICAgICAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdmFsaWRhdGlvbiwgXCJmXCIpLnVua25vd25Bcmd1bWVudHMoYXJndiwgYWxpYXNlcywgcG9zaXRpb25hbE1hcCwgISFpc0RlZmF1bHRDb21tYW5kKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc3RyaWN0T3B0aW9ucywgXCJmXCIpKSB7XG4gICAgICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV92YWxpZGF0aW9uLCBcImZcIikudW5rbm93bkFyZ3VtZW50cyhhcmd2LCBhbGlhc2VzLCB7fSwgZmFsc2UsIGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdmFsaWRhdGlvbiwgXCJmXCIpLmxpbWl0ZWRDaG9pY2VzKGFyZ3YpO1xuICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV92YWxpZGF0aW9uLCBcImZcIikuaW1wbGljYXRpb25zKGFyZ3YpO1xuICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV92YWxpZGF0aW9uLCBcImZcIikuY29uZmxpY3RpbmcoYXJndik7XG4gICAgICAgIH07XG4gICAgfVxuICAgIFtrU2V0SGFzT3V0cHV0XSgpIHtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9oYXNPdXRwdXQsIHRydWUsIFwiZlwiKTtcbiAgICB9XG4gICAgW2tUcmFja01hbnVhbGx5U2V0S2V5c10oa2V5cykge1xuICAgICAgICBpZiAodHlwZW9mIGtleXMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKS5rZXlba2V5c10gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZm9yIChjb25zdCBrIG9mIGtleXMpIHtcbiAgICAgICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKS5rZXlba10gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGlzWWFyZ3NJbnN0YW5jZSh5KSB7XG4gICAgcmV0dXJuICEheSAmJiB0eXBlb2YgeS5nZXRJbnRlcm5hbE1ldGhvZHMgPT09ICdmdW5jdGlvbic7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB3aGljaE1vZHVsZShleHBvcnRlZCkge1xuICAgIGlmICh0eXBlb2YgcmVxdWlyZSA9PT0gJ3VuZGVmaW5lZCcpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGZvciAobGV0IGkgPSAwLCBmaWxlcyA9IE9iamVjdC5rZXlzKHJlcXVpcmUuY2FjaGUpLCBtb2Q7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBtb2QgPSByZXF1aXJlLmNhY2hlW2ZpbGVzW2ldXTtcbiAgICAgICAgaWYgKG1vZC5leHBvcnRzID09PSBleHBvcnRlZClcbiAgICAgICAgICAgIHJldHVybiBtb2Q7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuIiwiaW1wb3J0IHsgb2JqZWN0S2V5cyB9IGZyb20gJy4uL3R5cGluZ3MvY29tbW9uLXR5cGVzLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBvYmpGaWx0ZXIob3JpZ2luYWwgPSB7fSwgZmlsdGVyID0gKCkgPT4gdHJ1ZSkge1xuICAgIGNvbnN0IG9iaiA9IHt9O1xuICAgIG9iamVjdEtleXMob3JpZ2luYWwpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgaWYgKGZpbHRlcihrZXksIG9yaWdpbmFsW2tleV0pKSB7XG4gICAgICAgICAgICBvYmpba2V5XSA9IG9yaWdpbmFsW2tleV07XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gb2JqO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc2V0QmxvY2tpbmcoYmxvY2tpbmcpIHtcbiAgICBpZiAodHlwZW9mIHByb2Nlc3MgPT09ICd1bmRlZmluZWQnKVxuICAgICAgICByZXR1cm47XG4gICAgW3Byb2Nlc3Muc3Rkb3V0LCBwcm9jZXNzLnN0ZGVycl0uZm9yRWFjaChfc3RyZWFtID0+IHtcbiAgICAgICAgY29uc3Qgc3RyZWFtID0gX3N0cmVhbTtcbiAgICAgICAgaWYgKHN0cmVhbS5faGFuZGxlICYmXG4gICAgICAgICAgICBzdHJlYW0uaXNUVFkgJiZcbiAgICAgICAgICAgIHR5cGVvZiBzdHJlYW0uX2hhbmRsZS5zZXRCbG9ja2luZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgc3RyZWFtLl9oYW5kbGUuc2V0QmxvY2tpbmcoYmxvY2tpbmcpO1xuICAgICAgICB9XG4gICAgfSk7XG59XG4iLCJpbXBvcnQgeyBvYmpGaWx0ZXIgfSBmcm9tICcuL3V0aWxzL29iai1maWx0ZXIuanMnO1xuaW1wb3J0IHsgWUVycm9yIH0gZnJvbSAnLi95ZXJyb3IuanMnO1xuaW1wb3J0IHNldEJsb2NraW5nIGZyb20gJy4vdXRpbHMvc2V0LWJsb2NraW5nLmpzJztcbmZ1bmN0aW9uIGlzQm9vbGVhbihmYWlsKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBmYWlsID09PSAnYm9vbGVhbic7XG59XG5leHBvcnQgZnVuY3Rpb24gdXNhZ2UoeWFyZ3MsIHNoaW0pIHtcbiAgICBjb25zdCBfXyA9IHNoaW0ueTE4bi5fXztcbiAgICBjb25zdCBzZWxmID0ge307XG4gICAgY29uc3QgZmFpbHMgPSBbXTtcbiAgICBzZWxmLmZhaWxGbiA9IGZ1bmN0aW9uIGZhaWxGbihmKSB7XG4gICAgICAgIGZhaWxzLnB1c2goZik7XG4gICAgfTtcbiAgICBsZXQgZmFpbE1lc3NhZ2UgPSBudWxsO1xuICAgIGxldCBnbG9iYWxGYWlsTWVzc2FnZSA9IG51bGw7XG4gICAgbGV0IHNob3dIZWxwT25GYWlsID0gdHJ1ZTtcbiAgICBzZWxmLnNob3dIZWxwT25GYWlsID0gZnVuY3Rpb24gc2hvd0hlbHBPbkZhaWxGbihhcmcxID0gdHJ1ZSwgYXJnMikge1xuICAgICAgICBjb25zdCBbZW5hYmxlZCwgbWVzc2FnZV0gPSB0eXBlb2YgYXJnMSA9PT0gJ3N0cmluZycgPyBbdHJ1ZSwgYXJnMV0gOiBbYXJnMSwgYXJnMl07XG4gICAgICAgIGlmICh5YXJncy5nZXRJbnRlcm5hbE1ldGhvZHMoKS5pc0dsb2JhbENvbnRleHQoKSkge1xuICAgICAgICAgICAgZ2xvYmFsRmFpbE1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgICB9XG4gICAgICAgIGZhaWxNZXNzYWdlID0gbWVzc2FnZTtcbiAgICAgICAgc2hvd0hlbHBPbkZhaWwgPSBlbmFibGVkO1xuICAgICAgICByZXR1cm4gc2VsZjtcbiAgICB9O1xuICAgIGxldCBmYWlsdXJlT3V0cHV0ID0gZmFsc2U7XG4gICAgc2VsZi5mYWlsID0gZnVuY3Rpb24gZmFpbChtc2csIGVycikge1xuICAgICAgICBjb25zdCBsb2dnZXIgPSB5YXJncy5nZXRJbnRlcm5hbE1ldGhvZHMoKS5nZXRMb2dnZXJJbnN0YW5jZSgpO1xuICAgICAgICBpZiAoZmFpbHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gZmFpbHMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmYWlsID0gZmFpbHNbaV07XG4gICAgICAgICAgICAgICAgaWYgKGlzQm9vbGVhbihmYWlsKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChtc2cpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihtc2cpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZmFpbChtc2csIGVyciwgc2VsZik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHlhcmdzLmdldEV4aXRQcm9jZXNzKCkpXG4gICAgICAgICAgICAgICAgc2V0QmxvY2tpbmcodHJ1ZSk7XG4gICAgICAgICAgICBpZiAoIWZhaWx1cmVPdXRwdXQpIHtcbiAgICAgICAgICAgICAgICBmYWlsdXJlT3V0cHV0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAoc2hvd0hlbHBPbkZhaWwpIHtcbiAgICAgICAgICAgICAgICAgICAgeWFyZ3Muc2hvd0hlbHAoJ2Vycm9yJyk7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobXNnIHx8IGVycilcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKG1zZyB8fCBlcnIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGdsb2JhbE9yQ29tbWFuZEZhaWxNZXNzYWdlID0gZmFpbE1lc3NhZ2UgfHwgZ2xvYmFsRmFpbE1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgaWYgKGdsb2JhbE9yQ29tbWFuZEZhaWxNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtc2cgfHwgZXJyKVxuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCcnKTtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGdsb2JhbE9yQ29tbWFuZEZhaWxNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlcnIgPSBlcnIgfHwgbmV3IFlFcnJvcihtc2cpO1xuICAgICAgICAgICAgaWYgKHlhcmdzLmdldEV4aXRQcm9jZXNzKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geWFyZ3MuZXhpdCgxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHlhcmdzLmdldEludGVybmFsTWV0aG9kcygpLmhhc1BhcnNlQ2FsbGJhY2soKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB5YXJncy5leGl0KDEsIGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGxldCB1c2FnZXMgPSBbXTtcbiAgICBsZXQgdXNhZ2VEaXNhYmxlZCA9IGZhbHNlO1xuICAgIHNlbGYudXNhZ2UgPSAobXNnLCBkZXNjcmlwdGlvbikgPT4ge1xuICAgICAgICBpZiAobXNnID09PSBudWxsKSB7XG4gICAgICAgICAgICB1c2FnZURpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHVzYWdlcyA9IFtdO1xuICAgICAgICAgICAgcmV0dXJuIHNlbGY7XG4gICAgICAgIH1cbiAgICAgICAgdXNhZ2VEaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICB1c2FnZXMucHVzaChbbXNnLCBkZXNjcmlwdGlvbiB8fCAnJ10pO1xuICAgICAgICByZXR1cm4gc2VsZjtcbiAgICB9O1xuICAgIHNlbGYuZ2V0VXNhZ2UgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiB1c2FnZXM7XG4gICAgfTtcbiAgICBzZWxmLmdldFVzYWdlRGlzYWJsZWQgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiB1c2FnZURpc2FibGVkO1xuICAgIH07XG4gICAgc2VsZi5nZXRQb3NpdGlvbmFsR3JvdXBOYW1lID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gX18oJ1Bvc2l0aW9uYWxzOicpO1xuICAgIH07XG4gICAgbGV0IGV4YW1wbGVzID0gW107XG4gICAgc2VsZi5leGFtcGxlID0gKGNtZCwgZGVzY3JpcHRpb24pID0+IHtcbiAgICAgICAgZXhhbXBsZXMucHVzaChbY21kLCBkZXNjcmlwdGlvbiB8fCAnJ10pO1xuICAgIH07XG4gICAgbGV0IGNvbW1hbmRzID0gW107XG4gICAgc2VsZi5jb21tYW5kID0gZnVuY3Rpb24gY29tbWFuZChjbWQsIGRlc2NyaXB0aW9uLCBpc0RlZmF1bHQsIGFsaWFzZXMsIGRlcHJlY2F0ZWQgPSBmYWxzZSkge1xuICAgICAgICBpZiAoaXNEZWZhdWx0KSB7XG4gICAgICAgICAgICBjb21tYW5kcyA9IGNvbW1hbmRzLm1hcChjbWRBcnJheSA9PiB7XG4gICAgICAgICAgICAgICAgY21kQXJyYXlbMl0gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gY21kQXJyYXk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb21tYW5kcy5wdXNoKFtjbWQsIGRlc2NyaXB0aW9uIHx8ICcnLCBpc0RlZmF1bHQsIGFsaWFzZXMsIGRlcHJlY2F0ZWRdKTtcbiAgICB9O1xuICAgIHNlbGYuZ2V0Q29tbWFuZHMgPSAoKSA9PiBjb21tYW5kcztcbiAgICBsZXQgZGVzY3JpcHRpb25zID0ge307XG4gICAgc2VsZi5kZXNjcmliZSA9IGZ1bmN0aW9uIGRlc2NyaWJlKGtleU9yS2V5cywgZGVzYykge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShrZXlPcktleXMpKSB7XG4gICAgICAgICAgICBrZXlPcktleXMuZm9yRWFjaChrID0+IHtcbiAgICAgICAgICAgICAgICBzZWxmLmRlc2NyaWJlKGssIGRlc2MpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIGtleU9yS2V5cyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGtleU9yS2V5cykuZm9yRWFjaChrID0+IHtcbiAgICAgICAgICAgICAgICBzZWxmLmRlc2NyaWJlKGssIGtleU9yS2V5c1trXSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uc1trZXlPcktleXNdID0gZGVzYztcbiAgICAgICAgfVxuICAgIH07XG4gICAgc2VsZi5nZXREZXNjcmlwdGlvbnMgPSAoKSA9PiBkZXNjcmlwdGlvbnM7XG4gICAgbGV0IGVwaWxvZ3MgPSBbXTtcbiAgICBzZWxmLmVwaWxvZyA9IG1zZyA9PiB7XG4gICAgICAgIGVwaWxvZ3MucHVzaChtc2cpO1xuICAgIH07XG4gICAgbGV0IHdyYXBTZXQgPSBmYWxzZTtcbiAgICBsZXQgd3JhcDtcbiAgICBzZWxmLndyYXAgPSBjb2xzID0+IHtcbiAgICAgICAgd3JhcFNldCA9IHRydWU7XG4gICAgICAgIHdyYXAgPSBjb2xzO1xuICAgIH07XG4gICAgc2VsZi5nZXRXcmFwID0gKCkgPT4ge1xuICAgICAgICBpZiAoc2hpbS5nZXRFbnYoJ1lBUkdTX0RJU0FCTEVfV1JBUCcpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXdyYXBTZXQpIHtcbiAgICAgICAgICAgIHdyYXAgPSB3aW5kb3dXaWR0aCgpO1xuICAgICAgICAgICAgd3JhcFNldCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyYXA7XG4gICAgfTtcbiAgICBjb25zdCBkZWZlclkxOG5Mb29rdXBQcmVmaXggPSAnX195YXJnc1N0cmluZ19fOic7XG4gICAgc2VsZi5kZWZlclkxOG5Mb29rdXAgPSBzdHIgPT4gZGVmZXJZMThuTG9va3VwUHJlZml4ICsgc3RyO1xuICAgIHNlbGYuaGVscCA9IGZ1bmN0aW9uIGhlbHAoKSB7XG4gICAgICAgIGlmIChjYWNoZWRIZWxwTWVzc2FnZSlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRIZWxwTWVzc2FnZTtcbiAgICAgICAgbm9ybWFsaXplQWxpYXNlcygpO1xuICAgICAgICBjb25zdCBiYXNlJDAgPSB5YXJncy5jdXN0b21TY3JpcHROYW1lXG4gICAgICAgICAgICA/IHlhcmdzLiQwXG4gICAgICAgICAgICA6IHNoaW0ucGF0aC5iYXNlbmFtZSh5YXJncy4kMCk7XG4gICAgICAgIGNvbnN0IGRlbWFuZGVkT3B0aW9ucyA9IHlhcmdzLmdldERlbWFuZGVkT3B0aW9ucygpO1xuICAgICAgICBjb25zdCBkZW1hbmRlZENvbW1hbmRzID0geWFyZ3MuZ2V0RGVtYW5kZWRDb21tYW5kcygpO1xuICAgICAgICBjb25zdCBkZXByZWNhdGVkT3B0aW9ucyA9IHlhcmdzLmdldERlcHJlY2F0ZWRPcHRpb25zKCk7XG4gICAgICAgIGNvbnN0IGdyb3VwcyA9IHlhcmdzLmdldEdyb3VwcygpO1xuICAgICAgICBjb25zdCBvcHRpb25zID0geWFyZ3MuZ2V0T3B0aW9ucygpO1xuICAgICAgICBsZXQga2V5cyA9IFtdO1xuICAgICAgICBrZXlzID0ga2V5cy5jb25jYXQoT2JqZWN0LmtleXMoZGVzY3JpcHRpb25zKSk7XG4gICAgICAgIGtleXMgPSBrZXlzLmNvbmNhdChPYmplY3Qua2V5cyhkZW1hbmRlZE9wdGlvbnMpKTtcbiAgICAgICAga2V5cyA9IGtleXMuY29uY2F0KE9iamVjdC5rZXlzKGRlbWFuZGVkQ29tbWFuZHMpKTtcbiAgICAgICAga2V5cyA9IGtleXMuY29uY2F0KE9iamVjdC5rZXlzKG9wdGlvbnMuZGVmYXVsdCkpO1xuICAgICAgICBrZXlzID0ga2V5cy5maWx0ZXIoZmlsdGVySGlkZGVuT3B0aW9ucyk7XG4gICAgICAgIGtleXMgPSBPYmplY3Qua2V5cyhrZXlzLnJlZHVjZSgoYWNjLCBrZXkpID0+IHtcbiAgICAgICAgICAgIGlmIChrZXkgIT09ICdfJylcbiAgICAgICAgICAgICAgICBhY2Nba2V5XSA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9LCB7fSkpO1xuICAgICAgICBjb25zdCB0aGVXcmFwID0gc2VsZi5nZXRXcmFwKCk7XG4gICAgICAgIGNvbnN0IHVpID0gc2hpbS5jbGl1aSh7XG4gICAgICAgICAgICB3aWR0aDogdGhlV3JhcCxcbiAgICAgICAgICAgIHdyYXA6ICEhdGhlV3JhcCxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghdXNhZ2VEaXNhYmxlZCkge1xuICAgICAgICAgICAgaWYgKHVzYWdlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB1c2FnZXMuZm9yRWFjaCh1c2FnZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHVpLmRpdih7IHRleHQ6IGAke3VzYWdlWzBdLnJlcGxhY2UoL1xcJDAvZywgYmFzZSQwKX1gIH0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAodXNhZ2VbMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVpLmRpdih7IHRleHQ6IGAke3VzYWdlWzFdfWAsIHBhZGRpbmc6IFsxLCAwLCAwLCAwXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHVpLmRpdigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY29tbWFuZHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgbGV0IHUgPSBudWxsO1xuICAgICAgICAgICAgICAgIGlmIChkZW1hbmRlZENvbW1hbmRzLl8pIHtcbiAgICAgICAgICAgICAgICAgICAgdSA9IGAke2Jhc2UkMH0gPCR7X18oJ2NvbW1hbmQnKX0+XFxuYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHUgPSBgJHtiYXNlJDB9IFske19fKCdjb21tYW5kJyl9XVxcbmA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHVpLmRpdihgJHt1fWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjb21tYW5kcy5sZW5ndGggPiAxIHx8IChjb21tYW5kcy5sZW5ndGggPT09IDEgJiYgIWNvbW1hbmRzWzBdWzJdKSkge1xuICAgICAgICAgICAgdWkuZGl2KF9fKCdDb21tYW5kczonKSk7XG4gICAgICAgICAgICBjb25zdCBjb250ZXh0ID0geWFyZ3MuZ2V0SW50ZXJuYWxNZXRob2RzKCkuZ2V0Q29udGV4dCgpO1xuICAgICAgICAgICAgY29uc3QgcGFyZW50Q29tbWFuZHMgPSBjb250ZXh0LmNvbW1hbmRzLmxlbmd0aFxuICAgICAgICAgICAgICAgID8gYCR7Y29udGV4dC5jb21tYW5kcy5qb2luKCcgJyl9IGBcbiAgICAgICAgICAgICAgICA6ICcnO1xuICAgICAgICAgICAgaWYgKHlhcmdzLmdldEludGVybmFsTWV0aG9kcygpLmdldFBhcnNlckNvbmZpZ3VyYXRpb24oKVsnc29ydC1jb21tYW5kcyddID09PVxuICAgICAgICAgICAgICAgIHRydWUpIHtcbiAgICAgICAgICAgICAgICBjb21tYW5kcyA9IGNvbW1hbmRzLnNvcnQoKGEsIGIpID0+IGFbMF0ubG9jYWxlQ29tcGFyZShiWzBdKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBwcmVmaXggPSBiYXNlJDAgPyBgJHtiYXNlJDB9IGAgOiAnJztcbiAgICAgICAgICAgIGNvbW1hbmRzLmZvckVhY2goY29tbWFuZCA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29tbWFuZFN0cmluZyA9IGAke3ByZWZpeH0ke3BhcmVudENvbW1hbmRzfSR7Y29tbWFuZFswXS5yZXBsYWNlKC9eXFwkMCA/LywgJycpfWA7XG4gICAgICAgICAgICAgICAgdWkuc3Bhbih7XG4gICAgICAgICAgICAgICAgICAgIHRleHQ6IGNvbW1hbmRTdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IFswLCAyLCAwLCAyXSxcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IG1heFdpZHRoKGNvbW1hbmRzLCB0aGVXcmFwLCBgJHtiYXNlJDB9JHtwYXJlbnRDb21tYW5kc31gKSArIDQsXG4gICAgICAgICAgICAgICAgfSwgeyB0ZXh0OiBjb21tYW5kWzFdIH0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGhpbnRzID0gW107XG4gICAgICAgICAgICAgICAgaWYgKGNvbW1hbmRbMl0pXG4gICAgICAgICAgICAgICAgICAgIGhpbnRzLnB1c2goYFske19fKCdkZWZhdWx0Jyl9XWApO1xuICAgICAgICAgICAgICAgIGlmIChjb21tYW5kWzNdICYmIGNvbW1hbmRbM10ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGhpbnRzLnB1c2goYFske19fKCdhbGlhc2VzOicpfSAke2NvbW1hbmRbM10uam9pbignLCAnKX1dYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjb21tYW5kWzRdKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29tbWFuZFs0XSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhpbnRzLnB1c2goYFske19fKCdkZXByZWNhdGVkOiAlcycsIGNvbW1hbmRbNF0pfV1gKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhpbnRzLnB1c2goYFske19fKCdkZXByZWNhdGVkJyl9XWApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChoaW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdWkuZGl2KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IGhpbnRzLmpvaW4oJyAnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IFswLCAwLCAwLCAyXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduOiAncmlnaHQnLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHVpLmRpdigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdWkuZGl2KCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYWxpYXNLZXlzID0gKE9iamVjdC5rZXlzKG9wdGlvbnMuYWxpYXMpIHx8IFtdKS5jb25jYXQoT2JqZWN0LmtleXMoeWFyZ3MucGFyc2VkLm5ld0FsaWFzZXMpIHx8IFtdKTtcbiAgICAgICAga2V5cyA9IGtleXMuZmlsdGVyKGtleSA9PiAheWFyZ3MucGFyc2VkLm5ld0FsaWFzZXNba2V5XSAmJlxuICAgICAgICAgICAgYWxpYXNLZXlzLmV2ZXJ5KGFsaWFzID0+IChvcHRpb25zLmFsaWFzW2FsaWFzXSB8fCBbXSkuaW5kZXhPZihrZXkpID09PSAtMSkpO1xuICAgICAgICBjb25zdCBkZWZhdWx0R3JvdXAgPSBfXygnT3B0aW9uczonKTtcbiAgICAgICAgaWYgKCFncm91cHNbZGVmYXVsdEdyb3VwXSlcbiAgICAgICAgICAgIGdyb3Vwc1tkZWZhdWx0R3JvdXBdID0gW107XG4gICAgICAgIGFkZFVuZ3JvdXBlZEtleXMoa2V5cywgb3B0aW9ucy5hbGlhcywgZ3JvdXBzLCBkZWZhdWx0R3JvdXApO1xuICAgICAgICBjb25zdCBpc0xvbmdTd2l0Y2ggPSAoc3cpID0+IC9eLS0vLnRlc3QoZ2V0VGV4dChzdykpO1xuICAgICAgICBjb25zdCBkaXNwbGF5ZWRHcm91cHMgPSBPYmplY3Qua2V5cyhncm91cHMpXG4gICAgICAgICAgICAuZmlsdGVyKGdyb3VwTmFtZSA9PiBncm91cHNbZ3JvdXBOYW1lXS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgLm1hcChncm91cE5hbWUgPT4ge1xuICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZEtleXMgPSBncm91cHNbZ3JvdXBOYW1lXVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoZmlsdGVySGlkZGVuT3B0aW9ucylcbiAgICAgICAgICAgICAgICAubWFwKGtleSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGFsaWFzS2V5cy5pbmNsdWRlcyhrZXkpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ga2V5O1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBhbGlhc0tleTsgKGFsaWFzS2V5ID0gYWxpYXNLZXlzW2ldKSAhPT0gdW5kZWZpbmVkOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKChvcHRpb25zLmFsaWFzW2FsaWFzS2V5XSB8fCBbXSkuaW5jbHVkZXMoa2V5KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhbGlhc0tleTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGtleTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHsgZ3JvdXBOYW1lLCBub3JtYWxpemVkS2V5cyB9O1xuICAgICAgICB9KVxuICAgICAgICAgICAgLmZpbHRlcigoeyBub3JtYWxpemVkS2V5cyB9KSA9PiBub3JtYWxpemVkS2V5cy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgLm1hcCgoeyBncm91cE5hbWUsIG5vcm1hbGl6ZWRLZXlzIH0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHN3aXRjaGVzID0gbm9ybWFsaXplZEtleXMucmVkdWNlKChhY2MsIGtleSkgPT4ge1xuICAgICAgICAgICAgICAgIGFjY1trZXldID0gW2tleV1cbiAgICAgICAgICAgICAgICAgICAgLmNvbmNhdChvcHRpb25zLmFsaWFzW2tleV0gfHwgW10pXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoc3cgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZ3JvdXBOYW1lID09PSBzZWxmLmdldFBvc2l0aW9uYWxHcm91cE5hbWUoKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdztcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCgvXlswLTldJC8udGVzdChzdylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG9wdGlvbnMuYm9vbGVhbi5pbmNsdWRlcyhrZXkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJy0nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJy0tJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc3cubGVuZ3RoID4gMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICctLSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnLScpICsgc3cpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLnNvcnQoKHN3MSwgc3cyKSA9PiBpc0xvbmdTd2l0Y2goc3cxKSA9PT0gaXNMb25nU3dpdGNoKHN3MilcbiAgICAgICAgICAgICAgICAgICAgPyAwXG4gICAgICAgICAgICAgICAgICAgIDogaXNMb25nU3dpdGNoKHN3MSlcbiAgICAgICAgICAgICAgICAgICAgICAgID8gMVxuICAgICAgICAgICAgICAgICAgICAgICAgOiAtMSlcbiAgICAgICAgICAgICAgICAgICAgLmpvaW4oJywgJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgICAgIH0sIHt9KTtcbiAgICAgICAgICAgIHJldHVybiB7IGdyb3VwTmFtZSwgbm9ybWFsaXplZEtleXMsIHN3aXRjaGVzIH07XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBzaG9ydFN3aXRjaGVzVXNlZCA9IGRpc3BsYXllZEdyb3Vwc1xuICAgICAgICAgICAgLmZpbHRlcigoeyBncm91cE5hbWUgfSkgPT4gZ3JvdXBOYW1lICE9PSBzZWxmLmdldFBvc2l0aW9uYWxHcm91cE5hbWUoKSlcbiAgICAgICAgICAgIC5zb21lKCh7IG5vcm1hbGl6ZWRLZXlzLCBzd2l0Y2hlcyB9KSA9PiAhbm9ybWFsaXplZEtleXMuZXZlcnkoa2V5ID0+IGlzTG9uZ1N3aXRjaChzd2l0Y2hlc1trZXldKSkpO1xuICAgICAgICBpZiAoc2hvcnRTd2l0Y2hlc1VzZWQpIHtcbiAgICAgICAgICAgIGRpc3BsYXllZEdyb3Vwc1xuICAgICAgICAgICAgICAgIC5maWx0ZXIoKHsgZ3JvdXBOYW1lIH0pID0+IGdyb3VwTmFtZSAhPT0gc2VsZi5nZXRQb3NpdGlvbmFsR3JvdXBOYW1lKCkpXG4gICAgICAgICAgICAgICAgLmZvckVhY2goKHsgbm9ybWFsaXplZEtleXMsIHN3aXRjaGVzIH0pID0+IHtcbiAgICAgICAgICAgICAgICBub3JtYWxpemVkS2V5cy5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0xvbmdTd2l0Y2goc3dpdGNoZXNba2V5XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaGVzW2tleV0gPSBhZGRJbmRlbnRhdGlvbihzd2l0Y2hlc1trZXldLCAnLXgsICcubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZGlzcGxheWVkR3JvdXBzLmZvckVhY2goKHsgZ3JvdXBOYW1lLCBub3JtYWxpemVkS2V5cywgc3dpdGNoZXMgfSkgPT4ge1xuICAgICAgICAgICAgdWkuZGl2KGdyb3VwTmFtZSk7XG4gICAgICAgICAgICBub3JtYWxpemVkS2V5cy5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qga3N3aXRjaCA9IHN3aXRjaGVzW2tleV07XG4gICAgICAgICAgICAgICAgbGV0IGRlc2MgPSBkZXNjcmlwdGlvbnNba2V5XSB8fCAnJztcbiAgICAgICAgICAgICAgICBsZXQgdHlwZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKGRlc2MuaW5jbHVkZXMoZGVmZXJZMThuTG9va3VwUHJlZml4KSlcbiAgICAgICAgICAgICAgICAgICAgZGVzYyA9IF9fKGRlc2Muc3Vic3RyaW5nKGRlZmVyWTE4bkxvb2t1cFByZWZpeC5sZW5ndGgpKTtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5ib29sZWFuLmluY2x1ZGVzKGtleSkpXG4gICAgICAgICAgICAgICAgICAgIHR5cGUgPSBgWyR7X18oJ2Jvb2xlYW4nKX1dYDtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5jb3VudC5pbmNsdWRlcyhrZXkpKVxuICAgICAgICAgICAgICAgICAgICB0eXBlID0gYFske19fKCdjb3VudCcpfV1gO1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnN0cmluZy5pbmNsdWRlcyhrZXkpKVxuICAgICAgICAgICAgICAgICAgICB0eXBlID0gYFske19fKCdzdHJpbmcnKX1dYDtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5ub3JtYWxpemUuaW5jbHVkZXMoa2V5KSlcbiAgICAgICAgICAgICAgICAgICAgdHlwZSA9IGBbJHtfXygnc3RyaW5nJyl9XWA7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuYXJyYXkuaW5jbHVkZXMoa2V5KSlcbiAgICAgICAgICAgICAgICAgICAgdHlwZSA9IGBbJHtfXygnYXJyYXknKX1dYDtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5udW1iZXIuaW5jbHVkZXMoa2V5KSlcbiAgICAgICAgICAgICAgICAgICAgdHlwZSA9IGBbJHtfXygnbnVtYmVyJyl9XWA7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVwcmVjYXRlZEV4dHJhID0gKGRlcHJlY2F0ZWQpID0+IHR5cGVvZiBkZXByZWNhdGVkID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgICAgICAgICA/IGBbJHtfXygnZGVwcmVjYXRlZDogJXMnLCBkZXByZWNhdGVkKX1dYFxuICAgICAgICAgICAgICAgICAgICA6IGBbJHtfXygnZGVwcmVjYXRlZCcpfV1gO1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4dHJhID0gW1xuICAgICAgICAgICAgICAgICAgICBrZXkgaW4gZGVwcmVjYXRlZE9wdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgICAgID8gZGVwcmVjYXRlZEV4dHJhKGRlcHJlY2F0ZWRPcHRpb25zW2tleV0pXG4gICAgICAgICAgICAgICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICAgICAgICAgIGtleSBpbiBkZW1hbmRlZE9wdGlvbnMgPyBgWyR7X18oJ3JlcXVpcmVkJyl9XWAgOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmNob2ljZXMgJiYgb3B0aW9ucy5jaG9pY2VzW2tleV1cbiAgICAgICAgICAgICAgICAgICAgICAgID8gYFske19fKCdjaG9pY2VzOicpfSAke3NlbGYuc3RyaW5naWZpZWRWYWx1ZXMob3B0aW9ucy5jaG9pY2VzW2tleV0pfV1gXG4gICAgICAgICAgICAgICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRTdHJpbmcob3B0aW9ucy5kZWZhdWx0W2tleV0sIG9wdGlvbnMuZGVmYXVsdERlc2NyaXB0aW9uW2tleV0pLFxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgICAgICAgICAgICAgICAuam9pbignICcpO1xuICAgICAgICAgICAgICAgIHVpLnNwYW4oe1xuICAgICAgICAgICAgICAgICAgICB0ZXh0OiBnZXRUZXh0KGtzd2l0Y2gpLFxuICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiBbMCwgMiwgMCwgMiArIGdldEluZGVudGF0aW9uKGtzd2l0Y2gpXSxcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IG1heFdpZHRoKHN3aXRjaGVzLCB0aGVXcmFwKSArIDQsXG4gICAgICAgICAgICAgICAgfSwgZGVzYyk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2hvdWxkSGlkZU9wdGlvbkV4dHJhcyA9IHlhcmdzLmdldEludGVybmFsTWV0aG9kcygpLmdldFVzYWdlQ29uZmlndXJhdGlvbigpWydoaWRlLXR5cGVzJ10gPT09XG4gICAgICAgICAgICAgICAgICAgIHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKGV4dHJhICYmICFzaG91bGRIaWRlT3B0aW9uRXh0cmFzKVxuICAgICAgICAgICAgICAgICAgICB1aS5kaXYoeyB0ZXh0OiBleHRyYSwgcGFkZGluZzogWzAsIDAsIDAsIDJdLCBhbGlnbjogJ3JpZ2h0JyB9KTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHVpLmRpdigpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB1aS5kaXYoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChleGFtcGxlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHVpLmRpdihfXygnRXhhbXBsZXM6JykpO1xuICAgICAgICAgICAgZXhhbXBsZXMuZm9yRWFjaChleGFtcGxlID0+IHtcbiAgICAgICAgICAgICAgICBleGFtcGxlWzBdID0gZXhhbXBsZVswXS5yZXBsYWNlKC9cXCQwL2csIGJhc2UkMCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGV4YW1wbGVzLmZvckVhY2goZXhhbXBsZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGV4YW1wbGVbMV0gPT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHVpLmRpdih7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBleGFtcGxlWzBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogWzAsIDIsIDAsIDJdLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHVpLmRpdih7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBleGFtcGxlWzBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogWzAsIDIsIDAsIDJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IG1heFdpZHRoKGV4YW1wbGVzLCB0aGVXcmFwKSArIDQsXG4gICAgICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IGV4YW1wbGVbMV0sXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdWkuZGl2KCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVwaWxvZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgZSA9IGVwaWxvZ3NcbiAgICAgICAgICAgICAgICAubWFwKGVwaWxvZyA9PiBlcGlsb2cucmVwbGFjZSgvXFwkMC9nLCBiYXNlJDApKVxuICAgICAgICAgICAgICAgIC5qb2luKCdcXG4nKTtcbiAgICAgICAgICAgIHVpLmRpdihgJHtlfVxcbmApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1aS50b1N0cmluZygpLnJlcGxhY2UoL1xccyokLywgJycpO1xuICAgIH07XG4gICAgZnVuY3Rpb24gbWF4V2lkdGgodGFibGUsIHRoZVdyYXAsIG1vZGlmaWVyKSB7XG4gICAgICAgIGxldCB3aWR0aCA9IDA7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh0YWJsZSkpIHtcbiAgICAgICAgICAgIHRhYmxlID0gT2JqZWN0LnZhbHVlcyh0YWJsZSkubWFwKHYgPT4gW3ZdKTtcbiAgICAgICAgfVxuICAgICAgICB0YWJsZS5mb3JFYWNoKHYgPT4ge1xuICAgICAgICAgICAgd2lkdGggPSBNYXRoLm1heChzaGltLnN0cmluZ1dpZHRoKG1vZGlmaWVyID8gYCR7bW9kaWZpZXJ9ICR7Z2V0VGV4dCh2WzBdKX1gIDogZ2V0VGV4dCh2WzBdKSkgKyBnZXRJbmRlbnRhdGlvbih2WzBdKSwgd2lkdGgpO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHRoZVdyYXApXG4gICAgICAgICAgICB3aWR0aCA9IE1hdGgubWluKHdpZHRoLCBwYXJzZUludCgodGhlV3JhcCAqIDAuNSkudG9TdHJpbmcoKSwgMTApKTtcbiAgICAgICAgcmV0dXJuIHdpZHRoO1xuICAgIH1cbiAgICBmdW5jdGlvbiBub3JtYWxpemVBbGlhc2VzKCkge1xuICAgICAgICBjb25zdCBkZW1hbmRlZE9wdGlvbnMgPSB5YXJncy5nZXREZW1hbmRlZE9wdGlvbnMoKTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHlhcmdzLmdldE9wdGlvbnMoKTtcbiAgICAgICAgKE9iamVjdC5rZXlzKG9wdGlvbnMuYWxpYXMpIHx8IFtdKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICBvcHRpb25zLmFsaWFzW2tleV0uZm9yRWFjaChhbGlhcyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGRlc2NyaXB0aW9uc1thbGlhc10pXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuZGVzY3JpYmUoa2V5LCBkZXNjcmlwdGlvbnNbYWxpYXNdKTtcbiAgICAgICAgICAgICAgICBpZiAoYWxpYXMgaW4gZGVtYW5kZWRPcHRpb25zKVxuICAgICAgICAgICAgICAgICAgICB5YXJncy5kZW1hbmRPcHRpb24oa2V5LCBkZW1hbmRlZE9wdGlvbnNbYWxpYXNdKTtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5ib29sZWFuLmluY2x1ZGVzKGFsaWFzKSlcbiAgICAgICAgICAgICAgICAgICAgeWFyZ3MuYm9vbGVhbihrZXkpO1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmNvdW50LmluY2x1ZGVzKGFsaWFzKSlcbiAgICAgICAgICAgICAgICAgICAgeWFyZ3MuY291bnQoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5zdHJpbmcuaW5jbHVkZXMoYWxpYXMpKVxuICAgICAgICAgICAgICAgICAgICB5YXJncy5zdHJpbmcoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5ub3JtYWxpemUuaW5jbHVkZXMoYWxpYXMpKVxuICAgICAgICAgICAgICAgICAgICB5YXJncy5ub3JtYWxpemUoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5hcnJheS5pbmNsdWRlcyhhbGlhcykpXG4gICAgICAgICAgICAgICAgICAgIHlhcmdzLmFycmF5KGtleSk7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMubnVtYmVyLmluY2x1ZGVzKGFsaWFzKSlcbiAgICAgICAgICAgICAgICAgICAgeWFyZ3MubnVtYmVyKGtleSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGxldCBjYWNoZWRIZWxwTWVzc2FnZTtcbiAgICBzZWxmLmNhY2hlSGVscE1lc3NhZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNhY2hlZEhlbHBNZXNzYWdlID0gdGhpcy5oZWxwKCk7XG4gICAgfTtcbiAgICBzZWxmLmNsZWFyQ2FjaGVkSGVscE1lc3NhZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNhY2hlZEhlbHBNZXNzYWdlID0gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgc2VsZi5oYXNDYWNoZWRIZWxwTWVzc2FnZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICEhY2FjaGVkSGVscE1lc3NhZ2U7XG4gICAgfTtcbiAgICBmdW5jdGlvbiBhZGRVbmdyb3VwZWRLZXlzKGtleXMsIGFsaWFzZXMsIGdyb3VwcywgZGVmYXVsdEdyb3VwKSB7XG4gICAgICAgIGxldCBncm91cGVkS2V5cyA9IFtdO1xuICAgICAgICBsZXQgdG9DaGVjayA9IG51bGw7XG4gICAgICAgIE9iamVjdC5rZXlzKGdyb3VwcykuZm9yRWFjaChncm91cCA9PiB7XG4gICAgICAgICAgICBncm91cGVkS2V5cyA9IGdyb3VwZWRLZXlzLmNvbmNhdChncm91cHNbZ3JvdXBdKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGtleXMuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgdG9DaGVjayA9IFtrZXldLmNvbmNhdChhbGlhc2VzW2tleV0pO1xuICAgICAgICAgICAgaWYgKCF0b0NoZWNrLnNvbWUoayA9PiBncm91cGVkS2V5cy5pbmRleE9mKGspICE9PSAtMSkpIHtcbiAgICAgICAgICAgICAgICBncm91cHNbZGVmYXVsdEdyb3VwXS5wdXNoKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZ3JvdXBlZEtleXM7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGZpbHRlckhpZGRlbk9wdGlvbnMoa2V5KSB7XG4gICAgICAgIHJldHVybiAoeWFyZ3MuZ2V0T3B0aW9ucygpLmhpZGRlbk9wdGlvbnMuaW5kZXhPZihrZXkpIDwgMCB8fFxuICAgICAgICAgICAgeWFyZ3MucGFyc2VkLmFyZ3ZbeWFyZ3MuZ2V0T3B0aW9ucygpLnNob3dIaWRkZW5PcHRdKTtcbiAgICB9XG4gICAgc2VsZi5zaG93SGVscCA9IChsZXZlbCkgPT4ge1xuICAgICAgICBjb25zdCBsb2dnZXIgPSB5YXJncy5nZXRJbnRlcm5hbE1ldGhvZHMoKS5nZXRMb2dnZXJJbnN0YW5jZSgpO1xuICAgICAgICBpZiAoIWxldmVsKVxuICAgICAgICAgICAgbGV2ZWwgPSAnZXJyb3InO1xuICAgICAgICBjb25zdCBlbWl0ID0gdHlwZW9mIGxldmVsID09PSAnZnVuY3Rpb24nID8gbGV2ZWwgOiBsb2dnZXJbbGV2ZWxdO1xuICAgICAgICBlbWl0KHNlbGYuaGVscCgpKTtcbiAgICB9O1xuICAgIHNlbGYuZnVuY3Rpb25EZXNjcmlwdGlvbiA9IGZuID0+IHtcbiAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSBmbi5uYW1lXG4gICAgICAgICAgICA/IHNoaW0uUGFyc2VyLmRlY2FtZWxpemUoZm4ubmFtZSwgJy0nKVxuICAgICAgICAgICAgOiBfXygnZ2VuZXJhdGVkLXZhbHVlJyk7XG4gICAgICAgIHJldHVybiBbJygnLCBkZXNjcmlwdGlvbiwgJyknXS5qb2luKCcnKTtcbiAgICB9O1xuICAgIHNlbGYuc3RyaW5naWZpZWRWYWx1ZXMgPSBmdW5jdGlvbiBzdHJpbmdpZmllZFZhbHVlcyh2YWx1ZXMsIHNlcGFyYXRvcikge1xuICAgICAgICBsZXQgc3RyaW5nID0gJyc7XG4gICAgICAgIGNvbnN0IHNlcCA9IHNlcGFyYXRvciB8fCAnLCAnO1xuICAgICAgICBjb25zdCBhcnJheSA9IFtdLmNvbmNhdCh2YWx1ZXMpO1xuICAgICAgICBpZiAoIXZhbHVlcyB8fCAhYXJyYXkubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIHN0cmluZztcbiAgICAgICAgYXJyYXkuZm9yRWFjaCh2YWx1ZSA9PiB7XG4gICAgICAgICAgICBpZiAoc3RyaW5nLmxlbmd0aClcbiAgICAgICAgICAgICAgICBzdHJpbmcgKz0gc2VwO1xuICAgICAgICAgICAgc3RyaW5nICs9IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBzdHJpbmc7XG4gICAgfTtcbiAgICBmdW5jdGlvbiBkZWZhdWx0U3RyaW5nKHZhbHVlLCBkZWZhdWx0RGVzY3JpcHRpb24pIHtcbiAgICAgICAgbGV0IHN0cmluZyA9IGBbJHtfXygnZGVmYXVsdDonKX0gYDtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgIWRlZmF1bHREZXNjcmlwdGlvbilcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBpZiAoZGVmYXVsdERlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgICBzdHJpbmcgKz0gZGVmYXVsdERlc2NyaXB0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICAgICAgICAgICAgICBzdHJpbmcgKz0gYFwiJHt2YWx1ZX1cImA7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgICAgICAgICAgICAgIHN0cmluZyArPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHN0cmluZyArPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYCR7c3RyaW5nfV1gO1xuICAgIH1cbiAgICBmdW5jdGlvbiB3aW5kb3dXaWR0aCgpIHtcbiAgICAgICAgY29uc3QgbWF4V2lkdGggPSA4MDtcbiAgICAgICAgaWYgKHNoaW0ucHJvY2Vzcy5zdGRDb2x1bW5zKSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5taW4obWF4V2lkdGgsIHNoaW0ucHJvY2Vzcy5zdGRDb2x1bW5zKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBtYXhXaWR0aDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsZXQgdmVyc2lvbiA9IG51bGw7XG4gICAgc2VsZi52ZXJzaW9uID0gdmVyID0+IHtcbiAgICAgICAgdmVyc2lvbiA9IHZlcjtcbiAgICB9O1xuICAgIHNlbGYuc2hvd1ZlcnNpb24gPSBsZXZlbCA9PiB7XG4gICAgICAgIGNvbnN0IGxvZ2dlciA9IHlhcmdzLmdldEludGVybmFsTWV0aG9kcygpLmdldExvZ2dlckluc3RhbmNlKCk7XG4gICAgICAgIGlmICghbGV2ZWwpXG4gICAgICAgICAgICBsZXZlbCA9ICdlcnJvcic7XG4gICAgICAgIGNvbnN0IGVtaXQgPSB0eXBlb2YgbGV2ZWwgPT09ICdmdW5jdGlvbicgPyBsZXZlbCA6IGxvZ2dlcltsZXZlbF07XG4gICAgICAgIGVtaXQodmVyc2lvbik7XG4gICAgfTtcbiAgICBzZWxmLnJlc2V0ID0gZnVuY3Rpb24gcmVzZXQobG9jYWxMb29rdXApIHtcbiAgICAgICAgZmFpbE1lc3NhZ2UgPSBudWxsO1xuICAgICAgICBmYWlsdXJlT3V0cHV0ID0gZmFsc2U7XG4gICAgICAgIHVzYWdlcyA9IFtdO1xuICAgICAgICB1c2FnZURpc2FibGVkID0gZmFsc2U7XG4gICAgICAgIGVwaWxvZ3MgPSBbXTtcbiAgICAgICAgZXhhbXBsZXMgPSBbXTtcbiAgICAgICAgY29tbWFuZHMgPSBbXTtcbiAgICAgICAgZGVzY3JpcHRpb25zID0gb2JqRmlsdGVyKGRlc2NyaXB0aW9ucywgayA9PiAhbG9jYWxMb29rdXBba10pO1xuICAgICAgICByZXR1cm4gc2VsZjtcbiAgICB9O1xuICAgIGNvbnN0IGZyb3plbnMgPSBbXTtcbiAgICBzZWxmLmZyZWV6ZSA9IGZ1bmN0aW9uIGZyZWV6ZSgpIHtcbiAgICAgICAgZnJvemVucy5wdXNoKHtcbiAgICAgICAgICAgIGZhaWxNZXNzYWdlLFxuICAgICAgICAgICAgZmFpbHVyZU91dHB1dCxcbiAgICAgICAgICAgIHVzYWdlcyxcbiAgICAgICAgICAgIHVzYWdlRGlzYWJsZWQsXG4gICAgICAgICAgICBlcGlsb2dzLFxuICAgICAgICAgICAgZXhhbXBsZXMsXG4gICAgICAgICAgICBjb21tYW5kcyxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9ucyxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBzZWxmLnVuZnJlZXplID0gZnVuY3Rpb24gdW5mcmVlemUoZGVmYXVsdENvbW1hbmQgPSBmYWxzZSkge1xuICAgICAgICBjb25zdCBmcm96ZW4gPSBmcm96ZW5zLnBvcCgpO1xuICAgICAgICBpZiAoIWZyb3plbilcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgaWYgKGRlZmF1bHRDb21tYW5kKSB7XG4gICAgICAgICAgICBkZXNjcmlwdGlvbnMgPSB7IC4uLmZyb3plbi5kZXNjcmlwdGlvbnMsIC4uLmRlc2NyaXB0aW9ucyB9O1xuICAgICAgICAgICAgY29tbWFuZHMgPSBbLi4uZnJvemVuLmNvbW1hbmRzLCAuLi5jb21tYW5kc107XG4gICAgICAgICAgICB1c2FnZXMgPSBbLi4uZnJvemVuLnVzYWdlcywgLi4udXNhZ2VzXTtcbiAgICAgICAgICAgIGV4YW1wbGVzID0gWy4uLmZyb3plbi5leGFtcGxlcywgLi4uZXhhbXBsZXNdO1xuICAgICAgICAgICAgZXBpbG9ncyA9IFsuLi5mcm96ZW4uZXBpbG9ncywgLi4uZXBpbG9nc107XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAoe1xuICAgICAgICAgICAgICAgIGZhaWxNZXNzYWdlLFxuICAgICAgICAgICAgICAgIGZhaWx1cmVPdXRwdXQsXG4gICAgICAgICAgICAgICAgdXNhZ2VzLFxuICAgICAgICAgICAgICAgIHVzYWdlRGlzYWJsZWQsXG4gICAgICAgICAgICAgICAgZXBpbG9ncyxcbiAgICAgICAgICAgICAgICBleGFtcGxlcyxcbiAgICAgICAgICAgICAgICBjb21tYW5kcyxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbnMsXG4gICAgICAgICAgICB9ID0gZnJvemVuKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIHNlbGY7XG59XG5mdW5jdGlvbiBpc0luZGVudGVkVGV4dCh0ZXh0KSB7XG4gICAgcmV0dXJuIHR5cGVvZiB0ZXh0ID09PSAnb2JqZWN0Jztcbn1cbmZ1bmN0aW9uIGFkZEluZGVudGF0aW9uKHRleHQsIGluZGVudCkge1xuICAgIHJldHVybiBpc0luZGVudGVkVGV4dCh0ZXh0KVxuICAgICAgICA/IHsgdGV4dDogdGV4dC50ZXh0LCBpbmRlbnRhdGlvbjogdGV4dC5pbmRlbnRhdGlvbiArIGluZGVudCB9XG4gICAgICAgIDogeyB0ZXh0LCBpbmRlbnRhdGlvbjogaW5kZW50IH07XG59XG5mdW5jdGlvbiBnZXRJbmRlbnRhdGlvbih0ZXh0KSB7XG4gICAgcmV0dXJuIGlzSW5kZW50ZWRUZXh0KHRleHQpID8gdGV4dC5pbmRlbnRhdGlvbiA6IDA7XG59XG5mdW5jdGlvbiBnZXRUZXh0KHRleHQpIHtcbiAgICByZXR1cm4gaXNJbmRlbnRlZFRleHQodGV4dCkgPyB0ZXh0LnRleHQgOiB0ZXh0O1xufVxuIiwiaW1wb3J0IHsgaXNDb21tYW5kQnVpbGRlckNhbGxiYWNrIH0gZnJvbSAnLi9jb21tYW5kLmpzJztcbmltcG9ydCB7IGFzc2VydE5vdFN0cmljdEVxdWFsIH0gZnJvbSAnLi90eXBpbmdzL2NvbW1vbi10eXBlcy5qcyc7XG5pbXBvcnQgKiBhcyB0ZW1wbGF0ZXMgZnJvbSAnLi9jb21wbGV0aW9uLXRlbXBsYXRlcy5qcyc7XG5pbXBvcnQgeyBpc1Byb21pc2UgfSBmcm9tICcuL3V0aWxzL2lzLXByb21pc2UuanMnO1xuaW1wb3J0IHsgcGFyc2VDb21tYW5kIH0gZnJvbSAnLi9wYXJzZS1jb21tYW5kLmpzJztcbmV4cG9ydCBjbGFzcyBDb21wbGV0aW9uIHtcbiAgICBjb25zdHJ1Y3Rvcih5YXJncywgdXNhZ2UsIGNvbW1hbmQsIHNoaW0pIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgICAgIHRoaXMueWFyZ3MgPSB5YXJncztcbiAgICAgICAgdGhpcy51c2FnZSA9IHVzYWdlO1xuICAgICAgICB0aGlzLmNvbW1hbmQgPSBjb21tYW5kO1xuICAgICAgICB0aGlzLnNoaW0gPSBzaGltO1xuICAgICAgICB0aGlzLmNvbXBsZXRpb25LZXkgPSAnZ2V0LXlhcmdzLWNvbXBsZXRpb25zJztcbiAgICAgICAgdGhpcy5hbGlhc2VzID0gbnVsbDtcbiAgICAgICAgdGhpcy5jdXN0b21Db21wbGV0aW9uRnVuY3Rpb24gPSBudWxsO1xuICAgICAgICB0aGlzLmluZGV4QWZ0ZXJMYXN0UmVzZXQgPSAwO1xuICAgICAgICB0aGlzLnpzaFNoZWxsID1cbiAgICAgICAgICAgIChfYyA9ICgoKF9hID0gdGhpcy5zaGltLmdldEVudignU0hFTEwnKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmluY2x1ZGVzKCd6c2gnKSkgfHxcbiAgICAgICAgICAgICAgICAoKF9iID0gdGhpcy5zaGltLmdldEVudignWlNIX05BTUUnKSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmluY2x1ZGVzKCd6c2gnKSkpKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBmYWxzZTtcbiAgICB9XG4gICAgZGVmYXVsdENvbXBsZXRpb24oYXJncywgYXJndiwgY3VycmVudCwgZG9uZSkge1xuICAgICAgICBjb25zdCBoYW5kbGVycyA9IHRoaXMuY29tbWFuZC5nZXRDb21tYW5kSGFuZGxlcnMoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gYXJncy5sZW5ndGg7IGkgPCBpaTsgKytpKSB7XG4gICAgICAgICAgICBpZiAoaGFuZGxlcnNbYXJnc1tpXV0gJiYgaGFuZGxlcnNbYXJnc1tpXV0uYnVpbGRlcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBoYW5kbGVyc1thcmdzW2ldXS5idWlsZGVyO1xuICAgICAgICAgICAgICAgIGlmIChpc0NvbW1hbmRCdWlsZGVyQ2FsbGJhY2soYnVpbGRlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmRleEFmdGVyTGFzdFJlc2V0ID0gaSArIDE7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHkgPSB0aGlzLnlhcmdzLmdldEludGVybmFsTWV0aG9kcygpLnJlc2V0KCk7XG4gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIoeSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB5LmFyZ3Y7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbXBsZXRpb25zID0gW107XG4gICAgICAgIHRoaXMuY29tbWFuZENvbXBsZXRpb25zKGNvbXBsZXRpb25zLCBhcmdzLCBjdXJyZW50KTtcbiAgICAgICAgdGhpcy5vcHRpb25Db21wbGV0aW9ucyhjb21wbGV0aW9ucywgYXJncywgYXJndiwgY3VycmVudCk7XG4gICAgICAgIHRoaXMuY2hvaWNlc0Zyb21PcHRpb25zQ29tcGxldGlvbnMoY29tcGxldGlvbnMsIGFyZ3MsIGFyZ3YsIGN1cnJlbnQpO1xuICAgICAgICB0aGlzLmNob2ljZXNGcm9tUG9zaXRpb25hbHNDb21wbGV0aW9ucyhjb21wbGV0aW9ucywgYXJncywgYXJndiwgY3VycmVudCk7XG4gICAgICAgIGRvbmUobnVsbCwgY29tcGxldGlvbnMpO1xuICAgIH1cbiAgICBjb21tYW5kQ29tcGxldGlvbnMoY29tcGxldGlvbnMsIGFyZ3MsIGN1cnJlbnQpIHtcbiAgICAgICAgY29uc3QgcGFyZW50Q29tbWFuZHMgPSB0aGlzLnlhcmdzXG4gICAgICAgICAgICAuZ2V0SW50ZXJuYWxNZXRob2RzKClcbiAgICAgICAgICAgIC5nZXRDb250ZXh0KCkuY29tbWFuZHM7XG4gICAgICAgIGlmICghY3VycmVudC5tYXRjaCgvXi0vKSAmJlxuICAgICAgICAgICAgcGFyZW50Q29tbWFuZHNbcGFyZW50Q29tbWFuZHMubGVuZ3RoIC0gMV0gIT09IGN1cnJlbnQgJiZcbiAgICAgICAgICAgICF0aGlzLnByZXZpb3VzQXJnSGFzQ2hvaWNlcyhhcmdzKSkge1xuICAgICAgICAgICAgdGhpcy51c2FnZS5nZXRDb21tYW5kcygpLmZvckVhY2godXNhZ2VDb21tYW5kID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb21tYW5kTmFtZSA9IHBhcnNlQ29tbWFuZCh1c2FnZUNvbW1hbmRbMF0pLmNtZDtcbiAgICAgICAgICAgICAgICBpZiAoYXJncy5pbmRleE9mKGNvbW1hbmROYW1lKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnpzaFNoZWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9ucy5wdXNoKGNvbW1hbmROYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlc2MgPSB1c2FnZUNvbW1hbmRbMV0gfHwgJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9ucy5wdXNoKGNvbW1hbmROYW1lLnJlcGxhY2UoLzovZywgJ1xcXFw6JykgKyAnOicgKyBkZXNjKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIG9wdGlvbkNvbXBsZXRpb25zKGNvbXBsZXRpb25zLCBhcmdzLCBhcmd2LCBjdXJyZW50KSB7XG4gICAgICAgIGlmICgoY3VycmVudC5tYXRjaCgvXi0vKSB8fCAoY3VycmVudCA9PT0gJycgJiYgY29tcGxldGlvbnMubGVuZ3RoID09PSAwKSkgJiZcbiAgICAgICAgICAgICF0aGlzLnByZXZpb3VzQXJnSGFzQ2hvaWNlcyhhcmdzKSkge1xuICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMueWFyZ3MuZ2V0T3B0aW9ucygpO1xuICAgICAgICAgICAgY29uc3QgcG9zaXRpb25hbEtleXMgPSB0aGlzLnlhcmdzLmdldEdyb3VwcygpW3RoaXMudXNhZ2UuZ2V0UG9zaXRpb25hbEdyb3VwTmFtZSgpXSB8fCBbXTtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKG9wdGlvbnMua2V5KS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmVnYWJsZSA9ICEhb3B0aW9ucy5jb25maWd1cmF0aW9uWydib29sZWFuLW5lZ2F0aW9uJ10gJiZcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5ib29sZWFuLmluY2x1ZGVzKGtleSk7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNQb3NpdGlvbmFsS2V5ID0gcG9zaXRpb25hbEtleXMuaW5jbHVkZXMoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAoIWlzUG9zaXRpb25hbEtleSAmJlxuICAgICAgICAgICAgICAgICAgICAhb3B0aW9ucy5oaWRkZW5PcHRpb25zLmluY2x1ZGVzKGtleSkgJiZcbiAgICAgICAgICAgICAgICAgICAgIXRoaXMuYXJnc0NvbnRhaW5LZXkoYXJncywga2V5LCBuZWdhYmxlKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBsZXRlT3B0aW9uS2V5KGtleSwgY29tcGxldGlvbnMsIGN1cnJlbnQsIG5lZ2FibGUgJiYgISFvcHRpb25zLmRlZmF1bHRba2V5XSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2hvaWNlc0Zyb21PcHRpb25zQ29tcGxldGlvbnMoY29tcGxldGlvbnMsIGFyZ3MsIGFyZ3YsIGN1cnJlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMucHJldmlvdXNBcmdIYXNDaG9pY2VzKGFyZ3MpKSB7XG4gICAgICAgICAgICBjb25zdCBjaG9pY2VzID0gdGhpcy5nZXRQcmV2aW91c0FyZ0Nob2ljZXMoYXJncyk7XG4gICAgICAgICAgICBpZiAoY2hvaWNlcyAmJiBjaG9pY2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBjb21wbGV0aW9ucy5wdXNoKC4uLmNob2ljZXMubWFwKGMgPT4gYy5yZXBsYWNlKC86L2csICdcXFxcOicpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2hvaWNlc0Zyb21Qb3NpdGlvbmFsc0NvbXBsZXRpb25zKGNvbXBsZXRpb25zLCBhcmdzLCBhcmd2LCBjdXJyZW50KSB7XG4gICAgICAgIGlmIChjdXJyZW50ID09PSAnJyAmJlxuICAgICAgICAgICAgY29tcGxldGlvbnMubGVuZ3RoID4gMCAmJlxuICAgICAgICAgICAgdGhpcy5wcmV2aW91c0FyZ0hhc0Nob2ljZXMoYXJncykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwb3NpdGlvbmFsS2V5cyA9IHRoaXMueWFyZ3MuZ2V0R3JvdXBzKClbdGhpcy51c2FnZS5nZXRQb3NpdGlvbmFsR3JvdXBOYW1lKCldIHx8IFtdO1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBNYXRoLm1heCh0aGlzLmluZGV4QWZ0ZXJMYXN0UmVzZXQsIHRoaXMueWFyZ3MuZ2V0SW50ZXJuYWxNZXRob2RzKCkuZ2V0Q29udGV4dCgpLmNvbW1hbmRzLmxlbmd0aCArXG4gICAgICAgICAgICAxKTtcbiAgICAgICAgY29uc3QgcG9zaXRpb25hbEtleSA9IHBvc2l0aW9uYWxLZXlzW2FyZ3YuXy5sZW5ndGggLSBvZmZzZXQgLSAxXTtcbiAgICAgICAgaWYgKCFwb3NpdGlvbmFsS2V5KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2hvaWNlcyA9IHRoaXMueWFyZ3MuZ2V0T3B0aW9ucygpLmNob2ljZXNbcG9zaXRpb25hbEtleV0gfHwgW107XG4gICAgICAgIGZvciAoY29uc3QgY2hvaWNlIG9mIGNob2ljZXMpIHtcbiAgICAgICAgICAgIGlmIChjaG9pY2Uuc3RhcnRzV2l0aChjdXJyZW50KSkge1xuICAgICAgICAgICAgICAgIGNvbXBsZXRpb25zLnB1c2goY2hvaWNlLnJlcGxhY2UoLzovZywgJ1xcXFw6JykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGdldFByZXZpb3VzQXJnQ2hvaWNlcyhhcmdzKSB7XG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA8IDEpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGxldCBwcmV2aW91c0FyZyA9IGFyZ3NbYXJncy5sZW5ndGggLSAxXTtcbiAgICAgICAgbGV0IGZpbHRlciA9ICcnO1xuICAgICAgICBpZiAoIXByZXZpb3VzQXJnLnN0YXJ0c1dpdGgoJy0nKSAmJiBhcmdzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIGZpbHRlciA9IHByZXZpb3VzQXJnO1xuICAgICAgICAgICAgcHJldmlvdXNBcmcgPSBhcmdzW2FyZ3MubGVuZ3RoIC0gMl07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFwcmV2aW91c0FyZy5zdGFydHNXaXRoKCctJykpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNvbnN0IHByZXZpb3VzQXJnS2V5ID0gcHJldmlvdXNBcmcucmVwbGFjZSgvXi0rLywgJycpO1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy55YXJncy5nZXRPcHRpb25zKCk7XG4gICAgICAgIGNvbnN0IHBvc3NpYmxlQWxpYXNlcyA9IFtcbiAgICAgICAgICAgIHByZXZpb3VzQXJnS2V5LFxuICAgICAgICAgICAgLi4uKHRoaXMueWFyZ3MuZ2V0QWxpYXNlcygpW3ByZXZpb3VzQXJnS2V5XSB8fCBbXSksXG4gICAgICAgIF07XG4gICAgICAgIGxldCBjaG9pY2VzO1xuICAgICAgICBmb3IgKGNvbnN0IHBvc3NpYmxlQWxpYXMgb2YgcG9zc2libGVBbGlhc2VzKSB7XG4gICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9wdGlvbnMua2V5LCBwb3NzaWJsZUFsaWFzKSAmJlxuICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkob3B0aW9ucy5jaG9pY2VzW3Bvc3NpYmxlQWxpYXNdKSkge1xuICAgICAgICAgICAgICAgIGNob2ljZXMgPSBvcHRpb25zLmNob2ljZXNbcG9zc2libGVBbGlhc107XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNob2ljZXMpIHtcbiAgICAgICAgICAgIHJldHVybiBjaG9pY2VzLmZpbHRlcihjaG9pY2UgPT4gIWZpbHRlciB8fCBjaG9pY2Uuc3RhcnRzV2l0aChmaWx0ZXIpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcmV2aW91c0FyZ0hhc0Nob2ljZXMoYXJncykge1xuICAgICAgICBjb25zdCBjaG9pY2VzID0gdGhpcy5nZXRQcmV2aW91c0FyZ0Nob2ljZXMoYXJncyk7XG4gICAgICAgIHJldHVybiBjaG9pY2VzICE9PSB1bmRlZmluZWQgJiYgY2hvaWNlcy5sZW5ndGggPiAwO1xuICAgIH1cbiAgICBhcmdzQ29udGFpbktleShhcmdzLCBrZXksIG5lZ2FibGUpIHtcbiAgICAgICAgY29uc3QgYXJnc0NvbnRhaW5zID0gKHMpID0+IGFyZ3MuaW5kZXhPZigoL15bXjAtOV0kLy50ZXN0KHMpID8gJy0nIDogJy0tJykgKyBzKSAhPT0gLTE7XG4gICAgICAgIGlmIChhcmdzQ29udGFpbnMoa2V5KSlcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAobmVnYWJsZSAmJiBhcmdzQ29udGFpbnMoYG5vLSR7a2V5fWApKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmICh0aGlzLmFsaWFzZXMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgYWxpYXMgb2YgdGhpcy5hbGlhc2VzW2tleV0pIHtcbiAgICAgICAgICAgICAgICBpZiAoYXJnc0NvbnRhaW5zKGFsaWFzKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb21wbGV0ZU9wdGlvbktleShrZXksIGNvbXBsZXRpb25zLCBjdXJyZW50LCBuZWdhYmxlKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZDtcbiAgICAgICAgbGV0IGtleVdpdGhEZXNjID0ga2V5O1xuICAgICAgICBpZiAodGhpcy56c2hTaGVsbCkge1xuICAgICAgICAgICAgY29uc3QgZGVzY3MgPSB0aGlzLnVzYWdlLmdldERlc2NyaXB0aW9ucygpO1xuICAgICAgICAgICAgY29uc3QgYWxpYXNLZXkgPSAoX2IgPSAoX2EgPSB0aGlzID09PSBudWxsIHx8IHRoaXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRoaXMuYWxpYXNlcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hW2tleV0pID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5maW5kKGFsaWFzID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBkZXNjID0gZGVzY3NbYWxpYXNdO1xuICAgICAgICAgICAgICAgIHJldHVybiB0eXBlb2YgZGVzYyA9PT0gJ3N0cmluZycgJiYgZGVzYy5sZW5ndGggPiAwO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBkZXNjRnJvbUFsaWFzID0gYWxpYXNLZXkgPyBkZXNjc1thbGlhc0tleV0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBkZXNjID0gKF9kID0gKF9jID0gZGVzY3Nba2V5XSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogZGVzY0Zyb21BbGlhcykgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogJyc7XG4gICAgICAgICAgICBrZXlXaXRoRGVzYyA9IGAke2tleS5yZXBsYWNlKC86L2csICdcXFxcOicpfToke2Rlc2NcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgnX195YXJnc1N0cmluZ19fOicsICcnKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8oXFxyXFxufFxcbnxcXHIpL2dtLCAnICcpfWA7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3RhcnRzQnlUd29EYXNoZXMgPSAocykgPT4gL14tLS8udGVzdChzKTtcbiAgICAgICAgY29uc3QgaXNTaG9ydE9wdGlvbiA9IChzKSA9PiAvXlteMC05XSQvLnRlc3Qocyk7XG4gICAgICAgIGNvbnN0IGRhc2hlcyA9ICFzdGFydHNCeVR3b0Rhc2hlcyhjdXJyZW50KSAmJiBpc1Nob3J0T3B0aW9uKGtleSkgPyAnLScgOiAnLS0nO1xuICAgICAgICBjb21wbGV0aW9ucy5wdXNoKGRhc2hlcyArIGtleVdpdGhEZXNjKTtcbiAgICAgICAgaWYgKG5lZ2FibGUpIHtcbiAgICAgICAgICAgIGNvbXBsZXRpb25zLnB1c2goZGFzaGVzICsgJ25vLScgKyBrZXlXaXRoRGVzYyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY3VzdG9tQ29tcGxldGlvbihhcmdzLCBhcmd2LCBjdXJyZW50LCBkb25lKSB7XG4gICAgICAgIGFzc2VydE5vdFN0cmljdEVxdWFsKHRoaXMuY3VzdG9tQ29tcGxldGlvbkZ1bmN0aW9uLCBudWxsLCB0aGlzLnNoaW0pO1xuICAgICAgICBpZiAoaXNTeW5jQ29tcGxldGlvbkZ1bmN0aW9uKHRoaXMuY3VzdG9tQ29tcGxldGlvbkZ1bmN0aW9uKSkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5jdXN0b21Db21wbGV0aW9uRnVuY3Rpb24oY3VycmVudCwgYXJndik7XG4gICAgICAgICAgICBpZiAoaXNQcm9taXNlKHJlc3VsdCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICAgICAgICAgICAgICAgIC50aGVuKGxpc3QgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNoaW0ucHJvY2Vzcy5uZXh0VGljaygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb25lKG51bGwsIGxpc3QpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaGltLnByb2Nlc3MubmV4dFRpY2soKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZG9uZShlcnIsIHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGRvbmUobnVsbCwgcmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc0ZhbGxiYWNrQ29tcGxldGlvbkZ1bmN0aW9uKHRoaXMuY3VzdG9tQ29tcGxldGlvbkZ1bmN0aW9uKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3VzdG9tQ29tcGxldGlvbkZ1bmN0aW9uKGN1cnJlbnQsIGFyZ3YsIChvbkNvbXBsZXRlZCA9IGRvbmUpID0+IHRoaXMuZGVmYXVsdENvbXBsZXRpb24oYXJncywgYXJndiwgY3VycmVudCwgb25Db21wbGV0ZWQpLCBjb21wbGV0aW9ucyA9PiB7XG4gICAgICAgICAgICAgICAgZG9uZShudWxsLCBjb21wbGV0aW9ucyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmN1c3RvbUNvbXBsZXRpb25GdW5jdGlvbihjdXJyZW50LCBhcmd2LCBjb21wbGV0aW9ucyA9PiB7XG4gICAgICAgICAgICAgICAgZG9uZShudWxsLCBjb21wbGV0aW9ucyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXRDb21wbGV0aW9uKGFyZ3MsIGRvbmUpIHtcbiAgICAgICAgY29uc3QgY3VycmVudCA9IGFyZ3MubGVuZ3RoID8gYXJnc1thcmdzLmxlbmd0aCAtIDFdIDogJyc7XG4gICAgICAgIGNvbnN0IGFyZ3YgPSB0aGlzLnlhcmdzLnBhcnNlKGFyZ3MsIHRydWUpO1xuICAgICAgICBjb25zdCBjb21wbGV0aW9uRnVuY3Rpb24gPSB0aGlzLmN1c3RvbUNvbXBsZXRpb25GdW5jdGlvblxuICAgICAgICAgICAgPyAoYXJndikgPT4gdGhpcy5jdXN0b21Db21wbGV0aW9uKGFyZ3MsIGFyZ3YsIGN1cnJlbnQsIGRvbmUpXG4gICAgICAgICAgICA6IChhcmd2KSA9PiB0aGlzLmRlZmF1bHRDb21wbGV0aW9uKGFyZ3MsIGFyZ3YsIGN1cnJlbnQsIGRvbmUpO1xuICAgICAgICByZXR1cm4gaXNQcm9taXNlKGFyZ3YpXG4gICAgICAgICAgICA/IGFyZ3YudGhlbihjb21wbGV0aW9uRnVuY3Rpb24pXG4gICAgICAgICAgICA6IGNvbXBsZXRpb25GdW5jdGlvbihhcmd2KTtcbiAgICB9XG4gICAgZ2VuZXJhdGVDb21wbGV0aW9uU2NyaXB0KCQwLCBjbWQpIHtcbiAgICAgICAgbGV0IHNjcmlwdCA9IHRoaXMuenNoU2hlbGxcbiAgICAgICAgICAgID8gdGVtcGxhdGVzLmNvbXBsZXRpb25ac2hUZW1wbGF0ZVxuICAgICAgICAgICAgOiB0ZW1wbGF0ZXMuY29tcGxldGlvblNoVGVtcGxhdGU7XG4gICAgICAgIGNvbnN0IG5hbWUgPSB0aGlzLnNoaW0ucGF0aC5iYXNlbmFtZSgkMCk7XG4gICAgICAgIGlmICgkMC5tYXRjaCgvXFwuanMkLykpXG4gICAgICAgICAgICAkMCA9IGAuLyR7JDB9YDtcbiAgICAgICAgc2NyaXB0ID0gc2NyaXB0LnJlcGxhY2UoL3t7YXBwX25hbWV9fS9nLCBuYW1lKTtcbiAgICAgICAgc2NyaXB0ID0gc2NyaXB0LnJlcGxhY2UoL3t7Y29tcGxldGlvbl9jb21tYW5kfX0vZywgY21kKTtcbiAgICAgICAgcmV0dXJuIHNjcmlwdC5yZXBsYWNlKC97e2FwcF9wYXRofX0vZywgJDApO1xuICAgIH1cbiAgICByZWdpc3RlckZ1bmN0aW9uKGZuKSB7XG4gICAgICAgIHRoaXMuY3VzdG9tQ29tcGxldGlvbkZ1bmN0aW9uID0gZm47XG4gICAgfVxuICAgIHNldFBhcnNlZChwYXJzZWQpIHtcbiAgICAgICAgdGhpcy5hbGlhc2VzID0gcGFyc2VkLmFsaWFzZXM7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBsZXRpb24oeWFyZ3MsIHVzYWdlLCBjb21tYW5kLCBzaGltKSB7XG4gICAgcmV0dXJuIG5ldyBDb21wbGV0aW9uKHlhcmdzLCB1c2FnZSwgY29tbWFuZCwgc2hpbSk7XG59XG5mdW5jdGlvbiBpc1N5bmNDb21wbGV0aW9uRnVuY3Rpb24oY29tcGxldGlvbkZ1bmN0aW9uKSB7XG4gICAgcmV0dXJuIGNvbXBsZXRpb25GdW5jdGlvbi5sZW5ndGggPCAzO1xufVxuZnVuY3Rpb24gaXNGYWxsYmFja0NvbXBsZXRpb25GdW5jdGlvbihjb21wbGV0aW9uRnVuY3Rpb24pIHtcbiAgICByZXR1cm4gY29tcGxldGlvbkZ1bmN0aW9uLmxlbmd0aCA+IDM7XG59XG4iLCJleHBvcnQgY29uc3QgY29tcGxldGlvblNoVGVtcGxhdGUgPSBgIyMjLWJlZ2luLXt7YXBwX25hbWV9fS1jb21wbGV0aW9ucy0jIyNcbiNcbiMgeWFyZ3MgY29tbWFuZCBjb21wbGV0aW9uIHNjcmlwdFxuI1xuIyBJbnN0YWxsYXRpb246IHt7YXBwX3BhdGh9fSB7e2NvbXBsZXRpb25fY29tbWFuZH19ID4+IH4vLmJhc2hyY1xuIyAgICBvciB7e2FwcF9wYXRofX0ge3tjb21wbGV0aW9uX2NvbW1hbmR9fSA+PiB+Ly5iYXNoX3Byb2ZpbGUgb24gT1NYLlxuI1xuX3t7YXBwX25hbWV9fV95YXJnc19jb21wbGV0aW9ucygpXG57XG4gICAgbG9jYWwgY3VyX3dvcmQgYXJncyB0eXBlX2xpc3RcblxuICAgIGN1cl93b3JkPVwiXFwke0NPTVBfV09SRFNbQ09NUF9DV09SRF19XCJcbiAgICBhcmdzPShcIlxcJHtDT01QX1dPUkRTW0BdfVwiKVxuXG4gICAgIyBhc2sgeWFyZ3MgdG8gZ2VuZXJhdGUgY29tcGxldGlvbnMuXG4gICAgdHlwZV9saXN0PSQoe3thcHBfcGF0aH19IC0tZ2V0LXlhcmdzLWNvbXBsZXRpb25zIFwiXFwke2FyZ3NbQF19XCIpXG5cbiAgICBDT01QUkVQTFk9KCAkKGNvbXBnZW4gLVcgXCJcXCR7dHlwZV9saXN0fVwiIC0tIFxcJHtjdXJfd29yZH0pIClcblxuICAgICMgaWYgbm8gbWF0Y2ggd2FzIGZvdW5kLCBmYWxsIGJhY2sgdG8gZmlsZW5hbWUgY29tcGxldGlvblxuICAgIGlmIFsgXFwkeyNDT01QUkVQTFlbQF19IC1lcSAwIF07IHRoZW5cbiAgICAgIENPTVBSRVBMWT0oKVxuICAgIGZpXG5cbiAgICByZXR1cm4gMFxufVxuY29tcGxldGUgLW8gYmFzaGRlZmF1bHQgLW8gZGVmYXVsdCAtRiBfe3thcHBfbmFtZX19X3lhcmdzX2NvbXBsZXRpb25zIHt7YXBwX25hbWV9fVxuIyMjLWVuZC17e2FwcF9uYW1lfX0tY29tcGxldGlvbnMtIyMjXG5gO1xuZXhwb3J0IGNvbnN0IGNvbXBsZXRpb25ac2hUZW1wbGF0ZSA9IGAjY29tcGRlZiB7e2FwcF9uYW1lfX1cbiMjIy1iZWdpbi17e2FwcF9uYW1lfX0tY29tcGxldGlvbnMtIyMjXG4jXG4jIHlhcmdzIGNvbW1hbmQgY29tcGxldGlvbiBzY3JpcHRcbiNcbiMgSW5zdGFsbGF0aW9uOiB7e2FwcF9wYXRofX0ge3tjb21wbGV0aW9uX2NvbW1hbmR9fSA+PiB+Ly56c2hyY1xuIyAgICBvciB7e2FwcF9wYXRofX0ge3tjb21wbGV0aW9uX2NvbW1hbmR9fSA+PiB+Ly56cHJvZmlsZSBvbiBPU1guXG4jXG5fe3thcHBfbmFtZX19X3lhcmdzX2NvbXBsZXRpb25zKClcbntcbiAgbG9jYWwgcmVwbHlcbiAgbG9jYWwgc2k9JElGU1xuICBJRlM9JCdcXG4nIHJlcGx5PSgkKENPTVBfQ1dPUkQ9XCIkKChDVVJSRU5ULTEpKVwiIENPTVBfTElORT1cIiRCVUZGRVJcIiBDT01QX1BPSU5UPVwiJENVUlNPUlwiIHt7YXBwX3BhdGh9fSAtLWdldC15YXJncy1jb21wbGV0aW9ucyBcIlxcJHt3b3Jkc1tAXX1cIikpXG4gIElGUz0kc2lcbiAgX2Rlc2NyaWJlICd2YWx1ZXMnIHJlcGx5XG59XG5jb21wZGVmIF97e2FwcF9uYW1lfX1feWFyZ3NfY29tcGxldGlvbnMge3thcHBfbmFtZX19XG4jIyMtZW5kLXt7YXBwX25hbWV9fS1jb21wbGV0aW9ucy0jIyNcbmA7XG4iLCJleHBvcnQgZnVuY3Rpb24gbGV2ZW5zaHRlaW4oYSwgYikge1xuICAgIGlmIChhLmxlbmd0aCA9PT0gMClcbiAgICAgICAgcmV0dXJuIGIubGVuZ3RoO1xuICAgIGlmIChiLmxlbmd0aCA9PT0gMClcbiAgICAgICAgcmV0dXJuIGEubGVuZ3RoO1xuICAgIGNvbnN0IG1hdHJpeCA9IFtdO1xuICAgIGxldCBpO1xuICAgIGZvciAoaSA9IDA7IGkgPD0gYi5sZW5ndGg7IGkrKykge1xuICAgICAgICBtYXRyaXhbaV0gPSBbaV07XG4gICAgfVxuICAgIGxldCBqO1xuICAgIGZvciAoaiA9IDA7IGogPD0gYS5sZW5ndGg7IGorKykge1xuICAgICAgICBtYXRyaXhbMF1bal0gPSBqO1xuICAgIH1cbiAgICBmb3IgKGkgPSAxOyBpIDw9IGIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZm9yIChqID0gMTsgaiA8PSBhLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBpZiAoYi5jaGFyQXQoaSAtIDEpID09PSBhLmNoYXJBdChqIC0gMSkpIHtcbiAgICAgICAgICAgICAgICBtYXRyaXhbaV1bal0gPSBtYXRyaXhbaSAtIDFdW2ogLSAxXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChpID4gMSAmJlxuICAgICAgICAgICAgICAgICAgICBqID4gMSAmJlxuICAgICAgICAgICAgICAgICAgICBiLmNoYXJBdChpIC0gMikgPT09IGEuY2hhckF0KGogLSAxKSAmJlxuICAgICAgICAgICAgICAgICAgICBiLmNoYXJBdChpIC0gMSkgPT09IGEuY2hhckF0KGogLSAyKSkge1xuICAgICAgICAgICAgICAgICAgICBtYXRyaXhbaV1bal0gPSBtYXRyaXhbaSAtIDJdW2ogLSAyXSArIDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBtYXRyaXhbaV1bal0gPSBNYXRoLm1pbihtYXRyaXhbaSAtIDFdW2ogLSAxXSArIDEsIE1hdGgubWluKG1hdHJpeFtpXVtqIC0gMV0gKyAxLCBtYXRyaXhbaSAtIDFdW2pdICsgMSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWF0cml4W2IubGVuZ3RoXVthLmxlbmd0aF07XG59XG4iLCJpbXBvcnQgeyBhcmdzZXJ0IH0gZnJvbSAnLi9hcmdzZXJ0LmpzJztcbmltcG9ydCB7IGFzc2VydE5vdFN0cmljdEVxdWFsLCB9IGZyb20gJy4vdHlwaW5ncy9jb21tb24tdHlwZXMuanMnO1xuaW1wb3J0IHsgbGV2ZW5zaHRlaW4gYXMgZGlzdGFuY2UgfSBmcm9tICcuL3V0aWxzL2xldmVuc2h0ZWluLmpzJztcbmltcG9ydCB7IG9iakZpbHRlciB9IGZyb20gJy4vdXRpbHMvb2JqLWZpbHRlci5qcyc7XG5jb25zdCBzcGVjaWFsS2V5cyA9IFsnJDAnLCAnLS0nLCAnXyddO1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRpb24oeWFyZ3MsIHVzYWdlLCBzaGltKSB7XG4gICAgY29uc3QgX18gPSBzaGltLnkxOG4uX187XG4gICAgY29uc3QgX19uID0gc2hpbS55MThuLl9fbjtcbiAgICBjb25zdCBzZWxmID0ge307XG4gICAgc2VsZi5ub25PcHRpb25Db3VudCA9IGZ1bmN0aW9uIG5vbk9wdGlvbkNvdW50KGFyZ3YpIHtcbiAgICAgICAgY29uc3QgZGVtYW5kZWRDb21tYW5kcyA9IHlhcmdzLmdldERlbWFuZGVkQ29tbWFuZHMoKTtcbiAgICAgICAgY29uc3QgcG9zaXRpb25hbENvdW50ID0gYXJndi5fLmxlbmd0aCArIChhcmd2WyctLSddID8gYXJndlsnLS0nXS5sZW5ndGggOiAwKTtcbiAgICAgICAgY29uc3QgX3MgPSBwb3NpdGlvbmFsQ291bnQgLSB5YXJncy5nZXRJbnRlcm5hbE1ldGhvZHMoKS5nZXRDb250ZXh0KCkuY29tbWFuZHMubGVuZ3RoO1xuICAgICAgICBpZiAoZGVtYW5kZWRDb21tYW5kcy5fICYmXG4gICAgICAgICAgICAoX3MgPCBkZW1hbmRlZENvbW1hbmRzLl8ubWluIHx8IF9zID4gZGVtYW5kZWRDb21tYW5kcy5fLm1heCkpIHtcbiAgICAgICAgICAgIGlmIChfcyA8IGRlbWFuZGVkQ29tbWFuZHMuXy5taW4pIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVtYW5kZWRDb21tYW5kcy5fLm1pbk1zZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHVzYWdlLmZhaWwoZGVtYW5kZWRDb21tYW5kcy5fLm1pbk1zZ1xuICAgICAgICAgICAgICAgICAgICAgICAgPyBkZW1hbmRlZENvbW1hbmRzLl8ubWluTXNnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcJDAvZywgX3MudG9TdHJpbmcoKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFwkMS8sIGRlbWFuZGVkQ29tbWFuZHMuXy5taW4udG9TdHJpbmcoKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB1c2FnZS5mYWlsKF9fbignTm90IGVub3VnaCBub24tb3B0aW9uIGFyZ3VtZW50czogZ290ICVzLCBuZWVkIGF0IGxlYXN0ICVzJywgJ05vdCBlbm91Z2ggbm9uLW9wdGlvbiBhcmd1bWVudHM6IGdvdCAlcywgbmVlZCBhdCBsZWFzdCAlcycsIF9zLCBfcy50b1N0cmluZygpLCBkZW1hbmRlZENvbW1hbmRzLl8ubWluLnRvU3RyaW5nKCkpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChfcyA+IGRlbWFuZGVkQ29tbWFuZHMuXy5tYXgpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVtYW5kZWRDb21tYW5kcy5fLm1heE1zZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHVzYWdlLmZhaWwoZGVtYW5kZWRDb21tYW5kcy5fLm1heE1zZ1xuICAgICAgICAgICAgICAgICAgICAgICAgPyBkZW1hbmRlZENvbW1hbmRzLl8ubWF4TXNnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcJDAvZywgX3MudG9TdHJpbmcoKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFwkMS8sIGRlbWFuZGVkQ29tbWFuZHMuXy5tYXgudG9TdHJpbmcoKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB1c2FnZS5mYWlsKF9fbignVG9vIG1hbnkgbm9uLW9wdGlvbiBhcmd1bWVudHM6IGdvdCAlcywgbWF4aW11bSBvZiAlcycsICdUb28gbWFueSBub24tb3B0aW9uIGFyZ3VtZW50czogZ290ICVzLCBtYXhpbXVtIG9mICVzJywgX3MsIF9zLnRvU3RyaW5nKCksIGRlbWFuZGVkQ29tbWFuZHMuXy5tYXgudG9TdHJpbmcoKSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgc2VsZi5wb3NpdGlvbmFsQ291bnQgPSBmdW5jdGlvbiBwb3NpdGlvbmFsQ291bnQocmVxdWlyZWQsIG9ic2VydmVkKSB7XG4gICAgICAgIGlmIChvYnNlcnZlZCA8IHJlcXVpcmVkKSB7XG4gICAgICAgICAgICB1c2FnZS5mYWlsKF9fbignTm90IGVub3VnaCBub24tb3B0aW9uIGFyZ3VtZW50czogZ290ICVzLCBuZWVkIGF0IGxlYXN0ICVzJywgJ05vdCBlbm91Z2ggbm9uLW9wdGlvbiBhcmd1bWVudHM6IGdvdCAlcywgbmVlZCBhdCBsZWFzdCAlcycsIG9ic2VydmVkLCBvYnNlcnZlZCArICcnLCByZXF1aXJlZCArICcnKSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHNlbGYucmVxdWlyZWRBcmd1bWVudHMgPSBmdW5jdGlvbiByZXF1aXJlZEFyZ3VtZW50cyhhcmd2LCBkZW1hbmRlZE9wdGlvbnMpIHtcbiAgICAgICAgbGV0IG1pc3NpbmcgPSBudWxsO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhkZW1hbmRlZE9wdGlvbnMpKSB7XG4gICAgICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhcmd2LCBrZXkpIHx8XG4gICAgICAgICAgICAgICAgdHlwZW9mIGFyZ3Zba2V5XSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBtaXNzaW5nID0gbWlzc2luZyB8fCB7fTtcbiAgICAgICAgICAgICAgICBtaXNzaW5nW2tleV0gPSBkZW1hbmRlZE9wdGlvbnNba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobWlzc2luZykge1xuICAgICAgICAgICAgY29uc3QgY3VzdG9tTXNncyA9IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMobWlzc2luZykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtc2cgPSBtaXNzaW5nW2tleV07XG4gICAgICAgICAgICAgICAgaWYgKG1zZyAmJiBjdXN0b21Nc2dzLmluZGV4T2YobXNnKSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY3VzdG9tTXNncy5wdXNoKG1zZyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgY3VzdG9tTXNnID0gY3VzdG9tTXNncy5sZW5ndGggPyBgXFxuJHtjdXN0b21Nc2dzLmpvaW4oJ1xcbicpfWAgOiAnJztcbiAgICAgICAgICAgIHVzYWdlLmZhaWwoX19uKCdNaXNzaW5nIHJlcXVpcmVkIGFyZ3VtZW50OiAlcycsICdNaXNzaW5nIHJlcXVpcmVkIGFyZ3VtZW50czogJXMnLCBPYmplY3Qua2V5cyhtaXNzaW5nKS5sZW5ndGgsIE9iamVjdC5rZXlzKG1pc3NpbmcpLmpvaW4oJywgJykgKyBjdXN0b21Nc2cpKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgc2VsZi51bmtub3duQXJndW1lbnRzID0gZnVuY3Rpb24gdW5rbm93bkFyZ3VtZW50cyhhcmd2LCBhbGlhc2VzLCBwb3NpdGlvbmFsTWFwLCBpc0RlZmF1bHRDb21tYW5kLCBjaGVja1Bvc2l0aW9uYWxzID0gdHJ1ZSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IGNvbW1hbmRLZXlzID0geWFyZ3NcbiAgICAgICAgICAgIC5nZXRJbnRlcm5hbE1ldGhvZHMoKVxuICAgICAgICAgICAgLmdldENvbW1hbmRJbnN0YW5jZSgpXG4gICAgICAgICAgICAuZ2V0Q29tbWFuZHMoKTtcbiAgICAgICAgY29uc3QgdW5rbm93biA9IFtdO1xuICAgICAgICBjb25zdCBjdXJyZW50Q29udGV4dCA9IHlhcmdzLmdldEludGVybmFsTWV0aG9kcygpLmdldENvbnRleHQoKTtcbiAgICAgICAgT2JqZWN0LmtleXMoYXJndikuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgaWYgKCFzcGVjaWFsS2V5cy5pbmNsdWRlcyhrZXkpICYmXG4gICAgICAgICAgICAgICAgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChwb3NpdGlvbmFsTWFwLCBrZXkpICYmXG4gICAgICAgICAgICAgICAgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh5YXJncy5nZXRJbnRlcm5hbE1ldGhvZHMoKS5nZXRQYXJzZUNvbnRleHQoKSwga2V5KSAmJlxuICAgICAgICAgICAgICAgICFzZWxmLmlzVmFsaWRBbmRTb21lQWxpYXNJc05vdE5ldyhrZXksIGFsaWFzZXMpKSB7XG4gICAgICAgICAgICAgICAgdW5rbm93bi5wdXNoKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoY2hlY2tQb3NpdGlvbmFscyAmJlxuICAgICAgICAgICAgKGN1cnJlbnRDb250ZXh0LmNvbW1hbmRzLmxlbmd0aCA+IDAgfHxcbiAgICAgICAgICAgICAgICBjb21tYW5kS2V5cy5sZW5ndGggPiAwIHx8XG4gICAgICAgICAgICAgICAgaXNEZWZhdWx0Q29tbWFuZCkpIHtcbiAgICAgICAgICAgIGFyZ3YuXy5zbGljZShjdXJyZW50Q29udGV4dC5jb21tYW5kcy5sZW5ndGgpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWNvbW1hbmRLZXlzLmluY2x1ZGVzKCcnICsga2V5KSkge1xuICAgICAgICAgICAgICAgICAgICB1bmtub3duLnB1c2goJycgKyBrZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGVja1Bvc2l0aW9uYWxzKSB7XG4gICAgICAgICAgICBjb25zdCBkZW1hbmRlZENvbW1hbmRzID0geWFyZ3MuZ2V0RGVtYW5kZWRDb21tYW5kcygpO1xuICAgICAgICAgICAgY29uc3QgbWF4Tm9uT3B0RGVtYW5kZWQgPSAoKF9hID0gZGVtYW5kZWRDb21tYW5kcy5fKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubWF4KSB8fCAwO1xuICAgICAgICAgICAgY29uc3QgZXhwZWN0ZWQgPSBjdXJyZW50Q29udGV4dC5jb21tYW5kcy5sZW5ndGggKyBtYXhOb25PcHREZW1hbmRlZDtcbiAgICAgICAgICAgIGlmIChleHBlY3RlZCA8IGFyZ3YuXy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBhcmd2Ll8uc2xpY2UoZXhwZWN0ZWQpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgICAgICAgICAga2V5ID0gU3RyaW5nKGtleSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY3VycmVudENvbnRleHQuY29tbWFuZHMuaW5jbHVkZXMoa2V5KSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgIXVua25vd24uaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdW5rbm93bi5wdXNoKGtleSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodW5rbm93bi5sZW5ndGgpIHtcbiAgICAgICAgICAgIHVzYWdlLmZhaWwoX19uKCdVbmtub3duIGFyZ3VtZW50OiAlcycsICdVbmtub3duIGFyZ3VtZW50czogJXMnLCB1bmtub3duLmxlbmd0aCwgdW5rbm93bi5tYXAocyA9PiAocy50cmltKCkgPyBzIDogYFwiJHtzfVwiYCkpLmpvaW4oJywgJykpKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgc2VsZi51bmtub3duQ29tbWFuZHMgPSBmdW5jdGlvbiB1bmtub3duQ29tbWFuZHMoYXJndikge1xuICAgICAgICBjb25zdCBjb21tYW5kS2V5cyA9IHlhcmdzXG4gICAgICAgICAgICAuZ2V0SW50ZXJuYWxNZXRob2RzKClcbiAgICAgICAgICAgIC5nZXRDb21tYW5kSW5zdGFuY2UoKVxuICAgICAgICAgICAgLmdldENvbW1hbmRzKCk7XG4gICAgICAgIGNvbnN0IHVua25vd24gPSBbXTtcbiAgICAgICAgY29uc3QgY3VycmVudENvbnRleHQgPSB5YXJncy5nZXRJbnRlcm5hbE1ldGhvZHMoKS5nZXRDb250ZXh0KCk7XG4gICAgICAgIGlmIChjdXJyZW50Q29udGV4dC5jb21tYW5kcy5sZW5ndGggPiAwIHx8IGNvbW1hbmRLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGFyZ3YuXy5zbGljZShjdXJyZW50Q29udGV4dC5jb21tYW5kcy5sZW5ndGgpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWNvbW1hbmRLZXlzLmluY2x1ZGVzKCcnICsga2V5KSkge1xuICAgICAgICAgICAgICAgICAgICB1bmtub3duLnB1c2goJycgKyBrZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1bmtub3duLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHVzYWdlLmZhaWwoX19uKCdVbmtub3duIGNvbW1hbmQ6ICVzJywgJ1Vua25vd24gY29tbWFuZHM6ICVzJywgdW5rbm93bi5sZW5ndGgsIHVua25vd24uam9pbignLCAnKSkpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHNlbGYuaXNWYWxpZEFuZFNvbWVBbGlhc0lzTm90TmV3ID0gZnVuY3Rpb24gaXNWYWxpZEFuZFNvbWVBbGlhc0lzTm90TmV3KGtleSwgYWxpYXNlcykge1xuICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhbGlhc2VzLCBrZXkpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmV3QWxpYXNlcyA9IHlhcmdzLnBhcnNlZC5uZXdBbGlhc2VzO1xuICAgICAgICByZXR1cm4gW2tleSwgLi4uYWxpYXNlc1trZXldXS5zb21lKGEgPT4gIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuZXdBbGlhc2VzLCBhKSB8fCAhbmV3QWxpYXNlc1trZXldKTtcbiAgICB9O1xuICAgIHNlbGYubGltaXRlZENob2ljZXMgPSBmdW5jdGlvbiBsaW1pdGVkQ2hvaWNlcyhhcmd2KSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB5YXJncy5nZXRPcHRpb25zKCk7XG4gICAgICAgIGNvbnN0IGludmFsaWQgPSB7fTtcbiAgICAgICAgaWYgKCFPYmplY3Qua2V5cyhvcHRpb25zLmNob2ljZXMpLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgT2JqZWN0LmtleXMoYXJndikuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgaWYgKHNwZWNpYWxLZXlzLmluZGV4T2Yoa2V5KSA9PT0gLTEgJiZcbiAgICAgICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob3B0aW9ucy5jaG9pY2VzLCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgW10uY29uY2F0KGFyZ3Zba2V5XSkuZm9yRWFjaCh2YWx1ZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmNob2ljZXNba2V5XS5pbmRleE9mKHZhbHVlKSA9PT0gLTEgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRba2V5XSA9IChpbnZhbGlkW2tleV0gfHwgW10pLmNvbmNhdCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGludmFsaWRLZXlzID0gT2JqZWN0LmtleXMoaW52YWxpZCk7XG4gICAgICAgIGlmICghaW52YWxpZEtleXMubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBsZXQgbXNnID0gX18oJ0ludmFsaWQgdmFsdWVzOicpO1xuICAgICAgICBpbnZhbGlkS2V5cy5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICBtc2cgKz0gYFxcbiAgJHtfXygnQXJndW1lbnQ6ICVzLCBHaXZlbjogJXMsIENob2ljZXM6ICVzJywga2V5LCB1c2FnZS5zdHJpbmdpZmllZFZhbHVlcyhpbnZhbGlkW2tleV0pLCB1c2FnZS5zdHJpbmdpZmllZFZhbHVlcyhvcHRpb25zLmNob2ljZXNba2V5XSkpfWA7XG4gICAgICAgIH0pO1xuICAgICAgICB1c2FnZS5mYWlsKG1zZyk7XG4gICAgfTtcbiAgICBsZXQgaW1wbGllZCA9IHt9O1xuICAgIHNlbGYuaW1wbGllcyA9IGZ1bmN0aW9uIGltcGxpZXMoa2V5LCB2YWx1ZSkge1xuICAgICAgICBhcmdzZXJ0KCc8c3RyaW5nfG9iamVjdD4gW2FycmF5fG51bWJlcnxzdHJpbmddJywgW2tleSwgdmFsdWVdLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgaWYgKHR5cGVvZiBrZXkgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhrZXkpLmZvckVhY2goayA9PiB7XG4gICAgICAgICAgICAgICAgc2VsZi5pbXBsaWVzKGssIGtleVtrXSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHlhcmdzLmdsb2JhbChrZXkpO1xuICAgICAgICAgICAgaWYgKCFpbXBsaWVkW2tleV0pIHtcbiAgICAgICAgICAgICAgICBpbXBsaWVkW2tleV0gPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHZhbHVlLmZvckVhY2goaSA9PiBzZWxmLmltcGxpZXMoa2V5LCBpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBhc3NlcnROb3RTdHJpY3RFcXVhbCh2YWx1ZSwgdW5kZWZpbmVkLCBzaGltKTtcbiAgICAgICAgICAgICAgICBpbXBsaWVkW2tleV0ucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHNlbGYuZ2V0SW1wbGllZCA9IGZ1bmN0aW9uIGdldEltcGxpZWQoKSB7XG4gICAgICAgIHJldHVybiBpbXBsaWVkO1xuICAgIH07XG4gICAgZnVuY3Rpb24ga2V5RXhpc3RzKGFyZ3YsIHZhbCkge1xuICAgICAgICBjb25zdCBudW0gPSBOdW1iZXIodmFsKTtcbiAgICAgICAgdmFsID0gaXNOYU4obnVtKSA/IHZhbCA6IG51bTtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICB2YWwgPSBhcmd2Ll8ubGVuZ3RoID49IHZhbDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh2YWwubWF0Y2goL14tLW5vLS4rLykpIHtcbiAgICAgICAgICAgIHZhbCA9IHZhbC5tYXRjaCgvXi0tbm8tKC4rKS8pWzFdO1xuICAgICAgICAgICAgdmFsID0gIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhcmd2LCB2YWwpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFsID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGFyZ3YsIHZhbCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICB9XG4gICAgc2VsZi5pbXBsaWNhdGlvbnMgPSBmdW5jdGlvbiBpbXBsaWNhdGlvbnMoYXJndikge1xuICAgICAgICBjb25zdCBpbXBseUZhaWwgPSBbXTtcbiAgICAgICAgT2JqZWN0LmtleXMoaW1wbGllZCkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb3JpZ0tleSA9IGtleTtcbiAgICAgICAgICAgIChpbXBsaWVkW2tleV0gfHwgW10pLmZvckVhY2godmFsdWUgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBrZXkgPSBvcmlnS2V5O1xuICAgICAgICAgICAgICAgIGNvbnN0IG9yaWdWYWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIGtleSA9IGtleUV4aXN0cyhhcmd2LCBrZXkpO1xuICAgICAgICAgICAgICAgIHZhbHVlID0ga2V5RXhpc3RzKGFyZ3YsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBpZiAoa2V5ICYmICF2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBpbXBseUZhaWwucHVzaChgICR7b3JpZ0tleX0gLT4gJHtvcmlnVmFsdWV9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoaW1wbHlGYWlsLmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IG1zZyA9IGAke19fKCdJbXBsaWNhdGlvbnMgZmFpbGVkOicpfVxcbmA7XG4gICAgICAgICAgICBpbXBseUZhaWwuZm9yRWFjaCh2YWx1ZSA9PiB7XG4gICAgICAgICAgICAgICAgbXNnICs9IHZhbHVlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB1c2FnZS5mYWlsKG1zZyk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGxldCBjb25mbGljdGluZyA9IHt9O1xuICAgIHNlbGYuY29uZmxpY3RzID0gZnVuY3Rpb24gY29uZmxpY3RzKGtleSwgdmFsdWUpIHtcbiAgICAgICAgYXJnc2VydCgnPHN0cmluZ3xvYmplY3Q+IFthcnJheXxzdHJpbmddJywgW2tleSwgdmFsdWVdLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgaWYgKHR5cGVvZiBrZXkgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhrZXkpLmZvckVhY2goayA9PiB7XG4gICAgICAgICAgICAgICAgc2VsZi5jb25mbGljdHMoaywga2V5W2tdKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgeWFyZ3MuZ2xvYmFsKGtleSk7XG4gICAgICAgICAgICBpZiAoIWNvbmZsaWN0aW5nW2tleV0pIHtcbiAgICAgICAgICAgICAgICBjb25mbGljdGluZ1trZXldID0gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZS5mb3JFYWNoKGkgPT4gc2VsZi5jb25mbGljdHMoa2V5LCBpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25mbGljdGluZ1trZXldLnB1c2godmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBzZWxmLmdldENvbmZsaWN0aW5nID0gKCkgPT4gY29uZmxpY3Rpbmc7XG4gICAgc2VsZi5jb25mbGljdGluZyA9IGZ1bmN0aW9uIGNvbmZsaWN0aW5nRm4oYXJndikge1xuICAgICAgICBPYmplY3Qua2V5cyhhcmd2KS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICBpZiAoY29uZmxpY3Rpbmdba2V5XSkge1xuICAgICAgICAgICAgICAgIGNvbmZsaWN0aW5nW2tleV0uZm9yRWFjaCh2YWx1ZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAmJiBhcmd2W2tleV0gIT09IHVuZGVmaW5lZCAmJiBhcmd2W3ZhbHVlXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1c2FnZS5mYWlsKF9fKCdBcmd1bWVudHMgJXMgYW5kICVzIGFyZSBtdXR1YWxseSBleGNsdXNpdmUnLCBrZXksIHZhbHVlKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh5YXJncy5nZXRJbnRlcm5hbE1ldGhvZHMoKS5nZXRQYXJzZXJDb25maWd1cmF0aW9uKClbJ3N0cmlwLWRhc2hlZCddKSB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhjb25mbGljdGluZykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbmZsaWN0aW5nW2tleV0uZm9yRWFjaCh2YWx1ZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJndltzaGltLlBhcnNlci5jYW1lbENhc2Uoa2V5KV0gIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJndltzaGltLlBhcnNlci5jYW1lbENhc2UodmFsdWUpXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1c2FnZS5mYWlsKF9fKCdBcmd1bWVudHMgJXMgYW5kICVzIGFyZSBtdXR1YWxseSBleGNsdXNpdmUnLCBrZXksIHZhbHVlKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBzZWxmLnJlY29tbWVuZENvbW1hbmRzID0gZnVuY3Rpb24gcmVjb21tZW5kQ29tbWFuZHMoY21kLCBwb3RlbnRpYWxDb21tYW5kcykge1xuICAgICAgICBjb25zdCB0aHJlc2hvbGQgPSAzO1xuICAgICAgICBwb3RlbnRpYWxDb21tYW5kcyA9IHBvdGVudGlhbENvbW1hbmRzLnNvcnQoKGEsIGIpID0+IGIubGVuZ3RoIC0gYS5sZW5ndGgpO1xuICAgICAgICBsZXQgcmVjb21tZW5kZWQgPSBudWxsO1xuICAgICAgICBsZXQgYmVzdERpc3RhbmNlID0gSW5maW5pdHk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBjYW5kaWRhdGU7IChjYW5kaWRhdGUgPSBwb3RlbnRpYWxDb21tYW5kc1tpXSkgIT09IHVuZGVmaW5lZDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBkID0gZGlzdGFuY2UoY21kLCBjYW5kaWRhdGUpO1xuICAgICAgICAgICAgaWYgKGQgPD0gdGhyZXNob2xkICYmIGQgPCBiZXN0RGlzdGFuY2UpIHtcbiAgICAgICAgICAgICAgICBiZXN0RGlzdGFuY2UgPSBkO1xuICAgICAgICAgICAgICAgIHJlY29tbWVuZGVkID0gY2FuZGlkYXRlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChyZWNvbW1lbmRlZClcbiAgICAgICAgICAgIHVzYWdlLmZhaWwoX18oJ0RpZCB5b3UgbWVhbiAlcz8nLCByZWNvbW1lbmRlZCkpO1xuICAgIH07XG4gICAgc2VsZi5yZXNldCA9IGZ1bmN0aW9uIHJlc2V0KGxvY2FsTG9va3VwKSB7XG4gICAgICAgIGltcGxpZWQgPSBvYmpGaWx0ZXIoaW1wbGllZCwgayA9PiAhbG9jYWxMb29rdXBba10pO1xuICAgICAgICBjb25mbGljdGluZyA9IG9iakZpbHRlcihjb25mbGljdGluZywgayA9PiAhbG9jYWxMb29rdXBba10pO1xuICAgICAgICByZXR1cm4gc2VsZjtcbiAgICB9O1xuICAgIGNvbnN0IGZyb3plbnMgPSBbXTtcbiAgICBzZWxmLmZyZWV6ZSA9IGZ1bmN0aW9uIGZyZWV6ZSgpIHtcbiAgICAgICAgZnJvemVucy5wdXNoKHtcbiAgICAgICAgICAgIGltcGxpZWQsXG4gICAgICAgICAgICBjb25mbGljdGluZyxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBzZWxmLnVuZnJlZXplID0gZnVuY3Rpb24gdW5mcmVlemUoKSB7XG4gICAgICAgIGNvbnN0IGZyb3plbiA9IGZyb3plbnMucG9wKCk7XG4gICAgICAgIGFzc2VydE5vdFN0cmljdEVxdWFsKGZyb3plbiwgdW5kZWZpbmVkLCBzaGltKTtcbiAgICAgICAgKHsgaW1wbGllZCwgY29uZmxpY3RpbmcgfSA9IGZyb3plbik7XG4gICAgfTtcbiAgICByZXR1cm4gc2VsZjtcbn1cbiIsImltcG9ydCB7IFlFcnJvciB9IGZyb20gJy4uL3llcnJvci5qcyc7XG5sZXQgcHJldmlvdXNseVZpc2l0ZWRDb25maWdzID0gW107XG5sZXQgc2hpbTtcbmV4cG9ydCBmdW5jdGlvbiBhcHBseUV4dGVuZHMoY29uZmlnLCBjd2QsIG1lcmdlRXh0ZW5kcywgX3NoaW0pIHtcbiAgICBzaGltID0gX3NoaW07XG4gICAgbGV0IGRlZmF1bHRDb25maWcgPSB7fTtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgJ2V4dGVuZHMnKSkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5leHRlbmRzICE9PSAnc3RyaW5nJylcbiAgICAgICAgICAgIHJldHVybiBkZWZhdWx0Q29uZmlnO1xuICAgICAgICBjb25zdCBpc1BhdGggPSAvXFwuanNvbnxcXC4uKnJjJC8udGVzdChjb25maWcuZXh0ZW5kcyk7XG4gICAgICAgIGxldCBwYXRoVG9EZWZhdWx0ID0gbnVsbDtcbiAgICAgICAgaWYgKCFpc1BhdGgpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcGF0aFRvRGVmYXVsdCA9IHJlcXVpcmUucmVzb2x2ZShjb25maWcuZXh0ZW5kcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoX2Vycikge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb25maWc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBwYXRoVG9EZWZhdWx0ID0gZ2V0UGF0aFRvRGVmYXVsdENvbmZpZyhjd2QsIGNvbmZpZy5leHRlbmRzKTtcbiAgICAgICAgfVxuICAgICAgICBjaGVja0ZvckNpcmN1bGFyRXh0ZW5kcyhwYXRoVG9EZWZhdWx0KTtcbiAgICAgICAgcHJldmlvdXNseVZpc2l0ZWRDb25maWdzLnB1c2gocGF0aFRvRGVmYXVsdCk7XG4gICAgICAgIGRlZmF1bHRDb25maWcgPSBpc1BhdGhcbiAgICAgICAgICAgID8gSlNPTi5wYXJzZShzaGltLnJlYWRGaWxlU3luYyhwYXRoVG9EZWZhdWx0LCAndXRmOCcpKVxuICAgICAgICAgICAgOiByZXF1aXJlKGNvbmZpZy5leHRlbmRzKTtcbiAgICAgICAgZGVsZXRlIGNvbmZpZy5leHRlbmRzO1xuICAgICAgICBkZWZhdWx0Q29uZmlnID0gYXBwbHlFeHRlbmRzKGRlZmF1bHRDb25maWcsIHNoaW0ucGF0aC5kaXJuYW1lKHBhdGhUb0RlZmF1bHQpLCBtZXJnZUV4dGVuZHMsIHNoaW0pO1xuICAgIH1cbiAgICBwcmV2aW91c2x5VmlzaXRlZENvbmZpZ3MgPSBbXTtcbiAgICByZXR1cm4gbWVyZ2VFeHRlbmRzXG4gICAgICAgID8gbWVyZ2VEZWVwKGRlZmF1bHRDb25maWcsIGNvbmZpZylcbiAgICAgICAgOiBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0Q29uZmlnLCBjb25maWcpO1xufVxuZnVuY3Rpb24gY2hlY2tGb3JDaXJjdWxhckV4dGVuZHMoY2ZnUGF0aCkge1xuICAgIGlmIChwcmV2aW91c2x5VmlzaXRlZENvbmZpZ3MuaW5kZXhPZihjZmdQYXRoKSA+IC0xKSB7XG4gICAgICAgIHRocm93IG5ldyBZRXJyb3IoYENpcmN1bGFyIGV4dGVuZGVkIGNvbmZpZ3VyYXRpb25zOiAnJHtjZmdQYXRofScuYCk7XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0UGF0aFRvRGVmYXVsdENvbmZpZyhjd2QsIHBhdGhUb0V4dGVuZCkge1xuICAgIHJldHVybiBzaGltLnBhdGgucmVzb2x2ZShjd2QsIHBhdGhUb0V4dGVuZCk7XG59XG5mdW5jdGlvbiBtZXJnZURlZXAoY29uZmlnMSwgY29uZmlnMikge1xuICAgIGNvbnN0IHRhcmdldCA9IHt9O1xuICAgIGZ1bmN0aW9uIGlzT2JqZWN0KG9iaikge1xuICAgICAgICByZXR1cm4gb2JqICYmIHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KG9iaik7XG4gICAgfVxuICAgIE9iamVjdC5hc3NpZ24odGFyZ2V0LCBjb25maWcxKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhjb25maWcyKSkge1xuICAgICAgICBpZiAoaXNPYmplY3QoY29uZmlnMltrZXldKSAmJiBpc09iamVjdCh0YXJnZXRba2V5XSkpIHtcbiAgICAgICAgICAgIHRhcmdldFtrZXldID0gbWVyZ2VEZWVwKGNvbmZpZzFba2V5XSwgY29uZmlnMltrZXldKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRhcmdldFtrZXldID0gY29uZmlnMltrZXldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXQ7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIEJvb3RzdHJhcHMgeWFyZ3MgZm9yIEVTTTpcbmltcG9ydCBlc21QbGF0Zm9ybVNoaW0gZnJvbSAnLi9saWIvcGxhdGZvcm0tc2hpbXMvZXNtLm1qcyc7XG5pbXBvcnQge1lhcmdzRmFjdG9yeX0gZnJvbSAnLi9idWlsZC9saWIveWFyZ3MtZmFjdG9yeS5qcyc7XG5cbmNvbnN0IFlhcmdzID0gWWFyZ3NGYWN0b3J5KGVzbVBsYXRmb3JtU2hpbSk7XG5leHBvcnQgZGVmYXVsdCBZYXJncztcbiIsImV4cG9ydCBjb25zdCBpc1J1bm5pbmdPbkJ1biA9IHByb2Nlc3MuYXJndlswXS5lbmRzV2l0aCgnL2J1bicpIHx8IHByb2Nlc3MuZW52Lm5wbV9leGVjcGF0aD8uZW5kc1dpdGgoJy9idW4nKTtcblxuZXhwb3J0IGNvbnN0IHJ1bnRpbWVXaXRoQXJncyA9IGlzUnVubmluZ09uQnVuID8gJ2J1biAtLWJ1biBydW4nIDogJ25vZGUnO1xuZXhwb3J0IGNvbnN0IHBhY2thZ2VNYW5hZ2VyV2l0aEFyZ3MgPSBpc1J1bm5pbmdPbkJ1biA/ICdidW4gLS1idW4gcnVuJyA6ICd5YXJuJztcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgRW52UmVhZGVyT3B0aW9ucyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB7IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB7IG1lbW9pemVGYWN0b3J5IH0gZnJvbSAnYXQtZGVjb3JhdG9ycyc7XG5pbXBvcnQgeyBnbG9iYnkgfSBmcm9tICdnbG9iYnknO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGlzUnVubmluZ09uQnVuIH0gZnJvbSAnLi91dGlscy9ydW50aW1lLmpzJztcblxuY29uc3QgbWVtb2l6ZSA9IG1lbW9pemVGYWN0b3J5KHsgbWF4Q2FjaGVkVGhpc1NpemU6IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLCBtYXhDYWNoZWRBcmdzU2l6ZTogMSB9KTtcblxuZXhwb3J0IGNsYXNzIFByb2plY3Qge1xuICBwcml2YXRlIHJlYWRvbmx5IGFyZ3Y6IEVudlJlYWRlck9wdGlvbnM7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9hZEVudjogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBwYXRoQnlOYW1lID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9kaXJQYXRoOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoZGlyUGF0aDogc3RyaW5nLCBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLCBsb2FkRW52OiBib29sZWFuKSB7XG4gICAgdGhpcy5fZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoKTtcbiAgICB0aGlzLmFyZ3YgPSBhcmd2O1xuICAgIHRoaXMubG9hZEVudiA9IGxvYWRFbnY7XG4gIH1cblxuICBAbWVtb2l6ZVxuICBnZXQgaXNCdW5BdmFpbGFibGUoKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAvKF58XFxuKWJ1blxccy8udGVzdChmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHRoaXMucm9vdERpclBhdGgsICcudG9vbC12ZXJzaW9ucycpLCAndXRmOCcpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBAbWVtb2l6ZVxuICBnZXQgYnVpbGRDb21tYW5kKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGlzUnVubmluZ09uQnVuXG4gICAgICA/ICd0cnVlJ1xuICAgICAgOiB0aGlzLnBhY2thZ2VKc29uLnNjcmlwdHM/LmJ1aWxkPy5pbmNsdWRlcygnYnVpbGRJZk5lZWRlZCcpXG4gICAgICAgID8gJ3lhcm4gYnVpbGQnXG4gICAgICAgIDogYFlBUk4gd2IgYnVpbGRJZk5lZWRlZCAke3RoaXMuYXJndi52ZXJib3NlID8gJy0tdmVyYm9zZScgOiAnJ31gO1xuICB9XG5cbiAgZ2V0IGRpclBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZGlyUGF0aDtcbiAgfVxuXG4gIEBtZW1vaXplXG4gIGdldCByb290RGlyUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLmRpclBhdGgsICcuLicsICcuLicsICdwYWNrYWdlLmpzb24nKSlcbiAgICAgID8gcGF0aC5yZXNvbHZlKHRoaXMuZGlyUGF0aCwgJy4uJywgJy4uJylcbiAgICAgIDogdGhpcy5kaXJQYXRoO1xuICB9XG5cbiAgQG1lbW9pemVcbiAgZ2V0IGRvY2tlcmZpbGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZnMucmVhZEZpbGVTeW5jKHRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSwgJ3V0ZjgnKTtcbiAgfVxuXG4gIEBtZW1vaXplXG4gIGdldCBoYXNEb2NrZXJmaWxlKCk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gISF0aGlzLmZpbmRGaWxlKCdEb2NrZXJmaWxlJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgQG1lbW9pemVcbiAgZ2V0IGhhc1NvdXJjZUNvZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJ3NyYycpKTtcbiAgfVxuXG4gIEBtZW1vaXplXG4gIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucGFja2FnZUpzb24ubmFtZSB8fCAndW5rbm93bic7XG4gIH1cblxuICBAbWVtb2l6ZVxuICBnZXQgZG9ja2VySW1hZ2VOYW1lKCk6IHN0cmluZyB7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMucGFja2FnZUpzb24ubmFtZSB8fCAndW5rbm93bic7XG4gICAgcmV0dXJuIG5hbWUucmVwbGFjZUFsbCgnQCcsICcnKS5yZXBsYWNlQWxsKCcvJywgJy0nKTtcbiAgfVxuXG4gIEBtZW1vaXplXG4gIGdldCBlbnYoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgcmV0dXJuIHRoaXMubG9hZEVudiA/IHsgLi4ucmVhZEVudmlyb25tZW50VmFyaWFibGVzKHRoaXMuYXJndiwgdGhpcy5kaXJQYXRoKSwgLi4ucHJvY2Vzcy5lbnYgfSA6IHByb2Nlc3MuZW52O1xuICB9XG5cbiAgQG1lbW9pemVcbiAgZ2V0IHBhY2thZ2VKc29uKCk6IFBhY2thZ2VKc29uIHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpKTtcbiAgfVxuXG4gIEBtZW1vaXplXG4gIGdldCBoYXNQcmlzbWEoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKHRoaXMucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5bJ3ByaXNtYSddIHx8IHRoaXMucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy5bJ3ByaXNtYSddKTtcbiAgfVxuXG4gIEBtZW1vaXplXG4gIGdldCBkb2NrZXJQYWNrYWdlSnNvbigpOiBQYWNrYWdlSnNvbiB7XG4gICAgcmV0dXJuIHBhdGguZGlybmFtZSh0aGlzLmZpbmRGaWxlKCdEb2NrZXJmaWxlJykpID09PSB0aGlzLmRpclBhdGhcbiAgICAgID8gdGhpcy5wYWNrYWdlSnNvblxuICAgICAgOiBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4ocGF0aC5kaXJuYW1lKHRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSksICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSk7XG4gIH1cblxuICBAbWVtb2l6ZVxuICBnZXQgYmluRXhpc3RzKCk6IGJvb2xlYW4ge1xuICAgIGxldCBiaW5Gb3VuZCA9IGZhbHNlO1xuICAgIGxldCBjdXJyZW50UGF0aCA9IHRoaXMuZGlyUGF0aDtcbiAgICBmb3IgKDs7KSB7XG4gICAgICBjb25zdCBiaW5QYXRoID0gcGF0aC5qb2luKGN1cnJlbnRQYXRoLCAnbm9kZV9tb2R1bGVzJywgJy5iaW4nKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGJpblBhdGgpKSB7XG4gICAgICAgIHRoaXMuZW52LlBBVEggPSBgJHtiaW5QYXRofToke3RoaXMuZW52LlBBVEh9YDtcbiAgICAgICAgYmluRm91bmQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY3VycmVudFBhdGgsICcuZ2l0JykpKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY29uc3QgcGFyZW50UGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50UGF0aCk7XG4gICAgICBpZiAoY3VycmVudFBhdGggPT09IHBhcmVudFBhdGgpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjdXJyZW50UGF0aCA9IHBhcmVudFBhdGg7XG4gICAgfVxuICAgIHJldHVybiBiaW5Gb3VuZDtcbiAgfVxuXG4gIGZpbmRGaWxlKGZpbGVOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCBmaWxlUGF0aCA9IHRoaXMucGF0aEJ5TmFtZS5nZXQoZmlsZU5hbWUpO1xuICAgIGlmIChmaWxlUGF0aCkgcmV0dXJuIGZpbGVQYXRoO1xuXG4gICAgZmlsZVBhdGggPSBbZmlsZU5hbWUsIHBhdGguam9pbignLi4nLCAnLi4nLCBmaWxlTmFtZSldXG4gICAgICAubWFwKChwKSA9PiBwYXRoLnJlc29sdmUodGhpcy5kaXJQYXRoLCBwKSlcbiAgICAgIC5maW5kKChwKSA9PiBmcy5leGlzdHNTeW5jKHApKTtcbiAgICBpZiAoIWZpbGVQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgbm90IGZvdW5kOiAke2ZpbGVOYW1lfWApO1xuICAgIH1cbiAgICB0aGlzLnBhdGhCeU5hbWUuc2V0KGZpbGVOYW1lLCBmaWxlUGF0aCk7XG4gICAgcmV0dXJuIGZpbGVQYXRoO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm91bmRQcm9qZWN0cyB7XG4gIHJvb3Q6IFByb2plY3Q7XG4gIHNlbGY6IFByb2plY3Q7XG4gIGFsbDogUHJvamVjdFtdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZFNlbGZQcm9qZWN0KGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsIGxvYWRFbnYgPSB0cnVlLCBkaXJQYXRoPzogc3RyaW5nKTogUHJvamVjdCB8IHVuZGVmaW5lZCB7XG4gIGRpclBhdGggPz89IHByb2Nlc3MuY3dkKCk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkgcmV0dXJuO1xuXG4gIHJldHVybiBuZXcgUHJvamVjdChkaXJQYXRoLCBhcmd2LCBsb2FkRW52KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbmRBbGxQcm9qZWN0cyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgbG9hZEVudiA9IHRydWUsXG4gIGRpclBhdGg/OiBzdHJpbmdcbik6IFByb21pc2U8Rm91bmRQcm9qZWN0cyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCByb290QW5kU2VsZlByb2plY3RzID0gZmluZFJvb3RBbmRTZWxmUHJvamVjdHMoYXJndiwgbG9hZEVudiwgZGlyUGF0aCk7XG4gIGlmICghcm9vdEFuZFNlbGZQcm9qZWN0cykgcmV0dXJuO1xuXG4gIHJldHVybiB7XG4gICAgLi4ucm9vdEFuZFNlbGZQcm9qZWN0cyxcbiAgICBhbGw6XG4gICAgICByb290QW5kU2VsZlByb2plY3RzLnJvb3QgPT09IHJvb3RBbmRTZWxmUHJvamVjdHMuc2VsZlxuICAgICAgICA/IGF3YWl0IGdldEFsbFByb2plY3RzKGFyZ3YsIHJvb3RBbmRTZWxmUHJvamVjdHMucm9vdCwgbG9hZEVudilcbiAgICAgICAgOiBbcm9vdEFuZFNlbGZQcm9qZWN0cy5zZWxmXSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRSb290QW5kU2VsZlByb2plY3RzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBsb2FkRW52ID0gdHJ1ZSxcbiAgZGlyUGF0aD86IHN0cmluZ1xuKTogT21pdDxGb3VuZFByb2plY3RzLCAnYWxsJz4gfCB1bmRlZmluZWQge1xuICBkaXJQYXRoID8/PSBwcm9jZXNzLmN3ZCgpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKSkpIHJldHVybjtcblxuICBjb25zdCB0aGlzUHJvamVjdCA9IG5ldyBQcm9qZWN0KGRpclBhdGgsIGFyZ3YsIGxvYWRFbnYpO1xuICBsZXQgcm9vdFByb2plY3QgPSB0aGlzUHJvamVjdDtcbiAgaWYgKCF0aGlzUHJvamVjdC5wYWNrYWdlSnNvbi53b3Jrc3BhY2VzICYmIHBhdGguZGlybmFtZShkaXJQYXRoKS5lbmRzV2l0aCgnL3BhY2thZ2VzJykpIHtcbiAgICBjb25zdCByb290RGlyUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLi4nLCAnLi4nKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocm9vdERpclBhdGgsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICAgIHJvb3RQcm9qZWN0ID0gbmV3IFByb2plY3Qocm9vdERpclBhdGgsIGFyZ3YsIGxvYWRFbnYpO1xuICAgIH1cbiAgfVxuICByZXR1cm4geyByb290OiByb290UHJvamVjdCwgc2VsZjogdGhpc1Byb2plY3QgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0QWxsUHJvamVjdHMoYXJndjogRW52UmVhZGVyT3B0aW9ucywgcm9vdFByb2plY3Q6IFByb2plY3QsIGxvYWRFbnY6IGJvb2xlYW4pOiBQcm9taXNlPFByb2plY3RbXT4ge1xuICBjb25zdCBhbGxQcm9qZWN0cyA9IFtyb290UHJvamVjdF07XG5cbiAgY29uc3Qgd29ya3NwYWNlID0gcm9vdFByb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcztcbiAgaWYgKCFBcnJheS5pc0FycmF5KHdvcmtzcGFjZSkpIHJldHVybiBhbGxQcm9qZWN0cztcblxuICBjb25zdCBnbG9iUGF0dGVybjogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgcGFja2FnZURpcnM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3Qgd29ya3NwYWNlUGF0aCBvZiB3b3Jrc3BhY2UubWFwKCh3czogc3RyaW5nKSA9PiBwYXRoLmpvaW4ocm9vdFByb2plY3QuZGlyUGF0aCwgd3MpKSkge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHdvcmtzcGFjZVBhdGgpKSB7XG4gICAgICBwYWNrYWdlRGlycy5wdXNoKHdvcmtzcGFjZVBhdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBnbG9iUGF0dGVybi5wdXNoKHdvcmtzcGFjZVBhdGgpO1xuICAgIH1cbiAgfVxuICBwYWNrYWdlRGlycy5wdXNoKC4uLihhd2FpdCBnbG9iYnkoZ2xvYlBhdHRlcm4sIHsgZG90OiB0cnVlLCBvbmx5RGlyZWN0b3JpZXM6IHRydWUgfSkpKTtcbiAgZm9yIChjb25zdCBzdWJQYWNrYWdlRGlyUGF0aCBvZiBwYWNrYWdlRGlycykge1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oc3ViUGFja2FnZURpclBhdGgsICdwYWNrYWdlLmpzb24nKSkpIGNvbnRpbnVlO1xuXG4gICAgYWxsUHJvamVjdHMucHVzaChuZXcgUHJvamVjdChzdWJQYWNrYWdlRGlyUGF0aCwgYXJndiwgbG9hZEVudikpO1xuICB9XG4gIHJldHVybiBhbGxQcm9qZWN0cztcbn1cbiIsImltcG9ydHtjeXJiNjRIYXNoV2l0aExlbmd0aCBhcyBlfWZyb21cIi4vaGFzaC5qc1wiO2NvbnN0IHQ9cygpO2Z1bmN0aW9uIHMoe2NhY2hlRHVyYXRpb246dD1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksY2FjaGVzOnMsY2FsY0tleTpuPSh0PT5lKEpTT04uc3RyaW5naWZ5KHQpKSksbWF4Q2FjaGVkQXJnc1NpemU6aT0xMDAsbWF4Q2FjaGVkVGhpc1NpemU6Yz0xMH09e30pe3JldHVybiBmdW5jdGlvbihlLG8pe2lmKFwiZ2V0dGVyXCI9PT1vPy5raW5kKXtjb25zdCBuPW5ldyBNYXA7cmV0dXJuIHM/LnB1c2gobiksZnVuY3Rpb24oKXtjb25zdCBzPURhdGUubm93KCk7aWYobi5oYXModGhpcykpe2NvbnN0W2UsaV09bi5nZXQodGhpcyk7aWYocy1pPD10KXJldHVybiBlfWNvbnN0IGk9ZS5jYWxsKHRoaXMpO2lmKG4uc2l6ZT49Yyl7Y29uc3QgZT1uLmtleXMoKS5uZXh0KCkudmFsdWU7bi5kZWxldGUoZSl9cmV0dXJuIG4uc2V0KHRoaXMsW2ksc10pLGl9fXtjb25zdCByPW5ldyBNYXA7cmV0dXJuIHM/LnB1c2gociksZnVuY3Rpb24oLi4ucyl7Y29uc3QgYT1uKHMpO2xldCBoPXIuZ2V0KHRoaXMpO2NvbnN0IHU9RGF0ZS5ub3coKTtpZihoKXtpZihoLmhhcyhhKSl7Y29uc3RbZSxzXT1oLmdldChhKTtpZih1LXM8PXQpcmV0dXJuIGV9fWVsc2V7aWYoaD1uZXcgTWFwLHIuc2l6ZT49Yyl7Y29uc3QgZT1yLmtleXMoKS5uZXh0KCkudmFsdWU7ci5kZWxldGUoZSl9ci5zZXQodGhpcyxoKX1jb25zdCBmPW8/ZS5jYWxsKHRoaXMsLi4ucyk6ZSguLi5zKTtpZihoLnNpemU+PWkpe2NvbnN0IGU9aC5rZXlzKCkubmV4dCgpLnZhbHVlO2guZGVsZXRlKGUpfXJldHVybiBoLnNldChhLFtmLHVdKSxmfX19fWV4cG9ydHt0IGFzIG1lbW9pemUscyBhcyBtZW1vaXplRmFjdG9yeX07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tZW1vaXplLmpzLm1hcFxuIiwiZnVuY3Rpb24gdCh0LG49MCl7Y29uc3RbaSxyXT1mdW5jdGlvbih0LG49MCl7bGV0IGk9MzczNTkyODU1OV5uLHI9MTEwMzU0Nzk5MV5uO2ZvcihsZXQgbixhPTA7YTx0Lmxlbmd0aDthKyspbj10LmNvZGVQb2ludEF0KGEpLGk9TWF0aC5pbXVsKGlebiwyNjU0NDM1NzYxKSxyPU1hdGguaW11bChyXm4sMTU5NzMzNDY3Nyk7cmV0dXJuIGk9TWF0aC5pbXVsKGleaT4+PjE2LDIyNDY4MjI1MDcpLGlePU1hdGguaW11bChyXnI+Pj4xMywzMjY2NDg5OTA5KSxyPU1hdGguaW11bChyXnI+Pj4xNiwyMjQ2ODIyNTA3KSxyXj1NYXRoLmltdWwoaV5pPj4+MTMsMzI2NjQ4OTkwOSksW3I+Pj4wLGk+Pj4wXX0odCxuKTtyZXR1cm4gdC5sZW5ndGgudG9TdHJpbmcoMzYpK2kudG9TdHJpbmcoMzYpLnBhZFN0YXJ0KDcsXCIwXCIpK3IudG9TdHJpbmcoMzYpLnBhZFN0YXJ0KDcsXCIwXCIpfWV4cG9ydHt0IGFzIGN5cmI2NEhhc2hXaXRoTGVuZ3RofTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWhhc2guanMubWFwXG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHR5cGUgeyBIYXNoIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGlnbm9yZUVub2VudEFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIGNvbW1hbmQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0EgYnVpbGQgY29tbWFuZCcsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgZGVmYXVsdDogJ3lhcm4gYnVpbGQnLFxuICAgIGFsaWFzOiAnYycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgYnVpbGRJZk5lZWRlZENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnYnVpbGRJZk5lZWRlZCcsXG4gIGRlc2NyaWJlOiAnQnVpbGQgY29kZSBpZiBjaGFuZ2VzIGFyZSBkZXRlY3RlZCcsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IGJ1aWxkSWZOZWVkZWQoYXJndik7XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBidWlsZChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+KTogYm9vbGVhbiB7XG4gIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihgUnVuICcke2FyZ3YuY29tbWFuZH0nYCkpO1xuICBpZiAoIWFyZ3YuZHJ5UnVuKSB7XG4gICAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoYXJndi5jb21tYW5kID8/ICcnLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogcHJvamVjdC5lbnYsXG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgfSk7XG4gICAgaWYgKHJldC5zdGF0dXMgIT09IDApIHtcbiAgICAgIHByb2Nlc3MuZXhpdENvZGUgPSByZXQuc3RhdHVzID8/IDE7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRJZk5lZWRlZChcbiAgLy8gVGVzdCBjb2RlIHJlcXVpcmVzIFBhcnRpYWw8Li4uPlxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4+LFxuICBwcm9qZWN0UGF0aEZvclRlc3Rpbmc/OiBzdHJpbmdcbik6IFByb21pc2U8Ym9vbGVhbiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBwcm9qZWN0ID0gYXdhaXQgZmluZFNlbGZQcm9qZWN0KGFyZ3YsIHRydWUsIHByb2plY3RQYXRoRm9yVGVzdGluZyk7XG4gIGlmICghcHJvamVjdCkge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5yb290RGlyUGF0aCwgJy5naXQnKSkpIHtcbiAgICBidWlsZChwcm9qZWN0LCBhcmd2KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IFtjYW5Ta2lwLCBjYWNoZUZpbGVQYXRoLCBjb250ZW50SGFzaF0gPSBhd2FpdCBjYW5Ta2lwQnVpbGQocHJvamVjdCwgYXJndik7XG4gIGlmIChjYW5Ta2lwKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKGBTa2lwIHRvIHJ1biAnJHthcmd2LmNvbW1hbmR9JyDwn5KrYCkpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghYnVpbGQocHJvamVjdCwgYXJndikpIHJldHVybjtcblxuICBpZiAoIWFyZ3YuZHJ5UnVuKSB7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGNhY2hlRmlsZVBhdGgsIGNvbnRlbnRIYXNoLCAndXRmOCcpO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5jb25zdCBpZ25vcmluZ0VudlZhck5hbWVzID0gbmV3IFNldChbJ0NJJywgJ1BXREVCVUcnLCAnVE1QRElSJ10pO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2FuU2tpcEJ1aWxkKFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+XG4pOiBQcm9taXNlPFtib29sZWFuLCBzdHJpbmcsIHN0cmluZ10+IHtcbiAgY29uc3QgY2FjaGVEaXJlY3RvcnlQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgJ25vZGVfbW9kdWxlcycsICcuY2FjaGUnLCAnYnVpbGQnKTtcbiAgY29uc3QgY2FjaGVGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjYWNoZURpcmVjdG9yeVBhdGgsICdsYXN0LWJ1aWxkJyk7XG4gIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGNhY2hlRGlyZWN0b3J5UGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgY29uc3QgaGFzaCA9IGNyZWF0ZUhhc2goJ3NoYTI1NicpO1xuXG4gIGNvbnN0IGNvbW1pdEhhc2ggPSBjaGlsZF9wcm9jZXNzLmV4ZWNTeW5jKCdnaXQgcmV2LXBhcnNlIEhFQUQnLCB7IGN3ZDogcHJvamVjdC5kaXJQYXRoIH0pLnRvU3RyaW5nKCkudHJpbSgpO1xuICBoYXNoLnVwZGF0ZShjb21taXRIYXNoKTtcblxuICBjb25zdCBlbnZpcm9ubWVudEpzb24gPSBKU09OLnN0cmluZ2lmeShcbiAgICBPYmplY3QuZW50cmllcyhwcm9qZWN0LmVudilcbiAgICAgIC5maWx0ZXIoKFtrZXldKSA9PiAhaWdub3JpbmdFbnZWYXJOYW1lcy5oYXMoa2V5KSlcbiAgICAgIC5zb3J0KChba2V5MV0sIFtrZXkyXSkgPT4ga2V5MS5sb2NhbGVDb21wYXJlKGtleTIpKVxuICApO1xuICBoYXNoLnVwZGF0ZShlbnZpcm9ubWVudEpzb24pO1xuXG4gIGF3YWl0IHVwZGF0ZUhhc2hXaXRoRGlmZlJlc3VsdChwcm9qZWN0LCBhcmd2LCBoYXNoKTtcbiAgY29uc3QgY29udGVudEhhc2ggPSBoYXNoLmRpZ2VzdCgnaGV4Jyk7XG5cbiAgY29uc3QgY2FjaGVkQ29udGVudEhhc2ggPSBhd2FpdCBpZ25vcmVFbm9lbnRBc3luYygoKSA9PiBmcy5wcm9taXNlcy5yZWFkRmlsZShjYWNoZUZpbGVQYXRoLCAndXRmOCcpKTtcbiAgcmV0dXJuIFtjYWNoZWRDb250ZW50SGFzaCA9PT0gY29udGVudEhhc2gsIGNhY2hlRmlsZVBhdGgsIGNvbnRlbnRIYXNoXTtcbn1cblxuY29uc3QgaW5jbHVkZVBhdHRlcm5zID0gWydzcmMvJywgJ3B1YmxpYy8nXTtcbmNvbnN0IGluY2x1ZGVTdWZmaXggPSBbXG4gICcuanMnLFxuICAnLmNqcycsXG4gICcubWpzJyxcbiAgJy5qc3gnLFxuICAnLnRzJyxcbiAgJy5jdHMnLFxuICAnLm10cycsXG4gICcudHN4JyxcbiAgJy5qc29uJyxcbiAgJy5icm93c2Vyc2xpc3RyYycsXG4gIC8vIEJlY2F1c2Ugc29tZSBidWlsZCBjb21tYW5kcyBhZmZlY3RlZCBieSBjaGFuZ2VzIGluIGBwYWNrYWdlLmpzb25gXG4gICdwYWNrYWdlLmpzb24nLFxuICAneWFybi5sb2NrJyxcbl07XG5jb25zdCBleGNsdWRlUGF0dGVybnMgPSBbJ3Rlc3QvJywgJ3Rlc3RzLycsICdfX3Rlc3RzX18vJywgJ3Rlc3QtZml4dHVyZXMvJ107XG5cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUhhc2hXaXRoRGlmZlJlc3VsdChcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+PixcbiAgaGFzaDogSGFzaFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKCdnaXQnLCBbJ2RpZmYnLCAnLS1uYW1lLW9ubHknXSwge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IHByb2plY3QuZW52LFxuICAgICAgc3RkaW86ICdwaXBlJyxcbiAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgfSk7XG4gICAgY29uc3QgZmlsZVBhdGhzID0gcmV0LnN0ZG91dFxuICAgICAgLnRyaW0oKVxuICAgICAgLnNwbGl0KCdcXG4nKVxuICAgICAgLm1hcCgoZmlsZVBhdGgpID0+XG4gICAgICAgIHByb2plY3QuZW52LldCX0VOViA9PT0gJ3Rlc3QnID8gZmlsZVBhdGgucmVwbGFjZSgvcGFja2FnZXNcXC9zY3JpcHRzXFwvdGVzdC1maXh0dXJlc1xcL1teL10rXFwvLywgJycpIDogZmlsZVBhdGhcbiAgICAgICk7XG4gICAgY29uc3QgZmlsdGVyZWRGaWxlUGF0aHMgPSBmaWxlUGF0aHMuZmlsdGVyKFxuICAgICAgKGZpbGVQYXRoKSA9PlxuICAgICAgICAoaW5jbHVkZVBhdHRlcm5zLnNvbWUoKHBhdHRlcm4pID0+IGZpbGVQYXRoLmluY2x1ZGVzKHBhdHRlcm4pKSB8fFxuICAgICAgICAgIGluY2x1ZGVTdWZmaXguc29tZSgoc3VmZml4KSA9PiBmaWxlUGF0aC5lbmRzV2l0aChzdWZmaXgpKSkgJiZcbiAgICAgICAgIWV4Y2x1ZGVQYXR0ZXJucy5zb21lKChwYXR0ZXJuKSA9PiBmaWxlUGF0aC5pbmNsdWRlcyhwYXR0ZXJuKSlcbiAgICApO1xuICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgQ2hhbmdlZCBmaWxlczogJHtmaWx0ZXJlZEZpbGVQYXRocy5qb2luKCcsICcpfWApO1xuICAgIH1cblxuICAgIC8vICdnaXQgZGlmZiAtLScgd29ya3Mgb25seSBvbiByb290RGlyUGF0aFxuICAgIGNvbnN0IHByb2MgPSBjaGlsZF9wcm9jZXNzLnNwYXduKCdnaXQnLCBbJ2RpZmYnLCAnLS0nLCAuLi5maWx0ZXJlZEZpbGVQYXRoc10sIHsgY3dkOiBwcm9qZWN0LnJvb3REaXJQYXRoIH0pO1xuICAgIHByb2Muc3Rkb3V0Py5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgICBoYXNoLnVwZGF0ZShkYXRhKTtcbiAgICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGRhdGEudG9TdHJpbmcoKSk7XG4gICAgICAgIGNvbnNvbGUuaW5mbygnSGFzaDonLCBoYXNoLmNvcHkoKS5kaWdlc3QoJ2hleCcpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBwcm9jLm9uKCdjbG9zZScsICgpID0+IHtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9KTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgeyBzbGVlcCB9IGZyb20gJy4vc2xlZXAuanMnO1xuXG4vKipcbiAqIENvbnZlcnQgYW4gb2JqZWN0IHRvIGFuIGVycm9yLlxuICogQHBhcmFtIG9iaiBUaGUgb2JqZWN0IHRvIGNvbnZlcnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcnJvcmlmeShvYmo6IHVua25vd24pOiBFcnJvciB7XG4gIGlmIChvYmogaW5zdGFuY2VvZiBFcnJvcikgcmV0dXJuIG9iajtcbiAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSByZXR1cm4gbmV3IEVycm9yKG9iaik7XG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihKU09OLnN0cmluZ2lmeShvYmopKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihTdHJpbmcob2JqKSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlnbm9yZUVycm9yPFQ+KGZuOiAoKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlRW5vZW50PFQ+KGZuOiAoKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgJiYgJ2NvZGUnIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFcnJvckFzeW5jPFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaWdub3JlRW5vZW50QXN5bmM8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXRyeU9wdGlvbnMge1xuICBiZWZvcmVSZXRyeT86IChlcnJvcjogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgaGFuZGxlRXJyb3I/OiAoZXJyb3I6IHVua25vd24pID0+IFByb21pc2U8dm9pZD47XG4gIHJldHJ5Q291bnQ/OiBudW1iZXI7XG4gIHJldHJ5TG9nZ2VyPzogKG1lc3NhZ2U6IHN0cmluZykgPT4gdm9pZDtcbiAgc2xlZXBNaWxsaXNlY29uZHM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogUmV0cnkgdGhlIGdpdmVuIGZ1bmN0aW9uLlxuICogQHBhcmFtIGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJldHJ5LlxuICogQHBhcmFtIGJlZm9yZVJldHJ5IFRoZSBmdW5jdGlvbiB0byBjYWxsIGltbWVkaWF0ZWx5IGJlZm9yZSByZXRyeWluZy5cbiAqIEBwYXJhbSBoYW5kbGVFcnJvciBUaGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIGFuIGVycm9yIG9jY3Vycy5cbiAqIEBwYXJhbSByZXRyeUNvdW50IFRoZSBtYXhpbXVtIG51bWJlciBvZiByZXRyaWVzLlxuICogQHBhcmFtIHJldHJ5TG9nZ2VyIFRoZSBmdW5jdGlvbiB0byBsb2cgcmV0cnlpbmcuXG4gKiBAcGFyYW0gc2xlZXBNaWxsaXNlY29uZHMgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gc2xlZXAgYmVmb3JlIHJldHJ5aW5nLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2l0aFJldHJ5PFQ+KFxuICBmdW5jOiAoZmFpbGVkQ291bnQ6IG51bWJlcikgPT4gUHJvbWlzZTxUPixcbiAgeyBiZWZvcmVSZXRyeSwgaGFuZGxlRXJyb3IsIHJldHJ5Q291bnQgPSAzLCByZXRyeUxvZ2dlciwgc2xlZXBNaWxsaXNlY29uZHMgPSAwIH06IFJldHJ5T3B0aW9ucyA9IHt9XG4pOiBQcm9taXNlPFQ+IHtcbiAgbGV0IGZhaWxlZENvdW50ID0gMDtcbiAgZm9yICg7Oykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZnVuYyhmYWlsZWRDb3VudCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGF3YWl0IGhhbmRsZUVycm9yPy4oZXJyb3IpO1xuICAgICAgZmFpbGVkQ291bnQrKztcbiAgICAgIGlmIChmYWlsZWRDb3VudCA+PSByZXRyeUNvdW50KSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgaWYgKHNsZWVwTWlsbGlzZWNvbmRzID4gMCkge1xuICAgICAgICBhd2FpdCBzbGVlcChzbGVlcE1pbGxpc2Vjb25kcyk7XG4gICAgICB9XG4gICAgICByZXRyeUxvZ2dlcj8uKGBSZXRyeSBkdWUgdG86ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLnN0YWNrIDogZXJyb3J9YCk7XG4gICAgICBhd2FpdCBiZWZvcmVSZXRyeT8uKGVycm9yKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24qIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZChjb21tYW5kTmFtZTogc3RyaW5nLCBwcm9qZWN0czogUHJvamVjdFtdKTogR2VuZXJhdG9yPFByb2plY3QsIHZvaWQsIHVua25vd24+IHtcbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzKSB7XG4gICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwiJHtjb21tYW5kTmFtZX1cIiBmb3IgJHtwcm9qZWN0Lm5hbWV9IC4uLmApO1xuXG4gICAgeWllbGQgcHJvamVjdDtcbiAgfVxufVxuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZEFsbFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5cbmltcG9ydCB7IHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZFV0aWxzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgb3V0c2lkZToge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0aGUgb3B0aW1pemF0aW9uIGlzIGV4ZWN1dGVkIG91dHNpZGUgYSBkb2NrZXIgY29udGFpbmVyIG9yIG5vdCcsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiAnbycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qgb3B0aW1pemVGb3JEb2NrZXJCdWlsZENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnb3B0aW1pemVGb3JEb2NrZXJCdWlsZCcsXG4gIGRlc2NyaWJlOiAnT3B0aW1pemUgY29uZmlndXJhdGlvbiB3aGVuIGJ1aWxkaW5nIGEgRG9ja2VyIGltYWdlJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kQWxsUHJvamVjdHMoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ29wdGltaXplRm9yRG9ja2VyQnVpbGQnLCBwcm9qZWN0cy5hbGwpKSB7XG4gICAgICBjb25zdCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gPSBwcm9qZWN0LnBhY2thZ2VKc29uO1xuICAgICAgY29uc3Qga2V5cyA9IFsnZGVwZW5kZW5jaWVzJywgJ2RldkRlcGVuZGVuY2llcyddIGFzIGNvbnN0O1xuICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgICBjb25zdCBkZXBzID0gcGFja2FnZUpzb25ba2V5XSB8fCB7fTtcbiAgICAgICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRlcHMpKSB7XG4gICAgICAgICAgaWYgKHZhbHVlPy5zdGFydHNXaXRoKCdnaXRAZ2l0aHViLmNvbTonKSkge1xuICAgICAgICAgICAgZGVwc1tuYW1lXSA9IGAuLyR7bmFtZX1gO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBvcHRpbWl6ZURldkRlcGVuZGVuY2llcyhhcmd2LCBwYWNrYWdlSnNvbik7XG5cbiAgICAgIG9wdGltaXplU2NyaXB0cyhwYWNrYWdlSnNvbik7XG5cbiAgICAgIG9wdGltaXplUm9vdFByb3BzKHBhY2thZ2VKc29uKTtcblxuICAgICAgaWYgKGFyZ3YuZHJ5UnVuKSBjb250aW51ZTtcblxuICAgICAgY29uc3QgZGlzdERpclBhdGggPSBhcmd2Lm91dHNpZGUgPyBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAnZGlzdCcpIDogcHJvamVjdC5kaXJQYXRoO1xuICAgICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIoZGlzdERpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGguam9pbihkaXN0RGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCBKU09OLnN0cmluZ2lmeShwYWNrYWdlSnNvbiksICd1dGY4Jyk7XG4gICAgfVxuICAgIGlmICghYXJndi5kcnlSdW4gJiYgIWFyZ3Yub3V0c2lkZSkge1xuICAgICAgY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoJ3lhcm4nLCB7XG4gICAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBvcHRpbWl6ZURldkRlcGVuZGVuY2llcyhhcmd2OiBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPiwgcGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGlmICghYXJndi5vdXRzaWRlKSB7XG4gICAgZGVsZXRlIHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcztcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBkZXZEZXBzID0gcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzIHx8IHt9O1xuICBjb25zdCBuYW1lV29yZHNUb0JlUmVtb3ZlZCA9IFtcbiAgICAnYXJ0aWxsZXJ5JyxcbiAgICAnY29uY3VycmVudGx5JyxcbiAgICAnY29udmVudGlvbmFsLWNoYW5nZWxvZy1jb252ZW50aW9uYWxjb21taXRzJyxcbiAgICAnZXNsaW50JyxcbiAgICAnaHVza3knLFxuICAgICdpbWFnZW1pbicsXG4gICAgJ2plc3QnLFxuICAgICdraWxsLXBvcnQnLFxuICAgICdsaW50LXN0YWdlZCcsXG4gICAgJ29wZW4tY2xpJyxcbiAgICAncGxheXdyaWdodCcsXG4gICAgJ3ByZXR0aWVyJyxcbiAgICAncGluc3QnLFxuICAgICdzb3J0LXBhY2thZ2UtanNvbicsXG4gICAgJ3dhaXQtb24nLFxuICAgICdzZW1hbnRpYy1yZWxlYXNlJyxcbiAgICAndml0ZXN0JyxcbiAgXTtcbiAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKGRldkRlcHMpKSB7XG4gICAgaWYgKFxuICAgICAgbmFtZVdvcmRzVG9CZVJlbW92ZWQuc29tZSgod29yZCkgPT4gbmFtZS5pbmNsdWRlcyh3b3JkKSkgfHxcbiAgICAgICghYXJndi5vdXRzaWRlICYmIG5hbWUuaW5jbHVkZXMoJ3dpbGxib29zdGVyJykgJiYgbmFtZS5pbmNsdWRlcygnY29uZmlnJykpXG4gICAgKSB7XG4gICAgICBkZWxldGUgZGV2RGVwc1tuYW1lXTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gb3B0aW1pemVTY3JpcHRzKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBjb25zdCBuYW1lV29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cyA9IFsnY2hlY2snLCAnZGVwbG95JywgJ2Zvcm1hdCcsICdsaW50JywgJ3N0YXJ0JywgJ3Rlc3QnXTtcbiAgY29uc3QgY29udGVudFdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMgPSBbJ3BpbnN0ICcsICdodXNreSAnXTtcbiAgY29uc3Qgc2NyaXB0cyA9IChwYWNrYWdlSnNvbi5zY3JpcHRzIHx8IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBmb3IgKGNvbnN0IFtuYW1lLCBjb250ZW50XSBvZiBPYmplY3QuZW50cmllcyhzY3JpcHRzKSkge1xuICAgIGlmIChcbiAgICAgIG5hbWVXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzLnNvbWUoKHdvcmQpID0+IG5hbWUuaW5jbHVkZXMod29yZCkpIHx8XG4gICAgICAvLyBTdXBwb3J0IFwiaHVza3lcIiBzaW5jZSBodXNreSB2OSByZXF1aXJlcyBgXCJwb3N0aW5zdGFsbFwiOiBcImh1c2t5XCJgXG4gICAgICBjb250ZW50V29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cy5zb21lKCh3b3JkKSA9PiBjb250ZW50LmluY2x1ZGVzKHdvcmQpIHx8IGNvbnRlbnQudHJpbSgpID09PSB3b3JkLnRyaW0oKSlcbiAgICApIHtcbiAgICAgIGRlbGV0ZSBzY3JpcHRzW25hbWVdO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBvcHRpbWl6ZVJvb3RQcm9wcyhwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnByaXZhdGU7XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5wdWJsaXNoQ29uZmlnO1xuICBkZWxldGUgcGFja2FnZUpzb24ucHJldHRpZXI7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bnRpbWVXaXRoQXJncyB9IGZyb20gJy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgUHJpc21hIGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBQUklTTUFgIGlzIHJlcGxhY2VkIHdpdGggYFlBUk4gcHJpc21hYCBvciBgWUFSTiBibGl0eiBwcmlzbWFgXG4gKiBhbmQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFByaXNtYVNjcmlwdHMge1xuICBkZXBsb3koXzogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICdQUklTTUEgbWlncmF0ZSBkZXBsb3knO1xuICB9XG5cbiAgZGVwbG95Rm9yY2UocHJvamVjdDogUHJvamVjdCwgYmFja3VwUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBkaXJOYW1lID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LlsnYmxpdHonXSA/ICdkYicgOiAncHJpc21hJztcbiAgICAvLyBEb24ndCBza2lwIFwibWlncmF0ZSBkZXBsb3lcIiBiZWNhdXNlIHJlc3RvcmVkIGRhdGFiYXNlIG1heSBiZSBvbGRlciB0aGFuIHRoZSBjdXJyZW50IHNjaGVtYS5cbiAgICByZXR1cm4gYHJtIC1SZiAke2Rpck5hbWV9L21vdW50L3Byb2Quc3FsaXRlMyo7IFBSSVNNQSBtaWdyYXRlIHJlc2V0IC0tZm9yY2UgJiYgcm0gLVJmICR7ZGlyTmFtZX0vbW91bnQvcHJvZC5zcWxpdGUzKlxuICAgICAgJiYgbGl0ZXN0cmVhbSByZXN0b3JlIC1vICR7ZGlyTmFtZX0vbW91bnQvcHJvZC5zcWxpdGUzICR7YmFja3VwUGF0aH0gJiYgQUxMT1dfVE9fU0tJUF9TRUVEPTAgUFJJU01BIG1pZ3JhdGUgZGVwbG95YDtcbiAgfVxuXG4gIGxpdGVzdHJlYW0oXzogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3J1bnRpbWVXaXRoQXJnc30gLWUgJ1xuY29uc3QgeyBQcmlzbWFDbGllbnQgfSA9IHJlcXVpcmUoXCJAcHJpc21hL2NsaWVudFwiKTtcbm5ldyBQcmlzbWFDbGllbnQoKS4kcXVlcnlSYXdcXGBQUkFHTUEgam91cm5hbF9tb2RlID0gV0FMO1xcYFxuICAuY2F0Y2goKGVycm9yKSA9PiB7IGNvbnNvbGUubG9nKFwiRmFpbGVkIGR1ZSB0bzpcIiwgZXJyb3IpOyBwcm9jZXNzLmV4aXQoMSk7IH0pO1xuJ2A7XG4gIH1cblxuICBtaWdyYXRlKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUFJJU01BIG1pZ3JhdGUgZGVwbG95ICYmIFBSSVNNQSBnZW5lcmF0ZSAmJiAke3RoaXMuc2VlZChwcm9qZWN0KX1gO1xuICB9XG5cbiAgbWlncmF0ZURldihfOiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBSSVNNQSBtaWdyYXRlIGRldmA7XG4gIH1cblxuICByZXNldChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICAvLyBjZi4gaHR0cHM6Ly93d3cucHJpc21hLmlvL2RvY3MvZ3VpZGVzL2RhdGFiYXNlL3NlZWQtZGF0YWJhc2UjaW50ZWdyYXRlZC1zZWVkaW5nLXdpdGgtcHJpc21hLW1pZ3JhdGVcbiAgICAvLyBCbGl0eiBkb2VzIG5vdCB0cmlnZ2VyIHNlZWQgYXV0b21hdGljYWxseSwgc28gd2UgbmVlZCB0byBydW4gaXQgbWFudWFsbHkuXG4gICAgcmV0dXJuIGBQUklTTUEgbWlncmF0ZSByZXNldCAtLWZvcmNlIC0tc2tpcC1zZWVkICYmICR7dGhpcy5zZWVkKHByb2plY3QpfWA7XG4gICAgLy8gSSdtIG5vdCBzdXJlIHdoeSB3ZSBuZWVkIHRvIHJlbW92ZSBhbGwgc3FsaXRlIGZpbGVzLCBzbyBJIGNvbW1lbnRlZCBvdXQgdGhlIGZvbGxvd2luZyBsaW5lLlxuICAgIC8vIHJldHVybiBgdHJ1ZSAkKHJtIC1SZiBkYi8qKi8qLnNxbGl0ZSogMj4gL2Rldi9udWxsKSAmJiB0cnVlICQocm0gLVJmIHByaXNtYS8qKi8qLnNxbGl0ZSogMj4gL2Rldi9udWxsKSAmJiBQUklTTUEgbWlncmF0ZSByZXNldCAtLWZvcmNlIC0tc2tpcC1zZWVkICYmICR7dGhpcy5zZWVkKCl9YDtcbiAgfVxuXG4gIHJlc3RvcmUocHJvamVjdDogUHJvamVjdCwgYmFja3VwUGF0aDogc3RyaW5nLCBvdXRwdXRQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRpck5hbWUgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uWydibGl0eiddID8gJ2RiJyA6ICdwcmlzbWEnO1xuICAgIHJldHVybiBgcm0gLVJmICR7ZGlyTmFtZX0vcmVzdG9yZWQuc3FsaXRlMzsgR09PR0xFX0FQUExJQ0FUSU9OX0NSRURFTlRJQUxTPWdjcC1zYS1rZXkuanNvbiBsaXRlc3RyZWFtIHJlc3RvcmUgLW8gJHtvdXRwdXRQYXRofSAke2JhY2t1cFBhdGh9YDtcbiAgfVxuXG4gIHNlZWQocHJvamVjdDogUHJvamVjdCwgc2NyaXB0UGF0aD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5bJ2JsaXR6J10pXG4gICAgICByZXR1cm4gYFlBUk4gYmxpdHogZGIgc2VlZCR7c2NyaXB0UGF0aCA/IGAgLWYgJHtzY3JpcHRQYXRofWAgOiAnJ31gO1xuICAgIGlmIChzY3JpcHRQYXRoKSByZXR1cm4gJ0JVTiBidWlsZC10cyBydW4gcHJpc21hL3NlZWRzLnRzJztcbiAgICBpZiAoKHByb2plY3QucGFja2FnZUpzb24ucHJpc21hIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWQpPy5bJ3NlZWQnXSkgcmV0dXJuIGBZQVJOIHByaXNtYSBkYiBzZWVkYDtcbiAgICByZXR1cm4gYGlmIFsgLWUgXCJwcmlzbWEvc2VlZHMudHNcIiBdOyB0aGVuIEJVTiBidWlsZC10cyBydW4gcHJpc21hL3NlZWRzLnRzOyBmaWA7XG4gIH1cblxuICBzdHVkaW8oXzogUHJvamVjdCwgZGJVcmxPclBhdGg/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCBwcmVmaXggPSAnJztcbiAgICBpZiAoZGJVcmxPclBhdGgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG5ldyBVUkwoZGJVcmxPclBhdGgpO1xuICAgICAgICBwcmVmaXggPSBgREFUQUJBU0VfVVJMPSR7ZGJVcmxPclBhdGh9IGA7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgY29uc3QgYWJzb2x1dGVQYXRoID0gcGF0aC5yZXNvbHZlKGRiVXJsT3JQYXRoKTtcbiAgICAgICAgY29uc29sZS5pbmZvKGRiVXJsT3JQYXRoLCBhYnNvbHV0ZVBhdGgpO1xuICAgICAgICBwcmVmaXggPSBgREFUQUJBU0VfVVJMPWZpbGU6Ly8ke2Fic29sdXRlUGF0aH0gYDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGAke3ByZWZpeH1QUklTTUEgc3R1ZGlvYDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgcHJpc21hU2NyaXB0cyA9IG5ldyBQcmlzbWFTY3JpcHRzKCk7XG4iLCJpbXBvcnQgeyBzcGF3blN5bmMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5pbXBvcnQga2lsbFBvcnRQcm9jZXNzIGZyb20gJ2tpbGwtcG9ydCc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZCwgcHJpbnRTdGFydCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcblxuY29uc3Qga2lsbGVkID0gbmV3IFNldDxudW1iZXIgfCBzdHJpbmc+KCk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBraWxsUG9ydFByb2Nlc3NJbW1lZGlhdGVseUFuZE9uRXhpdChwb3J0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQga2lsbFBvcnRQcm9jZXNzSGFuZGxpbmdFcnJvcnMocG9ydCk7XG4gIGNvbnN0IGtpbGxGdW5jID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGlmIChraWxsZWQuaGFzKHBvcnQpKSByZXR1cm47XG5cbiAgICBraWxsZWQuYWRkKHBvcnQpO1xuICAgIGF3YWl0IGtpbGxQb3J0UHJvY2Vzc0hhbmRsaW5nRXJyb3JzKHBvcnQpO1xuICB9O1xuICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ2JlZm9yZUV4aXQnLCAnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddKSB7XG4gICAgcHJvY2Vzcy5vbihzaWduYWwsIGtpbGxGdW5jKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBraWxsUG9ydFByb2Nlc3NIYW5kbGluZ0Vycm9ycyhwb3J0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBraWxsUG9ydFByb2Nlc3MocG9ydCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25TeW5jT25FeGl0KHNjcmlwdDogc3RyaW5nLCBwcm9qZWN0OiBQcm9qZWN0KTogdm9pZCB7XG4gIGNvbnN0IGtpbGxGdW5jID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGlmIChraWxsZWQuaGFzKHNjcmlwdCkpIHJldHVybjtcblxuICAgIGtpbGxlZC5hZGQoc2NyaXB0KTtcbiAgICBwcmludFN0YXJ0KHNjcmlwdCwgcHJvamVjdCk7XG4gICAgY29uc3QgeyBzdGF0dXMgfSA9IHNwYXduU3luYyhzY3JpcHQsIHsgY3dkOiBwcm9qZWN0LmRpclBhdGgsIHNoZWxsOiB0cnVlLCBzdGRpbzogJ2luaGVyaXQnIH0pO1xuICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQoc2NyaXB0LCBzdGF0dXMsIHt9KTtcbiAgfTtcbiAgZm9yIChjb25zdCBzaWduYWwgb2YgWydiZWZvcmVFeGl0JywgJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXSkge1xuICAgIHByb2Nlc3Mub24oc2lnbmFsLCBraWxsRnVuYyk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFByb21pc2VQb29sIH0gZnJvbSAnbWluaW1hbC1wcm9taXNlLXBvb2wnO1xuXG5leHBvcnQgY29uc3QgcHJvbWlzZVBvb2wgPSBuZXcgUHJvbWlzZVBvb2woKTtcbiIsImltcG9ydCB7IHNwYXduQXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGtpbGxQb3J0UHJvY2Vzc0ltbWVkaWF0ZWx5QW5kT25FeGl0IH0gZnJvbSAnLi4vdXRpbHMvcHJvY2Vzcy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGlzUnVubmluZ09uQnVuLCBwYWNrYWdlTWFuYWdlcldpdGhBcmdzIH0gZnJvbSAnLi4vdXRpbHMvcnVudGltZS5qcyc7XG5cbmludGVyZmFjZSBPcHRpb25zIHtcbiAgZXhpdElmRmFpbGVkPzogYm9vbGVhbjtcbiAgdGltZW91dD86IG51bWJlcjtcbn1cblxuY29uc3QgZGVmYXVsdE9wdGlvbnM6IE9wdGlvbnMgPSB7XG4gIGV4aXRJZkZhaWxlZDogdHJ1ZSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5XaXRoU3Bhd24oXG4gIHNjcmlwdDogc3RyaW5nLFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+PixcbiAgb3B0czogT3B0aW9ucyA9IGRlZmF1bHRPcHRpb25zXG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCBbcHJpbnRhYmxlU2NyaXB0LCBydW5uYWJsZVNjcmlwdF0gPSBub3JtYWxpemVTY3JpcHQoc2NyaXB0LCBwcm9qZWN0KTtcbiAgcHJpbnRTdGFydChwcmludGFibGVTY3JpcHQsIHByb2plY3QpO1xuICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgcHJpbnRTdGFydChydW5uYWJsZVNjcmlwdCwgcHJvamVjdCwgJ1N0YXJ0IChyYXcpJywgdHJ1ZSk7XG4gIH1cbiAgaWYgKGFyZ3YuZHJ5UnVuKSB7XG4gICAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChwcmludGFibGVTY3JpcHQsIDAsIG9wdHMpO1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgY29uc3QgcG9ydCA9IHJ1bm5hYmxlU2NyaXB0Lm1hdGNoKC9odHRwLWdldDpcXC9cXC8xMjcuMC4wLjE6KFxcZCspLyk/LlsxXTtcbiAgaWYgKHJ1bm5hYmxlU2NyaXB0LmluY2x1ZGVzKCd3YWl0LW9uJykgJiYgcG9ydCAmJiAhcnVubmFibGVTY3JpcHQuaW5jbHVkZXMoJ2RvY2tlciBydW4nKSkge1xuICAgIGF3YWl0IGtpbGxQb3J0UHJvY2Vzc0ltbWVkaWF0ZWx5QW5kT25FeGl0KE51bWJlcihwb3J0KSk7XG4gIH1cbiAgY29uc3QgcmV0ID0gYXdhaXQgc3Bhd25Bc3luYyhydW5uYWJsZVNjcmlwdCwgdW5kZWZpbmVkLCB7XG4gICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgZW52OiBwcm9qZWN0LmVudixcbiAgICBzaGVsbDogdHJ1ZSxcbiAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIHRpbWVvdXQ6IG9wdHM/LnRpbWVvdXQsXG4gICAga2lsbE9uRXhpdDogdHJ1ZSxcbiAgICB2ZXJib3NlOiBhcmd2LnZlcmJvc2UsXG4gIH0pO1xuICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKHByaW50YWJsZVNjcmlwdCwgcmV0LnN0YXR1cywgb3B0cyk7XG4gIHJldHVybiByZXQuc3RhdHVzID8/IDE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBydW5XaXRoU3Bhd25JblBhcmFsbGVsKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+Pj4sXG4gIG9wdHM6IE9wdGlvbnMgPSBkZWZhdWx0T3B0aW9uc1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBwcm9taXNlUG9vbC5ydW4oYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IFtwcmludGFibGVTY3JpcHQsIHJ1bm5hYmxlU2NyaXB0XSA9IG5vcm1hbGl6ZVNjcmlwdChzY3JpcHQsIHByb2plY3QpO1xuICAgIHByaW50U3RhcnQocHJpbnRhYmxlU2NyaXB0LCBwcm9qZWN0LCAnU3RhcnQgKHBhcmFsbGVsKScsIHRydWUpO1xuICAgIGlmIChhcmd2LmRyeVJ1bikge1xuICAgICAgcHJpbnRTdGFydChwcmludGFibGVTY3JpcHQsIHByb2plY3QsICdTdGFydGVkIChsb2cpJyk7XG4gICAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICAgIHByaW50U3RhcnQocnVubmFibGVTY3JpcHQsIHByb2plY3QsICdTdGFydGVkIChyYXcpJywgdHJ1ZSk7XG4gICAgICB9XG4gICAgICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKHByaW50YWJsZVNjcmlwdCwgMCwgb3B0cyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcmV0ID0gYXdhaXQgc3Bhd25Bc3luYyhydW5uYWJsZVNjcmlwdCwgdW5kZWZpbmVkLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogcHJvamVjdC5lbnYsXG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICAgIHN0ZGlvOiAncGlwZScsXG4gICAgICB0aW1lb3V0OiBvcHRzPy50aW1lb3V0LFxuICAgICAgbWVyZ2VPdXRBbmRFcnJvcjogdHJ1ZSxcbiAgICAgIGtpbGxPbkV4aXQ6IHRydWUsXG4gICAgICB2ZXJib3NlOiBhcmd2LnZlcmJvc2UsXG4gICAgfSk7XG4gICAgcHJpbnRTdGFydChwcmludGFibGVTY3JpcHQsIHByb2plY3QsICdTdGFydGVkIChsb2cpJyk7XG4gICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgcHJpbnRTdGFydChydW5uYWJsZVNjcmlwdCwgcHJvamVjdCwgJ1N0YXJ0ZWQgKHJhdyknLCB0cnVlKTtcbiAgICB9XG4gICAgY29uc3Qgb3V0ID0gcmV0LnN0ZG91dC50cmltKCk7XG4gICAgaWYgKG91dCkgY29uc29sZS5pbmZvKG91dCk7XG4gICAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChwcmludGFibGVTY3JpcHQsIHJldC5zdGF0dXMsIG9wdHMpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplU2NyaXB0KHNjcmlwdDogc3RyaW5nLCBwcm9qZWN0OiBQcm9qZWN0KTogW3N0cmluZywgc3RyaW5nXSB7XG4gIGxldCBuZXdTY3JpcHQgPSBzY3JpcHRcbiAgICAucmVwbGFjZUFsbCgnXFxuJywgJycpXG4gICAgLnJlcGxhY2VBbGwoL1xcc1xccysvZywgJyAnKVxuICAgIC5yZXBsYWNlQWxsKCdQUklTTUEgJywgcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LlsnYmxpdHonXSA/ICdZQVJOIGJsaXR6IHByaXNtYSAnIDogJ1lBUk4gcHJpc21hICcpXG4gICAgLnJlcGxhY2VBbGwoJ0JVTiAnLCBwcm9qZWN0LmlzQnVuQXZhaWxhYmxlID8gJ2J1biAtLWJ1biBydW4gJyA6ICdZQVJOICcpO1xuICBpZiAoaXNSdW5uaW5nT25CdW4pIHtcbiAgICBuZXdTY3JpcHQgPSBuZXdTY3JpcHRcbiAgICAgIC5yZXBsYWNlQWxsKCdidWlsZC10cyBydW4nLCAnYnVuIC0tYnVuIHJ1bicpXG4gICAgICAucmVwbGFjZUFsbCgnZGlzdC9pbmRleC5qcycsICdzcmMvaW5kZXgudHMnKVxuICAgICAgLnJlcGxhY2VBbGwoLyhZQVJOICk/dml0ZXN0IHJ1bi9nLCAnYnVuIHRlc3QnKVxuICAgICAgLnJlcGxhY2VBbGwoJyAtLWNvbG9yIC0tcGFzc1dpdGhOb1Rlc3RzIC0tYWxsb3dPbmx5JywgJycpO1xuICB9XG4gIG5ld1NjcmlwdCA9IG5ld1NjcmlwdC50cmltKCk7XG4gIHJldHVybiBbXG4gICAgbmV3U2NyaXB0LnJlcGxhY2VBbGwoJ1lBUk4gJywgYCR7cGFja2FnZU1hbmFnZXJXaXRoQXJnc30gYCksXG4gICAgbmV3U2NyaXB0LnJlcGxhY2VBbGwoJ1lBUk4gJywgIWlzUnVubmluZ09uQnVuICYmIHByb2plY3QuYmluRXhpc3RzID8gJycgOiBgJHtwYWNrYWdlTWFuYWdlcldpdGhBcmdzfSBgKSxcbiAgXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdDogc3RyaW5nLCBwcm9qZWN0OiBQcm9qZWN0LCBwcmVmaXggPSAnU3RhcnQnLCB3ZWFrID0gZmFsc2UpOiB2b2lkIHtcbiAgY29uc29sZS5pbmZvKFxuICAgICdcXG4nICtcbiAgICAgICh3ZWFrID8gY2hhbGsuZ3JheSA6IGNoYWxrLmN5YW4pKGNoYWxrLmJvbGQoYCR7cHJlZml4fTpgKSwgbm9ybWFsaXplZFNjcmlwdCkgK1xuICAgICAgY2hhbGsuZ3JheShgIGF0ICR7cHJvamVjdC5kaXJQYXRofWApXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgZXhpdENvZGU6IG51bWJlciB8IG51bGwsXG4gIG9wdHM6IE9taXQ8T3B0aW9ucywgJ3RpbWVvdXQnPlxuKTogdm9pZCB7XG4gIGlmIChleGl0Q29kZSA9PT0gMCkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihjaGFsay5ib2xkKCdGaW5pc2hlZDonKSwgc2NyaXB0KSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLnJlZChjaGFsay5ib2xkKGBGYWlsZWQgKGV4aXQgY29kZSAke2V4aXRDb2RlfSk6IGApLCBzY3JpcHQpKTtcbiAgICBpZiAob3B0cy5leGl0SWZGYWlsZWQgIT09IGZhbHNlKSB7XG4gICAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUgPz8gMSk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IEVudlJlYWRlck9wdGlvbnMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmRBbGxQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcHJpc21hU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvcHJpc21hU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24gfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5cbmltcG9ydCB7IHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZFV0aWxzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgcHJpc21hQ29tbWFuZDogQ29tbWFuZE1vZHVsZSA9IHtcbiAgY29tbWFuZDogJ3ByaXNtYScsXG4gIGRlc2NyaWJlOiAnUnVuIHByaXNtYSBjb21tYW5kcycsXG4gIGJ1aWxkZXI6ICh5YXJncykgPT4ge1xuICAgIHJldHVybiB5YXJnc1xuICAgICAgLmNvbW1hbmQoZGVwbG95Q29tbWFuZClcbiAgICAgIC5jb21tYW5kKGRlcGxveUZvcmNlQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKGxpdGVzdHJlYW1Db21tYW5kKVxuICAgICAgLmNvbW1hbmQobWlncmF0ZUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChtaWdyYXRlRGV2Q29tbWFuZClcbiAgICAgIC5jb21tYW5kKHJlc2V0Q29tbWFuZClcbiAgICAgIC5jb21tYW5kKHJlc3RvcmVDb21tYW5kKVxuICAgICAgLmNvbW1hbmQoc2VlZENvbW1hbmQpXG4gICAgICAuY29tbWFuZChzdHVkaW9Db21tYW5kKVxuICAgICAgLmNvbW1hbmQoZGVmYXVsdENvbW1hbmQpXG4gICAgICAuZGVtYW5kQ29tbWFuZCgpO1xuICB9LFxuICBoYW5kbGVyKCkge1xuICAgIC8vIERvIG5vdGhpbmdcbiAgfSxcbn07XG5cbmNvbnN0IGRlcGxveUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnZGVwbG95JyxcbiAgZGVzY3JpYmU6ICdBcHBseSBtaWdyYXRpb24gdG8gREIgd2l0aG91dCBpbml0aWFsaXppbmcgaXQnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgZGVwbG95JywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5kZXBsb3kocHJvamVjdCksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGRlcGxveUZvcmNlQnVpbGRlciA9IHtcbiAgLi4uYnVpbGRlcixcbiAgJ2JhY2t1cC1wYXRoJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBza2lwIGFjdHVhbCBjb21tYW5kIGV4ZWN1dGlvbicsXG4gICAgZGVtYW5kT3B0aW9uOiB0cnVlLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAnYicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBkZXBsb3lGb3JjZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgZGVwbG95Rm9yY2VCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdkZXBsb3ktZm9yY2UgPGJhY2t1cC1wYXRoPicsXG4gIGRlc2NyaWJlOiBcIkZvcmNlIHRvIGFwcGx5IG1pZ3JhdGlvbiB0byBEQiB1dGlsaXppbmcgTGl0ZXN0cmVhbSdzIGJhY2t1cCB3aXRob3V0IGluaXRpYWxpemluZyBpdFwiLFxuICBidWlsZGVyOiBkZXBsb3lGb3JjZUJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSBkZXBsb3ktZm9yY2UnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLmRlcGxveUZvcmNlKHByb2plY3QsIGFyZ3YuYmFja3VwUGF0aCksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGxpdGVzdHJlYW1Db21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2xpdGVzdHJlYW0nLFxuICBkZXNjcmliZTogJ1NldHVwIERCIGZvciBMaXRlc3RyZWFtJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIGxpdGVzdHJlYW0nLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLmxpdGVzdHJlYW0ocHJvamVjdCksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IG1pZ3JhdGVDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ21pZ3JhdGUnLFxuICBkZXNjcmliZTogJ0FwcGx5IG1pZ3JhdGlvbiB0byBEQiB3aXRoIGluaXRpYWxpemluZyBpdCcsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSBtaWdyYXRlJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5taWdyYXRlKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBtaWdyYXRlRGV2Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdtaWdyYXRlLWRldicsXG4gIGRlc2NyaWJlOiAnQ3JlYXRlIGEgbWlncmF0aW9uIGZpbGUnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgbWlncmF0ZS1kZXYnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLm1pZ3JhdGVEZXYocHJvamVjdCksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IHJlc2V0Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdyZXNldCcsXG4gIGRlc2NyaWJlOiAnUmVzZXQgREInLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgcmVzZXQnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLnJlc2V0KHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCByZXN0b3JlQnVpbGRlciA9IHtcbiAgLi4uZGVwbG95Rm9yY2VCdWlsZGVyLFxuICBvdXRwdXQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ091dHB1dCBwYXRoIG9mIHRoZSByZXN0b3JlZCBkYXRhYmFzZS4gRGVmYXVsdHMgdG8gXCI8ZGJ8cHJpc21hPi9yZXN0b3JlZC5zcWxpdGUzXCIuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IHJlc3RvcmVDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHJlc3RvcmVCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdyZXN0b3JlIDxiYWNrdXAtcGF0aD4nLFxuICBkZXNjcmliZTogXCJSZXN0b3JlIERCIGZyb20gTGl0ZXN0cmVhbSdzIGJhY2t1cFwiLFxuICBidWlsZGVyOiByZXN0b3JlQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIHJlc3RvcmUnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGNvbnN0IG91dHB1dCA9XG4gICAgICAgIGFyZ3Yub3V0cHV0IHx8XG4gICAgICAgIChwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uWydibGl0eiddID8gJ2RiL3Jlc3RvcmVkLnNxbGl0ZTMnIDogJ3ByaXNtYS9yZXN0b3JlZC5zcWxpdGUzJyk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5yZXN0b3JlKHByb2plY3QsIGFyZ3YuYmFja3VwUGF0aCwgb3V0cHV0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3Qgc2VlZEJ1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gIGZpbGU6IHtcbiAgICBhbGlhczogJ2YnLFxuICAgIGRlc2NyaXB0aW9uOiAnUGF0aCBvZiB0aGUgc2VlZCBzY3JpcHQuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IHNlZWRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNlZWRCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzZWVkJyxcbiAgZGVzY3JpYmU6ICdQb3B1bGF0ZSBEQiB3aXRoIHNlZWQgZGF0YScsXG4gIGJ1aWxkZXI6IHNlZWRCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgc2VlZCcsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMuc2VlZChwcm9qZWN0LCBhcmd2LmZpbGUpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBzdHVkaW9CdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICAnZGItdXJsLW9yLXBhdGgnOiB7XG4gICAgZGVzY3JpcHRpb246ICdVUkwgb3IgcGF0aCB0byB0aGUgZGF0YWJhc2UnLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxuICByZXN0b3JlZDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBvcGVuIHRoZSBkZWZhdWx0IHJlc3RvcmVkIGRhdGFiYXNlICg8ZGJ8cHJpc21hPi9yZXN0b3JlZC5zcWxpdGUzKS4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IHN0dWRpb0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc3R1ZGlvQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc3R1ZGlvIFtkYi11cmwtb3ItcGF0aF0nLFxuICBkZXNjcmliZTogJ09wZW4gUHJpc21hIFN0dWRpbycsXG4gIGJ1aWxkZXI6IHN0dWRpb0J1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGlmIChhcmd2LnJlc3RvcmVkICYmIGFyZ3YuZGJVcmxPclBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91IGNhbm5vdCBzcGVjaWZ5IGJvdGggLS1yZXN0b3JlZCBhbmQgLS1kYi11cmwtb3ItcGF0aC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgc3R1ZGlvJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBjb25zdCBkYlVybE9yUGF0aCA9IGFyZ3YucmVzdG9yZWRcbiAgICAgICAgPyBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uWydibGl0eiddXG4gICAgICAgICAgPyAnZGIvcmVzdG9yZWQuc3FsaXRlMydcbiAgICAgICAgICA6ICdwcmlzbWEvcmVzdG9yZWQuc3FsaXRlMydcbiAgICAgICAgOiBhcmd2LmRiVXJsT3JQYXRoPy50b1N0cmluZygpO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMuc3R1ZGlvKHByb2plY3QsIGRiVXJsT3JQYXRoKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgZGVmYXVsdENvbW1hbmRCdWlsZGVyID0geyBhcmdzOiB7IHR5cGU6ICdhcnJheScgfSB9IGFzIGNvbnN0O1xuXG5jb25zdCBkZWZhdWx0Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBkZWZhdWx0Q29tbWFuZEJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJyQwIFthcmdzLi5dJyxcbiAgZGVzY3JpYmU6ICdQYXNzIHRoZSBjb21tYW5kIGFuZCBhcmd1bWVudHMgdG8gcHJpc21hIGFzIGlzJyxcbiAgYnVpbGRlcjogZGVmYXVsdENvbW1hbmRCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCBzY3JpcHQgPSBgJHthcmd2LmFyZ3M/LmpvaW4oJyAnKSA/PyAnJ31gLnRyaW1FbmQoKTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKGBwcmlzbWEgJHtzY3JpcHR9YCwgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYFBSSVNNQSAke3NjcmlwdH1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5hc3luYyBmdW5jdGlvbiBmaW5kUHJpc21hUHJvamVjdHMoYXJndjogRW52UmVhZGVyT3B0aW9ucyk6IFByb21pc2U8UHJvamVjdFtdPiB7XG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZEFsbFByb2plY3RzKGFyZ3YpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGNvbnN0IGZpbHRlcmVkID0gcHJvamVjdHMuYWxsLmZpbHRlcihcbiAgICAocHJvamVjdCkgPT4gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LlsncHJpc21hJ10gfHwgcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LlsncHJpc21hJ11cbiAgKTtcbiAgaWYgKGZpbHRlcmVkLmxlbmd0aCA9PT0gMCkge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcmlzbWEgcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG4gIHJldHVybiBmaWx0ZXJlZDtcbn1cbiIsImltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgcmV0cnk6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0EgbWF4aW11bSByZXRyeSBjb3VudCcsXG4gICAgdHlwZTogJ251bWJlcicsXG4gICAgYWxpYXM6ICdyJyxcbiAgICBkZWZhdWx0OiAzLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgYXJndW1lbnRzQnVpbGRlciA9IHtcbiAgY29tbWFuZDoge1xuICAgIGRlc2NyaXB0aW9uOiAnQSBjb21tYW5kIHRvIHJldHJ5JyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbiAgYXJnczoge1xuICAgIGRlc2NyaXB0aW9uOiAnQXJndW1lbnRzIGZvciB0aGUgY29tbWFuZCcsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCByZXRyeUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8XG4gIHVua25vd24sXG4gIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXIgJiB0eXBlb2YgYXJndW1lbnRzQnVpbGRlcj5cbj4gPSB7XG4gIGNvbW1hbmQ6ICdyZXRyeSBbY29tbWFuZF0gW2FyZ3MuLi5dJyxcbiAgZGVzY3JpYmU6ICdSZXRyeSB0aGUgZ2l2ZW4gY29tbWFuZCB1bnRpbCBpdCBzdWNjZWVkcycsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0KSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgY21kQW5kQXJncyA9IFthcmd2LmNvbW1hbmQsIC4uLihhcmd2LmFyZ3MgPz8gW10pLCAuLi5hcmd2Ll8uc2xpY2UoMSldLmZpbHRlcihCb29sZWFuKTtcbiAgICBsZXQgbGFzdFN0YXR1cyA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmd2LnJldHJ5OyBpKyspIHtcbiAgICAgIGlmIChpID4gMCkge1xuICAgICAgICBjb25zb2xlLmluZm8oYFxcbiR7Y2hhbGsueWVsbG93KGAjJHtpfSBSZXRyeWluZzogJHtjbWRBbmRBcmdzLmpvaW4oJyAnKX1gKX1gKTtcbiAgICAgIH1cbiAgICAgIC8vIFRPRE86IHNob3VsZCB3ZSBhZGQgc2luZ2xlIHF1b3RlcyBhcm91bmQgZWFjaCBhcmd1bWVudD9cbiAgICAgIGxhc3RTdGF0dXMgPSBhd2FpdCBydW5XaXRoU3Bhd24oY21kQW5kQXJncy5qb2luKCcgJyksIHByb2plY3QsIGFyZ3YsIHtcbiAgICAgICAgZXhpdElmRmFpbGVkOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgICAgaWYgKGxhc3RTdGF0dXMgPT09IDApIHJldHVybjtcbiAgICB9XG4gICAgcHJvY2Vzcy5leGl0KGxhc3RTdGF0dXMpO1xuICB9LFxufTtcbiIsImV4cG9ydCBjb25zdCBodHRwU2VydmVyUGFja2FnZXMgPSBbJ2V4cHJlc3MnLCAnZmFzdGlmeScsICdlbHlzaWEnXTtcbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgb3MgZnJvbSAnbm9kZTpvcyc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZEFsbFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24sIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGlzUnVubmluZ09uQnVuIH0gZnJvbSAnLi4vdXRpbHMvcnVudGltZS5qcyc7XG5cbmltcG9ydCB7IHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZFV0aWxzLmpzJztcbmltcG9ydCB7IGh0dHBTZXJ2ZXJQYWNrYWdlcyB9IGZyb20gJy4vY29uc3RhbnRzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qgc2V0dXBDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3NldHVwJyxcbiAgZGVzY3JpYmU6ICdTZXR1cCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudC4gLmVudiBmaWxlcyBhcmUgaWdub3JlZC4nLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCBzZXR1cChhcmd2KTtcbiAgfSxcbn07XG5cbi8vIFRlc3QgY29kZSByZXF1aXJlcyBQYXJ0aWFsPC4uLj5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cChcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+PixcbiAgcHJvamVjdFBhdGhGb3JUZXN0aW5nPzogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kQWxsUHJvamVjdHMoYXJndiwgZmFsc2UsIHByb2plY3RQYXRoRm9yVGVzdGluZyk7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgnc2V0dXAnLCBwcm9qZWN0cy5hbGwpKSB7XG4gICAgY29uc3QgZGlyZW50cyA9IGF3YWl0IGZzLnJlYWRkaXIocHJvamVjdC5kaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgaWYgKHByb2plY3QgPT09IHByb2plY3RzLnJvb3QpIHtcbiAgICAgIGlmIChvcy5wbGF0Zm9ybSgpID09PSAnZGFyd2luJykge1xuICAgICAgICBjb25zdCBwYWNrYWdlcyA9IFsncHN0cmVlJ107XG4gICAgICAgIGlmIChwcm9qZWN0Lmhhc0RvY2tlcmZpbGUpIHtcbiAgICAgICAgICBwYWNrYWdlcy5wdXNoKCdleHBlY3QnKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGBicmV3IGluc3RhbGwgJHtwYWNrYWdlcy5qb2luKCcgJyl9YCwgcHJvamVjdCwgYXJndik7XG4gICAgICB9XG5cbiAgICAgIGlmIChkaXJlbnRzLnNvbWUoKGQpID0+IGQuaXNGaWxlKCkgJiYgZC5uYW1lLmluY2x1ZGVzKCctdmVyc2lvbicpKSkge1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ2FzZGYgaW5zdGFsbCcsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChkaXJlbnRzLnNvbWUoKGQpID0+IGQuaXNGaWxlKCkgJiYgZC5uYW1lID09PSAncHlwcm9qZWN0LnRvbWwnKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCgncG9ldHJ5IGNvbmZpZyB2aXJ0dWFsZW52cy5pbi1wcm9qZWN0IHRydWUnLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoJ3BvZXRyeSBjb25maWcgdmlydHVhbGVudnMucHJlZmVyLWFjdGl2ZS1weXRob24gdHJ1ZScsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgY29uc3QgWywgdmVyc2lvbl0gPSBjaGlsZF9wcm9jZXNzLmV4ZWNTeW5jKCdhc2RmIGN1cnJlbnQgcHl0aG9uJykudG9TdHJpbmcoKS50cmltKCkuc3BsaXQoL1xccysvKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYHBvZXRyeSBlbnYgdXNlICR7dmVyc2lvbn1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bigncG9ldHJ5IHJ1biBwaXAgaW5zdGFsbCAtLXVwZ3JhZGUgcGlwJywgcHJvamVjdCwgYXJndik7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ3BvZXRyeSBpbnN0YWxsIC0tYW5zaScsIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cblxuICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICBjb25zdCBkZXZEZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgfHwge307XG4gICAgY29uc3Qgc2NyaXB0cyA9IHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cyA/PyB7fTtcbiAgICBjb25zdCBuZXdEZXBzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCBuZXdEZXZEZXBzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGlmIChkZXBzWydibGl0eiddIHx8IGRlcHNbJ25leHQnXSkge1xuICAgICAgbmV3RGVwcy5wdXNoKCdwbTInKTtcbiAgICAgIG5ld0RldkRlcHMucHVzaCgnY29uY3VycmVudGx5JywgJ29wZW4tY2xpJywgJ3ZpdGVzdCcsICd3YWl0LW9uJyk7XG4gICAgfSBlbHNlIGlmIChkZXZEZXBzWydAcmVtaXgtcnVuL2RldiddKSB7XG4gICAgICBuZXdEZXBzLnB1c2goJ3BtMicpO1xuICAgICAgbmV3RGV2RGVwcy5wdXNoKCdjb25jdXJyZW50bHknLCAnb3Blbi1jbGknLCAndml0ZXN0JywgJ3dhaXQtb24nKTtcbiAgICB9IGVsc2UgaWYgKGh0dHBTZXJ2ZXJQYWNrYWdlcy5zb21lKChwKSA9PiBkZXBzW3BdKSkge1xuICAgICAgbmV3RGVwcy5wdXNoKCdwbTInKTtcbiAgICAgIG5ld0RldkRlcHMucHVzaCgnY29uY3VycmVudGx5JywgJ3ZpdGVzdCcsICd3YWl0LW9uJyk7XG4gICAgfVxuICAgIGlmIChpc1J1bm5pbmdPbkJ1bikge1xuICAgICAgbmV3RGV2RGVwcyA9IG5ld0RldkRlcHMuZmlsdGVyKChkZXApID0+IGRlcCAhPT0gJ3ZpdGVzdCcpO1xuICAgIH1cbiAgICBpZiAobmV3RGVwcy5sZW5ndGggPiAwKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYHlhcm4gYWRkICR7bmV3RGVwcy5qb2luKCcgJyl9YCwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICAgIGlmIChuZXdEZXZEZXBzLmxlbmd0aCA+IDApIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgeWFybiBhZGQgLUQgJHtuZXdEZXZEZXBzLmpvaW4oJyAnKX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gICAgaWYgKHNjcmlwdHNbJ2dlbi1jb2RlJ10pIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bigneWFybiBnZW4tY29kZScsIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmNPbkV4aXQgfSBmcm9tICcuLi91dGlscy9wcm9jZXNzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIERvY2tlciBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgRG9ja2VyU2NyaXB0cyB7XG4gIGJ1aWxkRGV2SW1hZ2UocHJvamVjdDogUHJvamVjdCwgdmVyc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyBlLmcuIGNvZGluZy1ib29zdGVyIHVzZXMgYFwiZG9ja2VyL2J1aWxkL3ByZXBhcmVcIjogXCJ0b3VjaCBkcmlsbC11c2Vycy5jc3ZcIixgXG4gICAgY29uc3QgcHJlZml4ID0gcHJvamVjdC5kb2NrZXJQYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2RvY2tlci9idWlsZC9wcmVwYXJlJ11cbiAgICAgID8gJ3lhcm4gcnVuIGRvY2tlci9idWlsZC9wcmVwYXJlICYmICdcbiAgICAgIDogJyc7XG4gICAgcmV0dXJuIGBjZCAke3BhdGguZGlybmFtZShwcm9qZWN0LmZpbmRGaWxlKCdEb2NrZXJmaWxlJykpfVxuICAgICYmICR7cHJlZml4fVlBUk4gd2Igb3B0aW1pemVGb3JEb2NrZXJCdWlsZCAtLW91dHNpZGVcbiAgICAmJiBZQVJOIHdiIHJldHJ5IC0tIGRvY2tlciBidWlsZCAtdCAke3Byb2plY3QuZG9ja2VySW1hZ2VOYW1lfVxuICAgICAgICAtLWJ1aWxkLWFyZyBBUkNIPSQoWyAkKHVuYW1lIC1tKSA9ICdhcm02NCcgXSAmJiBlY2hvIGFybTY0IHx8IGVjaG8gYW1kNjQpXG4gICAgICAgIC0tYnVpbGQtYXJnIFdCX0VOVj0ke3Byb2plY3QuZW52LldCX0VOVn1cbiAgICAgICAgLS1idWlsZC1hcmcgV0JfVkVSU0lPTj0ke3ZlcnNpb259IC5gO1xuICB9XG4gIHN0b3BBbmRTdGFydChwcm9qZWN0OiBQcm9qZWN0LCB1bmJ1ZmZlciA9IGZhbHNlLCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnLCBhZGRpdGlvbmFsQXJncyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5zdG9wKHByb2plY3QpfSAmJiAke3VuYnVmZmVyID8gJ3VuYnVmZmVyICcgOiAnJ30ke3RoaXMuc3RhcnQoXG4gICAgICBwcm9qZWN0LFxuICAgICAgYWRkaXRpb25hbE9wdGlvbnMsXG4gICAgICBhZGRpdGlvbmFsQXJnc1xuICAgICl9YDtcbiAgfVxuICBzdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnLCBhZGRpdGlvbmFsQXJncyA9ICcnKTogc3RyaW5nIHtcbiAgICBzcGF3blN5bmNPbkV4aXQodGhpcy5zdG9wKHByb2plY3QpLCBwcm9qZWN0KTtcbiAgICByZXR1cm4gYGRvY2tlciBydW4gLS1ybSAtaXQgLXAgODA4MDo4MDgwIC0tbmFtZSAke3Byb2plY3QuZG9ja2VySW1hZ2VOYW1lfSAke2FkZGl0aW9uYWxPcHRpb25zfSAke3Byb2plY3QuZG9ja2VySW1hZ2VOYW1lfSAke2FkZGl0aW9uYWxBcmdzfWA7XG4gIH1cblxuICBzdG9wKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIHJldHVybiBgdHJ1ZSAkKGRvY2tlciBybSAtZiAkKGRvY2tlciBjb250YWluZXIgbHMgLXEgLWYgbmFtZT0ke3Byb2plY3QuZG9ja2VySW1hZ2VOYW1lfSkgMj4gL2Rldi9udWxsKWA7XG4gIH1cblxuICBzdG9wQWxsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGB0cnVlICQoZG9ja2VyIHJtIC1mICQoZG9ja2VyIHBzIC1xKSAyPiAvZGV2L251bGwpYDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZG9ja2VyU2NyaXB0cyA9IG5ldyBEb2NrZXJTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFRlc3RBcmd2IH0gZnJvbSAnLi4vLi4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL2RvY2tlclNjcmlwdHMuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRlc3RFMkVEZXZPcHRpb25zIHtcbiAgLy8gJy0tZTJlIGdlbmVyYXRlJyBjYWxscyAnY29kZWdlbiBodHRwOi8vbG9jYWxob3N0OjgwODAnXG4gIHBsYXl3cmlnaHRBcmdzPzogc3RyaW5nO1xuICBzdGFydENvbW1hbmQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVzdEUyRU9wdGlvbnMgZXh0ZW5kcyBUZXN0RTJFRGV2T3B0aW9ucyB7XG4gIHByaXNtYURpcmVjdG9yeT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIGFuIGFwcC5cbiAqIE5vdGUgdGhhdCBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZVNjcmlwdHMge1xuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBkZWZhdWx0UG9ydCA9IE51bWJlcihwcm9jZXNzLmVudi5QT1JUKSB8fCAzMDAwKSB7fVxuXG4gIGJ1aWxkRG9ja2VyKHByb2plY3Q6IFByb2plY3QsIHZlcnNpb24gPSAnZGV2ZWxvcG1lbnQnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZG9ja2VyU2NyaXB0cy5idWlsZERldkltYWdlKHByb2plY3QsIHZlcnNpb24pO1xuICB9XG5cbiAgYWJzdHJhY3Qgc3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZztcblxuICBhYnN0cmFjdCBzdGFydFByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndiwgcG9ydDogbnVtYmVyKTogc3RyaW5nO1xuXG4gIHN0YXJ0RG9ja2VyKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLmJ1aWxkRG9ja2VyKHByb2plY3QpfVxuICAgICAgJiYgWUFSTiBjb25jdXJyZW50bHkgLS1yYXcgLS1raWxsLW90aGVycy1vbi1mYWlsXG4gICAgICAgIFwiJHtkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChcbiAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIGFyZ3Yubm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0ID8/ICcnLFxuICAgICAgICAgIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnXG4gICAgICAgICl9XCJcbiAgICAgICAgXCIke3RoaXMud2FpdEFuZE9wZW5BcHAocHJvamVjdCwgYXJndiwgODA4MCl9XCJgO1xuICB9XG5cbiAgdGVzdEUyRShcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGFyZ3Y6IFRlc3RBcmd2LFxuICAgIHsgcGxheXdyaWdodEFyZ3MgPSAndGVzdCB0ZXN0cy9lMmUnLCBwcmlzbWFEaXJlY3RvcnksIHN0YXJ0Q29tbWFuZCB9OiBUZXN0RTJFT3B0aW9uc1xuICApOiBzdHJpbmcge1xuICAgIC8vIEJhc2ljYWxseSwgYHBsYXl3cmlnaHRgIChub3QgYHlhcm4gcGxheXdyaWdodGApIHNob3VsZCB3b3JrLFxuICAgIC8vIGJ1dCBpdCBkb2Vzbid0IHdvcmsgb24gYSBwcm9qZWN0IGRlcGVuZGluZyBvbiBgYXJ0aWxsZXJ5LWVuZ2luZS1wbGF5d3JpZ2h0YC5cbiAgICAvLyBTbyB3ZSB1c2UgYHlhcm4gcGxheXdyaWdodGAgaW5zdGVhZCBvZiBgcGxheXdyaWdodGAgaGVyZS5cbiAgICBjb25zdCBlbnYgPSBwcm9qZWN0LmVudi5XQl9FTlY7XG4gICAgcmV0dXJuIGBXQl9FTlY9JHtlbnZ9IE5FWFRfUFVCTElDX1dCX0VOVj0ke2Vudn0gQVBQX0VOVj0ke2Vudn0gUE9SVD04MDgwIFlBUk4gY29uY3VycmVudGx5IC0ta2lsbC1vdGhlcnMgLS1yYXcgLS1zdWNjZXNzIGZpcnN0XG4gICAgICBcInJtIC1SZiAke3ByaXNtYURpcmVjdG9yeX0vbW91bnQgJiYgJHtzdGFydENvbW1hbmR9ICYmIGV4aXQgMVwiXG4gICAgICBcImNvbmN1cnJlbnRseSAtLWtpbGwtb3RoZXJzLW9uLWZhaWwgLS1yYXcgJ3dhaXQtb24gLXQgNjAwMDAwIC1pIDIwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6ODA4MCcgJ0JVTiBwbGF5d3JpZ2h0IGluc3RhbGwgLS13aXRoLWRlcHMnXG4gICAgICAgICYmIEJVTiBwbGF5d3JpZ2h0ICR7cGxheXdyaWdodEFyZ3MucmVwbGFjZSgndGVzdHMvZTJlJywgYXJndi50YXJnZXQgfHwgJ3Rlc3RzL2UyZScpfVwiYDtcbiAgfVxuXG4gIHRlc3RFMkVEZXYoXG4gICAgcHJvamVjdDogUHJvamVjdCxcbiAgICBhcmd2OiBUZXN0QXJndixcbiAgICB7IHBsYXl3cmlnaHRBcmdzID0gJ3Rlc3QgdGVzdHMvZTJlJywgc3RhcnRDb21tYW5kIH06IFRlc3RFMkVEZXZPcHRpb25zXG4gICk6IHN0cmluZyB7XG4gICAgY29uc3QgZW52ID0gcHJvamVjdC5lbnYuV0JfRU5WO1xuICAgIHJldHVybiBgV0JfRU5WPSR7ZW52fSBORVhUX1BVQkxJQ19XQl9FTlY9JHtlbnZ9IEFQUF9FTlY9JHtlbnZ9IFBPUlQ9ODA4MCBZQVJOIGNvbmN1cnJlbnRseSAtLWtpbGwtb3RoZXJzIC0tcmF3IC0tc3VjY2VzcyBmaXJzdFxuICAgICAgXCIke3N0YXJ0Q29tbWFuZH0gJiYgZXhpdCAxXCJcbiAgICAgIFwiY29uY3VycmVudGx5IC0ta2lsbC1vdGhlcnMtb24tZmFpbCAtLXJhdyAnd2FpdC1vbiAtdCA2MDAwMDAgLWkgMjAwMCBodHRwLWdldDovLzEyNy4wLjAuMTo4MDgwJyAnQlVOIHBsYXl3cmlnaHQgaW5zdGFsbCAtLXdpdGgtZGVwcydcbiAgICAgICAgJiYgQlVOIHBsYXl3cmlnaHQgJHtwbGF5d3JpZ2h0QXJncy5yZXBsYWNlKCd0ZXN0cy9lMmUnLCBhcmd2LnRhcmdldCB8fCAndGVzdHMvZTJlJyl9XCJgO1xuICB9XG5cbiAgYWJzdHJhY3QgdGVzdFN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmc7XG5cbiAgdGVzdFVuaXQocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YpOiBzdHJpbmcge1xuICAgIC8vIFNpbmNlIHRoaXMgY29tbWFuZCBpcyByZWZlcnJlZCBmcm9tIG90aGVyIGNvbW1hbmRzLCB3ZSBoYXZlIHRvIHVzZSBcInZpdGVzdCBydW5cIiAobm9uLWludGVyYWN0aXZlIG1vZGUpLlxuICAgIHJldHVybiBgV0JfRU5WPSR7cHJvamVjdC5lbnYuV0JfRU5WfSBZQVJOIHZpdGVzdCBydW4gJHthcmd2LnRhcmdldCB8fCAndGVzdHMvdW5pdCd9IC0tY29sb3IgLS1wYXNzV2l0aE5vVGVzdHMgLS1hbGxvd09ubHlgO1xuICB9XG5cbiAgcHJvdGVjdGVkIHdhaXRBcHAocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndiwgcG9ydCA9IHRoaXMuZGVmYXVsdFBvcnQpOiBzdHJpbmcge1xuICAgIHJldHVybiBgd2FpdC1vbiAtdCAxMDAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCAxMDAwMCAtaSA1MDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgMTAwMDAgLWkgMTAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCAxMDAwMCAtaSAyMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDIwMDAwIC1pIDQwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgNjAwMDAgLWkgNTAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9YDtcbiAgfVxuXG4gIHByb3RlY3RlZCB3YWl0QW5kT3BlbkFwcChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2LCBwb3J0ID0gdGhpcy5kZWZhdWx0UG9ydCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMud2FpdEFwcChcbiAgICAgIHByb2plY3QsXG4gICAgICBhcmd2LFxuICAgICAgcG9ydFxuICAgICl9IHx8IHdhaXQtb24gaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAmJiBvcGVuLWNsaSBcImh0dHA6Ly9cXCR7SE9TVDotbG9jYWxob3N0fToke3BvcnR9XCJgO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IFRlc3RBcmd2IH0gZnJvbSAnLi4vLi4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgcHJpc21hU2NyaXB0cyB9IGZyb20gJy4uL3ByaXNtYVNjcmlwdHMuanMnO1xuXG5pbXBvcnQgdHlwZSB7IFRlc3RFMkVEZXZPcHRpb25zLCBUZXN0RTJFT3B0aW9ucyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIEJsaXR6LmpzIGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBCbGl0elNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICBjb25zdCBhcHBFbnYgPSBwcm9qZWN0LmVudi5XQl9FTlYgPyBgQVBQX0VOVj0ke3Byb2plY3QuZW52LldCX0VOVn0gYCA6ICcnO1xuICAgIHJldHVybiBgJHthcHBFbnZ9WUFSTiBjb25jdXJyZW50bHkgLS1yYXcgLS1raWxsLW90aGVycy1vbi1mYWlsXG4gICAgICBcImJsaXR6IGRldiAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfVwiXG4gICAgICBcIiR7dGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0LCBhcmd2KX1cImA7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydFByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndiwgcG9ydDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBhcHBFbnYgPSBwcm9qZWN0LmVudi5XQl9FTlYgPyBgQVBQX0VOVj0ke3Byb2plY3QuZW52LldCX0VOVn0gYCA6ICcnO1xuICAgIHJldHVybiBgJHthcHBFbnZ9Tk9ERV9FTlY9cHJvZHVjdGlvbiBZQVJOIGNvbmN1cnJlbnRseSAtLXJhdyAtLWtpbGwtb3RoZXJzLW9uLWZhaWxcbiAgICAgIFwiJHtwcmlzbWFTY3JpcHRzLnJlc2V0KHByb2plY3QpfSAmJiAke3Byb2plY3QuYnVpbGRDb21tYW5kfSAmJiBQT1JUPSR7cG9ydH0gcG0yLXJ1bnRpbWUgc3RhcnQgJHtwcm9qZWN0LmZpbmRGaWxlKFxuICAgICAgICAnZWNvc3lzdGVtLmNvbmZpZy5janMnXG4gICAgICApfSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfVwiXG4gICAgICBcIiR7dGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0LCBhcmd2LCBwb3J0KX1cImA7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFKFxuICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgYXJndjogVGVzdEFyZ3YsXG4gICAge1xuICAgICAgcGxheXdyaWdodEFyZ3MsXG4gICAgICBzdGFydENvbW1hbmQgPSBgJHtwcmlzbWFTY3JpcHRzLnJlc2V0KHByb2plY3QpfSAmJiAke1xuICAgICAgICBwcm9qZWN0LmJ1aWxkQ29tbWFuZFxuICAgICAgfSAmJiBwbTItcnVudGltZSBzdGFydCAke3Byb2plY3QuZmluZEZpbGUoJ2Vjb3N5c3RlbS5jb25maWcuY2pzJyl9YCxcbiAgICB9OiBUZXN0RTJFT3B0aW9uc1xuICApOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXBlci50ZXN0RTJFKHByb2plY3QsIGFyZ3YsIHtcbiAgICAgIHBsYXl3cmlnaHRBcmdzLFxuICAgICAgcHJpc21hRGlyZWN0b3J5OiAnZGInLFxuICAgICAgc3RhcnRDb21tYW5kLFxuICAgIH0pO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRURldihcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGFyZ3Y6IFRlc3RBcmd2LFxuICAgIHsgcGxheXdyaWdodEFyZ3MsIHN0YXJ0Q29tbWFuZCA9ICdibGl0eiBkZXYgLXAgODA4MCcgfTogVGVzdEUyRURldk9wdGlvbnNcbiAgKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VwZXIudGVzdEUyRURldihwcm9qZWN0LCBhcmd2LCB7IHBsYXl3cmlnaHRBcmdzLCBzdGFydENvbW1hbmQgfSk7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0U3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBZQVJOIGNvbmN1cnJlbnRseSAtLWtpbGwtb3RoZXJzIC0tcmF3IC0tc3VjY2VzcyBmaXJzdCBcImJsaXR6IGRldlwiIFwiJHt0aGlzLndhaXRBcHAocHJvamVjdCwgYXJndil9XCJgO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBibGl0elNjcmlwdHMgPSBuZXcgQmxpdHpTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFRlc3RBcmd2IH0gZnJvbSAnLi4vLi4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bnRpbWVXaXRoQXJncyB9IGZyb20gJy4uLy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vZG9ja2VyU2NyaXB0cy5qcyc7XG5cbmltcG9ydCB0eXBlIHsgVGVzdEUyRURldk9wdGlvbnMsIFRlc3RFMkVPcHRpb25zIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgYW4gYXBwIHRoYXQgdXRpbGl6ZXMgYW4gSFRUUCBzZXJ2ZXIgbGlrZSBleHByZXNzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBIdHRwU2VydmVyU2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWUFSTiBidWlsZC10cyBydW4gc3JjL2luZGV4LnRzICR7YXJndi53YXRjaCA/ICctLXdhdGNoJyA6ICcnfSAtLSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWA7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydERvY2tlcihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5idWlsZERvY2tlcihwcm9qZWN0KX0gJiYgJHtkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChcbiAgICAgIHByb2plY3QsXG4gICAgICBmYWxzZSxcbiAgICAgIGFyZ3Yubm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0ID8/ICcnLFxuICAgICAgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJydcbiAgICApfWA7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydFByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndiwgcG9ydCA9IDgwODApOiBzdHJpbmcge1xuICAgIHJldHVybiBgTk9ERV9FTlY9cHJvZHVjdGlvbiAke1xuICAgICAgcHJvamVjdC5idWlsZENvbW1hbmRcbiAgICB9ICYmIE5PREVfRU5WPXByb2R1Y3Rpb24gUE9SVD1cXCR7UE9SVDotJHtwb3J0fX0gJHtydW50aW1lV2l0aEFyZ3N9IGRpc3QvaW5kZXguanMgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRShcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGFyZ3Y6IFRlc3RBcmd2LFxuICAgIHtcbiAgICAgIHN0YXJ0Q29tbWFuZCA9IGBpZiBbIC1lIFwicHJpc21hXCIgXTsgdGhlbiBwcmlzbWEgbWlncmF0ZSByZXNldCAtLWZvcmNlIC0tc2tpcC1nZW5lcmF0ZTsgZmkgJiYgKCR7dGhpcy5zdGFydFByb2R1Y3Rpb24oXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGFyZ3ZcbiAgICAgICl9KWAsXG4gICAgfTogVGVzdEUyRU9wdGlvbnNcbiAgKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYE5PREVfRU5WPXByb2R1Y3Rpb24gV0JfRU5WPSR7cHJvamVjdC5lbnYuV0JfRU5WfSBQT1JUPTgwODAgWUFSTiBjb25jdXJyZW50bHkgLS1raWxsLW90aGVycyAtLXJhdyAtLXN1Y2Nlc3MgZmlyc3RcbiAgICAgIFwiJHtzdGFydENvbW1hbmR9ICYmIGV4aXQgMVwiXG4gICAgICBcIndhaXQtb24gLXQgNjAwMDAwIC1pIDIwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6ODA4MCAmJiB2aXRlc3QgcnVuICR7YXJndi50YXJnZXQgfHwgJ3Rlc3RzL2UyZSd9IC0tY29sb3IgLS1wYXNzV2l0aE5vVGVzdHMgLS1hbGxvd09ubHlcImA7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFRGV2KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2LCB7IHN0YXJ0Q29tbWFuZCB9OiBUZXN0RTJFRGV2T3B0aW9ucyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBOT0RFX0VOVj1wcm9kdWN0aW9uIFdCX0VOVj0ke1xuICAgICAgcHJvamVjdC5lbnYuV0JfRU5WXG4gICAgfSBQT1JUPTgwODAgWUFSTiBjb25jdXJyZW50bHkgLS1raWxsLW90aGVycyAtLXJhdyAtLXN1Y2Nlc3MgZmlyc3RcbiAgICAgIFwiJHtzdGFydENvbW1hbmQgfHwgdGhpcy5zdGFydChwcm9qZWN0LCBhcmd2KX0gJiYgZXhpdCAxXCJcbiAgICAgIFwid2FpdC1vbiAtdCA2MDAwMDAgLWkgMjAwMCBodHRwLWdldDovLzEyNy4wLjAuMTo4MDgwICYmIHZpdGVzdCBydW4gJHthcmd2LnRhcmdldCB8fCAndGVzdHMvZTJlJ30gLS1jb2xvciAtLXBhc3NXaXRoTm9UZXN0cyAtLWFsbG93T25seVwiYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RTdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFlBUk4gY29uY3VycmVudGx5IC0ta2lsbC1vdGhlcnMgLS1yYXcgLS1zdWNjZXNzIGZpcnN0IFwiJHt0aGlzLnN0YXJ0KHByb2plY3QsIGFyZ3YpfVwiIFwiJHt0aGlzLndhaXRBcHAoXG4gICAgICBwcm9qZWN0LFxuICAgICAgYXJndlxuICAgICl9XCJgO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBodHRwU2VydmVyU2NyaXB0cyA9IG5ldyBIdHRwU2VydmVyU2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBUZXN0QXJndiB9IGZyb20gJy4uLy4uL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IHByaXNtYVNjcmlwdHMgfSBmcm9tICcuLi9wcmlzbWFTY3JpcHRzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBUZXN0RTJFRGV2T3B0aW9ucywgVGVzdEUyRU9wdGlvbnMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBOZXh0LmpzIGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBOZXh0U2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWUFSTiBjb25jdXJyZW50bHkgLS1yYXcgLS1raWxsLW90aGVycy1vbi1mYWlsXG4gICAgICBcIm5leHQgZGV2IC0tdHVyYm8gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31cIlxuICAgICAgXCIke3RoaXMud2FpdEFuZE9wZW5BcHAocHJvamVjdCwgYXJndil9XCJgO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnRQcm9kdWN0aW9uKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YsIHBvcnQ6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBOT0RFX0VOVj1wcm9kdWN0aW9uIFlBUk4gY29uY3VycmVudGx5IC0tcmF3IC0ta2lsbC1vdGhlcnMtb24tZmFpbFxuICAgICAgXCIke1tcbiAgICAgICAgLi4uKHByb2plY3QuaGFzUHJpc21hID8gW3ByaXNtYVNjcmlwdHMucmVzZXQocHJvamVjdCldIDogW10pLFxuICAgICAgICBwcm9qZWN0LmJ1aWxkQ29tbWFuZCxcbiAgICAgICAgYFBPUlQ9JHtwb3J0fSBwbTItcnVudGltZSBzdGFydCAke3Byb2plY3QuZmluZEZpbGUoJ2Vjb3N5c3RlbS5jb25maWcuY2pzJyl9ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YCxcbiAgICAgIF0uam9pbignICYmICcpfVwiXG4gICAgICBcIiR7dGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0LCBhcmd2LCBwb3J0KX1cImA7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2LCBvcHRpb25zOiBUZXN0RTJFT3B0aW9ucyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN1cGVyLnRlc3RFMkUocHJvamVjdCwgYXJndiwge1xuICAgICAgcGxheXdyaWdodEFyZ3M6IG9wdGlvbnMucGxheXdyaWdodEFyZ3MsXG4gICAgICBwcmlzbWFEaXJlY3Rvcnk6ICdkYicsXG4gICAgICBzdGFydENvbW1hbmQ6XG4gICAgICAgIG9wdGlvbnMuc3RhcnRDb21tYW5kID8/XG4gICAgICAgIFtcbiAgICAgICAgICAuLi4ocHJvamVjdC5oYXNQcmlzbWEgPyBbcHJpc21hU2NyaXB0cy5yZXNldChwcm9qZWN0KV0gOiBbXSksXG4gICAgICAgICAgcHJvamVjdC5idWlsZENvbW1hbmQsXG4gICAgICAgICAgYHBtMi1ydW50aW1lIHN0YXJ0ICR7cHJvamVjdC5maW5kRmlsZSgnZWNvc3lzdGVtLmNvbmZpZy5janMnKX1gLFxuICAgICAgICBdLmpvaW4oJyAmJiAnKSxcbiAgICB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkVEZXYoXG4gICAgcHJvamVjdDogUHJvamVjdCxcbiAgICBhcmd2OiBUZXN0QXJndixcbiAgICB7IHN0YXJ0Q29tbWFuZCA9ICduZXh0IGRldiAtLXR1cmJvIC1wIDgwODAnIH06IFRlc3RFMkVEZXZPcHRpb25zXG4gICk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN1cGVyLnRlc3RFMkVEZXYocHJvamVjdCwgYXJndiwgeyBzdGFydENvbW1hbmQgfSk7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0U3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBZQVJOIGNvbmN1cnJlbnRseSAtLWtpbGwtb3RoZXJzIC0tcmF3IC0tc3VjY2VzcyBmaXJzdCBcIm5leHQgZGV2IC0tdHVyYm9cIiBcIiR7dGhpcy53YWl0QXBwKHByb2plY3QsIGFyZ3YpfVwiYDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgbmV4dFNjcmlwdHMgPSBuZXcgTmV4dFNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVudGltZVdpdGhBcmdzIH0gZnJvbSAnLi4vLi4vdXRpbHMvcnVudGltZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IGRvY2tlclNjcmlwdHMgfSBmcm9tICcuLi9kb2NrZXJTY3JpcHRzLmpzJztcblxuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIGFuIGFwcCB0aGF0IHV0aWxpemVzIGFuIEhUVFAgc2VydmVyIGxpa2UgZXhwcmVzcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgUGxhaW5BcHBTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBZQVJOIGJ1aWxkLXRzIHJ1biBzcmMvaW5kZXgudHMgJHthcmd2LndhdGNoID8gJy0td2F0Y2gnIDogJyd9IC0tICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YDtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0RG9ja2VyKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLmJ1aWxkRG9ja2VyKHByb2plY3QpfSAmJiAke2RvY2tlclNjcmlwdHMuc3RvcEFuZFN0YXJ0KFxuICAgICAgcHJvamVjdCxcbiAgICAgIGZhbHNlLFxuICAgICAgYXJndi5ub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQgPz8gJycsXG4gICAgICBhcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ1xuICAgICl9YDtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYE5PREVfRU5WPXByb2R1Y3Rpb24gJHtwcm9qZWN0LmJ1aWxkQ29tbWFuZH0gJiYgTk9ERV9FTlY9cHJvZHVjdGlvbiAke3J1bnRpbWVXaXRoQXJnc30gZGlzdC9pbmRleC5qcyAke1xuICAgICAgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJydcbiAgICB9YDtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYGVjaG8gJ2RvIG5vdGhpbmcuJ2A7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFRGV2KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBlY2hvICdkbyBub3RoaW5nLidgO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdFN0YXJ0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBlY2hvICdkbyBub3RoaW5nLidgO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBwbGFpbkFwcFNjcmlwdHMgPSBuZXcgUGxhaW5BcHBTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFRlc3RBcmd2IH0gZnJvbSAnLi4vLi4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgcHJpc21hU2NyaXB0cyB9IGZyb20gJy4uL3ByaXNtYVNjcmlwdHMuanMnO1xuXG5pbXBvcnQgdHlwZSB7IFRlc3RFMkVEZXZPcHRpb25zLCBUZXN0RTJFT3B0aW9ucyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIFJlbWl4IGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBSZW1peFNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFlBUk4gY29uY3VycmVudGx5IC0tcmF3IC0ta2lsbC1vdGhlcnMtb24tZmFpbFxuICAgICAgXCJyZW1peCBkZXYgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31cIlxuICAgICAgXCIke3RoaXMud2FpdEFuZE9wZW5BcHAocHJvamVjdCwgYXJndil9XCJgO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnRQcm9kdWN0aW9uKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YsIHBvcnQ6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBOT0RFX0VOVj1wcm9kdWN0aW9uIFlBUk4gY29uY3VycmVudGx5IC0tcmF3IC0ta2lsbC1vdGhlcnMtb24tZmFpbFxuICAgICAgXCIke3ByaXNtYVNjcmlwdHMucmVzZXQocHJvamVjdCl9ICYmICR7cHJvamVjdC5idWlsZENvbW1hbmR9ICYmIFBPUlQ9JHtwb3J0fSBwbTItcnVudGltZSBzdGFydCAke3Byb2plY3QuZmluZEZpbGUoXG4gICAgICAgICdlY29zeXN0ZW0uY29uZmlnLmNqcydcbiAgICAgICl9ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9XCJcbiAgICAgIFwiJHt0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QsIGFyZ3YsIHBvcnQpfVwiYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkUoXG4gICAgcHJvamVjdDogUHJvamVjdCxcbiAgICBhcmd2OiBUZXN0QXJndixcbiAgICB7XG4gICAgICBwbGF5d3JpZ2h0QXJncyxcbiAgICAgIHN0YXJ0Q29tbWFuZCA9IGAke3ByaXNtYVNjcmlwdHMucmVzZXQocHJvamVjdCl9ICYmICR7XG4gICAgICAgIHByb2plY3QuYnVpbGRDb21tYW5kXG4gICAgICB9ICYmIHBtMi1ydW50aW1lIHN0YXJ0ICR7cHJvamVjdC5maW5kRmlsZSgnZWNvc3lzdGVtLmNvbmZpZy5janMnKX1gLFxuICAgIH06IFRlc3RFMkVPcHRpb25zXG4gICk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN1cGVyLnRlc3RFMkUocHJvamVjdCwgYXJndiwgeyBwbGF5d3JpZ2h0QXJncywgcHJpc21hRGlyZWN0b3J5OiAncHJpc21hJywgc3RhcnRDb21tYW5kIH0pO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRURldihcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGFyZ3Y6IFRlc3RBcmd2LFxuICAgIHsgcGxheXdyaWdodEFyZ3MsIHN0YXJ0Q29tbWFuZCA9ICdyZW1peCBkZXYnIH06IFRlc3RFMkVEZXZPcHRpb25zXG4gICk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN1cGVyLnRlc3RFMkVEZXYocHJvamVjdCwgYXJndiwgeyBwbGF5d3JpZ2h0QXJncywgc3RhcnRDb21tYW5kIH0pO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdFN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWUFSTiBjb25jdXJyZW50bHkgLS1raWxsLW90aGVycyAtLXJhdyAtLXN1Y2Nlc3MgZmlyc3QgXCJyZW1peCBkZXZcIiBcIiR7dGhpcy53YWl0QXBwKHByb2plY3QsIGFyZ3YpfVwiYDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgcmVtaXhTY3JpcHRzID0gbmV3IFJlbWl4U2NyaXB0cygpO1xuIiwiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZEFsbFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBub3JtYWxpemVBcmdzLCBzY3JpcHRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgYmxpdHpTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmxpdHpTY3JpcHRzLmpzJztcbmltcG9ydCB7IGh0dHBTZXJ2ZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vaHR0cFNlcnZlclNjcmlwdHMuanMnO1xuaW1wb3J0IHsgbmV4dFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9uZXh0U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwbGFpbkFwcFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9wbGFpbkFwcFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcmVtaXhTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcmVtaXhTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IGh0dHBTZXJ2ZXJQYWNrYWdlcyB9IGZyb20gJy4vY29uc3RhbnRzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgLi4uc2NyaXB0T3B0aW9uc0J1aWxkZXIsXG4gIG1vZGU6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1N0YXJ0IG1vZGU6IGRldltlbG9wbWVudF0gKGRlZmF1bHQpIHwgc3RhZ2luZyB8IGRvY2tlciB8IGRvY2tlci1kZWJ1ZycsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICdtJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBzdGFydENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc3RhcnQgW2FyZ3MuLl0nLFxuICBkZXNjcmliZTogJ1N0YXJ0IGFwcCcsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIG5vcm1hbGl6ZUFyZ3MoYXJndik7XG5cbiAgICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmRBbGxQcm9qZWN0cyhhcmd2KTtcbiAgICBpZiAoIXByb2plY3RzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzLmFsbCkge1xuICAgICAgY29uc3QgZGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzIHx8IHt9O1xuICAgICAgY29uc3QgZGV2RGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzIHx8IHt9O1xuICAgICAgbGV0IHNjcmlwdHM6IEJhc2VTY3JpcHRzO1xuICAgICAgaWYgKGRlcHNbJ2JsaXR6J10pIHtcbiAgICAgICAgc2NyaXB0cyA9IGJsaXR6U2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoZGVwc1snbmV4dCddKSB7XG4gICAgICAgIHNjcmlwdHMgPSBuZXh0U2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoZGV2RGVwc1snQHJlbWl4LXJ1bi9kZXYnXSkge1xuICAgICAgICBzY3JpcHRzID0gcmVtaXhTY3JpcHRzO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgKGh0dHBTZXJ2ZXJQYWNrYWdlcy5zb21lKChwKSA9PiBkZXBzW3BdKSAmJiAhZGVwc1snZmlyZWJhc2UtZnVuY3Rpb25zJ10pIHx8XG4gICAgICAgIChwcm9qZWN0Lmhhc0RvY2tlcmZpbGUgJiYgL0VYUE9TRVxccys4MDgwLy50ZXN0KHByb2plY3QuZG9ja2VyZmlsZSkpXG4gICAgICApIHtcbiAgICAgICAgc2NyaXB0cyA9IGh0dHBTZXJ2ZXJTY3JpcHRzO1xuICAgICAgfSBlbHNlIGlmIChkZXBzWydidWlsZC10cyddIHx8IGRldkRlcHNbJ2J1aWxkLXRzJ10pIHtcbiAgICAgICAgc2NyaXB0cyA9IHBsYWluQXBwU2NyaXB0cztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwic3RhcnRcIiBmb3IgJHtwcm9qZWN0Lm5hbWV9IC4uLmApO1xuXG4gICAgICBzd2l0Y2ggKGFyZ3YubW9kZSB8fCAnZGV2Jykge1xuICAgICAgICBjYXNlICdkZXYnOlxuICAgICAgICBjYXNlICdkZXZlbG9wbWVudCc6IHtcbiAgICAgICAgICBjb25zdCBwcmVmaXggPSBjb25maWd1cmVFbnZpcm9ubWVudFZhcmlhYmxlcyhkZXBzLCAnZGV2ZWxvcG1lbnQnKTtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7cHJlZml4fSR7c2NyaXB0cy5zdGFydChwcm9qZWN0LCBhcmd2KX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdzdGFnaW5nJzoge1xuICAgICAgICAgIGNvbnN0IHByZWZpeCA9IGNvbmZpZ3VyZUVudmlyb25tZW50VmFyaWFibGVzKGRlcHMsICdzdGFnaW5nJyk7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3ByZWZpeH0ke3NjcmlwdHMuc3RhcnRQcm9kdWN0aW9uKHByb2plY3QsIGFyZ3YsIDgwODApfWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2RvY2tlcic6IHtcbiAgICAgICAgICBjb25zdCBwcmVmaXggPSBjb25maWd1cmVFbnZpcm9ubWVudFZhcmlhYmxlcyhkZXBzLCAnc3RhZ2luZycpO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtwcmVmaXh9JHtzY3JpcHRzLnN0YXJ0RG9ja2VyKHByb2plY3QsIGFyZ3YpfWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2RvY2tlci1kZWJ1Zyc6IHtcbiAgICAgICAgICBjb25zdCBwcmVmaXggPSBjb25maWd1cmVFbnZpcm9ubWVudFZhcmlhYmxlcyhkZXBzLCAnc3RhZ2luZycpO1xuICAgICAgICAgIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID0gYCcvYmluL2Jhc2gnYDtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7cHJlZml4fSR7c2NyaXB0cy5zdGFydERvY2tlcihwcm9qZWN0LCBhcmd2KX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHN0YXJ0IG1vZGU6ICR7YXJndi5tb2RlfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcblxuZnVuY3Rpb24gY29uZmlndXJlRW52aXJvbm1lbnRWYXJpYWJsZXMoZGVwczogUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Piwgd2JFbnY6IHN0cmluZyk6IHN0cmluZyB7XG4gIHByb2Nlc3MuZW52LldCX0VOViB8fD0gd2JFbnY7XG4gIGxldCBwcmVmaXggPSBgV0JfRU5WPSR7cHJvY2Vzcy5lbnYuV0JfRU5WfSBgO1xuICBpZiAoZGVwc1snbmV4dCddKSB7XG4gICAgcHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfV0JfRU5WID0gcHJvY2Vzcy5lbnYuV0JfRU5WO1xuICAgIHByZWZpeCArPSBgTkVYVF9QVUJMSUNfV0JfRU5WPSR7cHJvY2Vzcy5lbnYuV0JfRU5WfSBgO1xuICB9XG4gIHJldHVybiBwcmVmaXg7XG59XG4iLCJpbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuZXhwb3J0IGNvbnN0IHNjcmlwdE9wdGlvbnNCdWlsZGVyID0ge1xuICB3YXRjaDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byB3YXRjaCBmaWxlcycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBhcmdzOiB7XG4gICAgZGVzY3JpcHRpb246ICdBcmd1bWVudHMgZm9yIGNvcmUgY29tbWFuZCcsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgICBhbGlhczogJ2EnLFxuICAgIGRlZmF1bHQ6IFtdLFxuICB9LFxuICAnZG9ja2VyLW9wdGlvbnMnOiB7XG4gICAgZGVzY3JpcHRpb246ICdBcmd1bWVudHMgZm9yIFwiZG9ja2VyIHJ1blwiJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICAgIGRlZmF1bHQ6IFtdLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgU2NyaXB0QXJndiA9IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNjcmlwdE9wdGlvbnNCdWlsZGVyPj4+ICYge1xuICBub3JtYWxpemVkQXJnc1RleHQ/OiBzdHJpbmc7XG4gIG5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dD86IHN0cmluZztcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVBcmdzKFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzY3JpcHRPcHRpb25zQnVpbGRlcj4+PlxuKTogdm9pZCB7XG4gIChhcmd2IGFzIFNjcmlwdEFyZ3YpLm5vcm1hbGl6ZWRBcmdzVGV4dCA9IFsuLi4oYXJndi5hcmdzID8/IFtdKSwgLi4uKGFyZ3YuXz8uc2xpY2UoMSkgPz8gW10pXVxuICAgIC5tYXAoKGFyZykgPT4gYCcke2FyZ30nYClcbiAgICAuam9pbignICcpO1xuICAoYXJndiBhcyBTY3JpcHRBcmd2KS5ub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQgPSAoYXJndi5kb2NrZXJPcHRpb25zID8/IFtdKS5tYXAoKGFyZykgPT4gYCcke2FyZ30nYCkuam9pbignICcpO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgZXhpc3RzQXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZEFsbFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNjcmlwdE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2NyaXB0cy9idWlsZGVyLmpzJztcbmltcG9ydCB7IGRvY2tlclNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2RvY2tlclNjcmlwdHMuanMnO1xuaW1wb3J0IHR5cGUgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IGJsaXR6U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2JsaXR6U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBodHRwU2VydmVyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2h0dHBTZXJ2ZXJTY3JpcHRzLmpzJztcbmltcG9ydCB7IG5leHRTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vbmV4dFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcGxhaW5BcHBTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcGxhaW5BcHBTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJlbWl4U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3JlbWl4U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24sIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmltcG9ydCB7IGh0dHBTZXJ2ZXJQYWNrYWdlcyB9IGZyb20gJy4vY29uc3RhbnRzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgY2k6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gcnVuIHRlc3RzIG9uIENJJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIGUyZToge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ1doZXRoZXIgdG8gcnVuIGUyZSB0ZXN0cy4gWW91IG1heSBwYXNzIG1vZGUgYXMgYXJndW1lbnQ6IG5vbmUgfCBoZWFkbGVzcyAoZGVmYXVsdCkgfCBoZWFkbGVzcy1kZXYgfCBoZWFkZWQgfCBoZWFkZWQtZGV2IHwgZG9ja2VyIHwgZG9ja2VyLWRlYnVnIHwgZGVidWcgfCBnZW5lcmF0ZSB8IHRyYWNlJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbiAgc3RhcnQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gcnVuIHN0YXJ0IHRlc3RzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIHVuaXQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gcnVuIHVuaXQgdGVzdHMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgJ3VuaXQtdGltZW91dCc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1RpbWVvdXQgZm9yIHVuaXQgdGVzdHMnLFxuICAgIHR5cGU6ICdudW1iZXInLFxuICB9LFxuICB0YXJnZXQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1Rlc3QgdGFyZ2V0JyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ3QnLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgVGVzdEFyZ3YgPSBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNjcmlwdE9wdGlvbnNCdWlsZGVyPj4+O1xuXG5leHBvcnQgY29uc3QgdGVzdENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAndGVzdCcsXG4gIGRlc2NyaWJlOiAnVGVzdCBwcm9qZWN0JyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgYXdhaXQgdGVzdChhcmd2KTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0ZXN0KFxuICBhcmd2OiBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kQWxsUHJvamVjdHMoYXJndik7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgaWYgKHByb2plY3RzLmFsbC5sZW5ndGggPiAxKSB7XG4gICAgLy8gRGlzYWJsZSBpbnRlcmFjdGl2ZSBtb2RlXG4gICAgcHJvY2Vzcy5lbnYuQ0kgPSAnMSc7XG4gIH1cbiAgcHJvY2Vzcy5lbnYuRk9SQ0VfQ09MT1IgfHw9ICczJztcbiAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAndGVzdCc7XG5cbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzLmFsbCkge1xuICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyB8fCB7fTtcbiAgICBjb25zdCBkZXZEZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgfHwge307XG4gICAgbGV0IHNjcmlwdHM6IEJhc2VTY3JpcHRzO1xuICAgIGlmIChkZXBzWydibGl0eiddKSB7XG4gICAgICBzY3JpcHRzID0gYmxpdHpTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGVwc1snbmV4dCddKSB7XG4gICAgICBzY3JpcHRzID0gbmV4dFNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXZEZXBzWydAcmVtaXgtcnVuL2RldiddKSB7XG4gICAgICBzY3JpcHRzID0gcmVtaXhTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoaHR0cFNlcnZlclBhY2thZ2VzLnNvbWUoKHApID0+IGRlcHNbcF0pICYmICFkZXBzWydmaXJlYmFzZS1mdW5jdGlvbnMnXSkge1xuICAgICAgc2NyaXB0cyA9IGh0dHBTZXJ2ZXJTY3JpcHRzO1xuICAgIH0gZWxzZSB7XG4gICAgICBzY3JpcHRzID0gcGxhaW5BcHBTY3JpcHRzO1xuICAgIH1cblxuICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyBcInRlc3RcIiBmb3IgJHtwcm9qZWN0Lm5hbWV9IC4uLmApO1xuXG4gICAgY29uc3QgcHJvbWlzZXM6IFByb21pc2U8dW5rbm93bj5bXSA9IFtdO1xuICAgIGlmIChhcmd2LmNpKSB7XG4gICAgICBjb25zdCB1bml0VGVzdHNFeGlzdFByb21pc2UgPSBleGlzdHNBc3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAndGVzdHMnLCAndW5pdCcpKTtcbiAgICAgIGNvbnN0IGUyZVRlc3RzRXhpc3RQcm9taXNlID0gZXhpc3RzQXN5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3RzJywgJ2UyZScpKTtcblxuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChkb2NrZXJTY3JpcHRzLnN0b3BBbGwoKSwgcHJvamVjdCwgYXJndik7XG4gICAgICBpZiAoYXJndi51bml0ICE9PSBmYWxzZSAmJiAoYXdhaXQgdW5pdFRlc3RzRXhpc3RQcm9taXNlKSkge1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKHNjcmlwdHMudGVzdFVuaXQocHJvamVjdCwgYXJndikucmVwbGFjZUFsbCgnIC0tYWxsb3dPbmx5JywgJycpLCBwcm9qZWN0LCBhcmd2LCB7XG4gICAgICAgICAgdGltZW91dDogYXJndi51bml0VGltZW91dCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoYXJndi5zdGFydCAhPT0gZmFsc2UpIHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChzY3JpcHRzLnRlc3RTdGFydChwcm9qZWN0LCBhcmd2KSwgcHJvamVjdCwgYXJndik7XG4gICAgICB9XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gICAgICAvLyBDaGVjayBwbGF5d3JpZ2h0IGluc3RhbGxhdGlvbiBiZWNhdXNlIC0tY2kgaW5jbHVkZXMgLS1lMmUgaW1wbGljaXRseVxuICAgICAgaWYgKGFyZ3YuZTJlICE9PSAnbm9uZScgJiYgKGF3YWl0IGUyZVRlc3RzRXhpc3RQcm9taXNlKSkge1xuICAgICAgICBpZiAocHJvamVjdC5oYXNEb2NrZXJmaWxlKSB7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3NjcmlwdHMuYnVpbGREb2NrZXIocHJvamVjdCwgJ3Rlc3QnKX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvcHRpb25zID0gcHJvamVjdC5oYXNEb2NrZXJmaWxlXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIHN0YXJ0Q29tbWFuZDogZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQocHJvamVjdCwgdHJ1ZSksXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB7fTtcbiAgICAgICAgcHJvY2Vzcy5leGl0Q29kZSA9IGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgICBzY3JpcHRzLnRlc3RFMkUocHJvamVjdCwgYXJndiwgb3B0aW9ucykucmVwbGFjZUFsbCgnIC0tYWxsb3dPbmx5JywgJycpLFxuICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgYXJndixcbiAgICAgICAgICB7XG4gICAgICAgICAgICBleGl0SWZGYWlsZWQ6IGZhbHNlLFxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGRvY2tlclNjcmlwdHMuc3RvcChwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoYXJndi51bml0IHx8ICghYXJndi5zdGFydCAmJiBhcmd2LmUyZSA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgcHJvbWlzZXMucHVzaChydW5XaXRoU3Bhd24oc2NyaXB0cy50ZXN0VW5pdChwcm9qZWN0LCBhcmd2KSwgcHJvamVjdCwgYXJndiwgeyB0aW1lb3V0OiBhcmd2LnVuaXRUaW1lb3V0IH0pKTtcbiAgICB9XG4gICAgaWYgKGFyZ3Yuc3RhcnQpIHtcbiAgICAgIHByb21pc2VzLnB1c2gocnVuV2l0aFNwYXduKHNjcmlwdHMudGVzdFN0YXJ0KHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2KSk7XG4gICAgfVxuICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICAvLyBEb24ndCBjaGVjayBwbGF5d3JpZ2h0IGluc3RhbGxhdGlvbiBiZWNhdXNlIC0tZTJlIGlzIHNldCBleHBsaWNpdGx5XG4gICAgc3dpdGNoIChhcmd2LmUyZSkge1xuICAgICAgY2FzZSB1bmRlZmluZWQ6XG4gICAgICBjYXNlICdub25lJzoge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJyc6XG4gICAgICBjYXNlICdoZWFkbGVzcyc6IHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHNjcmlwdHMudGVzdEUyRShwcm9qZWN0LCBhcmd2LCB7fSksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2hlYWRsZXNzLWRldic6IHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHNjcmlwdHMudGVzdEUyRURldihwcm9qZWN0LCBhcmd2LCB7fSksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2RvY2tlcic6IHtcbiAgICAgICAgYXdhaXQgdGVzdE9uRG9ja2VyKHByb2plY3QsIGFyZ3YsIHNjcmlwdHMpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2RvY2tlci1kZWJ1Zyc6IHtcbiAgICAgICAgYXdhaXQgdGVzdE9uRG9ja2VyKHByb2plY3QsIGFyZ3YsIHNjcmlwdHMsIGB0ZXN0ICR7YXJndi50YXJnZXQgfHwgJ3Rlc3RzL2UyZSd9IC0tZGVidWdgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChkZXBzWydibGl0eiddIHx8IGRlcHNbJ25leHQnXSB8fCBkZXZEZXBzWydAcmVtaXgtcnVuL2RldiddKSB7XG4gICAgICBzd2l0Y2ggKGFyZ3YuZTJlKSB7XG4gICAgICAgIGNhc2UgJ2hlYWRlZCc6IHtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgICBzY3JpcHRzLnRlc3RFMkUocHJvamVjdCwgYXJndiwgeyBwbGF5d3JpZ2h0QXJnczogYHRlc3QgJHthcmd2LnRhcmdldCB8fCAndGVzdHMvZTJlJ30gLS1oZWFkZWRgIH0pLFxuICAgICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAgIGFyZ3ZcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2hlYWRlZC1kZXYnOiB7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICAgICAgc2NyaXB0cy50ZXN0RTJFRGV2KHByb2plY3QsIGFyZ3YsIHsgcGxheXdyaWdodEFyZ3M6IGB0ZXN0ICR7YXJndi50YXJnZXQgfHwgJ3Rlc3RzL2UyZSd9IC0taGVhZGVkYCB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICBhcmd2XG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdkZWJ1Zyc6IHtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgICBzY3JpcHRzLnRlc3RFMkUocHJvamVjdCwgYXJndiwgeyBwbGF5d3JpZ2h0QXJnczogYHRlc3QgJHthcmd2LnRhcmdldCB8fCAndGVzdHMvZTJlJ30gLS1kZWJ1Z2AgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgYXJndlxuICAgICAgICAgICk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZ2VuZXJhdGUnOiB7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICAgICAgc2NyaXB0cy50ZXN0RTJFKHByb2plY3QsIGFyZ3YsIHsgcGxheXdyaWdodEFyZ3M6ICdjb2RlZ2VuIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MCcgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgYXJndlxuICAgICAgICAgICk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAndHJhY2UnOiB7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGBCVU4gcGxheXdyaWdodCBzaG93LXRyYWNlYCwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGUyZSBtb2RlOiAke2FyZ3YuZTJlfWApO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHRlc3RPbkRvY2tlcihcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogQXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PixcbiAgc2NyaXB0czogQmFzZVNjcmlwdHMsXG4gIHBsYXl3cmlnaHRBcmdzPzogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3NjcmlwdHMuYnVpbGREb2NrZXIocHJvamVjdCwgJ3Rlc3QnKX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgcHJvY2Vzcy5leGl0Q29kZSA9IGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICBgJHtzY3JpcHRzLnRlc3RFMkUocHJvamVjdCwgYXJndiwge1xuICAgICAgcGxheXdyaWdodEFyZ3MsXG4gICAgICBzdGFydENvbW1hbmQ6IGRvY2tlclNjcmlwdHMuc3RvcEFuZFN0YXJ0KHByb2plY3QsIHRydWUpLFxuICAgIH0pfWAsXG4gICAgcHJvamVjdCxcbiAgICBhcmd2LFxuICAgIHsgZXhpdElmRmFpbGVkOiBmYWxzZSB9XG4gICk7XG4gIGF3YWl0IHJ1bldpdGhTcGF3bihkb2NrZXJTY3JpcHRzLnN0b3AocHJvamVjdCksIHByb2plY3QsIGFyZ3YpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmRBbGxQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgdHlwZUNoZWNrQ29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj5cbj4gPSB7XG4gIGNvbW1hbmQ6ICd0eXBlY2hlY2snLFxuICBkZXNjcmliZTogJ1J1biB0eXBlIGNoZWNraW5nLiAuZW52IGZpbGVzIGFyZSBpZ25vcmVkLicsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZEFsbFByb2plY3RzKGFyZ3YsIGZhbHNlKTtcbiAgICBpZiAoIXByb2plY3RzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzLmFsbCkge1xuICAgICAgY29uc3QgY29tbWFuZHM6IHN0cmluZ1tdID0gW107XG4gICAgICBpZiAoIXByb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcykge1xuICAgICAgICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LnR5cGVzY3JpcHQgfHwgcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LnR5cGVzY3JpcHQpIHtcbiAgICAgICAgICBjb21tYW5kcy5wdXNoKCdCVU4gdHNjIC0tbm9FbWl0IC0tUHJldHR5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy5weXJpZ2h0KSB7XG4gICAgICAgICAgY29tbWFuZHMucHVzaCgnWUFSTiBweXJpZ2h0Jyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIHByb2plY3QuaGFzU291cmNlQ29kZSAmJlxuICAgICAgICAocHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LnR5cGVzY3JpcHQgfHwgcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LnR5cGVzY3JpcHQpXG4gICAgICApIHtcbiAgICAgICAgY29tbWFuZHMucHVzaCgnQlVOIHRzYyAtLW5vRW1pdCAtLVByZXR0eScpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbW1hbmRzLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG5cbiAgICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyBcInR5cGVjaGVja1wiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICAgIGlmIChwcm9qZWN0cy5hbGwubGVuZ3RoID4gMSkge1xuICAgICAgICAvLyBEaXNhYmxlIGludGVyYWN0aXZlIG1vZGVcbiAgICAgICAgcHJvamVjdC5lbnZbJ0NJJ10gPSAnMSc7XG4gICAgICB9XG4gICAgICBwcm9qZWN0LmVudlsnRk9SQ0VfQ09MT1InXSB8fD0gJzMnO1xuXG4gICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHJ1bldpdGhTcGF3bihjb21tYW5kcy5qb2luKCcgJiYgJyksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgaWYgKGV4aXRDb2RlICE9PSAwKSB7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShhd2FpdCBmcy5yZWFkRmlsZSgncGFja2FnZS5qc29uJywgJ3V0ZjgnKSkgYXMgUGFja2FnZUpzb247XG4gICAgICAgIGNvbnN0IGRlcHMgPSBwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgfHwge307XG4gICAgICAgIGlmIChkZXBzWydibGl0eiddKSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKGNoYWxrLnllbGxvdygnUGxlYXNlIHRyeSBcInlhcm4gZ2VuLWNvZGVcIiBpZiB5b3UgZmFjZSB1bmtub3duIHR5cGUgZXJyb3JzLicpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCB0Y0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+ID0ge1xuICAuLi50eXBlQ2hlY2tDb21tYW5kLFxuICBjb21tYW5kOiAndGMnLFxufTtcbiIsImltcG9ydCB7IHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5cbmV4cG9ydCBjb25zdCBzaGFyZWRPcHRpb25zQnVpbGRlciA9IHtcbiAgLi4ueWFyZ3NPcHRpb25zQnVpbGRlckZvckVudixcbiAgLy8gVGhpcyBvcHRpb24gaXMgZm9yIGRlYnVnZ2luZyBtYWlubHkuXG4gICd3b3JraW5nLWRpcic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0Egd29ya2luZyBkaXJlY3RvcnknLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAndycsXG4gIH0sXG4gICdkcnktcnVuJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBza2lwIGFjdHVhbCBjb21tYW5kIGV4ZWN1dGlvbicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiAnZCcsXG4gIH0sXG59IGFzIGNvbnN0O1xuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgcmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHlhcmdzIGZyb20gJ3lhcmdzJztcbmltcG9ydCB7IGhpZGVCaW4gfSBmcm9tICd5YXJncy9oZWxwZXJzJztcblxuaW1wb3J0IHsgYnVpbGRJZk5lZWRlZENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2J1aWxkSWZOZWVkZWQuanMnO1xuaW1wb3J0IHsgb3B0aW1pemVGb3JEb2NrZXJCdWlsZENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL29wdGltaXplRm9yRG9ja2VyQnVpbGQuanMnO1xuaW1wb3J0IHsgcHJpc21hQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvcHJpc21hLmpzJztcbmltcG9ydCB7IHJldHJ5Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvcmV0cnkuanMnO1xuaW1wb3J0IHsgc2V0dXBDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9zZXR1cC5qcyc7XG5pbXBvcnQgeyBzdGFydENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3N0YXJ0LmpzJztcbmltcG9ydCB7IHRlc3RDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy90ZXN0LmpzJztcbmltcG9ydCB7IHRjQ29tbWFuZCwgdHlwZUNoZWNrQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdHlwZWNoZWNrLmpzJztcbmltcG9ydCB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmF3YWl0IHlhcmdzKGhpZGVCaW4ocHJvY2Vzcy5hcmd2KSlcbiAgLnNjcmlwdE5hbWUoJ3diJylcbiAgLm9wdGlvbnMoc2hhcmVkT3B0aW9uc0J1aWxkZXIpXG4gIC5taWRkbGV3YXJlKChhcmd2KSA9PiB7XG4gICAgY29uc3Qgd29ya2luZ0RpciA9IGFyZ3ZbJ3dvcmtpbmctZGlyJ107XG4gICAgaWYgKHdvcmtpbmdEaXIpIHtcbiAgICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUod29ya2luZ0Rpcik7XG4gICAgICBwcm9jZXNzLmNoZGlyKGRpclBhdGgpO1xuICAgIH1cblxuICAgIHJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyhwcm9jZXNzLmVudik7XG4gIH0pXG4gIC5jb21tYW5kKGJ1aWxkSWZOZWVkZWRDb21tYW5kKVxuICAuY29tbWFuZChvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZClcbiAgLmNvbW1hbmQocHJpc21hQ29tbWFuZClcbiAgLmNvbW1hbmQocmV0cnlDb21tYW5kKVxuICAuY29tbWFuZChzZXR1cENvbW1hbmQpXG4gIC5jb21tYW5kKHN0YXJ0Q29tbWFuZClcbiAgLmNvbW1hbmQodGVzdENvbW1hbmQpXG4gIC5jb21tYW5kKHR5cGVDaGVja0NvbW1hbmQpXG4gIC5jb21tYW5kKHRjQ29tbWFuZClcbiAgLmRlbWFuZENvbW1hbmQoKVxuICAuc3RyaWN0KClcbiAgLmhlbHAoKS5hcmd2O1xuXG5mb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXSkge1xuICBwcm9jZXNzLm9uKHNpZ25hbCwgKCkgPT4gcHJvY2Vzcy5leGl0KCkpO1xufVxuIl0sIm5hbWVzIjpbInJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyIsImFyZ3YiLCJjd2QiLCJjYWNoZUVuYWJsZWQiLCJlbnZQYXRocyIsImVudiIsIm1hcCIsImVudlBhdGgiLCJwYXRoIiwicmVzb2x2ZSIsInRvU3RyaW5nIiwiY2FzY2FkZSIsImNhc2NhZGVFbnYiLCJjYXNjYWRlTm9kZUVudiIsInByb2Nlc3MiLCJOT0RFX0VOViIsImF1dG9DYXNjYWRlRW52IiwiV0JfRU5WIiwidW5kZWZpbmVkIiwibGVuZ3RoIiwicHVzaCIsImpvaW4iLCJpbmNsdWRlUm9vdEVudiIsInJvb3RQYXRoIiwiZnMiLCJleGlzdHNTeW5jIiwiZmxhdE1hcCIsInJlbGF0aXZlIiwidmVyYm9zZSIsImNvbnNvbGUiLCJpbmZvIiwiZW52VmFycyIsIm9yZ0VudlZhcnMiLCJyZWFkRW52RmlsZSIsImNvdW50Iiwia2V5IiwidmFsdWUiLCJPYmplY3QiLCJlbnRyaWVzIiwiY2hlY2tFbnYiLCJtaXNzaW5nS2V5cyIsImtleXMiLCJmaWx0ZXIiLCJFcnJvciIsImNhY2hlZEVudlZhcnMiLCJNYXAiLCJmaWxlUGF0aCIsImNhY2hlZCIsImdldCIsInBhcnNlZCIsImNvbmZpZyIsInByb2Nlc3NFbnYiLCJzZXQiLCJleGlzdHNBc3luYyIsIlByb21pc2UiLCJhY2Nlc3MiLCJjb25zdGFudHMiLCJGX09LIiwiZXJyIiwiYXN5bmMiLCJzcGF3bkFzeW5jIiwiY29tbWFuZCIsImFyZ3MiLCJvcHRpb25zIiwicmVqZWN0IiwicHJvYyIsInNwYXduIiwic3Rkb3V0Iiwic2V0RW5jb2RpbmciLCJzdGRlcnIiLCJvbiIsImRhdGEiLCJtZXJnZU91dEFuZEVycm9yIiwic3RvcHBlZCIsInN0b3BQcm9jZXNzIiwicGlkIiwidHJlZUtpbGwiLCJraWxsT25FeGl0IiwiZXJyb3IiLCJyZW1vdmVMaXN0ZW5lciIsInJlbW92ZUFsbExpc3RlbmVycyIsImNvZGUiLCJzaWduYWwiLCJzdGF0dXMiLCJpbnB1dCIsInN0ZGluIiwid3JpdGUiLCJlbmQiLCJhbGlnbiIsInJpZ2h0Iiwic3RyIiwid2lkdGgiLCJ0cmltIiwic3RyV2lkdGgiLCJtaXhpbiIsInN0cmluZ1dpZHRoIiwicmVwZWF0IiwiY2VudGVyIiwiVUkiLCJjb25zdHJ1Y3RvciIsIm9wdHMiLCJfYSIsInRoaXMiLCJ3cmFwIiwicm93cyIsInNwYW4iLCJkaXYiLCJyZXNldE91dHB1dCIsInNob3VsZEFwcGx5TGF5b3V0RFNMIiwiYXBwbHlMYXlvdXREU0wiLCJjb2xzIiwiYXJnIiwiY29sRnJvbVN0cmluZyIsInRlc3QiLCJzcGxpdCIsInJvdyIsImxlZnRDb2x1bW5XaWR0aCIsImZvckVhY2giLCJjb2x1bW5zIiwiTWF0aCIsIm1pbiIsImZsb29yIiwiciIsImkiLCJ0ZXh0IiwicGFkZGluZyIsIm1lYXN1cmVQYWRkaW5nIiwibm9BbnNpIiwic3RyaXBBbnNpIiwibWF0Y2giLCJsaW5lcyIsInJvd1RvU3RyaW5nIiwibGluZSIsImhpZGRlbiIsInJhc3Rlcml6ZSIsInJyb3ciLCJjb2wiLCJjIiwid3JhcFdpZHRoIiwibmVnYXRlUGFkZGluZyIsInRzIiwiZm4iLCJhZGRCb3JkZXIiLCJyZW5kZXJJbmxpbmUiLCJyZXBsYWNlIiwic291cmNlIiwicHJldmlvdXNMaW5lIiwibGVhZGluZ1doaXRlc3BhY2UiLCJ0YXJnZXQiLCJ0YXJnZXRUZXh0V2lkdGgiLCJ0cmltUmlnaHQiLCJ0cmltTGVmdCIsInJyb3dzIiwid2lkdGhzIiwiY29sdW1uV2lkdGhzIiwid3JhcHBlZCIsImhhcmQiLCJib3JkZXIiLCJ1bnNoaWZ0IiwiQXJyYXkiLCJmaWxsIiwidW5zZXQiLCJyZW1haW5pbmdXaWR0aCIsInVuc2V0V2lkdGgiLCJ3IiwibWF4IiwibWluV2lkdGgiLCJfbWluV2lkdGgiLCJzdHlsZSIsImFuc2kiLCJSZWdFeHAiLCJzdGFydCIsImNoYXJBdCIsImNhbWVsQ2FzZSIsInRvTG93ZXJDYXNlIiwidG9VcHBlckNhc2UiLCJpbmRleE9mIiwiY2FtZWxjYXNlIiwibmV4dENoclVwcGVyIiwibGVhZGluZ0h5cGhlbnMiLCJjaHIiLCJkZWNhbWVsaXplIiwiam9pblN0cmluZyIsImxvd2VyY2FzZSIsIm5vdENhbWVsY2FzZSIsImNockxvd2VyIiwiY2hyU3RyaW5nIiwibG9va3NMaWtlTnVtYmVyIiwieCIsIkRlZmF1bHRWYWx1ZXNGb3JUeXBlS2V5IiwiaW5jcmVtZW50Iiwib3JpZyIsInNhbml0aXplS2V5IiwiX2IiLCJfYyIsIm1pbk5vZGVWZXJzaW9uIiwiWUFSR1NfTUlOX05PREVfVkVSU0lPTiIsIk51bWJlciIsIm5vZGVWZXJzaW9uIiwidmVyc2lvbnMiLCJub2RlIiwidmVyc2lvbiIsInNsaWNlIiwicGFyc2VyIiwiX21peGluIiwicGFyc2UiLCJhcmdzSW5wdXQiLCJhc3NpZ24iLCJhbGlhcyIsImFycmF5IiwiYm9vbGVhbiIsImNvbmZpZ09iamVjdHMiLCJjb25maWd1cmF0aW9uIiwiY29lcmNlIiwiZGVmYXVsdCIsImVudlByZWZpeCIsIm5hcmciLCJub3JtYWxpemUiLCJzdHJpbmciLCJudW1iZXIiLCJfXyIsImFyZ1N0cmluZyIsImlzQXJyYXkiLCJlIiwicHJldkMiLCJvcGVuaW5nIiwiaWkiLCJ0b2tlbml6ZUFyZ1N0cmluZyIsImlucHV0SXNTdHJpbmciLCJhbGlhc2VzIiwiYWxpYXNBcnJheXMiLCJjb21iaW5lZCIsImNyZWF0ZSIsImNoYW5nZSIsImNvbmNhdCIsInYiLCJzcGxpY2UiLCJhbGlhc0FycmF5IiwibGFzdEFsaWFzIiwic2VsZiIsInBvcCIsImNvbWJpbmVBbGlhc2VzIiwiZGVmYXVsdHMiLCJub3RGbGFnc09wdGlvbiIsIm5vdEZsYWdzQXJndiIsIm5ld0FsaWFzZXMiLCJkZWZhdWx0ZWQiLCJmb3JtYXQiLCJmbGFncyIsImFycmF5cyIsImJvb2xzIiwic3RyaW5ncyIsIm51bWJlcnMiLCJjb3VudHMiLCJjb25maWdzIiwibmFyZ3MiLCJjb2VyY2lvbnMiLCJuZWdhdGl2ZSIsIm5lZ2F0ZWRCb29sZWFuIiwiQm9vbGVhbiIsIm9wdCIsImFzc2lnbm1lbnQiLCJvYmoiLCJ5IiwiZXh0ZW5kQWxpYXNlcyIsImZpbmQiLCJjaGVja0FsbEFsaWFzZXMiLCJub3RGbGFncyIsIl8iLCJhcmd2UmV0dXJuIiwidHJ1bmNhdGVkQXJnIiwiYnJva2VuIiwibGV0dGVycyIsIm0iLCJuZXh0IiwiaXNVbmtub3duT3B0aW9uQXNBcmciLCJwdXNoUG9zaXRpb25hbCIsImVhdEFycmF5IiwiZWF0TmFyZ3MiLCJzZXRBcmciLCJkZWZhdWx0VmFsdWUiLCJqIiwibWF5YmVDb2VyY2VkTnVtYmVyIiwibWF5YmVDb2VyY2VOdW1iZXIiLCJhcmdBZnRlckVxdWFsU2lnbiIsInRvRWF0IiwiaXNOYU4iLCJpc1VuZGVmaW5lZCIsImF2YWlsYWJsZSIsImNvbnN1bWVkIiwiYXJnc1RvU2V0IiwibmFyZ3NDb3VudCIsImRlZlZhbCIsInByb2Nlc3NWYWx1ZSIsInZhbCIsInNob3VsZFN0cmlwUXVvdGVzIiwicHJvcCIsImFkZE5ld0FsaWFzIiwic3BsaXRLZXkiLCJzZXRLZXkiLCJrZXlQcm9wZXJ0aWVzIiwiYSIsInNoaWZ0IiwiaW5jbHVkZXMiLCJkZWZpbmVQcm9wZXJ0eSIsImVudW1lcmFibGUiLCJzdWJzdHJpbmciLCJzdHJpcFF1b3RlcyIsImlzU2FmZUludGVnZXIiLCJwYXJzZUZsb2F0Iiwic2V0Q29uZmlnT2JqZWN0IiwicHJldiIsImZ1bGxLZXkiLCJoYXNLZXkiLCJhcHBseUVudlZhcnMiLCJjb25maWdPbmx5IiwicHJlZml4IiwiZW52VmFyIiwibGFzdEluZGV4T2YiLCJhcHBseURlZmF1bHRzQW5kQWxpYXNlcyIsImNhbkxvZyIsIm8iLCJpc1R5cGVBcnJheSIsImlzVmFsdWVBcnJheSIsImR1cGxpY2F0ZSIsImZsYWciLCJ0b0NoZWNrIiwic2V0QWxpYXMiLCJoYXNBbnlGbGFnIiwiZmxhZ3NLZXlzIiwiayIsInNvbWUiLCJoYXNBbGxGbGFncyIsImhhc0FsbFNob3J0RmxhZ3MiLCJwYXR0ZXJucyIsInBhdHRlcm4iLCJoYXNGbGFnc01hdGNoaW5nIiwiaXNVbmtub3duT3B0aW9uIiwidHlwZSIsIkJPT0xFQU4iLCJTVFJJTkciLCJOVU1CRVIiLCJBUlJBWSIsImd1ZXNzVHlwZSIsIm51bSIsImNvbmZpZ0xvb2t1cCIsImNvbmZpZ0tleSIsImNvbmZpZ1BhdGgiLCJyZXNvbHZlZENvbmZpZ1BhdGgiLCJyZXNvbHZlQ29uZmlnIiwicmVxdWlyZSIsImV4IiwibmFtZSIsInNldENvbmZpZyIsImNvbmZpZ09iamVjdCIsImFwcGxpZWQiLCJTZXQiLCJoYXMiLCJhbGkiLCJhZGQiLCJhcHBseUNvZXJjaW9ucyIsInNldFBsYWNlaG9sZGVyS2V5cyIsIkpTT04iLCJyZWFkRmlsZVN5bmMiLCJ5YXJnc1BhcnNlciIsImdldFByb2Nlc3NBcmd2QmluSW5kZXgiLCJlbGVjdHJvbiIsImRlZmF1bHRBcHAiLCJkZXRhaWxlZCIsIllFcnJvciIsIm1zZyIsInN1cGVyIiwiY2FwdHVyZVN0YWNrVHJhY2UiLCJzaGltJDMiLCJ3cml0ZUZpbGUiLCJleGlzdHMiLCJmaWxlIiwic3RhdFN5bmMiLCJpc0ZpbGUiLCJzaGltIiwiWTE4TiIsImRpcmVjdG9yeSIsInVwZGF0ZUZpbGVzIiwibG9jYWxlIiwiZmFsbGJhY2tUb0xhbmd1YWdlIiwiY2FjaGUiLCJ3cml0ZVF1ZXVlIiwiYXJndW1lbnRzIiwiX3RhZ2dlZExpdGVyYWwiLCJjYiIsIl9yZWFkTG9jYWxlRmlsZSIsIl9lbnF1ZXVlV3JpdGUiLCJhcHBseSIsIl9fbiIsInByb3RvdHlwZSIsImNhbGwiLCJzaW5ndWxhciIsInBsdXJhbCIsInF1YW50aXR5Iiwib25lIiwib3RoZXIiLCJ2YWx1ZXMiLCJzZXRMb2NhbGUiLCJnZXRMb2NhbGUiLCJ1cGRhdGVMb2NhbGUiLCJoYXNPd25Qcm9wZXJ0eSIsInBhcnRzIiwicGFydCIsIndvcmsiLCJfcHJvY2Vzc1dyaXRlUXVldWUiLCJfdGhpcyIsImxhbmd1YWdlRmlsZSIsIl9yZXNvbHZlTG9jYWxlRmlsZSIsInNlcmlhbGl6ZWRMb2NhbGUiLCJzdHJpbmdpZnkiLCJsb2NhbGVMb29rdXAiLCJTeW50YXhFcnJvciIsIm1lc3NhZ2UiLCJfZmlsZUV4aXN0c1N5bmMiLCJSRVFVSVJFX0RJUkVDVE9SWV9FUlJPUiIsIl9fZGlybmFtZSIsImZpbGVVUkxUb1BhdGgiLCJ1cmwiLCJzaGltJDEiLCJhc3NlcnQiLCJub3RTdHJpY3RFcXVhbCIsInN0cmljdEVxdWFsIiwiY2xpdWkiLCJmaW5kVXAiLCJjYWxsYmFjayIsInRtcCIsImRpciIsImlzRGlyZWN0b3J5IiwiZGlybmFtZSIsInJlYWRkaXJTeW5jIiwiZ2V0RW52IiwiaW5zcGVjdCIsImdldENhbGxlckZpbGUiLCJnZXRQcm9jZXNzQXJndkJpbiIsIm1haW5GaWxlbmFtZSIsIlBhcnNlciIsImJhc2VuYW1lIiwiZXh0bmFtZSIsImVtaXRXYXJuaW5nIiwid2FybmluZyIsImV4ZWNQYXRoIiwiZXhpdCIsIm5leHRUaWNrIiwic3RkQ29sdW1ucyIsInJlcXVpcmVEaXJlY3RvcnkiLCJ5MThuIiwiX3NoaW0iLCJiaW5kIiwiX3kxOG4iLCJhc3NlcnROb3RTdHJpY3RFcXVhbCIsImFjdHVhbCIsImV4cGVjdGVkIiwiYXNzZXJ0U2luZ2xlS2V5Iiwib2JqZWN0S2V5cyIsIm9iamVjdCIsImlzUHJvbWlzZSIsIm1heWJlUHJvbWlzZSIsInRoZW4iLCJwYXJzZUNvbW1hbmQiLCJjbWQiLCJzcGxpdENvbW1hbmQiLCJicmVnZXgiLCJmaXJzdENvbW1hbmQiLCJwYXJzZWRDb21tYW5kIiwiZGVtYW5kZWQiLCJvcHRpb25hbCIsInZhcmlhZGljIiwicG9zaXRpb25OYW1lIiwiYXJnc2VydCIsImFyZzEiLCJhcmcyIiwiYXJnMyIsInBvc2l0aW9uIiwiY2FsbGVyQXJndW1lbnRzIiwiX2xlbmd0aCIsInRvdGFsQ29tbWFuZHMiLCJvYnNlcnZlZFR5cGUiLCJhcmd1bWVudFR5cGVFcnJvciIsIndhcm4iLCJzdGFjayIsImFsbG93ZWRUeXBlcyIsIkdsb2JhbE1pZGRsZXdhcmUiLCJ5YXJncyIsImdsb2JhbE1pZGRsZXdhcmUiLCJmcm96ZW5zIiwiYWRkTWlkZGxld2FyZSIsImFwcGx5QmVmb3JlVmFsaWRhdGlvbiIsImdsb2JhbCIsIm11dGF0ZXMiLCJhZGRDb2VyY2VNaWRkbGV3YXJlIiwib3B0aW9uIiwiZ2V0QWxpYXNlcyIsImdldE1pZGRsZXdhcmUiLCJmcmVlemUiLCJ1bmZyZWV6ZSIsImZyb3plbiIsInJlc2V0IiwiYXBwbHlNaWRkbGV3YXJlIiwibWlkZGxld2FyZXMiLCJiZWZvcmVWYWxpZGF0aW9uIiwicmVkdWNlIiwiYWNjIiwibWlkZGxld2FyZSIsImluaXRpYWxPYmoiLCJhbGwiLCJtaWRkbGV3YXJlT2JqIiwicmVzdWx0IiwibWF5YmVBc3luY1Jlc3VsdCIsImdldFJlc3VsdCIsInJlc3VsdEhhbmRsZXIiLCJlcnJvckhhbmRsZXIiLCJERUZBVUxUX01BUktFUiIsIkNvbW1hbmRJbnN0YW5jZSIsInVzYWdlIiwidmFsaWRhdGlvbiIsInJlcXVpcmVDYWNoZSIsImhhbmRsZXJzIiwiYWxpYXNNYXAiLCJhZGREaXJlY3RvcnkiLCJyZXEiLCJjYWxsZXJGaWxlIiwicmVjdXJzZSIsImV4dGVuc2lvbnMiLCJwYXJlbnRWaXNpdCIsInZpc2l0Iiwiam9pbmVkIiwiZmlsZW5hbWUiLCJ2aXNpdGVkIiwiYWRkSGFuZGxlciIsImRlc2NyaXB0aW9uIiwiYnVpbGRlciIsImhhbmRsZXIiLCJjb21tYW5kTWlkZGxld2FyZSIsImRlcHJlY2F0ZWQiLCJjb21tYW5kTWlkZGxld2FyZUZhY3RvcnkiLCJldmVyeSIsImlzQ29tbWFuZEFuZEFsaWFzZXMiLCJpc0NvbW1hbmRIYW5kbGVyRGVmaW5pdGlvbiIsIm1vZHVsZU5hbWUiLCJleHRyYWN0RGVzYyIsImlzQ29tbWFuZEJ1aWxkZXJEZWZpbml0aW9uIiwiaXNEZWZhdWx0IiwicGFyc2VkQWxpYXNlcyIsIm9yaWdpbmFsIiwiZGVmYXVsdENvbW1hbmQiLCJnZXRDb21tYW5kSGFuZGxlcnMiLCJnZXRDb21tYW5kcyIsImhhc0RlZmF1bHRDb21tYW5kIiwicnVuQ29tbWFuZCIsImNvbW1hbmRJbmRleCIsImhlbHBPbmx5IiwiaGVscE9yVmVyc2lvblNldCIsImNvbW1hbmRIYW5kbGVyIiwiY3VycmVudENvbnRleHQiLCJnZXRJbnRlcm5hbE1ldGhvZHMiLCJnZXRDb250ZXh0IiwicGFyZW50Q29tbWFuZHMiLCJjb21tYW5kcyIsImlzRGVmYXVsdENvbW1hbmQiLCJmdWxsQ29tbWFuZHMiLCJidWlsZGVyUmVzdWx0IiwiYXBwbHlCdWlsZGVyVXBkYXRlVXNhZ2VBbmRQYXJzZSIsImFwcGx5TWlkZGxld2FyZUFuZEdldFJlc3VsdCIsImlubmVyQXJndiIsImlubmVyWWFyZ3MiLCJpc0NvbW1hbmRCdWlsZGVyQ2FsbGJhY2siLCJnZXRVc2FnZUluc3RhbmNlIiwiYnVpbGRlck91dHB1dCIsIm91dHB1dCIsInBhcnNlQW5kVXBkYXRlVXNhZ2UiLCJpc0NvbW1hbmRCdWlsZGVyT3B0aW9uRGVmaW5pdGlvbnMiLCJzaG91bGRVcGRhdGVVc2FnZSIsInVzYWdlRnJvbVBhcmVudENvbW1hbmRzQ29tbWFuZEhhbmRsZXIiLCJydW5ZYXJnc1BhcnNlckFuZEV4ZWN1dGVDb21tYW5kcyIsImdldFVzYWdlRGlzYWJsZWQiLCJnZXRVc2FnZSIsInBjIiwiaGFuZGxlVmFsaWRhdGlvbkFuZEdldFJlc3VsdCIsInBvc2l0aW9uYWxNYXAiLCJnZXRIYXNPdXRwdXQiLCJydW5WYWxpZGF0aW9uIiwic2V0SGFzT3V0cHV0IiwicG9wdWxhdGVEb3VibGVEYXNoIiwiZ2V0T3B0aW9ucyIsInBvc3RQcm9jZXNzIiwiaGFuZGxlclJlc3VsdCIsImNhY2hlSGVscE1lc3NhZ2UiLCJoYXNQYXJzZUNhbGxiYWNrIiwiY2F0Y2giLCJmYWlsIiwiX2VyciIsInBvcHVsYXRlUG9zaXRpb25hbHMiLCJtYXliZVByb21pc2VBcmd2IiwicmVzb2x2ZWRJbm5lckFyZ3YiLCJjb250ZXh0IiwicG9zaXRpb25hbENvdW50IiwiZGVtYW5kIiwicG9wdWxhdGVQb3NpdGlvbmFsIiwibWF5YmUiLCJwb3N0UHJvY2Vzc1Bvc2l0aW9uYWxzIiwiY21kVG9QYXJzZU9wdGlvbnMiLCJwb3NpdGlvbmFsIiwiU3RyaW5nIiwiY21kU3RyaW5nIiwicGFyc2VPcHRpb25zIiwiZCIsInVucGFyc2VkIiwicG9zaXRpb25hbEtleXMiLCJpc0luQ29uZmlncyIsImlzRGVmYXVsdGVkIiwicnVuRGVmYXVsdEJ1aWxkZXJPbiIsImNvbW1hbmRTdHJpbmciLCJtb2QiLCJleHBvcnRlZCIsImZpbGVzIiwiZXhwb3J0cyIsIndoaWNoTW9kdWxlIiwiY29tbWFuZEZyb21GaWxlbmFtZSIsImRlc2NyaWJlIiwiZGVzYyIsIm9iakZpbHRlciIsInNldEJsb2NraW5nIiwiYmxvY2tpbmciLCJfc3RyZWFtIiwic3RyZWFtIiwiX2hhbmRsZSIsImlzVFRZIiwiaXNCb29sZWFuIiwiZmFpbHMiLCJmYWlsRm4iLCJmIiwiZmFpbE1lc3NhZ2UiLCJnbG9iYWxGYWlsTWVzc2FnZSIsInNob3dIZWxwT25GYWlsIiwiZW5hYmxlZCIsImlzR2xvYmFsQ29udGV4dCIsImZhaWx1cmVPdXRwdXQiLCJsb2dnZXIiLCJnZXRMb2dnZXJJbnN0YW5jZSIsImdldEV4aXRQcm9jZXNzIiwic2hvd0hlbHAiLCJnbG9iYWxPckNvbW1hbmRGYWlsTWVzc2FnZSIsInVzYWdlcyIsInVzYWdlRGlzYWJsZWQiLCJnZXRQb3NpdGlvbmFsR3JvdXBOYW1lIiwiZXhhbXBsZXMiLCJleGFtcGxlIiwiY21kQXJyYXkiLCJkZXNjcmlwdGlvbnMiLCJrZXlPcktleXMiLCJnZXREZXNjcmlwdGlvbnMiLCJlcGlsb2dzIiwiZXBpbG9nIiwid3JhcFNldCIsImdldFdyYXAiLCJtYXhXaWR0aCIsIndpbmRvd1dpZHRoIiwiZGVmZXJZMThuTG9va3VwUHJlZml4IiwidGFibGUiLCJ0aGVXcmFwIiwibW9kaWZpZXIiLCJnZXRUZXh0IiwiZ2V0SW5kZW50YXRpb24iLCJwYXJzZUludCIsImNhY2hlZEhlbHBNZXNzYWdlIiwiZmlsdGVySGlkZGVuT3B0aW9ucyIsImhpZGRlbk9wdGlvbnMiLCJzaG93SGlkZGVuT3B0IiwiZGVmYXVsdFN0cmluZyIsImRlZmF1bHREZXNjcmlwdGlvbiIsImRlZmVyWTE4bkxvb2t1cCIsImhlbHAiLCJkZW1hbmRlZE9wdGlvbnMiLCJnZXREZW1hbmRlZE9wdGlvbnMiLCJkZW1hbmRPcHRpb24iLCJub3JtYWxpemVBbGlhc2VzIiwiYmFzZSQwIiwiY3VzdG9tU2NyaXB0TmFtZSIsIiQwIiwiZGVtYW5kZWRDb21tYW5kcyIsImdldERlbWFuZGVkQ29tbWFuZHMiLCJkZXByZWNhdGVkT3B0aW9ucyIsImdldERlcHJlY2F0ZWRPcHRpb25zIiwiZ3JvdXBzIiwiZ2V0R3JvdXBzIiwidWkiLCJ1IiwiZ2V0UGFyc2VyQ29uZmlndXJhdGlvbiIsInNvcnQiLCJiIiwibG9jYWxlQ29tcGFyZSIsImhpbnRzIiwiYWxpYXNLZXlzIiwiZGVmYXVsdEdyb3VwIiwiZ3JvdXBlZEtleXMiLCJncm91cCIsImFkZFVuZ3JvdXBlZEtleXMiLCJpc0xvbmdTd2l0Y2giLCJzdyIsImRpc3BsYXllZEdyb3VwcyIsImdyb3VwTmFtZSIsIm5vcm1hbGl6ZWRLZXlzIiwiYWxpYXNLZXkiLCJzd2l0Y2hlcyIsInN3MSIsInN3MiIsImluZGVudCIsImlzSW5kZW50ZWRUZXh0IiwiaW5kZW50YXRpb24iLCJrc3dpdGNoIiwiZXh0cmEiLCJjaG9pY2VzIiwic3RyaW5naWZpZWRWYWx1ZXMiLCJzaG91bGRIaWRlT3B0aW9uRXh0cmFzIiwiZ2V0VXNhZ2VDb25maWd1cmF0aW9uIiwiY2xlYXJDYWNoZWRIZWxwTWVzc2FnZSIsImhhc0NhY2hlZEhlbHBNZXNzYWdlIiwibGV2ZWwiLCJmdW5jdGlvbkRlc2NyaXB0aW9uIiwic2VwYXJhdG9yIiwic2VwIiwidmVyIiwic2hvd1ZlcnNpb24iLCJsb2NhbExvb2t1cCIsIkNvbXBsZXRpb24iLCJjb21wbGV0aW9uS2V5IiwiY3VzdG9tQ29tcGxldGlvbkZ1bmN0aW9uIiwiaW5kZXhBZnRlckxhc3RSZXNldCIsInpzaFNoZWxsIiwiZGVmYXVsdENvbXBsZXRpb24iLCJjdXJyZW50IiwiZG9uZSIsImNvbXBsZXRpb25zIiwiY29tbWFuZENvbXBsZXRpb25zIiwib3B0aW9uQ29tcGxldGlvbnMiLCJjaG9pY2VzRnJvbU9wdGlvbnNDb21wbGV0aW9ucyIsImNob2ljZXNGcm9tUG9zaXRpb25hbHNDb21wbGV0aW9ucyIsInByZXZpb3VzQXJnSGFzQ2hvaWNlcyIsInVzYWdlQ29tbWFuZCIsImNvbW1hbmROYW1lIiwibmVnYWJsZSIsImFyZ3NDb250YWluS2V5IiwiY29tcGxldGVPcHRpb25LZXkiLCJnZXRQcmV2aW91c0FyZ0Nob2ljZXMiLCJvZmZzZXQiLCJwb3NpdGlvbmFsS2V5IiwiY2hvaWNlIiwic3RhcnRzV2l0aCIsInByZXZpb3VzQXJnIiwicHJldmlvdXNBcmdLZXkiLCJwb3NzaWJsZUFsaWFzZXMiLCJwb3NzaWJsZUFsaWFzIiwiYXJnc0NvbnRhaW5zIiwicyIsIl9kIiwia2V5V2l0aERlc2MiLCJkZXNjcyIsImRlc2NGcm9tQWxpYXMiLCJkYXNoZXMiLCJzdGFydHNCeVR3b0Rhc2hlcyIsImlzU2hvcnRPcHRpb24iLCJjdXN0b21Db21wbGV0aW9uIiwibGlzdCIsImNvbXBsZXRpb25GdW5jdGlvbiIsImlzRmFsbGJhY2tDb21wbGV0aW9uRnVuY3Rpb24iLCJvbkNvbXBsZXRlZCIsImdldENvbXBsZXRpb24iLCJnZW5lcmF0ZUNvbXBsZXRpb25TY3JpcHQiLCJzY3JpcHQiLCJyZWdpc3RlckZ1bmN0aW9uIiwic2V0UGFyc2VkIiwibGV2ZW5zaHRlaW4iLCJtYXRyaXgiLCJzcGVjaWFsS2V5cyIsInByZXZpb3VzbHlWaXNpdGVkQ29uZmlncyIsImFwcGx5RXh0ZW5kcyIsIm1lcmdlRXh0ZW5kcyIsImRlZmF1bHRDb25maWciLCJleHRlbmRzIiwiaXNQYXRoIiwicGF0aFRvRGVmYXVsdCIsInBhdGhUb0V4dGVuZCIsImdldFBhdGhUb0RlZmF1bHRDb25maWciLCJjZmdQYXRoIiwiY2hlY2tGb3JDaXJjdWxhckV4dGVuZHMiLCJtZXJnZURlZXAiLCJjb25maWcxIiwiY29uZmlnMiIsImlzT2JqZWN0IiwiX1lhcmdzSW5zdGFuY2VfY29tbWFuZCIsIl9ZYXJnc0luc3RhbmNlX2N3ZCIsIl9ZYXJnc0luc3RhbmNlX2NvbnRleHQiLCJfWWFyZ3NJbnN0YW5jZV9jb21wbGV0aW9uIiwiX1lhcmdzSW5zdGFuY2VfY29tcGxldGlvbkNvbW1hbmQiLCJfWWFyZ3NJbnN0YW5jZV9kZWZhdWx0U2hvd0hpZGRlbk9wdCIsIl9ZYXJnc0luc3RhbmNlX2V4aXRFcnJvciIsIl9ZYXJnc0luc3RhbmNlX2RldGVjdExvY2FsZSIsIl9ZYXJnc0luc3RhbmNlX2VtaXR0ZWRXYXJuaW5ncyIsIl9ZYXJnc0luc3RhbmNlX2V4aXRQcm9jZXNzIiwiX1lhcmdzSW5zdGFuY2VfZnJvemVucyIsIl9ZYXJnc0luc3RhbmNlX2dsb2JhbE1pZGRsZXdhcmUiLCJfWWFyZ3NJbnN0YW5jZV9ncm91cHMiLCJfWWFyZ3NJbnN0YW5jZV9oYXNPdXRwdXQiLCJfWWFyZ3NJbnN0YW5jZV9oZWxwT3B0IiwiX1lhcmdzSW5zdGFuY2VfaXNHbG9iYWxDb250ZXh0IiwiX1lhcmdzSW5zdGFuY2VfbG9nZ2VyIiwiX1lhcmdzSW5zdGFuY2Vfb3V0cHV0IiwiX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucyIsIl9ZYXJnc0luc3RhbmNlX3BhcmVudFJlcXVpcmUiLCJfWWFyZ3NJbnN0YW5jZV9wYXJzZXJDb25maWciLCJfWWFyZ3NJbnN0YW5jZV9wYXJzZUZuIiwiX1lhcmdzSW5zdGFuY2VfcGFyc2VDb250ZXh0IiwiX1lhcmdzSW5zdGFuY2VfcGtncyIsIl9ZYXJnc0luc3RhbmNlX3ByZXNlcnZlZEdyb3VwcyIsIl9ZYXJnc0luc3RhbmNlX3Byb2Nlc3NBcmdzIiwiX1lhcmdzSW5zdGFuY2VfcmVjb21tZW5kQ29tbWFuZHMiLCJfWWFyZ3NJbnN0YW5jZV9zaGltIiwiX1lhcmdzSW5zdGFuY2Vfc3RyaWN0IiwiX1lhcmdzSW5zdGFuY2Vfc3RyaWN0Q29tbWFuZHMiLCJfWWFyZ3NJbnN0YW5jZV9zdHJpY3RPcHRpb25zIiwiX1lhcmdzSW5zdGFuY2VfdXNhZ2UiLCJfWWFyZ3NJbnN0YW5jZV91c2FnZUNvbmZpZyIsIl9ZYXJnc0luc3RhbmNlX3ZlcnNpb25PcHQiLCJfWWFyZ3NJbnN0YW5jZV92YWxpZGF0aW9uIiwiX19jbGFzc1ByaXZhdGVGaWVsZFNldCIsInJlY2VpdmVyIiwic3RhdGUiLCJraW5kIiwiVHlwZUVycm9yIiwiX19jbGFzc1ByaXZhdGVGaWVsZEdldCIsImtDb3B5RG91YmxlRGFzaCIsIlN5bWJvbCIsImtDcmVhdGVMb2dnZXIiLCJrRGVsZXRlRnJvbVBhcnNlckhpbnRPYmplY3QiLCJrRW1pdFdhcm5pbmciLCJrRnJlZXplIiwia0dldERvbGxhclplcm8iLCJrR2V0UGFyc2VyQ29uZmlndXJhdGlvbiIsImtHZXRVc2FnZUNvbmZpZ3VyYXRpb24iLCJrR3Vlc3NMb2NhbGUiLCJrR3Vlc3NWZXJzaW9uIiwia1BhcnNlUG9zaXRpb25hbE51bWJlcnMiLCJrUGtnVXAiLCJrUG9wdWxhdGVQYXJzZXJIaW50QXJyYXkiLCJrUG9wdWxhdGVQYXJzZXJIaW50U2luZ2xlVmFsdWVEaWN0aW9uYXJ5Iiwia1BvcHVsYXRlUGFyc2VySGludEFycmF5RGljdGlvbmFyeSIsImtQb3B1bGF0ZVBhcnNlckhpbnREaWN0aW9uYXJ5Iiwia1Nhbml0aXplS2V5Iiwia1NldEtleSIsImtVbmZyZWV6ZSIsImtWYWxpZGF0ZUFzeW5jIiwia0dldENvbW1hbmRJbnN0YW5jZSIsImtHZXRDb250ZXh0Iiwia0dldEhhc091dHB1dCIsImtHZXRMb2dnZXJJbnN0YW5jZSIsImtHZXRQYXJzZUNvbnRleHQiLCJrR2V0VXNhZ2VJbnN0YW5jZSIsImtHZXRWYWxpZGF0aW9uSW5zdGFuY2UiLCJrSGFzUGFyc2VDYWxsYmFjayIsImtJc0dsb2JhbENvbnRleHQiLCJrUG9zdFByb2Nlc3MiLCJrUmViYXNlIiwia1Jlc2V0Iiwia1J1bllhcmdzUGFyc2VyQW5kRXhlY3V0ZUNvbW1hbmRzIiwia1J1blZhbGlkYXRpb24iLCJrU2V0SGFzT3V0cHV0Iiwia1RyYWNrTWFudWFsbHlTZXRLZXlzIiwiWWFyZ3NJbnN0YW5jZSIsInByb2Nlc3NBcmdzIiwicGFyZW50UmVxdWlyZSIsImFkZEhlbHBPcHQiLCJhZGRTaG93SGlkZGVuT3B0Iiwic2hvd0hpZGRlbiIsImNoZWNrIiwiX3lhcmdzIiwic3RyaXBBbGlhc2VkIiwiY29uZmxpY3RzIiwia2V5MSIsImtleTIiLCJwYXJzZUZuIiwiY29tcGxldGlvbiIsImNvbW1hbmREaXIiLCJkZW1hbmRDb21tYW5kIiwibWluTXNnIiwibWF4TXNnIiwiSW5maW5pdHkiLCJkZXByZWNhdGVPcHRpb24iLCJkZXRlY3RMb2NhbGUiLCJkZXRlY3QiLCJlcGlsb2d1ZSIsImV4YW1wbGVQYXJhbXMiLCJleGl0UHJvY2VzcyIsImdldERldGVjdExvY2FsZSIsImdldEhlbHAiLCJidWlsZGVyUmVzcG9uc2UiLCJnZXRTdHJpY3QiLCJnZXRTdHJpY3RDb21tYW5kcyIsImdldFN0cmljdE9wdGlvbnMiLCJnbG9iYWxzIiwibG9jYWwiLCJsIiwiZyIsImV4aXN0aW5nIiwic2VlbiIsImhpZGUiLCJpbXBsaWVzIiwiZGVwcmVjYXRlIiwicmVxdWlyZWQiLCJjb25maWdQYXJzZXIiLCJza2lwVmFsaWRhdGlvbiIsInJlcXVpcmVzQXJnIiwic2hvcnRDaXJjdWl0IiwiX3BhcnNlRm4iLCJ0bXBQYXJzZWQiLCJmaW5hbGx5IiwicGFyc2VBc3luYyIsInBhcnNlU3luYyIsInBhcnNlckNvbmZpZ3VyYXRpb24iLCJwa2dDb25mIiwiY29uZiIsInN1cHBvcnRlZE9wdHMiLCJmdWxsQ29tbWFuZCIsInBrIiwicGFyc2VPcHRpb24iLCJyZWNvbW1lbmRDb21tYW5kcyIsInJlY29tbWVuZCIsIk5hTiIsInNob3dDb21wbGV0aW9uU2NyaXB0IiwibG9nIiwic2NyaXB0TmFtZSIsInN0cmljdCIsInN0cmljdENvbW1hbmRzIiwic3RyaWN0T3B0aW9ucyIsInRlcm1pbmFsV2lkdGgiLCJ1cGRhdGVTdHJpbmdzIiwidXNhZ2VDb25maWd1cmF0aW9uIiwiZGVmYXVsdFZlcnNpb25PcHQiLCJXZWFrTWFwIiwib3B0aW9uS2V5IiwiaGludEtleSIsImhpbnQiLCJkZWR1cGxpY2F0aW9uSWQiLCJjb21wbGV0aW9uQ29tbWFuZCIsImV4aXRFcnJvciIsImhhc091dHB1dCIsInBhcnNlQ29udGV4dCIsImRlZmF1bHQkMCIsIm5wYXRoIiwic3RhcnREaXIiLCJwa2dKc29uUGF0aCIsIm5hbWVzIiwiX25vb3AiLCJzaW5nbGVLZXlIYW5kbGVyIiwiX2UiLCJfZiIsIl9nIiwiX2giLCJfaiIsIl9rIiwiX2wiLCJfbSIsIl9vIiwiZ2V0Q29tbWFuZEluc3RhbmNlIiwiZ2V0UGFyc2VDb250ZXh0IiwiZ2V0VmFsaWRhdGlvbkluc3RhbmNlIiwiY2FsbGVkRnJvbUNvbW1hbmQiLCJydW5HbG9iYWxNaWRkbGV3YXJlIiwidG1wT3B0aW9ucyIsIlVzYWdlIiwiX3MiLCJvYnNlcnZlZCIsIm1pc3NpbmciLCJjdXN0b21Nc2dzIiwiY3VzdG9tTXNnIiwiY2hlY2tQb3NpdGlvbmFscyIsImNvbW1hbmRLZXlzIiwidW5rbm93biIsImlzVmFsaWRBbmRTb21lQWxpYXNJc05vdE5ldyIsIm1heE5vbk9wdERlbWFuZGVkIiwiaW52YWxpZCIsImludmFsaWRLZXlzIiwiaW1wbGllZCIsImtleUV4aXN0cyIsImdldEltcGxpZWQiLCJpbXBsaWNhdGlvbnMiLCJpbXBseUZhaWwiLCJvcmlnS2V5Iiwib3JpZ1ZhbHVlIiwiY29uZmxpY3RpbmciLCJnZXRDb25mbGljdGluZyIsInBvdGVudGlhbENvbW1hbmRzIiwicmVjb21tZW5kZWQiLCJiZXN0RGlzdGFuY2UiLCJjYW5kaWRhdGUiLCJkaXN0YW5jZSIsIlZhbGlkYXRpb24iLCJDb21tYW5kIiwiYmFzZSIsImFyZ3ZQcm9taXNlIiwiaGVscE9wdFNldCIsInZlcnNpb25PcHRTZXQiLCJoYW5kbGVyS2V5cyIsInJlcXVlc3RDb21wbGV0aW9ucyIsInNraXBSZWNvbW1lbmRhdGlvbiIsImZpcnN0VW5rbm93bkNvbW1hbmQiLCJjb21wbGV0aW9uQXJncyIsInBhcnNlRXJyb3JzIiwibm9uT3B0aW9uQ291bnQiLCJyZXF1aXJlZEFyZ3VtZW50cyIsImZhaWxlZFN0cmljdENvbW1hbmRzIiwidW5rbm93bkNvbW1hbmRzIiwidW5rbm93bkFyZ3VtZW50cyIsImxpbWl0ZWRDaG9pY2VzIiwiWWFyZ3MiLCJlc21QbGF0Zm9ybVNoaW0iLCJpc1J1bm5pbmdPbkJ1biIsImVuZHNXaXRoIiwibnBtX2V4ZWNwYXRoIiwicnVudGltZVdpdGhBcmdzIiwicGFja2FnZU1hbmFnZXJXaXRoQXJncyIsIm1lbW9pemUiLCJjYWNoZUR1cmF0aW9uIiwidCIsIlBPU0lUSVZFX0lORklOSVRZIiwiY2FjaGVzIiwiY2FsY0tleSIsIm4iLCJjb2RlUG9pbnRBdCIsImltdWwiLCJwYWRTdGFydCIsIm1heENhY2hlZEFyZ3NTaXplIiwibWF4Q2FjaGVkVGhpc1NpemUiLCJEYXRlIiwibm93Iiwic2l6ZSIsImRlbGV0ZSIsImgiLCJtZW1vaXplRmFjdG9yeSIsIk1BWF9TQUZFX0lOVEVHRVIiLCJQcm9qZWN0IiwiX2luaXRQcm90byIsIl9hcHBseURlY3MiLCJwYXRoQnlOYW1lIiwiZGlyUGF0aCIsImxvYWRFbnYiLCJfZGlyUGF0aCIsImlzQnVuQXZhaWxhYmxlIiwicm9vdERpclBhdGgiLCJidWlsZENvbW1hbmQiLCJwYWNrYWdlSnNvbiIsInNjcmlwdHMiLCJidWlsZCIsImRvY2tlcmZpbGUiLCJmaW5kRmlsZSIsImhhc0RvY2tlcmZpbGUiLCJoYXNTb3VyY2VDb2RlIiwiZG9ja2VySW1hZ2VOYW1lIiwicmVwbGFjZUFsbCIsImhhc1ByaXNtYSIsImRlcGVuZGVuY2llcyIsImRldkRlcGVuZGVuY2llcyIsImRvY2tlclBhY2thZ2VKc29uIiwiYmluRXhpc3RzIiwiYmluRm91bmQiLCJjdXJyZW50UGF0aCIsImJpblBhdGgiLCJQQVRIIiwicGFyZW50UGF0aCIsImZpbGVOYW1lIiwicCIsImZpbmRTZWxmUHJvamVjdCIsImZpbmRBbGxQcm9qZWN0cyIsInJvb3RBbmRTZWxmUHJvamVjdHMiLCJ0aGlzUHJvamVjdCIsInJvb3RQcm9qZWN0Iiwid29ya3NwYWNlcyIsInJvb3QiLCJmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyIsImdldEFsbFByb2plY3RzIiwiYWxsUHJvamVjdHMiLCJ3b3Jrc3BhY2UiLCJnbG9iUGF0dGVybiIsInBhY2thZ2VEaXJzIiwid29ya3NwYWNlUGF0aCIsIndzIiwiZ2xvYmJ5IiwiZG90Iiwib25seURpcmVjdG9yaWVzIiwic3ViUGFja2FnZURpclBhdGgiLCJidWlsZElmTmVlZGVkQ29tbWFuZCIsInByb2plY3RQYXRoRm9yVGVzdGluZyIsInByb2plY3QiLCJjaGFsayIsInJlZCIsImNhblNraXAiLCJjYWNoZUZpbGVQYXRoIiwiY29udGVudEhhc2giLCJjYWNoZURpcmVjdG9yeVBhdGgiLCJwcm9taXNlcyIsIm1rZGlyIiwicmVjdXJzaXZlIiwiaGFzaCIsImNyZWF0ZUhhc2giLCJjb21taXRIYXNoIiwiY2hpbGRfcHJvY2VzcyIsImV4ZWNTeW5jIiwidXBkYXRlIiwiZW52aXJvbm1lbnRKc29uIiwiaWdub3JpbmdFbnZWYXJOYW1lcyIsImZpbHRlcmVkRmlsZVBhdGhzIiwic3Bhd25TeW5jIiwic3RkaW8iLCJlbmNvZGluZyIsImluY2x1ZGVQYXR0ZXJucyIsImluY2x1ZGVTdWZmaXgiLCJzdWZmaXgiLCJleGNsdWRlUGF0dGVybnMiLCJjb3B5IiwiZGlnZXN0IiwidXBkYXRlSGFzaFdpdGhEaWZmUmVzdWx0IiwiY2FjaGVkQ29udGVudEhhc2giLCJpZ25vcmVFbm9lbnRBc3luYyIsInJlYWRGaWxlIiwiY2FuU2tpcEJ1aWxkIiwiZ3JlZW4iLCJkcnlSdW4iLCJidWlsZElmTmVlZGVkIiwicmV0Iiwic2hlbGwiLCJleGl0Q29kZSIsInByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCIsInByb2plY3RzIiwib3B0aW1pemVGb3JEb2NrZXJCdWlsZENvbW1hbmQiLCJvdXRzaWRlIiwiZGVwcyIsIm9wdGltaXplRGV2RGVwZW5kZW5jaWVzIiwib3B0aW1pemVTY3JpcHRzIiwib3B0aW1pemVSb290UHJvcHMiLCJkaXN0RGlyUGF0aCIsImRldkRlcHMiLCJuYW1lV29yZHNUb0JlUmVtb3ZlZCIsIndvcmQiLCJuYW1lV29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cyIsImNvbnRlbnRXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzIiwiY29udGVudCIsInByaXZhdGUiLCJwdWJsaXNoQ29uZmlnIiwicHJldHRpZXIiLCJwcmlzbWFTY3JpcHRzIiwiZGVwbG95IiwiZGVwbG95Rm9yY2UiLCJiYWNrdXBQYXRoIiwiZGlyTmFtZSIsImxpdGVzdHJlYW0iLCJtaWdyYXRlIiwic2VlZCIsIm1pZ3JhdGVEZXYiLCJyZXN0b3JlIiwib3V0cHV0UGF0aCIsInNjcmlwdFBhdGgiLCJwcmlzbWEiLCJzdHVkaW8iLCJkYlVybE9yUGF0aCIsIlVSTCIsImFic29sdXRlUGF0aCIsImtpbGxlZCIsImtpbGxQb3J0UHJvY2Vzc0hhbmRsaW5nRXJyb3JzIiwicG9ydCIsImtpbGxQb3J0UHJvY2VzcyIsInByb21pc2VQb29sIiwiUHJvbWlzZVBvb2wiLCJkZWZhdWx0T3B0aW9ucyIsImV4aXRJZkZhaWxlZCIsInJ1bldpdGhTcGF3biIsInByaW50YWJsZVNjcmlwdCIsInJ1bm5hYmxlU2NyaXB0Iiwibm9ybWFsaXplU2NyaXB0IiwicHJpbnRTdGFydCIsInByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQiLCJraWxsRnVuYyIsImtpbGxQb3J0UHJvY2Vzc0ltbWVkaWF0ZWx5QW5kT25FeGl0IiwidGltZW91dCIsInJ1bldpdGhTcGF3bkluUGFyYWxsZWwiLCJydW4iLCJvdXQiLCJuZXdTY3JpcHQiLCJub3JtYWxpemVkU2NyaXB0Iiwid2VhayIsImdyYXkiLCJjeWFuIiwiYm9sZCIsInByaXNtYUNvbW1hbmQiLCJkZXBsb3lDb21tYW5kIiwiZGVwbG95Rm9yY2VDb21tYW5kIiwibGl0ZXN0cmVhbUNvbW1hbmQiLCJtaWdyYXRlQ29tbWFuZCIsIm1pZ3JhdGVEZXZDb21tYW5kIiwicmVzZXRDb21tYW5kIiwicmVzdG9yZUNvbW1hbmQiLCJzZWVkQ29tbWFuZCIsInN0dWRpb0NvbW1hbmQiLCJmaW5kUHJpc21hUHJvamVjdHMiLCJkZXBsb3lGb3JjZUJ1aWxkZXIiLCJyZXN0b3JlZCIsInRyaW1FbmQiLCJmaWx0ZXJlZCIsInJldHJ5Q29tbWFuZCIsInJldHJ5IiwiY21kQW5kQXJncyIsImxhc3RTdGF0dXMiLCJ5ZWxsb3ciLCJodHRwU2VydmVyUGFja2FnZXMiLCJzZXR1cENvbW1hbmQiLCJkaXJlbnRzIiwicmVhZGRpciIsIndpdGhGaWxlVHlwZXMiLCJvcyIsInBsYXRmb3JtIiwicGFja2FnZXMiLCJwcm9taXNlQWxsIiwibmV3RGVwcyIsIm5ld0RldkRlcHMiLCJkZXAiLCJzZXR1cCIsImRvY2tlclNjcmlwdHMiLCJidWlsZERldkltYWdlIiwic3RvcEFuZFN0YXJ0IiwidW5idWZmZXIiLCJhZGRpdGlvbmFsT3B0aW9ucyIsImFkZGl0aW9uYWxBcmdzIiwic3RvcCIsInNwYXduU3luY09uRXhpdCIsInN0b3BBbGwiLCJCYXNlU2NyaXB0cyIsImRlZmF1bHRQb3J0IiwiUE9SVCIsImJ1aWxkRG9ja2VyIiwic3RhcnREb2NrZXIiLCJub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQiLCJub3JtYWxpemVkQXJnc1RleHQiLCJ3YWl0QW5kT3BlbkFwcCIsInRlc3RFMkUiLCJwbGF5d3JpZ2h0QXJncyIsInByaXNtYURpcmVjdG9yeSIsInN0YXJ0Q29tbWFuZCIsInRlc3RFMkVEZXYiLCJ0ZXN0VW5pdCIsIndhaXRBcHAiLCJibGl0elNjcmlwdHMiLCJzdGFydFByb2R1Y3Rpb24iLCJ0ZXN0U3RhcnQiLCJodHRwU2VydmVyU2NyaXB0cyIsIndhdGNoIiwibmV4dFNjcmlwdHMiLCJwbGFpbkFwcFNjcmlwdHMiLCJyZW1peFNjcmlwdHMiLCJtb2RlIiwiZG9ja2VyT3B0aW9ucyIsIm5vcm1hbGl6ZUFyZ3MiLCJjb25maWd1cmVFbnZpcm9ubWVudFZhcmlhYmxlcyIsIndiRW52IiwiTkVYVF9QVUJMSUNfV0JfRU5WIiwidGVzdENvbW1hbmQiLCJjaSIsImUyZSIsInVuaXQiLCJDSSIsIkZPUkNFX0NPTE9SIiwidW5pdFRpbWVvdXQiLCJ0ZXN0T25Eb2NrZXIiLCJ1bml0VGVzdHNFeGlzdFByb21pc2UiLCJlMmVUZXN0c0V4aXN0UHJvbWlzZSIsInR5cGVDaGVja0NvbW1hbmQiLCJ0eXBlc2NyaXB0IiwicHlyaWdodCIsInRjQ29tbWFuZCIsInNoYXJlZE9wdGlvbnNCdWlsZGVyIiwid29ya2luZ0RpciIsImNoZGlyIiwiQkVSUllfQklOX0ZPTERFUiIsInVwcGVyS2V5IiwicmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzIl0sIm1hcHBpbmdzIjoia3JCQStDTyxTQUFTQSxFQUNkQyxFQUNBQyxFQUNBQyxHQUFlLEdBRWYsSUFBSUMsR0FBWUgsRUFBS0ksS0FBTyxJQUFJQyxLQUFLQyxHQUFZQyxFQUFLQyxRQUFRUCxFQUFLSyxFQUFRRyxjQUMzRSxNQUFNQyxFQUNKVixFQUFLVyxhQUNKWCxFQUFLWSxlQUNGQyxRQUFRVCxJQUFJVSxVQUFZLGNBQ3hCZCxFQUFLZSxlQUNIRixRQUFRVCxJQUFJWSxRQUFVSCxRQUFRVCxJQUFJVSxVQUFZLG1CQUM5Q0csR0FDUixHQUF1QixpQkFBWlAsRUFBc0IsQ0FDL0IsR0FBd0IsSUFBcEJQLEVBQVNlLFNBQ1hmLEVBQVNnQixLQUFLWixFQUFLYSxLQUFLbkIsRUFBSyxTQUN6QkQsRUFBS3FCLGdCQUFnQixDQUN2QixNQUFNQyxFQUFXZixFQUFLQyxRQUFRUCxFQUFLLEtBQU0sTUFDckNzQixFQUFHQyxXQUFXakIsRUFBS2EsS0FBS0UsRUFBVSxrQkFDcENuQixFQUFTZ0IsS0FBS1osRUFBS2EsS0FBS0UsRUFBVSxRQUV0QyxDQUVGbkIsRUFBV0EsRUFBU3NCLFNBQVNuQixHQUMzQkksRUFDSSxDQUFDLEdBQUdKLEtBQVdJLFVBQWlCLEdBQUdKLFVBQWlCLEdBQUdBLEtBQVdJLElBQVdKLEdBQzdFLENBQUMsR0FBR0EsVUFBaUJBLElBRTdCLENBQ0FILEVBQVdBLEVBQVNFLEtBQUtDLEdBQVlDLEVBQUttQixTQUFTekIsRUFBS0ssS0FDcEROLEVBQUsyQixVQUNQQyxRQUFRQyxLQUFLLFdBQVdoQixRQUFRVCxJQUFJWSxxQkFBcUJILFFBQVFULElBQUlVLFlBQ3JFYyxRQUFRQyxLQUFLLHFCQUFzQjFCLElBR3JDLElBQUkyQixFQUFrQyxDQUFBLEVBQ3RDLE1BQU1DLEVBQWEsSUFBS2xCLFFBQVFULEtBQ2hDLElBQUssTUFBTUUsS0FBV0gsRUFBVSxDQUM5QjJC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
|