@willbooster/wb 22.8.0 → 22.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,118 +0,0 @@
1
- import{existsSync as e}from"node:fs";import t from"node:path";import{readFile as n}from"node:fs/promises";import{TextlintKernel as r}from"@textlint/kernel";import{moduleInterop as i}from"@textlint/module-interop";import{MarkdownProcessor as a}from"@textlint/textlint-plugin-markdown/lib/src/MarkdownProcessor.js";import o from"@textlint-rule/textlint-rule-no-invalid-control-character";import s from"textlint-rule-no-zero-width-spaces";var c=Object.create,l=Object.defineProperty,u=Object.getOwnPropertyDescriptor,d=Object.getOwnPropertyNames,f=Object.getPrototypeOf,p=Object.prototype.hasOwnProperty,m=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t),e=null),t.exports),h=(e,t)=>{let n={};for(var r in e)l(n,r,{get:e[r],enumerable:!0});return t||l(n,Symbol.toStringTag,{value:`Module`}),n},g=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var i=d(t),a=0,o=i.length,s;a<o;a++)s=i[a],!p.call(e,s)&&s!==n&&l(e,s,{get:(e=>t[e]).bind(null,s),enumerable:!(r=u(t,s))||r.enumerable});return e},_=(e,t,n)=>(n=e==null?{}:c(f(e)),g(t||!e||!e.__esModule||!p.call(e,`default`)?l(n,`default`,{value:e,enumerable:!0}):n,e));function v(e){return Array.from(new Set(e))}function y(...e){let t,n,r;e.length===1?(t=0,r=1,[n]=e):[t,n,r=1]=e;let i=[],a=t;for(;a<n;)i.push(a),a+=r||1;return i}function b(e){return e.replace(/\\/g,`/`)}function x(e,t){if(!t||t===`all`||t===`*`)return y(1,e+1);if(t===`none`)return[];let n=[];for(let r of t.split(/[,;]/g))if(!r.includes(`-`))n.push(+r);else{let[t,i]=r.split(`-`,2);n.push(...y(+t,i?+i+1:e+1))}return v(n).filter(t=>t<=e).sort((e,t)=>e-t)}const S=Symbol.for(`yaml.alias`),ee=Symbol.for(`yaml.document`),C=Symbol.for(`yaml.map`),te=Symbol.for(`yaml.pair`),w=Symbol.for(`yaml.scalar`),ne=Symbol.for(`yaml.seq`),T=Symbol.for(`yaml.node.type`),E=e=>!!e&&typeof e==`object`&&e[T]===S,D=e=>!!e&&typeof e==`object`&&e[T]===ee,re=e=>!!e&&typeof e==`object`&&e[T]===C,O=e=>!!e&&typeof e==`object`&&e[T]===te,k=e=>!!e&&typeof e==`object`&&e[T]===w,ie=e=>!!e&&typeof e==`object`&&e[T]===ne;function A(e){if(e&&typeof e==`object`)switch(e[T]){case C:case ne:return!0}return!1}function j(e){if(e&&typeof e==`object`)switch(e[T]){case S:case C:case w:case ne:return!0}return!1}const ae=e=>(k(e)||A(e))&&!!e.anchor,M=Symbol(`break visit`),oe=Symbol(`skip children`),N=Symbol(`remove node`);function P(e,t){let n=ce(t);D(e)?F(null,e.contents,n,Object.freeze([e]))===N&&(e.contents=null):F(null,e,n,Object.freeze([]))}P.BREAK=M,P.SKIP=oe,P.REMOVE=N;function F(e,t,n,r){let i=le(e,t,n,r);if(j(i)||O(i))return ue(e,r,i),F(e,i,n,r);if(typeof i!=`symbol`){if(A(t)){r=Object.freeze(r.concat(t));for(let e=0;e<t.items.length;++e){let i=F(e,t.items[e],n,r);if(typeof i==`number`)e=i-1;else if(i===M)return M;else i===N&&(t.items.splice(e,1),--e)}}else if(O(t)){r=Object.freeze(r.concat(t));let e=F(`key`,t.key,n,r);if(e===M)return M;e===N&&(t.key=null);let i=F(`value`,t.value,n,r);if(i===M)return M;i===N&&(t.value=null)}}return i}async function se(e,t){let n=ce(t);D(e)?await I(null,e.contents,n,Object.freeze([e]))===N&&(e.contents=null):await I(null,e,n,Object.freeze([]))}se.BREAK=M,se.SKIP=oe,se.REMOVE=N;async function I(e,t,n,r){let i=await le(e,t,n,r);if(j(i)||O(i))return ue(e,r,i),I(e,i,n,r);if(typeof i!=`symbol`){if(A(t)){r=Object.freeze(r.concat(t));for(let e=0;e<t.items.length;++e){let i=await I(e,t.items[e],n,r);if(typeof i==`number`)e=i-1;else if(i===M)return M;else i===N&&(t.items.splice(e,1),--e)}}else if(O(t)){r=Object.freeze(r.concat(t));let e=await I(`key`,t.key,n,r);if(e===M)return M;e===N&&(t.key=null);let i=await I(`value`,t.value,n,r);if(i===M)return M;i===N&&(t.value=null)}}return i}function ce(e){return typeof e==`object`&&(e.Collection||e.Node||e.Value)?Object.assign({Alias:e.Node,Map:e.Node,Scalar:e.Node,Seq:e.Node},e.Value&&{Map:e.Value,Scalar:e.Value,Seq:e.Value},e.Collection&&{Map:e.Collection,Seq:e.Collection},e):e}function le(e,t,n,r){if(typeof n==`function`)return n(e,t,r);if(re(t))return n.Map?.(e,t,r);if(ie(t))return n.Seq?.(e,t,r);if(O(t))return n.Pair?.(e,t,r);if(k(t))return n.Scalar?.(e,t,r);if(E(t))return n.Alias?.(e,t,r)}function ue(e,t,n){let r=t[t.length-1];if(A(r))r.items[e]=n;else if(O(r))e===`key`?r.key=n:r.value=n;else if(D(r))r.contents=n;else{let e=E(r)?`alias`:`scalar`;throw Error(`Cannot replace node with ${e} parent`)}}const de={"!":`%21`,",":`%2C`,"[":`%5B`,"]":`%5D`,"{":`%7B`,"}":`%7D`},fe=e=>e.replace(/[!,[\]{}]/g,e=>de[e]);var L=class e{constructor(t,n){this.docStart=null,this.docEnd=!1,this.yaml=Object.assign({},e.defaultYaml,t),this.tags=Object.assign({},e.defaultTags,n)}clone(){let t=new e(this.yaml,this.tags);return t.docStart=this.docStart,t}atDocument(){let t=new e(this.yaml,this.tags);switch(this.yaml.version){case`1.1`:this.atNextDocument=!0;break;case`1.2`:this.atNextDocument=!1,this.yaml={explicit:e.defaultYaml.explicit,version:`1.2`},this.tags=Object.assign({},e.defaultTags)}return t}add(t,n){this.atNextDocument&&=(this.yaml={explicit:e.defaultYaml.explicit,version:`1.1`},this.tags=Object.assign({},e.defaultTags),!1);let r=t.trim().split(/[ \t]+/),i=r.shift();switch(i){case`%TAG`:{if(r.length!==2&&(n(0,`%TAG directive should contain exactly two parts`),r.length<2))return!1;let[e,t]=r;return this.tags[e]=t,!0}case`%YAML`:{if(this.yaml.explicit=!0,r.length!==1)return n(0,`%YAML directive should contain exactly one part`),!1;let[e]=r;if(e===`1.1`||e===`1.2`)return this.yaml.version=e,!0;{let t=/^\d+\.\d+$/.test(e);return n(6,`Unsupported YAML version ${e}`,t),!1}}default:return n(0,`Unknown directive ${i}`,!0),!1}}tagName(e,t){if(e===`!`)return`!`;if(e[0]!==`!`)return t(`Not a valid tag: ${e}`),null;if(e[1]===`<`){let n=e.slice(2,-1);return n===`!`||n===`!!`?(t(`Verbatim tags aren't resolved, so ${e} is invalid.`),null):(e[e.length-1]!==`>`&&t(`Verbatim tags must end with a >`),n)}let[,n,r]=e.match(/^(.*!)([^!]*)$/s);r||t(`The ${e} tag has no suffix`);let i=this.tags[n];if(i)try{return i+decodeURIComponent(r)}catch(e){return t(String(e)),null}return n===`!`?e:(t(`Could not resolve tag: ${e}`),null)}tagString(e){for(let[t,n]of Object.entries(this.tags))if(e.startsWith(n))return t+fe(e.substring(n.length));return e[0]===`!`?e:`!<${e}>`}toString(e){let t=this.yaml.explicit?[`%YAML ${this.yaml.version||`1.2`}`]:[],n=Object.entries(this.tags),r;if(e&&n.length>0&&j(e.contents)){let t={};P(e.contents,(e,n)=>{j(n)&&n.tag&&(t[n.tag]=!0)}),r=Object.keys(t)}else r=[];for(let[i,a]of n)(i!==`!!`||a!==`tag:yaml.org,2002:`)&&(!e||r.some(e=>e.startsWith(a)))&&t.push(`%TAG ${i} ${a}`);return t.join(`
2
- `)}};L.defaultYaml={explicit:!1,version:`1.2`},L.defaultTags={"!!":`tag:yaml.org,2002:`};function pe(e){if(/[\x00-\x19\s,[\]{}]/.test(e)){let t=`Anchor must not contain whitespace or control characters: ${JSON.stringify(e)}`;throw Error(t)}return!0}function me(e){let t=new Set;return P(e,{Value(e,n){n.anchor&&t.add(n.anchor)}}),t}function he(e,t){for(let n=1;;++n){let r=`${e}${n}`;if(!t.has(r))return r}}function ge(e,t){let n=[],r=new Map,i=null;return{onAnchor:r=>{n.push(r),i??=me(e);let a=he(t,i);return i.add(a),a},setAnchors:()=>{for(let e of n){let t=r.get(e);if(typeof t==`object`&&t.anchor&&(k(t.node)||A(t.node)))t.node.anchor=t.anchor;else{let t=Error(`Failed to resolve repeated object (this should not happen)`);throw t.source=e,t}}},sourceObjects:r}}function _e(e,t,n,r){if(r&&typeof r==`object`){if(Array.isArray(r))for(let t=0,n=r.length;t<n;++t){let n=r[t],i=_e(e,r,String(t),n);i===void 0?delete r[t]:i!==n&&(r[t]=i)}else if(r instanceof Map)for(let t of Array.from(r.keys())){let n=r.get(t),i=_e(e,r,t,n);i===void 0?r.delete(t):i!==n&&r.set(t,i)}else if(r instanceof Set)for(let t of Array.from(r)){let n=_e(e,r,t,t);n===void 0?r.delete(t):n!==t&&(r.delete(t),r.add(n))}else for(let[t,n]of Object.entries(r)){let i=_e(e,r,t,n);i===void 0?delete r[t]:i!==n&&(r[t]=i)}}return e.call(t,n,r)}function R(e,t,n){if(Array.isArray(e))return e.map((e,t)=>R(e,String(t),n));if(e&&typeof e.toJSON==`function`){if(!n||!ae(e))return e.toJSON(t,n);let r={aliasCount:0,count:1,res:void 0};n.anchors.set(e,r),n.onCreate=e=>{r.res=e,delete n.onCreate};let i=e.toJSON(t,n);return n.onCreate&&n.onCreate(i),i}return typeof e==`bigint`&&!n?.keep?Number(e):e}var ve=class{constructor(e){Object.defineProperty(this,T,{value:e})}clone(){let e=Object.create(Object.getPrototypeOf(this),Object.getOwnPropertyDescriptors(this));return this.range&&(e.range=this.range.slice()),e}toJS(e,{mapAsMap:t,maxAliasCount:n,onAnchor:r,reviver:i}={}){if(!D(e))throw TypeError(`A document argument is required`);let a={anchors:new Map,doc:e,keep:!0,mapAsMap:t===!0,mapKeyWarned:!1,maxAliasCount:typeof n==`number`?n:100},o=R(this,``,a);if(typeof r==`function`)for(let{count:e,res:t}of a.anchors.values())r(t,e);return typeof i==`function`?_e(i,{"":o},``,o):o}},ye=class extends ve{constructor(e){super(S),this.source=e,Object.defineProperty(this,"tag",{set(){throw Error(`Alias nodes cannot have tags`)}})}resolve(e,t){if(t?.maxAliasCount===0)throw ReferenceError(`Alias resolution is disabled`);let n;t?.aliasResolveCache?n=t.aliasResolveCache:(n=[],P(e,{Node:(e,t)=>{(E(t)||ae(t))&&n.push(t)}}),t&&(t.aliasResolveCache=n));let r;for(let e of n){if(e===this)break;e.anchor===this.source&&(r=e)}if(r&&t){let{anchors:e,doc:n,maxAliasCount:i}=t,a=e.get(r);if(a||=(R(r,null,t),e.get(r)),a?.res===void 0)throw ReferenceError(`This should not happen: Alias anchor was not resolved?`);if(i>=0&&(a.count+=1,a.aliasCount===0&&(a.aliasCount=be(n,r,e)),a.count*a.aliasCount>i))throw ReferenceError(`Excessive alias count indicates a resource exhaustion attack`)}return r}toJSON(e,t){if(!t)return{source:this.source};let n=this.resolve(t.doc,t);if(!n){let e=`Unresolved alias (the anchor must be set before the alias): ${this.source}`;throw ReferenceError(e)}return t.anchors.get(n).res}toString(e,t,n){let r=`*${this.source}`;if(e){if(pe(this.source),e.options.verifyAliasOrder&&!e.anchors.has(this.source)){let e=`Unresolved alias (the anchor must be set before the alias): ${this.source}`;throw Error(e)}if(e.implicitKey)return`${r} `}return r}};function be(e,t,n){if(E(t)){let r=t.resolve(e),i=n&&r&&n.get(r);return i?i.count*i.aliasCount:0}if(A(t)){let r=0;for(let i of t.items){let t=be(e,i,n);t>r&&(r=t)}return r}if(O(t)){let r=be(e,t.key,n),i=be(e,t.value,n);return Math.max(r,i)}return 1}const xe=e=>!e||typeof e!=`function`&&typeof e!=`object`;var z=class extends ve{constructor(e){super(w),this.value=e}toJSON(e,t){return t?.keep?this.value:R(this.value,e,t)}toString(){return String(this.value)}};z.BLOCK_FOLDED=`BLOCK_FOLDED`,z.BLOCK_LITERAL=`BLOCK_LITERAL`,z.PLAIN=`PLAIN`,z.QUOTE_DOUBLE=`QUOTE_DOUBLE`,z.QUOTE_SINGLE=`QUOTE_SINGLE`;function Se(e,t,n){if(t){let e=n.filter(e=>e.tag===t),r=e.find(e=>!e.format)??e[0];if(!r)throw Error(`Tag ${t} not found`);return r}return n.find(t=>t.identify?.(e)&&!t.format)}function Ce(e,t,n){if(D(e)&&(e=e.contents),j(e))return e;if(O(e)){let t=n.schema[C].createNode?.(n.schema,null,n);return t.items.push(e),t}(e instanceof String||e instanceof Number||e instanceof Boolean||typeof BigInt<`u`&&e instanceof BigInt)&&(e=e.valueOf());let{aliasDuplicateObjects:r,onAnchor:i,onTagObj:a,schema:o,sourceObjects:s}=n,c;if(r&&e&&typeof e==`object`){if(c=s.get(e),c)return c.anchor??(c.anchor=i(e)),new ye(c.anchor);c={anchor:null,node:null},s.set(e,c)}t?.startsWith(`!!`)&&(t=`tag:yaml.org,2002:`+t.slice(2));let l=Se(e,t,o.tags);if(!l){if(e&&typeof e.toJSON==`function`&&(e=e.toJSON()),!e||typeof e!=`object`){let t=new z(e);return c&&(c.node=t),t}l=e instanceof Map?o[C]:Symbol.iterator in Object(e)?o[ne]:o[C]}a&&(a(l),delete n.onTagObj);let u=l?.createNode?l.createNode(n.schema,e,n):typeof l?.nodeClass?.from==`function`?l.nodeClass.from(n.schema,e,n):new z(e);return t?u.tag=t:l.default||(u.tag=l.tag),c&&(c.node=u),u}function we(e,t,n){let r=n;for(let e=t.length-1;e>=0;--e){let n=t[e];if(typeof n==`number`&&Number.isInteger(n)&&n>=0){let e=[];e[n]=r,r=e}else r=new Map([[n,r]])}return Ce(r,void 0,{aliasDuplicateObjects:!1,keepUndefined:!1,onAnchor:()=>{throw Error(`This should not happen, please report a bug.`)},schema:e,sourceObjects:new Map})}const Te=e=>e==null||typeof e==`object`&&!!e[Symbol.iterator]().next().done;var Ee=class extends ve{constructor(e,t){super(e),Object.defineProperty(this,"schema",{value:t,configurable:!0,enumerable:!1,writable:!0})}clone(e){let t=Object.create(Object.getPrototypeOf(this),Object.getOwnPropertyDescriptors(this));return e&&(t.schema=e),t.items=t.items.map(t=>j(t)||O(t)?t.clone(e):t),this.range&&(t.range=this.range.slice()),t}addIn(e,t){if(Te(e))this.add(t);else{let[n,...r]=e,i=this.get(n,!0);if(A(i))i.addIn(r,t);else if(i===void 0&&this.schema)this.set(n,we(this.schema,r,t));else throw Error(`Expected YAML collection at ${n}. Remaining path: ${r}`)}}deleteIn(e){let[t,...n]=e;if(n.length===0)return this.delete(t);let r=this.get(t,!0);if(A(r))return r.deleteIn(n);throw Error(`Expected YAML collection at ${t}. Remaining path: ${n}`)}getIn(e,t){let[n,...r]=e,i=this.get(n,!0);return r.length===0?!t&&k(i)?i.value:i:A(i)?i.getIn(r,t):void 0}hasAllNullValues(e){return this.items.every(t=>{if(!O(t))return!1;let n=t.value;return n==null||e&&k(n)&&n.value==null&&!n.commentBefore&&!n.comment&&!n.tag})}hasIn(e){let[t,...n]=e;if(n.length===0)return this.has(t);let r=this.get(t,!0);return A(r)?r.hasIn(n):!1}setIn(e,t){let[n,...r]=e;if(r.length===0)this.set(n,t);else{let e=this.get(n,!0);if(A(e))e.setIn(r,t);else if(e===void 0&&this.schema)this.set(n,we(this.schema,r,t));else throw Error(`Expected YAML collection at ${n}. Remaining path: ${r}`)}}};const De=e=>e.replace(/^(?!$)(?: $)?/gm,`#`);function B(e,t){return/^\n+$/.test(e)?e.substring(1):t?e.replace(/^(?! *$)/gm,t):e}const V=(e,t,n)=>e.endsWith(`
3
- `)?B(n,t):n.includes(`
4
- `)?`
5
- `+B(n,t):(e.endsWith(` `)?``:` `)+n,Oe=`flow`;function ke(e,t,n=`flow`,{indentAtStart:r,lineWidth:i=80,minContentWidth:a=20,onFold:o,onOverflow:s}={}){if(!i||i<0)return e;i<a&&(a=0);let c=Math.max(1+a,1+i-t.length);if(e.length<=c)return e;let l=[],u={},d=i-t.length;typeof r==`number`&&(r>i-Math.max(2,a)?l.push(0):d=i-r);let f,p,m=!1,h=-1,g=-1,_=-1;n===`block`&&(h=Ae(e,h,t.length),h!==-1&&(d=h+c));for(let r;r=e[h+=1];){if(n===`quoted`&&r===`\\`){switch(g=h,e[h+1]){case`x`:h+=3;break;case`u`:h+=5;break;case`U`:h+=9;break;default:h+=1}_=h}if(r===`
6
- `)n===`block`&&(h=Ae(e,h,t.length)),d=h+t.length+c,f=void 0;else{if(r===` `&&p&&p!==` `&&p!==`
7
- `&&p!==` `){let t=e[h+1];t&&t!==` `&&t!==`
8
- `&&t!==` `&&(f=h)}if(h>=d){if(f)l.push(f),d=f+c,f=void 0;else if(n===`quoted`){for(;p===` `||p===` `;)p=r,r=e[h+=1],m=!0;let t=h>_+1?h-2:g-1;if(u[t])return e;l.push(t),u[t]=!0,d=t+c,f=void 0}else m=!0}}p=r}if(m&&s&&s(),l.length===0)return e;o&&o();let v=e.slice(0,l[0]);for(let r=0;r<l.length;++r){let i=l[r],a=l[r+1]||e.length;i===0?v=`\n${t}${e.slice(0,a)}`:(n===`quoted`&&u[i]&&(v+=`${e[i]}\\`),v+=`\n${t}${e.slice(i+1,a)}`)}return v}function Ae(e,t,n){let r=t,i=t+1,a=e[i];for(;a===` `||a===` `;)if(t<i+n)a=e[++t];else{do a=e[++t];while(a&&a!==`
9
- `);r=t,i=t+1,a=e[i]}return r}const je=(e,t)=>({indentAtStart:t?e.indent.length:e.indentAtStart,lineWidth:e.options.lineWidth,minContentWidth:e.options.minContentWidth}),Me=e=>/^(%|---|\.\.\.)/m.test(e);function Ne(e,t,n){if(!t||t<0)return!1;let r=t-n,i=e.length;if(i<=r)return!1;for(let t=0,n=0;t<i;++t)if(e[t]===`
10
- `){if(t-n>r)return!0;if(n=t+1,i-n<=r)return!1}return!0}function Pe(e,t){let n=JSON.stringify(e);if(t.options.doubleQuotedAsJSON)return n;let{implicitKey:r}=t,i=t.options.doubleQuotedMinMultiLineLength,a=t.indent||(Me(e)?` `:``),o=``,s=0;for(let e=0,t=n[e];t;t=n[++e])if(t===` `&&n[e+1]===`\\`&&n[e+2]===`n`&&(o+=n.slice(s,e)+`\\ `,e+=1,s=e,t=`\\`),t===`\\`)switch(n[e+1]){case`u`:{o+=n.slice(s,e);let t=n.substr(e+2,4);switch(t){case`0000`:o+=`\\0`;break;case`0007`:o+=`\\a`;break;case`000b`:o+=`\\v`;break;case`001b`:o+=`\\e`;break;case`0085`:o+=`\\N`;break;case`00a0`:o+=`\\_`;break;case`2028`:o+=`\\L`;break;case`2029`:o+=`\\P`;break;default:t.substr(0,2)===`00`?o+=`\\x`+t.substr(2):o+=n.substr(e,6)}e+=5,s=e+1}break;case`n`:if(r||n[e+2]===`"`||n.length<i)e+=1;else{for(o+=n.slice(s,e)+`
11
-
12
- `;n[e+2]===`\\`&&n[e+3]===`n`&&n[e+4]!==`"`;)o+=`
13
- `,e+=2;o+=a,n[e+2]===` `&&(o+=`\\`),e+=1,s=e+1}break;default:e+=1}return o=s?o+n.slice(s):n,r?o:ke(o,a,`quoted`,je(t,!1))}function Fe(e,t){if(t.options.singleQuote===!1||t.implicitKey&&e.includes(`
14
- `)||/[ \t]\n|\n[ \t]/.test(e))return Pe(e,t);let n=t.indent||(Me(e)?` `:``),r=`'`+e.replace(/'/g,`''`).replace(/\n+/g,`$&\n${n}`)+`'`;return t.implicitKey?r:ke(r,n,Oe,je(t,!1))}function Ie(e,t){let{singleQuote:n}=t.options,r;if(n===!1)r=Pe;else{let t=e.includes(`"`),i=e.includes(`'`);r=t&&!i?Fe:i&&!t?Pe:n?Fe:Pe}return r(e,t)}let Le;try{Le=RegExp(`(^|(?<!
15
- ))
16
- +(?!
17
- |$)`,`g`)}catch{Le=/\n+(?!\n|$)/g}function Re({comment:e,type:t,value:n},r,i,a){let{blockQuote:o,commentString:s,lineWidth:c}=r.options;if(!o||/\n[\t ]+$/.test(n))return Ie(n,r);let l=r.indent||(r.forceBlockIndent||Me(n)?` `:``),u=o===`literal`?!0:o===`folded`||t===z.BLOCK_FOLDED?!1:t===z.BLOCK_LITERAL||!Ne(n,c,l.length);if(!n)return u?`|
18
- `:`>
19
- `;let d,f;for(f=n.length;f>0;--f){let e=n[f-1];if(e!==`
20
- `&&e!==` `&&e!==` `)break}let p=n.substring(f),m=p.indexOf(`
21
- `);m===-1?d=`-`:n===p||m!==p.length-1?(d=`+`,a&&a()):d=``,p&&=(n=n.slice(0,-p.length),p[p.length-1]===`
22
- `&&(p=p.slice(0,-1)),p.replace(Le,`$&${l}`));let h=!1,g,_=-1;for(g=0;g<n.length;++g){let e=n[g];if(e===` `)h=!0;else if(e===`
23
- `)_=g;else break}let v=n.substring(0,_<g?_+1:g);v&&=(n=n.substring(v.length),v.replace(/\n+/g,`$&${l}`));let y=(h?l?`2`:`1`:``)+d;if(e&&(y+=` `+s(e.replace(/ ?[\r\n]+/g,` `)),i&&i()),!u){let e=n.replace(/\n+/g,`
24
- $&`).replace(/(?:^|\n)([\t ].*)(?:([\n\t ]*)\n(?![\n\t ]))?/g,`$1$2`).replace(/\n+/g,`$&${l}`),i=!1,a=je(r,!0);o!==`folded`&&t!==z.BLOCK_FOLDED&&(a.onOverflow=()=>{i=!0});let s=ke(`${v}${e}${p}`,l,`block`,a);if(!i)return`>${y}\n${l}${s}`}return n=n.replace(/\n+/g,`$&${l}`),`|${y}\n${l}${v}${n}${p}`}function ze(e,t,n,r){let{type:i,value:a}=e,{actualString:o,implicitKey:s,indent:c,indentStep:l,inFlow:u}=t;if(s&&a.includes(`
25
- `)||u&&/[[\]{},]/.test(a))return Ie(a,t);if(/^[\n\t ,[\]{}#&*!|>'"%@`]|^[?-]$|^[?-][ \t]|[\n:][ \t]|[ \t]\n|[\n\t ]#|[\n\t :]$/.test(a))return s||u||!a.includes(`
26
- `)?Ie(a,t):Re(e,t,n,r);if(!s&&!u&&i!==z.PLAIN&&a.includes(`
27
- `))return Re(e,t,n,r);if(Me(a)){if(c===``)return t.forceBlockIndent=!0,Re(e,t,n,r);if(s&&c===l)return Ie(a,t)}let d=a.replace(/\n+/g,`$&\n${c}`);if(o){let e=e=>e.default&&e.tag!==`tag:yaml.org,2002:str`&&e.test?.test(d),{compat:n,tags:r}=t.doc.schema;if(r.some(e)||n?.some(e))return Ie(a,t)}return s?d:ke(d,c,Oe,je(t,!1))}function Be(e,t,n,r){let{implicitKey:i,inFlow:a}=t,o=typeof e.value==`string`?e:Object.assign({},e,{value:String(e.value)}),{type:s}=e;s!==z.QUOTE_DOUBLE&&/[\x00-\x08\x0b-\x1f\x7f-\x9f\u{D800}-\u{DFFF}]/u.test(o.value)&&(s=z.QUOTE_DOUBLE);let c=e=>{switch(e){case z.BLOCK_FOLDED:case z.BLOCK_LITERAL:return i||a?Ie(o.value,t):Re(o,t,n,r);case z.QUOTE_DOUBLE:return Pe(o.value,t);case z.QUOTE_SINGLE:return Fe(o.value,t);case z.PLAIN:return ze(o,t,n,r);default:return null}},l=c(s);if(l===null){let{defaultKeyType:e,defaultStringType:n}=t.options,r=i&&e||n;if(l=c(r),l===null)throw Error(`Unsupported default string type ${r}`)}return l}function Ve(e,t){let n=Object.assign({blockQuote:!0,commentString:De,defaultKeyType:null,defaultStringType:`PLAIN`,directives:null,doubleQuotedAsJSON:!1,doubleQuotedMinMultiLineLength:40,falseStr:`false`,flowCollectionPadding:!0,indentSeq:!0,lineWidth:80,minContentWidth:20,nullStr:`null`,simpleKeys:!1,singleQuote:null,trailingComma:!1,trueStr:`true`,verifyAliasOrder:!0},e.schema.toStringOptions,t),r;switch(n.collectionStyle){case`block`:r=!1;break;case`flow`:r=!0;break;default:r=null}return{anchors:new Set,doc:e,flowCollectionPadding:n.flowCollectionPadding?` `:``,indent:``,indentStep:typeof n.indent==`number`?` `.repeat(n.indent):` `,inFlow:r,options:n}}function He(e,t){if(t.tag){let n=e.filter(e=>e.tag===t.tag);if(n.length>0)return n.find(e=>e.format===t.format)??n[0]}let n,r;if(k(t)){r=t.value;let i=e.filter(e=>e.identify?.(r));if(i.length>1){let e=i.filter(e=>e.test);e.length>0&&(i=e)}n=i.find(e=>e.format===t.format)??i.find(e=>!e.format)}else r=t,n=e.find(e=>e.nodeClass&&r instanceof e.nodeClass);if(!n){let e=r?.constructor?.name??(r===null?`null`:typeof r);throw Error(`Tag not resolved for ${e} value`)}return n}function Ue(e,t,{anchors:n,doc:r}){if(!r.directives)return``;let i=[],a=(k(e)||A(e))&&e.anchor;a&&pe(a)&&(n.add(a),i.push(`&${a}`));let o=e.tag??(t.default?null:t.tag);return o&&i.push(r.directives.tagString(o)),i.join(` `)}function H(e,t,n,r){if(O(e))return e.toString(t,n,r);if(E(e)){if(t.doc.directives)return e.toString(t);if(t.resolvedAliases?.has(e))throw TypeError(`Cannot stringify circular structure without alias nodes`);t.resolvedAliases?t.resolvedAliases.add(e):t.resolvedAliases=new Set([e]),e=e.resolve(t.doc)}let i,a=j(e)?e:t.doc.createNode(e,{onTagObj:e=>i=e});i??=He(t.doc.schema.tags,a);let o=Ue(a,i,t);o.length>0&&(t.indentAtStart=(t.indentAtStart??0)+o.length+1);let s=typeof i.stringify==`function`?i.stringify(a,t,n,r):k(a)?Be(a,t,n,r):a.toString(t,n,r);return o?k(a)||s[0]===`{`||s[0]===`[`?`${o} ${s}`:`${o}\n${t.indent}${s}`:s}function We({key:e,value:t},n,r,i){let{allNullValues:a,doc:o,indent:s,indentStep:c,options:{commentString:l,indentSeq:u,simpleKeys:d}}=n,f=j(e)&&e.comment||null;if(d){if(f)throw Error(`With simple keys, key nodes cannot have comments`);if(A(e)||!j(e)&&typeof e==`object`)throw Error(`With simple keys, collection cannot be used as a key value`)}let p=!d&&(!e||f&&t==null&&!n.inFlow||A(e)||(k(e)?e.type===z.BLOCK_FOLDED||e.type===z.BLOCK_LITERAL:typeof e==`object`));n=Object.assign({},n,{allNullValues:!1,implicitKey:!p&&(d||!a),indent:s+c});let m=!1,h=!1,g=H(e,n,()=>m=!0,()=>h=!0);if(!p&&!n.inFlow&&g.length>1024){if(d)throw Error(`With simple keys, single line scalar must not span more than 1024 characters`);p=!0}if(n.inFlow){if(a||t==null)return m&&r&&r(),g===``?`?`:p?`? ${g}`:g}else if(a&&!d||t==null&&p)return g=`? ${g}`,f&&!m?g+=V(g,n.indent,l(f)):h&&i&&i(),g;m&&(f=null),p?(f&&(g+=V(g,n.indent,l(f))),g=`? ${g}\n${s}:`):(g=`${g}:`,f&&(g+=V(g,n.indent,l(f))));let _,v,y;j(t)?(_=!!t.spaceBefore,v=t.commentBefore,y=t.comment):(_=!1,v=null,y=null,t&&typeof t==`object`&&(t=o.createNode(t))),n.implicitKey=!1,!p&&!f&&k(t)&&(n.indentAtStart=g.length+1),h=!1,!u&&c.length>=2&&!n.inFlow&&!p&&ie(t)&&!t.flow&&!t.tag&&!t.anchor&&(n.indent=n.indent.substring(2));let b=!1,x=H(t,n,()=>b=!0,()=>h=!0),S=` `;if(f||_||v){if(S=_?`
28
- `:``,v){let e=l(v);S+=`\n${B(e,n.indent)}`}x===``&&!n.inFlow?S===`
29
- `&&y&&(S=`
30
-
31
- `):S+=`\n${n.indent}`}else if(!p&&A(t)){let e=x[0],r=x.indexOf(`
32
- `),i=r!==-1,a=n.inFlow??t.flow??t.items.length===0;if(i||!a){let t=!1;if(i&&(e===`&`||e===`!`)){let n=x.indexOf(` `);e===`&`&&n!==-1&&n<r&&x[n+1]===`!`&&(n=x.indexOf(` `,n+1)),(n===-1||r<n)&&(t=!0)}t||(S=`\n${n.indent}`)}}else(x===``||x[0]===`
33
- `)&&(S=``);return g+=S+x,n.inFlow?b&&r&&r():y&&!b?g+=V(g,n.indent,l(y)):h&&i&&i(),g}function Ge(e,t){(e===`debug`||e===`warn`)&&console.warn(t)}const U={identify:e=>e===`<<`||typeof e==`symbol`&&e.description===`<<`,default:`key`,tag:`tag:yaml.org,2002:merge`,test:/^<<$/,resolve:()=>Object.assign(new z(Symbol(`<<`)),{addToJSMap:qe}),stringify:()=>`<<`},Ke=(e,t)=>(U.identify(t)||k(t)&&(!t.type||t.type===z.PLAIN)&&U.identify(t.value))&&e?.doc.schema.tags.some(e=>e.tag===U.tag&&e.default);function qe(e,t,n){let r=Ye(e,n);if(ie(r))for(let n of r.items)Je(e,t,n);else if(Array.isArray(r))for(let n of r)Je(e,t,n);else Je(e,t,r)}function Je(e,t,n){let r=Ye(e,n);if(!re(r))throw Error(`Merge sources must be maps or map aliases`);let i=r.toJSON(null,e,Map);for(let[e,n]of i)t instanceof Map?t.has(e)||t.set(e,n):t instanceof Set?t.add(e):Object.prototype.hasOwnProperty.call(t,e)||Object.defineProperty(t,e,{value:n,writable:!0,enumerable:!0,configurable:!0});return t}function Ye(e,t){return e&&E(t)?t.resolve(e.doc,e):t}function Xe(e,t,{key:n,value:r}){if(j(n)&&n.addToJSMap)n.addToJSMap(e,t,r);else if(Ke(e,n))qe(e,t,r);else{let i=R(n,``,e);if(t instanceof Map)t.set(i,R(r,i,e));else if(t instanceof Set)t.add(i);else{let a=Ze(n,i,e),o=R(r,a,e);a in t?Object.defineProperty(t,a,{value:o,writable:!0,enumerable:!0,configurable:!0}):t[a]=o}}return t}function Ze(e,t,n){if(t===null)return``;if(typeof t!=`object`)return String(t);if(j(e)&&n?.doc){let t=Ve(n.doc,{});t.anchors=new Set;for(let e of n.anchors.keys())t.anchors.add(e.anchor);t.inFlow=!0,t.inStringifyKey=!0;let r=e.toString(t);if(!n.mapKeyWarned){let e=JSON.stringify(r);e.length>40&&(e=e.substring(0,36)+`..."`),Ge(n.doc.options.logLevel,`Keys with collection values will be stringified due to JS Object restrictions: ${e}. Set mapAsMap: true to use object keys.`),n.mapKeyWarned=!0}return r}return JSON.stringify(t)}function Qe(e,t,n){return new W(Ce(e,void 0,n),Ce(t,void 0,n))}var W=class e{constructor(e,t=null){Object.defineProperty(this,T,{value:te}),this.key=e,this.value=t}clone(t){let{key:n,value:r}=this;return j(n)&&(n=n.clone(t)),j(r)&&(r=r.clone(t)),new e(n,r)}toJSON(e,t){return Xe(t,t?.mapAsMap?new Map:{},this)}toString(e,t,n){return e?.doc?We(this,e,t,n):JSON.stringify(this)}};function $e(e,t,n){return(t.inFlow??e.flow?tt:et)(e,t,n)}function et({comment:e,items:t},n,{blockItemPrefix:r,flowChars:i,itemIndent:a,onChompKeep:o,onComment:s}){let{indent:c,options:{commentString:l}}=n,u=Object.assign({},n,{indent:a,type:null}),d=!1,f=[];for(let e=0;e<t.length;++e){let i=t[e],o=null;if(j(i))!d&&i.spaceBefore&&f.push(``),nt(n,f,i.commentBefore,d),i.comment&&(o=i.comment);else if(O(i)){let e=j(i.key)?i.key:null;e&&(!d&&e.spaceBefore&&f.push(``),nt(n,f,e.commentBefore,d))}d=!1;let s=H(i,u,()=>o=null,()=>d=!0);o&&(s+=V(s,a,l(o))),d&&o&&(d=!1),f.push(r+s)}let p;if(f.length===0)p=i.start+i.end;else{p=f[0];for(let e=1;e<f.length;++e){let t=f[e];p+=t?`\n${c}${t}`:`
34
- `}}return e?(p+=`
35
- `+B(l(e),c),s&&s()):d&&o&&o(),p}function tt({items:e},t,{flowChars:n,itemIndent:r}){let{indent:i,indentStep:a,flowCollectionPadding:o,options:{commentString:s}}=t;r+=a;let c=Object.assign({},t,{indent:r,inFlow:!0,type:null}),l=!1,u=0,d=[];for(let n=0;n<e.length;++n){let i=e[n],a=null;if(j(i))i.spaceBefore&&d.push(``),nt(t,d,i.commentBefore,!1),i.comment&&(a=i.comment);else if(O(i)){let e=j(i.key)?i.key:null;e&&(e.spaceBefore&&d.push(``),nt(t,d,e.commentBefore,!1),e.comment&&(l=!0));let n=j(i.value)?i.value:null;n?(n.comment&&(a=n.comment),n.commentBefore&&(l=!0)):i.value==null&&e?.comment&&(a=e.comment)}a&&(l=!0);let o=H(i,c,()=>a=null);l||=d.length>u||o.includes(`
36
- `),n<e.length-1?o+=`,`:t.options.trailingComma&&(t.options.lineWidth>0&&(l||=d.reduce((e,t)=>e+t.length+2,2)+(o.length+2)>t.options.lineWidth),l&&(o+=`,`)),a&&(o+=V(o,r,s(a))),d.push(o),u=d.length}let{start:f,end:p}=n;if(d.length===0)return f+p;if(!l){let e=d.reduce((e,t)=>e+t.length+2,2);l=t.options.lineWidth>0&&e>t.options.lineWidth}if(l){let e=f;for(let t of d)e+=t?`\n${a}${i}${t}`:`
37
- `;return`${e}\n${i}${p}`}return`${f}${o}${d.join(` `)}${o}${p}`}function nt({indent:e,options:{commentString:t}},n,r,i){if(r&&i&&(r=r.replace(/^\n+/,``)),r){let i=B(t(r),e);n.push(i.trimStart())}}function G(e,t){let n=k(t)?t.value:t;for(let r of e)if(O(r)&&(r.key===t||r.key===n||k(r.key)&&r.key.value===n))return r}var K=class extends Ee{static get tagName(){return`tag:yaml.org,2002:map`}constructor(e){super(C,e),this.items=[]}static from(e,t,n){let{keepUndefined:r,replacer:i}=n,a=new this(e),o=(e,o)=>{if(typeof i==`function`)o=i.call(t,e,o);else if(Array.isArray(i)&&!i.includes(e))return;(o!==void 0||r)&&a.items.push(Qe(e,o,n))};if(t instanceof Map)for(let[e,n]of t)o(e,n);else if(t&&typeof t==`object`)for(let e of Object.keys(t))o(e,t[e]);return typeof e.sortMapEntries==`function`&&a.items.sort(e.sortMapEntries),a}add(e,t){let n;n=O(e)?e:!e||typeof e!=`object`||!(`key`in e)?new W(e,e?.value):new W(e.key,e.value);let r=G(this.items,n.key),i=this.schema?.sortMapEntries;if(r){if(!t)throw Error(`Key ${n.key} already set`);k(r.value)&&xe(n.value)?r.value.value=n.value:r.value=n.value}else if(i){let e=this.items.findIndex(e=>i(n,e)<0);e===-1?this.items.push(n):this.items.splice(e,0,n)}else this.items.push(n)}delete(e){let t=G(this.items,e);return t?this.items.splice(this.items.indexOf(t),1).length>0:!1}get(e,t){let n=G(this.items,e)?.value;return(!t&&k(n)?n.value:n)??void 0}has(e){return!!G(this.items,e)}set(e,t){this.add(new W(e,t),!0)}toJSON(e,t,n){let r=n?new n:t?.mapAsMap?new Map:{};t?.onCreate&&t.onCreate(r);for(let e of this.items)Xe(t,r,e);return r}toString(e,t,n){if(!e)return JSON.stringify(this);for(let e of this.items)if(!O(e))throw Error(`Map items must all be pairs; found ${JSON.stringify(e)} instead`);return!e.allNullValues&&this.hasAllNullValues(!1)&&(e=Object.assign({},e,{allNullValues:!0})),$e(this,e,{blockItemPrefix:``,flowChars:{start:`{`,end:`}`},itemIndent:e.indent||``,onChompKeep:n,onComment:t})}};const rt={collection:`map`,default:!0,nodeClass:K,tag:`tag:yaml.org,2002:map`,resolve(e,t){return re(e)||t(`Expected a mapping for this tag`),e},createNode:(e,t,n)=>K.from(e,t,n)};var q=class extends Ee{static get tagName(){return`tag:yaml.org,2002:seq`}constructor(e){super(ne,e),this.items=[]}add(e){this.items.push(e)}delete(e){let t=it(e);return typeof t==`number`&&this.items.splice(t,1).length>0}get(e,t){let n=it(e);if(typeof n!=`number`)return;let r=this.items[n];return!t&&k(r)?r.value:r}has(e){let t=it(e);return typeof t==`number`&&t<this.items.length}set(e,t){let n=it(e);if(typeof n!=`number`)throw Error(`Expected a valid index, not ${e}.`);let r=this.items[n];k(r)&&xe(t)?r.value=t:this.items[n]=t}toJSON(e,t){let n=[];t?.onCreate&&t.onCreate(n);let r=0;for(let e of this.items)n.push(R(e,String(r++),t));return n}toString(e,t,n){return e?$e(this,e,{blockItemPrefix:`- `,flowChars:{start:`[`,end:`]`},itemIndent:(e.indent||``)+` `,onChompKeep:n,onComment:t}):JSON.stringify(this)}static from(e,t,n){let{replacer:r}=n,i=new this(e);if(t&&Symbol.iterator in Object(t)){let e=0;for(let a of t){if(typeof r==`function`){let n=t instanceof Set?a:String(e++);a=r.call(t,n,a)}i.items.push(Ce(a,void 0,n))}}return i}};function it(e){let t=k(e)?e.value:e;return t&&typeof t==`string`&&(t=Number(t)),typeof t==`number`&&Number.isInteger(t)&&t>=0?t:null}const at={collection:`seq`,default:!0,nodeClass:q,tag:`tag:yaml.org,2002:seq`,resolve(e,t){return ie(e)||t(`Expected a sequence for this tag`),e},createNode:(e,t,n)=>q.from(e,t,n)},ot={identify:e=>typeof e==`string`,default:!0,tag:`tag:yaml.org,2002:str`,resolve:e=>e,stringify(e,t,n,r){return t=Object.assign({actualString:!0},t),Be(e,t,n,r)}},st={identify:e=>e==null,createNode:()=>new z(null),default:!0,tag:`tag:yaml.org,2002:null`,test:/^(?:~|[Nn]ull|NULL)?$/,resolve:()=>new z(null),stringify:({source:e},t)=>typeof e==`string`&&st.test.test(e)?e:t.options.nullStr},ct={identify:e=>typeof e==`boolean`,default:!0,tag:`tag:yaml.org,2002:bool`,test:/^(?:[Tt]rue|TRUE|[Ff]alse|FALSE)$/,resolve:e=>new z(e[0]===`t`||e[0]===`T`),stringify({source:e,value:t},n){return e&&ct.test.test(e)&&t===(e[0]===`t`||e[0]===`T`)?e:t?n.options.trueStr:n.options.falseStr}};function J({format:e,minFractionDigits:t,tag:n,value:r}){if(typeof r==`bigint`)return String(r);let i=typeof r==`number`?r:Number(r);if(!isFinite(i))return isNaN(i)?`.nan`:i<0?`-.inf`:`.inf`;let a=Object.is(r,-0)?`-0`:JSON.stringify(r);if(!e&&t&&(!n||n===`tag:yaml.org,2002:float`)&&/^-?\d/.test(a)&&!a.includes(`e`)){let e=a.indexOf(`.`);e<0&&(e=a.length,a+=`.`);let n=t-(a.length-e-1);for(;n-->0;)a+=`0`}return a}const lt={identify:e=>typeof e==`number`,default:!0,tag:`tag:yaml.org,2002:float`,test:/^(?:[-+]?\.(?:inf|Inf|INF)|\.nan|\.NaN|\.NAN)$/,resolve:e=>e.slice(-3).toLowerCase()===`nan`?NaN:e[0]===`-`?-1/0:1/0,stringify:J},ut={identify:e=>typeof e==`number`,default:!0,tag:`tag:yaml.org,2002:float`,format:`EXP`,test:/^[-+]?(?:\.[0-9]+|[0-9]+(?:\.[0-9]*)?)[eE][-+]?[0-9]+$/,resolve:e=>parseFloat(e),stringify(e){let t=Number(e.value);return isFinite(t)?t.toExponential():J(e)}},dt={identify:e=>typeof e==`number`,default:!0,tag:`tag:yaml.org,2002:float`,test:/^[-+]?(?:\.[0-9]+|[0-9]+\.[0-9]*)$/,resolve(e){let t=new z(parseFloat(e)),n=e.indexOf(`.`);return n!==-1&&e[e.length-1]===`0`&&(t.minFractionDigits=e.length-n-1),t},stringify:J},ft=e=>typeof e==`bigint`||Number.isInteger(e),pt=(e,t,n,{intAsBigInt:r})=>r?BigInt(e):parseInt(e.substring(t),n);function mt(e,t,n){let{value:r}=e;return ft(r)&&r>=0?n+r.toString(t):J(e)}const ht={identify:e=>ft(e)&&e>=0,default:!0,tag:`tag:yaml.org,2002:int`,format:`OCT`,test:/^0o[0-7]+$/,resolve:(e,t,n)=>pt(e,2,8,n),stringify:e=>mt(e,8,`0o`)},gt={identify:ft,default:!0,tag:`tag:yaml.org,2002:int`,test:/^[-+]?[0-9]+$/,resolve:(e,t,n)=>pt(e,0,10,n),stringify:J},_t={identify:e=>ft(e)&&e>=0,default:!0,tag:`tag:yaml.org,2002:int`,format:`HEX`,test:/^0x[0-9a-fA-F]+$/,resolve:(e,t,n)=>pt(e,2,16,n),stringify:e=>mt(e,16,`0x`)},vt=[rt,at,ot,st,ct,ht,gt,_t,lt,ut,dt];function yt(e){return typeof e==`bigint`||Number.isInteger(e)}const bt=({value:e})=>JSON.stringify(e),xt=[{identify:e=>typeof e==`string`,default:!0,tag:`tag:yaml.org,2002:str`,resolve:e=>e,stringify:bt},{identify:e=>e==null,createNode:()=>new z(null),default:!0,tag:`tag:yaml.org,2002:null`,test:/^null$/,resolve:()=>null,stringify:bt},{identify:e=>typeof e==`boolean`,default:!0,tag:`tag:yaml.org,2002:bool`,test:/^true$|^false$/,resolve:e=>e===`true`,stringify:bt},{identify:yt,default:!0,tag:`tag:yaml.org,2002:int`,test:/^-?(?:0|[1-9][0-9]*)$/,resolve:(e,t,{intAsBigInt:n})=>n?BigInt(e):parseInt(e,10),stringify:({value:e})=>yt(e)?e.toString():JSON.stringify(e)},{identify:e=>typeof e==`number`,default:!0,tag:`tag:yaml.org,2002:float`,test:/^-?(?:0|[1-9][0-9]*)(?:\.[0-9]*)?(?:[eE][-+]?[0-9]+)?$/,resolve:e=>parseFloat(e),stringify:bt}],St=[rt,at].concat(xt,{default:!0,tag:``,test:/^/,resolve(e,t){return t(`Unresolved plain scalar ${JSON.stringify(e)}`),e}}),Ct={identify:e=>e instanceof Uint8Array,default:!1,tag:`tag:yaml.org,2002:binary`,resolve(e,t){if(typeof atob==`function`){let t=atob(e.replace(/[\n\r]/g,``)),n=new Uint8Array(t.length);for(let e=0;e<t.length;++e)n[e]=t.charCodeAt(e);return n}return t(`This environment does not support reading binary tags; either Buffer or atob is required`),e},stringify({comment:e,type:t,value:n},r,i,a){if(!n)return``;let o=n,s;if(typeof btoa==`function`){let e=``;for(let t=0;t<o.length;++t)e+=String.fromCharCode(o[t]);s=btoa(e)}else throw Error(`This environment does not support writing binary tags; either Buffer or btoa is required`);if(t??=z.BLOCK_LITERAL,t!==z.QUOTE_DOUBLE){let e=Math.max(r.options.lineWidth-r.indent.length,r.options.minContentWidth),n=Math.ceil(s.length/e),i=Array(n);for(let t=0,r=0;t<n;++t,r+=e)i[t]=s.substr(r,e);s=i.join(t===z.BLOCK_LITERAL?`
38
- `:` `)}return Be({comment:e,type:t,value:s},r,i,a)}};function wt(e,t){if(ie(e))for(let n=0;n<e.items.length;++n){let r=e.items[n];if(!O(r)){if(re(r)){r.items.length>1&&t(`Each pair must have its own sequence indicator`);let e=r.items[0]||new W(new z(null));if(r.commentBefore&&(e.key.commentBefore=e.key.commentBefore?`${r.commentBefore}\n${e.key.commentBefore}`:r.commentBefore),r.comment){let t=e.value??e.key;t.comment=t.comment?`${r.comment}\n${t.comment}`:r.comment}r=e}e.items[n]=O(r)?r:new W(r)}}else t(`Expected a sequence for this tag`);return e}function Tt(e,t,n){let{replacer:r}=n,i=new q(e);i.tag=`tag:yaml.org,2002:pairs`;let a=0;if(t&&Symbol.iterator in Object(t))for(let e of t){typeof r==`function`&&(e=r.call(t,String(a++),e));let o,s;if(Array.isArray(e)){if(e.length===2)o=e[0],s=e[1];else throw TypeError(`Expected [key, value] tuple: ${e}`)}else if(e&&e instanceof Object){let t=Object.keys(e);if(t.length===1)o=t[0],s=e[o];else throw TypeError(`Expected tuple with one key, not ${t.length} keys`)}else o=e;i.items.push(Qe(o,s,n))}return i}const Et={collection:`seq`,default:!1,tag:`tag:yaml.org,2002:pairs`,resolve:wt,createNode:Tt};var Dt=class e extends q{constructor(){super(),this.add=K.prototype.add.bind(this),this.delete=K.prototype.delete.bind(this),this.get=K.prototype.get.bind(this),this.has=K.prototype.has.bind(this),this.set=K.prototype.set.bind(this),this.tag=e.tag}toJSON(e,t){if(!t)return super.toJSON(e);let n=new Map;t?.onCreate&&t.onCreate(n);for(let e of this.items){let r,i;if(O(e)?(r=R(e.key,``,t),i=R(e.value,r,t)):r=R(e,``,t),n.has(r))throw Error(`Ordered maps must not include duplicate keys`);n.set(r,i)}return n}static from(e,t,n){let r=Tt(e,t,n),i=new this;return i.items=r.items,i}};Dt.tag=`tag:yaml.org,2002:omap`;const Ot={collection:`seq`,identify:e=>e instanceof Map,nodeClass:Dt,default:!1,tag:`tag:yaml.org,2002:omap`,resolve(e,t){let n=wt(e,t),r=[];for(let{key:e}of n.items)k(e)&&(r.includes(e.value)?t(`Ordered maps must not include duplicate keys: ${e.value}`):r.push(e.value));return Object.assign(new Dt,n)},createNode:(e,t,n)=>Dt.from(e,t,n)};function kt({value:e,source:t},n){return t&&(e?At:jt).test.test(t)?t:e?n.options.trueStr:n.options.falseStr}const At={identify:e=>e===!0,default:!0,tag:`tag:yaml.org,2002:bool`,test:/^(?:Y|y|[Yy]es|YES|[Tt]rue|TRUE|[Oo]n|ON)$/,resolve:()=>new z(!0),stringify:kt},jt={identify:e=>e===!1,default:!0,tag:`tag:yaml.org,2002:bool`,test:/^(?:N|n|[Nn]o|NO|[Ff]alse|FALSE|[Oo]ff|OFF)$/,resolve:()=>new z(!1),stringify:kt},Mt={identify:e=>typeof e==`number`,default:!0,tag:`tag:yaml.org,2002:float`,test:/^(?:[-+]?\.(?:inf|Inf|INF)|\.nan|\.NaN|\.NAN)$/,resolve:e=>e.slice(-3).toLowerCase()===`nan`?NaN:e[0]===`-`?-1/0:1/0,stringify:J},Nt={identify:e=>typeof e==`number`,default:!0,tag:`tag:yaml.org,2002:float`,format:`EXP`,test:/^[-+]?(?:[0-9][0-9_]*)?(?:\.[0-9_]*)?[eE][-+]?[0-9]+$/,resolve:e=>parseFloat(e.replace(/_/g,``)),stringify(e){let t=Number(e.value);return isFinite(t)?t.toExponential():J(e)}},Pt={identify:e=>typeof e==`number`,default:!0,tag:`tag:yaml.org,2002:float`,test:/^[-+]?(?:[0-9][0-9_]*)?\.[0-9_]*$/,resolve(e){let t=new z(parseFloat(e.replace(/_/g,``))),n=e.indexOf(`.`);if(n!==-1){let r=e.substring(n+1).replace(/_/g,``);r[r.length-1]===`0`&&(t.minFractionDigits=r.length)}return t},stringify:J},Ft=e=>typeof e==`bigint`||Number.isInteger(e);function It(e,t,n,{intAsBigInt:r}){let i=e[0];if((i===`-`||i===`+`)&&(t+=1),e=e.substring(t).replace(/_/g,``),r){switch(n){case 2:e=`0b${e}`;break;case 8:e=`0o${e}`;break;case 16:e=`0x${e}`}let t=BigInt(e);return i===`-`?BigInt(-1)*t:t}let a=parseInt(e,n);return i===`-`?-1*a:a}function Lt(e,t,n){let{value:r}=e;if(Ft(r)){let e=r.toString(t);return r<0?`-`+n+e.substr(1):n+e}return J(e)}const Rt={identify:Ft,default:!0,tag:`tag:yaml.org,2002:int`,format:`BIN`,test:/^[-+]?0b[0-1_]+$/,resolve:(e,t,n)=>It(e,2,2,n),stringify:e=>Lt(e,2,`0b`)},zt={identify:Ft,default:!0,tag:`tag:yaml.org,2002:int`,format:`OCT`,test:/^[-+]?0[0-7_]+$/,resolve:(e,t,n)=>It(e,1,8,n),stringify:e=>Lt(e,8,`0`)},Bt={identify:Ft,default:!0,tag:`tag:yaml.org,2002:int`,test:/^[-+]?[0-9][0-9_]*$/,resolve:(e,t,n)=>It(e,0,10,n),stringify:J},Vt={identify:Ft,default:!0,tag:`tag:yaml.org,2002:int`,format:`HEX`,test:/^[-+]?0x[0-9a-fA-F_]+$/,resolve:(e,t,n)=>It(e,2,16,n),stringify:e=>Lt(e,16,`0x`)};var Ht=class e extends K{constructor(t){super(t),this.tag=e.tag}add(e){let t;t=O(e)?e:e&&typeof e==`object`&&`key`in e&&`value`in e&&e.value===null?new W(e.key,null):new W(e,null),G(this.items,t.key)||this.items.push(t)}get(e,t){let n=G(this.items,e);return!t&&O(n)?k(n.key)?n.key.value:n.key:n}set(e,t){if(typeof t!=`boolean`)throw Error(`Expected boolean value for set(key, value) in a YAML set, not ${typeof t}`);let n=G(this.items,e);n&&!t?this.items.splice(this.items.indexOf(n),1):!n&&t&&this.items.push(new W(e))}toJSON(e,t){return super.toJSON(e,t,Set)}toString(e,t,n){if(!e)return JSON.stringify(this);if(this.hasAllNullValues(!0))return super.toString(Object.assign({},e,{allNullValues:!0}),t,n);throw Error(`Set items must all have null values`)}static from(e,t,n){let{replacer:r}=n,i=new this(e);if(t&&Symbol.iterator in Object(t))for(let e of t)typeof r==`function`&&(e=r.call(t,e,e)),i.items.push(Qe(e,null,n));return i}};Ht.tag=`tag:yaml.org,2002:set`;const Ut={collection:`map`,identify:e=>e instanceof Set,nodeClass:Ht,default:!1,tag:`tag:yaml.org,2002:set`,createNode:(e,t,n)=>Ht.from(e,t,n),resolve(e,t){if(re(e)){if(e.hasAllNullValues(!0))return Object.assign(new Ht,e);t(`Set items must all have null values`)}else t(`Expected a mapping for this tag`);return e}};function Wt(e,t){let n=e[0],r=n===`-`||n===`+`?e.substring(1):e,i=e=>t?BigInt(e):Number(e),a=r.replace(/_/g,``).split(`:`).reduce((e,t)=>e*i(60)+i(t),i(0));return n===`-`?i(-1)*a:a}function Gt(e){let{value:t}=e,n=e=>e;if(typeof t==`bigint`)n=e=>BigInt(e);else if(isNaN(t)||!isFinite(t))return J(e);let r=``;t<0&&(r=`-`,t*=n(-1));let i=n(60),a=[t%i];return t<60?a.unshift(0):(t=(t-a[0])/i,a.unshift(t%i),t>=60&&(t=(t-a[0])/i,a.unshift(t))),r+a.map(e=>String(e).padStart(2,`0`)).join(`:`).replace(/000000\d*$/,``)}const Kt={identify:e=>typeof e==`bigint`||Number.isInteger(e),default:!0,tag:`tag:yaml.org,2002:int`,format:`TIME`,test:/^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+$/,resolve:(e,t,{intAsBigInt:n})=>Wt(e,n),stringify:Gt},qt={identify:e=>typeof e==`number`,default:!0,tag:`tag:yaml.org,2002:float`,format:`TIME`,test:/^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\.[0-9_]*$/,resolve:e=>Wt(e,!1),stringify:Gt},Jt={identify:e=>e instanceof Date,default:!0,tag:`tag:yaml.org,2002:timestamp`,test:RegExp(`^([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})(?:(?:t|T|[ \\t]+)([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2}(\\.[0-9]+)?)(?:[ \\t]*(Z|[-+][012]?[0-9](?::[0-9]{2})?))?)?$`),resolve(e){let t=e.match(Jt.test);if(!t)throw Error(`!!timestamp expects a date, starting with yyyy-mm-dd`);let[,n,r,i,a,o,s]=t.map(Number),c=t[7]?Number((t[7]+`00`).substr(1,3)):0,l=Date.UTC(n,r-1,i,a||0,o||0,s||0,c),u=t[8];if(u&&u!==`Z`){let e=Wt(u,!1);Math.abs(e)<30&&(e*=60),l-=6e4*e}return new Date(l)},stringify:({value:e})=>e?.toISOString().replace(/(T00:00:00)?\.000Z$/,``)??``},Yt=[rt,at,ot,st,At,jt,Rt,zt,Bt,Vt,Mt,Nt,Pt,Ct,U,Ot,Et,Ut,Kt,qt,Jt],Xt=new Map([[`core`,vt],[`failsafe`,[rt,at,ot]],[`json`,St],[`yaml11`,Yt],[`yaml-1.1`,Yt]]),Zt={binary:Ct,bool:ct,float:dt,floatExp:ut,floatNaN:lt,floatTime:qt,int:gt,intHex:_t,intOct:ht,intTime:Kt,map:rt,merge:U,null:st,omap:Ot,pairs:Et,seq:at,set:Ut,timestamp:Jt},Qt={"tag:yaml.org,2002:binary":Ct,"tag:yaml.org,2002:merge":U,"tag:yaml.org,2002:omap":Ot,"tag:yaml.org,2002:pairs":Et,"tag:yaml.org,2002:set":Ut,"tag:yaml.org,2002:timestamp":Jt};function $t(e,t,n){let r=Xt.get(t);if(r&&!e)return n&&!r.includes(U)?r.concat(U):r.slice();let i=r;if(!i){if(Array.isArray(e))i=[];else{let e=Array.from(Xt.keys()).filter(e=>e!==`yaml11`).map(e=>JSON.stringify(e)).join(`, `);throw Error(`Unknown schema "${t}"; use one of ${e} or define customTags array`)}}if(Array.isArray(e))for(let t of e)i=i.concat(t);else typeof e==`function`&&(i=e(i.slice()));return n&&(i=i.concat(U)),i.reduce((e,t)=>{let n=typeof t==`string`?Zt[t]:t;if(!n){let e=JSON.stringify(t),n=Object.keys(Zt).map(e=>JSON.stringify(e)).join(`, `);throw Error(`Unknown custom tag ${e}; use one of ${n}`)}return e.includes(n)||e.push(n),e},[])}const en=(e,t)=>e.key<t.key?-1:+(e.key>t.key);var tn=class e{constructor({compat:e,customTags:t,merge:n,resolveKnownTags:r,schema:i,sortMapEntries:a,toStringDefaults:o}){this.compat=Array.isArray(e)?$t(e,`compat`):e?$t(null,e):null,this.name=typeof i==`string`&&i||`core`,this.knownTags=r?Qt:{},this.tags=$t(t,this.name,n),this.toStringOptions=o??null,Object.defineProperty(this,C,{value:rt}),Object.defineProperty(this,w,{value:ot}),Object.defineProperty(this,ne,{value:at}),this.sortMapEntries=typeof a==`function`?a:a===!0?en:null}clone(){let t=Object.create(e.prototype,Object.getOwnPropertyDescriptors(this));return t.tags=this.tags.slice(),t}};function nn(e,t){let n=[],r=t.directives===!0;if(t.directives!==!1&&e.directives){let t=e.directives.toString(e);t?(n.push(t),r=!0):e.directives.docStart&&(r=!0)}r&&n.push(`---`);let i=Ve(e,t),{commentString:a}=i.options;if(e.commentBefore){n.length!==1&&n.unshift(``);let t=a(e.commentBefore);n.unshift(B(t,``))}let o=!1,s=null;if(e.contents){if(j(e.contents)){if(e.contents.spaceBefore&&r&&n.push(``),e.contents.commentBefore){let t=a(e.contents.commentBefore);n.push(B(t,``))}i.forceBlockIndent=!!e.comment,s=e.contents.comment}let t=s?void 0:()=>o=!0,c=H(e.contents,i,()=>s=null,t);s&&(c+=V(c,``,a(s))),(c[0]===`|`||c[0]===`>`)&&n[n.length-1]===`---`?n[n.length-1]=`--- ${c}`:n.push(c)}else n.push(H(e.contents,i));if(e.directives?.docEnd){if(e.comment){let t=a(e.comment);t.includes(`
39
- `)?(n.push(`...`),n.push(B(t,``))):n.push(`... ${t}`)}else n.push(`...`)}else{let t=e.comment;t&&o&&(t=t.replace(/^\n+/,``)),t&&((!o||s)&&n[n.length-1]!==``&&n.push(``),n.push(B(a(t),``)))}return n.join(`
40
- `)+`
41
- `}var rn=class e{constructor(e,t,n){this.commentBefore=null,this.comment=null,this.errors=[],this.warnings=[],Object.defineProperty(this,T,{value:ee});let r=null;typeof t==`function`||Array.isArray(t)?r=t:n===void 0&&t&&(n=t,t=void 0);let i=Object.assign({intAsBigInt:!1,keepSourceTokens:!1,logLevel:`warn`,prettyErrors:!0,strict:!0,stringKeys:!1,uniqueKeys:!0,version:`1.2`},n);this.options=i;let{version:a}=i;n?._directives?(this.directives=n._directives.atDocument(),this.directives.yaml.explicit&&(a=this.directives.yaml.version)):this.directives=new L({version:a}),this.setSchema(a,n),this.contents=e===void 0?null:this.createNode(e,r,n)}clone(){let t=Object.create(e.prototype,{[T]:{value:ee}});return t.commentBefore=this.commentBefore,t.comment=this.comment,t.errors=this.errors.slice(),t.warnings=this.warnings.slice(),t.options=Object.assign({},this.options),this.directives&&(t.directives=this.directives.clone()),t.schema=this.schema.clone(),t.contents=j(this.contents)?this.contents.clone(t.schema):this.contents,this.range&&(t.range=this.range.slice()),t}add(e){an(this.contents)&&this.contents.add(e)}addIn(e,t){an(this.contents)&&this.contents.addIn(e,t)}createAlias(e,t){if(!e.anchor){let n=me(this);e.anchor=!t||n.has(t)?he(t||`a`,n):t}return new ye(e.anchor)}createNode(e,t,n){let r;if(typeof t==`function`)e=t.call({"":e},``,e),r=t;else if(Array.isArray(t)){let e=t.filter(e=>typeof e==`number`||e instanceof String||e instanceof Number).map(String);e.length>0&&(t=t.concat(e)),r=t}else n===void 0&&t&&(n=t,t=void 0);let{aliasDuplicateObjects:i,anchorPrefix:a,flow:o,keepUndefined:s,onTagObj:c,tag:l}=n??{},{onAnchor:u,setAnchors:d,sourceObjects:f}=ge(this,a||`a`),p={aliasDuplicateObjects:i??!0,keepUndefined:s??!1,onAnchor:u,onTagObj:c,replacer:r,schema:this.schema,sourceObjects:f},m=Ce(e,l,p);return o&&A(m)&&(m.flow=!0),d(),m}createPair(e,t,n={}){return new W(this.createNode(e,null,n),this.createNode(t,null,n))}delete(e){return an(this.contents)?this.contents.delete(e):!1}deleteIn(e){return Te(e)?this.contents!=null&&(this.contents=null,!0):an(this.contents)?this.contents.deleteIn(e):!1}get(e,t){return A(this.contents)?this.contents.get(e,t):void 0}getIn(e,t){return Te(e)?!t&&k(this.contents)?this.contents.value:this.contents:A(this.contents)?this.contents.getIn(e,t):void 0}has(e){return A(this.contents)?this.contents.has(e):!1}hasIn(e){return Te(e)?this.contents!==void 0:A(this.contents)?this.contents.hasIn(e):!1}set(e,t){this.contents==null?this.contents=we(this.schema,[e],t):an(this.contents)&&this.contents.set(e,t)}setIn(e,t){Te(e)?this.contents=t:this.contents==null?this.contents=we(this.schema,Array.from(e),t):an(this.contents)&&this.contents.setIn(e,t)}setSchema(e,t={}){typeof e==`number`&&(e=String(e));let n;switch(e){case`1.1`:this.directives?this.directives.yaml.version=`1.1`:this.directives=new L({version:`1.1`}),n={resolveKnownTags:!1,schema:`yaml-1.1`};break;case`1.2`:case`next`:this.directives?this.directives.yaml.version=e:this.directives=new L({version:e}),n={resolveKnownTags:!0,schema:`core`};break;case null:this.directives&&delete this.directives,n=null;break;default:{let t=JSON.stringify(e);throw Error(`Expected '1.1', '1.2' or null as first argument, but found: ${t}`)}}if(t.schema instanceof Object)this.schema=t.schema;else if(n)this.schema=new tn(Object.assign(n,t));else throw Error(`With a null YAML version, the { schema: Schema } option is required`)}toJS({json:e,jsonArg:t,mapAsMap:n,maxAliasCount:r,onAnchor:i,reviver:a}={}){let o={anchors:new Map,doc:this,keep:!e,mapAsMap:n===!0,mapKeyWarned:!1,maxAliasCount:typeof r==`number`?r:100},s=R(this.contents,t??``,o);if(typeof i==`function`)for(let{count:e,res:t}of o.anchors.values())i(t,e);return typeof a==`function`?_e(a,{"":s},``,s):s}toJSON(e,t){return this.toJS({json:!0,jsonArg:e,mapAsMap:!1,onAnchor:t})}toString(e={}){if(this.errors.length>0)throw Error(`Document with errors cannot be stringified`);if(`indent`in e&&(!Number.isInteger(e.indent)||Number(e.indent)<=0)){let t=JSON.stringify(e.indent);throw Error(`"indent" option must be a positive integer, not ${t}`)}return nn(this,e)}};function an(e){if(A(e))return!0;throw Error(`Expected a YAML collection as document contents`)}var on=class extends Error{constructor(e,t,n,r){super(),this.name=e,this.code=n,this.message=r,this.pos=t}},Y=class extends on{constructor(e,t,n){super(`YAMLParseError`,e,t,n)}},sn=class extends on{constructor(e,t,n){super(`YAMLWarning`,e,t,n)}};const cn=(e,t)=>n=>{if(n.pos[0]===-1)return;n.linePos=n.pos.map(e=>t.linePos(e));let{line:r,col:i}=n.linePos[0];n.message+=` at line ${r}, column ${i}`;let a=i-1,o=e.substring(t.lineStarts[r-1],t.lineStarts[r]).replace(/[\n\r]+$/,``);if(a>=60&&o.length>80){let e=Math.min(a-39,o.length-79);o=`…`+o.substring(e),a-=e-1}if(o.length>80&&(o=o.substring(0,79)+`…`),r>1&&/^ *$/.test(o.substring(0,a))){let n=e.substring(t.lineStarts[r-2],t.lineStarts[r-1]);n.length>80&&(n=n.substring(0,79)+`…
42
- `),o=n+o}if(/[^ ]/.test(o)){let e=1,t=n.linePos[1];t?.line===r&&t.col>i&&(e=Math.max(1,Math.min(t.col-i,80-a)));let s=` `.repeat(a)+`^`.repeat(e);n.message+=`:\n\n${o}\n${s}\n`}};function ln(e,{flow:t,indicator:n,next:r,offset:i,onError:a,parentIndent:o,startOnNewline:s}){let c=!1,l=s,u=s,d=``,f=``,p=!1,m=!1,h=null,g=null,_=null,v=null,y=null,b=null,x=null;for(let i of e)switch(m&&=(i.type!==`space`&&i.type!==`newline`&&i.type!==`comma`&&a(i.offset,`MISSING_CHAR`,`Tags and anchors must be separated from the next token by white space`),!1),h&&=(l&&i.type!==`comment`&&i.type!==`newline`&&a(h,`TAB_AS_INDENT`,`Tabs are not allowed as indentation`),null),i.type){case`space`:!t&&(n!==`doc-start`||r?.type!==`flow-collection`)&&i.source.includes(` `)&&(h=i),u=!0;break;case`comment`:{u||a(i,`MISSING_CHAR`,`Comments must be separated from other tokens by white space characters`);let e=i.source.substring(1)||` `;d?d+=f+e:d=e,f=``,l=!1;break}case`newline`:l?d?d+=i.source:(!b||n!==`seq-item-ind`)&&(c=!0):f+=i.source,l=!0,p=!0,(g||_)&&(v=i),u=!0;break;case`anchor`:g&&a(i,`MULTIPLE_ANCHORS`,`A node can have at most one anchor`),i.source.endsWith(`:`)&&a(i.offset+i.source.length-1,`BAD_ALIAS`,`Anchor ending in : is ambiguous`,!0),g=i,x??=i.offset,l=!1,u=!1,m=!0;break;case`tag`:_&&a(i,`MULTIPLE_TAGS`,`A node can have at most one tag`),_=i,x??=i.offset,l=!1,u=!1,m=!0;break;case n:(g||_)&&a(i,`BAD_PROP_ORDER`,`Anchors and tags must be after the ${i.source} indicator`),b&&a(i,`UNEXPECTED_TOKEN`,`Unexpected ${i.source} in ${t??`collection`}`),b=i,l=n===`seq-item-ind`||n===`explicit-key-ind`,u=!1;break;case`comma`:if(t){y&&a(i,`UNEXPECTED_TOKEN`,`Unexpected , in ${t}`),y=i,l=!1,u=!1;break}default:a(i,`UNEXPECTED_TOKEN`,`Unexpected ${i.type} token`),l=!1,u=!1}let S=e[e.length-1],ee=S?S.offset+S.source.length:i;return m&&r&&r.type!==`space`&&r.type!==`newline`&&r.type!==`comma`&&(r.type!==`scalar`||r.source!==``)&&a(r.offset,`MISSING_CHAR`,`Tags and anchors must be separated from the next token by white space`),h&&(l&&h.indent<=o||r?.type===`block-map`||r?.type===`block-seq`)&&a(h,`TAB_AS_INDENT`,`Tabs are not allowed as indentation`),{comma:y,found:b,spaceBefore:c,comment:d,hasNewline:p,anchor:g,tag:_,newlineAfterProp:v,end:ee,start:x??ee}}function un(e){if(!e)return null;switch(e.type){case`alias`:case`scalar`:case`double-quoted-scalar`:case`single-quoted-scalar`:if(e.source.includes(`
43
- `))return!0;if(e.end){for(let t of e.end)if(t.type===`newline`)return!0}return!1;case`flow-collection`:for(let t of e.items){for(let e of t.start)if(e.type===`newline`)return!0;if(t.sep){for(let e of t.sep)if(e.type===`newline`)return!0}if(un(t.key)||un(t.value))return!0}return!1;default:return!0}}function dn(e,t,n){if(t?.type===`flow-collection`){let r=t.end[0];r.indent===e&&(r.source===`]`||r.source===`}`)&&un(t)&&n(r,`BAD_INDENT`,`Flow end indicator should be more indented than parent`,!0)}}function fn(e,t,n){let{uniqueKeys:r}=e.options;if(r===!1)return!1;let i=typeof r==`function`?r:(e,t)=>e===t||k(e)&&k(t)&&e.value===t.value;return t.some(e=>i(e.key,n))}const pn=`All mapping items must start at the same column`;function mn({composeNode:e,composeEmptyNode:t},n,r,i,a){let o=new((a?.nodeClass)??K)(n.schema);n.atRoot&&=!1;let s=r.offset,c=null;for(let a of r.items){let{start:l,key:u,sep:d,value:f}=a,p=ln(l,{indicator:`explicit-key-ind`,next:u??d?.[0],offset:s,onError:i,parentIndent:r.indent,startOnNewline:!0}),m=!p.found;if(m){if(u&&(u.type===`block-seq`?i(s,`BLOCK_AS_IMPLICIT_KEY`,`A block sequence may not be used as an implicit map key`):`indent`in u&&u.indent!==r.indent&&i(s,`BAD_INDENT`,pn)),!p.anchor&&!p.tag&&!d){c=p.end,p.comment&&(o.comment?o.comment+=`
44
- `+p.comment:o.comment=p.comment);continue}(p.newlineAfterProp||un(u))&&i(u??l[l.length-1],`MULTILINE_IMPLICIT_KEY`,`Implicit keys need to be on a single line`)}else p.found?.indent!==r.indent&&i(s,`BAD_INDENT`,pn);n.atKey=!0;let h=p.end,g=u?e(n,u,p,i):t(n,h,l,null,p,i);n.schema.compat&&dn(r.indent,u,i),n.atKey=!1,fn(n,o.items,g)&&i(h,`DUPLICATE_KEY`,`Map keys must be unique`);let _=ln(d??[],{indicator:`map-value-ind`,next:f,offset:g.range[2],onError:i,parentIndent:r.indent,startOnNewline:!u||u.type===`block-scalar`});if(s=_.end,_.found){m&&(f?.type===`block-map`&&!_.hasNewline&&i(s,`BLOCK_AS_IMPLICIT_KEY`,`Nested mappings are not allowed in compact mappings`),n.options.strict&&p.start<_.found.offset-1024&&i(g.range,`KEY_OVER_1024_CHARS`,`The : indicator must be at most 1024 chars after the start of an implicit block mapping key`));let c=f?e(n,f,_,i):t(n,s,d,null,_,i);n.schema.compat&&dn(r.indent,f,i),s=c.range[2];let l=new W(g,c);n.options.keepSourceTokens&&(l.srcToken=a),o.items.push(l)}else{m&&i(g.range,`MISSING_CHAR`,`Implicit map keys need to be followed by map values`),_.comment&&(g.comment?g.comment+=`
45
- `+_.comment:g.comment=_.comment);let e=new W(g);n.options.keepSourceTokens&&(e.srcToken=a),o.items.push(e)}}return c&&c<s&&i(c,`IMPOSSIBLE`,`Map comment with trailing content`),o.range=[r.offset,s,c??s],o}function hn({composeNode:e,composeEmptyNode:t},n,r,i,a){let o=new((a?.nodeClass)??q)(n.schema);n.atRoot&&=!1,n.atKey&&=!1;let s=r.offset,c=null;for(let{start:a,value:l}of r.items){let u=ln(a,{indicator:`seq-item-ind`,next:l,offset:s,onError:i,parentIndent:r.indent,startOnNewline:!0});if(!u.found){if(u.anchor||u.tag||l)l?.type===`block-seq`?i(u.end,`BAD_INDENT`,`All sequence items must start at the same column`):i(s,`MISSING_CHAR`,`Sequence item without - indicator`);else{c=u.end,u.comment&&(o.comment=u.comment);continue}}let d=l?e(n,l,u,i):t(n,u.end,a,null,u,i);n.schema.compat&&dn(r.indent,l,i),s=d.range[2],o.items.push(d)}return o.range=[r.offset,s,c??s],o}function gn(e,t,n,r){let i=``;if(e){let a=!1,o=``;for(let s of e){let{source:e,type:c}=s;switch(c){case`space`:a=!0;break;case`comment`:{n&&!a&&r(s,`MISSING_CHAR`,`Comments must be separated from other tokens by white space characters`);let t=e.substring(1)||` `;i?i+=o+t:i=t,o=``;break}case`newline`:i&&(o+=e),a=!0;break;default:r(s,`UNEXPECTED_TOKEN`,`Unexpected ${c} at node end`)}t+=e.length}}return{comment:i,offset:t}}const _n=`Block collections are not allowed within flow collections`,vn=e=>e&&(e.type===`block-map`||e.type===`block-seq`);function yn({composeNode:e,composeEmptyNode:t},n,r,i,a){let o=r.start.source===`{`,s=o?`flow map`:`flow sequence`,c=new((a?.nodeClass)??(o?K:q))(n.schema);c.flow=!0;let l=n.atRoot;l&&(n.atRoot=!1),n.atKey&&=!1;let u=r.offset+r.start.source.length;for(let a=0;a<r.items.length;++a){let l=r.items[a],{start:d,key:f,sep:p,value:m}=l,h=ln(d,{flow:s,indicator:`explicit-key-ind`,next:f??p?.[0],offset:u,onError:i,parentIndent:r.indent,startOnNewline:!1});if(!h.found){if(!h.anchor&&!h.tag&&!p&&!m){a===0&&h.comma?i(h.comma,`UNEXPECTED_TOKEN`,`Unexpected , in ${s}`):a<r.items.length-1&&i(h.start,`UNEXPECTED_TOKEN`,`Unexpected empty item in ${s}`),h.comment&&(c.comment?c.comment+=`
46
- `+h.comment:c.comment=h.comment),u=h.end;continue}!o&&n.options.strict&&un(f)&&i(f,`MULTILINE_IMPLICIT_KEY`,`Implicit keys of flow sequence pairs need to be on a single line`)}if(a===0)h.comma&&i(h.comma,`UNEXPECTED_TOKEN`,`Unexpected , in ${s}`);else if(h.comma||i(h.start,`MISSING_CHAR`,`Missing , between ${s} items`),h.comment){let e=``;loop:for(let t of d)switch(t.type){case`comma`:case`space`:break;case`comment`:e=t.source.substring(1);break loop;default:break loop}if(e){let t=c.items[c.items.length-1];O(t)&&(t=t.value??t.key),t.comment?t.comment+=`
47
- `+e:t.comment=e,h.comment=h.comment.substring(e.length+1)}}if(!o&&!p&&!h.found){let r=m?e(n,m,h,i):t(n,h.end,p,null,h,i);c.items.push(r),u=r.range[2],vn(m)&&i(r.range,`BLOCK_IN_FLOW`,_n)}else{n.atKey=!0;let a=h.end,g=f?e(n,f,h,i):t(n,a,d,null,h,i);vn(f)&&i(g.range,`BLOCK_IN_FLOW`,_n),n.atKey=!1;let _=ln(p??[],{flow:s,indicator:`map-value-ind`,next:m,offset:g.range[2],onError:i,parentIndent:r.indent,startOnNewline:!1});if(_.found){if(!o&&!h.found&&n.options.strict){if(p)for(let e of p){if(e===_.found)break;if(e.type===`newline`){i(e,`MULTILINE_IMPLICIT_KEY`,`Implicit keys of flow sequence pairs need to be on a single line`);break}}h.start<_.found.offset-1024&&i(_.found,`KEY_OVER_1024_CHARS`,`The : indicator must be at most 1024 chars after the start of an implicit flow sequence key`)}}else m&&(`source`in m&&m.source?.[0]===`:`?i(m,`MISSING_CHAR`,`Missing space after : in ${s}`):i(_.start,`MISSING_CHAR`,`Missing , or : between ${s} items`));let v=m?e(n,m,_,i):_.found?t(n,_.end,p,null,_,i):null;v?vn(m)&&i(v.range,`BLOCK_IN_FLOW`,_n):_.comment&&(g.comment?g.comment+=`
48
- `+_.comment:g.comment=_.comment);let y=new W(g,v);if(n.options.keepSourceTokens&&(y.srcToken=l),o){let e=c;fn(n,e.items,g)&&i(a,`DUPLICATE_KEY`,`Map keys must be unique`),e.items.push(y)}else{let e=new K(n.schema);e.flow=!0,e.items.push(y);let t=(v??g).range;e.range=[g.range[0],t[1],t[2]],c.items.push(e)}u=v?v.range[2]:_.end}}let d=o?`}`:`]`,[f,...p]=r.end,m=u;if(f?.source===d)m=f.offset+f.source.length;else{let e=s[0].toUpperCase()+s.substring(1),t=l?`${e} must end with a ${d}`:`${e} in block collection must be sufficiently indented and end with a ${d}`;i(u,l?`MISSING_CHAR`:`BAD_INDENT`,t),f&&f.source.length!==1&&p.unshift(f)}if(p.length>0){let e=gn(p,m,n.options.strict,i);e.comment&&(c.comment?c.comment+=`
49
- `+e.comment:c.comment=e.comment),c.range=[r.offset,m,e.offset]}else c.range=[r.offset,m,m];return c}function bn(e,t,n,r,i,a){let o=n.type===`block-map`?mn(e,t,n,r,a):n.type===`block-seq`?hn(e,t,n,r,a):yn(e,t,n,r,a),s=o.constructor;return i===`!`||i===s.tagName?(o.tag=s.tagName,o):(i&&(o.tag=i),o)}function xn(e,t,n,r,i){let a=r.tag,o=a?t.directives.tagName(a.source,e=>i(a,`TAG_RESOLVE_FAILED`,e)):null;if(n.type===`block-seq`){let{anchor:e,newlineAfterProp:t}=r,n=e&&a?e.offset>a.offset?e:a:e??a;n&&(!t||t.offset<n.offset)&&i(n,`MISSING_CHAR`,`Missing newline after block sequence props`)}let s=n.type===`block-map`?`map`:n.type===`block-seq`?`seq`:n.start.source===`{`?`map`:`seq`;if(!a||!o||o===`!`||o===K.tagName&&s===`map`||o===q.tagName&&s===`seq`)return bn(e,t,n,i,o);let c=t.schema.tags.find(e=>e.tag===o&&e.collection===s);if(!c){let r=t.schema.knownTags[o];if(r?.collection===s)t.schema.tags.push(Object.assign({},r,{default:!1})),c=r;else return r?i(a,`BAD_COLLECTION_TYPE`,`${r.tag} used for ${s} collection, but expects ${r.collection??`scalar`}`,!0):i(a,`TAG_RESOLVE_FAILED`,`Unresolved tag: ${o}`,!0),bn(e,t,n,i,o)}let l=bn(e,t,n,i,o,c),u=c.resolve?.(l,e=>i(a,`TAG_RESOLVE_FAILED`,e),t.options)??l,d=j(u)?u:new z(u);return d.range=l.range,d.tag=o,c?.format&&(d.format=c.format),d}function Sn(e,t,n){let r=t.offset,i=Cn(t,e.options.strict,n);if(!i)return{value:``,type:null,comment:``,range:[r,r,r]};let a=i.mode===`>`?z.BLOCK_FOLDED:z.BLOCK_LITERAL,o=t.source?wn(t.source):[],s=o.length;for(let e=o.length-1;e>=0;--e){let t=o[e][1];if(t===``||t===`\r`)s=e;else break}if(s===0){let e=i.chomp===`+`&&o.length>0?`
50
- `.repeat(Math.max(1,o.length-1)):``,n=r+i.length;return t.source&&(n+=t.source.length),{value:e,type:a,comment:i.comment,range:[r,n,n]}}let c=t.indent+i.indent,l=t.offset+i.length,u=0;for(let t=0;t<s;++t){let[r,a]=o[t];if(a===``||a===`\r`)i.indent===0&&r.length>c&&(c=r.length);else{r.length<c&&n(l+r.length,`MISSING_CHAR`,`Block scalars with more-indented leading empty lines must use an explicit indentation indicator`),i.indent===0&&(c=r.length),u=t,c===0&&!e.atRoot&&n(l,`BAD_INDENT`,`Block scalar values in collections must be indented`);break}l+=r.length+a.length+1}for(let e=o.length-1;e>=s;--e)o[e][0].length>c&&(s=e+1);let d=``,f=``,p=!1;for(let e=0;e<u;++e)d+=o[e][0].slice(c)+`
51
- `;for(let e=u;e<s;++e){let[t,r]=o[e];l+=t.length+r.length+1;let s=r[r.length-1]===`\r`;if(s&&(r=r.slice(0,-1)),r&&t.length<c){let e=`Block scalar lines must not be less indented than their ${i.indent?`explicit indentation indicator`:`first line`}`;n(l-r.length-(s?2:1),`BAD_INDENT`,e),t=``}a===z.BLOCK_LITERAL?(d+=f+t.slice(c)+r,f=`
52
- `):t.length>c||r[0]===` `?(f===` `?f=`
53
- `:!p&&f===`
54
- `&&(f=`
55
-
56
- `),d+=f+t.slice(c)+r,f=`
57
- `,p=!0):r===``?f===`
58
- `?d+=`
59
- `:f=`
60
- `:(d+=f+r,f=` `,p=!1)}switch(i.chomp){case`-`:break;case`+`:for(let e=s;e<o.length;++e)d+=`
61
- `+o[e][0].slice(c);d[d.length-1]!==`
62
- `&&(d+=`
63
- `);break;default:d+=`
64
- `}let m=r+i.length+t.source.length;return{value:d,type:a,comment:i.comment,range:[r,m,m]}}function Cn({offset:e,props:t},n,r){if(t[0].type!==`block-scalar-header`)return r(t[0],`IMPOSSIBLE`,`Block scalar header not found`),null;let{source:i}=t[0],a=i[0],o=0,s=``,c=-1;for(let t=1;t<i.length;++t){let n=i[t];if(!s&&(n===`-`||n===`+`))s=n;else{let r=Number(n);!o&&r?o=r:c===-1&&(c=e+t)}}c!==-1&&r(c,`UNEXPECTED_TOKEN`,`Block scalar header includes extra characters: ${i}`);let l=!1,u=``,d=i.length;for(let e=1;e<t.length;++e){let i=t[e];switch(i.type){case`space`:l=!0;case`newline`:d+=i.source.length;break;case`comment`:n&&!l&&r(i,`MISSING_CHAR`,`Comments must be separated from other tokens by white space characters`),d+=i.source.length,u=i.source.substring(1);break;case`error`:r(i,`UNEXPECTED_TOKEN`,i.message),d+=i.source.length;break;default:{r(i,`UNEXPECTED_TOKEN`,`Unexpected token in block scalar header: ${i.type}`);let e=i.source;e&&typeof e==`string`&&(d+=e.length)}}}return{mode:a,indent:o,chomp:s,comment:u,length:d}}function wn(e){let t=e.split(/\n( *)/),n=t[0],r=n.match(/^( *)/),i=[r?.[1]?[r[1],n.slice(r[1].length)]:[``,n]];for(let e=1;e<t.length;e+=2)i.push([t[e],t[e+1]]);return i}function Tn(e,t,n){let{offset:r,type:i,source:a,end:o}=e,s,c,l=(e,t,i)=>n(r+e,t,i);switch(i){case`scalar`:s=z.PLAIN,c=En(a,l);break;case`single-quoted-scalar`:s=z.QUOTE_SINGLE,c=Dn(a,l);break;case`double-quoted-scalar`:s=z.QUOTE_DOUBLE,c=kn(a,l);break;default:return n(e,`UNEXPECTED_TOKEN`,`Expected a flow scalar value, but found: ${i}`),{value:``,type:null,comment:``,range:[r,r+a.length,r+a.length]}}let u=r+a.length,d=gn(o,u,t,n);return{value:c,type:s,comment:d.comment,range:[r,u,d.offset]}}function En(e,t){let n=``;switch(e[0]){case` `:n=`a tab character`;break;case`,`:n=`flow indicator character ,`;break;case`%`:n=`directive indicator character %`;break;case`|`:case`>`:n=`block scalar indicator ${e[0]}`;break;case`@`:case"`":n=`reserved character ${e[0]}`}return n&&t(0,`BAD_SCALAR_START`,`Plain value cannot start with ${n}`),On(e)}function Dn(e,t){return(e[e.length-1]!==`'`||e.length===1)&&t(e.length,`MISSING_CHAR`,`Missing closing 'quote`),On(e.slice(1,-1)).replace(/''/g,`'`)}function On(e){let t=/(.*?)\r?\n/sy,n=t.exec(e);if(!n)return e;let r,i;try{r=RegExp(`(?<![ ])[ ]+$`),i=RegExp(`^[ ]+|(?<![ ])[ ]+$`,`g`)}catch{r=/[ \t]+$/,i=/^[ \t]+|[ \t]+$/g}let a=n[1].replace(r,``),o=` `,s=t.lastIndex;for(;n=t.exec(e);){let e=n[1].replace(i,``);e===``?o===`
65
- `?a+=o:o=`
66
- `:(a+=o+e,o=` `),s=t.lastIndex}let c=/[ \t]*(.*)/sy;return c.lastIndex=s,n=c.exec(e),a+o+(n?.[1]??``)}function kn(e,t){let n=``;for(let r=1;r<e.length-1;++r){let i=e[r];if(i!==`\r`||e[r+1]!==`
67
- `){if(i===`
68
- `){let{fold:t,offset:i}=An(e,r);n+=t,r=i}else if(i===`\\`){let i=e[++r],a=jn[i];if(a)n+=a;else if(i===`
69
- `)for(i=e[r+1];i===` `||i===` `;)i=e[++r+1];else if(i===`\r`&&e[r+1]===`
70
- `)for(i=e[++r+1];i===` `||i===` `;)i=e[++r+1];else if(i===`x`||i===`u`||i===`U`){let a=i===`x`?2:i===`u`?4:8;n+=Mn(e,r+1,a,t),r+=a}else{let i=e.substr(r-1,2);t(r-1,`BAD_DQ_ESCAPE`,`Invalid escape sequence ${i}`),n+=i}}else if(i===` `||i===` `){let t=r,a=e[r+1];for(;a===` `||a===` `;)a=e[++r+1];a!==`
71
- `&&(a!==`\r`||e[r+2]!==`
72
- `)&&(n+=r>t?e.slice(t,r+1):i)}else n+=i}}return(e[e.length-1]!==`"`||e.length===1)&&t(e.length,`MISSING_CHAR`,`Missing closing "quote`),n}function An(e,t){let n=``,r=e[t+1];for(;(r===` `||r===` `||r===`
73
- `||r===`\r`)&&(r!==`\r`||e[t+2]===`
74
- `);)r===`
75
- `&&(n+=`
76
- `),t+=1,r=e[t+1];return n||=` `,{fold:n,offset:t}}const jn={0:`\0`,a:`\x07`,b:`\b`,e:`\x1B`,f:`\f`,n:`
77
- `,r:`\r`,t:` `,v:`\v`,N:`…`,_:`\xA0`,L:`\u2028`,P:`\u2029`," ":` `,'"':`"`,"/":`/`,"\\":`\\`," ":` `};function Mn(e,t,n,r){let i=e.substr(t,n),a=i.length===n&&/^[0-9a-fA-F]+$/.test(i)?parseInt(i,16):NaN;try{return String.fromCodePoint(a)}catch{let i=e.substr(t-2,n+2);return r(t-2,`BAD_DQ_ESCAPE`,`Invalid escape sequence ${i}`),i}}function Nn(e,t,n,r){let{value:i,type:a,comment:o,range:s}=t.type===`block-scalar`?Sn(e,t,r):Tn(t,e.options.strict,r),c=n?e.directives.tagName(n.source,e=>r(n,`TAG_RESOLVE_FAILED`,e)):null,l;l=e.options.stringKeys&&e.atKey?e.schema[w]:c?Pn(e.schema,i,c,n,r):t.type===`scalar`?Fn(e,i,t,r):e.schema[w];let u;try{let a=l.resolve(i,e=>r(n??t,`TAG_RESOLVE_FAILED`,e),e.options);u=k(a)?a:new z(a)}catch(e){let a=e instanceof Error?e.message:String(e);r(n??t,`TAG_RESOLVE_FAILED`,a),u=new z(i)}return u.range=s,u.source=i,a&&(u.type=a),c&&(u.tag=c),l.format&&(u.format=l.format),o&&(u.comment=o),u}function Pn(e,t,n,r,i){if(n===`!`)return e[w];let a=[];for(let t of e.tags)if(!t.collection&&t.tag===n){if(t.default&&t.test)a.push(t);else return t}for(let e of a)if(e.test?.test(t))return e;let o=e.knownTags[n];return o&&!o.collection?(e.tags.push(Object.assign({},o,{default:!1,test:void 0})),o):(i(r,`TAG_RESOLVE_FAILED`,`Unresolved tag: ${n}`,n!==`tag:yaml.org,2002:str`),e[w])}function Fn({atKey:e,directives:t,schema:n},r,i,a){let o=n.tags.find(t=>(t.default===!0||e&&t.default===`key`)&&t.test?.test(r))||n[w];if(n.compat){let e=n.compat.find(e=>e.default&&e.test?.test(r))??n[w];o.tag!==e.tag&&a(i,`TAG_RESOLVE_FAILED`,`Value may be parsed as either ${t.tagString(o.tag)} or ${t.tagString(e.tag)}`,!0)}return o}function In(e,t,n){if(t){n??=t.length;for(let r=n-1;r>=0;--r){let n=t[r];switch(n.type){case`space`:case`comment`:case`newline`:e-=n.source.length;continue}for(n=t[++r];n?.type===`space`;)e+=n.source.length,n=t[++r];break}}return e}const Ln={composeNode:Rn,composeEmptyNode:zn};function Rn(e,t,n,r){let i=e.atKey,{spaceBefore:a,comment:o,anchor:s,tag:c}=n,l,u=!0;switch(t.type){case`alias`:l=Bn(e,t,r),(s||c)&&r(t,`ALIAS_PROPS`,`An alias node must not specify any properties`);break;case`scalar`:case`single-quoted-scalar`:case`double-quoted-scalar`:case`block-scalar`:l=Nn(e,t,c,r),s&&(l.anchor=s.source.substring(1));break;case`block-map`:case`block-seq`:case`flow-collection`:try{l=xn(Ln,e,t,n,r),s&&(l.anchor=s.source.substring(1))}catch(e){r(t,`RESOURCE_EXHAUSTION`,e instanceof Error?e.message:String(e))}break;default:r(t,`UNEXPECTED_TOKEN`,t.type===`error`?t.message:`Unsupported token (type: ${t.type})`),u=!1}return l??=zn(e,t.offset,void 0,null,n,r),s&&l.anchor===``&&r(s,`BAD_ALIAS`,`Anchor cannot be an empty string`),i&&e.options.stringKeys&&(!k(l)||typeof l.value!=`string`||l.tag&&l.tag!==`tag:yaml.org,2002:str`)&&r(c??t,`NON_STRING_KEY`,`With stringKeys, all keys must be strings`),a&&(l.spaceBefore=!0),o&&(t.type===`scalar`&&t.source===``?l.comment=o:l.commentBefore=o),e.options.keepSourceTokens&&u&&(l.srcToken=t),l}function zn(e,t,n,r,{spaceBefore:i,comment:a,anchor:o,tag:s,end:c},l){let u=Nn(e,{type:`scalar`,offset:In(t,n,r),indent:-1,source:``},s,l);return o&&(u.anchor=o.source.substring(1),u.anchor===``&&l(o,`BAD_ALIAS`,`Anchor cannot be an empty string`)),i&&(u.spaceBefore=!0),a&&(u.comment=a,u.range[2]=c),u}function Bn({options:e},{offset:t,source:n,end:r},i){let a=new ye(n.substring(1));a.source===``&&i(t,`BAD_ALIAS`,`Alias cannot be an empty string`),a.source.endsWith(`:`)&&i(t+n.length-1,`BAD_ALIAS`,`Alias ending in : is ambiguous`,!0);let o=t+n.length,s=gn(r,o,e.strict,i);return a.range=[t,o,s.offset],s.comment&&(a.comment=s.comment),a}function Vn(e,t,{offset:n,start:r,value:i,end:a},o){let s=new rn(void 0,Object.assign({_directives:t},e)),c={atKey:!1,atRoot:!0,directives:s.directives,options:s.options,schema:s.schema},l=ln(r,{indicator:`doc-start`,next:i??a?.[0],offset:n,onError:o,parentIndent:0,startOnNewline:!0});l.found&&(s.directives.docStart=!0,i&&(i.type===`block-map`||i.type===`block-seq`)&&!l.hasNewline&&o(l.end,`MISSING_CHAR`,`Block collection cannot start on same line with directives-end marker`)),s.contents=i?Rn(c,i,l,o):zn(c,l.end,r,null,l,o);let u=s.contents.range[2],d=gn(a,u,!1,o);return d.comment&&(s.comment=d.comment),s.range=[n,u,d.offset],s}function Hn(e){if(typeof e==`number`)return[e,e+1];if(Array.isArray(e))return e.length===2?e:[e[0],e[1]];let{offset:t,source:n}=e;return[t,t+(typeof n==`string`?n.length:1)]}function Un(e){let t=``,n=!1,r=!1;for(let i=0;i<e.length;++i){let a=e[i];switch(a[0]){case`#`:t+=(t===``?``:r?`
78
-
79
- `:`
80
- `)+(a.substring(1)||` `),n=!0,r=!1;break;case`%`:e[i+1]?.[0]!==`#`&&(i+=1),n=!1;break;default:n||(r=!0),n=!1}}return{comment:t,afterEmptyLine:r}}var Wn=class{constructor(e={}){this.doc=null,this.atDirectives=!1,this.prelude=[],this.errors=[],this.warnings=[],this.onError=(e,t,n,r)=>{let i=Hn(e);r?this.warnings.push(new sn(i,t,n)):this.errors.push(new Y(i,t,n))},this.directives=new L({version:e.version||`1.2`}),this.options=e}decorate(e,t){let{comment:n,afterEmptyLine:r}=Un(this.prelude);if(n){let i=e.contents;if(t)e.comment=e.comment?`${e.comment}\n${n}`:n;else if(r||e.directives.docStart||!i)e.commentBefore=n;else if(A(i)&&!i.flow&&i.items.length>0){let e=i.items[0];O(e)&&(e=e.key);let t=e.commentBefore;e.commentBefore=t?`${n}\n${t}`:n}else{let e=i.commentBefore;i.commentBefore=e?`${n}\n${e}`:n}}if(t){for(let t=0;t<this.errors.length;++t)e.errors.push(this.errors[t]);for(let t=0;t<this.warnings.length;++t)e.warnings.push(this.warnings[t])}else e.errors=this.errors,e.warnings=this.warnings;this.prelude=[],this.errors=[],this.warnings=[]}streamInfo(){return{comment:Un(this.prelude).comment,directives:this.directives,errors:this.errors,warnings:this.warnings}}*compose(e,t=!1,n=-1){for(let t of e)yield*this.next(t);yield*this.end(t,n)}*next(e){switch(e.type){case`directive`:this.directives.add(e.source,(t,n,r)=>{let i=Hn(e);i[0]+=t,this.onError(i,`BAD_DIRECTIVE`,n,r)}),this.prelude.push(e.source),this.atDirectives=!0;break;case`document`:{let t=Vn(this.options,this.directives,e,this.onError);this.atDirectives&&!t.directives.docStart&&this.onError(e,`MISSING_CHAR`,`Missing directives-end/doc-start indicator line`),this.decorate(t,!1),this.doc&&(yield this.doc),this.doc=t,this.atDirectives=!1;break}case`byte-order-mark`:case`space`:break;case`comment`:case`newline`:this.prelude.push(e.source);break;case`error`:{let t=e.source?`${e.message}: ${JSON.stringify(e.source)}`:e.message,n=new Y(Hn(e),`UNEXPECTED_TOKEN`,t);this.atDirectives||!this.doc?this.errors.push(n):this.doc.errors.push(n);break}case`doc-end`:{if(!this.doc){this.errors.push(new Y(Hn(e),`UNEXPECTED_TOKEN`,`Unexpected doc-end without preceding document`));break}this.doc.directives.docEnd=!0;let t=gn(e.end,e.offset+e.source.length,this.doc.options.strict,this.onError);if(this.decorate(this.doc,!0),t.comment){let e=this.doc.comment;this.doc.comment=e?`${e}\n${t.comment}`:t.comment}this.doc.range[2]=t.offset;break}default:this.errors.push(new Y(Hn(e),`UNEXPECTED_TOKEN`,`Unsupported token ${e.type}`))}}*end(e=!1,t=-1){if(this.doc)this.decorate(this.doc,!0),yield this.doc,this.doc=null;else if(e){let e=new rn(void 0,Object.assign({_directives:this.directives},this.options));this.atDirectives&&this.onError(t,`MISSING_CHAR`,`Missing directives-end indicator line`),e.range=[0,t,t],this.decorate(e,!1),yield e}}};function Gn(e,t=!0,n){if(e){let r=(e,t,r)=>{let i=typeof e==`number`?e:Array.isArray(e)?e[0]:e.offset;if(n)n(i,t,r);else throw new Y([i,i+1],t,r)};switch(e.type){case`scalar`:case`single-quoted-scalar`:case`double-quoted-scalar`:return Tn(e,t,r);case`block-scalar`:return Sn({options:{strict:t}},e,r)}}return null}function Kn(e,t){let{implicitKey:n=!1,indent:r,inFlow:i=!1,offset:a=-1,type:o=`PLAIN`}=t,s=Be({type:o,value:e},{implicitKey:n,indent:r>0?` `.repeat(r):``,inFlow:i,options:{blockQuote:!0,lineWidth:-1}}),c=t.end??[{type:`newline`,offset:-1,indent:r,source:`
81
- `}];switch(s[0]){case`|`:case`>`:{let e=s.indexOf(`
82
- `),t=s.substring(0,e),n=s.substring(e+1)+`
83
- `,i=[{type:`block-scalar-header`,offset:a,indent:r,source:t}];return Yn(i,c)||i.push({type:`newline`,offset:-1,indent:r,source:`
84
- `}),{type:`block-scalar`,offset:a,indent:r,props:i,source:n}}case`"`:return{type:`double-quoted-scalar`,offset:a,indent:r,source:s,end:c};case`'`:return{type:`single-quoted-scalar`,offset:a,indent:r,source:s,end:c};default:return{type:`scalar`,offset:a,indent:r,source:s,end:c}}}function qn(e,t,n={}){let{afterKey:r=!1,implicitKey:i=!1,inFlow:a=!1,type:o}=n,s=`indent`in e?e.indent:null;if(r&&typeof s==`number`&&(s+=2),!o)switch(e.type){case`single-quoted-scalar`:o=`QUOTE_SINGLE`;break;case`double-quoted-scalar`:o=`QUOTE_DOUBLE`;break;case`block-scalar`:{let t=e.props[0];if(t.type!==`block-scalar-header`)throw Error(`Invalid block scalar header`);o=t.source[0]===`>`?`BLOCK_FOLDED`:`BLOCK_LITERAL`;break}default:o=`PLAIN`}let c=Be({type:o,value:t},{implicitKey:i||s===null,indent:s!==null&&s>0?` `.repeat(s):``,inFlow:a,options:{blockQuote:!0,lineWidth:-1}});switch(c[0]){case`|`:case`>`:Jn(e,c);break;case`"`:Xn(e,c,`double-quoted-scalar`);break;case`'`:Xn(e,c,`single-quoted-scalar`);break;default:Xn(e,c,`scalar`)}}function Jn(e,t){let n=t.indexOf(`
85
- `),r=t.substring(0,n),i=t.substring(n+1)+`
86
- `;if(e.type===`block-scalar`){let t=e.props[0];if(t.type!==`block-scalar-header`)throw Error(`Invalid block scalar header`);t.source=r,e.source=i}else{let{offset:t}=e,n=`indent`in e?e.indent:-1,a=[{type:`block-scalar-header`,offset:t,indent:n,source:r}];Yn(a,`end`in e?e.end:void 0)||a.push({type:`newline`,offset:-1,indent:n,source:`
87
- `});for(let t of Object.keys(e))t!==`type`&&t!==`offset`&&delete e[t];Object.assign(e,{type:`block-scalar`,indent:n,props:a,source:i})}}function Yn(e,t){if(t)for(let n of t)switch(n.type){case`space`:case`comment`:e.push(n);break;case`newline`:return e.push(n),!0}return!1}function Xn(e,t,n){switch(e.type){case`scalar`:case`double-quoted-scalar`:case`single-quoted-scalar`:e.type=n,e.source=t;break;case`block-scalar`:{let r=e.props.slice(1),i=t.length;e.props[0].type===`block-scalar-header`&&(i-=e.props[0].source.length);for(let e of r)e.offset+=i;delete e.props,Object.assign(e,{type:n,source:t,end:r});break}case`block-map`:case`block-seq`:{let r={type:`newline`,offset:e.offset+t.length,indent:e.indent,source:`
88
- `};delete e.items,Object.assign(e,{type:n,source:t,end:[r]});break}default:{let r=`indent`in e?e.indent:-1,i=`end`in e&&Array.isArray(e.end)?e.end.filter(e=>e.type===`space`||e.type===`comment`||e.type===`newline`):[];for(let t of Object.keys(e))t!==`type`&&t!==`offset`&&delete e[t];Object.assign(e,{type:n,indent:r,source:t,end:i})}}}const Zn=e=>`type`in e?Qn(e):$n(e);function Qn(e){switch(e.type){case`block-scalar`:{let t=``;for(let n of e.props)t+=Qn(n);return t+e.source}case`block-map`:case`block-seq`:{let t=``;for(let n of e.items)t+=$n(n);return t}case`flow-collection`:{let t=e.start.source;for(let n of e.items)t+=$n(n);for(let n of e.end)t+=n.source;return t}case`document`:{let t=$n(e);if(e.end)for(let n of e.end)t+=n.source;return t}default:{let t=e.source;if(`end`in e&&e.end)for(let n of e.end)t+=n.source;return t}}}function $n({start:e,key:t,sep:n,value:r}){let i=``;for(let t of e)i+=t.source;if(t&&(i+=Qn(t)),n)for(let e of n)i+=e.source;return r&&(i+=Qn(r)),i}const er=Symbol(`break visit`),tr=Symbol(`skip children`),nr=Symbol(`remove item`);function X(e,t){`type`in e&&e.type===`document`&&(e={start:e.start,value:e.value}),rr(Object.freeze([]),e,t)}X.BREAK=er,X.SKIP=tr,X.REMOVE=nr,X.itemAtPath=(e,t)=>{let n=e;for(let[e,r]of t){let t=n?.[e];if(t&&`items`in t)n=t.items[r];else return}return n},X.parentCollection=(e,t)=>{let n=X.itemAtPath(e,t.slice(0,-1)),r=t[t.length-1][0],i=n?.[r];if(i&&`items`in i)return i;throw Error(`Parent collection not found`)};function rr(e,t,n){let r=n(t,e);if(typeof r==`symbol`)return r;for(let i of[`key`,`value`]){let a=t[i];if(a&&`items`in a){for(let t=0;t<a.items.length;++t){let r=rr(Object.freeze(e.concat([[i,t]])),a.items[t],n);if(typeof r==`number`)t=r-1;else if(r===er)return er;else r===nr&&(a.items.splice(t,1),--t)}typeof r==`function`&&i===`key`&&(r=r(t,e))}}return typeof r==`function`?r(t,e):r}var ir=h({BOM:()=>``,DOCUMENT:()=>``,FLOW_END:()=>``,SCALAR:()=>``,createScalarToken:()=>Kn,isCollection:()=>ar,isScalar:()=>or,prettyToken:()=>sr,resolveAsScalar:()=>Gn,setScalarValue:()=>qn,stringify:()=>Zn,tokenType:()=>cr,visit:()=>X});const ar=e=>!!e&&`items`in e,or=e=>!!e&&(e.type===`scalar`||e.type===`single-quoted-scalar`||e.type===`double-quoted-scalar`||e.type===`block-scalar`);function sr(e){switch(e){case``:return`<BOM>`;case``:return`<DOC>`;case``:return`<FLOW_END>`;case``:return`<SCALAR>`;default:return JSON.stringify(e)}}function cr(e){switch(e){case``:return`byte-order-mark`;case``:return`doc-mode`;case``:return`flow-error-end`;case``:return`scalar`;case`---`:return`doc-start`;case`...`:return`doc-end`;case``:case`
89
- `:case`\r
90
- `:return`newline`;case`-`:return`seq-item-ind`;case`?`:return`explicit-key-ind`;case`:`:return`map-value-ind`;case`{`:return`flow-map-start`;case`}`:return`flow-map-end`;case`[`:return`flow-seq-start`;case`]`:return`flow-seq-end`;case`,`:return`comma`}switch(e[0]){case` `:case` `:return`space`;case`#`:return`comment`;case`%`:return`directive-line`;case`*`:return`alias`;case`&`:return`anchor`;case`!`:return`tag`;case`'`:return`single-quoted-scalar`;case`"`:return`double-quoted-scalar`;case`|`:case`>`:return`block-scalar-header`}return null}function Z(e){switch(e){case void 0:case` `:case`
91
- `:case`\r`:case` `:return!0;default:return!1}}const lr=new Set(`0123456789ABCDEFabcdef`),ur=new Set(`0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-#;/?:@&=+$_.!~*'()`),dr=new Set(`,[]{}`),fr=new Set(` ,[]{}
92
- \r `),pr=e=>!e||fr.has(e);var mr=class{constructor(){this.atEnd=!1,this.blockScalarIndent=-1,this.blockScalarKeep=!1,this.buffer=``,this.flowKey=!1,this.flowLevel=0,this.indentNext=0,this.indentValue=0,this.lineEndPos=null,this.next=null,this.pos=0}*lex(e,t=!1){if(e){if(typeof e!=`string`)throw TypeError(`source is not a string`);this.buffer=this.buffer?this.buffer+e:e,this.lineEndPos=null}this.atEnd=!t;let n=this.next??`stream`;for(;n&&(t||this.hasChars(1));)n=yield*this.parseNext(n)}atLineEnd(){let e=this.pos,t=this.buffer[e];for(;t===` `||t===` `;)t=this.buffer[++e];return!t||t===`#`||t===`
93
- `||t===`\r`&&this.buffer[e+1]===`
94
- `}charAt(e){return this.buffer[this.pos+e]}continueScalar(e){let t=this.buffer[e];if(this.indentNext>0){let n=0;for(;t===` `;)t=this.buffer[++n+e];if(t===`\r`){let t=this.buffer[n+e+1];if(t===`
95
- `||!t&&!this.atEnd)return e+n+1}return t===`
96
- `||n>=this.indentNext||!t&&!this.atEnd?e+n:-1}if(t===`-`||t===`.`){let t=this.buffer.substr(e,3);if((t===`---`||t===`...`)&&Z(this.buffer[e+3]))return-1}return e}getLine(){let e=this.lineEndPos;return(typeof e!=`number`||e!==-1&&e<this.pos)&&(e=this.buffer.indexOf(`
97
- `,this.pos),this.lineEndPos=e),e===-1?this.atEnd?this.buffer.substring(this.pos):null:(this.buffer[e-1]===`\r`&&--e,this.buffer.substring(this.pos,e))}hasChars(e){return this.pos+e<=this.buffer.length}setNext(e){return this.buffer=this.buffer.substring(this.pos),this.pos=0,this.lineEndPos=null,this.next=e,null}peek(e){return this.buffer.substr(this.pos,e)}*parseNext(e){switch(e){case`stream`:return yield*this.parseStream();case`line-start`:return yield*this.parseLineStart();case`block-start`:return yield*this.parseBlockStart();case`doc`:return yield*this.parseDocument();case`flow`:return yield*this.parseFlowCollection();case`quoted-scalar`:return yield*this.parseQuotedScalar();case`block-scalar`:return yield*this.parseBlockScalar();case`plain-scalar`:return yield*this.parsePlainScalar()}}*parseStream(){let e=this.getLine();if(e===null)return this.setNext(`stream`);if(e[0]===``&&(yield*this.pushCount(1),e=e.substring(1)),e[0]===`%`){let t=e.length,n=e.indexOf(`#`);for(;n!==-1;){let r=e[n-1];if(r===` `||r===` `){t=n-1;break}n=e.indexOf(`#`,n+1)}for(;;){let n=e[t-1];if(n===` `||n===` `)--t;else break}let r=(yield*this.pushCount(t))+(yield*this.pushSpaces(!0));return yield*this.pushCount(e.length-r),this.pushNewline(),`stream`}if(this.atLineEnd()){let t=yield*this.pushSpaces(!0);return yield*this.pushCount(e.length-t),yield*this.pushNewline(),`stream`}return yield``,yield*this.parseLineStart()}*parseLineStart(){let e=this.charAt(0);if(!e&&!this.atEnd)return this.setNext(`line-start`);if(e===`-`||e===`.`){if(!this.atEnd&&!this.hasChars(4))return this.setNext(`line-start`);let e=this.peek(3);if((e===`---`||e===`...`)&&Z(this.charAt(3)))return yield*this.pushCount(3),this.indentValue=0,this.indentNext=0,e===`---`?`doc`:`stream`}return this.indentValue=yield*this.pushSpaces(!1),this.indentNext>this.indentValue&&!Z(this.charAt(1))&&(this.indentNext=this.indentValue),yield*this.parseBlockStart()}*parseBlockStart(){let[e,t]=this.peek(2);if(!t&&!this.atEnd)return this.setNext(`block-start`);if((e===`-`||e===`?`||e===`:`)&&Z(t)){let e=(yield*this.pushCount(1))+(yield*this.pushSpaces(!0));return this.indentNext=this.indentValue+1,this.indentValue+=e,`block-start`}return`doc`}*parseDocument(){yield*this.pushSpaces(!0);let e=this.getLine();if(e===null)return this.setNext(`doc`);let t=yield*this.pushIndicators();switch(e[t]){case`#`:yield*this.pushCount(e.length-t);case void 0:return yield*this.pushNewline(),yield*this.parseLineStart();case`{`:case`[`:return yield*this.pushCount(1),this.flowKey=!1,this.flowLevel=1,`flow`;case`}`:case`]`:return yield*this.pushCount(1),`doc`;case`*`:return yield*this.pushUntil(pr),`doc`;case`"`:case`'`:return yield*this.parseQuotedScalar();case`|`:case`>`:return t+=yield*this.parseBlockScalarHeader(),t+=yield*this.pushSpaces(!0),yield*this.pushCount(e.length-t),yield*this.pushNewline(),yield*this.parseBlockScalar();default:return yield*this.parsePlainScalar()}}*parseFlowCollection(){let e,t,n=-1;do e=yield*this.pushNewline(),e>0?(t=yield*this.pushSpaces(!1),this.indentValue=n=t):t=0,t+=yield*this.pushSpaces(!0);while(e+t>0);let r=this.getLine();if(r===null)return this.setNext(`flow`);if((n!==-1&&n<this.indentNext&&r[0]!==`#`||n===0&&(r.startsWith(`---`)||r.startsWith(`...`))&&Z(r[3]))&&(n!==this.indentNext-1||this.flowLevel!==1||r[0]!==`]`&&r[0]!==`}`))return this.flowLevel=0,yield``,yield*this.parseLineStart();let i=0;for(;r[i]===`,`;)i+=yield*this.pushCount(1),i+=yield*this.pushSpaces(!0),this.flowKey=!1;switch(i+=yield*this.pushIndicators(),r[i]){case void 0:return`flow`;case`#`:return yield*this.pushCount(r.length-i),`flow`;case`{`:case`[`:return yield*this.pushCount(1),this.flowKey=!1,this.flowLevel+=1,`flow`;case`}`:case`]`:return yield*this.pushCount(1),this.flowKey=!0,--this.flowLevel,this.flowLevel?`flow`:`doc`;case`*`:return yield*this.pushUntil(pr),`flow`;case`"`:case`'`:return this.flowKey=!0,yield*this.parseQuotedScalar();case`:`:{let e=this.charAt(1);if(this.flowKey||Z(e)||e===`,`)return this.flowKey=!1,yield*this.pushCount(1),yield*this.pushSpaces(!0),`flow`}default:return this.flowKey=!1,yield*this.parsePlainScalar()}}*parseQuotedScalar(){let e=this.charAt(0),t=this.buffer.indexOf(e,this.pos+1);if(e===`'`)for(;t!==-1&&this.buffer[t+1]===`'`;)t=this.buffer.indexOf(`'`,t+2);else for(;t!==-1;){let e=0;for(;this.buffer[t-1-e]===`\\`;)e+=1;if(e%2==0)break;t=this.buffer.indexOf(`"`,t+1)}let n=this.buffer.substring(0,t),r=n.indexOf(`
98
- `,this.pos);if(r!==-1){for(;r!==-1;){let e=this.continueScalar(r+1);if(e===-1)break;r=n.indexOf(`
99
- `,e)}r!==-1&&(t=r-(n[r-1]===`\r`?2:1))}if(t===-1){if(!this.atEnd)return this.setNext(`quoted-scalar`);t=this.buffer.length}return yield*this.pushToIndex(t+1,!1),this.flowLevel?`flow`:`doc`}*parseBlockScalarHeader(){this.blockScalarIndent=-1,this.blockScalarKeep=!1;let e=this.pos;for(;;){let t=this.buffer[++e];if(t===`+`)this.blockScalarKeep=!0;else if(t>`0`&&t<=`9`)this.blockScalarIndent=Number(t)-1;else if(t!==`-`)break}return yield*this.pushUntil(e=>Z(e)||e===`#`)}*parseBlockScalar(){let e=this.pos-1,t=0,n;loop:for(let r=this.pos;n=this.buffer[r];++r)switch(n){case` `:t+=1;break;case`
100
- `:e=r,t=0;break;case`\r`:{let e=this.buffer[r+1];if(!e&&!this.atEnd)return this.setNext(`block-scalar`);if(e===`
101
- `)break}default:break loop}if(!n&&!this.atEnd)return this.setNext(`block-scalar`);if(t>=this.indentNext){this.indentNext=this.blockScalarIndent===-1?t:this.blockScalarIndent+(this.indentNext===0?1:this.indentNext);do{let t=this.continueScalar(e+1);if(t===-1)break;e=this.buffer.indexOf(`
102
- `,t)}while(e!==-1);if(e===-1){if(!this.atEnd)return this.setNext(`block-scalar`);e=this.buffer.length}}let r=e+1;for(n=this.buffer[r];n===` `;)n=this.buffer[++r];if(n===` `){for(;n===` `||n===` `||n===`\r`||n===`
103
- `;)n=this.buffer[++r];e=r-1}else if(!this.blockScalarKeep)do{let n=e-1,r=this.buffer[n];r===`\r`&&(r=this.buffer[--n]);let i=n;for(;r===` `;)r=this.buffer[--n];if(r===`
104
- `&&n>=this.pos&&n+1+t>i)e=n;else break}while(1);return yield``,yield*this.pushToIndex(e+1,!0),yield*this.parseLineStart()}*parsePlainScalar(){let e=this.flowLevel>0,t=this.pos-1,n=this.pos-1,r;for(;r=this.buffer[++n];)if(r===`:`){let r=this.buffer[n+1];if(Z(r)||e&&dr.has(r))break;t=n}else if(Z(r)){let i=this.buffer[n+1];if(r===`\r`&&(i===`
105
- `?(n+=1,r=`
106
- `,i=this.buffer[n+1]):t=n),i===`#`||e&&dr.has(i))break;if(r===`
107
- `){let e=this.continueScalar(n+1);if(e===-1)break;n=Math.max(n,e-2)}}else{if(e&&dr.has(r))break;t=n}return!r&&!this.atEnd?this.setNext(`plain-scalar`):(yield``,yield*this.pushToIndex(t+1,!0),e?`flow`:`doc`)}*pushCount(e){return e>0?(yield this.buffer.substr(this.pos,e),this.pos+=e,e):0}*pushToIndex(e,t){let n=this.buffer.slice(this.pos,e);return n?(yield n,this.pos+=n.length,n.length):(t&&(yield``),0)}*pushIndicators(){let e=0;loop:for(;;){switch(this.charAt(0)){case`!`:e+=yield*this.pushTag(),e+=yield*this.pushSpaces(!0);continue loop;case`&`:e+=yield*this.pushUntil(pr),e+=yield*this.pushSpaces(!0);continue loop;case`-`:case`?`:case`:`:{let t=this.flowLevel>0,n=this.charAt(1);if(Z(n)||t&&dr.has(n)){t?this.flowKey&&=!1:this.indentNext=this.indentValue+1,e+=yield*this.pushCount(1),e+=yield*this.pushSpaces(!0);continue loop}}}break loop}return e}*pushTag(){if(this.charAt(1)===`<`){let e=this.pos+2,t=this.buffer[e];for(;!Z(t)&&t!==`>`;)t=this.buffer[++e];return yield*this.pushToIndex(t===`>`?e+1:e,!1)}{let e=this.pos+1,t=this.buffer[e];for(;t;)if(ur.has(t))t=this.buffer[++e];else if(t===`%`&&lr.has(this.buffer[e+1])&&lr.has(this.buffer[e+2]))t=this.buffer[e+=3];else break;return yield*this.pushToIndex(e,!1)}}*pushNewline(){let e=this.buffer[this.pos];return e===`
108
- `?yield*this.pushCount(1):e===`\r`&&this.charAt(1)===`
109
- `?yield*this.pushCount(2):0}*pushSpaces(e){let t=this.pos-1,n;do n=this.buffer[++t];while(n===` `||e&&n===` `);let r=t-this.pos;return r>0&&(yield this.buffer.substr(this.pos,r),this.pos=t),r}*pushUntil(e){let t=this.pos,n=this.buffer[t];for(;!e(n);)n=this.buffer[++t];return yield*this.pushToIndex(t,!1)}},hr=class{constructor(){this.lineStarts=[],this.addNewLine=e=>this.lineStarts.push(e),this.linePos=e=>{let t=0,n=this.lineStarts.length;for(;t<n;){let r=t+n>>1;this.lineStarts[r]<e?t=r+1:n=r}if(this.lineStarts[t]===e)return{line:t+1,col:1};if(t===0)return{line:0,col:e};let r=this.lineStarts[t-1];return{line:t,col:e-r+1}}}};function Q(e,t){for(let n=0;n<e.length;++n)if(e[n].type===t)return!0;return!1}function gr(e){for(let t=0;t<e.length;++t)switch(e[t].type){case`space`:case`comment`:case`newline`:break;default:return t}return-1}function _r(e){switch(e?.type){case`alias`:case`scalar`:case`single-quoted-scalar`:case`double-quoted-scalar`:case`flow-collection`:return!0;default:return!1}}function vr(e){switch(e.type){case`document`:return e.start;case`block-map`:{let t=e.items[e.items.length-1];return t.sep??t.start}case`block-seq`:return e.items[e.items.length-1].start;default:return[]}}function $(e){if(e.length===0)return[];let t=e.length;loop:for(;--t>=0;)switch(e[t].type){case`doc-start`:case`explicit-key-ind`:case`map-value-ind`:case`seq-item-ind`:case`newline`:break loop}for(;e[++t]?.type===`space`;);return e.splice(t,e.length)}function yr(e,t){if(t.length<1e5)Array.prototype.push.apply(e,t);else for(let n=0;n<t.length;++n)e.push(t[n])}function br(e){if(e.start.type===`flow-seq-start`)for(let t of e.items)t.sep&&!t.value&&!Q(t.start,`explicit-key-ind`)&&!Q(t.sep,`map-value-ind`)&&(t.key&&(t.value=t.key),delete t.key,_r(t.value)?t.value.end?yr(t.value.end,t.sep):t.value.end=t.sep:yr(t.start,t.sep),delete t.sep)}var xr=class{constructor(e){this.atNewLine=!0,this.atScalar=!1,this.indent=0,this.offset=0,this.onKeyLine=!1,this.stack=[],this.source=``,this.type=``,this.lexer=new mr,this.onNewLine=e}*parse(e,t=!1){this.onNewLine&&this.offset===0&&this.onNewLine(0);for(let n of this.lexer.lex(e,t))yield*this.next(n);t||(yield*this.end())}*next(e){if(this.source=e,this.atScalar){this.atScalar=!1,yield*this.step(),this.offset+=e.length;return}let t=cr(e);if(!t){let t=`Not a YAML token: ${e}`;yield*this.pop({type:`error`,offset:this.offset,message:t,source:e}),this.offset+=e.length}else if(t===`scalar`)this.atNewLine=!1,this.atScalar=!0,this.type=`scalar`;else{switch(this.type=t,yield*this.step(),t){case`newline`:this.atNewLine=!0,this.indent=0,this.onNewLine&&this.onNewLine(this.offset+e.length);break;case`space`:this.atNewLine&&e[0]===` `&&(this.indent+=e.length);break;case`explicit-key-ind`:case`map-value-ind`:case`seq-item-ind`:this.atNewLine&&(this.indent+=e.length);break;case`doc-mode`:case`flow-error-end`:return;default:this.atNewLine=!1}this.offset+=e.length}}*end(){for(;this.stack.length>0;)yield*this.pop()}get sourceToken(){return{type:this.type,offset:this.offset,indent:this.indent,source:this.source}}*step(){let e=this.peek(1);if(this.type===`doc-end`&&e?.type!==`doc-end`){for(;this.stack.length>0;)yield*this.pop();this.stack.push({type:`doc-end`,offset:this.offset,source:this.source});return}if(!e)return yield*this.stream();switch(e.type){case`document`:return yield*this.document(e);case`alias`:case`scalar`:case`single-quoted-scalar`:case`double-quoted-scalar`:return yield*this.scalar(e);case`block-scalar`:return yield*this.blockScalar(e);case`block-map`:return yield*this.blockMap(e);case`block-seq`:return yield*this.blockSequence(e);case`flow-collection`:return yield*this.flowCollection(e);case`doc-end`:return yield*this.documentEnd(e)}yield*this.pop()}peek(e){return this.stack[this.stack.length-e]}*pop(e){let t=e??this.stack.pop();if(!t)yield{type:`error`,offset:this.offset,source:``,message:`Tried to pop an empty stack`};else if(this.stack.length===0)yield t;else{let e=this.peek(1);switch(t.type===`block-scalar`?t.indent=`indent`in e?e.indent:0:t.type===`flow-collection`&&e.type===`document`&&(t.indent=0),t.type===`flow-collection`&&br(t),e.type){case`document`:e.value=t;break;case`block-scalar`:e.props.push(t);break;case`block-map`:{let n=e.items[e.items.length-1];if(n.value){e.items.push({start:[],key:t,sep:[]}),this.onKeyLine=!0;return}if(n.sep)n.value=t;else{Object.assign(n,{key:t,sep:[]}),this.onKeyLine=!n.explicitKey;return}break}case`block-seq`:{let n=e.items[e.items.length-1];n.value?e.items.push({start:[],value:t}):n.value=t;break}case`flow-collection`:{let n=e.items[e.items.length-1];!n||n.value?e.items.push({start:[],key:t,sep:[]}):n.sep?n.value=t:Object.assign(n,{key:t,sep:[]});return}default:yield*this.pop(),yield*this.pop(t)}if((e.type===`document`||e.type===`block-map`||e.type===`block-seq`)&&(t.type===`block-map`||t.type===`block-seq`)){let n=t.items[t.items.length-1];n&&!n.sep&&!n.value&&n.start.length>0&&gr(n.start)===-1&&(t.indent===0||n.start.every(e=>e.type!==`comment`||e.indent<t.indent))&&(e.type===`document`?e.end=n.start:e.items.push({start:n.start}),t.items.splice(-1,1))}}}*stream(){switch(this.type){case`directive-line`:yield{type:`directive`,offset:this.offset,source:this.source};return;case`byte-order-mark`:case`space`:case`comment`:case`newline`:yield this.sourceToken;return;case`doc-mode`:case`doc-start`:{let e={type:`document`,offset:this.offset,start:[]};this.type===`doc-start`&&e.start.push(this.sourceToken),this.stack.push(e);return}}yield{type:`error`,offset:this.offset,message:`Unexpected ${this.type} token in YAML stream`,source:this.source}}*document(e){if(e.value)return yield*this.lineEnd(e);switch(this.type){case`doc-start`:gr(e.start)===-1?e.start.push(this.sourceToken):(yield*this.pop(),yield*this.step());return;case`anchor`:case`tag`:case`space`:case`comment`:case`newline`:e.start.push(this.sourceToken);return}let t=this.startBlockValue(e);t?this.stack.push(t):yield{type:`error`,offset:this.offset,message:`Unexpected ${this.type} token in YAML document`,source:this.source}}*scalar(e){if(this.type===`map-value-ind`){let t=$(vr(this.peek(2))),n;e.end?(n=e.end,n.push(this.sourceToken),delete e.end):n=[this.sourceToken];let r={type:`block-map`,offset:e.offset,indent:e.indent,items:[{start:t,key:e,sep:n}]};this.onKeyLine=!0,this.stack[this.stack.length-1]=r}else yield*this.lineEnd(e)}*blockScalar(e){switch(this.type){case`space`:case`comment`:case`newline`:e.props.push(this.sourceToken);return;case`scalar`:if(e.source=this.source,this.atNewLine=!0,this.indent=0,this.onNewLine){let e=this.source.indexOf(`
110
- `)+1;for(;e!==0;)this.onNewLine(this.offset+e),e=this.source.indexOf(`
111
- `,e)+1}yield*this.pop();break;default:yield*this.pop(),yield*this.step()}}*blockMap(e){let t=e.items[e.items.length-1];switch(this.type){case`newline`:if(this.onKeyLine=!1,t.value){let n=`end`in t.value?t.value.end:void 0;(Array.isArray(n)?n[n.length-1]:void 0)?.type===`comment`?n?.push(this.sourceToken):e.items.push({start:[this.sourceToken]})}else t.sep?t.sep.push(this.sourceToken):t.start.push(this.sourceToken);return;case`space`:case`comment`:if(t.value)e.items.push({start:[this.sourceToken]});else if(t.sep)t.sep.push(this.sourceToken);else{if(this.atIndentedComment(t.start,e.indent)){let n=e.items[e.items.length-2]?.value?.end;if(Array.isArray(n)){yr(n,t.start),n.push(this.sourceToken),e.items.pop();return}}t.start.push(this.sourceToken)}return}if(this.indent>=e.indent){let n=!this.onKeyLine&&this.indent===e.indent,r=n&&(t.sep||t.explicitKey)&&this.type!==`seq-item-ind`,i=[];if(r&&t.sep&&!t.value){let n=[];for(let r=0;r<t.sep.length;++r){let i=t.sep[r];switch(i.type){case`newline`:n.push(r);break;case`space`:break;case`comment`:i.indent>e.indent&&(n.length=0);break;default:n.length=0}}n.length>=2&&(i=t.sep.splice(n[1]))}switch(this.type){case`anchor`:case`tag`:r||t.value?(i.push(this.sourceToken),e.items.push({start:i}),this.onKeyLine=!0):t.sep?t.sep.push(this.sourceToken):t.start.push(this.sourceToken);return;case`explicit-key-ind`:!t.sep&&!t.explicitKey?(t.start.push(this.sourceToken),t.explicitKey=!0):r||t.value?(i.push(this.sourceToken),e.items.push({start:i,explicitKey:!0})):this.stack.push({type:`block-map`,offset:this.offset,indent:this.indent,items:[{start:[this.sourceToken],explicitKey:!0}]}),this.onKeyLine=!0;return;case`map-value-ind`:if(t.explicitKey){if(!t.sep){if(Q(t.start,`newline`))Object.assign(t,{key:null,sep:[this.sourceToken]});else{let e=$(t.start);this.stack.push({type:`block-map`,offset:this.offset,indent:this.indent,items:[{start:e,key:null,sep:[this.sourceToken]}]})}}else if(t.value)e.items.push({start:[],key:null,sep:[this.sourceToken]});else if(Q(t.sep,`map-value-ind`))this.stack.push({type:`block-map`,offset:this.offset,indent:this.indent,items:[{start:i,key:null,sep:[this.sourceToken]}]});else if(_r(t.key)&&!Q(t.sep,`newline`)){let e=$(t.start),n=t.key,r=t.sep;r.push(this.sourceToken),delete t.key,delete t.sep,this.stack.push({type:`block-map`,offset:this.offset,indent:this.indent,items:[{start:e,key:n,sep:r}]})}else i.length>0?t.sep=t.sep.concat(i,this.sourceToken):t.sep.push(this.sourceToken)}else t.sep?t.value||r?e.items.push({start:i,key:null,sep:[this.sourceToken]}):Q(t.sep,`map-value-ind`)?this.stack.push({type:`block-map`,offset:this.offset,indent:this.indent,items:[{start:[],key:null,sep:[this.sourceToken]}]}):t.sep.push(this.sourceToken):Object.assign(t,{key:null,sep:[this.sourceToken]});this.onKeyLine=!0;return;case`alias`:case`scalar`:case`single-quoted-scalar`:case`double-quoted-scalar`:{let n=this.flowScalar(this.type);r||t.value?(e.items.push({start:i,key:n,sep:[]}),this.onKeyLine=!0):t.sep?this.stack.push(n):(Object.assign(t,{key:n,sep:[]}),this.onKeyLine=!0);return}default:{let r=this.startBlockValue(e);if(r){if(r.type===`block-seq`){if(!t.explicitKey&&t.sep&&!Q(t.sep,`newline`)){yield*this.pop({type:`error`,offset:this.offset,message:`Unexpected block-seq-ind on same line with key`,source:this.source});return}}else n&&e.items.push({start:i});this.stack.push(r);return}}}}yield*this.pop(),yield*this.step()}*blockSequence(e){let t=e.items[e.items.length-1];switch(this.type){case`newline`:if(t.value){let n=`end`in t.value?t.value.end:void 0;(Array.isArray(n)?n[n.length-1]:void 0)?.type===`comment`?n?.push(this.sourceToken):e.items.push({start:[this.sourceToken]})}else t.start.push(this.sourceToken);return;case`space`:case`comment`:if(t.value)e.items.push({start:[this.sourceToken]});else{if(this.atIndentedComment(t.start,e.indent)){let n=e.items[e.items.length-2]?.value?.end;if(Array.isArray(n)){yr(n,t.start),n.push(this.sourceToken),e.items.pop();return}}t.start.push(this.sourceToken)}return;case`anchor`:case`tag`:if(t.value||this.indent<=e.indent)break;t.start.push(this.sourceToken);return;case`seq-item-ind`:if(this.indent!==e.indent)break;t.value||Q(t.start,`seq-item-ind`)?e.items.push({start:[this.sourceToken]}):t.start.push(this.sourceToken);return}if(this.indent>e.indent){let t=this.startBlockValue(e);if(t){this.stack.push(t);return}}yield*this.pop(),yield*this.step()}*flowCollection(e){let t=e.items[e.items.length-1];if(this.type===`flow-error-end`){let e;do yield*this.pop(),e=this.peek(1);while(e?.type===`flow-collection`)}else if(e.end.length===0){switch(this.type){case`comma`:case`explicit-key-ind`:!t||t.sep?e.items.push({start:[this.sourceToken]}):t.start.push(this.sourceToken);return;case`map-value-ind`:!t||t.value?e.items.push({start:[],key:null,sep:[this.sourceToken]}):t.sep?t.sep.push(this.sourceToken):Object.assign(t,{key:null,sep:[this.sourceToken]});return;case`space`:case`comment`:case`newline`:case`anchor`:case`tag`:!t||t.value?e.items.push({start:[this.sourceToken]}):t.sep?t.sep.push(this.sourceToken):t.start.push(this.sourceToken);return;case`alias`:case`scalar`:case`single-quoted-scalar`:case`double-quoted-scalar`:{let n=this.flowScalar(this.type);!t||t.value?e.items.push({start:[],key:n,sep:[]}):t.sep?this.stack.push(n):Object.assign(t,{key:n,sep:[]});return}case`flow-map-end`:case`flow-seq-end`:e.end.push(this.sourceToken);return}let n=this.startBlockValue(e);n?this.stack.push(n):(yield*this.pop(),yield*this.step())}else{let t=this.peek(2);if(t.type===`block-map`&&(this.type===`map-value-ind`&&t.indent===e.indent||this.type===`newline`&&!t.items[t.items.length-1].sep))yield*this.pop(),yield*this.step();else if(this.type===`map-value-ind`&&t.type!==`flow-collection`){let n=$(vr(t));br(e);let r=e.end.splice(1,e.end.length);r.push(this.sourceToken);let i={type:`block-map`,offset:e.offset,indent:e.indent,items:[{start:n,key:e,sep:r}]};this.onKeyLine=!0,this.stack[this.stack.length-1]=i}else yield*this.lineEnd(e)}}flowScalar(e){if(this.onNewLine){let e=this.source.indexOf(`
112
- `)+1;for(;e!==0;)this.onNewLine(this.offset+e),e=this.source.indexOf(`
113
- `,e)+1}return{type:e,offset:this.offset,indent:this.indent,source:this.source}}startBlockValue(e){switch(this.type){case`alias`:case`scalar`:case`single-quoted-scalar`:case`double-quoted-scalar`:return this.flowScalar(this.type);case`block-scalar-header`:return{type:`block-scalar`,offset:this.offset,indent:this.indent,props:[this.sourceToken],source:``};case`flow-map-start`:case`flow-seq-start`:return{type:`flow-collection`,offset:this.offset,indent:this.indent,start:this.sourceToken,items:[],end:[]};case`seq-item-ind`:return{type:`block-seq`,offset:this.offset,indent:this.indent,items:[{start:[this.sourceToken]}]};case`explicit-key-ind`:{this.onKeyLine=!0;let t=$(vr(e));return t.push(this.sourceToken),{type:`block-map`,offset:this.offset,indent:this.indent,items:[{start:t,explicitKey:!0}]}}case`map-value-ind`:{this.onKeyLine=!0;let t=$(vr(e));return{type:`block-map`,offset:this.offset,indent:this.indent,items:[{start:t,key:null,sep:[this.sourceToken]}]}}}return null}atIndentedComment(e,t){return this.type!==`comment`||this.indent<=t?!1:e.every(e=>e.type===`newline`||e.type===`space`)}*documentEnd(e){this.type!==`doc-mode`&&(e.end?e.end.push(this.sourceToken):e.end=[this.sourceToken],this.type===`newline`&&(yield*this.pop()))}*lineEnd(e){switch(this.type){case`comma`:case`doc-start`:case`doc-end`:case`flow-seq-end`:case`flow-map-end`:case`map-value-ind`:yield*this.pop(),yield*this.step();break;case`newline`:this.onKeyLine=!1;default:e.end?e.end.push(this.sourceToken):e.end=[this.sourceToken],this.type===`newline`&&(yield*this.pop())}}};function Sr(e){let t=e.prettyErrors!==!1;return{lineCounter:e.lineCounter||t&&new hr||null,prettyErrors:t}}function Cr(e,t={}){let{lineCounter:n,prettyErrors:r}=Sr(t),i=new xr(n?.addNewLine),a=new Wn(t),o=Array.from(a.compose(i.parse(e)));if(r&&n)for(let t of o)t.errors.forEach(cn(e,n)),t.warnings.forEach(cn(e,n));return o.length>0?o:Object.assign([],{empty:!0},a.streamInfo())}function wr(e,t={}){let{lineCounter:n,prettyErrors:r}=Sr(t),i=new xr(n?.addNewLine),a=new Wn(t),o=null;for(let t of a.compose(i.parse(e),!0,e.length))if(!o)o=t;else if(o.options.logLevel!==`silent`){o.errors.push(new Y(t.range.slice(0,2),`MULTIPLE_DOCS`,`Source contains multiple documents; please use YAML.parseAllDocuments()`));break}return r&&n&&(o.errors.forEach(cn(e,n)),o.warnings.forEach(cn(e,n))),o}function Tr(e,t,n){let r;typeof t==`function`?r=t:n===void 0&&t&&typeof t==`object`&&(n=t);let i=wr(e,n);if(!i)return null;if(i.warnings.forEach(e=>Ge(i.options.logLevel,e)),i.errors.length>0){if(i.options.logLevel!==`silent`)throw i.errors[0];i.errors=[]}return i.toJS(Object.assign({reviver:r},n))}function Er(e,t,n){let r=null;if(typeof t==`function`||Array.isArray(t)?r=t:n===void 0&&t&&(n=t),typeof n==`string`&&(n=n.length),typeof n==`number`){let e=Math.round(n);n=e<1?void 0:e>8?{indent:8}:{indent:e}}if(e===void 0){let{keepUndefined:e}=n??t??{};if(!e)return}return D(e)&&!r?e.toString(n):new rn(e,r,n).toString(n)}var Dr=h({Alias:()=>ye,CST:()=>ir,Composer:()=>Wn,Document:()=>rn,Lexer:()=>mr,LineCounter:()=>hr,Pair:()=>W,Parser:()=>xr,Scalar:()=>z,Schema:()=>tn,YAMLError:()=>on,YAMLMap:()=>K,YAMLParseError:()=>Y,YAMLSeq:()=>q,YAMLWarning:()=>sn,isAlias:()=>E,isCollection:()=>A,isDocument:()=>D,isMap:()=>re,isNode:()=>j,isPair:()=>O,isScalar:()=>k,isSeq:()=>ie,parse:()=>Tr,parseAllDocuments:()=>Cr,parseDocument:()=>wr,stringify:()=>Er,visit:()=>P,visitAsync:()=>se});const Or=/^---.*\r?\n([\s\S]*?)---/,kr=/^\s*```ya?ml([\s\S]*?)```/,Ar=/\$.*?\$/,jr=/\$\$/,Mr=/\{monaco.*\}/,Nr=/<Tweet\b/,Pr=/<BlueSky\b/,Fr=/^```mermaid/m,Ir=/^(#+) (.*)$/m,Lr=/^```[\s\S]+?^```/gm,Rr=/^\s*`+/,zr=/\r?\n/g;function Br(e,t){let n=0;for(;n<e.length;)if(t){let r=e.indexOf(`-->`,n);if(r<0)return!0;t=!1,n=r+3}else{let t=e.indexOf(`<!--`,n);if(t<0)return!1;let r=e.indexOf(`-->`,t+4);if(r<0)return!0;n=r+3}return t}function Vr(e,t){let n,r,i=e.replace(Or,(e,t)=>(n=`frontmatter`,r=t,``));n!==`frontmatter`&&(i=i.replace(kr,(e,t)=>(n=`yaml`,r=t,``)));let a=r&&!t.noParseYAML?Dr.parseDocument(r):void 0;return{type:n,raw:r,doc:a,data:a?.toJSON(),content:i}}const Hr=/\.(?:png|jpe?g|gif|svg|webp|avif|ico|bmp|tiff?)$/i,Ur=/\s+(?:"[^"]*"|'[^']*')\s*$/;function Wr(e){let t=e.trim().replace(Ur,``).trim();return t.startsWith(`<`)&&t.endsWith(`>`)?t.slice(1,-1).trim():t}function Gr(e,t){let n=new Set;for(let e of[`image`,`backgroundImage`,`background`]){let r=t[e];typeof r==`string`&&r&&!r.startsWith(`data:`)&&(e===`background`?(Hr.test(r)||r.startsWith(`/`)||r.startsWith(`http`))&&n.add(r):n.add(r))}let r=e.replace(Lr,``);for(let[,e]of r.matchAll(/!\[[^\]]*\]\(([^)]+)\)/g)){let t=Wr(e);t&&!t.startsWith(`data:`)&&n.add(t)}for(let[,e]of r.matchAll(/\b(?:src|image)=["']([^"']+)["']/g))e&&!e.startsWith(`data:`)&&!e.includes(`{{`)&&Hr.test(e)&&n.add(e.trim());for(let[,e]of r.matchAll(/:(?:src|image)=["']'([^']+)'["']/g))e&&!e.startsWith(`data:`)&&Hr.test(e)&&n.add(e.trim());for(let[,e]of r.matchAll(/url\(["']?([^"')]+)["']?\)/g))e&&!e.startsWith(`data:`)&&Hr.test(e)&&n.add(e.trim());return Array.from(n)}function Kr(e){return{katex:!!e.match(Ar)||!!e.match(jr),monaco:Mr.test(e)?Yr(e):!1,tweet:!!e.match(Nr),bluesky:!!e.match(Pr),mermaid:!!e.match(Fr)}}function qr(e,t={}){let n=Vr(e,t),r,i=n.data||{},a=n.content.trim(),o=Xr(e.trim()),s=Array.from(a.matchAll(/<!--([\s\S]*?)-->/g));if(s.length){let e=s[s.length-1];e.index!==void 0&&e.index+e[0].length>=a.length&&(r=e[1].trim(),a=a.slice(0,e.index).trim())}let c,l;if(i.title||i.name)c=i.title||i.name;else{let e=a.replace(Lr,``).match(Ir);c=e?.[2]?.trim(),l=e?.[1]?.length}i.level&&(l=i.level||1);let u=Gr(a,i);return{raw:e,title:c,level:l,revision:o,content:a,contentRaw:a,frontmatter:i,frontmatterStyle:n.type,frontmatterDoc:n.doc,frontmatterRaw:n.raw,note:r,images:u}}async function Jr(e,t,n,r={}){let i=e.split(r.preserveCR?`
114
- `:zr),a=[],o=0,s=0,c=!1;async function l(e){if(o===e)return;let c={...qr(i.slice(o,e).join(`
115
- `),r),filepath:t,index:a.length,start:o,contentStart:s,end:e};if(n)for(let e of n){if(e.transformSlide){let t=await e.transformSlide(c.content,c.frontmatter);t!==void 0&&(c.content=t),typeof c.frontmatter.title==`string`&&(c.title=c.frontmatter.title),typeof c.frontmatter.level==`number`&&(c.level=c.frontmatter.level)}if(e.transformNote){let t=await e.transformNote(c.note,c.frontmatter);t!==void 0&&(c.note=t)}}a.push(c),o=e+1,s=e+1}if(n)for(let e of n)e.transformRawLines&&await e.transformRawLines(i);for(let e=0;e<i.length;e++){let t=i[e],n=t.trimEnd();if(c){c=Br(t,!0);continue}if(n.startsWith(`---`)){await l(e);let t=i[e+1];if(n[3]!==`-`&&t?.trim()){for(o=e,e+=1;e<i.length&&i[e].trimEnd()!==`---`;e++);s=e+1}}else if(n.trimStart().startsWith("```")){let t=n.match(Rr)[0],r=e+1;for(;r<i.length&&!i[r].startsWith(t);r++);r!==i.length&&(e=r)}else c=Br(t,!1)}return o<=i.length-1&&await l(i.length),{filepath:t,raw:e,slides:a}}function Yr(e){let t=new Set,n=new Set;return e.replace(/^```(\w+)\s*\{monaco([^}]*)\}\s*(\S[\s\S]*?)^```/gm,(e,r=`ts`,i,a)=>{r=r.trim();let o=i===`-run`;if([`js`,`javascript`,`ts`,`typescript`].includes(r))for(let[,,e]of a.matchAll(/\s+from\s+(["'])([/.\w@-]+)\1/g))e&&(`./`.includes(e)||t.add(e),o&&n.add(e));return``}),{types:Array.from(t),deps:Array.from(n)}}function Xr(e){let t=0;for(let n=0;n<e.length;n++)t=(t<<5)-t+e.charCodeAt(n),t|=0;return t.toString(36).slice(0,12)}const Zr=/^[A-Za-z]:\//;function Qr(e=``){return e&&e.replace(/\\/g,`/`).replace(Zr,e=>e.toUpperCase())}const $r=/^[/\\](?![/\\])|^[/\\]{2}(?!\.)|^[A-Za-z]:[/\\]/,ei=/^[A-Za-z]:$/,ti=/^\/([A-Za-z]:)?$/;function ni(){return typeof process<`u`&&typeof process.cwd==`function`?process.cwd().replace(/\\/g,`/`):`/`}const ri=function(...e){e=e.map(e=>Qr(e));let t=``,n=!1;for(let r=e.length-1;r>=-1&&!n;r--){let i=r>=0?e[r]:ni();i&&i.length!==0&&(t=`${i}/${t}`,n=ai(i))}return t=ii(t,!n),n&&!ai(t)?`/${t}`:t.length>0?t:`.`};function ii(e,t){let n=``,r=0,i=-1,a=0,o=null;for(let s=0;s<=e.length;++s){if(s<e.length)o=e[s];else if(o===`/`)break;else o=`/`;if(o===`/`){if(i!==s-1&&a!==1){if(a===2){if(n.length<2||r!==2||n[n.length-1]!==`.`||n[n.length-2]!==`.`){if(n.length>2){let e=n.lastIndexOf(`/`);e===-1?(n=``,r=0):(n=n.slice(0,e),r=n.length-1-n.lastIndexOf(`/`)),i=s,a=0;continue}if(n.length>0){n=``,r=0,i=s,a=0;continue}}t&&(n+=n.length>0?`/..`:`..`,r=2)}else n.length>0?n+=`/${e.slice(i+1,s)}`:n=e.slice(i+1,s),r=s-i-1}i=s,a=0}else o===`.`&&a!==-1?++a:a=-1}return n}const ai=function(e){return $r.test(e)},oi=function(e,t){let n=ri(e).replace(ti,`$1`).split(`/`),r=ri(t).replace(ti,`$1`).split(`/`);if(r[0][1]===`:`&&n[0][1]===`:`&&n[0]!==r[0])return r.join(`/`);let i=[...n];for(let e of i){if(r[0]!==e)break;n.shift(),r.shift()}return[...n.map(()=>`..`),...r].join(`/`)},si=function(e){let t=Qr(e).replace(/\/$/,``).split(`/`).slice(0,-1);return t.length===1&&ei.test(t[0])&&(t[0]+=`/`),t.join(`/`)||(ai(e)?`/`:`.`)};function ci(e,t){return t.some(t=>{let n=oi(t,e);return n===``||!!n&&!n.startsWith(`..`)&&!ai(n)})}async function li(t,r,i={},a){let o=typeof i==`function`?i:async e=>i[e]??n(e,`utf-8`);await o(r);let s,c={},l={},u=[];async function d(e,t,n,r){let i=c[e];i||(i=await Jr(await o(e),e,s),c[e]=i,l[e]=new Set);let a=r?.at(-1);for(let o of x(i.slides.length,t)){let t=i.slides[o-1];if(!t){i.errors??=[],i.errors.push({row:0,message:`Slide ${o} does not exist in "${e}", which has ${i.slides.length} slides`});continue}try{await f(i,t,n,r)}catch(e){i.errors??=[],i.errors.push({row:t.start,message:`Error when loading slide: ${e}`});continue}a&&(a.imports??=[]).push(t)}return i}async function f(n,r,i,a){if(!(r.frontmatter.disabled||r.frontmatter.hide)){if(r.frontmatter.src){let[o,s]=r.frontmatter.src.split(`#`),c=b(o.startsWith(`/`)?ri(t.userRoot,o.substring(1)):ri(si(r.filepath),o));i={...r.frontmatter,...i},delete i.src;let l=new Set((a??[]).map(e=>e.filepath));if(c===r.filepath||l.has(c)){n.errors??=[],n.errors.push({row:r.start,message:`Circular import detected for "${r.frontmatter.src}" (${c})`});return}t.allowedRoots&&!ci(c,t.allowedRoots)?(n.errors??=[],n.errors.push({row:r.start,message:`Imported markdown escapes the project root: ${c}`})):e(c)?await d(c,s,i,a?[...a,r]:[r]):(n.errors??=[],n.errors.push({row:r.start,message:`Imported markdown file not found: ${c}`}))}else u.push({frontmatter:{...r.frontmatter,...i},content:r.content,revision:r.revision,frontmatterRaw:r.frontmatterRaw,note:r.note,title:r.title,level:r.level,index:u.length,importChain:a,source:r})}}let p=await d(b(r)),m={...p.slides[0]?.frontmatter};return u[0]?.title&&(m.title??=u[0].title),{slides:u,entry:p,headmatter:m,features:Kr(u.map(e=>e.source.raw).join(``)),markdownFiles:c,watchFiles:l}}var ui=m((e=>{Object.defineProperty(e,"__esModule",{value:!0}),e.ASTNodeTypes=void 0;var t;(function(e){e.Document=`Document`,e.DocumentExit=`Document:exit`,e.Paragraph=`Paragraph`,e.ParagraphExit=`Paragraph:exit`,e.BlockQuote=`BlockQuote`,e.BlockQuoteExit=`BlockQuote:exit`,e.ListItem=`ListItem`,e.ListItemExit=`ListItem:exit`,e.List=`List`,e.ListExit=`List:exit`,e.Header=`Header`,e.HeaderExit=`Header:exit`,e.CodeBlock=`CodeBlock`,e.CodeBlockExit=`CodeBlock:exit`,e.HtmlBlock=`HtmlBlock`,e.HtmlBlockExit=`HtmlBlock:exit`,e.HorizontalRule=`HorizontalRule`,e.HorizontalRuleExit=`HorizontalRule:exit`,e.Comment=`Comment`,e.CommentExit=`Comment:exit`,e.ReferenceDef=`ReferenceDef`,e.ReferenceDefExit=`ReferenceDef:exit`,e.Str=`Str`,e.StrExit=`Str:exit`,e.Break=`Break`,e.BreakExit=`Break:exit`,e.Emphasis=`Emphasis`,e.EmphasisExit=`Emphasis:exit`,e.Strong=`Strong`,e.StrongExit=`Strong:exit`,e.Html=`Html`,e.HtmlExit=`Html:exit`,e.Link=`Link`,e.LinkExit=`Link:exit`,e.LinkReference=`LinkReference`,e.LinkReferenceExit=`LinkReference:exit`,e.Image=`Image`,e.ImageExit=`Image:exit`,e.ImageReference=`ImageReference`,e.ImageReferenceExit=`ImageReference:exit`,e.Definition=`Definition`,e.DefinitionExit=`Definition:exit`,e.Code=`Code`,e.CodeExit=`Code:exit`,e.Delete=`Delete`,e.DeleteExit=`Delete:exit`,e.Table=`Table`,e.TableExit=`Table:exit`,e.TableRow=`TableRow`,e.TableRowExit=`TableRow:exit`,e.TableCell=`TableCell`,e.TableCellExit=`TableCell:exit`})(t||(e.ASTNodeTypes=t={}))})),di=m((e=>{Object.defineProperty(e,"__esModule",{value:!0}),e.ASTNodeTypes=void 0;var t=ui();Object.defineProperty(e,"ASTNodeTypes",{enumerable:!0,get:function(){return t.ASTNodeTypes}})})),fi=m((e=>{Object.defineProperty(e,"__esModule",{value:!0});var t=di();e.default=function(){function e(e){this._ruleContext=e}return e.prototype.getParents=function(e){for(var t=[],n=e.parent;n!=null;)t.push(n),n=n.parent;return t},e.prototype.isChildNode=function(e,t){var n=this.getParents(e).map(function(e){return e.type});return t.some(function(e){return n.some(function(t){return t===e})})},e.prototype.isPlainStrNode=function(e){return e.type!==t.ASTNodeTypes.Str||e.parent?.type!==t.ASTNodeTypes.Paragraph?!1:!this.isChildNode(e,[t.ASTNodeTypes.BlockQuote])},e}()})),pi=m(((e,t)=>{t.exports=n;function n(e){if(e==null)return o;if(typeof e==`string`)return a(e);if(typeof e==`object`)return`length`in e?i(e):r(e);if(typeof e==`function`)return e;throw Error(`Expected function, string, or object as test`)}function r(e){return t;function t(t){for(var n in e)if(t[n]!==e[n])return!1;return!0}}function i(e){for(var t=[],r=-1;++r<e.length;)t[r]=n(e[r]);return i;function i(){for(var e=-1;++e<t.length;)if(t[e].apply(this,arguments))return!0;return!1}}function a(e){return t;function t(t){return!!(t&&t.type===e)}}function o(){return!0}})),mi=m(((e,t)=>{t.exports=n;function n(e){return e}})),hi=m(((e,t)=>{t.exports=s;var n=pi(),r=mi(),i=!0,a=`skip`,o=!1;s.CONTINUE=i,s.SKIP=a,s.EXIT=o;function s(e,t,i,s){var l,u;typeof t==`function`&&typeof i!=`function`&&(s=i,i=t,t=null),u=n(t),l=s?-1:1,d(e,null,[])();function d(e,n,f){var p=typeof e==`object`&&e?e:{},m;return typeof p.type==`string`&&(m=typeof p.tagName==`string`?p.tagName:typeof p.name==`string`?p.name:void 0,h.displayName=`node (`+r(p.type+(m?`<`+m+`>`:``))+`)`),h;function h(){var r=f.concat(e),p=[],m,h;if((!t||u(e,n,f[f.length-1]||null))&&(p=c(i(e,f)),p[0]===o))return p;if(e.children&&p[0]!==a)for(h=(s?e.children.length:-1)+l;h>-1&&h<e.children.length;){if(m=d(e.children[h],h,r)(),m[0]===o)return m;h=typeof m[1]==`number`?m[1]:h+l}return p}}}function c(e){return typeof e==`object`&&e&&`length`in e?e:typeof e==`number`?[i,e]:[e]}})),gi=m(((e,t)=>{t.exports=o;var n=hi(),r=n.CONTINUE,i=n.SKIP,a=n.EXIT;o.CONTINUE=r,o.SKIP=i,o.EXIT=a;function o(e,t,r,i){typeof t==`function`&&typeof r!=`function`&&(i=r,r=t,t=null),n(e,t,a,i);function a(e,t){var n=t[t.length-1],i=n?n.children.indexOf(e):null;return r(e,i,n)}}})),_i=m((e=>{var t=e&&e.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(e,"__esModule",{value:!0});var n=t(gi());e.default=function(){function e(){this._ignoredRangeList=[]}return Object.defineProperty(e.prototype,"ignoredRanges",{get:function(){return this._ignoredRangeList},enumerable:!1,configurable:!0}),e.prototype.isIgnoredIndex=function(e){return this._ignoredRangeList.some(function(t){var n=t[0],r=t[1];return n<=e&&e<r})},e.prototype.isIgnoredRange=function(e){return this.isIgnoredIndex(e[0])||this.isIgnoredIndex(e[1])},e.prototype.isIgnored=function(e){return this.isIgnoredRange(e.range)},e.prototype.ignore=function(e){this.ignoreRange(e.range)},e.prototype.ignoreRange=function(e){this._ignoredRangeList.push(e)},e.prototype.ignoreChildrenByTypes=function(e,t){var r=this;(0,n.default)(e,function(e){t.includes(e.type)&&r.ignore(e)})},e}()})),vi=m((e=>{Object.defineProperty(e,"__esModule",{value:!0}),e.binarySearch=e.upperBound=e.lowerBound=e.compare=void 0;function t(e,t){return e<t}e.compare=t;function n(e,n,r=t){let i=e.length,a=0;for(;i;){let t=i>>>1,o=a+t;r(n,e[o])?i=t:(a=o+1,i-=t+1)}return a}e.upperBound=n;function r(e,n,r=t){let i=e.length,a=0;for(;i;){let t=i>>>1,o=a+t;r(e[o],n)?(a=o+1,i-=t+1):i=t}return a}e.lowerBound=r;function i(e,n,i=t){let a=r(e,n,i);return a!==e.length&&!i(n,e[a])}e.binarySearch=i})),yi=m((e=>{Object.defineProperty(e,"__esModule",{value:!0}),e.StructuredSource=void 0;let t=vi();e.StructuredSource=class{constructor(e){this.indice=[0];let t=/[\r\n\u2028\u2029]/g,n=e.length;for(t.lastIndex=0;;){let r=t.exec(e);if(!r)break;let i=r.index;e.charCodeAt(i)===13&&e.charCodeAt(i+1)===10&&(i+=1);let a=i+1;if(n<a)break;this.indice.push(a),t.lastIndex=a}}get line(){return this.indice.length}locationToRange(e){return[this.positionToIndex(e.start),this.positionToIndex(e.end)]}rangeToLocation(e){return{start:this.indexToPosition(e[0]),end:this.indexToPosition(e[1])}}positionToIndex(e){return this.indice[e.line-1]+e.column}indexToPosition(e){let n=(0,t.upperBound)(this.indice,e);return{line:n,column:e-this.indice[n-1]}}}})),bi=m((e=>{Object.defineProperty(e,"__esModule",{value:!0}),e.SourceLocation=void 0;var t=yi();e.SourceLocation=function(){function e(e){this.source=new t.StructuredSource(e)}return e.prototype.toAbsoluteLocation=function(e,t){var n=e.range,r=e.loc.start.line,i=e.loc.start.column;if(t.index!==void 0){var a=t.index;return n[0]+a}if(t.line!==void 0&&t.column!==void 0){var o=r+t.line;return t.column>0?this.source.positionToIndex({line:o,column:t.column}):this.source.positionToIndex({line:o,column:i})}if(t.line!==void 0&&t.line>0){var o=r+t.line;return this.source.positionToIndex({line:o,column:i})}return n[0]},e}()})),xi=m((e=>{var t=e&&e.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(e,"__esModule",{value:!0}),e.wrapReportHandler=a;var n=t(fi()),r=t(_i()),i=bi();function a(e,t,a){var o=t.ignoreNodeTypes||[],s=new r.default,c=new n.default(e),l=e.getSource(),u=new i.SourceLocation(l),d=a(function(t,n){var r=u.toAbsoluteLocation(t,n);if(!s.isIgnoredIndex(r))return e.report(t,n)});return Object.keys(d).forEach(function(e){var t=d[e];d[e]=function(e){if(s.ignoreChildrenByTypes(e,o),!c.isChildNode(e,o)&&t)return t(e)}}),d}})),Si=m((e=>{var t=e&&e.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(e,"__esModule",{value:!0}),e.wrapReportHandler=e.RuleHelper=e.IgnoreNodeManager=void 0,e.RuleHelper=t(fi()).default,e.IgnoreNodeManager=t(_i()).default;var n=xi();Object.defineProperty(e,"wrapReportHandler",{enumerable:!0,get:function(){return n.wrapReportHandler}})})),Ci=_(m((e=>{Object.defineProperty(e,"__esModule",{value:!0}),e.report=e.default=void 0;var t=Si(),n=/([\uff61-\uff9f]+)/g,r=function(e){var{Syntax:r,RuleError:i,fixer:a,report:o,locator:s,getSource:c}=e,l=new t.RuleHelper(e);return{[r.Str](e){if(l.isPlainStrNode(e))for(var t of c(e).matchAll(n)){var r=t[0],u=t.index??0,d=[u,u+r.length];o(e,new i(`Disallow to use 半角カタカナ: "${r}"`,{padding:s.range(d),fix:a.replaceTextRange(d,r.normalize(`NFKC`))}))}}}};e.report=r,e.default={linter:r,fixer:r}}))(),1);const wi=[{ruleId:`no-invalid-control-character`,rule:i(o)},{ruleId:`no-hankaku-kana`,rule:i(Ci.default)},{ruleId:`no-zero-width-spaces`,rule:i(s)}];async function Ti(e,n){console.info(`Textlint: ${e}`);let i=t.dirname(e),o;try{o=await li({roots:[i],userRoot:i,allowedRoots:[n,i]},e)}catch(t){return console.error(`${e}: ${t instanceof Error?t.message:String(t)}`),1}let s=new r,c=0;for(let e of Object.values(o.markdownFiles)){let t=(e.errors??[]).map(t=>`${e.filepath}:${t.row+1}:1: ${t.message}`);for(let e of new Set(t))console.error(e),c=1}let l=new Set;for(let{source:e}of o.slides){let t=`${e.filepath}:${e.index}`;if(l.has(t))continue;l.add(t);let n=e.contentStart>e.end?e.start:e.contentStart,r=e.raw.split(`
116
- `).slice(n-e.start).join(`
117
- `),i=await s.lintText(r,{filePath:e.filepath,ext:`.md`,plugins:[{pluginId:`markdown`,plugin:{Processor:a}}],rules:wi});for(let t of i.messages)console.error(`${e.filepath}:${n+t.line}:${t.column}: ${t.message} (${t.ruleId})`),c=1}return c}export{Ti as lintSlidevText};
118
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpZGV2VGV4dGxpbnQtQjdPQlkxQmwuanMiLCJuYW1lcyI6WyJTQ0FMQVIiLCJpc1NjYWxhciIsImlzQ29sbGVjdGlvbiIsIkJSRUFLIiwiU0tJUCIsIlJFTU9WRSIsInZpc2l0IiwiaXNDb2xsZWN0aW9uIiwiaXNTY2FsYXIiLCJpc1NjYWxhciIsImlzQ29sbGVjdGlvbiIsImlzQ29sbGVjdGlvbiIsIlNDQUxBUiIsImlzQ29sbGVjdGlvbiIsImlzU2NhbGFyIiwiaXNTY2FsYXIiLCJpc0NvbGxlY3Rpb24iLCJzdHJpbmdpZnkiLCJpc0NvbGxlY3Rpb24iLCJpc1NjYWxhciIsInN0cmluZ2lmeSIsImlzU2NhbGFyIiwic3RyaW5naWZ5IiwiaXNTY2FsYXIiLCJpc1NjYWxhciIsImZsb2F0TmFOIiwiZmxvYXRFeHAiLCJmbG9hdCIsImludElkZW50aWZ5IiwiaW50UmVzb2x2ZSIsImludFN0cmluZ2lmeSIsImludE9jdCIsImludCIsImludEhleCIsInNjaGVtYSIsImludE9jdCIsImludCIsImludEhleCIsImZsb2F0TmFOIiwiZmxvYXRFeHAiLCJmbG9hdCIsImludElkZW50aWZ5Iiwic2NoZW1hIiwiaXNTY2FsYXIiLCJpc1NjYWxhciIsInNjaGVtYSIsInNjaGVtYSQyIiwiU0NBTEFSIiwic3RyaW5naWZ5IiwiaXNDb2xsZWN0aW9uIiwiaXNTY2FsYXIiLCJpc1NjYWxhciIsIlNDQUxBUiIsImlzU2NhbGFyIiwiaXNTY2FsYXIiLCJpc0NvbGxlY3Rpb24iLCJzdHJpbmdpZnkiLCJwYXJzZSIsIllBTUwiLCJSRV9DUkxGIiwiWUFNTCIsIllBTUwiLCJub0hhbmtha3VLYW5hIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BhbnRmdS91dGlscy9kaXN0L2luZGV4Lm1qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9Ac2xpZGV2L3BhcnNlci9kaXN0L3V0aWxzLm1qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9ub2Rlcy9pZGVudGl0eS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC92aXNpdC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9kb2MvZGlyZWN0aXZlcy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9kb2MvYW5jaG9ycy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9kb2MvYXBwbHlSZXZpdmVyLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L25vZGVzL3RvSlMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvbm9kZXMvTm9kZS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9ub2Rlcy9BbGlhcy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9ub2Rlcy9TY2FsYXIuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3QvZG9jL2NyZWF0ZU5vZGUuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvbm9kZXMvQ29sbGVjdGlvbi5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9zdHJpbmdpZnkvc3RyaW5naWZ5Q29tbWVudC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9zdHJpbmdpZnkvZm9sZEZsb3dMaW5lcy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9zdHJpbmdpZnkvc3RyaW5naWZ5U3RyaW5nLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3N0cmluZ2lmeS9zdHJpbmdpZnkuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvc3RyaW5naWZ5L3N0cmluZ2lmeVBhaXIuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3QvbG9nLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3NjaGVtYS95YW1sLTEuMS9tZXJnZS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9ub2Rlcy9hZGRQYWlyVG9KU01hcC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9ub2Rlcy9QYWlyLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3N0cmluZ2lmeS9zdHJpbmdpZnlDb2xsZWN0aW9uLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L25vZGVzL1lBTUxNYXAuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvc2NoZW1hL2NvbW1vbi9tYXAuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvbm9kZXMvWUFNTFNlcS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9zY2hlbWEvY29tbW9uL3NlcS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9zY2hlbWEvY29tbW9uL3N0cmluZy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9zY2hlbWEvY29tbW9uL251bGwuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvc2NoZW1hL2NvcmUvYm9vbC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9zdHJpbmdpZnkvc3RyaW5naWZ5TnVtYmVyLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3NjaGVtYS9jb3JlL2Zsb2F0LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3NjaGVtYS9jb3JlL2ludC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9zY2hlbWEvY29yZS9zY2hlbWEuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvc2NoZW1hL2pzb24vc2NoZW1hLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3NjaGVtYS95YW1sLTEuMS9iaW5hcnkuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvc2NoZW1hL3lhbWwtMS4xL3BhaXJzLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3NjaGVtYS95YW1sLTEuMS9vbWFwLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3NjaGVtYS95YW1sLTEuMS9ib29sLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3NjaGVtYS95YW1sLTEuMS9mbG9hdC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9zY2hlbWEveWFtbC0xLjEvaW50LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3NjaGVtYS95YW1sLTEuMS9zZXQuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvc2NoZW1hL3lhbWwtMS4xL3RpbWVzdGFtcC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9zY2hlbWEveWFtbC0xLjEvc2NoZW1hLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3NjaGVtYS90YWdzLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3NjaGVtYS9TY2hlbWEuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvc3RyaW5naWZ5L3N0cmluZ2lmeURvY3VtZW50LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L2RvYy9Eb2N1bWVudC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9lcnJvcnMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3QvY29tcG9zZS9yZXNvbHZlLXByb3BzLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L2NvbXBvc2UvdXRpbC1jb250YWlucy1uZXdsaW5lLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L2NvbXBvc2UvdXRpbC1mbG93LWluZGVudC1jaGVjay5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9jb21wb3NlL3V0aWwtbWFwLWluY2x1ZGVzLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L2NvbXBvc2UvcmVzb2x2ZS1ibG9jay1tYXAuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3QvY29tcG9zZS9yZXNvbHZlLWJsb2NrLXNlcS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9jb21wb3NlL3Jlc29sdmUtZW5kLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L2NvbXBvc2UvcmVzb2x2ZS1mbG93LWNvbGxlY3Rpb24uanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3QvY29tcG9zZS9jb21wb3NlLWNvbGxlY3Rpb24uanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3QvY29tcG9zZS9yZXNvbHZlLWJsb2NrLXNjYWxhci5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9jb21wb3NlL3Jlc29sdmUtZmxvdy1zY2FsYXIuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3QvY29tcG9zZS9jb21wb3NlLXNjYWxhci5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9jb21wb3NlL3V0aWwtZW1wdHktc2NhbGFyLXBvc2l0aW9uLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L2NvbXBvc2UvY29tcG9zZS1ub2RlLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L2NvbXBvc2UvY29tcG9zZS1kb2MuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3QvY29tcG9zZS9jb21wb3Nlci5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9wYXJzZS9jc3Qtc2NhbGFyLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3BhcnNlL2NzdC1zdHJpbmdpZnkuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3QvcGFyc2UvY3N0LXZpc2l0LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3BhcnNlL2NzdC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9wYXJzZS9sZXhlci5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9wYXJzZS9saW5lLWNvdW50ZXIuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3QvcGFyc2UvcGFyc2VyLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3B1YmxpYy1hcGkuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3QvaW5kZXguanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2luZGV4LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BzbGlkZXYvcGFyc2VyL2Rpc3QvY29yZS5tanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvcGF0aGUvZGlzdC9zaGFyZWQvcGF0aGUuTS1lVGh0TloubWpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BzbGlkZXYvcGFyc2VyL2Rpc3QvZnMubWpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0B0ZXh0bGludC9hc3Qtbm9kZS10eXBlcy9saWIvc3JjL0FTVE5vZGVUeXBlcy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9AdGV4dGxpbnQvYXN0LW5vZGUtdHlwZXMvbGliL3NyYy9pbmRleC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy90ZXh0bGludC1ydWxlLWhlbHBlci9saWIvdGV4dGxpbnQtcnVsZS1oZWxwZXIuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvdW5pc3QtdXRpbC1pcy9jb252ZXJ0LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3VuaXN0LXV0aWwtdmlzaXQtcGFyZW50cy9jb2xvci5icm93c2VyLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3VuaXN0LXV0aWwtdmlzaXQtcGFyZW50cy9pbmRleC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy91bmlzdC11dGlsLXZpc2l0L2luZGV4LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3RleHRsaW50LXJ1bGUtaGVscGVyL2xpYi9JZ25vcmVOb2RlTWFuYWdlci5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9ib3VuZGFyeS9saWIvaW5kZXguanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3RydWN0dXJlZC1zb3VyY2UvbGliL3N0cnVjdHVyZWQtc291cmNlLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3RleHRsaW50LXJ1bGUtaGVscGVyL2xpYi9Tb3VyY2VMb2NhdGlvbi5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy90ZXh0bGludC1ydWxlLWhlbHBlci9saWIvd3JhcC1yZXBvcnQtaGFuZGxlci5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy90ZXh0bGludC1ydWxlLWhlbHBlci9saWIvaW5kZXguanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvdGV4dGxpbnQtcnVsZS1uby1oYW5rYWt1LWthbmEvbGliL3RleHRsaW50LXJ1bGUtbm8taGFua2FrdS1rYW5hLmpzIiwiLi4vc3JjL3V0aWxzL3NsaWRldlRleHRsaW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIGNsYW1wKG4sIG1pbiwgbWF4KSB7XG4gIHJldHVybiBNYXRoLm1pbihtYXgsIE1hdGgubWF4KG1pbiwgbikpO1xufVxuZnVuY3Rpb24gc3VtKC4uLmFyZ3MpIHtcbiAgcmV0dXJuIGZsYXR0ZW5BcnJheWFibGUoYXJncykucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMCk7XG59XG5mdW5jdGlvbiBsZXJwKG1pbiwgbWF4LCB0KSB7XG4gIGNvbnN0IGludGVycG9sYXRpb24gPSBjbGFtcCh0LCAwLCAxKTtcbiAgcmV0dXJuIG1pbiArIChtYXggLSBtaW4pICogaW50ZXJwb2xhdGlvbjtcbn1cbmZ1bmN0aW9uIHJlbWFwKG4sIGluTWluLCBpbk1heCwgb3V0TWluLCBvdXRNYXgpIHtcbiAgY29uc3QgaW50ZXJwb2xhdGlvbiA9IChuIC0gaW5NaW4pIC8gKGluTWF4IC0gaW5NaW4pO1xuICByZXR1cm4gbGVycChvdXRNaW4sIG91dE1heCwgaW50ZXJwb2xhdGlvbik7XG59XG5cbmZ1bmN0aW9uIHRvQXJyYXkoYXJyYXkpIHtcbiAgYXJyYXkgPSBhcnJheSA/PyBbXTtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYXJyYXkpID8gYXJyYXkgOiBbYXJyYXldO1xufVxuZnVuY3Rpb24gZmxhdHRlbkFycmF5YWJsZShhcnJheSkge1xuICByZXR1cm4gdG9BcnJheShhcnJheSkuZmxhdCgxKTtcbn1cbmZ1bmN0aW9uIG1lcmdlQXJyYXlhYmxlKC4uLmFyZ3MpIHtcbiAgcmV0dXJuIGFyZ3MuZmxhdE1hcCgoaSkgPT4gdG9BcnJheShpKSk7XG59XG5mdW5jdGlvbiBwYXJ0aXRpb24oYXJyYXksIC4uLmZpbHRlcnMpIHtcbiAgY29uc3QgcmVzdWx0ID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogZmlsdGVycy5sZW5ndGggKyAxIH0pLmZpbGwobnVsbCkubWFwKCgpID0+IFtdKTtcbiAgYXJyYXkuZm9yRWFjaCgoZSwgaWR4LCBhcnIpID0+IHtcbiAgICBsZXQgaSA9IDA7XG4gICAgZm9yIChjb25zdCBmaWx0ZXIgb2YgZmlsdGVycykge1xuICAgICAgaWYgKGZpbHRlcihlLCBpZHgsIGFycikpIHtcbiAgICAgICAgcmVzdWx0W2ldLnB1c2goZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGkgKz0gMTtcbiAgICB9XG4gICAgcmVzdWx0W2ldLnB1c2goZSk7XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gdW5pcShhcnJheSkge1xuICByZXR1cm4gQXJyYXkuZnJvbShuZXcgU2V0KGFycmF5KSk7XG59XG5mdW5jdGlvbiB1bmlxdWVCeShhcnJheSwgZXF1YWxGbikge1xuICByZXR1cm4gYXJyYXkucmVkdWNlKChhY2MsIGN1cikgPT4ge1xuICAgIGNvbnN0IGluZGV4ID0gYWNjLmZpbmRJbmRleCgoaXRlbSkgPT4gZXF1YWxGbihjdXIsIGl0ZW0pKTtcbiAgICBpZiAoaW5kZXggPT09IC0xKVxuICAgICAgYWNjLnB1c2goY3VyKTtcbiAgICByZXR1cm4gYWNjO1xuICB9LCBbXSk7XG59XG5mdW5jdGlvbiBsYXN0KGFycmF5KSB7XG4gIHJldHVybiBhdChhcnJheSwgLTEpO1xufVxuZnVuY3Rpb24gcmVtb3ZlKGFycmF5LCB2YWx1ZSkge1xuICBpZiAoIWFycmF5KVxuICAgIHJldHVybiBmYWxzZTtcbiAgY29uc3QgaW5kZXggPSBhcnJheS5pbmRleE9mKHZhbHVlKTtcbiAgaWYgKGluZGV4ID49IDApIHtcbiAgICBhcnJheS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGF0KGFycmF5LCBpbmRleCkge1xuICBjb25zdCBsZW4gPSBhcnJheS5sZW5ndGg7XG4gIGlmICghbGVuKVxuICAgIHJldHVybiB2b2lkIDA7XG4gIGlmIChpbmRleCA8IDApXG4gICAgaW5kZXggKz0gbGVuO1xuICByZXR1cm4gYXJyYXlbaW5kZXhdO1xufVxuZnVuY3Rpb24gcmFuZ2UoLi4uYXJncykge1xuICBsZXQgc3RhcnQsIHN0b3AsIHN0ZXA7XG4gIGlmIChhcmdzLmxlbmd0aCA9PT0gMSkge1xuICAgIHN0YXJ0ID0gMDtcbiAgICBzdGVwID0gMTtcbiAgICBbc3RvcF0gPSBhcmdzO1xuICB9IGVsc2Uge1xuICAgIFtzdGFydCwgc3RvcCwgc3RlcCA9IDFdID0gYXJncztcbiAgfVxuICBjb25zdCBhcnIgPSBbXTtcbiAgbGV0IGN1cnJlbnQgPSBzdGFydDtcbiAgd2hpbGUgKGN1cnJlbnQgPCBzdG9wKSB7XG4gICAgYXJyLnB1c2goY3VycmVudCk7XG4gICAgY3VycmVudCArPSBzdGVwIHx8IDE7XG4gIH1cbiAgcmV0dXJuIGFycjtcbn1cbmZ1bmN0aW9uIG1vdmUoYXJyLCBmcm9tLCB0bykge1xuICBhcnIuc3BsaWNlKHRvLCAwLCBhcnIuc3BsaWNlKGZyb20sIDEpWzBdKTtcbiAgcmV0dXJuIGFycjtcbn1cbmZ1bmN0aW9uIGNsYW1wQXJyYXlSYW5nZShuLCBhcnIpIHtcbiAgcmV0dXJuIGNsYW1wKG4sIDAsIGFyci5sZW5ndGggLSAxKTtcbn1cbmZ1bmN0aW9uIHNhbXBsZShhcnIsIHF1YW50aXR5KSB7XG4gIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBxdWFudGl0eSB9LCAoXykgPT4gYXJyW01hdGgucm91bmQoTWF0aC5yYW5kb20oKSAqIChhcnIubGVuZ3RoIC0gMSkpXSk7XG59XG5mdW5jdGlvbiBzaHVmZmxlKGFycmF5KSB7XG4gIGZvciAobGV0IGkgPSBhcnJheS5sZW5ndGggLSAxOyBpID4gMDsgaS0tKSB7XG4gICAgY29uc3QgaiA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChpICsgMSkpO1xuICAgIFthcnJheVtpXSwgYXJyYXlbal1dID0gW2FycmF5W2pdLCBhcnJheVtpXV07XG4gIH1cbiAgcmV0dXJuIGFycmF5O1xufVxuZnVuY3Rpb24gZmlsdGVySW5QbGFjZShhcnJheSwgcHJlZGljYXRlKSB7XG4gIGZvciAobGV0IGkgPSBhcnJheS5sZW5ndGg7IGktLTsgaSA+PSAwKSB7XG4gICAgaWYgKCFwcmVkaWNhdGUoYXJyYXlbaV0sIGksIGFycmF5KSlcbiAgICAgIGFycmF5LnNwbGljZShpLCAxKTtcbiAgfVxuICByZXR1cm4gYXJyYXk7XG59XG5cbmZ1bmN0aW9uIGFzc2VydChjb25kaXRpb24sIG1lc3NhZ2UpIHtcbiAgaWYgKCFjb25kaXRpb24pXG4gICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xufVxuY29uc3QgdG9TdHJpbmcgPSAodikgPT4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHYpO1xuZnVuY3Rpb24gZ2V0VHlwZU5hbWUodikge1xuICBpZiAodiA9PT0gbnVsbClcbiAgICByZXR1cm4gXCJudWxsXCI7XG4gIGNvbnN0IHR5cGUgPSB0b1N0cmluZyh2KS5zbGljZSg4LCAtMSkudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIHR5cGVvZiB2ID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiB2ID09PSBcImZ1bmN0aW9uXCIgPyB0eXBlIDogdHlwZW9mIHY7XG59XG5mdW5jdGlvbiBub29wKCkge1xufVxuXG5mdW5jdGlvbiBpc0RlZXBFcXVhbCh2YWx1ZTEsIHZhbHVlMikge1xuICBjb25zdCB0eXBlMSA9IGdldFR5cGVOYW1lKHZhbHVlMSk7XG4gIGNvbnN0IHR5cGUyID0gZ2V0VHlwZU5hbWUodmFsdWUyKTtcbiAgaWYgKHR5cGUxICE9PSB0eXBlMilcbiAgICByZXR1cm4gZmFsc2U7XG4gIGlmICh0eXBlMSA9PT0gXCJhcnJheVwiKSB7XG4gICAgaWYgKHZhbHVlMS5sZW5ndGggIT09IHZhbHVlMi5sZW5ndGgpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHZhbHVlMS5ldmVyeSgoaXRlbSwgaSkgPT4ge1xuICAgICAgcmV0dXJuIGlzRGVlcEVxdWFsKGl0ZW0sIHZhbHVlMltpXSk7XG4gICAgfSk7XG4gIH1cbiAgaWYgKHR5cGUxID09PSBcIm9iamVjdFwiKSB7XG4gICAgY29uc3Qga2V5QXJyID0gT2JqZWN0LmtleXModmFsdWUxKTtcbiAgICBpZiAoa2V5QXJyLmxlbmd0aCAhPT0gT2JqZWN0LmtleXModmFsdWUyKS5sZW5ndGgpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIGtleUFyci5ldmVyeSgoa2V5KSA9PiB7XG4gICAgICByZXR1cm4gaXNEZWVwRXF1YWwodmFsdWUxW2tleV0sIHZhbHVlMltrZXldKTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gT2JqZWN0LmlzKHZhbHVlMSwgdmFsdWUyKTtcbn1cblxuZnVuY3Rpb24gYmF0Y2hJbnZva2UoZnVuY3Rpb25zKSB7XG4gIGZ1bmN0aW9ucy5mb3JFYWNoKChmbikgPT4gZm4gJiYgZm4oKSk7XG59XG5mdW5jdGlvbiBpbnZva2UoZm4pIHtcbiAgcmV0dXJuIGZuKCk7XG59XG5mdW5jdGlvbiB0YXAodmFsdWUsIGNhbGxiYWNrKSB7XG4gIGNhbGxiYWNrKHZhbHVlKTtcbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiBub3ROdWxsaXNoKHYpIHtcbiAgcmV0dXJuIHYgIT0gbnVsbDtcbn1cbmZ1bmN0aW9uIG5vTnVsbCh2KSB7XG4gIHJldHVybiB2ICE9PSBudWxsO1xufVxuZnVuY3Rpb24gbm90VW5kZWZpbmVkKHYpIHtcbiAgcmV0dXJuIHYgIT09IHZvaWQgMDtcbn1cbmZ1bmN0aW9uIGlzVHJ1dGh5KHYpIHtcbiAgcmV0dXJuIEJvb2xlYW4odik7XG59XG5cbmNvbnN0IGlzRGVmID0gKHZhbCkgPT4gdHlwZW9mIHZhbCAhPT0gXCJ1bmRlZmluZWRcIjtcbmNvbnN0IGlzQm9vbGVhbiA9ICh2YWwpID0+IHR5cGVvZiB2YWwgPT09IFwiYm9vbGVhblwiO1xuY29uc3QgaXNGdW5jdGlvbiA9ICh2YWwpID0+IHR5cGVvZiB2YWwgPT09IFwiZnVuY3Rpb25cIjtcbmNvbnN0IGlzTnVtYmVyID0gKHZhbCkgPT4gdHlwZW9mIHZhbCA9PT0gXCJudW1iZXJcIjtcbmNvbnN0IGlzU3RyaW5nID0gKHZhbCkgPT4gdHlwZW9mIHZhbCA9PT0gXCJzdHJpbmdcIjtcbmNvbnN0IGlzT2JqZWN0ID0gKHZhbCkgPT4gdG9TdHJpbmcodmFsKSA9PT0gXCJbb2JqZWN0IE9iamVjdF1cIjtcbmNvbnN0IGlzVW5kZWZpbmVkID0gKHZhbCkgPT4gdG9TdHJpbmcodmFsKSA9PT0gXCJbb2JqZWN0IFVuZGVmaW5lZF1cIjtcbmNvbnN0IGlzTnVsbCA9ICh2YWwpID0+IHRvU3RyaW5nKHZhbCkgPT09IFwiW29iamVjdCBOdWxsXVwiO1xuY29uc3QgaXNSZWdFeHAgPSAodmFsKSA9PiB0b1N0cmluZyh2YWwpID09PSBcIltvYmplY3QgUmVnRXhwXVwiO1xuY29uc3QgaXNEYXRlID0gKHZhbCkgPT4gdG9TdHJpbmcodmFsKSA9PT0gXCJbb2JqZWN0IERhdGVdXCI7XG5mdW5jdGlvbiBpc1ByaW1pdGl2ZSh2YWwpIHtcbiAgcmV0dXJuICF2YWwgfHwgT2JqZWN0KHZhbCkgIT09IHZhbDtcbn1cbmNvbnN0IGlzV2luZG93ID0gKHZhbCkgPT4gdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0b1N0cmluZyh2YWwpID09PSBcIltvYmplY3QgV2luZG93XVwiO1xuY29uc3QgaXNCcm93c2VyID0gdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIjtcblxuZnVuY3Rpb24gc2xhc2goc3RyKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZSgvXFxcXC9nLCBcIi9cIik7XG59XG5mdW5jdGlvbiBlbnN1cmVQcmVmaXgocHJlZml4LCBzdHIpIHtcbiAgaWYgKCFzdHIuc3RhcnRzV2l0aChwcmVmaXgpKVxuICAgIHJldHVybiBwcmVmaXggKyBzdHI7XG4gIHJldHVybiBzdHI7XG59XG5mdW5jdGlvbiBlbnN1cmVTdWZmaXgoc3VmZml4LCBzdHIpIHtcbiAgaWYgKCFzdHIuZW5kc1dpdGgoc3VmZml4KSlcbiAgICByZXR1cm4gc3RyICsgc3VmZml4O1xuICByZXR1cm4gc3RyO1xufVxuZnVuY3Rpb24gdGVtcGxhdGUoc3RyLCAuLi5hcmdzKSB7XG4gIGNvbnN0IFtmaXJzdEFyZywgZmFsbGJhY2tdID0gYXJncztcbiAgaWYgKGlzT2JqZWN0KGZpcnN0QXJnKSkge1xuICAgIGNvbnN0IHZhcnMgPSBmaXJzdEFyZztcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoL1xceyhcXHcrKVxcfS9nLCAoXywga2V5KSA9PiB2YXJzW2tleV0gfHwgKCh0eXBlb2YgZmFsbGJhY2sgPT09IFwiZnVuY3Rpb25cIiA/IGZhbGxiYWNrKGtleSkgOiBmYWxsYmFjaykgPz8ga2V5KSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKC9cXHsoXFxkKylcXH0vZywgKF8sIGtleSkgPT4ge1xuICAgICAgY29uc3QgaW5kZXggPSBOdW1iZXIoa2V5KTtcbiAgICAgIGlmIChOdW1iZXIuaXNOYU4oaW5kZXgpKVxuICAgICAgICByZXR1cm4ga2V5O1xuICAgICAgcmV0dXJuIGFyZ3NbaW5kZXhdO1xuICAgIH0pO1xuICB9XG59XG5jb25zdCB1cmxBbHBoYWJldCA9IFwidXNlYW5kb20tMjZUMTk4MzQwUFg3NXB4SkFDS1ZFUllNSU5EQlVTSFdPTEZfR1FaYmZnaGprbHF2d3l6cmljdFwiO1xuZnVuY3Rpb24gcmFuZG9tU3RyKHNpemUgPSAxNiwgZGljdCA9IHVybEFscGhhYmV0KSB7XG4gIGxldCBpZCA9IFwiXCI7XG4gIGxldCBpID0gc2l6ZTtcbiAgY29uc3QgbGVuID0gZGljdC5sZW5ndGg7XG4gIHdoaWxlIChpLS0pXG4gICAgaWQgKz0gZGljdFtNYXRoLnJhbmRvbSgpICogbGVuIHwgMF07XG4gIHJldHVybiBpZDtcbn1cbmZ1bmN0aW9uIGNhcGl0YWxpemUoc3RyKSB7XG4gIHJldHVybiBzdHJbMF0udG9VcHBlckNhc2UoKSArIHN0ci5zbGljZSgxKS50b0xvd2VyQ2FzZSgpO1xufVxuY29uc3QgX3JlRnVsbFdzID0gL15cXHMqJC87XG5mdW5jdGlvbiB1bmluZGVudChzdHIpIHtcbiAgY29uc3QgbGluZXMgPSAodHlwZW9mIHN0ciA9PT0gXCJzdHJpbmdcIiA/IHN0ciA6IHN0clswXSkuc3BsaXQoXCJcXG5cIik7XG4gIGNvbnN0IHdoaXRlc3BhY2VMaW5lcyA9IGxpbmVzLm1hcCgobGluZSkgPT4gX3JlRnVsbFdzLnRlc3QobGluZSkpO1xuICBjb25zdCBjb21tb25JbmRlbnQgPSBsaW5lcy5yZWR1Y2UoKG1pbiwgbGluZSwgaWR4KSA9PiB7XG4gICAgaWYgKHdoaXRlc3BhY2VMaW5lc1tpZHhdKVxuICAgICAgcmV0dXJuIG1pbjtcbiAgICBjb25zdCBpbmRlbnQgPSBsaW5lLm1hdGNoKC9eXFxzKi8pPy5bMF0ubGVuZ3RoO1xuICAgIHJldHVybiBpbmRlbnQgPT09IHZvaWQgMCA/IG1pbiA6IE1hdGgubWluKG1pbiwgaW5kZW50KTtcbiAgfSwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTtcbiAgbGV0IGVtcHR5TGluZXNIZWFkID0gMDtcbiAgd2hpbGUgKGVtcHR5TGluZXNIZWFkIDwgbGluZXMubGVuZ3RoICYmIHdoaXRlc3BhY2VMaW5lc1tlbXB0eUxpbmVzSGVhZF0pXG4gICAgZW1wdHlMaW5lc0hlYWQrKztcbiAgbGV0IGVtcHR5TGluZXNUYWlsID0gMDtcbiAgd2hpbGUgKGVtcHR5TGluZXNUYWlsIDwgbGluZXMubGVuZ3RoICYmIHdoaXRlc3BhY2VMaW5lc1tsaW5lcy5sZW5ndGggLSBlbXB0eUxpbmVzVGFpbCAtIDFdKVxuICAgIGVtcHR5TGluZXNUYWlsKys7XG4gIHJldHVybiBsaW5lcy5zbGljZShlbXB0eUxpbmVzSGVhZCwgbGluZXMubGVuZ3RoIC0gZW1wdHlMaW5lc1RhaWwpLm1hcCgobGluZSkgPT4gbGluZS5zbGljZShjb21tb25JbmRlbnQpKS5qb2luKFwiXFxuXCIpO1xufVxuXG5mdW5jdGlvbiBvYmplY3RNYXAob2JqLCBmbikge1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5lbnRyaWVzKG9iaikubWFwKChbaywgdl0pID0+IGZuKGssIHYpKS5maWx0ZXIobm90TnVsbGlzaClcbiAgKTtcbn1cbmZ1bmN0aW9uIGlzS2V5T2Yob2JqLCBrKSB7XG4gIHJldHVybiBrIGluIG9iajtcbn1cbmZ1bmN0aW9uIG9iamVjdEtleXMob2JqKSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhvYmopO1xufVxuZnVuY3Rpb24gb2JqZWN0RW50cmllcyhvYmopIHtcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKG9iaik7XG59XG5mdW5jdGlvbiBkZWVwTWVyZ2UodGFyZ2V0LCAuLi5zb3VyY2VzKSB7XG4gIGlmICghc291cmNlcy5sZW5ndGgpXG4gICAgcmV0dXJuIHRhcmdldDtcbiAgY29uc3Qgc291cmNlID0gc291cmNlcy5zaGlmdCgpO1xuICBpZiAoc291cmNlID09PSB2b2lkIDApXG4gICAgcmV0dXJuIHRhcmdldDtcbiAgaWYgKGlzTWVyZ2FibGVPYmplY3QodGFyZ2V0KSAmJiBpc01lcmdhYmxlT2JqZWN0KHNvdXJjZSkpIHtcbiAgICBvYmplY3RLZXlzKHNvdXJjZSkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBpZiAoa2V5ID09PSBcIl9fcHJvdG9fX1wiIHx8IGtleSA9PT0gXCJjb25zdHJ1Y3RvclwiIHx8IGtleSA9PT0gXCJwcm90b3R5cGVcIilcbiAgICAgICAgcmV0dXJuO1xuICAgICAgaWYgKGlzTWVyZ2FibGVPYmplY3Qoc291cmNlW2tleV0pKSB7XG4gICAgICAgIGlmICghdGFyZ2V0W2tleV0pXG4gICAgICAgICAgdGFyZ2V0W2tleV0gPSB7fTtcbiAgICAgICAgaWYgKGlzTWVyZ2FibGVPYmplY3QodGFyZ2V0W2tleV0pKSB7XG4gICAgICAgICAgZGVlcE1lcmdlKHRhcmdldFtrZXldLCBzb3VyY2Vba2V5XSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICByZXR1cm4gZGVlcE1lcmdlKHRhcmdldCwgLi4uc291cmNlcyk7XG59XG5mdW5jdGlvbiBkZWVwTWVyZ2VXaXRoQXJyYXkodGFyZ2V0LCAuLi5zb3VyY2VzKSB7XG4gIGlmICghc291cmNlcy5sZW5ndGgpXG4gICAgcmV0dXJuIHRhcmdldDtcbiAgY29uc3Qgc291cmNlID0gc291cmNlcy5zaGlmdCgpO1xuICBpZiAoc291cmNlID09PSB2b2lkIDApXG4gICAgcmV0dXJuIHRhcmdldDtcbiAgaWYgKEFycmF5LmlzQXJyYXkodGFyZ2V0KSAmJiBBcnJheS5pc0FycmF5KHNvdXJjZSkpXG4gICAgdGFyZ2V0LnB1c2goLi4uc291cmNlKTtcbiAgaWYgKGlzTWVyZ2FibGVPYmplY3QodGFyZ2V0KSAmJiBpc01lcmdhYmxlT2JqZWN0KHNvdXJjZSkpIHtcbiAgICBvYmplY3RLZXlzKHNvdXJjZSkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBpZiAoa2V5ID09PSBcIl9fcHJvdG9fX1wiIHx8IGtleSA9PT0gXCJjb25zdHJ1Y3RvclwiIHx8IGtleSA9PT0gXCJwcm90b3R5cGVcIilcbiAgICAgICAgcmV0dXJuO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc291cmNlW2tleV0pKSB7XG4gICAgICAgIGlmICghdGFyZ2V0W2tleV0pXG4gICAgICAgICAgdGFyZ2V0W2tleV0gPSBbXTtcbiAgICAgICAgZGVlcE1lcmdlV2l0aEFycmF5KHRhcmdldFtrZXldLCBzb3VyY2Vba2V5XSk7XG4gICAgICB9IGVsc2UgaWYgKGlzTWVyZ2FibGVPYmplY3Qoc291cmNlW2tleV0pKSB7XG4gICAgICAgIGlmICghdGFyZ2V0W2tleV0pXG4gICAgICAgICAgdGFyZ2V0W2tleV0gPSB7fTtcbiAgICAgICAgZGVlcE1lcmdlV2l0aEFycmF5KHRhcmdldFtrZXldLCBzb3VyY2Vba2V5XSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHJldHVybiBkZWVwTWVyZ2VXaXRoQXJyYXkodGFyZ2V0LCAuLi5zb3VyY2VzKTtcbn1cbmZ1bmN0aW9uIGlzTWVyZ2FibGVPYmplY3QoaXRlbSkge1xuICByZXR1cm4gaXNPYmplY3QoaXRlbSkgJiYgIUFycmF5LmlzQXJyYXkoaXRlbSk7XG59XG5mdW5jdGlvbiBvYmplY3RQaWNrKG9iaiwga2V5cywgb21pdFVuZGVmaW5lZCA9IGZhbHNlKSB7XG4gIHJldHVybiBrZXlzLnJlZHVjZSgobiwgaykgPT4ge1xuICAgIGlmIChrIGluIG9iaikge1xuICAgICAgaWYgKCFvbWl0VW5kZWZpbmVkIHx8IG9ialtrXSAhPT0gdm9pZCAwKVxuICAgICAgICBuW2tdID0gb2JqW2tdO1xuICAgIH1cbiAgICByZXR1cm4gbjtcbiAgfSwge30pO1xufVxuZnVuY3Rpb24gb2JqZWN0T21pdChvYmosIGtleXMsIG9taXRVbmRlZmluZWQgPSBmYWxzZSkge1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKG9iaikuZmlsdGVyKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICByZXR1cm4gKCFvbWl0VW5kZWZpbmVkIHx8IHZhbHVlICE9PSB2b2lkIDApICYmICFrZXlzLmluY2x1ZGVzKGtleSk7XG4gIH0pKTtcbn1cbmZ1bmN0aW9uIGNsZWFyVW5kZWZpbmVkKG9iaikge1xuICBPYmplY3Qua2V5cyhvYmopLmZvckVhY2goKGtleSkgPT4gb2JqW2tleV0gPT09IHZvaWQgMCA/IGRlbGV0ZSBvYmpba2V5XSA6IHt9KTtcbiAgcmV0dXJuIG9iajtcbn1cbmZ1bmN0aW9uIGhhc093blByb3BlcnR5KG9iaiwgdikge1xuICBpZiAob2JqID09IG51bGwpXG4gICAgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgdik7XG59XG5jb25zdCBfb2JqZWN0SWRNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcbmZ1bmN0aW9uIG9iamVjdElkKG9iaikge1xuICBpZiAoaXNQcmltaXRpdmUob2JqKSlcbiAgICByZXR1cm4gb2JqO1xuICBpZiAoIV9vYmplY3RJZE1hcC5oYXMob2JqKSkge1xuICAgIF9vYmplY3RJZE1hcC5zZXQob2JqLCByYW5kb21TdHIoKSk7XG4gIH1cbiAgcmV0dXJuIF9vYmplY3RJZE1hcC5nZXQob2JqKTtcbn1cblxuLypcbkhvdyBpdCB3b3JrczpcbmB0aGlzLiNoZWFkYCBpcyBhbiBpbnN0YW5jZSBvZiBgTm9kZWAgd2hpY2gga2VlcHMgdHJhY2sgb2YgaXRzIGN1cnJlbnQgdmFsdWUgYW5kIG5lc3RzIGFub3RoZXIgaW5zdGFuY2Ugb2YgYE5vZGVgIHRoYXQga2VlcHMgdGhlIHZhbHVlIHRoYXQgY29tZXMgYWZ0ZXIgaXQuIFdoZW4gYSB2YWx1ZSBpcyBwcm92aWRlZCB0byBgLmVucXVldWUoKWAsIHRoZSBjb2RlIG5lZWRzIHRvIGl0ZXJhdGUgdGhyb3VnaCBgdGhpcy4jaGVhZGAsIGdvaW5nIGRlZXBlciBhbmQgZGVlcGVyIHRvIGZpbmQgdGhlIGxhc3QgdmFsdWUuIEhvd2V2ZXIsIGl0ZXJhdGluZyB0aHJvdWdoIGV2ZXJ5IHNpbmdsZSBpdGVtIGlzIHNsb3cuIFRoaXMgcHJvYmxlbSBpcyBzb2x2ZWQgYnkgc2F2aW5nIGEgcmVmZXJlbmNlIHRvIHRoZSBsYXN0IHZhbHVlIGFzIGB0aGlzLiN0YWlsYCBzbyB0aGF0IGl0IGNhbiByZWZlcmVuY2UgaXQgdG8gYWRkIGEgbmV3IHZhbHVlLlxuKi9cblxuY2xhc3MgTm9kZSB7XG5cdHZhbHVlO1xuXHRuZXh0O1xuXG5cdGNvbnN0cnVjdG9yKHZhbHVlKSB7XG5cdFx0dGhpcy52YWx1ZSA9IHZhbHVlO1xuXHR9XG59XG5cbmNsYXNzIFF1ZXVlIHtcblx0I2hlYWQ7XG5cdCN0YWlsO1xuXHQjc2l6ZTtcblxuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHR0aGlzLmNsZWFyKCk7XG5cdH1cblxuXHRlbnF1ZXVlKHZhbHVlKSB7XG5cdFx0Y29uc3Qgbm9kZSA9IG5ldyBOb2RlKHZhbHVlKTtcblxuXHRcdGlmICh0aGlzLiNoZWFkKSB7XG5cdFx0XHR0aGlzLiN0YWlsLm5leHQgPSBub2RlO1xuXHRcdFx0dGhpcy4jdGFpbCA9IG5vZGU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuI2hlYWQgPSBub2RlO1xuXHRcdFx0dGhpcy4jdGFpbCA9IG5vZGU7XG5cdFx0fVxuXG5cdFx0dGhpcy4jc2l6ZSsrO1xuXHR9XG5cblx0ZGVxdWV1ZSgpIHtcblx0XHRjb25zdCBjdXJyZW50ID0gdGhpcy4jaGVhZDtcblx0XHRpZiAoIWN1cnJlbnQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR0aGlzLiNoZWFkID0gdGhpcy4jaGVhZC5uZXh0O1xuXHRcdHRoaXMuI3NpemUtLTtcblx0XHRyZXR1cm4gY3VycmVudC52YWx1ZTtcblx0fVxuXG5cdHBlZWsoKSB7XG5cdFx0aWYgKCF0aGlzLiNoZWFkKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuI2hlYWQudmFsdWU7XG5cblx0XHQvLyBUT0RPOiBOb2RlLmpzIDE4LlxuXHRcdC8vIHJldHVybiB0aGlzLiNoZWFkPy52YWx1ZTtcblx0fVxuXG5cdGNsZWFyKCkge1xuXHRcdHRoaXMuI2hlYWQgPSB1bmRlZmluZWQ7XG5cdFx0dGhpcy4jdGFpbCA9IHVuZGVmaW5lZDtcblx0XHR0aGlzLiNzaXplID0gMDtcblx0fVxuXG5cdGdldCBzaXplKCkge1xuXHRcdHJldHVybiB0aGlzLiNzaXplO1xuXHR9XG5cblx0KiBbU3ltYm9sLml0ZXJhdG9yXSgpIHtcblx0XHRsZXQgY3VycmVudCA9IHRoaXMuI2hlYWQ7XG5cblx0XHR3aGlsZSAoY3VycmVudCkge1xuXHRcdFx0eWllbGQgY3VycmVudC52YWx1ZTtcblx0XHRcdGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7XG5cdFx0fVxuXHR9XG5cblx0KiBkcmFpbigpIHtcblx0XHR3aGlsZSAodGhpcy4jaGVhZCkge1xuXHRcdFx0eWllbGQgdGhpcy5kZXF1ZXVlKCk7XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIHBMaW1pdChjb25jdXJyZW5jeSkge1xuXHR2YWxpZGF0ZUNvbmN1cnJlbmN5KGNvbmN1cnJlbmN5KTtcblxuXHRjb25zdCBxdWV1ZSA9IG5ldyBRdWV1ZSgpO1xuXHRsZXQgYWN0aXZlQ291bnQgPSAwO1xuXG5cdGNvbnN0IHJlc3VtZU5leHQgPSAoKSA9PiB7XG5cdFx0Ly8gUHJvY2VzcyB0aGUgbmV4dCBxdWV1ZWQgZnVuY3Rpb24gaWYgd2UncmUgdW5kZXIgdGhlIGNvbmN1cnJlbmN5IGxpbWl0XG5cdFx0aWYgKGFjdGl2ZUNvdW50IDwgY29uY3VycmVuY3kgJiYgcXVldWUuc2l6ZSA+IDApIHtcblx0XHRcdGFjdGl2ZUNvdW50Kys7XG5cdFx0XHRxdWV1ZS5kZXF1ZXVlKCkoKTtcblx0XHR9XG5cdH07XG5cblx0Y29uc3QgbmV4dCA9ICgpID0+IHtcblx0XHRhY3RpdmVDb3VudC0tO1xuXHRcdHJlc3VtZU5leHQoKTtcblx0fTtcblxuXHRjb25zdCBydW4gPSBhc3luYyAoZnVuY3Rpb25fLCByZXNvbHZlLCBhcmd1bWVudHNfKSA9PiB7XG5cdFx0Ly8gRXhlY3V0ZSB0aGUgZnVuY3Rpb24gYW5kIGNhcHR1cmUgdGhlIHJlc3VsdCBwcm9taXNlXG5cdFx0Y29uc3QgcmVzdWx0ID0gKGFzeW5jICgpID0+IGZ1bmN0aW9uXyguLi5hcmd1bWVudHNfKSkoKTtcblxuXHRcdC8vIFJlc29sdmUgaW1tZWRpYXRlbHkgd2l0aCB0aGUgcHJvbWlzZSAoZG9uJ3Qgd2FpdCBmb3IgY29tcGxldGlvbilcblx0XHRyZXNvbHZlKHJlc3VsdCk7XG5cblx0XHQvLyBXYWl0IGZvciB0aGUgZnVuY3Rpb24gdG8gY29tcGxldGUgKHN1Y2Nlc3Mgb3IgZmFpbHVyZSlcblx0XHQvLyBXZSBjYXRjaCBlcnJvcnMgaGVyZSB0byBwcmV2ZW50IHVuaGFuZGxlZCByZWplY3Rpb25zLFxuXHRcdC8vIGJ1dCB0aGUgb3JpZ2luYWwgcHJvbWlzZSByZWplY3Rpb24gaXMgcHJlc2VydmVkIGZvciB0aGUgY2FsbGVyXG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHJlc3VsdDtcblx0XHR9IGNhdGNoIHt9XG5cblx0XHQvLyBEZWNyZW1lbnQgYWN0aXZlIGNvdW50IGFuZCBwcm9jZXNzIG5leHQgcXVldWVkIGZ1bmN0aW9uXG5cdFx0bmV4dCgpO1xuXHR9O1xuXG5cdGNvbnN0IGVucXVldWUgPSAoZnVuY3Rpb25fLCByZXNvbHZlLCBhcmd1bWVudHNfKSA9PiB7XG5cdFx0Ly8gUXVldWUgdGhlIGludGVybmFsIHJlc29sdmUgZnVuY3Rpb24gaW5zdGVhZCBvZiB0aGUgcnVuIGZ1bmN0aW9uXG5cdFx0Ly8gdG8gcHJlc2VydmUgdGhlIGFzeW5jaHJvbm91cyBleGVjdXRpb24gY29udGV4dC5cblx0XHRuZXcgUHJvbWlzZShpbnRlcm5hbFJlc29sdmUgPT4geyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHByb21pc2UvcGFyYW0tbmFtZXNcblx0XHRcdHF1ZXVlLmVucXVldWUoaW50ZXJuYWxSZXNvbHZlKTtcblx0XHR9KS50aGVuKHJ1bi5iaW5kKHVuZGVmaW5lZCwgZnVuY3Rpb25fLCByZXNvbHZlLCBhcmd1bWVudHNfKSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcHJvbWlzZS9wcmVmZXItYXdhaXQtdG8tdGhlblxuXG5cdFx0Ly8gU3RhcnQgcHJvY2Vzc2luZyBpbW1lZGlhdGVseSBpZiB3ZSBoYXZlbid0IHJlYWNoZWQgdGhlIGNvbmN1cnJlbmN5IGxpbWl0XG5cdFx0aWYgKGFjdGl2ZUNvdW50IDwgY29uY3VycmVuY3kpIHtcblx0XHRcdHJlc3VtZU5leHQoKTtcblx0XHR9XG5cdH07XG5cblx0Y29uc3QgZ2VuZXJhdG9yID0gKGZ1bmN0aW9uXywgLi4uYXJndW1lbnRzXykgPT4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG5cdFx0ZW5xdWV1ZShmdW5jdGlvbl8sIHJlc29sdmUsIGFyZ3VtZW50c18pO1xuXHR9KTtcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydGllcyhnZW5lcmF0b3IsIHtcblx0XHRhY3RpdmVDb3VudDoge1xuXHRcdFx0Z2V0OiAoKSA9PiBhY3RpdmVDb3VudCxcblx0XHR9LFxuXHRcdHBlbmRpbmdDb3VudDoge1xuXHRcdFx0Z2V0OiAoKSA9PiBxdWV1ZS5zaXplLFxuXHRcdH0sXG5cdFx0Y2xlYXJRdWV1ZToge1xuXHRcdFx0dmFsdWUoKSB7XG5cdFx0XHRcdHF1ZXVlLmNsZWFyKCk7XG5cdFx0XHR9LFxuXHRcdH0sXG5cdFx0Y29uY3VycmVuY3k6IHtcblx0XHRcdGdldDogKCkgPT4gY29uY3VycmVuY3ksXG5cblx0XHRcdHNldChuZXdDb25jdXJyZW5jeSkge1xuXHRcdFx0XHR2YWxpZGF0ZUNvbmN1cnJlbmN5KG5ld0NvbmN1cnJlbmN5KTtcblx0XHRcdFx0Y29uY3VycmVuY3kgPSBuZXdDb25jdXJyZW5jeTtcblxuXHRcdFx0XHRxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG5cdFx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVubW9kaWZpZWQtbG9vcC1jb25kaXRpb25cblx0XHRcdFx0XHR3aGlsZSAoYWN0aXZlQ291bnQgPCBjb25jdXJyZW5jeSAmJiBxdWV1ZS5zaXplID4gMCkge1xuXHRcdFx0XHRcdFx0cmVzdW1lTmV4dCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9LFxuXHRcdH0sXG5cdFx0bWFwOiB7XG5cdFx0XHRhc3luYyB2YWx1ZShhcnJheSwgZnVuY3Rpb25fKSB7XG5cdFx0XHRcdGNvbnN0IHByb21pc2VzID0gYXJyYXkubWFwKCh2YWx1ZSwgaW5kZXgpID0+IHRoaXMoZnVuY3Rpb25fLCB2YWx1ZSwgaW5kZXgpKTtcblx0XHRcdFx0cmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKTtcblx0XHRcdH0sXG5cdFx0fSxcblx0fSk7XG5cblx0cmV0dXJuIGdlbmVyYXRvcjtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVDb25jdXJyZW5jeShjb25jdXJyZW5jeSkge1xuXHRpZiAoISgoTnVtYmVyLmlzSW50ZWdlcihjb25jdXJyZW5jeSkgfHwgY29uY3VycmVuY3kgPT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSkgJiYgY29uY3VycmVuY3kgPiAwKSkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGBjb25jdXJyZW5jeWAgdG8gYmUgYSBudW1iZXIgZnJvbSAxIGFuZCB1cCcpO1xuXHR9XG59XG5cbmNvbnN0IFZPSUQgPSBTeW1ib2woXCJwLXZvaWRcIik7XG5jbGFzcyBQSW5zdGFuY2UgZXh0ZW5kcyBQcm9taXNlIHtcbiAgY29uc3RydWN0b3IoaXRlbXMgPSBbXSwgb3B0aW9ucykge1xuICAgIHN1cGVyKCgpID0+IHtcbiAgICB9KTtcbiAgICB0aGlzLml0ZW1zID0gaXRlbXM7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgfVxuICBwcm9taXNlcyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG4gIGdldCBwcm9taXNlKCkge1xuICAgIGxldCBiYXRjaDtcbiAgICBjb25zdCBpdGVtcyA9IFsuLi5BcnJheS5mcm9tKHRoaXMuaXRlbXMpLCAuLi5BcnJheS5mcm9tKHRoaXMucHJvbWlzZXMpXTtcbiAgICBpZiAodGhpcy5vcHRpb25zPy5jb25jdXJyZW5jeSkge1xuICAgICAgY29uc3QgbGltaXQgPSBwTGltaXQodGhpcy5vcHRpb25zLmNvbmN1cnJlbmN5KTtcbiAgICAgIGJhdGNoID0gUHJvbWlzZS5hbGwoaXRlbXMubWFwKChwMikgPT4gbGltaXQoKCkgPT4gcDIpKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJhdGNoID0gUHJvbWlzZS5hbGwoaXRlbXMpO1xuICAgIH1cbiAgICByZXR1cm4gYmF0Y2gudGhlbigobCkgPT4gbC5maWx0ZXIoKGkpID0+IGkgIT09IFZPSUQpKTtcbiAgfVxuICBhZGQoLi4uYXJncykge1xuICAgIGFyZ3MuZm9yRWFjaCgoaSkgPT4ge1xuICAgICAgdGhpcy5wcm9taXNlcy5hZGQoaSk7XG4gICAgfSk7XG4gIH1cbiAgbWFwKGZuKSB7XG4gICAgcmV0dXJuIG5ldyBQSW5zdGFuY2UoXG4gICAgICBBcnJheS5mcm9tKHRoaXMuaXRlbXMpLm1hcChhc3luYyAoaSwgaWR4KSA9PiB7XG4gICAgICAgIGNvbnN0IHYgPSBhd2FpdCBpO1xuICAgICAgICBpZiAodiA9PT0gVk9JRClcbiAgICAgICAgICByZXR1cm4gVk9JRDtcbiAgICAgICAgcmV0dXJuIGZuKHYsIGlkeCk7XG4gICAgICB9KSxcbiAgICAgIHRoaXMub3B0aW9uc1xuICAgICk7XG4gIH1cbiAgZmlsdGVyKGZuKSB7XG4gICAgcmV0dXJuIG5ldyBQSW5zdGFuY2UoXG4gICAgICBBcnJheS5mcm9tKHRoaXMuaXRlbXMpLm1hcChhc3luYyAoaSwgaWR4KSA9PiB7XG4gICAgICAgIGNvbnN0IHYgPSBhd2FpdCBpO1xuICAgICAgICBjb25zdCByID0gYXdhaXQgZm4odiwgaWR4KTtcbiAgICAgICAgaWYgKCFyKVxuICAgICAgICAgIHJldHVybiBWT0lEO1xuICAgICAgICByZXR1cm4gdjtcbiAgICAgIH0pLFxuICAgICAgdGhpcy5vcHRpb25zXG4gICAgKTtcbiAgfVxuICBmb3JFYWNoKGZuKSB7XG4gICAgcmV0dXJuIHRoaXMubWFwKGZuKS50aGVuKCk7XG4gIH1cbiAgcmVkdWNlKGZuLCBpbml0aWFsVmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9taXNlLnRoZW4oKGFycmF5KSA9PiBhcnJheS5yZWR1Y2UoZm4sIGluaXRpYWxWYWx1ZSkpO1xuICB9XG4gIGNsZWFyKCkge1xuICAgIHRoaXMucHJvbWlzZXMuY2xlYXIoKTtcbiAgfVxuICB0aGVuKG9uZnVsZmlsbGVkLCBvbnJlamVjdGVkKSB7XG4gICAgcmV0dXJuIHRoaXMucHJvbWlzZS50aGVuKG9uZnVsZmlsbGVkLCBvbnJlamVjdGVkKTtcbiAgfVxuICBjYXRjaChmbikge1xuICAgIHJldHVybiB0aGlzLnByb21pc2UuY2F0Y2goZm4pO1xuICB9XG4gIGZpbmFsbHkoZm4pIHtcbiAgICByZXR1cm4gdGhpcy5wcm9taXNlLmZpbmFsbHkoZm4pO1xuICB9XG59XG5mdW5jdGlvbiBwKGl0ZW1zLCBvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgUEluc3RhbmNlKGl0ZW1zLCBvcHRpb25zKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlU2luZ2xldG9uUHJvbWlzZShmbikge1xuICBsZXQgX3Byb21pc2U7XG4gIGZ1bmN0aW9uIHdyYXBwZXIoKSB7XG4gICAgaWYgKCFfcHJvbWlzZSlcbiAgICAgIF9wcm9taXNlID0gZm4oKTtcbiAgICByZXR1cm4gX3Byb21pc2U7XG4gIH1cbiAgd3JhcHBlci5yZXNldCA9IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBfcHJldiA9IF9wcm9taXNlO1xuICAgIF9wcm9taXNlID0gdm9pZCAwO1xuICAgIGlmIChfcHJldilcbiAgICAgIGF3YWl0IF9wcmV2O1xuICB9O1xuICByZXR1cm4gd3JhcHBlcjtcbn1cbmZ1bmN0aW9uIHNsZWVwKG1zLCBjYWxsYmFjaykge1xuICByZXR1cm4gbmV3IFByb21pc2UoXG4gICAgKHJlc29sdmUpID0+IHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgY2FsbGJhY2s/LigpO1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0sIG1zKVxuICApO1xufVxuZnVuY3Rpb24gY3JlYXRlUHJvbWlzZUxvY2soKSB7XG4gIGNvbnN0IGxvY2tzID0gW107XG4gIHJldHVybiB7XG4gICAgYXN5bmMgcnVuKGZuKSB7XG4gICAgICBjb25zdCBwID0gZm4oKTtcbiAgICAgIGxvY2tzLnB1c2gocCk7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgcDtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHJlbW92ZShsb2NrcywgcCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBhc3luYyB3YWl0KCkge1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKGxvY2tzKTtcbiAgICB9LFxuICAgIGlzV2FpdGluZygpIHtcbiAgICAgIHJldHVybiBCb29sZWFuKGxvY2tzLmxlbmd0aCk7XG4gICAgfSxcbiAgICBjbGVhcigpIHtcbiAgICAgIGxvY2tzLmxlbmd0aCA9IDA7XG4gICAgfVxuICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlQ29udHJvbGxlZFByb21pc2UoKSB7XG4gIGxldCByZXNvbHZlLCByZWplY3Q7XG4gIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZSgoX3Jlc29sdmUsIF9yZWplY3QpID0+IHtcbiAgICByZXNvbHZlID0gX3Jlc29sdmU7XG4gICAgcmVqZWN0ID0gX3JlamVjdDtcbiAgfSk7XG4gIHByb21pc2UucmVzb2x2ZSA9IHJlc29sdmU7XG4gIHByb21pc2UucmVqZWN0ID0gcmVqZWN0O1xuICByZXR1cm4gcHJvbWlzZTtcbn1cblxuY29uc3QgdGltZXN0YW1wID0gKCkgPT4gK0RhdGUubm93KCk7XG5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVmaW5lZCxuby1wYXJhbS1yZWFzc2lnbixuby1zaGFkb3cgKi9cblxuLyoqXG4gKiBUaHJvdHRsZSBleGVjdXRpb24gb2YgYSBmdW5jdGlvbi4gRXNwZWNpYWxseSB1c2VmdWwgZm9yIHJhdGUgbGltaXRpbmdcbiAqIGV4ZWN1dGlvbiBvZiBoYW5kbGVycyBvbiBldmVudHMgbGlrZSByZXNpemUgYW5kIHNjcm9sbC5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gZGVsYXkgLSAgICAgICAgICAgICAgICAgIEEgemVyby1vci1ncmVhdGVyIGRlbGF5IGluIG1pbGxpc2Vjb25kcy4gRm9yIGV2ZW50IGNhbGxiYWNrcywgdmFsdWVzIGFyb3VuZCAxMDAgb3IgMjUwIChvciBldmVuIGhpZ2hlcilcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgbW9zdCB1c2VmdWwuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayAtICAgICAgICAgICAgICAgQSBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCBhZnRlciBkZWxheSBtaWxsaXNlY29uZHMuIFRoZSBgdGhpc2AgY29udGV4dCBhbmQgYWxsIGFyZ3VtZW50cyBhcmUgcGFzc2VkIHRocm91Z2gsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMtaXMsIHRvIGBjYWxsYmFja2Agd2hlbiB0aGUgdGhyb3R0bGVkLWZ1bmN0aW9uIGlzIGV4ZWN1dGVkLlxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXSAtICAgICAgICAgICAgICBBbiBvYmplY3QgdG8gY29uZmlndXJlIG9wdGlvbnMuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLm5vVHJhaWxpbmddIC0gICBPcHRpb25hbCwgZGVmYXVsdHMgdG8gZmFsc2UuIElmIG5vVHJhaWxpbmcgaXMgdHJ1ZSwgY2FsbGJhY2sgd2lsbCBvbmx5IGV4ZWN1dGUgZXZlcnkgYGRlbGF5YCBtaWxsaXNlY29uZHNcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSB0aGUgdGhyb3R0bGVkLWZ1bmN0aW9uIGlzIGJlaW5nIGNhbGxlZC4gSWYgbm9UcmFpbGluZyBpcyBmYWxzZSBvciB1bnNwZWNpZmllZCwgY2FsbGJhY2sgd2lsbCBiZSBleGVjdXRlZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uZSBmaW5hbCB0aW1lIGFmdGVyIHRoZSBsYXN0IHRocm90dGxlZC1mdW5jdGlvbiBjYWxsLiAoQWZ0ZXIgdGhlIHRocm90dGxlZC1mdW5jdGlvbiBoYXMgbm90IGJlZW4gY2FsbGVkIGZvclxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBkZWxheWAgbWlsbGlzZWNvbmRzLCB0aGUgaW50ZXJuYWwgY291bnRlciBpcyByZXNldCkuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLm5vTGVhZGluZ10gLSAgIE9wdGlvbmFsLCBkZWZhdWx0cyB0byBmYWxzZS4gSWYgbm9MZWFkaW5nIGlzIGZhbHNlLCB0aGUgZmlyc3QgdGhyb3R0bGVkLWZ1bmN0aW9uIGNhbGwgd2lsbCBleGVjdXRlIGNhbGxiYWNrXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1tZWRpYXRlbHkuIElmIG5vTGVhZGluZyBpcyB0cnVlLCB0aGUgZmlyc3QgdGhlIGNhbGxiYWNrIGV4ZWN1dGlvbiB3aWxsIGJlIHNraXBwZWQuIEl0IHNob3VsZCBiZSBub3RlZCB0aGF0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgd2lsbCBuZXZlciBleGVjdXRlZCBpZiBib3RoIG5vTGVhZGluZyA9IHRydWUgYW5kIG5vVHJhaWxpbmcgPSB0cnVlLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5kZWJvdW5jZU1vZGVdIC0gSWYgYGRlYm91bmNlTW9kZWAgaXMgdHJ1ZSAoYXQgYmVnaW4pLCBzY2hlZHVsZSBgY2xlYXJgIHRvIGV4ZWN1dGUgYWZ0ZXIgYGRlbGF5YCBtcy4gSWYgYGRlYm91bmNlTW9kZWAgaXNcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAoYXQgZW5kKSwgc2NoZWR1bGUgYGNhbGxiYWNrYCB0byBleGVjdXRlIGFmdGVyIGBkZWxheWAgbXMuXG4gKlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBBIG5ldywgdGhyb3R0bGVkLCBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gdGhyb3R0bGUkMSAoZGVsYXksIGNhbGxiYWNrLCBvcHRpb25zKSB7XG4gIHZhciBfcmVmID0gb3B0aW9ucyB8fCB7fSxcbiAgICAgIF9yZWYkbm9UcmFpbGluZyA9IF9yZWYubm9UcmFpbGluZyxcbiAgICAgIG5vVHJhaWxpbmcgPSBfcmVmJG5vVHJhaWxpbmcgPT09IHZvaWQgMCA/IGZhbHNlIDogX3JlZiRub1RyYWlsaW5nLFxuICAgICAgX3JlZiRub0xlYWRpbmcgPSBfcmVmLm5vTGVhZGluZyxcbiAgICAgIG5vTGVhZGluZyA9IF9yZWYkbm9MZWFkaW5nID09PSB2b2lkIDAgPyBmYWxzZSA6IF9yZWYkbm9MZWFkaW5nLFxuICAgICAgX3JlZiRkZWJvdW5jZU1vZGUgPSBfcmVmLmRlYm91bmNlTW9kZSxcbiAgICAgIGRlYm91bmNlTW9kZSA9IF9yZWYkZGVib3VuY2VNb2RlID09PSB2b2lkIDAgPyB1bmRlZmluZWQgOiBfcmVmJGRlYm91bmNlTW9kZTtcbiAgLypcbiAgICogQWZ0ZXIgd3JhcHBlciBoYXMgc3RvcHBlZCBiZWluZyBjYWxsZWQsIHRoaXMgdGltZW91dCBlbnN1cmVzIHRoYXRcbiAgICogYGNhbGxiYWNrYCBpcyBleGVjdXRlZCBhdCB0aGUgcHJvcGVyIHRpbWVzIGluIGB0aHJvdHRsZWAgYW5kIGBlbmRgXG4gICAqIGRlYm91bmNlIG1vZGVzLlxuICAgKi9cblxuXG4gIHZhciB0aW1lb3V0SUQ7XG4gIHZhciBjYW5jZWxsZWQgPSBmYWxzZTsgLy8gS2VlcCB0cmFjayBvZiB0aGUgbGFzdCB0aW1lIGBjYWxsYmFja2Agd2FzIGV4ZWN1dGVkLlxuXG4gIHZhciBsYXN0RXhlYyA9IDA7IC8vIEZ1bmN0aW9uIHRvIGNsZWFyIGV4aXN0aW5nIHRpbWVvdXRcblxuICBmdW5jdGlvbiBjbGVhckV4aXN0aW5nVGltZW91dCgpIHtcbiAgICBpZiAodGltZW91dElEKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZW91dElEKTtcbiAgICB9XG4gIH0gLy8gRnVuY3Rpb24gdG8gY2FuY2VsIG5leHQgZXhlY1xuXG5cbiAgZnVuY3Rpb24gY2FuY2VsKG9wdGlvbnMpIHtcbiAgICB2YXIgX3JlZjIgPSBvcHRpb25zIHx8IHt9LFxuICAgICAgICBfcmVmMiR1cGNvbWluZ09ubHkgPSBfcmVmMi51cGNvbWluZ09ubHksXG4gICAgICAgIHVwY29taW5nT25seSA9IF9yZWYyJHVwY29taW5nT25seSA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcmVmMiR1cGNvbWluZ09ubHk7XG5cbiAgICBjbGVhckV4aXN0aW5nVGltZW91dCgpO1xuICAgIGNhbmNlbGxlZCA9ICF1cGNvbWluZ09ubHk7XG4gIH1cbiAgLypcbiAgICogVGhlIGB3cmFwcGVyYCBmdW5jdGlvbiBlbmNhcHN1bGF0ZXMgYWxsIG9mIHRoZSB0aHJvdHRsaW5nIC8gZGVib3VuY2luZ1xuICAgKiBmdW5jdGlvbmFsaXR5IGFuZCB3aGVuIGV4ZWN1dGVkIHdpbGwgbGltaXQgdGhlIHJhdGUgYXQgd2hpY2ggYGNhbGxiYWNrYFxuICAgKiBpcyBleGVjdXRlZC5cbiAgICovXG5cblxuICBmdW5jdGlvbiB3cmFwcGVyKCkge1xuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmd1bWVudHNfID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJndW1lbnRzX1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIGVsYXBzZWQgPSBEYXRlLm5vdygpIC0gbGFzdEV4ZWM7XG5cbiAgICBpZiAoY2FuY2VsbGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBFeGVjdXRlIGBjYWxsYmFja2AgYW5kIHVwZGF0ZSB0aGUgYGxhc3RFeGVjYCB0aW1lc3RhbXAuXG5cblxuICAgIGZ1bmN0aW9uIGV4ZWMoKSB7XG4gICAgICBsYXN0RXhlYyA9IERhdGUubm93KCk7XG4gICAgICBjYWxsYmFjay5hcHBseShzZWxmLCBhcmd1bWVudHNfKTtcbiAgICB9XG4gICAgLypcbiAgICAgKiBJZiBgZGVib3VuY2VNb2RlYCBpcyB0cnVlIChhdCBiZWdpbikgdGhpcyBpcyB1c2VkIHRvIGNsZWFyIHRoZSBmbGFnXG4gICAgICogdG8gYWxsb3cgZnV0dXJlIGBjYWxsYmFja2AgZXhlY3V0aW9ucy5cbiAgICAgKi9cblxuXG4gICAgZnVuY3Rpb24gY2xlYXIoKSB7XG4gICAgICB0aW1lb3V0SUQgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKCFub0xlYWRpbmcgJiYgZGVib3VuY2VNb2RlICYmICF0aW1lb3V0SUQpIHtcbiAgICAgIC8qXG4gICAgICAgKiBTaW5jZSBgd3JhcHBlcmAgaXMgYmVpbmcgY2FsbGVkIGZvciB0aGUgZmlyc3QgdGltZSBhbmRcbiAgICAgICAqIGBkZWJvdW5jZU1vZGVgIGlzIHRydWUgKGF0IGJlZ2luKSwgZXhlY3V0ZSBgY2FsbGJhY2tgXG4gICAgICAgKiBhbmQgbm9MZWFkaW5nICE9IHRydWUuXG4gICAgICAgKi9cbiAgICAgIGV4ZWMoKTtcbiAgICB9XG5cbiAgICBjbGVhckV4aXN0aW5nVGltZW91dCgpO1xuXG4gICAgaWYgKGRlYm91bmNlTW9kZSA9PT0gdW5kZWZpbmVkICYmIGVsYXBzZWQgPiBkZWxheSkge1xuICAgICAgaWYgKG5vTGVhZGluZykge1xuICAgICAgICAvKlxuICAgICAgICAgKiBJbiB0aHJvdHRsZSBtb2RlIHdpdGggbm9MZWFkaW5nLCBpZiBgZGVsYXlgIHRpbWUgaGFzXG4gICAgICAgICAqIGJlZW4gZXhjZWVkZWQsIHVwZGF0ZSBgbGFzdEV4ZWNgIGFuZCBzY2hlZHVsZSBgY2FsbGJhY2tgXG4gICAgICAgICAqIHRvIGV4ZWN1dGUgYWZ0ZXIgYGRlbGF5YCBtcy5cbiAgICAgICAgICovXG4gICAgICAgIGxhc3RFeGVjID0gRGF0ZS5ub3coKTtcblxuICAgICAgICBpZiAoIW5vVHJhaWxpbmcpIHtcbiAgICAgICAgICB0aW1lb3V0SUQgPSBzZXRUaW1lb3V0KGRlYm91bmNlTW9kZSA/IGNsZWFyIDogZXhlYywgZGVsYXkpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvKlxuICAgICAgICAgKiBJbiB0aHJvdHRsZSBtb2RlIHdpdGhvdXQgbm9MZWFkaW5nLCBpZiBgZGVsYXlgIHRpbWUgaGFzIGJlZW4gZXhjZWVkZWQsIGV4ZWN1dGVcbiAgICAgICAgICogYGNhbGxiYWNrYC5cbiAgICAgICAgICovXG4gICAgICAgIGV4ZWMoKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG5vVHJhaWxpbmcgIT09IHRydWUpIHtcbiAgICAgIC8qXG4gICAgICAgKiBJbiB0cmFpbGluZyB0aHJvdHRsZSBtb2RlLCBzaW5jZSBgZGVsYXlgIHRpbWUgaGFzIG5vdCBiZWVuXG4gICAgICAgKiBleGNlZWRlZCwgc2NoZWR1bGUgYGNhbGxiYWNrYCB0byBleGVjdXRlIGBkZWxheWAgbXMgYWZ0ZXIgbW9zdFxuICAgICAgICogcmVjZW50IGV4ZWN1dGlvbi5cbiAgICAgICAqXG4gICAgICAgKiBJZiBgZGVib3VuY2VNb2RlYCBpcyB0cnVlIChhdCBiZWdpbiksIHNjaGVkdWxlIGBjbGVhcmAgdG8gZXhlY3V0ZVxuICAgICAgICogYWZ0ZXIgYGRlbGF5YCBtcy5cbiAgICAgICAqXG4gICAgICAgKiBJZiBgZGVib3VuY2VNb2RlYCBpcyBmYWxzZSAoYXQgZW5kKSwgc2NoZWR1bGUgYGNhbGxiYWNrYCB0b1xuICAgICAgICogZXhlY3V0ZSBhZnRlciBgZGVsYXlgIG1zLlxuICAgICAgICovXG4gICAgICB0aW1lb3V0SUQgPSBzZXRUaW1lb3V0KGRlYm91bmNlTW9kZSA/IGNsZWFyIDogZXhlYywgZGVib3VuY2VNb2RlID09PSB1bmRlZmluZWQgPyBkZWxheSAtIGVsYXBzZWQgOiBkZWxheSk7XG4gICAgfVxuICB9XG5cbiAgd3JhcHBlci5jYW5jZWwgPSBjYW5jZWw7IC8vIFJldHVybiB0aGUgd3JhcHBlciBmdW5jdGlvbi5cblxuICByZXR1cm4gd3JhcHBlcjtcbn1cblxuLyogZXNsaW50LWRpc2FibGUgbm8tdW5kZWZpbmVkICovXG4vKipcbiAqIERlYm91bmNlIGV4ZWN1dGlvbiBvZiBhIGZ1bmN0aW9uLiBEZWJvdW5jaW5nLCB1bmxpa2UgdGhyb3R0bGluZyxcbiAqIGd1YXJhbnRlZXMgdGhhdCBhIGZ1bmN0aW9uIGlzIG9ubHkgZXhlY3V0ZWQgYSBzaW5nbGUgdGltZSwgZWl0aGVyIGF0IHRoZVxuICogdmVyeSBiZWdpbm5pbmcgb2YgYSBzZXJpZXMgb2YgY2FsbHMsIG9yIGF0IHRoZSB2ZXJ5IGVuZC5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gZGVsYXkgLSAgICAgICAgICAgICAgIEEgemVyby1vci1ncmVhdGVyIGRlbGF5IGluIG1pbGxpc2Vjb25kcy4gRm9yIGV2ZW50IGNhbGxiYWNrcywgdmFsdWVzIGFyb3VuZCAxMDAgb3IgMjUwIChvciBldmVuIGhpZ2hlcikgYXJlIG1vc3QgdXNlZnVsLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgLSAgICAgICAgICBBIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIGFmdGVyIGRlbGF5IG1pbGxpc2Vjb25kcy4gVGhlIGB0aGlzYCBjb250ZXh0IGFuZCBhbGwgYXJndW1lbnRzIGFyZSBwYXNzZWQgdGhyb3VnaCwgYXMtaXMsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBgY2FsbGJhY2tgIHdoZW4gdGhlIGRlYm91bmNlZC1mdW5jdGlvbiBpcyBleGVjdXRlZC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc10gLSAgICAgICAgICAgQW4gb2JqZWN0IHRvIGNvbmZpZ3VyZSBvcHRpb25zLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5hdEJlZ2luXSAtICBPcHRpb25hbCwgZGVmYXVsdHMgdG8gZmFsc2UuIElmIGF0QmVnaW4gaXMgZmFsc2Ugb3IgdW5zcGVjaWZpZWQsIGNhbGxiYWNrIHdpbGwgb25seSBiZSBleGVjdXRlZCBgZGVsYXlgIG1pbGxpc2Vjb25kc1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXIgdGhlIGxhc3QgZGVib3VuY2VkLWZ1bmN0aW9uIGNhbGwuIElmIGF0QmVnaW4gaXMgdHJ1ZSwgY2FsbGJhY2sgd2lsbCBiZSBleGVjdXRlZCBvbmx5IGF0IHRoZSBmaXJzdCBkZWJvdW5jZWQtZnVuY3Rpb24gY2FsbC5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBZnRlciB0aGUgdGhyb3R0bGVkLWZ1bmN0aW9uIGhhcyBub3QgYmVlbiBjYWxsZWQgZm9yIGBkZWxheWAgbWlsbGlzZWNvbmRzLCB0aGUgaW50ZXJuYWwgY291bnRlciBpcyByZXNldCkuXG4gKlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBBIG5ldywgZGVib3VuY2VkIGZ1bmN0aW9uLlxuICovXG5cbmZ1bmN0aW9uIGRlYm91bmNlJDEgKGRlbGF5LCBjYWxsYmFjaywgb3B0aW9ucykge1xuICB2YXIgX3JlZiA9IG9wdGlvbnMgfHwge30sXG4gICAgICBfcmVmJGF0QmVnaW4gPSBfcmVmLmF0QmVnaW4sXG4gICAgICBhdEJlZ2luID0gX3JlZiRhdEJlZ2luID09PSB2b2lkIDAgPyBmYWxzZSA6IF9yZWYkYXRCZWdpbjtcblxuICByZXR1cm4gdGhyb3R0bGUkMShkZWxheSwgY2FsbGJhY2ssIHtcbiAgICBkZWJvdW5jZU1vZGU6IGF0QmVnaW4gIT09IGZhbHNlXG4gIH0pO1xufVxuXG5mdW5jdGlvbiB0aHJvdHRsZSguLi5hcmdzKSB7XG4gIHJldHVybiB0aHJvdHRsZSQxKC4uLmFyZ3MpO1xufVxuZnVuY3Rpb24gZGVib3VuY2UoLi4uYXJncykge1xuICByZXR1cm4gZGVib3VuY2UkMSguLi5hcmdzKTtcbn1cblxuZXhwb3J0IHsgYXNzZXJ0LCBhdCwgYmF0Y2hJbnZva2UsIGNhcGl0YWxpemUsIGNsYW1wLCBjbGFtcEFycmF5UmFuZ2UsIGNsZWFyVW5kZWZpbmVkLCBjcmVhdGVDb250cm9sbGVkUHJvbWlzZSwgY3JlYXRlUHJvbWlzZUxvY2ssIGNyZWF0ZVNpbmdsZXRvblByb21pc2UsIGRlYm91bmNlLCBkZWVwTWVyZ2UsIGRlZXBNZXJnZVdpdGhBcnJheSwgZW5zdXJlUHJlZml4LCBlbnN1cmVTdWZmaXgsIGZpbHRlckluUGxhY2UsIGZsYXR0ZW5BcnJheWFibGUsIGdldFR5cGVOYW1lLCBoYXNPd25Qcm9wZXJ0eSwgaW52b2tlLCBpc0Jvb2xlYW4sIGlzQnJvd3NlciwgaXNEYXRlLCBpc0RlZXBFcXVhbCwgaXNEZWYsIGlzRnVuY3Rpb24sIGlzS2V5T2YsIGlzTnVsbCwgaXNOdW1iZXIsIGlzT2JqZWN0LCBpc1ByaW1pdGl2ZSwgaXNSZWdFeHAsIGlzU3RyaW5nLCBpc1RydXRoeSwgaXNVbmRlZmluZWQsIGlzV2luZG93LCBsYXN0LCBsZXJwLCBtZXJnZUFycmF5YWJsZSwgbW92ZSwgbm9OdWxsLCBub29wLCBub3ROdWxsaXNoLCBub3RVbmRlZmluZWQsIG9iamVjdEVudHJpZXMsIG9iamVjdElkLCBvYmplY3RLZXlzLCBvYmplY3RNYXAsIG9iamVjdE9taXQsIG9iamVjdFBpY2ssIHAsIHBhcnRpdGlvbiwgcmFuZG9tU3RyLCByYW5nZSwgcmVtYXAsIHJlbW92ZSwgc2FtcGxlLCBzaHVmZmxlLCBzbGFzaCwgc2xlZXAsIHN1bSwgdGFwLCB0ZW1wbGF0ZSwgdGhyb3R0bGUsIHRpbWVzdGFtcCwgdG9BcnJheSwgdG9TdHJpbmcsIHVuaW5kZW50LCB1bmlxLCB1bmlxdWVCeSB9O1xuIiwiaW1wb3J0IHsgaXNOdW1iZXIsIHJhbmdlLCB1bmlxIH0gZnJvbSBcIkBhbnRmdS91dGlsc1wiO1xuLy8jcmVnaW9uIHNyYy90aW1lc3BsaXQvdGltZXN0cmluZy50c1xuLyoqXG4qIFBhcnNlIHRpbWVzdGFtcCBpbnRvIHNlY29uZHNcbipcbiogQWNjZXB0czpcbiogLSAxMDo1MC4xXG4qIC0gMTBzXG4qIC0gNW1cbiogLSAzbWluXG4qIC0gM21pbnMgNXNlY3NcbiogLSAxMC41bTNzXG4qIC0gKzEwc1xuKiAtIDFoMTBtMzBzXG4qIC0gMWg0c1xuKiAtIDE6MToxXG4qL1xuY29uc3QgUkVfQUxQSEEgPSAvW2Etel0vaTtcbmZ1bmN0aW9uIHBhcnNlVGltZVN0cmluZyh0aW1lc3RhbXApIHtcblx0aWYgKHR5cGVvZiB0aW1lc3RhbXAgPT09IFwibnVtYmVyXCIpIHJldHVybiB7XG5cdFx0c2Vjb25kczogdGltZXN0YW1wLFxuXHRcdHJlbGF0aXZlOiBmYWxzZVxuXHR9O1xuXHRjb25zdCByZWxhdGl2ZSA9IHRpbWVzdGFtcC5zdGFydHNXaXRoKFwiK1wiKTtcblx0aWYgKHJlbGF0aXZlKSB0aW1lc3RhbXAgPSB0aW1lc3RhbXAuc2xpY2UoMSk7XG5cdGxldCBzZWNvbmRzID0gMDtcblx0aWYgKHRpbWVzdGFtcC5pbmNsdWRlcyhcIjpcIikpIHtcblx0XHRjb25zdCBwYXJ0cyA9IHRpbWVzdGFtcC5zcGxpdChcIjpcIikubWFwKE51bWJlcik7XG5cdFx0bGV0IGggPSAwO1xuXHRcdGxldCBtID0gMDtcblx0XHRsZXQgcyA9IDA7XG5cdFx0aWYgKHBhcnRzLmxlbmd0aCA9PT0gMykge1xuXHRcdFx0aCA9IHBhcnRzWzBdO1xuXHRcdFx0bSA9IHBhcnRzWzFdO1xuXHRcdFx0cyA9IHBhcnRzWzJdO1xuXHRcdH0gZWxzZSBpZiAocGFydHMubGVuZ3RoID09PSAyKSB7XG5cdFx0XHRtID0gcGFydHNbMF07XG5cdFx0XHRzID0gcGFydHNbMV07XG5cdFx0fSBlbHNlIGlmIChwYXJ0cy5sZW5ndGggPT09IDEpIHMgPSBwYXJ0c1swXTtcblx0XHRlbHNlIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIHRpbWVzdGFtcCBmb3JtYXRcIik7XG5cdFx0aWYgKE51bWJlci5pc05hTihoKSB8fCBOdW1iZXIuaXNOYU4obSkgfHwgTnVtYmVyLmlzTmFOKHMpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCB0aW1lc3RhbXAgZm9ybWF0XCIpO1xuXHRcdHNlY29uZHMgPSAoaCB8fCAwKSAqIDM2MDAgKyAobSB8fCAwKSAqIDYwICsgKHMgfHwgMCk7XG5cdH0gZWxzZSBpZiAoIVJFX0FMUEhBLnRlc3QodGltZXN0YW1wKSkge1xuXHRcdHNlY29uZHMgPSBOdW1iZXIodGltZXN0YW1wKTtcblx0XHRpZiAoTnVtYmVyLmlzTmFOKHNlY29uZHMpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCB0aW1lc3RhbXAgZm9ybWF0XCIpO1xuXHR9IGVsc2Uge1xuXHRcdGNvbnN0IHVuaXRNYXAgPSB7XG5cdFx0XHRzOiAxLFxuXHRcdFx0c2VjOiAxLFxuXHRcdFx0c2VjczogMSxcblx0XHRcdG06IDYwLFxuXHRcdFx0bWluOiA2MCxcblx0XHRcdG1pbnM6IDYwLFxuXHRcdFx0aDogMzYwMCxcblx0XHRcdGhyOiAzNjAwLFxuXHRcdFx0aHJzOiAzNjAwLFxuXHRcdFx0aG91cjogMzYwMCxcblx0XHRcdGhvdXJzOiAzNjAwLFxuXHRcdFx0ZGF5OiA4NjQwMCxcblx0XHRcdGRheXM6IDg2NDAwLFxuXHRcdFx0d2VlazogNjA0ODAwLFxuXHRcdFx0d2Vla3M6IDYwNDgwMCxcblx0XHRcdG1vbnRoOiAyNjI5NzQ2LFxuXHRcdFx0bW9udGhzOiAyNjI5NzQ2LFxuXHRcdFx0eWVhcjogMzE1NTY5NTIsXG5cdFx0XHR5ZWFyczogMzE1NTY5NTJcblx0XHR9O1xuXHRcdGNvbnN0IHJlZ2V4ID0gLyhbXFxkLl0rKShbYS16XSspL2dpO1xuXHRcdGNvbnN0IG1hdGNoZXMgPSB0aW1lc3RhbXAubWF0Y2hBbGwocmVnZXgpO1xuXHRcdGlmIChtYXRjaGVzKSBmb3IgKGNvbnN0IG1hdGNoIG9mIG1hdGNoZXMpIHtcblx0XHRcdGNvbnN0IHZhbHVlID0gTnVtYmVyKG1hdGNoWzFdKTtcblx0XHRcdGlmIChOdW1iZXIuaXNOYU4odmFsdWUpKSB0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIHRpbWVzdGFtcCB2YWx1ZTogJHttYXRjaFsxXX1gKTtcblx0XHRcdGNvbnN0IHVuaXQgPSBtYXRjaFsyXS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0aWYgKCEodW5pdCBpbiB1bml0TWFwKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCB0aW1lc3RhbXAgdW5pdDogJHt1bml0fWApO1xuXHRcdFx0c2Vjb25kcyArPSB2YWx1ZSAqIHVuaXRNYXBbdW5pdF07XG5cdFx0fVxuXHRcdGNvbnN0IHJlbWFpbmluZyA9IHRpbWVzdGFtcC5yZXBsYWNlKHJlZ2V4LCBcIlwiKS50cmltKCk7XG5cdFx0aWYgKHJlbWFpbmluZykgdGhyb3cgbmV3IFR5cGVFcnJvcihgVW5rbm93biB0aW1lc3RhbXAgcmVtYWluaW5nOiAke3JlbWFpbmluZ31gKTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdHNlY29uZHMsXG5cdFx0cmVsYXRpdmVcblx0fTtcbn1cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNyYy90aW1lc3BsaXQvdGltZXNwbGl0LnRzXG5mdW5jdGlvbiBwYXJzZVRpbWVzcGxpdHMoaW5wdXRzKSB7XG5cdGxldCB0cyA9IDA7XG5cdGNvbnN0IG91dHB1dHMgPSBbXTtcblx0bGV0IGN1cnJlbnQgPSB7XG5cdFx0dGltZXN0YW1wU3RhcnQ6IHRzLFxuXHRcdHRpbWVzdGFtcEVuZDogdHMsXG5cdFx0bm9TdGFydDogMCxcblx0XHRub0VuZDogMCxcblx0XHR0aXRsZTogXCJbc3RhcnRdXCJcblx0fTtcblx0b3V0cHV0cy5wdXNoKGN1cnJlbnQpO1xuXHRmb3IgKGNvbnN0IGlucHV0IG9mIGlucHV0cykge1xuXHRcdGNvbnN0IHRpbWUgPSBwYXJzZVRpbWVTdHJpbmcoaW5wdXQudGltZXNwbGl0KTtcblx0XHRjb25zdCBlbmQgPSB0aW1lLnJlbGF0aXZlID8gdHMgKyB0aW1lLnNlY29uZHMgOiB0aW1lLnNlY29uZHM7XG5cdFx0aWYgKGVuZCA8IHRzKSB0aHJvdyBuZXcgRXJyb3IoYFRpbWVzcGxpdCBlbmQgJHtlbmR9IGlzIGJlZm9yZSBzdGFydCAke3RzfWApO1xuXHRcdGN1cnJlbnQudGltZXN0YW1wRW5kID0gZW5kO1xuXHRcdGN1cnJlbnQubm9FbmQgPSBpbnB1dC5ubztcblx0XHRpZiAoaW5wdXQudGl0bGUpIGN1cnJlbnQudGl0bGUgPSBpbnB1dC50aXRsZTtcblx0XHR0cyA9IGVuZDtcblx0XHRjdXJyZW50ID0ge1xuXHRcdFx0dGltZXN0YW1wU3RhcnQ6IGVuZCxcblx0XHRcdHRpbWVzdGFtcEVuZDogZW5kLFxuXHRcdFx0bm9TdGFydDogaW5wdXQubm8sXG5cdFx0XHRub0VuZDogaW5wdXQubm9cblx0XHR9O1xuXHRcdG91dHB1dHMucHVzaChjdXJyZW50KTtcblx0fVxuXHRyZXR1cm4gb3V0cHV0cztcbn1cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNyYy91dGlscy50c1xuY29uc3QgUkVfQVNQRUNUX1JBVElPX1NFUEFSQVRPUiA9IC9bOi94fF0vO1xuLyoqXG4qIDEsMy01LDggPT4gWzEsIDMsIDQsIDUsIDhdXG4qL1xuZnVuY3Rpb24gcGFyc2VSYW5nZVN0cmluZyh0b3RhbCwgcmFuZ2VTdHIpIHtcblx0aWYgKCFyYW5nZVN0ciB8fCByYW5nZVN0ciA9PT0gXCJhbGxcIiB8fCByYW5nZVN0ciA9PT0gXCIqXCIpIHJldHVybiByYW5nZSgxLCB0b3RhbCArIDEpO1xuXHRpZiAocmFuZ2VTdHIgPT09IFwibm9uZVwiKSByZXR1cm4gW107XG5cdGNvbnN0IGluZGV4ZXMgPSBbXTtcblx0Zm9yIChjb25zdCBwYXJ0IG9mIHJhbmdlU3RyLnNwbGl0KC9bLDtdL2cpKSBpZiAoIXBhcnQuaW5jbHVkZXMoXCItXCIpKSBpbmRleGVzLnB1c2goK3BhcnQpO1xuXHRlbHNlIHtcblx0XHRjb25zdCBbc3RhcnQsIGVuZF0gPSBwYXJ0LnNwbGl0KFwiLVwiLCAyKTtcblx0XHRpbmRleGVzLnB1c2goLi4ucmFuZ2UoK3N0YXJ0LCAhZW5kID8gdG90YWwgKyAxIDogK2VuZCArIDEpKTtcblx0fVxuXHRyZXR1cm4gdW5pcShpbmRleGVzKS5maWx0ZXIoKGkpID0+IGkgPD0gdG90YWwpLnNvcnQoKGEsIGIpID0+IGEgLSBiKTtcbn1cbi8qKlxuKiBBY2NlcHRzIGAxNi85YCBgMToxYCBgM3g0YFxuKi9cbmZ1bmN0aW9uIHBhcnNlQXNwZWN0UmF0aW8oc3RyKSB7XG5cdGlmIChpc051bWJlcihzdHIpKSByZXR1cm4gc3RyO1xuXHRpZiAoIU51bWJlci5pc05hTigrc3RyKSkgcmV0dXJuICtzdHI7XG5cdGNvbnN0IFt3U3RyID0gXCJcIiwgaFN0ciA9IFwiXCJdID0gc3RyLnNwbGl0KFJFX0FTUEVDVF9SQVRJT19TRVBBUkFUT1IpO1xuXHRjb25zdCB3ID0gTnVtYmVyLnBhcnNlRmxvYXQod1N0ci50cmltKCkpO1xuXHRjb25zdCBoID0gTnVtYmVyLnBhcnNlRmxvYXQoaFN0ci50cmltKCkpO1xuXHRpZiAoTnVtYmVyLmlzTmFOKHcpIHx8IE51bWJlci5pc05hTihoKSB8fCBoID09PSAwKSB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgYXNwZWN0IHJhdGlvIFwiJHtzdHJ9XCJgKTtcblx0cmV0dXJuIHcgLyBoO1xufVxuLy8jZW5kcmVnaW9uXG5leHBvcnQgeyBwYXJzZUFzcGVjdFJhdGlvLCBwYXJzZVJhbmdlU3RyaW5nLCBwYXJzZVRpbWVTdHJpbmcsIHBhcnNlVGltZXNwbGl0cyB9O1xuIiwiY29uc3QgQUxJQVMgPSBTeW1ib2wuZm9yKCd5YW1sLmFsaWFzJyk7XG5jb25zdCBET0MgPSBTeW1ib2wuZm9yKCd5YW1sLmRvY3VtZW50Jyk7XG5jb25zdCBNQVAgPSBTeW1ib2wuZm9yKCd5YW1sLm1hcCcpO1xuY29uc3QgUEFJUiA9IFN5bWJvbC5mb3IoJ3lhbWwucGFpcicpO1xuY29uc3QgU0NBTEFSID0gU3ltYm9sLmZvcigneWFtbC5zY2FsYXInKTtcbmNvbnN0IFNFUSA9IFN5bWJvbC5mb3IoJ3lhbWwuc2VxJyk7XG5jb25zdCBOT0RFX1RZUEUgPSBTeW1ib2wuZm9yKCd5YW1sLm5vZGUudHlwZScpO1xuY29uc3QgaXNBbGlhcyA9IChub2RlKSA9PiAhIW5vZGUgJiYgdHlwZW9mIG5vZGUgPT09ICdvYmplY3QnICYmIG5vZGVbTk9ERV9UWVBFXSA9PT0gQUxJQVM7XG5jb25zdCBpc0RvY3VtZW50ID0gKG5vZGUpID0+ICEhbm9kZSAmJiB0eXBlb2Ygbm9kZSA9PT0gJ29iamVjdCcgJiYgbm9kZVtOT0RFX1RZUEVdID09PSBET0M7XG5jb25zdCBpc01hcCA9IChub2RlKSA9PiAhIW5vZGUgJiYgdHlwZW9mIG5vZGUgPT09ICdvYmplY3QnICYmIG5vZGVbTk9ERV9UWVBFXSA9PT0gTUFQO1xuY29uc3QgaXNQYWlyID0gKG5vZGUpID0+ICEhbm9kZSAmJiB0eXBlb2Ygbm9kZSA9PT0gJ29iamVjdCcgJiYgbm9kZVtOT0RFX1RZUEVdID09PSBQQUlSO1xuY29uc3QgaXNTY2FsYXIgPSAobm9kZSkgPT4gISFub2RlICYmIHR5cGVvZiBub2RlID09PSAnb2JqZWN0JyAmJiBub2RlW05PREVfVFlQRV0gPT09IFNDQUxBUjtcbmNvbnN0IGlzU2VxID0gKG5vZGUpID0+ICEhbm9kZSAmJiB0eXBlb2Ygbm9kZSA9PT0gJ29iamVjdCcgJiYgbm9kZVtOT0RFX1RZUEVdID09PSBTRVE7XG5mdW5jdGlvbiBpc0NvbGxlY3Rpb24obm9kZSkge1xuICAgIGlmIChub2RlICYmIHR5cGVvZiBub2RlID09PSAnb2JqZWN0JylcbiAgICAgICAgc3dpdGNoIChub2RlW05PREVfVFlQRV0pIHtcbiAgICAgICAgICAgIGNhc2UgTUFQOlxuICAgICAgICAgICAgY2FzZSBTRVE6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBpc05vZGUobm9kZSkge1xuICAgIGlmIChub2RlICYmIHR5cGVvZiBub2RlID09PSAnb2JqZWN0JylcbiAgICAgICAgc3dpdGNoIChub2RlW05PREVfVFlQRV0pIHtcbiAgICAgICAgICAgIGNhc2UgQUxJQVM6XG4gICAgICAgICAgICBjYXNlIE1BUDpcbiAgICAgICAgICAgIGNhc2UgU0NBTEFSOlxuICAgICAgICAgICAgY2FzZSBTRVE6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5jb25zdCBoYXNBbmNob3IgPSAobm9kZSkgPT4gKGlzU2NhbGFyKG5vZGUpIHx8IGlzQ29sbGVjdGlvbihub2RlKSkgJiYgISFub2RlLmFuY2hvcjtcblxuZXhwb3J0IHsgQUxJQVMsIERPQywgTUFQLCBOT0RFX1RZUEUsIFBBSVIsIFNDQUxBUiwgU0VRLCBoYXNBbmNob3IsIGlzQWxpYXMsIGlzQ29sbGVjdGlvbiwgaXNEb2N1bWVudCwgaXNNYXAsIGlzTm9kZSwgaXNQYWlyLCBpc1NjYWxhciwgaXNTZXEgfTtcbiIsImltcG9ydCB7IGlzRG9jdW1lbnQsIGlzTm9kZSwgaXNQYWlyLCBpc0NvbGxlY3Rpb24sIGlzTWFwLCBpc1NlcSwgaXNTY2FsYXIsIGlzQWxpYXMgfSBmcm9tICcuL25vZGVzL2lkZW50aXR5LmpzJztcblxuY29uc3QgQlJFQUsgPSBTeW1ib2woJ2JyZWFrIHZpc2l0Jyk7XG5jb25zdCBTS0lQID0gU3ltYm9sKCdza2lwIGNoaWxkcmVuJyk7XG5jb25zdCBSRU1PVkUgPSBTeW1ib2woJ3JlbW92ZSBub2RlJyk7XG4vKipcbiAqIEFwcGx5IGEgdmlzaXRvciB0byBhbiBBU1Qgbm9kZSBvciBkb2N1bWVudC5cbiAqXG4gKiBXYWxrcyB0aHJvdWdoIHRoZSB0cmVlIChkZXB0aC1maXJzdCkgc3RhcnRpbmcgZnJvbSBgbm9kZWAsIGNhbGxpbmcgYVxuICogYHZpc2l0b3JgIGZ1bmN0aW9uIHdpdGggdGhyZWUgYXJndW1lbnRzOlxuICogICAtIGBrZXlgOiBGb3Igc2VxdWVuY2UgdmFsdWVzIGFuZCBtYXAgYFBhaXJgLCB0aGUgbm9kZSdzIGluZGV4IGluIHRoZVxuICogICAgIGNvbGxlY3Rpb24uIFdpdGhpbiBhIGBQYWlyYCwgYCdrZXknYCBvciBgJ3ZhbHVlJ2AsIGNvcnJlc3BvbmRpbmdseS5cbiAqICAgICBgbnVsbGAgZm9yIHRoZSByb290IG5vZGUuXG4gKiAgIC0gYG5vZGVgOiBUaGUgY3VycmVudCBub2RlLlxuICogICAtIGBwYXRoYDogVGhlIGFuY2VzdHJ5IG9mIHRoZSBjdXJyZW50IG5vZGUuXG4gKlxuICogVGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgdmlzaXRvciBtYXkgYmUgdXNlZCB0byBjb250cm9sIHRoZSB0cmF2ZXJzYWw6XG4gKiAgIC0gYHVuZGVmaW5lZGAgKGRlZmF1bHQpOiBEbyBub3RoaW5nIGFuZCBjb250aW51ZVxuICogICAtIGB2aXNpdC5TS0lQYDogRG8gbm90IHZpc2l0IHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUsIGNvbnRpbnVlIHdpdGggbmV4dFxuICogICAgIHNpYmxpbmdcbiAqICAgLSBgdmlzaXQuQlJFQUtgOiBUZXJtaW5hdGUgdHJhdmVyc2FsIGNvbXBsZXRlbHlcbiAqICAgLSBgdmlzaXQuUkVNT1ZFYDogUmVtb3ZlIHRoZSBjdXJyZW50IG5vZGUsIHRoZW4gY29udGludWUgd2l0aCB0aGUgbmV4dCBvbmVcbiAqICAgLSBgTm9kZWA6IFJlcGxhY2UgdGhlIGN1cnJlbnQgbm9kZSwgdGhlbiBjb250aW51ZSBieSB2aXNpdGluZyBpdFxuICogICAtIGBudW1iZXJgOiBXaGlsZSBpdGVyYXRpbmcgdGhlIGl0ZW1zIG9mIGEgc2VxdWVuY2Ugb3IgbWFwLCBzZXQgdGhlIGluZGV4XG4gKiAgICAgb2YgdGhlIG5leHQgc3RlcC4gVGhpcyBpcyB1c2VmdWwgZXNwZWNpYWxseSBpZiB0aGUgaW5kZXggb2YgdGhlIGN1cnJlbnRcbiAqICAgICBub2RlIGhhcyBjaGFuZ2VkLlxuICpcbiAqIElmIGB2aXNpdG9yYCBpcyBhIHNpbmdsZSBmdW5jdGlvbiwgaXQgd2lsbCBiZSBjYWxsZWQgd2l0aCBhbGwgdmFsdWVzXG4gKiBlbmNvdW50ZXJlZCBpbiB0aGUgdHJlZSwgaW5jbHVkaW5nIGUuZy4gYG51bGxgIHZhbHVlcy4gQWx0ZXJuYXRpdmVseSxcbiAqIHNlcGFyYXRlIHZpc2l0b3IgZnVuY3Rpb25zIG1heSBiZSBkZWZpbmVkIGZvciBlYWNoIGBNYXBgLCBgUGFpcmAsIGBTZXFgLFxuICogYEFsaWFzYCBhbmQgYFNjYWxhcmAgbm9kZS4gVG8gZGVmaW5lIHRoZSBzYW1lIHZpc2l0b3IgZnVuY3Rpb24gZm9yIG1vcmUgdGhhblxuICogb25lIG5vZGUgdHlwZSwgdXNlIHRoZSBgQ29sbGVjdGlvbmAgKG1hcCBhbmQgc2VxKSwgYFZhbHVlYCAobWFwLCBzZXEgJiBzY2FsYXIpXG4gKiBhbmQgYE5vZGVgIChhbGlhcywgbWFwLCBzZXEgJiBzY2FsYXIpIHRhcmdldHMuIE9mIGFsbCB0aGVzZSwgb25seSB0aGUgbW9zdFxuICogc3BlY2lmaWMgZGVmaW5lZCBvbmUgd2lsbCBiZSB1c2VkIGZvciBlYWNoIG5vZGUuXG4gKi9cbmZ1bmN0aW9uIHZpc2l0KG5vZGUsIHZpc2l0b3IpIHtcbiAgICBjb25zdCB2aXNpdG9yXyA9IGluaXRWaXNpdG9yKHZpc2l0b3IpO1xuICAgIGlmIChpc0RvY3VtZW50KG5vZGUpKSB7XG4gICAgICAgIGNvbnN0IGNkID0gdmlzaXRfKG51bGwsIG5vZGUuY29udGVudHMsIHZpc2l0b3JfLCBPYmplY3QuZnJlZXplKFtub2RlXSkpO1xuICAgICAgICBpZiAoY2QgPT09IFJFTU9WRSlcbiAgICAgICAgICAgIG5vZGUuY29udGVudHMgPSBudWxsO1xuICAgIH1cbiAgICBlbHNlXG4gICAgICAgIHZpc2l0XyhudWxsLCBub2RlLCB2aXNpdG9yXywgT2JqZWN0LmZyZWV6ZShbXSkpO1xufVxuLy8gV2l0aG91dCB0aGUgYGFzIHN5bWJvbGAgY2FzdHMsIFRTIGRlY2xhcmVzIHRoZXNlIGluIHRoZSBgdmlzaXRgXG4vLyBuYW1lc3BhY2UgdXNpbmcgYHZhcmAsIGJ1dCB0aGVuIGNvbXBsYWlucyBhYm91dCB0aGF0IGJlY2F1c2Vcbi8vIGB1bmlxdWUgc3ltYm9sYCBtdXN0IGJlIGBjb25zdGAuXG4vKiogVGVybWluYXRlIHZpc2l0IHRyYXZlcnNhbCBjb21wbGV0ZWx5ICovXG52aXNpdC5CUkVBSyA9IEJSRUFLO1xuLyoqIERvIG5vdCB2aXNpdCB0aGUgY2hpbGRyZW4gb2YgdGhlIGN1cnJlbnQgbm9kZSAqL1xudmlzaXQuU0tJUCA9IFNLSVA7XG4vKiogUmVtb3ZlIHRoZSBjdXJyZW50IG5vZGUgKi9cbnZpc2l0LlJFTU9WRSA9IFJFTU9WRTtcbmZ1bmN0aW9uIHZpc2l0XyhrZXksIG5vZGUsIHZpc2l0b3IsIHBhdGgpIHtcbiAgICBjb25zdCBjdHJsID0gY2FsbFZpc2l0b3Ioa2V5LCBub2RlLCB2aXNpdG9yLCBwYXRoKTtcbiAgICBpZiAoaXNOb2RlKGN0cmwpIHx8IGlzUGFpcihjdHJsKSkge1xuICAgICAgICByZXBsYWNlTm9kZShrZXksIHBhdGgsIGN0cmwpO1xuICAgICAgICByZXR1cm4gdmlzaXRfKGtleSwgY3RybCwgdmlzaXRvciwgcGF0aCk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgY3RybCAhPT0gJ3N5bWJvbCcpIHtcbiAgICAgICAgaWYgKGlzQ29sbGVjdGlvbihub2RlKSkge1xuICAgICAgICAgICAgcGF0aCA9IE9iamVjdC5mcmVlemUocGF0aC5jb25jYXQobm9kZSkpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLml0ZW1zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2kgPSB2aXNpdF8oaSwgbm9kZS5pdGVtc1tpXSwgdmlzaXRvciwgcGF0aCk7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjaSA9PT0gJ251bWJlcicpXG4gICAgICAgICAgICAgICAgICAgIGkgPSBjaSAtIDE7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoY2kgPT09IEJSRUFLKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gQlJFQUs7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoY2kgPT09IFJFTU9WRSkge1xuICAgICAgICAgICAgICAgICAgICBub2RlLml0ZW1zLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgaSAtPSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc1BhaXIobm9kZSkpIHtcbiAgICAgICAgICAgIHBhdGggPSBPYmplY3QuZnJlZXplKHBhdGguY29uY2F0KG5vZGUpKTtcbiAgICAgICAgICAgIGNvbnN0IGNrID0gdmlzaXRfKCdrZXknLCBub2RlLmtleSwgdmlzaXRvciwgcGF0aCk7XG4gICAgICAgICAgICBpZiAoY2sgPT09IEJSRUFLKVxuICAgICAgICAgICAgICAgIHJldHVybiBCUkVBSztcbiAgICAgICAgICAgIGVsc2UgaWYgKGNrID09PSBSRU1PVkUpXG4gICAgICAgICAgICAgICAgbm9kZS5rZXkgPSBudWxsO1xuICAgICAgICAgICAgY29uc3QgY3YgPSB2aXNpdF8oJ3ZhbHVlJywgbm9kZS52YWx1ZSwgdmlzaXRvciwgcGF0aCk7XG4gICAgICAgICAgICBpZiAoY3YgPT09IEJSRUFLKVxuICAgICAgICAgICAgICAgIHJldHVybiBCUkVBSztcbiAgICAgICAgICAgIGVsc2UgaWYgKGN2ID09PSBSRU1PVkUpXG4gICAgICAgICAgICAgICAgbm9kZS52YWx1ZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGN0cmw7XG59XG4vKipcbiAqIEFwcGx5IGFuIGFzeW5jIHZpc2l0b3IgdG8gYW4gQVNUIG5vZGUgb3IgZG9jdW1lbnQuXG4gKlxuICogV2Fsa3MgdGhyb3VnaCB0aGUgdHJlZSAoZGVwdGgtZmlyc3QpIHN0YXJ0aW5nIGZyb20gYG5vZGVgLCBjYWxsaW5nIGFcbiAqIGB2aXNpdG9yYCBmdW5jdGlvbiB3aXRoIHRocmVlIGFyZ3VtZW50czpcbiAqICAgLSBga2V5YDogRm9yIHNlcXVlbmNlIHZhbHVlcyBhbmQgbWFwIGBQYWlyYCwgdGhlIG5vZGUncyBpbmRleCBpbiB0aGVcbiAqICAgICBjb2xsZWN0aW9uLiBXaXRoaW4gYSBgUGFpcmAsIGAna2V5J2Agb3IgYCd2YWx1ZSdgLCBjb3JyZXNwb25kaW5nbHkuXG4gKiAgICAgYG51bGxgIGZvciB0aGUgcm9vdCBub2RlLlxuICogICAtIGBub2RlYDogVGhlIGN1cnJlbnQgbm9kZS5cbiAqICAgLSBgcGF0aGA6IFRoZSBhbmNlc3RyeSBvZiB0aGUgY3VycmVudCBub2RlLlxuICpcbiAqIFRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIHZpc2l0b3IgbWF5IGJlIHVzZWQgdG8gY29udHJvbCB0aGUgdHJhdmVyc2FsOlxuICogICAtIGBQcm9taXNlYDogTXVzdCByZXNvbHZlIHRvIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlc1xuICogICAtIGB1bmRlZmluZWRgIChkZWZhdWx0KTogRG8gbm90aGluZyBhbmQgY29udGludWVcbiAqICAgLSBgdmlzaXQuU0tJUGA6IERvIG5vdCB2aXNpdCB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlLCBjb250aW51ZSB3aXRoIG5leHRcbiAqICAgICBzaWJsaW5nXG4gKiAgIC0gYHZpc2l0LkJSRUFLYDogVGVybWluYXRlIHRyYXZlcnNhbCBjb21wbGV0ZWx5XG4gKiAgIC0gYHZpc2l0LlJFTU9WRWA6IFJlbW92ZSB0aGUgY3VycmVudCBub2RlLCB0aGVuIGNvbnRpbnVlIHdpdGggdGhlIG5leHQgb25lXG4gKiAgIC0gYE5vZGVgOiBSZXBsYWNlIHRoZSBjdXJyZW50IG5vZGUsIHRoZW4gY29udGludWUgYnkgdmlzaXRpbmcgaXRcbiAqICAgLSBgbnVtYmVyYDogV2hpbGUgaXRlcmF0aW5nIHRoZSBpdGVtcyBvZiBhIHNlcXVlbmNlIG9yIG1hcCwgc2V0IHRoZSBpbmRleFxuICogICAgIG9mIHRoZSBuZXh0IHN0ZXAuIFRoaXMgaXMgdXNlZnVsIGVzcGVjaWFsbHkgaWYgdGhlIGluZGV4IG9mIHRoZSBjdXJyZW50XG4gKiAgICAgbm9kZSBoYXMgY2hhbmdlZC5cbiAqXG4gKiBJZiBgdmlzaXRvcmAgaXMgYSBzaW5nbGUgZnVuY3Rpb24sIGl0IHdpbGwgYmUgY2FsbGVkIHdpdGggYWxsIHZhbHVlc1xuICogZW5jb3VudGVyZWQgaW4gdGhlIHRyZWUsIGluY2x1ZGluZyBlLmcuIGBudWxsYCB2YWx1ZXMuIEFsdGVybmF0aXZlbHksXG4gKiBzZXBhcmF0ZSB2aXNpdG9yIGZ1bmN0aW9ucyBtYXkgYmUgZGVmaW5lZCBmb3IgZWFjaCBgTWFwYCwgYFBhaXJgLCBgU2VxYCxcbiAqIGBBbGlhc2AgYW5kIGBTY2FsYXJgIG5vZGUuIFRvIGRlZmluZSB0aGUgc2FtZSB2aXNpdG9yIGZ1bmN0aW9uIGZvciBtb3JlIHRoYW5cbiAqIG9uZSBub2RlIHR5cGUsIHVzZSB0aGUgYENvbGxlY3Rpb25gIChtYXAgYW5kIHNlcSksIGBWYWx1ZWAgKG1hcCwgc2VxICYgc2NhbGFyKVxuICogYW5kIGBOb2RlYCAoYWxpYXMsIG1hcCwgc2VxICYgc2NhbGFyKSB0YXJnZXRzLiBPZiBhbGwgdGhlc2UsIG9ubHkgdGhlIG1vc3RcbiAqIHNwZWNpZmljIGRlZmluZWQgb25lIHdpbGwgYmUgdXNlZCBmb3IgZWFjaCBub2RlLlxuICovXG5hc3luYyBmdW5jdGlvbiB2aXNpdEFzeW5jKG5vZGUsIHZpc2l0b3IpIHtcbiAgICBjb25zdCB2aXNpdG9yXyA9IGluaXRWaXNpdG9yKHZpc2l0b3IpO1xuICAgIGlmIChpc0RvY3VtZW50KG5vZGUpKSB7XG4gICAgICAgIGNvbnN0IGNkID0gYXdhaXQgdmlzaXRBc3luY18obnVsbCwgbm9kZS5jb250ZW50cywgdmlzaXRvcl8sIE9iamVjdC5mcmVlemUoW25vZGVdKSk7XG4gICAgICAgIGlmIChjZCA9PT0gUkVNT1ZFKVxuICAgICAgICAgICAgbm9kZS5jb250ZW50cyA9IG51bGw7XG4gICAgfVxuICAgIGVsc2VcbiAgICAgICAgYXdhaXQgdmlzaXRBc3luY18obnVsbCwgbm9kZSwgdmlzaXRvcl8sIE9iamVjdC5mcmVlemUoW10pKTtcbn1cbi8vIFdpdGhvdXQgdGhlIGBhcyBzeW1ib2xgIGNhc3RzLCBUUyBkZWNsYXJlcyB0aGVzZSBpbiB0aGUgYHZpc2l0YFxuLy8gbmFtZXNwYWNlIHVzaW5nIGB2YXJgLCBidXQgdGhlbiBjb21wbGFpbnMgYWJvdXQgdGhhdCBiZWNhdXNlXG4vLyBgdW5pcXVlIHN5bWJvbGAgbXVzdCBiZSBgY29uc3RgLlxuLyoqIFRlcm1pbmF0ZSB2aXNpdCB0cmF2ZXJzYWwgY29tcGxldGVseSAqL1xudmlzaXRBc3luYy5CUkVBSyA9IEJSRUFLO1xuLyoqIERvIG5vdCB2aXNpdCB0aGUgY2hpbGRyZW4gb2YgdGhlIGN1cnJlbnQgbm9kZSAqL1xudmlzaXRBc3luYy5TS0lQID0gU0tJUDtcbi8qKiBSZW1vdmUgdGhlIGN1cnJlbnQgbm9kZSAqL1xudmlzaXRBc3luYy5SRU1PVkUgPSBSRU1PVkU7XG5hc3luYyBmdW5jdGlvbiB2aXNpdEFzeW5jXyhrZXksIG5vZGUsIHZpc2l0b3IsIHBhdGgpIHtcbiAgICBjb25zdCBjdHJsID0gYXdhaXQgY2FsbFZpc2l0b3Ioa2V5LCBub2RlLCB2aXNpdG9yLCBwYXRoKTtcbiAgICBpZiAoaXNOb2RlKGN0cmwpIHx8IGlzUGFpcihjdHJsKSkge1xuICAgICAgICByZXBsYWNlTm9kZShrZXksIHBhdGgsIGN0cmwpO1xuICAgICAgICByZXR1cm4gdmlzaXRBc3luY18oa2V5LCBjdHJsLCB2aXNpdG9yLCBwYXRoKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjdHJsICE9PSAnc3ltYm9sJykge1xuICAgICAgICBpZiAoaXNDb2xsZWN0aW9uKG5vZGUpKSB7XG4gICAgICAgICAgICBwYXRoID0gT2JqZWN0LmZyZWV6ZShwYXRoLmNvbmNhdChub2RlKSk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUuaXRlbXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjaSA9IGF3YWl0IHZpc2l0QXN5bmNfKGksIG5vZGUuaXRlbXNbaV0sIHZpc2l0b3IsIHBhdGgpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY2kgPT09ICdudW1iZXInKVxuICAgICAgICAgICAgICAgICAgICBpID0gY2kgLSAxO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNpID09PSBCUkVBSylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJSRUFLO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNpID09PSBSRU1PVkUpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5pdGVtcy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgICAgIGkgLT0gMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNQYWlyKG5vZGUpKSB7XG4gICAgICAgICAgICBwYXRoID0gT2JqZWN0LmZyZWV6ZShwYXRoLmNvbmNhdChub2RlKSk7XG4gICAgICAgICAgICBjb25zdCBjayA9IGF3YWl0IHZpc2l0QXN5bmNfKCdrZXknLCBub2RlLmtleSwgdmlzaXRvciwgcGF0aCk7XG4gICAgICAgICAgICBpZiAoY2sgPT09IEJSRUFLKVxuICAgICAgICAgICAgICAgIHJldHVybiBCUkVBSztcbiAgICAgICAgICAgIGVsc2UgaWYgKGNrID09PSBSRU1PVkUpXG4gICAgICAgICAgICAgICAgbm9kZS5rZXkgPSBudWxsO1xuICAgICAgICAgICAgY29uc3QgY3YgPSBhd2FpdCB2aXNpdEFzeW5jXygndmFsdWUnLCBub2RlLnZhbHVlLCB2aXNpdG9yLCBwYXRoKTtcbiAgICAgICAgICAgIGlmIChjdiA9PT0gQlJFQUspXG4gICAgICAgICAgICAgICAgcmV0dXJuIEJSRUFLO1xuICAgICAgICAgICAgZWxzZSBpZiAoY3YgPT09IFJFTU9WRSlcbiAgICAgICAgICAgICAgICBub2RlLnZhbHVlID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY3RybDtcbn1cbmZ1bmN0aW9uIGluaXRWaXNpdG9yKHZpc2l0b3IpIHtcbiAgICBpZiAodHlwZW9mIHZpc2l0b3IgPT09ICdvYmplY3QnICYmXG4gICAgICAgICh2aXNpdG9yLkNvbGxlY3Rpb24gfHwgdmlzaXRvci5Ob2RlIHx8IHZpc2l0b3IuVmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgIEFsaWFzOiB2aXNpdG9yLk5vZGUsXG4gICAgICAgICAgICBNYXA6IHZpc2l0b3IuTm9kZSxcbiAgICAgICAgICAgIFNjYWxhcjogdmlzaXRvci5Ob2RlLFxuICAgICAgICAgICAgU2VxOiB2aXNpdG9yLk5vZGVcbiAgICAgICAgfSwgdmlzaXRvci5WYWx1ZSAmJiB7XG4gICAgICAgICAgICBNYXA6IHZpc2l0b3IuVmFsdWUsXG4gICAgICAgICAgICBTY2FsYXI6IHZpc2l0b3IuVmFsdWUsXG4gICAgICAgICAgICBTZXE6IHZpc2l0b3IuVmFsdWVcbiAgICAgICAgfSwgdmlzaXRvci5Db2xsZWN0aW9uICYmIHtcbiAgICAgICAgICAgIE1hcDogdmlzaXRvci5Db2xsZWN0aW9uLFxuICAgICAgICAgICAgU2VxOiB2aXNpdG9yLkNvbGxlY3Rpb25cbiAgICAgICAgfSwgdmlzaXRvcik7XG4gICAgfVxuICAgIHJldHVybiB2aXNpdG9yO1xufVxuZnVuY3Rpb24gY2FsbFZpc2l0b3Ioa2V5LCBub2RlLCB2aXNpdG9yLCBwYXRoKSB7XG4gICAgaWYgKHR5cGVvZiB2aXNpdG9yID09PSAnZnVuY3Rpb24nKVxuICAgICAgICByZXR1cm4gdmlzaXRvcihrZXksIG5vZGUsIHBhdGgpO1xuICAgIGlmIChpc01hcChub2RlKSlcbiAgICAgICAgcmV0dXJuIHZpc2l0b3IuTWFwPy4oa2V5LCBub2RlLCBwYXRoKTtcbiAgICBpZiAoaXNTZXEobm9kZSkpXG4gICAgICAgIHJldHVybiB2aXNpdG9yLlNlcT8uKGtleSwgbm9kZSwgcGF0aCk7XG4gICAgaWYgKGlzUGFpcihub2RlKSlcbiAgICAgICAgcmV0dXJuIHZpc2l0b3IuUGFpcj8uKGtleSwgbm9kZSwgcGF0aCk7XG4gICAgaWYgKGlzU2NhbGFyKG5vZGUpKVxuICAgICAgICByZXR1cm4gdmlzaXRvci5TY2FsYXI/LihrZXksIG5vZGUsIHBhdGgpO1xuICAgIGlmIChpc0FsaWFzKG5vZGUpKVxuICAgICAgICByZXR1cm4gdmlzaXRvci5BbGlhcz8uKGtleSwgbm9kZSwgcGF0aCk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbmZ1bmN0aW9uIHJlcGxhY2VOb2RlKGtleSwgcGF0aCwgbm9kZSkge1xuICAgIGNvbnN0IHBhcmVudCA9IHBhdGhbcGF0aC5sZW5ndGggLSAxXTtcbiAgICBpZiAoaXNDb2xsZWN0aW9uKHBhcmVudCkpIHtcbiAgICAgICAgcGFyZW50Lml0ZW1zW2tleV0gPSBub2RlO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc1BhaXIocGFyZW50KSkge1xuICAgICAgICBpZiAoa2V5ID09PSAna2V5JylcbiAgICAgICAgICAgIHBhcmVudC5rZXkgPSBub2RlO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBwYXJlbnQudmFsdWUgPSBub2RlO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc0RvY3VtZW50KHBhcmVudCkpIHtcbiAgICAgICAgcGFyZW50LmNvbnRlbnRzID0gbm9kZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IHB0ID0gaXNBbGlhcyhwYXJlbnQpID8gJ2FsaWFzJyA6ICdzY2FsYXInO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCByZXBsYWNlIG5vZGUgd2l0aCAke3B0fSBwYXJlbnRgKTtcbiAgICB9XG59XG5cbmV4cG9ydCB7IHZpc2l0LCB2aXNpdEFzeW5jIH07XG4iLCJpbXBvcnQgeyBpc05vZGUgfSBmcm9tICcuLi9ub2Rlcy9pZGVudGl0eS5qcyc7XG5pbXBvcnQgeyB2aXNpdCB9IGZyb20gJy4uL3Zpc2l0LmpzJztcblxuY29uc3QgZXNjYXBlQ2hhcnMgPSB7XG4gICAgJyEnOiAnJTIxJyxcbiAgICAnLCc6ICclMkMnLFxuICAgICdbJzogJyU1QicsXG4gICAgJ10nOiAnJTVEJyxcbiAgICAneyc6ICclN0InLFxuICAgICd9JzogJyU3RCdcbn07XG5jb25zdCBlc2NhcGVUYWdOYW1lID0gKHRuKSA9PiB0bi5yZXBsYWNlKC9bISxbXFxde31dL2csIGNoID0+IGVzY2FwZUNoYXJzW2NoXSk7XG5jbGFzcyBEaXJlY3RpdmVzIHtcbiAgICBjb25zdHJ1Y3Rvcih5YW1sLCB0YWdzKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgZGlyZWN0aXZlcy1lbmQvZG9jLXN0YXJ0IG1hcmtlciBgLS0tYC4gSWYgYG51bGxgLCBhIG1hcmtlciBtYXkgc3RpbGwgYmVcbiAgICAgICAgICogaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50J3Mgc3RyaW5naWZpZWQgcmVwcmVzZW50YXRpb24uXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmRvY1N0YXJ0ID0gbnVsbDtcbiAgICAgICAgLyoqIFRoZSBkb2MtZW5kIG1hcmtlciBgLi4uYC4gICovXG4gICAgICAgIHRoaXMuZG9jRW5kID0gZmFsc2U7XG4gICAgICAgIHRoaXMueWFtbCA9IE9iamVjdC5hc3NpZ24oe30sIERpcmVjdGl2ZXMuZGVmYXVsdFlhbWwsIHlhbWwpO1xuICAgICAgICB0aGlzLnRhZ3MgPSBPYmplY3QuYXNzaWduKHt9LCBEaXJlY3RpdmVzLmRlZmF1bHRUYWdzLCB0YWdzKTtcbiAgICB9XG4gICAgY2xvbmUoKSB7XG4gICAgICAgIGNvbnN0IGNvcHkgPSBuZXcgRGlyZWN0aXZlcyh0aGlzLnlhbWwsIHRoaXMudGFncyk7XG4gICAgICAgIGNvcHkuZG9jU3RhcnQgPSB0aGlzLmRvY1N0YXJ0O1xuICAgICAgICByZXR1cm4gY29weTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRHVyaW5nIHBhcnNpbmcsIGdldCBhIERpcmVjdGl2ZXMgaW5zdGFuY2UgZm9yIHRoZSBjdXJyZW50IGRvY3VtZW50IGFuZFxuICAgICAqIHVwZGF0ZSB0aGUgc3RyZWFtIHN0YXRlIGFjY29yZGluZyB0byB0aGUgY3VycmVudCB2ZXJzaW9uJ3Mgc3BlYy5cbiAgICAgKi9cbiAgICBhdERvY3VtZW50KCkge1xuICAgICAgICBjb25zdCByZXMgPSBuZXcgRGlyZWN0aXZlcyh0aGlzLnlhbWwsIHRoaXMudGFncyk7XG4gICAgICAgIHN3aXRjaCAodGhpcy55YW1sLnZlcnNpb24pIHtcbiAgICAgICAgICAgIGNhc2UgJzEuMSc6XG4gICAgICAgICAgICAgICAgdGhpcy5hdE5leHREb2N1bWVudCA9IHRydWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICcxLjInOlxuICAgICAgICAgICAgICAgIHRoaXMuYXROZXh0RG9jdW1lbnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLnlhbWwgPSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGxpY2l0OiBEaXJlY3RpdmVzLmRlZmF1bHRZYW1sLmV4cGxpY2l0LFxuICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOiAnMS4yJ1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdGhpcy50YWdzID0gT2JqZWN0LmFzc2lnbih7fSwgRGlyZWN0aXZlcy5kZWZhdWx0VGFncyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIG9uRXJyb3IgLSBNYXkgYmUgY2FsbGVkIGV2ZW4gaWYgdGhlIGFjdGlvbiB3YXMgc3VjY2Vzc2Z1bFxuICAgICAqIEByZXR1cm5zIGB0cnVlYCBvbiBzdWNjZXNzXG4gICAgICovXG4gICAgYWRkKGxpbmUsIG9uRXJyb3IpIHtcbiAgICAgICAgaWYgKHRoaXMuYXROZXh0RG9jdW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMueWFtbCA9IHsgZXhwbGljaXQ6IERpcmVjdGl2ZXMuZGVmYXVsdFlhbWwuZXhwbGljaXQsIHZlcnNpb246ICcxLjEnIH07XG4gICAgICAgICAgICB0aGlzLnRhZ3MgPSBPYmplY3QuYXNzaWduKHt9LCBEaXJlY3RpdmVzLmRlZmF1bHRUYWdzKTtcbiAgICAgICAgICAgIHRoaXMuYXROZXh0RG9jdW1lbnQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXJ0cyA9IGxpbmUudHJpbSgpLnNwbGl0KC9bIFxcdF0rLyk7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBwYXJ0cy5zaGlmdCgpO1xuICAgICAgICBzd2l0Y2ggKG5hbWUpIHtcbiAgICAgICAgICAgIGNhc2UgJyVUQUcnOiB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCAhPT0gMikge1xuICAgICAgICAgICAgICAgICAgICBvbkVycm9yKDAsICclVEFHIGRpcmVjdGl2ZSBzaG91bGQgY29udGFpbiBleGFjdGx5IHR3byBwYXJ0cycpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoIDwgMilcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgW2hhbmRsZSwgcHJlZml4XSA9IHBhcnRzO1xuICAgICAgICAgICAgICAgIHRoaXMudGFnc1toYW5kbGVdID0gcHJlZml4O1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnJVlBTUwnOiB7XG4gICAgICAgICAgICAgICAgdGhpcy55YW1sLmV4cGxpY2l0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIG9uRXJyb3IoMCwgJyVZQU1MIGRpcmVjdGl2ZSBzaG91bGQgY29udGFpbiBleGFjdGx5IG9uZSBwYXJ0Jyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgW3ZlcnNpb25dID0gcGFydHM7XG4gICAgICAgICAgICAgICAgaWYgKHZlcnNpb24gPT09ICcxLjEnIHx8IHZlcnNpb24gPT09ICcxLjInKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMueWFtbC52ZXJzaW9uID0gdmVyc2lvbjtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpc1ZhbGlkID0gL15cXGQrXFwuXFxkKyQvLnRlc3QodmVyc2lvbik7XG4gICAgICAgICAgICAgICAgICAgIG9uRXJyb3IoNiwgYFVuc3VwcG9ydGVkIFlBTUwgdmVyc2lvbiAke3ZlcnNpb259YCwgaXNWYWxpZCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIG9uRXJyb3IoMCwgYFVua25vd24gZGlyZWN0aXZlICR7bmFtZX1gLCB0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVzb2x2ZXMgYSB0YWcsIG1hdGNoaW5nIGhhbmRsZXMgdG8gdGhvc2UgZGVmaW5lZCBpbiAlVEFHIGRpcmVjdGl2ZXMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBSZXNvbHZlZCB0YWcsIHdoaWNoIG1heSBhbHNvIGJlIHRoZSBub24tc3BlY2lmaWMgdGFnIGAnISdgIG9yIGFcbiAgICAgKiAgIGAnIWxvY2FsJ2AgdGFnLCBvciBgbnVsbGAgaWYgdW5yZXNvbHZhYmxlLlxuICAgICAqL1xuICAgIHRhZ05hbWUoc291cmNlLCBvbkVycm9yKSB7XG4gICAgICAgIGlmIChzb3VyY2UgPT09ICchJylcbiAgICAgICAgICAgIHJldHVybiAnISc7IC8vIG5vbi1zcGVjaWZpYyB0YWdcbiAgICAgICAgaWYgKHNvdXJjZVswXSAhPT0gJyEnKSB7XG4gICAgICAgICAgICBvbkVycm9yKGBOb3QgYSB2YWxpZCB0YWc6ICR7c291cmNlfWApO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNvdXJjZVsxXSA9PT0gJzwnKSB7XG4gICAgICAgICAgICBjb25zdCB2ZXJiYXRpbSA9IHNvdXJjZS5zbGljZSgyLCAtMSk7XG4gICAgICAgICAgICBpZiAodmVyYmF0aW0gPT09ICchJyB8fCB2ZXJiYXRpbSA9PT0gJyEhJykge1xuICAgICAgICAgICAgICAgIG9uRXJyb3IoYFZlcmJhdGltIHRhZ3MgYXJlbid0IHJlc29sdmVkLCBzbyAke3NvdXJjZX0gaXMgaW52YWxpZC5gKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzb3VyY2Vbc291cmNlLmxlbmd0aCAtIDFdICE9PSAnPicpXG4gICAgICAgICAgICAgICAgb25FcnJvcignVmVyYmF0aW0gdGFncyBtdXN0IGVuZCB3aXRoIGEgPicpO1xuICAgICAgICAgICAgcmV0dXJuIHZlcmJhdGltO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IFssIGhhbmRsZSwgc3VmZml4XSA9IHNvdXJjZS5tYXRjaCgvXiguKiEpKFteIV0qKSQvcyk7XG4gICAgICAgIGlmICghc3VmZml4KVxuICAgICAgICAgICAgb25FcnJvcihgVGhlICR7c291cmNlfSB0YWcgaGFzIG5vIHN1ZmZpeGApO1xuICAgICAgICBjb25zdCBwcmVmaXggPSB0aGlzLnRhZ3NbaGFuZGxlXTtcbiAgICAgICAgaWYgKHByZWZpeCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4ICsgZGVjb2RlVVJJQ29tcG9uZW50KHN1ZmZpeCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBvbkVycm9yKFN0cmluZyhlcnJvcikpO1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChoYW5kbGUgPT09ICchJylcbiAgICAgICAgICAgIHJldHVybiBzb3VyY2U7IC8vIGxvY2FsIHRhZ1xuICAgICAgICBvbkVycm9yKGBDb3VsZCBub3QgcmVzb2x2ZSB0YWc6ICR7c291cmNlfWApO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2l2ZW4gYSBmdWxseSByZXNvbHZlZCB0YWcsIHJldHVybnMgaXRzIHByaW50YWJsZSBzdHJpbmcgZm9ybSxcbiAgICAgKiB0YWtpbmcgaW50byBhY2NvdW50IGN1cnJlbnQgdGFnIHByZWZpeGVzIGFuZCBkZWZhdWx0cy5cbiAgICAgKi9cbiAgICB0YWdTdHJpbmcodGFnKSB7XG4gICAgICAgIGZvciAoY29uc3QgW2hhbmRsZSwgcHJlZml4XSBvZiBPYmplY3QuZW50cmllcyh0aGlzLnRhZ3MpKSB7XG4gICAgICAgICAgICBpZiAodGFnLnN0YXJ0c1dpdGgocHJlZml4KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlICsgZXNjYXBlVGFnTmFtZSh0YWcuc3Vic3RyaW5nKHByZWZpeC5sZW5ndGgpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGFnWzBdID09PSAnIScgPyB0YWcgOiBgITwke3RhZ30+YDtcbiAgICB9XG4gICAgdG9TdHJpbmcoZG9jKSB7XG4gICAgICAgIGNvbnN0IGxpbmVzID0gdGhpcy55YW1sLmV4cGxpY2l0XG4gICAgICAgICAgICA/IFtgJVlBTUwgJHt0aGlzLnlhbWwudmVyc2lvbiB8fCAnMS4yJ31gXVxuICAgICAgICAgICAgOiBbXTtcbiAgICAgICAgY29uc3QgdGFnRW50cmllcyA9IE9iamVjdC5lbnRyaWVzKHRoaXMudGFncyk7XG4gICAgICAgIGxldCB0YWdOYW1lcztcbiAgICAgICAgaWYgKGRvYyAmJiB0YWdFbnRyaWVzLmxlbmd0aCA+IDAgJiYgaXNOb2RlKGRvYy5jb250ZW50cykpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZ3MgPSB7fTtcbiAgICAgICAgICAgIHZpc2l0KGRvYy5jb250ZW50cywgKF9rZXksIG5vZGUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaXNOb2RlKG5vZGUpICYmIG5vZGUudGFnKVxuICAgICAgICAgICAgICAgICAgICB0YWdzW25vZGUudGFnXSA9IHRydWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRhZ05hbWVzID0gT2JqZWN0LmtleXModGFncyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGFnTmFtZXMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBbaGFuZGxlLCBwcmVmaXhdIG9mIHRhZ0VudHJpZXMpIHtcbiAgICAgICAgICAgIGlmIChoYW5kbGUgPT09ICchIScgJiYgcHJlZml4ID09PSAndGFnOnlhbWwub3JnLDIwMDI6JylcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICghZG9jIHx8IHRhZ05hbWVzLnNvbWUodG4gPT4gdG4uc3RhcnRzV2l0aChwcmVmaXgpKSlcbiAgICAgICAgICAgICAgICBsaW5lcy5wdXNoKGAlVEFHICR7aGFuZGxlfSAke3ByZWZpeH1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG4gICAgfVxufVxuRGlyZWN0aXZlcy5kZWZhdWx0WWFtbCA9IHsgZXhwbGljaXQ6IGZhbHNlLCB2ZXJzaW9uOiAnMS4yJyB9O1xuRGlyZWN0aXZlcy5kZWZhdWx0VGFncyA9IHsgJyEhJzogJ3RhZzp5YW1sLm9yZywyMDAyOicgfTtcblxuZXhwb3J0IHsgRGlyZWN0aXZlcyB9O1xuIiwiaW1wb3J0IHsgaXNTY2FsYXIsIGlzQ29sbGVjdGlvbiB9IGZyb20gJy4uL25vZGVzL2lkZW50aXR5LmpzJztcbmltcG9ydCB7IHZpc2l0IH0gZnJvbSAnLi4vdmlzaXQuanMnO1xuXG4vKipcbiAqIFZlcmlmeSB0aGF0IHRoZSBpbnB1dCBzdHJpbmcgaXMgYSB2YWxpZCBhbmNob3IuXG4gKlxuICogV2lsbCB0aHJvdyBvbiBlcnJvcnMuXG4gKi9cbmZ1bmN0aW9uIGFuY2hvcklzVmFsaWQoYW5jaG9yKSB7XG4gICAgaWYgKC9bXFx4MDAtXFx4MTlcXHMsW1xcXXt9XS8udGVzdChhbmNob3IpKSB7XG4gICAgICAgIGNvbnN0IHNhID0gSlNPTi5zdHJpbmdpZnkoYW5jaG9yKTtcbiAgICAgICAgY29uc3QgbXNnID0gYEFuY2hvciBtdXN0IG5vdCBjb250YWluIHdoaXRlc3BhY2Ugb3IgY29udHJvbCBjaGFyYWN0ZXJzOiAke3NhfWA7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIGFuY2hvck5hbWVzKHJvb3QpIHtcbiAgICBjb25zdCBhbmNob3JzID0gbmV3IFNldCgpO1xuICAgIHZpc2l0KHJvb3QsIHtcbiAgICAgICAgVmFsdWUoX2tleSwgbm9kZSkge1xuICAgICAgICAgICAgaWYgKG5vZGUuYW5jaG9yKVxuICAgICAgICAgICAgICAgIGFuY2hvcnMuYWRkKG5vZGUuYW5jaG9yKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBhbmNob3JzO1xufVxuLyoqIEZpbmQgYSBuZXcgYW5jaG9yIG5hbWUgd2l0aCB0aGUgZ2l2ZW4gYHByZWZpeGAgYW5kIGEgb25lLWluZGV4ZWQgc3VmZml4LiAqL1xuZnVuY3Rpb24gZmluZE5ld0FuY2hvcihwcmVmaXgsIGV4Y2x1ZGUpIHtcbiAgICBmb3IgKGxldCBpID0gMTsgdHJ1ZTsgKytpKSB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBgJHtwcmVmaXh9JHtpfWA7XG4gICAgICAgIGlmICghZXhjbHVkZS5oYXMobmFtZSkpXG4gICAgICAgICAgICByZXR1cm4gbmFtZTtcbiAgICB9XG59XG5mdW5jdGlvbiBjcmVhdGVOb2RlQW5jaG9ycyhkb2MsIHByZWZpeCkge1xuICAgIGNvbnN0IGFsaWFzT2JqZWN0cyA9IFtdO1xuICAgIGNvbnN0IHNvdXJjZU9iamVjdHMgPSBuZXcgTWFwKCk7XG4gICAgbGV0IHByZXZBbmNob3JzID0gbnVsbDtcbiAgICByZXR1cm4ge1xuICAgICAgICBvbkFuY2hvcjogKHNvdXJjZSkgPT4ge1xuICAgICAgICAgICAgYWxpYXNPYmplY3RzLnB1c2goc291cmNlKTtcbiAgICAgICAgICAgIHByZXZBbmNob3JzID8/IChwcmV2QW5jaG9ycyA9IGFuY2hvck5hbWVzKGRvYykpO1xuICAgICAgICAgICAgY29uc3QgYW5jaG9yID0gZmluZE5ld0FuY2hvcihwcmVmaXgsIHByZXZBbmNob3JzKTtcbiAgICAgICAgICAgIHByZXZBbmNob3JzLmFkZChhbmNob3IpO1xuICAgICAgICAgICAgcmV0dXJuIGFuY2hvcjtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFdpdGggY2lyY3VsYXIgcmVmZXJlbmNlcywgdGhlIHNvdXJjZSBub2RlIGlzIG9ubHkgcmVzb2x2ZWQgYWZ0ZXIgYWxsXG4gICAgICAgICAqIG9mIGl0cyBjaGlsZCBub2RlcyBhcmUuIFRoaXMgaXMgd2h5IGFuY2hvcnMgYXJlIHNldCBvbmx5IGFmdGVyIGFsbCBvZlxuICAgICAgICAgKiB0aGUgbm9kZXMgaGF2ZSBiZWVuIGNyZWF0ZWQuXG4gICAgICAgICAqL1xuICAgICAgICBzZXRBbmNob3JzOiAoKSA9PiB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHNvdXJjZSBvZiBhbGlhc09iamVjdHMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWYgPSBzb3VyY2VPYmplY3RzLmdldChzb3VyY2UpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVmID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgICAgICAgICByZWYuYW5jaG9yICYmXG4gICAgICAgICAgICAgICAgICAgIChpc1NjYWxhcihyZWYubm9kZSkgfHwgaXNDb2xsZWN0aW9uKHJlZi5ub2RlKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVmLm5vZGUuYW5jaG9yID0gcmVmLmFuY2hvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCdGYWlsZWQgdG8gcmVzb2x2ZSByZXBlYXRlZCBvYmplY3QgKHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4pJyk7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yLnNvdXJjZSA9IHNvdXJjZTtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBzb3VyY2VPYmplY3RzXG4gICAgfTtcbn1cblxuZXhwb3J0IHsgYW5jaG9ySXNWYWxpZCwgYW5jaG9yTmFtZXMsIGNyZWF0ZU5vZGVBbmNob3JzLCBmaW5kTmV3QW5jaG9yIH07XG4iLCIvKipcbiAqIEFwcGxpZXMgdGhlIEpTT04ucGFyc2UgcmV2aXZlciBhbGdvcml0aG0gYXMgZGVmaW5lZCBpbiB0aGUgRUNNQS0yNjIgc3BlYyxcbiAqIGluIHNlY3Rpb24gMjQuNS4xLjEgXCJSdW50aW1lIFNlbWFudGljczogSW50ZXJuYWxpemVKU09OUHJvcGVydHlcIiBvZiB0aGVcbiAqIDIwMjEgZWRpdGlvbjogaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1qc29uLnBhcnNlXG4gKlxuICogSW5jbHVkZXMgZXh0ZW5zaW9ucyBmb3IgaGFuZGxpbmcgTWFwIGFuZCBTZXQgb2JqZWN0cy5cbiAqL1xuZnVuY3Rpb24gYXBwbHlSZXZpdmVyKHJldml2ZXIsIG9iaiwga2V5LCB2YWwpIHtcbiAgICBpZiAodmFsICYmIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB2YWwubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2MCA9IHZhbFtpXTtcbiAgICAgICAgICAgICAgICBjb25zdCB2MSA9IGFwcGx5UmV2aXZlcihyZXZpdmVyLCB2YWwsIFN0cmluZyhpKSwgdjApO1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tYXJyYXktZGVsZXRlXG4gICAgICAgICAgICAgICAgaWYgKHYxID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB2YWxbaV07XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodjEgIT09IHYwKVxuICAgICAgICAgICAgICAgICAgICB2YWxbaV0gPSB2MTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh2YWwgaW5zdGFuY2VvZiBNYXApIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgayBvZiBBcnJheS5mcm9tKHZhbC5rZXlzKCkpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdjAgPSB2YWwuZ2V0KGspO1xuICAgICAgICAgICAgICAgIGNvbnN0IHYxID0gYXBwbHlSZXZpdmVyKHJldml2ZXIsIHZhbCwgaywgdjApO1xuICAgICAgICAgICAgICAgIGlmICh2MSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICB2YWwuZGVsZXRlKGspO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHYxICE9PSB2MClcbiAgICAgICAgICAgICAgICAgICAgdmFsLnNldChrLCB2MSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodmFsIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHYwIG9mIEFycmF5LmZyb20odmFsKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHYxID0gYXBwbHlSZXZpdmVyKHJldml2ZXIsIHZhbCwgdjAsIHYwKTtcbiAgICAgICAgICAgICAgICBpZiAodjEgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgdmFsLmRlbGV0ZSh2MCk7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodjEgIT09IHYwKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbC5kZWxldGUodjApO1xuICAgICAgICAgICAgICAgICAgICB2YWwuYWRkKHYxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtrLCB2MF0gb2YgT2JqZWN0LmVudHJpZXModmFsKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHYxID0gYXBwbHlSZXZpdmVyKHJldml2ZXIsIHZhbCwgaywgdjApO1xuICAgICAgICAgICAgICAgIGlmICh2MSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgdmFsW2tdO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHYxICE9PSB2MClcbiAgICAgICAgICAgICAgICAgICAgdmFsW2tdID0gdjE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldml2ZXIuY2FsbChvYmosIGtleSwgdmFsKTtcbn1cblxuZXhwb3J0IHsgYXBwbHlSZXZpdmVyIH07XG4iLCJpbXBvcnQgeyBoYXNBbmNob3IgfSBmcm9tICcuL2lkZW50aXR5LmpzJztcblxuLyoqXG4gKiBSZWN1cnNpdmVseSBjb252ZXJ0IGFueSBub2RlIG9yIGl0cyBjb250ZW50cyB0byBuYXRpdmUgSmF2YVNjcmlwdFxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBpbnB1dCB2YWx1ZVxuICogQHBhcmFtIGFyZyAtIElmIGB2YWx1ZWAgZGVmaW5lcyBhIGB0b0pTT04oKWAgbWV0aG9kLCB1c2UgdGhpc1xuICogICBhcyBpdHMgZmlyc3QgYXJndW1lbnRcbiAqIEBwYXJhbSBjdHggLSBDb252ZXJzaW9uIGNvbnRleHQsIG9yaWdpbmFsbHkgc2V0IGluIERvY3VtZW50I3RvSlMoKS4gSWZcbiAqICAgYHsga2VlcDogdHJ1ZSB9YCBpcyBub3Qgc2V0LCBvdXRwdXQgc2hvdWxkIGJlIHN1aXRhYmxlIGZvciBKU09OXG4gKiAgIHN0cmluZ2lmaWNhdGlvbi5cbiAqL1xuZnVuY3Rpb24gdG9KUyh2YWx1ZSwgYXJnLCBjdHgpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1yZXR1cm5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpXG4gICAgICAgIHJldHVybiB2YWx1ZS5tYXAoKHYsIGkpID0+IHRvSlModiwgU3RyaW5nKGkpLCBjdHgpKTtcbiAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlLnRvSlNPTiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1jYWxsXG4gICAgICAgIGlmICghY3R4IHx8ICFoYXNBbmNob3IodmFsdWUpKVxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnRvSlNPTihhcmcsIGN0eCk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB7IGFsaWFzQ291bnQ6IDAsIGNvdW50OiAxLCByZXM6IHVuZGVmaW5lZCB9O1xuICAgICAgICBjdHguYW5jaG9ycy5zZXQodmFsdWUsIGRhdGEpO1xuICAgICAgICBjdHgub25DcmVhdGUgPSByZXMgPT4ge1xuICAgICAgICAgICAgZGF0YS5yZXMgPSByZXM7XG4gICAgICAgICAgICBkZWxldGUgY3R4Lm9uQ3JlYXRlO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCByZXMgPSB2YWx1ZS50b0pTT04oYXJnLCBjdHgpO1xuICAgICAgICBpZiAoY3R4Lm9uQ3JlYXRlKVxuICAgICAgICAgICAgY3R4Lm9uQ3JlYXRlKHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdiaWdpbnQnICYmICFjdHg/LmtlZXApXG4gICAgICAgIHJldHVybiBOdW1iZXIodmFsdWUpO1xuICAgIHJldHVybiB2YWx1ZTtcbn1cblxuZXhwb3J0IHsgdG9KUyB9O1xuIiwiaW1wb3J0IHsgYXBwbHlSZXZpdmVyIH0gZnJvbSAnLi4vZG9jL2FwcGx5UmV2aXZlci5qcyc7XG5pbXBvcnQgeyBOT0RFX1RZUEUsIGlzRG9jdW1lbnQgfSBmcm9tICcuL2lkZW50aXR5LmpzJztcbmltcG9ydCB7IHRvSlMgfSBmcm9tICcuL3RvSlMuanMnO1xuXG5jbGFzcyBOb2RlQmFzZSB7XG4gICAgY29uc3RydWN0b3IodHlwZSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgTk9ERV9UWVBFLCB7IHZhbHVlOiB0eXBlIH0pO1xuICAgIH1cbiAgICAvKiogQ3JlYXRlIGEgY29weSBvZiB0aGlzIG5vZGUuICAqL1xuICAgIGNsb25lKCkge1xuICAgICAgICBjb25zdCBjb3B5ID0gT2JqZWN0LmNyZWF0ZShPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcyksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHRoaXMpKTtcbiAgICAgICAgaWYgKHRoaXMucmFuZ2UpXG4gICAgICAgICAgICBjb3B5LnJhbmdlID0gdGhpcy5yYW5nZS5zbGljZSgpO1xuICAgICAgICByZXR1cm4gY29weTtcbiAgICB9XG4gICAgLyoqIEEgcGxhaW4gSmF2YVNjcmlwdCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG5vZGUuICovXG4gICAgdG9KUyhkb2MsIHsgbWFwQXNNYXAsIG1heEFsaWFzQ291bnQsIG9uQW5jaG9yLCByZXZpdmVyIH0gPSB7fSkge1xuICAgICAgICBpZiAoIWlzRG9jdW1lbnQoZG9jKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0EgZG9jdW1lbnQgYXJndW1lbnQgaXMgcmVxdWlyZWQnKTtcbiAgICAgICAgY29uc3QgY3R4ID0ge1xuICAgICAgICAgICAgYW5jaG9yczogbmV3IE1hcCgpLFxuICAgICAgICAgICAgZG9jLFxuICAgICAgICAgICAga2VlcDogdHJ1ZSxcbiAgICAgICAgICAgIG1hcEFzTWFwOiBtYXBBc01hcCA9PT0gdHJ1ZSxcbiAgICAgICAgICAgIG1hcEtleVdhcm5lZDogZmFsc2UsXG4gICAgICAgICAgICBtYXhBbGlhc0NvdW50OiB0eXBlb2YgbWF4QWxpYXNDb3VudCA9PT0gJ251bWJlcicgPyBtYXhBbGlhc0NvdW50IDogMTAwXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlcyA9IHRvSlModGhpcywgJycsIGN0eCk7XG4gICAgICAgIGlmICh0eXBlb2Ygb25BbmNob3IgPT09ICdmdW5jdGlvbicpXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHsgY291bnQsIHJlcyB9IG9mIGN0eC5hbmNob3JzLnZhbHVlcygpKVxuICAgICAgICAgICAgICAgIG9uQW5jaG9yKHJlcywgY291bnQpO1xuICAgICAgICByZXR1cm4gdHlwZW9mIHJldml2ZXIgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgID8gYXBwbHlSZXZpdmVyKHJldml2ZXIsIHsgJyc6IHJlcyB9LCAnJywgcmVzKVxuICAgICAgICAgICAgOiByZXM7XG4gICAgfVxufVxuXG5leHBvcnQgeyBOb2RlQmFzZSB9O1xuIiwiaW1wb3J0IHsgYW5jaG9ySXNWYWxpZCB9IGZyb20gJy4uL2RvYy9hbmNob3JzLmpzJztcbmltcG9ydCB7IHZpc2l0IH0gZnJvbSAnLi4vdmlzaXQuanMnO1xuaW1wb3J0IHsgQUxJQVMsIGlzQWxpYXMsIGlzQ29sbGVjdGlvbiwgaXNQYWlyLCBoYXNBbmNob3IgfSBmcm9tICcuL2lkZW50aXR5LmpzJztcbmltcG9ydCB7IE5vZGVCYXNlIH0gZnJvbSAnLi9Ob2RlLmpzJztcbmltcG9ydCB7IHRvSlMgfSBmcm9tICcuL3RvSlMuanMnO1xuXG5jbGFzcyBBbGlhcyBleHRlbmRzIE5vZGVCYXNlIHtcbiAgICBjb25zdHJ1Y3Rvcihzb3VyY2UpIHtcbiAgICAgICAgc3VwZXIoQUxJQVMpO1xuICAgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICd0YWcnLCB7XG4gICAgICAgICAgICBzZXQoKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBbGlhcyBub2RlcyBjYW5ub3QgaGF2ZSB0YWdzJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXNvbHZlIHRoZSB2YWx1ZSBvZiB0aGlzIGFsaWFzIHdpdGhpbiBgZG9jYCwgZmluZGluZyB0aGUgbGFzdFxuICAgICAqIGluc3RhbmNlIG9mIHRoZSBgc291cmNlYCBhbmNob3IgYmVmb3JlIHRoaXMgbm9kZS5cbiAgICAgKi9cbiAgICByZXNvbHZlKGRvYywgY3R4KSB7XG4gICAgICAgIGlmIChjdHg/Lm1heEFsaWFzQ291bnQgPT09IDApXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoJ0FsaWFzIHJlc29sdXRpb24gaXMgZGlzYWJsZWQnKTtcbiAgICAgICAgbGV0IG5vZGVzO1xuICAgICAgICBpZiAoY3R4Py5hbGlhc1Jlc29sdmVDYWNoZSkge1xuICAgICAgICAgICAgbm9kZXMgPSBjdHguYWxpYXNSZXNvbHZlQ2FjaGU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBub2RlcyA9IFtdO1xuICAgICAgICAgICAgdmlzaXQoZG9jLCB7XG4gICAgICAgICAgICAgICAgTm9kZTogKF9rZXksIG5vZGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzQWxpYXMobm9kZSkgfHwgaGFzQW5jaG9yKG5vZGUpKVxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXMucHVzaChub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChjdHgpXG4gICAgICAgICAgICAgICAgY3R4LmFsaWFzUmVzb2x2ZUNhY2hlID0gbm9kZXM7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGZvdW5kID0gdW5kZWZpbmVkO1xuICAgICAgICBmb3IgKGNvbnN0IG5vZGUgb2Ygbm9kZXMpIHtcbiAgICAgICAgICAgIGlmIChub2RlID09PSB0aGlzKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgaWYgKG5vZGUuYW5jaG9yID09PSB0aGlzLnNvdXJjZSlcbiAgICAgICAgICAgICAgICBmb3VuZCA9IG5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZvdW5kICYmIGN0eCkge1xuICAgICAgICAgICAgY29uc3QgeyBhbmNob3JzLCBkb2MsIG1heEFsaWFzQ291bnQgfSA9IGN0eDtcbiAgICAgICAgICAgIGxldCBkYXRhID0gYW5jaG9ycy5nZXQoZm91bmQpO1xuICAgICAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgICAgICAgLy8gUmVzb2x2ZSBhbmNob3JzIGZvciBOb2RlLnByb3RvdHlwZS50b0pTKClcbiAgICAgICAgICAgICAgICB0b0pTKGZvdW5kLCBudWxsLCBjdHgpO1xuICAgICAgICAgICAgICAgIGRhdGEgPSBhbmNob3JzLmdldChmb3VuZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgICAgICAgIGlmIChkYXRhPy5yZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1zZyA9ICdUaGlzIHNob3VsZCBub3QgaGFwcGVuOiBBbGlhcyBhbmNob3Igd2FzIG5vdCByZXNvbHZlZD8nO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihtc2cpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1heEFsaWFzQ291bnQgPj0gMCkge1xuICAgICAgICAgICAgICAgIGRhdGEuY291bnQgKz0gMTtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5hbGlhc0NvdW50ID09PSAwKVxuICAgICAgICAgICAgICAgICAgICBkYXRhLmFsaWFzQ291bnQgPSBnZXRBbGlhc0NvdW50KGRvYywgZm91bmQsIGFuY2hvcnMpO1xuICAgICAgICAgICAgICAgIGlmIChkYXRhLmNvdW50ICogZGF0YS5hbGlhc0NvdW50ID4gbWF4QWxpYXNDb3VudCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtc2cgPSAnRXhjZXNzaXZlIGFsaWFzIGNvdW50IGluZGljYXRlcyBhIHJlc291cmNlIGV4aGF1c3Rpb24gYXR0YWNrJztcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKG1zZyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmb3VuZDtcbiAgICB9XG4gICAgdG9KU09OKF9hcmcsIGN0eCkge1xuICAgICAgICBpZiAoIWN0eClcbiAgICAgICAgICAgIHJldHVybiB7IHNvdXJjZTogdGhpcy5zb3VyY2UgfTtcbiAgICAgICAgY29uc3Qgc291cmNlID0gdGhpcy5yZXNvbHZlKGN0eC5kb2MsIGN0eCk7XG4gICAgICAgIGlmICghc291cmNlKSB7XG4gICAgICAgICAgICBjb25zdCBtc2cgPSBgVW5yZXNvbHZlZCBhbGlhcyAodGhlIGFuY2hvciBtdXN0IGJlIHNldCBiZWZvcmUgdGhlIGFsaWFzKTogJHt0aGlzLnNvdXJjZX1gO1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKG1zZyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGN0eC5hbmNob3JzLmdldChzb3VyY2UpLnJlcztcbiAgICB9XG4gICAgdG9TdHJpbmcoY3R4LCBfb25Db21tZW50LCBfb25DaG9tcEtlZXApIHtcbiAgICAgICAgY29uc3Qgc3JjID0gYCoke3RoaXMuc291cmNlfWA7XG4gICAgICAgIGlmIChjdHgpIHtcbiAgICAgICAgICAgIGFuY2hvcklzVmFsaWQodGhpcy5zb3VyY2UpO1xuICAgICAgICAgICAgaWYgKGN0eC5vcHRpb25zLnZlcmlmeUFsaWFzT3JkZXIgJiYgIWN0eC5hbmNob3JzLmhhcyh0aGlzLnNvdXJjZSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtc2cgPSBgVW5yZXNvbHZlZCBhbGlhcyAodGhlIGFuY2hvciBtdXN0IGJlIHNldCBiZWZvcmUgdGhlIGFsaWFzKTogJHt0aGlzLnNvdXJjZX1gO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGN0eC5pbXBsaWNpdEtleSlcbiAgICAgICAgICAgICAgICByZXR1cm4gYCR7c3JjfSBgO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzcmM7XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0QWxpYXNDb3VudChkb2MsIG5vZGUsIGFuY2hvcnMpIHtcbiAgICBpZiAoaXNBbGlhcyhub2RlKSkge1xuICAgICAgICBjb25zdCBzb3VyY2UgPSBub2RlLnJlc29sdmUoZG9jKTtcbiAgICAgICAgY29uc3QgYW5jaG9yID0gYW5jaG9ycyAmJiBzb3VyY2UgJiYgYW5jaG9ycy5nZXQoc291cmNlKTtcbiAgICAgICAgcmV0dXJuIGFuY2hvciA/IGFuY2hvci5jb3VudCAqIGFuY2hvci5hbGlhc0NvdW50IDogMDtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNDb2xsZWN0aW9uKG5vZGUpKSB7XG4gICAgICAgIGxldCBjb3VudCA9IDA7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBub2RlLml0ZW1zKSB7XG4gICAgICAgICAgICBjb25zdCBjID0gZ2V0QWxpYXNDb3VudChkb2MsIGl0ZW0sIGFuY2hvcnMpO1xuICAgICAgICAgICAgaWYgKGMgPiBjb3VudClcbiAgICAgICAgICAgICAgICBjb3VudCA9IGM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvdW50O1xuICAgIH1cbiAgICBlbHNlIGlmIChpc1BhaXIobm9kZSkpIHtcbiAgICAgICAgY29uc3Qga2MgPSBnZXRBbGlhc0NvdW50KGRvYywgbm9kZS5rZXksIGFuY2hvcnMpO1xuICAgICAgICBjb25zdCB2YyA9IGdldEFsaWFzQ291bnQoZG9jLCBub2RlLnZhbHVlLCBhbmNob3JzKTtcbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KGtjLCB2Yyk7XG4gICAgfVxuICAgIHJldHVybiAxO1xufVxuXG5leHBvcnQgeyBBbGlhcyB9O1xuIiwiaW1wb3J0IHsgU0NBTEFSIH0gZnJvbSAnLi9pZGVudGl0eS5qcyc7XG5pbXBvcnQgeyBOb2RlQmFzZSB9IGZyb20gJy4vTm9kZS5qcyc7XG5pbXBvcnQgeyB0b0pTIH0gZnJvbSAnLi90b0pTLmpzJztcblxuY29uc3QgaXNTY2FsYXJWYWx1ZSA9ICh2YWx1ZSkgPT4gIXZhbHVlIHx8ICh0eXBlb2YgdmFsdWUgIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0Jyk7XG5jbGFzcyBTY2FsYXIgZXh0ZW5kcyBOb2RlQmFzZSB7XG4gICAgY29uc3RydWN0b3IodmFsdWUpIHtcbiAgICAgICAgc3VwZXIoU0NBTEFSKTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICB0b0pTT04oYXJnLCBjdHgpIHtcbiAgICAgICAgcmV0dXJuIGN0eD8ua2VlcCA/IHRoaXMudmFsdWUgOiB0b0pTKHRoaXMudmFsdWUsIGFyZywgY3R4KTtcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiBTdHJpbmcodGhpcy52YWx1ZSk7XG4gICAgfVxufVxuU2NhbGFyLkJMT0NLX0ZPTERFRCA9ICdCTE9DS19GT0xERUQnO1xuU2NhbGFyLkJMT0NLX0xJVEVSQUwgPSAnQkxPQ0tfTElURVJBTCc7XG5TY2FsYXIuUExBSU4gPSAnUExBSU4nO1xuU2NhbGFyLlFVT1RFX0RPVUJMRSA9ICdRVU9URV9ET1VCTEUnO1xuU2NhbGFyLlFVT1RFX1NJTkdMRSA9ICdRVU9URV9TSU5HTEUnO1xuXG5leHBvcnQgeyBTY2FsYXIsIGlzU2NhbGFyVmFsdWUgfTtcbiIsImltcG9ydCB7IEFsaWFzIH0gZnJvbSAnLi4vbm9kZXMvQWxpYXMuanMnO1xuaW1wb3J0IHsgaXNOb2RlLCBpc1BhaXIsIE1BUCwgU0VRLCBpc0RvY3VtZW50IH0gZnJvbSAnLi4vbm9kZXMvaWRlbnRpdHkuanMnO1xuaW1wb3J0IHsgU2NhbGFyIH0gZnJvbSAnLi4vbm9kZXMvU2NhbGFyLmpzJztcblxuY29uc3QgZGVmYXVsdFRhZ1ByZWZpeCA9ICd0YWc6eWFtbC5vcmcsMjAwMjonO1xuZnVuY3Rpb24gZmluZFRhZ09iamVjdCh2YWx1ZSwgdGFnTmFtZSwgdGFncykge1xuICAgIGlmICh0YWdOYW1lKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoID0gdGFncy5maWx0ZXIodCA9PiB0LnRhZyA9PT0gdGFnTmFtZSk7XG4gICAgICAgIGNvbnN0IHRhZ09iaiA9IG1hdGNoLmZpbmQodCA9PiAhdC5mb3JtYXQpID8/IG1hdGNoWzBdO1xuICAgICAgICBpZiAoIXRhZ09iailcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGFnICR7dGFnTmFtZX0gbm90IGZvdW5kYCk7XG4gICAgICAgIHJldHVybiB0YWdPYmo7XG4gICAgfVxuICAgIHJldHVybiB0YWdzLmZpbmQodCA9PiB0LmlkZW50aWZ5Py4odmFsdWUpICYmICF0LmZvcm1hdCk7XG59XG5mdW5jdGlvbiBjcmVhdGVOb2RlKHZhbHVlLCB0YWdOYW1lLCBjdHgpIHtcbiAgICBpZiAoaXNEb2N1bWVudCh2YWx1ZSkpXG4gICAgICAgIHZhbHVlID0gdmFsdWUuY29udGVudHM7XG4gICAgaWYgKGlzTm9kZSh2YWx1ZSkpXG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICBpZiAoaXNQYWlyKHZhbHVlKSkge1xuICAgICAgICBjb25zdCBtYXAgPSBjdHguc2NoZW1hW01BUF0uY3JlYXRlTm9kZT8uKGN0eC5zY2hlbWEsIG51bGwsIGN0eCk7XG4gICAgICAgIG1hcC5pdGVtcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG1hcDtcbiAgICB9XG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nIHx8XG4gICAgICAgIHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyIHx8XG4gICAgICAgIHZhbHVlIGluc3RhbmNlb2YgQm9vbGVhbiB8fFxuICAgICAgICAodHlwZW9mIEJpZ0ludCAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsdWUgaW5zdGFuY2VvZiBCaWdJbnQpIC8vIG5vdCBzdXBwb3J0ZWQgZXZlcnl3aGVyZVxuICAgICkge1xuICAgICAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXNlcmlhbGl6ZWpzb25wcm9wZXJ0eVxuICAgICAgICB2YWx1ZSA9IHZhbHVlLnZhbHVlT2YoKTtcbiAgICB9XG4gICAgY29uc3QgeyBhbGlhc0R1cGxpY2F0ZU9iamVjdHMsIG9uQW5jaG9yLCBvblRhZ09iaiwgc2NoZW1hLCBzb3VyY2VPYmplY3RzIH0gPSBjdHg7XG4gICAgLy8gRGV0ZWN0IGR1cGxpY2F0ZSByZWZlcmVuY2VzIHRvIHRoZSBzYW1lIG9iamVjdCAmIHVzZSBBbGlhcyBub2RlcyBmb3IgYWxsXG4gICAgLy8gYWZ0ZXIgZmlyc3QuIFRoZSBgcmVmYCB3cmFwcGVyIGFsbG93cyBmb3IgY2lyY3VsYXIgcmVmZXJlbmNlcyB0byByZXNvbHZlLlxuICAgIGxldCByZWYgPSB1bmRlZmluZWQ7XG4gICAgaWYgKGFsaWFzRHVwbGljYXRlT2JqZWN0cyAmJiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJlZiA9IHNvdXJjZU9iamVjdHMuZ2V0KHZhbHVlKTtcbiAgICAgICAgaWYgKHJlZikge1xuICAgICAgICAgICAgcmVmLmFuY2hvciA/PyAocmVmLmFuY2hvciA9IG9uQW5jaG9yKHZhbHVlKSk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEFsaWFzKHJlZi5hbmNob3IpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVmID0geyBhbmNob3I6IG51bGwsIG5vZGU6IG51bGwgfTtcbiAgICAgICAgICAgIHNvdXJjZU9iamVjdHMuc2V0KHZhbHVlLCByZWYpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICh0YWdOYW1lPy5zdGFydHNXaXRoKCchIScpKVxuICAgICAgICB0YWdOYW1lID0gZGVmYXVsdFRhZ1ByZWZpeCArIHRhZ05hbWUuc2xpY2UoMik7XG4gICAgbGV0IHRhZ09iaiA9IGZpbmRUYWdPYmplY3QodmFsdWUsIHRhZ05hbWUsIHNjaGVtYS50YWdzKTtcbiAgICBpZiAoIXRhZ09iaikge1xuICAgICAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlLnRvSlNPTiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtY2FsbFxuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS50b0pTT04oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBuZXcgU2NhbGFyKHZhbHVlKTtcbiAgICAgICAgICAgIGlmIChyZWYpXG4gICAgICAgICAgICAgICAgcmVmLm5vZGUgPSBub2RlO1xuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgdGFnT2JqID1cbiAgICAgICAgICAgIHZhbHVlIGluc3RhbmNlb2YgTWFwXG4gICAgICAgICAgICAgICAgPyBzY2hlbWFbTUFQXVxuICAgICAgICAgICAgICAgIDogU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdCh2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgPyBzY2hlbWFbU0VRXVxuICAgICAgICAgICAgICAgICAgICA6IHNjaGVtYVtNQVBdO1xuICAgIH1cbiAgICBpZiAob25UYWdPYmopIHtcbiAgICAgICAgb25UYWdPYmoodGFnT2JqKTtcbiAgICAgICAgZGVsZXRlIGN0eC5vblRhZ09iajtcbiAgICB9XG4gICAgY29uc3Qgbm9kZSA9IHRhZ09iaj8uY3JlYXRlTm9kZVxuICAgICAgICA/IHRhZ09iai5jcmVhdGVOb2RlKGN0eC5zY2hlbWEsIHZhbHVlLCBjdHgpXG4gICAgICAgIDogdHlwZW9mIHRhZ09iaj8ubm9kZUNsYXNzPy5mcm9tID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgICA/IHRhZ09iai5ub2RlQ2xhc3MuZnJvbShjdHguc2NoZW1hLCB2YWx1ZSwgY3R4KVxuICAgICAgICAgICAgOiBuZXcgU2NhbGFyKHZhbHVlKTtcbiAgICBpZiAodGFnTmFtZSlcbiAgICAgICAgbm9kZS50YWcgPSB0YWdOYW1lO1xuICAgIGVsc2UgaWYgKCF0YWdPYmouZGVmYXVsdClcbiAgICAgICAgbm9kZS50YWcgPSB0YWdPYmoudGFnO1xuICAgIGlmIChyZWYpXG4gICAgICAgIHJlZi5ub2RlID0gbm9kZTtcbiAgICByZXR1cm4gbm9kZTtcbn1cblxuZXhwb3J0IHsgY3JlYXRlTm9kZSB9O1xuIiwiaW1wb3J0IHsgY3JlYXRlTm9kZSB9IGZyb20gJy4uL2RvYy9jcmVhdGVOb2RlLmpzJztcbmltcG9ydCB7IGlzTm9kZSwgaXNQYWlyLCBpc0NvbGxlY3Rpb24sIGlzU2NhbGFyIH0gZnJvbSAnLi9pZGVudGl0eS5qcyc7XG5pbXBvcnQgeyBOb2RlQmFzZSB9IGZyb20gJy4vTm9kZS5qcyc7XG5cbmZ1bmN0aW9uIGNvbGxlY3Rpb25Gcm9tUGF0aChzY2hlbWEsIHBhdGgsIHZhbHVlKSB7XG4gICAgbGV0IHYgPSB2YWx1ZTtcbiAgICBmb3IgKGxldCBpID0gcGF0aC5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICBjb25zdCBrID0gcGF0aFtpXTtcbiAgICAgICAgaWYgKHR5cGVvZiBrID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNJbnRlZ2VyKGspICYmIGsgPj0gMCkge1xuICAgICAgICAgICAgY29uc3QgYSA9IFtdO1xuICAgICAgICAgICAgYVtrXSA9IHY7XG4gICAgICAgICAgICB2ID0gYTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHYgPSBuZXcgTWFwKFtbaywgdl1dKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlTm9kZSh2LCB1bmRlZmluZWQsIHtcbiAgICAgICAgYWxpYXNEdXBsaWNhdGVPYmplY3RzOiBmYWxzZSxcbiAgICAgICAga2VlcFVuZGVmaW5lZDogZmFsc2UsXG4gICAgICAgIG9uQW5jaG9yOiAoKSA9PiB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgc2hvdWxkIG5vdCBoYXBwZW4sIHBsZWFzZSByZXBvcnQgYSBidWcuJyk7XG4gICAgICAgIH0sXG4gICAgICAgIHNjaGVtYSxcbiAgICAgICAgc291cmNlT2JqZWN0czogbmV3IE1hcCgpXG4gICAgfSk7XG59XG4vLyBUeXBlIGd1YXJkIGlzIGludGVudGlvbmFsbHkgYSBsaXR0bGUgd3Jvbmcgc28gYXMgdG8gYmUgbW9yZSB1c2VmdWwsXG4vLyBhcyBpdCBkb2VzIG5vdCBjb3ZlciB1bnR5cGFibGUgZW1wdHkgbm9uLXN0cmluZyBpdGVyYWJsZXMgKGUuZy4gW10pLlxuY29uc3QgaXNFbXB0eVBhdGggPSAocGF0aCkgPT4gcGF0aCA9PSBudWxsIHx8XG4gICAgKHR5cGVvZiBwYXRoID09PSAnb2JqZWN0JyAmJiAhIXBhdGhbU3ltYm9sLml0ZXJhdG9yXSgpLm5leHQoKS5kb25lKTtcbmNsYXNzIENvbGxlY3Rpb24gZXh0ZW5kcyBOb2RlQmFzZSB7XG4gICAgY29uc3RydWN0b3IodHlwZSwgc2NoZW1hKSB7XG4gICAgICAgIHN1cGVyKHR5cGUpO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3NjaGVtYScsIHtcbiAgICAgICAgICAgIHZhbHVlOiBzY2hlbWEsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBjb3B5IG9mIHRoaXMgY29sbGVjdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzY2hlbWEgLSBJZiBkZWZpbmVkLCBvdmVyd3JpdGVzIHRoZSBvcmlnaW5hbCdzIHNjaGVtYVxuICAgICAqL1xuICAgIGNsb25lKHNjaGVtYSkge1xuICAgICAgICBjb25zdCBjb3B5ID0gT2JqZWN0LmNyZWF0ZShPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcyksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHRoaXMpKTtcbiAgICAgICAgaWYgKHNjaGVtYSlcbiAgICAgICAgICAgIGNvcHkuc2NoZW1hID0gc2NoZW1hO1xuICAgICAgICBjb3B5Lml0ZW1zID0gY29weS5pdGVtcy5tYXAoaXQgPT4gaXNOb2RlKGl0KSB8fCBpc1BhaXIoaXQpID8gaXQuY2xvbmUoc2NoZW1hKSA6IGl0KTtcbiAgICAgICAgaWYgKHRoaXMucmFuZ2UpXG4gICAgICAgICAgICBjb3B5LnJhbmdlID0gdGhpcy5yYW5nZS5zbGljZSgpO1xuICAgICAgICByZXR1cm4gY29weTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIHZhbHVlIHRvIHRoZSBjb2xsZWN0aW9uLiBGb3IgYCEhbWFwYCBhbmQgYCEhb21hcGAgdGhlIHZhbHVlIG11c3RcbiAgICAgKiBiZSBhIFBhaXIgaW5zdGFuY2Ugb3IgYSBgeyBrZXksIHZhbHVlIH1gIG9iamVjdCwgd2hpY2ggbWF5IG5vdCBoYXZlIGEga2V5XG4gICAgICogdGhhdCBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgbWFwLlxuICAgICAqL1xuICAgIGFkZEluKHBhdGgsIHZhbHVlKSB7XG4gICAgICAgIGlmIChpc0VtcHR5UGF0aChwYXRoKSlcbiAgICAgICAgICAgIHRoaXMuYWRkKHZhbHVlKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBba2V5LCAuLi5yZXN0XSA9IHBhdGg7XG4gICAgICAgICAgICBjb25zdCBub2RlID0gdGhpcy5nZXQoa2V5LCB0cnVlKTtcbiAgICAgICAgICAgIGlmIChpc0NvbGxlY3Rpb24obm9kZSkpXG4gICAgICAgICAgICAgICAgbm9kZS5hZGRJbihyZXN0LCB2YWx1ZSk7XG4gICAgICAgICAgICBlbHNlIGlmIChub2RlID09PSB1bmRlZmluZWQgJiYgdGhpcy5zY2hlbWEpXG4gICAgICAgICAgICAgICAgdGhpcy5zZXQoa2V5LCBjb2xsZWN0aW9uRnJvbVBhdGgodGhpcy5zY2hlbWEsIHJlc3QsIHZhbHVlKSk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBZQU1MIGNvbGxlY3Rpb24gYXQgJHtrZXl9LiBSZW1haW5pbmcgcGF0aDogJHtyZXN0fWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYSB2YWx1ZSBmcm9tIHRoZSBjb2xsZWN0aW9uLlxuICAgICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgaXRlbSB3YXMgZm91bmQgYW5kIHJlbW92ZWQuXG4gICAgICovXG4gICAgZGVsZXRlSW4ocGF0aCkge1xuICAgICAgICBjb25zdCBba2V5LCAuLi5yZXN0XSA9IHBhdGg7XG4gICAgICAgIGlmIChyZXN0Lmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRlbGV0ZShrZXkpO1xuICAgICAgICBjb25zdCBub2RlID0gdGhpcy5nZXQoa2V5LCB0cnVlKTtcbiAgICAgICAgaWYgKGlzQ29sbGVjdGlvbihub2RlKSlcbiAgICAgICAgICAgIHJldHVybiBub2RlLmRlbGV0ZUluKHJlc3QpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIFlBTUwgY29sbGVjdGlvbiBhdCAke2tleX0uIFJlbWFpbmluZyBwYXRoOiAke3Jlc3R9YCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgaXRlbSBhdCBga2V5YCwgb3IgYHVuZGVmaW5lZGAgaWYgbm90IGZvdW5kLiBCeSBkZWZhdWx0IHVud3JhcHNcbiAgICAgKiBzY2FsYXIgdmFsdWVzIGZyb20gdGhlaXIgc3Vycm91bmRpbmcgbm9kZTsgdG8gZGlzYWJsZSBzZXQgYGtlZXBTY2FsYXJgIHRvXG4gICAgICogYHRydWVgIChjb2xsZWN0aW9ucyBhcmUgYWx3YXlzIHJldHVybmVkIGludGFjdCkuXG4gICAgICovXG4gICAgZ2V0SW4ocGF0aCwga2VlcFNjYWxhcikge1xuICAgICAgICBjb25zdCBba2V5LCAuLi5yZXN0XSA9IHBhdGg7XG4gICAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLmdldChrZXksIHRydWUpO1xuICAgICAgICBpZiAocmVzdC5sZW5ndGggPT09IDApXG4gICAgICAgICAgICByZXR1cm4gIWtlZXBTY2FsYXIgJiYgaXNTY2FsYXIobm9kZSkgPyBub2RlLnZhbHVlIDogbm9kZTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIGlzQ29sbGVjdGlvbihub2RlKSA/IG5vZGUuZ2V0SW4ocmVzdCwga2VlcFNjYWxhcikgOiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGhhc0FsbE51bGxWYWx1ZXMoYWxsb3dTY2FsYXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXRlbXMuZXZlcnkobm9kZSA9PiB7XG4gICAgICAgICAgICBpZiAoIWlzUGFpcihub2RlKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBjb25zdCBuID0gbm9kZS52YWx1ZTtcbiAgICAgICAgICAgIHJldHVybiAobiA9PSBudWxsIHx8XG4gICAgICAgICAgICAgICAgKGFsbG93U2NhbGFyICYmXG4gICAgICAgICAgICAgICAgICAgIGlzU2NhbGFyKG4pICYmXG4gICAgICAgICAgICAgICAgICAgIG4udmFsdWUgPT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgICAgICAhbi5jb21tZW50QmVmb3JlICYmXG4gICAgICAgICAgICAgICAgICAgICFuLmNvbW1lbnQgJiZcbiAgICAgICAgICAgICAgICAgICAgIW4udGFnKSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhlIGNvbGxlY3Rpb24gaW5jbHVkZXMgYSB2YWx1ZSB3aXRoIHRoZSBrZXkgYGtleWAuXG4gICAgICovXG4gICAgaGFzSW4ocGF0aCkge1xuICAgICAgICBjb25zdCBba2V5LCAuLi5yZXN0XSA9IHBhdGg7XG4gICAgICAgIGlmIChyZXN0Lmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmhhcyhrZXkpO1xuICAgICAgICBjb25zdCBub2RlID0gdGhpcy5nZXQoa2V5LCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIGlzQ29sbGVjdGlvbihub2RlKSA/IG5vZGUuaGFzSW4ocmVzdCkgOiBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyBhIHZhbHVlIGluIHRoaXMgY29sbGVjdGlvbi4gRm9yIGAhIXNldGAsIGB2YWx1ZWAgbmVlZHMgdG8gYmUgYVxuICAgICAqIGJvb2xlYW4gdG8gYWRkL3JlbW92ZSB0aGUgaXRlbSBmcm9tIHRoZSBzZXQuXG4gICAgICovXG4gICAgc2V0SW4ocGF0aCwgdmFsdWUpIHtcbiAgICAgICAgY29uc3QgW2tleSwgLi4ucmVzdF0gPSBwYXRoO1xuICAgICAgICBpZiAocmVzdC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuZ2V0KGtleSwgdHJ1ZSk7XG4gICAgICAgICAgICBpZiAoaXNDb2xsZWN0aW9uKG5vZGUpKVxuICAgICAgICAgICAgICAgIG5vZGUuc2V0SW4ocmVzdCwgdmFsdWUpO1xuICAgICAgICAgICAgZWxzZSBpZiAobm9kZSA9PT0gdW5kZWZpbmVkICYmIHRoaXMuc2NoZW1hKVxuICAgICAgICAgICAgICAgIHRoaXMuc2V0KGtleSwgY29sbGVjdGlvbkZyb21QYXRoKHRoaXMuc2NoZW1hLCByZXN0LCB2YWx1ZSkpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgWUFNTCBjb2xsZWN0aW9uIGF0ICR7a2V5fS4gUmVtYWluaW5nIHBhdGg6ICR7cmVzdH1gKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IHsgQ29sbGVjdGlvbiwgY29sbGVjdGlvbkZyb21QYXRoLCBpc0VtcHR5UGF0aCB9O1xuIiwiLyoqXG4gKiBTdHJpbmdpZmllcyBhIGNvbW1lbnQuXG4gKlxuICogRW1wdHkgY29tbWVudCBsaW5lcyBhcmUgbGVmdCBlbXB0eSxcbiAqIGxpbmVzIGNvbnNpc3Rpbmcgb2YgYSBzaW5nbGUgc3BhY2UgYXJlIHJlcGxhY2VkIGJ5IGAjYCxcbiAqIGFuZCBhbGwgb3RoZXIgbGluZXMgYXJlIHByZWZpeGVkIHdpdGggYSBgI2AuXG4gKi9cbmNvbnN0IHN0cmluZ2lmeUNvbW1lbnQgPSAoc3RyKSA9PiBzdHIucmVwbGFjZSgvXig/ISQpKD86ICQpPy9nbSwgJyMnKTtcbmZ1bmN0aW9uIGluZGVudENvbW1lbnQoY29tbWVudCwgaW5kZW50KSB7XG4gICAgaWYgKC9eXFxuKyQvLnRlc3QoY29tbWVudCkpXG4gICAgICAgIHJldHVybiBjb21tZW50LnN1YnN0cmluZygxKTtcbiAgICByZXR1cm4gaW5kZW50ID8gY29tbWVudC5yZXBsYWNlKC9eKD8hICokKS9nbSwgaW5kZW50KSA6IGNvbW1lbnQ7XG59XG5jb25zdCBsaW5lQ29tbWVudCA9IChzdHIsIGluZGVudCwgY29tbWVudCkgPT4gc3RyLmVuZHNXaXRoKCdcXG4nKVxuICAgID8gaW5kZW50Q29tbWVudChjb21tZW50LCBpbmRlbnQpXG4gICAgOiBjb21tZW50LmluY2x1ZGVzKCdcXG4nKVxuICAgICAgICA/ICdcXG4nICsgaW5kZW50Q29tbWVudChjb21tZW50LCBpbmRlbnQpXG4gICAgICAgIDogKHN0ci5lbmRzV2l0aCgnICcpID8gJycgOiAnICcpICsgY29tbWVudDtcblxuZXhwb3J0IHsgaW5kZW50Q29tbWVudCwgbGluZUNvbW1lbnQsIHN0cmluZ2lmeUNvbW1lbnQgfTtcbiIsImNvbnN0IEZPTERfRkxPVyA9ICdmbG93JztcbmNvbnN0IEZPTERfQkxPQ0sgPSAnYmxvY2snO1xuY29uc3QgRk9MRF9RVU9URUQgPSAncXVvdGVkJztcbi8qKlxuICogVHJpZXMgdG8ga2VlcCBpbnB1dCBhdCB1cCB0byBgbGluZVdpZHRoYCBjaGFyYWN0ZXJzLCBzcGxpdHRpbmcgb25seSBvbiBzcGFjZXNcbiAqIG5vdCBmb2xsb3dlZCBieSBuZXdsaW5lcyBvciBzcGFjZXMgdW5sZXNzIGBtb2RlYCBpcyBgJ3F1b3RlZCdgLiBMaW5lcyBhcmVcbiAqIHRlcm1pbmF0ZWQgd2l0aCBgXFxuYCBhbmQgc3RhcnRlZCB3aXRoIGBpbmRlbnRgLlxuICovXG5mdW5jdGlvbiBmb2xkRmxvd0xpbmVzKHRleHQsIGluZGVudCwgbW9kZSA9ICdmbG93JywgeyBpbmRlbnRBdFN0YXJ0LCBsaW5lV2lkdGggPSA4MCwgbWluQ29udGVudFdpZHRoID0gMjAsIG9uRm9sZCwgb25PdmVyZmxvdyB9ID0ge30pIHtcbiAgICBpZiAoIWxpbmVXaWR0aCB8fCBsaW5lV2lkdGggPCAwKVxuICAgICAgICByZXR1cm4gdGV4dDtcbiAgICBpZiAobGluZVdpZHRoIDwgbWluQ29udGVudFdpZHRoKVxuICAgICAgICBtaW5Db250ZW50V2lkdGggPSAwO1xuICAgIGNvbnN0IGVuZFN0ZXAgPSBNYXRoLm1heCgxICsgbWluQ29udGVudFdpZHRoLCAxICsgbGluZVdpZHRoIC0gaW5kZW50Lmxlbmd0aCk7XG4gICAgaWYgKHRleHQubGVuZ3RoIDw9IGVuZFN0ZXApXG4gICAgICAgIHJldHVybiB0ZXh0O1xuICAgIGNvbnN0IGZvbGRzID0gW107XG4gICAgY29uc3QgZXNjYXBlZEZvbGRzID0ge307XG4gICAgbGV0IGVuZCA9IGxpbmVXaWR0aCAtIGluZGVudC5sZW5ndGg7XG4gICAgaWYgKHR5cGVvZiBpbmRlbnRBdFN0YXJ0ID09PSAnbnVtYmVyJykge1xuICAgICAgICBpZiAoaW5kZW50QXRTdGFydCA+IGxpbmVXaWR0aCAtIE1hdGgubWF4KDIsIG1pbkNvbnRlbnRXaWR0aCkpXG4gICAgICAgICAgICBmb2xkcy5wdXNoKDApO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBlbmQgPSBsaW5lV2lkdGggLSBpbmRlbnRBdFN0YXJ0O1xuICAgIH1cbiAgICBsZXQgc3BsaXQgPSB1bmRlZmluZWQ7XG4gICAgbGV0IHByZXYgPSB1bmRlZmluZWQ7XG4gICAgbGV0IG92ZXJmbG93ID0gZmFsc2U7XG4gICAgbGV0IGkgPSAtMTtcbiAgICBsZXQgZXNjU3RhcnQgPSAtMTtcbiAgICBsZXQgZXNjRW5kID0gLTE7XG4gICAgaWYgKG1vZGUgPT09IEZPTERfQkxPQ0spIHtcbiAgICAgICAgaSA9IGNvbnN1bWVNb3JlSW5kZW50ZWRMaW5lcyh0ZXh0LCBpLCBpbmRlbnQubGVuZ3RoKTtcbiAgICAgICAgaWYgKGkgIT09IC0xKVxuICAgICAgICAgICAgZW5kID0gaSArIGVuZFN0ZXA7XG4gICAgfVxuICAgIGZvciAobGV0IGNoOyAoY2ggPSB0ZXh0WyhpICs9IDEpXSk7KSB7XG4gICAgICAgIGlmIChtb2RlID09PSBGT0xEX1FVT1RFRCAmJiBjaCA9PT0gJ1xcXFwnKSB7XG4gICAgICAgICAgICBlc2NTdGFydCA9IGk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRleHRbaSArIDFdKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAneCc6XG4gICAgICAgICAgICAgICAgICAgIGkgKz0gMztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAndSc6XG4gICAgICAgICAgICAgICAgICAgIGkgKz0gNTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnVSc6XG4gICAgICAgICAgICAgICAgICAgIGkgKz0gOTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZXNjRW5kID0gaTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2ggPT09ICdcXG4nKSB7XG4gICAgICAgICAgICBpZiAobW9kZSA9PT0gRk9MRF9CTE9DSylcbiAgICAgICAgICAgICAgICBpID0gY29uc3VtZU1vcmVJbmRlbnRlZExpbmVzKHRleHQsIGksIGluZGVudC5sZW5ndGgpO1xuICAgICAgICAgICAgZW5kID0gaSArIGluZGVudC5sZW5ndGggKyBlbmRTdGVwO1xuICAgICAgICAgICAgc3BsaXQgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoY2ggPT09ICcgJyAmJlxuICAgICAgICAgICAgICAgIHByZXYgJiZcbiAgICAgICAgICAgICAgICBwcmV2ICE9PSAnICcgJiZcbiAgICAgICAgICAgICAgICBwcmV2ICE9PSAnXFxuJyAmJlxuICAgICAgICAgICAgICAgIHByZXYgIT09ICdcXHQnKSB7XG4gICAgICAgICAgICAgICAgLy8gc3BhY2Ugc3Vycm91bmRlZCBieSBub24tc3BhY2UgY2FuIGJlIHJlcGxhY2VkIHdpdGggbmV3bGluZSArIGluZGVudFxuICAgICAgICAgICAgICAgIGNvbnN0IG5leHQgPSB0ZXh0W2kgKyAxXTtcbiAgICAgICAgICAgICAgICBpZiAobmV4dCAmJiBuZXh0ICE9PSAnICcgJiYgbmV4dCAhPT0gJ1xcbicgJiYgbmV4dCAhPT0gJ1xcdCcpXG4gICAgICAgICAgICAgICAgICAgIHNwbGl0ID0gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpID49IGVuZCkge1xuICAgICAgICAgICAgICAgIGlmIChzcGxpdCkge1xuICAgICAgICAgICAgICAgICAgICBmb2xkcy5wdXNoKHNwbGl0KTtcbiAgICAgICAgICAgICAgICAgICAgZW5kID0gc3BsaXQgKyBlbmRTdGVwO1xuICAgICAgICAgICAgICAgICAgICBzcGxpdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobW9kZSA9PT0gRk9MRF9RVU9URUQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gd2hpdGUtc3BhY2UgY29sbGVjdGVkIGF0IGVuZCBtYXkgc3RyZXRjaCBwYXN0IGxpbmVXaWR0aFxuICAgICAgICAgICAgICAgICAgICB3aGlsZSAocHJldiA9PT0gJyAnIHx8IHByZXYgPT09ICdcXHQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmV2ID0gY2g7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaCA9IHRleHRbKGkgKz0gMSldO1xuICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3cgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIEFjY291bnQgZm9yIG5ld2xpbmUgZXNjYXBlLCBidXQgZG9uJ3QgYnJlYWsgcHJlY2VkaW5nIGVzY2FwZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBqID0gaSA+IGVzY0VuZCArIDEgPyBpIC0gMiA6IGVzY1N0YXJ0IC0gMTtcbiAgICAgICAgICAgICAgICAgICAgLy8gQmFpbCBvdXQgaWYgbGluZVdpZHRoICYgbWluQ29udGVudFdpZHRoIGFyZSBzaG9ydGVyIHRoYW4gYW4gZXNjYXBlIHN0cmluZ1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXNjYXBlZEZvbGRzW2pdKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgICAgICAgICAgICAgICAgIGZvbGRzLnB1c2goaik7XG4gICAgICAgICAgICAgICAgICAgIGVzY2FwZWRGb2xkc1tqXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGVuZCA9IGogKyBlbmRTdGVwO1xuICAgICAgICAgICAgICAgICAgICBzcGxpdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG92ZXJmbG93ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcHJldiA9IGNoO1xuICAgIH1cbiAgICBpZiAob3ZlcmZsb3cgJiYgb25PdmVyZmxvdylcbiAgICAgICAgb25PdmVyZmxvdygpO1xuICAgIGlmIChmb2xkcy5sZW5ndGggPT09IDApXG4gICAgICAgIHJldHVybiB0ZXh0O1xuICAgIGlmIChvbkZvbGQpXG4gICAgICAgIG9uRm9sZCgpO1xuICAgIGxldCByZXMgPSB0ZXh0LnNsaWNlKDAsIGZvbGRzWzBdKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZvbGRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNvbnN0IGZvbGQgPSBmb2xkc1tpXTtcbiAgICAgICAgY29uc3QgZW5kID0gZm9sZHNbaSArIDFdIHx8IHRleHQubGVuZ3RoO1xuICAgICAgICBpZiAoZm9sZCA9PT0gMClcbiAgICAgICAgICAgIHJlcyA9IGBcXG4ke2luZGVudH0ke3RleHQuc2xpY2UoMCwgZW5kKX1gO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChtb2RlID09PSBGT0xEX1FVT1RFRCAmJiBlc2NhcGVkRm9sZHNbZm9sZF0pXG4gICAgICAgICAgICAgICAgcmVzICs9IGAke3RleHRbZm9sZF19XFxcXGA7XG4gICAgICAgICAgICByZXMgKz0gYFxcbiR7aW5kZW50fSR7dGV4dC5zbGljZShmb2xkICsgMSwgZW5kKX1gO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG4vKipcbiAqIFByZXN1bWVzIGBpICsgMWAgaXMgYXQgdGhlIHN0YXJ0IG9mIGEgbGluZVxuICogQHJldHVybnMgaW5kZXggb2YgbGFzdCBuZXdsaW5lIGluIG1vcmUtaW5kZW50ZWQgYmxvY2tcbiAqL1xuZnVuY3Rpb24gY29uc3VtZU1vcmVJbmRlbnRlZExpbmVzKHRleHQsIGksIGluZGVudCkge1xuICAgIGxldCBlbmQgPSBpO1xuICAgIGxldCBzdGFydCA9IGkgKyAxO1xuICAgIGxldCBjaCA9IHRleHRbc3RhcnRdO1xuICAgIHdoaWxlIChjaCA9PT0gJyAnIHx8IGNoID09PSAnXFx0Jykge1xuICAgICAgICBpZiAoaSA8IHN0YXJ0ICsgaW5kZW50KSB7XG4gICAgICAgICAgICBjaCA9IHRleHRbKytpXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICBjaCA9IHRleHRbKytpXTtcbiAgICAgICAgICAgIH0gd2hpbGUgKGNoICYmIGNoICE9PSAnXFxuJyk7XG4gICAgICAgICAgICBlbmQgPSBpO1xuICAgICAgICAgICAgc3RhcnQgPSBpICsgMTtcbiAgICAgICAgICAgIGNoID0gdGV4dFtzdGFydF07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGVuZDtcbn1cblxuZXhwb3J0IHsgRk9MRF9CTE9DSywgRk9MRF9GTE9XLCBGT0xEX1FVT1RFRCwgZm9sZEZsb3dMaW5lcyB9O1xuIiwiaW1wb3J0IHsgU2NhbGFyIH0gZnJvbSAnLi4vbm9kZXMvU2NhbGFyLmpzJztcbmltcG9ydCB7IGZvbGRGbG93TGluZXMsIEZPTERfRkxPVywgRk9MRF9RVU9URUQsIEZPTERfQkxPQ0sgfSBmcm9tICcuL2ZvbGRGbG93TGluZXMuanMnO1xuXG5jb25zdCBnZXRGb2xkT3B0aW9ucyA9IChjdHgsIGlzQmxvY2spID0+ICh7XG4gICAgaW5kZW50QXRTdGFydDogaXNCbG9jayA/IGN0eC5pbmRlbnQubGVuZ3RoIDogY3R4LmluZGVudEF0U3RhcnQsXG4gICAgbGluZVdpZHRoOiBjdHgub3B0aW9ucy5saW5lV2lkdGgsXG4gICAgbWluQ29udGVudFdpZHRoOiBjdHgub3B0aW9ucy5taW5Db250ZW50V2lkdGhcbn0pO1xuLy8gQWxzbyBjaGVja3MgZm9yIGxpbmVzIHN0YXJ0aW5nIHdpdGggJSwgYXMgcGFyc2luZyB0aGUgb3V0cHV0IGFzIFlBTUwgMS4xIHdpbGxcbi8vIHByZXN1bWUgdGhhdCdzIHN0YXJ0aW5nIGEgbmV3IGRvY3VtZW50LlxuY29uc3QgY29udGFpbnNEb2N1bWVudE1hcmtlciA9IChzdHIpID0+IC9eKCV8LS0tfFxcLlxcLlxcLikvbS50ZXN0KHN0cik7XG5mdW5jdGlvbiBsaW5lTGVuZ3RoT3ZlckxpbWl0KHN0ciwgbGluZVdpZHRoLCBpbmRlbnRMZW5ndGgpIHtcbiAgICBpZiAoIWxpbmVXaWR0aCB8fCBsaW5lV2lkdGggPCAwKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgbGltaXQgPSBsaW5lV2lkdGggLSBpbmRlbnRMZW5ndGg7XG4gICAgY29uc3Qgc3RyTGVuID0gc3RyLmxlbmd0aDtcbiAgICBpZiAoc3RyTGVuIDw9IGxpbWl0KVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDAsIHN0YXJ0ID0gMDsgaSA8IHN0ckxlbjsgKytpKSB7XG4gICAgICAgIGlmIChzdHJbaV0gPT09ICdcXG4nKSB7XG4gICAgICAgICAgICBpZiAoaSAtIHN0YXJ0ID4gbGltaXQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBzdGFydCA9IGkgKyAxO1xuICAgICAgICAgICAgaWYgKHN0ckxlbiAtIHN0YXJ0IDw9IGxpbWl0KVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIGRvdWJsZVF1b3RlZFN0cmluZyh2YWx1ZSwgY3R4KSB7XG4gICAgY29uc3QganNvbiA9IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICBpZiAoY3R4Lm9wdGlvbnMuZG91YmxlUXVvdGVkQXNKU09OKVxuICAgICAgICByZXR1cm4ganNvbjtcbiAgICBjb25zdCB7IGltcGxpY2l0S2V5IH0gPSBjdHg7XG4gICAgY29uc3QgbWluTXVsdGlMaW5lTGVuZ3RoID0gY3R4Lm9wdGlvbnMuZG91YmxlUXVvdGVkTWluTXVsdGlMaW5lTGVuZ3RoO1xuICAgIGNvbnN0IGluZGVudCA9IGN0eC5pbmRlbnQgfHwgKGNvbnRhaW5zRG9jdW1lbnRNYXJrZXIodmFsdWUpID8gJyAgJyA6ICcnKTtcbiAgICBsZXQgc3RyID0gJyc7XG4gICAgbGV0IHN0YXJ0ID0gMDtcbiAgICBmb3IgKGxldCBpID0gMCwgY2ggPSBqc29uW2ldOyBjaDsgY2ggPSBqc29uWysraV0pIHtcbiAgICAgICAgaWYgKGNoID09PSAnICcgJiYganNvbltpICsgMV0gPT09ICdcXFxcJyAmJiBqc29uW2kgKyAyXSA9PT0gJ24nKSB7XG4gICAgICAgICAgICAvLyBzcGFjZSBiZWZvcmUgbmV3bGluZSBuZWVkcyB0byBiZSBlc2NhcGVkIHRvIG5vdCBiZSBmb2xkZWRcbiAgICAgICAgICAgIHN0ciArPSBqc29uLnNsaWNlKHN0YXJ0LCBpKSArICdcXFxcICc7XG4gICAgICAgICAgICBpICs9IDE7XG4gICAgICAgICAgICBzdGFydCA9IGk7XG4gICAgICAgICAgICBjaCA9ICdcXFxcJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2ggPT09ICdcXFxcJylcbiAgICAgICAgICAgIHN3aXRjaCAoanNvbltpICsgMV0pIHtcbiAgICAgICAgICAgICAgICBjYXNlICd1JzpcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IGpzb24uc2xpY2Uoc3RhcnQsIGkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29kZSA9IGpzb24uc3Vic3RyKGkgKyAyLCA0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoY29kZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzAwMDAnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gJ1xcXFwwJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnMDAwNyc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSAnXFxcXGEnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcwMDBiJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9ICdcXFxcdic7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzAwMWInOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gJ1xcXFxlJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnMDA4NSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSAnXFxcXE4nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcwMGEwJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9ICdcXFxcXyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzIwMjgnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gJ1xcXFxMJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnMjAyOSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSAnXFxcXFAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZS5zdWJzdHIoMCwgMikgPT09ICcwMCcpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gJ1xcXFx4JyArIGNvZGUuc3Vic3RyKDIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0ganNvbi5zdWJzdHIoaSwgNik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpICs9IDU7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IGkgKyAxO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ24nOlxuICAgICAgICAgICAgICAgICAgICBpZiAoaW1wbGljaXRLZXkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGpzb25baSArIDJdID09PSAnXCInIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBqc29uLmxlbmd0aCA8IG1pbk11bHRpTGluZUxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9sZGluZyB3aWxsIGVhdCBmaXJzdCBuZXdsaW5lXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0ganNvbi5zbGljZShzdGFydCwgaSkgKyAnXFxuXFxuJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChqc29uW2kgKyAyXSA9PT0gJ1xcXFwnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAganNvbltpICsgM10gPT09ICduJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzb25baSArIDRdICE9PSAnXCInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9ICdcXG4nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgKz0gMjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBpbmRlbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzcGFjZSBhZnRlciBuZXdsaW5lIG5lZWRzIHRvIGJlIGVzY2FwZWQgdG8gbm90IGJlIGZvbGRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpzb25baSArIDJdID09PSAnICcpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9ICdcXFxcJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGkgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gaSArIDE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICAgICAgfVxuICAgIH1cbiAgICBzdHIgPSBzdGFydCA/IHN0ciArIGpzb24uc2xpY2Uoc3RhcnQpIDoganNvbjtcbiAgICByZXR1cm4gaW1wbGljaXRLZXlcbiAgICAgICAgPyBzdHJcbiAgICAgICAgOiBmb2xkRmxvd0xpbmVzKHN0ciwgaW5kZW50LCBGT0xEX1FVT1RFRCwgZ2V0Rm9sZE9wdGlvbnMoY3R4LCBmYWxzZSkpO1xufVxuZnVuY3Rpb24gc2luZ2xlUXVvdGVkU3RyaW5nKHZhbHVlLCBjdHgpIHtcbiAgICBpZiAoY3R4Lm9wdGlvbnMuc2luZ2xlUXVvdGUgPT09IGZhbHNlIHx8XG4gICAgICAgIChjdHguaW1wbGljaXRLZXkgJiYgdmFsdWUuaW5jbHVkZXMoJ1xcbicpKSB8fFxuICAgICAgICAvWyBcXHRdXFxufFxcblsgXFx0XS8udGVzdCh2YWx1ZSkgLy8gc2luZ2xlIHF1b3RlZCBzdHJpbmcgY2FuJ3QgaGF2ZSBsZWFkaW5nIG9yIHRyYWlsaW5nIHdoaXRlc3BhY2UgYXJvdW5kIG5ld2xpbmVcbiAgICApXG4gICAgICAgIHJldHVybiBkb3VibGVRdW90ZWRTdHJpbmcodmFsdWUsIGN0eCk7XG4gICAgY29uc3QgaW5kZW50ID0gY3R4LmluZGVudCB8fCAoY29udGFpbnNEb2N1bWVudE1hcmtlcih2YWx1ZSkgPyAnICAnIDogJycpO1xuICAgIGNvbnN0IHJlcyA9IFwiJ1wiICsgdmFsdWUucmVwbGFjZSgvJy9nLCBcIicnXCIpLnJlcGxhY2UoL1xcbisvZywgYCQmXFxuJHtpbmRlbnR9YCkgKyBcIidcIjtcbiAgICByZXR1cm4gY3R4LmltcGxpY2l0S2V5XG4gICAgICAgID8gcmVzXG4gICAgICAgIDogZm9sZEZsb3dMaW5lcyhyZXMsIGluZGVudCwgRk9MRF9GTE9XLCBnZXRGb2xkT3B0aW9ucyhjdHgsIGZhbHNlKSk7XG59XG5mdW5jdGlvbiBxdW90ZWRTdHJpbmcodmFsdWUsIGN0eCkge1xuICAgIGNvbnN0IHsgc2luZ2xlUXVvdGUgfSA9IGN0eC5vcHRpb25zO1xuICAgIGxldCBxcztcbiAgICBpZiAoc2luZ2xlUXVvdGUgPT09IGZhbHNlKVxuICAgICAgICBxcyA9IGRvdWJsZVF1b3RlZFN0cmluZztcbiAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgaGFzRG91YmxlID0gdmFsdWUuaW5jbHVkZXMoJ1wiJyk7XG4gICAgICAgIGNvbnN0IGhhc1NpbmdsZSA9IHZhbHVlLmluY2x1ZGVzKFwiJ1wiKTtcbiAgICAgICAgaWYgKGhhc0RvdWJsZSAmJiAhaGFzU2luZ2xlKVxuICAgICAgICAgICAgcXMgPSBzaW5nbGVRdW90ZWRTdHJpbmc7XG4gICAgICAgIGVsc2UgaWYgKGhhc1NpbmdsZSAmJiAhaGFzRG91YmxlKVxuICAgICAgICAgICAgcXMgPSBkb3VibGVRdW90ZWRTdHJpbmc7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHFzID0gc2luZ2xlUXVvdGUgPyBzaW5nbGVRdW90ZWRTdHJpbmcgOiBkb3VibGVRdW90ZWRTdHJpbmc7XG4gICAgfVxuICAgIHJldHVybiBxcyh2YWx1ZSwgY3R4KTtcbn1cbi8vIFRoZSBuZWdhdGl2ZSBsb29rYmVoaW5kIGF2b2lkcyBhIHBvbHlub21pYWwgc2VhcmNoLFxuLy8gYnV0IGlzbid0IHN1cHBvcnRlZCB5ZXQgb24gU2FmYXJpOiBodHRwczovL2Nhbml1c2UuY29tL2pzLXJlZ2V4cC1sb29rYmVoaW5kXG5sZXQgYmxvY2tFbmROZXdsaW5lcztcbnRyeSB7XG4gICAgYmxvY2tFbmROZXdsaW5lcyA9IG5ldyBSZWdFeHAoJyhefCg/PCFcXG4pKVxcbisoPyFcXG58JCknLCAnZycpO1xufVxuY2F0Y2gge1xuICAgIGJsb2NrRW5kTmV3bGluZXMgPSAvXFxuKyg/IVxcbnwkKS9nO1xufVxuZnVuY3Rpb24gYmxvY2tTdHJpbmcoeyBjb21tZW50LCB0eXBlLCB2YWx1ZSB9LCBjdHgsIG9uQ29tbWVudCwgb25DaG9tcEtlZXApIHtcbiAgICBjb25zdCB7IGJsb2NrUXVvdGUsIGNvbW1lbnRTdHJpbmcsIGxpbmVXaWR0aCB9ID0gY3R4Lm9wdGlvbnM7XG4gICAgLy8gMS4gQmxvY2sgY2FuJ3QgZW5kIGluIHdoaXRlc3BhY2UgdW5sZXNzIHRoZSBsYXN0IGxpbmUgaXMgbm9uLWVtcHR5LlxuICAgIC8vIDIuIFN0cmluZ3MgY29uc2lzdGluZyBvZiBvbmx5IHdoaXRlc3BhY2UgYXJlIGJlc3QgcmVuZGVyZWQgZXhwbGljaXRseS5cbiAgICBpZiAoIWJsb2NrUXVvdGUgfHwgL1xcbltcXHQgXSskLy50ZXN0KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gcXVvdGVkU3RyaW5nKHZhbHVlLCBjdHgpO1xuICAgIH1cbiAgICBjb25zdCBpbmRlbnQgPSBjdHguaW5kZW50IHx8XG4gICAgICAgIChjdHguZm9yY2VCbG9ja0luZGVudCB8fCBjb250YWluc0RvY3VtZW50TWFya2VyKHZhbHVlKSA/ICcgICcgOiAnJyk7XG4gICAgY29uc3QgbGl0ZXJhbCA9IGJsb2NrUXVvdGUgPT09ICdsaXRlcmFsJ1xuICAgICAgICA/IHRydWVcbiAgICAgICAgOiBibG9ja1F1b3RlID09PSAnZm9sZGVkJyB8fCB0eXBlID09PSBTY2FsYXIuQkxPQ0tfRk9MREVEXG4gICAgICAgICAgICA/IGZhbHNlXG4gICAgICAgICAgICA6IHR5cGUgPT09IFNjYWxhci5CTE9DS19MSVRFUkFMXG4gICAgICAgICAgICAgICAgPyB0cnVlXG4gICAgICAgICAgICAgICAgOiAhbGluZUxlbmd0aE92ZXJMaW1pdCh2YWx1ZSwgbGluZVdpZHRoLCBpbmRlbnQubGVuZ3RoKTtcbiAgICBpZiAoIXZhbHVlKVxuICAgICAgICByZXR1cm4gbGl0ZXJhbCA/ICd8XFxuJyA6ICc+XFxuJztcbiAgICAvLyBkZXRlcm1pbmUgY2hvbXBpbmcgZnJvbSB3aGl0ZXNwYWNlIGF0IHZhbHVlIGVuZFxuICAgIGxldCBjaG9tcDtcbiAgICBsZXQgZW5kU3RhcnQ7XG4gICAgZm9yIChlbmRTdGFydCA9IHZhbHVlLmxlbmd0aDsgZW5kU3RhcnQgPiAwOyAtLWVuZFN0YXJ0KSB7XG4gICAgICAgIGNvbnN0IGNoID0gdmFsdWVbZW5kU3RhcnQgLSAxXTtcbiAgICAgICAgaWYgKGNoICE9PSAnXFxuJyAmJiBjaCAhPT0gJ1xcdCcgJiYgY2ggIT09ICcgJylcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBsZXQgZW5kID0gdmFsdWUuc3Vic3RyaW5nKGVuZFN0YXJ0KTtcbiAgICBjb25zdCBlbmRObFBvcyA9IGVuZC5pbmRleE9mKCdcXG4nKTtcbiAgICBpZiAoZW5kTmxQb3MgPT09IC0xKSB7XG4gICAgICAgIGNob21wID0gJy0nOyAvLyBzdHJpcFxuICAgIH1cbiAgICBlbHNlIGlmICh2YWx1ZSA9PT0gZW5kIHx8IGVuZE5sUG9zICE9PSBlbmQubGVuZ3RoIC0gMSkge1xuICAgICAgICBjaG9tcCA9ICcrJzsgLy8ga2VlcFxuICAgICAgICBpZiAob25DaG9tcEtlZXApXG4gICAgICAgICAgICBvbkNob21wS2VlcCgpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY2hvbXAgPSAnJzsgLy8gY2xpcFxuICAgIH1cbiAgICBpZiAoZW5kKSB7XG4gICAgICAgIHZhbHVlID0gdmFsdWUuc2xpY2UoMCwgLWVuZC5sZW5ndGgpO1xuICAgICAgICBpZiAoZW5kW2VuZC5sZW5ndGggLSAxXSA9PT0gJ1xcbicpXG4gICAgICAgICAgICBlbmQgPSBlbmQuc2xpY2UoMCwgLTEpO1xuICAgICAgICBlbmQgPSBlbmQucmVwbGFjZShibG9ja0VuZE5ld2xpbmVzLCBgJCYke2luZGVudH1gKTtcbiAgICB9XG4gICAgLy8gZGV0ZXJtaW5lIGluZGVudCBpbmRpY2F0b3IgZnJvbSB3aGl0ZXNwYWNlIGF0IHZhbHVlIHN0YXJ0XG4gICAgbGV0IHN0YXJ0V2l0aFNwYWNlID0gZmFsc2U7XG4gICAgbGV0IHN0YXJ0RW5kO1xuICAgIGxldCBzdGFydE5sUG9zID0gLTE7XG4gICAgZm9yIChzdGFydEVuZCA9IDA7IHN0YXJ0RW5kIDwgdmFsdWUubGVuZ3RoOyArK3N0YXJ0RW5kKSB7XG4gICAgICAgIGNvbnN0IGNoID0gdmFsdWVbc3RhcnRFbmRdO1xuICAgICAgICBpZiAoY2ggPT09ICcgJylcbiAgICAgICAgICAgIHN0YXJ0V2l0aFNwYWNlID0gdHJ1ZTtcbiAgICAgICAgZWxzZSBpZiAoY2ggPT09ICdcXG4nKVxuICAgICAgICAgICAgc3RhcnRObFBvcyA9IHN0YXJ0RW5kO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG4gICAgbGV0IHN0YXJ0ID0gdmFsdWUuc3Vic3RyaW5nKDAsIHN0YXJ0TmxQb3MgPCBzdGFydEVuZCA/IHN0YXJ0TmxQb3MgKyAxIDogc3RhcnRFbmQpO1xuICAgIGlmIChzdGFydCkge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlLnN1YnN0cmluZyhzdGFydC5sZW5ndGgpO1xuICAgICAgICBzdGFydCA9IHN0YXJ0LnJlcGxhY2UoL1xcbisvZywgYCQmJHtpbmRlbnR9YCk7XG4gICAgfVxuICAgIGNvbnN0IGluZGVudFNpemUgPSBpbmRlbnQgPyAnMicgOiAnMSc7IC8vIHJvb3QgaXMgYXQgLTFcbiAgICAvLyBMZWFkaW5nIHwgb3IgPiBpcyBhZGRlZCBsYXRlclxuICAgIGxldCBoZWFkZXIgPSAoc3RhcnRXaXRoU3BhY2UgPyBpbmRlbnRTaXplIDogJycpICsgY2hvbXA7XG4gICAgaWYgKGNvbW1lbnQpIHtcbiAgICAgICAgaGVhZGVyICs9ICcgJyArIGNvbW1lbnRTdHJpbmcoY29tbWVudC5yZXBsYWNlKC8gP1tcXHJcXG5dKy9nLCAnICcpKTtcbiAgICAgICAgaWYgKG9uQ29tbWVudClcbiAgICAgICAgICAgIG9uQ29tbWVudCgpO1xuICAgIH1cbiAgICBpZiAoIWxpdGVyYWwpIHtcbiAgICAgICAgY29uc3QgZm9sZGVkVmFsdWUgPSB2YWx1ZVxuICAgICAgICAgICAgLnJlcGxhY2UoL1xcbisvZywgJ1xcbiQmJylcbiAgICAgICAgICAgIC5yZXBsYWNlKC8oPzpefFxcbikoW1xcdCBdLiopKD86KFtcXG5cXHQgXSopXFxuKD8hW1xcblxcdCBdKSk/L2csICckMSQyJykgLy8gbW9yZS1pbmRlbnRlZCBsaW5lcyBhcmVuJ3QgZm9sZGVkXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICBeIG1vcmUtaW5kLiBeIGVtcHR5ICAgICBeIGNhcHR1cmUgbmV4dCBlbXB0eSBsaW5lcyBvbmx5IGF0IGVuZCBvZiBpbmRlbnRcbiAgICAgICAgICAgIC5yZXBsYWNlKC9cXG4rL2csIGAkJiR7aW5kZW50fWApO1xuICAgICAgICBsZXQgbGl0ZXJhbEZhbGxiYWNrID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IGZvbGRPcHRpb25zID0gZ2V0Rm9sZE9wdGlvbnMoY3R4LCB0cnVlKTtcbiAgICAgICAgaWYgKGJsb2NrUXVvdGUgIT09ICdmb2xkZWQnICYmIHR5cGUgIT09IFNjYWxhci5CTE9DS19GT0xERUQpIHtcbiAgICAgICAgICAgIGZvbGRPcHRpb25zLm9uT3ZlcmZsb3cgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgbGl0ZXJhbEZhbGxiYWNrID0gdHJ1ZTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYm9keSA9IGZvbGRGbG93TGluZXMoYCR7c3RhcnR9JHtmb2xkZWRWYWx1ZX0ke2VuZH1gLCBpbmRlbnQsIEZPTERfQkxPQ0ssIGZvbGRPcHRpb25zKTtcbiAgICAgICAgaWYgKCFsaXRlcmFsRmFsbGJhY2spXG4gICAgICAgICAgICByZXR1cm4gYD4ke2hlYWRlcn1cXG4ke2luZGVudH0ke2JvZHl9YDtcbiAgICB9XG4gICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9cXG4rL2csIGAkJiR7aW5kZW50fWApO1xuICAgIHJldHVybiBgfCR7aGVhZGVyfVxcbiR7aW5kZW50fSR7c3RhcnR9JHt2YWx1ZX0ke2VuZH1gO1xufVxuZnVuY3Rpb24gcGxhaW5TdHJpbmcoaXRlbSwgY3R4LCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKSB7XG4gICAgY29uc3QgeyB0eXBlLCB2YWx1ZSB9ID0gaXRlbTtcbiAgICBjb25zdCB7IGFjdHVhbFN0cmluZywgaW1wbGljaXRLZXksIGluZGVudCwgaW5kZW50U3RlcCwgaW5GbG93IH0gPSBjdHg7XG4gICAgaWYgKChpbXBsaWNpdEtleSAmJiB2YWx1ZS5pbmNsdWRlcygnXFxuJykpIHx8XG4gICAgICAgIChpbkZsb3cgJiYgL1tbXFxde30sXS8udGVzdCh2YWx1ZSkpKSB7XG4gICAgICAgIHJldHVybiBxdW90ZWRTdHJpbmcodmFsdWUsIGN0eCk7XG4gICAgfVxuICAgIGlmICgvXltcXG5cXHQgLFtcXF17fSMmKiF8PidcIiVAYF18Xls/LV0kfF5bPy1dWyBcXHRdfFtcXG46XVsgXFx0XXxbIFxcdF1cXG58W1xcblxcdCBdI3xbXFxuXFx0IDpdJC8udGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgLy8gbm90IGFsbG93ZWQ6XG4gICAgICAgIC8vIC0gJy0nIG9yICc/J1xuICAgICAgICAvLyAtIHN0YXJ0IHdpdGggYW4gaW5kaWNhdG9yIGNoYXJhY3RlciAoZXhjZXB0IFs/Oi1dKSBvciAvWz8tXSAvXG4gICAgICAgIC8vIC0gJ1xcbiAnLCAnOiAnIG9yICcgXFxuJyBhbnl3aGVyZVxuICAgICAgICAvLyAtICcjJyBub3QgcHJlY2VkZWQgYnkgYSBub24tc3BhY2UgY2hhclxuICAgICAgICAvLyAtIGVuZCB3aXRoICcgJyBvciAnOidcbiAgICAgICAgcmV0dXJuIGltcGxpY2l0S2V5IHx8IGluRmxvdyB8fCAhdmFsdWUuaW5jbHVkZXMoJ1xcbicpXG4gICAgICAgICAgICA/IHF1b3RlZFN0cmluZyh2YWx1ZSwgY3R4KVxuICAgICAgICAgICAgOiBibG9ja1N0cmluZyhpdGVtLCBjdHgsIG9uQ29tbWVudCwgb25DaG9tcEtlZXApO1xuICAgIH1cbiAgICBpZiAoIWltcGxpY2l0S2V5ICYmXG4gICAgICAgICFpbkZsb3cgJiZcbiAgICAgICAgdHlwZSAhPT0gU2NhbGFyLlBMQUlOICYmXG4gICAgICAgIHZhbHVlLmluY2x1ZGVzKCdcXG4nKSkge1xuICAgICAgICAvLyBXaGVyZSBhbGxvd2VkICYgdHlwZSBub3Qgc2V0IGV4cGxpY2l0bHksIHByZWZlciBibG9jayBzdHlsZSBmb3IgbXVsdGlsaW5lIHN0cmluZ3NcbiAgICAgICAgcmV0dXJuIGJsb2NrU3RyaW5nKGl0ZW0sIGN0eCwgb25Db21tZW50LCBvbkNob21wS2VlcCk7XG4gICAgfVxuICAgIGlmIChjb250YWluc0RvY3VtZW50TWFya2VyKHZhbHVlKSkge1xuICAgICAgICBpZiAoaW5kZW50ID09PSAnJykge1xuICAgICAgICAgICAgY3R4LmZvcmNlQmxvY2tJbmRlbnQgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIGJsb2NrU3RyaW5nKGl0ZW0sIGN0eCwgb25Db21tZW50LCBvbkNob21wS2VlcCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaW1wbGljaXRLZXkgJiYgaW5kZW50ID09PSBpbmRlbnRTdGVwKSB7XG4gICAgICAgICAgICByZXR1cm4gcXVvdGVkU3RyaW5nKHZhbHVlLCBjdHgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHN0ciA9IHZhbHVlLnJlcGxhY2UoL1xcbisvZywgYCQmXFxuJHtpbmRlbnR9YCk7XG4gICAgLy8gVmVyaWZ5IHRoYXQgb3V0cHV0IHdpbGwgYmUgcGFyc2VkIGFzIGEgc3RyaW5nLCBhcyBlLmcuIHBsYWluIG51bWJlcnMgYW5kXG4gICAgLy8gYm9vbGVhbnMgZ2V0IHBhcnNlZCB3aXRoIHRob3NlIHR5cGVzIGluIHYxLjIgKGUuZy4gJzQyJywgJ3RydWUnICYgJzAuOWUtMycpLFxuICAgIC8vIGFuZCBvdGhlcnMgaW4gdjEuMS5cbiAgICBpZiAoYWN0dWFsU3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHRlc3QgPSAodGFnKSA9PiB0YWcuZGVmYXVsdCAmJiB0YWcudGFnICE9PSAndGFnOnlhbWwub3JnLDIwMDI6c3RyJyAmJiB0YWcudGVzdD8udGVzdChzdHIpO1xuICAgICAgICBjb25zdCB7IGNvbXBhdCwgdGFncyB9ID0gY3R4LmRvYy5zY2hlbWE7XG4gICAgICAgIGlmICh0YWdzLnNvbWUodGVzdCkgfHwgY29tcGF0Py5zb21lKHRlc3QpKVxuICAgICAgICAgICAgcmV0dXJuIHF1b3RlZFN0cmluZyh2YWx1ZSwgY3R4KTtcbiAgICB9XG4gICAgcmV0dXJuIGltcGxpY2l0S2V5XG4gICAgICAgID8gc3RyXG4gICAgICAgIDogZm9sZEZsb3dMaW5lcyhzdHIsIGluZGVudCwgRk9MRF9GTE9XLCBnZXRGb2xkT3B0aW9ucyhjdHgsIGZhbHNlKSk7XG59XG5mdW5jdGlvbiBzdHJpbmdpZnlTdHJpbmcoaXRlbSwgY3R4LCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKSB7XG4gICAgY29uc3QgeyBpbXBsaWNpdEtleSwgaW5GbG93IH0gPSBjdHg7XG4gICAgY29uc3Qgc3MgPSB0eXBlb2YgaXRlbS52YWx1ZSA9PT0gJ3N0cmluZydcbiAgICAgICAgPyBpdGVtXG4gICAgICAgIDogT2JqZWN0LmFzc2lnbih7fSwgaXRlbSwgeyB2YWx1ZTogU3RyaW5nKGl0ZW0udmFsdWUpIH0pO1xuICAgIGxldCB7IHR5cGUgfSA9IGl0ZW07XG4gICAgaWYgKHR5cGUgIT09IFNjYWxhci5RVU9URV9ET1VCTEUpIHtcbiAgICAgICAgLy8gZm9yY2UgZG91YmxlIHF1b3RlcyBvbiBjb250cm9sIGNoYXJhY3RlcnMgJiB1bnBhaXJlZCBzdXJyb2dhdGVzXG4gICAgICAgIGlmICgvW1xceDAwLVxceDA4XFx4MGItXFx4MWZcXHg3Zi1cXHg5ZlxcdXtEODAwfS1cXHV7REZGRn1dL3UudGVzdChzcy52YWx1ZSkpXG4gICAgICAgICAgICB0eXBlID0gU2NhbGFyLlFVT1RFX0RPVUJMRTtcbiAgICB9XG4gICAgY29uc3QgX3N0cmluZ2lmeSA9IChfdHlwZSkgPT4ge1xuICAgICAgICBzd2l0Y2ggKF90eXBlKSB7XG4gICAgICAgICAgICBjYXNlIFNjYWxhci5CTE9DS19GT0xERUQ6XG4gICAgICAgICAgICBjYXNlIFNjYWxhci5CTE9DS19MSVRFUkFMOlxuICAgICAgICAgICAgICAgIHJldHVybiBpbXBsaWNpdEtleSB8fCBpbkZsb3dcbiAgICAgICAgICAgICAgICAgICAgPyBxdW90ZWRTdHJpbmcoc3MudmFsdWUsIGN0eCkgLy8gYmxvY2tzIGFyZSBub3QgdmFsaWQgaW5zaWRlIGZsb3cgY29udGFpbmVyc1xuICAgICAgICAgICAgICAgICAgICA6IGJsb2NrU3RyaW5nKHNzLCBjdHgsIG9uQ29tbWVudCwgb25DaG9tcEtlZXApO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXIuUVVPVEVfRE9VQkxFOlxuICAgICAgICAgICAgICAgIHJldHVybiBkb3VibGVRdW90ZWRTdHJpbmcoc3MudmFsdWUsIGN0eCk7XG4gICAgICAgICAgICBjYXNlIFNjYWxhci5RVU9URV9TSU5HTEU6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNpbmdsZVF1b3RlZFN0cmluZyhzcy52YWx1ZSwgY3R4KTtcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyLlBMQUlOOlxuICAgICAgICAgICAgICAgIHJldHVybiBwbGFpblN0cmluZyhzcywgY3R4LCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGxldCByZXMgPSBfc3RyaW5naWZ5KHR5cGUpO1xuICAgIGlmIChyZXMgPT09IG51bGwpIHtcbiAgICAgICAgY29uc3QgeyBkZWZhdWx0S2V5VHlwZSwgZGVmYXVsdFN0cmluZ1R5cGUgfSA9IGN0eC5vcHRpb25zO1xuICAgICAgICBjb25zdCB0ID0gKGltcGxpY2l0S2V5ICYmIGRlZmF1bHRLZXlUeXBlKSB8fCBkZWZhdWx0U3RyaW5nVHlwZTtcbiAgICAgICAgcmVzID0gX3N0cmluZ2lmeSh0KTtcbiAgICAgICAgaWYgKHJlcyA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgZGVmYXVsdCBzdHJpbmcgdHlwZSAke3R9YCk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG5cbmV4cG9ydCB7IHN0cmluZ2lmeVN0cmluZyB9O1xuIiwiaW1wb3J0IHsgYW5jaG9ySXNWYWxpZCB9IGZyb20gJy4uL2RvYy9hbmNob3JzLmpzJztcbmltcG9ydCB7IGlzUGFpciwgaXNBbGlhcywgaXNOb2RlLCBpc1NjYWxhciwgaXNDb2xsZWN0aW9uIH0gZnJvbSAnLi4vbm9kZXMvaWRlbnRpdHkuanMnO1xuaW1wb3J0IHsgc3RyaW5naWZ5Q29tbWVudCB9IGZyb20gJy4vc3RyaW5naWZ5Q29tbWVudC5qcyc7XG5pbXBvcnQgeyBzdHJpbmdpZnlTdHJpbmcgfSBmcm9tICcuL3N0cmluZ2lmeVN0cmluZy5qcyc7XG5cbmZ1bmN0aW9uIGNyZWF0ZVN0cmluZ2lmeUNvbnRleHQoZG9jLCBvcHRpb25zKSB7XG4gICAgY29uc3Qgb3B0ID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICAgIGJsb2NrUXVvdGU6IHRydWUsXG4gICAgICAgIGNvbW1lbnRTdHJpbmc6IHN0cmluZ2lmeUNvbW1lbnQsXG4gICAgICAgIGRlZmF1bHRLZXlUeXBlOiBudWxsLFxuICAgICAgICBkZWZhdWx0U3RyaW5nVHlwZTogJ1BMQUlOJyxcbiAgICAgICAgZGlyZWN0aXZlczogbnVsbCxcbiAgICAgICAgZG91YmxlUXVvdGVkQXNKU09OOiBmYWxzZSxcbiAgICAgICAgZG91YmxlUXVvdGVkTWluTXVsdGlMaW5lTGVuZ3RoOiA0MCxcbiAgICAgICAgZmFsc2VTdHI6ICdmYWxzZScsXG4gICAgICAgIGZsb3dDb2xsZWN0aW9uUGFkZGluZzogdHJ1ZSxcbiAgICAgICAgaW5kZW50U2VxOiB0cnVlLFxuICAgICAgICBsaW5lV2lkdGg6IDgwLFxuICAgICAgICBtaW5Db250ZW50V2lkdGg6IDIwLFxuICAgICAgICBudWxsU3RyOiAnbnVsbCcsXG4gICAgICAgIHNpbXBsZUtleXM6IGZhbHNlLFxuICAgICAgICBzaW5nbGVRdW90ZTogbnVsbCxcbiAgICAgICAgdHJhaWxpbmdDb21tYTogZmFsc2UsXG4gICAgICAgIHRydWVTdHI6ICd0cnVlJyxcbiAgICAgICAgdmVyaWZ5QWxpYXNPcmRlcjogdHJ1ZVxuICAgIH0sIGRvYy5zY2hlbWEudG9TdHJpbmdPcHRpb25zLCBvcHRpb25zKTtcbiAgICBsZXQgaW5GbG93O1xuICAgIHN3aXRjaCAob3B0LmNvbGxlY3Rpb25TdHlsZSkge1xuICAgICAgICBjYXNlICdibG9jayc6XG4gICAgICAgICAgICBpbkZsb3cgPSBmYWxzZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdmbG93JzpcbiAgICAgICAgICAgIGluRmxvdyA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGluRmxvdyA9IG51bGw7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGFuY2hvcnM6IG5ldyBTZXQoKSxcbiAgICAgICAgZG9jLFxuICAgICAgICBmbG93Q29sbGVjdGlvblBhZGRpbmc6IG9wdC5mbG93Q29sbGVjdGlvblBhZGRpbmcgPyAnICcgOiAnJyxcbiAgICAgICAgaW5kZW50OiAnJyxcbiAgICAgICAgaW5kZW50U3RlcDogdHlwZW9mIG9wdC5pbmRlbnQgPT09ICdudW1iZXInID8gJyAnLnJlcGVhdChvcHQuaW5kZW50KSA6ICcgICcsXG4gICAgICAgIGluRmxvdyxcbiAgICAgICAgb3B0aW9uczogb3B0XG4gICAgfTtcbn1cbmZ1bmN0aW9uIGdldFRhZ09iamVjdCh0YWdzLCBpdGVtKSB7XG4gICAgaWYgKGl0ZW0udGFnKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoID0gdGFncy5maWx0ZXIodCA9PiB0LnRhZyA9PT0gaXRlbS50YWcpO1xuICAgICAgICBpZiAobWF0Y2gubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJldHVybiBtYXRjaC5maW5kKHQgPT4gdC5mb3JtYXQgPT09IGl0ZW0uZm9ybWF0KSA/PyBtYXRjaFswXTtcbiAgICB9XG4gICAgbGV0IHRhZ09iaiA9IHVuZGVmaW5lZDtcbiAgICBsZXQgb2JqO1xuICAgIGlmIChpc1NjYWxhcihpdGVtKSkge1xuICAgICAgICBvYmogPSBpdGVtLnZhbHVlO1xuICAgICAgICBsZXQgbWF0Y2ggPSB0YWdzLmZpbHRlcih0ID0+IHQuaWRlbnRpZnk/LihvYmopKTtcbiAgICAgICAgaWYgKG1hdGNoLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIGNvbnN0IHRlc3RNYXRjaCA9IG1hdGNoLmZpbHRlcih0ID0+IHQudGVzdCk7XG4gICAgICAgICAgICBpZiAodGVzdE1hdGNoLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgbWF0Y2ggPSB0ZXN0TWF0Y2g7XG4gICAgICAgIH1cbiAgICAgICAgdGFnT2JqID1cbiAgICAgICAgICAgIG1hdGNoLmZpbmQodCA9PiB0LmZvcm1hdCA9PT0gaXRlbS5mb3JtYXQpID8/IG1hdGNoLmZpbmQodCA9PiAhdC5mb3JtYXQpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgb2JqID0gaXRlbTtcbiAgICAgICAgdGFnT2JqID0gdGFncy5maW5kKHQgPT4gdC5ub2RlQ2xhc3MgJiYgb2JqIGluc3RhbmNlb2YgdC5ub2RlQ2xhc3MpO1xuICAgIH1cbiAgICBpZiAoIXRhZ09iaikge1xuICAgICAgICBjb25zdCBuYW1lID0gb2JqPy5jb25zdHJ1Y3Rvcj8ubmFtZSA/PyAob2JqID09PSBudWxsID8gJ251bGwnIDogdHlwZW9mIG9iaik7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVGFnIG5vdCByZXNvbHZlZCBmb3IgJHtuYW1lfSB2YWx1ZWApO1xuICAgIH1cbiAgICByZXR1cm4gdGFnT2JqO1xufVxuLy8gbmVlZHMgdG8gYmUgY2FsbGVkIGJlZm9yZSB2YWx1ZSBzdHJpbmdpZmllciB0byBhbGxvdyBmb3IgY2lyY3VsYXIgYW5jaG9yIHJlZnNcbmZ1bmN0aW9uIHN0cmluZ2lmeVByb3BzKG5vZGUsIHRhZ09iaiwgeyBhbmNob3JzLCBkb2MgfSkge1xuICAgIGlmICghZG9jLmRpcmVjdGl2ZXMpXG4gICAgICAgIHJldHVybiAnJztcbiAgICBjb25zdCBwcm9wcyA9IFtdO1xuICAgIGNvbnN0IGFuY2hvciA9IChpc1NjYWxhcihub2RlKSB8fCBpc0NvbGxlY3Rpb24obm9kZSkpICYmIG5vZGUuYW5jaG9yO1xuICAgIGlmIChhbmNob3IgJiYgYW5jaG9ySXNWYWxpZChhbmNob3IpKSB7XG4gICAgICAgIGFuY2hvcnMuYWRkKGFuY2hvcik7XG4gICAgICAgIHByb3BzLnB1c2goYCYke2FuY2hvcn1gKTtcbiAgICB9XG4gICAgY29uc3QgdGFnID0gbm9kZS50YWcgPz8gKHRhZ09iai5kZWZhdWx0ID8gbnVsbCA6IHRhZ09iai50YWcpO1xuICAgIGlmICh0YWcpXG4gICAgICAgIHByb3BzLnB1c2goZG9jLmRpcmVjdGl2ZXMudGFnU3RyaW5nKHRhZykpO1xuICAgIHJldHVybiBwcm9wcy5qb2luKCcgJyk7XG59XG5mdW5jdGlvbiBzdHJpbmdpZnkoaXRlbSwgY3R4LCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKSB7XG4gICAgaWYgKGlzUGFpcihpdGVtKSlcbiAgICAgICAgcmV0dXJuIGl0ZW0udG9TdHJpbmcoY3R4LCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKTtcbiAgICBpZiAoaXNBbGlhcyhpdGVtKSkge1xuICAgICAgICBpZiAoY3R4LmRvYy5kaXJlY3RpdmVzKVxuICAgICAgICAgICAgcmV0dXJuIGl0ZW0udG9TdHJpbmcoY3R4KTtcbiAgICAgICAgaWYgKGN0eC5yZXNvbHZlZEFsaWFzZXM/LmhhcyhpdGVtKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgQ2Fubm90IHN0cmluZ2lmeSBjaXJjdWxhciBzdHJ1Y3R1cmUgd2l0aG91dCBhbGlhcyBub2Rlc2ApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGN0eC5yZXNvbHZlZEFsaWFzZXMpXG4gICAgICAgICAgICAgICAgY3R4LnJlc29sdmVkQWxpYXNlcy5hZGQoaXRlbSk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgY3R4LnJlc29sdmVkQWxpYXNlcyA9IG5ldyBTZXQoW2l0ZW1dKTtcbiAgICAgICAgICAgIGl0ZW0gPSBpdGVtLnJlc29sdmUoY3R4LmRvYyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV0IHRhZ09iaiA9IHVuZGVmaW5lZDtcbiAgICBjb25zdCBub2RlID0gaXNOb2RlKGl0ZW0pXG4gICAgICAgID8gaXRlbVxuICAgICAgICA6IGN0eC5kb2MuY3JlYXRlTm9kZShpdGVtLCB7IG9uVGFnT2JqOiBvID0+ICh0YWdPYmogPSBvKSB9KTtcbiAgICB0YWdPYmogPz8gKHRhZ09iaiA9IGdldFRhZ09iamVjdChjdHguZG9jLnNjaGVtYS50YWdzLCBub2RlKSk7XG4gICAgY29uc3QgcHJvcHMgPSBzdHJpbmdpZnlQcm9wcyhub2RlLCB0YWdPYmosIGN0eCk7XG4gICAgaWYgKHByb3BzLmxlbmd0aCA+IDApXG4gICAgICAgIGN0eC5pbmRlbnRBdFN0YXJ0ID0gKGN0eC5pbmRlbnRBdFN0YXJ0ID8/IDApICsgcHJvcHMubGVuZ3RoICsgMTtcbiAgICBjb25zdCBzdHIgPSB0eXBlb2YgdGFnT2JqLnN0cmluZ2lmeSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICA/IHRhZ09iai5zdHJpbmdpZnkobm9kZSwgY3R4LCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKVxuICAgICAgICA6IGlzU2NhbGFyKG5vZGUpXG4gICAgICAgICAgICA/IHN0cmluZ2lmeVN0cmluZyhub2RlLCBjdHgsIG9uQ29tbWVudCwgb25DaG9tcEtlZXApXG4gICAgICAgICAgICA6IG5vZGUudG9TdHJpbmcoY3R4LCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKTtcbiAgICBpZiAoIXByb3BzKVxuICAgICAgICByZXR1cm4gc3RyO1xuICAgIHJldHVybiBpc1NjYWxhcihub2RlKSB8fCBzdHJbMF0gPT09ICd7JyB8fCBzdHJbMF0gPT09ICdbJ1xuICAgICAgICA/IGAke3Byb3BzfSAke3N0cn1gXG4gICAgICAgIDogYCR7cHJvcHN9XFxuJHtjdHguaW5kZW50fSR7c3RyfWA7XG59XG5cbmV4cG9ydCB7IGNyZWF0ZVN0cmluZ2lmeUNvbnRleHQsIHN0cmluZ2lmeSB9O1xuIiwiaW1wb3J0IHsgaXNDb2xsZWN0aW9uLCBpc05vZGUsIGlzU2NhbGFyLCBpc1NlcSB9IGZyb20gJy4uL25vZGVzL2lkZW50aXR5LmpzJztcbmltcG9ydCB7IFNjYWxhciB9IGZyb20gJy4uL25vZGVzL1NjYWxhci5qcyc7XG5pbXBvcnQgeyBzdHJpbmdpZnkgfSBmcm9tICcuL3N0cmluZ2lmeS5qcyc7XG5pbXBvcnQgeyBsaW5lQ29tbWVudCwgaW5kZW50Q29tbWVudCB9IGZyb20gJy4vc3RyaW5naWZ5Q29tbWVudC5qcyc7XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeVBhaXIoeyBrZXksIHZhbHVlIH0sIGN0eCwgb25Db21tZW50LCBvbkNob21wS2VlcCkge1xuICAgIGNvbnN0IHsgYWxsTnVsbFZhbHVlcywgZG9jLCBpbmRlbnQsIGluZGVudFN0ZXAsIG9wdGlvbnM6IHsgY29tbWVudFN0cmluZywgaW5kZW50U2VxLCBzaW1wbGVLZXlzIH0gfSA9IGN0eDtcbiAgICBsZXQga2V5Q29tbWVudCA9IChpc05vZGUoa2V5KSAmJiBrZXkuY29tbWVudCkgfHwgbnVsbDtcbiAgICBpZiAoc2ltcGxlS2V5cykge1xuICAgICAgICBpZiAoa2V5Q29tbWVudCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXaXRoIHNpbXBsZSBrZXlzLCBrZXkgbm9kZXMgY2Fubm90IGhhdmUgY29tbWVudHMnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNDb2xsZWN0aW9uKGtleSkgfHwgKCFpc05vZGUoa2V5KSAmJiB0eXBlb2Yga2V5ID09PSAnb2JqZWN0JykpIHtcbiAgICAgICAgICAgIGNvbnN0IG1zZyA9ICdXaXRoIHNpbXBsZSBrZXlzLCBjb2xsZWN0aW9uIGNhbm5vdCBiZSB1c2VkIGFzIGEga2V5IHZhbHVlJztcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxldCBleHBsaWNpdEtleSA9ICFzaW1wbGVLZXlzICYmXG4gICAgICAgICgha2V5IHx8XG4gICAgICAgICAgICAoa2V5Q29tbWVudCAmJiB2YWx1ZSA9PSBudWxsICYmICFjdHguaW5GbG93KSB8fFxuICAgICAgICAgICAgaXNDb2xsZWN0aW9uKGtleSkgfHxcbiAgICAgICAgICAgIChpc1NjYWxhcihrZXkpXG4gICAgICAgICAgICAgICAgPyBrZXkudHlwZSA9PT0gU2NhbGFyLkJMT0NLX0ZPTERFRCB8fCBrZXkudHlwZSA9PT0gU2NhbGFyLkJMT0NLX0xJVEVSQUxcbiAgICAgICAgICAgICAgICA6IHR5cGVvZiBrZXkgPT09ICdvYmplY3QnKSk7XG4gICAgY3R4ID0gT2JqZWN0LmFzc2lnbih7fSwgY3R4LCB7XG4gICAgICAgIGFsbE51bGxWYWx1ZXM6IGZhbHNlLFxuICAgICAgICBpbXBsaWNpdEtleTogIWV4cGxpY2l0S2V5ICYmIChzaW1wbGVLZXlzIHx8ICFhbGxOdWxsVmFsdWVzKSxcbiAgICAgICAgaW5kZW50OiBpbmRlbnQgKyBpbmRlbnRTdGVwXG4gICAgfSk7XG4gICAgbGV0IGtleUNvbW1lbnREb25lID0gZmFsc2U7XG4gICAgbGV0IGNob21wS2VlcCA9IGZhbHNlO1xuICAgIGxldCBzdHIgPSBzdHJpbmdpZnkoa2V5LCBjdHgsICgpID0+IChrZXlDb21tZW50RG9uZSA9IHRydWUpLCAoKSA9PiAoY2hvbXBLZWVwID0gdHJ1ZSkpO1xuICAgIGlmICghZXhwbGljaXRLZXkgJiYgIWN0eC5pbkZsb3cgJiYgc3RyLmxlbmd0aCA+IDEwMjQpIHtcbiAgICAgICAgaWYgKHNpbXBsZUtleXMpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dpdGggc2ltcGxlIGtleXMsIHNpbmdsZSBsaW5lIHNjYWxhciBtdXN0IG5vdCBzcGFuIG1vcmUgdGhhbiAxMDI0IGNoYXJhY3RlcnMnKTtcbiAgICAgICAgZXhwbGljaXRLZXkgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoY3R4LmluRmxvdykge1xuICAgICAgICBpZiAoYWxsTnVsbFZhbHVlcyB8fCB2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoa2V5Q29tbWVudERvbmUgJiYgb25Db21tZW50KVxuICAgICAgICAgICAgICAgIG9uQ29tbWVudCgpO1xuICAgICAgICAgICAgcmV0dXJuIHN0ciA9PT0gJycgPyAnPycgOiBleHBsaWNpdEtleSA/IGA/ICR7c3RyfWAgOiBzdHI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoKGFsbE51bGxWYWx1ZXMgJiYgIXNpbXBsZUtleXMpIHx8ICh2YWx1ZSA9PSBudWxsICYmIGV4cGxpY2l0S2V5KSkge1xuICAgICAgICBzdHIgPSBgPyAke3N0cn1gO1xuICAgICAgICBpZiAoa2V5Q29tbWVudCAmJiAha2V5Q29tbWVudERvbmUpIHtcbiAgICAgICAgICAgIHN0ciArPSBsaW5lQ29tbWVudChzdHIsIGN0eC5pbmRlbnQsIGNvbW1lbnRTdHJpbmcoa2V5Q29tbWVudCkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNob21wS2VlcCAmJiBvbkNob21wS2VlcClcbiAgICAgICAgICAgIG9uQ2hvbXBLZWVwKCk7XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuICAgIGlmIChrZXlDb21tZW50RG9uZSlcbiAgICAgICAga2V5Q29tbWVudCA9IG51bGw7XG4gICAgaWYgKGV4cGxpY2l0S2V5KSB7XG4gICAgICAgIGlmIChrZXlDb21tZW50KVxuICAgICAgICAgICAgc3RyICs9IGxpbmVDb21tZW50KHN0ciwgY3R4LmluZGVudCwgY29tbWVudFN0cmluZyhrZXlDb21tZW50KSk7XG4gICAgICAgIHN0ciA9IGA/ICR7c3RyfVxcbiR7aW5kZW50fTpgO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgc3RyID0gYCR7c3RyfTpgO1xuICAgICAgICBpZiAoa2V5Q29tbWVudClcbiAgICAgICAgICAgIHN0ciArPSBsaW5lQ29tbWVudChzdHIsIGN0eC5pbmRlbnQsIGNvbW1lbnRTdHJpbmcoa2V5Q29tbWVudCkpO1xuICAgIH1cbiAgICBsZXQgdnNiLCB2Y2IsIHZhbHVlQ29tbWVudDtcbiAgICBpZiAoaXNOb2RlKHZhbHVlKSkge1xuICAgICAgICB2c2IgPSAhIXZhbHVlLnNwYWNlQmVmb3JlO1xuICAgICAgICB2Y2IgPSB2YWx1ZS5jb21tZW50QmVmb3JlO1xuICAgICAgICB2YWx1ZUNvbW1lbnQgPSB2YWx1ZS5jb21tZW50O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdnNiID0gZmFsc2U7XG4gICAgICAgIHZjYiA9IG51bGw7XG4gICAgICAgIHZhbHVlQ29tbWVudCA9IG51bGw7XG4gICAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKVxuICAgICAgICAgICAgdmFsdWUgPSBkb2MuY3JlYXRlTm9kZSh2YWx1ZSk7XG4gICAgfVxuICAgIGN0eC5pbXBsaWNpdEtleSA9IGZhbHNlO1xuICAgIGlmICghZXhwbGljaXRLZXkgJiYgIWtleUNvbW1lbnQgJiYgaXNTY2FsYXIodmFsdWUpKVxuICAgICAgICBjdHguaW5kZW50QXRTdGFydCA9IHN0ci5sZW5ndGggKyAxO1xuICAgIGNob21wS2VlcCA9IGZhbHNlO1xuICAgIGlmICghaW5kZW50U2VxICYmXG4gICAgICAgIGluZGVudFN0ZXAubGVuZ3RoID49IDIgJiZcbiAgICAgICAgIWN0eC5pbkZsb3cgJiZcbiAgICAgICAgIWV4cGxpY2l0S2V5ICYmXG4gICAgICAgIGlzU2VxKHZhbHVlKSAmJlxuICAgICAgICAhdmFsdWUuZmxvdyAmJlxuICAgICAgICAhdmFsdWUudGFnICYmXG4gICAgICAgICF2YWx1ZS5hbmNob3IpIHtcbiAgICAgICAgLy8gSWYgaW5kZW50U2VxID09PSBmYWxzZSwgY29uc2lkZXIgJy0gJyBhcyBwYXJ0IG9mIGluZGVudGF0aW9uIHdoZXJlIHBvc3NpYmxlXG4gICAgICAgIGN0eC5pbmRlbnQgPSBjdHguaW5kZW50LnN1YnN0cmluZygyKTtcbiAgICB9XG4gICAgbGV0IHZhbHVlQ29tbWVudERvbmUgPSBmYWxzZTtcbiAgICBjb25zdCB2YWx1ZVN0ciA9IHN0cmluZ2lmeSh2YWx1ZSwgY3R4LCAoKSA9PiAodmFsdWVDb21tZW50RG9uZSA9IHRydWUpLCAoKSA9PiAoY2hvbXBLZWVwID0gdHJ1ZSkpO1xuICAgIGxldCB3cyA9ICcgJztcbiAgICBpZiAoa2V5Q29tbWVudCB8fCB2c2IgfHwgdmNiKSB7XG4gICAgICAgIHdzID0gdnNiID8gJ1xcbicgOiAnJztcbiAgICAgICAgaWYgKHZjYikge1xuICAgICAgICAgICAgY29uc3QgY3MgPSBjb21tZW50U3RyaW5nKHZjYik7XG4gICAgICAgICAgICB3cyArPSBgXFxuJHtpbmRlbnRDb21tZW50KGNzLCBjdHguaW5kZW50KX1gO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZVN0ciA9PT0gJycgJiYgIWN0eC5pbkZsb3cpIHtcbiAgICAgICAgICAgIGlmICh3cyA9PT0gJ1xcbicgJiYgdmFsdWVDb21tZW50KVxuICAgICAgICAgICAgICAgIHdzID0gJ1xcblxcbic7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB3cyArPSBgXFxuJHtjdHguaW5kZW50fWA7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoIWV4cGxpY2l0S2V5ICYmIGlzQ29sbGVjdGlvbih2YWx1ZSkpIHtcbiAgICAgICAgY29uc3QgdnMwID0gdmFsdWVTdHJbMF07XG4gICAgICAgIGNvbnN0IG5sMCA9IHZhbHVlU3RyLmluZGV4T2YoJ1xcbicpO1xuICAgICAgICBjb25zdCBoYXNOZXdsaW5lID0gbmwwICE9PSAtMTtcbiAgICAgICAgY29uc3QgZmxvdyA9IGN0eC5pbkZsb3cgPz8gdmFsdWUuZmxvdyA/PyB2YWx1ZS5pdGVtcy5sZW5ndGggPT09IDA7XG4gICAgICAgIGlmIChoYXNOZXdsaW5lIHx8ICFmbG93KSB7XG4gICAgICAgICAgICBsZXQgaGFzUHJvcHNMaW5lID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAoaGFzTmV3bGluZSAmJiAodnMwID09PSAnJicgfHwgdnMwID09PSAnIScpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNwMCA9IHZhbHVlU3RyLmluZGV4T2YoJyAnKTtcbiAgICAgICAgICAgICAgICBpZiAodnMwID09PSAnJicgJiZcbiAgICAgICAgICAgICAgICAgICAgc3AwICE9PSAtMSAmJlxuICAgICAgICAgICAgICAgICAgICBzcDAgPCBubDAgJiZcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVTdHJbc3AwICsgMV0gPT09ICchJykge1xuICAgICAgICAgICAgICAgICAgICBzcDAgPSB2YWx1ZVN0ci5pbmRleE9mKCcgJywgc3AwICsgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChzcDAgPT09IC0xIHx8IG5sMCA8IHNwMClcbiAgICAgICAgICAgICAgICAgICAgaGFzUHJvcHNMaW5lID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaGFzUHJvcHNMaW5lKVxuICAgICAgICAgICAgICAgIHdzID0gYFxcbiR7Y3R4LmluZGVudH1gO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKHZhbHVlU3RyID09PSAnJyB8fCB2YWx1ZVN0clswXSA9PT0gJ1xcbicpIHtcbiAgICAgICAgd3MgPSAnJztcbiAgICB9XG4gICAgc3RyICs9IHdzICsgdmFsdWVTdHI7XG4gICAgaWYgKGN0eC5pbkZsb3cpIHtcbiAgICAgICAgaWYgKHZhbHVlQ29tbWVudERvbmUgJiYgb25Db21tZW50KVxuICAgICAgICAgICAgb25Db21tZW50KCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHZhbHVlQ29tbWVudCAmJiAhdmFsdWVDb21tZW50RG9uZSkge1xuICAgICAgICBzdHIgKz0gbGluZUNvbW1lbnQoc3RyLCBjdHguaW5kZW50LCBjb21tZW50U3RyaW5nKHZhbHVlQ29tbWVudCkpO1xuICAgIH1cbiAgICBlbHNlIGlmIChjaG9tcEtlZXAgJiYgb25DaG9tcEtlZXApIHtcbiAgICAgICAgb25DaG9tcEtlZXAoKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0cjtcbn1cblxuZXhwb3J0IHsgc3RyaW5naWZ5UGFpciB9O1xuIiwiZnVuY3Rpb24gZGVidWcobG9nTGV2ZWwsIC4uLm1lc3NhZ2VzKSB7XG4gICAgaWYgKGxvZ0xldmVsID09PSAnZGVidWcnKVxuICAgICAgICBjb25zb2xlLmxvZyguLi5tZXNzYWdlcyk7XG59XG5mdW5jdGlvbiB3YXJuKGxvZ0xldmVsLCB3YXJuaW5nKSB7XG4gICAgaWYgKGxvZ0xldmVsID09PSAnZGVidWcnIHx8IGxvZ0xldmVsID09PSAnd2FybicpIHtcbiAgICAgICAgY29uc29sZS53YXJuKHdhcm5pbmcpO1xuICAgIH1cbn1cblxuZXhwb3J0IHsgZGVidWcsIHdhcm4gfTtcbiIsImltcG9ydCB7IGlzU2NhbGFyLCBpc1NlcSwgaXNBbGlhcywgaXNNYXAgfSBmcm9tICcuLi8uLi9ub2Rlcy9pZGVudGl0eS5qcyc7XG5pbXBvcnQgeyBTY2FsYXIgfSBmcm9tICcuLi8uLi9ub2Rlcy9TY2FsYXIuanMnO1xuXG4vLyBJZiB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGEgbWVyZ2Uga2V5IGlzIGEgc2luZ2xlIG1hcHBpbmcgbm9kZSwgZWFjaCBvZlxuLy8gaXRzIGtleS92YWx1ZSBwYWlycyBpcyBpbnNlcnRlZCBpbnRvIHRoZSBjdXJyZW50IG1hcHBpbmcsIHVubGVzcyB0aGUga2V5XG4vLyBhbHJlYWR5IGV4aXN0cyBpbiBpdC4gSWYgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWVyZ2Uga2V5IGlzIGFcbi8vIHNlcXVlbmNlLCB0aGVuIHRoaXMgc2VxdWVuY2UgaXMgZXhwZWN0ZWQgdG8gY29udGFpbiBtYXBwaW5nIG5vZGVzIGFuZCBlYWNoXG4vLyBvZiB0aGVzZSBub2RlcyBpcyBtZXJnZWQgaW4gdHVybiBhY2NvcmRpbmcgdG8gaXRzIG9yZGVyIGluIHRoZSBzZXF1ZW5jZS5cbi8vIEtleXMgaW4gbWFwcGluZyBub2RlcyBlYXJsaWVyIGluIHRoZSBzZXF1ZW5jZSBvdmVycmlkZSBrZXlzIHNwZWNpZmllZCBpblxuLy8gbGF0ZXIgbWFwcGluZyBub2Rlcy4gLS0gaHR0cDovL3lhbWwub3JnL3R5cGUvbWVyZ2UuaHRtbFxuY29uc3QgTUVSR0VfS0VZID0gJzw8JztcbmNvbnN0IG1lcmdlID0ge1xuICAgIGlkZW50aWZ5OiB2YWx1ZSA9PiB2YWx1ZSA9PT0gTUVSR0VfS0VZIHx8XG4gICAgICAgICh0eXBlb2YgdmFsdWUgPT09ICdzeW1ib2wnICYmIHZhbHVlLmRlc2NyaXB0aW9uID09PSBNRVJHRV9LRVkpLFxuICAgIGRlZmF1bHQ6ICdrZXknLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOm1lcmdlJyxcbiAgICB0ZXN0OiAvXjw8JC8sXG4gICAgcmVzb2x2ZTogKCkgPT4gT2JqZWN0LmFzc2lnbihuZXcgU2NhbGFyKFN5bWJvbChNRVJHRV9LRVkpKSwge1xuICAgICAgICBhZGRUb0pTTWFwOiBhZGRNZXJnZVRvSlNNYXBcbiAgICB9KSxcbiAgICBzdHJpbmdpZnk6ICgpID0+IE1FUkdFX0tFWVxufTtcbmNvbnN0IGlzTWVyZ2VLZXkgPSAoY3R4LCBrZXkpID0+IChtZXJnZS5pZGVudGlmeShrZXkpIHx8XG4gICAgKGlzU2NhbGFyKGtleSkgJiZcbiAgICAgICAgKCFrZXkudHlwZSB8fCBrZXkudHlwZSA9PT0gU2NhbGFyLlBMQUlOKSAmJlxuICAgICAgICBtZXJnZS5pZGVudGlmeShrZXkudmFsdWUpKSkgJiZcbiAgICBjdHg/LmRvYy5zY2hlbWEudGFncy5zb21lKHRhZyA9PiB0YWcudGFnID09PSBtZXJnZS50YWcgJiYgdGFnLmRlZmF1bHQpO1xuZnVuY3Rpb24gYWRkTWVyZ2VUb0pTTWFwKGN0eCwgbWFwLCB2YWx1ZSkge1xuICAgIGNvbnN0IHNvdXJjZSA9IHJlc29sdmVBbGlhc1ZhbHVlKGN0eCwgdmFsdWUpO1xuICAgIGlmIChpc1NlcShzb3VyY2UpKVxuICAgICAgICBmb3IgKGNvbnN0IGl0IG9mIHNvdXJjZS5pdGVtcylcbiAgICAgICAgICAgIG1lcmdlVmFsdWUoY3R4LCBtYXAsIGl0KTtcbiAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHNvdXJjZSkpXG4gICAgICAgIGZvciAoY29uc3QgaXQgb2Ygc291cmNlKVxuICAgICAgICAgICAgbWVyZ2VWYWx1ZShjdHgsIG1hcCwgaXQpO1xuICAgIGVsc2VcbiAgICAgICAgbWVyZ2VWYWx1ZShjdHgsIG1hcCwgc291cmNlKTtcbn1cbmZ1bmN0aW9uIG1lcmdlVmFsdWUoY3R4LCBtYXAsIHZhbHVlKSB7XG4gICAgY29uc3Qgc291cmNlID0gcmVzb2x2ZUFsaWFzVmFsdWUoY3R4LCB2YWx1ZSk7XG4gICAgaWYgKCFpc01hcChzb3VyY2UpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01lcmdlIHNvdXJjZXMgbXVzdCBiZSBtYXBzIG9yIG1hcCBhbGlhc2VzJyk7XG4gICAgY29uc3Qgc3JjTWFwID0gc291cmNlLnRvSlNPTihudWxsLCBjdHgsIE1hcCk7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2Ygc3JjTWFwKSB7XG4gICAgICAgIGlmIChtYXAgaW5zdGFuY2VvZiBNYXApIHtcbiAgICAgICAgICAgIGlmICghbWFwLmhhcyhrZXkpKVxuICAgICAgICAgICAgICAgIG1hcC5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobWFwIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgICAgICAgICBtYXAuYWRkKGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtYXAsIGtleSkpIHtcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtYXAsIGtleSwge1xuICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWFwO1xufVxuZnVuY3Rpb24gcmVzb2x2ZUFsaWFzVmFsdWUoY3R4LCB2YWx1ZSkge1xuICAgIHJldHVybiBjdHggJiYgaXNBbGlhcyh2YWx1ZSkgPyB2YWx1ZS5yZXNvbHZlKGN0eC5kb2MsIGN0eCkgOiB2YWx1ZTtcbn1cblxuZXhwb3J0IHsgYWRkTWVyZ2VUb0pTTWFwLCBpc01lcmdlS2V5LCBtZXJnZSB9O1xuIiwiaW1wb3J0IHsgd2FybiB9IGZyb20gJy4uL2xvZy5qcyc7XG5pbXBvcnQgeyBpc01lcmdlS2V5LCBhZGRNZXJnZVRvSlNNYXAgfSBmcm9tICcuLi9zY2hlbWEveWFtbC0xLjEvbWVyZ2UuanMnO1xuaW1wb3J0IHsgY3JlYXRlU3RyaW5naWZ5Q29udGV4dCB9IGZyb20gJy4uL3N0cmluZ2lmeS9zdHJpbmdpZnkuanMnO1xuaW1wb3J0IHsgaXNOb2RlIH0gZnJvbSAnLi9pZGVudGl0eS5qcyc7XG5pbXBvcnQgeyB0b0pTIH0gZnJvbSAnLi90b0pTLmpzJztcblxuZnVuY3Rpb24gYWRkUGFpclRvSlNNYXAoY3R4LCBtYXAsIHsga2V5LCB2YWx1ZSB9KSB7XG4gICAgaWYgKGlzTm9kZShrZXkpICYmIGtleS5hZGRUb0pTTWFwKVxuICAgICAgICBrZXkuYWRkVG9KU01hcChjdHgsIG1hcCwgdmFsdWUpO1xuICAgIC8vIFRPRE86IFNob3VsZCBkcm9wIHRoaXMgc3BlY2lhbCBjYXNlIGZvciBiYXJlIDw8IGhhbmRsaW5nXG4gICAgZWxzZSBpZiAoaXNNZXJnZUtleShjdHgsIGtleSkpXG4gICAgICAgIGFkZE1lcmdlVG9KU01hcChjdHgsIG1hcCwgdmFsdWUpO1xuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBqc0tleSA9IHRvSlMoa2V5LCAnJywgY3R4KTtcbiAgICAgICAgaWYgKG1hcCBpbnN0YW5jZW9mIE1hcCkge1xuICAgICAgICAgICAgbWFwLnNldChqc0tleSwgdG9KUyh2YWx1ZSwganNLZXksIGN0eCkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG1hcCBpbnN0YW5jZW9mIFNldCkge1xuICAgICAgICAgICAgbWFwLmFkZChqc0tleSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBzdHJpbmdLZXkgPSBzdHJpbmdpZnlLZXkoa2V5LCBqc0tleSwgY3R4KTtcbiAgICAgICAgICAgIGNvbnN0IGpzVmFsdWUgPSB0b0pTKHZhbHVlLCBzdHJpbmdLZXksIGN0eCk7XG4gICAgICAgICAgICBpZiAoc3RyaW5nS2V5IGluIG1hcClcbiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobWFwLCBzdHJpbmdLZXksIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGpzVmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBtYXBbc3RyaW5nS2V5XSA9IGpzVmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1hcDtcbn1cbmZ1bmN0aW9uIHN0cmluZ2lmeUtleShrZXksIGpzS2V5LCBjdHgpIHtcbiAgICBpZiAoanNLZXkgPT09IG51bGwpXG4gICAgICAgIHJldHVybiAnJztcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWJhc2UtdG8tc3RyaW5nXG4gICAgaWYgKHR5cGVvZiBqc0tleSAhPT0gJ29iamVjdCcpXG4gICAgICAgIHJldHVybiBTdHJpbmcoanNLZXkpO1xuICAgIGlmIChpc05vZGUoa2V5KSAmJiBjdHg/LmRvYykge1xuICAgICAgICBjb25zdCBzdHJDdHggPSBjcmVhdGVTdHJpbmdpZnlDb250ZXh0KGN0eC5kb2MsIHt9KTtcbiAgICAgICAgc3RyQ3R4LmFuY2hvcnMgPSBuZXcgU2V0KCk7XG4gICAgICAgIGZvciAoY29uc3Qgbm9kZSBvZiBjdHguYW5jaG9ycy5rZXlzKCkpXG4gICAgICAgICAgICBzdHJDdHguYW5jaG9ycy5hZGQobm9kZS5hbmNob3IpO1xuICAgICAgICBzdHJDdHguaW5GbG93ID0gdHJ1ZTtcbiAgICAgICAgc3RyQ3R4LmluU3RyaW5naWZ5S2V5ID0gdHJ1ZTtcbiAgICAgICAgY29uc3Qgc3RyS2V5ID0ga2V5LnRvU3RyaW5nKHN0ckN0eCk7XG4gICAgICAgIGlmICghY3R4Lm1hcEtleVdhcm5lZCkge1xuICAgICAgICAgICAgbGV0IGpzb25TdHIgPSBKU09OLnN0cmluZ2lmeShzdHJLZXkpO1xuICAgICAgICAgICAgaWYgKGpzb25TdHIubGVuZ3RoID4gNDApXG4gICAgICAgICAgICAgICAganNvblN0ciA9IGpzb25TdHIuc3Vic3RyaW5nKDAsIDM2KSArICcuLi5cIic7XG4gICAgICAgICAgICB3YXJuKGN0eC5kb2Mub3B0aW9ucy5sb2dMZXZlbCwgYEtleXMgd2l0aCBjb2xsZWN0aW9uIHZhbHVlcyB3aWxsIGJlIHN0cmluZ2lmaWVkIGR1ZSB0byBKUyBPYmplY3QgcmVzdHJpY3Rpb25zOiAke2pzb25TdHJ9LiBTZXQgbWFwQXNNYXA6IHRydWUgdG8gdXNlIG9iamVjdCBrZXlzLmApO1xuICAgICAgICAgICAgY3R4Lm1hcEtleVdhcm5lZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0cktleTtcbiAgICB9XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGpzS2V5KTtcbn1cblxuZXhwb3J0IHsgYWRkUGFpclRvSlNNYXAgfTtcbiIsImltcG9ydCB7IGNyZWF0ZU5vZGUgfSBmcm9tICcuLi9kb2MvY3JlYXRlTm9kZS5qcyc7XG5pbXBvcnQgeyBzdHJpbmdpZnlQYWlyIH0gZnJvbSAnLi4vc3RyaW5naWZ5L3N0cmluZ2lmeVBhaXIuanMnO1xuaW1wb3J0IHsgYWRkUGFpclRvSlNNYXAgfSBmcm9tICcuL2FkZFBhaXJUb0pTTWFwLmpzJztcbmltcG9ydCB7IE5PREVfVFlQRSwgUEFJUiwgaXNOb2RlIH0gZnJvbSAnLi9pZGVudGl0eS5qcyc7XG5cbmZ1bmN0aW9uIGNyZWF0ZVBhaXIoa2V5LCB2YWx1ZSwgY3R4KSB7XG4gICAgY29uc3QgayA9IGNyZWF0ZU5vZGUoa2V5LCB1bmRlZmluZWQsIGN0eCk7XG4gICAgY29uc3QgdiA9IGNyZWF0ZU5vZGUodmFsdWUsIHVuZGVmaW5lZCwgY3R4KTtcbiAgICByZXR1cm4gbmV3IFBhaXIoaywgdik7XG59XG5jbGFzcyBQYWlyIHtcbiAgICBjb25zdHJ1Y3RvcihrZXksIHZhbHVlID0gbnVsbCkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgTk9ERV9UWVBFLCB7IHZhbHVlOiBQQUlSIH0pO1xuICAgICAgICB0aGlzLmtleSA9IGtleTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICBjbG9uZShzY2hlbWEpIHtcbiAgICAgICAgbGV0IHsga2V5LCB2YWx1ZSB9ID0gdGhpcztcbiAgICAgICAgaWYgKGlzTm9kZShrZXkpKVxuICAgICAgICAgICAga2V5ID0ga2V5LmNsb25lKHNjaGVtYSk7XG4gICAgICAgIGlmIChpc05vZGUodmFsdWUpKVxuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5jbG9uZShzY2hlbWEpO1xuICAgICAgICByZXR1cm4gbmV3IFBhaXIoa2V5LCB2YWx1ZSk7XG4gICAgfVxuICAgIHRvSlNPTihfLCBjdHgpIHtcbiAgICAgICAgY29uc3QgcGFpciA9IGN0eD8ubWFwQXNNYXAgPyBuZXcgTWFwKCkgOiB7fTtcbiAgICAgICAgcmV0dXJuIGFkZFBhaXJUb0pTTWFwKGN0eCwgcGFpciwgdGhpcyk7XG4gICAgfVxuICAgIHRvU3RyaW5nKGN0eCwgb25Db21tZW50LCBvbkNob21wS2VlcCkge1xuICAgICAgICByZXR1cm4gY3R4Py5kb2NcbiAgICAgICAgICAgID8gc3RyaW5naWZ5UGFpcih0aGlzLCBjdHgsIG9uQ29tbWVudCwgb25DaG9tcEtlZXApXG4gICAgICAgICAgICA6IEpTT04uc3RyaW5naWZ5KHRoaXMpO1xuICAgIH1cbn1cblxuZXhwb3J0IHsgUGFpciwgY3JlYXRlUGFpciB9O1xuIiwiaW1wb3J0IHsgaXNOb2RlLCBpc1BhaXIgfSBmcm9tICcuLi9ub2Rlcy9pZGVudGl0eS5qcyc7XG5pbXBvcnQgeyBzdHJpbmdpZnkgfSBmcm9tICcuL3N0cmluZ2lmeS5qcyc7XG5pbXBvcnQgeyBsaW5lQ29tbWVudCwgaW5kZW50Q29tbWVudCB9IGZyb20gJy4vc3RyaW5naWZ5Q29tbWVudC5qcyc7XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeUNvbGxlY3Rpb24oY29sbGVjdGlvbiwgY3R4LCBvcHRpb25zKSB7XG4gICAgY29uc3QgZmxvdyA9IGN0eC5pbkZsb3cgPz8gY29sbGVjdGlvbi5mbG93O1xuICAgIGNvbnN0IHN0cmluZ2lmeSA9IGZsb3cgPyBzdHJpbmdpZnlGbG93Q29sbGVjdGlvbiA6IHN0cmluZ2lmeUJsb2NrQ29sbGVjdGlvbjtcbiAgICByZXR1cm4gc3RyaW5naWZ5KGNvbGxlY3Rpb24sIGN0eCwgb3B0aW9ucyk7XG59XG5mdW5jdGlvbiBzdHJpbmdpZnlCbG9ja0NvbGxlY3Rpb24oeyBjb21tZW50LCBpdGVtcyB9LCBjdHgsIHsgYmxvY2tJdGVtUHJlZml4LCBmbG93Q2hhcnMsIGl0ZW1JbmRlbnQsIG9uQ2hvbXBLZWVwLCBvbkNvbW1lbnQgfSkge1xuICAgIGNvbnN0IHsgaW5kZW50LCBvcHRpb25zOiB7IGNvbW1lbnRTdHJpbmcgfSB9ID0gY3R4O1xuICAgIGNvbnN0IGl0ZW1DdHggPSBPYmplY3QuYXNzaWduKHt9LCBjdHgsIHsgaW5kZW50OiBpdGVtSW5kZW50LCB0eXBlOiBudWxsIH0pO1xuICAgIGxldCBjaG9tcEtlZXAgPSBmYWxzZTsgLy8gZmxhZyBmb3IgdGhlIHByZWNlZGluZyBub2RlJ3Mgc3RhdHVzXG4gICAgY29uc3QgbGluZXMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSBpdGVtc1tpXTtcbiAgICAgICAgbGV0IGNvbW1lbnQgPSBudWxsO1xuICAgICAgICBpZiAoaXNOb2RlKGl0ZW0pKSB7XG4gICAgICAgICAgICBpZiAoIWNob21wS2VlcCAmJiBpdGVtLnNwYWNlQmVmb3JlKVxuICAgICAgICAgICAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgICAgICAgICAgYWRkQ29tbWVudEJlZm9yZShjdHgsIGxpbmVzLCBpdGVtLmNvbW1lbnRCZWZvcmUsIGNob21wS2VlcCk7XG4gICAgICAgICAgICBpZiAoaXRlbS5jb21tZW50KVxuICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBpdGVtLmNvbW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNQYWlyKGl0ZW0pKSB7XG4gICAgICAgICAgICBjb25zdCBpayA9IGlzTm9kZShpdGVtLmtleSkgPyBpdGVtLmtleSA6IG51bGw7XG4gICAgICAgICAgICBpZiAoaWspIHtcbiAgICAgICAgICAgICAgICBpZiAoIWNob21wS2VlcCAmJiBpay5zcGFjZUJlZm9yZSlcbiAgICAgICAgICAgICAgICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgICAgICAgICAgICAgYWRkQ29tbWVudEJlZm9yZShjdHgsIGxpbmVzLCBpay5jb21tZW50QmVmb3JlLCBjaG9tcEtlZXApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNob21wS2VlcCA9IGZhbHNlO1xuICAgICAgICBsZXQgc3RyID0gc3RyaW5naWZ5KGl0ZW0sIGl0ZW1DdHgsICgpID0+IChjb21tZW50ID0gbnVsbCksICgpID0+IChjaG9tcEtlZXAgPSB0cnVlKSk7XG4gICAgICAgIGlmIChjb21tZW50KVxuICAgICAgICAgICAgc3RyICs9IGxpbmVDb21tZW50KHN0ciwgaXRlbUluZGVudCwgY29tbWVudFN0cmluZyhjb21tZW50KSk7XG4gICAgICAgIGlmIChjaG9tcEtlZXAgJiYgY29tbWVudClcbiAgICAgICAgICAgIGNob21wS2VlcCA9IGZhbHNlO1xuICAgICAgICBsaW5lcy5wdXNoKGJsb2NrSXRlbVByZWZpeCArIHN0cik7XG4gICAgfVxuICAgIGxldCBzdHI7XG4gICAgaWYgKGxpbmVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBzdHIgPSBmbG93Q2hhcnMuc3RhcnQgKyBmbG93Q2hhcnMuZW5kO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgc3RyID0gbGluZXNbMF07XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgbGluZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGNvbnN0IGxpbmUgPSBsaW5lc1tpXTtcbiAgICAgICAgICAgIHN0ciArPSBsaW5lID8gYFxcbiR7aW5kZW50fSR7bGluZX1gIDogJ1xcbic7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNvbW1lbnQpIHtcbiAgICAgICAgc3RyICs9ICdcXG4nICsgaW5kZW50Q29tbWVudChjb21tZW50U3RyaW5nKGNvbW1lbnQpLCBpbmRlbnQpO1xuICAgICAgICBpZiAob25Db21tZW50KVxuICAgICAgICAgICAgb25Db21tZW50KCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGNob21wS2VlcCAmJiBvbkNob21wS2VlcClcbiAgICAgICAgb25DaG9tcEtlZXAoKTtcbiAgICByZXR1cm4gc3RyO1xufVxuZnVuY3Rpb24gc3RyaW5naWZ5Rmxvd0NvbGxlY3Rpb24oeyBpdGVtcyB9LCBjdHgsIHsgZmxvd0NoYXJzLCBpdGVtSW5kZW50IH0pIHtcbiAgICBjb25zdCB7IGluZGVudCwgaW5kZW50U3RlcCwgZmxvd0NvbGxlY3Rpb25QYWRkaW5nOiBmY1BhZGRpbmcsIG9wdGlvbnM6IHsgY29tbWVudFN0cmluZyB9IH0gPSBjdHg7XG4gICAgaXRlbUluZGVudCArPSBpbmRlbnRTdGVwO1xuICAgIGNvbnN0IGl0ZW1DdHggPSBPYmplY3QuYXNzaWduKHt9LCBjdHgsIHtcbiAgICAgICAgaW5kZW50OiBpdGVtSW5kZW50LFxuICAgICAgICBpbkZsb3c6IHRydWUsXG4gICAgICAgIHR5cGU6IG51bGxcbiAgICB9KTtcbiAgICBsZXQgcmVxTmV3bGluZSA9IGZhbHNlO1xuICAgIGxldCBsaW5lc0F0VmFsdWUgPSAwO1xuICAgIGNvbnN0IGxpbmVzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7ICsraSkge1xuICAgICAgICBjb25zdCBpdGVtID0gaXRlbXNbaV07XG4gICAgICAgIGxldCBjb21tZW50ID0gbnVsbDtcbiAgICAgICAgaWYgKGlzTm9kZShpdGVtKSkge1xuICAgICAgICAgICAgaWYgKGl0ZW0uc3BhY2VCZWZvcmUpXG4gICAgICAgICAgICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgICAgICAgICBhZGRDb21tZW50QmVmb3JlKGN0eCwgbGluZXMsIGl0ZW0uY29tbWVudEJlZm9yZSwgZmFsc2UpO1xuICAgICAgICAgICAgaWYgKGl0ZW0uY29tbWVudClcbiAgICAgICAgICAgICAgICBjb21tZW50ID0gaXRlbS5jb21tZW50O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzUGFpcihpdGVtKSkge1xuICAgICAgICAgICAgY29uc3QgaWsgPSBpc05vZGUoaXRlbS5rZXkpID8gaXRlbS5rZXkgOiBudWxsO1xuICAgICAgICAgICAgaWYgKGlrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlrLnNwYWNlQmVmb3JlKVxuICAgICAgICAgICAgICAgICAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICAgICAgICAgICAgICBhZGRDb21tZW50QmVmb3JlKGN0eCwgbGluZXMsIGlrLmNvbW1lbnRCZWZvcmUsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBpZiAoaWsuY29tbWVudClcbiAgICAgICAgICAgICAgICAgICAgcmVxTmV3bGluZSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBpdiA9IGlzTm9kZShpdGVtLnZhbHVlKSA/IGl0ZW0udmFsdWUgOiBudWxsO1xuICAgICAgICAgICAgaWYgKGl2KSB7XG4gICAgICAgICAgICAgICAgaWYgKGl2LmNvbW1lbnQpXG4gICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBpdi5jb21tZW50O1xuICAgICAgICAgICAgICAgIGlmIChpdi5jb21tZW50QmVmb3JlKVxuICAgICAgICAgICAgICAgICAgICByZXFOZXdsaW5lID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGl0ZW0udmFsdWUgPT0gbnVsbCAmJiBpaz8uY29tbWVudCkge1xuICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBpay5jb21tZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjb21tZW50KVxuICAgICAgICAgICAgcmVxTmV3bGluZSA9IHRydWU7XG4gICAgICAgIGxldCBzdHIgPSBzdHJpbmdpZnkoaXRlbSwgaXRlbUN0eCwgKCkgPT4gKGNvbW1lbnQgPSBudWxsKSk7XG4gICAgICAgIHJlcU5ld2xpbmUgfHwgKHJlcU5ld2xpbmUgPSBsaW5lcy5sZW5ndGggPiBsaW5lc0F0VmFsdWUgfHwgc3RyLmluY2x1ZGVzKCdcXG4nKSk7XG4gICAgICAgIGlmIChpIDwgaXRlbXMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgc3RyICs9ICcsJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjdHgub3B0aW9ucy50cmFpbGluZ0NvbW1hKSB7XG4gICAgICAgICAgICBpZiAoY3R4Lm9wdGlvbnMubGluZVdpZHRoID4gMCkge1xuICAgICAgICAgICAgICAgIHJlcU5ld2xpbmUgfHwgKHJlcU5ld2xpbmUgPSBsaW5lcy5yZWR1Y2UoKHN1bSwgbGluZSkgPT4gc3VtICsgbGluZS5sZW5ndGggKyAyLCAyKSArXG4gICAgICAgICAgICAgICAgICAgIChzdHIubGVuZ3RoICsgMikgPlxuICAgICAgICAgICAgICAgICAgICBjdHgub3B0aW9ucy5saW5lV2lkdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlcU5ld2xpbmUpIHtcbiAgICAgICAgICAgICAgICBzdHIgKz0gJywnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjb21tZW50KVxuICAgICAgICAgICAgc3RyICs9IGxpbmVDb21tZW50KHN0ciwgaXRlbUluZGVudCwgY29tbWVudFN0cmluZyhjb21tZW50KSk7XG4gICAgICAgIGxpbmVzLnB1c2goc3RyKTtcbiAgICAgICAgbGluZXNBdFZhbHVlID0gbGluZXMubGVuZ3RoO1xuICAgIH1cbiAgICBjb25zdCB7IHN0YXJ0LCBlbmQgfSA9IGZsb3dDaGFycztcbiAgICBpZiAobGluZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBzdGFydCArIGVuZDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlmICghcmVxTmV3bGluZSkge1xuICAgICAgICAgICAgY29uc3QgbGVuID0gbGluZXMucmVkdWNlKChzdW0sIGxpbmUpID0+IHN1bSArIGxpbmUubGVuZ3RoICsgMiwgMik7XG4gICAgICAgICAgICByZXFOZXdsaW5lID0gY3R4Lm9wdGlvbnMubGluZVdpZHRoID4gMCAmJiBsZW4gPiBjdHgub3B0aW9ucy5saW5lV2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlcU5ld2xpbmUpIHtcbiAgICAgICAgICAgIGxldCBzdHIgPSBzdGFydDtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcylcbiAgICAgICAgICAgICAgICBzdHIgKz0gbGluZSA/IGBcXG4ke2luZGVudFN0ZXB9JHtpbmRlbnR9JHtsaW5lfWAgOiAnXFxuJztcbiAgICAgICAgICAgIHJldHVybiBgJHtzdHJ9XFxuJHtpbmRlbnR9JHtlbmR9YDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBgJHtzdGFydH0ke2ZjUGFkZGluZ30ke2xpbmVzLmpvaW4oJyAnKX0ke2ZjUGFkZGluZ30ke2VuZH1gO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gYWRkQ29tbWVudEJlZm9yZSh7IGluZGVudCwgb3B0aW9uczogeyBjb21tZW50U3RyaW5nIH0gfSwgbGluZXMsIGNvbW1lbnQsIGNob21wS2VlcCkge1xuICAgIGlmIChjb21tZW50ICYmIGNob21wS2VlcClcbiAgICAgICAgY29tbWVudCA9IGNvbW1lbnQucmVwbGFjZSgvXlxcbisvLCAnJyk7XG4gICAgaWYgKGNvbW1lbnQpIHtcbiAgICAgICAgY29uc3QgaWMgPSBpbmRlbnRDb21tZW50KGNvbW1lbnRTdHJpbmcoY29tbWVudCksIGluZGVudCk7XG4gICAgICAgIGxpbmVzLnB1c2goaWMudHJpbVN0YXJ0KCkpOyAvLyBBdm9pZCBkb3VibGUgaW5kZW50IG9uIGZpcnN0IGxpbmVcbiAgICB9XG59XG5cbmV4cG9ydCB7IHN0cmluZ2lmeUNvbGxlY3Rpb24gfTtcbiIsImltcG9ydCB7IHN0cmluZ2lmeUNvbGxlY3Rpb24gfSBmcm9tICcuLi9zdHJpbmdpZnkvc3RyaW5naWZ5Q29sbGVjdGlvbi5qcyc7XG5pbXBvcnQgeyBhZGRQYWlyVG9KU01hcCB9IGZyb20gJy4vYWRkUGFpclRvSlNNYXAuanMnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbiB9IGZyb20gJy4vQ29sbGVjdGlvbi5qcyc7XG5pbXBvcnQgeyBNQVAsIGlzUGFpciwgaXNTY2FsYXIgfSBmcm9tICcuL2lkZW50aXR5LmpzJztcbmltcG9ydCB7IFBhaXIsIGNyZWF0ZVBhaXIgfSBmcm9tICcuL1BhaXIuanMnO1xuaW1wb3J0IHsgaXNTY2FsYXJWYWx1ZSB9IGZyb20gJy4vU2NhbGFyLmpzJztcblxuZnVuY3Rpb24gZmluZFBhaXIoaXRlbXMsIGtleSkge1xuICAgIGNvbnN0IGsgPSBpc1NjYWxhcihrZXkpID8ga2V5LnZhbHVlIDoga2V5O1xuICAgIGZvciAoY29uc3QgaXQgb2YgaXRlbXMpIHtcbiAgICAgICAgaWYgKGlzUGFpcihpdCkpIHtcbiAgICAgICAgICAgIGlmIChpdC5rZXkgPT09IGtleSB8fCBpdC5rZXkgPT09IGspXG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0O1xuICAgICAgICAgICAgaWYgKGlzU2NhbGFyKGl0LmtleSkgJiYgaXQua2V5LnZhbHVlID09PSBrKVxuICAgICAgICAgICAgICAgIHJldHVybiBpdDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xufVxuY2xhc3MgWUFNTE1hcCBleHRlbmRzIENvbGxlY3Rpb24ge1xuICAgIHN0YXRpYyBnZXQgdGFnTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuICd0YWc6eWFtbC5vcmcsMjAwMjptYXAnO1xuICAgIH1cbiAgICBjb25zdHJ1Y3RvcihzY2hlbWEpIHtcbiAgICAgICAgc3VwZXIoTUFQLCBzY2hlbWEpO1xuICAgICAgICB0aGlzLml0ZW1zID0gW107XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgZ2VuZXJpYyBjb2xsZWN0aW9uIHBhcnNpbmcgbWV0aG9kIHRoYXQgY2FuIGJlIGV4dGVuZGVkXG4gICAgICogdG8gb3RoZXIgbm9kZSBjbGFzc2VzIHRoYXQgaW5oZXJpdCBmcm9tIFlBTUxNYXBcbiAgICAgKi9cbiAgICBzdGF0aWMgZnJvbShzY2hlbWEsIG9iaiwgY3R4KSB7XG4gICAgICAgIGNvbnN0IHsga2VlcFVuZGVmaW5lZCwgcmVwbGFjZXIgfSA9IGN0eDtcbiAgICAgICAgY29uc3QgbWFwID0gbmV3IHRoaXMoc2NoZW1hKTtcbiAgICAgICAgY29uc3QgYWRkID0gKGtleSwgdmFsdWUpID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcmVwbGFjZXIgPT09ICdmdW5jdGlvbicpXG4gICAgICAgICAgICAgICAgdmFsdWUgPSByZXBsYWNlci5jYWxsKG9iaiwga2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHJlcGxhY2VyKSAmJiAhcmVwbGFjZXIuaW5jbHVkZXMoa2V5KSlcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCB8fCBrZWVwVW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgIG1hcC5pdGVtcy5wdXNoKGNyZWF0ZVBhaXIoa2V5LCB2YWx1ZSwgY3R4KSk7XG4gICAgICAgIH07XG4gICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBNYXApIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIG9iailcbiAgICAgICAgICAgICAgICBhZGQoa2V5LCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAob2JqICYmIHR5cGVvZiBvYmogPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhvYmopKVxuICAgICAgICAgICAgICAgIGFkZChrZXksIG9ialtrZXldKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHNjaGVtYS5zb3J0TWFwRW50cmllcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgbWFwLml0ZW1zLnNvcnQoc2NoZW1hLnNvcnRNYXBFbnRyaWVzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWFwO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgdmFsdWUgdG8gdGhlIGNvbGxlY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3ZlcndyaXRlIC0gSWYgbm90IHNldCBgdHJ1ZWAsIHVzaW5nIGEga2V5IHRoYXQgaXMgYWxyZWFkeSBpbiB0aGVcbiAgICAgKiAgIGNvbGxlY3Rpb24gd2lsbCB0aHJvdy4gT3RoZXJ3aXNlLCBvdmVyd3JpdGVzIHRoZSBwcmV2aW91cyB2YWx1ZS5cbiAgICAgKi9cbiAgICBhZGQocGFpciwgb3ZlcndyaXRlKSB7XG4gICAgICAgIGxldCBfcGFpcjtcbiAgICAgICAgaWYgKGlzUGFpcihwYWlyKSlcbiAgICAgICAgICAgIF9wYWlyID0gcGFpcjtcbiAgICAgICAgZWxzZSBpZiAoIXBhaXIgfHwgdHlwZW9mIHBhaXIgIT09ICdvYmplY3QnIHx8ICEoJ2tleScgaW4gcGFpcikpIHtcbiAgICAgICAgICAgIC8vIEluIFR5cGVTY3JpcHQsIHRoaXMgbmV2ZXIgaGFwcGVucy5cbiAgICAgICAgICAgIF9wYWlyID0gbmV3IFBhaXIocGFpciwgcGFpcj8udmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIF9wYWlyID0gbmV3IFBhaXIocGFpci5rZXksIHBhaXIudmFsdWUpO1xuICAgICAgICBjb25zdCBwcmV2ID0gZmluZFBhaXIodGhpcy5pdGVtcywgX3BhaXIua2V5KTtcbiAgICAgICAgY29uc3Qgc29ydEVudHJpZXMgPSB0aGlzLnNjaGVtYT8uc29ydE1hcEVudHJpZXM7XG4gICAgICAgIGlmIChwcmV2KSB7XG4gICAgICAgICAgICBpZiAoIW92ZXJ3cml0ZSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEtleSAke19wYWlyLmtleX0gYWxyZWFkeSBzZXRgKTtcbiAgICAgICAgICAgIC8vIEZvciBzY2FsYXJzLCBrZWVwIHRoZSBvbGQgbm9kZSAmIGl0cyBjb21tZW50cyBhbmQgYW5jaG9yc1xuICAgICAgICAgICAgaWYgKGlzU2NhbGFyKHByZXYudmFsdWUpICYmIGlzU2NhbGFyVmFsdWUoX3BhaXIudmFsdWUpKVxuICAgICAgICAgICAgICAgIHByZXYudmFsdWUudmFsdWUgPSBfcGFpci52YWx1ZTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBwcmV2LnZhbHVlID0gX3BhaXIudmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc29ydEVudHJpZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGkgPSB0aGlzLml0ZW1zLmZpbmRJbmRleChpdGVtID0+IHNvcnRFbnRyaWVzKF9wYWlyLCBpdGVtKSA8IDApO1xuICAgICAgICAgICAgaWYgKGkgPT09IC0xKVxuICAgICAgICAgICAgICAgIHRoaXMuaXRlbXMucHVzaChfcGFpcik7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdGhpcy5pdGVtcy5zcGxpY2UoaSwgMCwgX3BhaXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5pdGVtcy5wdXNoKF9wYWlyKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBkZWxldGUoa2V5KSB7XG4gICAgICAgIGNvbnN0IGl0ID0gZmluZFBhaXIodGhpcy5pdGVtcywga2V5KTtcbiAgICAgICAgaWYgKCFpdClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgZGVsID0gdGhpcy5pdGVtcy5zcGxpY2UodGhpcy5pdGVtcy5pbmRleE9mKGl0KSwgMSk7XG4gICAgICAgIHJldHVybiBkZWwubGVuZ3RoID4gMDtcbiAgICB9XG4gICAgZ2V0KGtleSwga2VlcFNjYWxhcikge1xuICAgICAgICBjb25zdCBpdCA9IGZpbmRQYWlyKHRoaXMuaXRlbXMsIGtleSk7XG4gICAgICAgIGNvbnN0IG5vZGUgPSBpdD8udmFsdWU7XG4gICAgICAgIHJldHVybiAoIWtlZXBTY2FsYXIgJiYgaXNTY2FsYXIobm9kZSkgPyBub2RlLnZhbHVlIDogbm9kZSkgPz8gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBoYXMoa2V5KSB7XG4gICAgICAgIHJldHVybiAhIWZpbmRQYWlyKHRoaXMuaXRlbXMsIGtleSk7XG4gICAgfVxuICAgIHNldChrZXksIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuYWRkKG5ldyBQYWlyKGtleSwgdmFsdWUpLCB0cnVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIGN0eCAtIENvbnZlcnNpb24gY29udGV4dCwgb3JpZ2luYWxseSBzZXQgaW4gRG9jdW1lbnQjdG9KUygpXG4gICAgICogQHBhcmFtIHtDbGFzc30gVHlwZSAtIElmIHNldCwgZm9yY2VzIHRoZSByZXR1cm5lZCBjb2xsZWN0aW9uIHR5cGVcbiAgICAgKiBAcmV0dXJucyBJbnN0YW5jZSBvZiBUeXBlLCBNYXAsIG9yIE9iamVjdFxuICAgICAqL1xuICAgIHRvSlNPTihfLCBjdHgsIFR5cGUpIHtcbiAgICAgICAgY29uc3QgbWFwID0gVHlwZSA/IG5ldyBUeXBlKCkgOiBjdHg/Lm1hcEFzTWFwID8gbmV3IE1hcCgpIDoge307XG4gICAgICAgIGlmIChjdHg/Lm9uQ3JlYXRlKVxuICAgICAgICAgICAgY3R4Lm9uQ3JlYXRlKG1hcCk7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLml0ZW1zKVxuICAgICAgICAgICAgYWRkUGFpclRvSlNNYXAoY3R4LCBtYXAsIGl0ZW0pO1xuICAgICAgICByZXR1cm4gbWFwO1xuICAgIH1cbiAgICB0b1N0cmluZyhjdHgsIG9uQ29tbWVudCwgb25DaG9tcEtlZXApIHtcbiAgICAgICAgaWYgKCFjdHgpXG4gICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcyk7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLml0ZW1zKSB7XG4gICAgICAgICAgICBpZiAoIWlzUGFpcihpdGVtKSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1hcCBpdGVtcyBtdXN0IGFsbCBiZSBwYWlyczsgZm91bmQgJHtKU09OLnN0cmluZ2lmeShpdGVtKX0gaW5zdGVhZGApO1xuICAgICAgICB9XG4gICAgICAgIGlmICghY3R4LmFsbE51bGxWYWx1ZXMgJiYgdGhpcy5oYXNBbGxOdWxsVmFsdWVzKGZhbHNlKSlcbiAgICAgICAgICAgIGN0eCA9IE9iamVjdC5hc3NpZ24oe30sIGN0eCwgeyBhbGxOdWxsVmFsdWVzOiB0cnVlIH0pO1xuICAgICAgICByZXR1cm4gc3RyaW5naWZ5Q29sbGVjdGlvbih0aGlzLCBjdHgsIHtcbiAgICAgICAgICAgIGJsb2NrSXRlbVByZWZpeDogJycsXG4gICAgICAgICAgICBmbG93Q2hhcnM6IHsgc3RhcnQ6ICd7JywgZW5kOiAnfScgfSxcbiAgICAgICAgICAgIGl0ZW1JbmRlbnQ6IGN0eC5pbmRlbnQgfHwgJycsXG4gICAgICAgICAgICBvbkNob21wS2VlcCxcbiAgICAgICAgICAgIG9uQ29tbWVudFxuICAgICAgICB9KTtcbiAgICB9XG59XG5cbmV4cG9ydCB7IFlBTUxNYXAsIGZpbmRQYWlyIH07XG4iLCJpbXBvcnQgeyBpc01hcCB9IGZyb20gJy4uLy4uL25vZGVzL2lkZW50aXR5LmpzJztcbmltcG9ydCB7IFlBTUxNYXAgfSBmcm9tICcuLi8uLi9ub2Rlcy9ZQU1MTWFwLmpzJztcblxuY29uc3QgbWFwID0ge1xuICAgIGNvbGxlY3Rpb246ICdtYXAnLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgbm9kZUNsYXNzOiBZQU1MTWFwLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOm1hcCcsXG4gICAgcmVzb2x2ZShtYXAsIG9uRXJyb3IpIHtcbiAgICAgICAgaWYgKCFpc01hcChtYXApKVxuICAgICAgICAgICAgb25FcnJvcignRXhwZWN0ZWQgYSBtYXBwaW5nIGZvciB0aGlzIHRhZycpO1xuICAgICAgICByZXR1cm4gbWFwO1xuICAgIH0sXG4gICAgY3JlYXRlTm9kZTogKHNjaGVtYSwgb2JqLCBjdHgpID0+IFlBTUxNYXAuZnJvbShzY2hlbWEsIG9iaiwgY3R4KVxufTtcblxuZXhwb3J0IHsgbWFwIH07XG4iLCJpbXBvcnQgeyBjcmVhdGVOb2RlIH0gZnJvbSAnLi4vZG9jL2NyZWF0ZU5vZGUuanMnO1xuaW1wb3J0IHsgc3RyaW5naWZ5Q29sbGVjdGlvbiB9IGZyb20gJy4uL3N0cmluZ2lmeS9zdHJpbmdpZnlDb2xsZWN0aW9uLmpzJztcbmltcG9ydCB7IENvbGxlY3Rpb24gfSBmcm9tICcuL0NvbGxlY3Rpb24uanMnO1xuaW1wb3J0IHsgU0VRLCBpc1NjYWxhciB9IGZyb20gJy4vaWRlbnRpdHkuanMnO1xuaW1wb3J0IHsgaXNTY2FsYXJWYWx1ZSB9IGZyb20gJy4vU2NhbGFyLmpzJztcbmltcG9ydCB7IHRvSlMgfSBmcm9tICcuL3RvSlMuanMnO1xuXG5jbGFzcyBZQU1MU2VxIGV4dGVuZHMgQ29sbGVjdGlvbiB7XG4gICAgc3RhdGljIGdldCB0YWdOYW1lKCkge1xuICAgICAgICByZXR1cm4gJ3RhZzp5YW1sLm9yZywyMDAyOnNlcSc7XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKHNjaGVtYSkge1xuICAgICAgICBzdXBlcihTRVEsIHNjaGVtYSk7XG4gICAgICAgIHRoaXMuaXRlbXMgPSBbXTtcbiAgICB9XG4gICAgYWRkKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuaXRlbXMucHVzaCh2YWx1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYSB2YWx1ZSBmcm9tIHRoZSBjb2xsZWN0aW9uLlxuICAgICAqXG4gICAgICogYGtleWAgbXVzdCBjb250YWluIGEgcmVwcmVzZW50YXRpb24gb2YgYW4gaW50ZWdlciBmb3IgdGhpcyB0byBzdWNjZWVkLlxuICAgICAqIEl0IG1heSBiZSB3cmFwcGVkIGluIGEgYFNjYWxhcmAuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGl0ZW0gd2FzIGZvdW5kIGFuZCByZW1vdmVkLlxuICAgICAqL1xuICAgIGRlbGV0ZShrZXkpIHtcbiAgICAgICAgY29uc3QgaWR4ID0gYXNJdGVtSW5kZXgoa2V5KTtcbiAgICAgICAgaWYgKHR5cGVvZiBpZHggIT09ICdudW1iZXInKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjb25zdCBkZWwgPSB0aGlzLml0ZW1zLnNwbGljZShpZHgsIDEpO1xuICAgICAgICByZXR1cm4gZGVsLmxlbmd0aCA+IDA7XG4gICAgfVxuICAgIGdldChrZXksIGtlZXBTY2FsYXIpIHtcbiAgICAgICAgY29uc3QgaWR4ID0gYXNJdGVtSW5kZXgoa2V5KTtcbiAgICAgICAgaWYgKHR5cGVvZiBpZHggIT09ICdudW1iZXInKVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgaXQgPSB0aGlzLml0ZW1zW2lkeF07XG4gICAgICAgIHJldHVybiAha2VlcFNjYWxhciAmJiBpc1NjYWxhcihpdCkgPyBpdC52YWx1ZSA6IGl0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhlIGNvbGxlY3Rpb24gaW5jbHVkZXMgYSB2YWx1ZSB3aXRoIHRoZSBrZXkgYGtleWAuXG4gICAgICpcbiAgICAgKiBga2V5YCBtdXN0IGNvbnRhaW4gYSByZXByZXNlbnRhdGlvbiBvZiBhbiBpbnRlZ2VyIGZvciB0aGlzIHRvIHN1Y2NlZWQuXG4gICAgICogSXQgbWF5IGJlIHdyYXBwZWQgaW4gYSBgU2NhbGFyYC5cbiAgICAgKi9cbiAgICBoYXMoa2V5KSB7XG4gICAgICAgIGNvbnN0IGlkeCA9IGFzSXRlbUluZGV4KGtleSk7XG4gICAgICAgIHJldHVybiB0eXBlb2YgaWR4ID09PSAnbnVtYmVyJyAmJiBpZHggPCB0aGlzLml0ZW1zLmxlbmd0aDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyBhIHZhbHVlIGluIHRoaXMgY29sbGVjdGlvbi4gRm9yIGAhIXNldGAsIGB2YWx1ZWAgbmVlZHMgdG8gYmUgYVxuICAgICAqIGJvb2xlYW4gdG8gYWRkL3JlbW92ZSB0aGUgaXRlbSBmcm9tIHRoZSBzZXQuXG4gICAgICpcbiAgICAgKiBJZiBga2V5YCBkb2VzIG5vdCBjb250YWluIGEgcmVwcmVzZW50YXRpb24gb2YgYW4gaW50ZWdlciwgdGhpcyB3aWxsIHRocm93LlxuICAgICAqIEl0IG1heSBiZSB3cmFwcGVkIGluIGEgYFNjYWxhcmAuXG4gICAgICovXG4gICAgc2V0KGtleSwgdmFsdWUpIHtcbiAgICAgICAgY29uc3QgaWR4ID0gYXNJdGVtSW5kZXgoa2V5KTtcbiAgICAgICAgaWYgKHR5cGVvZiBpZHggIT09ICdudW1iZXInKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBhIHZhbGlkIGluZGV4LCBub3QgJHtrZXl9LmApO1xuICAgICAgICBjb25zdCBwcmV2ID0gdGhpcy5pdGVtc1tpZHhdO1xuICAgICAgICBpZiAoaXNTY2FsYXIocHJldikgJiYgaXNTY2FsYXJWYWx1ZSh2YWx1ZSkpXG4gICAgICAgICAgICBwcmV2LnZhbHVlID0gdmFsdWU7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRoaXMuaXRlbXNbaWR4XSA9IHZhbHVlO1xuICAgIH1cbiAgICB0b0pTT04oXywgY3R4KSB7XG4gICAgICAgIGNvbnN0IHNlcSA9IFtdO1xuICAgICAgICBpZiAoY3R4Py5vbkNyZWF0ZSlcbiAgICAgICAgICAgIGN0eC5vbkNyZWF0ZShzZXEpO1xuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLml0ZW1zKVxuICAgICAgICAgICAgc2VxLnB1c2godG9KUyhpdGVtLCBTdHJpbmcoaSsrKSwgY3R4KSk7XG4gICAgICAgIHJldHVybiBzZXE7XG4gICAgfVxuICAgIHRvU3RyaW5nKGN0eCwgb25Db21tZW50LCBvbkNob21wS2VlcCkge1xuICAgICAgICBpZiAoIWN0eClcbiAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzKTtcbiAgICAgICAgcmV0dXJuIHN0cmluZ2lmeUNvbGxlY3Rpb24odGhpcywgY3R4LCB7XG4gICAgICAgICAgICBibG9ja0l0ZW1QcmVmaXg6ICctICcsXG4gICAgICAgICAgICBmbG93Q2hhcnM6IHsgc3RhcnQ6ICdbJywgZW5kOiAnXScgfSxcbiAgICAgICAgICAgIGl0ZW1JbmRlbnQ6IChjdHguaW5kZW50IHx8ICcnKSArICcgICcsXG4gICAgICAgICAgICBvbkNob21wS2VlcCxcbiAgICAgICAgICAgIG9uQ29tbWVudFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIGZyb20oc2NoZW1hLCBvYmosIGN0eCkge1xuICAgICAgICBjb25zdCB7IHJlcGxhY2VyIH0gPSBjdHg7XG4gICAgICAgIGNvbnN0IHNlcSA9IG5ldyB0aGlzKHNjaGVtYSk7XG4gICAgICAgIGlmIChvYmogJiYgU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChvYmopKSB7XG4gICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICBmb3IgKGxldCBpdCBvZiBvYmopIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlcGxhY2VyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IG9iaiBpbnN0YW5jZW9mIFNldCA/IGl0IDogU3RyaW5nKGkrKyk7XG4gICAgICAgICAgICAgICAgICAgIGl0ID0gcmVwbGFjZXIuY2FsbChvYmosIGtleSwgaXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzZXEuaXRlbXMucHVzaChjcmVhdGVOb2RlKGl0LCB1bmRlZmluZWQsIGN0eCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZXE7XG4gICAgfVxufVxuZnVuY3Rpb24gYXNJdGVtSW5kZXgoa2V5KSB7XG4gICAgbGV0IGlkeCA9IGlzU2NhbGFyKGtleSkgPyBrZXkudmFsdWUgOiBrZXk7XG4gICAgaWYgKGlkeCAmJiB0eXBlb2YgaWR4ID09PSAnc3RyaW5nJylcbiAgICAgICAgaWR4ID0gTnVtYmVyKGlkeCk7XG4gICAgcmV0dXJuIHR5cGVvZiBpZHggPT09ICdudW1iZXInICYmIE51bWJlci5pc0ludGVnZXIoaWR4KSAmJiBpZHggPj0gMFxuICAgICAgICA/IGlkeFxuICAgICAgICA6IG51bGw7XG59XG5cbmV4cG9ydCB7IFlBTUxTZXEgfTtcbiIsImltcG9ydCB7IGlzU2VxIH0gZnJvbSAnLi4vLi4vbm9kZXMvaWRlbnRpdHkuanMnO1xuaW1wb3J0IHsgWUFNTFNlcSB9IGZyb20gJy4uLy4uL25vZGVzL1lBTUxTZXEuanMnO1xuXG5jb25zdCBzZXEgPSB7XG4gICAgY29sbGVjdGlvbjogJ3NlcScsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgICBub2RlQ2xhc3M6IFlBTUxTZXEsXG4gICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6c2VxJyxcbiAgICByZXNvbHZlKHNlcSwgb25FcnJvcikge1xuICAgICAgICBpZiAoIWlzU2VxKHNlcSkpXG4gICAgICAgICAgICBvbkVycm9yKCdFeHBlY3RlZCBhIHNlcXVlbmNlIGZvciB0aGlzIHRhZycpO1xuICAgICAgICByZXR1cm4gc2VxO1xuICAgIH0sXG4gICAgY3JlYXRlTm9kZTogKHNjaGVtYSwgb2JqLCBjdHgpID0+IFlBTUxTZXEuZnJvbShzY2hlbWEsIG9iaiwgY3R4KVxufTtcblxuZXhwb3J0IHsgc2VxIH07XG4iLCJpbXBvcnQgeyBzdHJpbmdpZnlTdHJpbmcgfSBmcm9tICcuLi8uLi9zdHJpbmdpZnkvc3RyaW5naWZ5U3RyaW5nLmpzJztcblxuY29uc3Qgc3RyaW5nID0ge1xuICAgIGlkZW50aWZ5OiB2YWx1ZSA9PiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6c3RyJyxcbiAgICByZXNvbHZlOiBzdHIgPT4gc3RyLFxuICAgIHN0cmluZ2lmeShpdGVtLCBjdHgsIG9uQ29tbWVudCwgb25DaG9tcEtlZXApIHtcbiAgICAgICAgY3R4ID0gT2JqZWN0LmFzc2lnbih7IGFjdHVhbFN0cmluZzogdHJ1ZSB9LCBjdHgpO1xuICAgICAgICByZXR1cm4gc3RyaW5naWZ5U3RyaW5nKGl0ZW0sIGN0eCwgb25Db21tZW50LCBvbkNob21wS2VlcCk7XG4gICAgfVxufTtcblxuZXhwb3J0IHsgc3RyaW5nIH07XG4iLCJpbXBvcnQgeyBTY2FsYXIgfSBmcm9tICcuLi8uLi9ub2Rlcy9TY2FsYXIuanMnO1xuXG5jb25zdCBudWxsVGFnID0ge1xuICAgIGlkZW50aWZ5OiB2YWx1ZSA9PiB2YWx1ZSA9PSBudWxsLFxuICAgIGNyZWF0ZU5vZGU6ICgpID0+IG5ldyBTY2FsYXIobnVsbCksXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjpudWxsJyxcbiAgICB0ZXN0OiAvXig/On58W05uXXVsbHxOVUxMKT8kLyxcbiAgICByZXNvbHZlOiAoKSA9PiBuZXcgU2NhbGFyKG51bGwpLFxuICAgIHN0cmluZ2lmeTogKHsgc291cmNlIH0sIGN0eCkgPT4gdHlwZW9mIHNvdXJjZSA9PT0gJ3N0cmluZycgJiYgbnVsbFRhZy50ZXN0LnRlc3Qoc291cmNlKVxuICAgICAgICA/IHNvdXJjZVxuICAgICAgICA6IGN0eC5vcHRpb25zLm51bGxTdHJcbn07XG5cbmV4cG9ydCB7IG51bGxUYWcgfTtcbiIsImltcG9ydCB7IFNjYWxhciB9IGZyb20gJy4uLy4uL25vZGVzL1NjYWxhci5qcyc7XG5cbmNvbnN0IGJvb2xUYWcgPSB7XG4gICAgaWRlbnRpZnk6IHZhbHVlID0+IHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6Ym9vbCcsXG4gICAgdGVzdDogL14oPzpbVHRdcnVlfFRSVUV8W0ZmXWFsc2V8RkFMU0UpJC8sXG4gICAgcmVzb2x2ZTogc3RyID0+IG5ldyBTY2FsYXIoc3RyWzBdID09PSAndCcgfHwgc3RyWzBdID09PSAnVCcpLFxuICAgIHN0cmluZ2lmeSh7IHNvdXJjZSwgdmFsdWUgfSwgY3R4KSB7XG4gICAgICAgIGlmIChzb3VyY2UgJiYgYm9vbFRhZy50ZXN0LnRlc3Qoc291cmNlKSkge1xuICAgICAgICAgICAgY29uc3Qgc3YgPSBzb3VyY2VbMF0gPT09ICd0JyB8fCBzb3VyY2VbMF0gPT09ICdUJztcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gc3YpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWUgPyBjdHgub3B0aW9ucy50cnVlU3RyIDogY3R4Lm9wdGlvbnMuZmFsc2VTdHI7XG4gICAgfVxufTtcblxuZXhwb3J0IHsgYm9vbFRhZyB9O1xuIiwiZnVuY3Rpb24gc3RyaW5naWZ5TnVtYmVyKHsgZm9ybWF0LCBtaW5GcmFjdGlvbkRpZ2l0cywgdGFnLCB2YWx1ZSB9KSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2JpZ2ludCcpXG4gICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICAgIGNvbnN0IG51bSA9IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgPyB2YWx1ZSA6IE51bWJlcih2YWx1ZSk7XG4gICAgaWYgKCFpc0Zpbml0ZShudW0pKVxuICAgICAgICByZXR1cm4gaXNOYU4obnVtKSA/ICcubmFuJyA6IG51bSA8IDAgPyAnLS5pbmYnIDogJy5pbmYnO1xuICAgIGxldCBuID0gT2JqZWN0LmlzKHZhbHVlLCAtMCkgPyAnLTAnIDogSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICAgIGlmICghZm9ybWF0ICYmXG4gICAgICAgIG1pbkZyYWN0aW9uRGlnaXRzICYmXG4gICAgICAgICghdGFnIHx8IHRhZyA9PT0gJ3RhZzp5YW1sLm9yZywyMDAyOmZsb2F0JykgJiZcbiAgICAgICAgL14tP1xcZC8udGVzdChuKSAmJlxuICAgICAgICAhbi5pbmNsdWRlcygnZScpKSB7XG4gICAgICAgIGxldCBpID0gbi5pbmRleE9mKCcuJyk7XG4gICAgICAgIGlmIChpIDwgMCkge1xuICAgICAgICAgICAgaSA9IG4ubGVuZ3RoO1xuICAgICAgICAgICAgbiArPSAnLic7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGQgPSBtaW5GcmFjdGlvbkRpZ2l0cyAtIChuLmxlbmd0aCAtIGkgLSAxKTtcbiAgICAgICAgd2hpbGUgKGQtLSA+IDApXG4gICAgICAgICAgICBuICs9ICcwJztcbiAgICB9XG4gICAgcmV0dXJuIG47XG59XG5cbmV4cG9ydCB7IHN0cmluZ2lmeU51bWJlciB9O1xuIiwiaW1wb3J0IHsgU2NhbGFyIH0gZnJvbSAnLi4vLi4vbm9kZXMvU2NhbGFyLmpzJztcbmltcG9ydCB7IHN0cmluZ2lmeU51bWJlciB9IGZyb20gJy4uLy4uL3N0cmluZ2lmeS9zdHJpbmdpZnlOdW1iZXIuanMnO1xuXG5jb25zdCBmbG9hdE5hTiA9IHtcbiAgICBpZGVudGlmeTogdmFsdWUgPT4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOmZsb2F0JyxcbiAgICB0ZXN0OiAvXig/OlstK10/XFwuKD86aW5mfEluZnxJTkYpfFxcLm5hbnxcXC5OYU58XFwuTkFOKSQvLFxuICAgIHJlc29sdmU6IHN0ciA9PiBzdHIuc2xpY2UoLTMpLnRvTG93ZXJDYXNlKCkgPT09ICduYW4nXG4gICAgICAgID8gTmFOXG4gICAgICAgIDogc3RyWzBdID09PSAnLSdcbiAgICAgICAgICAgID8gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZXG4gICAgICAgICAgICA6IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSxcbiAgICBzdHJpbmdpZnk6IHN0cmluZ2lmeU51bWJlclxufTtcbmNvbnN0IGZsb2F0RXhwID0ge1xuICAgIGlkZW50aWZ5OiB2YWx1ZSA9PiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6ZmxvYXQnLFxuICAgIGZvcm1hdDogJ0VYUCcsXG4gICAgdGVzdDogL15bLStdPyg/OlxcLlswLTldK3xbMC05XSsoPzpcXC5bMC05XSopPylbZUVdWy0rXT9bMC05XSskLyxcbiAgICByZXNvbHZlOiBzdHIgPT4gcGFyc2VGbG9hdChzdHIpLFxuICAgIHN0cmluZ2lmeShub2RlKSB7XG4gICAgICAgIGNvbnN0IG51bSA9IE51bWJlcihub2RlLnZhbHVlKTtcbiAgICAgICAgcmV0dXJuIGlzRmluaXRlKG51bSkgPyBudW0udG9FeHBvbmVudGlhbCgpIDogc3RyaW5naWZ5TnVtYmVyKG5vZGUpO1xuICAgIH1cbn07XG5jb25zdCBmbG9hdCA9IHtcbiAgICBpZGVudGlmeTogdmFsdWUgPT4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOmZsb2F0JyxcbiAgICB0ZXN0OiAvXlstK10/KD86XFwuWzAtOV0rfFswLTldK1xcLlswLTldKikkLyxcbiAgICByZXNvbHZlKHN0cikge1xuICAgICAgICBjb25zdCBub2RlID0gbmV3IFNjYWxhcihwYXJzZUZsb2F0KHN0cikpO1xuICAgICAgICBjb25zdCBkb3QgPSBzdHIuaW5kZXhPZignLicpO1xuICAgICAgICBpZiAoZG90ICE9PSAtMSAmJiBzdHJbc3RyLmxlbmd0aCAtIDFdID09PSAnMCcpXG4gICAgICAgICAgICBub2RlLm1pbkZyYWN0aW9uRGlnaXRzID0gc3RyLmxlbmd0aCAtIGRvdCAtIDE7XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH0sXG4gICAgc3RyaW5naWZ5OiBzdHJpbmdpZnlOdW1iZXJcbn07XG5cbmV4cG9ydCB7IGZsb2F0LCBmbG9hdEV4cCwgZmxvYXROYU4gfTtcbiIsImltcG9ydCB7IHN0cmluZ2lmeU51bWJlciB9IGZyb20gJy4uLy4uL3N0cmluZ2lmeS9zdHJpbmdpZnlOdW1iZXIuanMnO1xuXG5jb25zdCBpbnRJZGVudGlmeSA9ICh2YWx1ZSkgPT4gdHlwZW9mIHZhbHVlID09PSAnYmlnaW50JyB8fCBOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKTtcbmNvbnN0IGludFJlc29sdmUgPSAoc3RyLCBvZmZzZXQsIHJhZGl4LCB7IGludEFzQmlnSW50IH0pID0+IChpbnRBc0JpZ0ludCA/IEJpZ0ludChzdHIpIDogcGFyc2VJbnQoc3RyLnN1YnN0cmluZyhvZmZzZXQpLCByYWRpeCkpO1xuZnVuY3Rpb24gaW50U3RyaW5naWZ5KG5vZGUsIHJhZGl4LCBwcmVmaXgpIHtcbiAgICBjb25zdCB7IHZhbHVlIH0gPSBub2RlO1xuICAgIGlmIChpbnRJZGVudGlmeSh2YWx1ZSkgJiYgdmFsdWUgPj0gMClcbiAgICAgICAgcmV0dXJuIHByZWZpeCArIHZhbHVlLnRvU3RyaW5nKHJhZGl4KTtcbiAgICByZXR1cm4gc3RyaW5naWZ5TnVtYmVyKG5vZGUpO1xufVxuY29uc3QgaW50T2N0ID0ge1xuICAgIGlkZW50aWZ5OiB2YWx1ZSA9PiBpbnRJZGVudGlmeSh2YWx1ZSkgJiYgdmFsdWUgPj0gMCxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOmludCcsXG4gICAgZm9ybWF0OiAnT0NUJyxcbiAgICB0ZXN0OiAvXjBvWzAtN10rJC8sXG4gICAgcmVzb2x2ZTogKHN0ciwgX29uRXJyb3IsIG9wdCkgPT4gaW50UmVzb2x2ZShzdHIsIDIsIDgsIG9wdCksXG4gICAgc3RyaW5naWZ5OiBub2RlID0+IGludFN0cmluZ2lmeShub2RlLCA4LCAnMG8nKVxufTtcbmNvbnN0IGludCA9IHtcbiAgICBpZGVudGlmeTogaW50SWRlbnRpZnksXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjppbnQnLFxuICAgIHRlc3Q6IC9eWy0rXT9bMC05XSskLyxcbiAgICByZXNvbHZlOiAoc3RyLCBfb25FcnJvciwgb3B0KSA9PiBpbnRSZXNvbHZlKHN0ciwgMCwgMTAsIG9wdCksXG4gICAgc3RyaW5naWZ5OiBzdHJpbmdpZnlOdW1iZXJcbn07XG5jb25zdCBpbnRIZXggPSB7XG4gICAgaWRlbnRpZnk6IHZhbHVlID0+IGludElkZW50aWZ5KHZhbHVlKSAmJiB2YWx1ZSA+PSAwLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6aW50JyxcbiAgICBmb3JtYXQ6ICdIRVgnLFxuICAgIHRlc3Q6IC9eMHhbMC05YS1mQS1GXSskLyxcbiAgICByZXNvbHZlOiAoc3RyLCBfb25FcnJvciwgb3B0KSA9PiBpbnRSZXNvbHZlKHN0ciwgMiwgMTYsIG9wdCksXG4gICAgc3RyaW5naWZ5OiBub2RlID0+IGludFN0cmluZ2lmeShub2RlLCAxNiwgJzB4Jylcbn07XG5cbmV4cG9ydCB7IGludCwgaW50SGV4LCBpbnRPY3QgfTtcbiIsImltcG9ydCB7IG1hcCB9IGZyb20gJy4uL2NvbW1vbi9tYXAuanMnO1xuaW1wb3J0IHsgbnVsbFRhZyB9IGZyb20gJy4uL2NvbW1vbi9udWxsLmpzJztcbmltcG9ydCB7IHNlcSB9IGZyb20gJy4uL2NvbW1vbi9zZXEuanMnO1xuaW1wb3J0IHsgc3RyaW5nIH0gZnJvbSAnLi4vY29tbW9uL3N0cmluZy5qcyc7XG5pbXBvcnQgeyBib29sVGFnIH0gZnJvbSAnLi9ib29sLmpzJztcbmltcG9ydCB7IGZsb2F0TmFOLCBmbG9hdEV4cCwgZmxvYXQgfSBmcm9tICcuL2Zsb2F0LmpzJztcbmltcG9ydCB7IGludE9jdCwgaW50LCBpbnRIZXggfSBmcm9tICcuL2ludC5qcyc7XG5cbmNvbnN0IHNjaGVtYSA9IFtcbiAgICBtYXAsXG4gICAgc2VxLFxuICAgIHN0cmluZyxcbiAgICBudWxsVGFnLFxuICAgIGJvb2xUYWcsXG4gICAgaW50T2N0LFxuICAgIGludCxcbiAgICBpbnRIZXgsXG4gICAgZmxvYXROYU4sXG4gICAgZmxvYXRFeHAsXG4gICAgZmxvYXRcbl07XG5cbmV4cG9ydCB7IHNjaGVtYSB9O1xuIiwiaW1wb3J0IHsgU2NhbGFyIH0gZnJvbSAnLi4vLi4vbm9kZXMvU2NhbGFyLmpzJztcbmltcG9ydCB7IG1hcCB9IGZyb20gJy4uL2NvbW1vbi9tYXAuanMnO1xuaW1wb3J0IHsgc2VxIH0gZnJvbSAnLi4vY29tbW9uL3NlcS5qcyc7XG5cbmZ1bmN0aW9uIGludElkZW50aWZ5KHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2JpZ2ludCcgfHwgTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSk7XG59XG5jb25zdCBzdHJpbmdpZnlKU09OID0gKHsgdmFsdWUgfSkgPT4gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuY29uc3QganNvblNjYWxhcnMgPSBbXG4gICAge1xuICAgICAgICBpZGVudGlmeTogdmFsdWUgPT4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyxcbiAgICAgICAgZGVmYXVsdDogdHJ1ZSxcbiAgICAgICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6c3RyJyxcbiAgICAgICAgcmVzb2x2ZTogc3RyID0+IHN0cixcbiAgICAgICAgc3RyaW5naWZ5OiBzdHJpbmdpZnlKU09OXG4gICAgfSxcbiAgICB7XG4gICAgICAgIGlkZW50aWZ5OiB2YWx1ZSA9PiB2YWx1ZSA9PSBudWxsLFxuICAgICAgICBjcmVhdGVOb2RlOiAoKSA9PiBuZXcgU2NhbGFyKG51bGwpLFxuICAgICAgICBkZWZhdWx0OiB0cnVlLFxuICAgICAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjpudWxsJyxcbiAgICAgICAgdGVzdDogL15udWxsJC8sXG4gICAgICAgIHJlc29sdmU6ICgpID0+IG51bGwsXG4gICAgICAgIHN0cmluZ2lmeTogc3RyaW5naWZ5SlNPTlxuICAgIH0sXG4gICAge1xuICAgICAgICBpZGVudGlmeTogdmFsdWUgPT4gdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOmJvb2wnLFxuICAgICAgICB0ZXN0OiAvXnRydWUkfF5mYWxzZSQvLFxuICAgICAgICByZXNvbHZlOiBzdHIgPT4gc3RyID09PSAndHJ1ZScsXG4gICAgICAgIHN0cmluZ2lmeTogc3RyaW5naWZ5SlNPTlxuICAgIH0sXG4gICAge1xuICAgICAgICBpZGVudGlmeTogaW50SWRlbnRpZnksXG4gICAgICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOmludCcsXG4gICAgICAgIHRlc3Q6IC9eLT8oPzowfFsxLTldWzAtOV0qKSQvLFxuICAgICAgICByZXNvbHZlOiAoc3RyLCBfb25FcnJvciwgeyBpbnRBc0JpZ0ludCB9KSA9PiBpbnRBc0JpZ0ludCA/IEJpZ0ludChzdHIpIDogcGFyc2VJbnQoc3RyLCAxMCksXG4gICAgICAgIHN0cmluZ2lmeTogKHsgdmFsdWUgfSkgPT4gaW50SWRlbnRpZnkodmFsdWUpID8gdmFsdWUudG9TdHJpbmcoKSA6IEpTT04uc3RyaW5naWZ5KHZhbHVlKVxuICAgIH0sXG4gICAge1xuICAgICAgICBpZGVudGlmeTogdmFsdWUgPT4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyxcbiAgICAgICAgZGVmYXVsdDogdHJ1ZSxcbiAgICAgICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6ZmxvYXQnLFxuICAgICAgICB0ZXN0OiAvXi0/KD86MHxbMS05XVswLTldKikoPzpcXC5bMC05XSopPyg/OltlRV1bLStdP1swLTldKyk/JC8sXG4gICAgICAgIHJlc29sdmU6IHN0ciA9PiBwYXJzZUZsb2F0KHN0ciksXG4gICAgICAgIHN0cmluZ2lmeTogc3RyaW5naWZ5SlNPTlxuICAgIH1cbl07XG5jb25zdCBqc29uRXJyb3IgPSB7XG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgICB0YWc6ICcnLFxuICAgIHRlc3Q6IC9eLyxcbiAgICByZXNvbHZlKHN0ciwgb25FcnJvcikge1xuICAgICAgICBvbkVycm9yKGBVbnJlc29sdmVkIHBsYWluIHNjYWxhciAke0pTT04uc3RyaW5naWZ5KHN0cil9YCk7XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxufTtcbmNvbnN0IHNjaGVtYSA9IFttYXAsIHNlcV0uY29uY2F0KGpzb25TY2FsYXJzLCBqc29uRXJyb3IpO1xuXG5leHBvcnQgeyBzY2hlbWEgfTtcbiIsImltcG9ydCB7IFNjYWxhciB9IGZyb20gJy4uLy4uL25vZGVzL1NjYWxhci5qcyc7XG5pbXBvcnQgeyBzdHJpbmdpZnlTdHJpbmcgfSBmcm9tICcuLi8uLi9zdHJpbmdpZnkvc3RyaW5naWZ5U3RyaW5nLmpzJztcblxuY29uc3QgYmluYXJ5ID0ge1xuICAgIGlkZW50aWZ5OiB2YWx1ZSA9PiB2YWx1ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXksIC8vIEJ1ZmZlciBpbmhlcml0cyBmcm9tIFVpbnQ4QXJyYXlcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjpiaW5hcnknLFxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBCdWZmZXIgaW4gbm9kZSBhbmQgYW4gVWludDhBcnJheSBpbiBicm93c2Vyc1xuICAgICAqXG4gICAgICogVG8gdXNlIHRoZSByZXN1bHRpbmcgYnVmZmVyIGFzIGFuIGltYWdlLCB5b3UnbGwgd2FudCB0byBkbyBzb21ldGhpbmcgbGlrZTpcbiAgICAgKlxuICAgICAqICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtidWZmZXJdLCB7IHR5cGU6ICdpbWFnZS9qcGVnJyB9KVxuICAgICAqICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3Bob3RvJykuc3JjID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKVxuICAgICAqL1xuICAgIHJlc29sdmUoc3JjLCBvbkVycm9yKSB7XG4gICAgICAgIGlmICh0eXBlb2YgYXRvYiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgLy8gT24gSUUgMTEsIGF0b2IoKSBjYW4ndCBoYW5kbGUgbmV3bGluZXNcbiAgICAgICAgICAgIGNvbnN0IHN0ciA9IGF0b2Ioc3JjLnJlcGxhY2UoL1tcXG5cXHJdL2csICcnKSk7XG4gICAgICAgICAgICBjb25zdCBidWZmZXIgPSBuZXcgVWludDhBcnJheShzdHIubGVuZ3RoKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKVxuICAgICAgICAgICAgICAgIGJ1ZmZlcltpXSA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG9uRXJyb3IoJ1RoaXMgZW52aXJvbm1lbnQgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nIGJpbmFyeSB0YWdzOyBlaXRoZXIgQnVmZmVyIG9yIGF0b2IgaXMgcmVxdWlyZWQnKTtcbiAgICAgICAgICAgIHJldHVybiBzcmM7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIHN0cmluZ2lmeSh7IGNvbW1lbnQsIHR5cGUsIHZhbHVlIH0sIGN0eCwgb25Db21tZW50LCBvbkNob21wS2VlcCkge1xuICAgICAgICBpZiAoIXZhbHVlKVxuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICBjb25zdCBidWYgPSB2YWx1ZTsgLy8gY2hlY2tlZCBlYXJsaWVyIGJ5IGJpbmFyeS5pZGVudGlmeSgpXG4gICAgICAgIGxldCBzdHI7XG4gICAgICAgIGlmICh0eXBlb2YgYnRvYSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgbGV0IHMgPSAnJztcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnVmLmxlbmd0aDsgKytpKVxuICAgICAgICAgICAgICAgIHMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0pO1xuICAgICAgICAgICAgc3RyID0gYnRvYShzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBlbnZpcm9ubWVudCBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgYmluYXJ5IHRhZ3M7IGVpdGhlciBCdWZmZXIgb3IgYnRvYSBpcyByZXF1aXJlZCcpO1xuICAgICAgICB9XG4gICAgICAgIHR5cGUgPz8gKHR5cGUgPSBTY2FsYXIuQkxPQ0tfTElURVJBTCk7XG4gICAgICAgIGlmICh0eXBlICE9PSBTY2FsYXIuUVVPVEVfRE9VQkxFKSB7XG4gICAgICAgICAgICBjb25zdCBsaW5lV2lkdGggPSBNYXRoLm1heChjdHgub3B0aW9ucy5saW5lV2lkdGggLSBjdHguaW5kZW50Lmxlbmd0aCwgY3R4Lm9wdGlvbnMubWluQ29udGVudFdpZHRoKTtcbiAgICAgICAgICAgIGNvbnN0IG4gPSBNYXRoLmNlaWwoc3RyLmxlbmd0aCAvIGxpbmVXaWR0aCk7XG4gICAgICAgICAgICBjb25zdCBsaW5lcyA9IG5ldyBBcnJheShuKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBvID0gMDsgaSA8IG47ICsraSwgbyArPSBsaW5lV2lkdGgpIHtcbiAgICAgICAgICAgICAgICBsaW5lc1tpXSA9IHN0ci5zdWJzdHIobywgbGluZVdpZHRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0ciA9IGxpbmVzLmpvaW4odHlwZSA9PT0gU2NhbGFyLkJMT0NLX0xJVEVSQUwgPyAnXFxuJyA6ICcgJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0cmluZ2lmeVN0cmluZyh7IGNvbW1lbnQsIHR5cGUsIHZhbHVlOiBzdHIgfSwgY3R4LCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKTtcbiAgICB9XG59O1xuXG5leHBvcnQgeyBiaW5hcnkgfTtcbiIsImltcG9ydCB7IGlzU2VxLCBpc1BhaXIsIGlzTWFwIH0gZnJvbSAnLi4vLi4vbm9kZXMvaWRlbnRpdHkuanMnO1xuaW1wb3J0IHsgY3JlYXRlUGFpciwgUGFpciB9IGZyb20gJy4uLy4uL25vZGVzL1BhaXIuanMnO1xuaW1wb3J0IHsgU2NhbGFyIH0gZnJvbSAnLi4vLi4vbm9kZXMvU2NhbGFyLmpzJztcbmltcG9ydCB7IFlBTUxTZXEgfSBmcm9tICcuLi8uLi9ub2Rlcy9ZQU1MU2VxLmpzJztcblxuZnVuY3Rpb24gcmVzb2x2ZVBhaXJzKHNlcSwgb25FcnJvcikge1xuICAgIGlmIChpc1NlcShzZXEpKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VxLml0ZW1zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBsZXQgaXRlbSA9IHNlcS5pdGVtc1tpXTtcbiAgICAgICAgICAgIGlmIChpc1BhaXIoaXRlbSkpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBlbHNlIGlmIChpc01hcChpdGVtKSkge1xuICAgICAgICAgICAgICAgIGlmIChpdGVtLml0ZW1zLmxlbmd0aCA+IDEpXG4gICAgICAgICAgICAgICAgICAgIG9uRXJyb3IoJ0VhY2ggcGFpciBtdXN0IGhhdmUgaXRzIG93biBzZXF1ZW5jZSBpbmRpY2F0b3InKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwYWlyID0gaXRlbS5pdGVtc1swXSB8fCBuZXcgUGFpcihuZXcgU2NhbGFyKG51bGwpKTtcbiAgICAgICAgICAgICAgICBpZiAoaXRlbS5jb21tZW50QmVmb3JlKVxuICAgICAgICAgICAgICAgICAgICBwYWlyLmtleS5jb21tZW50QmVmb3JlID0gcGFpci5rZXkuY29tbWVudEJlZm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBgJHtpdGVtLmNvbW1lbnRCZWZvcmV9XFxuJHtwYWlyLmtleS5jb21tZW50QmVmb3JlfWBcbiAgICAgICAgICAgICAgICAgICAgICAgIDogaXRlbS5jb21tZW50QmVmb3JlO1xuICAgICAgICAgICAgICAgIGlmIChpdGVtLmNvbW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY24gPSBwYWlyLnZhbHVlID8/IHBhaXIua2V5O1xuICAgICAgICAgICAgICAgICAgICBjbi5jb21tZW50ID0gY24uY29tbWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBgJHtpdGVtLmNvbW1lbnR9XFxuJHtjbi5jb21tZW50fWBcbiAgICAgICAgICAgICAgICAgICAgICAgIDogaXRlbS5jb21tZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpdGVtID0gcGFpcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNlcS5pdGVtc1tpXSA9IGlzUGFpcihpdGVtKSA/IGl0ZW0gOiBuZXcgUGFpcihpdGVtKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlXG4gICAgICAgIG9uRXJyb3IoJ0V4cGVjdGVkIGEgc2VxdWVuY2UgZm9yIHRoaXMgdGFnJyk7XG4gICAgcmV0dXJuIHNlcTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVBhaXJzKHNjaGVtYSwgaXRlcmFibGUsIGN0eCkge1xuICAgIGNvbnN0IHsgcmVwbGFjZXIgfSA9IGN0eDtcbiAgICBjb25zdCBwYWlycyA9IG5ldyBZQU1MU2VxKHNjaGVtYSk7XG4gICAgcGFpcnMudGFnID0gJ3RhZzp5YW1sLm9yZywyMDAyOnBhaXJzJztcbiAgICBsZXQgaSA9IDA7XG4gICAgaWYgKGl0ZXJhYmxlICYmIFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoaXRlcmFibGUpKVxuICAgICAgICBmb3IgKGxldCBpdCBvZiBpdGVyYWJsZSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiByZXBsYWNlciA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgICAgICBpdCA9IHJlcGxhY2VyLmNhbGwoaXRlcmFibGUsIFN0cmluZyhpKyspLCBpdCk7XG4gICAgICAgICAgICBsZXQga2V5LCB2YWx1ZTtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGl0KSkge1xuICAgICAgICAgICAgICAgIGlmIChpdC5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAga2V5ID0gaXRbMF07XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gaXRbMV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgW2tleSwgdmFsdWVdIHR1cGxlOiAke2l0fWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXQgJiYgaXQgaW5zdGFuY2VvZiBPYmplY3QpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoaXQpO1xuICAgICAgICAgICAgICAgIGlmIChrZXlzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICBrZXkgPSBrZXlzWzBdO1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGl0W2tleV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCB0dXBsZSB3aXRoIG9uZSBrZXksIG5vdCAke2tleXMubGVuZ3RofSBrZXlzYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAga2V5ID0gaXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYWlycy5pdGVtcy5wdXNoKGNyZWF0ZVBhaXIoa2V5LCB2YWx1ZSwgY3R4KSk7XG4gICAgICAgIH1cbiAgICByZXR1cm4gcGFpcnM7XG59XG5jb25zdCBwYWlycyA9IHtcbiAgICBjb2xsZWN0aW9uOiAnc2VxJyxcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjpwYWlycycsXG4gICAgcmVzb2x2ZTogcmVzb2x2ZVBhaXJzLFxuICAgIGNyZWF0ZU5vZGU6IGNyZWF0ZVBhaXJzXG59O1xuXG5leHBvcnQgeyBjcmVhdGVQYWlycywgcGFpcnMsIHJlc29sdmVQYWlycyB9O1xuIiwiaW1wb3J0IHsgaXNTY2FsYXIsIGlzUGFpciB9IGZyb20gJy4uLy4uL25vZGVzL2lkZW50aXR5LmpzJztcbmltcG9ydCB7IHRvSlMgfSBmcm9tICcuLi8uLi9ub2Rlcy90b0pTLmpzJztcbmltcG9ydCB7IFlBTUxNYXAgfSBmcm9tICcuLi8uLi9ub2Rlcy9ZQU1MTWFwLmpzJztcbmltcG9ydCB7IFlBTUxTZXEgfSBmcm9tICcuLi8uLi9ub2Rlcy9ZQU1MU2VxLmpzJztcbmltcG9ydCB7IHJlc29sdmVQYWlycywgY3JlYXRlUGFpcnMgfSBmcm9tICcuL3BhaXJzLmpzJztcblxuY2xhc3MgWUFNTE9NYXAgZXh0ZW5kcyBZQU1MU2VxIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5hZGQgPSBZQU1MTWFwLnByb3RvdHlwZS5hZGQuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5kZWxldGUgPSBZQU1MTWFwLnByb3RvdHlwZS5kZWxldGUuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5nZXQgPSBZQU1MTWFwLnByb3RvdHlwZS5nZXQuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5oYXMgPSBZQU1MTWFwLnByb3RvdHlwZS5oYXMuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5zZXQgPSBZQU1MTWFwLnByb3RvdHlwZS5zZXQuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy50YWcgPSBZQU1MT01hcC50YWc7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIElmIGBjdHhgIGlzIGdpdmVuLCB0aGUgcmV0dXJuIHR5cGUgaXMgYWN0dWFsbHkgYE1hcDx1bmtub3duLCB1bmtub3duPmAsXG4gICAgICogYnV0IFR5cGVTY3JpcHQgd29uJ3QgYWxsb3cgd2lkZW5pbmcgdGhlIHNpZ25hdHVyZSBvZiBhIGNoaWxkIG1ldGhvZC5cbiAgICAgKi9cbiAgICB0b0pTT04oXywgY3R4KSB7XG4gICAgICAgIGlmICghY3R4KVxuICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnRvSlNPTihfKTtcbiAgICAgICAgY29uc3QgbWFwID0gbmV3IE1hcCgpO1xuICAgICAgICBpZiAoY3R4Py5vbkNyZWF0ZSlcbiAgICAgICAgICAgIGN0eC5vbkNyZWF0ZShtYXApO1xuICAgICAgICBmb3IgKGNvbnN0IHBhaXIgb2YgdGhpcy5pdGVtcykge1xuICAgICAgICAgICAgbGV0IGtleSwgdmFsdWU7XG4gICAgICAgICAgICBpZiAoaXNQYWlyKHBhaXIpKSB7XG4gICAgICAgICAgICAgICAga2V5ID0gdG9KUyhwYWlyLmtleSwgJycsIGN0eCk7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB0b0pTKHBhaXIudmFsdWUsIGtleSwgY3R4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGtleSA9IHRvSlMocGFpciwgJycsIGN0eCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWFwLmhhcyhrZXkpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignT3JkZXJlZCBtYXBzIG11c3Qgbm90IGluY2x1ZGUgZHVwbGljYXRlIGtleXMnKTtcbiAgICAgICAgICAgIG1hcC5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1hcDtcbiAgICB9XG4gICAgc3RhdGljIGZyb20oc2NoZW1hLCBpdGVyYWJsZSwgY3R4KSB7XG4gICAgICAgIGNvbnN0IHBhaXJzID0gY3JlYXRlUGFpcnMoc2NoZW1hLCBpdGVyYWJsZSwgY3R4KTtcbiAgICAgICAgY29uc3Qgb21hcCA9IG5ldyB0aGlzKCk7XG4gICAgICAgIG9tYXAuaXRlbXMgPSBwYWlycy5pdGVtcztcbiAgICAgICAgcmV0dXJuIG9tYXA7XG4gICAgfVxufVxuWUFNTE9NYXAudGFnID0gJ3RhZzp5YW1sLm9yZywyMDAyOm9tYXAnO1xuY29uc3Qgb21hcCA9IHtcbiAgICBjb2xsZWN0aW9uOiAnc2VxJyxcbiAgICBpZGVudGlmeTogdmFsdWUgPT4gdmFsdWUgaW5zdGFuY2VvZiBNYXAsXG4gICAgbm9kZUNsYXNzOiBZQU1MT01hcCxcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjpvbWFwJyxcbiAgICByZXNvbHZlKHNlcSwgb25FcnJvcikge1xuICAgICAgICBjb25zdCBwYWlycyA9IHJlc29sdmVQYWlycyhzZXEsIG9uRXJyb3IpO1xuICAgICAgICBjb25zdCBzZWVuS2V5cyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHsga2V5IH0gb2YgcGFpcnMuaXRlbXMpIHtcbiAgICAgICAgICAgIGlmIChpc1NjYWxhcihrZXkpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNlZW5LZXlzLmluY2x1ZGVzKGtleS52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgb25FcnJvcihgT3JkZXJlZCBtYXBzIG11c3Qgbm90IGluY2x1ZGUgZHVwbGljYXRlIGtleXM6ICR7a2V5LnZhbHVlfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc2VlbktleXMucHVzaChrZXkudmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihuZXcgWUFNTE9NYXAoKSwgcGFpcnMpO1xuICAgIH0sXG4gICAgY3JlYXRlTm9kZTogKHNjaGVtYSwgaXRlcmFibGUsIGN0eCkgPT4gWUFNTE9NYXAuZnJvbShzY2hlbWEsIGl0ZXJhYmxlLCBjdHgpXG59O1xuXG5leHBvcnQgeyBZQU1MT01hcCwgb21hcCB9O1xuIiwiaW1wb3J0IHsgU2NhbGFyIH0gZnJvbSAnLi4vLi4vbm9kZXMvU2NhbGFyLmpzJztcblxuZnVuY3Rpb24gYm9vbFN0cmluZ2lmeSh7IHZhbHVlLCBzb3VyY2UgfSwgY3R4KSB7XG4gICAgY29uc3QgYm9vbE9iaiA9IHZhbHVlID8gdHJ1ZVRhZyA6IGZhbHNlVGFnO1xuICAgIGlmIChzb3VyY2UgJiYgYm9vbE9iai50ZXN0LnRlc3Qoc291cmNlKSlcbiAgICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICByZXR1cm4gdmFsdWUgPyBjdHgub3B0aW9ucy50cnVlU3RyIDogY3R4Lm9wdGlvbnMuZmFsc2VTdHI7XG59XG5jb25zdCB0cnVlVGFnID0ge1xuICAgIGlkZW50aWZ5OiB2YWx1ZSA9PiB2YWx1ZSA9PT0gdHJ1ZSxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOmJvb2wnLFxuICAgIHRlc3Q6IC9eKD86WXx5fFtZeV1lc3xZRVN8W1R0XXJ1ZXxUUlVFfFtPb11ufE9OKSQvLFxuICAgIHJlc29sdmU6ICgpID0+IG5ldyBTY2FsYXIodHJ1ZSksXG4gICAgc3RyaW5naWZ5OiBib29sU3RyaW5naWZ5XG59O1xuY29uc3QgZmFsc2VUYWcgPSB7XG4gICAgaWRlbnRpZnk6IHZhbHVlID0+IHZhbHVlID09PSBmYWxzZSxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOmJvb2wnLFxuICAgIHRlc3Q6IC9eKD86TnxufFtObl1vfE5PfFtGZl1hbHNlfEZBTFNFfFtPb11mZnxPRkYpJC8sXG4gICAgcmVzb2x2ZTogKCkgPT4gbmV3IFNjYWxhcihmYWxzZSksXG4gICAgc3RyaW5naWZ5OiBib29sU3RyaW5naWZ5XG59O1xuXG5leHBvcnQgeyBmYWxzZVRhZywgdHJ1ZVRhZyB9O1xuIiwiaW1wb3J0IHsgU2NhbGFyIH0gZnJvbSAnLi4vLi4vbm9kZXMvU2NhbGFyLmpzJztcbmltcG9ydCB7IHN0cmluZ2lmeU51bWJlciB9IGZyb20gJy4uLy4uL3N0cmluZ2lmeS9zdHJpbmdpZnlOdW1iZXIuanMnO1xuXG5jb25zdCBmbG9hdE5hTiA9IHtcbiAgICBpZGVudGlmeTogdmFsdWUgPT4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOmZsb2F0JyxcbiAgICB0ZXN0OiAvXig/OlstK10/XFwuKD86aW5mfEluZnxJTkYpfFxcLm5hbnxcXC5OYU58XFwuTkFOKSQvLFxuICAgIHJlc29sdmU6IChzdHIpID0+IHN0ci5zbGljZSgtMykudG9Mb3dlckNhc2UoKSA9PT0gJ25hbidcbiAgICAgICAgPyBOYU5cbiAgICAgICAgOiBzdHJbMF0gPT09ICctJ1xuICAgICAgICAgICAgPyBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFlcbiAgICAgICAgICAgIDogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLFxuICAgIHN0cmluZ2lmeTogc3RyaW5naWZ5TnVtYmVyXG59O1xuY29uc3QgZmxvYXRFeHAgPSB7XG4gICAgaWRlbnRpZnk6IHZhbHVlID0+IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjpmbG9hdCcsXG4gICAgZm9ybWF0OiAnRVhQJyxcbiAgICB0ZXN0OiAvXlstK10/KD86WzAtOV1bMC05X10qKT8oPzpcXC5bMC05X10qKT9bZUVdWy0rXT9bMC05XSskLyxcbiAgICByZXNvbHZlOiAoc3RyKSA9PiBwYXJzZUZsb2F0KHN0ci5yZXBsYWNlKC9fL2csICcnKSksXG4gICAgc3RyaW5naWZ5KG5vZGUpIHtcbiAgICAgICAgY29uc3QgbnVtID0gTnVtYmVyKG5vZGUudmFsdWUpO1xuICAgICAgICByZXR1cm4gaXNGaW5pdGUobnVtKSA/IG51bS50b0V4cG9uZW50aWFsKCkgOiBzdHJpbmdpZnlOdW1iZXIobm9kZSk7XG4gICAgfVxufTtcbmNvbnN0IGZsb2F0ID0ge1xuICAgIGlkZW50aWZ5OiB2YWx1ZSA9PiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6ZmxvYXQnLFxuICAgIHRlc3Q6IC9eWy0rXT8oPzpbMC05XVswLTlfXSopP1xcLlswLTlfXSokLyxcbiAgICByZXNvbHZlKHN0cikge1xuICAgICAgICBjb25zdCBub2RlID0gbmV3IFNjYWxhcihwYXJzZUZsb2F0KHN0ci5yZXBsYWNlKC9fL2csICcnKSkpO1xuICAgICAgICBjb25zdCBkb3QgPSBzdHIuaW5kZXhPZignLicpO1xuICAgICAgICBpZiAoZG90ICE9PSAtMSkge1xuICAgICAgICAgICAgY29uc3QgZiA9IHN0ci5zdWJzdHJpbmcoZG90ICsgMSkucmVwbGFjZSgvXy9nLCAnJyk7XG4gICAgICAgICAgICBpZiAoZltmLmxlbmd0aCAtIDFdID09PSAnMCcpXG4gICAgICAgICAgICAgICAgbm9kZS5taW5GcmFjdGlvbkRpZ2l0cyA9IGYubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH0sXG4gICAgc3RyaW5naWZ5OiBzdHJpbmdpZnlOdW1iZXJcbn07XG5cbmV4cG9ydCB7IGZsb2F0LCBmbG9hdEV4cCwgZmxvYXROYU4gfTtcbiIsImltcG9ydCB7IHN0cmluZ2lmeU51bWJlciB9IGZyb20gJy4uLy4uL3N0cmluZ2lmeS9zdHJpbmdpZnlOdW1iZXIuanMnO1xuXG5jb25zdCBpbnRJZGVudGlmeSA9ICh2YWx1ZSkgPT4gdHlwZW9mIHZhbHVlID09PSAnYmlnaW50JyB8fCBOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKTtcbmZ1bmN0aW9uIGludFJlc29sdmUoc3RyLCBvZmZzZXQsIHJhZGl4LCB7IGludEFzQmlnSW50IH0pIHtcbiAgICBjb25zdCBzaWduID0gc3RyWzBdO1xuICAgIGlmIChzaWduID09PSAnLScgfHwgc2lnbiA9PT0gJysnKVxuICAgICAgICBvZmZzZXQgKz0gMTtcbiAgICBzdHIgPSBzdHIuc3Vic3RyaW5nKG9mZnNldCkucmVwbGFjZSgvXy9nLCAnJyk7XG4gICAgaWYgKGludEFzQmlnSW50KSB7XG4gICAgICAgIHN3aXRjaCAocmFkaXgpIHtcbiAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICBzdHIgPSBgMGIke3N0cn1gO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgICAgIHN0ciA9IGAwbyR7c3RyfWA7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDE2OlxuICAgICAgICAgICAgICAgIHN0ciA9IGAweCR7c3RyfWA7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbiA9IEJpZ0ludChzdHIpO1xuICAgICAgICByZXR1cm4gc2lnbiA9PT0gJy0nID8gQmlnSW50KC0xKSAqIG4gOiBuO1xuICAgIH1cbiAgICBjb25zdCBuID0gcGFyc2VJbnQoc3RyLCByYWRpeCk7XG4gICAgcmV0dXJuIHNpZ24gPT09ICctJyA/IC0xICogbiA6IG47XG59XG5mdW5jdGlvbiBpbnRTdHJpbmdpZnkobm9kZSwgcmFkaXgsIHByZWZpeCkge1xuICAgIGNvbnN0IHsgdmFsdWUgfSA9IG5vZGU7XG4gICAgaWYgKGludElkZW50aWZ5KHZhbHVlKSkge1xuICAgICAgICBjb25zdCBzdHIgPSB2YWx1ZS50b1N0cmluZyhyYWRpeCk7XG4gICAgICAgIHJldHVybiB2YWx1ZSA8IDAgPyAnLScgKyBwcmVmaXggKyBzdHIuc3Vic3RyKDEpIDogcHJlZml4ICsgc3RyO1xuICAgIH1cbiAgICByZXR1cm4gc3RyaW5naWZ5TnVtYmVyKG5vZGUpO1xufVxuY29uc3QgaW50QmluID0ge1xuICAgIGlkZW50aWZ5OiBpbnRJZGVudGlmeSxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOmludCcsXG4gICAgZm9ybWF0OiAnQklOJyxcbiAgICB0ZXN0OiAvXlstK10/MGJbMC0xX10rJC8sXG4gICAgcmVzb2x2ZTogKHN0ciwgX29uRXJyb3IsIG9wdCkgPT4gaW50UmVzb2x2ZShzdHIsIDIsIDIsIG9wdCksXG4gICAgc3RyaW5naWZ5OiBub2RlID0+IGludFN0cmluZ2lmeShub2RlLCAyLCAnMGInKVxufTtcbmNvbnN0IGludE9jdCA9IHtcbiAgICBpZGVudGlmeTogaW50SWRlbnRpZnksXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjppbnQnLFxuICAgIGZvcm1hdDogJ09DVCcsXG4gICAgdGVzdDogL15bLStdPzBbMC03X10rJC8sXG4gICAgcmVzb2x2ZTogKHN0ciwgX29uRXJyb3IsIG9wdCkgPT4gaW50UmVzb2x2ZShzdHIsIDEsIDgsIG9wdCksXG4gICAgc3RyaW5naWZ5OiBub2RlID0+IGludFN0cmluZ2lmeShub2RlLCA4LCAnMCcpXG59O1xuY29uc3QgaW50ID0ge1xuICAgIGlkZW50aWZ5OiBpbnRJZGVudGlmeSxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOmludCcsXG4gICAgdGVzdDogL15bLStdP1swLTldWzAtOV9dKiQvLFxuICAgIHJlc29sdmU6IChzdHIsIF9vbkVycm9yLCBvcHQpID0+IGludFJlc29sdmUoc3RyLCAwLCAxMCwgb3B0KSxcbiAgICBzdHJpbmdpZnk6IHN0cmluZ2lmeU51bWJlclxufTtcbmNvbnN0IGludEhleCA9IHtcbiAgICBpZGVudGlmeTogaW50SWRlbnRpZnksXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjppbnQnLFxuICAgIGZvcm1hdDogJ0hFWCcsXG4gICAgdGVzdDogL15bLStdPzB4WzAtOWEtZkEtRl9dKyQvLFxuICAgIHJlc29sdmU6IChzdHIsIF9vbkVycm9yLCBvcHQpID0+IGludFJlc29sdmUoc3RyLCAyLCAxNiwgb3B0KSxcbiAgICBzdHJpbmdpZnk6IG5vZGUgPT4gaW50U3RyaW5naWZ5KG5vZGUsIDE2LCAnMHgnKVxufTtcblxuZXhwb3J0IHsgaW50LCBpbnRCaW4sIGludEhleCwgaW50T2N0IH07XG4iLCJpbXBvcnQgeyBpc01hcCwgaXNQYWlyLCBpc1NjYWxhciB9IGZyb20gJy4uLy4uL25vZGVzL2lkZW50aXR5LmpzJztcbmltcG9ydCB7IFBhaXIsIGNyZWF0ZVBhaXIgfSBmcm9tICcuLi8uLi9ub2Rlcy9QYWlyLmpzJztcbmltcG9ydCB7IFlBTUxNYXAsIGZpbmRQYWlyIH0gZnJvbSAnLi4vLi4vbm9kZXMvWUFNTE1hcC5qcyc7XG5cbmNsYXNzIFlBTUxTZXQgZXh0ZW5kcyBZQU1MTWFwIHtcbiAgICBjb25zdHJ1Y3RvcihzY2hlbWEpIHtcbiAgICAgICAgc3VwZXIoc2NoZW1hKTtcbiAgICAgICAgdGhpcy50YWcgPSBZQU1MU2V0LnRhZztcbiAgICB9XG4gICAgYWRkKGtleSkge1xuICAgICAgICBsZXQgcGFpcjtcbiAgICAgICAgaWYgKGlzUGFpcihrZXkpKVxuICAgICAgICAgICAgcGFpciA9IGtleTtcbiAgICAgICAgZWxzZSBpZiAoa2V5ICYmXG4gICAgICAgICAgICB0eXBlb2Yga2V5ID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgJ2tleScgaW4ga2V5ICYmXG4gICAgICAgICAgICAndmFsdWUnIGluIGtleSAmJlxuICAgICAgICAgICAga2V5LnZhbHVlID09PSBudWxsKVxuICAgICAgICAgICAgcGFpciA9IG5ldyBQYWlyKGtleS5rZXksIG51bGwpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBwYWlyID0gbmV3IFBhaXIoa2V5LCBudWxsKTtcbiAgICAgICAgY29uc3QgcHJldiA9IGZpbmRQYWlyKHRoaXMuaXRlbXMsIHBhaXIua2V5KTtcbiAgICAgICAgaWYgKCFwcmV2KVxuICAgICAgICAgICAgdGhpcy5pdGVtcy5wdXNoKHBhaXIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJZiBga2VlcFBhaXJgIGlzIGB0cnVlYCwgcmV0dXJucyB0aGUgUGFpciBtYXRjaGluZyBga2V5YC5cbiAgICAgKiBPdGhlcndpc2UsIHJldHVybnMgdGhlIHZhbHVlIG9mIHRoYXQgUGFpcidzIGtleS5cbiAgICAgKi9cbiAgICBnZXQoa2V5LCBrZWVwUGFpcikge1xuICAgICAgICBjb25zdCBwYWlyID0gZmluZFBhaXIodGhpcy5pdGVtcywga2V5KTtcbiAgICAgICAgcmV0dXJuICFrZWVwUGFpciAmJiBpc1BhaXIocGFpcilcbiAgICAgICAgICAgID8gaXNTY2FsYXIocGFpci5rZXkpXG4gICAgICAgICAgICAgICAgPyBwYWlyLmtleS52YWx1ZVxuICAgICAgICAgICAgICAgIDogcGFpci5rZXlcbiAgICAgICAgICAgIDogcGFpcjtcbiAgICB9XG4gICAgc2V0KGtleSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ2Jvb2xlYW4nKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBib29sZWFuIHZhbHVlIGZvciBzZXQoa2V5LCB2YWx1ZSkgaW4gYSBZQU1MIHNldCwgbm90ICR7dHlwZW9mIHZhbHVlfWApO1xuICAgICAgICBjb25zdCBwcmV2ID0gZmluZFBhaXIodGhpcy5pdGVtcywga2V5KTtcbiAgICAgICAgaWYgKHByZXYgJiYgIXZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLml0ZW1zLnNwbGljZSh0aGlzLml0ZW1zLmluZGV4T2YocHJldiksIDEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCFwcmV2ICYmIHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLml0ZW1zLnB1c2gobmV3IFBhaXIoa2V5KSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdG9KU09OKF8sIGN0eCkge1xuICAgICAgICByZXR1cm4gc3VwZXIudG9KU09OKF8sIGN0eCwgU2V0KTtcbiAgICB9XG4gICAgdG9TdHJpbmcoY3R4LCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKSB7XG4gICAgICAgIGlmICghY3R4KVxuICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMpO1xuICAgICAgICBpZiAodGhpcy5oYXNBbGxOdWxsVmFsdWVzKHRydWUpKVxuICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKE9iamVjdC5hc3NpZ24oe30sIGN0eCwgeyBhbGxOdWxsVmFsdWVzOiB0cnVlIH0pLCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTZXQgaXRlbXMgbXVzdCBhbGwgaGF2ZSBudWxsIHZhbHVlcycpO1xuICAgIH1cbiAgICBzdGF0aWMgZnJvbShzY2hlbWEsIGl0ZXJhYmxlLCBjdHgpIHtcbiAgICAgICAgY29uc3QgeyByZXBsYWNlciB9ID0gY3R4O1xuICAgICAgICBjb25zdCBzZXQgPSBuZXcgdGhpcyhzY2hlbWEpO1xuICAgICAgICBpZiAoaXRlcmFibGUgJiYgU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChpdGVyYWJsZSkpXG4gICAgICAgICAgICBmb3IgKGxldCB2YWx1ZSBvZiBpdGVyYWJsZSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVwbGFjZXIgPT09ICdmdW5jdGlvbicpXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gcmVwbGFjZXIuY2FsbChpdGVyYWJsZSwgdmFsdWUsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBzZXQuaXRlbXMucHVzaChjcmVhdGVQYWlyKHZhbHVlLCBudWxsLCBjdHgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNldDtcbiAgICB9XG59XG5ZQU1MU2V0LnRhZyA9ICd0YWc6eWFtbC5vcmcsMjAwMjpzZXQnO1xuY29uc3Qgc2V0ID0ge1xuICAgIGNvbGxlY3Rpb246ICdtYXAnLFxuICAgIGlkZW50aWZ5OiB2YWx1ZSA9PiB2YWx1ZSBpbnN0YW5jZW9mIFNldCxcbiAgICBub2RlQ2xhc3M6IFlBTUxTZXQsXG4gICAgZGVmYXVsdDogZmFsc2UsXG4gICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6c2V0JyxcbiAgICBjcmVhdGVOb2RlOiAoc2NoZW1hLCBpdGVyYWJsZSwgY3R4KSA9PiBZQU1MU2V0LmZyb20oc2NoZW1hLCBpdGVyYWJsZSwgY3R4KSxcbiAgICByZXNvbHZlKG1hcCwgb25FcnJvcikge1xuICAgICAgICBpZiAoaXNNYXAobWFwKSkge1xuICAgICAgICAgICAgaWYgKG1hcC5oYXNBbGxOdWxsVmFsdWVzKHRydWUpKVxuICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKG5ldyBZQU1MU2V0KCksIG1hcCk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgb25FcnJvcignU2V0IGl0ZW1zIG11c3QgYWxsIGhhdmUgbnVsbCB2YWx1ZXMnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBvbkVycm9yKCdFeHBlY3RlZCBhIG1hcHBpbmcgZm9yIHRoaXMgdGFnJyk7XG4gICAgICAgIHJldHVybiBtYXA7XG4gICAgfVxufTtcblxuZXhwb3J0IHsgWUFNTFNldCwgc2V0IH07XG4iLCJpbXBvcnQgeyBzdHJpbmdpZnlOdW1iZXIgfSBmcm9tICcuLi8uLi9zdHJpbmdpZnkvc3RyaW5naWZ5TnVtYmVyLmpzJztcblxuLyoqIEludGVybmFsIHR5cGVzIGhhbmRsZSBiaWdpbnQgYXMgbnVtYmVyLCBiZWNhdXNlIFRTIGNhbid0IGZpZ3VyZSBpdCBvdXQuICovXG5mdW5jdGlvbiBwYXJzZVNleGFnZXNpbWFsKHN0ciwgYXNCaWdJbnQpIHtcbiAgICBjb25zdCBzaWduID0gc3RyWzBdO1xuICAgIGNvbnN0IHBhcnRzID0gc2lnbiA9PT0gJy0nIHx8IHNpZ24gPT09ICcrJyA/IHN0ci5zdWJzdHJpbmcoMSkgOiBzdHI7XG4gICAgY29uc3QgbnVtID0gKG4pID0+IGFzQmlnSW50ID8gQmlnSW50KG4pIDogTnVtYmVyKG4pO1xuICAgIGNvbnN0IHJlcyA9IHBhcnRzXG4gICAgICAgIC5yZXBsYWNlKC9fL2csICcnKVxuICAgICAgICAuc3BsaXQoJzonKVxuICAgICAgICAucmVkdWNlKChyZXMsIHApID0+IHJlcyAqIG51bSg2MCkgKyBudW0ocCksIG51bSgwKSk7XG4gICAgcmV0dXJuIChzaWduID09PSAnLScgPyBudW0oLTEpICogcmVzIDogcmVzKTtcbn1cbi8qKlxuICogaGhoaDptbTpzcy5zc3NcbiAqXG4gKiBJbnRlcm5hbCB0eXBlcyBoYW5kbGUgYmlnaW50IGFzIG51bWJlciwgYmVjYXVzZSBUUyBjYW4ndCBmaWd1cmUgaXQgb3V0LlxuICovXG5mdW5jdGlvbiBzdHJpbmdpZnlTZXhhZ2VzaW1hbChub2RlKSB7XG4gICAgbGV0IHsgdmFsdWUgfSA9IG5vZGU7XG4gICAgbGV0IG51bSA9IChuKSA9PiBuO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdiaWdpbnQnKVxuICAgICAgICBudW0gPSBuID0+IEJpZ0ludChuKTtcbiAgICBlbHNlIGlmIChpc05hTih2YWx1ZSkgfHwgIWlzRmluaXRlKHZhbHVlKSlcbiAgICAgICAgcmV0dXJuIHN0cmluZ2lmeU51bWJlcihub2RlKTtcbiAgICBsZXQgc2lnbiA9ICcnO1xuICAgIGlmICh2YWx1ZSA8IDApIHtcbiAgICAgICAgc2lnbiA9ICctJztcbiAgICAgICAgdmFsdWUgKj0gbnVtKC0xKTtcbiAgICB9XG4gICAgY29uc3QgXzYwID0gbnVtKDYwKTtcbiAgICBjb25zdCBwYXJ0cyA9IFt2YWx1ZSAlIF82MF07IC8vIHNlY29uZHMsIGluY2x1ZGluZyBtc1xuICAgIGlmICh2YWx1ZSA8IDYwKSB7XG4gICAgICAgIHBhcnRzLnVuc2hpZnQoMCk7IC8vIGF0IGxlYXN0IG9uZSA6IGlzIHJlcXVpcmVkXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB2YWx1ZSA9ICh2YWx1ZSAtIHBhcnRzWzBdKSAvIF82MDtcbiAgICAgICAgcGFydHMudW5zaGlmdCh2YWx1ZSAlIF82MCk7IC8vIG1pbnV0ZXNcbiAgICAgICAgaWYgKHZhbHVlID49IDYwKSB7XG4gICAgICAgICAgICB2YWx1ZSA9ICh2YWx1ZSAtIHBhcnRzWzBdKSAvIF82MDtcbiAgICAgICAgICAgIHBhcnRzLnVuc2hpZnQodmFsdWUpOyAvLyBob3Vyc1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiAoc2lnbiArXG4gICAgICAgIHBhcnRzXG4gICAgICAgICAgICAubWFwKG4gPT4gU3RyaW5nKG4pLnBhZFN0YXJ0KDIsICcwJykpXG4gICAgICAgICAgICAuam9pbignOicpXG4gICAgICAgICAgICAucmVwbGFjZSgvMDAwMDAwXFxkKiQvLCAnJykgLy8gJSA2MCBtYXkgaW50cm9kdWNlIGVycm9yXG4gICAgKTtcbn1cbmNvbnN0IGludFRpbWUgPSB7XG4gICAgaWRlbnRpZnk6IHZhbHVlID0+IHR5cGVvZiB2YWx1ZSA9PT0gJ2JpZ2ludCcgfHwgTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSksXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjppbnQnLFxuICAgIGZvcm1hdDogJ1RJTUUnLFxuICAgIHRlc3Q6IC9eWy0rXT9bMC05XVswLTlfXSooPzo6WzAtNV0/WzAtOV0pKyQvLFxuICAgIHJlc29sdmU6IChzdHIsIF9vbkVycm9yLCB7IGludEFzQmlnSW50IH0pID0+IHBhcnNlU2V4YWdlc2ltYWwoc3RyLCBpbnRBc0JpZ0ludCksXG4gICAgc3RyaW5naWZ5OiBzdHJpbmdpZnlTZXhhZ2VzaW1hbFxufTtcbmNvbnN0IGZsb2F0VGltZSA9IHtcbiAgICBpZGVudGlmeTogdmFsdWUgPT4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOmZsb2F0JyxcbiAgICBmb3JtYXQ6ICdUSU1FJyxcbiAgICB0ZXN0OiAvXlstK10/WzAtOV1bMC05X10qKD86OlswLTVdP1swLTldKStcXC5bMC05X10qJC8sXG4gICAgcmVzb2x2ZTogc3RyID0+IHBhcnNlU2V4YWdlc2ltYWwoc3RyLCBmYWxzZSksXG4gICAgc3RyaW5naWZ5OiBzdHJpbmdpZnlTZXhhZ2VzaW1hbFxufTtcbmNvbnN0IHRpbWVzdGFtcCA9IHtcbiAgICBpZGVudGlmeTogdmFsdWUgPT4gdmFsdWUgaW5zdGFuY2VvZiBEYXRlLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6dGltZXN0YW1wJyxcbiAgICAvLyBJZiB0aGUgdGltZSB6b25lIGlzIG9taXR0ZWQsIHRoZSB0aW1lc3RhbXAgaXMgYXNzdW1lZCB0byBiZSBzcGVjaWZpZWQgaW4gVVRDLiBUaGUgdGltZSBwYXJ0XG4gICAgLy8gbWF5IGJlIG9taXR0ZWQgYWx0b2dldGhlciwgcmVzdWx0aW5nIGluIGEgZGF0ZSBmb3JtYXQuIEluIHN1Y2ggYSBjYXNlLCB0aGUgdGltZSBwYXJ0IGlzXG4gICAgLy8gYXNzdW1lZCB0byBiZSAwMDowMDowMFogKHN0YXJ0IG9mIGRheSwgVVRDKS5cbiAgICB0ZXN0OiBSZWdFeHAoJ14oWzAtOV17NH0pLShbMC05XXsxLDJ9KS0oWzAtOV17MSwyfSknICsgLy8gWVlZWS1NbS1EZFxuICAgICAgICAnKD86JyArIC8vIHRpbWUgaXMgb3B0aW9uYWxcbiAgICAgICAgJyg/OnR8VHxbIFxcXFx0XSspJyArIC8vIHQgfCBUIHwgd2hpdGVzcGFjZVxuICAgICAgICAnKFswLTldezEsMn0pOihbMC05XXsxLDJ9KTooWzAtOV17MSwyfShcXFxcLlswLTldKyk/KScgKyAvLyBIaDpNbTpTcyguc3MpP1xuICAgICAgICAnKD86WyBcXFxcdF0qKFp8Wy0rXVswMTJdP1swLTldKD86OlswLTldezJ9KT8pKT8nICsgLy8gWiB8ICs1IHwgLTAzOjMwXG4gICAgICAgICcpPyQnKSxcbiAgICByZXNvbHZlKHN0cikge1xuICAgICAgICBjb25zdCBtYXRjaCA9IHN0ci5tYXRjaCh0aW1lc3RhbXAudGVzdCk7XG4gICAgICAgIGlmICghbWF0Y2gpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJyEhdGltZXN0YW1wIGV4cGVjdHMgYSBkYXRlLCBzdGFydGluZyB3aXRoIHl5eXktbW0tZGQnKTtcbiAgICAgICAgY29uc3QgWywgeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmRdID0gbWF0Y2gubWFwKE51bWJlcik7XG4gICAgICAgIGNvbnN0IG1pbGxpc2VjID0gbWF0Y2hbN10gPyBOdW1iZXIoKG1hdGNoWzddICsgJzAwJykuc3Vic3RyKDEsIDMpKSA6IDA7XG4gICAgICAgIGxldCBkYXRlID0gRGF0ZS5VVEMoeWVhciwgbW9udGggLSAxLCBkYXksIGhvdXIgfHwgMCwgbWludXRlIHx8IDAsIHNlY29uZCB8fCAwLCBtaWxsaXNlYyk7XG4gICAgICAgIGNvbnN0IHR6ID0gbWF0Y2hbOF07XG4gICAgICAgIGlmICh0eiAmJiB0eiAhPT0gJ1onKSB7XG4gICAgICAgICAgICBsZXQgZCA9IHBhcnNlU2V4YWdlc2ltYWwodHosIGZhbHNlKTtcbiAgICAgICAgICAgIGlmIChNYXRoLmFicyhkKSA8IDMwKVxuICAgICAgICAgICAgICAgIGQgKj0gNjA7XG4gICAgICAgICAgICBkYXRlIC09IDYwMDAwICogZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IERhdGUoZGF0ZSk7XG4gICAgfSxcbiAgICBzdHJpbmdpZnk6ICh7IHZhbHVlIH0pID0+IHZhbHVlPy50b0lTT1N0cmluZygpLnJlcGxhY2UoLyhUMDA6MDA6MDApP1xcLjAwMFokLywgJycpID8/ICcnXG59O1xuXG5leHBvcnQgeyBmbG9hdFRpbWUsIGludFRpbWUsIHRpbWVzdGFtcCB9O1xuIiwiaW1wb3J0IHsgbWFwIH0gZnJvbSAnLi4vY29tbW9uL21hcC5qcyc7XG5pbXBvcnQgeyBudWxsVGFnIH0gZnJvbSAnLi4vY29tbW9uL251bGwuanMnO1xuaW1wb3J0IHsgc2VxIH0gZnJvbSAnLi4vY29tbW9uL3NlcS5qcyc7XG5pbXBvcnQgeyBzdHJpbmcgfSBmcm9tICcuLi9jb21tb24vc3RyaW5nLmpzJztcbmltcG9ydCB7IGJpbmFyeSB9IGZyb20gJy4vYmluYXJ5LmpzJztcbmltcG9ydCB7IHRydWVUYWcsIGZhbHNlVGFnIH0gZnJvbSAnLi9ib29sLmpzJztcbmltcG9ydCB7IGZsb2F0TmFOLCBmbG9hdEV4cCwgZmxvYXQgfSBmcm9tICcuL2Zsb2F0LmpzJztcbmltcG9ydCB7IGludEJpbiwgaW50T2N0LCBpbnQsIGludEhleCB9IGZyb20gJy4vaW50LmpzJztcbmltcG9ydCB7IG1lcmdlIH0gZnJvbSAnLi9tZXJnZS5qcyc7XG5pbXBvcnQgeyBvbWFwIH0gZnJvbSAnLi9vbWFwLmpzJztcbmltcG9ydCB7IHBhaXJzIH0gZnJvbSAnLi9wYWlycy5qcyc7XG5pbXBvcnQgeyBzZXQgfSBmcm9tICcuL3NldC5qcyc7XG5pbXBvcnQgeyBpbnRUaW1lLCBmbG9hdFRpbWUsIHRpbWVzdGFtcCB9IGZyb20gJy4vdGltZXN0YW1wLmpzJztcblxuY29uc3Qgc2NoZW1hID0gW1xuICAgIG1hcCxcbiAgICBzZXEsXG4gICAgc3RyaW5nLFxuICAgIG51bGxUYWcsXG4gICAgdHJ1ZVRhZyxcbiAgICBmYWxzZVRhZyxcbiAgICBpbnRCaW4sXG4gICAgaW50T2N0LFxuICAgIGludCxcbiAgICBpbnRIZXgsXG4gICAgZmxvYXROYU4sXG4gICAgZmxvYXRFeHAsXG4gICAgZmxvYXQsXG4gICAgYmluYXJ5LFxuICAgIG1lcmdlLFxuICAgIG9tYXAsXG4gICAgcGFpcnMsXG4gICAgc2V0LFxuICAgIGludFRpbWUsXG4gICAgZmxvYXRUaW1lLFxuICAgIHRpbWVzdGFtcFxuXTtcblxuZXhwb3J0IHsgc2NoZW1hIH07XG4iLCJpbXBvcnQgeyBtYXAgfSBmcm9tICcuL2NvbW1vbi9tYXAuanMnO1xuaW1wb3J0IHsgbnVsbFRhZyB9IGZyb20gJy4vY29tbW9uL251bGwuanMnO1xuaW1wb3J0IHsgc2VxIH0gZnJvbSAnLi9jb21tb24vc2VxLmpzJztcbmltcG9ydCB7IHN0cmluZyB9IGZyb20gJy4vY29tbW9uL3N0cmluZy5qcyc7XG5pbXBvcnQgeyBib29sVGFnIH0gZnJvbSAnLi9jb3JlL2Jvb2wuanMnO1xuaW1wb3J0IHsgZmxvYXROYU4sIGZsb2F0RXhwLCBmbG9hdCB9IGZyb20gJy4vY29yZS9mbG9hdC5qcyc7XG5pbXBvcnQgeyBpbnRPY3QsIGludEhleCwgaW50IH0gZnJvbSAnLi9jb3JlL2ludC5qcyc7XG5pbXBvcnQgeyBzY2hlbWEgfSBmcm9tICcuL2NvcmUvc2NoZW1hLmpzJztcbmltcG9ydCB7IHNjaGVtYSBhcyBzY2hlbWEkMSB9IGZyb20gJy4vanNvbi9zY2hlbWEuanMnO1xuaW1wb3J0IHsgYmluYXJ5IH0gZnJvbSAnLi95YW1sLTEuMS9iaW5hcnkuanMnO1xuaW1wb3J0IHsgbWVyZ2UgfSBmcm9tICcuL3lhbWwtMS4xL21lcmdlLmpzJztcbmltcG9ydCB7IG9tYXAgfSBmcm9tICcuL3lhbWwtMS4xL29tYXAuanMnO1xuaW1wb3J0IHsgcGFpcnMgfSBmcm9tICcuL3lhbWwtMS4xL3BhaXJzLmpzJztcbmltcG9ydCB7IHNjaGVtYSBhcyBzY2hlbWEkMiB9IGZyb20gJy4veWFtbC0xLjEvc2NoZW1hLmpzJztcbmltcG9ydCB7IHNldCB9IGZyb20gJy4veWFtbC0xLjEvc2V0LmpzJztcbmltcG9ydCB7IHRpbWVzdGFtcCwgaW50VGltZSwgZmxvYXRUaW1lIH0gZnJvbSAnLi95YW1sLTEuMS90aW1lc3RhbXAuanMnO1xuXG5jb25zdCBzY2hlbWFzID0gbmV3IE1hcChbXG4gICAgWydjb3JlJywgc2NoZW1hXSxcbiAgICBbJ2ZhaWxzYWZlJywgW21hcCwgc2VxLCBzdHJpbmddXSxcbiAgICBbJ2pzb24nLCBzY2hlbWEkMV0sXG4gICAgWyd5YW1sMTEnLCBzY2hlbWEkMl0sXG4gICAgWyd5YW1sLTEuMScsIHNjaGVtYSQyXVxuXSk7XG5jb25zdCB0YWdzQnlOYW1lID0ge1xuICAgIGJpbmFyeSxcbiAgICBib29sOiBib29sVGFnLFxuICAgIGZsb2F0LFxuICAgIGZsb2F0RXhwLFxuICAgIGZsb2F0TmFOLFxuICAgIGZsb2F0VGltZSxcbiAgICBpbnQsXG4gICAgaW50SGV4LFxuICAgIGludE9jdCxcbiAgICBpbnRUaW1lLFxuICAgIG1hcCxcbiAgICBtZXJnZSxcbiAgICBudWxsOiBudWxsVGFnLFxuICAgIG9tYXAsXG4gICAgcGFpcnMsXG4gICAgc2VxLFxuICAgIHNldCxcbiAgICB0aW1lc3RhbXBcbn07XG5jb25zdCBjb3JlS25vd25UYWdzID0ge1xuICAgICd0YWc6eWFtbC5vcmcsMjAwMjpiaW5hcnknOiBiaW5hcnksXG4gICAgJ3RhZzp5YW1sLm9yZywyMDAyOm1lcmdlJzogbWVyZ2UsXG4gICAgJ3RhZzp5YW1sLm9yZywyMDAyOm9tYXAnOiBvbWFwLFxuICAgICd0YWc6eWFtbC5vcmcsMjAwMjpwYWlycyc6IHBhaXJzLFxuICAgICd0YWc6eWFtbC5vcmcsMjAwMjpzZXQnOiBzZXQsXG4gICAgJ3RhZzp5YW1sLm9yZywyMDAyOnRpbWVzdGFtcCc6IHRpbWVzdGFtcFxufTtcbmZ1bmN0aW9uIGdldFRhZ3MoY3VzdG9tVGFncywgc2NoZW1hTmFtZSwgYWRkTWVyZ2VUYWcpIHtcbiAgICBjb25zdCBzY2hlbWFUYWdzID0gc2NoZW1hcy5nZXQoc2NoZW1hTmFtZSk7XG4gICAgaWYgKHNjaGVtYVRhZ3MgJiYgIWN1c3RvbVRhZ3MpIHtcbiAgICAgICAgcmV0dXJuIGFkZE1lcmdlVGFnICYmICFzY2hlbWFUYWdzLmluY2x1ZGVzKG1lcmdlKVxuICAgICAgICAgICAgPyBzY2hlbWFUYWdzLmNvbmNhdChtZXJnZSlcbiAgICAgICAgICAgIDogc2NoZW1hVGFncy5zbGljZSgpO1xuICAgIH1cbiAgICBsZXQgdGFncyA9IHNjaGVtYVRhZ3M7XG4gICAgaWYgKCF0YWdzKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGN1c3RvbVRhZ3MpKVxuICAgICAgICAgICAgdGFncyA9IFtdO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGtleXMgPSBBcnJheS5mcm9tKHNjaGVtYXMua2V5cygpKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoa2V5ID0+IGtleSAhPT0gJ3lhbWwxMScpXG4gICAgICAgICAgICAgICAgLm1hcChrZXkgPT4gSlNPTi5zdHJpbmdpZnkoa2V5KSlcbiAgICAgICAgICAgICAgICAuam9pbignLCAnKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBzY2hlbWEgXCIke3NjaGVtYU5hbWV9XCI7IHVzZSBvbmUgb2YgJHtrZXlzfSBvciBkZWZpbmUgY3VzdG9tVGFncyBhcnJheWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KGN1c3RvbVRhZ3MpKSB7XG4gICAgICAgIGZvciAoY29uc3QgdGFnIG9mIGN1c3RvbVRhZ3MpXG4gICAgICAgICAgICB0YWdzID0gdGFncy5jb25jYXQodGFnKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIGN1c3RvbVRhZ3MgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGFncyA9IGN1c3RvbVRhZ3ModGFncy5zbGljZSgpKTtcbiAgICB9XG4gICAgaWYgKGFkZE1lcmdlVGFnKVxuICAgICAgICB0YWdzID0gdGFncy5jb25jYXQobWVyZ2UpO1xuICAgIHJldHVybiB0YWdzLnJlZHVjZSgodGFncywgdGFnKSA9PiB7XG4gICAgICAgIGNvbnN0IHRhZ09iaiA9IHR5cGVvZiB0YWcgPT09ICdzdHJpbmcnID8gdGFnc0J5TmFtZVt0YWddIDogdGFnO1xuICAgICAgICBpZiAoIXRhZ09iaikge1xuICAgICAgICAgICAgY29uc3QgdGFnTmFtZSA9IEpTT04uc3RyaW5naWZ5KHRhZyk7XG4gICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModGFnc0J5TmFtZSlcbiAgICAgICAgICAgICAgICAubWFwKGtleSA9PiBKU09OLnN0cmluZ2lmeShrZXkpKVxuICAgICAgICAgICAgICAgIC5qb2luKCcsICcpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGN1c3RvbSB0YWcgJHt0YWdOYW1lfTsgdXNlIG9uZSBvZiAke2tleXN9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0YWdzLmluY2x1ZGVzKHRhZ09iaikpXG4gICAgICAgICAgICB0YWdzLnB1c2godGFnT2JqKTtcbiAgICAgICAgcmV0dXJuIHRhZ3M7XG4gICAgfSwgW10pO1xufVxuXG5leHBvcnQgeyBjb3JlS25vd25UYWdzLCBnZXRUYWdzIH07XG4iLCJpbXBvcnQgeyBNQVAsIFNDQUxBUiwgU0VRIH0gZnJvbSAnLi4vbm9kZXMvaWRlbnRpdHkuanMnO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAnLi9jb21tb24vbWFwLmpzJztcbmltcG9ydCB7IHNlcSB9IGZyb20gJy4vY29tbW9uL3NlcS5qcyc7XG5pbXBvcnQgeyBzdHJpbmcgfSBmcm9tICcuL2NvbW1vbi9zdHJpbmcuanMnO1xuaW1wb3J0IHsgZ2V0VGFncywgY29yZUtub3duVGFncyB9IGZyb20gJy4vdGFncy5qcyc7XG5cbmNvbnN0IHNvcnRNYXBFbnRyaWVzQnlLZXkgPSAoYSwgYikgPT4gYS5rZXkgPCBiLmtleSA/IC0xIDogYS5rZXkgPiBiLmtleSA/IDEgOiAwO1xuY2xhc3MgU2NoZW1hIHtcbiAgICBjb25zdHJ1Y3Rvcih7IGNvbXBhdCwgY3VzdG9tVGFncywgbWVyZ2UsIHJlc29sdmVLbm93blRhZ3MsIHNjaGVtYSwgc29ydE1hcEVudHJpZXMsIHRvU3RyaW5nRGVmYXVsdHMgfSkge1xuICAgICAgICB0aGlzLmNvbXBhdCA9IEFycmF5LmlzQXJyYXkoY29tcGF0KVxuICAgICAgICAgICAgPyBnZXRUYWdzKGNvbXBhdCwgJ2NvbXBhdCcpXG4gICAgICAgICAgICA6IGNvbXBhdFxuICAgICAgICAgICAgICAgID8gZ2V0VGFncyhudWxsLCBjb21wYXQpXG4gICAgICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICB0aGlzLm5hbWUgPSAodHlwZW9mIHNjaGVtYSA9PT0gJ3N0cmluZycgJiYgc2NoZW1hKSB8fCAnY29yZSc7XG4gICAgICAgIHRoaXMua25vd25UYWdzID0gcmVzb2x2ZUtub3duVGFncyA/IGNvcmVLbm93blRhZ3MgOiB7fTtcbiAgICAgICAgdGhpcy50YWdzID0gZ2V0VGFncyhjdXN0b21UYWdzLCB0aGlzLm5hbWUsIG1lcmdlKTtcbiAgICAgICAgdGhpcy50b1N0cmluZ09wdGlvbnMgPSB0b1N0cmluZ0RlZmF1bHRzID8/IG51bGw7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBNQVAsIHsgdmFsdWU6IG1hcCB9KTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFNDQUxBUiwgeyB2YWx1ZTogc3RyaW5nIH0pO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgU0VRLCB7IHZhbHVlOiBzZXEgfSk7XG4gICAgICAgIC8vIFVzZWQgYnkgY3JlYXRlTWFwKClcbiAgICAgICAgdGhpcy5zb3J0TWFwRW50cmllcyA9XG4gICAgICAgICAgICB0eXBlb2Ygc29ydE1hcEVudHJpZXMgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgICAgICA/IHNvcnRNYXBFbnRyaWVzXG4gICAgICAgICAgICAgICAgOiBzb3J0TWFwRW50cmllcyA9PT0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICA/IHNvcnRNYXBFbnRyaWVzQnlLZXlcbiAgICAgICAgICAgICAgICAgICAgOiBudWxsO1xuICAgIH1cbiAgICBjbG9uZSgpIHtcbiAgICAgICAgY29uc3QgY29weSA9IE9iamVjdC5jcmVhdGUoU2NoZW1hLnByb3RvdHlwZSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnModGhpcykpO1xuICAgICAgICBjb3B5LnRhZ3MgPSB0aGlzLnRhZ3Muc2xpY2UoKTtcbiAgICAgICAgcmV0dXJuIGNvcHk7XG4gICAgfVxufVxuXG5leHBvcnQgeyBTY2hlbWEgfTtcbiIsImltcG9ydCB7IGlzTm9kZSB9IGZyb20gJy4uL25vZGVzL2lkZW50aXR5LmpzJztcbmltcG9ydCB7IGNyZWF0ZVN0cmluZ2lmeUNvbnRleHQsIHN0cmluZ2lmeSB9IGZyb20gJy4vc3RyaW5naWZ5LmpzJztcbmltcG9ydCB7IGluZGVudENvbW1lbnQsIGxpbmVDb21tZW50IH0gZnJvbSAnLi9zdHJpbmdpZnlDb21tZW50LmpzJztcblxuZnVuY3Rpb24gc3RyaW5naWZ5RG9jdW1lbnQoZG9jLCBvcHRpb25zKSB7XG4gICAgY29uc3QgbGluZXMgPSBbXTtcbiAgICBsZXQgaGFzRGlyZWN0aXZlcyA9IG9wdGlvbnMuZGlyZWN0aXZlcyA9PT0gdHJ1ZTtcbiAgICBpZiAob3B0aW9ucy5kaXJlY3RpdmVzICE9PSBmYWxzZSAmJiBkb2MuZGlyZWN0aXZlcykge1xuICAgICAgICBjb25zdCBkaXIgPSBkb2MuZGlyZWN0aXZlcy50b1N0cmluZyhkb2MpO1xuICAgICAgICBpZiAoZGlyKSB7XG4gICAgICAgICAgICBsaW5lcy5wdXNoKGRpcik7XG4gICAgICAgICAgICBoYXNEaXJlY3RpdmVzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChkb2MuZGlyZWN0aXZlcy5kb2NTdGFydClcbiAgICAgICAgICAgIGhhc0RpcmVjdGl2ZXMgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoaGFzRGlyZWN0aXZlcylcbiAgICAgICAgbGluZXMucHVzaCgnLS0tJyk7XG4gICAgY29uc3QgY3R4ID0gY3JlYXRlU3RyaW5naWZ5Q29udGV4dChkb2MsIG9wdGlvbnMpO1xuICAgIGNvbnN0IHsgY29tbWVudFN0cmluZyB9ID0gY3R4Lm9wdGlvbnM7XG4gICAgaWYgKGRvYy5jb21tZW50QmVmb3JlKSB7XG4gICAgICAgIGlmIChsaW5lcy5sZW5ndGggIT09IDEpXG4gICAgICAgICAgICBsaW5lcy51bnNoaWZ0KCcnKTtcbiAgICAgICAgY29uc3QgY3MgPSBjb21tZW50U3RyaW5nKGRvYy5jb21tZW50QmVmb3JlKTtcbiAgICAgICAgbGluZXMudW5zaGlmdChpbmRlbnRDb21tZW50KGNzLCAnJykpO1xuICAgIH1cbiAgICBsZXQgY2hvbXBLZWVwID0gZmFsc2U7XG4gICAgbGV0IGNvbnRlbnRDb21tZW50ID0gbnVsbDtcbiAgICBpZiAoZG9jLmNvbnRlbnRzKSB7XG4gICAgICAgIGlmIChpc05vZGUoZG9jLmNvbnRlbnRzKSkge1xuICAgICAgICAgICAgaWYgKGRvYy5jb250ZW50cy5zcGFjZUJlZm9yZSAmJiBoYXNEaXJlY3RpdmVzKVxuICAgICAgICAgICAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgICAgICAgICAgaWYgKGRvYy5jb250ZW50cy5jb21tZW50QmVmb3JlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY3MgPSBjb21tZW50U3RyaW5nKGRvYy5jb250ZW50cy5jb21tZW50QmVmb3JlKTtcbiAgICAgICAgICAgICAgICBsaW5lcy5wdXNoKGluZGVudENvbW1lbnQoY3MsICcnKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyB0b3AtbGV2ZWwgYmxvY2sgc2NhbGFycyBuZWVkIHRvIGJlIGluZGVudGVkIGlmIGZvbGxvd2VkIGJ5IGEgY29tbWVudFxuICAgICAgICAgICAgY3R4LmZvcmNlQmxvY2tJbmRlbnQgPSAhIWRvYy5jb21tZW50O1xuICAgICAgICAgICAgY29udGVudENvbW1lbnQgPSBkb2MuY29udGVudHMuY29tbWVudDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvbkNob21wS2VlcCA9IGNvbnRlbnRDb21tZW50ID8gdW5kZWZpbmVkIDogKCkgPT4gKGNob21wS2VlcCA9IHRydWUpO1xuICAgICAgICBsZXQgYm9keSA9IHN0cmluZ2lmeShkb2MuY29udGVudHMsIGN0eCwgKCkgPT4gKGNvbnRlbnRDb21tZW50ID0gbnVsbCksIG9uQ2hvbXBLZWVwKTtcbiAgICAgICAgaWYgKGNvbnRlbnRDb21tZW50KVxuICAgICAgICAgICAgYm9keSArPSBsaW5lQ29tbWVudChib2R5LCAnJywgY29tbWVudFN0cmluZyhjb250ZW50Q29tbWVudCkpO1xuICAgICAgICBpZiAoKGJvZHlbMF0gPT09ICd8JyB8fCBib2R5WzBdID09PSAnPicpICYmXG4gICAgICAgICAgICBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXSA9PT0gJy0tLScpIHtcbiAgICAgICAgICAgIC8vIFRvcC1sZXZlbCBibG9jayBzY2FsYXJzIHdpdGggYSBwcmVjZWRpbmcgZG9jIG1hcmtlciBvdWdodCB0byB1c2UgdGhlXG4gICAgICAgICAgICAvLyBzYW1lIGxpbmUgZm9yIHRoZWlyIGhlYWRlci5cbiAgICAgICAgICAgIGxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdID0gYC0tLSAke2JvZHl9YDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBsaW5lcy5wdXNoKGJvZHkpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbGluZXMucHVzaChzdHJpbmdpZnkoZG9jLmNvbnRlbnRzLCBjdHgpKTtcbiAgICB9XG4gICAgaWYgKGRvYy5kaXJlY3RpdmVzPy5kb2NFbmQpIHtcbiAgICAgICAgaWYgKGRvYy5jb21tZW50KSB7XG4gICAgICAgICAgICBjb25zdCBjcyA9IGNvbW1lbnRTdHJpbmcoZG9jLmNvbW1lbnQpO1xuICAgICAgICAgICAgaWYgKGNzLmluY2x1ZGVzKCdcXG4nKSkge1xuICAgICAgICAgICAgICAgIGxpbmVzLnB1c2goJy4uLicpO1xuICAgICAgICAgICAgICAgIGxpbmVzLnB1c2goaW5kZW50Q29tbWVudChjcywgJycpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxpbmVzLnB1c2goYC4uLiAke2NzfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGluZXMucHVzaCgnLi4uJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGxldCBkYyA9IGRvYy5jb21tZW50O1xuICAgICAgICBpZiAoZGMgJiYgY2hvbXBLZWVwKVxuICAgICAgICAgICAgZGMgPSBkYy5yZXBsYWNlKC9eXFxuKy8sICcnKTtcbiAgICAgICAgaWYgKGRjKSB7XG4gICAgICAgICAgICBpZiAoKCFjaG9tcEtlZXAgfHwgY29udGVudENvbW1lbnQpICYmIGxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdICE9PSAnJylcbiAgICAgICAgICAgICAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICAgICAgICAgIGxpbmVzLnB1c2goaW5kZW50Q29tbWVudChjb21tZW50U3RyaW5nKGRjKSwgJycpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbGluZXMuam9pbignXFxuJykgKyAnXFxuJztcbn1cblxuZXhwb3J0IHsgc3RyaW5naWZ5RG9jdW1lbnQgfTtcbiIsImltcG9ydCB7IEFsaWFzIH0gZnJvbSAnLi4vbm9kZXMvQWxpYXMuanMnO1xuaW1wb3J0IHsgaXNFbXB0eVBhdGgsIGNvbGxlY3Rpb25Gcm9tUGF0aCB9IGZyb20gJy4uL25vZGVzL0NvbGxlY3Rpb24uanMnO1xuaW1wb3J0IHsgTk9ERV9UWVBFLCBET0MsIGlzTm9kZSwgaXNDb2xsZWN0aW9uLCBpc1NjYWxhciB9IGZyb20gJy4uL25vZGVzL2lkZW50aXR5LmpzJztcbmltcG9ydCB7IFBhaXIgfSBmcm9tICcuLi9ub2Rlcy9QYWlyLmpzJztcbmltcG9ydCB7IHRvSlMgfSBmcm9tICcuLi9ub2Rlcy90b0pTLmpzJztcbmltcG9ydCB7IFNjaGVtYSB9IGZyb20gJy4uL3NjaGVtYS9TY2hlbWEuanMnO1xuaW1wb3J0IHsgc3RyaW5naWZ5RG9jdW1lbnQgfSBmcm9tICcuLi9zdHJpbmdpZnkvc3RyaW5naWZ5RG9jdW1lbnQuanMnO1xuaW1wb3J0IHsgYW5jaG9yTmFtZXMsIGZpbmROZXdBbmNob3IsIGNyZWF0ZU5vZGVBbmNob3JzIH0gZnJvbSAnLi9hbmNob3JzLmpzJztcbmltcG9ydCB7IGFwcGx5UmV2aXZlciB9IGZyb20gJy4vYXBwbHlSZXZpdmVyLmpzJztcbmltcG9ydCB7IGNyZWF0ZU5vZGUgfSBmcm9tICcuL2NyZWF0ZU5vZGUuanMnO1xuaW1wb3J0IHsgRGlyZWN0aXZlcyB9IGZyb20gJy4vZGlyZWN0aXZlcy5qcyc7XG5cbmNsYXNzIERvY3VtZW50IHtcbiAgICBjb25zdHJ1Y3Rvcih2YWx1ZSwgcmVwbGFjZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgLyoqIEEgY29tbWVudCBiZWZvcmUgdGhpcyBEb2N1bWVudCAqL1xuICAgICAgICB0aGlzLmNvbW1lbnRCZWZvcmUgPSBudWxsO1xuICAgICAgICAvKiogQSBjb21tZW50IGltbWVkaWF0ZWx5IGFmdGVyIHRoaXMgRG9jdW1lbnQgKi9cbiAgICAgICAgdGhpcy5jb21tZW50ID0gbnVsbDtcbiAgICAgICAgLyoqIEVycm9ycyBlbmNvdW50ZXJlZCBkdXJpbmcgcGFyc2luZy4gKi9cbiAgICAgICAgdGhpcy5lcnJvcnMgPSBbXTtcbiAgICAgICAgLyoqIFdhcm5pbmdzIGVuY291bnRlcmVkIGR1cmluZyBwYXJzaW5nLiAqL1xuICAgICAgICB0aGlzLndhcm5pbmdzID0gW107XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBOT0RFX1RZUEUsIHsgdmFsdWU6IERPQyB9KTtcbiAgICAgICAgbGV0IF9yZXBsYWNlciA9IG51bGw7XG4gICAgICAgIGlmICh0eXBlb2YgcmVwbGFjZXIgPT09ICdmdW5jdGlvbicgfHwgQXJyYXkuaXNBcnJheShyZXBsYWNlcikpIHtcbiAgICAgICAgICAgIF9yZXBsYWNlciA9IHJlcGxhY2VyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCAmJiByZXBsYWNlcikge1xuICAgICAgICAgICAgb3B0aW9ucyA9IHJlcGxhY2VyO1xuICAgICAgICAgICAgcmVwbGFjZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3B0ID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgICBpbnRBc0JpZ0ludDogZmFsc2UsXG4gICAgICAgICAgICBrZWVwU291cmNlVG9rZW5zOiBmYWxzZSxcbiAgICAgICAgICAgIGxvZ0xldmVsOiAnd2FybicsXG4gICAgICAgICAgICBwcmV0dHlFcnJvcnM6IHRydWUsXG4gICAgICAgICAgICBzdHJpY3Q6IHRydWUsXG4gICAgICAgICAgICBzdHJpbmdLZXlzOiBmYWxzZSxcbiAgICAgICAgICAgIHVuaXF1ZUtleXM6IHRydWUsXG4gICAgICAgICAgICB2ZXJzaW9uOiAnMS4yJ1xuICAgICAgICB9LCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0O1xuICAgICAgICBsZXQgeyB2ZXJzaW9uIH0gPSBvcHQ7XG4gICAgICAgIGlmIChvcHRpb25zPy5fZGlyZWN0aXZlcykge1xuICAgICAgICAgICAgdGhpcy5kaXJlY3RpdmVzID0gb3B0aW9ucy5fZGlyZWN0aXZlcy5hdERvY3VtZW50KCk7XG4gICAgICAgICAgICBpZiAodGhpcy5kaXJlY3RpdmVzLnlhbWwuZXhwbGljaXQpXG4gICAgICAgICAgICAgICAgdmVyc2lvbiA9IHRoaXMuZGlyZWN0aXZlcy55YW1sLnZlcnNpb247XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhpcy5kaXJlY3RpdmVzID0gbmV3IERpcmVjdGl2ZXMoeyB2ZXJzaW9uIH0pO1xuICAgICAgICB0aGlzLnNldFNjaGVtYSh2ZXJzaW9uLCBvcHRpb25zKTtcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBXZSBjYW4ndCByZWFsbHkga25vdyB0aGF0IHRoaXMgbWF0Y2hlcyBDb250ZW50cy5cbiAgICAgICAgdGhpcy5jb250ZW50cyA9XG4gICAgICAgICAgICB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHRoaXMuY3JlYXRlTm9kZSh2YWx1ZSwgX3JlcGxhY2VyLCBvcHRpb25zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgZGVlcCBjb3B5IG9mIHRoaXMgRG9jdW1lbnQgYW5kIGl0cyBjb250ZW50cy5cbiAgICAgKlxuICAgICAqIEN1c3RvbSBOb2RlIHZhbHVlcyB0aGF0IGluaGVyaXQgZnJvbSBgT2JqZWN0YCBzdGlsbCByZWZlciB0byB0aGVpciBvcmlnaW5hbCBpbnN0YW5jZXMuXG4gICAgICovXG4gICAgY2xvbmUoKSB7XG4gICAgICAgIGNvbnN0IGNvcHkgPSBPYmplY3QuY3JlYXRlKERvY3VtZW50LnByb3RvdHlwZSwge1xuICAgICAgICAgICAgW05PREVfVFlQRV06IHsgdmFsdWU6IERPQyB9XG4gICAgICAgIH0pO1xuICAgICAgICBjb3B5LmNvbW1lbnRCZWZvcmUgPSB0aGlzLmNvbW1lbnRCZWZvcmU7XG4gICAgICAgIGNvcHkuY29tbWVudCA9IHRoaXMuY29tbWVudDtcbiAgICAgICAgY29weS5lcnJvcnMgPSB0aGlzLmVycm9ycy5zbGljZSgpO1xuICAgICAgICBjb3B5Lndhcm5pbmdzID0gdGhpcy53YXJuaW5ncy5zbGljZSgpO1xuICAgICAgICBjb3B5Lm9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLm9wdGlvbnMpO1xuICAgICAgICBpZiAodGhpcy5kaXJlY3RpdmVzKVxuICAgICAgICAgICAgY29weS5kaXJlY3RpdmVzID0gdGhpcy5kaXJlY3RpdmVzLmNsb25lKCk7XG4gICAgICAgIGNvcHkuc2NoZW1hID0gdGhpcy5zY2hlbWEuY2xvbmUoKTtcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBXZSBjYW4ndCByZWFsbHkga25vdyB0aGF0IHRoaXMgbWF0Y2hlcyBDb250ZW50cy5cbiAgICAgICAgY29weS5jb250ZW50cyA9IGlzTm9kZSh0aGlzLmNvbnRlbnRzKVxuICAgICAgICAgICAgPyB0aGlzLmNvbnRlbnRzLmNsb25lKGNvcHkuc2NoZW1hKVxuICAgICAgICAgICAgOiB0aGlzLmNvbnRlbnRzO1xuICAgICAgICBpZiAodGhpcy5yYW5nZSlcbiAgICAgICAgICAgIGNvcHkucmFuZ2UgPSB0aGlzLnJhbmdlLnNsaWNlKCk7XG4gICAgICAgIHJldHVybiBjb3B5O1xuICAgIH1cbiAgICAvKiogQWRkcyBhIHZhbHVlIHRvIHRoZSBkb2N1bWVudC4gKi9cbiAgICBhZGQodmFsdWUpIHtcbiAgICAgICAgaWYgKGFzc2VydENvbGxlY3Rpb24odGhpcy5jb250ZW50cykpXG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRzLmFkZCh2YWx1ZSk7XG4gICAgfVxuICAgIC8qKiBBZGRzIGEgdmFsdWUgdG8gdGhlIGRvY3VtZW50LiAqL1xuICAgIGFkZEluKHBhdGgsIHZhbHVlKSB7XG4gICAgICAgIGlmIChhc3NlcnRDb2xsZWN0aW9uKHRoaXMuY29udGVudHMpKVxuICAgICAgICAgICAgdGhpcy5jb250ZW50cy5hZGRJbihwYXRoLCB2YWx1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIG5ldyBgQWxpYXNgIG5vZGUsIGVuc3VyaW5nIHRoYXQgdGhlIHRhcmdldCBgbm9kZWAgaGFzIHRoZSByZXF1aXJlZCBhbmNob3IuXG4gICAgICpcbiAgICAgKiBJZiBgbm9kZWAgYWxyZWFkeSBoYXMgYW4gYW5jaG9yLCBgbmFtZWAgaXMgaWdub3JlZC5cbiAgICAgKiBPdGhlcndpc2UsIHRoZSBgbm9kZS5hbmNob3JgIHZhbHVlIHdpbGwgYmUgc2V0IHRvIGBuYW1lYCxcbiAgICAgKiBvciBpZiBhbiBhbmNob3Igd2l0aCB0aGF0IG5hbWUgaXMgYWxyZWFkeSBwcmVzZW50IGluIHRoZSBkb2N1bWVudCxcbiAgICAgKiBgbmFtZWAgd2lsbCBiZSB1c2VkIGFzIGEgcHJlZml4IGZvciBhIG5ldyB1bmlxdWUgYW5jaG9yLlxuICAgICAqIElmIGBuYW1lYCBpcyB1bmRlZmluZWQsIHRoZSBnZW5lcmF0ZWQgYW5jaG9yIHdpbGwgdXNlICdhJyBhcyBhIHByZWZpeC5cbiAgICAgKi9cbiAgICBjcmVhdGVBbGlhcyhub2RlLCBuYW1lKSB7XG4gICAgICAgIGlmICghbm9kZS5hbmNob3IpIHtcbiAgICAgICAgICAgIGNvbnN0IHByZXYgPSBhbmNob3JOYW1lcyh0aGlzKTtcbiAgICAgICAgICAgIG5vZGUuYW5jaG9yID1cbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1udWxsaXNoLWNvYWxlc2NpbmdcbiAgICAgICAgICAgICAgICAhbmFtZSB8fCBwcmV2LmhhcyhuYW1lKSA/IGZpbmROZXdBbmNob3IobmFtZSB8fCAnYScsIHByZXYpIDogbmFtZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEFsaWFzKG5vZGUuYW5jaG9yKTtcbiAgICB9XG4gICAgY3JlYXRlTm9kZSh2YWx1ZSwgcmVwbGFjZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgbGV0IF9yZXBsYWNlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHR5cGVvZiByZXBsYWNlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdmFsdWUgPSByZXBsYWNlci5jYWxsKHsgJyc6IHZhbHVlIH0sICcnLCB2YWx1ZSk7XG4gICAgICAgICAgICBfcmVwbGFjZXIgPSByZXBsYWNlcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHJlcGxhY2VyKSkge1xuICAgICAgICAgICAgY29uc3Qga2V5VG9TdHIgPSAodikgPT4gdHlwZW9mIHYgPT09ICdudW1iZXInIHx8IHYgaW5zdGFuY2VvZiBTdHJpbmcgfHwgdiBpbnN0YW5jZW9mIE51bWJlcjtcbiAgICAgICAgICAgIGNvbnN0IGFzU3RyID0gcmVwbGFjZXIuZmlsdGVyKGtleVRvU3RyKS5tYXAoU3RyaW5nKTtcbiAgICAgICAgICAgIGlmIChhc1N0ci5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgIHJlcGxhY2VyID0gcmVwbGFjZXIuY29uY2F0KGFzU3RyKTtcbiAgICAgICAgICAgIF9yZXBsYWNlciA9IHJlcGxhY2VyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCAmJiByZXBsYWNlcikge1xuICAgICAgICAgICAgb3B0aW9ucyA9IHJlcGxhY2VyO1xuICAgICAgICAgICAgcmVwbGFjZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBhbGlhc0R1cGxpY2F0ZU9iamVjdHMsIGFuY2hvclByZWZpeCwgZmxvdywga2VlcFVuZGVmaW5lZCwgb25UYWdPYmosIHRhZyB9ID0gb3B0aW9ucyA/PyB7fTtcbiAgICAgICAgY29uc3QgeyBvbkFuY2hvciwgc2V0QW5jaG9ycywgc291cmNlT2JqZWN0cyB9ID0gY3JlYXRlTm9kZUFuY2hvcnModGhpcywgXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLW51bGxpc2gtY29hbGVzY2luZ1xuICAgICAgICBhbmNob3JQcmVmaXggfHwgJ2EnKTtcbiAgICAgICAgY29uc3QgY3R4ID0ge1xuICAgICAgICAgICAgYWxpYXNEdXBsaWNhdGVPYmplY3RzOiBhbGlhc0R1cGxpY2F0ZU9iamVjdHMgPz8gdHJ1ZSxcbiAgICAgICAgICAgIGtlZXBVbmRlZmluZWQ6IGtlZXBVbmRlZmluZWQgPz8gZmFsc2UsXG4gICAgICAgICAgICBvbkFuY2hvcixcbiAgICAgICAgICAgIG9uVGFnT2JqLFxuICAgICAgICAgICAgcmVwbGFjZXI6IF9yZXBsYWNlcixcbiAgICAgICAgICAgIHNjaGVtYTogdGhpcy5zY2hlbWEsXG4gICAgICAgICAgICBzb3VyY2VPYmplY3RzXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IG5vZGUgPSBjcmVhdGVOb2RlKHZhbHVlLCB0YWcsIGN0eCk7XG4gICAgICAgIGlmIChmbG93ICYmIGlzQ29sbGVjdGlvbihub2RlKSlcbiAgICAgICAgICAgIG5vZGUuZmxvdyA9IHRydWU7XG4gICAgICAgIHNldEFuY2hvcnMoKTtcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnQgYSBrZXkgYW5kIGEgdmFsdWUgaW50byBhIGBQYWlyYCB1c2luZyB0aGUgY3VycmVudCBzY2hlbWEsXG4gICAgICogcmVjdXJzaXZlbHkgd3JhcHBpbmcgYWxsIHZhbHVlcyBhcyBgU2NhbGFyYCBvciBgQ29sbGVjdGlvbmAgbm9kZXMuXG4gICAgICovXG4gICAgY3JlYXRlUGFpcihrZXksIHZhbHVlLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgayA9IHRoaXMuY3JlYXRlTm9kZShrZXksIG51bGwsIG9wdGlvbnMpO1xuICAgICAgICBjb25zdCB2ID0gdGhpcy5jcmVhdGVOb2RlKHZhbHVlLCBudWxsLCBvcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQYWlyKGssIHYpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGEgdmFsdWUgZnJvbSB0aGUgZG9jdW1lbnQuXG4gICAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBpdGVtIHdhcyBmb3VuZCBhbmQgcmVtb3ZlZC5cbiAgICAgKi9cbiAgICBkZWxldGUoa2V5KSB7XG4gICAgICAgIHJldHVybiBhc3NlcnRDb2xsZWN0aW9uKHRoaXMuY29udGVudHMpID8gdGhpcy5jb250ZW50cy5kZWxldGUoa2V5KSA6IGZhbHNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGEgdmFsdWUgZnJvbSB0aGUgZG9jdW1lbnQuXG4gICAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBpdGVtIHdhcyBmb3VuZCBhbmQgcmVtb3ZlZC5cbiAgICAgKi9cbiAgICBkZWxldGVJbihwYXRoKSB7XG4gICAgICAgIGlmIChpc0VtcHR5UGF0aChwYXRoKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuY29udGVudHMgPT0gbnVsbClcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIFByZXN1bWVkIGltcG9zc2libGUgaWYgU3RyaWN0IGV4dGVuZHMgZmFsc2VcbiAgICAgICAgICAgIHRoaXMuY29udGVudHMgPSBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFzc2VydENvbGxlY3Rpb24odGhpcy5jb250ZW50cylcbiAgICAgICAgICAgID8gdGhpcy5jb250ZW50cy5kZWxldGVJbihwYXRoKVxuICAgICAgICAgICAgOiBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBpdGVtIGF0IGBrZXlgLCBvciBgdW5kZWZpbmVkYCBpZiBub3QgZm91bmQuIEJ5IGRlZmF1bHQgdW53cmFwc1xuICAgICAqIHNjYWxhciB2YWx1ZXMgZnJvbSB0aGVpciBzdXJyb3VuZGluZyBub2RlOyB0byBkaXNhYmxlIHNldCBga2VlcFNjYWxhcmAgdG9cbiAgICAgKiBgdHJ1ZWAgKGNvbGxlY3Rpb25zIGFyZSBhbHdheXMgcmV0dXJuZWQgaW50YWN0KS5cbiAgICAgKi9cbiAgICBnZXQoa2V5LCBrZWVwU2NhbGFyKSB7XG4gICAgICAgIHJldHVybiBpc0NvbGxlY3Rpb24odGhpcy5jb250ZW50cylcbiAgICAgICAgICAgID8gdGhpcy5jb250ZW50cy5nZXQoa2V5LCBrZWVwU2NhbGFyKVxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgaXRlbSBhdCBgcGF0aGAsIG9yIGB1bmRlZmluZWRgIGlmIG5vdCBmb3VuZC4gQnkgZGVmYXVsdCB1bndyYXBzXG4gICAgICogc2NhbGFyIHZhbHVlcyBmcm9tIHRoZWlyIHN1cnJvdW5kaW5nIG5vZGU7IHRvIGRpc2FibGUgc2V0IGBrZWVwU2NhbGFyYCB0b1xuICAgICAqIGB0cnVlYCAoY29sbGVjdGlvbnMgYXJlIGFsd2F5cyByZXR1cm5lZCBpbnRhY3QpLlxuICAgICAqL1xuICAgIGdldEluKHBhdGgsIGtlZXBTY2FsYXIpIHtcbiAgICAgICAgaWYgKGlzRW1wdHlQYXRoKHBhdGgpKVxuICAgICAgICAgICAgcmV0dXJuICFrZWVwU2NhbGFyICYmIGlzU2NhbGFyKHRoaXMuY29udGVudHMpXG4gICAgICAgICAgICAgICAgPyB0aGlzLmNvbnRlbnRzLnZhbHVlXG4gICAgICAgICAgICAgICAgOiB0aGlzLmNvbnRlbnRzO1xuICAgICAgICByZXR1cm4gaXNDb2xsZWN0aW9uKHRoaXMuY29udGVudHMpXG4gICAgICAgICAgICA/IHRoaXMuY29udGVudHMuZ2V0SW4ocGF0aCwga2VlcFNjYWxhcilcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhlIGRvY3VtZW50IGluY2x1ZGVzIGEgdmFsdWUgd2l0aCB0aGUga2V5IGBrZXlgLlxuICAgICAqL1xuICAgIGhhcyhrZXkpIHtcbiAgICAgICAgcmV0dXJuIGlzQ29sbGVjdGlvbih0aGlzLmNvbnRlbnRzKSA/IHRoaXMuY29udGVudHMuaGFzKGtleSkgOiBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSBkb2N1bWVudCBpbmNsdWRlcyBhIHZhbHVlIGF0IGBwYXRoYC5cbiAgICAgKi9cbiAgICBoYXNJbihwYXRoKSB7XG4gICAgICAgIGlmIChpc0VtcHR5UGF0aChwYXRoKSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnRzICE9PSB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiBpc0NvbGxlY3Rpb24odGhpcy5jb250ZW50cykgPyB0aGlzLmNvbnRlbnRzLmhhc0luKHBhdGgpIDogZmFsc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgYSB2YWx1ZSBpbiB0aGlzIGRvY3VtZW50LiBGb3IgYCEhc2V0YCwgYHZhbHVlYCBuZWVkcyB0byBiZSBhXG4gICAgICogYm9vbGVhbiB0byBhZGQvcmVtb3ZlIHRoZSBpdGVtIGZyb20gdGhlIHNldC5cbiAgICAgKi9cbiAgICBzZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgICBpZiAodGhpcy5jb250ZW50cyA9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIFdlIGNhbid0IHJlYWxseSBrbm93IHRoYXQgdGhpcyBtYXRjaGVzIENvbnRlbnRzLlxuICAgICAgICAgICAgdGhpcy5jb250ZW50cyA9IGNvbGxlY3Rpb25Gcm9tUGF0aCh0aGlzLnNjaGVtYSwgW2tleV0sIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhc3NlcnRDb2xsZWN0aW9uKHRoaXMuY29udGVudHMpKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRzLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIGEgdmFsdWUgaW4gdGhpcyBkb2N1bWVudC4gRm9yIGAhIXNldGAsIGB2YWx1ZWAgbmVlZHMgdG8gYmUgYVxuICAgICAqIGJvb2xlYW4gdG8gYWRkL3JlbW92ZSB0aGUgaXRlbSBmcm9tIHRoZSBzZXQuXG4gICAgICovXG4gICAgc2V0SW4ocGF0aCwgdmFsdWUpIHtcbiAgICAgICAgaWYgKGlzRW1wdHlQYXRoKHBhdGgpKSB7XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIFdlIGNhbid0IHJlYWxseSBrbm93IHRoYXQgdGhpcyBtYXRjaGVzIENvbnRlbnRzLlxuICAgICAgICAgICAgdGhpcy5jb250ZW50cyA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuY29udGVudHMgPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBXZSBjYW4ndCByZWFsbHkga25vdyB0aGF0IHRoaXMgbWF0Y2hlcyBDb250ZW50cy5cbiAgICAgICAgICAgIHRoaXMuY29udGVudHMgPSBjb2xsZWN0aW9uRnJvbVBhdGgodGhpcy5zY2hlbWEsIEFycmF5LmZyb20ocGF0aCksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhc3NlcnRDb2xsZWN0aW9uKHRoaXMuY29udGVudHMpKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRzLnNldEluKHBhdGgsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGFuZ2UgdGhlIFlBTUwgdmVyc2lvbiBhbmQgc2NoZW1hIHVzZWQgYnkgdGhlIGRvY3VtZW50LlxuICAgICAqIEEgYG51bGxgIHZlcnNpb24gZGlzYWJsZXMgc3VwcG9ydCBmb3IgZGlyZWN0aXZlcywgZXhwbGljaXQgdGFncywgYW5jaG9ycywgYW5kIGFsaWFzZXMuXG4gICAgICogSXQgYWxzbyByZXF1aXJlcyB0aGUgYHNjaGVtYWAgb3B0aW9uIHRvIGJlIGdpdmVuIGFzIGEgYFNjaGVtYWAgaW5zdGFuY2UgdmFsdWUuXG4gICAgICpcbiAgICAgKiBPdmVycmlkZXMgYWxsIHByZXZpb3VzbHkgc2V0IHNjaGVtYSBvcHRpb25zLlxuICAgICAqL1xuICAgIHNldFNjaGVtYSh2ZXJzaW9uLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2ZXJzaW9uID09PSAnbnVtYmVyJylcbiAgICAgICAgICAgIHZlcnNpb24gPSBTdHJpbmcodmVyc2lvbik7XG4gICAgICAgIGxldCBvcHQ7XG4gICAgICAgIHN3aXRjaCAodmVyc2lvbikge1xuICAgICAgICAgICAgY2FzZSAnMS4xJzpcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kaXJlY3RpdmVzKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpcmVjdGl2ZXMueWFtbC52ZXJzaW9uID0gJzEuMSc7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpcmVjdGl2ZXMgPSBuZXcgRGlyZWN0aXZlcyh7IHZlcnNpb246ICcxLjEnIH0pO1xuICAgICAgICAgICAgICAgIG9wdCA9IHsgcmVzb2x2ZUtub3duVGFnczogZmFsc2UsIHNjaGVtYTogJ3lhbWwtMS4xJyB9O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnMS4yJzpcbiAgICAgICAgICAgIGNhc2UgJ25leHQnOlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRpcmVjdGl2ZXMpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlyZWN0aXZlcy55YW1sLnZlcnNpb24gPSB2ZXJzaW9uO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXJlY3RpdmVzID0gbmV3IERpcmVjdGl2ZXMoeyB2ZXJzaW9uIH0pO1xuICAgICAgICAgICAgICAgIG9wdCA9IHsgcmVzb2x2ZUtub3duVGFnczogdHJ1ZSwgc2NoZW1hOiAnY29yZScgfTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgbnVsbDpcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kaXJlY3RpdmVzKVxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5kaXJlY3RpdmVzO1xuICAgICAgICAgICAgICAgIG9wdCA9IG51bGw7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3YgPSBKU09OLnN0cmluZ2lmeSh2ZXJzaW9uKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkICcxLjEnLCAnMS4yJyBvciBudWxsIGFzIGZpcnN0IGFyZ3VtZW50LCBidXQgZm91bmQ6ICR7c3Z9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gTm90IHVzaW5nIGBpbnN0YW5jZW9mIFNjaGVtYWAgdG8gYWxsb3cgZm9yIGR1Y2sgdHlwaW5nXG4gICAgICAgIGlmIChvcHRpb25zLnNjaGVtYSBpbnN0YW5jZW9mIE9iamVjdClcbiAgICAgICAgICAgIHRoaXMuc2NoZW1hID0gb3B0aW9ucy5zY2hlbWE7XG4gICAgICAgIGVsc2UgaWYgKG9wdClcbiAgICAgICAgICAgIHRoaXMuc2NoZW1hID0gbmV3IFNjaGVtYShPYmplY3QuYXNzaWduKG9wdCwgb3B0aW9ucykpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFdpdGggYSBudWxsIFlBTUwgdmVyc2lvbiwgdGhlIHsgc2NoZW1hOiBTY2hlbWEgfSBvcHRpb24gaXMgcmVxdWlyZWRgKTtcbiAgICB9XG4gICAgLy8ganNvbiAmIGpzb25BcmcgYXJlIG9ubHkgdXNlZCBmcm9tIHRvSlNPTigpXG4gICAgdG9KUyh7IGpzb24sIGpzb25BcmcsIG1hcEFzTWFwLCBtYXhBbGlhc0NvdW50LCBvbkFuY2hvciwgcmV2aXZlciB9ID0ge30pIHtcbiAgICAgICAgY29uc3QgY3R4ID0ge1xuICAgICAgICAgICAgYW5jaG9yczogbmV3IE1hcCgpLFxuICAgICAgICAgICAgZG9jOiB0aGlzLFxuICAgICAgICAgICAga2VlcDogIWpzb24sXG4gICAgICAgICAgICBtYXBBc01hcDogbWFwQXNNYXAgPT09IHRydWUsXG4gICAgICAgICAgICBtYXBLZXlXYXJuZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbWF4QWxpYXNDb3VudDogdHlwZW9mIG1heEFsaWFzQ291bnQgPT09ICdudW1iZXInID8gbWF4QWxpYXNDb3VudCA6IDEwMFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCByZXMgPSB0b0pTKHRoaXMuY29udGVudHMsIGpzb25BcmcgPz8gJycsIGN0eCk7XG4gICAgICAgIGlmICh0eXBlb2Ygb25BbmNob3IgPT09ICdmdW5jdGlvbicpXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHsgY291bnQsIHJlcyB9IG9mIGN0eC5hbmNob3JzLnZhbHVlcygpKVxuICAgICAgICAgICAgICAgIG9uQW5jaG9yKHJlcywgY291bnQpO1xuICAgICAgICByZXR1cm4gdHlwZW9mIHJldml2ZXIgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgID8gYXBwbHlSZXZpdmVyKHJldml2ZXIsIHsgJyc6IHJlcyB9LCAnJywgcmVzKVxuICAgICAgICAgICAgOiByZXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgSlNPTiByZXByZXNlbnRhdGlvbiBvZiB0aGUgZG9jdW1lbnQgYGNvbnRlbnRzYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBqc29uQXJnIFVzZWQgYnkgYEpTT04uc3RyaW5naWZ5YCB0byBpbmRpY2F0ZSB0aGUgYXJyYXkgaW5kZXggb3JcbiAgICAgKiAgIHByb3BlcnR5IG5hbWUuXG4gICAgICovXG4gICAgdG9KU09OKGpzb25BcmcsIG9uQW5jaG9yKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRvSlMoeyBqc29uOiB0cnVlLCBqc29uQXJnLCBtYXBBc01hcDogZmFsc2UsIG9uQW5jaG9yIH0pO1xuICAgIH1cbiAgICAvKiogQSBZQU1MIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBkb2N1bWVudC4gKi9cbiAgICB0b1N0cmluZyhvcHRpb25zID0ge30pIHtcbiAgICAgICAgaWYgKHRoaXMuZXJyb3JzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RvY3VtZW50IHdpdGggZXJyb3JzIGNhbm5vdCBiZSBzdHJpbmdpZmllZCcpO1xuICAgICAgICBpZiAoJ2luZGVudCcgaW4gb3B0aW9ucyAmJlxuICAgICAgICAgICAgKCFOdW1iZXIuaXNJbnRlZ2VyKG9wdGlvbnMuaW5kZW50KSB8fCBOdW1iZXIob3B0aW9ucy5pbmRlbnQpIDw9IDApKSB7XG4gICAgICAgICAgICBjb25zdCBzID0gSlNPTi5zdHJpbmdpZnkob3B0aW9ucy5pbmRlbnQpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBcImluZGVudFwiIG9wdGlvbiBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciwgbm90ICR7c31gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RyaW5naWZ5RG9jdW1lbnQodGhpcywgb3B0aW9ucyk7XG4gICAgfVxufVxuZnVuY3Rpb24gYXNzZXJ0Q29sbGVjdGlvbihjb250ZW50cykge1xuICAgIGlmIChpc0NvbGxlY3Rpb24oY29udGVudHMpKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGEgWUFNTCBjb2xsZWN0aW9uIGFzIGRvY3VtZW50IGNvbnRlbnRzJyk7XG59XG5cbmV4cG9ydCB7IERvY3VtZW50IH07XG4iLCJjbGFzcyBZQU1MRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IobmFtZSwgcG9zLCBjb2RlLCBtZXNzYWdlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgICAgIHRoaXMucG9zID0gcG9zO1xuICAgIH1cbn1cbmNsYXNzIFlBTUxQYXJzZUVycm9yIGV4dGVuZHMgWUFNTEVycm9yIHtcbiAgICBjb25zdHJ1Y3Rvcihwb3MsIGNvZGUsIG1lc3NhZ2UpIHtcbiAgICAgICAgc3VwZXIoJ1lBTUxQYXJzZUVycm9yJywgcG9zLCBjb2RlLCBtZXNzYWdlKTtcbiAgICB9XG59XG5jbGFzcyBZQU1MV2FybmluZyBleHRlbmRzIFlBTUxFcnJvciB7XG4gICAgY29uc3RydWN0b3IocG9zLCBjb2RlLCBtZXNzYWdlKSB7XG4gICAgICAgIHN1cGVyKCdZQU1MV2FybmluZycsIHBvcywgY29kZSwgbWVzc2FnZSk7XG4gICAgfVxufVxuY29uc3QgcHJldHRpZnlFcnJvciA9IChzcmMsIGxjKSA9PiAoZXJyb3IpID0+IHtcbiAgICBpZiAoZXJyb3IucG9zWzBdID09PSAtMSlcbiAgICAgICAgcmV0dXJuO1xuICAgIGVycm9yLmxpbmVQb3MgPSBlcnJvci5wb3MubWFwKHBvcyA9PiBsYy5saW5lUG9zKHBvcykpO1xuICAgIGNvbnN0IHsgbGluZSwgY29sIH0gPSBlcnJvci5saW5lUG9zWzBdO1xuICAgIGVycm9yLm1lc3NhZ2UgKz0gYCBhdCBsaW5lICR7bGluZX0sIGNvbHVtbiAke2NvbH1gO1xuICAgIGxldCBjaSA9IGNvbCAtIDE7XG4gICAgbGV0IGxpbmVTdHIgPSBzcmNcbiAgICAgICAgLnN1YnN0cmluZyhsYy5saW5lU3RhcnRzW2xpbmUgLSAxXSwgbGMubGluZVN0YXJ0c1tsaW5lXSlcbiAgICAgICAgLnJlcGxhY2UoL1tcXG5cXHJdKyQvLCAnJyk7XG4gICAgLy8gVHJpbSB0byBtYXggODAgY2hhcnMsIGtlZXBpbmcgY29sIHBvc2l0aW9uIG5lYXIgdGhlIG1pZGRsZVxuICAgIGlmIChjaSA+PSA2MCAmJiBsaW5lU3RyLmxlbmd0aCA+IDgwKSB7XG4gICAgICAgIGNvbnN0IHRyaW1TdGFydCA9IE1hdGgubWluKGNpIC0gMzksIGxpbmVTdHIubGVuZ3RoIC0gNzkpO1xuICAgICAgICBsaW5lU3RyID0gJ+KApicgKyBsaW5lU3RyLnN1YnN0cmluZyh0cmltU3RhcnQpO1xuICAgICAgICBjaSAtPSB0cmltU3RhcnQgLSAxO1xuICAgIH1cbiAgICBpZiAobGluZVN0ci5sZW5ndGggPiA4MClcbiAgICAgICAgbGluZVN0ciA9IGxpbmVTdHIuc3Vic3RyaW5nKDAsIDc5KSArICfigKYnO1xuICAgIC8vIEluY2x1ZGUgcHJldmlvdXMgbGluZSBpbiBjb250ZXh0IGlmIHBvaW50aW5nIGF0IGxpbmUgc3RhcnRcbiAgICBpZiAobGluZSA+IDEgJiYgL14gKiQvLnRlc3QobGluZVN0ci5zdWJzdHJpbmcoMCwgY2kpKSkge1xuICAgICAgICAvLyBSZWdleHAgd29uJ3QgbWF0Y2ggaWYgc3RhcnQgaXMgdHJpbW1lZFxuICAgICAgICBsZXQgcHJldiA9IHNyYy5zdWJzdHJpbmcobGMubGluZVN0YXJ0c1tsaW5lIC0gMl0sIGxjLmxpbmVTdGFydHNbbGluZSAtIDFdKTtcbiAgICAgICAgaWYgKHByZXYubGVuZ3RoID4gODApXG4gICAgICAgICAgICBwcmV2ID0gcHJldi5zdWJzdHJpbmcoMCwgNzkpICsgJ+KAplxcbic7XG4gICAgICAgIGxpbmVTdHIgPSBwcmV2ICsgbGluZVN0cjtcbiAgICB9XG4gICAgaWYgKC9bXiBdLy50ZXN0KGxpbmVTdHIpKSB7XG4gICAgICAgIGxldCBjb3VudCA9IDE7XG4gICAgICAgIGNvbnN0IGVuZCA9IGVycm9yLmxpbmVQb3NbMV07XG4gICAgICAgIGlmIChlbmQ/LmxpbmUgPT09IGxpbmUgJiYgZW5kLmNvbCA+IGNvbCkge1xuICAgICAgICAgICAgY291bnQgPSBNYXRoLm1heCgxLCBNYXRoLm1pbihlbmQuY29sIC0gY29sLCA4MCAtIGNpKSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcG9pbnRlciA9ICcgJy5yZXBlYXQoY2kpICsgJ14nLnJlcGVhdChjb3VudCk7XG4gICAgICAgIGVycm9yLm1lc3NhZ2UgKz0gYDpcXG5cXG4ke2xpbmVTdHJ9XFxuJHtwb2ludGVyfVxcbmA7XG4gICAgfVxufTtcblxuZXhwb3J0IHsgWUFNTEVycm9yLCBZQU1MUGFyc2VFcnJvciwgWUFNTFdhcm5pbmcsIHByZXR0aWZ5RXJyb3IgfTtcbiIsImZ1bmN0aW9uIHJlc29sdmVQcm9wcyh0b2tlbnMsIHsgZmxvdywgaW5kaWNhdG9yLCBuZXh0LCBvZmZzZXQsIG9uRXJyb3IsIHBhcmVudEluZGVudCwgc3RhcnRPbk5ld2xpbmUgfSkge1xuICAgIGxldCBzcGFjZUJlZm9yZSA9IGZhbHNlO1xuICAgIGxldCBhdE5ld2xpbmUgPSBzdGFydE9uTmV3bGluZTtcbiAgICBsZXQgaGFzU3BhY2UgPSBzdGFydE9uTmV3bGluZTtcbiAgICBsZXQgY29tbWVudCA9ICcnO1xuICAgIGxldCBjb21tZW50U2VwID0gJyc7XG4gICAgbGV0IGhhc05ld2xpbmUgPSBmYWxzZTtcbiAgICBsZXQgcmVxU3BhY2UgPSBmYWxzZTtcbiAgICBsZXQgdGFiID0gbnVsbDtcbiAgICBsZXQgYW5jaG9yID0gbnVsbDtcbiAgICBsZXQgdGFnID0gbnVsbDtcbiAgICBsZXQgbmV3bGluZUFmdGVyUHJvcCA9IG51bGw7XG4gICAgbGV0IGNvbW1hID0gbnVsbDtcbiAgICBsZXQgZm91bmQgPSBudWxsO1xuICAgIGxldCBzdGFydCA9IG51bGw7XG4gICAgZm9yIChjb25zdCB0b2tlbiBvZiB0b2tlbnMpIHtcbiAgICAgICAgaWYgKHJlcVNwYWNlKSB7XG4gICAgICAgICAgICBpZiAodG9rZW4udHlwZSAhPT0gJ3NwYWNlJyAmJlxuICAgICAgICAgICAgICAgIHRva2VuLnR5cGUgIT09ICduZXdsaW5lJyAmJlxuICAgICAgICAgICAgICAgIHRva2VuLnR5cGUgIT09ICdjb21tYScpXG4gICAgICAgICAgICAgICAgb25FcnJvcih0b2tlbi5vZmZzZXQsICdNSVNTSU5HX0NIQVInLCAnVGFncyBhbmQgYW5jaG9ycyBtdXN0IGJlIHNlcGFyYXRlZCBmcm9tIHRoZSBuZXh0IHRva2VuIGJ5IHdoaXRlIHNwYWNlJyk7XG4gICAgICAgICAgICByZXFTcGFjZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0YWIpIHtcbiAgICAgICAgICAgIGlmIChhdE5ld2xpbmUgJiYgdG9rZW4udHlwZSAhPT0gJ2NvbW1lbnQnICYmIHRva2VuLnR5cGUgIT09ICduZXdsaW5lJykge1xuICAgICAgICAgICAgICAgIG9uRXJyb3IodGFiLCAnVEFCX0FTX0lOREVOVCcsICdUYWJzIGFyZSBub3QgYWxsb3dlZCBhcyBpbmRlbnRhdGlvbicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGFiID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBzd2l0Y2ggKHRva2VuLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ3NwYWNlJzpcbiAgICAgICAgICAgICAgICAvLyBBdCB0aGUgZG9jIGxldmVsLCB0YWJzIGF0IGxpbmUgc3RhcnQgbWF5IGJlIHBhcnNlZFxuICAgICAgICAgICAgICAgIC8vIGFzIGxlYWRpbmcgd2hpdGUgc3BhY2UgcmF0aGVyIHRoYW4gaW5kZW50YXRpb24uXG4gICAgICAgICAgICAgICAgLy8gSW4gYSBmbG93IGNvbGxlY3Rpb24sIG9ubHkgdGhlIHBhcnNlciBoYW5kbGVzIGluZGVudC5cbiAgICAgICAgICAgICAgICBpZiAoIWZsb3cgJiZcbiAgICAgICAgICAgICAgICAgICAgKGluZGljYXRvciAhPT0gJ2RvYy1zdGFydCcgfHwgbmV4dD8udHlwZSAhPT0gJ2Zsb3ctY29sbGVjdGlvbicpICYmXG4gICAgICAgICAgICAgICAgICAgIHRva2VuLnNvdXJjZS5pbmNsdWRlcygnXFx0JykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGFiID0gdG9rZW47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGhhc1NwYWNlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2NvbW1lbnQnOiB7XG4gICAgICAgICAgICAgICAgaWYgKCFoYXNTcGFjZSlcbiAgICAgICAgICAgICAgICAgICAgb25FcnJvcih0b2tlbiwgJ01JU1NJTkdfQ0hBUicsICdDb21tZW50cyBtdXN0IGJlIHNlcGFyYXRlZCBmcm9tIG90aGVyIHRva2VucyBieSB3aGl0ZSBzcGFjZSBjaGFyYWN0ZXJzJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgY2IgPSB0b2tlbi5zb3VyY2Uuc3Vic3RyaW5nKDEpIHx8ICcgJztcbiAgICAgICAgICAgICAgICBpZiAoIWNvbW1lbnQpXG4gICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBjYjtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgKz0gY29tbWVudFNlcCArIGNiO1xuICAgICAgICAgICAgICAgIGNvbW1lbnRTZXAgPSAnJztcbiAgICAgICAgICAgICAgICBhdE5ld2xpbmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ25ld2xpbmUnOlxuICAgICAgICAgICAgICAgIGlmIChhdE5ld2xpbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbW1lbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50ICs9IHRva2VuLnNvdXJjZTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIWZvdW5kIHx8IGluZGljYXRvciAhPT0gJ3NlcS1pdGVtLWluZCcpXG4gICAgICAgICAgICAgICAgICAgICAgICBzcGFjZUJlZm9yZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgY29tbWVudFNlcCArPSB0b2tlbi5zb3VyY2U7XG4gICAgICAgICAgICAgICAgYXROZXdsaW5lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBoYXNOZXdsaW5lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAoYW5jaG9yIHx8IHRhZylcbiAgICAgICAgICAgICAgICAgICAgbmV3bGluZUFmdGVyUHJvcCA9IHRva2VuO1xuICAgICAgICAgICAgICAgIGhhc1NwYWNlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2FuY2hvcic6XG4gICAgICAgICAgICAgICAgaWYgKGFuY2hvcilcbiAgICAgICAgICAgICAgICAgICAgb25FcnJvcih0b2tlbiwgJ01VTFRJUExFX0FOQ0hPUlMnLCAnQSBub2RlIGNhbiBoYXZlIGF0IG1vc3Qgb25lIGFuY2hvcicpO1xuICAgICAgICAgICAgICAgIGlmICh0b2tlbi5zb3VyY2UuZW5kc1dpdGgoJzonKSlcbiAgICAgICAgICAgICAgICAgICAgb25FcnJvcih0b2tlbi5vZmZzZXQgKyB0b2tlbi5zb3VyY2UubGVuZ3RoIC0gMSwgJ0JBRF9BTElBUycsICdBbmNob3IgZW5kaW5nIGluIDogaXMgYW1iaWd1b3VzJywgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgYW5jaG9yID0gdG9rZW47XG4gICAgICAgICAgICAgICAgc3RhcnQgPz8gKHN0YXJ0ID0gdG9rZW4ub2Zmc2V0KTtcbiAgICAgICAgICAgICAgICBhdE5ld2xpbmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBoYXNTcGFjZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHJlcVNwYWNlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3RhZyc6IHtcbiAgICAgICAgICAgICAgICBpZiAodGFnKVxuICAgICAgICAgICAgICAgICAgICBvbkVycm9yKHRva2VuLCAnTVVMVElQTEVfVEFHUycsICdBIG5vZGUgY2FuIGhhdmUgYXQgbW9zdCBvbmUgdGFnJyk7XG4gICAgICAgICAgICAgICAgdGFnID0gdG9rZW47XG4gICAgICAgICAgICAgICAgc3RhcnQgPz8gKHN0YXJ0ID0gdG9rZW4ub2Zmc2V0KTtcbiAgICAgICAgICAgICAgICBhdE5ld2xpbmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBoYXNTcGFjZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHJlcVNwYWNlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgaW5kaWNhdG9yOlxuICAgICAgICAgICAgICAgIC8vIENvdWxkIGhlcmUgaGFuZGxlIHByZWNlZGluZyBjb21tZW50cyBkaWZmZXJlbnRseVxuICAgICAgICAgICAgICAgIGlmIChhbmNob3IgfHwgdGFnKVxuICAgICAgICAgICAgICAgICAgICBvbkVycm9yKHRva2VuLCAnQkFEX1BST1BfT1JERVInLCBgQW5jaG9ycyBhbmQgdGFncyBtdXN0IGJlIGFmdGVyIHRoZSAke3Rva2VuLnNvdXJjZX0gaW5kaWNhdG9yYCk7XG4gICAgICAgICAgICAgICAgaWYgKGZvdW5kKVxuICAgICAgICAgICAgICAgICAgICBvbkVycm9yKHRva2VuLCAnVU5FWFBFQ1RFRF9UT0tFTicsIGBVbmV4cGVjdGVkICR7dG9rZW4uc291cmNlfSBpbiAke2Zsb3cgPz8gJ2NvbGxlY3Rpb24nfWApO1xuICAgICAgICAgICAgICAgIGZvdW5kID0gdG9rZW47XG4gICAgICAgICAgICAgICAgYXROZXdsaW5lID1cbiAgICAgICAgICAgICAgICAgICAgaW5kaWNhdG9yID09PSAnc2VxLWl0ZW0taW5kJyB8fCBpbmRpY2F0b3IgPT09ICdleHBsaWNpdC1rZXktaW5kJztcbiAgICAgICAgICAgICAgICBoYXNTcGFjZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnY29tbWEnOlxuICAgICAgICAgICAgICAgIGlmIChmbG93KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb21tYSlcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uRXJyb3IodG9rZW4sICdVTkVYUEVDVEVEX1RPS0VOJywgYFVuZXhwZWN0ZWQgLCBpbiAke2Zsb3d9YCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbW1hID0gdG9rZW47XG4gICAgICAgICAgICAgICAgICAgIGF0TmV3bGluZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBoYXNTcGFjZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBlbHNlIGZhbGx0aHJvdWdoXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIG9uRXJyb3IodG9rZW4sICdVTkVYUEVDVEVEX1RPS0VOJywgYFVuZXhwZWN0ZWQgJHt0b2tlbi50eXBlfSB0b2tlbmApO1xuICAgICAgICAgICAgICAgIGF0TmV3bGluZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGhhc1NwYWNlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbGFzdCA9IHRva2Vuc1t0b2tlbnMubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgZW5kID0gbGFzdCA/IGxhc3Qub2Zmc2V0ICsgbGFzdC5zb3VyY2UubGVuZ3RoIDogb2Zmc2V0O1xuICAgIGlmIChyZXFTcGFjZSAmJlxuICAgICAgICBuZXh0ICYmXG4gICAgICAgIG5leHQudHlwZSAhPT0gJ3NwYWNlJyAmJlxuICAgICAgICBuZXh0LnR5cGUgIT09ICduZXdsaW5lJyAmJlxuICAgICAgICBuZXh0LnR5cGUgIT09ICdjb21tYScgJiZcbiAgICAgICAgKG5leHQudHlwZSAhPT0gJ3NjYWxhcicgfHwgbmV4dC5zb3VyY2UgIT09ICcnKSkge1xuICAgICAgICBvbkVycm9yKG5leHQub2Zmc2V0LCAnTUlTU0lOR19DSEFSJywgJ1RhZ3MgYW5kIGFuY2hvcnMgbXVzdCBiZSBzZXBhcmF0ZWQgZnJvbSB0aGUgbmV4dCB0b2tlbiBieSB3aGl0ZSBzcGFjZScpO1xuICAgIH1cbiAgICBpZiAodGFiICYmXG4gICAgICAgICgoYXROZXdsaW5lICYmIHRhYi5pbmRlbnQgPD0gcGFyZW50SW5kZW50KSB8fFxuICAgICAgICAgICAgbmV4dD8udHlwZSA9PT0gJ2Jsb2NrLW1hcCcgfHxcbiAgICAgICAgICAgIG5leHQ/LnR5cGUgPT09ICdibG9jay1zZXEnKSlcbiAgICAgICAgb25FcnJvcih0YWIsICdUQUJfQVNfSU5ERU5UJywgJ1RhYnMgYXJlIG5vdCBhbGxvd2VkIGFzIGluZGVudGF0aW9uJyk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY29tbWEsXG4gICAgICAgIGZvdW5kLFxuICAgICAgICBzcGFjZUJlZm9yZSxcbiAgICAgICAgY29tbWVudCxcbiAgICAgICAgaGFzTmV3bGluZSxcbiAgICAgICAgYW5jaG9yLFxuICAgICAgICB0YWcsXG4gICAgICAgIG5ld2xpbmVBZnRlclByb3AsXG4gICAgICAgIGVuZCxcbiAgICAgICAgc3RhcnQ6IHN0YXJ0ID8/IGVuZFxuICAgIH07XG59XG5cbmV4cG9ydCB7IHJlc29sdmVQcm9wcyB9O1xuIiwiZnVuY3Rpb24gY29udGFpbnNOZXdsaW5lKGtleSkge1xuICAgIGlmICgha2V5KVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBzd2l0Y2ggKGtleS50eXBlKSB7XG4gICAgICAgIGNhc2UgJ2FsaWFzJzpcbiAgICAgICAgY2FzZSAnc2NhbGFyJzpcbiAgICAgICAgY2FzZSAnZG91YmxlLXF1b3RlZC1zY2FsYXInOlxuICAgICAgICBjYXNlICdzaW5nbGUtcXVvdGVkLXNjYWxhcic6XG4gICAgICAgICAgICBpZiAoa2V5LnNvdXJjZS5pbmNsdWRlcygnXFxuJykpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBpZiAoa2V5LmVuZClcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHN0IG9mIGtleS5lbmQpXG4gICAgICAgICAgICAgICAgICAgIGlmIChzdC50eXBlID09PSAnbmV3bGluZScpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgY2FzZSAnZmxvdy1jb2xsZWN0aW9uJzpcbiAgICAgICAgICAgIGZvciAoY29uc3QgaXQgb2Yga2V5Lml0ZW1zKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBzdCBvZiBpdC5zdGFydClcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0LnR5cGUgPT09ICduZXdsaW5lJylcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIGlmIChpdC5zZXApXG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc3Qgb2YgaXQuc2VwKVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0LnR5cGUgPT09ICduZXdsaW5lJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAoY29udGFpbnNOZXdsaW5lKGl0LmtleSkgfHwgY29udGFpbnNOZXdsaW5lKGl0LnZhbHVlKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59XG5cbmV4cG9ydCB7IGNvbnRhaW5zTmV3bGluZSB9O1xuIiwiaW1wb3J0IHsgY29udGFpbnNOZXdsaW5lIH0gZnJvbSAnLi91dGlsLWNvbnRhaW5zLW5ld2xpbmUuanMnO1xuXG5mdW5jdGlvbiBmbG93SW5kZW50Q2hlY2soaW5kZW50LCBmYywgb25FcnJvcikge1xuICAgIGlmIChmYz8udHlwZSA9PT0gJ2Zsb3ctY29sbGVjdGlvbicpIHtcbiAgICAgICAgY29uc3QgZW5kID0gZmMuZW5kWzBdO1xuICAgICAgICBpZiAoZW5kLmluZGVudCA9PT0gaW5kZW50ICYmXG4gICAgICAgICAgICAoZW5kLnNvdXJjZSA9PT0gJ10nIHx8IGVuZC5zb3VyY2UgPT09ICd9JykgJiZcbiAgICAgICAgICAgIGNvbnRhaW5zTmV3bGluZShmYykpIHtcbiAgICAgICAgICAgIGNvbnN0IG1zZyA9ICdGbG93IGVuZCBpbmRpY2F0b3Igc2hvdWxkIGJlIG1vcmUgaW5kZW50ZWQgdGhhbiBwYXJlbnQnO1xuICAgICAgICAgICAgb25FcnJvcihlbmQsICdCQURfSU5ERU5UJywgbXNnLCB0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IHsgZmxvd0luZGVudENoZWNrIH07XG4iLCJpbXBvcnQgeyBpc1NjYWxhciB9IGZyb20gJy4uL25vZGVzL2lkZW50aXR5LmpzJztcblxuZnVuY3Rpb24gbWFwSW5jbHVkZXMoY3R4LCBpdGVtcywgc2VhcmNoKSB7XG4gICAgY29uc3QgeyB1bmlxdWVLZXlzIH0gPSBjdHgub3B0aW9ucztcbiAgICBpZiAodW5pcXVlS2V5cyA9PT0gZmFsc2UpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBpc0VxdWFsID0gdHlwZW9mIHVuaXF1ZUtleXMgPT09ICdmdW5jdGlvbidcbiAgICAgICAgPyB1bmlxdWVLZXlzXG4gICAgICAgIDogKGEsIGIpID0+IGEgPT09IGIgfHwgKGlzU2NhbGFyKGEpICYmIGlzU2NhbGFyKGIpICYmIGEudmFsdWUgPT09IGIudmFsdWUpO1xuICAgIHJldHVybiBpdGVtcy5zb21lKHBhaXIgPT4gaXNFcXVhbChwYWlyLmtleSwgc2VhcmNoKSk7XG59XG5cbmV4cG9ydCB7IG1hcEluY2x1ZGVzIH07XG4iLCJpbXBvcnQgeyBQYWlyIH0gZnJvbSAnLi4vbm9kZXMvUGFpci5qcyc7XG5pbXBvcnQgeyBZQU1MTWFwIH0gZnJvbSAnLi4vbm9kZXMvWUFNTE1hcC5qcyc7XG5pbXBvcnQgeyByZXNvbHZlUHJvcHMgfSBmcm9tICcuL3Jlc29sdmUtcHJvcHMuanMnO1xuaW1wb3J0IHsgY29udGFpbnNOZXdsaW5lIH0gZnJvbSAnLi91dGlsLWNvbnRhaW5zLW5ld2xpbmUuanMnO1xuaW1wb3J0IHsgZmxvd0luZGVudENoZWNrIH0gZnJvbSAnLi91dGlsLWZsb3ctaW5kZW50LWNoZWNrLmpzJztcbmltcG9ydCB7IG1hcEluY2x1ZGVzIH0gZnJvbSAnLi91dGlsLW1hcC1pbmNsdWRlcy5qcyc7XG5cbmNvbnN0IHN0YXJ0Q29sTXNnID0gJ0FsbCBtYXBwaW5nIGl0ZW1zIG11c3Qgc3RhcnQgYXQgdGhlIHNhbWUgY29sdW1uJztcbmZ1bmN0aW9uIHJlc29sdmVCbG9ja01hcCh7IGNvbXBvc2VOb2RlLCBjb21wb3NlRW1wdHlOb2RlIH0sIGN0eCwgYm0sIG9uRXJyb3IsIHRhZykge1xuICAgIGNvbnN0IE5vZGVDbGFzcyA9IHRhZz8ubm9kZUNsYXNzID8/IFlBTUxNYXA7XG4gICAgY29uc3QgbWFwID0gbmV3IE5vZGVDbGFzcyhjdHguc2NoZW1hKTtcbiAgICBpZiAoY3R4LmF0Um9vdClcbiAgICAgICAgY3R4LmF0Um9vdCA9IGZhbHNlO1xuICAgIGxldCBvZmZzZXQgPSBibS5vZmZzZXQ7XG4gICAgbGV0IGNvbW1lbnRFbmQgPSBudWxsO1xuICAgIGZvciAoY29uc3QgY29sbEl0ZW0gb2YgYm0uaXRlbXMpIHtcbiAgICAgICAgY29uc3QgeyBzdGFydCwga2V5LCBzZXAsIHZhbHVlIH0gPSBjb2xsSXRlbTtcbiAgICAgICAgLy8ga2V5IHByb3BlcnRpZXNcbiAgICAgICAgY29uc3Qga2V5UHJvcHMgPSByZXNvbHZlUHJvcHMoc3RhcnQsIHtcbiAgICAgICAgICAgIGluZGljYXRvcjogJ2V4cGxpY2l0LWtleS1pbmQnLFxuICAgICAgICAgICAgbmV4dDoga2V5ID8/IHNlcD8uWzBdLFxuICAgICAgICAgICAgb2Zmc2V0LFxuICAgICAgICAgICAgb25FcnJvcixcbiAgICAgICAgICAgIHBhcmVudEluZGVudDogYm0uaW5kZW50LFxuICAgICAgICAgICAgc3RhcnRPbk5ld2xpbmU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGltcGxpY2l0S2V5ID0gIWtleVByb3BzLmZvdW5kO1xuICAgICAgICBpZiAoaW1wbGljaXRLZXkpIHtcbiAgICAgICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICAgICAgICBpZiAoa2V5LnR5cGUgPT09ICdibG9jay1zZXEnKVxuICAgICAgICAgICAgICAgICAgICBvbkVycm9yKG9mZnNldCwgJ0JMT0NLX0FTX0lNUExJQ0lUX0tFWScsICdBIGJsb2NrIHNlcXVlbmNlIG1heSBub3QgYmUgdXNlZCBhcyBhbiBpbXBsaWNpdCBtYXAga2V5Jyk7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoJ2luZGVudCcgaW4ga2V5ICYmIGtleS5pbmRlbnQgIT09IGJtLmluZGVudClcbiAgICAgICAgICAgICAgICAgICAgb25FcnJvcihvZmZzZXQsICdCQURfSU5ERU5UJywgc3RhcnRDb2xNc2cpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFrZXlQcm9wcy5hbmNob3IgJiYgIWtleVByb3BzLnRhZyAmJiAhc2VwKSB7XG4gICAgICAgICAgICAgICAgY29tbWVudEVuZCA9IGtleVByb3BzLmVuZDtcbiAgICAgICAgICAgICAgICBpZiAoa2V5UHJvcHMuY29tbWVudCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWFwLmNvbW1lbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAuY29tbWVudCArPSAnXFxuJyArIGtleVByb3BzLmNvbW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcC5jb21tZW50ID0ga2V5UHJvcHMuY29tbWVudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoa2V5UHJvcHMubmV3bGluZUFmdGVyUHJvcCB8fCBjb250YWluc05ld2xpbmUoa2V5KSkge1xuICAgICAgICAgICAgICAgIG9uRXJyb3Ioa2V5ID8/IHN0YXJ0W3N0YXJ0Lmxlbmd0aCAtIDFdLCAnTVVMVElMSU5FX0lNUExJQ0lUX0tFWScsICdJbXBsaWNpdCBrZXlzIG5lZWQgdG8gYmUgb24gYSBzaW5nbGUgbGluZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGtleVByb3BzLmZvdW5kPy5pbmRlbnQgIT09IGJtLmluZGVudCkge1xuICAgICAgICAgICAgb25FcnJvcihvZmZzZXQsICdCQURfSU5ERU5UJywgc3RhcnRDb2xNc2cpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGtleSB2YWx1ZVxuICAgICAgICBjdHguYXRLZXkgPSB0cnVlO1xuICAgICAgICBjb25zdCBrZXlTdGFydCA9IGtleVByb3BzLmVuZDtcbiAgICAgICAgY29uc3Qga2V5Tm9kZSA9IGtleVxuICAgICAgICAgICAgPyBjb21wb3NlTm9kZShjdHgsIGtleSwga2V5UHJvcHMsIG9uRXJyb3IpXG4gICAgICAgICAgICA6IGNvbXBvc2VFbXB0eU5vZGUoY3R4LCBrZXlTdGFydCwgc3RhcnQsIG51bGwsIGtleVByb3BzLCBvbkVycm9yKTtcbiAgICAgICAgaWYgKGN0eC5zY2hlbWEuY29tcGF0KVxuICAgICAgICAgICAgZmxvd0luZGVudENoZWNrKGJtLmluZGVudCwga2V5LCBvbkVycm9yKTtcbiAgICAgICAgY3R4LmF0S2V5ID0gZmFsc2U7XG4gICAgICAgIGlmIChtYXBJbmNsdWRlcyhjdHgsIG1hcC5pdGVtcywga2V5Tm9kZSkpXG4gICAgICAgICAgICBvbkVycm9yKGtleVN0YXJ0LCAnRFVQTElDQVRFX0tFWScsICdNYXAga2V5cyBtdXN0IGJlIHVuaXF1ZScpO1xuICAgICAgICAvLyB2YWx1ZSBwcm9wZXJ0aWVzXG4gICAgICAgIGNvbnN0IHZhbHVlUHJvcHMgPSByZXNvbHZlUHJvcHMoc2VwID8/IFtdLCB7XG4gICAgICAgICAgICBpbmRpY2F0b3I6ICdtYXAtdmFsdWUtaW5kJyxcbiAgICAgICAgICAgIG5leHQ6IHZhbHVlLFxuICAgICAgICAgICAgb2Zmc2V0OiBrZXlOb2RlLnJhbmdlWzJdLFxuICAgICAgICAgICAgb25FcnJvcixcbiAgICAgICAgICAgIHBhcmVudEluZGVudDogYm0uaW5kZW50LFxuICAgICAgICAgICAgc3RhcnRPbk5ld2xpbmU6ICFrZXkgfHwga2V5LnR5cGUgPT09ICdibG9jay1zY2FsYXInXG4gICAgICAgIH0pO1xuICAgICAgICBvZmZzZXQgPSB2YWx1ZVByb3BzLmVuZDtcbiAgICAgICAgaWYgKHZhbHVlUHJvcHMuZm91bmQpIHtcbiAgICAgICAgICAgIGlmIChpbXBsaWNpdEtleSkge1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZT8udHlwZSA9PT0gJ2Jsb2NrLW1hcCcgJiYgIXZhbHVlUHJvcHMuaGFzTmV3bGluZSlcbiAgICAgICAgICAgICAgICAgICAgb25FcnJvcihvZmZzZXQsICdCTE9DS19BU19JTVBMSUNJVF9LRVknLCAnTmVzdGVkIG1hcHBpbmdzIGFyZSBub3QgYWxsb3dlZCBpbiBjb21wYWN0IG1hcHBpbmdzJyk7XG4gICAgICAgICAgICAgICAgaWYgKGN0eC5vcHRpb25zLnN0cmljdCAmJlxuICAgICAgICAgICAgICAgICAgICBrZXlQcm9wcy5zdGFydCA8IHZhbHVlUHJvcHMuZm91bmQub2Zmc2V0IC0gMTAyNClcbiAgICAgICAgICAgICAgICAgICAgb25FcnJvcihrZXlOb2RlLnJhbmdlLCAnS0VZX09WRVJfMTAyNF9DSEFSUycsICdUaGUgOiBpbmRpY2F0b3IgbXVzdCBiZSBhdCBtb3N0IDEwMjQgY2hhcnMgYWZ0ZXIgdGhlIHN0YXJ0IG9mIGFuIGltcGxpY2l0IGJsb2NrIG1hcHBpbmcga2V5Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyB2YWx1ZSB2YWx1ZVxuICAgICAgICAgICAgY29uc3QgdmFsdWVOb2RlID0gdmFsdWVcbiAgICAgICAgICAgICAgICA/IGNvbXBvc2VOb2RlKGN0eCwgdmFsdWUsIHZhbHVlUHJvcHMsIG9uRXJyb3IpXG4gICAgICAgICAgICAgICAgOiBjb21wb3NlRW1wdHlOb2RlKGN0eCwgb2Zmc2V0LCBzZXAsIG51bGwsIHZhbHVlUHJvcHMsIG9uRXJyb3IpO1xuICAgICAgICAgICAgaWYgKGN0eC5zY2hlbWEuY29tcGF0KVxuICAgICAgICAgICAgICAgIGZsb3dJbmRlbnRDaGVjayhibS5pbmRlbnQsIHZhbHVlLCBvbkVycm9yKTtcbiAgICAgICAgICAgIG9mZnNldCA9IHZhbHVlTm9kZS5yYW5nZVsyXTtcbiAgICAgICAgICAgIGNvbnN0IHBhaXIgPSBuZXcgUGFpcihrZXlOb2RlLCB2YWx1ZU5vZGUpO1xuICAgICAgICAgICAgaWYgKGN0eC5vcHRpb25zLmtlZXBTb3VyY2VUb2tlbnMpXG4gICAgICAgICAgICAgICAgcGFpci5zcmNUb2tlbiA9IGNvbGxJdGVtO1xuICAgICAgICAgICAgbWFwLml0ZW1zLnB1c2gocGFpcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBrZXkgd2l0aCBubyB2YWx1ZVxuICAgICAgICAgICAgaWYgKGltcGxpY2l0S2V5KVxuICAgICAgICAgICAgICAgIG9uRXJyb3Ioa2V5Tm9kZS5yYW5nZSwgJ01JU1NJTkdfQ0hBUicsICdJbXBsaWNpdCBtYXAga2V5cyBuZWVkIHRvIGJlIGZvbGxvd2VkIGJ5IG1hcCB2YWx1ZXMnKTtcbiAgICAgICAgICAgIGlmICh2YWx1ZVByb3BzLmNvbW1lbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoa2V5Tm9kZS5jb21tZW50KVxuICAgICAgICAgICAgICAgICAgICBrZXlOb2RlLmNvbW1lbnQgKz0gJ1xcbicgKyB2YWx1ZVByb3BzLmNvbW1lbnQ7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBrZXlOb2RlLmNvbW1lbnQgPSB2YWx1ZVByb3BzLmNvbW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBwYWlyID0gbmV3IFBhaXIoa2V5Tm9kZSk7XG4gICAgICAgICAgICBpZiAoY3R4Lm9wdGlvbnMua2VlcFNvdXJjZVRva2VucylcbiAgICAgICAgICAgICAgICBwYWlyLnNyY1Rva2VuID0gY29sbEl0ZW07XG4gICAgICAgICAgICBtYXAuaXRlbXMucHVzaChwYWlyKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoY29tbWVudEVuZCAmJiBjb21tZW50RW5kIDwgb2Zmc2V0KVxuICAgICAgICBvbkVycm9yKGNvbW1lbnRFbmQsICdJTVBPU1NJQkxFJywgJ01hcCBjb21tZW50IHdpdGggdHJhaWxpbmcgY29udGVudCcpO1xuICAgIG1hcC5yYW5nZSA9IFtibS5vZmZzZXQsIG9mZnNldCwgY29tbWVudEVuZCA/PyBvZmZzZXRdO1xuICAgIHJldHVybiBtYXA7XG59XG5cbmV4cG9ydCB7IHJlc29sdmVCbG9ja01hcCB9O1xuIiwiaW1wb3J0IHsgWUFNTFNlcSB9IGZyb20gJy4uL25vZGVzL1lBTUxTZXEuanMnO1xuaW1wb3J0IHsgcmVzb2x2ZVByb3BzIH0gZnJvbSAnLi9yZXNvbHZlLXByb3BzLmpzJztcbmltcG9ydCB7IGZsb3dJbmRlbnRDaGVjayB9IGZyb20gJy4vdXRpbC1mbG93LWluZGVudC1jaGVjay5qcyc7XG5cbmZ1bmN0aW9uIHJlc29sdmVCbG9ja1NlcSh7IGNvbXBvc2VOb2RlLCBjb21wb3NlRW1wdHlOb2RlIH0sIGN0eCwgYnMsIG9uRXJyb3IsIHRhZykge1xuICAgIGNvbnN0IE5vZGVDbGFzcyA9IHRhZz8ubm9kZUNsYXNzID8/IFlBTUxTZXE7XG4gICAgY29uc3Qgc2VxID0gbmV3IE5vZGVDbGFzcyhjdHguc2NoZW1hKTtcbiAgICBpZiAoY3R4LmF0Um9vdClcbiAgICAgICAgY3R4LmF0Um9vdCA9IGZhbHNlO1xuICAgIGlmIChjdHguYXRLZXkpXG4gICAgICAgIGN0eC5hdEtleSA9IGZhbHNlO1xuICAgIGxldCBvZmZzZXQgPSBicy5vZmZzZXQ7XG4gICAgbGV0IGNvbW1lbnRFbmQgPSBudWxsO1xuICAgIGZvciAoY29uc3QgeyBzdGFydCwgdmFsdWUgfSBvZiBicy5pdGVtcykge1xuICAgICAgICBjb25zdCBwcm9wcyA9IHJlc29sdmVQcm9wcyhzdGFydCwge1xuICAgICAgICAgICAgaW5kaWNhdG9yOiAnc2VxLWl0ZW0taW5kJyxcbiAgICAgICAgICAgIG5leHQ6IHZhbHVlLFxuICAgICAgICAgICAgb2Zmc2V0LFxuICAgICAgICAgICAgb25FcnJvcixcbiAgICAgICAgICAgIHBhcmVudEluZGVudDogYnMuaW5kZW50LFxuICAgICAgICAgICAgc3RhcnRPbk5ld2xpbmU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghcHJvcHMuZm91bmQpIHtcbiAgICAgICAgICAgIGlmIChwcm9wcy5hbmNob3IgfHwgcHJvcHMudGFnIHx8IHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlPy50eXBlID09PSAnYmxvY2stc2VxJylcbiAgICAgICAgICAgICAgICAgICAgb25FcnJvcihwcm9wcy5lbmQsICdCQURfSU5ERU5UJywgJ0FsbCBzZXF1ZW5jZSBpdGVtcyBtdXN0IHN0YXJ0IGF0IHRoZSBzYW1lIGNvbHVtbicpO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgb25FcnJvcihvZmZzZXQsICdNSVNTSU5HX0NIQVInLCAnU2VxdWVuY2UgaXRlbSB3aXRob3V0IC0gaW5kaWNhdG9yJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb21tZW50RW5kID0gcHJvcHMuZW5kO1xuICAgICAgICAgICAgICAgIGlmIChwcm9wcy5jb21tZW50KVxuICAgICAgICAgICAgICAgICAgICBzZXEuY29tbWVudCA9IHByb3BzLmNvbW1lbnQ7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgbm9kZSA9IHZhbHVlXG4gICAgICAgICAgICA/IGNvbXBvc2VOb2RlKGN0eCwgdmFsdWUsIHByb3BzLCBvbkVycm9yKVxuICAgICAgICAgICAgOiBjb21wb3NlRW1wdHlOb2RlKGN0eCwgcHJvcHMuZW5kLCBzdGFydCwgbnVsbCwgcHJvcHMsIG9uRXJyb3IpO1xuICAgICAgICBpZiAoY3R4LnNjaGVtYS5jb21wYXQpXG4gICAgICAgICAgICBmbG93SW5kZW50Q2hlY2soYnMuaW5kZW50LCB2YWx1ZSwgb25FcnJvcik7XG4gICAgICAgIG9mZnNldCA9IG5vZGUucmFuZ2VbMl07XG4gICAgICAgIHNlcS5pdGVtcy5wdXNoKG5vZGUpO1xuICAgIH1cbiAgICBzZXEucmFuZ2UgPSBbYnMub2Zmc2V0LCBvZmZzZXQsIGNvbW1lbnRFbmQgPz8gb2Zmc2V0XTtcbiAgICByZXR1cm4gc2VxO1xufVxuXG5leHBvcnQgeyByZXNvbHZlQmxvY2tTZXEgfTtcbiIsImZ1bmN0aW9uIHJlc29sdmVFbmQoZW5kLCBvZmZzZXQsIHJlcVNwYWNlLCBvbkVycm9yKSB7XG4gICAgbGV0IGNvbW1lbnQgPSAnJztcbiAgICBpZiAoZW5kKSB7XG4gICAgICAgIGxldCBoYXNTcGFjZSA9IGZhbHNlO1xuICAgICAgICBsZXQgc2VwID0gJyc7XG4gICAgICAgIGZvciAoY29uc3QgdG9rZW4gb2YgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCB7IHNvdXJjZSwgdHlwZSB9ID0gdG9rZW47XG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdzcGFjZSc6XG4gICAgICAgICAgICAgICAgICAgIGhhc1NwYWNlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnY29tbWVudCc6IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcVNwYWNlICYmICFoYXNTcGFjZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uRXJyb3IodG9rZW4sICdNSVNTSU5HX0NIQVInLCAnQ29tbWVudHMgbXVzdCBiZSBzZXBhcmF0ZWQgZnJvbSBvdGhlciB0b2tlbnMgYnkgd2hpdGUgc3BhY2UgY2hhcmFjdGVycycpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYiA9IHNvdXJjZS5zdWJzdHJpbmcoMSkgfHwgJyAnO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbW1lbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50ID0gY2I7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgKz0gc2VwICsgY2I7XG4gICAgICAgICAgICAgICAgICAgIHNlcCA9ICcnO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSAnbmV3bGluZSc6XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb21tZW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgc2VwICs9IHNvdXJjZTtcbiAgICAgICAgICAgICAgICAgICAgaGFzU3BhY2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBvbkVycm9yKHRva2VuLCAnVU5FWFBFQ1RFRF9UT0tFTicsIGBVbmV4cGVjdGVkICR7dHlwZX0gYXQgbm9kZSBlbmRgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9mZnNldCArPSBzb3VyY2UubGVuZ3RoO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IGNvbW1lbnQsIG9mZnNldCB9O1xufVxuXG5leHBvcnQgeyByZXNvbHZlRW5kIH07XG4iLCJpbXBvcnQgeyBpc1BhaXIgfSBmcm9tICcuLi9ub2Rlcy9pZGVudGl0eS5qcyc7XG5pbXBvcnQgeyBQYWlyIH0gZnJvbSAnLi4vbm9kZXMvUGFpci5qcyc7XG5pbXBvcnQgeyBZQU1MTWFwIH0gZnJvbSAnLi4vbm9kZXMvWUFNTE1hcC5qcyc7XG5pbXBvcnQgeyBZQU1MU2VxIH0gZnJvbSAnLi4vbm9kZXMvWUFNTFNlcS5qcyc7XG5pbXBvcnQgeyByZXNvbHZlRW5kIH0gZnJvbSAnLi9yZXNvbHZlLWVuZC5qcyc7XG5pbXBvcnQgeyByZXNvbHZlUHJvcHMgfSBmcm9tICcuL3Jlc29sdmUtcHJvcHMuanMnO1xuaW1wb3J0IHsgY29udGFpbnNOZXdsaW5lIH0gZnJvbSAnLi91dGlsLWNvbnRhaW5zLW5ld2xpbmUuanMnO1xuaW1wb3J0IHsgbWFwSW5jbHVkZXMgfSBmcm9tICcuL3V0aWwtbWFwLWluY2x1ZGVzLmpzJztcblxuY29uc3QgYmxvY2tNc2cgPSAnQmxvY2sgY29sbGVjdGlvbnMgYXJlIG5vdCBhbGxvd2VkIHdpdGhpbiBmbG93IGNvbGxlY3Rpb25zJztcbmNvbnN0IGlzQmxvY2sgPSAodG9rZW4pID0+IHRva2VuICYmICh0b2tlbi50eXBlID09PSAnYmxvY2stbWFwJyB8fCB0b2tlbi50eXBlID09PSAnYmxvY2stc2VxJyk7XG5mdW5jdGlvbiByZXNvbHZlRmxvd0NvbGxlY3Rpb24oeyBjb21wb3NlTm9kZSwgY29tcG9zZUVtcHR5Tm9kZSB9LCBjdHgsIGZjLCBvbkVycm9yLCB0YWcpIHtcbiAgICBjb25zdCBpc01hcCA9IGZjLnN0YXJ0LnNvdXJjZSA9PT0gJ3snO1xuICAgIGNvbnN0IGZjTmFtZSA9IGlzTWFwID8gJ2Zsb3cgbWFwJyA6ICdmbG93IHNlcXVlbmNlJztcbiAgICBjb25zdCBOb2RlQ2xhc3MgPSAodGFnPy5ub2RlQ2xhc3MgPz8gKGlzTWFwID8gWUFNTE1hcCA6IFlBTUxTZXEpKTtcbiAgICBjb25zdCBjb2xsID0gbmV3IE5vZGVDbGFzcyhjdHguc2NoZW1hKTtcbiAgICBjb2xsLmZsb3cgPSB0cnVlO1xuICAgIGNvbnN0IGF0Um9vdCA9IGN0eC5hdFJvb3Q7XG4gICAgaWYgKGF0Um9vdClcbiAgICAgICAgY3R4LmF0Um9vdCA9IGZhbHNlO1xuICAgIGlmIChjdHguYXRLZXkpXG4gICAgICAgIGN0eC5hdEtleSA9IGZhbHNlO1xuICAgIGxldCBvZmZzZXQgPSBmYy5vZmZzZXQgKyBmYy5zdGFydC5zb3VyY2UubGVuZ3RoO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmMuaXRlbXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY29uc3QgY29sbEl0ZW0gPSBmYy5pdGVtc1tpXTtcbiAgICAgICAgY29uc3QgeyBzdGFydCwga2V5LCBzZXAsIHZhbHVlIH0gPSBjb2xsSXRlbTtcbiAgICAgICAgY29uc3QgcHJvcHMgPSByZXNvbHZlUHJvcHMoc3RhcnQsIHtcbiAgICAgICAgICAgIGZsb3c6IGZjTmFtZSxcbiAgICAgICAgICAgIGluZGljYXRvcjogJ2V4cGxpY2l0LWtleS1pbmQnLFxuICAgICAgICAgICAgbmV4dDoga2V5ID8/IHNlcD8uWzBdLFxuICAgICAgICAgICAgb2Zmc2V0LFxuICAgICAgICAgICAgb25FcnJvcixcbiAgICAgICAgICAgIHBhcmVudEluZGVudDogZmMuaW5kZW50LFxuICAgICAgICAgICAgc3RhcnRPbk5ld2xpbmU6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIXByb3BzLmZvdW5kKSB7XG4gICAgICAgICAgICBpZiAoIXByb3BzLmFuY2hvciAmJiAhcHJvcHMudGFnICYmICFzZXAgJiYgIXZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGkgPT09IDAgJiYgcHJvcHMuY29tbWEpXG4gICAgICAgICAgICAgICAgICAgIG9uRXJyb3IocHJvcHMuY29tbWEsICdVTkVYUEVDVEVEX1RPS0VOJywgYFVuZXhwZWN0ZWQgLCBpbiAke2ZjTmFtZX1gKTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChpIDwgZmMuaXRlbXMubGVuZ3RoIC0gMSlcbiAgICAgICAgICAgICAgICAgICAgb25FcnJvcihwcm9wcy5zdGFydCwgJ1VORVhQRUNURURfVE9LRU4nLCBgVW5leHBlY3RlZCBlbXB0eSBpdGVtIGluICR7ZmNOYW1lfWApO1xuICAgICAgICAgICAgICAgIGlmIChwcm9wcy5jb21tZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb2xsLmNvbW1lbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xsLmNvbW1lbnQgKz0gJ1xcbicgKyBwcm9wcy5jb21tZW50O1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xsLmNvbW1lbnQgPSBwcm9wcy5jb21tZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBvZmZzZXQgPSBwcm9wcy5lbmQ7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWlzTWFwICYmIGN0eC5vcHRpb25zLnN0cmljdCAmJiBjb250YWluc05ld2xpbmUoa2V5KSlcbiAgICAgICAgICAgICAgICBvbkVycm9yKGtleSwgLy8gY2hlY2tlZCBieSBjb250YWluc05ld2xpbmUoKVxuICAgICAgICAgICAgICAgICdNVUxUSUxJTkVfSU1QTElDSVRfS0VZJywgJ0ltcGxpY2l0IGtleXMgb2YgZmxvdyBzZXF1ZW5jZSBwYWlycyBuZWVkIHRvIGJlIG9uIGEgc2luZ2xlIGxpbmUnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgICAgICAgaWYgKHByb3BzLmNvbW1hKVxuICAgICAgICAgICAgICAgIG9uRXJyb3IocHJvcHMuY29tbWEsICdVTkVYUEVDVEVEX1RPS0VOJywgYFVuZXhwZWN0ZWQgLCBpbiAke2ZjTmFtZX1gKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICghcHJvcHMuY29tbWEpXG4gICAgICAgICAgICAgICAgb25FcnJvcihwcm9wcy5zdGFydCwgJ01JU1NJTkdfQ0hBUicsIGBNaXNzaW5nICwgYmV0d2VlbiAke2ZjTmFtZX0gaXRlbXNgKTtcbiAgICAgICAgICAgIGlmIChwcm9wcy5jb21tZW50KSB7XG4gICAgICAgICAgICAgICAgbGV0IHByZXZJdGVtQ29tbWVudCA9ICcnO1xuICAgICAgICAgICAgICAgIGxvb3A6IGZvciAoY29uc3Qgc3Qgb2Ygc3RhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdC50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdjb21tYSc6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdzcGFjZSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdjb21tZW50JzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2SXRlbUNvbW1lbnQgPSBzdC5zb3VyY2Uuc3Vic3RyaW5nKDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGxvb3A7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGxvb3A7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHByZXZJdGVtQ29tbWVudCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcHJldiA9IGNvbGwuaXRlbXNbY29sbC5pdGVtcy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzUGFpcihwcmV2KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXYgPSBwcmV2LnZhbHVlID8/IHByZXYua2V5O1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJldi5jb21tZW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgcHJldi5jb21tZW50ICs9ICdcXG4nICsgcHJldkl0ZW1Db21tZW50O1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmV2LmNvbW1lbnQgPSBwcmV2SXRlbUNvbW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIHByb3BzLmNvbW1lbnQgPSBwcm9wcy5jb21tZW50LnN1YnN0cmluZyhwcmV2SXRlbUNvbW1lbnQubGVuZ3RoICsgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghaXNNYXAgJiYgIXNlcCAmJiAhcHJvcHMuZm91bmQpIHtcbiAgICAgICAgICAgIC8vIGl0ZW0gaXMgYSB2YWx1ZSBpbiBhIHNlcVxuICAgICAgICAgICAgLy8g4oaSIGtleSAmIHNlcCBhcmUgZW1wdHksIHN0YXJ0IGRvZXMgbm90IGluY2x1ZGUgPyBvciA6XG4gICAgICAgICAgICBjb25zdCB2YWx1ZU5vZGUgPSB2YWx1ZVxuICAgICAgICAgICAgICAgID8gY29tcG9zZU5vZGUoY3R4LCB2YWx1ZSwgcHJvcHMsIG9uRXJyb3IpXG4gICAgICAgICAgICAgICAgOiBjb21wb3NlRW1wdHlOb2RlKGN0eCwgcHJvcHMuZW5kLCBzZXAsIG51bGwsIHByb3BzLCBvbkVycm9yKTtcbiAgICAgICAgICAgIGNvbGwuaXRlbXMucHVzaCh2YWx1ZU5vZGUpO1xuICAgICAgICAgICAgb2Zmc2V0ID0gdmFsdWVOb2RlLnJhbmdlWzJdO1xuICAgICAgICAgICAgaWYgKGlzQmxvY2sodmFsdWUpKVxuICAgICAgICAgICAgICAgIG9uRXJyb3IodmFsdWVOb2RlLnJhbmdlLCAnQkxPQ0tfSU5fRkxPVycsIGJsb2NrTXNnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIGl0ZW0gaXMgYSBrZXkrdmFsdWUgcGFpclxuICAgICAgICAgICAgLy8ga2V5IHZhbHVlXG4gICAgICAgICAgICBjdHguYXRLZXkgPSB0cnVlO1xuICAgICAgICAgICAgY29uc3Qga2V5U3RhcnQgPSBwcm9wcy5lbmQ7XG4gICAgICAgICAgICBjb25zdCBrZXlOb2RlID0ga2V5XG4gICAgICAgICAgICAgICAgPyBjb21wb3NlTm9kZShjdHgsIGtleSwgcHJvcHMsIG9uRXJyb3IpXG4gICAgICAgICAgICAgICAgOiBjb21wb3NlRW1wdHlOb2RlKGN0eCwga2V5U3RhcnQsIHN0YXJ0LCBudWxsLCBwcm9wcywgb25FcnJvcik7XG4gICAgICAgICAgICBpZiAoaXNCbG9jayhrZXkpKVxuICAgICAgICAgICAgICAgIG9uRXJyb3Ioa2V5Tm9kZS5yYW5nZSwgJ0JMT0NLX0lOX0ZMT1cnLCBibG9ja01zZyk7XG4gICAgICAgICAgICBjdHguYXRLZXkgPSBmYWxzZTtcbiAgICAgICAgICAgIC8vIHZhbHVlIHByb3BlcnRpZXNcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlUHJvcHMgPSByZXNvbHZlUHJvcHMoc2VwID8/IFtdLCB7XG4gICAgICAgICAgICAgICAgZmxvdzogZmNOYW1lLFxuICAgICAgICAgICAgICAgIGluZGljYXRvcjogJ21hcC12YWx1ZS1pbmQnLFxuICAgICAgICAgICAgICAgIG5leHQ6IHZhbHVlLFxuICAgICAgICAgICAgICAgIG9mZnNldDoga2V5Tm9kZS5yYW5nZVsyXSxcbiAgICAgICAgICAgICAgICBvbkVycm9yLFxuICAgICAgICAgICAgICAgIHBhcmVudEluZGVudDogZmMuaW5kZW50LFxuICAgICAgICAgICAgICAgIHN0YXJ0T25OZXdsaW5lOiBmYWxzZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAodmFsdWVQcm9wcy5mb3VuZCkge1xuICAgICAgICAgICAgICAgIGlmICghaXNNYXAgJiYgIXByb3BzLmZvdW5kICYmIGN0eC5vcHRpb25zLnN0cmljdCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2VwKVxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzdCBvZiBzZXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3QgPT09IHZhbHVlUHJvcHMuZm91bmQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdC50eXBlID09PSAnbmV3bGluZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25FcnJvcihzdCwgJ01VTFRJTElORV9JTVBMSUNJVF9LRVknLCAnSW1wbGljaXQga2V5cyBvZiBmbG93IHNlcXVlbmNlIHBhaXJzIG5lZWQgdG8gYmUgb24gYSBzaW5nbGUgbGluZScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wcy5zdGFydCA8IHZhbHVlUHJvcHMuZm91bmQub2Zmc2V0IC0gMTAyNClcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uRXJyb3IodmFsdWVQcm9wcy5mb3VuZCwgJ0tFWV9PVkVSXzEwMjRfQ0hBUlMnLCAnVGhlIDogaW5kaWNhdG9yIG11c3QgYmUgYXQgbW9zdCAxMDI0IGNoYXJzIGFmdGVyIHRoZSBzdGFydCBvZiBhbiBpbXBsaWNpdCBmbG93IHNlcXVlbmNlIGtleScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKCdzb3VyY2UnIGluIHZhbHVlICYmIHZhbHVlLnNvdXJjZT8uWzBdID09PSAnOicpXG4gICAgICAgICAgICAgICAgICAgIG9uRXJyb3IodmFsdWUsICdNSVNTSU5HX0NIQVInLCBgTWlzc2luZyBzcGFjZSBhZnRlciA6IGluICR7ZmNOYW1lfWApO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgb25FcnJvcih2YWx1ZVByb3BzLnN0YXJ0LCAnTUlTU0lOR19DSEFSJywgYE1pc3NpbmcgLCBvciA6IGJldHdlZW4gJHtmY05hbWV9IGl0ZW1zYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyB2YWx1ZSB2YWx1ZVxuICAgICAgICAgICAgY29uc3QgdmFsdWVOb2RlID0gdmFsdWVcbiAgICAgICAgICAgICAgICA/IGNvbXBvc2VOb2RlKGN0eCwgdmFsdWUsIHZhbHVlUHJvcHMsIG9uRXJyb3IpXG4gICAgICAgICAgICAgICAgOiB2YWx1ZVByb3BzLmZvdW5kXG4gICAgICAgICAgICAgICAgICAgID8gY29tcG9zZUVtcHR5Tm9kZShjdHgsIHZhbHVlUHJvcHMuZW5kLCBzZXAsIG51bGwsIHZhbHVlUHJvcHMsIG9uRXJyb3IpXG4gICAgICAgICAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgICAgIGlmICh2YWx1ZU5vZGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNCbG9jayh2YWx1ZSkpXG4gICAgICAgICAgICAgICAgICAgIG9uRXJyb3IodmFsdWVOb2RlLnJhbmdlLCAnQkxPQ0tfSU5fRkxPVycsIGJsb2NrTXNnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlUHJvcHMuY29tbWVudCkge1xuICAgICAgICAgICAgICAgIGlmIChrZXlOb2RlLmNvbW1lbnQpXG4gICAgICAgICAgICAgICAgICAgIGtleU5vZGUuY29tbWVudCArPSAnXFxuJyArIHZhbHVlUHJvcHMuY29tbWVudDtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGtleU5vZGUuY29tbWVudCA9IHZhbHVlUHJvcHMuY29tbWVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHBhaXIgPSBuZXcgUGFpcihrZXlOb2RlLCB2YWx1ZU5vZGUpO1xuICAgICAgICAgICAgaWYgKGN0eC5vcHRpb25zLmtlZXBTb3VyY2VUb2tlbnMpXG4gICAgICAgICAgICAgICAgcGFpci5zcmNUb2tlbiA9IGNvbGxJdGVtO1xuICAgICAgICAgICAgaWYgKGlzTWFwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWFwID0gY29sbDtcbiAgICAgICAgICAgICAgICBpZiAobWFwSW5jbHVkZXMoY3R4LCBtYXAuaXRlbXMsIGtleU5vZGUpKVxuICAgICAgICAgICAgICAgICAgICBvbkVycm9yKGtleVN0YXJ0LCAnRFVQTElDQVRFX0tFWScsICdNYXAga2V5cyBtdXN0IGJlIHVuaXF1ZScpO1xuICAgICAgICAgICAgICAgIG1hcC5pdGVtcy5wdXNoKHBhaXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWFwID0gbmV3IFlBTUxNYXAoY3R4LnNjaGVtYSk7XG4gICAgICAgICAgICAgICAgbWFwLmZsb3cgPSB0cnVlO1xuICAgICAgICAgICAgICAgIG1hcC5pdGVtcy5wdXNoKHBhaXIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVuZFJhbmdlID0gKHZhbHVlTm9kZSA/PyBrZXlOb2RlKS5yYW5nZTtcbiAgICAgICAgICAgICAgICBtYXAucmFuZ2UgPSBba2V5Tm9kZS5yYW5nZVswXSwgZW5kUmFuZ2VbMV0sIGVuZFJhbmdlWzJdXTtcbiAgICAgICAgICAgICAgICBjb2xsLml0ZW1zLnB1c2gobWFwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9mZnNldCA9IHZhbHVlTm9kZSA/IHZhbHVlTm9kZS5yYW5nZVsyXSA6IHZhbHVlUHJvcHMuZW5kO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGV4cGVjdGVkRW5kID0gaXNNYXAgPyAnfScgOiAnXSc7XG4gICAgY29uc3QgW2NlLCAuLi5lZV0gPSBmYy5lbmQ7XG4gICAgbGV0IGNlUG9zID0gb2Zmc2V0O1xuICAgIGlmIChjZT8uc291cmNlID09PSBleHBlY3RlZEVuZClcbiAgICAgICAgY2VQb3MgPSBjZS5vZmZzZXQgKyBjZS5zb3VyY2UubGVuZ3RoO1xuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBuYW1lID0gZmNOYW1lWzBdLnRvVXBwZXJDYXNlKCkgKyBmY05hbWUuc3Vic3RyaW5nKDEpO1xuICAgICAgICBjb25zdCBtc2cgPSBhdFJvb3RcbiAgICAgICAgICAgID8gYCR7bmFtZX0gbXVzdCBlbmQgd2l0aCBhICR7ZXhwZWN0ZWRFbmR9YFxuICAgICAgICAgICAgOiBgJHtuYW1lfSBpbiBibG9jayBjb2xsZWN0aW9uIG11c3QgYmUgc3VmZmljaWVudGx5IGluZGVudGVkIGFuZCBlbmQgd2l0aCBhICR7ZXhwZWN0ZWRFbmR9YDtcbiAgICAgICAgb25FcnJvcihvZmZzZXQsIGF0Um9vdCA/ICdNSVNTSU5HX0NIQVInIDogJ0JBRF9JTkRFTlQnLCBtc2cpO1xuICAgICAgICBpZiAoY2UgJiYgY2Uuc291cmNlLmxlbmd0aCAhPT0gMSlcbiAgICAgICAgICAgIGVlLnVuc2hpZnQoY2UpO1xuICAgIH1cbiAgICBpZiAoZWUubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBlbmQgPSByZXNvbHZlRW5kKGVlLCBjZVBvcywgY3R4Lm9wdGlvbnMuc3RyaWN0LCBvbkVycm9yKTtcbiAgICAgICAgaWYgKGVuZC5jb21tZW50KSB7XG4gICAgICAgICAgICBpZiAoY29sbC5jb21tZW50KVxuICAgICAgICAgICAgICAgIGNvbGwuY29tbWVudCArPSAnXFxuJyArIGVuZC5jb21tZW50O1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGNvbGwuY29tbWVudCA9IGVuZC5jb21tZW50O1xuICAgICAgICB9XG4gICAgICAgIGNvbGwucmFuZ2UgPSBbZmMub2Zmc2V0LCBjZVBvcywgZW5kLm9mZnNldF07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb2xsLnJhbmdlID0gW2ZjLm9mZnNldCwgY2VQb3MsIGNlUG9zXTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbGw7XG59XG5cbmV4cG9ydCB7IHJlc29sdmVGbG93Q29sbGVjdGlvbiB9O1xuIiwiaW1wb3J0IHsgaXNOb2RlIH0gZnJvbSAnLi4vbm9kZXMvaWRlbnRpdHkuanMnO1xuaW1wb3J0IHsgU2NhbGFyIH0gZnJvbSAnLi4vbm9kZXMvU2NhbGFyLmpzJztcbmltcG9ydCB7IFlBTUxNYXAgfSBmcm9tICcuLi9ub2Rlcy9ZQU1MTWFwLmpzJztcbmltcG9ydCB7IFlBTUxTZXEgfSBmcm9tICcuLi9ub2Rlcy9ZQU1MU2VxLmpzJztcbmltcG9ydCB7IHJlc29sdmVCbG9ja01hcCB9IGZyb20gJy4vcmVzb2x2ZS1ibG9jay1tYXAuanMnO1xuaW1wb3J0IHsgcmVzb2x2ZUJsb2NrU2VxIH0gZnJvbSAnLi9yZXNvbHZlLWJsb2NrLXNlcS5qcyc7XG5pbXBvcnQgeyByZXNvbHZlRmxvd0NvbGxlY3Rpb24gfSBmcm9tICcuL3Jlc29sdmUtZmxvdy1jb2xsZWN0aW9uLmpzJztcblxuZnVuY3Rpb24gcmVzb2x2ZUNvbGxlY3Rpb24oQ04sIGN0eCwgdG9rZW4sIG9uRXJyb3IsIHRhZ05hbWUsIHRhZykge1xuICAgIGNvbnN0IGNvbGwgPSB0b2tlbi50eXBlID09PSAnYmxvY2stbWFwJ1xuICAgICAgICA/IHJlc29sdmVCbG9ja01hcChDTiwgY3R4LCB0b2tlbiwgb25FcnJvciwgdGFnKVxuICAgICAgICA6IHRva2VuLnR5cGUgPT09ICdibG9jay1zZXEnXG4gICAgICAgICAgICA/IHJlc29sdmVCbG9ja1NlcShDTiwgY3R4LCB0b2tlbiwgb25FcnJvciwgdGFnKVxuICAgICAgICAgICAgOiByZXNvbHZlRmxvd0NvbGxlY3Rpb24oQ04sIGN0eCwgdG9rZW4sIG9uRXJyb3IsIHRhZyk7XG4gICAgY29uc3QgQ29sbCA9IGNvbGwuY29uc3RydWN0b3I7XG4gICAgLy8gSWYgd2UgZ290IGEgdGFnTmFtZSBtYXRjaGluZyB0aGUgY2xhc3MsIG9yIHRoZSB0YWcgbmFtZSBpcyAnIScsXG4gICAgLy8gdGhlbiB1c2UgdGhlIHRhZ05hbWUgZnJvbSB0aGUgbm9kZSBjbGFzcyB1c2VkIHRvIGNyZWF0ZSBpdC5cbiAgICBpZiAodGFnTmFtZSA9PT0gJyEnIHx8IHRhZ05hbWUgPT09IENvbGwudGFnTmFtZSkge1xuICAgICAgICBjb2xsLnRhZyA9IENvbGwudGFnTmFtZTtcbiAgICAgICAgcmV0dXJuIGNvbGw7XG4gICAgfVxuICAgIGlmICh0YWdOYW1lKVxuICAgICAgICBjb2xsLnRhZyA9IHRhZ05hbWU7XG4gICAgcmV0dXJuIGNvbGw7XG59XG5mdW5jdGlvbiBjb21wb3NlQ29sbGVjdGlvbihDTiwgY3R4LCB0b2tlbiwgcHJvcHMsIG9uRXJyb3IpIHtcbiAgICBjb25zdCB0YWdUb2tlbiA9IHByb3BzLnRhZztcbiAgICBjb25zdCB0YWdOYW1lID0gIXRhZ1Rva2VuXG4gICAgICAgID8gbnVsbFxuICAgICAgICA6IGN0eC5kaXJlY3RpdmVzLnRhZ05hbWUodGFnVG9rZW4uc291cmNlLCBtc2cgPT4gb25FcnJvcih0YWdUb2tlbiwgJ1RBR19SRVNPTFZFX0ZBSUxFRCcsIG1zZykpO1xuICAgIGlmICh0b2tlbi50eXBlID09PSAnYmxvY2stc2VxJykge1xuICAgICAgICBjb25zdCB7IGFuY2hvciwgbmV3bGluZUFmdGVyUHJvcDogbmwgfSA9IHByb3BzO1xuICAgICAgICBjb25zdCBsYXN0UHJvcCA9IGFuY2hvciAmJiB0YWdUb2tlblxuICAgICAgICAgICAgPyBhbmNob3Iub2Zmc2V0ID4gdGFnVG9rZW4ub2Zmc2V0XG4gICAgICAgICAgICAgICAgPyBhbmNob3JcbiAgICAgICAgICAgICAgICA6IHRhZ1Rva2VuXG4gICAgICAgICAgICA6IChhbmNob3IgPz8gdGFnVG9rZW4pO1xuICAgICAgICBpZiAobGFzdFByb3AgJiYgKCFubCB8fCBubC5vZmZzZXQgPCBsYXN0UHJvcC5vZmZzZXQpKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gJ01pc3NpbmcgbmV3bGluZSBhZnRlciBibG9jayBzZXF1ZW5jZSBwcm9wcyc7XG4gICAgICAgICAgICBvbkVycm9yKGxhc3RQcm9wLCAnTUlTU0lOR19DSEFSJywgbWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgZXhwVHlwZSA9IHRva2VuLnR5cGUgPT09ICdibG9jay1tYXAnXG4gICAgICAgID8gJ21hcCdcbiAgICAgICAgOiB0b2tlbi50eXBlID09PSAnYmxvY2stc2VxJ1xuICAgICAgICAgICAgPyAnc2VxJ1xuICAgICAgICAgICAgOiB0b2tlbi5zdGFydC5zb3VyY2UgPT09ICd7J1xuICAgICAgICAgICAgICAgID8gJ21hcCdcbiAgICAgICAgICAgICAgICA6ICdzZXEnO1xuICAgIC8vIHNob3J0Y3V0OiBjaGVjayBpZiBpdCdzIGEgZ2VuZXJpYyBZQU1MTWFwIG9yIFlBTUxTZXFcbiAgICAvLyBiZWZvcmUganVtcGluZyBpbnRvIHRoZSBjdXN0b20gdGFnIGxvZ2ljLlxuICAgIGlmICghdGFnVG9rZW4gfHxcbiAgICAgICAgIXRhZ05hbWUgfHxcbiAgICAgICAgdGFnTmFtZSA9PT0gJyEnIHx8XG4gICAgICAgICh0YWdOYW1lID09PSBZQU1MTWFwLnRhZ05hbWUgJiYgZXhwVHlwZSA9PT0gJ21hcCcpIHx8XG4gICAgICAgICh0YWdOYW1lID09PSBZQU1MU2VxLnRhZ05hbWUgJiYgZXhwVHlwZSA9PT0gJ3NlcScpKSB7XG4gICAgICAgIHJldHVybiByZXNvbHZlQ29sbGVjdGlvbihDTiwgY3R4LCB0b2tlbiwgb25FcnJvciwgdGFnTmFtZSk7XG4gICAgfVxuICAgIGxldCB0YWcgPSBjdHguc2NoZW1hLnRhZ3MuZmluZCh0ID0+IHQudGFnID09PSB0YWdOYW1lICYmIHQuY29sbGVjdGlvbiA9PT0gZXhwVHlwZSk7XG4gICAgaWYgKCF0YWcpIHtcbiAgICAgICAgY29uc3Qga3QgPSBjdHguc2NoZW1hLmtub3duVGFnc1t0YWdOYW1lXTtcbiAgICAgICAgaWYgKGt0Py5jb2xsZWN0aW9uID09PSBleHBUeXBlKSB7XG4gICAgICAgICAgICBjdHguc2NoZW1hLnRhZ3MucHVzaChPYmplY3QuYXNzaWduKHt9LCBrdCwgeyBkZWZhdWx0OiBmYWxzZSB9KSk7XG4gICAgICAgICAgICB0YWcgPSBrdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChrdCkge1xuICAgICAgICAgICAgICAgIG9uRXJyb3IodGFnVG9rZW4sICdCQURfQ09MTEVDVElPTl9UWVBFJywgYCR7a3QudGFnfSB1c2VkIGZvciAke2V4cFR5cGV9IGNvbGxlY3Rpb24sIGJ1dCBleHBlY3RzICR7a3QuY29sbGVjdGlvbiA/PyAnc2NhbGFyJ31gLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG9uRXJyb3IodGFnVG9rZW4sICdUQUdfUkVTT0xWRV9GQUlMRUQnLCBgVW5yZXNvbHZlZCB0YWc6ICR7dGFnTmFtZX1gLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlQ29sbGVjdGlvbihDTiwgY3R4LCB0b2tlbiwgb25FcnJvciwgdGFnTmFtZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgY29sbCA9IHJlc29sdmVDb2xsZWN0aW9uKENOLCBjdHgsIHRva2VuLCBvbkVycm9yLCB0YWdOYW1lLCB0YWcpO1xuICAgIGNvbnN0IHJlcyA9IHRhZy5yZXNvbHZlPy4oY29sbCwgbXNnID0+IG9uRXJyb3IodGFnVG9rZW4sICdUQUdfUkVTT0xWRV9GQUlMRUQnLCBtc2cpLCBjdHgub3B0aW9ucykgPz8gY29sbDtcbiAgICBjb25zdCBub2RlID0gaXNOb2RlKHJlcylcbiAgICAgICAgPyByZXNcbiAgICAgICAgOiBuZXcgU2NhbGFyKHJlcyk7XG4gICAgbm9kZS5yYW5nZSA9IGNvbGwucmFuZ2U7XG4gICAgbm9kZS50YWcgPSB0YWdOYW1lO1xuICAgIGlmICh0YWc/LmZvcm1hdClcbiAgICAgICAgbm9kZS5mb3JtYXQgPSB0YWcuZm9ybWF0O1xuICAgIHJldHVybiBub2RlO1xufVxuXG5leHBvcnQgeyBjb21wb3NlQ29sbGVjdGlvbiB9O1xuIiwiaW1wb3J0IHsgU2NhbGFyIH0gZnJvbSAnLi4vbm9kZXMvU2NhbGFyLmpzJztcblxuZnVuY3Rpb24gcmVzb2x2ZUJsb2NrU2NhbGFyKGN0eCwgc2NhbGFyLCBvbkVycm9yKSB7XG4gICAgY29uc3Qgc3RhcnQgPSBzY2FsYXIub2Zmc2V0O1xuICAgIGNvbnN0IGhlYWRlciA9IHBhcnNlQmxvY2tTY2FsYXJIZWFkZXIoc2NhbGFyLCBjdHgub3B0aW9ucy5zdHJpY3QsIG9uRXJyb3IpO1xuICAgIGlmICghaGVhZGVyKVxuICAgICAgICByZXR1cm4geyB2YWx1ZTogJycsIHR5cGU6IG51bGwsIGNvbW1lbnQ6ICcnLCByYW5nZTogW3N0YXJ0LCBzdGFydCwgc3RhcnRdIH07XG4gICAgY29uc3QgdHlwZSA9IGhlYWRlci5tb2RlID09PSAnPicgPyBTY2FsYXIuQkxPQ0tfRk9MREVEIDogU2NhbGFyLkJMT0NLX0xJVEVSQUw7XG4gICAgY29uc3QgbGluZXMgPSBzY2FsYXIuc291cmNlID8gc3BsaXRMaW5lcyhzY2FsYXIuc291cmNlKSA6IFtdO1xuICAgIC8vIGRldGVybWluZSB0aGUgZW5kIG9mIGNvbnRlbnQgJiBzdGFydCBvZiBjaG9tcGluZ1xuICAgIGxldCBjaG9tcFN0YXJ0ID0gbGluZXMubGVuZ3RoO1xuICAgIGZvciAobGV0IGkgPSBsaW5lcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gbGluZXNbaV1bMV07XG4gICAgICAgIGlmIChjb250ZW50ID09PSAnJyB8fCBjb250ZW50ID09PSAnXFxyJylcbiAgICAgICAgICAgIGNob21wU3RhcnQgPSBpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG4gICAgLy8gc2hvcnRjdXQgZm9yIGVtcHR5IGNvbnRlbnRzXG4gICAgaWYgKGNob21wU3RhcnQgPT09IDApIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBoZWFkZXIuY2hvbXAgPT09ICcrJyAmJiBsaW5lcy5sZW5ndGggPiAwXG4gICAgICAgICAgICA/ICdcXG4nLnJlcGVhdChNYXRoLm1heCgxLCBsaW5lcy5sZW5ndGggLSAxKSlcbiAgICAgICAgICAgIDogJyc7XG4gICAgICAgIGxldCBlbmQgPSBzdGFydCArIGhlYWRlci5sZW5ndGg7XG4gICAgICAgIGlmIChzY2FsYXIuc291cmNlKVxuICAgICAgICAgICAgZW5kICs9IHNjYWxhci5zb3VyY2UubGVuZ3RoO1xuICAgICAgICByZXR1cm4geyB2YWx1ZSwgdHlwZSwgY29tbWVudDogaGVhZGVyLmNvbW1lbnQsIHJhbmdlOiBbc3RhcnQsIGVuZCwgZW5kXSB9O1xuICAgIH1cbiAgICAvLyBmaW5kIHRoZSBpbmRlbnRhdGlvbiBsZXZlbCB0byB0cmltIGZyb20gc3RhcnRcbiAgICBsZXQgdHJpbUluZGVudCA9IHNjYWxhci5pbmRlbnQgKyBoZWFkZXIuaW5kZW50O1xuICAgIGxldCBvZmZzZXQgPSBzY2FsYXIub2Zmc2V0ICsgaGVhZGVyLmxlbmd0aDtcbiAgICBsZXQgY29udGVudFN0YXJ0ID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNob21wU3RhcnQ7ICsraSkge1xuICAgICAgICBjb25zdCBbaW5kZW50LCBjb250ZW50XSA9IGxpbmVzW2ldO1xuICAgICAgICBpZiAoY29udGVudCA9PT0gJycgfHwgY29udGVudCA9PT0gJ1xccicpIHtcbiAgICAgICAgICAgIGlmIChoZWFkZXIuaW5kZW50ID09PSAwICYmIGluZGVudC5sZW5ndGggPiB0cmltSW5kZW50KVxuICAgICAgICAgICAgICAgIHRyaW1JbmRlbnQgPSBpbmRlbnQubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGluZGVudC5sZW5ndGggPCB0cmltSW5kZW50KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9ICdCbG9jayBzY2FsYXJzIHdpdGggbW9yZS1pbmRlbnRlZCBsZWFkaW5nIGVtcHR5IGxpbmVzIG11c3QgdXNlIGFuIGV4cGxpY2l0IGluZGVudGF0aW9uIGluZGljYXRvcic7XG4gICAgICAgICAgICAgICAgb25FcnJvcihvZmZzZXQgKyBpbmRlbnQubGVuZ3RoLCAnTUlTU0lOR19DSEFSJywgbWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaGVhZGVyLmluZGVudCA9PT0gMClcbiAgICAgICAgICAgICAgICB0cmltSW5kZW50ID0gaW5kZW50Lmxlbmd0aDtcbiAgICAgICAgICAgIGNvbnRlbnRTdGFydCA9IGk7XG4gICAgICAgICAgICBpZiAodHJpbUluZGVudCA9PT0gMCAmJiAhY3R4LmF0Um9vdCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSAnQmxvY2sgc2NhbGFyIHZhbHVlcyBpbiBjb2xsZWN0aW9ucyBtdXN0IGJlIGluZGVudGVkJztcbiAgICAgICAgICAgICAgICBvbkVycm9yKG9mZnNldCwgJ0JBRF9JTkRFTlQnLCBtZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIG9mZnNldCArPSBpbmRlbnQubGVuZ3RoICsgY29udGVudC5sZW5ndGggKyAxO1xuICAgIH1cbiAgICAvLyBpbmNsdWRlIHRyYWlsaW5nIG1vcmUtaW5kZW50ZWQgZW1wdHkgbGluZXMgaW4gY29udGVudFxuICAgIGZvciAobGV0IGkgPSBsaW5lcy5sZW5ndGggLSAxOyBpID49IGNob21wU3RhcnQ7IC0taSkge1xuICAgICAgICBpZiAobGluZXNbaV1bMF0ubGVuZ3RoID4gdHJpbUluZGVudClcbiAgICAgICAgICAgIGNob21wU3RhcnQgPSBpICsgMTtcbiAgICB9XG4gICAgbGV0IHZhbHVlID0gJyc7XG4gICAgbGV0IHNlcCA9ICcnO1xuICAgIGxldCBwcmV2TW9yZUluZGVudGVkID0gZmFsc2U7XG4gICAgLy8gbGVhZGluZyB3aGl0ZXNwYWNlIGlzIGtlcHQgaW50YWN0XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb250ZW50U3RhcnQ7ICsraSlcbiAgICAgICAgdmFsdWUgKz0gbGluZXNbaV1bMF0uc2xpY2UodHJpbUluZGVudCkgKyAnXFxuJztcbiAgICBmb3IgKGxldCBpID0gY29udGVudFN0YXJ0OyBpIDwgY2hvbXBTdGFydDsgKytpKSB7XG4gICAgICAgIGxldCBbaW5kZW50LCBjb250ZW50XSA9IGxpbmVzW2ldO1xuICAgICAgICBvZmZzZXQgKz0gaW5kZW50Lmxlbmd0aCArIGNvbnRlbnQubGVuZ3RoICsgMTtcbiAgICAgICAgY29uc3QgY3JsZiA9IGNvbnRlbnRbY29udGVudC5sZW5ndGggLSAxXSA9PT0gJ1xccic7XG4gICAgICAgIGlmIChjcmxmKVxuICAgICAgICAgICAgY29udGVudCA9IGNvbnRlbnQuc2xpY2UoMCwgLTEpO1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgYWxyZWFkeSBjYXVnaHQgaW4gbGV4ZXIgKi9cbiAgICAgICAgaWYgKGNvbnRlbnQgJiYgaW5kZW50Lmxlbmd0aCA8IHRyaW1JbmRlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IHNyYyA9IGhlYWRlci5pbmRlbnRcbiAgICAgICAgICAgICAgICA/ICdleHBsaWNpdCBpbmRlbnRhdGlvbiBpbmRpY2F0b3InXG4gICAgICAgICAgICAgICAgOiAnZmlyc3QgbGluZSc7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gYEJsb2NrIHNjYWxhciBsaW5lcyBtdXN0IG5vdCBiZSBsZXNzIGluZGVudGVkIHRoYW4gdGhlaXIgJHtzcmN9YDtcbiAgICAgICAgICAgIG9uRXJyb3Iob2Zmc2V0IC0gY29udGVudC5sZW5ndGggLSAoY3JsZiA/IDIgOiAxKSwgJ0JBRF9JTkRFTlQnLCBtZXNzYWdlKTtcbiAgICAgICAgICAgIGluZGVudCA9ICcnO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlID09PSBTY2FsYXIuQkxPQ0tfTElURVJBTCkge1xuICAgICAgICAgICAgdmFsdWUgKz0gc2VwICsgaW5kZW50LnNsaWNlKHRyaW1JbmRlbnQpICsgY29udGVudDtcbiAgICAgICAgICAgIHNlcCA9ICdcXG4nO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGluZGVudC5sZW5ndGggPiB0cmltSW5kZW50IHx8IGNvbnRlbnRbMF0gPT09ICdcXHQnKSB7XG4gICAgICAgICAgICAvLyBtb3JlLWluZGVudGVkIGNvbnRlbnQgd2l0aGluIGEgZm9sZGVkIGJsb2NrXG4gICAgICAgICAgICBpZiAoc2VwID09PSAnICcpXG4gICAgICAgICAgICAgICAgc2VwID0gJ1xcbic7XG4gICAgICAgICAgICBlbHNlIGlmICghcHJldk1vcmVJbmRlbnRlZCAmJiBzZXAgPT09ICdcXG4nKVxuICAgICAgICAgICAgICAgIHNlcCA9ICdcXG5cXG4nO1xuICAgICAgICAgICAgdmFsdWUgKz0gc2VwICsgaW5kZW50LnNsaWNlKHRyaW1JbmRlbnQpICsgY29udGVudDtcbiAgICAgICAgICAgIHNlcCA9ICdcXG4nO1xuICAgICAgICAgICAgcHJldk1vcmVJbmRlbnRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY29udGVudCA9PT0gJycpIHtcbiAgICAgICAgICAgIC8vIGVtcHR5IGxpbmVcbiAgICAgICAgICAgIGlmIChzZXAgPT09ICdcXG4nKVxuICAgICAgICAgICAgICAgIHZhbHVlICs9ICdcXG4nO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHNlcCA9ICdcXG4nO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFsdWUgKz0gc2VwICsgY29udGVudDtcbiAgICAgICAgICAgIHNlcCA9ICcgJztcbiAgICAgICAgICAgIHByZXZNb3JlSW5kZW50ZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzd2l0Y2ggKGhlYWRlci5jaG9tcCkge1xuICAgICAgICBjYXNlICctJzpcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICcrJzpcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBjaG9tcFN0YXJ0OyBpIDwgbGluZXMubGVuZ3RoOyArK2kpXG4gICAgICAgICAgICAgICAgdmFsdWUgKz0gJ1xcbicgKyBsaW5lc1tpXVswXS5zbGljZSh0cmltSW5kZW50KTtcbiAgICAgICAgICAgIGlmICh2YWx1ZVt2YWx1ZS5sZW5ndGggLSAxXSAhPT0gJ1xcbicpXG4gICAgICAgICAgICAgICAgdmFsdWUgKz0gJ1xcbic7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHZhbHVlICs9ICdcXG4nO1xuICAgIH1cbiAgICBjb25zdCBlbmQgPSBzdGFydCArIGhlYWRlci5sZW5ndGggKyBzY2FsYXIuc291cmNlLmxlbmd0aDtcbiAgICByZXR1cm4geyB2YWx1ZSwgdHlwZSwgY29tbWVudDogaGVhZGVyLmNvbW1lbnQsIHJhbmdlOiBbc3RhcnQsIGVuZCwgZW5kXSB9O1xufVxuZnVuY3Rpb24gcGFyc2VCbG9ja1NjYWxhckhlYWRlcih7IG9mZnNldCwgcHJvcHMgfSwgc3RyaWN0LCBvbkVycm9yKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmIHNob3VsZCBub3QgaGFwcGVuICovXG4gICAgaWYgKHByb3BzWzBdLnR5cGUgIT09ICdibG9jay1zY2FsYXItaGVhZGVyJykge1xuICAgICAgICBvbkVycm9yKHByb3BzWzBdLCAnSU1QT1NTSUJMRScsICdCbG9jayBzY2FsYXIgaGVhZGVyIG5vdCBmb3VuZCcpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgeyBzb3VyY2UgfSA9IHByb3BzWzBdO1xuICAgIGNvbnN0IG1vZGUgPSBzb3VyY2VbMF07XG4gICAgbGV0IGluZGVudCA9IDA7XG4gICAgbGV0IGNob21wID0gJyc7XG4gICAgbGV0IGVycm9yID0gLTE7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzb3VyY2UubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY29uc3QgY2ggPSBzb3VyY2VbaV07XG4gICAgICAgIGlmICghY2hvbXAgJiYgKGNoID09PSAnLScgfHwgY2ggPT09ICcrJykpXG4gICAgICAgICAgICBjaG9tcCA9IGNoO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSBOdW1iZXIoY2gpO1xuICAgICAgICAgICAgaWYgKCFpbmRlbnQgJiYgbilcbiAgICAgICAgICAgICAgICBpbmRlbnQgPSBuO1xuICAgICAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09IC0xKVxuICAgICAgICAgICAgICAgIGVycm9yID0gb2Zmc2V0ICsgaTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoZXJyb3IgIT09IC0xKVxuICAgICAgICBvbkVycm9yKGVycm9yLCAnVU5FWFBFQ1RFRF9UT0tFTicsIGBCbG9jayBzY2FsYXIgaGVhZGVyIGluY2x1ZGVzIGV4dHJhIGNoYXJhY3RlcnM6ICR7c291cmNlfWApO1xuICAgIGxldCBoYXNTcGFjZSA9IGZhbHNlO1xuICAgIGxldCBjb21tZW50ID0gJyc7XG4gICAgbGV0IGxlbmd0aCA9IHNvdXJjZS5sZW5ndGg7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBwcm9wcy5sZW5ndGg7ICsraSkge1xuICAgICAgICBjb25zdCB0b2tlbiA9IHByb3BzW2ldO1xuICAgICAgICBzd2l0Y2ggKHRva2VuLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ3NwYWNlJzpcbiAgICAgICAgICAgICAgICBoYXNTcGFjZSA9IHRydWU7XG4gICAgICAgICAgICAvLyBmYWxsdGhyb3VnaFxuICAgICAgICAgICAgY2FzZSAnbmV3bGluZSc6XG4gICAgICAgICAgICAgICAgbGVuZ3RoICs9IHRva2VuLnNvdXJjZS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdjb21tZW50JzpcbiAgICAgICAgICAgICAgICBpZiAoc3RyaWN0ICYmICFoYXNTcGFjZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gJ0NvbW1lbnRzIG11c3QgYmUgc2VwYXJhdGVkIGZyb20gb3RoZXIgdG9rZW5zIGJ5IHdoaXRlIHNwYWNlIGNoYXJhY3RlcnMnO1xuICAgICAgICAgICAgICAgICAgICBvbkVycm9yKHRva2VuLCAnTUlTU0lOR19DSEFSJywgbWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxlbmd0aCArPSB0b2tlbi5zb3VyY2UubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGNvbW1lbnQgPSB0b2tlbi5zb3VyY2Uuc3Vic3RyaW5nKDEpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZXJyb3InOlxuICAgICAgICAgICAgICAgIG9uRXJyb3IodG9rZW4sICdVTkVYUEVDVEVEX1RPS0VOJywgdG9rZW4ubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgbGVuZ3RoICs9IHRva2VuLnNvdXJjZS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCBzaG91bGQgbm90IGhhcHBlbiAqL1xuICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBgVW5leHBlY3RlZCB0b2tlbiBpbiBibG9jayBzY2FsYXIgaGVhZGVyOiAke3Rva2VuLnR5cGV9YDtcbiAgICAgICAgICAgICAgICBvbkVycm9yKHRva2VuLCAnVU5FWFBFQ1RFRF9UT0tFTicsIG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRzID0gdG9rZW4uc291cmNlO1xuICAgICAgICAgICAgICAgIGlmICh0cyAmJiB0eXBlb2YgdHMgPT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgICAgICAgICBsZW5ndGggKz0gdHMubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IG1vZGUsIGluZGVudCwgY2hvbXAsIGNvbW1lbnQsIGxlbmd0aCB9O1xufVxuLyoqIEByZXR1cm5zIEFycmF5IG9mIGxpbmVzIHNwbGl0IHVwIGFzIGBbaW5kZW50LCBjb250ZW50XWAgKi9cbmZ1bmN0aW9uIHNwbGl0TGluZXMoc291cmNlKSB7XG4gICAgY29uc3Qgc3BsaXQgPSBzb3VyY2Uuc3BsaXQoL1xcbiggKikvKTtcbiAgICBjb25zdCBmaXJzdCA9IHNwbGl0WzBdO1xuICAgIGNvbnN0IG0gPSBmaXJzdC5tYXRjaCgvXiggKikvKTtcbiAgICBjb25zdCBsaW5lMCA9IG0/LlsxXVxuICAgICAgICA/IFttWzFdLCBmaXJzdC5zbGljZShtWzFdLmxlbmd0aCldXG4gICAgICAgIDogWycnLCBmaXJzdF07XG4gICAgY29uc3QgbGluZXMgPSBbbGluZTBdO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgc3BsaXQubGVuZ3RoOyBpICs9IDIpXG4gICAgICAgIGxpbmVzLnB1c2goW3NwbGl0W2ldLCBzcGxpdFtpICsgMV1dKTtcbiAgICByZXR1cm4gbGluZXM7XG59XG5cbmV4cG9ydCB7IHJlc29sdmVCbG9ja1NjYWxhciB9O1xuIiwiaW1wb3J0IHsgU2NhbGFyIH0gZnJvbSAnLi4vbm9kZXMvU2NhbGFyLmpzJztcbmltcG9ydCB7IHJlc29sdmVFbmQgfSBmcm9tICcuL3Jlc29sdmUtZW5kLmpzJztcblxuZnVuY3Rpb24gcmVzb2x2ZUZsb3dTY2FsYXIoc2NhbGFyLCBzdHJpY3QsIG9uRXJyb3IpIHtcbiAgICBjb25zdCB7IG9mZnNldCwgdHlwZSwgc291cmNlLCBlbmQgfSA9IHNjYWxhcjtcbiAgICBsZXQgX3R5cGU7XG4gICAgbGV0IHZhbHVlO1xuICAgIGNvbnN0IF9vbkVycm9yID0gKHJlbCwgY29kZSwgbXNnKSA9PiBvbkVycm9yKG9mZnNldCArIHJlbCwgY29kZSwgbXNnKTtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgY2FzZSAnc2NhbGFyJzpcbiAgICAgICAgICAgIF90eXBlID0gU2NhbGFyLlBMQUlOO1xuICAgICAgICAgICAgdmFsdWUgPSBwbGFpblZhbHVlKHNvdXJjZSwgX29uRXJyb3IpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3NpbmdsZS1xdW90ZWQtc2NhbGFyJzpcbiAgICAgICAgICAgIF90eXBlID0gU2NhbGFyLlFVT1RFX1NJTkdMRTtcbiAgICAgICAgICAgIHZhbHVlID0gc2luZ2xlUXVvdGVkVmFsdWUoc291cmNlLCBfb25FcnJvcik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnZG91YmxlLXF1b3RlZC1zY2FsYXInOlxuICAgICAgICAgICAgX3R5cGUgPSBTY2FsYXIuUVVPVEVfRE9VQkxFO1xuICAgICAgICAgICAgdmFsdWUgPSBkb3VibGVRdW90ZWRWYWx1ZShzb3VyY2UsIF9vbkVycm9yKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCBzaG91bGQgbm90IGhhcHBlbiAqL1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgb25FcnJvcihzY2FsYXIsICdVTkVYUEVDVEVEX1RPS0VOJywgYEV4cGVjdGVkIGEgZmxvdyBzY2FsYXIgdmFsdWUsIGJ1dCBmb3VuZDogJHt0eXBlfWApO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogJycsXG4gICAgICAgICAgICAgICAgdHlwZTogbnVsbCxcbiAgICAgICAgICAgICAgICBjb21tZW50OiAnJyxcbiAgICAgICAgICAgICAgICByYW5nZTogW29mZnNldCwgb2Zmc2V0ICsgc291cmNlLmxlbmd0aCwgb2Zmc2V0ICsgc291cmNlLmxlbmd0aF1cbiAgICAgICAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlRW5kID0gb2Zmc2V0ICsgc291cmNlLmxlbmd0aDtcbiAgICBjb25zdCByZSA9IHJlc29sdmVFbmQoZW5kLCB2YWx1ZUVuZCwgc3RyaWN0LCBvbkVycm9yKTtcbiAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZSxcbiAgICAgICAgdHlwZTogX3R5cGUsXG4gICAgICAgIGNvbW1lbnQ6IHJlLmNvbW1lbnQsXG4gICAgICAgIHJhbmdlOiBbb2Zmc2V0LCB2YWx1ZUVuZCwgcmUub2Zmc2V0XVxuICAgIH07XG59XG5mdW5jdGlvbiBwbGFpblZhbHVlKHNvdXJjZSwgb25FcnJvcikge1xuICAgIGxldCBiYWRDaGFyID0gJyc7XG4gICAgc3dpdGNoIChzb3VyY2VbMF0pIHtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgc2hvdWxkIG5vdCBoYXBwZW4gKi9cbiAgICAgICAgY2FzZSAnXFx0JzpcbiAgICAgICAgICAgIGJhZENoYXIgPSAnYSB0YWIgY2hhcmFjdGVyJztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICcsJzpcbiAgICAgICAgICAgIGJhZENoYXIgPSAnZmxvdyBpbmRpY2F0b3IgY2hhcmFjdGVyICwnO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJyUnOlxuICAgICAgICAgICAgYmFkQ2hhciA9ICdkaXJlY3RpdmUgaW5kaWNhdG9yIGNoYXJhY3RlciAlJztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICd8JzpcbiAgICAgICAgY2FzZSAnPic6IHtcbiAgICAgICAgICAgIGJhZENoYXIgPSBgYmxvY2sgc2NhbGFyIGluZGljYXRvciAke3NvdXJjZVswXX1gO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnQCc6XG4gICAgICAgIGNhc2UgJ2AnOiB7XG4gICAgICAgICAgICBiYWRDaGFyID0gYHJlc2VydmVkIGNoYXJhY3RlciAke3NvdXJjZVswXX1gO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGJhZENoYXIpXG4gICAgICAgIG9uRXJyb3IoMCwgJ0JBRF9TQ0FMQVJfU1RBUlQnLCBgUGxhaW4gdmFsdWUgY2Fubm90IHN0YXJ0IHdpdGggJHtiYWRDaGFyfWApO1xuICAgIHJldHVybiB1bmZvbGRMaW5lcyhzb3VyY2UpO1xufVxuZnVuY3Rpb24gc2luZ2xlUXVvdGVkVmFsdWUoc291cmNlLCBvbkVycm9yKSB7XG4gICAgaWYgKHNvdXJjZVtzb3VyY2UubGVuZ3RoIC0gMV0gIT09IFwiJ1wiIHx8IHNvdXJjZS5sZW5ndGggPT09IDEpXG4gICAgICAgIG9uRXJyb3Ioc291cmNlLmxlbmd0aCwgJ01JU1NJTkdfQ0hBUicsIFwiTWlzc2luZyBjbG9zaW5nICdxdW90ZVwiKTtcbiAgICByZXR1cm4gdW5mb2xkTGluZXMoc291cmNlLnNsaWNlKDEsIC0xKSkucmVwbGFjZSgvJycvZywgXCInXCIpO1xufVxuZnVuY3Rpb24gdW5mb2xkTGluZXMoc291cmNlKSB7XG4gICAgY29uc3QgbGluZSA9IC8oLio/KVxccj9cXG4vc3k7XG4gICAgbGV0IG1hdGNoID0gbGluZS5leGVjKHNvdXJjZSk7XG4gICAgaWYgKCFtYXRjaClcbiAgICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICAvKipcbiAgICAgKiBUaGUgbmVnYXRpdmUgbG9va2JlaGluZHMgaW4gdGhlc2UgUmVnRXhwcyBhcmUgdG9cbiAgICAgKiBwcmV2ZW50IGNhdXNpbmcgYSBwb2x5bm9taWFsIHNlYXJjaCB0aW1lIGluIGNlcnRhaW4gY2FzZXMuXG4gICAgICpcbiAgICAgKiBUaGUgdHJ5LWNhdGNoIGlzIGZvciBTYWZhcmkgPCAxNi40IGFuZCBvdGhlciBvbGQgYnJvd3NlcnM6XG4gICAgICogaHR0cHM6Ly9jYW5pdXNlLmNvbS9qcy1yZWdleHAtbG9va2JlaGluZFxuICAgICAqL1xuICAgIGxldCB0cmltRW5kLCB0cmltQm90aDtcbiAgICB0cnkge1xuICAgICAgICB0cmltRW5kID0gbmV3IFJlZ0V4cCgnKD88IVsgXFx0XSlbIFxcdF0rJCcpO1xuICAgICAgICB0cmltQm90aCA9IG5ldyBSZWdFeHAoJ15bIFxcdF0rfCg/PCFbIFxcdF0pWyBcXHRdKyQnLCAnZycpO1xuICAgIH1cbiAgICBjYXRjaCB7XG4gICAgICAgIHRyaW1FbmQgPSAvWyBcXHRdKyQvO1xuICAgICAgICB0cmltQm90aCA9IC9eWyBcXHRdK3xbIFxcdF0rJC9nO1xuICAgIH1cbiAgICBsZXQgcmVzID0gbWF0Y2hbMV0ucmVwbGFjZSh0cmltRW5kLCAnJyk7XG4gICAgbGV0IHNlcCA9ICcgJztcbiAgICBsZXQgcG9zID0gbGluZS5sYXN0SW5kZXg7XG4gICAgd2hpbGUgKChtYXRjaCA9IGxpbmUuZXhlYyhzb3VyY2UpKSkge1xuICAgICAgICBjb25zdCBsbSA9IG1hdGNoWzFdLnJlcGxhY2UodHJpbUJvdGgsICcnKTtcbiAgICAgICAgaWYgKGxtID09PSAnJykge1xuICAgICAgICAgICAgaWYgKHNlcCA9PT0gJ1xcbicpXG4gICAgICAgICAgICAgICAgcmVzICs9IHNlcDtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBzZXAgPSAnXFxuJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlcyArPSBzZXAgKyBsbTtcbiAgICAgICAgICAgIHNlcCA9ICcgJztcbiAgICAgICAgfVxuICAgICAgICBwb3MgPSBsaW5lLmxhc3RJbmRleDtcbiAgICB9XG4gICAgY29uc3QgbGFzdCA9IC9bIFxcdF0qKC4qKS9zeTtcbiAgICBsYXN0Lmxhc3RJbmRleCA9IHBvcztcbiAgICBtYXRjaCA9IGxhc3QuZXhlYyhzb3VyY2UpO1xuICAgIHJldHVybiByZXMgKyBzZXAgKyAobWF0Y2g/LlsxXSA/PyAnJyk7XG59XG5mdW5jdGlvbiBkb3VibGVRdW90ZWRWYWx1ZShzb3VyY2UsIG9uRXJyb3IpIHtcbiAgICBsZXQgcmVzID0gJyc7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzb3VyY2UubGVuZ3RoIC0gMTsgKytpKSB7XG4gICAgICAgIGNvbnN0IGNoID0gc291cmNlW2ldO1xuICAgICAgICBpZiAoY2ggPT09ICdcXHInICYmIHNvdXJjZVtpICsgMV0gPT09ICdcXG4nKVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIGlmIChjaCA9PT0gJ1xcbicpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgZm9sZCwgb2Zmc2V0IH0gPSBmb2xkTmV3bGluZShzb3VyY2UsIGkpO1xuICAgICAgICAgICAgcmVzICs9IGZvbGQ7XG4gICAgICAgICAgICBpID0gb2Zmc2V0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNoID09PSAnXFxcXCcpIHtcbiAgICAgICAgICAgIGxldCBuZXh0ID0gc291cmNlWysraV07XG4gICAgICAgICAgICBjb25zdCBjYyA9IGVzY2FwZUNvZGVzW25leHRdO1xuICAgICAgICAgICAgaWYgKGNjKVxuICAgICAgICAgICAgICAgIHJlcyArPSBjYztcbiAgICAgICAgICAgIGVsc2UgaWYgKG5leHQgPT09ICdcXG4nKSB7XG4gICAgICAgICAgICAgICAgLy8gc2tpcCBlc2NhcGVkIG5ld2xpbmVzLCBidXQgc3RpbGwgdHJpbSB0aGUgZm9sbG93aW5nIGxpbmVcbiAgICAgICAgICAgICAgICBuZXh0ID0gc291cmNlW2kgKyAxXTtcbiAgICAgICAgICAgICAgICB3aGlsZSAobmV4dCA9PT0gJyAnIHx8IG5leHQgPT09ICdcXHQnKVxuICAgICAgICAgICAgICAgICAgICBuZXh0ID0gc291cmNlWysraSArIDFdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobmV4dCA9PT0gJ1xccicgJiYgc291cmNlW2kgKyAxXSA9PT0gJ1xcbicpIHtcbiAgICAgICAgICAgICAgICAvLyBza2lwIGVzY2FwZWQgQ1JMRiBuZXdsaW5lcywgYnV0IHN0aWxsIHRyaW0gdGhlIGZvbGxvd2luZyBsaW5lXG4gICAgICAgICAgICAgICAgbmV4dCA9IHNvdXJjZVsrK2kgKyAxXTtcbiAgICAgICAgICAgICAgICB3aGlsZSAobmV4dCA9PT0gJyAnIHx8IG5leHQgPT09ICdcXHQnKVxuICAgICAgICAgICAgICAgICAgICBuZXh0ID0gc291cmNlWysraSArIDFdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobmV4dCA9PT0gJ3gnIHx8IG5leHQgPT09ICd1JyB8fCBuZXh0ID09PSAnVScpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsZW5ndGggPSBuZXh0ID09PSAneCcgPyAyIDogbmV4dCA9PT0gJ3UnID8gNCA6IDg7XG4gICAgICAgICAgICAgICAgcmVzICs9IHBhcnNlQ2hhckNvZGUoc291cmNlLCBpICsgMSwgbGVuZ3RoLCBvbkVycm9yKTtcbiAgICAgICAgICAgICAgICBpICs9IGxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJhdyA9IHNvdXJjZS5zdWJzdHIoaSAtIDEsIDIpO1xuICAgICAgICAgICAgICAgIG9uRXJyb3IoaSAtIDEsICdCQURfRFFfRVNDQVBFJywgYEludmFsaWQgZXNjYXBlIHNlcXVlbmNlICR7cmF3fWApO1xuICAgICAgICAgICAgICAgIHJlcyArPSByYXc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY2ggPT09ICcgJyB8fCBjaCA9PT0gJ1xcdCcpIHtcbiAgICAgICAgICAgIC8vIHRyaW0gdHJhaWxpbmcgd2hpdGVzcGFjZVxuICAgICAgICAgICAgY29uc3Qgd3NTdGFydCA9IGk7XG4gICAgICAgICAgICBsZXQgbmV4dCA9IHNvdXJjZVtpICsgMV07XG4gICAgICAgICAgICB3aGlsZSAobmV4dCA9PT0gJyAnIHx8IG5leHQgPT09ICdcXHQnKVxuICAgICAgICAgICAgICAgIG5leHQgPSBzb3VyY2VbKytpICsgMV07XG4gICAgICAgICAgICBpZiAobmV4dCAhPT0gJ1xcbicgJiYgIShuZXh0ID09PSAnXFxyJyAmJiBzb3VyY2VbaSArIDJdID09PSAnXFxuJykpXG4gICAgICAgICAgICAgICAgcmVzICs9IGkgPiB3c1N0YXJ0ID8gc291cmNlLnNsaWNlKHdzU3RhcnQsIGkgKyAxKSA6IGNoO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVzICs9IGNoO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChzb3VyY2Vbc291cmNlLmxlbmd0aCAtIDFdICE9PSAnXCInIHx8IHNvdXJjZS5sZW5ndGggPT09IDEpXG4gICAgICAgIG9uRXJyb3Ioc291cmNlLmxlbmd0aCwgJ01JU1NJTkdfQ0hBUicsICdNaXNzaW5nIGNsb3NpbmcgXCJxdW90ZScpO1xuICAgIHJldHVybiByZXM7XG59XG4vKipcbiAqIEZvbGQgYSBzaW5nbGUgbmV3bGluZSBpbnRvIGEgc3BhY2UsIG11bHRpcGxlIG5ld2xpbmVzIHRvIE4gLSAxIG5ld2xpbmVzLlxuICogUHJlc3VtZXMgYHNvdXJjZVtvZmZzZXRdID09PSAnXFxuJ2BcbiAqL1xuZnVuY3Rpb24gZm9sZE5ld2xpbmUoc291cmNlLCBvZmZzZXQpIHtcbiAgICBsZXQgZm9sZCA9ICcnO1xuICAgIGxldCBjaCA9IHNvdXJjZVtvZmZzZXQgKyAxXTtcbiAgICB3aGlsZSAoY2ggPT09ICcgJyB8fCBjaCA9PT0gJ1xcdCcgfHwgY2ggPT09ICdcXG4nIHx8IGNoID09PSAnXFxyJykge1xuICAgICAgICBpZiAoY2ggPT09ICdcXHInICYmIHNvdXJjZVtvZmZzZXQgKyAyXSAhPT0gJ1xcbicpXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgaWYgKGNoID09PSAnXFxuJylcbiAgICAgICAgICAgIGZvbGQgKz0gJ1xcbic7XG4gICAgICAgIG9mZnNldCArPSAxO1xuICAgICAgICBjaCA9IHNvdXJjZVtvZmZzZXQgKyAxXTtcbiAgICB9XG4gICAgaWYgKCFmb2xkKVxuICAgICAgICBmb2xkID0gJyAnO1xuICAgIHJldHVybiB7IGZvbGQsIG9mZnNldCB9O1xufVxuY29uc3QgZXNjYXBlQ29kZXMgPSB7XG4gICAgJzAnOiAnXFwwJywgLy8gbnVsbCBjaGFyYWN0ZXJcbiAgICBhOiAnXFx4MDcnLCAvLyBiZWxsIGNoYXJhY3RlclxuICAgIGI6ICdcXGInLCAvLyBiYWNrc3BhY2VcbiAgICBlOiAnXFx4MWInLCAvLyBlc2NhcGUgY2hhcmFjdGVyXG4gICAgZjogJ1xcZicsIC8vIGZvcm0gZmVlZFxuICAgIG46ICdcXG4nLCAvLyBsaW5lIGZlZWRcbiAgICByOiAnXFxyJywgLy8gY2FycmlhZ2UgcmV0dXJuXG4gICAgdDogJ1xcdCcsIC8vIGhvcml6b250YWwgdGFiXG4gICAgdjogJ1xcdicsIC8vIHZlcnRpY2FsIHRhYlxuICAgIE46ICdcXHUwMDg1JywgLy8gVW5pY29kZSBuZXh0IGxpbmVcbiAgICBfOiAnXFx1MDBhMCcsIC8vIFVuaWNvZGUgbm9uLWJyZWFraW5nIHNwYWNlXG4gICAgTDogJ1xcdTIwMjgnLCAvLyBVbmljb2RlIGxpbmUgc2VwYXJhdG9yXG4gICAgUDogJ1xcdTIwMjknLCAvLyBVbmljb2RlIHBhcmFncmFwaCBzZXBhcmF0b3JcbiAgICAnICc6ICcgJyxcbiAgICAnXCInOiAnXCInLFxuICAgICcvJzogJy8nLFxuICAgICdcXFxcJzogJ1xcXFwnLFxuICAgICdcXHQnOiAnXFx0J1xufTtcbmZ1bmN0aW9uIHBhcnNlQ2hhckNvZGUoc291cmNlLCBvZmZzZXQsIGxlbmd0aCwgb25FcnJvcikge1xuICAgIGNvbnN0IGNjID0gc291cmNlLnN1YnN0cihvZmZzZXQsIGxlbmd0aCk7XG4gICAgY29uc3Qgb2sgPSBjYy5sZW5ndGggPT09IGxlbmd0aCAmJiAvXlswLTlhLWZBLUZdKyQvLnRlc3QoY2MpO1xuICAgIGNvbnN0IGNvZGUgPSBvayA/IHBhcnNlSW50KGNjLCAxNikgOiBOYU47XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ29kZVBvaW50KGNvZGUpO1xuICAgIH1cbiAgICBjYXRjaCB7XG4gICAgICAgIGNvbnN0IHJhdyA9IHNvdXJjZS5zdWJzdHIob2Zmc2V0IC0gMiwgbGVuZ3RoICsgMik7XG4gICAgICAgIG9uRXJyb3Iob2Zmc2V0IC0gMiwgJ0JBRF9EUV9FU0NBUEUnLCBgSW52YWxpZCBlc2NhcGUgc2VxdWVuY2UgJHtyYXd9YCk7XG4gICAgICAgIHJldHVybiByYXc7XG4gICAgfVxufVxuXG5leHBvcnQgeyByZXNvbHZlRmxvd1NjYWxhciB9O1xuIiwiaW1wb3J0IHsgaXNTY2FsYXIsIFNDQUxBUiB9IGZyb20gJy4uL25vZGVzL2lkZW50aXR5LmpzJztcbmltcG9ydCB7IFNjYWxhciB9IGZyb20gJy4uL25vZGVzL1NjYWxhci5qcyc7XG5pbXBvcnQgeyByZXNvbHZlQmxvY2tTY2FsYXIgfSBmcm9tICcuL3Jlc29sdmUtYmxvY2stc2NhbGFyLmpzJztcbmltcG9ydCB7IHJlc29sdmVGbG93U2NhbGFyIH0gZnJvbSAnLi9yZXNvbHZlLWZsb3ctc2NhbGFyLmpzJztcblxuZnVuY3Rpb24gY29tcG9zZVNjYWxhcihjdHgsIHRva2VuLCB0YWdUb2tlbiwgb25FcnJvcikge1xuICAgIGNvbnN0IHsgdmFsdWUsIHR5cGUsIGNvbW1lbnQsIHJhbmdlIH0gPSB0b2tlbi50eXBlID09PSAnYmxvY2stc2NhbGFyJ1xuICAgICAgICA/IHJlc29sdmVCbG9ja1NjYWxhcihjdHgsIHRva2VuLCBvbkVycm9yKVxuICAgICAgICA6IHJlc29sdmVGbG93U2NhbGFyKHRva2VuLCBjdHgub3B0aW9ucy5zdHJpY3QsIG9uRXJyb3IpO1xuICAgIGNvbnN0IHRhZ05hbWUgPSB0YWdUb2tlblxuICAgICAgICA/IGN0eC5kaXJlY3RpdmVzLnRhZ05hbWUodGFnVG9rZW4uc291cmNlLCBtc2cgPT4gb25FcnJvcih0YWdUb2tlbiwgJ1RBR19SRVNPTFZFX0ZBSUxFRCcsIG1zZykpXG4gICAgICAgIDogbnVsbDtcbiAgICBsZXQgdGFnO1xuICAgIGlmIChjdHgub3B0aW9ucy5zdHJpbmdLZXlzICYmIGN0eC5hdEtleSkge1xuICAgICAgICB0YWcgPSBjdHguc2NoZW1hW1NDQUxBUl07XG4gICAgfVxuICAgIGVsc2UgaWYgKHRhZ05hbWUpXG4gICAgICAgIHRhZyA9IGZpbmRTY2FsYXJUYWdCeU5hbWUoY3R4LnNjaGVtYSwgdmFsdWUsIHRhZ05hbWUsIHRhZ1Rva2VuLCBvbkVycm9yKTtcbiAgICBlbHNlIGlmICh0b2tlbi50eXBlID09PSAnc2NhbGFyJylcbiAgICAgICAgdGFnID0gZmluZFNjYWxhclRhZ0J5VGVzdChjdHgsIHZhbHVlLCB0b2tlbiwgb25FcnJvcik7XG4gICAgZWxzZVxuICAgICAgICB0YWcgPSBjdHguc2NoZW1hW1NDQUxBUl07XG4gICAgbGV0IHNjYWxhcjtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCByZXMgPSB0YWcucmVzb2x2ZSh2YWx1ZSwgbXNnID0+IG9uRXJyb3IodGFnVG9rZW4gPz8gdG9rZW4sICdUQUdfUkVTT0xWRV9GQUlMRUQnLCBtc2cpLCBjdHgub3B0aW9ucyk7XG4gICAgICAgIHNjYWxhciA9IGlzU2NhbGFyKHJlcykgPyByZXMgOiBuZXcgU2NhbGFyKHJlcyk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBtc2cgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgICAgIG9uRXJyb3IodGFnVG9rZW4gPz8gdG9rZW4sICdUQUdfUkVTT0xWRV9GQUlMRUQnLCBtc2cpO1xuICAgICAgICBzY2FsYXIgPSBuZXcgU2NhbGFyKHZhbHVlKTtcbiAgICB9XG4gICAgc2NhbGFyLnJhbmdlID0gcmFuZ2U7XG4gICAgc2NhbGFyLnNvdXJjZSA9IHZhbHVlO1xuICAgIGlmICh0eXBlKVxuICAgICAgICBzY2FsYXIudHlwZSA9IHR5cGU7XG4gICAgaWYgKHRhZ05hbWUpXG4gICAgICAgIHNjYWxhci50YWcgPSB0YWdOYW1lO1xuICAgIGlmICh0YWcuZm9ybWF0KVxuICAgICAgICBzY2FsYXIuZm9ybWF0ID0gdGFnLmZvcm1hdDtcbiAgICBpZiAoY29tbWVudClcbiAgICAgICAgc2NhbGFyLmNvbW1lbnQgPSBjb21tZW50O1xuICAgIHJldHVybiBzY2FsYXI7XG59XG5mdW5jdGlvbiBmaW5kU2NhbGFyVGFnQnlOYW1lKHNjaGVtYSwgdmFsdWUsIHRhZ05hbWUsIHRhZ1Rva2VuLCBvbkVycm9yKSB7XG4gICAgaWYgKHRhZ05hbWUgPT09ICchJylcbiAgICAgICAgcmV0dXJuIHNjaGVtYVtTQ0FMQVJdOyAvLyBub24tc3BlY2lmaWMgdGFnXG4gICAgY29uc3QgbWF0Y2hXaXRoVGVzdCA9IFtdO1xuICAgIGZvciAoY29uc3QgdGFnIG9mIHNjaGVtYS50YWdzKSB7XG4gICAgICAgIGlmICghdGFnLmNvbGxlY3Rpb24gJiYgdGFnLnRhZyA9PT0gdGFnTmFtZSkge1xuICAgICAgICAgICAgaWYgKHRhZy5kZWZhdWx0ICYmIHRhZy50ZXN0KVxuICAgICAgICAgICAgICAgIG1hdGNoV2l0aFRlc3QucHVzaCh0YWcpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiB0YWc7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCB0YWcgb2YgbWF0Y2hXaXRoVGVzdClcbiAgICAgICAgaWYgKHRhZy50ZXN0Py50ZXN0KHZhbHVlKSlcbiAgICAgICAgICAgIHJldHVybiB0YWc7XG4gICAgY29uc3Qga3QgPSBzY2hlbWEua25vd25UYWdzW3RhZ05hbWVdO1xuICAgIGlmIChrdCAmJiAha3QuY29sbGVjdGlvbikge1xuICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGUga25vd24gdGFnIGlzIGF2YWlsYWJsZSBmb3Igc3RyaW5naWZ5aW5nLFxuICAgICAgICAvLyBidXQgZG9lcyBub3QgZ2V0IHVzZWQgYnkgZGVmYXVsdC5cbiAgICAgICAgc2NoZW1hLnRhZ3MucHVzaChPYmplY3QuYXNzaWduKHt9LCBrdCwgeyBkZWZhdWx0OiBmYWxzZSwgdGVzdDogdW5kZWZpbmVkIH0pKTtcbiAgICAgICAgcmV0dXJuIGt0O1xuICAgIH1cbiAgICBvbkVycm9yKHRhZ1Rva2VuLCAnVEFHX1JFU09MVkVfRkFJTEVEJywgYFVucmVzb2x2ZWQgdGFnOiAke3RhZ05hbWV9YCwgdGFnTmFtZSAhPT0gJ3RhZzp5YW1sLm9yZywyMDAyOnN0cicpO1xuICAgIHJldHVybiBzY2hlbWFbU0NBTEFSXTtcbn1cbmZ1bmN0aW9uIGZpbmRTY2FsYXJUYWdCeVRlc3QoeyBhdEtleSwgZGlyZWN0aXZlcywgc2NoZW1hIH0sIHZhbHVlLCB0b2tlbiwgb25FcnJvcikge1xuICAgIGNvbnN0IHRhZyA9IHNjaGVtYS50YWdzLmZpbmQodGFnID0+ICh0YWcuZGVmYXVsdCA9PT0gdHJ1ZSB8fCAoYXRLZXkgJiYgdGFnLmRlZmF1bHQgPT09ICdrZXknKSkgJiZcbiAgICAgICAgdGFnLnRlc3Q/LnRlc3QodmFsdWUpKSB8fCBzY2hlbWFbU0NBTEFSXTtcbiAgICBpZiAoc2NoZW1hLmNvbXBhdCkge1xuICAgICAgICBjb25zdCBjb21wYXQgPSBzY2hlbWEuY29tcGF0LmZpbmQodGFnID0+IHRhZy5kZWZhdWx0ICYmIHRhZy50ZXN0Py50ZXN0KHZhbHVlKSkgPz9cbiAgICAgICAgICAgIHNjaGVtYVtTQ0FMQVJdO1xuICAgICAgICBpZiAodGFnLnRhZyAhPT0gY29tcGF0LnRhZykge1xuICAgICAgICAgICAgY29uc3QgdHMgPSBkaXJlY3RpdmVzLnRhZ1N0cmluZyh0YWcudGFnKTtcbiAgICAgICAgICAgIGNvbnN0IGNzID0gZGlyZWN0aXZlcy50YWdTdHJpbmcoY29tcGF0LnRhZyk7XG4gICAgICAgICAgICBjb25zdCBtc2cgPSBgVmFsdWUgbWF5IGJlIHBhcnNlZCBhcyBlaXRoZXIgJHt0c30gb3IgJHtjc31gO1xuICAgICAgICAgICAgb25FcnJvcih0b2tlbiwgJ1RBR19SRVNPTFZFX0ZBSUxFRCcsIG1zZywgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRhZztcbn1cblxuZXhwb3J0IHsgY29tcG9zZVNjYWxhciB9O1xuIiwiZnVuY3Rpb24gZW1wdHlTY2FsYXJQb3NpdGlvbihvZmZzZXQsIGJlZm9yZSwgcG9zKSB7XG4gICAgaWYgKGJlZm9yZSkge1xuICAgICAgICBwb3MgPz8gKHBvcyA9IGJlZm9yZS5sZW5ndGgpO1xuICAgICAgICBmb3IgKGxldCBpID0gcG9zIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgICAgIGxldCBzdCA9IGJlZm9yZVtpXTtcbiAgICAgICAgICAgIHN3aXRjaCAoc3QudHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ3NwYWNlJzpcbiAgICAgICAgICAgICAgICBjYXNlICdjb21tZW50JzpcbiAgICAgICAgICAgICAgICBjYXNlICduZXdsaW5lJzpcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0IC09IHN0LnNvdXJjZS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVGVjaG5pY2FsbHksIGFuIGVtcHR5IHNjYWxhciBpcyBpbW1lZGlhdGVseSBhZnRlciB0aGUgbGFzdCBub24tZW1wdHlcbiAgICAgICAgICAgIC8vIG5vZGUsIGJ1dCBpdCdzIG1vcmUgdXNlZnVsIHRvIHBsYWNlIGl0IGFmdGVyIGFueSB3aGl0ZXNwYWNlLlxuICAgICAgICAgICAgc3QgPSBiZWZvcmVbKytpXTtcbiAgICAgICAgICAgIHdoaWxlIChzdD8udHlwZSA9PT0gJ3NwYWNlJykge1xuICAgICAgICAgICAgICAgIG9mZnNldCArPSBzdC5zb3VyY2UubGVuZ3RoO1xuICAgICAgICAgICAgICAgIHN0ID0gYmVmb3JlWysraV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb2Zmc2V0O1xufVxuXG5leHBvcnQgeyBlbXB0eVNjYWxhclBvc2l0aW9uIH07XG4iLCJpbXBvcnQgeyBBbGlhcyB9IGZyb20gJy4uL25vZGVzL0FsaWFzLmpzJztcbmltcG9ydCB7IGlzU2NhbGFyIH0gZnJvbSAnLi4vbm9kZXMvaWRlbnRpdHkuanMnO1xuaW1wb3J0IHsgY29tcG9zZUNvbGxlY3Rpb24gfSBmcm9tICcuL2NvbXBvc2UtY29sbGVjdGlvbi5qcyc7XG5pbXBvcnQgeyBjb21wb3NlU2NhbGFyIH0gZnJvbSAnLi9jb21wb3NlLXNjYWxhci5qcyc7XG5pbXBvcnQgeyByZXNvbHZlRW5kIH0gZnJvbSAnLi9yZXNvbHZlLWVuZC5qcyc7XG5pbXBvcnQgeyBlbXB0eVNjYWxhclBvc2l0aW9uIH0gZnJvbSAnLi91dGlsLWVtcHR5LXNjYWxhci1wb3NpdGlvbi5qcyc7XG5cbmNvbnN0IENOID0geyBjb21wb3NlTm9kZSwgY29tcG9zZUVtcHR5Tm9kZSB9O1xuZnVuY3Rpb24gY29tcG9zZU5vZGUoY3R4LCB0b2tlbiwgcHJvcHMsIG9uRXJyb3IpIHtcbiAgICBjb25zdCBhdEtleSA9IGN0eC5hdEtleTtcbiAgICBjb25zdCB7IHNwYWNlQmVmb3JlLCBjb21tZW50LCBhbmNob3IsIHRhZyB9ID0gcHJvcHM7XG4gICAgbGV0IG5vZGU7XG4gICAgbGV0IGlzU3JjVG9rZW4gPSB0cnVlO1xuICAgIHN3aXRjaCAodG9rZW4udHlwZSkge1xuICAgICAgICBjYXNlICdhbGlhcyc6XG4gICAgICAgICAgICBub2RlID0gY29tcG9zZUFsaWFzKGN0eCwgdG9rZW4sIG9uRXJyb3IpO1xuICAgICAgICAgICAgaWYgKGFuY2hvciB8fCB0YWcpXG4gICAgICAgICAgICAgICAgb25FcnJvcih0b2tlbiwgJ0FMSUFTX1BST1BTJywgJ0FuIGFsaWFzIG5vZGUgbXVzdCBub3Qgc3BlY2lmeSBhbnkgcHJvcGVydGllcycpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3NjYWxhcic6XG4gICAgICAgIGNhc2UgJ3NpbmdsZS1xdW90ZWQtc2NhbGFyJzpcbiAgICAgICAgY2FzZSAnZG91YmxlLXF1b3RlZC1zY2FsYXInOlxuICAgICAgICBjYXNlICdibG9jay1zY2FsYXInOlxuICAgICAgICAgICAgbm9kZSA9IGNvbXBvc2VTY2FsYXIoY3R4LCB0b2tlbiwgdGFnLCBvbkVycm9yKTtcbiAgICAgICAgICAgIGlmIChhbmNob3IpXG4gICAgICAgICAgICAgICAgbm9kZS5hbmNob3IgPSBhbmNob3Iuc291cmNlLnN1YnN0cmluZygxKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdibG9jay1tYXAnOlxuICAgICAgICBjYXNlICdibG9jay1zZXEnOlxuICAgICAgICBjYXNlICdmbG93LWNvbGxlY3Rpb24nOlxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBub2RlID0gY29tcG9zZUNvbGxlY3Rpb24oQ04sIGN0eCwgdG9rZW4sIHByb3BzLCBvbkVycm9yKTtcbiAgICAgICAgICAgICAgICBpZiAoYW5jaG9yKVxuICAgICAgICAgICAgICAgICAgICBub2RlLmFuY2hvciA9IGFuY2hvci5zb3VyY2Uuc3Vic3RyaW5nKDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgLy8gQWxtb3N0IGNlcnRhaW5seSBoZXJlIGR1ZSB0byBhIHN0YWNrIG92ZXJmbG93XG4gICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICAgICAgICAgICAgICBvbkVycm9yKHRva2VuLCAnUkVTT1VSQ0VfRVhIQVVTVElPTicsIG1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB0b2tlbi50eXBlID09PSAnZXJyb3InXG4gICAgICAgICAgICAgICAgPyB0b2tlbi5tZXNzYWdlXG4gICAgICAgICAgICAgICAgOiBgVW5zdXBwb3J0ZWQgdG9rZW4gKHR5cGU6ICR7dG9rZW4udHlwZX0pYDtcbiAgICAgICAgICAgIG9uRXJyb3IodG9rZW4sICdVTkVYUEVDVEVEX1RPS0VOJywgbWVzc2FnZSk7XG4gICAgICAgICAgICBpc1NyY1Rva2VuID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbm9kZSA/PyAobm9kZSA9IGNvbXBvc2VFbXB0eU5vZGUoY3R4LCB0b2tlbi5vZmZzZXQsIHVuZGVmaW5lZCwgbnVsbCwgcHJvcHMsIG9uRXJyb3IpKTtcbiAgICBpZiAoYW5jaG9yICYmIG5vZGUuYW5jaG9yID09PSAnJylcbiAgICAgICAgb25FcnJvcihhbmNob3IsICdCQURfQUxJQVMnLCAnQW5jaG9yIGNhbm5vdCBiZSBhbiBlbXB0eSBzdHJpbmcnKTtcbiAgICBpZiAoYXRLZXkgJiZcbiAgICAgICAgY3R4Lm9wdGlvbnMuc3RyaW5nS2V5cyAmJlxuICAgICAgICAoIWlzU2NhbGFyKG5vZGUpIHx8XG4gICAgICAgICAgICB0eXBlb2Ygbm9kZS52YWx1ZSAhPT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgIChub2RlLnRhZyAmJiBub2RlLnRhZyAhPT0gJ3RhZzp5YW1sLm9yZywyMDAyOnN0cicpKSkge1xuICAgICAgICBjb25zdCBtc2cgPSAnV2l0aCBzdHJpbmdLZXlzLCBhbGwga2V5cyBtdXN0IGJlIHN0cmluZ3MnO1xuICAgICAgICBvbkVycm9yKHRhZyA/PyB0b2tlbiwgJ05PTl9TVFJJTkdfS0VZJywgbXNnKTtcbiAgICB9XG4gICAgaWYgKHNwYWNlQmVmb3JlKVxuICAgICAgICBub2RlLnNwYWNlQmVmb3JlID0gdHJ1ZTtcbiAgICBpZiAoY29tbWVudCkge1xuICAgICAgICBpZiAodG9rZW4udHlwZSA9PT0gJ3NjYWxhcicgJiYgdG9rZW4uc291cmNlID09PSAnJylcbiAgICAgICAgICAgIG5vZGUuY29tbWVudCA9IGNvbW1lbnQ7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIG5vZGUuY29tbWVudEJlZm9yZSA9IGNvbW1lbnQ7XG4gICAgfVxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgVHlwZSBjaGVja2luZyBtaXNzZXMgbWVhbmluZyBvZiBpc1NyY1Rva2VuXG4gICAgaWYgKGN0eC5vcHRpb25zLmtlZXBTb3VyY2VUb2tlbnMgJiYgaXNTcmNUb2tlbilcbiAgICAgICAgbm9kZS5zcmNUb2tlbiA9IHRva2VuO1xuICAgIHJldHVybiBub2RlO1xufVxuZnVuY3Rpb24gY29tcG9zZUVtcHR5Tm9kZShjdHgsIG9mZnNldCwgYmVmb3JlLCBwb3MsIHsgc3BhY2VCZWZvcmUsIGNvbW1lbnQsIGFuY2hvciwgdGFnLCBlbmQgfSwgb25FcnJvcikge1xuICAgIGNvbnN0IHRva2VuID0ge1xuICAgICAgICB0eXBlOiAnc2NhbGFyJyxcbiAgICAgICAgb2Zmc2V0OiBlbXB0eVNjYWxhclBvc2l0aW9uKG9mZnNldCwgYmVmb3JlLCBwb3MpLFxuICAgICAgICBpbmRlbnQ6IC0xLFxuICAgICAgICBzb3VyY2U6ICcnXG4gICAgfTtcbiAgICBjb25zdCBub2RlID0gY29tcG9zZVNjYWxhcihjdHgsIHRva2VuLCB0YWcsIG9uRXJyb3IpO1xuICAgIGlmIChhbmNob3IpIHtcbiAgICAgICAgbm9kZS5hbmNob3IgPSBhbmNob3Iuc291cmNlLnN1YnN0cmluZygxKTtcbiAgICAgICAgaWYgKG5vZGUuYW5jaG9yID09PSAnJylcbiAgICAgICAgICAgIG9uRXJyb3IoYW5jaG9yLCAnQkFEX0FMSUFTJywgJ0FuY2hvciBjYW5ub3QgYmUgYW4gZW1wdHkgc3RyaW5nJyk7XG4gICAgfVxuICAgIGlmIChzcGFjZUJlZm9yZSlcbiAgICAgICAgbm9kZS5zcGFjZUJlZm9yZSA9IHRydWU7XG4gICAgaWYgKGNvbW1lbnQpIHtcbiAgICAgICAgbm9kZS5jb21tZW50ID0gY29tbWVudDtcbiAgICAgICAgbm9kZS5yYW5nZVsyXSA9IGVuZDtcbiAgICB9XG4gICAgcmV0dXJuIG5vZGU7XG59XG5mdW5jdGlvbiBjb21wb3NlQWxpYXMoeyBvcHRpb25zIH0sIHsgb2Zmc2V0LCBzb3VyY2UsIGVuZCB9LCBvbkVycm9yKSB7XG4gICAgY29uc3QgYWxpYXMgPSBuZXcgQWxpYXMoc291cmNlLnN1YnN0cmluZygxKSk7XG4gICAgaWYgKGFsaWFzLnNvdXJjZSA9PT0gJycpXG4gICAgICAgIG9uRXJyb3Iob2Zmc2V0LCAnQkFEX0FMSUFTJywgJ0FsaWFzIGNhbm5vdCBiZSBhbiBlbXB0eSBzdHJpbmcnKTtcbiAgICBpZiAoYWxpYXMuc291cmNlLmVuZHNXaXRoKCc6JykpXG4gICAgICAgIG9uRXJyb3Iob2Zmc2V0ICsgc291cmNlLmxlbmd0aCAtIDEsICdCQURfQUxJQVMnLCAnQWxpYXMgZW5kaW5nIGluIDogaXMgYW1iaWd1b3VzJywgdHJ1ZSk7XG4gICAgY29uc3QgdmFsdWVFbmQgPSBvZmZzZXQgKyBzb3VyY2UubGVuZ3RoO1xuICAgIGNvbnN0IHJlID0gcmVzb2x2ZUVuZChlbmQsIHZhbHVlRW5kLCBvcHRpb25zLnN0cmljdCwgb25FcnJvcik7XG4gICAgYWxpYXMucmFuZ2UgPSBbb2Zmc2V0LCB2YWx1ZUVuZCwgcmUub2Zmc2V0XTtcbiAgICBpZiAocmUuY29tbWVudClcbiAgICAgICAgYWxpYXMuY29tbWVudCA9IHJlLmNvbW1lbnQ7XG4gICAgcmV0dXJuIGFsaWFzO1xufVxuXG5leHBvcnQgeyBjb21wb3NlRW1wdHlOb2RlLCBjb21wb3NlTm9kZSB9O1xuIiwiaW1wb3J0IHsgRG9jdW1lbnQgfSBmcm9tICcuLi9kb2MvRG9jdW1lbnQuanMnO1xuaW1wb3J0IHsgY29tcG9zZU5vZGUsIGNvbXBvc2VFbXB0eU5vZGUgfSBmcm9tICcuL2NvbXBvc2Utbm9kZS5qcyc7XG5pbXBvcnQgeyByZXNvbHZlRW5kIH0gZnJvbSAnLi9yZXNvbHZlLWVuZC5qcyc7XG5pbXBvcnQgeyByZXNvbHZlUHJvcHMgfSBmcm9tICcuL3Jlc29sdmUtcHJvcHMuanMnO1xuXG5mdW5jdGlvbiBjb21wb3NlRG9jKG9wdGlvbnMsIGRpcmVjdGl2ZXMsIHsgb2Zmc2V0LCBzdGFydCwgdmFsdWUsIGVuZCB9LCBvbkVycm9yKSB7XG4gICAgY29uc3Qgb3B0cyA9IE9iamVjdC5hc3NpZ24oeyBfZGlyZWN0aXZlczogZGlyZWN0aXZlcyB9LCBvcHRpb25zKTtcbiAgICBjb25zdCBkb2MgPSBuZXcgRG9jdW1lbnQodW5kZWZpbmVkLCBvcHRzKTtcbiAgICBjb25zdCBjdHggPSB7XG4gICAgICAgIGF0S2V5OiBmYWxzZSxcbiAgICAgICAgYXRSb290OiB0cnVlLFxuICAgICAgICBkaXJlY3RpdmVzOiBkb2MuZGlyZWN0aXZlcyxcbiAgICAgICAgb3B0aW9uczogZG9jLm9wdGlvbnMsXG4gICAgICAgIHNjaGVtYTogZG9jLnNjaGVtYVxuICAgIH07XG4gICAgY29uc3QgcHJvcHMgPSByZXNvbHZlUHJvcHMoc3RhcnQsIHtcbiAgICAgICAgaW5kaWNhdG9yOiAnZG9jLXN0YXJ0JyxcbiAgICAgICAgbmV4dDogdmFsdWUgPz8gZW5kPy5bMF0sXG4gICAgICAgIG9mZnNldCxcbiAgICAgICAgb25FcnJvcixcbiAgICAgICAgcGFyZW50SW5kZW50OiAwLFxuICAgICAgICBzdGFydE9uTmV3bGluZTogdHJ1ZVxuICAgIH0pO1xuICAgIGlmIChwcm9wcy5mb3VuZCkge1xuICAgICAgICBkb2MuZGlyZWN0aXZlcy5kb2NTdGFydCA9IHRydWU7XG4gICAgICAgIGlmICh2YWx1ZSAmJlxuICAgICAgICAgICAgKHZhbHVlLnR5cGUgPT09ICdibG9jay1tYXAnIHx8IHZhbHVlLnR5cGUgPT09ICdibG9jay1zZXEnKSAmJlxuICAgICAgICAgICAgIXByb3BzLmhhc05ld2xpbmUpXG4gICAgICAgICAgICBvbkVycm9yKHByb3BzLmVuZCwgJ01JU1NJTkdfQ0hBUicsICdCbG9jayBjb2xsZWN0aW9uIGNhbm5vdCBzdGFydCBvbiBzYW1lIGxpbmUgd2l0aCBkaXJlY3RpdmVzLWVuZCBtYXJrZXInKTtcbiAgICB9XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBJZiBDb250ZW50cyBpcyBzZXQsIGxldCdzIHRydXN0IHRoZSB1c2VyXG4gICAgZG9jLmNvbnRlbnRzID0gdmFsdWVcbiAgICAgICAgPyBjb21wb3NlTm9kZShjdHgsIHZhbHVlLCBwcm9wcywgb25FcnJvcilcbiAgICAgICAgOiBjb21wb3NlRW1wdHlOb2RlKGN0eCwgcHJvcHMuZW5kLCBzdGFydCwgbnVsbCwgcHJvcHMsIG9uRXJyb3IpO1xuICAgIGNvbnN0IGNvbnRlbnRFbmQgPSBkb2MuY29udGVudHMucmFuZ2VbMl07XG4gICAgY29uc3QgcmUgPSByZXNvbHZlRW5kKGVuZCwgY29udGVudEVuZCwgZmFsc2UsIG9uRXJyb3IpO1xuICAgIGlmIChyZS5jb21tZW50KVxuICAgICAgICBkb2MuY29tbWVudCA9IHJlLmNvbW1lbnQ7XG4gICAgZG9jLnJhbmdlID0gW29mZnNldCwgY29udGVudEVuZCwgcmUub2Zmc2V0XTtcbiAgICByZXR1cm4gZG9jO1xufVxuXG5leHBvcnQgeyBjb21wb3NlRG9jIH07XG4iLCJpbXBvcnQgeyBEaXJlY3RpdmVzIH0gZnJvbSAnLi4vZG9jL2RpcmVjdGl2ZXMuanMnO1xuaW1wb3J0IHsgRG9jdW1lbnQgfSBmcm9tICcuLi9kb2MvRG9jdW1lbnQuanMnO1xuaW1wb3J0IHsgWUFNTFdhcm5pbmcsIFlBTUxQYXJzZUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzLmpzJztcbmltcG9ydCB7IGlzQ29sbGVjdGlvbiwgaXNQYWlyIH0gZnJvbSAnLi4vbm9kZXMvaWRlbnRpdHkuanMnO1xuaW1wb3J0IHsgY29tcG9zZURvYyB9IGZyb20gJy4vY29tcG9zZS1kb2MuanMnO1xuaW1wb3J0IHsgcmVzb2x2ZUVuZCB9IGZyb20gJy4vcmVzb2x2ZS1lbmQuanMnO1xuXG5mdW5jdGlvbiBnZXRFcnJvclBvcyhzcmMpIHtcbiAgICBpZiAodHlwZW9mIHNyYyA9PT0gJ251bWJlcicpXG4gICAgICAgIHJldHVybiBbc3JjLCBzcmMgKyAxXTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShzcmMpKVxuICAgICAgICByZXR1cm4gc3JjLmxlbmd0aCA9PT0gMiA/IHNyYyA6IFtzcmNbMF0sIHNyY1sxXV07XG4gICAgY29uc3QgeyBvZmZzZXQsIHNvdXJjZSB9ID0gc3JjO1xuICAgIHJldHVybiBbb2Zmc2V0LCBvZmZzZXQgKyAodHlwZW9mIHNvdXJjZSA9PT0gJ3N0cmluZycgPyBzb3VyY2UubGVuZ3RoIDogMSldO1xufVxuZnVuY3Rpb24gcGFyc2VQcmVsdWRlKHByZWx1ZGUpIHtcbiAgICBsZXQgY29tbWVudCA9ICcnO1xuICAgIGxldCBhdENvbW1lbnQgPSBmYWxzZTtcbiAgICBsZXQgYWZ0ZXJFbXB0eUxpbmUgPSBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByZWx1ZGUubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY29uc3Qgc291cmNlID0gcHJlbHVkZVtpXTtcbiAgICAgICAgc3dpdGNoIChzb3VyY2VbMF0pIHtcbiAgICAgICAgICAgIGNhc2UgJyMnOlxuICAgICAgICAgICAgICAgIGNvbW1lbnQgKz1cbiAgICAgICAgICAgICAgICAgICAgKGNvbW1lbnQgPT09ICcnID8gJycgOiBhZnRlckVtcHR5TGluZSA/ICdcXG5cXG4nIDogJ1xcbicpICtcbiAgICAgICAgICAgICAgICAgICAgICAgIChzb3VyY2Uuc3Vic3RyaW5nKDEpIHx8ICcgJyk7XG4gICAgICAgICAgICAgICAgYXRDb21tZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBhZnRlckVtcHR5TGluZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnJSc6XG4gICAgICAgICAgICAgICAgaWYgKHByZWx1ZGVbaSArIDFdPy5bMF0gIT09ICcjJylcbiAgICAgICAgICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICAgICAgICAgIGF0Q29tbWVudCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAvLyBUaGlzIG1heSBiZSB3cm9uZyBhZnRlciBkb2MtZW5kLCBidXQgaW4gdGhhdCBjYXNlIGl0IGRvZXNuJ3QgbWF0dGVyXG4gICAgICAgICAgICAgICAgaWYgKCFhdENvbW1lbnQpXG4gICAgICAgICAgICAgICAgICAgIGFmdGVyRW1wdHlMaW5lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBhdENvbW1lbnQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyBjb21tZW50LCBhZnRlckVtcHR5TGluZSB9O1xufVxuLyoqXG4gKiBDb21wb3NlIGEgc3RyZWFtIG9mIENTVCBub2RlcyBpbnRvIGEgc3RyZWFtIG9mIFlBTUwgRG9jdW1lbnRzLlxuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBDb21wb3NlciwgUGFyc2VyIH0gZnJvbSAneWFtbCdcbiAqXG4gKiBjb25zdCBzcmM6IHN0cmluZyA9IC4uLlxuICogY29uc3QgdG9rZW5zID0gbmV3IFBhcnNlcigpLnBhcnNlKHNyYylcbiAqIGNvbnN0IGRvY3MgPSBuZXcgQ29tcG9zZXIoKS5jb21wb3NlKHRva2VucylcbiAqIGBgYFxuICovXG5jbGFzcyBDb21wb3NlciB7XG4gICAgY29uc3RydWN0b3Iob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMuZG9jID0gbnVsbDtcbiAgICAgICAgdGhpcy5hdERpcmVjdGl2ZXMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5wcmVsdWRlID0gW107XG4gICAgICAgIHRoaXMuZXJyb3JzID0gW107XG4gICAgICAgIHRoaXMud2FybmluZ3MgPSBbXTtcbiAgICAgICAgdGhpcy5vbkVycm9yID0gKHNvdXJjZSwgY29kZSwgbWVzc2FnZSwgd2FybmluZykgPT4ge1xuICAgICAgICAgICAgY29uc3QgcG9zID0gZ2V0RXJyb3JQb3Moc291cmNlKTtcbiAgICAgICAgICAgIGlmICh3YXJuaW5nKVxuICAgICAgICAgICAgICAgIHRoaXMud2FybmluZ3MucHVzaChuZXcgWUFNTFdhcm5pbmcocG9zLCBjb2RlLCBtZXNzYWdlKSk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdGhpcy5lcnJvcnMucHVzaChuZXcgWUFNTFBhcnNlRXJyb3IocG9zLCBjb2RlLCBtZXNzYWdlKSk7XG4gICAgICAgIH07XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLW51bGxpc2gtY29hbGVzY2luZ1xuICAgICAgICB0aGlzLmRpcmVjdGl2ZXMgPSBuZXcgRGlyZWN0aXZlcyh7IHZlcnNpb246IG9wdGlvbnMudmVyc2lvbiB8fCAnMS4yJyB9KTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB9XG4gICAgZGVjb3JhdGUoZG9jLCBhZnRlckRvYykge1xuICAgICAgICBjb25zdCB7IGNvbW1lbnQsIGFmdGVyRW1wdHlMaW5lIH0gPSBwYXJzZVByZWx1ZGUodGhpcy5wcmVsdWRlKTtcbiAgICAgICAgLy9jb25zb2xlLmxvZyh7IGRjOiBkb2MuY29tbWVudCwgcHJlbHVkZSwgY29tbWVudCB9KVxuICAgICAgICBpZiAoY29tbWVudCkge1xuICAgICAgICAgICAgY29uc3QgZGMgPSBkb2MuY29udGVudHM7XG4gICAgICAgICAgICBpZiAoYWZ0ZXJEb2MpIHtcbiAgICAgICAgICAgICAgICBkb2MuY29tbWVudCA9IGRvYy5jb21tZW50ID8gYCR7ZG9jLmNvbW1lbnR9XFxuJHtjb21tZW50fWAgOiBjb21tZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYWZ0ZXJFbXB0eUxpbmUgfHwgZG9jLmRpcmVjdGl2ZXMuZG9jU3RhcnQgfHwgIWRjKSB7XG4gICAgICAgICAgICAgICAgZG9jLmNvbW1lbnRCZWZvcmUgPSBjb21tZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXNDb2xsZWN0aW9uKGRjKSAmJiAhZGMuZmxvdyAmJiBkYy5pdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IGl0ID0gZGMuaXRlbXNbMF07XG4gICAgICAgICAgICAgICAgaWYgKGlzUGFpcihpdCkpXG4gICAgICAgICAgICAgICAgICAgIGl0ID0gaXQua2V5O1xuICAgICAgICAgICAgICAgIGNvbnN0IGNiID0gaXQuY29tbWVudEJlZm9yZTtcbiAgICAgICAgICAgICAgICBpdC5jb21tZW50QmVmb3JlID0gY2IgPyBgJHtjb21tZW50fVxcbiR7Y2J9YCA6IGNvbW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjYiA9IGRjLmNvbW1lbnRCZWZvcmU7XG4gICAgICAgICAgICAgICAgZGMuY29tbWVudEJlZm9yZSA9IGNiID8gYCR7Y29tbWVudH1cXG4ke2NifWAgOiBjb21tZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChhZnRlckRvYykge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmVycm9ycy5sZW5ndGg7ICsraSlcbiAgICAgICAgICAgICAgICBkb2MuZXJyb3JzLnB1c2godGhpcy5lcnJvcnNbaV0pO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLndhcm5pbmdzLmxlbmd0aDsgKytpKVxuICAgICAgICAgICAgICAgIGRvYy53YXJuaW5ncy5wdXNoKHRoaXMud2FybmluZ3NbaV0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZG9jLmVycm9ycyA9IHRoaXMuZXJyb3JzO1xuICAgICAgICAgICAgZG9jLndhcm5pbmdzID0gdGhpcy53YXJuaW5ncztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByZWx1ZGUgPSBbXTtcbiAgICAgICAgdGhpcy5lcnJvcnMgPSBbXTtcbiAgICAgICAgdGhpcy53YXJuaW5ncyA9IFtdO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDdXJyZW50IHN0cmVhbSBzdGF0dXMgaW5mb3JtYXRpb24uXG4gICAgICpcbiAgICAgKiBNb3N0bHkgdXNlZnVsIGF0IHRoZSBlbmQgb2YgaW5wdXQgZm9yIGFuIGVtcHR5IHN0cmVhbS5cbiAgICAgKi9cbiAgICBzdHJlYW1JbmZvKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29tbWVudDogcGFyc2VQcmVsdWRlKHRoaXMucHJlbHVkZSkuY29tbWVudCxcbiAgICAgICAgICAgIGRpcmVjdGl2ZXM6IHRoaXMuZGlyZWN0aXZlcyxcbiAgICAgICAgICAgIGVycm9yczogdGhpcy5lcnJvcnMsXG4gICAgICAgICAgICB3YXJuaW5nczogdGhpcy53YXJuaW5nc1xuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb21wb3NlIHRva2VucyBpbnRvIGRvY3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmb3JjZURvYyAtIElmIHRoZSBzdHJlYW0gY29udGFpbnMgbm8gZG9jdW1lbnQsIHN0aWxsIGVtaXQgYSBmaW5hbCBkb2N1bWVudCBpbmNsdWRpbmcgYW55IGNvbW1lbnRzIGFuZCBkaXJlY3RpdmVzIHRoYXQgd291bGQgYmUgYXBwbGllZCB0byBhIHN1YnNlcXVlbnQgZG9jdW1lbnQuXG4gICAgICogQHBhcmFtIGVuZE9mZnNldCAtIFNob3VsZCBiZSBzZXQgaWYgYGZvcmNlRG9jYCBpcyBhbHNvIHNldCwgdG8gc2V0IHRoZSBkb2N1bWVudCByYW5nZSBlbmQgYW5kIHRvIGluZGljYXRlIGVycm9ycyBjb3JyZWN0bHkuXG4gICAgICovXG4gICAgKmNvbXBvc2UodG9rZW5zLCBmb3JjZURvYyA9IGZhbHNlLCBlbmRPZmZzZXQgPSAtMSkge1xuICAgICAgICBmb3IgKGNvbnN0IHRva2VuIG9mIHRva2VucylcbiAgICAgICAgICAgIHlpZWxkKiB0aGlzLm5leHQodG9rZW4pO1xuICAgICAgICB5aWVsZCogdGhpcy5lbmQoZm9yY2VEb2MsIGVuZE9mZnNldCk7XG4gICAgfVxuICAgIC8qKiBBZHZhbmNlIHRoZSBjb21wb3NlciBieSBvbmUgQ1NUIHRva2VuLiAqL1xuICAgICpuZXh0KHRva2VuKSB7XG4gICAgICAgIHN3aXRjaCAodG9rZW4udHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnZGlyZWN0aXZlJzpcbiAgICAgICAgICAgICAgICB0aGlzLmRpcmVjdGl2ZXMuYWRkKHRva2VuLnNvdXJjZSwgKG9mZnNldCwgbWVzc2FnZSwgd2FybmluZykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwb3MgPSBnZXRFcnJvclBvcyh0b2tlbik7XG4gICAgICAgICAgICAgICAgICAgIHBvc1swXSArPSBvZmZzZXQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25FcnJvcihwb3MsICdCQURfRElSRUNUSVZFJywgbWVzc2FnZSwgd2FybmluZyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5wcmVsdWRlLnB1c2godG9rZW4uc291cmNlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmF0RGlyZWN0aXZlcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdkb2N1bWVudCc6IHtcbiAgICAgICAgICAgICAgICBjb25zdCBkb2MgPSBjb21wb3NlRG9jKHRoaXMub3B0aW9ucywgdGhpcy5kaXJlY3RpdmVzLCB0b2tlbiwgdGhpcy5vbkVycm9yKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hdERpcmVjdGl2ZXMgJiYgIWRvYy5kaXJlY3RpdmVzLmRvY1N0YXJ0KVxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uRXJyb3IodG9rZW4sICdNSVNTSU5HX0NIQVInLCAnTWlzc2luZyBkaXJlY3RpdmVzLWVuZC9kb2Mtc3RhcnQgaW5kaWNhdG9yIGxpbmUnKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRlY29yYXRlKGRvYywgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRvYylcbiAgICAgICAgICAgICAgICAgICAgeWllbGQgdGhpcy5kb2M7XG4gICAgICAgICAgICAgICAgdGhpcy5kb2MgPSBkb2M7XG4gICAgICAgICAgICAgICAgdGhpcy5hdERpcmVjdGl2ZXMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ2J5dGUtb3JkZXItbWFyayc6XG4gICAgICAgICAgICBjYXNlICdzcGFjZSc6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdjb21tZW50JzpcbiAgICAgICAgICAgIGNhc2UgJ25ld2xpbmUnOlxuICAgICAgICAgICAgICAgIHRoaXMucHJlbHVkZS5wdXNoKHRva2VuLnNvdXJjZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdlcnJvcic6IHtcbiAgICAgICAgICAgICAgICBjb25zdCBtc2cgPSB0b2tlbi5zb3VyY2VcbiAgICAgICAgICAgICAgICAgICAgPyBgJHt0b2tlbi5tZXNzYWdlfTogJHtKU09OLnN0cmluZ2lmeSh0b2tlbi5zb3VyY2UpfWBcbiAgICAgICAgICAgICAgICAgICAgOiB0b2tlbi5tZXNzYWdlO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IFlBTUxQYXJzZUVycm9yKGdldEVycm9yUG9zKHRva2VuKSwgJ1VORVhQRUNURURfVE9LRU4nLCBtc2cpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmF0RGlyZWN0aXZlcyB8fCAhdGhpcy5kb2MpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXJyb3JzLnB1c2goZXJyb3IpO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kb2MuZXJyb3JzLnB1c2goZXJyb3IpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnZG9jLWVuZCc6IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZG9jKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1zZyA9ICdVbmV4cGVjdGVkIGRvYy1lbmQgd2l0aG91dCBwcmVjZWRpbmcgZG9jdW1lbnQnO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVycm9ycy5wdXNoKG5ldyBZQU1MUGFyc2VFcnJvcihnZXRFcnJvclBvcyh0b2tlbiksICdVTkVYUEVDVEVEX1RPS0VOJywgbXNnKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmRvYy5kaXJlY3RpdmVzLmRvY0VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgY29uc3QgZW5kID0gcmVzb2x2ZUVuZCh0b2tlbi5lbmQsIHRva2VuLm9mZnNldCArIHRva2VuLnNvdXJjZS5sZW5ndGgsIHRoaXMuZG9jLm9wdGlvbnMuc3RyaWN0LCB0aGlzLm9uRXJyb3IpO1xuICAgICAgICAgICAgICAgIHRoaXMuZGVjb3JhdGUodGhpcy5kb2MsIHRydWUpO1xuICAgICAgICAgICAgICAgIGlmIChlbmQuY29tbWVudCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkYyA9IHRoaXMuZG9jLmNvbW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZG9jLmNvbW1lbnQgPSBkYyA/IGAke2RjfVxcbiR7ZW5kLmNvbW1lbnR9YCA6IGVuZC5jb21tZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmRvYy5yYW5nZVsyXSA9IGVuZC5vZmZzZXQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRoaXMuZXJyb3JzLnB1c2gobmV3IFlBTUxQYXJzZUVycm9yKGdldEVycm9yUG9zKHRva2VuKSwgJ1VORVhQRUNURURfVE9LRU4nLCBgVW5zdXBwb3J0ZWQgdG9rZW4gJHt0b2tlbi50eXBlfWApKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsIGF0IGVuZCBvZiBpbnB1dCB0byB5aWVsZCBhbnkgcmVtYWluaW5nIGRvY3VtZW50LlxuICAgICAqXG4gICAgICogQHBhcmFtIGZvcmNlRG9jIC0gSWYgdGhlIHN0cmVhbSBjb250YWlucyBubyBkb2N1bWVudCwgc3RpbGwgZW1pdCBhIGZpbmFsIGRvY3VtZW50IGluY2x1ZGluZyBhbnkgY29tbWVudHMgYW5kIGRpcmVjdGl2ZXMgdGhhdCB3b3VsZCBiZSBhcHBsaWVkIHRvIGEgc3Vic2VxdWVudCBkb2N1bWVudC5cbiAgICAgKiBAcGFyYW0gZW5kT2Zmc2V0IC0gU2hvdWxkIGJlIHNldCBpZiBgZm9yY2VEb2NgIGlzIGFsc28gc2V0LCB0byBzZXQgdGhlIGRvY3VtZW50IHJhbmdlIGVuZCBhbmQgdG8gaW5kaWNhdGUgZXJyb3JzIGNvcnJlY3RseS5cbiAgICAgKi9cbiAgICAqZW5kKGZvcmNlRG9jID0gZmFsc2UsIGVuZE9mZnNldCA9IC0xKSB7XG4gICAgICAgIGlmICh0aGlzLmRvYykge1xuICAgICAgICAgICAgdGhpcy5kZWNvcmF0ZSh0aGlzLmRvYywgdHJ1ZSk7XG4gICAgICAgICAgICB5aWVsZCB0aGlzLmRvYztcbiAgICAgICAgICAgIHRoaXMuZG9jID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChmb3JjZURvYykge1xuICAgICAgICAgICAgY29uc3Qgb3B0cyA9IE9iamVjdC5hc3NpZ24oeyBfZGlyZWN0aXZlczogdGhpcy5kaXJlY3RpdmVzIH0sIHRoaXMub3B0aW9ucyk7XG4gICAgICAgICAgICBjb25zdCBkb2MgPSBuZXcgRG9jdW1lbnQodW5kZWZpbmVkLCBvcHRzKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmF0RGlyZWN0aXZlcylcbiAgICAgICAgICAgICAgICB0aGlzLm9uRXJyb3IoZW5kT2Zmc2V0LCAnTUlTU0lOR19DSEFSJywgJ01pc3NpbmcgZGlyZWN0aXZlcy1lbmQgaW5kaWNhdG9yIGxpbmUnKTtcbiAgICAgICAgICAgIGRvYy5yYW5nZSA9IFswLCBlbmRPZmZzZXQsIGVuZE9mZnNldF07XG4gICAgICAgICAgICB0aGlzLmRlY29yYXRlKGRvYywgZmFsc2UpO1xuICAgICAgICAgICAgeWllbGQgZG9jO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgeyBDb21wb3NlciB9O1xuIiwiaW1wb3J0IHsgcmVzb2x2ZUJsb2NrU2NhbGFyIH0gZnJvbSAnLi4vY29tcG9zZS9yZXNvbHZlLWJsb2NrLXNjYWxhci5qcyc7XG5pbXBvcnQgeyByZXNvbHZlRmxvd1NjYWxhciB9IGZyb20gJy4uL2NvbXBvc2UvcmVzb2x2ZS1mbG93LXNjYWxhci5qcyc7XG5pbXBvcnQgeyBZQU1MUGFyc2VFcnJvciB9IGZyb20gJy4uL2Vycm9ycy5qcyc7XG5pbXBvcnQgeyBzdHJpbmdpZnlTdHJpbmcgfSBmcm9tICcuLi9zdHJpbmdpZnkvc3RyaW5naWZ5U3RyaW5nLmpzJztcblxuZnVuY3Rpb24gcmVzb2x2ZUFzU2NhbGFyKHRva2VuLCBzdHJpY3QgPSB0cnVlLCBvbkVycm9yKSB7XG4gICAgaWYgKHRva2VuKSB7XG4gICAgICAgIGNvbnN0IF9vbkVycm9yID0gKHBvcywgY29kZSwgbWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdHlwZW9mIHBvcyA9PT0gJ251bWJlcicgPyBwb3MgOiBBcnJheS5pc0FycmF5KHBvcykgPyBwb3NbMF0gOiBwb3Mub2Zmc2V0O1xuICAgICAgICAgICAgaWYgKG9uRXJyb3IpXG4gICAgICAgICAgICAgICAgb25FcnJvcihvZmZzZXQsIGNvZGUsIG1lc3NhZ2UpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBZQU1MUGFyc2VFcnJvcihbb2Zmc2V0LCBvZmZzZXQgKyAxXSwgY29kZSwgbWVzc2FnZSk7XG4gICAgICAgIH07XG4gICAgICAgIHN3aXRjaCAodG9rZW4udHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnc2NhbGFyJzpcbiAgICAgICAgICAgIGNhc2UgJ3NpbmdsZS1xdW90ZWQtc2NhbGFyJzpcbiAgICAgICAgICAgIGNhc2UgJ2RvdWJsZS1xdW90ZWQtc2NhbGFyJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZUZsb3dTY2FsYXIodG9rZW4sIHN0cmljdCwgX29uRXJyb3IpO1xuICAgICAgICAgICAgY2FzZSAnYmxvY2stc2NhbGFyJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZUJsb2NrU2NhbGFyKHsgb3B0aW9uczogeyBzdHJpY3QgfSB9LCB0b2tlbiwgX29uRXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuLyoqXG4gKiBDcmVhdGUgYSBuZXcgc2NhbGFyIHRva2VuIHdpdGggYHZhbHVlYFxuICpcbiAqIFZhbHVlcyB0aGF0IHJlcHJlc2VudCBhbiBhY3R1YWwgc3RyaW5nIGJ1dCBtYXkgYmUgcGFyc2VkIGFzIGEgZGlmZmVyZW50IHR5cGUgc2hvdWxkIHVzZSBhIGB0eXBlYCBvdGhlciB0aGFuIGAnUExBSU4nYCxcbiAqIGFzIHRoaXMgZnVuY3Rpb24gZG9lcyBub3Qgc3VwcG9ydCBhbnkgc2NoZW1hIG9wZXJhdGlvbnMgYW5kIHdvbid0IGNoZWNrIGZvciBzdWNoIGNvbmZsaWN0cy5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdmFsdWUsIHdoaWNoIHdpbGwgaGF2ZSBpdHMgY29udGVudCBwcm9wZXJseSBpbmRlbnRlZC5cbiAqIEBwYXJhbSBjb250ZXh0LmVuZCBDb21tZW50cyBhbmQgd2hpdGVzcGFjZSBhZnRlciB0aGUgZW5kIG9mIHRoZSB2YWx1ZSwgb3IgYWZ0ZXIgdGhlIGJsb2NrIHNjYWxhciBoZWFkZXIuIElmIHVuZGVmaW5lZCwgYSBuZXdsaW5lIHdpbGwgYmUgYWRkZWQuXG4gKiBAcGFyYW0gY29udGV4dC5pbXBsaWNpdEtleSBCZWluZyB3aXRoaW4gYW4gaW1wbGljaXQga2V5IG1heSBhZmZlY3QgdGhlIHJlc29sdmVkIHR5cGUgb2YgdGhlIHRva2VuJ3MgdmFsdWUuXG4gKiBAcGFyYW0gY29udGV4dC5pbmRlbnQgVGhlIGluZGVudCBsZXZlbCBvZiB0aGUgdG9rZW4uXG4gKiBAcGFyYW0gY29udGV4dC5pbkZsb3cgSXMgdGhpcyBzY2FsYXIgd2l0aGluIGEgZmxvdyBjb2xsZWN0aW9uPyBUaGlzIG1heSBhZmZlY3QgdGhlIHJlc29sdmVkIHR5cGUgb2YgdGhlIHRva2VuJ3MgdmFsdWUuXG4gKiBAcGFyYW0gY29udGV4dC5vZmZzZXQgVGhlIG9mZnNldCBwb3NpdGlvbiBvZiB0aGUgdG9rZW4uXG4gKiBAcGFyYW0gY29udGV4dC50eXBlIFRoZSBwcmVmZXJyZWQgdHlwZSBvZiB0aGUgc2NhbGFyIHRva2VuLiBJZiB1bmRlZmluZWQsIHRoZSBwcmV2aW91cyB0eXBlIG9mIHRoZSBgdG9rZW5gIHdpbGwgYmUgdXNlZCwgZGVmYXVsdGluZyB0byBgJ1BMQUlOJ2AuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVNjYWxhclRva2VuKHZhbHVlLCBjb250ZXh0KSB7XG4gICAgY29uc3QgeyBpbXBsaWNpdEtleSA9IGZhbHNlLCBpbmRlbnQsIGluRmxvdyA9IGZhbHNlLCBvZmZzZXQgPSAtMSwgdHlwZSA9ICdQTEFJTicgfSA9IGNvbnRleHQ7XG4gICAgY29uc3Qgc291cmNlID0gc3RyaW5naWZ5U3RyaW5nKHsgdHlwZSwgdmFsdWUgfSwge1xuICAgICAgICBpbXBsaWNpdEtleSxcbiAgICAgICAgaW5kZW50OiBpbmRlbnQgPiAwID8gJyAnLnJlcGVhdChpbmRlbnQpIDogJycsXG4gICAgICAgIGluRmxvdyxcbiAgICAgICAgb3B0aW9uczogeyBibG9ja1F1b3RlOiB0cnVlLCBsaW5lV2lkdGg6IC0xIH1cbiAgICB9KTtcbiAgICBjb25zdCBlbmQgPSBjb250ZXh0LmVuZCA/PyBbXG4gICAgICAgIHsgdHlwZTogJ25ld2xpbmUnLCBvZmZzZXQ6IC0xLCBpbmRlbnQsIHNvdXJjZTogJ1xcbicgfVxuICAgIF07XG4gICAgc3dpdGNoIChzb3VyY2VbMF0pIHtcbiAgICAgICAgY2FzZSAnfCc6XG4gICAgICAgIGNhc2UgJz4nOiB7XG4gICAgICAgICAgICBjb25zdCBoZSA9IHNvdXJjZS5pbmRleE9mKCdcXG4nKTtcbiAgICAgICAgICAgIGNvbnN0IGhlYWQgPSBzb3VyY2Uuc3Vic3RyaW5nKDAsIGhlKTtcbiAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBzb3VyY2Uuc3Vic3RyaW5nKGhlICsgMSkgKyAnXFxuJztcbiAgICAgICAgICAgIGNvbnN0IHByb3BzID0gW1xuICAgICAgICAgICAgICAgIHsgdHlwZTogJ2Jsb2NrLXNjYWxhci1oZWFkZXInLCBvZmZzZXQsIGluZGVudCwgc291cmNlOiBoZWFkIH1cbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBpZiAoIWFkZEVuZHRvQmxvY2tQcm9wcyhwcm9wcywgZW5kKSlcbiAgICAgICAgICAgICAgICBwcm9wcy5wdXNoKHsgdHlwZTogJ25ld2xpbmUnLCBvZmZzZXQ6IC0xLCBpbmRlbnQsIHNvdXJjZTogJ1xcbicgfSk7XG4gICAgICAgICAgICByZXR1cm4geyB0eXBlOiAnYmxvY2stc2NhbGFyJywgb2Zmc2V0LCBpbmRlbnQsIHByb3BzLCBzb3VyY2U6IGJvZHkgfTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdcIic6XG4gICAgICAgICAgICByZXR1cm4geyB0eXBlOiAnZG91YmxlLXF1b3RlZC1zY2FsYXInLCBvZmZzZXQsIGluZGVudCwgc291cmNlLCBlbmQgfTtcbiAgICAgICAgY2FzZSBcIidcIjpcbiAgICAgICAgICAgIHJldHVybiB7IHR5cGU6ICdzaW5nbGUtcXVvdGVkLXNjYWxhcicsIG9mZnNldCwgaW5kZW50LCBzb3VyY2UsIGVuZCB9O1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIHsgdHlwZTogJ3NjYWxhcicsIG9mZnNldCwgaW5kZW50LCBzb3VyY2UsIGVuZCB9O1xuICAgIH1cbn1cbi8qKlxuICogU2V0IHRoZSB2YWx1ZSBvZiBgdG9rZW5gIHRvIHRoZSBnaXZlbiBzdHJpbmcgYHZhbHVlYCwgb3ZlcndyaXRpbmcgYW55IHByZXZpb3VzIGNvbnRlbnRzIGFuZCB0eXBlIHRoYXQgaXQgbWF5IGhhdmUuXG4gKlxuICogQmVzdCBlZmZvcnRzIGFyZSBtYWRlIHRvIHJldGFpbiBhbnkgY29tbWVudHMgcHJldmlvdXNseSBhc3NvY2lhdGVkIHdpdGggdGhlIGB0b2tlbmAsXG4gKiB0aG91Z2ggYWxsIGNvbnRlbnRzIHdpdGhpbiBhIGNvbGxlY3Rpb24ncyBgaXRlbXNgIHdpbGwgYmUgb3ZlcndyaXR0ZW4uXG4gKlxuICogVmFsdWVzIHRoYXQgcmVwcmVzZW50IGFuIGFjdHVhbCBzdHJpbmcgYnV0IG1heSBiZSBwYXJzZWQgYXMgYSBkaWZmZXJlbnQgdHlwZSBzaG91bGQgdXNlIGEgYHR5cGVgIG90aGVyIHRoYW4gYCdQTEFJTidgLFxuICogYXMgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBzdXBwb3J0IGFueSBzY2hlbWEgb3BlcmF0aW9ucyBhbmQgd29uJ3QgY2hlY2sgZm9yIHN1Y2ggY29uZmxpY3RzLlxuICpcbiAqIEBwYXJhbSB0b2tlbiBBbnkgdG9rZW4uIElmIGl0IGRvZXMgbm90IGluY2x1ZGUgYW4gYGluZGVudGAgdmFsdWUsIHRoZSB2YWx1ZSB3aWxsIGJlIHN0cmluZ2lmaWVkIGFzIGlmIGl0IHdlcmUgYW4gaW1wbGljaXQga2V5LlxuICogQHBhcmFtIHZhbHVlIFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZhbHVlLCB3aGljaCB3aWxsIGhhdmUgaXRzIGNvbnRlbnQgcHJvcGVybHkgaW5kZW50ZWQuXG4gKiBAcGFyYW0gY29udGV4dC5hZnRlcktleSBJbiBtb3N0IGNhc2VzLCB2YWx1ZXMgYWZ0ZXIgYSBrZXkgc2hvdWxkIGhhdmUgYW4gYWRkaXRpb25hbCBsZXZlbCBvZiBpbmRlbnRhdGlvbi5cbiAqIEBwYXJhbSBjb250ZXh0LmltcGxpY2l0S2V5IEJlaW5nIHdpdGhpbiBhbiBpbXBsaWNpdCBrZXkgbWF5IGFmZmVjdCB0aGUgcmVzb2x2ZWQgdHlwZSBvZiB0aGUgdG9rZW4ncyB2YWx1ZS5cbiAqIEBwYXJhbSBjb250ZXh0LmluRmxvdyBCZWluZyB3aXRoaW4gYSBmbG93IGNvbGxlY3Rpb24gbWF5IGFmZmVjdCB0aGUgcmVzb2x2ZWQgdHlwZSBvZiB0aGUgdG9rZW4ncyB2YWx1ZS5cbiAqIEBwYXJhbSBjb250ZXh0LnR5cGUgVGhlIHByZWZlcnJlZCB0eXBlIG9mIHRoZSBzY2FsYXIgdG9rZW4uIElmIHVuZGVmaW5lZCwgdGhlIHByZXZpb3VzIHR5cGUgb2YgdGhlIGB0b2tlbmAgd2lsbCBiZSB1c2VkLCBkZWZhdWx0aW5nIHRvIGAnUExBSU4nYC5cbiAqL1xuZnVuY3Rpb24gc2V0U2NhbGFyVmFsdWUodG9rZW4sIHZhbHVlLCBjb250ZXh0ID0ge30pIHtcbiAgICBsZXQgeyBhZnRlcktleSA9IGZhbHNlLCBpbXBsaWNpdEtleSA9IGZhbHNlLCBpbkZsb3cgPSBmYWxzZSwgdHlwZSB9ID0gY29udGV4dDtcbiAgICBsZXQgaW5kZW50ID0gJ2luZGVudCcgaW4gdG9rZW4gPyB0b2tlbi5pbmRlbnQgOiBudWxsO1xuICAgIGlmIChhZnRlcktleSAmJiB0eXBlb2YgaW5kZW50ID09PSAnbnVtYmVyJylcbiAgICAgICAgaW5kZW50ICs9IDI7XG4gICAgaWYgKCF0eXBlKVxuICAgICAgICBzd2l0Y2ggKHRva2VuLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ3NpbmdsZS1xdW90ZWQtc2NhbGFyJzpcbiAgICAgICAgICAgICAgICB0eXBlID0gJ1FVT1RFX1NJTkdMRSc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdkb3VibGUtcXVvdGVkLXNjYWxhcic6XG4gICAgICAgICAgICAgICAgdHlwZSA9ICdRVU9URV9ET1VCTEUnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnYmxvY2stc2NhbGFyJzoge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhlYWRlciA9IHRva2VuLnByb3BzWzBdO1xuICAgICAgICAgICAgICAgIGlmIChoZWFkZXIudHlwZSAhPT0gJ2Jsb2NrLXNjYWxhci1oZWFkZXInKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYmxvY2sgc2NhbGFyIGhlYWRlcicpO1xuICAgICAgICAgICAgICAgIHR5cGUgPSBoZWFkZXIuc291cmNlWzBdID09PSAnPicgPyAnQkxPQ0tfRk9MREVEJyA6ICdCTE9DS19MSVRFUkFMJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdHlwZSA9ICdQTEFJTic7XG4gICAgICAgIH1cbiAgICBjb25zdCBzb3VyY2UgPSBzdHJpbmdpZnlTdHJpbmcoeyB0eXBlLCB2YWx1ZSB9LCB7XG4gICAgICAgIGltcGxpY2l0S2V5OiBpbXBsaWNpdEtleSB8fCBpbmRlbnQgPT09IG51bGwsXG4gICAgICAgIGluZGVudDogaW5kZW50ICE9PSBudWxsICYmIGluZGVudCA+IDAgPyAnICcucmVwZWF0KGluZGVudCkgOiAnJyxcbiAgICAgICAgaW5GbG93LFxuICAgICAgICBvcHRpb25zOiB7IGJsb2NrUXVvdGU6IHRydWUsIGxpbmVXaWR0aDogLTEgfVxuICAgIH0pO1xuICAgIHN3aXRjaCAoc291cmNlWzBdKSB7XG4gICAgICAgIGNhc2UgJ3wnOlxuICAgICAgICBjYXNlICc+JzpcbiAgICAgICAgICAgIHNldEJsb2NrU2NhbGFyVmFsdWUodG9rZW4sIHNvdXJjZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnXCInOlxuICAgICAgICAgICAgc2V0Rmxvd1NjYWxhclZhbHVlKHRva2VuLCBzb3VyY2UsICdkb3VibGUtcXVvdGVkLXNjYWxhcicpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCInXCI6XG4gICAgICAgICAgICBzZXRGbG93U2NhbGFyVmFsdWUodG9rZW4sIHNvdXJjZSwgJ3NpbmdsZS1xdW90ZWQtc2NhbGFyJyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHNldEZsb3dTY2FsYXJWYWx1ZSh0b2tlbiwgc291cmNlLCAnc2NhbGFyJyk7XG4gICAgfVxufVxuZnVuY3Rpb24gc2V0QmxvY2tTY2FsYXJWYWx1ZSh0b2tlbiwgc291cmNlKSB7XG4gICAgY29uc3QgaGUgPSBzb3VyY2UuaW5kZXhPZignXFxuJyk7XG4gICAgY29uc3QgaGVhZCA9IHNvdXJjZS5zdWJzdHJpbmcoMCwgaGUpO1xuICAgIGNvbnN0IGJvZHkgPSBzb3VyY2Uuc3Vic3RyaW5nKGhlICsgMSkgKyAnXFxuJztcbiAgICBpZiAodG9rZW4udHlwZSA9PT0gJ2Jsb2NrLXNjYWxhcicpIHtcbiAgICAgICAgY29uc3QgaGVhZGVyID0gdG9rZW4ucHJvcHNbMF07XG4gICAgICAgIGlmIChoZWFkZXIudHlwZSAhPT0gJ2Jsb2NrLXNjYWxhci1oZWFkZXInKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGJsb2NrIHNjYWxhciBoZWFkZXInKTtcbiAgICAgICAgaGVhZGVyLnNvdXJjZSA9IGhlYWQ7XG4gICAgICAgIHRva2VuLnNvdXJjZSA9IGJvZHk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCB7IG9mZnNldCB9ID0gdG9rZW47XG4gICAgICAgIGNvbnN0IGluZGVudCA9ICdpbmRlbnQnIGluIHRva2VuID8gdG9rZW4uaW5kZW50IDogLTE7XG4gICAgICAgIGNvbnN0IHByb3BzID0gW1xuICAgICAgICAgICAgeyB0eXBlOiAnYmxvY2stc2NhbGFyLWhlYWRlcicsIG9mZnNldCwgaW5kZW50LCBzb3VyY2U6IGhlYWQgfVxuICAgICAgICBdO1xuICAgICAgICBpZiAoIWFkZEVuZHRvQmxvY2tQcm9wcyhwcm9wcywgJ2VuZCcgaW4gdG9rZW4gPyB0b2tlbi5lbmQgOiB1bmRlZmluZWQpKVxuICAgICAgICAgICAgcHJvcHMucHVzaCh7IHR5cGU6ICduZXdsaW5lJywgb2Zmc2V0OiAtMSwgaW5kZW50LCBzb3VyY2U6ICdcXG4nIH0pO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh0b2tlbikpXG4gICAgICAgICAgICBpZiAoa2V5ICE9PSAndHlwZScgJiYga2V5ICE9PSAnb2Zmc2V0JylcbiAgICAgICAgICAgICAgICBkZWxldGUgdG9rZW5ba2V5XTtcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0b2tlbiwgeyB0eXBlOiAnYmxvY2stc2NhbGFyJywgaW5kZW50LCBwcm9wcywgc291cmNlOiBib2R5IH0pO1xuICAgIH1cbn1cbi8qKiBAcmV0dXJucyBgdHJ1ZWAgaWYgbGFzdCB0b2tlbiBpcyBhIG5ld2xpbmUgKi9cbmZ1bmN0aW9uIGFkZEVuZHRvQmxvY2tQcm9wcyhwcm9wcywgZW5kKSB7XG4gICAgaWYgKGVuZClcbiAgICAgICAgZm9yIChjb25zdCBzdCBvZiBlbmQpXG4gICAgICAgICAgICBzd2l0Y2ggKHN0LnR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdzcGFjZSc6XG4gICAgICAgICAgICAgICAgY2FzZSAnY29tbWVudCc6XG4gICAgICAgICAgICAgICAgICAgIHByb3BzLnB1c2goc3QpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICduZXdsaW5lJzpcbiAgICAgICAgICAgICAgICAgICAgcHJvcHMucHVzaChzdCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIHNldEZsb3dTY2FsYXJWYWx1ZSh0b2tlbiwgc291cmNlLCB0eXBlKSB7XG4gICAgc3dpdGNoICh0b2tlbi50eXBlKSB7XG4gICAgICAgIGNhc2UgJ3NjYWxhcic6XG4gICAgICAgIGNhc2UgJ2RvdWJsZS1xdW90ZWQtc2NhbGFyJzpcbiAgICAgICAgY2FzZSAnc2luZ2xlLXF1b3RlZC1zY2FsYXInOlxuICAgICAgICAgICAgdG9rZW4udHlwZSA9IHR5cGU7XG4gICAgICAgICAgICB0b2tlbi5zb3VyY2UgPSBzb3VyY2U7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnYmxvY2stc2NhbGFyJzoge1xuICAgICAgICAgICAgY29uc3QgZW5kID0gdG9rZW4ucHJvcHMuc2xpY2UoMSk7XG4gICAgICAgICAgICBsZXQgb2EgPSBzb3VyY2UubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKHRva2VuLnByb3BzWzBdLnR5cGUgPT09ICdibG9jay1zY2FsYXItaGVhZGVyJylcbiAgICAgICAgICAgICAgICBvYSAtPSB0b2tlbi5wcm9wc1swXS5zb3VyY2UubGVuZ3RoO1xuICAgICAgICAgICAgZm9yIChjb25zdCB0b2sgb2YgZW5kKVxuICAgICAgICAgICAgICAgIHRvay5vZmZzZXQgKz0gb2E7XG4gICAgICAgICAgICBkZWxldGUgdG9rZW4ucHJvcHM7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHRva2VuLCB7IHR5cGUsIHNvdXJjZSwgZW5kIH0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnYmxvY2stbWFwJzpcbiAgICAgICAgY2FzZSAnYmxvY2stc2VxJzoge1xuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdG9rZW4ub2Zmc2V0ICsgc291cmNlLmxlbmd0aDtcbiAgICAgICAgICAgIGNvbnN0IG5sID0geyB0eXBlOiAnbmV3bGluZScsIG9mZnNldCwgaW5kZW50OiB0b2tlbi5pbmRlbnQsIHNvdXJjZTogJ1xcbicgfTtcbiAgICAgICAgICAgIGRlbGV0ZSB0b2tlbi5pdGVtcztcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24odG9rZW4sIHsgdHlwZSwgc291cmNlLCBlbmQ6IFtubF0gfSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBjb25zdCBpbmRlbnQgPSAnaW5kZW50JyBpbiB0b2tlbiA/IHRva2VuLmluZGVudCA6IC0xO1xuICAgICAgICAgICAgY29uc3QgZW5kID0gJ2VuZCcgaW4gdG9rZW4gJiYgQXJyYXkuaXNBcnJheSh0b2tlbi5lbmQpXG4gICAgICAgICAgICAgICAgPyB0b2tlbi5lbmQuZmlsdGVyKHN0ID0+IHN0LnR5cGUgPT09ICdzcGFjZScgfHxcbiAgICAgICAgICAgICAgICAgICAgc3QudHlwZSA9PT0gJ2NvbW1lbnQnIHx8XG4gICAgICAgICAgICAgICAgICAgIHN0LnR5cGUgPT09ICduZXdsaW5lJylcbiAgICAgICAgICAgICAgICA6IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModG9rZW4pKVxuICAgICAgICAgICAgICAgIGlmIChrZXkgIT09ICd0eXBlJyAmJiBrZXkgIT09ICdvZmZzZXQnKVxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgdG9rZW5ba2V5XTtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24odG9rZW4sIHsgdHlwZSwgaW5kZW50LCBzb3VyY2UsIGVuZCB9KTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IHsgY3JlYXRlU2NhbGFyVG9rZW4sIHJlc29sdmVBc1NjYWxhciwgc2V0U2NhbGFyVmFsdWUgfTtcbiIsIi8qKlxuICogU3RyaW5naWZ5IGEgQ1NUIGRvY3VtZW50LCB0b2tlbiwgb3IgY29sbGVjdGlvbiBpdGVtXG4gKlxuICogRmFpciB3YXJuaW5nOiBUaGlzIGFwcGxpZXMgbm8gdmFsaWRhdGlvbiB3aGF0c29ldmVyLCBhbmRcbiAqIHNpbXBseSBjb25jYXRlbmF0ZXMgdGhlIHNvdXJjZXMgaW4gdGhlaXIgbG9naWNhbCBvcmRlci5cbiAqL1xuY29uc3Qgc3RyaW5naWZ5ID0gKGNzdCkgPT4gJ3R5cGUnIGluIGNzdCA/IHN0cmluZ2lmeVRva2VuKGNzdCkgOiBzdHJpbmdpZnlJdGVtKGNzdCk7XG5mdW5jdGlvbiBzdHJpbmdpZnlUb2tlbih0b2tlbikge1xuICAgIHN3aXRjaCAodG9rZW4udHlwZSkge1xuICAgICAgICBjYXNlICdibG9jay1zY2FsYXInOiB7XG4gICAgICAgICAgICBsZXQgcmVzID0gJyc7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHRvayBvZiB0b2tlbi5wcm9wcylcbiAgICAgICAgICAgICAgICByZXMgKz0gc3RyaW5naWZ5VG9rZW4odG9rKTtcbiAgICAgICAgICAgIHJldHVybiByZXMgKyB0b2tlbi5zb3VyY2U7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnYmxvY2stbWFwJzpcbiAgICAgICAgY2FzZSAnYmxvY2stc2VxJzoge1xuICAgICAgICAgICAgbGV0IHJlcyA9ICcnO1xuICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHRva2VuLml0ZW1zKVxuICAgICAgICAgICAgICAgIHJlcyArPSBzdHJpbmdpZnlJdGVtKGl0ZW0pO1xuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdmbG93LWNvbGxlY3Rpb24nOiB7XG4gICAgICAgICAgICBsZXQgcmVzID0gdG9rZW4uc3RhcnQuc291cmNlO1xuICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHRva2VuLml0ZW1zKVxuICAgICAgICAgICAgICAgIHJlcyArPSBzdHJpbmdpZnlJdGVtKGl0ZW0pO1xuICAgICAgICAgICAgZm9yIChjb25zdCBzdCBvZiB0b2tlbi5lbmQpXG4gICAgICAgICAgICAgICAgcmVzICs9IHN0LnNvdXJjZTtcbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZG9jdW1lbnQnOiB7XG4gICAgICAgICAgICBsZXQgcmVzID0gc3RyaW5naWZ5SXRlbSh0b2tlbik7XG4gICAgICAgICAgICBpZiAodG9rZW4uZW5kKVxuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc3Qgb2YgdG9rZW4uZW5kKVxuICAgICAgICAgICAgICAgICAgICByZXMgKz0gc3Quc291cmNlO1xuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBsZXQgcmVzID0gdG9rZW4uc291cmNlO1xuICAgICAgICAgICAgaWYgKCdlbmQnIGluIHRva2VuICYmIHRva2VuLmVuZClcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHN0IG9mIHRva2VuLmVuZClcbiAgICAgICAgICAgICAgICAgICAgcmVzICs9IHN0LnNvdXJjZTtcbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBzdHJpbmdpZnlJdGVtKHsgc3RhcnQsIGtleSwgc2VwLCB2YWx1ZSB9KSB7XG4gICAgbGV0IHJlcyA9ICcnO1xuICAgIGZvciAoY29uc3Qgc3Qgb2Ygc3RhcnQpXG4gICAgICAgIHJlcyArPSBzdC5zb3VyY2U7XG4gICAgaWYgKGtleSlcbiAgICAgICAgcmVzICs9IHN0cmluZ2lmeVRva2VuKGtleSk7XG4gICAgaWYgKHNlcClcbiAgICAgICAgZm9yIChjb25zdCBzdCBvZiBzZXApXG4gICAgICAgICAgICByZXMgKz0gc3Quc291cmNlO1xuICAgIGlmICh2YWx1ZSlcbiAgICAgICAgcmVzICs9IHN0cmluZ2lmeVRva2VuKHZhbHVlKTtcbiAgICByZXR1cm4gcmVzO1xufVxuXG5leHBvcnQgeyBzdHJpbmdpZnkgfTtcbiIsImNvbnN0IEJSRUFLID0gU3ltYm9sKCdicmVhayB2aXNpdCcpO1xuY29uc3QgU0tJUCA9IFN5bWJvbCgnc2tpcCBjaGlsZHJlbicpO1xuY29uc3QgUkVNT1ZFID0gU3ltYm9sKCdyZW1vdmUgaXRlbScpO1xuLyoqXG4gKiBBcHBseSBhIHZpc2l0b3IgdG8gYSBDU1QgZG9jdW1lbnQgb3IgaXRlbS5cbiAqXG4gKiBXYWxrcyB0aHJvdWdoIHRoZSB0cmVlIChkZXB0aC1maXJzdCkgc3RhcnRpbmcgZnJvbSB0aGUgcm9vdCwgY2FsbGluZyBhXG4gKiBgdmlzaXRvcmAgZnVuY3Rpb24gd2l0aCB0d28gYXJndW1lbnRzIHdoZW4gZW50ZXJpbmcgZWFjaCBpdGVtOlxuICogICAtIGBpdGVtYDogVGhlIGN1cnJlbnQgaXRlbSwgd2hpY2ggaW5jbHVkZWQgdGhlIGZvbGxvd2luZyBtZW1iZXJzOlxuICogICAgIC0gYHN0YXJ0OiBTb3VyY2VUb2tlbltdYCDigJMgU291cmNlIHRva2VucyBiZWZvcmUgdGhlIGtleSBvciB2YWx1ZSxcbiAqICAgICAgIHBvc3NpYmx5IGluY2x1ZGluZyBpdHMgYW5jaG9yIG9yIHRhZy5cbiAqICAgICAtIGBrZXk/OiBUb2tlbiB8IG51bGxgIOKAkyBTZXQgZm9yIHBhaXIgdmFsdWVzLiBNYXkgdGhlbiBiZSBgbnVsbGAsIGlmXG4gKiAgICAgICB0aGUga2V5IGJlZm9yZSB0aGUgYDpgIHNlcGFyYXRvciBpcyBlbXB0eS5cbiAqICAgICAtIGBzZXA/OiBTb3VyY2VUb2tlbltdYCDigJMgU291cmNlIHRva2VucyBiZXR3ZWVuIHRoZSBrZXkgYW5kIHRoZSB2YWx1ZSxcbiAqICAgICAgIHdoaWNoIHNob3VsZCBpbmNsdWRlIHRoZSBgOmAgbWFwIHZhbHVlIGluZGljYXRvciBpZiBgdmFsdWVgIGlzIHNldC5cbiAqICAgICAtIGB2YWx1ZT86IFRva2VuYCDigJMgVGhlIHZhbHVlIG9mIGEgc2VxdWVuY2UgaXRlbSwgb3Igb2YgYSBtYXAgcGFpci5cbiAqICAgLSBgcGF0aGA6IFRoZSBzdGVwcyBmcm9tIHRoZSByb290IHRvIHRoZSBjdXJyZW50IG5vZGUsIGFzIGFuIGFycmF5IG9mXG4gKiAgICAgYFsna2V5JyB8ICd2YWx1ZScsIG51bWJlcl1gIHR1cGxlcy5cbiAqXG4gKiBUaGUgcmV0dXJuIHZhbHVlIG9mIHRoZSB2aXNpdG9yIG1heSBiZSB1c2VkIHRvIGNvbnRyb2wgdGhlIHRyYXZlcnNhbDpcbiAqICAgLSBgdW5kZWZpbmVkYCAoZGVmYXVsdCk6IERvIG5vdGhpbmcgYW5kIGNvbnRpbnVlXG4gKiAgIC0gYHZpc2l0LlNLSVBgOiBEbyBub3QgdmlzaXQgdGhlIGNoaWxkcmVuIG9mIHRoaXMgdG9rZW4sIGNvbnRpbnVlIHdpdGhcbiAqICAgICAgbmV4dCBzaWJsaW5nXG4gKiAgIC0gYHZpc2l0LkJSRUFLYDogVGVybWluYXRlIHRyYXZlcnNhbCBjb21wbGV0ZWx5XG4gKiAgIC0gYHZpc2l0LlJFTU9WRWA6IFJlbW92ZSB0aGUgY3VycmVudCBpdGVtLCB0aGVuIGNvbnRpbnVlIHdpdGggdGhlIG5leHQgb25lXG4gKiAgIC0gYG51bWJlcmA6IFNldCB0aGUgaW5kZXggb2YgdGhlIG5leHQgc3RlcC4gVGhpcyBpcyB1c2VmdWwgZXNwZWNpYWxseSBpZlxuICogICAgIHRoZSBpbmRleCBvZiB0aGUgY3VycmVudCB0b2tlbiBoYXMgY2hhbmdlZC5cbiAqICAgLSBgZnVuY3Rpb25gOiBEZWZpbmUgdGhlIG5leHQgdmlzaXRvciBmb3IgdGhpcyBpdGVtLiBBZnRlciB0aGUgb3JpZ2luYWxcbiAqICAgICB2aXNpdG9yIGlzIGNhbGxlZCBvbiBpdGVtIGVudHJ5LCBuZXh0IHZpc2l0b3JzIGFyZSBjYWxsZWQgYWZ0ZXIgaGFuZGxpbmdcbiAqICAgICBhIG5vbi1lbXB0eSBga2V5YCBhbmQgd2hlbiBleGl0aW5nIHRoZSBpdGVtLlxuICovXG5mdW5jdGlvbiB2aXNpdChjc3QsIHZpc2l0b3IpIHtcbiAgICBpZiAoJ3R5cGUnIGluIGNzdCAmJiBjc3QudHlwZSA9PT0gJ2RvY3VtZW50JylcbiAgICAgICAgY3N0ID0geyBzdGFydDogY3N0LnN0YXJ0LCB2YWx1ZTogY3N0LnZhbHVlIH07XG4gICAgX3Zpc2l0KE9iamVjdC5mcmVlemUoW10pLCBjc3QsIHZpc2l0b3IpO1xufVxuLy8gV2l0aG91dCB0aGUgYGFzIHN5bWJvbGAgY2FzdHMsIFRTIGRlY2xhcmVzIHRoZXNlIGluIHRoZSBgdmlzaXRgXG4vLyBuYW1lc3BhY2UgdXNpbmcgYHZhcmAsIGJ1dCB0aGVuIGNvbXBsYWlucyBhYm91dCB0aGF0IGJlY2F1c2Vcbi8vIGB1bmlxdWUgc3ltYm9sYCBtdXN0IGJlIGBjb25zdGAuXG4vKiogVGVybWluYXRlIHZpc2l0IHRyYXZlcnNhbCBjb21wbGV0ZWx5ICovXG52aXNpdC5CUkVBSyA9IEJSRUFLO1xuLyoqIERvIG5vdCB2aXNpdCB0aGUgY2hpbGRyZW4gb2YgdGhlIGN1cnJlbnQgaXRlbSAqL1xudmlzaXQuU0tJUCA9IFNLSVA7XG4vKiogUmVtb3ZlIHRoZSBjdXJyZW50IGl0ZW0gKi9cbnZpc2l0LlJFTU9WRSA9IFJFTU9WRTtcbi8qKiBGaW5kIHRoZSBpdGVtIGF0IGBwYXRoYCBmcm9tIGBjc3RgIGFzIHRoZSByb290ICovXG52aXNpdC5pdGVtQXRQYXRoID0gKGNzdCwgcGF0aCkgPT4ge1xuICAgIGxldCBpdGVtID0gY3N0O1xuICAgIGZvciAoY29uc3QgW2ZpZWxkLCBpbmRleF0gb2YgcGF0aCkge1xuICAgICAgICBjb25zdCB0b2sgPSBpdGVtPy5bZmllbGRdO1xuICAgICAgICBpZiAodG9rICYmICdpdGVtcycgaW4gdG9rKSB7XG4gICAgICAgICAgICBpdGVtID0gdG9rLml0ZW1zW2luZGV4XTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gaXRlbTtcbn07XG4vKipcbiAqIEdldCB0aGUgaW1tZWRpYXRlIHBhcmVudCBjb2xsZWN0aW9uIG9mIHRoZSBpdGVtIGF0IGBwYXRoYCBmcm9tIGBjc3RgIGFzIHRoZSByb290LlxuICpcbiAqIFRocm93cyBhbiBlcnJvciBpZiB0aGUgY29sbGVjdGlvbiBpcyBub3QgZm91bmQsIHdoaWNoIHNob3VsZCBuZXZlciBoYXBwZW4gaWYgdGhlIGl0ZW0gaXRzZWxmIGV4aXN0cy5cbiAqL1xudmlzaXQucGFyZW50Q29sbGVjdGlvbiA9IChjc3QsIHBhdGgpID0+IHtcbiAgICBjb25zdCBwYXJlbnQgPSB2aXNpdC5pdGVtQXRQYXRoKGNzdCwgcGF0aC5zbGljZSgwLCAtMSkpO1xuICAgIGNvbnN0IGZpZWxkID0gcGF0aFtwYXRoLmxlbmd0aCAtIDFdWzBdO1xuICAgIGNvbnN0IGNvbGwgPSBwYXJlbnQ/LltmaWVsZF07XG4gICAgaWYgKGNvbGwgJiYgJ2l0ZW1zJyBpbiBjb2xsKVxuICAgICAgICByZXR1cm4gY29sbDtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhcmVudCBjb2xsZWN0aW9uIG5vdCBmb3VuZCcpO1xufTtcbmZ1bmN0aW9uIF92aXNpdChwYXRoLCBpdGVtLCB2aXNpdG9yKSB7XG4gICAgbGV0IGN0cmwgPSB2aXNpdG9yKGl0ZW0sIHBhdGgpO1xuICAgIGlmICh0eXBlb2YgY3RybCA9PT0gJ3N5bWJvbCcpXG4gICAgICAgIHJldHVybiBjdHJsO1xuICAgIGZvciAoY29uc3QgZmllbGQgb2YgWydrZXknLCAndmFsdWUnXSkge1xuICAgICAgICBjb25zdCB0b2tlbiA9IGl0ZW1bZmllbGRdO1xuICAgICAgICBpZiAodG9rZW4gJiYgJ2l0ZW1zJyBpbiB0b2tlbikge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b2tlbi5pdGVtcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNpID0gX3Zpc2l0KE9iamVjdC5mcmVlemUocGF0aC5jb25jYXQoW1tmaWVsZCwgaV1dKSksIHRva2VuLml0ZW1zW2ldLCB2aXNpdG9yKTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNpID09PSAnbnVtYmVyJylcbiAgICAgICAgICAgICAgICAgICAgaSA9IGNpIC0gMTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjaSA9PT0gQlJFQUspXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBCUkVBSztcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjaSA9PT0gUkVNT1ZFKSB7XG4gICAgICAgICAgICAgICAgICAgIHRva2VuLml0ZW1zLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgaSAtPSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgY3RybCA9PT0gJ2Z1bmN0aW9uJyAmJiBmaWVsZCA9PT0gJ2tleScpXG4gICAgICAgICAgICAgICAgY3RybCA9IGN0cmwoaXRlbSwgcGF0aCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHR5cGVvZiBjdHJsID09PSAnZnVuY3Rpb24nID8gY3RybChpdGVtLCBwYXRoKSA6IGN0cmw7XG59XG5cbmV4cG9ydCB7IHZpc2l0IH07XG4iLCJleHBvcnQgeyBjcmVhdGVTY2FsYXJUb2tlbiwgcmVzb2x2ZUFzU2NhbGFyLCBzZXRTY2FsYXJWYWx1ZSB9IGZyb20gJy4vY3N0LXNjYWxhci5qcyc7XG5leHBvcnQgeyBzdHJpbmdpZnkgfSBmcm9tICcuL2NzdC1zdHJpbmdpZnkuanMnO1xuZXhwb3J0IHsgdmlzaXQgfSBmcm9tICcuL2NzdC12aXNpdC5qcyc7XG5cbi8qKiBUaGUgYnl0ZSBvcmRlciBtYXJrICovXG5jb25zdCBCT00gPSAnXFx1e0ZFRkZ9Jztcbi8qKiBTdGFydCBvZiBkb2MtbW9kZSAqL1xuY29uc3QgRE9DVU1FTlQgPSAnXFx4MDInOyAvLyBDMDogU3RhcnQgb2YgVGV4dFxuLyoqIFVuZXhwZWN0ZWQgZW5kIG9mIGZsb3ctbW9kZSAqL1xuY29uc3QgRkxPV19FTkQgPSAnXFx4MTgnOyAvLyBDMDogQ2FuY2VsXG4vKiogTmV4dCB0b2tlbiBpcyBhIHNjYWxhciB2YWx1ZSAqL1xuY29uc3QgU0NBTEFSID0gJ1xceDFmJzsgLy8gQzA6IFVuaXQgU2VwYXJhdG9yXG4vKiogQHJldHVybnMgYHRydWVgIGlmIGB0b2tlbmAgaXMgYSBmbG93IG9yIGJsb2NrIGNvbGxlY3Rpb24gKi9cbmNvbnN0IGlzQ29sbGVjdGlvbiA9ICh0b2tlbikgPT4gISF0b2tlbiAmJiAnaXRlbXMnIGluIHRva2VuO1xuLyoqIEByZXR1cm5zIGB0cnVlYCBpZiBgdG9rZW5gIGlzIGEgZmxvdyBvciBibG9jayBzY2FsYXI7IG5vdCBhbiBhbGlhcyAqL1xuY29uc3QgaXNTY2FsYXIgPSAodG9rZW4pID0+ICEhdG9rZW4gJiZcbiAgICAodG9rZW4udHlwZSA9PT0gJ3NjYWxhcicgfHxcbiAgICAgICAgdG9rZW4udHlwZSA9PT0gJ3NpbmdsZS1xdW90ZWQtc2NhbGFyJyB8fFxuICAgICAgICB0b2tlbi50eXBlID09PSAnZG91YmxlLXF1b3RlZC1zY2FsYXInIHx8XG4gICAgICAgIHRva2VuLnR5cGUgPT09ICdibG9jay1zY2FsYXInKTtcbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4vKiogR2V0IGEgcHJpbnRhYmxlIHJlcHJlc2VudGF0aW9uIG9mIGEgbGV4ZXIgdG9rZW4gKi9cbmZ1bmN0aW9uIHByZXR0eVRva2VuKHRva2VuKSB7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgICBjYXNlIEJPTTpcbiAgICAgICAgICAgIHJldHVybiAnPEJPTT4nO1xuICAgICAgICBjYXNlIERPQ1VNRU5UOlxuICAgICAgICAgICAgcmV0dXJuICc8RE9DPic7XG4gICAgICAgIGNhc2UgRkxPV19FTkQ6XG4gICAgICAgICAgICByZXR1cm4gJzxGTE9XX0VORD4nO1xuICAgICAgICBjYXNlIFNDQUxBUjpcbiAgICAgICAgICAgIHJldHVybiAnPFNDQUxBUj4nO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRva2VuKTtcbiAgICB9XG59XG4vKiogSWRlbnRpZnkgdGhlIHR5cGUgb2YgYSBsZXhlciB0b2tlbi4gTWF5IHJldHVybiBgbnVsbGAgZm9yIHVua25vd24gdG9rZW5zLiAqL1xuZnVuY3Rpb24gdG9rZW5UeXBlKHNvdXJjZSkge1xuICAgIHN3aXRjaCAoc291cmNlKSB7XG4gICAgICAgIGNhc2UgQk9NOlxuICAgICAgICAgICAgcmV0dXJuICdieXRlLW9yZGVyLW1hcmsnO1xuICAgICAgICBjYXNlIERPQ1VNRU5UOlxuICAgICAgICAgICAgcmV0dXJuICdkb2MtbW9kZSc7XG4gICAgICAgIGNhc2UgRkxPV19FTkQ6XG4gICAgICAgICAgICByZXR1cm4gJ2Zsb3ctZXJyb3ItZW5kJztcbiAgICAgICAgY2FzZSBTQ0FMQVI6XG4gICAgICAgICAgICByZXR1cm4gJ3NjYWxhcic7XG4gICAgICAgIGNhc2UgJy0tLSc6XG4gICAgICAgICAgICByZXR1cm4gJ2RvYy1zdGFydCc7XG4gICAgICAgIGNhc2UgJy4uLic6XG4gICAgICAgICAgICByZXR1cm4gJ2RvYy1lbmQnO1xuICAgICAgICBjYXNlICcnOlxuICAgICAgICBjYXNlICdcXG4nOlxuICAgICAgICBjYXNlICdcXHJcXG4nOlxuICAgICAgICAgICAgcmV0dXJuICduZXdsaW5lJztcbiAgICAgICAgY2FzZSAnLSc6XG4gICAgICAgICAgICByZXR1cm4gJ3NlcS1pdGVtLWluZCc7XG4gICAgICAgIGNhc2UgJz8nOlxuICAgICAgICAgICAgcmV0dXJuICdleHBsaWNpdC1rZXktaW5kJztcbiAgICAgICAgY2FzZSAnOic6XG4gICAgICAgICAgICByZXR1cm4gJ21hcC12YWx1ZS1pbmQnO1xuICAgICAgICBjYXNlICd7JzpcbiAgICAgICAgICAgIHJldHVybiAnZmxvdy1tYXAtc3RhcnQnO1xuICAgICAgICBjYXNlICd9JzpcbiAgICAgICAgICAgIHJldHVybiAnZmxvdy1tYXAtZW5kJztcbiAgICAgICAgY2FzZSAnWyc6XG4gICAgICAgICAgICByZXR1cm4gJ2Zsb3ctc2VxLXN0YXJ0JztcbiAgICAgICAgY2FzZSAnXSc6XG4gICAgICAgICAgICByZXR1cm4gJ2Zsb3ctc2VxLWVuZCc7XG4gICAgICAgIGNhc2UgJywnOlxuICAgICAgICAgICAgcmV0dXJuICdjb21tYSc7XG4gICAgfVxuICAgIHN3aXRjaCAoc291cmNlWzBdKSB7XG4gICAgICAgIGNhc2UgJyAnOlxuICAgICAgICBjYXNlICdcXHQnOlxuICAgICAgICAgICAgcmV0dXJuICdzcGFjZSc7XG4gICAgICAgIGNhc2UgJyMnOlxuICAgICAgICAgICAgcmV0dXJuICdjb21tZW50JztcbiAgICAgICAgY2FzZSAnJSc6XG4gICAgICAgICAgICByZXR1cm4gJ2RpcmVjdGl2ZS1saW5lJztcbiAgICAgICAgY2FzZSAnKic6XG4gICAgICAgICAgICByZXR1cm4gJ2FsaWFzJztcbiAgICAgICAgY2FzZSAnJic6XG4gICAgICAgICAgICByZXR1cm4gJ2FuY2hvcic7XG4gICAgICAgIGNhc2UgJyEnOlxuICAgICAgICAgICAgcmV0dXJuICd0YWcnO1xuICAgICAgICBjYXNlIFwiJ1wiOlxuICAgICAgICAgICAgcmV0dXJuICdzaW5nbGUtcXVvdGVkLXNjYWxhcic7XG4gICAgICAgIGNhc2UgJ1wiJzpcbiAgICAgICAgICAgIHJldHVybiAnZG91YmxlLXF1b3RlZC1zY2FsYXInO1xuICAgICAgICBjYXNlICd8JzpcbiAgICAgICAgY2FzZSAnPic6XG4gICAgICAgICAgICByZXR1cm4gJ2Jsb2NrLXNjYWxhci1oZWFkZXInO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IHsgQk9NLCBET0NVTUVOVCwgRkxPV19FTkQsIFNDQUxBUiwgaXNDb2xsZWN0aW9uLCBpc1NjYWxhciwgcHJldHR5VG9rZW4sIHRva2VuVHlwZSB9O1xuIiwiaW1wb3J0IHsgQk9NLCBET0NVTUVOVCwgRkxPV19FTkQsIFNDQUxBUiB9IGZyb20gJy4vY3N0LmpzJztcblxuLypcblNUQVJUIC0+IHN0cmVhbVxuXG5zdHJlYW1cbiAgZGlyZWN0aXZlIC0+IGxpbmUtZW5kIC0+IHN0cmVhbVxuICBpbmRlbnQgKyBsaW5lLWVuZCAtPiBzdHJlYW1cbiAgW2Vsc2VdIC0+IGxpbmUtc3RhcnRcblxubGluZS1lbmRcbiAgY29tbWVudCAtPiBsaW5lLWVuZFxuICBuZXdsaW5lIC0+IC5cbiAgaW5wdXQtZW5kIC0+IEVORFxuXG5saW5lLXN0YXJ0XG4gIGRvYy1zdGFydCAtPiBkb2NcbiAgZG9jLWVuZCAtPiBzdHJlYW1cbiAgW2Vsc2VdIC0+IGluZGVudCAtPiBibG9jay1zdGFydFxuXG5ibG9jay1zdGFydFxuICBzZXEtaXRlbS1zdGFydCAtPiBibG9jay1zdGFydFxuICBleHBsaWNpdC1rZXktc3RhcnQgLT4gYmxvY2stc3RhcnRcbiAgbWFwLXZhbHVlLXN0YXJ0IC0+IGJsb2NrLXN0YXJ0XG4gIFtlbHNlXSAtPiBkb2NcblxuZG9jXG4gIGxpbmUtZW5kIC0+IGxpbmUtc3RhcnRcbiAgc3BhY2VzIC0+IGRvY1xuICBhbmNob3IgLT4gZG9jXG4gIHRhZyAtPiBkb2NcbiAgZmxvdy1zdGFydCAtPiBmbG93IC0+IGRvY1xuICBmbG93LWVuZCAtPiBlcnJvciAtPiBkb2NcbiAgc2VxLWl0ZW0tc3RhcnQgLT4gZXJyb3IgLT4gZG9jXG4gIGV4cGxpY2l0LWtleS1zdGFydCAtPiBlcnJvciAtPiBkb2NcbiAgbWFwLXZhbHVlLXN0YXJ0IC0+IGRvY1xuICBhbGlhcyAtPiBkb2NcbiAgcXVvdGUtc3RhcnQgLT4gcXVvdGVkLXNjYWxhciAtPiBkb2NcbiAgYmxvY2stc2NhbGFyLWhlYWRlciAtPiBsaW5lLWVuZCAtPiBibG9jay1zY2FsYXIobWluKSAtPiBsaW5lLXN0YXJ0XG4gIFtlbHNlXSAtPiBwbGFpbi1zY2FsYXIoZmFsc2UsIG1pbikgLT4gZG9jXG5cbmZsb3dcbiAgbGluZS1lbmQgLT4gZmxvd1xuICBzcGFjZXMgLT4gZmxvd1xuICBhbmNob3IgLT4gZmxvd1xuICB0YWcgLT4gZmxvd1xuICBmbG93LXN0YXJ0IC0+IGZsb3cgLT4gZmxvd1xuICBmbG93LWVuZCAtPiAuXG4gIHNlcS1pdGVtLXN0YXJ0IC0+IGVycm9yIC0+IGZsb3dcbiAgZXhwbGljaXQta2V5LXN0YXJ0IC0+IGZsb3dcbiAgbWFwLXZhbHVlLXN0YXJ0IC0+IGZsb3dcbiAgYWxpYXMgLT4gZmxvd1xuICBxdW90ZS1zdGFydCAtPiBxdW90ZWQtc2NhbGFyIC0+IGZsb3dcbiAgY29tbWEgLT4gZmxvd1xuICBbZWxzZV0gLT4gcGxhaW4tc2NhbGFyKHRydWUsIDApIC0+IGZsb3dcblxucXVvdGVkLXNjYWxhclxuICBxdW90ZS1lbmQgLT4gLlxuICBbZWxzZV0gLT4gcXVvdGVkLXNjYWxhclxuXG5ibG9jay1zY2FsYXIobWluKVxuICBuZXdsaW5lICsgcGVlayhpbmRlbnQgPCBtaW4pIC0+IC5cbiAgW2Vsc2VdIC0+IGJsb2NrLXNjYWxhcihtaW4pXG5cbnBsYWluLXNjYWxhcihpcy1mbG93LCBtaW4pXG4gIHNjYWxhci1lbmQoaXMtZmxvdykgLT4gLlxuICBwZWVrKG5ld2xpbmUgKyAoaW5kZW50IDwgbWluKSkgLT4gLlxuICBbZWxzZV0gLT4gcGxhaW4tc2NhbGFyKG1pbilcbiovXG5mdW5jdGlvbiBpc0VtcHR5KGNoKSB7XG4gICAgc3dpdGNoIChjaCkge1xuICAgICAgICBjYXNlIHVuZGVmaW5lZDpcbiAgICAgICAgY2FzZSAnICc6XG4gICAgICAgIGNhc2UgJ1xcbic6XG4gICAgICAgIGNhc2UgJ1xccic6XG4gICAgICAgIGNhc2UgJ1xcdCc6XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5jb25zdCBoZXhEaWdpdHMgPSBuZXcgU2V0KCcwMTIzNDU2Nzg5QUJDREVGYWJjZGVmJyk7XG5jb25zdCB0YWdDaGFycyA9IG5ldyBTZXQoXCIwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei0jOy8/OkAmPSskXy4hfionKClcIik7XG5jb25zdCBmbG93SW5kaWNhdG9yQ2hhcnMgPSBuZXcgU2V0KCcsW117fScpO1xuY29uc3QgaW52YWxpZEFuY2hvckNoYXJzID0gbmV3IFNldCgnICxbXXt9XFxuXFxyXFx0Jyk7XG5jb25zdCBpc05vdEFuY2hvckNoYXIgPSAoY2gpID0+ICFjaCB8fCBpbnZhbGlkQW5jaG9yQ2hhcnMuaGFzKGNoKTtcbi8qKlxuICogU3BsaXRzIGFuIGlucHV0IHN0cmluZyBpbnRvIGxleGljYWwgdG9rZW5zLCBpLmUuIHNtYWxsZXIgc3RyaW5ncyB0aGF0IGFyZVxuICogZWFzaWx5IGlkZW50aWZpYWJsZSBieSBgdG9rZW5zLnRva2VuVHlwZSgpYC5cbiAqXG4gKiBMZXhpbmcgc3RhcnRzIGFsd2F5cyBpbiBhIFwic3RyZWFtXCIgY29udGV4dC4gSW5jb21wbGV0ZSBpbnB1dCBtYXkgYmUgYnVmZmVyZWRcbiAqIHVudGlsIGEgY29tcGxldGUgdG9rZW4gY2FuIGJlIGVtaXR0ZWQuXG4gKlxuICogSW4gYWRkaXRpb24gdG8gc2xpY2VzIG9mIHRoZSBvcmlnaW5hbCBpbnB1dCwgdGhlIGZvbGxvd2luZyBjb250cm9sIGNoYXJhY3RlcnNcbiAqIG1heSBhbHNvIGJlIGVtaXR0ZWQ6XG4gKlxuICogLSBgXFx4MDJgIChTdGFydCBvZiBUZXh0KTogQSBkb2N1bWVudCBzdGFydHMgd2l0aCB0aGUgbmV4dCB0b2tlblxuICogLSBgXFx4MThgIChDYW5jZWwpOiBVbmV4cGVjdGVkIGVuZCBvZiBmbG93LW1vZGUgKGluZGljYXRlcyBhbiBlcnJvcilcbiAqIC0gYFxceDFmYCAoVW5pdCBTZXBhcmF0b3IpOiBOZXh0IHRva2VuIGlzIGEgc2NhbGFyIHZhbHVlXG4gKiAtIGBcXHV7RkVGRn1gIChCeXRlIG9yZGVyIG1hcmspOiBFbWl0dGVkIHNlcGFyYXRlbHkgb3V0c2lkZSBkb2N1bWVudHNcbiAqL1xuY2xhc3MgTGV4ZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBidWZmZXIgbWFya3MgdGhlIGVuZCBvZlxuICAgICAgICAgKiBhbGwgaW5wdXRcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYXRFbmQgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEV4cGxpY2l0IGluZGVudCBzZXQgaW4gYmxvY2sgc2NhbGFyIGhlYWRlciwgYXMgYW4gb2Zmc2V0IGZyb20gdGhlIGN1cnJlbnRcbiAgICAgICAgICogbWluaW11bSBpbmRlbnQsIHNvIGUuZy4gc2V0IHRvIDEgZnJvbSBhIGhlYWRlciBgfDIrYC4gU2V0IHRvIC0xIGlmIG5vdFxuICAgICAgICAgKiBleHBsaWNpdGx5IHNldC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYmxvY2tTY2FsYXJJbmRlbnQgPSAtMTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEJsb2NrIHNjYWxhcnMgdGhhdCBpbmNsdWRlIGEgKyAoa2VlcCkgY2hvbXBpbmcgaW5kaWNhdG9yIGluIHRoZWlyIGhlYWRlclxuICAgICAgICAgKiBpbmNsdWRlIHRyYWlsaW5nIGVtcHR5IGxpbmVzLCB3aGljaCBhcmUgb3RoZXJ3aXNlIGV4Y2x1ZGVkIGZyb20gdGhlXG4gICAgICAgICAqIHNjYWxhcidzIGNvbnRlbnRzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5ibG9ja1NjYWxhcktlZXAgPSBmYWxzZTtcbiAgICAgICAgLyoqIEN1cnJlbnQgaW5wdXQgKi9cbiAgICAgICAgdGhpcy5idWZmZXIgPSAnJztcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZsYWcgbm90aW5nIHdoZXRoZXIgdGhlIG1hcCB2YWx1ZSBpbmRpY2F0b3IgOiBjYW4gaW1tZWRpYXRlbHkgZm9sbG93IHRoaXNcbiAgICAgICAgICogbm9kZSB3aXRoaW4gYSBmbG93IGNvbnRleHQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmZsb3dLZXkgPSBmYWxzZTtcbiAgICAgICAgLyoqIENvdW50IG9mIHN1cnJvdW5kaW5nIGZsb3cgY29sbGVjdGlvbiBsZXZlbHMuICovXG4gICAgICAgIHRoaXMuZmxvd0xldmVsID0gMDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIE1pbmltdW0gbGV2ZWwgb2YgaW5kZW50YXRpb24gcmVxdWlyZWQgZm9yIG5leHQgbGluZXMgdG8gYmUgcGFyc2VkIGFzIGFcbiAgICAgICAgICogcGFydCBvZiB0aGUgY3VycmVudCBzY2FsYXIgdmFsdWUuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmluZGVudE5leHQgPSAwO1xuICAgICAgICAvKiogSW5kZW50YXRpb24gbGV2ZWwgb2YgdGhlIGN1cnJlbnQgbGluZS4gKi9cbiAgICAgICAgdGhpcy5pbmRlbnRWYWx1ZSA9IDA7XG4gICAgICAgIC8qKiBQb3NpdGlvbiBvZiB0aGUgbmV4dCBcXG4gY2hhcmFjdGVyLiAqL1xuICAgICAgICB0aGlzLmxpbmVFbmRQb3MgPSBudWxsO1xuICAgICAgICAvKiogU3RvcmVzIHRoZSBzdGF0ZSBvZiB0aGUgbGV4ZXIgaWYgcmVhY2hpbmcgdGhlIGVuZCBvZiBpbmNwb21wbGV0ZSBpbnB1dCAqL1xuICAgICAgICB0aGlzLm5leHQgPSBudWxsO1xuICAgICAgICAvKiogQSBwb2ludGVyIHRvIGBidWZmZXJgOyB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGUgbGV4ZXIuICovXG4gICAgICAgIHRoaXMucG9zID0gMDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2VuZXJhdGUgWUFNTCB0b2tlbnMgZnJvbSB0aGUgYHNvdXJjZWAgc3RyaW5nLiBJZiBgaW5jb21wbGV0ZWAsXG4gICAgICogYSBwYXJ0IG9mIHRoZSBsYXN0IGxpbmUgbWF5IGJlIGxlZnQgYXMgYSBidWZmZXIgZm9yIHRoZSBuZXh0IGNhbGwuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBIGdlbmVyYXRvciBvZiBsZXhpY2FsIHRva2Vuc1xuICAgICAqL1xuICAgICpsZXgoc291cmNlLCBpbmNvbXBsZXRlID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKHNvdXJjZSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBzb3VyY2UgIT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcignc291cmNlIGlzIG5vdCBhIHN0cmluZycpO1xuICAgICAgICAgICAgdGhpcy5idWZmZXIgPSB0aGlzLmJ1ZmZlciA/IHRoaXMuYnVmZmVyICsgc291cmNlIDogc291cmNlO1xuICAgICAgICAgICAgdGhpcy5saW5lRW5kUG9zID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmF0RW5kID0gIWluY29tcGxldGU7XG4gICAgICAgIGxldCBuZXh0ID0gdGhpcy5uZXh0ID8/ICdzdHJlYW0nO1xuICAgICAgICB3aGlsZSAobmV4dCAmJiAoaW5jb21wbGV0ZSB8fCB0aGlzLmhhc0NoYXJzKDEpKSlcbiAgICAgICAgICAgIG5leHQgPSB5aWVsZCogdGhpcy5wYXJzZU5leHQobmV4dCk7XG4gICAgfVxuICAgIGF0TGluZUVuZCgpIHtcbiAgICAgICAgbGV0IGkgPSB0aGlzLnBvcztcbiAgICAgICAgbGV0IGNoID0gdGhpcy5idWZmZXJbaV07XG4gICAgICAgIHdoaWxlIChjaCA9PT0gJyAnIHx8IGNoID09PSAnXFx0JylcbiAgICAgICAgICAgIGNoID0gdGhpcy5idWZmZXJbKytpXTtcbiAgICAgICAgaWYgKCFjaCB8fCBjaCA9PT0gJyMnIHx8IGNoID09PSAnXFxuJylcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAoY2ggPT09ICdcXHInKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyW2kgKyAxXSA9PT0gJ1xcbic7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY2hhckF0KG4pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyW3RoaXMucG9zICsgbl07XG4gICAgfVxuICAgIGNvbnRpbnVlU2NhbGFyKG9mZnNldCkge1xuICAgICAgICBsZXQgY2ggPSB0aGlzLmJ1ZmZlcltvZmZzZXRdO1xuICAgICAgICBpZiAodGhpcy5pbmRlbnROZXh0ID4gMCkge1xuICAgICAgICAgICAgbGV0IGluZGVudCA9IDA7XG4gICAgICAgICAgICB3aGlsZSAoY2ggPT09ICcgJylcbiAgICAgICAgICAgICAgICBjaCA9IHRoaXMuYnVmZmVyWysraW5kZW50ICsgb2Zmc2V0XTtcbiAgICAgICAgICAgIGlmIChjaCA9PT0gJ1xccicpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXh0ID0gdGhpcy5idWZmZXJbaW5kZW50ICsgb2Zmc2V0ICsgMV07XG4gICAgICAgICAgICAgICAgaWYgKG5leHQgPT09ICdcXG4nIHx8ICghbmV4dCAmJiAhdGhpcy5hdEVuZCkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvZmZzZXQgKyBpbmRlbnQgKyAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNoID09PSAnXFxuJyB8fCBpbmRlbnQgPj0gdGhpcy5pbmRlbnROZXh0IHx8ICghY2ggJiYgIXRoaXMuYXRFbmQpXG4gICAgICAgICAgICAgICAgPyBvZmZzZXQgKyBpbmRlbnRcbiAgICAgICAgICAgICAgICA6IC0xO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaCA9PT0gJy0nIHx8IGNoID09PSAnLicpIHtcbiAgICAgICAgICAgIGNvbnN0IGR0ID0gdGhpcy5idWZmZXIuc3Vic3RyKG9mZnNldCwgMyk7XG4gICAgICAgICAgICBpZiAoKGR0ID09PSAnLS0tJyB8fCBkdCA9PT0gJy4uLicpICYmIGlzRW1wdHkodGhpcy5idWZmZXJbb2Zmc2V0ICsgM10pKVxuICAgICAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2Zmc2V0O1xuICAgIH1cbiAgICBnZXRMaW5lKCkge1xuICAgICAgICBsZXQgZW5kID0gdGhpcy5saW5lRW5kUG9zO1xuICAgICAgICBpZiAodHlwZW9mIGVuZCAhPT0gJ251bWJlcicgfHwgKGVuZCAhPT0gLTEgJiYgZW5kIDwgdGhpcy5wb3MpKSB7XG4gICAgICAgICAgICBlbmQgPSB0aGlzLmJ1ZmZlci5pbmRleE9mKCdcXG4nLCB0aGlzLnBvcyk7XG4gICAgICAgICAgICB0aGlzLmxpbmVFbmRQb3MgPSBlbmQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVuZCA9PT0gLTEpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hdEVuZCA/IHRoaXMuYnVmZmVyLnN1YnN0cmluZyh0aGlzLnBvcykgOiBudWxsO1xuICAgICAgICBpZiAodGhpcy5idWZmZXJbZW5kIC0gMV0gPT09ICdcXHInKVxuICAgICAgICAgICAgZW5kIC09IDE7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1ZmZlci5zdWJzdHJpbmcodGhpcy5wb3MsIGVuZCk7XG4gICAgfVxuICAgIGhhc0NoYXJzKG4pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zICsgbiA8PSB0aGlzLmJ1ZmZlci5sZW5ndGg7XG4gICAgfVxuICAgIHNldE5leHQoc3RhdGUpIHtcbiAgICAgICAgdGhpcy5idWZmZXIgPSB0aGlzLmJ1ZmZlci5zdWJzdHJpbmcodGhpcy5wb3MpO1xuICAgICAgICB0aGlzLnBvcyA9IDA7XG4gICAgICAgIHRoaXMubGluZUVuZFBvcyA9IG51bGw7XG4gICAgICAgIHRoaXMubmV4dCA9IHN0YXRlO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcGVlayhuKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1ZmZlci5zdWJzdHIodGhpcy5wb3MsIG4pO1xuICAgIH1cbiAgICAqcGFyc2VOZXh0KG5leHQpIHtcbiAgICAgICAgc3dpdGNoIChuZXh0KSB7XG4gICAgICAgICAgICBjYXNlICdzdHJlYW0nOlxuICAgICAgICAgICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5wYXJzZVN0cmVhbSgpO1xuICAgICAgICAgICAgY2FzZSAnbGluZS1zdGFydCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiB0aGlzLnBhcnNlTGluZVN0YXJ0KCk7XG4gICAgICAgICAgICBjYXNlICdibG9jay1zdGFydCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiB0aGlzLnBhcnNlQmxvY2tTdGFydCgpO1xuICAgICAgICAgICAgY2FzZSAnZG9jJzpcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucGFyc2VEb2N1bWVudCgpO1xuICAgICAgICAgICAgY2FzZSAnZmxvdyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiB0aGlzLnBhcnNlRmxvd0NvbGxlY3Rpb24oKTtcbiAgICAgICAgICAgIGNhc2UgJ3F1b3RlZC1zY2FsYXInOlxuICAgICAgICAgICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5wYXJzZVF1b3RlZFNjYWxhcigpO1xuICAgICAgICAgICAgY2FzZSAnYmxvY2stc2NhbGFyJzpcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucGFyc2VCbG9ja1NjYWxhcigpO1xuICAgICAgICAgICAgY2FzZSAncGxhaW4tc2NhbGFyJzpcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucGFyc2VQbGFpblNjYWxhcigpO1xuICAgICAgICB9XG4gICAgfVxuICAgICpwYXJzZVN0cmVhbSgpIHtcbiAgICAgICAgbGV0IGxpbmUgPSB0aGlzLmdldExpbmUoKTtcbiAgICAgICAgaWYgKGxpbmUgPT09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZXROZXh0KCdzdHJlYW0nKTtcbiAgICAgICAgaWYgKGxpbmVbMF0gPT09IEJPTSkge1xuICAgICAgICAgICAgeWllbGQqIHRoaXMucHVzaENvdW50KDEpO1xuICAgICAgICAgICAgbGluZSA9IGxpbmUuc3Vic3RyaW5nKDEpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsaW5lWzBdID09PSAnJScpIHtcbiAgICAgICAgICAgIGxldCBkaXJFbmQgPSBsaW5lLmxlbmd0aDtcbiAgICAgICAgICAgIGxldCBjcyA9IGxpbmUuaW5kZXhPZignIycpO1xuICAgICAgICAgICAgd2hpbGUgKGNzICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoID0gbGluZVtjcyAtIDFdO1xuICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJyAnIHx8IGNoID09PSAnXFx0Jykge1xuICAgICAgICAgICAgICAgICAgICBkaXJFbmQgPSBjcyAtIDE7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY3MgPSBsaW5lLmluZGV4T2YoJyMnLCBjcyArIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2ggPSBsaW5lW2RpckVuZCAtIDFdO1xuICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJyAnIHx8IGNoID09PSAnXFx0JylcbiAgICAgICAgICAgICAgICAgICAgZGlyRW5kIC09IDE7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG4gPSAoeWllbGQqIHRoaXMucHVzaENvdW50KGRpckVuZCkpICsgKHlpZWxkKiB0aGlzLnB1c2hTcGFjZXModHJ1ZSkpO1xuICAgICAgICAgICAgeWllbGQqIHRoaXMucHVzaENvdW50KGxpbmUubGVuZ3RoIC0gbik7IC8vIHBvc3NpYmxlIGNvbW1lbnRcbiAgICAgICAgICAgIHRoaXMucHVzaE5ld2xpbmUoKTtcbiAgICAgICAgICAgIHJldHVybiAnc3RyZWFtJztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5hdExpbmVFbmQoKSkge1xuICAgICAgICAgICAgY29uc3Qgc3AgPSB5aWVsZCogdGhpcy5wdXNoU3BhY2VzKHRydWUpO1xuICAgICAgICAgICAgeWllbGQqIHRoaXMucHVzaENvdW50KGxpbmUubGVuZ3RoIC0gc3ApO1xuICAgICAgICAgICAgeWllbGQqIHRoaXMucHVzaE5ld2xpbmUoKTtcbiAgICAgICAgICAgIHJldHVybiAnc3RyZWFtJztcbiAgICAgICAgfVxuICAgICAgICB5aWVsZCBET0NVTUVOVDtcbiAgICAgICAgcmV0dXJuIHlpZWxkKiB0aGlzLnBhcnNlTGluZVN0YXJ0KCk7XG4gICAgfVxuICAgICpwYXJzZUxpbmVTdGFydCgpIHtcbiAgICAgICAgY29uc3QgY2ggPSB0aGlzLmNoYXJBdCgwKTtcbiAgICAgICAgaWYgKCFjaCAmJiAhdGhpcy5hdEVuZClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNldE5leHQoJ2xpbmUtc3RhcnQnKTtcbiAgICAgICAgaWYgKGNoID09PSAnLScgfHwgY2ggPT09ICcuJykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmF0RW5kICYmICF0aGlzLmhhc0NoYXJzKDQpKVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNldE5leHQoJ2xpbmUtc3RhcnQnKTtcbiAgICAgICAgICAgIGNvbnN0IHMgPSB0aGlzLnBlZWsoMyk7XG4gICAgICAgICAgICBpZiAoKHMgPT09ICctLS0nIHx8IHMgPT09ICcuLi4nKSAmJiBpc0VtcHR5KHRoaXMuY2hhckF0KDMpKSkge1xuICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnB1c2hDb3VudCgzKTtcbiAgICAgICAgICAgICAgICB0aGlzLmluZGVudFZhbHVlID0gMDtcbiAgICAgICAgICAgICAgICB0aGlzLmluZGVudE5leHQgPSAwO1xuICAgICAgICAgICAgICAgIHJldHVybiBzID09PSAnLS0tJyA/ICdkb2MnIDogJ3N0cmVhbSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbmRlbnRWYWx1ZSA9IHlpZWxkKiB0aGlzLnB1c2hTcGFjZXMoZmFsc2UpO1xuICAgICAgICBpZiAodGhpcy5pbmRlbnROZXh0ID4gdGhpcy5pbmRlbnRWYWx1ZSAmJiAhaXNFbXB0eSh0aGlzLmNoYXJBdCgxKSkpXG4gICAgICAgICAgICB0aGlzLmluZGVudE5leHQgPSB0aGlzLmluZGVudFZhbHVlO1xuICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucGFyc2VCbG9ja1N0YXJ0KCk7XG4gICAgfVxuICAgICpwYXJzZUJsb2NrU3RhcnQoKSB7XG4gICAgICAgIGNvbnN0IFtjaDAsIGNoMV0gPSB0aGlzLnBlZWsoMik7XG4gICAgICAgIGlmICghY2gxICYmICF0aGlzLmF0RW5kKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0TmV4dCgnYmxvY2stc3RhcnQnKTtcbiAgICAgICAgaWYgKChjaDAgPT09ICctJyB8fCBjaDAgPT09ICc/JyB8fCBjaDAgPT09ICc6JykgJiYgaXNFbXB0eShjaDEpKSB7XG4gICAgICAgICAgICBjb25zdCBuID0gKHlpZWxkKiB0aGlzLnB1c2hDb3VudCgxKSkgKyAoeWllbGQqIHRoaXMucHVzaFNwYWNlcyh0cnVlKSk7XG4gICAgICAgICAgICB0aGlzLmluZGVudE5leHQgPSB0aGlzLmluZGVudFZhbHVlICsgMTtcbiAgICAgICAgICAgIHRoaXMuaW5kZW50VmFsdWUgKz0gbjtcbiAgICAgICAgICAgIHJldHVybiAnYmxvY2stc3RhcnQnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnZG9jJztcbiAgICB9XG4gICAgKnBhcnNlRG9jdW1lbnQoKSB7XG4gICAgICAgIHlpZWxkKiB0aGlzLnB1c2hTcGFjZXModHJ1ZSk7XG4gICAgICAgIGNvbnN0IGxpbmUgPSB0aGlzLmdldExpbmUoKTtcbiAgICAgICAgaWYgKGxpbmUgPT09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZXROZXh0KCdkb2MnKTtcbiAgICAgICAgbGV0IG4gPSB5aWVsZCogdGhpcy5wdXNoSW5kaWNhdG9ycygpO1xuICAgICAgICBzd2l0Y2ggKGxpbmVbbl0pIHtcbiAgICAgICAgICAgIGNhc2UgJyMnOlxuICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnB1c2hDb3VudChsaW5lLmxlbmd0aCAtIG4pO1xuICAgICAgICAgICAgLy8gZmFsbHRocm91Z2hcbiAgICAgICAgICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnB1c2hOZXdsaW5lKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiB0aGlzLnBhcnNlTGluZVN0YXJ0KCk7XG4gICAgICAgICAgICBjYXNlICd7JzpcbiAgICAgICAgICAgIGNhc2UgJ1snOlxuICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnB1c2hDb3VudCgxKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZsb3dLZXkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmZsb3dMZXZlbCA9IDE7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdmbG93JztcbiAgICAgICAgICAgIGNhc2UgJ30nOlxuICAgICAgICAgICAgY2FzZSAnXSc6XG4gICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhbiBlcnJvclxuICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnB1c2hDb3VudCgxKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2RvYyc7XG4gICAgICAgICAgICBjYXNlICcqJzpcbiAgICAgICAgICAgICAgICB5aWVsZCogdGhpcy5wdXNoVW50aWwoaXNOb3RBbmNob3JDaGFyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2RvYyc7XG4gICAgICAgICAgICBjYXNlICdcIic6XG4gICAgICAgICAgICBjYXNlIFwiJ1wiOlxuICAgICAgICAgICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5wYXJzZVF1b3RlZFNjYWxhcigpO1xuICAgICAgICAgICAgY2FzZSAnfCc6XG4gICAgICAgICAgICBjYXNlICc+JzpcbiAgICAgICAgICAgICAgICBuICs9IHlpZWxkKiB0aGlzLnBhcnNlQmxvY2tTY2FsYXJIZWFkZXIoKTtcbiAgICAgICAgICAgICAgICBuICs9IHlpZWxkKiB0aGlzLnB1c2hTcGFjZXModHJ1ZSk7XG4gICAgICAgICAgICAgICAgeWllbGQqIHRoaXMucHVzaENvdW50KGxpbmUubGVuZ3RoIC0gbik7XG4gICAgICAgICAgICAgICAgeWllbGQqIHRoaXMucHVzaE5ld2xpbmUoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucGFyc2VCbG9ja1NjYWxhcigpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucGFyc2VQbGFpblNjYWxhcigpO1xuICAgICAgICB9XG4gICAgfVxuICAgICpwYXJzZUZsb3dDb2xsZWN0aW9uKCkge1xuICAgICAgICBsZXQgbmwsIHNwO1xuICAgICAgICBsZXQgaW5kZW50ID0gLTE7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIG5sID0geWllbGQqIHRoaXMucHVzaE5ld2xpbmUoKTtcbiAgICAgICAgICAgIGlmIChubCA+IDApIHtcbiAgICAgICAgICAgICAgICBzcCA9IHlpZWxkKiB0aGlzLnB1c2hTcGFjZXMoZmFsc2UpO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5kZW50VmFsdWUgPSBpbmRlbnQgPSBzcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHNwID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNwICs9IHlpZWxkKiB0aGlzLnB1c2hTcGFjZXModHJ1ZSk7XG4gICAgICAgIH0gd2hpbGUgKG5sICsgc3AgPiAwKTtcbiAgICAgICAgY29uc3QgbGluZSA9IHRoaXMuZ2V0TGluZSgpO1xuICAgICAgICBpZiAobGluZSA9PT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNldE5leHQoJ2Zsb3cnKTtcbiAgICAgICAgaWYgKChpbmRlbnQgIT09IC0xICYmIGluZGVudCA8IHRoaXMuaW5kZW50TmV4dCAmJiBsaW5lWzBdICE9PSAnIycpIHx8XG4gICAgICAgICAgICAoaW5kZW50ID09PSAwICYmXG4gICAgICAgICAgICAgICAgKGxpbmUuc3RhcnRzV2l0aCgnLS0tJykgfHwgbGluZS5zdGFydHNXaXRoKCcuLi4nKSkgJiZcbiAgICAgICAgICAgICAgICBpc0VtcHR5KGxpbmVbM10pKSkge1xuICAgICAgICAgICAgLy8gQWxsb3dpbmcgZm9yIHRoZSB0ZXJtaW5hbCBdIG9yIH0gYXQgdGhlIHNhbWUgKHJhdGhlciB0aGFuIGdyZWF0ZXIpXG4gICAgICAgICAgICAvLyBpbmRlbnQgbGV2ZWwgYXMgdGhlIGluaXRpYWwgWyBvciB7IGlzIHRlY2huaWNhbGx5IGludmFsaWQsIGJ1dFxuICAgICAgICAgICAgLy8gZmFpbGluZyBoZXJlIHdvdWxkIGJlIHN1cnByaXNpbmcgdG8gdXNlcnMuXG4gICAgICAgICAgICBjb25zdCBhdEZsb3dFbmRNYXJrZXIgPSBpbmRlbnQgPT09IHRoaXMuaW5kZW50TmV4dCAtIDEgJiZcbiAgICAgICAgICAgICAgICB0aGlzLmZsb3dMZXZlbCA9PT0gMSAmJlxuICAgICAgICAgICAgICAgIChsaW5lWzBdID09PSAnXScgfHwgbGluZVswXSA9PT0gJ30nKTtcbiAgICAgICAgICAgIGlmICghYXRGbG93RW5kTWFya2VyKSB7XG4gICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhbiBlcnJvclxuICAgICAgICAgICAgICAgIHRoaXMuZmxvd0xldmVsID0gMDtcbiAgICAgICAgICAgICAgICB5aWVsZCBGTE9XX0VORDtcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucGFyc2VMaW5lU3RhcnQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgbiA9IDA7XG4gICAgICAgIHdoaWxlIChsaW5lW25dID09PSAnLCcpIHtcbiAgICAgICAgICAgIG4gKz0geWllbGQqIHRoaXMucHVzaENvdW50KDEpO1xuICAgICAgICAgICAgbiArPSB5aWVsZCogdGhpcy5wdXNoU3BhY2VzKHRydWUpO1xuICAgICAgICAgICAgdGhpcy5mbG93S2V5ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgbiArPSB5aWVsZCogdGhpcy5wdXNoSW5kaWNhdG9ycygpO1xuICAgICAgICBzd2l0Y2ggKGxpbmVbbl0pIHtcbiAgICAgICAgICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgICAgICAgICAgIHJldHVybiAnZmxvdyc7XG4gICAgICAgICAgICBjYXNlICcjJzpcbiAgICAgICAgICAgICAgICB5aWVsZCogdGhpcy5wdXNoQ291bnQobGluZS5sZW5ndGggLSBuKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2Zsb3cnO1xuICAgICAgICAgICAgY2FzZSAneyc6XG4gICAgICAgICAgICBjYXNlICdbJzpcbiAgICAgICAgICAgICAgICB5aWVsZCogdGhpcy5wdXNoQ291bnQoMSk7XG4gICAgICAgICAgICAgICAgdGhpcy5mbG93S2V5ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5mbG93TGV2ZWwgKz0gMTtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2Zsb3cnO1xuICAgICAgICAgICAgY2FzZSAnfSc6XG4gICAgICAgICAgICBjYXNlICddJzpcbiAgICAgICAgICAgICAgICB5aWVsZCogdGhpcy5wdXNoQ291bnQoMSk7XG4gICAgICAgICAgICAgICAgdGhpcy5mbG93S2V5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmZsb3dMZXZlbCAtPSAxO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZsb3dMZXZlbCA/ICdmbG93JyA6ICdkb2MnO1xuICAgICAgICAgICAgY2FzZSAnKic6XG4gICAgICAgICAgICAgICAgeWllbGQqIHRoaXMucHVzaFVudGlsKGlzTm90QW5jaG9yQ2hhcik7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdmbG93JztcbiAgICAgICAgICAgIGNhc2UgJ1wiJzpcbiAgICAgICAgICAgIGNhc2UgXCInXCI6XG4gICAgICAgICAgICAgICAgdGhpcy5mbG93S2V5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucGFyc2VRdW90ZWRTY2FsYXIoKTtcbiAgICAgICAgICAgIGNhc2UgJzonOiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IHRoaXMuY2hhckF0KDEpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmZsb3dLZXkgfHwgaXNFbXB0eShuZXh0KSB8fCBuZXh0ID09PSAnLCcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mbG93S2V5ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnB1c2hDb3VudCgxKTtcbiAgICAgICAgICAgICAgICAgICAgeWllbGQqIHRoaXMucHVzaFNwYWNlcyh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdmbG93JztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBmYWxsdGhyb3VnaFxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aGlzLmZsb3dLZXkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucGFyc2VQbGFpblNjYWxhcigpO1xuICAgICAgICB9XG4gICAgfVxuICAgICpwYXJzZVF1b3RlZFNjYWxhcigpIHtcbiAgICAgICAgY29uc3QgcXVvdGUgPSB0aGlzLmNoYXJBdCgwKTtcbiAgICAgICAgbGV0IGVuZCA9IHRoaXMuYnVmZmVyLmluZGV4T2YocXVvdGUsIHRoaXMucG9zICsgMSk7XG4gICAgICAgIGlmIChxdW90ZSA9PT0gXCInXCIpIHtcbiAgICAgICAgICAgIHdoaWxlIChlbmQgIT09IC0xICYmIHRoaXMuYnVmZmVyW2VuZCArIDFdID09PSBcIidcIilcbiAgICAgICAgICAgICAgICBlbmQgPSB0aGlzLmJ1ZmZlci5pbmRleE9mKFwiJ1wiLCBlbmQgKyAyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIGRvdWJsZS1xdW90ZVxuICAgICAgICAgICAgd2hpbGUgKGVuZCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBsZXQgbiA9IDA7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHRoaXMuYnVmZmVyW2VuZCAtIDEgLSBuXSA9PT0gJ1xcXFwnKVxuICAgICAgICAgICAgICAgICAgICBuICs9IDE7XG4gICAgICAgICAgICAgICAgaWYgKG4gJSAyID09PSAwKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBlbmQgPSB0aGlzLmJ1ZmZlci5pbmRleE9mKCdcIicsIGVuZCArIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIE9ubHkgbG9va2luZyBmb3IgbmV3bGluZXMgd2l0aGluIHRoZSBxdW90ZXNcbiAgICAgICAgY29uc3QgcWIgPSB0aGlzLmJ1ZmZlci5zdWJzdHJpbmcoMCwgZW5kKTtcbiAgICAgICAgbGV0IG5sID0gcWIuaW5kZXhPZignXFxuJywgdGhpcy5wb3MpO1xuICAgICAgICBpZiAobmwgIT09IC0xKSB7XG4gICAgICAgICAgICB3aGlsZSAobmwgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY3MgPSB0aGlzLmNvbnRpbnVlU2NhbGFyKG5sICsgMSk7XG4gICAgICAgICAgICAgICAgaWYgKGNzID09PSAtMSlcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgbmwgPSBxYi5pbmRleE9mKCdcXG4nLCBjcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobmwgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhbiBlcnJvciBjYXVzZWQgYnkgYW4gdW5leHBlY3RlZCB1bmluZGVudFxuICAgICAgICAgICAgICAgIGVuZCA9IG5sIC0gKHFiW25sIC0gMV0gPT09ICdcXHInID8gMiA6IDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChlbmQgPT09IC0xKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuYXRFbmQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0TmV4dCgncXVvdGVkLXNjYWxhcicpO1xuICAgICAgICAgICAgZW5kID0gdGhpcy5idWZmZXIubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIHlpZWxkKiB0aGlzLnB1c2hUb0luZGV4KGVuZCArIDEsIGZhbHNlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmxvd0xldmVsID8gJ2Zsb3cnIDogJ2RvYyc7XG4gICAgfVxuICAgICpwYXJzZUJsb2NrU2NhbGFySGVhZGVyKCkge1xuICAgICAgICB0aGlzLmJsb2NrU2NhbGFySW5kZW50ID0gLTE7XG4gICAgICAgIHRoaXMuYmxvY2tTY2FsYXJLZWVwID0gZmFsc2U7XG4gICAgICAgIGxldCBpID0gdGhpcy5wb3M7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICBjb25zdCBjaCA9IHRoaXMuYnVmZmVyWysraV07XG4gICAgICAgICAgICBpZiAoY2ggPT09ICcrJylcbiAgICAgICAgICAgICAgICB0aGlzLmJsb2NrU2NhbGFyS2VlcCA9IHRydWU7XG4gICAgICAgICAgICBlbHNlIGlmIChjaCA+ICcwJyAmJiBjaCA8PSAnOScpXG4gICAgICAgICAgICAgICAgdGhpcy5ibG9ja1NjYWxhckluZGVudCA9IE51bWJlcihjaCkgLSAxO1xuICAgICAgICAgICAgZWxzZSBpZiAoY2ggIT09ICctJylcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucHVzaFVudGlsKGNoID0+IGlzRW1wdHkoY2gpIHx8IGNoID09PSAnIycpO1xuICAgIH1cbiAgICAqcGFyc2VCbG9ja1NjYWxhcigpIHtcbiAgICAgICAgbGV0IG5sID0gdGhpcy5wb3MgLSAxOyAvLyBtYXkgYmUgLTEgaWYgdGhpcy5wb3MgPT09IDBcbiAgICAgICAgbGV0IGluZGVudCA9IDA7XG4gICAgICAgIGxldCBjaDtcbiAgICAgICAgbG9vcDogZm9yIChsZXQgaSA9IHRoaXMucG9zOyAoY2ggPSB0aGlzLmJ1ZmZlcltpXSk7ICsraSkge1xuICAgICAgICAgICAgc3dpdGNoIChjaCkge1xuICAgICAgICAgICAgICAgIGNhc2UgJyAnOlxuICAgICAgICAgICAgICAgICAgICBpbmRlbnQgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnXFxuJzpcbiAgICAgICAgICAgICAgICAgICAgbmwgPSBpO1xuICAgICAgICAgICAgICAgICAgICBpbmRlbnQgPSAwO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdcXHInOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHQgPSB0aGlzLmJ1ZmZlcltpICsgMV07XG4gICAgICAgICAgICAgICAgICAgIGlmICghbmV4dCAmJiAhdGhpcy5hdEVuZClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNldE5leHQoJ2Jsb2NrLXNjYWxhcicpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobmV4dCA9PT0gJ1xcbicpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9IC8vIGZhbGx0aHJvdWdoXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgYnJlYWsgbG9vcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNoICYmICF0aGlzLmF0RW5kKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0TmV4dCgnYmxvY2stc2NhbGFyJyk7XG4gICAgICAgIGlmIChpbmRlbnQgPj0gdGhpcy5pbmRlbnROZXh0KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5ibG9ja1NjYWxhckluZGVudCA9PT0gLTEpXG4gICAgICAgICAgICAgICAgdGhpcy5pbmRlbnROZXh0ID0gaW5kZW50O1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbmRlbnROZXh0ID1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ibG9ja1NjYWxhckluZGVudCArICh0aGlzLmluZGVudE5leHQgPT09IDAgPyAxIDogdGhpcy5pbmRlbnROZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjcyA9IHRoaXMuY29udGludWVTY2FsYXIobmwgKyAxKTtcbiAgICAgICAgICAgICAgICBpZiAoY3MgPT09IC0xKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBubCA9IHRoaXMuYnVmZmVyLmluZGV4T2YoJ1xcbicsIGNzKTtcbiAgICAgICAgICAgIH0gd2hpbGUgKG5sICE9PSAtMSk7XG4gICAgICAgICAgICBpZiAobmwgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmF0RW5kKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zZXROZXh0KCdibG9jay1zY2FsYXInKTtcbiAgICAgICAgICAgICAgICBubCA9IHRoaXMuYnVmZmVyLmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBUcmFpbGluZyBpbnN1ZmZpY2llbnRseSBpbmRlbnRlZCB0YWJzIGFyZSBpbnZhbGlkLlxuICAgICAgICAvLyBUbyBjYXRjaCB0aGF0IGR1cmluZyBwYXJzaW5nLCB3ZSBpbmNsdWRlIHRoZW0gaW4gdGhlIGJsb2NrIHNjYWxhciB2YWx1ZS5cbiAgICAgICAgbGV0IGkgPSBubCArIDE7XG4gICAgICAgIGNoID0gdGhpcy5idWZmZXJbaV07XG4gICAgICAgIHdoaWxlIChjaCA9PT0gJyAnKVxuICAgICAgICAgICAgY2ggPSB0aGlzLmJ1ZmZlclsrK2ldO1xuICAgICAgICBpZiAoY2ggPT09ICdcXHQnKSB7XG4gICAgICAgICAgICB3aGlsZSAoY2ggPT09ICdcXHQnIHx8IGNoID09PSAnICcgfHwgY2ggPT09ICdcXHInIHx8IGNoID09PSAnXFxuJylcbiAgICAgICAgICAgICAgICBjaCA9IHRoaXMuYnVmZmVyWysraV07XG4gICAgICAgICAgICBubCA9IGkgLSAxO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCF0aGlzLmJsb2NrU2NhbGFyS2VlcCkge1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgIGxldCBpID0gbmwgLSAxO1xuICAgICAgICAgICAgICAgIGxldCBjaCA9IHRoaXMuYnVmZmVyW2ldO1xuICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJ1xccicpXG4gICAgICAgICAgICAgICAgICAgIGNoID0gdGhpcy5idWZmZXJbLS1pXTtcbiAgICAgICAgICAgICAgICBjb25zdCBsYXN0Q2hhciA9IGk7IC8vIERyb3AgdGhlIGxpbmUgaWYgbGFzdCBjaGFyIG5vdCBtb3JlIGluZGVudGVkXG4gICAgICAgICAgICAgICAgd2hpbGUgKGNoID09PSAnICcpXG4gICAgICAgICAgICAgICAgICAgIGNoID0gdGhpcy5idWZmZXJbLS1pXTtcbiAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICdcXG4nICYmIGkgPj0gdGhpcy5wb3MgJiYgaSArIDEgKyBpbmRlbnQgPiBsYXN0Q2hhcilcbiAgICAgICAgICAgICAgICAgICAgbmwgPSBpO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9IHdoaWxlICh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICB5aWVsZCBTQ0FMQVI7XG4gICAgICAgIHlpZWxkKiB0aGlzLnB1c2hUb0luZGV4KG5sICsgMSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5wYXJzZUxpbmVTdGFydCgpO1xuICAgIH1cbiAgICAqcGFyc2VQbGFpblNjYWxhcigpIHtcbiAgICAgICAgY29uc3QgaW5GbG93ID0gdGhpcy5mbG93TGV2ZWwgPiAwO1xuICAgICAgICBsZXQgZW5kID0gdGhpcy5wb3MgLSAxO1xuICAgICAgICBsZXQgaSA9IHRoaXMucG9zIC0gMTtcbiAgICAgICAgbGV0IGNoO1xuICAgICAgICB3aGlsZSAoKGNoID0gdGhpcy5idWZmZXJbKytpXSkpIHtcbiAgICAgICAgICAgIGlmIChjaCA9PT0gJzonKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IHRoaXMuYnVmZmVyW2kgKyAxXTtcbiAgICAgICAgICAgICAgICBpZiAoaXNFbXB0eShuZXh0KSB8fCAoaW5GbG93ICYmIGZsb3dJbmRpY2F0b3JDaGFycy5oYXMobmV4dCkpKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBlbmQgPSBpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXNFbXB0eShjaCkpIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IHRoaXMuYnVmZmVyW2kgKyAxXTtcbiAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICdcXHInKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0ID09PSAnXFxuJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSAnXFxuJztcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgPSB0aGlzLmJ1ZmZlcltpICsgMV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgZW5kID0gaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG5leHQgPT09ICcjJyB8fCAoaW5GbG93ICYmIGZsb3dJbmRpY2F0b3JDaGFycy5oYXMobmV4dCkpKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICdcXG4nKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNzID0gdGhpcy5jb250aW51ZVNjYWxhcihpICsgMSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjcyA9PT0gLTEpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgaSA9IE1hdGgubWF4KGksIGNzIC0gMik7IC8vIHRvIGFkdmFuY2UsIGJ1dCBzdGlsbCBhY2NvdW50IGZvciAnICMnXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGluRmxvdyAmJiBmbG93SW5kaWNhdG9yQ2hhcnMuaGFzKGNoKSlcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZW5kID0gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNoICYmICF0aGlzLmF0RW5kKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0TmV4dCgncGxhaW4tc2NhbGFyJyk7XG4gICAgICAgIHlpZWxkIFNDQUxBUjtcbiAgICAgICAgeWllbGQqIHRoaXMucHVzaFRvSW5kZXgoZW5kICsgMSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBpbkZsb3cgPyAnZmxvdycgOiAnZG9jJztcbiAgICB9XG4gICAgKnB1c2hDb3VudChuKSB7XG4gICAgICAgIGlmIChuID4gMCkge1xuICAgICAgICAgICAgeWllbGQgdGhpcy5idWZmZXIuc3Vic3RyKHRoaXMucG9zLCBuKTtcbiAgICAgICAgICAgIHRoaXMucG9zICs9IG47XG4gICAgICAgICAgICByZXR1cm4gbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgKnB1c2hUb0luZGV4KGksIGFsbG93RW1wdHkpIHtcbiAgICAgICAgY29uc3QgcyA9IHRoaXMuYnVmZmVyLnNsaWNlKHRoaXMucG9zLCBpKTtcbiAgICAgICAgaWYgKHMpIHtcbiAgICAgICAgICAgIHlpZWxkIHM7XG4gICAgICAgICAgICB0aGlzLnBvcyArPSBzLmxlbmd0aDtcbiAgICAgICAgICAgIHJldHVybiBzLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhbGxvd0VtcHR5KVxuICAgICAgICAgICAgeWllbGQgJyc7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICAqcHVzaEluZGljYXRvcnMoKSB7XG4gICAgICAgIGxldCBuID0gMDtcbiAgICAgICAgbG9vcDogd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgIHN3aXRjaCAodGhpcy5jaGFyQXQoMCkpIHtcbiAgICAgICAgICAgICAgICBjYXNlICchJzpcbiAgICAgICAgICAgICAgICAgICAgbiArPSB5aWVsZCogdGhpcy5wdXNoVGFnKCk7XG4gICAgICAgICAgICAgICAgICAgIG4gKz0geWllbGQqIHRoaXMucHVzaFNwYWNlcyh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWUgbG9vcDtcbiAgICAgICAgICAgICAgICBjYXNlICcmJzpcbiAgICAgICAgICAgICAgICAgICAgbiArPSB5aWVsZCogdGhpcy5wdXNoVW50aWwoaXNOb3RBbmNob3JDaGFyKTtcbiAgICAgICAgICAgICAgICAgICAgbiArPSB5aWVsZCogdGhpcy5wdXNoU3BhY2VzKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBsb29wO1xuICAgICAgICAgICAgICAgIGNhc2UgJy0nOiAvLyB0aGlzIGlzIGFuIGVycm9yXG4gICAgICAgICAgICAgICAgY2FzZSAnPyc6IC8vIHRoaXMgaXMgYW4gZXJyb3Igb3V0c2lkZSBmbG93IGNvbGxlY3Rpb25zXG4gICAgICAgICAgICAgICAgY2FzZSAnOic6IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5GbG93ID0gdGhpcy5mbG93TGV2ZWwgPiAwO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaDEgPSB0aGlzLmNoYXJBdCgxKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzRW1wdHkoY2gxKSB8fCAoaW5GbG93ICYmIGZsb3dJbmRpY2F0b3JDaGFycy5oYXMoY2gxKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaW5GbG93KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5kZW50TmV4dCA9IHRoaXMuaW5kZW50VmFsdWUgKyAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5mbG93S2V5KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmxvd0tleSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgbiArPSB5aWVsZCogdGhpcy5wdXNoQ291bnQoMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBuICs9IHlpZWxkKiB0aGlzLnB1c2hTcGFjZXModHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBsb29wO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWsgbG9vcDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbjtcbiAgICB9XG4gICAgKnB1c2hUYWcoKSB7XG4gICAgICAgIGlmICh0aGlzLmNoYXJBdCgxKSA9PT0gJzwnKSB7XG4gICAgICAgICAgICBsZXQgaSA9IHRoaXMucG9zICsgMjtcbiAgICAgICAgICAgIGxldCBjaCA9IHRoaXMuYnVmZmVyW2ldO1xuICAgICAgICAgICAgd2hpbGUgKCFpc0VtcHR5KGNoKSAmJiBjaCAhPT0gJz4nKVxuICAgICAgICAgICAgICAgIGNoID0gdGhpcy5idWZmZXJbKytpXTtcbiAgICAgICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5wdXNoVG9JbmRleChjaCA9PT0gJz4nID8gaSArIDEgOiBpLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgaSA9IHRoaXMucG9zICsgMTtcbiAgICAgICAgICAgIGxldCBjaCA9IHRoaXMuYnVmZmVyW2ldO1xuICAgICAgICAgICAgd2hpbGUgKGNoKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRhZ0NoYXJzLmhhcyhjaCkpXG4gICAgICAgICAgICAgICAgICAgIGNoID0gdGhpcy5idWZmZXJbKytpXTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjaCA9PT0gJyUnICYmXG4gICAgICAgICAgICAgICAgICAgIGhleERpZ2l0cy5oYXModGhpcy5idWZmZXJbaSArIDFdKSAmJlxuICAgICAgICAgICAgICAgICAgICBoZXhEaWdpdHMuaGFzKHRoaXMuYnVmZmVyW2kgKyAyXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2ggPSB0aGlzLmJ1ZmZlclsoaSArPSAzKV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucHVzaFRvSW5kZXgoaSwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgICpwdXNoTmV3bGluZSgpIHtcbiAgICAgICAgY29uc3QgY2ggPSB0aGlzLmJ1ZmZlclt0aGlzLnBvc107XG4gICAgICAgIGlmIChjaCA9PT0gJ1xcbicpXG4gICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucHVzaENvdW50KDEpO1xuICAgICAgICBlbHNlIGlmIChjaCA9PT0gJ1xccicgJiYgdGhpcy5jaGFyQXQoMSkgPT09ICdcXG4nKVxuICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiB0aGlzLnB1c2hDb3VudCgyKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgICpwdXNoU3BhY2VzKGFsbG93VGFicykge1xuICAgICAgICBsZXQgaSA9IHRoaXMucG9zIC0gMTtcbiAgICAgICAgbGV0IGNoO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBjaCA9IHRoaXMuYnVmZmVyWysraV07XG4gICAgICAgIH0gd2hpbGUgKGNoID09PSAnICcgfHwgKGFsbG93VGFicyAmJiBjaCA9PT0gJ1xcdCcpKTtcbiAgICAgICAgY29uc3QgbiA9IGkgLSB0aGlzLnBvcztcbiAgICAgICAgaWYgKG4gPiAwKSB7XG4gICAgICAgICAgICB5aWVsZCB0aGlzLmJ1ZmZlci5zdWJzdHIodGhpcy5wb3MsIG4pO1xuICAgICAgICAgICAgdGhpcy5wb3MgPSBpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuO1xuICAgIH1cbiAgICAqcHVzaFVudGlsKHRlc3QpIHtcbiAgICAgICAgbGV0IGkgPSB0aGlzLnBvcztcbiAgICAgICAgbGV0IGNoID0gdGhpcy5idWZmZXJbaV07XG4gICAgICAgIHdoaWxlICghdGVzdChjaCkpXG4gICAgICAgICAgICBjaCA9IHRoaXMuYnVmZmVyWysraV07XG4gICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5wdXNoVG9JbmRleChpLCBmYWxzZSk7XG4gICAgfVxufVxuXG5leHBvcnQgeyBMZXhlciB9O1xuIiwiLyoqXG4gKiBUcmFja3MgbmV3bGluZXMgZHVyaW5nIHBhcnNpbmcgaW4gb3JkZXIgdG8gcHJvdmlkZSBhbiBlZmZpY2llbnQgQVBJIGZvclxuICogZGV0ZXJtaW5pbmcgdGhlIG9uZS1pbmRleGVkIGB7IGxpbmUsIGNvbCB9YCBwb3NpdGlvbiBmb3IgYW55IG9mZnNldFxuICogd2l0aGluIHRoZSBpbnB1dC5cbiAqL1xuY2xhc3MgTGluZUNvdW50ZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmxpbmVTdGFydHMgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNob3VsZCBiZSBjYWxsZWQgaW4gYXNjZW5kaW5nIG9yZGVyLiBPdGhlcndpc2UsIGNhbGxcbiAgICAgICAgICogYGxpbmVDb3VudGVyLmxpbmVTdGFydHMuc29ydCgpYCBiZWZvcmUgY2FsbGluZyBgbGluZVBvcygpYC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYWRkTmV3TGluZSA9IChvZmZzZXQpID0+IHRoaXMubGluZVN0YXJ0cy5wdXNoKG9mZnNldCk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQZXJmb3JtcyBhIGJpbmFyeSBzZWFyY2ggYW5kIHJldHVybnMgdGhlIDEtaW5kZXhlZCB7IGxpbmUsIGNvbCB9XG4gICAgICAgICAqIHBvc2l0aW9uIG9mIGBvZmZzZXRgLiBJZiBgbGluZSA9PT0gMGAsIGBhZGROZXdMaW5lYCBoYXMgbmV2ZXIgYmVlblxuICAgICAgICAgKiBjYWxsZWQgb3IgYG9mZnNldGAgaXMgYmVmb3JlIHRoZSBmaXJzdCBrbm93biBuZXdsaW5lLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5saW5lUG9zID0gKG9mZnNldCkgPT4ge1xuICAgICAgICAgICAgbGV0IGxvdyA9IDA7XG4gICAgICAgICAgICBsZXQgaGlnaCA9IHRoaXMubGluZVN0YXJ0cy5sZW5ndGg7XG4gICAgICAgICAgICB3aGlsZSAobG93IDwgaGlnaCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1pZCA9IChsb3cgKyBoaWdoKSA+PiAxOyAvLyBNYXRoLmZsb29yKChsb3cgKyBoaWdoKSAvIDIpXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubGluZVN0YXJ0c1ttaWRdIDwgb2Zmc2V0KVxuICAgICAgICAgICAgICAgICAgICBsb3cgPSBtaWQgKyAxO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgaGlnaCA9IG1pZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmxpbmVTdGFydHNbbG93XSA9PT0gb2Zmc2V0KVxuICAgICAgICAgICAgICAgIHJldHVybiB7IGxpbmU6IGxvdyArIDEsIGNvbDogMSB9O1xuICAgICAgICAgICAgaWYgKGxvdyA9PT0gMClcbiAgICAgICAgICAgICAgICByZXR1cm4geyBsaW5lOiAwLCBjb2w6IG9mZnNldCB9O1xuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0aGlzLmxpbmVTdGFydHNbbG93IC0gMV07XG4gICAgICAgICAgICByZXR1cm4geyBsaW5lOiBsb3csIGNvbDogb2Zmc2V0IC0gc3RhcnQgKyAxIH07XG4gICAgICAgIH07XG4gICAgfVxufVxuXG5leHBvcnQgeyBMaW5lQ291bnRlciB9O1xuIiwiaW1wb3J0IHsgdG9rZW5UeXBlIH0gZnJvbSAnLi9jc3QuanMnO1xuaW1wb3J0IHsgTGV4ZXIgfSBmcm9tICcuL2xleGVyLmpzJztcblxuZnVuY3Rpb24gaW5jbHVkZXNUb2tlbihsaXN0LCB0eXBlKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKVxuICAgICAgICBpZiAobGlzdFtpXS50eXBlID09PSB0eXBlKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gZmluZE5vbkVtcHR5SW5kZXgobGlzdCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7ICsraSkge1xuICAgICAgICBzd2l0Y2ggKGxpc3RbaV0udHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnc3BhY2UnOlxuICAgICAgICAgICAgY2FzZSAnY29tbWVudCc6XG4gICAgICAgICAgICBjYXNlICduZXdsaW5lJzpcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIC0xO1xufVxuZnVuY3Rpb24gaXNGbG93VG9rZW4odG9rZW4pIHtcbiAgICBzd2l0Y2ggKHRva2VuPy50eXBlKSB7XG4gICAgICAgIGNhc2UgJ2FsaWFzJzpcbiAgICAgICAgY2FzZSAnc2NhbGFyJzpcbiAgICAgICAgY2FzZSAnc2luZ2xlLXF1b3RlZC1zY2FsYXInOlxuICAgICAgICBjYXNlICdkb3VibGUtcXVvdGVkLXNjYWxhcic6XG4gICAgICAgIGNhc2UgJ2Zsb3ctY29sbGVjdGlvbic6XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5mdW5jdGlvbiBnZXRQcmV2UHJvcHMocGFyZW50KSB7XG4gICAgc3dpdGNoIChwYXJlbnQudHlwZSkge1xuICAgICAgICBjYXNlICdkb2N1bWVudCc6XG4gICAgICAgICAgICByZXR1cm4gcGFyZW50LnN0YXJ0O1xuICAgICAgICBjYXNlICdibG9jay1tYXAnOiB7XG4gICAgICAgICAgICBjb25zdCBpdCA9IHBhcmVudC5pdGVtc1twYXJlbnQuaXRlbXMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICByZXR1cm4gaXQuc2VwID8/IGl0LnN0YXJ0O1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2Jsb2NrLXNlcSc6XG4gICAgICAgICAgICByZXR1cm4gcGFyZW50Lml0ZW1zW3BhcmVudC5pdGVtcy5sZW5ndGggLSAxXS5zdGFydDtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgc2hvdWxkIG5vdCBoYXBwZW4gKi9cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICB9XG59XG4vKiogTm90ZTogTWF5IG1vZGlmeSBpbnB1dCBhcnJheSAqL1xuZnVuY3Rpb24gZ2V0Rmlyc3RLZXlTdGFydFByb3BzKHByZXYpIHtcbiAgICBpZiAocHJldi5sZW5ndGggPT09IDApXG4gICAgICAgIHJldHVybiBbXTtcbiAgICBsZXQgaSA9IHByZXYubGVuZ3RoO1xuICAgIGxvb3A6IHdoaWxlICgtLWkgPj0gMCkge1xuICAgICAgICBzd2l0Y2ggKHByZXZbaV0udHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnZG9jLXN0YXJ0JzpcbiAgICAgICAgICAgIGNhc2UgJ2V4cGxpY2l0LWtleS1pbmQnOlxuICAgICAgICAgICAgY2FzZSAnbWFwLXZhbHVlLWluZCc6XG4gICAgICAgICAgICBjYXNlICdzZXEtaXRlbS1pbmQnOlxuICAgICAgICAgICAgY2FzZSAnbmV3bGluZSc6XG4gICAgICAgICAgICAgICAgYnJlYWsgbG9vcDtcbiAgICAgICAgfVxuICAgIH1cbiAgICB3aGlsZSAocHJldlsrK2ldPy50eXBlID09PSAnc3BhY2UnKSB7XG4gICAgICAgIC8qIGxvb3AgKi9cbiAgICB9XG4gICAgcmV0dXJuIHByZXYuc3BsaWNlKGksIHByZXYubGVuZ3RoKTtcbn1cbmZ1bmN0aW9uIGFycmF5UHVzaEFycmF5KHRhcmdldCwgc291cmNlKSB7XG4gICAgLy8gTWF5IGV4aGF1c3QgY2FsbCBzdGFjayB3aXRoIGxhcmdlIGBzb3VyY2VgIGFycmF5XG4gICAgaWYgKHNvdXJjZS5sZW5ndGggPCAxZTUpXG4gICAgICAgIEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KHRhcmdldCwgc291cmNlKTtcbiAgICBlbHNlXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc291cmNlLmxlbmd0aDsgKytpKVxuICAgICAgICAgICAgdGFyZ2V0LnB1c2goc291cmNlW2ldKTtcbn1cbmZ1bmN0aW9uIGZpeEZsb3dTZXFJdGVtcyhmYykge1xuICAgIGlmIChmYy5zdGFydC50eXBlID09PSAnZmxvdy1zZXEtc3RhcnQnKSB7XG4gICAgICAgIGZvciAoY29uc3QgaXQgb2YgZmMuaXRlbXMpIHtcbiAgICAgICAgICAgIGlmIChpdC5zZXAgJiZcbiAgICAgICAgICAgICAgICAhaXQudmFsdWUgJiZcbiAgICAgICAgICAgICAgICAhaW5jbHVkZXNUb2tlbihpdC5zdGFydCwgJ2V4cGxpY2l0LWtleS1pbmQnKSAmJlxuICAgICAgICAgICAgICAgICFpbmNsdWRlc1Rva2VuKGl0LnNlcCwgJ21hcC12YWx1ZS1pbmQnKSkge1xuICAgICAgICAgICAgICAgIGlmIChpdC5rZXkpXG4gICAgICAgICAgICAgICAgICAgIGl0LnZhbHVlID0gaXQua2V5O1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBpdC5rZXk7XG4gICAgICAgICAgICAgICAgaWYgKGlzRmxvd1Rva2VuKGl0LnZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXQudmFsdWUuZW5kKVxuICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlQdXNoQXJyYXkoaXQudmFsdWUuZW5kLCBpdC5zZXApO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBpdC52YWx1ZS5lbmQgPSBpdC5zZXA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgYXJyYXlQdXNoQXJyYXkoaXQuc3RhcnQsIGl0LnNlcCk7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGl0LnNlcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuICogQSBZQU1MIGNvbmNyZXRlIHN5bnRheCB0cmVlIChDU1QpIHBhcnNlclxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCBzcmM6IHN0cmluZyA9IC4uLlxuICogZm9yIChjb25zdCB0b2tlbiBvZiBuZXcgUGFyc2VyKCkucGFyc2Uoc3JjKSkge1xuICogICAvLyB0b2tlbjogVG9rZW5cbiAqIH1cbiAqIGBgYFxuICpcbiAqIFRvIHVzZSB0aGUgcGFyc2VyIHdpdGggYSB1c2VyLXByb3ZpZGVkIGxleGVyOlxuICpcbiAqIGBgYHRzXG4gKiBmdW5jdGlvbiogcGFyc2Uoc291cmNlOiBzdHJpbmcsIGxleGVyOiBMZXhlcikge1xuICogICBjb25zdCBwYXJzZXIgPSBuZXcgUGFyc2VyKClcbiAqICAgZm9yIChjb25zdCBsZXhlbWUgb2YgbGV4ZXIubGV4KHNvdXJjZSkpXG4gKiAgICAgeWllbGQqIHBhcnNlci5uZXh0KGxleGVtZSlcbiAqICAgeWllbGQqIHBhcnNlci5lbmQoKVxuICogfVxuICpcbiAqIGNvbnN0IHNyYzogc3RyaW5nID0gLi4uXG4gKiBjb25zdCBsZXhlciA9IG5ldyBMZXhlcigpXG4gKiBmb3IgKGNvbnN0IHRva2VuIG9mIHBhcnNlKHNyYywgbGV4ZXIpKSB7XG4gKiAgIC8vIHRva2VuOiBUb2tlblxuICogfVxuICogYGBgXG4gKi9cbmNsYXNzIFBhcnNlciB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIG9uTmV3TGluZSAtIElmIGRlZmluZWQsIGNhbGxlZCBzZXBhcmF0ZWx5IHdpdGggdGhlIHN0YXJ0IHBvc2l0aW9uIG9mXG4gICAgICogICBlYWNoIG5ldyBsaW5lIChpbiBgcGFyc2UoKWAsIGluY2x1ZGluZyB0aGUgc3RhcnQgb2YgaW5wdXQpLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG9uTmV3TGluZSkge1xuICAgICAgICAvKiogSWYgdHJ1ZSwgc3BhY2UgYW5kIHNlcXVlbmNlIGluZGljYXRvcnMgY291bnQgYXMgaW5kZW50YXRpb24gKi9cbiAgICAgICAgdGhpcy5hdE5ld0xpbmUgPSB0cnVlO1xuICAgICAgICAvKiogSWYgdHJ1ZSwgbmV4dCB0b2tlbiBpcyBhIHNjYWxhciB2YWx1ZSAqL1xuICAgICAgICB0aGlzLmF0U2NhbGFyID0gZmFsc2U7XG4gICAgICAgIC8qKiBDdXJyZW50IGluZGVudGF0aW9uIGxldmVsICovXG4gICAgICAgIHRoaXMuaW5kZW50ID0gMDtcbiAgICAgICAgLyoqIEN1cnJlbnQgb2Zmc2V0IHNpbmNlIHRoZSBzdGFydCBvZiBwYXJzaW5nICovXG4gICAgICAgIHRoaXMub2Zmc2V0ID0gMDtcbiAgICAgICAgLyoqIE9uIHRoZSBzYW1lIGxpbmUgd2l0aCBhIGJsb2NrIG1hcCBrZXkgKi9cbiAgICAgICAgdGhpcy5vbktleUxpbmUgPSBmYWxzZTtcbiAgICAgICAgLyoqIFRvcCBpbmRpY2F0ZXMgdGhlIG5vZGUgdGhhdCdzIGN1cnJlbnRseSBiZWluZyBidWlsdCAqL1xuICAgICAgICB0aGlzLnN0YWNrID0gW107XG4gICAgICAgIC8qKiBUaGUgc291cmNlIG9mIHRoZSBjdXJyZW50IHRva2VuLCBzZXQgaW4gcGFyc2UoKSAqL1xuICAgICAgICB0aGlzLnNvdXJjZSA9ICcnO1xuICAgICAgICAvKiogVGhlIHR5cGUgb2YgdGhlIGN1cnJlbnQgdG9rZW4sIHNldCBpbiBwYXJzZSgpICovXG4gICAgICAgIHRoaXMudHlwZSA9ICcnO1xuICAgICAgICAvLyBNdXN0IGJlIGRlZmluZWQgYWZ0ZXIgYG5leHQoKWBcbiAgICAgICAgdGhpcy5sZXhlciA9IG5ldyBMZXhlcigpO1xuICAgICAgICB0aGlzLm9uTmV3TGluZSA9IG9uTmV3TGluZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUGFyc2UgYHNvdXJjZWAgYXMgYSBZQU1MIHN0cmVhbS5cbiAgICAgKiBJZiBgaW5jb21wbGV0ZWAsIGEgcGFydCBvZiB0aGUgbGFzdCBsaW5lIG1heSBiZSBsZWZ0IGFzIGEgYnVmZmVyIGZvciB0aGUgbmV4dCBjYWxsLlxuICAgICAqXG4gICAgICogRXJyb3JzIGFyZSBub3QgdGhyb3duLCBidXQgeWllbGRlZCBhcyBgeyB0eXBlOiAnZXJyb3InLCBtZXNzYWdlIH1gIHRva2Vucy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEEgZ2VuZXJhdG9yIG9mIHRva2VucyByZXByZXNlbnRpbmcgZWFjaCBkaXJlY3RpdmUsIGRvY3VtZW50LCBhbmQgb3RoZXIgc3RydWN0dXJlLlxuICAgICAqL1xuICAgICpwYXJzZShzb3VyY2UsIGluY29tcGxldGUgPSBmYWxzZSkge1xuICAgICAgICBpZiAodGhpcy5vbk5ld0xpbmUgJiYgdGhpcy5vZmZzZXQgPT09IDApXG4gICAgICAgICAgICB0aGlzLm9uTmV3TGluZSgwKTtcbiAgICAgICAgZm9yIChjb25zdCBsZXhlbWUgb2YgdGhpcy5sZXhlci5sZXgoc291cmNlLCBpbmNvbXBsZXRlKSlcbiAgICAgICAgICAgIHlpZWxkKiB0aGlzLm5leHQobGV4ZW1lKTtcbiAgICAgICAgaWYgKCFpbmNvbXBsZXRlKVxuICAgICAgICAgICAgeWllbGQqIHRoaXMuZW5kKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkdmFuY2UgdGhlIHBhcnNlciBieSB0aGUgYHNvdXJjZWAgb2Ygb25lIGxleGljYWwgdG9rZW4uXG4gICAgICovXG4gICAgKm5leHQoc291cmNlKSB7XG4gICAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgICAgICBpZiAodGhpcy5hdFNjYWxhcikge1xuICAgICAgICAgICAgdGhpcy5hdFNjYWxhciA9IGZhbHNlO1xuICAgICAgICAgICAgeWllbGQqIHRoaXMuc3RlcCgpO1xuICAgICAgICAgICAgdGhpcy5vZmZzZXQgKz0gc291cmNlLmxlbmd0aDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0eXBlID0gdG9rZW5UeXBlKHNvdXJjZSk7XG4gICAgICAgIGlmICghdHlwZSkge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGBOb3QgYSBZQU1MIHRva2VuOiAke3NvdXJjZX1gO1xuICAgICAgICAgICAgeWllbGQqIHRoaXMucG9wKHsgdHlwZTogJ2Vycm9yJywgb2Zmc2V0OiB0aGlzLm9mZnNldCwgbWVzc2FnZSwgc291cmNlIH0pO1xuICAgICAgICAgICAgdGhpcy5vZmZzZXQgKz0gc291cmNlLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlID09PSAnc2NhbGFyJykge1xuICAgICAgICAgICAgdGhpcy5hdE5ld0xpbmUgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuYXRTY2FsYXIgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy50eXBlID0gJ3NjYWxhcic7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICAgICAgeWllbGQqIHRoaXMuc3RlcCgpO1xuICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnbmV3bGluZSc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXROZXdMaW5lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmRlbnQgPSAwO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vbk5ld0xpbmUpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uTmV3TGluZSh0aGlzLm9mZnNldCArIHNvdXJjZS5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdzcGFjZSc6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmF0TmV3TGluZSAmJiBzb3VyY2VbMF0gPT09ICcgJylcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5kZW50ICs9IHNvdXJjZS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2V4cGxpY2l0LWtleS1pbmQnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ21hcC12YWx1ZS1pbmQnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ3NlcS1pdGVtLWluZCc6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmF0TmV3TGluZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5kZW50ICs9IHNvdXJjZS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2RvYy1tb2RlJzpcbiAgICAgICAgICAgICAgICBjYXNlICdmbG93LWVycm9yLWVuZCc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmF0TmV3TGluZSA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5vZmZzZXQgKz0gc291cmNlLmxlbmd0aDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKiogQ2FsbCBhdCBlbmQgb2YgaW5wdXQgdG8gcHVzaCBvdXQgYW55IHJlbWFpbmluZyBjb25zdHJ1Y3Rpb25zICovXG4gICAgKmVuZCgpIHtcbiAgICAgICAgd2hpbGUgKHRoaXMuc3RhY2subGVuZ3RoID4gMClcbiAgICAgICAgICAgIHlpZWxkKiB0aGlzLnBvcCgpO1xuICAgIH1cbiAgICBnZXQgc291cmNlVG9rZW4oKSB7XG4gICAgICAgIGNvbnN0IHN0ID0ge1xuICAgICAgICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgICAgICAgb2Zmc2V0OiB0aGlzLm9mZnNldCxcbiAgICAgICAgICAgIGluZGVudDogdGhpcy5pbmRlbnQsXG4gICAgICAgICAgICBzb3VyY2U6IHRoaXMuc291cmNlXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBzdDtcbiAgICB9XG4gICAgKnN0ZXAoKSB7XG4gICAgICAgIGNvbnN0IHRvcCA9IHRoaXMucGVlaygxKTtcbiAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gJ2RvYy1lbmQnICYmIHRvcD8udHlwZSAhPT0gJ2RvYy1lbmQnKSB7XG4gICAgICAgICAgICB3aGlsZSAodGhpcy5zdGFjay5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnBvcCgpO1xuICAgICAgICAgICAgdGhpcy5zdGFjay5wdXNoKHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnZG9jLWVuZCcsXG4gICAgICAgICAgICAgICAgb2Zmc2V0OiB0aGlzLm9mZnNldCxcbiAgICAgICAgICAgICAgICBzb3VyY2U6IHRoaXMuc291cmNlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRvcClcbiAgICAgICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5zdHJlYW0oKTtcbiAgICAgICAgc3dpdGNoICh0b3AudHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnZG9jdW1lbnQnOlxuICAgICAgICAgICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5kb2N1bWVudCh0b3ApO1xuICAgICAgICAgICAgY2FzZSAnYWxpYXMnOlxuICAgICAgICAgICAgY2FzZSAnc2NhbGFyJzpcbiAgICAgICAgICAgIGNhc2UgJ3NpbmdsZS1xdW90ZWQtc2NhbGFyJzpcbiAgICAgICAgICAgIGNhc2UgJ2RvdWJsZS1xdW90ZWQtc2NhbGFyJzpcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMuc2NhbGFyKHRvcCk7XG4gICAgICAgICAgICBjYXNlICdibG9jay1zY2FsYXInOlxuICAgICAgICAgICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5ibG9ja1NjYWxhcih0b3ApO1xuICAgICAgICAgICAgY2FzZSAnYmxvY2stbWFwJzpcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMuYmxvY2tNYXAodG9wKTtcbiAgICAgICAgICAgIGNhc2UgJ2Jsb2NrLXNlcSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiB0aGlzLmJsb2NrU2VxdWVuY2UodG9wKTtcbiAgICAgICAgICAgIGNhc2UgJ2Zsb3ctY29sbGVjdGlvbic6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiB0aGlzLmZsb3dDb2xsZWN0aW9uKHRvcCk7XG4gICAgICAgICAgICBjYXNlICdkb2MtZW5kJzpcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMuZG9jdW1lbnRFbmQodG9wKTtcbiAgICAgICAgfVxuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCBzaG91bGQgbm90IGhhcHBlbiAqL1xuICAgICAgICB5aWVsZCogdGhpcy5wb3AoKTtcbiAgICB9XG4gICAgcGVlayhuKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gbl07XG4gICAgfVxuICAgICpwb3AoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgdG9rZW4gPSBlcnJvciA/PyB0aGlzLnN0YWNrLnBvcCgpO1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgc2hvdWxkIG5vdCBoYXBwZW4gKi9cbiAgICAgICAgaWYgKCF0b2tlbikge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9ICdUcmllZCB0byBwb3AgYW4gZW1wdHkgc3RhY2snO1xuICAgICAgICAgICAgeWllbGQgeyB0eXBlOiAnZXJyb3InLCBvZmZzZXQ6IHRoaXMub2Zmc2V0LCBzb3VyY2U6ICcnLCBtZXNzYWdlIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5zdGFjay5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHlpZWxkIHRva2VuO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgdG9wID0gdGhpcy5wZWVrKDEpO1xuICAgICAgICAgICAgaWYgKHRva2VuLnR5cGUgPT09ICdibG9jay1zY2FsYXInKSB7XG4gICAgICAgICAgICAgICAgLy8gQmxvY2sgc2NhbGFycyB1c2UgdGhlaXIgcGFyZW50IHJhdGhlciB0aGFuIGhlYWRlciBpbmRlbnRcbiAgICAgICAgICAgICAgICB0b2tlbi5pbmRlbnQgPSAnaW5kZW50JyBpbiB0b3AgPyB0b3AuaW5kZW50IDogMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRva2VuLnR5cGUgPT09ICdmbG93LWNvbGxlY3Rpb24nICYmIHRvcC50eXBlID09PSAnZG9jdW1lbnQnKSB7XG4gICAgICAgICAgICAgICAgLy8gSWdub3JlIGFsbCBpbmRlbnQgZm9yIHRvcC1sZXZlbCBmbG93IGNvbGxlY3Rpb25zXG4gICAgICAgICAgICAgICAgdG9rZW4uaW5kZW50ID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0b2tlbi50eXBlID09PSAnZmxvdy1jb2xsZWN0aW9uJylcbiAgICAgICAgICAgICAgICBmaXhGbG93U2VxSXRlbXModG9rZW4pO1xuICAgICAgICAgICAgc3dpdGNoICh0b3AudHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2RvY3VtZW50JzpcbiAgICAgICAgICAgICAgICAgICAgdG9wLnZhbHVlID0gdG9rZW47XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2Jsb2NrLXNjYWxhcic6XG4gICAgICAgICAgICAgICAgICAgIHRvcC5wcm9wcy5wdXNoKHRva2VuKTsgLy8gZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnYmxvY2stbWFwJzoge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpdCA9IHRvcC5pdGVtc1t0b3AuaXRlbXMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChpdC52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9wLml0ZW1zLnB1c2goeyBzdGFydDogW10sIGtleTogdG9rZW4sIHNlcDogW10gfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uS2V5TGluZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaXQuc2VwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdC52YWx1ZSA9IHRva2VuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihpdCwgeyBrZXk6IHRva2VuLCBzZXA6IFtdIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbktleUxpbmUgPSAhaXQuZXhwbGljaXRLZXk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgJ2Jsb2NrLXNlcSc6IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXQgPSB0b3AuaXRlbXNbdG9wLml0ZW1zLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXQudmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICB0b3AuaXRlbXMucHVzaCh7IHN0YXJ0OiBbXSwgdmFsdWU6IHRva2VuIH0pO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBpdC52YWx1ZSA9IHRva2VuO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSAnZmxvdy1jb2xsZWN0aW9uJzoge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpdCA9IHRvcC5pdGVtc1t0b3AuaXRlbXMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgICAgIGlmICghaXQgfHwgaXQudmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICB0b3AuaXRlbXMucHVzaCh7IHN0YXJ0OiBbXSwga2V5OiB0b2tlbiwgc2VwOiBbXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaXQuc2VwKVxuICAgICAgICAgICAgICAgICAgICAgICAgaXQudmFsdWUgPSB0b2tlbjtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihpdCwgeyBrZXk6IHRva2VuLCBzZXA6IFtdIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0IHNob3VsZCBub3QgaGFwcGVuICovXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgeWllbGQqIHRoaXMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnBvcCh0b2tlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKHRvcC50eXBlID09PSAnZG9jdW1lbnQnIHx8XG4gICAgICAgICAgICAgICAgdG9wLnR5cGUgPT09ICdibG9jay1tYXAnIHx8XG4gICAgICAgICAgICAgICAgdG9wLnR5cGUgPT09ICdibG9jay1zZXEnKSAmJlxuICAgICAgICAgICAgICAgICh0b2tlbi50eXBlID09PSAnYmxvY2stbWFwJyB8fCB0b2tlbi50eXBlID09PSAnYmxvY2stc2VxJykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsYXN0ID0gdG9rZW4uaXRlbXNbdG9rZW4uaXRlbXMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgaWYgKGxhc3QgJiZcbiAgICAgICAgICAgICAgICAgICAgIWxhc3Quc2VwICYmXG4gICAgICAgICAgICAgICAgICAgICFsYXN0LnZhbHVlICYmXG4gICAgICAgICAgICAgICAgICAgIGxhc3Quc3RhcnQubGVuZ3RoID4gMCAmJlxuICAgICAgICAgICAgICAgICAgICBmaW5kTm9uRW1wdHlJbmRleChsYXN0LnN0YXJ0KSA9PT0gLTEgJiZcbiAgICAgICAgICAgICAgICAgICAgKHRva2VuLmluZGVudCA9PT0gMCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgbGFzdC5zdGFydC5ldmVyeShzdCA9PiBzdC50eXBlICE9PSAnY29tbWVudCcgfHwgc3QuaW5kZW50IDwgdG9rZW4uaW5kZW50KSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRvcC50eXBlID09PSAnZG9jdW1lbnQnKVxuICAgICAgICAgICAgICAgICAgICAgICAgdG9wLmVuZCA9IGxhc3Quc3RhcnQ7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvcC5pdGVtcy5wdXNoKHsgc3RhcnQ6IGxhc3Quc3RhcnQgfSk7XG4gICAgICAgICAgICAgICAgICAgIHRva2VuLml0ZW1zLnNwbGljZSgtMSwgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgICpzdHJlYW0oKSB7XG4gICAgICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdkaXJlY3RpdmUtbGluZSc6XG4gICAgICAgICAgICAgICAgeWllbGQgeyB0eXBlOiAnZGlyZWN0aXZlJywgb2Zmc2V0OiB0aGlzLm9mZnNldCwgc291cmNlOiB0aGlzLnNvdXJjZSB9O1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGNhc2UgJ2J5dGUtb3JkZXItbWFyayc6XG4gICAgICAgICAgICBjYXNlICdzcGFjZSc6XG4gICAgICAgICAgICBjYXNlICdjb21tZW50JzpcbiAgICAgICAgICAgIGNhc2UgJ25ld2xpbmUnOlxuICAgICAgICAgICAgICAgIHlpZWxkIHRoaXMuc291cmNlVG9rZW47XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgY2FzZSAnZG9jLW1vZGUnOlxuICAgICAgICAgICAgY2FzZSAnZG9jLXN0YXJ0Jzoge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRvYyA9IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2RvY3VtZW50JyxcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiB0aGlzLm9mZnNldCxcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IFtdXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy50eXBlID09PSAnZG9jLXN0YXJ0JylcbiAgICAgICAgICAgICAgICAgICAgZG9jLnN0YXJ0LnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGFjay5wdXNoKGRvYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHlpZWxkIHtcbiAgICAgICAgICAgIHR5cGU6ICdlcnJvcicsXG4gICAgICAgICAgICBvZmZzZXQ6IHRoaXMub2Zmc2V0LFxuICAgICAgICAgICAgbWVzc2FnZTogYFVuZXhwZWN0ZWQgJHt0aGlzLnR5cGV9IHRva2VuIGluIFlBTUwgc3RyZWFtYCxcbiAgICAgICAgICAgIHNvdXJjZTogdGhpcy5zb3VyY2VcbiAgICAgICAgfTtcbiAgICB9XG4gICAgKmRvY3VtZW50KGRvYykge1xuICAgICAgICBpZiAoZG9jLnZhbHVlKVxuICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiB0aGlzLmxpbmVFbmQoZG9jKTtcbiAgICAgICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2RvYy1zdGFydCc6IHtcbiAgICAgICAgICAgICAgICBpZiAoZmluZE5vbkVtcHR5SW5kZXgoZG9jLnN0YXJ0KSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgeWllbGQqIHRoaXMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnN0ZXAoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBkb2Muc3RhcnQucHVzaCh0aGlzLnNvdXJjZVRva2VuKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdhbmNob3InOlxuICAgICAgICAgICAgY2FzZSAndGFnJzpcbiAgICAgICAgICAgIGNhc2UgJ3NwYWNlJzpcbiAgICAgICAgICAgIGNhc2UgJ2NvbW1lbnQnOlxuICAgICAgICAgICAgY2FzZSAnbmV3bGluZSc6XG4gICAgICAgICAgICAgICAgZG9jLnN0YXJ0LnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJ2ID0gdGhpcy5zdGFydEJsb2NrVmFsdWUoZG9jKTtcbiAgICAgICAgaWYgKGJ2KVxuICAgICAgICAgICAgdGhpcy5zdGFjay5wdXNoKGJ2KTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB5aWVsZCB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICBvZmZzZXQ6IHRoaXMub2Zmc2V0LFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBVbmV4cGVjdGVkICR7dGhpcy50eXBlfSB0b2tlbiBpbiBZQU1MIGRvY3VtZW50YCxcbiAgICAgICAgICAgICAgICBzb3VyY2U6IHRoaXMuc291cmNlXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuICAgICpzY2FsYXIoc2NhbGFyKSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgPT09ICdtYXAtdmFsdWUtaW5kJykge1xuICAgICAgICAgICAgY29uc3QgcHJldiA9IGdldFByZXZQcm9wcyh0aGlzLnBlZWsoMikpO1xuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBnZXRGaXJzdEtleVN0YXJ0UHJvcHMocHJldik7XG4gICAgICAgICAgICBsZXQgc2VwO1xuICAgICAgICAgICAgaWYgKHNjYWxhci5lbmQpIHtcbiAgICAgICAgICAgICAgICBzZXAgPSBzY2FsYXIuZW5kO1xuICAgICAgICAgICAgICAgIHNlcC5wdXNoKHRoaXMuc291cmNlVG9rZW4pO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBzY2FsYXIuZW5kO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHNlcCA9IFt0aGlzLnNvdXJjZVRva2VuXTtcbiAgICAgICAgICAgIGNvbnN0IG1hcCA9IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnYmxvY2stbWFwJyxcbiAgICAgICAgICAgICAgICBvZmZzZXQ6IHNjYWxhci5vZmZzZXQsXG4gICAgICAgICAgICAgICAgaW5kZW50OiBzY2FsYXIuaW5kZW50LFxuICAgICAgICAgICAgICAgIGl0ZW1zOiBbeyBzdGFydCwga2V5OiBzY2FsYXIsIHNlcCB9XVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMub25LZXlMaW5lID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXSA9IG1hcDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICB5aWVsZCogdGhpcy5saW5lRW5kKHNjYWxhcik7XG4gICAgfVxuICAgICpibG9ja1NjYWxhcihzY2FsYXIpIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ3NwYWNlJzpcbiAgICAgICAgICAgIGNhc2UgJ2NvbW1lbnQnOlxuICAgICAgICAgICAgY2FzZSAnbmV3bGluZSc6XG4gICAgICAgICAgICAgICAgc2NhbGFyLnByb3BzLnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgY2FzZSAnc2NhbGFyJzpcbiAgICAgICAgICAgICAgICBzY2FsYXIuc291cmNlID0gdGhpcy5zb3VyY2U7XG4gICAgICAgICAgICAgICAgLy8gYmxvY2stc2NhbGFyIHNvdXJjZSBpbmNsdWRlcyB0cmFpbGluZyBuZXdsaW5lXG4gICAgICAgICAgICAgICAgdGhpcy5hdE5ld0xpbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5kZW50ID0gMDtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vbk5ld0xpbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5sID0gdGhpcy5zb3VyY2UuaW5kZXhPZignXFxuJykgKyAxO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAobmwgIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25OZXdMaW5lKHRoaXMub2Zmc2V0ICsgbmwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbmwgPSB0aGlzLnNvdXJjZS5pbmRleE9mKCdcXG4nLCBubCkgKyAxO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnBvcCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgc2hvdWxkIG5vdCBoYXBwZW4gKi9cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgeWllbGQqIHRoaXMucG9wKCk7XG4gICAgICAgICAgICAgICAgeWllbGQqIHRoaXMuc3RlcCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgICpibG9ja01hcChtYXApIHtcbiAgICAgICAgY29uc3QgaXQgPSBtYXAuaXRlbXNbbWFwLml0ZW1zLmxlbmd0aCAtIDFdO1xuICAgICAgICAvLyBpdC5zZXAgaXMgdHJ1ZS1pc2ggaWYgcGFpciBhbHJlYWR5IGhhcyBrZXkgb3IgOiBzZXBhcmF0b3JcbiAgICAgICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ25ld2xpbmUnOlxuICAgICAgICAgICAgICAgIHRoaXMub25LZXlMaW5lID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKGl0LnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZCA9ICdlbmQnIGluIGl0LnZhbHVlID8gaXQudmFsdWUuZW5kIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXN0ID0gQXJyYXkuaXNBcnJheShlbmQpID8gZW5kW2VuZC5sZW5ndGggLSAxXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3Q/LnR5cGUgPT09ICdjb21tZW50JylcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuZD8ucHVzaCh0aGlzLnNvdXJjZVRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgbWFwLml0ZW1zLnB1c2goeyBzdGFydDogW3RoaXMuc291cmNlVG9rZW5dIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChpdC5zZXApIHtcbiAgICAgICAgICAgICAgICAgICAgaXQuc2VwLnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpdC5zdGFydC5wdXNoKHRoaXMuc291cmNlVG9rZW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBjYXNlICdzcGFjZSc6XG4gICAgICAgICAgICBjYXNlICdjb21tZW50JzpcbiAgICAgICAgICAgICAgICBpZiAoaXQudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgbWFwLml0ZW1zLnB1c2goeyBzdGFydDogW3RoaXMuc291cmNlVG9rZW5dIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChpdC5zZXApIHtcbiAgICAgICAgICAgICAgICAgICAgaXQuc2VwLnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5hdEluZGVudGVkQ29tbWVudChpdC5zdGFydCwgbWFwLmluZGVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByZXYgPSBtYXAuaXRlbXNbbWFwLml0ZW1zLmxlbmd0aCAtIDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5kID0gcHJldj8udmFsdWU/LmVuZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGVuZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheVB1c2hBcnJheShlbmQsIGl0LnN0YXJ0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQucHVzaCh0aGlzLnNvdXJjZVRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAuaXRlbXMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGl0LnN0YXJ0LnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pbmRlbnQgPj0gbWFwLmluZGVudCkge1xuICAgICAgICAgICAgY29uc3QgYXRNYXBJbmRlbnQgPSAhdGhpcy5vbktleUxpbmUgJiYgdGhpcy5pbmRlbnQgPT09IG1hcC5pbmRlbnQ7XG4gICAgICAgICAgICBjb25zdCBhdE5leHRJdGVtID0gYXRNYXBJbmRlbnQgJiZcbiAgICAgICAgICAgICAgICAoaXQuc2VwIHx8IGl0LmV4cGxpY2l0S2V5KSAmJlxuICAgICAgICAgICAgICAgIHRoaXMudHlwZSAhPT0gJ3NlcS1pdGVtLWluZCc7XG4gICAgICAgICAgICAvLyBGb3IgZW1wdHkgbm9kZXMsIGFzc2lnbiBuZXdsaW5lLXNlcGFyYXRlZCBub3QgaW5kZW50ZWQgZW1wdHkgdG9rZW5zIHRvIGZvbGxvd2luZyBub2RlXG4gICAgICAgICAgICBsZXQgc3RhcnQgPSBbXTtcbiAgICAgICAgICAgIGlmIChhdE5leHRJdGVtICYmIGl0LnNlcCAmJiAhaXQudmFsdWUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBubCA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXQuc2VwLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ID0gaXQuc2VwW2ldO1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN0LnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ25ld2xpbmUnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5sLnB1c2goaSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdzcGFjZSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdjb21tZW50JzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3QuaW5kZW50ID4gbWFwLmluZGVudClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmwubGVuZ3RoID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmwubGVuZ3RoID0gMDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobmwubGVuZ3RoID49IDIpXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gaXQuc2VwLnNwbGljZShubFsxXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2FuY2hvcic6XG4gICAgICAgICAgICAgICAgY2FzZSAndGFnJzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKGF0TmV4dEl0ZW0gfHwgaXQudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAuaXRlbXMucHVzaCh7IHN0YXJ0IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbktleUxpbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGl0LnNlcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXQuc2VwLnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdC5zdGFydC5wdXNoKHRoaXMuc291cmNlVG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICBjYXNlICdleHBsaWNpdC1rZXktaW5kJzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpdC5zZXAgJiYgIWl0LmV4cGxpY2l0S2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdC5zdGFydC5wdXNoKHRoaXMuc291cmNlVG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaXQuZXhwbGljaXRLZXkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGF0TmV4dEl0ZW0gfHwgaXQudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAuaXRlbXMucHVzaCh7IHN0YXJ0LCBleHBsaWNpdEtleTogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2Jsb2NrLW1hcCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiB0aGlzLm9mZnNldCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQ6IHRoaXMuaW5kZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zOiBbeyBzdGFydDogW3RoaXMuc291cmNlVG9rZW5dLCBleHBsaWNpdEtleTogdHJ1ZSB9XVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbktleUxpbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgY2FzZSAnbWFwLXZhbHVlLWluZCc6XG4gICAgICAgICAgICAgICAgICAgIGlmIChpdC5leHBsaWNpdEtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpdC5zZXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5jbHVkZXNUb2tlbihpdC5zdGFydCwgJ25ld2xpbmUnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGl0LCB7IGtleTogbnVsbCwgc2VwOiBbdGhpcy5zb3VyY2VUb2tlbl0gfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IGdldEZpcnN0S2V5U3RhcnRQcm9wcyhpdC5zdGFydCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYmxvY2stbWFwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldDogdGhpcy5vZmZzZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQ6IHRoaXMuaW5kZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXM6IFt7IHN0YXJ0LCBrZXk6IG51bGwsIHNlcDogW3RoaXMuc291cmNlVG9rZW5dIH1dXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGl0LnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwLml0ZW1zLnB1c2goeyBzdGFydDogW10sIGtleTogbnVsbCwgc2VwOiBbdGhpcy5zb3VyY2VUb2tlbl0gfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpbmNsdWRlc1Rva2VuKGl0LnNlcCwgJ21hcC12YWx1ZS1pbmQnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdibG9jay1tYXAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IHRoaXMub2Zmc2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQ6IHRoaXMuaW5kZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtczogW3sgc3RhcnQsIGtleTogbnVsbCwgc2VwOiBbdGhpcy5zb3VyY2VUb2tlbl0gfV1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzRmxvd1Rva2VuKGl0LmtleSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaW5jbHVkZXNUb2tlbihpdC5zZXAsICduZXdsaW5lJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IGdldEZpcnN0S2V5U3RhcnRQcm9wcyhpdC5zdGFydCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gaXQua2V5O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlcCA9IGl0LnNlcDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXAucHVzaCh0aGlzLnNvdXJjZVRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHR5cGUgZ3VhcmQgaXMgd3JvbmcgaGVyZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBpdC5rZXk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciB0eXBlIGd1YXJkIGlzIHdyb25nIGhlcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgaXQuc2VwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdibG9jay1tYXAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IHRoaXMub2Zmc2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQ6IHRoaXMuaW5kZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtczogW3sgc3RhcnQsIGtleSwgc2VwIH1dXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzdGFydC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90IGFjdHVhbGx5IGF0IG5leHQgaXRlbVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0LnNlcCA9IGl0LnNlcC5jb25jYXQoc3RhcnQsIHRoaXMuc291cmNlVG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQuc2VwLnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWl0LnNlcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oaXQsIHsga2V5OiBudWxsLCBzZXA6IFt0aGlzLnNvdXJjZVRva2VuXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGl0LnZhbHVlIHx8IGF0TmV4dEl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAuaXRlbXMucHVzaCh7IHN0YXJ0LCBrZXk6IG51bGwsIHNlcDogW3RoaXMuc291cmNlVG9rZW5dIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaW5jbHVkZXNUb2tlbihpdC5zZXAsICdtYXAtdmFsdWUtaW5kJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYmxvY2stbWFwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiB0aGlzLm9mZnNldCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50OiB0aGlzLmluZGVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXM6IFt7IHN0YXJ0OiBbXSwga2V5OiBudWxsLCBzZXA6IFt0aGlzLnNvdXJjZVRva2VuXSB9XVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQuc2VwLnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbktleUxpbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgY2FzZSAnYWxpYXMnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ3NjYWxhcic6XG4gICAgICAgICAgICAgICAgY2FzZSAnc2luZ2xlLXF1b3RlZC1zY2FsYXInOlxuICAgICAgICAgICAgICAgIGNhc2UgJ2RvdWJsZS1xdW90ZWQtc2NhbGFyJzoge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmcyA9IHRoaXMuZmxvd1NjYWxhcih0aGlzLnR5cGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYXROZXh0SXRlbSB8fCBpdC52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWFwLml0ZW1zLnB1c2goeyBzdGFydCwga2V5OiBmcywgc2VwOiBbXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25LZXlMaW5lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpdC5zZXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaChmcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGl0LCB7IGtleTogZnMsIHNlcDogW10gfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uS2V5TGluZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJ2ID0gdGhpcy5zdGFydEJsb2NrVmFsdWUobWFwKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJ2KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnYudHlwZSA9PT0gJ2Jsb2NrLXNlcScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWl0LmV4cGxpY2l0S2V5ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0LnNlcCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaW5jbHVkZXNUb2tlbihpdC5zZXAsICduZXdsaW5lJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQqIHRoaXMucG9wKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IHRoaXMub2Zmc2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ1VuZXhwZWN0ZWQgYmxvY2stc2VxLWluZCBvbiBzYW1lIGxpbmUgd2l0aCBrZXknLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiB0aGlzLnNvdXJjZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGF0TWFwSW5kZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwLml0ZW1zLnB1c2goeyBzdGFydCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaChidik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgeWllbGQqIHRoaXMucG9wKCk7XG4gICAgICAgIHlpZWxkKiB0aGlzLnN0ZXAoKTtcbiAgICB9XG4gICAgKmJsb2NrU2VxdWVuY2Uoc2VxKSB7XG4gICAgICAgIGNvbnN0IGl0ID0gc2VxLml0ZW1zW3NlcS5pdGVtcy5sZW5ndGggLSAxXTtcbiAgICAgICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ25ld2xpbmUnOlxuICAgICAgICAgICAgICAgIGlmIChpdC52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQgPSAnZW5kJyBpbiBpdC52YWx1ZSA/IGl0LnZhbHVlLmVuZCA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFzdCA9IEFycmF5LmlzQXJyYXkoZW5kKSA/IGVuZFtlbmQubGVuZ3RoIC0gMV0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsYXN0Py50eXBlID09PSAnY29tbWVudCcpXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmQ/LnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcS5pdGVtcy5wdXNoKHsgc3RhcnQ6IFt0aGlzLnNvdXJjZVRva2VuXSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBpdC5zdGFydC5wdXNoKHRoaXMuc291cmNlVG9rZW4pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGNhc2UgJ3NwYWNlJzpcbiAgICAgICAgICAgIGNhc2UgJ2NvbW1lbnQnOlxuICAgICAgICAgICAgICAgIGlmIChpdC52YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgc2VxLml0ZW1zLnB1c2goeyBzdGFydDogW3RoaXMuc291cmNlVG9rZW5dIH0pO1xuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5hdEluZGVudGVkQ29tbWVudChpdC5zdGFydCwgc2VxLmluZGVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByZXYgPSBzZXEuaXRlbXNbc2VxLml0ZW1zLmxlbmd0aCAtIDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5kID0gcHJldj8udmFsdWU/LmVuZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGVuZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheVB1c2hBcnJheShlbmQsIGl0LnN0YXJ0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQucHVzaCh0aGlzLnNvdXJjZVRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXEuaXRlbXMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGl0LnN0YXJ0LnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGNhc2UgJ2FuY2hvcic6XG4gICAgICAgICAgICBjYXNlICd0YWcnOlxuICAgICAgICAgICAgICAgIGlmIChpdC52YWx1ZSB8fCB0aGlzLmluZGVudCA8PSBzZXEuaW5kZW50KVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBpdC5zdGFydC5wdXNoKHRoaXMuc291cmNlVG9rZW4pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGNhc2UgJ3NlcS1pdGVtLWluZCc6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaW5kZW50ICE9PSBzZXEuaW5kZW50KVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBpZiAoaXQudmFsdWUgfHwgaW5jbHVkZXNUb2tlbihpdC5zdGFydCwgJ3NlcS1pdGVtLWluZCcpKVxuICAgICAgICAgICAgICAgICAgICBzZXEuaXRlbXMucHVzaCh7IHN0YXJ0OiBbdGhpcy5zb3VyY2VUb2tlbl0gfSk7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBpdC5zdGFydC5wdXNoKHRoaXMuc291cmNlVG9rZW4pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pbmRlbnQgPiBzZXEuaW5kZW50KSB7XG4gICAgICAgICAgICBjb25zdCBidiA9IHRoaXMuc3RhcnRCbG9ja1ZhbHVlKHNlcSk7XG4gICAgICAgICAgICBpZiAoYnYpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2goYnYpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB5aWVsZCogdGhpcy5wb3AoKTtcbiAgICAgICAgeWllbGQqIHRoaXMuc3RlcCgpO1xuICAgIH1cbiAgICAqZmxvd0NvbGxlY3Rpb24oZmMpIHtcbiAgICAgICAgY29uc3QgaXQgPSBmYy5pdGVtc1tmYy5pdGVtcy5sZW5ndGggLSAxXTtcbiAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gJ2Zsb3ctZXJyb3ItZW5kJykge1xuICAgICAgICAgICAgbGV0IHRvcDtcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICB5aWVsZCogdGhpcy5wb3AoKTtcbiAgICAgICAgICAgICAgICB0b3AgPSB0aGlzLnBlZWsoMSk7XG4gICAgICAgICAgICB9IHdoaWxlICh0b3A/LnR5cGUgPT09ICdmbG93LWNvbGxlY3Rpb24nKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChmYy5lbmQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2NvbW1hJzpcbiAgICAgICAgICAgICAgICBjYXNlICdleHBsaWNpdC1rZXktaW5kJzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpdCB8fCBpdC5zZXApXG4gICAgICAgICAgICAgICAgICAgICAgICBmYy5pdGVtcy5wdXNoKHsgc3RhcnQ6IFt0aGlzLnNvdXJjZVRva2VuXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgaXQuc3RhcnQucHVzaCh0aGlzLnNvdXJjZVRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGNhc2UgJ21hcC12YWx1ZS1pbmQnOlxuICAgICAgICAgICAgICAgICAgICBpZiAoIWl0IHx8IGl0LnZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgZmMuaXRlbXMucHVzaCh7IHN0YXJ0OiBbXSwga2V5OiBudWxsLCBzZXA6IFt0aGlzLnNvdXJjZVRva2VuXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaXQuc2VwKVxuICAgICAgICAgICAgICAgICAgICAgICAgaXQuc2VwLnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oaXQsIHsga2V5OiBudWxsLCBzZXA6IFt0aGlzLnNvdXJjZVRva2VuXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3NwYWNlJzpcbiAgICAgICAgICAgICAgICBjYXNlICdjb21tZW50JzpcbiAgICAgICAgICAgICAgICBjYXNlICduZXdsaW5lJzpcbiAgICAgICAgICAgICAgICBjYXNlICdhbmNob3InOlxuICAgICAgICAgICAgICAgIGNhc2UgJ3RhZyc6XG4gICAgICAgICAgICAgICAgICAgIGlmICghaXQgfHwgaXQudmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICBmYy5pdGVtcy5wdXNoKHsgc3RhcnQ6IFt0aGlzLnNvdXJjZVRva2VuXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaXQuc2VwKVxuICAgICAgICAgICAgICAgICAgICAgICAgaXQuc2VwLnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0LnN0YXJ0LnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICBjYXNlICdhbGlhcyc6XG4gICAgICAgICAgICAgICAgY2FzZSAnc2NhbGFyJzpcbiAgICAgICAgICAgICAgICBjYXNlICdzaW5nbGUtcXVvdGVkLXNjYWxhcic6XG4gICAgICAgICAgICAgICAgY2FzZSAnZG91YmxlLXF1b3RlZC1zY2FsYXInOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZzID0gdGhpcy5mbG93U2NhbGFyKHRoaXMudHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaXQgfHwgaXQudmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICBmYy5pdGVtcy5wdXNoKHsgc3RhcnQ6IFtdLCBrZXk6IGZzLCBzZXA6IFtdIH0pO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpdC5zZXApXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2goZnMpO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGl0LCB7IGtleTogZnMsIHNlcDogW10gfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSAnZmxvdy1tYXAtZW5kJzpcbiAgICAgICAgICAgICAgICBjYXNlICdmbG93LXNlcS1lbmQnOlxuICAgICAgICAgICAgICAgICAgICBmYy5lbmQucHVzaCh0aGlzLnNvdXJjZVRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYnYgPSB0aGlzLnN0YXJ0QmxvY2tWYWx1ZShmYyk7XG4gICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSBzaG91bGQgbm90IGhhcHBlbiAqL1xuICAgICAgICAgICAgaWYgKGJ2KVxuICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaChidik7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB5aWVsZCogdGhpcy5wb3AoKTtcbiAgICAgICAgICAgICAgICB5aWVsZCogdGhpcy5zdGVwKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnQgPSB0aGlzLnBlZWsoMik7XG4gICAgICAgICAgICBpZiAocGFyZW50LnR5cGUgPT09ICdibG9jay1tYXAnICYmXG4gICAgICAgICAgICAgICAgKCh0aGlzLnR5cGUgPT09ICdtYXAtdmFsdWUtaW5kJyAmJiBwYXJlbnQuaW5kZW50ID09PSBmYy5pbmRlbnQpIHx8XG4gICAgICAgICAgICAgICAgICAgICh0aGlzLnR5cGUgPT09ICduZXdsaW5lJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgIXBhcmVudC5pdGVtc1twYXJlbnQuaXRlbXMubGVuZ3RoIC0gMV0uc2VwKSkpIHtcbiAgICAgICAgICAgICAgICB5aWVsZCogdGhpcy5wb3AoKTtcbiAgICAgICAgICAgICAgICB5aWVsZCogdGhpcy5zdGVwKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLnR5cGUgPT09ICdtYXAtdmFsdWUtaW5kJyAmJlxuICAgICAgICAgICAgICAgIHBhcmVudC50eXBlICE9PSAnZmxvdy1jb2xsZWN0aW9uJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXYgPSBnZXRQcmV2UHJvcHMocGFyZW50KTtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IGdldEZpcnN0S2V5U3RhcnRQcm9wcyhwcmV2KTtcbiAgICAgICAgICAgICAgICBmaXhGbG93U2VxSXRlbXMoZmMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlcCA9IGZjLmVuZC5zcGxpY2UoMSwgZmMuZW5kLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgc2VwLnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgY29uc3QgbWFwID0ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYmxvY2stbWFwJyxcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiBmYy5vZmZzZXQsXG4gICAgICAgICAgICAgICAgICAgIGluZGVudDogZmMuaW5kZW50LFxuICAgICAgICAgICAgICAgICAgICBpdGVtczogW3sgc3RhcnQsIGtleTogZmMsIHNlcCB9XVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdGhpcy5vbktleUxpbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXSA9IG1hcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLmxpbmVFbmQoZmMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGZsb3dTY2FsYXIodHlwZSkge1xuICAgICAgICBpZiAodGhpcy5vbk5ld0xpbmUpIHtcbiAgICAgICAgICAgIGxldCBubCA9IHRoaXMuc291cmNlLmluZGV4T2YoJ1xcbicpICsgMTtcbiAgICAgICAgICAgIHdoaWxlIChubCAhPT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMub25OZXdMaW5lKHRoaXMub2Zmc2V0ICsgbmwpO1xuICAgICAgICAgICAgICAgIG5sID0gdGhpcy5zb3VyY2UuaW5kZXhPZignXFxuJywgbmwpICsgMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgIG9mZnNldDogdGhpcy5vZmZzZXQsXG4gICAgICAgICAgICBpbmRlbnQ6IHRoaXMuaW5kZW50LFxuICAgICAgICAgICAgc291cmNlOiB0aGlzLnNvdXJjZVxuICAgICAgICB9O1xuICAgIH1cbiAgICBzdGFydEJsb2NrVmFsdWUocGFyZW50KSB7XG4gICAgICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdhbGlhcyc6XG4gICAgICAgICAgICBjYXNlICdzY2FsYXInOlxuICAgICAgICAgICAgY2FzZSAnc2luZ2xlLXF1b3RlZC1zY2FsYXInOlxuICAgICAgICAgICAgY2FzZSAnZG91YmxlLXF1b3RlZC1zY2FsYXInOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZsb3dTY2FsYXIodGhpcy50eXBlKTtcbiAgICAgICAgICAgIGNhc2UgJ2Jsb2NrLXNjYWxhci1oZWFkZXInOlxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdibG9jay1zY2FsYXInLFxuICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IHRoaXMub2Zmc2V0LFxuICAgICAgICAgICAgICAgICAgICBpbmRlbnQ6IHRoaXMuaW5kZW50LFxuICAgICAgICAgICAgICAgICAgICBwcm9wczogW3RoaXMuc291cmNlVG9rZW5dLFxuICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICcnXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNhc2UgJ2Zsb3ctbWFwLXN0YXJ0JzpcbiAgICAgICAgICAgIGNhc2UgJ2Zsb3ctc2VxLXN0YXJ0JzpcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZmxvdy1jb2xsZWN0aW9uJyxcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiB0aGlzLm9mZnNldCxcbiAgICAgICAgICAgICAgICAgICAgaW5kZW50OiB0aGlzLmluZGVudCxcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IHRoaXMuc291cmNlVG9rZW4sXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1zOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgZW5kOiBbXVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjYXNlICdzZXEtaXRlbS1pbmQnOlxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdibG9jay1zZXEnLFxuICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IHRoaXMub2Zmc2V0LFxuICAgICAgICAgICAgICAgICAgICBpbmRlbnQ6IHRoaXMuaW5kZW50LFxuICAgICAgICAgICAgICAgICAgICBpdGVtczogW3sgc3RhcnQ6IFt0aGlzLnNvdXJjZVRva2VuXSB9XVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjYXNlICdleHBsaWNpdC1rZXktaW5kJzoge1xuICAgICAgICAgICAgICAgIHRoaXMub25LZXlMaW5lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjb25zdCBwcmV2ID0gZ2V0UHJldlByb3BzKHBhcmVudCk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBnZXRGaXJzdEtleVN0YXJ0UHJvcHMocHJldik7XG4gICAgICAgICAgICAgICAgc3RhcnQucHVzaCh0aGlzLnNvdXJjZVRva2VuKTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYmxvY2stbWFwJyxcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiB0aGlzLm9mZnNldCxcbiAgICAgICAgICAgICAgICAgICAgaW5kZW50OiB0aGlzLmluZGVudCxcbiAgICAgICAgICAgICAgICAgICAgaXRlbXM6IFt7IHN0YXJ0LCBleHBsaWNpdEtleTogdHJ1ZSB9XVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdtYXAtdmFsdWUtaW5kJzoge1xuICAgICAgICAgICAgICAgIHRoaXMub25LZXlMaW5lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjb25zdCBwcmV2ID0gZ2V0UHJldlByb3BzKHBhcmVudCk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBnZXRGaXJzdEtleVN0YXJ0UHJvcHMocHJldik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2Jsb2NrLW1hcCcsXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldDogdGhpcy5vZmZzZXQsXG4gICAgICAgICAgICAgICAgICAgIGluZGVudDogdGhpcy5pbmRlbnQsXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1zOiBbeyBzdGFydCwga2V5OiBudWxsLCBzZXA6IFt0aGlzLnNvdXJjZVRva2VuXSB9XVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGF0SW5kZW50ZWRDb21tZW50KHN0YXJ0LCBpbmRlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZSAhPT0gJ2NvbW1lbnQnKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5pbmRlbnQgPD0gaW5kZW50KVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gc3RhcnQuZXZlcnkoc3QgPT4gc3QudHlwZSA9PT0gJ25ld2xpbmUnIHx8IHN0LnR5cGUgPT09ICdzcGFjZScpO1xuICAgIH1cbiAgICAqZG9jdW1lbnRFbmQoZG9jRW5kKSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgIT09ICdkb2MtbW9kZScpIHtcbiAgICAgICAgICAgIGlmIChkb2NFbmQuZW5kKVxuICAgICAgICAgICAgICAgIGRvY0VuZC5lbmQucHVzaCh0aGlzLnNvdXJjZVRva2VuKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBkb2NFbmQuZW5kID0gW3RoaXMuc291cmNlVG9rZW5dO1xuICAgICAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gJ25ld2xpbmUnKVxuICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnBvcCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgICpsaW5lRW5kKHRva2VuKSB7XG4gICAgICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdjb21tYSc6XG4gICAgICAgICAgICBjYXNlICdkb2Mtc3RhcnQnOlxuICAgICAgICAgICAgY2FzZSAnZG9jLWVuZCc6XG4gICAgICAgICAgICBjYXNlICdmbG93LXNlcS1lbmQnOlxuICAgICAgICAgICAgY2FzZSAnZmxvdy1tYXAtZW5kJzpcbiAgICAgICAgICAgIGNhc2UgJ21hcC12YWx1ZS1pbmQnOlxuICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnBvcCgpO1xuICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnN0ZXAoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ25ld2xpbmUnOlxuICAgICAgICAgICAgICAgIHRoaXMub25LZXlMaW5lID0gZmFsc2U7XG4gICAgICAgICAgICAvLyBmYWxsdGhyb3VnaFxuICAgICAgICAgICAgY2FzZSAnc3BhY2UnOlxuICAgICAgICAgICAgY2FzZSAnY29tbWVudCc6XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIC8vIGFsbCBvdGhlciB2YWx1ZXMgYXJlIGVycm9yc1xuICAgICAgICAgICAgICAgIGlmICh0b2tlbi5lbmQpXG4gICAgICAgICAgICAgICAgICAgIHRva2VuLmVuZC5wdXNoKHRoaXMuc291cmNlVG9rZW4pO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgdG9rZW4uZW5kID0gW3RoaXMuc291cmNlVG9rZW5dO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnR5cGUgPT09ICduZXdsaW5lJylcbiAgICAgICAgICAgICAgICAgICAgeWllbGQqIHRoaXMucG9wKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCB7IFBhcnNlciB9O1xuIiwiaW1wb3J0IHsgQ29tcG9zZXIgfSBmcm9tICcuL2NvbXBvc2UvY29tcG9zZXIuanMnO1xuaW1wb3J0IHsgRG9jdW1lbnQgfSBmcm9tICcuL2RvYy9Eb2N1bWVudC5qcyc7XG5pbXBvcnQgeyBwcmV0dGlmeUVycm9yLCBZQU1MUGFyc2VFcnJvciB9IGZyb20gJy4vZXJyb3JzLmpzJztcbmltcG9ydCB7IHdhcm4gfSBmcm9tICcuL2xvZy5qcyc7XG5pbXBvcnQgeyBpc0RvY3VtZW50IH0gZnJvbSAnLi9ub2Rlcy9pZGVudGl0eS5qcyc7XG5pbXBvcnQgeyBMaW5lQ291bnRlciB9IGZyb20gJy4vcGFyc2UvbGluZS1jb3VudGVyLmpzJztcbmltcG9ydCB7IFBhcnNlciB9IGZyb20gJy4vcGFyc2UvcGFyc2VyLmpzJztcblxuZnVuY3Rpb24gcGFyc2VPcHRpb25zKG9wdGlvbnMpIHtcbiAgICBjb25zdCBwcmV0dHlFcnJvcnMgPSBvcHRpb25zLnByZXR0eUVycm9ycyAhPT0gZmFsc2U7XG4gICAgY29uc3QgbGluZUNvdW50ZXIgPSBvcHRpb25zLmxpbmVDb3VudGVyIHx8IChwcmV0dHlFcnJvcnMgJiYgbmV3IExpbmVDb3VudGVyKCkpIHx8IG51bGw7XG4gICAgcmV0dXJuIHsgbGluZUNvdW50ZXIsIHByZXR0eUVycm9ycyB9O1xufVxuLyoqXG4gKiBQYXJzZSB0aGUgaW5wdXQgYXMgYSBzdHJlYW0gb2YgWUFNTCBkb2N1bWVudHMuXG4gKlxuICogRG9jdW1lbnRzIHNob3VsZCBiZSBzZXBhcmF0ZWQgZnJvbSBlYWNoIG90aGVyIGJ5IGAuLi5gIG9yIGAtLS1gIG1hcmtlciBsaW5lcy5cbiAqXG4gKiBAcmV0dXJucyBJZiBhbiBlbXB0eSBgZG9jc2AgYXJyYXkgaXMgcmV0dXJuZWQsIGl0IHdpbGwgYmUgb2YgdHlwZVxuICogICBFbXB0eVN0cmVhbSBhbmQgY29udGFpbiBhZGRpdGlvbmFsIHN0cmVhbSBpbmZvcm1hdGlvbi4gSW5cbiAqICAgVHlwZVNjcmlwdCwgeW91IHNob3VsZCB1c2UgYCdlbXB0eScgaW4gZG9jc2AgYXMgYSB0eXBlIGd1YXJkIGZvciBpdC5cbiAqL1xuZnVuY3Rpb24gcGFyc2VBbGxEb2N1bWVudHMoc291cmNlLCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCB7IGxpbmVDb3VudGVyLCBwcmV0dHlFcnJvcnMgfSA9IHBhcnNlT3B0aW9ucyhvcHRpb25zKTtcbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgUGFyc2VyKGxpbmVDb3VudGVyPy5hZGROZXdMaW5lKTtcbiAgICBjb25zdCBjb21wb3NlciA9IG5ldyBDb21wb3NlcihvcHRpb25zKTtcbiAgICBjb25zdCBkb2NzID0gQXJyYXkuZnJvbShjb21wb3Nlci5jb21wb3NlKHBhcnNlci5wYXJzZShzb3VyY2UpKSk7XG4gICAgaWYgKHByZXR0eUVycm9ycyAmJiBsaW5lQ291bnRlcilcbiAgICAgICAgZm9yIChjb25zdCBkb2Mgb2YgZG9jcykge1xuICAgICAgICAgICAgZG9jLmVycm9ycy5mb3JFYWNoKHByZXR0aWZ5RXJyb3Ioc291cmNlLCBsaW5lQ291bnRlcikpO1xuICAgICAgICAgICAgZG9jLndhcm5pbmdzLmZvckVhY2gocHJldHRpZnlFcnJvcihzb3VyY2UsIGxpbmVDb3VudGVyKSk7XG4gICAgICAgIH1cbiAgICBpZiAoZG9jcy5sZW5ndGggPiAwKVxuICAgICAgICByZXR1cm4gZG9jcztcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihbXSwgeyBlbXB0eTogdHJ1ZSB9LCBjb21wb3Nlci5zdHJlYW1JbmZvKCkpO1xufVxuLyoqIFBhcnNlIGFuIGlucHV0IHN0cmluZyBpbnRvIGEgc2luZ2xlIFlBTUwuRG9jdW1lbnQgKi9cbmZ1bmN0aW9uIHBhcnNlRG9jdW1lbnQoc291cmNlLCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCB7IGxpbmVDb3VudGVyLCBwcmV0dHlFcnJvcnMgfSA9IHBhcnNlT3B0aW9ucyhvcHRpb25zKTtcbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgUGFyc2VyKGxpbmVDb3VudGVyPy5hZGROZXdMaW5lKTtcbiAgICBjb25zdCBjb21wb3NlciA9IG5ldyBDb21wb3NlcihvcHRpb25zKTtcbiAgICAvLyBgZG9jYCBpcyBhbHdheXMgc2V0IGJ5IGNvbXBvc2UuZW5kKHRydWUpIGF0IHRoZSB2ZXJ5IGxhdGVzdFxuICAgIGxldCBkb2MgPSBudWxsO1xuICAgIGZvciAoY29uc3QgX2RvYyBvZiBjb21wb3Nlci5jb21wb3NlKHBhcnNlci5wYXJzZShzb3VyY2UpLCB0cnVlLCBzb3VyY2UubGVuZ3RoKSkge1xuICAgICAgICBpZiAoIWRvYylcbiAgICAgICAgICAgIGRvYyA9IF9kb2M7XG4gICAgICAgIGVsc2UgaWYgKGRvYy5vcHRpb25zLmxvZ0xldmVsICE9PSAnc2lsZW50Jykge1xuICAgICAgICAgICAgZG9jLmVycm9ycy5wdXNoKG5ldyBZQU1MUGFyc2VFcnJvcihfZG9jLnJhbmdlLnNsaWNlKDAsIDIpLCAnTVVMVElQTEVfRE9DUycsICdTb3VyY2UgY29udGFpbnMgbXVsdGlwbGUgZG9jdW1lbnRzOyBwbGVhc2UgdXNlIFlBTUwucGFyc2VBbGxEb2N1bWVudHMoKScpKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChwcmV0dHlFcnJvcnMgJiYgbGluZUNvdW50ZXIpIHtcbiAgICAgICAgZG9jLmVycm9ycy5mb3JFYWNoKHByZXR0aWZ5RXJyb3Ioc291cmNlLCBsaW5lQ291bnRlcikpO1xuICAgICAgICBkb2Mud2FybmluZ3MuZm9yRWFjaChwcmV0dGlmeUVycm9yKHNvdXJjZSwgbGluZUNvdW50ZXIpKTtcbiAgICB9XG4gICAgcmV0dXJuIGRvYztcbn1cbmZ1bmN0aW9uIHBhcnNlKHNyYywgcmV2aXZlciwgb3B0aW9ucykge1xuICAgIGxldCBfcmV2aXZlciA9IHVuZGVmaW5lZDtcbiAgICBpZiAodHlwZW9mIHJldml2ZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgX3Jldml2ZXIgPSByZXZpdmVyO1xuICAgIH1cbiAgICBlbHNlIGlmIChvcHRpb25zID09PSB1bmRlZmluZWQgJiYgcmV2aXZlciAmJiB0eXBlb2YgcmV2aXZlciA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgb3B0aW9ucyA9IHJldml2ZXI7XG4gICAgfVxuICAgIGNvbnN0IGRvYyA9IHBhcnNlRG9jdW1lbnQoc3JjLCBvcHRpb25zKTtcbiAgICBpZiAoIWRvYylcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgZG9jLndhcm5pbmdzLmZvckVhY2god2FybmluZyA9PiB3YXJuKGRvYy5vcHRpb25zLmxvZ0xldmVsLCB3YXJuaW5nKSk7XG4gICAgaWYgKGRvYy5lcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBpZiAoZG9jLm9wdGlvbnMubG9nTGV2ZWwgIT09ICdzaWxlbnQnKVxuICAgICAgICAgICAgdGhyb3cgZG9jLmVycm9yc1swXTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgZG9jLmVycm9ycyA9IFtdO1xuICAgIH1cbiAgICByZXR1cm4gZG9jLnRvSlMoT2JqZWN0LmFzc2lnbih7IHJldml2ZXI6IF9yZXZpdmVyIH0sIG9wdGlvbnMpKTtcbn1cbmZ1bmN0aW9uIHN0cmluZ2lmeSh2YWx1ZSwgcmVwbGFjZXIsIG9wdGlvbnMpIHtcbiAgICBsZXQgX3JlcGxhY2VyID0gbnVsbDtcbiAgICBpZiAodHlwZW9mIHJlcGxhY2VyID09PSAnZnVuY3Rpb24nIHx8IEFycmF5LmlzQXJyYXkocmVwbGFjZXIpKSB7XG4gICAgICAgIF9yZXBsYWNlciA9IHJlcGxhY2VyO1xuICAgIH1cbiAgICBlbHNlIGlmIChvcHRpb25zID09PSB1bmRlZmluZWQgJiYgcmVwbGFjZXIpIHtcbiAgICAgICAgb3B0aW9ucyA9IHJlcGxhY2VyO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdzdHJpbmcnKVxuICAgICAgICBvcHRpb25zID0gb3B0aW9ucy5sZW5ndGg7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnbnVtYmVyJykge1xuICAgICAgICBjb25zdCBpbmRlbnQgPSBNYXRoLnJvdW5kKG9wdGlvbnMpO1xuICAgICAgICBvcHRpb25zID0gaW5kZW50IDwgMSA/IHVuZGVmaW5lZCA6IGluZGVudCA+IDggPyB7IGluZGVudDogOCB9IDogeyBpbmRlbnQgfTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgeyBrZWVwVW5kZWZpbmVkIH0gPSBvcHRpb25zID8/IHJlcGxhY2VyID8/IHt9O1xuICAgICAgICBpZiAoIWtlZXBVbmRlZmluZWQpXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAoaXNEb2N1bWVudCh2YWx1ZSkgJiYgIV9yZXBsYWNlcilcbiAgICAgICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKG9wdGlvbnMpO1xuICAgIHJldHVybiBuZXcgRG9jdW1lbnQodmFsdWUsIF9yZXBsYWNlciwgb3B0aW9ucykudG9TdHJpbmcob3B0aW9ucyk7XG59XG5cbmV4cG9ydCB7IHBhcnNlLCBwYXJzZUFsbERvY3VtZW50cywgcGFyc2VEb2N1bWVudCwgc3RyaW5naWZ5IH07XG4iLCJleHBvcnQgeyBDb21wb3NlciB9IGZyb20gJy4vY29tcG9zZS9jb21wb3Nlci5qcyc7XG5leHBvcnQgeyBEb2N1bWVudCB9IGZyb20gJy4vZG9jL0RvY3VtZW50LmpzJztcbmV4cG9ydCB7IFNjaGVtYSB9IGZyb20gJy4vc2NoZW1hL1NjaGVtYS5qcyc7XG5leHBvcnQgeyBZQU1MRXJyb3IsIFlBTUxQYXJzZUVycm9yLCBZQU1MV2FybmluZyB9IGZyb20gJy4vZXJyb3JzLmpzJztcbmV4cG9ydCB7IEFsaWFzIH0gZnJvbSAnLi9ub2Rlcy9BbGlhcy5qcyc7XG5leHBvcnQgeyBpc0FsaWFzLCBpc0NvbGxlY3Rpb24sIGlzRG9jdW1lbnQsIGlzTWFwLCBpc05vZGUsIGlzUGFpciwgaXNTY2FsYXIsIGlzU2VxIH0gZnJvbSAnLi9ub2Rlcy9pZGVudGl0eS5qcyc7XG5leHBvcnQgeyBQYWlyIH0gZnJvbSAnLi9ub2Rlcy9QYWlyLmpzJztcbmV4cG9ydCB7IFNjYWxhciB9IGZyb20gJy4vbm9kZXMvU2NhbGFyLmpzJztcbmV4cG9ydCB7IFlBTUxNYXAgfSBmcm9tICcuL25vZGVzL1lBTUxNYXAuanMnO1xuZXhwb3J0IHsgWUFNTFNlcSB9IGZyb20gJy4vbm9kZXMvWUFNTFNlcS5qcyc7XG5pbXBvcnQgKiBhcyBjc3QgZnJvbSAnLi9wYXJzZS9jc3QuanMnO1xuZXhwb3J0IHsgY3N0IGFzIENTVCB9O1xuZXhwb3J0IHsgTGV4ZXIgfSBmcm9tICcuL3BhcnNlL2xleGVyLmpzJztcbmV4cG9ydCB7IExpbmVDb3VudGVyIH0gZnJvbSAnLi9wYXJzZS9saW5lLWNvdW50ZXIuanMnO1xuZXhwb3J0IHsgUGFyc2VyIH0gZnJvbSAnLi9wYXJzZS9wYXJzZXIuanMnO1xuZXhwb3J0IHsgcGFyc2UsIHBhcnNlQWxsRG9jdW1lbnRzLCBwYXJzZURvY3VtZW50LCBzdHJpbmdpZnkgfSBmcm9tICcuL3B1YmxpYy1hcGkuanMnO1xuZXhwb3J0IHsgdmlzaXQsIHZpc2l0QXN5bmMgfSBmcm9tICcuL3Zpc2l0LmpzJztcbiIsIi8vIGBleHBvcnQgKiBhcyBkZWZhdWx0IGZyb20gLi4uYCBmYWlscyBvbiBXZWJwYWNrIHY0XG4vLyBodHRwczovL2dpdGh1Yi5jb20vZWVtZWxpL3lhbWwvaXNzdWVzLzIyOFxuaW1wb3J0ICogYXMgWUFNTCBmcm9tICcuL2Rpc3QvaW5kZXguanMnXG5leHBvcnQgZGVmYXVsdCBZQU1MXG5leHBvcnQgKiBmcm9tICcuL2Rpc3QvaW5kZXguanMnXG4iLCJpbXBvcnQgeyBwYXJzZUFzcGVjdFJhdGlvLCBwYXJzZVJhbmdlU3RyaW5nLCBwYXJzZVRpbWVTdHJpbmcsIHBhcnNlVGltZXNwbGl0cyB9IGZyb20gXCIuL3V0aWxzLm1qc1wiO1xuaW1wb3J0IHsgZW5zdXJlUHJlZml4LCB0b0FycmF5LCB1bmlxIH0gZnJvbSBcIkBhbnRmdS91dGlsc1wiO1xuaW1wb3J0IFlBTUwgZnJvbSBcInlhbWxcIjtcbi8vI3JlZ2lvbiBzcmMvY29uZmlnLnRzXG5jb25zdCBSRV9RVU9URURfU1RSSU5HID0gL14oWydcIl0pLipcXDEkLztcbmNvbnN0IFJFX0ZJTEVOQU1FX1NURU0gPSAvKFteXFxcXC9dKz8pKD86XFwuXFx3Kyk/JC87XG5mdW5jdGlvbiBnZXREZWZhdWx0Q29uZmlnKCkge1xuXHRyZXR1cm4ge1xuXHRcdHRoZW1lOiBcImRlZmF1bHRcIixcblx0XHR0aXRsZTogXCJTbGlkZXZcIixcblx0XHR0aXRsZVRlbXBsYXRlOiBcIiVzIC0gU2xpZGV2XCIsXG5cdFx0YWRkb25zOiBbXSxcblx0XHRyZW1vdGVBc3NldHM6IGZhbHNlLFxuXHRcdG1vbmFjbzogdHJ1ZSxcblx0XHRtb25hY29UeXBlc1NvdXJjZTogXCJsb2NhbFwiLFxuXHRcdG1vbmFjb1R5cGVzQWRkaXRpb25hbFBhY2thZ2VzOiBbXSxcblx0XHRtb25hY29UeXBlc0lnbm9yZVBhY2thZ2VzOiBbXSxcblx0XHRtb25hY29SdW5BZGRpdGlvbmFsRGVwczogW10sXG5cdFx0bW9uYWNvUnVuVXNlU3RyaWN0OiB0cnVlLFxuXHRcdGRvd25sb2FkOiBmYWxzZSxcblx0XHRleHBvcnQ6IHt9LFxuXHRcdGluZm86IGZhbHNlLFxuXHRcdGhpZ2hsaWdodGVyOiBcInNoaWtpXCIsXG5cdFx0dHdvc2xhc2g6IHRydWUsXG5cdFx0bGluZU51bWJlcnM6IGZhbHNlLFxuXHRcdGNvbG9yU2NoZW1hOiBcImF1dG9cIixcblx0XHRyb3V0ZXJNb2RlOiBcImhpc3RvcnlcIixcblx0XHRhc3BlY3RSYXRpbzogMTYgLyA5LFxuXHRcdGNhbnZhc1dpZHRoOiA5ODAsXG5cdFx0ZXhwb3J0RmlsZW5hbWU6IFwiXCIsXG5cdFx0c2VsZWN0YWJsZTogZmFsc2UsXG5cdFx0dGhlbWVDb25maWc6IHt9LFxuXHRcdGZvbnRzOiB7fSxcblx0XHRmYXZpY29uOiBcImh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9naC9zbGlkZXZqcy9zbGlkZXYvYXNzZXRzL2Zhdmljb24ucG5nXCIsXG5cdFx0ZHJhd2luZ3M6IHt9LFxuXHRcdHBsYW50VW1sU2VydmVyOiBcImh0dHBzOi8vd3d3LnBsYW50dW1sLmNvbS9wbGFudHVtbFwiLFxuXHRcdGNvZGVDb3B5OiB0cnVlLFxuXHRcdG1hZ2ljTW92ZUNvcHk6IHRydWUsXG5cdFx0YXV0aG9yOiBcIlwiLFxuXHRcdHJlY29yZDogXCJkZXZcIixcblx0XHRjc3M6IFwidW5vY3NzXCIsXG5cdFx0cHJlc2VudGVyOiB0cnVlLFxuXHRcdGJyb3dzZXJFeHBvcnRlcjogXCJkZXZcIixcblx0XHRodG1sQXR0cnM6IHt9LFxuXHRcdHRyYW5zaXRpb246IG51bGwsXG5cdFx0ZWRpdG9yOiB0cnVlLFxuXHRcdG1jcDogdHJ1ZSxcblx0XHRjb250ZXh0TWVudTogbnVsbCxcblx0XHR3YWtlTG9jazogdHJ1ZSxcblx0XHRwd2E6IGZhbHNlLFxuXHRcdHJlbW90ZTogZmFsc2UsXG5cdFx0bWRjOiBmYWxzZSxcblx0XHRjb21hcms6IGZhbHNlLFxuXHRcdHNlb01ldGE6IHt9LFxuXHRcdG5vdGVzQXV0b1J1Ynk6IHt9LFxuXHRcdGR1cmF0aW9uOiBcIjMwbWluXCIsXG5cdFx0dGltZXI6IFwic3RvcHdhdGNoXCIsXG5cdFx0bWFnaWNNb3ZlRHVyYXRpb246IDgwMCxcblx0XHRzaGlraToge30sXG5cdFx0cHJlbG9hZEltYWdlczogdHJ1ZSxcblx0XHRjbGlja0FuaW1hdGlvbjogXCJcIlxuXHR9O1xufVxuZnVuY3Rpb24gcmVzb2x2ZUNvbmZpZyhoZWFkbWF0dGVyLCB0aGVtZU1ldGEgPSB7fSwgZmlsZXBhdGgsIHZlcmlmeSA9IGZhbHNlKSB7XG5cdGNvbnN0IHRoZW1lSGlnaHRsaWdodGVyID0gW1xuXHRcdFwicHJpc21cIixcblx0XHRcInNoaWtpXCIsXG5cdFx0XCJzaGlraWppXCJcblx0XS5pbmNsdWRlcyh0aGVtZU1ldGEuaGlnaGxpZ2h0ZXIgfHwgXCJcIikgPyB0aGVtZU1ldGEuaGlnaGxpZ2h0ZXIgOiB2b2lkIDA7XG5cdGNvbnN0IHRoZW1lQ29sb3JTY2hlbWEgPSBbXCJsaWdodFwiLCBcImRhcmtcIl0uaW5jbHVkZXModGhlbWVNZXRhLmNvbG9yU2NoZW1hIHx8IFwiXCIpID8gdGhlbWVNZXRhLmNvbG9yU2NoZW1hIDogdm9pZCAwO1xuXHRjb25zdCBkZWZhdWx0Q29uZmlnID0gZ2V0RGVmYXVsdENvbmZpZygpO1xuXHRjb25zdCBjb25maWcgPSB7XG5cdFx0Li4uZGVmYXVsdENvbmZpZyxcblx0XHRoaWdobGlnaHRlcjogdGhlbWVIaWdodGxpZ2h0ZXIgfHwgZGVmYXVsdENvbmZpZy5oaWdobGlnaHRlcixcblx0XHRjb2xvclNjaGVtYTogdGhlbWVDb2xvclNjaGVtYSB8fCBkZWZhdWx0Q29uZmlnLmNvbG9yU2NoZW1hLFxuXHRcdC4uLnRoZW1lTWV0YS5kZWZhdWx0cyxcblx0XHQuLi5oZWFkbWF0dGVyLmNvbmZpZyxcblx0XHQuLi5oZWFkbWF0dGVyLFxuXHRcdGZvbnRzOiByZXNvbHZlRm9udHMoe1xuXHRcdFx0Li4uZGVmYXVsdENvbmZpZy5mb250cyxcblx0XHRcdC4uLnRoZW1lTWV0YS5kZWZhdWx0cz8uZm9udHMsXG5cdFx0XHQuLi5oZWFkbWF0dGVyLmNvbmZpZz8uZm9udHMsXG5cdFx0XHQuLi5oZWFkbWF0dGVyPy5mb250c1xuXHRcdH0pLFxuXHRcdGRyYXdpbmdzOiByZXNvbHZlRHJhd2luZ3Moe1xuXHRcdFx0Li4udGhlbWVNZXRhLmRlZmF1bHRzPy5kcmF3aW5ncyxcblx0XHRcdC4uLmhlYWRtYXR0ZXIuY29uZmlnPy5kcmF3aW5ncyxcblx0XHRcdC4uLmhlYWRtYXR0ZXI/LmRyYXdpbmdzXG5cdFx0fSwgZmlsZXBhdGgpLFxuXHRcdGh0bWxBdHRyczoge1xuXHRcdFx0Li4uZGVmYXVsdENvbmZpZy5odG1sQXR0cnMsXG5cdFx0XHQuLi50aGVtZU1ldGEuZGVmYXVsdHM/Lmh0bWxBdHRycyxcblx0XHRcdC4uLmhlYWRtYXR0ZXIuY29uZmlnPy5odG1sQXR0cnMsXG5cdFx0XHQuLi5oZWFkbWF0dGVyPy5odG1sQXR0cnNcblx0XHR9LFxuXHRcdHRoZW1lQ29uZmlnOiB7XG5cdFx0XHQuLi5kZWZhdWx0Q29uZmlnLnRoZW1lQ29uZmlnLFxuXHRcdFx0Li4udGhlbWVNZXRhLmRlZmF1bHRzPy50aGVtZUNvbmZpZyxcblx0XHRcdC4uLmhlYWRtYXR0ZXIuY29uZmlnPy50aGVtZUNvbmZpZyxcblx0XHRcdC4uLmhlYWRtYXR0ZXI/LnRoZW1lQ29uZmlnXG5cdFx0fVxuXHR9O1xuXHRpZiAoY29uZmlnLmhpZ2hsaWdodGVyID09PSBcInNoaWtpamlcIikge1xuXHRcdGNvbnNvbGUud2FybihgW3NsaWRldl0gXCJzaGlraWppXCIgaXMgbWVyZ2VkIGJhY2sgdG8gXCJzaGlraVwiLCB5b3UgY2FuIHNhZmVseSBjaGFuZ2UgaXQgXCJoaWdobGlnaHRlcjogc2hpa2lcImApO1xuXHRcdGNvbmZpZy5oaWdobGlnaHRlciA9IFwic2hpa2lcIjtcblx0fVxuXHRpZiAoY29uZmlnLmhpZ2hsaWdodGVyID09PSBcInByaXNtXCIpIHRocm93IG5ldyBFcnJvcihgW3NsaWRldl0gXCJwcmlzbVwiIHN1cHBvcnQgaGFzIGJlZW4gZHJvcHBlZC4gUGxlYXNlIHVzZSBcImhpZ2hsaWdodGVyOiBzaGlraVwiIGluc3RlYWRgKTtcblx0aWYgKGNvbmZpZy5jb2xvclNjaGVtYSAhPT0gXCJkYXJrXCIgJiYgY29uZmlnLmNvbG9yU2NoZW1hICE9PSBcImxpZ2h0XCIpIGNvbmZpZy5jb2xvclNjaGVtYSA9IFwiYXV0b1wiO1xuXHRpZiAodGhlbWVDb2xvclNjaGVtYSAmJiBjb25maWcuY29sb3JTY2hlbWEgPT09IFwiYXV0b1wiKSBjb25maWcuY29sb3JTY2hlbWEgPSB0aGVtZUNvbG9yU2NoZW1hO1xuXHRjb25maWcuYXNwZWN0UmF0aW8gPSBwYXJzZUFzcGVjdFJhdGlvKGNvbmZpZy5hc3BlY3RSYXRpbyk7XG5cdGlmICh2ZXJpZnkpIHZlcmlmeUNvbmZpZyhjb25maWcsIHRoZW1lTWV0YSk7XG5cdHJldHVybiBjb25maWc7XG59XG5mdW5jdGlvbiB2ZXJpZnlDb25maWcoY29uZmlnLCB0aGVtZU1ldGEgPSB7fSwgd2FybiA9ICh2KSA9PiBjb25zb2xlLndhcm4oYFtzbGlkZXZdICR7dn1gKSkge1xuXHRjb25zdCB0aGVtZUhpZ2h0bGlnaHRlciA9IHRoZW1lTWV0YS5oaWdobGlnaHRlciA9PT0gXCJzaGlraVwiID8gdGhlbWVNZXRhLmhpZ2hsaWdodGVyIDogdm9pZCAwO1xuXHRjb25zdCB0aGVtZUNvbG9yU2NoZW1hID0gW1wibGlnaHRcIiwgXCJkYXJrXCJdLmluY2x1ZGVzKHRoZW1lTWV0YS5jb2xvclNjaGVtYSB8fCBcIlwiKSA/IHRoZW1lTWV0YS5jb2xvclNjaGVtYSA6IHZvaWQgMDtcblx0aWYgKHRoZW1lQ29sb3JTY2hlbWEgJiYgY29uZmlnLmNvbG9yU2NoZW1hICE9PSB0aGVtZUNvbG9yU2NoZW1hKSB3YXJuKGBDb2xvciBzY2hlbWEgXCIke2NvbmZpZy5jb2xvclNjaGVtYX1cIiBkb2VzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHRoZW1lYCk7XG5cdGlmICh0aGVtZUhpZ2h0bGlnaHRlciAmJiBjb25maWcuaGlnaGxpZ2h0ZXIgIT09IHRoZW1lSGlnaHRsaWdodGVyKSB3YXJuKGBTeW50YXggaGlnaGxpZ2h0ZXIgXCIke2NvbmZpZy5oaWdobGlnaHRlcn1cIiBkb2VzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHRoZW1lYCk7XG5cdGlmIChjb25maWcuY3NzICE9PSBcInVub2Nzc1wiKSB7XG5cdFx0d2FybihgVW5zdXBwb3J0ZWQgQXRvbWljIENTUyBlbmdpbmUgXCIke2NvbmZpZy5jc3N9XCIsIGZhbGxiYWNrIHRvIFVub0NTU2ApO1xuXHRcdGNvbmZpZy5jc3MgPSBcInVub2Nzc1wiO1xuXHR9XG59XG5mdW5jdGlvbiByZXNvbHZlRm9udHMoZm9udHMgPSB7fSkge1xuXHRjb25zdCB7IGZhbGxiYWNrcyA9IHRydWUsIGl0YWxpYyA9IGZhbHNlLCBwcm92aWRlciA9IFwiZ29vZ2xlXCIgfSA9IGZvbnRzO1xuXHRsZXQgc2FucyA9IHRvQXJyYXkoZm9udHMuc2FucykuZmxhdE1hcCgoaSkgPT4gaS5zcGxpdChcIixcIikpLm1hcCgoaSkgPT4gaS50cmltKCkpO1xuXHRsZXQgc2VyaWYgPSB0b0FycmF5KGZvbnRzLnNlcmlmKS5mbGF0TWFwKChpKSA9PiBpLnNwbGl0KFwiLFwiKSkubWFwKChpKSA9PiBpLnRyaW0oKSk7XG5cdGxldCBtb25vID0gdG9BcnJheShmb250cy5tb25vKS5mbGF0TWFwKChpKSA9PiBpLnNwbGl0KFwiLFwiKSkubWFwKChpKSA9PiBpLnRyaW0oKSk7XG5cdGNvbnN0IHdlaWdodHMgPSB0b0FycmF5KGZvbnRzLndlaWdodHMgfHwgXCIyMDAsNDAwLDYwMFwiKS5mbGF0TWFwKChpKSA9PiBpLnRvU3RyaW5nKCkuc3BsaXQoXCIsXCIpKS5tYXAoKGkpID0+IGkudHJpbSgpKTtcblx0Y29uc3QgY3VzdG9tID0gdG9BcnJheShmb250cy5jdXN0b20pLmZsYXRNYXAoKGkpID0+IGkuc3BsaXQoXCIsXCIpKS5tYXAoKGkpID0+IGkudHJpbSgpKTtcblx0Y29uc3QgbG9jYWwgPSB0b0FycmF5KGZvbnRzLmxvY2FsKS5mbGF0TWFwKChpKSA9PiBpLnNwbGl0KFwiLFwiKSkubWFwKChpKSA9PiBpLnRyaW0oKSk7XG5cdGNvbnN0IHdlYmZvbnRzID0gZm9udHMud2ViZm9udHMgPyBmb250cy53ZWJmb250cyA6IGZhbGxiYWNrcyA/IHVuaXEoW1xuXHRcdC4uLnNhbnMsXG5cdFx0Li4uc2VyaWYsXG5cdFx0Li4ubW9ubyxcblx0XHQuLi5jdXN0b21cblx0XSkuZmlsdGVyKChpKSA9PiAhbG9jYWwuaW5jbHVkZXMoaSkpIDogW107XG5cdGZ1bmN0aW9uIHRvUXVvdGVkKGZvbnQpIHtcblx0XHRpZiAoUkVfUVVPVEVEX1NUUklORy50ZXN0KGZvbnQpKSByZXR1cm4gZm9udDtcblx0XHRyZXR1cm4gYFwiJHtmb250fVwiYDtcblx0fVxuXHRpZiAoZmFsbGJhY2tzKSB7XG5cdFx0c2FucyA9IHVuaXEoW1xuXHRcdFx0Li4uc2Fucy5tYXAodG9RdW90ZWQpLFxuXHRcdFx0XCJ1aS1zYW5zLXNlcmlmXCIsXG5cdFx0XHRcInN5c3RlbS11aVwiLFxuXHRcdFx0XCItYXBwbGUtc3lzdGVtXCIsXG5cdFx0XHRcIkJsaW5rTWFjU3lzdGVtRm9udFwiLFxuXHRcdFx0XCJcXFwiU2Vnb2UgVUlcXFwiXCIsXG5cdFx0XHRcIlJvYm90b1wiLFxuXHRcdFx0XCJcXFwiSGVsdmV0aWNhIE5ldWVcXFwiXCIsXG5cdFx0XHRcIkFyaWFsXCIsXG5cdFx0XHRcIlxcXCJOb3RvIFNhbnNcXFwiXCIsXG5cdFx0XHRcInNhbnMtc2VyaWZcIixcblx0XHRcdFwiXFxcIkFwcGxlIENvbG9yIEVtb2ppXFxcIlwiLFxuXHRcdFx0XCJcXFwiU2Vnb2UgVUkgRW1vamlcXFwiXCIsXG5cdFx0XHRcIlxcXCJTZWdvZSBVSSBTeW1ib2xcXFwiXCIsXG5cdFx0XHRcIlxcXCJOb3RvIENvbG9yIEVtb2ppXFxcIlwiXG5cdFx0XSk7XG5cdFx0c2VyaWYgPSB1bmlxKFtcblx0XHRcdC4uLnNlcmlmLm1hcCh0b1F1b3RlZCksXG5cdFx0XHRcInVpLXNlcmlmXCIsXG5cdFx0XHRcIkdlb3JnaWFcIixcblx0XHRcdFwiQ2FtYnJpYVwiLFxuXHRcdFx0XCJcXFwiVGltZXMgTmV3IFJvbWFuXFxcIlwiLFxuXHRcdFx0XCJUaW1lc1wiLFxuXHRcdFx0XCJzZXJpZlwiXG5cdFx0XSk7XG5cdFx0bW9ubyA9IHVuaXEoW1xuXHRcdFx0Li4ubW9uby5tYXAodG9RdW90ZWQpLFxuXHRcdFx0XCJ1aS1tb25vc3BhY2VcIixcblx0XHRcdFwiU0ZNb25vLVJlZ3VsYXJcIixcblx0XHRcdFwiTWVubG9cIixcblx0XHRcdFwiTW9uYWNvXCIsXG5cdFx0XHRcIkNvbnNvbGFzXCIsXG5cdFx0XHRcIlxcXCJMaWJlcmF0aW9uIE1vbm9cXFwiXCIsXG5cdFx0XHRcIlxcXCJDb3VyaWVyIE5ld1xcXCJcIixcblx0XHRcdFwibW9ub3NwYWNlXCJcblx0XHRdKTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdHNhbnMsXG5cdFx0c2VyaWYsXG5cdFx0bW9ubyxcblx0XHR3ZWJmb250cyxcblx0XHRwcm92aWRlcixcblx0XHRsb2NhbCxcblx0XHRpdGFsaWMsXG5cdFx0d2VpZ2h0c1xuXHR9O1xufVxuZnVuY3Rpb24gcmVzb2x2ZURyYXdpbmdzKG9wdGlvbnMgPSB7fSwgZmlsZXBhdGgpIHtcblx0Y29uc3QgeyBlbmFibGVkID0gdHJ1ZSwgcGVyc2lzdCA9IGZhbHNlLCBwcmVzZW50ZXJPbmx5ID0gZmFsc2UsIHN5bmNBbGwgPSB0cnVlIH0gPSBvcHRpb25zO1xuXHRyZXR1cm4ge1xuXHRcdGVuYWJsZWQsXG5cdFx0cGVyc2lzdDogdHlwZW9mIHBlcnNpc3QgPT09IFwic3RyaW5nXCIgPyBwZXJzaXN0IDogcGVyc2lzdCA/IGAuc2xpZGV2L2RyYXdpbmdzJHtmaWxlcGF0aCA/IGAvJHtmaWxlcGF0aC5tYXRjaChSRV9GSUxFTkFNRV9TVEVNKT8uWzFdfWAgOiBcIlwifWAgOiBmYWxzZSxcblx0XHRwcmVzZW50ZXJPbmx5LFxuXHRcdHN5bmNBbGxcblx0fTtcbn1cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNyYy9jb3JlLnRzXG5jb25zdCBSRV9GUk9OVE1BVFRFUiA9IC9eLS0tLipcXHI/XFxuKFtcXHNcXFNdKj8pLS0tLztcbmNvbnN0IFJFX1lBTUxfQ09ERUJMT0NLID0gL15cXHMqYGBgeWE/bWwoW1xcc1xcU10qPylgYGAvO1xuY29uc3QgUkVfRE9MTEFSX0lOTElORSA9IC9cXCQuKj9cXCQvO1xuY29uc3QgUkVfRE9MTEFSX0JMT0NLID0gL1xcJFxcJC87XG5jb25zdCBSRV9NT05BQ09fQkxPQ0sgPSAvXFx7bW9uYWNvLipcXH0vO1xuY29uc3QgUkVfVFdFRVRfVEFHID0gLzxUd2VldFxcYi87XG5jb25zdCBSRV9CTFVFU0tZX1RBRyA9IC88Qmx1ZVNreVxcYi87XG5jb25zdCBSRV9NRVJNQUlEX0NPREVCTE9DSyA9IC9eYGBgbWVybWFpZC9tO1xuY29uc3QgUkVfSEVBRElORyA9IC9eKCMrKSAoLiopJC9tO1xuY29uc3QgUkVfQ09ERV9CTE9DSyA9IC9eYGBgW1xcc1xcU10rP15gYGAvZ207XG5jb25zdCBSRV9MRUFESU5HX0JBQ0tUSUNLUyA9IC9eXFxzKmArLztcbmNvbnN0IFJFX0NSTEYgPSAvXFxyP1xcbi9nO1xuZnVuY3Rpb24gYWR2YW5jZUh0bWxDb21tZW50U3RhdGUobGluZSwgaW5IdG1sQ29tbWVudCkge1xuXHRsZXQgY3Vyc29yID0gMDtcblx0d2hpbGUgKGN1cnNvciA8IGxpbmUubGVuZ3RoKSBpZiAoaW5IdG1sQ29tbWVudCkge1xuXHRcdGNvbnN0IGVuZCA9IGxpbmUuaW5kZXhPZihcIi0tPlwiLCBjdXJzb3IpO1xuXHRcdGlmIChlbmQgPCAwKSByZXR1cm4gdHJ1ZTtcblx0XHRpbkh0bWxDb21tZW50ID0gZmFsc2U7XG5cdFx0Y3Vyc29yID0gZW5kICsgMztcblx0fSBlbHNlIHtcblx0XHRjb25zdCBzdGFydCA9IGxpbmUuaW5kZXhPZihcIjwhLS1cIiwgY3Vyc29yKTtcblx0XHRpZiAoc3RhcnQgPCAwKSByZXR1cm4gZmFsc2U7XG5cdFx0Y29uc3QgZW5kID0gbGluZS5pbmRleE9mKFwiLS0+XCIsIHN0YXJ0ICsgNCk7XG5cdFx0aWYgKGVuZCA8IDApIHJldHVybiB0cnVlO1xuXHRcdGN1cnNvciA9IGVuZCArIDM7XG5cdH1cblx0cmV0dXJuIGluSHRtbENvbW1lbnQ7XG59XG5mdW5jdGlvbiBzdHJpbmdpZnkoZGF0YSkge1xuXHRyZXR1cm4gYCR7ZGF0YS5zbGlkZXMubWFwKHN0cmluZ2lmeVNsaWRlKS5qb2luKFwiXFxuXCIpLnRyaW0oKX1cXG5gO1xufVxuZnVuY3Rpb24gc3RyaW5naWZ5U2xpZGUoZGF0YSwgaWR4ID0gMCkge1xuXHRyZXR1cm4gZGF0YS5yYXcuc3RhcnRzV2l0aChcIi0tLVwiKSB8fCBpZHggPT09IDAgPyBkYXRhLnJhdyA6IGAtLS1cXG4ke2Vuc3VyZVByZWZpeChcIlxcblwiLCBkYXRhLnJhdyl9YDtcbn1cbmZ1bmN0aW9uIHByZXR0aWZ5U2xpZGUoZGF0YSkge1xuXHRkYXRhLmNvbnRlbnQgPSBkYXRhLmNvbnRlbnQudHJpbSgpID8gYFxcbiR7ZGF0YS5jb250ZW50LnRyaW0oKX1cXG5gIDogXCJcIjtcblx0ZGF0YS5yYXcgPSBkYXRhLmZyb250bWF0dGVyRG9jPy5jb250ZW50cyA/IGRhdGEuZnJvbnRtYXR0ZXJTdHlsZSA9PT0gXCJ5YW1sXCIgPyBgXFxgXFxgXFxgeWFtbFxcbiR7ZGF0YS5mcm9udG1hdHRlckRvYy50b1N0cmluZygpLnRyaW0oKX1cXG5cXGBcXGBcXGBcXG4ke2RhdGEuY29udGVudH1gIDogYC0tLVxcbiR7ZGF0YS5mcm9udG1hdHRlckRvYy50b1N0cmluZygpLnRyaW0oKX1cXG4tLS1cXG4ke2RhdGEuY29udGVudH1gIDogZGF0YS5jb250ZW50O1xuXHRpZiAoZGF0YS5ub3RlKSBkYXRhLnJhdyArPSBgXFxuPCEtLVxcbiR7ZGF0YS5ub3RlLnRyaW0oKX1cXG4tLT5cXG5gO1xuXHRyZXR1cm4gZGF0YTtcbn1cbmZ1bmN0aW9uIHByZXR0aWZ5KGRhdGEpIHtcblx0ZGF0YS5zbGlkZXMuZm9yRWFjaChwcmV0dGlmeVNsaWRlKTtcblx0cmV0dXJuIGRhdGE7XG59XG5mdW5jdGlvbiBtYXR0ZXIoY29kZSwgb3B0aW9ucykge1xuXHRsZXQgdHlwZTtcblx0bGV0IHJhdztcblx0bGV0IGNvbnRlbnQgPSBjb2RlLnJlcGxhY2UoUkVfRlJPTlRNQVRURVIsIChfLCBmKSA9PiB7XG5cdFx0dHlwZSA9IFwiZnJvbnRtYXR0ZXJcIjtcblx0XHRyYXcgPSBmO1xuXHRcdHJldHVybiBcIlwiO1xuXHR9KTtcblx0aWYgKHR5cGUgIT09IFwiZnJvbnRtYXR0ZXJcIikgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZShSRV9ZQU1MX0NPREVCTE9DSywgKF8sIGYpID0+IHtcblx0XHR0eXBlID0gXCJ5YW1sXCI7XG5cdFx0cmF3ID0gZjtcblx0XHRyZXR1cm4gXCJcIjtcblx0fSk7XG5cdGNvbnN0IGRvYyA9IHJhdyAmJiAhb3B0aW9ucy5ub1BhcnNlWUFNTCA/IFlBTUwucGFyc2VEb2N1bWVudChyYXcpIDogdm9pZCAwO1xuXHRyZXR1cm4ge1xuXHRcdHR5cGUsXG5cdFx0cmF3LFxuXHRcdGRvYyxcblx0XHRkYXRhOiBkb2M/LnRvSlNPTigpLFxuXHRcdGNvbnRlbnRcblx0fTtcbn1cbmNvbnN0IElNQUdFX0VYVEVOU0lPTlMgPSAvXFwuKD86cG5nfGpwZT9nfGdpZnxzdmd8d2VicHxhdmlmfGljb3xibXB8dGlmZj8pJC9pO1xuY29uc3QgUkVfTURfSU1BR0VfVElUTEUgPSAvXFxzKyg/OlwiW15cIl0qXCJ8J1teJ10qJylcXHMqJC87XG4vKipcbiogU3RyaXAgdGhlIG9wdGlvbmFsIENvbW1vbk1hcmsgdGl0bGUgYW5kIHRoZSBhbmdsZS1icmFja2V0IGZvcm0gZnJvbSBhXG4qIG1hcmtkb3duIGltYWdlIGRlc3RpbmF0aW9uLCBzbyBgIVthXSgveC5wbmcgXCJUaXRsZVwiKWAgeWllbGRzIGAveC5wbmdgLlxuKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZU1hcmtkb3duSW1hZ2VUYXJnZXQodGFyZ2V0KSB7XG5cdGNvbnN0IHVybCA9IHRhcmdldC50cmltKCkucmVwbGFjZShSRV9NRF9JTUFHRV9USVRMRSwgXCJcIikudHJpbSgpO1xuXHRyZXR1cm4gdXJsLnN0YXJ0c1dpdGgoXCI8XCIpICYmIHVybC5lbmRzV2l0aChcIj5cIikgPyB1cmwuc2xpY2UoMSwgLTEpLnRyaW0oKSA6IHVybDtcbn1cbi8qKlxuKiBFeHRyYWN0IGltYWdlIFVSTHMgZnJvbSBzbGlkZSBjb250ZW50IGFuZCBmcm9udG1hdHRlci5cbiogU3RyaXBzIGNvZGUgYmxvY2tzIGZpcnN0IHRvIGF2b2lkIGZhbHNlIHBvc2l0aXZlcy5cbiovXG5mdW5jdGlvbiBleHRyYWN0SW1hZ2VzVXNhZ2UoY29udGVudCwgZnJvbnRtYXR0ZXIpIHtcblx0Y29uc3QgaW1hZ2VzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcblx0Zm9yIChjb25zdCBrZXkgb2YgW1xuXHRcdFwiaW1hZ2VcIixcblx0XHRcImJhY2tncm91bmRJbWFnZVwiLFxuXHRcdFwiYmFja2dyb3VuZFwiXG5cdF0pIHtcblx0XHRjb25zdCB2YWwgPSBmcm9udG1hdHRlcltrZXldO1xuXHRcdGlmICh0eXBlb2YgdmFsID09PSBcInN0cmluZ1wiICYmIHZhbCAmJiAhdmFsLnN0YXJ0c1dpdGgoXCJkYXRhOlwiKSkge1xuXHRcdFx0aWYgKGtleSA9PT0gXCJiYWNrZ3JvdW5kXCIpIHtcblx0XHRcdFx0aWYgKElNQUdFX0VYVEVOU0lPTlMudGVzdCh2YWwpIHx8IHZhbC5zdGFydHNXaXRoKFwiL1wiKSB8fCB2YWwuc3RhcnRzV2l0aChcImh0dHBcIikpIGltYWdlcy5hZGQodmFsKTtcblx0XHRcdH0gZWxzZSBpbWFnZXMuYWRkKHZhbCk7XG5cdFx0fVxuXHR9XG5cdGNvbnN0IHN0cmlwcGVkID0gY29udGVudC5yZXBsYWNlKFJFX0NPREVfQkxPQ0ssIFwiXCIpO1xuXHRmb3IgKGNvbnN0IFssIHRhcmdldF0gb2Ygc3RyaXBwZWQubWF0Y2hBbGwoLyFcXFtbXlxcXV0qXFxdXFwoKFteKV0rKVxcKS9nKSkge1xuXHRcdGNvbnN0IHVybCA9IG5vcm1hbGl6ZU1hcmtkb3duSW1hZ2VUYXJnZXQodGFyZ2V0KTtcblx0XHRpZiAodXJsICYmICF1cmwuc3RhcnRzV2l0aChcImRhdGE6XCIpKSBpbWFnZXMuYWRkKHVybCk7XG5cdH1cblx0Zm9yIChjb25zdCBbLCB1cmxdIG9mIHN0cmlwcGVkLm1hdGNoQWxsKC9cXGIoPzpzcmN8aW1hZ2UpPVtcIiddKFteXCInXSspW1wiJ10vZykpIGlmICh1cmwgJiYgIXVybC5zdGFydHNXaXRoKFwiZGF0YTpcIikgJiYgIXVybC5pbmNsdWRlcyhcInt7XCIpICYmIElNQUdFX0VYVEVOU0lPTlMudGVzdCh1cmwpKSBpbWFnZXMuYWRkKHVybC50cmltKCkpO1xuXHRmb3IgKGNvbnN0IFssIHVybF0gb2Ygc3RyaXBwZWQubWF0Y2hBbGwoLzooPzpzcmN8aW1hZ2UpPVtcIiddJyhbXiddKyknW1wiJ10vZykpIGlmICh1cmwgJiYgIXVybC5zdGFydHNXaXRoKFwiZGF0YTpcIikgJiYgSU1BR0VfRVhURU5TSU9OUy50ZXN0KHVybCkpIGltYWdlcy5hZGQodXJsLnRyaW0oKSk7XG5cdGZvciAoY29uc3QgWywgdXJsXSBvZiBzdHJpcHBlZC5tYXRjaEFsbCgvdXJsXFwoW1wiJ10/KFteXCInKV0rKVtcIiddP1xcKS9nKSkgaWYgKHVybCAmJiAhdXJsLnN0YXJ0c1dpdGgoXCJkYXRhOlwiKSAmJiBJTUFHRV9FWFRFTlNJT05TLnRlc3QodXJsKSkgaW1hZ2VzLmFkZCh1cmwudHJpbSgpKTtcblx0cmV0dXJuIEFycmF5LmZyb20oaW1hZ2VzKTtcbn1cbmZ1bmN0aW9uIGRldGVjdEZlYXR1cmVzKGNvZGUpIHtcblx0cmV0dXJuIHtcblx0XHRrYXRleDogISFjb2RlLm1hdGNoKFJFX0RPTExBUl9JTkxJTkUpIHx8ICEhY29kZS5tYXRjaChSRV9ET0xMQVJfQkxPQ0spLFxuXHRcdG1vbmFjbzogUkVfTU9OQUNPX0JMT0NLLnRlc3QoY29kZSkgPyBzY2FuTW9uYWNvUmVmZXJlbmNlZE1vZHMoY29kZSkgOiBmYWxzZSxcblx0XHR0d2VldDogISFjb2RlLm1hdGNoKFJFX1RXRUVUX1RBRyksXG5cdFx0Ymx1ZXNreTogISFjb2RlLm1hdGNoKFJFX0JMVUVTS1lfVEFHKSxcblx0XHRtZXJtYWlkOiAhIWNvZGUubWF0Y2goUkVfTUVSTUFJRF9DT0RFQkxPQ0spXG5cdH07XG59XG5mdW5jdGlvbiBwYXJzZVNsaWRlKHJhdywgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IG1hdHRlclJlc3VsdCA9IG1hdHRlcihyYXcsIG9wdGlvbnMpO1xuXHRsZXQgbm90ZTtcblx0Y29uc3QgZnJvbnRtYXR0ZXIgPSBtYXR0ZXJSZXN1bHQuZGF0YSB8fCB7fTtcblx0bGV0IGNvbnRlbnQgPSBtYXR0ZXJSZXN1bHQuY29udGVudC50cmltKCk7XG5cdGNvbnN0IHJldmlzaW9uID0gaGFzaChyYXcudHJpbSgpKTtcblx0Y29uc3QgY29tbWVudHMgPSBBcnJheS5mcm9tKGNvbnRlbnQubWF0Y2hBbGwoLzwhLS0oW1xcc1xcU10qPyktLT4vZykpO1xuXHRpZiAoY29tbWVudHMubGVuZ3RoKSB7XG5cdFx0Y29uc3QgbGFzdCA9IGNvbW1lbnRzW2NvbW1lbnRzLmxlbmd0aCAtIDFdO1xuXHRcdGlmIChsYXN0LmluZGV4ICE9PSB2b2lkIDAgJiYgbGFzdC5pbmRleCArIGxhc3RbMF0ubGVuZ3RoID49IGNvbnRlbnQubGVuZ3RoKSB7XG5cdFx0XHRub3RlID0gbGFzdFsxXS50cmltKCk7XG5cdFx0XHRjb250ZW50ID0gY29udGVudC5zbGljZSgwLCBsYXN0LmluZGV4KS50cmltKCk7XG5cdFx0fVxuXHR9XG5cdGxldCB0aXRsZTtcblx0bGV0IGxldmVsO1xuXHRpZiAoZnJvbnRtYXR0ZXIudGl0bGUgfHwgZnJvbnRtYXR0ZXIubmFtZSkgdGl0bGUgPSBmcm9udG1hdHRlci50aXRsZSB8fCBmcm9udG1hdHRlci5uYW1lO1xuXHRlbHNlIHtcblx0XHRjb25zdCBtYXRjaCA9IGNvbnRlbnQucmVwbGFjZShSRV9DT0RFX0JMT0NLLCBcIlwiKS5tYXRjaChSRV9IRUFESU5HKTtcblx0XHR0aXRsZSA9IG1hdGNoPy5bMl0/LnRyaW0oKTtcblx0XHRsZXZlbCA9IG1hdGNoPy5bMV0/Lmxlbmd0aDtcblx0fVxuXHRpZiAoZnJvbnRtYXR0ZXIubGV2ZWwpIGxldmVsID0gZnJvbnRtYXR0ZXIubGV2ZWwgfHwgMTtcblx0Y29uc3QgaW1hZ2VzID0gZXh0cmFjdEltYWdlc1VzYWdlKGNvbnRlbnQsIGZyb250bWF0dGVyKTtcblx0cmV0dXJuIHtcblx0XHRyYXcsXG5cdFx0dGl0bGUsXG5cdFx0bGV2ZWwsXG5cdFx0cmV2aXNpb24sXG5cdFx0Y29udGVudCxcblx0XHRjb250ZW50UmF3OiBjb250ZW50LFxuXHRcdGZyb250bWF0dGVyLFxuXHRcdGZyb250bWF0dGVyU3R5bGU6IG1hdHRlclJlc3VsdC50eXBlLFxuXHRcdGZyb250bWF0dGVyRG9jOiBtYXR0ZXJSZXN1bHQuZG9jLFxuXHRcdGZyb250bWF0dGVyUmF3OiBtYXR0ZXJSZXN1bHQucmF3LFxuXHRcdG5vdGUsXG5cdFx0aW1hZ2VzXG5cdH07XG59XG5hc3luYyBmdW5jdGlvbiBwYXJzZShtYXJrZG93biwgZmlsZXBhdGgsIGV4dGVuc2lvbnMsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCBsaW5lcyA9IG1hcmtkb3duLnNwbGl0KG9wdGlvbnMucHJlc2VydmVDUiA/IFwiXFxuXCIgOiBSRV9DUkxGKTtcblx0Y29uc3Qgc2xpZGVzID0gW107XG5cdGxldCBzdGFydCA9IDA7XG5cdGxldCBjb250ZW50U3RhcnQgPSAwO1xuXHRsZXQgaW5IdG1sQ29tbWVudCA9IGZhbHNlO1xuXHRhc3luYyBmdW5jdGlvbiBzbGljZShlbmQpIHtcblx0XHRpZiAoc3RhcnQgPT09IGVuZCkgcmV0dXJuO1xuXHRcdGNvbnN0IHNsaWRlID0ge1xuXHRcdFx0Li4ucGFyc2VTbGlkZShsaW5lcy5zbGljZShzdGFydCwgZW5kKS5qb2luKFwiXFxuXCIpLCBvcHRpb25zKSxcblx0XHRcdGZpbGVwYXRoLFxuXHRcdFx0aW5kZXg6IHNsaWRlcy5sZW5ndGgsXG5cdFx0XHRzdGFydCxcblx0XHRcdGNvbnRlbnRTdGFydCxcblx0XHRcdGVuZFxuXHRcdH07XG5cdFx0aWYgKGV4dGVuc2lvbnMpIGZvciAoY29uc3QgZSBvZiBleHRlbnNpb25zKSB7XG5cdFx0XHRpZiAoZS50cmFuc2Zvcm1TbGlkZSkge1xuXHRcdFx0XHRjb25zdCBuZXdDb250ZW50ID0gYXdhaXQgZS50cmFuc2Zvcm1TbGlkZShzbGlkZS5jb250ZW50LCBzbGlkZS5mcm9udG1hdHRlcik7XG5cdFx0XHRcdGlmIChuZXdDb250ZW50ICE9PSB2b2lkIDApIHNsaWRlLmNvbnRlbnQgPSBuZXdDb250ZW50O1xuXHRcdFx0XHRpZiAodHlwZW9mIHNsaWRlLmZyb250bWF0dGVyLnRpdGxlID09PSBcInN0cmluZ1wiKSBzbGlkZS50aXRsZSA9IHNsaWRlLmZyb250bWF0dGVyLnRpdGxlO1xuXHRcdFx0XHRpZiAodHlwZW9mIHNsaWRlLmZyb250bWF0dGVyLmxldmVsID09PSBcIm51bWJlclwiKSBzbGlkZS5sZXZlbCA9IHNsaWRlLmZyb250bWF0dGVyLmxldmVsO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGUudHJhbnNmb3JtTm90ZSkge1xuXHRcdFx0XHRjb25zdCBuZXdOb3RlID0gYXdhaXQgZS50cmFuc2Zvcm1Ob3RlKHNsaWRlLm5vdGUsIHNsaWRlLmZyb250bWF0dGVyKTtcblx0XHRcdFx0aWYgKG5ld05vdGUgIT09IHZvaWQgMCkgc2xpZGUubm90ZSA9IG5ld05vdGU7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHNsaWRlcy5wdXNoKHNsaWRlKTtcblx0XHRzdGFydCA9IGVuZCArIDE7XG5cdFx0Y29udGVudFN0YXJ0ID0gZW5kICsgMTtcblx0fVxuXHRpZiAoZXh0ZW5zaW9ucykge1xuXHRcdGZvciAoY29uc3QgZSBvZiBleHRlbnNpb25zKSBpZiAoZS50cmFuc2Zvcm1SYXdMaW5lcykgYXdhaXQgZS50cmFuc2Zvcm1SYXdMaW5lcyhsaW5lcyk7XG5cdH1cblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xuXHRcdGNvbnN0IHJhd0xpbmUgPSBsaW5lc1tpXTtcblx0XHRjb25zdCBsaW5lID0gcmF3TGluZS50cmltRW5kKCk7XG5cdFx0aWYgKGluSHRtbENvbW1lbnQpIHtcblx0XHRcdGluSHRtbENvbW1lbnQgPSBhZHZhbmNlSHRtbENvbW1lbnRTdGF0ZShyYXdMaW5lLCB0cnVlKTtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblx0XHRpZiAobGluZS5zdGFydHNXaXRoKFwiLS0tXCIpKSB7XG5cdFx0XHRhd2FpdCBzbGljZShpKTtcblx0XHRcdGNvbnN0IG5leHQgPSBsaW5lc1tpICsgMV07XG5cdFx0XHRpZiAobGluZVszXSAhPT0gXCItXCIgJiYgbmV4dD8udHJpbSgpKSB7XG5cdFx0XHRcdHN0YXJ0ID0gaTtcblx0XHRcdFx0Zm9yIChpICs9IDE7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykgaWYgKGxpbmVzW2ldLnRyaW1FbmQoKSA9PT0gXCItLS1cIikgYnJlYWs7XG5cdFx0XHRcdGNvbnRlbnRTdGFydCA9IGkgKyAxO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAobGluZS50cmltU3RhcnQoKS5zdGFydHNXaXRoKFwiYGBgXCIpKSB7XG5cdFx0XHRjb25zdCBjb2RlQmxvY2tMZXZlbCA9IGxpbmUubWF0Y2goUkVfTEVBRElOR19CQUNLVElDS1MpWzBdO1xuXHRcdFx0bGV0IGogPSBpICsgMTtcblx0XHRcdGZvciAoOyBqIDwgbGluZXMubGVuZ3RoOyBqKyspIGlmIChsaW5lc1tqXS5zdGFydHNXaXRoKGNvZGVCbG9ja0xldmVsKSkgYnJlYWs7XG5cdFx0XHRpZiAoaiAhPT0gbGluZXMubGVuZ3RoKSBpID0gajtcblx0XHR9IGVsc2UgaW5IdG1sQ29tbWVudCA9IGFkdmFuY2VIdG1sQ29tbWVudFN0YXRlKHJhd0xpbmUsIGZhbHNlKTtcblx0fVxuXHRpZiAoc3RhcnQgPD0gbGluZXMubGVuZ3RoIC0gMSkgYXdhaXQgc2xpY2UobGluZXMubGVuZ3RoKTtcblx0cmV0dXJuIHtcblx0XHRmaWxlcGF0aCxcblx0XHRyYXc6IG1hcmtkb3duLFxuXHRcdHNsaWRlc1xuXHR9O1xufVxuZnVuY3Rpb24gcGFyc2VTeW5jKG1hcmtkb3duLCBmaWxlcGF0aCwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IGxpbmVzID0gbWFya2Rvd24uc3BsaXQob3B0aW9ucy5wcmVzZXJ2ZUNSID8gXCJcXG5cIiA6IFJFX0NSTEYpO1xuXHRjb25zdCBzbGlkZXMgPSBbXTtcblx0bGV0IHN0YXJ0ID0gMDtcblx0bGV0IGNvbnRlbnRTdGFydCA9IDA7XG5cdGxldCBpbkh0bWxDb21tZW50ID0gZmFsc2U7XG5cdGZ1bmN0aW9uIHNsaWNlKGVuZCkge1xuXHRcdGlmIChzdGFydCA9PT0gZW5kKSByZXR1cm47XG5cdFx0Y29uc3Qgc2xpZGUgPSB7XG5cdFx0XHQuLi5wYXJzZVNsaWRlKGxpbmVzLnNsaWNlKHN0YXJ0LCBlbmQpLmpvaW4oXCJcXG5cIiksIG9wdGlvbnMpLFxuXHRcdFx0ZmlsZXBhdGgsXG5cdFx0XHRpbmRleDogc2xpZGVzLmxlbmd0aCxcblx0XHRcdHN0YXJ0LFxuXHRcdFx0Y29udGVudFN0YXJ0LFxuXHRcdFx0ZW5kXG5cdFx0fTtcblx0XHRzbGlkZXMucHVzaChzbGlkZSk7XG5cdFx0c3RhcnQgPSBlbmQgKyAxO1xuXHRcdGNvbnRlbnRTdGFydCA9IGVuZCArIDE7XG5cdH1cblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xuXHRcdGNvbnN0IHJhd0xpbmUgPSBsaW5lc1tpXTtcblx0XHRjb25zdCBsaW5lID0gcmF3TGluZS50cmltRW5kKCk7XG5cdFx0aWYgKGluSHRtbENvbW1lbnQpIHtcblx0XHRcdGluSHRtbENvbW1lbnQgPSBhZHZhbmNlSHRtbENvbW1lbnRTdGF0ZShyYXdMaW5lLCB0cnVlKTtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblx0XHRpZiAobGluZS5zdGFydHNXaXRoKFwiLS0tXCIpKSB7XG5cdFx0XHRzbGljZShpKTtcblx0XHRcdGNvbnN0IG5leHQgPSBsaW5lc1tpICsgMV07XG5cdFx0XHRpZiAobGluZVszXSAhPT0gXCItXCIgJiYgbmV4dD8udHJpbSgpKSB7XG5cdFx0XHRcdHN0YXJ0ID0gaTtcblx0XHRcdFx0Zm9yIChpICs9IDE7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykgaWYgKGxpbmVzW2ldLnRyaW1FbmQoKSA9PT0gXCItLS1cIikgYnJlYWs7XG5cdFx0XHRcdGNvbnRlbnRTdGFydCA9IGkgKyAxO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAobGluZS50cmltU3RhcnQoKS5zdGFydHNXaXRoKFwiYGBgXCIpKSB7XG5cdFx0XHRjb25zdCBjb2RlQmxvY2tMZXZlbCA9IGxpbmUubWF0Y2goUkVfTEVBRElOR19CQUNLVElDS1MpWzBdO1xuXHRcdFx0bGV0IGogPSBpICsgMTtcblx0XHRcdGZvciAoOyBqIDwgbGluZXMubGVuZ3RoOyBqKyspIGlmIChsaW5lc1tqXS5zdGFydHNXaXRoKGNvZGVCbG9ja0xldmVsKSkgYnJlYWs7XG5cdFx0XHRpZiAoaiAhPT0gbGluZXMubGVuZ3RoKSBpID0gajtcblx0XHR9IGVsc2UgaW5IdG1sQ29tbWVudCA9IGFkdmFuY2VIdG1sQ29tbWVudFN0YXRlKHJhd0xpbmUsIGZhbHNlKTtcblx0fVxuXHRpZiAoc3RhcnQgPD0gbGluZXMubGVuZ3RoIC0gMSkgc2xpY2UobGluZXMubGVuZ3RoKTtcblx0cmV0dXJuIHtcblx0XHRmaWxlcGF0aCxcblx0XHRyYXc6IG1hcmtkb3duLFxuXHRcdHNsaWRlc1xuXHR9O1xufVxuZnVuY3Rpb24gc2Nhbk1vbmFjb1JlZmVyZW5jZWRNb2RzKG1kKSB7XG5cdGNvbnN0IHR5cGVzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcblx0Y29uc3QgZGVwcyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG5cdG1kLnJlcGxhY2UoL15gYGAoXFx3KylcXHMqXFx7bW9uYWNvKFtefV0qKVxcfVxccyooXFxTW1xcc1xcU10qPyleYGBgL2dtLCAoZnVsbCwgbGFuZyA9IFwidHNcIiwga2luZCwgY29kZSkgPT4ge1xuXHRcdGxhbmcgPSBsYW5nLnRyaW0oKTtcblx0XHRjb25zdCBpc0RlcCA9IGtpbmQgPT09IFwiLXJ1blwiO1xuXHRcdGlmIChbXG5cdFx0XHRcImpzXCIsXG5cdFx0XHRcImphdmFzY3JpcHRcIixcblx0XHRcdFwidHNcIixcblx0XHRcdFwidHlwZXNjcmlwdFwiXG5cdFx0XS5pbmNsdWRlcyhsYW5nKSkge1xuXHRcdFx0Zm9yIChjb25zdCBbLCAsIHNwZWNpZmllcl0gb2YgY29kZS5tYXRjaEFsbCgvXFxzK2Zyb21cXHMrKFtcIiddKShbLy5cXHdALV0rKVxcMS9nKSkgaWYgKHNwZWNpZmllcikge1xuXHRcdFx0XHRpZiAoIVwiLi9cIi5pbmNsdWRlcyhzcGVjaWZpZXIpKSB0eXBlcy5hZGQoc3BlY2lmaWVyKTtcblx0XHRcdFx0aWYgKGlzRGVwKSBkZXBzLmFkZChzcGVjaWZpZXIpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gXCJcIjtcblx0fSk7XG5cdHJldHVybiB7XG5cdFx0dHlwZXM6IEFycmF5LmZyb20odHlwZXMpLFxuXHRcdGRlcHM6IEFycmF5LmZyb20oZGVwcylcblx0fTtcbn1cbmZ1bmN0aW9uIGhhc2goc3RyKSB7XG5cdGxldCBoYXNoID0gMDtcblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcblx0XHRoYXNoID0gKGhhc2ggPDwgNSkgLSBoYXNoICsgc3RyLmNoYXJDb2RlQXQoaSk7XG5cdFx0aGFzaCB8PSAwO1xuXHR9XG5cdHJldHVybiBoYXNoLnRvU3RyaW5nKDM2KS5zbGljZSgwLCAxMik7XG59XG4vLyNlbmRyZWdpb25cbmV4cG9ydCB7IGRldGVjdEZlYXR1cmVzLCBleHRyYWN0SW1hZ2VzVXNhZ2UsIGdldERlZmF1bHRDb25maWcsIHBhcnNlLCBwYXJzZUFzcGVjdFJhdGlvLCBwYXJzZVJhbmdlU3RyaW5nLCBwYXJzZVNsaWRlLCBwYXJzZVN5bmMsIHBhcnNlVGltZVN0cmluZywgcGFyc2VUaW1lc3BsaXRzLCBwcmV0dGlmeSwgcHJldHRpZnlTbGlkZSwgcmVzb2x2ZUNvbmZpZywgcmVzb2x2ZUZvbnRzLCBzdHJpbmdpZnksIHN0cmluZ2lmeVNsaWRlLCB2ZXJpZnlDb25maWcgfTtcbiIsImxldCBfbGF6eU1hdGNoID0gKCkgPT4geyB2YXIgX19saWJfXz0oKCk9Pnt2YXIgbT1PYmplY3QuZGVmaW5lUHJvcGVydHksVj1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLEc9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMsVD1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LHE9KHIsZSk9Pntmb3IodmFyIG4gaW4gZSltKHIsbix7Z2V0OmVbbl0sZW51bWVyYWJsZTp0cnVlfSk7fSxIPShyLGUsbixhKT0+e2lmKGUmJnR5cGVvZiBlPT1cIm9iamVjdFwifHx0eXBlb2YgZT09XCJmdW5jdGlvblwiKWZvcihsZXQgdCBvZiBHKGUpKSFULmNhbGwocix0KSYmdCE9PW4mJm0ocix0LHtnZXQ6KCk9PmVbdF0sZW51bWVyYWJsZTohKGE9VihlLHQpKXx8YS5lbnVtZXJhYmxlfSk7cmV0dXJuIHJ9LEo9cj0+SChtKHt9LFwiX19lc01vZHVsZVwiLHt2YWx1ZTp0cnVlfSksciksdz17fTtxKHcse2RlZmF1bHQ6KCk9PnJlfSk7dmFyIEE9cj0+QXJyYXkuaXNBcnJheShyKSxkPXI9PnR5cGVvZiByPT1cImZ1bmN0aW9uXCIsUT1yPT5yLmxlbmd0aD09PTAsVz1yPT50eXBlb2Ygcj09XCJudW1iZXJcIixLPXI9PnR5cGVvZiByPT1cIm9iamVjdFwiJiZyIT09bnVsbCxYPXI9PnIgaW5zdGFuY2VvZiBSZWdFeHAsYj1yPT50eXBlb2Ygcj09XCJzdHJpbmdcIixoPXI9PnI9PT12b2lkIDAsWT1yPT57Y29uc3QgZT1uZXcgTWFwO3JldHVybiBuPT57Y29uc3QgYT1lLmdldChuKTtpZihhKXJldHVybiBhO2NvbnN0IHQ9cihuKTtyZXR1cm4gZS5zZXQobix0KSx0fX0scnI9KHIsZSxuPXt9KT0+e2NvbnN0IGE9e2NhY2hlOnt9LGlucHV0OnIsaW5kZXg6MCxpbmRleE1heDowLG9wdGlvbnM6bixvdXRwdXQ6W119O2lmKHYoZSkoYSkmJmEuaW5kZXg9PT1yLmxlbmd0aClyZXR1cm4gYS5vdXRwdXQ7dGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcGFyc2UgYXQgaW5kZXggJHthLmluZGV4TWF4fWApfSxpPShyLGUpPT5BKHIpP2VyKHIsZSk6YihyKT9hcihyLGUpOm5yKHIsZSksZXI9KHIsZSk9Pntjb25zdCBuPXt9O2Zvcihjb25zdCBhIG9mIHIpe2lmKGEubGVuZ3RoIT09MSl0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY2hhcmFjdGVyOiBcIiR7YX1cImApO2NvbnN0IHQ9YS5jaGFyQ29kZUF0KDApO25bdF09dHJ1ZTt9cmV0dXJuIGE9Pntjb25zdCB0PWEuaW5kZXgsbz1hLmlucHV0O2Zvcig7YS5pbmRleDxvLmxlbmd0aCYmby5jaGFyQ29kZUF0KGEuaW5kZXgpaW4gbjspYS5pbmRleCs9MTtjb25zdCB1PWEuaW5kZXg7aWYodT50KXtpZighaChlKSYmIWEub3B0aW9ucy5zaWxlbnQpe2NvbnN0IHM9YS5pbnB1dC5zbGljZSh0LHUpLGM9ZChlKT9lKHMsbyxTdHJpbmcodCkpOmU7aChjKXx8YS5vdXRwdXQucHVzaChjKTt9YS5pbmRleE1heD1NYXRoLm1heChhLmluZGV4TWF4LGEuaW5kZXgpO31yZXR1cm4gIHRydWV9fSxucj0ocixlKT0+e2NvbnN0IG49ci5zb3VyY2UsYT1yLmZsYWdzLnJlcGxhY2UoL3l8JC8sXCJ5XCIpLHQ9bmV3IFJlZ0V4cChuLGEpO3JldHVybiBnKG89Pnt0Lmxhc3RJbmRleD1vLmluZGV4O2NvbnN0IHU9dC5leGVjKG8uaW5wdXQpO2lmKHUpe2lmKCFoKGUpJiYhby5vcHRpb25zLnNpbGVudCl7Y29uc3Qgcz1kKGUpP2UoLi4udSxvLmlucHV0LFN0cmluZyhvLmluZGV4KSk6ZTtoKHMpfHxvLm91dHB1dC5wdXNoKHMpO31yZXR1cm4gby5pbmRleCs9dVswXS5sZW5ndGgsby5pbmRleE1heD1NYXRoLm1heChvLmluZGV4TWF4LG8uaW5kZXgpLHRydWV9ZWxzZSByZXR1cm4gIGZhbHNlfSl9LGFyPShyLGUpPT5uPT57aWYobi5pbnB1dC5zdGFydHNXaXRoKHIsbi5pbmRleCkpe2lmKCFoKGUpJiYhbi5vcHRpb25zLnNpbGVudCl7Y29uc3QgdD1kKGUpP2UocixuLmlucHV0LFN0cmluZyhuLmluZGV4KSk6ZTtoKHQpfHxuLm91dHB1dC5wdXNoKHQpO31yZXR1cm4gbi5pbmRleCs9ci5sZW5ndGgsbi5pbmRleE1heD1NYXRoLm1heChuLmluZGV4TWF4LG4uaW5kZXgpLHRydWV9ZWxzZSByZXR1cm4gIGZhbHNlfSxDPShyLGUsbixhKT0+e2NvbnN0IHQ9dihyKTtyZXR1cm4gZyhfKE0obz0+e2xldCB1PTA7Zm9yKDt1PG47KXtjb25zdCBzPW8uaW5kZXg7aWYoIXQobyl8fCh1Kz0xLG8uaW5kZXg9PT1zKSlicmVha31yZXR1cm4gdT49ZX0pKSl9LHRyPShyLGUpPT5DKHIsMCwxKSxmPShyLGUpPT5DKHIsMCwxLzApLHg9KHIsZSk9Pntjb25zdCBuPXIubWFwKHYpO3JldHVybiBnKF8oTShhPT57Zm9yKGxldCB0PTAsbz1uLmxlbmd0aDt0PG87dCsrKWlmKCFuW3RdKGEpKXJldHVybiAgZmFsc2U7cmV0dXJuICB0cnVlfSkpKX0sbD0ocixlKT0+e2NvbnN0IG49ci5tYXAodik7cmV0dXJuIGcoXyhhPT57Zm9yKGxldCB0PTAsbz1uLmxlbmd0aDt0PG87dCsrKWlmKG5bdF0oYSkpcmV0dXJuICB0cnVlO3JldHVybiAgZmFsc2V9KSl9LE09KHIsZT1mYWxzZSk9Pntjb25zdCBuPXYocik7cmV0dXJuIGE9Pntjb25zdCB0PWEuaW5kZXgsbz1hLm91dHB1dC5sZW5ndGgsdT1uKGEpO3JldHVybiAoIXV8fGUpJiYoYS5pbmRleD10LGEub3V0cHV0Lmxlbmd0aCE9PW8mJihhLm91dHB1dC5sZW5ndGg9bykpLHV9fSxfPShyLGUpPT57Y29uc3Qgbj12KHIpO3JldHVybiBufSxnPSgoKT0+e2xldCByPTA7cmV0dXJuIGU9Pntjb25zdCBuPXYoZSksYT1yKz0xO3JldHVybiB0PT57dmFyIG87aWYodC5vcHRpb25zLm1lbW9pemF0aW9uPT09ZmFsc2UpcmV0dXJuIG4odCk7Y29uc3QgdT10LmluZGV4LHM9KG89dC5jYWNoZSlbYV18fChvW2FdPW5ldyBNYXApLGM9cy5nZXQodSk7aWYoYz09PWZhbHNlKXJldHVybiAgZmFsc2U7aWYoVyhjKSlyZXR1cm4gdC5pbmRleD1jLHRydWU7aWYoYylyZXR1cm4gdC5pbmRleD1jLmluZGV4LGMub3V0cHV0Py5sZW5ndGgmJnQub3V0cHV0LnB1c2goLi4uYy5vdXRwdXQpLHRydWU7e2NvbnN0IFo9dC5vdXRwdXQubGVuZ3RoO2lmKG4odCkpe2NvbnN0IEQ9dC5pbmRleCxVPXQub3V0cHV0Lmxlbmd0aDtpZihVPlope2NvbnN0IGVlPXQub3V0cHV0LnNsaWNlKFosVSk7cy5zZXQodSx7aW5kZXg6RCxvdXRwdXQ6ZWV9KTt9ZWxzZSBzLnNldCh1LEQpO3JldHVybiAgdHJ1ZX1lbHNlIHJldHVybiBzLnNldCh1LGZhbHNlKSxmYWxzZX19fX0pKCksRT1yPT57bGV0IGU7cmV0dXJuIG49PihlfHwoZT12KHIoKSkpLGUobikpfSx2PVkocj0+e2lmKGQocikpcmV0dXJuIFEocik/RShyKTpyO2lmKGIocil8fFgocikpcmV0dXJuIGkocik7aWYoQShyKSlyZXR1cm4geChyKTtpZihLKHIpKXJldHVybiBsKE9iamVjdC52YWx1ZXMocikpO3Rocm93IG5ldyBFcnJvcihcIkludmFsaWQgcnVsZVwiKX0pLFA9XCJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5elwiLGlyPXI9PntsZXQgZT1cIlwiO2Zvcig7cj4wOyl7Y29uc3Qgbj0oci0xKSUyNjtlPVBbbl0rZSxyPU1hdGguZmxvb3IoKHItMSkvMjYpO31yZXR1cm4gZX0sTz1yPT57bGV0IGU9MDtmb3IobGV0IG49MCxhPXIubGVuZ3RoO248YTtuKyspZT1lKjI2K1AuaW5kZXhPZihyW25dKSsxO3JldHVybiBlfSxTPShyLGUpPT57aWYoZTxyKXJldHVybiBTKGUscik7Y29uc3Qgbj1bXTtmb3IoO3I8PWU7KW4ucHVzaChyKyspO3JldHVybiBufSxvcj0ocixlLG4pPT5TKHIsZSkubWFwKGE9PlN0cmluZyhhKS5wYWRTdGFydChuLFwiMFwiKSksUj0ocixlKT0+UyhPKHIpLE8oZSkpLm1hcChpcikscD1yPT5yLHo9cj0+dXIoZT0+cnIoZSxyLHttZW1vaXphdGlvbjpmYWxzZX0pLmpvaW4oXCJcIikpLHVyPXI9Pntjb25zdCBlPXt9O3JldHVybiBuPT5lW25dPz8oZVtuXT1yKG4pKX0sc3I9aSgvXlxcKlxcKlxcL1xcKiQvLFwiLipcIiksY3I9aSgvXlxcKlxcKlxcLyhcXCopPyhbIGEtekEtWjAtOS5fLV0rKSQvLChyLGUsbik9PmAuKiR7ZT9cIlwiOlwiKD86XnwvKVwifSR7bi5yZXBsYWNlQWxsKFwiLlwiLFwiXFxcXC5cIil9YCksbHI9aSgvXlxcKlxcKlxcLyhcXCopPyhbIGEtekEtWjAtOS5fLV0qKVxceyhbIGEtekEtWjAtOS5fLV0rKD86LFsgYS16QS1aMC05Ll8tXSspKilcXH0kLywocixlLG4sYSk9PmAuKiR7ZT9cIlwiOlwiKD86XnwvKVwifSR7bi5yZXBsYWNlQWxsKFwiLlwiLFwiXFxcXC5cIil9KD86JHthLnJlcGxhY2VBbGwoXCIsXCIsXCJ8XCIpLnJlcGxhY2VBbGwoXCIuXCIsXCJcXFxcLlwiKX0pYCkseT1pKC9cXFxcLi8scCkscHI9aSgvWyQuKis/Xigpe31bXFxdXFx8XS8scj0+YFxcXFwke3J9YCksdnI9aSgvLi8scCksaHI9aSgvXig/OiEhKSohKC4qKSQvLChyLGUpPT5gKD8hXiR7TChlKX0kKS4qP2ApLGRyPWkoL14oISEpKy8sXCJcIiksZnI9bChbaHIsZHJdKSx4cj1pKC9cXC8oXFwqXFwqXFwvKSsvLFwiKD86Ly4rL3wvKVwiKSxncj1pKC9eKFxcKlxcKlxcLykrLyxcIig/Ol58LiovKVwiKSxtcj1pKC9cXC8oXFwqXFwqKSQvLFwiKD86Ly4qfCQpXCIpLF9yPWkoL1xcKlxcKi8sXCIuKlwiKSxqPWwoW3hyLGdyLG1yLF9yXSksU3I9aSgvXFwqXFwvKD8hXFwqXFwqXFwvKS8sXCJbXi9dKi9cIikseXI9aSgvXFwqLyxcIlteL10qXCIpLE49bChbU3IseXJdKSxrPWkoXCI/XCIsXCJbXi9dXCIpLCRyPWkoXCJbXCIscCksd3I9aShcIl1cIixwKSxBcj1pKC9bIV5dLyxcIl4vXCIpLGJyPWkoL1thLXpdLVthLXpdfFswLTldLVswLTldL2kscCksQ3I9aSgvWyQuKis/Xigpe31bXFx8XS8scj0+YFxcXFwke3J9YCksTXI9aSgvW15cXF1dLyxwKSxFcj1sKFt5LENyLGJyLE1yXSksQj14KFskcix0cihBciksZihFciksd3JdKSxQcj1pKFwie1wiLFwiKD86XCIpLE9yPWkoXCJ9XCIsXCIpXCIpLFJyPWkoLyhcXGQrKVxcLlxcLihcXGQrKS8sKHIsZSxuKT0+b3IoK2UsK24sTWF0aC5taW4oZS5sZW5ndGgsbi5sZW5ndGgpKS5qb2luKFwifFwiKSksenI9aSgvKFthLXpdKylcXC5cXC4oW2Etel0rKS8sKHIsZSxuKT0+UihlLG4pLmpvaW4oXCJ8XCIpKSxqcj1pKC8oW0EtWl0rKVxcLlxcLihbQS1aXSspLywocixlLG4pPT5SKGUudG9Mb3dlckNhc2UoKSxuLnRvTG93ZXJDYXNlKCkpLmpvaW4oXCJ8XCIpLnRvVXBwZXJDYXNlKCkpLE5yPWwoW1JyLHpyLGpyXSksST14KFtQcixOcixPcl0pLGtyPWkoXCJ7XCIsXCIoPzpcIiksQnI9aShcIn1cIixcIilcIiksSXI9aShcIixcIixcInxcIiksRnI9aSgvWyQuKis/Xigpe1tcXF1cXHxdLyxyPT5gXFxcXCR7cn1gKSxMcj1pKC9bXn1dLyxwKSxacj1FKCgpPT5GKSxEcj1sKFtqLE4sayxCLEksWnIseSxGcixJcixMcl0pLEY9eChba3IsZihEciksQnJdKSxVcj1mKGwoW3NyLGNyLGxyLGZyLGosTixrLEIsSSxGLHkscHIsdnJdKSksVnI9VXIsR3I9eihWciksTD1HcixUcj1pKC9cXFxcLi8scCkscXI9aSgvLi8scCksSHI9aSgvXFwqXFwqXFwqKy8sXCIqXCIpLEpyPWkoLyhbXi97WyghXSlcXCpcXCovLChyLGUpPT5gJHtlfSpgKSxRcj1pKC8oXnwuKVxcKlxcKig/PVteKi8pXFxdfV0pLywocixlKT0+YCR7ZX0qYCksV3I9ZihsKFtUcixIcixKcixRcixxcl0pKSxLcj1XcixYcj16KEtyKSxZcj1YciwkPShyLGUpPT57Y29uc3Qgbj1BcnJheS5pc0FycmF5KHIpP3I6W3JdO2lmKCFuLmxlbmd0aClyZXR1cm4gIGZhbHNlO2NvbnN0IGE9bi5tYXAoJC5jb21waWxlKSx0PW4uZXZlcnkocz0+LyhcXC8oPzpcXCpcXCopP3xcXFtcXC9cXF0pJC8udGVzdChzKSksbz1lLnJlcGxhY2UoL1tcXFxcXFwvXSsvZyxcIi9cIikucmVwbGFjZSgvXFwvJC8sdD9cIi9cIjpcIlwiKTtyZXR1cm4gYS5zb21lKHM9PnMudGVzdChvKSl9OyQuY29tcGlsZT1yPT5uZXcgUmVnRXhwKGBeJHtMKFlyKHIpKX0kYCxcInNcIik7dmFyIHJlPSQ7cmV0dXJuIEoodyl9KSgpO1xuIHJldHVybiBfX2xpYl9fLmRlZmF1bHQgfHwgX19saWJfXzsgfTtcbmxldCBfbWF0Y2g7XG5jb25zdCB6ZXB0b21hdGNoID0gKHBhdGgsIHBhdHRlcm4pID0+IHtcbiAgaWYgKCFfbWF0Y2gpIHtcbiAgICBfbWF0Y2ggPSBfbGF6eU1hdGNoKCk7XG4gICAgX2xhenlNYXRjaCA9IG51bGw7XG4gIH1cbiAgcmV0dXJuIF9tYXRjaChwYXRoLCBwYXR0ZXJuKTtcbn07XG5cbmNvbnN0IF9EUklWRV9MRVRURVJfU1RBUlRfUkUgPSAvXltBLVphLXpdOlxcLy87XG5mdW5jdGlvbiBub3JtYWxpemVXaW5kb3dzUGF0aChpbnB1dCA9IFwiXCIpIHtcbiAgaWYgKCFpbnB1dCkge1xuICAgIHJldHVybiBpbnB1dDtcbiAgfVxuICByZXR1cm4gaW5wdXQucmVwbGFjZSgvXFxcXC9nLCBcIi9cIikucmVwbGFjZShfRFJJVkVfTEVUVEVSX1NUQVJUX1JFLCAocikgPT4gci50b1VwcGVyQ2FzZSgpKTtcbn1cblxuY29uc3QgX1VOQ19SRUdFWCA9IC9eWy9cXFxcXXsyfS87XG5jb25zdCBfSVNfQUJTT0xVVEVfUkUgPSAvXlsvXFxcXF0oPyFbL1xcXFxdKXxeWy9cXFxcXXsyfSg/IVxcLil8XltBLVphLXpdOlsvXFxcXF0vO1xuY29uc3QgX0RSSVZFX0xFVFRFUl9SRSA9IC9eW0EtWmEtel06JC87XG5jb25zdCBfUk9PVF9GT0xERVJfUkUgPSAvXlxcLyhbQS1aYS16XTopPyQvO1xuY29uc3QgX0VYVE5BTUVfUkUgPSAvLihcXC5bXi4vXSt8XFwuKSQvO1xuY29uc3QgX1BBVEhfUk9PVF9SRSA9IC9eWy9cXFxcXXxeW2EtekEtWl06Wy9cXFxcXS87XG5jb25zdCBzZXAgPSBcIi9cIjtcbmNvbnN0IG5vcm1hbGl6ZSA9IGZ1bmN0aW9uKHBhdGgpIHtcbiAgaWYgKHBhdGgubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFwiLlwiO1xuICB9XG4gIHBhdGggPSBub3JtYWxpemVXaW5kb3dzUGF0aChwYXRoKTtcbiAgY29uc3QgaXNVTkNQYXRoID0gcGF0aC5tYXRjaChfVU5DX1JFR0VYKTtcbiAgY29uc3QgaXNQYXRoQWJzb2x1dGUgPSBpc0Fic29sdXRlKHBhdGgpO1xuICBjb25zdCB0cmFpbGluZ1NlcGFyYXRvciA9IHBhdGhbcGF0aC5sZW5ndGggLSAxXSA9PT0gXCIvXCI7XG4gIHBhdGggPSBub3JtYWxpemVTdHJpbmcocGF0aCwgIWlzUGF0aEFic29sdXRlKTtcbiAgaWYgKHBhdGgubGVuZ3RoID09PSAwKSB7XG4gICAgaWYgKGlzUGF0aEFic29sdXRlKSB7XG4gICAgICByZXR1cm4gXCIvXCI7XG4gICAgfVxuICAgIHJldHVybiB0cmFpbGluZ1NlcGFyYXRvciA/IFwiLi9cIiA6IFwiLlwiO1xuICB9XG4gIGlmICh0cmFpbGluZ1NlcGFyYXRvcikge1xuICAgIHBhdGggKz0gXCIvXCI7XG4gIH1cbiAgaWYgKF9EUklWRV9MRVRURVJfUkUudGVzdChwYXRoKSkge1xuICAgIHBhdGggKz0gXCIvXCI7XG4gIH1cbiAgaWYgKGlzVU5DUGF0aCkge1xuICAgIGlmICghaXNQYXRoQWJzb2x1dGUpIHtcbiAgICAgIHJldHVybiBgLy8uLyR7cGF0aH1gO1xuICAgIH1cbiAgICByZXR1cm4gYC8vJHtwYXRofWA7XG4gIH1cbiAgcmV0dXJuIGlzUGF0aEFic29sdXRlICYmICFpc0Fic29sdXRlKHBhdGgpID8gYC8ke3BhdGh9YCA6IHBhdGg7XG59O1xuY29uc3Qgam9pbiA9IGZ1bmN0aW9uKC4uLnNlZ21lbnRzKSB7XG4gIGxldCBwYXRoID0gXCJcIjtcbiAgZm9yIChjb25zdCBzZWcgb2Ygc2VnbWVudHMpIHtcbiAgICBpZiAoIXNlZykge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChwYXRoLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHBhdGhUcmFpbGluZyA9IHBhdGhbcGF0aC5sZW5ndGggLSAxXSA9PT0gXCIvXCI7XG4gICAgICBjb25zdCBzZWdMZWFkaW5nID0gc2VnWzBdID09PSBcIi9cIjtcbiAgICAgIGNvbnN0IGJvdGggPSBwYXRoVHJhaWxpbmcgJiYgc2VnTGVhZGluZztcbiAgICAgIGlmIChib3RoKSB7XG4gICAgICAgIHBhdGggKz0gc2VnLnNsaWNlKDEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGF0aCArPSBwYXRoVHJhaWxpbmcgfHwgc2VnTGVhZGluZyA/IHNlZyA6IGAvJHtzZWd9YDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcGF0aCArPSBzZWc7XG4gICAgfVxuICB9XG4gIHJldHVybiBub3JtYWxpemUocGF0aCk7XG59O1xuZnVuY3Rpb24gY3dkKCkge1xuICBpZiAodHlwZW9mIHByb2Nlc3MgIT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIHByb2Nlc3MuY3dkID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gcHJvY2Vzcy5jd2QoKS5yZXBsYWNlKC9cXFxcL2csIFwiL1wiKTtcbiAgfVxuICByZXR1cm4gXCIvXCI7XG59XG5jb25zdCByZXNvbHZlID0gZnVuY3Rpb24oLi4uYXJndW1lbnRzXykge1xuICBhcmd1bWVudHNfID0gYXJndW1lbnRzXy5tYXAoKGFyZ3VtZW50KSA9PiBub3JtYWxpemVXaW5kb3dzUGF0aChhcmd1bWVudCkpO1xuICBsZXQgcmVzb2x2ZWRQYXRoID0gXCJcIjtcbiAgbGV0IHJlc29sdmVkQWJzb2x1dGUgPSBmYWxzZTtcbiAgZm9yIChsZXQgaW5kZXggPSBhcmd1bWVudHNfLmxlbmd0aCAtIDE7IGluZGV4ID49IC0xICYmICFyZXNvbHZlZEFic29sdXRlOyBpbmRleC0tKSB7XG4gICAgY29uc3QgcGF0aCA9IGluZGV4ID49IDAgPyBhcmd1bWVudHNfW2luZGV4XSA6IGN3ZCgpO1xuICAgIGlmICghcGF0aCB8fCBwYXRoLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHJlc29sdmVkUGF0aCA9IGAke3BhdGh9LyR7cmVzb2x2ZWRQYXRofWA7XG4gICAgcmVzb2x2ZWRBYnNvbHV0ZSA9IGlzQWJzb2x1dGUocGF0aCk7XG4gIH1cbiAgcmVzb2x2ZWRQYXRoID0gbm9ybWFsaXplU3RyaW5nKHJlc29sdmVkUGF0aCwgIXJlc29sdmVkQWJzb2x1dGUpO1xuICBpZiAocmVzb2x2ZWRBYnNvbHV0ZSAmJiAhaXNBYnNvbHV0ZShyZXNvbHZlZFBhdGgpKSB7XG4gICAgcmV0dXJuIGAvJHtyZXNvbHZlZFBhdGh9YDtcbiAgfVxuICByZXR1cm4gcmVzb2x2ZWRQYXRoLmxlbmd0aCA+IDAgPyByZXNvbHZlZFBhdGggOiBcIi5cIjtcbn07XG5mdW5jdGlvbiBub3JtYWxpemVTdHJpbmcocGF0aCwgYWxsb3dBYm92ZVJvb3QpIHtcbiAgbGV0IHJlcyA9IFwiXCI7XG4gIGxldCBsYXN0U2VnbWVudExlbmd0aCA9IDA7XG4gIGxldCBsYXN0U2xhc2ggPSAtMTtcbiAgbGV0IGRvdHMgPSAwO1xuICBsZXQgY2hhciA9IG51bGw7XG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPD0gcGF0aC5sZW5ndGg7ICsraW5kZXgpIHtcbiAgICBpZiAoaW5kZXggPCBwYXRoLmxlbmd0aCkge1xuICAgICAgY2hhciA9IHBhdGhbaW5kZXhdO1xuICAgIH0gZWxzZSBpZiAoY2hhciA9PT0gXCIvXCIpIHtcbiAgICAgIGJyZWFrO1xuICAgIH0gZWxzZSB7XG4gICAgICBjaGFyID0gXCIvXCI7XG4gICAgfVxuICAgIGlmIChjaGFyID09PSBcIi9cIikge1xuICAgICAgaWYgKGxhc3RTbGFzaCA9PT0gaW5kZXggLSAxIHx8IGRvdHMgPT09IDEpIDsgZWxzZSBpZiAoZG90cyA9PT0gMikge1xuICAgICAgICBpZiAocmVzLmxlbmd0aCA8IDIgfHwgbGFzdFNlZ21lbnRMZW5ndGggIT09IDIgfHwgcmVzW3Jlcy5sZW5ndGggLSAxXSAhPT0gXCIuXCIgfHwgcmVzW3Jlcy5sZW5ndGggLSAyXSAhPT0gXCIuXCIpIHtcbiAgICAgICAgICBpZiAocmVzLmxlbmd0aCA+IDIpIHtcbiAgICAgICAgICAgIGNvbnN0IGxhc3RTbGFzaEluZGV4ID0gcmVzLmxhc3RJbmRleE9mKFwiL1wiKTtcbiAgICAgICAgICAgIGlmIChsYXN0U2xhc2hJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgcmVzID0gXCJcIjtcbiAgICAgICAgICAgICAgbGFzdFNlZ21lbnRMZW5ndGggPSAwO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVzID0gcmVzLnNsaWNlKDAsIGxhc3RTbGFzaEluZGV4KTtcbiAgICAgICAgICAgICAgbGFzdFNlZ21lbnRMZW5ndGggPSByZXMubGVuZ3RoIC0gMSAtIHJlcy5sYXN0SW5kZXhPZihcIi9cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsYXN0U2xhc2ggPSBpbmRleDtcbiAgICAgICAgICAgIGRvdHMgPSAwO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfSBlbHNlIGlmIChyZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmVzID0gXCJcIjtcbiAgICAgICAgICAgIGxhc3RTZWdtZW50TGVuZ3RoID0gMDtcbiAgICAgICAgICAgIGxhc3RTbGFzaCA9IGluZGV4O1xuICAgICAgICAgICAgZG90cyA9IDA7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFsbG93QWJvdmVSb290KSB7XG4gICAgICAgICAgcmVzICs9IHJlcy5sZW5ndGggPiAwID8gXCIvLi5cIiA6IFwiLi5cIjtcbiAgICAgICAgICBsYXN0U2VnbWVudExlbmd0aCA9IDI7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChyZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHJlcyArPSBgLyR7cGF0aC5zbGljZShsYXN0U2xhc2ggKyAxLCBpbmRleCl9YDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXMgPSBwYXRoLnNsaWNlKGxhc3RTbGFzaCArIDEsIGluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBsYXN0U2VnbWVudExlbmd0aCA9IGluZGV4IC0gbGFzdFNsYXNoIC0gMTtcbiAgICAgIH1cbiAgICAgIGxhc3RTbGFzaCA9IGluZGV4O1xuICAgICAgZG90cyA9IDA7XG4gICAgfSBlbHNlIGlmIChjaGFyID09PSBcIi5cIiAmJiBkb3RzICE9PSAtMSkge1xuICAgICAgKytkb3RzO1xuICAgIH0gZWxzZSB7XG4gICAgICBkb3RzID0gLTE7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXM7XG59XG5jb25zdCBpc0Fic29sdXRlID0gZnVuY3Rpb24ocCkge1xuICByZXR1cm4gX0lTX0FCU09MVVRFX1JFLnRlc3QocCk7XG59O1xuY29uc3QgdG9OYW1lc3BhY2VkUGF0aCA9IGZ1bmN0aW9uKHApIHtcbiAgcmV0dXJuIG5vcm1hbGl6ZVdpbmRvd3NQYXRoKHApO1xufTtcbmNvbnN0IGV4dG5hbWUgPSBmdW5jdGlvbihwKSB7XG4gIGlmIChwID09PSBcIi4uXCIpIHJldHVybiBcIlwiO1xuICBjb25zdCBtYXRjaCA9IF9FWFROQU1FX1JFLmV4ZWMobm9ybWFsaXplV2luZG93c1BhdGgocCkpO1xuICByZXR1cm4gbWF0Y2ggJiYgbWF0Y2hbMV0gfHwgXCJcIjtcbn07XG5jb25zdCByZWxhdGl2ZSA9IGZ1bmN0aW9uKGZyb20sIHRvKSB7XG4gIGNvbnN0IF9mcm9tID0gcmVzb2x2ZShmcm9tKS5yZXBsYWNlKF9ST09UX0ZPTERFUl9SRSwgXCIkMVwiKS5zcGxpdChcIi9cIik7XG4gIGNvbnN0IF90byA9IHJlc29sdmUodG8pLnJlcGxhY2UoX1JPT1RfRk9MREVSX1JFLCBcIiQxXCIpLnNwbGl0KFwiL1wiKTtcbiAgaWYgKF90b1swXVsxXSA9PT0gXCI6XCIgJiYgX2Zyb21bMF1bMV0gPT09IFwiOlwiICYmIF9mcm9tWzBdICE9PSBfdG9bMF0pIHtcbiAgICByZXR1cm4gX3RvLmpvaW4oXCIvXCIpO1xuICB9XG4gIGNvbnN0IF9mcm9tQ29weSA9IFsuLi5fZnJvbV07XG4gIGZvciAoY29uc3Qgc2VnbWVudCBvZiBfZnJvbUNvcHkpIHtcbiAgICBpZiAoX3RvWzBdICE9PSBzZWdtZW50KSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgX2Zyb20uc2hpZnQoKTtcbiAgICBfdG8uc2hpZnQoKTtcbiAgfVxuICByZXR1cm4gWy4uLl9mcm9tLm1hcCgoKSA9PiBcIi4uXCIpLCAuLi5fdG9dLmpvaW4oXCIvXCIpO1xufTtcbmNvbnN0IGRpcm5hbWUgPSBmdW5jdGlvbihwKSB7XG4gIGNvbnN0IHNlZ21lbnRzID0gbm9ybWFsaXplV2luZG93c1BhdGgocCkucmVwbGFjZSgvXFwvJC8sIFwiXCIpLnNwbGl0KFwiL1wiKS5zbGljZSgwLCAtMSk7XG4gIGlmIChzZWdtZW50cy5sZW5ndGggPT09IDEgJiYgX0RSSVZFX0xFVFRFUl9SRS50ZXN0KHNlZ21lbnRzWzBdKSkge1xuICAgIHNlZ21lbnRzWzBdICs9IFwiL1wiO1xuICB9XG4gIHJldHVybiBzZWdtZW50cy5qb2luKFwiL1wiKSB8fCAoaXNBYnNvbHV0ZShwKSA/IFwiL1wiIDogXCIuXCIpO1xufTtcbmNvbnN0IGZvcm1hdCA9IGZ1bmN0aW9uKHApIHtcbiAgY29uc3QgZXh0ID0gcC5leHQgPyBwLmV4dC5zdGFydHNXaXRoKFwiLlwiKSA/IHAuZXh0IDogYC4ke3AuZXh0fWAgOiBcIlwiO1xuICBjb25zdCBzZWdtZW50cyA9IFtwLnJvb3QsIHAuZGlyLCBwLmJhc2UgPz8gKHAubmFtZSA/PyBcIlwiKSArIGV4dF0uZmlsdGVyKFxuICAgIEJvb2xlYW5cbiAgKTtcbiAgcmV0dXJuIG5vcm1hbGl6ZVdpbmRvd3NQYXRoKFxuICAgIHAucm9vdCA/IHJlc29sdmUoLi4uc2VnbWVudHMpIDogc2VnbWVudHMuam9pbihcIi9cIilcbiAgKTtcbn07XG5jb25zdCBiYXNlbmFtZSA9IGZ1bmN0aW9uKHAsIGV4dGVuc2lvbikge1xuICBjb25zdCBzZWdtZW50cyA9IG5vcm1hbGl6ZVdpbmRvd3NQYXRoKHApLnNwbGl0KFwiL1wiKTtcbiAgbGV0IGxhc3RTZWdtZW50ID0gXCJcIjtcbiAgZm9yIChsZXQgaSA9IHNlZ21lbnRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgY29uc3QgdmFsID0gc2VnbWVudHNbaV07XG4gICAgaWYgKHZhbCkge1xuICAgICAgbGFzdFNlZ21lbnQgPSB2YWw7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGV4dGVuc2lvbiAmJiBsYXN0U2VnbWVudC5lbmRzV2l0aChleHRlbnNpb24pID8gbGFzdFNlZ21lbnQuc2xpY2UoMCwgLWV4dGVuc2lvbi5sZW5ndGgpIDogbGFzdFNlZ21lbnQ7XG59O1xuY29uc3QgcGFyc2UgPSBmdW5jdGlvbihwKSB7XG4gIGNvbnN0IHJvb3QgPSBfUEFUSF9ST09UX1JFLmV4ZWMocCk/LlswXT8ucmVwbGFjZSgvXFxcXC9nLCBcIi9cIikgfHwgXCJcIjtcbiAgY29uc3QgYmFzZSA9IGJhc2VuYW1lKHApO1xuICBjb25zdCBleHRlbnNpb24gPSBleHRuYW1lKGJhc2UpO1xuICByZXR1cm4ge1xuICAgIHJvb3QsXG4gICAgZGlyOiBkaXJuYW1lKHApLFxuICAgIGJhc2UsXG4gICAgZXh0OiBleHRlbnNpb24sXG4gICAgbmFtZTogYmFzZS5zbGljZSgwLCBiYXNlLmxlbmd0aCAtIGV4dGVuc2lvbi5sZW5ndGgpXG4gIH07XG59O1xuY29uc3QgbWF0Y2hlc0dsb2IgPSAocGF0aCwgcGF0dGVybikgPT4ge1xuICByZXR1cm4gemVwdG9tYXRjaChwYXR0ZXJuLCBub3JtYWxpemUocGF0aCkpO1xufTtcblxuY29uc3QgX3BhdGggPSB7XG4gIF9fcHJvdG9fXzogbnVsbCxcbiAgYmFzZW5hbWU6IGJhc2VuYW1lLFxuICBkaXJuYW1lOiBkaXJuYW1lLFxuICBleHRuYW1lOiBleHRuYW1lLFxuICBmb3JtYXQ6IGZvcm1hdCxcbiAgaXNBYnNvbHV0ZTogaXNBYnNvbHV0ZSxcbiAgam9pbjogam9pbixcbiAgbWF0Y2hlc0dsb2I6IG1hdGNoZXNHbG9iLFxuICBub3JtYWxpemU6IG5vcm1hbGl6ZSxcbiAgbm9ybWFsaXplU3RyaW5nOiBub3JtYWxpemVTdHJpbmcsXG4gIHBhcnNlOiBwYXJzZSxcbiAgcmVsYXRpdmU6IHJlbGF0aXZlLFxuICByZXNvbHZlOiByZXNvbHZlLFxuICBzZXA6IHNlcCxcbiAgdG9OYW1lc3BhY2VkUGF0aDogdG9OYW1lc3BhY2VkUGF0aFxufTtcblxuZXhwb3J0IHsgX3BhdGggYXMgXywgbm9ybWFsaXplU3RyaW5nIGFzIGEsIHJlbGF0aXZlIGFzIGIsIGJhc2VuYW1lIGFzIGMsIGRpcm5hbWUgYXMgZCwgZXh0bmFtZSBhcyBlLCBmb3JtYXQgYXMgZiwgbm9ybWFsaXplV2luZG93c1BhdGggYXMgZywgaXNBYnNvbHV0ZSBhcyBpLCBqb2luIGFzIGosIG1hdGNoZXNHbG9iIGFzIG0sIG5vcm1hbGl6ZSBhcyBuLCBwYXJzZSBhcyBwLCByZXNvbHZlIGFzIHIsIHNlcCBhcyBzLCB0b05hbWVzcGFjZWRQYXRoIGFzIHQgfTtcbiIsImltcG9ydCB7IHBhcnNlQXNwZWN0UmF0aW8sIHBhcnNlUmFuZ2VTdHJpbmcsIHBhcnNlVGltZVN0cmluZywgcGFyc2VUaW1lc3BsaXRzIH0gZnJvbSBcIi4vdXRpbHMubWpzXCI7XG5pbXBvcnQgeyBkZXRlY3RGZWF0dXJlcywgZXh0cmFjdEltYWdlc1VzYWdlLCBnZXREZWZhdWx0Q29uZmlnLCBwYXJzZSwgcGFyc2VTbGlkZSwgcGFyc2VTeW5jLCBwcmV0dGlmeSwgcHJldHRpZnlTbGlkZSwgcmVzb2x2ZUNvbmZpZywgcmVzb2x2ZUZvbnRzLCBzdHJpbmdpZnksIHN0cmluZ2lmeVNsaWRlLCB2ZXJpZnlDb25maWcgfSBmcm9tIFwiLi9jb3JlLm1qc1wiO1xuaW1wb3J0IHsgc2xhc2ggfSBmcm9tIFwiQGFudGZ1L3V0aWxzXCI7XG5pbXBvcnQgWUFNTCBmcm9tIFwieWFtbFwiO1xuaW1wb3J0IHsgZXhpc3RzU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgeyByZWFkRmlsZSwgd3JpdGVGaWxlIH0gZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IGRpcm5hbWUsIGlzQWJzb2x1dGUsIHJlbGF0aXZlLCByZXNvbHZlIH0gZnJvbSBcInBhdGhlXCI7XG4vLyNyZWdpb24gc3JjL2ZzLnRzXG4vKipcbiogV2hldGhlciBgZmlsZVBhdGhgIHJlc29sdmVzIGluc2lkZSBhbnkgb2YgYHJvb3RzYCAobm8gYC4uYCBlc2NhcGUpLlxuKiBJbmxpbmVkIGhlcmUgKHJhdGhlciB0aGFuIGltcG9ydGVkIGZyb20gdGhlIGBzbGlkZXZgIHBhY2thZ2UpIGJlY2F1c2VcbiogYEBzbGlkZXYvcGFyc2VyYCBtdXN0IHN0YXkgaW5kZXBlbmRlbnQgb2YgYEBzbGlkZXYvc2xpZGV2YC5cbiovXG5mdW5jdGlvbiBpc1BhdGhJbnNpZGVSb290cyhmaWxlUGF0aCwgcm9vdHMpIHtcblx0cmV0dXJuIHJvb3RzLnNvbWUoKHJvb3QpID0+IHtcblx0XHRjb25zdCByZWwgPSByZWxhdGl2ZShyb290LCBmaWxlUGF0aCk7XG5cdFx0cmV0dXJuIHJlbCA9PT0gXCJcIiB8fCAhIXJlbCAmJiAhcmVsLnN0YXJ0c1dpdGgoXCIuLlwiKSAmJiAhaXNBYnNvbHV0ZShyZWwpO1xuXHR9KTtcbn1cbmNvbnN0IFJFX0ZST05UTUFUVEVSX1NUQVJUID0gL14tLS0oPzpbXi1dLiopPyQvO1xuY29uc3QgUkVfQkxBTktfTElORSA9IC9eXFxzKiQvO1xuY29uc3QgUkVfRlJPTlRNQVRURVJfRU5EID0gL14tLS0kLztcbmNvbnN0IFJFX0NSTEYgPSAvXFxyP1xcbi9nO1xubGV0IHByZXBhcnNlckV4dGVuc2lvbkxvYWRlciA9IG51bGw7XG5mdW5jdGlvbiBpbmplY3RQcmVwYXJzZXJFeHRlbnNpb25Mb2FkZXIoZm4pIHtcblx0cHJlcGFyc2VyRXh0ZW5zaW9uTG9hZGVyID0gZm47XG59XG5hc3luYyBmdW5jdGlvbiBsb2FkKG9wdGlvbnMsIGZpbGVwYXRoLCBzb3VyY2VzID0ge30sIG1vZGUpIHtcblx0Y29uc3QgbG9hZFNvdXJjZSA9IHR5cGVvZiBzb3VyY2VzID09PSBcImZ1bmN0aW9uXCIgPyBzb3VyY2VzIDogYXN5bmMgKHBhdGgpID0+IHNvdXJjZXNbcGF0aF0gPz8gcmVhZEZpbGUocGF0aCwgXCJ1dGYtOFwiKTtcblx0Y29uc3QgbWFya2Rvd24gPSBhd2FpdCBsb2FkU291cmNlKGZpbGVwYXRoKTtcblx0bGV0IGV4dGVuc2lvbnM7XG5cdGlmIChwcmVwYXJzZXJFeHRlbnNpb25Mb2FkZXIpIHtcblx0XHRjb25zdCBsaW5lcyA9IG1hcmtkb3duLnNwbGl0KFJFX0NSTEYpO1xuXHRcdGxldCBobSA9IFwiXCI7XG5cdFx0aWYgKFJFX0ZST05UTUFUVEVSX1NUQVJULnRlc3QobGluZXNbMF0pICYmICFsaW5lc1sxXT8ubWF0Y2goUkVfQkxBTktfTElORSkpIHtcblx0XHRcdGxldCBoRW5kID0gMTtcblx0XHRcdHdoaWxlIChoRW5kIDwgbGluZXMubGVuZ3RoICYmICFSRV9GUk9OVE1BVFRFUl9FTkQudGVzdChsaW5lc1toRW5kXS50cmltRW5kKCkpKSBoRW5kKys7XG5cdFx0XHRobSA9IGxpbmVzLnNsaWNlKDEsIGhFbmQpLmpvaW4oXCJcXG5cIik7XG5cdFx0fVxuXHRcdGNvbnN0IG8gPSBZQU1MLnBhcnNlKGhtKSA/PyB7fTtcblx0XHRleHRlbnNpb25zID0gYXdhaXQgcHJlcGFyc2VyRXh0ZW5zaW9uTG9hZGVyKG9wdGlvbnMucm9vdHMsIG8sIGZpbGVwYXRoLCBtb2RlKTtcblx0fVxuXHRjb25zdCBtYXJrZG93bkZpbGVzID0ge307XG5cdGNvbnN0IHdhdGNoRmlsZXMgPSB7fTtcblx0Y29uc3Qgc2xpZGVzID0gW107XG5cdGFzeW5jIGZ1bmN0aW9uIGxvYWRNYXJrZG93bihwYXRoLCByYW5nZSwgZnJvbnRtYXR0ZXJPdmVycmlkZSwgaW1wb3J0ZXJzKSB7XG5cdFx0bGV0IG1kID0gbWFya2Rvd25GaWxlc1twYXRoXTtcblx0XHRpZiAoIW1kKSB7XG5cdFx0XHRjb25zdCByYXcgPSBhd2FpdCBsb2FkU291cmNlKHBhdGgpO1xuXHRcdFx0bWQgPSBhd2FpdCBwYXJzZShyYXcsIHBhdGgsIGV4dGVuc2lvbnMpO1xuXHRcdFx0bWFya2Rvd25GaWxlc1twYXRoXSA9IG1kO1xuXHRcdFx0d2F0Y2hGaWxlc1twYXRoXSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG5cdFx0fVxuXHRcdGNvbnN0IGRpcmVjdEltcG9ydGVyID0gaW1wb3J0ZXJzPy5hdCgtMSk7XG5cdFx0Zm9yIChjb25zdCBpbmRleCBvZiBwYXJzZVJhbmdlU3RyaW5nKG1kLnNsaWRlcy5sZW5ndGgsIHJhbmdlKSkge1xuXHRcdFx0Y29uc3Qgc3ViU2xpZGUgPSBtZC5zbGlkZXNbaW5kZXggLSAxXTtcblx0XHRcdGlmICghc3ViU2xpZGUpIHtcblx0XHRcdFx0bWQuZXJyb3JzID8/PSBbXTtcblx0XHRcdFx0bWQuZXJyb3JzLnB1c2goe1xuXHRcdFx0XHRcdHJvdzogMCxcblx0XHRcdFx0XHRtZXNzYWdlOiBgU2xpZGUgJHtpbmRleH0gZG9lcyBub3QgZXhpc3QgaW4gXCIke3BhdGh9XCIsIHdoaWNoIGhhcyAke21kLnNsaWRlcy5sZW5ndGh9IHNsaWRlc2Bcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXHRcdFx0dHJ5IHtcblx0XHRcdFx0YXdhaXQgbG9hZFNsaWRlKG1kLCBzdWJTbGlkZSwgZnJvbnRtYXR0ZXJPdmVycmlkZSwgaW1wb3J0ZXJzKTtcblx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0bWQuZXJyb3JzID8/PSBbXTtcblx0XHRcdFx0bWQuZXJyb3JzLnB1c2goe1xuXHRcdFx0XHRcdHJvdzogc3ViU2xpZGUuc3RhcnQsXG5cdFx0XHRcdFx0bWVzc2FnZTogYEVycm9yIHdoZW4gbG9hZGluZyBzbGlkZTogJHtlfWBcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGRpcmVjdEltcG9ydGVyKSAoZGlyZWN0SW1wb3J0ZXIuaW1wb3J0cyA/Pz0gW10pLnB1c2goc3ViU2xpZGUpO1xuXHRcdH1cblx0XHRyZXR1cm4gbWQ7XG5cdH1cblx0YXN5bmMgZnVuY3Rpb24gbG9hZFNsaWRlKG1kLCBzbGlkZSwgZnJvbnRtYXR0ZXJPdmVycmlkZSwgaW1wb3J0Q2hhaW4pIHtcblx0XHRpZiAoc2xpZGUuZnJvbnRtYXR0ZXIuZGlzYWJsZWQgfHwgc2xpZGUuZnJvbnRtYXR0ZXIuaGlkZSkgcmV0dXJuO1xuXHRcdGlmIChzbGlkZS5mcm9udG1hdHRlci5zcmMpIHtcblx0XHRcdGNvbnN0IFtyYXdQYXRoLCByYW5nZVJhd10gPSBzbGlkZS5mcm9udG1hdHRlci5zcmMuc3BsaXQoXCIjXCIpO1xuXHRcdFx0Y29uc3QgcGF0aCA9IHNsYXNoKHJhd1BhdGguc3RhcnRzV2l0aChcIi9cIikgPyByZXNvbHZlKG9wdGlvbnMudXNlclJvb3QsIHJhd1BhdGguc3Vic3RyaW5nKDEpKSA6IHJlc29sdmUoZGlybmFtZShzbGlkZS5maWxlcGF0aCksIHJhd1BhdGgpKTtcblx0XHRcdGZyb250bWF0dGVyT3ZlcnJpZGUgPSB7XG5cdFx0XHRcdC4uLnNsaWRlLmZyb250bWF0dGVyLFxuXHRcdFx0XHQuLi5mcm9udG1hdHRlck92ZXJyaWRlXG5cdFx0XHR9O1xuXHRcdFx0ZGVsZXRlIGZyb250bWF0dGVyT3ZlcnJpZGUuc3JjO1xuXHRcdFx0Y29uc3QgYW5jZXN0b3JQYXRocyA9IG5ldyBTZXQoKGltcG9ydENoYWluID8/IFtdKS5tYXAoKHMpID0+IHMuZmlsZXBhdGgpKTtcblx0XHRcdGlmIChwYXRoID09PSBzbGlkZS5maWxlcGF0aCB8fCBhbmNlc3RvclBhdGhzLmhhcyhwYXRoKSkge1xuXHRcdFx0XHRtZC5lcnJvcnMgPz89IFtdO1xuXHRcdFx0XHRtZC5lcnJvcnMucHVzaCh7XG5cdFx0XHRcdFx0cm93OiBzbGlkZS5zdGFydCxcblx0XHRcdFx0XHRtZXNzYWdlOiBgQ2lyY3VsYXIgaW1wb3J0IGRldGVjdGVkIGZvciBcIiR7c2xpZGUuZnJvbnRtYXR0ZXIuc3JjfVwiICgke3BhdGh9KWBcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGlmIChvcHRpb25zLmFsbG93ZWRSb290cyAmJiAhaXNQYXRoSW5zaWRlUm9vdHMocGF0aCwgb3B0aW9ucy5hbGxvd2VkUm9vdHMpKSB7XG5cdFx0XHRcdG1kLmVycm9ycyA/Pz0gW107XG5cdFx0XHRcdG1kLmVycm9ycy5wdXNoKHtcblx0XHRcdFx0XHRyb3c6IHNsaWRlLnN0YXJ0LFxuXHRcdFx0XHRcdG1lc3NhZ2U6IGBJbXBvcnRlZCBtYXJrZG93biBlc2NhcGVzIHRoZSBwcm9qZWN0IHJvb3Q6ICR7cGF0aH1gXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSBlbHNlIGlmICghZXhpc3RzU3luYyhwYXRoKSkge1xuXHRcdFx0XHRtZC5lcnJvcnMgPz89IFtdO1xuXHRcdFx0XHRtZC5lcnJvcnMucHVzaCh7XG5cdFx0XHRcdFx0cm93OiBzbGlkZS5zdGFydCxcblx0XHRcdFx0XHRtZXNzYWdlOiBgSW1wb3J0ZWQgbWFya2Rvd24gZmlsZSBub3QgZm91bmQ6ICR7cGF0aH1gXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSBlbHNlIGF3YWl0IGxvYWRNYXJrZG93bihwYXRoLCByYW5nZVJhdywgZnJvbnRtYXR0ZXJPdmVycmlkZSwgaW1wb3J0Q2hhaW4gPyBbLi4uaW1wb3J0Q2hhaW4sIHNsaWRlXSA6IFtzbGlkZV0pO1xuXHRcdH0gZWxzZSBzbGlkZXMucHVzaCh7XG5cdFx0XHRmcm9udG1hdHRlcjoge1xuXHRcdFx0XHQuLi5zbGlkZS5mcm9udG1hdHRlcixcblx0XHRcdFx0Li4uZnJvbnRtYXR0ZXJPdmVycmlkZVxuXHRcdFx0fSxcblx0XHRcdGNvbnRlbnQ6IHNsaWRlLmNvbnRlbnQsXG5cdFx0XHRyZXZpc2lvbjogc2xpZGUucmV2aXNpb24sXG5cdFx0XHRmcm9udG1hdHRlclJhdzogc2xpZGUuZnJvbnRtYXR0ZXJSYXcsXG5cdFx0XHRub3RlOiBzbGlkZS5ub3RlLFxuXHRcdFx0dGl0bGU6IHNsaWRlLnRpdGxlLFxuXHRcdFx0bGV2ZWw6IHNsaWRlLmxldmVsLFxuXHRcdFx0aW5kZXg6IHNsaWRlcy5sZW5ndGgsXG5cdFx0XHRpbXBvcnRDaGFpbixcblx0XHRcdHNvdXJjZTogc2xpZGVcblx0XHR9KTtcblx0fVxuXHRjb25zdCBlbnRyeSA9IGF3YWl0IGxvYWRNYXJrZG93bihzbGFzaChmaWxlcGF0aCkpO1xuXHRjb25zdCBoZWFkbWF0dGVyID0geyAuLi5lbnRyeS5zbGlkZXNbMF0/LmZyb250bWF0dGVyIH07XG5cdGlmIChzbGlkZXNbMF0/LnRpdGxlKSBoZWFkbWF0dGVyLnRpdGxlID8/PSBzbGlkZXNbMF0udGl0bGU7XG5cdHJldHVybiB7XG5cdFx0c2xpZGVzLFxuXHRcdGVudHJ5LFxuXHRcdGhlYWRtYXR0ZXIsXG5cdFx0ZmVhdHVyZXM6IGRldGVjdEZlYXR1cmVzKHNsaWRlcy5tYXAoKHMpID0+IHMuc291cmNlLnJhdykuam9pbihcIlwiKSksXG5cdFx0bWFya2Rvd25GaWxlcyxcblx0XHR3YXRjaEZpbGVzXG5cdH07XG59XG5hc3luYyBmdW5jdGlvbiBzYXZlKG1hcmtkb3duKSB7XG5cdGNvbnN0IGZpbGVDb250ZW50ID0gc3RyaW5naWZ5KG1hcmtkb3duKTtcblx0YXdhaXQgd3JpdGVGaWxlKG1hcmtkb3duLmZpbGVwYXRoLCBmaWxlQ29udGVudCwgXCJ1dGYtOFwiKTtcblx0cmV0dXJuIGZpbGVDb250ZW50O1xufVxuLy8jZW5kcmVnaW9uXG5leHBvcnQgeyBkZXRlY3RGZWF0dXJlcywgZXh0cmFjdEltYWdlc1VzYWdlLCBnZXREZWZhdWx0Q29uZmlnLCBpbmplY3RQcmVwYXJzZXJFeHRlbnNpb25Mb2FkZXIsIGlzUGF0aEluc2lkZVJvb3RzLCBsb2FkLCBwYXJzZSwgcGFyc2VBc3BlY3RSYXRpbywgcGFyc2VSYW5nZVN0cmluZywgcGFyc2VTbGlkZSwgcGFyc2VTeW5jLCBwYXJzZVRpbWVTdHJpbmcsIHBhcnNlVGltZXNwbGl0cywgcHJldHRpZnksIHByZXR0aWZ5U2xpZGUsIHJlc29sdmVDb25maWcsIHJlc29sdmVGb250cywgc2F2ZSwgc3RyaW5naWZ5LCBzdHJpbmdpZnlTbGlkZSwgdmVyaWZ5Q29uZmlnIH07XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8vIE5vdGVzOiBBZGQgbmV3IE5vZGUgdHlwZXNcbi8vIDEuIEFkZCBuZXcgTm9kZSB0eXBlIHRvIEFTVE5vZGVUeXBlc1xuLy8gMi4gVXBkYXRlIHR4dG5vZGUubWRcbi8vIDMuIEFkZCB0ZXN0IHRvIHBhY2thZ2VzL0B0ZXh0bGludC90eXBlcy90ZXN0L1J1bGUvVHh0Tm9kZS10ZXN0LnRzXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkFTVE5vZGVUeXBlcyA9IHZvaWQgMDtcbi8qKlxuICogQVNUTm9kZVR5cGVzIGlzIGEgbGlzdCBvZiBBU1ROb2RlIHR5cGUuXG4gKi9cbnZhciBBU1ROb2RlVHlwZXM7XG4oZnVuY3Rpb24gKEFTVE5vZGVUeXBlcykge1xuICAgIEFTVE5vZGVUeXBlc1tcIkRvY3VtZW50XCJdID0gXCJEb2N1bWVudFwiO1xuICAgIEFTVE5vZGVUeXBlc1tcIkRvY3VtZW50RXhpdFwiXSA9IFwiRG9jdW1lbnQ6ZXhpdFwiO1xuICAgIEFTVE5vZGVUeXBlc1tcIlBhcmFncmFwaFwiXSA9IFwiUGFyYWdyYXBoXCI7XG4gICAgQVNUTm9kZVR5cGVzW1wiUGFyYWdyYXBoRXhpdFwiXSA9IFwiUGFyYWdyYXBoOmV4aXRcIjtcbiAgICBBU1ROb2RlVHlwZXNbXCJCbG9ja1F1b3RlXCJdID0gXCJCbG9ja1F1b3RlXCI7XG4gICAgQVNUTm9kZVR5cGVzW1wiQmxvY2tRdW90ZUV4aXRcIl0gPSBcIkJsb2NrUXVvdGU6ZXhpdFwiO1xuICAgIEFTVE5vZGVUeXBlc1tcIkxpc3RJdGVtXCJdID0gXCJMaXN0SXRlbVwiO1xuICAgIEFTVE5vZGVUeXBlc1tcIkxpc3RJdGVtRXhpdFwiXSA9IFwiTGlzdEl0ZW06ZXhpdFwiO1xuICAgIEFTVE5vZGVUeXBlc1tcIkxpc3RcIl0gPSBcIkxpc3RcIjtcbiAgICBBU1ROb2RlVHlwZXNbXCJMaXN0RXhpdFwiXSA9IFwiTGlzdDpleGl0XCI7XG4gICAgQVNUTm9kZVR5cGVzW1wiSGVhZGVyXCJdID0gXCJIZWFkZXJcIjtcbiAgICBBU1ROb2RlVHlwZXNbXCJIZWFkZXJFeGl0XCJdID0gXCJIZWFkZXI6ZXhpdFwiO1xuICAgIEFTVE5vZGVUeXBlc1tcIkNvZGVCbG9ja1wiXSA9IFwiQ29kZUJsb2NrXCI7XG4gICAgQVNUTm9kZVR5cGVzW1wiQ29kZUJsb2NrRXhpdFwiXSA9IFwiQ29kZUJsb2NrOmV4aXRcIjtcbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCB1c2UgSHRtbCBpbnN0ZWFkIG9mIGl0XG4gICAgICovXG4gICAgQVNUTm9kZVR5cGVzW1wiSHRtbEJsb2NrXCJdID0gXCJIdG1sQmxvY2tcIjtcbiAgICBBU1ROb2RlVHlwZXNbXCJIdG1sQmxvY2tFeGl0XCJdID0gXCJIdG1sQmxvY2s6ZXhpdFwiO1xuICAgIEFTVE5vZGVUeXBlc1tcIkhvcml6b250YWxSdWxlXCJdID0gXCJIb3Jpem9udGFsUnVsZVwiO1xuICAgIEFTVE5vZGVUeXBlc1tcIkhvcml6b250YWxSdWxlRXhpdFwiXSA9IFwiSG9yaXpvbnRhbFJ1bGU6ZXhpdFwiO1xuICAgIEFTVE5vZGVUeXBlc1tcIkNvbW1lbnRcIl0gPSBcIkNvbW1lbnRcIjtcbiAgICBBU1ROb2RlVHlwZXNbXCJDb21tZW50RXhpdFwiXSA9IFwiQ29tbWVudDpleGl0XCI7XG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBBU1ROb2RlVHlwZXNbXCJSZWZlcmVuY2VEZWZcIl0gPSBcIlJlZmVyZW5jZURlZlwiO1xuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgQVNUTm9kZVR5cGVzW1wiUmVmZXJlbmNlRGVmRXhpdFwiXSA9IFwiUmVmZXJlbmNlRGVmOmV4aXRcIjtcbiAgICAvLyBpbmxpbmVcbiAgICBBU1ROb2RlVHlwZXNbXCJTdHJcIl0gPSBcIlN0clwiO1xuICAgIEFTVE5vZGVUeXBlc1tcIlN0ckV4aXRcIl0gPSBcIlN0cjpleGl0XCI7XG4gICAgQVNUTm9kZVR5cGVzW1wiQnJlYWtcIl0gPSBcIkJyZWFrXCI7XG4gICAgQVNUTm9kZVR5cGVzW1wiQnJlYWtFeGl0XCJdID0gXCJCcmVhazpleGl0XCI7XG4gICAgQVNUTm9kZVR5cGVzW1wiRW1waGFzaXNcIl0gPSBcIkVtcGhhc2lzXCI7XG4gICAgQVNUTm9kZVR5cGVzW1wiRW1waGFzaXNFeGl0XCJdID0gXCJFbXBoYXNpczpleGl0XCI7XG4gICAgQVNUTm9kZVR5cGVzW1wiU3Ryb25nXCJdID0gXCJTdHJvbmdcIjtcbiAgICBBU1ROb2RlVHlwZXNbXCJTdHJvbmdFeGl0XCJdID0gXCJTdHJvbmc6ZXhpdFwiO1xuICAgIEFTVE5vZGVUeXBlc1tcIkh0bWxcIl0gPSBcIkh0bWxcIjtcbiAgICBBU1ROb2RlVHlwZXNbXCJIdG1sRXhpdFwiXSA9IFwiSHRtbDpleGl0XCI7XG4gICAgQVNUTm9kZVR5cGVzW1wiTGlua1wiXSA9IFwiTGlua1wiO1xuICAgIEFTVE5vZGVUeXBlc1tcIkxpbmtFeGl0XCJdID0gXCJMaW5rOmV4aXRcIjtcbiAgICBBU1ROb2RlVHlwZXNbXCJMaW5rUmVmZXJlbmNlXCJdID0gXCJMaW5rUmVmZXJlbmNlXCI7XG4gICAgQVNUTm9kZVR5cGVzW1wiTGlua1JlZmVyZW5jZUV4aXRcIl0gPSBcIkxpbmtSZWZlcmVuY2U6ZXhpdFwiO1xuICAgIEFTVE5vZGVUeXBlc1tcIkltYWdlXCJdID0gXCJJbWFnZVwiO1xuICAgIEFTVE5vZGVUeXBlc1tcIkltYWdlRXhpdFwiXSA9IFwiSW1hZ2U6ZXhpdFwiO1xuICAgIEFTVE5vZGVUeXBlc1tcIkltYWdlUmVmZXJlbmNlXCJdID0gXCJJbWFnZVJlZmVyZW5jZVwiO1xuICAgIEFTVE5vZGVUeXBlc1tcIkltYWdlUmVmZXJlbmNlRXhpdFwiXSA9IFwiSW1hZ2VSZWZlcmVuY2U6ZXhpdFwiO1xuICAgIEFTVE5vZGVUeXBlc1tcIkRlZmluaXRpb25cIl0gPSBcIkRlZmluaXRpb25cIjtcbiAgICBBU1ROb2RlVHlwZXNbXCJEZWZpbml0aW9uRXhpdFwiXSA9IFwiRGVmaW5pdGlvbjpleGl0XCI7XG4gICAgQVNUTm9kZVR5cGVzW1wiQ29kZVwiXSA9IFwiQ29kZVwiO1xuICAgIEFTVE5vZGVUeXBlc1tcIkNvZGVFeGl0XCJdID0gXCJDb2RlOmV4aXRcIjtcbiAgICBBU1ROb2RlVHlwZXNbXCJEZWxldGVcIl0gPSBcIkRlbGV0ZVwiO1xuICAgIEFTVE5vZGVUeXBlc1tcIkRlbGV0ZUV4aXRcIl0gPSBcIkRlbGV0ZTpleGl0XCI7XG4gICAgLy8gVGFibGUgaXMgc3VwcG9ydGVkIGluIHRleHRsaW50IHYxMytcbiAgICBBU1ROb2RlVHlwZXNbXCJUYWJsZVwiXSA9IFwiVGFibGVcIjtcbiAgICBBU1ROb2RlVHlwZXNbXCJUYWJsZUV4aXRcIl0gPSBcIlRhYmxlOmV4aXRcIjtcbiAgICBBU1ROb2RlVHlwZXNbXCJUYWJsZVJvd1wiXSA9IFwiVGFibGVSb3dcIjtcbiAgICBBU1ROb2RlVHlwZXNbXCJUYWJsZVJvd0V4aXRcIl0gPSBcIlRhYmxlUm93OmV4aXRcIjtcbiAgICBBU1ROb2RlVHlwZXNbXCJUYWJsZUNlbGxcIl0gPSBcIlRhYmxlQ2VsbFwiO1xuICAgIEFTVE5vZGVUeXBlc1tcIlRhYmxlQ2VsbEV4aXRcIl0gPSBcIlRhYmxlQ2VsbDpleGl0XCI7XG59KShBU1ROb2RlVHlwZXMgfHwgKGV4cG9ydHMuQVNUTm9kZVR5cGVzID0gQVNUTm9kZVR5cGVzID0ge30pKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFTVE5vZGVUeXBlcy5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuQVNUTm9kZVR5cGVzID0gdm9pZCAwO1xudmFyIEFTVE5vZGVUeXBlc19qc18xID0gcmVxdWlyZShcIi4vQVNUTm9kZVR5cGVzLmpzXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQVNUTm9kZVR5cGVzXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBBU1ROb2RlVHlwZXNfanNfMS5BU1ROb2RlVHlwZXM7IH0gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBhc3Rfbm9kZV90eXBlc18xID0gcmVxdWlyZShcIkB0ZXh0bGludC9hc3Qtbm9kZS10eXBlc1wiKTtcbi8qKlxuICogUnVsZUhlbHBlciBpcyBoZWxwZXIgY2xhc3MgZm9yIHRleHRsaW50LlxuICogQGNsYXNzIFJ1bGVIZWxwZXJcbiAqL1xudmFyIFJ1bGVIZWxwZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZSBSdWxlSGVscGVyIHdpdGggUnVsZUNvbnRleHQgb2JqZWN0LlxuICAgICAqIEBwYXJhbSBydWxlQ29udGV4dCB0aGUgcnVsZUNvbnRleHQgaXMgY29udGV4dCBvYmplY3Qgb2YgdGhlIHJ1bGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gUnVsZUhlbHBlcihydWxlQ29udGV4dCkge1xuICAgICAgICB0aGlzLl9ydWxlQ29udGV4dCA9IHJ1bGVDb250ZXh0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgcGFyZW50cyBvZiBub2RlLlxuICAgICAqIFRoZSBwYXJlbnQgbm9kZXMgYXJlIHJldHVybmVkIGluIG9yZGVyIGZyb20gdGhlIGNsb3Nlc3QgcGFyZW50IHRvIHRoZSBvdXRlciBvbmVzLlxuICAgICAqIHtAbGluayBub2RlfSBpcyBub3QgY29udGFpbmVkIGluIHRoZSByZXN1bHRzLlxuICAgICAqIEBwYXJhbSB7VHh0Tm9kZX0gbm9kZSB0aGUgbm9kZSBpcyBzdGFydCBwb2ludC5cbiAgICAgKi9cbiAgICBSdWxlSGVscGVyLnByb3RvdHlwZS5nZXRQYXJlbnRzID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgICB2YXIgcGFyZW50ID0gbm9kZS5wYXJlbnQ7XG4gICAgICAgIHdoaWxlIChwYXJlbnQgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2gocGFyZW50KTtcbiAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybiB0cnVlIGlmIGBub2RlYCBpcyB3cmFwcGVkIGFueSBvbmUgb2Ygbm9kZSB7QGxpbmsgdHlwZXN9LlxuICAgICAqIEBwYXJhbSB7VHh0Tm9kZX0gbm9kZSBpcyB0YXJnZXQgbm9kZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IHR5cGVzIGFyZSB3cmFwcGVkIHRhcmdldCBub2RlXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgUnVsZUhlbHBlci5wcm90b3R5cGUuaXNDaGlsZE5vZGUgPSBmdW5jdGlvbiAobm9kZSwgdHlwZXMpIHtcbiAgICAgICAgdmFyIHBhcmVudHMgPSB0aGlzLmdldFBhcmVudHMobm9kZSk7XG4gICAgICAgIHZhciBwYXJlbnRzVHlwZXMgPSBwYXJlbnRzLm1hcChmdW5jdGlvbiAocGFyZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyZW50LnR5cGU7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdHlwZXMuc29tZShmdW5jdGlvbiAodHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuIHBhcmVudHNUeXBlcy5zb21lKGZ1bmN0aW9uIChwYXJlbnRUeXBlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcmVudFR5cGUgPT09IHR5cGU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgbm9kZSBpcyBTdHIgbm9kZSBhbmQgZmlsbCBmb2xsb3dpbmcgY29uZGl0aW9uc1xuICAgICAqXG4gICAgICogLSB0aGUgbm9kZSBpcyBTdHIgbm9kZVxuICAgICAqIC0gdGhlIG5vZGUgaXMgdW5kZXIgdGhlIFBhcmFncmFwaCBub2RlXG4gICAgICogLSB0aGUgbm9kZSBpcyBub3QgdW5kZXIgdGhlIEJsb2NrUXVvdGVcbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZnVsIGZvciBjb21tb24gdXNlLWNhc2UuXG4gICAgICogSWYgeW91IHdhbnQgdG8gbGludCBTdHIgbm9kZSwgYnV0IHlvdSBub3Qgd2FudCB0byBsaW50IHN0eWxlZCBub2RlLCB0aGlzIGZ1bmN0aW9uIGlzIHVzZWZ1bC5cbiAgICAgKiBzdHlsZWQgbm9kZSBpcyBMaW5rLCBTdHJvbmcsIEJsb2NrUXVvdGUsIEhlYWRlciBldGMuLi5cbiAgICAgKiBPcHBvc2l0ZSBvZiBpdCwgcGxhaW4gc3RyIG5vZGUgaXMganVzdCB1bmRlciB0aGUgUGFyYWdyYXBoIG5vZGUuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogUmV0dXJuIHRydWVcbiAgICAgKlxuICAgICAqIC0tLVxuICAgICAqIHN0ciBzdHIgc3RyXG4gICAgICogLSBsaXN0IHRleHRcbiAgICAgKiAtLS1cbiAgICAgKlxuICAgICAqIFJldHVybiBmYWxzZVxuICAgICAqXG4gICAgICogLS0tLVxuICAgICAqICMgSGVhZGVyXG4gICAgICogIVthbHQgdGV4dF0oaHR0cHM6Ly9leGFtcGxlLmNvbSlcbiAgICAgKiBbbGluayB0aXRsZV0oaHR0cHM6Ly9leGFtcGxlLmNvbSlcbiAgICAgKiA+IEJsb2NrUXVvdGVcbiAgICAgKiAqKlN0cm9uZyoqXG4gICAgICogW15mb290bm90ZV06IHRleHQgdGV4dFxuICAgICAqIC0tLS1cbiAgICAgKlxuICAgICAqIFN1bW1hcnk6XG4gICAgICpcbiAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgbm9kZSBpcyBwbGFpbiB0ZXh0LlxuICAgICAqIEluIG90aGVyIHdvcmRzLCByZXR1cm4gZmFsc2UgaWYgdGhlIG5vZGUgaXMgc3R5bGVkXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbm9kZVxuICAgICAqL1xuICAgIFJ1bGVIZWxwZXIucHJvdG90eXBlLmlzUGxhaW5TdHJOb2RlID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAobm9kZS50eXBlICE9PSBhc3Rfbm9kZV90eXBlc18xLkFTVE5vZGVUeXBlcy5TdHIpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKChfYSA9IG5vZGUucGFyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudHlwZSkgIT09IGFzdF9ub2RlX3R5cGVzXzEuQVNUTm9kZVR5cGVzLlBhcmFncmFwaCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBpc0luVW5jb250cm9sbGFibGVOb2RlID0gdGhpcy5pc0NoaWxkTm9kZShub2RlLCBbXG4gICAgICAgICAgICAvLyA8YmxvY2txdW90ZT4gaXMgQmxvY2sgbm9kZSBpbiBodG1sLiBJdCBjYW4gaGFzIFByYWdhcmFwaCBub2RlIGFzIGNoaWxkcmVuXG4gICAgICAgICAgICBhc3Rfbm9kZV90eXBlc18xLkFTVE5vZGVUeXBlcy5CbG9ja1F1b3RlXG4gICAgICAgIF0pO1xuICAgICAgICByZXR1cm4gIWlzSW5VbmNvbnRyb2xsYWJsZU5vZGU7XG4gICAgfTtcbiAgICByZXR1cm4gUnVsZUhlbHBlcjtcbn0oKSk7XG5leHBvcnRzLmRlZmF1bHQgPSBSdWxlSGVscGVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGV4dGxpbnQtcnVsZS1oZWxwZXIuanMubWFwIiwiJ3VzZSBzdHJpY3QnXG5cbm1vZHVsZS5leHBvcnRzID0gY29udmVydFxuXG5mdW5jdGlvbiBjb252ZXJ0KHRlc3QpIHtcbiAgaWYgKHRlc3QgPT0gbnVsbCkge1xuICAgIHJldHVybiBva1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0ZXN0ID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB0eXBlRmFjdG9yeSh0ZXN0KVxuICB9XG5cbiAgaWYgKHR5cGVvZiB0ZXN0ID09PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiAnbGVuZ3RoJyBpbiB0ZXN0ID8gYW55RmFjdG9yeSh0ZXN0KSA6IGFsbEZhY3RvcnkodGVzdClcbiAgfVxuXG4gIGlmICh0eXBlb2YgdGVzdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB0ZXN0XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGZ1bmN0aW9uLCBzdHJpbmcsIG9yIG9iamVjdCBhcyB0ZXN0Jylcbn1cblxuLy8gVXRpbGl0eSBhc3NlcnQgZWFjaCBwcm9wZXJ0eSBpbiBgdGVzdGAgaXMgcmVwcmVzZW50ZWQgaW4gYG5vZGVgLCBhbmQgZWFjaFxuLy8gdmFsdWVzIGFyZSBzdHJpY3RseSBlcXVhbC5cbmZ1bmN0aW9uIGFsbEZhY3RvcnkodGVzdCkge1xuICByZXR1cm4gYWxsXG5cbiAgZnVuY3Rpb24gYWxsKG5vZGUpIHtcbiAgICB2YXIga2V5XG5cbiAgICBmb3IgKGtleSBpbiB0ZXN0KSB7XG4gICAgICBpZiAobm9kZVtrZXldICE9PSB0ZXN0W2tleV0pIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlXG4gIH1cbn1cblxuZnVuY3Rpb24gYW55RmFjdG9yeSh0ZXN0cykge1xuICB2YXIgY2hlY2tzID0gW11cbiAgdmFyIGluZGV4ID0gLTFcblxuICB3aGlsZSAoKytpbmRleCA8IHRlc3RzLmxlbmd0aCkge1xuICAgIGNoZWNrc1tpbmRleF0gPSBjb252ZXJ0KHRlc3RzW2luZGV4XSlcbiAgfVxuXG4gIHJldHVybiBhbnlcblxuICBmdW5jdGlvbiBhbnkoKSB7XG4gICAgdmFyIGluZGV4ID0gLTFcblxuICAgIHdoaWxlICgrK2luZGV4IDwgY2hlY2tzLmxlbmd0aCkge1xuICAgICAgaWYgKGNoZWNrc1tpbmRleF0uYXBwbHkodGhpcywgYXJndW1lbnRzKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbi8vIFV0aWxpdHkgdG8gY29udmVydCBhIHN0cmluZyBpbnRvIGEgZnVuY3Rpb24gd2hpY2ggY2hlY2tzIGEgZ2l2ZW4gbm9kZeKAmXMgdHlwZVxuLy8gZm9yIHNhaWQgc3RyaW5nLlxuZnVuY3Rpb24gdHlwZUZhY3RvcnkodGVzdCkge1xuICByZXR1cm4gdHlwZVxuXG4gIGZ1bmN0aW9uIHR5cGUobm9kZSkge1xuICAgIHJldHVybiBCb29sZWFuKG5vZGUgJiYgbm9kZS50eXBlID09PSB0ZXN0KVxuICB9XG59XG5cbi8vIFV0aWxpdHkgdG8gcmV0dXJuIHRydWUuXG5mdW5jdGlvbiBvaygpIHtcbiAgcmV0dXJuIHRydWVcbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gaWRlbnRpdHlcbmZ1bmN0aW9uIGlkZW50aXR5KGQpIHtcbiAgcmV0dXJuIGRcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5tb2R1bGUuZXhwb3J0cyA9IHZpc2l0UGFyZW50c1xuXG52YXIgY29udmVydCA9IHJlcXVpcmUoJ3VuaXN0LXV0aWwtaXMvY29udmVydCcpXG52YXIgY29sb3IgPSByZXF1aXJlKCcuL2NvbG9yJylcblxudmFyIENPTlRJTlVFID0gdHJ1ZVxudmFyIFNLSVAgPSAnc2tpcCdcbnZhciBFWElUID0gZmFsc2VcblxudmlzaXRQYXJlbnRzLkNPTlRJTlVFID0gQ09OVElOVUVcbnZpc2l0UGFyZW50cy5TS0lQID0gU0tJUFxudmlzaXRQYXJlbnRzLkVYSVQgPSBFWElUXG5cbmZ1bmN0aW9uIHZpc2l0UGFyZW50cyh0cmVlLCB0ZXN0LCB2aXNpdG9yLCByZXZlcnNlKSB7XG4gIHZhciBzdGVwXG4gIHZhciBpc1xuXG4gIGlmICh0eXBlb2YgdGVzdCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgdmlzaXRvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldmVyc2UgPSB2aXNpdG9yXG4gICAgdmlzaXRvciA9IHRlc3RcbiAgICB0ZXN0ID0gbnVsbFxuICB9XG5cbiAgaXMgPSBjb252ZXJ0KHRlc3QpXG4gIHN0ZXAgPSByZXZlcnNlID8gLTEgOiAxXG5cbiAgZmFjdG9yeSh0cmVlLCBudWxsLCBbXSkoKVxuXG4gIGZ1bmN0aW9uIGZhY3Rvcnkobm9kZSwgaW5kZXgsIHBhcmVudHMpIHtcbiAgICB2YXIgdmFsdWUgPSB0eXBlb2Ygbm9kZSA9PT0gJ29iamVjdCcgJiYgbm9kZSAhPT0gbnVsbCA/IG5vZGUgOiB7fVxuICAgIHZhciBuYW1lXG5cbiAgICBpZiAodHlwZW9mIHZhbHVlLnR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBuYW1lID1cbiAgICAgICAgdHlwZW9mIHZhbHVlLnRhZ05hbWUgPT09ICdzdHJpbmcnXG4gICAgICAgICAgPyB2YWx1ZS50YWdOYW1lXG4gICAgICAgICAgOiB0eXBlb2YgdmFsdWUubmFtZSA9PT0gJ3N0cmluZydcbiAgICAgICAgICA/IHZhbHVlLm5hbWVcbiAgICAgICAgICA6IHVuZGVmaW5lZFxuXG4gICAgICB2aXNpdC5kaXNwbGF5TmFtZSA9XG4gICAgICAgICdub2RlICgnICsgY29sb3IodmFsdWUudHlwZSArIChuYW1lID8gJzwnICsgbmFtZSArICc+JyA6ICcnKSkgKyAnKSdcbiAgICB9XG5cbiAgICByZXR1cm4gdmlzaXRcblxuICAgIGZ1bmN0aW9uIHZpc2l0KCkge1xuICAgICAgdmFyIGdyYW5kcGFyZW50cyA9IHBhcmVudHMuY29uY2F0KG5vZGUpXG4gICAgICB2YXIgcmVzdWx0ID0gW11cbiAgICAgIHZhciBzdWJyZXN1bHRcbiAgICAgIHZhciBvZmZzZXRcblxuICAgICAgaWYgKCF0ZXN0IHx8IGlzKG5vZGUsIGluZGV4LCBwYXJlbnRzW3BhcmVudHMubGVuZ3RoIC0gMV0gfHwgbnVsbCkpIHtcbiAgICAgICAgcmVzdWx0ID0gdG9SZXN1bHQodmlzaXRvcihub2RlLCBwYXJlbnRzKSlcblxuICAgICAgICBpZiAocmVzdWx0WzBdID09PSBFWElUKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlLmNoaWxkcmVuICYmIHJlc3VsdFswXSAhPT0gU0tJUCkge1xuICAgICAgICBvZmZzZXQgPSAocmV2ZXJzZSA/IG5vZGUuY2hpbGRyZW4ubGVuZ3RoIDogLTEpICsgc3RlcFxuXG4gICAgICAgIHdoaWxlIChvZmZzZXQgPiAtMSAmJiBvZmZzZXQgPCBub2RlLmNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICAgIHN1YnJlc3VsdCA9IGZhY3Rvcnkobm9kZS5jaGlsZHJlbltvZmZzZXRdLCBvZmZzZXQsIGdyYW5kcGFyZW50cykoKVxuXG4gICAgICAgICAgaWYgKHN1YnJlc3VsdFswXSA9PT0gRVhJVCkge1xuICAgICAgICAgICAgcmV0dXJuIHN1YnJlc3VsdFxuICAgICAgICAgIH1cblxuICAgICAgICAgIG9mZnNldCA9XG4gICAgICAgICAgICB0eXBlb2Ygc3VicmVzdWx0WzFdID09PSAnbnVtYmVyJyA/IHN1YnJlc3VsdFsxXSA6IG9mZnNldCArIHN0ZXBcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHRvUmVzdWx0KHZhbHVlKSB7XG4gIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICdsZW5ndGgnIGluIHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBbQ09OVElOVUUsIHZhbHVlXVxuICB9XG5cbiAgcmV0dXJuIFt2YWx1ZV1cbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5tb2R1bGUuZXhwb3J0cyA9IHZpc2l0XG5cbnZhciB2aXNpdFBhcmVudHMgPSByZXF1aXJlKCd1bmlzdC11dGlsLXZpc2l0LXBhcmVudHMnKVxuXG52YXIgQ09OVElOVUUgPSB2aXNpdFBhcmVudHMuQ09OVElOVUVcbnZhciBTS0lQID0gdmlzaXRQYXJlbnRzLlNLSVBcbnZhciBFWElUID0gdmlzaXRQYXJlbnRzLkVYSVRcblxudmlzaXQuQ09OVElOVUUgPSBDT05USU5VRVxudmlzaXQuU0tJUCA9IFNLSVBcbnZpc2l0LkVYSVQgPSBFWElUXG5cbmZ1bmN0aW9uIHZpc2l0KHRyZWUsIHRlc3QsIHZpc2l0b3IsIHJldmVyc2UpIHtcbiAgaWYgKHR5cGVvZiB0ZXN0ID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB2aXNpdG9yICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV2ZXJzZSA9IHZpc2l0b3JcbiAgICB2aXNpdG9yID0gdGVzdFxuICAgIHRlc3QgPSBudWxsXG4gIH1cblxuICB2aXNpdFBhcmVudHModHJlZSwgdGVzdCwgb3ZlcmxvYWQsIHJldmVyc2UpXG5cbiAgZnVuY3Rpb24gb3ZlcmxvYWQobm9kZSwgcGFyZW50cykge1xuICAgIHZhciBwYXJlbnQgPSBwYXJlbnRzW3BhcmVudHMubGVuZ3RoIC0gMV1cbiAgICB2YXIgaW5kZXggPSBwYXJlbnQgPyBwYXJlbnQuY2hpbGRyZW4uaW5kZXhPZihub2RlKSA6IG51bGxcbiAgICByZXR1cm4gdmlzaXRvcihub2RlLCBpbmRleCwgcGFyZW50KVxuICB9XG59XG4iLCIvLyBMSUNFTlNFIDogTUlUXG5cInVzZSBzdHJpY3RcIjtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciB1bmlzdF91dGlsX3Zpc2l0XzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcInVuaXN0LXV0aWwtdmlzaXRcIikpO1xuLyoqXG4gKiBJZ25vcmUgbm9kZSBtYW5hZ2VyIHRoYXQgbWFuYWdlciBpZ25vcmVkIHJhbmdlcy5cbiAqXG4gKi9cbnZhciBJZ25vcmVOb2RlTWFuYWdlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBJZ25vcmVOb2RlTWFuYWdlcigpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtbbnVtYmVyLG51bWJlcl1bXX1cbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX2lnbm9yZWRSYW5nZUxpc3QgPSBbXTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KElnbm9yZU5vZGVNYW5hZ2VyLnByb3RvdHlwZSwgXCJpZ25vcmVkUmFuZ2VzXCIsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEByZXR1cm5zIHsobnVtYmVyKVtdW119XG4gICAgICAgICAqL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9pZ25vcmVkUmFuZ2VMaXN0O1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgLyoqXG4gICAgICogfC4uLi4uLi58XG4gICAgICogXiAgICAgICBeXG4gICAgICogSWdub3JlZCBSYW5nZVxuICAgICAqXG4gICAgICogICAgfC4uLi4uLi4ufFxuICAgICAqICAgIF5cbiAgICAgKiAgaW5kZXhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXhcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBJZ25vcmVOb2RlTWFuYWdlci5wcm90b3R5cGUuaXNJZ25vcmVkSW5kZXggPSBmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lnbm9yZWRSYW5nZUxpc3Quc29tZShmdW5jdGlvbiAocmFuZ2UpIHtcbiAgICAgICAgICAgIHZhciBzdGFydCA9IHJhbmdlWzBdLCBlbmQgPSByYW5nZVsxXTtcbiAgICAgICAgICAgIHJldHVybiBzdGFydCA8PSBpbmRleCAmJiBpbmRleCA8IGVuZDtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1tudW1iZXIsIG51bWJlcl19IGFSYW5nZVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqIEBkZXByZWNhdGVkIFRoaXMgbWV0aG9kIHdpbGwgYmUgcmVtb3ZlZFxuICAgICAqL1xuICAgIElnbm9yZU5vZGVNYW5hZ2VyLnByb3RvdHlwZS5pc0lnbm9yZWRSYW5nZSA9IGZ1bmN0aW9uIChhUmFuZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNJZ25vcmVkSW5kZXgoYVJhbmdlWzBdKSB8fCB0aGlzLmlzSWdub3JlZEluZGV4KGFSYW5nZVsxXSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gbm9kZVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIElnbm9yZU5vZGVNYW5hZ2VyLnByb3RvdHlwZS5pc0lnbm9yZWQgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0lnbm9yZWRSYW5nZShub2RlLnJhbmdlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIGFkZCBub2RlIHRvIGlnbm9yZSByYW5nZSBsaXN0XG4gICAgICogQHBhcmFtIHtUeHROb2RlfSBub2RlXG4gICAgICovXG4gICAgSWdub3JlTm9kZU1hbmFnZXIucHJvdG90eXBlLmlnbm9yZSA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIHRoaXMuaWdub3JlUmFuZ2Uobm9kZS5yYW5nZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBhZGQgcmFuZ2UgdG8gaWdub3JlIHJhbmdlIGxpc3RcbiAgICAgKiBAcGFyYW0ge1tudW1iZXIsIG51bWJlcl19IHJhbmdlXG4gICAgICovXG4gICAgSWdub3JlTm9kZU1hbmFnZXIucHJvdG90eXBlLmlnbm9yZVJhbmdlID0gZnVuY3Rpb24gKHJhbmdlKSB7XG4gICAgICAgIHRoaXMuX2lnbm9yZWRSYW5nZUxpc3QucHVzaChyYW5nZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBpZ25vcmUgY2hpbGRyZW4gbm9kZSBvZiBgbm9kZWAsXG4gICAgICogaWYgdGhlIGNoaWxkcmVuIG5vZGUgaGFzIHRoZSB0eXBlIHRoYXQgaXMgaW5jbHVkZWQgaW4gYGlnbm9yZWROb2RlVHlwZXNgLlxuICAgICAqIEBwYXJhbSB7VHh0Tm9kZX0gdGFyZ2V0Tm9kZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IGlnbm9yZWROb2RlVHlwZXNcbiAgICAgKi9cbiAgICBJZ25vcmVOb2RlTWFuYWdlci5wcm90b3R5cGUuaWdub3JlQ2hpbGRyZW5CeVR5cGVzID0gZnVuY3Rpb24gKHRhcmdldE5vZGUsIGlnbm9yZWROb2RlVHlwZXMpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgKDAsIHVuaXN0X3V0aWxfdmlzaXRfMS5kZWZhdWx0KSh0YXJnZXROb2RlLCBmdW5jdGlvbiAodmlzaXRlZE5vZGUpIHtcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IHR5cGUgaXMgVHh0Tm9kZVR5cGVcbiAgICAgICAgICAgIGlmIChpZ25vcmVkTm9kZVR5cGVzLmluY2x1ZGVzKHZpc2l0ZWROb2RlLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuaWdub3JlKHZpc2l0ZWROb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gSWdub3JlTm9kZU1hbmFnZXI7XG59KCkpO1xuZXhwb3J0cy5kZWZhdWx0ID0gSWdub3JlTm9kZU1hbmFnZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1JZ25vcmVOb2RlTWFuYWdlci5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gIENvcHlyaWdodCAoQykgMjAxNCBZdXN1a2UgU3V6dWtpIDx1dGF0YW5lLnRlYUBnbWFpbC5jb20+XG5cbiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuXG4gICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodFxuICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHRcbiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGVcbiAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG5cbiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiAgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuICBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuICBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgPENPUFlSSUdIVCBIT0xERVI+IEJFIExJQUJMRSBGT1IgQU5ZXG4gIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTXG4gIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUztcbiAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EXG4gIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4gIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRlxuICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuYmluYXJ5U2VhcmNoID0gZXhwb3J0cy51cHBlckJvdW5kID0gZXhwb3J0cy5sb3dlckJvdW5kID0gZXhwb3J0cy5jb21wYXJlID0gdm9pZCAwO1xuZnVuY3Rpb24gY29tcGFyZSh2MSwgdjIpIHtcbiAgICByZXR1cm4gdjEgPCB2Mjtcbn1cbmV4cG9ydHMuY29tcGFyZSA9IGNvbXBhcmU7XG5mdW5jdGlvbiB1cHBlckJvdW5kKGFycmF5LCB2YWx1ZSwgY29tcCA9IGNvbXBhcmUpIHtcbiAgICBsZXQgbGVuID0gYXJyYXkubGVuZ3RoO1xuICAgIGxldCBpID0gMDtcbiAgICB3aGlsZSAobGVuKSB7XG4gICAgICAgIGxldCBkaWZmID0gbGVuID4+PiAxO1xuICAgICAgICBsZXQgY3Vyc29yID0gaSArIGRpZmY7XG4gICAgICAgIGlmIChjb21wKHZhbHVlLCBhcnJheVtjdXJzb3JdKSkge1xuICAgICAgICAgICAgbGVuID0gZGlmZjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGkgPSBjdXJzb3IgKyAxO1xuICAgICAgICAgICAgbGVuIC09IGRpZmYgKyAxO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpO1xufVxuZXhwb3J0cy51cHBlckJvdW5kID0gdXBwZXJCb3VuZDtcbmZ1bmN0aW9uIGxvd2VyQm91bmQoYXJyYXksIHZhbHVlLCBjb21wID0gY29tcGFyZSkge1xuICAgIGxldCBsZW4gPSBhcnJheS5sZW5ndGg7XG4gICAgbGV0IGkgPSAwO1xuICAgIHdoaWxlIChsZW4pIHtcbiAgICAgICAgbGV0IGRpZmYgPSBsZW4gPj4+IDE7XG4gICAgICAgIGxldCBjdXJzb3IgPSBpICsgZGlmZjtcbiAgICAgICAgaWYgKGNvbXAoYXJyYXlbY3Vyc29yXSwgdmFsdWUpKSB7XG4gICAgICAgICAgICBpID0gY3Vyc29yICsgMTtcbiAgICAgICAgICAgIGxlbiAtPSBkaWZmICsgMTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxlbiA9IGRpZmY7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGk7XG59XG5leHBvcnRzLmxvd2VyQm91bmQgPSBsb3dlckJvdW5kO1xuZnVuY3Rpb24gYmluYXJ5U2VhcmNoKGFycmF5LCB2YWx1ZSwgY29tcCA9IGNvbXBhcmUpIHtcbiAgICBsZXQgY3Vyc29yID0gbG93ZXJCb3VuZChhcnJheSwgdmFsdWUsIGNvbXApO1xuICAgIHJldHVybiBjdXJzb3IgIT09IGFycmF5Lmxlbmd0aCAmJiAhY29tcCh2YWx1ZSwgYXJyYXlbY3Vyc29yXSk7XG59XG5leHBvcnRzLmJpbmFyeVNlYXJjaCA9IGJpbmFyeVNlYXJjaDtcbi8qIHZpbTogc2V0IHN3PTQgdHM9NCBldCB0dz04MCA6ICovXG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gIENvcHlyaWdodCAoQykgMjAxNCBZdXN1a2UgU3V6dWtpIDx1dGF0YW5lLnRlYUBnbWFpbC5jb20+XG5cbiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuXG4gICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodFxuICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHRcbiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGVcbiAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG5cbiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiAgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuICBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuICBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgPENPUFlSSUdIVCBIT0xERVI+IEJFIExJQUJMRSBGT1IgQU5ZXG4gIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTXG4gIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUztcbiAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EXG4gIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4gIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRlxuICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuU3RydWN0dXJlZFNvdXJjZSA9IHZvaWQgMDtcbmNvbnN0IGJvdW5kYXJ5XzEgPSByZXF1aXJlKFwiYm91bmRhcnlcIik7XG4vKipcbiAqIFN0cnVjdHVyZWRTb3VyY2VcbiAqL1xuY2xhc3MgU3RydWN0dXJlZFNvdXJjZSB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdHMgU3RydWN0dXJlZFNvdXJjZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgLSBzb3VyY2UgY29kZSB0ZXh0LlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHNvdXJjZSkge1xuICAgICAgICB0aGlzLmluZGljZSA9IFswXTtcbiAgICAgICAgbGV0IHJlZ2V4cCA9IC9bXFxyXFxuXFx1MjAyOFxcdTIwMjldL2c7XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IHNvdXJjZS5sZW5ndGg7XG4gICAgICAgIHJlZ2V4cC5sYXN0SW5kZXggPSAwO1xuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHJlZ2V4cC5leGVjKHNvdXJjZSk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGluZGV4ID0gcmVzdWx0LmluZGV4O1xuICAgICAgICAgICAgaWYgKHNvdXJjZS5jaGFyQ29kZUF0KGluZGV4KSA9PT0gMHgwRCAvKiAnXFxyJyAqLyAmJlxuICAgICAgICAgICAgICAgIHNvdXJjZS5jaGFyQ29kZUF0KGluZGV4ICsgMSkgPT09IDB4MEEgLyogJ1xcbicgKi8pIHtcbiAgICAgICAgICAgICAgICBpbmRleCArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IG5leHRJbmRleCA9IGluZGV4ICsgMTtcbiAgICAgICAgICAgIC8vIElmIHRoZXJlJ3MgYSBsYXN0IGxpbmUgdGVybWluYXRvciwgd2UgcHVzaCBpdCB0byB0aGUgaW5kaWNlLlxuICAgICAgICAgICAgLy8gU28gdXNlIDwgaW5zdGVhZCBvZiA8PS5cbiAgICAgICAgICAgIGlmIChsZW5ndGggPCBuZXh0SW5kZXgpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuaW5kaWNlLnB1c2gobmV4dEluZGV4KTtcbiAgICAgICAgICAgIHJlZ2V4cC5sYXN0SW5kZXggPSBuZXh0SW5kZXg7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IGxpbmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmluZGljZS5sZW5ndGg7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U291cmNlTG9jYXRpb259IGxvYyAtIGxvY2F0aW9uIGluZGljYXRvci5cbiAgICAgKiBAcmV0dXJuIHtbIG51bWJlciwgbnVtYmVyIF19IHJhbmdlLlxuICAgICAqL1xuICAgIGxvY2F0aW9uVG9SYW5nZShsb2MpIHtcbiAgICAgICAgcmV0dXJuIFt0aGlzLnBvc2l0aW9uVG9JbmRleChsb2Muc3RhcnQpLCB0aGlzLnBvc2l0aW9uVG9JbmRleChsb2MuZW5kKV07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7WyBudW1iZXIsIG51bWJlciBdfSByYW5nZSAtIHBhaXIgb2YgaW5kaWNlLlxuICAgICAqIEByZXR1cm4ge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbi5cbiAgICAgKi9cbiAgICByYW5nZVRvTG9jYXRpb24ocmFuZ2UpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN0YXJ0OiB0aGlzLmluZGV4VG9Qb3NpdGlvbihyYW5nZVswXSksXG4gICAgICAgICAgICBlbmQ6IHRoaXMuaW5kZXhUb1Bvc2l0aW9uKHJhbmdlWzFdKVxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1NvdXJjZVBvc2l0aW9ufSBwb3MgLSBwb3NpdGlvbiBpbmRpY2F0b3IuXG4gICAgICogQHJldHVybiB7bnVtYmVyfSBpbmRleC5cbiAgICAgKi9cbiAgICBwb3NpdGlvblRvSW5kZXgocG9zKSB7XG4gICAgICAgIC8vIExpbmUgbnVtYmVyIHN0YXJ0cyB3aXRoIDEuXG4gICAgICAgIC8vIENvbHVtbiBudW1iZXIgc3RhcnRzIHdpdGggMC5cbiAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5pbmRpY2VbcG9zLmxpbmUgLSAxXTtcbiAgICAgICAgcmV0dXJuIHN0YXJ0ICsgcG9zLmNvbHVtbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gaW5kZXggdG8gdGhlIHNvdXJjZSBjb2RlLlxuICAgICAqIEByZXR1cm4ge1NvdXJjZVBvc2l0aW9ufSBwb3NpdGlvbi5cbiAgICAgKi9cbiAgICBpbmRleFRvUG9zaXRpb24oaW5kZXgpIHtcbiAgICAgICAgY29uc3Qgc3RhcnRMaW5lID0gKDAsIGJvdW5kYXJ5XzEudXBwZXJCb3VuZCkodGhpcy5pbmRpY2UsIGluZGV4KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGxpbmU6IHN0YXJ0TGluZSxcbiAgICAgICAgICAgIGNvbHVtbjogaW5kZXggLSB0aGlzLmluZGljZVtzdGFydExpbmUgLSAxXVxuICAgICAgICB9O1xuICAgIH1cbn1cbmV4cG9ydHMuU3RydWN0dXJlZFNvdXJjZSA9IFN0cnVjdHVyZWRTb3VyY2U7XG4vKiB2aW06IHNldCBzdz00IHRzPTQgZXQgdHc9ODAgOiAqL1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3RydWN0dXJlZC1zb3VyY2UuanMubWFwIiwiLy8gTElDRU5TRSA6IE1JVFxuXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlNvdXJjZUxvY2F0aW9uID0gdm9pZCAwO1xudmFyIHN0cnVjdHVyZWRfc291cmNlXzEgPSByZXF1aXJlKFwic3RydWN0dXJlZC1zb3VyY2VcIik7XG52YXIgU291cmNlTG9jYXRpb24gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gU291cmNlTG9jYXRpb24odGV4dCkge1xuICAgICAgICB0aGlzLnNvdXJjZSA9IG5ldyBzdHJ1Y3R1cmVkX3NvdXJjZV8xLlN0cnVjdHVyZWRTb3VyY2UodGV4dCk7XG4gICAgfVxuICAgIFNvdXJjZUxvY2F0aW9uLnByb3RvdHlwZS50b0Fic29sdXRlTG9jYXRpb24gPSBmdW5jdGlvbiAobm9kZSwgcGFkZGluZykge1xuICAgICAgICB2YXIgbm9kZVJhbmdlID0gbm9kZS5yYW5nZTtcbiAgICAgICAgdmFyIGxpbmUgPSBub2RlLmxvYy5zdGFydC5saW5lO1xuICAgICAgICB2YXIgY29sdW1uID0gbm9kZS5sb2Muc3RhcnQuY29sdW1uO1xuICAgICAgICAvLyB3aGVuIHVzZSB7aW5kZXh9XG4gICAgICAgIGlmIChwYWRkaW5nLmluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHZhciBwYWRkaW5nSW5kZXggPSBwYWRkaW5nLmluZGV4O1xuICAgICAgICAgICAgcmV0dXJuIG5vZGVSYW5nZVswXSArIHBhZGRpbmdJbmRleDtcbiAgICAgICAgfVxuICAgICAgICAvLyB3aGVuIHVzZSB7bGluZSwgY29sdW1ufVxuICAgICAgICBpZiAocGFkZGluZy5saW5lICE9PSB1bmRlZmluZWQgJiYgcGFkZGluZy5jb2x1bW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdmFyIGFkZGVkTGluZSA9IGxpbmUgKyBwYWRkaW5nLmxpbmU7XG4gICAgICAgICAgICAvLyB3aGVuIHJlcG9ydCB3aXRoIHBhZGRpbmcge2xpbmUsIGNvbHVtbn0sIG1lc3NhZ2UuY29sdW1uIHNob3VsZCBiZSAwICsgcGFkZGluZy5jb2x1bW4uXG4gICAgICAgICAgICAvLyBJbiBvdGhlciB3b3JkLCBwYWRkaW5nIGxpbmUgPiAwIGFuZCBtZXNzYWdlLmNvbHVtbiBzdGFydCB3aXRoIDAuXG4gICAgICAgICAgICBpZiAocGFkZGluZy5jb2x1bW4gPiAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc291cmNlLnBvc2l0aW9uVG9JbmRleCh7XG4gICAgICAgICAgICAgICAgICAgIGxpbmU6IGFkZGVkTGluZSxcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBwYWRkaW5nLmNvbHVtblxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc291cmNlLnBvc2l0aW9uVG9JbmRleCh7XG4gICAgICAgICAgICAgICAgICAgIGxpbmU6IGFkZGVkTGluZSxcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBjb2x1bW5cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyB3aGVuIHVzZSB7IGxpbmUgfSBvbmx5XG4gICAgICAgIGlmIChwYWRkaW5nLmxpbmUgIT09IHVuZGVmaW5lZCAmJiBwYWRkaW5nLmxpbmUgPiAwKSB7XG4gICAgICAgICAgICB2YXIgYWRkZWRMaW5lID0gbGluZSArIHBhZGRpbmcubGluZTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNvdXJjZS5wb3NpdGlvblRvSW5kZXgoe1xuICAgICAgICAgICAgICAgIGxpbmU6IGFkZGVkTGluZSxcbiAgICAgICAgICAgICAgICBjb2x1bW46IGNvbHVtblxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vZGVSYW5nZVswXTtcbiAgICB9O1xuICAgIHJldHVybiBTb3VyY2VMb2NhdGlvbjtcbn0oKSk7XG5leHBvcnRzLlNvdXJjZUxvY2F0aW9uID0gU291cmNlTG9jYXRpb247XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Tb3VyY2VMb2NhdGlvbi5qcy5tYXAiLCIvLyBNSVQgwqkgMjAxOCBhenVcblwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy53cmFwUmVwb3J0SGFuZGxlciA9IHdyYXBSZXBvcnRIYW5kbGVyO1xudmFyIHRleHRsaW50X3J1bGVfaGVscGVyXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vdGV4dGxpbnQtcnVsZS1oZWxwZXJcIikpO1xudmFyIElnbm9yZU5vZGVNYW5hZ2VyXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vSWdub3JlTm9kZU1hbmFnZXJcIikpO1xudmFyIFNvdXJjZUxvY2F0aW9uXzEgPSByZXF1aXJlKFwiLi9Tb3VyY2VMb2NhdGlvblwiKTtcbi8qKlxuICpcbiAqIEBwYXJhbSBjb250ZXh0XG4gKiBAcGFyYW0gb3B0aW9uc1xuICogQHBhcmFtIGhhbmRsZXJcbiAqL1xuZnVuY3Rpb24gd3JhcFJlcG9ydEhhbmRsZXIoY29udGV4dCwgb3B0aW9ucywgaGFuZGxlcikge1xuICAgIHZhciBpZ25vcmVOb2RlVHlwZXMgPSBvcHRpb25zLmlnbm9yZU5vZGVUeXBlcyB8fCBbXTtcbiAgICB2YXIgaWdub3JlTm9kZU1hbmFnZXIgPSBuZXcgSWdub3JlTm9kZU1hbmFnZXJfMS5kZWZhdWx0KCk7XG4gICAgdmFyIHJ1bGVIZWxwZXIgPSBuZXcgdGV4dGxpbnRfcnVsZV9oZWxwZXJfMS5kZWZhdWx0KGNvbnRleHQpO1xuICAgIHZhciB0ZXh0ID0gY29udGV4dC5nZXRTb3VyY2UoKTtcbiAgICB2YXIgc291cmNlTG9jYXRpb24gPSBuZXcgU291cmNlTG9jYXRpb25fMS5Tb3VyY2VMb2NhdGlvbih0ZXh0KTtcbiAgICB2YXIgcmVwb3J0SWZVbmlnbm9yZWQgPSBmdW5jdGlvbiByZXBvcnRJZlVuaWdub3JlZChub2RlLCBydWxlRXJyb3IpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gc291cmNlTG9jYXRpb24udG9BYnNvbHV0ZUxvY2F0aW9uKG5vZGUsIHJ1bGVFcnJvcik7XG4gICAgICAgIGlmIChpZ25vcmVOb2RlTWFuYWdlci5pc0lnbm9yZWRJbmRleChpbmRleCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29udGV4dC5yZXBvcnQobm9kZSwgcnVsZUVycm9yKTtcbiAgICB9O1xuICAgIHZhciBoYW5kbGVycyA9IGhhbmRsZXIocmVwb3J0SWZVbmlnbm9yZWQpO1xuICAgIE9iamVjdC5rZXlzKGhhbmRsZXJzKS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlVHlwZSkge1xuICAgICAgICB2YXIgbm9kZUhhbmRsZXIgPSBoYW5kbGVyc1tub2RlVHlwZV07XG4gICAgICAgIHZhciB3cmFwcGVkTm9kZUhhbmRsZXIgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICAgICAgLy8gY2hpbGQgbm9kZXNcbiAgICAgICAgICAgIGlnbm9yZU5vZGVNYW5hZ2VyLmlnbm9yZUNoaWxkcmVuQnlUeXBlcyhub2RlLCBpZ25vcmVOb2RlVHlwZXMpO1xuICAgICAgICAgICAgLy8gcGFyZW50IG5vZGVcbiAgICAgICAgICAgIGlmIChydWxlSGVscGVyLmlzQ2hpbGROb2RlKG5vZGUsIGlnbm9yZU5vZGVUeXBlcykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIW5vZGVIYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5vZGVIYW5kbGVyKG5vZGUpO1xuICAgICAgICB9O1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBpZ25vcmVcbiAgICAgICAgaGFuZGxlcnNbbm9kZVR5cGVdID0gd3JhcHBlZE5vZGVIYW5kbGVyO1xuICAgIH0pO1xuICAgIHJldHVybiBoYW5kbGVycztcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXdyYXAtcmVwb3J0LWhhbmRsZXIuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLndyYXBSZXBvcnRIYW5kbGVyID0gZXhwb3J0cy5SdWxlSGVscGVyID0gZXhwb3J0cy5JZ25vcmVOb2RlTWFuYWdlciA9IHZvaWQgMDtcbnZhciB0ZXh0bGludF9ydWxlX2hlbHBlcl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL3RleHRsaW50LXJ1bGUtaGVscGVyXCIpKTtcbmV4cG9ydHMuUnVsZUhlbHBlciA9IHRleHRsaW50X3J1bGVfaGVscGVyXzEuZGVmYXVsdDtcbnZhciBJZ25vcmVOb2RlTWFuYWdlcl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL0lnbm9yZU5vZGVNYW5hZ2VyXCIpKTtcbmV4cG9ydHMuSWdub3JlTm9kZU1hbmFnZXIgPSBJZ25vcmVOb2RlTWFuYWdlcl8xLmRlZmF1bHQ7XG52YXIgd3JhcF9yZXBvcnRfaGFuZGxlcl8xID0gcmVxdWlyZShcIi4vd3JhcC1yZXBvcnQtaGFuZGxlclwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIndyYXBSZXBvcnRIYW5kbGVyXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB3cmFwX3JlcG9ydF9oYW5kbGVyXzEud3JhcFJlcG9ydEhhbmRsZXI7IH0gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCIvLyBMSUNFTlNFIDogTUlUXG5cInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMucmVwb3J0ID0gZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF90ZXh0bGludFJ1bGVIZWxwZXIgPSByZXF1aXJlKFwidGV4dGxpbnQtcnVsZS1oZWxwZXJcIik7XG52YXIgSGFua2FrdVJlZ0V4cCA9IC8oW1xcdWZmNjEtXFx1ZmY5Zl0rKS9nO1xudmFyIHJlcG9ydCA9IGZ1bmN0aW9uIHJlcG9ydGVyKGNvbnRleHQpIHtcbiAgdmFyIHtcbiAgICBTeW50YXgsXG4gICAgUnVsZUVycm9yLFxuICAgIGZpeGVyLFxuICAgIHJlcG9ydCxcbiAgICBsb2NhdG9yLFxuICAgIGdldFNvdXJjZVxuICB9ID0gY29udGV4dDtcbiAgdmFyIGhlbHBlciA9IG5ldyBfdGV4dGxpbnRSdWxlSGVscGVyLlJ1bGVIZWxwZXIoY29udGV4dCk7XG4gIHJldHVybiB7XG4gICAgW1N5bnRheC5TdHJdKG5vZGUpIHtcbiAgICAgIGlmICghaGVscGVyLmlzUGxhaW5TdHJOb2RlKG5vZGUpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZhciBub2RlVGV4dCA9IGdldFNvdXJjZShub2RlKTtcbiAgICAgIGZvciAodmFyIG1hdGNoIG9mIG5vZGVUZXh0Lm1hdGNoQWxsKEhhbmtha3VSZWdFeHApKSB7XG4gICAgICAgIHZhciBfbWF0Y2gkaW5kZXg7XG4gICAgICAgIHZhciB0ZXh0ID0gbWF0Y2hbMF07XG4gICAgICAgIHZhciBpbmRleCA9IChfbWF0Y2gkaW5kZXggPSBtYXRjaC5pbmRleCkgIT09IG51bGwgJiYgX21hdGNoJGluZGV4ICE9PSB2b2lkIDAgPyBfbWF0Y2gkaW5kZXggOiAwO1xuICAgICAgICB2YXIgcmFuZ2UgPSBbaW5kZXgsIGluZGV4ICsgdGV4dC5sZW5ndGhdO1xuICAgICAgICB2YXIgcnVsZUVycm9yID0gbmV3IFJ1bGVFcnJvcihcIkRpc2FsbG93IHRvIHVzZSBcXHU1MzRBXFx1ODlEMlxcdTMwQUJcXHUzMEJGXFx1MzBBQlxcdTMwQ0E6IFxcXCJcIi5jb25jYXQodGV4dCwgXCJcXFwiXCIpLCB7XG4gICAgICAgICAgcGFkZGluZzogbG9jYXRvci5yYW5nZShyYW5nZSksXG4gICAgICAgICAgZml4OiBmaXhlci5yZXBsYWNlVGV4dFJhbmdlKHJhbmdlLCB0ZXh0Lm5vcm1hbGl6ZSgnTkZLQycpKVxuICAgICAgICB9KTtcbiAgICAgICAgcmVwb3J0KG5vZGUsIHJ1bGVFcnJvcik7XG4gICAgICB9XG4gICAgfVxuICB9O1xufTtcbmV4cG9ydHMucmVwb3J0ID0gcmVwb3J0O1xudmFyIF9kZWZhdWx0ID0ge1xuICBsaW50ZXI6IHJlcG9ydCxcbiAgZml4ZXI6IHJlcG9ydFxufTtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGV4dGxpbnQtcnVsZS1uby1oYW5rYWt1LWthbmEuanMubWFwIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9hZCB9IGZyb20gJ0BzbGlkZXYvcGFyc2VyL2ZzJztcbmltcG9ydCB7IFRleHRsaW50S2VybmVsLCB0eXBlIFRleHRsaW50S2VybmVsUnVsZSB9IGZyb20gJ0B0ZXh0bGludC9rZXJuZWwnO1xuaW1wb3J0IHsgbW9kdWxlSW50ZXJvcCB9IGZyb20gJ0B0ZXh0bGludC9tb2R1bGUtaW50ZXJvcCc7XG4vLyBUaGUgcGlubmVkIHBhY2thZ2UgaGFzIG5vIG5hbWVkIFByb2Nlc3NvciBleHBvcnQ7IGl0cyBkZWZhdWx0IGltcG9ydCBhbHNvIGZhaWxzIE5vZGVOZXh0IHR5cGluZy5cbmltcG9ydCB7IE1hcmtkb3duUHJvY2Vzc29yIH0gZnJvbSAnQHRleHRsaW50L3RleHRsaW50LXBsdWdpbi1tYXJrZG93bi9saWIvc3JjL01hcmtkb3duUHJvY2Vzc29yLmpzJztcbmltcG9ydCBub0ludmFsaWRDb250cm9sQ2hhcmFjdGVyIGZyb20gJ0B0ZXh0bGludC1ydWxlL3RleHRsaW50LXJ1bGUtbm8taW52YWxpZC1jb250cm9sLWNoYXJhY3Rlcic7XG5pbXBvcnQgbm9IYW5rYWt1S2FuYSBmcm9tICd0ZXh0bGludC1ydWxlLW5vLWhhbmtha3Uta2FuYSc7XG5pbXBvcnQgbm9aZXJvV2lkdGhTcGFjZXMgZnJvbSAndGV4dGxpbnQtcnVsZS1uby16ZXJvLXdpZHRoLXNwYWNlcyc7XG5cbmNvbnN0IHJ1bGVzOiBUZXh0bGludEtlcm5lbFJ1bGVbXSA9IFtcbiAgeyBydWxlSWQ6ICduby1pbnZhbGlkLWNvbnRyb2wtY2hhcmFjdGVyJywgcnVsZTogbW9kdWxlSW50ZXJvcChub0ludmFsaWRDb250cm9sQ2hhcmFjdGVyKSB9LFxuICB7IHJ1bGVJZDogJ25vLWhhbmtha3Uta2FuYScsIHJ1bGU6IG1vZHVsZUludGVyb3Aobm9IYW5rYWt1S2FuYSkgfSxcbiAgeyBydWxlSWQ6ICduby16ZXJvLXdpZHRoLXNwYWNlcycsIHJ1bGU6IG1vZHVsZUludGVyb3Aobm9aZXJvV2lkdGhTcGFjZXMpIH0sXG5dO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGludFNsaWRldlRleHQoZGVja1BhdGg6IHN0cmluZywgd29ya3NwYWNlUm9vdDogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc29sZS5pbmZvKGBUZXh0bGludDogJHtkZWNrUGF0aH1gKTtcbiAgY29uc3QgdXNlclJvb3QgPSBwYXRoLmRpcm5hbWUoZGVja1BhdGgpO1xuICBsZXQgZGF0YTogQXdhaXRlZDxSZXR1cm5UeXBlPHR5cGVvZiBsb2FkPj47XG4gIHRyeSB7XG4gICAgZGF0YSA9IGF3YWl0IGxvYWQoeyByb290czogW3VzZXJSb290XSwgdXNlclJvb3QsIGFsbG93ZWRSb290czogW3dvcmtzcGFjZVJvb3QsIHVzZXJSb290XSB9LCBkZWNrUGF0aCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihgJHtkZWNrUGF0aH06ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWApO1xuICAgIHJldHVybiAxO1xuICB9XG4gIGNvbnN0IGtlcm5lbCA9IG5ldyBUZXh0bGludEtlcm5lbCgpO1xuICBsZXQgZXhpdENvZGUgPSAwO1xuICBmb3IgKGNvbnN0IGZpbGUgb2YgT2JqZWN0LnZhbHVlcyhkYXRhLm1hcmtkb3duRmlsZXMpKSB7XG4gICAgY29uc3QgZGlhZ25vc3RpY3MgPSAoZmlsZS5lcnJvcnMgPz8gW10pLm1hcCgoZXJyb3IpID0+IGAke2ZpbGUuZmlsZXBhdGh9OiR7ZXJyb3Iucm93ICsgMX06MTogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgIGZvciAoY29uc3QgZGlhZ25vc3RpYyBvZiBuZXcgU2V0KGRpYWdub3N0aWNzKSkge1xuICAgICAgY29uc29sZS5lcnJvcihkaWFnbm9zdGljKTtcbiAgICAgIGV4aXRDb2RlID0gMTtcbiAgICB9XG4gIH1cbiAgY29uc3QgY2hlY2tlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IHsgc291cmNlIH0gb2YgZGF0YS5zbGlkZXMpIHtcbiAgICBjb25zdCBrZXkgPSBgJHtzb3VyY2UuZmlsZXBhdGh9OiR7c291cmNlLmluZGV4fWA7XG4gICAgaWYgKGNoZWNrZWQuaGFzKGtleSkpIGNvbnRpbnVlO1xuICAgIGNoZWNrZWQuYWRkKGtleSk7XG4gICAgLy8gVGhlIHBhcnNlciBhbHdheXMgc2V0cyBjb250ZW50U3RhcnQgPj0gc3RhcnQsIGJ1dCBpdCBjYW4gZXhjZWVkIGVuZCBhZnRlciBhIGZpbmFsIHNlcGFyYXRvciB3aXRob3V0IGEgYmxhbmsgbGluZS5cbiAgICBjb25zdCBjb250ZW50U3RhcnQgPSBzb3VyY2UuY29udGVudFN0YXJ0ID4gc291cmNlLmVuZCA/IHNvdXJjZS5zdGFydCA6IHNvdXJjZS5jb250ZW50U3RhcnQ7XG4gICAgY29uc3QgdGV4dCA9IHNvdXJjZS5yYXdcbiAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgIC5zbGljZShjb250ZW50U3RhcnQgLSBzb3VyY2Uuc3RhcnQpXG4gICAgICAuam9pbignXFxuJyk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQga2VybmVsLmxpbnRUZXh0KHRleHQsIHtcbiAgICAgIGZpbGVQYXRoOiBzb3VyY2UuZmlsZXBhdGgsXG4gICAgICBleHQ6ICcubWQnLFxuICAgICAgcGx1Z2luczogW3sgcGx1Z2luSWQ6ICdtYXJrZG93bicsIHBsdWdpbjogeyBQcm9jZXNzb3I6IE1hcmtkb3duUHJvY2Vzc29yIH0gfV0sXG4gICAgICBydWxlcyxcbiAgICB9KTtcbiAgICBmb3IgKGNvbnN0IG1lc3NhZ2Ugb2YgcmVzdWx0Lm1lc3NhZ2VzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBgJHtzb3VyY2UuZmlsZXBhdGh9OiR7Y29udGVudFN0YXJ0ICsgbWVzc2FnZS5saW5lfToke21lc3NhZ2UuY29sdW1ufTogJHttZXNzYWdlLm1lc3NhZ2V9ICgke21lc3NhZ2UucnVsZUlkfSlgXG4gICAgICApO1xuICAgICAgZXhpdENvZGUgPSAxO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZXhpdENvZGU7XG59XG4iXSwieF9nb29nbGVfaWdub3JlTGlzdCI6WzAsMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsMjQsMjUsMjYsMjcsMjgsMjksMzAsMzEsMzIsMzMsMzQsMzUsMzYsMzcsMzgsMzksNDAsNDEsNDIsNDMsNDQsNDUsNDYsNDcsNDgsNDksNTAsNTEsNTIsNTMsNTQsNTUsNTYsNTcsNTgsNTksNjAsNjEsNjIsNjMsNjQsNjUsNjYsNjcsNjgsNjksNzAsNzEsNzIsNzMsNzQsNzUsNzYsNzcsNzgsNzksODAsODEsODIsODMsODQsODUsODYsODcsODgsODksOTAsOTFdLCJtYXBwaW5ncyI6Im1tQ0F3Q0EsU0FBUyxFQUFLLEVBQU8sQ0FDbkIsT0FBTyxNQUFNLEtBQUssSUFBSSxJQUFJLENBQUssQ0FBQyxDQUNsQyxDQThCQSxTQUFTLEVBQU0sR0FBRyxFQUFNLENBQ3RCLElBQUksRUFBTyxFQUFNLEVBQ2IsRUFBSyxTQUFXLEdBQ2xCLEVBQVEsRUFDUixFQUFPLEVBQ1AsQ0FBQyxHQUFRLEdBRVQsQ0FBQyxFQUFPLEVBQU0sRUFBTyxHQUFLLEVBRTVCLElBQU0sRUFBTSxDQUFDLEVBQ1QsRUFBVSxFQUNkLEtBQU8sRUFBVSxHQUNmLEVBQUksS0FBSyxDQUFPLEVBQ2hCLEdBQVcsR0FBUSxFQUVyQixPQUFPLENBQ1QsQ0F1R0EsU0FBUyxFQUFNLEVBQUssQ0FDbEIsT0FBTyxFQUFJLFFBQVEsTUFBTyxHQUFHLENBQy9CLENDeEVBLFNBQVMsRUFBaUIsRUFBTyxFQUFVLENBQzFDLEdBQUksQ0FBQyxHQUFZLElBQWEsT0FBUyxJQUFhLElBQUssT0FBTyxFQUFNLEVBQUcsRUFBUSxDQUFDLEVBQ2xGLEdBQUksSUFBYSxPQUFRLE1BQU8sQ0FBQyxFQUNqQyxJQUFNLEVBQVUsQ0FBQyxFQUNqQixJQUFLLElBQU0sS0FBUSxFQUFTLE1BQU0sT0FBTyxFQUFHLEdBQUksQ0FBQyxFQUFLLFNBQVMsR0FBRyxFQUFHLEVBQVEsS0FBSyxDQUFDLENBQUksTUFDbEYsQ0FDSixHQUFNLENBQUMsRUFBTyxHQUFPLEVBQUssTUFBTSxJQUFLLENBQUMsRUFDdEMsRUFBUSxLQUFLLEdBQUcsRUFBTSxDQUFDLEVBQVEsRUFBa0IsQ0FBQyxFQUFNLEVBQW5CLEVBQVEsQ0FBWSxDQUFDLENBQzNELENBQ0EsT0FBTyxFQUFLLENBQU8sQ0FBQyxDQUFDLE9BQVEsR0FBTSxHQUFLLENBQUssQ0FBQyxDQUFDLE1BQU0sRUFBRyxJQUFNLEVBQUksQ0FBQyxDQUNwRSxDQ25JQSxNQUFNLEVBQVEsT0FBTyxJQUFJLFlBQVksRUFDL0IsR0FBTSxPQUFPLElBQUksZUFBZSxFQUNoQyxFQUFNLE9BQU8sSUFBSSxVQUFVLEVBQzNCLEdBQU8sT0FBTyxJQUFJLFdBQVcsRUFDN0JBLEVBQVMsT0FBTyxJQUFJLGFBQWEsRUFDakMsR0FBTSxPQUFPLElBQUksVUFBVSxFQUMzQixFQUFZLE9BQU8sSUFBSSxnQkFBZ0IsRUFDdkMsRUFBVyxHQUFTLENBQUMsQ0FBQyxHQUFRLE9BQU8sR0FBUyxVQUFZLEVBQUssS0FBZSxFQUM5RSxFQUFjLEdBQVMsQ0FBQyxDQUFDLEdBQVEsT0FBTyxHQUFTLFVBQVksRUFBSyxLQUFlLEdBQ2pGLEdBQVMsR0FBUyxDQUFDLENBQUMsR0FBUSxPQUFPLEdBQVMsVUFBWSxFQUFLLEtBQWUsRUFDNUUsRUFBVSxHQUFTLENBQUMsQ0FBQyxHQUFRLE9BQU8sR0FBUyxVQUFZLEVBQUssS0FBZSxHQUM3RUMsRUFBWSxHQUFTLENBQUMsQ0FBQyxHQUFRLE9BQU8sR0FBUyxVQUFZLEVBQUssS0FBZUQsRUFDL0UsR0FBUyxHQUFTLENBQUMsQ0FBQyxHQUFRLE9BQU8sR0FBUyxVQUFZLEVBQUssS0FBZSxHQUNsRixTQUFTRSxFQUFhLEVBQU0sQ0FDeEIsR0FBSSxHQUFRLE9BQU8sR0FBUyxTQUN4QixPQUFRLEVBQUssR0FBYixDQUNJLEtBQUssRUFDTCxLQUFLLEdBQ0QsTUFBTyxFQUNmLENBQ0osTUFBTyxFQUNYLENBQ0EsU0FBUyxFQUFPLEVBQU0sQ0FDbEIsR0FBSSxHQUFRLE9BQU8sR0FBUyxTQUN4QixPQUFRLEVBQUssR0FBYixDQUNJLEtBQUssRUFDTCxLQUFLLEVBQ0wsS0FBS0YsRUFDTCxLQUFLLEdBQ0QsTUFBTyxFQUNmLENBQ0osTUFBTyxFQUNYLENBQ0EsTUFBTSxHQUFhLElBQVVDLEVBQVMsQ0FBSSxHQUFLQyxFQUFhLENBQUksSUFBTSxDQUFDLENBQUMsRUFBSyxPQy9CdkVDLEVBQVEsT0FBTyxhQUFhLEVBQzVCQyxHQUFPLE9BQU8sZUFBZSxFQUM3QkMsRUFBUyxPQUFPLGFBQWEsRUErQm5DLFNBQVNDLEVBQU0sRUFBTSxFQUFTLENBQzFCLElBQU0sRUFBVyxHQUFZLENBQU8sRUFDaEMsRUFBVyxDQUFJLEVBQ0osRUFBTyxLQUFNLEVBQUssU0FBVSxFQUFVLE9BQU8sT0FBTyxDQUFDLENBQUksQ0FBQyxDQUNoRSxJQUFNRCxJQUNQLEVBQUssU0FBVyxNQUdwQixFQUFPLEtBQU0sRUFBTSxFQUFVLE9BQU8sT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUN0RCxDQUtBLEVBQU0sTUFBUUYsRUFFZCxFQUFNLEtBQU9DLEdBRWIsRUFBTSxPQUFTQyxFQUNmLFNBQVMsRUFBTyxFQUFLLEVBQU0sRUFBUyxFQUFNLENBQ3RDLElBQU0sRUFBTyxHQUFZLEVBQUssRUFBTSxFQUFTLENBQUksRUFDakQsR0FBSSxFQUFPLENBQUksR0FBSyxFQUFPLENBQUksRUFFM0IsT0FEQSxHQUFZLEVBQUssRUFBTSxDQUFJLEVBQ3BCLEVBQU8sRUFBSyxFQUFNLEVBQVMsQ0FBSSxFQUUxQyxHQUFJLE9BQU8sR0FBUyxTQUFVLENBQzFCLEdBQUlFLEVBQWEsQ0FBSSxFQUFHLENBQ3BCLEVBQU8sT0FBTyxPQUFPLEVBQUssT0FBTyxDQUFJLENBQUMsRUFDdEMsSUFBSyxJQUFJLEVBQUksRUFBRyxFQUFJLEVBQUssTUFBTSxPQUFRLEVBQUUsRUFBRyxDQUN4QyxJQUFNLEVBQUssRUFBTyxFQUFHLEVBQUssTUFBTSxHQUFJLEVBQVMsQ0FBSSxFQUNqRCxHQUFJLE9BQU8sR0FBTyxTQUNkLEVBQUksRUFBSyxPQUNSLEdBQUksSUFBT0osRUFDWixPQUFPQSxPQUNGLElBQU9FLElBQ1osRUFBSyxNQUFNLE9BQU8sRUFBRyxDQUFDLEVBQ3RCLElBRVIsQ0FDSixNQUNLLEdBQUksRUFBTyxDQUFJLEVBQUcsQ0FDbkIsRUFBTyxPQUFPLE9BQU8sRUFBSyxPQUFPLENBQUksQ0FBQyxFQUN0QyxJQUFNLEVBQUssRUFBTyxNQUFPLEVBQUssSUFBSyxFQUFTLENBQUksRUFDaEQsR0FBSSxJQUFPRixFQUNQLE9BQU9BLEVBQ0YsSUFBT0UsSUFDWixFQUFLLElBQU0sTUFDZixJQUFNLEVBQUssRUFBTyxRQUFTLEVBQUssTUFBTyxFQUFTLENBQUksRUFDcEQsR0FBSSxJQUFPRixFQUNQLE9BQU9BLEVBQ0YsSUFBT0UsSUFDWixFQUFLLE1BQVEsS0FDckIsQ0FDSixDQUNBLE9BQU8sQ0FDWCxDQWdDQSxlQUFlLEdBQVcsRUFBTSxFQUFTLENBQ3JDLElBQU0sRUFBVyxHQUFZLENBQU8sRUFDaEMsRUFBVyxDQUFJLEVBRVgsTUFEYSxFQUFZLEtBQU0sRUFBSyxTQUFVLEVBQVUsT0FBTyxPQUFPLENBQUMsQ0FBSSxDQUFDLENBQUMsSUFDdEVBLElBQ1AsRUFBSyxTQUFXLE1BR3BCLE1BQU0sRUFBWSxLQUFNLEVBQU0sRUFBVSxPQUFPLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FDakUsQ0FLQSxHQUFXLE1BQVFGLEVBRW5CLEdBQVcsS0FBT0MsR0FFbEIsR0FBVyxPQUFTQyxFQUNwQixlQUFlLEVBQVksRUFBSyxFQUFNLEVBQVMsRUFBTSxDQUNqRCxJQUFNLEVBQU8sTUFBTSxHQUFZLEVBQUssRUFBTSxFQUFTLENBQUksRUFDdkQsR0FBSSxFQUFPLENBQUksR0FBSyxFQUFPLENBQUksRUFFM0IsT0FEQSxHQUFZLEVBQUssRUFBTSxDQUFJLEVBQ3BCLEVBQVksRUFBSyxFQUFNLEVBQVMsQ0FBSSxFQUUvQyxHQUFJLE9BQU8sR0FBUyxTQUFVLENBQzFCLEdBQUlFLEVBQWEsQ0FBSSxFQUFHLENBQ3BCLEVBQU8sT0FBTyxPQUFPLEVBQUssT0FBTyxDQUFJLENBQUMsRUFDdEMsSUFBSyxJQUFJLEVBQUksRUFBRyxFQUFJLEVBQUssTUFBTSxPQUFRLEVBQUUsRUFBRyxDQUN4QyxJQUFNLEVBQUssTUFBTSxFQUFZLEVBQUcsRUFBSyxNQUFNLEdBQUksRUFBUyxDQUFJLEVBQzVELEdBQUksT0FBTyxHQUFPLFNBQ2QsRUFBSSxFQUFLLE9BQ1IsR0FBSSxJQUFPSixFQUNaLE9BQU9BLE9BQ0YsSUFBT0UsSUFDWixFQUFLLE1BQU0sT0FBTyxFQUFHLENBQUMsRUFDdEIsSUFFUixDQUNKLE1BQ0ssR0FBSSxFQUFPLENBQUksRUFBRyxDQUNuQixFQUFPLE9BQU8sT0FBTyxFQUFLLE9BQU8sQ0FBSSxDQUFDLEVBQ3RDLElBQU0sRUFBSyxNQUFNLEVBQVksTUFBTyxFQUFLLElBQUssRUFBUyxDQUFJLEVBQzNELEdBQUksSUFBT0YsRUFDUCxPQUFPQSxFQUNGLElBQU9FLElBQ1osRUFBSyxJQUFNLE1BQ2YsSUFBTSxFQUFLLE1BQU0sRUFBWSxRQUFTLEVBQUssTUFBTyxFQUFTLENBQUksRUFDL0QsR0FBSSxJQUFPRixFQUNQLE9BQU9BLEVBQ0YsSUFBT0UsSUFDWixFQUFLLE1BQVEsS0FDckIsQ0FDSixDQUNBLE9BQU8sQ0FDWCxDQUNBLFNBQVMsR0FBWSxFQUFTLENBaUIxQixPQWhCSSxPQUFPLEdBQVksV0FDbEIsRUFBUSxZQUFjLEVBQVEsTUFBUSxFQUFRLE9BQ3hDLE9BQU8sT0FBTyxDQUNqQixNQUFPLEVBQVEsS0FDZixJQUFLLEVBQVEsS0FDYixPQUFRLEVBQVEsS0FDaEIsSUFBSyxFQUFRLElBQ2pCLEVBQUcsRUFBUSxPQUFTLENBQ2hCLElBQUssRUFBUSxNQUNiLE9BQVEsRUFBUSxNQUNoQixJQUFLLEVBQVEsS0FDakIsRUFBRyxFQUFRLFlBQWMsQ0FDckIsSUFBSyxFQUFRLFdBQ2IsSUFBSyxFQUFRLFVBQ2pCLEVBQUcsQ0FBTyxFQUVQLENBQ1gsQ0FDQSxTQUFTLEdBQVksRUFBSyxFQUFNLEVBQVMsRUFBTSxDQUMzQyxHQUFJLE9BQU8sR0FBWSxXQUNuQixPQUFPLEVBQVEsRUFBSyxFQUFNLENBQUksRUFDbEMsR0FBSSxHQUFNLENBQUksRUFDVixPQUFPLEVBQVEsTUFBTSxFQUFLLEVBQU0sQ0FBSSxFQUN4QyxHQUFJLEdBQU0sQ0FBSSxFQUNWLE9BQU8sRUFBUSxNQUFNLEVBQUssRUFBTSxDQUFJLEVBQ3hDLEdBQUksRUFBTyxDQUFJLEVBQ1gsT0FBTyxFQUFRLE9BQU8sRUFBSyxFQUFNLENBQUksRUFDekMsR0FBSUcsRUFBUyxDQUFJLEVBQ2IsT0FBTyxFQUFRLFNBQVMsRUFBSyxFQUFNLENBQUksRUFDM0MsR0FBSSxFQUFRLENBQUksRUFDWixPQUFPLEVBQVEsUUFBUSxFQUFLLEVBQU0sQ0FBSSxDQUU5QyxDQUNBLFNBQVMsR0FBWSxFQUFLLEVBQU0sRUFBTSxDQUNsQyxJQUFNLEVBQVMsRUFBSyxFQUFLLE9BQVMsR0FDbEMsR0FBSUQsRUFBYSxDQUFNLEVBQ25CLEVBQU8sTUFBTSxHQUFPLE9BRW5CLEdBQUksRUFBTyxDQUFNLEVBQ2QsSUFBUSxNQUNSLEVBQU8sSUFBTSxFQUViLEVBQU8sTUFBUSxPQUVsQixHQUFJLEVBQVcsQ0FBTSxFQUN0QixFQUFPLFNBQVcsTUFFakIsQ0FDRCxJQUFNLEVBQUssRUFBUSxDQUFNLEVBQUksUUFBVSxTQUN2QyxNQUFVLE1BQU0sNEJBQTRCLEVBQUcsUUFBUSxDQUMzRCxDQUNKLENDbk9BLE1BQU0sR0FBYyxDQUNoQixJQUFLLE1BQ0wsSUFBSyxNQUNMLElBQUssTUFDTCxJQUFLLE1BQ0wsSUFBSyxNQUNMLElBQUssS0FDVCxFQUNNLEdBQWlCLEdBQU8sRUFBRyxRQUFRLGFBQWMsR0FBTSxHQUFZLEVBQUcsRUFDNUUsSUFBTSxFQUFOLE1BQU0sQ0FBVyxDQUNiLFlBQVksRUFBTSxFQUFNLENBS3BCLEtBQUssU0FBVyxLQUVoQixLQUFLLE9BQVMsR0FDZCxLQUFLLEtBQU8sT0FBTyxPQUFPLENBQUMsRUFBRyxFQUFXLFlBQWEsQ0FBSSxFQUMxRCxLQUFLLEtBQU8sT0FBTyxPQUFPLENBQUMsRUFBRyxFQUFXLFlBQWEsQ0FBSSxDQUM5RCxDQUNBLE9BQVEsQ0FDSixJQUFNLEVBQU8sSUFBSSxFQUFXLEtBQUssS0FBTSxLQUFLLElBQUksRUFFaEQsTUFEQSxHQUFLLFNBQVcsS0FBSyxTQUNkLENBQ1gsQ0FLQSxZQUFhLENBQ1QsSUFBTSxFQUFNLElBQUksRUFBVyxLQUFLLEtBQU0sS0FBSyxJQUFJLEVBQy9DLE9BQVEsS0FBSyxLQUFLLFFBQWxCLENBQ0ksSUFBSyxNQUNELEtBQUssZUFBaUIsR0FDdEIsTUFDSixJQUFLLE1BQ0QsS0FBSyxlQUFpQixHQUN0QixLQUFLLEtBQU8sQ0FDUixTQUFVLEVBQVcsWUFBWSxTQUNqQyxRQUFTLEtBQ2IsRUFDQSxLQUFLLEtBQU8sT0FBTyxPQUFPLENBQUMsRUFBRyxFQUFXLFdBQVcsQ0FFNUQsQ0FDQSxPQUFPLENBQ1gsQ0FLQSxJQUFJLEVBQU0sRUFBUyxDQUNmLEFBR0ksS0FBSyxrQkFGTCxLQUFLLEtBQU8sQ0FBRSxTQUFVLEVBQVcsWUFBWSxTQUFVLFFBQVMsS0FBTSxFQUN4RSxLQUFLLEtBQU8sT0FBTyxPQUFPLENBQUMsRUFBRyxFQUFXLFdBQVcsRUFDOUIsSUFFMUIsSUFBTSxFQUFRLEVBQUssS0FBSyxDQUFDLENBQUMsTUFBTSxRQUFRLEVBQ2xDLEVBQU8sRUFBTSxNQUFNLEVBQ3pCLE9BQVEsRUFBUixDQUNJLElBQUssT0FBUSxDQUNULEdBQUksRUFBTSxTQUFXLElBQ2pCLEVBQVEsRUFBRyxpREFBaUQsRUFDeEQsRUFBTSxPQUFTLEdBQ2YsTUFBTyxHQUVmLEdBQU0sQ0FBQyxFQUFRLEdBQVUsRUFFekIsTUFEQSxNQUFLLEtBQUssR0FBVSxFQUNiLEVBQ1gsQ0FDQSxJQUFLLFFBQVMsQ0FFVixHQURBLEtBQUssS0FBSyxTQUFXLEdBQ2pCLEVBQU0sU0FBVyxFQUVqQixPQURBLEVBQVEsRUFBRyxpREFBaUQsRUFDckQsR0FFWCxHQUFNLENBQUMsR0FBVyxFQUNsQixHQUFJLElBQVksT0FBUyxJQUFZLE1BRWpDLE1BREEsTUFBSyxLQUFLLFFBQVUsRUFDYixHQUVOLENBQ0QsSUFBTSxFQUFVLGFBQWEsS0FBSyxDQUFPLEVBRXpDLE9BREEsRUFBUSxFQUFHLDRCQUE0QixJQUFXLENBQU8sRUFDbEQsRUFDWCxDQUNKLENBQ0EsUUFFSSxPQURBLEVBQVEsRUFBRyxxQkFBcUIsSUFBUSxFQUFJLEVBQ3JDLEVBQ2YsQ0FDSixDQU9BLFFBQVEsRUFBUSxFQUFTLENBQ3JCLEdBQUksSUFBVyxJQUNYLE1BQU8sSUFDWCxHQUFJLEVBQU8sS0FBTyxJQUVkLE9BREEsRUFBUSxvQkFBb0IsR0FBUSxFQUM3QixLQUVYLEdBQUksRUFBTyxLQUFPLElBQUssQ0FDbkIsSUFBTSxFQUFXLEVBQU8sTUFBTSxFQUFHLEVBQUUsRUFPbkMsT0FOSSxJQUFhLEtBQU8sSUFBYSxNQUNqQyxFQUFRLHFDQUFxQyxFQUFPLGFBQWEsRUFDMUQsT0FFUCxFQUFPLEVBQU8sT0FBUyxLQUFPLEtBQzlCLEVBQVEsaUNBQWlDLEVBQ3RDLEVBQ1gsQ0FDQSxHQUFNLEVBQUcsRUFBUSxHQUFVLEVBQU8sTUFBTSxpQkFBaUIsRUFDcEQsR0FDRCxFQUFRLE9BQU8sRUFBTyxtQkFBbUIsRUFDN0MsSUFBTSxFQUFTLEtBQUssS0FBSyxHQUN6QixHQUFJLEVBQ0EsR0FBSSxDQUNBLE9BQU8sRUFBUyxtQkFBbUIsQ0FBTSxDQUM3QyxPQUNPLEVBQU8sQ0FFVixPQURBLEVBQVEsT0FBTyxDQUFLLENBQUMsRUFDZCxJQUNYLENBS0osT0FISSxJQUFXLElBQ0osR0FDWCxFQUFRLDBCQUEwQixHQUFRLEVBQ25DLEtBQ1gsQ0FLQSxVQUFVLEVBQUssQ0FDWCxJQUFLLEdBQU0sQ0FBQyxFQUFRLEtBQVcsT0FBTyxRQUFRLEtBQUssSUFBSSxFQUNuRCxHQUFJLEVBQUksV0FBVyxDQUFNLEVBQ3JCLE9BQU8sRUFBUyxHQUFjLEVBQUksVUFBVSxFQUFPLE1BQU0sQ0FBQyxFQUVsRSxPQUFPLEVBQUksS0FBTyxJQUFNLEVBQU0sS0FBSyxFQUFJLEVBQzNDLENBQ0EsU0FBUyxFQUFLLENBQ1YsSUFBTSxFQUFRLEtBQUssS0FBSyxTQUNsQixDQUFDLFNBQVMsS0FBSyxLQUFLLFNBQVcsT0FBTyxFQUN0QyxDQUFDLEVBQ0QsRUFBYSxPQUFPLFFBQVEsS0FBSyxJQUFJLEVBQ3ZDLEVBQ0osR0FBSSxHQUFPLEVBQVcsT0FBUyxHQUFLLEVBQU8sRUFBSSxRQUFRLEVBQUcsQ0FDdEQsSUFBTSxFQUFPLENBQUMsRUFDZCxFQUFNLEVBQUksVUFBVyxFQUFNLElBQVMsQ0FDNUIsRUFBTyxDQUFJLEdBQUssRUFBSyxNQUNyQixFQUFLLEVBQUssS0FBTyxHQUN6QixDQUFDLEVBQ0QsRUFBVyxPQUFPLEtBQUssQ0FBSSxDQUMvQixLQUVJLEdBQVcsQ0FBQyxFQUNoQixJQUFLLEdBQU0sQ0FBQyxFQUFRLEtBQVcsR0FDdkIsSUFBVyxNQUFRLElBQVcsd0JBRTlCLENBQUMsR0FBTyxFQUFTLEtBQUssR0FBTSxFQUFHLFdBQVcsQ0FBTSxDQUFDLElBQ2pELEVBQU0sS0FBSyxRQUFRLEVBQU8sR0FBRyxHQUFRLEVBRTdDLE9BQU8sRUFBTSxLQUFLO0NBQUksQ0FDMUIsQ0FDSixFQUNBLEVBQVcsWUFBYyxDQUFFLFNBQVUsR0FBTyxRQUFTLEtBQU0sRUFDM0QsRUFBVyxZQUFjLENBQUUsS0FBTSxvQkFBcUIsRUNyS3RELFNBQVMsR0FBYyxFQUFRLENBQzNCLEdBQUksc0JBQXNCLEtBQUssQ0FBTSxFQUFHLENBRXBDLElBQU0sRUFBTSw2REFERCxLQUFLLFVBQVUsQ0FDZ0QsSUFDMUUsTUFBVSxNQUFNLENBQUcsQ0FDdkIsQ0FDQSxNQUFPLEVBQ1gsQ0FDQSxTQUFTLEdBQVksRUFBTSxDQUN2QixJQUFNLEVBQVUsSUFBSSxJQU9wQixPQU5BLEVBQU0sRUFBTSxDQUNSLE1BQU0sRUFBTSxFQUFNLENBQ1YsRUFBSyxRQUNMLEVBQVEsSUFBSSxFQUFLLE1BQU0sQ0FDL0IsQ0FDSixDQUFDLEVBQ00sQ0FDWCxDQUVBLFNBQVMsR0FBYyxFQUFRLEVBQVMsQ0FDcEMsSUFBSyxJQUFJLEVBQUksR0FBUyxFQUFFLEVBQUcsQ0FDdkIsSUFBTSxFQUFPLEdBQUcsSUFBUyxJQUN6QixHQUFJLENBQUMsRUFBUSxJQUFJLENBQUksRUFDakIsT0FBTyxDQUNmLENBQ0osQ0FDQSxTQUFTLEdBQWtCLEVBQUssRUFBUSxDQUNwQyxJQUFNLEVBQWUsQ0FBQyxFQUNoQixFQUFnQixJQUFJLElBQ3RCLEVBQWMsS0FDbEIsTUFBTyxDQUNILFNBQVcsR0FBVyxDQUNsQixFQUFhLEtBQUssQ0FBTSxFQUN4QixBQUFnQixJQUFjLEdBQVksQ0FBRyxFQUM3QyxJQUFNLEVBQVMsR0FBYyxFQUFRLENBQVcsRUFFaEQsT0FEQSxFQUFZLElBQUksQ0FBTSxFQUNmLENBQ1gsRUFNQSxlQUFrQixDQUNkLElBQUssSUFBTSxLQUFVLEVBQWMsQ0FDL0IsSUFBTSxFQUFNLEVBQWMsSUFBSSxDQUFNLEVBQ3BDLEdBQUksT0FBTyxHQUFRLFVBQ2YsRUFBSSxTQUNIRSxFQUFTLEVBQUksSUFBSSxHQUFLQyxFQUFhLEVBQUksSUFBSSxHQUM1QyxFQUFJLEtBQUssT0FBUyxFQUFJLFdBRXJCLENBQ0QsSUFBTSxFQUFZLE1BQU0sNERBQTRELEVBRXBGLEtBREEsR0FBTSxPQUFTLEVBQ1QsQ0FDVixDQUNKLENBQ0osRUFDQSxlQUNKLENBQ0osQ0M3REEsU0FBUyxHQUFhLEVBQVMsRUFBSyxFQUFLLEVBQUssQ0FDMUMsR0FBSSxHQUFPLE9BQU8sR0FBUSxTQUFVLENBQ2hDLEdBQUksTUFBTSxRQUFRLENBQUcsRUFDakIsSUFBSyxJQUFJLEVBQUksRUFBRyxFQUFNLEVBQUksT0FBUSxFQUFJLEVBQUssRUFBRSxFQUFHLENBQzVDLElBQU0sRUFBSyxFQUFJLEdBQ1QsRUFBSyxHQUFhLEVBQVMsRUFBSyxPQUFPLENBQUMsRUFBRyxDQUFFLEVBRS9DLElBQU8sSUFBQSxHQUNQLE9BQU8sRUFBSSxHQUNOLElBQU8sSUFDWixFQUFJLEdBQUssRUFDakIsTUFFQyxHQUFJLGFBQWUsSUFDcEIsSUFBSyxJQUFNLEtBQUssTUFBTSxLQUFLLEVBQUksS0FBSyxDQUFDLEVBQUcsQ0FDcEMsSUFBTSxFQUFLLEVBQUksSUFBSSxDQUFDLEVBQ2QsRUFBSyxHQUFhLEVBQVMsRUFBSyxFQUFHLENBQUUsRUFDdkMsSUFBTyxJQUFBLEdBQ1AsRUFBSSxPQUFPLENBQUMsRUFDUCxJQUFPLEdBQ1osRUFBSSxJQUFJLEVBQUcsQ0FBRSxDQUNyQixNQUVDLEdBQUksYUFBZSxJQUNwQixJQUFLLElBQU0sS0FBTSxNQUFNLEtBQUssQ0FBRyxFQUFHLENBQzlCLElBQU0sRUFBSyxHQUFhLEVBQVMsRUFBSyxFQUFJLENBQUUsRUFDeEMsSUFBTyxJQUFBLEdBQ1AsRUFBSSxPQUFPLENBQUUsRUFDUixJQUFPLElBQ1osRUFBSSxPQUFPLENBQUUsRUFDYixFQUFJLElBQUksQ0FBRSxFQUVsQixNQUdBLElBQUssR0FBTSxDQUFDLEVBQUcsS0FBTyxPQUFPLFFBQVEsQ0FBRyxFQUFHLENBQ3ZDLElBQU0sRUFBSyxHQUFhLEVBQVMsRUFBSyxFQUFHLENBQUUsRUFDdkMsSUFBTyxJQUFBLEdBQ1AsT0FBTyxFQUFJLEdBQ04sSUFBTyxJQUNaLEVBQUksR0FBSyxFQUNqQixDQUVSLENBQ0EsT0FBTyxFQUFRLEtBQUssRUFBSyxFQUFLLENBQUcsQ0FDckMsQ0N4Q0EsU0FBUyxFQUFLLEVBQU8sRUFBSyxFQUFLLENBRTNCLEdBQUksTUFBTSxRQUFRLENBQUssRUFDbkIsT0FBTyxFQUFNLEtBQUssRUFBRyxJQUFNLEVBQUssRUFBRyxPQUFPLENBQUMsRUFBRyxDQUFHLENBQUMsRUFDdEQsR0FBSSxHQUFTLE9BQU8sRUFBTSxRQUFXLFdBQVksQ0FFN0MsR0FBSSxDQUFDLEdBQU8sQ0FBQyxHQUFVLENBQUssRUFDeEIsT0FBTyxFQUFNLE9BQU8sRUFBSyxDQUFHLEVBQ2hDLElBQU0sRUFBTyxDQUFFLFdBQVksRUFBRyxNQUFPLEVBQUcsSUFBSyxJQUFBLEVBQVUsRUFDdkQsRUFBSSxRQUFRLElBQUksRUFBTyxDQUFJLEVBQzNCLEVBQUksU0FBVyxHQUFPLENBQ2xCLEVBQUssSUFBTSxFQUNYLE9BQU8sRUFBSSxRQUNmLEVBQ0EsSUFBTSxFQUFNLEVBQU0sT0FBTyxFQUFLLENBQUcsRUFHakMsT0FGSSxFQUFJLFVBQ0osRUFBSSxTQUFTLENBQUcsRUFDYixDQUNYLENBR0EsT0FGSSxPQUFPLEdBQVUsVUFBWSxDQUFDLEdBQUssS0FDNUIsT0FBTyxDQUFLLEVBQ2hCLENBQ1gsQ0M5QkEsSUFBTSxHQUFOLEtBQWUsQ0FDWCxZQUFZLEVBQU0sQ0FDZCxPQUFPLGVBQWUsS0FBTSxFQUFXLENBQUUsTUFBTyxDQUFLLENBQUMsQ0FDMUQsQ0FFQSxPQUFRLENBQ0osSUFBTSxFQUFPLE9BQU8sT0FBTyxPQUFPLGVBQWUsSUFBSSxFQUFHLE9BQU8sMEJBQTBCLElBQUksQ0FBQyxFQUc5RixPQUZJLEtBQUssUUFDTCxFQUFLLE1BQVEsS0FBSyxNQUFNLE1BQU0sR0FDM0IsQ0FDWCxDQUVBLEtBQUssRUFBSyxDQUFFLFdBQVUsZ0JBQWUsV0FBVSxXQUFZLENBQUMsRUFBRyxDQUMzRCxHQUFJLENBQUMsRUFBVyxDQUFHLEVBQ2YsTUFBVSxVQUFVLGlDQUFpQyxFQUN6RCxJQUFNLEVBQU0sQ0FDUixRQUFTLElBQUksSUFDYixNQUNBLEtBQU0sR0FDTixTQUFVLElBQWEsR0FDdkIsYUFBYyxHQUNkLGNBQWUsT0FBTyxHQUFrQixTQUFXLEVBQWdCLEdBQ3ZFLEVBQ00sRUFBTSxFQUFLLEtBQU0sR0FBSSxDQUFHLEVBQzlCLEdBQUksT0FBTyxHQUFhLFdBQ3BCLElBQUssR0FBTSxDQUFFLFFBQU8sU0FBUyxFQUFJLFFBQVEsT0FBTyxFQUM1QyxFQUFTLEVBQUssQ0FBSyxFQUMzQixPQUFPLE9BQU8sR0FBWSxXQUNwQixHQUFhLEVBQVMsQ0FBRSxHQUFJLENBQUksRUFBRyxHQUFJLENBQUcsRUFDMUMsQ0FDVixDQUNKLEVDN0JNLEdBQU4sY0FBb0IsRUFBUyxDQUN6QixZQUFZLEVBQVEsQ0FDaEIsTUFBTSxDQUFLLEVBQ1gsS0FBSyxPQUFTLEVBQ2QsT0FBTyxlQUFlLEtBQU0sTUFBTyxDQUMvQixLQUFNLENBQ0YsTUFBVSxNQUFNLDhCQUE4QixDQUNsRCxDQUNKLENBQUMsQ0FDTCxDQUtBLFFBQVEsRUFBSyxFQUFLLENBQ2QsR0FBSSxHQUFLLGdCQUFrQixFQUN2QixNQUFVLGVBQWUsOEJBQThCLEVBQzNELElBQUksRUFDQSxHQUFLLGtCQUNMLEVBQVEsRUFBSSxtQkFHWixFQUFRLENBQUMsRUFDVCxFQUFNLEVBQUssQ0FDUCxNQUFPLEVBQU0sSUFBUyxFQUNkLEVBQVEsQ0FBSSxHQUFLLEdBQVUsQ0FBSSxJQUMvQixFQUFNLEtBQUssQ0FBSSxDQUN2QixDQUNKLENBQUMsRUFDRyxJQUNBLEVBQUksa0JBQW9CLElBRWhDLElBQUksRUFDSixJQUFLLElBQU0sS0FBUSxFQUFPLENBQ3RCLEdBQUksSUFBUyxLQUNULE1BQ0EsRUFBSyxTQUFXLEtBQUssU0FDckIsRUFBUSxFQUNoQixDQUNBLEdBQUksR0FBUyxFQUFLLENBQ2QsR0FBTSxDQUFFLFVBQVMsTUFBSyxpQkFBa0IsRUFDcEMsRUFBTyxFQUFRLElBQUksQ0FBSyxFQU81QixHQU5BLEFBR0ksS0FEQSxFQUFLLEVBQU8sS0FBTSxDQUFHLEVBQ2QsRUFBUSxJQUFJLENBQUssR0FHeEIsR0FBTSxNQUFRLElBQUEsR0FFZCxNQUFVLGVBQWUsd0RBQUcsRUFFaEMsR0FBSSxHQUFpQixJQUNqQixFQUFLLE9BQVMsRUFDVixFQUFLLGFBQWUsSUFDcEIsRUFBSyxXQUFhLEdBQWMsRUFBSyxFQUFPLENBQU8sR0FDbkQsRUFBSyxNQUFRLEVBQUssV0FBYSxHQUUvQixNQUFVLGVBQWUsOERBQUcsQ0FHeEMsQ0FDQSxPQUFPLENBQ1gsQ0FDQSxPQUFPLEVBQU0sRUFBSyxDQUNkLEdBQUksQ0FBQyxFQUNELE1BQU8sQ0FBRSxPQUFRLEtBQUssTUFBTyxFQUNqQyxJQUFNLEVBQVMsS0FBSyxRQUFRLEVBQUksSUFBSyxDQUFHLEVBQ3hDLEdBQUksQ0FBQyxFQUFRLENBQ1QsSUFBTSxFQUFNLCtEQUErRCxLQUFLLFNBQ2hGLE1BQVUsZUFBZSxDQUFHLENBQ2hDLENBQ0EsT0FBTyxFQUFJLFFBQVEsSUFBSSxDQUFNLENBQUMsQ0FBQyxHQUNuQyxDQUNBLFNBQVMsRUFBSyxFQUFZLEVBQWMsQ0FDcEMsSUFBTSxFQUFNLElBQUksS0FBSyxTQUNyQixHQUFJLEVBQUssQ0FFTCxHQURBLEdBQWMsS0FBSyxNQUFNLEVBQ3JCLEVBQUksUUFBUSxrQkFBb0IsQ0FBQyxFQUFJLFFBQVEsSUFBSSxLQUFLLE1BQU0sRUFBRyxDQUMvRCxJQUFNLEVBQU0sK0RBQStELEtBQUssU0FDaEYsTUFBVSxNQUFNLENBQUcsQ0FDdkIsQ0FDQSxHQUFJLEVBQUksWUFDSixNQUFPLEdBQUcsRUFBSSxFQUN0QixDQUNBLE9BQU8sQ0FDWCxDQUNKLEVBQ0EsU0FBUyxHQUFjLEVBQUssRUFBTSxFQUFTLENBQ3ZDLEdBQUksRUFBUSxDQUFJLEVBQUcsQ0FDZixJQUFNLEVBQVMsRUFBSyxRQUFRLENBQUcsRUFDekIsRUFBUyxHQUFXLEdBQVUsRUFBUSxJQUFJLENBQU0sRUFDdEQsT0FBTyxFQUFTLEVBQU8sTUFBUSxFQUFPLFdBQWEsQ0FDdkQsQ0FDSyxHQUFJQyxFQUFhLENBQUksRUFBRyxDQUN6QixJQUFJLEVBQVEsRUFDWixJQUFLLElBQU0sS0FBUSxFQUFLLE1BQU8sQ0FDM0IsSUFBTSxFQUFJLEdBQWMsRUFBSyxFQUFNLENBQU8sRUFDdEMsRUFBSSxJQUNKLEVBQVEsRUFDaEIsQ0FDQSxPQUFPLENBQ1gsQ0FDSyxHQUFJLEVBQU8sQ0FBSSxFQUFHLENBQ25CLElBQU0sRUFBSyxHQUFjLEVBQUssRUFBSyxJQUFLLENBQU8sRUFDekMsRUFBSyxHQUFjLEVBQUssRUFBSyxNQUFPLENBQU8sRUFDakQsT0FBTyxLQUFLLElBQUksRUFBSSxDQUFFLENBQzFCLENBQ0EsTUFBTyxFQUNYLENDL0dBLE1BQU0sR0FBaUIsR0FBVSxDQUFDLEdBQVUsT0FBTyxHQUFVLFlBQWMsT0FBTyxHQUFVLFNBQzVGLElBQU0sRUFBTixjQUFxQixFQUFTLENBQzFCLFlBQVksRUFBTyxDQUNmLE1BQU1DLENBQU0sRUFDWixLQUFLLE1BQVEsQ0FDakIsQ0FDQSxPQUFPLEVBQUssRUFBSyxDQUNiLE9BQU8sR0FBSyxLQUFPLEtBQUssTUFBUSxFQUFLLEtBQUssTUFBTyxFQUFLLENBQUcsQ0FDN0QsQ0FDQSxVQUFXLENBQ1AsT0FBTyxPQUFPLEtBQUssS0FBSyxDQUM1QixDQUNKLEVBQ0EsRUFBTyxhQUFlLGVBQ3RCLEVBQU8sY0FBZ0IsZ0JBQ3ZCLEVBQU8sTUFBUSxRQUNmLEVBQU8sYUFBZSxlQUN0QixFQUFPLGFBQWUsZUNoQnRCLFNBQVMsR0FBYyxFQUFPLEVBQVMsRUFBTSxDQUN6QyxHQUFJLEVBQVMsQ0FDVCxJQUFNLEVBQVEsRUFBSyxPQUFPLEdBQUssRUFBRSxNQUFRLENBQU8sRUFDMUMsRUFBUyxFQUFNLEtBQUssR0FBSyxDQUFDLEVBQUUsTUFBTSxHQUFLLEVBQU0sR0FDbkQsR0FBSSxDQUFDLEVBQ0QsTUFBVSxNQUFNLE9BQU8sRUFBUSxXQUFXLEVBQzlDLE9BQU8sQ0FDWCxDQUNBLE9BQU8sRUFBSyxLQUFLLEdBQUssRUFBRSxXQUFXLENBQUssR0FBSyxDQUFDLEVBQUUsTUFBTSxDQUMxRCxDQUNBLFNBQVMsR0FBVyxFQUFPLEVBQVMsRUFBSyxDQUdyQyxHQUZJLEVBQVcsQ0FBSyxJQUNoQixFQUFRLEVBQU0sVUFDZCxFQUFPLENBQUssRUFDWixPQUFPLEVBQ1gsR0FBSSxFQUFPLENBQUssRUFBRyxDQUNmLElBQU0sRUFBTSxFQUFJLE9BQU8sRUFBSSxDQUFDLGFBQWEsRUFBSSxPQUFRLEtBQU0sQ0FBRyxFQUU5RCxPQURBLEVBQUksTUFBTSxLQUFLLENBQUssRUFDYixDQUNYLEVBQ0ksYUFBaUIsUUFDakIsYUFBaUIsUUFDakIsYUFBaUIsU0FDaEIsT0FBTyxPQUFXLEtBQWUsYUFBaUIsVUFHbkQsRUFBUSxFQUFNLFFBQVEsR0FFMUIsR0FBTSxDQUFFLHdCQUF1QixXQUFVLFdBQVUsU0FBUSxpQkFBa0IsRUFHekUsRUFDSixHQUFJLEdBQXlCLEdBQVMsT0FBTyxHQUFVLFNBQVUsQ0FFN0QsR0FEQSxFQUFNLEVBQWMsSUFBSSxDQUFLLEVBQ3pCLEVBRUEsT0FEQSxFQUFJLFNBQVcsRUFBSSxPQUFTLEVBQVMsQ0FBSyxHQUNuQyxJQUFJLEdBQU0sRUFBSSxNQUFNLEVBRzNCLEVBQU0sQ0FBRSxPQUFRLEtBQU0sS0FBTSxJQUFLLEVBQ2pDLEVBQWMsSUFBSSxFQUFPLENBQUcsQ0FFcEMsQ0FDSSxHQUFTLFdBQVcsSUFBSSxJQUN4QixFQUFVLHFCQUFtQixFQUFRLE1BQU0sQ0FBQyxHQUNoRCxJQUFJLEVBQVMsR0FBYyxFQUFPLEVBQVMsRUFBTyxJQUFJLEVBQ3RELEdBQUksQ0FBQyxFQUFRLENBS1QsR0FKSSxHQUFTLE9BQU8sRUFBTSxRQUFXLGFBRWpDLEVBQVEsRUFBTSxPQUFPLEdBRXJCLENBQUMsR0FBUyxPQUFPLEdBQVUsU0FBVSxDQUNyQyxJQUFNLEVBQU8sSUFBSSxFQUFPLENBQUssRUFHN0IsT0FGSSxJQUNBLEVBQUksS0FBTyxHQUNSLENBQ1gsQ0FDQSxFQUNJLGFBQWlCLElBQ1gsRUFBTyxHQUNQLE9BQU8sWUFBWSxPQUFPLENBQUssRUFDM0IsRUFBTyxJQUNQLEVBQU8sRUFDekIsQ0FDSSxJQUNBLEVBQVMsQ0FBTSxFQUNmLE9BQU8sRUFBSSxVQUVmLElBQU0sRUFBTyxHQUFRLFdBQ2YsRUFBTyxXQUFXLEVBQUksT0FBUSxFQUFPLENBQUcsRUFDeEMsT0FBTyxHQUFRLFdBQVcsTUFBUyxXQUMvQixFQUFPLFVBQVUsS0FBSyxFQUFJLE9BQVEsRUFBTyxDQUFHLEVBQzVDLElBQUksRUFBTyxDQUFLLEVBTzFCLE9BTkksRUFDQSxFQUFLLElBQU0sRUFDTCxFQUFPLFVBQ2IsRUFBSyxJQUFNLEVBQU8sS0FDbEIsSUFDQSxFQUFJLEtBQU8sR0FDUixDQUNYLENDakZBLFNBQVMsR0FBbUIsRUFBUSxFQUFNLEVBQU8sQ0FDN0MsSUFBSSxFQUFJLEVBQ1IsSUFBSyxJQUFJLEVBQUksRUFBSyxPQUFTLEVBQUcsR0FBSyxFQUFHLEVBQUUsRUFBRyxDQUN2QyxJQUFNLEVBQUksRUFBSyxHQUNmLEdBQUksT0FBTyxHQUFNLFVBQVksT0FBTyxVQUFVLENBQUMsR0FBSyxHQUFLLEVBQUcsQ0FDeEQsSUFBTSxFQUFJLENBQUMsRUFDWCxFQUFFLEdBQUssRUFDUCxFQUFJLENBQ1IsS0FFSSxHQUFJLElBQUksSUFBSSxDQUFDLENBQUMsRUFBRyxDQUFDLENBQUMsQ0FBQyxDQUU1QixDQUNBLE9BQU8sR0FBVyxFQUFHLElBQUEsR0FBVyxDQUM1QixzQkFBdUIsR0FDdkIsY0FBZSxHQUNmLGFBQWdCLENBQ1osTUFBVSxNQUFNLDhDQUE4QyxDQUNsRSxFQUNBLFNBQ0EsY0FBZSxJQUFJLEdBQ3ZCLENBQUMsQ0FDTCxDQUdBLE1BQU0sR0FBZSxHQUFTLEdBQVEsTUFDakMsT0FBTyxHQUFTLFVBQVksQ0FBQyxDQUFDLEVBQUssT0FBTyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQ2xFLElBQU0sR0FBTixjQUF5QixFQUFTLENBQzlCLFlBQVksRUFBTSxFQUFRLENBQ3RCLE1BQU0sQ0FBSSxFQUNWLE9BQU8sZUFBZSxLQUFNLFNBQVUsQ0FDbEMsTUFBTyxFQUNQLGFBQWMsR0FDZCxXQUFZLEdBQ1osU0FBVSxFQUNkLENBQUMsQ0FDTCxDQU1BLE1BQU0sRUFBUSxDQUNWLElBQU0sRUFBTyxPQUFPLE9BQU8sT0FBTyxlQUFlLElBQUksRUFBRyxPQUFPLDBCQUEwQixJQUFJLENBQUMsRUFNOUYsT0FMSSxJQUNBLEVBQUssT0FBUyxHQUNsQixFQUFLLE1BQVEsRUFBSyxNQUFNLElBQUksR0FBTSxFQUFPLENBQUUsR0FBSyxFQUFPLENBQUUsRUFBSSxFQUFHLE1BQU0sQ0FBTSxFQUFJLENBQUUsRUFDOUUsS0FBSyxRQUNMLEVBQUssTUFBUSxLQUFLLE1BQU0sTUFBTSxHQUMzQixDQUNYLENBTUEsTUFBTSxFQUFNLEVBQU8sQ0FDZixHQUFJLEdBQVksQ0FBSSxFQUNoQixLQUFLLElBQUksQ0FBSyxNQUNiLENBQ0QsR0FBTSxDQUFDLEVBQUssR0FBRyxHQUFRLEVBQ2pCLEVBQU8sS0FBSyxJQUFJLEVBQUssRUFBSSxFQUMvQixHQUFJQyxFQUFhLENBQUksRUFDakIsRUFBSyxNQUFNLEVBQU0sQ0FBSyxPQUNyQixHQUFJLElBQVMsSUFBQSxJQUFhLEtBQUssT0FDaEMsS0FBSyxJQUFJLEVBQUssR0FBbUIsS0FBSyxPQUFRLEVBQU0sQ0FBSyxDQUFDLE9BRTFELE1BQVUsTUFBTSwrQkFBK0IsRUFBSSxvQkFBb0IsR0FBTSxDQUNyRixDQUNKLENBS0EsU0FBUyxFQUFNLENBQ1gsR0FBTSxDQUFDLEVBQUssR0FBRyxHQUFRLEVBQ3ZCLEdBQUksRUFBSyxTQUFXLEVBQ2hCLE9BQU8sS0FBSyxPQUFPLENBQUcsRUFDMUIsSUFBTSxFQUFPLEtBQUssSUFBSSxFQUFLLEVBQUksRUFDL0IsR0FBSUEsRUFBYSxDQUFJLEVBQ2pCLE9BQU8sRUFBSyxTQUFTLENBQUksRUFFekIsTUFBVSxNQUFNLCtCQUErQixFQUFJLG9CQUFvQixHQUFNLENBQ3JGLENBTUEsTUFBTSxFQUFNLEVBQVksQ0FDcEIsR0FBTSxDQUFDLEVBQUssR0FBRyxHQUFRLEVBQ2pCLEVBQU8sS0FBSyxJQUFJLEVBQUssRUFBSSxFQUkzQixPQUhBLEVBQUssU0FBVyxFQUNULENBQUMsR0FBY0MsRUFBUyxDQUFJLEVBQUksRUFBSyxNQUFRLEVBRTdDRCxFQUFhLENBQUksRUFBSSxFQUFLLE1BQU0sRUFBTSxDQUFVLEVBQUksSUFBQSxFQUNuRSxDQUNBLGlCQUFpQixFQUFhLENBQzFCLE9BQU8sS0FBSyxNQUFNLE1BQU0sR0FBUSxDQUM1QixHQUFJLENBQUMsRUFBTyxDQUFJLEVBQ1osTUFBTyxHQUNYLElBQU0sRUFBSSxFQUFLLE1BQ2YsT0FBUSxHQUFLLE1BQ1IsR0FDR0MsRUFBUyxDQUFDLEdBQ1YsRUFBRSxPQUFTLE1BQ1gsQ0FBQyxFQUFFLGVBQ0gsQ0FBQyxFQUFFLFNBQ0gsQ0FBQyxFQUFFLEdBQ2YsQ0FBQyxDQUNMLENBSUEsTUFBTSxFQUFNLENBQ1IsR0FBTSxDQUFDLEVBQUssR0FBRyxHQUFRLEVBQ3ZCLEdBQUksRUFBSyxTQUFXLEVBQ2hCLE9BQU8sS0FBSyxJQUFJLENBQUcsRUFDdkIsSUFBTSxFQUFPLEtBQUssSUFBSSxFQUFLLEVBQUksRUFDL0IsT0FBT0QsRUFBYSxDQUFJLEVBQUksRUFBSyxNQUFNLENBQUksRUFBSSxFQUNuRCxDQUtBLE1BQU0sRUFBTSxFQUFPLENBQ2YsR0FBTSxDQUFDLEVBQUssR0FBRyxHQUFRLEVBQ3ZCLEdBQUksRUFBSyxTQUFXLEVBQ2hCLEtBQUssSUFBSSxFQUFLLENBQUssTUFFbEIsQ0FDRCxJQUFNLEVBQU8sS0FBSyxJQUFJLEVBQUssRUFBSSxFQUMvQixHQUFJQSxFQUFhLENBQUksRUFDakIsRUFBSyxNQUFNLEVBQU0sQ0FBSyxPQUNyQixHQUFJLElBQVMsSUFBQSxJQUFhLEtBQUssT0FDaEMsS0FBSyxJQUFJLEVBQUssR0FBbUIsS0FBSyxPQUFRLEVBQU0sQ0FBSyxDQUFDLE9BRTFELE1BQVUsTUFBTSwrQkFBK0IsRUFBSSxvQkFBb0IsR0FBTSxDQUNyRixDQUNKLENBQ0osRUN6SUEsTUFBTSxHQUFvQixHQUFRLEVBQUksUUFBUSxrQkFBbUIsR0FBRyxFQUNwRSxTQUFTLEVBQWMsRUFBUyxFQUFRLENBR3BDLE1BRkksUUFBUSxLQUFLLENBQU8sRUFDYixFQUFRLFVBQVUsQ0FBQyxFQUN2QixFQUFTLEVBQVEsUUFBUSxhQUFjLENBQU0sRUFBSSxDQUM1RCxDQUNBLE1BQU0sR0FBZSxFQUFLLEVBQVEsSUFBWSxFQUFJLFNBQVM7Q0FBSSxFQUN6RCxFQUFjLEVBQVMsQ0FBTSxFQUM3QixFQUFRLFNBQVM7Q0FBSSxFQUNqQjtFQUFPLEVBQWMsRUFBUyxDQUFNLEdBQ25DLEVBQUksU0FBUyxHQUFHLEVBQUksR0FBSyxLQUFPLEVDakJyQyxHQUFZLE9BUWxCLFNBQVMsR0FBYyxFQUFNLEVBQVEsRUFBTyxPQUFRLENBQUUsZ0JBQWUsWUFBWSxHQUFJLGtCQUFrQixHQUFJLFNBQVEsY0FBZSxDQUFDLEVBQUcsQ0FDbEksR0FBSSxDQUFDLEdBQWEsRUFBWSxFQUMxQixPQUFPLEVBQ1AsRUFBWSxJQUNaLEVBQWtCLEdBQ3RCLElBQU0sRUFBVSxLQUFLLElBQUksRUFBSSxFQUFpQixFQUFJLEVBQVksRUFBTyxNQUFNLEVBQzNFLEdBQUksRUFBSyxRQUFVLEVBQ2YsT0FBTyxFQUNYLElBQU0sRUFBUSxDQUFDLEVBQ1QsRUFBZSxDQUFDLEVBQ2xCLEVBQU0sRUFBWSxFQUFPLE9BQ3pCLE9BQU8sR0FBa0IsV0FDckIsRUFBZ0IsRUFBWSxLQUFLLElBQUksRUFBRyxDQUFlLEVBQ3ZELEVBQU0sS0FBSyxDQUFDLEVBRVosRUFBTSxFQUFZLEdBRTFCLElBQUksRUFDQSxFQUNBLEVBQVcsR0FDWCxFQUFJLEdBQ0osRUFBVyxHQUNYLEVBQVMsR0FDVCxJQUFBLFVBQ0EsRUFBSSxHQUF5QixFQUFNLEVBQUcsRUFBTyxNQUFNLEVBQy9DLElBQU0sS0FDTixFQUFNLEVBQUksSUFFbEIsSUFBSyxJQUFJLEVBQUssRUFBSyxFQUFNLEdBQUssSUFBTyxDQUNqQyxHQUFJLElBQUEsVUFBd0IsSUFBTyxLQUFNLENBRXJDLE9BREEsRUFBVyxFQUNILEVBQUssRUFBSSxHQUFqQixDQUNJLElBQUssSUFDRCxHQUFLLEVBQ0wsTUFDSixJQUFLLElBQ0QsR0FBSyxFQUNMLE1BQ0osSUFBSyxJQUNELEdBQUssRUFDTCxNQUNKLFFBQ0ksR0FBSyxDQUNiLENBQ0EsRUFBUyxDQUNiLENBQ0EsR0FBSSxJQUFPO0VBQ0gsSUFBQSxVQUNBLEVBQUksR0FBeUIsRUFBTSxFQUFHLEVBQU8sTUFBTSxHQUN2RCxFQUFNLEVBQUksRUFBTyxPQUFTLEVBQzFCLEVBQVEsSUFBQSxPQUVQLENBQ0QsR0FBSSxJQUFPLEtBQ1AsR0FDQSxJQUFTLEtBQ1QsSUFBUztHQUNULElBQVMsSUFBTSxDQUVmLElBQU0sRUFBTyxFQUFLLEVBQUksR0FDbEIsR0FBUSxJQUFTLEtBQU8sSUFBUztHQUFRLElBQVMsTUFDbEQsRUFBUSxFQUNoQixDQUNBLEdBQUksR0FBSyxFQUFLLENBQ1YsR0FBSSxFQUNBLEVBQU0sS0FBSyxDQUFLLEVBQ2hCLEVBQU0sRUFBUSxFQUNkLEVBQVEsSUFBQSxRQUVQLEdBQUksSUFBQSxTQUFzQixDQUUzQixLQUFPLElBQVMsS0FBTyxJQUFTLEtBQzVCLEVBQU8sRUFDUCxFQUFLLEVBQU0sR0FBSyxHQUNoQixFQUFXLEdBR2YsSUFBTSxFQUFJLEVBQUksRUFBUyxFQUFJLEVBQUksRUFBSSxFQUFXLEVBRTlDLEdBQUksRUFBYSxHQUNiLE9BQU8sRUFDWCxFQUFNLEtBQUssQ0FBQyxFQUNaLEVBQWEsR0FBSyxHQUNsQixFQUFNLEVBQUksRUFDVixFQUFRLElBQUEsRUFDWixLQUVJLEdBQVcsRUFFbkIsQ0FDSixDQUNBLEVBQU8sQ0FDWCxDQUdBLEdBRkksR0FBWSxHQUNaLEVBQVcsRUFDWCxFQUFNLFNBQVcsRUFDakIsT0FBTyxFQUNQLEdBQ0EsRUFBTyxFQUNYLElBQUksRUFBTSxFQUFLLE1BQU0sRUFBRyxFQUFNLEVBQUUsRUFDaEMsSUFBSyxJQUFJLEVBQUksRUFBRyxFQUFJLEVBQU0sT0FBUSxFQUFFLEVBQUcsQ0FDbkMsSUFBTSxFQUFPLEVBQU0sR0FDYixFQUFNLEVBQU0sRUFBSSxJQUFNLEVBQUssT0FDN0IsSUFBUyxFQUNULEVBQU0sS0FBSyxJQUFTLEVBQUssTUFBTSxFQUFHLENBQUcsS0FFakMsSUFBQSxVQUF3QixFQUFhLEtBQ3JDLEdBQU8sR0FBRyxFQUFLLEdBQU0sS0FDekIsR0FBTyxLQUFLLElBQVMsRUFBSyxNQUFNLEVBQU8sRUFBRyxDQUFHLElBRXJELENBQ0EsT0FBTyxDQUNYLENBS0EsU0FBUyxHQUF5QixFQUFNLEVBQUcsRUFBUSxDQUMvQyxJQUFJLEVBQU0sRUFDTixFQUFRLEVBQUksRUFDWixFQUFLLEVBQUssR0FDZCxLQUFPLElBQU8sS0FBTyxJQUFPLEtBQ3hCLEdBQUksRUFBSSxFQUFRLEVBQ1osRUFBSyxFQUFLLEVBQUUsT0FFWCxDQUNELEVBQ0ksR0FBSyxFQUFLLEVBQUUsU0FDUCxHQUFNLElBQU87R0FDdEIsRUFBTSxFQUNOLEVBQVEsRUFBSSxFQUNaLEVBQUssRUFBSyxFQUNkLENBRUosT0FBTyxDQUNYLENDNUlBLE1BQU0sSUFBa0IsRUFBSyxLQUFhLENBQ3RDLGNBQWUsRUFBVSxFQUFJLE9BQU8sT0FBUyxFQUFJLGNBQ2pELFVBQVcsRUFBSSxRQUFRLFVBQ3ZCLGdCQUFpQixFQUFJLFFBQVEsZUFDakMsR0FHTSxHQUEwQixHQUFRLG1CQUFtQixLQUFLLENBQUcsRUFDbkUsU0FBUyxHQUFvQixFQUFLLEVBQVcsRUFBYyxDQUN2RCxHQUFJLENBQUMsR0FBYSxFQUFZLEVBQzFCLE1BQU8sR0FDWCxJQUFNLEVBQVEsRUFBWSxFQUNwQixFQUFTLEVBQUksT0FDbkIsR0FBSSxHQUFVLEVBQ1YsTUFBTyxHQUNYLElBQUssSUFBSSxFQUFJLEVBQUcsRUFBUSxFQUFHLEVBQUksRUFBUSxFQUFFLEVBQ3JDLEdBQUksRUFBSSxLQUFPO0VBQU0sQ0FDakIsR0FBSSxFQUFJLEVBQVEsRUFDWixNQUFPLEdBRVgsR0FEQSxFQUFRLEVBQUksRUFDUixFQUFTLEdBQVMsRUFDbEIsTUFBTyxFQUNmLENBRUosTUFBTyxFQUNYLENBQ0EsU0FBUyxHQUFtQixFQUFPLEVBQUssQ0FDcEMsSUFBTSxFQUFPLEtBQUssVUFBVSxDQUFLLEVBQ2pDLEdBQUksRUFBSSxRQUFRLG1CQUNaLE9BQU8sRUFDWCxHQUFNLENBQUUsZUFBZ0IsRUFDbEIsRUFBcUIsRUFBSSxRQUFRLCtCQUNqQyxFQUFTLEVBQUksU0FBVyxHQUF1QixDQUFLLEVBQUksS0FBTyxJQUNqRSxFQUFNLEdBQ04sRUFBUSxFQUNaLElBQUssSUFBSSxFQUFJLEVBQUcsRUFBSyxFQUFLLEdBQUksRUFBSSxFQUFLLEVBQUssRUFBRSxHQVExQyxHQVBJLElBQU8sS0FBTyxFQUFLLEVBQUksS0FBTyxNQUFRLEVBQUssRUFBSSxLQUFPLE1BRXRELEdBQU8sRUFBSyxNQUFNLEVBQU8sQ0FBQyxFQUFJLE1BQzlCLEdBQUssRUFDTCxFQUFRLEVBQ1IsRUFBSyxNQUVMLElBQU8sS0FDUCxPQUFRLEVBQUssRUFBSSxHQUFqQixDQUNJLElBQUssSUFDRCxDQUNJLEdBQU8sRUFBSyxNQUFNLEVBQU8sQ0FBQyxFQUMxQixJQUFNLEVBQU8sRUFBSyxPQUFPLEVBQUksRUFBRyxDQUFDLEVBQ2pDLE9BQVEsRUFBUixDQUNJLElBQUssT0FDRCxHQUFPLE1BQ1AsTUFDSixJQUFLLE9BQ0QsR0FBTyxNQUNQLE1BQ0osSUFBSyxPQUNELEdBQU8sTUFDUCxNQUNKLElBQUssT0FDRCxHQUFPLE1BQ1AsTUFDSixJQUFLLE9BQ0QsR0FBTyxNQUNQLE1BQ0osSUFBSyxPQUNELEdBQU8sTUFDUCxNQUNKLElBQUssT0FDRCxHQUFPLE1BQ1AsTUFDSixJQUFLLE9BQ0QsR0FBTyxNQUNQLE1BQ0osUUFDUSxFQUFLLE9BQU8sRUFBRyxDQUFDLElBQU0sS0FDdEIsR0FBTyxNQUFRLEVBQUssT0FBTyxDQUFDLEVBRTVCLEdBQU8sRUFBSyxPQUFPLEVBQUcsQ0FBQyxDQUNuQyxDQUNBLEdBQUssRUFDTCxFQUFRLEVBQUksQ0FDaEIsQ0FDQSxNQUNKLElBQUssSUFDRCxHQUFJLEdBQ0EsRUFBSyxFQUFJLEtBQU8sS0FDaEIsRUFBSyxPQUFTLEVBQ2QsR0FBSyxNQUVKLENBR0QsSUFEQSxHQUFPLEVBQUssTUFBTSxFQUFPLENBQUMsRUFBSTs7RUFDdkIsRUFBSyxFQUFJLEtBQU8sTUFDbkIsRUFBSyxFQUFJLEtBQU8sS0FDaEIsRUFBSyxFQUFJLEtBQU8sS0FDaEIsR0FBTztFQUNQLEdBQUssRUFFVCxHQUFPLEVBRUgsRUFBSyxFQUFJLEtBQU8sTUFDaEIsR0FBTyxNQUNYLEdBQUssRUFDTCxFQUFRLEVBQUksQ0FDaEIsQ0FDQSxNQUNKLFFBQ0ksR0FBSyxDQUNiLENBR1IsTUFEQSxHQUFNLEVBQVEsRUFBTSxFQUFLLE1BQU0sQ0FBSyxFQUFJLEVBQ2pDLEVBQ0QsRUFDQSxHQUFjLEVBQUssRUFBUSxTQUFhLEdBQWUsRUFBSyxFQUFLLENBQUMsQ0FDNUUsQ0FDQSxTQUFTLEdBQW1CLEVBQU8sRUFBSyxDQUNwQyxHQUFJLEVBQUksUUFBUSxjQUFnQixJQUMzQixFQUFJLGFBQWUsRUFBTSxTQUFTO0NBQUksR0FDdkMsa0JBQWtCLEtBQUssQ0FBSyxFQUU1QixPQUFPLEdBQW1CLEVBQU8sQ0FBRyxFQUN4QyxJQUFNLEVBQVMsRUFBSSxTQUFXLEdBQXVCLENBQUssRUFBSSxLQUFPLElBQy9ELEVBQU0sSUFBTSxFQUFNLFFBQVEsS0FBTSxJQUFJLENBQUMsQ0FBQyxRQUFRLE9BQVEsT0FBTyxHQUFRLEVBQUksSUFDL0UsT0FBTyxFQUFJLFlBQ0wsRUFDQSxHQUFjLEVBQUssRUFBUSxHQUFXLEdBQWUsRUFBSyxFQUFLLENBQUMsQ0FDMUUsQ0FDQSxTQUFTLEdBQWEsRUFBTyxFQUFLLENBQzlCLEdBQU0sQ0FBRSxlQUFnQixFQUFJLFFBQ3hCLEVBQ0osR0FBSSxJQUFnQixHQUNoQixFQUFLLE9BQ0osQ0FDRCxJQUFNLEVBQVksRUFBTSxTQUFTLEdBQUcsRUFDOUIsRUFBWSxFQUFNLFNBQVMsR0FBRyxFQUNwQyxBQUtJLEVBTEEsR0FBYSxDQUFDLEVBQ1QsR0FDQSxHQUFhLENBQUMsRUFDZCxHQUVBLEVBQWMsR0FBcUIsRUFDaEQsQ0FDQSxPQUFPLEVBQUcsRUFBTyxDQUFHLENBQ3hCLENBR0EsSUFBSSxHQUNKLEdBQUksQ0FDQSxHQUF1QixPQUFPOzs7S0FBMEIsR0FBRyxDQUMvRCxNQUNNLENBQ0YsR0FBbUIsY0FDdkIsQ0FDQSxTQUFTLEdBQVksQ0FBRSxVQUFTLE9BQU0sU0FBUyxFQUFLLEVBQVcsRUFBYSxDQUN4RSxHQUFNLENBQUUsYUFBWSxnQkFBZSxhQUFjLEVBQUksUUFHckQsR0FBSSxDQUFDLEdBQWMsWUFBWSxLQUFLLENBQUssRUFDckMsT0FBTyxHQUFhLEVBQU8sQ0FBRyxFQUVsQyxJQUFNLEVBQVMsRUFBSSxTQUNkLEVBQUksa0JBQW9CLEdBQXVCLENBQUssRUFBSSxLQUFPLElBQzlELEVBQVUsSUFBZSxVQUN6QixHQUNBLElBQWUsVUFBWSxJQUFTLEVBQU8sYUFDdkMsR0FDQSxJQUFTLEVBQU8sZUFFWixDQUFDLEdBQW9CLEVBQU8sRUFBVyxFQUFPLE1BQU0sRUFDbEUsR0FBSSxDQUFDLEVBQ0QsT0FBTyxFQUFVO0VBQVE7RUFFN0IsSUFBSSxFQUNBLEVBQ0osSUFBSyxFQUFXLEVBQU0sT0FBUSxFQUFXLEVBQUcsRUFBRSxFQUFVLENBQ3BELElBQU0sRUFBSyxFQUFNLEVBQVcsR0FDNUIsR0FBSSxJQUFPO0dBQVEsSUFBTyxLQUFRLElBQU8sSUFDckMsS0FDUixDQUNBLElBQUksRUFBTSxFQUFNLFVBQVUsQ0FBUSxFQUM1QixFQUFXLEVBQUksUUFBUTtDQUFJLEVBQzdCLElBQWEsR0FDYixFQUFRLElBRUgsSUFBVSxHQUFPLElBQWEsRUFBSSxPQUFTLEdBQ2hELEVBQVEsSUFDSixHQUNBLEVBQVksR0FHaEIsRUFBUSxHQUVaLEFBSUksS0FIQSxFQUFRLEVBQU0sTUFBTSxFQUFHLENBQUMsRUFBSSxNQUFNLEVBQzlCLEVBQUksRUFBSSxPQUFTLEtBQU87SUFDeEIsRUFBTSxFQUFJLE1BQU0sRUFBRyxFQUFFLEdBQ25CLEVBQUksUUFBUSxHQUFrQixLQUFLLEdBQVEsR0FHckQsSUFBSSxFQUFpQixHQUNqQixFQUNBLEVBQWEsR0FDakIsSUFBSyxFQUFXLEVBQUcsRUFBVyxFQUFNLE9BQVEsRUFBRSxFQUFVLENBQ3BELElBQU0sRUFBSyxFQUFNLEdBQ2pCLEdBQUksSUFBTyxJQUNQLEVBQWlCLFFBQ2hCLEdBQUksSUFBTztFQUNaLEVBQWEsT0FFYixLQUNSLENBQ0EsSUFBSSxFQUFRLEVBQU0sVUFBVSxFQUFHLEVBQWEsRUFBVyxFQUFhLEVBQUksQ0FBUSxFQUNoRixBQUVJLEtBREEsRUFBUSxFQUFNLFVBQVUsRUFBTSxNQUFNLEVBQzVCLEVBQU0sUUFBUSxPQUFRLEtBQUssR0FBUSxHQUkvQyxJQUFJLEdBQVUsRUFGSyxFQUFTLElBQU0sSUFFVSxJQUFNLEVBTWxELEdBTEksSUFDQSxHQUFVLElBQU0sRUFBYyxFQUFRLFFBQVEsYUFBYyxHQUFHLENBQUMsRUFDNUQsR0FDQSxFQUFVLEdBRWQsQ0FBQyxFQUFTLENBQ1YsSUFBTSxFQUFjLEVBQ2YsUUFBUSxPQUFRO0dBQU0sQ0FBQyxDQUN2QixRQUFRLGlEQUFrRCxNQUFNLENBQUMsQ0FFakUsUUFBUSxPQUFRLEtBQUssR0FBUSxFQUM5QixFQUFrQixHQUNoQixFQUFjLEdBQWUsRUFBSyxFQUFJLEVBQ3hDLElBQWUsVUFBWSxJQUFTLEVBQU8sZUFDM0MsRUFBWSxlQUFtQixDQUMzQixFQUFrQixFQUN0QixHQUVKLElBQU0sRUFBTyxHQUFjLEdBQUcsSUFBUSxJQUFjLElBQU8sRUFBUSxRQUFZLENBQVcsRUFDMUYsR0FBSSxDQUFDLEVBQ0QsTUFBTyxJQUFJLEVBQU8sSUFBSSxJQUFTLEdBQ3ZDLENBRUEsTUFEQSxHQUFRLEVBQU0sUUFBUSxPQUFRLEtBQUssR0FBUSxFQUNwQyxJQUFJLEVBQU8sSUFBSSxJQUFTLElBQVEsSUFBUSxHQUNuRCxDQUNBLFNBQVMsR0FBWSxFQUFNLEVBQUssRUFBVyxFQUFhLENBQ3BELEdBQU0sQ0FBRSxPQUFNLFNBQVUsRUFDbEIsQ0FBRSxlQUFjLGNBQWEsU0FBUSxhQUFZLFVBQVcsRUFDbEUsR0FBSyxHQUFlLEVBQU0sU0FBUztDQUFJLEdBQ2xDLEdBQVUsV0FBVyxLQUFLLENBQUssRUFDaEMsT0FBTyxHQUFhLEVBQU8sQ0FBRyxFQUVsQyxHQUFJLG9GQUFvRixLQUFLLENBQUssRUFPOUYsT0FBTyxHQUFlLEdBQVUsQ0FBQyxFQUFNLFNBQVM7Q0FBSSxFQUM5QyxHQUFhLEVBQU8sQ0FBRyxFQUN2QixHQUFZLEVBQU0sRUFBSyxFQUFXLENBQVcsRUFFdkQsR0FBSSxDQUFDLEdBQ0QsQ0FBQyxHQUNELElBQVMsRUFBTyxPQUNoQixFQUFNLFNBQVM7Q0FBSSxFQUVuQixPQUFPLEdBQVksRUFBTSxFQUFLLEVBQVcsQ0FBVyxFQUV4RCxHQUFJLEdBQXVCLENBQUssRUFBRyxDQUMvQixHQUFJLElBQVcsR0FFWCxNQURBLEdBQUksaUJBQW1CLEdBQ2hCLEdBQVksRUFBTSxFQUFLLEVBQVcsQ0FBVyxFQUVuRCxHQUFJLEdBQWUsSUFBVyxFQUMvQixPQUFPLEdBQWEsRUFBTyxDQUFHLENBRXRDLENBQ0EsSUFBTSxFQUFNLEVBQU0sUUFBUSxPQUFRLE9BQU8sR0FBUSxFQUlqRCxHQUFJLEVBQWMsQ0FDZCxJQUFNLEVBQVEsR0FBUSxFQUFJLFNBQVcsRUFBSSxNQUFRLHlCQUEyQixFQUFJLE1BQU0sS0FBSyxDQUFHLEVBQ3hGLENBQUUsU0FBUSxRQUFTLEVBQUksSUFBSSxPQUNqQyxHQUFJLEVBQUssS0FBSyxDQUFJLEdBQUssR0FBUSxLQUFLLENBQUksRUFDcEMsT0FBTyxHQUFhLEVBQU8sQ0FBRyxDQUN0QyxDQUNBLE9BQU8sRUFDRCxFQUNBLEdBQWMsRUFBSyxFQUFRLEdBQVcsR0FBZSxFQUFLLEVBQUssQ0FBQyxDQUMxRSxDQUNBLFNBQVMsR0FBZ0IsRUFBTSxFQUFLLEVBQVcsRUFBYSxDQUN4RCxHQUFNLENBQUUsY0FBYSxVQUFXLEVBQzFCLEVBQUssT0FBTyxFQUFLLE9BQVUsU0FDM0IsRUFDQSxPQUFPLE9BQU8sQ0FBQyxFQUFHLEVBQU0sQ0FBRSxNQUFPLE9BQU8sRUFBSyxLQUFLLENBQUUsQ0FBQyxFQUN2RCxDQUFFLFFBQVMsRUFDWCxJQUFTLEVBQU8sY0FFWixrREFBa0QsS0FBSyxFQUFHLEtBQUssSUFDL0QsRUFBTyxFQUFPLGNBRXRCLElBQU0sRUFBYyxHQUFVLENBQzFCLE9BQVEsRUFBUixDQUNJLEtBQUssRUFBTyxhQUNaLEtBQUssRUFBTyxjQUNSLE9BQU8sR0FBZSxFQUNoQixHQUFhLEVBQUcsTUFBTyxDQUFHLEVBQzFCLEdBQVksRUFBSSxFQUFLLEVBQVcsQ0FBVyxFQUNyRCxLQUFLLEVBQU8sYUFDUixPQUFPLEdBQW1CLEVBQUcsTUFBTyxDQUFHLEVBQzNDLEtBQUssRUFBTyxhQUNSLE9BQU8sR0FBbUIsRUFBRyxNQUFPLENBQUcsRUFDM0MsS0FBSyxFQUFPLE1BQ1IsT0FBTyxHQUFZLEVBQUksRUFBSyxFQUFXLENBQVcsRUFDdEQsUUFDSSxPQUFPLElBQ2YsQ0FDSixFQUNJLEVBQU0sRUFBVyxDQUFJLEVBQ3pCLEdBQUksSUFBUSxLQUFNLENBQ2QsR0FBTSxDQUFFLGlCQUFnQixxQkFBc0IsRUFBSSxRQUM1QyxFQUFLLEdBQWUsR0FBbUIsRUFFN0MsR0FEQSxFQUFNLEVBQVcsQ0FBQyxFQUNkLElBQVEsS0FDUixNQUFVLE1BQU0sbUNBQW1DLEdBQUcsQ0FDOUQsQ0FDQSxPQUFPLENBQ1gsQ0N4VUEsU0FBUyxHQUF1QixFQUFLLEVBQVMsQ0FDMUMsSUFBTSxFQUFNLE9BQU8sT0FBTyxDQUN0QixXQUFZLEdBQ1osY0FBZSxHQUNmLGVBQWdCLEtBQ2hCLGtCQUFtQixRQUNuQixXQUFZLEtBQ1osbUJBQW9CLEdBQ3BCLCtCQUFnQyxHQUNoQyxTQUFVLFFBQ1Ysc0JBQXVCLEdBQ3ZCLFVBQVcsR0FDWCxVQUFXLEdBQ1gsZ0JBQWlCLEdBQ2pCLFFBQVMsT0FDVCxXQUFZLEdBQ1osWUFBYSxLQUNiLGNBQWUsR0FDZixRQUFTLE9BQ1QsaUJBQWtCLEVBQ3RCLEVBQUcsRUFBSSxPQUFPLGdCQUFpQixDQUFPLEVBQ2xDLEVBQ0osT0FBUSxFQUFJLGdCQUFaLENBQ0ksSUFBSyxRQUNELEVBQVMsR0FDVCxNQUNKLElBQUssT0FDRCxFQUFTLEdBQ1QsTUFDSixRQUNJLEVBQVMsSUFDakIsQ0FDQSxNQUFPLENBQ0gsUUFBUyxJQUFJLElBQ2IsTUFDQSxzQkFBdUIsRUFBSSxzQkFBd0IsSUFBTSxHQUN6RCxPQUFRLEdBQ1IsV0FBWSxPQUFPLEVBQUksUUFBVyxTQUFXLElBQUksT0FBTyxFQUFJLE1BQU0sRUFBSSxLQUN0RSxTQUNBLFFBQVMsQ0FDYixDQUNKLENBQ0EsU0FBUyxHQUFhLEVBQU0sRUFBTSxDQUM5QixHQUFJLEVBQUssSUFBSyxDQUNWLElBQU0sRUFBUSxFQUFLLE9BQU8sR0FBSyxFQUFFLE1BQVEsRUFBSyxHQUFHLEVBQ2pELEdBQUksRUFBTSxPQUFTLEVBQ2YsT0FBTyxFQUFNLEtBQUssR0FBSyxFQUFFLFNBQVcsRUFBSyxNQUFNLEdBQUssRUFBTSxFQUNsRSxDQUNBLElBQUksRUFDQSxFQUNKLEdBQUlFLEVBQVMsQ0FBSSxFQUFHLENBQ2hCLEVBQU0sRUFBSyxNQUNYLElBQUksRUFBUSxFQUFLLE9BQU8sR0FBSyxFQUFFLFdBQVcsQ0FBRyxDQUFDLEVBQzlDLEdBQUksRUFBTSxPQUFTLEVBQUcsQ0FDbEIsSUFBTSxFQUFZLEVBQU0sT0FBTyxHQUFLLEVBQUUsSUFBSSxFQUN0QyxFQUFVLE9BQVMsSUFDbkIsRUFBUSxFQUNoQixDQUNBLEVBQ0ksRUFBTSxLQUFLLEdBQUssRUFBRSxTQUFXLEVBQUssTUFBTSxHQUFLLEVBQU0sS0FBSyxHQUFLLENBQUMsRUFBRSxNQUFNLENBQzlFLEtBRUksR0FBTSxFQUNOLEVBQVMsRUFBSyxLQUFLLEdBQUssRUFBRSxXQUFhLGFBQWUsRUFBRSxTQUFTLEVBRXJFLEdBQUksQ0FBQyxFQUFRLENBQ1QsSUFBTSxFQUFPLEdBQUssYUFBYSxPQUFTLElBQVEsS0FBTyxPQUFTLE9BQU8sR0FDdkUsTUFBVSxNQUFNLHdCQUF3QixFQUFLLE9BQU8sQ0FDeEQsQ0FDQSxPQUFPLENBQ1gsQ0FFQSxTQUFTLEdBQWUsRUFBTSxFQUFRLENBQUUsVUFBUyxPQUFPLENBQ3BELEdBQUksQ0FBQyxFQUFJLFdBQ0wsTUFBTyxHQUNYLElBQU0sRUFBUSxDQUFDLEVBQ1QsR0FBVUEsRUFBUyxDQUFJLEdBQUtDLEVBQWEsQ0FBSSxJQUFNLEVBQUssT0FDMUQsR0FBVSxHQUFjLENBQU0sSUFDOUIsRUFBUSxJQUFJLENBQU0sRUFDbEIsRUFBTSxLQUFLLElBQUksR0FBUSxHQUUzQixJQUFNLEVBQU0sRUFBSyxNQUFRLEVBQU8sUUFBVSxLQUFPLEVBQU8sS0FHeEQsT0FGSSxHQUNBLEVBQU0sS0FBSyxFQUFJLFdBQVcsVUFBVSxDQUFHLENBQUMsRUFDckMsRUFBTSxLQUFLLEdBQUcsQ0FDekIsQ0FDQSxTQUFTQyxFQUFVLEVBQU0sRUFBSyxFQUFXLEVBQWEsQ0FDbEQsR0FBSSxFQUFPLENBQUksRUFDWCxPQUFPLEVBQUssU0FBUyxFQUFLLEVBQVcsQ0FBVyxFQUNwRCxHQUFJLEVBQVEsQ0FBSSxFQUFHLENBQ2YsR0FBSSxFQUFJLElBQUksV0FDUixPQUFPLEVBQUssU0FBUyxDQUFHLEVBQzVCLEdBQUksRUFBSSxpQkFBaUIsSUFBSSxDQUFJLEVBQzdCLE1BQVUsVUFBVSx5REFBeUQsRUFHekUsRUFBSSxnQkFDSixFQUFJLGdCQUFnQixJQUFJLENBQUksRUFFNUIsRUFBSSxnQkFBa0IsSUFBSSxJQUFJLENBQUMsQ0FBSSxDQUFDLEVBQ3hDLEVBQU8sRUFBSyxRQUFRLEVBQUksR0FBRyxDQUVuQyxDQUNBLElBQUksRUFDRSxFQUFPLEVBQU8sQ0FBSSxFQUNsQixFQUNBLEVBQUksSUFBSSxXQUFXLEVBQU0sQ0FBRSxTQUFVLEdBQU0sRUFBUyxDQUFHLENBQUMsRUFDOUQsQUFBVyxJQUFTLEdBQWEsRUFBSSxJQUFJLE9BQU8sS0FBTSxDQUFJLEVBQzFELElBQU0sRUFBUSxHQUFlLEVBQU0sRUFBUSxDQUFHLEVBQzFDLEVBQU0sT0FBUyxJQUNmLEVBQUksZUFBaUIsRUFBSSxlQUFpQixHQUFLLEVBQU0sT0FBUyxHQUNsRSxJQUFNLEVBQU0sT0FBTyxFQUFPLFdBQWMsV0FDbEMsRUFBTyxVQUFVLEVBQU0sRUFBSyxFQUFXLENBQVcsRUFDbERGLEVBQVMsQ0FBSSxFQUNULEdBQWdCLEVBQU0sRUFBSyxFQUFXLENBQVcsRUFDakQsRUFBSyxTQUFTLEVBQUssRUFBVyxDQUFXLEVBR25ELE9BRkssRUFFRUEsRUFBUyxDQUFJLEdBQUssRUFBSSxLQUFPLEtBQU8sRUFBSSxLQUFPLElBQ2hELEdBQUcsRUFBTSxHQUFHLElBQ1osR0FBRyxFQUFNLElBQUksRUFBSSxTQUFTLElBSHJCLENBSWYsQ0N6SEEsU0FBUyxHQUFjLENBQUUsTUFBSyxTQUFTLEVBQUssRUFBVyxFQUFhLENBQ2hFLEdBQU0sQ0FBRSxnQkFBZSxNQUFLLFNBQVEsYUFBWSxRQUFTLENBQUUsZ0JBQWUsWUFBVyxlQUFpQixFQUNsRyxFQUFjLEVBQU8sQ0FBRyxHQUFLLEVBQUksU0FBWSxLQUNqRCxHQUFJLEVBQVksQ0FDWixHQUFJLEVBQ0EsTUFBVSxNQUFNLGtEQUFrRCxFQUV0RSxHQUFJRyxFQUFhLENBQUcsR0FBTSxDQUFDLEVBQU8sQ0FBRyxHQUFLLE9BQU8sR0FBUSxTQUVyRCxNQUFVLE1BQU0sNERBQUcsQ0FFM0IsQ0FDQSxJQUFJLEVBQWMsQ0FBQyxJQUNkLENBQUMsR0FDRyxHQUFjLEdBQVMsTUFBUSxDQUFDLEVBQUksUUFDckNBLEVBQWEsQ0FBRyxJQUNmQyxFQUFTLENBQUcsRUFDUCxFQUFJLE9BQVMsRUFBTyxjQUFnQixFQUFJLE9BQVMsRUFBTyxjQUN4RCxPQUFPLEdBQVEsV0FDN0IsRUFBTSxPQUFPLE9BQU8sQ0FBQyxFQUFHLEVBQUssQ0FDekIsY0FBZSxHQUNmLFlBQWEsQ0FBQyxJQUFnQixHQUFjLENBQUMsR0FDN0MsT0FBUSxFQUFTLENBQ3JCLENBQUMsRUFDRCxJQUFJLEVBQWlCLEdBQ2pCLEVBQVksR0FDWixFQUFNQyxFQUFVLEVBQUssTUFBWSxFQUFpQixPQUFjLEVBQVksRUFBSyxFQUNyRixHQUFJLENBQUMsR0FBZSxDQUFDLEVBQUksUUFBVSxFQUFJLE9BQVMsS0FBTSxDQUNsRCxHQUFJLEVBQ0EsTUFBVSxNQUFNLDhFQUE4RSxFQUNsRyxFQUFjLEVBQ2xCLENBQ0EsR0FBSSxFQUFJLE9BQ0EsSUFBQSxHQUFpQixHQUFTLEtBRzFCLE9BRkksR0FBa0IsR0FDbEIsRUFBVSxFQUNQLElBQVEsR0FBSyxJQUFNLEVBQWMsS0FBSyxJQUFRLENBQ3pELE1BRUMsR0FBSyxHQUFpQixDQUFDLEdBQWdCLEdBQVMsTUFBUSxFQU96RCxNQU5BLEdBQU0sS0FBSyxJQUNQLEdBQWMsQ0FBQyxFQUNmLEdBQU8sRUFBWSxFQUFLLEVBQUksT0FBUSxFQUFjLENBQVUsQ0FBQyxFQUV4RCxHQUFhLEdBQ2xCLEVBQVksRUFDVCxFQUVQLElBQ0EsRUFBYSxNQUNiLEdBQ0ksSUFDQSxHQUFPLEVBQVksRUFBSyxFQUFJLE9BQVEsRUFBYyxDQUFVLENBQUMsR0FDakUsRUFBTSxLQUFLLEVBQUksSUFBSSxFQUFPLEtBRzFCLEVBQU0sR0FBRyxFQUFJLEdBQ1QsSUFDQSxHQUFPLEVBQVksRUFBSyxFQUFJLE9BQVEsRUFBYyxDQUFVLENBQUMsSUFFckUsSUFBSSxFQUFLLEVBQUssRUFDVixFQUFPLENBQUssR0FDWixFQUFNLENBQUMsQ0FBQyxFQUFNLFlBQ2QsRUFBTSxFQUFNLGNBQ1osRUFBZSxFQUFNLFVBR3JCLEVBQU0sR0FDTixFQUFNLEtBQ04sRUFBZSxLQUNYLEdBQVMsT0FBTyxHQUFVLFdBQzFCLEVBQVEsRUFBSSxXQUFXLENBQUssSUFFcEMsRUFBSSxZQUFjLEdBQ2QsQ0FBQyxHQUFlLENBQUMsR0FBY0QsRUFBUyxDQUFLLElBQzdDLEVBQUksY0FBZ0IsRUFBSSxPQUFTLEdBQ3JDLEVBQVksR0FDUixDQUFDLEdBQ0QsRUFBVyxRQUFVLEdBQ3JCLENBQUMsRUFBSSxRQUNMLENBQUMsR0FDRCxHQUFNLENBQUssR0FDWCxDQUFDLEVBQU0sTUFDUCxDQUFDLEVBQU0sS0FDUCxDQUFDLEVBQU0sU0FFUCxFQUFJLE9BQVMsRUFBSSxPQUFPLFVBQVUsQ0FBQyxHQUV2QyxJQUFJLEVBQW1CLEdBQ2pCLEVBQVdDLEVBQVUsRUFBTyxNQUFZLEVBQW1CLE9BQWMsRUFBWSxFQUFLLEVBQzVGLEVBQUssSUFDVCxHQUFJLEdBQWMsR0FBTyxFQUFLLENBRTFCLEdBREEsRUFBSyxFQUFNO0VBQU8sR0FDZCxFQUFLLENBQ0wsSUFBTSxFQUFLLEVBQWMsQ0FBRyxFQUM1QixHQUFNLEtBQUssRUFBYyxFQUFJLEVBQUksTUFBTSxHQUMzQyxDQUNJLElBQWEsSUFBTSxDQUFDLEVBQUksT0FDcEIsSUFBTztHQUFRLElBQ2YsRUFBSzs7R0FHVCxHQUFNLEtBQUssRUFBSSxRQUV2QixNQUNLLEdBQUksQ0FBQyxHQUFlRixFQUFhLENBQUssRUFBRyxDQUMxQyxJQUFNLEVBQU0sRUFBUyxHQUNmLEVBQU0sRUFBUyxRQUFRO0NBQUksRUFDM0IsRUFBYSxJQUFRLEdBQ3JCLEVBQU8sRUFBSSxRQUFVLEVBQU0sTUFBUSxFQUFNLE1BQU0sU0FBVyxFQUNoRSxHQUFJLEdBQWMsQ0FBQyxFQUFNLENBQ3JCLElBQUksRUFBZSxHQUNuQixHQUFJLElBQWUsSUFBUSxLQUFPLElBQVEsS0FBTSxDQUM1QyxJQUFJLEVBQU0sRUFBUyxRQUFRLEdBQUcsRUFDMUIsSUFBUSxLQUNSLElBQVEsSUFDUixFQUFNLEdBQ04sRUFBUyxFQUFNLEtBQU8sTUFDdEIsRUFBTSxFQUFTLFFBQVEsSUFBSyxFQUFNLENBQUMsSUFFbkMsSUFBUSxJQUFNLEVBQU0sS0FDcEIsRUFBZSxHQUN2QixDQUNLLElBQ0QsRUFBSyxLQUFLLEVBQUksU0FDdEIsQ0FDSixNQUNTLElBQWEsSUFBTSxFQUFTLEtBQU87S0FDeEMsRUFBSyxJQWFULE1BWEEsSUFBTyxFQUFLLEVBQ1IsRUFBSSxPQUNBLEdBQW9CLEdBQ3BCLEVBQVUsRUFFVCxHQUFnQixDQUFDLEVBQ3RCLEdBQU8sRUFBWSxFQUFLLEVBQUksT0FBUSxFQUFjLENBQVksQ0FBQyxFQUUxRCxHQUFhLEdBQ2xCLEVBQVksRUFFVCxDQUNYLENDL0lBLFNBQVMsR0FBSyxFQUFVLEVBQVMsRUFDekIsSUFBYSxTQUFXLElBQWEsU0FDckMsUUFBUSxLQUFLLENBQU8sQ0FFNUIsQ0NFQSxNQUNNLEVBQVEsQ0FDVixTQUFVLEdBQVMsSUFBVSxNQUN4QixPQUFPLEdBQVUsVUFBWSxFQUFNLGNBQWdCLEtBQ3hELFFBQVMsTUFDVCxJQUFLLDBCQUNMLEtBQU0sT0FDTixZQUFlLE9BQU8sT0FBTyxJQUFJLEVBQU8sT0FBTyxJQUFTLENBQUMsRUFBRyxDQUN4RCxXQUFZLEVBQ2hCLENBQUMsRUFDRCxjQUFpQixJQUNyQixFQUNNLElBQWMsRUFBSyxLQUFTLEVBQU0sU0FBUyxDQUFHLEdBQy9DRyxFQUFTLENBQUcsSUFDUixDQUFDLEVBQUksTUFBUSxFQUFJLE9BQVMsRUFBTyxRQUNsQyxFQUFNLFNBQVMsRUFBSSxLQUFLLElBQzVCLEdBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxHQUFPLEVBQUksTUFBUSxFQUFNLEtBQU8sRUFBSSxPQUFPLEVBQ3pFLFNBQVMsR0FBZ0IsRUFBSyxFQUFLLEVBQU8sQ0FDdEMsSUFBTSxFQUFTLEdBQWtCLEVBQUssQ0FBSyxFQUMzQyxHQUFJLEdBQU0sQ0FBTSxFQUNaLElBQUssSUFBTSxLQUFNLEVBQU8sTUFDcEIsR0FBVyxFQUFLLEVBQUssQ0FBRSxPQUMxQixHQUFJLE1BQU0sUUFBUSxDQUFNLEVBQ3pCLElBQUssSUFBTSxLQUFNLEVBQ2IsR0FBVyxFQUFLLEVBQUssQ0FBRSxPQUUzQixHQUFXLEVBQUssRUFBSyxDQUFNLENBQ25DLENBQ0EsU0FBUyxHQUFXLEVBQUssRUFBSyxFQUFPLENBQ2pDLElBQU0sRUFBUyxHQUFrQixFQUFLLENBQUssRUFDM0MsR0FBSSxDQUFDLEdBQU0sQ0FBTSxFQUNiLE1BQVUsTUFBTSwyQ0FBMkMsRUFDL0QsSUFBTSxFQUFTLEVBQU8sT0FBTyxLQUFNLEVBQUssR0FBRyxFQUMzQyxJQUFLLEdBQU0sQ0FBQyxFQUFLLEtBQVUsRUFDbkIsYUFBZSxJQUNWLEVBQUksSUFBSSxDQUFHLEdBQ1osRUFBSSxJQUFJLEVBQUssQ0FBSyxFQUVqQixhQUFlLElBQ3BCLEVBQUksSUFBSSxDQUFHLEVBRUwsT0FBTyxVQUFVLGVBQWUsS0FBSyxFQUFLLENBQUcsR0FDbkQsT0FBTyxlQUFlLEVBQUssRUFBSyxDQUM1QixRQUNBLFNBQVUsR0FDVixXQUFZLEdBQ1osYUFBYyxFQUNsQixDQUFDLEVBR1QsT0FBTyxDQUNYLENBQ0EsU0FBUyxHQUFrQixFQUFLLEVBQU8sQ0FDbkMsT0FBTyxHQUFPLEVBQVEsQ0FBSyxFQUFJLEVBQU0sUUFBUSxFQUFJLElBQUssQ0FBRyxFQUFJLENBQ2pFLENDMURBLFNBQVMsR0FBZSxFQUFLLEVBQUssQ0FBRSxNQUFLLFNBQVMsQ0FDOUMsR0FBSSxFQUFPLENBQUcsR0FBSyxFQUFJLFdBQ25CLEVBQUksV0FBVyxFQUFLLEVBQUssQ0FBSyxPQUU3QixHQUFJLEdBQVcsRUFBSyxDQUFHLEVBQ3hCLEdBQWdCLEVBQUssRUFBSyxDQUFLLE1BQzlCLENBQ0QsSUFBTSxFQUFRLEVBQUssRUFBSyxHQUFJLENBQUcsRUFDL0IsR0FBSSxhQUFlLElBQ2YsRUFBSSxJQUFJLEVBQU8sRUFBSyxFQUFPLEVBQU8sQ0FBRyxDQUFDLE9BRXJDLEdBQUksYUFBZSxJQUNwQixFQUFJLElBQUksQ0FBSyxNQUVaLENBQ0QsSUFBTSxFQUFZLEdBQWEsRUFBSyxFQUFPLENBQUcsRUFDeEMsRUFBVSxFQUFLLEVBQU8sRUFBVyxDQUFHLEVBQ3RDLEtBQWEsRUFDYixPQUFPLGVBQWUsRUFBSyxFQUFXLENBQ2xDLE1BQU8sRUFDUCxTQUFVLEdBQ1YsV0FBWSxHQUNaLGFBQWMsRUFDbEIsQ0FBQyxFQUVELEVBQUksR0FBYSxDQUN6QixDQUNKLENBQ0EsT0FBTyxDQUNYLENBQ0EsU0FBUyxHQUFhLEVBQUssRUFBTyxFQUFLLENBQ25DLEdBQUksSUFBVSxLQUNWLE1BQU8sR0FFWCxHQUFJLE9BQU8sR0FBVSxTQUNqQixPQUFPLE9BQU8sQ0FBSyxFQUN2QixHQUFJLEVBQU8sQ0FBRyxHQUFLLEdBQUssSUFBSyxDQUN6QixJQUFNLEVBQVMsR0FBdUIsRUFBSSxJQUFLLENBQUMsQ0FBQyxFQUNqRCxFQUFPLFFBQVUsSUFBSSxJQUNyQixJQUFLLElBQU0sS0FBUSxFQUFJLFFBQVEsS0FBSyxFQUNoQyxFQUFPLFFBQVEsSUFBSSxFQUFLLE1BQU0sRUFDbEMsRUFBTyxPQUFTLEdBQ2hCLEVBQU8sZUFBaUIsR0FDeEIsSUFBTSxFQUFTLEVBQUksU0FBUyxDQUFNLEVBQ2xDLEdBQUksQ0FBQyxFQUFJLGFBQWMsQ0FDbkIsSUFBSSxFQUFVLEtBQUssVUFBVSxDQUFNLEVBQy9CLEVBQVEsT0FBUyxLQUNqQixFQUFVLEVBQVEsVUFBVSxFQUFHLEVBQUUsRUFBSSxRQUN6QyxHQUFLLEVBQUksSUFBSSxRQUFRLFNBQVUsa0ZBQWtGLEVBQVEseUNBQXlDLEVBQ2xLLEVBQUksYUFBZSxFQUN2QixDQUNBLE9BQU8sQ0FDWCxDQUNBLE9BQU8sS0FBSyxVQUFVLENBQUssQ0FDL0IsQ0N2REEsU0FBUyxHQUFXLEVBQUssRUFBTyxFQUFLLENBR2pDLE9BQU8sSUFBSSxFQUZELEdBQVcsRUFBSyxJQUFBLEdBQVcsQ0FFckIsRUFETixHQUFXLEVBQU8sSUFBQSxHQUFXLENBQ3BCLENBQUMsQ0FDeEIsQ0FDQSxJQUFNLEVBQU4sTUFBTSxDQUFLLENBQ1AsWUFBWSxFQUFLLEVBQVEsS0FBTSxDQUMzQixPQUFPLGVBQWUsS0FBTSxFQUFXLENBQUUsTUFBTyxFQUFLLENBQUMsRUFDdEQsS0FBSyxJQUFNLEVBQ1gsS0FBSyxNQUFRLENBQ2pCLENBQ0EsTUFBTSxFQUFRLENBQ1YsR0FBSSxDQUFFLE1BQUssU0FBVSxLQUtyQixPQUpJLEVBQU8sQ0FBRyxJQUNWLEVBQU0sRUFBSSxNQUFNLENBQU0sR0FDdEIsRUFBTyxDQUFLLElBQ1osRUFBUSxFQUFNLE1BQU0sQ0FBTSxHQUN2QixJQUFJLEVBQUssRUFBSyxDQUFLLENBQzlCLENBQ0EsT0FBTyxFQUFHLEVBQUssQ0FFWCxPQUFPLEdBQWUsRUFEVCxHQUFLLFNBQVcsSUFBSSxJQUFRLENBQUMsRUFDVCxJQUFJLENBQ3pDLENBQ0EsU0FBUyxFQUFLLEVBQVcsRUFBYSxDQUNsQyxPQUFPLEdBQUssSUFDTixHQUFjLEtBQU0sRUFBSyxFQUFXLENBQVcsRUFDL0MsS0FBSyxVQUFVLElBQUksQ0FDN0IsQ0FDSixFQzdCQSxTQUFTLEdBQW9CLEVBQVksRUFBSyxFQUFTLENBR25ELE9BRmEsRUFBSSxRQUFVLEVBQVcsS0FDYixHQUEwQixHQUFBLENBQ2xDLEVBQVksRUFBSyxDQUFPLENBQzdDLENBQ0EsU0FBUyxHQUF5QixDQUFFLFVBQVMsU0FBUyxFQUFLLENBQUUsa0JBQWlCLFlBQVcsYUFBWSxjQUFhLGFBQWEsQ0FDM0gsR0FBTSxDQUFFLFNBQVEsUUFBUyxDQUFFLGtCQUFvQixFQUN6QyxFQUFVLE9BQU8sT0FBTyxDQUFDLEVBQUcsRUFBSyxDQUFFLE9BQVEsRUFBWSxLQUFNLElBQUssQ0FBQyxFQUNyRSxFQUFZLEdBQ1YsRUFBUSxDQUFDLEVBQ2YsSUFBSyxJQUFJLEVBQUksRUFBRyxFQUFJLEVBQU0sT0FBUSxFQUFFLEVBQUcsQ0FDbkMsSUFBTSxFQUFPLEVBQU0sR0FDZixFQUFVLEtBQ2QsR0FBSSxFQUFPLENBQUksRUFDUCxDQUFDLEdBQWEsRUFBSyxhQUNuQixFQUFNLEtBQUssRUFBRSxFQUNqQixHQUFpQixFQUFLLEVBQU8sRUFBSyxjQUFlLENBQVMsRUFDdEQsRUFBSyxVQUNMLEVBQVUsRUFBSyxjQUVsQixHQUFJLEVBQU8sQ0FBSSxFQUFHLENBQ25CLElBQU0sRUFBSyxFQUFPLEVBQUssR0FBRyxFQUFJLEVBQUssSUFBTSxLQUNyQyxJQUNJLENBQUMsR0FBYSxFQUFHLGFBQ2pCLEVBQU0sS0FBSyxFQUFFLEVBQ2pCLEdBQWlCLEVBQUssRUFBTyxFQUFHLGNBQWUsQ0FBUyxFQUVoRSxDQUNBLEVBQVksR0FDWixJQUFJLEVBQU1DLEVBQVUsRUFBTSxNQUFnQixFQUFVLFNBQWMsRUFBWSxFQUFLLEVBQy9FLElBQ0EsR0FBTyxFQUFZLEVBQUssRUFBWSxFQUFjLENBQU8sQ0FBQyxHQUMxRCxHQUFhLElBQ2IsRUFBWSxJQUNoQixFQUFNLEtBQUssRUFBa0IsQ0FBRyxDQUNwQyxDQUNBLElBQUksRUFDSixHQUFJLEVBQU0sU0FBVyxFQUNqQixFQUFNLEVBQVUsTUFBUSxFQUFVLFFBRWpDLENBQ0QsRUFBTSxFQUFNLEdBQ1osSUFBSyxJQUFJLEVBQUksRUFBRyxFQUFJLEVBQU0sT0FBUSxFQUFFLEVBQUcsQ0FDbkMsSUFBTSxFQUFPLEVBQU0sR0FDbkIsR0FBTyxFQUFPLEtBQUssSUFBUyxJQUFTO0NBQ3pDLENBQ0osQ0FRQSxPQVBJLEdBQ0EsR0FBTztFQUFPLEVBQWMsRUFBYyxDQUFPLEVBQUcsQ0FBTSxFQUN0RCxHQUNBLEVBQVUsR0FFVCxHQUFhLEdBQ2xCLEVBQVksRUFDVCxDQUNYLENBQ0EsU0FBUyxHQUF3QixDQUFFLFNBQVMsRUFBSyxDQUFFLFlBQVcsY0FBYyxDQUN4RSxHQUFNLENBQUUsU0FBUSxhQUFZLHNCQUF1QixFQUFXLFFBQVMsQ0FBRSxrQkFBb0IsRUFDN0YsR0FBYyxFQUNkLElBQU0sRUFBVSxPQUFPLE9BQU8sQ0FBQyxFQUFHLEVBQUssQ0FDbkMsT0FBUSxFQUNSLE9BQVEsR0FDUixLQUFNLElBQ1YsQ0FBQyxFQUNHLEVBQWEsR0FDYixFQUFlLEVBQ2IsRUFBUSxDQUFDLEVBQ2YsSUFBSyxJQUFJLEVBQUksRUFBRyxFQUFJLEVBQU0sT0FBUSxFQUFFLEVBQUcsQ0FDbkMsSUFBTSxFQUFPLEVBQU0sR0FDZixFQUFVLEtBQ2QsR0FBSSxFQUFPLENBQUksRUFDUCxFQUFLLGFBQ0wsRUFBTSxLQUFLLEVBQUUsRUFDakIsR0FBaUIsRUFBSyxFQUFPLEVBQUssY0FBZSxFQUFLLEVBQ2xELEVBQUssVUFDTCxFQUFVLEVBQUssY0FFbEIsR0FBSSxFQUFPLENBQUksRUFBRyxDQUNuQixJQUFNLEVBQUssRUFBTyxFQUFLLEdBQUcsRUFBSSxFQUFLLElBQU0sS0FDckMsSUFDSSxFQUFHLGFBQ0gsRUFBTSxLQUFLLEVBQUUsRUFDakIsR0FBaUIsRUFBSyxFQUFPLEVBQUcsY0FBZSxFQUFLLEVBQ2hELEVBQUcsVUFDSCxFQUFhLEtBRXJCLElBQU0sRUFBSyxFQUFPLEVBQUssS0FBSyxFQUFJLEVBQUssTUFBUSxLQUN6QyxHQUNJLEVBQUcsVUFDSCxFQUFVLEVBQUcsU0FDYixFQUFHLGdCQUNILEVBQWEsS0FFWixFQUFLLE9BQVMsTUFBUSxHQUFJLFVBQy9CLEVBQVUsRUFBRyxRQUVyQixDQUNJLElBQ0EsRUFBYSxJQUNqQixJQUFJLEVBQU1BLEVBQVUsRUFBTSxNQUFnQixFQUFVLElBQUssRUFDekQsQUFBZSxJQUFhLEVBQU0sT0FBUyxHQUFnQixFQUFJLFNBQVM7Q0FBSSxFQUN4RSxFQUFJLEVBQU0sT0FBUyxFQUNuQixHQUFPLElBRUYsRUFBSSxRQUFRLGdCQUNiLEVBQUksUUFBUSxVQUFZLElBQ3hCLEFBQWUsSUFBYSxFQUFNLFFBQVEsRUFBSyxJQUFTLEVBQU0sRUFBSyxPQUFTLEVBQUcsQ0FBQyxHQUMzRSxFQUFJLE9BQVMsR0FDZCxFQUFJLFFBQVEsV0FFaEIsSUFDQSxHQUFPLE1BR1gsSUFDQSxHQUFPLEVBQVksRUFBSyxFQUFZLEVBQWMsQ0FBTyxDQUFDLEdBQzlELEVBQU0sS0FBSyxDQUFHLEVBQ2QsRUFBZSxFQUFNLE1BQ3pCLENBQ0EsR0FBTSxDQUFFLFFBQU8sT0FBUSxFQUN2QixHQUFJLEVBQU0sU0FBVyxFQUNqQixPQUFPLEVBQVEsRUFHZixHQUFJLENBQUMsRUFBWSxDQUNiLElBQU0sRUFBTSxFQUFNLFFBQVEsRUFBSyxJQUFTLEVBQU0sRUFBSyxPQUFTLEVBQUcsQ0FBQyxFQUNoRSxFQUFhLEVBQUksUUFBUSxVQUFZLEdBQUssRUFBTSxFQUFJLFFBQVEsU0FDaEUsQ0FDQSxHQUFJLEVBQVksQ0FDWixJQUFJLEVBQU0sRUFDVixJQUFLLElBQU0sS0FBUSxFQUNmLEdBQU8sRUFBTyxLQUFLLElBQWEsSUFBUyxJQUFTO0VBQ3RELE1BQU8sR0FBRyxFQUFJLElBQUksSUFBUyxHQUMvQixDQUVJLE1BQU8sR0FBRyxJQUFRLElBQVksRUFBTSxLQUFLLEdBQUcsSUFBSSxJQUFZLEdBR3hFLENBQ0EsU0FBUyxHQUFpQixDQUFFLFNBQVEsUUFBUyxDQUFFLGtCQUFtQixFQUFPLEVBQVMsRUFBVyxDQUd6RixHQUZJLEdBQVcsSUFDWCxFQUFVLEVBQVEsUUFBUSxPQUFRLEVBQUUsR0FDcEMsRUFBUyxDQUNULElBQU0sRUFBSyxFQUFjLEVBQWMsQ0FBTyxFQUFHLENBQU0sRUFDdkQsRUFBTSxLQUFLLEVBQUcsVUFBVSxDQUFDLENBQzdCLENBQ0osQ0MvSUEsU0FBUyxFQUFTLEVBQU8sRUFBSyxDQUMxQixJQUFNLEVBQUlDLEVBQVMsQ0FBRyxFQUFJLEVBQUksTUFBUSxFQUN0QyxJQUFLLElBQU0sS0FBTSxFQUNiLEdBQUksRUFBTyxDQUFFLElBQ0wsRUFBRyxNQUFRLEdBQU8sRUFBRyxNQUFRLEdBRTdCQSxFQUFTLEVBQUcsR0FBRyxHQUFLLEVBQUcsSUFBSSxRQUFVLEdBQ3JDLE9BQU8sQ0FJdkIsQ0FDQSxJQUFNLEVBQU4sY0FBc0IsRUFBVyxDQUM3QixXQUFXLFNBQVUsQ0FDakIsTUFBTyx1QkFDWCxDQUNBLFlBQVksRUFBUSxDQUNoQixNQUFNLEVBQUssQ0FBTSxFQUNqQixLQUFLLE1BQVEsQ0FBQyxDQUNsQixDQUtBLE9BQU8sS0FBSyxFQUFRLEVBQUssRUFBSyxDQUMxQixHQUFNLENBQUUsZ0JBQWUsWUFBYSxFQUM5QixFQUFNLElBQUksS0FBSyxDQUFNLEVBQ3JCLEdBQU8sRUFBSyxJQUFVLENBQ3hCLEdBQUksT0FBTyxHQUFhLFdBQ3BCLEVBQVEsRUFBUyxLQUFLLEVBQUssRUFBSyxDQUFLLE9BQ3BDLEdBQUksTUFBTSxRQUFRLENBQVEsR0FBSyxDQUFDLEVBQVMsU0FBUyxDQUFHLEVBQ3RELFFBQ0EsSUFBVSxJQUFBLElBQWEsSUFDdkIsRUFBSSxNQUFNLEtBQUssR0FBVyxFQUFLLEVBQU8sQ0FBRyxDQUFDLENBQ2xELEVBQ0EsR0FBSSxhQUFlLElBQ2YsSUFBSyxHQUFNLENBQUMsRUFBSyxLQUFVLEVBQ3ZCLEVBQUksRUFBSyxDQUFLLE9BRWpCLEdBQUksR0FBTyxPQUFPLEdBQVEsU0FDM0IsSUFBSyxJQUFNLEtBQU8sT0FBTyxLQUFLLENBQUcsRUFDN0IsRUFBSSxFQUFLLEVBQUksRUFBSSxFQUt6QixPQUhJLE9BQU8sRUFBTyxnQkFBbUIsWUFDakMsRUFBSSxNQUFNLEtBQUssRUFBTyxjQUFjLEVBRWpDLENBQ1gsQ0FPQSxJQUFJLEVBQU0sRUFBVyxDQUNqQixJQUFJLEVBQ0osQUFPSSxFQVBBLEVBQU8sQ0FBSSxFQUNILEVBQ0gsQ0FBQyxHQUFRLE9BQU8sR0FBUyxVQUFZLEVBQUUsUUFBUyxHQUU3QyxJQUFJLEVBQUssRUFBTSxHQUFNLEtBQUssRUFHMUIsSUFBSSxFQUFLLEVBQUssSUFBSyxFQUFLLEtBQUssRUFDekMsSUFBTSxFQUFPLEVBQVMsS0FBSyxNQUFPLEVBQU0sR0FBRyxFQUNyQyxFQUFjLEtBQUssUUFBUSxlQUNqQyxHQUFJLEVBQU0sQ0FDTixHQUFJLENBQUMsRUFDRCxNQUFVLE1BQU0sT0FBTyxFQUFNLElBQUksYUFBYSxFQUU5Q0EsRUFBUyxFQUFLLEtBQUssR0FBSyxHQUFjLEVBQU0sS0FBSyxFQUNqRCxFQUFLLE1BQU0sTUFBUSxFQUFNLE1BRXpCLEVBQUssTUFBUSxFQUFNLEtBQzNCLE1BQ0ssR0FBSSxFQUFhLENBQ2xCLElBQU0sRUFBSSxLQUFLLE1BQU0sVUFBVSxHQUFRLEVBQVksRUFBTyxDQUFJLEVBQUksQ0FBQyxFQUMvRCxJQUFNLEdBQ04sS0FBSyxNQUFNLEtBQUssQ0FBSyxFQUVyQixLQUFLLE1BQU0sT0FBTyxFQUFHLEVBQUcsQ0FBSyxDQUNyQyxNQUVJLEtBQUssTUFBTSxLQUFLLENBQUssQ0FFN0IsQ0FDQSxPQUFPLEVBQUssQ0FDUixJQUFNLEVBQUssRUFBUyxLQUFLLE1BQU8sQ0FBRyxFQUluQyxPQUhLLEVBRU8sS0FBSyxNQUFNLE9BQU8sS0FBSyxNQUFNLFFBQVEsQ0FBRSxFQUFHLENBQzdDLENBQUMsQ0FBQyxPQUFTLEVBRlQsRUFHZixDQUNBLElBQUksRUFBSyxFQUFZLENBRWpCLElBQU0sRUFESyxFQUFTLEtBQUssTUFBTyxDQUNsQixDQUFDLEVBQUUsTUFDakIsT0FBUSxDQUFDLEdBQWNBLEVBQVMsQ0FBSSxFQUFJLEVBQUssTUFBUSxJQUFTLElBQUEsRUFDbEUsQ0FDQSxJQUFJLEVBQUssQ0FDTCxNQUFPLENBQUMsQ0FBQyxFQUFTLEtBQUssTUFBTyxDQUFHLENBQ3JDLENBQ0EsSUFBSSxFQUFLLEVBQU8sQ0FDWixLQUFLLElBQUksSUFBSSxFQUFLLEVBQUssQ0FBSyxFQUFHLEVBQUksQ0FDdkMsQ0FNQSxPQUFPLEVBQUcsRUFBSyxFQUFNLENBQ2pCLElBQU0sRUFBTSxFQUFPLElBQUksRUFBUyxHQUFLLFNBQVcsSUFBSSxJQUFRLENBQUMsRUFDekQsR0FBSyxVQUNMLEVBQUksU0FBUyxDQUFHLEVBQ3BCLElBQUssSUFBTSxLQUFRLEtBQUssTUFDcEIsR0FBZSxFQUFLLEVBQUssQ0FBSSxFQUNqQyxPQUFPLENBQ1gsQ0FDQSxTQUFTLEVBQUssRUFBVyxFQUFhLENBQ2xDLEdBQUksQ0FBQyxFQUNELE9BQU8sS0FBSyxVQUFVLElBQUksRUFDOUIsSUFBSyxJQUFNLEtBQVEsS0FBSyxNQUNwQixHQUFJLENBQUMsRUFBTyxDQUFJLEVBQ1osTUFBVSxNQUFNLHNDQUFzQyxLQUFLLFVBQVUsQ0FBSSxFQUFFLFNBQVMsRUFJNUYsTUFGSSxDQUFDLEVBQUksZUFBaUIsS0FBSyxpQkFBaUIsRUFBSyxJQUNqRCxFQUFNLE9BQU8sT0FBTyxDQUFDLEVBQUcsRUFBSyxDQUFFLGNBQWUsRUFBSyxDQUFDLEdBQ2pELEdBQW9CLEtBQU0sRUFBSyxDQUNsQyxnQkFBaUIsR0FDakIsVUFBVyxDQUFFLE1BQU8sSUFBSyxJQUFLLEdBQUksRUFDbEMsV0FBWSxFQUFJLFFBQVUsR0FDMUIsY0FDQSxXQUNKLENBQUMsQ0FDTCxDQUNKLEVDMUlBLE1BQU0sR0FBTSxDQUNSLFdBQVksTUFDWixRQUFTLEdBQ1QsVUFBVyxFQUNYLElBQUssd0JBQ0wsUUFBUSxFQUFLLEVBQVMsQ0FHbEIsT0FGSyxHQUFNLENBQUcsR0FDVixFQUFRLGlDQUFpQyxFQUN0QyxDQUNYLEVBQ0EsWUFBYSxFQUFRLEVBQUssSUFBUSxFQUFRLEtBQUssRUFBUSxFQUFLLENBQUcsQ0FDbkUsRUNQQSxJQUFNLEVBQU4sY0FBc0IsRUFBVyxDQUM3QixXQUFXLFNBQVUsQ0FDakIsTUFBTyx1QkFDWCxDQUNBLFlBQVksRUFBUSxDQUNoQixNQUFNLEdBQUssQ0FBTSxFQUNqQixLQUFLLE1BQVEsQ0FBQyxDQUNsQixDQUNBLElBQUksRUFBTyxDQUNQLEtBQUssTUFBTSxLQUFLLENBQUssQ0FDekIsQ0FTQSxPQUFPLEVBQUssQ0FDUixJQUFNLEVBQU0sR0FBWSxDQUFHLEVBSTNCLE9BSEksT0FBTyxHQUFRLFVBRVAsS0FBSyxNQUFNLE9BQU8sRUFBSyxDQUMxQixDQUFDLENBQUMsT0FBUyxDQUN4QixDQUNBLElBQUksRUFBSyxFQUFZLENBQ2pCLElBQU0sRUFBTSxHQUFZLENBQUcsRUFDM0IsR0FBSSxPQUFPLEdBQVEsU0FDZixPQUNKLElBQU0sRUFBSyxLQUFLLE1BQU0sR0FDdEIsTUFBTyxDQUFDLEdBQWNDLEVBQVMsQ0FBRSxFQUFJLEVBQUcsTUFBUSxDQUNwRCxDQU9BLElBQUksRUFBSyxDQUNMLElBQU0sRUFBTSxHQUFZLENBQUcsRUFDM0IsT0FBTyxPQUFPLEdBQVEsVUFBWSxFQUFNLEtBQUssTUFBTSxNQUN2RCxDQVFBLElBQUksRUFBSyxFQUFPLENBQ1osSUFBTSxFQUFNLEdBQVksQ0FBRyxFQUMzQixHQUFJLE9BQU8sR0FBUSxTQUNmLE1BQVUsTUFBTSwrQkFBK0IsRUFBSSxFQUFFLEVBQ3pELElBQU0sRUFBTyxLQUFLLE1BQU0sR0FDcEJBLEVBQVMsQ0FBSSxHQUFLLEdBQWMsQ0FBSyxFQUNyQyxFQUFLLE1BQVEsRUFFYixLQUFLLE1BQU0sR0FBTyxDQUMxQixDQUNBLE9BQU8sRUFBRyxFQUFLLENBQ1gsSUFBTSxFQUFNLENBQUMsRUFDVCxHQUFLLFVBQ0wsRUFBSSxTQUFTLENBQUcsRUFDcEIsSUFBSSxFQUFJLEVBQ1IsSUFBSyxJQUFNLEtBQVEsS0FBSyxNQUNwQixFQUFJLEtBQUssRUFBSyxFQUFNLE9BQU8sR0FBRyxFQUFHLENBQUcsQ0FBQyxFQUN6QyxPQUFPLENBQ1gsQ0FDQSxTQUFTLEVBQUssRUFBVyxFQUFhLENBR2xDLE9BRkssRUFFRSxHQUFvQixLQUFNLEVBQUssQ0FDbEMsZ0JBQWlCLEtBQ2pCLFVBQVcsQ0FBRSxNQUFPLElBQUssSUFBSyxHQUFJLEVBQ2xDLFlBQWEsRUFBSSxRQUFVLElBQU0sS0FDakMsY0FDQSxXQUNKLENBQUMsRUFQVSxLQUFLLFVBQVUsSUFBSSxDQVFsQyxDQUNBLE9BQU8sS0FBSyxFQUFRLEVBQUssRUFBSyxDQUMxQixHQUFNLENBQUUsWUFBYSxFQUNmLEVBQU0sSUFBSSxLQUFLLENBQU0sRUFDM0IsR0FBSSxHQUFPLE9BQU8sWUFBWSxPQUFPLENBQUcsRUFBRyxDQUN2QyxJQUFJLEVBQUksRUFDUixJQUFLLElBQUksS0FBTSxFQUFLLENBQ2hCLEdBQUksT0FBTyxHQUFhLFdBQVksQ0FDaEMsSUFBTSxFQUFNLGFBQWUsSUFBTSxFQUFLLE9BQU8sR0FBRyxFQUNoRCxFQUFLLEVBQVMsS0FBSyxFQUFLLEVBQUssQ0FBRSxDQUNuQyxDQUNBLEVBQUksTUFBTSxLQUFLLEdBQVcsRUFBSSxJQUFBLEdBQVcsQ0FBRyxDQUFDLENBQ2pELENBQ0osQ0FDQSxPQUFPLENBQ1gsQ0FDSixFQUNBLFNBQVMsR0FBWSxFQUFLLENBQ3RCLElBQUksRUFBTUEsRUFBUyxDQUFHLEVBQUksRUFBSSxNQUFRLEVBR3RDLE9BRkksR0FBTyxPQUFPLEdBQVEsV0FDdEIsRUFBTSxPQUFPLENBQUcsR0FDYixPQUFPLEdBQVEsVUFBWSxPQUFPLFVBQVUsQ0FBRyxHQUFLLEdBQU8sRUFDNUQsRUFDQSxJQUNWLENDM0dBLE1BQU0sR0FBTSxDQUNSLFdBQVksTUFDWixRQUFTLEdBQ1QsVUFBVyxFQUNYLElBQUssd0JBQ0wsUUFBUSxFQUFLLEVBQVMsQ0FHbEIsT0FGSyxHQUFNLENBQUcsR0FDVixFQUFRLGtDQUFrQyxFQUN2QyxDQUNYLEVBQ0EsWUFBYSxFQUFRLEVBQUssSUFBUSxFQUFRLEtBQUssRUFBUSxFQUFLLENBQUcsQ0FDbkUsRUNaTSxHQUFTLENBQ1gsU0FBVSxHQUFTLE9BQU8sR0FBVSxTQUNwQyxRQUFTLEdBQ1QsSUFBSyx3QkFDTCxRQUFTLEdBQU8sRUFDaEIsVUFBVSxFQUFNLEVBQUssRUFBVyxFQUFhLENBRXpDLE1BREEsR0FBTSxPQUFPLE9BQU8sQ0FBRSxhQUFjLEVBQUssRUFBRyxDQUFHLEVBQ3hDLEdBQWdCLEVBQU0sRUFBSyxFQUFXLENBQVcsQ0FDNUQsQ0FDSixFQ1RNLEdBQVUsQ0FDWixTQUFVLEdBQVMsR0FBUyxLQUM1QixlQUFrQixJQUFJLEVBQU8sSUFBSSxFQUNqQyxRQUFTLEdBQ1QsSUFBSyx5QkFDTCxLQUFNLHdCQUNOLFlBQWUsSUFBSSxFQUFPLElBQUksRUFDOUIsV0FBWSxDQUFFLFVBQVUsSUFBUSxPQUFPLEdBQVcsVUFBWSxHQUFRLEtBQUssS0FBSyxDQUFNLEVBQ2hGLEVBQ0EsRUFBSSxRQUFRLE9BQ3RCLEVDVk0sR0FBVSxDQUNaLFNBQVUsR0FBUyxPQUFPLEdBQVUsVUFDcEMsUUFBUyxHQUNULElBQUsseUJBQ0wsS0FBTSxvQ0FDTixRQUFTLEdBQU8sSUFBSSxFQUFPLEVBQUksS0FBTyxLQUFPLEVBQUksS0FBTyxHQUFHLEVBQzNELFVBQVUsQ0FBRSxTQUFRLFNBQVMsRUFBSyxDQU05QixPQUxJLEdBQVUsR0FBUSxLQUFLLEtBQUssQ0FBTSxHQUU5QixLQURPLEVBQU8sS0FBTyxLQUFPLEVBQU8sS0FBTyxLQUVuQyxFQUVSLEVBQVEsRUFBSSxRQUFRLFFBQVUsRUFBSSxRQUFRLFFBQ3JELENBQ0osRUNoQkEsU0FBUyxFQUFnQixDQUFFLFNBQVEsb0JBQW1CLE1BQUssU0FBUyxDQUNoRSxHQUFJLE9BQU8sR0FBVSxTQUNqQixPQUFPLE9BQU8sQ0FBSyxFQUN2QixJQUFNLEVBQU0sT0FBTyxHQUFVLFNBQVcsRUFBUSxPQUFPLENBQUssRUFDNUQsR0FBSSxDQUFDLFNBQVMsQ0FBRyxFQUNiLE9BQU8sTUFBTSxDQUFHLEVBQUksT0FBUyxFQUFNLEVBQUksUUFBVSxPQUNyRCxJQUFJLEVBQUksT0FBTyxHQUFHLEVBQU8sRUFBRSxFQUFJLEtBQU8sS0FBSyxVQUFVLENBQUssRUFDMUQsR0FBSSxDQUFDLEdBQ0QsSUFDQyxDQUFDLEdBQU8sSUFBUSw0QkFDakIsUUFBUSxLQUFLLENBQUMsR0FDZCxDQUFDLEVBQUUsU0FBUyxHQUFHLEVBQUcsQ0FDbEIsSUFBSSxFQUFJLEVBQUUsUUFBUSxHQUFHLEVBQ2pCLEVBQUksSUFDSixFQUFJLEVBQUUsT0FDTixHQUFLLEtBRVQsSUFBSSxFQUFJLEdBQXFCLEVBQUUsT0FBUyxFQUFJLEdBQzVDLEtBQU8sSUFBTSxHQUNULEdBQUssR0FDYixDQUNBLE9BQU8sQ0FDWCxDQ25CQSxNQUFNQyxHQUFXLENBQ2IsU0FBVSxHQUFTLE9BQU8sR0FBVSxTQUNwQyxRQUFTLEdBQ1QsSUFBSywwQkFDTCxLQUFNLGlEQUNOLFFBQVMsR0FBTyxFQUFJLE1BQU0sRUFBRSxDQUFDLENBQUMsWUFBWSxJQUFNLE1BQzFDLElBQ0EsRUFBSSxLQUFPLElBQ1AsS0FDQSxJQUNWLFVBQVcsQ0FDZixFQUNNQyxHQUFXLENBQ2IsU0FBVSxHQUFTLE9BQU8sR0FBVSxTQUNwQyxRQUFTLEdBQ1QsSUFBSywwQkFDTCxPQUFRLE1BQ1IsS0FBTSx5REFDTixRQUFTLEdBQU8sV0FBVyxDQUFHLEVBQzlCLFVBQVUsRUFBTSxDQUNaLElBQU0sRUFBTSxPQUFPLEVBQUssS0FBSyxFQUM3QixPQUFPLFNBQVMsQ0FBRyxFQUFJLEVBQUksY0FBYyxFQUFJLEVBQWdCLENBQUksQ0FDckUsQ0FDSixFQUNNQyxHQUFRLENBQ1YsU0FBVSxHQUFTLE9BQU8sR0FBVSxTQUNwQyxRQUFTLEdBQ1QsSUFBSywwQkFDTCxLQUFNLHFDQUNOLFFBQVEsRUFBSyxDQUNULElBQU0sRUFBTyxJQUFJLEVBQU8sV0FBVyxDQUFHLENBQUMsRUFDakMsRUFBTSxFQUFJLFFBQVEsR0FBRyxFQUczQixPQUZJLElBQVEsSUFBTSxFQUFJLEVBQUksT0FBUyxLQUFPLE1BQ3RDLEVBQUssa0JBQW9CLEVBQUksT0FBUyxFQUFNLEdBQ3pDLENBQ1gsRUFDQSxVQUFXLENBQ2YsRUN0Q01DLEdBQWUsR0FBVSxPQUFPLEdBQVUsVUFBWSxPQUFPLFVBQVUsQ0FBSyxFQUM1RUMsSUFBYyxFQUFLLEVBQVEsRUFBTyxDQUFFLGlCQUFtQixFQUFjLE9BQU8sQ0FBRyxFQUFJLFNBQVMsRUFBSSxVQUFVLENBQU0sRUFBRyxDQUFLLEVBQzlILFNBQVNDLEdBQWEsRUFBTSxFQUFPLEVBQVEsQ0FDdkMsR0FBTSxDQUFFLFNBQVUsRUFHbEIsT0FGSUYsR0FBWSxDQUFLLEdBQUssR0FBUyxFQUN4QixFQUFTLEVBQU0sU0FBUyxDQUFLLEVBQ2pDLEVBQWdCLENBQUksQ0FDL0IsQ0FDQSxNQUFNRyxHQUFTLENBQ1gsU0FBVSxHQUFTSCxHQUFZLENBQUssR0FBSyxHQUFTLEVBQ2xELFFBQVMsR0FDVCxJQUFLLHdCQUNMLE9BQVEsTUFDUixLQUFNLGFBQ04sU0FBVSxFQUFLLEVBQVUsSUFBUUMsR0FBVyxFQUFLLEVBQUcsRUFBRyxDQUFHLEVBQzFELFVBQVcsR0FBUUMsR0FBYSxFQUFNLEVBQUcsSUFBSSxDQUNqRCxFQUNNRSxHQUFNLENBQ1IsU0FBVUosR0FDVixRQUFTLEdBQ1QsSUFBSyx3QkFDTCxLQUFNLGdCQUNOLFNBQVUsRUFBSyxFQUFVLElBQVFDLEdBQVcsRUFBSyxFQUFHLEdBQUksQ0FBRyxFQUMzRCxVQUFXLENBQ2YsRUFDTUksR0FBUyxDQUNYLFNBQVUsR0FBU0wsR0FBWSxDQUFLLEdBQUssR0FBUyxFQUNsRCxRQUFTLEdBQ1QsSUFBSyx3QkFDTCxPQUFRLE1BQ1IsS0FBTSxtQkFDTixTQUFVLEVBQUssRUFBVSxJQUFRQyxHQUFXLEVBQUssRUFBRyxHQUFJLENBQUcsRUFDM0QsVUFBVyxHQUFRQyxHQUFhLEVBQU0sR0FBSSxJQUFJLENBQ2xELEVDM0JNSSxHQUFTLENBQ1gsR0FDQSxHQUNBLEdBQ0EsR0FDQSxHQUNBQyxHQUNBQyxHQUNBQyxHQUNBQyxHQUNBQyxHQUNBQyxFQUNKLEVDaEJBLFNBQVNDLEdBQVksRUFBTyxDQUN4QixPQUFPLE9BQU8sR0FBVSxVQUFZLE9BQU8sVUFBVSxDQUFLLENBQzlELENBQ0EsTUFBTSxJQUFpQixDQUFFLFdBQVksS0FBSyxVQUFVLENBQUssRUFDbkQsR0FBYyxDQUNoQixDQUNJLFNBQVUsR0FBUyxPQUFPLEdBQVUsU0FDcEMsUUFBUyxHQUNULElBQUssd0JBQ0wsUUFBUyxHQUFPLEVBQ2hCLFVBQVcsRUFDZixFQUNBLENBQ0ksU0FBVSxHQUFTLEdBQVMsS0FDNUIsZUFBa0IsSUFBSSxFQUFPLElBQUksRUFDakMsUUFBUyxHQUNULElBQUsseUJBQ0wsS0FBTSxTQUNOLFlBQWUsS0FDZixVQUFXLEVBQ2YsRUFDQSxDQUNJLFNBQVUsR0FBUyxPQUFPLEdBQVUsVUFDcEMsUUFBUyxHQUNULElBQUsseUJBQ0wsS0FBTSxpQkFDTixRQUFTLEdBQU8sSUFBUSxPQUN4QixVQUFXLEVBQ2YsRUFDQSxDQUNJLFNBQVVBLEdBQ1YsUUFBUyxHQUNULElBQUssd0JBQ0wsS0FBTSx3QkFDTixTQUFVLEVBQUssRUFBVSxDQUFFLGlCQUFrQixFQUFjLE9BQU8sQ0FBRyxFQUFJLFNBQVMsRUFBSyxFQUFFLEVBQ3pGLFdBQVksQ0FBRSxXQUFZQSxHQUFZLENBQUssRUFBSSxFQUFNLFNBQVMsRUFBSSxLQUFLLFVBQVUsQ0FBSyxDQUMxRixFQUNBLENBQ0ksU0FBVSxHQUFTLE9BQU8sR0FBVSxTQUNwQyxRQUFTLEdBQ1QsSUFBSywwQkFDTCxLQUFNLHlEQUNOLFFBQVMsR0FBTyxXQUFXLENBQUcsRUFDOUIsVUFBVyxFQUNmLENBQ0osRUFVTUMsR0FBUyxDQUFDLEdBQUssRUFBRyxDQUFDLENBQUMsT0FBTyxHQUFhLENBUjFDLFFBQVMsR0FDVCxJQUFLLEdBQ0wsS0FBTSxJQUNOLFFBQVEsRUFBSyxFQUFTLENBRWxCLE9BREEsRUFBUSwyQkFBMkIsS0FBSyxVQUFVLENBQUcsR0FBRyxFQUNqRCxDQUNYLENBRWtELENBQUMsRUN4RGpELEdBQVMsQ0FDWCxTQUFVLEdBQVMsYUFBaUIsV0FDcEMsUUFBUyxHQUNULElBQUssMkJBU0wsUUFBUSxFQUFLLEVBQVMsQ0FDbEIsR0FBSSxPQUFPLE1BQVMsV0FBWSxDQUU1QixJQUFNLEVBQU0sS0FBSyxFQUFJLFFBQVEsVUFBVyxFQUFFLENBQUMsRUFDckMsRUFBUyxJQUFJLFdBQVcsRUFBSSxNQUFNLEVBQ3hDLElBQUssSUFBSSxFQUFJLEVBQUcsRUFBSSxFQUFJLE9BQVEsRUFBRSxFQUM5QixFQUFPLEdBQUssRUFBSSxXQUFXLENBQUMsRUFDaEMsT0FBTyxDQUNYLENBR0ksT0FEQSxFQUFRLDBGQUEwRixFQUMzRixDQUVmLEVBQ0EsVUFBVSxDQUFFLFVBQVMsT0FBTSxTQUFTLEVBQUssRUFBVyxFQUFhLENBQzdELEdBQUksQ0FBQyxFQUNELE1BQU8sR0FDWCxJQUFNLEVBQU0sRUFDUixFQUNKLEdBQUksT0FBTyxNQUFTLFdBQVksQ0FDNUIsSUFBSSxFQUFJLEdBQ1IsSUFBSyxJQUFJLEVBQUksRUFBRyxFQUFJLEVBQUksT0FBUSxFQUFFLEVBQzlCLEdBQUssT0FBTyxhQUFhLEVBQUksRUFBRSxFQUNuQyxFQUFNLEtBQUssQ0FBQyxDQUNoQixNQUVJLE1BQVUsTUFBTSwwRkFBMEYsRUFHOUcsR0FEQSxBQUFTLElBQU8sRUFBTyxjQUNuQixJQUFTLEVBQU8sYUFBYyxDQUM5QixJQUFNLEVBQVksS0FBSyxJQUFJLEVBQUksUUFBUSxVQUFZLEVBQUksT0FBTyxPQUFRLEVBQUksUUFBUSxlQUFlLEVBQzNGLEVBQUksS0FBSyxLQUFLLEVBQUksT0FBUyxDQUFTLEVBQ3BDLEVBQVksTUFBTSxDQUFDLEVBQ3pCLElBQUssSUFBSSxFQUFJLEVBQUcsRUFBSSxFQUFHLEVBQUksRUFBRyxFQUFFLEVBQUcsR0FBSyxFQUNwQyxFQUFNLEdBQUssRUFBSSxPQUFPLEVBQUcsQ0FBUyxFQUV0QyxFQUFNLEVBQU0sS0FBSyxJQUFTLEVBQU8sY0FBZ0I7RUFBTyxHQUFHLENBQy9ELENBQ0EsT0FBTyxHQUFnQixDQUFFLFVBQVMsT0FBTSxNQUFPLENBQUksRUFBRyxFQUFLLEVBQVcsQ0FBVyxDQUNyRixDQUNKLEVDbERBLFNBQVMsR0FBYSxFQUFLLEVBQVMsQ0FDaEMsR0FBSSxHQUFNLENBQUcsRUFDVCxJQUFLLElBQUksRUFBSSxFQUFHLEVBQUksRUFBSSxNQUFNLE9BQVEsRUFBRSxFQUFHLENBQ3ZDLElBQUksRUFBTyxFQUFJLE1BQU0sR0FDakIsTUFBTyxDQUFJLEVBRVYsSUFBSSxHQUFNLENBQUksRUFBRyxDQUNkLEVBQUssTUFBTSxPQUFTLEdBQ3BCLEVBQVEsZ0RBQWdELEVBQzVELElBQU0sRUFBTyxFQUFLLE1BQU0sSUFBTSxJQUFJLEVBQUssSUFBSSxFQUFPLElBQUksQ0FBQyxFQUt2RCxHQUpJLEVBQUssZ0JBQ0wsRUFBSyxJQUFJLGNBQWdCLEVBQUssSUFBSSxjQUM1QixHQUFHLEVBQUssY0FBYyxJQUFJLEVBQUssSUFBSSxnQkFDbkMsRUFBSyxlQUNYLEVBQUssUUFBUyxDQUNkLElBQU0sRUFBSyxFQUFLLE9BQVMsRUFBSyxJQUM5QixFQUFHLFFBQVUsRUFBRyxRQUNWLEdBQUcsRUFBSyxRQUFRLElBQUksRUFBRyxVQUN2QixFQUFLLE9BQ2YsQ0FDQSxFQUFPLENBQ1gsQ0FDQSxFQUFJLE1BQU0sR0FBSyxFQUFPLENBQUksRUFBSSxFQUFPLElBQUksRUFBSyxDQUFJLENBRGxELENBRUosTUFHQSxFQUFRLGtDQUFrQyxFQUM5QyxPQUFPLENBQ1gsQ0FDQSxTQUFTLEdBQVksRUFBUSxFQUFVLEVBQUssQ0FDeEMsR0FBTSxDQUFFLFlBQWEsRUFDZixFQUFRLElBQUksRUFBUSxDQUFNLEVBQ2hDLEVBQU0sSUFBTSwwQkFDWixJQUFJLEVBQUksRUFDUixHQUFJLEdBQVksT0FBTyxZQUFZLE9BQU8sQ0FBUSxFQUM5QyxJQUFLLElBQUksS0FBTSxFQUFVLENBQ2pCLE9BQU8sR0FBYSxhQUNwQixFQUFLLEVBQVMsS0FBSyxFQUFVLE9BQU8sR0FBRyxFQUFHLENBQUUsR0FDaEQsSUFBSSxFQUFLLEVBQ1QsR0FBSSxNQUFNLFFBQVEsQ0FBRSxFQUFHLENBQ25CLEdBQUksRUFBRyxTQUFXLEVBQ2QsRUFBTSxFQUFHLEdBQ1QsRUFBUSxFQUFHLFFBR1gsTUFBVSxVQUFVLGdDQUFnQyxHQUFJLENBQ2hFLE1BQ0ssR0FBSSxHQUFNLGFBQWMsT0FBUSxDQUNqQyxJQUFNLEVBQU8sT0FBTyxLQUFLLENBQUUsRUFDM0IsR0FBSSxFQUFLLFNBQVcsRUFDaEIsRUFBTSxFQUFLLEdBQ1gsRUFBUSxFQUFHLFFBR1gsTUFBVSxVQUFVLG9DQUFvQyxFQUFLLE9BQU8sTUFBTSxDQUVsRixLQUVJLEdBQU0sRUFFVixFQUFNLE1BQU0sS0FBSyxHQUFXLEVBQUssRUFBTyxDQUFHLENBQUMsQ0FDaEQsQ0FDSixPQUFPLENBQ1gsQ0FDQSxNQUFNLEdBQVEsQ0FDVixXQUFZLE1BQ1osUUFBUyxHQUNULElBQUssMEJBQ0wsUUFBUyxHQUNULFdBQVksRUFDaEIsRUNyRUEsSUFBTSxHQUFOLE1BQU0sVUFBaUIsQ0FBUSxDQUMzQixhQUFjLENBQ1YsTUFBTSxFQUNOLEtBQUssSUFBTSxFQUFRLFVBQVUsSUFBSSxLQUFLLElBQUksRUFDMUMsS0FBSyxPQUFTLEVBQVEsVUFBVSxPQUFPLEtBQUssSUFBSSxFQUNoRCxLQUFLLElBQU0sRUFBUSxVQUFVLElBQUksS0FBSyxJQUFJLEVBQzFDLEtBQUssSUFBTSxFQUFRLFVBQVUsSUFBSSxLQUFLLElBQUksRUFDMUMsS0FBSyxJQUFNLEVBQVEsVUFBVSxJQUFJLEtBQUssSUFBSSxFQUMxQyxLQUFLLElBQU0sRUFBUyxHQUN4QixDQUtBLE9BQU8sRUFBRyxFQUFLLENBQ1gsR0FBSSxDQUFDLEVBQ0QsT0FBTyxNQUFNLE9BQU8sQ0FBQyxFQUN6QixJQUFNLEVBQU0sSUFBSSxJQUNaLEdBQUssVUFDTCxFQUFJLFNBQVMsQ0FBRyxFQUNwQixJQUFLLElBQU0sS0FBUSxLQUFLLE1BQU8sQ0FDM0IsSUFBSSxFQUFLLEVBUVQsR0FQSSxFQUFPLENBQUksR0FDWCxFQUFNLEVBQUssRUFBSyxJQUFLLEdBQUksQ0FBRyxFQUM1QixFQUFRLEVBQUssRUFBSyxNQUFPLEVBQUssQ0FBRyxHQUdqQyxFQUFNLEVBQUssRUFBTSxHQUFJLENBQUcsRUFFeEIsRUFBSSxJQUFJLENBQUcsRUFDWCxNQUFVLE1BQU0sOENBQThDLEVBQ2xFLEVBQUksSUFBSSxFQUFLLENBQUssQ0FDdEIsQ0FDQSxPQUFPLENBQ1gsQ0FDQSxPQUFPLEtBQUssRUFBUSxFQUFVLEVBQUssQ0FDL0IsSUFBTSxFQUFRLEdBQVksRUFBUSxFQUFVLENBQUcsRUFDekMsRUFBTyxJQUFJLEtBRWpCLE1BREEsR0FBSyxNQUFRLEVBQU0sTUFDWixDQUNYLENBQ0osRUFDQSxHQUFTLElBQU0seUJBQ2YsTUFBTSxHQUFPLENBQ1QsV0FBWSxNQUNaLFNBQVUsR0FBUyxhQUFpQixJQUNwQyxVQUFXLEdBQ1gsUUFBUyxHQUNULElBQUsseUJBQ0wsUUFBUSxFQUFLLEVBQVMsQ0FDbEIsSUFBTSxFQUFRLEdBQWEsRUFBSyxDQUFPLEVBQ2pDLEVBQVcsQ0FBQyxFQUNsQixJQUFLLEdBQU0sQ0FBRSxTQUFTLEVBQU0sTUFDcEJDLEVBQVMsQ0FBRyxJQUNSLEVBQVMsU0FBUyxFQUFJLEtBQUssRUFDM0IsRUFBUSxpREFBaUQsRUFBSSxPQUFPLEVBR3BFLEVBQVMsS0FBSyxFQUFJLEtBQUssR0FJbkMsT0FBTyxPQUFPLE9BQU8sSUFBSSxHQUFZLENBQUssQ0FDOUMsRUFDQSxZQUFhLEVBQVEsRUFBVSxJQUFRLEdBQVMsS0FBSyxFQUFRLEVBQVUsQ0FBRyxDQUM5RSxFQ3JFQSxTQUFTLEdBQWMsQ0FBRSxRQUFPLFVBQVUsRUFBSyxDQUkzQyxPQUZJLElBRFksRUFBUSxHQUFVLEdBQUEsQ0FDWixLQUFLLEtBQUssQ0FBTSxFQUMzQixFQUNKLEVBQVEsRUFBSSxRQUFRLFFBQVUsRUFBSSxRQUFRLFFBQ3JELENBQ0EsTUFBTSxHQUFVLENBQ1osU0FBVSxHQUFTLElBQVUsR0FDN0IsUUFBUyxHQUNULElBQUsseUJBQ0wsS0FBTSw2Q0FDTixZQUFlLElBQUksRUFBTyxFQUFJLEVBQzlCLFVBQVcsRUFDZixFQUNNLEdBQVcsQ0FDYixTQUFVLEdBQVMsSUFBVSxHQUM3QixRQUFTLEdBQ1QsSUFBSyx5QkFDTCxLQUFNLCtDQUNOLFlBQWUsSUFBSSxFQUFPLEVBQUssRUFDL0IsVUFBVyxFQUNmLEVDcEJNLEdBQVcsQ0FDYixTQUFVLEdBQVMsT0FBTyxHQUFVLFNBQ3BDLFFBQVMsR0FDVCxJQUFLLDBCQUNMLEtBQU0saURBQ04sUUFBVSxHQUFRLEVBQUksTUFBTSxFQUFFLENBQUMsQ0FBQyxZQUFZLElBQU0sTUFDNUMsSUFDQSxFQUFJLEtBQU8sSUFDUCxLQUNBLElBQ1YsVUFBVyxDQUNmLEVBQ00sR0FBVyxDQUNiLFNBQVUsR0FBUyxPQUFPLEdBQVUsU0FDcEMsUUFBUyxHQUNULElBQUssMEJBQ0wsT0FBUSxNQUNSLEtBQU0sd0RBQ04sUUFBVSxHQUFRLFdBQVcsRUFBSSxRQUFRLEtBQU0sRUFBRSxDQUFDLEVBQ2xELFVBQVUsRUFBTSxDQUNaLElBQU0sRUFBTSxPQUFPLEVBQUssS0FBSyxFQUM3QixPQUFPLFNBQVMsQ0FBRyxFQUFJLEVBQUksY0FBYyxFQUFJLEVBQWdCLENBQUksQ0FDckUsQ0FDSixFQUNNLEdBQVEsQ0FDVixTQUFVLEdBQVMsT0FBTyxHQUFVLFNBQ3BDLFFBQVMsR0FDVCxJQUFLLDBCQUNMLEtBQU0sb0NBQ04sUUFBUSxFQUFLLENBQ1QsSUFBTSxFQUFPLElBQUksRUFBTyxXQUFXLEVBQUksUUFBUSxLQUFNLEVBQUUsQ0FBQyxDQUFDLEVBQ25ELEVBQU0sRUFBSSxRQUFRLEdBQUcsRUFDM0IsR0FBSSxJQUFRLEdBQUksQ0FDWixJQUFNLEVBQUksRUFBSSxVQUFVLEVBQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxLQUFNLEVBQUUsRUFDN0MsRUFBRSxFQUFFLE9BQVMsS0FBTyxNQUNwQixFQUFLLGtCQUFvQixFQUFFLE9BQ25DLENBQ0EsT0FBTyxDQUNYLEVBQ0EsVUFBVyxDQUNmLEVDekNNLEdBQWUsR0FBVSxPQUFPLEdBQVUsVUFBWSxPQUFPLFVBQVUsQ0FBSyxFQUNsRixTQUFTLEdBQVcsRUFBSyxFQUFRLEVBQU8sQ0FBRSxlQUFlLENBQ3JELElBQU0sRUFBTyxFQUFJLEdBSWpCLElBSEksSUFBUyxLQUFPLElBQVMsT0FDekIsR0FBVSxHQUNkLEVBQU0sRUFBSSxVQUFVLENBQU0sQ0FBQyxDQUFDLFFBQVEsS0FBTSxFQUFFLEVBQ3hDLEVBQWEsQ0FDYixPQUFRLEVBQVIsQ0FDSSxJQUFLLEdBQ0QsRUFBTSxLQUFLLElBQ1gsTUFDSixJQUFLLEdBQ0QsRUFBTSxLQUFLLElBQ1gsTUFDSixJQUFLLElBQ0QsRUFBTSxLQUFLLEdBRW5CLENBQ0EsSUFBTSxFQUFJLE9BQU8sQ0FBRyxFQUNwQixPQUFPLElBQVMsSUFBTSxPQUFPLEVBQUUsRUFBSSxFQUFJLENBQzNDLENBQ0EsSUFBTSxFQUFJLFNBQVMsRUFBSyxDQUFLLEVBQzdCLE9BQU8sSUFBUyxJQUFNLEdBQUssRUFBSSxDQUNuQyxDQUNBLFNBQVMsR0FBYSxFQUFNLEVBQU8sRUFBUSxDQUN2QyxHQUFNLENBQUUsU0FBVSxFQUNsQixHQUFJLEdBQVksQ0FBSyxFQUFHLENBQ3BCLElBQU0sRUFBTSxFQUFNLFNBQVMsQ0FBSyxFQUNoQyxPQUFPLEVBQVEsRUFBSSxJQUFNLEVBQVMsRUFBSSxPQUFPLENBQUMsRUFBSSxFQUFTLENBQy9ELENBQ0EsT0FBTyxFQUFnQixDQUFJLENBQy9CLENBQ0EsTUFBTSxHQUFTLENBQ1gsU0FBVSxHQUNWLFFBQVMsR0FDVCxJQUFLLHdCQUNMLE9BQVEsTUFDUixLQUFNLG1CQUNOLFNBQVUsRUFBSyxFQUFVLElBQVEsR0FBVyxFQUFLLEVBQUcsRUFBRyxDQUFHLEVBQzFELFVBQVcsR0FBUSxHQUFhLEVBQU0sRUFBRyxJQUFJLENBQ2pELEVBQ00sR0FBUyxDQUNYLFNBQVUsR0FDVixRQUFTLEdBQ1QsSUFBSyx3QkFDTCxPQUFRLE1BQ1IsS0FBTSxrQkFDTixTQUFVLEVBQUssRUFBVSxJQUFRLEdBQVcsRUFBSyxFQUFHLEVBQUcsQ0FBRyxFQUMxRCxVQUFXLEdBQVEsR0FBYSxFQUFNLEVBQUcsR0FBRyxDQUNoRCxFQUNNLEdBQU0sQ0FDUixTQUFVLEdBQ1YsUUFBUyxHQUNULElBQUssd0JBQ0wsS0FBTSxzQkFDTixTQUFVLEVBQUssRUFBVSxJQUFRLEdBQVcsRUFBSyxFQUFHLEdBQUksQ0FBRyxFQUMzRCxVQUFXLENBQ2YsRUFDTSxHQUFTLENBQ1gsU0FBVSxHQUNWLFFBQVMsR0FDVCxJQUFLLHdCQUNMLE9BQVEsTUFDUixLQUFNLHlCQUNOLFNBQVUsRUFBSyxFQUFVLElBQVEsR0FBVyxFQUFLLEVBQUcsR0FBSSxDQUFHLEVBQzNELFVBQVcsR0FBUSxHQUFhLEVBQU0sR0FBSSxJQUFJLENBQ2xELEVDaEVBLElBQU0sR0FBTixNQUFNLFVBQWdCLENBQVEsQ0FDMUIsWUFBWSxFQUFRLENBQ2hCLE1BQU0sQ0FBTSxFQUNaLEtBQUssSUFBTSxFQUFRLEdBQ3ZCLENBQ0EsSUFBSSxFQUFLLENBQ0wsSUFBSSxFQUNKLEFBU0ksRUFUQSxFQUFPLENBQUcsRUFDSCxFQUNGLEdBQ0wsT0FBTyxHQUFRLFVBQ2YsUUFBUyxHQUNULFVBQVcsR0FDWCxFQUFJLFFBQVUsS0FDUCxJQUFJLEVBQUssRUFBSSxJQUFLLElBQUksRUFFdEIsSUFBSSxFQUFLLEVBQUssSUFBSSxFQUNoQixFQUFTLEtBQUssTUFBTyxFQUFLLEdBQy9CLEdBQ0osS0FBSyxNQUFNLEtBQUssQ0FBSSxDQUM1QixDQUtBLElBQUksRUFBSyxFQUFVLENBQ2YsSUFBTSxFQUFPLEVBQVMsS0FBSyxNQUFPLENBQUcsRUFDckMsTUFBTyxDQUFDLEdBQVksRUFBTyxDQUFJLEVBQ3pCQyxFQUFTLEVBQUssR0FBRyxFQUNiLEVBQUssSUFBSSxNQUNULEVBQUssSUFDVCxDQUNWLENBQ0EsSUFBSSxFQUFLLEVBQU8sQ0FDWixHQUFJLE9BQU8sR0FBVSxVQUNqQixNQUFVLE1BQU0saUVBQWlFLE9BQU8sR0FBTyxFQUNuRyxJQUFNLEVBQU8sRUFBUyxLQUFLLE1BQU8sQ0FBRyxFQUNqQyxHQUFRLENBQUMsRUFDVCxLQUFLLE1BQU0sT0FBTyxLQUFLLE1BQU0sUUFBUSxDQUFJLEVBQUcsQ0FBQyxFQUV4QyxDQUFDLEdBQVEsR0FDZCxLQUFLLE1BQU0sS0FBSyxJQUFJLEVBQUssQ0FBRyxDQUFDLENBRXJDLENBQ0EsT0FBTyxFQUFHLEVBQUssQ0FDWCxPQUFPLE1BQU0sT0FBTyxFQUFHLEVBQUssR0FBRyxDQUNuQyxDQUNBLFNBQVMsRUFBSyxFQUFXLEVBQWEsQ0FDbEMsR0FBSSxDQUFDLEVBQ0QsT0FBTyxLQUFLLFVBQVUsSUFBSSxFQUM5QixHQUFJLEtBQUssaUJBQWlCLEVBQUksRUFDMUIsT0FBTyxNQUFNLFNBQVMsT0FBTyxPQUFPLENBQUMsRUFBRyxFQUFLLENBQUUsY0FBZSxFQUFLLENBQUMsRUFBRyxFQUFXLENBQVcsRUFFN0YsTUFBVSxNQUFNLHFDQUFxQyxDQUM3RCxDQUNBLE9BQU8sS0FBSyxFQUFRLEVBQVUsRUFBSyxDQUMvQixHQUFNLENBQUUsWUFBYSxFQUNmLEVBQU0sSUFBSSxLQUFLLENBQU0sRUFDM0IsR0FBSSxHQUFZLE9BQU8sWUFBWSxPQUFPLENBQVEsRUFDOUMsSUFBSyxJQUFJLEtBQVMsRUFDVixPQUFPLEdBQWEsYUFDcEIsRUFBUSxFQUFTLEtBQUssRUFBVSxFQUFPLENBQUssR0FDaEQsRUFBSSxNQUFNLEtBQUssR0FBVyxFQUFPLEtBQU0sQ0FBRyxDQUFDLEVBRW5ELE9BQU8sQ0FDWCxDQUNKLEVBQ0EsR0FBUSxJQUFNLHdCQUNkLE1BQU0sR0FBTSxDQUNSLFdBQVksTUFDWixTQUFVLEdBQVMsYUFBaUIsSUFDcEMsVUFBVyxHQUNYLFFBQVMsR0FDVCxJQUFLLHdCQUNMLFlBQWEsRUFBUSxFQUFVLElBQVEsR0FBUSxLQUFLLEVBQVEsRUFBVSxDQUFHLEVBQ3pFLFFBQVEsRUFBSyxFQUFTLENBQ2xCLEdBQUksR0FBTSxDQUFHLEVBQUcsQ0FDWixHQUFJLEVBQUksaUJBQWlCLEVBQUksRUFDekIsT0FBTyxPQUFPLE9BQU8sSUFBSSxHQUFXLENBQUcsRUFFdkMsRUFBUSxxQ0FBcUMsQ0FDckQsTUFFSSxFQUFRLGlDQUFpQyxFQUM3QyxPQUFPLENBQ1gsQ0FDSixFQ3ZGQSxTQUFTLEdBQWlCLEVBQUssRUFBVSxDQUNyQyxJQUFNLEVBQU8sRUFBSSxHQUNYLEVBQVEsSUFBUyxLQUFPLElBQVMsSUFBTSxFQUFJLFVBQVUsQ0FBQyxFQUFJLEVBQzFELEVBQU8sR0FBTSxFQUFXLE9BQU8sQ0FBQyxFQUFJLE9BQU8sQ0FBQyxFQUM1QyxFQUFNLEVBQ1AsUUFBUSxLQUFNLEVBQUUsQ0FBQyxDQUNqQixNQUFNLEdBQUcsQ0FBQyxDQUNWLFFBQVEsRUFBSyxJQUFNLEVBQU0sRUFBSSxFQUFFLEVBQUksRUFBSSxDQUFDLEVBQUcsRUFBSSxDQUFDLENBQUMsRUFDdEQsT0FBUSxJQUFTLElBQU0sRUFBSSxFQUFFLEVBQUksRUFBTSxDQUMzQyxDQU1BLFNBQVMsR0FBcUIsRUFBTSxDQUNoQyxHQUFJLENBQUUsU0FBVSxFQUNaLEVBQU8sR0FBTSxFQUNqQixHQUFJLE9BQU8sR0FBVSxTQUNqQixFQUFNLEdBQUssT0FBTyxDQUFDLE9BQ2xCLEdBQUksTUFBTSxDQUFLLEdBQUssQ0FBQyxTQUFTLENBQUssRUFDcEMsT0FBTyxFQUFnQixDQUFJLEVBQy9CLElBQUksRUFBTyxHQUNQLEVBQVEsSUFDUixFQUFPLElBQ1AsR0FBUyxFQUFJLEVBQUUsR0FFbkIsSUFBTSxFQUFNLEVBQUksRUFBRSxFQUNaLEVBQVEsQ0FBQyxFQUFRLENBQUcsRUFZMUIsT0FYSSxFQUFRLEdBQ1IsRUFBTSxRQUFRLENBQUMsR0FHZixHQUFTLEVBQVEsRUFBTSxJQUFNLEVBQzdCLEVBQU0sUUFBUSxFQUFRLENBQUcsRUFDckIsR0FBUyxLQUNULEdBQVMsRUFBUSxFQUFNLElBQU0sRUFDN0IsRUFBTSxRQUFRLENBQUssSUFHbkIsRUFDSixFQUNLLElBQUksR0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRyxHQUFHLENBQUMsQ0FBQyxDQUNwQyxLQUFLLEdBQUcsQ0FBQyxDQUNULFFBQVEsYUFBYyxFQUFFLENBRXJDLENBQ0EsTUFBTSxHQUFVLENBQ1osU0FBVSxHQUFTLE9BQU8sR0FBVSxVQUFZLE9BQU8sVUFBVSxDQUFLLEVBQ3RFLFFBQVMsR0FDVCxJQUFLLHdCQUNMLE9BQVEsT0FDUixLQUFNLHVDQUNOLFNBQVUsRUFBSyxFQUFVLENBQUUsaUJBQWtCLEdBQWlCLEVBQUssQ0FBVyxFQUM5RSxVQUFXLEVBQ2YsRUFDTSxHQUFZLENBQ2QsU0FBVSxHQUFTLE9BQU8sR0FBVSxTQUNwQyxRQUFTLEdBQ1QsSUFBSywwQkFDTCxPQUFRLE9BQ1IsS0FBTSxnREFDTixRQUFTLEdBQU8sR0FBaUIsRUFBSyxFQUFLLEVBQzNDLFVBQVcsRUFDZixFQUNNLEdBQVksQ0FDZCxTQUFVLEdBQVMsYUFBaUIsS0FDcEMsUUFBUyxHQUNULElBQUssOEJBSUwsS0FBTSxPQUFPLDJKQUtKLEVBQ1QsUUFBUSxFQUFLLENBQ1QsSUFBTSxFQUFRLEVBQUksTUFBTSxHQUFVLElBQUksRUFDdEMsR0FBSSxDQUFDLEVBQ0QsTUFBVSxNQUFNLHNEQUFzRCxFQUMxRSxHQUFNLEVBQUcsRUFBTSxFQUFPLEVBQUssRUFBTSxFQUFRLEdBQVUsRUFBTSxJQUFJLE1BQU0sRUFDN0QsRUFBVyxFQUFNLEdBQUssUUFBUSxFQUFNLEdBQUssS0FBQSxDQUFNLE9BQU8sRUFBRyxDQUFDLENBQUMsRUFBSSxFQUNqRSxFQUFPLEtBQUssSUFBSSxFQUFNLEVBQVEsRUFBRyxFQUFLLEdBQVEsRUFBRyxHQUFVLEVBQUcsR0FBVSxFQUFHLENBQVEsRUFDakYsRUFBSyxFQUFNLEdBQ2pCLEdBQUksR0FBTSxJQUFPLElBQUssQ0FDbEIsSUFBSSxFQUFJLEdBQWlCLEVBQUksRUFBSyxFQUM5QixLQUFLLElBQUksQ0FBQyxFQUFJLEtBQ2QsR0FBSyxJQUNULEdBQVEsSUFBUSxDQUNwQixDQUNBLE9BQU8sSUFBSSxLQUFLLENBQUksQ0FDeEIsRUFDQSxXQUFZLENBQUUsV0FBWSxHQUFPLFlBQVksQ0FBQyxDQUFDLFFBQVEsc0JBQXVCLEVBQUUsR0FBSyxFQUN6RixFQ3BGTSxHQUFTLENBQ1gsR0FDQSxHQUNBLEdBQ0EsR0FDQSxHQUNBLEdBQ0EsR0FDQSxHQUNBLEdBQ0EsR0FDQSxHQUNBLEdBQ0EsR0FDQSxHQUNBLEVBQ0EsR0FDQSxHQUNBLEdBQ0EsR0FDQSxHQUNBLEVBQ0osRUNuQk0sR0FBVSxJQUFJLElBQUksQ0FDcEIsQ0FBQyxPQUFRQyxFQUFNLEVBQ2YsQ0FBQyxXQUFZLENBQUMsR0FBSyxHQUFLLEVBQU0sQ0FBQyxFQUMvQixDQUFDLE9BQVEsRUFBUSxFQUNqQixDQUFDLFNBQVVDLEVBQVEsRUFDbkIsQ0FBQyxXQUFZQSxFQUFRLENBQ3pCLENBQUMsRUFDSyxHQUFhLENBQ2YsVUFDQSxLQUFNLEdBQ04sTUFBQSxHQUNBLFNBQUEsR0FDQSxTQUFBLEdBQ0EsYUFDQSxJQUFBLEdBQ0EsT0FBQSxHQUNBLE9BQUEsR0FDQSxXQUNBLE9BQ0EsUUFDQSxLQUFNLEdBQ04sUUFDQSxTQUNBLE9BQ0EsT0FDQSxZQUNKLEVBQ00sR0FBZ0IsQ0FDbEIsMkJBQTRCLEdBQzVCLDBCQUEyQixFQUMzQix5QkFBMEIsR0FDMUIsMEJBQTJCLEdBQzNCLHdCQUF5QixHQUN6Qiw4QkFBK0IsRUFDbkMsRUFDQSxTQUFTLEdBQVEsRUFBWSxFQUFZLEVBQWEsQ0FDbEQsSUFBTSxFQUFhLEdBQVEsSUFBSSxDQUFVLEVBQ3pDLEdBQUksR0FBYyxDQUFDLEVBQ2YsT0FBTyxHQUFlLENBQUMsRUFBVyxTQUFTLENBQUssRUFDMUMsRUFBVyxPQUFPLENBQUssRUFDdkIsRUFBVyxNQUFNLEVBRTNCLElBQUksRUFBTyxFQUNYLEdBQUksQ0FBQyxFQUFNLENBQ1AsR0FBSSxNQUFNLFFBQVEsQ0FBVSxFQUN4QixFQUFPLENBQUMsTUFDUCxDQUNELElBQU0sRUFBTyxNQUFNLEtBQUssR0FBUSxLQUFLLENBQUMsQ0FBQyxDQUNsQyxPQUFPLEdBQU8sSUFBUSxRQUFRLENBQUMsQ0FDL0IsSUFBSSxHQUFPLEtBQUssVUFBVSxDQUFHLENBQUMsQ0FBQyxDQUMvQixLQUFLLElBQUksRUFDZCxNQUFVLE1BQU0sbUJBQW1CLEVBQVcsZ0JBQWdCLEVBQUssNEJBQTRCLENBQ25HLENBQ0osQ0FDQSxHQUFJLE1BQU0sUUFBUSxDQUFVLEVBQ3hCLElBQUssSUFBTSxLQUFPLEVBQ2QsRUFBTyxFQUFLLE9BQU8sQ0FBRyxPQUVyQixPQUFPLEdBQWUsYUFDM0IsRUFBTyxFQUFXLEVBQUssTUFBTSxDQUFDLEdBSWxDLE9BRkksSUFDQSxFQUFPLEVBQUssT0FBTyxDQUFLLEdBQ3JCLEVBQUssUUFBUSxFQUFNLElBQVEsQ0FDOUIsSUFBTSxFQUFTLE9BQU8sR0FBUSxTQUFXLEdBQVcsR0FBTyxFQUMzRCxHQUFJLENBQUMsRUFBUSxDQUNULElBQU0sRUFBVSxLQUFLLFVBQVUsQ0FBRyxFQUM1QixFQUFPLE9BQU8sS0FBSyxFQUFVLENBQUMsQ0FDL0IsSUFBSSxHQUFPLEtBQUssVUFBVSxDQUFHLENBQUMsQ0FBQyxDQUMvQixLQUFLLElBQUksRUFDZCxNQUFVLE1BQU0sc0JBQXNCLEVBQVEsZUFBZSxHQUFNLENBQ3ZFLENBR0EsT0FGSyxFQUFLLFNBQVMsQ0FBTSxHQUNyQixFQUFLLEtBQUssQ0FBTSxFQUNiLENBQ1gsRUFBRyxDQUFDLENBQUMsQ0FDVCxDQ3ZGQSxNQUFNLElBQXVCLEVBQUcsSUFBTSxFQUFFLElBQU0sRUFBRSxJQUFNLEdBQUssSUFBRSxJQUFNLEVBQUUsS0FDckUsSUFBTSxHQUFOLE1BQU0sQ0FBTyxDQUNULFlBQVksQ0FBRSxTQUFRLGFBQVksUUFBTyxtQkFBa0IsU0FBUSxpQkFBZ0Isb0JBQW9CLENBQ25HLEtBQUssT0FBUyxNQUFNLFFBQVEsQ0FBTSxFQUM1QixHQUFRLEVBQVEsUUFBUSxFQUN4QixFQUNJLEdBQVEsS0FBTSxDQUFNLEVBQ3BCLEtBQ1YsS0FBSyxLQUFRLE9BQU8sR0FBVyxVQUFZLEdBQVcsT0FDdEQsS0FBSyxVQUFZLEVBQW1CLEdBQWdCLENBQUMsRUFDckQsS0FBSyxLQUFPLEdBQVEsRUFBWSxLQUFLLEtBQU0sQ0FBSyxFQUNoRCxLQUFLLGdCQUFrQixHQUFvQixLQUMzQyxPQUFPLGVBQWUsS0FBTSxFQUFLLENBQUUsTUFBTyxFQUFJLENBQUMsRUFDL0MsT0FBTyxlQUFlLEtBQU1DLEVBQVEsQ0FBRSxNQUFPLEVBQU8sQ0FBQyxFQUNyRCxPQUFPLGVBQWUsS0FBTSxHQUFLLENBQUUsTUFBTyxFQUFJLENBQUMsRUFFL0MsS0FBSyxlQUNELE9BQU8sR0FBbUIsV0FDcEIsRUFDQSxJQUFtQixHQUNmLEdBQ0EsSUFDbEIsQ0FDQSxPQUFRLENBQ0osSUFBTSxFQUFPLE9BQU8sT0FBTyxFQUFPLFVBQVcsT0FBTywwQkFBMEIsSUFBSSxDQUFDLEVBRW5GLE1BREEsR0FBSyxLQUFPLEtBQUssS0FBSyxNQUFNLEVBQ3JCLENBQ1gsQ0FDSixFQzlCQSxTQUFTLEdBQWtCLEVBQUssRUFBUyxDQUNyQyxJQUFNLEVBQVEsQ0FBQyxFQUNYLEVBQWdCLEVBQVEsYUFBZSxHQUMzQyxHQUFJLEVBQVEsYUFBZSxJQUFTLEVBQUksV0FBWSxDQUNoRCxJQUFNLEVBQU0sRUFBSSxXQUFXLFNBQVMsQ0FBRyxFQUNuQyxHQUNBLEVBQU0sS0FBSyxDQUFHLEVBQ2QsRUFBZ0IsSUFFWCxFQUFJLFdBQVcsV0FDcEIsRUFBZ0IsR0FDeEIsQ0FDSSxHQUNBLEVBQU0sS0FBSyxLQUFLLEVBQ3BCLElBQU0sRUFBTSxHQUF1QixFQUFLLENBQU8sRUFDekMsQ0FBRSxpQkFBa0IsRUFBSSxRQUM5QixHQUFJLEVBQUksY0FBZSxDQUNmLEVBQU0sU0FBVyxHQUNqQixFQUFNLFFBQVEsRUFBRSxFQUNwQixJQUFNLEVBQUssRUFBYyxFQUFJLGFBQWEsRUFDMUMsRUFBTSxRQUFRLEVBQWMsRUFBSSxFQUFFLENBQUMsQ0FDdkMsQ0FDQSxJQUFJLEVBQVksR0FDWixFQUFpQixLQUNyQixHQUFJLEVBQUksU0FBVSxDQUNkLEdBQUksRUFBTyxFQUFJLFFBQVEsRUFBRyxDQUd0QixHQUZJLEVBQUksU0FBUyxhQUFlLEdBQzVCLEVBQU0sS0FBSyxFQUFFLEVBQ2IsRUFBSSxTQUFTLGNBQWUsQ0FDNUIsSUFBTSxFQUFLLEVBQWMsRUFBSSxTQUFTLGFBQWEsRUFDbkQsRUFBTSxLQUFLLEVBQWMsRUFBSSxFQUFFLENBQUMsQ0FDcEMsQ0FFQSxFQUFJLGlCQUFtQixDQUFDLENBQUMsRUFBSSxRQUM3QixFQUFpQixFQUFJLFNBQVMsT0FDbEMsQ0FDQSxJQUFNLEVBQWMsRUFBaUIsSUFBQSxPQUFtQixFQUFZLEdBQ2hFLEVBQU9DLEVBQVUsRUFBSSxTQUFVLE1BQVksRUFBaUIsS0FBTyxDQUFXLEVBQzlFLElBQ0EsR0FBUSxFQUFZLEVBQU0sR0FBSSxFQUFjLENBQWMsQ0FBQyxJQUMxRCxFQUFLLEtBQU8sS0FBTyxFQUFLLEtBQU8sTUFDaEMsRUFBTSxFQUFNLE9BQVMsS0FBTyxNQUc1QixFQUFNLEVBQU0sT0FBUyxHQUFLLE9BQU8sSUFHakMsRUFBTSxLQUFLLENBQUksQ0FDdkIsTUFFSSxFQUFNLEtBQUtBLEVBQVUsRUFBSSxTQUFVLENBQUcsQ0FBQyxFQUUzQyxHQUFJLEVBQUksWUFBWSxPQUFRLENBQ3hCLEdBQUksRUFBSSxRQUFTLENBQ2IsSUFBTSxFQUFLLEVBQWMsRUFBSSxPQUFPLEVBQ2hDLEVBQUcsU0FBUztDQUFJLEdBQ2hCLEVBQU0sS0FBSyxLQUFLLEVBQ2hCLEVBQU0sS0FBSyxFQUFjLEVBQUksRUFBRSxDQUFDLEdBR2hDLEVBQU0sS0FBSyxPQUFPLEdBQUksQ0FFOUIsTUFFSSxFQUFNLEtBQUssS0FBSyxDQUV4QixLQUNLLENBQ0QsSUFBSSxFQUFLLEVBQUksUUFDVCxHQUFNLElBQ04sRUFBSyxFQUFHLFFBQVEsT0FBUSxFQUFFLEdBQzFCLEtBQ0ssQ0FBQyxHQUFhLElBQW1CLEVBQU0sRUFBTSxPQUFTLEtBQU8sSUFDOUQsRUFBTSxLQUFLLEVBQUUsRUFDakIsRUFBTSxLQUFLLEVBQWMsRUFBYyxDQUFFLEVBQUcsRUFBRSxDQUFDLEVBRXZELENBQ0EsT0FBTyxFQUFNLEtBQUs7Q0FBSSxFQUFJO0NBQzlCLENDdEVBLElBQU0sR0FBTixNQUFNLENBQVMsQ0FDWCxZQUFZLEVBQU8sRUFBVSxFQUFTLENBRWxDLEtBQUssY0FBZ0IsS0FFckIsS0FBSyxRQUFVLEtBRWYsS0FBSyxPQUFTLENBQUMsRUFFZixLQUFLLFNBQVcsQ0FBQyxFQUNqQixPQUFPLGVBQWUsS0FBTSxFQUFXLENBQUUsTUFBTyxFQUFJLENBQUMsRUFDckQsSUFBSSxFQUFZLEtBQ1osT0FBTyxHQUFhLFlBQWMsTUFBTSxRQUFRLENBQVEsRUFDeEQsRUFBWSxFQUVQLElBQVksSUFBQSxJQUFhLElBQzlCLEVBQVUsRUFDVixFQUFXLElBQUEsSUFFZixJQUFNLEVBQU0sT0FBTyxPQUFPLENBQ3RCLFlBQWEsR0FDYixpQkFBa0IsR0FDbEIsU0FBVSxPQUNWLGFBQWMsR0FDZCxPQUFRLEdBQ1IsV0FBWSxHQUNaLFdBQVksR0FDWixRQUFTLEtBQ2IsRUFBRyxDQUFPLEVBQ1YsS0FBSyxRQUFVLEVBQ2YsR0FBSSxDQUFFLFdBQVksRUFDZCxHQUFTLGFBQ1QsS0FBSyxXQUFhLEVBQVEsWUFBWSxXQUFXLEVBQzdDLEtBQUssV0FBVyxLQUFLLFdBQ3JCLEVBQVUsS0FBSyxXQUFXLEtBQUssVUFHbkMsS0FBSyxXQUFhLElBQUksRUFBVyxDQUFFLFNBQVEsQ0FBQyxFQUNoRCxLQUFLLFVBQVUsRUFBUyxDQUFPLEVBRS9CLEtBQUssU0FDRCxJQUFVLElBQUEsR0FBWSxLQUFPLEtBQUssV0FBVyxFQUFPLEVBQVcsQ0FBTyxDQUM5RSxDQU1BLE9BQVEsQ0FDSixJQUFNLEVBQU8sT0FBTyxPQUFPLEVBQVMsVUFBVyxFQUMxQyxHQUFZLENBQUUsTUFBTyxFQUFJLENBQzlCLENBQUMsRUFlRCxNQWRBLEdBQUssY0FBZ0IsS0FBSyxjQUMxQixFQUFLLFFBQVUsS0FBSyxRQUNwQixFQUFLLE9BQVMsS0FBSyxPQUFPLE1BQU0sRUFDaEMsRUFBSyxTQUFXLEtBQUssU0FBUyxNQUFNLEVBQ3BDLEVBQUssUUFBVSxPQUFPLE9BQU8sQ0FBQyxFQUFHLEtBQUssT0FBTyxFQUN6QyxLQUFLLGFBQ0wsRUFBSyxXQUFhLEtBQUssV0FBVyxNQUFNLEdBQzVDLEVBQUssT0FBUyxLQUFLLE9BQU8sTUFBTSxFQUVoQyxFQUFLLFNBQVcsRUFBTyxLQUFLLFFBQVEsRUFDOUIsS0FBSyxTQUFTLE1BQU0sRUFBSyxNQUFNLEVBQy9CLEtBQUssU0FDUCxLQUFLLFFBQ0wsRUFBSyxNQUFRLEtBQUssTUFBTSxNQUFNLEdBQzNCLENBQ1gsQ0FFQSxJQUFJLEVBQU8sQ0FDSCxHQUFpQixLQUFLLFFBQVEsR0FDOUIsS0FBSyxTQUFTLElBQUksQ0FBSyxDQUMvQixDQUVBLE1BQU0sRUFBTSxFQUFPLENBQ1gsR0FBaUIsS0FBSyxRQUFRLEdBQzlCLEtBQUssU0FBUyxNQUFNLEVBQU0sQ0FBSyxDQUN2QyxDQVVBLFlBQVksRUFBTSxFQUFNLENBQ3BCLEdBQUksQ0FBQyxFQUFLLE9BQVEsQ0FDZCxJQUFNLEVBQU8sR0FBWSxJQUFJLEVBQzdCLEVBQUssT0FFRCxDQUFDLEdBQVEsRUFBSyxJQUFJLENBQUksRUFBSSxHQUFjLEdBQVEsSUFBSyxDQUFJLEVBQUksQ0FDckUsQ0FDQSxPQUFPLElBQUksR0FBTSxFQUFLLE1BQU0sQ0FDaEMsQ0FDQSxXQUFXLEVBQU8sRUFBVSxFQUFTLENBQ2pDLElBQUksRUFDSixHQUFJLE9BQU8sR0FBYSxXQUNwQixFQUFRLEVBQVMsS0FBSyxDQUFFLEdBQUksQ0FBTSxFQUFHLEdBQUksQ0FBSyxFQUM5QyxFQUFZLE9BRVgsR0FBSSxNQUFNLFFBQVEsQ0FBUSxFQUFHLENBRTlCLElBQU0sRUFBUSxFQUFTLE9BREwsR0FBTSxPQUFPLEdBQU0sVUFBWSxhQUFhLFFBQVUsYUFBYSxNQUMvQyxDQUFDLENBQUMsSUFBSSxNQUFNLEVBQzlDLEVBQU0sT0FBUyxJQUNmLEVBQVcsRUFBUyxPQUFPLENBQUssR0FDcEMsRUFBWSxDQUNoQixNQUNTLElBQVksSUFBQSxJQUFhLElBQzlCLEVBQVUsRUFDVixFQUFXLElBQUEsSUFFZixHQUFNLENBQUUsd0JBQXVCLGVBQWMsT0FBTSxnQkFBZSxXQUFVLE9BQVEsR0FBVyxDQUFDLEVBQzFGLENBQUUsV0FBVSxhQUFZLGlCQUFrQixHQUFrQixLQUVsRSxHQUFnQixHQUFHLEVBQ2IsRUFBTSxDQUNSLHNCQUF1QixHQUF5QixHQUNoRCxjQUFlLEdBQWlCLEdBQ2hDLFdBQ0EsV0FDQSxTQUFVLEVBQ1YsT0FBUSxLQUFLLE9BQ2IsZUFDSixFQUNNLEVBQU8sR0FBVyxFQUFPLEVBQUssQ0FBRyxFQUl2QyxPQUhJLEdBQVFDLEVBQWEsQ0FBSSxJQUN6QixFQUFLLEtBQU8sSUFDaEIsRUFBVyxFQUNKLENBQ1gsQ0FLQSxXQUFXLEVBQUssRUFBTyxFQUFVLENBQUMsRUFBRyxDQUdqQyxPQUFPLElBQUksRUFGRCxLQUFLLFdBQVcsRUFBSyxLQUFNLENBRXJCLEVBRE4sS0FBSyxXQUFXLEVBQU8sS0FBTSxDQUNwQixDQUFDLENBQ3hCLENBS0EsT0FBTyxFQUFLLENBQ1IsT0FBTyxHQUFpQixLQUFLLFFBQVEsRUFBSSxLQUFLLFNBQVMsT0FBTyxDQUFHLEVBQUksRUFDekUsQ0FLQSxTQUFTLEVBQU0sQ0FRWCxPQVBJLEdBQVksQ0FBSSxFQUNaLEtBQUssVUFBWSxPQUdyQixLQUFLLFNBQVcsS0FDVCxJQUVKLEdBQWlCLEtBQUssUUFBUSxFQUMvQixLQUFLLFNBQVMsU0FBUyxDQUFJLEVBQzNCLEVBQ1YsQ0FNQSxJQUFJLEVBQUssRUFBWSxDQUNqQixPQUFPQSxFQUFhLEtBQUssUUFBUSxFQUMzQixLQUFLLFNBQVMsSUFBSSxFQUFLLENBQVUsRUFDakMsSUFBQSxFQUNWLENBTUEsTUFBTSxFQUFNLEVBQVksQ0FLcEIsT0FKSSxHQUFZLENBQUksRUFDVCxDQUFDLEdBQWNDLEVBQVMsS0FBSyxRQUFRLEVBQ3RDLEtBQUssU0FBUyxNQUNkLEtBQUssU0FDUkQsRUFBYSxLQUFLLFFBQVEsRUFDM0IsS0FBSyxTQUFTLE1BQU0sRUFBTSxDQUFVLEVBQ3BDLElBQUEsRUFDVixDQUlBLElBQUksRUFBSyxDQUNMLE9BQU9BLEVBQWEsS0FBSyxRQUFRLEVBQUksS0FBSyxTQUFTLElBQUksQ0FBRyxFQUFJLEVBQ2xFLENBSUEsTUFBTSxFQUFNLENBR1IsT0FGSSxHQUFZLENBQUksRUFDVCxLQUFLLFdBQWEsSUFBQSxHQUN0QkEsRUFBYSxLQUFLLFFBQVEsRUFBSSxLQUFLLFNBQVMsTUFBTSxDQUFJLEVBQUksRUFDckUsQ0FLQSxJQUFJLEVBQUssRUFBTyxDQUNSLEtBQUssVUFBWSxLQUVqQixLQUFLLFNBQVcsR0FBbUIsS0FBSyxPQUFRLENBQUMsQ0FBRyxFQUFHLENBQUssRUFFdkQsR0FBaUIsS0FBSyxRQUFRLEdBQ25DLEtBQUssU0FBUyxJQUFJLEVBQUssQ0FBSyxDQUVwQyxDQUtBLE1BQU0sRUFBTSxFQUFPLENBQ1gsR0FBWSxDQUFJLEVBRWhCLEtBQUssU0FBVyxFQUVYLEtBQUssVUFBWSxLQUV0QixLQUFLLFNBQVcsR0FBbUIsS0FBSyxPQUFRLE1BQU0sS0FBSyxDQUFJLEVBQUcsQ0FBSyxFQUVsRSxHQUFpQixLQUFLLFFBQVEsR0FDbkMsS0FBSyxTQUFTLE1BQU0sRUFBTSxDQUFLLENBRXZDLENBUUEsVUFBVSxFQUFTLEVBQVUsQ0FBQyxFQUFHLENBQ3pCLE9BQU8sR0FBWSxXQUNuQixFQUFVLE9BQU8sQ0FBTyxHQUM1QixJQUFJLEVBQ0osT0FBUSxFQUFSLENBQ0ksSUFBSyxNQUNHLEtBQUssV0FDTCxLQUFLLFdBQVcsS0FBSyxRQUFVLE1BRS9CLEtBQUssV0FBYSxJQUFJLEVBQVcsQ0FBRSxRQUFTLEtBQU0sQ0FBQyxFQUN2RCxFQUFNLENBQUUsaUJBQWtCLEdBQU8sT0FBUSxVQUFXLEVBQ3BELE1BQ0osSUFBSyxNQUNMLElBQUssT0FDRyxLQUFLLFdBQ0wsS0FBSyxXQUFXLEtBQUssUUFBVSxFQUUvQixLQUFLLFdBQWEsSUFBSSxFQUFXLENBQUUsU0FBUSxDQUFDLEVBQ2hELEVBQU0sQ0FBRSxpQkFBa0IsR0FBTSxPQUFRLE1BQU8sRUFDL0MsTUFDSixLQUFLLEtBQ0csS0FBSyxZQUNMLE9BQU8sS0FBSyxXQUNoQixFQUFNLEtBQ04sTUFDSixRQUFTLENBQ0wsSUFBTSxFQUFLLEtBQUssVUFBVSxDQUFPLEVBQ2pDLE1BQVUsTUFBTSwrREFBK0QsR0FBSSxDQUN2RixDQUNKLENBRUEsR0FBSSxFQUFRLGtCQUFrQixPQUMxQixLQUFLLE9BQVMsRUFBUSxZQUNyQixHQUFJLEVBQ0wsS0FBSyxPQUFTLElBQUksR0FBTyxPQUFPLE9BQU8sRUFBSyxDQUFPLENBQUMsT0FFcEQsTUFBVSxNQUFNLHFFQUFxRSxDQUM3RixDQUVBLEtBQUssQ0FBRSxPQUFNLFVBQVMsV0FBVSxnQkFBZSxXQUFVLFdBQVksQ0FBQyxFQUFHLENBQ3JFLElBQU0sRUFBTSxDQUNSLFFBQVMsSUFBSSxJQUNiLElBQUssS0FDTCxLQUFNLENBQUMsRUFDUCxTQUFVLElBQWEsR0FDdkIsYUFBYyxHQUNkLGNBQWUsT0FBTyxHQUFrQixTQUFXLEVBQWdCLEdBQ3ZFLEVBQ00sRUFBTSxFQUFLLEtBQUssU0FBVSxHQUFXLEdBQUksQ0FBRyxFQUNsRCxHQUFJLE9BQU8sR0FBYSxXQUNwQixJQUFLLEdBQU0sQ0FBRSxRQUFPLFNBQVMsRUFBSSxRQUFRLE9BQU8sRUFDNUMsRUFBUyxFQUFLLENBQUssRUFDM0IsT0FBTyxPQUFPLEdBQVksV0FDcEIsR0FBYSxFQUFTLENBQUUsR0FBSSxDQUFJLEVBQUcsR0FBSSxDQUFHLEVBQzFDLENBQ1YsQ0FPQSxPQUFPLEVBQVMsRUFBVSxDQUN0QixPQUFPLEtBQUssS0FBSyxDQUFFLEtBQU0sR0FBTSxVQUFTLFNBQVUsR0FBTyxVQUFTLENBQUMsQ0FDdkUsQ0FFQSxTQUFTLEVBQVUsQ0FBQyxFQUFHLENBQ25CLEdBQUksS0FBSyxPQUFPLE9BQVMsRUFDckIsTUFBVSxNQUFNLDRDQUE0QyxFQUNoRSxHQUFJLFdBQVksSUFDWCxDQUFDLE9BQU8sVUFBVSxFQUFRLE1BQU0sR0FBSyxPQUFPLEVBQVEsTUFBTSxHQUFLLEdBQUksQ0FDcEUsSUFBTSxFQUFJLEtBQUssVUFBVSxFQUFRLE1BQU0sRUFDdkMsTUFBVSxNQUFNLG1EQUFtRCxHQUFHLENBQzFFLENBQ0EsT0FBTyxHQUFrQixLQUFNLENBQU8sQ0FDMUMsQ0FDSixFQUNBLFNBQVMsR0FBaUIsRUFBVSxDQUNoQyxHQUFJQSxFQUFhLENBQVEsRUFDckIsTUFBTyxHQUNYLE1BQVUsTUFBTSxpREFBaUQsQ0FDckUsQ0M1VUEsSUFBTSxHQUFOLGNBQXdCLEtBQU0sQ0FDMUIsWUFBWSxFQUFNLEVBQUssRUFBTSxFQUFTLENBQ2xDLE1BQU0sRUFDTixLQUFLLEtBQU8sRUFDWixLQUFLLEtBQU8sRUFDWixLQUFLLFFBQVUsRUFDZixLQUFLLElBQU0sQ0FDZixDQUNKLEVBQ00sRUFBTixjQUE2QixFQUFVLENBQ25DLFlBQVksRUFBSyxFQUFNLEVBQVMsQ0FDNUIsTUFBTSxpQkFBa0IsRUFBSyxFQUFNLENBQU8sQ0FDOUMsQ0FDSixFQUNNLEdBQU4sY0FBMEIsRUFBVSxDQUNoQyxZQUFZLEVBQUssRUFBTSxFQUFTLENBQzVCLE1BQU0sY0FBZSxFQUFLLEVBQU0sQ0FBTyxDQUMzQyxDQUNKLEVBQ0EsTUFBTSxJQUFpQixFQUFLLElBQVEsR0FBVSxDQUMxQyxHQUFJLEVBQU0sSUFBSSxLQUFPLEdBQ2pCLE9BQ0osRUFBTSxRQUFVLEVBQU0sSUFBSSxJQUFJLEdBQU8sRUFBRyxRQUFRLENBQUcsQ0FBQyxFQUNwRCxHQUFNLENBQUUsT0FBTSxPQUFRLEVBQU0sUUFBUSxHQUNwQyxFQUFNLFNBQVcsWUFBWSxFQUFLLFdBQVcsSUFDN0MsSUFBSSxFQUFLLEVBQU0sRUFDWCxFQUFVLEVBQ1QsVUFBVSxFQUFHLFdBQVcsRUFBTyxHQUFJLEVBQUcsV0FBVyxFQUFLLENBQUMsQ0FDdkQsUUFBUSxXQUFZLEVBQUUsRUFFM0IsR0FBSSxHQUFNLElBQU0sRUFBUSxPQUFTLEdBQUksQ0FDakMsSUFBTSxFQUFZLEtBQUssSUFBSSxFQUFLLEdBQUksRUFBUSxPQUFTLEVBQUUsRUFDdkQsRUFBVSxJQUFNLEVBQVEsVUFBVSxDQUFTLEVBQzNDLEdBQU0sRUFBWSxDQUN0QixDQUlBLEdBSEksRUFBUSxPQUFTLEtBQ2pCLEVBQVUsRUFBUSxVQUFVLEVBQUcsRUFBRSxFQUFJLEtBRXJDLEVBQU8sR0FBSyxPQUFPLEtBQUssRUFBUSxVQUFVLEVBQUcsQ0FBRSxDQUFDLEVBQUcsQ0FFbkQsSUFBSSxFQUFPLEVBQUksVUFBVSxFQUFHLFdBQVcsRUFBTyxHQUFJLEVBQUcsV0FBVyxFQUFPLEVBQUUsRUFDckUsRUFBSyxPQUFTLEtBQ2QsRUFBTyxFQUFLLFVBQVUsRUFBRyxFQUFFLEVBQUk7R0FDbkMsRUFBVSxFQUFPLENBQ3JCLENBQ0EsR0FBSSxPQUFPLEtBQUssQ0FBTyxFQUFHLENBQ3RCLElBQUksRUFBUSxFQUNOLEVBQU0sRUFBTSxRQUFRLEdBQ3RCLEdBQUssT0FBUyxHQUFRLEVBQUksSUFBTSxJQUNoQyxFQUFRLEtBQUssSUFBSSxFQUFHLEtBQUssSUFBSSxFQUFJLElBQU0sRUFBSyxHQUFLLENBQUUsQ0FBQyxHQUV4RCxJQUFNLEVBQVUsSUFBSSxPQUFPLENBQUUsRUFBSSxJQUFJLE9BQU8sQ0FBSyxFQUNqRCxFQUFNLFNBQVcsUUFBUSxFQUFRLElBQUksRUFBUSxHQUNqRCxDQUNKLEVDdERBLFNBQVMsR0FBYSxFQUFRLENBQUUsT0FBTSxZQUFXLE9BQU0sU0FBUSxVQUFTLGVBQWMsa0JBQWtCLENBQ3BHLElBQUksRUFBYyxHQUNkLEVBQVksRUFDWixFQUFXLEVBQ1gsRUFBVSxHQUNWLEVBQWEsR0FDYixFQUFhLEdBQ2IsRUFBVyxHQUNYLEVBQU0sS0FDTixFQUFTLEtBQ1QsRUFBTSxLQUNOLEVBQW1CLEtBQ25CLEVBQVEsS0FDUixFQUFRLEtBQ1IsRUFBUSxLQUNaLElBQUssSUFBTSxLQUFTLEVBY2hCLE9BYkEsQUFLSSxLQUpJLEVBQU0sT0FBUyxTQUNmLEVBQU0sT0FBUyxXQUNmLEVBQU0sT0FBUyxTQUNmLEVBQVEsRUFBTSxPQUFRLGVBQWdCLHVFQUF1RSxFQUN0RyxJQUVmLEFBSUksS0FISSxHQUFhLEVBQU0sT0FBUyxXQUFhLEVBQU0sT0FBUyxXQUN4RCxFQUFRLEVBQUssZ0JBQWlCLHFDQUFxQyxFQUVqRSxNQUVGLEVBQU0sS0FBZCxDQUNJLElBQUssUUFJRyxDQUFDLElBQ0EsSUFBYyxhQUFlLEdBQU0sT0FBUyxvQkFDN0MsRUFBTSxPQUFPLFNBQVMsR0FBSSxJQUMxQixFQUFNLEdBRVYsRUFBVyxHQUNYLE1BQ0osSUFBSyxVQUFXLENBQ1AsR0FDRCxFQUFRLEVBQU8sZUFBZ0Isd0VBQXdFLEVBQzNHLElBQU0sRUFBSyxFQUFNLE9BQU8sVUFBVSxDQUFDLEdBQUssSUFDbkMsRUFHRCxHQUFXLEVBQWEsRUFGeEIsRUFBVSxFQUdkLEVBQWEsR0FDYixFQUFZLEdBQ1osS0FDSixDQUNBLElBQUssVUFDRyxFQUNJLEVBQ0EsR0FBVyxFQUFNLFFBQ1osQ0FBQyxHQUFTLElBQWMsa0JBQzdCLEVBQWMsSUFHbEIsR0FBYyxFQUFNLE9BQ3hCLEVBQVksR0FDWixFQUFhLElBQ1QsR0FBVSxLQUNWLEVBQW1CLEdBQ3ZCLEVBQVcsR0FDWCxNQUNKLElBQUssU0FDRyxHQUNBLEVBQVEsRUFBTyxtQkFBb0Isb0NBQW9DLEVBQ3ZFLEVBQU0sT0FBTyxTQUFTLEdBQUcsR0FDekIsRUFBUSxFQUFNLE9BQVMsRUFBTSxPQUFPLE9BQVMsRUFBRyxZQUFhLGtDQUFtQyxFQUFJLEVBQ3hHLEVBQVMsRUFDVCxBQUFVLElBQVEsRUFBTSxPQUN4QixFQUFZLEdBQ1osRUFBVyxHQUNYLEVBQVcsR0FDWCxNQUNKLElBQUssTUFDRyxHQUNBLEVBQVEsRUFBTyxnQkFBaUIsaUNBQWlDLEVBQ3JFLEVBQU0sRUFDTixBQUFVLElBQVEsRUFBTSxPQUN4QixFQUFZLEdBQ1osRUFBVyxHQUNYLEVBQVcsR0FDWCxNQUVKLEtBQUssR0FFRyxHQUFVLElBQ1YsRUFBUSxFQUFPLGlCQUFrQixzQ0FBc0MsRUFBTSxPQUFPLFdBQVcsRUFDL0YsR0FDQSxFQUFRLEVBQU8sbUJBQW9CLGNBQWMsRUFBTSxPQUFPLE1BQU0sR0FBUSxjQUFjLEVBQzlGLEVBQVEsRUFDUixFQUNJLElBQWMsZ0JBQWtCLElBQWMsbUJBQ2xELEVBQVcsR0FDWCxNQUNKLElBQUssUUFDRCxHQUFJLEVBQU0sQ0FDRixHQUNBLEVBQVEsRUFBTyxtQkFBb0IsbUJBQW1CLEdBQU0sRUFDaEUsRUFBUSxFQUNSLEVBQVksR0FDWixFQUFXLEdBQ1gsS0FDSixDQUVKLFFBQ0ksRUFBUSxFQUFPLG1CQUFvQixjQUFjLEVBQU0sS0FBSyxPQUFPLEVBQ25FLEVBQVksR0FDWixFQUFXLEVBQ25CLENBRUosSUFBTSxFQUFPLEVBQU8sRUFBTyxPQUFTLEdBQzlCLEdBQU0sRUFBTyxFQUFLLE9BQVMsRUFBSyxPQUFPLE9BQVMsRUFjdEQsT0FiSSxHQUNBLEdBQ0EsRUFBSyxPQUFTLFNBQ2QsRUFBSyxPQUFTLFdBQ2QsRUFBSyxPQUFTLFVBQ2IsRUFBSyxPQUFTLFVBQVksRUFBSyxTQUFXLEtBQzNDLEVBQVEsRUFBSyxPQUFRLGVBQWdCLHVFQUF1RSxFQUU1RyxJQUNFLEdBQWEsRUFBSSxRQUFVLEdBQ3pCLEdBQU0sT0FBUyxhQUNmLEdBQU0sT0FBUyxjQUNuQixFQUFRLEVBQUssZ0JBQWlCLHFDQUFxQyxFQUNoRSxDQUNILFFBQ0EsUUFDQSxjQUNBLFVBQ0EsYUFDQSxTQUNBLE1BQ0EsbUJBQ0EsT0FDQSxNQUFPLEdBQVMsRUFDcEIsQ0FDSixDQy9JQSxTQUFTLEdBQWdCLEVBQUssQ0FDMUIsR0FBSSxDQUFDLEVBQ0QsT0FBTyxLQUNYLE9BQVEsRUFBSSxLQUFaLENBQ0ksSUFBSyxRQUNMLElBQUssU0FDTCxJQUFLLHVCQUNMLElBQUssdUJBQ0QsR0FBSSxFQUFJLE9BQU8sU0FBUztDQUFJLEVBQ3hCLE1BQU8sR0FDWCxHQUFJLEVBQUksSUFDQyxLQUFBLElBQU0sS0FBTSxFQUFJLElBQ2pCLEdBQUksRUFBRyxPQUFTLFVBQ1osTUFBTyxFQUFBLENBQ25CLE1BQU8sR0FDWCxJQUFLLGtCQUNELElBQUssSUFBTSxLQUFNLEVBQUksTUFBTyxDQUN4QixJQUFLLElBQU0sS0FBTSxFQUFHLE1BQ2hCLEdBQUksRUFBRyxPQUFTLFVBQ1osTUFBTyxHQUNmLEdBQUksRUFBRyxJQUNFLEtBQUEsSUFBTSxLQUFNLEVBQUcsSUFDaEIsR0FBSSxFQUFHLE9BQVMsVUFDWixNQUFPLEVBQUEsQ0FDbkIsR0FBSSxHQUFnQixFQUFHLEdBQUcsR0FBSyxHQUFnQixFQUFHLEtBQUssRUFDbkQsTUFBTyxFQUNmLENBQ0EsTUFBTyxHQUNYLFFBQ0ksTUFBTyxFQUNmLENBQ0osQ0M3QkEsU0FBUyxHQUFnQixFQUFRLEVBQUksRUFBUyxDQUMxQyxHQUFJLEdBQUksT0FBUyxrQkFBbUIsQ0FDaEMsSUFBTSxFQUFNLEVBQUcsSUFBSSxHQUNmLEVBQUksU0FBVyxJQUNkLEVBQUksU0FBVyxLQUFPLEVBQUksU0FBVyxNQUN0QyxHQUFnQixDQUFFLEdBRWxCLEVBQVEsRUFBSyxhQUFjLHlEQUFLLEVBQUksQ0FFNUMsQ0FDSixDQ1ZBLFNBQVMsR0FBWSxFQUFLLEVBQU8sRUFBUSxDQUNyQyxHQUFNLENBQUUsY0FBZSxFQUFJLFFBQzNCLEdBQUksSUFBZSxHQUNmLE1BQU8sR0FDWCxJQUFNLEVBQVUsT0FBTyxHQUFlLFdBQ2hDLEdBQ0MsRUFBRyxJQUFNLElBQU0sR0FBTUUsRUFBUyxDQUFDLEdBQUtBLEVBQVMsQ0FBQyxHQUFLLEVBQUUsUUFBVSxFQUFFLE1BQ3hFLE9BQU8sRUFBTSxLQUFLLEdBQVEsRUFBUSxFQUFLLElBQUssQ0FBTSxDQUFDLENBQ3ZELENDSEEsTUFBTSxHQUFjLGtEQUNwQixTQUFTLEdBQWdCLENBQUUsY0FBYSxvQkFBb0IsRUFBSyxFQUFJLEVBQVMsRUFBSyxDQUUvRSxJQUFNLEVBQU0sS0FETSxHQUFLLFlBQWEsR0FDVixFQUFJLE1BQU0sRUFDcEMsQUFDSSxFQUFJLFNBQVMsR0FDakIsSUFBSSxFQUFTLEVBQUcsT0FDWixFQUFhLEtBQ2pCLElBQUssSUFBTSxLQUFZLEVBQUcsTUFBTyxDQUM3QixHQUFNLENBQUUsUUFBTyxNQUFLLE1BQUssU0FBVSxFQUU3QixFQUFXLEdBQWEsRUFBTyxDQUNqQyxVQUFXLG1CQUNYLEtBQU0sR0FBTyxJQUFNLEdBQ25CLFNBQ0EsVUFDQSxhQUFjLEVBQUcsT0FDakIsZUFBZ0IsRUFDcEIsQ0FBQyxFQUNLLEVBQWMsQ0FBQyxFQUFTLE1BQzlCLEdBQUksRUFBYSxDQU9iLEdBTkksSUFDSSxFQUFJLE9BQVMsWUFDYixFQUFRLEVBQVEsd0JBQXlCLHlEQUF5RCxFQUM3RixXQUFZLEdBQU8sRUFBSSxTQUFXLEVBQUcsUUFDMUMsRUFBUSxFQUFRLGFBQWMsRUFBVyxHQUU3QyxDQUFDLEVBQVMsUUFBVSxDQUFDLEVBQVMsS0FBTyxDQUFDLEVBQUssQ0FDM0MsRUFBYSxFQUFTLElBQ2xCLEVBQVMsVUFDTCxFQUFJLFFBQ0osRUFBSSxTQUFXO0VBQU8sRUFBUyxRQUUvQixFQUFJLFFBQVUsRUFBUyxTQUUvQixRQUNKLEVBQ0ksRUFBUyxrQkFBb0IsR0FBZ0IsQ0FBRyxJQUNoRCxFQUFRLEdBQU8sRUFBTSxFQUFNLE9BQVMsR0FBSSx5QkFBMEIsMkNBQTJDLENBRXJILE1BQ1MsRUFBUyxPQUFPLFNBQVcsRUFBRyxRQUNuQyxFQUFRLEVBQVEsYUFBYyxFQUFXLEVBRzdDLEVBQUksTUFBUSxHQUNaLElBQU0sRUFBVyxFQUFTLElBQ3BCLEVBQVUsRUFDVixFQUFZLEVBQUssRUFBSyxFQUFVLENBQU8sRUFDdkMsRUFBaUIsRUFBSyxFQUFVLEVBQU8sS0FBTSxFQUFVLENBQU8sRUFDaEUsRUFBSSxPQUFPLFFBQ1gsR0FBZ0IsRUFBRyxPQUFRLEVBQUssQ0FBTyxFQUMzQyxFQUFJLE1BQVEsR0FDUixHQUFZLEVBQUssRUFBSSxNQUFPLENBQU8sR0FDbkMsRUFBUSxFQUFVLGdCQUFpQix5QkFBeUIsRUFFaEUsSUFBTSxFQUFhLEdBQWEsR0FBTyxDQUFDLEVBQUcsQ0FDdkMsVUFBVyxnQkFDWCxLQUFNLEVBQ04sT0FBUSxFQUFRLE1BQU0sR0FDdEIsVUFDQSxhQUFjLEVBQUcsT0FDakIsZUFBZ0IsQ0FBQyxHQUFPLEVBQUksT0FBUyxjQUN6QyxDQUFDLEVBRUQsR0FEQSxFQUFTLEVBQVcsSUFDaEIsRUFBVyxNQUFPLENBQ2QsSUFDSSxHQUFPLE9BQVMsYUFBZSxDQUFDLEVBQVcsWUFDM0MsRUFBUSxFQUFRLHdCQUF5QixxREFBcUQsRUFDOUYsRUFBSSxRQUFRLFFBQ1osRUFBUyxNQUFRLEVBQVcsTUFBTSxPQUFTLE1BQzNDLEVBQVEsRUFBUSxNQUFPLHNCQUF1Qiw2RkFBNkYsR0FHbkosSUFBTSxFQUFZLEVBQ1osRUFBWSxFQUFLLEVBQU8sRUFBWSxDQUFPLEVBQzNDLEVBQWlCLEVBQUssRUFBUSxFQUFLLEtBQU0sRUFBWSxDQUFPLEVBQzlELEVBQUksT0FBTyxRQUNYLEdBQWdCLEVBQUcsT0FBUSxFQUFPLENBQU8sRUFDN0MsRUFBUyxFQUFVLE1BQU0sR0FDekIsSUFBTSxFQUFPLElBQUksRUFBSyxFQUFTLENBQVMsRUFDcEMsRUFBSSxRQUFRLG1CQUNaLEVBQUssU0FBVyxHQUNwQixFQUFJLE1BQU0sS0FBSyxDQUFJLENBQ3ZCLEtBQ0ssQ0FFRyxHQUNBLEVBQVEsRUFBUSxNQUFPLGVBQWdCLHFEQUFxRCxFQUM1RixFQUFXLFVBQ1AsRUFBUSxRQUNSLEVBQVEsU0FBVztFQUFPLEVBQVcsUUFFckMsRUFBUSxRQUFVLEVBQVcsU0FFckMsSUFBTSxFQUFPLElBQUksRUFBSyxDQUFPLEVBQ3pCLEVBQUksUUFBUSxtQkFDWixFQUFLLFNBQVcsR0FDcEIsRUFBSSxNQUFNLEtBQUssQ0FBSSxDQUN2QixDQUNKLENBSUEsT0FISSxHQUFjLEVBQWEsR0FDM0IsRUFBUSxFQUFZLGFBQWMsbUNBQW1DLEVBQ3pFLEVBQUksTUFBUSxDQUFDLEVBQUcsT0FBUSxFQUFRLEdBQWMsQ0FBTSxFQUM3QyxDQUNYLENDNUdBLFNBQVMsR0FBZ0IsQ0FBRSxjQUFhLG9CQUFvQixFQUFLLEVBQUksRUFBUyxFQUFLLENBRS9FLElBQU0sRUFBTSxLQURNLEdBQUssWUFBYSxHQUNWLEVBQUksTUFBTSxFQUNwQyxBQUNJLEVBQUksU0FBUyxHQUNqQixBQUNJLEVBQUksUUFBUSxHQUNoQixJQUFJLEVBQVMsRUFBRyxPQUNaLEVBQWEsS0FDakIsSUFBSyxHQUFNLENBQUUsUUFBTyxXQUFXLEVBQUcsTUFBTyxDQUNyQyxJQUFNLEVBQVEsR0FBYSxFQUFPLENBQzlCLFVBQVcsZUFDWCxLQUFNLEVBQ04sU0FDQSxVQUNBLGFBQWMsRUFBRyxPQUNqQixlQUFnQixFQUNwQixDQUFDLEVBQ0QsR0FBSSxDQUFDLEVBQU0sTUFBTyxDQUNkLEdBQUksRUFBTSxRQUFVLEVBQU0sS0FBTyxFQUN6QixHQUFPLE9BQVMsWUFDaEIsRUFBUSxFQUFNLElBQUssYUFBYyxrREFBa0QsRUFFbkYsRUFBUSxFQUFRLGVBQWdCLG1DQUFtQyxNQUV0RSxDQUNELEVBQWEsRUFBTSxJQUNmLEVBQU0sVUFDTixFQUFJLFFBQVUsRUFBTSxTQUN4QixRQUNKLENBQ0osQ0FDQSxJQUFNLEVBQU8sRUFDUCxFQUFZLEVBQUssRUFBTyxFQUFPLENBQU8sRUFDdEMsRUFBaUIsRUFBSyxFQUFNLElBQUssRUFBTyxLQUFNLEVBQU8sQ0FBTyxFQUM5RCxFQUFJLE9BQU8sUUFDWCxHQUFnQixFQUFHLE9BQVEsRUFBTyxDQUFPLEVBQzdDLEVBQVMsRUFBSyxNQUFNLEdBQ3BCLEVBQUksTUFBTSxLQUFLLENBQUksQ0FDdkIsQ0FFQSxNQURBLEdBQUksTUFBUSxDQUFDLEVBQUcsT0FBUSxFQUFRLEdBQWMsQ0FBTSxFQUM3QyxDQUNYLENDOUNBLFNBQVMsR0FBVyxFQUFLLEVBQVEsRUFBVSxFQUFTLENBQ2hELElBQUksRUFBVSxHQUNkLEdBQUksRUFBSyxDQUNMLElBQUksRUFBVyxHQUNYLEVBQU0sR0FDVixJQUFLLElBQU0sS0FBUyxFQUFLLENBQ3JCLEdBQU0sQ0FBRSxTQUFRLFFBQVMsRUFDekIsT0FBUSxFQUFSLENBQ0ksSUFBSyxRQUNELEVBQVcsR0FDWCxNQUNKLElBQUssVUFBVyxDQUNSLEdBQVksQ0FBQyxHQUNiLEVBQVEsRUFBTyxlQUFnQix3RUFBd0UsRUFDM0csSUFBTSxFQUFLLEVBQU8sVUFBVSxDQUFDLEdBQUssSUFDN0IsRUFHRCxHQUFXLEVBQU0sRUFGakIsRUFBVSxFQUdkLEVBQU0sR0FDTixLQUNKLENBQ0EsSUFBSyxVQUNHLElBQ0EsR0FBTyxHQUNYLEVBQVcsR0FDWCxNQUNKLFFBQ0ksRUFBUSxFQUFPLG1CQUFvQixjQUFjLEVBQUssYUFBYSxDQUMzRSxDQUNBLEdBQVUsRUFBTyxNQUNyQixDQUNKLENBQ0EsTUFBTyxDQUFFLFVBQVMsUUFBTyxDQUM3QixDQ3pCQSxNQUFNLEdBQVcsNERBQ1gsR0FBVyxHQUFVLElBQVUsRUFBTSxPQUFTLGFBQWUsRUFBTSxPQUFTLGFBQ2xGLFNBQVMsR0FBc0IsQ0FBRSxjQUFhLG9CQUFvQixFQUFLLEVBQUksRUFBUyxFQUFLLENBQ3JGLElBQU0sRUFBUSxFQUFHLE1BQU0sU0FBVyxJQUM1QixFQUFTLEVBQVEsV0FBYSxnQkFFOUIsRUFBTyxLQURNLEdBQUssYUFBYyxFQUFRLEVBQVUsSUFDN0IsRUFBSSxNQUFNLEVBQ3JDLEVBQUssS0FBTyxHQUNaLElBQU0sRUFBUyxFQUFJLE9BQ2YsSUFDQSxFQUFJLE9BQVMsSUFDakIsQUFDSSxFQUFJLFFBQVEsR0FDaEIsSUFBSSxFQUFTLEVBQUcsT0FBUyxFQUFHLE1BQU0sT0FBTyxPQUN6QyxJQUFLLElBQUksRUFBSSxFQUFHLEVBQUksRUFBRyxNQUFNLE9BQVEsRUFBRSxFQUFHLENBQ3RDLElBQU0sRUFBVyxFQUFHLE1BQU0sR0FDcEIsQ0FBRSxRQUFPLE1BQUssTUFBSyxTQUFVLEVBQzdCLEVBQVEsR0FBYSxFQUFPLENBQzlCLEtBQU0sRUFDTixVQUFXLG1CQUNYLEtBQU0sR0FBTyxJQUFNLEdBQ25CLFNBQ0EsVUFDQSxhQUFjLEVBQUcsT0FDakIsZUFBZ0IsRUFDcEIsQ0FBQyxFQUNELEdBQUksQ0FBQyxFQUFNLE1BQU8sQ0FDZCxHQUFJLENBQUMsRUFBTSxRQUFVLENBQUMsRUFBTSxLQUFPLENBQUMsR0FBTyxDQUFDLEVBQU8sQ0FDM0MsSUFBTSxHQUFLLEVBQU0sTUFDakIsRUFBUSxFQUFNLE1BQU8sbUJBQW9CLG1CQUFtQixHQUFRLEVBQy9ELEVBQUksRUFBRyxNQUFNLE9BQVMsR0FDM0IsRUFBUSxFQUFNLE1BQU8sbUJBQW9CLDRCQUE0QixHQUFRLEVBQzdFLEVBQU0sVUFDRixFQUFLLFFBQ0wsRUFBSyxTQUFXO0VBQU8sRUFBTSxRQUU3QixFQUFLLFFBQVUsRUFBTSxTQUU3QixFQUFTLEVBQU0sSUFDZixRQUNKLENBQ0ksQ0FBQyxHQUFTLEVBQUksUUFBUSxRQUFVLEdBQWdCLENBQUcsR0FDbkQsRUFBUSxFQUNSLHlCQUEwQixrRUFBa0UsQ0FDcEcsQ0FDQSxHQUFJLElBQU0sRUFDRixFQUFNLE9BQ04sRUFBUSxFQUFNLE1BQU8sbUJBQW9CLG1CQUFtQixHQUFRLE9BS3hFLEdBRkssRUFBTSxPQUNQLEVBQVEsRUFBTSxNQUFPLGVBQWdCLHFCQUFxQixFQUFPLE9BQU8sRUFDeEUsRUFBTSxRQUFTLENBQ2YsSUFBSSxFQUFrQixHQUN0QixLQUFNLElBQUssSUFBTSxLQUFNLEVBQ25CLE9BQVEsRUFBRyxLQUFYLENBQ0ksSUFBSyxRQUNMLElBQUssUUFDRCxNQUNKLElBQUssVUFDRCxFQUFrQixFQUFHLE9BQU8sVUFBVSxDQUFDLEVBQ3ZDLE1BQU0sS0FDVixRQUNJLE1BQU0sSUFDZCxDQUVKLEdBQUksRUFBaUIsQ0FDakIsSUFBSSxFQUFPLEVBQUssTUFBTSxFQUFLLE1BQU0sT0FBUyxHQUN0QyxFQUFPLENBQUksSUFDWCxFQUFPLEVBQUssT0FBUyxFQUFLLEtBQzFCLEVBQUssUUFDTCxFQUFLLFNBQVc7RUFBTyxFQUV2QixFQUFLLFFBQVUsRUFDbkIsRUFBTSxRQUFVLEVBQU0sUUFBUSxVQUFVLEVBQWdCLE9BQVMsQ0FBQyxDQUN0RSxDQUNKLENBRUosR0FBSSxDQUFDLEdBQVMsQ0FBQyxHQUFPLENBQUMsRUFBTSxNQUFPLENBR2hDLElBQU0sRUFBWSxFQUNaLEVBQVksRUFBSyxFQUFPLEVBQU8sQ0FBTyxFQUN0QyxFQUFpQixFQUFLLEVBQU0sSUFBSyxFQUFLLEtBQU0sRUFBTyxDQUFPLEVBQ2hFLEVBQUssTUFBTSxLQUFLLENBQVMsRUFDekIsRUFBUyxFQUFVLE1BQU0sR0FDckIsR0FBUSxDQUFLLEdBQ2IsRUFBUSxFQUFVLE1BQU8sZ0JBQWlCLEVBQVEsQ0FDMUQsS0FDSyxDQUdELEVBQUksTUFBUSxHQUNaLElBQU0sRUFBVyxFQUFNLElBQ2pCLEVBQVUsRUFDVixFQUFZLEVBQUssRUFBSyxFQUFPLENBQU8sRUFDcEMsRUFBaUIsRUFBSyxFQUFVLEVBQU8sS0FBTSxFQUFPLENBQU8sRUFDN0QsR0FBUSxDQUFHLEdBQ1gsRUFBUSxFQUFRLE1BQU8sZ0JBQWlCLEVBQVEsRUFDcEQsRUFBSSxNQUFRLEdBRVosSUFBTSxFQUFhLEdBQWEsR0FBTyxDQUFDLEVBQUcsQ0FDdkMsS0FBTSxFQUNOLFVBQVcsZ0JBQ1gsS0FBTSxFQUNOLE9BQVEsRUFBUSxNQUFNLEdBQ3RCLFVBQ0EsYUFBYyxFQUFHLE9BQ2pCLGVBQWdCLEVBQ3BCLENBQUMsRUFDRCxHQUFJLEVBQVcsTUFDUCxJQUFBLENBQUMsR0FBUyxDQUFDLEVBQU0sT0FBUyxFQUFJLFFBQVEsT0FBUSxDQUM5QyxHQUFJLEVBQ0EsSUFBSyxJQUFNLEtBQU0sRUFBSyxDQUNsQixHQUFJLElBQU8sRUFBVyxNQUNsQixNQUNKLEdBQUksRUFBRyxPQUFTLFVBQVcsQ0FDdkIsRUFBUSxFQUFJLHlCQUEwQixrRUFBa0UsRUFDeEcsS0FDSixDQUNKLENBQ0EsRUFBTSxNQUFRLEVBQVcsTUFBTSxPQUFTLE1BQ3hDLEVBQVEsRUFBVyxNQUFPLHNCQUF1Qiw2RkFBNkYsQ0FDdEosT0FFSyxJQUNELFdBQVksR0FBUyxFQUFNLFNBQVMsS0FBTyxJQUMzQyxFQUFRLEVBQU8sZUFBZ0IsNEJBQTRCLEdBQVEsRUFFbkUsRUFBUSxFQUFXLE1BQU8sZUFBZ0IsMEJBQTBCLEVBQU8sT0FBTyxHQUcxRixJQUFNLEVBQVksRUFDWixFQUFZLEVBQUssRUFBTyxFQUFZLENBQU8sRUFDM0MsRUFBVyxNQUNQLEVBQWlCLEVBQUssRUFBVyxJQUFLLEVBQUssS0FBTSxFQUFZLENBQU8sRUFDcEUsS0FDTixFQUNJLEdBQVEsQ0FBSyxHQUNiLEVBQVEsRUFBVSxNQUFPLGdCQUFpQixFQUFRLEVBRWpELEVBQVcsVUFDWixFQUFRLFFBQ1IsRUFBUSxTQUFXO0VBQU8sRUFBVyxRQUVyQyxFQUFRLFFBQVUsRUFBVyxTQUVyQyxJQUFNLEVBQU8sSUFBSSxFQUFLLEVBQVMsQ0FBUyxFQUd4QyxHQUZJLEVBQUksUUFBUSxtQkFDWixFQUFLLFNBQVcsR0FDaEIsRUFBTyxDQUNQLElBQU0sRUFBTSxFQUNSLEdBQVksRUFBSyxFQUFJLE1BQU8sQ0FBTyxHQUNuQyxFQUFRLEVBQVUsZ0JBQWlCLHlCQUF5QixFQUNoRSxFQUFJLE1BQU0sS0FBSyxDQUFJLENBQ3ZCLEtBQ0ssQ0FDRCxJQUFNLEVBQU0sSUFBSSxFQUFRLEVBQUksTUFBTSxFQUNsQyxFQUFJLEtBQU8sR0FDWCxFQUFJLE1BQU0sS0FBSyxDQUFJLEVBQ25CLElBQU0sR0FBWSxHQUFhLEVBQUEsQ0FBUyxNQUN4QyxFQUFJLE1BQVEsQ0FBQyxFQUFRLE1BQU0sR0FBSSxFQUFTLEdBQUksRUFBUyxFQUFFLEVBQ3ZELEVBQUssTUFBTSxLQUFLLENBQUcsQ0FDdkIsQ0FDQSxFQUFTLEVBQVksRUFBVSxNQUFNLEdBQUssRUFBVyxHQUN6RCxDQUNKLENBQ0EsSUFBTSxFQUFjLEVBQVEsSUFBTSxJQUM1QixDQUFDLEVBQUksR0FBRyxHQUFNLEVBQUcsSUFDbkIsRUFBUSxFQUNaLEdBQUksR0FBSSxTQUFXLEVBQ2YsRUFBUSxFQUFHLE9BQVMsRUFBRyxPQUFPLFdBQzdCLENBQ0QsSUFBTSxFQUFPLEVBQU8sRUFBRSxDQUFDLFlBQVksRUFBSSxFQUFPLFVBQVUsQ0FBQyxFQUNuRCxFQUFNLEVBQ04sR0FBRyxFQUFLLG1CQUFtQixJQUMzQixHQUFHLEVBQUssb0VBQW9FLElBQ2xGLEVBQVEsRUFBUSxFQUFTLGVBQWlCLGFBQWMsQ0FBRyxFQUN2RCxHQUFNLEVBQUcsT0FBTyxTQUFXLEdBQzNCLEVBQUcsUUFBUSxDQUFFLENBQ3JCLENBQ0EsR0FBSSxFQUFHLE9BQVMsRUFBRyxDQUNmLElBQU0sRUFBTSxHQUFXLEVBQUksRUFBTyxFQUFJLFFBQVEsT0FBUSxDQUFPLEVBQ3pELEVBQUksVUFDQSxFQUFLLFFBQ0wsRUFBSyxTQUFXO0VBQU8sRUFBSSxRQUUzQixFQUFLLFFBQVUsRUFBSSxTQUUzQixFQUFLLE1BQVEsQ0FBQyxFQUFHLE9BQVEsRUFBTyxFQUFJLE1BQU0sQ0FDOUMsS0FFSSxHQUFLLE1BQVEsQ0FBQyxFQUFHLE9BQVEsRUFBTyxDQUFLLEVBRXpDLE9BQU8sQ0FDWCxDQ3BNQSxTQUFTLEdBQWtCLEVBQUksRUFBSyxFQUFPLEVBQVMsRUFBUyxFQUFLLENBQzlELElBQU0sRUFBTyxFQUFNLE9BQVMsWUFDdEIsR0FBZ0IsRUFBSSxFQUFLLEVBQU8sRUFBUyxDQUFHLEVBQzVDLEVBQU0sT0FBUyxZQUNYLEdBQWdCLEVBQUksRUFBSyxFQUFPLEVBQVMsQ0FBRyxFQUM1QyxHQUFzQixFQUFJLEVBQUssRUFBTyxFQUFTLENBQUcsRUFDdEQsRUFBTyxFQUFLLFlBU2xCLE9BTkksSUFBWSxLQUFPLElBQVksRUFBSyxTQUNwQyxFQUFLLElBQU0sRUFBSyxRQUNULElBRVAsSUFDQSxFQUFLLElBQU0sR0FDUixFQUNYLENBQ0EsU0FBUyxHQUFrQixFQUFJLEVBQUssRUFBTyxFQUFPLEVBQVMsQ0FDdkQsSUFBTSxFQUFXLEVBQU0sSUFDakIsRUFBVyxFQUVYLEVBQUksV0FBVyxRQUFRLEVBQVMsT0FBUSxHQUFPLEVBQVEsRUFBVSxxQkFBc0IsQ0FBRyxDQUFDLEVBRDNGLEtBRU4sR0FBSSxFQUFNLE9BQVMsWUFBYSxDQUM1QixHQUFNLENBQUUsU0FBUSxpQkFBa0IsR0FBTyxFQUNuQyxFQUFXLEdBQVUsRUFDckIsRUFBTyxPQUFTLEVBQVMsT0FDckIsRUFDQSxFQUNILEdBQVUsRUFDYixJQUFhLENBQUMsR0FBTSxFQUFHLE9BQVMsRUFBUyxTQUV6QyxFQUFRLEVBQVUsZUFBZ0IsNENBQU8sQ0FFakQsQ0FDQSxJQUFNLEVBQVUsRUFBTSxPQUFTLFlBQ3pCLE1BQ0EsRUFBTSxPQUFTLFlBQ1gsTUFDQSxFQUFNLE1BQU0sU0FBVyxJQUNuQixNQUNBLE1BR2QsR0FBSSxDQUFDLEdBQ0QsQ0FBQyxHQUNELElBQVksS0FDWCxJQUFZLEVBQVEsU0FBVyxJQUFZLE9BQzNDLElBQVksRUFBUSxTQUFXLElBQVksTUFDNUMsT0FBTyxHQUFrQixFQUFJLEVBQUssRUFBTyxFQUFTLENBQU8sRUFFN0QsSUFBSSxFQUFNLEVBQUksT0FBTyxLQUFLLEtBQUssR0FBSyxFQUFFLE1BQVEsR0FBVyxFQUFFLGFBQWUsQ0FBTyxFQUNqRixHQUFJLENBQUMsRUFBSyxDQUNOLElBQU0sRUFBSyxFQUFJLE9BQU8sVUFBVSxHQUNoQyxHQUFJLEdBQUksYUFBZSxFQUNuQixFQUFJLE9BQU8sS0FBSyxLQUFLLE9BQU8sT0FBTyxDQUFDLEVBQUcsRUFBSSxDQUFFLFFBQVMsRUFBTSxDQUFDLENBQUMsRUFDOUQsRUFBTSxPQVNOLE9BTkksRUFDQSxFQUFRLEVBQVUsc0JBQXVCLEdBQUcsRUFBRyxJQUFJLFlBQVksRUFBUSwyQkFBMkIsRUFBRyxZQUFjLFdBQVksRUFBSSxFQUduSSxFQUFRLEVBQVUscUJBQXNCLG1CQUFtQixJQUFXLEVBQUksRUFFdkUsR0FBa0IsRUFBSSxFQUFLLEVBQU8sRUFBUyxDQUFPLENBRWpFLENBQ0EsSUFBTSxFQUFPLEdBQWtCLEVBQUksRUFBSyxFQUFPLEVBQVMsRUFBUyxDQUFHLEVBQzlELEVBQU0sRUFBSSxVQUFVLEVBQU0sR0FBTyxFQUFRLEVBQVUscUJBQXNCLENBQUcsRUFBRyxFQUFJLE9BQU8sR0FBSyxFQUMvRixFQUFPLEVBQU8sQ0FBRyxFQUNqQixFQUNBLElBQUksRUFBTyxDQUFHLEVBS3BCLE1BSkEsR0FBSyxNQUFRLEVBQUssTUFDbEIsRUFBSyxJQUFNLEVBQ1AsR0FBSyxTQUNMLEVBQUssT0FBUyxFQUFJLFFBQ2YsQ0FDWCxDQ25GQSxTQUFTLEdBQW1CLEVBQUssRUFBUSxFQUFTLENBQzlDLElBQU0sRUFBUSxFQUFPLE9BQ2YsRUFBUyxHQUF1QixFQUFRLEVBQUksUUFBUSxPQUFRLENBQU8sRUFDekUsR0FBSSxDQUFDLEVBQ0QsTUFBTyxDQUFFLE1BQU8sR0FBSSxLQUFNLEtBQU0sUUFBUyxHQUFJLE1BQU8sQ0FBQyxFQUFPLEVBQU8sQ0FBSyxDQUFFLEVBQzlFLElBQU0sRUFBTyxFQUFPLE9BQVMsSUFBTSxFQUFPLGFBQWUsRUFBTyxjQUMxRCxFQUFRLEVBQU8sT0FBUyxHQUFXLEVBQU8sTUFBTSxFQUFJLENBQUMsRUFFdkQsRUFBYSxFQUFNLE9BQ3ZCLElBQUssSUFBSSxFQUFJLEVBQU0sT0FBUyxFQUFHLEdBQUssRUFBRyxFQUFFLEVBQUcsQ0FDeEMsSUFBTSxFQUFVLEVBQU0sRUFBRSxDQUFDLEdBQ3pCLEdBQUksSUFBWSxJQUFNLElBQVksS0FDOUIsRUFBYSxPQUViLEtBQ1IsQ0FFQSxHQUFJLElBQWUsRUFBRyxDQUNsQixJQUFNLEVBQVEsRUFBTyxRQUFVLEtBQU8sRUFBTSxPQUFTLEVBQy9DO0VBQUssT0FBTyxLQUFLLElBQUksRUFBRyxFQUFNLE9BQVMsQ0FBQyxDQUFDLEVBQ3pDLEdBQ0YsRUFBTSxFQUFRLEVBQU8sT0FHekIsT0FGSSxFQUFPLFNBQ1AsR0FBTyxFQUFPLE9BQU8sUUFDbEIsQ0FBRSxRQUFPLE9BQU0sUUFBUyxFQUFPLFFBQVMsTUFBTyxDQUFDLEVBQU8sRUFBSyxDQUFHLENBQUUsQ0FDNUUsQ0FFQSxJQUFJLEVBQWEsRUFBTyxPQUFTLEVBQU8sT0FDcEMsRUFBUyxFQUFPLE9BQVMsRUFBTyxPQUNoQyxFQUFlLEVBQ25CLElBQUssSUFBSSxFQUFJLEVBQUcsRUFBSSxFQUFZLEVBQUUsRUFBRyxDQUNqQyxHQUFNLENBQUMsRUFBUSxHQUFXLEVBQU0sR0FDaEMsR0FBSSxJQUFZLElBQU0sSUFBWSxLQUMxQixFQUFPLFNBQVcsR0FBSyxFQUFPLE9BQVMsSUFDdkMsRUFBYSxFQUFPLFlBRXZCLENBQ0csRUFBTyxPQUFTLEdBRWhCLEVBQVEsRUFBUyxFQUFPLE9BQVEsZUFBZ0IsaUdBQU8sRUFFdkQsRUFBTyxTQUFXLElBQ2xCLEVBQWEsRUFBTyxRQUN4QixFQUFlLEVBQ1gsSUFBZSxHQUFLLENBQUMsRUFBSSxRQUV6QixFQUFRLEVBQVEsYUFBYyxxREFBTyxFQUV6QyxLQUNKLENBQ0EsR0FBVSxFQUFPLE9BQVMsRUFBUSxPQUFTLENBQy9DLENBRUEsSUFBSyxJQUFJLEVBQUksRUFBTSxPQUFTLEVBQUcsR0FBSyxFQUFZLEVBQUUsRUFDMUMsRUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLE9BQVMsSUFDckIsRUFBYSxFQUFJLEdBRXpCLElBQUksRUFBUSxHQUNSLEVBQU0sR0FDTixFQUFtQixHQUV2QixJQUFLLElBQUksRUFBSSxFQUFHLEVBQUksRUFBYyxFQUFFLEVBQ2hDLEdBQVMsRUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBVSxFQUFJO0VBQzdDLElBQUssSUFBSSxFQUFJLEVBQWMsRUFBSSxFQUFZLEVBQUUsRUFBRyxDQUM1QyxHQUFJLENBQUMsRUFBUSxHQUFXLEVBQU0sR0FDOUIsR0FBVSxFQUFPLE9BQVMsRUFBUSxPQUFTLEVBQzNDLElBQU0sRUFBTyxFQUFRLEVBQVEsT0FBUyxLQUFPLEtBSTdDLEdBSEksSUFDQSxFQUFVLEVBQVEsTUFBTSxFQUFHLEVBQUUsR0FFN0IsR0FBVyxFQUFPLE9BQVMsRUFBWSxDQUl2QyxJQUFNLEVBQVUsMkRBSEosRUFBTyxPQUNiLGlDQUNBLGVBRU4sRUFBUSxFQUFTLEVBQVEsUUFBVSxFQUFPLEVBQUksR0FBSSxhQUFjLENBQU8sRUFDdkUsRUFBUyxFQUNiLENBQ0ksSUFBUyxFQUFPLGVBQ2hCLEdBQVMsRUFBTSxFQUFPLE1BQU0sQ0FBVSxFQUFJLEVBQzFDLEVBQU07R0FFRCxFQUFPLE9BQVMsR0FBYyxFQUFRLEtBQU8sS0FFOUMsSUFBUSxJQUNSLEVBQU07RUFDRCxDQUFDLEdBQW9CLElBQVE7SUFDbEMsRUFBTTs7R0FDVixHQUFTLEVBQU0sRUFBTyxNQUFNLENBQVUsRUFBSSxFQUMxQyxFQUFNO0VBQ04sRUFBbUIsSUFFZCxJQUFZLEdBRWIsSUFBUTtFQUNSLEdBQVM7RUFFVCxFQUFNO0dBR1YsR0FBUyxFQUFNLEVBQ2YsRUFBTSxJQUNOLEVBQW1CLEdBRTNCLENBQ0EsT0FBUSxFQUFPLE1BQWYsQ0FDSSxJQUFLLElBQ0QsTUFDSixJQUFLLElBQ0QsSUFBSyxJQUFJLEVBQUksRUFBWSxFQUFJLEVBQU0sT0FBUSxFQUFFLEVBQ3pDLEdBQVM7RUFBTyxFQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFVLEVBQzVDLEVBQU0sRUFBTSxPQUFTLEtBQU87SUFDNUIsR0FBUztHQUNiLE1BQ0osUUFDSSxHQUFTO0NBQ2pCLENBQ0EsSUFBTSxFQUFNLEVBQVEsRUFBTyxPQUFTLEVBQU8sT0FBTyxPQUNsRCxNQUFPLENBQUUsUUFBTyxPQUFNLFFBQVMsRUFBTyxRQUFTLE1BQU8sQ0FBQyxFQUFPLEVBQUssQ0FBRyxDQUFFLENBQzVFLENBQ0EsU0FBUyxHQUF1QixDQUFFLFNBQVEsU0FBUyxFQUFRLEVBQVMsQ0FFaEUsR0FBSSxFQUFNLEVBQUUsQ0FBQyxPQUFTLHNCQUVsQixPQURBLEVBQVEsRUFBTSxHQUFJLGFBQWMsK0JBQStCLEVBQ3hELEtBRVgsR0FBTSxDQUFFLFVBQVcsRUFBTSxHQUNuQixFQUFPLEVBQU8sR0FDaEIsRUFBUyxFQUNULEVBQVEsR0FDUixFQUFRLEdBQ1osSUFBSyxJQUFJLEVBQUksRUFBRyxFQUFJLEVBQU8sT0FBUSxFQUFFLEVBQUcsQ0FDcEMsSUFBTSxFQUFLLEVBQU8sR0FDbEIsR0FBSSxDQUFDLElBQVUsSUFBTyxLQUFPLElBQU8sS0FDaEMsRUFBUSxNQUNQLENBQ0QsSUFBTSxFQUFJLE9BQU8sQ0FBRSxFQUNmLENBQUMsR0FBVSxFQUNYLEVBQVMsRUFDSixJQUFVLEtBQ2YsRUFBUSxFQUFTLEVBQ3pCLENBQ0osQ0FDSSxJQUFVLElBQ1YsRUFBUSxFQUFPLG1CQUFvQixrREFBa0QsR0FBUSxFQUNqRyxJQUFJLEVBQVcsR0FDWCxFQUFVLEdBQ1YsRUFBUyxFQUFPLE9BQ3BCLElBQUssSUFBSSxFQUFJLEVBQUcsRUFBSSxFQUFNLE9BQVEsRUFBRSxFQUFHLENBQ25DLElBQU0sRUFBUSxFQUFNLEdBQ3BCLE9BQVEsRUFBTSxLQUFkLENBQ0ksSUFBSyxRQUNELEVBQVcsR0FFZixJQUFLLFVBQ0QsR0FBVSxFQUFNLE9BQU8sT0FDdkIsTUFDSixJQUFLLFVBQ0csR0FBVSxDQUFDLEdBRVgsRUFBUSxFQUFPLGVBQWdCLHdFQUFPLEVBRTFDLEdBQVUsRUFBTSxPQUFPLE9BQ3ZCLEVBQVUsRUFBTSxPQUFPLFVBQVUsQ0FBQyxFQUNsQyxNQUNKLElBQUssUUFDRCxFQUFRLEVBQU8sbUJBQW9CLEVBQU0sT0FBTyxFQUNoRCxHQUFVLEVBQU0sT0FBTyxPQUN2QixNQUVKLFFBQVMsQ0FFTCxFQUFRLEVBQU8sbUJBQW9CLDRDQUR5QixFQUFNLE1BQ3hCLEVBQzFDLElBQU0sRUFBSyxFQUFNLE9BQ2IsR0FBTSxPQUFPLEdBQU8sV0FDcEIsR0FBVSxFQUFHLE9BQ3JCLENBQ0osQ0FDSixDQUNBLE1BQU8sQ0FBRSxPQUFNLFNBQVEsUUFBTyxVQUFTLFFBQU8sQ0FDbEQsQ0FFQSxTQUFTLEdBQVcsRUFBUSxDQUN4QixJQUFNLEVBQVEsRUFBTyxNQUFNLFFBQVEsRUFDN0IsRUFBUSxFQUFNLEdBQ2QsRUFBSSxFQUFNLE1BQU0sT0FBTyxFQUl2QixFQUFRLENBSEEsSUFBSSxHQUNaLENBQUMsRUFBRSxHQUFJLEVBQU0sTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFDL0IsQ0FBQyxHQUFJLENBQUssQ0FDSSxFQUNwQixJQUFLLElBQUksRUFBSSxFQUFHLEVBQUksRUFBTSxPQUFRLEdBQUssRUFDbkMsRUFBTSxLQUFLLENBQUMsRUFBTSxHQUFJLEVBQU0sRUFBSSxFQUFFLENBQUMsRUFDdkMsT0FBTyxDQUNYLENDaE1BLFNBQVMsR0FBa0IsRUFBUSxFQUFRLEVBQVMsQ0FDaEQsR0FBTSxDQUFFLFNBQVEsT0FBTSxTQUFRLE9BQVEsRUFDbEMsRUFDQSxFQUNFLEdBQVksRUFBSyxFQUFNLElBQVEsRUFBUSxFQUFTLEVBQUssRUFBTSxDQUFHLEVBQ3BFLE9BQVEsRUFBUixDQUNJLElBQUssU0FDRCxFQUFRLEVBQU8sTUFDZixFQUFRLEdBQVcsRUFBUSxDQUFRLEVBQ25DLE1BQ0osSUFBSyx1QkFDRCxFQUFRLEVBQU8sYUFDZixFQUFRLEdBQWtCLEVBQVEsQ0FBUSxFQUMxQyxNQUNKLElBQUssdUJBQ0QsRUFBUSxFQUFPLGFBQ2YsRUFBUSxHQUFrQixFQUFRLENBQVEsRUFDMUMsTUFFSixRQUVJLE9BREEsRUFBUSxFQUFRLG1CQUFvQiw0Q0FBNEMsR0FBTSxFQUMvRSxDQUNILE1BQU8sR0FDUCxLQUFNLEtBQ04sUUFBUyxHQUNULE1BQU8sQ0FBQyxFQUFRLEVBQVMsRUFBTyxPQUFRLEVBQVMsRUFBTyxNQUFNLENBQ2xFLENBQ1IsQ0FDQSxJQUFNLEVBQVcsRUFBUyxFQUFPLE9BQzNCLEVBQUssR0FBVyxFQUFLLEVBQVUsRUFBUSxDQUFPLEVBQ3BELE1BQU8sQ0FDSCxRQUNBLEtBQU0sRUFDTixRQUFTLEVBQUcsUUFDWixNQUFPLENBQUMsRUFBUSxFQUFVLEVBQUcsTUFBTSxDQUN2QyxDQUNKLENBQ0EsU0FBUyxHQUFXLEVBQVEsRUFBUyxDQUNqQyxJQUFJLEVBQVUsR0FDZCxPQUFRLEVBQU8sR0FBZixDQUVJLElBQUssSUFDRCxFQUFVLGtCQUNWLE1BQ0osSUFBSyxJQUNELEVBQVUsNkJBQ1YsTUFDSixJQUFLLElBQ0QsRUFBVSxrQ0FDVixNQUNKLElBQUssSUFDTCxJQUFLLElBQ0QsRUFBVSwwQkFBMEIsRUFBTyxLQUMzQyxNQUVKLElBQUssSUFDTCxJQUFLLElBQ0QsRUFBVSxzQkFBc0IsRUFBTyxJQUcvQyxDQUdBLE9BRkksR0FDQSxFQUFRLEVBQUcsbUJBQW9CLGlDQUFpQyxHQUFTLEVBQ3RFLEdBQVksQ0FBTSxDQUM3QixDQUNBLFNBQVMsR0FBa0IsRUFBUSxFQUFTLENBR3hDLE9BRkksRUFBTyxFQUFPLE9BQVMsS0FBTyxLQUFPLEVBQU8sU0FBVyxJQUN2RCxFQUFRLEVBQU8sT0FBUSxlQUFnQix3QkFBd0IsRUFDNUQsR0FBWSxFQUFPLE1BQU0sRUFBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsTUFBTyxHQUFHLENBQzlELENBQ0EsU0FBUyxHQUFZLEVBQVEsQ0FDekIsSUFBTSxFQUFPLGVBQ1QsRUFBUSxFQUFLLEtBQUssQ0FBTSxFQUM1QixHQUFJLENBQUMsRUFDRCxPQUFPLEVBUVgsSUFBSSxFQUFTLEVBQ2IsR0FBSSxDQUNBLEVBQWMsT0FBTyxpQkFBbUIsRUFDeEMsRUFBZSxPQUFPLHlCQUE2QixHQUFHLENBQzFELE1BQ00sQ0FDRixFQUFVLFVBQ1YsRUFBVyxrQkFDZixDQUNBLElBQUksRUFBTSxFQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQVMsRUFBRSxFQUNsQyxFQUFNLElBQ04sRUFBTSxFQUFLLFVBQ2YsS0FBUSxFQUFRLEVBQUssS0FBSyxDQUFNLEdBQUksQ0FDaEMsSUFBTSxFQUFLLEVBQU0sRUFBRSxDQUFDLFFBQVEsRUFBVSxFQUFFLEVBQ3BDLElBQU8sR0FDSCxJQUFRO0VBQ1IsR0FBTyxFQUVQLEVBQU07R0FHVixHQUFPLEVBQU0sRUFDYixFQUFNLEtBRVYsRUFBTSxFQUFLLFNBQ2YsQ0FDQSxJQUFNLEVBQU8sZUFHYixNQUZBLEdBQUssVUFBWSxFQUNqQixFQUFRLEVBQUssS0FBSyxDQUFNLEVBQ2pCLEVBQU0sR0FBTyxJQUFRLElBQU0sR0FDdEMsQ0FDQSxTQUFTLEdBQWtCLEVBQVEsRUFBUyxDQUN4QyxJQUFJLEVBQU0sR0FDVixJQUFLLElBQUksRUFBSSxFQUFHLEVBQUksRUFBTyxPQUFTLEVBQUcsRUFBRSxFQUFHLENBQ3hDLElBQU0sRUFBSyxFQUFPLEdBQ2QsT0FBTyxNQUFRLEVBQU8sRUFBSSxLQUFPO0VBRXJDLElBQUksSUFBTztFQUFNLENBQ2IsR0FBTSxDQUFFLE9BQU0sVUFBVyxHQUFZLEVBQVEsQ0FBQyxFQUM5QyxHQUFPLEVBQ1AsRUFBSSxDQUNSLE1BQ0ssR0FBSSxJQUFPLEtBQU0sQ0FDbEIsSUFBSSxFQUFPLEVBQU8sRUFBRSxHQUNkLEVBQUssR0FBWSxHQUN2QixHQUFJLEVBQ0EsR0FBTyxPQUNOLEdBQUksSUFBUztFQUdkLElBREEsRUFBTyxFQUFPLEVBQUksR0FDWCxJQUFTLEtBQU8sSUFBUyxLQUM1QixFQUFPLEVBQU8sRUFBRSxFQUFJLFFBRXZCLEdBQUksSUFBUyxNQUFRLEVBQU8sRUFBSSxLQUFPO0VBR3hDLElBREEsRUFBTyxFQUFPLEVBQUUsRUFBSSxHQUNiLElBQVMsS0FBTyxJQUFTLEtBQzVCLEVBQU8sRUFBTyxFQUFFLEVBQUksUUFFdkIsR0FBSSxJQUFTLEtBQU8sSUFBUyxLQUFPLElBQVMsSUFBSyxDQUNuRCxJQUFNLEVBQVMsSUFBUyxJQUFNLEVBQUksSUFBUyxJQUFNLEVBQUksRUFDckQsR0FBTyxHQUFjLEVBQVEsRUFBSSxFQUFHLEVBQVEsQ0FBTyxFQUNuRCxHQUFLLENBQ1QsS0FDSyxDQUNELElBQU0sRUFBTSxFQUFPLE9BQU8sRUFBSSxFQUFHLENBQUMsRUFDbEMsRUFBUSxFQUFJLEVBQUcsZ0JBQWlCLDJCQUEyQixHQUFLLEVBQ2hFLEdBQU8sQ0FDWCxDQUNKLE1BQ0ssR0FBSSxJQUFPLEtBQU8sSUFBTyxJQUFNLENBRWhDLElBQU0sRUFBVSxFQUNaLEVBQU8sRUFBTyxFQUFJLEdBQ3RCLEtBQU8sSUFBUyxLQUFPLElBQVMsS0FDNUIsRUFBTyxFQUFPLEVBQUUsRUFBSSxHQUNwQixJQUFTO0lBQVUsSUFBUyxNQUFRLEVBQU8sRUFBSSxLQUFPO0tBQ3RELEdBQU8sRUFBSSxFQUFVLEVBQU8sTUFBTSxFQUFTLEVBQUksQ0FBQyxFQUFJLEVBQzVELEtBRUksSUFBTyxDQUFBLENBRWYsQ0FHQSxPQUZJLEVBQU8sRUFBTyxPQUFTLEtBQU8sS0FBTyxFQUFPLFNBQVcsSUFDdkQsRUFBUSxFQUFPLE9BQVEsZUFBZ0Isd0JBQXdCLEVBQzVELENBQ1gsQ0FLQSxTQUFTLEdBQVksRUFBUSxFQUFRLENBQ2pDLElBQUksRUFBTyxHQUNQLEVBQUssRUFBTyxFQUFTLEdBQ3pCLE1BQU8sSUFBTyxLQUFPLElBQU8sS0FBUSxJQUFPO0dBQVEsSUFBTyxRQUNsRCxJQUFPLE1BQVEsRUFBTyxFQUFTLEtBQU87SUFFdEMsSUFBTztJQUNQLEdBQVE7R0FDWixHQUFVLEVBQ1YsRUFBSyxFQUFPLEVBQVMsR0FJekIsTUFGQSxDQUNJLElBQU8sSUFDSixDQUFFLE9BQU0sUUFBTyxDQUMxQixDQUNBLE1BQU0sR0FBYyxDQUNoQixFQUFLLEtBQ0wsRUFBRyxPQUNILEVBQUcsS0FDSCxFQUFHLE9BQ0gsRUFBRyxLQUNILEVBQUc7RUFDSCxFQUFHLEtBQ0gsRUFBRyxJQUNILEVBQUcsS0FDSCxFQUFHLElBQ0gsRUFBRyxPQUNILEVBQUcsU0FDSCxFQUFHLFNBQ0gsSUFBSyxJQUNMLElBQUssSUFDTCxJQUFLLElBQ0wsS0FBTSxLQUNOLElBQU0sR0FDVixFQUNBLFNBQVMsR0FBYyxFQUFRLEVBQVEsRUFBUSxFQUFTLENBQ3BELElBQU0sRUFBSyxFQUFPLE9BQU8sRUFBUSxDQUFNLEVBRWpDLEVBREssRUFBRyxTQUFXLEdBQVUsaUJBQWlCLEtBQUssQ0FBRSxFQUN6QyxTQUFTLEVBQUksRUFBRSxFQUFJLElBQ3JDLEdBQUksQ0FDQSxPQUFPLE9BQU8sY0FBYyxDQUFJLENBQ3BDLE1BQ00sQ0FDRixJQUFNLEVBQU0sRUFBTyxPQUFPLEVBQVMsRUFBRyxFQUFTLENBQUMsRUFFaEQsT0FEQSxFQUFRLEVBQVMsRUFBRyxnQkFBaUIsMkJBQTJCLEdBQUssRUFDOUQsQ0FDWCxDQUNKLENDMU5BLFNBQVMsR0FBYyxFQUFLLEVBQU8sRUFBVSxFQUFTLENBQ2xELEdBQU0sQ0FBRSxRQUFPLE9BQU0sVUFBUyxTQUFVLEVBQU0sT0FBUyxlQUNqRCxHQUFtQixFQUFLLEVBQU8sQ0FBTyxFQUN0QyxHQUFrQixFQUFPLEVBQUksUUFBUSxPQUFRLENBQU8sRUFDcEQsRUFBVSxFQUNWLEVBQUksV0FBVyxRQUFRLEVBQVMsT0FBUSxHQUFPLEVBQVEsRUFBVSxxQkFBc0IsQ0FBRyxDQUFDLEVBQzNGLEtBQ0YsRUFDSixBQVFJLEVBUkEsRUFBSSxRQUFRLFlBQWMsRUFBSSxNQUN4QixFQUFJLE9BQU9DLEdBRVosRUFDQyxHQUFvQixFQUFJLE9BQVEsRUFBTyxFQUFTLEVBQVUsQ0FBTyxFQUNsRSxFQUFNLE9BQVMsU0FDZCxHQUFvQixFQUFLLEVBQU8sRUFBTyxDQUFPLEVBRTlDLEVBQUksT0FBT0EsR0FDckIsSUFBSSxFQUNKLEdBQUksQ0FDQSxJQUFNLEVBQU0sRUFBSSxRQUFRLEVBQU8sR0FBTyxFQUFRLEdBQVksRUFBTyxxQkFBc0IsQ0FBRyxFQUFHLEVBQUksT0FBTyxFQUN4RyxFQUFTQyxFQUFTLENBQUcsRUFBSSxFQUFNLElBQUksRUFBTyxDQUFHLENBQ2pELE9BQ08sRUFBTyxDQUNWLElBQU0sRUFBTSxhQUFpQixNQUFRLEVBQU0sUUFBVSxPQUFPLENBQUssRUFDakUsRUFBUSxHQUFZLEVBQU8scUJBQXNCLENBQUcsRUFDcEQsRUFBUyxJQUFJLEVBQU8sQ0FBSyxDQUM3QixDQVdBLE1BVkEsR0FBTyxNQUFRLEVBQ2YsRUFBTyxPQUFTLEVBQ1osSUFDQSxFQUFPLEtBQU8sR0FDZCxJQUNBLEVBQU8sSUFBTSxHQUNiLEVBQUksU0FDSixFQUFPLE9BQVMsRUFBSSxRQUNwQixJQUNBLEVBQU8sUUFBVSxHQUNkLENBQ1gsQ0FDQSxTQUFTLEdBQW9CLEVBQVEsRUFBTyxFQUFTLEVBQVUsRUFBUyxDQUNwRSxHQUFJLElBQVksSUFDWixPQUFPLEVBQU9ELEdBQ2xCLElBQU0sRUFBZ0IsQ0FBQyxFQUN2QixJQUFLLElBQU0sS0FBTyxFQUFPLEtBQ3JCLEdBQUksQ0FBQyxFQUFJLFlBQWMsRUFBSSxNQUFRLEVBQVMsQ0FDeEMsR0FBSSxFQUFJLFNBQVcsRUFBSSxLQUNuQixFQUFjLEtBQUssQ0FBRyxPQUV0QixPQUFPLENBQ2YsQ0FFSixJQUFLLElBQU0sS0FBTyxFQUNkLEdBQUksRUFBSSxNQUFNLEtBQUssQ0FBSyxFQUNwQixPQUFPLEVBQ2YsSUFBTSxFQUFLLEVBQU8sVUFBVSxHQVE1QixPQVBJLEdBQU0sQ0FBQyxFQUFHLFlBR1YsRUFBTyxLQUFLLEtBQUssT0FBTyxPQUFPLENBQUMsRUFBRyxFQUFJLENBQUUsUUFBUyxHQUFPLEtBQU0sSUFBQSxFQUFVLENBQUMsQ0FBQyxFQUNwRSxJQUVYLEVBQVEsRUFBVSxxQkFBc0IsbUJBQW1CLElBQVcsSUFBWSx1QkFBdUIsRUFDbEcsRUFBT0EsR0FDbEIsQ0FDQSxTQUFTLEdBQW9CLENBQUUsUUFBTyxhQUFZLFVBQVUsRUFBTyxFQUFPLEVBQVMsQ0FDL0UsSUFBTSxFQUFNLEVBQU8sS0FBSyxLQUFLLElBQVEsRUFBSSxVQUFZLElBQVMsR0FBUyxFQUFJLFVBQVksUUFDbkYsRUFBSSxNQUFNLEtBQUssQ0FBSyxDQUFDLEdBQUssRUFBT0EsR0FDckMsR0FBSSxFQUFPLE9BQVEsQ0FDZixJQUFNLEVBQVMsRUFBTyxPQUFPLEtBQUssR0FBTyxFQUFJLFNBQVcsRUFBSSxNQUFNLEtBQUssQ0FBSyxDQUFDLEdBQ3pFLEVBQU9BLEdBQ1AsRUFBSSxNQUFRLEVBQU8sS0FJbkIsRUFBUSxFQUFPLHFCQUFzQixpQ0FIMUIsRUFBVyxVQUFVLEVBQUksR0FFVSxFQUFFLE1BRHJDLEVBQVcsVUFBVSxFQUFPLEdBQ2dCLElBQ2IsRUFBSSxDQUV0RCxDQUNBLE9BQU8sQ0FDWCxDQ25GQSxTQUFTLEdBQW9CLEVBQVEsRUFBUSxFQUFLLENBQzlDLEdBQUksRUFBUSxDQUNSLEFBQVEsSUFBTSxFQUFPLE9BQ3JCLElBQUssSUFBSSxFQUFJLEVBQU0sRUFBRyxHQUFLLEVBQUcsRUFBRSxFQUFHLENBQy9CLElBQUksRUFBSyxFQUFPLEdBQ2hCLE9BQVEsRUFBRyxLQUFYLENBQ0ksSUFBSyxRQUNMLElBQUssVUFDTCxJQUFLLFVBQ0QsR0FBVSxFQUFHLE9BQU8sT0FDcEIsUUFDUixDQUlBLElBREEsRUFBSyxFQUFPLEVBQUUsR0FDUCxHQUFJLE9BQVMsU0FDaEIsR0FBVSxFQUFHLE9BQU8sT0FDcEIsRUFBSyxFQUFPLEVBQUUsR0FFbEIsS0FDSixDQUNKLENBQ0EsT0FBTyxDQUNYLENDaEJBLE1BQU0sR0FBSyxDQUFFLGVBQWEsbUJBQWlCLEVBQzNDLFNBQVMsR0FBWSxFQUFLLEVBQU8sRUFBTyxFQUFTLENBQzdDLElBQU0sRUFBUSxFQUFJLE1BQ1osQ0FBRSxjQUFhLFVBQVMsU0FBUSxPQUFRLEVBQzFDLEVBQ0EsRUFBYSxHQUNqQixPQUFRLEVBQU0sS0FBZCxDQUNJLElBQUssUUFDRCxFQUFPLEdBQWEsRUFBSyxFQUFPLENBQU8sR0FDbkMsR0FBVSxJQUNWLEVBQVEsRUFBTyxjQUFlLCtDQUErQyxFQUNqRixNQUNKLElBQUssU0FDTCxJQUFLLHVCQUNMLElBQUssdUJBQ0wsSUFBSyxlQUNELEVBQU8sR0FBYyxFQUFLLEVBQU8sRUFBSyxDQUFPLEVBQ3pDLElBQ0EsRUFBSyxPQUFTLEVBQU8sT0FBTyxVQUFVLENBQUMsR0FDM0MsTUFDSixJQUFLLFlBQ0wsSUFBSyxZQUNMLElBQUssa0JBQ0QsR0FBSSxDQUNBLEVBQU8sR0FBa0IsR0FBSSxFQUFLLEVBQU8sRUFBTyxDQUFPLEVBQ25ELElBQ0EsRUFBSyxPQUFTLEVBQU8sT0FBTyxVQUFVLENBQUMsRUFDL0MsT0FDTyxFQUFPLENBR1YsRUFBUSxFQUFPLHNCQURDLGFBQWlCLE1BQVEsRUFBTSxRQUFVLE9BQU8sQ0FBSyxDQUN4QixDQUNqRCxDQUNBLE1BQ0osUUFJSSxFQUFRLEVBQU8sbUJBSEMsRUFBTSxPQUFTLFFBQ3pCLEVBQU0sUUFDTiw0QkFBNEIsRUFBTSxLQUFLLEVBQ0gsRUFDMUMsRUFBYSxFQUVyQixDQXVCQSxNQXRCQSxDQUFTLElBQU8sR0FBaUIsRUFBSyxFQUFNLE9BQVEsSUFBQSxHQUFXLEtBQU0sRUFBTyxDQUFPLEVBQy9FLEdBQVUsRUFBSyxTQUFXLElBQzFCLEVBQVEsRUFBUSxZQUFhLGtDQUFrQyxFQUMvRCxHQUNBLEVBQUksUUFBUSxhQUNYLENBQUNFLEVBQVMsQ0FBSSxHQUNYLE9BQU8sRUFBSyxPQUFVLFVBQ3JCLEVBQUssS0FBTyxFQUFLLE1BQVEsMEJBRTlCLEVBQVEsR0FBTyxFQUFPLGlCQUFrQiwyQ0FBRyxFQUUzQyxJQUNBLEVBQUssWUFBYyxJQUNuQixJQUNJLEVBQU0sT0FBUyxVQUFZLEVBQU0sU0FBVyxHQUM1QyxFQUFLLFFBQVUsRUFFZixFQUFLLGNBQWdCLEdBR3pCLEVBQUksUUFBUSxrQkFBb0IsSUFDaEMsRUFBSyxTQUFXLEdBQ2IsQ0FDWCxDQUNBLFNBQVMsR0FBaUIsRUFBSyxFQUFRLEVBQVEsRUFBSyxDQUFFLGNBQWEsVUFBUyxTQUFRLE1BQUssT0FBTyxFQUFTLENBT3JHLElBQU0sRUFBTyxHQUFjLEVBQUssQ0FMNUIsS0FBTSxTQUNOLE9BQVEsR0FBb0IsRUFBUSxFQUFRLENBQUcsRUFDL0MsT0FBUSxHQUNSLE9BQVEsRUFFb0IsRUFBTyxFQUFLLENBQU8sRUFZbkQsT0FYSSxJQUNBLEVBQUssT0FBUyxFQUFPLE9BQU8sVUFBVSxDQUFDLEVBQ25DLEVBQUssU0FBVyxJQUNoQixFQUFRLEVBQVEsWUFBYSxrQ0FBa0MsR0FFbkUsSUFDQSxFQUFLLFlBQWMsSUFDbkIsSUFDQSxFQUFLLFFBQVUsRUFDZixFQUFLLE1BQU0sR0FBSyxHQUViLENBQ1gsQ0FDQSxTQUFTLEdBQWEsQ0FBRSxXQUFXLENBQUUsU0FBUSxTQUFRLE9BQU8sRUFBUyxDQUNqRSxJQUFNLEVBQVEsSUFBSSxHQUFNLEVBQU8sVUFBVSxDQUFDLENBQUMsRUFDdkMsRUFBTSxTQUFXLElBQ2pCLEVBQVEsRUFBUSxZQUFhLGlDQUFpQyxFQUM5RCxFQUFNLE9BQU8sU0FBUyxHQUFHLEdBQ3pCLEVBQVEsRUFBUyxFQUFPLE9BQVMsRUFBRyxZQUFhLGlDQUFrQyxFQUFJLEVBQzNGLElBQU0sRUFBVyxFQUFTLEVBQU8sT0FDM0IsRUFBSyxHQUFXLEVBQUssRUFBVSxFQUFRLE9BQVEsQ0FBTyxFQUk1RCxNQUhBLEdBQU0sTUFBUSxDQUFDLEVBQVEsRUFBVSxFQUFHLE1BQU0sRUFDdEMsRUFBRyxVQUNILEVBQU0sUUFBVSxFQUFHLFNBQ2hCLENBQ1gsQ0NyR0EsU0FBUyxHQUFXLEVBQVMsRUFBWSxDQUFFLFNBQVEsUUFBTyxRQUFPLE9BQU8sRUFBUyxDQUU3RSxJQUFNLEVBQU0sSUFBSSxHQUFTLElBQUEsR0FEWixPQUFPLE9BQU8sQ0FBRSxZQUFhLENBQVcsRUFBRyxDQUNwQixDQUFJLEVBQ2xDLEVBQU0sQ0FDUixNQUFPLEdBQ1AsT0FBUSxHQUNSLFdBQVksRUFBSSxXQUNoQixRQUFTLEVBQUksUUFDYixPQUFRLEVBQUksTUFDaEIsRUFDTSxFQUFRLEdBQWEsRUFBTyxDQUM5QixVQUFXLFlBQ1gsS0FBTSxHQUFTLElBQU0sR0FDckIsU0FDQSxVQUNBLGFBQWMsRUFDZCxlQUFnQixFQUNwQixDQUFDLEVBQ0csRUFBTSxRQUNOLEVBQUksV0FBVyxTQUFXLEdBQ3RCLElBQ0MsRUFBTSxPQUFTLGFBQWUsRUFBTSxPQUFTLGNBQzlDLENBQUMsRUFBTSxZQUNQLEVBQVEsRUFBTSxJQUFLLGVBQWdCLHVFQUF1RSxHQUdsSCxFQUFJLFNBQVcsRUFDVCxHQUFZLEVBQUssRUFBTyxFQUFPLENBQU8sRUFDdEMsR0FBaUIsRUFBSyxFQUFNLElBQUssRUFBTyxLQUFNLEVBQU8sQ0FBTyxFQUNsRSxJQUFNLEVBQWEsRUFBSSxTQUFTLE1BQU0sR0FDaEMsRUFBSyxHQUFXLEVBQUssRUFBWSxHQUFPLENBQU8sRUFJckQsT0FISSxFQUFHLFVBQ0gsRUFBSSxRQUFVLEVBQUcsU0FDckIsRUFBSSxNQUFRLENBQUMsRUFBUSxFQUFZLEVBQUcsTUFBTSxFQUNuQyxDQUNYLENDakNBLFNBQVMsR0FBWSxFQUFLLENBQ3RCLEdBQUksT0FBTyxHQUFRLFNBQ2YsTUFBTyxDQUFDLEVBQUssRUFBTSxDQUFDLEVBQ3hCLEdBQUksTUFBTSxRQUFRLENBQUcsRUFDakIsT0FBTyxFQUFJLFNBQVcsRUFBSSxFQUFNLENBQUMsRUFBSSxHQUFJLEVBQUksRUFBRSxFQUNuRCxHQUFNLENBQUUsU0FBUSxVQUFXLEVBQzNCLE1BQU8sQ0FBQyxFQUFRLEdBQVUsT0FBTyxHQUFXLFNBQVcsRUFBTyxPQUFTLEVBQUUsQ0FDN0UsQ0FDQSxTQUFTLEdBQWEsRUFBUyxDQUMzQixJQUFJLEVBQVUsR0FDVixFQUFZLEdBQ1osRUFBaUIsR0FDckIsSUFBSyxJQUFJLEVBQUksRUFBRyxFQUFJLEVBQVEsT0FBUSxFQUFFLEVBQUcsQ0FDckMsSUFBTSxFQUFTLEVBQVEsR0FDdkIsT0FBUSxFQUFPLEdBQWYsQ0FDSSxJQUFLLElBQ0QsSUFDSyxJQUFZLEdBQUssR0FBSyxFQUFpQjs7RUFBUztJQUM1QyxFQUFPLFVBQVUsQ0FBQyxHQUFLLEtBQ2hDLEVBQVksR0FDWixFQUFpQixHQUNqQixNQUNKLElBQUssSUFDRyxFQUFRLEVBQUksRUFBRSxHQUFHLEtBQU8sTUFDeEIsR0FBSyxHQUNULEVBQVksR0FDWixNQUNKLFFBRVMsSUFDRCxFQUFpQixJQUNyQixFQUFZLEVBQ3BCLENBQ0osQ0FDQSxNQUFPLENBQUUsVUFBUyxnQkFBZSxDQUNyQyxDQVlBLElBQU0sR0FBTixLQUFlLENBQ1gsWUFBWSxFQUFVLENBQUMsRUFBRyxDQUN0QixLQUFLLElBQU0sS0FDWCxLQUFLLGFBQWUsR0FDcEIsS0FBSyxRQUFVLENBQUMsRUFDaEIsS0FBSyxPQUFTLENBQUMsRUFDZixLQUFLLFNBQVcsQ0FBQyxFQUNqQixLQUFLLFNBQVcsRUFBUSxFQUFNLEVBQVMsSUFBWSxDQUMvQyxJQUFNLEVBQU0sR0FBWSxDQUFNLEVBQzFCLEVBQ0EsS0FBSyxTQUFTLEtBQUssSUFBSSxHQUFZLEVBQUssRUFBTSxDQUFPLENBQUMsRUFFdEQsS0FBSyxPQUFPLEtBQUssSUFBSSxFQUFlLEVBQUssRUFBTSxDQUFPLENBQUMsQ0FDL0QsRUFFQSxLQUFLLFdBQWEsSUFBSSxFQUFXLENBQUUsUUFBUyxFQUFRLFNBQVcsS0FBTSxDQUFDLEVBQ3RFLEtBQUssUUFBVSxDQUNuQixDQUNBLFNBQVMsRUFBSyxFQUFVLENBQ3BCLEdBQU0sQ0FBRSxVQUFTLGtCQUFtQixHQUFhLEtBQUssT0FBTyxFQUU3RCxHQUFJLEVBQVMsQ0FDVCxJQUFNLEVBQUssRUFBSSxTQUNmLEdBQUksRUFDQSxFQUFJLFFBQVUsRUFBSSxRQUFVLEdBQUcsRUFBSSxRQUFRLElBQUksSUFBWSxPQUUxRCxHQUFJLEdBQWtCLEVBQUksV0FBVyxVQUFZLENBQUMsRUFDbkQsRUFBSSxjQUFnQixPQUVuQixHQUFJQyxFQUFhLENBQUUsR0FBSyxDQUFDLEVBQUcsTUFBUSxFQUFHLE1BQU0sT0FBUyxFQUFHLENBQzFELElBQUksRUFBSyxFQUFHLE1BQU0sR0FDZCxFQUFPLENBQUUsSUFDVCxFQUFLLEVBQUcsS0FDWixJQUFNLEVBQUssRUFBRyxjQUNkLEVBQUcsY0FBZ0IsRUFBSyxHQUFHLEVBQVEsSUFBSSxJQUFPLENBQ2xELEtBQ0ssQ0FDRCxJQUFNLEVBQUssRUFBRyxjQUNkLEVBQUcsY0FBZ0IsRUFBSyxHQUFHLEVBQVEsSUFBSSxJQUFPLENBQ2xELENBQ0osQ0FDQSxHQUFJLEVBQVUsQ0FDVixJQUFLLElBQUksRUFBSSxFQUFHLEVBQUksS0FBSyxPQUFPLE9BQVEsRUFBRSxFQUN0QyxFQUFJLE9BQU8sS0FBSyxLQUFLLE9BQU8sRUFBRSxFQUNsQyxJQUFLLElBQUksRUFBSSxFQUFHLEVBQUksS0FBSyxTQUFTLE9BQVEsRUFBRSxFQUN4QyxFQUFJLFNBQVMsS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUMxQyxLQUVJLEdBQUksT0FBUyxLQUFLLE9BQ2xCLEVBQUksU0FBVyxLQUFLLFNBRXhCLEtBQUssUUFBVSxDQUFDLEVBQ2hCLEtBQUssT0FBUyxDQUFDLEVBQ2YsS0FBSyxTQUFXLENBQUMsQ0FDckIsQ0FNQSxZQUFhLENBQ1QsTUFBTyxDQUNILFFBQVMsR0FBYSxLQUFLLE9BQU8sQ0FBQyxDQUFDLFFBQ3BDLFdBQVksS0FBSyxXQUNqQixPQUFRLEtBQUssT0FDYixTQUFVLEtBQUssUUFDbkIsQ0FDSixDQU9BLENBQUMsUUFBUSxFQUFRLEVBQVcsR0FBTyxFQUFZLEdBQUksQ0FDL0MsSUFBSyxJQUFNLEtBQVMsRUFDaEIsTUFBTyxLQUFLLEtBQUssQ0FBSyxFQUMxQixNQUFPLEtBQUssSUFBSSxFQUFVLENBQVMsQ0FDdkMsQ0FFQSxDQUFDLEtBQUssRUFBTyxDQUNULE9BQVEsRUFBTSxLQUFkLENBQ0ksSUFBSyxZQUNELEtBQUssV0FBVyxJQUFJLEVBQU0sUUFBUyxFQUFRLEVBQVMsSUFBWSxDQUM1RCxJQUFNLEVBQU0sR0FBWSxDQUFLLEVBQzdCLEVBQUksSUFBTSxFQUNWLEtBQUssUUFBUSxFQUFLLGdCQUFpQixFQUFTLENBQU8sQ0FDdkQsQ0FBQyxFQUNELEtBQUssUUFBUSxLQUFLLEVBQU0sTUFBTSxFQUM5QixLQUFLLGFBQWUsR0FDcEIsTUFDSixJQUFLLFdBQVksQ0FDYixJQUFNLEVBQU0sR0FBVyxLQUFLLFFBQVMsS0FBSyxXQUFZLEVBQU8sS0FBSyxPQUFPLEVBQ3JFLEtBQUssY0FBZ0IsQ0FBQyxFQUFJLFdBQVcsVUFDckMsS0FBSyxRQUFRLEVBQU8sZUFBZ0IsaURBQWlELEVBQ3pGLEtBQUssU0FBUyxFQUFLLEVBQUssRUFDcEIsS0FBSyxNQUNMLE1BQU0sS0FBSyxLQUNmLEtBQUssSUFBTSxFQUNYLEtBQUssYUFBZSxHQUNwQixLQUNKLENBQ0EsSUFBSyxrQkFDTCxJQUFLLFFBQ0QsTUFDSixJQUFLLFVBQ0wsSUFBSyxVQUNELEtBQUssUUFBUSxLQUFLLEVBQU0sTUFBTSxFQUM5QixNQUNKLElBQUssUUFBUyxDQUNWLElBQU0sRUFBTSxFQUFNLE9BQ1osR0FBRyxFQUFNLFFBQVEsSUFBSSxLQUFLLFVBQVUsRUFBTSxNQUFNLElBQ2hELEVBQU0sUUFDTixFQUFRLElBQUksRUFBZSxHQUFZLENBQUssRUFBRyxtQkFBb0IsQ0FBRyxFQUN4RSxLQUFLLGNBQWdCLENBQUMsS0FBSyxJQUMzQixLQUFLLE9BQU8sS0FBSyxDQUFLLEVBRXRCLEtBQUssSUFBSSxPQUFPLEtBQUssQ0FBSyxFQUM5QixLQUNKLENBQ0EsSUFBSyxVQUFXLENBQ1osR0FBSSxDQUFDLEtBQUssSUFBSyxDQUVYLEtBQUssT0FBTyxLQUFLLElBQUksRUFBZSxHQUFZLENBQUssRUFBRyxtQkFBb0IsK0NBQUcsQ0FBQyxFQUNoRixLQUNKLENBQ0EsS0FBSyxJQUFJLFdBQVcsT0FBUyxHQUM3QixJQUFNLEVBQU0sR0FBVyxFQUFNLElBQUssRUFBTSxPQUFTLEVBQU0sT0FBTyxPQUFRLEtBQUssSUFBSSxRQUFRLE9BQVEsS0FBSyxPQUFPLEVBRTNHLEdBREEsS0FBSyxTQUFTLEtBQUssSUFBSyxFQUFJLEVBQ3hCLEVBQUksUUFBUyxDQUNiLElBQU0sRUFBSyxLQUFLLElBQUksUUFDcEIsS0FBSyxJQUFJLFFBQVUsRUFBSyxHQUFHLEVBQUcsSUFBSSxFQUFJLFVBQVksRUFBSSxPQUMxRCxDQUNBLEtBQUssSUFBSSxNQUFNLEdBQUssRUFBSSxPQUN4QixLQUNKLENBQ0EsUUFDSSxLQUFLLE9BQU8sS0FBSyxJQUFJLEVBQWUsR0FBWSxDQUFLLEVBQUcsbUJBQW9CLHFCQUFxQixFQUFNLE1BQU0sQ0FBQyxDQUN0SCxDQUNKLENBT0EsQ0FBQyxJQUFJLEVBQVcsR0FBTyxFQUFZLEdBQUksQ0FDbkMsR0FBSSxLQUFLLElBQ0wsS0FBSyxTQUFTLEtBQUssSUFBSyxFQUFJLEVBQzVCLE1BQU0sS0FBSyxJQUNYLEtBQUssSUFBTSxVQUVWLEdBQUksRUFBVSxDQUVmLElBQU0sRUFBTSxJQUFJLEdBQVMsSUFBQSxHQURaLE9BQU8sT0FBTyxDQUFFLFlBQWEsS0FBSyxVQUFXLEVBQUcsS0FBSyxPQUM5QixDQUFJLEVBQ3BDLEtBQUssY0FDTCxLQUFLLFFBQVEsRUFBVyxlQUFnQix1Q0FBdUMsRUFDbkYsRUFBSSxNQUFRLENBQUMsRUFBRyxFQUFXLENBQVMsRUFDcEMsS0FBSyxTQUFTLEVBQUssRUFBSyxFQUN4QixNQUFNLENBQ1YsQ0FDSixDQUNKLEVDbk5BLFNBQVMsR0FBZ0IsRUFBTyxFQUFTLEdBQU0sRUFBUyxDQUNwRCxHQUFJLEVBQU8sQ0FDUCxJQUFNLEdBQVksRUFBSyxFQUFNLElBQVksQ0FDckMsSUFBTSxFQUFTLE9BQU8sR0FBUSxTQUFXLEVBQU0sTUFBTSxRQUFRLENBQUcsRUFBSSxFQUFJLEdBQUssRUFBSSxPQUNqRixHQUFJLEVBQ0EsRUFBUSxFQUFRLEVBQU0sQ0FBTyxPQUU3QixNQUFNLElBQUksRUFBZSxDQUFDLEVBQVEsRUFBUyxDQUFDLEVBQUcsRUFBTSxDQUFPLENBQ3BFLEVBQ0EsT0FBUSxFQUFNLEtBQWQsQ0FDSSxJQUFLLFNBQ0wsSUFBSyx1QkFDTCxJQUFLLHVCQUNELE9BQU8sR0FBa0IsRUFBTyxFQUFRLENBQVEsRUFDcEQsSUFBSyxlQUNELE9BQU8sR0FBbUIsQ0FBRSxRQUFTLENBQUUsUUFBTyxDQUFFLEVBQUcsRUFBTyxDQUFRLENBQzFFLENBQ0osQ0FDQSxPQUFPLElBQ1gsQ0FlQSxTQUFTLEdBQWtCLEVBQU8sRUFBUyxDQUN2QyxHQUFNLENBQUUsY0FBYyxHQUFPLFNBQVEsU0FBUyxHQUFPLFNBQVMsR0FBSSxPQUFPLFNBQVksRUFDL0UsRUFBUyxHQUFnQixDQUFFLE9BQU0sT0FBTSxFQUFHLENBQzVDLGNBQ0EsT0FBUSxFQUFTLEVBQUksSUFBSSxPQUFPLENBQU0sRUFBSSxHQUMxQyxTQUNBLFFBQVMsQ0FBRSxXQUFZLEdBQU0sVUFBVyxFQUFHLENBQy9DLENBQUMsRUFDSyxFQUFNLEVBQVEsS0FBTyxDQUN2QixDQUFFLEtBQU0sVUFBVyxPQUFRLEdBQUksU0FBUSxPQUFRO0NBQUssQ0FDeEQsRUFDQSxPQUFRLEVBQU8sR0FBZixDQUNJLElBQUssSUFDTCxJQUFLLElBQUssQ0FDTixJQUFNLEVBQUssRUFBTyxRQUFRO0NBQUksRUFDeEIsRUFBTyxFQUFPLFVBQVUsRUFBRyxDQUFFLEVBQzdCLEVBQU8sRUFBTyxVQUFVLEVBQUssQ0FBQyxFQUFJO0VBQ2xDLEVBQVEsQ0FDVixDQUFFLEtBQU0sc0JBQXVCLFNBQVEsU0FBUSxPQUFRLENBQUssQ0FDaEUsRUFHQSxPQUZLLEdBQW1CLEVBQU8sQ0FBRyxHQUM5QixFQUFNLEtBQUssQ0FBRSxLQUFNLFVBQVcsT0FBUSxHQUFJLFNBQVEsT0FBUTtDQUFLLENBQUMsRUFDN0QsQ0FBRSxLQUFNLGVBQWdCLFNBQVEsU0FBUSxRQUFPLE9BQVEsQ0FBSyxDQUN2RSxDQUNBLElBQUssSUFDRCxNQUFPLENBQUUsS0FBTSx1QkFBd0IsU0FBUSxTQUFRLFNBQVEsS0FBSSxFQUN2RSxJQUFLLElBQ0QsTUFBTyxDQUFFLEtBQU0sdUJBQXdCLFNBQVEsU0FBUSxTQUFRLEtBQUksRUFDdkUsUUFDSSxNQUFPLENBQUUsS0FBTSxTQUFVLFNBQVEsU0FBUSxTQUFRLEtBQUksQ0FDN0QsQ0FDSixDQWlCQSxTQUFTLEdBQWUsRUFBTyxFQUFPLEVBQVUsQ0FBQyxFQUFHLENBQ2hELEdBQUksQ0FBRSxXQUFXLEdBQU8sY0FBYyxHQUFPLFNBQVMsR0FBTyxRQUFTLEVBQ2xFLEVBQVMsV0FBWSxFQUFRLEVBQU0sT0FBUyxLQUdoRCxHQUZJLEdBQVksT0FBTyxHQUFXLFdBQzlCLEdBQVUsR0FDVixDQUFDLEVBQ0QsT0FBUSxFQUFNLEtBQWQsQ0FDSSxJQUFLLHVCQUNELEVBQU8sZUFDUCxNQUNKLElBQUssdUJBQ0QsRUFBTyxlQUNQLE1BQ0osSUFBSyxlQUFnQixDQUNqQixJQUFNLEVBQVMsRUFBTSxNQUFNLEdBQzNCLEdBQUksRUFBTyxPQUFTLHNCQUNoQixNQUFVLE1BQU0sNkJBQTZCLEVBQ2pELEVBQU8sRUFBTyxPQUFPLEtBQU8sSUFBTSxlQUFpQixnQkFDbkQsS0FDSixDQUNBLFFBQ0ksRUFBTyxPQUNmLENBQ0osSUFBTSxFQUFTLEdBQWdCLENBQUUsT0FBTSxPQUFNLEVBQUcsQ0FDNUMsWUFBYSxHQUFlLElBQVcsS0FDdkMsT0FBUSxJQUFXLE1BQVEsRUFBUyxFQUFJLElBQUksT0FBTyxDQUFNLEVBQUksR0FDN0QsU0FDQSxRQUFTLENBQUUsV0FBWSxHQUFNLFVBQVcsRUFBRyxDQUMvQyxDQUFDLEVBQ0QsT0FBUSxFQUFPLEdBQWYsQ0FDSSxJQUFLLElBQ0wsSUFBSyxJQUNELEdBQW9CLEVBQU8sQ0FBTSxFQUNqQyxNQUNKLElBQUssSUFDRCxHQUFtQixFQUFPLEVBQVEsc0JBQXNCLEVBQ3hELE1BQ0osSUFBSyxJQUNELEdBQW1CLEVBQU8sRUFBUSxzQkFBc0IsRUFDeEQsTUFDSixRQUNJLEdBQW1CLEVBQU8sRUFBUSxRQUFRLENBQ2xELENBQ0osQ0FDQSxTQUFTLEdBQW9CLEVBQU8sRUFBUSxDQUN4QyxJQUFNLEVBQUssRUFBTyxRQUFRO0NBQUksRUFDeEIsRUFBTyxFQUFPLFVBQVUsRUFBRyxDQUFFLEVBQzdCLEVBQU8sRUFBTyxVQUFVLEVBQUssQ0FBQyxFQUFJO0VBQ3hDLEdBQUksRUFBTSxPQUFTLGVBQWdCLENBQy9CLElBQU0sRUFBUyxFQUFNLE1BQU0sR0FDM0IsR0FBSSxFQUFPLE9BQVMsc0JBQ2hCLE1BQVUsTUFBTSw2QkFBNkIsRUFDakQsRUFBTyxPQUFTLEVBQ2hCLEVBQU0sT0FBUyxDQUNuQixLQUNLLENBQ0QsR0FBTSxDQUFFLFVBQVcsRUFDYixFQUFTLFdBQVksRUFBUSxFQUFNLE9BQVMsR0FDNUMsRUFBUSxDQUNWLENBQUUsS0FBTSxzQkFBdUIsU0FBUSxTQUFRLE9BQVEsQ0FBSyxDQUNoRSxFQUNLLEdBQW1CLEVBQU8sUUFBUyxFQUFRLEVBQU0sSUFBTSxJQUFBLEVBQVMsR0FDakUsRUFBTSxLQUFLLENBQUUsS0FBTSxVQUFXLE9BQVEsR0FBSSxTQUFRLE9BQVE7Q0FBSyxDQUFDLEVBQ3BFLElBQUssSUFBTSxLQUFPLE9BQU8sS0FBSyxDQUFLLEVBQzNCLElBQVEsUUFBVSxJQUFRLFVBQzFCLE9BQU8sRUFBTSxHQUNyQixPQUFPLE9BQU8sRUFBTyxDQUFFLEtBQU0sZUFBZ0IsU0FBUSxRQUFPLE9BQVEsQ0FBSyxDQUFDLENBQzlFLENBQ0osQ0FFQSxTQUFTLEdBQW1CLEVBQU8sRUFBSyxDQUNwQyxHQUFJLEVBQ0EsSUFBSyxJQUFNLEtBQU0sRUFDYixPQUFRLEVBQUcsS0FBWCxDQUNJLElBQUssUUFDTCxJQUFLLFVBQ0QsRUFBTSxLQUFLLENBQUUsRUFDYixNQUNKLElBQUssVUFFRCxPQURBLEVBQU0sS0FBSyxDQUFFLEVBQ04sRUFDZixDQUNSLE1BQU8sRUFDWCxDQUNBLFNBQVMsR0FBbUIsRUFBTyxFQUFRLEVBQU0sQ0FDN0MsT0FBUSxFQUFNLEtBQWQsQ0FDSSxJQUFLLFNBQ0wsSUFBSyx1QkFDTCxJQUFLLHVCQUNELEVBQU0sS0FBTyxFQUNiLEVBQU0sT0FBUyxFQUNmLE1BQ0osSUFBSyxlQUFnQixDQUNqQixJQUFNLEVBQU0sRUFBTSxNQUFNLE1BQU0sQ0FBQyxFQUMzQixFQUFLLEVBQU8sT0FDWixFQUFNLE1BQU0sRUFBRSxDQUFDLE9BQVMsd0JBQ3hCLEdBQU0sRUFBTSxNQUFNLEVBQUUsQ0FBQyxPQUFPLFFBQ2hDLElBQUssSUFBTSxLQUFPLEVBQ2QsRUFBSSxRQUFVLEVBQ2xCLE9BQU8sRUFBTSxNQUNiLE9BQU8sT0FBTyxFQUFPLENBQUUsT0FBTSxTQUFRLEtBQUksQ0FBQyxFQUMxQyxLQUNKLENBQ0EsSUFBSyxZQUNMLElBQUssWUFBYSxDQUVkLElBQU0sRUFBSyxDQUFFLEtBQU0sVUFBVyxPQURmLEVBQU0sT0FBUyxFQUFPLE9BQ0MsT0FBUSxFQUFNLE9BQVEsT0FBUTtDQUFLLEVBQ3pFLE9BQU8sRUFBTSxNQUNiLE9BQU8sT0FBTyxFQUFPLENBQUUsT0FBTSxTQUFRLElBQUssQ0FBQyxDQUFFLENBQUUsQ0FBQyxFQUNoRCxLQUNKLENBQ0EsUUFBUyxDQUNMLElBQU0sRUFBUyxXQUFZLEVBQVEsRUFBTSxPQUFTLEdBQzVDLEVBQU0sUUFBUyxHQUFTLE1BQU0sUUFBUSxFQUFNLEdBQUcsRUFDL0MsRUFBTSxJQUFJLE9BQU8sR0FBTSxFQUFHLE9BQVMsU0FDakMsRUFBRyxPQUFTLFdBQ1osRUFBRyxPQUFTLFNBQVMsRUFDdkIsQ0FBQyxFQUNQLElBQUssSUFBTSxLQUFPLE9BQU8sS0FBSyxDQUFLLEVBQzNCLElBQVEsUUFBVSxJQUFRLFVBQzFCLE9BQU8sRUFBTSxHQUNyQixPQUFPLE9BQU8sRUFBTyxDQUFFLE9BQU0sU0FBUSxTQUFRLEtBQUksQ0FBQyxDQUN0RCxDQUNKLENBQ0osQ0M3TUEsTUFBTUMsR0FBYSxHQUFRLFNBQVUsRUFBTSxHQUFlLENBQUcsRUFBSSxHQUFjLENBQUcsRUFDbEYsU0FBUyxHQUFlLEVBQU8sQ0FDM0IsT0FBUSxFQUFNLEtBQWQsQ0FDSSxJQUFLLGVBQWdCLENBQ2pCLElBQUksRUFBTSxHQUNWLElBQUssSUFBTSxLQUFPLEVBQU0sTUFDcEIsR0FBTyxHQUFlLENBQUcsRUFDN0IsT0FBTyxFQUFNLEVBQU0sTUFDdkIsQ0FDQSxJQUFLLFlBQ0wsSUFBSyxZQUFhLENBQ2QsSUFBSSxFQUFNLEdBQ1YsSUFBSyxJQUFNLEtBQVEsRUFBTSxNQUNyQixHQUFPLEdBQWMsQ0FBSSxFQUM3QixPQUFPLENBQ1gsQ0FDQSxJQUFLLGtCQUFtQixDQUNwQixJQUFJLEVBQU0sRUFBTSxNQUFNLE9BQ3RCLElBQUssSUFBTSxLQUFRLEVBQU0sTUFDckIsR0FBTyxHQUFjLENBQUksRUFDN0IsSUFBSyxJQUFNLEtBQU0sRUFBTSxJQUNuQixHQUFPLEVBQUcsT0FDZCxPQUFPLENBQ1gsQ0FDQSxJQUFLLFdBQVksQ0FDYixJQUFJLEVBQU0sR0FBYyxDQUFLLEVBQzdCLEdBQUksRUFBTSxJQUNOLElBQUssSUFBTSxLQUFNLEVBQU0sSUFDbkIsR0FBTyxFQUFHLE9BQ2xCLE9BQU8sQ0FDWCxDQUNBLFFBQVMsQ0FDTCxJQUFJLEVBQU0sRUFBTSxPQUNoQixHQUFJLFFBQVMsR0FBUyxFQUFNLElBQ3hCLElBQUssSUFBTSxLQUFNLEVBQU0sSUFDbkIsR0FBTyxFQUFHLE9BQ2xCLE9BQU8sQ0FDWCxDQUNKLENBQ0osQ0FDQSxTQUFTLEdBQWMsQ0FBRSxRQUFPLE1BQUssTUFBSyxTQUFTLENBQy9DLElBQUksRUFBTSxHQUNWLElBQUssSUFBTSxLQUFNLEVBQ2IsR0FBTyxFQUFHLE9BR2QsR0FGSSxJQUNBLEdBQU8sR0FBZSxDQUFHLEdBQ3pCLEVBQ0EsSUFBSyxJQUFNLEtBQU0sRUFDYixHQUFPLEVBQUcsT0FHbEIsT0FGSSxJQUNBLEdBQU8sR0FBZSxDQUFLLEdBQ3hCLENBQ1gsQ0MxREEsTUFBTSxHQUFRLE9BQU8sYUFBYSxFQUM1QixHQUFPLE9BQU8sZUFBZSxFQUM3QixHQUFTLE9BQU8sYUFBYSxFQTZCbkMsU0FBUyxFQUFNLEVBQUssRUFBUyxDQUNyQixTQUFVLEdBQU8sRUFBSSxPQUFTLGFBQzlCLEVBQU0sQ0FBRSxNQUFPLEVBQUksTUFBTyxNQUFPLEVBQUksS0FBTSxHQUMvQyxHQUFPLE9BQU8sT0FBTyxDQUFDLENBQUMsRUFBRyxFQUFLLENBQU8sQ0FDMUMsQ0FLQSxFQUFNLE1BQVEsR0FFZCxFQUFNLEtBQU8sR0FFYixFQUFNLE9BQVMsR0FFZixFQUFNLFlBQWMsRUFBSyxJQUFTLENBQzlCLElBQUksRUFBTyxFQUNYLElBQUssR0FBTSxDQUFDLEVBQU8sS0FBVSxFQUFNLENBQy9CLElBQU0sRUFBTSxJQUFPLEdBQ25CLEdBQUksR0FBTyxVQUFXLEVBQ2xCLEVBQU8sRUFBSSxNQUFNLFFBR2pCLE1BQ1IsQ0FDQSxPQUFPLENBQ1gsRUFNQSxFQUFNLGtCQUFvQixFQUFLLElBQVMsQ0FDcEMsSUFBTSxFQUFTLEVBQU0sV0FBVyxFQUFLLEVBQUssTUFBTSxFQUFHLEVBQUUsQ0FBQyxFQUNoRCxFQUFRLEVBQUssRUFBSyxPQUFTLEVBQUUsQ0FBQyxHQUM5QixFQUFPLElBQVMsR0FDdEIsR0FBSSxHQUFRLFVBQVcsRUFDbkIsT0FBTyxFQUNYLE1BQVUsTUFBTSw2QkFBNkIsQ0FDakQsRUFDQSxTQUFTLEdBQU8sRUFBTSxFQUFNLEVBQVMsQ0FDakMsSUFBSSxFQUFPLEVBQVEsRUFBTSxDQUFJLEVBQzdCLEdBQUksT0FBTyxHQUFTLFNBQ2hCLE9BQU8sRUFDWCxJQUFLLElBQU0sSUFBUyxDQUFDLE1BQU8sT0FBTyxFQUFHLENBQ2xDLElBQU0sRUFBUSxFQUFLLEdBQ25CLEdBQUksR0FBUyxVQUFXLEVBQU8sQ0FDM0IsSUFBSyxJQUFJLEVBQUksRUFBRyxFQUFJLEVBQU0sTUFBTSxPQUFRLEVBQUUsRUFBRyxDQUN6QyxJQUFNLEVBQUssR0FBTyxPQUFPLE9BQU8sRUFBSyxPQUFPLENBQUMsQ0FBQyxFQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRyxFQUFNLE1BQU0sR0FBSSxDQUFPLEVBQ25GLEdBQUksT0FBTyxHQUFPLFNBQ2QsRUFBSSxFQUFLLE9BQ1IsR0FBSSxJQUFPLEdBQ1osT0FBTyxRQUNGLElBQU8sS0FDWixFQUFNLE1BQU0sT0FBTyxFQUFHLENBQUMsRUFDdkIsSUFFUixDQUNJLE9BQU8sR0FBUyxZQUFjLElBQVUsUUFDeEMsRUFBTyxFQUFLLEVBQU0sQ0FBSSxFQUM5QixDQUNKLENBQ0EsT0FBTyxPQUFPLEdBQVMsV0FBYSxFQUFLLEVBQU0sQ0FBSSxFQUFJLENBQzNELHFQQ2pGQSxNQUFNLEdBQWdCLEdBQVUsQ0FBQyxDQUFDLEdBQVMsVUFBVyxFQUVoRCxHQUFZLEdBQVUsQ0FBQyxDQUFDLElBQ3pCLEVBQU0sT0FBUyxVQUNaLEVBQU0sT0FBUyx3QkFDZixFQUFNLE9BQVMsd0JBQ2YsRUFBTSxPQUFTLGdCQUd2QixTQUFTLEdBQVksRUFBTyxDQUN4QixPQUFRLEVBQVIsQ0FDSSxJQUFBLElBQ0ksTUFBTyxRQUNYLElBQUEsSUFDSSxNQUFPLFFBQ1gsSUFBQSxJQUNJLE1BQU8sYUFDWCxJQUFBLElBQ0ksTUFBTyxXQUNYLFFBQ0ksT0FBTyxLQUFLLFVBQVUsQ0FBSyxDQUNuQyxDQUNKLENBRUEsU0FBUyxHQUFVLEVBQVEsQ0FDdkIsT0FBUSxFQUFSLENBQ0ksSUFBQSxJQUNJLE1BQU8sa0JBQ1gsSUFBQSxJQUNJLE1BQU8sV0FDWCxJQUFBLElBQ0ksTUFBTyxpQkFDWCxJQUFBLElBQ0ksTUFBTyxTQUNYLElBQUssTUFDRCxNQUFPLFlBQ1gsSUFBSyxNQUNELE1BQU8sVUFDWCxJQUFLLEdBQ0wsSUFBSztFQUNMLElBQUs7RUFDRCxNQUFPLFVBQ1gsSUFBSyxJQUNELE1BQU8sZUFDWCxJQUFLLElBQ0QsTUFBTyxtQkFDWCxJQUFLLElBQ0QsTUFBTyxnQkFDWCxJQUFLLElBQ0QsTUFBTyxpQkFDWCxJQUFLLElBQ0QsTUFBTyxlQUNYLElBQUssSUFDRCxNQUFPLGlCQUNYLElBQUssSUFDRCxNQUFPLGVBQ1gsSUFBSyxJQUNELE1BQU8sT0FDZixDQUNBLE9BQVEsRUFBTyxHQUFmLENBQ0ksSUFBSyxJQUNMLElBQUssSUFDRCxNQUFPLFFBQ1gsSUFBSyxJQUNELE1BQU8sVUFDWCxJQUFLLElBQ0QsTUFBTyxpQkFDWCxJQUFLLElBQ0QsTUFBTyxRQUNYLElBQUssSUFDRCxNQUFPLFNBQ1gsSUFBSyxJQUNELE1BQU8sTUFDWCxJQUFLLElBQ0QsTUFBTyx1QkFDWCxJQUFLLElBQ0QsTUFBTyx1QkFDWCxJQUFLLElBQ0wsSUFBSyxJQUNELE1BQU8scUJBQ2YsQ0FDQSxPQUFPLElBQ1gsQ0MxQkEsU0FBUyxFQUFRLEVBQUksQ0FDakIsT0FBUSxFQUFSLENBQ0ksS0FBSyxJQUFBLEdBQ0wsSUFBSyxJQUNMLElBQUs7RUFDTCxJQUFLLEtBQ0wsSUFBSyxJQUNELE1BQU8sR0FDWCxRQUNJLE1BQU8sRUFDZixDQUNKLENBQ0EsTUFBTSxHQUFZLElBQUksSUFBSSx3QkFBd0IsRUFDNUMsR0FBVyxJQUFJLElBQUksbUZBQW1GLEVBQ3RHLEdBQXFCLElBQUksSUFBSSxPQUFPLEVBQ3BDLEdBQXFCLElBQUksSUFBSTtJQUFjLEVBQzNDLEdBQW1CLEdBQU8sQ0FBQyxHQUFNLEdBQW1CLElBQUksQ0FBRSxFQWdCaEUsSUFBTSxHQUFOLEtBQVksQ0FDUixhQUFjLENBS1YsS0FBSyxNQUFRLEdBTWIsS0FBSyxrQkFBb0IsR0FNekIsS0FBSyxnQkFBa0IsR0FFdkIsS0FBSyxPQUFTLEdBS2QsS0FBSyxRQUFVLEdBRWYsS0FBSyxVQUFZLEVBS2pCLEtBQUssV0FBYSxFQUVsQixLQUFLLFlBQWMsRUFFbkIsS0FBSyxXQUFhLEtBRWxCLEtBQUssS0FBTyxLQUVaLEtBQUssSUFBTSxDQUNmLENBT0EsQ0FBQyxJQUFJLEVBQVEsRUFBYSxHQUFPLENBQzdCLEdBQUksRUFBUSxDQUNSLEdBQUksT0FBTyxHQUFXLFNBQ2xCLE1BQU0sVUFBVSx3QkFBd0IsRUFDNUMsS0FBSyxPQUFTLEtBQUssT0FBUyxLQUFLLE9BQVMsRUFBUyxFQUNuRCxLQUFLLFdBQWEsSUFDdEIsQ0FDQSxLQUFLLE1BQVEsQ0FBQyxFQUNkLElBQUksRUFBTyxLQUFLLE1BQVEsU0FDeEIsS0FBTyxJQUFTLEdBQWMsS0FBSyxTQUFTLENBQUMsSUFDekMsRUFBTyxNQUFPLEtBQUssVUFBVSxDQUFJLENBQ3pDLENBQ0EsV0FBWSxDQUNSLElBQUksRUFBSSxLQUFLLElBQ1QsRUFBSyxLQUFLLE9BQU8sR0FDckIsS0FBTyxJQUFPLEtBQU8sSUFBTyxLQUN4QixFQUFLLEtBQUssT0FBTyxFQUFFLEdBS3ZCLE1BSkksQ0FBQyxHQUFNLElBQU8sS0FBTyxJQUFPO0dBRTVCLElBQU8sTUFDQSxLQUFLLE9BQU8sRUFBSSxLQUFPO0NBRXRDLENBQ0EsT0FBTyxFQUFHLENBQ04sT0FBTyxLQUFLLE9BQU8sS0FBSyxJQUFNLEVBQ2xDLENBQ0EsZUFBZSxFQUFRLENBQ25CLElBQUksRUFBSyxLQUFLLE9BQU8sR0FDckIsR0FBSSxLQUFLLFdBQWEsRUFBRyxDQUNyQixJQUFJLEVBQVMsRUFDYixLQUFPLElBQU8sS0FDVixFQUFLLEtBQUssT0FBTyxFQUFFLEVBQVMsR0FDaEMsR0FBSSxJQUFPLEtBQU0sQ0FDYixJQUFNLEVBQU8sS0FBSyxPQUFPLEVBQVMsRUFBUyxHQUMzQyxHQUFJLElBQVM7R0FBUyxDQUFDLEdBQVEsQ0FBQyxLQUFLLE1BQ2pDLE9BQU8sRUFBUyxFQUFTLENBQ2pDLENBQ0EsT0FBTyxJQUFPO0dBQVEsR0FBVSxLQUFLLFlBQWUsQ0FBQyxHQUFNLENBQUMsS0FBSyxNQUMzRCxFQUFTLEVBQ1QsRUFDVixDQUNBLEdBQUksSUFBTyxLQUFPLElBQU8sSUFBSyxDQUMxQixJQUFNLEVBQUssS0FBSyxPQUFPLE9BQU8sRUFBUSxDQUFDLEVBQ3ZDLElBQUssSUFBTyxPQUFTLElBQU8sUUFBVSxFQUFRLEtBQUssT0FBTyxFQUFTLEVBQUUsRUFDakUsTUFBTyxFQUNmLENBQ0EsT0FBTyxDQUNYLENBQ0EsU0FBVSxDQUNOLElBQUksRUFBTSxLQUFLLFdBU2YsT0FSSSxPQUFPLEdBQVEsVUFBYSxJQUFRLElBQU0sRUFBTSxLQUFLLE9BQ3JELEVBQU0sS0FBSyxPQUFPLFFBQVE7RUFBTSxLQUFLLEdBQUcsRUFDeEMsS0FBSyxXQUFhLEdBRWxCLElBQVEsR0FDRCxLQUFLLE1BQVEsS0FBSyxPQUFPLFVBQVUsS0FBSyxHQUFHLEVBQUksTUFDdEQsS0FBSyxPQUFPLEVBQU0sS0FBTyxNQUN6QixJQUNHLEtBQUssT0FBTyxVQUFVLEtBQUssSUFBSyxDQUFHLEVBQzlDLENBQ0EsU0FBUyxFQUFHLENBQ1IsT0FBTyxLQUFLLElBQU0sR0FBSyxLQUFLLE9BQU8sTUFDdkMsQ0FDQSxRQUFRLEVBQU8sQ0FLWCxNQUpBLE1BQUssT0FBUyxLQUFLLE9BQU8sVUFBVSxLQUFLLEdBQUcsRUFDNUMsS0FBSyxJQUFNLEVBQ1gsS0FBSyxXQUFhLEtBQ2xCLEtBQUssS0FBTyxFQUNMLElBQ1gsQ0FDQSxLQUFLLEVBQUcsQ0FDSixPQUFPLEtBQUssT0FBTyxPQUFPLEtBQUssSUFBSyxDQUFDLENBQ3pDLENBQ0EsQ0FBQyxVQUFVLEVBQU0sQ0FDYixPQUFRLEVBQVIsQ0FDSSxJQUFLLFNBQ0QsT0FBTyxNQUFPLEtBQUssWUFBWSxFQUNuQyxJQUFLLGFBQ0QsT0FBTyxNQUFPLEtBQUssZUFBZSxFQUN0QyxJQUFLLGNBQ0QsT0FBTyxNQUFPLEtBQUssZ0JBQWdCLEVBQ3ZDLElBQUssTUFDRCxPQUFPLE1BQU8sS0FBSyxjQUFjLEVBQ3JDLElBQUssT0FDRCxPQUFPLE1BQU8sS0FBSyxvQkFBb0IsRUFDM0MsSUFBSyxnQkFDRCxPQUFPLE1BQU8sS0FBSyxrQkFBa0IsRUFDekMsSUFBSyxlQUNELE9BQU8sTUFBTyxLQUFLLGlCQUFpQixFQUN4QyxJQUFLLGVBQ0QsT0FBTyxNQUFPLEtBQUssaUJBQWlCLENBQzVDLENBQ0osQ0FDQSxDQUFDLGFBQWMsQ0FDWCxJQUFJLEVBQU8sS0FBSyxRQUFRLEVBQ3hCLEdBQUksSUFBUyxLQUNULE9BQU8sS0FBSyxRQUFRLFFBQVEsRUFLaEMsR0FKSSxFQUFLLEtBQUEsTUFDTCxNQUFPLEtBQUssVUFBVSxDQUFDLEVBQ3ZCLEVBQU8sRUFBSyxVQUFVLENBQUMsR0FFdkIsRUFBSyxLQUFPLElBQUssQ0FDakIsSUFBSSxFQUFTLEVBQUssT0FDZCxFQUFLLEVBQUssUUFBUSxHQUFHLEVBQ3pCLEtBQU8sSUFBTyxJQUFJLENBQ2QsSUFBTSxFQUFLLEVBQUssRUFBSyxHQUNyQixHQUFJLElBQU8sS0FBTyxJQUFPLElBQU0sQ0FDM0IsRUFBUyxFQUFLLEVBQ2QsS0FDSixDQUVJLEVBQUssRUFBSyxRQUFRLElBQUssRUFBSyxDQUFDLENBRXJDLENBQ0EsT0FBYSxDQUNULElBQU0sRUFBSyxFQUFLLEVBQVMsR0FDekIsR0FBSSxJQUFPLEtBQU8sSUFBTyxJQUNyQixTQUVBLEtBQ1IsQ0FDQSxJQUFNLEdBQUssTUFBTyxLQUFLLFVBQVUsQ0FBTSxJQUFNLE1BQU8sS0FBSyxXQUFXLEVBQUksR0FHeEUsT0FGQSxNQUFPLEtBQUssVUFBVSxFQUFLLE9BQVMsQ0FBQyxFQUNyQyxLQUFLLFlBQVksRUFDVixRQUNYLENBQ0EsR0FBSSxLQUFLLFVBQVUsRUFBRyxDQUNsQixJQUFNLEVBQUssTUFBTyxLQUFLLFdBQVcsRUFBSSxFQUd0QyxPQUZBLE1BQU8sS0FBSyxVQUFVLEVBQUssT0FBUyxDQUFFLEVBQ3RDLE1BQU8sS0FBSyxZQUFZLEVBQ2pCLFFBQ1gsQ0FFQSxPQURBLEtBQUEsSUFDTyxNQUFPLEtBQUssZUFBZSxDQUN0QyxDQUNBLENBQUMsZ0JBQWlCLENBQ2QsSUFBTSxFQUFLLEtBQUssT0FBTyxDQUFDLEVBQ3hCLEdBQUksQ0FBQyxHQUFNLENBQUMsS0FBSyxNQUNiLE9BQU8sS0FBSyxRQUFRLFlBQVksRUFDcEMsR0FBSSxJQUFPLEtBQU8sSUFBTyxJQUFLLENBQzFCLEdBQUksQ0FBQyxLQUFLLE9BQVMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxFQUMvQixPQUFPLEtBQUssUUFBUSxZQUFZLEVBQ3BDLElBQU0sRUFBSSxLQUFLLEtBQUssQ0FBQyxFQUNyQixJQUFLLElBQU0sT0FBUyxJQUFNLFFBQVUsRUFBUSxLQUFLLE9BQU8sQ0FBQyxDQUFDLEVBSXRELE9BSEEsTUFBTyxLQUFLLFVBQVUsQ0FBQyxFQUN2QixLQUFLLFlBQWMsRUFDbkIsS0FBSyxXQUFhLEVBQ1gsSUFBTSxNQUFRLE1BQVEsUUFFckMsQ0FJQSxNQUhBLE1BQUssWUFBYyxNQUFPLEtBQUssV0FBVyxFQUFLLEVBQzNDLEtBQUssV0FBYSxLQUFLLGFBQWUsQ0FBQyxFQUFRLEtBQUssT0FBTyxDQUFDLENBQUMsSUFDN0QsS0FBSyxXQUFhLEtBQUssYUFDcEIsTUFBTyxLQUFLLGdCQUFnQixDQUN2QyxDQUNBLENBQUMsaUJBQWtCLENBQ2YsR0FBTSxDQUFDLEVBQUssR0FBTyxLQUFLLEtBQUssQ0FBQyxFQUM5QixHQUFJLENBQUMsR0FBTyxDQUFDLEtBQUssTUFDZCxPQUFPLEtBQUssUUFBUSxhQUFhLEVBQ3JDLElBQUssSUFBUSxLQUFPLElBQVEsS0FBTyxJQUFRLE1BQVEsRUFBUSxDQUFHLEVBQUcsQ0FDN0QsSUFBTSxHQUFLLE1BQU8sS0FBSyxVQUFVLENBQUMsSUFBTSxNQUFPLEtBQUssV0FBVyxFQUFJLEdBR25FLE1BRkEsTUFBSyxXQUFhLEtBQUssWUFBYyxFQUNyQyxLQUFLLGFBQWUsRUFDYixhQUNYLENBQ0EsTUFBTyxLQUNYLENBQ0EsQ0FBQyxlQUFnQixDQUNiLE1BQU8sS0FBSyxXQUFXLEVBQUksRUFDM0IsSUFBTSxFQUFPLEtBQUssUUFBUSxFQUMxQixHQUFJLElBQVMsS0FDVCxPQUFPLEtBQUssUUFBUSxLQUFLLEVBQzdCLElBQUksRUFBSSxNQUFPLEtBQUssZUFBZSxFQUNuQyxPQUFRLEVBQUssR0FBYixDQUNJLElBQUssSUFDRCxNQUFPLEtBQUssVUFBVSxFQUFLLE9BQVMsQ0FBQyxFQUV6QyxLQUFLLElBQUEsR0FFRCxPQURBLE1BQU8sS0FBSyxZQUFZLEVBQ2pCLE1BQU8sS0FBSyxlQUFlLEVBQ3RDLElBQUssSUFDTCxJQUFLLElBSUQsT0FIQSxNQUFPLEtBQUssVUFBVSxDQUFDLEVBQ3ZCLEtBQUssUUFBVSxHQUNmLEtBQUssVUFBWSxFQUNWLE9BQ1gsSUFBSyxJQUNMLElBQUssSUFHRCxPQURBLE1BQU8sS0FBSyxVQUFVLENBQUMsRUFDaEIsTUFDWCxJQUFLLElBRUQsT0FEQSxNQUFPLEtBQUssVUFBVSxFQUFlLEVBQzlCLE1BQ1gsSUFBSyxJQUNMLElBQUssSUFDRCxPQUFPLE1BQU8sS0FBSyxrQkFBa0IsRUFDekMsSUFBSyxJQUNMLElBQUssSUFLRCxNQUpBLElBQUssTUFBTyxLQUFLLHVCQUF1QixFQUN4QyxHQUFLLE1BQU8sS0FBSyxXQUFXLEVBQUksRUFDaEMsTUFBTyxLQUFLLFVBQVUsRUFBSyxPQUFTLENBQUMsRUFDckMsTUFBTyxLQUFLLFlBQVksRUFDakIsTUFBTyxLQUFLLGlCQUFpQixFQUN4QyxRQUNJLE9BQU8sTUFBTyxLQUFLLGlCQUFpQixDQUM1QyxDQUNKLENBQ0EsQ0FBQyxxQkFBc0IsQ0FDbkIsSUFBSSxFQUFJLEVBQ0osRUFBUyxHQUNiLEVBQ0ksR0FBSyxNQUFPLEtBQUssWUFBWSxFQUN6QixFQUFLLEdBQ0wsRUFBSyxNQUFPLEtBQUssV0FBVyxFQUFLLEVBQ2pDLEtBQUssWUFBYyxFQUFTLEdBRzVCLEVBQUssRUFFVCxHQUFNLE1BQU8sS0FBSyxXQUFXLEVBQUksUUFDNUIsRUFBSyxFQUFLLEdBQ25CLElBQU0sRUFBTyxLQUFLLFFBQVEsRUFDMUIsR0FBSSxJQUFTLEtBQ1QsT0FBTyxLQUFLLFFBQVEsTUFBTSxFQUM5QixJQUFLLElBQVcsSUFBTSxFQUFTLEtBQUssWUFBYyxFQUFLLEtBQU8sS0FDekQsSUFBVyxJQUNQLEVBQUssV0FBVyxLQUFLLEdBQUssRUFBSyxXQUFXLEtBQUssSUFDaEQsRUFBUSxFQUFLLEVBQUUsS0FJSyxJQUFXLEtBQUssV0FBYSxHQUNqRCxLQUFLLFlBQWMsR0FDbEIsRUFBSyxLQUFPLEtBQU8sRUFBSyxLQUFPLEtBS2hDLE1BRkEsTUFBSyxVQUFZLEVBQ2pCLEtBQUEsSUFDTyxNQUFPLEtBQUssZUFBZSxFQUcxQyxJQUFJLEVBQUksRUFDUixLQUFPLEVBQUssS0FBTyxLQUNmLEdBQUssTUFBTyxLQUFLLFVBQVUsQ0FBQyxFQUM1QixHQUFLLE1BQU8sS0FBSyxXQUFXLEVBQUksRUFDaEMsS0FBSyxRQUFVLEdBR25CLE9BREEsR0FBSyxNQUFPLEtBQUssZUFBZSxFQUN4QixFQUFLLEdBQWIsQ0FDSSxLQUFLLElBQUEsR0FDRCxNQUFPLE9BQ1gsSUFBSyxJQUVELE9BREEsTUFBTyxLQUFLLFVBQVUsRUFBSyxPQUFTLENBQUMsRUFDOUIsT0FDWCxJQUFLLElBQ0wsSUFBSyxJQUlELE9BSEEsTUFBTyxLQUFLLFVBQVUsQ0FBQyxFQUN2QixLQUFLLFFBQVUsR0FDZixLQUFLLFdBQWEsRUFDWCxPQUNYLElBQUssSUFDTCxJQUFLLElBSUQsT0FIQSxNQUFPLEtBQUssVUFBVSxDQUFDLEVBQ3ZCLEtBQUssUUFBVSxHQUNmLE9BQUssVUFDRSxLQUFLLFVBQVksT0FBUyxNQUNyQyxJQUFLLElBRUQsT0FEQSxNQUFPLEtBQUssVUFBVSxFQUFlLEVBQzlCLE9BQ1gsSUFBSyxJQUNMLElBQUssSUFFRCxNQURBLE1BQUssUUFBVSxHQUNSLE1BQU8sS0FBSyxrQkFBa0IsRUFDekMsSUFBSyxJQUFLLENBQ04sSUFBTSxFQUFPLEtBQUssT0FBTyxDQUFDLEVBQzFCLEdBQUksS0FBSyxTQUFXLEVBQVEsQ0FBSSxHQUFLLElBQVMsSUFJMUMsTUFIQSxNQUFLLFFBQVUsR0FDZixNQUFPLEtBQUssVUFBVSxDQUFDLEVBQ3ZCLE1BQU8sS0FBSyxXQUFXLEVBQUksRUFDcEIsTUFFZixDQUVBLFFBRUksTUFEQSxNQUFLLFFBQVUsR0FDUixNQUFPLEtBQUssaUJBQWlCLENBQzVDLENBQ0osQ0FDQSxDQUFDLG1CQUFvQixDQUNqQixJQUFNLEVBQVEsS0FBSyxPQUFPLENBQUMsRUFDdkIsRUFBTSxLQUFLLE9BQU8sUUFBUSxFQUFPLEtBQUssSUFBTSxDQUFDLEVBQ2pELEdBQUksSUFBVSxJQUNWLEtBQU8sSUFBUSxJQUFNLEtBQUssT0FBTyxFQUFNLEtBQU8sS0FDMUMsRUFBTSxLQUFLLE9BQU8sUUFBUSxJQUFLLEVBQU0sQ0FBQyxPQUkxQyxLQUFPLElBQVEsSUFBSSxDQUNmLElBQUksRUFBSSxFQUNSLEtBQU8sS0FBSyxPQUFPLEVBQU0sRUFBSSxLQUFPLE1BQ2hDLEdBQUssRUFDVCxHQUFJLEVBQUksR0FBTSxFQUNWLE1BQ0osRUFBTSxLQUFLLE9BQU8sUUFBUSxJQUFLLEVBQU0sQ0FBQyxDQUMxQyxDQUdKLElBQU0sRUFBSyxLQUFLLE9BQU8sVUFBVSxFQUFHLENBQUcsRUFDbkMsRUFBSyxFQUFHLFFBQVE7RUFBTSxLQUFLLEdBQUcsRUFDbEMsR0FBSSxJQUFPLEdBQUksQ0FDWCxLQUFPLElBQU8sSUFBSSxDQUNkLElBQU0sRUFBSyxLQUFLLGVBQWUsRUFBSyxDQUFDLEVBQ3JDLEdBQUksSUFBTyxHQUNQLE1BQ0osRUFBSyxFQUFHLFFBQVE7RUFBTSxDQUFFLENBQzVCLENBQ0ksSUFBTyxLQUVQLEVBQU0sR0FBTSxFQUFHLEVBQUssS0FBTyxLQUFPLEVBQUksR0FFOUMsQ0FDQSxHQUFJLElBQVEsR0FBSSxDQUNaLEdBQUksQ0FBQyxLQUFLLE1BQ04sT0FBTyxLQUFLLFFBQVEsZUFBZSxFQUN2QyxFQUFNLEtBQUssT0FBTyxNQUN0QixDQUVBLE9BREEsTUFBTyxLQUFLLFlBQVksRUFBTSxFQUFHLEVBQUssRUFDL0IsS0FBSyxVQUFZLE9BQVMsS0FDckMsQ0FDQSxDQUFDLHdCQUF5QixDQUN0QixLQUFLLGtCQUFvQixHQUN6QixLQUFLLGdCQUFrQixHQUN2QixJQUFJLEVBQUksS0FBSyxJQUNiLE9BQWEsQ0FDVCxJQUFNLEVBQUssS0FBSyxPQUFPLEVBQUUsR0FDekIsR0FBSSxJQUFPLElBQ1AsS0FBSyxnQkFBa0IsUUFDdEIsR0FBSSxFQUFLLEtBQU8sR0FBTSxJQUN2QixLQUFLLGtCQUFvQixPQUFPLENBQUUsRUFBSSxPQUNyQyxHQUFJLElBQU8sSUFDWixLQUNSLENBQ0EsT0FBTyxNQUFPLEtBQUssVUFBVSxHQUFNLEVBQVEsQ0FBRSxHQUFLLElBQU8sR0FBRyxDQUNoRSxDQUNBLENBQUMsa0JBQW1CLENBQ2hCLElBQUksRUFBSyxLQUFLLElBQU0sRUFDaEIsRUFBUyxFQUNULEVBQ0osS0FBTSxJQUFLLElBQUksRUFBSSxLQUFLLElBQU0sRUFBSyxLQUFLLE9BQU8sR0FBSyxFQUFFLEVBQ2xELE9BQVEsRUFBUixDQUNJLElBQUssSUFDRCxHQUFVLEVBQ1YsTUFDSixJQUFLO0VBQ0QsRUFBSyxFQUNMLEVBQVMsRUFDVCxNQUNKLElBQUssS0FBTSxDQUNQLElBQU0sRUFBTyxLQUFLLE9BQU8sRUFBSSxHQUM3QixHQUFJLENBQUMsR0FBUSxDQUFDLEtBQUssTUFDZixPQUFPLEtBQUssUUFBUSxjQUFjLEVBQ3RDLEdBQUksSUFBUztFQUNULEtBQ1IsQ0FDQSxRQUNJLE1BQU0sSUFDZCxDQUVKLEdBQUksQ0FBQyxHQUFNLENBQUMsS0FBSyxNQUNiLE9BQU8sS0FBSyxRQUFRLGNBQWMsRUFDdEMsR0FBSSxHQUFVLEtBQUssV0FBWSxDQUMzQixBQUdJLEtBQUssV0FITCxLQUFLLG9CQUFzQixHQUNULEVBR2QsS0FBSyxtQkFBcUIsS0FBSyxhQUFlLEVBQUksRUFBSSxLQUFLLFlBRW5FLEVBQUcsQ0FDQyxJQUFNLEVBQUssS0FBSyxlQUFlLEVBQUssQ0FBQyxFQUNyQyxHQUFJLElBQU8sR0FDUCxNQUNKLEVBQUssS0FBSyxPQUFPLFFBQVE7RUFBTSxDQUFFLENBQ3JDLE9BQVMsSUFBTyxJQUNoQixHQUFJLElBQU8sR0FBSSxDQUNYLEdBQUksQ0FBQyxLQUFLLE1BQ04sT0FBTyxLQUFLLFFBQVEsY0FBYyxFQUN0QyxFQUFLLEtBQUssT0FBTyxNQUNyQixDQUNKLENBR0EsSUFBSSxFQUFJLEVBQUssRUFFYixJQURBLEVBQUssS0FBSyxPQUFPLEdBQ1YsSUFBTyxLQUNWLEVBQUssS0FBSyxPQUFPLEVBQUUsR0FDdkIsR0FBSSxJQUFPLElBQU0sQ0FDYixLQUFPLElBQU8sS0FBUSxJQUFPLEtBQU8sSUFBTyxNQUFRLElBQU87R0FDdEQsRUFBSyxLQUFLLE9BQU8sRUFBRSxHQUN2QixFQUFLLEVBQUksQ0FDYixNQUNLLEdBQUksQ0FBQyxLQUFLLGdCQUNYLEVBQUcsQ0FDQyxJQUFJLEVBQUksRUFBSyxFQUNULEVBQUssS0FBSyxPQUFPLEdBQ2pCLElBQU8sT0FDUCxFQUFLLEtBQUssT0FBTyxFQUFFLElBQ3ZCLElBQU0sRUFBVyxFQUNqQixLQUFPLElBQU8sS0FDVixFQUFLLEtBQUssT0FBTyxFQUFFLEdBQ3ZCLEdBQUksSUFBTztHQUFRLEdBQUssS0FBSyxLQUFPLEVBQUksRUFBSSxFQUFTLEVBQ2pELEVBQUssT0FFTCxLQUNSLE9BQVMsR0FJYixPQUZBLEtBQUEsSUFDQSxNQUFPLEtBQUssWUFBWSxFQUFLLEVBQUcsRUFBSSxFQUM3QixNQUFPLEtBQUssZUFBZSxDQUN0QyxDQUNBLENBQUMsa0JBQW1CLENBQ2hCLElBQU0sRUFBUyxLQUFLLFVBQVksRUFDNUIsRUFBTSxLQUFLLElBQU0sRUFDakIsRUFBSSxLQUFLLElBQU0sRUFDZixFQUNKLEtBQVEsRUFBSyxLQUFLLE9BQU8sRUFBRSxJQUN2QixHQUFJLElBQU8sSUFBSyxDQUNaLElBQU0sRUFBTyxLQUFLLE9BQU8sRUFBSSxHQUM3QixHQUFJLEVBQVEsQ0FBSSxHQUFNLEdBQVUsR0FBbUIsSUFBSSxDQUFJLEVBQ3ZELE1BQ0osRUFBTSxDQUNWLE1BQ0ssR0FBSSxFQUFRLENBQUUsRUFBRyxDQUNsQixJQUFJLEVBQU8sS0FBSyxPQUFPLEVBQUksR0FVM0IsR0FUSSxJQUFPLE9BQ0gsSUFBUztHQUNULEdBQUssRUFDTCxFQUFLO0VBQ0wsRUFBTyxLQUFLLE9BQU8sRUFBSSxJQUd2QixFQUFNLEdBRVYsSUFBUyxLQUFRLEdBQVUsR0FBbUIsSUFBSSxDQUFJLEVBQ3RELE1BQ0osR0FBSSxJQUFPO0VBQU0sQ0FDYixJQUFNLEVBQUssS0FBSyxlQUFlLEVBQUksQ0FBQyxFQUNwQyxHQUFJLElBQU8sR0FDUCxNQUNKLEVBQUksS0FBSyxJQUFJLEVBQUcsRUFBSyxDQUFDLENBQzFCLENBQ0osS0FDSyxDQUNELEdBQUksR0FBVSxHQUFtQixJQUFJLENBQUUsRUFDbkMsTUFDSixFQUFNLENBQ1YsQ0FNSixNQUpJLENBQUMsR0FBTSxDQUFDLEtBQUssTUFDTixLQUFLLFFBQVEsY0FBYyxHQUN0QyxLQUFBLElBQ0EsTUFBTyxLQUFLLFlBQVksRUFBTSxFQUFHLEVBQUksRUFDOUIsRUFBUyxPQUFTLE1BQzdCLENBQ0EsQ0FBQyxVQUFVLEVBQUcsQ0FNVixPQUxJLEVBQUksR0FDSixNQUFNLEtBQUssT0FBTyxPQUFPLEtBQUssSUFBSyxDQUFDLEVBQ3BDLEtBQUssS0FBTyxFQUNMLEdBRUosQ0FDWCxDQUNBLENBQUMsWUFBWSxFQUFHLEVBQVksQ0FDeEIsSUFBTSxFQUFJLEtBQUssT0FBTyxNQUFNLEtBQUssSUFBSyxDQUFDLEVBUXZDLE9BUEksR0FDQSxNQUFNLEVBQ04sS0FBSyxLQUFPLEVBQUUsT0FDUCxFQUFFLFNBRUosSUFDTCxLQUFNLElBQ0gsRUFDWCxDQUNBLENBQUMsZ0JBQWlCLENBQ2QsSUFBSSxFQUFJLEVBQ1IsS0FBTSxPQUFhLENBQ2YsT0FBUSxLQUFLLE9BQU8sQ0FBQyxFQUFyQixDQUNJLElBQUssSUFDRCxHQUFLLE1BQU8sS0FBSyxRQUFRLEVBQ3pCLEdBQUssTUFBTyxLQUFLLFdBQVcsRUFBSSxFQUNoQyxTQUFTLEtBQ2IsSUFBSyxJQUNELEdBQUssTUFBTyxLQUFLLFVBQVUsRUFBZSxFQUMxQyxHQUFLLE1BQU8sS0FBSyxXQUFXLEVBQUksRUFDaEMsU0FBUyxLQUNiLElBQUssSUFDTCxJQUFLLElBQ0wsSUFBSyxJQUFLLENBQ04sSUFBTSxFQUFTLEtBQUssVUFBWSxFQUMxQixFQUFNLEtBQUssT0FBTyxDQUFDLEVBQ3pCLEdBQUksRUFBUSxDQUFHLEdBQU0sR0FBVSxHQUFtQixJQUFJLENBQUcsRUFBSSxDQUNwRCxFQUVBLEFBQ0QsS0FBSyxVQUFVLEdBRmYsS0FBSyxXQUFhLEtBQUssWUFBYyxFQUd6QyxHQUFLLE1BQU8sS0FBSyxVQUFVLENBQUMsRUFDNUIsR0FBSyxNQUFPLEtBQUssV0FBVyxFQUFJLEVBQ2hDLFNBQVMsSUFDYixDQUNKLENBQ0osQ0FDQSxNQUFNLElBQ1YsQ0FDQSxPQUFPLENBQ1gsQ0FDQSxDQUFDLFNBQVUsQ0FDUCxHQUFJLEtBQUssT0FBTyxDQUFDLElBQU0sSUFBSyxDQUN4QixJQUFJLEVBQUksS0FBSyxJQUFNLEVBQ2YsRUFBSyxLQUFLLE9BQU8sR0FDckIsS0FBTyxDQUFDLEVBQVEsQ0FBRSxHQUFLLElBQU8sS0FDMUIsRUFBSyxLQUFLLE9BQU8sRUFBRSxHQUN2QixPQUFPLE1BQU8sS0FBSyxZQUFZLElBQU8sSUFBTSxFQUFJLEVBQUksRUFBRyxFQUFLLENBQ2hFLENBQ0ssQ0FDRCxJQUFJLEVBQUksS0FBSyxJQUFNLEVBQ2YsRUFBSyxLQUFLLE9BQU8sR0FDckIsS0FBTyxHQUNILEdBQUksR0FBUyxJQUFJLENBQUUsRUFDZixFQUFLLEtBQUssT0FBTyxFQUFFLFFBQ2xCLEdBQUksSUFBTyxLQUNaLEdBQVUsSUFBSSxLQUFLLE9BQU8sRUFBSSxFQUFFLEdBQ2hDLEdBQVUsSUFBSSxLQUFLLE9BQU8sRUFBSSxFQUFFLEVBQ2hDLEVBQUssS0FBSyxPQUFRLEdBQUssUUFHdkIsTUFFUixPQUFPLE1BQU8sS0FBSyxZQUFZLEVBQUcsRUFBSyxDQUMzQyxDQUNKLENBQ0EsQ0FBQyxhQUFjLENBQ1gsSUFBTSxFQUFLLEtBQUssT0FBTyxLQUFLLEtBTXhCLE9BTEEsSUFBTztFQUNBLE1BQU8sS0FBSyxVQUFVLENBQUMsRUFDekIsSUFBTyxNQUFRLEtBQUssT0FBTyxDQUFDLElBQU07RUFDaEMsTUFBTyxLQUFLLFVBQVUsQ0FBQyxFQUV2QixDQUNmLENBQ0EsQ0FBQyxXQUFXLEVBQVcsQ0FDbkIsSUFBSSxFQUFJLEtBQUssSUFBTSxFQUNmLEVBQ0osRUFDSSxHQUFLLEtBQUssT0FBTyxFQUFFLFNBQ2QsSUFBTyxLQUFRLEdBQWEsSUFBTyxLQUM1QyxJQUFNLEVBQUksRUFBSSxLQUFLLElBS25CLE9BSkksRUFBSSxJQUNKLE1BQU0sS0FBSyxPQUFPLE9BQU8sS0FBSyxJQUFLLENBQUMsRUFDcEMsS0FBSyxJQUFNLEdBRVIsQ0FDWCxDQUNBLENBQUMsVUFBVSxFQUFNLENBQ2IsSUFBSSxFQUFJLEtBQUssSUFDVCxFQUFLLEtBQUssT0FBTyxHQUNyQixLQUFPLENBQUMsRUFBSyxDQUFFLEdBQ1gsRUFBSyxLQUFLLE9BQU8sRUFBRSxHQUN2QixPQUFPLE1BQU8sS0FBSyxZQUFZLEVBQUcsRUFBSyxDQUMzQyxDQUNKLEVDenNCTSxHQUFOLEtBQWtCLENBQ2QsYUFBYyxDQUNWLEtBQUssV0FBYSxDQUFDLEVBS25CLEtBQUssV0FBYyxHQUFXLEtBQUssV0FBVyxLQUFLLENBQU0sRUFNekQsS0FBSyxRQUFXLEdBQVcsQ0FDdkIsSUFBSSxFQUFNLEVBQ04sRUFBTyxLQUFLLFdBQVcsT0FDM0IsS0FBTyxFQUFNLEdBQU0sQ0FDZixJQUFNLEVBQU8sRUFBTSxHQUFTLEVBQ3hCLEtBQUssV0FBVyxHQUFPLEVBQ3ZCLEVBQU0sRUFBTSxFQUVaLEVBQU8sQ0FDZixDQUNBLEdBQUksS0FBSyxXQUFXLEtBQVMsRUFDekIsTUFBTyxDQUFFLEtBQU0sRUFBTSxFQUFHLElBQUssQ0FBRSxFQUNuQyxHQUFJLElBQVEsRUFDUixNQUFPLENBQUUsS0FBTSxFQUFHLElBQUssQ0FBTyxFQUNsQyxJQUFNLEVBQVEsS0FBSyxXQUFXLEVBQU0sR0FDcEMsTUFBTyxDQUFFLEtBQU0sRUFBSyxJQUFLLEVBQVMsRUFBUSxDQUFFLENBQ2hELENBQ0osQ0FDSixFQ2pDQSxTQUFTLEVBQWMsRUFBTSxFQUFNLENBQy9CLElBQUssSUFBSSxFQUFJLEVBQUcsRUFBSSxFQUFLLE9BQVEsRUFBRSxFQUMvQixHQUFJLEVBQUssRUFBRSxDQUFDLE9BQVMsRUFDakIsTUFBTyxHQUNmLE1BQU8sRUFDWCxDQUNBLFNBQVMsR0FBa0IsRUFBTSxDQUM3QixJQUFLLElBQUksRUFBSSxFQUFHLEVBQUksRUFBSyxPQUFRLEVBQUUsRUFDL0IsT0FBUSxFQUFLLEVBQUUsQ0FBQyxLQUFoQixDQUNJLElBQUssUUFDTCxJQUFLLFVBQ0wsSUFBSyxVQUNELE1BQ0osUUFDSSxPQUFPLENBQ2YsQ0FFSixNQUFPLEVBQ1gsQ0FDQSxTQUFTLEdBQVksRUFBTyxDQUN4QixPQUFRLEdBQU8sS0FBZixDQUNJLElBQUssUUFDTCxJQUFLLFNBQ0wsSUFBSyx1QkFDTCxJQUFLLHVCQUNMLElBQUssa0JBQ0QsTUFBTyxHQUNYLFFBQ0ksTUFBTyxFQUNmLENBQ0osQ0FDQSxTQUFTLEdBQWEsRUFBUSxDQUMxQixPQUFRLEVBQU8sS0FBZixDQUNJLElBQUssV0FDRCxPQUFPLEVBQU8sTUFDbEIsSUFBSyxZQUFhLENBQ2QsSUFBTSxFQUFLLEVBQU8sTUFBTSxFQUFPLE1BQU0sT0FBUyxHQUM5QyxPQUFPLEVBQUcsS0FBTyxFQUFHLEtBQ3hCLENBQ0EsSUFBSyxZQUNELE9BQU8sRUFBTyxNQUFNLEVBQU8sTUFBTSxPQUFTLEVBQUUsQ0FBQyxNQUVqRCxRQUNJLE1BQU8sQ0FBQyxDQUNoQixDQUNKLENBRUEsU0FBUyxFQUFzQixFQUFNLENBQ2pDLEdBQUksRUFBSyxTQUFXLEVBQ2hCLE1BQU8sQ0FBQyxFQUNaLElBQUksRUFBSSxFQUFLLE9BQ2IsS0FBTSxLQUFPLEVBQUUsR0FBSyxHQUNoQixPQUFRLEVBQUssRUFBRSxDQUFDLEtBQWhCLENBQ0ksSUFBSyxZQUNMLElBQUssbUJBQ0wsSUFBSyxnQkFDTCxJQUFLLGVBQ0wsSUFBSyxVQUNELE1BQU0sSUFDZCxDQUVKLEtBQU8sRUFBSyxFQUFFLEVBQUUsRUFBRSxPQUFTLFVBRzNCLE9BQU8sRUFBSyxPQUFPLEVBQUcsRUFBSyxNQUFNLENBQ3JDLENBQ0EsU0FBUyxHQUFlLEVBQVEsRUFBUSxDQUVwQyxHQUFJLEVBQU8sT0FBUyxJQUNoQixNQUFNLFVBQVUsS0FBSyxNQUFNLEVBQVEsQ0FBTSxPQUV6QyxJQUFLLElBQUksRUFBSSxFQUFHLEVBQUksRUFBTyxPQUFRLEVBQUUsRUFDakMsRUFBTyxLQUFLLEVBQU8sRUFBRSxDQUNqQyxDQUNBLFNBQVMsR0FBZ0IsRUFBSSxDQUN6QixHQUFJLEVBQUcsTUFBTSxPQUFTLGlCQUNiLElBQUEsSUFBTSxLQUFNLEVBQUcsTUFDWixFQUFHLEtBQ0gsQ0FBQyxFQUFHLE9BQ0osQ0FBQyxFQUFjLEVBQUcsTUFBTyxrQkFBa0IsR0FDM0MsQ0FBQyxFQUFjLEVBQUcsSUFBSyxlQUFlLElBQ2xDLEVBQUcsTUFDSCxFQUFHLE1BQVEsRUFBRyxLQUNsQixPQUFPLEVBQUcsSUFDTixHQUFZLEVBQUcsS0FBSyxFQUNoQixFQUFHLE1BQU0sSUFDVCxHQUFlLEVBQUcsTUFBTSxJQUFLLEVBQUcsR0FBRyxFQUVuQyxFQUFHLE1BQU0sSUFBTSxFQUFHLElBR3RCLEdBQWUsRUFBRyxNQUFPLEVBQUcsR0FBRyxFQUNuQyxPQUFPLEVBQUcsSUFJMUIsQ0E0QkEsSUFBTSxHQUFOLEtBQWEsQ0FLVCxZQUFZLEVBQVcsQ0FFbkIsS0FBSyxVQUFZLEdBRWpCLEtBQUssU0FBVyxHQUVoQixLQUFLLE9BQVMsRUFFZCxLQUFLLE9BQVMsRUFFZCxLQUFLLFVBQVksR0FFakIsS0FBSyxNQUFRLENBQUMsRUFFZCxLQUFLLE9BQVMsR0FFZCxLQUFLLEtBQU8sR0FFWixLQUFLLE1BQVEsSUFBSSxHQUNqQixLQUFLLFVBQVksQ0FDckIsQ0FTQSxDQUFDLE1BQU0sRUFBUSxFQUFhLEdBQU8sQ0FDM0IsS0FBSyxXQUFhLEtBQUssU0FBVyxHQUNsQyxLQUFLLFVBQVUsQ0FBQyxFQUNwQixJQUFLLElBQU0sS0FBVSxLQUFLLE1BQU0sSUFBSSxFQUFRLENBQVUsRUFDbEQsTUFBTyxLQUFLLEtBQUssQ0FBTSxFQUN0QixJQUNELE1BQU8sS0FBSyxJQUFJLEVBQ3hCLENBSUEsQ0FBQyxLQUFLLEVBQVEsQ0FFVixHQURBLEtBQUssT0FBUyxFQUNWLEtBQUssU0FBVSxDQUNmLEtBQUssU0FBVyxHQUNoQixNQUFPLEtBQUssS0FBSyxFQUNqQixLQUFLLFFBQVUsRUFBTyxPQUN0QixNQUNKLENBQ0EsSUFBTSxFQUFPLEdBQVUsQ0FBTSxFQUM3QixHQUFJLENBQUMsRUFBTSxDQUNQLElBQU0sRUFBVSxxQkFBcUIsSUFDckMsTUFBTyxLQUFLLElBQUksQ0FBRSxLQUFNLFFBQVMsT0FBUSxLQUFLLE9BQVEsVUFBUyxRQUFPLENBQUMsRUFDdkUsS0FBSyxRQUFVLEVBQU8sTUFDMUIsTUFDSyxHQUFJLElBQVMsU0FDZCxLQUFLLFVBQVksR0FDakIsS0FBSyxTQUFXLEdBQ2hCLEtBQUssS0FBTyxhQUVYLENBR0QsT0FGQSxLQUFLLEtBQU8sRUFDWixNQUFPLEtBQUssS0FBSyxFQUNULEVBQVIsQ0FDSSxJQUFLLFVBQ0QsS0FBSyxVQUFZLEdBQ2pCLEtBQUssT0FBUyxFQUNWLEtBQUssV0FDTCxLQUFLLFVBQVUsS0FBSyxPQUFTLEVBQU8sTUFBTSxFQUM5QyxNQUNKLElBQUssUUFDRyxLQUFLLFdBQWEsRUFBTyxLQUFPLE1BQ2hDLEtBQUssUUFBVSxFQUFPLFFBQzFCLE1BQ0osSUFBSyxtQkFDTCxJQUFLLGdCQUNMLElBQUssZUFDRyxLQUFLLFlBQ0wsS0FBSyxRQUFVLEVBQU8sUUFDMUIsTUFDSixJQUFLLFdBQ0wsSUFBSyxpQkFDRCxPQUNKLFFBQ0ksS0FBSyxVQUFZLEVBQ3pCLENBQ0EsS0FBSyxRQUFVLEVBQU8sTUFDMUIsQ0FDSixDQUVBLENBQUMsS0FBTSxDQUNILEtBQU8sS0FBSyxNQUFNLE9BQVMsR0FDdkIsTUFBTyxLQUFLLElBQUksQ0FDeEIsQ0FDQSxJQUFJLGFBQWMsQ0FPZCxNQUFPLENBTEgsS0FBTSxLQUFLLEtBQ1gsT0FBUSxLQUFLLE9BQ2IsT0FBUSxLQUFLLE9BQ2IsT0FBUSxLQUFLLE1BRVQsQ0FDWixDQUNBLENBQUMsTUFBTyxDQUNKLElBQU0sRUFBTSxLQUFLLEtBQUssQ0FBQyxFQUN2QixHQUFJLEtBQUssT0FBUyxXQUFhLEdBQUssT0FBUyxVQUFXLENBQ3BELEtBQU8sS0FBSyxNQUFNLE9BQVMsR0FDdkIsTUFBTyxLQUFLLElBQUksRUFDcEIsS0FBSyxNQUFNLEtBQUssQ0FDWixLQUFNLFVBQ04sT0FBUSxLQUFLLE9BQ2IsT0FBUSxLQUFLLE1BQ2pCLENBQUMsRUFDRCxNQUNKLENBQ0EsR0FBSSxDQUFDLEVBQ0QsT0FBTyxNQUFPLEtBQUssT0FBTyxFQUM5QixPQUFRLEVBQUksS0FBWixDQUNJLElBQUssV0FDRCxPQUFPLE1BQU8sS0FBSyxTQUFTLENBQUcsRUFDbkMsSUFBSyxRQUNMLElBQUssU0FDTCxJQUFLLHVCQUNMLElBQUssdUJBQ0QsT0FBTyxNQUFPLEtBQUssT0FBTyxDQUFHLEVBQ2pDLElBQUssZUFDRCxPQUFPLE1BQU8sS0FBSyxZQUFZLENBQUcsRUFDdEMsSUFBSyxZQUNELE9BQU8sTUFBTyxLQUFLLFNBQVMsQ0FBRyxFQUNuQyxJQUFLLFlBQ0QsT0FBTyxNQUFPLEtBQUssY0FBYyxDQUFHLEVBQ3hDLElBQUssa0JBQ0QsT0FBTyxNQUFPLEtBQUssZUFBZSxDQUFHLEVBQ3pDLElBQUssVUFDRCxPQUFPLE1BQU8sS0FBSyxZQUFZLENBQUcsQ0FDMUMsQ0FFQSxNQUFPLEtBQUssSUFBSSxDQUNwQixDQUNBLEtBQUssRUFBRyxDQUNKLE9BQU8sS0FBSyxNQUFNLEtBQUssTUFBTSxPQUFTLEVBQzFDLENBQ0EsQ0FBQyxJQUFJLEVBQU8sQ0FDUixJQUFNLEVBQVEsR0FBUyxLQUFLLE1BQU0sSUFBSSxFQUV0QyxHQUFJLENBQUMsRUFFRCxLQUFNLENBQUUsS0FBTSxRQUFTLE9BQVEsS0FBSyxPQUFRLE9BQVEsR0FBSSxRQUFBLDZCQUFRLE9BRS9ELEdBQUksS0FBSyxNQUFNLFNBQVcsRUFDM0IsTUFBTSxNQUVMLENBQ0QsSUFBTSxFQUFNLEtBQUssS0FBSyxDQUFDLEVBV3ZCLE9BVkksRUFBTSxPQUFTLGVBRWYsRUFBTSxPQUFTLFdBQVksRUFBTSxFQUFJLE9BQVMsRUFFekMsRUFBTSxPQUFTLG1CQUFxQixFQUFJLE9BQVMsYUFFdEQsRUFBTSxPQUFTLEdBRWYsRUFBTSxPQUFTLG1CQUNmLEdBQWdCLENBQUssRUFDakIsRUFBSSxLQUFaLENBQ0ksSUFBSyxXQUNELEVBQUksTUFBUSxFQUNaLE1BQ0osSUFBSyxlQUNELEVBQUksTUFBTSxLQUFLLENBQUssRUFDcEIsTUFDSixJQUFLLFlBQWEsQ0FDZCxJQUFNLEVBQUssRUFBSSxNQUFNLEVBQUksTUFBTSxPQUFTLEdBQ3hDLEdBQUksRUFBRyxNQUFPLENBQ1YsRUFBSSxNQUFNLEtBQUssQ0FBRSxNQUFPLENBQUMsRUFBRyxJQUFLLEVBQU8sSUFBSyxDQUFDLENBQUUsQ0FBQyxFQUNqRCxLQUFLLFVBQVksR0FDakIsTUFDSixDQUNLLEdBQUksRUFBRyxJQUNSLEVBQUcsTUFBUSxNQUVWLENBQ0QsT0FBTyxPQUFPLEVBQUksQ0FBRSxJQUFLLEVBQU8sSUFBSyxDQUFDLENBQUUsQ0FBQyxFQUN6QyxLQUFLLFVBQVksQ0FBQyxFQUFHLFlBQ3JCLE1BQ0osQ0FDQSxLQUNKLENBQ0EsSUFBSyxZQUFhLENBQ2QsSUFBTSxFQUFLLEVBQUksTUFBTSxFQUFJLE1BQU0sT0FBUyxHQUNwQyxFQUFHLE1BQ0gsRUFBSSxNQUFNLEtBQUssQ0FBRSxNQUFPLENBQUMsRUFBRyxNQUFPLENBQU0sQ0FBQyxFQUUxQyxFQUFHLE1BQVEsRUFDZixLQUNKLENBQ0EsSUFBSyxrQkFBbUIsQ0FDcEIsSUFBTSxFQUFLLEVBQUksTUFBTSxFQUFJLE1BQU0sT0FBUyxHQUNwQyxDQUFDLEdBQU0sRUFBRyxNQUNWLEVBQUksTUFBTSxLQUFLLENBQUUsTUFBTyxDQUFDLEVBQUcsSUFBSyxFQUFPLElBQUssQ0FBQyxDQUFFLENBQUMsRUFDNUMsRUFBRyxJQUNSLEVBQUcsTUFBUSxFQUVYLE9BQU8sT0FBTyxFQUFJLENBQUUsSUFBSyxFQUFPLElBQUssQ0FBQyxDQUFFLENBQUMsRUFDN0MsTUFDSixDQUVBLFFBQ0ksTUFBTyxLQUFLLElBQUksRUFDaEIsTUFBTyxLQUFLLElBQUksQ0FBSyxDQUM3QixDQUNBLElBQUssRUFBSSxPQUFTLFlBQ2QsRUFBSSxPQUFTLGFBQ2IsRUFBSSxPQUFTLGVBQ1osRUFBTSxPQUFTLGFBQWUsRUFBTSxPQUFTLGFBQWMsQ0FDNUQsSUFBTSxFQUFPLEVBQU0sTUFBTSxFQUFNLE1BQU0sT0FBUyxHQUMxQyxHQUNBLENBQUMsRUFBSyxLQUNOLENBQUMsRUFBSyxPQUNOLEVBQUssTUFBTSxPQUFTLEdBQ3BCLEdBQWtCLEVBQUssS0FBSyxJQUFNLEtBQ2pDLEVBQU0sU0FBVyxHQUNkLEVBQUssTUFBTSxNQUFNLEdBQU0sRUFBRyxPQUFTLFdBQWEsRUFBRyxPQUFTLEVBQU0sTUFBTSxLQUN4RSxFQUFJLE9BQVMsV0FDYixFQUFJLElBQU0sRUFBSyxNQUVmLEVBQUksTUFBTSxLQUFLLENBQUUsTUFBTyxFQUFLLEtBQU0sQ0FBQyxFQUN4QyxFQUFNLE1BQU0sT0FBTyxHQUFJLENBQUMsRUFFaEMsQ0FDSixDQUNKLENBQ0EsQ0FBQyxRQUFTLENBQ04sT0FBUSxLQUFLLEtBQWIsQ0FDSSxJQUFLLGlCQUNELEtBQU0sQ0FBRSxLQUFNLFlBQWEsT0FBUSxLQUFLLE9BQVEsT0FBUSxLQUFLLE1BQU8sRUFDcEUsT0FDSixJQUFLLGtCQUNMLElBQUssUUFDTCxJQUFLLFVBQ0wsSUFBSyxVQUNELE1BQU0sS0FBSyxZQUNYLE9BQ0osSUFBSyxXQUNMLElBQUssWUFBYSxDQUNkLElBQU0sRUFBTSxDQUNSLEtBQU0sV0FDTixPQUFRLEtBQUssT0FDYixNQUFPLENBQUMsQ0FDWixFQUNJLEtBQUssT0FBUyxhQUNkLEVBQUksTUFBTSxLQUFLLEtBQUssV0FBVyxFQUNuQyxLQUFLLE1BQU0sS0FBSyxDQUFHLEVBQ25CLE1BQ0osQ0FDSixDQUNBLEtBQU0sQ0FDRixLQUFNLFFBQ04sT0FBUSxLQUFLLE9BQ2IsUUFBUyxjQUFjLEtBQUssS0FBSyx1QkFDakMsT0FBUSxLQUFLLE1BQ2pCLENBQ0osQ0FDQSxDQUFDLFNBQVMsRUFBSyxDQUNYLEdBQUksRUFBSSxNQUNKLE9BQU8sTUFBTyxLQUFLLFFBQVEsQ0FBRyxFQUNsQyxPQUFRLEtBQUssS0FBYixDQUNJLElBQUssWUFDRyxHQUFrQixFQUFJLEtBQUssSUFBTSxHQUtqQyxFQUFJLE1BQU0sS0FBSyxLQUFLLFdBQVcsR0FKL0IsTUFBTyxLQUFLLElBQUksRUFDaEIsTUFBTyxLQUFLLEtBQUssR0FJckIsT0FFSixJQUFLLFNBQ0wsSUFBSyxNQUNMLElBQUssUUFDTCxJQUFLLFVBQ0wsSUFBSyxVQUNELEVBQUksTUFBTSxLQUFLLEtBQUssV0FBVyxFQUMvQixNQUNSLENBQ0EsSUFBTSxFQUFLLEtBQUssZ0JBQWdCLENBQUcsRUFDL0IsRUFDQSxLQUFLLE1BQU0sS0FBSyxDQUFFLEVBRWxCLEtBQU0sQ0FDRixLQUFNLFFBQ04sT0FBUSxLQUFLLE9BQ2IsUUFBUyxjQUFjLEtBQUssS0FBSyx5QkFDakMsT0FBUSxLQUFLLE1BQ2pCLENBRVIsQ0FDQSxDQUFDLE9BQU8sRUFBUSxDQUNaLEdBQUksS0FBSyxPQUFTLGdCQUFpQixDQUUvQixJQUFNLEVBQVEsRUFERCxHQUFhLEtBQUssS0FBSyxDQUFDLENBQ0UsQ0FBQyxFQUNwQyxFQUNBLEVBQU8sS0FDUCxFQUFNLEVBQU8sSUFDYixFQUFJLEtBQUssS0FBSyxXQUFXLEVBQ3pCLE9BQU8sRUFBTyxLQUdkLEVBQU0sQ0FBQyxLQUFLLFdBQVcsRUFDM0IsSUFBTSxFQUFNLENBQ1IsS0FBTSxZQUNOLE9BQVEsRUFBTyxPQUNmLE9BQVEsRUFBTyxPQUNmLE1BQU8sQ0FBQyxDQUFFLFFBQU8sSUFBSyxFQUFRLEtBQUksQ0FBQyxDQUN2QyxFQUNBLEtBQUssVUFBWSxHQUNqQixLQUFLLE1BQU0sS0FBSyxNQUFNLE9BQVMsR0FBSyxDQUN4QyxNQUVJLE1BQU8sS0FBSyxRQUFRLENBQU0sQ0FDbEMsQ0FDQSxDQUFDLFlBQVksRUFBUSxDQUNqQixPQUFRLEtBQUssS0FBYixDQUNJLElBQUssUUFDTCxJQUFLLFVBQ0wsSUFBSyxVQUNELEVBQU8sTUFBTSxLQUFLLEtBQUssV0FBVyxFQUNsQyxPQUNKLElBQUssU0FLRCxHQUpBLEVBQU8sT0FBUyxLQUFLLE9BRXJCLEtBQUssVUFBWSxHQUNqQixLQUFLLE9BQVMsRUFDVixLQUFLLFVBQVcsQ0FDaEIsSUFBSSxFQUFLLEtBQUssT0FBTyxRQUFRO0NBQUksRUFBSSxFQUNyQyxLQUFPLElBQU8sR0FDVixLQUFLLFVBQVUsS0FBSyxPQUFTLENBQUUsRUFDL0IsRUFBSyxLQUFLLE9BQU8sUUFBUTtFQUFNLENBQUUsRUFBSSxDQUU3QyxDQUNBLE1BQU8sS0FBSyxJQUFJLEVBQ2hCLE1BRUosUUFDSSxNQUFPLEtBQUssSUFBSSxFQUNoQixNQUFPLEtBQUssS0FBSyxDQUN6QixDQUNKLENBQ0EsQ0FBQyxTQUFTLEVBQUssQ0FDWCxJQUFNLEVBQUssRUFBSSxNQUFNLEVBQUksTUFBTSxPQUFTLEdBRXhDLE9BQVEsS0FBSyxLQUFiLENBQ0ksSUFBSyxVQUVELEdBREEsS0FBSyxVQUFZLEdBQ2IsRUFBRyxNQUFPLENBQ1YsSUFBTSxFQUFNLFFBQVMsRUFBRyxNQUFRLEVBQUcsTUFBTSxJQUFNLElBQUEsSUFDbEMsTUFBTSxRQUFRLENBQUcsRUFBSSxFQUFJLEVBQUksT0FBUyxHQUFLLElBQUEsR0FBQSxFQUM5QyxPQUFTLFVBQ2YsR0FBSyxLQUFLLEtBQUssV0FBVyxFQUUxQixFQUFJLE1BQU0sS0FBSyxDQUFFLE1BQU8sQ0FBQyxLQUFLLFdBQVcsQ0FBRSxDQUFDLENBQ3BELE1BQ1MsRUFBRyxJQUNSLEVBQUcsSUFBSSxLQUFLLEtBQUssV0FBVyxFQUc1QixFQUFHLE1BQU0sS0FBSyxLQUFLLFdBQVcsRUFFbEMsT0FDSixJQUFLLFFBQ0wsSUFBSyxVQUNELEdBQUksRUFBRyxNQUNILEVBQUksTUFBTSxLQUFLLENBQUUsTUFBTyxDQUFDLEtBQUssV0FBVyxDQUFFLENBQUMsT0FFM0MsR0FBSSxFQUFHLElBQ1IsRUFBRyxJQUFJLEtBQUssS0FBSyxXQUFXLE1BRTNCLENBQ0QsR0FBSSxLQUFLLGtCQUFrQixFQUFHLE1BQU8sRUFBSSxNQUFNLEVBQUcsQ0FFOUMsSUFBTSxFQURPLEVBQUksTUFBTSxFQUFJLE1BQU0sT0FBUyxFQUMxQixFQUFFLE9BQU8sSUFDekIsR0FBSSxNQUFNLFFBQVEsQ0FBRyxFQUFHLENBQ3BCLEdBQWUsRUFBSyxFQUFHLEtBQUssRUFDNUIsRUFBSSxLQUFLLEtBQUssV0FBVyxFQUN6QixFQUFJLE1BQU0sSUFBSSxFQUNkLE1BQ0osQ0FDSixDQUNBLEVBQUcsTUFBTSxLQUFLLEtBQUssV0FBVyxDQUNsQyxDQUNBLE1BQ1IsQ0FDQSxHQUFJLEtBQUssUUFBVSxFQUFJLE9BQVEsQ0FDM0IsSUFBTSxFQUFjLENBQUMsS0FBSyxXQUFhLEtBQUssU0FBVyxFQUFJLE9BQ3JELEVBQWEsSUFDZCxFQUFHLEtBQU8sRUFBRyxjQUNkLEtBQUssT0FBUyxlQUVkLEVBQVEsQ0FBQyxFQUNiLEdBQUksR0FBYyxFQUFHLEtBQU8sQ0FBQyxFQUFHLE1BQU8sQ0FDbkMsSUFBTSxFQUFLLENBQUMsRUFDWixJQUFLLElBQUksRUFBSSxFQUFHLEVBQUksRUFBRyxJQUFJLE9BQVEsRUFBRSxFQUFHLENBQ3BDLElBQU0sRUFBSyxFQUFHLElBQUksR0FDbEIsT0FBUSxFQUFHLEtBQVgsQ0FDSSxJQUFLLFVBQ0QsRUFBRyxLQUFLLENBQUMsRUFDVCxNQUNKLElBQUssUUFDRCxNQUNKLElBQUssVUFDRyxFQUFHLE9BQVMsRUFBSSxTQUNoQixFQUFHLE9BQVMsR0FDaEIsTUFDSixRQUNJLEVBQUcsT0FBUyxDQUNwQixDQUNKLENBQ0ksRUFBRyxRQUFVLElBQ2IsRUFBUSxFQUFHLElBQUksT0FBTyxFQUFHLEVBQUUsRUFDbkMsQ0FDQSxPQUFRLEtBQUssS0FBYixDQUNJLElBQUssU0FDTCxJQUFLLE1BQ0csR0FBYyxFQUFHLE9BQ2pCLEVBQU0sS0FBSyxLQUFLLFdBQVcsRUFDM0IsRUFBSSxNQUFNLEtBQUssQ0FBRSxPQUFNLENBQUMsRUFDeEIsS0FBSyxVQUFZLElBRVosRUFBRyxJQUNSLEVBQUcsSUFBSSxLQUFLLEtBQUssV0FBVyxFQUc1QixFQUFHLE1BQU0sS0FBSyxLQUFLLFdBQVcsRUFFbEMsT0FDSixJQUFLLG1CQUNHLENBQUMsRUFBRyxLQUFPLENBQUMsRUFBRyxhQUNmLEVBQUcsTUFBTSxLQUFLLEtBQUssV0FBVyxFQUM5QixFQUFHLFlBQWMsSUFFWixHQUFjLEVBQUcsT0FDdEIsRUFBTSxLQUFLLEtBQUssV0FBVyxFQUMzQixFQUFJLE1BQU0sS0FBSyxDQUFFLFFBQU8sWUFBYSxFQUFLLENBQUMsR0FHM0MsS0FBSyxNQUFNLEtBQUssQ0FDWixLQUFNLFlBQ04sT0FBUSxLQUFLLE9BQ2IsT0FBUSxLQUFLLE9BQ2IsTUFBTyxDQUFDLENBQUUsTUFBTyxDQUFDLEtBQUssV0FBVyxFQUFHLFlBQWEsRUFBSyxDQUFDLENBQzVELENBQUMsRUFFTCxLQUFLLFVBQVksR0FDakIsT0FDSixJQUFLLGdCQUNELEdBQUksRUFBRyxZQUFhLENBQ2hCLEdBQUksQ0FBQyxFQUFHLElBQUssQ0FDVCxHQUFJLEVBQWMsRUFBRyxNQUFPLFNBQVMsRUFDakMsT0FBTyxPQUFPLEVBQUksQ0FBRSxJQUFLLEtBQU0sSUFBSyxDQUFDLEtBQUssV0FBVyxDQUFFLENBQUMsTUFFdkQsQ0FDRCxJQUFNLEVBQVEsRUFBc0IsRUFBRyxLQUFLLEVBQzVDLEtBQUssTUFBTSxLQUFLLENBQ1osS0FBTSxZQUNOLE9BQVEsS0FBSyxPQUNiLE9BQVEsS0FBSyxPQUNiLE1BQU8sQ0FBQyxDQUFFLFFBQU8sSUFBSyxLQUFNLElBQUssQ0FBQyxLQUFLLFdBQVcsQ0FBRSxDQUFDLENBQ3pELENBQUMsQ0FDTCxDQUNKLE1BQ0ssR0FBSSxFQUFHLE1BQ1IsRUFBSSxNQUFNLEtBQUssQ0FBRSxNQUFPLENBQUMsRUFBRyxJQUFLLEtBQU0sSUFBSyxDQUFDLEtBQUssV0FBVyxDQUFFLENBQUMsT0FFL0QsR0FBSSxFQUFjLEVBQUcsSUFBSyxlQUFlLEVBQzFDLEtBQUssTUFBTSxLQUFLLENBQ1osS0FBTSxZQUNOLE9BQVEsS0FBSyxPQUNiLE9BQVEsS0FBSyxPQUNiLE1BQU8sQ0FBQyxDQUFFLFFBQU8sSUFBSyxLQUFNLElBQUssQ0FBQyxLQUFLLFdBQVcsQ0FBRSxDQUFDLENBQ3pELENBQUMsT0FFQSxHQUFJLEdBQVksRUFBRyxHQUFHLEdBQ3ZCLENBQUMsRUFBYyxFQUFHLElBQUssU0FBUyxFQUFHLENBQ25DLElBQU0sRUFBUSxFQUFzQixFQUFHLEtBQUssRUFDdEMsRUFBTSxFQUFHLElBQ1QsRUFBTSxFQUFHLElBQ2YsRUFBSSxLQUFLLEtBQUssV0FBVyxFQUV6QixPQUFPLEVBQUcsSUFFVixPQUFPLEVBQUcsSUFDVixLQUFLLE1BQU0sS0FBSyxDQUNaLEtBQU0sWUFDTixPQUFRLEtBQUssT0FDYixPQUFRLEtBQUssT0FDYixNQUFPLENBQUMsQ0FBRSxRQUFPLE1BQUssS0FBSSxDQUFDLENBQy9CLENBQUMsQ0FDTCxNQUNTLEVBQU0sT0FBUyxFQUVwQixFQUFHLElBQU0sRUFBRyxJQUFJLE9BQU8sRUFBTyxLQUFLLFdBQVcsRUFHOUMsRUFBRyxJQUFJLEtBQUssS0FBSyxXQUFXLENBRXBDLE1BRVMsRUFBRyxJQUdDLEVBQUcsT0FBUyxFQUNqQixFQUFJLE1BQU0sS0FBSyxDQUFFLFFBQU8sSUFBSyxLQUFNLElBQUssQ0FBQyxLQUFLLFdBQVcsQ0FBRSxDQUFDLEVBRXZELEVBQWMsRUFBRyxJQUFLLGVBQWUsRUFDMUMsS0FBSyxNQUFNLEtBQUssQ0FDWixLQUFNLFlBQ04sT0FBUSxLQUFLLE9BQ2IsT0FBUSxLQUFLLE9BQ2IsTUFBTyxDQUFDLENBQUUsTUFBTyxDQUFDLEVBQUcsSUFBSyxLQUFNLElBQUssQ0FBQyxLQUFLLFdBQVcsQ0FBRSxDQUFDLENBQzdELENBQUMsRUFHRCxFQUFHLElBQUksS0FBSyxLQUFLLFdBQVcsRUFkNUIsT0FBTyxPQUFPLEVBQUksQ0FBRSxJQUFLLEtBQU0sSUFBSyxDQUFDLEtBQUssV0FBVyxDQUFFLENBQUMsRUFpQmhFLEtBQUssVUFBWSxHQUNqQixPQUNKLElBQUssUUFDTCxJQUFLLFNBQ0wsSUFBSyx1QkFDTCxJQUFLLHVCQUF3QixDQUN6QixJQUFNLEVBQUssS0FBSyxXQUFXLEtBQUssSUFBSSxFQUNoQyxHQUFjLEVBQUcsT0FDakIsRUFBSSxNQUFNLEtBQUssQ0FBRSxRQUFPLElBQUssRUFBSSxJQUFLLENBQUMsQ0FBRSxDQUFDLEVBQzFDLEtBQUssVUFBWSxJQUVaLEVBQUcsSUFDUixLQUFLLE1BQU0sS0FBSyxDQUFFLEdBR2xCLE9BQU8sT0FBTyxFQUFJLENBQUUsSUFBSyxFQUFJLElBQUssQ0FBQyxDQUFFLENBQUMsRUFDdEMsS0FBSyxVQUFZLElBRXJCLE1BQ0osQ0FDQSxRQUFTLENBQ0wsSUFBTSxFQUFLLEtBQUssZ0JBQWdCLENBQUcsRUFDbkMsR0FBSSxFQUFJLENBQ0osR0FBSSxFQUFHLE9BQVMsWUFDUixJQUFBLENBQUMsRUFBRyxhQUNKLEVBQUcsS0FDSCxDQUFDLEVBQWMsRUFBRyxJQUFLLFNBQVMsRUFBRyxDQUNuQyxNQUFPLEtBQUssSUFBSSxDQUNaLEtBQU0sUUFDTixPQUFRLEtBQUssT0FDYixRQUFTLGlEQUNULE9BQVEsS0FBSyxNQUNqQixDQUFDLEVBQ0QsTUFDSixPQUVLLEdBQ0wsRUFBSSxNQUFNLEtBQUssQ0FBRSxPQUFNLENBQUMsRUFFNUIsS0FBSyxNQUFNLEtBQUssQ0FBRSxFQUNsQixNQUNKLENBQ0osQ0FDSixDQUNKLENBQ0EsTUFBTyxLQUFLLElBQUksRUFDaEIsTUFBTyxLQUFLLEtBQUssQ0FDckIsQ0FDQSxDQUFDLGNBQWMsRUFBSyxDQUNoQixJQUFNLEVBQUssRUFBSSxNQUFNLEVBQUksTUFBTSxPQUFTLEdBQ3hDLE9BQVEsS0FBSyxLQUFiLENBQ0ksSUFBSyxVQUNELEdBQUksRUFBRyxNQUFPLENBQ1YsSUFBTSxFQUFNLFFBQVMsRUFBRyxNQUFRLEVBQUcsTUFBTSxJQUFNLElBQUEsSUFDbEMsTUFBTSxRQUFRLENBQUcsRUFBSSxFQUFJLEVBQUksT0FBUyxHQUFLLElBQUEsR0FBQSxFQUM5QyxPQUFTLFVBQ2YsR0FBSyxLQUFLLEtBQUssV0FBVyxFQUUxQixFQUFJLE1BQU0sS0FBSyxDQUFFLE1BQU8sQ0FBQyxLQUFLLFdBQVcsQ0FBRSxDQUFDLENBQ3BELE1BRUksRUFBRyxNQUFNLEtBQUssS0FBSyxXQUFXLEVBQ2xDLE9BQ0osSUFBSyxRQUNMLElBQUssVUFDRCxHQUFJLEVBQUcsTUFDSCxFQUFJLE1BQU0sS0FBSyxDQUFFLE1BQU8sQ0FBQyxLQUFLLFdBQVcsQ0FBRSxDQUFDLE1BQzNDLENBQ0QsR0FBSSxLQUFLLGtCQUFrQixFQUFHLE1BQU8sRUFBSSxNQUFNLEVBQUcsQ0FFOUMsSUFBTSxFQURPLEVBQUksTUFBTSxFQUFJLE1BQU0sT0FBUyxFQUMxQixFQUFFLE9BQU8sSUFDekIsR0FBSSxNQUFNLFFBQVEsQ0FBRyxFQUFHLENBQ3BCLEdBQWUsRUFBSyxFQUFHLEtBQUssRUFDNUIsRUFBSSxLQUFLLEtBQUssV0FBVyxFQUN6QixFQUFJLE1BQU0sSUFBSSxFQUNkLE1BQ0osQ0FDSixDQUNBLEVBQUcsTUFBTSxLQUFLLEtBQUssV0FBVyxDQUNsQyxDQUNBLE9BQ0osSUFBSyxTQUNMLElBQUssTUFDRCxHQUFJLEVBQUcsT0FBUyxLQUFLLFFBQVUsRUFBSSxPQUMvQixNQUNKLEVBQUcsTUFBTSxLQUFLLEtBQUssV0FBVyxFQUM5QixPQUNKLElBQUssZUFDRCxHQUFJLEtBQUssU0FBVyxFQUFJLE9BQ3BCLE1BQ0EsRUFBRyxPQUFTLEVBQWMsRUFBRyxNQUFPLGNBQWMsRUFDbEQsRUFBSSxNQUFNLEtBQUssQ0FBRSxNQUFPLENBQUMsS0FBSyxXQUFXLENBQUUsQ0FBQyxFQUU1QyxFQUFHLE1BQU0sS0FBSyxLQUFLLFdBQVcsRUFDbEMsTUFDUixDQUNBLEdBQUksS0FBSyxPQUFTLEVBQUksT0FBUSxDQUMxQixJQUFNLEVBQUssS0FBSyxnQkFBZ0IsQ0FBRyxFQUNuQyxHQUFJLEVBQUksQ0FDSixLQUFLLE1BQU0sS0FBSyxDQUFFLEVBQ2xCLE1BQ0osQ0FDSixDQUNBLE1BQU8sS0FBSyxJQUFJLEVBQ2hCLE1BQU8sS0FBSyxLQUFLLENBQ3JCLENBQ0EsQ0FBQyxlQUFlLEVBQUksQ0FDaEIsSUFBTSxFQUFLLEVBQUcsTUFBTSxFQUFHLE1BQU0sT0FBUyxHQUN0QyxHQUFJLEtBQUssT0FBUyxpQkFBa0IsQ0FDaEMsSUFBSSxFQUNKLEdBQ0ksTUFBTyxLQUFLLElBQUksRUFDaEIsRUFBTSxLQUFLLEtBQUssQ0FBQyxRQUNaLEdBQUssT0FBUyxrQkFDM0IsTUFDSyxHQUFJLEVBQUcsSUFBSSxTQUFXLEVBQUcsQ0FDMUIsT0FBUSxLQUFLLEtBQWIsQ0FDSSxJQUFLLFFBQ0wsSUFBSyxtQkFDRyxDQUFDLEdBQU0sRUFBRyxJQUNWLEVBQUcsTUFBTSxLQUFLLENBQUUsTUFBTyxDQUFDLEtBQUssV0FBVyxDQUFFLENBQUMsRUFFM0MsRUFBRyxNQUFNLEtBQUssS0FBSyxXQUFXLEVBQ2xDLE9BQ0osSUFBSyxnQkFDRyxDQUFDLEdBQU0sRUFBRyxNQUNWLEVBQUcsTUFBTSxLQUFLLENBQUUsTUFBTyxDQUFDLEVBQUcsSUFBSyxLQUFNLElBQUssQ0FBQyxLQUFLLFdBQVcsQ0FBRSxDQUFDLEVBQzFELEVBQUcsSUFDUixFQUFHLElBQUksS0FBSyxLQUFLLFdBQVcsRUFFNUIsT0FBTyxPQUFPLEVBQUksQ0FBRSxJQUFLLEtBQU0sSUFBSyxDQUFDLEtBQUssV0FBVyxDQUFFLENBQUMsRUFDNUQsT0FDSixJQUFLLFFBQ0wsSUFBSyxVQUNMLElBQUssVUFDTCxJQUFLLFNBQ0wsSUFBSyxNQUNHLENBQUMsR0FBTSxFQUFHLE1BQ1YsRUFBRyxNQUFNLEtBQUssQ0FBRSxNQUFPLENBQUMsS0FBSyxXQUFXLENBQUUsQ0FBQyxFQUN0QyxFQUFHLElBQ1IsRUFBRyxJQUFJLEtBQUssS0FBSyxXQUFXLEVBRTVCLEVBQUcsTUFBTSxLQUFLLEtBQUssV0FBVyxFQUNsQyxPQUNKLElBQUssUUFDTCxJQUFLLFNBQ0wsSUFBSyx1QkFDTCxJQUFLLHVCQUF3QixDQUN6QixJQUFNLEVBQUssS0FBSyxXQUFXLEtBQUssSUFBSSxFQUNoQyxDQUFDLEdBQU0sRUFBRyxNQUNWLEVBQUcsTUFBTSxLQUFLLENBQUUsTUFBTyxDQUFDLEVBQUcsSUFBSyxFQUFJLElBQUssQ0FBQyxDQUFFLENBQUMsRUFDeEMsRUFBRyxJQUNSLEtBQUssTUFBTSxLQUFLLENBQUUsRUFFbEIsT0FBTyxPQUFPLEVBQUksQ0FBRSxJQUFLLEVBQUksSUFBSyxDQUFDLENBQUUsQ0FBQyxFQUMxQyxNQUNKLENBQ0EsSUFBSyxlQUNMLElBQUssZUFDRCxFQUFHLElBQUksS0FBSyxLQUFLLFdBQVcsRUFDNUIsTUFDUixDQUNBLElBQU0sRUFBSyxLQUFLLGdCQUFnQixDQUFFLEVBRTlCLEVBQ0EsS0FBSyxNQUFNLEtBQUssQ0FBRSxHQUVsQixNQUFPLEtBQUssSUFBSSxFQUNoQixNQUFPLEtBQUssS0FBSyxFQUV6QixLQUNLLENBQ0QsSUFBTSxFQUFTLEtBQUssS0FBSyxDQUFDLEVBQzFCLEdBQUksRUFBTyxPQUFTLGNBQ2QsS0FBSyxPQUFTLGlCQUFtQixFQUFPLFNBQVcsRUFBRyxRQUNuRCxLQUFLLE9BQVMsV0FDWCxDQUFDLEVBQU8sTUFBTSxFQUFPLE1BQU0sT0FBUyxFQUFFLENBQUMsS0FDL0MsTUFBTyxLQUFLLElBQUksRUFDaEIsTUFBTyxLQUFLLEtBQUssT0FFaEIsR0FBSSxLQUFLLE9BQVMsaUJBQ25CLEVBQU8sT0FBUyxrQkFBbUIsQ0FFbkMsSUFBTSxFQUFRLEVBREQsR0FBYSxDQUNhLENBQUMsRUFDeEMsR0FBZ0IsQ0FBRSxFQUNsQixJQUFNLEVBQU0sRUFBRyxJQUFJLE9BQU8sRUFBRyxFQUFHLElBQUksTUFBTSxFQUMxQyxFQUFJLEtBQUssS0FBSyxXQUFXLEVBQ3pCLElBQU0sRUFBTSxDQUNSLEtBQU0sWUFDTixPQUFRLEVBQUcsT0FDWCxPQUFRLEVBQUcsT0FDWCxNQUFPLENBQUMsQ0FBRSxRQUFPLElBQUssRUFBSSxLQUFJLENBQUMsQ0FDbkMsRUFDQSxLQUFLLFVBQVksR0FDakIsS0FBSyxNQUFNLEtBQUssTUFBTSxPQUFTLEdBQUssQ0FDeEMsTUFFSSxNQUFPLEtBQUssUUFBUSxDQUFFLENBRTlCLENBQ0osQ0FDQSxXQUFXLEVBQU0sQ0FDYixHQUFJLEtBQUssVUFBVyxDQUNoQixJQUFJLEVBQUssS0FBSyxPQUFPLFFBQVE7Q0FBSSxFQUFJLEVBQ3JDLEtBQU8sSUFBTyxHQUNWLEtBQUssVUFBVSxLQUFLLE9BQVMsQ0FBRSxFQUMvQixFQUFLLEtBQUssT0FBTyxRQUFRO0VBQU0sQ0FBRSxFQUFJLENBRTdDLENBQ0EsTUFBTyxDQUNILE9BQ0EsT0FBUSxLQUFLLE9BQ2IsT0FBUSxLQUFLLE9BQ2IsT0FBUSxLQUFLLE1BQ2pCLENBQ0osQ0FDQSxnQkFBZ0IsRUFBUSxDQUNwQixPQUFRLEtBQUssS0FBYixDQUNJLElBQUssUUFDTCxJQUFLLFNBQ0wsSUFBSyx1QkFDTCxJQUFLLHVCQUNELE9BQU8sS0FBSyxXQUFXLEtBQUssSUFBSSxFQUNwQyxJQUFLLHNCQUNELE1BQU8sQ0FDSCxLQUFNLGVBQ04sT0FBUSxLQUFLLE9BQ2IsT0FBUSxLQUFLLE9BQ2IsTUFBTyxDQUFDLEtBQUssV0FBVyxFQUN4QixPQUFRLEVBQ1osRUFDSixJQUFLLGlCQUNMLElBQUssaUJBQ0QsTUFBTyxDQUNILEtBQU0sa0JBQ04sT0FBUSxLQUFLLE9BQ2IsT0FBUSxLQUFLLE9BQ2IsTUFBTyxLQUFLLFlBQ1osTUFBTyxDQUFDLEVBQ1IsSUFBSyxDQUFDLENBQ1YsRUFDSixJQUFLLGVBQ0QsTUFBTyxDQUNILEtBQU0sWUFDTixPQUFRLEtBQUssT0FDYixPQUFRLEtBQUssT0FDYixNQUFPLENBQUMsQ0FBRSxNQUFPLENBQUMsS0FBSyxXQUFXLENBQUUsQ0FBQyxDQUN6QyxFQUNKLElBQUssbUJBQW9CLENBQ3JCLEtBQUssVUFBWSxHQUVqQixJQUFNLEVBQVEsRUFERCxHQUFhLENBQ2EsQ0FBQyxFQUV4QyxPQURBLEVBQU0sS0FBSyxLQUFLLFdBQVcsRUFDcEIsQ0FDSCxLQUFNLFlBQ04sT0FBUSxLQUFLLE9BQ2IsT0FBUSxLQUFLLE9BQ2IsTUFBTyxDQUFDLENBQUUsUUFBTyxZQUFhLEVBQUssQ0FBQyxDQUN4QyxDQUNKLENBQ0EsSUFBSyxnQkFBaUIsQ0FDbEIsS0FBSyxVQUFZLEdBRWpCLElBQU0sRUFBUSxFQURELEdBQWEsQ0FDYSxDQUFDLEVBQ3hDLE1BQU8sQ0FDSCxLQUFNLFlBQ04sT0FBUSxLQUFLLE9BQ2IsT0FBUSxLQUFLLE9BQ2IsTUFBTyxDQUFDLENBQUUsUUFBTyxJQUFLLEtBQU0sSUFBSyxDQUFDLEtBQUssV0FBVyxDQUFFLENBQUMsQ0FDekQsQ0FDSixDQUNKLENBQ0EsT0FBTyxJQUNYLENBQ0Esa0JBQWtCLEVBQU8sRUFBUSxDQUs3QixPQUpJLEtBQUssT0FBUyxXQUVkLEtBQUssUUFBVSxFQUNSLEdBQ0osRUFBTSxNQUFNLEdBQU0sRUFBRyxPQUFTLFdBQWEsRUFBRyxPQUFTLE9BQU8sQ0FDekUsQ0FDQSxDQUFDLFlBQVksRUFBUSxDQUNiLEtBQUssT0FBUyxhQUNWLEVBQU8sSUFDUCxFQUFPLElBQUksS0FBSyxLQUFLLFdBQVcsRUFFaEMsRUFBTyxJQUFNLENBQUMsS0FBSyxXQUFXLEVBQzlCLEtBQUssT0FBUyxZQUNkLE1BQU8sS0FBSyxJQUFJLEdBRTVCLENBQ0EsQ0FBQyxRQUFRLEVBQU8sQ0FDWixPQUFRLEtBQUssS0FBYixDQUNJLElBQUssUUFDTCxJQUFLLFlBQ0wsSUFBSyxVQUNMLElBQUssZUFDTCxJQUFLLGVBQ0wsSUFBSyxnQkFDRCxNQUFPLEtBQUssSUFBSSxFQUNoQixNQUFPLEtBQUssS0FBSyxFQUNqQixNQUNKLElBQUssVUFDRCxLQUFLLFVBQVksR0FJckIsUUFFUSxFQUFNLElBQ04sRUFBTSxJQUFJLEtBQUssS0FBSyxXQUFXLEVBRS9CLEVBQU0sSUFBTSxDQUFDLEtBQUssV0FBVyxFQUM3QixLQUFLLE9BQVMsWUFDZCxNQUFPLEtBQUssSUFBSSxFQUM1QixDQUNKLENBQ0osRUNwOEJBLFNBQVMsR0FBYSxFQUFTLENBQzNCLElBQU0sRUFBZSxFQUFRLGVBQWlCLEdBRTlDLE1BQU8sQ0FBRSxZQURXLEVBQVEsYUFBZ0IsR0FBZ0IsSUFBSSxJQUFrQixLQUM1RCxjQUFhLENBQ3ZDLENBVUEsU0FBUyxHQUFrQixFQUFRLEVBQVUsQ0FBQyxFQUFHLENBQzdDLEdBQU0sQ0FBRSxjQUFhLGdCQUFpQixHQUFhLENBQU8sRUFDcEQsRUFBUyxJQUFJLEdBQU8sR0FBYSxVQUFVLEVBQzNDLEVBQVcsSUFBSSxHQUFTLENBQU8sRUFDL0IsRUFBTyxNQUFNLEtBQUssRUFBUyxRQUFRLEVBQU8sTUFBTSxDQUFNLENBQUMsQ0FBQyxFQUM5RCxHQUFJLEdBQWdCLEVBQ2hCLElBQUssSUFBTSxLQUFPLEVBQ2QsRUFBSSxPQUFPLFFBQVEsR0FBYyxFQUFRLENBQVcsQ0FBQyxFQUNyRCxFQUFJLFNBQVMsUUFBUSxHQUFjLEVBQVEsQ0FBVyxDQUFDLEVBSS9ELE9BRkksRUFBSyxPQUFTLEVBQ1AsRUFDSixPQUFPLE9BQU8sQ0FBQyxFQUFHLENBQUUsTUFBTyxFQUFLLEVBQUcsRUFBUyxXQUFXLENBQUMsQ0FDbkUsQ0FFQSxTQUFTLEdBQWMsRUFBUSxFQUFVLENBQUMsRUFBRyxDQUN6QyxHQUFNLENBQUUsY0FBYSxnQkFBaUIsR0FBYSxDQUFPLEVBQ3BELEVBQVMsSUFBSSxHQUFPLEdBQWEsVUFBVSxFQUMzQyxFQUFXLElBQUksR0FBUyxDQUFPLEVBRWpDLEVBQU0sS0FDVixJQUFLLElBQU0sS0FBUSxFQUFTLFFBQVEsRUFBTyxNQUFNLENBQU0sRUFBRyxHQUFNLEVBQU8sTUFBTSxFQUN6RSxHQUFJLENBQUMsRUFDRCxFQUFNLE9BQ0wsR0FBSSxFQUFJLFFBQVEsV0FBYSxTQUFVLENBQ3hDLEVBQUksT0FBTyxLQUFLLElBQUksRUFBZSxFQUFLLE1BQU0sTUFBTSxFQUFHLENBQUMsRUFBRyxnQkFBaUIseUVBQXlFLENBQUMsRUFDdEosS0FDSixDQU1KLE9BSkksR0FBZ0IsSUFDaEIsRUFBSSxPQUFPLFFBQVEsR0FBYyxFQUFRLENBQVcsQ0FBQyxFQUNyRCxFQUFJLFNBQVMsUUFBUSxHQUFjLEVBQVEsQ0FBVyxDQUFDLEdBRXBELENBQ1gsQ0FDQSxTQUFTQyxHQUFNLEVBQUssRUFBUyxFQUFTLENBQ2xDLElBQUksRUFDQSxPQUFPLEdBQVksV0FDbkIsRUFBVyxFQUVOLElBQVksSUFBQSxJQUFhLEdBQVcsT0FBTyxHQUFZLFdBQzVELEVBQVUsR0FFZCxJQUFNLEVBQU0sR0FBYyxFQUFLLENBQU8sRUFDdEMsR0FBSSxDQUFDLEVBQ0QsT0FBTyxLQUVYLEdBREEsRUFBSSxTQUFTLFFBQVEsR0FBVyxHQUFLLEVBQUksUUFBUSxTQUFVLENBQU8sQ0FBQyxFQUMvRCxFQUFJLE9BQU8sT0FBUyxFQUFHLENBQ3ZCLEdBQUksRUFBSSxRQUFRLFdBQWEsU0FDekIsTUFBTSxFQUFJLE9BQU8sR0FFakIsRUFBSSxPQUFTLENBQUMsQ0FDdEIsQ0FDQSxPQUFPLEVBQUksS0FBSyxPQUFPLE9BQU8sQ0FBRSxRQUFTLENBQVMsRUFBRyxDQUFPLENBQUMsQ0FDakUsQ0FDQSxTQUFTLEdBQVUsRUFBTyxFQUFVLEVBQVMsQ0FDekMsSUFBSSxFQUFZLEtBU2hCLEdBUkksT0FBTyxHQUFhLFlBQWMsTUFBTSxRQUFRLENBQVEsRUFDeEQsRUFBWSxFQUVQLElBQVksSUFBQSxJQUFhLElBQzlCLEVBQVUsR0FFVixPQUFPLEdBQVksV0FDbkIsRUFBVSxFQUFRLFFBQ2xCLE9BQU8sR0FBWSxTQUFVLENBQzdCLElBQU0sRUFBUyxLQUFLLE1BQU0sQ0FBTyxFQUNqQyxFQUFVLEVBQVMsRUFBSSxJQUFBLEdBQVksRUFBUyxFQUFJLENBQUUsT0FBUSxDQUFFLEVBQUksQ0FBRSxRQUFPLENBQzdFLENBQ0EsR0FBSSxJQUFVLElBQUEsR0FBVyxDQUNyQixHQUFNLENBQUUsaUJBQWtCLEdBQVcsR0FBWSxDQUFDLEVBQ2xELEdBQUksQ0FBQyxFQUNELE1BQ1IsQ0FHQSxPQUZJLEVBQVcsQ0FBSyxHQUFLLENBQUMsRUFDZixFQUFNLFNBQVMsQ0FBTyxFQUMxQixJQUFJLEdBQVMsRUFBTyxFQUFXLENBQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBTyxDQUNuRSxDRWhHQSxJQUFBLHNjQUFlQyxFQ3VNZixNQUFNLEdBQWlCLDJCQUNqQixHQUFvQiw0QkFDcEIsR0FBbUIsVUFDbkIsR0FBa0IsT0FDbEIsR0FBa0IsZUFDbEIsR0FBZSxXQUNmLEdBQWlCLGFBQ2pCLEdBQXVCLGVBQ3ZCLEdBQWEsZUFDYixHQUFnQixxQkFDaEIsR0FBdUIsU0FDdkJDLEdBQVUsU0FDaEIsU0FBUyxHQUF3QixFQUFNLEVBQWUsQ0FDckQsSUFBSSxFQUFTLEVBQ2IsS0FBTyxFQUFTLEVBQUssUUFBUSxHQUFJLEVBQWUsQ0FDL0MsSUFBTSxFQUFNLEVBQUssUUFBUSxNQUFPLENBQU0sRUFDdEMsR0FBSSxFQUFNLEVBQUcsTUFBTyxHQUNwQixFQUFnQixHQUNoQixFQUFTLEVBQU0sQ0FDaEIsS0FBTyxDQUNOLElBQU0sRUFBUSxFQUFLLFFBQVEsT0FBUSxDQUFNLEVBQ3pDLEdBQUksRUFBUSxFQUFHLE1BQU8sR0FDdEIsSUFBTSxFQUFNLEVBQUssUUFBUSxNQUFPLEVBQVEsQ0FBQyxFQUN6QyxHQUFJLEVBQU0sRUFBRyxNQUFPLEdBQ3BCLEVBQVMsRUFBTSxDQUNoQixDQUNBLE9BQU8sQ0FDUixDQWlCQSxTQUFTLEdBQU8sRUFBTSxFQUFTLENBQzlCLElBQUksRUFDQSxFQUNBLEVBQVUsRUFBSyxRQUFRLElBQWlCLEVBQUcsS0FDOUMsRUFBTyxjQUNQLEVBQU0sRUFDQyxHQUNQLEVBQ0csSUFBUyxnQkFBZSxFQUFVLEVBQVEsUUFBUSxJQUFvQixFQUFHLEtBQzVFLEVBQU8sT0FDUCxFQUFNLEVBQ0MsR0FDUCxHQUNELElBQU0sRUFBTSxHQUFPLENBQUMsRUFBUSxZQUFjQyxHQUFLLGNBQWMsQ0FBRyxFQUFJLElBQUssR0FDekUsTUFBTyxDQUNOLE9BQ0EsTUFDQSxNQUNBLEtBQU0sR0FBSyxPQUFPLEVBQ2xCLFNBQ0QsQ0FDRCxDQUNBLE1BQU0sR0FBbUIsb0RBQ25CLEdBQW9CLDZCQUsxQixTQUFTLEdBQTZCLEVBQVEsQ0FDN0MsSUFBTSxFQUFNLEVBQU8sS0FBSyxDQUFDLENBQUMsUUFBUSxHQUFtQixFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQzlELE9BQU8sRUFBSSxXQUFXLEdBQUcsR0FBSyxFQUFJLFNBQVMsR0FBRyxFQUFJLEVBQUksTUFBTSxFQUFHLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBSSxDQUM3RSxDQUtBLFNBQVMsR0FBbUIsRUFBUyxFQUFhLENBQ2pELElBQU0sRUFBeUIsSUFBSSxJQUNuQyxJQUFLLElBQU0sSUFBTyxDQUNqQixRQUNBLGtCQUNBLFlBQ0QsRUFBRyxDQUNGLElBQU0sRUFBTSxFQUFZLEdBQ3BCLE9BQU8sR0FBUSxVQUFZLEdBQU8sQ0FBQyxFQUFJLFdBQVcsT0FBTyxJQUN4RCxJQUFRLGNBQ1AsR0FBaUIsS0FBSyxDQUFHLEdBQUssRUFBSSxXQUFXLEdBQUcsR0FBSyxFQUFJLFdBQVcsTUFBTSxJQUFHLEVBQU8sSUFBSSxDQUFHLEVBQ3pGLEVBQU8sSUFBSSxDQUFHLEVBRXZCLENBQ0EsSUFBTSxFQUFXLEVBQVEsUUFBUSxHQUFlLEVBQUUsRUFDbEQsSUFBSyxHQUFNLEVBQUcsS0FBVyxFQUFTLFNBQVMseUJBQXlCLEVBQUcsQ0FDdEUsSUFBTSxFQUFNLEdBQTZCLENBQU0sRUFDM0MsR0FBTyxDQUFDLEVBQUksV0FBVyxPQUFPLEdBQUcsRUFBTyxJQUFJLENBQUcsQ0FDcEQsQ0FDQSxJQUFLLEdBQU0sRUFBRyxLQUFRLEVBQVMsU0FBUyxtQ0FBbUMsRUFBTyxHQUFPLENBQUMsRUFBSSxXQUFXLE9BQU8sR0FBSyxDQUFDLEVBQUksU0FBUyxJQUFJLEdBQUssR0FBaUIsS0FBSyxDQUFHLEdBQUcsRUFBTyxJQUFJLEVBQUksS0FBSyxDQUFDLEVBQzdMLElBQUssR0FBTSxFQUFHLEtBQVEsRUFBUyxTQUFTLG1DQUFtQyxFQUFPLEdBQU8sQ0FBQyxFQUFJLFdBQVcsT0FBTyxHQUFLLEdBQWlCLEtBQUssQ0FBRyxHQUFHLEVBQU8sSUFBSSxFQUFJLEtBQUssQ0FBQyxFQUN0SyxJQUFLLEdBQU0sRUFBRyxLQUFRLEVBQVMsU0FBUyw2QkFBNkIsRUFBTyxHQUFPLENBQUMsRUFBSSxXQUFXLE9BQU8sR0FBSyxHQUFpQixLQUFLLENBQUcsR0FBRyxFQUFPLElBQUksRUFBSSxLQUFLLENBQUMsRUFDaEssT0FBTyxNQUFNLEtBQUssQ0FBTSxDQUN6QixDQUNBLFNBQVMsR0FBZSxFQUFNLENBQzdCLE1BQU8sQ0FDTixNQUFPLENBQUMsQ0FBQyxFQUFLLE1BQU0sRUFBZ0IsR0FBSyxDQUFDLENBQUMsRUFBSyxNQUFNLEVBQWUsRUFDckUsT0FBUSxHQUFnQixLQUFLLENBQUksRUFBSSxHQUF5QixDQUFJLEVBQUksR0FDdEUsTUFBTyxDQUFDLENBQUMsRUFBSyxNQUFNLEVBQVksRUFDaEMsUUFBUyxDQUFDLENBQUMsRUFBSyxNQUFNLEVBQWMsRUFDcEMsUUFBUyxDQUFDLENBQUMsRUFBSyxNQUFNLEVBQW9CLENBQzNDLENBQ0QsQ0FDQSxTQUFTLEdBQVcsRUFBSyxFQUFVLENBQUMsRUFBRyxDQUN0QyxJQUFNLEVBQWUsR0FBTyxFQUFLLENBQU8sRUFDcEMsRUFDRSxFQUFjLEVBQWEsTUFBUSxDQUFDLEVBQ3RDLEVBQVUsRUFBYSxRQUFRLEtBQUssRUFDbEMsRUFBVyxHQUFLLEVBQUksS0FBSyxDQUFDLEVBQzFCLEVBQVcsTUFBTSxLQUFLLEVBQVEsU0FBUyxvQkFBb0IsQ0FBQyxFQUNsRSxHQUFJLEVBQVMsT0FBUSxDQUNwQixJQUFNLEVBQU8sRUFBUyxFQUFTLE9BQVMsR0FDcEMsRUFBSyxRQUFVLElBQUssSUFBSyxFQUFLLE1BQVEsRUFBSyxFQUFFLENBQUMsUUFBVSxFQUFRLFNBQ25FLEVBQU8sRUFBSyxFQUFFLENBQUMsS0FBSyxFQUNwQixFQUFVLEVBQVEsTUFBTSxFQUFHLEVBQUssS0FBSyxDQUFDLENBQUMsS0FBSyxFQUU5QyxDQUNBLElBQUksRUFDQSxFQUNKLEdBQUksRUFBWSxPQUFTLEVBQVksS0FBTSxFQUFRLEVBQVksT0FBUyxFQUFZLFNBQy9FLENBQ0osSUFBTSxFQUFRLEVBQVEsUUFBUSxHQUFlLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBVSxFQUNqRSxFQUFRLElBQVEsRUFBRSxFQUFFLEtBQUssRUFDekIsRUFBUSxJQUFRLEVBQUUsRUFBRSxNQUNyQixDQUNJLEVBQVksUUFBTyxFQUFRLEVBQVksT0FBUyxHQUNwRCxJQUFNLEVBQVMsR0FBbUIsRUFBUyxDQUFXLEVBQ3RELE1BQU8sQ0FDTixNQUNBLFFBQ0EsUUFDQSxXQUNBLFVBQ0EsV0FBWSxFQUNaLGNBQ0EsaUJBQWtCLEVBQWEsS0FDL0IsZUFBZ0IsRUFBYSxJQUM3QixlQUFnQixFQUFhLElBQzdCLE9BQ0EsUUFDRCxDQUNELENBQ0EsZUFBZSxHQUFNLEVBQVUsRUFBVSxFQUFZLEVBQVUsQ0FBQyxFQUFHLENBQ2xFLElBQU0sRUFBUSxFQUFTLE1BQU0sRUFBUSxXQUFhO0VBQU9ELEVBQU8sRUFDMUQsRUFBUyxDQUFDLEVBQ1osRUFBUSxFQUNSLEVBQWUsRUFDZixFQUFnQixHQUNwQixlQUFlLEVBQU0sRUFBSyxDQUN6QixHQUFJLElBQVUsRUFBSyxPQUNuQixJQUFNLEVBQVEsQ0FDYixHQUFHLEdBQVcsRUFBTSxNQUFNLEVBQU8sQ0FBRyxDQUFDLENBQUMsS0FBSztDQUFJLEVBQUcsQ0FBTyxFQUN6RCxXQUNBLE1BQU8sRUFBTyxPQUNkLFFBQ0EsZUFDQSxLQUNELEVBQ0EsR0FBSSxFQUFZLElBQUssSUFBTSxLQUFLLEVBQVksQ0FDM0MsR0FBSSxFQUFFLGVBQWdCLENBQ3JCLElBQU0sRUFBYSxNQUFNLEVBQUUsZUFBZSxFQUFNLFFBQVMsRUFBTSxXQUFXLEVBQ3RFLElBQWUsSUFBSyxLQUFHLEVBQU0sUUFBVSxHQUN2QyxPQUFPLEVBQU0sWUFBWSxPQUFVLFdBQVUsRUFBTSxNQUFRLEVBQU0sWUFBWSxPQUM3RSxPQUFPLEVBQU0sWUFBWSxPQUFVLFdBQVUsRUFBTSxNQUFRLEVBQU0sWUFBWSxNQUNsRixDQUNBLEdBQUksRUFBRSxjQUFlLENBQ3BCLElBQU0sRUFBVSxNQUFNLEVBQUUsY0FBYyxFQUFNLEtBQU0sRUFBTSxXQUFXLEVBQy9ELElBQVksSUFBSyxLQUFHLEVBQU0sS0FBTyxFQUN0QyxDQUNELENBQ0EsRUFBTyxLQUFLLENBQUssRUFDakIsRUFBUSxFQUFNLEVBQ2QsRUFBZSxFQUFNLENBQ3RCLENBQ0EsR0FBSSxFQUNFLElBQUEsSUFBTSxLQUFLLEVBQWdCLEVBQUUsbUJBQW1CLE1BQU0sRUFBRSxrQkFBa0IsQ0FBSyxFQUVyRixJQUFLLElBQUksRUFBSSxFQUFHLEVBQUksRUFBTSxPQUFRLElBQUssQ0FDdEMsSUFBTSxFQUFVLEVBQU0sR0FDaEIsRUFBTyxFQUFRLFFBQVEsRUFDN0IsR0FBSSxFQUFlLENBQ2xCLEVBQWdCLEdBQXdCLEVBQVMsRUFBSSxFQUNyRCxRQUNELENBQ0EsR0FBSSxFQUFLLFdBQVcsS0FBSyxFQUFHLENBQzNCLE1BQU0sRUFBTSxDQUFDLEVBQ2IsSUFBTSxFQUFPLEVBQU0sRUFBSSxHQUN2QixHQUFJLEVBQUssS0FBTyxLQUFPLEdBQU0sS0FBSyxFQUFHLENBRXBDLElBREEsRUFBUSxFQUNILEdBQUssRUFBRyxFQUFJLEVBQU0sUUFBaUIsRUFBTSxFQUFFLENBQUMsUUFBUSxJQUFNLE1BQWhDLEtBQy9CLEVBQWUsRUFBSSxDQUNwQixDQUNELE1BQU8sR0FBSSxFQUFLLFVBQVUsQ0FBQyxDQUFDLFdBQVcsS0FBSyxFQUFHLENBQzlDLElBQU0sRUFBaUIsRUFBSyxNQUFNLEVBQW9CLENBQUMsQ0FBQyxHQUNwRCxFQUFJLEVBQUksRUFDWixLQUFPLEVBQUksRUFBTSxRQUFpQixHQUFNLEVBQUUsQ0FBQyxXQUFXLENBQWMsRUFBM0MsS0FDckIsSUFBTSxFQUFNLFNBQVEsRUFBSSxFQUM3QixLQUFPLEdBQWdCLEdBQXdCLEVBQVMsRUFBSyxDQUM5RCxDQUVBLE9BREksR0FBUyxFQUFNLE9BQVMsR0FBRyxNQUFNLEVBQU0sRUFBTSxNQUFNLEVBQ2hELENBQ04sV0FDQSxJQUFLLEVBQ0wsUUFDRCxDQUNELENBa0RBLFNBQVMsR0FBeUIsRUFBSSxDQUNyQyxJQUFNLEVBQXdCLElBQUksSUFDNUIsRUFBdUIsSUFBSSxJQWlCakMsT0FoQkEsRUFBRyxRQUFRLHNEQUF1RCxFQUFNLEVBQU8sS0FBTSxFQUFNLElBQVMsQ0FDbkcsRUFBTyxFQUFLLEtBQUssRUFDakIsSUFBTSxFQUFRLElBQVMsT0FDdkIsR0FBSSxDQUNILEtBQ0EsYUFDQSxLQUNBLFlBQ0QsQ0FBQyxDQUFDLFNBQVMsQ0FBSSxFQUNULElBQUEsR0FBTSxHQUFLLEtBQWMsRUFBSyxTQUFTLGdDQUFnQyxFQUFPLElBQzdFLEtBQUssU0FBUyxDQUFTLEdBQUcsRUFBTSxJQUFJLENBQVMsRUFDOUMsR0FBTyxFQUFLLElBQUksQ0FBUyxHQUcvQixNQUFPLEVBQ1IsQ0FBQyxFQUNNLENBQ04sTUFBTyxNQUFNLEtBQUssQ0FBSyxFQUN2QixLQUFNLE1BQU0sS0FBSyxDQUFJLENBQ3RCLENBQ0QsQ0FDQSxTQUFTLEdBQUssRUFBSyxDQUNsQixJQUFJLEVBQU8sRUFDWCxJQUFLLElBQUksRUFBSSxFQUFHLEVBQUksRUFBSSxPQUFRLElBQy9CLEdBQVEsR0FBUSxHQUFLLEVBQU8sRUFBSSxXQUFXLENBQUMsRUFDNUMsR0FBUSxFQUVULE9BQU8sRUFBSyxTQUFTLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRyxFQUFFLENBQ3JDLENDdmVBLE1BQU0sR0FBeUIsZUFDL0IsU0FBUyxHQUFxQixFQUFRLEdBQUksQ0FJeEMsT0FISyxHQUdFLEVBQU0sUUFBUSxNQUFPLEdBQUcsQ0FBQyxDQUFDLFFBQVEsR0FBeUIsR0FBTSxFQUFFLFlBQVksQ0FBQyxDQUN6RixDQUdBLE1BQU0sR0FBa0Isa0RBQ2xCLEdBQW1CLGNBQ25CLEdBQWtCLG1CQXNEeEIsU0FBUyxJQUFNLENBSWIsT0FISSxPQUFPLFFBQVksS0FBZSxPQUFPLFFBQVEsS0FBUSxXQUNwRCxRQUFRLElBQUksQ0FBQyxDQUFDLFFBQVEsTUFBTyxHQUFHLEVBRWxDLEdBQ1QsQ0FDQSxNQUFNLEdBQVUsU0FBUyxHQUFHLEVBQVksQ0FDdEMsRUFBYSxFQUFXLElBQUssR0FBYSxHQUFxQixDQUFRLENBQUMsRUFDeEUsSUFBSSxFQUFlLEdBQ2YsRUFBbUIsR0FDdkIsSUFBSyxJQUFJLEVBQVEsRUFBVyxPQUFTLEVBQUcsR0FBUyxJQUFNLENBQUMsRUFBa0IsSUFBUyxDQUNqRixJQUFNLEVBQU8sR0FBUyxFQUFJLEVBQVcsR0FBUyxHQUFJLEVBQzdDLEdBQVEsRUFBSyxTQUFXLElBRzdCLEVBQWUsR0FBRyxFQUFLLEdBQUcsSUFDMUIsRUFBbUIsR0FBVyxDQUFJLEVBQ3BDLENBS0EsTUFKQSxHQUFlLEdBQWdCLEVBQWMsQ0FBQyxDQUFnQixFQUMxRCxHQUFvQixDQUFDLEdBQVcsQ0FBWSxFQUN2QyxJQUFJLElBRU4sRUFBYSxPQUFTLEVBQUksRUFBZSxHQUNsRCxFQUNBLFNBQVMsR0FBZ0IsRUFBTSxFQUFnQixDQUM3QyxJQUFJLEVBQU0sR0FDTixFQUFvQixFQUNwQixFQUFZLEdBQ1osRUFBTyxFQUNQLEVBQU8sS0FDWCxJQUFLLElBQUksRUFBUSxFQUFHLEdBQVMsRUFBSyxPQUFRLEVBQUUsRUFBTyxDQUNqRCxHQUFJLEVBQVEsRUFBSyxPQUNmLEVBQU8sRUFBSyxRQUNQLEdBQUksSUFBUyxJQUNsQixVQUVBLEdBQU8sSUFFVCxHQUFJLElBQVMsSUFBSyxDQUNoQixHQUFJLElBQWMsRUFBUSxHQUFLLElBQVMsRUFBVSxJQUFJLElBQVMsRUFBRyxDQUNoRSxHQUFJLEVBQUksT0FBUyxHQUFLLElBQXNCLEdBQUssRUFBSSxFQUFJLE9BQVMsS0FBTyxLQUFPLEVBQUksRUFBSSxPQUFTLEtBQU8sSUFBSyxDQUMzRyxHQUFJLEVBQUksT0FBUyxFQUFHLENBQ2xCLElBQU0sRUFBaUIsRUFBSSxZQUFZLEdBQUcsRUFDdEMsSUFBbUIsSUFDckIsRUFBTSxHQUNOLEVBQW9CLElBRXBCLEVBQU0sRUFBSSxNQUFNLEVBQUcsQ0FBYyxFQUNqQyxFQUFvQixFQUFJLE9BQVMsRUFBSSxFQUFJLFlBQVksR0FBRyxHQUUxRCxFQUFZLEVBQ1osRUFBTyxFQUNQLFFBQ0YsQ0FBTyxHQUFJLEVBQUksT0FBUyxFQUFHLENBQ3pCLEVBQU0sR0FDTixFQUFvQixFQUNwQixFQUFZLEVBQ1osRUFBTyxFQUNQLFFBQ0YsQ0FDRixDQUNJLElBQ0YsR0FBTyxFQUFJLE9BQVMsRUFBSSxNQUFRLEtBQ2hDLEVBQW9CLEVBRXhCLE1BQ00sRUFBSSxPQUFTLEVBQ2YsR0FBTyxJQUFJLEVBQUssTUFBTSxFQUFZLEVBQUcsQ0FBSyxJQUUxQyxFQUFNLEVBQUssTUFBTSxFQUFZLEVBQUcsQ0FBSyxFQUV2QyxFQUFvQixFQUFRLEVBQVksQ0FDMUMsQ0FDQSxFQUFZLEVBQ1osRUFBTyxDQUNULE1BQVcsSUFBUyxLQUFPLElBQVMsR0FDbEMsRUFBRSxFQUVGLEVBQU8sRUFFWCxDQUNBLE9BQU8sQ0FDVCxDQUNBLE1BQU0sR0FBYSxTQUFTLEVBQUcsQ0FDN0IsT0FBTyxHQUFnQixLQUFLLENBQUMsQ0FDL0IsRUFTTSxHQUFXLFNBQVMsRUFBTSxFQUFJLENBQ2xDLElBQU0sRUFBUSxHQUFRLENBQUksQ0FBQyxDQUFDLFFBQVEsR0FBaUIsSUFBSSxDQUFDLENBQUMsTUFBTSxHQUFHLEVBQzlELEVBQU0sR0FBUSxDQUFFLENBQUMsQ0FBQyxRQUFRLEdBQWlCLElBQUksQ0FBQyxDQUFDLE1BQU0sR0FBRyxFQUNoRSxHQUFJLEVBQUksRUFBRSxDQUFDLEtBQU8sS0FBTyxFQUFNLEVBQUUsQ0FBQyxLQUFPLEtBQU8sRUFBTSxLQUFPLEVBQUksR0FDL0QsT0FBTyxFQUFJLEtBQUssR0FBRyxFQUVyQixJQUFNLEVBQVksQ0FBQyxHQUFHLENBQUssRUFDM0IsSUFBSyxJQUFNLEtBQVcsRUFBVyxDQUMvQixHQUFJLEVBQUksS0FBTyxFQUNiLE1BRUYsRUFBTSxNQUFNLEVBQ1osRUFBSSxNQUFNLENBQ1osQ0FDQSxNQUFPLENBQUMsR0FBRyxFQUFNLFFBQVUsSUFBSSxFQUFHLEdBQUcsQ0FBRyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQ3BELEVBQ00sR0FBVSxTQUFTLEVBQUcsQ0FDMUIsSUFBTSxFQUFXLEdBQXFCLENBQUMsQ0FBQyxDQUFDLFFBQVEsTUFBTyxFQUFFLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRyxFQUFFLEVBSWxGLE9BSEksRUFBUyxTQUFXLEdBQUssR0FBaUIsS0FBSyxFQUFTLEVBQUUsSUFDNUQsRUFBUyxJQUFNLEtBRVYsRUFBUyxLQUFLLEdBQUcsSUFBTSxHQUFXLENBQUMsRUFBSSxJQUFNLElBQ3RELEVDbkxBLFNBQVMsR0FBa0IsRUFBVSxFQUFPLENBQzNDLE9BQU8sRUFBTSxLQUFNLEdBQVMsQ0FDM0IsSUFBTSxFQUFNLEdBQVMsRUFBTSxDQUFRLEVBQ25DLE9BQU8sSUFBUSxJQUFNLENBQUMsQ0FBQyxHQUFPLENBQUMsRUFBSSxXQUFXLElBQUksR0FBSyxDQUFDLEdBQVcsQ0FBRyxDQUN2RSxDQUFDLENBQ0YsQ0FTQSxlQUFlLEdBQUssRUFBUyxFQUFVLEVBQVUsQ0FBQyxFQUFHLEVBQU0sQ0FDMUQsSUFBTSxFQUFhLE9BQU8sR0FBWSxXQUFhLEVBQVUsS0FBTyxJQUFTLEVBQVEsSUFBUyxFQUFTLEVBQU0sT0FBTyxFQUNuRyxNQUFNLEVBQVcsQ0FBUSxFQUQxQyxJQUVJLEVBWUUsRUFBZ0IsQ0FBQyxFQUNqQixFQUFhLENBQUMsRUFDZCxFQUFTLENBQUMsRUFDaEIsZUFBZSxFQUFhLEVBQU0sRUFBTyxFQUFxQixFQUFXLENBQ3hFLElBQUksRUFBSyxFQUFjLEdBQ2xCLElBRUosRUFBSyxNQUFNLEdBQU0sTUFEQyxFQUFXLENBQUksRUFDWCxFQUFNLENBQVUsRUFDdEMsRUFBYyxHQUFRLEVBQ3RCLEVBQVcsR0FBd0IsSUFBSSxLQUV4QyxJQUFNLEVBQWlCLEdBQVcsR0FBRyxFQUFFLEVBQ3ZDLElBQUssSUFBTSxLQUFTLEVBQWlCLEVBQUcsT0FBTyxPQUFRLENBQUssRUFBRyxDQUM5RCxJQUFNLEVBQVcsRUFBRyxPQUFPLEVBQVEsR0FDbkMsR0FBSSxDQUFDLEVBQVUsQ0FDZCxFQUFHLFNBQVcsQ0FBQyxFQUNmLEVBQUcsT0FBTyxLQUFLLENBQ2QsSUFBSyxFQUNMLFFBQVMsU0FBUyxFQUFNLHNCQUFzQixFQUFLLGVBQWUsRUFBRyxPQUFPLE9BQU8sUUFDcEYsQ0FBQyxFQUNELFFBQ0QsQ0FDQSxHQUFJLENBQ0gsTUFBTSxFQUFVLEVBQUksRUFBVSxFQUFxQixDQUFTLENBQzdELE9BQVMsRUFBRyxDQUNYLEVBQUcsU0FBVyxDQUFDLEVBQ2YsRUFBRyxPQUFPLEtBQUssQ0FDZCxJQUFLLEVBQVMsTUFDZCxRQUFTLDZCQUE2QixHQUN2QyxDQUFDLEVBQ0QsUUFDRCxDQUNJLElBQWlCLEVBQWUsVUFBWSxDQUFDLEVBQUEsQ0FBRyxLQUFLLENBQVEsQ0FDbEUsQ0FDQSxPQUFPLENBQ1IsQ0FDQSxlQUFlLEVBQVUsRUFBSSxFQUFPLEVBQXFCLEVBQWEsQ0FDakUsT0FBTSxZQUFZLFVBQVksRUFBTSxZQUFZLE1BQ3BELElBQUksRUFBTSxZQUFZLElBQUssQ0FDMUIsR0FBTSxDQUFDLEVBQVMsR0FBWSxFQUFNLFlBQVksSUFBSSxNQUFNLEdBQUcsRUFDckQsRUFBTyxFQUFNLEVBQVEsV0FBVyxHQUFHLEVBQUksR0FBUSxFQUFRLFNBQVUsRUFBUSxVQUFVLENBQUMsQ0FBQyxFQUFJLEdBQVEsR0FBUSxFQUFNLFFBQVEsRUFBRyxDQUFPLENBQUMsRUFDeEksRUFBc0IsQ0FDckIsR0FBRyxFQUFNLFlBQ1QsR0FBRyxDQUNKLEVBQ0EsT0FBTyxFQUFvQixJQUMzQixJQUFNLEVBQWdCLElBQUksS0FBSyxHQUFlLENBQUMsRUFBQSxDQUFHLElBQUssR0FBTSxFQUFFLFFBQVEsQ0FBQyxFQUN4RSxHQUFJLElBQVMsRUFBTSxVQUFZLEVBQWMsSUFBSSxDQUFJLEVBQUcsQ0FDdkQsRUFBRyxTQUFXLENBQUMsRUFDZixFQUFHLE9BQU8sS0FBSyxDQUNkLElBQUssRUFBTSxNQUNYLFFBQVMsaUNBQWlDLEVBQU0sWUFBWSxJQUFJLEtBQUssRUFBSyxFQUMzRSxDQUFDLEVBQ0QsTUFDRCxDQUNJLEVBQVEsY0FBZ0IsQ0FBQyxHQUFrQixFQUFNLEVBQVEsWUFBWSxHQUN4RSxFQUFHLFNBQVcsQ0FBQyxFQUNmLEVBQUcsT0FBTyxLQUFLLENBQ2QsSUFBSyxFQUFNLE1BQ1gsUUFBUywrQ0FBK0MsR0FDekQsQ0FBQyxHQUNVLEVBQVcsQ0FBSSxFQU1wQixNQUFNLEVBQWEsRUFBTSxFQUFVLEVBQXFCLEVBQWMsQ0FBQyxHQUFHLEVBQWEsQ0FBSyxFQUFJLENBQUMsQ0FBSyxDQUFDLEdBTDdHLEVBQUcsU0FBVyxDQUFDLEVBQ2YsRUFBRyxPQUFPLEtBQUssQ0FDZCxJQUFLLEVBQU0sTUFDWCxRQUFTLHFDQUFxQyxHQUMvQyxDQUFDLEVBRUgsTUFBTyxFQUFPLEtBQUssQ0FDbEIsWUFBYSxDQUNaLEdBQUcsRUFBTSxZQUNULEdBQUcsQ0FDSixFQUNBLFFBQVMsRUFBTSxRQUNmLFNBQVUsRUFBTSxTQUNoQixlQUFnQixFQUFNLGVBQ3RCLEtBQU0sRUFBTSxLQUNaLE1BQU8sRUFBTSxNQUNiLE1BQU8sRUFBTSxNQUNiLE1BQU8sRUFBTyxPQUNkLGNBQ0EsT0FBUSxDQUNULENBQUMsQ0FBQSxDQUNGLENBQ0EsSUFBTSxFQUFRLE1BQU0sRUFBYSxFQUFNLENBQVEsQ0FBQyxFQUMxQyxFQUFhLENBQUUsR0FBRyxFQUFNLE9BQU8sRUFBRSxFQUFFLFdBQVksRUFFckQsT0FESSxFQUFPLEVBQUUsRUFBRSxRQUFPLEVBQVcsUUFBVSxFQUFPLEVBQUUsQ0FBQyxPQUM5QyxDQUNOLFNBQ0EsUUFDQSxhQUNBLFNBQVUsR0FBZSxFQUFPLElBQUssR0FBTSxFQUFFLE9BQU8sR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsRUFDakUsZ0JBQ0EsWUFDRCxDQUNELGVDcElBLE9BQU8sZUFBZSxFQUFTLGFBQWMsQ0FBRSxNQUFPLEVBQUssQ0FBQyxFQUM1RCxFQUFRLGFBQWUsSUFBSyxHQUk1QixJQUFJLEdBQ0gsU0FBVSxFQUFjLENBQ3JCLEVBQWEsU0FBYyxXQUMzQixFQUFhLGFBQWtCLGdCQUMvQixFQUFhLFVBQWUsWUFDNUIsRUFBYSxjQUFtQixpQkFDaEMsRUFBYSxXQUFnQixhQUM3QixFQUFhLGVBQW9CLGtCQUNqQyxFQUFhLFNBQWMsV0FDM0IsRUFBYSxhQUFrQixnQkFDL0IsRUFBYSxLQUFVLE9BQ3ZCLEVBQWEsU0FBYyxZQUMzQixFQUFhLE9BQVksU0FDekIsRUFBYSxXQUFnQixjQUM3QixFQUFhLFVBQWUsWUFDNUIsRUFBYSxjQUFtQixpQkFJaEMsRUFBYSxVQUFlLFlBQzVCLEVBQWEsY0FBbUIsaUJBQ2hDLEVBQWEsZUFBb0IsaUJBQ2pDLEVBQWEsbUJBQXdCLHNCQUNyQyxFQUFhLFFBQWEsVUFDMUIsRUFBYSxZQUFpQixlQUk5QixFQUFhLGFBQWtCLGVBSS9CLEVBQWEsaUJBQXNCLG9CQUVuQyxFQUFhLElBQVMsTUFDdEIsRUFBYSxRQUFhLFdBQzFCLEVBQWEsTUFBVyxRQUN4QixFQUFhLFVBQWUsYUFDNUIsRUFBYSxTQUFjLFdBQzNCLEVBQWEsYUFBa0IsZ0JBQy9CLEVBQWEsT0FBWSxTQUN6QixFQUFhLFdBQWdCLGNBQzdCLEVBQWEsS0FBVSxPQUN2QixFQUFhLFNBQWMsWUFDM0IsRUFBYSxLQUFVLE9BQ3ZCLEVBQWEsU0FBYyxZQUMzQixFQUFhLGNBQW1CLGdCQUNoQyxFQUFhLGtCQUF1QixxQkFDcEMsRUFBYSxNQUFXLFFBQ3hCLEVBQWEsVUFBZSxhQUM1QixFQUFhLGVBQW9CLGlCQUNqQyxFQUFhLG1CQUF3QixzQkFDckMsRUFBYSxXQUFnQixhQUM3QixFQUFhLGVBQW9CLGtCQUNqQyxFQUFhLEtBQVUsT0FDdkIsRUFBYSxTQUFjLFlBQzNCLEVBQWEsT0FBWSxTQUN6QixFQUFhLFdBQWdCLGNBRTdCLEVBQWEsTUFBVyxRQUN4QixFQUFhLFVBQWUsYUFDNUIsRUFBYSxTQUFjLFdBQzNCLEVBQWEsYUFBa0IsZ0JBQy9CLEVBQWEsVUFBZSxZQUM1QixFQUFhLGNBQW1CLGdCQUNwQyxFQUFBLENBQUcsSUFBaUIsRUFBUSxhQUFlLEVBQWUsQ0FBQyxFQUFFLGVDMUU3RCxPQUFPLGVBQWUsRUFBUyxhQUFjLENBQUUsTUFBTyxFQUFLLENBQUMsRUFDNUQsRUFBUSxhQUFlLElBQUssR0FDNUIsSUFBSSxFQUFBLEdBQUEsRUFDSixPQUFPLGVBQWUsRUFBUyxlQUFnQixDQUFFLFdBQVksR0FBTSxJQUFLLFVBQVksQ0FBRSxPQUFPLEVBQWtCLFlBQWMsQ0FBRSxDQUFDLGVDSGhJLE9BQU8sZUFBZSxFQUFTLGFBQWMsQ0FBRSxNQUFPLEVBQUssQ0FBQyxFQUM1RCxJQUFJLEVBQUEsR0FBQSxFQW9HSixFQUFRLFFBL0Z3QixVQUFZLENBS3hDLFNBQVMsRUFBVyxFQUFhLENBQzdCLEtBQUssYUFBZSxDQUN4QixDQXNGQSxNQS9FQSxHQUFXLFVBQVUsV0FBYSxTQUFVLEVBQU0sQ0FHOUMsSUFGQSxJQUFJLEVBQVMsQ0FBQyxFQUNWLEVBQVMsRUFBSyxPQUNYLEdBQVUsTUFDYixFQUFPLEtBQUssQ0FBTSxFQUNsQixFQUFTLEVBQU8sT0FFcEIsT0FBTyxDQUNYLEVBT0EsRUFBVyxVQUFVLFlBQWMsU0FBVSxFQUFNLEVBQU8sQ0FFdEQsSUFBSSxFQURVLEtBQUssV0FBVyxDQUNMLENBQUMsQ0FBQyxJQUFJLFNBQVUsRUFBUSxDQUM3QyxPQUFPLEVBQU8sSUFDbEIsQ0FBQyxFQUNELE9BQU8sRUFBTSxLQUFLLFNBQVUsRUFBTSxDQUM5QixPQUFPLEVBQWEsS0FBSyxTQUFVLEVBQVksQ0FDM0MsT0FBTyxJQUFlLENBQzFCLENBQUMsQ0FDTCxDQUFDLENBQ0wsRUF3Q0EsRUFBVyxVQUFVLGVBQWlCLFNBQVUsRUFBTSxDQVlsRCxPQVZJLEVBQUssT0FBUyxFQUFpQixhQUFhLEtBR3JDLEVBQUssUUFBZ0QsT0FBVSxFQUFpQixhQUFhLFVBQzdGLEdBTUosQ0FKc0IsS0FBSyxZQUFZLEVBQU0sQ0FFaEQsRUFBaUIsYUFBYSxVQUNsQyxDQUM2QixDQUNqQyxFQUNPLENBQ1gsRUFDa0IsbUJDcEdsQixFQUFPLFFBQVUsRUFFakIsU0FBUyxFQUFRLEVBQU0sQ0FDckIsR0FBSSxHQUFRLEtBQ1YsT0FBTyxFQUdULEdBQUksT0FBTyxHQUFTLFNBQ2xCLE9BQU8sRUFBWSxDQUFJLEVBR3pCLEdBQUksT0FBTyxHQUFTLFNBQ2xCLE1BQU8sV0FBWSxFQUFPLEVBQVcsQ0FBSSxFQUFJLEVBQVcsQ0FBSSxFQUc5RCxHQUFJLE9BQU8sR0FBUyxXQUNsQixPQUFPLEVBR1QsTUFBVSxNQUFNLDhDQUE4QyxDQUNoRSxDQUlBLFNBQVMsRUFBVyxFQUFNLENBQ3hCLE9BQU8sRUFFUCxTQUFTLEVBQUksRUFBTSxDQUdqQixJQUZBLElBQUksS0FFUSxFQUNWLEdBQUksRUFBSyxLQUFTLEVBQUssR0FBTSxNQUFPLEdBR3RDLE1BQU8sRUFDVCxDQUNGLENBRUEsU0FBUyxFQUFXLEVBQU8sQ0FJekIsSUFIQSxJQUFJLEVBQVMsQ0FBQyxFQUNWLEVBQVEsR0FFTCxFQUFFLEVBQVEsRUFBTSxRQUNyQixFQUFPLEdBQVMsRUFBUSxFQUFNLEVBQU0sRUFHdEMsT0FBTyxFQUVQLFNBQVMsR0FBTSxDQUdiLElBRkEsSUFBSSxFQUFRLEdBRUwsRUFBRSxFQUFRLEVBQU8sUUFDdEIsR0FBSSxFQUFPLEVBQU0sQ0FBQyxNQUFNLEtBQU0sU0FBUyxFQUNyQyxNQUFPLEdBSVgsTUFBTyxFQUNULENBQ0YsQ0FJQSxTQUFTLEVBQVksRUFBTSxDQUN6QixPQUFPLEVBRVAsU0FBUyxFQUFLLEVBQU0sQ0FDbEIsTUFBTyxHQUFRLEdBQVEsRUFBSyxPQUFTLEVBQ3ZDLENBQ0YsQ0FHQSxTQUFTLEdBQUssQ0FDWixNQUFPLEVBQ1QsbUJDNUVBLEVBQU8sUUFBVSxFQUNqQixTQUFTLEVBQVMsRUFBRyxDQUNuQixPQUFPLENBQ1QsbUJDREEsRUFBTyxRQUFVLEVBRWpCLElBQUksRUFBQSxHQUFBLEVBQ0EsRUFBQSxHQUFBLEVBRUEsRUFBVyxHQUNYLEVBQU8sT0FDUCxFQUFPLEdBRVgsRUFBYSxTQUFXLEVBQ3hCLEVBQWEsS0FBTyxFQUNwQixFQUFhLEtBQU8sRUFFcEIsU0FBUyxFQUFhLEVBQU0sRUFBTSxFQUFTLEVBQVMsQ0FDbEQsSUFBSSxFQUNBLEVBRUEsT0FBTyxHQUFTLFlBQWMsT0FBTyxHQUFZLGFBQ25ELEVBQVUsRUFDVixFQUFVLEVBQ1YsRUFBTyxNQUdULEVBQUssRUFBUSxDQUFJLEVBQ2pCLEVBQU8sRUFBVSxHQUFLLEVBRXRCLEVBQVEsRUFBTSxLQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFFeEIsU0FBUyxFQUFRLEVBQU0sRUFBTyxFQUFTLENBQ3JDLElBQUksRUFBUSxPQUFPLEdBQVMsVUFBWSxFQUFnQixFQUFPLENBQUMsRUFDNUQsRUFjSixPQVpJLE9BQU8sRUFBTSxNQUFTLFdBQ3hCLEVBQ0UsT0FBTyxFQUFNLFNBQVksU0FDckIsRUFBTSxRQUNOLE9BQU8sRUFBTSxNQUFTLFNBQ3RCLEVBQU0sS0FDTixJQUFBLEdBRU4sRUFBTSxZQUNKLFNBQVcsRUFBTSxFQUFNLE1BQVEsRUFBTyxJQUFNLEVBQU8sSUFBTSxHQUFHLEVBQUksS0FHN0QsRUFFUCxTQUFTLEdBQVEsQ0FDZixJQUFJLEVBQWUsRUFBUSxPQUFPLENBQUksRUFDbEMsRUFBUyxDQUFDLEVBQ1YsRUFDQSxFQUVKLElBQUksQ0FBQyxHQUFRLEVBQUcsRUFBTSxFQUFPLEVBQVEsRUFBUSxPQUFTLElBQU0sSUFBSSxLQUM5RCxFQUFTLEVBQVMsRUFBUSxFQUFNLENBQU8sQ0FBQyxFQUVwQyxFQUFPLEtBQU8sR0FDaEIsT0FBTyxFQUlYLEdBQUksRUFBSyxVQUFZLEVBQU8sS0FBTyxFQUdqQyxJQUZBLEdBQVUsRUFBVSxFQUFLLFNBQVMsT0FBUyxJQUFNLEVBRTFDLEVBQVMsSUFBTSxFQUFTLEVBQUssU0FBUyxRQUFRLENBR25ELEdBRkEsRUFBWSxFQUFRLEVBQUssU0FBUyxHQUFTLEVBQVEsQ0FBWSxDQUFDLENBQUMsRUFFN0QsRUFBVSxLQUFPLEVBQ25CLE9BQU8sRUFHVCxFQUNFLE9BQU8sRUFBVSxJQUFPLFNBQVcsRUFBVSxHQUFLLEVBQVMsQ0FDL0QsQ0FHRixPQUFPLENBQ1QsQ0FDRixDQUNGLENBRUEsU0FBUyxFQUFTLEVBQU8sQ0FTdkIsT0FSc0IsT0FBTyxHQUFVLFVBQW5DLEdBQStDLFdBQVksRUFDdEQsRUFHTCxPQUFPLEdBQVUsU0FDWixDQUFDLEVBQVUsQ0FBSyxFQUdsQixDQUFDLENBQUssQ0FDZixtQkMxRkEsRUFBTyxRQUFVLEVBRWpCLElBQUksRUFBQSxHQUFBLEVBRUEsRUFBVyxFQUFhLFNBQ3hCLEVBQU8sRUFBYSxLQUNwQixFQUFPLEVBQWEsS0FFeEIsRUFBTSxTQUFXLEVBQ2pCLEVBQU0sS0FBTyxFQUNiLEVBQU0sS0FBTyxFQUViLFNBQVMsRUFBTSxFQUFNLEVBQU0sRUFBUyxFQUFTLENBQ3ZDLE9BQU8sR0FBUyxZQUFjLE9BQU8sR0FBWSxhQUNuRCxFQUFVLEVBQ1YsRUFBVSxFQUNWLEVBQU8sTUFHVCxFQUFhLEVBQU0sRUFBTSxFQUFVLENBQU8sRUFFMUMsU0FBUyxFQUFTLEVBQU0sRUFBUyxDQUMvQixJQUFJLEVBQVMsRUFBUSxFQUFRLE9BQVMsR0FDbEMsRUFBUSxFQUFTLEVBQU8sU0FBUyxRQUFRLENBQUksRUFBSSxLQUNyRCxPQUFPLEVBQVEsRUFBTSxFQUFPLENBQU0sQ0FDcEMsQ0FDRixlQzFCQSxJQUFJLEVBQUEsR0FBQSxFQUFnQyxpQkFBb0IsU0FBVSxFQUFLLENBQ25FLE9BQVEsR0FBTyxFQUFJLFdBQWMsRUFBTSxDQUFFLFFBQVcsQ0FBSSxDQUM1RCxFQUNBLE9BQU8sZUFBZSxFQUFTLGFBQWMsQ0FBRSxNQUFPLEVBQUssQ0FBQyxFQUM1RCxJQUFJLEVBQXFCLEVBQUEsR0FBQSxDQUEyQyxFQXNGcEUsRUFBUSxRQWpGK0IsVUFBWSxDQUMvQyxTQUFTLEdBQW9CLENBS3pCLEtBQUssa0JBQW9CLENBQUMsQ0FDOUIsQ0F3RUEsT0F2RUEsT0FBTyxlQUFlLEVBQWtCLFVBQVcsZ0JBQWlCLENBSWhFLElBQUssVUFBWSxDQUNiLE9BQU8sS0FBSyxpQkFDaEIsRUFDQSxXQUFZLEdBQ1osYUFBYyxFQUNsQixDQUFDLEVBWUQsRUFBa0IsVUFBVSxlQUFpQixTQUFVLEVBQU8sQ0FDMUQsT0FBTyxLQUFLLGtCQUFrQixLQUFLLFNBQVUsRUFBTyxDQUNoRCxJQUFJLEVBQVEsRUFBTSxHQUFJLEVBQU0sRUFBTSxHQUNsQyxPQUFPLEdBQVMsR0FBUyxFQUFRLENBQ3JDLENBQUMsQ0FDTCxFQU1BLEVBQWtCLFVBQVUsZUFBaUIsU0FBVSxFQUFRLENBQzNELE9BQU8sS0FBSyxlQUFlLEVBQU8sRUFBRSxHQUFLLEtBQUssZUFBZSxFQUFPLEVBQUUsQ0FDMUUsRUFLQSxFQUFrQixVQUFVLFVBQVksU0FBVSxFQUFNLENBQ3BELE9BQU8sS0FBSyxlQUFlLEVBQUssS0FBSyxDQUN6QyxFQUtBLEVBQWtCLFVBQVUsT0FBUyxTQUFVLEVBQU0sQ0FDakQsS0FBSyxZQUFZLEVBQUssS0FBSyxDQUMvQixFQUtBLEVBQWtCLFVBQVUsWUFBYyxTQUFVLEVBQU8sQ0FDdkQsS0FBSyxrQkFBa0IsS0FBSyxDQUFLLENBQ3JDLEVBT0EsRUFBa0IsVUFBVSxzQkFBd0IsU0FBVSxFQUFZLEVBQWtCLENBQ3hGLElBQUksRUFBUSxNQUNYLEVBQUcsRUFBbUIsUUFBQSxDQUFTLEVBQVksU0FBVSxFQUFhLENBRTNELEVBQWlCLFNBQVMsRUFBWSxJQUFJLEdBQzFDLEVBQU0sT0FBTyxDQUFXLENBRWhDLENBQUMsQ0FDTCxFQUNPLENBQ1gsRUFDa0IsZUNwRWxCLE9BQU8sZUFBZSxFQUFTLGFBQWMsQ0FBRSxNQUFPLEVBQUssQ0FBQyxFQUM1RCxFQUFRLGFBQWUsRUFBUSxXQUFhLEVBQVEsV0FBYSxFQUFRLFFBQVUsSUFBSyxHQUN4RixTQUFTLEVBQVEsRUFBSSxFQUFJLENBQ3JCLE9BQU8sRUFBSyxDQUNoQixDQUNBLEVBQVEsUUFBVSxFQUNsQixTQUFTLEVBQVcsRUFBTyxFQUFPLEVBQU8sRUFBUyxDQUM5QyxJQUFJLEVBQU0sRUFBTSxPQUNaLEVBQUksRUFDUixLQUFPLEdBQUssQ0FDUixJQUFJLEVBQU8sSUFBUSxFQUNmLEVBQVMsRUFBSSxFQUNiLEVBQUssRUFBTyxFQUFNLEVBQU8sRUFDekIsRUFBTSxHQUdOLEVBQUksRUFBUyxFQUNiLEdBQU8sRUFBTyxFQUV0QixDQUNBLE9BQU8sQ0FDWCxDQUNBLEVBQVEsV0FBYSxFQUNyQixTQUFTLEVBQVcsRUFBTyxFQUFPLEVBQU8sRUFBUyxDQUM5QyxJQUFJLEVBQU0sRUFBTSxPQUNaLEVBQUksRUFDUixLQUFPLEdBQUssQ0FDUixJQUFJLEVBQU8sSUFBUSxFQUNmLEVBQVMsRUFBSSxFQUNiLEVBQUssRUFBTSxHQUFTLENBQUssR0FDekIsRUFBSSxFQUFTLEVBQ2IsR0FBTyxFQUFPLEdBR2QsRUFBTSxDQUVkLENBQ0EsT0FBTyxDQUNYLENBQ0EsRUFBUSxXQUFhLEVBQ3JCLFNBQVMsRUFBYSxFQUFPLEVBQU8sRUFBTyxFQUFTLENBQ2hELElBQUksRUFBUyxFQUFXLEVBQU8sRUFBTyxDQUFJLEVBQzFDLE9BQU8sSUFBVyxFQUFNLFFBQVUsQ0FBQyxFQUFLLEVBQU8sRUFBTSxFQUFPLENBQ2hFLENBQ0EsRUFBUSxhQUFlLGVDNUN2QixPQUFPLGVBQWUsRUFBUyxhQUFjLENBQUUsTUFBTyxFQUFLLENBQUMsRUFDNUQsRUFBUSxpQkFBbUIsSUFBSyxHQUNoQyxJQUFNLEVBQUEsR0FBQSxFQTRFTixFQUFRLGlCQUFtQixLQXhFSixDQUtuQixZQUFZLEVBQVEsQ0FDaEIsS0FBSyxPQUFTLENBQUMsQ0FBQyxFQUNoQixJQUFJLEVBQVMsc0JBQ1AsRUFBUyxFQUFPLE9BRXRCLElBREEsRUFBTyxVQUFZLElBQ04sQ0FDVCxJQUFJLEVBQVMsRUFBTyxLQUFLLENBQU0sRUFDL0IsR0FBSSxDQUFDLEVBQ0QsTUFFSixJQUFJLEVBQVEsRUFBTyxNQUNmLEVBQU8sV0FBVyxDQUFLLElBQU0sSUFDN0IsRUFBTyxXQUFXLEVBQVEsQ0FBQyxJQUFNLEtBQ2pDLEdBQVMsR0FFYixJQUFJLEVBQVksRUFBUSxFQUd4QixHQUFJLEVBQVMsRUFDVCxNQUVKLEtBQUssT0FBTyxLQUFLLENBQVMsRUFDMUIsRUFBTyxVQUFZLENBQ3ZCLENBQ0osQ0FDQSxJQUFJLE1BQU8sQ0FDUCxPQUFPLEtBQUssT0FBTyxNQUN2QixDQUtBLGdCQUFnQixFQUFLLENBQ2pCLE1BQU8sQ0FBQyxLQUFLLGdCQUFnQixFQUFJLEtBQUssRUFBRyxLQUFLLGdCQUFnQixFQUFJLEdBQUcsQ0FBQyxDQUMxRSxDQUtBLGdCQUFnQixFQUFPLENBQ25CLE1BQU8sQ0FDSCxNQUFPLEtBQUssZ0JBQWdCLEVBQU0sRUFBRSxFQUNwQyxJQUFLLEtBQUssZ0JBQWdCLEVBQU0sRUFBRSxDQUN0QyxDQUNKLENBS0EsZ0JBQWdCLEVBQUssQ0FJakIsT0FEWSxLQUFLLE9BQU8sRUFBSSxLQUFPLEdBQ3BCLEVBQUksTUFDdkIsQ0FLQSxnQkFBZ0IsRUFBTyxDQUNuQixJQUFNLEdBQWEsRUFBRyxFQUFXLFdBQUEsQ0FBWSxLQUFLLE9BQVEsQ0FBSyxFQUMvRCxNQUFPLENBQ0gsS0FBTSxFQUNOLE9BQVEsRUFBUSxLQUFLLE9BQU8sRUFBWSxFQUM1QyxDQUNKLENBQ0osZUNuR0EsT0FBTyxlQUFlLEVBQVMsYUFBYyxDQUFFLE1BQU8sRUFBSyxDQUFDLEVBQzVELEVBQVEsZUFBaUIsSUFBSyxHQUM5QixJQUFJLEVBQUEsR0FBQSxFQTRDSixFQUFRLGVBM0M0QixVQUFZLENBQzVDLFNBQVMsRUFBZSxFQUFNLENBQzFCLEtBQUssT0FBUyxJQUFJLEVBQW9CLGlCQUFpQixDQUFJLENBQy9ELENBc0NBLE1BckNBLEdBQWUsVUFBVSxtQkFBcUIsU0FBVSxFQUFNLEVBQVMsQ0FDbkUsSUFBSSxFQUFZLEVBQUssTUFDakIsRUFBTyxFQUFLLElBQUksTUFBTSxLQUN0QixFQUFTLEVBQUssSUFBSSxNQUFNLE9BRTVCLEdBQUksRUFBUSxRQUFVLElBQUEsR0FBVyxDQUM3QixJQUFJLEVBQWUsRUFBUSxNQUMzQixPQUFPLEVBQVUsR0FBSyxDQUMxQixDQUVBLEdBQUksRUFBUSxPQUFTLElBQUEsSUFBYSxFQUFRLFNBQVcsSUFBQSxHQUFXLENBQzVELElBQUksRUFBWSxFQUFPLEVBQVEsS0FVM0IsT0FQQSxFQUFRLE9BQVMsRUFDVixLQUFLLE9BQU8sZ0JBQWdCLENBQy9CLEtBQU0sRUFDTixPQUFRLEVBQVEsTUFDcEIsQ0FBQyxFQUdNLEtBQUssT0FBTyxnQkFBZ0IsQ0FDL0IsS0FBTSxFQUNFLFFBQ1osQ0FBQyxDQUVULENBRUEsR0FBSSxFQUFRLE9BQVMsSUFBQSxJQUFhLEVBQVEsS0FBTyxFQUFHLENBQ2hELElBQUksRUFBWSxFQUFPLEVBQVEsS0FDL0IsT0FBTyxLQUFLLE9BQU8sZ0JBQWdCLENBQy9CLEtBQU0sRUFDRSxRQUNaLENBQUMsQ0FDTCxDQUNBLE9BQU8sRUFBVSxFQUNyQixFQUNPLENBQ1gsRUFDeUIsZUM5Q3pCLElBQUksRUFBQSxHQUFBLEVBQWdDLGlCQUFvQixTQUFVLEVBQUssQ0FDbkUsT0FBUSxHQUFPLEVBQUksV0FBYyxFQUFNLENBQUUsUUFBVyxDQUFJLENBQzVELEVBQ0EsT0FBTyxlQUFlLEVBQVMsYUFBYyxDQUFFLE1BQU8sRUFBSyxDQUFDLEVBQzVELEVBQVEsa0JBQW9CLEVBQzVCLElBQUksRUFBeUIsRUFBQSxHQUFBLENBQWlELEVBQzFFLEVBQXNCLEVBQUEsR0FBQSxDQUE4QyxFQUNwRSxFQUFBLEdBQUEsRUFPSixTQUFTLEVBQWtCLEVBQVMsRUFBUyxFQUFTLENBQ2xELElBQUksRUFBa0IsRUFBUSxpQkFBbUIsQ0FBQyxFQUM5QyxFQUFvQixJQUFJLEVBQW9CLFFBQzVDLEVBQWEsSUFBSSxFQUF1QixRQUFRLENBQU8sRUFDdkQsRUFBTyxFQUFRLFVBQVUsRUFDekIsRUFBaUIsSUFBSSxFQUFpQixlQUFlLENBQUksRUFRekQsRUFBVyxFQUFRLFNBUDRCLEVBQU0sRUFBVyxDQUNoRSxJQUFJLEVBQVEsRUFBZSxtQkFBbUIsRUFBTSxDQUFTLEVBQ3pELE1BQWtCLGVBQWUsQ0FBSyxFQUcxQyxPQUFPLEVBQVEsT0FBTyxFQUFNLENBQVMsQ0FDekMsQ0FDd0MsRUFrQnhDLE9BakJBLE9BQU8sS0FBSyxDQUFRLENBQUMsQ0FBQyxRQUFRLFNBQVUsRUFBVSxDQUM5QyxJQUFJLEVBQWMsRUFBUyxHQWMzQixFQUFTLEdBQVksU0FiYyxFQUFNLENBRXJDLEtBQWtCLHNCQUFzQixFQUFNLENBQWUsRUFFekQsR0FBVyxZQUFZLEVBQU0sQ0FBZSxHQUczQyxFQUdMLE9BQU8sRUFBWSxDQUFJLENBQzNCLENBR0osQ0FBQyxFQUNNLENBQ1gsZUMvQ0EsSUFBSSxFQUFBLEdBQUEsRUFBZ0MsaUJBQW9CLFNBQVUsRUFBSyxDQUNuRSxPQUFRLEdBQU8sRUFBSSxXQUFjLEVBQU0sQ0FBRSxRQUFXLENBQUksQ0FDNUQsRUFDQSxPQUFPLGVBQWUsRUFBUyxhQUFjLENBQUUsTUFBTyxFQUFLLENBQUMsRUFDNUQsRUFBUSxrQkFBb0IsRUFBUSxXQUFhLEVBQVEsa0JBQW9CLElBQUssR0FFbEYsRUFBUSxXQURxQixFQUFBLEdBQUEsQ0FDUixDQUFBLENBQXVCLFFBRTVDLEVBQVEsa0JBRGtCLEVBQUEsR0FBQSxDQUNFLENBQUEsQ0FBb0IsUUFDaEQsSUFBSSxFQUFBLEdBQUEsRUFDSixPQUFPLGVBQWUsRUFBUyxvQkFBcUIsQ0FBRSxXQUFZLEdBQU0sSUFBSyxVQUFZLENBQUUsT0FBTyxFQUFzQixpQkFBbUIsQ0FBRSxDQUFDLGlCQ1I5SSxPQUFPLGVBQWUsRUFBUyxhQUFjLENBQzNDLE1BQU8sRUFDVCxDQUFDLEVBQ0QsRUFBUSxPQUFTLEVBQVEsUUFBVSxJQUFLLEdBQ3hDLElBQUksRUFBQSxHQUFBLEVBQ0EsRUFBZ0Isc0JBQ2hCLEVBQVMsU0FBa0IsRUFBUyxDQUN0QyxHQUFJLENBQ0YsU0FDQSxZQUNBLFFBQ0EsU0FDQSxVQUNBLGFBQ0UsRUFDQSxFQUFTLElBQUksRUFBb0IsV0FBVyxDQUFPLEVBQ3ZELE1BQU8sQ0FDTCxDQUFDLEVBQU8sS0FBSyxFQUFNLENBQ1osS0FBTyxlQUFlLENBQUksRUFJL0IsSUFBSyxJQUFJLEtBRE0sRUFBVSxDQUNBLENBQUMsQ0FBQyxTQUFTLENBQWEsRUFBRyxDQUNsRCxJQUNJLEVBQU8sRUFBTSxHQUNiLEVBQXdCLEVBQU0sT0FBNEQsRUFDMUYsRUFBUSxDQUFDLEVBQU8sRUFBUSxFQUFLLE1BQU0sRUFLdkMsRUFBTyxFQUFNLElBSk8sRUFBVSw0QkFBa0UsS0FBYSxDQUMzRyxRQUFTLEVBQVEsTUFBTSxDQUFLLEVBQzVCLElBQUssRUFBTSxpQkFBaUIsRUFBTyxFQUFLLFVBQVUsTUFBTSxDQUFDLENBQzNELENBQ3FCLENBQUMsQ0FDeEIsQ0FDRixDQUNGLENBQ0YsRUFDQSxFQUFRLE9BQVMsRUFLakIsRUFBUSxRQUFVLENBSGhCLE9BQVEsRUFDUixNQUFPLENBRVMsVUNqQ2xCLE1BQU0sR0FBOEIsQ0FDbEMsQ0FBRSxPQUFRLCtCQUFnQyxLQUFNLEVBQWMsQ0FBeUIsQ0FBRSxFQUN6RixDQUFFLE9BQVEsa0JBQW1CLEtBQU0sRUFBY0csR0FBQUEsT0FBYSxDQUFFLEVBQ2hFLENBQUUsT0FBUSx1QkFBd0IsS0FBTSxFQUFjLENBQWlCLENBQUUsQ0FDM0UsRUFFQSxlQUFzQixHQUFlLEVBQWtCLEVBQXdDLENBQzdGLFFBQVEsS0FBSyxhQUFhLEdBQVUsRUFDcEMsSUFBTSxFQUFXLEVBQUssUUFBUSxDQUFRLEVBQ2xDLEVBQ0osR0FBSSxDQUNGLEVBQU8sTUFBTSxHQUFLLENBQUUsTUFBTyxDQUFDLENBQVEsRUFBRyxXQUFVLGFBQWMsQ0FBQyxFQUFlLENBQVEsQ0FBRSxFQUFHLENBQVEsQ0FDdEcsT0FBUyxFQUFPLENBRWQsT0FEQSxRQUFRLE1BQU0sR0FBRyxFQUFTLElBQUksYUFBaUIsTUFBUSxFQUFNLFFBQVUsT0FBTyxDQUFLLEdBQUcsRUFDL0UsQ0FDVCxDQUNBLElBQU0sRUFBUyxJQUFJLEVBQ2YsRUFBVyxFQUNmLElBQUssSUFBTSxLQUFRLE9BQU8sT0FBTyxFQUFLLGFBQWEsRUFBRyxDQUNwRCxJQUFNLEdBQWUsRUFBSyxRQUFVLENBQUMsRUFBQSxDQUFHLElBQUssR0FBVSxHQUFHLEVBQUssU0FBUyxHQUFHLEVBQU0sSUFBTSxFQUFFLE1BQU0sRUFBTSxTQUFTLEVBQzlHLElBQUssSUFBTSxLQUFjLElBQUksSUFBSSxDQUFXLEVBQzFDLFFBQVEsTUFBTSxDQUFVLEVBQ3hCLEVBQVcsQ0FFZixDQUNBLElBQU0sRUFBVSxJQUFJLElBQ3BCLElBQUssR0FBTSxDQUFFLFlBQVksRUFBSyxPQUFRLENBQ3BDLElBQU0sRUFBTSxHQUFHLEVBQU8sU0FBUyxHQUFHLEVBQU8sUUFDekMsR0FBSSxFQUFRLElBQUksQ0FBRyxFQUFHLFNBQ3RCLEVBQVEsSUFBSSxDQUFHLEVBRWYsSUFBTSxFQUFlLEVBQU8sYUFBZSxFQUFPLElBQU0sRUFBTyxNQUFRLEVBQU8sYUFDeEUsRUFBTyxFQUFPLElBQ2pCLE1BQU07Q0FBSSxDQUFDLENBQ1gsTUFBTSxFQUFlLEVBQU8sS0FBSyxDQUFDLENBQ2xDLEtBQUs7Q0FBSSxFQUNOLEVBQVMsTUFBTSxFQUFPLFNBQVMsRUFBTSxDQUN6QyxTQUFVLEVBQU8sU0FDakIsSUFBSyxNQUNMLFFBQVMsQ0FBQyxDQUFFLFNBQVUsV0FBWSxPQUFRLENBQUUsVUFBVyxDQUFrQixDQUFFLENBQUMsRUFDNUUsUUFDRixDQUFDLEVBQ0QsSUFBSyxJQUFNLEtBQVcsRUFBTyxTQUMzQixRQUFRLE1BQ04sR0FBRyxFQUFPLFNBQVMsR0FBRyxFQUFlLEVBQVEsS0FBSyxHQUFHLEVBQVEsT0FBTyxJQUFJLEVBQVEsUUFBUSxJQUFJLEVBQVEsT0FBTyxFQUM3RyxFQUNBLEVBQVcsQ0FFZixDQUNBLE9BQU8sQ0FDVCJ9