@markdown-next/parser 1.1.0 → 1.1.1

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.
Files changed (2) hide show
  1. package/dist/index.mjs +3 -3
  2. package/package.json +1 -1
package/dist/index.mjs CHANGED
@@ -1,9 +1,9 @@
1
- var I=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(r,t)=>(typeof require<"u"?require:r)[t]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});import{unified as ne}from"unified";import se from"remark-parse";import ie from"remark-gfm";import ae from"remark-rehype";import le from"rehype-stringify";import ce from"remark-math";import me from"rehype-sanitize";import ue from"rehype-raw";import{defaultSchema as x}from"rehype-sanitize";var H=["math","mrow","mi","mn","mo","mfrac","msup","msub","munder","mover","munderover","msqrt","mroot","mtext","mspace","menclose","mpadded","mphantom","mtable","mtr","mtd","mlabeledtr","maligngroup","malignmark","mstyle","merror","maction","semantics","annotation","annotation-xml"],$={math:["display","class","style","xmlns"],mrow:["class","style"],mi:["class","style","mathvariant"],mn:["class","style"],mo:["class","style","fence","separator","stretchy","symmetric","largeop","movablelimits","accent","lspace","rspace","form"],mfrac:["class","style","linethickness","numalign","denomalign","bevelled"],msup:["class","style","superscriptshift"],msub:["class","style","subscriptshift"],munder:["class","style","accentunder"],mover:["class","style","accent"],munderover:["class","style","accent","accentunder"],msqrt:["class","style"],mroot:["class","style"],mtext:["class","style","mathvariant"],mspace:["class","style","width","height","depth"],menclose:["class","style","notation"],mpadded:["class","style","width","height","depth","lspace","voffset"],mphantom:["class","style"],mtable:["class","style","align","rowalign","columnalign","groupalign","alignmentscope","columnwidth","width","rowspacing","columnspacing","rowlines","columnlines","frame","framespacing","equalrows","equalcolumns","displaystyle","side","minlabelspacing"],mtr:["class","style","rowalign","columnalign","groupalign"],mtd:["class","style","rowspan","columnspan","rowalign","columnalign","groupalign"],mlabeledtr:["class","style","rowalign","columnalign","groupalign"],maligngroup:["class","style","groupalign"],malignmark:["class","style","edge"],mstyle:["class","style","scriptlevel","displaystyle","scriptsizemultiplier","scriptminsize","infixlinebreakstyle","decimalpoint","mathvariant","mathsize","mathcolor","mathbackground"],merror:["class","style"],maction:["class","style","actiontype","selection"],semantics:["class","style"],annotation:["class","style","encoding"],"annotation-xml":["class","style","encoding"]};var v=(e=[])=>({...x,tagNames:[...x.tagNames||[],...H,...e],attributes:{...x.attributes,img:["src","alt","title","width","height","style","class"],code:[["className",/^language-./,"math-inline","math-display"]],...$,...e.reduce((r,t)=>(r[t]=["class","className","style","id","prop","src"],r),{})},protocols:{...x.protocols,src:["http","https","data","file"]}});var R=(function(e){if(e==null)return Z;if(typeof e=="function")return A(e);if(typeof e=="object")return Array.isArray(e)?q(e):B(e);if(typeof e=="string")return K(e);throw new Error("Expected function, string, or object as test")});function q(e){let r=[],t=-1;for(;++t<e.length;)r[t]=R(e[t]);return A(o);function o(...i){let l=-1;for(;++l<r.length;)if(r[l].apply(this,i))return!0;return!1}}function B(e){let r=e;return A(t);function t(o){let i=o,l;for(l in e)if(i[l]!==r[l])return!1;return!0}}function K(e){return A(r);function r(t){return t&&t.type===e}}function A(e){return r;function r(t,o,i){return!!(Y(t)&&e.call(this,t,typeof o=="number"?o:void 0,i||void 0))}}function Z(){return!0}function Y(e){return e!==null&&typeof e=="object"&&"type"in e}function _(e){return"\x1B[33m"+e+"\x1B[39m"}var j=[],S=!0,W=!1,C="skip";function M(e,r,t,o){let i;typeof r=="function"&&typeof t!="function"?(o=t,t=r):i=r;let l=R(i),c=o?-1:1;n(e,void 0,[])();function n(a,s,u){let d=a&&typeof a=="object"?a:{};if(typeof d.type=="string"){let m=typeof d.tagName=="string"?d.tagName:typeof d.name=="string"?d.name:void 0;Object.defineProperty(k,"name",{value:"node ("+_(a.type+(m?"<"+m+">":""))+")"})}return k;function k(){let m=j,y,h,g;if((!r||l(a,s,u[u.length-1]||void 0))&&(m=Q(t(a,u)),m[0]===W))return m;if("children"in a&&a.children){let w=a;if(w.children&&m[0]!==C)for(h=(o?w.children.length:-1)+c,g=u.concat(w);h>-1&&h<w.children.length;){let P=w.children[h];if(y=n(P,h,g)(),y[0]===W)return y;h=typeof y[1]=="number"?y[1]:h+c}}return m}}}function Q(e){return Array.isArray(e)?e:typeof e=="number"?[S,e]:e==null?j:[e]}function O(e,r,t,o){let i,l,c;typeof r=="function"&&typeof t!="function"?(l=void 0,c=r,i=t):(l=r,c=t,i=o),M(e,l,n,i);function n(a,s){let u=s[s.length-1],d=u?u.children.indexOf(a):void 0;return c(a,d,u)}}var z=(e=[])=>r=>{let t=v(e),o=new Set(t.tagNames||[]);O(r,"element",(i,l,c)=>{if(!c||l===void 0)return;let n=i.tagName;if(!o.has(n)&&/[^a-zA-Z]/.test(n)){let s=`<${n}`;if(i.properties)for(let[k,m]of Object.entries(i.properties))Array.isArray(m)?s+=` ${k}="${m.join(" ")}"`:m!=null&&(s+=` ${k}="${m}"`);let u="";if(i.children&&i.children.length>0){let k=m=>m.map(y=>{if(y.type==="text")return y.value;if(y.type==="element"){let h=y,g=`<${h.tagName}`;if(h.properties)for(let[w,P]of Object.entries(h.properties))Array.isArray(P)?g+=` ${w}="${P.join(" ")}"`:P!=null&&(g+=` ${w}="${P}"`);return g+=">",h.children&&(g+=k(h.children)),g+=`</${h.tagName}>`,g}return""}).join("");u=k(i.children)}s+=`>${u}</${n}>`;let d={type:"text",value:s};c.children[l]=d}})};import pe from"rehype-mathjax/chtml";var V="https://cdn.jsdelivr.net/npm/mathjax@3/es5/output/chtml/fonts/woff-v2",U={chtml:{fontURL:V}};var ee=(e,r)=>{let t=0;for(let o=r-1;o>=0&&e[o]==="\\";o--)t++;return t},L=(e,r,t)=>e[r]!=="\\"||e[r+1]!==t?!1:ee(e,r)%2===0,D=(e,r,t)=>{for(let o=r;o<e.length-1;o++)if(L(e,o,t))return o;return-1},F=(e,r)=>r===0||e[r-1]===`
1
+ var I=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(r,t)=>(typeof require<"u"?require:r)[t]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});import{unified as ne}from"unified";import se from"remark-parse";import ie from"remark-gfm";import ae from"remark-rehype";import le from"rehype-stringify";import ce from"remark-math";import me from"rehype-sanitize";import ue from"rehype-raw";import{defaultSchema as x}from"rehype-sanitize";var _=["math","mrow","mi","mn","mo","mfrac","msup","msub","munder","mover","munderover","msqrt","mroot","mtext","mspace","menclose","mpadded","mphantom","mtable","mtr","mtd","mlabeledtr","maligngroup","malignmark","mstyle","merror","maction","semantics","annotation","annotation-xml"],H={math:["display","class","style","xmlns"],mrow:["class","style"],mi:["class","style","mathvariant"],mn:["class","style"],mo:["class","style","fence","separator","stretchy","symmetric","largeop","movablelimits","accent","lspace","rspace","form"],mfrac:["class","style","linethickness","numalign","denomalign","bevelled"],msup:["class","style","superscriptshift"],msub:["class","style","subscriptshift"],munder:["class","style","accentunder"],mover:["class","style","accent"],munderover:["class","style","accent","accentunder"],msqrt:["class","style"],mroot:["class","style"],mtext:["class","style","mathvariant"],mspace:["class","style","width","height","depth"],menclose:["class","style","notation"],mpadded:["class","style","width","height","depth","lspace","voffset"],mphantom:["class","style"],mtable:["class","style","align","rowalign","columnalign","groupalign","alignmentscope","columnwidth","width","rowspacing","columnspacing","rowlines","columnlines","frame","framespacing","equalrows","equalcolumns","displaystyle","side","minlabelspacing"],mtr:["class","style","rowalign","columnalign","groupalign"],mtd:["class","style","rowspan","columnspan","rowalign","columnalign","groupalign"],mlabeledtr:["class","style","rowalign","columnalign","groupalign"],maligngroup:["class","style","groupalign"],malignmark:["class","style","edge"],mstyle:["class","style","scriptlevel","displaystyle","scriptsizemultiplier","scriptminsize","infixlinebreakstyle","decimalpoint","mathvariant","mathsize","mathcolor","mathbackground"],merror:["class","style"],maction:["class","style","actiontype","selection"],semantics:["class","style"],annotation:["class","style","encoding"],"annotation-xml":["class","style","encoding"]};var v=(e=[])=>({...x,tagNames:[...x.tagNames||[],..._,...e],attributes:{...x.attributes,img:["src","alt","title","width","height","style","class"],code:[["className",/^language-./,"math-inline","math-display"]],...H,...e.reduce((r,t)=>(r[t]=["class","className","style","id","prop","src"],r),{})},protocols:{...x.protocols,src:["http","https","data","file"]}});var R=(function(e){if(e==null)return Z;if(typeof e=="function")return A(e);if(typeof e=="object")return Array.isArray(e)?q(e):B(e);if(typeof e=="string")return K(e);throw new Error("Expected function, string, or object as test")});function q(e){let r=[],t=-1;for(;++t<e.length;)r[t]=R(e[t]);return A(o);function o(...i){let l=-1;for(;++l<r.length;)if(r[l].apply(this,i))return!0;return!1}}function B(e){let r=e;return A(t);function t(o){let i=o,l;for(l in e)if(i[l]!==r[l])return!1;return!0}}function K(e){return A(r);function r(t){return t&&t.type===e}}function A(e){return r;function r(t,o,i){return!!(Y(t)&&e.call(this,t,typeof o=="number"?o:void 0,i||void 0))}}function Z(){return!0}function Y(e){return e!==null&&typeof e=="object"&&"type"in e}function $(e){return"\x1B[33m"+e+"\x1B[39m"}var j=[],S=!0,W=!1,C="skip";function M(e,r,t,o){let i;typeof r=="function"&&typeof t!="function"?(o=t,t=r):i=r;let l=R(i),c=o?-1:1;n(e,void 0,[])();function n(a,s,u){let d=a&&typeof a=="object"?a:{};if(typeof d.type=="string"){let m=typeof d.tagName=="string"?d.tagName:typeof d.name=="string"?d.name:void 0;Object.defineProperty(k,"name",{value:"node ("+$(a.type+(m?"<"+m+">":""))+")"})}return k;function k(){let m=j,y,h,g;if((!r||l(a,s,u[u.length-1]||void 0))&&(m=Q(t(a,u)),m[0]===W))return m;if("children"in a&&a.children){let w=a;if(w.children&&m[0]!==C)for(h=(o?w.children.length:-1)+c,g=u.concat(w);h>-1&&h<w.children.length;){let P=w.children[h];if(y=n(P,h,g)(),y[0]===W)return y;h=typeof y[1]=="number"?y[1]:h+c}}return m}}}function Q(e){return Array.isArray(e)?e:typeof e=="number"?[S,e]:e==null?j:[e]}function O(e,r,t,o){let i,l,c;typeof r=="function"&&typeof t!="function"?(l=void 0,c=r,i=t):(l=r,c=t,i=o),M(e,l,n,i);function n(a,s){let u=s[s.length-1],d=u?u.children.indexOf(a):void 0;return c(a,d,u)}}var z=(e=[])=>r=>{let t=v(e),o=new Set(t.tagNames||[]);O(r,"element",(i,l,c)=>{if(!c||l===void 0)return;let n=i.tagName;if(!o.has(n)&&/[^a-zA-Z]/.test(n)){let s=`<${n}`;if(i.properties)for(let[k,m]of Object.entries(i.properties))Array.isArray(m)?s+=` ${k}="${m.join(" ")}"`:m!=null&&(s+=` ${k}="${m}"`);let u="";if(i.children&&i.children.length>0){let k=m=>m.map(y=>{if(y.type==="text")return y.value;if(y.type==="element"){let h=y,g=`<${h.tagName}`;if(h.properties)for(let[w,P]of Object.entries(h.properties))Array.isArray(P)?g+=` ${w}="${P.join(" ")}"`:P!=null&&(g+=` ${w}="${P}"`);return g+=">",h.children&&(g+=k(h.children)),g+=`</${h.tagName}>`,g}return""}).join("");u=k(i.children)}s+=`>${u}</${n}>`;let d={type:"text",value:s};c.children[l]=d}})};import pe from"rehype-mathjax/chtml";var V="https://cdn.jsdelivr.net/npm/mathjax@3/es5/output/chtml/fonts/woff-v2",U={chtml:{fontURL:V}};var ee=(e,r)=>{let t=0;for(let o=r-1;o>=0&&e[o]==="\\";o--)t++;return t},L=(e,r,t)=>e[r]!=="\\"||e[r+1]!==t?!1:ee(e,r)%2===0,D=(e,r,t)=>{for(let o=r;o<e.length-1;o++)if(L(e,o,t))return o;return-1},F=(e,r)=>r===0||e[r-1]===`
2
2
  `,re=(e,r)=>{let t=e[r];if(t!=="`"&&t!=="~")return null;let o=0;for(let i=r;i<e.length&&e[i]===t;i++)o++;return o<3?null:{fenceChar:t,fenceLength:o}},te=(e,r)=>F(e,r)?e[r]===" "?!0:e.slice(r,r+4)===" ":!1,oe=e=>{let r="",t=!1,o=null,i=0,l=!1,c=0;for(let n=0;n<e.length;){if(!t&&!l&&te(e,n)){let a=e.indexOf(`
3
3
  `,n);if(a===-1)return r+e.slice(n);r+=e.slice(n,a+1),n=a+1;continue}if(!l&&F(e,n)){let a=re(e,n);if(a){t?o===a.fenceChar&&a.fenceLength>=i&&(t=!1,o=null,i=0):(t=!0,o=a.fenceChar,i=a.fenceLength);let s=e.indexOf(`
4
4
  `,n);if(s===-1)return r+e.slice(n);r+=e.slice(n,s+1),n=s+1;continue}}if(!t){if(!l&&e[n]==="`"){let a=0;for(let s=n;s<e.length&&e[s]==="`";s++)a++;l=!0,c=a,r+=e.slice(n,n+a),n+=a;continue}if(l){if(e[n]==="`"){let a=0;for(let s=n;s<e.length&&e[s]==="`";s++)a++;if(a>=c){r+=e.slice(n,n+c),n+=c,l=!1,c=0;continue}}r+=e[n],n++;continue}}if(!t&&!l){if(L(e,n,"(")){let a=D(e,n+2,")");if(a!==-1){let s=e.slice(n+2,a);r+=`$${s}$`,n=a+2;continue}}if(L(e,n,"[")){let a=D(e,n+2,"]");if(a!==-1){let s=e.slice(n+2,a),u=s.startsWith(`
5
5
  `)?"":`
6
6
  `,d=s.endsWith(`
7
7
  `)?"":`
8
- `;r+=`$$${u}${s}${d}$$`,n=a+2;continue}}}r+=e[n],n++}return r},G=function(){let r=this.parser||this.Parser;r&&(this.Parser=function(o,i){let l=o;if(typeof o=="string"){let c=oe(o);l=c,i&&typeof i.value=="string"&&(i.value=c)}return r(l,i)},this.parser&&(this.parser=this.Parser))};var T=(e,r)=>{let{customTags:t=[],remarkPlugins:o=[],rehypePlugins:i=[],extendedGrammar:l=[],mathJaxConfig:c,supportsLaTeX:n=!1}=r,a=new Set(l),s=ne().use(se);if(a.has("gfm")&&(s=s.use(ie)),a.has("mathjax")&&(n&&(s=s.use(G)),s=s.use(ce)),o.length>0&&(s=s.use(o)),s=s.use(ae,{allowDangerousHtml:!0}).use(ue).use(z,t).use(me,v(t)),a.has("mathjax")){let u=c??U;s=s.use(pe,u)}return i.length>0&&(s=s.use(i)),e==="html"?s.use(le,{allowDangerousHtml:!0}):s};var E=class{constructor(r={}){this.options=r}async parseToHTML(r){let o=await T("html",this.options).process(r);return String(o)}async parseToHAST(r){let t=T("hast",this.options),o=t.parse(r);return await t.run(o)}async batchParseToHTML(r){let t=T("html",this.options);return Promise.all(r.map(async o=>{let i=await t.process(o);return String(i)}))}async batchParseToHAST(r){let t=T("hast",this.options);return Promise.all(r.map(async o=>{let i=t.parse(o);return await t.run(i)}))}};function fe(e={}){return new E(e)}import{wrap as he}from"comlink";var X="./modules/parser.worker.mjs",de="/.vite/deps/";function N(){return typeof window<"u"&&typeof window.document<"u"?"browser":typeof process<"u"&&process.versions?.node?"node":"unknown"}function J(){let e=N();if(e==="browser"){let t=(typeof navigator<"u"?navigator:null)?.hardwareConcurrency||4;return Math.min(t,8)}if(e==="node")try{let t=I("os").cpus()?.length||4;return Math.min(t,8)}catch{return 4}return 4}function ye(e=import.meta.url){return e.includes(de)?new URL("../../@markdown-next/parser/dist/modules/parser.worker.mjs",e):new URL(X,e)}function ge(){let e=N();if(e==="browser")return new Worker(ye(),{type:"module"});if(e==="node")try{let{Worker:r}=I("worker_threads");return new r(new URL(X,import.meta.url))}catch{throw new Error("Worker threads are not supported in this Node.js environment. Please use Node.js 12+ or use the single-threaded parser instead.")}throw new Error("Unsupported environment for worker pool")}var b=class{constructor(r={}){this.workers=[];this.initialized=!1;this.initPromise=null;this.completedTasks=0;this.pending=[];this.options=r;let t=J();this.workerCount=r.workerCount?Math.min(Math.max(1,r.workerCount),t):t,this.init()}async init(){if(!this.initialized){if(this.initPromise){await this.initPromise;return}this.initPromise=(async()=>{let r=Array.from({length:this.workerCount},()=>(async()=>{let t=ge(),o=he(t),i={...this.options};delete i.workerCount;let l=await new o(i);return{worker:t,proxy:l,busy:!1}})());this.workers=await Promise.all(r),this.initialized=!0})();try{await this.initPromise}finally{this.initPromise=null}}}async getAvailableWorker(){await this.init();let r=this.workers.find(t=>!t.busy);return r?(r.busy=!0,r):await new Promise(t=>{this.pending.push(o=>{o.busy=!0,t(o)})})}releaseWorker(r){let t=this.pending.shift();if(t){t(r);return}r.busy=!1}async parseToHTML(r){let t=await this.getAvailableWorker();try{return await t.proxy.parseToHTML(r)}finally{this.completedTasks+=1,this.releaseWorker(t)}}async parseToHAST(r){let t=await this.getAvailableWorker();try{return await t.proxy.parseToHAST(r)}finally{this.completedTasks+=1,this.releaseWorker(t)}}async batchParseToHTML(r){return await this.init(),Promise.all(r.map(t=>this.parseToHTML(t)))}async batchParseToHAST(r){return await this.init(),Promise.all(r.map(t=>this.parseToHAST(t)))}async updateOptions(r){await this.init(),this.options={...this.options,...r};let t={...this.options};delete t.workerCount,await Promise.all(this.workers.map(o=>o.proxy.updateOptions(t)))}async destroy(){if(this.initialized){for(let{worker:r}of this.workers)r.terminate();this.workers=[],this.pending=[],this.completedTasks=0,this.initialized=!1}}async terminate(){await this.destroy()}getStats(){let r=this.workers.length,t=this.workers.filter(o=>o.busy).length;return{activeWorkers:r,idleWorkers:Math.max(r-t,0),queuedTasks:this.pending.length,completedTasks:this.completedTasks}}getPoolInfo(){return{workerCount:this.workerCount,activeWorkers:this.workers.length,busyWorkers:this.workers.filter(r=>r.busy).length,maxWorkers:J(),environment:N(),initialized:this.initialized}}};function ke(e={}){return new b(e)}export{b as MarkdownWorkerPool,E as Parser,b as ParserWorkerPool,fe as createParser,ke as createWorkerPool};
9
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL21vZHVsZXMvY29yZS50cyIsICIuLi9zcmMvdXRpbHMvY3JlYXRlU2FuaXRpemVTY2hlbWEudHMiLCAiLi4vc3JjL2NvbnN0cy90YWdGaWx0ZXIudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuaXN0LXV0aWwtaXNANi4wLjEvbm9kZV9tb2R1bGVzL3VuaXN0LXV0aWwtaXMvbGliL2luZGV4LmpzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmlzdC11dGlsLXZpc2l0LXBhcmVudHNANi4wLjIvbm9kZV9tb2R1bGVzL3VuaXN0LXV0aWwtdmlzaXQtcGFyZW50cy9saWIvY29sb3Iubm9kZS5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5pc3QtdXRpbC12aXNpdC1wYXJlbnRzQDYuMC4yL25vZGVfbW9kdWxlcy91bmlzdC11dGlsLXZpc2l0LXBhcmVudHMvbGliL2luZGV4LmpzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmlzdC11dGlsLXZpc2l0QDUuMC4wL25vZGVfbW9kdWxlcy91bmlzdC11dGlsLXZpc2l0L2xpYi9pbmRleC5qcyIsICIuLi9zcmMvcGx1Z2luL3JlaHlwZUNvbnZlcnRBYm5vcm1hbFRhZ3NUb1RleHQudHMiLCAiLi4vc3JjL2NvbnN0cy9tYXRoamF4ZGVmYXVsdENvbmZpZy50cyIsICIuLi9zcmMvcGx1Z2luL3JlbWFya01hdGhEZWxpbWl0ZXJzLnRzIiwgIi4uL3NyYy9tb2R1bGVzL3BhcnNlci50cyIsICIuLi9zcmMvbW9kdWxlcy9wYXJzZXIud29ya2VyUG9vbC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgRXh0ZW5kc1Byb3BzLCBSZW5kZXJUeXBlIH0gZnJvbSAnLi4vdHlwZXMvcHJvcHMnO1xuaW1wb3J0IHsgUGx1Z2dhYmxlTGlzdCwgUHJvY2Vzc29yLCB1bmlmaWVkIH0gZnJvbSAndW5pZmllZCc7XG5pbXBvcnQgeyBSb290IH0gZnJvbSAnaGFzdCc7XG5pbXBvcnQgcmVtYXJrUGFyc2UgZnJvbSAncmVtYXJrLXBhcnNlJztcbmltcG9ydCByZW1hcmtHZm0gZnJvbSAncmVtYXJrLWdmbSc7XG5pbXBvcnQgcmVtYXJrUmVoeXBlIGZyb20gJ3JlbWFyay1yZWh5cGUnO1xuaW1wb3J0IHJlaHlwZVN0cmluZ2lmeSBmcm9tICdyZWh5cGUtc3RyaW5naWZ5JztcbmltcG9ydCByZW1hcmtNYXRoIGZyb20gJ3JlbWFyay1tYXRoJztcbmltcG9ydCByZWh5cGVTYW5pdGl6ZSBmcm9tICdyZWh5cGUtc2FuaXRpemUnO1xuaW1wb3J0IHJlaHlwZVJhdyBmcm9tICdyZWh5cGUtcmF3JztcbmltcG9ydCB7IGNyZWF0ZVNhbml0aXplU2NoZW1hIH0gZnJvbSAnLi4vdXRpbHMvY3JlYXRlU2FuaXRpemVTY2hlbWEnO1xuaW1wb3J0IHsgcmVoeXBlQ29udmVydEFibm9ybWFsVGFnc1RvVGV4dCB9IGZyb20gJy4uL3BsdWdpbi9yZWh5cGVDb252ZXJ0QWJub3JtYWxUYWdzVG9UZXh0JztcbmltcG9ydCByZWh5cGVNYXRoSmF4Q2h0bWwgZnJvbSAncmVoeXBlLW1hdGhqYXgvY2h0bWwnO1xuaW1wb3J0IHR5cGUgeyBPcHRpb25zIGFzIE1hdGhKYXhPcHRpb25zIH0gZnJvbSAncmVoeXBlLW1hdGhqYXgvY2h0bWwnO1xuaW1wb3J0IHsgREVGQVVMVF9NQVRISkFYX0NPTkZJRyB9IGZyb20gJy4uL2NvbnN0cy9tYXRoamF4ZGVmYXVsdENvbmZpZyc7XG5pbXBvcnQgeyByZW1hcmtNYXRoRGVsaW1pdGVycyB9IGZyb20gJy4uL3BsdWdpbi9yZW1hcmtNYXRoRGVsaW1pdGVycyc7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxudHlwZSBBbnlQcm9jZXNzb3IgPSBQcm9jZXNzb3I8YW55LCBhbnksIGFueSwgYW55LCBhbnk+O1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlbmRlclByb3BzIHtcbiAgY3VzdG9tVGFncz86IHN0cmluZ1tdO1xuICBleHRlbmRlZEdyYW1tYXI/OiBFeHRlbmRzUHJvcHNbXTtcbiAgLyoqXG4gICAqIFJlbWFyayBwbHVnaW5zIGFwcGVuZGVkIGJlZm9yZSBgcmVtYXJrUmVoeXBlYCAocHJvY2VzcyBNYXJrZG93biBBU1QpXG4gICAqL1xuICByZW1hcmtQbHVnaW5zPzogUGx1Z2dhYmxlTGlzdDtcbiAgLyoqXG4gICAqIFJlaHlwZSBwbHVnaW5zIGFwcGVuZGVkIGFmdGVyIGByZWh5cGVSYXcvcmVoeXBlU2FuaXRpemVgIChwcm9jZXNzIEhUTUwgQVNUKVxuICAgKi9cbiAgcmVoeXBlUGx1Z2lucz86IFBsdWdnYWJsZUxpc3Q7XG4gIC8qKlxuICAgKiBNYXRoSmF4IGNvbmZpZyBvcHRpb25zIChvbmx5IGVmZmVjdGl2ZSB3aGVuIGV4dGVuZGVkR3JhbW1hciBpbmNsdWRlcyAnbWF0aGpheCcpXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1hdGhqYXgub3JnL2VuL2xhdGVzdC9vcHRpb25zL2luZGV4Lmh0bWxcbiAgICovXG4gIG1hdGhKYXhDb25maWc/OiBNYXRoSmF4T3B0aW9ucztcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gc3VwcG9ydCBMYVRlWCBzeW50YXggKHVzaW5nIFxcXFwoIGFuZCBcXFxcWyBhcyBtYXRoIGRlbGltaXRlcnMpXG4gICAqIFdoZW4gdHJ1ZSwgZW5hYmxlcyByZW1hcmtNYXRoRGVsaW1pdGVycyB0byBwYXJzZSBMYVRlWCBzeW50YXhcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHN1cHBvcnRzTGFUZVg/OiBib29sZWFuO1xufVxuZXhwb3J0IGNvbnN0IGdldFBhcnNlciA9IDxUIGV4dGVuZHMgUmVuZGVyVHlwZT4oXG4gIHRhcmdldDogVCxcbiAgb3B0aW9uOiBSZW5kZXJQcm9wc1xuKTogVCBleHRlbmRzICdodG1sJ1xuICA/IFByb2Nlc3NvcjxSb290LCBSb290LCBSb290LCBSb290LCBzdHJpbmc+XG4gIDogUHJvY2Vzc29yPFJvb3QsIFJvb3QsIFJvb3QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkPiA9PiB7XG4gIGNvbnN0IHtcbiAgICBjdXN0b21UYWdzID0gW10sXG4gICAgcmVtYXJrUGx1Z2lucyA9IFtdLFxuICAgIHJlaHlwZVBsdWdpbnMgPSBbXSxcbiAgICBleHRlbmRlZEdyYW1tYXIgPSBbXSxcbiAgICBtYXRoSmF4Q29uZmlnLFxuICAgIHN1cHBvcnRzTGFUZVggPSBmYWxzZSxcbiAgfSA9IG9wdGlvbjtcbiAgY29uc3QgZXh0ZW5kZWRHcmFtbWFyU2V0ID0gbmV3IFNldChleHRlbmRlZEdyYW1tYXIpO1xuICBsZXQgcGFyc2VyOiBBbnlQcm9jZXNzb3IgPSB1bmlmaWVkKCkudXNlKHJlbWFya1BhcnNlKSBhcyBBbnlQcm9jZXNzb3I7XG4gIGlmIChleHRlbmRlZEdyYW1tYXJTZXQuaGFzKCdnZm0nKSkgcGFyc2VyID0gcGFyc2VyLnVzZShyZW1hcmtHZm0pO1xuICBpZiAoZXh0ZW5kZWRHcmFtbWFyU2V0LmhhcygnbWF0aGpheCcpKSB7XG4gICAgaWYgKHN1cHBvcnRzTGFUZVgpIHtcbiAgICAgIHBhcnNlciA9IHBhcnNlci51c2UocmVtYXJrTWF0aERlbGltaXRlcnMpO1xuICAgIH1cbiAgICBwYXJzZXIgPSBwYXJzZXIudXNlKHJlbWFya01hdGgpO1xuICB9XG5cbiAgLy8gQXBwZW5kIHJlbWFyayBwbHVnaW5zIGJlZm9yZSByZW1hcmtSZWh5cGVcbiAgaWYgKHJlbWFya1BsdWdpbnMubGVuZ3RoID4gMCkge1xuICAgIHBhcnNlciA9IHBhcnNlci51c2UocmVtYXJrUGx1Z2lucyk7XG4gIH1cblxuICBwYXJzZXIgPSBwYXJzZXJcbiAgICAudXNlKHJlbWFya1JlaHlwZSwgeyBhbGxvd0Rhbmdlcm91c0h0bWw6IHRydWUgfSlcbiAgICAudXNlKHJlaHlwZVJhdylcbiAgICAudXNlKHJlaHlwZUNvbnZlcnRBYm5vcm1hbFRhZ3NUb1RleHQsIGN1c3RvbVRhZ3MpXG4gICAgLnVzZShyZWh5cGVTYW5pdGl6ZSwgY3JlYXRlU2FuaXRpemVTY2hlbWEoY3VzdG9tVGFncykpO1xuXG4gIGlmIChleHRlbmRlZEdyYW1tYXJTZXQuaGFzKCdtYXRoamF4JykpIHtcbiAgICBjb25zdCBtZXJnZWRDb25maWc6IE1hdGhKYXhPcHRpb25zID0gbWF0aEpheENvbmZpZyA/PyBERUZBVUxUX01BVEhKQVhfQ09ORklHO1xuICAgIHBhcnNlciA9IHBhcnNlci51c2UocmVoeXBlTWF0aEpheENodG1sLCBtZXJnZWRDb25maWcpO1xuICB9XG5cbiAgLy8gQXBwZW5kIHJlaHlwZSBwbHVnaW5zIGFmdGVyIHJlaHlwZVJhdy9yZWh5cGVTYW5pdGl6ZVxuICBpZiAocmVoeXBlUGx1Z2lucy5sZW5ndGggPiAwKSB7XG4gICAgcGFyc2VyID0gcGFyc2VyLnVzZShyZWh5cGVQbHVnaW5zKTtcbiAgfVxuXG4gIGlmICh0YXJnZXQgPT09ICdodG1sJykge1xuICAgIHJldHVybiBwYXJzZXIudXNlKHJlaHlwZVN0cmluZ2lmeSwge1xuICAgICAgYWxsb3dEYW5nZXJvdXNIdG1sOiB0cnVlLFxuICAgIH0pIGFzIFQgZXh0ZW5kcyAnaHRtbCdcbiAgICAgID8gUHJvY2Vzc29yPFJvb3QsIFJvb3QsIFJvb3QsIFJvb3QsIHN0cmluZz5cbiAgICAgIDogUHJvY2Vzc29yPFJvb3QsIFJvb3QsIFJvb3QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkPjtcbiAgfVxuICByZXR1cm4gcGFyc2VyIGFzIFQgZXh0ZW5kcyAnaHRtbCdcbiAgICA/IFByb2Nlc3NvcjxSb290LCBSb290LCBSb290LCBSb290LCBzdHJpbmc+XG4gICAgOiBQcm9jZXNzb3I8Um9vdCwgUm9vdCwgUm9vdCwgdW5kZWZpbmVkLCB1bmRlZmluZWQ+O1xufTtcbiIsICIvLyBDcmVhdGUgc2FuaXRpemUgc2NoZW1hXG5pbXBvcnQgeyBkZWZhdWx0U2NoZW1hIH0gZnJvbSAncmVoeXBlLXNhbml0aXplJztcbmltcG9ydCB7IE1BVEhNTF9BVFRSSUJVVEVTLCBNQVRITUxfVEFHX05BTUVTIH0gZnJvbSAnLi4vY29uc3RzL3RhZ0ZpbHRlcic7XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVTYW5pdGl6ZVNjaGVtYSA9IChjdXN0b21UYWdzOiBzdHJpbmdbXSA9IFtdKTogdHlwZW9mIGRlZmF1bHRTY2hlbWEgPT4gKHtcbiAgLi4uZGVmYXVsdFNjaGVtYSxcbiAgdGFnTmFtZXM6IFsuLi4oZGVmYXVsdFNjaGVtYS50YWdOYW1lcyB8fCBbXSksIC4uLk1BVEhNTF9UQUdfTkFNRVMsIC4uLmN1c3RvbVRhZ3NdLFxuICBhdHRyaWJ1dGVzOiB7XG4gICAgLi4uZGVmYXVsdFNjaGVtYS5hdHRyaWJ1dGVzLFxuXG4gICAgLy8gQWxsb3cgc3JjIGF0dHJpYnV0ZSBmb3IgaW1nIHRhZ3Mgd2l0aCBmaWxlOi8vIHByb3RvY29sIGFuZCBvdGhlciBwcm90b2NvbHNcbiAgICBpbWc6IFsnc3JjJywgJ2FsdCcsICd0aXRsZScsICd3aWR0aCcsICdoZWlnaHQnLCAnc3R5bGUnLCAnY2xhc3MnXSxcbiAgICAvLyBUaGUgYGxhbmd1YWdlLSpgIHJlZ2V4IGlzIGFsbG93ZWQgYnkgZGVmYXVsdC5cbiAgICBjb2RlOiBbWydjbGFzc05hbWUnLCAvXmxhbmd1YWdlLS4vLCAnbWF0aC1pbmxpbmUnLCAnbWF0aC1kaXNwbGF5J11dLFxuICAgIC4uLk1BVEhNTF9BVFRSSUJVVEVTLFxuICAgIC8vIEFkZCBiYXNpYyBhdHRyaWJ1dGVzIGZvciBjdXN0b20gdGFnc1xuICAgIC4uLmN1c3RvbVRhZ3MucmVkdWNlKFxuICAgICAgKGFjYywgdGFnKSA9PiB7XG4gICAgICAgIGFjY1t0YWddID0gWydjbGFzcycsICdjbGFzc05hbWUnLCAnc3R5bGUnLCAnaWQnLCAncHJvcCcsICdzcmMnXTtcbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH0sXG4gICAgICB7fSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT5cbiAgICApLFxuICB9LFxuICBwcm90b2NvbHM6IHtcbiAgICAuLi5kZWZhdWx0U2NoZW1hLnByb3RvY29scyxcbiAgICBzcmM6IFsnaHR0cCcsICdodHRwcycsICdkYXRhJywgJ2ZpbGUnXSxcbiAgfSxcbn0pO1xuIiwgImV4cG9ydCBjb25zdCBNQVRITUxfVEFHX05BTUVTOiBzdHJpbmdbXSA9IFtcbiAgJ21hdGgnLFxuICAnbXJvdycsXG4gICdtaScsXG4gICdtbicsXG4gICdtbycsXG4gICdtZnJhYycsXG4gICdtc3VwJyxcbiAgJ21zdWInLFxuICAnbXVuZGVyJyxcbiAgJ21vdmVyJyxcbiAgJ211bmRlcm92ZXInLFxuICAnbXNxcnQnLFxuICAnbXJvb3QnLFxuICAnbXRleHQnLFxuICAnbXNwYWNlJyxcbiAgJ21lbmNsb3NlJyxcbiAgJ21wYWRkZWQnLFxuICAnbXBoYW50b20nLFxuICAnbXRhYmxlJyxcbiAgJ210cicsXG4gICdtdGQnLFxuICAnbWxhYmVsZWR0cicsXG4gICdtYWxpZ25ncm91cCcsXG4gICdtYWxpZ25tYXJrJyxcbiAgJ21zdHlsZScsXG4gICdtZXJyb3InLFxuICAnbWFjdGlvbicsXG4gICdzZW1hbnRpY3MnLFxuICAnYW5ub3RhdGlvbicsXG4gICdhbm5vdGF0aW9uLXhtbCcsXG5dIGFzIGNvbnN0O1xuXG4vLyBNYXRoTUwgYXR0cmlidXRlIGNvbmZpZ3VyYXRpb25cbmV4cG9ydCBjb25zdCBNQVRITUxfQVRUUklCVVRFUzogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+ID0ge1xuICBtYXRoOiBbJ2Rpc3BsYXknLCAnY2xhc3MnLCAnc3R5bGUnLCAneG1sbnMnXSxcbiAgbXJvdzogWydjbGFzcycsICdzdHlsZSddLFxuICBtaTogWydjbGFzcycsICdzdHlsZScsICdtYXRodmFyaWFudCddLFxuICBtbjogWydjbGFzcycsICdzdHlsZSddLFxuICBtbzogW1xuICAgICdjbGFzcycsXG4gICAgJ3N0eWxlJyxcbiAgICAnZmVuY2UnLFxuICAgICdzZXBhcmF0b3InLFxuICAgICdzdHJldGNoeScsXG4gICAgJ3N5bW1ldHJpYycsXG4gICAgJ2xhcmdlb3AnLFxuICAgICdtb3ZhYmxlbGltaXRzJyxcbiAgICAnYWNjZW50JyxcbiAgICAnbHNwYWNlJyxcbiAgICAncnNwYWNlJyxcbiAgICAnZm9ybScsXG4gIF0sXG4gIG1mcmFjOiBbJ2NsYXNzJywgJ3N0eWxlJywgJ2xpbmV0aGlja25lc3MnLCAnbnVtYWxpZ24nLCAnZGVub21hbGlnbicsICdiZXZlbGxlZCddLFxuICBtc3VwOiBbJ2NsYXNzJywgJ3N0eWxlJywgJ3N1cGVyc2NyaXB0c2hpZnQnXSxcbiAgbXN1YjogWydjbGFzcycsICdzdHlsZScsICdzdWJzY3JpcHRzaGlmdCddLFxuICBtdW5kZXI6IFsnY2xhc3MnLCAnc3R5bGUnLCAnYWNjZW50dW5kZXInXSxcbiAgbW92ZXI6IFsnY2xhc3MnLCAnc3R5bGUnLCAnYWNjZW50J10sXG4gIG11bmRlcm92ZXI6IFsnY2xhc3MnLCAnc3R5bGUnLCAnYWNjZW50JywgJ2FjY2VudHVuZGVyJ10sXG4gIG1zcXJ0OiBbJ2NsYXNzJywgJ3N0eWxlJ10sXG4gIG1yb290OiBbJ2NsYXNzJywgJ3N0eWxlJ10sXG4gIG10ZXh0OiBbJ2NsYXNzJywgJ3N0eWxlJywgJ21hdGh2YXJpYW50J10sXG4gIG1zcGFjZTogWydjbGFzcycsICdzdHlsZScsICd3aWR0aCcsICdoZWlnaHQnLCAnZGVwdGgnXSxcbiAgbWVuY2xvc2U6IFsnY2xhc3MnLCAnc3R5bGUnLCAnbm90YXRpb24nXSxcbiAgbXBhZGRlZDogWydjbGFzcycsICdzdHlsZScsICd3aWR0aCcsICdoZWlnaHQnLCAnZGVwdGgnLCAnbHNwYWNlJywgJ3ZvZmZzZXQnXSxcbiAgbXBoYW50b206IFsnY2xhc3MnLCAnc3R5bGUnXSxcbiAgbXRhYmxlOiBbXG4gICAgJ2NsYXNzJyxcbiAgICAnc3R5bGUnLFxuICAgICdhbGlnbicsXG4gICAgJ3Jvd2FsaWduJyxcbiAgICAnY29sdW1uYWxpZ24nLFxuICAgICdncm91cGFsaWduJyxcbiAgICAnYWxpZ25tZW50c2NvcGUnLFxuICAgICdjb2x1bW53aWR0aCcsXG4gICAgJ3dpZHRoJyxcbiAgICAncm93c3BhY2luZycsXG4gICAgJ2NvbHVtbnNwYWNpbmcnLFxuICAgICdyb3dsaW5lcycsXG4gICAgJ2NvbHVtbmxpbmVzJyxcbiAgICAnZnJhbWUnLFxuICAgICdmcmFtZXNwYWNpbmcnLFxuICAgICdlcXVhbHJvd3MnLFxuICAgICdlcXVhbGNvbHVtbnMnLFxuICAgICdkaXNwbGF5c3R5bGUnLFxuICAgICdzaWRlJyxcbiAgICAnbWlubGFiZWxzcGFjaW5nJyxcbiAgXSxcbiAgbXRyOiBbJ2NsYXNzJywgJ3N0eWxlJywgJ3Jvd2FsaWduJywgJ2NvbHVtbmFsaWduJywgJ2dyb3VwYWxpZ24nXSxcbiAgbXRkOiBbJ2NsYXNzJywgJ3N0eWxlJywgJ3Jvd3NwYW4nLCAnY29sdW1uc3BhbicsICdyb3dhbGlnbicsICdjb2x1bW5hbGlnbicsICdncm91cGFsaWduJ10sXG4gIG1sYWJlbGVkdHI6IFsnY2xhc3MnLCAnc3R5bGUnLCAncm93YWxpZ24nLCAnY29sdW1uYWxpZ24nLCAnZ3JvdXBhbGlnbiddLFxuICBtYWxpZ25ncm91cDogWydjbGFzcycsICdzdHlsZScsICdncm91cGFsaWduJ10sXG4gIG1hbGlnbm1hcms6IFsnY2xhc3MnLCAnc3R5bGUnLCAnZWRnZSddLFxuICBtc3R5bGU6IFtcbiAgICAnY2xhc3MnLFxuICAgICdzdHlsZScsXG4gICAgJ3NjcmlwdGxldmVsJyxcbiAgICAnZGlzcGxheXN0eWxlJyxcbiAgICAnc2NyaXB0c2l6ZW11bHRpcGxpZXInLFxuICAgICdzY3JpcHRtaW5zaXplJyxcbiAgICAnaW5maXhsaW5lYnJlYWtzdHlsZScsXG4gICAgJ2RlY2ltYWxwb2ludCcsXG4gICAgJ21hdGh2YXJpYW50JyxcbiAgICAnbWF0aHNpemUnLFxuICAgICdtYXRoY29sb3InLFxuICAgICdtYXRoYmFja2dyb3VuZCcsXG4gIF0sXG4gIG1lcnJvcjogWydjbGFzcycsICdzdHlsZSddLFxuICBtYWN0aW9uOiBbJ2NsYXNzJywgJ3N0eWxlJywgJ2FjdGlvbnR5cGUnLCAnc2VsZWN0aW9uJ10sXG4gIHNlbWFudGljczogWydjbGFzcycsICdzdHlsZSddLFxuICBhbm5vdGF0aW9uOiBbJ2NsYXNzJywgJ3N0eWxlJywgJ2VuY29kaW5nJ10sXG4gICdhbm5vdGF0aW9uLXhtbCc6IFsnY2xhc3MnLCAnc3R5bGUnLCAnZW5jb2RpbmcnXSxcbn07XG4iLCAiLyoqXG4gKiBAaW1wb3J0IHtOb2RlLCBQYXJlbnR9IGZyb20gJ3VuaXN0J1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIEZuXG4gKiBAdGVtcGxhdGUgRmFsbGJhY2tcbiAqIEB0eXBlZGVmIHtGbiBleHRlbmRzICh2YWx1ZTogYW55KSA9PiB2YWx1ZSBpcyBpbmZlciBUaGluZyA/IFRoaW5nIDogRmFsbGJhY2t9IFByZWRpY2F0ZVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIENoZWNrXG4gKiAgIENoZWNrIHRoYXQgYW4gYXJiaXRyYXJ5IHZhbHVlIGlzIGEgbm9kZS5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdGhpc1xuICogICBUaGUgZ2l2ZW4gY29udGV4dC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gW25vZGVdXG4gKiAgIEFueXRoaW5nICh0eXBpY2FsbHkgYSBub2RlKS5cbiAqIEBwYXJhbSB7bnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZH0gW2luZGV4XVxuICogICBUaGUgbm9kZVx1MjAxOXMgcG9zaXRpb24gaW4gaXRzIHBhcmVudC5cbiAqIEBwYXJhbSB7UGFyZW50IHwgbnVsbCB8IHVuZGVmaW5lZH0gW3BhcmVudF1cbiAqICAgVGhlIG5vZGVcdTIwMTlzIHBhcmVudC5cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICogICBXaGV0aGVyIHRoaXMgaXMgYSBub2RlIGFuZCBwYXNzZXMgYSB0ZXN0LlxuICpcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IE5vZGV9IFByb3BzXG4gKiAgIE9iamVjdCB0byBjaGVjayBmb3IgZXF1aXZhbGVuY2UuXG4gKlxuICogICBOb3RlOiBgTm9kZWAgaXMgaW5jbHVkZWQgYXMgaXQgaXMgY29tbW9uIGJ1dCBpcyBub3QgaW5kZXhhYmxlLlxuICpcbiAqIEB0eXBlZGVmIHtBcnJheTxQcm9wcyB8IFRlc3RGdW5jdGlvbiB8IHN0cmluZz4gfCBSZWFkb25seUFycmF5PFByb3BzIHwgVGVzdEZ1bmN0aW9uIHwgc3RyaW5nPiB8IFByb3BzIHwgVGVzdEZ1bmN0aW9uIHwgc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZH0gVGVzdFxuICogICBDaGVjayBmb3IgYW4gYXJiaXRyYXJ5IG5vZGUuXG4gKlxuICogQGNhbGxiYWNrIFRlc3RGdW5jdGlvblxuICogICBDaGVjayBpZiBhIG5vZGUgcGFzc2VzIGEgdGVzdC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdGhpc1xuICogICBUaGUgZ2l2ZW4gY29udGV4dC5cbiAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuICogICBBIG5vZGUuXG4gKiBAcGFyYW0ge251bWJlciB8IHVuZGVmaW5lZH0gW2luZGV4XVxuICogICBUaGUgbm9kZVx1MjAxOXMgcG9zaXRpb24gaW4gaXRzIHBhcmVudC5cbiAqIEBwYXJhbSB7UGFyZW50IHwgdW5kZWZpbmVkfSBbcGFyZW50XVxuICogICBUaGUgbm9kZVx1MjAxOXMgcGFyZW50LlxuICogQHJldHVybnMge2Jvb2xlYW4gfCB1bmRlZmluZWQgfCB2b2lkfVxuICogICBXaGV0aGVyIHRoaXMgbm9kZSBwYXNzZXMgdGhlIHRlc3QuXG4gKlxuICogICBOb3RlOiBgdm9pZGAgaXMgaW5jbHVkZWQgdW50aWwgVFMgc2VlcyBubyByZXR1cm4gYXMgYHVuZGVmaW5lZGAuXG4gKi9cblxuLyoqXG4gKiBDaGVjayBpZiBgbm9kZWAgaXMgYSBgTm9kZWAgYW5kIHdoZXRoZXIgaXQgcGFzc2VzIHRoZSBnaXZlbiB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gbm9kZVxuICogICBUaGluZyB0byBjaGVjaywgdHlwaWNhbGx5IGBOb2RlYC5cbiAqIEBwYXJhbSB7VGVzdH0gdGVzdFxuICogICBBIGNoZWNrIGZvciBhIHNwZWNpZmljIG5vZGUuXG4gKiBAcGFyYW0ge251bWJlciB8IG51bGwgfCB1bmRlZmluZWR9IGluZGV4XG4gKiAgIFRoZSBub2RlXHUyMDE5cyBwb3NpdGlvbiBpbiBpdHMgcGFyZW50LlxuICogQHBhcmFtIHtQYXJlbnQgfCBudWxsIHwgdW5kZWZpbmVkfSBwYXJlbnRcbiAqICAgVGhlIG5vZGVcdTIwMTlzIHBhcmVudC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gY29udGV4dFxuICogICBDb250ZXh0IG9iamVjdCAoYHRoaXNgKSB0byBwYXNzIHRvIGB0ZXN0YCBmdW5jdGlvbnMuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqICAgV2hldGhlciBgbm9kZWAgaXMgYSBub2RlIGFuZCBwYXNzZXMgYSB0ZXN0LlxuICovXG5leHBvcnQgY29uc3QgaXMgPVxuICAvLyBOb3RlOiBvdmVybG9hZHMgaW4gSlNEb2MgY2FuXHUyMDE5dCB5ZXQgdXNlIGRpZmZlcmVudCBgQHRlbXBsYXRlYHMuXG4gIC8qKlxuICAgKiBAdHlwZSB7KFxuICAgKiAgICg8Q29uZGl0aW9uIGV4dGVuZHMgUmVhZG9ubHlBcnJheTxzdHJpbmc+Pihub2RlOiB1bmtub3duLCB0ZXN0OiBDb25kaXRpb24sIGluZGV4PzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgcGFyZW50PzogUGFyZW50IHwgbnVsbCB8IHVuZGVmaW5lZCwgY29udGV4dD86IHVua25vd24pID0+IG5vZGUgaXMgTm9kZSAmIHt0eXBlOiBDb25kaXRpb25bbnVtYmVyXX0pICZcbiAgICogICAoPENvbmRpdGlvbiBleHRlbmRzIEFycmF5PHN0cmluZz4+KG5vZGU6IHVua25vd24sIHRlc3Q6IENvbmRpdGlvbiwgaW5kZXg/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCBwYXJlbnQ/OiBQYXJlbnQgfCBudWxsIHwgdW5kZWZpbmVkLCBjb250ZXh0PzogdW5rbm93bikgPT4gbm9kZSBpcyBOb2RlICYge3R5cGU6IENvbmRpdGlvbltudW1iZXJdfSkgJlxuICAgKiAgICg8Q29uZGl0aW9uIGV4dGVuZHMgc3RyaW5nPihub2RlOiB1bmtub3duLCB0ZXN0OiBDb25kaXRpb24sIGluZGV4PzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgcGFyZW50PzogUGFyZW50IHwgbnVsbCB8IHVuZGVmaW5lZCwgY29udGV4dD86IHVua25vd24pID0+IG5vZGUgaXMgTm9kZSAmIHt0eXBlOiBDb25kaXRpb259KSAmXG4gICAqICAgKDxDb25kaXRpb24gZXh0ZW5kcyBQcm9wcz4obm9kZTogdW5rbm93biwgdGVzdDogQ29uZGl0aW9uLCBpbmRleD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIHBhcmVudD86IFBhcmVudCB8IG51bGwgfCB1bmRlZmluZWQsIGNvbnRleHQ/OiB1bmtub3duKSA9PiBub2RlIGlzIE5vZGUgJiBDb25kaXRpb24pICZcbiAgICogICAoPENvbmRpdGlvbiBleHRlbmRzIFRlc3RGdW5jdGlvbj4obm9kZTogdW5rbm93biwgdGVzdDogQ29uZGl0aW9uLCBpbmRleD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIHBhcmVudD86IFBhcmVudCB8IG51bGwgfCB1bmRlZmluZWQsIGNvbnRleHQ/OiB1bmtub3duKSA9PiBub2RlIGlzIE5vZGUgJiBQcmVkaWNhdGU8Q29uZGl0aW9uLCBOb2RlPikgJlxuICAgKiAgICgobm9kZT86IG51bGwgfCB1bmRlZmluZWQpID0+IGZhbHNlKSAmXG4gICAqICAgKChub2RlOiB1bmtub3duLCB0ZXN0PzogbnVsbCB8IHVuZGVmaW5lZCwgaW5kZXg/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCBwYXJlbnQ/OiBQYXJlbnQgfCBudWxsIHwgdW5kZWZpbmVkLCBjb250ZXh0PzogdW5rbm93bikgPT4gbm9kZSBpcyBOb2RlKSAmXG4gICAqICAgKChub2RlOiB1bmtub3duLCB0ZXN0PzogVGVzdCwgaW5kZXg/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCBwYXJlbnQ/OiBQYXJlbnQgfCBudWxsIHwgdW5kZWZpbmVkLCBjb250ZXh0PzogdW5rbm93bikgPT4gYm9vbGVhbilcbiAgICogKX1cbiAgICovXG4gIChcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge3Vua25vd259IFtub2RlXVxuICAgICAqIEBwYXJhbSB7VGVzdH0gW3Rlc3RdXG4gICAgICogQHBhcmFtIHtudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkfSBbaW5kZXhdXG4gICAgICogQHBhcmFtIHtQYXJlbnQgfCBudWxsIHwgdW5kZWZpbmVkfSBbcGFyZW50XVxuICAgICAqIEBwYXJhbSB7dW5rbm93bn0gW2NvbnRleHRdXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1wYXJhbXNcbiAgICBmdW5jdGlvbiAobm9kZSwgdGVzdCwgaW5kZXgsIHBhcmVudCwgY29udGV4dCkge1xuICAgICAgY29uc3QgY2hlY2sgPSBjb252ZXJ0KHRlc3QpXG5cbiAgICAgIGlmIChcbiAgICAgICAgaW5kZXggIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICBpbmRleCAhPT0gbnVsbCAmJlxuICAgICAgICAodHlwZW9mIGluZGV4ICE9PSAnbnVtYmVyJyB8fFxuICAgICAgICAgIGluZGV4IDwgMCB8fFxuICAgICAgICAgIGluZGV4ID09PSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBwb3NpdGl2ZSBmaW5pdGUgaW5kZXgnKVxuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIHBhcmVudCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIHBhcmVudCAhPT0gbnVsbCAmJlxuICAgICAgICAoIWlzKHBhcmVudCkgfHwgIXBhcmVudC5jaGlsZHJlbilcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHBhcmVudCBub2RlJylcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICAocGFyZW50ID09PSB1bmRlZmluZWQgfHwgcGFyZW50ID09PSBudWxsKSAhPT1cbiAgICAgICAgKGluZGV4ID09PSB1bmRlZmluZWQgfHwgaW5kZXggPT09IG51bGwpXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBib3RoIHBhcmVudCBhbmQgaW5kZXgnKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbG9va3NMaWtlQU5vZGUobm9kZSlcbiAgICAgICAgPyBjaGVjay5jYWxsKGNvbnRleHQsIG5vZGUsIGluZGV4LCBwYXJlbnQpXG4gICAgICAgIDogZmFsc2VcbiAgICB9XG4gIClcblxuLyoqXG4gKiBHZW5lcmF0ZSBhbiBhc3NlcnRpb24gZnJvbSBhIHRlc3QuXG4gKlxuICogVXNlZnVsIGlmIHlvdVx1MjAxOXJlIGdvaW5nIHRvIHRlc3QgbWFueSBub2RlcywgZm9yIGV4YW1wbGUgd2hlbiBjcmVhdGluZyBhXG4gKiB1dGlsaXR5IHdoZXJlIHNvbWV0aGluZyBlbHNlIHBhc3NlcyBhIGNvbXBhdGlibGUgdGVzdC5cbiAqXG4gKiBUaGUgY3JlYXRlZCBmdW5jdGlvbiBpcyBhIGJpdCBmYXN0ZXIgYmVjYXVzZSBpdCBleHBlY3RzIHZhbGlkIGlucHV0IG9ubHk6XG4gKiBhIGBub2RlYCwgYGluZGV4YCwgYW5kIGBwYXJlbnRgLlxuICpcbiAqIEBwYXJhbSB7VGVzdH0gdGVzdFxuICogICAqICAgd2hlbiBudWxsaXNoLCBjaGVja3MgaWYgYG5vZGVgIGlzIGEgYE5vZGVgLlxuICogICAqICAgd2hlbiBgc3RyaW5nYCwgd29ya3MgbGlrZSBwYXNzaW5nIGAobm9kZSkgPT4gbm9kZS50eXBlID09PSB0ZXN0YC5cbiAqICAgKiAgIHdoZW4gYGZ1bmN0aW9uYCBjaGVja3MgaWYgZnVuY3Rpb24gcGFzc2VkIHRoZSBub2RlIGlzIHRydWUuXG4gKiAgICogICB3aGVuIGBvYmplY3RgLCBjaGVja3MgdGhhdCBhbGwga2V5cyBpbiB0ZXN0IGFyZSBpbiBub2RlLCBhbmQgdGhhdCB0aGV5IGhhdmUgKHN0cmljdGx5KSBlcXVhbCB2YWx1ZXMuXG4gKiAgICogICB3aGVuIGBhcnJheWAsIGNoZWNrcyBpZiBhbnkgb25lIG9mIHRoZSBzdWJ0ZXN0cyBwYXNzLlxuICogQHJldHVybnMge0NoZWNrfVxuICogICBBbiBhc3NlcnRpb24uXG4gKi9cbmV4cG9ydCBjb25zdCBjb252ZXJ0ID1cbiAgLy8gTm90ZTogb3ZlcmxvYWRzIGluIEpTRG9jIGNhblx1MjAxOXQgeWV0IHVzZSBkaWZmZXJlbnQgYEB0ZW1wbGF0ZWBzLlxuICAvKipcbiAgICogQHR5cGUgeyhcbiAgICogICAoPENvbmRpdGlvbiBleHRlbmRzIHN0cmluZz4odGVzdDogQ29uZGl0aW9uKSA9PiAobm9kZTogdW5rbm93biwgaW5kZXg/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCBwYXJlbnQ/OiBQYXJlbnQgfCBudWxsIHwgdW5kZWZpbmVkLCBjb250ZXh0PzogdW5rbm93bikgPT4gbm9kZSBpcyBOb2RlICYge3R5cGU6IENvbmRpdGlvbn0pICZcbiAgICogICAoPENvbmRpdGlvbiBleHRlbmRzIFByb3BzPih0ZXN0OiBDb25kaXRpb24pID0+IChub2RlOiB1bmtub3duLCBpbmRleD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIHBhcmVudD86IFBhcmVudCB8IG51bGwgfCB1bmRlZmluZWQsIGNvbnRleHQ/OiB1bmtub3duKSA9PiBub2RlIGlzIE5vZGUgJiBDb25kaXRpb24pICZcbiAgICogICAoPENvbmRpdGlvbiBleHRlbmRzIFRlc3RGdW5jdGlvbj4odGVzdDogQ29uZGl0aW9uKSA9PiAobm9kZTogdW5rbm93biwgaW5kZXg/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCBwYXJlbnQ/OiBQYXJlbnQgfCBudWxsIHwgdW5kZWZpbmVkLCBjb250ZXh0PzogdW5rbm93bikgPT4gbm9kZSBpcyBOb2RlICYgUHJlZGljYXRlPENvbmRpdGlvbiwgTm9kZT4pICZcbiAgICogICAoKHRlc3Q/OiBudWxsIHwgdW5kZWZpbmVkKSA9PiAobm9kZT86IHVua25vd24sIGluZGV4PzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgcGFyZW50PzogUGFyZW50IHwgbnVsbCB8IHVuZGVmaW5lZCwgY29udGV4dD86IHVua25vd24pID0+IG5vZGUgaXMgTm9kZSkgJlxuICAgKiAgICgodGVzdD86IFRlc3QpID0+IENoZWNrKVxuICAgKiApfVxuICAgKi9cbiAgKFxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VGVzdH0gW3Rlc3RdXG4gICAgICogQHJldHVybnMge0NoZWNrfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uICh0ZXN0KSB7XG4gICAgICBpZiAodGVzdCA9PT0gbnVsbCB8fCB0ZXN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIG9rXG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgdGVzdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gY2FzdEZhY3RvcnkodGVzdClcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiB0ZXN0ID09PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh0ZXN0KVxuICAgICAgICAgID8gYW55RmFjdG9yeSh0ZXN0KVxuICAgICAgICAgIDogLy8gQ2FzdCBiZWNhdXNlIGBSZWFkb25seUFycmF5YCBnb2VzIGludG8gdGhlIGFib3ZlIGJ1dCBgaXNBcnJheWBcbiAgICAgICAgICAgIC8vIG5hcnJvd3MgdG8gYEFycmF5YC5cbiAgICAgICAgICAgIHByb3BlcnRpZXNGYWN0b3J5KC8qKiBAdHlwZSB7UHJvcHN9ICovICh0ZXN0KSlcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiB0ZXN0ID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gdHlwZUZhY3RvcnkodGVzdClcbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBmdW5jdGlvbiwgc3RyaW5nLCBvciBvYmplY3QgYXMgdGVzdCcpXG4gICAgfVxuICApXG5cbi8qKlxuICogQHBhcmFtIHtBcnJheTxQcm9wcyB8IFRlc3RGdW5jdGlvbiB8IHN0cmluZz59IHRlc3RzXG4gKiBAcmV0dXJucyB7Q2hlY2t9XG4gKi9cbmZ1bmN0aW9uIGFueUZhY3RvcnkodGVzdHMpIHtcbiAgLyoqIEB0eXBlIHtBcnJheTxDaGVjaz59ICovXG4gIGNvbnN0IGNoZWNrcyA9IFtdXG4gIGxldCBpbmRleCA9IC0xXG5cbiAgd2hpbGUgKCsraW5kZXggPCB0ZXN0cy5sZW5ndGgpIHtcbiAgICBjaGVja3NbaW5kZXhdID0gY29udmVydCh0ZXN0c1tpbmRleF0pXG4gIH1cblxuICByZXR1cm4gY2FzdEZhY3RvcnkoYW55KVxuXG4gIC8qKlxuICAgKiBAdGhpcyB7dW5rbm93bn1cbiAgICogQHR5cGUge1Rlc3RGdW5jdGlvbn1cbiAgICovXG4gIGZ1bmN0aW9uIGFueSguLi5wYXJhbWV0ZXJzKSB7XG4gICAgbGV0IGluZGV4ID0gLTFcblxuICAgIHdoaWxlICgrK2luZGV4IDwgY2hlY2tzLmxlbmd0aCkge1xuICAgICAgaWYgKGNoZWNrc1tpbmRleF0uYXBwbHkodGhpcywgcGFyYW1ldGVycykpIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuLyoqXG4gKiBUdXJuIGFuIG9iamVjdCBpbnRvIGEgdGVzdCBmb3IgYSBub2RlIHdpdGggYSBjZXJ0YWluIGZpZWxkcy5cbiAqXG4gKiBAcGFyYW0ge1Byb3BzfSBjaGVja1xuICogQHJldHVybnMge0NoZWNrfVxuICovXG5mdW5jdGlvbiBwcm9wZXJ0aWVzRmFjdG9yeShjaGVjaykge1xuICBjb25zdCBjaGVja0FzUmVjb3JkID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi8gKGNoZWNrKVxuXG4gIHJldHVybiBjYXN0RmFjdG9yeShhbGwpXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGFsbChub2RlKSB7XG4gICAgY29uc3Qgbm9kZUFzUmVjb3JkID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi8gKFxuICAgICAgLyoqIEB0eXBlIHt1bmtub3dufSAqLyAobm9kZSlcbiAgICApXG5cbiAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cbiAgICBsZXQga2V5XG5cbiAgICBmb3IgKGtleSBpbiBjaGVjaykge1xuICAgICAgaWYgKG5vZGVBc1JlY29yZFtrZXldICE9PSBjaGVja0FzUmVjb3JkW2tleV0pIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlXG4gIH1cbn1cblxuLyoqXG4gKiBUdXJuIGEgc3RyaW5nIGludG8gYSB0ZXN0IGZvciBhIG5vZGUgd2l0aCBhIGNlcnRhaW4gdHlwZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gY2hlY2tcbiAqIEByZXR1cm5zIHtDaGVja31cbiAqL1xuZnVuY3Rpb24gdHlwZUZhY3RvcnkoY2hlY2spIHtcbiAgcmV0dXJuIGNhc3RGYWN0b3J5KHR5cGUpXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuICAgKi9cbiAgZnVuY3Rpb24gdHlwZShub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUgJiYgbm9kZS50eXBlID09PSBjaGVja1xuICB9XG59XG5cbi8qKlxuICogVHVybiBhIGN1c3RvbSB0ZXN0IGludG8gYSB0ZXN0IGZvciBhIG5vZGUgdGhhdCBwYXNzZXMgdGhhdCB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7VGVzdEZ1bmN0aW9ufSB0ZXN0RnVuY3Rpb25cbiAqIEByZXR1cm5zIHtDaGVja31cbiAqL1xuZnVuY3Rpb24gY2FzdEZhY3RvcnkodGVzdEZ1bmN0aW9uKSB7XG4gIHJldHVybiBjaGVja1xuXG4gIC8qKlxuICAgKiBAdGhpcyB7dW5rbm93bn1cbiAgICogQHR5cGUge0NoZWNrfVxuICAgKi9cbiAgZnVuY3Rpb24gY2hlY2sodmFsdWUsIGluZGV4LCBwYXJlbnQpIHtcbiAgICByZXR1cm4gQm9vbGVhbihcbiAgICAgIGxvb2tzTGlrZUFOb2RlKHZhbHVlKSAmJlxuICAgICAgICB0ZXN0RnVuY3Rpb24uY2FsbChcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgIHR5cGVvZiBpbmRleCA9PT0gJ251bWJlcicgPyBpbmRleCA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBwYXJlbnQgfHwgdW5kZWZpbmVkXG4gICAgICAgIClcbiAgICApXG4gIH1cbn1cblxuZnVuY3Rpb24gb2soKSB7XG4gIHJldHVybiB0cnVlXG59XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZVxuICogQHJldHVybnMge3ZhbHVlIGlzIE5vZGV9XG4gKi9cbmZ1bmN0aW9uIGxvb2tzTGlrZUFOb2RlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICd0eXBlJyBpbiB2YWx1ZVxufVxuIiwgIi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGRcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2xvcihkKSB7XG4gIHJldHVybiAnXFx1MDAxQlszM20nICsgZCArICdcXHUwMDFCWzM5bSdcbn1cbiIsICIvKipcbiAqIEBpbXBvcnQge05vZGUgYXMgVW5pc3ROb2RlLCBQYXJlbnQgYXMgVW5pc3RQYXJlbnR9IGZyb20gJ3VuaXN0J1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge0V4Y2x1ZGU8aW1wb3J0KCd1bmlzdC11dGlsLWlzJykuVGVzdCwgdW5kZWZpbmVkPiB8IHVuZGVmaW5lZH0gVGVzdFxuICogICBUZXN0IGZyb20gYHVuaXN0LXV0aWwtaXNgLlxuICpcbiAqICAgTm90ZTogd2UgaGF2ZSByZW1vdmUgYW5kIGFkZCBgdW5kZWZpbmVkYCwgYmVjYXVzZSBvdGhlcndpc2Ugd2hlbiBnZW5lcmF0aW5nXG4gKiAgIGF1dG9tYXRpYyBgLmQudHNgIGZpbGVzLCBUUyB0cmllcyB0byBmbGF0dGVuIHBhdGhzIGZyb20gYSBsb2NhbCBwZXJzcGVjdGl2ZSxcbiAqICAgd2hpY2ggZG9lc25cdTIwMTl0IHdvcmsgd2hlbiBwdWJsaXNoaW5nIG9uIG5wbS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoXG4gKiAgIEZuIGV4dGVuZHMgKHZhbHVlOiBhbnkpID0+IHZhbHVlIGlzIGluZmVyIFRoaW5nXG4gKiAgID8gVGhpbmdcbiAqICAgOiBGYWxsYmFja1xuICogKX0gUHJlZGljYXRlXG4gKiAgIEdldCB0aGUgdmFsdWUgb2YgYSB0eXBlIGd1YXJkIGBGbmAuXG4gKiBAdGVtcGxhdGUgRm5cbiAqICAgVmFsdWU7IHR5cGljYWxseSBmdW5jdGlvbiB0aGF0IGlzIGEgdHlwZSBndWFyZCAoc3VjaCBhcyBgKHgpOiB4IGlzIFlgKS5cbiAqIEB0ZW1wbGF0ZSBGYWxsYmFja1xuICogICBWYWx1ZSB0byB5aWVsZCBpZiBgRm5gIGlzIG5vdCBhIHR5cGUgZ3VhcmQuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KFxuICogICBDaGVjayBleHRlbmRzIG51bGwgfCB1bmRlZmluZWQgLy8gTm8gdGVzdC5cbiAqICAgPyBWYWx1ZVxuICogICA6IFZhbHVlIGV4dGVuZHMge3R5cGU6IENoZWNrfSAvLyBTdHJpbmcgKHR5cGUpIHRlc3QuXG4gKiAgID8gVmFsdWVcbiAqICAgOiBWYWx1ZSBleHRlbmRzIENoZWNrIC8vIFBhcnRpYWwgdGVzdC5cbiAqICAgPyBWYWx1ZVxuICogICA6IENoZWNrIGV4dGVuZHMgRnVuY3Rpb24gLy8gRnVuY3Rpb24gdGVzdC5cbiAqICAgPyBQcmVkaWNhdGU8Q2hlY2ssIFZhbHVlPiBleHRlbmRzIFZhbHVlXG4gKiAgICAgPyBQcmVkaWNhdGU8Q2hlY2ssIFZhbHVlPlxuICogICAgIDogbmV2ZXJcbiAqICAgOiBuZXZlciAvLyBTb21lIG90aGVyIHRlc3Q/XG4gKiApfSBNYXRjaGVzT25lXG4gKiAgIENoZWNrIHdoZXRoZXIgYSBub2RlIG1hdGNoZXMgYSBwcmltaXRpdmUgY2hlY2sgaW4gdGhlIHR5cGUgc3lzdGVtLlxuICogQHRlbXBsYXRlIFZhbHVlXG4gKiAgIFZhbHVlOyB0eXBpY2FsbHkgdW5pc3QgYE5vZGVgLlxuICogQHRlbXBsYXRlIENoZWNrXG4gKiAgIFZhbHVlOyB0eXBpY2FsbHkgYHVuaXN0LXV0aWwtaXNgLWNvbXBhdGlibGUgdGVzdCwgYnV0IG5vdCBhcnJheXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KFxuICogICBDaGVjayBleHRlbmRzIFJlYWRvbmx5QXJyYXk8aW5mZXIgVD5cbiAqICAgPyBNYXRjaGVzT25lPFZhbHVlLCBUPlxuICogICA6IENoZWNrIGV4dGVuZHMgQXJyYXk8aW5mZXIgVD5cbiAqICAgPyBNYXRjaGVzT25lPFZhbHVlLCBUPlxuICogICA6IE1hdGNoZXNPbmU8VmFsdWUsIENoZWNrPlxuICogKX0gTWF0Y2hlc1xuICogICBDaGVjayB3aGV0aGVyIGEgbm9kZSBtYXRjaGVzIGEgY2hlY2sgaW4gdGhlIHR5cGUgc3lzdGVtLlxuICogQHRlbXBsYXRlIFZhbHVlXG4gKiAgIFZhbHVlOyB0eXBpY2FsbHkgdW5pc3QgYE5vZGVgLlxuICogQHRlbXBsYXRlIENoZWNrXG4gKiAgIFZhbHVlOyB0eXBpY2FsbHkgYHVuaXN0LXV0aWwtaXNgLWNvbXBhdGlibGUgdGVzdC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHswIHwgMSB8IDIgfCAzIHwgNCB8IDUgfCA2IHwgNyB8IDggfCA5IHwgMTB9IFVpbnRcbiAqICAgTnVtYmVyOyBjYXBwZWQgcmVhc29uYWJseS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtJIGV4dGVuZHMgMCA/IDEgOiBJIGV4dGVuZHMgMSA/IDIgOiBJIGV4dGVuZHMgMiA/IDMgOiBJIGV4dGVuZHMgMyA/IDQgOiBJIGV4dGVuZHMgNCA/IDUgOiBJIGV4dGVuZHMgNSA/IDYgOiBJIGV4dGVuZHMgNiA/IDcgOiBJIGV4dGVuZHMgNyA/IDggOiBJIGV4dGVuZHMgOCA/IDkgOiAxMH0gSW5jcmVtZW50XG4gKiAgIEluY3JlbWVudCBhIG51bWJlciBpbiB0aGUgdHlwZSBzeXN0ZW0uXG4gKiBAdGVtcGxhdGUge1VpbnR9IFtJPTBdXG4gKiAgIEluZGV4LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyhcbiAqICAgTm9kZSBleHRlbmRzIFVuaXN0UGFyZW50XG4gKiAgID8gTm9kZSBleHRlbmRzIHtjaGlsZHJlbjogQXJyYXk8aW5mZXIgQ2hpbGRyZW4+fVxuICogICAgID8gQ2hpbGQgZXh0ZW5kcyBDaGlsZHJlbiA/IE5vZGUgOiBuZXZlclxuICogICAgIDogbmV2ZXJcbiAqICAgOiBuZXZlclxuICogKX0gSW50ZXJuYWxQYXJlbnRcbiAqICAgQ29sbGVjdCBub2RlcyB0aGF0IGNhbiBiZSBwYXJlbnRzIG9mIGBDaGlsZGAuXG4gKiBAdGVtcGxhdGUge1VuaXN0Tm9kZX0gTm9kZVxuICogICBBbGwgbm9kZSB0eXBlcyBpbiBhIHRyZWUuXG4gKiBAdGVtcGxhdGUge1VuaXN0Tm9kZX0gQ2hpbGRcbiAqICAgTm9kZSB0byBzZWFyY2ggZm9yLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge0ludGVybmFsUGFyZW50PEluY2x1c2l2ZURlc2NlbmRhbnQ8VHJlZT4sIENoaWxkPn0gUGFyZW50XG4gKiAgIENvbGxlY3Qgbm9kZXMgaW4gYFRyZWVgIHRoYXQgY2FuIGJlIHBhcmVudHMgb2YgYENoaWxkYC5cbiAqIEB0ZW1wbGF0ZSB7VW5pc3ROb2RlfSBUcmVlXG4gKiAgIEFsbCBub2RlIHR5cGVzIGluIGEgdHJlZS5cbiAqIEB0ZW1wbGF0ZSB7VW5pc3ROb2RlfSBDaGlsZFxuICogICBOb2RlIHRvIHNlYXJjaCBmb3IuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KFxuICogICBEZXB0aCBleHRlbmRzIE1heFxuICogICA/IG5ldmVyXG4gKiAgIDpcbiAqICAgICB8IEludGVybmFsUGFyZW50PE5vZGUsIENoaWxkPlxuICogICAgIHwgSW50ZXJuYWxBbmNlc3RvcjxOb2RlLCBJbnRlcm5hbFBhcmVudDxOb2RlLCBDaGlsZD4sIE1heCwgSW5jcmVtZW50PERlcHRoPj5cbiAqICl9IEludGVybmFsQW5jZXN0b3JcbiAqICAgQ29sbGVjdCBub2RlcyBpbiBgVHJlZWAgdGhhdCBjYW4gYmUgYW5jZXN0b3JzIG9mIGBDaGlsZGAuXG4gKiBAdGVtcGxhdGUge1VuaXN0Tm9kZX0gTm9kZVxuICogICBBbGwgbm9kZSB0eXBlcyBpbiBhIHRyZWUuXG4gKiBAdGVtcGxhdGUge1VuaXN0Tm9kZX0gQ2hpbGRcbiAqICAgTm9kZSB0byBzZWFyY2ggZm9yLlxuICogQHRlbXBsYXRlIHtVaW50fSBbTWF4PTEwXVxuICogICBNYXg7IHNlYXJjaGVzIHVwIHRvIHRoaXMgZGVwdGguXG4gKiBAdGVtcGxhdGUge1VpbnR9IFtEZXB0aD0wXVxuICogICBDdXJyZW50IGRlcHRoLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge0ludGVybmFsQW5jZXN0b3I8SW5jbHVzaXZlRGVzY2VuZGFudDxUcmVlPiwgQ2hpbGQ+fSBBbmNlc3RvclxuICogICBDb2xsZWN0IG5vZGVzIGluIGBUcmVlYCB0aGF0IGNhbiBiZSBhbmNlc3RvcnMgb2YgYENoaWxkYC5cbiAqIEB0ZW1wbGF0ZSB7VW5pc3ROb2RlfSBUcmVlXG4gKiAgIEFsbCBub2RlIHR5cGVzIGluIGEgdHJlZS5cbiAqIEB0ZW1wbGF0ZSB7VW5pc3ROb2RlfSBDaGlsZFxuICogICBOb2RlIHRvIHNlYXJjaCBmb3IuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KFxuICogICBUcmVlIGV4dGVuZHMgVW5pc3RQYXJlbnRcbiAqICAgICA/IERlcHRoIGV4dGVuZHMgTWF4XG4gKiAgICAgICA/IFRyZWVcbiAqICAgICAgIDogVHJlZSB8IEluY2x1c2l2ZURlc2NlbmRhbnQ8VHJlZVsnY2hpbGRyZW4nXVtudW1iZXJdLCBNYXgsIEluY3JlbWVudDxEZXB0aD4+XG4gKiAgICAgOiBUcmVlXG4gKiApfSBJbmNsdXNpdmVEZXNjZW5kYW50XG4gKiAgIENvbGxlY3QgYWxsIChpbmNsdXNpdmUpIGRlc2NlbmRhbnRzIG9mIGBUcmVlYC5cbiAqXG4gKiAgID4gXHVEODNEXHVEQzQ5ICoqTm90ZSoqOiBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgdGhpcyBzZWVtcyB0byBiZSB0aGUgZmFzdGVzdCB3YXkgdG9cbiAqICAgPiByZWN1cnNlIHdpdGhvdXQgYWN0dWFsbHkgcnVubmluZyBpbnRvIGFuIGluZmluaXRlIGxvb3AsIHdoaWNoIHRoZVxuICogICA+IHByZXZpb3VzIHZlcnNpb24gZGlkLlxuICogICA+XG4gKiAgID4gUHJhY3RpY2FsbHksIGEgbWF4IG9mIGAyYCBpcyB0eXBpY2FsbHkgZW5vdWdoIGFzc3VtaW5nIGEgYFJvb3RgIGlzXG4gKiAgID4gcGFzc2VkLCBidXQgaXQgZG9lc25cdTIwMTl0IGltcHJvdmUgcGVyZm9ybWFuY2UuXG4gKiAgID4gSXQgZ2V0cyBoaWdoZXIgd2l0aCBgTGlzdCA+IExpc3RJdGVtID4gVGFibGUgPiBUYWJsZVJvdyA+IFRhYmxlQ2VsbGAuXG4gKiAgID4gVXNpbmcgdXAgdG8gYDEwYCBkb2Vzblx1MjAxOXQgaHVydCBvciBoZWxwIGVpdGhlci5cbiAqIEB0ZW1wbGF0ZSB7VW5pc3ROb2RlfSBUcmVlXG4gKiAgIFRyZWUgdHlwZS5cbiAqIEB0ZW1wbGF0ZSB7VWludH0gW01heD0xMF1cbiAqICAgTWF4OyBzZWFyY2hlcyB1cCB0byB0aGlzIGRlcHRoLlxuICogQHRlbXBsYXRlIHtVaW50fSBbRGVwdGg9MF1cbiAqICAgQ3VycmVudCBkZXB0aC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsnc2tpcCcgfCBib29sZWFufSBBY3Rpb25cbiAqICAgVW5pb24gb2YgdGhlIGFjdGlvbiB0eXBlcy5cbiAqXG4gKiBAdHlwZWRlZiB7bnVtYmVyfSBJbmRleFxuICogICBNb3ZlIHRvIHRoZSBzaWJsaW5nIGF0IGBpbmRleGAgbmV4dCAoYWZ0ZXIgbm9kZSBpdHNlbGYgaXMgY29tcGxldGVseVxuICogICB0cmF2ZXJzZWQpLlxuICpcbiAqICAgVXNlZnVsIGlmIG11dGF0aW5nIHRoZSB0cmVlLCBzdWNoIGFzIHJlbW92aW5nIHRoZSBub2RlIHRoZSB2aXNpdG9yIGlzXG4gKiAgIGN1cnJlbnRseSBvbiwgb3IgYW55IG9mIGl0cyBwcmV2aW91cyBzaWJsaW5ncy5cbiAqICAgUmVzdWx0cyBsZXNzIHRoYW4gMCBvciBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gYGNoaWxkcmVuLmxlbmd0aGAgc3RvcFxuICogICB0cmF2ZXJzaW5nIHRoZSBwYXJlbnQuXG4gKlxuICogQHR5cGVkZWYge1soQWN0aW9uIHwgbnVsbCB8IHVuZGVmaW5lZCB8IHZvaWQpPywgKEluZGV4IHwgbnVsbCB8IHVuZGVmaW5lZCk/XX0gQWN0aW9uVHVwbGVcbiAqICAgTGlzdCB3aXRoIG9uZSBvciB0d28gdmFsdWVzLCB0aGUgZmlyc3QgYW4gYWN0aW9uLCB0aGUgc2Vjb25kIGFuIGluZGV4LlxuICpcbiAqIEB0eXBlZGVmIHtBY3Rpb24gfCBBY3Rpb25UdXBsZSB8IEluZGV4IHwgbnVsbCB8IHVuZGVmaW5lZCB8IHZvaWR9IFZpc2l0b3JSZXN1bHRcbiAqICAgQW55IHZhbHVlIHRoYXQgY2FuIGJlIHJldHVybmVkIGZyb20gYSB2aXNpdG9yLlxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFZpc2l0b3JcbiAqICAgSGFuZGxlIGEgbm9kZSAobWF0Y2hpbmcgYHRlc3RgLCBpZiBnaXZlbikuXG4gKlxuICogICBWaXNpdG9ycyBhcmUgZnJlZSB0byB0cmFuc2Zvcm0gYG5vZGVgLlxuICogICBUaGV5IGNhbiBhbHNvIHRyYW5zZm9ybSB0aGUgcGFyZW50IG9mIG5vZGUgKHRoZSBsYXN0IG9mIGBhbmNlc3RvcnNgKS5cbiAqXG4gKiAgIFJlcGxhY2luZyBgbm9kZWAgaXRzZWxmLCBpZiBgU0tJUGAgaXMgbm90IHJldHVybmVkLCBzdGlsbCBjYXVzZXMgaXRzXG4gKiAgIGRlc2NlbmRhbnRzIHRvIGJlIHdhbGtlZCAod2hpY2ggaXMgYSBidWcpLlxuICpcbiAqICAgV2hlbiBhZGRpbmcgb3IgcmVtb3ZpbmcgcHJldmlvdXMgc2libGluZ3Mgb2YgYG5vZGVgIChvciBuZXh0IHNpYmxpbmdzLCBpblxuICogICBjYXNlIG9mIHJldmVyc2UpLCB0aGUgYFZpc2l0b3JgIHNob3VsZCByZXR1cm4gYSBuZXcgYEluZGV4YCB0byBzcGVjaWZ5IHRoZVxuICogICBzaWJsaW5nIHRvIHRyYXZlcnNlIGFmdGVyIGBub2RlYCBpcyB0cmF2ZXJzZWQuXG4gKiAgIEFkZGluZyBvciByZW1vdmluZyBuZXh0IHNpYmxpbmdzIG9mIGBub2RlYCAob3IgcHJldmlvdXMgc2libGluZ3MsIGluIGNhc2VcbiAqICAgb2YgcmV2ZXJzZSkgaXMgaGFuZGxlZCBhcyBleHBlY3RlZCB3aXRob3V0IG5lZWRpbmcgdG8gcmV0dXJuIGEgbmV3IGBJbmRleGAuXG4gKlxuICogICBSZW1vdmluZyB0aGUgY2hpbGRyZW4gcHJvcGVydHkgb2YgYW4gYW5jZXN0b3Igc3RpbGwgcmVzdWx0cyBpbiB0aGVtIGJlaW5nXG4gKiAgIHRyYXZlcnNlZC5cbiAqIEBwYXJhbSB7VmlzaXRlZH0gbm9kZVxuICogICBGb3VuZCBub2RlLlxuICogQHBhcmFtIHtBcnJheTxWaXNpdGVkUGFyZW50cz59IGFuY2VzdG9yc1xuICogICBBbmNlc3RvcnMgb2YgYG5vZGVgLlxuICogQHJldHVybnMge1Zpc2l0b3JSZXN1bHR9XG4gKiAgIFdoYXQgdG8gZG8gbmV4dC5cbiAqXG4gKiAgIEFuIGBJbmRleGAgaXMgdHJlYXRlZCBhcyBhIHR1cGxlIG9mIGBbQ09OVElOVUUsIEluZGV4XWAuXG4gKiAgIEFuIGBBY3Rpb25gIGlzIHRyZWF0ZWQgYXMgYSB0dXBsZSBvZiBgW0FjdGlvbl1gLlxuICpcbiAqICAgUGFzc2luZyBhIHR1cGxlIGJhY2sgb25seSBtYWtlcyBzZW5zZSBpZiB0aGUgYEFjdGlvbmAgaXMgYFNLSVBgLlxuICogICBXaGVuIHRoZSBgQWN0aW9uYCBpcyBgRVhJVGAsIHRoYXQgYWN0aW9uIGNhbiBiZSByZXR1cm5lZC5cbiAqICAgV2hlbiB0aGUgYEFjdGlvbmAgaXMgYENPTlRJTlVFYCwgYEluZGV4YCBjYW4gYmUgcmV0dXJuZWQuXG4gKiBAdGVtcGxhdGUge1VuaXN0Tm9kZX0gW1Zpc2l0ZWQ9VW5pc3ROb2RlXVxuICogICBWaXNpdGVkIG5vZGUgdHlwZS5cbiAqIEB0ZW1wbGF0ZSB7VW5pc3RQYXJlbnR9IFtWaXNpdGVkUGFyZW50cz1VbmlzdFBhcmVudF1cbiAqICAgQW5jZXN0b3IgdHlwZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtWaXNpdG9yPE1hdGNoZXM8SW5jbHVzaXZlRGVzY2VuZGFudDxUcmVlPiwgQ2hlY2s+LCBBbmNlc3RvcjxUcmVlLCBNYXRjaGVzPEluY2x1c2l2ZURlc2NlbmRhbnQ8VHJlZT4sIENoZWNrPj4+fSBCdWlsZFZpc2l0b3JcbiAqICAgQnVpbGQgYSB0eXBlZCBgVmlzaXRvcmAgZnVuY3Rpb24gZnJvbSBhIHRyZWUgYW5kIGEgdGVzdC5cbiAqXG4gKiAgIEl0IHdpbGwgaW5mZXIgd2hpY2ggdmFsdWVzIGFyZSBwYXNzZWQgYXMgYG5vZGVgIGFuZCB3aGljaCBhcyBgcGFyZW50c2AuXG4gKiBAdGVtcGxhdGUge1VuaXN0Tm9kZX0gW1RyZWU9VW5pc3ROb2RlXVxuICogICBUcmVlIHR5cGUuXG4gKiBAdGVtcGxhdGUge1Rlc3R9IFtDaGVjaz1UZXN0XVxuICogICBUZXN0IHR5cGUuXG4gKi9cblxuaW1wb3J0IHtjb252ZXJ0fSBmcm9tICd1bmlzdC11dGlsLWlzJ1xuaW1wb3J0IHtjb2xvcn0gZnJvbSAndW5pc3QtdXRpbC12aXNpdC1wYXJlbnRzL2RvLW5vdC11c2UtY29sb3InXG5cbi8qKiBAdHlwZSB7UmVhZG9ubHk8QWN0aW9uVHVwbGU+fSAqL1xuY29uc3QgZW1wdHkgPSBbXVxuXG4vKipcbiAqIENvbnRpbnVlIHRyYXZlcnNpbmcgYXMgbm9ybWFsLlxuICovXG5leHBvcnQgY29uc3QgQ09OVElOVUUgPSB0cnVlXG5cbi8qKlxuICogU3RvcCB0cmF2ZXJzaW5nIGltbWVkaWF0ZWx5LlxuICovXG5leHBvcnQgY29uc3QgRVhJVCA9IGZhbHNlXG5cbi8qKlxuICogRG8gbm90IHRyYXZlcnNlIHRoaXMgbm9kZVx1MjAxOXMgY2hpbGRyZW4uXG4gKi9cbmV4cG9ydCBjb25zdCBTS0lQID0gJ3NraXAnXG5cbi8qKlxuICogVmlzaXQgbm9kZXMsIHdpdGggYW5jZXN0cmFsIGluZm9ybWF0aW9uLlxuICpcbiAqIFRoaXMgYWxnb3JpdGhtIHBlcmZvcm1zICpkZXB0aC1maXJzdCogKnRyZWUgdHJhdmVyc2FsKiBpbiAqcHJlb3JkZXIqXG4gKiAoKipOTFIqKikgb3IgaWYgYHJldmVyc2VgIGlzIGdpdmVuLCBpbiAqcmV2ZXJzZSBwcmVvcmRlciogKCoqTlJMKiopLlxuICpcbiAqIFlvdSBjYW4gY2hvb3NlIGZvciB3aGljaCBub2RlcyBgdmlzaXRvcmAgaXMgY2FsbGVkIGJ5IHBhc3NpbmcgYSBgdGVzdGAuXG4gKiBGb3IgY29tcGxleCB0ZXN0cywgeW91IHNob3VsZCB0ZXN0IHlvdXJzZWxmIGluIGB2aXNpdG9yYCwgYXMgaXQgd2lsbCBiZVxuICogZmFzdGVyIGFuZCB3aWxsIGhhdmUgaW1wcm92ZWQgdHlwZSBpbmZvcm1hdGlvbi5cbiAqXG4gKiBXYWxraW5nIHRoZSB0cmVlIGlzIGFuIGludGVuc2l2ZSB0YXNrLlxuICogTWFrZSB1c2Ugb2YgdGhlIHJldHVybiB2YWx1ZXMgb2YgdGhlIHZpc2l0b3Igd2hlbiBwb3NzaWJsZS5cbiAqIEluc3RlYWQgb2Ygd2Fsa2luZyBhIHRyZWUgbXVsdGlwbGUgdGltZXMsIHdhbGsgaXQgb25jZSwgdXNlIGB1bmlzdC11dGlsLWlzYFxuICogdG8gY2hlY2sgaWYgYSBub2RlIG1hdGNoZXMsIGFuZCB0aGVuIHBlcmZvcm0gZGlmZmVyZW50IG9wZXJhdGlvbnMuXG4gKlxuICogWW91IGNhbiBjaGFuZ2UgdGhlIHRyZWUuXG4gKiBTZWUgYFZpc2l0b3JgIGZvciBtb3JlIGluZm8uXG4gKlxuICogQG92ZXJsb2FkXG4gKiBAcGFyYW0ge1RyZWV9IHRyZWVcbiAqIEBwYXJhbSB7Q2hlY2t9IGNoZWNrXG4gKiBAcGFyYW0ge0J1aWxkVmlzaXRvcjxUcmVlLCBDaGVjaz59IHZpc2l0b3JcbiAqIEBwYXJhbSB7Ym9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWR9IFtyZXZlcnNlXVxuICogQHJldHVybnMge3VuZGVmaW5lZH1cbiAqXG4gKiBAb3ZlcmxvYWRcbiAqIEBwYXJhbSB7VHJlZX0gdHJlZVxuICogQHBhcmFtIHtCdWlsZFZpc2l0b3I8VHJlZT59IHZpc2l0b3JcbiAqIEBwYXJhbSB7Ym9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWR9IFtyZXZlcnNlXVxuICogQHJldHVybnMge3VuZGVmaW5lZH1cbiAqXG4gKiBAcGFyYW0ge1VuaXN0Tm9kZX0gdHJlZVxuICogICBUcmVlIHRvIHRyYXZlcnNlLlxuICogQHBhcmFtIHtWaXNpdG9yIHwgVGVzdH0gdGVzdFxuICogICBgdW5pc3QtdXRpbC1pc2AtY29tcGF0aWJsZSB0ZXN0XG4gKiBAcGFyYW0ge1Zpc2l0b3IgfCBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZH0gW3Zpc2l0b3JdXG4gKiAgIEhhbmRsZSBlYWNoIG5vZGUuXG4gKiBAcGFyYW0ge2Jvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkfSBbcmV2ZXJzZV1cbiAqICAgVHJhdmVyc2UgaW4gcmV2ZXJzZSBwcmVvcmRlciAoTlJMKSBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IHByZW9yZGVyIChOTFIpLlxuICogQHJldHVybnMge3VuZGVmaW5lZH1cbiAqICAgTm90aGluZy5cbiAqXG4gKiBAdGVtcGxhdGUge1VuaXN0Tm9kZX0gVHJlZVxuICogICBOb2RlIHR5cGUuXG4gKiBAdGVtcGxhdGUge1Rlc3R9IENoZWNrXG4gKiAgIGB1bmlzdC11dGlsLWlzYC1jb21wYXRpYmxlIHRlc3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2aXNpdFBhcmVudHModHJlZSwgdGVzdCwgdmlzaXRvciwgcmV2ZXJzZSkge1xuICAvKiogQHR5cGUge1Rlc3R9ICovXG4gIGxldCBjaGVja1xuXG4gIGlmICh0eXBlb2YgdGVzdCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgdmlzaXRvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldmVyc2UgPSB2aXNpdG9yXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBubyB2aXNpdG9yIGdpdmVuLCBzbyBgdmlzaXRvcmAgaXMgdGVzdC5cbiAgICB2aXNpdG9yID0gdGVzdFxuICB9IGVsc2Uge1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgdmlzaXRvciBnaXZlbiwgc28gYHRlc3RgIGlzblx1MjAxOXQgYSB2aXNpdG9yLlxuICAgIGNoZWNrID0gdGVzdFxuICB9XG5cbiAgY29uc3QgaXMgPSBjb252ZXJ0KGNoZWNrKVxuICBjb25zdCBzdGVwID0gcmV2ZXJzZSA/IC0xIDogMVxuXG4gIGZhY3RvcnkodHJlZSwgdW5kZWZpbmVkLCBbXSkoKVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1VuaXN0Tm9kZX0gbm9kZVxuICAgKiBAcGFyYW0ge251bWJlciB8IHVuZGVmaW5lZH0gaW5kZXhcbiAgICogQHBhcmFtIHtBcnJheTxVbmlzdFBhcmVudD59IHBhcmVudHNcbiAgICovXG4gIGZ1bmN0aW9uIGZhY3Rvcnkobm9kZSwgaW5kZXgsIHBhcmVudHMpIHtcbiAgICBjb25zdCB2YWx1ZSA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovIChcbiAgICAgIG5vZGUgJiYgdHlwZW9mIG5vZGUgPT09ICdvYmplY3QnID8gbm9kZSA6IHt9XG4gICAgKVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZS50eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc3QgbmFtZSA9XG4gICAgICAgIC8vIGBoYXN0YFxuICAgICAgICB0eXBlb2YgdmFsdWUudGFnTmFtZSA9PT0gJ3N0cmluZydcbiAgICAgICAgICA/IHZhbHVlLnRhZ05hbWVcbiAgICAgICAgICA6IC8vIGB4YXN0YFxuICAgICAgICAgICAgdHlwZW9mIHZhbHVlLm5hbWUgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICA/IHZhbHVlLm5hbWVcbiAgICAgICAgICAgIDogdW5kZWZpbmVkXG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh2aXNpdCwgJ25hbWUnLCB7XG4gICAgICAgIHZhbHVlOlxuICAgICAgICAgICdub2RlICgnICsgY29sb3Iobm9kZS50eXBlICsgKG5hbWUgPyAnPCcgKyBuYW1lICsgJz4nIDogJycpKSArICcpJ1xuICAgICAgfSlcbiAgICB9XG5cbiAgICByZXR1cm4gdmlzaXRcblxuICAgIGZ1bmN0aW9uIHZpc2l0KCkge1xuICAgICAgLyoqIEB0eXBlIHtSZWFkb25seTxBY3Rpb25UdXBsZT59ICovXG4gICAgICBsZXQgcmVzdWx0ID0gZW1wdHlcbiAgICAgIC8qKiBAdHlwZSB7UmVhZG9ubHk8QWN0aW9uVHVwbGU+fSAqL1xuICAgICAgbGV0IHN1YnJlc3VsdFxuICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICBsZXQgb2Zmc2V0XG4gICAgICAvKiogQHR5cGUge0FycmF5PFVuaXN0UGFyZW50Pn0gKi9cbiAgICAgIGxldCBncmFuZHBhcmVudHNcblxuICAgICAgaWYgKCF0ZXN0IHx8IGlzKG5vZGUsIGluZGV4LCBwYXJlbnRzW3BhcmVudHMubGVuZ3RoIC0gMV0gfHwgdW5kZWZpbmVkKSkge1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBgdmlzaXRvcmAgaXMgbm93IGEgdmlzaXRvci5cbiAgICAgICAgcmVzdWx0ID0gdG9SZXN1bHQodmlzaXRvcihub2RlLCBwYXJlbnRzKSlcblxuICAgICAgICBpZiAocmVzdWx0WzBdID09PSBFWElUKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICgnY2hpbGRyZW4nIGluIG5vZGUgJiYgbm9kZS5jaGlsZHJlbikge1xuICAgICAgICBjb25zdCBub2RlQXNQYXJlbnQgPSAvKiogQHR5cGUge1VuaXN0UGFyZW50fSAqLyAobm9kZSlcblxuICAgICAgICBpZiAobm9kZUFzUGFyZW50LmNoaWxkcmVuICYmIHJlc3VsdFswXSAhPT0gU0tJUCkge1xuICAgICAgICAgIG9mZnNldCA9IChyZXZlcnNlID8gbm9kZUFzUGFyZW50LmNoaWxkcmVuLmxlbmd0aCA6IC0xKSArIHN0ZXBcbiAgICAgICAgICBncmFuZHBhcmVudHMgPSBwYXJlbnRzLmNvbmNhdChub2RlQXNQYXJlbnQpXG5cbiAgICAgICAgICB3aGlsZSAob2Zmc2V0ID4gLTEgJiYgb2Zmc2V0IDwgbm9kZUFzUGFyZW50LmNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgY2hpbGQgPSBub2RlQXNQYXJlbnQuY2hpbGRyZW5bb2Zmc2V0XVxuXG4gICAgICAgICAgICBzdWJyZXN1bHQgPSBmYWN0b3J5KGNoaWxkLCBvZmZzZXQsIGdyYW5kcGFyZW50cykoKVxuXG4gICAgICAgICAgICBpZiAoc3VicmVzdWx0WzBdID09PSBFWElUKSB7XG4gICAgICAgICAgICAgIHJldHVybiBzdWJyZXN1bHRcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgb2Zmc2V0ID1cbiAgICAgICAgICAgICAgdHlwZW9mIHN1YnJlc3VsdFsxXSA9PT0gJ251bWJlcicgPyBzdWJyZXN1bHRbMV0gOiBvZmZzZXQgKyBzdGVwXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHRcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBUdXJuIGEgcmV0dXJuIHZhbHVlIGludG8gYSBjbGVhbiByZXN1bHQuXG4gKlxuICogQHBhcmFtIHtWaXNpdG9yUmVzdWx0fSB2YWx1ZVxuICogICBWYWxpZCByZXR1cm4gdmFsdWVzIGZyb20gdmlzaXRvcnMuXG4gKiBAcmV0dXJucyB7UmVhZG9ubHk8QWN0aW9uVHVwbGU+fVxuICogICBDbGVhbiByZXN1bHQuXG4gKi9cbmZ1bmN0aW9uIHRvUmVzdWx0KHZhbHVlKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gW0NPTlRJTlVFLCB2YWx1ZV1cbiAgfVxuXG4gIHJldHVybiB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gZW1wdHkgOiBbdmFsdWVdXG59XG4iLCAiLyoqXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCd1bmlzdCcpLk5vZGV9IFVuaXN0Tm9kZVxuICogQHR5cGVkZWYge2ltcG9ydCgndW5pc3QnKS5QYXJlbnR9IFVuaXN0UGFyZW50XG4gKiBAdHlwZWRlZiB7aW1wb3J0KCd1bmlzdC11dGlsLXZpc2l0LXBhcmVudHMnKS5WaXNpdG9yUmVzdWx0fSBWaXNpdG9yUmVzdWx0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7RXhjbHVkZTxpbXBvcnQoJ3VuaXN0LXV0aWwtaXMnKS5UZXN0LCB1bmRlZmluZWQ+IHwgdW5kZWZpbmVkfSBUZXN0XG4gKiAgIFRlc3QgZnJvbSBgdW5pc3QtdXRpbC1pc2AuXG4gKlxuICogICBOb3RlOiB3ZSBoYXZlIHJlbW92ZSBhbmQgYWRkIGB1bmRlZmluZWRgLCBiZWNhdXNlIG90aGVyd2lzZSB3aGVuIGdlbmVyYXRpbmdcbiAqICAgYXV0b21hdGljIGAuZC50c2AgZmlsZXMsIFRTIHRyaWVzIHRvIGZsYXR0ZW4gcGF0aHMgZnJvbSBhIGxvY2FsIHBlcnNwZWN0aXZlLFxuICogICB3aGljaCBkb2Vzblx1MjAxOXQgd29yayB3aGVuIHB1Ymxpc2hpbmcgb24gbnBtLlxuICovXG5cbi8vIFRvIGRvOiB1c2UgdHlwZXMgZnJvbSBgdW5pc3QtdXRpbC12aXNpdC1wYXJlbnRzYCB3aGVuIGl0XHUyMDE5cyByZWxlYXNlZC5cblxuLyoqXG4gKiBAdHlwZWRlZiB7KFxuICogICBGbiBleHRlbmRzICh2YWx1ZTogYW55KSA9PiB2YWx1ZSBpcyBpbmZlciBUaGluZ1xuICogICA/IFRoaW5nXG4gKiAgIDogRmFsbGJhY2tcbiAqICl9IFByZWRpY2F0ZVxuICogICBHZXQgdGhlIHZhbHVlIG9mIGEgdHlwZSBndWFyZCBgRm5gLlxuICogQHRlbXBsYXRlIEZuXG4gKiAgIFZhbHVlOyB0eXBpY2FsbHkgZnVuY3Rpb24gdGhhdCBpcyBhIHR5cGUgZ3VhcmQgKHN1Y2ggYXMgYCh4KTogeCBpcyBZYCkuXG4gKiBAdGVtcGxhdGUgRmFsbGJhY2tcbiAqICAgVmFsdWUgdG8geWllbGQgaWYgYEZuYCBpcyBub3QgYSB0eXBlIGd1YXJkLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyhcbiAqICAgQ2hlY2sgZXh0ZW5kcyBudWxsIHwgdW5kZWZpbmVkIC8vIE5vIHRlc3QuXG4gKiAgID8gVmFsdWVcbiAqICAgOiBWYWx1ZSBleHRlbmRzIHt0eXBlOiBDaGVja30gLy8gU3RyaW5nICh0eXBlKSB0ZXN0LlxuICogICA/IFZhbHVlXG4gKiAgIDogVmFsdWUgZXh0ZW5kcyBDaGVjayAvLyBQYXJ0aWFsIHRlc3QuXG4gKiAgID8gVmFsdWVcbiAqICAgOiBDaGVjayBleHRlbmRzIEZ1bmN0aW9uIC8vIEZ1bmN0aW9uIHRlc3QuXG4gKiAgID8gUHJlZGljYXRlPENoZWNrLCBWYWx1ZT4gZXh0ZW5kcyBWYWx1ZVxuICogICAgID8gUHJlZGljYXRlPENoZWNrLCBWYWx1ZT5cbiAqICAgICA6IG5ldmVyXG4gKiAgIDogbmV2ZXIgLy8gU29tZSBvdGhlciB0ZXN0P1xuICogKX0gTWF0Y2hlc09uZVxuICogICBDaGVjayB3aGV0aGVyIGEgbm9kZSBtYXRjaGVzIGEgcHJpbWl0aXZlIGNoZWNrIGluIHRoZSB0eXBlIHN5c3RlbS5cbiAqIEB0ZW1wbGF0ZSBWYWx1ZVxuICogICBWYWx1ZTsgdHlwaWNhbGx5IHVuaXN0IGBOb2RlYC5cbiAqIEB0ZW1wbGF0ZSBDaGVja1xuICogICBWYWx1ZTsgdHlwaWNhbGx5IGB1bmlzdC11dGlsLWlzYC1jb21wYXRpYmxlIHRlc3QsIGJ1dCBub3QgYXJyYXlzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyhcbiAqICAgQ2hlY2sgZXh0ZW5kcyBBcnJheTxhbnk+XG4gKiAgID8gTWF0Y2hlc09uZTxWYWx1ZSwgQ2hlY2tba2V5b2YgQ2hlY2tdPlxuICogICA6IE1hdGNoZXNPbmU8VmFsdWUsIENoZWNrPlxuICogKX0gTWF0Y2hlc1xuICogICBDaGVjayB3aGV0aGVyIGEgbm9kZSBtYXRjaGVzIGEgY2hlY2sgaW4gdGhlIHR5cGUgc3lzdGVtLlxuICogQHRlbXBsYXRlIFZhbHVlXG4gKiAgIFZhbHVlOyB0eXBpY2FsbHkgdW5pc3QgYE5vZGVgLlxuICogQHRlbXBsYXRlIENoZWNrXG4gKiAgIFZhbHVlOyB0eXBpY2FsbHkgYHVuaXN0LXV0aWwtaXNgLWNvbXBhdGlibGUgdGVzdC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHswIHwgMSB8IDIgfCAzIHwgNCB8IDUgfCA2IHwgNyB8IDggfCA5IHwgMTB9IFVpbnRcbiAqICAgTnVtYmVyOyBjYXBwZWQgcmVhc29uYWJseS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtJIGV4dGVuZHMgMCA/IDEgOiBJIGV4dGVuZHMgMSA/IDIgOiBJIGV4dGVuZHMgMiA/IDMgOiBJIGV4dGVuZHMgMyA/IDQgOiBJIGV4dGVuZHMgNCA/IDUgOiBJIGV4dGVuZHMgNSA/IDYgOiBJIGV4dGVuZHMgNiA/IDcgOiBJIGV4dGVuZHMgNyA/IDggOiBJIGV4dGVuZHMgOCA/IDkgOiAxMH0gSW5jcmVtZW50XG4gKiAgIEluY3JlbWVudCBhIG51bWJlciBpbiB0aGUgdHlwZSBzeXN0ZW0uXG4gKiBAdGVtcGxhdGUge1VpbnR9IFtJPTBdXG4gKiAgIEluZGV4LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyhcbiAqICAgTm9kZSBleHRlbmRzIFVuaXN0UGFyZW50XG4gKiAgID8gTm9kZSBleHRlbmRzIHtjaGlsZHJlbjogQXJyYXk8aW5mZXIgQ2hpbGRyZW4+fVxuICogICAgID8gQ2hpbGQgZXh0ZW5kcyBDaGlsZHJlbiA/IE5vZGUgOiBuZXZlclxuICogICAgIDogbmV2ZXJcbiAqICAgOiBuZXZlclxuICogKX0gSW50ZXJuYWxQYXJlbnRcbiAqICAgQ29sbGVjdCBub2RlcyB0aGF0IGNhbiBiZSBwYXJlbnRzIG9mIGBDaGlsZGAuXG4gKiBAdGVtcGxhdGUge1VuaXN0Tm9kZX0gTm9kZVxuICogICBBbGwgbm9kZSB0eXBlcyBpbiBhIHRyZWUuXG4gKiBAdGVtcGxhdGUge1VuaXN0Tm9kZX0gQ2hpbGRcbiAqICAgTm9kZSB0byBzZWFyY2ggZm9yLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge0ludGVybmFsUGFyZW50PEluY2x1c2l2ZURlc2NlbmRhbnQ8VHJlZT4sIENoaWxkPn0gUGFyZW50XG4gKiAgIENvbGxlY3Qgbm9kZXMgaW4gYFRyZWVgIHRoYXQgY2FuIGJlIHBhcmVudHMgb2YgYENoaWxkYC5cbiAqIEB0ZW1wbGF0ZSB7VW5pc3ROb2RlfSBUcmVlXG4gKiAgIEFsbCBub2RlIHR5cGVzIGluIGEgdHJlZS5cbiAqIEB0ZW1wbGF0ZSB7VW5pc3ROb2RlfSBDaGlsZFxuICogICBOb2RlIHRvIHNlYXJjaCBmb3IuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KFxuICogICBEZXB0aCBleHRlbmRzIE1heFxuICogICA/IG5ldmVyXG4gKiAgIDpcbiAqICAgICB8IEludGVybmFsUGFyZW50PE5vZGUsIENoaWxkPlxuICogICAgIHwgSW50ZXJuYWxBbmNlc3RvcjxOb2RlLCBJbnRlcm5hbFBhcmVudDxOb2RlLCBDaGlsZD4sIE1heCwgSW5jcmVtZW50PERlcHRoPj5cbiAqICl9IEludGVybmFsQW5jZXN0b3JcbiAqICAgQ29sbGVjdCBub2RlcyBpbiBgVHJlZWAgdGhhdCBjYW4gYmUgYW5jZXN0b3JzIG9mIGBDaGlsZGAuXG4gKiBAdGVtcGxhdGUge1VuaXN0Tm9kZX0gTm9kZVxuICogICBBbGwgbm9kZSB0eXBlcyBpbiBhIHRyZWUuXG4gKiBAdGVtcGxhdGUge1VuaXN0Tm9kZX0gQ2hpbGRcbiAqICAgTm9kZSB0byBzZWFyY2ggZm9yLlxuICogQHRlbXBsYXRlIHtVaW50fSBbTWF4PTEwXVxuICogICBNYXg7IHNlYXJjaGVzIHVwIHRvIHRoaXMgZGVwdGguXG4gKiBAdGVtcGxhdGUge1VpbnR9IFtEZXB0aD0wXVxuICogICBDdXJyZW50IGRlcHRoLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyhcbiAqICAgVHJlZSBleHRlbmRzIFVuaXN0UGFyZW50XG4gKiAgICAgPyBEZXB0aCBleHRlbmRzIE1heFxuICogICAgICAgPyBUcmVlXG4gKiAgICAgICA6IFRyZWUgfCBJbmNsdXNpdmVEZXNjZW5kYW50PFRyZWVbJ2NoaWxkcmVuJ11bbnVtYmVyXSwgTWF4LCBJbmNyZW1lbnQ8RGVwdGg+PlxuICogICAgIDogVHJlZVxuICogKX0gSW5jbHVzaXZlRGVzY2VuZGFudFxuICogICBDb2xsZWN0IGFsbCAoaW5jbHVzaXZlKSBkZXNjZW5kYW50cyBvZiBgVHJlZWAuXG4gKlxuICogICA+IFx1RDgzRFx1REM0OSAqKk5vdGUqKjogZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIHRoaXMgc2VlbXMgdG8gYmUgdGhlIGZhc3Rlc3Qgd2F5IHRvXG4gKiAgID4gcmVjdXJzZSB3aXRob3V0IGFjdHVhbGx5IHJ1bm5pbmcgaW50byBhbiBpbmZpbml0ZSBsb29wLCB3aGljaCB0aGVcbiAqICAgPiBwcmV2aW91cyB2ZXJzaW9uIGRpZC5cbiAqICAgPlxuICogICA+IFByYWN0aWNhbGx5LCBhIG1heCBvZiBgMmAgaXMgdHlwaWNhbGx5IGVub3VnaCBhc3N1bWluZyBhIGBSb290YCBpc1xuICogICA+IHBhc3NlZCwgYnV0IGl0IGRvZXNuXHUyMDE5dCBpbXByb3ZlIHBlcmZvcm1hbmNlLlxuICogICA+IEl0IGdldHMgaGlnaGVyIHdpdGggYExpc3QgPiBMaXN0SXRlbSA+IFRhYmxlID4gVGFibGVSb3cgPiBUYWJsZUNlbGxgLlxuICogICA+IFVzaW5nIHVwIHRvIGAxMGAgZG9lc25cdTIwMTl0IGh1cnQgb3IgaGVscCBlaXRoZXIuXG4gKiBAdGVtcGxhdGUge1VuaXN0Tm9kZX0gVHJlZVxuICogICBUcmVlIHR5cGUuXG4gKiBAdGVtcGxhdGUge1VpbnR9IFtNYXg9MTBdXG4gKiAgIE1heDsgc2VhcmNoZXMgdXAgdG8gdGhpcyBkZXB0aC5cbiAqIEB0ZW1wbGF0ZSB7VWludH0gW0RlcHRoPTBdXG4gKiAgIEN1cnJlbnQgZGVwdGguXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgVmlzaXRvclxuICogICBIYW5kbGUgYSBub2RlIChtYXRjaGluZyBgdGVzdGAsIGlmIGdpdmVuKS5cbiAqXG4gKiAgIFZpc2l0b3JzIGFyZSBmcmVlIHRvIHRyYW5zZm9ybSBgbm9kZWAuXG4gKiAgIFRoZXkgY2FuIGFsc28gdHJhbnNmb3JtIGBwYXJlbnRgLlxuICpcbiAqICAgUmVwbGFjaW5nIGBub2RlYCBpdHNlbGYsIGlmIGBTS0lQYCBpcyBub3QgcmV0dXJuZWQsIHN0aWxsIGNhdXNlcyBpdHNcbiAqICAgZGVzY2VuZGFudHMgdG8gYmUgd2Fsa2VkICh3aGljaCBpcyBhIGJ1ZykuXG4gKlxuICogICBXaGVuIGFkZGluZyBvciByZW1vdmluZyBwcmV2aW91cyBzaWJsaW5ncyBvZiBgbm9kZWAgKG9yIG5leHQgc2libGluZ3MsIGluXG4gKiAgIGNhc2Ugb2YgcmV2ZXJzZSksIHRoZSBgVmlzaXRvcmAgc2hvdWxkIHJldHVybiBhIG5ldyBgSW5kZXhgIHRvIHNwZWNpZnkgdGhlXG4gKiAgIHNpYmxpbmcgdG8gdHJhdmVyc2UgYWZ0ZXIgYG5vZGVgIGlzIHRyYXZlcnNlZC5cbiAqICAgQWRkaW5nIG9yIHJlbW92aW5nIG5leHQgc2libGluZ3Mgb2YgYG5vZGVgIChvciBwcmV2aW91cyBzaWJsaW5ncywgaW4gY2FzZVxuICogICBvZiByZXZlcnNlKSBpcyBoYW5kbGVkIGFzIGV4cGVjdGVkIHdpdGhvdXQgbmVlZGluZyB0byByZXR1cm4gYSBuZXcgYEluZGV4YC5cbiAqXG4gKiAgIFJlbW92aW5nIHRoZSBjaGlsZHJlbiBwcm9wZXJ0eSBvZiBgcGFyZW50YCBzdGlsbCByZXN1bHRzIGluIHRoZW0gYmVpbmdcbiAqICAgdHJhdmVyc2VkLlxuICogQHBhcmFtIHtWaXNpdGVkfSBub2RlXG4gKiAgIEZvdW5kIG5vZGUuXG4gKiBAcGFyYW0ge1Zpc2l0ZWQgZXh0ZW5kcyBVbmlzdE5vZGUgPyBudW1iZXIgfCB1bmRlZmluZWQgOiBuZXZlcn0gaW5kZXhcbiAqICAgSW5kZXggb2YgYG5vZGVgIGluIGBwYXJlbnRgLlxuICogQHBhcmFtIHtBbmNlc3RvciBleHRlbmRzIFVuaXN0UGFyZW50ID8gQW5jZXN0b3IgfCB1bmRlZmluZWQgOiBuZXZlcn0gcGFyZW50XG4gKiAgIFBhcmVudCBvZiBgbm9kZWAuXG4gKiBAcmV0dXJucyB7VmlzaXRvclJlc3VsdH1cbiAqICAgV2hhdCB0byBkbyBuZXh0LlxuICpcbiAqICAgQW4gYEluZGV4YCBpcyB0cmVhdGVkIGFzIGEgdHVwbGUgb2YgYFtDT05USU5VRSwgSW5kZXhdYC5cbiAqICAgQW4gYEFjdGlvbmAgaXMgdHJlYXRlZCBhcyBhIHR1cGxlIG9mIGBbQWN0aW9uXWAuXG4gKlxuICogICBQYXNzaW5nIGEgdHVwbGUgYmFjayBvbmx5IG1ha2VzIHNlbnNlIGlmIHRoZSBgQWN0aW9uYCBpcyBgU0tJUGAuXG4gKiAgIFdoZW4gdGhlIGBBY3Rpb25gIGlzIGBFWElUYCwgdGhhdCBhY3Rpb24gY2FuIGJlIHJldHVybmVkLlxuICogICBXaGVuIHRoZSBgQWN0aW9uYCBpcyBgQ09OVElOVUVgLCBgSW5kZXhgIGNhbiBiZSByZXR1cm5lZC5cbiAqIEB0ZW1wbGF0ZSB7VW5pc3ROb2RlfSBbVmlzaXRlZD1VbmlzdE5vZGVdXG4gKiAgIFZpc2l0ZWQgbm9kZSB0eXBlLlxuICogQHRlbXBsYXRlIHtVbmlzdFBhcmVudH0gW0FuY2VzdG9yPVVuaXN0UGFyZW50XVxuICogICBBbmNlc3RvciB0eXBlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1Zpc2l0b3I8VmlzaXRlZCwgUGFyZW50PEFuY2VzdG9yLCBWaXNpdGVkPj59IEJ1aWxkVmlzaXRvckZyb21NYXRjaFxuICogICBCdWlsZCBhIHR5cGVkIGBWaXNpdG9yYCBmdW5jdGlvbiBmcm9tIGEgbm9kZSBhbmQgYWxsIHBvc3NpYmxlIHBhcmVudHMuXG4gKlxuICogICBJdCB3aWxsIGluZmVyIHdoaWNoIHZhbHVlcyBhcmUgcGFzc2VkIGFzIGBub2RlYCBhbmQgd2hpY2ggYXMgYHBhcmVudGAuXG4gKiBAdGVtcGxhdGUge1VuaXN0Tm9kZX0gVmlzaXRlZFxuICogICBOb2RlIHR5cGUuXG4gKiBAdGVtcGxhdGUge1VuaXN0UGFyZW50fSBBbmNlc3RvclxuICogICBQYXJlbnQgdHlwZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoXG4gKiAgIEJ1aWxkVmlzaXRvckZyb21NYXRjaDxcbiAqICAgICBNYXRjaGVzPERlc2NlbmRhbnQsIENoZWNrPixcbiAqICAgICBFeHRyYWN0PERlc2NlbmRhbnQsIFVuaXN0UGFyZW50PlxuICogICA+XG4gKiApfSBCdWlsZFZpc2l0b3JGcm9tRGVzY2VuZGFudHNcbiAqICAgQnVpbGQgYSB0eXBlZCBgVmlzaXRvcmAgZnVuY3Rpb24gZnJvbSBhIGxpc3Qgb2YgZGVzY2VuZGFudHMgYW5kIGEgdGVzdC5cbiAqXG4gKiAgIEl0IHdpbGwgaW5mZXIgd2hpY2ggdmFsdWVzIGFyZSBwYXNzZWQgYXMgYG5vZGVgIGFuZCB3aGljaCBhcyBgcGFyZW50YC5cbiAqIEB0ZW1wbGF0ZSB7VW5pc3ROb2RlfSBEZXNjZW5kYW50XG4gKiAgIE5vZGUgdHlwZS5cbiAqIEB0ZW1wbGF0ZSB7VGVzdH0gQ2hlY2tcbiAqICAgVGVzdCB0eXBlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyhcbiAqICAgQnVpbGRWaXNpdG9yRnJvbURlc2NlbmRhbnRzPFxuICogICAgIEluY2x1c2l2ZURlc2NlbmRhbnQ8VHJlZT4sXG4gKiAgICAgQ2hlY2tcbiAqICAgPlxuICogKX0gQnVpbGRWaXNpdG9yXG4gKiAgIEJ1aWxkIGEgdHlwZWQgYFZpc2l0b3JgIGZ1bmN0aW9uIGZyb20gYSB0cmVlIGFuZCBhIHRlc3QuXG4gKlxuICogICBJdCB3aWxsIGluZmVyIHdoaWNoIHZhbHVlcyBhcmUgcGFzc2VkIGFzIGBub2RlYCBhbmQgd2hpY2ggYXMgYHBhcmVudGAuXG4gKiBAdGVtcGxhdGUge1VuaXN0Tm9kZX0gW1RyZWU9VW5pc3ROb2RlXVxuICogICBOb2RlIHR5cGUuXG4gKiBAdGVtcGxhdGUge1Rlc3R9IFtDaGVjaz1UZXN0XVxuICogICBUZXN0IHR5cGUuXG4gKi9cblxuaW1wb3J0IHt2aXNpdFBhcmVudHN9IGZyb20gJ3VuaXN0LXV0aWwtdmlzaXQtcGFyZW50cydcblxuZXhwb3J0IHtDT05USU5VRSwgRVhJVCwgU0tJUH0gZnJvbSAndW5pc3QtdXRpbC12aXNpdC1wYXJlbnRzJ1xuXG4vKipcbiAqIFZpc2l0IG5vZGVzLlxuICpcbiAqIFRoaXMgYWxnb3JpdGhtIHBlcmZvcm1zICpkZXB0aC1maXJzdCogKnRyZWUgdHJhdmVyc2FsKiBpbiAqcHJlb3JkZXIqXG4gKiAoKipOTFIqKikgb3IgaWYgYHJldmVyc2VgIGlzIGdpdmVuLCBpbiAqcmV2ZXJzZSBwcmVvcmRlciogKCoqTlJMKiopLlxuICpcbiAqIFlvdSBjYW4gY2hvb3NlIGZvciB3aGljaCBub2RlcyBgdmlzaXRvcmAgaXMgY2FsbGVkIGJ5IHBhc3NpbmcgYSBgdGVzdGAuXG4gKiBGb3IgY29tcGxleCB0ZXN0cywgeW91IHNob3VsZCB0ZXN0IHlvdXJzZWxmIGluIGB2aXNpdG9yYCwgYXMgaXQgd2lsbCBiZVxuICogZmFzdGVyIGFuZCB3aWxsIGhhdmUgaW1wcm92ZWQgdHlwZSBpbmZvcm1hdGlvbi5cbiAqXG4gKiBXYWxraW5nIHRoZSB0cmVlIGlzIGFuIGludGVuc2l2ZSB0YXNrLlxuICogTWFrZSB1c2Ugb2YgdGhlIHJldHVybiB2YWx1ZXMgb2YgdGhlIHZpc2l0b3Igd2hlbiBwb3NzaWJsZS5cbiAqIEluc3RlYWQgb2Ygd2Fsa2luZyBhIHRyZWUgbXVsdGlwbGUgdGltZXMsIHdhbGsgaXQgb25jZSwgdXNlIGB1bmlzdC11dGlsLWlzYFxuICogdG8gY2hlY2sgaWYgYSBub2RlIG1hdGNoZXMsIGFuZCB0aGVuIHBlcmZvcm0gZGlmZmVyZW50IG9wZXJhdGlvbnMuXG4gKlxuICogWW91IGNhbiBjaGFuZ2UgdGhlIHRyZWUuXG4gKiBTZWUgYFZpc2l0b3JgIGZvciBtb3JlIGluZm8uXG4gKlxuICogQG92ZXJsb2FkXG4gKiBAcGFyYW0ge1RyZWV9IHRyZWVcbiAqIEBwYXJhbSB7Q2hlY2t9IGNoZWNrXG4gKiBAcGFyYW0ge0J1aWxkVmlzaXRvcjxUcmVlLCBDaGVjaz59IHZpc2l0b3JcbiAqIEBwYXJhbSB7Ym9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWR9IFtyZXZlcnNlXVxuICogQHJldHVybnMge3VuZGVmaW5lZH1cbiAqXG4gKiBAb3ZlcmxvYWRcbiAqIEBwYXJhbSB7VHJlZX0gdHJlZVxuICogQHBhcmFtIHtCdWlsZFZpc2l0b3I8VHJlZT59IHZpc2l0b3JcbiAqIEBwYXJhbSB7Ym9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWR9IFtyZXZlcnNlXVxuICogQHJldHVybnMge3VuZGVmaW5lZH1cbiAqXG4gKiBAcGFyYW0ge1VuaXN0Tm9kZX0gdHJlZVxuICogICBUcmVlIHRvIHRyYXZlcnNlLlxuICogQHBhcmFtIHtWaXNpdG9yIHwgVGVzdH0gdGVzdE9yVmlzaXRvclxuICogICBgdW5pc3QtdXRpbC1pc2AtY29tcGF0aWJsZSB0ZXN0IChvcHRpb25hbCwgb21pdCB0byBwYXNzIGEgdmlzaXRvcikuXG4gKiBAcGFyYW0ge1Zpc2l0b3IgfCBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZH0gW3Zpc2l0b3JPclJldmVyc2VdXG4gKiAgIEhhbmRsZSBlYWNoIG5vZGUgKHdoZW4gdGVzdCBpcyBvbWl0dGVkLCBwYXNzIGByZXZlcnNlYCkuXG4gKiBAcGFyYW0ge2Jvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkfSBbbWF5YmVSZXZlcnNlPWZhbHNlXVxuICogICBUcmF2ZXJzZSBpbiByZXZlcnNlIHByZW9yZGVyIChOUkwpIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgcHJlb3JkZXIgKE5MUikuXG4gKiBAcmV0dXJucyB7dW5kZWZpbmVkfVxuICogICBOb3RoaW5nLlxuICpcbiAqIEB0ZW1wbGF0ZSB7VW5pc3ROb2RlfSBUcmVlXG4gKiAgIE5vZGUgdHlwZS5cbiAqIEB0ZW1wbGF0ZSB7VGVzdH0gQ2hlY2tcbiAqICAgYHVuaXN0LXV0aWwtaXNgLWNvbXBhdGlibGUgdGVzdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZpc2l0KHRyZWUsIHRlc3RPclZpc2l0b3IsIHZpc2l0b3JPclJldmVyc2UsIG1heWJlUmV2ZXJzZSkge1xuICAvKiogQHR5cGUge2Jvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkfSAqL1xuICBsZXQgcmV2ZXJzZVxuICAvKiogQHR5cGUge1Rlc3R9ICovXG4gIGxldCB0ZXN0XG4gIC8qKiBAdHlwZSB7VmlzaXRvcn0gKi9cbiAgbGV0IHZpc2l0b3JcblxuICBpZiAoXG4gICAgdHlwZW9mIHRlc3RPclZpc2l0b3IgPT09ICdmdW5jdGlvbicgJiZcbiAgICB0eXBlb2YgdmlzaXRvck9yUmV2ZXJzZSAhPT0gJ2Z1bmN0aW9uJ1xuICApIHtcbiAgICB0ZXN0ID0gdW5kZWZpbmVkXG4gICAgdmlzaXRvciA9IHRlc3RPclZpc2l0b3JcbiAgICByZXZlcnNlID0gdmlzaXRvck9yUmV2ZXJzZVxuICB9IGVsc2Uge1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IGFzc3VtZSB0aGUgb3ZlcmxvYWQgd2l0aCB0ZXN0IHdhcyBnaXZlbi5cbiAgICB0ZXN0ID0gdGVzdE9yVmlzaXRvclxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IGFzc3VtZSB0aGUgb3ZlcmxvYWQgd2l0aCB0ZXN0IHdhcyBnaXZlbi5cbiAgICB2aXNpdG9yID0gdmlzaXRvck9yUmV2ZXJzZVxuICAgIHJldmVyc2UgPSBtYXliZVJldmVyc2VcbiAgfVxuXG4gIHZpc2l0UGFyZW50cyh0cmVlLCB0ZXN0LCBvdmVybG9hZCwgcmV2ZXJzZSlcblxuICAvKipcbiAgICogQHBhcmFtIHtVbmlzdE5vZGV9IG5vZGVcbiAgICogQHBhcmFtIHtBcnJheTxVbmlzdFBhcmVudD59IHBhcmVudHNcbiAgICovXG4gIGZ1bmN0aW9uIG92ZXJsb2FkKG5vZGUsIHBhcmVudHMpIHtcbiAgICBjb25zdCBwYXJlbnQgPSBwYXJlbnRzW3BhcmVudHMubGVuZ3RoIC0gMV1cbiAgICBjb25zdCBpbmRleCA9IHBhcmVudCA/IHBhcmVudC5jaGlsZHJlbi5pbmRleE9mKG5vZGUpIDogdW5kZWZpbmVkXG4gICAgcmV0dXJuIHZpc2l0b3Iobm9kZSwgaW5kZXgsIHBhcmVudClcbiAgfVxufVxuIiwgImltcG9ydCB7IFJvb3QsIEVsZW1lbnQsIFRleHQgfSBmcm9tICdoYXN0JztcbmltcG9ydCB7IGNyZWF0ZVNhbml0aXplU2NoZW1hIH0gZnJvbSAnLi4vdXRpbHMvY3JlYXRlU2FuaXRpemVTY2hlbWEnO1xuaW1wb3J0IHsgdmlzaXQgfSBmcm9tICd1bmlzdC11dGlsLXZpc2l0JztcbmV4cG9ydCBjb25zdCByZWh5cGVDb252ZXJ0QWJub3JtYWxUYWdzVG9UZXh0ID0gKGN1c3RvbVRhZ3M6IHN0cmluZ1tdID0gW10pID0+IHtcbiAgcmV0dXJuICh0cmVlOiBSb290KSA9PiB7XG4gICAgLy8gR2V0IGFsbCBhbGxvd2VkIHRhZyBuYW1lcyAoSFRNTCArIE1hdGhNTCArIGN1c3RvbVRhZ3MpXG4gICAgY29uc3Qgc2NoZW1hID0gY3JlYXRlU2FuaXRpemVTY2hlbWEoY3VzdG9tVGFncyk7XG4gICAgY29uc3QgYWxsb3dlZFRhZ05hbWVzID0gbmV3IFNldChzY2hlbWEudGFnTmFtZXMgfHwgW10pO1xuXG4gICAgdmlzaXQodHJlZSwgJ2VsZW1lbnQnLCAobm9kZSwgaW5kZXgsIHBhcmVudCkgPT4ge1xuICAgICAgaWYgKCFwYXJlbnQgfHwgaW5kZXggPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCB0YWdOYW1lID0gKG5vZGUgYXMgRWxlbWVudCkudGFnTmFtZTtcblxuICAgICAgLy8gQ2hlY2sgd2hldGhlciBpdCdzIGFuIGFibm9ybWFsIHRhZzpcbiAgICAgIC8vIDEuIE5vdCBpbiB0aGUgYWxsb3dlZCB0YWcgbGlzdFxuICAgICAgLy8gMi4gQW5kIGNvbnRhaW5zIGNoYXJhY3RlcnMgb3RoZXIgdGhhbiBFbmdsaXNoIGxldHRlcnNcbiAgICAgIGNvbnN0IGlzQWJub3JtYWxUYWcgPSAhYWxsb3dlZFRhZ05hbWVzLmhhcyh0YWdOYW1lKSAmJiAvW15hLXpBLVpdLy50ZXN0KHRhZ05hbWUpO1xuXG4gICAgICBpZiAoaXNBYm5vcm1hbFRhZykge1xuICAgICAgICAvLyBSZWJ1aWxkIHRoZSBvcmlnaW5hbCB0YWcgc3RyaW5nXG4gICAgICAgIGxldCB0YWdTdHJpbmcgPSBgPCR7dGFnTmFtZX1gO1xuXG4gICAgICAgIC8vIEFwcGVuZCBhdHRyaWJ1dGVzXG4gICAgICAgIGlmICgobm9kZSBhcyBFbGVtZW50KS5wcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoKG5vZGUgYXMgRWxlbWVudCkucHJvcGVydGllcykpIHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICB0YWdTdHJpbmcgKz0gYCAke2tleX09XCIke3ZhbHVlLmpvaW4oJyAnKX1cImA7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgdGFnU3RyaW5nICs9IGAgJHtrZXl9PVwiJHt2YWx1ZX1cImA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSGFuZGxlIGNoaWxkIGNvbnRlbnRcbiAgICAgICAgbGV0IGlubmVyQ29udGVudCA9ICcnO1xuICAgICAgICBpZiAoKG5vZGUgYXMgRWxlbWVudCkuY2hpbGRyZW4gJiYgKG5vZGUgYXMgRWxlbWVudCkuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgIC8vIFJlY3Vyc2l2ZWx5IHByb2Nlc3MgY2hpbGQgbm9kZXNcbiAgICAgICAgICBjb25zdCBwcm9jZXNzQ2hpbGRyZW4gPSAoY2hpbGRyZW46IEFycmF5PEVsZW1lbnQgfCBUZXh0Pik6IHN0cmluZyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gY2hpbGRyZW5cbiAgICAgICAgICAgICAgLm1hcCgoY2hpbGQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGQudHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gKGNoaWxkIGFzIFRleHQpLnZhbHVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hpbGQudHlwZSA9PT0gJ2VsZW1lbnQnKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50Q2hpbGQgPSBjaGlsZCBhcyBFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgbGV0IGNoaWxkVGFnID0gYDwke2VsZW1lbnRDaGlsZC50YWdOYW1lfWA7XG4gICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudENoaWxkLnByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZWxlbWVudENoaWxkLnByb3BlcnRpZXMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZFRhZyArPSBgICR7a2V5fT1cIiR7dmFsdWUuam9pbignICcpfVwiYDtcbiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkVGFnICs9IGAgJHtrZXl9PVwiJHt2YWx1ZX1cImA7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBjaGlsZFRhZyArPSAnPic7XG4gICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudENoaWxkLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkVGFnICs9IHByb2Nlc3NDaGlsZHJlbihlbGVtZW50Q2hpbGQuY2hpbGRyZW4gYXMgQXJyYXk8RWxlbWVudCB8IFRleHQ+KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGNoaWxkVGFnICs9IGA8LyR7ZWxlbWVudENoaWxkLnRhZ05hbWV9PmA7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGRUYWc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgLmpvaW4oJycpO1xuICAgICAgICAgIH07XG4gICAgICAgICAgaW5uZXJDb250ZW50ID0gcHJvY2Vzc0NoaWxkcmVuKChub2RlIGFzIEVsZW1lbnQpLmNoaWxkcmVuIGFzIEFycmF5PEVsZW1lbnQgfCBUZXh0Pik7XG4gICAgICAgIH1cblxuICAgICAgICB0YWdTdHJpbmcgKz0gYD4ke2lubmVyQ29udGVudH08LyR7dGFnTmFtZX0+YDtcblxuICAgICAgICAvLyBDcmVhdGUgYSB0ZXh0IG5vZGUgdG8gcmVwbGFjZSB0aGUgYWJub3JtYWwgdGFnXG4gICAgICAgIGNvbnN0IHRleHROb2RlOiBUZXh0ID0ge1xuICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICB2YWx1ZTogdGFnU3RyaW5nLFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFJlcGxhY2Ugbm9kZVxuICAgICAgICBwYXJlbnQuY2hpbGRyZW5baW5kZXhdID0gdGV4dE5vZGU7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG59O1xuIiwgImNvbnN0IE1BVEhfSkFYRk9OVF9VUkwgPSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9tYXRoamF4QDMvZXM1L291dHB1dC9jaHRtbC9mb250cy93b2ZmLXYyJztcbmV4cG9ydCBjb25zdCBERUZBVUxUX01BVEhKQVhfQ09ORklHID0ge1xuICBjaHRtbDoge1xuICAgIGZvbnRVUkw6IE1BVEhfSkFYRk9OVF9VUkwsXG4gIH0sXG59O1xuIiwgImltcG9ydCB0eXBlIHsgUHJvY2Vzc29yIH0gZnJvbSAndW5pZmllZCc7XG5cbmNvbnN0IGNvdW50UHJlY2VkaW5nQmFja3NsYXNoZXMgPSAoaW5wdXQ6IHN0cmluZywgaW5kZXg6IG51bWJlcik6IG51bWJlciA9PiB7XG4gIGxldCBjb3VudCA9IDA7XG4gIGZvciAobGV0IGkgPSBpbmRleCAtIDE7IGkgPj0gMCAmJiBpbnB1dFtpXSA9PT0gJ1xcXFwnOyBpLS0pIGNvdW50Kys7XG4gIHJldHVybiBjb3VudDtcbn07XG5cbmNvbnN0IGlzVW5lc2NhcGVkRGVsaW1pdGVyID0gKGlucHV0OiBzdHJpbmcsIGluZGV4OiBudW1iZXIsIG5leHRDaGFyOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgaWYgKGlucHV0W2luZGV4XSAhPT0gJ1xcXFwnIHx8IGlucHV0W2luZGV4ICsgMV0gIT09IG5leHRDaGFyKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBjb3VudFByZWNlZGluZ0JhY2tzbGFzaGVzKGlucHV0LCBpbmRleCkgJSAyID09PSAwO1xufTtcblxuY29uc3QgZmluZENsb3NpbmdEZWxpbWl0ZXIgPSAoaW5wdXQ6IHN0cmluZywgZnJvbUluZGV4OiBudW1iZXIsIGNsb3NlQ2hhcjogJyknIHwgJ10nKTogbnVtYmVyID0+IHtcbiAgZm9yIChsZXQgaSA9IGZyb21JbmRleDsgaSA8IGlucHV0Lmxlbmd0aCAtIDE7IGkrKykge1xuICAgIGlmIChpc1VuZXNjYXBlZERlbGltaXRlcihpbnB1dCwgaSwgY2xvc2VDaGFyKSkgcmV0dXJuIGk7XG4gIH1cbiAgcmV0dXJuIC0xO1xufTtcblxuY29uc3QgaXNMaW5lU3RhcnQgPSAoaW5wdXQ6IHN0cmluZywgaW5kZXg6IG51bWJlcik6IGJvb2xlYW4gPT5cbiAgaW5kZXggPT09IDAgfHwgaW5wdXRbaW5kZXggLSAxXSA9PT0gJ1xcbic7XG5cbmNvbnN0IHNjYW5GZW5jZSA9IChcbiAgaW5wdXQ6IHN0cmluZyxcbiAgaW5kZXg6IG51bWJlclxuKTogeyBmZW5jZUNoYXI6ICdgJyB8ICd+JzsgZmVuY2VMZW5ndGg6IG51bWJlciB9IHwgbnVsbCA9PiB7XG4gIGNvbnN0IGNoYXIgPSBpbnB1dFtpbmRleF07XG4gIGlmIChjaGFyICE9PSAnYCcgJiYgY2hhciAhPT0gJ34nKSByZXR1cm4gbnVsbDtcbiAgbGV0IGZlbmNlTGVuZ3RoID0gMDtcbiAgZm9yIChsZXQgaSA9IGluZGV4OyBpIDwgaW5wdXQubGVuZ3RoICYmIGlucHV0W2ldID09PSBjaGFyOyBpKyspIGZlbmNlTGVuZ3RoKys7XG4gIGlmIChmZW5jZUxlbmd0aCA8IDMpIHJldHVybiBudWxsO1xuICByZXR1cm4geyBmZW5jZUNoYXI6IGNoYXIsIGZlbmNlTGVuZ3RoIH07XG59O1xuXG5jb25zdCBpc0luZGVudGVkQ29kZUxpbmUgPSAoaW5wdXQ6IHN0cmluZywgaW5kZXg6IG51bWJlcik6IGJvb2xlYW4gPT4ge1xuICBpZiAoIWlzTGluZVN0YXJ0KGlucHV0LCBpbmRleCkpIHJldHVybiBmYWxzZTtcbiAgaWYgKGlucHV0W2luZGV4XSA9PT0gJ1xcdCcpIHJldHVybiB0cnVlO1xuICByZXR1cm4gaW5wdXQuc2xpY2UoaW5kZXgsIGluZGV4ICsgNCkgPT09ICcgICAgJztcbn07XG5cbmV4cG9ydCBjb25zdCBub3JtYWxpemVMYXRleFBhcmVuc01hdGggPSAoaW5wdXQ6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGxldCBvdXRwdXQgPSAnJztcblxuICBsZXQgaW5GZW5jZWRDb2RlQmxvY2sgPSBmYWxzZTtcbiAgbGV0IGZlbmNlQ2hhcjogJ2AnIHwgJ34nIHwgbnVsbCA9IG51bGw7XG4gIGxldCBmZW5jZUxlbmd0aCA9IDA7XG5cbiAgbGV0IGluSW5saW5lQ29kZSA9IGZhbHNlO1xuICBsZXQgaW5saW5lQ29kZVRpY2tMZW5ndGggPSAwO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoOyApIHtcbiAgICBpZiAoIWluRmVuY2VkQ29kZUJsb2NrICYmICFpbklubGluZUNvZGUgJiYgaXNJbmRlbnRlZENvZGVMaW5lKGlucHV0LCBpKSkge1xuICAgICAgY29uc3QgZW5kID0gaW5wdXQuaW5kZXhPZignXFxuJywgaSk7XG4gICAgICBpZiAoZW5kID09PSAtMSkgcmV0dXJuIG91dHB1dCArIGlucHV0LnNsaWNlKGkpO1xuICAgICAgb3V0cHV0ICs9IGlucHV0LnNsaWNlKGksIGVuZCArIDEpO1xuICAgICAgaSA9IGVuZCArIDE7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoIWluSW5saW5lQ29kZSAmJiBpc0xpbmVTdGFydChpbnB1dCwgaSkpIHtcbiAgICAgIGNvbnN0IGZlbmNlID0gc2NhbkZlbmNlKGlucHV0LCBpKTtcbiAgICAgIGlmIChmZW5jZSkge1xuICAgICAgICBpZiAoIWluRmVuY2VkQ29kZUJsb2NrKSB7XG4gICAgICAgICAgaW5GZW5jZWRDb2RlQmxvY2sgPSB0cnVlO1xuICAgICAgICAgIGZlbmNlQ2hhciA9IGZlbmNlLmZlbmNlQ2hhcjtcbiAgICAgICAgICBmZW5jZUxlbmd0aCA9IGZlbmNlLmZlbmNlTGVuZ3RoO1xuICAgICAgICB9IGVsc2UgaWYgKGZlbmNlQ2hhciA9PT0gZmVuY2UuZmVuY2VDaGFyICYmIGZlbmNlLmZlbmNlTGVuZ3RoID49IGZlbmNlTGVuZ3RoKSB7XG4gICAgICAgICAgaW5GZW5jZWRDb2RlQmxvY2sgPSBmYWxzZTtcbiAgICAgICAgICBmZW5jZUNoYXIgPSBudWxsO1xuICAgICAgICAgIGZlbmNlTGVuZ3RoID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVuZCA9IGlucHV0LmluZGV4T2YoJ1xcbicsIGkpO1xuICAgICAgICBpZiAoZW5kID09PSAtMSkgcmV0dXJuIG91dHB1dCArIGlucHV0LnNsaWNlKGkpO1xuICAgICAgICBvdXRwdXQgKz0gaW5wdXQuc2xpY2UoaSwgZW5kICsgMSk7XG4gICAgICAgIGkgPSBlbmQgKyAxO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWluRmVuY2VkQ29kZUJsb2NrKSB7XG4gICAgICBpZiAoIWluSW5saW5lQ29kZSAmJiBpbnB1dFtpXSA9PT0gJ2AnKSB7XG4gICAgICAgIGxldCB0aWNrcyA9IDA7XG4gICAgICAgIGZvciAobGV0IGogPSBpOyBqIDwgaW5wdXQubGVuZ3RoICYmIGlucHV0W2pdID09PSAnYCc7IGorKykgdGlja3MrKztcbiAgICAgICAgaW5JbmxpbmVDb2RlID0gdHJ1ZTtcbiAgICAgICAgaW5saW5lQ29kZVRpY2tMZW5ndGggPSB0aWNrcztcbiAgICAgICAgb3V0cHV0ICs9IGlucHV0LnNsaWNlKGksIGkgKyB0aWNrcyk7XG4gICAgICAgIGkgKz0gdGlja3M7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoaW5JbmxpbmVDb2RlKSB7XG4gICAgICAgIGlmIChpbnB1dFtpXSA9PT0gJ2AnKSB7XG4gICAgICAgICAgbGV0IHRpY2tzID0gMDtcbiAgICAgICAgICBmb3IgKGxldCBqID0gaTsgaiA8IGlucHV0Lmxlbmd0aCAmJiBpbnB1dFtqXSA9PT0gJ2AnOyBqKyspIHRpY2tzKys7XG4gICAgICAgICAgaWYgKHRpY2tzID49IGlubGluZUNvZGVUaWNrTGVuZ3RoKSB7XG4gICAgICAgICAgICBvdXRwdXQgKz0gaW5wdXQuc2xpY2UoaSwgaSArIGlubGluZUNvZGVUaWNrTGVuZ3RoKTtcbiAgICAgICAgICAgIGkgKz0gaW5saW5lQ29kZVRpY2tMZW5ndGg7XG4gICAgICAgICAgICBpbklubGluZUNvZGUgPSBmYWxzZTtcbiAgICAgICAgICAgIGlubGluZUNvZGVUaWNrTGVuZ3RoID0gMDtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBvdXRwdXQgKz0gaW5wdXRbaV07XG4gICAgICAgIGkrKztcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFpbkZlbmNlZENvZGVCbG9jayAmJiAhaW5JbmxpbmVDb2RlKSB7XG4gICAgICBpZiAoaXNVbmVzY2FwZWREZWxpbWl0ZXIoaW5wdXQsIGksICcoJykpIHtcbiAgICAgICAgY29uc3QgY2xvc2VJbmRleCA9IGZpbmRDbG9zaW5nRGVsaW1pdGVyKGlucHV0LCBpICsgMiwgJyknKTtcbiAgICAgICAgaWYgKGNsb3NlSW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgY29uc3QgaW5uZXIgPSBpbnB1dC5zbGljZShpICsgMiwgY2xvc2VJbmRleCk7XG4gICAgICAgICAgb3V0cHV0ICs9IGAkJHtpbm5lcn0kYDtcbiAgICAgICAgICBpID0gY2xvc2VJbmRleCArIDI7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGlzVW5lc2NhcGVkRGVsaW1pdGVyKGlucHV0LCBpLCAnWycpKSB7XG4gICAgICAgIGNvbnN0IGNsb3NlSW5kZXggPSBmaW5kQ2xvc2luZ0RlbGltaXRlcihpbnB1dCwgaSArIDIsICddJyk7XG4gICAgICAgIGlmIChjbG9zZUluZGV4ICE9PSAtMSkge1xuICAgICAgICAgIGNvbnN0IGlubmVyID0gaW5wdXQuc2xpY2UoaSArIDIsIGNsb3NlSW5kZXgpO1xuICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gaW5uZXIuc3RhcnRzV2l0aCgnXFxuJykgPyAnJyA6ICdcXG4nO1xuICAgICAgICAgIGNvbnN0IGVuZCA9IGlubmVyLmVuZHNXaXRoKCdcXG4nKSA/ICcnIDogJ1xcbic7XG4gICAgICAgICAgb3V0cHV0ICs9IGAkJCR7c3RhcnR9JHtpbm5lcn0ke2VuZH0kJGA7XG4gICAgICAgICAgaSA9IGNsb3NlSW5kZXggKyAyO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgb3V0cHV0ICs9IGlucHV0W2ldO1xuICAgIGkrKztcbiAgfVxuXG4gIHJldHVybiBvdXRwdXQ7XG59O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbmV4cG9ydCBjb25zdCByZW1hcmtNYXRoRGVsaW1pdGVycyA9IGZ1bmN0aW9uIHJlbWFya01hdGhEZWxpbWl0ZXJzKHRoaXM6IFByb2Nlc3Nvcik6IHZvaWQge1xuICBjb25zdCBjdXJyZW50UGFyc2VyID0gdGhpcy5wYXJzZXIgfHwgdGhpcy5QYXJzZXI7XG4gIGlmICghY3VycmVudFBhcnNlcikgcmV0dXJuO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHRoaXMuUGFyc2VyID0gZnVuY3Rpb24gd3JhcHBlZFBhcnNlcihkb2N1bWVudDogdW5rbm93biwgZmlsZTogYW55KSB7XG4gICAgbGV0IG5leHREb2N1bWVudCA9IGRvY3VtZW50O1xuICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBjb25zdCBub3JtYWxpemVkID0gbm9ybWFsaXplTGF0ZXhQYXJlbnNNYXRoKGRvY3VtZW50KTtcbiAgICAgIG5leHREb2N1bWVudCA9IG5vcm1hbGl6ZWQ7XG4gICAgICBpZiAoZmlsZSAmJiB0eXBlb2YgZmlsZS52YWx1ZSA9PT0gJ3N0cmluZycpIGZpbGUudmFsdWUgPSBub3JtYWxpemVkO1xuICAgIH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHJldHVybiBjdXJyZW50UGFyc2VyKG5leHREb2N1bWVudCBhcyBhbnksIGZpbGUpO1xuICB9IGFzIHVua25vd24gYXMgUHJvY2Vzc29yWydQYXJzZXInXTtcblxuICBpZiAodGhpcy5wYXJzZXIpIHRoaXMucGFyc2VyID0gdGhpcy5QYXJzZXIgYXMgdW5rbm93biBhcyB0eXBlb2YgdGhpcy5wYXJzZXI7XG59O1xuIiwgImltcG9ydCB7IFJvb3QgfSBmcm9tICdoYXN0JztcbmltcG9ydCB7IGdldFBhcnNlciB9IGZyb20gJy4vY29yZSc7XG5pbXBvcnQgdHlwZSB7IFJlbmRlclByb3BzIGFzIFBhcnNlck9wdGlvbnMgfSBmcm9tICcuL2NvcmUnO1xuZXhwb3J0IHsgUGFyc2VyT3B0aW9ucyB9O1xuLyoqXG4gKiBcdTUzNTVcdTdFQkZcdTdBMEIgTWFya2Rvd24gXHU4OUUzXHU2NzkwXHU1NjY4XG4gKi9cbmV4cG9ydCBjbGFzcyBQYXJzZXIge1xuICBwcml2YXRlIG9wdGlvbnM6IFBhcnNlck9wdGlvbnM7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogUGFyc2VyT3B0aW9ucyA9IHt9KSB7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBcdTg5RTNcdTY3OTAgTWFya2Rvd24gXHU1MjMwIEhUTUxcbiAgICogQHBhcmFtIG1hcmtkb3duIE1hcmtkb3duIFx1NUI1N1x1N0IyNlx1NEUzMlxuICAgKiBAcmV0dXJucyBIVE1MIFx1NUI1N1x1N0IyNlx1NEUzMlxuICAgKi9cbiAgYXN5bmMgcGFyc2VUb0hUTUwobWFya2Rvd246IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgcHJvY2Vzc29yID0gZ2V0UGFyc2VyKCdodG1sJywgdGhpcy5vcHRpb25zKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwcm9jZXNzb3IucHJvY2VzcyhtYXJrZG93bik7XG4gICAgcmV0dXJuIFN0cmluZyhyZXN1bHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFx1ODlFM1x1Njc5MCBNYXJrZG93biBcdTUyMzAgSEFTVFxuICAgKiBAcGFyYW0gbWFya2Rvd24gTWFya2Rvd24gXHU1QjU3XHU3QjI2XHU0RTMyXG4gICAqIEByZXR1cm5zIEhBU1QgUm9vdCBcdTgyODJcdTcwQjlcbiAgICovXG4gIGFzeW5jIHBhcnNlVG9IQVNUKG1hcmtkb3duOiBzdHJpbmcpOiBQcm9taXNlPFJvb3Q+IHtcbiAgICBjb25zdCBwcm9jZXNzb3IgPSBnZXRQYXJzZXIoJ2hhc3QnLCB0aGlzLm9wdGlvbnMpO1xuICAgIGNvbnN0IHRyZWUgPSBwcm9jZXNzb3IucGFyc2UobWFya2Rvd24pO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHByb2Nlc3Nvci5ydW4odHJlZSk7XG4gICAgcmV0dXJuIHJlc3VsdCBhcyBSb290O1xuICB9XG5cbiAgLyoqXG4gICAqIFx1NjI3OVx1OTFDRlx1ODlFM1x1Njc5MCBNYXJrZG93biBcdTUyMzAgSFRNTFxuICAgKiBAcGFyYW0gbWFya2Rvd25zIE1hcmtkb3duIFx1NUI1N1x1N0IyNlx1NEUzMlx1NjU3MFx1N0VDNFxuICAgKiBAcmV0dXJucyBIVE1MIFx1NUI1N1x1N0IyNlx1NEUzMlx1NjU3MFx1N0VDNFxuICAgKi9cbiAgYXN5bmMgYmF0Y2hQYXJzZVRvSFRNTChtYXJrZG93bnM6IHN0cmluZ1tdKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IHByb2Nlc3NvciA9IGdldFBhcnNlcignaHRtbCcsIHRoaXMub3B0aW9ucyk7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKFxuICAgICAgbWFya2Rvd25zLm1hcChhc3luYyAobWQpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcHJvY2Vzc29yLnByb2Nlc3MobWQpO1xuICAgICAgICByZXR1cm4gU3RyaW5nKHJlc3VsdCk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogXHU2Mjc5XHU5MUNGXHU4OUUzXHU2NzkwIE1hcmtkb3duIFx1NTIzMCBIQVNUXG4gICAqIEBwYXJhbSBtYXJrZG93bnMgTWFya2Rvd24gXHU1QjU3XHU3QjI2XHU0RTMyXHU2NTcwXHU3RUM0XG4gICAqIEByZXR1cm5zIEhBU1QgUm9vdCBcdTgyODJcdTcwQjlcdTY1NzBcdTdFQzRcbiAgICovXG4gIGFzeW5jIGJhdGNoUGFyc2VUb0hBU1QobWFya2Rvd25zOiBzdHJpbmdbXSk6IFByb21pc2U8Um9vdFtdPiB7XG4gICAgY29uc3QgcHJvY2Vzc29yID0gZ2V0UGFyc2VyKCdoYXN0JywgdGhpcy5vcHRpb25zKTtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoXG4gICAgICBtYXJrZG93bnMubWFwKGFzeW5jIChtZCkgPT4ge1xuICAgICAgICBjb25zdCB0cmVlID0gcHJvY2Vzc29yLnBhcnNlKG1kKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcHJvY2Vzc29yLnJ1bih0cmVlKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCBhcyBSb290O1xuICAgICAgfSlcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogXHU1MjFCXHU1RUZBXHU1MzU1XHU3RUJGXHU3QTBCXHU4OUUzXHU2NzkwXHU1NjY4XHU1QjlFXHU0RjhCXG4gKiBAcGFyYW0gb3B0aW9ucyBcdTg5RTNcdTY3OTBcdTU2NjhcdTkwMDlcdTk4NzlcbiAqIEByZXR1cm5zIFBhcnNlciBcdTVCOUVcdTRGOEJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVBhcnNlcihvcHRpb25zOiBQYXJzZXJPcHRpb25zID0ge30pOiBQYXJzZXIge1xuICByZXR1cm4gbmV3IFBhcnNlcihvcHRpb25zKTtcbn1cbiIsICJpbXBvcnQgeyB3cmFwLCBSZW1vdGUgfSBmcm9tICdjb21saW5rJztcbmltcG9ydCB7IFJvb3QgfSBmcm9tICdoYXN0JztcbmltcG9ydCB0eXBlIHsgUGFyc2VyT3B0aW9ucyB9IGZyb20gJy4vcGFyc2VyJztcblxuY29uc3QgV09SS0VSX01PRFVMRV9QQVRIID0gJy4vbW9kdWxlcy9wYXJzZXIud29ya2VyLm1qcyc7XG5jb25zdCBWSVRFX09QVElNSVpFRF9ERVBTX1NFR01FTlQgPSAnLy52aXRlL2RlcHMvJztcblxuLyoqXG4gKiBXb3JrZXIgXHU1QjlFXHU0RjhCXHU2M0E1XHU1M0UzXG4gKi9cbmludGVyZmFjZSBQYXJzZXJXb3JrZXJTZXJ2aWNlIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gIG5ldyAoX29wdGlvbnM6IFBhcnNlck9wdGlvbnMpOiBQYXJzZXJXb3JrZXJTZXJ2aWNlO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgcGFyc2VUb0hUTUwoX21hcmtkb3duOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz47XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICBwYXJzZVRvSEFTVChfbWFya2Rvd246IHN0cmluZyk6IFByb21pc2U8Um9vdD47XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICB1cGRhdGVPcHRpb25zKF9vcHRpb25zOiBQYXJzZXJPcHRpb25zKTogdm9pZDtcbn1cblxuLyoqXG4gKiBcdTgzQjdcdTUzRDZcdTczQUZcdTU4ODNcdTdDN0JcdTU3OEJcbiAqL1xuZnVuY3Rpb24gZ2V0RW52aXJvbm1lbnQoKTogJ2Jyb3dzZXInIHwgJ25vZGUnIHwgJ3Vua25vd24nIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2luZG93LmRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiAnYnJvd3Nlcic7XG4gIH1cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gIGlmICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgcHJvY2Vzcy52ZXJzaW9ucz8ubm9kZSkge1xuICAgIHJldHVybiAnbm9kZSc7XG4gIH1cbiAgcmV0dXJuICd1bmtub3duJztcbn1cblxuLyoqXG4gKiBcdTgzQjdcdTUzRDZcdTY3MDBcdTU5MjdcdTUzRUZcdTc1MjhcdTdFQkZcdTdBMEJcdTY1NzBcbiAqL1xuZnVuY3Rpb24gZ2V0TWF4V29ya2VycygpOiBudW1iZXIge1xuICBjb25zdCBlbnYgPSBnZXRFbnZpcm9ubWVudCgpO1xuXG4gIGlmIChlbnYgPT09ICdicm93c2VyJykge1xuICAgIC8vIFx1NkQ0Rlx1ODlDOFx1NTY2OFx1NzNBRlx1NTg4M1x1RkYxQVx1NEY3Rlx1NzUyOCBuYXZpZ2F0b3IuaGFyZHdhcmVDb25jdXJyZW5jeVxuICAgIC8vIFx1OTAxQVx1NUUzOFx1OTY1MFx1NTIzNlx1NEUzQSBDUFUgXHU2ODM4XHU1RkMzXHU2NTcwXHVGRjBDXHU0RjQ2XHU2RDRGXHU4OUM4XHU1NjY4XHU1M0VGXHU4MEZEXHU2NzA5XHU4MUVBXHU1REYxXHU3Njg0XHU5NjUwXHU1MjM2XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgY29uc3QgbmF2ID0gdHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgPyAobmF2aWdhdG9yIGFzIGFueSkgOiBudWxsO1xuICAgIGNvbnN0IGNvcmVzID0gbmF2Py5oYXJkd2FyZUNvbmN1cnJlbmN5IHx8IDQ7XG4gICAgLy8gXHU5NjUwXHU1MjM2XHU2NzAwXHU1OTI3XHU0RTNBIDggXHU0RTJBIFdvcmtlclx1RkYwQ1x1OTA3Rlx1NTE0RFx1OEZDN1x1NUVBNlx1NTM2MFx1NzUyOFx1OEQ0NFx1NkU5MFxuICAgIHJldHVybiBNYXRoLm1pbihjb3JlcywgOCk7XG4gIH1cblxuICBpZiAoZW52ID09PSAnbm9kZScpIHtcbiAgICAvLyBOb2RlLmpzIFx1NzNBRlx1NTg4M1x1RkYxQVx1NEY3Rlx1NzUyOCBvcy5jcHVzKClcbiAgICB0cnkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gICAgICBjb25zdCBvcyA9IHJlcXVpcmUoJ29zJyk7XG4gICAgICBjb25zdCBjb3JlcyA9IG9zLmNwdXMoKT8ubGVuZ3RoIHx8IDQ7XG4gICAgICAvLyBOb2RlLmpzIFx1NEUyRFx1NEU1Rlx1OTY1MFx1NTIzNlx1NjcwMFx1NTkyN1x1NEUzQSA4IFx1NEUyQSBXb3JrZXJcbiAgICAgIHJldHVybiBNYXRoLm1pbihjb3JlcywgOCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gNDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gNDtcbn1cblxuLyoqXG4gKiBcdTg5RTNcdTY3OTBcdTZENEZcdTg5QzhcdTU2NjhcdTczQUZcdTU4ODNcdTRFMEJcdTc2ODQgV29ya2VyIFx1ODExQVx1NjcyQyBVUkxcdTMwMDJcbiAqIFx1NTcyOCBWaXRlIFx1NEY5RFx1OEQ1Nlx1OTg4NFx1Njc4NFx1NUVGQVx1NzZFRVx1NUY1NVx1NEUyRFx1RkYwQ2BpbXBvcnQubWV0YS51cmxgIFx1NEYxQVx1ODhBQlx1OTFDRFx1NTE5OVx1NTIzMCBgbm9kZV9tb2R1bGVzLy52aXRlL2RlcHNgXHVGRjBDXG4gKiBcdTRGNDZcdTRFMERcdTRGMUFcdTUzMDVcdTU0MkJcdTYyMTFcdTRFRUNcdTUzMDVcdTUxODVcdTc2ODQgd29ya2VyIFx1NEVBN1x1NzI2OVx1RkYwQ1x1NTZFMFx1NkI2NFx1OTcwMFx1ODk4MVx1NTZERVx1OTAwMFx1NTIzMFx1NTMwNVx1NTE4NVx1NzcxRlx1NUI5RVx1OERFRlx1NUY4NFx1MzAwMlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUJyb3dzZXJXb3JrZXJVUkwobW9kdWxlVXJsOiBzdHJpbmcgPSBpbXBvcnQubWV0YS51cmwpOiBVUkwge1xuICBpZiAobW9kdWxlVXJsLmluY2x1ZGVzKFZJVEVfT1BUSU1JWkVEX0RFUFNfU0VHTUVOVCkpIHtcbiAgICByZXR1cm4gbmV3IFVSTCgnLi4vLi4vQG1hcmtkb3duLW5leHQvcGFyc2VyL2Rpc3QvbW9kdWxlcy9wYXJzZXIud29ya2VyLm1qcycsIG1vZHVsZVVybCk7XG4gIH1cblxuICByZXR1cm4gbmV3IFVSTChXT1JLRVJfTU9EVUxFX1BBVEgsIG1vZHVsZVVybCk7XG59XG5cbi8qKlxuICogXHU1MjFCXHU1RUZBIFdvcmtlciBcdTVCOUVcdTRGOEJcbiAqL1xuZnVuY3Rpb24gY3JlYXRlV29ya2VyKCk6IFdvcmtlciB7XG4gIGNvbnN0IGVudiA9IGdldEVudmlyb25tZW50KCk7XG5cbiAgaWYgKGVudiA9PT0gJ2Jyb3dzZXInKSB7XG4gICAgLy8gXHU2RDRGXHU4OUM4XHU1NjY4XHU3M0FGXHU1ODgzXHVGRjFBXHU0RjdGXHU3NTI4IFdlYiBXb3JrZXJcbiAgICByZXR1cm4gbmV3IFdvcmtlcihyZXNvbHZlQnJvd3NlcldvcmtlclVSTCgpLCB7XG4gICAgICB0eXBlOiAnbW9kdWxlJyxcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChlbnYgPT09ICdub2RlJykge1xuICAgIC8vIE5vZGUuanMgXHU3M0FGXHU1ODgzXHVGRjFBXHU0RjdGXHU3NTI4IHdvcmtlcl90aHJlYWRzXG4gICAgdHJ5IHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICAgICAgY29uc3QgeyBXb3JrZXIgfSA9IHJlcXVpcmUoJ3dvcmtlcl90aHJlYWRzJyk7XG4gICAgICByZXR1cm4gbmV3IFdvcmtlcihuZXcgVVJMKFdPUktFUl9NT0RVTEVfUEFUSCwgaW1wb3J0Lm1ldGEudXJsKSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdXb3JrZXIgdGhyZWFkcyBhcmUgbm90IHN1cHBvcnRlZCBpbiB0aGlzIE5vZGUuanMgZW52aXJvbm1lbnQuICcgK1xuICAgICAgICAgICdQbGVhc2UgdXNlIE5vZGUuanMgMTIrIG9yIHVzZSB0aGUgc2luZ2xlLXRocmVhZGVkIHBhcnNlciBpbnN0ZWFkLidcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBlbnZpcm9ubWVudCBmb3Igd29ya2VyIHBvb2wnKTtcbn1cblxuLyoqXG4gKiBXb3JrZXIgXHU2QzYwXHU5MTREXHU3RjZFXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2VyUG9vbE9wdGlvbnMgZXh0ZW5kcyBQYXJzZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdvcmtlciBcdTY1NzBcdTkxQ0ZcdUZGMENcdTlFRDhcdThCQTRcdTRFM0EgQ1BVIFx1NjgzOFx1NUZDM1x1NjU3MFx1RkYwOFx1NjcwMFx1NTkyNyA4XHVGRjA5XG4gICAqL1xuICB3b3JrZXJDb3VudD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBXb3JrZXIgXHU2QzYwXHU3MkI2XHU2MDAxXG4gKi9cbmludGVyZmFjZSBXb3JrZXJTdGF0ZSB7XG4gIHdvcmtlcjogV29ya2VyO1xuICBwcm94eTogUmVtb3RlPFBhcnNlcldvcmtlclNlcnZpY2U+O1xuICBidXN5OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFx1NTkxQVx1N0VCRlx1N0EwQiBNYXJrZG93biBcdTg5RTNcdTY3OTBcdTU2NjhcdUZGMDhcdTRGN0ZcdTc1MjggV29ya2VyIFx1NkM2MFx1RkYwOVxuICovXG5leHBvcnQgY2xhc3MgUGFyc2VyV29ya2VyUG9vbCB7XG4gIHByaXZhdGUgb3B0aW9uczogV29ya2VyUG9vbE9wdGlvbnM7XG4gIHByaXZhdGUgd29ya2VyczogV29ya2VyU3RhdGVbXSA9IFtdO1xuICBwcml2YXRlIHdvcmtlckNvdW50OiBudW1iZXI7XG4gIHByaXZhdGUgaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBpbml0UHJvbWlzZTogUHJvbWlzZTx2b2lkPiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGNvbXBsZXRlZFRhc2tzID0gMDtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gIHByaXZhdGUgcGVuZGluZzogQXJyYXk8KHdvcmtlcjogV29ya2VyU3RhdGUpID0+IHZvaWQ+ID0gW107XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogV29ya2VyUG9vbE9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgY29uc3QgbWF4V29ya2VycyA9IGdldE1heFdvcmtlcnMoKTtcbiAgICB0aGlzLndvcmtlckNvdW50ID0gb3B0aW9ucy53b3JrZXJDb3VudFxuICAgICAgPyBNYXRoLm1pbihNYXRoLm1heCgxLCBvcHRpb25zLndvcmtlckNvdW50KSwgbWF4V29ya2VycylcbiAgICAgIDogbWF4V29ya2VycztcbiAgICAvLyBcdTdBQ0JcdTUzNzNcdTVGMDBcdTU5Q0JcdTUyMURcdTU5Q0JcdTUzMTYgV29ya2VyIFx1NkM2MFxuICAgIHRoaXMuaW5pdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFx1NTIxRFx1NTlDQlx1NTMxNiBXb3JrZXIgXHU2QzYwXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGluaXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaW5pdGlhbGl6ZWQpIHJldHVybjtcbiAgICBpZiAodGhpcy5pbml0UHJvbWlzZSkge1xuICAgICAgYXdhaXQgdGhpcy5pbml0UHJvbWlzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmluaXRQcm9taXNlID0gKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHdvcmtlclByb21pc2VzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogdGhpcy53b3JrZXJDb3VudCB9LCAoKSA9PiB7XG4gICAgICAgIHJldHVybiAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHdvcmtlciA9IGNyZWF0ZVdvcmtlcigpO1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgY29uc3QgV29ya2VyQ2xhc3MgPSB3cmFwPGFueT4od29ya2VyKSBhcyBhbnk7XG4gICAgICAgICAgY29uc3QgcGFyc2VyT3B0aW9ucyA9IHsgLi4udGhpcy5vcHRpb25zIH07XG4gICAgICAgICAgZGVsZXRlIChwYXJzZXJPcHRpb25zIGFzIHsgd29ya2VyQ291bnQ/OiBudW1iZXIgfSkud29ya2VyQ291bnQ7XG4gICAgICAgICAgY29uc3QgcHJveHkgPSBhd2FpdCBuZXcgV29ya2VyQ2xhc3MocGFyc2VyT3B0aW9ucyk7XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgd29ya2VyLFxuICAgICAgICAgICAgcHJveHksXG4gICAgICAgICAgICBidXN5OiBmYWxzZSxcbiAgICAgICAgICB9O1xuICAgICAgICB9KSgpO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMud29ya2VycyA9IGF3YWl0IFByb21pc2UuYWxsKHdvcmtlclByb21pc2VzKTtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgIH0pKCk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5pbml0UHJvbWlzZTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5pbml0UHJvbWlzZSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFx1ODNCN1x1NTNENlx1N0E3QVx1OTVGMlx1NzY4NCBXb3JrZXJcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2V0QXZhaWxhYmxlV29ya2VyKCk6IFByb21pc2U8V29ya2VyU3RhdGU+IHtcbiAgICBhd2FpdCB0aGlzLmluaXQoKTtcblxuICAgIC8vIFx1NjdFNVx1NjI3RVx1N0E3QVx1OTVGMlx1NzY4NCBXb3JrZXJcbiAgICBsZXQgd29ya2VyID0gdGhpcy53b3JrZXJzLmZpbmQoKHcpID0+ICF3LmJ1c3kpO1xuXG4gICAgLy8gXHU1OTgyXHU2NzlDXHU2MjQwXHU2NzA5IFdvcmtlciBcdTkwRkRcdTVGRDlcdUZGMENcdTYzOTJcdTk2MUZcdTdCNDlcdTVGODVcdTkxQ0FcdTY1M0VcbiAgICBpZiAoIXdvcmtlcikge1xuICAgICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlPFdvcmtlclN0YXRlPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICB0aGlzLnBlbmRpbmcucHVzaCgoYXZhaWxhYmxlKSA9PiB7XG4gICAgICAgICAgYXZhaWxhYmxlLmJ1c3kgPSB0cnVlO1xuICAgICAgICAgIHJlc29sdmUoYXZhaWxhYmxlKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB3b3JrZXIuYnVzeSA9IHRydWU7XG4gICAgcmV0dXJuIHdvcmtlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBcdTkxQ0FcdTY1M0UgV29ya2VyXG4gICAqL1xuICBwcml2YXRlIHJlbGVhc2VXb3JrZXIod29ya2VyOiBXb3JrZXJTdGF0ZSk6IHZvaWQge1xuICAgIGNvbnN0IG5leHQgPSB0aGlzLnBlbmRpbmcuc2hpZnQoKTtcbiAgICBpZiAobmV4dCkge1xuICAgICAgbmV4dCh3b3JrZXIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB3b3JrZXIuYnVzeSA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFx1ODlFM1x1Njc5MCBNYXJrZG93biBcdTUyMzAgSFRNTFxuICAgKiBAcGFyYW0gbWFya2Rvd24gTWFya2Rvd24gXHU1QjU3XHU3QjI2XHU0RTMyXG4gICAqIEByZXR1cm5zIEhUTUwgXHU1QjU3XHU3QjI2XHU0RTMyXG4gICAqL1xuICBhc3luYyBwYXJzZVRvSFRNTChtYXJrZG93bjogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB3b3JrZXIgPSBhd2FpdCB0aGlzLmdldEF2YWlsYWJsZVdvcmtlcigpO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgd29ya2VyLnByb3h5LnBhcnNlVG9IVE1MKG1hcmtkb3duKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5jb21wbGV0ZWRUYXNrcyArPSAxO1xuICAgICAgdGhpcy5yZWxlYXNlV29ya2VyKHdvcmtlcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFx1ODlFM1x1Njc5MCBNYXJrZG93biBcdTUyMzAgSEFTVFxuICAgKiBAcGFyYW0gbWFya2Rvd24gTWFya2Rvd24gXHU1QjU3XHU3QjI2XHU0RTMyXG4gICAqIEByZXR1cm5zIEhBU1QgUm9vdCBcdTgyODJcdTcwQjlcbiAgICovXG4gIGFzeW5jIHBhcnNlVG9IQVNUKG1hcmtkb3duOiBzdHJpbmcpOiBQcm9taXNlPFJvb3Q+IHtcbiAgICBjb25zdCB3b3JrZXIgPSBhd2FpdCB0aGlzLmdldEF2YWlsYWJsZVdvcmtlcigpO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgd29ya2VyLnByb3h5LnBhcnNlVG9IQVNUKG1hcmtkb3duKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5jb21wbGV0ZWRUYXNrcyArPSAxO1xuICAgICAgdGhpcy5yZWxlYXNlV29ya2VyKHdvcmtlcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFx1NjI3OVx1OTFDRlx1ODlFM1x1Njc5MCBNYXJrZG93biBcdTUyMzAgSFRNTFx1RkYwOFx1NUU3Nlx1ODg0Q1x1NTkwNFx1NzQwNlx1RkYwOVxuICAgKiBAcGFyYW0gbWFya2Rvd25zIE1hcmtkb3duIFx1NUI1N1x1N0IyNlx1NEUzMlx1NjU3MFx1N0VDNFxuICAgKiBAcmV0dXJucyBIVE1MIFx1NUI1N1x1N0IyNlx1NEUzMlx1NjU3MFx1N0VDNFxuICAgKi9cbiAgYXN5bmMgYmF0Y2hQYXJzZVRvSFRNTChtYXJrZG93bnM6IHN0cmluZ1tdKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgIHJldHVybiBQcm9taXNlLmFsbChtYXJrZG93bnMubWFwKChtZCkgPT4gdGhpcy5wYXJzZVRvSFRNTChtZCkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBcdTYyNzlcdTkxQ0ZcdTg5RTNcdTY3OTAgTWFya2Rvd24gXHU1MjMwIEhBU1RcdUZGMDhcdTVFNzZcdTg4NENcdTU5MDRcdTc0MDZcdUZGMDlcbiAgICogQHBhcmFtIG1hcmtkb3ducyBNYXJrZG93biBcdTVCNTdcdTdCMjZcdTRFMzJcdTY1NzBcdTdFQzRcbiAgICogQHJldHVybnMgSEFTVCBSb290IFx1ODI4Mlx1NzBCOVx1NjU3MFx1N0VDNFxuICAgKi9cbiAgYXN5bmMgYmF0Y2hQYXJzZVRvSEFTVChtYXJrZG93bnM6IHN0cmluZ1tdKTogUHJvbWlzZTxSb290W10+IHtcbiAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwobWFya2Rvd25zLm1hcCgobWQpID0+IHRoaXMucGFyc2VUb0hBU1QobWQpKSk7XG4gIH1cblxuICAvKipcbiAgICogXHU2NkY0XHU2NUIwXHU2MjQwXHU2NzA5IFdvcmtlciBcdTc2ODRcdTkwMDlcdTk4NzlcbiAgICogQHBhcmFtIG9wdGlvbnMgXHU2NUIwXHU3Njg0XHU4OUUzXHU2NzkwXHU1NjY4XHU5MDA5XHU5ODc5XG4gICAqL1xuICBhc3luYyB1cGRhdGVPcHRpb25zKG9wdGlvbnM6IFBhcnRpYWw8UGFyc2VyT3B0aW9ucz4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICB0aGlzLm9wdGlvbnMgPSB7IC4uLnRoaXMub3B0aW9ucywgLi4ub3B0aW9ucyB9O1xuICAgIGNvbnN0IHBhcnNlck9wdGlvbnMgPSB7IC4uLnRoaXMub3B0aW9ucyB9O1xuICAgIGRlbGV0ZSAocGFyc2VyT3B0aW9ucyBhcyB7IHdvcmtlckNvdW50PzogbnVtYmVyIH0pLndvcmtlckNvdW50O1xuICAgIGF3YWl0IFByb21pc2UuYWxsKHRoaXMud29ya2Vycy5tYXAoKHcpID0+IHcucHJveHkudXBkYXRlT3B0aW9ucyhwYXJzZXJPcHRpb25zKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFx1OTUwMFx1NkJDMSBXb3JrZXIgXHU2QzYwXG4gICAqL1xuICBhc3luYyBkZXN0cm95KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5pbml0aWFsaXplZCkgcmV0dXJuO1xuXG4gICAgZm9yIChjb25zdCB7IHdvcmtlciB9IG9mIHRoaXMud29ya2Vycykge1xuICAgICAgd29ya2VyLnRlcm1pbmF0ZSgpO1xuICAgIH1cbiAgICB0aGlzLndvcmtlcnMgPSBbXTtcbiAgICB0aGlzLnBlbmRpbmcgPSBbXTtcbiAgICB0aGlzLmNvbXBsZXRlZFRhc2tzID0gMDtcbiAgICB0aGlzLmluaXRpYWxpemVkID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogXHU1MTdDXHU1QkI5XHU2NUU3IEFQSVx1RkYxQVx1N0VDOFx1NkI2MiBXb3JrZXIgXHU2QzYwXG4gICAqL1xuICBhc3luYyB0ZXJtaW5hdGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5kZXN0cm95KCk7XG4gIH1cblxuICAvKipcbiAgICogXHU1MTdDXHU1QkI5XHU2NUU3IEFQSVx1RkYxQVx1ODNCN1x1NTNENlx1N0VERlx1OEJBMVx1NEZFMVx1NjA2RlxuICAgKi9cbiAgZ2V0U3RhdHMoKToge1xuICAgIGFjdGl2ZVdvcmtlcnM6IG51bWJlcjtcbiAgICBpZGxlV29ya2VyczogbnVtYmVyO1xuICAgIHF1ZXVlZFRhc2tzOiBudW1iZXI7XG4gICAgY29tcGxldGVkVGFza3M6IG51bWJlcjtcbiAgfSB7XG4gICAgY29uc3QgYWN0aXZlV29ya2VycyA9IHRoaXMud29ya2Vycy5sZW5ndGg7XG4gICAgY29uc3QgYnVzeVdvcmtlcnMgPSB0aGlzLndvcmtlcnMuZmlsdGVyKCh3KSA9PiB3LmJ1c3kpLmxlbmd0aDtcblxuICAgIHJldHVybiB7XG4gICAgICBhY3RpdmVXb3JrZXJzLFxuICAgICAgaWRsZVdvcmtlcnM6IE1hdGgubWF4KGFjdGl2ZVdvcmtlcnMgLSBidXN5V29ya2VycywgMCksXG4gICAgICBxdWV1ZWRUYXNrczogdGhpcy5wZW5kaW5nLmxlbmd0aCxcbiAgICAgIGNvbXBsZXRlZFRhc2tzOiB0aGlzLmNvbXBsZXRlZFRhc2tzLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogXHU4M0I3XHU1M0Q2IFdvcmtlciBcdTZDNjBcdTRGRTFcdTYwNkZcbiAgICovXG4gIGdldFBvb2xJbmZvKCk6IHtcbiAgICB3b3JrZXJDb3VudDogbnVtYmVyO1xuICAgIGFjdGl2ZVdvcmtlcnM6IG51bWJlcjtcbiAgICBidXN5V29ya2VyczogbnVtYmVyO1xuICAgIG1heFdvcmtlcnM6IG51bWJlcjtcbiAgICBlbnZpcm9ubWVudDogJ2Jyb3dzZXInIHwgJ25vZGUnIHwgJ3Vua25vd24nO1xuICAgIGluaXRpYWxpemVkOiBib29sZWFuO1xuICB9IHtcbiAgICByZXR1cm4ge1xuICAgICAgd29ya2VyQ291bnQ6IHRoaXMud29ya2VyQ291bnQsXG4gICAgICBhY3RpdmVXb3JrZXJzOiB0aGlzLndvcmtlcnMubGVuZ3RoLFxuICAgICAgYnVzeVdvcmtlcnM6IHRoaXMud29ya2Vycy5maWx0ZXIoKHcpID0+IHcuYnVzeSkubGVuZ3RoLFxuICAgICAgbWF4V29ya2VyczogZ2V0TWF4V29ya2VycygpLFxuICAgICAgZW52aXJvbm1lbnQ6IGdldEVudmlyb25tZW50KCksXG4gICAgICBpbml0aWFsaXplZDogdGhpcy5pbml0aWFsaXplZCxcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogXHU1MjFCXHU1RUZBXHU1OTFBXHU3RUJGXHU3QTBCXHU4OUUzXHU2NzkwXHU1NjY4XHU1QjlFXHU0RjhCXG4gKiBAcGFyYW0gb3B0aW9ucyBcdTg5RTNcdTY3OTBcdTU2NjhcdTkwMDlcdTk4NzlcdUZGMDhcdTUzMDVcdTU0MkIgV29ya2VyIFx1NjU3MFx1OTFDRlx1RkYwOVxuICogQHJldHVybnMgUGFyc2VyV29ya2VyUG9vbCBcdTVCOUVcdTRGOEJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVdvcmtlclBvb2wob3B0aW9uczogV29ya2VyUG9vbE9wdGlvbnMgPSB7fSk6IFBhcnNlcldvcmtlclBvb2wge1xuICByZXR1cm4gbmV3IFBhcnNlcldvcmtlclBvb2wob3B0aW9ucyk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAieVBBQ0EsT0FBbUMsV0FBQUEsT0FBZSxVQUVsRCxPQUFPQyxPQUFpQixlQUN4QixPQUFPQyxPQUFlLGFBQ3RCLE9BQU9DLE9BQWtCLGdCQUN6QixPQUFPQyxPQUFxQixtQkFDNUIsT0FBT0MsT0FBZ0IsY0FDdkIsT0FBT0MsT0FBb0Isa0JBQzNCLE9BQU9DLE9BQWUsYUNSdEIsT0FB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VixRQUFXLENBQUUsT0FBQUYsQ0FBTyxJQUFLLEtBQUssUUFDNUJBLEVBQU8sVUFBVSxFQUVuQixLQUFLLFFBQVUsQ0FBQyxFQUNoQixLQUFLLFFBQVUsQ0FBQyxFQUNoQixLQUFLLGVBQWlCLEVBQ3RCLEtBQUssWUFBYyxHQUNyQixDQUtBLE1BQU0sV0FBMkIsQ0FDL0IsTUFBTSxLQUFLLFFBQVEsQ0FDckIsQ0FLQSxVQUtFLENBQ0EsSUFBTVcsRUFBZ0IsS0FBSyxRQUFRLE9BQzdCQyxFQUFjLEtBQUssUUFBUSxPQUFRUixHQUFNQSxFQUFFLElBQUksRUFBRSxPQUV2RCxNQUFPLENBQ0wsY0FBQU8sRUFDQSxZQUFhLEtBQUssSUFBSUEsRUFBZ0JDLEVBQWEsQ0FBQyxFQUNwRCxZQUFhLEtBQUssUUFBUSxPQUMxQixlQUFnQixLQUFLLGNBQ3ZCLENBQ0YsQ0FLQSxhQU9FLENBQ0EsTUFBTyxDQUNMLFlBQWEsS0FBSyxZQUNsQixjQUFlLEtBQUssUUFBUSxPQUM1QixZQUFhLEtBQUssUUFBUSxPQUFRUixHQUFNQSxFQUFFLElBQUksRUFBRSxPQUNoRCxXQUFZZixFQUFjLEVBQzFCLFlBQWFELEVBQWUsRUFDNUIsWUFBYSxLQUFLLFdBQ3BCLENBQ0YsQ0FDRixFQU9PLFNBQVN5QixHQUFpQmhCLEVBQTZCLENBQUMsRUFBcUIsQ0FDbEYsT0FBTyxJQUFJRCxFQUFpQkMsQ0FBTyxDQUNyQyIsCiAgIm5hbWVzIjogWyJ1bmlmaWVkIiwgInJlbWFya1BhcnNlIiwgInJlbWFya0dmbSIsICJyZW1hcmtSZWh5cGUiLCAicmVoeXBlU3RyaW5naWZ5IiwgInJlbWFya01hdGgiLCAicmVoeXBlU2FuaXRpemUiLCAicmVoeXBlUmF3IiwgImRlZmF1bHRTY2hlbWEiLCAiTUFUSE1MX1RBR19OQU1FUyIsICJNQVRITUxfQVRUUklCVVRFUyIsICJjcmVhdGVTYW5pdGl6ZVNjaGVtYSIsICJjdXN0b21UYWdzIiwgImRlZmF1bHRTY2hlbWEiLCAiTUFUSE1MX1RBR19OQU1FUyIsICJNQVRITUxfQVRUUklCVVRFUyIsICJhY2MiLCAidGFnIiwgImNvbnZlcnQiLCAidGVzdCIsICJvayIsICJjYXN0RmFjdG9yeSIsICJhbnlGYWN0b3J5IiwgInByb3BlcnRpZXNGYWN0b3J5IiwgInR5cGVGYWN0b3J5IiwgInRlc3RzIiwgImNoZWNrcyIsICJpbmRleCIsICJhbnkiLCAicGFyYW1ldGVycyIsICJjaGVjayIsICJjaGVja0FzUmVjb3JkIiwgImFsbCIsICJub2RlIiwgIm5vZGVBc1JlY29yZCIsICJrZXkiLCAidHlwZSIsICJ0ZXN0RnVuY3Rpb24iLCAidmFsdWUiLCAicGFyZW50IiwgImxvb2tzTGlrZUFOb2RlIiwgImNvbG9yIiwgImQiLCAiZW1wdHkiLCAiQ09OVElOVUUiLCAiRVhJVCIsICJTS0lQIiwgInZpc2l0UGFyZW50cyIsICJ0cmVlIiwgInRlc3QiLCAidmlzaXRvciIsICJyZXZlcnNlIiwgImNoZWNrIiwgImlzIiwgImNvbnZlcnQiLCAic3RlcCIsICJmYWN0b3J5IiwgIm5vZGUiLCAiaW5kZXgiLCAicGFyZW50cyIsICJ2YWx1ZSIsICJuYW1lIiwgInZpc2l0IiwgImNvbG9yIiwgInJlc3VsdCIsICJzdWJyZXN1bHQiLCAib2Zmc2V0IiwgImdyYW5kcGFyZW50cyIsICJ0b1Jlc3VsdCIsICJub2RlQXNQYXJlbnQiLCAiY2hpbGQiLCAidmlzaXQiLCAidHJlZSIsICJ0ZXN0T3JWaXNpdG9yIiwgInZpc2l0b3JPclJldmVyc2UiLCAibWF5YmVSZXZlcnNlIiwgInJldmVyc2UiLCAidGVzdCIsICJ2aXNpdG9yIiwgInZpc2l0UGFyZW50cyIsICJvdmVybG9hZCIsICJub2RlIiwgInBhcmVudHMiLCAicGFyZW50IiwgImluZGV4IiwgInJlaHlwZUNvbnZlcnRBYm5vcm1hbFRhZ3NUb1RleHQiLCAiY3VzdG9tVGFncyIsICJ0cmVlIiwgInNjaGVtYSIsICJjcmVhdGVTYW5pdGl6ZVNjaGVtYSIsICJhbGxvd2VkVGFnTmFtZXMiLCAidmlzaXQiLCAibm9kZSIsICJpbmRleCIsICJwYXJlbnQiLCAidGFnTmFtZSIsICJ0YWdTdHJpbmciLCAia2V5IiwgInZhbHVlIiwgImlubmVyQ29udGVudCIsICJwcm9jZXNzQ2hpbGRyZW4iLCAiY2hpbGRyZW4iLCAiY2hpbGQiLCAiZWxlbWVudENoaWxkIiwgImNoaWxkVGFnIiwgInRleHROb2RlIiwgInJlaHlwZU1hdGhKYXhDaHRtbCIsICJNQVRIX0pBWEZPTlRfVVJMIiwgIkRFRkFVTFRfTUFUSEpBWF9DT05GSUciLCAiY291bnRQcmVjZWRpbmdCYWNrc2xhc2hlcyIsICJpbnB1dCIsICJpbmRleCIsICJjb3VudCIsICJpIiwgImlzVW5lc2NhcGVkRGVsaW1pdGVyIiwgIm5leHRDaGFyIiwgImZpbmRDbG9zaW5nRGVsaW1pdGVyIiwgImZyb21JbmRleCIsICJjbG9zZUNoYXIiLCAiaXNMaW5lU3RhcnQiLCAic2NhbkZlbmNlIiwgImNoYXIiLCAiZmVuY2VMZW5ndGgiLCAiaXNJbmRlbnRlZENvZGVMaW5lIiwgIm5vcm1hbGl6ZUxhdGV4UGFyZW5zTWF0aCIsICJvdXRwdXQiLCAiaW5GZW5jZWRDb2RlQmxvY2siLCAiZmVuY2VDaGFyIiwgImluSW5saW5lQ29kZSIsICJpbmxpbmVDb2RlVGlja0xlbmd0aCIsICJlbmQiLCAiZmVuY2UiLCAidGlja3MiLCAiaiIsICJjbG9zZUluZGV4IiwgImlubmVyIiwgInN0YXJ0IiwgInJlbWFya01hdGhEZWxpbWl0ZXJzIiwgImN1cnJlbnRQYXJzZXIiLCAiZG9jdW1lbnQiLCAiZmlsZSIsICJuZXh0RG9jdW1lbnQiLCAibm9ybWFsaXplZCIsICJnZXRQYXJzZXIiLCAidGFyZ2V0IiwgIm9wdGlvbiIsICJjdXN0b21UYWdzIiwgInJlbWFya1BsdWdpbnMiLCAicmVoeXBlUGx1Z2lucyIsICJleHRlbmRlZEdyYW1tYXIiLCAibWF0aEpheENvbmZpZyIsICJzdXBwb3J0c0xhVGVYIiwgImV4dGVuZGVkR3JhbW1hclNldCIsICJwYXJzZXIiLCAidW5pZmllZCIsICJyZW1hcmtQYXJzZSIsICJyZW1hcmtHZm0iLCAicmVtYXJrTWF0aERlbGltaXRlcnMiLCAicmVtYXJrTWF0aCIsICJyZW1hcmtSZWh5cGUiLCAicmVoeXBlUmF3IiwgInJlaHlwZUNvbnZlcnRBYm5vcm1hbFRhZ3NUb1RleHQiLCAicmVoeXBlU2FuaXRpemUiLCAiY3JlYXRlU2FuaXRpemVTY2hlbWEiLCAibWVyZ2VkQ29uZmlnIiwgIkRFRkFVTFRfTUFUSEpBWF9DT05GSUciLCAicmVoeXBlTWF0aEpheENodG1sIiwgInJlaHlwZVN0cmluZ2lmeSIsICJQYXJzZXIiLCAib3B0aW9ucyIsICJtYXJrZG93biIsICJyZXN1bHQiLCAiZ2V0UGFyc2VyIiwgInByb2Nlc3NvciIsICJ0cmVlIiwgIm1hcmtkb3ducyIsICJtZCIsICJjcmVhdGVQYXJzZXIiLCAid3JhcCIsICJXT1JLRVJfTU9EVUxFX1BBVEgiLCAiVklURV9PUFRJTUlaRURfREVQU19TRUdNRU5UIiwgImdldEVudmlyb25tZW50IiwgImdldE1heFdvcmtlcnMiLCAiZW52IiwgImNvcmVzIiwgInJlc29sdmVCcm93c2VyV29ya2VyVVJMIiwgIm1vZHVsZVVybCIsICJjcmVhdGVXb3JrZXIiLCAiV29ya2VyIiwgIlBhcnNlcldvcmtlclBvb2wiLCAib3B0aW9ucyIsICJtYXhXb3JrZXJzIiwgIndvcmtlclByb21pc2VzIiwgIndvcmtlciIsICJXb3JrZXJDbGFzcyIsICJwYXJzZXJPcHRpb25zIiwgInByb3h5IiwgInciLCAicmVzb2x2ZSIsICJhdmFpbGFibGUiLCAibmV4dCIsICJtYXJrZG93biIsICJtYXJrZG93bnMiLCAibWQiLCAiYWN0aXZlV29ya2VycyIsICJidXN5V29ya2VycyIsICJjcmVhdGVXb3JrZXJQb29sIl0KfQo=
8
+ `;r+=`$$${u}${s}${d}$$`,n=a+2;continue}}}r+=e[n],n++}return r},G=function(){let r=this.parser||this.Parser;r&&(this.Parser=function(o,i){let l=o;if(typeof o=="string"){let c=oe(o);l=c,i&&typeof i.value=="string"&&(i.value=c)}return r(l,i)},this.parser&&(this.parser=this.Parser))};var T=(e,r)=>{let{customTags:t=[],remarkPlugins:o=[],rehypePlugins:i=[],extendedGrammar:l=[],mathJaxConfig:c,supportsLaTeX:n=!1}=r,a=new Set(l),s=ne().use(se);if(a.has("gfm")&&(s=s.use(ie)),a.has("mathjax")&&(n&&(s=s.use(G)),s=s.use(ce)),o.length>0&&(s=s.use(o)),s=s.use(ae,{allowDangerousHtml:!0}).use(ue).use(z,t).use(me,v(t)),a.has("mathjax")){let u=c??U;s=s.use(pe,u)}return i.length>0&&(s=s.use(i)),e==="html"?s.use(le,{allowDangerousHtml:!0}):s};var E=class{constructor(r={}){this.options=r}async parseToHTML(r){let o=await T("html",this.options).process(r);return String(o)}async parseToHAST(r){let t=T("hast",this.options),o=t.parse(r);return await t.run(o)}async batchParseToHTML(r){let t=T("html",this.options);return Promise.all(r.map(async o=>{let i=await t.process(o);return String(i)}))}async batchParseToHAST(r){let t=T("hast",this.options);return Promise.all(r.map(async o=>{let i=t.parse(o);return await t.run(i)}))}};function fe(e={}){return new E(e)}import{wrap as he}from"comlink";var X="./modules/parser.worker.mjs",de="/.vite/deps/",ye=new URL("./modules/parser.worker.mjs",import.meta.url);function N(){return typeof window<"u"&&typeof window.document<"u"?"browser":typeof process<"u"&&process.versions?.node?"node":"unknown"}function J(){let e=N();if(e==="browser"){let t=(typeof navigator<"u"?navigator:null)?.hardwareConcurrency||4;return Math.min(t,8)}if(e==="node")try{let t=I("os").cpus()?.length||4;return Math.min(t,8)}catch{return 4}return 4}function ge(e=import.meta.url){return e.includes(de)?new URL("../../@markdown-next/parser/dist/modules/parser.worker.mjs",e):e===import.meta.url?ye:new URL(X,e)}function ke(){let e=N();if(e==="browser")return new Worker(ge(),{type:"module"});if(e==="node")try{let{Worker:r}=I("worker_threads");return new r(new URL(X,import.meta.url))}catch{throw new Error("Worker threads are not supported in this Node.js environment. Please use Node.js 12+ or use the single-threaded parser instead.")}throw new Error("Unsupported environment for worker pool")}var b=class{constructor(r={}){this.workers=[];this.initialized=!1;this.initPromise=null;this.completedTasks=0;this.pending=[];this.options=r;let t=J();this.workerCount=r.workerCount?Math.min(Math.max(1,r.workerCount),t):t,this.init()}async init(){if(!this.initialized){if(this.initPromise){await this.initPromise;return}this.initPromise=(async()=>{let r=Array.from({length:this.workerCount},()=>(async()=>{let t=ke(),o=he(t),i={...this.options};delete i.workerCount;let l=await new o(i);return{worker:t,proxy:l,busy:!1}})());this.workers=await Promise.all(r),this.initialized=!0})();try{await this.initPromise}finally{this.initPromise=null}}}async getAvailableWorker(){await this.init();let r=this.workers.find(t=>!t.busy);return r?(r.busy=!0,r):await new Promise(t=>{this.pending.push(o=>{o.busy=!0,t(o)})})}releaseWorker(r){let t=this.pending.shift();if(t){t(r);return}r.busy=!1}async parseToHTML(r){let t=await this.getAvailableWorker();try{return await t.proxy.parseToHTML(r)}finally{this.completedTasks+=1,this.releaseWorker(t)}}async parseToHAST(r){let t=await this.getAvailableWorker();try{return await t.proxy.parseToHAST(r)}finally{this.completedTasks+=1,this.releaseWorker(t)}}async batchParseToHTML(r){return await this.init(),Promise.all(r.map(t=>this.parseToHTML(t)))}async batchParseToHAST(r){return await this.init(),Promise.all(r.map(t=>this.parseToHAST(t)))}async updateOptions(r){await this.init(),this.options={...this.options,...r};let t={...this.options};delete t.workerCount,await Promise.all(this.workers.map(o=>o.proxy.updateOptions(t)))}async destroy(){if(this.initialized){for(let{worker:r}of this.workers)r.terminate();this.workers=[],this.pending=[],this.completedTasks=0,this.initialized=!1}}async terminate(){await this.destroy()}getStats(){let r=this.workers.length,t=this.workers.filter(o=>o.busy).length;return{activeWorkers:r,idleWorkers:Math.max(r-t,0),queuedTasks:this.pending.length,completedTasks:this.completedTasks}}getPoolInfo(){return{workerCount:this.workerCount,activeWorkers:this.workers.length,busyWorkers:this.workers.filter(r=>r.busy).length,maxWorkers:J(),environment:N(),initialized:this.initialized}}};function we(e={}){return new b(e)}export{b as MarkdownWorkerPool,E as Parser,b as ParserWorkerPool,fe as createParser,we as createWorkerPool};
9
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL21vZHVsZXMvY29yZS50cyIsICIuLi9zcmMvdXRpbHMvY3JlYXRlU2FuaXRpemVTY2hlbWEudHMiLCAiLi4vc3JjL2NvbnN0cy90YWdGaWx0ZXIudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3VuaXN0LXV0aWwtaXNANi4wLjEvbm9kZV9tb2R1bGVzL3VuaXN0LXV0aWwtaXMvbGliL2luZGV4LmpzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmlzdC11dGlsLXZpc2l0LXBhcmVudHNANi4wLjIvbm9kZV9tb2R1bGVzL3VuaXN0LXV0aWwtdmlzaXQtcGFyZW50cy9saWIvY29sb3Iubm9kZS5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdW5pc3QtdXRpbC12aXNpdC1wYXJlbnRzQDYuMC4yL25vZGVfbW9kdWxlcy91bmlzdC11dGlsLXZpc2l0LXBhcmVudHMvbGliL2luZGV4LmpzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91bmlzdC11dGlsLXZpc2l0QDUuMC4wL25vZGVfbW9kdWxlcy91bmlzdC11dGlsLXZpc2l0L2xpYi9pbmRleC5qcyIsICIuLi9zcmMvcGx1Z2luL3JlaHlwZUNvbnZlcnRBYm5vcm1hbFRhZ3NUb1RleHQudHMiLCAiLi4vc3JjL2NvbnN0cy9tYXRoamF4ZGVmYXVsdENvbmZpZy50cyIsICIuLi9zcmMvcGx1Z2luL3JlbWFya01hdGhEZWxpbWl0ZXJzLnRzIiwgIi4uL3NyYy9tb2R1bGVzL3BhcnNlci50cyIsICIuLi9zcmMvbW9kdWxlcy9wYXJzZXIud29ya2VyUG9vbC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgRXh0ZW5kc1Byb3BzLCBSZW5kZXJUeXBlIH0gZnJvbSAnLi4vdHlwZXMvcHJvcHMnO1xuaW1wb3J0IHsgUGx1Z2dhYmxlTGlzdCwgUHJvY2Vzc29yLCB1bmlmaWVkIH0gZnJvbSAndW5pZmllZCc7XG5pbXBvcnQgeyBSb290IH0gZnJvbSAnaGFzdCc7XG5pbXBvcnQgcmVtYXJrUGFyc2UgZnJvbSAncmVtYXJrLXBhcnNlJztcbmltcG9ydCByZW1hcmtHZm0gZnJvbSAncmVtYXJrLWdmbSc7XG5pbXBvcnQgcmVtYXJrUmVoeXBlIGZyb20gJ3JlbWFyay1yZWh5cGUnO1xuaW1wb3J0IHJlaHlwZVN0cmluZ2lmeSBmcm9tICdyZWh5cGUtc3RyaW5naWZ5JztcbmltcG9ydCByZW1hcmtNYXRoIGZyb20gJ3JlbWFyay1tYXRoJztcbmltcG9ydCByZWh5cGVTYW5pdGl6ZSBmcm9tICdyZWh5cGUtc2FuaXRpemUnO1xuaW1wb3J0IHJlaHlwZVJhdyBmcm9tICdyZWh5cGUtcmF3JztcbmltcG9ydCB7IGNyZWF0ZVNhbml0aXplU2NoZW1hIH0gZnJvbSAnLi4vdXRpbHMvY3JlYXRlU2FuaXRpemVTY2hlbWEnO1xuaW1wb3J0IHsgcmVoeXBlQ29udmVydEFibm9ybWFsVGFnc1RvVGV4dCB9IGZyb20gJy4uL3BsdWdpbi9yZWh5cGVDb252ZXJ0QWJub3JtYWxUYWdzVG9UZXh0JztcbmltcG9ydCByZWh5cGVNYXRoSmF4Q2h0bWwgZnJvbSAncmVoeXBlLW1hdGhqYXgvY2h0bWwnO1xuaW1wb3J0IHR5cGUgeyBPcHRpb25zIGFzIE1hdGhKYXhPcHRpb25zIH0gZnJvbSAncmVoeXBlLW1hdGhqYXgvY2h0bWwnO1xuaW1wb3J0IHsgREVGQVVMVF9NQVRISkFYX0NPTkZJRyB9IGZyb20gJy4uL2NvbnN0cy9tYXRoamF4ZGVmYXVsdENvbmZpZyc7XG5pbXBvcnQgeyByZW1hcmtNYXRoRGVsaW1pdGVycyB9IGZyb20gJy4uL3BsdWdpbi9yZW1hcmtNYXRoRGVsaW1pdGVycyc7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxudHlwZSBBbnlQcm9jZXNzb3IgPSBQcm9jZXNzb3I8YW55LCBhbnksIGFueSwgYW55LCBhbnk+O1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlbmRlclByb3BzIHtcbiAgY3VzdG9tVGFncz86IHN0cmluZ1tdO1xuICBleHRlbmRlZEdyYW1tYXI/OiBFeHRlbmRzUHJvcHNbXTtcbiAgLyoqXG4gICAqIFJlbWFyayBwbHVnaW5zIGFwcGVuZGVkIGJlZm9yZSBgcmVtYXJrUmVoeXBlYCAocHJvY2VzcyBNYXJrZG93biBBU1QpXG4gICAqL1xuICByZW1hcmtQbHVnaW5zPzogUGx1Z2dhYmxlTGlzdDtcbiAgLyoqXG4gICAqIFJlaHlwZSBwbHVnaW5zIGFwcGVuZGVkIGFmdGVyIGByZWh5cGVSYXcvcmVoeXBlU2FuaXRpemVgIChwcm9jZXNzIEhUTUwgQVNUKVxuICAgKi9cbiAgcmVoeXBlUGx1Z2lucz86IFBsdWdnYWJsZUxpc3Q7XG4gIC8qKlxuICAgKiBNYXRoSmF4IGNvbmZpZyBvcHRpb25zIChvbmx5IGVmZmVjdGl2ZSB3aGVuIGV4dGVuZGVkR3JhbW1hciBpbmNsdWRlcyAnbWF0aGpheCcpXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1hdGhqYXgub3JnL2VuL2xhdGVzdC9vcHRpb25zL2luZGV4Lmh0bWxcbiAgICovXG4gIG1hdGhKYXhDb25maWc/OiBNYXRoSmF4T3B0aW9ucztcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gc3VwcG9ydCBMYVRlWCBzeW50YXggKHVzaW5nIFxcXFwoIGFuZCBcXFxcWyBhcyBtYXRoIGRlbGltaXRlcnMpXG4gICAqIFdoZW4gdHJ1ZSwgZW5hYmxlcyByZW1hcmtNYXRoRGVsaW1pdGVycyB0byBwYXJzZSBMYVRlWCBzeW50YXhcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHN1cHBvcnRzTGFUZVg/OiBib29sZWFuO1xufVxuZXhwb3J0IGNvbnN0IGdldFBhcnNlciA9IDxUIGV4dGVuZHMgUmVuZGVyVHlwZT4oXG4gIHRhcmdldDogVCxcbiAgb3B0aW9uOiBSZW5kZXJQcm9wc1xuKTogVCBleHRlbmRzICdodG1sJ1xuICA/IFByb2Nlc3NvcjxSb290LCBSb290LCBSb290LCBSb290LCBzdHJpbmc+XG4gIDogUHJvY2Vzc29yPFJvb3QsIFJvb3QsIFJvb3QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkPiA9PiB7XG4gIGNvbnN0IHtcbiAgICBjdXN0b21UYWdzID0gW10sXG4gICAgcmVtYXJrUGx1Z2lucyA9IFtdLFxuICAgIHJlaHlwZVBsdWdpbnMgPSBbXSxcbiAgICBleHRlbmRlZEdyYW1tYXIgPSBbXSxcbiAgICBtYXRoSmF4Q29uZmlnLFxuICAgIHN1cHBvcnRzTGFUZVggPSBmYWxzZSxcbiAgfSA9IG9wdGlvbjtcbiAgY29uc3QgZXh0ZW5kZWRHcmFtbWFyU2V0ID0gbmV3IFNldChleHRlbmRlZEdyYW1tYXIpO1xuICBsZXQgcGFyc2VyOiBBbnlQcm9jZXNzb3IgPSB1bmlmaWVkKCkudXNlKHJlbWFya1BhcnNlKSBhcyBBbnlQcm9jZXNzb3I7XG4gIGlmIChleHRlbmRlZEdyYW1tYXJTZXQuaGFzKCdnZm0nKSkgcGFyc2VyID0gcGFyc2VyLnVzZShyZW1hcmtHZm0pO1xuICBpZiAoZXh0ZW5kZWRHcmFtbWFyU2V0LmhhcygnbWF0aGpheCcpKSB7XG4gICAgaWYgKHN1cHBvcnRzTGFUZVgpIHtcbiAgICAgIHBhcnNlciA9IHBhcnNlci51c2UocmVtYXJrTWF0aERlbGltaXRlcnMpO1xuICAgIH1cbiAgICBwYXJzZXIgPSBwYXJzZXIudXNlKHJlbWFya01hdGgpO1xuICB9XG5cbiAgLy8gQXBwZW5kIHJlbWFyayBwbHVnaW5zIGJlZm9yZSByZW1hcmtSZWh5cGVcbiAgaWYgKHJlbWFya1BsdWdpbnMubGVuZ3RoID4gMCkge1xuICAgIHBhcnNlciA9IHBhcnNlci51c2UocmVtYXJrUGx1Z2lucyk7XG4gIH1cblxuICBwYXJzZXIgPSBwYXJzZXJcbiAgICAudXNlKHJlbWFya1JlaHlwZSwgeyBhbGxvd0Rhbmdlcm91c0h0bWw6IHRydWUgfSlcbiAgICAudXNlKHJlaHlwZVJhdylcbiAgICAudXNlKHJlaHlwZUNvbnZlcnRBYm5vcm1hbFRhZ3NUb1RleHQsIGN1c3RvbVRhZ3MpXG4gICAgLnVzZShyZWh5cGVTYW5pdGl6ZSwgY3JlYXRlU2FuaXRpemVTY2hlbWEoY3VzdG9tVGFncykpO1xuXG4gIGlmIChleHRlbmRlZEdyYW1tYXJTZXQuaGFzKCdtYXRoamF4JykpIHtcbiAgICBjb25zdCBtZXJnZWRDb25maWc6IE1hdGhKYXhPcHRpb25zID0gbWF0aEpheENvbmZpZyA/PyBERUZBVUxUX01BVEhKQVhfQ09ORklHO1xuICAgIHBhcnNlciA9IHBhcnNlci51c2UocmVoeXBlTWF0aEpheENodG1sLCBtZXJnZWRDb25maWcpO1xuICB9XG5cbiAgLy8gQXBwZW5kIHJlaHlwZSBwbHVnaW5zIGFmdGVyIHJlaHlwZVJhdy9yZWh5cGVTYW5pdGl6ZVxuICBpZiAocmVoeXBlUGx1Z2lucy5sZW5ndGggPiAwKSB7XG4gICAgcGFyc2VyID0gcGFyc2VyLnVzZShyZWh5cGVQbHVnaW5zKTtcbiAgfVxuXG4gIGlmICh0YXJnZXQgPT09ICdodG1sJykge1xuICAgIHJldHVybiBwYXJzZXIudXNlKHJlaHlwZVN0cmluZ2lmeSwge1xuICAgICAgYWxsb3dEYW5nZXJvdXNIdG1sOiB0cnVlLFxuICAgIH0pIGFzIFQgZXh0ZW5kcyAnaHRtbCdcbiAgICAgID8gUHJvY2Vzc29yPFJvb3QsIFJvb3QsIFJvb3QsIFJvb3QsIHN0cmluZz5cbiAgICAgIDogUHJvY2Vzc29yPFJvb3QsIFJvb3QsIFJvb3QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkPjtcbiAgfVxuICByZXR1cm4gcGFyc2VyIGFzIFQgZXh0ZW5kcyAnaHRtbCdcbiAgICA/IFByb2Nlc3NvcjxSb290LCBSb290LCBSb290LCBSb290LCBzdHJpbmc+XG4gICAgOiBQcm9jZXNzb3I8Um9vdCwgUm9vdCwgUm9vdCwgdW5kZWZpbmVkLCB1bmRlZmluZWQ+O1xufTtcbiIsICIvLyBDcmVhdGUgc2FuaXRpemUgc2NoZW1hXG5pbXBvcnQgeyBkZWZhdWx0U2NoZW1hIH0gZnJvbSAncmVoeXBlLXNhbml0aXplJztcbmltcG9ydCB7IE1BVEhNTF9BVFRSSUJVVEVTLCBNQVRITUxfVEFHX05BTUVTIH0gZnJvbSAnLi4vY29uc3RzL3RhZ0ZpbHRlcic7XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVTYW5pdGl6ZVNjaGVtYSA9IChjdXN0b21UYWdzOiBzdHJpbmdbXSA9IFtdKTogdHlwZW9mIGRlZmF1bHRTY2hlbWEgPT4gKHtcbiAgLi4uZGVmYXVsdFNjaGVtYSxcbiAgdGFnTmFtZXM6IFsuLi4oZGVmYXVsdFNjaGVtYS50YWdOYW1lcyB8fCBbXSksIC4uLk1BVEhNTF9UQUdfTkFNRVMsIC4uLmN1c3RvbVRhZ3NdLFxuICBhdHRyaWJ1dGVzOiB7XG4gICAgLi4uZGVmYXVsdFNjaGVtYS5hdHRyaWJ1dGVzLFxuXG4gICAgLy8gQWxsb3cgc3JjIGF0dHJpYnV0ZSBmb3IgaW1nIHRhZ3Mgd2l0aCBmaWxlOi8vIHByb3RvY29sIGFuZCBvdGhlciBwcm90b2NvbHNcbiAgICBpbWc6IFsnc3JjJywgJ2FsdCcsICd0aXRsZScsICd3aWR0aCcsICdoZWlnaHQnLCAnc3R5bGUnLCAnY2xhc3MnXSxcbiAgICAvLyBUaGUgYGxhbmd1YWdlLSpgIHJlZ2V4IGlzIGFsbG93ZWQgYnkgZGVmYXVsdC5cbiAgICBjb2RlOiBbWydjbGFzc05hbWUnLCAvXmxhbmd1YWdlLS4vLCAnbWF0aC1pbmxpbmUnLCAnbWF0aC1kaXNwbGF5J11dLFxuICAgIC4uLk1BVEhNTF9BVFRSSUJVVEVTLFxuICAgIC8vIEFkZCBiYXNpYyBhdHRyaWJ1dGVzIGZvciBjdXN0b20gdGFnc1xuICAgIC4uLmN1c3RvbVRhZ3MucmVkdWNlKFxuICAgICAgKGFjYywgdGFnKSA9PiB7XG4gICAgICAgIGFjY1t0YWddID0gWydjbGFzcycsICdjbGFzc05hbWUnLCAnc3R5bGUnLCAnaWQnLCAncHJvcCcsICdzcmMnXTtcbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH0sXG4gICAgICB7fSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT5cbiAgICApLFxuICB9LFxuICBwcm90b2NvbHM6IHtcbiAgICAuLi5kZWZhdWx0U2NoZW1hLnByb3RvY29scyxcbiAgICBzcmM6IFsnaHR0cCcsICdodHRwcycsICdkYXRhJywgJ2ZpbGUnXSxcbiAgfSxcbn0pO1xuIiwgImV4cG9ydCBjb25zdCBNQVRITUxfVEFHX05BTUVTOiBzdHJpbmdbXSA9IFtcbiAgJ21hdGgnLFxuICAnbXJvdycsXG4gICdtaScsXG4gICdtbicsXG4gICdtbycsXG4gICdtZnJhYycsXG4gICdtc3VwJyxcbiAgJ21zdWInLFxuICAnbXVuZGVyJyxcbiAgJ21vdmVyJyxcbiAgJ211bmRlcm92ZXInLFxuICAnbXNxcnQnLFxuICAnbXJvb3QnLFxuICAnbXRleHQnLFxuICAnbXNwYWNlJyxcbiAgJ21lbmNsb3NlJyxcbiAgJ21wYWRkZWQnLFxuICAnbXBoYW50b20nLFxuICAnbXRhYmxlJyxcbiAgJ210cicsXG4gICdtdGQnLFxuICAnbWxhYmVsZWR0cicsXG4gICdtYWxpZ25ncm91cCcsXG4gICdtYWxpZ25tYXJrJyxcbiAgJ21zdHlsZScsXG4gICdtZXJyb3InLFxuICAnbWFjdGlvbicsXG4gICdzZW1hbnRpY3MnLFxuICAnYW5ub3RhdGlvbicsXG4gICdhbm5vdGF0aW9uLXhtbCcsXG5dIGFzIGNvbnN0O1xuXG4vLyBNYXRoTUwgYXR0cmlidXRlIGNvbmZpZ3VyYXRpb25cbmV4cG9ydCBjb25zdCBNQVRITUxfQVRUUklCVVRFUzogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+ID0ge1xuICBtYXRoOiBbJ2Rpc3BsYXknLCAnY2xhc3MnLCAnc3R5bGUnLCAneG1sbnMnXSxcbiAgbXJvdzogWydjbGFzcycsICdzdHlsZSddLFxuICBtaTogWydjbGFzcycsICdzdHlsZScsICdtYXRodmFyaWFudCddLFxuICBtbjogWydjbGFzcycsICdzdHlsZSddLFxuICBtbzogW1xuICAgICdjbGFzcycsXG4gICAgJ3N0eWxlJyxcbiAgICAnZmVuY2UnLFxuICAgICdzZXBhcmF0b3InLFxuICAgICdzdHJldGNoeScsXG4gICAgJ3N5bW1ldHJpYycsXG4gICAgJ2xhcmdlb3AnLFxuICAgICdtb3ZhYmxlbGltaXRzJyxcbiAgICAnYWNjZW50JyxcbiAgICAnbHNwYWNlJyxcbiAgICAncnNwYWNlJyxcbiAgICAnZm9ybScsXG4gIF0sXG4gIG1mcmFjOiBbJ2NsYXNzJywgJ3N0eWxlJywgJ2xpbmV0aGlja25lc3MnLCAnbnVtYWxpZ24nLCAnZGVub21hbGlnbicsICdiZXZlbGxlZCddLFxuICBtc3VwOiBbJ2NsYXNzJywgJ3N0eWxlJywgJ3N1cGVyc2NyaXB0c2hpZnQnXSxcbiAgbXN1YjogWydjbGFzcycsICdzdHlsZScsICdzdWJzY3JpcHRzaGlmdCddLFxuICBtdW5kZXI6IFsnY2xhc3MnLCAnc3R5bGUnLCAnYWNjZW50dW5kZXInXSxcbiAgbW92ZXI6IFsnY2xhc3MnLCAnc3R5bGUnLCAnYWNjZW50J10sXG4gIG11bmRlcm92ZXI6IFsnY2xhc3MnLCAnc3R5bGUnLCAnYWNjZW50JywgJ2FjY2VudHVuZGVyJ10sXG4gIG1zcXJ0OiBbJ2NsYXNzJywgJ3N0eWxlJ10sXG4gIG1yb290OiBbJ2NsYXNzJywgJ3N0eWxlJ10sXG4gIG10ZXh0OiBbJ2NsYXNzJywgJ3N0eWxlJywgJ21hdGh2YXJpYW50J10sXG4gIG1zcGFjZTogWydjbGFzcycsICdzdHlsZScsICd3aWR0aCcsICdoZWlnaHQnLCAnZGVwdGgnXSxcbiAgbWVuY2xvc2U6IFsnY2xhc3MnLCAnc3R5bGUnLCAnbm90YXRpb24nXSxcbiAgbXBhZGRlZDogWydjbGFzcycsICdzdHlsZScsICd3aWR0aCcsICdoZWlnaHQnLCAnZGVwdGgnLCAnbHNwYWNlJywgJ3ZvZmZzZXQnXSxcbiAgbXBoYW50b206IFsnY2xhc3MnLCAnc3R5bGUnXSxcbiAgbXRhYmxlOiBbXG4gICAgJ2NsYXNzJyxcbiAgICAnc3R5bGUnLFxuICAgICdhbGlnbicsXG4gICAgJ3Jvd2FsaWduJyxcbiAgICAnY29sdW1uYWxpZ24nLFxuICAgICdncm91cGFsaWduJyxcbiAgICAnYWxpZ25tZW50c2NvcGUnLFxuICAgICdjb2x1bW53aWR0aCcsXG4gICAgJ3dpZHRoJyxcbiAgICAncm93c3BhY2luZycsXG4gICAgJ2NvbHVtbnNwYWNpbmcnLFxuICAgICdyb3dsaW5lcycsXG4gICAgJ2NvbHVtbmxpbmVzJyxcbiAgICAnZnJhbWUnLFxuICAgICdmcmFtZXNwYWNpbmcnLFxuICAgICdlcXVhbHJvd3MnLFxuICAgICdlcXVhbGNvbHVtbnMnLFxuICAgICdkaXNwbGF5c3R5bGUnLFxuICAgICdzaWRlJyxcbiAgICAnbWlubGFiZWxzcGFjaW5nJyxcbiAgXSxcbiAgbXRyOiBbJ2NsYXNzJywgJ3N0eWxlJywgJ3Jvd2FsaWduJywgJ2NvbHVtbmFsaWduJywgJ2dyb3VwYWxpZ24nXSxcbiAgbXRkOiBbJ2NsYXNzJywgJ3N0eWxlJywgJ3Jvd3NwYW4nLCAnY29sdW1uc3BhbicsICdyb3dhbGlnbicsICdjb2x1bW5hbGlnbicsICdncm91cGFsaWduJ10sXG4gIG1sYWJlbGVkdHI6IFsnY2xhc3MnLCAnc3R5bGUnLCAncm93YWxpZ24nLCAnY29sdW1uYWxpZ24nLCAnZ3JvdXBhbGlnbiddLFxuICBtYWxpZ25ncm91cDogWydjbGFzcycsICdzdHlsZScsICdncm91cGFsaWduJ10sXG4gIG1hbGlnbm1hcms6IFsnY2xhc3MnLCAnc3R5bGUnLCAnZWRnZSddLFxuICBtc3R5bGU6IFtcbiAgICAnY2xhc3MnLFxuICAgICdzdHlsZScsXG4gICAgJ3NjcmlwdGxldmVsJyxcbiAgICAnZGlzcGxheXN0eWxlJyxcbiAgICAnc2NyaXB0c2l6ZW11bHRpcGxpZXInLFxuICAgICdzY3JpcHRtaW5zaXplJyxcbiAgICAnaW5maXhsaW5lYnJlYWtzdHlsZScsXG4gICAgJ2RlY2ltYWxwb2ludCcsXG4gICAgJ21hdGh2YXJpYW50JyxcbiAgICAnbWF0aHNpemUnLFxuICAgICdtYXRoY29sb3InLFxuICAgICdtYXRoYmFja2dyb3VuZCcsXG4gIF0sXG4gIG1lcnJvcjogWydjbGFzcycsICdzdHlsZSddLFxuICBtYWN0aW9uOiBbJ2NsYXNzJywgJ3N0eWxlJywgJ2FjdGlvbnR5cGUnLCAnc2VsZWN0aW9uJ10sXG4gIHNlbWFudGljczogWydjbGFzcycsICdzdHlsZSddLFxuICBhbm5vdGF0aW9uOiBbJ2NsYXNzJywgJ3N0eWxlJywgJ2VuY29kaW5nJ10sXG4gICdhbm5vdGF0aW9uLXhtbCc6IFsnY2xhc3MnLCAnc3R5bGUnLCAnZW5jb2RpbmcnXSxcbn07XG4iLCAiLyoqXG4gKiBAaW1wb3J0IHtOb2RlLCBQYXJlbnR9IGZyb20gJ3VuaXN0J1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIEZuXG4gKiBAdGVtcGxhdGUgRmFsbGJhY2tcbiAqIEB0eXBlZGVmIHtGbiBleHRlbmRzICh2YWx1ZTogYW55KSA9PiB2YWx1ZSBpcyBpbmZlciBUaGluZyA/IFRoaW5nIDogRmFsbGJhY2t9IFByZWRpY2F0ZVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIENoZWNrXG4gKiAgIENoZWNrIHRoYXQgYW4gYXJiaXRyYXJ5IHZhbHVlIGlzIGEgbm9kZS5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdGhpc1xuICogICBUaGUgZ2l2ZW4gY29udGV4dC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gW25vZGVdXG4gKiAgIEFueXRoaW5nICh0eXBpY2FsbHkgYSBub2RlKS5cbiAqIEBwYXJhbSB7bnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZH0gW2luZGV4XVxuICogICBUaGUgbm9kZVx1MjAxOXMgcG9zaXRpb24gaW4gaXRzIHBhcmVudC5cbiAqIEBwYXJhbSB7UGFyZW50IHwgbnVsbCB8IHVuZGVmaW5lZH0gW3BhcmVudF1cbiAqICAgVGhlIG5vZGVcdTIwMTlzIHBhcmVudC5cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICogICBXaGV0aGVyIHRoaXMgaXMgYSBub2RlIGFuZCBwYXNzZXMgYSB0ZXN0LlxuICpcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IE5vZGV9IFByb3BzXG4gKiAgIE9iamVjdCB0byBjaGVjayBmb3IgZXF1aXZhbGVuY2UuXG4gKlxuICogICBOb3RlOiBgTm9kZWAgaXMgaW5jbHVkZWQgYXMgaXQgaXMgY29tbW9uIGJ1dCBpcyBub3QgaW5kZXhhYmxlLlxuICpcbiAqIEB0eXBlZGVmIHtBcnJheTxQcm9wcyB8IFRlc3RGdW5jdGlvbiB8IHN0cmluZz4gfCBSZWFkb25seUFycmF5PFByb3BzIHwgVGVzdEZ1bmN0aW9uIHwgc3RyaW5nPiB8IFByb3BzIHwgVGVzdEZ1bmN0aW9uIHwgc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZH0gVGVzdFxuICogICBDaGVjayBmb3IgYW4gYXJiaXRyYXJ5IG5vZGUuXG4gKlxuICogQGNhbGxiYWNrIFRlc3RGdW5jdGlvblxuICogICBDaGVjayBpZiBhIG5vZGUgcGFzc2VzIGEgdGVzdC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdGhpc1xuICogICBUaGUgZ2l2ZW4gY29udGV4dC5cbiAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuICogICBBIG5vZGUuXG4gKiBAcGFyYW0ge251bWJlciB8IHVuZGVmaW5lZH0gW2luZGV4XVxuICogICBUaGUgbm9kZVx1MjAxOXMgcG9zaXRpb24gaW4gaXRzIHBhcmVudC5cbiAqIEBwYXJhbSB7UGFyZW50IHwgdW5kZWZpbmVkfSBbcGFyZW50XVxuICogICBUaGUgbm9kZVx1MjAxOXMgcGFyZW50LlxuICogQHJldHVybnMge2Jvb2xlYW4gfCB1bmRlZmluZWQgfCB2b2lkfVxuICogICBXaGV0aGVyIHRoaXMgbm9kZSBwYXNzZXMgdGhlIHRlc3QuXG4gKlxuICogICBOb3RlOiBgdm9pZGAgaXMgaW5jbHVkZWQgdW50aWwgVFMgc2VlcyBubyByZXR1cm4gYXMgYHVuZGVmaW5lZGAuXG4gKi9cblxuLyoqXG4gKiBDaGVjayBpZiBgbm9kZWAgaXMgYSBgTm9kZWAgYW5kIHdoZXRoZXIgaXQgcGFzc2VzIHRoZSBnaXZlbiB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gbm9kZVxuICogICBUaGluZyB0byBjaGVjaywgdHlwaWNhbGx5IGBOb2RlYC5cbiAqIEBwYXJhbSB7VGVzdH0gdGVzdFxuICogICBBIGNoZWNrIGZvciBhIHNwZWNpZmljIG5vZGUuXG4gKiBAcGFyYW0ge251bWJlciB8IG51bGwgfCB1bmRlZmluZWR9IGluZGV4XG4gKiAgIFRoZSBub2RlXHUyMDE5cyBwb3NpdGlvbiBpbiBpdHMgcGFyZW50LlxuICogQHBhcmFtIHtQYXJlbnQgfCBudWxsIHwgdW5kZWZpbmVkfSBwYXJlbnRcbiAqICAgVGhlIG5vZGVcdTIwMTlzIHBhcmVudC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gY29udGV4dFxuICogICBDb250ZXh0IG9iamVjdCAoYHRoaXNgKSB0byBwYXNzIHRvIGB0ZXN0YCBmdW5jdGlvbnMuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqICAgV2hldGhlciBgbm9kZWAgaXMgYSBub2RlIGFuZCBwYXNzZXMgYSB0ZXN0LlxuICovXG5leHBvcnQgY29uc3QgaXMgPVxuICAvLyBOb3RlOiBvdmVybG9hZHMgaW4gSlNEb2MgY2FuXHUyMDE5dCB5ZXQgdXNlIGRpZmZlcmVudCBgQHRlbXBsYXRlYHMuXG4gIC8qKlxuICAgKiBAdHlwZSB7KFxuICAgKiAgICg8Q29uZGl0aW9uIGV4dGVuZHMgUmVhZG9ubHlBcnJheTxzdHJpbmc+Pihub2RlOiB1bmtub3duLCB0ZXN0OiBDb25kaXRpb24sIGluZGV4PzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgcGFyZW50PzogUGFyZW50IHwgbnVsbCB8IHVuZGVmaW5lZCwgY29udGV4dD86IHVua25vd24pID0+IG5vZGUgaXMgTm9kZSAmIHt0eXBlOiBDb25kaXRpb25bbnVtYmVyXX0pICZcbiAgICogICAoPENvbmRpdGlvbiBleHRlbmRzIEFycmF5PHN0cmluZz4+KG5vZGU6IHVua25vd24sIHRlc3Q6IENvbmRpdGlvbiwgaW5kZXg/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCBwYXJlbnQ/OiBQYXJlbnQgfCBudWxsIHwgdW5kZWZpbmVkLCBjb250ZXh0PzogdW5rbm93bikgPT4gbm9kZSBpcyBOb2RlICYge3R5cGU6IENvbmRpdGlvbltudW1iZXJdfSkgJlxuICAgKiAgICg8Q29uZGl0aW9uIGV4dGVuZHMgc3RyaW5nPihub2RlOiB1bmtub3duLCB0ZXN0OiBDb25kaXRpb24sIGluZGV4PzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgcGFyZW50PzogUGFyZW50IHwgbnVsbCB8IHVuZGVmaW5lZCwgY29udGV4dD86IHVua25vd24pID0+IG5vZGUgaXMgTm9kZSAmIHt0eXBlOiBDb25kaXRpb259KSAmXG4gICAqICAgKDxDb25kaXRpb24gZXh0ZW5kcyBQcm9wcz4obm9kZTogdW5rbm93biwgdGVzdDogQ29uZGl0aW9uLCBpbmRleD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIHBhcmVudD86IFBhcmVudCB8IG51bGwgfCB1bmRlZmluZWQsIGNvbnRleHQ/OiB1bmtub3duKSA9PiBub2RlIGlzIE5vZGUgJiBDb25kaXRpb24pICZcbiAgICogICAoPENvbmRpdGlvbiBleHRlbmRzIFRlc3RGdW5jdGlvbj4obm9kZTogdW5rbm93biwgdGVzdDogQ29uZGl0aW9uLCBpbmRleD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIHBhcmVudD86IFBhcmVudCB8IG51bGwgfCB1bmRlZmluZWQsIGNvbnRleHQ/OiB1bmtub3duKSA9PiBub2RlIGlzIE5vZGUgJiBQcmVkaWNhdGU8Q29uZGl0aW9uLCBOb2RlPikgJlxuICAgKiAgICgobm9kZT86IG51bGwgfCB1bmRlZmluZWQpID0+IGZhbHNlKSAmXG4gICAqICAgKChub2RlOiB1bmtub3duLCB0ZXN0PzogbnVsbCB8IHVuZGVmaW5lZCwgaW5kZXg/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCBwYXJlbnQ/OiBQYXJlbnQgfCBudWxsIHwgdW5kZWZpbmVkLCBjb250ZXh0PzogdW5rbm93bikgPT4gbm9kZSBpcyBOb2RlKSAmXG4gICAqICAgKChub2RlOiB1bmtub3duLCB0ZXN0PzogVGVzdCwgaW5kZXg/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCBwYXJlbnQ/OiBQYXJlbnQgfCBudWxsIHwgdW5kZWZpbmVkLCBjb250ZXh0PzogdW5rbm93bikgPT4gYm9vbGVhbilcbiAgICogKX1cbiAgICovXG4gIChcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge3Vua25vd259IFtub2RlXVxuICAgICAqIEBwYXJhbSB7VGVzdH0gW3Rlc3RdXG4gICAgICogQHBhcmFtIHtudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkfSBbaW5kZXhdXG4gICAgICogQHBhcmFtIHtQYXJlbnQgfCBudWxsIHwgdW5kZWZpbmVkfSBbcGFyZW50XVxuICAgICAqIEBwYXJhbSB7dW5rbm93bn0gW2NvbnRleHRdXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1wYXJhbXNcbiAgICBmdW5jdGlvbiAobm9kZSwgdGVzdCwgaW5kZXgsIHBhcmVudCwgY29udGV4dCkge1xuICAgICAgY29uc3QgY2hlY2sgPSBjb252ZXJ0KHRlc3QpXG5cbiAgICAgIGlmIChcbiAgICAgICAgaW5kZXggIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICBpbmRleCAhPT0gbnVsbCAmJlxuICAgICAgICAodHlwZW9mIGluZGV4ICE9PSAnbnVtYmVyJyB8fFxuICAgICAgICAgIGluZGV4IDwgMCB8fFxuICAgICAgICAgIGluZGV4ID09PSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBwb3NpdGl2ZSBmaW5pdGUgaW5kZXgnKVxuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIHBhcmVudCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIHBhcmVudCAhPT0gbnVsbCAmJlxuICAgICAgICAoIWlzKHBhcmVudCkgfHwgIXBhcmVudC5jaGlsZHJlbilcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHBhcmVudCBub2RlJylcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICAocGFyZW50ID09PSB1bmRlZmluZWQgfHwgcGFyZW50ID09PSBudWxsKSAhPT1cbiAgICAgICAgKGluZGV4ID09PSB1bmRlZmluZWQgfHwgaW5kZXggPT09IG51bGwpXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBib3RoIHBhcmVudCBhbmQgaW5kZXgnKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbG9va3NMaWtlQU5vZGUobm9kZSlcbiAgICAgICAgPyBjaGVjay5jYWxsKGNvbnRleHQsIG5vZGUsIGluZGV4LCBwYXJlbnQpXG4gICAgICAgIDogZmFsc2VcbiAgICB9XG4gIClcblxuLyoqXG4gKiBHZW5lcmF0ZSBhbiBhc3NlcnRpb24gZnJvbSBhIHRlc3QuXG4gKlxuICogVXNlZnVsIGlmIHlvdVx1MjAxOXJlIGdvaW5nIHRvIHRlc3QgbWFueSBub2RlcywgZm9yIGV4YW1wbGUgd2hlbiBjcmVhdGluZyBhXG4gKiB1dGlsaXR5IHdoZXJlIHNvbWV0aGluZyBlbHNlIHBhc3NlcyBhIGNvbXBhdGlibGUgdGVzdC5cbiAqXG4gKiBUaGUgY3JlYXRlZCBmdW5jdGlvbiBpcyBhIGJpdCBmYXN0ZXIgYmVjYXVzZSBpdCBleHBlY3RzIHZhbGlkIGlucHV0IG9ubHk6XG4gKiBhIGBub2RlYCwgYGluZGV4YCwgYW5kIGBwYXJlbnRgLlxuICpcbiAqIEBwYXJhbSB7VGVzdH0gdGVzdFxuICogICAqICAgd2hlbiBudWxsaXNoLCBjaGVja3MgaWYgYG5vZGVgIGlzIGEgYE5vZGVgLlxuICogICAqICAgd2hlbiBgc3RyaW5nYCwgd29ya3MgbGlrZSBwYXNzaW5nIGAobm9kZSkgPT4gbm9kZS50eXBlID09PSB0ZXN0YC5cbiAqICAgKiAgIHdoZW4gYGZ1bmN0aW9uYCBjaGVja3MgaWYgZnVuY3Rpb24gcGFzc2VkIHRoZSBub2RlIGlzIHRydWUuXG4gKiAgICogICB3aGVuIGBvYmplY3RgLCBjaGVja3MgdGhhdCBhbGwga2V5cyBpbiB0ZXN0IGFyZSBpbiBub2RlLCBhbmQgdGhhdCB0aGV5IGhhdmUgKHN0cmljdGx5KSBlcXVhbCB2YWx1ZXMuXG4gKiAgICogICB3aGVuIGBhcnJheWAsIGNoZWNrcyBpZiBhbnkgb25lIG9mIHRoZSBzdWJ0ZXN0cyBwYXNzLlxuICogQHJldHVybnMge0NoZWNrfVxuICogICBBbiBhc3NlcnRpb24uXG4gKi9cbmV4cG9ydCBjb25zdCBjb252ZXJ0ID1cbiAgLy8gTm90ZTogb3ZlcmxvYWRzIGluIEpTRG9jIGNhblx1MjAxOXQgeWV0IHVzZSBkaWZmZXJlbnQgYEB0ZW1wbGF0ZWBzLlxuICAvKipcbiAgICogQHR5cGUgeyhcbiAgICogICAoPENvbmRpdGlvbiBleHRlbmRzIHN0cmluZz4odGVzdDogQ29uZGl0aW9uKSA9PiAobm9kZTogdW5rbm93biwgaW5kZXg/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCBwYXJlbnQ/OiBQYXJlbnQgfCBudWxsIHwgdW5kZWZpbmVkLCBjb250ZXh0PzogdW5rbm93bikgPT4gbm9kZSBpcyBOb2RlICYge3R5cGU6IENvbmRpdGlvbn0pICZcbiAgICogICAoPENvbmRpdGlvbiBleHRlbmRzIFByb3BzPih0ZXN0OiBDb25kaXRpb24pID0+IChub2RlOiB1bmtub3duLCBpbmRleD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIHBhcmVudD86IFBhcmVudCB8IG51bGwgfCB1bmRlZmluZWQsIGNvbnRleHQ/OiB1bmtub3duKSA9PiBub2RlIGlzIE5vZGUgJiBDb25kaXRpb24pICZcbiAgICogICAoPENvbmRpdGlvbiBleHRlbmRzIFRlc3RGdW5jdGlvbj4odGVzdDogQ29uZGl0aW9uKSA9PiAobm9kZTogdW5rbm93biwgaW5kZXg/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCBwYXJlbnQ/OiBQYXJlbnQgfCBudWxsIHwgdW5kZWZpbmVkLCBjb250ZXh0PzogdW5rbm93bikgPT4gbm9kZSBpcyBOb2RlICYgUHJlZGljYXRlPENvbmRpdGlvbiwgTm9kZT4pICZcbiAgICogICAoKHRlc3Q/OiBudWxsIHwgdW5kZWZpbmVkKSA9PiAobm9kZT86IHVua25vd24sIGluZGV4PzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgcGFyZW50PzogUGFyZW50IHwgbnVsbCB8IHVuZGVmaW5lZCwgY29udGV4dD86IHVua25vd24pID0+IG5vZGUgaXMgTm9kZSkgJlxuICAgKiAgICgodGVzdD86IFRlc3QpID0+IENoZWNrKVxuICAgKiApfVxuICAgKi9cbiAgKFxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7VGVzdH0gW3Rlc3RdXG4gICAgICogQHJldHVybnMge0NoZWNrfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uICh0ZXN0KSB7XG4gICAgICBpZiAodGVzdCA9PT0gbnVsbCB8fCB0ZXN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIG9rXG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgdGVzdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gY2FzdEZhY3RvcnkodGVzdClcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiB0ZXN0ID09PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh0ZXN0KVxuICAgICAgICAgID8gYW55RmFjdG9yeSh0ZXN0KVxuICAgICAgICAgIDogLy8gQ2FzdCBiZWNhdXNlIGBSZWFkb25seUFycmF5YCBnb2VzIGludG8gdGhlIGFib3ZlIGJ1dCBgaXNBcnJheWBcbiAgICAgICAgICAgIC8vIG5hcnJvd3MgdG8gYEFycmF5YC5cbiAgICAgICAgICAgIHByb3BlcnRpZXNGYWN0b3J5KC8qKiBAdHlwZSB7UHJvcHN9ICovICh0ZXN0KSlcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiB0ZXN0ID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gdHlwZUZhY3RvcnkodGVzdClcbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBmdW5jdGlvbiwgc3RyaW5nLCBvciBvYmplY3QgYXMgdGVzdCcpXG4gICAgfVxuICApXG5cbi8qKlxuICogQHBhcmFtIHtBcnJheTxQcm9wcyB8IFRlc3RGdW5jdGlvbiB8IHN0cmluZz59IHRlc3RzXG4gKiBAcmV0dXJucyB7Q2hlY2t9XG4gKi9cbmZ1bmN0aW9uIGFueUZhY3RvcnkodGVzdHMpIHtcbiAgLyoqIEB0eXBlIHtBcnJheTxDaGVjaz59ICovXG4gIGNvbnN0IGNoZWNrcyA9IFtdXG4gIGxldCBpbmRleCA9IC0xXG5cbiAgd2hpbGUgKCsraW5kZXggPCB0ZXN0cy5sZW5ndGgpIHtcbiAgICBjaGVja3NbaW5kZXhdID0gY29udmVydCh0ZXN0c1tpbmRleF0pXG4gIH1cblxuICByZXR1cm4gY2FzdEZhY3RvcnkoYW55KVxuXG4gIC8qKlxuICAgKiBAdGhpcyB7dW5rbm93bn1cbiAgICogQHR5cGUge1Rlc3RGdW5jdGlvbn1cbiAgICovXG4gIGZ1bmN0aW9uIGFueSguLi5wYXJhbWV0ZXJzKSB7XG4gICAgbGV0IGluZGV4ID0gLTFcblxuICAgIHdoaWxlICgrK2luZGV4IDwgY2hlY2tzLmxlbmd0aCkge1xuICAgICAgaWYgKGNoZWNrc1tpbmRleF0uYXBwbHkodGhpcywgcGFyYW1ldGVycykpIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuLyoqXG4gKiBUdXJuIGFuIG9iamVjdCBpbnRvIGEgdGVzdCBmb3IgYSBub2RlIHdpdGggYSBjZXJ0YWluIGZpZWxkcy5cbiAqXG4gKiBAcGFyYW0ge1Byb3BzfSBjaGVja1xuICogQHJldHVybnMge0NoZWNrfVxuICovXG5mdW5jdGlvbiBwcm9wZXJ0aWVzRmFjdG9yeShjaGVjaykge1xuICBjb25zdCBjaGVja0FzUmVjb3JkID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi8gKGNoZWNrKVxuXG4gIHJldHVybiBjYXN0RmFjdG9yeShhbGwpXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGFsbChub2RlKSB7XG4gICAgY29uc3Qgbm9kZUFzUmVjb3JkID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi8gKFxuICAgICAgLyoqIEB0eXBlIHt1bmtub3dufSAqLyAobm9kZSlcbiAgICApXG5cbiAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cbiAgICBsZXQga2V5XG5cbiAgICBmb3IgKGtleSBpbiBjaGVjaykge1xuICAgICAgaWYgKG5vZGVBc1JlY29yZFtrZXldICE9PSBjaGVja0FzUmVjb3JkW2tleV0pIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlXG4gIH1cbn1cblxuLyoqXG4gKiBUdXJuIGEgc3RyaW5nIGludG8gYSB0ZXN0IGZvciBhIG5vZGUgd2l0aCBhIGNlcnRhaW4gdHlwZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gY2hlY2tcbiAqIEByZXR1cm5zIHtDaGVja31cbiAqL1xuZnVuY3Rpb24gdHlwZUZhY3RvcnkoY2hlY2spIHtcbiAgcmV0dXJuIGNhc3RGYWN0b3J5KHR5cGUpXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuICAgKi9cbiAgZnVuY3Rpb24gdHlwZShub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUgJiYgbm9kZS50eXBlID09PSBjaGVja1xuICB9XG59XG5cbi8qKlxuICogVHVybiBhIGN1c3RvbSB0ZXN0IGludG8gYSB0ZXN0IGZvciBhIG5vZGUgdGhhdCBwYXNzZXMgdGhhdCB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7VGVzdEZ1bmN0aW9ufSB0ZXN0RnVuY3Rpb25cbiAqIEByZXR1cm5zIHtDaGVja31cbiAqL1xuZnVuY3Rpb24gY2FzdEZhY3RvcnkodGVzdEZ1bmN0aW9uKSB7XG4gIHJldHVybiBjaGVja1xuXG4gIC8qKlxuICAgKiBAdGhpcyB7dW5rbm93bn1cbiAgICogQHR5cGUge0NoZWNrfVxuICAgKi9cbiAgZnVuY3Rpb24gY2hlY2sodmFsdWUsIGluZGV4LCBwYXJlbnQpIHtcbiAgICByZXR1cm4gQm9vbGVhbihcbiAgICAgIGxvb2tzTGlrZUFOb2RlKHZhbHVlKSAmJlxuICAgICAgICB0ZXN0RnVuY3Rpb24uY2FsbChcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgIHR5cGVvZiBpbmRleCA9PT0gJ251bWJlcicgPyBpbmRleCA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBwYXJlbnQgfHwgdW5kZWZpbmVkXG4gICAgICAgIClcbiAgICApXG4gIH1cbn1cblxuZnVuY3Rpb24gb2soKSB7XG4gIHJldHVybiB0cnVlXG59XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZVxuICogQHJldHVybnMge3ZhbHVlIGlzIE5vZGV9XG4gKi9cbmZ1bmN0aW9uIGxvb2tzTGlrZUFOb2RlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICd0eXBlJyBpbiB2YWx1ZVxufVxuIiwgIi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGRcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2xvcihkKSB7XG4gIHJldHVybiAnXFx1MDAxQlszM20nICsgZCArICdcXHUwMDFCWzM5bSdcbn1cbiIsICIvKipcbiAqIEBpbXBvcnQge05vZGUgYXMgVW5pc3ROb2RlLCBQYXJlbnQgYXMgVW5pc3RQYXJlbnR9IGZyb20gJ3VuaXN0J1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge0V4Y2x1ZGU8aW1wb3J0KCd1bmlzdC11dGlsLWlzJykuVGVzdCwgdW5kZWZpbmVkPiB8IHVuZGVmaW5lZH0gVGVzdFxuICogICBUZXN0IGZyb20gYHVuaXN0LXV0aWwtaXNgLlxuICpcbiAqICAgTm90ZTogd2UgaGF2ZSByZW1vdmUgYW5kIGFkZCBgdW5kZWZpbmVkYCwgYmVjYXVzZSBvdGhlcndpc2Ugd2hlbiBnZW5lcmF0aW5nXG4gKiAgIGF1dG9tYXRpYyBgLmQudHNgIGZpbGVzLCBUUyB0cmllcyB0byBmbGF0dGVuIHBhdGhzIGZyb20gYSBsb2NhbCBwZXJzcGVjdGl2ZSxcbiAqICAgd2hpY2ggZG9lc25cdTIwMTl0IHdvcmsgd2hlbiBwdWJsaXNoaW5nIG9uIG5wbS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoXG4gKiAgIEZuIGV4dGVuZHMgKHZhbHVlOiBhbnkpID0+IHZhbHVlIGlzIGluZmVyIFRoaW5nXG4gKiAgID8gVGhpbmdcbiAqICAgOiBGYWxsYmFja1xuICogKX0gUHJlZGljYXRlXG4gKiAgIEdldCB0aGUgdmFsdWUgb2YgYSB0eXBlIGd1YXJkIGBGbmAuXG4gKiBAdGVtcGxhdGUgRm5cbiAqICAgVmFsdWU7IHR5cGljYWxseSBmdW5jdGlvbiB0aGF0IGlzIGEgdHlwZSBndWFyZCAoc3VjaCBhcyBgKHgpOiB4IGlzIFlgKS5cbiAqIEB0ZW1wbGF0ZSBGYWxsYmFja1xuICogICBWYWx1ZSB0byB5aWVsZCBpZiBgRm5gIGlzIG5vdCBhIHR5cGUgZ3VhcmQuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KFxuICogICBDaGVjayBleHRlbmRzIG51bGwgfCB1bmRlZmluZWQgLy8gTm8gdGVzdC5cbiAqICAgPyBWYWx1ZVxuICogICA6IFZhbHVlIGV4dGVuZHMge3R5cGU6IENoZWNrfSAvLyBTdHJpbmcgKHR5cGUpIHRlc3QuXG4gKiAgID8gVmFsdWVcbiAqICAgOiBWYWx1ZSBleHRlbmRzIENoZWNrIC8vIFBhcnRpYWwgdGVzdC5cbiAqICAgPyBWYWx1ZVxuICogICA6IENoZWNrIGV4dGVuZHMgRnVuY3Rpb24gLy8gRnVuY3Rpb24gdGVzdC5cbiAqICAgPyBQcmVkaWNhdGU8Q2hlY2ssIFZhbHVlPiBleHRlbmRzIFZhbHVlXG4gKiAgICAgPyBQcmVkaWNhdGU8Q2hlY2ssIFZhbHVlPlxuICogICAgIDogbmV2ZXJcbiAqICAgOiBuZXZlciAvLyBTb21lIG90aGVyIHRlc3Q/XG4gKiApfSBNYXRjaGVzT25lXG4gKiAgIENoZWNrIHdoZXRoZXIgYSBub2RlIG1hdGNoZXMgYSBwcmltaXRpdmUgY2hlY2sgaW4gdGhlIHR5cGUgc3lzdGVtLlxuICogQHRlbXBsYXRlIFZhbHVlXG4gKiAgIFZhbHVlOyB0eXBpY2FsbHkgdW5pc3QgYE5vZGVgLlxuICogQHRlbXBsYXRlIENoZWNrXG4gKiAgIFZhbHVlOyB0eXBpY2FsbHkgYHVuaXN0LXV0aWwtaXNgLWNvbXBhdGlibGUgdGVzdCwgYnV0IG5vdCBhcnJheXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KFxuICogICBDaGVjayBleHRlbmRzIFJlYWRvbmx5QXJyYXk8aW5mZXIgVD5cbiAqICAgPyBNYXRjaGVzT25lPFZhbHVlLCBUPlxuICogICA6IENoZWNrIGV4dGVuZHMgQXJyYXk8aW5mZXIgVD5cbiAqICAgPyBNYXRjaGVzT25lPFZhbHVlLCBUPlxuICogICA6IE1hdGNoZXNPbmU8VmFsdWUsIENoZWNrPlxuICogKX0gTWF0Y2hlc1xuICogICBDaGVjayB3aGV0aGVyIGEgbm9kZSBtYXRjaGVzIGEgY2hlY2sgaW4gdGhlIHR5cGUgc3lzdGVtLlxuICogQHRlbXBsYXRlIFZhbHVlXG4gKiAgIFZhbHVlOyB0eXBpY2FsbHkgdW5pc3QgYE5vZGVgLlxuICogQHRlbXBsYXRlIENoZWNrXG4gKiAgIFZhbHVlOyB0eXBpY2FsbHkgYHVuaXN0LXV0aWwtaXNgLWNvbXBhdGlibGUgdGVzdC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHswIHwgMSB8IDIgfCAzIHwgNCB8IDUgfCA2IHwgNyB8IDggfCA5IHwgMTB9IFVpbnRcbiAqICAgTnVtYmVyOyBjYXBwZWQgcmVhc29uYWJseS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtJIGV4dGVuZHMgMCA/IDEgOiBJIGV4dGVuZHMgMSA/IDIgOiBJIGV4dGVuZHMgMiA/IDMgOiBJIGV4dGVuZHMgMyA/IDQgOiBJIGV4dGVuZHMgNCA/IDUgOiBJIGV4dGVuZHMgNSA/IDYgOiBJIGV4dGVuZHMgNiA/IDcgOiBJIGV4dGVuZHMgNyA/IDggOiBJIGV4dGVuZHMgOCA/IDkgOiAxMH0gSW5jcmVtZW50XG4gKiAgIEluY3JlbWVudCBhIG51bWJlciBpbiB0aGUgdHlwZSBzeXN0ZW0uXG4gKiBAdGVtcGxhdGUge1VpbnR9IFtJPTBdXG4gKiAgIEluZGV4LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyhcbiAqICAgTm9kZSBleHRlbmRzIFVuaXN0UGFyZW50XG4gKiAgID8gTm9kZSBleHRlbmRzIHtjaGlsZHJlbjogQXJyYXk8aW5mZXIgQ2hpbGRyZW4+fVxuICogICAgID8gQ2hpbGQgZXh0ZW5kcyBDaGlsZHJlbiA/IE5vZGUgOiBuZXZlclxuICogICAgIDogbmV2ZXJcbiAqICAgOiBuZXZlclxuICogKX0gSW50ZXJuYWxQYXJlbnRcbiAqICAgQ29sbGVjdCBub2RlcyB0aGF0IGNhbiBiZSBwYXJlbnRzIG9mIGBDaGlsZGAuXG4gKiBAdGVtcGxhdGUge1VuaXN0Tm9kZX0gTm9kZVxuICogICBBbGwgbm9kZSB0eXBlcyBpbiBhIHRyZWUuXG4gKiBAdGVtcGxhdGUge1VuaXN0Tm9kZX0gQ2hpbGRcbiAqICAgTm9kZSB0byBzZWFyY2ggZm9yLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge0ludGVybmFsUGFyZW50PEluY2x1c2l2ZURlc2NlbmRhbnQ8VHJlZT4sIENoaWxkPn0gUGFyZW50XG4gKiAgIENvbGxlY3Qgbm9kZXMgaW4gYFRyZWVgIHRoYXQgY2FuIGJlIHBhcmVudHMgb2YgYENoaWxkYC5cbiAqIEB0ZW1wbGF0ZSB7VW5pc3ROb2RlfSBUcmVlXG4gKiAgIEFsbCBub2RlIHR5cGVzIGluIGEgdHJlZS5cbiAqIEB0ZW1wbGF0ZSB7VW5pc3ROb2RlfSBDaGlsZFxuICogICBOb2RlIHRvIHNlYXJjaCBmb3IuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KFxuICogICBEZXB0aCBleHRlbmRzIE1heFxuICogICA/IG5ldmVyXG4gKiAgIDpcbiAqICAgICB8IEludGVybmFsUGFyZW50PE5vZGUsIENoaWxkPlxuICogICAgIHwgSW50ZXJuYWxBbmNlc3RvcjxOb2RlLCBJbnRlcm5hbFBhcmVudDxOb2RlLCBDaGlsZD4sIE1heCwgSW5jcmVtZW50PERlcHRoPj5cbiAqICl9IEludGVybmFsQW5jZXN0b3JcbiAqICAgQ29sbGVjdCBub2RlcyBpbiBgVHJlZWAgdGhhdCBjYW4gYmUgYW5jZXN0b3JzIG9mIGBDaGlsZGAuXG4gKiBAdGVtcGxhdGUge1VuaXN0Tm9kZX0gTm9kZVxuICogICBBbGwgbm9kZSB0eXBlcyBpbiBhIHRyZWUuXG4gKiBAdGVtcGxhdGUge1VuaXN0Tm9kZX0gQ2hpbGRcbiAqICAgTm9kZSB0byBzZWFyY2ggZm9yLlxuICogQHRlbXBsYXRlIHtVaW50fSBbTWF4PTEwXVxuICogICBNYXg7IHNlYXJjaGVzIHVwIHRvIHRoaXMgZGVwdGguXG4gKiBAdGVtcGxhdGUge1VpbnR9IFtEZXB0aD0wXVxuICogICBDdXJyZW50IGRlcHRoLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge0ludGVybmFsQW5jZXN0b3I8SW5jbHVzaXZlRGVzY2VuZGFudDxUcmVlPiwgQ2hpbGQ+fSBBbmNlc3RvclxuICogICBDb2xsZWN0IG5vZGVzIGluIGBUcmVlYCB0aGF0IGNhbiBiZSBhbmNlc3RvcnMgb2YgYENoaWxkYC5cbiAqIEB0ZW1wbGF0ZSB7VW5pc3ROb2RlfSBUcmVlXG4gKiAgIEFsbCBub2RlIHR5cGVzIGluIGEgdHJlZS5cbiAqIEB0ZW1wbGF0ZSB7VW5pc3ROb2RlfSBDaGlsZFxuICogICBOb2RlIHRvIHNlYXJjaCBmb3IuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KFxuICogICBUcmVlIGV4dGVuZHMgVW5pc3RQYXJlbnRcbiAqICAgICA/IERlcHRoIGV4dGVuZHMgTWF4XG4gKiAgICAgICA/IFRyZWVcbiAqICAgICAgIDogVHJlZSB8IEluY2x1c2l2ZURlc2NlbmRhbnQ8VHJlZVsnY2hpbGRyZW4nXVtudW1iZXJdLCBNYXgsIEluY3JlbWVudDxEZXB0aD4+XG4gKiAgICAgOiBUcmVlXG4gKiApfSBJbmNsdXNpdmVEZXNjZW5kYW50XG4gKiAgIENvbGxlY3QgYWxsIChpbmNsdXNpdmUpIGRlc2NlbmRhbnRzIG9mIGBUcmVlYC5cbiAqXG4gKiAgID4gXHVEODNEXHVEQzQ5ICoqTm90ZSoqOiBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgdGhpcyBzZWVtcyB0byBiZSB0aGUgZmFzdGVzdCB3YXkgdG9cbiAqICAgPiByZWN1cnNlIHdpdGhvdXQgYWN0dWFsbHkgcnVubmluZyBpbnRvIGFuIGluZmluaXRlIGxvb3AsIHdoaWNoIHRoZVxuICogICA+IHByZXZpb3VzIHZlcnNpb24gZGlkLlxuICogICA+XG4gKiAgID4gUHJhY3RpY2FsbHksIGEgbWF4IG9mIGAyYCBpcyB0eXBpY2FsbHkgZW5vdWdoIGFzc3VtaW5nIGEgYFJvb3RgIGlzXG4gKiAgID4gcGFzc2VkLCBidXQgaXQgZG9lc25cdTIwMTl0IGltcHJvdmUgcGVyZm9ybWFuY2UuXG4gKiAgID4gSXQgZ2V0cyBoaWdoZXIgd2l0aCBgTGlzdCA+IExpc3RJdGVtID4gVGFibGUgPiBUYWJsZVJvdyA+IFRhYmxlQ2VsbGAuXG4gKiAgID4gVXNpbmcgdXAgdG8gYDEwYCBkb2Vzblx1MjAxOXQgaHVydCBvciBoZWxwIGVpdGhlci5cbiAqIEB0ZW1wbGF0ZSB7VW5pc3ROb2RlfSBUcmVlXG4gKiAgIFRyZWUgdHlwZS5cbiAqIEB0ZW1wbGF0ZSB7VWludH0gW01heD0xMF1cbiAqICAgTWF4OyBzZWFyY2hlcyB1cCB0byB0aGlzIGRlcHRoLlxuICogQHRlbXBsYXRlIHtVaW50fSBbRGVwdGg9MF1cbiAqICAgQ3VycmVudCBkZXB0aC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsnc2tpcCcgfCBib29sZWFufSBBY3Rpb25cbiAqICAgVW5pb24gb2YgdGhlIGFjdGlvbiB0eXBlcy5cbiAqXG4gKiBAdHlwZWRlZiB7bnVtYmVyfSBJbmRleFxuICogICBNb3ZlIHRvIHRoZSBzaWJsaW5nIGF0IGBpbmRleGAgbmV4dCAoYWZ0ZXIgbm9kZSBpdHNlbGYgaXMgY29tcGxldGVseVxuICogICB0cmF2ZXJzZWQpLlxuICpcbiAqICAgVXNlZnVsIGlmIG11dGF0aW5nIHRoZSB0cmVlLCBzdWNoIGFzIHJlbW92aW5nIHRoZSBub2RlIHRoZSB2aXNpdG9yIGlzXG4gKiAgIGN1cnJlbnRseSBvbiwgb3IgYW55IG9mIGl0cyBwcmV2aW91cyBzaWJsaW5ncy5cbiAqICAgUmVzdWx0cyBsZXNzIHRoYW4gMCBvciBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gYGNoaWxkcmVuLmxlbmd0aGAgc3RvcFxuICogICB0cmF2ZXJzaW5nIHRoZSBwYXJlbnQuXG4gKlxuICogQHR5cGVkZWYge1soQWN0aW9uIHwgbnVsbCB8IHVuZGVmaW5lZCB8IHZvaWQpPywgKEluZGV4IHwgbnVsbCB8IHVuZGVmaW5lZCk/XX0gQWN0aW9uVHVwbGVcbiAqICAgTGlzdCB3aXRoIG9uZSBvciB0d28gdmFsdWVzLCB0aGUgZmlyc3QgYW4gYWN0aW9uLCB0aGUgc2Vjb25kIGFuIGluZGV4LlxuICpcbiAqIEB0eXBlZGVmIHtBY3Rpb24gfCBBY3Rpb25UdXBsZSB8IEluZGV4IHwgbnVsbCB8IHVuZGVmaW5lZCB8IHZvaWR9IFZpc2l0b3JSZXN1bHRcbiAqICAgQW55IHZhbHVlIHRoYXQgY2FuIGJlIHJldHVybmVkIGZyb20gYSB2aXNpdG9yLlxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFZpc2l0b3JcbiAqICAgSGFuZGxlIGEgbm9kZSAobWF0Y2hpbmcgYHRlc3RgLCBpZiBnaXZlbikuXG4gKlxuICogICBWaXNpdG9ycyBhcmUgZnJlZSB0byB0cmFuc2Zvcm0gYG5vZGVgLlxuICogICBUaGV5IGNhbiBhbHNvIHRyYW5zZm9ybSB0aGUgcGFyZW50IG9mIG5vZGUgKHRoZSBsYXN0IG9mIGBhbmNlc3RvcnNgKS5cbiAqXG4gKiAgIFJlcGxhY2luZyBgbm9kZWAgaXRzZWxmLCBpZiBgU0tJUGAgaXMgbm90IHJldHVybmVkLCBzdGlsbCBjYXVzZXMgaXRzXG4gKiAgIGRlc2NlbmRhbnRzIHRvIGJlIHdhbGtlZCAod2hpY2ggaXMgYSBidWcpLlxuICpcbiAqICAgV2hlbiBhZGRpbmcgb3IgcmVtb3ZpbmcgcHJldmlvdXMgc2libGluZ3Mgb2YgYG5vZGVgIChvciBuZXh0IHNpYmxpbmdzLCBpblxuICogICBjYXNlIG9mIHJldmVyc2UpLCB0aGUgYFZpc2l0b3JgIHNob3VsZCByZXR1cm4gYSBuZXcgYEluZGV4YCB0byBzcGVjaWZ5IHRoZVxuICogICBzaWJsaW5nIHRvIHRyYXZlcnNlIGFmdGVyIGBub2RlYCBpcyB0cmF2ZXJzZWQuXG4gKiAgIEFkZGluZyBvciByZW1vdmluZyBuZXh0IHNpYmxpbmdzIG9mIGBub2RlYCAob3IgcHJldmlvdXMgc2libGluZ3MsIGluIGNhc2VcbiAqICAgb2YgcmV2ZXJzZSkgaXMgaGFuZGxlZCBhcyBleHBlY3RlZCB3aXRob3V0IG5lZWRpbmcgdG8gcmV0dXJuIGEgbmV3IGBJbmRleGAuXG4gKlxuICogICBSZW1vdmluZyB0aGUgY2hpbGRyZW4gcHJvcGVydHkgb2YgYW4gYW5jZXN0b3Igc3RpbGwgcmVzdWx0cyBpbiB0aGVtIGJlaW5nXG4gKiAgIHRyYXZlcnNlZC5cbiAqIEBwYXJhbSB7VmlzaXRlZH0gbm9kZVxuICogICBGb3VuZCBub2RlLlxuICogQHBhcmFtIHtBcnJheTxWaXNpdGVkUGFyZW50cz59IGFuY2VzdG9yc1xuICogICBBbmNlc3RvcnMgb2YgYG5vZGVgLlxuICogQHJldHVybnMge1Zpc2l0b3JSZXN1bHR9XG4gKiAgIFdoYXQgdG8gZG8gbmV4dC5cbiAqXG4gKiAgIEFuIGBJbmRleGAgaXMgdHJlYXRlZCBhcyBhIHR1cGxlIG9mIGBbQ09OVElOVUUsIEluZGV4XWAuXG4gKiAgIEFuIGBBY3Rpb25gIGlzIHRyZWF0ZWQgYXMgYSB0dXBsZSBvZiBgW0FjdGlvbl1gLlxuICpcbiAqICAgUGFzc2luZyBhIHR1cGxlIGJhY2sgb25seSBtYWtlcyBzZW5zZSBpZiB0aGUgYEFjdGlvbmAgaXMgYFNLSVBgLlxuICogICBXaGVuIHRoZSBgQWN0aW9uYCBpcyBgRVhJVGAsIHRoYXQgYWN0aW9uIGNhbiBiZSByZXR1cm5lZC5cbiAqICAgV2hlbiB0aGUgYEFjdGlvbmAgaXMgYENPTlRJTlVFYCwgYEluZGV4YCBjYW4gYmUgcmV0dXJuZWQuXG4gKiBAdGVtcGxhdGUge1VuaXN0Tm9kZX0gW1Zpc2l0ZWQ9VW5pc3ROb2RlXVxuICogICBWaXNpdGVkIG5vZGUgdHlwZS5cbiAqIEB0ZW1wbGF0ZSB7VW5pc3RQYXJlbnR9IFtWaXNpdGVkUGFyZW50cz1VbmlzdFBhcmVudF1cbiAqICAgQW5jZXN0b3IgdHlwZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtWaXNpdG9yPE1hdGNoZXM8SW5jbHVzaXZlRGVzY2VuZGFudDxUcmVlPiwgQ2hlY2s+LCBBbmNlc3RvcjxUcmVlLCBNYXRjaGVzPEluY2x1c2l2ZURlc2NlbmRhbnQ8VHJlZT4sIENoZWNrPj4+fSBCdWlsZFZpc2l0b3JcbiAqICAgQnVpbGQgYSB0eXBlZCBgVmlzaXRvcmAgZnVuY3Rpb24gZnJvbSBhIHRyZWUgYW5kIGEgdGVzdC5cbiAqXG4gKiAgIEl0IHdpbGwgaW5mZXIgd2hpY2ggdmFsdWVzIGFyZSBwYXNzZWQgYXMgYG5vZGVgIGFuZCB3aGljaCBhcyBgcGFyZW50c2AuXG4gKiBAdGVtcGxhdGUge1VuaXN0Tm9kZX0gW1RyZWU9VW5pc3ROb2RlXVxuICogICBUcmVlIHR5cGUuXG4gKiBAdGVtcGxhdGUge1Rlc3R9IFtDaGVjaz1UZXN0XVxuICogICBUZXN0IHR5cGUuXG4gKi9cblxuaW1wb3J0IHtjb252ZXJ0fSBmcm9tICd1bmlzdC11dGlsLWlzJ1xuaW1wb3J0IHtjb2xvcn0gZnJvbSAndW5pc3QtdXRpbC12aXNpdC1wYXJlbnRzL2RvLW5vdC11c2UtY29sb3InXG5cbi8qKiBAdHlwZSB7UmVhZG9ubHk8QWN0aW9uVHVwbGU+fSAqL1xuY29uc3QgZW1wdHkgPSBbXVxuXG4vKipcbiAqIENvbnRpbnVlIHRyYXZlcnNpbmcgYXMgbm9ybWFsLlxuICovXG5leHBvcnQgY29uc3QgQ09OVElOVUUgPSB0cnVlXG5cbi8qKlxuICogU3RvcCB0cmF2ZXJzaW5nIGltbWVkaWF0ZWx5LlxuICovXG5leHBvcnQgY29uc3QgRVhJVCA9IGZhbHNlXG5cbi8qKlxuICogRG8gbm90IHRyYXZlcnNlIHRoaXMgbm9kZVx1MjAxOXMgY2hpbGRyZW4uXG4gKi9cbmV4cG9ydCBjb25zdCBTS0lQID0gJ3NraXAnXG5cbi8qKlxuICogVmlzaXQgbm9kZXMsIHdpdGggYW5jZXN0cmFsIGluZm9ybWF0aW9uLlxuICpcbiAqIFRoaXMgYWxnb3JpdGhtIHBlcmZvcm1zICpkZXB0aC1maXJzdCogKnRyZWUgdHJhdmVyc2FsKiBpbiAqcHJlb3JkZXIqXG4gKiAoKipOTFIqKikgb3IgaWYgYHJldmVyc2VgIGlzIGdpdmVuLCBpbiAqcmV2ZXJzZSBwcmVvcmRlciogKCoqTlJMKiopLlxuICpcbiAqIFlvdSBjYW4gY2hvb3NlIGZvciB3aGljaCBub2RlcyBgdmlzaXRvcmAgaXMgY2FsbGVkIGJ5IHBhc3NpbmcgYSBgdGVzdGAuXG4gKiBGb3IgY29tcGxleCB0ZXN0cywgeW91IHNob3VsZCB0ZXN0IHlvdXJzZWxmIGluIGB2aXNpdG9yYCwgYXMgaXQgd2lsbCBiZVxuICogZmFzdGVyIGFuZCB3aWxsIGhhdmUgaW1wcm92ZWQgdHlwZSBpbmZvcm1hdGlvbi5cbiAqXG4gKiBXYWxraW5nIHRoZSB0cmVlIGlzIGFuIGludGVuc2l2ZSB0YXNrLlxuICogTWFrZSB1c2Ugb2YgdGhlIHJldHVybiB2YWx1ZXMgb2YgdGhlIHZpc2l0b3Igd2hlbiBwb3NzaWJsZS5cbiAqIEluc3RlYWQgb2Ygd2Fsa2luZyBhIHRyZWUgbXVsdGlwbGUgdGltZXMsIHdhbGsgaXQgb25jZSwgdXNlIGB1bmlzdC11dGlsLWlzYFxuICogdG8gY2hlY2sgaWYgYSBub2RlIG1hdGNoZXMsIGFuZCB0aGVuIHBlcmZvcm0gZGlmZmVyZW50IG9wZXJhdGlvbnMuXG4gKlxuICogWW91IGNhbiBjaGFuZ2UgdGhlIHRyZWUuXG4gKiBTZWUgYFZpc2l0b3JgIGZvciBtb3JlIGluZm8uXG4gKlxuICogQG92ZXJsb2FkXG4gKiBAcGFyYW0ge1RyZWV9IHRyZWVcbiAqIEBwYXJhbSB7Q2hlY2t9IGNoZWNrXG4gKiBAcGFyYW0ge0J1aWxkVmlzaXRvcjxUcmVlLCBDaGVjaz59IHZpc2l0b3JcbiAqIEBwYXJhbSB7Ym9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWR9IFtyZXZlcnNlXVxuICogQHJldHVybnMge3VuZGVmaW5lZH1cbiAqXG4gKiBAb3ZlcmxvYWRcbiAqIEBwYXJhbSB7VHJlZX0gdHJlZVxuICogQHBhcmFtIHtCdWlsZFZpc2l0b3I8VHJlZT59IHZpc2l0b3JcbiAqIEBwYXJhbSB7Ym9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWR9IFtyZXZlcnNlXVxuICogQHJldHVybnMge3VuZGVmaW5lZH1cbiAqXG4gKiBAcGFyYW0ge1VuaXN0Tm9kZX0gdHJlZVxuICogICBUcmVlIHRvIHRyYXZlcnNlLlxuICogQHBhcmFtIHtWaXNpdG9yIHwgVGVzdH0gdGVzdFxuICogICBgdW5pc3QtdXRpbC1pc2AtY29tcGF0aWJsZSB0ZXN0XG4gKiBAcGFyYW0ge1Zpc2l0b3IgfCBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZH0gW3Zpc2l0b3JdXG4gKiAgIEhhbmRsZSBlYWNoIG5vZGUuXG4gKiBAcGFyYW0ge2Jvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkfSBbcmV2ZXJzZV1cbiAqICAgVHJhdmVyc2UgaW4gcmV2ZXJzZSBwcmVvcmRlciAoTlJMKSBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IHByZW9yZGVyIChOTFIpLlxuICogQHJldHVybnMge3VuZGVmaW5lZH1cbiAqICAgTm90aGluZy5cbiAqXG4gKiBAdGVtcGxhdGUge1VuaXN0Tm9kZX0gVHJlZVxuICogICBOb2RlIHR5cGUuXG4gKiBAdGVtcGxhdGUge1Rlc3R9IENoZWNrXG4gKiAgIGB1bmlzdC11dGlsLWlzYC1jb21wYXRpYmxlIHRlc3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2aXNpdFBhcmVudHModHJlZSwgdGVzdCwgdmlzaXRvciwgcmV2ZXJzZSkge1xuICAvKiogQHR5cGUge1Rlc3R9ICovXG4gIGxldCBjaGVja1xuXG4gIGlmICh0eXBlb2YgdGVzdCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgdmlzaXRvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldmVyc2UgPSB2aXNpdG9yXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBubyB2aXNpdG9yIGdpdmVuLCBzbyBgdmlzaXRvcmAgaXMgdGVzdC5cbiAgICB2aXNpdG9yID0gdGVzdFxuICB9IGVsc2Uge1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgdmlzaXRvciBnaXZlbiwgc28gYHRlc3RgIGlzblx1MjAxOXQgYSB2aXNpdG9yLlxuICAgIGNoZWNrID0gdGVzdFxuICB9XG5cbiAgY29uc3QgaXMgPSBjb252ZXJ0KGNoZWNrKVxuICBjb25zdCBzdGVwID0gcmV2ZXJzZSA/IC0xIDogMVxuXG4gIGZhY3RvcnkodHJlZSwgdW5kZWZpbmVkLCBbXSkoKVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1VuaXN0Tm9kZX0gbm9kZVxuICAgKiBAcGFyYW0ge251bWJlciB8IHVuZGVmaW5lZH0gaW5kZXhcbiAgICogQHBhcmFtIHtBcnJheTxVbmlzdFBhcmVudD59IHBhcmVudHNcbiAgICovXG4gIGZ1bmN0aW9uIGZhY3Rvcnkobm9kZSwgaW5kZXgsIHBhcmVudHMpIHtcbiAgICBjb25zdCB2YWx1ZSA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovIChcbiAgICAgIG5vZGUgJiYgdHlwZW9mIG5vZGUgPT09ICdvYmplY3QnID8gbm9kZSA6IHt9XG4gICAgKVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZS50eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc3QgbmFtZSA9XG4gICAgICAgIC8vIGBoYXN0YFxuICAgICAgICB0eXBlb2YgdmFsdWUudGFnTmFtZSA9PT0gJ3N0cmluZydcbiAgICAgICAgICA/IHZhbHVlLnRhZ05hbWVcbiAgICAgICAgICA6IC8vIGB4YXN0YFxuICAgICAgICAgICAgdHlwZW9mIHZhbHVlLm5hbWUgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICA/IHZhbHVlLm5hbWVcbiAgICAgICAgICAgIDogdW5kZWZpbmVkXG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh2aXNpdCwgJ25hbWUnLCB7XG4gICAgICAgIHZhbHVlOlxuICAgICAgICAgICdub2RlICgnICsgY29sb3Iobm9kZS50eXBlICsgKG5hbWUgPyAnPCcgKyBuYW1lICsgJz4nIDogJycpKSArICcpJ1xuICAgICAgfSlcbiAgICB9XG5cbiAgICByZXR1cm4gdmlzaXRcblxuICAgIGZ1bmN0aW9uIHZpc2l0KCkge1xuICAgICAgLyoqIEB0eXBlIHtSZWFkb25seTxBY3Rpb25UdXBsZT59ICovXG4gICAgICBsZXQgcmVzdWx0ID0gZW1wdHlcbiAgICAgIC8qKiBAdHlwZSB7UmVhZG9ubHk8QWN0aW9uVHVwbGU+fSAqL1xuICAgICAgbGV0IHN1YnJlc3VsdFxuICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICBsZXQgb2Zmc2V0XG4gICAgICAvKiogQHR5cGUge0FycmF5PFVuaXN0UGFyZW50Pn0gKi9cbiAgICAgIGxldCBncmFuZHBhcmVudHNcblxuICAgICAgaWYgKCF0ZXN0IHx8IGlzKG5vZGUsIGluZGV4LCBwYXJlbnRzW3BhcmVudHMubGVuZ3RoIC0gMV0gfHwgdW5kZWZpbmVkKSkge1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBgdmlzaXRvcmAgaXMgbm93IGEgdmlzaXRvci5cbiAgICAgICAgcmVzdWx0ID0gdG9SZXN1bHQodmlzaXRvcihub2RlLCBwYXJlbnRzKSlcblxuICAgICAgICBpZiAocmVzdWx0WzBdID09PSBFWElUKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICgnY2hpbGRyZW4nIGluIG5vZGUgJiYgbm9kZS5jaGlsZHJlbikge1xuICAgICAgICBjb25zdCBub2RlQXNQYXJlbnQgPSAvKiogQHR5cGUge1VuaXN0UGFyZW50fSAqLyAobm9kZSlcblxuICAgICAgICBpZiAobm9kZUFzUGFyZW50LmNoaWxkcmVuICYmIHJlc3VsdFswXSAhPT0gU0tJUCkge1xuICAgICAgICAgIG9mZnNldCA9IChyZXZlcnNlID8gbm9kZUFzUGFyZW50LmNoaWxkcmVuLmxlbmd0aCA6IC0xKSArIHN0ZXBcbiAgICAgICAgICBncmFuZHBhcmVudHMgPSBwYXJlbnRzLmNvbmNhdChub2RlQXNQYXJlbnQpXG5cbiAgICAgICAgICB3aGlsZSAob2Zmc2V0ID4gLTEgJiYgb2Zmc2V0IDwgbm9kZUFzUGFyZW50LmNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgY2hpbGQgPSBub2RlQXNQYXJlbnQuY2hpbGRyZW5bb2Zmc2V0XVxuXG4gICAgICAgICAgICBzdWJyZXN1bHQgPSBmYWN0b3J5KGNoaWxkLCBvZmZzZXQsIGdyYW5kcGFyZW50cykoKVxuXG4gICAgICAgICAgICBpZiAoc3VicmVzdWx0WzBdID09PSBFWElUKSB7XG4gICAgICAgICAgICAgIHJldHVybiBzdWJyZXN1bHRcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgb2Zmc2V0ID1cbiAgICAgICAgICAgICAgdHlwZW9mIHN1YnJlc3VsdFsxXSA9PT0gJ251bWJlcicgPyBzdWJyZXN1bHRbMV0gOiBvZmZzZXQgKyBzdGVwXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHRcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBUdXJuIGEgcmV0dXJuIHZhbHVlIGludG8gYSBjbGVhbiByZXN1bHQuXG4gKlxuICogQHBhcmFtIHtWaXNpdG9yUmVzdWx0fSB2YWx1ZVxuICogICBWYWxpZCByZXR1cm4gdmFsdWVzIGZyb20gdmlzaXRvcnMuXG4gKiBAcmV0dXJucyB7UmVhZG9ubHk8QWN0aW9uVHVwbGU+fVxuICogICBDbGVhbiByZXN1bHQuXG4gKi9cbmZ1bmN0aW9uIHRvUmVzdWx0KHZhbHVlKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gW0NPTlRJTlVFLCB2YWx1ZV1cbiAgfVxuXG4gIHJldHVybiB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gZW1wdHkgOiBbdmFsdWVdXG59XG4iLCAiLyoqXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCd1bmlzdCcpLk5vZGV9IFVuaXN0Tm9kZVxuICogQHR5cGVkZWYge2ltcG9ydCgndW5pc3QnKS5QYXJlbnR9IFVuaXN0UGFyZW50XG4gKiBAdHlwZWRlZiB7aW1wb3J0KCd1bmlzdC11dGlsLXZpc2l0LXBhcmVudHMnKS5WaXNpdG9yUmVzdWx0fSBWaXNpdG9yUmVzdWx0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7RXhjbHVkZTxpbXBvcnQoJ3VuaXN0LXV0aWwtaXMnKS5UZXN0LCB1bmRlZmluZWQ+IHwgdW5kZWZpbmVkfSBUZXN0XG4gKiAgIFRlc3QgZnJvbSBgdW5pc3QtdXRpbC1pc2AuXG4gKlxuICogICBOb3RlOiB3ZSBoYXZlIHJlbW92ZSBhbmQgYWRkIGB1bmRlZmluZWRgLCBiZWNhdXNlIG90aGVyd2lzZSB3aGVuIGdlbmVyYXRpbmdcbiAqICAgYXV0b21hdGljIGAuZC50c2AgZmlsZXMsIFRTIHRyaWVzIHRvIGZsYXR0ZW4gcGF0aHMgZnJvbSBhIGxvY2FsIHBlcnNwZWN0aXZlLFxuICogICB3aGljaCBkb2Vzblx1MjAxOXQgd29yayB3aGVuIHB1Ymxpc2hpbmcgb24gbnBtLlxuICovXG5cbi8vIFRvIGRvOiB1c2UgdHlwZXMgZnJvbSBgdW5pc3QtdXRpbC12aXNpdC1wYXJlbnRzYCB3aGVuIGl0XHUyMDE5cyByZWxlYXNlZC5cblxuLyoqXG4gKiBAdHlwZWRlZiB7KFxuICogICBGbiBleHRlbmRzICh2YWx1ZTogYW55KSA9PiB2YWx1ZSBpcyBpbmZlciBUaGluZ1xuICogICA/IFRoaW5nXG4gKiAgIDogRmFsbGJhY2tcbiAqICl9IFByZWRpY2F0ZVxuICogICBHZXQgdGhlIHZhbHVlIG9mIGEgdHlwZSBndWFyZCBgRm5gLlxuICogQHRlbXBsYXRlIEZuXG4gKiAgIFZhbHVlOyB0eXBpY2FsbHkgZnVuY3Rpb24gdGhhdCBpcyBhIHR5cGUgZ3VhcmQgKHN1Y2ggYXMgYCh4KTogeCBpcyBZYCkuXG4gKiBAdGVtcGxhdGUgRmFsbGJhY2tcbiAqICAgVmFsdWUgdG8geWllbGQgaWYgYEZuYCBpcyBub3QgYSB0eXBlIGd1YXJkLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyhcbiAqICAgQ2hlY2sgZXh0ZW5kcyBudWxsIHwgdW5kZWZpbmVkIC8vIE5vIHRlc3QuXG4gKiAgID8gVmFsdWVcbiAqICAgOiBWYWx1ZSBleHRlbmRzIHt0eXBlOiBDaGVja30gLy8gU3RyaW5nICh0eXBlKSB0ZXN0LlxuICogICA/IFZhbHVlXG4gKiAgIDogVmFsdWUgZXh0ZW5kcyBDaGVjayAvLyBQYXJ0aWFsIHRlc3QuXG4gKiAgID8gVmFsdWVcbiAqICAgOiBDaGVjayBleHRlbmRzIEZ1bmN0aW9uIC8vIEZ1bmN0aW9uIHRlc3QuXG4gKiAgID8gUHJlZGljYXRlPENoZWNrLCBWYWx1ZT4gZXh0ZW5kcyBWYWx1ZVxuICogICAgID8gUHJlZGljYXRlPENoZWNrLCBWYWx1ZT5cbiAqICAgICA6IG5ldmVyXG4gKiAgIDogbmV2ZXIgLy8gU29tZSBvdGhlciB0ZXN0P1xuICogKX0gTWF0Y2hlc09uZVxuICogICBDaGVjayB3aGV0aGVyIGEgbm9kZSBtYXRjaGVzIGEgcHJpbWl0aXZlIGNoZWNrIGluIHRoZSB0eXBlIHN5c3RlbS5cbiAqIEB0ZW1wbGF0ZSBWYWx1ZVxuICogICBWYWx1ZTsgdHlwaWNhbGx5IHVuaXN0IGBOb2RlYC5cbiAqIEB0ZW1wbGF0ZSBDaGVja1xuICogICBWYWx1ZTsgdHlwaWNhbGx5IGB1bmlzdC11dGlsLWlzYC1jb21wYXRpYmxlIHRlc3QsIGJ1dCBub3QgYXJyYXlzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyhcbiAqICAgQ2hlY2sgZXh0ZW5kcyBBcnJheTxhbnk+XG4gKiAgID8gTWF0Y2hlc09uZTxWYWx1ZSwgQ2hlY2tba2V5b2YgQ2hlY2tdPlxuICogICA6IE1hdGNoZXNPbmU8VmFsdWUsIENoZWNrPlxuICogKX0gTWF0Y2hlc1xuICogICBDaGVjayB3aGV0aGVyIGEgbm9kZSBtYXRjaGVzIGEgY2hlY2sgaW4gdGhlIHR5cGUgc3lzdGVtLlxuICogQHRlbXBsYXRlIFZhbHVlXG4gKiAgIFZhbHVlOyB0eXBpY2FsbHkgdW5pc3QgYE5vZGVgLlxuICogQHRlbXBsYXRlIENoZWNrXG4gKiAgIFZhbHVlOyB0eXBpY2FsbHkgYHVuaXN0LXV0aWwtaXNgLWNvbXBhdGlibGUgdGVzdC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHswIHwgMSB8IDIgfCAzIHwgNCB8IDUgfCA2IHwgNyB8IDggfCA5IHwgMTB9IFVpbnRcbiAqICAgTnVtYmVyOyBjYXBwZWQgcmVhc29uYWJseS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtJIGV4dGVuZHMgMCA/IDEgOiBJIGV4dGVuZHMgMSA/IDIgOiBJIGV4dGVuZHMgMiA/IDMgOiBJIGV4dGVuZHMgMyA/IDQgOiBJIGV4dGVuZHMgNCA/IDUgOiBJIGV4dGVuZHMgNSA/IDYgOiBJIGV4dGVuZHMgNiA/IDcgOiBJIGV4dGVuZHMgNyA/IDggOiBJIGV4dGVuZHMgOCA/IDkgOiAxMH0gSW5jcmVtZW50XG4gKiAgIEluY3JlbWVudCBhIG51bWJlciBpbiB0aGUgdHlwZSBzeXN0ZW0uXG4gKiBAdGVtcGxhdGUge1VpbnR9IFtJPTBdXG4gKiAgIEluZGV4LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyhcbiAqICAgTm9kZSBleHRlbmRzIFVuaXN0UGFyZW50XG4gKiAgID8gTm9kZSBleHRlbmRzIHtjaGlsZHJlbjogQXJyYXk8aW5mZXIgQ2hpbGRyZW4+fVxuICogICAgID8gQ2hpbGQgZXh0ZW5kcyBDaGlsZHJlbiA/IE5vZGUgOiBuZXZlclxuICogICAgIDogbmV2ZXJcbiAqICAgOiBuZXZlclxuICogKX0gSW50ZXJuYWxQYXJlbnRcbiAqICAgQ29sbGVjdCBub2RlcyB0aGF0IGNhbiBiZSBwYXJlbnRzIG9mIGBDaGlsZGAuXG4gKiBAdGVtcGxhdGUge1VuaXN0Tm9kZX0gTm9kZVxuICogICBBbGwgbm9kZSB0eXBlcyBpbiBhIHRyZWUuXG4gKiBAdGVtcGxhdGUge1VuaXN0Tm9kZX0gQ2hpbGRcbiAqICAgTm9kZSB0byBzZWFyY2ggZm9yLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge0ludGVybmFsUGFyZW50PEluY2x1c2l2ZURlc2NlbmRhbnQ8VHJlZT4sIENoaWxkPn0gUGFyZW50XG4gKiAgIENvbGxlY3Qgbm9kZXMgaW4gYFRyZWVgIHRoYXQgY2FuIGJlIHBhcmVudHMgb2YgYENoaWxkYC5cbiAqIEB0ZW1wbGF0ZSB7VW5pc3ROb2RlfSBUcmVlXG4gKiAgIEFsbCBub2RlIHR5cGVzIGluIGEgdHJlZS5cbiAqIEB0ZW1wbGF0ZSB7VW5pc3ROb2RlfSBDaGlsZFxuICogICBOb2RlIHRvIHNlYXJjaCBmb3IuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KFxuICogICBEZXB0aCBleHRlbmRzIE1heFxuICogICA/IG5ldmVyXG4gKiAgIDpcbiAqICAgICB8IEludGVybmFsUGFyZW50PE5vZGUsIENoaWxkPlxuICogICAgIHwgSW50ZXJuYWxBbmNlc3RvcjxOb2RlLCBJbnRlcm5hbFBhcmVudDxOb2RlLCBDaGlsZD4sIE1heCwgSW5jcmVtZW50PERlcHRoPj5cbiAqICl9IEludGVybmFsQW5jZXN0b3JcbiAqICAgQ29sbGVjdCBub2RlcyBpbiBgVHJlZWAgdGhhdCBjYW4gYmUgYW5jZXN0b3JzIG9mIGBDaGlsZGAuXG4gKiBAdGVtcGxhdGUge1VuaXN0Tm9kZX0gTm9kZVxuICogICBBbGwgbm9kZSB0eXBlcyBpbiBhIHRyZWUuXG4gKiBAdGVtcGxhdGUge1VuaXN0Tm9kZX0gQ2hpbGRcbiAqICAgTm9kZSB0byBzZWFyY2ggZm9yLlxuICogQHRlbXBsYXRlIHtVaW50fSBbTWF4PTEwXVxuICogICBNYXg7IHNlYXJjaGVzIHVwIHRvIHRoaXMgZGVwdGguXG4gKiBAdGVtcGxhdGUge1VpbnR9IFtEZXB0aD0wXVxuICogICBDdXJyZW50IGRlcHRoLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyhcbiAqICAgVHJlZSBleHRlbmRzIFVuaXN0UGFyZW50XG4gKiAgICAgPyBEZXB0aCBleHRlbmRzIE1heFxuICogICAgICAgPyBUcmVlXG4gKiAgICAgICA6IFRyZWUgfCBJbmNsdXNpdmVEZXNjZW5kYW50PFRyZWVbJ2NoaWxkcmVuJ11bbnVtYmVyXSwgTWF4LCBJbmNyZW1lbnQ8RGVwdGg+PlxuICogICAgIDogVHJlZVxuICogKX0gSW5jbHVzaXZlRGVzY2VuZGFudFxuICogICBDb2xsZWN0IGFsbCAoaW5jbHVzaXZlKSBkZXNjZW5kYW50cyBvZiBgVHJlZWAuXG4gKlxuICogICA+IFx1RDgzRFx1REM0OSAqKk5vdGUqKjogZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIHRoaXMgc2VlbXMgdG8gYmUgdGhlIGZhc3Rlc3Qgd2F5IHRvXG4gKiAgID4gcmVjdXJzZSB3aXRob3V0IGFjdHVhbGx5IHJ1bm5pbmcgaW50byBhbiBpbmZpbml0ZSBsb29wLCB3aGljaCB0aGVcbiAqICAgPiBwcmV2aW91cyB2ZXJzaW9uIGRpZC5cbiAqICAgPlxuICogICA+IFByYWN0aWNhbGx5LCBhIG1heCBvZiBgMmAgaXMgdHlwaWNhbGx5IGVub3VnaCBhc3N1bWluZyBhIGBSb290YCBpc1xuICogICA+IHBhc3NlZCwgYnV0IGl0IGRvZXNuXHUyMDE5dCBpbXByb3ZlIHBlcmZvcm1hbmNlLlxuICogICA+IEl0IGdldHMgaGlnaGVyIHdpdGggYExpc3QgPiBMaXN0SXRlbSA+IFRhYmxlID4gVGFibGVSb3cgPiBUYWJsZUNlbGxgLlxuICogICA+IFVzaW5nIHVwIHRvIGAxMGAgZG9lc25cdTIwMTl0IGh1cnQgb3IgaGVscCBlaXRoZXIuXG4gKiBAdGVtcGxhdGUge1VuaXN0Tm9kZX0gVHJlZVxuICogICBUcmVlIHR5cGUuXG4gKiBAdGVtcGxhdGUge1VpbnR9IFtNYXg9MTBdXG4gKiAgIE1heDsgc2VhcmNoZXMgdXAgdG8gdGhpcyBkZXB0aC5cbiAqIEB0ZW1wbGF0ZSB7VWludH0gW0RlcHRoPTBdXG4gKiAgIEN1cnJlbnQgZGVwdGguXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgVmlzaXRvclxuICogICBIYW5kbGUgYSBub2RlIChtYXRjaGluZyBgdGVzdGAsIGlmIGdpdmVuKS5cbiAqXG4gKiAgIFZpc2l0b3JzIGFyZSBmcmVlIHRvIHRyYW5zZm9ybSBgbm9kZWAuXG4gKiAgIFRoZXkgY2FuIGFsc28gdHJhbnNmb3JtIGBwYXJlbnRgLlxuICpcbiAqICAgUmVwbGFjaW5nIGBub2RlYCBpdHNlbGYsIGlmIGBTS0lQYCBpcyBub3QgcmV0dXJuZWQsIHN0aWxsIGNhdXNlcyBpdHNcbiAqICAgZGVzY2VuZGFudHMgdG8gYmUgd2Fsa2VkICh3aGljaCBpcyBhIGJ1ZykuXG4gKlxuICogICBXaGVuIGFkZGluZyBvciByZW1vdmluZyBwcmV2aW91cyBzaWJsaW5ncyBvZiBgbm9kZWAgKG9yIG5leHQgc2libGluZ3MsIGluXG4gKiAgIGNhc2Ugb2YgcmV2ZXJzZSksIHRoZSBgVmlzaXRvcmAgc2hvdWxkIHJldHVybiBhIG5ldyBgSW5kZXhgIHRvIHNwZWNpZnkgdGhlXG4gKiAgIHNpYmxpbmcgdG8gdHJhdmVyc2UgYWZ0ZXIgYG5vZGVgIGlzIHRyYXZlcnNlZC5cbiAqICAgQWRkaW5nIG9yIHJlbW92aW5nIG5leHQgc2libGluZ3Mgb2YgYG5vZGVgIChvciBwcmV2aW91cyBzaWJsaW5ncywgaW4gY2FzZVxuICogICBvZiByZXZlcnNlKSBpcyBoYW5kbGVkIGFzIGV4cGVjdGVkIHdpdGhvdXQgbmVlZGluZyB0byByZXR1cm4gYSBuZXcgYEluZGV4YC5cbiAqXG4gKiAgIFJlbW92aW5nIHRoZSBjaGlsZHJlbiBwcm9wZXJ0eSBvZiBgcGFyZW50YCBzdGlsbCByZXN1bHRzIGluIHRoZW0gYmVpbmdcbiAqICAgdHJhdmVyc2VkLlxuICogQHBhcmFtIHtWaXNpdGVkfSBub2RlXG4gKiAgIEZvdW5kIG5vZGUuXG4gKiBAcGFyYW0ge1Zpc2l0ZWQgZXh0ZW5kcyBVbmlzdE5vZGUgPyBudW1iZXIgfCB1bmRlZmluZWQgOiBuZXZlcn0gaW5kZXhcbiAqICAgSW5kZXggb2YgYG5vZGVgIGluIGBwYXJlbnRgLlxuICogQHBhcmFtIHtBbmNlc3RvciBleHRlbmRzIFVuaXN0UGFyZW50ID8gQW5jZXN0b3IgfCB1bmRlZmluZWQgOiBuZXZlcn0gcGFyZW50XG4gKiAgIFBhcmVudCBvZiBgbm9kZWAuXG4gKiBAcmV0dXJucyB7VmlzaXRvclJlc3VsdH1cbiAqICAgV2hhdCB0byBkbyBuZXh0LlxuICpcbiAqICAgQW4gYEluZGV4YCBpcyB0cmVhdGVkIGFzIGEgdHVwbGUgb2YgYFtDT05USU5VRSwgSW5kZXhdYC5cbiAqICAgQW4gYEFjdGlvbmAgaXMgdHJlYXRlZCBhcyBhIHR1cGxlIG9mIGBbQWN0aW9uXWAuXG4gKlxuICogICBQYXNzaW5nIGEgdHVwbGUgYmFjayBvbmx5IG1ha2VzIHNlbnNlIGlmIHRoZSBgQWN0aW9uYCBpcyBgU0tJUGAuXG4gKiAgIFdoZW4gdGhlIGBBY3Rpb25gIGlzIGBFWElUYCwgdGhhdCBhY3Rpb24gY2FuIGJlIHJldHVybmVkLlxuICogICBXaGVuIHRoZSBgQWN0aW9uYCBpcyBgQ09OVElOVUVgLCBgSW5kZXhgIGNhbiBiZSByZXR1cm5lZC5cbiAqIEB0ZW1wbGF0ZSB7VW5pc3ROb2RlfSBbVmlzaXRlZD1VbmlzdE5vZGVdXG4gKiAgIFZpc2l0ZWQgbm9kZSB0eXBlLlxuICogQHRlbXBsYXRlIHtVbmlzdFBhcmVudH0gW0FuY2VzdG9yPVVuaXN0UGFyZW50XVxuICogICBBbmNlc3RvciB0eXBlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1Zpc2l0b3I8VmlzaXRlZCwgUGFyZW50PEFuY2VzdG9yLCBWaXNpdGVkPj59IEJ1aWxkVmlzaXRvckZyb21NYXRjaFxuICogICBCdWlsZCBhIHR5cGVkIGBWaXNpdG9yYCBmdW5jdGlvbiBmcm9tIGEgbm9kZSBhbmQgYWxsIHBvc3NpYmxlIHBhcmVudHMuXG4gKlxuICogICBJdCB3aWxsIGluZmVyIHdoaWNoIHZhbHVlcyBhcmUgcGFzc2VkIGFzIGBub2RlYCBhbmQgd2hpY2ggYXMgYHBhcmVudGAuXG4gKiBAdGVtcGxhdGUge1VuaXN0Tm9kZX0gVmlzaXRlZFxuICogICBOb2RlIHR5cGUuXG4gKiBAdGVtcGxhdGUge1VuaXN0UGFyZW50fSBBbmNlc3RvclxuICogICBQYXJlbnQgdHlwZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoXG4gKiAgIEJ1aWxkVmlzaXRvckZyb21NYXRjaDxcbiAqICAgICBNYXRjaGVzPERlc2NlbmRhbnQsIENoZWNrPixcbiAqICAgICBFeHRyYWN0PERlc2NlbmRhbnQsIFVuaXN0UGFyZW50PlxuICogICA+XG4gKiApfSBCdWlsZFZpc2l0b3JGcm9tRGVzY2VuZGFudHNcbiAqICAgQnVpbGQgYSB0eXBlZCBgVmlzaXRvcmAgZnVuY3Rpb24gZnJvbSBhIGxpc3Qgb2YgZGVzY2VuZGFudHMgYW5kIGEgdGVzdC5cbiAqXG4gKiAgIEl0IHdpbGwgaW5mZXIgd2hpY2ggdmFsdWVzIGFyZSBwYXNzZWQgYXMgYG5vZGVgIGFuZCB3aGljaCBhcyBgcGFyZW50YC5cbiAqIEB0ZW1wbGF0ZSB7VW5pc3ROb2RlfSBEZXNjZW5kYW50XG4gKiAgIE5vZGUgdHlwZS5cbiAqIEB0ZW1wbGF0ZSB7VGVzdH0gQ2hlY2tcbiAqICAgVGVzdCB0eXBlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyhcbiAqICAgQnVpbGRWaXNpdG9yRnJvbURlc2NlbmRhbnRzPFxuICogICAgIEluY2x1c2l2ZURlc2NlbmRhbnQ8VHJlZT4sXG4gKiAgICAgQ2hlY2tcbiAqICAgPlxuICogKX0gQnVpbGRWaXNpdG9yXG4gKiAgIEJ1aWxkIGEgdHlwZWQgYFZpc2l0b3JgIGZ1bmN0aW9uIGZyb20gYSB0cmVlIGFuZCBhIHRlc3QuXG4gKlxuICogICBJdCB3aWxsIGluZmVyIHdoaWNoIHZhbHVlcyBhcmUgcGFzc2VkIGFzIGBub2RlYCBhbmQgd2hpY2ggYXMgYHBhcmVudGAuXG4gKiBAdGVtcGxhdGUge1VuaXN0Tm9kZX0gW1RyZWU9VW5pc3ROb2RlXVxuICogICBOb2RlIHR5cGUuXG4gKiBAdGVtcGxhdGUge1Rlc3R9IFtDaGVjaz1UZXN0XVxuICogICBUZXN0IHR5cGUuXG4gKi9cblxuaW1wb3J0IHt2aXNpdFBhcmVudHN9IGZyb20gJ3VuaXN0LXV0aWwtdmlzaXQtcGFyZW50cydcblxuZXhwb3J0IHtDT05USU5VRSwgRVhJVCwgU0tJUH0gZnJvbSAndW5pc3QtdXRpbC12aXNpdC1wYXJlbnRzJ1xuXG4vKipcbiAqIFZpc2l0IG5vZGVzLlxuICpcbiAqIFRoaXMgYWxnb3JpdGhtIHBlcmZvcm1zICpkZXB0aC1maXJzdCogKnRyZWUgdHJhdmVyc2FsKiBpbiAqcHJlb3JkZXIqXG4gKiAoKipOTFIqKikgb3IgaWYgYHJldmVyc2VgIGlzIGdpdmVuLCBpbiAqcmV2ZXJzZSBwcmVvcmRlciogKCoqTlJMKiopLlxuICpcbiAqIFlvdSBjYW4gY2hvb3NlIGZvciB3aGljaCBub2RlcyBgdmlzaXRvcmAgaXMgY2FsbGVkIGJ5IHBhc3NpbmcgYSBgdGVzdGAuXG4gKiBGb3IgY29tcGxleCB0ZXN0cywgeW91IHNob3VsZCB0ZXN0IHlvdXJzZWxmIGluIGB2aXNpdG9yYCwgYXMgaXQgd2lsbCBiZVxuICogZmFzdGVyIGFuZCB3aWxsIGhhdmUgaW1wcm92ZWQgdHlwZSBpbmZvcm1hdGlvbi5cbiAqXG4gKiBXYWxraW5nIHRoZSB0cmVlIGlzIGFuIGludGVuc2l2ZSB0YXNrLlxuICogTWFrZSB1c2Ugb2YgdGhlIHJldHVybiB2YWx1ZXMgb2YgdGhlIHZpc2l0b3Igd2hlbiBwb3NzaWJsZS5cbiAqIEluc3RlYWQgb2Ygd2Fsa2luZyBhIHRyZWUgbXVsdGlwbGUgdGltZXMsIHdhbGsgaXQgb25jZSwgdXNlIGB1bmlzdC11dGlsLWlzYFxuICogdG8gY2hlY2sgaWYgYSBub2RlIG1hdGNoZXMsIGFuZCB0aGVuIHBlcmZvcm0gZGlmZmVyZW50IG9wZXJhdGlvbnMuXG4gKlxuICogWW91IGNhbiBjaGFuZ2UgdGhlIHRyZWUuXG4gKiBTZWUgYFZpc2l0b3JgIGZvciBtb3JlIGluZm8uXG4gKlxuICogQG92ZXJsb2FkXG4gKiBAcGFyYW0ge1RyZWV9IHRyZWVcbiAqIEBwYXJhbSB7Q2hlY2t9IGNoZWNrXG4gKiBAcGFyYW0ge0J1aWxkVmlzaXRvcjxUcmVlLCBDaGVjaz59IHZpc2l0b3JcbiAqIEBwYXJhbSB7Ym9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWR9IFtyZXZlcnNlXVxuICogQHJldHVybnMge3VuZGVmaW5lZH1cbiAqXG4gKiBAb3ZlcmxvYWRcbiAqIEBwYXJhbSB7VHJlZX0gdHJlZVxuICogQHBhcmFtIHtCdWlsZFZpc2l0b3I8VHJlZT59IHZpc2l0b3JcbiAqIEBwYXJhbSB7Ym9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWR9IFtyZXZlcnNlXVxuICogQHJldHVybnMge3VuZGVmaW5lZH1cbiAqXG4gKiBAcGFyYW0ge1VuaXN0Tm9kZX0gdHJlZVxuICogICBUcmVlIHRvIHRyYXZlcnNlLlxuICogQHBhcmFtIHtWaXNpdG9yIHwgVGVzdH0gdGVzdE9yVmlzaXRvclxuICogICBgdW5pc3QtdXRpbC1pc2AtY29tcGF0aWJsZSB0ZXN0IChvcHRpb25hbCwgb21pdCB0byBwYXNzIGEgdmlzaXRvcikuXG4gKiBAcGFyYW0ge1Zpc2l0b3IgfCBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZH0gW3Zpc2l0b3JPclJldmVyc2VdXG4gKiAgIEhhbmRsZSBlYWNoIG5vZGUgKHdoZW4gdGVzdCBpcyBvbWl0dGVkLCBwYXNzIGByZXZlcnNlYCkuXG4gKiBAcGFyYW0ge2Jvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkfSBbbWF5YmVSZXZlcnNlPWZhbHNlXVxuICogICBUcmF2ZXJzZSBpbiByZXZlcnNlIHByZW9yZGVyIChOUkwpIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgcHJlb3JkZXIgKE5MUikuXG4gKiBAcmV0dXJucyB7dW5kZWZpbmVkfVxuICogICBOb3RoaW5nLlxuICpcbiAqIEB0ZW1wbGF0ZSB7VW5pc3ROb2RlfSBUcmVlXG4gKiAgIE5vZGUgdHlwZS5cbiAqIEB0ZW1wbGF0ZSB7VGVzdH0gQ2hlY2tcbiAqICAgYHVuaXN0LXV0aWwtaXNgLWNvbXBhdGlibGUgdGVzdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZpc2l0KHRyZWUsIHRlc3RPclZpc2l0b3IsIHZpc2l0b3JPclJldmVyc2UsIG1heWJlUmV2ZXJzZSkge1xuICAvKiogQHR5cGUge2Jvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkfSAqL1xuICBsZXQgcmV2ZXJzZVxuICAvKiogQHR5cGUge1Rlc3R9ICovXG4gIGxldCB0ZXN0XG4gIC8qKiBAdHlwZSB7VmlzaXRvcn0gKi9cbiAgbGV0IHZpc2l0b3JcblxuICBpZiAoXG4gICAgdHlwZW9mIHRlc3RPclZpc2l0b3IgPT09ICdmdW5jdGlvbicgJiZcbiAgICB0eXBlb2YgdmlzaXRvck9yUmV2ZXJzZSAhPT0gJ2Z1bmN0aW9uJ1xuICApIHtcbiAgICB0ZXN0ID0gdW5kZWZpbmVkXG4gICAgdmlzaXRvciA9IHRlc3RPclZpc2l0b3JcbiAgICByZXZlcnNlID0gdmlzaXRvck9yUmV2ZXJzZVxuICB9IGVsc2Uge1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IGFzc3VtZSB0aGUgb3ZlcmxvYWQgd2l0aCB0ZXN0IHdhcyBnaXZlbi5cbiAgICB0ZXN0ID0gdGVzdE9yVmlzaXRvclxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IGFzc3VtZSB0aGUgb3ZlcmxvYWQgd2l0aCB0ZXN0IHdhcyBnaXZlbi5cbiAgICB2aXNpdG9yID0gdmlzaXRvck9yUmV2ZXJzZVxuICAgIHJldmVyc2UgPSBtYXliZVJldmVyc2VcbiAgfVxuXG4gIHZpc2l0UGFyZW50cyh0cmVlLCB0ZXN0LCBvdmVybG9hZCwgcmV2ZXJzZSlcblxuICAvKipcbiAgICogQHBhcmFtIHtVbmlzdE5vZGV9IG5vZGVcbiAgICogQHBhcmFtIHtBcnJheTxVbmlzdFBhcmVudD59IHBhcmVudHNcbiAgICovXG4gIGZ1bmN0aW9uIG92ZXJsb2FkKG5vZGUsIHBhcmVudHMpIHtcbiAgICBjb25zdCBwYXJlbnQgPSBwYXJlbnRzW3BhcmVudHMubGVuZ3RoIC0gMV1cbiAgICBjb25zdCBpbmRleCA9IHBhcmVudCA/IHBhcmVudC5jaGlsZHJlbi5pbmRleE9mKG5vZGUpIDogdW5kZWZpbmVkXG4gICAgcmV0dXJuIHZpc2l0b3Iobm9kZSwgaW5kZXgsIHBhcmVudClcbiAgfVxufVxuIiwgImltcG9ydCB7IFJvb3QsIEVsZW1lbnQsIFRleHQgfSBmcm9tICdoYXN0JztcbmltcG9ydCB7IGNyZWF0ZVNhbml0aXplU2NoZW1hIH0gZnJvbSAnLi4vdXRpbHMvY3JlYXRlU2FuaXRpemVTY2hlbWEnO1xuaW1wb3J0IHsgdmlzaXQgfSBmcm9tICd1bmlzdC11dGlsLXZpc2l0JztcbmV4cG9ydCBjb25zdCByZWh5cGVDb252ZXJ0QWJub3JtYWxUYWdzVG9UZXh0ID0gKGN1c3RvbVRhZ3M6IHN0cmluZ1tdID0gW10pID0+IHtcbiAgcmV0dXJuICh0cmVlOiBSb290KSA9PiB7XG4gICAgLy8gR2V0IGFsbCBhbGxvd2VkIHRhZyBuYW1lcyAoSFRNTCArIE1hdGhNTCArIGN1c3RvbVRhZ3MpXG4gICAgY29uc3Qgc2NoZW1hID0gY3JlYXRlU2FuaXRpemVTY2hlbWEoY3VzdG9tVGFncyk7XG4gICAgY29uc3QgYWxsb3dlZFRhZ05hbWVzID0gbmV3IFNldChzY2hlbWEudGFnTmFtZXMgfHwgW10pO1xuXG4gICAgdmlzaXQodHJlZSwgJ2VsZW1lbnQnLCAobm9kZSwgaW5kZXgsIHBhcmVudCkgPT4ge1xuICAgICAgaWYgKCFwYXJlbnQgfHwgaW5kZXggPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCB0YWdOYW1lID0gKG5vZGUgYXMgRWxlbWVudCkudGFnTmFtZTtcblxuICAgICAgLy8gQ2hlY2sgd2hldGhlciBpdCdzIGFuIGFibm9ybWFsIHRhZzpcbiAgICAgIC8vIDEuIE5vdCBpbiB0aGUgYWxsb3dlZCB0YWcgbGlzdFxuICAgICAgLy8gMi4gQW5kIGNvbnRhaW5zIGNoYXJhY3RlcnMgb3RoZXIgdGhhbiBFbmdsaXNoIGxldHRlcnNcbiAgICAgIGNvbnN0IGlzQWJub3JtYWxUYWcgPSAhYWxsb3dlZFRhZ05hbWVzLmhhcyh0YWdOYW1lKSAmJiAvW15hLXpBLVpdLy50ZXN0KHRhZ05hbWUpO1xuXG4gICAgICBpZiAoaXNBYm5vcm1hbFRhZykge1xuICAgICAgICAvLyBSZWJ1aWxkIHRoZSBvcmlnaW5hbCB0YWcgc3RyaW5nXG4gICAgICAgIGxldCB0YWdTdHJpbmcgPSBgPCR7dGFnTmFtZX1gO1xuXG4gICAgICAgIC8vIEFwcGVuZCBhdHRyaWJ1dGVzXG4gICAgICAgIGlmICgobm9kZSBhcyBFbGVtZW50KS5wcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoKG5vZGUgYXMgRWxlbWVudCkucHJvcGVydGllcykpIHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICB0YWdTdHJpbmcgKz0gYCAke2tleX09XCIke3ZhbHVlLmpvaW4oJyAnKX1cImA7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgdGFnU3RyaW5nICs9IGAgJHtrZXl9PVwiJHt2YWx1ZX1cImA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSGFuZGxlIGNoaWxkIGNvbnRlbnRcbiAgICAgICAgbGV0IGlubmVyQ29udGVudCA9ICcnO1xuICAgICAgICBpZiAoKG5vZGUgYXMgRWxlbWVudCkuY2hpbGRyZW4gJiYgKG5vZGUgYXMgRWxlbWVudCkuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgIC8vIFJlY3Vyc2l2ZWx5IHByb2Nlc3MgY2hpbGQgbm9kZXNcbiAgICAgICAgICBjb25zdCBwcm9jZXNzQ2hpbGRyZW4gPSAoY2hpbGRyZW46IEFycmF5PEVsZW1lbnQgfCBUZXh0Pik6IHN0cmluZyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gY2hpbGRyZW5cbiAgICAgICAgICAgICAgLm1hcCgoY2hpbGQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGQudHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gKGNoaWxkIGFzIFRleHQpLnZhbHVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hpbGQudHlwZSA9PT0gJ2VsZW1lbnQnKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50Q2hpbGQgPSBjaGlsZCBhcyBFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgbGV0IGNoaWxkVGFnID0gYDwke2VsZW1lbnRDaGlsZC50YWdOYW1lfWA7XG4gICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudENoaWxkLnByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZWxlbWVudENoaWxkLnByb3BlcnRpZXMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZFRhZyArPSBgICR7a2V5fT1cIiR7dmFsdWUuam9pbignICcpfVwiYDtcbiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkVGFnICs9IGAgJHtrZXl9PVwiJHt2YWx1ZX1cImA7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBjaGlsZFRhZyArPSAnPic7XG4gICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudENoaWxkLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkVGFnICs9IHByb2Nlc3NDaGlsZHJlbihlbGVtZW50Q2hpbGQuY2hpbGRyZW4gYXMgQXJyYXk8RWxlbWVudCB8IFRleHQ+KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGNoaWxkVGFnICs9IGA8LyR7ZWxlbWVudENoaWxkLnRhZ05hbWV9PmA7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGRUYWc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgLmpvaW4oJycpO1xuICAgICAgICAgIH07XG4gICAgICAgICAgaW5uZXJDb250ZW50ID0gcHJvY2Vzc0NoaWxkcmVuKChub2RlIGFzIEVsZW1lbnQpLmNoaWxkcmVuIGFzIEFycmF5PEVsZW1lbnQgfCBUZXh0Pik7XG4gICAgICAgIH1cblxuICAgICAgICB0YWdTdHJpbmcgKz0gYD4ke2lubmVyQ29udGVudH08LyR7dGFnTmFtZX0+YDtcblxuICAgICAgICAvLyBDcmVhdGUgYSB0ZXh0IG5vZGUgdG8gcmVwbGFjZSB0aGUgYWJub3JtYWwgdGFnXG4gICAgICAgIGNvbnN0IHRleHROb2RlOiBUZXh0ID0ge1xuICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICB2YWx1ZTogdGFnU3RyaW5nLFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFJlcGxhY2Ugbm9kZVxuICAgICAgICBwYXJlbnQuY2hpbGRyZW5baW5kZXhdID0gdGV4dE5vZGU7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG59O1xuIiwgImNvbnN0IE1BVEhfSkFYRk9OVF9VUkwgPSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9tYXRoamF4QDMvZXM1L291dHB1dC9jaHRtbC9mb250cy93b2ZmLXYyJztcbmV4cG9ydCBjb25zdCBERUZBVUxUX01BVEhKQVhfQ09ORklHID0ge1xuICBjaHRtbDoge1xuICAgIGZvbnRVUkw6IE1BVEhfSkFYRk9OVF9VUkwsXG4gIH0sXG59O1xuIiwgImltcG9ydCB0eXBlIHsgUHJvY2Vzc29yIH0gZnJvbSAndW5pZmllZCc7XG5cbmNvbnN0IGNvdW50UHJlY2VkaW5nQmFja3NsYXNoZXMgPSAoaW5wdXQ6IHN0cmluZywgaW5kZXg6IG51bWJlcik6IG51bWJlciA9PiB7XG4gIGxldCBjb3VudCA9IDA7XG4gIGZvciAobGV0IGkgPSBpbmRleCAtIDE7IGkgPj0gMCAmJiBpbnB1dFtpXSA9PT0gJ1xcXFwnOyBpLS0pIGNvdW50Kys7XG4gIHJldHVybiBjb3VudDtcbn07XG5cbmNvbnN0IGlzVW5lc2NhcGVkRGVsaW1pdGVyID0gKGlucHV0OiBzdHJpbmcsIGluZGV4OiBudW1iZXIsIG5leHRDaGFyOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgaWYgKGlucHV0W2luZGV4XSAhPT0gJ1xcXFwnIHx8IGlucHV0W2luZGV4ICsgMV0gIT09IG5leHRDaGFyKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBjb3VudFByZWNlZGluZ0JhY2tzbGFzaGVzKGlucHV0LCBpbmRleCkgJSAyID09PSAwO1xufTtcblxuY29uc3QgZmluZENsb3NpbmdEZWxpbWl0ZXIgPSAoaW5wdXQ6IHN0cmluZywgZnJvbUluZGV4OiBudW1iZXIsIGNsb3NlQ2hhcjogJyknIHwgJ10nKTogbnVtYmVyID0+IHtcbiAgZm9yIChsZXQgaSA9IGZyb21JbmRleDsgaSA8IGlucHV0Lmxlbmd0aCAtIDE7IGkrKykge1xuICAgIGlmIChpc1VuZXNjYXBlZERlbGltaXRlcihpbnB1dCwgaSwgY2xvc2VDaGFyKSkgcmV0dXJuIGk7XG4gIH1cbiAgcmV0dXJuIC0xO1xufTtcblxuY29uc3QgaXNMaW5lU3RhcnQgPSAoaW5wdXQ6IHN0cmluZywgaW5kZXg6IG51bWJlcik6IGJvb2xlYW4gPT5cbiAgaW5kZXggPT09IDAgfHwgaW5wdXRbaW5kZXggLSAxXSA9PT0gJ1xcbic7XG5cbmNvbnN0IHNjYW5GZW5jZSA9IChcbiAgaW5wdXQ6IHN0cmluZyxcbiAgaW5kZXg6IG51bWJlclxuKTogeyBmZW5jZUNoYXI6ICdgJyB8ICd+JzsgZmVuY2VMZW5ndGg6IG51bWJlciB9IHwgbnVsbCA9PiB7XG4gIGNvbnN0IGNoYXIgPSBpbnB1dFtpbmRleF07XG4gIGlmIChjaGFyICE9PSAnYCcgJiYgY2hhciAhPT0gJ34nKSByZXR1cm4gbnVsbDtcbiAgbGV0IGZlbmNlTGVuZ3RoID0gMDtcbiAgZm9yIChsZXQgaSA9IGluZGV4OyBpIDwgaW5wdXQubGVuZ3RoICYmIGlucHV0W2ldID09PSBjaGFyOyBpKyspIGZlbmNlTGVuZ3RoKys7XG4gIGlmIChmZW5jZUxlbmd0aCA8IDMpIHJldHVybiBudWxsO1xuICByZXR1cm4geyBmZW5jZUNoYXI6IGNoYXIsIGZlbmNlTGVuZ3RoIH07XG59O1xuXG5jb25zdCBpc0luZGVudGVkQ29kZUxpbmUgPSAoaW5wdXQ6IHN0cmluZywgaW5kZXg6IG51bWJlcik6IGJvb2xlYW4gPT4ge1xuICBpZiAoIWlzTGluZVN0YXJ0KGlucHV0LCBpbmRleCkpIHJldHVybiBmYWxzZTtcbiAgaWYgKGlucHV0W2luZGV4XSA9PT0gJ1xcdCcpIHJldHVybiB0cnVlO1xuICByZXR1cm4gaW5wdXQuc2xpY2UoaW5kZXgsIGluZGV4ICsgNCkgPT09ICcgICAgJztcbn07XG5cbmV4cG9ydCBjb25zdCBub3JtYWxpemVMYXRleFBhcmVuc01hdGggPSAoaW5wdXQ6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGxldCBvdXRwdXQgPSAnJztcblxuICBsZXQgaW5GZW5jZWRDb2RlQmxvY2sgPSBmYWxzZTtcbiAgbGV0IGZlbmNlQ2hhcjogJ2AnIHwgJ34nIHwgbnVsbCA9IG51bGw7XG4gIGxldCBmZW5jZUxlbmd0aCA9IDA7XG5cbiAgbGV0IGluSW5saW5lQ29kZSA9IGZhbHNlO1xuICBsZXQgaW5saW5lQ29kZVRpY2tMZW5ndGggPSAwO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoOyApIHtcbiAgICBpZiAoIWluRmVuY2VkQ29kZUJsb2NrICYmICFpbklubGluZUNvZGUgJiYgaXNJbmRlbnRlZENvZGVMaW5lKGlucHV0LCBpKSkge1xuICAgICAgY29uc3QgZW5kID0gaW5wdXQuaW5kZXhPZignXFxuJywgaSk7XG4gICAgICBpZiAoZW5kID09PSAtMSkgcmV0dXJuIG91dHB1dCArIGlucHV0LnNsaWNlKGkpO1xuICAgICAgb3V0cHV0ICs9IGlucHV0LnNsaWNlKGksIGVuZCArIDEpO1xuICAgICAgaSA9IGVuZCArIDE7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoIWluSW5saW5lQ29kZSAmJiBpc0xpbmVTdGFydChpbnB1dCwgaSkpIHtcbiAgICAgIGNvbnN0IGZlbmNlID0gc2NhbkZlbmNlKGlucHV0LCBpKTtcbiAgICAgIGlmIChmZW5jZSkge1xuICAgICAgICBpZiAoIWluRmVuY2VkQ29kZUJsb2NrKSB7XG4gICAgICAgICAgaW5GZW5jZWRDb2RlQmxvY2sgPSB0cnVlO1xuICAgICAgICAgIGZlbmNlQ2hhciA9IGZlbmNlLmZlbmNlQ2hhcjtcbiAgICAgICAgICBmZW5jZUxlbmd0aCA9IGZlbmNlLmZlbmNlTGVuZ3RoO1xuICAgICAgICB9IGVsc2UgaWYgKGZlbmNlQ2hhciA9PT0gZmVuY2UuZmVuY2VDaGFyICYmIGZlbmNlLmZlbmNlTGVuZ3RoID49IGZlbmNlTGVuZ3RoKSB7XG4gICAgICAgICAgaW5GZW5jZWRDb2RlQmxvY2sgPSBmYWxzZTtcbiAgICAgICAgICBmZW5jZUNoYXIgPSBudWxsO1xuICAgICAgICAgIGZlbmNlTGVuZ3RoID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVuZCA9IGlucHV0LmluZGV4T2YoJ1xcbicsIGkpO1xuICAgICAgICBpZiAoZW5kID09PSAtMSkgcmV0dXJuIG91dHB1dCArIGlucHV0LnNsaWNlKGkpO1xuICAgICAgICBvdXRwdXQgKz0gaW5wdXQuc2xpY2UoaSwgZW5kICsgMSk7XG4gICAgICAgIGkgPSBlbmQgKyAxO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWluRmVuY2VkQ29kZUJsb2NrKSB7XG4gICAgICBpZiAoIWluSW5saW5lQ29kZSAmJiBpbnB1dFtpXSA9PT0gJ2AnKSB7XG4gICAgICAgIGxldCB0aWNrcyA9IDA7XG4gICAgICAgIGZvciAobGV0IGogPSBpOyBqIDwgaW5wdXQubGVuZ3RoICYmIGlucHV0W2pdID09PSAnYCc7IGorKykgdGlja3MrKztcbiAgICAgICAgaW5JbmxpbmVDb2RlID0gdHJ1ZTtcbiAgICAgICAgaW5saW5lQ29kZVRpY2tMZW5ndGggPSB0aWNrcztcbiAgICAgICAgb3V0cHV0ICs9IGlucHV0LnNsaWNlKGksIGkgKyB0aWNrcyk7XG4gICAgICAgIGkgKz0gdGlja3M7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoaW5JbmxpbmVDb2RlKSB7XG4gICAgICAgIGlmIChpbnB1dFtpXSA9PT0gJ2AnKSB7XG4gICAgICAgICAgbGV0IHRpY2tzID0gMDtcbiAgICAgICAgICBmb3IgKGxldCBqID0gaTsgaiA8IGlucHV0Lmxlbmd0aCAmJiBpbnB1dFtqXSA9PT0gJ2AnOyBqKyspIHRpY2tzKys7XG4gICAgICAgICAgaWYgKHRpY2tzID49IGlubGluZUNvZGVUaWNrTGVuZ3RoKSB7XG4gICAgICAgICAgICBvdXRwdXQgKz0gaW5wdXQuc2xpY2UoaSwgaSArIGlubGluZUNvZGVUaWNrTGVuZ3RoKTtcbiAgICAgICAgICAgIGkgKz0gaW5saW5lQ29kZVRpY2tMZW5ndGg7XG4gICAgICAgICAgICBpbklubGluZUNvZGUgPSBmYWxzZTtcbiAgICAgICAgICAgIGlubGluZUNvZGVUaWNrTGVuZ3RoID0gMDtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBvdXRwdXQgKz0gaW5wdXRbaV07XG4gICAgICAgIGkrKztcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFpbkZlbmNlZENvZGVCbG9jayAmJiAhaW5JbmxpbmVDb2RlKSB7XG4gICAgICBpZiAoaXNVbmVzY2FwZWREZWxpbWl0ZXIoaW5wdXQsIGksICcoJykpIHtcbiAgICAgICAgY29uc3QgY2xvc2VJbmRleCA9IGZpbmRDbG9zaW5nRGVsaW1pdGVyKGlucHV0LCBpICsgMiwgJyknKTtcbiAgICAgICAgaWYgKGNsb3NlSW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgY29uc3QgaW5uZXIgPSBpbnB1dC5zbGljZShpICsgMiwgY2xvc2VJbmRleCk7XG4gICAgICAgICAgb3V0cHV0ICs9IGAkJHtpbm5lcn0kYDtcbiAgICAgICAgICBpID0gY2xvc2VJbmRleCArIDI7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGlzVW5lc2NhcGVkRGVsaW1pdGVyKGlucHV0LCBpLCAnWycpKSB7XG4gICAgICAgIGNvbnN0IGNsb3NlSW5kZXggPSBmaW5kQ2xvc2luZ0RlbGltaXRlcihpbnB1dCwgaSArIDIsICddJyk7XG4gICAgICAgIGlmIChjbG9zZUluZGV4ICE9PSAtMSkge1xuICAgICAgICAgIGNvbnN0IGlubmVyID0gaW5wdXQuc2xpY2UoaSArIDIsIGNsb3NlSW5kZXgpO1xuICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gaW5uZXIuc3RhcnRzV2l0aCgnXFxuJykgPyAnJyA6ICdcXG4nO1xuICAgICAgICAgIGNvbnN0IGVuZCA9IGlubmVyLmVuZHNXaXRoKCdcXG4nKSA/ICcnIDogJ1xcbic7XG4gICAgICAgICAgb3V0cHV0ICs9IGAkJCR7c3RhcnR9JHtpbm5lcn0ke2VuZH0kJGA7XG4gICAgICAgICAgaSA9IGNsb3NlSW5kZXggKyAyO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgb3V0cHV0ICs9IGlucHV0W2ldO1xuICAgIGkrKztcbiAgfVxuXG4gIHJldHVybiBvdXRwdXQ7XG59O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbmV4cG9ydCBjb25zdCByZW1hcmtNYXRoRGVsaW1pdGVycyA9IGZ1bmN0aW9uIHJlbWFya01hdGhEZWxpbWl0ZXJzKHRoaXM6IFByb2Nlc3Nvcik6IHZvaWQge1xuICBjb25zdCBjdXJyZW50UGFyc2VyID0gdGhpcy5wYXJzZXIgfHwgdGhpcy5QYXJzZXI7XG4gIGlmICghY3VycmVudFBhcnNlcikgcmV0dXJuO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHRoaXMuUGFyc2VyID0gZnVuY3Rpb24gd3JhcHBlZFBhcnNlcihkb2N1bWVudDogdW5rbm93biwgZmlsZTogYW55KSB7XG4gICAgbGV0IG5leHREb2N1bWVudCA9IGRvY3VtZW50O1xuICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBjb25zdCBub3JtYWxpemVkID0gbm9ybWFsaXplTGF0ZXhQYXJlbnNNYXRoKGRvY3VtZW50KTtcbiAgICAgIG5leHREb2N1bWVudCA9IG5vcm1hbGl6ZWQ7XG4gICAgICBpZiAoZmlsZSAmJiB0eXBlb2YgZmlsZS52YWx1ZSA9PT0gJ3N0cmluZycpIGZpbGUudmFsdWUgPSBub3JtYWxpemVkO1xuICAgIH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHJldHVybiBjdXJyZW50UGFyc2VyKG5leHREb2N1bWVudCBhcyBhbnksIGZpbGUpO1xuICB9IGFzIHVua25vd24gYXMgUHJvY2Vzc29yWydQYXJzZXInXTtcblxuICBpZiAodGhpcy5wYXJzZXIpIHRoaXMucGFyc2VyID0gdGhpcy5QYXJzZXIgYXMgdW5rbm93biBhcyB0eXBlb2YgdGhpcy5wYXJzZXI7XG59O1xuIiwgImltcG9ydCB7IFJvb3QgfSBmcm9tICdoYXN0JztcbmltcG9ydCB7IGdldFBhcnNlciB9IGZyb20gJy4vY29yZSc7XG5pbXBvcnQgdHlwZSB7IFJlbmRlclByb3BzIGFzIFBhcnNlck9wdGlvbnMgfSBmcm9tICcuL2NvcmUnO1xuZXhwb3J0IHsgUGFyc2VyT3B0aW9ucyB9O1xuLyoqXG4gKiBcdTUzNTVcdTdFQkZcdTdBMEIgTWFya2Rvd24gXHU4OUUzXHU2NzkwXHU1NjY4XG4gKi9cbmV4cG9ydCBjbGFzcyBQYXJzZXIge1xuICBwcml2YXRlIG9wdGlvbnM6IFBhcnNlck9wdGlvbnM7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogUGFyc2VyT3B0aW9ucyA9IHt9KSB7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBcdTg5RTNcdTY3OTAgTWFya2Rvd24gXHU1MjMwIEhUTUxcbiAgICogQHBhcmFtIG1hcmtkb3duIE1hcmtkb3duIFx1NUI1N1x1N0IyNlx1NEUzMlxuICAgKiBAcmV0dXJucyBIVE1MIFx1NUI1N1x1N0IyNlx1NEUzMlxuICAgKi9cbiAgYXN5bmMgcGFyc2VUb0hUTUwobWFya2Rvd246IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgcHJvY2Vzc29yID0gZ2V0UGFyc2VyKCdodG1sJywgdGhpcy5vcHRpb25zKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwcm9jZXNzb3IucHJvY2VzcyhtYXJrZG93bik7XG4gICAgcmV0dXJuIFN0cmluZyhyZXN1bHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFx1ODlFM1x1Njc5MCBNYXJrZG93biBcdTUyMzAgSEFTVFxuICAgKiBAcGFyYW0gbWFya2Rvd24gTWFya2Rvd24gXHU1QjU3XHU3QjI2XHU0RTMyXG4gICAqIEByZXR1cm5zIEhBU1QgUm9vdCBcdTgyODJcdTcwQjlcbiAgICovXG4gIGFzeW5jIHBhcnNlVG9IQVNUKG1hcmtkb3duOiBzdHJpbmcpOiBQcm9taXNlPFJvb3Q+IHtcbiAgICBjb25zdCBwcm9jZXNzb3IgPSBnZXRQYXJzZXIoJ2hhc3QnLCB0aGlzLm9wdGlvbnMpO1xuICAgIGNvbnN0IHRyZWUgPSBwcm9jZXNzb3IucGFyc2UobWFya2Rvd24pO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHByb2Nlc3Nvci5ydW4odHJlZSk7XG4gICAgcmV0dXJuIHJlc3VsdCBhcyBSb290O1xuICB9XG5cbiAgLyoqXG4gICAqIFx1NjI3OVx1OTFDRlx1ODlFM1x1Njc5MCBNYXJrZG93biBcdTUyMzAgSFRNTFxuICAgKiBAcGFyYW0gbWFya2Rvd25zIE1hcmtkb3duIFx1NUI1N1x1N0IyNlx1NEUzMlx1NjU3MFx1N0VDNFxuICAgKiBAcmV0dXJucyBIVE1MIFx1NUI1N1x1N0IyNlx1NEUzMlx1NjU3MFx1N0VDNFxuICAgKi9cbiAgYXN5bmMgYmF0Y2hQYXJzZVRvSFRNTChtYXJrZG93bnM6IHN0cmluZ1tdKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IHByb2Nlc3NvciA9IGdldFBhcnNlcignaHRtbCcsIHRoaXMub3B0aW9ucyk7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKFxuICAgICAgbWFya2Rvd25zLm1hcChhc3luYyAobWQpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcHJvY2Vzc29yLnByb2Nlc3MobWQpO1xuICAgICAgICByZXR1cm4gU3RyaW5nKHJlc3VsdCk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogXHU2Mjc5XHU5MUNGXHU4OUUzXHU2NzkwIE1hcmtkb3duIFx1NTIzMCBIQVNUXG4gICAqIEBwYXJhbSBtYXJrZG93bnMgTWFya2Rvd24gXHU1QjU3XHU3QjI2XHU0RTMyXHU2NTcwXHU3RUM0XG4gICAqIEByZXR1cm5zIEhBU1QgUm9vdCBcdTgyODJcdTcwQjlcdTY1NzBcdTdFQzRcbiAgICovXG4gIGFzeW5jIGJhdGNoUGFyc2VUb0hBU1QobWFya2Rvd25zOiBzdHJpbmdbXSk6IFByb21pc2U8Um9vdFtdPiB7XG4gICAgY29uc3QgcHJvY2Vzc29yID0gZ2V0UGFyc2VyKCdoYXN0JywgdGhpcy5vcHRpb25zKTtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoXG4gICAgICBtYXJrZG93bnMubWFwKGFzeW5jIChtZCkgPT4ge1xuICAgICAgICBjb25zdCB0cmVlID0gcHJvY2Vzc29yLnBhcnNlKG1kKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcHJvY2Vzc29yLnJ1bih0cmVlKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCBhcyBSb290O1xuICAgICAgfSlcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogXHU1MjFCXHU1RUZBXHU1MzU1XHU3RUJGXHU3QTBCXHU4OUUzXHU2NzkwXHU1NjY4XHU1QjlFXHU0RjhCXG4gKiBAcGFyYW0gb3B0aW9ucyBcdTg5RTNcdTY3OTBcdTU2NjhcdTkwMDlcdTk4NzlcbiAqIEByZXR1cm5zIFBhcnNlciBcdTVCOUVcdTRGOEJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVBhcnNlcihvcHRpb25zOiBQYXJzZXJPcHRpb25zID0ge30pOiBQYXJzZXIge1xuICByZXR1cm4gbmV3IFBhcnNlcihvcHRpb25zKTtcbn1cbiIsICJpbXBvcnQgeyB3cmFwLCBSZW1vdGUgfSBmcm9tICdjb21saW5rJztcbmltcG9ydCB7IFJvb3QgfSBmcm9tICdoYXN0JztcbmltcG9ydCB0eXBlIHsgUGFyc2VyT3B0aW9ucyB9IGZyb20gJy4vcGFyc2VyJztcblxuY29uc3QgV09SS0VSX01PRFVMRV9QQVRIID0gJy4vbW9kdWxlcy9wYXJzZXIud29ya2VyLm1qcyc7XG5jb25zdCBWSVRFX09QVElNSVpFRF9ERVBTX1NFR01FTlQgPSAnLy52aXRlL2RlcHMvJztcbmNvbnN0IFBBQ0tBR0VfRElTVF9XT1JLRVJfVVJMID0gbmV3IFVSTCgnLi9tb2R1bGVzL3BhcnNlci53b3JrZXIubWpzJywgaW1wb3J0Lm1ldGEudXJsKTtcblxuLyoqXG4gKiBXb3JrZXIgXHU1QjlFXHU0RjhCXHU2M0E1XHU1M0UzXG4gKi9cbmludGVyZmFjZSBQYXJzZXJXb3JrZXJTZXJ2aWNlIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gIG5ldyAoX29wdGlvbnM6IFBhcnNlck9wdGlvbnMpOiBQYXJzZXJXb3JrZXJTZXJ2aWNlO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgcGFyc2VUb0hUTUwoX21hcmtkb3duOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz47XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICBwYXJzZVRvSEFTVChfbWFya2Rvd246IHN0cmluZyk6IFByb21pc2U8Um9vdD47XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICB1cGRhdGVPcHRpb25zKF9vcHRpb25zOiBQYXJzZXJPcHRpb25zKTogdm9pZDtcbn1cblxuLyoqXG4gKiBcdTgzQjdcdTUzRDZcdTczQUZcdTU4ODNcdTdDN0JcdTU3OEJcbiAqL1xuZnVuY3Rpb24gZ2V0RW52aXJvbm1lbnQoKTogJ2Jyb3dzZXInIHwgJ25vZGUnIHwgJ3Vua25vd24nIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2luZG93LmRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiAnYnJvd3Nlcic7XG4gIH1cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gIGlmICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgcHJvY2Vzcy52ZXJzaW9ucz8ubm9kZSkge1xuICAgIHJldHVybiAnbm9kZSc7XG4gIH1cbiAgcmV0dXJuICd1bmtub3duJztcbn1cblxuLyoqXG4gKiBcdTgzQjdcdTUzRDZcdTY3MDBcdTU5MjdcdTUzRUZcdTc1MjhcdTdFQkZcdTdBMEJcdTY1NzBcbiAqL1xuZnVuY3Rpb24gZ2V0TWF4V29ya2VycygpOiBudW1iZXIge1xuICBjb25zdCBlbnYgPSBnZXRFbnZpcm9ubWVudCgpO1xuXG4gIGlmIChlbnYgPT09ICdicm93c2VyJykge1xuICAgIC8vIFx1NkQ0Rlx1ODlDOFx1NTY2OFx1NzNBRlx1NTg4M1x1RkYxQVx1NEY3Rlx1NzUyOCBuYXZpZ2F0b3IuaGFyZHdhcmVDb25jdXJyZW5jeVxuICAgIC8vIFx1OTAxQVx1NUUzOFx1OTY1MFx1NTIzNlx1NEUzQSBDUFUgXHU2ODM4XHU1RkMzXHU2NTcwXHVGRjBDXHU0RjQ2XHU2RDRGXHU4OUM4XHU1NjY4XHU1M0VGXHU4MEZEXHU2NzA5XHU4MUVBXHU1REYxXHU3Njg0XHU5NjUwXHU1MjM2XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgY29uc3QgbmF2ID0gdHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgPyAobmF2aWdhdG9yIGFzIGFueSkgOiBudWxsO1xuICAgIGNvbnN0IGNvcmVzID0gbmF2Py5oYXJkd2FyZUNvbmN1cnJlbmN5IHx8IDQ7XG4gICAgLy8gXHU5NjUwXHU1MjM2XHU2NzAwXHU1OTI3XHU0RTNBIDggXHU0RTJBIFdvcmtlclx1RkYwQ1x1OTA3Rlx1NTE0RFx1OEZDN1x1NUVBNlx1NTM2MFx1NzUyOFx1OEQ0NFx1NkU5MFxuICAgIHJldHVybiBNYXRoLm1pbihjb3JlcywgOCk7XG4gIH1cblxuICBpZiAoZW52ID09PSAnbm9kZScpIHtcbiAgICAvLyBOb2RlLmpzIFx1NzNBRlx1NTg4M1x1RkYxQVx1NEY3Rlx1NzUyOCBvcy5jcHVzKClcbiAgICB0cnkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gICAgICBjb25zdCBvcyA9IHJlcXVpcmUoJ29zJyk7XG4gICAgICBjb25zdCBjb3JlcyA9IG9zLmNwdXMoKT8ubGVuZ3RoIHx8IDQ7XG4gICAgICAvLyBOb2RlLmpzIFx1NEUyRFx1NEU1Rlx1OTY1MFx1NTIzNlx1NjcwMFx1NTkyN1x1NEUzQSA4IFx1NEUyQSBXb3JrZXJcbiAgICAgIHJldHVybiBNYXRoLm1pbihjb3JlcywgOCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gNDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gNDtcbn1cblxuLyoqXG4gKiBcdTg5RTNcdTY3OTBcdTZENEZcdTg5QzhcdTU2NjhcdTczQUZcdTU4ODNcdTRFMEJcdTc2ODQgV29ya2VyIFx1ODExQVx1NjcyQyBVUkxcdTMwMDJcbiAqIFx1NTcyOCBWaXRlIFx1NEY5RFx1OEQ1Nlx1OTg4NFx1Njc4NFx1NUVGQVx1NzZFRVx1NUY1NVx1NEUyRFx1RkYwQ2BpbXBvcnQubWV0YS51cmxgIFx1NEYxQVx1ODhBQlx1OTFDRFx1NTE5OVx1NTIzMCBgbm9kZV9tb2R1bGVzLy52aXRlL2RlcHNgXHVGRjBDXG4gKiBcdTRGNDZcdTRFMERcdTRGMUFcdTUzMDVcdTU0MkJcdTYyMTFcdTRFRUNcdTUzMDVcdTUxODVcdTc2ODQgd29ya2VyIFx1NEVBN1x1NzI2OVx1RkYwQ1x1NTZFMFx1NkI2NFx1OTcwMFx1ODk4MVx1NTZERVx1OTAwMFx1NTIzMFx1NTMwNVx1NTE4NVx1NzcxRlx1NUI5RVx1OERFRlx1NUY4NFx1MzAwMlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUJyb3dzZXJXb3JrZXJVUkwobW9kdWxlVXJsOiBzdHJpbmcgPSBpbXBvcnQubWV0YS51cmwpOiBVUkwge1xuICBpZiAobW9kdWxlVXJsLmluY2x1ZGVzKFZJVEVfT1BUSU1JWkVEX0RFUFNfU0VHTUVOVCkpIHtcbiAgICByZXR1cm4gbmV3IFVSTCgnLi4vLi4vQG1hcmtkb3duLW5leHQvcGFyc2VyL2Rpc3QvbW9kdWxlcy9wYXJzZXIud29ya2VyLm1qcycsIG1vZHVsZVVybCk7XG4gIH1cblxuICAvLyBLZWVwIGEgc3RhdGljIGBuZXcgVVJMKC4uLiwgaW1wb3J0Lm1ldGEudXJsKWAgcGF0aCBzbyBidW5kbGVycyBjYW4gcmV3cml0ZVxuICAvLyBhbmQgZW1pdCB0aGUgd29ya2VyIGFzc2V0IGluIHByb2R1Y3Rpb24gYnVpbGRzLlxuICBpZiAobW9kdWxlVXJsID09PSBpbXBvcnQubWV0YS51cmwpIHtcbiAgICByZXR1cm4gUEFDS0FHRV9ESVNUX1dPUktFUl9VUkw7XG4gIH1cblxuICByZXR1cm4gbmV3IFVSTChXT1JLRVJfTU9EVUxFX1BBVEgsIG1vZHVsZVVybCk7XG59XG5cbi8qKlxuICogXHU1MjFCXHU1RUZBIFdvcmtlciBcdTVCOUVcdTRGOEJcbiAqL1xuZnVuY3Rpb24gY3JlYXRlV29ya2VyKCk6IFdvcmtlciB7XG4gIGNvbnN0IGVudiA9IGdldEVudmlyb25tZW50KCk7XG5cbiAgaWYgKGVudiA9PT0gJ2Jyb3dzZXInKSB7XG4gICAgLy8gXHU2RDRGXHU4OUM4XHU1NjY4XHU3M0FGXHU1ODgzXHVGRjFBXHU0RjdGXHU3NTI4IFdlYiBXb3JrZXJcbiAgICByZXR1cm4gbmV3IFdvcmtlcihyZXNvbHZlQnJvd3NlcldvcmtlclVSTCgpLCB7XG4gICAgICB0eXBlOiAnbW9kdWxlJyxcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChlbnYgPT09ICdub2RlJykge1xuICAgIC8vIE5vZGUuanMgXHU3M0FGXHU1ODgzXHVGRjFBXHU0RjdGXHU3NTI4IHdvcmtlcl90aHJlYWRzXG4gICAgdHJ5IHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICAgICAgY29uc3QgeyBXb3JrZXIgfSA9IHJlcXVpcmUoJ3dvcmtlcl90aHJlYWRzJyk7XG4gICAgICByZXR1cm4gbmV3IFdvcmtlcihuZXcgVVJMKFdPUktFUl9NT0RVTEVfUEFUSCwgaW1wb3J0Lm1ldGEudXJsKSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdXb3JrZXIgdGhyZWFkcyBhcmUgbm90IHN1cHBvcnRlZCBpbiB0aGlzIE5vZGUuanMgZW52aXJvbm1lbnQuICcgK1xuICAgICAgICAgICdQbGVhc2UgdXNlIE5vZGUuanMgMTIrIG9yIHVzZSB0aGUgc2luZ2xlLXRocmVhZGVkIHBhcnNlciBpbnN0ZWFkLidcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBlbnZpcm9ubWVudCBmb3Igd29ya2VyIHBvb2wnKTtcbn1cblxuLyoqXG4gKiBXb3JrZXIgXHU2QzYwXHU5MTREXHU3RjZFXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2VyUG9vbE9wdGlvbnMgZXh0ZW5kcyBQYXJzZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdvcmtlciBcdTY1NzBcdTkxQ0ZcdUZGMENcdTlFRDhcdThCQTRcdTRFM0EgQ1BVIFx1NjgzOFx1NUZDM1x1NjU3MFx1RkYwOFx1NjcwMFx1NTkyNyA4XHVGRjA5XG4gICAqL1xuICB3b3JrZXJDb3VudD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBXb3JrZXIgXHU2QzYwXHU3MkI2XHU2MDAxXG4gKi9cbmludGVyZmFjZSBXb3JrZXJTdGF0ZSB7XG4gIHdvcmtlcjogV29ya2VyO1xuICBwcm94eTogUmVtb3RlPFBhcnNlcldvcmtlclNlcnZpY2U+O1xuICBidXN5OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFx1NTkxQVx1N0VCRlx1N0EwQiBNYXJrZG93biBcdTg5RTNcdTY3OTBcdTU2NjhcdUZGMDhcdTRGN0ZcdTc1MjggV29ya2VyIFx1NkM2MFx1RkYwOVxuICovXG5leHBvcnQgY2xhc3MgUGFyc2VyV29ya2VyUG9vbCB7XG4gIHByaXZhdGUgb3B0aW9uczogV29ya2VyUG9vbE9wdGlvbnM7XG4gIHByaXZhdGUgd29ya2VyczogV29ya2VyU3RhdGVbXSA9IFtdO1xuICBwcml2YXRlIHdvcmtlckNvdW50OiBudW1iZXI7XG4gIHByaXZhdGUgaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBpbml0UHJvbWlzZTogUHJvbWlzZTx2b2lkPiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGNvbXBsZXRlZFRhc2tzID0gMDtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gIHByaXZhdGUgcGVuZGluZzogQXJyYXk8KHdvcmtlcjogV29ya2VyU3RhdGUpID0+IHZvaWQ+ID0gW107XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogV29ya2VyUG9vbE9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgY29uc3QgbWF4V29ya2VycyA9IGdldE1heFdvcmtlcnMoKTtcbiAgICB0aGlzLndvcmtlckNvdW50ID0gb3B0aW9ucy53b3JrZXJDb3VudFxuICAgICAgPyBNYXRoLm1pbihNYXRoLm1heCgxLCBvcHRpb25zLndvcmtlckNvdW50KSwgbWF4V29ya2VycylcbiAgICAgIDogbWF4V29ya2VycztcbiAgICAvLyBcdTdBQ0JcdTUzNzNcdTVGMDBcdTU5Q0JcdTUyMURcdTU5Q0JcdTUzMTYgV29ya2VyIFx1NkM2MFxuICAgIHRoaXMuaW5pdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFx1NTIxRFx1NTlDQlx1NTMxNiBXb3JrZXIgXHU2QzYwXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGluaXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaW5pdGlhbGl6ZWQpIHJldHVybjtcbiAgICBpZiAodGhpcy5pbml0UHJvbWlzZSkge1xuICAgICAgYXdhaXQgdGhpcy5pbml0UHJvbWlzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmluaXRQcm9taXNlID0gKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHdvcmtlclByb21pc2VzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogdGhpcy53b3JrZXJDb3VudCB9LCAoKSA9PiB7XG4gICAgICAgIHJldHVybiAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHdvcmtlciA9IGNyZWF0ZVdvcmtlcigpO1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgY29uc3QgV29ya2VyQ2xhc3MgPSB3cmFwPGFueT4od29ya2VyKSBhcyBhbnk7XG4gICAgICAgICAgY29uc3QgcGFyc2VyT3B0aW9ucyA9IHsgLi4udGhpcy5vcHRpb25zIH07XG4gICAgICAgICAgZGVsZXRlIChwYXJzZXJPcHRpb25zIGFzIHsgd29ya2VyQ291bnQ/OiBudW1iZXIgfSkud29ya2VyQ291bnQ7XG4gICAgICAgICAgY29uc3QgcHJveHkgPSBhd2FpdCBuZXcgV29ya2VyQ2xhc3MocGFyc2VyT3B0aW9ucyk7XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgd29ya2VyLFxuICAgICAgICAgICAgcHJveHksXG4gICAgICAgICAgICBidXN5OiBmYWxzZSxcbiAgICAgICAgICB9O1xuICAgICAgICB9KSgpO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMud29ya2VycyA9IGF3YWl0IFByb21pc2UuYWxsKHdvcmtlclByb21pc2VzKTtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgIH0pKCk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5pbml0UHJvbWlzZTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5pbml0UHJvbWlzZSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFx1ODNCN1x1NTNENlx1N0E3QVx1OTVGMlx1NzY4NCBXb3JrZXJcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2V0QXZhaWxhYmxlV29ya2VyKCk6IFByb21pc2U8V29ya2VyU3RhdGU+IHtcbiAgICBhd2FpdCB0aGlzLmluaXQoKTtcblxuICAgIC8vIFx1NjdFNVx1NjI3RVx1N0E3QVx1OTVGMlx1NzY4NCBXb3JrZXJcbiAgICBsZXQgd29ya2VyID0gdGhpcy53b3JrZXJzLmZpbmQoKHcpID0+ICF3LmJ1c3kpO1xuXG4gICAgLy8gXHU1OTgyXHU2NzlDXHU2MjQwXHU2NzA5IFdvcmtlciBcdTkwRkRcdTVGRDlcdUZGMENcdTYzOTJcdTk2MUZcdTdCNDlcdTVGODVcdTkxQ0FcdTY1M0VcbiAgICBpZiAoIXdvcmtlcikge1xuICAgICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlPFdvcmtlclN0YXRlPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICB0aGlzLnBlbmRpbmcucHVzaCgoYXZhaWxhYmxlKSA9PiB7XG4gICAgICAgICAgYXZhaWxhYmxlLmJ1c3kgPSB0cnVlO1xuICAgICAgICAgIHJlc29sdmUoYXZhaWxhYmxlKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB3b3JrZXIuYnVzeSA9IHRydWU7XG4gICAgcmV0dXJuIHdvcmtlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBcdTkxQ0FcdTY1M0UgV29ya2VyXG4gICAqL1xuICBwcml2YXRlIHJlbGVhc2VXb3JrZXIod29ya2VyOiBXb3JrZXJTdGF0ZSk6IHZvaWQge1xuICAgIGNvbnN0IG5leHQgPSB0aGlzLnBlbmRpbmcuc2hpZnQoKTtcbiAgICBpZiAobmV4dCkge1xuICAgICAgbmV4dCh3b3JrZXIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB3b3JrZXIuYnVzeSA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFx1ODlFM1x1Njc5MCBNYXJrZG93biBcdTUyMzAgSFRNTFxuICAgKiBAcGFyYW0gbWFya2Rvd24gTWFya2Rvd24gXHU1QjU3XHU3QjI2XHU0RTMyXG4gICAqIEByZXR1cm5zIEhUTUwgXHU1QjU3XHU3QjI2XHU0RTMyXG4gICAqL1xuICBhc3luYyBwYXJzZVRvSFRNTChtYXJrZG93bjogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB3b3JrZXIgPSBhd2FpdCB0aGlzLmdldEF2YWlsYWJsZVdvcmtlcigpO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgd29ya2VyLnByb3h5LnBhcnNlVG9IVE1MKG1hcmtkb3duKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5jb21wbGV0ZWRUYXNrcyArPSAxO1xuICAgICAgdGhpcy5yZWxlYXNlV29ya2VyKHdvcmtlcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFx1ODlFM1x1Njc5MCBNYXJrZG93biBcdTUyMzAgSEFTVFxuICAgKiBAcGFyYW0gbWFya2Rvd24gTWFya2Rvd24gXHU1QjU3XHU3QjI2XHU0RTMyXG4gICAqIEByZXR1cm5zIEhBU1QgUm9vdCBcdTgyODJcdTcwQjlcbiAgICovXG4gIGFzeW5jIHBhcnNlVG9IQVNUKG1hcmtkb3duOiBzdHJpbmcpOiBQcm9taXNlPFJvb3Q+IHtcbiAgICBjb25zdCB3b3JrZXIgPSBhd2FpdCB0aGlzLmdldEF2YWlsYWJsZVdvcmtlcigpO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgd29ya2VyLnByb3h5LnBhcnNlVG9IQVNUKG1hcmtkb3duKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5jb21wbGV0ZWRUYXNrcyArPSAxO1xuICAgICAgdGhpcy5yZWxlYXNlV29ya2VyKHdvcmtlcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFx1NjI3OVx1OTFDRlx1ODlFM1x1Njc5MCBNYXJrZG93biBcdTUyMzAgSFRNTFx1RkYwOFx1NUU3Nlx1ODg0Q1x1NTkwNFx1NzQwNlx1RkYwOVxuICAgKiBAcGFyYW0gbWFya2Rvd25zIE1hcmtkb3duIFx1NUI1N1x1N0IyNlx1NEUzMlx1NjU3MFx1N0VDNFxuICAgKiBAcmV0dXJucyBIVE1MIFx1NUI1N1x1N0IyNlx1NEUzMlx1NjU3MFx1N0VDNFxuICAgKi9cbiAgYXN5bmMgYmF0Y2hQYXJzZVRvSFRNTChtYXJrZG93bnM6IHN0cmluZ1tdKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgIHJldHVybiBQcm9taXNlLmFsbChtYXJrZG93bnMubWFwKChtZCkgPT4gdGhpcy5wYXJzZVRvSFRNTChtZCkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBcdTYyNzlcdTkxQ0ZcdTg5RTNcdTY3OTAgTWFya2Rvd24gXHU1MjMwIEhBU1RcdUZGMDhcdTVFNzZcdTg4NENcdTU5MDRcdTc0MDZcdUZGMDlcbiAgICogQHBhcmFtIG1hcmtkb3ducyBNYXJrZG93biBcdTVCNTdcdTdCMjZcdTRFMzJcdTY1NzBcdTdFQzRcbiAgICogQHJldHVybnMgSEFTVCBSb290IFx1ODI4Mlx1NzBCOVx1NjU3MFx1N0VDNFxuICAgKi9cbiAgYXN5bmMgYmF0Y2hQYXJzZVRvSEFTVChtYXJrZG93bnM6IHN0cmluZ1tdKTogUHJvbWlzZTxSb290W10+IHtcbiAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwobWFya2Rvd25zLm1hcCgobWQpID0+IHRoaXMucGFyc2VUb0hBU1QobWQpKSk7XG4gIH1cblxuICAvKipcbiAgICogXHU2NkY0XHU2NUIwXHU2MjQwXHU2NzA5IFdvcmtlciBcdTc2ODRcdTkwMDlcdTk4NzlcbiAgICogQHBhcmFtIG9wdGlvbnMgXHU2NUIwXHU3Njg0XHU4OUUzXHU2NzkwXHU1NjY4XHU5MDA5XHU5ODc5XG4gICAqL1xuICBhc3luYyB1cGRhdGVPcHRpb25zKG9wdGlvbnM6IFBhcnRpYWw8UGFyc2VyT3B0aW9ucz4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICB0aGlzLm9wdGlvbnMgPSB7IC4uLnRoaXMub3B0aW9ucywgLi4ub3B0aW9ucyB9O1xuICAgIGNvbnN0IHBhcnNlck9wdGlvbnMgPSB7IC4uLnRoaXMub3B0aW9ucyB9O1xuICAgIGRlbGV0ZSAocGFyc2VyT3B0aW9ucyBhcyB7IHdvcmtlckNvdW50PzogbnVtYmVyIH0pLndvcmtlckNvdW50O1xuICAgIGF3YWl0IFByb21pc2UuYWxsKHRoaXMud29ya2Vycy5tYXAoKHcpID0+IHcucHJveHkudXBkYXRlT3B0aW9ucyhwYXJzZXJPcHRpb25zKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFx1OTUwMFx1NkJDMSBXb3JrZXIgXHU2QzYwXG4gICAqL1xuICBhc3luYyBkZXN0cm95KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5pbml0aWFsaXplZCkgcmV0dXJuO1xuXG4gICAgZm9yIChjb25zdCB7IHdvcmtlciB9IG9mIHRoaXMud29ya2Vycykge1xuICAgICAgd29ya2VyLnRlcm1pbmF0ZSgpO1xuICAgIH1cbiAgICB0aGlzLndvcmtlcnMgPSBbXTtcbiAgICB0aGlzLnBlbmRpbmcgPSBbXTtcbiAgICB0aGlzLmNvbXBsZXRlZFRhc2tzID0gMDtcbiAgICB0aGlzLmluaXRpYWxpemVkID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogXHU1MTdDXHU1QkI5XHU2NUU3IEFQSVx1RkYxQVx1N0VDOFx1NkI2MiBXb3JrZXIgXHU2QzYwXG4gICAqL1xuICBhc3luYyB0ZXJtaW5hdGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5kZXN0cm95KCk7XG4gIH1cblxuICAvKipcbiAgICogXHU1MTdDXHU1QkI5XHU2NUU3IEFQSVx1RkYxQVx1ODNCN1x1NTNENlx1N0VERlx1OEJBMVx1NEZFMVx1NjA2RlxuICAgKi9cbiAgZ2V0U3RhdHMoKToge1xuICAgIGFjdGl2ZVdvcmtlcnM6IG51bWJlcjtcbiAgICBpZGxlV29ya2VyczogbnVtYmVyO1xuICAgIHF1ZXVlZFRhc2tzOiBudW1iZXI7XG4gICAgY29tcGxldGVkVGFza3M6IG51bWJlcjtcbiAgfSB7XG4gICAgY29uc3QgYWN0aXZlV29ya2VycyA9IHRoaXMud29ya2Vycy5sZW5ndGg7XG4gICAgY29uc3QgYnVzeVdvcmtlcnMgPSB0aGlzLndvcmtlcnMuZmlsdGVyKCh3KSA9PiB3LmJ1c3kpLmxlbmd0aDtcblxuICAgIHJldHVybiB7XG4gICAgICBhY3RpdmVXb3JrZXJzLFxuICAgICAgaWRsZVdvcmtlcnM6IE1hdGgubWF4KGFjdGl2ZVdvcmtlcnMgLSBidXN5V29ya2VycywgMCksXG4gICAgICBxdWV1ZWRUYXNrczogdGhpcy5wZW5kaW5nLmxlbmd0aCxcbiAgICAgIGNvbXBsZXRlZFRhc2tzOiB0aGlzLmNvbXBsZXRlZFRhc2tzLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogXHU4M0I3XHU1M0Q2IFdvcmtlciBcdTZDNjBcdTRGRTFcdTYwNkZcbiAgICovXG4gIGdldFBvb2xJbmZvKCk6IHtcbiAgICB3b3JrZXJDb3VudDogbnVtYmVyO1xuICAgIGFjdGl2ZVdvcmtlcnM6IG51bWJlcjtcbiAgICBidXN5V29ya2VyczogbnVtYmVyO1xuICAgIG1heFdvcmtlcnM6IG51bWJlcjtcbiAgICBlbnZpcm9ubWVudDogJ2Jyb3dzZXInIHwgJ25vZGUnIHwgJ3Vua25vd24nO1xuICAgIGluaXRpYWxpemVkOiBib29sZWFuO1xuICB9IHtcbiAgICByZXR1cm4ge1xuICAgICAgd29ya2VyQ291bnQ6IHRoaXMud29ya2VyQ291bnQsXG4gICAgICBhY3RpdmVXb3JrZXJzOiB0aGlzLndvcmtlcnMubGVuZ3RoLFxuICAgICAgYnVzeVdvcmtlcnM6IHRoaXMud29ya2Vycy5maWx0ZXIoKHcpID0+IHcuYnVzeSkubGVuZ3RoLFxuICAgICAgbWF4V29ya2VyczogZ2V0TWF4V29ya2VycygpLFxuICAgICAgZW52aXJvbm1lbnQ6IGdldEVudmlyb25tZW50KCksXG4gICAgICBpbml0aWFsaXplZDogdGhpcy5pbml0aWFsaXplZCxcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogXHU1MjFCXHU1RUZBXHU1OTFBXHU3RUJGXHU3QTBCXHU4OUUzXHU2NzkwXHU1NjY4XHU1QjlFXHU0RjhCXG4gKiBAcGFyYW0gb3B0aW9ucyBcdTg5RTNcdTY3OTBcdTU2NjhcdTkwMDlcdTk4NzlcdUZGMDhcdTUzMDVcdTU0MkIgV29ya2VyIFx1NjU3MFx1OTFDRlx1RkYwOVxuICogQHJldHVybnMgUGFyc2VyV29ya2VyUG9vbCBcdTVCOUVcdTRGOEJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVdvcmtlclBvb2wob3B0aW9uczogV29ya2VyUG9vbE9wdGlvbnMgPSB7fSk6IFBhcnNlcldvcmtlclBvb2wge1xuICByZXR1cm4gbmV3IFBhcnNlcldvcmtlclBvb2wob3B0aW9ucyk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAieVBBQ0EsT0FBbUMsV0FBQUEsT0FBZSxVQUVsRCxPQUFPQyxPQUFpQixlQUN4QixPQUFPQyxPQUFlLGFBQ3RCLE9BQU9DLE9BQWtCLGdCQUN6QixPQUFPQyxPQUFxQixtQkFDNUIsT0FBT0MsT0FBZ0IsY0FDdkIsT0FBT0MsT0FBb0Isa0JBQzNCLE9BQU9DLE9BQWUsYUNSdEIsT0FBUyxpQkFBQUMsTUFBcUIsa0JDRHZCLElBQU1DLEVBQTZCLENBQ3hDLE9BQ0EsT0FDQSxLQUNBLEtBQ0EsS0FDQSxRQUNBLE9BQ0EsT0FDQSxTQUNBLFFBQ0EsYUFDQSxRQUNBLFFBQ0EsUUFDQSxTQUNBLFdBQ0EsVUFDQSxXQUNBLFNBQ0EsTUFDQSxNQUNBLGFBQ0EsY0FDQSxhQUNBLFNBQ0EsU0FDQSxVQUNBLFlBQ0EsYUFDQSxnQkFDRixFQUdhQyxFQUE4QyxDQUN6RCxLQUFNLENBQUMsVUFBVyxRQUFTLFFBQVMsT0FBTyxFQUMzQyxLQUFNLENBQUMsUUFBUyxPQUFPLEVBQ3ZCLEdBQUksQ0FBQyxRQUFTLFFBQVMsYUFBYSxFQUNwQyxHQUFJLENBQUMsUUFBUyxPQUFPLEVBQ3JCLEdBQUksQ0FDRixRQUNBLFFBQ0EsUUFDQSxZQUNBLFdBQ0EsWUFDQSxVQUNBLGdCQUNBLFNBQ0EsU0FDQSxTQUNBLE1BQ0YsRUFDQSxNQUFPLENBQUMsUUFBUyxRQUFTLGdCQUFpQixXQUFZLGFBQWMsVUFBVSxFQUMvRSxLQUFNLENBQUMsUUFBUyxRQUFTLGtCQUFrQixFQUMzQyxLQUFNLENBQUMsUUFBUyxRQUFTLGdCQUFnQixFQUN6QyxPQUFRLENBQUMsUUFBUyxRQUFTLGFBQWEsRUFDeEMsTUFBTyxDQUFDLFFBQVMsUUFBUyxRQUFRLEVBQ2xDLFdBQVksQ0FBQyxR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QixDQUNGLENBQ0YsRUFPTyxTQUFTeUIsR0FBaUJoQixFQUE2QixDQUFDLEVBQXFCLENBQ2xGLE9BQU8sSUFBSUQsRUFBaUJDLENBQU8sQ0FDckMiLAogICJuYW1lcyI6IFsidW5pZmllZCIsICJyZW1hcmtQYXJzZSIsICJyZW1hcmtHZm0iLCAicmVtYXJrUmVoeXBlIiwgInJlaHlwZVN0cmluZ2lmeSIsICJyZW1hcmtNYXRoIiwgInJlaHlwZVNhbml0aXplIiwgInJlaHlwZVJhdyIsICJkZWZhdWx0U2NoZW1hIiwgIk1BVEhNTF9UQUdfTkFNRVMiLCAiTUFUSE1MX0FUVFJJQlVURVMiLCAiY3JlYXRlU2FuaXRpemVTY2hlbWEiLCAiY3VzdG9tVGFncyIsICJkZWZhdWx0U2NoZW1hIiwgIk1BVEhNTF9UQUdfTkFNRVMiLCAiTUFUSE1MX0FUVFJJQlVURVMiLCAiYWNjIiwgInRhZyIsICJjb252ZXJ0IiwgInRlc3QiLCAib2siLCAiY2FzdEZhY3RvcnkiLCAiYW55RmFjdG9yeSIsICJwcm9wZXJ0aWVzRmFjdG9yeSIsICJ0eXBlRmFjdG9yeSIsICJ0ZXN0cyIsICJjaGVja3MiLCAiaW5kZXgiLCAiYW55IiwgInBhcmFtZXRlcnMiLCAiY2hlY2siLCAiY2hlY2tBc1JlY29yZCIsICJhbGwiLCAibm9kZSIsICJub2RlQXNSZWNvcmQiLCAia2V5IiwgInR5cGUiLCAidGVzdEZ1bmN0aW9uIiwgInZhbHVlIiwgInBhcmVudCIsICJsb29rc0xpa2VBTm9kZSIsICJjb2xvciIsICJkIiwgImVtcHR5IiwgIkNPTlRJTlVFIiwgIkVYSVQiLCAiU0tJUCIsICJ2aXNpdFBhcmVudHMiLCAidHJlZSIsICJ0ZXN0IiwgInZpc2l0b3IiLCAicmV2ZXJzZSIsICJjaGVjayIsICJpcyIsICJjb252ZXJ0IiwgInN0ZXAiLCAiZmFjdG9yeSIsICJub2RlIiwgImluZGV4IiwgInBhcmVudHMiLCAidmFsdWUiLCAibmFtZSIsICJ2aXNpdCIsICJjb2xvciIsICJyZXN1bHQiLCAic3VicmVzdWx0IiwgIm9mZnNldCIsICJncmFuZHBhcmVudHMiLCAidG9SZXN1bHQiLCAibm9kZUFzUGFyZW50IiwgImNoaWxkIiwgInZpc2l0IiwgInRyZWUiLCAidGVzdE9yVmlzaXRvciIsICJ2aXNpdG9yT3JSZXZlcnNlIiwgIm1heWJlUmV2ZXJzZSIsICJyZXZlcnNlIiwgInRlc3QiLCAidmlzaXRvciIsICJ2aXNpdFBhcmVudHMiLCAib3ZlcmxvYWQiLCAibm9kZSIsICJwYXJlbnRzIiwgInBhcmVudCIsICJpbmRleCIsICJyZWh5cGVDb252ZXJ0QWJub3JtYWxUYWdzVG9UZXh0IiwgImN1c3RvbVRhZ3MiLCAidHJlZSIsICJzY2hlbWEiLCAiY3JlYXRlU2FuaXRpemVTY2hlbWEiLCAiYWxsb3dlZFRhZ05hbWVzIiwgInZpc2l0IiwgIm5vZGUiLCAiaW5kZXgiLCAicGFyZW50IiwgInRhZ05hbWUiLCAidGFnU3RyaW5nIiwgImtleSIsICJ2YWx1ZSIsICJpbm5lckNvbnRlbnQiLCAicHJvY2Vzc0NoaWxkcmVuIiwgImNoaWxkcmVuIiwgImNoaWxkIiwgImVsZW1lbnRDaGlsZCIsICJjaGlsZFRhZyIsICJ0ZXh0Tm9kZSIsICJyZWh5cGVNYXRoSmF4Q2h0bWwiLCAiTUFUSF9KQVhGT05UX1VSTCIsICJERUZBVUxUX01BVEhKQVhfQ09ORklHIiwgImNvdW50UHJlY2VkaW5nQmFja3NsYXNoZXMiLCAiaW5wdXQiLCAiaW5kZXgiLCAiY291bnQiLCAiaSIsICJpc1VuZXNjYXBlZERlbGltaXRlciIsICJuZXh0Q2hhciIsICJmaW5kQ2xvc2luZ0RlbGltaXRlciIsICJmcm9tSW5kZXgiLCAiY2xvc2VDaGFyIiwgImlzTGluZVN0YXJ0IiwgInNjYW5GZW5jZSIsICJjaGFyIiwgImZlbmNlTGVuZ3RoIiwgImlzSW5kZW50ZWRDb2RlTGluZSIsICJub3JtYWxpemVMYXRleFBhcmVuc01hdGgiLCAib3V0cHV0IiwgImluRmVuY2VkQ29kZUJsb2NrIiwgImZlbmNlQ2hhciIsICJpbklubGluZUNvZGUiLCAiaW5saW5lQ29kZVRpY2tMZW5ndGgiLCAiZW5kIiwgImZlbmNlIiwgInRpY2tzIiwgImoiLCAiY2xvc2VJbmRleCIsICJpbm5lciIsICJzdGFydCIsICJyZW1hcmtNYXRoRGVsaW1pdGVycyIsICJjdXJyZW50UGFyc2VyIiwgImRvY3VtZW50IiwgImZpbGUiLCAibmV4dERvY3VtZW50IiwgIm5vcm1hbGl6ZWQiLCAiZ2V0UGFyc2VyIiwgInRhcmdldCIsICJvcHRpb24iLCAiY3VzdG9tVGFncyIsICJyZW1hcmtQbHVnaW5zIiwgInJlaHlwZVBsdWdpbnMiLCAiZXh0ZW5kZWRHcmFtbWFyIiwgIm1hdGhKYXhDb25maWciLCAic3VwcG9ydHNMYVRlWCIsICJleHRlbmRlZEdyYW1tYXJTZXQiLCAicGFyc2VyIiwgInVuaWZpZWQiLCAicmVtYXJrUGFyc2UiLCAicmVtYXJrR2ZtIiwgInJlbWFya01hdGhEZWxpbWl0ZXJzIiwgInJlbWFya01hdGgiLCAicmVtYXJrUmVoeXBlIiwgInJlaHlwZVJhdyIsICJyZWh5cGVDb252ZXJ0QWJub3JtYWxUYWdzVG9UZXh0IiwgInJlaHlwZVNhbml0aXplIiwgImNyZWF0ZVNhbml0aXplU2NoZW1hIiwgIm1lcmdlZENvbmZpZyIsICJERUZBVUxUX01BVEhKQVhfQ09ORklHIiwgInJlaHlwZU1hdGhKYXhDaHRtbCIsICJyZWh5cGVTdHJpbmdpZnkiLCAiUGFyc2VyIiwgIm9wdGlvbnMiLCAibWFya2Rvd24iLCAicmVzdWx0IiwgImdldFBhcnNlciIsICJwcm9jZXNzb3IiLCAidHJlZSIsICJtYXJrZG93bnMiLCAibWQiLCAiY3JlYXRlUGFyc2VyIiwgIndyYXAiLCAiV09SS0VSX01PRFVMRV9QQVRIIiwgIlZJVEVfT1BUSU1JWkVEX0RFUFNfU0VHTUVOVCIsICJQQUNLQUdFX0RJU1RfV09SS0VSX1VSTCIsICJnZXRFbnZpcm9ubWVudCIsICJnZXRNYXhXb3JrZXJzIiwgImVudiIsICJjb3JlcyIsICJyZXNvbHZlQnJvd3NlcldvcmtlclVSTCIsICJtb2R1bGVVcmwiLCAiY3JlYXRlV29ya2VyIiwgIldvcmtlciIsICJQYXJzZXJXb3JrZXJQb29sIiwgIm9wdGlvbnMiLCAibWF4V29ya2VycyIsICJ3b3JrZXJQcm9taXNlcyIsICJ3b3JrZXIiLCAiV29ya2VyQ2xhc3MiLCAicGFyc2VyT3B0aW9ucyIsICJwcm94eSIsICJ3IiwgInJlc29sdmUiLCAiYXZhaWxhYmxlIiwgIm5leHQiLCAibWFya2Rvd24iLCAibWFya2Rvd25zIiwgIm1kIiwgImFjdGl2ZVdvcmtlcnMiLCAiYnVzeVdvcmtlcnMiLCAiY3JlYXRlV29ya2VyUG9vbCJdCn0K
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@markdown-next/parser",
3
- "version": "1.1.0",
3
+ "version": "1.1.1",
4
4
  "description": "Markdown parser for markdown-next with single-threaded and multi-threaded support",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",