logixlysia 6.9.4 → 6.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,8 +1,8 @@
1
- import{l as W0,m as _,n as v}from"./shared/Logixlysia-1ap5daz6.js";import{Elysia as x1}from"elysia";import{promises as b$}from"node:fs";import L0 from"node:path";var L$=/^(?<amount>\d+(?:\.\d+)?)(?<unit>[GKMgkm][Bb]?)$/u,R$=/^(?<amount>\d+)(?<unit>[dhw])$/iu,C$=/\.\d{4}-\d{2}-\d{2}-\d{2}-\d{2}-\d{2}(?:-\d{3})?(?:-\d+)?(?:\.gz)?$/u,h=($)=>{if(typeof $==="number"){if(!Number.isFinite($)||$<=0)throw Error(`Invalid size: ${$}`);return $}let Z=$.trim();if(Z!==""){let X=Number(Z);if(Number.isFinite(X)){if(X<=0)throw Error(`Invalid size: ${$}`);return X}}let J=Z.match(L$);if(!J)throw Error(`Invalid size format: ${$}`);let Q=Number(J[1]),j=J[2].toLowerCase(),B=1024;if(j.startsWith("m"))B=1048576;else if(j.startsWith("g"))B=1073741824;return Math.floor(Q*B)},g=($)=>{let Z=$.trim().match(R$);if(!Z)throw Error(`Invalid interval format: ${$}`);let J=Number(Z[1]),Q=Z[2].toLowerCase(),j=3600000;if(Q==="d")j=86400000;else if(Q==="w")j=604800000;return J*j},s=($)=>{if(typeof $==="number"){if(!(Number.isInteger($)&&$>0))throw Error(`maxFiles must be a positive integer, got ${$}`);return{type:"count",value:$}}return{type:"time",value:g($)}};var R0=async($)=>{let Z=L0.dirname($),J=L0.basename($),Q;try{Q=await b$.readdir(Z)}catch{return[]}return Q.filter((j)=>j.startsWith(`${J}.`)&&C$.test(j)).map((j)=>`${Z}/${j}`)};var P$=new Set(["dev","prod","json"]),w$=($)=>{let Z=$?.logRotation;if(!Z)return;try{if(Z.maxSize!==void 0)h(Z.maxSize);if(Z.maxFiles!==void 0)s(Z.maxFiles);if(Z.interval!==void 0)g(Z.interval);if(Z.compression!==void 0&&Z.compression!=="gzip")throw Error(`Invalid compression algorithm: ${Z.compression}`)}catch(J){let Q=J instanceof Error?J.message:String(J);throw Error(`logixlysia: invalid logRotation config — ${Q}`,{cause:J})}},T$=100,E$=($)=>typeof $==="number"&&Number.isFinite($)&&$>=0&&$<=T$,t=($)=>typeof $==="number"&&Number.isFinite($)&&$>=0,S$=["DEBUG","INFO","WARNING","ERROR"],f=($)=>{throw Error(`logixlysia: invalid sampling config — ${$}`)},j0=($)=>{throw Error(`logixlysia: invalid formatting config — ${$}`)},f$=($)=>{let Z=$?.sampling;if(!Z)return;for(let[j,B]of Object.entries(Z.head??{})){if(!S$.includes(j))f(`head.${j} is not a valid level (must be DEBUG, INFO, WARNING, or ERROR)`);if(!E$(B))f(`head.${j} must be a number between 0 and 100`)}let{tail:J}=Z;if(J?.status!==void 0&&!t(J.status))f("tail.status must be a non-negative number");if(J?.durationMs!==void 0&&!t(J.durationMs))f("tail.durationMs must be a non-negative number");if(J?.paths!==void 0){if(!Array.isArray(J.paths))f("tail.paths must be an array");if(J.paths.some((j)=>typeof j!=="string"||j.length===0))f("tail.paths must contain non-empty glob strings")}let{maxBufferedPerRequest:Q}=Z;if(Q!==void 0&&!(Number.isInteger(Q)&&Q>=0))f("maxBufferedPerRequest must be a non-negative integer")},q$=($)=>{let Z=$?.slowThreshold,J=$?.verySlowThreshold;if(Z!==void 0&&!t(Z))j0(`slowThreshold must be a finite non-negative number, got ${Z}`);if(J!==void 0&&!t(J))j0(`verySlowThreshold must be a finite non-negative number, got ${J}`);if(Z!==void 0&&J!==void 0&&Z>J)j0(`slowThreshold (${Z}) must not exceed verySlowThreshold (${J})`)},x$={dev:{pino:{prettyPrint:!0},showContextTree:!0,showStartupMessage:!0,startupMessageFormat:"banner",useColors:!0},json:{pino:{prettyPrint:!1},showContextTree:!1,showStartupMessage:!1,useColors:!1},prod:{autoRedact:!0,pino:{prettyPrint:!1},requestId:!0,showContextTree:!1,showStartupMessage:!1,useColors:!1}},k$=($,Z)=>{if(!Z)return $;let J={...$,...Z};if($.pino||Z.pino)J.pino={...$.pino,...Z.pino,...$.pino?.prettyPrint!==void 0||Z.pino?.prettyPrint!==void 0?{prettyPrint:Z.pino?.prettyPrint??$.pino?.prettyPrint}:{}};if($.logFilter||Z.logFilter)J.logFilter={...$.logFilter,...Z.logFilter};if($.sampling||Z.sampling)J.sampling={...$.sampling,...Z.sampling};if($.logRotation||Z.logRotation)J.logRotation={...$.logRotation,...Z.logRotation};if($.timestamp||Z.timestamp)J.timestamp={...$.timestamp,...Z.timestamp};return J},B0=($={})=>{let{preset:Z}=$;if(Z&&!P$.has(Z))throw Error(`logixlysia: invalid preset — ${Z}`);let J=Z?{...$,config:k$(x$[Z],$.config)}:$;return w$(J.config),f$(J.config),q$(J.config),J};var x=($,Z)=>{let J=0;return(Q,j)=>{if(j){try{j({error:Q,sink:$})}catch{}return}let B=Date.now();if(B-J<5000)return;J=B,console.error(`[logixlysia] ${Z}:`,Q)}};var y$=x("enricher","enricher failed"),C0=($)=>{if(!$?.length)return;let Z=[],J=[];for(let Q of $){if(typeof Q==="function"){Z.push(Q);continue}if(Q.request)Z.push(Q.request);if(Q.response)J.push(Q.response)}return Z.length===0&&J.length===0?void 0:{request:Z,response:J}},P0=($,Z,J,Q,j)=>{for(let B of $){let X;try{X=B(Z)}catch(G){y$(G,j);continue}if(X)J.mergeContext(Q,X)}},w0=($,Z,J,Q)=>{P0($.request,J,Z,J,Q)},T0=($,Z,J,Q)=>{P0($.response,J,Z,J.request,Q)};var m$=Object.freeze({}),E=($)=>{let Z="raw"in $?$.raw:void 0;return typeof Z==="object"&&Z!==null?Z:$},r=()=>{let $=new WeakMap,Z=(J)=>{let Q=E(J),j=$.get(Q);if(!j)j={},$.set(Q,j);return j};return{clearContext(J){$.delete(E(J))},getContext(J){let Q=$.get(E(J));return Q?{...Q}:{}},mergeContext(J,Q){if(Object.keys(Q).length===0)return;let j=Z(J);Object.assign(j,Q)},peekContext(J){return $.get(E(J))??m$}}},E0=($,Z)=>{let J=$.context,Q=Object.keys(Z).length>0,j=J!==void 0&&J!==null&&typeof J==="object"&&!Array.isArray(J)&&Object.keys(J).length>0;if(!(Q||j))return $;let B={...Z,...j?J:{}};return{...$,context:B}};import{AsyncLocalStorage as v$}from"node:async_hooks";var e=new v$,c=()=>{},X0={debug:c,error:c,info:c,mergeContext:c,warn:c},h$=()=>e.getStore()??X0;import{createRequire as S0}from"node:module";var g$=(()=>{try{return S0(import.meta.url)("elysia/package.json")}catch{return{}}})(),c$=(()=>{try{return S0(import.meta.url)("../../package.json")}catch{return{}}})(),p$=($,Z)=>{if($.length>=Z)return $.slice(0,Z);let J=Math.floor((Z-$.length)/2),Q=Z-$.length-J;return`${" ".repeat(J)}${$}${" ".repeat(Q)}`},f0=($,Z)=>{let{version:J}=g$,Q=J?`Elysia v${J}`:"Elysia",j=[{kind:"empty"},{kind:"center",text:Q},{kind:"empty"},{kind:"left",text:$}];if(Z)j.push({kind:"left",text:Z});j.push({kind:"empty"});let X=Math.max(Q.length,$.length,...Z?[Z.length]:[0])+4,G=`┌${"─".repeat(X)}┐`,Y=`└${"─".repeat(X)}┘`,V=`│${" ".repeat(X)}│`,W=[G];for(let I of j){if(I.kind==="empty"){W.push(V);continue}if(I.kind==="center"){W.push(`│${p$(I.text,X)}│`);continue}let{text:H}=I,U=Math.max(0,X-H.length-4);W.push(`│ ${H}${" ".repeat(U)} │`)}return W.push(Y),W.join(`
2
- `)},q0=()=>{let $=c$.version;if(!$)return null;return` logixlysia v${$}`};var Y0=($,Z)=>{if(!(Z.config?.showStartupMessage??!0))return;let{port:Q,hostname:j,protocol:B}=$;if(Q===void 0||!j||!B)return;let X=`${B}://${j}:${Q}`,G=`\uD83E\uDD8A Elysia is running at ${X}`,Y=`\uD83E\uDD8A ${X}`;if((Z.config?.startupMessageFormat??"banner")==="simple"){console.log(G);return}console.log(f0(Y,q0()))};import{StatusMap as d$}from"elysia";var u$=/^\d+$/u,l$=/[_-]+/gu,n$=/(?<before>[a-z0-9])(?<after>[A-Z])/gu,i$=/(?<before>[A-Z])(?<after>[A-Z][a-z])/gu,a$=/['’]/gu,o$=/[^a-z0-9\s]+/gu,s$=/\s+/gu,x0=($)=>{let Z=$.trim();if(!Z)return"";return Z.replace(l$," ").replace(n$,"$<before> $<after>").replace(i$,"$<before> $<after>").replace(a$,"").toLowerCase().replace(o$," ").replace(s$," ").trim()},t$=(()=>{let $=new Map;for(let[Z,J]of Object.entries(d$))$.set(x0(Z),J);return $})(),k=($)=>typeof $==="object"&&$!==null&&!($ instanceof Error)&&("code"in $)&&typeof $.code==="number"&&("response"in $),p=($)=>{if(typeof $==="number"&&Number.isFinite($))return $;if(typeof $==="string"){let Z=$.trim();if(u$.test(Z))return Number(Z);return t$.get(x0(Z))??500}return 500};import N$ from"pino";import C1 from"pino-pretty";var r$=/[.*+?^${}()|[\]\\]/gu,e$=/\*\*.*\*\*/u,$2=/\*\*/u,Z2=/[a-zA-Z0-9]/u,J2=($)=>$.replace(r$,"\\$&"),Q2=($)=>{if(!e$.test($))return!1;let Z=$.split($2);for(let J=1;J<Z.length;J+=1){let Q=Z[J];if(Q===""||Q.length<2&&!Z2.test(Q))return!0}return!1},k0=($)=>{if(Q2($))throw Error("Invalid glob pattern: repeated recursive wildcards (**) can cause performance issues");let Z="",J=0;while(J<$.length){let Q=$[J];if(Q==="*"){let j=$[J+1]==="*";Z+=j?".*":"[^/]*",J+=j?2:1;continue}if(Q==="?"){Z+="[^/]",J+=1;continue}Z+=J2(Q),J+=1}return new RegExp(`^${Z}$`,"u")};var $0=100,j2=100,y0=Object.freeze([]),B2=($)=>{if(!$)return;let Z=$.paths?.length?$.paths.map(k0):void 0;if($.durationMs===void 0&&$.status===void 0&&Z===void 0)return;return{durationMs:$.durationMs,paths:Z,status:$.status}},X2=($,Z)=>{if($.status!==void 0&&Z.status>=$.status)return!0;if($.durationMs!==void 0&&Z.durationMs>=$.durationMs)return!0;if($.paths){for(let J of $.paths)if(J.test(Z.pathname))return!0}return!1},Y2=($)=>{if(!$)return;let Z={},J=!1;for(let[Q,j]of Object.entries($))if(typeof j==="number"&&j<$0)Z[Q]=j,J=!0;return J?Z:void 0},G0=($,Z=Math.random)=>{let J=Y2($?.head);if(!J)return;let Q=B2($?.tail),j=$?.maxBufferedPerRequest??j2,B=new WeakMap,X=new WeakSet,G=new WeakSet;return{begin(Y){if(Q)X.add(Y)},buffer(Y,V){let W=B.get(Y);if(!W)W=[],B.set(Y,W);if(W.length>=j)return;W.push(V)},decide(Y,V){if(G.has(V))return"keep";let W=J[Y]??$0;if(W>=$0||W>0&&Z()*$0<W)return"keep";return Q&&X.has(V)?"buffer":"drop"},finalize(Y,V){X.delete(Y);let W=B.get(Y);if(B.delete(Y),!(Q&&X2(Q,V)))return y0;return G.add(Y),W??y0}}};var L=($)=>$===0n?0:Number(process.hrtime.bigint()-$)/1e6;var G2=/[a-zA-Z0-9._%+-]{1,64}@[a-zA-Z0-9.-]{1,253}\.[a-zA-Z]{2,63}/gu,V2=/(?<![\w/.])(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?![\w.])/gu,W2=/(?<![\w:])(?:(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|(?:[0-9a-fA-F]{1,4}:){1,7}:(?:[0-9a-fA-F]{1,4}(?::[0-9a-fA-F]{1,4}){0,6})?|::(?:[0-9a-fA-F]{1,4}(?::[0-9a-fA-F]{1,4}){0,6}))(?![\w:])/gu,z2=/\b(?:\d[ -]*?){13,19}\b/gu,H2=/eyJ[a-zA-Z0-9_-]+\.eyJ[a-zA-Z0-9_-]+\.[a-zA-Z0-9_-]+/gu;var v0=["authorization","proxy-authorization","cookie","set-cookie","x-api-key","api-key","apikey","x-auth-token","password","passwd","secret","client-secret","token","access-token","refresh-token","id-token","session","session-id","private-key","credit-card","card-number","cvv","ssn"],N2=/(?<before>[a-z0-9])(?<after>[A-Z])/gu,m0=($)=>$.replace(N2,"$<before>-$<after>").replaceAll("_","-").toLowerCase(),U2=new Set(["passwd","password","secret"]);var y=($,Z)=>{let J=m0($);if(v0.includes(J))return!0;if(Z?.some((j)=>m0(j)===J))return!0;let Q=J.split("-");return Q.some((j)=>U2.has(j))||Q.at(-1)==="token"},h0=($)=>{return[...v0,...$??[]].flatMap((J)=>{if(J.includes("-"))return[`["${J}"]`,`*["${J}"]`];return[J,`*.${J}`]})},I2=($)=>{if($.length<13||$.length>19)return!1;let Z=0,J=!1;for(let Q=$.length-1;Q>=0;Q-=1){let j=$.codePointAt(Q)??0;if(j<48||j>57)return!1;let B=j-48;if(J){if(B*=2,B>9)B-=9}Z+=B,J=!J}return Z%10===0},F2=($)=>$.replace(z2,(Z)=>{let J=Z.replaceAll(/\D/gu,"");if(J.length>=13&&J.length<=19&&I2(J))return"[REDACTED]";return Z}),P=($)=>{let Z=$;return Z=Z.replace(G2,"[REDACTED]"),Z=Z.replace(V2,"[REDACTED]"),Z=Z.replace(W2,"[REDACTED]"),Z=F2(Z),Z=Z.replace(H2,"[REDACTED]"),Z};var V0=($)=>P($).replaceAll("[REDACTED]","redacted"),g0=($,Z)=>{let J=new URLSearchParams;for(let[Q,j]of $)J.append(Q,y(Q,Z)?"redacted":P(j));return J},O2=($)=>{let Z=$;try{Z=decodeURIComponent($)}catch{}let J=P(Z);if(Z===$)return J;return J===Z?$:encodeURIComponent(J)},c0=($,Z)=>{try{let J=new URL($);if(J.username!=="")J.username=V0(J.username);if(J.password!=="")J.password=V0(J.password);J.hostname=V0(J.hostname),J.pathname=J.pathname.split("/").map(O2).join("/");let Q=g0(J.searchParams,Z).toString();if(Q!==J.searchParams.toString())J.search=Q;return J.hash=P(J.hash),J.toString()}catch{return P($).replaceAll("[REDACTED]","redacted")}},M2=($,Z)=>{let J=new Headers;for(let[Q,j]of $)J.append(Q,y(Q,Z)?"[REDACTED]":P(j));return J},d=($,Z,J)=>{Z.add($);try{return J()}finally{Z.delete($)}},C={array:($,Z,J)=>{let Q;for(let[j,B]of $.entries()){let X=C.value(B,Z,J);if(Q===void 0&&X!==B)Q=$.slice(0,j);Q?.push(X)}return Q??$},error:($,Z,J)=>{let Q=P($.message),j=Object.getPrototypeOf($),B=Object.create(j);if(B.message=Q,B.name=$.name,$.stack!==void 0)B.stack=P($.stack);let X=$;for(let G of Object.getOwnPropertyNames(X)){if(G==="message"||G==="name"||G==="stack")continue;let Y=Object.getOwnPropertyDescriptor(X,G);if(Y===void 0)continue;if(Y.get!==void 0||Y.set!==void 0){Object.defineProperty(B,G,Y);continue}let V=y(G,J)?"[REDACTED]":C.value(Y.value,Z,J);Object.defineProperty(B,G,{...Y,value:V})}return B},map:($,Z,J)=>{let Q=new Map;for(let[j,B]of $){let X=typeof j==="string"&&y(j,J);Q.set(j,X?"[REDACTED]":C.value(B,Z,J))}return Q},record:($,Z,J)=>{let Q=Object.keys($),j;for(let[B,X]of Q.entries()){let G=$[X],Y=y(X,J),V=Y?"[REDACTED]":C.value(G,Z,J);if(j===void 0&&(Y||V!==G)){j={};for(let W of Q.slice(0,B))j[W]=$[W]}if(j!==void 0)j[X]=V}return j??$},set:($,Z,J)=>new Set(Array.from($,(Q)=>C.value(Q,Z,J))),value:($,Z,J)=>{if(typeof $==="string")return P($);if($===null||typeof $!=="object")return $;if($ instanceof Date)return $;if(Z.has($))return"[Circular]";if($ instanceof Headers)return M2($,J);if($ instanceof URLSearchParams)return g0($,J);if($ instanceof URL)try{return new URL(c0($.href,J))}catch{return"[REDACTED]"}if($ instanceof Map)return d($,Z,()=>C.map($,Z,J));if($ instanceof Set)return d($,Z,()=>C.set($,Z,J));if($ instanceof Error)return d($,Z,()=>C.error($,Z,J));if(Array.isArray($))return d($,Z,()=>C.array($,Z,J));return d($,Z,()=>C.record($,Z,J))}},p0=($,Z)=>C.value($,new WeakSet,Z),d0=($,Z)=>{let J=c0($.url,Z),Q=new Headers,j=!1;for(let[V,W]of $.headers.entries()){let I=y(V,Z)?"[REDACTED]":P(W);if(I!==W)j=!0;Q.set(V,I)}let B=P($.method),X=J!==$.url,G=B!==$.method;if(!(X||j||G))return $;let Y={headers:Q,method:B,redirect:$.redirect,signal:$.signal};return new Request(J,Y)};import{STATUS_CODES as A2}from"node:http";import M from"chalk";import{STATUS_CODES as D2}from"node:http";var u=($)=>{if($ instanceof Error)return W0($.message);if($&&typeof $==="object"&&"message"in $)return W0($.message);return String($)},z0=($)=>typeof $==="object"&&$!==null&&(("why"in $)||("fix"in $)||("link"in $)||("code"in $)||("internal"in $)),K2=($)=>$ instanceof Error&&($.code==="VALIDATION"||$.name==="ValidationError"||$.constructor?.name==="ValidationError"),_2=["code","fix","internal","link","message","name","status","why"],u0=($)=>{let Z={};for(let J of _2)if($[J]!==void 0)Z[J]=$[J];return Z},l0=($,Z)=>{if(k($)){let J=typeof $.response==="string"&&$.response!==""?$.response:D2[$.code]??`HTTP ${$.code}`;return{error:{message:J,name:"StatusResponse",status:$.code},message:J}}if(K2($)&&!Z){let Q=(Array.isArray($.all)?$.all:[]).map((X)=>typeof X==="object"&&X!==null&&("path"in X)?String(X.path):"").filter(Boolean),j=typeof $.type==="string"?$.type:"request",B=Q.length>0?`Validation failed (${j}): ${Q.join(", ")}`:`Validation failed (${j})`;return{error:{failedPaths:Q,name:"ValidationError",type:j},message:B}}if($ instanceof Error){let J=u0($);return J.message=$.message,J.name=$.name==="Error"?$.constructor?.name??$.name:$.name,{error:J,message:u($)}}if(z0($))return{error:u0($),message:u($)};return{error:{value:String($)},message:u($)}};var l=($)=>String($).padStart(2,"0"),b2=($)=>String($).padStart(3,"0"),L2=500,R2=1000,C2=7,P2=256,w2="{now} {service}{icon} {method} {pathname} {status} {duration} {message}{speed}",i0=/\{(?:now|epoch|level|icon|duration|method|pathname|path|query|status|statusText|message|ip|context|service|speed|requestId)\}/gu,a0=($)=>{let{config:Z}=$,J=Z?.useColors??!0,Q=typeof process<"u"&&process.stdout?.isTTY===!0;return J&&Q},T2="yyyy-mm-dd HH:MM:ss.SSS",n0=4,E2=($)=>{let Z=$.slice(0,n0).toLowerCase(),J=Z==="utc:",Q=J||Z==="sys:"?$.slice(n0):$;return{pattern:Q==="standard"?T2:Q,utc:J}},S2=($,Z)=>{if(!Z)return $.toISOString();let{pattern:J,utc:Q}=E2(Z),j=String(Q?$.getUTCFullYear():$.getFullYear()),B=l((Q?$.getUTCMonth():$.getMonth())+1),X=l(Q?$.getUTCDate():$.getDate()),G=l(Q?$.getUTCHours():$.getHours()),Y=l(Q?$.getUTCMinutes():$.getMinutes()),V=l(Q?$.getUTCSeconds():$.getSeconds()),W=b2(Q?$.getUTCMilliseconds():$.getMilliseconds());return J.replaceAll("yyyy",j).replaceAll("mm",B).replaceAll("dd",X).replaceAll("HH",G).replaceAll("MM",Y).replaceAll("ss",V).replaceAll("SSS",W)},f2=($)=>{let Z=$.headers.get("x-forwarded-for"),J=Z?Z.split(",")[0]?.trim()??"":$.headers.get("x-real-ip")??"";return _(J,64)},q2=($)=>{if($>=1000){let Z=$/1000;if(Z>=10)return`${Math.round(Z)}s`;let J=Z.toFixed(1);return J.endsWith(".0")?`${Math.round(Z)}s`:`${J}s`}if($>0&&$<1)return`${$.toFixed(2)}ms`;return`${Math.round($)}ms`},x2=($)=>{let{config:Z}=$;return{slow:Z?.slowThreshold??L2,verySlow:Z?.verySlowThreshold??R2}},k2=($,Z,J,Q)=>{let j=q2($),B=$>=Q;if(!Z)return{isVerySlow:B,text:j};let X=j;if($<J)X=M.green(j);else if($<Q)X=M.yellow(j);else X=M.red.bold(j);return{isVerySlow:B,text:X}},y2=($,Z)=>{if(!$)return"";let J="⚡ slow";if(!Z)return` ${J}`;return` ${M.yellow(J)}`},m2=($,Z)=>{if(!Z)return"\uD83E\uDD8A";if($==="ERROR")return M.bgRed.black(" \uD83E\uDD8A ");if($==="WARNING")return M.bgYellow.black(" \uD83E\uDD8A ");if($==="DEBUG")return M.bgBlue.black(" \uD83E\uDD8A ");return M.bgGreen.black(" \uD83E\uDD8A ")},v2=($,Z)=>{if(!Z)return $;if($==="ERROR")return M.bgRed.black($);if($==="WARNING")return M.bgYellow.black($);if($==="DEBUG")return M.bgBlue.black($);return M.bgGreen.black($)},h2=($,Z)=>{if(!Z)return $;let J=$.toUpperCase();if(J==="GET")return M.green.bold(J);if(J==="POST")return M.blue.bold(J);if(J==="PUT")return M.yellow.bold(J);if(J==="PATCH")return M.yellowBright.bold(J);if(J==="DELETE")return M.red.bold(J);if(J==="OPTIONS")return M.cyan.bold(J);if(J==="HEAD")return M.greenBright.bold(J);if(J==="TRACE")return M.magenta.bold(J);if(J==="CONNECT")return M.cyanBright.bold(J);return M.white.bold(J)},g2=($,Z)=>{let J=$.toUpperCase(),Q=" ".repeat(Math.max(0,C2-J.length));return h2(J,Z)+Q},c2=($,Z)=>{let J=String($);if(!(Z&&Number.isFinite($)))return J;if($>=500)return M.red(J);if($>=400)return M.yellow(J);if($>=300)return M.cyan(J);if($>=200)return M.green(J);return M.gray(J)},p2=($,Z)=>{if(!Z)return $;return M.gray($)},d2=($,Z)=>{if(!Z)return $;return M.whiteBright($)},u2=($)=>{return A2[$]??""},l2=($,Z)=>{let J=$.config?.service?.trim();if(!J)return"";let Q=`[${J}]`;if(!Z)return`${Q} `;return`${M.dim(Q)} `},H0=($)=>{let{config:Z}=$,J=a0($),Q=Z?.customLogFormat??w2,j=new Set(Q.match(i0)),{slow:B,verySlow:X}=x2($),G=l2($,J);return{format:Q,serviceToken:G,slowThreshold:B,tokens:j,useColors:J,verySlowThreshold:X}},o0=($)=>{if($===null)return"null";if($===void 0)return"undefined";if(typeof $==="string")return _($);if(typeof $==="number"||typeof $==="bigint"||typeof $==="boolean")return String($);if($ instanceof Error)return _($.message);return _($)},n2=($)=>$!==null&&typeof $==="object"&&!Array.isArray($)&&!($ instanceof Error)&&!($ instanceof Date),s0=($,Z,J)=>{let Q=[];for(let[j,B]of Object.entries($)){let X=_(j,P2),G=Z?`${Z}.${X}`:X;if(n2(B)&&J>1)Q.push(...s0(B,G,J-1));else Q.push([G,o0(B)])}return Q},i2=($,Z)=>{if($.length===0)return[];let J=[],Q=$.length-1;for(let j=0;j<$.length;j+=1){let B=j===Q?"└─":"├─",X=$[j];if(!X)continue;let[G,Y]=X,V=Z?M.cyan(G):G,W=Z?M.white(Y):Y;J.push(` ${B} ${V} ${W}`)}return J},a2=($)=>{let Z=[],J=u($);if(J)Z.push(["error",_(J)]);if(z0($)){if($.code!==void 0)Z.push(["error.code",_($.code)]);if($.why!==void 0)Z.push(["error.why",_($.why)]);if($.fix!==void 0)Z.push(["error.fix",_($.fix)]);if($.link!==void 0)Z.push(["error.link",_($.link)]);if($.internal!==void 0)Z.push(["error.internal",o0($.internal)])}return Z},o2=($,Z,J,Q=a0(J))=>{if(J.config?.showContextTree===!1)return[];let j=J.config?.contextDepth??1,B=[],X=Z.context;if(X&&typeof X==="object"&&!Array.isArray(X)&&Object.keys(X).length>0&&j>=1)B.push(...s0(X,"",j));if(($==="ERROR"||$==="WARNING")&&Z.error!==void 0)B.push(...a2(Z.error));return i2(B,Q)},s2=($)=>{if(typeof $==="object"&&$!==null)return _($,Number.POSITIVE_INFINITY);return""},t2=($,Z,J)=>{if(!($.has("{now}")||$.has("{epoch}")))return{epoch:"",timestamp:""};let Q=new Date,j=$.has("{epoch}")?String(Q.getTime()):"";if(!$.has("{now}"))return{epoch:j,timestamp:""};let B=S2(Q,Z);return{epoch:j,timestamp:p2(B,J)}},r2=($,Z)=>{if(!$.has("{message}"))return"";return typeof Z.message==="string"?_(Z.message):""},e2=($,Z,J,Q,j)=>{let B=$.has("{pathname}")||$.has("{path}"),X=$.has("{query}");if(!(B||X))return{coloredPathname:"",query:""};let G,Y;if(j)({pathname:G,search:Y}=j);else try{({pathname:G,search:Y}=new URL(Z.url))}catch{G=_(Z.url||"/",1024),Y=""}let V=X?Y:"";if(!B)return{coloredPathname:"",query:V};let W=J?.logQueryParams?`${G}${Y}`:G;return{coloredPathname:d2(W,Q),query:V}},$1=($,Z,J)=>{let Q=$.has("{status}"),j=$.has("{statusText}");if(!(Q||j))return{coloredStatus:"",statusText:""};let B=Z.status,X=B===null||B===void 0?200:p(B);return{coloredStatus:Q?c2(X,J):"",statusText:j?u2(X):""}},Z1=($,Z,J)=>J?.ip===!0&&$.has("{ip}")?f2(Z):"",J1=($)=>$!==null&&$!==void 0&&typeof $==="object"&&!Array.isArray($)&&Object.keys($).length>0,Q1=($,Z,J)=>{if(!$.has("{context}"))return"";if(J?.showContextTree!==!1&&J1(Z.context))return"";return s2(Z.context)},j1=($,Z,J,Q,j,B)=>{let X=$.has("{duration}"),G=$.has("{speed}");if(!(X||G))return{coloredDuration:"",speedToken:""};let Y=B?.durationMs??L(Z.beforeTime),{text:V,isVerySlow:W}=k2(Y,J,Q,j);return{coloredDuration:X?V:"",speedToken:G?y2(W,J):""}},B1=($,Z)=>{if(!$.has("{requestId}"))return"";let J=Z.context;if(typeof J!=="object"||J===null||!("requestId"in J))return"";return _(String(J.requestId),128)},t0=({level:$,request:Z,data:J,store:Q,options:j,formatContext:B,precomputed:X})=>{let{config:G}=j,{format:Y,serviceToken:V,slowThreshold:W,tokens:I,useColors:H,verySlowThreshold:U}=B??H0(j),{timestamp:O,epoch:A}=t2(I,G?.timestamp?.translateTime,H),D=r2(I,J),{coloredPathname:R,query:w}=e2(I,Z,G,H,X),{coloredStatus:J0,statusText:o}=$1(I,J,H),A0=Z1(I,Z,G),Q0=Q1(I,J,G),z=I.has("{level}")?v2($,H):"",N=I.has("{method}")?g2(Z.method,H):"",{coloredDuration:F,speedToken:K}=j1(I,Q,H,W,U,X),b=I.has("{icon}")?m2($,H):"",S=B1(I,J),_$={"{context}":Q0,"{duration}":F,"{epoch}":A,"{icon}":b,"{ip}":A0,"{level}":z,"{message}":D,"{method}":N,"{now}":O,"{pathname}":R,"{path}":R,"{query}":w,"{requestId}":S,"{service}":V,"{speed}":K,"{statusText}":o,"{status}":J0},A$=Y.replace(i0,(b0)=>_$[b0]??b0);return{contextLines:o2($,J,j,H),main:A$}};var N0=x("transport","transport failed"),X1=1024,m=new Set,Y1=async($,Z)=>{if(m.size>=X1){let J=m.values().next().value;if(J)m.delete(J)}m.add($);try{await $}catch(J){N0(J,Z)}finally{m.delete($)}},r0=($)=>{let{level:Z,request:J,data:Q,store:j,options:B,precomputed:X}=$,G=B.config?.transports??[];if(G.length===0)return;let Y=B.config?.onError,V=typeof Q.message==="string"?Q.message:"",W={request:{method:J.method,url:J.url},...Q,durationMs:X?.durationMs??L(j.beforeTime)};for(let I of G)try{let H=I.log(Z,V,W);if(H)Y1(H,Y)}catch(H){N0(H,Y)}},e0=($,Z)=>{let J=$.config?.onError;return($.config?.transports??[]).map(async(Q)=>{try{await Promise.resolve(),await Q[Z]?.()}catch(j){N0(j,J)}})},$$=async($)=>{await Promise.allSettled([...m,...e0($,"flush")])},Z$=async($)=>{await Promise.allSettled(e0($,"close"))};import{open as M1}from"node:fs/promises";import D1 from"node:path";import{promises as G1}from"node:fs";var J$=async($,Z=448)=>{await G1.mkdir($,{mode:Z,recursive:!0})};import{promises as T}from"node:fs";import{promisify as V1}from"node:util";import{gzip as W1}from"node:zlib";var Q$=()=>{let $=new Map;return{acquire:async(J)=>{let Q=$.get(J)??Promise.resolve(),{promise:j,resolve:B}=Promise.withResolvers();return $.set(J,j),await Q,()=>{if(B(),$.get(J)===j)$.delete(J)}}}};var z1=V1(W1),H1=Q$(),j$=($,Z,J)=>{if(J){J(Z);return}console.error($,Z)},n=($)=>String($).padStart(2,"0"),N1=($,Z)=>{let J=Z.getFullYear(),Q=n(Z.getMonth()+1),j=n(Z.getDate()),B=n(Z.getHours()),X=n(Z.getMinutes()),G=n(Z.getSeconds()),Y=String(Z.getMilliseconds()).padStart(3,"0");return`${$}.${J}-${Q}-${j}-${B}-${X}-${G}-${Y}`},U1=async($)=>{try{if((await T.stat($)).size===0)return""}catch{return""}let J=`${N1($,new Date)}-${process.hrtime.bigint()}`;return await T.rename($,J),J},I1=async($,Z)=>{let J=await H1.acquire($);try{try{await T.access($)}catch{return}let Q=await T.readFile($),j=await z1(Q);await T.writeFile(`${$}.gz`,j),await T.rm($,{force:!0})}catch(Q){throw j$(`[logixlysia] Failed to compress file ${$}:`,Q,Z),Q}finally{J()}};var F1=($)=>$.status==="fulfilled",O1=async($,Z,J)=>{let Q=await R0($);if(Q.length===0)return;if(Z.type==="count"&&Q.length<=Z.value)return;let B=(await Promise.allSettled(Q.map(async(Y)=>({path:Y,stat:await T.stat(Y)})))).filter(F1).map((Y)=>Y.value),X;if(Z.type==="count"){if(B.length<=Z.value)return;B.sort((Y,V)=>V.stat.mtimeMs-Y.stat.mtimeMs),X=B.slice(Z.value)}else{let Y=Date.now();X=B.filter(({stat:V})=>Y-V.mtimeMs>Z.value)}let G=await Promise.allSettled(X.map(({path:Y})=>T.rm(Y,{force:!0})));for(let[Y,V]of G.entries())if(V.status==="rejected")j$(`[logixlysia] Failed to delete rotated log ${X[Y].path}:`,V.reason,J)},B$=async($,Z,J)=>{let Q=await U1($);if(!Q)return;if(Z.compress===!0){if((Z.compression??"gzip")==="gzip")try{await I1(Q,J)}catch{}}if(Z.maxFiles!==void 0){let B=s(Z.maxFiles);await O1($,B,J)}};var K1=($,Z)=>$&&$>0?$:Z,i=new Map;class X${filePath;handle=null;bytesWritten=0;openedAt=0;latestOptions={};pendingBatch=null;flushChain=Promise.resolve();constructor($){this.filePath=$}write($,Z){this.latestOptions=Z;let{promise:J,reject:Q,resolve:j}=Promise.withResolvers();if(this.pendingBatch)return this.pendingBatch.lines.push($),this.pendingBatch.resolvers.push({reject:Q,resolve:j}),J;let B={lines:[$],resolvers:[{reject:Q,resolve:j}]};return this.pendingBatch=B,queueMicrotask(()=>{this.pendingBatch=null,this.flushChain=this.flushAfter(this.flushChain,B)}),J}async flushAfter($,Z){await v($),await this.flushBatch(Z)}async flushBatch($){let Z=this.latestOptions,J=$.lines.join("");try{await this.ensureOpen(Z),await this.handle.write(J),this.bytesWritten+=Buffer.byteLength(J)}catch(Q){for(let j of $.resolvers)j.reject(Q);return}await this.maybeRotate(Z);for(let Q of $.resolvers)Q.resolve()}async ensureOpen($){if(this.handle)return;await J$(D1.dirname(this.filePath),$.logDirMode);let Z=await M1(this.filePath,"a",$.logFileMode??384),J=await Z.stat();this.handle=Z,this.bytesWritten=J.size,this.openedAt=K1(J.birthtimeMs,Date.now())}shouldRotateNow($){if($.maxSize!==void 0&&this.bytesWritten>h($.maxSize))return!0;return $.interval!==void 0&&Date.now()-this.openedAt>=g($.interval)}async maybeRotate($){let Z=$.logRotation;if(!Z||Z.maxSize===void 0&&Z.interval===void 0)return;try{if(!this.shouldRotateNow(Z))return;let{handle:J}=this;this.handle=null,this.bytesWritten=0,this.openedAt=Date.now(),await J?.close(),await B$(this.filePath,Z,$.onRotationError)}catch(J){if($.onRotationError)$.onRotationError(J);else console.error(`[logixlysia] Failed to rotate log file ${this.filePath}:`,J)}}async flush(){await Promise.resolve(),await this.flushChain}async close(){await this.flush();let{handle:$}=this;this.handle=null,await $?.close(),i.delete(this.filePath)}}var Y$=($)=>{let Z=i.get($);if(!Z)Z=new X$($),i.set($,Z);return Z},G$=async()=>{await Promise.allSettled([...i.values()].map(($)=>$.flush()))},V$=async()=>{await Promise.allSettled([...i.values()].map(($)=>$.close()))};var _1=($,Z,J)=>{if(J){let{pathname:Q,search:j}=J;return Z?`${Q}${j}`:Q}try{let{pathname:Q,search:j}=new URL($.url);return Z?`${Q}${j}`:Q}catch{return $.url}},W$=($,Z,J,Q)=>{let j=$?.onError;if(!j){console.error(J,Q);return}try{j({error:Q,sink:Z})}catch{}},z$=async($)=>{let{filePath:Z,level:J,request:Q,data:j,store:B,options:X,precomputed:G}=$,{config:Y}=X,V=Y?.useTransportsOnly===!0,W=Y?.disableFileLogging===!0;if(V||W)return;let I=typeof j.message==="string"?j.message:"",H=G?.durationMs??L(B.beforeTime),U=_1(Q,Y?.logQueryParams,G),O=`${J} ${H.toFixed(2)}ms ${Q.method} ${_(U,1024)} ${_(I)}
3
- `,A=Y?.onError?(D)=>W$(Y,"rotation","",D):void 0;try{await Y$(Z).write(O,{logDirMode:Y?.logDirMode,logFileMode:Y?.logFileMode,logRotation:Y?.logRotation,onRotationError:A})}catch(D){throw W$(Y,"file",`[logixlysia] Failed to write to log file ${Z}:`,D),D}};var Z0=($)=>{let Z=$?.useTransportsOnly===!0,J=$?.disableInternalLogger===!0,Q=$?.disableFileLogging===!0,j=($?.transports?.length??0)>0,B=!(Z||Q)&&!!$?.logFilePath,X=!(Z||J);return{hasFileLogging:B,hasInternalLogger:X,hasTransports:j,isEffectivelyDisabled:!(j||B||X),needsUrlParts:B||X}},q=($,Z)=>{if(!Z?.level||Z.level.length===0)return!0;return Z.level.includes($)},U0=($)=>{try{let{pathname:Z,search:J}=new URL($.url);return{pathname:Z,search:J}}catch{return{pathname:$.url||"/",search:""}}},A1=($,Z,J,Q)=>{let j=Q??L($.beforeTime),{pathname:B,search:X}=J?U0(Z):{pathname:"",search:""};return{durationMs:j,pathname:B,search:X}},b1=($)=>{switch($){case"DEBUG":return console.debug;case"INFO":return console.info;case"WARNING":return console.warn;case"ERROR":return console.error;default:return console.log}},I0=x("format","failed to build a log record"),L1=({contextStore:$,data:Z,durationOverride:J,formatContext:Q,level:j,options:B,request:X,sinks:G,store:Y})=>{let{config:V}=B,W=E0(Z,$.peekContext(X)),I=V?.autoRedact===!0?p0(W,V?.redactKeys):W,H=V?.autoRedact===!0?d0(X,V?.redactKeys):X,U=A1(Y,H,G.needsUrlParts,J);if(G.hasTransports)r0({data:I,level:j,options:B,precomputed:U,request:H,store:Y});if(G.hasFileLogging){let R=V?.logFilePath;if(R)v(z$({data:I,filePath:R,level:j,options:B,precomputed:U,request:H,store:Y}))}if(!G.hasInternalLogger)return;let{main:O,contextLines:A}=t0({data:I,formatContext:Q,level:j,options:B,precomputed:U,request:H,store:Y}),D=A.length>0?`${O}
4
- ${A.join(`
5
- `)}`:O;b1(j)(D)},a=($)=>{let{bypassSampling:Z,data:J,level:Q,options:j,request:B,sampling:X,sinks:G,store:Y}=$,{config:V}=j;if(G.isEffectivelyDisabled||!q(Q,V?.logFilter))return;if(X&&!Z){let W=X.decide(Q,B);if(W==="drop")return;if(W==="buffer"){X.buffer(B,{data:J,durationMs:L(Y.beforeTime),level:Q});return}}try{L1($)}catch(W){I0(W,V?.onError)}};var R1=($)=>typeof $==="object"&&$!==null&&("status"in $)&&typeof $.status==="number",F0=($)=>{if(k($))return $.code;return R1($)?$.status:500},H$=($,Z,J,Q,j,B,X,G)=>{let{config:Y}=Q,V=F0(Z),W=V>=400&&V<500?"WARNING":"ERROR";if(B.isEffectivelyDisabled||!q(W,Y?.logFilter))return;try{let{error:I,message:H}=l0(Z,Y?.logErrorPayload===!0);a({contextStore:j,data:{error:I,message:H,status:V},formatContext:X,level:W,options:Q,request:$,sampling:G,sinks:B,store:J})}catch(I){I0(I,Y?.onError)}};var P1={beforeTime:0n},w1=($,Z)=>{let J=$?.pino,{prettyPrint:Q,...j}=J??{},B=typeof Q==="object"&&Q!==null?Q:void 0,G=(Q===!0||B!==void 0)&&j.transport===void 0,Y=B?.messageKey??j.messageKey,V=B?.errorKey??j.errorKey,W={...j,errorKey:V,level:j.level??"info",messageKey:Y,...$?.autoRedact===!0&&j.redact===void 0?{redact:{censor:"[REDACTED]",paths:h0($?.redactKeys)}}:{}},I=()=>C1({colorize:process.stdout?.isTTY===!0,translateTime:$?.timestamp?.translateTime,...B,errorKey:V,messageKey:Y}),H,U=()=>{if(!H)H=G?Z(W,I()):Z({...W,transport:j.transport});return H},O=new Proxy({},{get(A,D){let R=U(),w=R[D];return typeof w==="function"?w.bind(R):w},has:(A,D)=>(D in U())});if($?.pino!==void 0)U();return O},U$=($={},Z=N$,J)=>{let Q=J??r(),{config:j}=$,B=H0($),X=w1(j,Z),G=Z0(j),Y=G0(j?.sampling),V=(H,U,O,A)=>{a({contextStore:Q,data:O,formatContext:B,level:H,options:$,request:U,sampling:Y,sinks:G,store:A})},W=(H,U,O)=>{if(!Y)return;let A={durationMs:L(U.beforeTime),pathname:U0(H).pathname,status:O};for(let D of Y.finalize(H,A))a({bypassSampling:!0,contextStore:Q,data:D.data,durationOverride:D.durationMs,formatContext:B,level:D.level,options:$,request:H,sampling:Y,sinks:G,store:P1})},I=(H,U,O,A)=>{if(G.isEffectivelyDisabled||!q(H,j?.logFilter))return;let D={beforeTime:process.hrtime.bigint()};V(H,U,{context:A,message:O},D)};return{beginRequest:(H)=>{Y?.begin(H)},debug:(H,U,O)=>{I("DEBUG",H,U,O)},error:(H,U,O)=>{I("ERROR",H,U,O)},finalizeRequest:W,getContext:(H)=>Q.getContext(H),handleHttpError:(H,U,O)=>{H$(H,U,O,$,Q,G,B,Y)},info:(H,U,O)=>{I("INFO",H,U,O)},log:V,mergeContext:(H,U)=>{Q.mergeContext(H,U)},pino:X,warn:(H,U,O)=>{I("WARNING",H,U,O)}}},O0=($,Z)=>U$($,N$,Z);var T1=/^[A-Za-z0-9._-]{1,128}$/u,M0=($)=>{if($===void 0||$===!1)return null;if($===!0)return{enabled:!0,generator:()=>crypto.randomUUID(),header:"X-Request-Id"};if($.enabled===!1)return null;return{enabled:!0,generator:$.generator??(()=>crypto.randomUUID()),header:$.header?.trim()||"X-Request-Id"}},D0=($,Z)=>{let J=$.headers.get(Z.header);if(J&&T1.test(J))return J;return Z.generator()};var I$=async($,Z)=>{let J=v($);if(Z<=0)return!0;let Q=Promise.withResolvers(),j=setTimeout(()=>Q.resolve("timeout"),Z);j.unref?.();let B=await Promise.race([J,Q.promise]);return clearTimeout(j),B==="timeout"},F$=($,Z)=>{let J=Error(`[logixlysia] shutdown flush did not complete within ${Z}ms; some transport or file writes may not have been flushed.`);if($){try{$({error:J,sink:"shutdown"})}catch{}return}console.error(J.message)},K0=async($)=>{await Promise.allSettled([$$($),G$()])};var O$=new Map,E1=($)=>{let Z=O$.get($);if(!Z)Z=new Request(`http://logixlysia.local${$}`,{method:"WS"}),O$.set($,Z);return Z},S1=($)=>{if($ instanceof ArrayBuffer||ArrayBuffer.isView($))return"binary";if(typeof $==="string")return"string";return typeof $},_0=($,Z,J)=>{let Q=new WeakMap,j=(B,X,G,Y,V)=>{let I={beforeTime:Q.get(E(X))??process.hrtime.bigint()},H=J.peekContext(X),U=Object.keys(H).length>0||V?{...H,...V,wsId:X.id}:{wsId:X.id};Z.log(B,E1(G),{context:U,message:Y,status:200},I)};return(B,X)=>{if(typeof B!=="string")throw TypeError("logixlysia: wrapWs(path, hooks) expects the route path first, e.g. plugin.wrapWs('/chat', { open(ws) {} })");return{...X,close(G,Y,V){try{X.close?.(G,Y,V)}finally{if($.config?.disableWebSocketLogging!==!0){let W={};if(Y!==void 0)W.code=Y;if(V!==void 0)W.reason=V;j("INFO",G,B,"WebSocket closed",Object.keys(W).length>0?W:void 0)}J.clearContext(G),Q.delete(E(G))}},message(G,Y){try{X.message?.(G,Y)}finally{if($.config?.disableWebSocketLogging!==!0)j("INFO",G,B,"WebSocket message",{payloadType:S1(Y)})}},open(G){Q.set(E(G),process.hrtime.bigint());try{X.open?.(G)}finally{if($.config?.disableWebSocketLogging!==!0)j("INFO",G,B,"WebSocket opened")}}}}};var f1=new Set([101,103,204,205,304]);var q1=($)=>$>=200&&$<=599&&!f1.has($)?$:500;class M$ extends Error{code;fix;link;status;why;constructor($,Z,J={}){super(Z);if(this.status=$,this.code=J.code,this.fix=J.fix,this.link=J.link,this.why=J.why,this.name="HttpError",Object.defineProperty(this,"name",{enumerable:!1}),Object.defineProperty(this,"internal",{configurable:!0,enumerable:!1,value:J.internal,writable:!1}),J.code!==void 0||J.why!==void 0||J.fix!==void 0||J.link!==void 0)Object.defineProperty(this,"toResponse",{configurable:!0,enumerable:!1,value:()=>Response.json(this.toJSON(),{status:q1(this.status)}),writable:!0})}toJSON(){return{code:this.code,fix:this.fix,link:this.link,message:this.message,status:this.status,why:this.why}}}var D$=200,k1=($,Z)=>{if(k(Z))return Z.code;if(Z instanceof Response&&Z.status!==D$)return Z.status;if($===void 0||$===null)return D$;return p($)},y1=($)=>{if($>=500)return"ERROR";if($>=400)return"WARNING";return"INFO"},m1=5000,v1=($,Z)=>{let J={};if(Z)for(let[Q,j]of Z)J[Q]=j;return Object.assign(J,$)},K$=($={})=>{let Z=B0($),J=new WeakSet,Q=new WeakSet,j=new WeakMap,B=r(),X=O0(Z,B),G=_0(Z,X,B),Y=M0(Z.config?.requestId),V=C0(Z.config?.enrichers),W=Z.config?.onError,I=Z.config?.logFilter,H=Z0(Z.config),U=(z,N,F,K)=>{if(H.isEffectivelyDisabled||!q(z,I))return;J.add(N),X.log(z,N,{context:K,message:F},{beforeTime:j.get(N)??process.hrtime.bigint()})},O={...X,debug:(z,N,F)=>{U("DEBUG",z,N,F)},error:(z,N,F)=>{U("ERROR",z,N,F)},info:(z,N,F)=>{U("INFO",z,N,F)},warn:(z,N,F)=>{U("WARNING",z,N,F)}},A=(z)=>({debug:(N,F)=>U("DEBUG",z,N,F),error:(N,F)=>U("ERROR",z,N,F),info:(N,F)=>U("INFO",z,N,F),mergeContext:(N)=>B.mergeContext(z,N),warn:(N,F)=>U("WARNING",z,N,F)}),D=(z,N,F,K)=>{if(Y){let S=B.getContext(z).requestId;if(S)N[Y.header]=S}let b={beforeTime:j.get(z)??0n};if(V)T0(V,B,{durationMs:L(b.beforeTime),headers:v1(N,K),request:z,status:F},W);return O.finalizeRequest(z,b,F),b},R=Z.config?.useAsyncLocalStorage===!0,w=()=>{if(R)e.enterWith(X0)},J0=(z,N,F)=>{if(Q.has(z))return{beforeTime:j.get(z)??0n};let K=D(z,N,F0(F));return Q.add(z),K},o=(z,N,F)=>{let K=B.getContext(z),b={status:N};if(Object.keys(K).length>0)b.context={...K};O.log(y1(N),z,b,F)},Q0=new x1({detail:{description:"Logixlysia is a plugin for Elysia that provides a logger and pino logger.",tags:["logging","pino"]},name:"Logixlysia"}).state("logger",O).state("pino",O.pino).state("beforeTime",0n).derive(({request:z})=>({log:A(z)})).onStart(({server:z})=>{if(z)Y0(z,Z);else{let N=Number(process.env.PORT)||3000,F=process.env.HOST||"localhost";Y0({hostname:F,port:N,protocol:"http"},Z)}}).onStop(async()=>{let z=Z.config?.flushTimeoutMs??m1;if(await I$(K0(Z),z)&&z>0)F$(Z.config?.onError,z)}).onRequest(({request:z,store:N})=>{let F=process.hrtime.bigint();if(j.set(z,F),N.beforeTime=F,O.beginRequest(z),Y){let K=D0(z,Y);B.mergeContext(z,{requestId:K})}if(V)w0(V,B,z,W);if(R)e.enterWith(A(z))}).onAfterHandle(({request:z,set:N,response:F})=>{try{if(Q.has(z))return;let K=k1(N.status,F),b=D(z,N.headers,K,F instanceof Response?F.headers:void 0);if(Q.add(z),J.has(z))return;o(z,K,b)}finally{w()}}).onError(({request:z,error:N,set:F})=>{try{O.handleHttpError(z,N,J0(z,F.headers,N))}finally{j.delete(z),B.clearContext(z),w()}}).onAfterResponse((z)=>{let{request:N,set:F}=z;if(Q.has(N))return;try{let K=p(F.status),b=D(N,F.headers,K);Q.add(N);let S="error"in z?z.error:void 0;if(S!==void 0&&K>=400)O.handleHttpError(N,S,b);else if(!J.has(N))o(N,K,b)}finally{j.delete(N),B.clearContext(N),w()}}).as("scoped");return Object.assign(Q0,{wrapWs:G})},y6=async($,{close:Z=!1}={})=>{if(await K0($),Z)await Promise.allSettled([Z$($),V$()])},n6=K$,m6=K$;export{h$ as useLogger,G0 as resolveSampling,M0 as resolveRequestIdConfig,B0 as resolveOptions,m6 as logixlysia,D0 as getOrCreateRequestId,y6 as flushLogixlysia,n6 as default,_0 as createWsHandlerWrapper,O0 as createPluginLogger,U$ as createLogger,M$ as HttpError};
1
+ import{l as F0,m as b,n as g}from"./shared/Logixlysia-tqpczh9a.js";import{Elysia as X4}from"elysia";import{promises as y$}from"node:fs";import S0 from"node:path";var m$=/^(?<amount>\d+(?:\.\d+)?)(?<unit>[GKMgkm][Bb]?)$/u,h$=/^(?<amount>\d+)(?<unit>[dhw])$/iu,v$=/\.\d{4}-\d{2}-\d{2}-\d{2}-\d{2}-\d{2}(?:-\d{3})?(?:-\d+)?(?:\.gz)?$/u,d=($)=>{if(typeof $==="number"){if(!Number.isFinite($)||$<=0)throw Error(`Invalid size: ${$}`);return $}let Z=$.trim();if(Z!==""){let X=Number(Z);if(Number.isFinite(X)){if(X<=0)throw Error(`Invalid size: ${$}`);return X}}let J=Z.match(m$);if(!J)throw Error(`Invalid size format: ${$}`);let Q=Number(J[1]),B=J[2].toLowerCase(),j=1024;if(B.startsWith("m"))j=1048576;else if(B.startsWith("g"))j=1073741824;let Y=Math.floor(Q*j);if(Y<1)throw Error(`Invalid size format: ${$}`);return Y},u=($)=>{let Z=$.trim().match(h$);if(!Z)throw Error(`Invalid interval format: ${$}`);let J=Number(Z[1]);if(!(J>0))throw Error(`Invalid interval format: ${$}`);let Q=Z[2].toLowerCase(),B=3600000;if(Q==="d")B=86400000;else if(Q==="w")B=604800000;return J*B},J0=($)=>{if(typeof $==="number"){if(!(Number.isInteger($)&&$>0))throw Error(`maxFiles must be a positive integer, got ${$}`);return{type:"count",value:$}}return{type:"time",value:u($)}};var f0=async($)=>{let Z=S0.dirname($),J=S0.basename($),Q;try{Q=await y$.readdir(Z)}catch{return[]}return Q.filter((B)=>B.startsWith(`${J}.`)&&v$.test(B)).map((B)=>`${Z}/${B}`)};var g$=new Set(["dev","prod","json"]),p$=($)=>{let Z=$?.logRotation;if(!Z)return;try{if(Z.maxSize!==void 0)d(Z.maxSize);if(Z.maxFiles!==void 0)J0(Z.maxFiles);if(Z.interval!==void 0)u(Z.interval);if(Z.compression!==void 0&&Z.compression!=="gzip")throw Error(`Invalid compression algorithm: ${Z.compression}`)}catch(J){let Q=J instanceof Error?J.message:String(J);throw Error(`logixlysia: invalid logRotation config — ${Q}`,{cause:J})}},c$=100,d$=($)=>typeof $==="number"&&Number.isFinite($)&&$>=0&&$<=c$,l=($)=>typeof $==="number"&&Number.isFinite($)&&$>=0,k0=["DEBUG","INFO","WARNING","ERROR"],k=($)=>{throw Error(`logixlysia: invalid sampling config — ${$}`)},G0=($)=>{throw Error(`logixlysia: invalid formatting config — ${$}`)},u$=($)=>{throw Error(`logixlysia: invalid logFilter config — ${$}`)},x0=($)=>{throw Error(`logixlysia: invalid output config — ${$}`)},l$=($)=>{let Z=$?.sampling;if(!Z)return;for(let[B,j]of Object.entries(Z.head??{})){if(!k0.includes(B))k(`head.${B} is not a valid level (must be DEBUG, INFO, WARNING, or ERROR)`);if(!d$(j))k(`head.${B} must be a number between 0 and 100`)}let{tail:J}=Z;if(J?.status!==void 0&&!l(J.status))k("tail.status must be a non-negative number");if(J?.durationMs!==void 0&&!l(J.durationMs))k("tail.durationMs must be a non-negative number");if(J?.paths!==void 0){if(!Array.isArray(J.paths))k("tail.paths must be an array");if(J.paths.some((B)=>typeof B!=="string"||B.length===0))k("tail.paths must contain non-empty glob strings")}let{maxBufferedPerRequest:Q}=Z;if(Q!==void 0&&!(Number.isInteger(Q)&&Q>=0))k("maxBufferedPerRequest must be a non-negative integer")},i$=($)=>{let Z=$?.slowThreshold,J=$?.verySlowThreshold;if(Z!==void 0&&!l(Z))G0(`slowThreshold must be a finite non-negative number, got ${Z}`);if(J!==void 0&&!l(J))G0(`verySlowThreshold must be a finite non-negative number, got ${J}`);if(Z!==void 0&&J!==void 0&&Z>J)G0(`slowThreshold (${Z}) must not exceed verySlowThreshold (${J})`)},n$=($)=>{let Z=$?.logFilter?.level;if(Z===void 0)return;if(!(Array.isArray(Z)&&Z.every((Q)=>k0.includes(Q))))u$(`level must be an array of DEBUG, INFO, WARNING or ERROR, got ${JSON.stringify(Z)}`)},a$=($)=>{if($?.useTransportsOnly===!0&&($.transports?.length??0)===0)x0("useTransportsOnly is set but transports is empty; add a transport or remove useTransportsOnly");let Z=$?.flushTimeoutMs;if(Z!==void 0&&!l(Z))x0(`flushTimeoutMs must be a finite number of milliseconds at or above 0, got ${Z}`)},s$={dev:{pino:{prettyPrint:!0},showContextTree:!0,showStartupMessage:!0,startupMessageFormat:"banner",useColors:!0},json:{pino:{prettyPrint:!1},showContextTree:!1,showStartupMessage:!1,useColors:!1},prod:{autoRedact:!0,pino:{prettyPrint:!1},requestId:!0,showContextTree:!1,showStartupMessage:!1,useColors:!1}},o$=($,Z)=>{if(!Z)return $;let J={...$,...Z};if($.pino||Z.pino)J.pino={...$.pino,...Z.pino,...$.pino?.prettyPrint!==void 0||Z.pino?.prettyPrint!==void 0?{prettyPrint:Z.pino?.prettyPrint??$.pino?.prettyPrint}:{}};if($.logFilter||Z.logFilter)J.logFilter={...$.logFilter,...Z.logFilter};if($.sampling||Z.sampling)J.sampling={...$.sampling,...Z.sampling};if($.logRotation||Z.logRotation)J.logRotation={...$.logRotation,...Z.logRotation};if($.timestamp||Z.timestamp)J.timestamp={...$.timestamp,...Z.timestamp};return J},z0=($={})=>{let{preset:Z}=$;if(Z&&!g$.has(Z))throw Error(`logixlysia: invalid preset — ${Z}`);let J=Z?{...$,config:o$(s$[Z],$.config)}:$;return p$(J.config),l$(J.config),i$(J.config),n$(J.config),a$(J.config),J};var R=($,Z)=>{let J=0;return(Q,B)=>{if(B){try{B({error:Q,sink:$})}catch{}return}let j=Date.now();if(j-J<5000)return;J=j,console.error(`[logixlysia] ${Z}:`,Q)}};var t$=R("enricher","enricher failed"),y0=($)=>{if(!$?.length)return;let Z=[],J=[];for(let Q of $){if(typeof Q==="function"){Z.push(Q);continue}if(Q.request)Z.push(Q.request);if(Q.response)J.push(Q.response)}return Z.length===0&&J.length===0?void 0:{request:Z,response:J}},m0=($,Z,J,Q,B)=>{for(let j of $){let Y;try{Y=j(Z)}catch(X){t$(X,B);continue}if(Y)J.mergeContext(Q,Y)}},h0=($,Z,J,Q)=>{m0($.request,J,Z,J,Q)},v0=($,Z,J,Q)=>{m0($.response,J,Z,J.request,Q)};var r$=Object.freeze({}),S=($)=>{let Z="raw"in $?$.raw:void 0;return typeof Z==="object"&&Z!==null?Z:$},Q0=()=>{let $=new WeakMap,Z=(J)=>{let Q=S(J),B=$.get(Q);if(!B)B={},$.set(Q,B);return B};return{clearContext(J){$.delete(S(J))},getContext(J){let Q=$.get(S(J));return Q?{...Q}:{}},mergeContext(J,Q){if(Object.keys(Q).length===0)return;let B=Z(J);Object.assign(B,Q)},peekContext(J){return $.get(S(J))??r$}}},g0=($,Z)=>{let J=$.context,Q=Object.keys(Z).length>0,B=J!==void 0&&J!==null&&typeof J==="object"&&!Array.isArray(J)&&Object.keys(J).length>0;if(!(Q||B))return $;let j={...Z,...B?J:{}};return{...$,context:j}};import{AsyncLocalStorage as e$}from"node:async_hooks";var m=new e$,i=()=>{},V0={debug:i,error:i,info:i,mergeContext:i,warn:i},$2=()=>m.getStore()??V0;import{createRequire as p0}from"node:module";var Z2=(()=>{try{return p0(import.meta.url)("elysia/package.json")}catch{return{}}})(),J2=(()=>{try{return p0(import.meta.url)("../../package.json")}catch{return{}}})(),Q2=($,Z)=>{if($.length>=Z)return $.slice(0,Z);let J=Math.floor((Z-$.length)/2),Q=Z-$.length-J;return`${" ".repeat(J)}${$}${" ".repeat(Q)}`},c0=($,Z)=>{let{version:J}=Z2,Q=J?`Elysia v${J}`:"Elysia",B=[{kind:"empty"},{kind:"center",text:Q},{kind:"empty"},{kind:"left",text:$}];if(Z)B.push({kind:"left",text:Z});B.push({kind:"empty"});let Y=Math.max(Q.length,$.length,...Z?[Z.length]:[0])+4,X=`┌${"─".repeat(Y)}┐`,W=`└${"─".repeat(Y)}┘`,G=`│${" ".repeat(Y)}│`,z=[X];for(let I of B){if(I.kind==="empty"){z.push(G);continue}if(I.kind==="center"){z.push(`│${Q2(I.text,Y)}│`);continue}let{text:V}=I,F=Math.max(0,Y-V.length-4);z.push(`│ ${V}${" ".repeat(F)} │`)}return z.push(W),z.join(`
2
+ `)},d0=()=>{let $=J2.version;if(!$)return null;return` logixlysia v${$}`};var N0=($,Z)=>{if(!(Z.config?.showStartupMessage??!0))return;let{port:Q,hostname:B,protocol:j}=$;if(Q===void 0||!B||!j)return;let Y=`${j}://${B}:${Q}`,X=`\uD83E\uDD8A Elysia is running at ${Y}`,W=`\uD83E\uDD8A ${Y}`;if((Z.config?.startupMessageFormat??"banner")==="simple"){console.log(X);return}console.log(c0(W,d0()))};import{StatusMap as B2}from"elysia";var j2=/^\d+$/u,Y2=/[_-]+/gu,X2=/(?<before>[a-z0-9])(?<after>[A-Z])/gu,W2=/(?<before>[A-Z])(?<after>[A-Z][a-z])/gu,G2=/['’]/gu,z2=/[^a-z0-9\s]+/gu,V2=/\s+/gu,u0=($)=>{let Z=$.trim();if(!Z)return"";return Z.replace(Y2," ").replace(X2,"$<before> $<after>").replace(W2,"$<before> $<after>").replace(G2,"").toLowerCase().replace(z2," ").replace(V2," ").trim()},N2=(()=>{let $=new Map;for(let[Z,J]of Object.entries(B2))$.set(u0(Z),J);return $})(),f=($)=>typeof $==="object"&&$!==null&&!($ instanceof Error)&&$.constructor?.name==="ElysiaCustomStatusResponse"&&("code"in $)&&typeof $.code==="number"&&("response"in $),n=($)=>{if(typeof $==="number"&&Number.isFinite($))return $;if(typeof $==="string"){let Z=$.trim();if(j2.test(Z))return Number(Z);return N2.get(u0(Z))??500}return 500},B0=($)=>{if($>=500)return"ERROR";if($>=400)return"WARNING";return"INFO"};import L$ from"pino";import r1 from"pino-pretty";var H2=/[.*+?^${}()|[\]\\]/gu,U2=/\*\*.*\*\*/u,I2=/\*\*/u,F2=/[a-zA-Z0-9]/u,M2=($)=>$.replace(H2,"\\$&"),O2=($)=>{if(!U2.test($))return!1;let Z=$.split(I2);for(let J=1;J<Z.length;J+=1){let Q=Z[J];if(Q===""||Q.length<2&&!F2.test(Q))return!0}return!1},l0=($)=>{if(O2($))throw Error("Invalid glob pattern: repeated recursive wildcards (**) can cause performance issues");let Z="",J=0;while(J<$.length){let Q=$[J];if(Q==="*"){let B=$[J+1]==="*";Z+=B?".*":"[^/]*",J+=B?2:1;continue}if(Q==="?"){Z+="[^/]",J+=1;continue}Z+=M2(Q),J+=1}return new RegExp(`^${Z}$`,"u")};var j0=100,K2=100,i0=Object.freeze([]),D2=($)=>{if(!$)return;let Z=$.paths?.length?$.paths.map(l0):void 0;if($.durationMs===void 0&&$.status===void 0&&Z===void 0)return;return{durationMs:$.durationMs,paths:Z,status:$.status}},A2=($,Z)=>{if($.status!==void 0&&Z.status>=$.status)return!0;if($.durationMs!==void 0&&Z.durationMs>=$.durationMs)return!0;if($.paths){for(let J of $.paths)if(J.test(Z.pathname))return!0}return!1},_2=($)=>{if(!$)return;let Z={},J=!1;for(let[Q,B]of Object.entries($))if(typeof B==="number"&&B<j0)Z[Q]=B,J=!0;return J?Z:void 0},H0=($,Z=Math.random)=>{let J=_2($?.head);if(!J)return;let Q=D2($?.tail),B=$?.maxBufferedPerRequest??K2,j=new WeakMap,Y=new WeakSet,X=new WeakSet;return{begin(W){if(Q)Y.add(W)},buffer(W,G){let z=j.get(W);if(!z)z=[],j.set(W,z);if(z.length>=B)return;z.push(G)},decide(W,G){if(X.has(G))return"keep";let z=J[W]??j0;if(z>=j0||z>0&&Z()*j0<z)return"keep";return Q&&Y.has(G)?"buffer":"drop"},finalize(W,G){Y.delete(W);let z=j.get(W);if(j.delete(W),!(Q&&A2(Q,G)))return i0;return X.add(W),z??i0}}};var w=($)=>$===0n?0:Number(process.hrtime.bigint()-$)/1e6;var b2=/[a-zA-Z0-9._%+-]{1,64}@[a-zA-Z0-9.-]{1,253}\.[a-zA-Z]{2,63}/gu,L2=/(?<![\w/.])(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?![\w.])/gu,C2=/(?<![\w:])(?:(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|(?:[0-9a-fA-F]{1,4}:){1,7}:(?:[0-9a-fA-F]{1,4}(?::[0-9a-fA-F]{1,4}){0,6})?|::(?:[0-9a-fA-F]{1,4}(?::[0-9a-fA-F]{1,4}){0,6}))(?![\w:])/gu,P2=/\b(?:\d[ -]*?){13,19}\b/gu,w2=/eyJ[a-zA-Z0-9_-]+\.eyJ[a-zA-Z0-9_-]+\.[a-zA-Z0-9_-]+/gu,R2=/(?<prefix>:\/\/[^\s/?#@:]*:)[^\s/?#@]+@/gu,T2=/[a-z]/iu,E2=/[\d+.-]/u,q2=/\b(?<scheme>[Bb]earer|[Bb]asic)\s+(?<token>[\w\-.~+/]{8,}=*)/gu,S2=/[\d\-.~+/]/u,f2=/\w[A-Z]/u;var s0=["authorization","proxy-authorization","cookie","set-cookie","cookies","x-api-key","api-key","apikey","x-auth-token","password","passwd","secret","client-secret","token","access-token","refresh-token","id-token","session","session-id","private-key","credit-card","card-number","cvv","ssn"],x2=/(?<before>[a-z0-9])(?<after>[A-Z])/gu,n0=($)=>$.replace(x2,"$<before>-$<after>").replaceAll("_","-").toLowerCase(),k2=new Set(["passwd","password","secret"]);var a=($,Z)=>{let J=n0($);if(s0.includes(J))return!0;if(Z?.some((B)=>n0(B)===J))return!0;let Q=J.split("-");return Q.some((B)=>k2.has(B))||Q.at(-1)==="token"},o0=($)=>{return[...s0,...$??[]].flatMap((J)=>{if(J.includes("-"))return[`["${J}"]`,`*["${J}"]`];return[J,`*.${J}`]})},y2=($)=>{if($.length<13||$.length>19)return!1;let Z=0,J=!1;for(let Q=$.length-1;Q>=0;Q-=1){let B=$.codePointAt(Q)??0;if(B<48||B>57)return!1;let j=B-48;if(J){if(j*=2,j>9)j-=9}Z+=j,J=!J}return Z%10===0},m2=($)=>$.replace(P2,(Z)=>{let J=Z.replaceAll(/\D/gu,"");if(J.length>=13&&J.length<=19&&y2(J))return"[REDACTED]";return Z}),h2=($,Z)=>{for(let J=Z-1;J>=0;J-=1){let Q=$.charAt(J);if(T2.test(Q))return!0;if(!E2.test(Q))return!1}return!1},T=($)=>{let Z=$;return Z=Z.replace(R2,(J,Q,B,j)=>h2(j,B)?`${Q}[REDACTED]@`:J),Z=Z.replace(b2,"[REDACTED]"),Z=Z.replace(L2,"[REDACTED]"),Z=Z.replace(C2,"[REDACTED]"),Z=m2(Z),Z=Z.replace(w2,"[REDACTED]"),Z=Z.replace(q2,(J,Q,B)=>S2.test(B)||f2.test(B)?`${Q} [REDACTED]`:J),Z};var a0=($)=>T($).replaceAll("[REDACTED]","redacted"),t0=($,Z)=>{let J=new URLSearchParams;for(let[Q,B]of $)J.append(Q,a(Q,Z)?"redacted":T(B));return J},v2=($)=>{let Z=$;try{Z=decodeURIComponent($)}catch{}let J=T(Z);if(Z===$)return J;return J===Z?$:encodeURIComponent(J)},I0=($,Z)=>{try{let J=new URL($);if(J.username!=="")J.username=a0(J.username);if(J.password!=="")J.password="redacted";J.hostname=a0(J.hostname),J.pathname=J.pathname.split("/").map(v2).join("/");let Q=t0(J.searchParams,Z).toString();if(Q!==J.searchParams.toString())J.search=Q;return J.hash=T(J.hash),J.toString()}catch{return T($).replaceAll("[REDACTED]","redacted")}},g2=new Set(["content-location","location","referer"]),p2=($)=>{try{return new URL($).href}catch{return $}},r0=($,Z,J)=>{if(a($,J))return"[REDACTED]";if(!g2.has($.toLowerCase()))return T(Z);let Q=I0(Z,J);return Q===p2(Z)?Z:Q},c2=($,Z)=>{let J=new Headers;for(let[Q,B]of $)J.append(Q,r0(Q,B,Z));return J};var U0=0,h=($,Z,J)=>{Z.add($),U0+=1;try{return J()}finally{U0-=1,Z.delete($)}},P={array:($,Z,J)=>{let Q;for(let[B,j]of $.entries()){let Y=P.value(j,Z,J);if(Q===void 0&&Y!==j)Q=$.slice(0,B);Q?.push(Y)}return Q??$},error:($,Z,J)=>{let Q=T($.message),B=Object.getPrototypeOf($),j=Object.create(B),Y=(W,G)=>{Object.defineProperty(j,W,{configurable:!0,enumerable:!1,value:G,writable:!0})};if(Y("message",Q),Y("name",$.name),$.stack!==void 0)Y("stack",T($.stack));if($ instanceof DOMException)Y("code",$.code);let X=$;for(let W of Object.getOwnPropertyNames(X)){if(W==="message"||W==="name"||W==="stack")continue;let G=Object.getOwnPropertyDescriptor(X,W);if(G===void 0)continue;if(G.get!==void 0||G.set!==void 0){Object.defineProperty(j,W,G);continue}let z=a(W,J)?"[REDACTED]":P.value(G.value,Z,J);Object.defineProperty(j,W,{...G,value:z})}return j},map:($,Z,J)=>{let Q=new Map;for(let[B,j]of $){let Y=typeof B==="string"&&a(B,J);Q.set(B,Y?"[REDACTED]":P.value(j,Z,J))}return Q},record:($,Z,J)=>{let Q=Object.keys($),B;for(let[j,Y]of Q.entries()){let X=$[Y],W=a(Y,J),G=W?"[REDACTED]":P.value(X,Z,J);if(B===void 0&&(W||G!==X)){B={};for(let z of Q.slice(0,j))B[z]=$[z]}if(B!==void 0)B[Y]=G}return B??$},set:($,Z,J)=>new Set(Array.from($,(Q)=>P.value(Q,Z,J))),toJson:($,Z,J)=>{let Q;try{Q=$.toJSON()}catch{return"[Unserializable]"}if(Q===$)return P.record($,Z,J);return P.value(Q,Z,J)},value:($,Z,J)=>{if(typeof $==="string")return T($);if($===null||typeof $!=="object")return $;if($ instanceof Date)return $;if(Z.has($))return"[Circular]";if(U0>=64)return"[Depth]";if($ instanceof Headers)return c2($,J);if($ instanceof URLSearchParams)return t0($,J);if($ instanceof URL)try{return new URL(I0($.href,J))}catch{return"[REDACTED]"}if($ instanceof Map)return h($,Z,()=>P.map($,Z,J));if($ instanceof Set)return h($,Z,()=>P.set($,Z,J));if($ instanceof Error)return h($,Z,()=>P.error($,Z,J));if(ArrayBuffer.isView($)||$ instanceof ArrayBuffer)return $;let{toJSON:Q}=$;if(typeof Q==="function")return h($,Z,()=>P.toJson($,Z,J));if(Array.isArray($))return h($,Z,()=>P.array($,Z,J));return h($,Z,()=>P.record($,Z,J))}},e0=($,Z)=>P.value($,new WeakSet,Z),$$=($,Z)=>{let J=I0($.url,Z),Q=new Headers,B=!1;for(let[G,z]of $.headers.entries()){let I=r0(G,z,Z);if(I!==z)B=!0;Q.set(G,I)}let j=T($.method),Y=J!==$.url,X=j!==$.method;if(!(Y||B||X))return $;let W={headers:Q,method:j,redirect:$.redirect,signal:$.signal};return new Request(J,W)};import{STATUS_CODES as i2}from"node:http";import O from"chalk";import{STATUS_CODES as d2}from"node:http";var s=($)=>{if($ instanceof Error)return F0($.message);if($&&typeof $==="object"&&"message"in $)return F0($.message);return String($)},M0=($)=>typeof $==="object"&&$!==null&&(("why"in $)||("fix"in $)||("link"in $)||("code"in $)||("internal"in $)),u2=($)=>$ instanceof Error&&($.code==="VALIDATION"||$.name==="ValidationError"||$.constructor?.name==="ValidationError"),l2=["code","fix","internal","link","message","name","status","why"],Z$=($)=>{let Z={};for(let J of l2)if($[J]!==void 0)Z[J]=$[J];return Z},J$=($,Z)=>{if(f($)){let J=typeof $.response==="string"&&$.response!==""?$.response:d2[$.code]??`HTTP ${$.code}`;return{error:{message:J,name:"StatusResponse",status:$.code},message:J}}if(u2($)&&!Z){let Q=(Array.isArray($.all)?$.all:[]).map((Y)=>typeof Y==="object"&&Y!==null&&("path"in Y)?String(Y.path):"").filter(Boolean),B=typeof $.type==="string"?$.type:"request",j=Q.length>0?`Validation failed (${B}): ${Q.join(", ")}`:`Validation failed (${B})`;return{error:{failedPaths:Q,name:"ValidationError",type:B},message:j}}if($ instanceof Error){let J=Z$($);return J.message=$.message,J.name=$.name==="Error"?$.constructor?.name??$.name:$.name,{error:J,message:s($)}}if(M0($))return{error:Z$($),message:s($)};return{error:{value:String($)},message:s($)}};var o=($)=>String($).padStart(2,"0"),n2=($)=>String($).padStart(3,"0"),a2=500,s2=1000,o2=7,t2=256,r2="{now} {service}{icon} {method} {pathname} {status} {duration} {message}{speed}",B$=/\{(?:now|epoch|level|icon|duration|method|pathname|path|query|status|statusText|message|ip|context|service|speed|requestId)\}/gu,j$=($)=>{let{config:Z}=$,J=Z?.useColors??!0,Q=typeof process<"u"&&process.stdout?.isTTY===!0;return J&&Q},e2="yyyy-mm-dd HH:MM:ss.SSS",Q$=4,$1=($)=>{let Z=$.slice(0,Q$).toLowerCase(),J=Z==="utc:",Q=J||Z==="sys:"?$.slice(Q$):$;return{pattern:Q==="standard"?e2:Q,utc:J}},Z1=($,Z)=>{if(!Z)return $.toISOString();let{pattern:J,utc:Q}=$1(Z),B=String(Q?$.getUTCFullYear():$.getFullYear()),j=o((Q?$.getUTCMonth():$.getMonth())+1),Y=o(Q?$.getUTCDate():$.getDate()),X=o(Q?$.getUTCHours():$.getHours()),W=o(Q?$.getUTCMinutes():$.getMinutes()),G=o(Q?$.getUTCSeconds():$.getSeconds()),z=n2(Q?$.getUTCMilliseconds():$.getMilliseconds());return J.replaceAll("yyyy",B).replaceAll("mm",j).replaceAll("dd",Y).replaceAll("HH",X).replaceAll("MM",W).replaceAll("ss",G).replaceAll("SSS",z)},J1=($)=>{let Z=$.headers.get("x-forwarded-for"),J=Z?Z.split(",")[0]?.trim()??"":$.headers.get("x-real-ip")??"";return b(J,64)},Q1=($)=>{if($>=1000){let Z=$/1000;if(Z>=10)return`${Math.round(Z)}s`;let J=Z.toFixed(1);return J.endsWith(".0")?`${Math.round(Z)}s`:`${J}s`}if($>0&&$<1)return`${$.toFixed(2)}ms`;return`${Math.round($)}ms`},B1=($)=>{let{config:Z}=$;return{slow:Z?.slowThreshold??a2,verySlow:Z?.verySlowThreshold??s2}},j1=($,Z,J,Q)=>{let B=Q1($),j=$>=Q;if(!Z)return{isVerySlow:j,text:B};let Y=B;if($<J)Y=O.green(B);else if($<Q)Y=O.yellow(B);else Y=O.red.bold(B);return{isVerySlow:j,text:Y}},Y1=($,Z)=>{if(!$)return"";let J="⚡ slow";if(!Z)return` ${J}`;return` ${O.yellow(J)}`},X1=($,Z)=>{if(!Z)return"\uD83E\uDD8A";if($==="ERROR")return O.bgRed.black(" \uD83E\uDD8A ");if($==="WARNING")return O.bgYellow.black(" \uD83E\uDD8A ");if($==="DEBUG")return O.bgBlue.black(" \uD83E\uDD8A ");return O.bgGreen.black(" \uD83E\uDD8A ")},W1=($,Z)=>{if(!Z)return $;if($==="ERROR")return O.bgRed.black($);if($==="WARNING")return O.bgYellow.black($);if($==="DEBUG")return O.bgBlue.black($);return O.bgGreen.black($)},G1=($,Z)=>{if(!Z)return $;let J=$.toUpperCase();if(J==="GET")return O.green.bold(J);if(J==="POST")return O.blue.bold(J);if(J==="PUT")return O.yellow.bold(J);if(J==="PATCH")return O.yellowBright.bold(J);if(J==="DELETE")return O.red.bold(J);if(J==="OPTIONS")return O.cyan.bold(J);if(J==="HEAD")return O.greenBright.bold(J);if(J==="TRACE")return O.magenta.bold(J);if(J==="CONNECT")return O.cyanBright.bold(J);return O.white.bold(J)},z1=($,Z)=>{let J=$.toUpperCase(),Q=" ".repeat(Math.max(0,o2-J.length));return G1(J,Z)+Q},V1=($,Z)=>{let J=String($);if(!(Z&&Number.isFinite($)))return J;if($>=500)return O.red(J);if($>=400)return O.yellow(J);if($>=300)return O.cyan(J);if($>=200)return O.green(J);return O.gray(J)},N1=($,Z)=>{if(!Z)return $;return O.gray($)},H1=($,Z)=>{if(!Z)return $;return O.whiteBright($)},U1=($)=>{return i2[$]??""},I1=($,Z)=>{let J=$.config?.service?.trim();if(!J)return"";let Q=`[${J}]`;if(!Z)return`${Q} `;return`${O.dim(Q)} `},O0=($)=>{let{config:Z}=$,J=j$($),Q=Z?.customLogFormat??r2,B=new Set(Q.match(B$)),{slow:j,verySlow:Y}=B1($),X=I1($,J);return{format:Q,serviceToken:X,slowThreshold:j,tokens:B,useColors:J,verySlowThreshold:Y}},Y$=($)=>{if($===null)return"null";if($===void 0)return"undefined";if(typeof $==="string")return b($);if(typeof $==="number"||typeof $==="bigint"||typeof $==="boolean")return String($);if($ instanceof Error)return b($.message);return b($)},F1=($)=>$!==null&&typeof $==="object"&&!Array.isArray($)&&!($ instanceof Error)&&!($ instanceof Date),X$=($,Z,J)=>{let Q=[];for(let[B,j]of Object.entries($)){let Y=b(B,t2),X=Z?`${Z}.${Y}`:Y;if(F1(j)&&J>1)Q.push(...X$(j,X,J-1));else Q.push([X,Y$(j)])}return Q},M1=($,Z)=>{if($.length===0)return[];let J=[],Q=$.length-1;for(let B=0;B<$.length;B+=1){let j=B===Q?"└─":"├─",Y=$[B];if(!Y)continue;let[X,W]=Y,G=Z?O.cyan(X):X,z=Z?O.white(W):W;J.push(` ${j} ${G} ${z}`)}return J},O1=($)=>{let Z=[],J=s($);if(J)Z.push(["error",b(J)]);if(M0($)){if($.code!==void 0)Z.push(["error.code",b($.code)]);if($.why!==void 0)Z.push(["error.why",b($.why)]);if($.fix!==void 0)Z.push(["error.fix",b($.fix)]);if($.link!==void 0)Z.push(["error.link",b($.link)]);if($.internal!==void 0)Z.push(["error.internal",Y$($.internal)])}return Z},K1=($,Z,J,Q=j$(J))=>{if(J.config?.showContextTree===!1)return[];let B=J.config?.contextDepth??1,j=[],Y=Z.context;if(Y&&typeof Y==="object"&&!Array.isArray(Y)&&Object.keys(Y).length>0&&B>=1)j.push(...X$(Y,"",B));if(($==="ERROR"||$==="WARNING")&&Z.error!==void 0)j.push(...O1(Z.error));return M1(j,Q)},D1=($)=>{if(typeof $==="object"&&$!==null)return b($,Number.POSITIVE_INFINITY);return""},A1=($,Z,J)=>{if(!($.has("{now}")||$.has("{epoch}")))return{epoch:"",timestamp:""};let Q=new Date,B=$.has("{epoch}")?String(Q.getTime()):"";if(!$.has("{now}"))return{epoch:B,timestamp:""};let j=Z1(Q,Z);return{epoch:B,timestamp:N1(j,J)}},_1=($,Z)=>{if(!$.has("{message}"))return"";return typeof Z.message==="string"?b(Z.message):""},b1=($,Z,J,Q,B)=>{let j=$.has("{pathname}")||$.has("{path}"),Y=$.has("{query}");if(!(j||Y))return{coloredPathname:"",query:""};let X,W;if(B)({pathname:X,search:W}=B);else try{({pathname:X,search:W}=new URL(Z.url))}catch{X=b(Z.url||"/",1024),W=""}let G=Y?W:"";if(!j)return{coloredPathname:"",query:G};let z=J?.logQueryParams?`${X}${W}`:X;return{coloredPathname:H1(z,Q),query:G}},L1=($,Z,J)=>{let Q=$.has("{status}"),B=$.has("{statusText}");if(!(Q||B))return{coloredStatus:"",statusText:""};let j=Z.status,Y=j===null||j===void 0?200:n(j);return{coloredStatus:Q?V1(Y,J):"",statusText:B?U1(Y):""}},C1=($,Z,J)=>J?.ip===!0&&$.has("{ip}")?J1(Z):"",P1=($)=>$!==null&&$!==void 0&&typeof $==="object"&&!Array.isArray($)&&Object.keys($).length>0,w1=($,Z,J)=>{if(!$.has("{context}"))return"";if(J?.showContextTree!==!1&&P1(Z.context))return"";return D1(Z.context)},R1=($,Z,J,Q,B,j)=>{let Y=$.has("{duration}"),X=$.has("{speed}");if(!(Y||X))return{coloredDuration:"",speedToken:""};let W=j?.durationMs??w(Z.beforeTime),{text:G,isVerySlow:z}=j1(W,J,Q,B);return{coloredDuration:Y?G:"",speedToken:X?Y1(z,J):""}},T1=($,Z)=>{if(!$.has("{requestId}"))return"";let J=Z.context;if(typeof J!=="object"||J===null||!("requestId"in J))return"";return b(String(J.requestId),128)},W$=({level:$,request:Z,data:J,store:Q,options:B,formatContext:j,precomputed:Y})=>{let{config:X}=B,{format:W,serviceToken:G,slowThreshold:z,tokens:I,useColors:V,verySlowThreshold:F}=j??O0(B),{timestamp:D,epoch:L}=A1(I,X?.timestamp?.translateTime,V),A=_1(I,J),{coloredPathname:_,query:q}=b1(I,Z,X,V,Y),{coloredStatus:x,statusText:c}=L1(I,J,V),X0=C1(I,Z,X),E0=w1(I,J,X),W0=I.has("{level}")?W1($,V):"",H=I.has("{method}")?z1(Z.method,V):"",{coloredDuration:N,speedToken:U}=R1(I,Q,V,z,F,Y),M=I.has("{icon}")?X1($,V):"",K=T1(I,J),C={"{context}":E0,"{duration}":N,"{epoch}":L,"{icon}":M,"{ip}":X0,"{level}":W0,"{message}":A,"{method}":H,"{now}":D,"{pathname}":_,"{path}":_,"{query}":q,"{requestId}":K,"{service}":G,"{speed}":U,"{statusText}":c,"{status}":x},Z0=W.replace(B$,(q0)=>C[q0]??q0);return{contextLines:K1($,J,B,V),main:Z0}};var K0=R("transport","transport failed"),E1=1024,v=new Set,q1=async($,Z)=>{if(v.size>=E1){let J=v.values().next().value;if(J)v.delete(J)}v.add($);try{await $}catch(J){K0(J,Z)}finally{v.delete($)}},G$=($)=>{let{level:Z,request:J,data:Q,store:B,options:j,precomputed:Y}=$,X=j.config?.transports??[];if(X.length===0)return;let W=j.config?.onError,G=typeof Q.message==="string"?Q.message:"",z={request:{method:J.method,url:J.url},...Q,durationMs:Y?.durationMs??w(B.beforeTime)};for(let I of X)try{let V=I.log(Z,G,z);if(V)q1(V,W)}catch(V){K0(V,W)}},z$=($,Z)=>{let J=$.config?.onError;return($.config?.transports??[]).map(async(Q)=>{try{await Promise.resolve(),await Q[Z]?.()}catch(B){K0(B,J)}})},V$=async($)=>{await Promise.allSettled([...v,...z$($,"flush")])},N$=async($)=>{await Promise.allSettled(z$($,"close"))};import{open as c1}from"node:fs/promises";import d1 from"node:path";import{promises as S1}from"node:fs";var H$=async($,Z=448)=>{await S1.mkdir($,{mode:Z,recursive:!0})};import{promises as E}from"node:fs";import{promisify as f1}from"node:util";import{gzip as x1}from"node:zlib";var U$=()=>{let $=new Map;return{acquire:async(J)=>{let Q=$.get(J)??Promise.resolve(),{promise:B,resolve:j}=Promise.withResolvers();return $.set(J,B),await Q,()=>{if(j(),$.get(J)===B)$.delete(J)}}}};var k1=f1(x1),I$=384,y1=U$(),F$=($,Z,J)=>{if(J){J(Z);return}console.error($,Z)},t=($)=>String($).padStart(2,"0"),m1=($,Z)=>{let J=Z.getFullYear(),Q=t(Z.getMonth()+1),B=t(Z.getDate()),j=t(Z.getHours()),Y=t(Z.getMinutes()),X=t(Z.getSeconds()),W=String(Z.getMilliseconds()).padStart(3,"0");return`${$}.${J}-${Q}-${B}-${j}-${Y}-${X}-${W}`},h1=async($)=>{try{if((await E.stat($)).size===0)return""}catch{return""}let J=`${m1($,new Date)}-${process.hrtime.bigint()}`;return await E.rename($,J),J},v1=async($,Z,J=I$)=>{let Q=await y1.acquire($);try{try{await E.access($)}catch{return}let B=await E.readFile($),j=await k1(B);await E.writeFile(`${$}.gz`,j,{mode:J}),await E.rm($,{force:!0})}catch(B){throw F$(`[logixlysia] Failed to compress file ${$}:`,B,Z),B}finally{Q()}};var g1=($)=>$.status==="fulfilled",p1=async($,Z,J)=>{let Q=await f0($);if(Q.length===0)return;if(Z.type==="count"&&Q.length<=Z.value)return;let j=(await Promise.allSettled(Q.map(async(W)=>({path:W,stat:await E.stat(W)})))).filter(g1).map((W)=>W.value),Y;if(Z.type==="count"){if(j.length<=Z.value)return;j.sort((W,G)=>G.stat.mtimeMs-W.stat.mtimeMs),Y=j.slice(Z.value)}else{let W=Date.now();Y=j.filter(({stat:G})=>W-G.mtimeMs>Z.value)}let X=await Promise.allSettled(Y.map(({path:W})=>E.rm(W,{force:!0})));for(let[W,G]of X.entries())if(G.status==="rejected")F$(`[logixlysia] Failed to delete rotated log ${Y[W].path}:`,G.reason,J)},M$=async($,Z,J,Q=I$)=>{let B=await h1($);if(!B)return;if(Z.compress===!0){if((Z.compression??"gzip")==="gzip")try{await v1(B,J,Q)}catch{}}if(Z.maxFiles!==void 0){let Y=J0(Z.maxFiles);await p1($,Y,J)}};var u1=($,Z)=>$&&$>0?$:Z,r=new Map;class O${filePath;handle=null;bytesWritten=0;openedAt=0;latestOptions={};pendingBatch=null;flushChain=Promise.resolve();constructor($){this.filePath=$}write($,Z){this.latestOptions=Z;let{promise:J,reject:Q,resolve:B}=Promise.withResolvers();if(this.pendingBatch)return this.pendingBatch.lines.push($),this.pendingBatch.resolvers.push({reject:Q,resolve:B}),J;let j={lines:[$],resolvers:[{reject:Q,resolve:B}]};return this.pendingBatch=j,queueMicrotask(()=>{this.pendingBatch=null,this.flushChain=this.flushAfter(this.flushChain,j)}),J}async flushAfter($,Z){await g($),await this.flushBatch(Z)}async flushBatch($){let Z=this.latestOptions,J=$.lines.join("");try{await this.ensureOpen(Z),await this.handle.write(J),this.bytesWritten+=Buffer.byteLength(J)}catch(Q){for(let B of $.resolvers)B.reject(Q);return}await this.maybeRotate(Z);for(let Q of $.resolvers)Q.resolve()}async ensureOpen($){if(this.handle)return;await H$(d1.dirname(this.filePath),$.logDirMode);let Z=await c1(this.filePath,"a",$.logFileMode??384),J=await Z.stat();this.handle=Z,this.bytesWritten=J.size,this.openedAt=u1(J.birthtimeMs,Date.now())}shouldRotateNow($){if($.maxSize!==void 0&&this.bytesWritten>d($.maxSize))return!0;return $.interval!==void 0&&Date.now()-this.openedAt>=u($.interval)}async maybeRotate($){let Z=$.logRotation;if(!Z||Z.maxSize===void 0&&Z.interval===void 0)return;try{if(!this.shouldRotateNow(Z))return;let{handle:J}=this;this.handle=null,this.bytesWritten=0,this.openedAt=Date.now(),await J?.close(),await M$(this.filePath,Z,$.onRotationError,$.logFileMode)}catch(J){if($.onRotationError)$.onRotationError(J);else console.error(`[logixlysia] Failed to rotate log file ${this.filePath}:`,J)}}async flush(){await Promise.resolve(),await this.flushChain}async close(){await this.flush();let{handle:$}=this;this.handle=null,await $?.close(),r.delete(this.filePath)}}var K$=($)=>{let Z=r.get($);if(!Z)Z=new O$($),r.set($,Z);return Z},D$=async()=>{await Promise.allSettled([...r.values()].map(($)=>$.flush()))},A$=async()=>{await Promise.allSettled([...r.values()].map(($)=>$.close()))};var l1=R("file","failed to write to log file"),i1=R("rotation","log rotation failed"),n1=($,Z,J)=>{if(J){let{pathname:Q,search:B}=J;return Z?`${Q}${B}`:Q}try{let{pathname:Q,search:B}=new URL($.url);return Z?`${Q}${B}`:Q}catch{return $.url}},_$=async($)=>{let{filePath:Z,level:J,request:Q,data:B,store:j,options:Y,precomputed:X}=$,{config:W}=Y,G=W?.useTransportsOnly===!0,z=W?.disableFileLogging===!0;if(G||z)return;let I=typeof B.message==="string"?B.message:"",V=X?.durationMs??w(j.beforeTime),F=n1(Q,W?.logQueryParams,X),D=`${J} ${V.toFixed(2)}ms ${Q.method} ${b(F,1024)} ${b(I)}
3
+ `,L=(A)=>i1(A,W?.onError);try{await K$(Z).write(D,{logDirMode:W?.logDirMode,logFileMode:W?.logFileMode,logRotation:W?.logRotation,onRotationError:L})}catch(A){throw l1(A,W?.onError),A}};var Y0=($)=>{let Z=$?.useTransportsOnly===!0,J=$?.disableInternalLogger===!0,Q=$?.disableFileLogging===!0,B=($?.transports?.length??0)>0,j=!(Z||Q)&&!!$?.logFilePath,Y=!(Z||J);return{hasFileLogging:j,hasInternalLogger:Y,hasTransports:B,isEffectivelyDisabled:!(B||j||Y),needsUrlParts:j||Y}},y=($,Z)=>{if(!Z?.level||Z.level.length===0)return!0;return Z.level.includes($)},D0=($)=>{try{let{pathname:Z,search:J}=new URL($.url);return{pathname:Z,search:J}}catch{return{pathname:$.url||"/",search:""}}},a1=($,Z,J,Q)=>{let B=Q??w($.beforeTime),{pathname:j,search:Y}=J?D0(Z):{pathname:"",search:""};return{durationMs:B,pathname:j,search:Y}},s1=($)=>{switch($){case"DEBUG":return console.debug;case"INFO":return console.info;case"WARNING":return console.warn;case"ERROR":return console.error;default:return console.log}},e=R("format","failed to build a log record"),o1=({contextStore:$,data:Z,durationOverride:J,formatContext:Q,level:B,options:j,request:Y,sinks:X,store:W})=>{let{config:G}=j,z=g0(Z,$.peekContext(Y)),I=G?.autoRedact===!0?e0(z,G?.redactKeys):z,V=G?.autoRedact===!0?$$(Y,G?.redactKeys):Y,F=a1(W,V,X.needsUrlParts,J);if(X.hasTransports)G$({data:I,level:B,options:j,precomputed:F,request:V,store:W});if(X.hasFileLogging){let _=G?.logFilePath;if(_)g(_$({data:I,filePath:_,level:B,options:j,precomputed:F,request:V,store:W}))}if(!X.hasInternalLogger)return;let{main:D,contextLines:L}=W$({data:I,formatContext:Q,level:B,options:j,precomputed:F,request:V,store:W}),A=L.length>0?`${D}
4
+ ${L.join(`
5
+ `)}`:D;s1(B)(A)},$0=($)=>{let{bypassSampling:Z,data:J,level:Q,options:B,request:j,sampling:Y,sinks:X,store:W}=$,{config:G}=B;if(X.isEffectivelyDisabled||!y(Q,G?.logFilter))return;if(Y&&!Z){let z=Y.decide(Q,j);if(z==="drop")return;if(z==="buffer"){Y.buffer(j,{data:J,durationMs:w(W.beforeTime),level:Q});return}}try{o1($)}catch(z){e(z,G?.onError)}};var t1=($)=>typeof $==="object"&&$!==null&&("status"in $)&&typeof $.status==="number",A0=($)=>{if(f($))return $.code;return t1($)?$.status:500},b$=($,Z,J,Q,B,j,Y,X)=>{let{config:W}=Q,G=J.status??A0(Z),z=f(Z)||G>=400?B0(G):"ERROR";if(j.isEffectivelyDisabled||!y(z,W?.logFilter))return;try{let{error:I,message:V}=J$(Z,W?.logErrorPayload===!0);$0({contextStore:B,data:{error:I,message:V,status:G},formatContext:Y,level:z,options:Q,request:$,sampling:X,sinks:j,store:J})}catch(I){e(I,W?.onError)}};var e1={beforeTime:0n},$4=($,Z)=>{let J=$?.pino,{prettyPrint:Q,...B}=J??{},j=typeof Q==="object"&&Q!==null?Q:void 0,X=(Q===!0||j!==void 0)&&B.transport===void 0,W=j?.messageKey??B.messageKey,G=j?.errorKey??B.errorKey,z={...B,errorKey:G,level:B.level??"info",messageKey:W,...$?.autoRedact===!0&&B.redact===void 0?{redact:{censor:"[REDACTED]",paths:o0($?.redactKeys)}}:{}},I=()=>r1({colorize:process.stdout?.isTTY===!0,translateTime:$?.timestamp?.translateTime,...j,errorKey:G,messageKey:W}),V,F=()=>{if(!V)V=X?Z(z,I()):Z({...z,transport:B.transport});return V},L=new Proxy({level:void 0},{get(A,_){let q=F(),x=q[_];return typeof x==="function"?x.bind(q):x},getOwnPropertyDescriptor:(A,_)=>Object.getOwnPropertyDescriptor(V??A,_),has:(A,_)=>(_ in F()),ownKeys:(A)=>Reflect.ownKeys(V??A),set(A,_,q){return F()[_]=q,!0}});if($?.pino!==void 0)F();return L},C$=($={},Z=L$,J)=>{let Q=J??Q0(),{config:B}=$,j=O0($),Y=$4(B,Z),X=Y0(B),W=H0(B?.sampling),G=(V,F,D,L)=>{$0({contextStore:Q,data:D,formatContext:j,level:V,options:$,request:F,sampling:W,sinks:X,store:L})},z=(V,F,D)=>{if(!W)return;let L={durationMs:w(F.beforeTime),pathname:D0(V).pathname,status:D};for(let A of W.finalize(V,L))$0({bypassSampling:!0,contextStore:Q,data:A.data,durationOverride:A.durationMs,formatContext:j,level:A.level,options:$,request:V,sampling:W,sinks:X,store:e1})},I=(V,F,D,L)=>{if(X.isEffectivelyDisabled||!y(V,B?.logFilter))return;let A={beforeTime:process.hrtime.bigint()};G(V,F,{context:L,message:D},A)};return{beginRequest:(V)=>{W?.begin(V)},debug:(V,F,D)=>{I("DEBUG",V,F,D)},error:(V,F,D)=>{I("ERROR",V,F,D)},finalizeRequest:z,getContext:(V)=>Q.getContext(V),handleHttpError:(V,F,D)=>{b$(V,F,D,$,Q,X,j,W)},info:(V,F,D)=>{I("INFO",V,F,D)},log:G,mergeContext:(V,F)=>{Q.mergeContext(V,F)},pino:Y,warn:(V,F,D)=>{I("WARNING",V,F,D)}}},_0=($,Z)=>C$($,L$,Z);var P$="X-Request-Id",w$=/^[A-Za-z0-9._-]{1,128}$/u,Z4=64,R$=R("enricher","request id generator failed"),b0=($,Z)=>{if($===void 0||$===!1)return null;if($===!0)return{enabled:!0,generator:()=>crypto.randomUUID(),header:P$,onError:Z};if($.enabled===!1)return null;return{enabled:!0,generator:$.generator??(()=>crypto.randomUUID()),header:$.header?.trim()||P$,onError:Z}},L0=($,Z)=>{let J=$.headers.get(Z.header);if(J&&w$.test(J))return J;try{let Q=Z.generator();if(typeof Q==="string"&&w$.test(Q))return Q;R$(Error(`generated request id is not valid: ${String(Q).slice(0,Z4)}`),Z.onError)}catch(Q){R$(Q,Z.onError)}return crypto.randomUUID()};var T$=async($,Z)=>{let J=g($);if(Z<=0)return!0;let Q=Promise.withResolvers(),B=setTimeout(()=>Q.resolve("timeout"),Z);B.unref?.();let j=await Promise.race([J,Q.promise]);return clearTimeout(B),j==="timeout"},E$=($,Z)=>{let J=Error(`[logixlysia] shutdown flush did not complete within ${Z}ms; some transport or file writes may not have been flushed.`);if($){try{$({error:J,sink:"shutdown"})}catch{}return}console.error(J.message)},C0=async($)=>{await Promise.allSettled([V$($),D$()])};var q$=new Map,J4=($)=>{let Z=q$.get($);if(!Z)Z=new Request(`http://logixlysia.local${$}`,{method:"WS"}),q$.set($,Z);return Z},Q4=($)=>{if($ instanceof ArrayBuffer||ArrayBuffer.isView($))return"binary";if(typeof $==="string")return"string";return typeof $},B4=async($,Z)=>{let J;try{J=await $}catch(Q){throw Z(),Q}return Z(),J},P0=($,Z)=>{if($ instanceof Promise)return B4($,Z);return Z(),$},w0=($,Z,J)=>{let Q=new WeakMap,B=(j,Y,X,W,G)=>{let I={beforeTime:Q.get(S(Y))??process.hrtime.bigint()},V=J.peekContext(Y),F=Object.keys(V).length>0||G?{...V,...G,wsId:Y.id}:{wsId:Y.id};Z.log(j,J4(X),{context:F,message:W,status:200},I)};return(j,Y)=>{if(typeof j!=="string")throw TypeError("logixlysia: wrapWs(path, hooks) expects the route path first, e.g. plugin.wrapWs('/chat', { open(ws) {} })");return{...Y,close(X,W,G){let z=()=>{if($.config?.disableWebSocketLogging!==!0){let V={};if(W!==void 0)V.code=W;if(G!==void 0)V.reason=G;B("INFO",X,j,"WebSocket closed",Object.keys(V).length>0?V:void 0)}J.clearContext(X),Q.delete(S(X))},I;try{I=Y.close?.(X,W,G)}catch(V){throw z(),V}return P0(I,z)},message(X,W){let G=()=>{if($.config?.disableWebSocketLogging!==!0)B("INFO",X,j,"WebSocket message",{payloadType:Q4(W)})},z;try{z=Y.message?.(X,W)}catch(I){throw G(),I}return P0(z,G)},open(X){Q.set(S(X),process.hrtime.bigint());let W=()=>{if($.config?.disableWebSocketLogging!==!0)B("INFO",X,j,"WebSocket opened")},G;try{G=Y.open?.(X)}catch(z){throw W(),z}return P0(G,W)}}}};var j4=new Set([101,103,204,205,304]);var Y4=($)=>$>=200&&$<=599&&!j4.has($)?$:500;class S$ extends Error{code;fix;link;status;why;constructor($,Z,J={}){super(Z);if(this.status=$,this.code=J.code,this.fix=J.fix,this.link=J.link,this.why=J.why,this.name="HttpError",Object.defineProperty(this,"name",{enumerable:!1}),Object.defineProperty(this,"internal",{configurable:!0,enumerable:!1,value:J.internal,writable:!1}),J.code!==void 0||J.why!==void 0||J.fix!==void 0||J.link!==void 0)Object.defineProperty(this,"toResponse",{configurable:!0,enumerable:!1,value:()=>Response.json(this.toJSON(),{status:Y4(this.status)}),writable:!0})}toJSON(){return{code:this.code,fix:this.fix,link:this.link,message:this.message,status:this.status,why:this.why}}}var R0=200,W4=500,G4=($,Z)=>{if(f(Z))return Z.code;if(Z instanceof Response&&Z.status!==R0)return Z.status;if($===void 0||$===null)return R0;return n($)},T0=new WeakMap,p=($)=>{let Z=T0.get($);if(Z)return Z;let J={customLogged:!1,phase:"open",pulled:!1,startedAt:process.hrtime.bigint(),wrapped:!1};return T0.set($,J),J},f$=($)=>$ instanceof Response?$.status:R0,z4=($)=>typeof $==="object"&&$!==null&&typeof $.next==="function"&&((Symbol.asyncIterator in $)||(Symbol.iterator in $)),x$=($)=>$ instanceof ReadableStream,V4=($)=>$(),N4=($)=>(Z)=>m.run($,Z),H4=async function*(Z,J,Q,B){Z.pulled=!0;let j=J[Symbol.asyncIterator](),Y={next:(...X)=>Q(()=>j.next(...X)),return:j.return?.bind(j),throw:j.throw?.bind(j)};try{let X=await Y.next();if(X.done)return X.value;if(x$(X.value))Z.phase="open";return yield X.value,yield*{[Symbol.asyncIterator]:()=>Y}}catch(X){throw Z.error=X,X}finally{try{await j.return?.()}finally{B()}}},U4=function*(Z,J,Q,B){Z.pulled=!0;let j=J[Symbol.iterator](),Y={next:(...X)=>Q(()=>j.next(...X)),return:j.return?.bind(j),throw:j.throw?.bind(j)};try{let X=Y.next();if(X.done)return X.value;if(x$(X.value))Z.phase="open";return yield X.value,yield*{[Symbol.iterator]:()=>Y}}catch(X){throw Z.error=X,X}finally{try{j.return?.()}finally{B()}}},I4=5000,F4=($,Z)=>{let J={};if(Z)for(let[Q,B]of Z)J[Q]=B;return Object.assign(J,$)},k$=($={})=>{let Z=z0($),J=Q0(),Q=_0(Z,J),B=w0(Z,Q,J),j=b0(Z.config?.requestId,Z.config?.onError),Y=y0(Z.config?.enrichers),X=Z.config?.onError,W=Z.config?.logFilter,G=Y0(Z.config),z=(H,N,U,M)=>{if(G.isEffectivelyDisabled||!y(H,W))return;let K=p(N);K.customLogged=!0,Q.log(H,N,{context:M,message:U},{beforeTime:K.startedAt})},I={...Q,debug:(H,N,U)=>{z("DEBUG",H,N,U)},error:(H,N,U)=>{z("ERROR",H,N,U)},info:(H,N,U)=>{z("INFO",H,N,U)},warn:(H,N,U)=>{z("WARNING",H,N,U)}},V=(H)=>({debug:(N,U)=>z("DEBUG",H,N,U),error:(N,U)=>z("ERROR",H,N,U),info:(N,U)=>z("INFO",H,N,U),mergeContext:(N)=>J.mergeContext(H,N),warn:(N,U)=>z("WARNING",H,N,U)}),F=(H,N,U,M)=>{if(j){let C=J.getContext(H).requestId;if(C)N[j.header]=C}let K={beforeTime:T0.get(H)?.startedAt??0n};if(Y)v0(Y,J,{durationMs:w(K.beforeTime),headers:F4(N,M),request:H,status:U},X);return I.finalizeRequest(H,K,U),K},D=Z.config?.useAsyncLocalStorage===!0,L=()=>{if(D)m.enterWith(V0)},A=(H,N,U)=>{let M=J.getContext(H),K={status:N};if(Object.keys(M).length>0)K.context={...M};I.log(B0(N),H,K,U)},_=(H,N,U,M)=>{if(N.phase==="closed")return;N.phase="closed";try{let K=F(H,N.setHeaders??{},U,M);if(N.error!==void 0&&(U>=400||!f(N.error)))I.handleHttpError(H,N.error,{...K,status:U});else if(!N.customLogged)A(H,U,K)}catch(K){e(K,X)}},q=(H,N)=>{if(N.phase!=="streaming")return;if(N.status===void 0){N.phase="open";return}_(H,N,N.status)},x=(H,N,U)=>{if(!z4(U))return;N.phase="streaming";let M=()=>q(H,N),K=D?N4(V(H)):V4,C=Symbol.asyncIterator in U?H4(N,U,K,M):U4(N,U,K,M);return Object.assign(C,U)},c=(H,N,U,M)=>{_(H,N,U,M),L()},X0=(H)=>(N,U)=>{let M=p(N);M.wrapped=!0;let K=async()=>{let C;try{C=await H(N,U)}catch(Z0){throw M.error??=Z0,_(N,M,W4),Z0}if(M.phase==="streaming"&&M.pulled&&M.error===void 0)return M.status=f$(C),C;return _(N,M,f$(C),C instanceof Response?C.headers:void 0),C};return D?m.run(V(N),K):K()},W0=new X4({detail:{description:"Logixlysia is a plugin for Elysia that provides a logger and pino logger.",tags:["logging","pino"]},name:"Logixlysia"}).wrap(X0).state("logger",I).state("pino",I.pino).state("beforeTime",0n).derive(({request:H})=>({log:V(H)})).onStart(({server:H})=>{if(H)N0(H,Z);else{let N=Number(process.env.PORT)||3000,U=process.env.HOST||"localhost";N0({hostname:U,port:N,protocol:"http"},Z)}}).onStop(async()=>{let H=Z.config?.flushTimeoutMs??I4;if(await T$(C0(Z),H)&&H>0)E$(Z.config?.onError,H)}).onRequest(({request:H,set:N,store:U})=>{let M=p(H);if(M.setHeaders=N.headers,U.beforeTime=M.startedAt,I.beginRequest(H),j){let K=L0(H,j);J.mergeContext(H,{requestId:K}),N.headers[j.header]=K}if(Y)h0(Y,J,H,X);if(D&&!M.wrapped)m.enterWith(V(H))}).onAfterHandle(({request:H,set:N,response:U})=>{let M=p(H);if(!M.wrapped){c(H,M,G4(N.status,U),U instanceof Response?U.headers:void 0);return}let K=x(H,M,U);if(K!==void 0)return K}).onError(({request:H,error:N})=>{let U=p(H);if(U.error=N,U.wrapped)return;if(U.phase==="closed"){I.handleHttpError(H,N,{beforeTime:U.startedAt}),L();return}c(H,U,A0(N))}).onAfterResponse((H)=>{let{request:N,set:U}=H,M=p(N);if(M.wrapped)return;let K="error"in H?H.error:void 0;if(K!==void 0)M.error=K;c(N,M,n(U.status))}).as("scoped");return Object.assign(W0,{wrapWs:B})},F7=async($,{close:Z=!1}={})=>{if(await C0($),Z)await Promise.allSettled([N$($),A$()])},P7=k$,M7=k$;export{$2 as useLogger,H0 as resolveSampling,b0 as resolveRequestIdConfig,z0 as resolveOptions,M7 as logixlysia,L0 as getOrCreateRequestId,F7 as flushLogixlysia,P7 as default,w0 as createWsHandlerWrapper,_0 as createPluginLogger,C$ as createLogger,S$ as HttpError};
6
6
 
7
- //# debugId=C5FE5229D35B6B4A64756E2164756E21
8
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2luZGV4LnRzIiwgInNyYy91dGlscy9yb3RhdGlvbi50cyIsICJzcmMvY29uZmlnL3Jlc29sdmUtb3B0aW9ucy50cyIsICJzcmMvdXRpbHMvcmVwb3J0LnRzIiwgInNyYy9jb250ZXh0L2VucmljaC50cyIsICJzcmMvY29udGV4dC9yZXF1ZXN0LWNvbnRleHQudHMiLCAic3JjL2NvbnRleHQvc3RvcmFnZS50cyIsICJzcmMvZXh0ZW5zaW9ucy9iYW5uZXIudHMiLCAic3JjL2V4dGVuc2lvbnMvaW5kZXgudHMiLCAic3JjL2hlbHBlcnMvc3RhdHVzLnRzIiwgInNyYy9sb2dnZXIvaW5kZXgudHMiLCAic3JjL3NhbXBsaW5nL2dsb2IudHMiLCAic3JjL3NhbXBsaW5nL2luZGV4LnRzIiwgInNyYy91dGlscy9kdXJhdGlvbi50cyIsICJzcmMvdXRpbHMvcmVkYWN0LnRzIiwgInNyYy9sb2dnZXIvY3JlYXRlLWxvZ2dlci50cyIsICJzcmMvdXRpbHMvZXJyb3IudHMiLCAic3JjL291dHB1dC9pbmRleC50cyIsICJzcmMvb3V0cHV0L2ZpbGUtc2luay50cyIsICJzcmMvb3V0cHV0L2ZzLnRzIiwgInNyYy9vdXRwdXQvcm90YXRpb24tbWFuYWdlci50cyIsICJzcmMvb3V0cHV0L2tleWVkLW11dGV4LnRzIiwgInNyYy9vdXRwdXQvZmlsZS50cyIsICJzcmMvbG9nZ2VyL2VtaXQudHMiLCAic3JjL2xvZ2dlci9oYW5kbGUtaHR0cC1lcnJvci50cyIsICJzcmMvbWlkZGxld2FyZS9yZXF1ZXN0LWlkLnRzIiwgInNyYy9vdXRwdXQvc2h1dGRvd24udHMiLCAic3JjL3dlYnNvY2tldC93cmFwLXdzLnRzIiwgInNyYy9lcnJvcnMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiaW1wb3J0IHsgRWx5c2lhIH0gZnJvbSAnZWx5c2lhJ1xuaW1wb3J0IHsgcmVzb2x2ZU9wdGlvbnMgfSBmcm9tICcuL2NvbmZpZy9yZXNvbHZlLW9wdGlvbnMnXG5pbXBvcnQge1xuICBhcHBseVJlcXVlc3RFbnJpY2hlcnMsXG4gIGFwcGx5UmVzcG9uc2VFbnJpY2hlcnMsXG4gIHJlc29sdmVFbnJpY2hlcnNcbn0gZnJvbSAnLi9jb250ZXh0L2VucmljaCdcbmltcG9ydCB7IGNyZWF0ZVJlcXVlc3RDb250ZXh0U3RvcmUgfSBmcm9tICcuL2NvbnRleHQvcmVxdWVzdC1jb250ZXh0J1xuaW1wb3J0IHsgbG9nZ2VyU3RvcmFnZSwgbm9vcFJlcXVlc3RMb2dnZXIgfSBmcm9tICcuL2NvbnRleHQvc3RvcmFnZSdcbmltcG9ydCB7IHN0YXJ0U2VydmVyIH0gZnJvbSAnLi9leHRlbnNpb25zJ1xuaW1wb3J0IHsgZ2V0U3RhdHVzQ29kZSwgaXNTdGF0dXNSZXNwb25zZSB9IGZyb20gJy4vaGVscGVycy9zdGF0dXMnXG5pbXBvcnQgdHlwZSB7XG4gIExvZ0ZpZWxkcyxcbiAgTG9naXhseXNpYVN0b3JlLFxuICBMb2dMZXZlbCxcbiAgT3B0aW9ucyxcbiAgUmVxdWVzdFNjb3BlZExvZ2dlcixcbiAgU3RvcmVEYXRhXG59IGZyb20gJy4vaW50ZXJmYWNlcydcbmltcG9ydCB7IGNyZWF0ZVBsdWdpbkxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyJ1xuaW1wb3J0IHsgcmVzb2x2ZVNpbmtzLCBzaG91bGRMb2cgfSBmcm9tICcuL2xvZ2dlci9lbWl0J1xuaW1wb3J0IHsgZXJyb3JTdGF0dXMgfSBmcm9tICcuL2xvZ2dlci9oYW5kbGUtaHR0cC1lcnJvcidcbmltcG9ydCB7XG4gIGdldE9yQ3JlYXRlUmVxdWVzdElkLFxuICByZXNvbHZlUmVxdWVzdElkQ29uZmlnXG59IGZyb20gJy4vbWlkZGxld2FyZS9yZXF1ZXN0LWlkJ1xuaW1wb3J0IHsgY2xvc2VUcmFuc3BvcnRzIH0gZnJvbSAnLi9vdXRwdXQnXG5pbXBvcnQgeyBjbG9zZUFsbEZpbGVTaW5rcyB9IGZyb20gJy4vb3V0cHV0L2ZpbGUtc2luaydcbmltcG9ydCB7XG4gIGZsdXNoQWxsLFxuICByYWNlV2l0aFRpbWVvdXQsXG4gIHJlcG9ydFNodXRkb3duVGltZW91dFxufSBmcm9tICcuL291dHB1dC9zaHV0ZG93bidcbmltcG9ydCB7IGVsYXBzZWRNcyB9IGZyb20gJy4vdXRpbHMvZHVyYXRpb24nXG5pbXBvcnQgeyBjcmVhdGVXc0hhbmRsZXJXcmFwcGVyIH0gZnJvbSAnLi93ZWJzb2NrZXQvd3JhcC13cydcblxuLyoqXG4gKiBFbXB0eSBzaW5nbGV0b24gc2xvdHMgbXVzdCBub3QgdXNlIGBSZWNvcmQ8c3RyaW5nLCBuZXZlcj5gOiBpbnRlcnNlY3RpbmcgdGhhdCB3aXRoIEVseXNpYSdzIGBDb250ZXh0YFxuICogbWFrZXMgZXZlcnkga2V5IChpbmNsdWRpbmcgYHN0b3JlYCkgYmVjb21lIGBuZXZlcmAgYmVjYXVzZSBlYWNoIGtleSBpcyBtZXJnZWQgd2l0aCBgbmV2ZXJgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVtcHR5RWx5c2lhU2xvdCB7XG4gIHJlYWRvbmx5IF9fbG9naXhseXNpYUVtcHR5PzogbmV2ZXJcbn1cblxuY29uc3QgREVGQVVMVF9TVEFUVVMgPSAyMDBcblxuLyoqXG4gKiBUaGUgc3RhdHVzIHRoZSBjbGllbnQgYWN0dWFsbHkgc2Vlcy4gQSBgc3RhdHVzKClgIHJlc3VsdCBjYXJyaWVzIGl0cyBvd25cbiAqIGNvZGUuIEEgcmV0dXJuZWQgYFJlc3BvbnNlYCBrZWVwcyBpdHMgb3duIHN0YXR1cyB1bmxlc3MgdGhhdCBpcyAyMDAsIGluXG4gKiB3aGljaCBjYXNlIGBzZXQuc3RhdHVzYCBhcHBsaWVzLCBhcyBpbiBFbHlzaWEncyBgbWVyZ2VTdGF0dXNgLiBPdGhlcndpc2VcbiAqIEVseXNpYSBzZW5kcyBgc2V0LnN0YXR1c2AsIHdoaWNoIHN0YXlzIDIwMCB1bmxlc3MgYSBoYW5kbGVyIGFzc2lnbmVkIG9uZS5cbiAqL1xuY29uc3QgcmVzb2x2ZUhhbmRsZWRTdGF0dXMgPSAoXG4gIHNldFN0YXR1czogdW5rbm93bixcbiAgcmVzcG9uc2U6IHVua25vd25cbik6IG51bWJlciA9PiB7XG4gIGlmIChpc1N0YXR1c1Jlc3BvbnNlKHJlc3BvbnNlKSkge1xuICAgIHJldHVybiByZXNwb25zZS5jb2RlXG4gIH1cblxuICBpZiAocmVzcG9uc2UgaW5zdGFuY2VvZiBSZXNwb25zZSAmJiByZXNwb25zZS5zdGF0dXMgIT09IERFRkFVTFRfU1RBVFVTKSB7XG4gICAgcmV0dXJuIHJlc3BvbnNlLnN0YXR1c1xuICB9XG5cbiAgaWYgKHNldFN0YXR1cyA9PT0gdW5kZWZpbmVkIHx8IHNldFN0YXR1cyA9PT0gbnVsbCkge1xuICAgIHJldHVybiBERUZBVUxUX1NUQVRVU1xuICB9XG5cbiAgcmV0dXJuIGdldFN0YXR1c0NvZGUoc2V0U3RhdHVzKVxufVxuXG5jb25zdCBsZXZlbEZvclN0YXR1cyA9IChzdGF0dXM6IG51bWJlcik6ICdJTkZPJyB8ICdXQVJOSU5HJyB8ICdFUlJPUicgPT4ge1xuICBpZiAoc3RhdHVzID49IDUwMCkge1xuICAgIHJldHVybiAnRVJST1InXG4gIH1cbiAgaWYgKHN0YXR1cyA+PSA0MDApIHtcbiAgICByZXR1cm4gJ1dBUk5JTkcnXG4gIH1cbiAgcmV0dXJuICdJTkZPJ1xufVxuXG4vKipcbiAqIEV4cGxpY2l0IHNpbmdsZXRvbiB3aXRob3V0IEVseXNpYSdzIGBTaW5nbGV0b25CYXNlYCBgUmVjb3JkPHN0cmluZywgdW5rbm93bj5gIG9uIGRlY29yYXRvci9kZXJpdmUvcmVzb2x2ZSBzb1xuICogbWVyZ2VkIGBDb250ZXh0YCBhbmQgV2ViU29ja2V0IGB3cy5kYXRhYCBrZWVwIHByZWNpc2Uga2V5cyBhZnRlciBgLnVzZShsb2dpeGx5c2lhKCkpYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2dpeGx5c2lhU2luZ2xldG9uPFRGaWVsZHMgZXh0ZW5kcyBvYmplY3QgPSBMb2dGaWVsZHM+IHtcbiAgZGVjb3JhdG9yOiBFbXB0eUVseXNpYVNsb3RcbiAgZGVyaXZlOiB7XG4gICAgbG9nOiBSZXF1ZXN0U2NvcGVkTG9nZ2VyPFRGaWVsZHM+XG4gIH1cbiAgcmVzb2x2ZTogRW1wdHlFbHlzaWFTbG90XG4gIHN0b3JlOiBMb2dpeGx5c2lhU3RvcmVcbn1cblxuLy8gRWx5c2lhJ3MgYFNpbmdsZXRvbkJhc2VgIHNsb3RzIGFyZSBgUmVjb3JkPHN0cmluZywgdW5rbm93bj5gOyBvdXJzIGFyZSBpbnRlbnRpb25hbGx5IGNsb3NlZCAoc2VlICMyMjApLlxuZXhwb3J0IHR5cGUgTG9naXhseXNpYTxURmllbGRzIGV4dGVuZHMgb2JqZWN0ID0gTG9nRmllbGRzPiA9IEVseXNpYTxcbiAgJycsXG4gIC8vIEB0cy1leHBlY3QtZXJyb3Ig4oCUIGNsb3NlZCBzbG90cyBhcmUgY29ycmVjdCBhdCBydW50aW1lIGFuZCBmb3IgbWVyZ2VkIGB3cy5kYXRhYCBpbmZlcmVuY2UuXG4gIExvZ2l4bHlzaWFTaW5nbGV0b248VEZpZWxkcz5cbj5cblxuZXhwb3J0IHR5cGUgTG9naXhseXNpYVBsdWdpbjxURmllbGRzIGV4dGVuZHMgb2JqZWN0ID0gTG9nRmllbGRzPiA9XG4gIExvZ2l4bHlzaWE8VEZpZWxkcz4gJiB7XG4gICAgd3JhcFdzOiBSZXR1cm5UeXBlPHR5cGVvZiBjcmVhdGVXc0hhbmRsZXJXcmFwcGVyPlxuICB9XG5cbmNvbnN0IERFRkFVTFRfRkxVU0hfVElNRU9VVF9NUyA9IDUwMDBcblxuLyoqXG4gKiBUaGUgcmVzcG9uc2UgaGVhZGVycyBhbiBlbnJpY2hlciBnZXRzIHRvIHJlYWQuIGBzZXQuaGVhZGVyc2AgYWxvbmUgbWlzc2VzXG4gKiBhbnl0aGluZyBhIGhhbmRsZXIgcHV0IG9uIGEgcmV0dXJuZWQgYFJlc3BvbnNlYCAoYSBgY29udGVudC1sZW5ndGhgLCBzYXkpLFxuICogc28gdGhlIHR3byBhcmUgbWVyZ2VkIOKAlCB3aXRoIGBzZXQuaGVhZGVyc2Agd2lubmluZywgc2luY2UgRWx5c2lhIGFwcGxpZXNcbiAqIGl0IGxhc3QuIE9ubHkgYnVpbHQgd2hlbiBhbiBlbnJpY2hlciB3aWxsIGFjdHVhbGx5IHJlYWQgaXQuXG4gKi9cbmNvbnN0IHJlYWRhYmxlUmVzcG9uc2VIZWFkZXJzID0gKFxuICBzZXRIZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXI+LFxuICByZXNwb25zZUhlYWRlcnM/OiBIZWFkZXJzXG4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiB7XG4gIGNvbnN0IG1lcmdlZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fVxuICBpZiAocmVzcG9uc2VIZWFkZXJzKSB7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgcmVzcG9uc2VIZWFkZXJzKSB7XG4gICAgICBtZXJnZWRba2V5XSA9IHZhbHVlXG4gICAgfVxuICB9XG4gIHJldHVybiBPYmplY3QuYXNzaWduKG1lcmdlZCwgc2V0SGVhZGVycylcbn1cblxuLyoqXG4gKiBAdGVtcGxhdGUgVEZpZWxkcyAtIEZpZWxkIGJhZyBmb3IgdGhlIHJlcXVlc3Qtc2NvcGVkIGBsb2dgLiBTdXBwbHkgeW91ciBvd25cbiAqIGludGVyZmFjZSB0byBoYXZlIFR5cGVTY3JpcHQgcmVqZWN0IG1pc3NwZWxsZWQgY29udGV4dCBrZXlzOyB0aGUgZGVmYXVsdFxuICogYWxsb3dzIGFueSBrZXksIHNvIHVudHlwZWQgdXNhZ2UgaXMgdW5jaGFuZ2VkLlxuICovXG5jb25zdCBjcmVhdGVMb2dpeGx5c2lhUGx1Z2luID0gPFRGaWVsZHMgZXh0ZW5kcyBvYmplY3QgPSBMb2dGaWVsZHM+KFxuICByYXdPcHRpb25zOiBPcHRpb25zID0ge31cbik6IExvZ2l4bHlzaWFQbHVnaW48VEZpZWxkcz4gPT4ge1xuICBjb25zdCBvcHRpb25zID0gcmVzb2x2ZU9wdGlvbnMocmF3T3B0aW9ucylcbiAgY29uc3QgZGlkQ3VzdG9tTG9nID0gbmV3IFdlYWtTZXQ8UmVxdWVzdD4oKVxuICBjb25zdCBjbG9zZWQgPSBuZXcgV2Vha1NldDxSZXF1ZXN0PigpXG4gIGNvbnN0IHJlcXVlc3RTdGFydFRpbWVzID0gbmV3IFdlYWtNYXA8UmVxdWVzdCwgYmlnaW50PigpXG4gIGNvbnN0IGNvbnRleHRTdG9yZSA9IGNyZWF0ZVJlcXVlc3RDb250ZXh0U3RvcmUoKVxuICBjb25zdCBiYXNlTG9nZ2VyID0gY3JlYXRlUGx1Z2luTG9nZ2VyKG9wdGlvbnMsIGNvbnRleHRTdG9yZSlcbiAgY29uc3Qgd3JhcFdzID0gY3JlYXRlV3NIYW5kbGVyV3JhcHBlcihvcHRpb25zLCBiYXNlTG9nZ2VyLCBjb250ZXh0U3RvcmUpXG4gIGNvbnN0IHJlcXVlc3RJZENvbmZpZyA9IHJlc29sdmVSZXF1ZXN0SWRDb25maWcob3B0aW9ucy5jb25maWc/LnJlcXVlc3RJZClcbiAgY29uc3QgZW5yaWNoZXJzID0gcmVzb2x2ZUVucmljaGVycyhvcHRpb25zLmNvbmZpZz8uZW5yaWNoZXJzKVxuICBjb25zdCBvblNpbmtFcnJvciA9IG9wdGlvbnMuY29uZmlnPy5vbkVycm9yXG4gIGNvbnN0IGxvZ0ZpbHRlciA9IG9wdGlvbnMuY29uZmlnPy5sb2dGaWx0ZXJcbiAgY29uc3Qgc2lua3MgPSByZXNvbHZlU2lua3Mob3B0aW9ucy5jb25maWcpXG5cbiAgLyoqXG4gICAqIEEgY3VzdG9tIGxvZyBpbnNpZGUgYSByZXF1ZXN0LiBJdCBhcHBsaWVzIHRoZSBzYW1lIGdhdGUgdGhlIGxvZ2dlcidzIG93blxuICAgKiBgZGVidWdgL2BpbmZvYC8uLi4gYXBwbHksIGZvciB0d28gcmVhc29uczogYSByZWNvcmQgdGhlIGxldmVsIGZpbHRlciBkcm9wc1xuICAgKiBtdXN0IG5vdCBjbGFpbSB0aGUgcmVxdWVzdCBhbmQgc3VwcHJlc3MgaXRzIGFjY2VzcyBsaW5lLCBhbmQgdGhlIHJlY29yZFxuICAgKiB0aGF0IGRvZXMgZ28gb3V0IGhhcyB0byBiZSB0aW1lZCBmcm9tIHRoZSByZXF1ZXN0J3Mgc3RhcnQgcmF0aGVyIHRoYW4gZnJvbVxuICAgKiB0aGUgbW9tZW50IHRoZSBoYW5kbGVyIGNhbGxlZCBpdC5cbiAgICovXG4gIGNvbnN0IGVtaXRDdXN0b21Mb2cgPSAoXG4gICAgbGV2ZWw6IExvZ0xldmVsLFxuICAgIHJlcXVlc3Q6IFJlcXVlc3QsXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIGNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiB2b2lkID0+IHtcbiAgICBpZiAoc2lua3MuaXNFZmZlY3RpdmVseURpc2FibGVkIHx8ICFzaG91bGRMb2cobGV2ZWwsIGxvZ0ZpbHRlcikpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGRpZEN1c3RvbUxvZy5hZGQocmVxdWVzdClcbiAgICBiYXNlTG9nZ2VyLmxvZyhcbiAgICAgIGxldmVsLFxuICAgICAgcmVxdWVzdCxcbiAgICAgIHsgY29udGV4dCwgbWVzc2FnZSB9LFxuICAgICAgeyBiZWZvcmVUaW1lOiByZXF1ZXN0U3RhcnRUaW1lcy5nZXQocmVxdWVzdCkgPz8gcHJvY2Vzcy5ocnRpbWUuYmlnaW50KCkgfVxuICAgIClcbiAgfVxuXG4gIGNvbnN0IGxvZ2dlciA9IHtcbiAgICAuLi5iYXNlTG9nZ2VyLFxuICAgIGRlYnVnOiAoXG4gICAgICByZXF1ZXN0OiBSZXF1ZXN0LFxuICAgICAgbWVzc2FnZTogc3RyaW5nLFxuICAgICAgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgKSA9PiB7XG4gICAgICBlbWl0Q3VzdG9tTG9nKCdERUJVRycsIHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXG4gICAgfSxcbiAgICBlcnJvcjogKFxuICAgICAgcmVxdWVzdDogUmVxdWVzdCxcbiAgICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICAgIGNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICkgPT4ge1xuICAgICAgZW1pdEN1c3RvbUxvZygnRVJST1InLCByZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KVxuICAgIH0sXG4gICAgaW5mbzogKFxuICAgICAgcmVxdWVzdDogUmVxdWVzdCxcbiAgICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICAgIGNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICkgPT4ge1xuICAgICAgZW1pdEN1c3RvbUxvZygnSU5GTycsIHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXG4gICAgfSxcbiAgICB3YXJuOiAoXG4gICAgICByZXF1ZXN0OiBSZXF1ZXN0LFxuICAgICAgbWVzc2FnZTogc3RyaW5nLFxuICAgICAgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgKSA9PiB7XG4gICAgICBlbWl0Q3VzdG9tTG9nKCdXQVJOSU5HJywgcmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dClcbiAgICB9XG4gIH1cblxuICBjb25zdCBjcmVhdGVSZXF1ZXN0U2NvcGVkTG9nZ2VyID0gKFxuICAgIHJlcXVlc3Q6IFJlcXVlc3RcbiAgKTogUmVxdWVzdFNjb3BlZExvZ2dlciA9PiAoe1xuICAgIGRlYnVnOiAobWVzc2FnZSwgY29udGV4dCkgPT5cbiAgICAgIGVtaXRDdXN0b21Mb2coJ0RFQlVHJywgcmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dCksXG4gICAgZXJyb3I6IChtZXNzYWdlLCBjb250ZXh0KSA9PlxuICAgICAgZW1pdEN1c3RvbUxvZygnRVJST1InLCByZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KSxcbiAgICBpbmZvOiAobWVzc2FnZSwgY29udGV4dCkgPT5cbiAgICAgIGVtaXRDdXN0b21Mb2coJ0lORk8nLCByZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KSxcbiAgICBtZXJnZUNvbnRleHQ6IHBhcnRpYWwgPT4gY29udGV4dFN0b3JlLm1lcmdlQ29udGV4dChyZXF1ZXN0LCBwYXJ0aWFsKSxcbiAgICB3YXJuOiAobWVzc2FnZSwgY29udGV4dCkgPT5cbiAgICAgIGVtaXRDdXN0b21Mb2coJ1dBUk5JTkcnLCByZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KVxuICB9KVxuXG4gIC8qKlxuICAgKiBFdmVyeXRoaW5nIHRoZSBleGl0cyBzaGFyZSBvbmNlIHRoZSBzdGF0dXMgaXMga25vd246IGVjaG8gdGhlIHJlcXVlc3QgaWQsXG4gICAqIHJ1biB0aGUgcmVzcG9uc2UtcGhhc2UgZW5yaWNoZXJzLCBhbmQgcmVzb2x2ZSB0YWlsIHNhbXBsaW5nIOKAlCBhbGwgYmVmb3JlXG4gICAqIHRoZSByZXF1ZXN0J3MgZmluYWwgbG9nIGxpbmUsIHNvIGl0IGFuZCBhbnkgcmVwbGF5ZWQgcmVjb3JkcyBzZWUgdGhlIHNhbWVcbiAgICogY29udGV4dC4gUmV0dXJucyB0aGUgdGltaW5nIHN0b3JlIGZvciB0aGF0IGZpbmFsIGxpbmUuXG4gICAqXG4gICAqIGBzZXRIZWFkZXJzYCBpcyB0aGUgbGl2ZSBgc2V0LmhlYWRlcnNgIGFuZCBpcyB3cml0dGVuIHRvOyB0aGUgbWVyZ2VkIHZpZXdcbiAgICogaGFuZGVkIHRvIGVucmljaGVycyBpcyByZWFkLW9ubHksIHNvIGl0IG11c3Qgbm90IHN0YW5kIGluIGZvciBpdC5cbiAgICovXG4gIGNvbnN0IGNsb3NlUmVxdWVzdCA9IChcbiAgICByZXF1ZXN0OiBSZXF1ZXN0LFxuICAgIHNldEhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlcj4sXG4gICAgc3RhdHVzOiBudW1iZXIsXG4gICAgcmVzcG9uc2VIZWFkZXJzPzogSGVhZGVyc1xuICApOiBTdG9yZURhdGEgPT4ge1xuICAgIGlmIChyZXF1ZXN0SWRDb25maWcpIHtcbiAgICAgIGNvbnN0IGlkID0gY29udGV4dFN0b3JlLmdldENvbnRleHQocmVxdWVzdCkucmVxdWVzdElkIGFzXG4gICAgICAgIHwgc3RyaW5nXG4gICAgICAgIHwgdW5kZWZpbmVkXG4gICAgICBpZiAoaWQpIHtcbiAgICAgICAgc2V0SGVhZGVyc1tyZXF1ZXN0SWRDb25maWcuaGVhZGVyXSA9IGlkXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgc3RvcmU6IFN0b3JlRGF0YSA9IHtcbiAgICAgIGJlZm9yZVRpbWU6IHJlcXVlc3RTdGFydFRpbWVzLmdldChyZXF1ZXN0KSA/PyAwblxuICAgIH1cblxuICAgIGlmIChlbnJpY2hlcnMpIHtcbiAgICAgIGFwcGx5UmVzcG9uc2VFbnJpY2hlcnMoXG4gICAgICAgIGVucmljaGVycyxcbiAgICAgICAgY29udGV4dFN0b3JlLFxuICAgICAgICB7XG4gICAgICAgICAgZHVyYXRpb25NczogZWxhcHNlZE1zKHN0b3JlLmJlZm9yZVRpbWUpLFxuICAgICAgICAgIGhlYWRlcnM6IHJlYWRhYmxlUmVzcG9uc2VIZWFkZXJzKHNldEhlYWRlcnMsIHJlc3BvbnNlSGVhZGVycyksXG4gICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICBzdGF0dXNcbiAgICAgICAgfSxcbiAgICAgICAgb25TaW5rRXJyb3JcbiAgICAgIClcbiAgICB9XG5cbiAgICBsb2dnZXIuZmluYWxpemVSZXF1ZXN0KHJlcXVlc3QsIHN0b3JlLCBzdGF0dXMpXG4gICAgcmV0dXJuIHN0b3JlXG4gIH1cblxuICBjb25zdCB1c2VBc3luY0xvY2FsU3RvcmFnZSA9IG9wdGlvbnMuY29uZmlnPy51c2VBc3luY0xvY2FsU3RvcmFnZSA9PT0gdHJ1ZVxuXG4gIC8qKlxuICAgKiBSZXN0b3JlcyB0aGUgbm8tb3AgbG9nZ2VyIG9uY2UgYSByZXF1ZXN0IGlzIG92ZXIsIHNvIGEgcHJvbWlzZSB0aGF0XG4gICAqIG91dGxpdmVzIGl0IGFuZCBjYWxscyBgdXNlTG9nZ2VyKClgIHdyaXRlcyBub3doZXJlIGluc3RlYWQgb2YgaW50b1xuICAgKiB3aGljaGV2ZXIgcmVxdWVzdCBoYXBwZW5lZCB0byBydW4gbGFzdC5cbiAgICovXG4gIGNvbnN0IGV4aXRSZXF1ZXN0U2NvcGUgPSAoKTogdm9pZCA9PiB7XG4gICAgaWYgKHVzZUFzeW5jTG9jYWxTdG9yYWdlKSB7XG4gICAgICBsb2dnZXJTdG9yYWdlLmVudGVyV2l0aChub29wUmVxdWVzdExvZ2dlcilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIHRpbWluZyBzdG9yZSBmb3IgdGhlIGVycm9yIGxpbmUuIFdoZW4gYSBob29rIGFmdGVyIHRoZSBoYW5kbGVyIHRocm93cyxcbiAgICogb25FcnJvciBydW5zIGZvciBhIHJlcXVlc3Qgb25BZnRlckhhbmRsZSBhbHJlYWR5IGNsb3NlZDogaXRzIHN1Y2Nlc3MgbGluZVxuICAgKiBpcyBvbiB0aGUgd2lyZSBhbmQgY2Fubm90IGJlIHJldHJhY3RlZCwgYnV0IHRoZSBlcnJvciBsaW5lIHN0aWxsIGhhcyB0b1xuICAgKiBjYXJyeSB0aGUgcmVxdWVzdCdzIHJlYWwgZHVyYXRpb24sIGFuZCBjbG9zaW5nIHR3aWNlIHdvdWxkIHJlc29sdmUgdGFpbFxuICAgKiBzYW1wbGluZyB0d2ljZSBmb3IgdGhlIHNhbWUgcmVxdWVzdC5cbiAgICovXG4gIGNvbnN0IGVycm9yU3RvcmUgPSAoXG4gICAgcmVxdWVzdDogUmVxdWVzdCxcbiAgICBzZXRIZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXI+LFxuICAgIGVycm9yOiB1bmtub3duXG4gICk6IFN0b3JlRGF0YSA9PiB7XG4gICAgaWYgKGNsb3NlZC5oYXMocmVxdWVzdCkpIHtcbiAgICAgIHJldHVybiB7IGJlZm9yZVRpbWU6IHJlcXVlc3RTdGFydFRpbWVzLmdldChyZXF1ZXN0KSA/PyAwbiB9XG4gICAgfVxuXG4gICAgY29uc3Qgc3RvcmUgPSBjbG9zZVJlcXVlc3QocmVxdWVzdCwgc2V0SGVhZGVycywgZXJyb3JTdGF0dXMoZXJyb3IpKVxuICAgIGNsb3NlZC5hZGQocmVxdWVzdClcbiAgICByZXR1cm4gc3RvcmVcbiAgfVxuXG4gIGNvbnN0IGVtaXRBY2Nlc3NMaW5lID0gKFxuICAgIHJlcXVlc3Q6IFJlcXVlc3QsXG4gICAgc3RhdHVzOiBudW1iZXIsXG4gICAgc3RvcmU6IFN0b3JlRGF0YVxuICApOiB2b2lkID0+IHtcbiAgICBjb25zdCBhY2N1bXVsYXRlZCA9IGNvbnRleHRTdG9yZS5nZXRDb250ZXh0KHJlcXVlc3QpXG4gICAgY29uc3QgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7IHN0YXR1cyB9XG4gICAgaWYgKE9iamVjdC5rZXlzKGFjY3VtdWxhdGVkKS5sZW5ndGggPiAwKSB7XG4gICAgICBkYXRhLmNvbnRleHQgPSB7IC4uLmFjY3VtdWxhdGVkIH1cbiAgICB9XG5cbiAgICBsb2dnZXIubG9nKGxldmVsRm9yU3RhdHVzKHN0YXR1cyksIHJlcXVlc3QsIGRhdGEsIHN0b3JlKVxuICB9XG5cbiAgY29uc3QgYXBwID0gbmV3IEVseXNpYSh7XG4gICAgZGV0YWlsOiB7XG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgJ0xvZ2l4bHlzaWEgaXMgYSBwbHVnaW4gZm9yIEVseXNpYSB0aGF0IHByb3ZpZGVzIGEgbG9nZ2VyIGFuZCBwaW5vIGxvZ2dlci4nLFxuICAgICAgdGFnczogWydsb2dnaW5nJywgJ3Bpbm8nXVxuICAgIH0sXG4gICAgbmFtZTogJ0xvZ2l4bHlzaWEnXG4gIH0pXG5cbiAgLy8gQHRzLWV4cGVjdC1lcnJvciDigJQgZGVyaXZlZCBsb2cgdHlwaW5nIG1hdGNoZXMgTG9naXhseXNpYVNpbmdsZXRvbi5cbiAgY29uc3QgcGx1Z2luID0gYXBwXG4gICAgLnN0YXRlKCdsb2dnZXInLCBsb2dnZXIpXG4gICAgLnN0YXRlKCdwaW5vJywgbG9nZ2VyLnBpbm8pXG4gICAgLnN0YXRlKCdiZWZvcmVUaW1lJywgMG4pXG4gICAgLmRlcml2ZSgoeyByZXF1ZXN0IH0pID0+ICh7IGxvZzogY3JlYXRlUmVxdWVzdFNjb3BlZExvZ2dlcihyZXF1ZXN0KSB9KSlcbiAgICAub25TdGFydCgoeyBzZXJ2ZXIgfSk6IHZvaWQgPT4ge1xuICAgICAgaWYgKHNlcnZlcikge1xuICAgICAgICBzdGFydFNlcnZlcihzZXJ2ZXIsIG9wdGlvbnMpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBwb3J0ID0gTnVtYmVyKHByb2Nlc3MuZW52LlBPUlQpIHx8IDMwMDBcbiAgICAgICAgY29uc3QgaG9zdG5hbWUgPSBwcm9jZXNzLmVudi5IT1NUIHx8ICdsb2NhbGhvc3QnXG4gICAgICAgIHN0YXJ0U2VydmVyKHsgaG9zdG5hbWUsIHBvcnQsIHByb3RvY29sOiAnaHR0cCcgfSwgb3B0aW9ucylcbiAgICAgIH1cbiAgICB9KVxuICAgIC5vblN0b3AoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdGltZW91dE1zID1cbiAgICAgICAgb3B0aW9ucy5jb25maWc/LmZsdXNoVGltZW91dE1zID8/IERFRkFVTFRfRkxVU0hfVElNRU9VVF9NU1xuICAgICAgY29uc3QgdGltZWRPdXQgPSBhd2FpdCByYWNlV2l0aFRpbWVvdXQoZmx1c2hBbGwob3B0aW9ucyksIHRpbWVvdXRNcylcbiAgICAgIC8vIEEgemVybyB0aW1lb3V0IG1lYW5zIHRoZSBjYWxsZXIgb3B0ZWQgb3V0IG9mIHdhaXRpbmcsIHNvIHRoZSBmbHVzaFxuICAgICAgLy8gXCJ0aW1pbmcgb3V0XCIgaXMgZXhwZWN0ZWQgYW5kIG5vdCB3b3J0aCByZXBvcnRpbmcuXG4gICAgICBpZiAodGltZWRPdXQgJiYgdGltZW91dE1zID4gMCkge1xuICAgICAgICByZXBvcnRTaHV0ZG93blRpbWVvdXQob3B0aW9ucy5jb25maWc/Lm9uRXJyb3IsIHRpbWVvdXRNcylcbiAgICAgIH1cbiAgICB9KVxuICAgIC5vblJlcXVlc3QoKHsgcmVxdWVzdCwgc3RvcmUgfSkgPT4ge1xuICAgICAgY29uc3QgYmVmb3JlVGltZSA9IHByb2Nlc3MuaHJ0aW1lLmJpZ2ludCgpXG4gICAgICByZXF1ZXN0U3RhcnRUaW1lcy5zZXQocmVxdWVzdCwgYmVmb3JlVGltZSlcbiAgICAgIC8vIFB1Ymxpc2hlZCBmb3IgaGFuZGxlcnMgdGhhdCByZWFkIGBzdG9yZS5iZWZvcmVUaW1lYC4gVGhlIHBsdWdpbidzIG93blxuICAgICAgLy8gdGltaW5nIGNvbWVzIGZyb20gdGhlIHBlci1yZXF1ZXN0IG1hcCBhYm92ZSwgc2luY2UgRWx5c2lhJ3Mgc3RvcmUgaXNcbiAgICAgIC8vIGFwcC1nbG9iYWwgYW5kIGNvbmN1cnJlbnQgcmVxdWVzdHMgc2hhcmUgdGhpcyBzbG90LlxuICAgICAgc3RvcmUuYmVmb3JlVGltZSA9IGJlZm9yZVRpbWVcbiAgICAgIGxvZ2dlci5iZWdpblJlcXVlc3QocmVxdWVzdClcbiAgICAgIGlmIChyZXF1ZXN0SWRDb25maWcpIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdElkID0gZ2V0T3JDcmVhdGVSZXF1ZXN0SWQocmVxdWVzdCwgcmVxdWVzdElkQ29uZmlnKVxuICAgICAgICBjb250ZXh0U3RvcmUubWVyZ2VDb250ZXh0KHJlcXVlc3QsIHsgcmVxdWVzdElkIH0pXG4gICAgICB9XG5cbiAgICAgIGlmIChlbnJpY2hlcnMpIHtcbiAgICAgICAgYXBwbHlSZXF1ZXN0RW5yaWNoZXJzKGVucmljaGVycywgY29udGV4dFN0b3JlLCByZXF1ZXN0LCBvblNpbmtFcnJvcilcbiAgICAgIH1cblxuICAgICAgaWYgKHVzZUFzeW5jTG9jYWxTdG9yYWdlKSB7XG4gICAgICAgIGxvZ2dlclN0b3JhZ2UuZW50ZXJXaXRoKGNyZWF0ZVJlcXVlc3RTY29wZWRMb2dnZXIocmVxdWVzdCkpXG4gICAgICB9XG4gICAgfSlcbiAgICAub25BZnRlckhhbmRsZSgoeyByZXF1ZXN0LCBzZXQsIHJlc3BvbnNlIH0pID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChjbG9zZWQuaGFzKHJlcXVlc3QpKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNvbHZlSGFuZGxlZFN0YXR1cyhzZXQuc3RhdHVzLCByZXNwb25zZSlcblxuICAgICAgICAvLyBSdW5zIGJlZm9yZSB0aGUgZWFybHkgcmV0dXJuOiBhIHJlcXVlc3QgdGhhdCBvbmx5IGVtaXR0ZWQgY3VzdG9tXG4gICAgICAgIC8vIGxvZ3Mgc3RpbGwgbmVlZHMgaXRzIGJ1ZmZlcmVkIHJlY29yZHMgcmVwbGF5ZWQuXG4gICAgICAgIGNvbnN0IHN0b3JlID0gY2xvc2VSZXF1ZXN0KFxuICAgICAgICAgIHJlcXVlc3QsXG4gICAgICAgICAgc2V0LmhlYWRlcnMsXG4gICAgICAgICAgc3RhdHVzLFxuICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgUmVzcG9uc2UgPyByZXNwb25zZS5oZWFkZXJzIDogdW5kZWZpbmVkXG4gICAgICAgIClcbiAgICAgICAgY2xvc2VkLmFkZChyZXF1ZXN0KVxuXG4gICAgICAgIGlmIChkaWRDdXN0b21Mb2cuaGFzKHJlcXVlc3QpKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBlbWl0QWNjZXNzTGluZShyZXF1ZXN0LCBzdGF0dXMsIHN0b3JlKVxuICAgICAgICAvLyBOb3RoaW5nIGVsc2UgaXMgY2xlYW5lZCB1cCBoZXJlOiB0aGUgdGltaW5ncyBhbmQgdGhlIGNvbnRleHQgYmFnXG4gICAgICAgIC8vIGxpdmUgaW4gV2Vha01hcHMga2V5ZWQgYnkgdGhlIHJlcXVlc3QsIGFuZCBhIGhvb2sgcnVubmluZyBhZnRlciB0aGlzXG4gICAgICAgIC8vIG9uZSBtYXkgc3RpbGwgdGhyb3csIGluIHdoaWNoIGNhc2Ugb25FcnJvciBuZWVkcyBib3RoIHRvIHN0YXlcbiAgICAgICAgLy8gdHJ1dGhmdWwuXG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBleGl0UmVxdWVzdFNjb3BlKClcbiAgICAgIH1cbiAgICB9KVxuICAgIC5vbkVycm9yKCh7IHJlcXVlc3QsIGVycm9yLCBzZXQgfSkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbG9nZ2VyLmhhbmRsZUh0dHBFcnJvcihcbiAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICAgIGVycm9yLFxuICAgICAgICAgIGVycm9yU3RvcmUocmVxdWVzdCwgc2V0LmhlYWRlcnMsIGVycm9yKVxuICAgICAgICApXG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICByZXF1ZXN0U3RhcnRUaW1lcy5kZWxldGUocmVxdWVzdClcbiAgICAgICAgY29udGV4dFN0b3JlLmNsZWFyQ29udGV4dChyZXF1ZXN0KVxuICAgICAgICBleGl0UmVxdWVzdFNjb3BlKClcbiAgICAgIH1cbiAgICB9KVxuICAgIC8vIFNvbWUgZXhpdHMgcmVhY2ggbmVpdGhlciBvbkFmdGVySGFuZGxlIG5vciBvbkVycm9yOiBhIHJlc29sdmUgb3IgZGVyaXZlXG4gICAgLy8gdGhhdCByZXR1cm5zIHN0YXR1cygpLCBvciBhbiBlcnJvciB0aGF0IGFuIGFwcC13aWRlIG9uRXJyb3IgcmVnaXN0ZXJlZFxuICAgIC8vIGJlZm9yZSB0aGlzIHBsdWdpbiBhbnN3ZXJzLiBvbkFmdGVyUmVzcG9uc2Ugc3RpbGwgcnVucyBmb3IgdGhlbSB3aXRoIHRoZVxuICAgIC8vIGZpbmFsIHN0YXR1cyBpbiBzZXQuc3RhdHVzLCBzbyBpdCBjbG9zZXMgYW55IHJlcXVlc3QgbGVmdCBvcGVuLlxuICAgIC5vbkFmdGVyUmVzcG9uc2UoY29udGV4dCA9PiB7XG4gICAgICBjb25zdCB7IHJlcXVlc3QsIHNldCB9ID0gY29udGV4dFxuICAgICAgaWYgKGNsb3NlZC5oYXMocmVxdWVzdCkpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IGdldFN0YXR1c0NvZGUoc2V0LnN0YXR1cylcbiAgICAgICAgY29uc3Qgc3RvcmUgPSBjbG9zZVJlcXVlc3QocmVxdWVzdCwgc2V0LmhlYWRlcnMsIHN0YXR1cylcbiAgICAgICAgY2xvc2VkLmFkZChyZXF1ZXN0KVxuXG4gICAgICAgIC8vIEVseXNpYSdzIEFmdGVyUmVzcG9uc2VIYW5kbGVyIHR5cGUgb21pdHMgYGVycm9yYCwgYnV0IGF0IHJ1bnRpbWUgaXRcbiAgICAgICAgLy8gaG9sZHMgdGhlIHRocm93biB2YWx1ZSBvbiBlcnJvciBleGl0cy5cbiAgICAgICAgY29uc3QgZXJyb3IgPSAnZXJyb3InIGluIGNvbnRleHQgPyBjb250ZXh0LmVycm9yIDogdW5kZWZpbmVkXG4gICAgICAgIGlmIChlcnJvciAhPT0gdW5kZWZpbmVkICYmIHN0YXR1cyA+PSA0MDApIHtcbiAgICAgICAgICBsb2dnZXIuaGFuZGxlSHR0cEVycm9yKHJlcXVlc3QsIGVycm9yLCBzdG9yZSlcbiAgICAgICAgfSBlbHNlIGlmICghZGlkQ3VzdG9tTG9nLmhhcyhyZXF1ZXN0KSkge1xuICAgICAgICAgIGVtaXRBY2Nlc3NMaW5lKHJlcXVlc3QsIHN0YXR1cywgc3RvcmUpXG4gICAgICAgIH1cbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHJlcXVlc3RTdGFydFRpbWVzLmRlbGV0ZShyZXF1ZXN0KVxuICAgICAgICBjb250ZXh0U3RvcmUuY2xlYXJDb250ZXh0KHJlcXVlc3QpXG4gICAgICAgIGV4aXRSZXF1ZXN0U2NvcGUoKVxuICAgICAgfVxuICAgIH0pXG4gICAgLmFzKCdzY29wZWQnKSBhcyBMb2dpeGx5c2lhPFRGaWVsZHM+XG5cbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24ocGx1Z2luLCB7IHdyYXBXcyB9KSBhcyBMb2dpeGx5c2lhUGx1Z2luPFRGaWVsZHM+XG59XG5cbi8qKlxuICogRHJhaW5zIGV2ZXJ5IHRyYW5zcG9ydCBhbmQgZmlsZSBzaW5rOyB3aXRoIGBjbG9zZTogdHJ1ZWAgYWxzbyByZWxlYXNlc1xuICogdGhlbS4gRm9yIHByb2Nlc3NlcyB0aGF0IHN0b3Agd2l0aG91dCBFbHlzaWEncyBgb25TdG9wYCAod29ya2VycyxcbiAqIHNjcmlwdHMsIGN1c3RvbSBzaWduYWwgaGFuZGxlcnMpLiBTYWZlIHRvIGNhbGwgbW9yZSB0aGFuIG9uY2UuXG4gKi9cbmV4cG9ydCBjb25zdCBmbHVzaExvZ2l4bHlzaWEgPSBhc3luYyAoXG4gIG9wdGlvbnM6IE9wdGlvbnMsXG4gIHsgY2xvc2UgPSBmYWxzZSB9OiB7IGNsb3NlPzogYm9vbGVhbiB9ID0ge31cbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICBhd2FpdCBmbHVzaEFsbChvcHRpb25zKVxuICBpZiAoY2xvc2UpIHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoW2Nsb3NlVHJhbnNwb3J0cyhvcHRpb25zKSwgY2xvc2VBbGxGaWxlU2lua3MoKV0pXG4gIH1cbn1cblxuZXhwb3J0IHsgcmVzb2x2ZU9wdGlvbnMgfSBmcm9tICcuL2NvbmZpZy9yZXNvbHZlLW9wdGlvbnMnXG5leHBvcnQgeyB1c2VMb2dnZXIgfSBmcm9tICcuL2NvbnRleHQvc3RvcmFnZSdcbmV4cG9ydCB0eXBlIHsgSHR0cEVycm9ySW5pdCwgSHR0cEVycm9yUGF5bG9hZCB9IGZyb20gJy4vZXJyb3JzJ1xuZXhwb3J0IHsgSHR0cEVycm9yIH0gZnJvbSAnLi9lcnJvcnMnXG5leHBvcnQgdHlwZSB7XG4gIEVucmljaGVyLFxuICBFbnJpY2hlckZpZWxkcyxcbiAgRW5yaWNoZXJMaWtlLFxuICBFbnJpY2hlclJlc3BvbnNlSW5wdXQsXG4gIEhlYWRTYW1wbGluZ0NvbmZpZyxcbiAgTG9nRmllbGRzLFxuICBMb2dnZXIsXG4gIExvZ2l4bHlzaWFDb250ZXh0LFxuICBMb2dpeGx5c2lhU3RvcmUsXG4gIExvZ0xldmVsLFxuICBMb2dQcmVzZXQsXG4gIE9wdGlvbnMsXG4gIFBpbm8sXG4gIFJlcXVlc3RJZENvbmZpZyxcbiAgUmVxdWVzdFNjb3BlZExvZ2dlcixcbiAgU2FtcGxpbmdDb25maWcsXG4gIFN0b3JlRGF0YSxcbiAgVGFpbFNhbXBsaW5nQ29uZmlnLFxuICBUcmFuc3BvcnRcbn0gZnJvbSAnLi9pbnRlcmZhY2VzJ1xuZXhwb3J0IHsgY3JlYXRlTG9nZ2VyLCBjcmVhdGVQbHVnaW5Mb2dnZXIgfSBmcm9tICcuL2xvZ2dlcidcbmV4cG9ydCB0eXBlIHsgUmVzb2x2ZWRSZXF1ZXN0SWRDb25maWcgfSBmcm9tICcuL21pZGRsZXdhcmUvcmVxdWVzdC1pZCdcbmV4cG9ydCB7XG4gIGdldE9yQ3JlYXRlUmVxdWVzdElkLFxuICByZXNvbHZlUmVxdWVzdElkQ29uZmlnXG59IGZyb20gJy4vbWlkZGxld2FyZS9yZXF1ZXN0LWlkJ1xuZXhwb3J0IHR5cGUge1xuICBSZXF1ZXN0T3V0Y29tZSxcbiAgU2FtcGxpbmdEZWNpc2lvbixcbiAgU2FtcGxpbmdSdW50aW1lXG59IGZyb20gJy4vc2FtcGxpbmcnXG5leHBvcnQgeyByZXNvbHZlU2FtcGxpbmcgfSBmcm9tICcuL3NhbXBsaW5nJ1xuZXhwb3J0IHR5cGUgeyBXc0hhbmRsZXJIb29rcyB9IGZyb20gJy4vd2Vic29ja2V0L3dyYXAtd3MnXG5leHBvcnQgeyBjcmVhdGVXc0hhbmRsZXJXcmFwcGVyIH0gZnJvbSAnLi93ZWJzb2NrZXQvd3JhcC13cydcblxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlTG9naXhseXNpYVBsdWdpblxuZXhwb3J0IGNvbnN0IGxvZ2l4bHlzaWE6IHR5cGVvZiBjcmVhdGVMb2dpeGx5c2lhUGx1Z2luID0gY3JlYXRlTG9naXhseXNpYVBsdWdpblxuIiwKICAgICJpbXBvcnQgeyBwcm9taXNlcyBhcyBmcyB9IGZyb20gJ25vZGU6ZnMnXG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnXG5cbmNvbnN0IFNJWkVfUkVHRVggPSAvXig/PGFtb3VudD5cXGQrKD86XFwuXFxkKyk/KSg/PHVuaXQ+W0dLTWdrbV1bQmJdPykkL3VcbmNvbnN0IElOVEVSVkFMX1JFR0VYID0gL14oPzxhbW91bnQ+XFxkKykoPzx1bml0PltkaHddKSQvaXVcbmNvbnN0IFJPVEFURURfUkVHRVggPVxuICAvXFwuXFxkezR9LVxcZHsyfS1cXGR7Mn0tXFxkezJ9LVxcZHsyfS1cXGR7Mn0oPzotXFxkezN9KT8oPzotXFxkKyk/KD86XFwuZ3opPyQvdVxuXG5leHBvcnQgY29uc3QgcGFyc2VTaXplID0gKHZhbHVlOiBudW1iZXIgfCBzdHJpbmcpOiBudW1iZXIgPT4ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHZhbHVlKSB8fCB2YWx1ZSA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc2l6ZTogJHt2YWx1ZX1gKVxuICAgIH1cbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuXG4gIGNvbnN0IHRyaW1tZWQgPSB2YWx1ZS50cmltKClcbiAgaWYgKHRyaW1tZWQgIT09ICcnKSB7XG4gICAgY29uc3QgYXNOdW1iZXIgPSBOdW1iZXIodHJpbW1lZClcbiAgICBpZiAoTnVtYmVyLmlzRmluaXRlKGFzTnVtYmVyKSkge1xuICAgICAgaWYgKGFzTnVtYmVyIDw9IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHNpemU6ICR7dmFsdWV9YClcbiAgICAgIH1cbiAgICAgIHJldHVybiBhc051bWJlclxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IG1hdGNoID0gdHJpbW1lZC5tYXRjaChTSVpFX1JFR0VYKVxuICBpZiAoIW1hdGNoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHNpemUgZm9ybWF0OiAke3ZhbHVlfWApXG4gIH1cblxuICBjb25zdCBhbW91bnQgPSBOdW1iZXIobWF0Y2hbMV0pXG4gIGNvbnN0IHVuaXQgPSBtYXRjaFsyXS50b0xvd2VyQ2FzZSgpXG5cbiAgbGV0IGJhc2UgPSAxMDI0XG4gIGlmICh1bml0LnN0YXJ0c1dpdGgoJ20nKSkge1xuICAgIGJhc2UgPSAxMDI0ICogMTAyNFxuICB9IGVsc2UgaWYgKHVuaXQuc3RhcnRzV2l0aCgnZycpKSB7XG4gICAgYmFzZSA9IDEwMjQgKiAxMDI0ICogMTAyNFxuICB9XG5cbiAgcmV0dXJuIE1hdGguZmxvb3IoYW1vdW50ICogYmFzZSlcbn1cblxuZXhwb3J0IGNvbnN0IHBhcnNlSW50ZXJ2YWwgPSAodmFsdWU6IHN0cmluZyk6IG51bWJlciA9PiB7XG4gIGNvbnN0IG1hdGNoID0gdmFsdWUudHJpbSgpLm1hdGNoKElOVEVSVkFMX1JFR0VYKVxuICBpZiAoIW1hdGNoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGludGVydmFsIGZvcm1hdDogJHt2YWx1ZX1gKVxuICB9XG5cbiAgY29uc3QgYW1vdW50ID0gTnVtYmVyKG1hdGNoWzFdKVxuICBjb25zdCB1bml0ID0gbWF0Y2hbMl0udG9Mb3dlckNhc2UoKVxuXG4gIGxldCBtcyA9IDYwICogNjAgKiAxMDAwXG4gIGlmICh1bml0ID09PSAnZCcpIHtcbiAgICBtcyA9IDI0ICogNjAgKiA2MCAqIDEwMDBcbiAgfSBlbHNlIGlmICh1bml0ID09PSAndycpIHtcbiAgICBtcyA9IDcgKiAyNCAqIDYwICogNjAgKiAxMDAwXG4gIH1cblxuICByZXR1cm4gYW1vdW50ICogbXNcbn1cblxuZXhwb3J0IGNvbnN0IHBhcnNlUmV0ZW50aW9uID0gKFxuICB2YWx1ZTogbnVtYmVyIHwgc3RyaW5nXG4pOiB7IHR5cGU6ICdjb3VudCcgfCAndGltZSc7IHZhbHVlOiBudW1iZXIgfSA9PiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgaWYgKCEoTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSkgJiYgdmFsdWUgPiAwKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBtYXhGaWxlcyBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciwgZ290ICR7dmFsdWV9YClcbiAgICB9XG4gICAgcmV0dXJuIHsgdHlwZTogJ2NvdW50JywgdmFsdWUgfVxuICB9XG4gIHJldHVybiB7IHR5cGU6ICd0aW1lJywgdmFsdWU6IHBhcnNlSW50ZXJ2YWwodmFsdWUpIH1cbn1cblxuZXhwb3J0IGNvbnN0IHNob3VsZFJvdGF0ZUJ5U2l6ZSA9IGFzeW5jIChcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgbWF4U2l6ZUJ5dGVzOiBudW1iZXJcbik6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHN0YXQgPSBhd2FpdCBmcy5zdGF0KGZpbGVQYXRoKVxuICAgIHJldHVybiBzdGF0LnNpemUgPiBtYXhTaXplQnl0ZXNcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGdldFJvdGF0ZWRGaWxlcyA9IGFzeW5jIChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXT4gPT4ge1xuICBjb25zdCBkaXIgPSBwYXRoLmRpcm5hbWUoZmlsZVBhdGgpXG4gIGNvbnN0IGJhc2UgPSBwYXRoLmJhc2VuYW1lKGZpbGVQYXRoKVxuXG4gIGxldCBlbnRyaWVzOiBzdHJpbmdbXVxuICB0cnkge1xuICAgIGVudHJpZXMgPSBhd2FpdCBmcy5yZWFkZGlyKGRpcilcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIFtdXG4gIH1cblxuICByZXR1cm4gZW50cmllc1xuICAgIC5maWx0ZXIobmFtZSA9PiBuYW1lLnN0YXJ0c1dpdGgoYCR7YmFzZX0uYCkgJiYgUk9UQVRFRF9SRUdFWC50ZXN0KG5hbWUpKVxuICAgIC5tYXAobmFtZSA9PiBgJHtkaXJ9LyR7bmFtZX1gKVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IExvZ1ByZXNldCwgT3B0aW9ucyB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBwYXJzZUludGVydmFsLCBwYXJzZVJldGVudGlvbiwgcGFyc2VTaXplIH0gZnJvbSAnLi4vdXRpbHMvcm90YXRpb24nXG5cbmNvbnN0IFZBTElEX1BSRVNFVFM6IFJlYWRvbmx5U2V0PExvZ1ByZXNldD4gPSBuZXcgU2V0KFsnZGV2JywgJ3Byb2QnLCAnanNvbiddKVxuXG5jb25zdCB2YWxpZGF0ZUxvZ1JvdGF0aW9uID0gKGNvbmZpZzogT3B0aW9uc1snY29uZmlnJ10pOiB2b2lkID0+IHtcbiAgY29uc3QgbG9nUm90YXRpb24gPSBjb25maWc/LmxvZ1JvdGF0aW9uXG4gIGlmICghbG9nUm90YXRpb24pIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIHRyeSB7XG4gICAgaWYgKGxvZ1JvdGF0aW9uLm1heFNpemUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcGFyc2VTaXplKGxvZ1JvdGF0aW9uLm1heFNpemUpXG4gICAgfVxuICAgIGlmIChsb2dSb3RhdGlvbi5tYXhGaWxlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwYXJzZVJldGVudGlvbihsb2dSb3RhdGlvbi5tYXhGaWxlcylcbiAgICB9XG4gICAgaWYgKGxvZ1JvdGF0aW9uLmludGVydmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHBhcnNlSW50ZXJ2YWwobG9nUm90YXRpb24uaW50ZXJ2YWwpXG4gICAgfVxuICAgIGlmIChcbiAgICAgIGxvZ1JvdGF0aW9uLmNvbXByZXNzaW9uICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIGxvZ1JvdGF0aW9uLmNvbXByZXNzaW9uICE9PSAnZ3ppcCdcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEludmFsaWQgY29tcHJlc3Npb24gYWxnb3JpdGhtOiAke2xvZ1JvdGF0aW9uLmNvbXByZXNzaW9ufWBcbiAgICAgIClcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKVxuICAgIHRocm93IG5ldyBFcnJvcihgbG9naXhseXNpYTogaW52YWxpZCBsb2dSb3RhdGlvbiBjb25maWcg4oCUICR7bWVzc2FnZX1gLCB7XG4gICAgICBjYXVzZTogZXJyb3JcbiAgICB9KVxuICB9XG59XG5cbmNvbnN0IE1BWF9TQU1QTElOR19SQVRFID0gMTAwXG5cbmNvbnN0IGlzUGVyY2VudGFnZSA9ICh2YWx1ZTogdW5rbm93bik6IGJvb2xlYW4gPT5cbiAgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJlxuICBOdW1iZXIuaXNGaW5pdGUodmFsdWUpICYmXG4gIHZhbHVlID49IDAgJiZcbiAgdmFsdWUgPD0gTUFYX1NBTVBMSU5HX1JBVEVcblxuY29uc3QgaXNOb25OZWdhdGl2ZU51bWJlciA9ICh2YWx1ZTogdW5rbm93bik6IGJvb2xlYW4gPT5cbiAgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUodmFsdWUpICYmIHZhbHVlID49IDBcblxuY29uc3QgVkFMSURfU0FNUExJTkdfTEVWRUxTID0gWydERUJVRycsICdJTkZPJywgJ1dBUk5JTkcnLCAnRVJST1InXSBhcyBjb25zdFxuXG5jb25zdCBpbnZhbGlkU2FtcGxpbmcgPSAoZGV0YWlsOiBzdHJpbmcpOiBuZXZlciA9PiB7XG4gIHRocm93IG5ldyBFcnJvcihgbG9naXhseXNpYTogaW52YWxpZCBzYW1wbGluZyBjb25maWcg4oCUICR7ZGV0YWlsfWApXG59XG5cbmNvbnN0IGludmFsaWRGb3JtYXR0aW5nID0gKGRldGFpbDogc3RyaW5nKTogbmV2ZXIgPT4ge1xuICB0aHJvdyBuZXcgRXJyb3IoYGxvZ2l4bHlzaWE6IGludmFsaWQgZm9ybWF0dGluZyBjb25maWcg4oCUICR7ZGV0YWlsfWApXG59XG5cbmNvbnN0IHZhbGlkYXRlU2FtcGxpbmcgPSAoY29uZmlnOiBPcHRpb25zWydjb25maWcnXSk6IHZvaWQgPT4ge1xuICBjb25zdCBzYW1wbGluZyA9IGNvbmZpZz8uc2FtcGxpbmdcbiAgaWYgKCFzYW1wbGluZykge1xuICAgIHJldHVyblxuICB9XG5cbiAgZm9yIChjb25zdCBbbGV2ZWwsIHJhdGVdIG9mIE9iamVjdC5lbnRyaWVzKHNhbXBsaW5nLmhlYWQgPz8ge30pKSB7XG4gICAgaWYgKCFWQUxJRF9TQU1QTElOR19MRVZFTFMuaW5jbHVkZXMobGV2ZWwgYXMgbmV2ZXIpKSB7XG4gICAgICBpbnZhbGlkU2FtcGxpbmcoXG4gICAgICAgIGBoZWFkLiR7bGV2ZWx9IGlzIG5vdCBhIHZhbGlkIGxldmVsIChtdXN0IGJlIERFQlVHLCBJTkZPLCBXQVJOSU5HLCBvciBFUlJPUilgXG4gICAgICApXG4gICAgfVxuICAgIGlmICghaXNQZXJjZW50YWdlKHJhdGUpKSB7XG4gICAgICBpbnZhbGlkU2FtcGxpbmcoYGhlYWQuJHtsZXZlbH0gbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDEwMGApXG4gICAgfVxuICB9XG5cbiAgY29uc3QgeyB0YWlsIH0gPSBzYW1wbGluZ1xuICBpZiAodGFpbD8uc3RhdHVzICE9PSB1bmRlZmluZWQgJiYgIWlzTm9uTmVnYXRpdmVOdW1iZXIodGFpbC5zdGF0dXMpKSB7XG4gICAgaW52YWxpZFNhbXBsaW5nKCd0YWlsLnN0YXR1cyBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlcicpXG4gIH1cbiAgaWYgKHRhaWw/LmR1cmF0aW9uTXMgIT09IHVuZGVmaW5lZCAmJiAhaXNOb25OZWdhdGl2ZU51bWJlcih0YWlsLmR1cmF0aW9uTXMpKSB7XG4gICAgaW52YWxpZFNhbXBsaW5nKCd0YWlsLmR1cmF0aW9uTXMgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXInKVxuICB9XG4gIGlmICh0YWlsPy5wYXRocyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHRhaWwucGF0aHMpKSB7XG4gICAgICBpbnZhbGlkU2FtcGxpbmcoJ3RhaWwucGF0aHMgbXVzdCBiZSBhbiBhcnJheScpXG4gICAgfVxuICAgIGlmIChcbiAgICAgIHRhaWwucGF0aHMuc29tZShwYXRoID0+IHR5cGVvZiBwYXRoICE9PSAnc3RyaW5nJyB8fCBwYXRoLmxlbmd0aCA9PT0gMClcbiAgICApIHtcbiAgICAgIGludmFsaWRTYW1wbGluZygndGFpbC5wYXRocyBtdXN0IGNvbnRhaW4gbm9uLWVtcHR5IGdsb2Igc3RyaW5ncycpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgeyBtYXhCdWZmZXJlZFBlclJlcXVlc3QgfSA9IHNhbXBsaW5nXG4gIGlmIChcbiAgICBtYXhCdWZmZXJlZFBlclJlcXVlc3QgIT09IHVuZGVmaW5lZCAmJlxuICAgICEoTnVtYmVyLmlzSW50ZWdlcihtYXhCdWZmZXJlZFBlclJlcXVlc3QpICYmIG1heEJ1ZmZlcmVkUGVyUmVxdWVzdCA+PSAwKVxuICApIHtcbiAgICBpbnZhbGlkU2FtcGxpbmcoJ21heEJ1ZmZlcmVkUGVyUmVxdWVzdCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXInKVxuICB9XG59XG5cbmNvbnN0IHZhbGlkYXRlRm9ybWF0dGluZyA9IChjb25maWc6IE9wdGlvbnNbJ2NvbmZpZyddKTogdm9pZCA9PiB7XG4gIGNvbnN0IHNsb3dUaHJlc2hvbGQgPSBjb25maWc/LnNsb3dUaHJlc2hvbGRcbiAgY29uc3QgdmVyeVNsb3dUaHJlc2hvbGQgPSBjb25maWc/LnZlcnlTbG93VGhyZXNob2xkXG5cbiAgaWYgKHNsb3dUaHJlc2hvbGQgIT09IHVuZGVmaW5lZCAmJiAhaXNOb25OZWdhdGl2ZU51bWJlcihzbG93VGhyZXNob2xkKSkge1xuICAgIGludmFsaWRGb3JtYXR0aW5nKFxuICAgICAgYHNsb3dUaHJlc2hvbGQgbXVzdCBiZSBhIGZpbml0ZSBub24tbmVnYXRpdmUgbnVtYmVyLCBnb3QgJHtzbG93VGhyZXNob2xkfWBcbiAgICApXG4gIH1cbiAgaWYgKFxuICAgIHZlcnlTbG93VGhyZXNob2xkICE9PSB1bmRlZmluZWQgJiZcbiAgICAhaXNOb25OZWdhdGl2ZU51bWJlcih2ZXJ5U2xvd1RocmVzaG9sZClcbiAgKSB7XG4gICAgaW52YWxpZEZvcm1hdHRpbmcoXG4gICAgICBgdmVyeVNsb3dUaHJlc2hvbGQgbXVzdCBiZSBhIGZpbml0ZSBub24tbmVnYXRpdmUgbnVtYmVyLCBnb3QgJHt2ZXJ5U2xvd1RocmVzaG9sZH1gXG4gICAgKVxuICB9XG4gIGlmIChcbiAgICBzbG93VGhyZXNob2xkICE9PSB1bmRlZmluZWQgJiZcbiAgICB2ZXJ5U2xvd1RocmVzaG9sZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgc2xvd1RocmVzaG9sZCA+IHZlcnlTbG93VGhyZXNob2xkXG4gICkge1xuICAgIGludmFsaWRGb3JtYXR0aW5nKFxuICAgICAgYHNsb3dUaHJlc2hvbGQgKCR7c2xvd1RocmVzaG9sZH0pIG11c3Qgbm90IGV4Y2VlZCB2ZXJ5U2xvd1RocmVzaG9sZCAoJHt2ZXJ5U2xvd1RocmVzaG9sZH0pYFxuICAgIClcbiAgfVxufVxuXG5jb25zdCBQUkVTRVRfREVGQVVMVFM6IFJlY29yZDxMb2dQcmVzZXQsIE5vbk51bGxhYmxlPE9wdGlvbnNbJ2NvbmZpZyddPj4gPSB7XG4gIGRldjoge1xuICAgIHBpbm86IHtcbiAgICAgIHByZXR0eVByaW50OiB0cnVlXG4gICAgfSxcbiAgICBzaG93Q29udGV4dFRyZWU6IHRydWUsXG4gICAgc2hvd1N0YXJ0dXBNZXNzYWdlOiB0cnVlLFxuICAgIHN0YXJ0dXBNZXNzYWdlRm9ybWF0OiAnYmFubmVyJyxcbiAgICB1c2VDb2xvcnM6IHRydWVcbiAgfSxcbiAganNvbjoge1xuICAgIHBpbm86IHtcbiAgICAgIHByZXR0eVByaW50OiBmYWxzZVxuICAgIH0sXG4gICAgc2hvd0NvbnRleHRUcmVlOiBmYWxzZSxcbiAgICBzaG93U3RhcnR1cE1lc3NhZ2U6IGZhbHNlLFxuICAgIHVzZUNvbG9yczogZmFsc2VcbiAgfSxcbiAgcHJvZDoge1xuICAgIGF1dG9SZWRhY3Q6IHRydWUsXG4gICAgcGlubzoge1xuICAgICAgcHJldHR5UHJpbnQ6IGZhbHNlXG4gICAgfSxcbiAgICByZXF1ZXN0SWQ6IHRydWUsXG4gICAgc2hvd0NvbnRleHRUcmVlOiBmYWxzZSxcbiAgICBzaG93U3RhcnR1cE1lc3NhZ2U6IGZhbHNlLFxuICAgIHVzZUNvbG9yczogZmFsc2VcbiAgfVxufVxuXG5jb25zdCBtZXJnZUNvbmZpZyA9IChcbiAgYmFzZTogTm9uTnVsbGFibGU8T3B0aW9uc1snY29uZmlnJ10+LFxuICBvdmVycmlkZT86IE9wdGlvbnNbJ2NvbmZpZyddXG4pOiBOb25OdWxsYWJsZTxPcHRpb25zWydjb25maWcnXT4gPT4ge1xuICBpZiAoIW92ZXJyaWRlKSB7XG4gICAgcmV0dXJuIGJhc2VcbiAgfVxuXG4gIGNvbnN0IG1lcmdlZDogTm9uTnVsbGFibGU8T3B0aW9uc1snY29uZmlnJ10+ID0geyAuLi5iYXNlLCAuLi5vdmVycmlkZSB9XG5cbiAgaWYgKGJhc2UucGlubyB8fCBvdmVycmlkZS5waW5vKSB7XG4gICAgbWVyZ2VkLnBpbm8gPSB7XG4gICAgICAuLi5iYXNlLnBpbm8sXG4gICAgICAuLi5vdmVycmlkZS5waW5vLFxuICAgICAgLi4uKGJhc2UucGlubz8ucHJldHR5UHJpbnQgIT09IHVuZGVmaW5lZCB8fFxuICAgICAgb3ZlcnJpZGUucGlubz8ucHJldHR5UHJpbnQgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IHtcbiAgICAgICAgICAgIHByZXR0eVByaW50OiBvdmVycmlkZS5waW5vPy5wcmV0dHlQcmludCA/PyBiYXNlLnBpbm8/LnByZXR0eVByaW50XG4gICAgICAgICAgfVxuICAgICAgICA6IHt9KVxuICAgIH1cbiAgfVxuXG4gIGlmIChiYXNlLmxvZ0ZpbHRlciB8fCBvdmVycmlkZS5sb2dGaWx0ZXIpIHtcbiAgICBtZXJnZWQubG9nRmlsdGVyID0ge1xuICAgICAgLi4uYmFzZS5sb2dGaWx0ZXIsXG4gICAgICAuLi5vdmVycmlkZS5sb2dGaWx0ZXJcbiAgICB9XG4gIH1cblxuICBpZiAoYmFzZS5zYW1wbGluZyB8fCBvdmVycmlkZS5zYW1wbGluZykge1xuICAgIG1lcmdlZC5zYW1wbGluZyA9IHtcbiAgICAgIC4uLmJhc2Uuc2FtcGxpbmcsXG4gICAgICAuLi5vdmVycmlkZS5zYW1wbGluZ1xuICAgIH1cbiAgfVxuXG4gIGlmIChiYXNlLmxvZ1JvdGF0aW9uIHx8IG92ZXJyaWRlLmxvZ1JvdGF0aW9uKSB7XG4gICAgbWVyZ2VkLmxvZ1JvdGF0aW9uID0ge1xuICAgICAgLi4uYmFzZS5sb2dSb3RhdGlvbixcbiAgICAgIC4uLm92ZXJyaWRlLmxvZ1JvdGF0aW9uXG4gICAgfVxuICB9XG5cbiAgaWYgKGJhc2UudGltZXN0YW1wIHx8IG92ZXJyaWRlLnRpbWVzdGFtcCkge1xuICAgIG1lcmdlZC50aW1lc3RhbXAgPSB7XG4gICAgICAuLi5iYXNlLnRpbWVzdGFtcCxcbiAgICAgIC4uLm92ZXJyaWRlLnRpbWVzdGFtcFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtZXJnZWRcbn1cblxuLyoqIEFwcGxpZXMgcHJlc2V0IGRlZmF1bHRzOyBleHBsaWNpdCBgY29uZmlnYCBrZXlzIG92ZXJyaWRlIHByZXNldCB2YWx1ZXMuICovXG5leHBvcnQgY29uc3QgcmVzb2x2ZU9wdGlvbnMgPSAob3B0aW9uczogT3B0aW9ucyA9IHt9KTogT3B0aW9ucyA9PiB7XG4gIGNvbnN0IHsgcHJlc2V0IH0gPSBvcHRpb25zXG4gIGlmIChwcmVzZXQgJiYgIVZBTElEX1BSRVNFVFMuaGFzKHByZXNldCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGxvZ2l4bHlzaWE6IGludmFsaWQgcHJlc2V0IOKAlCAke3ByZXNldH1gKVxuICB9XG5cbiAgY29uc3QgcmVzb2x2ZWQgPSBwcmVzZXRcbiAgICA/IHtcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgY29uZmlnOiBtZXJnZUNvbmZpZyhQUkVTRVRfREVGQVVMVFNbcHJlc2V0XSwgb3B0aW9ucy5jb25maWcpXG4gICAgICB9XG4gICAgOiBvcHRpb25zXG5cbiAgdmFsaWRhdGVMb2dSb3RhdGlvbihyZXNvbHZlZC5jb25maWcpXG4gIHZhbGlkYXRlU2FtcGxpbmcocmVzb2x2ZWQuY29uZmlnKVxuICB2YWxpZGF0ZUZvcm1hdHRpbmcocmVzb2x2ZWQuY29uZmlnKVxuICByZXR1cm4gcmVzb2x2ZWRcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBTaW5rRXJyb3JDb250ZXh0IH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcblxuY29uc3QgUkVQT1JUX0lOVEVSVkFMX01TID0gNTAwMFxuXG5leHBvcnQgdHlwZSBFcnJvclJlcG9ydGVyID0gKFxuICBlcnJvcjogdW5rbm93bixcbiAgb25FcnJvcj86IChjb250ZXh0OiBTaW5rRXJyb3JDb250ZXh0KSA9PiB2b2lkXG4pID0+IHZvaWRcblxuLyoqXG4gKiBSb3V0ZXMgYSBmYWlsdXJlIHRvIGBjb25maWcub25FcnJvcmAsIG9yIOKAlCB3aGVuIG5vIGhvb2sgaXMgY29uZmlndXJlZCDigJQgdG9cbiAqIHN0ZGVyciBhdCBtb3N0IG9uY2UgcGVyIGludGVydmFsLCBzbyBhIGNvbXBvbmVudCB0aGF0IGZhaWxzIG9uIGV2ZXJ5IHJlcXVlc3RcbiAqIGNhbm5vdCBmbG9vZCB0aGUgdmVyeSBsb2cgaXQgaXMgbWVhbnQgdG8gYmUgZmVlZGluZy5cbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZUVycm9yUmVwb3J0ZXIgPSAoXG4gIHNpbms6IFNpbmtFcnJvckNvbnRleHRbJ3NpbmsnXSxcbiAgbGFiZWw6IHN0cmluZ1xuKTogRXJyb3JSZXBvcnRlciA9PiB7XG4gIGxldCBsYXN0UmVwb3J0ZWRBdCA9IDBcblxuICByZXR1cm4gKGVycm9yLCBvbkVycm9yKSA9PiB7XG4gICAgaWYgKG9uRXJyb3IpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG9uRXJyb3IoeyBlcnJvciwgc2luayB9KVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIFN3YWxsb3cgZXJyb3JzIHRocm93biBieSB0aGUgaG9vayBpdHNlbGYuXG4gICAgICB9XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpXG4gICAgaWYgKG5vdyAtIGxhc3RSZXBvcnRlZEF0IDwgUkVQT1JUX0lOVEVSVkFMX01TKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgbGFzdFJlcG9ydGVkQXQgPSBub3dcbiAgICBjb25zb2xlLmVycm9yKGBbbG9naXhseXNpYV0gJHtsYWJlbH06YCwgZXJyb3IpXG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUge1xuICBFbnJpY2hlckZpZWxkcyxcbiAgRW5yaWNoZXJMaWtlLFxuICBFbnJpY2hlclJlc3BvbnNlSW5wdXQsXG4gIFNpbmtFcnJvckNvbnRleHRcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcydcbmltcG9ydCB7IGNyZWF0ZUVycm9yUmVwb3J0ZXIgfSBmcm9tICcuLi91dGlscy9yZXBvcnQnXG5pbXBvcnQgdHlwZSB7IFJlcXVlc3RDb250ZXh0U3RvcmUgfSBmcm9tICcuL3JlcXVlc3QtY29udGV4dCdcblxuY29uc3QgcmVwb3J0RW5yaWNoZXJFcnJvciA9IGNyZWF0ZUVycm9yUmVwb3J0ZXIoJ2VucmljaGVyJywgJ2VucmljaGVyIGZhaWxlZCcpXG5cbnR5cGUgUmVxdWVzdFBoYXNlID0gKHJlcXVlc3Q6IFJlcXVlc3QpID0+IEVucmljaGVyRmllbGRzXG50eXBlIFJlc3BvbnNlUGhhc2UgPSAoaW5wdXQ6IEVucmljaGVyUmVzcG9uc2VJbnB1dCkgPT4gRW5yaWNoZXJGaWVsZHNcblxuLyoqIEVucmljaGVyIHBoYXNlcyBzcGxpdCBzbyBlYWNoIHJlcXVlc3Qgb25seSB3YWxrcyB0aGUgaG9va3MgdGhhdCBleGlzdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRFbnJpY2hlcnMge1xuICByZXF1ZXN0OiBSZXF1ZXN0UGhhc2VbXVxuICByZXNwb25zZTogUmVzcG9uc2VQaGFzZVtdXG59XG5cbi8qKiBTcGxpdHMgY29uZmlndXJlZCBlbnJpY2hlcnMgYnkgcGhhc2UsIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlcmUgYXJlIG5vbmUuICovXG5leHBvcnQgY29uc3QgcmVzb2x2ZUVucmljaGVycyA9IChcbiAgZW5yaWNoZXJzPzogRW5yaWNoZXJMaWtlW11cbik6IFJlc29sdmVkRW5yaWNoZXJzIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKCFlbnJpY2hlcnM/Lmxlbmd0aCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgcmVxdWVzdDogUmVxdWVzdFBoYXNlW10gPSBbXVxuICBjb25zdCByZXNwb25zZTogUmVzcG9uc2VQaGFzZVtdID0gW11cblxuICBmb3IgKGNvbnN0IGVucmljaGVyIG9mIGVucmljaGVycykge1xuICAgIGlmICh0eXBlb2YgZW5yaWNoZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJlcXVlc3QucHVzaChlbnJpY2hlcilcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGlmIChlbnJpY2hlci5yZXF1ZXN0KSB7XG4gICAgICByZXF1ZXN0LnB1c2goZW5yaWNoZXIucmVxdWVzdClcbiAgICB9XG4gICAgaWYgKGVucmljaGVyLnJlc3BvbnNlKSB7XG4gICAgICByZXNwb25zZS5wdXNoKGVucmljaGVyLnJlc3BvbnNlKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXF1ZXN0Lmxlbmd0aCA9PT0gMCAmJiByZXNwb25zZS5sZW5ndGggPT09IDBcbiAgICA/IHVuZGVmaW5lZFxuICAgIDogeyByZXF1ZXN0LCByZXNwb25zZSB9XG59XG5cbi8qKlxuICogUnVucyBvbmUgcGhhc2UgYW5kIG1lcmdlcyB3aGF0IGl0IHJldHVybnMgaW50byB0aGUgcmVxdWVzdCBjb250ZXh0LiBBIGhvb2tcbiAqIHRoYXQgdGhyb3dzIGlzIHJlcG9ydGVkIGFuZCBza2lwcGVkOiBlbnJpY2htZW50IGlzIGRlY29yYXRpb24sIGFuZCBtdXN0XG4gKiBuZXZlciB0YWtlIGEgcmVxdWVzdCBkb3duIHdpdGggaXQuXG4gKi9cbmNvbnN0IHJ1blBoYXNlID0gPFRJbnB1dD4oXG4gIGhvb2tzOiAoKGlucHV0OiBUSW5wdXQpID0+IEVucmljaGVyRmllbGRzKVtdLFxuICBpbnB1dDogVElucHV0LFxuICBjb250ZXh0U3RvcmU6IFJlcXVlc3RDb250ZXh0U3RvcmUsXG4gIGtleTogUmVxdWVzdCxcbiAgb25FcnJvcj86IChjb250ZXh0OiBTaW5rRXJyb3JDb250ZXh0KSA9PiB2b2lkXG4pOiB2b2lkID0+IHtcbiAgZm9yIChjb25zdCBob29rIG9mIGhvb2tzKSB7XG4gICAgbGV0IGZpZWxkczogRW5yaWNoZXJGaWVsZHNcbiAgICB0cnkge1xuICAgICAgZmllbGRzID0gaG9vayhpbnB1dClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmVwb3J0RW5yaWNoZXJFcnJvcihlcnJvciwgb25FcnJvcilcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGlmIChmaWVsZHMpIHtcbiAgICAgIGNvbnRleHRTdG9yZS5tZXJnZUNvbnRleHQoa2V5LCBmaWVsZHMpXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBhcHBseVJlcXVlc3RFbnJpY2hlcnMgPSAoXG4gIGVucmljaGVyczogUmVzb2x2ZWRFbnJpY2hlcnMsXG4gIGNvbnRleHRTdG9yZTogUmVxdWVzdENvbnRleHRTdG9yZSxcbiAgcmVxdWVzdDogUmVxdWVzdCxcbiAgb25FcnJvcj86IChjb250ZXh0OiBTaW5rRXJyb3JDb250ZXh0KSA9PiB2b2lkXG4pOiB2b2lkID0+IHtcbiAgcnVuUGhhc2UoZW5yaWNoZXJzLnJlcXVlc3QsIHJlcXVlc3QsIGNvbnRleHRTdG9yZSwgcmVxdWVzdCwgb25FcnJvcilcbn1cblxuZXhwb3J0IGNvbnN0IGFwcGx5UmVzcG9uc2VFbnJpY2hlcnMgPSAoXG4gIGVucmljaGVyczogUmVzb2x2ZWRFbnJpY2hlcnMsXG4gIGNvbnRleHRTdG9yZTogUmVxdWVzdENvbnRleHRTdG9yZSxcbiAgaW5wdXQ6IEVucmljaGVyUmVzcG9uc2VJbnB1dCxcbiAgb25FcnJvcj86IChjb250ZXh0OiBTaW5rRXJyb3JDb250ZXh0KSA9PiB2b2lkXG4pOiB2b2lkID0+IHtcbiAgcnVuUGhhc2UoZW5yaWNoZXJzLnJlc3BvbnNlLCBpbnB1dCwgY29udGV4dFN0b3JlLCBpbnB1dC5yZXF1ZXN0LCBvbkVycm9yKVxufVxuIiwKICAgICIvKiogSFRUUCBgUmVxdWVzdGAgb3IgV2ViU29ja2V0IGluc3RhbmNlIGZvciBhY2N1bXVsYXRlZCBjb250ZXh0LiAqL1xuZXhwb3J0IHR5cGUgQ29udGV4dEtleSA9IFJlcXVlc3QgfCBvYmplY3RcblxuZXhwb3J0IGludGVyZmFjZSBSZXF1ZXN0Q29udGV4dFN0b3JlIHtcbiAgY2xlYXJDb250ZXh0OiAoa2V5OiBDb250ZXh0S2V5KSA9PiB2b2lkXG4gIGdldENvbnRleHQ6IChrZXk6IENvbnRleHRLZXkpID0+IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PlxuICBtZXJnZUNvbnRleHQ6IChrZXk6IENvbnRleHRLZXksIHBhcnRpYWw6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB2b2lkXG4gIC8qKlxuICAgKiBOb24tY2xvbmluZyByZWFkIG9mIHRoZSBsaXZlIGNvbnRleHQgYmFnLiBSZXR1cm5zIHRoZSBTQU1FIG9iamVjdCBzdG9yZWQgaW50ZXJuYWxseSAob3IgYVxuICAgKiBzaGFyZWQgZnJvemVuIGVtcHR5IG9iamVjdCkg4oCUIG5ldmVyIGhhbmQgdGhpcyB0byB1c2VyLWZhY2luZyBjb2RlLCB3aGljaCBtYXkgcmV0YWluIG9yXG4gICAqIG11dGF0ZSBpdC4gT25seSBpbnRlcm5hbCwgcmVhZC1vbmx5IGNhbGwgc2l0ZXMgKHRoYXQgaW1tZWRpYXRlbHkgc3ByZWFkIHRoZSByZXN1bHQgaW50byBhXG4gICAqIG5ldyBvYmplY3QpIG1heSB1c2UgdGhpczsgZXZlcnl0aGluZyBlbHNlIG11c3QgdXNlIHtAbGluayBSZXF1ZXN0Q29udGV4dFN0b3JlLmdldENvbnRleHR9LlxuICAgKi9cbiAgcGVla0NvbnRleHQ6IChrZXk6IENvbnRleHRLZXkpID0+IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PlxufVxuXG5jb25zdCBFTVBUWV9DT05URVhUOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gPSBPYmplY3QuZnJlZXplKHt9KVxuXG4vKipcbiAqIEVseXNpYSBoYW5kcyBXZWJTb2NrZXQgaG9va3MgYSBmcmVzaCB3cmFwcGVyIG9iamVjdCBwZXIgZXZlbnQ7IG9ubHkgaXRzXG4gKiBgcmF3YCBzb2NrZXQgaXMgdGhlIHNhbWUgYWNyb3NzIGEgY29ubmVjdGlvbidzIGxpZmV0aW1lLCBzbyBrZXkgYnkgdGhhdC5cbiAqIEEgYFJlcXVlc3RgIGhhcyBubyBgcmF3YCwgc28gSFRUUCBrZXlzIGFyZSB1bmNoYW5nZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBrZXlPZiA9IChrZXk6IENvbnRleHRLZXkpOiBDb250ZXh0S2V5ID0+IHtcbiAgY29uc3QgcmF3ID0gJ3JhdycgaW4ga2V5ID8ga2V5LnJhdyA6IHVuZGVmaW5lZFxuICByZXR1cm4gdHlwZW9mIHJhdyA9PT0gJ29iamVjdCcgJiYgcmF3ICE9PSBudWxsID8gcmF3IDoga2V5XG59XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVSZXF1ZXN0Q29udGV4dFN0b3JlID0gKCk6IFJlcXVlc3RDb250ZXh0U3RvcmUgPT4ge1xuICBjb25zdCBiYWdzID0gbmV3IFdlYWtNYXA8Q29udGV4dEtleSwgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KClcblxuICBjb25zdCBnZXRPckNyZWF0ZSA9IChrZXk6IENvbnRleHRLZXkpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiB7XG4gICAgY29uc3QgYmFnS2V5ID0ga2V5T2Yoa2V5KVxuICAgIGxldCBiYWcgPSBiYWdzLmdldChiYWdLZXkpXG4gICAgaWYgKCFiYWcpIHtcbiAgICAgIGJhZyA9IHt9XG4gICAgICBiYWdzLnNldChiYWdLZXksIGJhZylcbiAgICB9XG4gICAgcmV0dXJuIGJhZ1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBjbGVhckNvbnRleHQoa2V5KSB7XG4gICAgICBiYWdzLmRlbGV0ZShrZXlPZihrZXkpKVxuICAgIH0sXG4gICAgZ2V0Q29udGV4dChrZXkpIHtcbiAgICAgIGNvbnN0IGJhZyA9IGJhZ3MuZ2V0KGtleU9mKGtleSkpXG4gICAgICByZXR1cm4gYmFnID8geyAuLi5iYWcgfSA6IHt9XG4gICAgfSxcbiAgICBtZXJnZUNvbnRleHQoa2V5LCBwYXJ0aWFsKSB7XG4gICAgICBpZiAoT2JqZWN0LmtleXMocGFydGlhbCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgY29uc3QgYmFnID0gZ2V0T3JDcmVhdGUoa2V5KVxuICAgICAgT2JqZWN0LmFzc2lnbihiYWcsIHBhcnRpYWwpXG4gICAgfSxcbiAgICBwZWVrQ29udGV4dChrZXkpIHtcbiAgICAgIHJldHVybiBiYWdzLmdldChrZXlPZihrZXkpKSA/PyBFTVBUWV9DT05URVhUXG4gICAgfVxuICB9XG59XG5cbi8qKiBBY2N1bXVsYXRlZCByZXF1ZXN0IGNvbnRleHQgZmlyc3Q7IGV4cGxpY2l0IGBkYXRhLmNvbnRleHRgIHdpbnMgb24ga2V5IGNvbGxpc2lvbi4gKi9cbmV4cG9ydCBjb25zdCBtZXJnZUxvZ0RhdGFDb250ZXh0ID0gKFxuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgYWNjdW11bGF0ZWQ6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PlxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4ge1xuICBjb25zdCBleHBsaWNpdCA9IGRhdGEuY29udGV4dFxuICBjb25zdCBoYXNBY2N1bXVsYXRlZCA9IE9iamVjdC5rZXlzKGFjY3VtdWxhdGVkKS5sZW5ndGggPiAwXG4gIGNvbnN0IGhhc0V4cGxpY2l0ID1cbiAgICBleHBsaWNpdCAhPT0gdW5kZWZpbmVkICYmXG4gICAgZXhwbGljaXQgIT09IG51bGwgJiZcbiAgICB0eXBlb2YgZXhwbGljaXQgPT09ICdvYmplY3QnICYmXG4gICAgIUFycmF5LmlzQXJyYXkoZXhwbGljaXQpICYmXG4gICAgT2JqZWN0LmtleXMoZXhwbGljaXQgYXMgb2JqZWN0KS5sZW5ndGggPiAwXG5cbiAgaWYgKCEoaGFzQWNjdW11bGF0ZWQgfHwgaGFzRXhwbGljaXQpKSB7XG4gICAgcmV0dXJuIGRhdGFcbiAgfVxuXG4gIGNvbnN0IG1lcmdlZENvbnRleHQgPSB7XG4gICAgLi4uYWNjdW11bGF0ZWQsXG4gICAgLi4uKGhhc0V4cGxpY2l0ID8gKGV4cGxpY2l0IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA6IHt9KVxuICB9XG5cbiAgcmV0dXJuIHsgLi4uZGF0YSwgY29udGV4dDogbWVyZ2VkQ29udGV4dCB9XG59XG4iLAogICAgImltcG9ydCB7IEFzeW5jTG9jYWxTdG9yYWdlIH0gZnJvbSAnbm9kZTphc3luY19ob29rcydcbmltcG9ydCB0eXBlIHsgTG9nRmllbGRzLCBSZXF1ZXN0U2NvcGVkTG9nZ2VyIH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcblxuZXhwb3J0IGNvbnN0IGxvZ2dlclN0b3JhZ2U6IEFzeW5jTG9jYWxTdG9yYWdlPFJlcXVlc3RTY29wZWRMb2dnZXI+ID1cbiAgbmV3IEFzeW5jTG9jYWxTdG9yYWdlPFJlcXVlc3RTY29wZWRMb2dnZXI+KClcblxuLyoqXG4gKiBTdGFuZHMgaW4gd2hlcmV2ZXIgbm8gcmVxdWVzdCBpcyBpbiBmbGlnaHQsIGluY2x1ZGluZyBhZnRlciBvbmUgZW5kczogdGhlXG4gKiBwbHVnaW4gcmVzdG9yZXMgaXQgc28gYSBjb250aW51YXRpb24gdGhhdCBvdXRsaXZlcyBpdHMgcmVxdWVzdCBjYW5ub3Qga2VlcFxuICogd3JpdGluZyBpbnRvIHRoZSBmaW5pc2hlZCByZXF1ZXN0J3MgbG9nLlxuICovXG5jb25zdCBkaXNjYXJkID0gKCk6IHZvaWQgPT4ge1xuICAvLyBPdXRzaWRlIGEgcmVxdWVzdCB0aGVyZSBpcyBubyBsb2cgdG8gd3JpdGUgaW50by5cbn1cblxuZXhwb3J0IGNvbnN0IG5vb3BSZXF1ZXN0TG9nZ2VyOiBSZXF1ZXN0U2NvcGVkTG9nZ2VyID0ge1xuICBkZWJ1ZzogZGlzY2FyZCxcbiAgZXJyb3I6IGRpc2NhcmQsXG4gIGluZm86IGRpc2NhcmQsXG4gIG1lcmdlQ29udGV4dDogZGlzY2FyZCxcbiAgd2FybjogZGlzY2FyZFxufVxuXG4vKipcbiAqIFRoZSBjdXJyZW50IHJlcXVlc3QncyBsb2dnZXIsIG9yIGEgbm8tb3Agb25lIG91dHNpZGUgYSByZXF1ZXN0LlxuICpcbiAqIFBhc3MgdGhlIHNhbWUgZmllbGQgdHlwZSB5b3UgZ2F2ZSB0aGUgcGx1Z2luIHRvIGtlZXAgY29udGV4dCB0eXBlZCBhd2F5XG4gKiBmcm9tIHRoZSBFbHlzaWEgaGFuZGxlcjogYHVzZUxvZ2dlcjxDaGVja291dEZpZWxkcz4oKWAuXG4gKi9cbmV4cG9ydCBjb25zdCB1c2VMb2dnZXIgPSA8XG4gIFRGaWVsZHMgZXh0ZW5kcyBvYmplY3QgPSBMb2dGaWVsZHNcbj4oKTogUmVxdWVzdFNjb3BlZExvZ2dlcjxURmllbGRzPiA9PlxuICAvLyBUaGUgc3RvcmVkIGxvZ2dlciB3cml0ZXMgaW50byBhbiB1bnR5cGVkIGNvbnRleHQgYmFnOyB0aGUgdHlwZSBwYXJhbWV0ZXJcbiAgLy8gb25seSBuYXJyb3dzIHdoYXQgY2FsbGVycyBtYXkgaGFuZCBpdC5cbiAgKGxvZ2dlclN0b3JhZ2UuZ2V0U3RvcmUoKSA/P1xuICAgIG5vb3BSZXF1ZXN0TG9nZ2VyKSBhcyBSZXF1ZXN0U2NvcGVkTG9nZ2VyPFRGaWVsZHM+XG4iLAogICAgImltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgfSBmcm9tICdub2RlOm1vZHVsZSdcblxuY29uc3QgZWx5c2lhUGtnOiB7IHZlcnNpb24/OiBzdHJpbmcgfSA9ICgoKSA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVxdWlyZSA9IGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKVxuICAgIHJldHVybiByZXF1aXJlKCdlbHlzaWEvcGFja2FnZS5qc29uJykgYXMgeyB2ZXJzaW9uPzogc3RyaW5nIH1cbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHt9XG4gIH1cbn0pKClcblxuY29uc3QgbG9naXhseXNpYVBrZzogeyB2ZXJzaW9uPzogc3RyaW5nIH0gPSAoKCkgPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHJlcXVpcmUgPSBjcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybClcbiAgICByZXR1cm4gcmVxdWlyZSgnLi4vLi4vcGFja2FnZS5qc29uJykgYXMgeyB2ZXJzaW9uPzogc3RyaW5nIH1cbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHt9XG4gIH1cbn0pKClcblxuY29uc3QgY2VudGVyVGV4dCA9ICh0ZXh0OiBzdHJpbmcsIHdpZHRoOiBudW1iZXIpOiBzdHJpbmcgPT4ge1xuICBpZiAodGV4dC5sZW5ndGggPj0gd2lkdGgpIHtcbiAgICByZXR1cm4gdGV4dC5zbGljZSgwLCB3aWR0aClcbiAgfVxuXG4gIGNvbnN0IGxlZnQgPSBNYXRoLmZsb29yKCh3aWR0aCAtIHRleHQubGVuZ3RoKSAvIDIpXG4gIGNvbnN0IHJpZ2h0ID0gd2lkdGggLSB0ZXh0Lmxlbmd0aCAtIGxlZnRcbiAgcmV0dXJuIGAkeycgJy5yZXBlYXQobGVmdCl9JHt0ZXh0fSR7JyAnLnJlcGVhdChyaWdodCl9YFxufVxuXG50eXBlIFJvd1NwZWMgPVxuICB8IHsga2luZDogJ2VtcHR5JyB9XG4gIHwgeyBraW5kOiAnY2VudGVyJzsgdGV4dDogc3RyaW5nIH1cbiAgfCB7IGtpbmQ6ICdsZWZ0JzsgdGV4dDogc3RyaW5nIH1cblxuLyoqXG4gKiBCb3ggYmFubmVyOiBFbHlzaWEgdmVyc2lvbiAoY2VudGVyZWQpLCBVUkwgbGluZSwgb3B0aW9uYWwgbG9naXhseXNpYSB2ZXJzaW9uIGxpbmUuXG4gKi9cbmV4cG9ydCBjb25zdCByZW5kZXJCYW5uZXIgPSAoXG4gIHVybERpc3BsYXlMaW5lOiBzdHJpbmcsXG4gIGxvZ2l4bHlzaWFMaW5lOiBzdHJpbmcgfCBudWxsXG4pOiBzdHJpbmcgPT4ge1xuICBjb25zdCB7IHZlcnNpb24gfSA9IGVseXNpYVBrZ1xuICBjb25zdCB2ZXJzaW9uTGluZSA9IHZlcnNpb24gPyBgRWx5c2lhIHYke3ZlcnNpb259YCA6ICdFbHlzaWEnXG5cbiAgY29uc3Qgcm93czogUm93U3BlY1tdID0gW1xuICAgIHsga2luZDogJ2VtcHR5JyB9LFxuICAgIHsga2luZDogJ2NlbnRlcicsIHRleHQ6IHZlcnNpb25MaW5lIH0sXG4gICAgeyBraW5kOiAnZW1wdHknIH0sXG4gICAgeyBraW5kOiAnbGVmdCcsIHRleHQ6IHVybERpc3BsYXlMaW5lIH1cbiAgXVxuICBpZiAobG9naXhseXNpYUxpbmUpIHtcbiAgICByb3dzLnB1c2goeyBraW5kOiAnbGVmdCcsIHRleHQ6IGxvZ2l4bHlzaWFMaW5lIH0pXG4gIH1cbiAgcm93cy5wdXNoKHsga2luZDogJ2VtcHR5JyB9KVxuXG4gIGNvbnN0IGNvbnRlbnRXaWR0aCA9IE1hdGgubWF4KFxuICAgIHZlcnNpb25MaW5lLmxlbmd0aCxcbiAgICB1cmxEaXNwbGF5TGluZS5sZW5ndGgsXG4gICAgLi4uKGxvZ2l4bHlzaWFMaW5lID8gW2xvZ2l4bHlzaWFMaW5lLmxlbmd0aF0gOiBbMF0pXG4gIClcbiAgY29uc3QgaW5uZXJXaWR0aCA9IGNvbnRlbnRXaWR0aCArIDRcblxuICBjb25zdCB0b3AgPSBg4pSMJHsn4pSAJy5yZXBlYXQoaW5uZXJXaWR0aCl94pSQYFxuICBjb25zdCBib3QgPSBg4pSUJHsn4pSAJy5yZXBlYXQoaW5uZXJXaWR0aCl94pSYYFxuICBjb25zdCBlbXB0eVJvdyA9IGDilIIkeycgJy5yZXBlYXQoaW5uZXJXaWR0aCl94pSCYFxuXG4gIGNvbnN0IG91dDogc3RyaW5nW10gPSBbdG9wXVxuICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgaWYgKHJvdy5raW5kID09PSAnZW1wdHknKSB7XG4gICAgICBvdXQucHVzaChlbXB0eVJvdylcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGlmIChyb3cua2luZCA9PT0gJ2NlbnRlcicpIHtcbiAgICAgIG91dC5wdXNoKGDilIIke2NlbnRlclRleHQocm93LnRleHQsIGlubmVyV2lkdGgpfeKUgmApXG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBjb25zdCB7IHRleHQgfSA9IHJvd1xuICAgIGNvbnN0IHBhZGRpbmcgPSBNYXRoLm1heCgwLCBpbm5lcldpZHRoIC0gdGV4dC5sZW5ndGggLSA0KVxuICAgIG91dC5wdXNoKGDilIIgICR7dGV4dH0keycgJy5yZXBlYXQocGFkZGluZyl9ICDilIJgKVxuICB9XG4gIG91dC5wdXNoKGJvdClcbiAgcmV0dXJuIG91dC5qb2luKCdcXG4nKVxufVxuXG5leHBvcnQgY29uc3QgZ2V0TG9naXhseXNpYVZlcnNpb25MaW5lID0gKCk6IHN0cmluZyB8IG51bGwgPT4ge1xuICBjb25zdCB2ID0gbG9naXhseXNpYVBrZy52ZXJzaW9uXG4gIGlmICghdikge1xuICAgIHJldHVybiBudWxsXG4gIH1cbiAgcmV0dXJuIGAgICAgIGxvZ2l4bHlzaWEgdiR7dn1gXG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgT3B0aW9ucyB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBnZXRMb2dpeGx5c2lhVmVyc2lvbkxpbmUsIHJlbmRlckJhbm5lciB9IGZyb20gJy4vYmFubmVyJ1xuXG5leHBvcnQgY29uc3Qgc3RhcnRTZXJ2ZXIgPSAoXG4gIHNlcnZlcjogeyBwb3J0PzogbnVtYmVyOyBob3N0bmFtZT86IHN0cmluZzsgcHJvdG9jb2w/OiBzdHJpbmcgfCBudWxsIH0sXG4gIG9wdGlvbnM6IE9wdGlvbnNcbik6IHZvaWQgPT4ge1xuICBjb25zdCBzaG93U3RhcnR1cE1lc3NhZ2UgPSBvcHRpb25zLmNvbmZpZz8uc2hvd1N0YXJ0dXBNZXNzYWdlID8/IHRydWVcbiAgaWYgKCFzaG93U3RhcnR1cE1lc3NhZ2UpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHsgcG9ydCwgaG9zdG5hbWUsIHByb3RvY29sIH0gPSBzZXJ2ZXJcbiAgaWYgKHBvcnQgPT09IHVuZGVmaW5lZCB8fCAhaG9zdG5hbWUgfHwgIXByb3RvY29sKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCB1cmwgPSBgJHtwcm90b2NvbH06Ly8ke2hvc3RuYW1lfToke3BvcnR9YFxuICBjb25zdCBtZXNzYWdlID0gYPCfpoogRWx5c2lhIGlzIHJ1bm5pbmcgYXQgJHt1cmx9YFxuICBjb25zdCB1cmxEaXNwbGF5TGluZSA9IGDwn6aKICAke3VybH1gXG5cbiAgY29uc3QgZm9ybWF0ID0gb3B0aW9ucy5jb25maWc/LnN0YXJ0dXBNZXNzYWdlRm9ybWF0ID8/ICdiYW5uZXInXG4gIGlmIChmb3JtYXQgPT09ICdzaW1wbGUnKSB7XG4gICAgY29uc29sZS5sb2cobWVzc2FnZSlcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnNvbGUubG9nKHJlbmRlckJhbm5lcih1cmxEaXNwbGF5TGluZSwgZ2V0TG9naXhseXNpYVZlcnNpb25MaW5lKCkpKVxufVxuIiwKICAgICJpbXBvcnQgeyBTdGF0dXNNYXAgfSBmcm9tICdlbHlzaWEnXG5cbmNvbnN0IERJR0lUU19PTkxZID0gL15cXGQrJC91XG5jb25zdCBERUxJTUlURVJTID0gL1tfLV0rL2d1XG5jb25zdCBDQU1FTF9CT1VOREFSWV8xID0gLyg/PGJlZm9yZT5bYS16MC05XSkoPzxhZnRlcj5bQS1aXSkvZ3VcbmNvbnN0IENBTUVMX0JPVU5EQVJZXzIgPSAvKD88YmVmb3JlPltBLVpdKSg/PGFmdGVyPltBLVpdW2Etel0pL2d1XG5jb25zdCBBUE9TVFJPUEhFUyA9IC9bJ+KAmV0vZ3VcbmNvbnN0IE5PTl9BTFBIQU5VTUVSSUMgPSAvW15hLXowLTlcXHNdKy9ndVxuY29uc3QgV0hJVEVTUEFDRSA9IC9cXHMrL2d1XG5cbmNvbnN0IG5vcm1hbGl6ZVN0YXR1c05hbWUgPSAodmFsdWU6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIC8vIEhhbmRsZXMgY29tbW9uIHZhcmlhbnRzOlxuICAvLyAtIGNhc2UgZGlmZmVyZW5jZXM6IFwibm90IGZvdW5kXCIgdnMgXCJOb3QgRm91bmRcIlxuICAvLyAtIHNwYWNpbmcvcHVuY3R1YXRpb246IFwiTm90LUZvdW5kXCIsIFwibm90X2ZvdW5kXCJcbiAgLy8gLSBjYW1lbENhc2UvUGFzY2FsQ2FzZTogXCJJbnRlcm5hbFNlcnZlckVycm9yXCJcbiAgY29uc3QgdHJpbW1lZCA9IHZhbHVlLnRyaW0oKVxuICBpZiAoIXRyaW1tZWQpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIHJldHVybiB0cmltbWVkXG4gICAgLnJlcGxhY2UoREVMSU1JVEVSUywgJyAnKVxuICAgIC5yZXBsYWNlKENBTUVMX0JPVU5EQVJZXzEsICckPGJlZm9yZT4gJDxhZnRlcj4nKVxuICAgIC5yZXBsYWNlKENBTUVMX0JPVU5EQVJZXzIsICckPGJlZm9yZT4gJDxhZnRlcj4nKVxuICAgIC5yZXBsYWNlKEFQT1NUUk9QSEVTLCAnJylcbiAgICAudG9Mb3dlckNhc2UoKVxuICAgIC5yZXBsYWNlKE5PTl9BTFBIQU5VTUVSSUMsICcgJylcbiAgICAucmVwbGFjZShXSElURVNQQUNFLCAnICcpXG4gICAgLnRyaW0oKVxufVxuXG5jb25zdCBTVEFUVVNfQllfTk9STUFMSVpFRF9OQU1FID0gKCgpID0+IHtcbiAgY29uc3QgbWFwID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKVxuXG4gIGZvciAoY29uc3QgW25hbWUsIGNvZGVdIG9mIE9iamVjdC5lbnRyaWVzKFN0YXR1c01hcCkpIHtcbiAgICBtYXAuc2V0KG5vcm1hbGl6ZVN0YXR1c05hbWUobmFtZSksIGNvZGUpXG4gIH1cblxuICByZXR1cm4gbWFwXG59KSgpXG5cbi8qKlxuICogV2hhdCBFbHlzaWEncyBgc3RhdHVzKGNvZGUsIGJvZHkpYCByZXR1cm5zIG9yIHRocm93czogYSBudW1lcmljIGBjb2RlYCBhbmRcbiAqIHRoZSBgcmVzcG9uc2VgIGJvZHkuIE1hdGNoZWQgYnkgc2hhcGUgaW5zdGVhZCBvZiBgaW5zdGFuY2VvZmAsIHNvIGl0IHN0aWxsXG4gKiB3b3JrcyB3aGVuIHRoZSBhcHAgcmVzb2x2ZXMgYSBzZWNvbmQgY29weSBvZiBFbHlzaWEuIEVseXNpYSdzIG93biBlcnJvclxuICogY2xhc3NlcyBhcmUgYEVycm9yYHMgd2l0aCBzdHJpbmcgY29kZXMsIHNvIHRoZXkgbmV2ZXIgbWF0Y2guXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdHVzUmVzcG9uc2VMaWtlIHtcbiAgY29kZTogbnVtYmVyXG4gIHJlc3BvbnNlOiB1bmtub3duXG59XG5cbmV4cG9ydCBjb25zdCBpc1N0YXR1c1Jlc3BvbnNlID0gKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgU3RhdHVzUmVzcG9uc2VMaWtlID0+XG4gIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgdmFsdWUgIT09IG51bGwgJiZcbiAgISh2YWx1ZSBpbnN0YW5jZW9mIEVycm9yKSAmJlxuICAnY29kZScgaW4gdmFsdWUgJiZcbiAgdHlwZW9mIHZhbHVlLmNvZGUgPT09ICdudW1iZXInICYmXG4gICdyZXNwb25zZScgaW4gdmFsdWVcblxuZXhwb3J0IGNvbnN0IGdldFN0YXR1c0NvZGUgPSAodmFsdWU6IHVua25vd24pOiBudW1iZXIgPT4ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IHRyaW1tZWQgPSB2YWx1ZS50cmltKClcbiAgICBpZiAoRElHSVRTX09OTFkudGVzdCh0cmltbWVkKSkge1xuICAgICAgcmV0dXJuIE51bWJlcih0cmltbWVkKVxuICAgIH1cblxuICAgIGNvbnN0IGtub3duID0gU1RBVFVTX0JZX05PUk1BTElaRURfTkFNRS5nZXQobm9ybWFsaXplU3RhdHVzTmFtZSh0cmltbWVkKSlcbiAgICByZXR1cm4ga25vd24gPz8gNTAwXG4gIH1cblxuICByZXR1cm4gNTAwXG59XG4iLAogICAgImltcG9ydCBwaW5vIGZyb20gJ3Bpbm8nXG5pbXBvcnQgcHJldHR5IGZyb20gJ3Bpbm8tcHJldHR5J1xuaW1wb3J0IHsgY3JlYXRlUmVxdWVzdENvbnRleHRTdG9yZSB9IGZyb20gJy4uL2NvbnRleHQvcmVxdWVzdC1jb250ZXh0J1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0Q29udGV4dFN0b3JlIH0gZnJvbSAnLi4vY29udGV4dC9yZXF1ZXN0LWNvbnRleHQnXG5pbXBvcnQgdHlwZSB7XG4gIExvZ2dlcixcbiAgTG9nTGV2ZWwsXG4gIE9wdGlvbnMsXG4gIFBpbm8sXG4gIFJlcXVlc3RJbmZvLFxuICBTdG9yZURhdGFcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcydcbmltcG9ydCB7IHJlc29sdmVTYW1wbGluZyB9IGZyb20gJy4uL3NhbXBsaW5nJ1xuaW1wb3J0IHsgZWxhcHNlZE1zIH0gZnJvbSAnLi4vdXRpbHMvZHVyYXRpb24nXG5pbXBvcnQgeyBidWlsZFBpbm9SZWRhY3RQYXRocyB9IGZyb20gJy4uL3V0aWxzL3JlZGFjdCdcbmltcG9ydCB7IGNyZWF0ZUZvcm1hdENvbnRleHQgfSBmcm9tICcuL2NyZWF0ZS1sb2dnZXInXG5pbXBvcnQgeyBlbWl0LCBwYXJzZVJlcXVlc3RVcmxPbmNlLCByZXNvbHZlU2lua3MsIHNob3VsZExvZyB9IGZyb20gJy4vZW1pdCdcbmltcG9ydCB7IGhhbmRsZUh0dHBFcnJvciB9IGZyb20gJy4vaGFuZGxlLWh0dHAtZXJyb3InXG5cbmNvbnN0IFpFUk9fU1RPUkU6IFN0b3JlRGF0YSA9IHsgYmVmb3JlVGltZTogMG4gfVxuXG4vKipcbiAqIEEgc3RhYmxlIHN0YW5kLWluIGZvciBwaW5vIHRoYXQgb25seSBidWlsZHMgdGhlIHJlYWwgaW5zdGFuY2Ugb24gZmlyc3QgdXNlLFxuICogb3IgcmlnaHQgYXdheSB3aGVuIGBjb25maWcucGlub2AgaXMgc2V0LlxuICovXG5jb25zdCBjcmVhdGVMYXp5UGlubyA9IChcbiAgY29uZmlnOiBPcHRpb25zWydjb25maWcnXSxcbiAgcGlub0ZhY3Rvcnk6IHR5cGVvZiBwaW5vXG4pOiBQaW5vID0+IHtcbiAgY29uc3QgcGlub0NvbmZpZyA9IGNvbmZpZz8ucGlub1xuICBjb25zdCB7IHByZXR0eVByaW50LCAuLi5waW5vT3B0aW9ucyB9ID0gcGlub0NvbmZpZyA/PyB7fVxuXG4gIGNvbnN0IHByZXR0eVByaW50T3B0aW9ucyA9XG4gICAgdHlwZW9mIHByZXR0eVByaW50ID09PSAnb2JqZWN0JyAmJiBwcmV0dHlQcmludCAhPT0gbnVsbFxuICAgICAgPyAocHJldHR5UHJpbnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pXG4gICAgICA6IHVuZGVmaW5lZFxuXG4gIGNvbnN0IGVuYWJsZVByZXR0eVByaW50ID1cbiAgICBwcmV0dHlQcmludCA9PT0gdHJ1ZSB8fCBwcmV0dHlQcmludE9wdGlvbnMgIT09IHVuZGVmaW5lZFxuXG4gIGNvbnN0IHNob3VsZFByZXR0eVByaW50ID1cbiAgICBlbmFibGVQcmV0dHlQcmludCAmJiBwaW5vT3B0aW9ucy50cmFuc3BvcnQgPT09IHVuZGVmaW5lZFxuXG4gIGNvbnN0IG1lc3NhZ2VLZXkgPVxuICAgIChwcmV0dHlQcmludE9wdGlvbnM/Lm1lc3NhZ2VLZXkgYXMgc3RyaW5nIHwgdW5kZWZpbmVkKSA/P1xuICAgIHBpbm9PcHRpb25zLm1lc3NhZ2VLZXlcbiAgY29uc3QgZXJyb3JLZXkgPVxuICAgIChwcmV0dHlQcmludE9wdGlvbnM/LmVycm9yS2V5IGFzIHN0cmluZyB8IHVuZGVmaW5lZCkgPz8gcGlub09wdGlvbnMuZXJyb3JLZXlcblxuICBjb25zdCBiYXNlUGlub09wdGlvbnMgPSB7XG4gICAgLi4ucGlub09wdGlvbnMsXG4gICAgZXJyb3JLZXksXG4gICAgbGV2ZWw6IHBpbm9PcHRpb25zLmxldmVsID8/ICdpbmZvJyxcbiAgICBtZXNzYWdlS2V5LFxuICAgIC4uLihjb25maWc/LmF1dG9SZWRhY3QgPT09IHRydWUgJiYgcGlub09wdGlvbnMucmVkYWN0ID09PSB1bmRlZmluZWRcbiAgICAgID8ge1xuICAgICAgICAgIHJlZGFjdDoge1xuICAgICAgICAgICAgY2Vuc29yOiAnW1JFREFDVEVEXScsXG4gICAgICAgICAgICBwYXRoczogYnVpbGRQaW5vUmVkYWN0UGF0aHMoY29uZmlnPy5yZWRhY3RLZXlzKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgOiB7fSlcbiAgfVxuXG4gIC8vIFBpbm8gKGFuZCwgd2hlbiBjb25maWd1cmVkLCBpdHMgcGluby1wcmV0dHkgdHJhbnNmb3JtIHN0cmVhbSkgaXMgZXhwZW5zaXZlIHRvIGNvbnN0cnVjdFxuICAvLyBhbmQgaXMgb25seSBldmVyIG5lZWRlZCB3aGVuIGEgY2FsbGVyIGV4cGxpY2l0bHkgcmVhZHMgc3RvcmUucGluby9sb2dnZXIucGlubyBvciBjb25maWd1cmVzXG4gIC8vIGNvbmZpZy5waW5vIOKAlCB0aGUgcGx1Z2luJ3Mgb3duIGxvZyBwYXRoIHdyaXRlcyB2aWEgY29uc29sZS4qIGFuZCBuZXZlciB0b3VjaGVzIGl0LiBCdWlsZGluZ1xuICAvLyBpdCBsYXppbHkgYmVoaW5kIGEgc3RhYmxlIFByb3h5IGtlZXBzIGBzdG9yZS5waW5vID09PSBsb2dnZXIucGlub2AgaWRlbnRpdHkgd2hpbGUgZGVmZXJyaW5nXG4gIC8vIHRoZSBjb3N0IHVudGlsIGZpcnN0IGFjY2Vzcy5cbiAgY29uc3QgcHJldHR5U3RyZWFtID0gKCk6IFJldHVyblR5cGU8dHlwZW9mIHByZXR0eT4gPT5cbiAgICBwcmV0dHkoe1xuICAgICAgY29sb3JpemU6IHByb2Nlc3Muc3Rkb3V0Py5pc1RUWSA9PT0gdHJ1ZSxcbiAgICAgIHRyYW5zbGF0ZVRpbWU6IGNvbmZpZz8udGltZXN0YW1wPy50cmFuc2xhdGVUaW1lLFxuICAgICAgLi4ucHJldHR5UHJpbnRPcHRpb25zLFxuICAgICAgZXJyb3JLZXksXG4gICAgICBtZXNzYWdlS2V5XG4gICAgfSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilcblxuICBsZXQgcmVhbFBpbm86IFBpbm8gfCB1bmRlZmluZWRcblxuICBjb25zdCBnZXRQaW5vID0gKCk6IFBpbm8gPT4ge1xuICAgIGlmICghcmVhbFBpbm8pIHtcbiAgICAgIHJlYWxQaW5vID0gc2hvdWxkUHJldHR5UHJpbnRcbiAgICAgICAgPyBwaW5vRmFjdG9yeShiYXNlUGlub09wdGlvbnMsIHByZXR0eVN0cmVhbSgpKVxuICAgICAgICA6IHBpbm9GYWN0b3J5KHtcbiAgICAgICAgICAgIC4uLmJhc2VQaW5vT3B0aW9ucyxcbiAgICAgICAgICAgIHRyYW5zcG9ydDogcGlub09wdGlvbnMudHJhbnNwb3J0XG4gICAgICAgICAgfSlcbiAgICB9XG4gICAgcmV0dXJuIHJlYWxQaW5vXG4gIH1cblxuICBjb25zdCBsYXp5UGlubyA9IG5ldyBQcm94eSh7fSBhcyBQaW5vLCB7XG4gICAgZ2V0KF90YXJnZXQsIHByb3ApIHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGdldFBpbm8oKVxuICAgICAgY29uc3QgdmFsdWUgPSAodGFyZ2V0IGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgdW5rbm93bj4pW1xuICAgICAgICBwcm9wXG4gICAgICBdXG4gICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nXG4gICAgICAgID8gKHZhbHVlIGFzICguLi5hcmdzOiB1bmtub3duW10pID0+IHVua25vd24pLmJpbmQodGFyZ2V0KVxuICAgICAgICA6IHZhbHVlXG4gICAgfSxcbiAgICBoYXM6IChfdGFyZ2V0LCBwcm9wKSA9PiBwcm9wIGluIChnZXRQaW5vKCkgYXMgb2JqZWN0KVxuICB9KVxuXG4gIC8vIEV4cGxpY2l0IGNvbmZpZy5waW5vIG1lYW5zIHRoZSB1c2VyIG9wdGVkIGluIHRvIHBpbm8gZGlyZWN0bHk6IGNvbnN0cnVjdCBlYWdlcmx5IHNvXG4gIC8vIGludmFsaWQgb3B0aW9ucyBmYWlsIGZhc3QgYXQgcGx1Z2luIHNldHVwIHRpbWUsIG1hdGNoaW5nIHByZS1sYXp5IGJlaGF2aW9yLlxuICBpZiAoY29uZmlnPy5waW5vICE9PSB1bmRlZmluZWQpIHtcbiAgICBnZXRQaW5vKClcbiAgfVxuXG4gIHJldHVybiBsYXp5UGlub1xufVxuXG5leHBvcnQgY29uc3QgY3JlYXRlTG9nZ2VyID0gKFxuICBvcHRpb25zOiBPcHRpb25zID0ge30sXG4gIHBpbm9GYWN0b3J5OiB0eXBlb2YgcGlubyA9IHBpbm8sXG4gIGV4dGVybmFsQ29udGV4dFN0b3JlPzogUmVxdWVzdENvbnRleHRTdG9yZVxuKTogTG9nZ2VyID0+IHtcbiAgY29uc3QgY29udGV4dFN0b3JlID0gZXh0ZXJuYWxDb250ZXh0U3RvcmUgPz8gY3JlYXRlUmVxdWVzdENvbnRleHRTdG9yZSgpXG4gIGNvbnN0IHsgY29uZmlnIH0gPSBvcHRpb25zXG4gIC8vIEhvaXN0ZWQgb25jZSBwZXIgbG9nZ2VyIGluc3RhbmNlOiBjb2xvcnMvZm9ybWF0L3RocmVzaG9sZHMvc2VydmljZSBkb24ndCBjaGFuZ2UgYWNyb3NzXG4gIC8vIHJlcXVlc3RzIHdpdGhpbiBhIHByb2Nlc3MgbGlmZXRpbWUgKHNlZSBjcmVhdGVGb3JtYXRDb250ZXh0J3MgZG9jIGNvbW1lbnQpLlxuICBjb25zdCBmb3JtYXRDb250ZXh0ID0gY3JlYXRlRm9ybWF0Q29udGV4dChvcHRpb25zKVxuXG4gIGNvbnN0IGxhenlQaW5vID0gY3JlYXRlTGF6eVBpbm8oY29uZmlnLCBwaW5vRmFjdG9yeSlcblxuICAvLyBSZXNvbHZlZCBvbmNlIHBlciBsb2dnZXIgaW5zdGFuY2U6IG5vbmUgb2YgdGhlc2UgZGVwZW5kIG9uIHBlci1yZXF1ZXN0IHN0YXRlLlxuICBjb25zdCBzaW5rcyA9IHJlc29sdmVTaW5rcyhjb25maWcpXG4gIGNvbnN0IHNhbXBsaW5nID0gcmVzb2x2ZVNhbXBsaW5nKGNvbmZpZz8uc2FtcGxpbmcpXG5cbiAgY29uc3QgbG9nID0gKFxuICAgIGxldmVsOiBMb2dMZXZlbCxcbiAgICByZXF1ZXN0OiBSZXF1ZXN0SW5mbyxcbiAgICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICBzdG9yZTogU3RvcmVEYXRhXG4gICk6IHZvaWQgPT4ge1xuICAgIGVtaXQoe1xuICAgICAgY29udGV4dFN0b3JlLFxuICAgICAgZGF0YSxcbiAgICAgIGZvcm1hdENvbnRleHQsXG4gICAgICBsZXZlbCxcbiAgICAgIG9wdGlvbnMsXG4gICAgICByZXF1ZXN0LFxuICAgICAgc2FtcGxpbmcsXG4gICAgICBzaW5rcyxcbiAgICAgIHN0b3JlXG4gICAgfSlcbiAgfVxuXG4gIC8qKiBSZXNvbHZlcyB0aGUgdGFpbCB2ZXJkaWN0IGFuZCByZS1lbWl0cyB3aGF0ZXZlciBpdCByZXNjdWVkLiAqL1xuICBjb25zdCBmaW5hbGl6ZVJlcXVlc3QgPSAoXG4gICAgcmVxdWVzdDogUmVxdWVzdEluZm8sXG4gICAgc3RvcmU6IFN0b3JlRGF0YSxcbiAgICBzdGF0dXM6IG51bWJlclxuICApOiB2b2lkID0+IHtcbiAgICBpZiAoIXNhbXBsaW5nKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBvdXRjb21lID0ge1xuICAgICAgZHVyYXRpb25NczogZWxhcHNlZE1zKHN0b3JlLmJlZm9yZVRpbWUpLFxuICAgICAgcGF0aG5hbWU6IHBhcnNlUmVxdWVzdFVybE9uY2UocmVxdWVzdCkucGF0aG5hbWUsXG4gICAgICBzdGF0dXNcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHJlY29yZCBvZiBzYW1wbGluZy5maW5hbGl6ZShyZXF1ZXN0LCBvdXRjb21lKSkge1xuICAgICAgZW1pdCh7XG4gICAgICAgIGJ5cGFzc1NhbXBsaW5nOiB0cnVlLFxuICAgICAgICBjb250ZXh0U3RvcmUsXG4gICAgICAgIGRhdGE6IHJlY29yZC5kYXRhLFxuICAgICAgICBkdXJhdGlvbk92ZXJyaWRlOiByZWNvcmQuZHVyYXRpb25NcyxcbiAgICAgICAgZm9ybWF0Q29udGV4dCxcbiAgICAgICAgbGV2ZWw6IHJlY29yZC5sZXZlbCxcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgc2FtcGxpbmcsXG4gICAgICAgIHNpbmtzLFxuICAgICAgICAvLyBVbnJlYWQgb24gdGhpcyBwYXRoOiBgZHVyYXRpb25PdmVycmlkZWAgc3VwcGxpZXMgdGhlIGR1cmF0aW9uIGVhY2hcbiAgICAgICAgLy8gcmVjb3JkIGhhZCB3aGVuIGl0IHdhcyBjYXB0dXJlZC5cbiAgICAgICAgc3RvcmU6IFpFUk9fU1RPUkVcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgY29uc3QgbG9nV2l0aENvbnRleHQgPSAoXG4gICAgbGV2ZWw6IExvZ0xldmVsLFxuICAgIHJlcXVlc3Q6IFJlcXVlc3RJbmZvLFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBjb250ZXh0PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKTogdm9pZCA9PiB7XG4gICAgaWYgKHNpbmtzLmlzRWZmZWN0aXZlbHlEaXNhYmxlZCB8fCAhc2hvdWxkTG9nKGxldmVsLCBjb25maWc/LmxvZ0ZpbHRlcikpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCBzdG9yZTogU3RvcmVEYXRhID0geyBiZWZvcmVUaW1lOiBwcm9jZXNzLmhydGltZS5iaWdpbnQoKSB9XG4gICAgbG9nKGxldmVsLCByZXF1ZXN0LCB7IGNvbnRleHQsIG1lc3NhZ2UgfSwgc3RvcmUpXG4gIH1cblxuICByZXR1cm4ge1xuICAgIGJlZ2luUmVxdWVzdDogcmVxdWVzdCA9PiB7XG4gICAgICBzYW1wbGluZz8uYmVnaW4ocmVxdWVzdClcbiAgICB9LFxuICAgIGRlYnVnOiAocmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dCkgPT4ge1xuICAgICAgbG9nV2l0aENvbnRleHQoJ0RFQlVHJywgcmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dClcbiAgICB9LFxuICAgIGVycm9yOiAocmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dCkgPT4ge1xuICAgICAgbG9nV2l0aENvbnRleHQoJ0VSUk9SJywgcmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dClcbiAgICB9LFxuICAgIGZpbmFsaXplUmVxdWVzdCxcbiAgICBnZXRDb250ZXh0OiByZXF1ZXN0ID0+IGNvbnRleHRTdG9yZS5nZXRDb250ZXh0KHJlcXVlc3QpLFxuICAgIGhhbmRsZUh0dHBFcnJvcjogKHJlcXVlc3QsIGVycm9yLCBzdG9yZSkgPT4ge1xuICAgICAgaGFuZGxlSHR0cEVycm9yKFxuICAgICAgICByZXF1ZXN0LFxuICAgICAgICBlcnJvcixcbiAgICAgICAgc3RvcmUsXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICAgIGNvbnRleHRTdG9yZSxcbiAgICAgICAgc2lua3MsXG4gICAgICAgIGZvcm1hdENvbnRleHQsXG4gICAgICAgIHNhbXBsaW5nXG4gICAgICApXG4gICAgfSxcbiAgICBpbmZvOiAocmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dCkgPT4ge1xuICAgICAgbG9nV2l0aENvbnRleHQoJ0lORk8nLCByZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KVxuICAgIH0sXG4gICAgbG9nLFxuICAgIG1lcmdlQ29udGV4dDogKHJlcXVlc3QsIHBhcnRpYWwpID0+IHtcbiAgICAgIGNvbnRleHRTdG9yZS5tZXJnZUNvbnRleHQocmVxdWVzdCwgcGFydGlhbClcbiAgICB9LFxuICAgIHBpbm86IGxhenlQaW5vLFxuICAgIHdhcm46IChyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KSA9PiB7XG4gICAgICBsb2dXaXRoQ29udGV4dCgnV0FSTklORycsIHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXG4gICAgfVxuICB9XG59XG5cbi8qKiBQbHVnaW4gZW50cnk6IHNoYXJlcyBvbmUgcmVxdWVzdC1jb250ZXh0IHN0b3JlIGFjcm9zcyB0aGUgRWx5c2lhIGxpZmVjeWNsZS4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVQbHVnaW5Mb2dnZXIgPSAoXG4gIG9wdGlvbnM6IE9wdGlvbnMsXG4gIGNvbnRleHRTdG9yZTogUmVxdWVzdENvbnRleHRTdG9yZVxuKTogTG9nZ2VyID0+IGNyZWF0ZUxvZ2dlcihvcHRpb25zLCBwaW5vLCBjb250ZXh0U3RvcmUpXG4iLAogICAgImNvbnN0IFJFR0VYUF9TUEVDSUFMUyA9IC9bLiorP14ke30oKXxbXFxdXFxcXF0vZ3VcbmNvbnN0IFJFUEVBVEVEX1JFQ1VSU0lWRV9QQVRURVJOID0gL1xcKlxcKi4qXFwqXFwqL3VcbmNvbnN0IFJFQ1VSU0lWRV9XSUxEQ0FSRF9TUExJVCA9IC9cXCpcXCovdVxuY29uc3QgQUxQSEFOVU1FUklDX1BBVFRFUk4gPSAvW2EtekEtWjAtOV0vdVxuXG5jb25zdCBlc2NhcGVSZWdFeHAgPSAodmFsdWU6IHN0cmluZyk6IHN0cmluZyA9PlxuICB2YWx1ZS5yZXBsYWNlKFJFR0VYUF9TUEVDSUFMUywgJ1xcXFwkJicpXG5cbi8qKlxuICogRGV0ZWN0cyBpZiBhIHBhdHRlcm4gY29udGFpbnMgcmVwZWF0ZWQgcmVjdXJzaXZlIHdpbGRjYXJkcyB0aGF0IGNvdWxkIGNhdXNlIFJlRG9TLlxuICogUGF0dGVybnMgd2l0aCBhZGphY2VudCBvciBuZWFybHktYWRqYWNlbnQgYCoqYCB3aWxkY2FyZHMgY2FuIGxlYWQgdG8gY2F0YXN0cm9waGljIGJhY2t0cmFja2luZy5cbiAqL1xuY29uc3QgaGFzUmVwZWF0ZWRSZWN1cnNpdmVXaWxkY2FyZHMgPSAocGF0dGVybjogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gIGlmICghUkVQRUFURURfUkVDVVJTSVZFX1BBVFRFUk4udGVzdChwYXR0ZXJuKSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgY29uc3Qgc2VnbWVudHMgPSBwYXR0ZXJuLnNwbGl0KFJFQ1VSU0lWRV9XSUxEQ0FSRF9TUExJVClcbiAgLy8gSWYgd2UgaGF2ZSBtdWx0aXBsZSAqKiB3aXRoIG9ubHkgc2hvcnQgbGl0ZXJhbCBzZXBhcmF0b3JzIGJldHdlZW4gdGhlbSwgcmVqZWN0IGl0XG4gIGZvciAobGV0IGkgPSAxOyBpIDwgc2VnbWVudHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBjb25zdCBzZXBhcmF0b3IgPSBzZWdtZW50c1tpXVxuICAgIC8vIEFsbG93ICoqIGZvbGxvd2VkIGJ5IHJlYXNvbmFibGUgbGl0ZXJhbCBwYXRocywgYnV0IHJlamVjdCBhZGphY2VudCBvciBuZWFybHktYWRqYWNlbnQgKipcbiAgICBpZiAoXG4gICAgICBzZXBhcmF0b3IgPT09ICcnIHx8XG4gICAgICAoc2VwYXJhdG9yLmxlbmd0aCA8IDIgJiYgIUFMUEhBTlVNRVJJQ19QQVRURVJOLnRlc3Qoc2VwYXJhdG9yKSlcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlXG59XG5cbi8qKlxuICogQ29tcGlsZXMgYSBwYXRoIGdsb2IgaW50byBhbiBhbmNob3JlZCBgUmVnRXhwYC5cbiAqXG4gKiAtIGAqKmAgbWF0Y2hlcyBhbnkgY2hhcmFjdGVycywgaW5jbHVkaW5nIGAvYFxuICogLSBgKmAgbWF0Y2hlcyBhbnkgY2hhcmFjdGVycyBleGNlcHQgYC9gXG4gKiAtIGA/YCBtYXRjaGVzIGEgc2luZ2xlIGNoYXJhY3RlciBleGNlcHQgYC9gXG4gKlxuICogRXZlcnl0aGluZyBlbHNlIGlzIG1hdGNoZWQgbGl0ZXJhbGx5LCBzbyBgL3YxL3VzZXJzYCBvbmx5IG1hdGNoZXMgaXRzZWxmLlxuICovXG5leHBvcnQgY29uc3QgZ2xvYlRvUmVnRXhwID0gKHBhdHRlcm46IHN0cmluZyk6IFJlZ0V4cCA9PiB7XG4gIC8vIERldGVjdCByZXBlYXRlZCByZWN1cnNpdmUgd2lsZGNhcmRzIHRoYXQgY291bGQgY2F1c2UgY2F0YXN0cm9waGljIGJhY2t0cmFja2luZy5cbiAgaWYgKGhhc1JlcGVhdGVkUmVjdXJzaXZlV2lsZGNhcmRzKHBhdHRlcm4pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ0ludmFsaWQgZ2xvYiBwYXR0ZXJuOiByZXBlYXRlZCByZWN1cnNpdmUgd2lsZGNhcmRzICgqKikgY2FuIGNhdXNlIHBlcmZvcm1hbmNlIGlzc3VlcydcbiAgICApXG4gIH1cblxuICBsZXQgc291cmNlID0gJydcbiAgbGV0IGluZGV4ID0gMFxuXG4gIHdoaWxlIChpbmRleCA8IHBhdHRlcm4ubGVuZ3RoKSB7XG4gICAgY29uc3QgY2hhciA9IHBhdHRlcm5baW5kZXhdXG5cbiAgICBpZiAoY2hhciA9PT0gJyonKSB7XG4gICAgICBjb25zdCBjcm9zc2VzU2VnbWVudHMgPSBwYXR0ZXJuW2luZGV4ICsgMV0gPT09ICcqJ1xuICAgICAgc291cmNlICs9IGNyb3NzZXNTZWdtZW50cyA/ICcuKicgOiAnW14vXSonXG4gICAgICBpbmRleCArPSBjcm9zc2VzU2VnbWVudHMgPyAyIDogMVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBpZiAoY2hhciA9PT0gJz8nKSB7XG4gICAgICBzb3VyY2UgKz0gJ1teL10nXG4gICAgICBpbmRleCArPSAxXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIHNvdXJjZSArPSBlc2NhcGVSZWdFeHAoY2hhcilcbiAgICBpbmRleCArPSAxXG4gIH1cblxuICByZXR1cm4gbmV3IFJlZ0V4cChgXiR7c291cmNlfSRgLCAndScpXG59XG4iLAogICAgImltcG9ydCB0eXBlIHtcbiAgTG9nTGV2ZWwsXG4gIFNhbXBsaW5nQ29uZmlnLFxuICBUYWlsU2FtcGxpbmdDb25maWdcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcydcbmltcG9ydCB7IGdsb2JUb1JlZ0V4cCB9IGZyb20gJy4vZ2xvYidcblxuY29uc3QgRlVMTF9SQVRFID0gMTAwXG5jb25zdCBERUZBVUxUX01BWF9CVUZGRVJFRF9QRVJfUkVRVUVTVCA9IDEwMFxuXG5jb25zdCBOT19SRUNPUkRTOiByZWFkb25seSBCdWZmZXJlZFJlY29yZFtdID0gT2JqZWN0LmZyZWV6ZShbXSlcblxuLyoqXG4gKiBXaGF0IGhlYWQgc2FtcGxpbmcgZGVjaWRlZCBmb3IgYSBzaW5nbGUgcmVjb3JkOlxuICpcbiAqIC0gYGtlZXBgIOKAlCBlbWl0IG5vd1xuICogLSBgYnVmZmVyYCDigJQgaG9sZCBpdCB1bnRpbCB0aGUgcmVxdWVzdCdzIHRhaWwgdmVyZGljdCBpcyBrbm93blxuICogLSBgZHJvcGAg4oCUIGRpc2NhcmQgaXQ7IG5vIHRhaWwgcnVsZSBjYW4gYnJpbmcgaXQgYmFja1xuICovXG5leHBvcnQgdHlwZSBTYW1wbGluZ0RlY2lzaW9uID0gJ2J1ZmZlcicgfCAnZHJvcCcgfCAna2VlcCdcblxuLyoqIEEgaGVhZC1kcm9wcGVkIHJlY29yZCBoZWxkIHVudGlsIGl0cyByZXF1ZXN0J3MgdGFpbCB2ZXJkaWN0IGlzIGtub3duLiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWZmZXJlZFJlY29yZCB7XG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gIC8qKiBFbGFwc2VkIHRpbWUgYXQgY2FwdHVyZSwgc28gYSByZXBsYXllZCByZWNvcmQga2VlcHMgaXRzIG9yaWdpbmFsIGR1cmF0aW9uLiAqL1xuICBkdXJhdGlvbk1zOiBudW1iZXJcbiAgbGV2ZWw6IExvZ0xldmVsXG59XG5cbi8qKiBIb3cgYSByZXF1ZXN0IGZpbmlzaGVkLCBtYXRjaGVkIGFnYWluc3Qge0BsaW5rIFRhaWxTYW1wbGluZ0NvbmZpZ30uICovXG5leHBvcnQgaW50ZXJmYWNlIFJlcXVlc3RPdXRjb21lIHtcbiAgZHVyYXRpb25NczogbnVtYmVyXG4gIHBhdGhuYW1lOiBzdHJpbmdcbiAgc3RhdHVzOiBudW1iZXJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTYW1wbGluZ1J1bnRpbWUge1xuICAvKiogTWFya3MgYSByZXF1ZXN0IGFzIG9uZSB0aGF0IHdpbGwgcmVhY2gge0BsaW5rIFNhbXBsaW5nUnVudGltZS5maW5hbGl6ZX0uICovXG4gIGJlZ2luOiAoa2V5OiBvYmplY3QpID0+IHZvaWRcbiAgLyoqIEhvbGRzIGEgaGVhZC1kcm9wcGVkIHJlY29yZCwgdXAgdG8gYG1heEJ1ZmZlcmVkUGVyUmVxdWVzdGAuICovXG4gIGJ1ZmZlcjogKGtleTogb2JqZWN0LCByZWNvcmQ6IEJ1ZmZlcmVkUmVjb3JkKSA9PiB2b2lkXG4gIGRlY2lkZTogKGxldmVsOiBMb2dMZXZlbCwga2V5OiBvYmplY3QpID0+IFNhbXBsaW5nRGVjaXNpb25cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSB0YWlsIHZlcmRpY3QgZm9yIGEgZmluaXNoZWQgcmVxdWVzdC4gUmV0dXJucyB0aGUgcmVjb3JkcyB0b1xuICAgKiByZXBsYXkg4oCUIGVtcHR5IHdoZW4gdGhlIG91dGNvbWUgbWF0Y2hlZCBubyB0YWlsIHJ1bGUg4oCUIGFuZCBtYXJrcyBhIHJlc2N1ZWRcbiAgICogcmVxdWVzdCBzbyB0aGUgY2FsbGVyJ3Mgb3duIGZpbmFsIGxvZyBieXBhc3NlcyBoZWFkIHNhbXBsaW5nIHRvby5cbiAgICovXG4gIGZpbmFsaXplOiAoa2V5OiBvYmplY3QsIG91dGNvbWU6IFJlcXVlc3RPdXRjb21lKSA9PiByZWFkb25seSBCdWZmZXJlZFJlY29yZFtdXG59XG5cbmludGVyZmFjZSBSZXNvbHZlZFRhaWwge1xuICBkdXJhdGlvbk1zPzogbnVtYmVyXG4gIHBhdGhzPzogUmVnRXhwW11cbiAgc3RhdHVzPzogbnVtYmVyXG59XG5cbmNvbnN0IHJlc29sdmVUYWlsID0gKFxuICB0YWlsOiBUYWlsU2FtcGxpbmdDb25maWcgfCB1bmRlZmluZWRcbik6IFJlc29sdmVkVGFpbCB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICghdGFpbCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgcGF0aHMgPSB0YWlsLnBhdGhzPy5sZW5ndGggPyB0YWlsLnBhdGhzLm1hcChnbG9iVG9SZWdFeHApIDogdW5kZWZpbmVkXG4gIGlmIChcbiAgICB0YWlsLmR1cmF0aW9uTXMgPT09IHVuZGVmaW5lZCAmJlxuICAgIHRhaWwuc3RhdHVzID09PSB1bmRlZmluZWQgJiZcbiAgICBwYXRocyA9PT0gdW5kZWZpbmVkXG4gICkge1xuICAgIHJldHVyblxuICB9XG5cbiAgcmV0dXJuIHsgZHVyYXRpb25NczogdGFpbC5kdXJhdGlvbk1zLCBwYXRocywgc3RhdHVzOiB0YWlsLnN0YXR1cyB9XG59XG5cbi8qKiBUYWlsIHJ1bGVzIGFyZSBPUi1lZDogYW55IHNpbmdsZSBtYXRjaCByZXNjdWVzIHRoZSB3aG9sZSByZXF1ZXN0LiAqL1xuY29uc3QgbWF0Y2hlc1RhaWwgPSAodGFpbDogUmVzb2x2ZWRUYWlsLCBvdXRjb21lOiBSZXF1ZXN0T3V0Y29tZSk6IGJvb2xlYW4gPT4ge1xuICBpZiAodGFpbC5zdGF0dXMgIT09IHVuZGVmaW5lZCAmJiBvdXRjb21lLnN0YXR1cyA+PSB0YWlsLnN0YXR1cykge1xuICAgIHJldHVybiB0cnVlXG4gIH1cbiAgaWYgKHRhaWwuZHVyYXRpb25NcyAhPT0gdW5kZWZpbmVkICYmIG91dGNvbWUuZHVyYXRpb25NcyA+PSB0YWlsLmR1cmF0aW9uTXMpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG4gIGlmICh0YWlsLnBhdGhzKSB7XG4gICAgZm9yIChjb25zdCBwYXRoIG9mIHRhaWwucGF0aHMpIHtcbiAgICAgIGlmIChwYXRoLnRlc3Qob3V0Y29tZS5wYXRobmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59XG5cbi8qKiBLZWVwcyBvbmx5IHRoZSByYXRlcyB0aGF0IGFjdHVhbGx5IGRyb3Agc29tZXRoaW5nLiAqL1xuY29uc3QgcmVzb2x2ZVJhdGVzID0gKFxuICBoZWFkOiBTYW1wbGluZ0NvbmZpZ1snaGVhZCddXG4pOiBQYXJ0aWFsPFJlY29yZDxMb2dMZXZlbCwgbnVtYmVyPj4gfCB1bmRlZmluZWQgPT4ge1xuICBpZiAoIWhlYWQpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHJhdGVzOiBQYXJ0aWFsPFJlY29yZDxMb2dMZXZlbCwgbnVtYmVyPj4gPSB7fVxuICBsZXQgaGFzUmF0ZSA9IGZhbHNlXG4gIGZvciAoY29uc3QgW2xldmVsLCByYXRlXSBvZiBPYmplY3QuZW50cmllcyhoZWFkKSkge1xuICAgIGlmICh0eXBlb2YgcmF0ZSA9PT0gJ251bWJlcicgJiYgcmF0ZSA8IEZVTExfUkFURSkge1xuICAgICAgcmF0ZXNbbGV2ZWwgYXMgTG9nTGV2ZWxdID0gcmF0ZVxuICAgICAgaGFzUmF0ZSA9IHRydWVcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaGFzUmF0ZSA/IHJhdGVzIDogdW5kZWZpbmVkXG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBzYW1wbGluZyBydW50aW1lLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZSBjb25maWcgZHJvcHMgbm90aGluZyDigJRcbiAqIHRhaWwgcnVsZXMgYWxvbmUgYXJlIGEgbm8tb3AsIHNpbmNlIG9ubHkgaGVhZC1kcm9wcGVkIHJlY29yZHMgYXJlIGV2ZXJcbiAqIGJ1ZmZlcmVkLlxuICpcbiAqIEBwYXJhbSByYW5kb20gSW5qZWN0YWJsZSBmb3IgZGV0ZXJtaW5pc3RpYyB0ZXN0czsgZGVmYXVsdHMgdG8gYE1hdGgucmFuZG9tYC5cbiAqL1xuZXhwb3J0IGNvbnN0IHJlc29sdmVTYW1wbGluZyA9IChcbiAgY29uZmlnPzogU2FtcGxpbmdDb25maWcsXG4gIHJhbmRvbTogKCkgPT4gbnVtYmVyID0gTWF0aC5yYW5kb21cbik6IFNhbXBsaW5nUnVudGltZSB8IHVuZGVmaW5lZCA9PiB7XG4gIGNvbnN0IHJhdGVzID0gcmVzb2x2ZVJhdGVzKGNvbmZpZz8uaGVhZClcbiAgaWYgKCFyYXRlcykge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgdGFpbCA9IHJlc29sdmVUYWlsKGNvbmZpZz8udGFpbClcbiAgY29uc3QgbWF4QnVmZmVyZWQgPVxuICAgIGNvbmZpZz8ubWF4QnVmZmVyZWRQZXJSZXF1ZXN0ID8/IERFRkFVTFRfTUFYX0JVRkZFUkVEX1BFUl9SRVFVRVNUXG5cbiAgY29uc3QgYnVmZmVycyA9IG5ldyBXZWFrTWFwPG9iamVjdCwgQnVmZmVyZWRSZWNvcmRbXT4oKVxuICAvLyBPbmx5IHJlcXVlc3RzIHRoZSBwbHVnaW4gb3BlbmVkIChhbmQgd2lsbCBjbG9zZSkgbWF5IGJ1ZmZlcjogV2ViU29ja2V0XG4gIC8vIHBzZXVkby1yZXF1ZXN0cyBhbmQgaGFuZC1yb2xsZWQgYGNyZWF0ZUxvZ2dlcmAgY2FsbGVycyBuZXZlciBmaW5hbGl6ZSwgc29cbiAgLy8gYnVmZmVyaW5nIGZvciB0aGVtIHdvdWxkIGdyb3cgd2l0aG91dCBib3VuZC5cbiAgY29uc3QgaW5GbGlnaHQgPSBuZXcgV2Vha1NldDxvYmplY3Q+KClcbiAgY29uc3QgcmVzY3VlZCA9IG5ldyBXZWFrU2V0PG9iamVjdD4oKVxuXG4gIHJldHVybiB7XG4gICAgYmVnaW4oa2V5KSB7XG4gICAgICBpZiAodGFpbCkge1xuICAgICAgICBpbkZsaWdodC5hZGQoa2V5KVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBidWZmZXIoa2V5LCByZWNvcmQpIHtcbiAgICAgIGxldCBidWNrZXQgPSBidWZmZXJzLmdldChrZXkpXG4gICAgICBpZiAoIWJ1Y2tldCkge1xuICAgICAgICBidWNrZXQgPSBbXVxuICAgICAgICBidWZmZXJzLnNldChrZXksIGJ1Y2tldClcbiAgICAgIH1cbiAgICAgIGlmIChidWNrZXQubGVuZ3RoID49IG1heEJ1ZmZlcmVkKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgYnVja2V0LnB1c2gocmVjb3JkKVxuICAgIH0sXG5cbiAgICBkZWNpZGUobGV2ZWwsIGtleSkge1xuICAgICAgaWYgKHJlc2N1ZWQuaGFzKGtleSkpIHtcbiAgICAgICAgcmV0dXJuICdrZWVwJ1xuICAgICAgfVxuXG4gICAgICBjb25zdCByYXRlID0gcmF0ZXNbbGV2ZWxdID8/IEZVTExfUkFURVxuICAgICAgaWYgKHJhdGUgPj0gRlVMTF9SQVRFIHx8IChyYXRlID4gMCAmJiByYW5kb20oKSAqIEZVTExfUkFURSA8IHJhdGUpKSB7XG4gICAgICAgIHJldHVybiAna2VlcCdcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRhaWwgJiYgaW5GbGlnaHQuaGFzKGtleSkgPyAnYnVmZmVyJyA6ICdkcm9wJ1xuICAgIH0sXG5cbiAgICBmaW5hbGl6ZShrZXksIG91dGNvbWUpIHtcbiAgICAgIGluRmxpZ2h0LmRlbGV0ZShrZXkpXG4gICAgICBjb25zdCBidWNrZXQgPSBidWZmZXJzLmdldChrZXkpXG4gICAgICBidWZmZXJzLmRlbGV0ZShrZXkpXG5cbiAgICAgIGlmICghKHRhaWwgJiYgbWF0Y2hlc1RhaWwodGFpbCwgb3V0Y29tZSkpKSB7XG4gICAgICAgIHJldHVybiBOT19SRUNPUkRTXG4gICAgICB9XG5cbiAgICAgIHJlc2N1ZWQuYWRkKGtleSlcbiAgICAgIHJldHVybiBidWNrZXQgPz8gTk9fUkVDT1JEU1xuICAgIH1cbiAgfVxufVxuIiwKICAgICJjb25zdCBOQU5PU19QRVJfTUlMTEkgPSAxXzAwMF8wMDBcblxuLyoqXG4gKiBNaWxsaXNlY29uZHMgZWxhcHNlZCBzaW5jZSBgYmVmb3JlVGltZWAsIG9yIGAwYCB3aGVuIG5vIHN0YXJ0IHdhcyByZWNvcmRlZFxuICogKGBCaWdJbnQoMClgIGlzIHRoZSBwbHVnaW4ncyBcIm5ldmVyIHN0YXJ0ZWRcIiBzZW50aW5lbCkuXG4gKi9cbmV4cG9ydCBjb25zdCBlbGFwc2VkTXMgPSAoYmVmb3JlVGltZTogYmlnaW50KTogbnVtYmVyID0+XG4gIGJlZm9yZVRpbWUgPT09IDBuXG4gICAgPyAwXG4gICAgOiBOdW1iZXIocHJvY2Vzcy5ocnRpbWUuYmlnaW50KCkgLSBiZWZvcmVUaW1lKSAvIE5BTk9TX1BFUl9NSUxMSVxuIiwKICAgICIvLyBMb2NhbCBwYXJ0IOKJpDY0LCBkb21haW4g4omkMjUzLCBUTEQgMuKAkzYzIChSRkMgNTMyMSAvIDEwMzUtaXNoIGxpbWl0czsgYm91bmRlZCB0byBhdm9pZCBSZURvUylcbmNvbnN0IEVNQUlMX1JFR0VYID1cbiAgL1thLXpBLVowLTkuXyUrLV17MSw2NH1AW2EtekEtWjAtOS4tXXsxLDI1M31cXC5bYS16QS1aXXsyLDYzfS9ndVxuY29uc3QgSVBWNF9SRUdFWCA9XG4gIC8oPzwhW1xcdy8uXSkoPzooPzoyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZClcXC4pezN9KD86MjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKD8hW1xcdy5dKS9ndVxuLyoqXG4gKiBCb3VuZGVkIElQdjY6IGVpdGhlciBhbGwgOCBncm91cHMsIG9yIGEgc2luZ2xlIGA6OmAgY29tcHJlc3Npb24uIFJlcXVpcmluZ1xuICogb25lIG9mIHRob3NlIHNoYXBlcyAocmF0aGVyIHRoYW4gXCIyKyBjb2xvbi1zZXBhcmF0ZWQgaGV4IGdyb3Vwc1wiKSBrZWVwc1xuICogY2xvY2sgdGltZXMgKGAxMjozMDo0NWApIGFuZCBNQUMgYWRkcmVzc2VzIChgYWE6YmI6Y2M6ZGQ6ZWU6ZmZgKSBmcm9tXG4gKiBtYXRjaGluZy5cbiAqL1xuY29uc3QgSVBWNl9SRUdFWCA9XG4gIC8oPzwhW1xcdzpdKSg/Oig/OlswLTlhLWZBLUZdezEsNH06KXs3fVswLTlhLWZBLUZdezEsNH18KD86WzAtOWEtZkEtRl17MSw0fTopezEsN306KD86WzAtOWEtZkEtRl17MSw0fSg/OjpbMC05YS1mQS1GXXsxLDR9KXswLDZ9KT98OjooPzpbMC05YS1mQS1GXXsxLDR9KD86OlswLTlhLWZBLUZdezEsNH0pezAsNn0pKSg/IVtcXHc6XSkvZ3Vcbi8qKiBEaWdpdCBydW5zIHRoYXQgbWF5IGJlIGZvcm1hdHRlZCBQQU5zIChzcGFjZXMvZGFzaGVzKTsgdmFsaWRhdGVkIHdpdGggTHVobiBiZWZvcmUgcmVkYWN0aW5nLiAqL1xuY29uc3QgQ1JFRElUX0NBUkRfQ0FORElEQVRFX1JFR0VYID0gL1xcYig/OlxcZFsgLV0qPyl7MTMsMTl9XFxiL2d1XG5jb25zdCBKV1RfUkVHRVggPSAvZXlKW2EtekEtWjAtOV8tXStcXC5leUpbYS16QS1aMC05Xy1dK1xcLlthLXpBLVowLTlfLV0rL2d1XG5cbmNvbnN0IFBBTl9NSU5fTEVOID0gMTNcbmNvbnN0IFBBTl9NQVhfTEVOID0gMTlcblxuY29uc3QgUkVEQUNURURfVEVYVCA9ICdbUkVEQUNURURdJ1xuY29uc3QgQ0lSQ1VMQVJfUkVGID0gJ1tDaXJjdWxhcl0nXG5cbi8qKiBDYXNlLWluc2Vuc2l0aXZlIGtleS9oZWFkZXIgbmFtZXMgd2hvc2UgVkFMVUVTIGFyZSBhbHdheXMgcmVkYWN0ZWQuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9SRURBQ1RfS0VZUzogcmVhZG9ubHkgc3RyaW5nW10gPSBbXG4gICdhdXRob3JpemF0aW9uJyxcbiAgJ3Byb3h5LWF1dGhvcml6YXRpb24nLFxuICAnY29va2llJyxcbiAgJ3NldC1jb29raWUnLFxuICAneC1hcGkta2V5JyxcbiAgJ2FwaS1rZXknLFxuICAnYXBpa2V5JyxcbiAgJ3gtYXV0aC10b2tlbicsXG4gICdwYXNzd29yZCcsXG4gICdwYXNzd2QnLFxuICAnc2VjcmV0JyxcbiAgJ2NsaWVudC1zZWNyZXQnLFxuICAndG9rZW4nLFxuICAnYWNjZXNzLXRva2VuJyxcbiAgJ3JlZnJlc2gtdG9rZW4nLFxuICAnaWQtdG9rZW4nLFxuICAnc2Vzc2lvbicsXG4gICdzZXNzaW9uLWlkJyxcbiAgJ3ByaXZhdGUta2V5JyxcbiAgJ2NyZWRpdC1jYXJkJyxcbiAgJ2NhcmQtbnVtYmVyJyxcbiAgJ2N2dicsXG4gICdzc24nXG5dXG5cbmNvbnN0IENBTUVMX0NBU0VfQk9VTkRBUllfUkVHRVggPSAvKD88YmVmb3JlPlthLXowLTldKSg/PGFmdGVyPltBLVpdKS9ndVxuXG4vKiogTm9ybWFsaXplIGBYX0FwaS1LZXlgIC8gYGFwaUtleWAgc3R5bGUgdmFyaWFudHMgdG8gYHgtYXBpLWtleWAgZm9ybS4gKi9cbmNvbnN0IG5vcm1hbGl6ZUtleU5hbWUgPSAoa2V5OiBzdHJpbmcpOiBzdHJpbmcgPT5cbiAga2V5XG4gICAgLnJlcGxhY2UoQ0FNRUxfQ0FTRV9CT1VOREFSWV9SRUdFWCwgJyQ8YmVmb3JlPi0kPGFmdGVyPicpXG4gICAgLnJlcGxhY2VBbGwoJ18nLCAnLScpXG4gICAgLnRvTG93ZXJDYXNlKClcblxuLyoqIFdvcmRzIHRoYXQgbWFrZSBhIGtleSBzZW5zaXRpdmUgd2hlcmV2ZXIgdGhleSBhcHBlYXIgYXMgYSB3aG9sZSBwYXJ0LiAqL1xuY29uc3QgU0VOU0lUSVZFX0tFWV9QQVJUUzogUmVhZG9ubHlTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoW1xuICAncGFzc3dkJyxcbiAgJ3Bhc3N3b3JkJyxcbiAgJ3NlY3JldCdcbl0pXG4vKiogQSBrZXkgZW5kaW5nIGluIHRoaXMgcGFydCBuYW1lcyBhIGNyZWRlbnRpYWwgKGBhdXRoLXRva2VuYCwgYHgtY3NyZi10b2tlbmApLiAqL1xuY29uc3QgU0VOU0lUSVZFX0xBU1RfS0VZX1BBUlQgPSAndG9rZW4nXG5cbi8qKlxuICogVHJ1ZSBmb3IgYSBkZWZhdWx0IG9yIGV4dHJhIGtleSBuYW1lLCBvciBmb3IgYW55IGtleSB3aXRoIGEgd2hvbGUgcGFydFxuICogYHBhc3N3b3JkYCwgYHBhc3N3ZGAgb3IgYHNlY3JldGAsIG9yIGVuZGluZyBpbiB0aGUgcGFydCBgdG9rZW5gLiBQYXJ0cyBhcmVcbiAqIHNwbGl0IG9uIGNhc2UgY2hhbmdlcywgYF9gIGFuZCBgLWAsIHNvIGB0b2tlbml6ZXJgIGFuZCBgbWF4VG9rZW5zYCBzdGF5XG4gKiB1bm1hdGNoZWQgd2hpbGUgYG5ld1Bhc3N3b3JkYCBhbmQgYFgtQ1NSRi1Ub2tlbmAgbWF0Y2guXG4gKi9cbmV4cG9ydCBjb25zdCBpc1NlbnNpdGl2ZUtleSA9IChcbiAga2V5OiBzdHJpbmcsXG4gIGV4dHJhS2V5cz86IHJlYWRvbmx5IHN0cmluZ1tdXG4pOiBib29sZWFuID0+IHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZUtleU5hbWUoa2V5KVxuICBpZiAoREVGQVVMVF9SRURBQ1RfS0VZUy5pbmNsdWRlcyhub3JtYWxpemVkKSkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cbiAgaWYgKGV4dHJhS2V5cz8uc29tZShleHRyYUtleSA9PiBub3JtYWxpemVLZXlOYW1lKGV4dHJhS2V5KSA9PT0gbm9ybWFsaXplZCkpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG4gIGNvbnN0IHBhcnRzID0gbm9ybWFsaXplZC5zcGxpdCgnLScpXG4gIHJldHVybiAoXG4gICAgcGFydHMuc29tZShwYXJ0ID0+IFNFTlNJVElWRV9LRVlfUEFSVFMuaGFzKHBhcnQpKSB8fFxuICAgIHBhcnRzLmF0KC0xKSA9PT0gU0VOU0lUSVZFX0xBU1RfS0VZX1BBUlRcbiAgKVxufVxuXG4vKiogcGlubyByZWRhY3QgcGF0aHMgZm9yIG9uZSBrZXk6IHRvcC1sZXZlbCBhbmQgb25lIG5lc3RpbmcgbGV2ZWwuICovXG5leHBvcnQgY29uc3QgYnVpbGRQaW5vUmVkYWN0UGF0aHMgPSAoXG4gIGV4dHJhS2V5cz86IHJlYWRvbmx5IHN0cmluZ1tdXG4pOiBzdHJpbmdbXSA9PiB7XG4gIGNvbnN0IGtleXMgPSBbLi4uREVGQVVMVF9SRURBQ1RfS0VZUywgLi4uKGV4dHJhS2V5cyA/PyBbXSldXG4gIHJldHVybiBrZXlzLmZsYXRNYXAoa2V5ID0+IHtcbiAgICAvLyBwaW5vIHBhdGhzIGRvbid0IGFsbG93IGAtYCBpbiBiYXJlIGlkZW50aWZpZXJzOyBicmFja2V0LXF1b3RlIHRoZW0uXG4gICAgaWYgKGtleS5pbmNsdWRlcygnLScpKSB7XG4gICAgICByZXR1cm4gW2BbXCIke2tleX1cIl1gLCBgKltcIiR7a2V5fVwiXWBdXG4gICAgfVxuICAgIHJldHVybiBba2V5LCBgKi4ke2tleX1gXVxuICB9KVxufVxuXG4vKiogTHVobiBjaGVja3N1bTsgYGRpZ2l0c2AgbXVzdCBjb250YWluIG9ubHkgYDAtOWAgYW5kIGxlbmd0aCBpbiBQQU4gcmFuZ2UuICovXG5jb25zdCBwYXNzZXNMdWhuID0gKGRpZ2l0czogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gIGlmIChkaWdpdHMubGVuZ3RoIDwgUEFOX01JTl9MRU4gfHwgZGlnaXRzLmxlbmd0aCA+IFBBTl9NQVhfTEVOKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBsZXQgc3VtID0gMFxuICBsZXQgYWx0ZXJuYXRlID0gZmFsc2VcblxuICBmb3IgKGxldCBpID0gZGlnaXRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaSAtPSAxKSB7XG4gICAgY29uc3QgY29kZSA9IGRpZ2l0cy5jb2RlUG9pbnRBdChpKSA/PyAwXG4gICAgaWYgKGNvZGUgPCA0OCB8fCBjb2RlID4gNTcpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBsZXQgbiA9IGNvZGUgLSA0OFxuICAgIGlmIChhbHRlcm5hdGUpIHtcbiAgICAgIG4gKj0gMlxuICAgICAgaWYgKG4gPiA5KSB7XG4gICAgICAgIG4gLT0gOVxuICAgICAgfVxuICAgIH1cbiAgICBzdW0gKz0gblxuICAgIGFsdGVybmF0ZSA9ICFhbHRlcm5hdGVcbiAgfVxuXG4gIHJldHVybiBzdW0gJSAxMCA9PT0gMFxufVxuXG5jb25zdCByZWRhY3RDcmVkaXRDYXJkQ2FuZGlkYXRlcyA9ICh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcgPT5cbiAgdGV4dC5yZXBsYWNlKENSRURJVF9DQVJEX0NBTkRJREFURV9SRUdFWCwgbWF0Y2ggPT4ge1xuICAgIGNvbnN0IGRpZ2l0cyA9IG1hdGNoLnJlcGxhY2VBbGwoL1xcRC9ndSwgJycpXG4gICAgaWYgKFxuICAgICAgZGlnaXRzLmxlbmd0aCA+PSBQQU5fTUlOX0xFTiAmJlxuICAgICAgZGlnaXRzLmxlbmd0aCA8PSBQQU5fTUFYX0xFTiAmJlxuICAgICAgcGFzc2VzTHVobihkaWdpdHMpXG4gICAgKSB7XG4gICAgICByZXR1cm4gUkVEQUNURURfVEVYVFxuICAgIH1cbiAgICByZXR1cm4gbWF0Y2hcbiAgfSlcblxuLyoqIFJldHVybnMgYHRleHRgIHVuY2hhbmdlZCAoc2FtZSB2YWx1ZSkgd2hlbiBub3RoaW5nIG1hdGNoZWQg4oCUIGNhbGxlcnMgY2FuIGNvbXBhcmUgYD09PSBpbnB1dGAuICovXG5leHBvcnQgY29uc3QgcmVkYWN0U3RyaW5nID0gKHRleHQ6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGxldCByZXN1bHQgPSB0ZXh0XG5cbiAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoRU1BSUxfUkVHRVgsIFJFREFDVEVEX1RFWFQpXG4gIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKElQVjRfUkVHRVgsIFJFREFDVEVEX1RFWFQpXG4gIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKElQVjZfUkVHRVgsIFJFREFDVEVEX1RFWFQpXG4gIHJlc3VsdCA9IHJlZGFjdENyZWRpdENhcmRDYW5kaWRhdGVzKHJlc3VsdClcbiAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoSldUX1JFR0VYLCBSRURBQ1RFRF9URVhUKVxuXG4gIHJldHVybiByZXN1bHRcbn1cblxuLyoqXG4gKiBIb3N0IGFuZCB1c2VyaW5mbyBjYW5ub3QgY29udGFpbiBgW1JFREFDVEVEXWAg4oCUIGBbYCBiZWdpbnMgYW4gSVB2NiBsaXRlcmFsIGluIFVSTHMgYW5kIGJyZWFrcyBwYXJzaW5nLlxuICovXG5jb25zdCBVUkxfU0FGRV9SRURBQ1QgPSAncmVkYWN0ZWQnXG5cbmNvbnN0IHJlZGFjdFVybEF1dGhvcml0eVNlZ21lbnQgPSAodmFsdWU6IHN0cmluZyk6IHN0cmluZyA9PlxuICByZWRhY3RTdHJpbmcodmFsdWUpLnJlcGxhY2VBbGwoUkVEQUNURURfVEVYVCwgVVJMX1NBRkVfUkVEQUNUKVxuXG4vKiogQWx3YXlzIHJldHVybnMgYSBuZXcgaW5zdGFuY2U7IGBwYXJhbXNgIGlzIGxlZnQgdW50b3VjaGVkLiAqL1xuY29uc3QgcmVkYWN0U2VhcmNoUGFyYW1zID0gKFxuICBwYXJhbXM6IFVSTFNlYXJjaFBhcmFtcyxcbiAgZXh0cmFLZXlzPzogcmVhZG9ubHkgc3RyaW5nW11cbik6IFVSTFNlYXJjaFBhcmFtcyA9PiB7XG4gIGNvbnN0IHJlc3VsdCA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKVxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBwYXJhbXMpIHtcbiAgICByZXN1bHQuYXBwZW5kKFxuICAgICAga2V5LFxuICAgICAgaXNTZW5zaXRpdmVLZXkoa2V5LCBleHRyYUtleXMpID8gVVJMX1NBRkVfUkVEQUNUIDogcmVkYWN0U3RyaW5nKHZhbHVlKVxuICAgIClcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbi8qKlxuICogUmVkYWN0cyB0aGUgZGVjb2RlZCBzZWdtZW50IHNvIGAlNDBgIGNhbm5vdCBoaWRlIGFuIGVtYWlsLiBSZS1lbmNvZGVzIG9ubHlcbiAqIHdoZW4gcmVkYWN0aW9uIGNoYW5nZWQgdGhlIHRleHQ7IG90aGVyIHNlZ21lbnRzIGtlZXAgdGhlaXIgc3BlbGxpbmcuXG4gKi9cbmNvbnN0IHJlZGFjdFBhdGhTZWdtZW50ID0gKHNlZ21lbnQ6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGxldCBkZWNvZGVkID0gc2VnbWVudFxuICB0cnkge1xuICAgIGRlY29kZWQgPSBkZWNvZGVVUklDb21wb25lbnQoc2VnbWVudClcbiAgfSBjYXRjaCB7XG4gICAgLy8gTWFsZm9ybWVkIGVzY2FwZTogcmVkYWN0IHRoZSByYXcgc2VnbWVudCBpbnN0ZWFkLlxuICB9XG4gIGNvbnN0IHJlZGFjdGVkID0gcmVkYWN0U3RyaW5nKGRlY29kZWQpXG4gIGlmIChkZWNvZGVkID09PSBzZWdtZW50KSB7XG4gICAgcmV0dXJuIHJlZGFjdGVkXG4gIH1cbiAgcmV0dXJuIHJlZGFjdGVkID09PSBkZWNvZGVkID8gc2VnbWVudCA6IGVuY29kZVVSSUNvbXBvbmVudChyZWRhY3RlZClcbn1cblxuLyoqIEFwcGx5IFBJSSByZWRhY3Rpb24gdG8gYSByZXF1ZXN0IFVSTCB3aGlsZSBrZWVwaW5nIHRoZSByZXN1bHQgcGFyc2VhYmxlIGJ5IHRoZSBVUkwvUmVxdWVzdCBjb25zdHJ1Y3RvcnMuICovXG5jb25zdCByZWRhY3RSZXF1ZXN0VXJsID0gKFxuICB1cmxTdHJpbmc6IHN0cmluZyxcbiAgZXh0cmFLZXlzPzogcmVhZG9ubHkgc3RyaW5nW11cbik6IHN0cmluZyA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgdSA9IG5ldyBVUkwodXJsU3RyaW5nKVxuICAgIGlmICh1LnVzZXJuYW1lICE9PSAnJykge1xuICAgICAgdS51c2VybmFtZSA9IHJlZGFjdFVybEF1dGhvcml0eVNlZ21lbnQodS51c2VybmFtZSlcbiAgICB9XG4gICAgaWYgKHUucGFzc3dvcmQgIT09ICcnKSB7XG4gICAgICB1LnBhc3N3b3JkID0gcmVkYWN0VXJsQXV0aG9yaXR5U2VnbWVudCh1LnBhc3N3b3JkKVxuICAgIH1cbiAgICB1Lmhvc3RuYW1lID0gcmVkYWN0VXJsQXV0aG9yaXR5U2VnbWVudCh1Lmhvc3RuYW1lKVxuICAgIHUucGF0aG5hbWUgPSB1LnBhdGhuYW1lLnNwbGl0KCcvJykubWFwKHJlZGFjdFBhdGhTZWdtZW50KS5qb2luKCcvJylcbiAgICAvLyBBc3NpZ25pbmcgYHNlYXJjaGAgcmUtc2VyaWFsaXplcyB0aGUgcXVlcnksIHNvIGRvIGl0IG9ubHkgd2hlbiBhIHZhbHVlXG4gICAgLy8gY2hhbmdlZC4gVGhlIHZhbHVlcyBhcmUgZGVjb2RlZCBoZXJlLCBzbyBwYXR0ZXJucyBuZXZlciBydW4gYWdhaW5zdFxuICAgIC8vIHBlcmNlbnQtZW5jb2RlZCB0ZXh0LlxuICAgIGNvbnN0IHF1ZXJ5ID0gcmVkYWN0U2VhcmNoUGFyYW1zKHUuc2VhcmNoUGFyYW1zLCBleHRyYUtleXMpLnRvU3RyaW5nKClcbiAgICBpZiAocXVlcnkgIT09IHUuc2VhcmNoUGFyYW1zLnRvU3RyaW5nKCkpIHtcbiAgICAgIHUuc2VhcmNoID0gcXVlcnlcbiAgICB9XG4gICAgdS5oYXNoID0gcmVkYWN0U3RyaW5nKHUuaGFzaClcbiAgICByZXR1cm4gdS50b1N0cmluZygpXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiByZWRhY3RTdHJpbmcodXJsU3RyaW5nKS5yZXBsYWNlQWxsKFJFREFDVEVEX1RFWFQsIFVSTF9TQUZFX1JFREFDVClcbiAgfVxufVxuXG4vKiogQWx3YXlzIHJldHVybnMgYSBuZXcgaW5zdGFuY2U7IGBoZWFkZXJzYCBpcyBsZWZ0IHVudG91Y2hlZC4gKi9cbmNvbnN0IHJlZGFjdEhlYWRlcnMgPSAoXG4gIGhlYWRlcnM6IEhlYWRlcnMsXG4gIGV4dHJhS2V5cz86IHJlYWRvbmx5IHN0cmluZ1tdXG4pOiBIZWFkZXJzID0+IHtcbiAgY29uc3QgcmVzdWx0ID0gbmV3IEhlYWRlcnMoKVxuICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgaGVhZGVycykge1xuICAgIHJlc3VsdC5hcHBlbmQoXG4gICAgICBuYW1lLFxuICAgICAgaXNTZW5zaXRpdmVLZXkobmFtZSwgZXh0cmFLZXlzKSA/IFJFREFDVEVEX1RFWFQgOiByZWRhY3RTdHJpbmcodmFsdWUpXG4gICAgKVxuICB9XG4gIHJldHVybiByZXN1bHRcbn1cblxuY29uc3Qgd2l0aFJlZW50cmFuY3lHdWFyZCA9IDxUPihcbiAgb2JqOiBvYmplY3QsXG4gIGluUHJvZ3Jlc3M6IFdlYWtTZXQ8b2JqZWN0PixcbiAgcnVuOiAoKSA9PiBUXG4pOiBUID0+IHtcbiAgaW5Qcm9ncmVzcy5hZGQob2JqKVxuICB0cnkge1xuICAgIHJldHVybiBydW4oKVxuICB9IGZpbmFsbHkge1xuICAgIGluUHJvZ3Jlc3MuZGVsZXRlKG9iailcbiAgfVxufVxuXG4vKipcbiAqIE11dHVhbGx5IHJlY3Vyc2l2ZS4gT25lIG9iamVjdCBsZXRzIGVhY2ggd2Fsa2VyIHJlYWNoIHRoZSBvdGhlcnMgYnlcbiAqIHByb3BlcnR5IGluc3RlYWQgb2YgYnkgYSBiaW5kaW5nIGRlY2xhcmVkIGxhdGVyIGluIHRoZSBmaWxlLlxuICovXG5jb25zdCB3YWxrZXIgPSB7XG4gIC8qKlxuICAgKiBSZWRhY3RzIGVhY2ggaXRlbTsgcmV0dXJucyB0aGUgT1JJR0lOQUwgYXJyYXkgcmVmZXJlbmNlIHdoZW4gbm8gaXRlbSBjaGFuZ2VkICh6ZXJvXG4gICAqIGFsbG9jYXRpb25zIGZvciB0aGUgY29tbW9uIG5vLVBJSSBjYXNlKS4gQSBuZXcgYXJyYXkgaXMgbWF0ZXJpYWxpemVkIGxhemlseSwgc3RhcnRpbmcgZnJvbVxuICAgKiB0aGUgZmlyc3QgaXRlbSB0aGF0IGNoYW5nZXMg4oCUIGl0ZW1zIGJlZm9yZSB0aGF0IHBvaW50IGFyZSBrbm93bi11bmNoYW5nZWQsIHNvIHRoZXkncmUgY29waWVkXG4gICAqIGZyb20gYHZhbHVlYCBhcy1pcyByYXRoZXIgdGhhbiByZWNvbXB1dGVkLlxuICAgKi9cbiAgYXJyYXk6IChcbiAgICB2YWx1ZTogdW5rbm93bltdLFxuICAgIGluUHJvZ3Jlc3M6IFdlYWtTZXQ8b2JqZWN0PixcbiAgICBleHRyYUtleXM/OiByZWFkb25seSBzdHJpbmdbXVxuICApOiB1bmtub3duW10gPT4ge1xuICAgIGxldCByZXN1bHQ6IHVua25vd25bXSB8IHVuZGVmaW5lZFxuXG4gICAgZm9yIChjb25zdCBbaW5kZXgsIG9yaWdpbmFsXSBvZiB2YWx1ZS5lbnRyaWVzKCkpIHtcbiAgICAgIGNvbnN0IHJlZGFjdGVkID0gd2Fsa2VyLnZhbHVlKG9yaWdpbmFsLCBpblByb2dyZXNzLCBleHRyYUtleXMpXG4gICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQgJiYgcmVkYWN0ZWQgIT09IG9yaWdpbmFsKSB7XG4gICAgICAgIHJlc3VsdCA9IHZhbHVlLnNsaWNlKDAsIGluZGV4KVxuICAgICAgfVxuICAgICAgcmVzdWx0Py5wdXNoKHJlZGFjdGVkKVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQgPz8gdmFsdWVcbiAgfSxcblxuICAvLyBFcnJvcnMgYXJlIGV4ZW1wdCBmcm9tIHRoZSBpZGVudGl0eSBmYXN0IHBhdGg6IGEgcmVkYWN0ZWQgRXJyb3IgaXMgYWx3YXlzIGNvbnN0cnVjdGVkXG4gIC8vIGZyZXNoIChldmVuIHdoZW4gbm90aGluZyBjaGFuZ2VkKSBzbyBjb25zdW1lcnMgbmV2ZXIgcmVjZWl2ZSB0aGUgb3JpZ2luYWwsIHBvdGVudGlhbGx5XG4gIC8vIHN0YWNrLXRyYWNlLWNhcnJ5aW5nIGluc3RhbmNlIGJ5IHJlZmVyZW5jZS5cbiAgZXJyb3I6IChcbiAgICBvcmlnaW5hbEVycm9yOiBFcnJvcixcbiAgICBpblByb2dyZXNzOiBXZWFrU2V0PG9iamVjdD4sXG4gICAgZXh0cmFLZXlzPzogcmVhZG9ubHkgc3RyaW5nW11cbiAgKTogRXJyb3IgJiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiB7XG4gICAgY29uc3QgcmVkYWN0ZWRNZXNzYWdlID0gcmVkYWN0U3RyaW5nKG9yaWdpbmFsRXJyb3IubWVzc2FnZSlcbiAgICBjb25zdCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvcmlnaW5hbEVycm9yKSBhcyBvYmplY3RcbiAgICBjb25zdCBuZXdFcnJvciA9IE9iamVjdC5jcmVhdGUocHJvdG8pIGFzIEVycm9yICYgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cblxuICAgIG5ld0Vycm9yLm1lc3NhZ2UgPSByZWRhY3RlZE1lc3NhZ2VcbiAgICBuZXdFcnJvci5uYW1lID0gb3JpZ2luYWxFcnJvci5uYW1lXG5cbiAgICBpZiAob3JpZ2luYWxFcnJvci5zdGFjayAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBuZXdFcnJvci5zdGFjayA9IHJlZGFjdFN0cmluZyhvcmlnaW5hbEVycm9yLnN0YWNrKVxuICAgIH1cblxuICAgIGNvbnN0IGVycm9yUmVjb3JkID0gb3JpZ2luYWxFcnJvciBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhlcnJvclJlY29yZCkpIHtcbiAgICAgIGlmIChrZXkgPT09ICdtZXNzYWdlJyB8fCBrZXkgPT09ICduYW1lJyB8fCBrZXkgPT09ICdzdGFjaycpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZXJyb3JSZWNvcmQsIGtleSlcbiAgICAgIGlmIChkZXNjcmlwdG9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKGRlc2NyaXB0b3IuZ2V0ICE9PSB1bmRlZmluZWQgfHwgZGVzY3JpcHRvci5zZXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobmV3RXJyb3IsIGtleSwgZGVzY3JpcHRvcilcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVkYWN0ZWRWYWx1ZSA9IGlzU2Vuc2l0aXZlS2V5KGtleSwgZXh0cmFLZXlzKVxuICAgICAgICA/IFJFREFDVEVEX1RFWFRcbiAgICAgICAgOiB3YWxrZXIudmFsdWUoZGVzY3JpcHRvci52YWx1ZSwgaW5Qcm9ncmVzcywgZXh0cmFLZXlzKVxuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobmV3RXJyb3IsIGtleSwge1xuICAgICAgICAuLi5kZXNjcmlwdG9yLFxuICAgICAgICB2YWx1ZTogcmVkYWN0ZWRWYWx1ZVxuICAgICAgfSlcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3RXJyb3JcbiAgfSxcblxuICBtYXA6IChcbiAgICB2YWx1ZTogTWFwPHVua25vd24sIHVua25vd24+LFxuICAgIGluUHJvZ3Jlc3M6IFdlYWtTZXQ8b2JqZWN0PixcbiAgICBleHRyYUtleXM/OiByZWFkb25seSBzdHJpbmdbXVxuICApOiBNYXA8dW5rbm93biwgdW5rbm93bj4gPT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBNYXA8dW5rbm93biwgdW5rbm93bj4oKVxuICAgIGZvciAoY29uc3QgW2tleSwgZW50cnldIG9mIHZhbHVlKSB7XG4gICAgICBjb25zdCBzZW5zaXRpdmUgPVxuICAgICAgICB0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyAmJiBpc1NlbnNpdGl2ZUtleShrZXksIGV4dHJhS2V5cylcbiAgICAgIHJlc3VsdC5zZXQoXG4gICAgICAgIGtleSxcbiAgICAgICAgc2Vuc2l0aXZlID8gUkVEQUNURURfVEVYVCA6IHdhbGtlci52YWx1ZShlbnRyeSwgaW5Qcm9ncmVzcywgZXh0cmFLZXlzKVxuICAgICAgKVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG4gIH0sXG5cbiAgLyoqIFNhbWUgbGF6eS1tYXRlcmlhbGl6YXRpb24gc3RyYXRlZ3kgYXMge0BsaW5rIHdhbGtlci5hcnJheX0sIGZvciBwbGFpbiBvYmplY3RzLiAqL1xuICByZWNvcmQ6IChcbiAgICByZWNvcmRWYWx1ZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgaW5Qcm9ncmVzczogV2Vha1NldDxvYmplY3Q+LFxuICAgIGV4dHJhS2V5cz86IHJlYWRvbmx5IHN0cmluZ1tdXG4gICk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+IHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMocmVjb3JkVmFsdWUpXG4gICAgbGV0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWRcblxuICAgIGZvciAoY29uc3QgW2luZGV4LCBrZXldIG9mIGtleXMuZW50cmllcygpKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbCA9IHJlY29yZFZhbHVlW2tleV1cbiAgICAgIGNvbnN0IHNlbnNpdGl2ZSA9IGlzU2Vuc2l0aXZlS2V5KGtleSwgZXh0cmFLZXlzKVxuICAgICAgY29uc3QgcmVkYWN0ZWQgPSBzZW5zaXRpdmVcbiAgICAgICAgPyBSRURBQ1RFRF9URVhUXG4gICAgICAgIDogd2Fsa2VyLnZhbHVlKG9yaWdpbmFsLCBpblByb2dyZXNzLCBleHRyYUtleXMpXG5cbiAgICAgIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCAmJiAoc2Vuc2l0aXZlIHx8IHJlZGFjdGVkICE9PSBvcmlnaW5hbCkpIHtcbiAgICAgICAgcmVzdWx0ID0ge31cbiAgICAgICAgZm9yIChjb25zdCBwcmlvcktleSBvZiBrZXlzLnNsaWNlKDAsIGluZGV4KSkge1xuICAgICAgICAgIHJlc3VsdFtwcmlvcktleV0gPSByZWNvcmRWYWx1ZVtwcmlvcktleV1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gcmVkYWN0ZWRcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0ID8/IHJlY29yZFZhbHVlXG4gIH0sXG5cbiAgc2V0OiAoXG4gICAgdmFsdWU6IFNldDx1bmtub3duPixcbiAgICBpblByb2dyZXNzOiBXZWFrU2V0PG9iamVjdD4sXG4gICAgZXh0cmFLZXlzPzogcmVhZG9ubHkgc3RyaW5nW11cbiAgKTogU2V0PHVua25vd24+ID0+XG4gICAgbmV3IFNldChcbiAgICAgIEFycmF5LmZyb20odmFsdWUsIGl0ZW0gPT4gd2Fsa2VyLnZhbHVlKGl0ZW0sIGluUHJvZ3Jlc3MsIGV4dHJhS2V5cykpXG4gICAgKSxcblxuICB2YWx1ZTogKFxuICAgIHZhbHVlOiB1bmtub3duLFxuICAgIGluUHJvZ3Jlc3M6IFdlYWtTZXQ8b2JqZWN0PixcbiAgICBleHRyYUtleXM/OiByZWFkb25seSBzdHJpbmdbXVxuICApOiB1bmtub3duID0+IHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHJlZGFjdFN0cmluZyh2YWx1ZSlcbiAgICB9XG5cbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIHZhbHVlXG4gICAgfVxuXG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgLy8gRGF0ZXMgY2Fycnkgbm8gcmVkYWN0YWJsZSBzdHJpbmcgY29udGVudCBhbmQgYXJlIG5ldmVyIG11dGF0ZWQgYnkgdGhpcyBtb2R1bGUsIHNvIHRoZXlcbiAgICAgIC8vIHBhc3MgdGhyb3VnaCBieSByZWZlcmVuY2UgKHBhcnQgb2YgdGhlIGlkZW50aXR5IGZhc3QgcGF0aCkgaW5zdGVhZCBvZiBiZWluZyBkZWZlbnNpdmVseVxuICAgICAgLy8gY2xvbmVkIGFzIGJlZm9yZS5cbiAgICAgIHJldHVybiB2YWx1ZVxuICAgIH1cblxuICAgIGlmIChpblByb2dyZXNzLmhhcyh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBDSVJDVUxBUl9SRUZcbiAgICB9XG5cbiAgICAvLyBUaGVzZSB0eXBlcyBleHBvc2UgdGhlaXIgY29udGVudHMgb25seSB0aHJvdWdoIGl0ZXJhdGlvbiBvciB0b0pTT04oKSxcbiAgICAvLyBzbyB0aGUga2V5IHdhbGsgYmVsb3cgd291bGQgcmV0dXJuIHRoZW0gdW5jaGFuZ2VkLlxuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEhlYWRlcnMpIHtcbiAgICAgIHJldHVybiByZWRhY3RIZWFkZXJzKHZhbHVlLCBleHRyYUtleXMpXG4gICAgfVxuXG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgVVJMU2VhcmNoUGFyYW1zKSB7XG4gICAgICByZXR1cm4gcmVkYWN0U2VhcmNoUGFyYW1zKHZhbHVlLCBleHRyYUtleXMpXG4gICAgfVxuXG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgVVJMKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbmV3IFVSTChyZWRhY3RSZXF1ZXN0VXJsKHZhbHVlLmhyZWYsIGV4dHJhS2V5cykpXG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIFJFREFDVEVEX1RFWFRcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBNYXApIHtcbiAgICAgIHJldHVybiB3aXRoUmVlbnRyYW5jeUd1YXJkKHZhbHVlLCBpblByb2dyZXNzLCAoKSA9PlxuICAgICAgICB3YWxrZXIubWFwKHZhbHVlLCBpblByb2dyZXNzLCBleHRyYUtleXMpXG4gICAgICApXG4gICAgfVxuXG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgICByZXR1cm4gd2l0aFJlZW50cmFuY3lHdWFyZCh2YWx1ZSwgaW5Qcm9ncmVzcywgKCkgPT5cbiAgICAgICAgd2Fsa2VyLnNldCh2YWx1ZSwgaW5Qcm9ncmVzcywgZXh0cmFLZXlzKVxuICAgICAgKVxuICAgIH1cblxuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICByZXR1cm4gd2l0aFJlZW50cmFuY3lHdWFyZCh2YWx1ZSwgaW5Qcm9ncmVzcywgKCkgPT5cbiAgICAgICAgd2Fsa2VyLmVycm9yKHZhbHVlLCBpblByb2dyZXNzLCBleHRyYUtleXMpXG4gICAgICApXG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICByZXR1cm4gd2l0aFJlZW50cmFuY3lHdWFyZCh2YWx1ZSwgaW5Qcm9ncmVzcywgKCkgPT5cbiAgICAgICAgd2Fsa2VyLmFycmF5KHZhbHVlLCBpblByb2dyZXNzLCBleHRyYUtleXMpXG4gICAgICApXG4gICAgfVxuXG4gICAgcmV0dXJuIHdpdGhSZWVudHJhbmN5R3VhcmQodmFsdWUsIGluUHJvZ3Jlc3MsICgpID0+XG4gICAgICB3YWxrZXIucmVjb3JkKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBpblByb2dyZXNzLCBleHRyYUtleXMpXG4gICAgKVxuICB9XG59XG5cbi8qKlxuICogQXBhcnQgZnJvbSBhIGNpcmN1bGFyIHJlZmVyZW5jZSwgd2hpY2ggYmVjb21lcyB0aGUgbWFya2VyIHN0cmluZywgdGhlIHdhbGtcbiAqIGtlZXBzIGVhY2ggdmFsdWUncyBzaGFwZTogYSBzdHJpbmcgc3RheXMgYSBzdHJpbmcsIGFuIGFycmF5IGFuIGFycmF5LCBhblxuICogRXJyb3IgYW4gRXJyb3IuIFRoZSBpbnB1dCB0eXBlIHRoZXJlZm9yZSBzdGlsbCBkZXNjcmliZXMgdGhlIG91dHB1dC5cbiAqL1xuZXhwb3J0IGNvbnN0IHJlZGFjdCA9IDxUPih2YWx1ZTogVCwgZXh0cmFLZXlzPzogcmVhZG9ubHkgc3RyaW5nW10pOiBUID0+XG4gIHdhbGtlci52YWx1ZSh2YWx1ZSwgbmV3IFdlYWtTZXQoKSwgZXh0cmFLZXlzKSBhcyBUXG5cbi8qKlxuICogQ2xvbmUgcmVxdWVzdCBVUkwsIG1ldGhvZCBhbmQgaGVhZGVycyBmb3IgbG9nZ2luZyB3aXRoIHRoZSBzYW1lIHN0cmluZyByZWRhY3Rpb24gYXMge0BsaW5rIHJlZGFjdH0uXG4gKiBUaGUgcmV0dXJuZWQgcmVxdWVzdCBpcyBhIGxvZ2dpbmctb25seSBhcnRpZmFjdCBjYXJyeWluZyB1cmwvbWV0aG9kL2hlYWRlcnMvc2lnbmFsOyBpdCBpbnRlbnRpb25hbGx5XG4gKiBvbWl0cyB0aGUgYm9keSBzbyBpdCBuZXZlciByZS11c2VzIHRoZSBvcmlnaW5hbCAocG9zc2libHkgYWxyZWFkeS1jb25zdW1lZCkgcmVxdWVzdCBzdHJlYW0uIFRoZVxuICogb3JpZ2luYWwgcmVxdWVzdCBpcyBsZWZ0IHVudG91Y2hlZCBhbmQgcmVtYWlucyB1c2FibGUuXG4gKi9cbmV4cG9ydCBjb25zdCByZWRhY3RSZXF1ZXN0ID0gKFxuICByZXF1ZXN0OiBSZXF1ZXN0LFxuICBleHRyYUtleXM/OiByZWFkb25seSBzdHJpbmdbXVxuKTogUmVxdWVzdCA9PiB7XG4gIGNvbnN0IHJlZGFjdGVkVXJsID0gcmVkYWN0UmVxdWVzdFVybChyZXF1ZXN0LnVybCwgZXh0cmFLZXlzKVxuICBjb25zdCBuZXh0SGVhZGVycyA9IG5ldyBIZWFkZXJzKClcbiAgbGV0IGhlYWRlcnNDaGFuZ2VkID0gZmFsc2VcblxuICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgcmVxdWVzdC5oZWFkZXJzLmVudHJpZXMoKSkge1xuICAgIGNvbnN0IHJlZGFjdGVkID0gaXNTZW5zaXRpdmVLZXkobmFtZSwgZXh0cmFLZXlzKVxuICAgICAgPyBSRURBQ1RFRF9URVhUXG4gICAgICA6IHJlZGFjdFN0cmluZyh2YWx1ZSlcbiAgICBpZiAocmVkYWN0ZWQgIT09IHZhbHVlKSB7XG4gICAgICBoZWFkZXJzQ2hhbmdlZCA9IHRydWVcbiAgICB9XG4gICAgbmV4dEhlYWRlcnMuc2V0KG5hbWUsIHJlZGFjdGVkKVxuICB9XG5cbiAgY29uc3QgcmVkYWN0ZWRNZXRob2QgPSByZWRhY3RTdHJpbmcocmVxdWVzdC5tZXRob2QpXG4gIGNvbnN0IHVybENoYW5nZWQgPSByZWRhY3RlZFVybCAhPT0gcmVxdWVzdC51cmxcbiAgY29uc3QgbWV0aG9kQ2hhbmdlZCA9IHJlZGFjdGVkTWV0aG9kICE9PSByZXF1ZXN0Lm1ldGhvZFxuXG4gIGlmICghKHVybENoYW5nZWQgfHwgaGVhZGVyc0NoYW5nZWQgfHwgbWV0aG9kQ2hhbmdlZCkpIHtcbiAgICByZXR1cm4gcmVxdWVzdFxuICB9XG5cbiAgY29uc3QgaW5pdDogUmVxdWVzdEluaXQgPSB7XG4gICAgaGVhZGVyczogbmV4dEhlYWRlcnMsXG4gICAgbWV0aG9kOiByZWRhY3RlZE1ldGhvZCxcbiAgICByZWRpcmVjdDogcmVxdWVzdC5yZWRpcmVjdCxcbiAgICBzaWduYWw6IHJlcXVlc3Quc2lnbmFsXG4gIH1cblxuICByZXR1cm4gbmV3IFJlcXVlc3QocmVkYWN0ZWRVcmwsIGluaXQpXG59XG4iLAogICAgImltcG9ydCB7IFNUQVRVU19DT0RFUyB9IGZyb20gJ25vZGU6aHR0cCdcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsaydcbmltcG9ydCB7IGdldFN0YXR1c0NvZGUgfSBmcm9tICcuLi9oZWxwZXJzL3N0YXR1cydcbmltcG9ydCB0eXBlIHsgTG9nTGV2ZWwsIE9wdGlvbnMsIFJlcXVlc3RJbmZvLCBTdG9yZURhdGEgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgZWxhcHNlZE1zIH0gZnJvbSAnLi4vdXRpbHMvZHVyYXRpb24nXG5pbXBvcnQgeyBpc1N0cnVjdHVyZWRFcnJvciwgcGFyc2VFcnJvciB9IGZyb20gJy4uL3V0aWxzL2Vycm9yJ1xuaW1wb3J0IHsgc2FuaXRpemVMb2dUZXh0IH0gZnJvbSAnLi4vdXRpbHMvc2FuaXRpemUnXG5cbmNvbnN0IHBhZDIgPSAodmFsdWU6IG51bWJlcik6IHN0cmluZyA9PiBTdHJpbmcodmFsdWUpLnBhZFN0YXJ0KDIsICcwJylcbmNvbnN0IHBhZDMgPSAodmFsdWU6IG51bWJlcik6IHN0cmluZyA9PiBTdHJpbmcodmFsdWUpLnBhZFN0YXJ0KDMsICcwJylcblxuY29uc3QgREVGQVVMVF9TTE9XX01TID0gNTAwXG5jb25zdCBERUZBVUxUX1ZFUllfU0xPV19NUyA9IDEwMDBcbmNvbnN0IE1FVEhPRF9QQUQgPSA3XG5jb25zdCBNQVhfS0VZX0xFTkdUSCA9IDI1NlxuXG5jb25zdCBERUZBVUxUX0xPR19GT1JNQVQgPVxuICAne25vd30ge3NlcnZpY2V9e2ljb259IHttZXRob2R9IHtwYXRobmFtZX0ge3N0YXR1c30ge2R1cmF0aW9ufSB7bWVzc2FnZX17c3BlZWR9J1xuXG5jb25zdCBMT0dfRk9STUFUX1JFR0VYID1cbiAgL1xceyg/Om5vd3xlcG9jaHxsZXZlbHxpY29ufGR1cmF0aW9ufG1ldGhvZHxwYXRobmFtZXxwYXRofHF1ZXJ5fHN0YXR1c3xzdGF0dXNUZXh0fG1lc3NhZ2V8aXB8Y29udGV4dHxzZXJ2aWNlfHNwZWVkfHJlcXVlc3RJZClcXH0vZ3VcblxuZXhwb3J0IGludGVyZmFjZSBGb3JtYXR0ZWRMb2dPdXRwdXQge1xuICBjb250ZXh0TGluZXM6IHN0cmluZ1tdXG4gIG1haW46IHN0cmluZ1xufVxuXG5jb25zdCBzaG91bGRVc2VDb2xvcnMgPSAob3B0aW9uczogT3B0aW9ucyk6IGJvb2xlYW4gPT4ge1xuICBjb25zdCB7IGNvbmZpZyB9ID0gb3B0aW9uc1xuICBjb25zdCBlbmFibGVkQnlDb25maWcgPSBjb25maWc/LnVzZUNvbG9ycyA/PyB0cnVlXG5cbiAgLy8gQXZvaWQgQU5TSSBzZXF1ZW5jZXMgaW4gbm9uLWludGVyYWN0aXZlIG91dHB1dCAocGlwZXMsIENJIGxvZ3MsIGZpbGVzKS5cbiAgY29uc3QgaXNUdHkgPSB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgcHJvY2Vzcy5zdGRvdXQ/LmlzVFRZID09PSB0cnVlXG4gIHJldHVybiBlbmFibGVkQnlDb25maWcgJiYgaXNUdHlcbn1cblxuLy8gcGluby1wcmV0dHkncyBzaG9ydGhhbmQgZm9yIGB5eXl5LW1tLWRkIEhIOk1NOnNzLlNTU2AgKG1pbnVzIHRoZSBgb2Bcbi8vIHRpbWV6b25lLW9mZnNldCB0b2tlbiwgd2hpY2ggdGhpcyBmb3JtYXR0ZXIgZG9lcyBub3Qgc3VwcG9ydCkuXG5jb25zdCBTVEFOREFSRF9USU1FU1RBTVBfUEFUVEVSTiA9ICd5eXl5LW1tLWRkIEhIOk1NOnNzLlNTUydcbi8vIGBTWVM6YCBhbmQgYFVUQzpgIGFyZSB0aGUgc2FtZSBsZW5ndGguXG5jb25zdCBUSU1FU1RBTVBfUFJFRklYX0xFTkdUSCA9ICdzeXM6Jy5sZW5ndGhcblxuLyoqXG4gKiBTcGxpdHMgYSBgdGltZXN0YW1wLnRyYW5zbGF0ZVRpbWVgIHZhbHVlIGludG8gdGhlIGxpdGVyYWwgcGF0dGVybiB0b1xuICogZXhwYW5kIGFuZCB3aGV0aGVyIGl0IHNob3VsZCBiZSByZWFkIHdpdGggVVRDIGdldHRlcnMuIE1pcnJvcnNcbiAqIHBpbm8tcHJldHR5J3MgYFNZUzpgL2BVVEM6YCBwcmVmaXhlcyAoY2FzZS1pbnNlbnNpdGl2ZSk7IGEgYmFyZSBwYXR0ZXJuXG4gKiBrZWVwcyB0aGlzIGZvcm1hdHRlcidzIGhpc3RvcmljYWwgbG9jYWwtdGltZSBiZWhhdmlvdXIuXG4gKi9cbmNvbnN0IHJlc29sdmVUaW1lc3RhbXBQYXR0ZXJuID0gKFxuICBwYXR0ZXJuOiBzdHJpbmdcbik6IHsgcGF0dGVybjogc3RyaW5nOyB1dGM6IGJvb2xlYW4gfSA9PiB7XG4gIGNvbnN0IHByZWZpeCA9IHBhdHRlcm4uc2xpY2UoMCwgVElNRVNUQU1QX1BSRUZJWF9MRU5HVEgpLnRvTG93ZXJDYXNlKClcbiAgY29uc3QgdXRjID0gcHJlZml4ID09PSAndXRjOidcbiAgY29uc3QgcmVzdCA9XG4gICAgdXRjIHx8IHByZWZpeCA9PT0gJ3N5czonID8gcGF0dGVybi5zbGljZShUSU1FU1RBTVBfUFJFRklYX0xFTkdUSCkgOiBwYXR0ZXJuXG4gIHJldHVybiB7XG4gICAgcGF0dGVybjogcmVzdCA9PT0gJ3N0YW5kYXJkJyA/IFNUQU5EQVJEX1RJTUVTVEFNUF9QQVRURVJOIDogcmVzdCxcbiAgICB1dGNcbiAgfVxufVxuXG5jb25zdCBmb3JtYXRUaW1lc3RhbXAgPSAoZGF0ZTogRGF0ZSwgcGF0dGVybj86IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGlmICghcGF0dGVybikge1xuICAgIHJldHVybiBkYXRlLnRvSVNPU3RyaW5nKClcbiAgfVxuXG4gIGNvbnN0IHsgcGF0dGVybjogcmVzb2x2ZWQsIHV0YyB9ID0gcmVzb2x2ZVRpbWVzdGFtcFBhdHRlcm4ocGF0dGVybilcblxuICBjb25zdCB5eXl5ID0gU3RyaW5nKHV0YyA/IGRhdGUuZ2V0VVRDRnVsbFllYXIoKSA6IGRhdGUuZ2V0RnVsbFllYXIoKSlcbiAgY29uc3QgbW0gPSBwYWQyKCh1dGMgPyBkYXRlLmdldFVUQ01vbnRoKCkgOiBkYXRlLmdldE1vbnRoKCkpICsgMSlcbiAgY29uc3QgZGQgPSBwYWQyKHV0YyA/IGRhdGUuZ2V0VVRDRGF0ZSgpIDogZGF0ZS5nZXREYXRlKCkpXG4gIGNvbnN0IEhIID0gcGFkMih1dGMgPyBkYXRlLmdldFVUQ0hvdXJzKCkgOiBkYXRlLmdldEhvdXJzKCkpXG4gIGNvbnN0IE1NID0gcGFkMih1dGMgPyBkYXRlLmdldFVUQ01pbnV0ZXMoKSA6IGRhdGUuZ2V0TWludXRlcygpKVxuICBjb25zdCBzcyA9IHBhZDIodXRjID8gZGF0ZS5nZXRVVENTZWNvbmRzKCkgOiBkYXRlLmdldFNlY29uZHMoKSlcbiAgY29uc3QgU1NTID0gcGFkMyh1dGMgPyBkYXRlLmdldFVUQ01pbGxpc2Vjb25kcygpIDogZGF0ZS5nZXRNaWxsaXNlY29uZHMoKSlcblxuICByZXR1cm4gcmVzb2x2ZWRcbiAgICAucmVwbGFjZUFsbCgneXl5eScsIHl5eXkpXG4gICAgLnJlcGxhY2VBbGwoJ21tJywgbW0pXG4gICAgLnJlcGxhY2VBbGwoJ2RkJywgZGQpXG4gICAgLnJlcGxhY2VBbGwoJ0hIJywgSEgpXG4gICAgLnJlcGxhY2VBbGwoJ01NJywgTU0pXG4gICAgLnJlcGxhY2VBbGwoJ3NzJywgc3MpXG4gICAgLnJlcGxhY2VBbGwoJ1NTUycsIFNTUylcbn1cblxuLyoqIFJlc29sdmVzIGNsaWVudCBJUCBmcm9tIHgtZm9yd2FyZGVkLWZvciAoZmlyc3QgSVApIG9yIHgtcmVhbC1pcC4gRW1wdHkgd2hlbiBuZWl0aGVyIGhlYWRlciBpcyBzZXQgKGUuZy4gbG9jYWxob3N0KS4gKi9cbmNvbnN0IGdldElwID0gKHJlcXVlc3Q6IFJlcXVlc3RJbmZvKTogc3RyaW5nID0+IHtcbiAgY29uc3QgZm9yd2FyZGVkID0gcmVxdWVzdC5oZWFkZXJzLmdldCgneC1mb3J3YXJkZWQtZm9yJylcbiAgY29uc3QgY2FuZGlkYXRlID0gZm9yd2FyZGVkXG4gICAgPyAoZm9yd2FyZGVkLnNwbGl0KCcsJylbMF0/LnRyaW0oKSA/PyAnJylcbiAgICA6IChyZXF1ZXN0LmhlYWRlcnMuZ2V0KCd4LXJlYWwtaXAnKSA/PyAnJylcbiAgcmV0dXJuIHNhbml0aXplTG9nVGV4dChjYW5kaWRhdGUsIDY0KVxufVxuXG5leHBvcnQgY29uc3QgZm9ybWF0RHVyYXRpb24gPSAobXM6IG51bWJlcik6IHN0cmluZyA9PiB7XG4gIGlmIChtcyA+PSAxMDAwKSB7XG4gICAgY29uc3Qgc2VjID0gbXMgLyAxMDAwXG4gICAgaWYgKHNlYyA+PSAxMCkge1xuICAgICAgcmV0dXJuIGAke01hdGgucm91bmQoc2VjKX1zYFxuICAgIH1cbiAgICBjb25zdCBvbmVEZWNpbWFsID0gc2VjLnRvRml4ZWQoMSlcbiAgICByZXR1cm4gb25lRGVjaW1hbC5lbmRzV2l0aCgnLjAnKSA/IGAke01hdGgucm91bmQoc2VjKX1zYCA6IGAke29uZURlY2ltYWx9c2BcbiAgfVxuICBpZiAobXMgPiAwICYmIG1zIDwgMSkge1xuICAgIHJldHVybiBgJHttcy50b0ZpeGVkKDIpfW1zYFxuICB9XG4gIHJldHVybiBgJHtNYXRoLnJvdW5kKG1zKX1tc2Bcbn1cblxuY29uc3QgZ2V0U2xvd1RocmVzaG9sZHMgPSAoXG4gIG9wdGlvbnM6IE9wdGlvbnNcbik6IHsgc2xvdzogbnVtYmVyOyB2ZXJ5U2xvdzogbnVtYmVyIH0gPT4ge1xuICBjb25zdCB7IGNvbmZpZyB9ID0gb3B0aW9uc1xuICByZXR1cm4ge1xuICAgIHNsb3c6IGNvbmZpZz8uc2xvd1RocmVzaG9sZCA/PyBERUZBVUxUX1NMT1dfTVMsXG4gICAgdmVyeVNsb3c6IGNvbmZpZz8udmVyeVNsb3dUaHJlc2hvbGQgPz8gREVGQVVMVF9WRVJZX1NMT1dfTVNcbiAgfVxufVxuXG5jb25zdCBjb2xvckR1cmF0aW9uVGV4dCA9IChcbiAgbXM6IG51bWJlcixcbiAgdXNlQ29sb3JzOiBib29sZWFuLFxuICBzbG93OiBudW1iZXIsXG4gIHZlcnlTbG93OiBudW1iZXJcbik6IHsgdGV4dDogc3RyaW5nOyBpc1ZlcnlTbG93OiBib29sZWFuIH0gPT4ge1xuICBjb25zdCByYXcgPSBmb3JtYXREdXJhdGlvbihtcylcbiAgY29uc3QgaXNWZXJ5U2xvdyA9IG1zID49IHZlcnlTbG93XG5cbiAgaWYgKCF1c2VDb2xvcnMpIHtcbiAgICByZXR1cm4geyBpc1ZlcnlTbG93LCB0ZXh0OiByYXcgfVxuICB9XG5cbiAgbGV0IGNvbG9yZWQgPSByYXdcbiAgaWYgKG1zIDwgc2xvdykge1xuICAgIGNvbG9yZWQgPSBjaGFsay5ncmVlbihyYXcpXG4gIH0gZWxzZSBpZiAobXMgPCB2ZXJ5U2xvdykge1xuICAgIGNvbG9yZWQgPSBjaGFsay55ZWxsb3cocmF3KVxuICB9IGVsc2Uge1xuICAgIGNvbG9yZWQgPSBjaGFsay5yZWQuYm9sZChyYXcpXG4gIH1cblxuICByZXR1cm4geyBpc1ZlcnlTbG93LCB0ZXh0OiBjb2xvcmVkIH1cbn1cblxuY29uc3QgZ2V0U3BlZWRUb2tlbiA9IChpc1ZlcnlTbG93OiBib29sZWFuLCB1c2VDb2xvcnM6IGJvb2xlYW4pOiBzdHJpbmcgPT4ge1xuICBpZiAoIWlzVmVyeVNsb3cpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuICBjb25zdCBiYWRnZSA9ICfimqEgc2xvdydcbiAgaWYgKCF1c2VDb2xvcnMpIHtcbiAgICByZXR1cm4gYCAke2JhZGdlfWBcbiAgfVxuICByZXR1cm4gYCAke2NoYWxrLnllbGxvdyhiYWRnZSl9YFxufVxuXG4vKiogTG9naXhseXNpYSBicmFuZDogZm94IGVtb2ppIHdpdGggbGV2ZWwtY29sb3JlZCBiYWNrZ3JvdW5kIHdoZW4gY29sb3JzIGFyZSBlbmFibGVkLiAqL1xuY29uc3QgZ2V0TGV2ZWxJY29uID0gKGxldmVsOiBMb2dMZXZlbCwgdXNlQ29sb3JzOiBib29sZWFuKTogc3RyaW5nID0+IHtcbiAgaWYgKCF1c2VDb2xvcnMpIHtcbiAgICByZXR1cm4gJ/CfpoonXG4gIH1cbiAgaWYgKGxldmVsID09PSAnRVJST1InKSB7XG4gICAgcmV0dXJuIGNoYWxrLmJnUmVkLmJsYWNrKCcg8J+miiAnKVxuICB9XG4gIGlmIChsZXZlbCA9PT0gJ1dBUk5JTkcnKSB7XG4gICAgcmV0dXJuIGNoYWxrLmJnWWVsbG93LmJsYWNrKCcg8J+miiAnKVxuICB9XG4gIGlmIChsZXZlbCA9PT0gJ0RFQlVHJykge1xuICAgIHJldHVybiBjaGFsay5iZ0JsdWUuYmxhY2soJyDwn6aKICcpXG4gIH1cbiAgcmV0dXJuIGNoYWxrLmJnR3JlZW4uYmxhY2soJyDwn6aKICcpXG59XG5cbmNvbnN0IGdldENvbG9yZWRMZXZlbCA9IChsZXZlbDogTG9nTGV2ZWwsIHVzZUNvbG9yczogYm9vbGVhbik6IHN0cmluZyA9PiB7XG4gIGlmICghdXNlQ29sb3JzKSB7XG4gICAgcmV0dXJuIGxldmVsXG4gIH1cblxuICBpZiAobGV2ZWwgPT09ICdFUlJPUicpIHtcbiAgICByZXR1cm4gY2hhbGsuYmdSZWQuYmxhY2sobGV2ZWwpXG4gIH1cbiAgaWYgKGxldmVsID09PSAnV0FSTklORycpIHtcbiAgICByZXR1cm4gY2hhbGsuYmdZZWxsb3cuYmxhY2sobGV2ZWwpXG4gIH1cbiAgaWYgKGxldmVsID09PSAnREVCVUcnKSB7XG4gICAgcmV0dXJuIGNoYWxrLmJnQmx1ZS5ibGFjayhsZXZlbClcbiAgfVxuXG4gIHJldHVybiBjaGFsay5iZ0dyZWVuLmJsYWNrKGxldmVsKVxufVxuXG5jb25zdCBnZXRDb2xvcmVkTWV0aG9kID0gKG1ldGhvZDogc3RyaW5nLCB1c2VDb2xvcnM6IGJvb2xlYW4pOiBzdHJpbmcgPT4ge1xuICBpZiAoIXVzZUNvbG9ycykge1xuICAgIHJldHVybiBtZXRob2RcbiAgfVxuXG4gIGNvbnN0IHVwcGVyID0gbWV0aG9kLnRvVXBwZXJDYXNlKClcbiAgaWYgKHVwcGVyID09PSAnR0VUJykge1xuICAgIHJldHVybiBjaGFsay5ncmVlbi5ib2xkKHVwcGVyKVxuICB9XG4gIGlmICh1cHBlciA9PT0gJ1BPU1QnKSB7XG4gICAgcmV0dXJuIGNoYWxrLmJsdWUuYm9sZCh1cHBlcilcbiAgfVxuICBpZiAodXBwZXIgPT09ICdQVVQnKSB7XG4gICAgcmV0dXJuIGNoYWxrLnllbGxvdy5ib2xkKHVwcGVyKVxuICB9XG4gIGlmICh1cHBlciA9PT0gJ1BBVENIJykge1xuICAgIHJldHVybiBjaGFsay55ZWxsb3dCcmlnaHQuYm9sZCh1cHBlcilcbiAgfVxuICBpZiAodXBwZXIgPT09ICdERUxFVEUnKSB7XG4gICAgcmV0dXJuIGNoYWxrLnJlZC5ib2xkKHVwcGVyKVxuICB9XG4gIGlmICh1cHBlciA9PT0gJ09QVElPTlMnKSB7XG4gICAgcmV0dXJuIGNoYWxrLmN5YW4uYm9sZCh1cHBlcilcbiAgfVxuICBpZiAodXBwZXIgPT09ICdIRUFEJykge1xuICAgIHJldHVybiBjaGFsay5ncmVlbkJyaWdodC5ib2xkKHVwcGVyKVxuICB9XG4gIGlmICh1cHBlciA9PT0gJ1RSQUNFJykge1xuICAgIHJldHVybiBjaGFsay5tYWdlbnRhLmJvbGQodXBwZXIpXG4gIH1cbiAgaWYgKHVwcGVyID09PSAnQ09OTkVDVCcpIHtcbiAgICByZXR1cm4gY2hhbGsuY3lhbkJyaWdodC5ib2xkKHVwcGVyKVxuICB9XG5cbiAgcmV0dXJuIGNoYWxrLndoaXRlLmJvbGQodXBwZXIpXG59XG5cbi8qKlxuICogQ29sb3JzIHRoZSBtZXRob2QsIHRoZW4gcGFkcyBhZnRlcndhcmQsIHNvIHRoZSBwYWRkaW5nIG5ldmVyIHNpdHMgaW5zaWRlIHRoZVxuICogQU5TSS13cmFwcGVkIHRleHQgKHBhZGRpbmcgdGhlIGFscmVhZHktY29sb3JlZC9wYWRkZWQgc3RyaW5nIGZpcnN0IHdvdWxkIG1ha2VcbiAqIGBnZXRDb2xvcmVkTWV0aG9kYCdzIGNvbXBhcmlzb25zIGFnYWluc3QgbGl0ZXJhbHMgbGlrZSBgJ0dFVCdgIGFsd2F5cyBtaXNzKS5cbiAqL1xuY29uc3QgZ2V0Q29sb3JlZE1ldGhvZFRva2VuID0gKG1ldGhvZDogc3RyaW5nLCB1c2VDb2xvcnM6IGJvb2xlYW4pOiBzdHJpbmcgPT4ge1xuICBjb25zdCB1cHBlciA9IG1ldGhvZC50b1VwcGVyQ2FzZSgpXG4gIGNvbnN0IHBhZGRpbmcgPSAnICcucmVwZWF0KE1hdGgubWF4KDAsIE1FVEhPRF9QQUQgLSB1cHBlci5sZW5ndGgpKVxuICByZXR1cm4gZ2V0Q29sb3JlZE1ldGhvZCh1cHBlciwgdXNlQ29sb3JzKSArIHBhZGRpbmdcbn1cblxuY29uc3QgZ2V0Q29sb3JlZFN0YXR1cyA9IChzdGF0dXNDb2RlOiBudW1iZXIsIHVzZUNvbG9yczogYm9vbGVhbik6IHN0cmluZyA9PiB7XG4gIGNvbnN0IHN0YXR1cyA9IFN0cmluZyhzdGF0dXNDb2RlKVxuICBpZiAoISh1c2VDb2xvcnMgJiYgTnVtYmVyLmlzRmluaXRlKHN0YXR1c0NvZGUpKSkge1xuICAgIHJldHVybiBzdGF0dXNcbiAgfVxuXG4gIGlmIChzdGF0dXNDb2RlID49IDUwMCkge1xuICAgIHJldHVybiBjaGFsay5yZWQoc3RhdHVzKVxuICB9XG4gIGlmIChzdGF0dXNDb2RlID49IDQwMCkge1xuICAgIHJldHVybiBjaGFsay55ZWxsb3coc3RhdHVzKVxuICB9XG4gIGlmIChzdGF0dXNDb2RlID49IDMwMCkge1xuICAgIHJldHVybiBjaGFsay5jeWFuKHN0YXR1cylcbiAgfVxuICBpZiAoc3RhdHVzQ29kZSA+PSAyMDApIHtcbiAgICByZXR1cm4gY2hhbGsuZ3JlZW4oc3RhdHVzKVxuICB9XG4gIHJldHVybiBjaGFsay5ncmF5KHN0YXR1cylcbn1cblxuY29uc3QgZ2V0Q29sb3JlZFRpbWVzdGFtcCA9ICh0aW1lc3RhbXA6IHN0cmluZywgdXNlQ29sb3JzOiBib29sZWFuKTogc3RyaW5nID0+IHtcbiAgaWYgKCF1c2VDb2xvcnMpIHtcbiAgICByZXR1cm4gdGltZXN0YW1wXG4gIH1cblxuICByZXR1cm4gY2hhbGsuZ3JheSh0aW1lc3RhbXApXG59XG5cbmNvbnN0IGdldENvbG9yZWRQYXRobmFtZSA9IChwYXRobmFtZTogc3RyaW5nLCB1c2VDb2xvcnM6IGJvb2xlYW4pOiBzdHJpbmcgPT4ge1xuICBpZiAoIXVzZUNvbG9ycykge1xuICAgIHJldHVybiBwYXRobmFtZVxuICB9XG5cbiAgcmV0dXJuIGNoYWxrLndoaXRlQnJpZ2h0KHBhdGhuYW1lKVxufVxuXG5jb25zdCBnZXRTdGF0dXNUZXh0ID0gKHN0YXR1c0NvZGU6IG51bWJlcik6IHN0cmluZyA9PiB7XG4gIGNvbnN0IHRleHQgPSBTVEFUVVNfQ09ERVNbc3RhdHVzQ29kZV1cbiAgcmV0dXJuIHRleHQgPz8gJydcbn1cblxuY29uc3QgZ2V0U2VydmljZVRva2VuID0gKG9wdGlvbnM6IE9wdGlvbnMsIHVzZUNvbG9yczogYm9vbGVhbik6IHN0cmluZyA9PiB7XG4gIGNvbnN0IG5hbWUgPSBvcHRpb25zLmNvbmZpZz8uc2VydmljZT8udHJpbSgpXG4gIGlmICghbmFtZSkge1xuICAgIHJldHVybiAnJ1xuICB9XG4gIGNvbnN0IGJyYWNrZXRlZCA9IGBbJHtuYW1lfV1gXG4gIGlmICghdXNlQ29sb3JzKSB7XG4gICAgcmV0dXJuIGAke2JyYWNrZXRlZH0gYFxuICB9XG4gIHJldHVybiBgJHtjaGFsay5kaW0oYnJhY2tldGVkKX0gYFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1hdENvbnRleHQge1xuICBmb3JtYXQ6IHN0cmluZ1xuICBzZXJ2aWNlVG9rZW46IHN0cmluZ1xuICBzbG93VGhyZXNob2xkOiBudW1iZXJcbiAgLyoqIEZvcm1hdCB0b2tlbnMgYWN0dWFsbHkgcHJlc2VudCBpbiBgZm9ybWF0YCAoc2VlIHtAbGluayBMT0dfRk9STUFUX1JFR0VYfSkuICovXG4gIHRva2VuczogU2V0PHN0cmluZz5cbiAgdXNlQ29sb3JzOiBib29sZWFuXG4gIHZlcnlTbG93VGhyZXNob2xkOiBudW1iZXJcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyBjb2xvcnMvZm9ybWF0L3RocmVzaG9sZHMvc2VydmljZSBvbmNlIHBlciBsb2dnZXIgaW5zdGFuY2UgaW5zdGVhZCBvZiBwZXIgbG9nIGxpbmUuXG4gKiBTYWZlIHRvIGhvaXN0OiBUVFktbmVzcyBhbmQgY29uZmlnIGRvbid0IGNoYW5nZSBhY3Jvc3MgYSBwcm9jZXNzJ3MgbGlmZXRpbWUsIHNvIGZyZWV6aW5nIHRoZVxuICogY29sb3JzIGRlY2lzaW9uIGF0IGNvbnN0cnVjdGlvbiB0aW1lIG1hdGNoZXMgcmVhbCBwcm9jZXNzIGxpZmVjeWNsZXMuXG4gKlxuICogTk9URTogYWRkaW5nIGEgbmV3IGZvcm1hdCB0b2tlbiByZXF1aXJlcyBhZGRpbmcgaXQgYm90aCB0byB7QGxpbmsgTE9HX0ZPUk1BVF9SRUdFWH0gYW5kIHRvIHRoZVxuICogdG9rZW4tZ2F0aW5nIGNoZWNrcyBpbiB7QGxpbmsgZm9ybWF0TG9nT3V0cHV0fSBiZWxvdy5cbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZUZvcm1hdENvbnRleHQgPSAob3B0aW9uczogT3B0aW9ucyk6IEZvcm1hdENvbnRleHQgPT4ge1xuICBjb25zdCB7IGNvbmZpZyB9ID0gb3B0aW9uc1xuICBjb25zdCB1c2VDb2xvcnMgPSBzaG91bGRVc2VDb2xvcnMob3B0aW9ucylcbiAgY29uc3QgZm9ybWF0ID0gY29uZmlnPy5jdXN0b21Mb2dGb3JtYXQgPz8gREVGQVVMVF9MT0dfRk9STUFUXG4gIGNvbnN0IHRva2VucyA9IG5ldyBTZXQoZm9ybWF0Lm1hdGNoKExPR19GT1JNQVRfUkVHRVgpKVxuICBjb25zdCB7IHNsb3c6IHNsb3dUaHJlc2hvbGQsIHZlcnlTbG93OiB2ZXJ5U2xvd1RocmVzaG9sZCB9ID1cbiAgICBnZXRTbG93VGhyZXNob2xkcyhvcHRpb25zKVxuICBjb25zdCBzZXJ2aWNlVG9rZW4gPSBnZXRTZXJ2aWNlVG9rZW4ob3B0aW9ucywgdXNlQ29sb3JzKVxuXG4gIHJldHVybiB7XG4gICAgZm9ybWF0LFxuICAgIHNlcnZpY2VUb2tlbixcbiAgICBzbG93VGhyZXNob2xkLFxuICAgIHRva2VucyxcbiAgICB1c2VDb2xvcnMsXG4gICAgdmVyeVNsb3dUaHJlc2hvbGRcbiAgfVxufVxuXG5jb25zdCBzdHJpbmdpZnlUcmVlVmFsdWUgPSAodmFsdWU6IHVua25vd24pOiBzdHJpbmcgPT4ge1xuICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gJ251bGwnXG4gIH1cbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gJ3VuZGVmaW5lZCdcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBzYW5pdGl6ZUxvZ1RleHQodmFsdWUpXG4gIH1cbiAgaWYgKFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHxcbiAgICB0eXBlb2YgdmFsdWUgPT09ICdiaWdpbnQnIHx8XG4gICAgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbidcbiAgKSB7XG4gICAgcmV0dXJuIFN0cmluZyh2YWx1ZSlcbiAgfVxuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIHJldHVybiBzYW5pdGl6ZUxvZ1RleHQodmFsdWUubWVzc2FnZSlcbiAgfVxuICByZXR1cm4gc2FuaXRpemVMb2dUZXh0KHZhbHVlKVxufVxuXG4vKiogTmVzdGVkIG9iamVjdHMgdG8gZXhwYW5kIGluIHRoZSBjb250ZXh0IHRyZWUgKGV4Y2x1ZGVzIEFycmF5cywgRXJyb3IsIERhdGUpLiAqL1xuY29uc3QgaXNFeHBhbmRhYmxlT2JqZWN0ID0gKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT5cbiAgdmFsdWUgIT09IG51bGwgJiZcbiAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiZcbiAgISh2YWx1ZSBpbnN0YW5jZW9mIEVycm9yKSAmJlxuICAhKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSlcblxuY29uc3QgY29sbGVjdENvbnRleHRFbnRyaWVzID0gKFxuICBvYmo6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBwcmVmaXg6IHN0cmluZyxcbiAgZGVwdGhSZW1haW5pbmc6IG51bWJlclxuKTogW3N0cmluZywgc3RyaW5nXVtdID0+IHtcbiAgY29uc3Qgb3V0OiBbc3RyaW5nLCBzdHJpbmddW10gPSBbXVxuICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhvYmopKSB7XG4gICAgY29uc3Qgc2FmZUtleSA9IHNhbml0aXplTG9nVGV4dChrLCBNQVhfS0VZX0xFTkdUSClcbiAgICBjb25zdCBrZXkgPSBwcmVmaXggPyBgJHtwcmVmaXh9LiR7c2FmZUtleX1gIDogc2FmZUtleVxuICAgIGNvbnN0IGV4cGFuZGFibGUgPSBpc0V4cGFuZGFibGVPYmplY3QodikgJiYgZGVwdGhSZW1haW5pbmcgPiAxXG5cbiAgICBpZiAoZXhwYW5kYWJsZSkge1xuICAgICAgb3V0LnB1c2goLi4uY29sbGVjdENvbnRleHRFbnRyaWVzKHYsIGtleSwgZGVwdGhSZW1haW5pbmcgLSAxKSlcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0LnB1c2goW2tleSwgc3RyaW5naWZ5VHJlZVZhbHVlKHYpXSlcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG91dFxufVxuXG5jb25zdCBmb3JtYXRFbnRyaWVzVG9UcmVlTGluZXMgPSAoXG4gIGVudHJpZXM6IFtzdHJpbmcsIHN0cmluZ11bXSxcbiAgdXNlQ29sb3JzOiBib29sZWFuXG4pOiBzdHJpbmdbXSA9PiB7XG4gIGlmIChlbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBbXVxuICB9XG5cbiAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW11cbiAgY29uc3QgbGFzdCA9IGVudHJpZXMubGVuZ3RoIC0gMVxuICBmb3IgKGxldCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBjb25zdCBicmFuY2ggPSBpID09PSBsYXN0ID8gJ+KUlOKUgCcgOiAn4pSc4pSAJ1xuICAgIGNvbnN0IHBhaXIgPSBlbnRyaWVzW2ldXG4gICAgaWYgKCFwYWlyKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBjb25zdCBbaywgdl0gPSBwYWlyXG4gICAgY29uc3Qga2V5UGFydCA9IHVzZUNvbG9ycyA/IGNoYWxrLmN5YW4oaykgOiBrXG4gICAgY29uc3QgdmFsUGFydCA9IHVzZUNvbG9ycyA/IGNoYWxrLndoaXRlKHYpIDogdlxuICAgIGxpbmVzLnB1c2goYCAgJHticmFuY2h9ICR7a2V5UGFydH0gICR7dmFsUGFydH1gKVxuICB9XG4gIHJldHVybiBsaW5lc1xufVxuXG5jb25zdCBjb2xsZWN0U3RydWN0dXJlZEVycm9yRW50cmllcyA9IChlcnJvcjogdW5rbm93bik6IFtzdHJpbmcsIHN0cmluZ11bXSA9PiB7XG4gIGNvbnN0IGVudHJpZXM6IFtzdHJpbmcsIHN0cmluZ11bXSA9IFtdXG4gIGNvbnN0IG1zZyA9IHBhcnNlRXJyb3IoZXJyb3IpXG4gIGlmIChtc2cpIHtcbiAgICBlbnRyaWVzLnB1c2goWydlcnJvcicsIHNhbml0aXplTG9nVGV4dChtc2cpXSlcbiAgfVxuICBpZiAoaXNTdHJ1Y3R1cmVkRXJyb3IoZXJyb3IpKSB7XG4gICAgaWYgKGVycm9yLmNvZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZW50cmllcy5wdXNoKFsnZXJyb3IuY29kZScsIHNhbml0aXplTG9nVGV4dChlcnJvci5jb2RlKV0pXG4gICAgfVxuICAgIGlmIChlcnJvci53aHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZW50cmllcy5wdXNoKFsnZXJyb3Iud2h5Jywgc2FuaXRpemVMb2dUZXh0KGVycm9yLndoeSldKVxuICAgIH1cbiAgICBpZiAoZXJyb3IuZml4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGVudHJpZXMucHVzaChbJ2Vycm9yLmZpeCcsIHNhbml0aXplTG9nVGV4dChlcnJvci5maXgpXSlcbiAgICB9XG4gICAgaWYgKGVycm9yLmxpbmsgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZW50cmllcy5wdXNoKFsnZXJyb3IubGluaycsIHNhbml0aXplTG9nVGV4dChlcnJvci5saW5rKV0pXG4gICAgfVxuICAgIGlmIChlcnJvci5pbnRlcm5hbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBlbnRyaWVzLnB1c2goWydlcnJvci5pbnRlcm5hbCcsIHN0cmluZ2lmeVRyZWVWYWx1ZShlcnJvci5pbnRlcm5hbCldKVxuICAgIH1cbiAgfVxuICByZXR1cm4gZW50cmllc1xufVxuXG5leHBvcnQgY29uc3QgYnVpbGRDb250ZXh0VHJlZUxpbmVzID0gKFxuICBsZXZlbDogTG9nTGV2ZWwsXG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBvcHRpb25zOiBPcHRpb25zLFxuICB1c2VDb2xvcnM6IGJvb2xlYW4gPSBzaG91bGRVc2VDb2xvcnMob3B0aW9ucylcbik6IHN0cmluZ1tdID0+IHtcbiAgaWYgKG9wdGlvbnMuY29uZmlnPy5zaG93Q29udGV4dFRyZWUgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIFtdXG4gIH1cblxuICBjb25zdCBkZXB0aCA9IG9wdGlvbnMuY29uZmlnPy5jb250ZXh0RGVwdGggPz8gMVxuXG4gIGNvbnN0IGVudHJpZXM6IFtzdHJpbmcsIHN0cmluZ11bXSA9IFtdXG5cbiAgY29uc3QgY3R4ID0gZGF0YS5jb250ZXh0XG4gIGlmIChcbiAgICBjdHggJiZcbiAgICB0eXBlb2YgY3R4ID09PSAnb2JqZWN0JyAmJlxuICAgICFBcnJheS5pc0FycmF5KGN0eCkgJiZcbiAgICBPYmplY3Qua2V5cyhjdHggYXMgb2JqZWN0KS5sZW5ndGggPiAwICYmXG4gICAgZGVwdGggPj0gMVxuICApIHtcbiAgICBlbnRyaWVzLnB1c2goXG4gICAgICAuLi5jb2xsZWN0Q29udGV4dEVudHJpZXMoY3R4IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCAnJywgZGVwdGgpXG4gICAgKVxuICB9XG5cbiAgLy8gV0FSTklORyBhcyB3ZWxsIGFzIEVSUk9SOiBhIDR4eCBpcyBsb2dnZWQgYXQgV0FSTklORywgYW5kIGl0c1xuICAvLyBgd2h5YC9gZml4YC9gbGlua2AgYXJlIGV4YWN0bHkgYXMgd29ydGggc2hvd2luZyBhcyBhIDV4eCdzLlxuICBpZiAoKGxldmVsID09PSAnRVJST1InIHx8IGxldmVsID09PSAnV0FSTklORycpICYmIGRhdGEuZXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgIGVudHJpZXMucHVzaCguLi5jb2xsZWN0U3RydWN0dXJlZEVycm9yRW50cmllcyhkYXRhLmVycm9yKSlcbiAgfVxuXG4gIHJldHVybiBmb3JtYXRFbnRyaWVzVG9UcmVlTGluZXMoZW50cmllcywgdXNlQ29sb3JzKVxufVxuXG5jb25zdCBnZXRDb250ZXh0U3RyaW5nID0gKHZhbHVlOiB1bmtub3duKTogc3RyaW5nID0+IHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAvLyBObyBsZW5ndGggY2FwLCBhcyBiZWZvcmUuIFRoaXMgc3RpbGwgc3RyaXBzIHRoZSBERUwgYW5kIEMxIGNoYXJhY3RlcnNcbiAgICAvLyB0aGF0IGBKU09OLnN0cmluZ2lmeWAgbGVhdmVzIGluIHBsYWNlLlxuICAgIHJldHVybiBzYW5pdGl6ZUxvZ1RleHQodmFsdWUsIE51bWJlci5QT1NJVElWRV9JTkZJTklUWSlcbiAgfVxuXG4gIHJldHVybiAnJ1xufVxuXG4vKiogUmF3IGR1cmF0aW9uL1VSTCBwYXJ0cyBjb21wdXRlZCBvbmNlIHBlciBsb2cgZW1pc3Npb24gYnkgdGhlIGNhbGxlciAoc2VlIGBsb2dnZXIvaW5kZXgudHNgKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJlY29tcHV0ZWRMb2dQYXJ0cyB7XG4gIGR1cmF0aW9uTXM6IG51bWJlclxuICBwYXRobmFtZTogc3RyaW5nXG4gIHNlYXJjaDogc3RyaW5nXG59XG5cbi8qKiBge25vd31gL2B7ZXBvY2h9YCBzaGFyZSBhIHNpbmdsZSBgRGF0ZWAgc2FtcGxlOyBlYWNoIGlzIG9ubHkgZm9ybWF0dGVkIHdoZW4gcmVxdWVzdGVkLiAqL1xuY29uc3QgZ2V0VGltZXN0YW1wVG9rZW5zID0gKFxuICB0b2tlbnM6IFNldDxzdHJpbmc+LFxuICB0cmFuc2xhdGVUaW1lOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHVzZUNvbG9yczogYm9vbGVhblxuKTogeyB0aW1lc3RhbXA6IHN0cmluZzsgZXBvY2g6IHN0cmluZyB9ID0+IHtcbiAgaWYgKCEodG9rZW5zLmhhcygne25vd30nKSB8fCB0b2tlbnMuaGFzKCd7ZXBvY2h9JykpKSB7XG4gICAgcmV0dXJuIHsgZXBvY2g6ICcnLCB0aW1lc3RhbXA6ICcnIH1cbiAgfVxuICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpXG4gIGNvbnN0IGVwb2NoID0gdG9rZW5zLmhhcygne2Vwb2NofScpID8gU3RyaW5nKG5vdy5nZXRUaW1lKCkpIDogJydcbiAgaWYgKCF0b2tlbnMuaGFzKCd7bm93fScpKSB7XG4gICAgcmV0dXJuIHsgZXBvY2gsIHRpbWVzdGFtcDogJycgfVxuICB9XG4gIGNvbnN0IHJhd1RpbWVzdGFtcCA9IGZvcm1hdFRpbWVzdGFtcChub3csIHRyYW5zbGF0ZVRpbWUpXG4gIHJldHVybiB7IGVwb2NoLCB0aW1lc3RhbXA6IGdldENvbG9yZWRUaW1lc3RhbXAocmF3VGltZXN0YW1wLCB1c2VDb2xvcnMpIH1cbn1cblxuY29uc3QgZ2V0TWVzc2FnZVRva2VuID0gKFxuICB0b2tlbnM6IFNldDxzdHJpbmc+LFxuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuKTogc3RyaW5nID0+IHtcbiAgaWYgKCF0b2tlbnMuaGFzKCd7bWVzc2FnZX0nKSkge1xuICAgIHJldHVybiAnJ1xuICB9XG4gIHJldHVybiB0eXBlb2YgZGF0YS5tZXNzYWdlID09PSAnc3RyaW5nJyA/IHNhbml0aXplTG9nVGV4dChkYXRhLm1lc3NhZ2UpIDogJydcbn1cblxuLyoqIGB7cGF0aG5hbWV9YC9ge3BhdGh9YC9ge3F1ZXJ5fWAgc2hhcmUgYSBzaW5nbGUgVVJMIHBhcnNlIChvciB0aGUgcHJlY29tcHV0ZWQgb25lKS4gKi9cbmNvbnN0IGdldFBhdGhuYW1lVG9rZW5zID0gKFxuICB0b2tlbnM6IFNldDxzdHJpbmc+LFxuICByZXF1ZXN0OiBSZXF1ZXN0SW5mbyxcbiAgY29uZmlnOiBPcHRpb25zWydjb25maWcnXSxcbiAgdXNlQ29sb3JzOiBib29sZWFuLFxuICBwcmVjb21wdXRlZD86IFByZWNvbXB1dGVkTG9nUGFydHNcbik6IHsgY29sb3JlZFBhdGhuYW1lOiBzdHJpbmc7IHF1ZXJ5OiBzdHJpbmcgfSA9PiB7XG4gIGNvbnN0IG5lZWRzUGF0aG5hbWUgPSB0b2tlbnMuaGFzKCd7cGF0aG5hbWV9JykgfHwgdG9rZW5zLmhhcygne3BhdGh9JylcbiAgY29uc3QgbmVlZHNRdWVyeSA9IHRva2Vucy5oYXMoJ3txdWVyeX0nKVxuICBpZiAoIShuZWVkc1BhdGhuYW1lIHx8IG5lZWRzUXVlcnkpKSB7XG4gICAgcmV0dXJuIHsgY29sb3JlZFBhdGhuYW1lOiAnJywgcXVlcnk6ICcnIH1cbiAgfVxuXG4gIGxldCByYXdQYXRobmFtZTogc3RyaW5nXG4gIGxldCBzZWFyY2g6IHN0cmluZ1xuICBpZiAocHJlY29tcHV0ZWQpIHtcbiAgICA7KHsgcGF0aG5hbWU6IHJhd1BhdGhuYW1lLCBzZWFyY2ggfSA9IHByZWNvbXB1dGVkKVxuICB9IGVsc2Uge1xuICAgIHRyeSB7XG4gICAgICA7KHsgcGF0aG5hbWU6IHJhd1BhdGhuYW1lLCBzZWFyY2ggfSA9IG5ldyBVUkwocmVxdWVzdC51cmwpKVxuICAgIH0gY2F0Y2gge1xuICAgICAgcmF3UGF0aG5hbWUgPSBzYW5pdGl6ZUxvZ1RleHQocmVxdWVzdC51cmwgfHwgJy8nLCAxMDI0KVxuICAgICAgc2VhcmNoID0gJydcbiAgICB9XG4gIH1cblxuICBjb25zdCBxdWVyeSA9IG5lZWRzUXVlcnkgPyBzZWFyY2ggOiAnJ1xuICBpZiAoIW5lZWRzUGF0aG5hbWUpIHtcbiAgICByZXR1cm4geyBjb2xvcmVkUGF0aG5hbWU6ICcnLCBxdWVyeSB9XG4gIH1cbiAgY29uc3QgcGF0aG5hbWUgPSBjb25maWc/LmxvZ1F1ZXJ5UGFyYW1zXG4gICAgPyBgJHtyYXdQYXRobmFtZX0ke3NlYXJjaH1gXG4gICAgOiByYXdQYXRobmFtZVxuICByZXR1cm4geyBjb2xvcmVkUGF0aG5hbWU6IGdldENvbG9yZWRQYXRobmFtZShwYXRobmFtZSwgdXNlQ29sb3JzKSwgcXVlcnkgfVxufVxuXG4vKiogYHtzdGF0dXN9YC9ge3N0YXR1c1RleHR9YCBzaGFyZSBhIHNpbmdsZSBzdGF0dXMtY29kZSByZXNvbHV0aW9uLiAqL1xuY29uc3QgZ2V0U3RhdHVzVG9rZW5zID0gKFxuICB0b2tlbnM6IFNldDxzdHJpbmc+LFxuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgdXNlQ29sb3JzOiBib29sZWFuXG4pOiB7IGNvbG9yZWRTdGF0dXM6IHN0cmluZzsgc3RhdHVzVGV4dDogc3RyaW5nIH0gPT4ge1xuICBjb25zdCBuZWVkc1N0YXR1cyA9IHRva2Vucy5oYXMoJ3tzdGF0dXN9JylcbiAgY29uc3QgbmVlZHNTdGF0dXNUZXh0ID0gdG9rZW5zLmhhcygne3N0YXR1c1RleHR9JylcbiAgaWYgKCEobmVlZHNTdGF0dXMgfHwgbmVlZHNTdGF0dXNUZXh0KSkge1xuICAgIHJldHVybiB7IGNvbG9yZWRTdGF0dXM6ICcnLCBzdGF0dXNUZXh0OiAnJyB9XG4gIH1cbiAgY29uc3Qgc3RhdHVzVmFsdWUgPSBkYXRhLnN0YXR1c1xuICBjb25zdCBzdGF0dXNDb2RlID1cbiAgICBzdGF0dXNWYWx1ZSA9PT0gbnVsbCB8fCBzdGF0dXNWYWx1ZSA9PT0gdW5kZWZpbmVkXG4gICAgICA/IDIwMFxuICAgICAgOiBnZXRTdGF0dXNDb2RlKHN0YXR1c1ZhbHVlKVxuICByZXR1cm4ge1xuICAgIGNvbG9yZWRTdGF0dXM6IG5lZWRzU3RhdHVzID8gZ2V0Q29sb3JlZFN0YXR1cyhzdGF0dXNDb2RlLCB1c2VDb2xvcnMpIDogJycsXG4gICAgc3RhdHVzVGV4dDogbmVlZHNTdGF0dXNUZXh0ID8gZ2V0U3RhdHVzVGV4dChzdGF0dXNDb2RlKSA6ICcnXG4gIH1cbn1cblxuY29uc3QgZ2V0SXBUb2tlbiA9IChcbiAgdG9rZW5zOiBTZXQ8c3RyaW5nPixcbiAgcmVxdWVzdDogUmVxdWVzdEluZm8sXG4gIGNvbmZpZzogT3B0aW9uc1snY29uZmlnJ11cbik6IHN0cmluZyA9PiAoY29uZmlnPy5pcCA9PT0gdHJ1ZSAmJiB0b2tlbnMuaGFzKCd7aXB9JykgPyBnZXRJcChyZXF1ZXN0KSA6ICcnKVxuXG5jb25zdCBoYXNOb25FbXB0eUNvbnRleHQgPSAoXG4gIGNvbnRleHQ6IHVua25vd25cbik6IGNvbnRleHQgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT5cbiAgY29udGV4dCAhPT0gbnVsbCAmJlxuICBjb250ZXh0ICE9PSB1bmRlZmluZWQgJiZcbiAgdHlwZW9mIGNvbnRleHQgPT09ICdvYmplY3QnICYmXG4gICFBcnJheS5pc0FycmF5KGNvbnRleHQpICYmXG4gIE9iamVjdC5rZXlzKGNvbnRleHQgYXMgb2JqZWN0KS5sZW5ndGggPiAwXG5cbmNvbnN0IGdldENvbnRleHRUb2tlbiA9IChcbiAgdG9rZW5zOiBTZXQ8c3RyaW5nPixcbiAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIGNvbmZpZzogT3B0aW9uc1snY29uZmlnJ11cbik6IHN0cmluZyA9PiB7XG4gIGlmICghdG9rZW5zLmhhcygne2NvbnRleHR9JykpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuICBjb25zdCBzaG93VHJlZSA9IGNvbmZpZz8uc2hvd0NvbnRleHRUcmVlICE9PSBmYWxzZVxuICBpZiAoc2hvd1RyZWUgJiYgaGFzTm9uRW1wdHlDb250ZXh0KGRhdGEuY29udGV4dCkpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuICByZXR1cm4gZ2V0Q29udGV4dFN0cmluZyhkYXRhLmNvbnRleHQpXG59XG5cbi8qKiBge2R1cmF0aW9ufWAvYHtzcGVlZH1gIHNoYXJlIGEgc2luZ2xlIGR1cmF0aW9uIHNhbXBsZSBhbmQgc2xvdy10aHJlc2hvbGQgY2hlY2suICovXG5jb25zdCBnZXREdXJhdGlvblRva2VucyA9IChcbiAgdG9rZW5zOiBTZXQ8c3RyaW5nPixcbiAgc3RvcmU6IFN0b3JlRGF0YSxcbiAgdXNlQ29sb3JzOiBib29sZWFuLFxuICBzbG93VGhyZXNob2xkOiBudW1iZXIsXG4gIHZlcnlTbG93VGhyZXNob2xkOiBudW1iZXIsXG4gIHByZWNvbXB1dGVkPzogUHJlY29tcHV0ZWRMb2dQYXJ0c1xuKTogeyBjb2xvcmVkRHVyYXRpb246IHN0cmluZzsgc3BlZWRUb2tlbjogc3RyaW5nIH0gPT4ge1xuICBjb25zdCBuZWVkc0R1cmF0aW9uID0gdG9rZW5zLmhhcygne2R1cmF0aW9ufScpXG4gIGNvbnN0IG5lZWRzU3BlZWQgPSB0b2tlbnMuaGFzKCd7c3BlZWR9JylcbiAgaWYgKCEobmVlZHNEdXJhdGlvbiB8fCBuZWVkc1NwZWVkKSkge1xuICAgIHJldHVybiB7IGNvbG9yZWREdXJhdGlvbjogJycsIHNwZWVkVG9rZW46ICcnIH1cbiAgfVxuICBjb25zdCBkdXJhdGlvbk1zID0gcHJlY29tcHV0ZWQ/LmR1cmF0aW9uTXMgPz8gZWxhcHNlZE1zKHN0b3JlLmJlZm9yZVRpbWUpXG4gIGNvbnN0IHsgdGV4dCwgaXNWZXJ5U2xvdyB9ID0gY29sb3JEdXJhdGlvblRleHQoXG4gICAgZHVyYXRpb25NcyxcbiAgICB1c2VDb2xvcnMsXG4gICAgc2xvd1RocmVzaG9sZCxcbiAgICB2ZXJ5U2xvd1RocmVzaG9sZFxuICApXG4gIHJldHVybiB7XG4gICAgY29sb3JlZER1cmF0aW9uOiBuZWVkc0R1cmF0aW9uID8gdGV4dCA6ICcnLFxuICAgIHNwZWVkVG9rZW46IG5lZWRzU3BlZWQgPyBnZXRTcGVlZFRva2VuKGlzVmVyeVNsb3csIHVzZUNvbG9ycykgOiAnJ1xuICB9XG59XG5cbmNvbnN0IGdldFJlcXVlc3RJZFRva2VuID0gKFxuICB0b2tlbnM6IFNldDxzdHJpbmc+LFxuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuKTogc3RyaW5nID0+IHtcbiAgaWYgKCF0b2tlbnMuaGFzKCd7cmVxdWVzdElkfScpKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cbiAgY29uc3QgY3R4ID0gZGF0YS5jb250ZXh0XG4gIGlmICh0eXBlb2YgY3R4ICE9PSAnb2JqZWN0JyB8fCBjdHggPT09IG51bGwgfHwgISgncmVxdWVzdElkJyBpbiBjdHgpKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cbiAgcmV0dXJuIHNhbml0aXplTG9nVGV4dChcbiAgICBTdHJpbmcoKGN0eCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikucmVxdWVzdElkKSxcbiAgICAxMjhcbiAgKVxufVxuXG5leHBvcnQgY29uc3QgZm9ybWF0TG9nT3V0cHV0ID0gKHtcbiAgbGV2ZWwsXG4gIHJlcXVlc3QsXG4gIGRhdGEsXG4gIHN0b3JlLFxuICBvcHRpb25zLFxuICBmb3JtYXRDb250ZXh0LFxuICBwcmVjb21wdXRlZFxufToge1xuICBsZXZlbDogTG9nTGV2ZWxcbiAgcmVxdWVzdDogUmVxdWVzdEluZm9cbiAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgc3RvcmU6IFN0b3JlRGF0YVxuICBvcHRpb25zOiBPcHRpb25zXG4gIC8qKiBIb2lzdGVkIHBlci1sb2dnZXIgY29uc3RhbnRzOyBjb21wdXRlZCBvbiB0aGUgZmx5IHdoZW4gYSBkaXJlY3QgY2FsbGVyIG9taXRzIGl0LiAqL1xuICBmb3JtYXRDb250ZXh0PzogRm9ybWF0Q29udGV4dFxuICAvKiogRHVyYXRpb24vVVJMIHBhcnRzIGFscmVhZHkgY29tcHV0ZWQgYnkgdGhlIGNhbGxlcjsgcGFyc2VkIG9uIHRoZSBmbHkgd2hlbiBvbWl0dGVkLiAqL1xuICBwcmVjb21wdXRlZD86IFByZWNvbXB1dGVkTG9nUGFydHNcbn0pOiBGb3JtYXR0ZWRMb2dPdXRwdXQgPT4ge1xuICBjb25zdCB7IGNvbmZpZyB9ID0gb3B0aW9uc1xuICBjb25zdCB7XG4gICAgZm9ybWF0LFxuICAgIHNlcnZpY2VUb2tlbixcbiAgICBzbG93VGhyZXNob2xkLFxuICAgIHRva2VucyxcbiAgICB1c2VDb2xvcnMsXG4gICAgdmVyeVNsb3dUaHJlc2hvbGRcbiAgfSA9IGZvcm1hdENvbnRleHQgPz8gY3JlYXRlRm9ybWF0Q29udGV4dChvcHRpb25zKVxuXG4gIGNvbnN0IHsgdGltZXN0YW1wLCBlcG9jaCB9ID0gZ2V0VGltZXN0YW1wVG9rZW5zKFxuICAgIHRva2VucyxcbiAgICBjb25maWc/LnRpbWVzdGFtcD8udHJhbnNsYXRlVGltZSxcbiAgICB1c2VDb2xvcnNcbiAgKVxuICBjb25zdCBtZXNzYWdlID0gZ2V0TWVzc2FnZVRva2VuKHRva2VucywgZGF0YSlcbiAgY29uc3QgeyBjb2xvcmVkUGF0aG5hbWUsIHF1ZXJ5IH0gPSBnZXRQYXRobmFtZVRva2VucyhcbiAgICB0b2tlbnMsXG4gICAgcmVxdWVzdCxcbiAgICBjb25maWcsXG4gICAgdXNlQ29sb3JzLFxuICAgIHByZWNvbXB1dGVkXG4gIClcbiAgY29uc3QgeyBjb2xvcmVkU3RhdHVzLCBzdGF0dXNUZXh0IH0gPSBnZXRTdGF0dXNUb2tlbnModG9rZW5zLCBkYXRhLCB1c2VDb2xvcnMpXG4gIGNvbnN0IGlwID0gZ2V0SXBUb2tlbih0b2tlbnMsIHJlcXVlc3QsIGNvbmZpZylcbiAgY29uc3QgY3R4U3RyaW5nID0gZ2V0Q29udGV4dFRva2VuKHRva2VucywgZGF0YSwgY29uZmlnKVxuICBjb25zdCBjb2xvcmVkTGV2ZWwgPSB0b2tlbnMuaGFzKCd7bGV2ZWx9JylcbiAgICA/IGdldENvbG9yZWRMZXZlbChsZXZlbCwgdXNlQ29sb3JzKVxuICAgIDogJydcbiAgY29uc3QgY29sb3JlZE1ldGhvZCA9IHRva2Vucy5oYXMoJ3ttZXRob2R9JylcbiAgICA/IGdldENvbG9yZWRNZXRob2RUb2tlbihyZXF1ZXN0Lm1ldGhvZCwgdXNlQ29sb3JzKVxuICAgIDogJydcbiAgY29uc3QgeyBjb2xvcmVkRHVyYXRpb24sIHNwZWVkVG9rZW4gfSA9IGdldER1cmF0aW9uVG9rZW5zKFxuICAgIHRva2VucyxcbiAgICBzdG9yZSxcbiAgICB1c2VDb2xvcnMsXG4gICAgc2xvd1RocmVzaG9sZCxcbiAgICB2ZXJ5U2xvd1RocmVzaG9sZCxcbiAgICBwcmVjb21wdXRlZFxuICApXG4gIGNvbnN0IGljb24gPSB0b2tlbnMuaGFzKCd7aWNvbn0nKSA/IGdldExldmVsSWNvbihsZXZlbCwgdXNlQ29sb3JzKSA6ICcnXG4gIGNvbnN0IHJlcXVlc3RJZCA9IGdldFJlcXVlc3RJZFRva2VuKHRva2VucywgZGF0YSlcblxuICBjb25zdCB0b2tlbk1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAne2NvbnRleHR9JzogY3R4U3RyaW5nLFxuICAgICd7ZHVyYXRpb259JzogY29sb3JlZER1cmF0aW9uLFxuICAgICd7ZXBvY2h9JzogZXBvY2gsXG4gICAgJ3tpY29ufSc6IGljb24sXG4gICAgJ3tpcH0nOiBpcCxcbiAgICAne2xldmVsfSc6IGNvbG9yZWRMZXZlbCxcbiAgICAne21lc3NhZ2V9JzogbWVzc2FnZSxcbiAgICAne21ldGhvZH0nOiBjb2xvcmVkTWV0aG9kLFxuICAgICd7bm93fSc6IHRpbWVzdGFtcCxcbiAgICAne3BhdGhuYW1lfSc6IGNvbG9yZWRQYXRobmFtZSxcbiAgICAne3BhdGh9JzogY29sb3JlZFBhdGhuYW1lLFxuICAgICd7cXVlcnl9JzogcXVlcnksXG4gICAgJ3tyZXF1ZXN0SWR9JzogcmVxdWVzdElkLFxuICAgICd7c2VydmljZX0nOiBzZXJ2aWNlVG9rZW4sXG4gICAgJ3tzcGVlZH0nOiBzcGVlZFRva2VuLFxuICAgICd7c3RhdHVzVGV4dH0nOiBzdGF0dXNUZXh0LFxuICAgICd7c3RhdHVzfSc6IGNvbG9yZWRTdGF0dXNcbiAgfVxuXG4gIGNvbnN0IG1haW4gPSBmb3JtYXQucmVwbGFjZShcbiAgICBMT0dfRk9STUFUX1JFR0VYLFxuICAgIG1hdGNoID0+IHRva2VuTWFwW21hdGNoXSA/PyBtYXRjaFxuICApXG5cbiAgY29uc3QgY29udGV4dExpbmVzID0gYnVpbGRDb250ZXh0VHJlZUxpbmVzKGxldmVsLCBkYXRhLCBvcHRpb25zLCB1c2VDb2xvcnMpXG5cbiAgcmV0dXJuIHsgY29udGV4dExpbmVzLCBtYWluIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgU1RBVFVTX0NPREVTIH0gZnJvbSAnbm9kZTpodHRwJ1xuaW1wb3J0IHsgaXNTdGF0dXNSZXNwb25zZSB9IGZyb20gJy4uL2hlbHBlcnMvc3RhdHVzJ1xuaW1wb3J0IHsgdG9UZXh0IH0gZnJvbSAnLi9zYW5pdGl6ZSdcblxuLy8gRWx5c2lhIGNvcGllcyBhIGBzdGF0dXMoY29kZSwgYm9keSlgIGJvZHkgaW50byBgZXJyb3IubWVzc2FnZWAsIHNvIGEgbWVzc2FnZVxuLy8gaXMgbm90IGFsd2F5cyBhIHN0cmluZy5cbmV4cG9ydCBjb25zdCBwYXJzZUVycm9yID0gKGVycm9yOiB1bmtub3duKTogc3RyaW5nID0+IHtcbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICByZXR1cm4gdG9UZXh0KGVycm9yLm1lc3NhZ2UpXG4gIH1cbiAgaWYgKGVycm9yICYmIHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgJ21lc3NhZ2UnIGluIGVycm9yKSB7XG4gICAgcmV0dXJuIHRvVGV4dChlcnJvci5tZXNzYWdlKVxuICB9XG4gIHJldHVybiBTdHJpbmcoZXJyb3IpXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RydWN0dXJlZEVycm9yIHtcbiAgY29kZT86IHN0cmluZ1xuICBmaXg/OiBzdHJpbmdcbiAgaW50ZXJuYWw/OiB1bmtub3duXG4gIGxpbms/OiBzdHJpbmdcbiAgd2h5Pzogc3RyaW5nXG59XG5cbmV4cG9ydCBjb25zdCBpc1N0cnVjdHVyZWRFcnJvciA9IChcbiAgdmFsdWU6IHVua25vd25cbik6IHZhbHVlIGlzIFN0cnVjdHVyZWRFcnJvciAmIFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+XG4gIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgdmFsdWUgIT09IG51bGwgJiZcbiAgKCd3aHknIGluIHZhbHVlIHx8XG4gICAgJ2ZpeCcgaW4gdmFsdWUgfHxcbiAgICAnbGluaycgaW4gdmFsdWUgfHxcbiAgICAnY29kZScgaW4gdmFsdWUgfHxcbiAgICAnaW50ZXJuYWwnIGluIHZhbHVlKVxuXG5leHBvcnQgaW50ZXJmYWNlIE5vcm1hbGl6ZWRMb2dnZWRFcnJvciB7XG4gIC8qKiBTYWZlIHN0cnVjdHVyZWQgcmVwcmVzZW50YXRpb24gZm9yIGRhdGEvdHJhbnNwb3J0IG1ldGEuICovXG4gIGVycm9yOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAvKiogU2FmZSBvbmUtbGluZSBtZXNzYWdlIGZvciB0aGUgbG9nIGxpbmUuICovXG4gIG1lc3NhZ2U6IHN0cmluZ1xufVxuXG5jb25zdCBpc1ZhbGlkYXRpb25FcnJvckxpa2UgPSAoXG4gIHZhbHVlOiB1bmtub3duXG4pOiB2YWx1ZSBpcyBFcnJvciAmIHsgYWxsPzogdW5rbm93bltdOyBzdGF0dXM/OiBudW1iZXI7IHR5cGU/OiBzdHJpbmcgfSA9PlxuICB2YWx1ZSBpbnN0YW5jZW9mIEVycm9yICYmXG4gIC8vIGBjb2RlYCBpcyBFbHlzaWEncyBtaW5pZmljYXRpb24tc2FmZSBkaXNjcmltaW5hbnQg4oCUIGAubmFtZWAgYW5kXG4gIC8vIGAuY29uc3RydWN0b3IubmFtZWAgYm90aCBkZWdyYWRlIHRvIGEgbWFuZ2xlZCBzdHJpbmcgdW5kZXIgYnVuZGxlclxuICAvLyBtaW5pZmljYXRpb24gKGUuZy4gYGJ1biBidWlsZCAtLW1pbmlmeWAsIGVzYnVpbGQpLCBzbyBgY29kZWAgbXVzdCBiZVxuICAvLyBjaGVja2VkIHRvbyBvciB2YWxpZGF0aW9uIGJvZGllcyBzaWxlbnRseSByZS1sZWFrIGluIHRoYXQgYnVpbGQgbW9kZS5cbiAgKCh2YWx1ZSBhcyB7IGNvZGU/OiB1bmtub3duIH0pLmNvZGUgPT09ICdWQUxJREFUSU9OJyB8fFxuICAgIHZhbHVlLm5hbWUgPT09ICdWYWxpZGF0aW9uRXJyb3InIHx8XG4gICAgdmFsdWUuY29uc3RydWN0b3I/Lm5hbWUgPT09ICdWYWxpZGF0aW9uRXJyb3InKVxuXG5jb25zdCBTVFJVQ1RVUkVEX0VSUk9SX0tFWVMgPSBbXG4gICdjb2RlJyxcbiAgJ2ZpeCcsXG4gICdpbnRlcm5hbCcsXG4gICdsaW5rJyxcbiAgJ21lc3NhZ2UnLFxuICAnbmFtZScsXG4gICdzdGF0dXMnLFxuICAnd2h5J1xuXSBhcyBjb25zdFxuXG5jb25zdCBjb3B5U3RydWN0dXJlZEVycm9yRmllbGRzID0gKFxuICByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiB7XG4gIGNvbnN0IHNhZmU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge31cbiAgZm9yIChjb25zdCBrZXkgb2YgU1RSVUNUVVJFRF9FUlJPUl9LRVlTKSB7XG4gICAgaWYgKHJlY29yZFtrZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHNhZmVba2V5XSA9IHJlY29yZFtrZXldXG4gICAgfVxuICB9XG4gIHJldHVybiBzYWZlXG59XG5cbmV4cG9ydCBjb25zdCBub3JtYWxpemVMb2dnZWRFcnJvciA9IChcbiAgZXJyb3I6IHVua25vd24sXG4gIGxvZ0Vycm9yUGF5bG9hZDogYm9vbGVhblxuKTogTm9ybWFsaXplZExvZ2dlZEVycm9yID0+IHtcbiAgaWYgKGlzU3RhdHVzUmVzcG9uc2UoZXJyb3IpKSB7XG4gICAgLy8gQSBzdHJpbmcgYm9keSBiZWNvbWVzIHRoZSBtZXNzYWdlLiBBbnkgb3RoZXIgYm9keSBpcyB0aGUgYXBwJ3MgcmVzcG9uc2VcbiAgICAvLyBwYXlsb2FkIGFuZCBtYXkgY2FycnkgdXNlciBkYXRhLCBzbyB0aGUgc3RhdHVzIHRleHQgc3RhbmRzIGluIGZvciBpdC5cbiAgICBjb25zdCBtZXNzYWdlID1cbiAgICAgIHR5cGVvZiBlcnJvci5yZXNwb25zZSA9PT0gJ3N0cmluZycgJiYgZXJyb3IucmVzcG9uc2UgIT09ICcnXG4gICAgICAgID8gZXJyb3IucmVzcG9uc2VcbiAgICAgICAgOiAoU1RBVFVTX0NPREVTW2Vycm9yLmNvZGVdID8/IGBIVFRQICR7ZXJyb3IuY29kZX1gKVxuICAgIHJldHVybiB7XG4gICAgICBlcnJvcjogeyBtZXNzYWdlLCBuYW1lOiAnU3RhdHVzUmVzcG9uc2UnLCBzdGF0dXM6IGVycm9yLmNvZGUgfSxcbiAgICAgIG1lc3NhZ2VcbiAgICB9XG4gIH1cblxuICBpZiAoaXNWYWxpZGF0aW9uRXJyb3JMaWtlKGVycm9yKSAmJiAhbG9nRXJyb3JQYXlsb2FkKSB7XG4gICAgY29uc3QgZmFpbHVyZXMgPSBBcnJheS5pc0FycmF5KGVycm9yLmFsbCkgPyBlcnJvci5hbGwgOiBbXVxuICAgIGNvbnN0IHBhdGhzID0gZmFpbHVyZXNcbiAgICAgIC5tYXAoZmFpbHVyZSA9PlxuICAgICAgICB0eXBlb2YgZmFpbHVyZSA9PT0gJ29iamVjdCcgJiYgZmFpbHVyZSAhPT0gbnVsbCAmJiAncGF0aCcgaW4gZmFpbHVyZVxuICAgICAgICAgID8gU3RyaW5nKChmYWlsdXJlIGFzIHsgcGF0aDogdW5rbm93biB9KS5wYXRoKVxuICAgICAgICAgIDogJydcbiAgICAgIClcbiAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICBjb25zdCBzY29wZSA9IHR5cGVvZiBlcnJvci50eXBlID09PSAnc3RyaW5nJyA/IGVycm9yLnR5cGUgOiAncmVxdWVzdCdcbiAgICBjb25zdCBtZXNzYWdlID1cbiAgICAgIHBhdGhzLmxlbmd0aCA+IDBcbiAgICAgICAgPyBgVmFsaWRhdGlvbiBmYWlsZWQgKCR7c2NvcGV9KTogJHtwYXRocy5qb2luKCcsICcpfWBcbiAgICAgICAgOiBgVmFsaWRhdGlvbiBmYWlsZWQgKCR7c2NvcGV9KWBcbiAgICByZXR1cm4ge1xuICAgICAgZXJyb3I6IHsgZmFpbGVkUGF0aHM6IHBhdGhzLCBuYW1lOiAnVmFsaWRhdGlvbkVycm9yJywgdHlwZTogc2NvcGUgfSxcbiAgICAgIG1lc3NhZ2VcbiAgICB9XG4gIH1cblxuICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIGNvbnN0IHNhZmUgPSBjb3B5U3RydWN0dXJlZEVycm9yRmllbGRzKFxuICAgICAgZXJyb3IgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgIClcbiAgICBzYWZlLm1lc3NhZ2UgPSBlcnJvci5tZXNzYWdlXG4gICAgLy8gTmF0aXZlIHN1YmNsYXNzZXMgKGUuZy4gYGNsYXNzIEh0dHBFcnJvciBleHRlbmRzIEVycm9yYCkgZG9uJ3Qgc2V0XG4gICAgLy8gYC5uYW1lYCB1bmxlc3MgdGhlIGF1dGhvciBvdmVycmlkZXMgaXQsIHNvIGl0IHJlYWRzIGJhY2sgYXMgdGhlXG4gICAgLy8gZ2VuZXJpYyBcIkVycm9yXCIuIFByZWZlciB0aGUgY29uc3RydWN0b3IgbmFtZSBpbiB0aGF0IGNhc2UuXG4gICAgc2FmZS5uYW1lID1cbiAgICAgIGVycm9yLm5hbWUgPT09ICdFcnJvcidcbiAgICAgICAgPyAoZXJyb3IuY29uc3RydWN0b3I/Lm5hbWUgPz8gZXJyb3IubmFtZSlcbiAgICAgICAgOiBlcnJvci5uYW1lXG4gICAgcmV0dXJuIHsgZXJyb3I6IHNhZmUsIG1lc3NhZ2U6IHBhcnNlRXJyb3IoZXJyb3IpIH1cbiAgfVxuXG4gIGlmIChpc1N0cnVjdHVyZWRFcnJvcihlcnJvcikpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZXJyb3I6IGNvcHlTdHJ1Y3R1cmVkRXJyb3JGaWVsZHMoZXJyb3IgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLFxuICAgICAgbWVzc2FnZTogcGFyc2VFcnJvcihlcnJvcilcbiAgICB9XG4gIH1cblxuICByZXR1cm4geyBlcnJvcjogeyB2YWx1ZTogU3RyaW5nKGVycm9yKSB9LCBtZXNzYWdlOiBwYXJzZUVycm9yKGVycm9yKSB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHtcbiAgTG9nTGV2ZWwsXG4gIE9wdGlvbnMsXG4gIFJlcXVlc3RJbmZvLFxuICBTaW5rRXJyb3JDb250ZXh0LFxuICBTdG9yZURhdGFcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcydcbmltcG9ydCB7IGVsYXBzZWRNcyB9IGZyb20gJy4uL3V0aWxzL2R1cmF0aW9uJ1xuaW1wb3J0IHsgY3JlYXRlRXJyb3JSZXBvcnRlciB9IGZyb20gJy4uL3V0aWxzL3JlcG9ydCdcblxuY29uc3QgcmVwb3J0VHJhbnNwb3J0RXJyb3IgPSBjcmVhdGVFcnJvclJlcG9ydGVyKFxuICAndHJhbnNwb3J0JyxcbiAgJ3RyYW5zcG9ydCBmYWlsZWQnXG4pXG5cbmNvbnN0IE1BWF9UUkFDS0VEX1BFTkRJTkcgPSAxMDI0XG5jb25zdCBwZW5kaW5nVHJhbnNwb3J0V29yayA9IG5ldyBTZXQ8UHJvbWlzZTx1bmtub3duPj4oKVxuXG4vKipcbiAqIFJlbWVtYmVycyBhbiBpbi1mbGlnaHQgYGxvZygpYCBwcm9taXNlIHNvIHNodXRkb3duIGNhbiB3YWl0IGZvciBpdCwgYW5kXG4gKiByZXBvcnRzIGl0cyByZWplY3Rpb24uIFRoZSBzZXQgaXMgYm91bmRlZDogdW5kZXIgc3VzdGFpbmVkIGxvYWQgdGhlIG9sZGVzdFxuICogZW50cnkgaXMgZHJvcHBlZCByYXRoZXIgdGhhbiBsZXR0aW5nIGEgc2xvdyB0cmFuc3BvcnQgZ3JvdyBpdCB3aXRob3V0IGxpbWl0LlxuICovXG5jb25zdCB3YXRjaCA9IGFzeW5jIChcbiAgcGVuZGluZzogUHJvbWlzZTx2b2lkPixcbiAgb25FcnJvcjogKChjb250ZXh0OiBTaW5rRXJyb3JDb250ZXh0KSA9PiB2b2lkKSB8IHVuZGVmaW5lZFxuKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGlmIChwZW5kaW5nVHJhbnNwb3J0V29yay5zaXplID49IE1BWF9UUkFDS0VEX1BFTkRJTkcpIHtcbiAgICBjb25zdCBvbGRlc3QgPSBwZW5kaW5nVHJhbnNwb3J0V29yay52YWx1ZXMoKS5uZXh0KCkudmFsdWVcbiAgICBpZiAob2xkZXN0KSB7XG4gICAgICBwZW5kaW5nVHJhbnNwb3J0V29yay5kZWxldGUob2xkZXN0KVxuICAgIH1cbiAgfVxuICBwZW5kaW5nVHJhbnNwb3J0V29yay5hZGQocGVuZGluZylcbiAgdHJ5IHtcbiAgICBhd2FpdCBwZW5kaW5nXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmVwb3J0VHJhbnNwb3J0RXJyb3IoZXJyb3IsIG9uRXJyb3IpXG4gIH0gZmluYWxseSB7XG4gICAgcGVuZGluZ1RyYW5zcG9ydFdvcmsuZGVsZXRlKHBlbmRpbmcpXG4gIH1cbn1cblxuaW50ZXJmYWNlIExvZ1RvVHJhbnNwb3J0c0lucHV0IHtcbiAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgbGV2ZWw6IExvZ0xldmVsXG4gIG9wdGlvbnM6IE9wdGlvbnNcbiAgLyoqIER1cmF0aW9uIGFscmVhZHkgY29tcHV0ZWQgYnkgdGhlIGNhbGxlcjsgc2FtcGxlZCBvbiB0aGUgZmx5IHdoZW4gb21pdHRlZC4gKi9cbiAgcHJlY29tcHV0ZWQ/OiB7IGR1cmF0aW9uTXM6IG51bWJlcjsgcGF0aG5hbWU6IHN0cmluZzsgc2VhcmNoOiBzdHJpbmcgfVxuICByZXF1ZXN0OiBSZXF1ZXN0SW5mb1xuICBzdG9yZTogU3RvcmVEYXRhXG59XG5cbmV4cG9ydCBjb25zdCBsb2dUb1RyYW5zcG9ydHMgPSAoaW5wdXQ6IExvZ1RvVHJhbnNwb3J0c0lucHV0KTogdm9pZCA9PiB7XG4gIGNvbnN0IHsgbGV2ZWwsIHJlcXVlc3QsIGRhdGEsIHN0b3JlLCBvcHRpb25zLCBwcmVjb21wdXRlZCB9ID0gaW5wdXRcbiAgY29uc3QgdHJhbnNwb3J0cyA9IG9wdGlvbnMuY29uZmlnPy50cmFuc3BvcnRzID8/IFtdXG4gIGlmICh0cmFuc3BvcnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVyblxuICB9XG4gIGNvbnN0IG9uRXJyb3IgPSBvcHRpb25zLmNvbmZpZz8ub25FcnJvclxuXG4gIGNvbnN0IG1lc3NhZ2UgPSB0eXBlb2YgZGF0YS5tZXNzYWdlID09PSAnc3RyaW5nJyA/IGRhdGEubWVzc2FnZSA6ICcnXG4gIGNvbnN0IG1ldGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgIHJlcXVlc3Q6IHtcbiAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXG4gICAgICB1cmw6IHJlcXVlc3QudXJsXG4gICAgfSxcbiAgICAuLi5kYXRhLFxuICAgIGR1cmF0aW9uTXM6IHByZWNvbXB1dGVkPy5kdXJhdGlvbk1zID8/IGVsYXBzZWRNcyhzdG9yZS5iZWZvcmVUaW1lKVxuICB9XG5cbiAgZm9yIChjb25zdCB0cmFuc3BvcnQgb2YgdHJhbnNwb3J0cykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSB0cmFuc3BvcnQubG9nKGxldmVsLCBtZXNzYWdlLCBtZXRhKVxuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICB3YXRjaChyZXN1bHQsIG9uRXJyb3IpXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJlcG9ydFRyYW5zcG9ydEVycm9yKGVycm9yLCBvbkVycm9yKVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFJ1bnMgb25lIG9wdGlvbmFsIGxpZmVjeWNsZSBtZXRob2Qgb24gZXZlcnkgY29uZmlndXJlZCB0cmFuc3BvcnQuIEZhaWx1cmVzXG4gKiBhcmUgcmVwb3J0ZWQgbGlrZSBgbG9nKClgIGZhaWx1cmVzIGFuZCBuZXZlciBzdG9wIHRoZSBvdGhlciB0cmFuc3BvcnRzLlxuICovXG5jb25zdCBydW5UcmFuc3BvcnRMaWZlY3ljbGUgPSAoXG4gIG9wdGlvbnM6IE9wdGlvbnMsXG4gIG1ldGhvZDogJ2Nsb3NlJyB8ICdmbHVzaCdcbik6IFByb21pc2U8dW5rbm93bj5bXSA9PiB7XG4gIGNvbnN0IG9uRXJyb3IgPSBvcHRpb25zLmNvbmZpZz8ub25FcnJvclxuICByZXR1cm4gKG9wdGlvbnMuY29uZmlnPy50cmFuc3BvcnRzID8/IFtdKS5tYXAoYXN5bmMgdHJhbnNwb3J0ID0+IHtcbiAgICB0cnkge1xuICAgICAgLy8gWWllbGQgZmlyc3Qgc28gdGhlIG1ldGhvZCBpcyBjYWxsZWQgZnJvbSBhIG1pY3JvdGFzaywgbmV2ZXIgaW5saW5lLlxuICAgICAgYXdhaXQgUHJvbWlzZS5yZXNvbHZlKClcbiAgICAgIGF3YWl0IHRyYW5zcG9ydFttZXRob2RdPy4oKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXBvcnRUcmFuc3BvcnRFcnJvcihlcnJvciwgb25FcnJvcilcbiAgICB9XG4gIH0pXG59XG5cbi8qKiBXYWl0cyBmb3IgaW4tZmxpZ2h0IGBsb2coKWAgd29yayBhbmQgZXZlcnkgdHJhbnNwb3J0J3Mgb3duIGBmbHVzaCgpYC4gKi9cbmV4cG9ydCBjb25zdCBmbHVzaFRyYW5zcG9ydHMgPSBhc3luYyAob3B0aW9uczogT3B0aW9ucyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoW1xuICAgIC4uLnBlbmRpbmdUcmFuc3BvcnRXb3JrLFxuICAgIC4uLnJ1blRyYW5zcG9ydExpZmVjeWNsZShvcHRpb25zLCAnZmx1c2gnKVxuICBdKVxufVxuXG4vKiogUmVsZWFzZXMgZWFjaCB0cmFuc3BvcnQncyByZXNvdXJjZXM7IG9ubHkgcmVhY2hlZCB2aWEgYGZsdXNoTG9naXhseXNpYWAuICovXG5leHBvcnQgY29uc3QgY2xvc2VUcmFuc3BvcnRzID0gYXN5bmMgKG9wdGlvbnM6IE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKHJ1blRyYW5zcG9ydExpZmVjeWNsZShvcHRpb25zLCAnY2xvc2UnKSlcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBGaWxlSGFuZGxlIH0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcydcbmltcG9ydCB7IG9wZW4gfSBmcm9tICdub2RlOmZzL3Byb21pc2VzJ1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJ1xuaW1wb3J0IHR5cGUgeyBMb2dSb3RhdGlvbkNvbmZpZyB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBwYXJzZUludGVydmFsLCBwYXJzZVNpemUgfSBmcm9tICcuLi91dGlscy9yb3RhdGlvbidcbmltcG9ydCB7IHNldHRsZSB9IGZyb20gJy4uL3V0aWxzL3NldHRsZSdcbmltcG9ydCB7IGVuc3VyZURpciB9IGZyb20gJy4vZnMnXG5pbXBvcnQgeyBwZXJmb3JtUm90YXRpb24gfSBmcm9tICcuL3JvdGF0aW9uLW1hbmFnZXInXG5cbi8qKlxuICogVGhlIGxpdmUgZmlsZSdzIGNyZWF0aW9uIHRpbWUgd2hlbiB0aGUgZmlsZXN5c3RlbSByZXBvcnRzIG9uZTtcbiAqIHNvbWUgZmlsZXN5c3RlbXMgcmVwb3J0IDAvYWJzZW50IGJpcnRodGltZSDigJQgZmFsbCBiYWNrIHRvIGBub3dgXG4gKiAobG9zaW5nIHJlc3RhcnQtc3Vydml2YWwgZm9yIHRoZSBpbnRlcnZhbCBjbG9jaywgYnV0IG5ldmVyIHdyb25nXG4gKiBieSBtb3JlIHRoYW4gdGhlIHByb2Nlc3MgbGlmZXRpbWUpLlxuICovXG5leHBvcnQgY29uc3QgcmVzb2x2ZU9wZW5lZEF0ID0gKFxuICBiaXJ0aHRpbWVNczogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICBub3c6IG51bWJlclxuKTogbnVtYmVyID0+IChiaXJ0aHRpbWVNcyAmJiBiaXJ0aHRpbWVNcyA+IDAgPyBiaXJ0aHRpbWVNcyA6IG5vdylcblxuZXhwb3J0IGludGVyZmFjZSBGaWxlU2lua09wdGlvbnMge1xuICBsb2dEaXJNb2RlPzogbnVtYmVyXG4gIGxvZ0ZpbGVNb2RlPzogbnVtYmVyXG4gIGxvZ1JvdGF0aW9uPzogTG9nUm90YXRpb25Db25maWdcbiAgLyoqIFJlcG9ydHMgYSByb3RhdGlvbi1zaW5rIGZhaWx1cmU7IGZhbGxzIGJhY2sgdG8gYSBzdGRlcnIgbGluZSB3aGVuIG9taXR0ZWQuICovXG4gIG9uUm90YXRpb25FcnJvcj86IChlcnJvcjogdW5rbm93bikgPT4gdm9pZFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbGVTaW5rIHtcbiAgLyoqIEZsdXNoZXMsIHRoZW4gcmVsZWFzZXMgdGhlIGZpbGUgaGFuZGxlLiBJZGVtcG90ZW50LiAqL1xuICBjbG9zZTogKCkgPT4gUHJvbWlzZTx2b2lkPlxuICAvKiogUmVzb2x2ZXMgb25jZSBldmVyeSB3cml0ZSBpc3N1ZWQgc28gZmFyIGlzIGR1cmFibHkgb24gZGlzay4gKi9cbiAgZmx1c2g6ICgpID0+IFByb21pc2U8dm9pZD5cbiAgLyoqIFJlc29sdmVzIGFmdGVyIGBsaW5lYCBpcyBkdXJhYmx5IHdyaXR0ZW4gdG8gZGlzay4gKi9cbiAgd3JpdGU6IChsaW5lOiBzdHJpbmcsIG9wdGlvbnM6IEZpbGVTaW5rT3B0aW9ucykgPT4gUHJvbWlzZTx2b2lkPlxufVxuXG5pbnRlcmZhY2UgQmF0Y2hSZXNvbHZlciB7XG4gIHJlamVjdDogKGVycm9yOiB1bmtub3duKSA9PiB2b2lkXG4gIHJlc29sdmU6ICgpID0+IHZvaWRcbn1cblxuaW50ZXJmYWNlIFBlbmRpbmdCYXRjaCB7XG4gIGxpbmVzOiBzdHJpbmdbXVxuICByZXNvbHZlcnM6IEJhdGNoUmVzb2x2ZXJbXVxufVxuXG5jb25zdCBzaW5rcyA9IG5ldyBNYXA8c3RyaW5nLCBGaWxlU2luaz4oKVxuXG5jbGFzcyBGaWxlU2lua0ltcGwgaW1wbGVtZW50cyBGaWxlU2luayB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmlsZVBhdGg6IHN0cmluZ1xuICBwcml2YXRlIGhhbmRsZTogRmlsZUhhbmRsZSB8IG51bGwgPSBudWxsXG4gIHByaXZhdGUgYnl0ZXNXcml0dGVuID0gMFxuICBwcml2YXRlIG9wZW5lZEF0ID0gMFxuICBwcml2YXRlIGxhdGVzdE9wdGlvbnM6IEZpbGVTaW5rT3B0aW9ucyA9IHt9XG4gIHByaXZhdGUgcGVuZGluZ0JhdGNoOiBQZW5kaW5nQmF0Y2ggfCBudWxsID0gbnVsbFxuICAvLyBTZXJpYWxpemVzIGZsdXNoIGFuZCByb3RhdGlvbiB3b3JrIHBlciBwYXRoOiBldmVyeSBiYXRjaCAoYW5kIHRoZVxuICAvLyByb3RhdGlvbiBpdCBtYXkgdHJpZ2dlcikgaXMgY2hhaW5lZCBvbnRvIHRoaXMgc28gYXQgbW9zdCBvbmUgaG9sZGVyIG9mXG4gIC8vIHRoZSBmaWxlIGhhbmRsZSBpcyBkb2luZyBJL08gYXQgYSB0aW1lLlxuICBwcml2YXRlIGZsdXNoQ2hhaW46IFByb21pc2U8dm9pZD4gPSBQcm9taXNlLnJlc29sdmUoKVxuXG4gIGNvbnN0cnVjdG9yKGZpbGVQYXRoOiBzdHJpbmcpIHtcbiAgICB0aGlzLmZpbGVQYXRoID0gZmlsZVBhdGhcbiAgfVxuXG4gIHdyaXRlKGxpbmU6IHN0cmluZywgb3B0aW9uczogRmlsZVNpbmtPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQWx3YXlzIHVzZSB0aGUgbGF0ZXN0IGNhbGwncyBvcHRpb25zLCBpbiBjYXNlIGNvbmZpZyBkaWZmZXJzIGJldHdlZW5cbiAgICAvLyBjYWxscyB0byB0aGUgc2FtZSBwYXRoIChlLmcuIGluIHRlc3RzKS5cbiAgICB0aGlzLmxhdGVzdE9wdGlvbnMgPSBvcHRpb25zXG5cbiAgICBjb25zdCB7IHByb21pc2UsIHJlamVjdCwgcmVzb2x2ZSB9OiBQcm9taXNlV2l0aFJlc29sdmVyczx2b2lkPiA9XG4gICAgICBQcm9taXNlLndpdGhSZXNvbHZlcnMoKVxuXG4gICAgaWYgKHRoaXMucGVuZGluZ0JhdGNoKSB7XG4gICAgICB0aGlzLnBlbmRpbmdCYXRjaC5saW5lcy5wdXNoKGxpbmUpXG4gICAgICB0aGlzLnBlbmRpbmdCYXRjaC5yZXNvbHZlcnMucHVzaCh7IHJlamVjdCwgcmVzb2x2ZSB9KVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG5cbiAgICBjb25zdCBiYXRjaDogUGVuZGluZ0JhdGNoID0ge1xuICAgICAgbGluZXM6IFtsaW5lXSxcbiAgICAgIHJlc29sdmVyczogW3sgcmVqZWN0LCByZXNvbHZlIH1dXG4gICAgfVxuICAgIHRoaXMucGVuZGluZ0JhdGNoID0gYmF0Y2hcblxuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgIHRoaXMucGVuZGluZ0JhdGNoID0gbnVsbFxuICAgICAgdGhpcy5mbHVzaENoYWluID0gdGhpcy5mbHVzaEFmdGVyKHRoaXMuZmx1c2hDaGFpbiwgYmF0Y2gpXG4gICAgfSlcblxuICAgIHJldHVybiBwcm9taXNlXG4gIH1cblxuICAvKiogUnVucyBgYmF0Y2hgIG9uY2UgYHByaW9yYCBzZXR0bGVzLCB3aGV0aGVyIGl0IHJlc29sdmVkIG9yIHJlamVjdGVkLiAqL1xuICBwcml2YXRlIGFzeW5jIGZsdXNoQWZ0ZXIoXG4gICAgcHJpb3I6IFByb21pc2U8dm9pZD4sXG4gICAgYmF0Y2g6IFBlbmRpbmdCYXRjaFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBBIGZhaWxlZCBiYXRjaCBhbHJlYWR5IHJlamVjdGVkIGl0cyBvd24gd3JpdGVyczsgdGhlIG5leHQgb25lIHN0aWxsIHJ1bnMuXG4gICAgYXdhaXQgc2V0dGxlKHByaW9yKVxuICAgIGF3YWl0IHRoaXMuZmx1c2hCYXRjaChiYXRjaClcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmx1c2hCYXRjaChiYXRjaDogUGVuZGluZ0JhdGNoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMubGF0ZXN0T3B0aW9uc1xuICAgIC8vIExpbmVzIGFscmVhZHkgY2FycnkgdGhlaXIgb3duIHRyYWlsaW5nIG5ld2xpbmU7IGpvaW4gbmVlZHMgbm8gc2VwYXJhdG9yLlxuICAgIGNvbnN0IHRleHQgPSBiYXRjaC5saW5lcy5qb2luKCcnKVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuZW5zdXJlT3BlbihvcHRpb25zKVxuICAgICAgY29uc3QgaGFuZGxlID0gdGhpcy5oYW5kbGUgYXMgRmlsZUhhbmRsZVxuICAgICAgYXdhaXQgaGFuZGxlLndyaXRlKHRleHQpXG4gICAgICB0aGlzLmJ5dGVzV3JpdHRlbiArPSBCdWZmZXIuYnl0ZUxlbmd0aCh0ZXh0KVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBmb3IgKGNvbnN0IHJlc29sdmVyIG9mIGJhdGNoLnJlc29sdmVycykge1xuICAgICAgICByZXNvbHZlci5yZWplY3QoZXJyb3IpXG4gICAgICB9XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBSb3RhdGlvbiAoaWYgdHJpZ2dlcmVkKSBpcyBhd2FpdGVkIGJlZm9yZSByZXNvbHZpbmcgc28gY2FsbGVycyBvYnNlcnZlXG4gICAgLy8gYSBjb25zaXN0ZW50IG9uLWRpc2sgc3RhdGU6IHRoZSBsaW5lJ3Mgd3JpdGUgcGx1cyBhbnkgcm90YXRpb24gaXRcbiAgICAvLyBjYXVzZWQuIG1heWJlUm90YXRlKCkgY2F0Y2hlcyBhbmQgcmVwb3J0cyBpdHMgb3duIGVycm9ycywgc28gaXQgbmV2ZXJcbiAgICAvLyByZWplY3RzIHRoaXMgY2hhaW4uXG4gICAgYXdhaXQgdGhpcy5tYXliZVJvdGF0ZShvcHRpb25zKVxuXG4gICAgZm9yIChjb25zdCByZXNvbHZlciBvZiBiYXRjaC5yZXNvbHZlcnMpIHtcbiAgICAgIHJlc29sdmVyLnJlc29sdmUoKVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlT3BlbihvcHRpb25zOiBGaWxlU2lua09wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5oYW5kbGUpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIFRoZSBkaXJlY3Rvcnkgb25seSBuZWVkcyBjcmVhdGluZyBvbiBmaXJzdCBvcGVuIChvciBvbiByZW9wZW4gYWZ0ZXIgYVxuICAgIC8vIHJvdGF0aW9uIGNsZWFyZWQgdGhlIGhhbmRsZSkg4oCUIG5ldmVyIHBlciBsaW5lLlxuICAgIGF3YWl0IGVuc3VyZURpcihwYXRoLmRpcm5hbWUodGhpcy5maWxlUGF0aCksIG9wdGlvbnMubG9nRGlyTW9kZSlcbiAgICBjb25zdCBoYW5kbGUgPSBhd2FpdCBvcGVuKHRoaXMuZmlsZVBhdGgsICdhJywgb3B0aW9ucy5sb2dGaWxlTW9kZSA/PyAwbzYwMClcbiAgICBjb25zdCBzdGF0ID0gYXdhaXQgaGFuZGxlLnN0YXQoKVxuICAgIHRoaXMuaGFuZGxlID0gaGFuZGxlXG4gICAgdGhpcy5ieXRlc1dyaXR0ZW4gPSBzdGF0LnNpemVcbiAgICB0aGlzLm9wZW5lZEF0ID0gcmVzb2x2ZU9wZW5lZEF0KHN0YXQuYmlydGh0aW1lTXMsIERhdGUubm93KCkpXG4gIH1cblxuICAvKiogVHJ1ZSB3aGVuIGVpdGhlciBjb25maWd1cmVkIHRyaWdnZXIgKHNpemUsIGludGVydmFsKSBoYXMgYmVlbiBjcm9zc2VkLiAqL1xuICBwcml2YXRlIHNob3VsZFJvdGF0ZU5vdyhyb3RhdGlvbjogTG9nUm90YXRpb25Db25maWcpOiBib29sZWFuIHtcbiAgICBpZiAoXG4gICAgICByb3RhdGlvbi5tYXhTaXplICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHRoaXMuYnl0ZXNXcml0dGVuID4gcGFyc2VTaXplKHJvdGF0aW9uLm1heFNpemUpXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gKFxuICAgICAgcm90YXRpb24uaW50ZXJ2YWwgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgRGF0ZS5ub3coKSAtIHRoaXMub3BlbmVkQXQgPj0gcGFyc2VJbnRlcnZhbChyb3RhdGlvbi5pbnRlcnZhbClcbiAgICApXG4gIH1cblxuICBwcml2YXRlIGFzeW5jIG1heWJlUm90YXRlKG9wdGlvbnM6IEZpbGVTaW5rT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJvdGF0aW9uID0gb3B0aW9ucy5sb2dSb3RhdGlvblxuICAgIGlmIChcbiAgICAgICFyb3RhdGlvbiB8fFxuICAgICAgKHJvdGF0aW9uLm1heFNpemUgPT09IHVuZGVmaW5lZCAmJiByb3RhdGlvbi5pbnRlcnZhbCA9PT0gdW5kZWZpbmVkKVxuICAgICkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGlmICghdGhpcy5zaG91bGRSb3RhdGVOb3cocm90YXRpb24pKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCB7IGhhbmRsZSB9ID0gdGhpc1xuICAgICAgdGhpcy5oYW5kbGUgPSBudWxsXG4gICAgICB0aGlzLmJ5dGVzV3JpdHRlbiA9IDBcbiAgICAgIHRoaXMub3BlbmVkQXQgPSBEYXRlLm5vdygpXG4gICAgICBhd2FpdCBoYW5kbGU/LmNsb3NlKClcbiAgICAgIGF3YWl0IHBlcmZvcm1Sb3RhdGlvbih0aGlzLmZpbGVQYXRoLCByb3RhdGlvbiwgb3B0aW9ucy5vblJvdGF0aW9uRXJyb3IpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIExvZyBlbnRyaWVzIHdlcmUgYWxyZWFkeSBkdXJhYmx5IHdyaXR0ZW4gYW5kIHJlc29sdmVkIGFib3ZlO1xuICAgICAgLy8gcm90YXRpb24gZmFpbHVyZXMgbXVzdCBub3QgZmFpbCB0aGUgY2FsbGVyJ3Mgd3JpdGUuXG4gICAgICBpZiAob3B0aW9ucy5vblJvdGF0aW9uRXJyb3IpIHtcbiAgICAgICAgb3B0aW9ucy5vblJvdGF0aW9uRXJyb3IoZXJyb3IpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIGBbbG9naXhseXNpYV0gRmFpbGVkIHRvIHJvdGF0ZSBsb2cgZmlsZSAke3RoaXMuZmlsZVBhdGh9OmAsXG4gICAgICAgICAgZXJyb3JcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZsdXNoKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIHdyaXRlKCkgY2hhaW5zIG9udG8gZmx1c2hDaGFpbiBmcm9tIGEgbWljcm90YXNrLCBzbyB5aWVsZCBvbmNlIGJlZm9yZVxuICAgIC8vIHJlYWRpbmcgdGhlIGNoYWluIG9yIGEgd3JpdGUgaXNzdWVkIGluIHRoZSBzYW1lIHRpY2sgd291bGQgYmUgbWlzc2VkLlxuICAgIGF3YWl0IFByb21pc2UucmVzb2x2ZSgpXG4gICAgYXdhaXQgdGhpcy5mbHVzaENoYWluXG4gIH1cblxuICBhc3luYyBjbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmZsdXNoKClcbiAgICBjb25zdCB7IGhhbmRsZSB9ID0gdGhpc1xuICAgIHRoaXMuaGFuZGxlID0gbnVsbFxuICAgIGF3YWl0IGhhbmRsZT8uY2xvc2UoKVxuICAgIHNpbmtzLmRlbGV0ZSh0aGlzLmZpbGVQYXRoKVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBnZXRGaWxlU2luayA9IChmaWxlUGF0aDogc3RyaW5nKTogRmlsZVNpbmsgPT4ge1xuICBsZXQgc2luayA9IHNpbmtzLmdldChmaWxlUGF0aClcbiAgaWYgKCFzaW5rKSB7XG4gICAgc2luayA9IG5ldyBGaWxlU2lua0ltcGwoZmlsZVBhdGgpXG4gICAgc2lua3Muc2V0KGZpbGVQYXRoLCBzaW5rKVxuICB9XG4gIHJldHVybiBzaW5rXG59XG5cbmV4cG9ydCBjb25zdCBmbHVzaEFsbEZpbGVTaW5rcyA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFsuLi5zaW5rcy52YWx1ZXMoKV0ubWFwKHNpbmsgPT4gc2luay5mbHVzaCgpKSlcbn1cblxuZXhwb3J0IGNvbnN0IGNsb3NlQWxsRmlsZVNpbmtzID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoWy4uLnNpbmtzLnZhbHVlcygpXS5tYXAoc2luayA9PiBzaW5rLmNsb3NlKCkpKVxufVxuIiwKICAgICJpbXBvcnQgeyBwcm9taXNlcyBhcyBmcyB9IGZyb20gJ25vZGU6ZnMnXG5cbmV4cG9ydCBjb25zdCBlbnN1cmVEaXIgPSBhc3luYyAoXG4gIGRpclBhdGg6IHN0cmluZyxcbiAgbW9kZSA9IDBvNzAwXG4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgYXdhaXQgZnMubWtkaXIoZGlyUGF0aCwgeyBtb2RlLCByZWN1cnNpdmU6IHRydWUgfSlcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBTdGF0cyB9IGZyb20gJ25vZGU6ZnMnXG5pbXBvcnQgeyBwcm9taXNlcyBhcyBmcyB9IGZyb20gJ25vZGU6ZnMnXG5pbXBvcnQgeyBwcm9taXNpZnkgfSBmcm9tICdub2RlOnV0aWwnXG5pbXBvcnQgeyBnemlwIH0gZnJvbSAnbm9kZTp6bGliJ1xuaW1wb3J0IHR5cGUgeyBMb2dSb3RhdGlvbkNvbmZpZyB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQge1xuICBnZXRSb3RhdGVkRmlsZXMsXG4gIHBhcnNlUmV0ZW50aW9uLFxuICBwYXJzZVNpemUsXG4gIHNob3VsZFJvdGF0ZUJ5U2l6ZVxufSBmcm9tICcuLi91dGlscy9yb3RhdGlvbidcbmltcG9ydCB7IGNyZWF0ZUtleWVkTXV0ZXggfSBmcm9tICcuL2tleWVkLW11dGV4J1xuXG5jb25zdCBnemlwQXN5bmMgPSBwcm9taXNpZnkoZ3ppcClcblxuLy8gUHJldmVudHMgY29uY3VycmVudCBjb21wcmVzc2lvbiBvZiB0aGUgc2FtZSBmaWxlIChrZXllZCBieSBmaWxlUGF0aCkuXG5jb25zdCBjb21wcmVzc2lvbkxvY2sgPSBjcmVhdGVLZXllZE11dGV4KClcblxuLyoqIFJlcG9ydHMgYSBzaW5rIGZhaWx1cmU7IHdoZW4gb21pdHRlZCwgdGhlIGNhbGxlciBmYWxscyBiYWNrIHRvIHN0ZGVyci4gKi9cbmV4cG9ydCB0eXBlIFJvdGF0aW9uRXJyb3JSZXBvcnRlciA9IChlcnJvcjogdW5rbm93bikgPT4gdm9pZFxuXG5jb25zdCByZXBvcnRSb3RhdGlvbkVycm9yID0gKFxuICBtZXNzYWdlOiBzdHJpbmcsXG4gIGVycm9yOiB1bmtub3duLFxuICBvbkVycm9yPzogUm90YXRpb25FcnJvclJlcG9ydGVyXG4pOiB2b2lkID0+IHtcbiAgaWYgKG9uRXJyb3IpIHtcbiAgICBvbkVycm9yKGVycm9yKVxuICAgIHJldHVyblxuICB9XG4gIGNvbnNvbGUuZXJyb3IobWVzc2FnZSwgZXJyb3IpXG59XG5cbmNvbnN0IHBhZDIgPSAodmFsdWU6IG51bWJlcik6IHN0cmluZyA9PiBTdHJpbmcodmFsdWUpLnBhZFN0YXJ0KDIsICcwJylcblxuZXhwb3J0IGNvbnN0IGdldFJvdGF0ZWRGaWxlTmFtZSA9IChmaWxlUGF0aDogc3RyaW5nLCBkYXRlOiBEYXRlKTogc3RyaW5nID0+IHtcbiAgY29uc3QgeXl5eSA9IGRhdGUuZ2V0RnVsbFllYXIoKVxuICBjb25zdCBtbSA9IHBhZDIoZGF0ZS5nZXRNb250aCgpICsgMSlcbiAgY29uc3QgZGQgPSBwYWQyKGRhdGUuZ2V0RGF0ZSgpKVxuICBjb25zdCBISCA9IHBhZDIoZGF0ZS5nZXRIb3VycygpKVxuICBjb25zdCBNTSA9IHBhZDIoZGF0ZS5nZXRNaW51dGVzKCkpXG4gIGNvbnN0IHNzID0gcGFkMihkYXRlLmdldFNlY29uZHMoKSlcbiAgY29uc3QgU1NTID0gU3RyaW5nKGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCkpLnBhZFN0YXJ0KDMsICcwJylcbiAgcmV0dXJuIGAke2ZpbGVQYXRofS4ke3l5eXl9LSR7bW19LSR7ZGR9LSR7SEh9LSR7TU19LSR7c3N9LSR7U1NTfWBcbn1cblxuZXhwb3J0IGNvbnN0IHJvdGF0ZUZpbGUgPSBhc3luYyAoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdCA9IGF3YWl0IGZzLnN0YXQoZmlsZVBhdGgpXG4gICAgaWYgKHN0YXQuc2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuICcnXG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIGNvbnN0IGJhc2VSb3RhdGVkID0gZ2V0Um90YXRlZEZpbGVOYW1lKGZpbGVQYXRoLCBuZXcgRGF0ZSgpKVxuICBjb25zdCByb3RhdGVkID0gYCR7YmFzZVJvdGF0ZWR9LSR7cHJvY2Vzcy5ocnRpbWUuYmlnaW50KCl9YFxuICBhd2FpdCBmcy5yZW5hbWUoZmlsZVBhdGgsIHJvdGF0ZWQpXG4gIHJldHVybiByb3RhdGVkXG59XG5cbmV4cG9ydCBjb25zdCBjb21wcmVzc0ZpbGUgPSBhc3luYyAoXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIG9uRXJyb3I/OiBSb3RhdGlvbkVycm9yUmVwb3J0ZXJcbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICBjb25zdCByZWxlYXNlID0gYXdhaXQgY29tcHJlc3Npb25Mb2NrLmFjcXVpcmUoZmlsZVBhdGgpXG4gIHRyeSB7XG4gICAgLy8gQ2hlY2sgaWYgZmlsZSBzdGlsbCBleGlzdHMgKG1pZ2h0IGhhdmUgYmVlbiBjb21wcmVzc2VkIGJ5IGFub3RoZXIgcHJvY2VzcylcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZnMuYWNjZXNzKGZpbGVQYXRoKVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gRmlsZSBkb2Vzbid0IGV4aXN0LCBhbHJlYWR5IGNvbXByZXNzZWQgb3IgZGVsZXRlZFxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGZpbGVQYXRoKVxuICAgIGNvbnN0IGNvbXByZXNzZWQgPSBhd2FpdCBnemlwQXN5bmMoY29udGVudClcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUoYCR7ZmlsZVBhdGh9Lmd6YCwgY29tcHJlc3NlZClcbiAgICBhd2FpdCBmcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJlcG9ydFJvdGF0aW9uRXJyb3IoXG4gICAgICBgW2xvZ2l4bHlzaWFdIEZhaWxlZCB0byBjb21wcmVzcyBmaWxlICR7ZmlsZVBhdGh9OmAsXG4gICAgICBlcnJvcixcbiAgICAgIG9uRXJyb3JcbiAgICApXG4gICAgdGhyb3cgZXJyb3JcbiAgfSBmaW5hbGx5IHtcbiAgICByZWxlYXNlKClcbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgc2hvdWxkUm90YXRlID0gYXN5bmMgKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBjb25maWc6IExvZ1JvdGF0aW9uQ29uZmlnXG4pOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgaWYgKGNvbmZpZy5tYXhTaXplID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuICBjb25zdCBtYXhTaXplID0gcGFyc2VTaXplKGNvbmZpZy5tYXhTaXplKVxuICByZXR1cm4gYXdhaXQgc2hvdWxkUm90YXRlQnlTaXplKGZpbGVQYXRoLCBtYXhTaXplKVxufVxuXG5pbnRlcmZhY2UgRmlsZVN0YXQge1xuICBwYXRoOiBzdHJpbmdcbiAgc3RhdDogU3RhdHNcbn1cblxuY29uc3QgaXNGdWxmaWxsZWQgPSA8VD4oXG4gIHJlc3VsdDogUHJvbWlzZVNldHRsZWRSZXN1bHQ8VD5cbik6IHJlc3VsdCBpcyBQcm9taXNlRnVsZmlsbGVkUmVzdWx0PFQ+ID0+IHJlc3VsdC5zdGF0dXMgPT09ICdmdWxmaWxsZWQnXG5cbi8qKlxuICogRGVsZXRlcyByb3RhdGVkIGZpbGVzIGJleW9uZCBgcmV0ZW50aW9uYDogZm9yIGAnY291bnQnYCwga2VlcHMgdGhlIG5ld2VzdFxuICogYHJldGVudGlvbi52YWx1ZWAgZmlsZXMgKGJ5IG10aW1lKTsgZm9yIGAndGltZSdgLCBkZWxldGVzIGZpbGVzIG9sZGVyIHRoYW5cbiAqIGByZXRlbnRpb24udmFsdWVgIG1zLiBJbmRpdmlkdWFsIHN0YXQvZGVsZXRlIGZhaWx1cmVzIGFyZSB0b2xlcmF0ZWQgKHZpYVxuICogYGFsbFNldHRsZWRgKSBzbyBvbmUgYmFkIGZpbGUgbmV2ZXIgYmxvY2tzIGNsZWFudXAgb2YgdGhlIHJlc3QuXG4gKi9cbmNvbnN0IGNsZWFudXBSb3RhdGVkID0gYXN5bmMgKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICByZXRlbnRpb246IHsgdHlwZTogJ2NvdW50JyB8ICd0aW1lJzsgdmFsdWU6IG51bWJlciB9LFxuICBvbkVycm9yPzogUm90YXRpb25FcnJvclJlcG9ydGVyXG4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3Qgcm90YXRlZCA9IGF3YWl0IGdldFJvdGF0ZWRGaWxlcyhmaWxlUGF0aClcbiAgaWYgKHJvdGF0ZWQubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKHJldGVudGlvbi50eXBlID09PSAnY291bnQnICYmIHJvdGF0ZWQubGVuZ3RoIDw9IHJldGVudGlvbi52YWx1ZSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgLy8gVXNlIFByb21pc2UuYWxsU2V0dGxlZCB0byBoYW5kbGUgaW5kaXZpZHVhbCBmaWxlIHN0YXQgZmFpbHVyZXMgZ3JhY2VmdWxseVxuICBjb25zdCBzdGF0c1Jlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgcm90YXRlZC5tYXAoYXN5bmMgcCA9PiAoeyBwYXRoOiBwLCBzdGF0OiBhd2FpdCBmcy5zdGF0KHApIH0pKVxuICApXG5cbiAgLy8gRXh0cmFjdCBzdWNjZXNzZnVsIHN0YXRzLCBpZ25vcmUgZmlsZXMgdGhhdCB3ZXJlIGRlbGV0ZWQgY29uY3VycmVudGx5XG4gIGNvbnN0IHN0YXRzID0gc3RhdHNSZXN1bHRzLmZpbHRlcihpc0Z1bGZpbGxlZDxGaWxlU3RhdD4pLm1hcChyID0+IHIudmFsdWUpXG5cbiAgbGV0IHRvRGVsZXRlOiBGaWxlU3RhdFtdXG4gIGlmIChyZXRlbnRpb24udHlwZSA9PT0gJ2NvdW50Jykge1xuICAgIGlmIChzdGF0cy5sZW5ndGggPD0gcmV0ZW50aW9uLnZhbHVlKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgc3RhdHMuc29ydCgoYSwgYikgPT4gYi5zdGF0Lm10aW1lTXMgLSBhLnN0YXQubXRpbWVNcylcbiAgICB0b0RlbGV0ZSA9IHN0YXRzLnNsaWNlKHJldGVudGlvbi52YWx1ZSlcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpXG4gICAgdG9EZWxldGUgPSBzdGF0cy5maWx0ZXIoKHsgc3RhdCB9KSA9PiBub3cgLSBzdGF0Lm10aW1lTXMgPiByZXRlbnRpb24udmFsdWUpXG4gIH1cblxuICAvLyBEZWxldGUgZmlsZXMgaW5kaXZpZHVhbGx5LCBjb250aW51aW5nIGV2ZW4gaWYgc29tZSBmYWlsXG4gIGNvbnN0IGRlbGV0ZVJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgdG9EZWxldGUubWFwKCh7IHBhdGggfSkgPT4gZnMucm0ocGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSlcbiAgKVxuXG4gIC8vIExvZyBmYWlsdXJlcyBidXQgZG9uJ3QgY3Jhc2hcbiAgZm9yIChjb25zdCBbaWR4LCByZXN1bHRdIG9mIGRlbGV0ZVJlc3VsdHMuZW50cmllcygpKSB7XG4gICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09ICdyZWplY3RlZCcpIHtcbiAgICAgIHJlcG9ydFJvdGF0aW9uRXJyb3IoXG4gICAgICAgIGBbbG9naXhseXNpYV0gRmFpbGVkIHRvIGRlbGV0ZSByb3RhdGVkIGxvZyAke3RvRGVsZXRlW2lkeF0ucGF0aH06YCxcbiAgICAgICAgcmVzdWx0LnJlYXNvbixcbiAgICAgICAgb25FcnJvclxuICAgICAgKVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgcGVyZm9ybVJvdGF0aW9uID0gYXN5bmMgKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBjb25maWc6IExvZ1JvdGF0aW9uQ29uZmlnLFxuICBvbkVycm9yPzogUm90YXRpb25FcnJvclJlcG9ydGVyXG4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3Qgcm90YXRlZCA9IGF3YWl0IHJvdGF0ZUZpbGUoZmlsZVBhdGgpXG4gIGlmICghcm90YXRlZCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3Qgc2hvdWxkQ29tcHJlc3MgPSBjb25maWcuY29tcHJlc3MgPT09IHRydWVcbiAgaWYgKHNob3VsZENvbXByZXNzKSB7XG4gICAgY29uc3QgYWxnbyA9IGNvbmZpZy5jb21wcmVzc2lvbiA/PyAnZ3ppcCdcbiAgICBpZiAoYWxnbyA9PT0gJ2d6aXAnKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBjb21wcmVzc0ZpbGUocm90YXRlZCwgb25FcnJvcilcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBjb21wcmVzc0ZpbGUgYWxyZWFkeSByZXBvcnRlZCB0aGlzIGVycm9yIHZpYSBvbkVycm9yL2NvbnNvbGUuZXJyb3I7XG4gICAgICAgIC8vIHN3YWxsb3cgdGhlIHJldGhyb3cgaGVyZSBzbyByZXRlbnRpb24gY2xlYW51cCBiZWxvdyBzdGlsbCBydW5zIGFuZFxuICAgICAgICAvLyB0aGUgZmFpbHVyZSBpc24ndCByZXBvcnRlZCBhIHNlY29uZCB0aW1lIGJ5IHRoZSBjYWxsZXIncyBjYXRjaC5cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLm1heEZpbGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCByZXRlbnRpb24gPSBwYXJzZVJldGVudGlvbihjb25maWcubWF4RmlsZXMpXG4gICAgYXdhaXQgY2xlYW51cFJvdGF0ZWQoZmlsZVBhdGgsIHJldGVudGlvbiwgb25FcnJvcilcbiAgfVxuXG4gIC8vIEludGVydmFsLWJhc2VkIHRyaWdnZXJpbmcgbGl2ZXMgaW4gYEZpbGVTaW5rSW1wbC5tYXliZVJvdGF0ZWBcbiAgLy8gKGZpbGUtc2luay50cyk7IHBlcmZvcm1Sb3RhdGlvbiBpcyB0cmlnZ2VyLWFnbm9zdGljIOKAlCBpdCByZW5hbWVzLFxuICAvLyBjb21wcmVzc2VzLCBhbmQgY2xlYW5zIHVwIHJlZ2FyZGxlc3Mgb2Ygd2h5IHJvdGF0aW9uIGZpcmVkLlxufVxuIiwKICAgICJleHBvcnQgaW50ZXJmYWNlIEtleWVkTXV0ZXgge1xuICAvKipcbiAgICogU2VyaWFsaXplcyB3b3JrIGZvciBga2V5YDogcmVzb2x2ZXMgb25jZSBhbnkgcHJpb3IgaG9sZGVyIGZvciB0aGUgc2FtZVxuICAgKiBrZXkgaGFzIHJlbGVhc2VkLCBhbmQgcmV0dXJucyBhIHJlbGVhc2UgZnVuY3Rpb24gdGhlIGNhbGxlciBNVVNUIGNhbGxcbiAgICogZXhhY3RseSBvbmNlIHRvIGhhbmQgdGhlIGxvY2sgdG8gdGhlIG5leHQgd2FpdGVyIChpZiBhbnkpLlxuICAgKi9cbiAgYWNxdWlyZTogKGtleTogc3RyaW5nKSA9PiBQcm9taXNlPCgpID0+IHZvaWQ+XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBpbmRlcGVuZGVudCBrZXllZCBtdXRleDogYWNxdWlzaXRpb25zIGZvciBkaWZmZXJlbnQga2V5cyBuZXZlclxuICogYmxvY2sgZWFjaCBvdGhlciwgd2hpbGUgYWNxdWlzaXRpb25zIGZvciB0aGUgc2FtZSBrZXkgYXJlIHNlcmlhbGl6ZWQgaW5cbiAqIEZJRk8gb3JkZXIuXG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVLZXllZE11dGV4ID0gKCk6IEtleWVkTXV0ZXggPT4ge1xuICBjb25zdCBsb2NrcyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPHZvaWQ+PigpXG5cbiAgY29uc3QgYWNxdWlyZSA9IGFzeW5jIChrZXk6IHN0cmluZyk6IFByb21pc2U8KCkgPT4gdm9pZD4gPT4ge1xuICAgIGNvbnN0IHByaW9yID0gbG9ja3MuZ2V0KGtleSkgPz8gUHJvbWlzZS5yZXNvbHZlKClcblxuICAgIGNvbnN0IHsgcHJvbWlzZTogY3VycmVudCwgcmVzb2x2ZTogcmVsZWFzZSB9OiBQcm9taXNlV2l0aFJlc29sdmVyczx2b2lkPiA9XG4gICAgICBQcm9taXNlLndpdGhSZXNvbHZlcnMoKVxuXG4gICAgLy8gUmVnaXN0ZXIgYmVmb3JlIGF3YWl0aW5nOiBzYW1lLXRpY2sgY2FsbGVycyBtdXN0IGNoYWluIG9udG8gVEhJUyBsb2NrLFxuICAgIC8vIG5vdCB0aGUgb25lIHRoYXQgd2FzIGN1cnJlbnQgd2hlbiB0aGV5IGNhbGxlZCBhY3F1aXJlKCkuXG4gICAgbG9ja3Muc2V0KGtleSwgY3VycmVudClcblxuICAgIGF3YWl0IHByaW9yXG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgcmVsZWFzZSgpXG4gICAgICBpZiAobG9ja3MuZ2V0KGtleSkgPT09IGN1cnJlbnQpIHtcbiAgICAgICAgbG9ja3MuZGVsZXRlKGtleSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4geyBhY3F1aXJlIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUge1xuICBMb2dMZXZlbCxcbiAgT3B0aW9ucyxcbiAgUmVxdWVzdEluZm8sXG4gIFNpbmtFcnJvckNvbnRleHQsXG4gIFN0b3JlRGF0YVxufSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgZWxhcHNlZE1zIH0gZnJvbSAnLi4vdXRpbHMvZHVyYXRpb24nXG5pbXBvcnQgeyBzYW5pdGl6ZUxvZ1RleHQgfSBmcm9tICcuLi91dGlscy9zYW5pdGl6ZSdcbmltcG9ydCB7IGdldEZpbGVTaW5rIH0gZnJvbSAnLi9maWxlLXNpbmsnXG5cbmludGVyZmFjZSBMb2dUb0ZpbGVJbnB1dCB7XG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gIGZpbGVQYXRoOiBzdHJpbmdcbiAgbGV2ZWw6IExvZ0xldmVsXG4gIG9wdGlvbnM6IE9wdGlvbnNcbiAgLyoqIER1cmF0aW9uL1VSTCBwYXJ0cyBhbHJlYWR5IGNvbXB1dGVkIGJ5IHRoZSBjYWxsZXI7IHBhcnNlZCBvbiB0aGUgZmx5IHdoZW4gb21pdHRlZC4gKi9cbiAgcHJlY29tcHV0ZWQ/OiB7IGR1cmF0aW9uTXM6IG51bWJlcjsgcGF0aG5hbWU6IHN0cmluZzsgc2VhcmNoOiBzdHJpbmcgfVxuICByZXF1ZXN0OiBSZXF1ZXN0SW5mb1xuICBzdG9yZTogU3RvcmVEYXRhXG59XG5cbi8qKiBSZXNvbHZlcyB0aGUgbG9nZ2VkIHBhdGhuYW1lICh3aXRoIHF1ZXJ5IHN0cmluZyB3aGVuIGNvbmZpZ3VyZWQpIGZyb20gcHJlY29tcHV0ZWQgcGFydHMgb3IgYSBmcmVzaCBwYXJzZS4gKi9cbmNvbnN0IHJlc29sdmVQYXRobmFtZSA9IChcbiAgcmVxdWVzdDogUmVxdWVzdEluZm8sXG4gIGxvZ1F1ZXJ5UGFyYW1zOiBib29sZWFuIHwgdW5kZWZpbmVkLFxuICBwcmVjb21wdXRlZD86IHsgcGF0aG5hbWU6IHN0cmluZzsgc2VhcmNoOiBzdHJpbmcgfVxuKTogc3RyaW5nID0+IHtcbiAgaWYgKHByZWNvbXB1dGVkKSB7XG4gICAgY29uc3QgeyBwYXRobmFtZSwgc2VhcmNoIH0gPSBwcmVjb21wdXRlZFxuICAgIHJldHVybiBsb2dRdWVyeVBhcmFtcyA/IGAke3BhdGhuYW1lfSR7c2VhcmNofWAgOiBwYXRobmFtZVxuICB9XG4gIHRyeSB7XG4gICAgLy8gU2FmZWx5IHBhcnNlIFVSTCB0byBhdm9pZCBjcmFzaGVzIG9uIG1hbGZvcm1lZCBVUkxzXG4gICAgY29uc3QgeyBwYXRobmFtZSwgc2VhcmNoIH0gPSBuZXcgVVJMKHJlcXVlc3QudXJsKVxuICAgIHJldHVybiBsb2dRdWVyeVBhcmFtcyA/IGAke3BhdGhuYW1lfSR7c2VhcmNofWAgOiBwYXRobmFtZVxuICB9IGNhdGNoIHtcbiAgICAvLyBGYWxsYmFjayB0byByYXcgVVJMIGlmIHBhcnNpbmcgZmFpbHNcbiAgICByZXR1cm4gcmVxdWVzdC51cmxcbiAgfVxufVxuXG4vKiogUmVwb3J0cyBhIHNpbmsgZmFpbHVyZSB2aWEgYGNvbmZpZy5vbkVycm9yYCB3aGVuIHNldCAoc3dhbGxvd2luZyBob29rIGVycm9ycyksIGVsc2Ugc3RkZXJyLiAqL1xuY29uc3QgcmVwb3J0U2lua0Vycm9yID0gKFxuICBjb25maWc6IE9wdGlvbnNbJ2NvbmZpZyddLFxuICBzaW5rOiBTaW5rRXJyb3JDb250ZXh0WydzaW5rJ10sXG4gIGZhbGxiYWNrTWVzc2FnZTogc3RyaW5nLFxuICBlcnJvcjogdW5rbm93blxuKTogdm9pZCA9PiB7XG4gIGNvbnN0IG9uRXJyb3IgPSBjb25maWc/Lm9uRXJyb3JcbiAgaWYgKCFvbkVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihmYWxsYmFja01lc3NhZ2UsIGVycm9yKVxuICAgIHJldHVyblxuICB9XG4gIHRyeSB7XG4gICAgb25FcnJvcih7IGVycm9yLCBzaW5rIH0pXG4gIH0gY2F0Y2gge1xuICAgIC8vIFN3YWxsb3cgZXJyb3JzIHRocm93biBieSB0aGUgaG9vayBpdHNlbGYuXG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGxvZ1RvRmlsZSA9IGFzeW5jIChpbnB1dDogTG9nVG9GaWxlSW5wdXQpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3QgeyBmaWxlUGF0aCwgbGV2ZWwsIHJlcXVlc3QsIGRhdGEsIHN0b3JlLCBvcHRpb25zLCBwcmVjb21wdXRlZCB9ID0gaW5wdXRcbiAgY29uc3QgeyBjb25maWcgfSA9IG9wdGlvbnNcbiAgY29uc3QgdXNlVHJhbnNwb3J0c09ubHkgPSBjb25maWc/LnVzZVRyYW5zcG9ydHNPbmx5ID09PSB0cnVlXG4gIGNvbnN0IGRpc2FibGVGaWxlTG9nZ2luZyA9IGNvbmZpZz8uZGlzYWJsZUZpbGVMb2dnaW5nID09PSB0cnVlXG4gIGlmICh1c2VUcmFuc3BvcnRzT25seSB8fCBkaXNhYmxlRmlsZUxvZ2dpbmcpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IG1lc3NhZ2UgPSB0eXBlb2YgZGF0YS5tZXNzYWdlID09PSAnc3RyaW5nJyA/IGRhdGEubWVzc2FnZSA6ICcnXG4gIGNvbnN0IGR1cmF0aW9uTXMgPSBwcmVjb21wdXRlZD8uZHVyYXRpb25NcyA/PyBlbGFwc2VkTXMoc3RvcmUuYmVmb3JlVGltZSlcblxuICBjb25zdCBwYXRobmFtZSA9IHJlc29sdmVQYXRobmFtZShyZXF1ZXN0LCBjb25maWc/LmxvZ1F1ZXJ5UGFyYW1zLCBwcmVjb21wdXRlZClcbiAgY29uc3QgbGluZSA9IGAke2xldmVsfSAke2R1cmF0aW9uTXMudG9GaXhlZCgyKX1tcyAke3JlcXVlc3QubWV0aG9kfSAke3Nhbml0aXplTG9nVGV4dChwYXRobmFtZSwgMTAyNCl9ICR7c2FuaXRpemVMb2dUZXh0KG1lc3NhZ2UpfVxcbmBcblxuICBjb25zdCBvblJvdGF0aW9uRXJyb3IgPSBjb25maWc/Lm9uRXJyb3JcbiAgICA/IChlcnJvcjogdW5rbm93bikgPT4gcmVwb3J0U2lua0Vycm9yKGNvbmZpZywgJ3JvdGF0aW9uJywgJycsIGVycm9yKVxuICAgIDogdW5kZWZpbmVkXG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBnZXRGaWxlU2luayhmaWxlUGF0aCkud3JpdGUobGluZSwge1xuICAgICAgbG9nRGlyTW9kZTogY29uZmlnPy5sb2dEaXJNb2RlLFxuICAgICAgbG9nRmlsZU1vZGU6IGNvbmZpZz8ubG9nRmlsZU1vZGUsXG4gICAgICBsb2dSb3RhdGlvbjogY29uZmlnPy5sb2dSb3RhdGlvbixcbiAgICAgIG9uUm90YXRpb25FcnJvclxuICAgIH0pXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmVwb3J0U2lua0Vycm9yKFxuICAgICAgY29uZmlnLFxuICAgICAgJ2ZpbGUnLFxuICAgICAgYFtsb2dpeGx5c2lhXSBGYWlsZWQgdG8gd3JpdGUgdG8gbG9nIGZpbGUgJHtmaWxlUGF0aH06YCxcbiAgICAgIGVycm9yXG4gICAgKVxuICAgIHRocm93IGVycm9yXG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgbWVyZ2VMb2dEYXRhQ29udGV4dCB9IGZyb20gJy4uL2NvbnRleHQvcmVxdWVzdC1jb250ZXh0J1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0Q29udGV4dFN0b3JlIH0gZnJvbSAnLi4vY29udGV4dC9yZXF1ZXN0LWNvbnRleHQnXG5pbXBvcnQgdHlwZSB7XG4gIExvZ0ZpbHRlcixcbiAgTG9nTGV2ZWwsXG4gIE9wdGlvbnMsXG4gIFJlcXVlc3RJbmZvLFxuICBTdG9yZURhdGFcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcydcbmltcG9ydCB7IGxvZ1RvVHJhbnNwb3J0cyB9IGZyb20gJy4uL291dHB1dCdcbmltcG9ydCB7IGxvZ1RvRmlsZSB9IGZyb20gJy4uL291dHB1dC9maWxlJ1xuaW1wb3J0IHR5cGUgeyBTYW1wbGluZ1J1bnRpbWUgfSBmcm9tICcuLi9zYW1wbGluZydcbmltcG9ydCB7IGVsYXBzZWRNcyB9IGZyb20gJy4uL3V0aWxzL2R1cmF0aW9uJ1xuaW1wb3J0IHsgcmVkYWN0LCByZWRhY3RSZXF1ZXN0IH0gZnJvbSAnLi4vdXRpbHMvcmVkYWN0J1xuaW1wb3J0IHsgY3JlYXRlRXJyb3JSZXBvcnRlciB9IGZyb20gJy4uL3V0aWxzL3JlcG9ydCdcbmltcG9ydCB7IHNldHRsZSB9IGZyb20gJy4uL3V0aWxzL3NldHRsZSdcbmltcG9ydCB7IGZvcm1hdExvZ091dHB1dCB9IGZyb20gJy4vY3JlYXRlLWxvZ2dlcidcbmltcG9ydCB0eXBlIHsgRm9ybWF0Q29udGV4dCwgUHJlY29tcHV0ZWRMb2dQYXJ0cyB9IGZyb20gJy4vY3JlYXRlLWxvZ2dlcidcblxuLyoqXG4gKiBXaGljaCBzaW5rcyBhcmUgYWN0aXZlIGZvciBhIGdpdmVuIGNvbmZpZywgcmVzb2x2ZWQgb25jZSBwZXIgbG9nZ2VyXG4gKiBpbnN0YW5jZSAoc2VlIGBjcmVhdGVMb2dnZXJgKSBzaW5jZSBub25lIG9mIHRoZXNlIGRlcGVuZCBvbiBwZXItcmVxdWVzdFxuICogc3RhdGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lua3Mge1xuICBoYXNGaWxlTG9nZ2luZzogYm9vbGVhblxuICBoYXNJbnRlcm5hbExvZ2dlcjogYm9vbGVhblxuICBoYXNUcmFuc3BvcnRzOiBib29sZWFuXG4gIC8qKiBUcnVlIHdoZW4gbm8gc2luayBpcyBhY3RpdmUgYXQgYWxsOiBgbG9nKClgL2BoYW5kbGVIdHRwRXJyb3IoKWAgY2FuIHNraXAgYWxsIHdvcmsuICovXG4gIGlzRWZmZWN0aXZlbHlEaXNhYmxlZDogYm9vbGVhblxuICAvKiogVHJ1ZSB3aGVuIGF0IGxlYXN0IG9uZSBhY3RpdmUgc2luayByZWFkcyBwYXRobmFtZS9zZWFyY2ggKGZpbGUgbG9nZ2luZyBvciB0aGUgY29uc29sZSBmb3JtYXR0ZXIpLiAqL1xuICBuZWVkc1VybFBhcnRzOiBib29sZWFuXG59XG5cbmV4cG9ydCBjb25zdCByZXNvbHZlU2lua3MgPSAoY29uZmlnOiBPcHRpb25zWydjb25maWcnXSk6IFNpbmtzID0+IHtcbiAgY29uc3QgdXNlVHJhbnNwb3J0c09ubHkgPSBjb25maWc/LnVzZVRyYW5zcG9ydHNPbmx5ID09PSB0cnVlXG4gIGNvbnN0IGRpc2FibGVJbnRlcm5hbExvZ2dlciA9IGNvbmZpZz8uZGlzYWJsZUludGVybmFsTG9nZ2VyID09PSB0cnVlXG4gIGNvbnN0IGRpc2FibGVGaWxlTG9nZ2luZyA9IGNvbmZpZz8uZGlzYWJsZUZpbGVMb2dnaW5nID09PSB0cnVlXG5cbiAgY29uc3QgaGFzVHJhbnNwb3J0cyA9IChjb25maWc/LnRyYW5zcG9ydHM/Lmxlbmd0aCA/PyAwKSA+IDBcbiAgY29uc3QgaGFzRmlsZUxvZ2dpbmcgPVxuICAgICEodXNlVHJhbnNwb3J0c09ubHkgfHwgZGlzYWJsZUZpbGVMb2dnaW5nKSAmJiAhIWNvbmZpZz8ubG9nRmlsZVBhdGhcbiAgY29uc3QgaGFzSW50ZXJuYWxMb2dnZXIgPSAhKHVzZVRyYW5zcG9ydHNPbmx5IHx8IGRpc2FibGVJbnRlcm5hbExvZ2dlcilcbiAgY29uc3QgaXNFZmZlY3RpdmVseURpc2FibGVkID0gIShcbiAgICBoYXNUcmFuc3BvcnRzIHx8XG4gICAgaGFzRmlsZUxvZ2dpbmcgfHxcbiAgICBoYXNJbnRlcm5hbExvZ2dlclxuICApXG4gIGNvbnN0IG5lZWRzVXJsUGFydHMgPSBoYXNGaWxlTG9nZ2luZyB8fCBoYXNJbnRlcm5hbExvZ2dlclxuXG4gIHJldHVybiB7XG4gICAgaGFzRmlsZUxvZ2dpbmcsXG4gICAgaGFzSW50ZXJuYWxMb2dnZXIsXG4gICAgaGFzVHJhbnNwb3J0cyxcbiAgICBpc0VmZmVjdGl2ZWx5RGlzYWJsZWQsXG4gICAgbmVlZHNVcmxQYXJ0c1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBzaG91bGRMb2cgPSAobGV2ZWw6IExvZ0xldmVsLCBsb2dGaWx0ZXI/OiBMb2dGaWx0ZXIpOiBib29sZWFuID0+IHtcbiAgaWYgKCFsb2dGaWx0ZXI/LmxldmVsIHx8IGxvZ0ZpbHRlci5sZXZlbC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG4gIHJldHVybiBsb2dGaWx0ZXIubGV2ZWwuaW5jbHVkZXMobGV2ZWwpXG59XG5cbi8qKiBQYXJzZXMgdGhlIFVSTCBvbmNlOyBvbmx5IGNhbGxlZCB3aGVuIGF0IGxlYXN0IG9uZSBhY3RpdmUgc2luayByZWFkcyBwYXRobmFtZS9zZWFyY2guICovXG5leHBvcnQgY29uc3QgcGFyc2VSZXF1ZXN0VXJsT25jZSA9IChcbiAgcmVxdWVzdDogUmVxdWVzdEluZm9cbik6IHsgcGF0aG5hbWU6IHN0cmluZzsgc2VhcmNoOiBzdHJpbmcgfSA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgeyBwYXRobmFtZSwgc2VhcmNoIH0gPSBuZXcgVVJMKHJlcXVlc3QudXJsKVxuICAgIHJldHVybiB7IHBhdGhuYW1lLCBzZWFyY2ggfVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4geyBwYXRobmFtZTogcmVxdWVzdC51cmwgfHwgJy8nLCBzZWFyY2g6ICcnIH1cbiAgfVxufVxuXG4vKipcbiAqIFNhbXBsZXMgZHVyYXRpb24gYW5kIHBhcnNlcyB0aGUgVVJMIG9uY2UgcGVyIGVtaXNzaW9uIGZvciB0aGUgc2lua3MgdGhhdCB3aWxsIGFjdHVhbGx5IHJ1bi5cbiAqIGBsb2dUb1RyYW5zcG9ydHNgJyBtZXRhIG9ubHkgcmVhZHMgYGR1cmF0aW9uTXNgIChub3QgcGF0aG5hbWUvc2VhcmNoKSwgc28gdGhlIFVSTCBpcyBwYXJzZWRcbiAqIG9ubHkgd2hlbiBmaWxlIGxvZ2dpbmcgb3IgdGhlIGludGVybmFsIGNvbnNvbGUgbG9nZ2VyIGlzIGFjdGl2ZSDigJQgc2tpcHBpbmcgaXQgZW50aXJlbHkgZm9yXG4gKiB0cmFuc3BvcnRzLW9ubHkgY29uZmlncywgbWF0Y2hpbmcgdGhhdCBwYXRoJ3MgcHJlLW9wdGltaXphdGlvbiBiZWhhdmlvci5cbiAqL1xuZXhwb3J0IGNvbnN0IGNvbXB1dGVQcmVjb21wdXRlZExvZ1BhcnRzID0gKFxuICBzdG9yZTogU3RvcmVEYXRhLFxuICByZXF1ZXN0OiBSZXF1ZXN0SW5mbyxcbiAgbmVlZHNVcmxQYXJ0czogYm9vbGVhbixcbiAgZHVyYXRpb25PdmVycmlkZT86IG51bWJlclxuKTogUHJlY29tcHV0ZWRMb2dQYXJ0cyA9PiB7XG4gIGNvbnN0IGR1cmF0aW9uTXMgPSBkdXJhdGlvbk92ZXJyaWRlID8/IGVsYXBzZWRNcyhzdG9yZS5iZWZvcmVUaW1lKVxuICBjb25zdCB7IHBhdGhuYW1lLCBzZWFyY2ggfSA9IG5lZWRzVXJsUGFydHNcbiAgICA/IHBhcnNlUmVxdWVzdFVybE9uY2UocmVxdWVzdClcbiAgICA6IHsgcGF0aG5hbWU6ICcnLCBzZWFyY2g6ICcnIH1cblxuICByZXR1cm4geyBkdXJhdGlvbk1zLCBwYXRobmFtZSwgc2VhcmNoIH1cbn1cblxuY29uc3QgY29uc29sZUZvckxldmVsID0gKGxldmVsOiBMb2dMZXZlbCk6IHR5cGVvZiBjb25zb2xlLmxvZyA9PiB7XG4gIHN3aXRjaCAobGV2ZWwpIHtcbiAgICBjYXNlICdERUJVRyc6IHtcbiAgICAgIHJldHVybiBjb25zb2xlLmRlYnVnXG4gICAgfVxuICAgIGNhc2UgJ0lORk8nOiB7XG4gICAgICByZXR1cm4gY29uc29sZS5pbmZvXG4gICAgfVxuICAgIGNhc2UgJ1dBUk5JTkcnOiB7XG4gICAgICByZXR1cm4gY29uc29sZS53YXJuXG4gICAgfVxuICAgIGNhc2UgJ0VSUk9SJzoge1xuICAgICAgcmV0dXJuIGNvbnNvbGUuZXJyb3JcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgcmV0dXJuIGNvbnNvbGUubG9nXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRW1pdElucHV0IHtcbiAgLyoqIFNraXBzIHRoZSBzYW1wbGluZyBnYXRlOyBzZXQgd2hlbiByZXBsYXlpbmcgYSB0YWlsLXJlc2N1ZWQgcmVjb3JkLiAqL1xuICBieXBhc3NTYW1wbGluZz86IGJvb2xlYW5cbiAgLyoqIFNoYXJlZCBwZXItcmVxdWVzdCBjb250ZXh0IGJhZyAocGVla2VkLCBuZXZlciBjbG9uZWQvcmV0YWluZWQpLiAqL1xuICBjb250ZXh0U3RvcmU6IFJlcXVlc3RDb250ZXh0U3RvcmVcbiAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgLyoqIER1cmF0aW9uIGNhcHR1cmVkIHdoZW4gYSByZWNvcmQgd2FzIGJ1ZmZlcmVkLCByZXBsYWNpbmcgdGhlIGxpdmUgc2FtcGxlLiAqL1xuICBkdXJhdGlvbk92ZXJyaWRlPzogbnVtYmVyXG4gIC8qKiBIb2lzdGVkIHBlci1sb2dnZXIgY29uc3RhbnRzIGZvciBgZm9ybWF0TG9nT3V0cHV0YDsgb25seSByZWFkIHdoZW4gdGhlIGludGVybmFsIGNvbnNvbGUgbG9nZ2VyIGlzIGFjdGl2ZS4gKi9cbiAgZm9ybWF0Q29udGV4dDogRm9ybWF0Q29udGV4dFxuICBsZXZlbDogTG9nTGV2ZWxcbiAgb3B0aW9uczogT3B0aW9uc1xuICByZXF1ZXN0OiBSZXF1ZXN0SW5mb1xuICAvKiogSG9pc3RlZCBwZXItbG9nZ2VyIHNhbXBsaW5nIHJ1bnRpbWU7IHVuZGVmaW5lZCB3aGVuIHNhbXBsaW5nIGlzIG9mZi4gKi9cbiAgc2FtcGxpbmc/OiBTYW1wbGluZ1J1bnRpbWVcbiAgLyoqIEhvaXN0ZWQgcGVyLWxvZ2dlciBzaW5rIGdhdGVzIGZyb20ge0BsaW5rIHJlc29sdmVTaW5rc30uICovXG4gIHNpbmtzOiBTaW5rc1xuICBzdG9yZTogU3RvcmVEYXRhXG59XG5cbi8qKiBTaGFyZWQgYnkgYGVtaXRgIGFuZCBgaGFuZGxlSHR0cEVycm9yYCBzbyBmb3JtYXR0aW5nIGZhaWx1cmVzIHNoYXJlIG9uZSByYXRlIGxpbWl0LiAqL1xuZXhwb3J0IGNvbnN0IHJlcG9ydEZvcm1hdEVycm9yID0gY3JlYXRlRXJyb3JSZXBvcnRlcihcbiAgJ2Zvcm1hdCcsXG4gICdmYWlsZWQgdG8gYnVpbGQgYSBsb2cgcmVjb3JkJ1xuKVxuXG5jb25zdCB3cml0ZVJlY29yZCA9ICh7XG4gIGNvbnRleHRTdG9yZSxcbiAgZGF0YSxcbiAgZHVyYXRpb25PdmVycmlkZSxcbiAgZm9ybWF0Q29udGV4dCxcbiAgbGV2ZWwsXG4gIG9wdGlvbnMsXG4gIHJlcXVlc3QsXG4gIHNpbmtzLFxuICBzdG9yZVxufTogRW1pdElucHV0KTogdm9pZCA9PiB7XG4gIGNvbnN0IHsgY29uZmlnIH0gPSBvcHRpb25zXG5cbiAgY29uc3QgZGF0YVdpdGhDb250ZXh0ID0gbWVyZ2VMb2dEYXRhQ29udGV4dChcbiAgICBkYXRhLFxuICAgIC8vIG1lcmdlTG9nRGF0YUNvbnRleHQgb25seSByZWFkcy9zcHJlYWRzIHRoaXMgYmFnIGludG8gYSBuZXcgb2JqZWN0OyBpdCBuZXZlciByZXRhaW5zXG4gICAgLy8gdGhlIHJlZmVyZW5jZSwgc28gYSBub24tY2xvbmluZyBwZWVrIGlzIHNhZmUgaGVyZS5cbiAgICBjb250ZXh0U3RvcmUucGVla0NvbnRleHQocmVxdWVzdClcbiAgKVxuICBjb25zdCBsb2dEYXRhID1cbiAgICBjb25maWc/LmF1dG9SZWRhY3QgPT09IHRydWVcbiAgICAgID8gcmVkYWN0KGRhdGFXaXRoQ29udGV4dCwgY29uZmlnPy5yZWRhY3RLZXlzKVxuICAgICAgOiBkYXRhV2l0aENvbnRleHRcbiAgY29uc3QgbG9nUmVxdWVzdCA9XG4gICAgY29uZmlnPy5hdXRvUmVkYWN0ID09PSB0cnVlXG4gICAgICA/IHJlZGFjdFJlcXVlc3QocmVxdWVzdCwgY29uZmlnPy5yZWRhY3RLZXlzKVxuICAgICAgOiByZXF1ZXN0XG5cbiAgY29uc3QgcHJlY29tcHV0ZWQgPSBjb21wdXRlUHJlY29tcHV0ZWRMb2dQYXJ0cyhcbiAgICBzdG9yZSxcbiAgICBsb2dSZXF1ZXN0LFxuICAgIHNpbmtzLm5lZWRzVXJsUGFydHMsXG4gICAgZHVyYXRpb25PdmVycmlkZVxuICApXG5cbiAgaWYgKHNpbmtzLmhhc1RyYW5zcG9ydHMpIHtcbiAgICBsb2dUb1RyYW5zcG9ydHMoe1xuICAgICAgZGF0YTogbG9nRGF0YSxcbiAgICAgIGxldmVsLFxuICAgICAgb3B0aW9ucyxcbiAgICAgIHByZWNvbXB1dGVkLFxuICAgICAgcmVxdWVzdDogbG9nUmVxdWVzdCxcbiAgICAgIHN0b3JlXG4gICAgfSlcbiAgfVxuXG4gIGlmIChzaW5rcy5oYXNGaWxlTG9nZ2luZykge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gY29uZmlnPy5sb2dGaWxlUGF0aFxuICAgIGlmIChmaWxlUGF0aCkge1xuICAgICAgLy8gZmlsZS50cyByZXBvcnRzIGEgZmFpbGVkIHdyaXRlIGl0c2VsZiAoY29uc29sZS5lcnJvciBvciBjb25maWcub25FcnJvcikuXG4gICAgICBzZXR0bGUoXG4gICAgICAgIGxvZ1RvRmlsZSh7XG4gICAgICAgICAgZGF0YTogbG9nRGF0YSxcbiAgICAgICAgICBmaWxlUGF0aCxcbiAgICAgICAgICBsZXZlbCxcbiAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgIHByZWNvbXB1dGVkLFxuICAgICAgICAgIHJlcXVlc3Q6IGxvZ1JlcXVlc3QsXG4gICAgICAgICAgc3RvcmVcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBpZiAoIXNpbmtzLmhhc0ludGVybmFsTG9nZ2VyKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCB7IG1haW4sIGNvbnRleHRMaW5lcyB9ID0gZm9ybWF0TG9nT3V0cHV0KHtcbiAgICBkYXRhOiBsb2dEYXRhLFxuICAgIGZvcm1hdENvbnRleHQsXG4gICAgbGV2ZWwsXG4gICAgb3B0aW9ucyxcbiAgICBwcmVjb21wdXRlZCxcbiAgICByZXF1ZXN0OiBsb2dSZXF1ZXN0LFxuICAgIHN0b3JlXG4gIH0pXG4gIGNvbnN0IG1lc3NhZ2UgPVxuICAgIGNvbnRleHRMaW5lcy5sZW5ndGggPiAwID8gYCR7bWFpbn1cXG4ke2NvbnRleHRMaW5lcy5qb2luKCdcXG4nKX1gIDogbWFpblxuXG4gIGNvbnNvbGVGb3JMZXZlbChsZXZlbCkobWVzc2FnZSlcbn1cblxuLyoqXG4gKiBUaGUgc2luZ2xlIGxvZy1lbWlzc2lvbiBwaXBlbGluZSBzaGFyZWQgYnkgdGhlIHN1Y2Nlc3MgcGF0aCAoYGxvZygpYCkgYW5kXG4gKiB0aGUgZXJyb3IgcGF0aCAoYGhhbmRsZUh0dHBFcnJvcigpYCk6IGZpbHRlciBjaGVjayAtPiBjb250ZXh0IG1lcmdlIC0+XG4gKiByZWRhY3QgLT4gdHJhbnNwb3J0cyAtPiBmaWxlIC0+IGNvbnNvbGUsIGFsbCBnYXRlZCBieSB0aGUgc2FtZSBgc2lua3NgLlxuICovXG5leHBvcnQgY29uc3QgZW1pdCA9IChpbnB1dDogRW1pdElucHV0KTogdm9pZCA9PiB7XG4gIGNvbnN0IHtcbiAgICBieXBhc3NTYW1wbGluZyxcbiAgICBkYXRhLFxuICAgIGxldmVsLFxuICAgIG9wdGlvbnMsXG4gICAgcmVxdWVzdCxcbiAgICBzYW1wbGluZyxcbiAgICBzaW5rcyxcbiAgICBzdG9yZVxuICB9ID0gaW5wdXRcbiAgY29uc3QgeyBjb25maWcgfSA9IG9wdGlvbnNcblxuICBpZiAoc2lua3MuaXNFZmZlY3RpdmVseURpc2FibGVkIHx8ICFzaG91bGRMb2cobGV2ZWwsIGNvbmZpZz8ubG9nRmlsdGVyKSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgaWYgKHNhbXBsaW5nICYmICFieXBhc3NTYW1wbGluZykge1xuICAgIGNvbnN0IGRlY2lzaW9uID0gc2FtcGxpbmcuZGVjaWRlKGxldmVsLCByZXF1ZXN0KVxuICAgIGlmIChkZWNpc2lvbiA9PT0gJ2Ryb3AnKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKGRlY2lzaW9uID09PSAnYnVmZmVyJykge1xuICAgICAgLy8gQnVmZmVyZWQgcmF3OiBjb250ZXh0IG1lcmdlLCByZWRhY3Rpb24gYW5kIGZvcm1hdHRpbmcgYXJlIGRlZmVycmVkIHRvXG4gICAgICAvLyByZXBsYXksIHNvIGEgcmVxdWVzdCB0aGF0IG5ldmVyIGdldHMgcmVzY3VlZCBwYXlzIGFsbW9zdCBub3RoaW5nLlxuICAgICAgc2FtcGxpbmcuYnVmZmVyKHJlcXVlc3QsIHtcbiAgICAgICAgZGF0YSxcbiAgICAgICAgZHVyYXRpb25NczogZWxhcHNlZE1zKHN0b3JlLmJlZm9yZVRpbWUpLFxuICAgICAgICBsZXZlbFxuICAgICAgfSlcbiAgICAgIHJldHVyblxuICAgIH1cbiAgfVxuXG4gIC8vIExvZ2dpbmcgbXVzdCBuZXZlciBmYWlsIHRoZSByZXF1ZXN0IGl0IGRlc2NyaWJlcy5cbiAgdHJ5IHtcbiAgICB3cml0ZVJlY29yZChpbnB1dClcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXBvcnRGb3JtYXRFcnJvcihlcnJvciwgY29uZmlnPy5vbkVycm9yKVxuICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgUmVxdWVzdENvbnRleHRTdG9yZSB9IGZyb20gJy4uL2NvbnRleHQvcmVxdWVzdC1jb250ZXh0J1xuaW1wb3J0IHsgaXNTdGF0dXNSZXNwb25zZSB9IGZyb20gJy4uL2hlbHBlcnMvc3RhdHVzJ1xuaW1wb3J0IHR5cGUgeyBMb2dMZXZlbCwgT3B0aW9ucywgUmVxdWVzdEluZm8sIFN0b3JlRGF0YSB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgdHlwZSB7IFNhbXBsaW5nUnVudGltZSB9IGZyb20gJy4uL3NhbXBsaW5nJ1xuaW1wb3J0IHsgbm9ybWFsaXplTG9nZ2VkRXJyb3IgfSBmcm9tICcuLi91dGlscy9lcnJvcidcbmltcG9ydCB0eXBlIHsgRm9ybWF0Q29udGV4dCB9IGZyb20gJy4vY3JlYXRlLWxvZ2dlcidcbmltcG9ydCB7IGVtaXQsIHJlcG9ydEZvcm1hdEVycm9yLCBzaG91bGRMb2cgfSBmcm9tICcuL2VtaXQnXG5pbXBvcnQgdHlwZSB7IFNpbmtzIH0gZnJvbSAnLi9lbWl0J1xuXG5jb25zdCBpc0Vycm9yV2l0aFN0YXR1cyA9IChcbiAgdmFsdWU6IHVua25vd25cbik6IHZhbHVlIGlzIHsgc3RhdHVzOiBudW1iZXI7IG1lc3NhZ2U/OiBzdHJpbmcgfSA9PlxuICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gIHZhbHVlICE9PSBudWxsICYmXG4gICdzdGF0dXMnIGluIHZhbHVlICYmXG4gIHR5cGVvZiAodmFsdWUgYXMgeyBzdGF0dXM/OiB1bmtub3duIH0pLnN0YXR1cyA9PT0gJ251bWJlcidcblxuLyoqIFRoZSBzdGF0dXMgYSB0aHJvd24gdmFsdWUgbWFwcyB0bzsgYW55dGhpbmcgd2l0aG91dCBvbmUgaXMgYSA1MDAuICovXG5leHBvcnQgY29uc3QgZXJyb3JTdGF0dXMgPSAoZXJyb3I6IHVua25vd24pOiBudW1iZXIgPT4ge1xuICBpZiAoaXNTdGF0dXNSZXNwb25zZShlcnJvcikpIHtcbiAgICByZXR1cm4gZXJyb3IuY29kZVxuICB9XG4gIHJldHVybiBpc0Vycm9yV2l0aFN0YXR1cyhlcnJvcikgPyBlcnJvci5zdGF0dXMgOiA1MDBcbn1cblxuZXhwb3J0IGNvbnN0IGhhbmRsZUh0dHBFcnJvciA9IChcbiAgcmVxdWVzdDogUmVxdWVzdEluZm8sXG4gIGVycm9yOiB1bmtub3duLFxuICBzdG9yZTogU3RvcmVEYXRhLFxuICBvcHRpb25zOiBPcHRpb25zLFxuICBjb250ZXh0U3RvcmU6IFJlcXVlc3RDb250ZXh0U3RvcmUsXG4gIHNpbmtzOiBTaW5rcyxcbiAgZm9ybWF0Q29udGV4dDogRm9ybWF0Q29udGV4dCxcbiAgc2FtcGxpbmc/OiBTYW1wbGluZ1J1bnRpbWVcbik6IHZvaWQgPT4ge1xuICBjb25zdCB7IGNvbmZpZyB9ID0gb3B0aW9uc1xuXG4gIGNvbnN0IHN0YXR1cyA9IGVycm9yU3RhdHVzKGVycm9yKVxuICBjb25zdCBsZXZlbDogTG9nTGV2ZWwgPSBzdGF0dXMgPj0gNDAwICYmIHN0YXR1cyA8IDUwMCA/ICdXQVJOSU5HJyA6ICdFUlJPUidcblxuICAvLyBNaXJyb3JzIGVtaXQoKSdzIG93biBnYXRlIGNoZWNrLCBidXQgcGVyZm9ybWVkICpiZWZvcmUqIG5vcm1hbGl6aW5nIHRoZVxuICAvLyBlcnJvciBzbyBhIGZpbHRlcmVkLW91dC9kaXNhYmxlZCBsb2dnZXIgbmV2ZXIgcGF5cyBmb3IgdGhhdCB3b3JrLlxuICAvLyBlbWl0KCkgcmUtY2hlY2tzIHRoZSBzYW1lIGdhdGUsIHdoaWNoIGlzIGNoZWFwIGFuZCBrZWVwcyB0aGlzIGZ1bmN0aW9uIGFcbiAgLy8gdGhpbiwgcHJvdmFibHktY29ycmVjdCB3cmFwcGVyIGFyb3VuZCB0aGUgc2hhcmVkIHBpcGVsaW5lLlxuICBpZiAoc2lua3MuaXNFZmZlY3RpdmVseURpc2FibGVkIHx8ICFzaG91bGRMb2cobGV2ZWwsIGNvbmZpZz8ubG9nRmlsdGVyKSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgLy8gZW1pdCBndWFyZHMgaXRzIG93biB3b3JrOyB0aGlzIGNvdmVycyBub3JtYWxpemluZyB0aGUgZXJyb3IgYmVmb3JlIGl0LlxuICB0cnkge1xuICAgIGNvbnN0IHsgZXJyb3I6IHNhZmVFcnJvciwgbWVzc2FnZSB9ID0gbm9ybWFsaXplTG9nZ2VkRXJyb3IoXG4gICAgICBlcnJvcixcbiAgICAgIGNvbmZpZz8ubG9nRXJyb3JQYXlsb2FkID09PSB0cnVlXG4gICAgKVxuXG4gICAgY29uc3QgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7IGVycm9yOiBzYWZlRXJyb3IsIG1lc3NhZ2UsIHN0YXR1cyB9XG5cbiAgICBlbWl0KHtcbiAgICAgIGNvbnRleHRTdG9yZSxcbiAgICAgIGRhdGEsXG4gICAgICBmb3JtYXRDb250ZXh0LFxuICAgICAgbGV2ZWwsXG4gICAgICBvcHRpb25zLFxuICAgICAgcmVxdWVzdCxcbiAgICAgIHNhbXBsaW5nLFxuICAgICAgc2lua3MsXG4gICAgICBzdG9yZVxuICAgIH0pXG4gIH0gY2F0Y2ggKGZhaWx1cmUpIHtcbiAgICByZXBvcnRGb3JtYXRFcnJvcihmYWlsdXJlLCBjb25maWc/Lm9uRXJyb3IpXG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBSZXF1ZXN0SWRDb25maWcgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuXG5jb25zdCBERUZBVUxUX0hFQURFUiA9ICdYLVJlcXVlc3QtSWQnXG5jb25zdCBWQUxJRF9SRVFVRVNUX0lEID0gL15bQS1aYS16MC05Ll8tXXsxLDEyOH0kL3VcblxuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZFJlcXVlc3RJZENvbmZpZyB7XG4gIGVuYWJsZWQ6IGJvb2xlYW5cbiAgZ2VuZXJhdG9yOiAoKSA9PiBzdHJpbmdcbiAgaGVhZGVyOiBzdHJpbmdcbn1cblxuLyoqXG4gKiBOb3JtYWxpc2VzIHRoZSBgcmVxdWVzdElkYCBvcHRpb24gaW50byBhIGNvbmNyZXRlIGNvbmZpZyBvYmplY3QuXG4gKlxuICogLSBgdW5kZWZpbmVkYCAvIGBmYWxzZWAg4oaSIGBudWxsYCAoZGlzYWJsZWQpXG4gKiAtIGB0cnVlYCDihpIgZGVmYXVsdCBjb25maWdcbiAqIC0gYFJlcXVlc3RJZENvbmZpZ2Ag4oaSIG1lcmdlZCB3aXRoIGRlZmF1bHRzOyBgZW5hYmxlZDogZmFsc2VgIGluc2lkZSB0aGUgb2JqZWN0IGRpc2FibGVzIHRoZSBmZWF0dXJlXG4gKi9cbmV4cG9ydCBjb25zdCByZXNvbHZlUmVxdWVzdElkQ29uZmlnID0gKFxuICByYXc/OiBib29sZWFuIHwgUmVxdWVzdElkQ29uZmlnXG4pOiBSZXNvbHZlZFJlcXVlc3RJZENvbmZpZyB8IG51bGwgPT4ge1xuICBpZiAocmF3ID09PSB1bmRlZmluZWQgfHwgcmF3ID09PSBmYWxzZSkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBpZiAocmF3ID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICBnZW5lcmF0b3I6ICgpID0+IGNyeXB0by5yYW5kb21VVUlEKCksXG4gICAgICBoZWFkZXI6IERFRkFVTFRfSEVBREVSXG4gICAgfVxuICB9XG5cbiAgLy8gT2JqZWN0IGZvcm0g4oCUIGBlbmFibGVkYCBkZWZhdWx0cyB0byBgdHJ1ZWAgd2hlbiB0aGUgb2JqZWN0IGlzIHByb3ZpZGVkXG4gIGlmIChyYXcuZW5hYmxlZCA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBlbmFibGVkOiB0cnVlLFxuICAgIGdlbmVyYXRvcjogcmF3LmdlbmVyYXRvciA/PyAoKCkgPT4gY3J5cHRvLnJhbmRvbVVVSUQoKSksXG4gICAgaGVhZGVyOiByYXcuaGVhZGVyPy50cmltKCkgfHwgREVGQVVMVF9IRUFERVJcbiAgfVxufVxuXG4vKipcbiAqIFJlYWRzIGFuIGV4aXN0aW5nIHJlcXVlc3QgSUQgZnJvbSB0aGUgaW5jb21pbmcgcmVxdWVzdCBoZWFkZXIsIG9yIGdlbmVyYXRlcyBhXG4gKiBuZXcgb25lIHVzaW5nIHRoZSBjb25maWd1cmVkIGdlbmVyYXRvci5cbiAqXG4gKiBJbmJvdW5kIHZhbHVlcyBhcmUgdmFsaWRhdGVkIGFnYWluc3QgYFZBTElEX1JFUVVFU1RfSURgIChhbHBoYW51bWVyaWMgcGx1c1xuICogYC5gLCBgX2AsIGAtYCwgMS0xMjggY2hhcnMpIGJlZm9yZSBiZWluZyB0cnVzdGVkIOKAlCByZXF1ZXN0IElEcyBmbG93IGludG8gbG9nXG4gKiBsaW5lcywgcmVzcG9uc2UgaGVhZGVycywgYW5kIGNvbnRleHQgdHJlZXMsIHNvIG1hbGZvcm1lZCBvciBvdmVyc2l6ZWRcbiAqIHZhbHVlcyBhcmUgcmVwbGFjZWQgd2l0aCBhIGZyZXNobHkgZ2VuZXJhdGVkIG9uZSByYXRoZXIgdGhhbiBlY2hvZWQgYmFjay5cbiAqL1xuZXhwb3J0IGNvbnN0IGdldE9yQ3JlYXRlUmVxdWVzdElkID0gKFxuICByZXF1ZXN0OiBSZXF1ZXN0LFxuICBjb25maWc6IFJlc29sdmVkUmVxdWVzdElkQ29uZmlnXG4pOiBzdHJpbmcgPT4ge1xuICBjb25zdCBleGlzdGluZyA9IHJlcXVlc3QuaGVhZGVycy5nZXQoY29uZmlnLmhlYWRlcilcbiAgaWYgKGV4aXN0aW5nICYmIFZBTElEX1JFUVVFU1RfSUQudGVzdChleGlzdGluZykpIHtcbiAgICByZXR1cm4gZXhpc3RpbmdcbiAgfVxuICByZXR1cm4gY29uZmlnLmdlbmVyYXRvcigpXG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgT3B0aW9ucywgU2lua0Vycm9yQ29udGV4dCB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBzZXR0bGUgfSBmcm9tICcuLi91dGlscy9zZXR0bGUnXG5pbXBvcnQgeyBmbHVzaEFsbEZpbGVTaW5rcyB9IGZyb20gJy4vZmlsZS1zaW5rJ1xuaW1wb3J0IHsgZmx1c2hUcmFuc3BvcnRzIH0gZnJvbSAnLi9pbmRleCdcblxuLyoqXG4gKiBSZXNvbHZlcyBgdHJ1ZWAgd2hlbiBgbXNgIGVsYXBzZWQgYmVmb3JlIGB3b3JrYCBzZXR0bGVkLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAqIEEgbm9uLXBvc2l0aXZlIGBtc2AgbWVhbnMgXCJzdGFydCB0aGUgd29yayBidXQgZG8gbm90IHdhaXRcIi5cbiAqL1xuZXhwb3J0IGNvbnN0IHJhY2VXaXRoVGltZW91dCA9IGFzeW5jIChcbiAgd29yazogUHJvbWlzZTx1bmtub3duPixcbiAgbXM6IG51bWJlclxuKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gIC8vIFRoZSBzaW5rcyByZXBvcnQgYSBmYWlsZWQgZmx1c2ggdGhlbXNlbHZlczsgaGVyZSBpdCBvbmx5IGNvdW50cyBhc1xuICAvLyBzZXR0bGVkLlxuICBjb25zdCBzZXR0bGVkID0gc2V0dGxlKHdvcmspXG5cbiAgaWYgKG1zIDw9IDApIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgY29uc3QgdGltZW91dCA9IFByb21pc2Uud2l0aFJlc29sdmVyczwndGltZW91dCc+KClcbiAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHRpbWVvdXQucmVzb2x2ZSgndGltZW91dCcpLCBtcylcbiAgLy8gTmV2ZXIgaG9sZCB0aGUgZXZlbnQgbG9vcCBvcGVuIGp1c3QgdG8gb2JzZXJ2ZSBhIGZsdXNoIHRoYXQgaXMgcmFjaW5nXG4gIC8vIGFuIGV4aXRpbmcgcHJvY2Vzcy5cbiAgdGltZXIudW5yZWY/LigpXG4gIGNvbnN0IHdpbm5lciA9IGF3YWl0IFByb21pc2UucmFjZShbc2V0dGxlZCwgdGltZW91dC5wcm9taXNlXSlcbiAgY2xlYXJUaW1lb3V0KHRpbWVyKVxuICByZXR1cm4gd2lubmVyID09PSAndGltZW91dCdcbn1cblxuLyoqXG4gKiBSZXBvcnRzIGEgc2h1dGRvd24gZmx1c2ggdGhhdCByYW4gb3V0IG9mIHRpbWUg4oCUIHRocm91Z2ggYG9uRXJyb3JgIHdoZW4gdGhlXG4gKiBob29rIGV4aXN0cywgb3RoZXJ3aXNlIG9uIHN0ZGVyciwgYnV0IG5ldmVyIGJvdGguXG4gKi9cbmV4cG9ydCBjb25zdCByZXBvcnRTaHV0ZG93blRpbWVvdXQgPSAoXG4gIG9uRXJyb3I6ICgoY29udGV4dDogU2lua0Vycm9yQ29udGV4dCkgPT4gdm9pZCkgfCB1bmRlZmluZWQsXG4gIHRpbWVvdXRNczogbnVtYmVyXG4pOiB2b2lkID0+IHtcbiAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoXG4gICAgYFtsb2dpeGx5c2lhXSBzaHV0ZG93biBmbHVzaCBkaWQgbm90IGNvbXBsZXRlIHdpdGhpbiAke3RpbWVvdXRNc31tczsgc29tZSB0cmFuc3BvcnQgb3IgZmlsZSB3cml0ZXMgbWF5IG5vdCBoYXZlIGJlZW4gZmx1c2hlZC5gXG4gIClcblxuICBpZiAob25FcnJvcikge1xuICAgIHRyeSB7XG4gICAgICBvbkVycm9yKHsgZXJyb3IsIHNpbms6ICdzaHV0ZG93bicgfSlcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIFN3YWxsb3cgZXJyb3JzIHRocm93biBieSB0aGUgaG9vayBpdHNlbGYuXG4gICAgfVxuICAgIHJldHVyblxuICB9XG5cbiAgY29uc29sZS5lcnJvcihlcnJvci5tZXNzYWdlKVxufVxuXG4vKiogRHJhaW5zIGV2ZXJ5IHRyYW5zcG9ydCBhbmQgZXZlcnkgcmVnaXN0ZXJlZCBmaWxlIHNpbmsuICovXG5leHBvcnQgY29uc3QgZmx1c2hBbGwgPSBhc3luYyAob3B0aW9uczogT3B0aW9ucyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoW2ZsdXNoVHJhbnNwb3J0cyhvcHRpb25zKSwgZmx1c2hBbGxGaWxlU2lua3MoKV0pXG59XG4iLAogICAgImltcG9ydCB7IGtleU9mIH0gZnJvbSAnLi4vY29udGV4dC9yZXF1ZXN0LWNvbnRleHQnXG5pbXBvcnQgdHlwZSB7IFJlcXVlc3RDb250ZXh0U3RvcmUgfSBmcm9tICcuLi9jb250ZXh0L3JlcXVlc3QtY29udGV4dCdcbmltcG9ydCB0eXBlIHsgTG9nZ2VyLCBPcHRpb25zLCBTdG9yZURhdGEgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIFdlYlNvY2tldExpa2Uge1xuICByZWFkb25seSBkYXRhPzogeyBzdG9yZT86IHsgbG9nZ2VyPzogTG9nZ2VyIH0gfVxuICByZWFkb25seSBpZD86IHN0cmluZ1xuICByZWFkb25seSByYXc/OiBvYmplY3Rcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXc0hhbmRsZXJIb29rczxcbiAgVE1lc3NhZ2UgPSB1bmtub3duLFxuICBUV3MgZXh0ZW5kcyBXZWJTb2NrZXRMaWtlID0gV2ViU29ja2V0TGlrZVxuPiB7XG4gIGNsb3NlPzogKHdzOiBUV3MsIGNvZGU/OiBudW1iZXIsIHJlYXNvbj86IHN0cmluZykgPT4gdm9pZFxuICBtZXNzYWdlPzogKHdzOiBUV3MsIG1lc3NhZ2U6IFRNZXNzYWdlKSA9PiB2b2lkXG4gIG9wZW4/OiAod3M6IFRXcykgPT4gdm9pZFxufVxuXG4vLyBTeW50aGV0aWMgcmVxdWVzdHMgYXJlIG9ubHkgcmVhZCAobWV0aG9kL3VybCkgYnkgdGhlIGxvZyBwaXBlbGluZSwgbmV2ZXIgbXV0YXRlZCwgc28gY2FjaGluZ1xuLy8gb25lIHBlciBwYXRoIGF2b2lkcyBhbGxvY2F0aW5nIGEgZnJlc2ggUmVxdWVzdCBvbiBldmVyeSBXUyBvcGVuL21lc3NhZ2UvY2xvc2UgbG9nIGV2ZW50LlxuY29uc3Qgd3NSZXF1ZXN0Q2FjaGUgPSBuZXcgTWFwPHN0cmluZywgUmVxdWVzdD4oKVxuXG5jb25zdCB3c1N5bnRoZXRpY1JlcXVlc3QgPSAocGF0aDogc3RyaW5nKTogUmVxdWVzdCA9PiB7XG4gIGxldCByZXF1ZXN0ID0gd3NSZXF1ZXN0Q2FjaGUuZ2V0KHBhdGgpXG4gIGlmICghcmVxdWVzdCkge1xuICAgIHJlcXVlc3QgPSBuZXcgUmVxdWVzdChgaHR0cDovL2xvZ2l4bHlzaWEubG9jYWwke3BhdGh9YCwgeyBtZXRob2Q6ICdXUycgfSlcbiAgICB3c1JlcXVlc3RDYWNoZS5zZXQocGF0aCwgcmVxdWVzdClcbiAgfVxuICByZXR1cm4gcmVxdWVzdFxufVxuXG5jb25zdCBwYXlsb2FkVHlwZU9mID0gKG1lc3NhZ2U6IHVua25vd24pOiBzdHJpbmcgPT4ge1xuICBpZiAobWVzc2FnZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyIHx8IEFycmF5QnVmZmVyLmlzVmlldyhtZXNzYWdlKSkge1xuICAgIHJldHVybiAnYmluYXJ5J1xuICB9XG4gIGlmICh0eXBlb2YgbWVzc2FnZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gJ3N0cmluZydcbiAgfVxuICByZXR1cm4gdHlwZW9mIG1lc3NhZ2Vcbn1cblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVdzSGFuZGxlcldyYXBwZXIgPSAoXG4gIG9wdGlvbnM6IE9wdGlvbnMsXG4gIGxvZ2dlcjogTG9nZ2VyLFxuICBjb250ZXh0U3RvcmU6IFJlcXVlc3RDb250ZXh0U3RvcmVcbikgPT4ge1xuICBjb25zdCB3c1RpbWluZ3MgPSBuZXcgV2Vha01hcDxvYmplY3QsIGJpZ2ludD4oKVxuXG4gIGNvbnN0IGxvZ1dzID0gKFxuICAgIGxldmVsOiAnSU5GTycgfCAnV0FSTklORycgfCAnRVJST1InLFxuICAgIHdzOiBXZWJTb2NrZXRMaWtlLFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgZXh0cmE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiB2b2lkID0+IHtcbiAgICBjb25zdCBiZWZvcmVUaW1lID0gd3NUaW1pbmdzLmdldChrZXlPZih3cykpID8/IHByb2Nlc3MuaHJ0aW1lLmJpZ2ludCgpXG4gICAgY29uc3Qgc3RvcmU6IFN0b3JlRGF0YSA9IHsgYmVmb3JlVGltZSB9XG4gICAgLy8gUmVhZC1vbmx5OiBpbW1lZGlhdGVseSBzcHJlYWQgYmVsb3cgaW50byBhIG5ldyBvYmplY3QsIG5ldmVyIHJldGFpbmVkIG9yIG11dGF0ZWQuXG4gICAgY29uc3QgYWNjdW11bGF0ZWQgPSBjb250ZXh0U3RvcmUucGVla0NvbnRleHQod3MpXG4gICAgY29uc3QgY29udGV4dCA9XG4gICAgICBPYmplY3Qua2V5cyhhY2N1bXVsYXRlZCkubGVuZ3RoID4gMCB8fCBleHRyYVxuICAgICAgICA/IHsgLi4uYWNjdW11bGF0ZWQsIC4uLmV4dHJhLCB3c0lkOiB3cy5pZCB9XG4gICAgICAgIDogeyB3c0lkOiB3cy5pZCB9XG5cbiAgICBsb2dnZXIubG9nKFxuICAgICAgbGV2ZWwsXG4gICAgICB3c1N5bnRoZXRpY1JlcXVlc3QocGF0aCksXG4gICAgICB7IGNvbnRleHQsIG1lc3NhZ2UsIHN0YXR1czogMjAwIH0sXG4gICAgICBzdG9yZVxuICAgIClcbiAgfVxuXG4gIHJldHVybiA8XG4gICAgVE1lc3NhZ2UsXG4gICAgVFdzIGV4dGVuZHMgV2ViU29ja2V0TGlrZSxcbiAgICBjb25zdCBUSG9va3MgZXh0ZW5kcyBXc0hhbmRsZXJIb29rczxUTWVzc2FnZSwgVFdzPlxuICA+KFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBob29rczogVEhvb2tzXG4gICk6IFRIb29rcyA9PiB7XG4gICAgaWYgKHR5cGVvZiBwYXRoICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgXCJsb2dpeGx5c2lhOiB3cmFwV3MocGF0aCwgaG9va3MpIGV4cGVjdHMgdGhlIHJvdXRlIHBhdGggZmlyc3QsIGUuZy4gcGx1Z2luLndyYXBXcygnL2NoYXQnLCB7IG9wZW4od3MpIHt9IH0pXCJcbiAgICAgIClcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmhvb2tzLFxuICAgICAgY2xvc2Uod3MsIGNvZGUsIHJlYXNvbikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGhvb2tzLmNsb3NlPy4od3MsIGNvZGUsIHJlYXNvbilcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBpZiAob3B0aW9ucy5jb25maWc/LmRpc2FibGVXZWJTb2NrZXRMb2dnaW5nICE9PSB0cnVlKSB7XG4gICAgICAgICAgICBjb25zdCBleHRyYTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fVxuICAgICAgICAgICAgaWYgKGNvZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBleHRyYS5jb2RlID0gY29kZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlYXNvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIGV4dHJhLnJlYXNvbiA9IHJlYXNvblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbG9nV3MoXG4gICAgICAgICAgICAgICdJTkZPJyxcbiAgICAgICAgICAgICAgd3MsXG4gICAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICAgICdXZWJTb2NrZXQgY2xvc2VkJyxcbiAgICAgICAgICAgICAgT2JqZWN0LmtleXMoZXh0cmEpLmxlbmd0aCA+IDAgPyBleHRyYSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgKVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb250ZXh0U3RvcmUuY2xlYXJDb250ZXh0KHdzKVxuICAgICAgICAgIHdzVGltaW5ncy5kZWxldGUoa2V5T2Yod3MpKVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgbWVzc2FnZSh3cywgbWVzc2FnZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGhvb2tzLm1lc3NhZ2U/Lih3cywgbWVzc2FnZSlcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBpZiAob3B0aW9ucy5jb25maWc/LmRpc2FibGVXZWJTb2NrZXRMb2dnaW5nICE9PSB0cnVlKSB7XG4gICAgICAgICAgICBsb2dXcygnSU5GTycsIHdzLCBwYXRoLCAnV2ViU29ja2V0IG1lc3NhZ2UnLCB7XG4gICAgICAgICAgICAgIHBheWxvYWRUeXBlOiBwYXlsb2FkVHlwZU9mKG1lc3NhZ2UpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIG9wZW4od3MpIHtcbiAgICAgICAgd3NUaW1pbmdzLnNldChrZXlPZih3cyksIHByb2Nlc3MuaHJ0aW1lLmJpZ2ludCgpKVxuICAgICAgICB0cnkge1xuICAgICAgICAgIGhvb2tzLm9wZW4/Lih3cylcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBpZiAob3B0aW9ucy5jb25maWc/LmRpc2FibGVXZWJTb2NrZXRMb2dnaW5nICE9PSB0cnVlKSB7XG4gICAgICAgICAgICBsb2dXcygnSU5GTycsIHdzLCBwYXRoLCAnV2ViU29ja2V0IG9wZW5lZCcpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBhcyBUSG9va3NcbiAgfVxufVxuIiwKICAgICIvKiogVGhlIGNsaWVudC1zYWZlIHZpZXcgb2YgYW4ge0BsaW5rIEh0dHBFcnJvcn0g4oCUIGV2ZXJ5dGhpbmcgYnV0IGBpbnRlcm5hbGAuICovXG5leHBvcnQgaW50ZXJmYWNlIEh0dHBFcnJvclBheWxvYWQge1xuICBjb2RlPzogc3RyaW5nXG4gIGZpeD86IHN0cmluZ1xuICBsaW5rPzogc3RyaW5nXG4gIG1lc3NhZ2U6IHN0cmluZ1xuICBzdGF0dXM6IG51bWJlclxuICB3aHk/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBIdHRwRXJyb3JJbml0IHtcbiAgLyoqXG4gICAqIFN0YWJsZSwgbWFjaGluZS1yZWFkYWJsZSBpZGVudGlmaWVyIHRoZSBjbGllbnQgY2FuIGJyYW5jaCBvbiwgZS5nLlxuICAgKiBgUEFZTUVOVF9ERUNMSU5FRGAuIFVubGlrZSBgbWVzc2FnZWAsIGl0IGlzIHNhZmUgdG8gZGVwZW5kIG9uOiByZXdvcmRpbmdcbiAgICogdGhlIG1lc3NhZ2UgZG9lcyBub3QgYnJlYWsgYSBjYWxsZXIuXG4gICAqL1xuICBjb2RlPzogc3RyaW5nXG4gIC8qKiBXaGF0IHRoZSBjYWxsZXIgc2hvdWxkIGRvIGFib3V0IGl0LCBpbiBwbGFpbiBsYW5ndWFnZS4gKi9cbiAgZml4Pzogc3RyaW5nXG4gIC8qKlxuICAgKiBEaWFnbm9zdGljcyBmb3IgeW91LCBub3QgZm9yIHRoZSBjYWxsZXI6IGEgcXVlcnksIGFuIHVwc3RyZWFtIGJvZHksIGFuIGlkLlxuICAgKiBMb2dnZWQgaW4gZnVsbCwgbmV2ZXIgc2VyaWFsaXplZCBpbnRvIHRoZSByZXNwb25zZS5cbiAgICovXG4gIGludGVybmFsPzogdW5rbm93blxuICAvKiogRG9jdW1lbnRhdGlvbiBVUkwgZm9yIHRoaXMgZmFpbHVyZS4gKi9cbiAgbGluaz86IHN0cmluZ1xuICAvKiogV2h5IHRoZSByZXF1ZXN0IGZhaWxlZCwgaW4gcGxhaW4gbGFuZ3VhZ2UuICovXG4gIHdoeT86IHN0cmluZ1xufVxuXG4vKipcbiAqIEFuIEhUVFAgZXJyb3IgY2FycnlpbmcgdGhlIGNvbnRleHQgdGhhdCBtYWtlcyBhIGZhaWx1cmUgYWN0aW9uYWJsZS5cbiAqXG4gKiBgY29kZWAsIGB3aHlgLCBgZml4YCwgYW5kIGBsaW5rYCBhcHBlYXIgaW4gYm90aCB0aGUgbG9nIGFuZCB0aGUgcmVzcG9uc2UuXG4gKiBgaW50ZXJuYWxgIGFwcGVhcnMgb25seSBpbiB0aGUgbG9nIOKAlCBpdCBpcyBub24tZW51bWVyYWJsZSBhbmQgZXhjbHVkZWQgZnJvbVxuICogYHRvSlNPTigpYCwgc28gbm8gc2VyaWFsaXplciBjYW4gbGVhayBpdCBpbnRvIGEgcmVzcG9uc2UgYm9keS5cbiAqXG4gKiBgYGB0c1xuICogdGhyb3cgbmV3IEh0dHBFcnJvcig0MDIsICdDYXJkIGRlY2xpbmVkJywge1xuICogICBjb2RlOiAnUEFZTUVOVF9ERUNMSU5FRCcsXG4gKiAgIHdoeTogJ1RoZSBpc3N1aW5nIGJhbmsgcmVqZWN0ZWQgdGhlIGNoYXJnZS4nLFxuICogICBmaXg6ICdUcnkgYSBkaWZmZXJlbnQgY2FyZCwgb3IgY29udGFjdCB5b3VyIGJhbmsuJyxcbiAqICAgbGluazogJ2h0dHBzOi8vZG9jcy5leGFtcGxlLmNvbS9lcnJvcnMvcGF5bWVudC1kZWNsaW5lZCcsXG4gKiAgIGludGVybmFsOiB7IGdhdGV3YXlDb2RlOiAnZG9fbm90X2hvbm9yJywgY2hhcmdlSWQgfVxuICogfSlcbiAqIGBgYFxuICpcbiAqIEEgYmFyZSBgbmV3IEh0dHBFcnJvcig0MDQsICdOb3QgZm91bmQnKWAgYmVoYXZlcyBleGFjdGx5IGFzIGJlZm9yZTogdGhlXG4gKiByZXNwb25zZSBib2R5IGlzIHRoZSBwbGFpbiBtZXNzYWdlLiBPbmx5IGFuIGVycm9yIHRoYXQgY2FycmllcyBhdCBsZWFzdCBvbmVcbiAqIGNsaWVudC1mYWNpbmcgZmllbGQgcmVzcG9uZHMgYXMgSlNPTi5cbiAqL1xuLyoqXG4gKiBTdGF0dXNlcyB0aGUgRmV0Y2ggc3BlYyBmb3JiaWRzIGEgYm9keSBvbiDigJQgYFJlc3BvbnNlLmpzb25gIHRocm93cyBmb3JcbiAqIHRoZXNlLCBhcyBpdCBkb2VzIGZvciBhbnl0aGluZyBvdXRzaWRlIDIwMC01OTkuXG4gKi9cbmNvbnN0IE5VTExfQk9EWV9TVEFUVVNFUyA9IG5ldyBTZXQoWzEwMSwgMTAzLCAyMDQsIDIwNSwgMzA0XSlcbmNvbnN0IE1JTl9SRVNQT05TRV9TVEFUVVMgPSAyMDBcbmNvbnN0IE1BWF9SRVNQT05TRV9TVEFUVVMgPSA1OTlcbmNvbnN0IEZBTExCQUNLX1JFU1BPTlNFX1NUQVRVUyA9IDUwMFxuXG4vKiogRmFsbHMgYmFjayB0byA1MDAgZm9yIGEgc3RhdHVzIGBSZXNwb25zZS5qc29uYCB3b3VsZCByZWplY3QuICovXG5jb25zdCByZXNwb25zZVN0YXR1cyA9IChzdGF0dXM6IG51bWJlcik6IG51bWJlciA9PlxuICBzdGF0dXMgPj0gTUlOX1JFU1BPTlNFX1NUQVRVUyAmJlxuICBzdGF0dXMgPD0gTUFYX1JFU1BPTlNFX1NUQVRVUyAmJlxuICAhTlVMTF9CT0RZX1NUQVRVU0VTLmhhcyhzdGF0dXMpXG4gICAgPyBzdGF0dXNcbiAgICA6IEZBTExCQUNLX1JFU1BPTlNFX1NUQVRVU1xuXG5leHBvcnQgY2xhc3MgSHR0cEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICByZWFkb25seSBjb2RlPzogc3RyaW5nXG4gIHJlYWRvbmx5IGZpeD86IHN0cmluZ1xuICAvKiogTG9nLW9ubHkgZGlhZ25vc3RpY3M7IHNlZSB0aGUgY2xhc3MgZG9jLiAqL1xuICBkZWNsYXJlIHJlYWRvbmx5IGludGVybmFsPzogdW5rbm93blxuICByZWFkb25seSBsaW5rPzogc3RyaW5nXG4gIHJlYWRvbmx5IHN0YXR1czogbnVtYmVyXG4gIC8qKlxuICAgKiBQcmVzZW50IG9ubHkgd2hlbiB0aGUgZXJyb3IgY2FycmllcyBhIGNsaWVudC1mYWNpbmcgZmllbGQsIHNvIGEgcGxhaW5cbiAgICogYG5ldyBIdHRwRXJyb3IoNDA0LCAnTm90IGZvdW5kJylgIHN0aWxsIHJlbmRlcnMgYXMgdGhlIGJhcmUgbWVzc2FnZS5cbiAgICogRWx5c2lhIGNhbGxzIGl0IHRvIGJ1aWxkIHRoZSByZXNwb25zZS5cbiAgICovXG4gIGRlY2xhcmUgcmVhZG9ubHkgdG9SZXNwb25zZT86ICgpID0+IFJlc3BvbnNlXG4gIHJlYWRvbmx5IHdoeT86IHN0cmluZ1xuXG4gIGNvbnN0cnVjdG9yKHN0YXR1czogbnVtYmVyLCBtZXNzYWdlOiBzdHJpbmcsIGluaXQ6IEh0dHBFcnJvckluaXQgPSB7fSkge1xuICAgIHN1cGVyKG1lc3NhZ2UpXG4gICAgdGhpcy5zdGF0dXMgPSBzdGF0dXNcbiAgICB0aGlzLmNvZGUgPSBpbml0LmNvZGVcbiAgICB0aGlzLmZpeCA9IGluaXQuZml4XG4gICAgdGhpcy5saW5rID0gaW5pdC5saW5rXG4gICAgdGhpcy53aHkgPSBpbml0LndoeVxuXG4gICAgLy8gU2V0IGV4cGxpY2l0bHkg4oCUIGEgbmF0aXZlIHN1YmNsYXNzIG90aGVyd2lzZSByZXBvcnRzIHRoZSBnZW5lcmljXG4gICAgLy8gXCJFcnJvclwiLCBhbmQgdGhlIGNvbnN0cnVjdG9yLW5hbWUgZmFsbGJhY2sgYnJlYWtzIHVuZGVyIG1pbmlmaWNhdGlvbi5cbiAgICAvLyBUaGVuIG1hZGUgbm9uLWVudW1lcmFibGUgdG8gbWF0Y2ggYEVycm9yLnByb3RvdHlwZS5uYW1lYC5cbiAgICB0aGlzLm5hbWUgPSAnSHR0cEVycm9yJ1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnbmFtZScsIHsgZW51bWVyYWJsZTogZmFsc2UgfSlcblxuICAgIC8vIE5vbi1lbnVtZXJhYmxlIHNvIGBKU09OLnN0cmluZ2lmeWAsIHNwcmVhZHMsIGFuZCBmcmFtZXdvcmsgc2VyaWFsaXplcnNcbiAgICAvLyB0aGF0IHdhbGsgb3duIGtleXMgY2Fubm90IHBpY2sgaXQgdXAuIFByb3BlcnR5IGFjY2VzcyBzdGlsbCB3b3Jrcywgd2hpY2hcbiAgICAvLyBpcyBhbGwgdGhlIGxvZyBwaXBlbGluZSBuZWVkcy5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2ludGVybmFsJywge1xuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB2YWx1ZTogaW5pdC5pbnRlcm5hbCxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZVxuICAgIH0pXG5cbiAgICAvLyBFbHlzaWEgcmVuZGVycyBhIHRocm93biBlcnJvciB3aXRoIGB0b1Jlc3BvbnNlKClgIHdoZW4gaXQgaGFzIG9uZSwgYW5kXG4gICAgLy8gZmFsbHMgYmFjayB0byB0aGUgcGxhaW4gbWVzc2FnZSBvdGhlcndpc2UuIERlZmluaW5nIGl0IG9ubHkgd2hlbiB0aGVyZVxuICAgIC8vIGlzIHNvbWV0aGluZyBzdHJ1Y3R1cmVkIHRvIHNheSBrZWVwcyBwbGFpbiBlcnJvcnMgYnl0ZS1pZGVudGljYWwgdG9cbiAgICAvLyB0aGVpciBwcmUtYEh0dHBFcnJvckluaXRgIGJlaGF2aW91ci5cbiAgICBjb25zdCBoYXNDbGllbnRGaWVsZHMgPVxuICAgICAgaW5pdC5jb2RlICE9PSB1bmRlZmluZWQgfHxcbiAgICAgIGluaXQud2h5ICE9PSB1bmRlZmluZWQgfHxcbiAgICAgIGluaXQuZml4ICE9PSB1bmRlZmluZWQgfHxcbiAgICAgIGluaXQubGluayAhPT0gdW5kZWZpbmVkXG5cbiAgICBpZiAoaGFzQ2xpZW50RmllbGRzKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3RvUmVzcG9uc2UnLCB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIHZhbHVlOiAoKTogUmVzcG9uc2UgPT5cbiAgICAgICAgICBSZXNwb25zZS5qc29uKHRoaXMudG9KU09OKCksIHtcbiAgICAgICAgICAgIHN0YXR1czogcmVzcG9uc2VTdGF0dXModGhpcy5zdGF0dXMpXG4gICAgICAgICAgfSksXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY2xpZW50LXNhZmUgcGF5bG9hZC4gYGludGVybmFsYCBpcyBuZXZlciBwYXJ0IG9mIGl0OyB1bnNldCBmaWVsZHMgYXJlXG4gICAqIGB1bmRlZmluZWRgIGFuZCBzbyBhcmUgZHJvcHBlZCBieSBgSlNPTi5zdHJpbmdpZnlgLlxuICAgKi9cbiAgdG9KU09OKCk6IEh0dHBFcnJvclBheWxvYWQge1xuICAgIHJldHVybiB7XG4gICAgICBjb2RlOiB0aGlzLmNvZGUsXG4gICAgICBmaXg6IHRoaXMuZml4LFxuICAgICAgbGluazogdGhpcy5saW5rLFxuICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlLFxuICAgICAgc3RhdHVzOiB0aGlzLnN0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QixJQUFJLEVBQVMsQ0FBVSxFQUl6QyxFQUFNLFdBQWEsRUFDbkIsRUFBTyxhQUFhLENBQU8sRUFDdkIsRUFBaUIsQ0FDbkIsSUFBTSxFQUFZLEdBQXFCLEVBQVMsQ0FBZSxFQUMvRCxFQUFhLGFBQWEsRUFBUyxDQUFFLFdBQVUsQ0FBQyxFQUdsRCxHQUFJLEVBQ0YsR0FBc0IsRUFBVyxFQUFjLEVBQVMsQ0FBVyxFQUdyRSxHQUFJLEVBQ0YsRUFBYyxVQUFVLEVBQTBCLENBQU8sQ0FBQyxFQUU3RCxFQUNBLGNBQWMsRUFBRyxVQUFTLE1BQUssY0FBZSxDQUM3QyxHQUFJLENBQ0YsR0FBSSxFQUFPLElBQUksQ0FBTyxFQUNwQixPQUdGLElBQU0sRUFBUyxHQUFxQixFQUFJLE9BQVEsQ0FBUSxFQUlsRCxFQUFRLEVBQ1osRUFDQSxFQUFJLFFBQ0osRUFDQSxhQUFvQixTQUFXLEVBQVMsUUFBVSxNQUNwRCxFQUdBLEdBRkEsRUFBTyxJQUFJLENBQU8sRUFFZCxFQUFhLElBQUksQ0FBTyxFQUMxQixPQUdGLEVBQWUsRUFBUyxFQUFRLENBQUssU0FLckMsQ0FDQSxFQUFpQixHQUVwQixFQUNBLFFBQVEsRUFBRyxVQUFTLFFBQU8sU0FBVSxDQUNwQyxHQUFJLENBQ0YsRUFBTyxnQkFDTCxFQUNBLEVBQ0EsR0FBVyxFQUFTLEVBQUksUUFBUyxDQUFLLENBQ3hDLFNBQ0EsQ0FDQSxFQUFrQixPQUFPLENBQU8sRUFDaEMsRUFBYSxhQUFhLENBQU8sRUFDakMsRUFBaUIsR0FFcEIsRUFLQSxnQkFBZ0IsS0FBVyxDQUMxQixJQUFRLFVBQVMsT0FBUSxFQUN6QixHQUFJLEVBQU8sSUFBSSxDQUFPLEVBQ3BCLE9BR0YsR0FBSSxDQUNGLElBQU0sRUFBUyxFQUFjLEVBQUksTUFBTSxFQUNqQyxFQUFRLEVBQWEsRUFBUyxFQUFJLFFBQVMsQ0FBTSxFQUN2RCxFQUFPLElBQUksQ0FBTyxFQUlsQixJQUFNLEVBQVEsVUFBVyxFQUFVLEVBQVEsTUFBUSxPQUNuRCxHQUFJLElBQVUsUUFBYSxHQUFVLElBQ25DLEVBQU8sZ0JBQWdCLEVBQVMsRUFBTyxDQUFLLEVBQ3ZDLFFBQUksQ0FBQyxFQUFhLElBQUksQ0FBTyxFQUNsQyxFQUFlLEVBQVMsRUFBUSxDQUFLLFNBRXZDLENBQ0EsRUFBa0IsT0FBTyxDQUFPLEVBQ2hDLEVBQWEsYUFBYSxDQUFPLEVBQ2pDLEVBQWlCLEdBRXBCLEVBQ0EsR0FBRyxRQUFRLEVBRWQsT0FBTyxPQUFPLE9BQU8sR0FBUSxDQUFFLFFBQU8sQ0FBQyxHQVE1QixHQUFrQixNQUM3QixHQUNFLFFBQVEsSUFBK0IsQ0FBQyxJQUN4QixDQUVsQixHQURBLE1BQU0sR0FBUyxDQUFPLEVBQ2xCLEVBQ0YsTUFBTSxRQUFRLFdBQVcsQ0FBQyxHQUFnQixDQUFPLEVBQUcsR0FBa0IsQ0FBQyxDQUFDLEdBNEM3RCxNQUNGLEdBQTRDIiwKICAiZGVidWdJZCI6ICJDNUZFNTIyOUQzNUI2QjRBNjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==
7
+ //# debugId=938B9E0FFF5ECCF064756E2164756E21
8
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2luZGV4LnRzIiwgInNyYy91dGlscy9yb3RhdGlvbi50cyIsICJzcmMvY29uZmlnL3Jlc29sdmUtb3B0aW9ucy50cyIsICJzcmMvdXRpbHMvcmVwb3J0LnRzIiwgInNyYy9jb250ZXh0L2VucmljaC50cyIsICJzcmMvY29udGV4dC9yZXF1ZXN0LWNvbnRleHQudHMiLCAic3JjL2NvbnRleHQvc3RvcmFnZS50cyIsICJzcmMvZXh0ZW5zaW9ucy9iYW5uZXIudHMiLCAic3JjL2V4dGVuc2lvbnMvaW5kZXgudHMiLCAic3JjL2hlbHBlcnMvc3RhdHVzLnRzIiwgInNyYy9sb2dnZXIvaW5kZXgudHMiLCAic3JjL3NhbXBsaW5nL2dsb2IudHMiLCAic3JjL3NhbXBsaW5nL2luZGV4LnRzIiwgInNyYy91dGlscy9kdXJhdGlvbi50cyIsICJzcmMvdXRpbHMvcmVkYWN0LnRzIiwgInNyYy9sb2dnZXIvY3JlYXRlLWxvZ2dlci50cyIsICJzcmMvdXRpbHMvZXJyb3IudHMiLCAic3JjL291dHB1dC9pbmRleC50cyIsICJzcmMvb3V0cHV0L2ZpbGUtc2luay50cyIsICJzcmMvb3V0cHV0L2ZzLnRzIiwgInNyYy9vdXRwdXQvcm90YXRpb24tbWFuYWdlci50cyIsICJzcmMvb3V0cHV0L2tleWVkLW11dGV4LnRzIiwgInNyYy9vdXRwdXQvZmlsZS50cyIsICJzcmMvbG9nZ2VyL2VtaXQudHMiLCAic3JjL2xvZ2dlci9oYW5kbGUtaHR0cC1lcnJvci50cyIsICJzcmMvbWlkZGxld2FyZS9yZXF1ZXN0LWlkLnRzIiwgInNyYy9vdXRwdXQvc2h1dGRvd24udHMiLCAic3JjL3dlYnNvY2tldC93cmFwLXdzLnRzIiwgInNyYy9lcnJvcnMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiaW1wb3J0IHsgRWx5c2lhIH0gZnJvbSAnZWx5c2lhJ1xuaW1wb3J0IHsgcmVzb2x2ZU9wdGlvbnMgfSBmcm9tICcuL2NvbmZpZy9yZXNvbHZlLW9wdGlvbnMnXG5pbXBvcnQge1xuICBhcHBseVJlcXVlc3RFbnJpY2hlcnMsXG4gIGFwcGx5UmVzcG9uc2VFbnJpY2hlcnMsXG4gIHJlc29sdmVFbnJpY2hlcnNcbn0gZnJvbSAnLi9jb250ZXh0L2VucmljaCdcbmltcG9ydCB7IGNyZWF0ZVJlcXVlc3RDb250ZXh0U3RvcmUgfSBmcm9tICcuL2NvbnRleHQvcmVxdWVzdC1jb250ZXh0J1xuaW1wb3J0IHsgbG9nZ2VyU3RvcmFnZSwgbm9vcFJlcXVlc3RMb2dnZXIgfSBmcm9tICcuL2NvbnRleHQvc3RvcmFnZSdcbmltcG9ydCB7IHN0YXJ0U2VydmVyIH0gZnJvbSAnLi9leHRlbnNpb25zJ1xuaW1wb3J0IHtcbiAgZ2V0U3RhdHVzQ29kZSxcbiAgaXNTdGF0dXNSZXNwb25zZSxcbiAgbGV2ZWxGb3JTdGF0dXNcbn0gZnJvbSAnLi9oZWxwZXJzL3N0YXR1cydcbmltcG9ydCB0eXBlIHtcbiAgTG9nRmllbGRzLFxuICBMb2dpeGx5c2lhU3RvcmUsXG4gIExvZ0xldmVsLFxuICBPcHRpb25zLFxuICBSZXF1ZXN0U2NvcGVkTG9nZ2VyLFxuICBTdG9yZURhdGFcbn0gZnJvbSAnLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgY3JlYXRlUGx1Z2luTG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXInXG5pbXBvcnQgeyByZXBvcnRGb3JtYXRFcnJvciwgcmVzb2x2ZVNpbmtzLCBzaG91bGRMb2cgfSBmcm9tICcuL2xvZ2dlci9lbWl0J1xuaW1wb3J0IHsgZXJyb3JTdGF0dXMgfSBmcm9tICcuL2xvZ2dlci9oYW5kbGUtaHR0cC1lcnJvcidcbmltcG9ydCB7XG4gIGdldE9yQ3JlYXRlUmVxdWVzdElkLFxuICByZXNvbHZlUmVxdWVzdElkQ29uZmlnXG59IGZyb20gJy4vbWlkZGxld2FyZS9yZXF1ZXN0LWlkJ1xuaW1wb3J0IHsgY2xvc2VUcmFuc3BvcnRzIH0gZnJvbSAnLi9vdXRwdXQnXG5pbXBvcnQgeyBjbG9zZUFsbEZpbGVTaW5rcyB9IGZyb20gJy4vb3V0cHV0L2ZpbGUtc2luaydcbmltcG9ydCB7XG4gIGZsdXNoQWxsLFxuICByYWNlV2l0aFRpbWVvdXQsXG4gIHJlcG9ydFNodXRkb3duVGltZW91dFxufSBmcm9tICcuL291dHB1dC9zaHV0ZG93bidcbmltcG9ydCB7IGVsYXBzZWRNcyB9IGZyb20gJy4vdXRpbHMvZHVyYXRpb24nXG5pbXBvcnQgeyBjcmVhdGVXc0hhbmRsZXJXcmFwcGVyIH0gZnJvbSAnLi93ZWJzb2NrZXQvd3JhcC13cydcblxuLyoqXG4gKiBFbXB0eSBzaW5nbGV0b24gc2xvdHMgbXVzdCBub3QgdXNlIGBSZWNvcmQ8c3RyaW5nLCBuZXZlcj5gOiBpbnRlcnNlY3RpbmcgdGhhdCB3aXRoIEVseXNpYSdzIGBDb250ZXh0YFxuICogbWFrZXMgZXZlcnkga2V5IChpbmNsdWRpbmcgYHN0b3JlYCkgYmVjb21lIGBuZXZlcmAgYmVjYXVzZSBlYWNoIGtleSBpcyBtZXJnZWQgd2l0aCBgbmV2ZXJgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVtcHR5RWx5c2lhU2xvdCB7XG4gIHJlYWRvbmx5IF9fbG9naXhseXNpYUVtcHR5PzogbmV2ZXJcbn1cblxuY29uc3QgREVGQVVMVF9TVEFUVVMgPSAyMDBcbmNvbnN0IFNFUlZFUl9FUlJPUl9TVEFUVVMgPSA1MDBcblxuLyoqXG4gKiBUaGUgc3RhdHVzIHRoZSBjbGllbnQgYWN0dWFsbHkgc2Vlcy4gQSBgc3RhdHVzKClgIHJlc3VsdCBjYXJyaWVzIGl0cyBvd25cbiAqIGNvZGUuIEEgcmV0dXJuZWQgYFJlc3BvbnNlYCBrZWVwcyBpdHMgb3duIHN0YXR1cyB1bmxlc3MgdGhhdCBpcyAyMDAsIGluXG4gKiB3aGljaCBjYXNlIGBzZXQuc3RhdHVzYCBhcHBsaWVzLCBhcyBpbiBFbHlzaWEncyBgbWVyZ2VTdGF0dXNgLiBPdGhlcndpc2VcbiAqIEVseXNpYSBzZW5kcyBgc2V0LnN0YXR1c2AsIHdoaWNoIHN0YXlzIDIwMCB1bmxlc3MgYSBoYW5kbGVyIGFzc2lnbmVkIG9uZS5cbiAqL1xuY29uc3QgcmVzb2x2ZUhhbmRsZWRTdGF0dXMgPSAoXG4gIHNldFN0YXR1czogdW5rbm93bixcbiAgcmVzcG9uc2U6IHVua25vd25cbik6IG51bWJlciA9PiB7XG4gIGlmIChpc1N0YXR1c1Jlc3BvbnNlKHJlc3BvbnNlKSkge1xuICAgIHJldHVybiByZXNwb25zZS5jb2RlXG4gIH1cblxuICBpZiAocmVzcG9uc2UgaW5zdGFuY2VvZiBSZXNwb25zZSAmJiByZXNwb25zZS5zdGF0dXMgIT09IERFRkFVTFRfU1RBVFVTKSB7XG4gICAgcmV0dXJuIHJlc3BvbnNlLnN0YXR1c1xuICB9XG5cbiAgaWYgKHNldFN0YXR1cyA9PT0gdW5kZWZpbmVkIHx8IHNldFN0YXR1cyA9PT0gbnVsbCkge1xuICAgIHJldHVybiBERUZBVUxUX1NUQVRVU1xuICB9XG5cbiAgcmV0dXJuIGdldFN0YXR1c0NvZGUoc2V0U3RhdHVzKVxufVxuXG5pbnRlcmZhY2UgUmVxdWVzdFJlY29yZCB7XG4gIC8qKiBBIGN1c3RvbSBsb2cgcmVwbGFjZWQgdGhlIGFjY2VzcyBsaW5lIGZvciB0aGlzIHJlcXVlc3QuICovXG4gIGN1c3RvbUxvZ2dlZDogYm9vbGVhblxuICAvKiogVGhlIHZhbHVlIGBvbkVycm9yYCBzYXcsIG9yIHRoZSBlcnJvciBhIHN0cmVhbWVkIGJvZHkgdGhyZXcuICovXG4gIGVycm9yPzogdW5rbm93blxuICAvKiogYG9wZW5gIHVudGlsIHRoZSBmaW5hbCBsaW5lIGlzIHdyaXR0ZW47IGBzdHJlYW1pbmdgIHdoaWxlIGEgZ2VuZXJhdG9yIGJvZHkgc3RpbGwgcnVucy4gKi9cbiAgcGhhc2U6ICdvcGVuJyB8ICdzdHJlYW1pbmcnIHwgJ2Nsb3NlZCdcbiAgLyoqIEVseXNpYSBwdWxsZWQgdGhlIHN0cmVhbSB3cmFwcGVyIGF0IGxlYXN0IG9uY2UuICovXG4gIHB1bGxlZDogYm9vbGVhblxuICAvKiogVGhlIGxpdmUgYHNldC5oZWFkZXJzYCBvZiB0aGUgcmVxdWVzdCwgZm9yIHRoZSByZXNwb25zZSBlbnJpY2hlcnMuICovXG4gIHNldEhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXI+XG4gIHN0YXJ0ZWRBdDogYmlnaW50XG4gIC8qKiBUaGUgc3RhdHVzIHRoZSBjbGllbnQgZ290LCByZWNvcmRlZCBieSB0aGUgd3JhcCBmb3IgYSBzdHJlYW0gc3RpbGwgcnVubmluZy4gKi9cbiAgc3RhdHVzPzogbnVtYmVyXG4gIC8qKiBUaGUgd3JhcCBzYXcgdGhpcyByZXF1ZXN0LiBPdGhlcndpc2UgdGhlIGhvb2tzIGNsb3NlIGl0LCBhcyBiZWZvcmUgdGhlIHdyYXAgZXhpc3RlZC4gKi9cbiAgd3JhcHBlZDogYm9vbGVhblxufVxuXG5jb25zdCByZWNvcmRzID0gbmV3IFdlYWtNYXA8UmVxdWVzdCwgUmVxdWVzdFJlY29yZD4oKVxuXG5jb25zdCBvcGVuUmVjb3JkID0gKHJlcXVlc3Q6IFJlcXVlc3QpOiBSZXF1ZXN0UmVjb3JkID0+IHtcbiAgY29uc3QgZXhpc3RpbmcgPSByZWNvcmRzLmdldChyZXF1ZXN0KVxuICBpZiAoZXhpc3RpbmcpIHtcbiAgICByZXR1cm4gZXhpc3RpbmdcbiAgfVxuICBjb25zdCByZWNvcmQ6IFJlcXVlc3RSZWNvcmQgPSB7XG4gICAgY3VzdG9tTG9nZ2VkOiBmYWxzZSxcbiAgICBwaGFzZTogJ29wZW4nLFxuICAgIHB1bGxlZDogZmFsc2UsXG4gICAgc3RhcnRlZEF0OiBwcm9jZXNzLmhydGltZS5iaWdpbnQoKSxcbiAgICB3cmFwcGVkOiBmYWxzZVxuICB9XG4gIHJlY29yZHMuc2V0KHJlcXVlc3QsIHJlY29yZClcbiAgcmV0dXJuIHJlY29yZFxufVxuXG5jb25zdCByZXNwb25zZVN0YXR1cyA9IChyZXNwb25zZTogdW5rbm93bik6IG51bWJlciA9PlxuICByZXNwb25zZSBpbnN0YW5jZW9mIFJlc3BvbnNlID8gcmVzcG9uc2Uuc3RhdHVzIDogREVGQVVMVF9TVEFUVVNcblxuY29uc3QgaXNHZW5lcmF0b3JPYmplY3QgPSAoXG4gIHZhbHVlOiB1bmtub3duXG4pOiB2YWx1ZSBpcyBBc3luY0l0ZXJhYmxlPHVua25vd24+IHwgSXRlcmFibGU8dW5rbm93bj4gPT5cbiAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICB2YWx1ZSAhPT0gbnVsbCAmJlxuICB0eXBlb2YgKHZhbHVlIGFzIHsgbmV4dD86IHVua25vd24gfSkubmV4dCA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAoU3ltYm9sLmFzeW5jSXRlcmF0b3IgaW4gdmFsdWUgfHwgU3ltYm9sLml0ZXJhdG9yIGluIHZhbHVlKVxuXG4vKipcbiAqIEVseXNpYSB1c2VzIGEgYFJlYWRhYmxlU3RyZWFtYCB5aWVsZGVkIGZpcnN0IGFzIHRoZSB3aG9sZSBib2R5IGFuZCBuZXZlclxuICogcHVsbHMgdGhlIGdlbmVyYXRvciBhZ2Fpbi4gQSBgUmVzcG9uc2VgIHlpZWxkZWQgYW55d2hlcmUsIG9yIGEgc3RyZWFtXG4gKiB5aWVsZGVkIGxhdGVyLCBpcyBlbmNvZGVkIGxpa2UgYW55IG90aGVyIGNodW5rLiBPbmx5IHRoZSBmaXJzdCB2YWx1ZSBjYW5cbiAqIHRha2UgdGhlIHJlc3BvbnNlIG92ZXIuXG4gKi9cbmNvbnN0IHRha2VzT3ZlclJlc3BvbnNlID0gKGZpcnN0OiB1bmtub3duKTogYm9vbGVhbiA9PlxuICBmaXJzdCBpbnN0YW5jZW9mIFJlYWRhYmxlU3RyZWFtXG5cbi8qKlxuICogUHVsbHMgYSBoYW5kbGVyJ3MgZ2VuZXJhdG9yLCBpbnNpZGUgdGhlIHJlcXVlc3QncyBsb2dnZXIgc2NvcGUgd2hlblxuICogYHVzZUFzeW5jTG9jYWxTdG9yYWdlYCBpcyBvbi4gRWx5c2lhIHB1bGxzIGV2ZXJ5IHZhbHVlIGFmdGVyIHRoZSBmaXJzdFxuICogZnJvbSBhIFJlYWRhYmxlU3RyZWFtIGBwdWxsYCwgd2hpY2ggQnVuIDEuMy4xNCBydW5zIGluIHRoZSBjb250ZXh0IG9mXG4gKiB3aG9ldmVyIHJlYWRzIHRoZSBib2R5IHJhdGhlciB0aGFuIHRoZSBvbmUgdGhlIHdyYXAgZW50ZXJlZCwgc28gdGhlXG4gKiBib2R5IHdvdWxkIG90aGVyd2lzZSBsb3NlIGB1c2VMb2dnZXIoKWAgYWZ0ZXIgaXRzIGZpcnN0IGB5aWVsZGAuXG4gKi9cbnR5cGUgUnVuSW5TY29wZSA9IDxUPihwdWxsOiAoKSA9PiBUKSA9PiBUXG5cbmNvbnN0IHJ1blVuc2NvcGVkOiBSdW5JblNjb3BlID0gcHVsbCA9PiBwdWxsKClcblxuY29uc3QgcnVuSW5Mb2dnZXJTY29wZSA9XG4gIChsb2dnZXI6IFJlcXVlc3RTY29wZWRMb2dnZXIpOiBSdW5JblNjb3BlID0+XG4gIHB1bGwgPT5cbiAgICBsb2dnZXJTdG9yYWdlLnJ1bihsb2dnZXIsIHB1bGwpXG5cbmNvbnN0IHdyYXBBc3luY1N0cmVhbSA9IGFzeW5jIGZ1bmN0aW9uKiB3cmFwQXN5bmNTdHJlYW0oXG4gIHJlY29yZDogUmVxdWVzdFJlY29yZCxcbiAgc291cmNlOiBBc3luY0l0ZXJhYmxlPHVua25vd24+LFxuICBydW5JblNjb3BlOiBSdW5JblNjb3BlLFxuICBvblNldHRsZWQ6ICgpID0+IHZvaWRcbik6IEFzeW5jR2VuZXJhdG9yPHVua25vd24sIHVua25vd24+IHtcbiAgcmVjb3JkLnB1bGxlZCA9IHRydWVcbiAgY29uc3QgaXRlcmF0b3IgPSBzb3VyY2VbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKClcbiAgY29uc3Qgc2NvcGVkOiBBc3luY0l0ZXJhdG9yPHVua25vd24+ID0ge1xuICAgIG5leHQ6ICguLi5hcmdzKSA9PiBydW5JblNjb3BlKCgpID0+IGl0ZXJhdG9yLm5leHQoLi4uYXJncykpLFxuICAgIHJldHVybjogaXRlcmF0b3IucmV0dXJuPy5iaW5kKGl0ZXJhdG9yKSxcbiAgICB0aHJvdzogaXRlcmF0b3IudGhyb3c/LmJpbmQoaXRlcmF0b3IpXG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCBmaXJzdCA9IGF3YWl0IHNjb3BlZC5uZXh0KClcbiAgICBpZiAoZmlyc3QuZG9uZSkge1xuICAgICAgcmV0dXJuIGZpcnN0LnZhbHVlXG4gICAgfVxuICAgIGlmICh0YWtlc092ZXJSZXNwb25zZShmaXJzdC52YWx1ZSkpIHtcbiAgICAgIHJlY29yZC5waGFzZSA9ICdvcGVuJ1xuICAgIH1cbiAgICB5aWVsZCBmaXJzdC52YWx1ZVxuICAgIC8vIERlbGVnYXRpb24gZm9yd2FyZHMgZXZlcnkgbGF0ZXIgdmFsdWUsIHRoZSByZXR1cm4gdmFsdWUsIGFuZCB0aGVcbiAgICAvLyBgcmV0dXJuKClgIG9mIGEgY2FuY2VsbGVkIGJvZHkgdG8gdGhlIHNvdXJjZS5cbiAgICByZXR1cm4geWllbGQqIHsgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTogKCkgPT4gc2NvcGVkIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZWNvcmQuZXJyb3IgPSBlcnJvclxuICAgIHRocm93IGVycm9yXG4gIH0gZmluYWxseSB7XG4gICAgLy8gQSBib2R5IGNhbmNlbGxlZCBiZWZvcmUgaXRzIGZpcnN0IHJlYWQgcGFya3MgdGhpcyBnZW5lcmF0b3IgYXQgdGhlXG4gICAgLy8gYHlpZWxkYCBhYm92ZSwgb3V0c2lkZSB0aGUgZGVsZWdhdGlvbiwgc28gZm9yd2FyZCB0aGUgY2FuY2VsIGJ5IGhhbmRcbiAgICAvLyAoYSBuby1vcCBvbiBhIHNvdXJjZSB0aGF0IGFscmVhZHkgZmluaXNoZWQpLiBUaGUgcmVxdWVzdCBzZXR0bGVzIGV2ZW5cbiAgICAvLyB3aGVuIHRoZSBzb3VyY2UncyBvd24gY2xlYW51cCB0aHJvd3MuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGl0ZXJhdG9yLnJldHVybj8uKClcbiAgICB9IGZpbmFsbHkge1xuICAgICAgb25TZXR0bGVkKClcbiAgICB9XG4gIH1cbn1cblxuY29uc3Qgd3JhcFN5bmNTdHJlYW0gPSBmdW5jdGlvbiogd3JhcFN5bmNTdHJlYW0oXG4gIHJlY29yZDogUmVxdWVzdFJlY29yZCxcbiAgc291cmNlOiBJdGVyYWJsZTx1bmtub3duPixcbiAgcnVuSW5TY29wZTogUnVuSW5TY29wZSxcbiAgb25TZXR0bGVkOiAoKSA9PiB2b2lkXG4pOiBHZW5lcmF0b3I8dW5rbm93biwgdW5rbm93bj4ge1xuICByZWNvcmQucHVsbGVkID0gdHJ1ZVxuICBjb25zdCBpdGVyYXRvciA9IHNvdXJjZVtTeW1ib2wuaXRlcmF0b3JdKClcbiAgY29uc3Qgc2NvcGVkOiBJdGVyYXRvcjx1bmtub3duPiA9IHtcbiAgICBuZXh0OiAoLi4uYXJncykgPT4gcnVuSW5TY29wZSgoKSA9PiBpdGVyYXRvci5uZXh0KC4uLmFyZ3MpKSxcbiAgICByZXR1cm46IGl0ZXJhdG9yLnJldHVybj8uYmluZChpdGVyYXRvciksXG4gICAgdGhyb3c6IGl0ZXJhdG9yLnRocm93Py5iaW5kKGl0ZXJhdG9yKVxuICB9XG4gIHRyeSB7XG4gICAgY29uc3QgZmlyc3QgPSBzY29wZWQubmV4dCgpXG4gICAgaWYgKGZpcnN0LmRvbmUpIHtcbiAgICAgIHJldHVybiBmaXJzdC52YWx1ZVxuICAgIH1cbiAgICBpZiAodGFrZXNPdmVyUmVzcG9uc2UoZmlyc3QudmFsdWUpKSB7XG4gICAgICByZWNvcmQucGhhc2UgPSAnb3BlbidcbiAgICB9XG4gICAgeWllbGQgZmlyc3QudmFsdWVcbiAgICByZXR1cm4geWllbGQqIHsgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+IHNjb3BlZCB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmVjb3JkLmVycm9yID0gZXJyb3JcbiAgICB0aHJvdyBlcnJvclxuICB9IGZpbmFsbHkge1xuICAgIHRyeSB7XG4gICAgICBpdGVyYXRvci5yZXR1cm4/LigpXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIG9uU2V0dGxlZCgpXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogRXhwbGljaXQgc2luZ2xldG9uIHdpdGhvdXQgRWx5c2lhJ3MgYFNpbmdsZXRvbkJhc2VgIGBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPmAgb24gZGVjb3JhdG9yL2Rlcml2ZS9yZXNvbHZlIHNvXG4gKiBtZXJnZWQgYENvbnRleHRgIGFuZCBXZWJTb2NrZXQgYHdzLmRhdGFgIGtlZXAgcHJlY2lzZSBrZXlzIGFmdGVyIGAudXNlKGxvZ2l4bHlzaWEoKSlgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvZ2l4bHlzaWFTaW5nbGV0b248VEZpZWxkcyBleHRlbmRzIG9iamVjdCA9IExvZ0ZpZWxkcz4ge1xuICBkZWNvcmF0b3I6IEVtcHR5RWx5c2lhU2xvdFxuICBkZXJpdmU6IHtcbiAgICBsb2c6IFJlcXVlc3RTY29wZWRMb2dnZXI8VEZpZWxkcz5cbiAgfVxuICByZXNvbHZlOiBFbXB0eUVseXNpYVNsb3RcbiAgc3RvcmU6IExvZ2l4bHlzaWFTdG9yZVxufVxuXG4vLyBFbHlzaWEncyBgU2luZ2xldG9uQmFzZWAgc2xvdHMgYXJlIGBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPmA7IG91cnMgYXJlIGludGVudGlvbmFsbHkgY2xvc2VkIChzZWUgIzIyMCkuXG5leHBvcnQgdHlwZSBMb2dpeGx5c2lhPFRGaWVsZHMgZXh0ZW5kcyBvYmplY3QgPSBMb2dGaWVsZHM+ID0gRWx5c2lhPFxuICAnJyxcbiAgLy8gQHRzLWV4cGVjdC1lcnJvciDigJQgY2xvc2VkIHNsb3RzIGFyZSBjb3JyZWN0IGF0IHJ1bnRpbWUgYW5kIGZvciBtZXJnZWQgYHdzLmRhdGFgIGluZmVyZW5jZS5cbiAgTG9naXhseXNpYVNpbmdsZXRvbjxURmllbGRzPlxuPlxuXG5leHBvcnQgdHlwZSBMb2dpeGx5c2lhUGx1Z2luPFRGaWVsZHMgZXh0ZW5kcyBvYmplY3QgPSBMb2dGaWVsZHM+ID1cbiAgTG9naXhseXNpYTxURmllbGRzPiAmIHtcbiAgICB3cmFwV3M6IFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZVdzSGFuZGxlcldyYXBwZXI+XG4gIH1cblxuY29uc3QgREVGQVVMVF9GTFVTSF9USU1FT1VUX01TID0gNTAwMFxuXG4vKipcbiAqIFRoZSByZXNwb25zZSBoZWFkZXJzIGFuIGVucmljaGVyIGdldHMgdG8gcmVhZC4gYHNldC5oZWFkZXJzYCBhbG9uZSBtaXNzZXNcbiAqIGFueXRoaW5nIGEgaGFuZGxlciBwdXQgb24gYSByZXR1cm5lZCBgUmVzcG9uc2VgIChhIGBjb250ZW50LWxlbmd0aGAsIHNheSksXG4gKiBzbyB0aGUgdHdvIGFyZSBtZXJnZWQg4oCUIHdpdGggYHNldC5oZWFkZXJzYCB3aW5uaW5nLCBzaW5jZSBFbHlzaWEgYXBwbGllc1xuICogaXQgbGFzdC4gT25seSBidWlsdCB3aGVuIGFuIGVucmljaGVyIHdpbGwgYWN0dWFsbHkgcmVhZCBpdC5cbiAqL1xuY29uc3QgcmVhZGFibGVSZXNwb25zZUhlYWRlcnMgPSAoXG4gIHNldEhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlcj4sXG4gIHJlc3BvbnNlSGVhZGVycz86IEhlYWRlcnNcbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+IHtcbiAgY29uc3QgbWVyZ2VkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9XG4gIGlmIChyZXNwb25zZUhlYWRlcnMpIHtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiByZXNwb25zZUhlYWRlcnMpIHtcbiAgICAgIG1lcmdlZFtrZXldID0gdmFsdWVcbiAgICB9XG4gIH1cbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24obWVyZ2VkLCBzZXRIZWFkZXJzKVxufVxuXG4vKipcbiAqIEB0ZW1wbGF0ZSBURmllbGRzIC0gRmllbGQgYmFnIGZvciB0aGUgcmVxdWVzdC1zY29wZWQgYGxvZ2AuIFN1cHBseSB5b3VyIG93blxuICogaW50ZXJmYWNlIHRvIGhhdmUgVHlwZVNjcmlwdCByZWplY3QgbWlzc3BlbGxlZCBjb250ZXh0IGtleXM7IHRoZSBkZWZhdWx0XG4gKiBhbGxvd3MgYW55IGtleSwgc28gdW50eXBlZCB1c2FnZSBpcyB1bmNoYW5nZWQuXG4gKi9cbmNvbnN0IGNyZWF0ZUxvZ2l4bHlzaWFQbHVnaW4gPSA8VEZpZWxkcyBleHRlbmRzIG9iamVjdCA9IExvZ0ZpZWxkcz4oXG4gIHJhd09wdGlvbnM6IE9wdGlvbnMgPSB7fVxuKTogTG9naXhseXNpYVBsdWdpbjxURmllbGRzPiA9PiB7XG4gIGNvbnN0IG9wdGlvbnMgPSByZXNvbHZlT3B0aW9ucyhyYXdPcHRpb25zKVxuICBjb25zdCBjb250ZXh0U3RvcmUgPSBjcmVhdGVSZXF1ZXN0Q29udGV4dFN0b3JlKClcbiAgY29uc3QgYmFzZUxvZ2dlciA9IGNyZWF0ZVBsdWdpbkxvZ2dlcihvcHRpb25zLCBjb250ZXh0U3RvcmUpXG4gIGNvbnN0IHdyYXBXcyA9IGNyZWF0ZVdzSGFuZGxlcldyYXBwZXIob3B0aW9ucywgYmFzZUxvZ2dlciwgY29udGV4dFN0b3JlKVxuICBjb25zdCByZXF1ZXN0SWRDb25maWcgPSByZXNvbHZlUmVxdWVzdElkQ29uZmlnKFxuICAgIG9wdGlvbnMuY29uZmlnPy5yZXF1ZXN0SWQsXG4gICAgb3B0aW9ucy5jb25maWc/Lm9uRXJyb3JcbiAgKVxuICBjb25zdCBlbnJpY2hlcnMgPSByZXNvbHZlRW5yaWNoZXJzKG9wdGlvbnMuY29uZmlnPy5lbnJpY2hlcnMpXG4gIGNvbnN0IG9uU2lua0Vycm9yID0gb3B0aW9ucy5jb25maWc/Lm9uRXJyb3JcbiAgY29uc3QgbG9nRmlsdGVyID0gb3B0aW9ucy5jb25maWc/LmxvZ0ZpbHRlclxuICBjb25zdCBzaW5rcyA9IHJlc29sdmVTaW5rcyhvcHRpb25zLmNvbmZpZylcblxuICAvKipcbiAgICogQSBjdXN0b20gbG9nIGluc2lkZSBhIHJlcXVlc3QuIEl0IGFwcGxpZXMgdGhlIHNhbWUgZ2F0ZSB0aGUgbG9nZ2VyJ3Mgb3duXG4gICAqIGBkZWJ1Z2AvYGluZm9gLy4uLiBhcHBseSwgZm9yIHR3byByZWFzb25zOiBhIHJlY29yZCB0aGUgbGV2ZWwgZmlsdGVyIGRyb3BzXG4gICAqIG11c3Qgbm90IGNsYWltIHRoZSByZXF1ZXN0IGFuZCBzdXBwcmVzcyBpdHMgYWNjZXNzIGxpbmUsIGFuZCB0aGUgcmVjb3JkXG4gICAqIHRoYXQgZG9lcyBnbyBvdXQgaGFzIHRvIGJlIHRpbWVkIGZyb20gdGhlIHJlcXVlc3QncyBzdGFydCByYXRoZXIgdGhhbiBmcm9tXG4gICAqIHRoZSBtb21lbnQgdGhlIGhhbmRsZXIgY2FsbGVkIGl0LlxuICAgKi9cbiAgY29uc3QgZW1pdEN1c3RvbUxvZyA9IChcbiAgICBsZXZlbDogTG9nTGV2ZWwsXG4gICAgcmVxdWVzdDogUmVxdWVzdCxcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IHZvaWQgPT4ge1xuICAgIGlmIChzaW5rcy5pc0VmZmVjdGl2ZWx5RGlzYWJsZWQgfHwgIXNob3VsZExvZyhsZXZlbCwgbG9nRmlsdGVyKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgcmVjb3JkID0gb3BlblJlY29yZChyZXF1ZXN0KVxuICAgIHJlY29yZC5jdXN0b21Mb2dnZWQgPSB0cnVlXG4gICAgYmFzZUxvZ2dlci5sb2coXG4gICAgICBsZXZlbCxcbiAgICAgIHJlcXVlc3QsXG4gICAgICB7IGNvbnRleHQsIG1lc3NhZ2UgfSxcbiAgICAgIHsgYmVmb3JlVGltZTogcmVjb3JkLnN0YXJ0ZWRBdCB9XG4gICAgKVxuICB9XG5cbiAgY29uc3QgbG9nZ2VyID0ge1xuICAgIC4uLmJhc2VMb2dnZXIsXG4gICAgZGVidWc6IChcbiAgICAgIHJlcXVlc3Q6IFJlcXVlc3QsXG4gICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICBjb250ZXh0PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICApID0+IHtcbiAgICAgIGVtaXRDdXN0b21Mb2coJ0RFQlVHJywgcmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dClcbiAgICB9LFxuICAgIGVycm9yOiAoXG4gICAgICByZXF1ZXN0OiBSZXF1ZXN0LFxuICAgICAgbWVzc2FnZTogc3RyaW5nLFxuICAgICAgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgKSA9PiB7XG4gICAgICBlbWl0Q3VzdG9tTG9nKCdFUlJPUicsIHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXG4gICAgfSxcbiAgICBpbmZvOiAoXG4gICAgICByZXF1ZXN0OiBSZXF1ZXN0LFxuICAgICAgbWVzc2FnZTogc3RyaW5nLFxuICAgICAgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgKSA9PiB7XG4gICAgICBlbWl0Q3VzdG9tTG9nKCdJTkZPJywgcmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dClcbiAgICB9LFxuICAgIHdhcm46IChcbiAgICAgIHJlcXVlc3Q6IFJlcXVlc3QsXG4gICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICBjb250ZXh0PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICApID0+IHtcbiAgICAgIGVtaXRDdXN0b21Mb2coJ1dBUk5JTkcnLCByZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGNyZWF0ZVJlcXVlc3RTY29wZWRMb2dnZXIgPSAoXG4gICAgcmVxdWVzdDogUmVxdWVzdFxuICApOiBSZXF1ZXN0U2NvcGVkTG9nZ2VyID0+ICh7XG4gICAgZGVidWc6IChtZXNzYWdlLCBjb250ZXh0KSA9PlxuICAgICAgZW1pdEN1c3RvbUxvZygnREVCVUcnLCByZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KSxcbiAgICBlcnJvcjogKG1lc3NhZ2UsIGNvbnRleHQpID0+XG4gICAgICBlbWl0Q3VzdG9tTG9nKCdFUlJPUicsIHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpLFxuICAgIGluZm86IChtZXNzYWdlLCBjb250ZXh0KSA9PlxuICAgICAgZW1pdEN1c3RvbUxvZygnSU5GTycsIHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpLFxuICAgIG1lcmdlQ29udGV4dDogcGFydGlhbCA9PiBjb250ZXh0U3RvcmUubWVyZ2VDb250ZXh0KHJlcXVlc3QsIHBhcnRpYWwpLFxuICAgIHdhcm46IChtZXNzYWdlLCBjb250ZXh0KSA9PlxuICAgICAgZW1pdEN1c3RvbUxvZygnV0FSTklORycsIHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXG4gIH0pXG5cbiAgLyoqXG4gICAqIEV2ZXJ5dGhpbmcgdGhlIGV4aXRzIHNoYXJlIG9uY2UgdGhlIHN0YXR1cyBpcyBrbm93bjogZWNobyB0aGUgcmVxdWVzdCBpZCxcbiAgICogcnVuIHRoZSByZXNwb25zZS1waGFzZSBlbnJpY2hlcnMsIGFuZCByZXNvbHZlIHRhaWwgc2FtcGxpbmcg4oCUIGFsbCBiZWZvcmVcbiAgICogdGhlIHJlcXVlc3QncyBmaW5hbCBsb2cgbGluZSwgc28gaXQgYW5kIGFueSByZXBsYXllZCByZWNvcmRzIHNlZSB0aGUgc2FtZVxuICAgKiBjb250ZXh0LiBSZXR1cm5zIHRoZSB0aW1pbmcgc3RvcmUgZm9yIHRoYXQgZmluYWwgbGluZS5cbiAgICpcbiAgICogYHNldEhlYWRlcnNgIGlzIHRoZSBsaXZlIGBzZXQuaGVhZGVyc2AgYW5kIGlzIHdyaXR0ZW4gdG87IHRoZSBtZXJnZWQgdmlld1xuICAgKiBoYW5kZWQgdG8gZW5yaWNoZXJzIGlzIHJlYWQtb25seSwgc28gaXQgbXVzdCBub3Qgc3RhbmQgaW4gZm9yIGl0LlxuICAgKi9cbiAgY29uc3QgY2xvc2VSZXF1ZXN0ID0gKFxuICAgIHJlcXVlc3Q6IFJlcXVlc3QsXG4gICAgc2V0SGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyPixcbiAgICBzdGF0dXM6IG51bWJlcixcbiAgICByZXNwb25zZUhlYWRlcnM/OiBIZWFkZXJzXG4gICk6IFN0b3JlRGF0YSA9PiB7XG4gICAgaWYgKHJlcXVlc3RJZENvbmZpZykge1xuICAgICAgY29uc3QgaWQgPSBjb250ZXh0U3RvcmUuZ2V0Q29udGV4dChyZXF1ZXN0KS5yZXF1ZXN0SWQgYXNcbiAgICAgICAgfCBzdHJpbmdcbiAgICAgICAgfCB1bmRlZmluZWRcbiAgICAgIGlmIChpZCkge1xuICAgICAgICBzZXRIZWFkZXJzW3JlcXVlc3RJZENvbmZpZy5oZWFkZXJdID0gaWRcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBzdG9yZTogU3RvcmVEYXRhID0ge1xuICAgICAgYmVmb3JlVGltZTogcmVjb3Jkcy5nZXQocmVxdWVzdCk/LnN0YXJ0ZWRBdCA/PyAwblxuICAgIH1cblxuICAgIGlmIChlbnJpY2hlcnMpIHtcbiAgICAgIGFwcGx5UmVzcG9uc2VFbnJpY2hlcnMoXG4gICAgICAgIGVucmljaGVycyxcbiAgICAgICAgY29udGV4dFN0b3JlLFxuICAgICAgICB7XG4gICAgICAgICAgZHVyYXRpb25NczogZWxhcHNlZE1zKHN0b3JlLmJlZm9yZVRpbWUpLFxuICAgICAgICAgIGhlYWRlcnM6IHJlYWRhYmxlUmVzcG9uc2VIZWFkZXJzKHNldEhlYWRlcnMsIHJlc3BvbnNlSGVhZGVycyksXG4gICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICBzdGF0dXNcbiAgICAgICAgfSxcbiAgICAgICAgb25TaW5rRXJyb3JcbiAgICAgIClcbiAgICB9XG5cbiAgICBsb2dnZXIuZmluYWxpemVSZXF1ZXN0KHJlcXVlc3QsIHN0b3JlLCBzdGF0dXMpXG4gICAgcmV0dXJuIHN0b3JlXG4gIH1cblxuICBjb25zdCB1c2VBc3luY0xvY2FsU3RvcmFnZSA9IG9wdGlvbnMuY29uZmlnPy51c2VBc3luY0xvY2FsU3RvcmFnZSA9PT0gdHJ1ZVxuXG4gIC8qKlxuICAgKiBSZXN0b3JlcyB0aGUgbm8tb3AgbG9nZ2VyIG9uY2UgYSByZXF1ZXN0IGlzIG92ZXIsIHNvIGEgcHJvbWlzZSB0aGF0XG4gICAqIG91dGxpdmVzIGl0IGFuZCBjYWxscyBgdXNlTG9nZ2VyKClgIHdyaXRlcyBub3doZXJlIGluc3RlYWQgb2YgaW50b1xuICAgKiB3aGljaGV2ZXIgcmVxdWVzdCBoYXBwZW5lZCB0byBydW4gbGFzdC5cbiAgICovXG4gIGNvbnN0IGV4aXRSZXF1ZXN0U2NvcGUgPSAoKTogdm9pZCA9PiB7XG4gICAgaWYgKHVzZUFzeW5jTG9jYWxTdG9yYWdlKSB7XG4gICAgICBsb2dnZXJTdG9yYWdlLmVudGVyV2l0aChub29wUmVxdWVzdExvZ2dlcilcbiAgICB9XG4gIH1cblxuICBjb25zdCBlbWl0QWNjZXNzTGluZSA9IChcbiAgICByZXF1ZXN0OiBSZXF1ZXN0LFxuICAgIHN0YXR1czogbnVtYmVyLFxuICAgIHN0b3JlOiBTdG9yZURhdGFcbiAgKTogdm9pZCA9PiB7XG4gICAgY29uc3QgYWNjdW11bGF0ZWQgPSBjb250ZXh0U3RvcmUuZ2V0Q29udGV4dChyZXF1ZXN0KVxuICAgIGNvbnN0IGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0geyBzdGF0dXMgfVxuICAgIGlmIChPYmplY3Qua2V5cyhhY2N1bXVsYXRlZCkubGVuZ3RoID4gMCkge1xuICAgICAgZGF0YS5jb250ZXh0ID0geyAuLi5hY2N1bXVsYXRlZCB9XG4gICAgfVxuXG4gICAgbG9nZ2VyLmxvZyhsZXZlbEZvclN0YXR1cyhzdGF0dXMpLCByZXF1ZXN0LCBkYXRhLCBzdG9yZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZmluYWwgbGluZSBmb3IgYSByZXF1ZXN0IHdob3NlIHJlc3BvbnNlIEVseXNpYSBoYXMgcHJvZHVjZWQuIFJ1bnNcbiAgICogb25jZSwgd2l0aCB0aGUgc3RhdHVzIHRoZSBjbGllbnQgZ290LiBBIHJlcXVlc3Qgd2hvc2UgYm9keSBpcyBzdGlsbFxuICAgKiBzdHJlYW1pbmcgaXMgZmluaXNoZWQgYnkgdGhlIHN0cmVhbSB3cmFwcGVyIGluc3RlYWQuIEEgdGhyb3duIHZhbHVlIHRoYXRcbiAgICogaXMgbm90IEVseXNpYSdzIG93biBzdGF0dXMoKSByZXN1bHQgaXMgYW4gZXJyb3Igd2hhdGV2ZXIgdGhlIHN0YXR1cyB0aGVcbiAgICogY2xpZW50IGdvdCAoYSBsYXRlciBvbkVycm9yIG1heSBoYXZlIG1hcHBlZCBpdCB0byBhIDN4eCwgb3IgYSBzdHJlYW1lZFxuICAgKiBib2R5IG1heSBoYXZlIGZhaWxlZCBhZnRlciBhIDIwMCB3ZW50IG91dCk7IGEgdGhyb3duIHN0YXR1cygpIHJlc3VsdCBpc1xuICAgKiBhbiBlcnJvciBvbmx5IHdoZW4gaXRzIGNvZGUgc2F5cyBzby5cbiAgICovXG4gIGNvbnN0IGZpbmlzaFJlcXVlc3QgPSAoXG4gICAgcmVxdWVzdDogUmVxdWVzdCxcbiAgICByZWNvcmQ6IFJlcXVlc3RSZWNvcmQsXG4gICAgc3RhdHVzOiBudW1iZXIsXG4gICAgcmVzcG9uc2VIZWFkZXJzPzogSGVhZGVyc1xuICApOiB2b2lkID0+IHtcbiAgICBpZiAocmVjb3JkLnBoYXNlID09PSAnY2xvc2VkJykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHJlY29yZC5waGFzZSA9ICdjbG9zZWQnXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0b3JlID0gY2xvc2VSZXF1ZXN0KFxuICAgICAgICByZXF1ZXN0LFxuICAgICAgICByZWNvcmQuc2V0SGVhZGVycyA/PyB7fSxcbiAgICAgICAgc3RhdHVzLFxuICAgICAgICByZXNwb25zZUhlYWRlcnNcbiAgICAgIClcbiAgICAgIGlmIChcbiAgICAgICAgcmVjb3JkLmVycm9yICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgKHN0YXR1cyA+PSA0MDAgfHwgIWlzU3RhdHVzUmVzcG9uc2UocmVjb3JkLmVycm9yKSlcbiAgICAgICkge1xuICAgICAgICBsb2dnZXIuaGFuZGxlSHR0cEVycm9yKHJlcXVlc3QsIHJlY29yZC5lcnJvciwgeyAuLi5zdG9yZSwgc3RhdHVzIH0pXG4gICAgICB9IGVsc2UgaWYgKCFyZWNvcmQuY3VzdG9tTG9nZ2VkKSB7XG4gICAgICAgIGVtaXRBY2Nlc3NMaW5lKHJlcXVlc3QsIHN0YXR1cywgc3RvcmUpXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZmFpbHVyZSkge1xuICAgICAgcmVwb3J0Rm9ybWF0RXJyb3IoZmFpbHVyZSwgb25TaW5rRXJyb3IpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCBmcm9tIGEgc3RyZWFtIHdyYXBwZXIncyBgZmluYWxseWAuIEEgYm9keSB0aGUgd3JhcCBhbHJlYWR5IHNhdyB0aGVcbiAgICogcmVzcG9uc2UgZm9yIGlzIGZpbmlzaGVkIGhlcmUgd2l0aCB0aGF0IHN0YXR1cy4gQSBib2R5IHRoYXQgZW5kZWQsXG4gICAqIGZhaWxlZCBvciBoYW5kZWQgRWx5c2lhIGEgd2hvbGUgcmVzcG9uc2UgYmVmb3JlIHRoZSByZXNwb25zZSBleGlzdGVkXG4gICAqIGdvZXMgYmFjayB0byBgb3BlbmAsIHNvIHRoZSB3cmFwIHdyaXRlcyB0aGUgbGluZSB3aXRoIHRoZSByZWFsIHN0YXR1cy5cbiAgICovXG4gIGNvbnN0IHNldHRsZVN0cmVhbSA9IChyZXF1ZXN0OiBSZXF1ZXN0LCByZWNvcmQ6IFJlcXVlc3RSZWNvcmQpOiB2b2lkID0+IHtcbiAgICBpZiAocmVjb3JkLnBoYXNlICE9PSAnc3RyZWFtaW5nJykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmIChyZWNvcmQuc3RhdHVzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJlY29yZC5waGFzZSA9ICdvcGVuJ1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGZpbmlzaFJlcXVlc3QocmVxdWVzdCwgcmVjb3JkLCByZWNvcmQuc3RhdHVzKVxuICB9XG5cbiAgY29uc3Qgd3JhcFN0cmVhbSA9IChcbiAgICByZXF1ZXN0OiBSZXF1ZXN0LFxuICAgIHJlY29yZDogUmVxdWVzdFJlY29yZCxcbiAgICByZXNwb25zZTogdW5rbm93blxuICApOiB1bmtub3duID0+IHtcbiAgICBpZiAoIWlzR2VuZXJhdG9yT2JqZWN0KHJlc3BvbnNlKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHJlY29yZC5waGFzZSA9ICdzdHJlYW1pbmcnXG4gICAgY29uc3Qgb25TZXR0bGVkID0gKCk6IHZvaWQgPT4gc2V0dGxlU3RyZWFtKHJlcXVlc3QsIHJlY29yZClcbiAgICBjb25zdCBydW5JblNjb3BlID0gdXNlQXN5bmNMb2NhbFN0b3JhZ2VcbiAgICAgID8gcnVuSW5Mb2dnZXJTY29wZShjcmVhdGVSZXF1ZXN0U2NvcGVkTG9nZ2VyKHJlcXVlc3QpKVxuICAgICAgOiBydW5VbnNjb3BlZFxuICAgIGNvbnN0IHdyYXBwZXIgPVxuICAgICAgU3ltYm9sLmFzeW5jSXRlcmF0b3IgaW4gcmVzcG9uc2VcbiAgICAgICAgPyB3cmFwQXN5bmNTdHJlYW0ocmVjb3JkLCByZXNwb25zZSwgcnVuSW5TY29wZSwgb25TZXR0bGVkKVxuICAgICAgICA6IHdyYXBTeW5jU3RyZWFtKHJlY29yZCwgcmVzcG9uc2UsIHJ1bkluU2NvcGUsIG9uU2V0dGxlZClcbiAgICAvLyBFbHlzaWEgcmVhZHMgbWFya2VycyBvZmYgdGhlIGdlbmVyYXRvciBvYmplY3QgaXRzZWxmOiBgc3NlKGdlbmVyYXRvcilgXG4gICAgLy8gc2V0cyB0aGUgb25lIHRoYXQgc2VsZWN0cyBldmVudC1zdHJlYW0gZnJhbWluZy5cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih3cmFwcGVyLCByZXNwb25zZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZXMgYSByZXF1ZXN0IHRoZSB3cmFwIGRpZCBub3Qgc2VlOiBFbHlzaWEgc2tpcHMgaGlnaGVyLW9yZGVyXG4gICAqIGZ1bmN0aW9ucyB3aXRoIGBhb3Q6IGZhbHNlYCwgYW5kIGBncm91cCgpYCBhbmQgYGd1YXJkKClgIGRvIG5vdCBtZXJnZVxuICAgKiB0aGVtIGludG8gdGhlIHBhcmVudC4gVGhlIGhvb2tzIHRoZW4gd3JpdGUgdGhlIGxpbmUsIGFzIGJlZm9yZS5cbiAgICovXG4gIGNvbnN0IGZpbmlzaFVud3JhcHBlZCA9IChcbiAgICByZXF1ZXN0OiBSZXF1ZXN0LFxuICAgIHJlY29yZDogUmVxdWVzdFJlY29yZCxcbiAgICBzdGF0dXM6IG51bWJlcixcbiAgICByZXNwb25zZUhlYWRlcnM/OiBIZWFkZXJzXG4gICk6IHZvaWQgPT4ge1xuICAgIGZpbmlzaFJlcXVlc3QocmVxdWVzdCwgcmVjb3JkLCBzdGF0dXMsIHJlc3BvbnNlSGVhZGVycylcbiAgICBleGl0UmVxdWVzdFNjb3BlKClcbiAgfVxuXG4gIGNvbnN0IHdyYXBGZXRjaCA9XG4gICAgKGZldGNoOiAocmVxdWVzdDogUmVxdWVzdCwgc2VydmVyOiB1bmtub3duKSA9PiB1bmtub3duKSA9PlxuICAgIChyZXF1ZXN0OiBSZXF1ZXN0LCBzZXJ2ZXI6IHVua25vd24pOiB1bmtub3duID0+IHtcbiAgICAgIGNvbnN0IHJlY29yZCA9IG9wZW5SZWNvcmQocmVxdWVzdClcbiAgICAgIHJlY29yZC53cmFwcGVkID0gdHJ1ZVxuICAgICAgY29uc3Qgc2V0dGxlID0gYXN5bmMgKCk6IFByb21pc2U8dW5rbm93bj4gPT4ge1xuICAgICAgICBsZXQgcmVzcG9uc2U6IHVua25vd25cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXNwb25zZSA9IGF3YWl0IGZldGNoKHJlcXVlc3QsIHNlcnZlcilcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAvLyBFbHlzaWEgcmVqZWN0cyB3aGVuIG1hcHBpbmcgYW4gZXJyb3IgdGhyb3dzIGFnYWluIChhIGNvb2tpZSBpdFxuICAgICAgICAgIC8vIGNhbm5vdCBzZXJpYWxpemUsIHNheSksIGFuZCB0aGUgc2VydmVyIHRoZW4gYW5zd2VycyA1MDAuXG4gICAgICAgICAgcmVjb3JkLmVycm9yID8/PSBlcnJvclxuICAgICAgICAgIGZpbmlzaFJlcXVlc3QocmVxdWVzdCwgcmVjb3JkLCBTRVJWRVJfRVJST1JfU1RBVFVTKVxuICAgICAgICAgIHRocm93IGVycm9yXG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHJlY29yZC5waGFzZSA9PT0gJ3N0cmVhbWluZycgJiZcbiAgICAgICAgICByZWNvcmQucHVsbGVkICYmXG4gICAgICAgICAgcmVjb3JkLmVycm9yID09PSB1bmRlZmluZWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gVGhlIGJvZHkgaXMgc3RpbGwgYmVpbmcgcHJvZHVjZWQ7IHRoZSBzdHJlYW0gd3JhcHBlciBmaW5pc2hlcyBpdC5cbiAgICAgICAgICAvLyBBIHJlY29yZGVkIGVycm9yIG1lYW5zIEVseXNpYSBmYWlsZWQgdG8gYnVpbGQgdGhlIHN0cmVhbSBhZnRlclxuICAgICAgICAgIC8vIGl0cyBmaXJzdCBwdWxsIGFuZCBhbnN3ZXJlZCB3aXRoIGFuIGVycm9yIHJlc3BvbnNlIGluc3RlYWQuXG4gICAgICAgICAgcmVjb3JkLnN0YXR1cyA9IHJlc3BvbnNlU3RhdHVzKHJlc3BvbnNlKVxuICAgICAgICAgIHJldHVybiByZXNwb25zZVxuICAgICAgICB9XG4gICAgICAgIGZpbmlzaFJlcXVlc3QoXG4gICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICByZWNvcmQsXG4gICAgICAgICAgcmVzcG9uc2VTdGF0dXMocmVzcG9uc2UpLFxuICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgUmVzcG9uc2UgPyByZXNwb25zZS5oZWFkZXJzIDogdW5kZWZpbmVkXG4gICAgICAgIClcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlXG4gICAgICB9XG4gICAgICByZXR1cm4gdXNlQXN5bmNMb2NhbFN0b3JhZ2VcbiAgICAgICAgPyBsb2dnZXJTdG9yYWdlLnJ1bihjcmVhdGVSZXF1ZXN0U2NvcGVkTG9nZ2VyKHJlcXVlc3QpLCBzZXR0bGUpXG4gICAgICAgIDogc2V0dGxlKClcbiAgICB9XG5cbiAgY29uc3QgYXBwID0gbmV3IEVseXNpYSh7XG4gICAgZGV0YWlsOiB7XG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgJ0xvZ2l4bHlzaWEgaXMgYSBwbHVnaW4gZm9yIEVseXNpYSB0aGF0IHByb3ZpZGVzIGEgbG9nZ2VyIGFuZCBwaW5vIGxvZ2dlci4nLFxuICAgICAgdGFnczogWydsb2dnaW5nJywgJ3Bpbm8nXVxuICAgIH0sXG4gICAgbmFtZTogJ0xvZ2l4bHlzaWEnXG4gIH0pLndyYXAod3JhcEZldGNoKVxuXG4gIC8vIEB0cy1leHBlY3QtZXJyb3Ig4oCUIGRlcml2ZWQgbG9nIHR5cGluZyBtYXRjaGVzIExvZ2l4bHlzaWFTaW5nbGV0b24uXG4gIGNvbnN0IHBsdWdpbiA9IGFwcFxuICAgIC5zdGF0ZSgnbG9nZ2VyJywgbG9nZ2VyKVxuICAgIC5zdGF0ZSgncGlubycsIGxvZ2dlci5waW5vKVxuICAgIC5zdGF0ZSgnYmVmb3JlVGltZScsIDBuKVxuICAgIC5kZXJpdmUoKHsgcmVxdWVzdCB9KSA9PiAoeyBsb2c6IGNyZWF0ZVJlcXVlc3RTY29wZWRMb2dnZXIocmVxdWVzdCkgfSkpXG4gICAgLm9uU3RhcnQoKHsgc2VydmVyIH0pOiB2b2lkID0+IHtcbiAgICAgIGlmIChzZXJ2ZXIpIHtcbiAgICAgICAgc3RhcnRTZXJ2ZXIoc2VydmVyLCBvcHRpb25zKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcG9ydCA9IE51bWJlcihwcm9jZXNzLmVudi5QT1JUKSB8fCAzMDAwXG4gICAgICAgIGNvbnN0IGhvc3RuYW1lID0gcHJvY2Vzcy5lbnYuSE9TVCB8fCAnbG9jYWxob3N0J1xuICAgICAgICBzdGFydFNlcnZlcih7IGhvc3RuYW1lLCBwb3J0LCBwcm90b2NvbDogJ2h0dHAnIH0sIG9wdGlvbnMpXG4gICAgICB9XG4gICAgfSlcbiAgICAub25TdG9wKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHRpbWVvdXRNcyA9XG4gICAgICAgIG9wdGlvbnMuY29uZmlnPy5mbHVzaFRpbWVvdXRNcyA/PyBERUZBVUxUX0ZMVVNIX1RJTUVPVVRfTVNcbiAgICAgIGNvbnN0IHRpbWVkT3V0ID0gYXdhaXQgcmFjZVdpdGhUaW1lb3V0KGZsdXNoQWxsKG9wdGlvbnMpLCB0aW1lb3V0TXMpXG4gICAgICAvLyBBIHplcm8gdGltZW91dCBtZWFucyB0aGUgY2FsbGVyIG9wdGVkIG91dCBvZiB3YWl0aW5nLCBzbyB0aGUgZmx1c2hcbiAgICAgIC8vIFwidGltaW5nIG91dFwiIGlzIGV4cGVjdGVkIGFuZCBub3Qgd29ydGggcmVwb3J0aW5nLlxuICAgICAgaWYgKHRpbWVkT3V0ICYmIHRpbWVvdXRNcyA+IDApIHtcbiAgICAgICAgcmVwb3J0U2h1dGRvd25UaW1lb3V0KG9wdGlvbnMuY29uZmlnPy5vbkVycm9yLCB0aW1lb3V0TXMpXG4gICAgICB9XG4gICAgfSlcbiAgICAub25SZXF1ZXN0KCh7IHJlcXVlc3QsIHNldCwgc3RvcmUgfSkgPT4ge1xuICAgICAgY29uc3QgcmVjb3JkID0gb3BlblJlY29yZChyZXF1ZXN0KVxuICAgICAgcmVjb3JkLnNldEhlYWRlcnMgPSBzZXQuaGVhZGVyc1xuICAgICAgc3RvcmUuYmVmb3JlVGltZSA9IHJlY29yZC5zdGFydGVkQXRcbiAgICAgIGxvZ2dlci5iZWdpblJlcXVlc3QocmVxdWVzdClcbiAgICAgIGlmIChyZXF1ZXN0SWRDb25maWcpIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdElkID0gZ2V0T3JDcmVhdGVSZXF1ZXN0SWQocmVxdWVzdCwgcmVxdWVzdElkQ29uZmlnKVxuICAgICAgICBjb250ZXh0U3RvcmUubWVyZ2VDb250ZXh0KHJlcXVlc3QsIHsgcmVxdWVzdElkIH0pXG4gICAgICAgIC8vIFdyaXR0ZW4gbm93LCBub3Qgd2hlbiB0aGUgbGluZSBpcyB3cml0dGVuOiB0aGUgd3JhcCBydW5zIGFmdGVyXG4gICAgICAgIC8vIHRoZSBSZXNwb25zZSBleGlzdHMsIGFuZCBhIHNob3J0LWNpcmN1aXQgbmV2ZXIgcmVhY2hlcyB0aGUgaG9va3MuXG4gICAgICAgIHNldC5oZWFkZXJzW3JlcXVlc3RJZENvbmZpZy5oZWFkZXJdID0gcmVxdWVzdElkXG4gICAgICB9XG5cbiAgICAgIGlmIChlbnJpY2hlcnMpIHtcbiAgICAgICAgYXBwbHlSZXF1ZXN0RW5yaWNoZXJzKGVucmljaGVycywgY29udGV4dFN0b3JlLCByZXF1ZXN0LCBvblNpbmtFcnJvcilcbiAgICAgIH1cblxuICAgICAgLy8gVGhlIHdyYXAgc2NvcGVzIHRoZSBsb2dnZXIgZm9yIHRoZSByZXF1ZXN0cyBpdCBzZWVzOyB0aGUgcmVzdCBrZWVwXG4gICAgICAvLyB0aGUgaG9vay1zY29wZWQgbG9nZ2VyIG9mIHRoZSBwcmV2aW91cyBkZXNpZ24uXG4gICAgICBpZiAodXNlQXN5bmNMb2NhbFN0b3JhZ2UgJiYgIXJlY29yZC53cmFwcGVkKSB7XG4gICAgICAgIGxvZ2dlclN0b3JhZ2UuZW50ZXJXaXRoKGNyZWF0ZVJlcXVlc3RTY29wZWRMb2dnZXIocmVxdWVzdCkpXG4gICAgICB9XG4gICAgfSlcbiAgICAub25BZnRlckhhbmRsZSgoeyByZXF1ZXN0LCBzZXQsIHJlc3BvbnNlIH0pID0+IHtcbiAgICAgIGNvbnN0IHJlY29yZCA9IG9wZW5SZWNvcmQocmVxdWVzdClcbiAgICAgIGlmICghcmVjb3JkLndyYXBwZWQpIHtcbiAgICAgICAgZmluaXNoVW53cmFwcGVkKFxuICAgICAgICAgIHJlcXVlc3QsXG4gICAgICAgICAgcmVjb3JkLFxuICAgICAgICAgIHJlc29sdmVIYW5kbGVkU3RhdHVzKHNldC5zdGF0dXMsIHJlc3BvbnNlKSxcbiAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIFJlc3BvbnNlID8gcmVzcG9uc2UuaGVhZGVycyA6IHVuZGVmaW5lZFxuICAgICAgICApXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgY29uc3Qgd3JhcHBlZCA9IHdyYXBTdHJlYW0ocmVxdWVzdCwgcmVjb3JkLCByZXNwb25zZSlcbiAgICAgIGlmICh3cmFwcGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHdyYXBwZWRcbiAgICAgIH1cbiAgICB9KVxuICAgIC5vbkVycm9yKCh7IHJlcXVlc3QsIGVycm9yIH0pID0+IHtcbiAgICAgIGNvbnN0IHJlY29yZCA9IG9wZW5SZWNvcmQocmVxdWVzdClcbiAgICAgIHJlY29yZC5lcnJvciA9IGVycm9yXG4gICAgICBpZiAocmVjb3JkLndyYXBwZWQpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBpZiAocmVjb3JkLnBoYXNlID09PSAnY2xvc2VkJykge1xuICAgICAgICAvLyBUaHJvd24gYWZ0ZXIgdGhlIGxpbmUgd2FzIHdyaXR0ZW4gKGEgcm91dGUgYWZ0ZXJIYW5kbGUsIGEgcmVzcG9uc2VcbiAgICAgICAgLy8gc2NoZW1hKTogYSBzZWNvbmQsIGVycm9yIGxpbmUsIGFzIGJlZm9yZSB0aGUgd3JhcCBleGlzdGVkLlxuICAgICAgICBsb2dnZXIuaGFuZGxlSHR0cEVycm9yKHJlcXVlc3QsIGVycm9yLCB7IGJlZm9yZVRpbWU6IHJlY29yZC5zdGFydGVkQXQgfSlcbiAgICAgICAgZXhpdFJlcXVlc3RTY29wZSgpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgZmluaXNoVW53cmFwcGVkKHJlcXVlc3QsIHJlY29yZCwgZXJyb3JTdGF0dXMoZXJyb3IpKVxuICAgIH0pXG4gICAgLm9uQWZ0ZXJSZXNwb25zZShjb250ZXh0ID0+IHtcbiAgICAgIGNvbnN0IHsgcmVxdWVzdCwgc2V0IH0gPSBjb250ZXh0XG4gICAgICBjb25zdCByZWNvcmQgPSBvcGVuUmVjb3JkKHJlcXVlc3QpXG4gICAgICBpZiAocmVjb3JkLndyYXBwZWQpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICAvLyBBbiBleGl0IHRoYXQgcmVhY2hlZCBuZWl0aGVyIGhvb2sgYWJvdmUgKGEgcmVzb2x2ZSBzaG9ydC1jaXJjdWl0LCBhXG4gICAgICAvLyA0MDQsIGFuIGVycm9yIGFuIGVhcmxpZXIgYXBwLXdpZGUgb25FcnJvciBhbnN3ZXJlZCkuXG4gICAgICBjb25zdCBlcnJvciA9ICdlcnJvcicgaW4gY29udGV4dCA/IGNvbnRleHQuZXJyb3IgOiB1bmRlZmluZWRcbiAgICAgIGlmIChlcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJlY29yZC5lcnJvciA9IGVycm9yXG4gICAgICB9XG4gICAgICBmaW5pc2hVbndyYXBwZWQocmVxdWVzdCwgcmVjb3JkLCBnZXRTdGF0dXNDb2RlKHNldC5zdGF0dXMpKVxuICAgIH0pXG4gICAgLmFzKCdzY29wZWQnKSBhcyBMb2dpeGx5c2lhPFRGaWVsZHM+XG5cbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24ocGx1Z2luLCB7IHdyYXBXcyB9KSBhcyBMb2dpeGx5c2lhUGx1Z2luPFRGaWVsZHM+XG59XG5cbi8qKlxuICogRHJhaW5zIGV2ZXJ5IHRyYW5zcG9ydCBhbmQgZmlsZSBzaW5rOyB3aXRoIGBjbG9zZTogdHJ1ZWAgYWxzbyByZWxlYXNlc1xuICogdGhlbS4gRm9yIHByb2Nlc3NlcyB0aGF0IHN0b3Agd2l0aG91dCBFbHlzaWEncyBgb25TdG9wYCAod29ya2VycyxcbiAqIHNjcmlwdHMsIGN1c3RvbSBzaWduYWwgaGFuZGxlcnMpLiBTYWZlIHRvIGNhbGwgbW9yZSB0aGFuIG9uY2UuXG4gKi9cbmV4cG9ydCBjb25zdCBmbHVzaExvZ2l4bHlzaWEgPSBhc3luYyAoXG4gIG9wdGlvbnM6IE9wdGlvbnMsXG4gIHsgY2xvc2UgPSBmYWxzZSB9OiB7IGNsb3NlPzogYm9vbGVhbiB9ID0ge31cbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICBhd2FpdCBmbHVzaEFsbChvcHRpb25zKVxuICBpZiAoY2xvc2UpIHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoW2Nsb3NlVHJhbnNwb3J0cyhvcHRpb25zKSwgY2xvc2VBbGxGaWxlU2lua3MoKV0pXG4gIH1cbn1cblxuZXhwb3J0IHsgcmVzb2x2ZU9wdGlvbnMgfSBmcm9tICcuL2NvbmZpZy9yZXNvbHZlLW9wdGlvbnMnXG5leHBvcnQgeyB1c2VMb2dnZXIgfSBmcm9tICcuL2NvbnRleHQvc3RvcmFnZSdcbmV4cG9ydCB0eXBlIHsgSHR0cEVycm9ySW5pdCwgSHR0cEVycm9yUGF5bG9hZCB9IGZyb20gJy4vZXJyb3JzJ1xuZXhwb3J0IHsgSHR0cEVycm9yIH0gZnJvbSAnLi9lcnJvcnMnXG5leHBvcnQgdHlwZSB7XG4gIEVucmljaGVyLFxuICBFbnJpY2hlckZpZWxkcyxcbiAgRW5yaWNoZXJMaWtlLFxuICBFbnJpY2hlclJlc3BvbnNlSW5wdXQsXG4gIEhlYWRTYW1wbGluZ0NvbmZpZyxcbiAgTG9nRmllbGRzLFxuICBMb2dGaWx0ZXIsXG4gIExvZ2dlcixcbiAgTG9naXhseXNpYUNvbmZpZyxcbiAgTG9naXhseXNpYUNvbnRleHQsXG4gIExvZ2l4bHlzaWFTdG9yZSxcbiAgTG9nTGV2ZWwsXG4gIExvZ1ByZXNldCxcbiAgTG9nUm90YXRpb25Db25maWcsXG4gIE9wdGlvbnMsXG4gIFBpbm8sXG4gIFJlcXVlc3RJZENvbmZpZyxcbiAgUmVxdWVzdFNjb3BlZExvZ2dlcixcbiAgU2FtcGxpbmdDb25maWcsXG4gIFNpbmtFcnJvckNvbnRleHQsXG4gIFN0b3JlRGF0YSxcbiAgVGFpbFNhbXBsaW5nQ29uZmlnLFxuICBUcmFuc3BvcnRcbn0gZnJvbSAnLi9pbnRlcmZhY2VzJ1xuZXhwb3J0IHsgY3JlYXRlTG9nZ2VyLCBjcmVhdGVQbHVnaW5Mb2dnZXIgfSBmcm9tICcuL2xvZ2dlcidcbmV4cG9ydCB0eXBlIHsgUmVzb2x2ZWRSZXF1ZXN0SWRDb25maWcgfSBmcm9tICcuL21pZGRsZXdhcmUvcmVxdWVzdC1pZCdcbmV4cG9ydCB7XG4gIGdldE9yQ3JlYXRlUmVxdWVzdElkLFxuICByZXNvbHZlUmVxdWVzdElkQ29uZmlnXG59IGZyb20gJy4vbWlkZGxld2FyZS9yZXF1ZXN0LWlkJ1xuZXhwb3J0IHR5cGUge1xuICBSZXF1ZXN0T3V0Y29tZSxcbiAgU2FtcGxpbmdEZWNpc2lvbixcbiAgU2FtcGxpbmdSdW50aW1lXG59IGZyb20gJy4vc2FtcGxpbmcnXG5leHBvcnQgeyByZXNvbHZlU2FtcGxpbmcgfSBmcm9tICcuL3NhbXBsaW5nJ1xuZXhwb3J0IHR5cGUgeyBXZWJTb2NrZXRMaWtlIH0gZnJvbSAnLi93ZWJzb2NrZXQvd3JhcC13cydcbmV4cG9ydCB0eXBlIHsgV3NIYW5kbGVySG9va3MgfSBmcm9tICcuL3dlYnNvY2tldC93cmFwLXdzJ1xuZXhwb3J0IHsgY3JlYXRlV3NIYW5kbGVyV3JhcHBlciB9IGZyb20gJy4vd2Vic29ja2V0L3dyYXAtd3MnXG5cbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZUxvZ2l4bHlzaWFQbHVnaW5cbmV4cG9ydCBjb25zdCBsb2dpeGx5c2lhOiB0eXBlb2YgY3JlYXRlTG9naXhseXNpYVBsdWdpbiA9IGNyZWF0ZUxvZ2l4bHlzaWFQbHVnaW5cbiIsCiAgICAiaW1wb3J0IHsgcHJvbWlzZXMgYXMgZnMgfSBmcm9tICdub2RlOmZzJ1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJ1xuXG5jb25zdCBTSVpFX1JFR0VYID0gL14oPzxhbW91bnQ+XFxkKyg/OlxcLlxcZCspPykoPzx1bml0PltHS01na21dW0JiXT8pJC91XG5jb25zdCBJTlRFUlZBTF9SRUdFWCA9IC9eKD88YW1vdW50PlxcZCspKD88dW5pdD5bZGh3XSkkL2l1XG5jb25zdCBST1RBVEVEX1JFR0VYID1cbiAgL1xcLlxcZHs0fS1cXGR7Mn0tXFxkezJ9LVxcZHsyfS1cXGR7Mn0tXFxkezJ9KD86LVxcZHszfSk/KD86LVxcZCspPyg/OlxcLmd6KT8kL3VcblxuZXhwb3J0IGNvbnN0IHBhcnNlU2l6ZSA9ICh2YWx1ZTogbnVtYmVyIHwgc3RyaW5nKTogbnVtYmVyID0+IHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZSh2YWx1ZSkgfHwgdmFsdWUgPD0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHNpemU6ICR7dmFsdWV9YClcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICBjb25zdCB0cmltbWVkID0gdmFsdWUudHJpbSgpXG4gIGlmICh0cmltbWVkICE9PSAnJykge1xuICAgIGNvbnN0IGFzTnVtYmVyID0gTnVtYmVyKHRyaW1tZWQpXG4gICAgaWYgKE51bWJlci5pc0Zpbml0ZShhc051bWJlcikpIHtcbiAgICAgIGlmIChhc051bWJlciA8PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzaXplOiAke3ZhbHVlfWApXG4gICAgICB9XG4gICAgICByZXR1cm4gYXNOdW1iZXJcbiAgICB9XG4gIH1cblxuICBjb25zdCBtYXRjaCA9IHRyaW1tZWQubWF0Y2goU0laRV9SRUdFWClcbiAgaWYgKCFtYXRjaCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzaXplIGZvcm1hdDogJHt2YWx1ZX1gKVxuICB9XG5cbiAgY29uc3QgYW1vdW50ID0gTnVtYmVyKG1hdGNoWzFdKVxuICBjb25zdCB1bml0ID0gbWF0Y2hbMl0udG9Mb3dlckNhc2UoKVxuXG4gIGxldCBiYXNlID0gMTAyNFxuICBpZiAodW5pdC5zdGFydHNXaXRoKCdtJykpIHtcbiAgICBiYXNlID0gMTAyNCAqIDEwMjRcbiAgfSBlbHNlIGlmICh1bml0LnN0YXJ0c1dpdGgoJ2cnKSkge1xuICAgIGJhc2UgPSAxMDI0ICogMTAyNCAqIDEwMjRcbiAgfVxuXG4gIGNvbnN0IGJ5dGVzID0gTWF0aC5mbG9vcihhbW91bnQgKiBiYXNlKVxuICBpZiAoYnl0ZXMgPCAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHNpemUgZm9ybWF0OiAke3ZhbHVlfWApXG4gIH1cbiAgcmV0dXJuIGJ5dGVzXG59XG5cbmV4cG9ydCBjb25zdCBwYXJzZUludGVydmFsID0gKHZhbHVlOiBzdHJpbmcpOiBudW1iZXIgPT4ge1xuICBjb25zdCBtYXRjaCA9IHZhbHVlLnRyaW0oKS5tYXRjaChJTlRFUlZBTF9SRUdFWClcbiAgaWYgKCFtYXRjaCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBpbnRlcnZhbCBmb3JtYXQ6ICR7dmFsdWV9YClcbiAgfVxuXG4gIGNvbnN0IGFtb3VudCA9IE51bWJlcihtYXRjaFsxXSlcbiAgaWYgKCEoYW1vdW50ID4gMCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgaW50ZXJ2YWwgZm9ybWF0OiAke3ZhbHVlfWApXG4gIH1cbiAgY29uc3QgdW5pdCA9IG1hdGNoWzJdLnRvTG93ZXJDYXNlKClcblxuICBsZXQgbXMgPSA2MCAqIDYwICogMTAwMFxuICBpZiAodW5pdCA9PT0gJ2QnKSB7XG4gICAgbXMgPSAyNCAqIDYwICogNjAgKiAxMDAwXG4gIH0gZWxzZSBpZiAodW5pdCA9PT0gJ3cnKSB7XG4gICAgbXMgPSA3ICogMjQgKiA2MCAqIDYwICogMTAwMFxuICB9XG5cbiAgcmV0dXJuIGFtb3VudCAqIG1zXG59XG5cbmV4cG9ydCBjb25zdCBwYXJzZVJldGVudGlvbiA9IChcbiAgdmFsdWU6IG51bWJlciB8IHN0cmluZ1xuKTogeyB0eXBlOiAnY291bnQnIHwgJ3RpbWUnOyB2YWx1ZTogbnVtYmVyIH0gPT4ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIGlmICghKE51bWJlci5pc0ludGVnZXIodmFsdWUpICYmIHZhbHVlID4gMCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgbWF4RmlsZXMgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIsIGdvdCAke3ZhbHVlfWApXG4gICAgfVxuICAgIHJldHVybiB7IHR5cGU6ICdjb3VudCcsIHZhbHVlIH1cbiAgfVxuICByZXR1cm4geyB0eXBlOiAndGltZScsIHZhbHVlOiBwYXJzZUludGVydmFsKHZhbHVlKSB9XG59XG5cbmV4cG9ydCBjb25zdCBzaG91bGRSb3RhdGVCeVNpemUgPSBhc3luYyAoXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIG1heFNpemVCeXRlczogbnVtYmVyXG4pOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0ID0gYXdhaXQgZnMuc3RhdChmaWxlUGF0aClcbiAgICByZXR1cm4gc3RhdC5zaXplID4gbWF4U2l6ZUJ5dGVzXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBnZXRSb3RhdGVkRmlsZXMgPSBhc3luYyAoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10+ID0+IHtcbiAgY29uc3QgZGlyID0gcGF0aC5kaXJuYW1lKGZpbGVQYXRoKVxuICBjb25zdCBiYXNlID0gcGF0aC5iYXNlbmFtZShmaWxlUGF0aClcblxuICBsZXQgZW50cmllczogc3RyaW5nW11cbiAgdHJ5IHtcbiAgICBlbnRyaWVzID0gYXdhaXQgZnMucmVhZGRpcihkaXIpXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBbXVxuICB9XG5cbiAgcmV0dXJuIGVudHJpZXNcbiAgICAuZmlsdGVyKG5hbWUgPT4gbmFtZS5zdGFydHNXaXRoKGAke2Jhc2V9LmApICYmIFJPVEFURURfUkVHRVgudGVzdChuYW1lKSlcbiAgICAubWFwKG5hbWUgPT4gYCR7ZGlyfS8ke25hbWV9YClcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBMb2dQcmVzZXQsIE9wdGlvbnMgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgcGFyc2VJbnRlcnZhbCwgcGFyc2VSZXRlbnRpb24sIHBhcnNlU2l6ZSB9IGZyb20gJy4uL3V0aWxzL3JvdGF0aW9uJ1xuXG5jb25zdCBWQUxJRF9QUkVTRVRTOiBSZWFkb25seVNldDxMb2dQcmVzZXQ+ID0gbmV3IFNldChbJ2RldicsICdwcm9kJywgJ2pzb24nXSlcblxuY29uc3QgdmFsaWRhdGVMb2dSb3RhdGlvbiA9IChjb25maWc6IE9wdGlvbnNbJ2NvbmZpZyddKTogdm9pZCA9PiB7XG4gIGNvbnN0IGxvZ1JvdGF0aW9uID0gY29uZmlnPy5sb2dSb3RhdGlvblxuICBpZiAoIWxvZ1JvdGF0aW9uKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICB0cnkge1xuICAgIGlmIChsb2dSb3RhdGlvbi5tYXhTaXplICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHBhcnNlU2l6ZShsb2dSb3RhdGlvbi5tYXhTaXplKVxuICAgIH1cbiAgICBpZiAobG9nUm90YXRpb24ubWF4RmlsZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcGFyc2VSZXRlbnRpb24obG9nUm90YXRpb24ubWF4RmlsZXMpXG4gICAgfVxuICAgIGlmIChsb2dSb3RhdGlvbi5pbnRlcnZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwYXJzZUludGVydmFsKGxvZ1JvdGF0aW9uLmludGVydmFsKVxuICAgIH1cbiAgICBpZiAoXG4gICAgICBsb2dSb3RhdGlvbi5jb21wcmVzc2lvbiAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBsb2dSb3RhdGlvbi5jb21wcmVzc2lvbiAhPT0gJ2d6aXAnXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIGNvbXByZXNzaW9uIGFsZ29yaXRobTogJHtsb2dSb3RhdGlvbi5jb21wcmVzc2lvbn1gXG4gICAgICApXG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGxvZ2l4bHlzaWE6IGludmFsaWQgbG9nUm90YXRpb24gY29uZmlnIOKAlCAke21lc3NhZ2V9YCwge1xuICAgICAgY2F1c2U6IGVycm9yXG4gICAgfSlcbiAgfVxufVxuXG5jb25zdCBNQVhfU0FNUExJTkdfUkFURSA9IDEwMFxuXG5jb25zdCBpc1BlcmNlbnRhZ2UgPSAodmFsdWU6IHVua25vd24pOiBib29sZWFuID0+XG4gIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiZcbiAgTnVtYmVyLmlzRmluaXRlKHZhbHVlKSAmJlxuICB2YWx1ZSA+PSAwICYmXG4gIHZhbHVlIDw9IE1BWF9TQU1QTElOR19SQVRFXG5cbmNvbnN0IGlzTm9uTmVnYXRpdmVOdW1iZXIgPSAodmFsdWU6IHVua25vd24pOiBib29sZWFuID0+XG4gIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzRmluaXRlKHZhbHVlKSAmJiB2YWx1ZSA+PSAwXG5cbmNvbnN0IFZBTElEX1NBTVBMSU5HX0xFVkVMUyA9IFsnREVCVUcnLCAnSU5GTycsICdXQVJOSU5HJywgJ0VSUk9SJ10gYXMgY29uc3RcblxuY29uc3QgaW52YWxpZFNhbXBsaW5nID0gKGRldGFpbDogc3RyaW5nKTogbmV2ZXIgPT4ge1xuICB0aHJvdyBuZXcgRXJyb3IoYGxvZ2l4bHlzaWE6IGludmFsaWQgc2FtcGxpbmcgY29uZmlnIOKAlCAke2RldGFpbH1gKVxufVxuXG5jb25zdCBpbnZhbGlkRm9ybWF0dGluZyA9IChkZXRhaWw6IHN0cmluZyk6IG5ldmVyID0+IHtcbiAgdGhyb3cgbmV3IEVycm9yKGBsb2dpeGx5c2lhOiBpbnZhbGlkIGZvcm1hdHRpbmcgY29uZmlnIOKAlCAke2RldGFpbH1gKVxufVxuXG5jb25zdCBpbnZhbGlkTG9nRmlsdGVyID0gKGRldGFpbDogc3RyaW5nKTogbmV2ZXIgPT4ge1xuICB0aHJvdyBuZXcgRXJyb3IoYGxvZ2l4bHlzaWE6IGludmFsaWQgbG9nRmlsdGVyIGNvbmZpZyDigJQgJHtkZXRhaWx9YClcbn1cblxuY29uc3QgaW52YWxpZE91dHB1dCA9IChkZXRhaWw6IHN0cmluZyk6IG5ldmVyID0+IHtcbiAgdGhyb3cgbmV3IEVycm9yKGBsb2dpeGx5c2lhOiBpbnZhbGlkIG91dHB1dCBjb25maWcg4oCUICR7ZGV0YWlsfWApXG59XG5cbmNvbnN0IHZhbGlkYXRlU2FtcGxpbmcgPSAoY29uZmlnOiBPcHRpb25zWydjb25maWcnXSk6IHZvaWQgPT4ge1xuICBjb25zdCBzYW1wbGluZyA9IGNvbmZpZz8uc2FtcGxpbmdcbiAgaWYgKCFzYW1wbGluZykge1xuICAgIHJldHVyblxuICB9XG5cbiAgZm9yIChjb25zdCBbbGV2ZWwsIHJhdGVdIG9mIE9iamVjdC5lbnRyaWVzKHNhbXBsaW5nLmhlYWQgPz8ge30pKSB7XG4gICAgaWYgKCFWQUxJRF9TQU1QTElOR19MRVZFTFMuaW5jbHVkZXMobGV2ZWwgYXMgbmV2ZXIpKSB7XG4gICAgICBpbnZhbGlkU2FtcGxpbmcoXG4gICAgICAgIGBoZWFkLiR7bGV2ZWx9IGlzIG5vdCBhIHZhbGlkIGxldmVsIChtdXN0IGJlIERFQlVHLCBJTkZPLCBXQVJOSU5HLCBvciBFUlJPUilgXG4gICAgICApXG4gICAgfVxuICAgIGlmICghaXNQZXJjZW50YWdlKHJhdGUpKSB7XG4gICAgICBpbnZhbGlkU2FtcGxpbmcoYGhlYWQuJHtsZXZlbH0gbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDEwMGApXG4gICAgfVxuICB9XG5cbiAgY29uc3QgeyB0YWlsIH0gPSBzYW1wbGluZ1xuICBpZiAodGFpbD8uc3RhdHVzICE9PSB1bmRlZmluZWQgJiYgIWlzTm9uTmVnYXRpdmVOdW1iZXIodGFpbC5zdGF0dXMpKSB7XG4gICAgaW52YWxpZFNhbXBsaW5nKCd0YWlsLnN0YXR1cyBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlcicpXG4gIH1cbiAgaWYgKHRhaWw/LmR1cmF0aW9uTXMgIT09IHVuZGVmaW5lZCAmJiAhaXNOb25OZWdhdGl2ZU51bWJlcih0YWlsLmR1cmF0aW9uTXMpKSB7XG4gICAgaW52YWxpZFNhbXBsaW5nKCd0YWlsLmR1cmF0aW9uTXMgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXInKVxuICB9XG4gIGlmICh0YWlsPy5wYXRocyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHRhaWwucGF0aHMpKSB7XG4gICAgICBpbnZhbGlkU2FtcGxpbmcoJ3RhaWwucGF0aHMgbXVzdCBiZSBhbiBhcnJheScpXG4gICAgfVxuICAgIGlmIChcbiAgICAgIHRhaWwucGF0aHMuc29tZShwYXRoID0+IHR5cGVvZiBwYXRoICE9PSAnc3RyaW5nJyB8fCBwYXRoLmxlbmd0aCA9PT0gMClcbiAgICApIHtcbiAgICAgIGludmFsaWRTYW1wbGluZygndGFpbC5wYXRocyBtdXN0IGNvbnRhaW4gbm9uLWVtcHR5IGdsb2Igc3RyaW5ncycpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgeyBtYXhCdWZmZXJlZFBlclJlcXVlc3QgfSA9IHNhbXBsaW5nXG4gIGlmIChcbiAgICBtYXhCdWZmZXJlZFBlclJlcXVlc3QgIT09IHVuZGVmaW5lZCAmJlxuICAgICEoTnVtYmVyLmlzSW50ZWdlcihtYXhCdWZmZXJlZFBlclJlcXVlc3QpICYmIG1heEJ1ZmZlcmVkUGVyUmVxdWVzdCA+PSAwKVxuICApIHtcbiAgICBpbnZhbGlkU2FtcGxpbmcoJ21heEJ1ZmZlcmVkUGVyUmVxdWVzdCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXInKVxuICB9XG59XG5cbmNvbnN0IHZhbGlkYXRlRm9ybWF0dGluZyA9IChjb25maWc6IE9wdGlvbnNbJ2NvbmZpZyddKTogdm9pZCA9PiB7XG4gIGNvbnN0IHNsb3dUaHJlc2hvbGQgPSBjb25maWc/LnNsb3dUaHJlc2hvbGRcbiAgY29uc3QgdmVyeVNsb3dUaHJlc2hvbGQgPSBjb25maWc/LnZlcnlTbG93VGhyZXNob2xkXG5cbiAgaWYgKHNsb3dUaHJlc2hvbGQgIT09IHVuZGVmaW5lZCAmJiAhaXNOb25OZWdhdGl2ZU51bWJlcihzbG93VGhyZXNob2xkKSkge1xuICAgIGludmFsaWRGb3JtYXR0aW5nKFxuICAgICAgYHNsb3dUaHJlc2hvbGQgbXVzdCBiZSBhIGZpbml0ZSBub24tbmVnYXRpdmUgbnVtYmVyLCBnb3QgJHtzbG93VGhyZXNob2xkfWBcbiAgICApXG4gIH1cbiAgaWYgKFxuICAgIHZlcnlTbG93VGhyZXNob2xkICE9PSB1bmRlZmluZWQgJiZcbiAgICAhaXNOb25OZWdhdGl2ZU51bWJlcih2ZXJ5U2xvd1RocmVzaG9sZClcbiAgKSB7XG4gICAgaW52YWxpZEZvcm1hdHRpbmcoXG4gICAgICBgdmVyeVNsb3dUaHJlc2hvbGQgbXVzdCBiZSBhIGZpbml0ZSBub24tbmVnYXRpdmUgbnVtYmVyLCBnb3QgJHt2ZXJ5U2xvd1RocmVzaG9sZH1gXG4gICAgKVxuICB9XG4gIGlmIChcbiAgICBzbG93VGhyZXNob2xkICE9PSB1bmRlZmluZWQgJiZcbiAgICB2ZXJ5U2xvd1RocmVzaG9sZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgc2xvd1RocmVzaG9sZCA+IHZlcnlTbG93VGhyZXNob2xkXG4gICkge1xuICAgIGludmFsaWRGb3JtYXR0aW5nKFxuICAgICAgYHNsb3dUaHJlc2hvbGQgKCR7c2xvd1RocmVzaG9sZH0pIG11c3Qgbm90IGV4Y2VlZCB2ZXJ5U2xvd1RocmVzaG9sZCAoJHt2ZXJ5U2xvd1RocmVzaG9sZH0pYFxuICAgIClcbiAgfVxufVxuXG5jb25zdCB2YWxpZGF0ZUxvZ0ZpbHRlciA9IChjb25maWc6IE9wdGlvbnNbJ2NvbmZpZyddKTogdm9pZCA9PiB7XG4gIGNvbnN0IGxldmVsID0gY29uZmlnPy5sb2dGaWx0ZXI/LmxldmVsXG4gIGlmIChsZXZlbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCBpc0tub3duTGV2ZWxMaXN0ID1cbiAgICBBcnJheS5pc0FycmF5KGxldmVsKSAmJlxuICAgIGxldmVsLmV2ZXJ5KGVudHJ5ID0+IFZBTElEX1NBTVBMSU5HX0xFVkVMUy5pbmNsdWRlcyhlbnRyeSkpXG4gIGlmICghaXNLbm93bkxldmVsTGlzdCkge1xuICAgIGludmFsaWRMb2dGaWx0ZXIoXG4gICAgICBgbGV2ZWwgbXVzdCBiZSBhbiBhcnJheSBvZiBERUJVRywgSU5GTywgV0FSTklORyBvciBFUlJPUiwgZ290ICR7SlNPTi5zdHJpbmdpZnkobGV2ZWwpfWBcbiAgICApXG4gIH1cbn1cblxuY29uc3QgdmFsaWRhdGVPdXRwdXQgPSAoY29uZmlnOiBPcHRpb25zWydjb25maWcnXSk6IHZvaWQgPT4ge1xuICBpZiAoXG4gICAgY29uZmlnPy51c2VUcmFuc3BvcnRzT25seSA9PT0gdHJ1ZSAmJlxuICAgIChjb25maWcudHJhbnNwb3J0cz8ubGVuZ3RoID8/IDApID09PSAwXG4gICkge1xuICAgIGludmFsaWRPdXRwdXQoXG4gICAgICAndXNlVHJhbnNwb3J0c09ubHkgaXMgc2V0IGJ1dCB0cmFuc3BvcnRzIGlzIGVtcHR5OyBhZGQgYSB0cmFuc3BvcnQgb3IgcmVtb3ZlIHVzZVRyYW5zcG9ydHNPbmx5J1xuICAgIClcbiAgfVxuXG4gIGNvbnN0IGZsdXNoVGltZW91dE1zID0gY29uZmlnPy5mbHVzaFRpbWVvdXRNc1xuICBpZiAoZmx1c2hUaW1lb3V0TXMgIT09IHVuZGVmaW5lZCAmJiAhaXNOb25OZWdhdGl2ZU51bWJlcihmbHVzaFRpbWVvdXRNcykpIHtcbiAgICBpbnZhbGlkT3V0cHV0KFxuICAgICAgYGZsdXNoVGltZW91dE1zIG11c3QgYmUgYSBmaW5pdGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBhdCBvciBhYm92ZSAwLCBnb3QgJHtmbHVzaFRpbWVvdXRNc31gXG4gICAgKVxuICB9XG59XG5cbmNvbnN0IFBSRVNFVF9ERUZBVUxUUzogUmVjb3JkPExvZ1ByZXNldCwgTm9uTnVsbGFibGU8T3B0aW9uc1snY29uZmlnJ10+PiA9IHtcbiAgZGV2OiB7XG4gICAgcGlubzoge1xuICAgICAgcHJldHR5UHJpbnQ6IHRydWVcbiAgICB9LFxuICAgIHNob3dDb250ZXh0VHJlZTogdHJ1ZSxcbiAgICBzaG93U3RhcnR1cE1lc3NhZ2U6IHRydWUsXG4gICAgc3RhcnR1cE1lc3NhZ2VGb3JtYXQ6ICdiYW5uZXInLFxuICAgIHVzZUNvbG9yczogdHJ1ZVxuICB9LFxuICBqc29uOiB7XG4gICAgcGlubzoge1xuICAgICAgcHJldHR5UHJpbnQ6IGZhbHNlXG4gICAgfSxcbiAgICBzaG93Q29udGV4dFRyZWU6IGZhbHNlLFxuICAgIHNob3dTdGFydHVwTWVzc2FnZTogZmFsc2UsXG4gICAgdXNlQ29sb3JzOiBmYWxzZVxuICB9LFxuICBwcm9kOiB7XG4gICAgYXV0b1JlZGFjdDogdHJ1ZSxcbiAgICBwaW5vOiB7XG4gICAgICBwcmV0dHlQcmludDogZmFsc2VcbiAgICB9LFxuICAgIHJlcXVlc3RJZDogdHJ1ZSxcbiAgICBzaG93Q29udGV4dFRyZWU6IGZhbHNlLFxuICAgIHNob3dTdGFydHVwTWVzc2FnZTogZmFsc2UsXG4gICAgdXNlQ29sb3JzOiBmYWxzZVxuICB9XG59XG5cbmNvbnN0IG1lcmdlQ29uZmlnID0gKFxuICBiYXNlOiBOb25OdWxsYWJsZTxPcHRpb25zWydjb25maWcnXT4sXG4gIG92ZXJyaWRlPzogT3B0aW9uc1snY29uZmlnJ11cbik6IE5vbk51bGxhYmxlPE9wdGlvbnNbJ2NvbmZpZyddPiA9PiB7XG4gIGlmICghb3ZlcnJpZGUpIHtcbiAgICByZXR1cm4gYmFzZVxuICB9XG5cbiAgY29uc3QgbWVyZ2VkOiBOb25OdWxsYWJsZTxPcHRpb25zWydjb25maWcnXT4gPSB7IC4uLmJhc2UsIC4uLm92ZXJyaWRlIH1cblxuICBpZiAoYmFzZS5waW5vIHx8IG92ZXJyaWRlLnBpbm8pIHtcbiAgICBtZXJnZWQucGlubyA9IHtcbiAgICAgIC4uLmJhc2UucGlubyxcbiAgICAgIC4uLm92ZXJyaWRlLnBpbm8sXG4gICAgICAuLi4oYmFzZS5waW5vPy5wcmV0dHlQcmludCAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICBvdmVycmlkZS5waW5vPy5wcmV0dHlQcmludCAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8ge1xuICAgICAgICAgICAgcHJldHR5UHJpbnQ6IG92ZXJyaWRlLnBpbm8/LnByZXR0eVByaW50ID8/IGJhc2UucGlubz8ucHJldHR5UHJpbnRcbiAgICAgICAgICB9XG4gICAgICAgIDoge30pXG4gICAgfVxuICB9XG5cbiAgaWYgKGJhc2UubG9nRmlsdGVyIHx8IG92ZXJyaWRlLmxvZ0ZpbHRlcikge1xuICAgIG1lcmdlZC5sb2dGaWx0ZXIgPSB7XG4gICAgICAuLi5iYXNlLmxvZ0ZpbHRlcixcbiAgICAgIC4uLm92ZXJyaWRlLmxvZ0ZpbHRlclxuICAgIH1cbiAgfVxuXG4gIGlmIChiYXNlLnNhbXBsaW5nIHx8IG92ZXJyaWRlLnNhbXBsaW5nKSB7XG4gICAgbWVyZ2VkLnNhbXBsaW5nID0ge1xuICAgICAgLi4uYmFzZS5zYW1wbGluZyxcbiAgICAgIC4uLm92ZXJyaWRlLnNhbXBsaW5nXG4gICAgfVxuICB9XG5cbiAgaWYgKGJhc2UubG9nUm90YXRpb24gfHwgb3ZlcnJpZGUubG9nUm90YXRpb24pIHtcbiAgICBtZXJnZWQubG9nUm90YXRpb24gPSB7XG4gICAgICAuLi5iYXNlLmxvZ1JvdGF0aW9uLFxuICAgICAgLi4ub3ZlcnJpZGUubG9nUm90YXRpb25cbiAgICB9XG4gIH1cblxuICBpZiAoYmFzZS50aW1lc3RhbXAgfHwgb3ZlcnJpZGUudGltZXN0YW1wKSB7XG4gICAgbWVyZ2VkLnRpbWVzdGFtcCA9IHtcbiAgICAgIC4uLmJhc2UudGltZXN0YW1wLFxuICAgICAgLi4ub3ZlcnJpZGUudGltZXN0YW1wXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1lcmdlZFxufVxuXG4vKiogQXBwbGllcyBwcmVzZXQgZGVmYXVsdHM7IGV4cGxpY2l0IGBjb25maWdgIGtleXMgb3ZlcnJpZGUgcHJlc2V0IHZhbHVlcy4gKi9cbmV4cG9ydCBjb25zdCByZXNvbHZlT3B0aW9ucyA9IChvcHRpb25zOiBPcHRpb25zID0ge30pOiBPcHRpb25zID0+IHtcbiAgY29uc3QgeyBwcmVzZXQgfSA9IG9wdGlvbnNcbiAgaWYgKHByZXNldCAmJiAhVkFMSURfUFJFU0VUUy5oYXMocHJlc2V0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgbG9naXhseXNpYTogaW52YWxpZCBwcmVzZXQg4oCUICR7cHJlc2V0fWApXG4gIH1cblxuICBjb25zdCByZXNvbHZlZCA9IHByZXNldFxuICAgID8ge1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBjb25maWc6IG1lcmdlQ29uZmlnKFBSRVNFVF9ERUZBVUxUU1twcmVzZXRdLCBvcHRpb25zLmNvbmZpZylcbiAgICAgIH1cbiAgICA6IG9wdGlvbnNcblxuICB2YWxpZGF0ZUxvZ1JvdGF0aW9uKHJlc29sdmVkLmNvbmZpZylcbiAgdmFsaWRhdGVTYW1wbGluZyhyZXNvbHZlZC5jb25maWcpXG4gIHZhbGlkYXRlRm9ybWF0dGluZyhyZXNvbHZlZC5jb25maWcpXG4gIHZhbGlkYXRlTG9nRmlsdGVyKHJlc29sdmVkLmNvbmZpZylcbiAgdmFsaWRhdGVPdXRwdXQocmVzb2x2ZWQuY29uZmlnKVxuICByZXR1cm4gcmVzb2x2ZWRcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBTaW5rRXJyb3JDb250ZXh0IH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcblxuY29uc3QgUkVQT1JUX0lOVEVSVkFMX01TID0gNTAwMFxuXG5leHBvcnQgdHlwZSBFcnJvclJlcG9ydGVyID0gKFxuICBlcnJvcjogdW5rbm93bixcbiAgb25FcnJvcj86IChjb250ZXh0OiBTaW5rRXJyb3JDb250ZXh0KSA9PiB2b2lkXG4pID0+IHZvaWRcblxuLyoqXG4gKiBSb3V0ZXMgYSBmYWlsdXJlIHRvIGBjb25maWcub25FcnJvcmAsIG9yIOKAlCB3aGVuIG5vIGhvb2sgaXMgY29uZmlndXJlZCDigJQgdG9cbiAqIHN0ZGVyciBhdCBtb3N0IG9uY2UgcGVyIGludGVydmFsLCBzbyBhIGNvbXBvbmVudCB0aGF0IGZhaWxzIG9uIGV2ZXJ5IHJlcXVlc3RcbiAqIGNhbm5vdCBmbG9vZCB0aGUgdmVyeSBsb2cgaXQgaXMgbWVhbnQgdG8gYmUgZmVlZGluZy5cbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZUVycm9yUmVwb3J0ZXIgPSAoXG4gIHNpbms6IFNpbmtFcnJvckNvbnRleHRbJ3NpbmsnXSxcbiAgbGFiZWw6IHN0cmluZ1xuKTogRXJyb3JSZXBvcnRlciA9PiB7XG4gIGxldCBsYXN0UmVwb3J0ZWRBdCA9IDBcblxuICByZXR1cm4gKGVycm9yLCBvbkVycm9yKSA9PiB7XG4gICAgaWYgKG9uRXJyb3IpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG9uRXJyb3IoeyBlcnJvciwgc2luayB9KVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIFN3YWxsb3cgZXJyb3JzIHRocm93biBieSB0aGUgaG9vayBpdHNlbGYuXG4gICAgICB9XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpXG4gICAgaWYgKG5vdyAtIGxhc3RSZXBvcnRlZEF0IDwgUkVQT1JUX0lOVEVSVkFMX01TKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgbGFzdFJlcG9ydGVkQXQgPSBub3dcbiAgICBjb25zb2xlLmVycm9yKGBbbG9naXhseXNpYV0gJHtsYWJlbH06YCwgZXJyb3IpXG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUge1xuICBFbnJpY2hlckZpZWxkcyxcbiAgRW5yaWNoZXJMaWtlLFxuICBFbnJpY2hlclJlc3BvbnNlSW5wdXQsXG4gIFNpbmtFcnJvckNvbnRleHRcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcydcbmltcG9ydCB7IGNyZWF0ZUVycm9yUmVwb3J0ZXIgfSBmcm9tICcuLi91dGlscy9yZXBvcnQnXG5pbXBvcnQgdHlwZSB7IFJlcXVlc3RDb250ZXh0U3RvcmUgfSBmcm9tICcuL3JlcXVlc3QtY29udGV4dCdcblxuY29uc3QgcmVwb3J0RW5yaWNoZXJFcnJvciA9IGNyZWF0ZUVycm9yUmVwb3J0ZXIoJ2VucmljaGVyJywgJ2VucmljaGVyIGZhaWxlZCcpXG5cbnR5cGUgUmVxdWVzdFBoYXNlID0gKHJlcXVlc3Q6IFJlcXVlc3QpID0+IEVucmljaGVyRmllbGRzXG50eXBlIFJlc3BvbnNlUGhhc2UgPSAoaW5wdXQ6IEVucmljaGVyUmVzcG9uc2VJbnB1dCkgPT4gRW5yaWNoZXJGaWVsZHNcblxuLyoqIEVucmljaGVyIHBoYXNlcyBzcGxpdCBzbyBlYWNoIHJlcXVlc3Qgb25seSB3YWxrcyB0aGUgaG9va3MgdGhhdCBleGlzdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRFbnJpY2hlcnMge1xuICByZXF1ZXN0OiBSZXF1ZXN0UGhhc2VbXVxuICByZXNwb25zZTogUmVzcG9uc2VQaGFzZVtdXG59XG5cbi8qKiBTcGxpdHMgY29uZmlndXJlZCBlbnJpY2hlcnMgYnkgcGhhc2UsIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlcmUgYXJlIG5vbmUuICovXG5leHBvcnQgY29uc3QgcmVzb2x2ZUVucmljaGVycyA9IChcbiAgZW5yaWNoZXJzPzogRW5yaWNoZXJMaWtlW11cbik6IFJlc29sdmVkRW5yaWNoZXJzIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKCFlbnJpY2hlcnM/Lmxlbmd0aCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgcmVxdWVzdDogUmVxdWVzdFBoYXNlW10gPSBbXVxuICBjb25zdCByZXNwb25zZTogUmVzcG9uc2VQaGFzZVtdID0gW11cblxuICBmb3IgKGNvbnN0IGVucmljaGVyIG9mIGVucmljaGVycykge1xuICAgIGlmICh0eXBlb2YgZW5yaWNoZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJlcXVlc3QucHVzaChlbnJpY2hlcilcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGlmIChlbnJpY2hlci5yZXF1ZXN0KSB7XG4gICAgICByZXF1ZXN0LnB1c2goZW5yaWNoZXIucmVxdWVzdClcbiAgICB9XG4gICAgaWYgKGVucmljaGVyLnJlc3BvbnNlKSB7XG4gICAgICByZXNwb25zZS5wdXNoKGVucmljaGVyLnJlc3BvbnNlKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXF1ZXN0Lmxlbmd0aCA9PT0gMCAmJiByZXNwb25zZS5sZW5ndGggPT09IDBcbiAgICA/IHVuZGVmaW5lZFxuICAgIDogeyByZXF1ZXN0LCByZXNwb25zZSB9XG59XG5cbi8qKlxuICogUnVucyBvbmUgcGhhc2UgYW5kIG1lcmdlcyB3aGF0IGl0IHJldHVybnMgaW50byB0aGUgcmVxdWVzdCBjb250ZXh0LiBBIGhvb2tcbiAqIHRoYXQgdGhyb3dzIGlzIHJlcG9ydGVkIGFuZCBza2lwcGVkOiBlbnJpY2htZW50IGlzIGRlY29yYXRpb24sIGFuZCBtdXN0XG4gKiBuZXZlciB0YWtlIGEgcmVxdWVzdCBkb3duIHdpdGggaXQuXG4gKi9cbmNvbnN0IHJ1blBoYXNlID0gPFRJbnB1dD4oXG4gIGhvb2tzOiAoKGlucHV0OiBUSW5wdXQpID0+IEVucmljaGVyRmllbGRzKVtdLFxuICBpbnB1dDogVElucHV0LFxuICBjb250ZXh0U3RvcmU6IFJlcXVlc3RDb250ZXh0U3RvcmUsXG4gIGtleTogUmVxdWVzdCxcbiAgb25FcnJvcj86IChjb250ZXh0OiBTaW5rRXJyb3JDb250ZXh0KSA9PiB2b2lkXG4pOiB2b2lkID0+IHtcbiAgZm9yIChjb25zdCBob29rIG9mIGhvb2tzKSB7XG4gICAgbGV0IGZpZWxkczogRW5yaWNoZXJGaWVsZHNcbiAgICB0cnkge1xuICAgICAgZmllbGRzID0gaG9vayhpbnB1dClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmVwb3J0RW5yaWNoZXJFcnJvcihlcnJvciwgb25FcnJvcilcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGlmIChmaWVsZHMpIHtcbiAgICAgIGNvbnRleHRTdG9yZS5tZXJnZUNvbnRleHQoa2V5LCBmaWVsZHMpXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBhcHBseVJlcXVlc3RFbnJpY2hlcnMgPSAoXG4gIGVucmljaGVyczogUmVzb2x2ZWRFbnJpY2hlcnMsXG4gIGNvbnRleHRTdG9yZTogUmVxdWVzdENvbnRleHRTdG9yZSxcbiAgcmVxdWVzdDogUmVxdWVzdCxcbiAgb25FcnJvcj86IChjb250ZXh0OiBTaW5rRXJyb3JDb250ZXh0KSA9PiB2b2lkXG4pOiB2b2lkID0+IHtcbiAgcnVuUGhhc2UoZW5yaWNoZXJzLnJlcXVlc3QsIHJlcXVlc3QsIGNvbnRleHRTdG9yZSwgcmVxdWVzdCwgb25FcnJvcilcbn1cblxuZXhwb3J0IGNvbnN0IGFwcGx5UmVzcG9uc2VFbnJpY2hlcnMgPSAoXG4gIGVucmljaGVyczogUmVzb2x2ZWRFbnJpY2hlcnMsXG4gIGNvbnRleHRTdG9yZTogUmVxdWVzdENvbnRleHRTdG9yZSxcbiAgaW5wdXQ6IEVucmljaGVyUmVzcG9uc2VJbnB1dCxcbiAgb25FcnJvcj86IChjb250ZXh0OiBTaW5rRXJyb3JDb250ZXh0KSA9PiB2b2lkXG4pOiB2b2lkID0+IHtcbiAgcnVuUGhhc2UoZW5yaWNoZXJzLnJlc3BvbnNlLCBpbnB1dCwgY29udGV4dFN0b3JlLCBpbnB1dC5yZXF1ZXN0LCBvbkVycm9yKVxufVxuIiwKICAgICIvKiogSFRUUCBgUmVxdWVzdGAgb3IgV2ViU29ja2V0IGluc3RhbmNlIGZvciBhY2N1bXVsYXRlZCBjb250ZXh0LiAqL1xuZXhwb3J0IHR5cGUgQ29udGV4dEtleSA9IFJlcXVlc3QgfCBvYmplY3RcblxuZXhwb3J0IGludGVyZmFjZSBSZXF1ZXN0Q29udGV4dFN0b3JlIHtcbiAgY2xlYXJDb250ZXh0OiAoa2V5OiBDb250ZXh0S2V5KSA9PiB2b2lkXG4gIGdldENvbnRleHQ6IChrZXk6IENvbnRleHRLZXkpID0+IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PlxuICBtZXJnZUNvbnRleHQ6IChrZXk6IENvbnRleHRLZXksIHBhcnRpYWw6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB2b2lkXG4gIC8qKlxuICAgKiBOb24tY2xvbmluZyByZWFkIG9mIHRoZSBsaXZlIGNvbnRleHQgYmFnLiBSZXR1cm5zIHRoZSBTQU1FIG9iamVjdCBzdG9yZWQgaW50ZXJuYWxseSAob3IgYVxuICAgKiBzaGFyZWQgZnJvemVuIGVtcHR5IG9iamVjdCkg4oCUIG5ldmVyIGhhbmQgdGhpcyB0byB1c2VyLWZhY2luZyBjb2RlLCB3aGljaCBtYXkgcmV0YWluIG9yXG4gICAqIG11dGF0ZSBpdC4gT25seSBpbnRlcm5hbCwgcmVhZC1vbmx5IGNhbGwgc2l0ZXMgKHRoYXQgaW1tZWRpYXRlbHkgc3ByZWFkIHRoZSByZXN1bHQgaW50byBhXG4gICAqIG5ldyBvYmplY3QpIG1heSB1c2UgdGhpczsgZXZlcnl0aGluZyBlbHNlIG11c3QgdXNlIHtAbGluayBSZXF1ZXN0Q29udGV4dFN0b3JlLmdldENvbnRleHR9LlxuICAgKi9cbiAgcGVla0NvbnRleHQ6IChrZXk6IENvbnRleHRLZXkpID0+IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PlxufVxuXG5jb25zdCBFTVBUWV9DT05URVhUOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gPSBPYmplY3QuZnJlZXplKHt9KVxuXG4vKipcbiAqIEVseXNpYSBoYW5kcyBXZWJTb2NrZXQgaG9va3MgYSBmcmVzaCB3cmFwcGVyIG9iamVjdCBwZXIgZXZlbnQ7IG9ubHkgaXRzXG4gKiBgcmF3YCBzb2NrZXQgaXMgdGhlIHNhbWUgYWNyb3NzIGEgY29ubmVjdGlvbidzIGxpZmV0aW1lLCBzbyBrZXkgYnkgdGhhdC5cbiAqIEEgYFJlcXVlc3RgIGhhcyBubyBgcmF3YCwgc28gSFRUUCBrZXlzIGFyZSB1bmNoYW5nZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBrZXlPZiA9IChrZXk6IENvbnRleHRLZXkpOiBDb250ZXh0S2V5ID0+IHtcbiAgY29uc3QgcmF3ID0gJ3JhdycgaW4ga2V5ID8ga2V5LnJhdyA6IHVuZGVmaW5lZFxuICByZXR1cm4gdHlwZW9mIHJhdyA9PT0gJ29iamVjdCcgJiYgcmF3ICE9PSBudWxsID8gcmF3IDoga2V5XG59XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVSZXF1ZXN0Q29udGV4dFN0b3JlID0gKCk6IFJlcXVlc3RDb250ZXh0U3RvcmUgPT4ge1xuICBjb25zdCBiYWdzID0gbmV3IFdlYWtNYXA8Q29udGV4dEtleSwgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KClcblxuICBjb25zdCBnZXRPckNyZWF0ZSA9IChrZXk6IENvbnRleHRLZXkpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiB7XG4gICAgY29uc3QgYmFnS2V5ID0ga2V5T2Yoa2V5KVxuICAgIGxldCBiYWcgPSBiYWdzLmdldChiYWdLZXkpXG4gICAgaWYgKCFiYWcpIHtcbiAgICAgIGJhZyA9IHt9XG4gICAgICBiYWdzLnNldChiYWdLZXksIGJhZylcbiAgICB9XG4gICAgcmV0dXJuIGJhZ1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBjbGVhckNvbnRleHQoa2V5KSB7XG4gICAgICBiYWdzLmRlbGV0ZShrZXlPZihrZXkpKVxuICAgIH0sXG4gICAgZ2V0Q29udGV4dChrZXkpIHtcbiAgICAgIGNvbnN0IGJhZyA9IGJhZ3MuZ2V0KGtleU9mKGtleSkpXG4gICAgICByZXR1cm4gYmFnID8geyAuLi5iYWcgfSA6IHt9XG4gICAgfSxcbiAgICBtZXJnZUNvbnRleHQoa2V5LCBwYXJ0aWFsKSB7XG4gICAgICBpZiAoT2JqZWN0LmtleXMocGFydGlhbCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgY29uc3QgYmFnID0gZ2V0T3JDcmVhdGUoa2V5KVxuICAgICAgT2JqZWN0LmFzc2lnbihiYWcsIHBhcnRpYWwpXG4gICAgfSxcbiAgICBwZWVrQ29udGV4dChrZXkpIHtcbiAgICAgIHJldHVybiBiYWdzLmdldChrZXlPZihrZXkpKSA/PyBFTVBUWV9DT05URVhUXG4gICAgfVxuICB9XG59XG5cbi8qKiBBY2N1bXVsYXRlZCByZXF1ZXN0IGNvbnRleHQgZmlyc3Q7IGV4cGxpY2l0IGBkYXRhLmNvbnRleHRgIHdpbnMgb24ga2V5IGNvbGxpc2lvbi4gKi9cbmV4cG9ydCBjb25zdCBtZXJnZUxvZ0RhdGFDb250ZXh0ID0gKFxuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgYWNjdW11bGF0ZWQ6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PlxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4ge1xuICBjb25zdCBleHBsaWNpdCA9IGRhdGEuY29udGV4dFxuICBjb25zdCBoYXNBY2N1bXVsYXRlZCA9IE9iamVjdC5rZXlzKGFjY3VtdWxhdGVkKS5sZW5ndGggPiAwXG4gIGNvbnN0IGhhc0V4cGxpY2l0ID1cbiAgICBleHBsaWNpdCAhPT0gdW5kZWZpbmVkICYmXG4gICAgZXhwbGljaXQgIT09IG51bGwgJiZcbiAgICB0eXBlb2YgZXhwbGljaXQgPT09ICdvYmplY3QnICYmXG4gICAgIUFycmF5LmlzQXJyYXkoZXhwbGljaXQpICYmXG4gICAgT2JqZWN0LmtleXMoZXhwbGljaXQgYXMgb2JqZWN0KS5sZW5ndGggPiAwXG5cbiAgaWYgKCEoaGFzQWNjdW11bGF0ZWQgfHwgaGFzRXhwbGljaXQpKSB7XG4gICAgcmV0dXJuIGRhdGFcbiAgfVxuXG4gIGNvbnN0IG1lcmdlZENvbnRleHQgPSB7XG4gICAgLi4uYWNjdW11bGF0ZWQsXG4gICAgLi4uKGhhc0V4cGxpY2l0ID8gKGV4cGxpY2l0IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA6IHt9KVxuICB9XG5cbiAgcmV0dXJuIHsgLi4uZGF0YSwgY29udGV4dDogbWVyZ2VkQ29udGV4dCB9XG59XG4iLAogICAgImltcG9ydCB7IEFzeW5jTG9jYWxTdG9yYWdlIH0gZnJvbSAnbm9kZTphc3luY19ob29rcydcbmltcG9ydCB0eXBlIHsgTG9nRmllbGRzLCBSZXF1ZXN0U2NvcGVkTG9nZ2VyIH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcblxuZXhwb3J0IGNvbnN0IGxvZ2dlclN0b3JhZ2U6IEFzeW5jTG9jYWxTdG9yYWdlPFJlcXVlc3RTY29wZWRMb2dnZXI+ID1cbiAgbmV3IEFzeW5jTG9jYWxTdG9yYWdlPFJlcXVlc3RTY29wZWRMb2dnZXI+KClcblxuLyoqXG4gKiBTdGFuZHMgaW4gd2hlcmV2ZXIgbm8gcmVxdWVzdCBpcyBpbiBmbGlnaHQsIGluY2x1ZGluZyBhZnRlciBvbmUgZW5kczogdGhlXG4gKiBwbHVnaW4gcmVzdG9yZXMgaXQgc28gYSBjb250aW51YXRpb24gdGhhdCBvdXRsaXZlcyBpdHMgcmVxdWVzdCBjYW5ub3Qga2VlcFxuICogd3JpdGluZyBpbnRvIHRoZSBmaW5pc2hlZCByZXF1ZXN0J3MgbG9nLlxuICovXG5jb25zdCBkaXNjYXJkID0gKCk6IHZvaWQgPT4ge1xuICAvLyBPdXRzaWRlIGEgcmVxdWVzdCB0aGVyZSBpcyBubyBsb2cgdG8gd3JpdGUgaW50by5cbn1cblxuZXhwb3J0IGNvbnN0IG5vb3BSZXF1ZXN0TG9nZ2VyOiBSZXF1ZXN0U2NvcGVkTG9nZ2VyID0ge1xuICBkZWJ1ZzogZGlzY2FyZCxcbiAgZXJyb3I6IGRpc2NhcmQsXG4gIGluZm86IGRpc2NhcmQsXG4gIG1lcmdlQ29udGV4dDogZGlzY2FyZCxcbiAgd2FybjogZGlzY2FyZFxufVxuXG4vKipcbiAqIFRoZSBjdXJyZW50IHJlcXVlc3QncyBsb2dnZXIsIG9yIGEgbm8tb3Agb25lIG91dHNpZGUgYSByZXF1ZXN0LlxuICpcbiAqIFBhc3MgdGhlIHNhbWUgZmllbGQgdHlwZSB5b3UgZ2F2ZSB0aGUgcGx1Z2luIHRvIGtlZXAgY29udGV4dCB0eXBlZCBhd2F5XG4gKiBmcm9tIHRoZSBFbHlzaWEgaGFuZGxlcjogYHVzZUxvZ2dlcjxDaGVja291dEZpZWxkcz4oKWAuXG4gKi9cbmV4cG9ydCBjb25zdCB1c2VMb2dnZXIgPSA8XG4gIFRGaWVsZHMgZXh0ZW5kcyBvYmplY3QgPSBMb2dGaWVsZHNcbj4oKTogUmVxdWVzdFNjb3BlZExvZ2dlcjxURmllbGRzPiA9PlxuICAvLyBUaGUgc3RvcmVkIGxvZ2dlciB3cml0ZXMgaW50byBhbiB1bnR5cGVkIGNvbnRleHQgYmFnOyB0aGUgdHlwZSBwYXJhbWV0ZXJcbiAgLy8gb25seSBuYXJyb3dzIHdoYXQgY2FsbGVycyBtYXkgaGFuZCBpdC5cbiAgKGxvZ2dlclN0b3JhZ2UuZ2V0U3RvcmUoKSA/P1xuICAgIG5vb3BSZXF1ZXN0TG9nZ2VyKSBhcyBSZXF1ZXN0U2NvcGVkTG9nZ2VyPFRGaWVsZHM+XG4iLAogICAgImltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgfSBmcm9tICdub2RlOm1vZHVsZSdcblxuY29uc3QgZWx5c2lhUGtnOiB7IHZlcnNpb24/OiBzdHJpbmcgfSA9ICgoKSA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVxdWlyZSA9IGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKVxuICAgIHJldHVybiByZXF1aXJlKCdlbHlzaWEvcGFja2FnZS5qc29uJykgYXMgeyB2ZXJzaW9uPzogc3RyaW5nIH1cbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHt9XG4gIH1cbn0pKClcblxuY29uc3QgbG9naXhseXNpYVBrZzogeyB2ZXJzaW9uPzogc3RyaW5nIH0gPSAoKCkgPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHJlcXVpcmUgPSBjcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybClcbiAgICByZXR1cm4gcmVxdWlyZSgnLi4vLi4vcGFja2FnZS5qc29uJykgYXMgeyB2ZXJzaW9uPzogc3RyaW5nIH1cbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHt9XG4gIH1cbn0pKClcblxuY29uc3QgY2VudGVyVGV4dCA9ICh0ZXh0OiBzdHJpbmcsIHdpZHRoOiBudW1iZXIpOiBzdHJpbmcgPT4ge1xuICBpZiAodGV4dC5sZW5ndGggPj0gd2lkdGgpIHtcbiAgICByZXR1cm4gdGV4dC5zbGljZSgwLCB3aWR0aClcbiAgfVxuXG4gIGNvbnN0IGxlZnQgPSBNYXRoLmZsb29yKCh3aWR0aCAtIHRleHQubGVuZ3RoKSAvIDIpXG4gIGNvbnN0IHJpZ2h0ID0gd2lkdGggLSB0ZXh0Lmxlbmd0aCAtIGxlZnRcbiAgcmV0dXJuIGAkeycgJy5yZXBlYXQobGVmdCl9JHt0ZXh0fSR7JyAnLnJlcGVhdChyaWdodCl9YFxufVxuXG50eXBlIFJvd1NwZWMgPVxuICB8IHsga2luZDogJ2VtcHR5JyB9XG4gIHwgeyBraW5kOiAnY2VudGVyJzsgdGV4dDogc3RyaW5nIH1cbiAgfCB7IGtpbmQ6ICdsZWZ0JzsgdGV4dDogc3RyaW5nIH1cblxuLyoqXG4gKiBCb3ggYmFubmVyOiBFbHlzaWEgdmVyc2lvbiAoY2VudGVyZWQpLCBVUkwgbGluZSwgb3B0aW9uYWwgbG9naXhseXNpYSB2ZXJzaW9uIGxpbmUuXG4gKi9cbmV4cG9ydCBjb25zdCByZW5kZXJCYW5uZXIgPSAoXG4gIHVybERpc3BsYXlMaW5lOiBzdHJpbmcsXG4gIGxvZ2l4bHlzaWFMaW5lOiBzdHJpbmcgfCBudWxsXG4pOiBzdHJpbmcgPT4ge1xuICBjb25zdCB7IHZlcnNpb24gfSA9IGVseXNpYVBrZ1xuICBjb25zdCB2ZXJzaW9uTGluZSA9IHZlcnNpb24gPyBgRWx5c2lhIHYke3ZlcnNpb259YCA6ICdFbHlzaWEnXG5cbiAgY29uc3Qgcm93czogUm93U3BlY1tdID0gW1xuICAgIHsga2luZDogJ2VtcHR5JyB9LFxuICAgIHsga2luZDogJ2NlbnRlcicsIHRleHQ6IHZlcnNpb25MaW5lIH0sXG4gICAgeyBraW5kOiAnZW1wdHknIH0sXG4gICAgeyBraW5kOiAnbGVmdCcsIHRleHQ6IHVybERpc3BsYXlMaW5lIH1cbiAgXVxuICBpZiAobG9naXhseXNpYUxpbmUpIHtcbiAgICByb3dzLnB1c2goeyBraW5kOiAnbGVmdCcsIHRleHQ6IGxvZ2l4bHlzaWFMaW5lIH0pXG4gIH1cbiAgcm93cy5wdXNoKHsga2luZDogJ2VtcHR5JyB9KVxuXG4gIGNvbnN0IGNvbnRlbnRXaWR0aCA9IE1hdGgubWF4KFxuICAgIHZlcnNpb25MaW5lLmxlbmd0aCxcbiAgICB1cmxEaXNwbGF5TGluZS5sZW5ndGgsXG4gICAgLi4uKGxvZ2l4bHlzaWFMaW5lID8gW2xvZ2l4bHlzaWFMaW5lLmxlbmd0aF0gOiBbMF0pXG4gIClcbiAgY29uc3QgaW5uZXJXaWR0aCA9IGNvbnRlbnRXaWR0aCArIDRcblxuICBjb25zdCB0b3AgPSBg4pSMJHsn4pSAJy5yZXBlYXQoaW5uZXJXaWR0aCl94pSQYFxuICBjb25zdCBib3QgPSBg4pSUJHsn4pSAJy5yZXBlYXQoaW5uZXJXaWR0aCl94pSYYFxuICBjb25zdCBlbXB0eVJvdyA9IGDilIIkeycgJy5yZXBlYXQoaW5uZXJXaWR0aCl94pSCYFxuXG4gIGNvbnN0IG91dDogc3RyaW5nW10gPSBbdG9wXVxuICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgaWYgKHJvdy5raW5kID09PSAnZW1wdHknKSB7XG4gICAgICBvdXQucHVzaChlbXB0eVJvdylcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGlmIChyb3cua2luZCA9PT0gJ2NlbnRlcicpIHtcbiAgICAgIG91dC5wdXNoKGDilIIke2NlbnRlclRleHQocm93LnRleHQsIGlubmVyV2lkdGgpfeKUgmApXG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBjb25zdCB7IHRleHQgfSA9IHJvd1xuICAgIGNvbnN0IHBhZGRpbmcgPSBNYXRoLm1heCgwLCBpbm5lcldpZHRoIC0gdGV4dC5sZW5ndGggLSA0KVxuICAgIG91dC5wdXNoKGDilIIgICR7dGV4dH0keycgJy5yZXBlYXQocGFkZGluZyl9ICDilIJgKVxuICB9XG4gIG91dC5wdXNoKGJvdClcbiAgcmV0dXJuIG91dC5qb2luKCdcXG4nKVxufVxuXG5leHBvcnQgY29uc3QgZ2V0TG9naXhseXNpYVZlcnNpb25MaW5lID0gKCk6IHN0cmluZyB8IG51bGwgPT4ge1xuICBjb25zdCB2ID0gbG9naXhseXNpYVBrZy52ZXJzaW9uXG4gIGlmICghdikge1xuICAgIHJldHVybiBudWxsXG4gIH1cbiAgcmV0dXJuIGAgICAgIGxvZ2l4bHlzaWEgdiR7dn1gXG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgT3B0aW9ucyB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBnZXRMb2dpeGx5c2lhVmVyc2lvbkxpbmUsIHJlbmRlckJhbm5lciB9IGZyb20gJy4vYmFubmVyJ1xuXG5leHBvcnQgY29uc3Qgc3RhcnRTZXJ2ZXIgPSAoXG4gIHNlcnZlcjogeyBwb3J0PzogbnVtYmVyOyBob3N0bmFtZT86IHN0cmluZzsgcHJvdG9jb2w/OiBzdHJpbmcgfCBudWxsIH0sXG4gIG9wdGlvbnM6IE9wdGlvbnNcbik6IHZvaWQgPT4ge1xuICBjb25zdCBzaG93U3RhcnR1cE1lc3NhZ2UgPSBvcHRpb25zLmNvbmZpZz8uc2hvd1N0YXJ0dXBNZXNzYWdlID8/IHRydWVcbiAgaWYgKCFzaG93U3RhcnR1cE1lc3NhZ2UpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHsgcG9ydCwgaG9zdG5hbWUsIHByb3RvY29sIH0gPSBzZXJ2ZXJcbiAgaWYgKHBvcnQgPT09IHVuZGVmaW5lZCB8fCAhaG9zdG5hbWUgfHwgIXByb3RvY29sKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCB1cmwgPSBgJHtwcm90b2NvbH06Ly8ke2hvc3RuYW1lfToke3BvcnR9YFxuICBjb25zdCBtZXNzYWdlID0gYPCfpoogRWx5c2lhIGlzIHJ1bm5pbmcgYXQgJHt1cmx9YFxuICBjb25zdCB1cmxEaXNwbGF5TGluZSA9IGDwn6aKICAke3VybH1gXG5cbiAgY29uc3QgZm9ybWF0ID0gb3B0aW9ucy5jb25maWc/LnN0YXJ0dXBNZXNzYWdlRm9ybWF0ID8/ICdiYW5uZXInXG4gIGlmIChmb3JtYXQgPT09ICdzaW1wbGUnKSB7XG4gICAgY29uc29sZS5sb2cobWVzc2FnZSlcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnNvbGUubG9nKHJlbmRlckJhbm5lcih1cmxEaXNwbGF5TGluZSwgZ2V0TG9naXhseXNpYVZlcnNpb25MaW5lKCkpKVxufVxuIiwKICAgICJpbXBvcnQgeyBTdGF0dXNNYXAgfSBmcm9tICdlbHlzaWEnXG5cbmNvbnN0IERJR0lUU19PTkxZID0gL15cXGQrJC91XG5jb25zdCBERUxJTUlURVJTID0gL1tfLV0rL2d1XG5jb25zdCBDQU1FTF9CT1VOREFSWV8xID0gLyg/PGJlZm9yZT5bYS16MC05XSkoPzxhZnRlcj5bQS1aXSkvZ3VcbmNvbnN0IENBTUVMX0JPVU5EQVJZXzIgPSAvKD88YmVmb3JlPltBLVpdKSg/PGFmdGVyPltBLVpdW2Etel0pL2d1XG5jb25zdCBBUE9TVFJPUEhFUyA9IC9bJ+KAmV0vZ3VcbmNvbnN0IE5PTl9BTFBIQU5VTUVSSUMgPSAvW15hLXowLTlcXHNdKy9ndVxuY29uc3QgV0hJVEVTUEFDRSA9IC9cXHMrL2d1XG5cbmNvbnN0IG5vcm1hbGl6ZVN0YXR1c05hbWUgPSAodmFsdWU6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIC8vIEhhbmRsZXMgY29tbW9uIHZhcmlhbnRzOlxuICAvLyAtIGNhc2UgZGlmZmVyZW5jZXM6IFwibm90IGZvdW5kXCIgdnMgXCJOb3QgRm91bmRcIlxuICAvLyAtIHNwYWNpbmcvcHVuY3R1YXRpb246IFwiTm90LUZvdW5kXCIsIFwibm90X2ZvdW5kXCJcbiAgLy8gLSBjYW1lbENhc2UvUGFzY2FsQ2FzZTogXCJJbnRlcm5hbFNlcnZlckVycm9yXCJcbiAgY29uc3QgdHJpbW1lZCA9IHZhbHVlLnRyaW0oKVxuICBpZiAoIXRyaW1tZWQpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIHJldHVybiB0cmltbWVkXG4gICAgLnJlcGxhY2UoREVMSU1JVEVSUywgJyAnKVxuICAgIC5yZXBsYWNlKENBTUVMX0JPVU5EQVJZXzEsICckPGJlZm9yZT4gJDxhZnRlcj4nKVxuICAgIC5yZXBsYWNlKENBTUVMX0JPVU5EQVJZXzIsICckPGJlZm9yZT4gJDxhZnRlcj4nKVxuICAgIC5yZXBsYWNlKEFQT1NUUk9QSEVTLCAnJylcbiAgICAudG9Mb3dlckNhc2UoKVxuICAgIC5yZXBsYWNlKE5PTl9BTFBIQU5VTUVSSUMsICcgJylcbiAgICAucmVwbGFjZShXSElURVNQQUNFLCAnICcpXG4gICAgLnRyaW0oKVxufVxuXG5jb25zdCBTVEFUVVNfQllfTk9STUFMSVpFRF9OQU1FID0gKCgpID0+IHtcbiAgY29uc3QgbWFwID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKVxuXG4gIGZvciAoY29uc3QgW25hbWUsIGNvZGVdIG9mIE9iamVjdC5lbnRyaWVzKFN0YXR1c01hcCkpIHtcbiAgICBtYXAuc2V0KG5vcm1hbGl6ZVN0YXR1c05hbWUobmFtZSksIGNvZGUpXG4gIH1cblxuICByZXR1cm4gbWFwXG59KSgpXG5cbi8qKlxuICogV2hhdCBFbHlzaWEncyBgc3RhdHVzKGNvZGUsIGJvZHkpYCByZXR1cm5zIG9yIHRocm93czogYSBudW1lcmljIGBjb2RlYCBhbmRcbiAqIHRoZSBgcmVzcG9uc2VgIGJvZHkuIE1hdGNoZWQgYnkgdGhlIGNsYXNzIG5hbWUgRWx5c2lhJ3Mgb3duIGBtYXBSZXNwb25zZWBcbiAqIGNoZWNrcyByYXRoZXIgdGhhbiBieSBgaW5zdGFuY2VvZmAsIHNvIGl0IHN0aWxsIHdvcmtzIHdoZW4gdGhlIGFwcFxuICogcmVzb2x2ZXMgYSBzZWNvbmQgY29weSBvZiBFbHlzaWEsIGFuZCBhIHBsYWluIG9iamVjdCB3aXRoIHRoZSBzYW1lIGtleXNcbiAqIChhbiBBUEkgZW52ZWxvcGUsIHNheSkgbmV2ZXIgbWF0Y2hlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGF0dXNSZXNwb25zZUxpa2Uge1xuICBjb2RlOiBudW1iZXJcbiAgcmVzcG9uc2U6IHVua25vd25cbn1cblxuZXhwb3J0IGNvbnN0IGlzU3RhdHVzUmVzcG9uc2UgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBTdGF0dXNSZXNwb25zZUxpa2UgPT5cbiAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAhKHZhbHVlIGluc3RhbmNlb2YgRXJyb3IpICYmXG4gICh2YWx1ZSBhcyB7IGNvbnN0cnVjdG9yPzogeyBuYW1lPzogc3RyaW5nIH0gfSkuY29uc3RydWN0b3I/Lm5hbWUgPT09XG4gICAgJ0VseXNpYUN1c3RvbVN0YXR1c1Jlc3BvbnNlJyAmJlxuICAnY29kZScgaW4gdmFsdWUgJiZcbiAgdHlwZW9mIHZhbHVlLmNvZGUgPT09ICdudW1iZXInICYmXG4gICdyZXNwb25zZScgaW4gdmFsdWVcblxuZXhwb3J0IGNvbnN0IGdldFN0YXR1c0NvZGUgPSAodmFsdWU6IHVua25vd24pOiBudW1iZXIgPT4ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IHRyaW1tZWQgPSB2YWx1ZS50cmltKClcbiAgICBpZiAoRElHSVRTX09OTFkudGVzdCh0cmltbWVkKSkge1xuICAgICAgcmV0dXJuIE51bWJlcih0cmltbWVkKVxuICAgIH1cblxuICAgIGNvbnN0IGtub3duID0gU1RBVFVTX0JZX05PUk1BTElaRURfTkFNRS5nZXQobm9ybWFsaXplU3RhdHVzTmFtZSh0cmltbWVkKSlcbiAgICByZXR1cm4ga25vd24gPz8gNTAwXG4gIH1cblxuICByZXR1cm4gNTAwXG59XG5cbmV4cG9ydCBjb25zdCBsZXZlbEZvclN0YXR1cyA9IChcbiAgc3RhdHVzOiBudW1iZXJcbik6ICdJTkZPJyB8ICdXQVJOSU5HJyB8ICdFUlJPUicgPT4ge1xuICBpZiAoc3RhdHVzID49IDUwMCkge1xuICAgIHJldHVybiAnRVJST1InXG4gIH1cbiAgaWYgKHN0YXR1cyA+PSA0MDApIHtcbiAgICByZXR1cm4gJ1dBUk5JTkcnXG4gIH1cbiAgcmV0dXJuICdJTkZPJ1xufVxuIiwKICAgICJpbXBvcnQgcGlubyBmcm9tICdwaW5vJ1xuaW1wb3J0IHByZXR0eSBmcm9tICdwaW5vLXByZXR0eSdcbmltcG9ydCB7IGNyZWF0ZVJlcXVlc3RDb250ZXh0U3RvcmUgfSBmcm9tICcuLi9jb250ZXh0L3JlcXVlc3QtY29udGV4dCdcbmltcG9ydCB0eXBlIHsgUmVxdWVzdENvbnRleHRTdG9yZSB9IGZyb20gJy4uL2NvbnRleHQvcmVxdWVzdC1jb250ZXh0J1xuaW1wb3J0IHR5cGUge1xuICBMb2dnZXIsXG4gIExvZ0xldmVsLFxuICBPcHRpb25zLFxuICBQaW5vLFxuICBSZXF1ZXN0SW5mbyxcbiAgU3RvcmVEYXRhXG59IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgeyByZXNvbHZlU2FtcGxpbmcgfSBmcm9tICcuLi9zYW1wbGluZydcbmltcG9ydCB7IGVsYXBzZWRNcyB9IGZyb20gJy4uL3V0aWxzL2R1cmF0aW9uJ1xuaW1wb3J0IHsgYnVpbGRQaW5vUmVkYWN0UGF0aHMgfSBmcm9tICcuLi91dGlscy9yZWRhY3QnXG5pbXBvcnQgeyBjcmVhdGVGb3JtYXRDb250ZXh0IH0gZnJvbSAnLi9jcmVhdGUtbG9nZ2VyJ1xuaW1wb3J0IHsgZW1pdCwgcGFyc2VSZXF1ZXN0VXJsT25jZSwgcmVzb2x2ZVNpbmtzLCBzaG91bGRMb2cgfSBmcm9tICcuL2VtaXQnXG5pbXBvcnQgeyBoYW5kbGVIdHRwRXJyb3IgfSBmcm9tICcuL2hhbmRsZS1odHRwLWVycm9yJ1xuXG5jb25zdCBaRVJPX1NUT1JFOiBTdG9yZURhdGEgPSB7IGJlZm9yZVRpbWU6IDBuIH1cblxuLyoqXG4gKiBBIHN0YWJsZSBzdGFuZC1pbiBmb3IgcGlubyB0aGF0IG9ubHkgYnVpbGRzIHRoZSByZWFsIGluc3RhbmNlIG9uIGZpcnN0IHVzZSxcbiAqIG9yIHJpZ2h0IGF3YXkgd2hlbiBgY29uZmlnLnBpbm9gIGlzIHNldC5cbiAqL1xuY29uc3QgY3JlYXRlTGF6eVBpbm8gPSAoXG4gIGNvbmZpZzogT3B0aW9uc1snY29uZmlnJ10sXG4gIHBpbm9GYWN0b3J5OiB0eXBlb2YgcGlub1xuKTogUGlubyA9PiB7XG4gIGNvbnN0IHBpbm9Db25maWcgPSBjb25maWc/LnBpbm9cbiAgY29uc3QgeyBwcmV0dHlQcmludCwgLi4ucGlub09wdGlvbnMgfSA9IHBpbm9Db25maWcgPz8ge31cblxuICBjb25zdCBwcmV0dHlQcmludE9wdGlvbnMgPVxuICAgIHR5cGVvZiBwcmV0dHlQcmludCA9PT0gJ29iamVjdCcgJiYgcHJldHR5UHJpbnQgIT09IG51bGxcbiAgICAgID8gKHByZXR0eVByaW50IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVxuICAgICAgOiB1bmRlZmluZWRcblxuICBjb25zdCBlbmFibGVQcmV0dHlQcmludCA9XG4gICAgcHJldHR5UHJpbnQgPT09IHRydWUgfHwgcHJldHR5UHJpbnRPcHRpb25zICE9PSB1bmRlZmluZWRcblxuICBjb25zdCBzaG91bGRQcmV0dHlQcmludCA9XG4gICAgZW5hYmxlUHJldHR5UHJpbnQgJiYgcGlub09wdGlvbnMudHJhbnNwb3J0ID09PSB1bmRlZmluZWRcblxuICBjb25zdCBtZXNzYWdlS2V5ID1cbiAgICAocHJldHR5UHJpbnRPcHRpb25zPy5tZXNzYWdlS2V5IGFzIHN0cmluZyB8IHVuZGVmaW5lZCkgPz9cbiAgICBwaW5vT3B0aW9ucy5tZXNzYWdlS2V5XG4gIGNvbnN0IGVycm9yS2V5ID1cbiAgICAocHJldHR5UHJpbnRPcHRpb25zPy5lcnJvcktleSBhcyBzdHJpbmcgfCB1bmRlZmluZWQpID8/IHBpbm9PcHRpb25zLmVycm9yS2V5XG5cbiAgY29uc3QgYmFzZVBpbm9PcHRpb25zID0ge1xuICAgIC4uLnBpbm9PcHRpb25zLFxuICAgIGVycm9yS2V5LFxuICAgIGxldmVsOiBwaW5vT3B0aW9ucy5sZXZlbCA/PyAnaW5mbycsXG4gICAgbWVzc2FnZUtleSxcbiAgICAuLi4oY29uZmlnPy5hdXRvUmVkYWN0ID09PSB0cnVlICYmIHBpbm9PcHRpb25zLnJlZGFjdCA9PT0gdW5kZWZpbmVkXG4gICAgICA/IHtcbiAgICAgICAgICByZWRhY3Q6IHtcbiAgICAgICAgICAgIGNlbnNvcjogJ1tSRURBQ1RFRF0nLFxuICAgICAgICAgICAgcGF0aHM6IGJ1aWxkUGlub1JlZGFjdFBhdGhzKGNvbmZpZz8ucmVkYWN0S2V5cylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIDoge30pXG4gIH1cblxuICAvLyBQaW5vIChhbmQsIHdoZW4gY29uZmlndXJlZCwgaXRzIHBpbm8tcHJldHR5IHRyYW5zZm9ybSBzdHJlYW0pIGlzIGV4cGVuc2l2ZSB0byBjb25zdHJ1Y3RcbiAgLy8gYW5kIGlzIG9ubHkgZXZlciBuZWVkZWQgd2hlbiBhIGNhbGxlciBleHBsaWNpdGx5IHJlYWRzIHN0b3JlLnBpbm8vbG9nZ2VyLnBpbm8gb3IgY29uZmlndXJlc1xuICAvLyBjb25maWcucGlubyDigJQgdGhlIHBsdWdpbidzIG93biBsb2cgcGF0aCB3cml0ZXMgdmlhIGNvbnNvbGUuKiBhbmQgbmV2ZXIgdG91Y2hlcyBpdC4gQnVpbGRpbmdcbiAgLy8gaXQgbGF6aWx5IGJlaGluZCBhIHN0YWJsZSBQcm94eSBrZWVwcyBgc3RvcmUucGlubyA9PT0gbG9nZ2VyLnBpbm9gIGlkZW50aXR5IHdoaWxlIGRlZmVycmluZ1xuICAvLyB0aGUgY29zdCB1bnRpbCBmaXJzdCBhY2Nlc3MuXG4gIGNvbnN0IHByZXR0eVN0cmVhbSA9ICgpOiBSZXR1cm5UeXBlPHR5cGVvZiBwcmV0dHk+ID0+XG4gICAgcHJldHR5KHtcbiAgICAgIGNvbG9yaXplOiBwcm9jZXNzLnN0ZG91dD8uaXNUVFkgPT09IHRydWUsXG4gICAgICB0cmFuc2xhdGVUaW1lOiBjb25maWc/LnRpbWVzdGFtcD8udHJhbnNsYXRlVGltZSxcbiAgICAgIC4uLnByZXR0eVByaW50T3B0aW9ucyxcbiAgICAgIGVycm9yS2V5LFxuICAgICAgbWVzc2FnZUtleVxuICAgIH0gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pXG5cbiAgbGV0IHJlYWxQaW5vOiBQaW5vIHwgdW5kZWZpbmVkXG5cbiAgY29uc3QgZ2V0UGlubyA9ICgpOiBQaW5vID0+IHtcbiAgICBpZiAoIXJlYWxQaW5vKSB7XG4gICAgICByZWFsUGlubyA9IHNob3VsZFByZXR0eVByaW50XG4gICAgICAgID8gcGlub0ZhY3RvcnkoYmFzZVBpbm9PcHRpb25zLCBwcmV0dHlTdHJlYW0oKSlcbiAgICAgICAgOiBwaW5vRmFjdG9yeSh7XG4gICAgICAgICAgICAuLi5iYXNlUGlub09wdGlvbnMsXG4gICAgICAgICAgICB0cmFuc3BvcnQ6IHBpbm9PcHRpb25zLnRyYW5zcG9ydFxuICAgICAgICAgIH0pXG4gICAgfVxuICAgIHJldHVybiByZWFsUGlub1xuICB9XG5cbiAgLy8gRWx5c2lhJ3MgYHN0YXRlKClgIGlnbm9yZXMgYW4gb2JqZWN0IHdpdGggbm8gb3duIGVudW1lcmFibGUga2V5cywgc28gdGhlXG4gIC8vIHRhcmdldCBjYXJyaWVzIG9uZTsgdGhlIHRyYXBzIGJlbG93IGZvcndhcmQgZXZlcnl0aGluZyB0byB0aGUgcmVhbCBwaW5vXG4gIC8vIG9uY2UgaXQgZXhpc3RzIGFuZCBuZXZlciBjb25zdHJ1Y3QgaXQganVzdCB0byBlbnVtZXJhdGUuXG4gIGNvbnN0IHRhcmdldCA9IHsgbGV2ZWw6IHVuZGVmaW5lZCB9IGFzIHVua25vd24gYXMgUGlub1xuICBjb25zdCBsYXp5UGlubyA9IG5ldyBQcm94eSh0YXJnZXQsIHtcbiAgICBnZXQoX3RhcmdldCwgcHJvcCkge1xuICAgICAgY29uc3QgcmVhbCA9IGdldFBpbm8oKVxuICAgICAgY29uc3QgdmFsdWUgPSAocmVhbCBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcgfCBzeW1ib2wsIHVua25vd24+KVtwcm9wXVxuICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICA/ICh2YWx1ZSBhcyAoLi4uYXJnczogdW5rbm93bltdKSA9PiB1bmtub3duKS5iaW5kKHJlYWwpXG4gICAgICAgIDogdmFsdWVcbiAgICB9LFxuICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogKGJhc2UsIHByb3ApID0+XG4gICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHJlYWxQaW5vID8/IGJhc2UsIHByb3ApLFxuICAgIGhhczogKF90YXJnZXQsIHByb3ApID0+IHByb3AgaW4gKGdldFBpbm8oKSBhcyBvYmplY3QpLFxuICAgIG93bktleXM6IGJhc2UgPT4gUmVmbGVjdC5vd25LZXlzKHJlYWxQaW5vID8/IGJhc2UpLFxuICAgIHNldChfdGFyZ2V0LCBwcm9wLCB2YWx1ZSkge1xuICAgICAgOyhnZXRQaW5vKCkgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCB1bmtub3duPilbcHJvcF0gPSB2YWx1ZVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH0pXG5cbiAgLy8gRXhwbGljaXQgY29uZmlnLnBpbm8gbWVhbnMgdGhlIHVzZXIgb3B0ZWQgaW4gdG8gcGlubyBkaXJlY3RseTogY29uc3RydWN0IGVhZ2VybHkgc29cbiAgLy8gaW52YWxpZCBvcHRpb25zIGZhaWwgZmFzdCBhdCBwbHVnaW4gc2V0dXAgdGltZSwgbWF0Y2hpbmcgcHJlLWxhenkgYmVoYXZpb3IuXG4gIGlmIChjb25maWc/LnBpbm8gIT09IHVuZGVmaW5lZCkge1xuICAgIGdldFBpbm8oKVxuICB9XG5cbiAgcmV0dXJuIGxhenlQaW5vXG59XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVMb2dnZXIgPSAoXG4gIG9wdGlvbnM6IE9wdGlvbnMgPSB7fSxcbiAgcGlub0ZhY3Rvcnk6IHR5cGVvZiBwaW5vID0gcGlubyxcbiAgZXh0ZXJuYWxDb250ZXh0U3RvcmU/OiBSZXF1ZXN0Q29udGV4dFN0b3JlXG4pOiBMb2dnZXIgPT4ge1xuICBjb25zdCBjb250ZXh0U3RvcmUgPSBleHRlcm5hbENvbnRleHRTdG9yZSA/PyBjcmVhdGVSZXF1ZXN0Q29udGV4dFN0b3JlKClcbiAgY29uc3QgeyBjb25maWcgfSA9IG9wdGlvbnNcbiAgLy8gSG9pc3RlZCBvbmNlIHBlciBsb2dnZXIgaW5zdGFuY2U6IGNvbG9ycy9mb3JtYXQvdGhyZXNob2xkcy9zZXJ2aWNlIGRvbid0IGNoYW5nZSBhY3Jvc3NcbiAgLy8gcmVxdWVzdHMgd2l0aGluIGEgcHJvY2VzcyBsaWZldGltZSAoc2VlIGNyZWF0ZUZvcm1hdENvbnRleHQncyBkb2MgY29tbWVudCkuXG4gIGNvbnN0IGZvcm1hdENvbnRleHQgPSBjcmVhdGVGb3JtYXRDb250ZXh0KG9wdGlvbnMpXG5cbiAgY29uc3QgbGF6eVBpbm8gPSBjcmVhdGVMYXp5UGlubyhjb25maWcsIHBpbm9GYWN0b3J5KVxuXG4gIC8vIFJlc29sdmVkIG9uY2UgcGVyIGxvZ2dlciBpbnN0YW5jZTogbm9uZSBvZiB0aGVzZSBkZXBlbmQgb24gcGVyLXJlcXVlc3Qgc3RhdGUuXG4gIGNvbnN0IHNpbmtzID0gcmVzb2x2ZVNpbmtzKGNvbmZpZylcbiAgY29uc3Qgc2FtcGxpbmcgPSByZXNvbHZlU2FtcGxpbmcoY29uZmlnPy5zYW1wbGluZylcblxuICBjb25zdCBsb2cgPSAoXG4gICAgbGV2ZWw6IExvZ0xldmVsLFxuICAgIHJlcXVlc3Q6IFJlcXVlc3RJbmZvLFxuICAgIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIHN0b3JlOiBTdG9yZURhdGFcbiAgKTogdm9pZCA9PiB7XG4gICAgZW1pdCh7XG4gICAgICBjb250ZXh0U3RvcmUsXG4gICAgICBkYXRhLFxuICAgICAgZm9ybWF0Q29udGV4dCxcbiAgICAgIGxldmVsLFxuICAgICAgb3B0aW9ucyxcbiAgICAgIHJlcXVlc3QsXG4gICAgICBzYW1wbGluZyxcbiAgICAgIHNpbmtzLFxuICAgICAgc3RvcmVcbiAgICB9KVxuICB9XG5cbiAgLyoqIFJlc29sdmVzIHRoZSB0YWlsIHZlcmRpY3QgYW5kIHJlLWVtaXRzIHdoYXRldmVyIGl0IHJlc2N1ZWQuICovXG4gIGNvbnN0IGZpbmFsaXplUmVxdWVzdCA9IChcbiAgICByZXF1ZXN0OiBSZXF1ZXN0SW5mbyxcbiAgICBzdG9yZTogU3RvcmVEYXRhLFxuICAgIHN0YXR1czogbnVtYmVyXG4gICk6IHZvaWQgPT4ge1xuICAgIGlmICghc2FtcGxpbmcpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IG91dGNvbWUgPSB7XG4gICAgICBkdXJhdGlvbk1zOiBlbGFwc2VkTXMoc3RvcmUuYmVmb3JlVGltZSksXG4gICAgICBwYXRobmFtZTogcGFyc2VSZXF1ZXN0VXJsT25jZShyZXF1ZXN0KS5wYXRobmFtZSxcbiAgICAgIHN0YXR1c1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcmVjb3JkIG9mIHNhbXBsaW5nLmZpbmFsaXplKHJlcXVlc3QsIG91dGNvbWUpKSB7XG4gICAgICBlbWl0KHtcbiAgICAgICAgYnlwYXNzU2FtcGxpbmc6IHRydWUsXG4gICAgICAgIGNvbnRleHRTdG9yZSxcbiAgICAgICAgZGF0YTogcmVjb3JkLmRhdGEsXG4gICAgICAgIGR1cmF0aW9uT3ZlcnJpZGU6IHJlY29yZC5kdXJhdGlvbk1zLFxuICAgICAgICBmb3JtYXRDb250ZXh0LFxuICAgICAgICBsZXZlbDogcmVjb3JkLmxldmVsLFxuICAgICAgICBvcHRpb25zLFxuICAgICAgICByZXF1ZXN0LFxuICAgICAgICBzYW1wbGluZyxcbiAgICAgICAgc2lua3MsXG4gICAgICAgIC8vIFVucmVhZCBvbiB0aGlzIHBhdGg6IGBkdXJhdGlvbk92ZXJyaWRlYCBzdXBwbGllcyB0aGUgZHVyYXRpb24gZWFjaFxuICAgICAgICAvLyByZWNvcmQgaGFkIHdoZW4gaXQgd2FzIGNhcHR1cmVkLlxuICAgICAgICBzdG9yZTogWkVST19TVE9SRVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBjb25zdCBsb2dXaXRoQ29udGV4dCA9IChcbiAgICBsZXZlbDogTG9nTGV2ZWwsXG4gICAgcmVxdWVzdDogUmVxdWVzdEluZm8sXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIGNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiB2b2lkID0+IHtcbiAgICBpZiAoc2lua3MuaXNFZmZlY3RpdmVseURpc2FibGVkIHx8ICFzaG91bGRMb2cobGV2ZWwsIGNvbmZpZz8ubG9nRmlsdGVyKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnN0IHN0b3JlOiBTdG9yZURhdGEgPSB7IGJlZm9yZVRpbWU6IHByb2Nlc3MuaHJ0aW1lLmJpZ2ludCgpIH1cbiAgICBsb2cobGV2ZWwsIHJlcXVlc3QsIHsgY29udGV4dCwgbWVzc2FnZSB9LCBzdG9yZSlcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgYmVnaW5SZXF1ZXN0OiByZXF1ZXN0ID0+IHtcbiAgICAgIHNhbXBsaW5nPy5iZWdpbihyZXF1ZXN0KVxuICAgIH0sXG4gICAgZGVidWc6IChyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KSA9PiB7XG4gICAgICBsb2dXaXRoQ29udGV4dCgnREVCVUcnLCByZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KVxuICAgIH0sXG4gICAgZXJyb3I6IChyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KSA9PiB7XG4gICAgICBsb2dXaXRoQ29udGV4dCgnRVJST1InLCByZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KVxuICAgIH0sXG4gICAgZmluYWxpemVSZXF1ZXN0LFxuICAgIGdldENvbnRleHQ6IHJlcXVlc3QgPT4gY29udGV4dFN0b3JlLmdldENvbnRleHQocmVxdWVzdCksXG4gICAgaGFuZGxlSHR0cEVycm9yOiAocmVxdWVzdCwgZXJyb3IsIHN0b3JlKSA9PiB7XG4gICAgICBoYW5kbGVIdHRwRXJyb3IoXG4gICAgICAgIHJlcXVlc3QsXG4gICAgICAgIGVycm9yLFxuICAgICAgICBzdG9yZSxcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgY29udGV4dFN0b3JlLFxuICAgICAgICBzaW5rcyxcbiAgICAgICAgZm9ybWF0Q29udGV4dCxcbiAgICAgICAgc2FtcGxpbmdcbiAgICAgIClcbiAgICB9LFxuICAgIGluZm86IChyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KSA9PiB7XG4gICAgICBsb2dXaXRoQ29udGV4dCgnSU5GTycsIHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXG4gICAgfSxcbiAgICBsb2csXG4gICAgbWVyZ2VDb250ZXh0OiAocmVxdWVzdCwgcGFydGlhbCkgPT4ge1xuICAgICAgY29udGV4dFN0b3JlLm1lcmdlQ29udGV4dChyZXF1ZXN0LCBwYXJ0aWFsKVxuICAgIH0sXG4gICAgcGlubzogbGF6eVBpbm8sXG4gICAgd2FybjogKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpID0+IHtcbiAgICAgIGxvZ1dpdGhDb250ZXh0KCdXQVJOSU5HJywgcmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dClcbiAgICB9XG4gIH1cbn1cblxuLyoqIFBsdWdpbiBlbnRyeTogc2hhcmVzIG9uZSByZXF1ZXN0LWNvbnRleHQgc3RvcmUgYWNyb3NzIHRoZSBFbHlzaWEgbGlmZWN5Y2xlLiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZVBsdWdpbkxvZ2dlciA9IChcbiAgb3B0aW9uczogT3B0aW9ucyxcbiAgY29udGV4dFN0b3JlOiBSZXF1ZXN0Q29udGV4dFN0b3JlXG4pOiBMb2dnZXIgPT4gY3JlYXRlTG9nZ2VyKG9wdGlvbnMsIHBpbm8sIGNvbnRleHRTdG9yZSlcbiIsCiAgICAiY29uc3QgUkVHRVhQX1NQRUNJQUxTID0gL1suKis/XiR7fSgpfFtcXF1cXFxcXS9ndVxuY29uc3QgUkVQRUFURURfUkVDVVJTSVZFX1BBVFRFUk4gPSAvXFwqXFwqLipcXCpcXCovdVxuY29uc3QgUkVDVVJTSVZFX1dJTERDQVJEX1NQTElUID0gL1xcKlxcKi91XG5jb25zdCBBTFBIQU5VTUVSSUNfUEFUVEVSTiA9IC9bYS16QS1aMC05XS91XG5cbmNvbnN0IGVzY2FwZVJlZ0V4cCA9ICh2YWx1ZTogc3RyaW5nKTogc3RyaW5nID0+XG4gIHZhbHVlLnJlcGxhY2UoUkVHRVhQX1NQRUNJQUxTLCAnXFxcXCQmJylcblxuLyoqXG4gKiBEZXRlY3RzIGlmIGEgcGF0dGVybiBjb250YWlucyByZXBlYXRlZCByZWN1cnNpdmUgd2lsZGNhcmRzIHRoYXQgY291bGQgY2F1c2UgUmVEb1MuXG4gKiBQYXR0ZXJucyB3aXRoIGFkamFjZW50IG9yIG5lYXJseS1hZGphY2VudCBgKipgIHdpbGRjYXJkcyBjYW4gbGVhZCB0byBjYXRhc3Ryb3BoaWMgYmFja3RyYWNraW5nLlxuICovXG5jb25zdCBoYXNSZXBlYXRlZFJlY3Vyc2l2ZVdpbGRjYXJkcyA9IChwYXR0ZXJuOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgaWYgKCFSRVBFQVRFRF9SRUNVUlNJVkVfUEFUVEVSTi50ZXN0KHBhdHRlcm4pKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBjb25zdCBzZWdtZW50cyA9IHBhdHRlcm4uc3BsaXQoUkVDVVJTSVZFX1dJTERDQVJEX1NQTElUKVxuICAvLyBJZiB3ZSBoYXZlIG11bHRpcGxlICoqIHdpdGggb25seSBzaG9ydCBsaXRlcmFsIHNlcGFyYXRvcnMgYmV0d2VlbiB0aGVtLCByZWplY3QgaXRcbiAgZm9yIChsZXQgaSA9IDE7IGkgPCBzZWdtZW50cy5sZW5ndGg7IGkgKz0gMSkge1xuICAgIGNvbnN0IHNlcGFyYXRvciA9IHNlZ21lbnRzW2ldXG4gICAgLy8gQWxsb3cgKiogZm9sbG93ZWQgYnkgcmVhc29uYWJsZSBsaXRlcmFsIHBhdGhzLCBidXQgcmVqZWN0IGFkamFjZW50IG9yIG5lYXJseS1hZGphY2VudCAqKlxuICAgIGlmIChcbiAgICAgIHNlcGFyYXRvciA9PT0gJycgfHxcbiAgICAgIChzZXBhcmF0b3IubGVuZ3RoIDwgMiAmJiAhQUxQSEFOVU1FUklDX1BBVFRFUk4udGVzdChzZXBhcmF0b3IpKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2Vcbn1cblxuLyoqXG4gKiBDb21waWxlcyBhIHBhdGggZ2xvYiBpbnRvIGFuIGFuY2hvcmVkIGBSZWdFeHBgLlxuICpcbiAqIC0gYCoqYCBtYXRjaGVzIGFueSBjaGFyYWN0ZXJzLCBpbmNsdWRpbmcgYC9gXG4gKiAtIGAqYCBtYXRjaGVzIGFueSBjaGFyYWN0ZXJzIGV4Y2VwdCBgL2BcbiAqIC0gYD9gIG1hdGNoZXMgYSBzaW5nbGUgY2hhcmFjdGVyIGV4Y2VwdCBgL2BcbiAqXG4gKiBFdmVyeXRoaW5nIGVsc2UgaXMgbWF0Y2hlZCBsaXRlcmFsbHksIHNvIGAvdjEvdXNlcnNgIG9ubHkgbWF0Y2hlcyBpdHNlbGYuXG4gKi9cbmV4cG9ydCBjb25zdCBnbG9iVG9SZWdFeHAgPSAocGF0dGVybjogc3RyaW5nKTogUmVnRXhwID0+IHtcbiAgLy8gRGV0ZWN0IHJlcGVhdGVkIHJlY3Vyc2l2ZSB3aWxkY2FyZHMgdGhhdCBjb3VsZCBjYXVzZSBjYXRhc3Ryb3BoaWMgYmFja3RyYWNraW5nLlxuICBpZiAoaGFzUmVwZWF0ZWRSZWN1cnNpdmVXaWxkY2FyZHMocGF0dGVybikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnSW52YWxpZCBnbG9iIHBhdHRlcm46IHJlcGVhdGVkIHJlY3Vyc2l2ZSB3aWxkY2FyZHMgKCoqKSBjYW4gY2F1c2UgcGVyZm9ybWFuY2UgaXNzdWVzJ1xuICAgIClcbiAgfVxuXG4gIGxldCBzb3VyY2UgPSAnJ1xuICBsZXQgaW5kZXggPSAwXG5cbiAgd2hpbGUgKGluZGV4IDwgcGF0dGVybi5sZW5ndGgpIHtcbiAgICBjb25zdCBjaGFyID0gcGF0dGVybltpbmRleF1cblxuICAgIGlmIChjaGFyID09PSAnKicpIHtcbiAgICAgIGNvbnN0IGNyb3NzZXNTZWdtZW50cyA9IHBhdHRlcm5baW5kZXggKyAxXSA9PT0gJyonXG4gICAgICBzb3VyY2UgKz0gY3Jvc3Nlc1NlZ21lbnRzID8gJy4qJyA6ICdbXi9dKidcbiAgICAgIGluZGV4ICs9IGNyb3NzZXNTZWdtZW50cyA/IDIgOiAxXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGlmIChjaGFyID09PSAnPycpIHtcbiAgICAgIHNvdXJjZSArPSAnW14vXSdcbiAgICAgIGluZGV4ICs9IDFcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgc291cmNlICs9IGVzY2FwZVJlZ0V4cChjaGFyKVxuICAgIGluZGV4ICs9IDFcbiAgfVxuXG4gIHJldHVybiBuZXcgUmVnRXhwKGBeJHtzb3VyY2V9JGAsICd1Jylcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUge1xuICBMb2dMZXZlbCxcbiAgU2FtcGxpbmdDb25maWcsXG4gIFRhaWxTYW1wbGluZ0NvbmZpZ1xufSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgZ2xvYlRvUmVnRXhwIH0gZnJvbSAnLi9nbG9iJ1xuXG5jb25zdCBGVUxMX1JBVEUgPSAxMDBcbmNvbnN0IERFRkFVTFRfTUFYX0JVRkZFUkVEX1BFUl9SRVFVRVNUID0gMTAwXG5cbmNvbnN0IE5PX1JFQ09SRFM6IHJlYWRvbmx5IEJ1ZmZlcmVkUmVjb3JkW10gPSBPYmplY3QuZnJlZXplKFtdKVxuXG4vKipcbiAqIFdoYXQgaGVhZCBzYW1wbGluZyBkZWNpZGVkIGZvciBhIHNpbmdsZSByZWNvcmQ6XG4gKlxuICogLSBga2VlcGAg4oCUIGVtaXQgbm93XG4gKiAtIGBidWZmZXJgIOKAlCBob2xkIGl0IHVudGlsIHRoZSByZXF1ZXN0J3MgdGFpbCB2ZXJkaWN0IGlzIGtub3duXG4gKiAtIGBkcm9wYCDigJQgZGlzY2FyZCBpdDsgbm8gdGFpbCBydWxlIGNhbiBicmluZyBpdCBiYWNrXG4gKi9cbmV4cG9ydCB0eXBlIFNhbXBsaW5nRGVjaXNpb24gPSAnYnVmZmVyJyB8ICdkcm9wJyB8ICdrZWVwJ1xuXG4vKiogQSBoZWFkLWRyb3BwZWQgcmVjb3JkIGhlbGQgdW50aWwgaXRzIHJlcXVlc3QncyB0YWlsIHZlcmRpY3QgaXMga25vd24uICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1ZmZlcmVkUmVjb3JkIHtcbiAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgLyoqIEVsYXBzZWQgdGltZSBhdCBjYXB0dXJlLCBzbyBhIHJlcGxheWVkIHJlY29yZCBrZWVwcyBpdHMgb3JpZ2luYWwgZHVyYXRpb24uICovXG4gIGR1cmF0aW9uTXM6IG51bWJlclxuICBsZXZlbDogTG9nTGV2ZWxcbn1cblxuLyoqIEhvdyBhIHJlcXVlc3QgZmluaXNoZWQsIG1hdGNoZWQgYWdhaW5zdCB7QGxpbmsgVGFpbFNhbXBsaW5nQ29uZmlnfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVxdWVzdE91dGNvbWUge1xuICBkdXJhdGlvbk1zOiBudW1iZXJcbiAgcGF0aG5hbWU6IHN0cmluZ1xuICBzdGF0dXM6IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNhbXBsaW5nUnVudGltZSB7XG4gIC8qKiBNYXJrcyBhIHJlcXVlc3QgYXMgb25lIHRoYXQgd2lsbCByZWFjaCB7QGxpbmsgU2FtcGxpbmdSdW50aW1lLmZpbmFsaXplfS4gKi9cbiAgYmVnaW46IChrZXk6IG9iamVjdCkgPT4gdm9pZFxuICAvKiogSG9sZHMgYSBoZWFkLWRyb3BwZWQgcmVjb3JkLCB1cCB0byBgbWF4QnVmZmVyZWRQZXJSZXF1ZXN0YC4gKi9cbiAgYnVmZmVyOiAoa2V5OiBvYmplY3QsIHJlY29yZDogQnVmZmVyZWRSZWNvcmQpID0+IHZvaWRcbiAgZGVjaWRlOiAobGV2ZWw6IExvZ0xldmVsLCBrZXk6IG9iamVjdCkgPT4gU2FtcGxpbmdEZWNpc2lvblxuICAvKipcbiAgICogUmVzb2x2ZXMgdGhlIHRhaWwgdmVyZGljdCBmb3IgYSBmaW5pc2hlZCByZXF1ZXN0LiBSZXR1cm5zIHRoZSByZWNvcmRzIHRvXG4gICAqIHJlcGxheSDigJQgZW1wdHkgd2hlbiB0aGUgb3V0Y29tZSBtYXRjaGVkIG5vIHRhaWwgcnVsZSDigJQgYW5kIG1hcmtzIGEgcmVzY3VlZFxuICAgKiByZXF1ZXN0IHNvIHRoZSBjYWxsZXIncyBvd24gZmluYWwgbG9nIGJ5cGFzc2VzIGhlYWQgc2FtcGxpbmcgdG9vLlxuICAgKi9cbiAgZmluYWxpemU6IChrZXk6IG9iamVjdCwgb3V0Y29tZTogUmVxdWVzdE91dGNvbWUpID0+IHJlYWRvbmx5IEJ1ZmZlcmVkUmVjb3JkW11cbn1cblxuaW50ZXJmYWNlIFJlc29sdmVkVGFpbCB7XG4gIGR1cmF0aW9uTXM/OiBudW1iZXJcbiAgcGF0aHM/OiBSZWdFeHBbXVxuICBzdGF0dXM/OiBudW1iZXJcbn1cblxuY29uc3QgcmVzb2x2ZVRhaWwgPSAoXG4gIHRhaWw6IFRhaWxTYW1wbGluZ0NvbmZpZyB8IHVuZGVmaW5lZFxuKTogUmVzb2x2ZWRUYWlsIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKCF0YWlsKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCBwYXRocyA9IHRhaWwucGF0aHM/Lmxlbmd0aCA/IHRhaWwucGF0aHMubWFwKGdsb2JUb1JlZ0V4cCkgOiB1bmRlZmluZWRcbiAgaWYgKFxuICAgIHRhaWwuZHVyYXRpb25NcyA9PT0gdW5kZWZpbmVkICYmXG4gICAgdGFpbC5zdGF0dXMgPT09IHVuZGVmaW5lZCAmJlxuICAgIHBhdGhzID09PSB1bmRlZmluZWRcbiAgKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICByZXR1cm4geyBkdXJhdGlvbk1zOiB0YWlsLmR1cmF0aW9uTXMsIHBhdGhzLCBzdGF0dXM6IHRhaWwuc3RhdHVzIH1cbn1cblxuLyoqIFRhaWwgcnVsZXMgYXJlIE9SLWVkOiBhbnkgc2luZ2xlIG1hdGNoIHJlc2N1ZXMgdGhlIHdob2xlIHJlcXVlc3QuICovXG5jb25zdCBtYXRjaGVzVGFpbCA9ICh0YWlsOiBSZXNvbHZlZFRhaWwsIG91dGNvbWU6IFJlcXVlc3RPdXRjb21lKTogYm9vbGVhbiA9PiB7XG4gIGlmICh0YWlsLnN0YXR1cyAhPT0gdW5kZWZpbmVkICYmIG91dGNvbWUuc3RhdHVzID49IHRhaWwuc3RhdHVzKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuICBpZiAodGFpbC5kdXJhdGlvbk1zICE9PSB1bmRlZmluZWQgJiYgb3V0Y29tZS5kdXJhdGlvbk1zID49IHRhaWwuZHVyYXRpb25Ncykge1xuICAgIHJldHVybiB0cnVlXG4gIH1cbiAgaWYgKHRhaWwucGF0aHMpIHtcbiAgICBmb3IgKGNvbnN0IHBhdGggb2YgdGFpbC5wYXRocykge1xuICAgICAgaWYgKHBhdGgudGVzdChvdXRjb21lLnBhdGhuYW1lKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2Vcbn1cblxuLyoqIEtlZXBzIG9ubHkgdGhlIHJhdGVzIHRoYXQgYWN0dWFsbHkgZHJvcCBzb21ldGhpbmcuICovXG5jb25zdCByZXNvbHZlUmF0ZXMgPSAoXG4gIGhlYWQ6IFNhbXBsaW5nQ29uZmlnWydoZWFkJ11cbik6IFBhcnRpYWw8UmVjb3JkPExvZ0xldmVsLCBudW1iZXI+PiB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICghaGVhZCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgcmF0ZXM6IFBhcnRpYWw8UmVjb3JkPExvZ0xldmVsLCBudW1iZXI+PiA9IHt9XG4gIGxldCBoYXNSYXRlID0gZmFsc2VcbiAgZm9yIChjb25zdCBbbGV2ZWwsIHJhdGVdIG9mIE9iamVjdC5lbnRyaWVzKGhlYWQpKSB7XG4gICAgaWYgKHR5cGVvZiByYXRlID09PSAnbnVtYmVyJyAmJiByYXRlIDwgRlVMTF9SQVRFKSB7XG4gICAgICByYXRlc1tsZXZlbCBhcyBMb2dMZXZlbF0gPSByYXRlXG4gICAgICBoYXNSYXRlID0gdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBoYXNSYXRlID8gcmF0ZXMgOiB1bmRlZmluZWRcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIHNhbXBsaW5nIHJ1bnRpbWUsIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlIGNvbmZpZyBkcm9wcyBub3RoaW5nIOKAlFxuICogdGFpbCBydWxlcyBhbG9uZSBhcmUgYSBuby1vcCwgc2luY2Ugb25seSBoZWFkLWRyb3BwZWQgcmVjb3JkcyBhcmUgZXZlclxuICogYnVmZmVyZWQuXG4gKlxuICogQHBhcmFtIHJhbmRvbSBJbmplY3RhYmxlIGZvciBkZXRlcm1pbmlzdGljIHRlc3RzOyBkZWZhdWx0cyB0byBgTWF0aC5yYW5kb21gLlxuICovXG5leHBvcnQgY29uc3QgcmVzb2x2ZVNhbXBsaW5nID0gKFxuICBjb25maWc/OiBTYW1wbGluZ0NvbmZpZyxcbiAgcmFuZG9tOiAoKSA9PiBudW1iZXIgPSBNYXRoLnJhbmRvbVxuKTogU2FtcGxpbmdSdW50aW1lIHwgdW5kZWZpbmVkID0+IHtcbiAgY29uc3QgcmF0ZXMgPSByZXNvbHZlUmF0ZXMoY29uZmlnPy5oZWFkKVxuICBpZiAoIXJhdGVzKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCB0YWlsID0gcmVzb2x2ZVRhaWwoY29uZmlnPy50YWlsKVxuICBjb25zdCBtYXhCdWZmZXJlZCA9XG4gICAgY29uZmlnPy5tYXhCdWZmZXJlZFBlclJlcXVlc3QgPz8gREVGQVVMVF9NQVhfQlVGRkVSRURfUEVSX1JFUVVFU1RcblxuICBjb25zdCBidWZmZXJzID0gbmV3IFdlYWtNYXA8b2JqZWN0LCBCdWZmZXJlZFJlY29yZFtdPigpXG4gIC8vIE9ubHkgcmVxdWVzdHMgdGhlIHBsdWdpbiBvcGVuZWQgKGFuZCB3aWxsIGNsb3NlKSBtYXkgYnVmZmVyOiBXZWJTb2NrZXRcbiAgLy8gcHNldWRvLXJlcXVlc3RzIGFuZCBoYW5kLXJvbGxlZCBgY3JlYXRlTG9nZ2VyYCBjYWxsZXJzIG5ldmVyIGZpbmFsaXplLCBzb1xuICAvLyBidWZmZXJpbmcgZm9yIHRoZW0gd291bGQgZ3JvdyB3aXRob3V0IGJvdW5kLlxuICBjb25zdCBpbkZsaWdodCA9IG5ldyBXZWFrU2V0PG9iamVjdD4oKVxuICBjb25zdCByZXNjdWVkID0gbmV3IFdlYWtTZXQ8b2JqZWN0PigpXG5cbiAgcmV0dXJuIHtcbiAgICBiZWdpbihrZXkpIHtcbiAgICAgIGlmICh0YWlsKSB7XG4gICAgICAgIGluRmxpZ2h0LmFkZChrZXkpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGJ1ZmZlcihrZXksIHJlY29yZCkge1xuICAgICAgbGV0IGJ1Y2tldCA9IGJ1ZmZlcnMuZ2V0KGtleSlcbiAgICAgIGlmICghYnVja2V0KSB7XG4gICAgICAgIGJ1Y2tldCA9IFtdXG4gICAgICAgIGJ1ZmZlcnMuc2V0KGtleSwgYnVja2V0KVxuICAgICAgfVxuICAgICAgaWYgKGJ1Y2tldC5sZW5ndGggPj0gbWF4QnVmZmVyZWQpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBidWNrZXQucHVzaChyZWNvcmQpXG4gICAgfSxcblxuICAgIGRlY2lkZShsZXZlbCwga2V5KSB7XG4gICAgICBpZiAocmVzY3VlZC5oYXMoa2V5KSkge1xuICAgICAgICByZXR1cm4gJ2tlZXAnXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJhdGUgPSByYXRlc1tsZXZlbF0gPz8gRlVMTF9SQVRFXG4gICAgICBpZiAocmF0ZSA+PSBGVUxMX1JBVEUgfHwgKHJhdGUgPiAwICYmIHJhbmRvbSgpICogRlVMTF9SQVRFIDwgcmF0ZSkpIHtcbiAgICAgICAgcmV0dXJuICdrZWVwJ1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGFpbCAmJiBpbkZsaWdodC5oYXMoa2V5KSA/ICdidWZmZXInIDogJ2Ryb3AnXG4gICAgfSxcblxuICAgIGZpbmFsaXplKGtleSwgb3V0Y29tZSkge1xuICAgICAgaW5GbGlnaHQuZGVsZXRlKGtleSlcbiAgICAgIGNvbnN0IGJ1Y2tldCA9IGJ1ZmZlcnMuZ2V0KGtleSlcbiAgICAgIGJ1ZmZlcnMuZGVsZXRlKGtleSlcblxuICAgICAgaWYgKCEodGFpbCAmJiBtYXRjaGVzVGFpbCh0YWlsLCBvdXRjb21lKSkpIHtcbiAgICAgICAgcmV0dXJuIE5PX1JFQ09SRFNcbiAgICAgIH1cblxuICAgICAgcmVzY3VlZC5hZGQoa2V5KVxuICAgICAgcmV0dXJuIGJ1Y2tldCA/PyBOT19SRUNPUkRTXG4gICAgfVxuICB9XG59XG4iLAogICAgImNvbnN0IE5BTk9TX1BFUl9NSUxMSSA9IDFfMDAwXzAwMFxuXG4vKipcbiAqIE1pbGxpc2Vjb25kcyBlbGFwc2VkIHNpbmNlIGBiZWZvcmVUaW1lYCwgb3IgYDBgIHdoZW4gbm8gc3RhcnQgd2FzIHJlY29yZGVkXG4gKiAoYEJpZ0ludCgwKWAgaXMgdGhlIHBsdWdpbidzIFwibmV2ZXIgc3RhcnRlZFwiIHNlbnRpbmVsKS5cbiAqL1xuZXhwb3J0IGNvbnN0IGVsYXBzZWRNcyA9IChiZWZvcmVUaW1lOiBiaWdpbnQpOiBudW1iZXIgPT5cbiAgYmVmb3JlVGltZSA9PT0gMG5cbiAgICA/IDBcbiAgICA6IE51bWJlcihwcm9jZXNzLmhydGltZS5iaWdpbnQoKSAtIGJlZm9yZVRpbWUpIC8gTkFOT1NfUEVSX01JTExJXG4iLAogICAgIi8vIExvY2FsIHBhcnQg4omkNjQsIGRvbWFpbiDiiaQyNTMsIFRMRCAy4oCTNjMgKFJGQyA1MzIxIC8gMTAzNS1pc2ggbGltaXRzOyBib3VuZGVkIHRvIGF2b2lkIFJlRG9TKVxuY29uc3QgRU1BSUxfUkVHRVggPVxuICAvW2EtekEtWjAtOS5fJSstXXsxLDY0fUBbYS16QS1aMC05Li1dezEsMjUzfVxcLlthLXpBLVpdezIsNjN9L2d1XG5jb25zdCBJUFY0X1JFR0VYID1cbiAgLyg/PCFbXFx3Ly5dKSg/Oig/OjI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV0/XFxkKVxcLil7M30oPzoyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkoPyFbXFx3Ll0pL2d1XG4vKipcbiAqIEJvdW5kZWQgSVB2NjogZWl0aGVyIGFsbCA4IGdyb3Vwcywgb3IgYSBzaW5nbGUgYDo6YCBjb21wcmVzc2lvbi4gUmVxdWlyaW5nXG4gKiBvbmUgb2YgdGhvc2Ugc2hhcGVzIChyYXRoZXIgdGhhbiBcIjIrIGNvbG9uLXNlcGFyYXRlZCBoZXggZ3JvdXBzXCIpIGtlZXBzXG4gKiBjbG9jayB0aW1lcyAoYDEyOjMwOjQ1YCkgYW5kIE1BQyBhZGRyZXNzZXMgKGBhYTpiYjpjYzpkZDplZTpmZmApIGZyb21cbiAqIG1hdGNoaW5nLlxuICovXG5jb25zdCBJUFY2X1JFR0VYID1cbiAgLyg/PCFbXFx3Ol0pKD86KD86WzAtOWEtZkEtRl17MSw0fTopezd9WzAtOWEtZkEtRl17MSw0fXwoPzpbMC05YS1mQS1GXXsxLDR9Oil7MSw3fTooPzpbMC05YS1mQS1GXXsxLDR9KD86OlswLTlhLWZBLUZdezEsNH0pezAsNn0pP3w6Oig/OlswLTlhLWZBLUZdezEsNH0oPzo6WzAtOWEtZkEtRl17MSw0fSl7MCw2fSkpKD8hW1xcdzpdKS9ndVxuLyoqIERpZ2l0IHJ1bnMgdGhhdCBtYXkgYmUgZm9ybWF0dGVkIFBBTnMgKHNwYWNlcy9kYXNoZXMpOyB2YWxpZGF0ZWQgd2l0aCBMdWhuIGJlZm9yZSByZWRhY3RpbmcuICovXG5jb25zdCBDUkVESVRfQ0FSRF9DQU5ESURBVEVfUkVHRVggPSAvXFxiKD86XFxkWyAtXSo/KXsxMywxOX1cXGIvZ3VcbmNvbnN0IEpXVF9SRUdFWCA9IC9leUpbYS16QS1aMC05Xy1dK1xcLmV5SlthLXpBLVowLTlfLV0rXFwuW2EtekEtWjAtOV8tXSsvZ3Vcbi8qKlxuICogYDovL3VzZXI6cGFzc3dvcmRAYCBpbiBmcmVlIHRleHQgKHRoZSB1c2VyIHBhcnQgbWF5IGJlIGVtcHR5LCBhcyBpbiBhIFJlZGlzXG4gKiBVUkwpOyBhIHBhc3N3b3JkIGlzIGEgc2VjcmV0IHdoYXRldmVyIGl0IGxvb2tzIGxpa2UuIFRoZSBzY2hlbWUgaW4gZnJvbnQgaXNcbiAqIGNoZWNrZWQgYnkgYGVuZHNXaXRoVXJsU2NoZW1lYCBpbnN0ZWFkIG9mIG1hdGNoZWQgaGVyZTogYSBwYXR0ZXJuIHRoYXRcbiAqIHN0YXJ0cyB3aXRoIGBbYS16XVthLXowLTkrLi1dKmAgcmV0cmllcyBmcm9tIGV2ZXJ5IGxldHRlciBvZiBhIGxvbmcgd29yZCxcbiAqIHdoaWNoIGlzIHF1YWRyYXRpYyBpbiB0aGUgd29yZCdzIGxlbmd0aC5cbiAqL1xuY29uc3QgVVJMX1BBU1NXT1JEX1JFR0VYID0gLyg/PHByZWZpeD46XFwvXFwvW15cXHMvPyNAOl0qOilbXlxccy8/I0BdK0AvZ3VcbmNvbnN0IFVSTF9TQ0hFTUVfTEVUVEVSX1JFR0VYID0gL1thLXpdL2l1XG5jb25zdCBVUkxfU0NIRU1FX01BUktfUkVHRVggPSAvW1xcZCsuLV0vdVxuLyoqXG4gKiBBbiBIVFRQIGNyZWRlbnRpYWwgYWZ0ZXIgaXRzIHNjaGVtZSB3b3JkLiBPbmx5IGEgdG9rZW4gd2l0aCBhIGRpZ2l0LCBhXG4gKiBVUkwtc2FmZSBwdW5jdHVhdGlvbiBtYXJrIG9yIGFuIHVwcGVyY2FzZSBsZXR0ZXIgYWZ0ZXIgYSB3b3JkIGNoYXJhY3RlciBpc1xuICogbWFza2VkLCBzbyBwcm9zZSBzdWNoIGFzIFwiQmFzaWMgYXV0aGVudGljYXRpb24gZmFpbGVkXCIgaXMgbGVmdCBhbG9uZS5cbiAqL1xuY29uc3QgSFRUUF9DUkVERU5USUFMX1JFR0VYID1cbiAgL1xcYig/PHNjaGVtZT5bQmJdZWFyZXJ8W0JiXWFzaWMpXFxzKyg/PHRva2VuPltcXHdcXC0ufisvXXs4LH09KikvZ3VcbmNvbnN0IENSRURFTlRJQUxfTUFSS19SRUdFWCA9IC9bXFxkXFwtLn4rL10vdVxuLyoqIE5vIGBpYCBmbGFnLCB1bmRlciB3aGljaCBgW0EtWl1gIHdvdWxkIG1hdGNoIGV2ZXJ5IGxvd2VyY2FzZSBsZXR0ZXIgdG9vLiAqL1xuY29uc3QgSU5ORVJfQ0FQSVRBTF9SRUdFWCA9IC9cXHdbQS1aXS91XG5cbmNvbnN0IFBBTl9NSU5fTEVOID0gMTNcbmNvbnN0IFBBTl9NQVhfTEVOID0gMTlcblxuY29uc3QgUkVEQUNURURfVEVYVCA9ICdbUkVEQUNURURdJ1xuY29uc3QgQ0lSQ1VMQVJfUkVGID0gJ1tDaXJjdWxhcl0nXG5jb25zdCBVTlNFUklBTElaQUJMRV9URVhUID0gJ1tVbnNlcmlhbGl6YWJsZV0nXG5cbi8qKiBDYXNlLWluc2Vuc2l0aXZlIGtleS9oZWFkZXIgbmFtZXMgd2hvc2UgVkFMVUVTIGFyZSBhbHdheXMgcmVkYWN0ZWQuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9SRURBQ1RfS0VZUzogcmVhZG9ubHkgc3RyaW5nW10gPSBbXG4gICdhdXRob3JpemF0aW9uJyxcbiAgJ3Byb3h5LWF1dGhvcml6YXRpb24nLFxuICAnY29va2llJyxcbiAgJ3NldC1jb29raWUnLFxuICAnY29va2llcycsXG4gICd4LWFwaS1rZXknLFxuICAnYXBpLWtleScsXG4gICdhcGlrZXknLFxuICAneC1hdXRoLXRva2VuJyxcbiAgJ3Bhc3N3b3JkJyxcbiAgJ3Bhc3N3ZCcsXG4gICdzZWNyZXQnLFxuICAnY2xpZW50LXNlY3JldCcsXG4gICd0b2tlbicsXG4gICdhY2Nlc3MtdG9rZW4nLFxuICAncmVmcmVzaC10b2tlbicsXG4gICdpZC10b2tlbicsXG4gICdzZXNzaW9uJyxcbiAgJ3Nlc3Npb24taWQnLFxuICAncHJpdmF0ZS1rZXknLFxuICAnY3JlZGl0LWNhcmQnLFxuICAnY2FyZC1udW1iZXInLFxuICAnY3Z2JyxcbiAgJ3Nzbidcbl1cblxuY29uc3QgQ0FNRUxfQ0FTRV9CT1VOREFSWV9SRUdFWCA9IC8oPzxiZWZvcmU+W2EtejAtOV0pKD88YWZ0ZXI+W0EtWl0pL2d1XG5cbi8qKiBOb3JtYWxpemUgYFhfQXBpLUtleWAgLyBgYXBpS2V5YCBzdHlsZSB2YXJpYW50cyB0byBgeC1hcGkta2V5YCBmb3JtLiAqL1xuY29uc3Qgbm9ybWFsaXplS2V5TmFtZSA9IChrZXk6IHN0cmluZyk6IHN0cmluZyA9PlxuICBrZXlcbiAgICAucmVwbGFjZShDQU1FTF9DQVNFX0JPVU5EQVJZX1JFR0VYLCAnJDxiZWZvcmU+LSQ8YWZ0ZXI+JylcbiAgICAucmVwbGFjZUFsbCgnXycsICctJylcbiAgICAudG9Mb3dlckNhc2UoKVxuXG4vKiogV29yZHMgdGhhdCBtYWtlIGEga2V5IHNlbnNpdGl2ZSB3aGVyZXZlciB0aGV5IGFwcGVhciBhcyBhIHdob2xlIHBhcnQuICovXG5jb25zdCBTRU5TSVRJVkVfS0VZX1BBUlRTOiBSZWFkb25seVNldDxzdHJpbmc+ID0gbmV3IFNldChbXG4gICdwYXNzd2QnLFxuICAncGFzc3dvcmQnLFxuICAnc2VjcmV0J1xuXSlcbi8qKiBBIGtleSBlbmRpbmcgaW4gdGhpcyBwYXJ0IG5hbWVzIGEgY3JlZGVudGlhbCAoYGF1dGgtdG9rZW5gLCBgeC1jc3JmLXRva2VuYCkuICovXG5jb25zdCBTRU5TSVRJVkVfTEFTVF9LRVlfUEFSVCA9ICd0b2tlbidcblxuLyoqXG4gKiBUcnVlIGZvciBhIGRlZmF1bHQgb3IgZXh0cmEga2V5IG5hbWUsIG9yIGZvciBhbnkga2V5IHdpdGggYSB3aG9sZSBwYXJ0XG4gKiBgcGFzc3dvcmRgLCBgcGFzc3dkYCBvciBgc2VjcmV0YCwgb3IgZW5kaW5nIGluIHRoZSBwYXJ0IGB0b2tlbmAuIFBhcnRzIGFyZVxuICogc3BsaXQgb24gY2FzZSBjaGFuZ2VzLCBgX2AgYW5kIGAtYCwgc28gYHRva2VuaXplcmAgYW5kIGBtYXhUb2tlbnNgIHN0YXlcbiAqIHVubWF0Y2hlZCB3aGlsZSBgbmV3UGFzc3dvcmRgIGFuZCBgWC1DU1JGLVRva2VuYCBtYXRjaC5cbiAqL1xuZXhwb3J0IGNvbnN0IGlzU2Vuc2l0aXZlS2V5ID0gKFxuICBrZXk6IHN0cmluZyxcbiAgZXh0cmFLZXlzPzogcmVhZG9ubHkgc3RyaW5nW11cbik6IGJvb2xlYW4gPT4ge1xuICBjb25zdCBub3JtYWxpemVkID0gbm9ybWFsaXplS2V5TmFtZShrZXkpXG4gIGlmIChERUZBVUxUX1JFREFDVF9LRVlTLmluY2x1ZGVzKG5vcm1hbGl6ZWQpKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuICBpZiAoZXh0cmFLZXlzPy5zb21lKGV4dHJhS2V5ID0+IG5vcm1hbGl6ZUtleU5hbWUoZXh0cmFLZXkpID09PSBub3JtYWxpemVkKSkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cbiAgY29uc3QgcGFydHMgPSBub3JtYWxpemVkLnNwbGl0KCctJylcbiAgcmV0dXJuIChcbiAgICBwYXJ0cy5zb21lKHBhcnQgPT4gU0VOU0lUSVZFX0tFWV9QQVJUUy5oYXMocGFydCkpIHx8XG4gICAgcGFydHMuYXQoLTEpID09PSBTRU5TSVRJVkVfTEFTVF9LRVlfUEFSVFxuICApXG59XG5cbi8qKiBwaW5vIHJlZGFjdCBwYXRocyBmb3Igb25lIGtleTogdG9wLWxldmVsIGFuZCBvbmUgbmVzdGluZyBsZXZlbC4gKi9cbmV4cG9ydCBjb25zdCBidWlsZFBpbm9SZWRhY3RQYXRocyA9IChcbiAgZXh0cmFLZXlzPzogcmVhZG9ubHkgc3RyaW5nW11cbik6IHN0cmluZ1tdID0+IHtcbiAgY29uc3Qga2V5cyA9IFsuLi5ERUZBVUxUX1JFREFDVF9LRVlTLCAuLi4oZXh0cmFLZXlzID8/IFtdKV1cbiAgcmV0dXJuIGtleXMuZmxhdE1hcChrZXkgPT4ge1xuICAgIC8vIHBpbm8gcGF0aHMgZG9uJ3QgYWxsb3cgYC1gIGluIGJhcmUgaWRlbnRpZmllcnM7IGJyYWNrZXQtcXVvdGUgdGhlbS5cbiAgICBpZiAoa2V5LmluY2x1ZGVzKCctJykpIHtcbiAgICAgIHJldHVybiBbYFtcIiR7a2V5fVwiXWAsIGAqW1wiJHtrZXl9XCJdYF1cbiAgICB9XG4gICAgcmV0dXJuIFtrZXksIGAqLiR7a2V5fWBdXG4gIH0pXG59XG5cbi8qKiBMdWhuIGNoZWNrc3VtOyBgZGlnaXRzYCBtdXN0IGNvbnRhaW4gb25seSBgMC05YCBhbmQgbGVuZ3RoIGluIFBBTiByYW5nZS4gKi9cbmNvbnN0IHBhc3Nlc0x1aG4gPSAoZGlnaXRzOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgaWYgKGRpZ2l0cy5sZW5ndGggPCBQQU5fTUlOX0xFTiB8fCBkaWdpdHMubGVuZ3RoID4gUEFOX01BWF9MRU4pIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGxldCBzdW0gPSAwXG4gIGxldCBhbHRlcm5hdGUgPSBmYWxzZVxuXG4gIGZvciAobGV0IGkgPSBkaWdpdHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpIC09IDEpIHtcbiAgICBjb25zdCBjb2RlID0gZGlnaXRzLmNvZGVQb2ludEF0KGkpID8/IDBcbiAgICBpZiAoY29kZSA8IDQ4IHx8IGNvZGUgPiA1Nykge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGxldCBuID0gY29kZSAtIDQ4XG4gICAgaWYgKGFsdGVybmF0ZSkge1xuICAgICAgbiAqPSAyXG4gICAgICBpZiAobiA+IDkpIHtcbiAgICAgICAgbiAtPSA5XG4gICAgICB9XG4gICAgfVxuICAgIHN1bSArPSBuXG4gICAgYWx0ZXJuYXRlID0gIWFsdGVybmF0ZVxuICB9XG5cbiAgcmV0dXJuIHN1bSAlIDEwID09PSAwXG59XG5cbmNvbnN0IHJlZGFjdENyZWRpdENhcmRDYW5kaWRhdGVzID0gKHRleHQ6IHN0cmluZyk6IHN0cmluZyA9PlxuICB0ZXh0LnJlcGxhY2UoQ1JFRElUX0NBUkRfQ0FORElEQVRFX1JFR0VYLCBtYXRjaCA9PiB7XG4gICAgY29uc3QgZGlnaXRzID0gbWF0Y2gucmVwbGFjZUFsbCgvXFxEL2d1LCAnJylcbiAgICBpZiAoXG4gICAgICBkaWdpdHMubGVuZ3RoID49IFBBTl9NSU5fTEVOICYmXG4gICAgICBkaWdpdHMubGVuZ3RoIDw9IFBBTl9NQVhfTEVOICYmXG4gICAgICBwYXNzZXNMdWhuKGRpZ2l0cylcbiAgICApIHtcbiAgICAgIHJldHVybiBSRURBQ1RFRF9URVhUXG4gICAgfVxuICAgIHJldHVybiBtYXRjaFxuICB9KVxuXG4vKiogVHJ1ZSB3aGVuIGB0ZXh0YCBoYXMgYSBVUkwgc2NoZW1lIChhIGxldHRlciwgdGhlbiBsZXR0ZXJzLCBkaWdpdHMsIGArYCwgYC5gIG9yIGAtYCkgZW5kaW5nIGF0IGBlbmRgLiAqL1xuY29uc3QgZW5kc1dpdGhVcmxTY2hlbWUgPSAodGV4dDogc3RyaW5nLCBlbmQ6IG51bWJlcik6IGJvb2xlYW4gPT4ge1xuICBmb3IgKGxldCBpID0gZW5kIC0gMTsgaSA+PSAwOyBpIC09IDEpIHtcbiAgICBjb25zdCBjaGFyID0gdGV4dC5jaGFyQXQoaSlcbiAgICBpZiAoVVJMX1NDSEVNRV9MRVRURVJfUkVHRVgudGVzdChjaGFyKSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgaWYgKCFVUkxfU0NIRU1FX01BUktfUkVHRVgudGVzdChjaGFyKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZVxufVxuXG4vKiogUmV0dXJucyBgdGV4dGAgdW5jaGFuZ2VkIChzYW1lIHZhbHVlKSB3aGVuIG5vdGhpbmcgbWF0Y2hlZCDigJQgY2FsbGVycyBjYW4gY29tcGFyZSBgPT09IGlucHV0YC4gKi9cbmV4cG9ydCBjb25zdCByZWRhY3RTdHJpbmcgPSAodGV4dDogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgbGV0IHJlc3VsdCA9IHRleHRcblxuICAvLyBCZWZvcmUgdGhlIGVtYWlsIHBhc3MsIHdoaWNoIHdvdWxkIG90aGVyd2lzZSBlYXQgYHBhc3N3b3JkQGhvc3QudGxkYC5cbiAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoXG4gICAgVVJMX1BBU1NXT1JEX1JFR0VYLFxuICAgIChtYXRjaDogc3RyaW5nLCBwcmVmaXg6IHN0cmluZywgb2Zmc2V0OiBudW1iZXIsIHdob2xlOiBzdHJpbmcpID0+XG4gICAgICBlbmRzV2l0aFVybFNjaGVtZSh3aG9sZSwgb2Zmc2V0KSA/IGAke3ByZWZpeH0ke1JFREFDVEVEX1RFWFR9QGAgOiBtYXRjaFxuICApXG4gIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKEVNQUlMX1JFR0VYLCBSRURBQ1RFRF9URVhUKVxuICByZXN1bHQgPSByZXN1bHQucmVwbGFjZShJUFY0X1JFR0VYLCBSRURBQ1RFRF9URVhUKVxuICByZXN1bHQgPSByZXN1bHQucmVwbGFjZShJUFY2X1JFR0VYLCBSRURBQ1RFRF9URVhUKVxuICByZXN1bHQgPSByZWRhY3RDcmVkaXRDYXJkQ2FuZGlkYXRlcyhyZXN1bHQpXG4gIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKEpXVF9SRUdFWCwgUkVEQUNURURfVEVYVClcbiAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoXG4gICAgSFRUUF9DUkVERU5USUFMX1JFR0VYLFxuICAgIChtYXRjaDogc3RyaW5nLCBzY2hlbWU6IHN0cmluZywgdG9rZW46IHN0cmluZykgPT5cbiAgICAgIENSRURFTlRJQUxfTUFSS19SRUdFWC50ZXN0KHRva2VuKSB8fCBJTk5FUl9DQVBJVEFMX1JFR0VYLnRlc3QodG9rZW4pXG4gICAgICAgID8gYCR7c2NoZW1lfSAke1JFREFDVEVEX1RFWFR9YFxuICAgICAgICA6IG1hdGNoXG4gIClcblxuICByZXR1cm4gcmVzdWx0XG59XG5cbi8qKlxuICogSG9zdCBhbmQgdXNlcmluZm8gY2Fubm90IGNvbnRhaW4gYFtSRURBQ1RFRF1gIOKAlCBgW2AgYmVnaW5zIGFuIElQdjYgbGl0ZXJhbCBpbiBVUkxzIGFuZCBicmVha3MgcGFyc2luZy5cbiAqL1xuY29uc3QgVVJMX1NBRkVfUkVEQUNUID0gJ3JlZGFjdGVkJ1xuXG5jb25zdCByZWRhY3RVcmxBdXRob3JpdHlTZWdtZW50ID0gKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcgPT5cbiAgcmVkYWN0U3RyaW5nKHZhbHVlKS5yZXBsYWNlQWxsKFJFREFDVEVEX1RFWFQsIFVSTF9TQUZFX1JFREFDVClcblxuLyoqIEFsd2F5cyByZXR1cm5zIGEgbmV3IGluc3RhbmNlOyBgcGFyYW1zYCBpcyBsZWZ0IHVudG91Y2hlZC4gKi9cbmNvbnN0IHJlZGFjdFNlYXJjaFBhcmFtcyA9IChcbiAgcGFyYW1zOiBVUkxTZWFyY2hQYXJhbXMsXG4gIGV4dHJhS2V5cz86IHJlYWRvbmx5IHN0cmluZ1tdXG4pOiBVUkxTZWFyY2hQYXJhbXMgPT4ge1xuICBjb25zdCByZXN1bHQgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKClcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgcGFyYW1zKSB7XG4gICAgcmVzdWx0LmFwcGVuZChcbiAgICAgIGtleSxcbiAgICAgIGlzU2Vuc2l0aXZlS2V5KGtleSwgZXh0cmFLZXlzKSA/IFVSTF9TQUZFX1JFREFDVCA6IHJlZGFjdFN0cmluZyh2YWx1ZSlcbiAgICApXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG4vKipcbiAqIFJlZGFjdHMgdGhlIGRlY29kZWQgc2VnbWVudCBzbyBgJTQwYCBjYW5ub3QgaGlkZSBhbiBlbWFpbC4gUmUtZW5jb2RlcyBvbmx5XG4gKiB3aGVuIHJlZGFjdGlvbiBjaGFuZ2VkIHRoZSB0ZXh0OyBvdGhlciBzZWdtZW50cyBrZWVwIHRoZWlyIHNwZWxsaW5nLlxuICovXG5jb25zdCByZWRhY3RQYXRoU2VnbWVudCA9IChzZWdtZW50OiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBsZXQgZGVjb2RlZCA9IHNlZ21lbnRcbiAgdHJ5IHtcbiAgICBkZWNvZGVkID0gZGVjb2RlVVJJQ29tcG9uZW50KHNlZ21lbnQpXG4gIH0gY2F0Y2gge1xuICAgIC8vIE1hbGZvcm1lZCBlc2NhcGU6IHJlZGFjdCB0aGUgcmF3IHNlZ21lbnQgaW5zdGVhZC5cbiAgfVxuICBjb25zdCByZWRhY3RlZCA9IHJlZGFjdFN0cmluZyhkZWNvZGVkKVxuICBpZiAoZGVjb2RlZCA9PT0gc2VnbWVudCkge1xuICAgIHJldHVybiByZWRhY3RlZFxuICB9XG4gIHJldHVybiByZWRhY3RlZCA9PT0gZGVjb2RlZCA/IHNlZ21lbnQgOiBlbmNvZGVVUklDb21wb25lbnQocmVkYWN0ZWQpXG59XG5cbi8qKiBBcHBseSBQSUkgcmVkYWN0aW9uIHRvIGEgcmVxdWVzdCBVUkwgd2hpbGUga2VlcGluZyB0aGUgcmVzdWx0IHBhcnNlYWJsZSBieSB0aGUgVVJML1JlcXVlc3QgY29uc3RydWN0b3JzLiAqL1xuY29uc3QgcmVkYWN0UmVxdWVzdFVybCA9IChcbiAgdXJsU3RyaW5nOiBzdHJpbmcsXG4gIGV4dHJhS2V5cz86IHJlYWRvbmx5IHN0cmluZ1tdXG4pOiBzdHJpbmcgPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHUgPSBuZXcgVVJMKHVybFN0cmluZylcbiAgICBpZiAodS51c2VybmFtZSAhPT0gJycpIHtcbiAgICAgIHUudXNlcm5hbWUgPSByZWRhY3RVcmxBdXRob3JpdHlTZWdtZW50KHUudXNlcm5hbWUpXG4gICAgfVxuICAgIGlmICh1LnBhc3N3b3JkICE9PSAnJykge1xuICAgICAgdS5wYXNzd29yZCA9IFVSTF9TQUZFX1JFREFDVFxuICAgIH1cbiAgICB1Lmhvc3RuYW1lID0gcmVkYWN0VXJsQXV0aG9yaXR5U2VnbWVudCh1Lmhvc3RuYW1lKVxuICAgIHUucGF0aG5hbWUgPSB1LnBhdGhuYW1lLnNwbGl0KCcvJykubWFwKHJlZGFjdFBhdGhTZWdtZW50KS5qb2luKCcvJylcbiAgICAvLyBBc3NpZ25pbmcgYHNlYXJjaGAgcmUtc2VyaWFsaXplcyB0aGUgcXVlcnksIHNvIGRvIGl0IG9ubHkgd2hlbiBhIHZhbHVlXG4gICAgLy8gY2hhbmdlZC4gVGhlIHZhbHVlcyBhcmUgZGVjb2RlZCBoZXJlLCBzbyBwYXR0ZXJucyBuZXZlciBydW4gYWdhaW5zdFxuICAgIC8vIHBlcmNlbnQtZW5jb2RlZCB0ZXh0LlxuICAgIGNvbnN0IHF1ZXJ5ID0gcmVkYWN0U2VhcmNoUGFyYW1zKHUuc2VhcmNoUGFyYW1zLCBleHRyYUtleXMpLnRvU3RyaW5nKClcbiAgICBpZiAocXVlcnkgIT09IHUuc2VhcmNoUGFyYW1zLnRvU3RyaW5nKCkpIHtcbiAgICAgIHUuc2VhcmNoID0gcXVlcnlcbiAgICB9XG4gICAgdS5oYXNoID0gcmVkYWN0U3RyaW5nKHUuaGFzaClcbiAgICByZXR1cm4gdS50b1N0cmluZygpXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiByZWRhY3RTdHJpbmcodXJsU3RyaW5nKS5yZXBsYWNlQWxsKFJFREFDVEVEX1RFWFQsIFVSTF9TQUZFX1JFREFDVClcbiAgfVxufVxuXG4vKiogSGVhZGVycyB3aG9zZSB2YWx1ZSBpcyBhbiBhYnNvbHV0ZSBVUkwgYW5kIG1heSBjYXJyeSBhIHNlbnNpdGl2ZSBxdWVyeSBrZXkuICovXG5jb25zdCBVUkxfVkFMVUVEX0hFQURFUlM6IFJlYWRvbmx5U2V0PHN0cmluZz4gPSBuZXcgU2V0KFtcbiAgJ2NvbnRlbnQtbG9jYXRpb24nLFxuICAnbG9jYXRpb24nLFxuICAncmVmZXJlcidcbl0pXG5cbi8qKiBUaGUgVVJMJ3Mgb3duIHNlcmlhbGlzYXRpb24sIHNvIGEgbWFza2VkIGNvcHkgY2FuIGJlIHRvbGQgZnJvbSBhIG1lcmVseSBub3JtYWxpc2VkIG9uZS4gKi9cbmNvbnN0IG5vcm1hbGl6ZWRIcmVmID0gKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICB0cnkge1xuICAgIHJldHVybiBuZXcgVVJMKHZhbHVlKS5ocmVmXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB2YWx1ZVxuICB9XG59XG5cbi8qKiBPbmUgaGVhZGVyIHZhbHVlOiB3aG9sZSB3aGVuIHRoZSBuYW1lIGlzIHNlbnNpdGl2ZSwgYnkgVVJMIHJ1bGVzIGZvciBhIFVSTC12YWx1ZWQgaGVhZGVyLCBieSBwYXR0ZXJuIG90aGVyd2lzZS4gKi9cbmNvbnN0IHJlZGFjdEhlYWRlclZhbHVlID0gKFxuICBuYW1lOiBzdHJpbmcsXG4gIHZhbHVlOiBzdHJpbmcsXG4gIGV4dHJhS2V5cz86IHJlYWRvbmx5IHN0cmluZ1tdXG4pOiBzdHJpbmcgPT4ge1xuICBpZiAoaXNTZW5zaXRpdmVLZXkobmFtZSwgZXh0cmFLZXlzKSkge1xuICAgIHJldHVybiBSRURBQ1RFRF9URVhUXG4gIH1cbiAgaWYgKCFVUkxfVkFMVUVEX0hFQURFUlMuaGFzKG5hbWUudG9Mb3dlckNhc2UoKSkpIHtcbiAgICByZXR1cm4gcmVkYWN0U3RyaW5nKHZhbHVlKVxuICB9XG4gIGNvbnN0IHJlZGFjdGVkID0gcmVkYWN0UmVxdWVzdFVybCh2YWx1ZSwgZXh0cmFLZXlzKVxuICAvLyBLZWVwIHRoZSBjbGllbnQncyBzcGVsbGluZyB3aGVuIG5vdGhpbmcgd2FzIG1hc2tlZDogc2VyaWFsaXNpbmcgYSBVUkxcbiAgLy8gYWxvbmUgYWRkcyBhIHRyYWlsaW5nIHNsYXNoLCBhbmQgYSBjaGFuZ2VkIGhlYWRlciBjbG9uZXMgdGhlIHJlcXVlc3QuXG4gIHJldHVybiByZWRhY3RlZCA9PT0gbm9ybWFsaXplZEhyZWYodmFsdWUpID8gdmFsdWUgOiByZWRhY3RlZFxufVxuXG4vKiogQWx3YXlzIHJldHVybnMgYSBuZXcgaW5zdGFuY2U7IGBoZWFkZXJzYCBpcyBsZWZ0IHVudG91Y2hlZC4gKi9cbmNvbnN0IHJlZGFjdEhlYWRlcnMgPSAoXG4gIGhlYWRlcnM6IEhlYWRlcnMsXG4gIGV4dHJhS2V5cz86IHJlYWRvbmx5IHN0cmluZ1tdXG4pOiBIZWFkZXJzID0+IHtcbiAgY29uc3QgcmVzdWx0ID0gbmV3IEhlYWRlcnMoKVxuICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgaGVhZGVycykge1xuICAgIHJlc3VsdC5hcHBlbmQobmFtZSwgcmVkYWN0SGVhZGVyVmFsdWUobmFtZSwgdmFsdWUsIGV4dHJhS2V5cykpXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5jb25zdCBNQVhfREVQVEggPSA2NFxuY29uc3QgREVQVEhfVEVYVCA9ICdbRGVwdGhdJ1xuLyoqIENvbnRhaW5lcnMgb3BlbiBvbiB0aGUgd2Fsay4gYHJlZGFjdGAgaXMgc3luY2hyb25vdXMsIHNvIG9uZSBjb3VudGVyIHNlcnZlcyBuZXN0ZWQgY2FsbHMgdG9vLiAqL1xubGV0IGRlcHRoID0gMFxuXG5jb25zdCB3aXRoUmVlbnRyYW5jeUd1YXJkID0gPFQ+KFxuICBvYmo6IG9iamVjdCxcbiAgaW5Qcm9ncmVzczogV2Vha1NldDxvYmplY3Q+LFxuICBydW46ICgpID0+IFRcbik6IFQgPT4ge1xuICBpblByb2dyZXNzLmFkZChvYmopXG4gIGRlcHRoICs9IDFcbiAgdHJ5IHtcbiAgICByZXR1cm4gcnVuKClcbiAgfSBmaW5hbGx5IHtcbiAgICBkZXB0aCAtPSAxXG4gICAgaW5Qcm9ncmVzcy5kZWxldGUob2JqKVxuICB9XG59XG5cbi8qKlxuICogTXV0dWFsbHkgcmVjdXJzaXZlLiBPbmUgb2JqZWN0IGxldHMgZWFjaCB3YWxrZXIgcmVhY2ggdGhlIG90aGVycyBieVxuICogcHJvcGVydHkgaW5zdGVhZCBvZiBieSBhIGJpbmRpbmcgZGVjbGFyZWQgbGF0ZXIgaW4gdGhlIGZpbGUuXG4gKi9cbmNvbnN0IHdhbGtlciA9IHtcbiAgLyoqXG4gICAqIFJlZGFjdHMgZWFjaCBpdGVtOyByZXR1cm5zIHRoZSBPUklHSU5BTCBhcnJheSByZWZlcmVuY2Ugd2hlbiBubyBpdGVtIGNoYW5nZWQgKHplcm9cbiAgICogYWxsb2NhdGlvbnMgZm9yIHRoZSBjb21tb24gbm8tUElJIGNhc2UpLiBBIG5ldyBhcnJheSBpcyBtYXRlcmlhbGl6ZWQgbGF6aWx5LCBzdGFydGluZyBmcm9tXG4gICAqIHRoZSBmaXJzdCBpdGVtIHRoYXQgY2hhbmdlcyDigJQgaXRlbXMgYmVmb3JlIHRoYXQgcG9pbnQgYXJlIGtub3duLXVuY2hhbmdlZCwgc28gdGhleSdyZSBjb3BpZWRcbiAgICogZnJvbSBgdmFsdWVgIGFzLWlzIHJhdGhlciB0aGFuIHJlY29tcHV0ZWQuXG4gICAqL1xuICBhcnJheTogKFxuICAgIHZhbHVlOiB1bmtub3duW10sXG4gICAgaW5Qcm9ncmVzczogV2Vha1NldDxvYmplY3Q+LFxuICAgIGV4dHJhS2V5cz86IHJlYWRvbmx5IHN0cmluZ1tdXG4gICk6IHVua25vd25bXSA9PiB7XG4gICAgbGV0IHJlc3VsdDogdW5rbm93bltdIHwgdW5kZWZpbmVkXG5cbiAgICBmb3IgKGNvbnN0IFtpbmRleCwgb3JpZ2luYWxdIG9mIHZhbHVlLmVudHJpZXMoKSkge1xuICAgICAgY29uc3QgcmVkYWN0ZWQgPSB3YWxrZXIudmFsdWUob3JpZ2luYWwsIGluUHJvZ3Jlc3MsIGV4dHJhS2V5cylcbiAgICAgIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCAmJiByZWRhY3RlZCAhPT0gb3JpZ2luYWwpIHtcbiAgICAgICAgcmVzdWx0ID0gdmFsdWUuc2xpY2UoMCwgaW5kZXgpXG4gICAgICB9XG4gICAgICByZXN1bHQ/LnB1c2gocmVkYWN0ZWQpXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdCA/PyB2YWx1ZVxuICB9LFxuXG4gIC8vIEVycm9ycyBhcmUgZXhlbXB0IGZyb20gdGhlIGlkZW50aXR5IGZhc3QgcGF0aDogYSByZWRhY3RlZCBFcnJvciBpcyBhbHdheXMgY29uc3RydWN0ZWRcbiAgLy8gZnJlc2ggKGV2ZW4gd2hlbiBub3RoaW5nIGNoYW5nZWQpIHNvIGNvbnN1bWVycyBuZXZlciByZWNlaXZlIHRoZSBvcmlnaW5hbCwgcG90ZW50aWFsbHlcbiAgLy8gc3RhY2stdHJhY2UtY2FycnlpbmcgaW5zdGFuY2UgYnkgcmVmZXJlbmNlLlxuICBlcnJvcjogKFxuICAgIG9yaWdpbmFsRXJyb3I6IEVycm9yLFxuICAgIGluUHJvZ3Jlc3M6IFdlYWtTZXQ8b2JqZWN0PixcbiAgICBleHRyYUtleXM/OiByZWFkb25seSBzdHJpbmdbXVxuICApOiBFcnJvciAmIFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+IHtcbiAgICBjb25zdCByZWRhY3RlZE1lc3NhZ2UgPSByZWRhY3RTdHJpbmcob3JpZ2luYWxFcnJvci5tZXNzYWdlKVxuICAgIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9yaWdpbmFsRXJyb3IpIGFzIG9iamVjdFxuICAgIGNvbnN0IG5ld0Vycm9yID0gT2JqZWN0LmNyZWF0ZShwcm90bykgYXMgRXJyb3IgJiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuXG4gICAgLy8gRGVmaW5lZCwgbm90IGFzc2lnbmVkOiBgRE9NRXhjZXB0aW9uYCBhbmQgZ2V0dGVyLW9ubHkgc3ViY2xhc3NlcyBoYXZlXG4gICAgLy8gYWNjZXNzb3IgYG5hbWVgL2BtZXNzYWdlYCBvbiB0aGUgcHJvdG90eXBlLCBhbmQgYXNzaWduaW5nIHRocm91Z2hcbiAgICAvLyB0aGVtIHRocm93cyBpbiBzdHJpY3QgbW9kZS4gTmF0aXZlIGVycm9ycyBrZWVwIGFsbCB0aHJlZSBub24tZW51bWVyYWJsZS5cbiAgICBjb25zdCBkZWZpbmVPd24gPSAoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCA9PiB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobmV3RXJyb3IsIGtleSwge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWVcbiAgICAgIH0pXG4gICAgfVxuICAgIGRlZmluZU93bignbWVzc2FnZScsIHJlZGFjdGVkTWVzc2FnZSlcbiAgICBkZWZpbmVPd24oJ25hbWUnLCBvcmlnaW5hbEVycm9yLm5hbWUpXG4gICAgaWYgKG9yaWdpbmFsRXJyb3Iuc3RhY2sgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZGVmaW5lT3duKCdzdGFjaycsIHJlZGFjdFN0cmluZyhvcmlnaW5hbEVycm9yLnN0YWNrKSlcbiAgICB9XG4gICAgaWYgKG9yaWdpbmFsRXJyb3IgaW5zdGFuY2VvZiBET01FeGNlcHRpb24pIHtcbiAgICAgIC8vIFRoZSBjb3B5IGhhcyBubyBET01FeGNlcHRpb24gaW50ZXJuYWwgc2xvdCwgc28gdGhlIHByb3RvdHlwZSdzIGBjb2RlYFxuICAgICAgLy8gZ2V0dGVyIHdvdWxkIHRocm93IG9uIGl0OyB0aGUgY29uc29sZSB0cmVlIHJlYWRzIGAuY29kZWAgb24gZXJyb3JzLlxuICAgICAgZGVmaW5lT3duKCdjb2RlJywgb3JpZ2luYWxFcnJvci5jb2RlKVxuICAgIH1cblxuICAgIGNvbnN0IGVycm9yUmVjb3JkID0gb3JpZ2luYWxFcnJvciBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhlcnJvclJlY29yZCkpIHtcbiAgICAgIGlmIChrZXkgPT09ICdtZXNzYWdlJyB8fCBrZXkgPT09ICduYW1lJyB8fCBrZXkgPT09ICdzdGFjaycpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZXJyb3JSZWNvcmQsIGtleSlcbiAgICAgIGlmIChkZXNjcmlwdG9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKGRlc2NyaXB0b3IuZ2V0ICE9PSB1bmRlZmluZWQgfHwgZGVzY3JpcHRvci5zZXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobmV3RXJyb3IsIGtleSwgZGVzY3JpcHRvcilcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVkYWN0ZWRWYWx1ZSA9IGlzU2Vuc2l0aXZlS2V5KGtleSwgZXh0cmFLZXlzKVxuICAgICAgICA/IFJFREFDVEVEX1RFWFRcbiAgICAgICAgOiB3YWxrZXIudmFsdWUoZGVzY3JpcHRvci52YWx1ZSwgaW5Qcm9ncmVzcywgZXh0cmFLZXlzKVxuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobmV3RXJyb3IsIGtleSwge1xuICAgICAgICAuLi5kZXNjcmlwdG9yLFxuICAgICAgICB2YWx1ZTogcmVkYWN0ZWRWYWx1ZVxuICAgICAgfSlcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3RXJyb3JcbiAgfSxcblxuICBtYXA6IChcbiAgICB2YWx1ZTogTWFwPHVua25vd24sIHVua25vd24+LFxuICAgIGluUHJvZ3Jlc3M6IFdlYWtTZXQ8b2JqZWN0PixcbiAgICBleHRyYUtleXM/OiByZWFkb25seSBzdHJpbmdbXVxuICApOiBNYXA8dW5rbm93biwgdW5rbm93bj4gPT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBNYXA8dW5rbm93biwgdW5rbm93bj4oKVxuICAgIGZvciAoY29uc3QgW2tleSwgZW50cnldIG9mIHZhbHVlKSB7XG4gICAgICBjb25zdCBzZW5zaXRpdmUgPVxuICAgICAgICB0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyAmJiBpc1NlbnNpdGl2ZUtleShrZXksIGV4dHJhS2V5cylcbiAgICAgIHJlc3VsdC5zZXQoXG4gICAgICAgIGtleSxcbiAgICAgICAgc2Vuc2l0aXZlID8gUkVEQUNURURfVEVYVCA6IHdhbGtlci52YWx1ZShlbnRyeSwgaW5Qcm9ncmVzcywgZXh0cmFLZXlzKVxuICAgICAgKVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG4gIH0sXG5cbiAgLyoqIFNhbWUgbGF6eS1tYXRlcmlhbGl6YXRpb24gc3RyYXRlZ3kgYXMge0BsaW5rIHdhbGtlci5hcnJheX0sIGZvciBwbGFpbiBvYmplY3RzLiAqL1xuICByZWNvcmQ6IChcbiAgICByZWNvcmRWYWx1ZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgaW5Qcm9ncmVzczogV2Vha1NldDxvYmplY3Q+LFxuICAgIGV4dHJhS2V5cz86IHJlYWRvbmx5IHN0cmluZ1tdXG4gICk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+IHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMocmVjb3JkVmFsdWUpXG4gICAgbGV0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWRcblxuICAgIGZvciAoY29uc3QgW2luZGV4LCBrZXldIG9mIGtleXMuZW50cmllcygpKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbCA9IHJlY29yZFZhbHVlW2tleV1cbiAgICAgIGNvbnN0IHNlbnNpdGl2ZSA9IGlzU2Vuc2l0aXZlS2V5KGtleSwgZXh0cmFLZXlzKVxuICAgICAgY29uc3QgcmVkYWN0ZWQgPSBzZW5zaXRpdmVcbiAgICAgICAgPyBSRURBQ1RFRF9URVhUXG4gICAgICAgIDogd2Fsa2VyLnZhbHVlKG9yaWdpbmFsLCBpblByb2dyZXNzLCBleHRyYUtleXMpXG5cbiAgICAgIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCAmJiAoc2Vuc2l0aXZlIHx8IHJlZGFjdGVkICE9PSBvcmlnaW5hbCkpIHtcbiAgICAgICAgcmVzdWx0ID0ge31cbiAgICAgICAgZm9yIChjb25zdCBwcmlvcktleSBvZiBrZXlzLnNsaWNlKDAsIGluZGV4KSkge1xuICAgICAgICAgIHJlc3VsdFtwcmlvcktleV0gPSByZWNvcmRWYWx1ZVtwcmlvcktleV1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gcmVkYWN0ZWRcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0ID8/IHJlY29yZFZhbHVlXG4gIH0sXG5cbiAgc2V0OiAoXG4gICAgdmFsdWU6IFNldDx1bmtub3duPixcbiAgICBpblByb2dyZXNzOiBXZWFrU2V0PG9iamVjdD4sXG4gICAgZXh0cmFLZXlzPzogcmVhZG9ubHkgc3RyaW5nW11cbiAgKTogU2V0PHVua25vd24+ID0+XG4gICAgbmV3IFNldChcbiAgICAgIEFycmF5LmZyb20odmFsdWUsIGl0ZW0gPT4gd2Fsa2VyLnZhbHVlKGl0ZW0sIGluUHJvZ3Jlc3MsIGV4dHJhS2V5cykpXG4gICAgKSxcblxuICAvKiogV2hhdCB0aGUgc2lua3Mgd2lsbCBzZXJpYWxpemUgaXMgdGhlIHRvSlNPTiBvdXRwdXQsIHNvIHRoYXQgaXMgd2hhdCB0aGUga2V5IGFuZCBwYXR0ZXJuIGNoZWNrcyBtdXN0IHNlZS4gKi9cbiAgdG9Kc29uOiAoXG4gICAgdmFsdWU6IHsgdG9KU09OOiAoKSA9PiB1bmtub3duIH0sXG4gICAgaW5Qcm9ncmVzczogV2Vha1NldDxvYmplY3Q+LFxuICAgIGV4dHJhS2V5cz86IHJlYWRvbmx5IHN0cmluZ1tdXG4gICk6IHVua25vd24gPT4ge1xuICAgIGxldCBwbGFpbjogdW5rbm93blxuICAgIHRyeSB7XG4gICAgICBwbGFpbiA9IHZhbHVlLnRvSlNPTigpXG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gVU5TRVJJQUxJWkFCTEVfVEVYVFxuICAgIH1cbiAgICBpZiAocGxhaW4gPT09IHZhbHVlKSB7XG4gICAgICAvLyBBIHRvSlNPTiB0aGF0IHJldHVybnMgaXRzIG93biBvYmplY3Q6IHRoZSBndWFyZCBhbHJlYWR5IGhvbGRzIGl0LFxuICAgICAgLy8gc28gd2FsayBpdHMga2V5cyBkaXJlY3RseSBpbnN0ZWFkIG9mIGFuc3dlcmluZyBcIltDaXJjdWxhcl1cIi5cbiAgICAgIHJldHVybiB3YWxrZXIucmVjb3JkKFxuICAgICAgICB2YWx1ZSBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICBpblByb2dyZXNzLFxuICAgICAgICBleHRyYUtleXNcbiAgICAgIClcbiAgICB9XG4gICAgcmV0dXJuIHdhbGtlci52YWx1ZShwbGFpbiwgaW5Qcm9ncmVzcywgZXh0cmFLZXlzKVxuICB9LFxuXG4gIHZhbHVlOiAoXG4gICAgdmFsdWU6IHVua25vd24sXG4gICAgaW5Qcm9ncmVzczogV2Vha1NldDxvYmplY3Q+LFxuICAgIGV4dHJhS2V5cz86IHJlYWRvbmx5IHN0cmluZ1tdXG4gICk6IHVua25vd24gPT4ge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gcmVkYWN0U3RyaW5nKHZhbHVlKVxuICAgIH1cblxuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm4gdmFsdWVcbiAgICB9XG5cbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAvLyBEYXRlcyBjYXJyeSBubyByZWRhY3RhYmxlIHN0cmluZyBjb250ZW50IGFuZCBhcmUgbmV2ZXIgbXV0YXRlZCBieSB0aGlzIG1vZHVsZSwgc28gdGhleVxuICAgICAgLy8gcGFzcyB0aHJvdWdoIGJ5IHJlZmVyZW5jZSAocGFydCBvZiB0aGUgaWRlbnRpdHkgZmFzdCBwYXRoKSBpbnN0ZWFkIG9mIGJlaW5nIGRlZmVuc2l2ZWx5XG4gICAgICAvLyBjbG9uZWQgYXMgYmVmb3JlLlxuICAgICAgcmV0dXJuIHZhbHVlXG4gICAgfVxuXG4gICAgaWYgKGluUHJvZ3Jlc3MuaGFzKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIENJUkNVTEFSX1JFRlxuICAgIH1cblxuICAgIGlmIChkZXB0aCA+PSBNQVhfREVQVEgpIHtcbiAgICAgIHJldHVybiBERVBUSF9URVhUXG4gICAgfVxuXG4gICAgLy8gVGhlc2UgdHlwZXMgZXhwb3NlIHRoZWlyIGNvbnRlbnRzIG9ubHkgdGhyb3VnaCBpdGVyYXRpb24gb3IgdG9KU09OKCksXG4gICAgLy8gc28gdGhlIGtleSB3YWxrIGJlbG93IHdvdWxkIHJldHVybiB0aGVtIHVuY2hhbmdlZC5cbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBIZWFkZXJzKSB7XG4gICAgICByZXR1cm4gcmVkYWN0SGVhZGVycyh2YWx1ZSwgZXh0cmFLZXlzKVxuICAgIH1cblxuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFVSTFNlYXJjaFBhcmFtcykge1xuICAgICAgcmV0dXJuIHJlZGFjdFNlYXJjaFBhcmFtcyh2YWx1ZSwgZXh0cmFLZXlzKVxuICAgIH1cblxuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFVSTCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG5ldyBVUkwocmVkYWN0UmVxdWVzdFVybCh2YWx1ZS5ocmVmLCBleHRyYUtleXMpKVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBSRURBQ1RFRF9URVhUXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgICByZXR1cm4gd2l0aFJlZW50cmFuY3lHdWFyZCh2YWx1ZSwgaW5Qcm9ncmVzcywgKCkgPT5cbiAgICAgICAgd2Fsa2VyLm1hcCh2YWx1ZSwgaW5Qcm9ncmVzcywgZXh0cmFLZXlzKVxuICAgICAgKVxuICAgIH1cblxuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFNldCkge1xuICAgICAgcmV0dXJuIHdpdGhSZWVudHJhbmN5R3VhcmQodmFsdWUsIGluUHJvZ3Jlc3MsICgpID0+XG4gICAgICAgIHdhbGtlci5zZXQodmFsdWUsIGluUHJvZ3Jlc3MsIGV4dHJhS2V5cylcbiAgICAgIClcbiAgICB9XG5cbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgcmV0dXJuIHdpdGhSZWVudHJhbmN5R3VhcmQodmFsdWUsIGluUHJvZ3Jlc3MsICgpID0+XG4gICAgICAgIHdhbGtlci5lcnJvcih2YWx1ZSwgaW5Qcm9ncmVzcywgZXh0cmFLZXlzKVxuICAgICAgKVxuICAgIH1cblxuICAgIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcodmFsdWUpIHx8IHZhbHVlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICAgIC8vIEJ5dGVzIGNhcnJ5IG5vIGtleXMgdG8gbWF0Y2g7IHdhbGtpbmcgYSBidWZmZXIgY29zdHMgb25lIGtleSBjaGVjayBwZXIgYnl0ZS5cbiAgICAgIHJldHVybiB2YWx1ZVxuICAgIH1cblxuICAgIGNvbnN0IHsgdG9KU09OIH0gPSB2YWx1ZSBhcyB7IHRvSlNPTj86IHVua25vd24gfVxuICAgIGlmICh0eXBlb2YgdG9KU09OID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gd2l0aFJlZW50cmFuY3lHdWFyZCh2YWx1ZSwgaW5Qcm9ncmVzcywgKCkgPT5cbiAgICAgICAgd2Fsa2VyLnRvSnNvbih2YWx1ZSBhcyB7IHRvSlNPTjogKCkgPT4gdW5rbm93biB9LCBpblByb2dyZXNzLCBleHRyYUtleXMpXG4gICAgICApXG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICByZXR1cm4gd2l0aFJlZW50cmFuY3lHdWFyZCh2YWx1ZSwgaW5Qcm9ncmVzcywgKCkgPT5cbiAgICAgICAgd2Fsa2VyLmFycmF5KHZhbHVlLCBpblByb2dyZXNzLCBleHRyYUtleXMpXG4gICAgICApXG4gICAgfVxuXG4gICAgcmV0dXJuIHdpdGhSZWVudHJhbmN5R3VhcmQodmFsdWUsIGluUHJvZ3Jlc3MsICgpID0+XG4gICAgICB3YWxrZXIucmVjb3JkKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBpblByb2dyZXNzLCBleHRyYUtleXMpXG4gICAgKVxuICB9XG59XG5cbi8qKlxuICogQXBhcnQgZnJvbSBhIGNpcmN1bGFyIHJlZmVyZW5jZSBhbmQgYSB2YWx1ZSBuZXN0ZWQgZGVlcGVyIHRoYW4gNjQgbGV2ZWxzLFxuICogd2hpY2ggYmVjb21lIG1hcmtlciBzdHJpbmdzLCB0aGUgd2FsayBrZWVwcyBlYWNoIHZhbHVlJ3Mgc2hhcGU6IGEgc3RyaW5nXG4gKiBzdGF5cyBhIHN0cmluZywgYW4gYXJyYXkgYW4gYXJyYXksIGFuIEVycm9yIGFuIEVycm9yLiBUaGUgZXhjZXB0aW9uIGlzIGFcbiAqIG5vbi1lcnJvciB2YWx1ZSB3aXRoIGB0b0pTT05gLCB3aGljaCBiZWNvbWVzIHdoYXQgaXQgc2VyaWFsaXplcyB0bywgc2luY2VcbiAqIHRoYXQgaXMgd2hhdCB0aGUgc2lua3Mgd3JpdGUuIEZvciBldmVyeXRoaW5nIGVsc2UgdGhlIGlucHV0IHR5cGUgc3RpbGxcbiAqIGRlc2NyaWJlcyB0aGUgb3V0cHV0LlxuICovXG5leHBvcnQgY29uc3QgcmVkYWN0ID0gPFQ+KHZhbHVlOiBULCBleHRyYUtleXM/OiByZWFkb25seSBzdHJpbmdbXSk6IFQgPT5cbiAgd2Fsa2VyLnZhbHVlKHZhbHVlLCBuZXcgV2Vha1NldCgpLCBleHRyYUtleXMpIGFzIFRcblxuLyoqXG4gKiBDbG9uZSByZXF1ZXN0IFVSTCwgbWV0aG9kIGFuZCBoZWFkZXJzIGZvciBsb2dnaW5nIHdpdGggdGhlIHNhbWUgc3RyaW5nIHJlZGFjdGlvbiBhcyB7QGxpbmsgcmVkYWN0fS5cbiAqIFRoZSByZXR1cm5lZCByZXF1ZXN0IGlzIGEgbG9nZ2luZy1vbmx5IGFydGlmYWN0IGNhcnJ5aW5nIHVybC9tZXRob2QvaGVhZGVycy9zaWduYWw7IGl0IGludGVudGlvbmFsbHlcbiAqIG9taXRzIHRoZSBib2R5IHNvIGl0IG5ldmVyIHJlLXVzZXMgdGhlIG9yaWdpbmFsIChwb3NzaWJseSBhbHJlYWR5LWNvbnN1bWVkKSByZXF1ZXN0IHN0cmVhbS4gVGhlXG4gKiBvcmlnaW5hbCByZXF1ZXN0IGlzIGxlZnQgdW50b3VjaGVkIGFuZCByZW1haW5zIHVzYWJsZS5cbiAqL1xuZXhwb3J0IGNvbnN0IHJlZGFjdFJlcXVlc3QgPSAoXG4gIHJlcXVlc3Q6IFJlcXVlc3QsXG4gIGV4dHJhS2V5cz86IHJlYWRvbmx5IHN0cmluZ1tdXG4pOiBSZXF1ZXN0ID0+IHtcbiAgY29uc3QgcmVkYWN0ZWRVcmwgPSByZWRhY3RSZXF1ZXN0VXJsKHJlcXVlc3QudXJsLCBleHRyYUtleXMpXG4gIGNvbnN0IG5leHRIZWFkZXJzID0gbmV3IEhlYWRlcnMoKVxuICBsZXQgaGVhZGVyc0NoYW5nZWQgPSBmYWxzZVxuXG4gIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiByZXF1ZXN0LmhlYWRlcnMuZW50cmllcygpKSB7XG4gICAgY29uc3QgcmVkYWN0ZWQgPSByZWRhY3RIZWFkZXJWYWx1ZShuYW1lLCB2YWx1ZSwgZXh0cmFLZXlzKVxuICAgIGlmIChyZWRhY3RlZCAhPT0gdmFsdWUpIHtcbiAgICAgIGhlYWRlcnNDaGFuZ2VkID0gdHJ1ZVxuICAgIH1cbiAgICBuZXh0SGVhZGVycy5zZXQobmFtZSwgcmVkYWN0ZWQpXG4gIH1cblxuICBjb25zdCByZWRhY3RlZE1ldGhvZCA9IHJlZGFjdFN0cmluZyhyZXF1ZXN0Lm1ldGhvZClcbiAgY29uc3QgdXJsQ2hhbmdlZCA9IHJlZGFjdGVkVXJsICE9PSByZXF1ZXN0LnVybFxuICBjb25zdCBtZXRob2RDaGFuZ2VkID0gcmVkYWN0ZWRNZXRob2QgIT09IHJlcXVlc3QubWV0aG9kXG5cbiAgaWYgKCEodXJsQ2hhbmdlZCB8fCBoZWFkZXJzQ2hhbmdlZCB8fCBtZXRob2RDaGFuZ2VkKSkge1xuICAgIHJldHVybiByZXF1ZXN0XG4gIH1cblxuICBjb25zdCBpbml0OiBSZXF1ZXN0SW5pdCA9IHtcbiAgICBoZWFkZXJzOiBuZXh0SGVhZGVycyxcbiAgICBtZXRob2Q6IHJlZGFjdGVkTWV0aG9kLFxuICAgIHJlZGlyZWN0OiByZXF1ZXN0LnJlZGlyZWN0LFxuICAgIHNpZ25hbDogcmVxdWVzdC5zaWduYWxcbiAgfVxuXG4gIHJldHVybiBuZXcgUmVxdWVzdChyZWRhY3RlZFVybCwgaW5pdClcbn1cbiIsCiAgICAiaW1wb3J0IHsgU1RBVFVTX0NPREVTIH0gZnJvbSAnbm9kZTpodHRwJ1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJ1xuaW1wb3J0IHsgZ2V0U3RhdHVzQ29kZSB9IGZyb20gJy4uL2hlbHBlcnMvc3RhdHVzJ1xuaW1wb3J0IHR5cGUgeyBMb2dMZXZlbCwgT3B0aW9ucywgUmVxdWVzdEluZm8sIFN0b3JlRGF0YSB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBlbGFwc2VkTXMgfSBmcm9tICcuLi91dGlscy9kdXJhdGlvbidcbmltcG9ydCB7IGlzU3RydWN0dXJlZEVycm9yLCBwYXJzZUVycm9yIH0gZnJvbSAnLi4vdXRpbHMvZXJyb3InXG5pbXBvcnQgeyBzYW5pdGl6ZUxvZ1RleHQgfSBmcm9tICcuLi91dGlscy9zYW5pdGl6ZSdcblxuY29uc3QgcGFkMiA9ICh2YWx1ZTogbnVtYmVyKTogc3RyaW5nID0+IFN0cmluZyh2YWx1ZSkucGFkU3RhcnQoMiwgJzAnKVxuY29uc3QgcGFkMyA9ICh2YWx1ZTogbnVtYmVyKTogc3RyaW5nID0+IFN0cmluZyh2YWx1ZSkucGFkU3RhcnQoMywgJzAnKVxuXG5jb25zdCBERUZBVUxUX1NMT1dfTVMgPSA1MDBcbmNvbnN0IERFRkFVTFRfVkVSWV9TTE9XX01TID0gMTAwMFxuY29uc3QgTUVUSE9EX1BBRCA9IDdcbmNvbnN0IE1BWF9LRVlfTEVOR1RIID0gMjU2XG5cbmNvbnN0IERFRkFVTFRfTE9HX0ZPUk1BVCA9XG4gICd7bm93fSB7c2VydmljZX17aWNvbn0ge21ldGhvZH0ge3BhdGhuYW1lfSB7c3RhdHVzfSB7ZHVyYXRpb259IHttZXNzYWdlfXtzcGVlZH0nXG5cbmNvbnN0IExPR19GT1JNQVRfUkVHRVggPVxuICAvXFx7KD86bm93fGVwb2NofGxldmVsfGljb258ZHVyYXRpb258bWV0aG9kfHBhdGhuYW1lfHBhdGh8cXVlcnl8c3RhdHVzfHN0YXR1c1RleHR8bWVzc2FnZXxpcHxjb250ZXh0fHNlcnZpY2V8c3BlZWR8cmVxdWVzdElkKVxcfS9ndVxuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1hdHRlZExvZ091dHB1dCB7XG4gIGNvbnRleHRMaW5lczogc3RyaW5nW11cbiAgbWFpbjogc3RyaW5nXG59XG5cbmNvbnN0IHNob3VsZFVzZUNvbG9ycyA9IChvcHRpb25zOiBPcHRpb25zKTogYm9vbGVhbiA9PiB7XG4gIGNvbnN0IHsgY29uZmlnIH0gPSBvcHRpb25zXG4gIGNvbnN0IGVuYWJsZWRCeUNvbmZpZyA9IGNvbmZpZz8udXNlQ29sb3JzID8/IHRydWVcblxuICAvLyBBdm9pZCBBTlNJIHNlcXVlbmNlcyBpbiBub24taW50ZXJhY3RpdmUgb3V0cHV0IChwaXBlcywgQ0kgbG9ncywgZmlsZXMpLlxuICBjb25zdCBpc1R0eSA9IHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBwcm9jZXNzLnN0ZG91dD8uaXNUVFkgPT09IHRydWVcbiAgcmV0dXJuIGVuYWJsZWRCeUNvbmZpZyAmJiBpc1R0eVxufVxuXG4vLyBwaW5vLXByZXR0eSdzIHNob3J0aGFuZCBmb3IgYHl5eXktbW0tZGQgSEg6TU06c3MuU1NTYCAobWludXMgdGhlIGBvYFxuLy8gdGltZXpvbmUtb2Zmc2V0IHRva2VuLCB3aGljaCB0aGlzIGZvcm1hdHRlciBkb2VzIG5vdCBzdXBwb3J0KS5cbmNvbnN0IFNUQU5EQVJEX1RJTUVTVEFNUF9QQVRURVJOID0gJ3l5eXktbW0tZGQgSEg6TU06c3MuU1NTJ1xuLy8gYFNZUzpgIGFuZCBgVVRDOmAgYXJlIHRoZSBzYW1lIGxlbmd0aC5cbmNvbnN0IFRJTUVTVEFNUF9QUkVGSVhfTEVOR1RIID0gJ3N5czonLmxlbmd0aFxuXG4vKipcbiAqIFNwbGl0cyBhIGB0aW1lc3RhbXAudHJhbnNsYXRlVGltZWAgdmFsdWUgaW50byB0aGUgbGl0ZXJhbCBwYXR0ZXJuIHRvXG4gKiBleHBhbmQgYW5kIHdoZXRoZXIgaXQgc2hvdWxkIGJlIHJlYWQgd2l0aCBVVEMgZ2V0dGVycy4gTWlycm9yc1xuICogcGluby1wcmV0dHkncyBgU1lTOmAvYFVUQzpgIHByZWZpeGVzIChjYXNlLWluc2Vuc2l0aXZlKTsgYSBiYXJlIHBhdHRlcm5cbiAqIGtlZXBzIHRoaXMgZm9ybWF0dGVyJ3MgaGlzdG9yaWNhbCBsb2NhbC10aW1lIGJlaGF2aW91ci5cbiAqL1xuY29uc3QgcmVzb2x2ZVRpbWVzdGFtcFBhdHRlcm4gPSAoXG4gIHBhdHRlcm46IHN0cmluZ1xuKTogeyBwYXR0ZXJuOiBzdHJpbmc7IHV0YzogYm9vbGVhbiB9ID0+IHtcbiAgY29uc3QgcHJlZml4ID0gcGF0dGVybi5zbGljZSgwLCBUSU1FU1RBTVBfUFJFRklYX0xFTkdUSCkudG9Mb3dlckNhc2UoKVxuICBjb25zdCB1dGMgPSBwcmVmaXggPT09ICd1dGM6J1xuICBjb25zdCByZXN0ID1cbiAgICB1dGMgfHwgcHJlZml4ID09PSAnc3lzOicgPyBwYXR0ZXJuLnNsaWNlKFRJTUVTVEFNUF9QUkVGSVhfTEVOR1RIKSA6IHBhdHRlcm5cbiAgcmV0dXJuIHtcbiAgICBwYXR0ZXJuOiByZXN0ID09PSAnc3RhbmRhcmQnID8gU1RBTkRBUkRfVElNRVNUQU1QX1BBVFRFUk4gOiByZXN0LFxuICAgIHV0Y1xuICB9XG59XG5cbmNvbnN0IGZvcm1hdFRpbWVzdGFtcCA9IChkYXRlOiBEYXRlLCBwYXR0ZXJuPzogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgaWYgKCFwYXR0ZXJuKSB7XG4gICAgcmV0dXJuIGRhdGUudG9JU09TdHJpbmcoKVxuICB9XG5cbiAgY29uc3QgeyBwYXR0ZXJuOiByZXNvbHZlZCwgdXRjIH0gPSByZXNvbHZlVGltZXN0YW1wUGF0dGVybihwYXR0ZXJuKVxuXG4gIGNvbnN0IHl5eXkgPSBTdHJpbmcodXRjID8gZGF0ZS5nZXRVVENGdWxsWWVhcigpIDogZGF0ZS5nZXRGdWxsWWVhcigpKVxuICBjb25zdCBtbSA9IHBhZDIoKHV0YyA/IGRhdGUuZ2V0VVRDTW9udGgoKSA6IGRhdGUuZ2V0TW9udGgoKSkgKyAxKVxuICBjb25zdCBkZCA9IHBhZDIodXRjID8gZGF0ZS5nZXRVVENEYXRlKCkgOiBkYXRlLmdldERhdGUoKSlcbiAgY29uc3QgSEggPSBwYWQyKHV0YyA/IGRhdGUuZ2V0VVRDSG91cnMoKSA6IGRhdGUuZ2V0SG91cnMoKSlcbiAgY29uc3QgTU0gPSBwYWQyKHV0YyA/IGRhdGUuZ2V0VVRDTWludXRlcygpIDogZGF0ZS5nZXRNaW51dGVzKCkpXG4gIGNvbnN0IHNzID0gcGFkMih1dGMgPyBkYXRlLmdldFVUQ1NlY29uZHMoKSA6IGRhdGUuZ2V0U2Vjb25kcygpKVxuICBjb25zdCBTU1MgPSBwYWQzKHV0YyA/IGRhdGUuZ2V0VVRDTWlsbGlzZWNvbmRzKCkgOiBkYXRlLmdldE1pbGxpc2Vjb25kcygpKVxuXG4gIHJldHVybiByZXNvbHZlZFxuICAgIC5yZXBsYWNlQWxsKCd5eXl5JywgeXl5eSlcbiAgICAucmVwbGFjZUFsbCgnbW0nLCBtbSlcbiAgICAucmVwbGFjZUFsbCgnZGQnLCBkZClcbiAgICAucmVwbGFjZUFsbCgnSEgnLCBISClcbiAgICAucmVwbGFjZUFsbCgnTU0nLCBNTSlcbiAgICAucmVwbGFjZUFsbCgnc3MnLCBzcylcbiAgICAucmVwbGFjZUFsbCgnU1NTJywgU1NTKVxufVxuXG4vKiogUmVzb2x2ZXMgY2xpZW50IElQIGZyb20geC1mb3J3YXJkZWQtZm9yIChmaXJzdCBJUCkgb3IgeC1yZWFsLWlwLiBFbXB0eSB3aGVuIG5laXRoZXIgaGVhZGVyIGlzIHNldCAoZS5nLiBsb2NhbGhvc3QpLiAqL1xuY29uc3QgZ2V0SXAgPSAocmVxdWVzdDogUmVxdWVzdEluZm8pOiBzdHJpbmcgPT4ge1xuICBjb25zdCBmb3J3YXJkZWQgPSByZXF1ZXN0LmhlYWRlcnMuZ2V0KCd4LWZvcndhcmRlZC1mb3InKVxuICBjb25zdCBjYW5kaWRhdGUgPSBmb3J3YXJkZWRcbiAgICA/IChmb3J3YXJkZWQuc3BsaXQoJywnKVswXT8udHJpbSgpID8/ICcnKVxuICAgIDogKHJlcXVlc3QuaGVhZGVycy5nZXQoJ3gtcmVhbC1pcCcpID8/ICcnKVxuICByZXR1cm4gc2FuaXRpemVMb2dUZXh0KGNhbmRpZGF0ZSwgNjQpXG59XG5cbmV4cG9ydCBjb25zdCBmb3JtYXREdXJhdGlvbiA9IChtczogbnVtYmVyKTogc3RyaW5nID0+IHtcbiAgaWYgKG1zID49IDEwMDApIHtcbiAgICBjb25zdCBzZWMgPSBtcyAvIDEwMDBcbiAgICBpZiAoc2VjID49IDEwKSB7XG4gICAgICByZXR1cm4gYCR7TWF0aC5yb3VuZChzZWMpfXNgXG4gICAgfVxuICAgIGNvbnN0IG9uZURlY2ltYWwgPSBzZWMudG9GaXhlZCgxKVxuICAgIHJldHVybiBvbmVEZWNpbWFsLmVuZHNXaXRoKCcuMCcpID8gYCR7TWF0aC5yb3VuZChzZWMpfXNgIDogYCR7b25lRGVjaW1hbH1zYFxuICB9XG4gIGlmIChtcyA+IDAgJiYgbXMgPCAxKSB7XG4gICAgcmV0dXJuIGAke21zLnRvRml4ZWQoMil9bXNgXG4gIH1cbiAgcmV0dXJuIGAke01hdGgucm91bmQobXMpfW1zYFxufVxuXG5jb25zdCBnZXRTbG93VGhyZXNob2xkcyA9IChcbiAgb3B0aW9uczogT3B0aW9uc1xuKTogeyBzbG93OiBudW1iZXI7IHZlcnlTbG93OiBudW1iZXIgfSA9PiB7XG4gIGNvbnN0IHsgY29uZmlnIH0gPSBvcHRpb25zXG4gIHJldHVybiB7XG4gICAgc2xvdzogY29uZmlnPy5zbG93VGhyZXNob2xkID8/IERFRkFVTFRfU0xPV19NUyxcbiAgICB2ZXJ5U2xvdzogY29uZmlnPy52ZXJ5U2xvd1RocmVzaG9sZCA/PyBERUZBVUxUX1ZFUllfU0xPV19NU1xuICB9XG59XG5cbmNvbnN0IGNvbG9yRHVyYXRpb25UZXh0ID0gKFxuICBtczogbnVtYmVyLFxuICB1c2VDb2xvcnM6IGJvb2xlYW4sXG4gIHNsb3c6IG51bWJlcixcbiAgdmVyeVNsb3c6IG51bWJlclxuKTogeyB0ZXh0OiBzdHJpbmc7IGlzVmVyeVNsb3c6IGJvb2xlYW4gfSA9PiB7XG4gIGNvbnN0IHJhdyA9IGZvcm1hdER1cmF0aW9uKG1zKVxuICBjb25zdCBpc1ZlcnlTbG93ID0gbXMgPj0gdmVyeVNsb3dcblxuICBpZiAoIXVzZUNvbG9ycykge1xuICAgIHJldHVybiB7IGlzVmVyeVNsb3csIHRleHQ6IHJhdyB9XG4gIH1cblxuICBsZXQgY29sb3JlZCA9IHJhd1xuICBpZiAobXMgPCBzbG93KSB7XG4gICAgY29sb3JlZCA9IGNoYWxrLmdyZWVuKHJhdylcbiAgfSBlbHNlIGlmIChtcyA8IHZlcnlTbG93KSB7XG4gICAgY29sb3JlZCA9IGNoYWxrLnllbGxvdyhyYXcpXG4gIH0gZWxzZSB7XG4gICAgY29sb3JlZCA9IGNoYWxrLnJlZC5ib2xkKHJhdylcbiAgfVxuXG4gIHJldHVybiB7IGlzVmVyeVNsb3csIHRleHQ6IGNvbG9yZWQgfVxufVxuXG5jb25zdCBnZXRTcGVlZFRva2VuID0gKGlzVmVyeVNsb3c6IGJvb2xlYW4sIHVzZUNvbG9yczogYm9vbGVhbik6IHN0cmluZyA9PiB7XG4gIGlmICghaXNWZXJ5U2xvdykge1xuICAgIHJldHVybiAnJ1xuICB9XG4gIGNvbnN0IGJhZGdlID0gJ+KaoSBzbG93J1xuICBpZiAoIXVzZUNvbG9ycykge1xuICAgIHJldHVybiBgICR7YmFkZ2V9YFxuICB9XG4gIHJldHVybiBgICR7Y2hhbGsueWVsbG93KGJhZGdlKX1gXG59XG5cbi8qKiBMb2dpeGx5c2lhIGJyYW5kOiBmb3ggZW1vamkgd2l0aCBsZXZlbC1jb2xvcmVkIGJhY2tncm91bmQgd2hlbiBjb2xvcnMgYXJlIGVuYWJsZWQuICovXG5jb25zdCBnZXRMZXZlbEljb24gPSAobGV2ZWw6IExvZ0xldmVsLCB1c2VDb2xvcnM6IGJvb2xlYW4pOiBzdHJpbmcgPT4ge1xuICBpZiAoIXVzZUNvbG9ycykge1xuICAgIHJldHVybiAn8J+miidcbiAgfVxuICBpZiAobGV2ZWwgPT09ICdFUlJPUicpIHtcbiAgICByZXR1cm4gY2hhbGsuYmdSZWQuYmxhY2soJyDwn6aKICcpXG4gIH1cbiAgaWYgKGxldmVsID09PSAnV0FSTklORycpIHtcbiAgICByZXR1cm4gY2hhbGsuYmdZZWxsb3cuYmxhY2soJyDwn6aKICcpXG4gIH1cbiAgaWYgKGxldmVsID09PSAnREVCVUcnKSB7XG4gICAgcmV0dXJuIGNoYWxrLmJnQmx1ZS5ibGFjaygnIPCfpoogJylcbiAgfVxuICByZXR1cm4gY2hhbGsuYmdHcmVlbi5ibGFjaygnIPCfpoogJylcbn1cblxuY29uc3QgZ2V0Q29sb3JlZExldmVsID0gKGxldmVsOiBMb2dMZXZlbCwgdXNlQ29sb3JzOiBib29sZWFuKTogc3RyaW5nID0+IHtcbiAgaWYgKCF1c2VDb2xvcnMpIHtcbiAgICByZXR1cm4gbGV2ZWxcbiAgfVxuXG4gIGlmIChsZXZlbCA9PT0gJ0VSUk9SJykge1xuICAgIHJldHVybiBjaGFsay5iZ1JlZC5ibGFjayhsZXZlbClcbiAgfVxuICBpZiAobGV2ZWwgPT09ICdXQVJOSU5HJykge1xuICAgIHJldHVybiBjaGFsay5iZ1llbGxvdy5ibGFjayhsZXZlbClcbiAgfVxuICBpZiAobGV2ZWwgPT09ICdERUJVRycpIHtcbiAgICByZXR1cm4gY2hhbGsuYmdCbHVlLmJsYWNrKGxldmVsKVxuICB9XG5cbiAgcmV0dXJuIGNoYWxrLmJnR3JlZW4uYmxhY2sobGV2ZWwpXG59XG5cbmNvbnN0IGdldENvbG9yZWRNZXRob2QgPSAobWV0aG9kOiBzdHJpbmcsIHVzZUNvbG9yczogYm9vbGVhbik6IHN0cmluZyA9PiB7XG4gIGlmICghdXNlQ29sb3JzKSB7XG4gICAgcmV0dXJuIG1ldGhvZFxuICB9XG5cbiAgY29uc3QgdXBwZXIgPSBtZXRob2QudG9VcHBlckNhc2UoKVxuICBpZiAodXBwZXIgPT09ICdHRVQnKSB7XG4gICAgcmV0dXJuIGNoYWxrLmdyZWVuLmJvbGQodXBwZXIpXG4gIH1cbiAgaWYgKHVwcGVyID09PSAnUE9TVCcpIHtcbiAgICByZXR1cm4gY2hhbGsuYmx1ZS5ib2xkKHVwcGVyKVxuICB9XG4gIGlmICh1cHBlciA9PT0gJ1BVVCcpIHtcbiAgICByZXR1cm4gY2hhbGsueWVsbG93LmJvbGQodXBwZXIpXG4gIH1cbiAgaWYgKHVwcGVyID09PSAnUEFUQ0gnKSB7XG4gICAgcmV0dXJuIGNoYWxrLnllbGxvd0JyaWdodC5ib2xkKHVwcGVyKVxuICB9XG4gIGlmICh1cHBlciA9PT0gJ0RFTEVURScpIHtcbiAgICByZXR1cm4gY2hhbGsucmVkLmJvbGQodXBwZXIpXG4gIH1cbiAgaWYgKHVwcGVyID09PSAnT1BUSU9OUycpIHtcbiAgICByZXR1cm4gY2hhbGsuY3lhbi5ib2xkKHVwcGVyKVxuICB9XG4gIGlmICh1cHBlciA9PT0gJ0hFQUQnKSB7XG4gICAgcmV0dXJuIGNoYWxrLmdyZWVuQnJpZ2h0LmJvbGQodXBwZXIpXG4gIH1cbiAgaWYgKHVwcGVyID09PSAnVFJBQ0UnKSB7XG4gICAgcmV0dXJuIGNoYWxrLm1hZ2VudGEuYm9sZCh1cHBlcilcbiAgfVxuICBpZiAodXBwZXIgPT09ICdDT05ORUNUJykge1xuICAgIHJldHVybiBjaGFsay5jeWFuQnJpZ2h0LmJvbGQodXBwZXIpXG4gIH1cblxuICByZXR1cm4gY2hhbGsud2hpdGUuYm9sZCh1cHBlcilcbn1cblxuLyoqXG4gKiBDb2xvcnMgdGhlIG1ldGhvZCwgdGhlbiBwYWRzIGFmdGVyd2FyZCwgc28gdGhlIHBhZGRpbmcgbmV2ZXIgc2l0cyBpbnNpZGUgdGhlXG4gKiBBTlNJLXdyYXBwZWQgdGV4dCAocGFkZGluZyB0aGUgYWxyZWFkeS1jb2xvcmVkL3BhZGRlZCBzdHJpbmcgZmlyc3Qgd291bGQgbWFrZVxuICogYGdldENvbG9yZWRNZXRob2RgJ3MgY29tcGFyaXNvbnMgYWdhaW5zdCBsaXRlcmFscyBsaWtlIGAnR0VUJ2AgYWx3YXlzIG1pc3MpLlxuICovXG5jb25zdCBnZXRDb2xvcmVkTWV0aG9kVG9rZW4gPSAobWV0aG9kOiBzdHJpbmcsIHVzZUNvbG9yczogYm9vbGVhbik6IHN0cmluZyA9PiB7XG4gIGNvbnN0IHVwcGVyID0gbWV0aG9kLnRvVXBwZXJDYXNlKClcbiAgY29uc3QgcGFkZGluZyA9ICcgJy5yZXBlYXQoTWF0aC5tYXgoMCwgTUVUSE9EX1BBRCAtIHVwcGVyLmxlbmd0aCkpXG4gIHJldHVybiBnZXRDb2xvcmVkTWV0aG9kKHVwcGVyLCB1c2VDb2xvcnMpICsgcGFkZGluZ1xufVxuXG5jb25zdCBnZXRDb2xvcmVkU3RhdHVzID0gKHN0YXR1c0NvZGU6IG51bWJlciwgdXNlQ29sb3JzOiBib29sZWFuKTogc3RyaW5nID0+IHtcbiAgY29uc3Qgc3RhdHVzID0gU3RyaW5nKHN0YXR1c0NvZGUpXG4gIGlmICghKHVzZUNvbG9ycyAmJiBOdW1iZXIuaXNGaW5pdGUoc3RhdHVzQ29kZSkpKSB7XG4gICAgcmV0dXJuIHN0YXR1c1xuICB9XG5cbiAgaWYgKHN0YXR1c0NvZGUgPj0gNTAwKSB7XG4gICAgcmV0dXJuIGNoYWxrLnJlZChzdGF0dXMpXG4gIH1cbiAgaWYgKHN0YXR1c0NvZGUgPj0gNDAwKSB7XG4gICAgcmV0dXJuIGNoYWxrLnllbGxvdyhzdGF0dXMpXG4gIH1cbiAgaWYgKHN0YXR1c0NvZGUgPj0gMzAwKSB7XG4gICAgcmV0dXJuIGNoYWxrLmN5YW4oc3RhdHVzKVxuICB9XG4gIGlmIChzdGF0dXNDb2RlID49IDIwMCkge1xuICAgIHJldHVybiBjaGFsay5ncmVlbihzdGF0dXMpXG4gIH1cbiAgcmV0dXJuIGNoYWxrLmdyYXkoc3RhdHVzKVxufVxuXG5jb25zdCBnZXRDb2xvcmVkVGltZXN0YW1wID0gKHRpbWVzdGFtcDogc3RyaW5nLCB1c2VDb2xvcnM6IGJvb2xlYW4pOiBzdHJpbmcgPT4ge1xuICBpZiAoIXVzZUNvbG9ycykge1xuICAgIHJldHVybiB0aW1lc3RhbXBcbiAgfVxuXG4gIHJldHVybiBjaGFsay5ncmF5KHRpbWVzdGFtcClcbn1cblxuY29uc3QgZ2V0Q29sb3JlZFBhdGhuYW1lID0gKHBhdGhuYW1lOiBzdHJpbmcsIHVzZUNvbG9yczogYm9vbGVhbik6IHN0cmluZyA9PiB7XG4gIGlmICghdXNlQ29sb3JzKSB7XG4gICAgcmV0dXJuIHBhdGhuYW1lXG4gIH1cblxuICByZXR1cm4gY2hhbGsud2hpdGVCcmlnaHQocGF0aG5hbWUpXG59XG5cbmNvbnN0IGdldFN0YXR1c1RleHQgPSAoc3RhdHVzQ29kZTogbnVtYmVyKTogc3RyaW5nID0+IHtcbiAgY29uc3QgdGV4dCA9IFNUQVRVU19DT0RFU1tzdGF0dXNDb2RlXVxuICByZXR1cm4gdGV4dCA/PyAnJ1xufVxuXG5jb25zdCBnZXRTZXJ2aWNlVG9rZW4gPSAob3B0aW9uczogT3B0aW9ucywgdXNlQ29sb3JzOiBib29sZWFuKTogc3RyaW5nID0+IHtcbiAgY29uc3QgbmFtZSA9IG9wdGlvbnMuY29uZmlnPy5zZXJ2aWNlPy50cmltKClcbiAgaWYgKCFuYW1lKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cbiAgY29uc3QgYnJhY2tldGVkID0gYFske25hbWV9XWBcbiAgaWYgKCF1c2VDb2xvcnMpIHtcbiAgICByZXR1cm4gYCR7YnJhY2tldGVkfSBgXG4gIH1cbiAgcmV0dXJuIGAke2NoYWxrLmRpbShicmFja2V0ZWQpfSBgXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybWF0Q29udGV4dCB7XG4gIGZvcm1hdDogc3RyaW5nXG4gIHNlcnZpY2VUb2tlbjogc3RyaW5nXG4gIHNsb3dUaHJlc2hvbGQ6IG51bWJlclxuICAvKiogRm9ybWF0IHRva2VucyBhY3R1YWxseSBwcmVzZW50IGluIGBmb3JtYXRgIChzZWUge0BsaW5rIExPR19GT1JNQVRfUkVHRVh9KS4gKi9cbiAgdG9rZW5zOiBTZXQ8c3RyaW5nPlxuICB1c2VDb2xvcnM6IGJvb2xlYW5cbiAgdmVyeVNsb3dUaHJlc2hvbGQ6IG51bWJlclxufVxuXG4vKipcbiAqIFJlc29sdmVzIGNvbG9ycy9mb3JtYXQvdGhyZXNob2xkcy9zZXJ2aWNlIG9uY2UgcGVyIGxvZ2dlciBpbnN0YW5jZSBpbnN0ZWFkIG9mIHBlciBsb2cgbGluZS5cbiAqIFNhZmUgdG8gaG9pc3Q6IFRUWS1uZXNzIGFuZCBjb25maWcgZG9uJ3QgY2hhbmdlIGFjcm9zcyBhIHByb2Nlc3MncyBsaWZldGltZSwgc28gZnJlZXppbmcgdGhlXG4gKiBjb2xvcnMgZGVjaXNpb24gYXQgY29uc3RydWN0aW9uIHRpbWUgbWF0Y2hlcyByZWFsIHByb2Nlc3MgbGlmZWN5Y2xlcy5cbiAqXG4gKiBOT1RFOiBhZGRpbmcgYSBuZXcgZm9ybWF0IHRva2VuIHJlcXVpcmVzIGFkZGluZyBpdCBib3RoIHRvIHtAbGluayBMT0dfRk9STUFUX1JFR0VYfSBhbmQgdG8gdGhlXG4gKiB0b2tlbi1nYXRpbmcgY2hlY2tzIGluIHtAbGluayBmb3JtYXRMb2dPdXRwdXR9IGJlbG93LlxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlRm9ybWF0Q29udGV4dCA9IChvcHRpb25zOiBPcHRpb25zKTogRm9ybWF0Q29udGV4dCA9PiB7XG4gIGNvbnN0IHsgY29uZmlnIH0gPSBvcHRpb25zXG4gIGNvbnN0IHVzZUNvbG9ycyA9IHNob3VsZFVzZUNvbG9ycyhvcHRpb25zKVxuICBjb25zdCBmb3JtYXQgPSBjb25maWc/LmN1c3RvbUxvZ0Zvcm1hdCA/PyBERUZBVUxUX0xPR19GT1JNQVRcbiAgY29uc3QgdG9rZW5zID0gbmV3IFNldChmb3JtYXQubWF0Y2goTE9HX0ZPUk1BVF9SRUdFWCkpXG4gIGNvbnN0IHsgc2xvdzogc2xvd1RocmVzaG9sZCwgdmVyeVNsb3c6IHZlcnlTbG93VGhyZXNob2xkIH0gPVxuICAgIGdldFNsb3dUaHJlc2hvbGRzKG9wdGlvbnMpXG4gIGNvbnN0IHNlcnZpY2VUb2tlbiA9IGdldFNlcnZpY2VUb2tlbihvcHRpb25zLCB1c2VDb2xvcnMpXG5cbiAgcmV0dXJuIHtcbiAgICBmb3JtYXQsXG4gICAgc2VydmljZVRva2VuLFxuICAgIHNsb3dUaHJlc2hvbGQsXG4gICAgdG9rZW5zLFxuICAgIHVzZUNvbG9ycyxcbiAgICB2ZXJ5U2xvd1RocmVzaG9sZFxuICB9XG59XG5cbmNvbnN0IHN0cmluZ2lmeVRyZWVWYWx1ZSA9ICh2YWx1ZTogdW5rbm93bik6IHN0cmluZyA9PiB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiAnbnVsbCdcbiAgfVxuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiAndW5kZWZpbmVkJ1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHNhbml0aXplTG9nVGV4dCh2YWx1ZSlcbiAgfVxuICBpZiAoXG4gICAgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyB8fFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ2JpZ2ludCcgfHxcbiAgICB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJ1xuICApIHtcbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlKVxuICB9XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgcmV0dXJuIHNhbml0aXplTG9nVGV4dCh2YWx1ZS5tZXNzYWdlKVxuICB9XG4gIHJldHVybiBzYW5pdGl6ZUxvZ1RleHQodmFsdWUpXG59XG5cbi8qKiBOZXN0ZWQgb2JqZWN0cyB0byBleHBhbmQgaW4gdGhlIGNvbnRleHQgdHJlZSAoZXhjbHVkZXMgQXJyYXlzLCBFcnJvciwgRGF0ZSkuICovXG5jb25zdCBpc0V4cGFuZGFibGVPYmplY3QgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PlxuICB2YWx1ZSAhPT0gbnVsbCAmJlxuICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICFBcnJheS5pc0FycmF5KHZhbHVlKSAmJlxuICAhKHZhbHVlIGluc3RhbmNlb2YgRXJyb3IpICYmXG4gICEodmFsdWUgaW5zdGFuY2VvZiBEYXRlKVxuXG5jb25zdCBjb2xsZWN0Q29udGV4dEVudHJpZXMgPSAoXG4gIG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHByZWZpeDogc3RyaW5nLFxuICBkZXB0aFJlbWFpbmluZzogbnVtYmVyXG4pOiBbc3RyaW5nLCBzdHJpbmddW10gPT4ge1xuICBjb25zdCBvdXQ6IFtzdHJpbmcsIHN0cmluZ11bXSA9IFtdXG4gIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKG9iaikpIHtcbiAgICBjb25zdCBzYWZlS2V5ID0gc2FuaXRpemVMb2dUZXh0KGssIE1BWF9LRVlfTEVOR1RIKVxuICAgIGNvbnN0IGtleSA9IHByZWZpeCA/IGAke3ByZWZpeH0uJHtzYWZlS2V5fWAgOiBzYWZlS2V5XG4gICAgY29uc3QgZXhwYW5kYWJsZSA9IGlzRXhwYW5kYWJsZU9iamVjdCh2KSAmJiBkZXB0aFJlbWFpbmluZyA+IDFcblxuICAgIGlmIChleHBhbmRhYmxlKSB7XG4gICAgICBvdXQucHVzaCguLi5jb2xsZWN0Q29udGV4dEVudHJpZXModiwga2V5LCBkZXB0aFJlbWFpbmluZyAtIDEpKVxuICAgIH0gZWxzZSB7XG4gICAgICBvdXQucHVzaChba2V5LCBzdHJpbmdpZnlUcmVlVmFsdWUodildKVxuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0XG59XG5cbmNvbnN0IGZvcm1hdEVudHJpZXNUb1RyZWVMaW5lcyA9IChcbiAgZW50cmllczogW3N0cmluZywgc3RyaW5nXVtdLFxuICB1c2VDb2xvcnM6IGJvb2xlYW5cbik6IHN0cmluZ1tdID0+IHtcbiAgaWYgKGVudHJpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFtdXG4gIH1cblxuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXVxuICBjb25zdCBsYXN0ID0gZW50cmllcy5sZW5ndGggLSAxXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgIGNvbnN0IGJyYW5jaCA9IGkgPT09IGxhc3QgPyAn4pSU4pSAJyA6ICfilJzilIAnXG4gICAgY29uc3QgcGFpciA9IGVudHJpZXNbaV1cbiAgICBpZiAoIXBhaXIpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGNvbnN0IFtrLCB2XSA9IHBhaXJcbiAgICBjb25zdCBrZXlQYXJ0ID0gdXNlQ29sb3JzID8gY2hhbGsuY3lhbihrKSA6IGtcbiAgICBjb25zdCB2YWxQYXJ0ID0gdXNlQ29sb3JzID8gY2hhbGsud2hpdGUodikgOiB2XG4gICAgbGluZXMucHVzaChgICAke2JyYW5jaH0gJHtrZXlQYXJ0fSAgJHt2YWxQYXJ0fWApXG4gIH1cbiAgcmV0dXJuIGxpbmVzXG59XG5cbmNvbnN0IGNvbGxlY3RTdHJ1Y3R1cmVkRXJyb3JFbnRyaWVzID0gKGVycm9yOiB1bmtub3duKTogW3N0cmluZywgc3RyaW5nXVtdID0+IHtcbiAgY29uc3QgZW50cmllczogW3N0cmluZywgc3RyaW5nXVtdID0gW11cbiAgY29uc3QgbXNnID0gcGFyc2VFcnJvcihlcnJvcilcbiAgaWYgKG1zZykge1xuICAgIGVudHJpZXMucHVzaChbJ2Vycm9yJywgc2FuaXRpemVMb2dUZXh0KG1zZyldKVxuICB9XG4gIGlmIChpc1N0cnVjdHVyZWRFcnJvcihlcnJvcikpIHtcbiAgICBpZiAoZXJyb3IuY29kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBlbnRyaWVzLnB1c2goWydlcnJvci5jb2RlJywgc2FuaXRpemVMb2dUZXh0KGVycm9yLmNvZGUpXSlcbiAgICB9XG4gICAgaWYgKGVycm9yLndoeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBlbnRyaWVzLnB1c2goWydlcnJvci53aHknLCBzYW5pdGl6ZUxvZ1RleHQoZXJyb3Iud2h5KV0pXG4gICAgfVxuICAgIGlmIChlcnJvci5maXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgZW50cmllcy5wdXNoKFsnZXJyb3IuZml4Jywgc2FuaXRpemVMb2dUZXh0KGVycm9yLmZpeCldKVxuICAgIH1cbiAgICBpZiAoZXJyb3IubGluayAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBlbnRyaWVzLnB1c2goWydlcnJvci5saW5rJywgc2FuaXRpemVMb2dUZXh0KGVycm9yLmxpbmspXSlcbiAgICB9XG4gICAgaWYgKGVycm9yLmludGVybmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGVudHJpZXMucHVzaChbJ2Vycm9yLmludGVybmFsJywgc3RyaW5naWZ5VHJlZVZhbHVlKGVycm9yLmludGVybmFsKV0pXG4gICAgfVxuICB9XG4gIHJldHVybiBlbnRyaWVzXG59XG5cbmV4cG9ydCBjb25zdCBidWlsZENvbnRleHRUcmVlTGluZXMgPSAoXG4gIGxldmVsOiBMb2dMZXZlbCxcbiAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIG9wdGlvbnM6IE9wdGlvbnMsXG4gIHVzZUNvbG9yczogYm9vbGVhbiA9IHNob3VsZFVzZUNvbG9ycyhvcHRpb25zKVxuKTogc3RyaW5nW10gPT4ge1xuICBpZiAob3B0aW9ucy5jb25maWc/LnNob3dDb250ZXh0VHJlZSA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gW11cbiAgfVxuXG4gIGNvbnN0IGRlcHRoID0gb3B0aW9ucy5jb25maWc/LmNvbnRleHREZXB0aCA/PyAxXG5cbiAgY29uc3QgZW50cmllczogW3N0cmluZywgc3RyaW5nXVtdID0gW11cblxuICBjb25zdCBjdHggPSBkYXRhLmNvbnRleHRcbiAgaWYgKFxuICAgIGN0eCAmJlxuICAgIHR5cGVvZiBjdHggPT09ICdvYmplY3QnICYmXG4gICAgIUFycmF5LmlzQXJyYXkoY3R4KSAmJlxuICAgIE9iamVjdC5rZXlzKGN0eCBhcyBvYmplY3QpLmxlbmd0aCA+IDAgJiZcbiAgICBkZXB0aCA+PSAxXG4gICkge1xuICAgIGVudHJpZXMucHVzaChcbiAgICAgIC4uLmNvbGxlY3RDb250ZXh0RW50cmllcyhjdHggYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sICcnLCBkZXB0aClcbiAgICApXG4gIH1cblxuICAvLyBXQVJOSU5HIGFzIHdlbGwgYXMgRVJST1I6IGEgNHh4IGlzIGxvZ2dlZCBhdCBXQVJOSU5HLCBhbmQgaXRzXG4gIC8vIGB3aHlgL2BmaXhgL2BsaW5rYCBhcmUgZXhhY3RseSBhcyB3b3J0aCBzaG93aW5nIGFzIGEgNXh4J3MuXG4gIGlmICgobGV2ZWwgPT09ICdFUlJPUicgfHwgbGV2ZWwgPT09ICdXQVJOSU5HJykgJiYgZGF0YS5lcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZW50cmllcy5wdXNoKC4uLmNvbGxlY3RTdHJ1Y3R1cmVkRXJyb3JFbnRyaWVzKGRhdGEuZXJyb3IpKVxuICB9XG5cbiAgcmV0dXJuIGZvcm1hdEVudHJpZXNUb1RyZWVMaW5lcyhlbnRyaWVzLCB1c2VDb2xvcnMpXG59XG5cbmNvbnN0IGdldENvbnRleHRTdHJpbmcgPSAodmFsdWU6IHVua25vd24pOiBzdHJpbmcgPT4ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgIC8vIE5vIGxlbmd0aCBjYXAsIGFzIGJlZm9yZS4gVGhpcyBzdGlsbCBzdHJpcHMgdGhlIERFTCBhbmQgQzEgY2hhcmFjdGVyc1xuICAgIC8vIHRoYXQgYEpTT04uc3RyaW5naWZ5YCBsZWF2ZXMgaW4gcGxhY2UuXG4gICAgcmV0dXJuIHNhbml0aXplTG9nVGV4dCh2YWx1ZSwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKVxuICB9XG5cbiAgcmV0dXJuICcnXG59XG5cbi8qKiBSYXcgZHVyYXRpb24vVVJMIHBhcnRzIGNvbXB1dGVkIG9uY2UgcGVyIGxvZyBlbWlzc2lvbiBieSB0aGUgY2FsbGVyIChzZWUgYGxvZ2dlci9pbmRleC50c2ApLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcmVjb21wdXRlZExvZ1BhcnRzIHtcbiAgZHVyYXRpb25NczogbnVtYmVyXG4gIHBhdGhuYW1lOiBzdHJpbmdcbiAgc2VhcmNoOiBzdHJpbmdcbn1cblxuLyoqIGB7bm93fWAvYHtlcG9jaH1gIHNoYXJlIGEgc2luZ2xlIGBEYXRlYCBzYW1wbGU7IGVhY2ggaXMgb25seSBmb3JtYXR0ZWQgd2hlbiByZXF1ZXN0ZWQuICovXG5jb25zdCBnZXRUaW1lc3RhbXBUb2tlbnMgPSAoXG4gIHRva2VuczogU2V0PHN0cmluZz4sXG4gIHRyYW5zbGF0ZVRpbWU6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgdXNlQ29sb3JzOiBib29sZWFuXG4pOiB7IHRpbWVzdGFtcDogc3RyaW5nOyBlcG9jaDogc3RyaW5nIH0gPT4ge1xuICBpZiAoISh0b2tlbnMuaGFzKCd7bm93fScpIHx8IHRva2Vucy5oYXMoJ3tlcG9jaH0nKSkpIHtcbiAgICByZXR1cm4geyBlcG9jaDogJycsIHRpbWVzdGFtcDogJycgfVxuICB9XG4gIGNvbnN0IG5vdyA9IG5ldyBEYXRlKClcbiAgY29uc3QgZXBvY2ggPSB0b2tlbnMuaGFzKCd7ZXBvY2h9JykgPyBTdHJpbmcobm93LmdldFRpbWUoKSkgOiAnJ1xuICBpZiAoIXRva2Vucy5oYXMoJ3tub3d9JykpIHtcbiAgICByZXR1cm4geyBlcG9jaCwgdGltZXN0YW1wOiAnJyB9XG4gIH1cbiAgY29uc3QgcmF3VGltZXN0YW1wID0gZm9ybWF0VGltZXN0YW1wKG5vdywgdHJhbnNsYXRlVGltZSlcbiAgcmV0dXJuIHsgZXBvY2gsIHRpbWVzdGFtcDogZ2V0Q29sb3JlZFRpbWVzdGFtcChyYXdUaW1lc3RhbXAsIHVzZUNvbG9ycykgfVxufVxuXG5jb25zdCBnZXRNZXNzYWdlVG9rZW4gPSAoXG4gIHRva2VuczogU2V0PHN0cmluZz4sXG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4pOiBzdHJpbmcgPT4ge1xuICBpZiAoIXRva2Vucy5oYXMoJ3ttZXNzYWdlfScpKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cbiAgcmV0dXJuIHR5cGVvZiBkYXRhLm1lc3NhZ2UgPT09ICdzdHJpbmcnID8gc2FuaXRpemVMb2dUZXh0KGRhdGEubWVzc2FnZSkgOiAnJ1xufVxuXG4vKiogYHtwYXRobmFtZX1gL2B7cGF0aH1gL2B7cXVlcnl9YCBzaGFyZSBhIHNpbmdsZSBVUkwgcGFyc2UgKG9yIHRoZSBwcmVjb21wdXRlZCBvbmUpLiAqL1xuY29uc3QgZ2V0UGF0aG5hbWVUb2tlbnMgPSAoXG4gIHRva2VuczogU2V0PHN0cmluZz4sXG4gIHJlcXVlc3Q6IFJlcXVlc3RJbmZvLFxuICBjb25maWc6IE9wdGlvbnNbJ2NvbmZpZyddLFxuICB1c2VDb2xvcnM6IGJvb2xlYW4sXG4gIHByZWNvbXB1dGVkPzogUHJlY29tcHV0ZWRMb2dQYXJ0c1xuKTogeyBjb2xvcmVkUGF0aG5hbWU6IHN0cmluZzsgcXVlcnk6IHN0cmluZyB9ID0+IHtcbiAgY29uc3QgbmVlZHNQYXRobmFtZSA9IHRva2Vucy5oYXMoJ3twYXRobmFtZX0nKSB8fCB0b2tlbnMuaGFzKCd7cGF0aH0nKVxuICBjb25zdCBuZWVkc1F1ZXJ5ID0gdG9rZW5zLmhhcygne3F1ZXJ5fScpXG4gIGlmICghKG5lZWRzUGF0aG5hbWUgfHwgbmVlZHNRdWVyeSkpIHtcbiAgICByZXR1cm4geyBjb2xvcmVkUGF0aG5hbWU6ICcnLCBxdWVyeTogJycgfVxuICB9XG5cbiAgbGV0IHJhd1BhdGhuYW1lOiBzdHJpbmdcbiAgbGV0IHNlYXJjaDogc3RyaW5nXG4gIGlmIChwcmVjb21wdXRlZCkge1xuICAgIDsoeyBwYXRobmFtZTogcmF3UGF0aG5hbWUsIHNlYXJjaCB9ID0gcHJlY29tcHV0ZWQpXG4gIH0gZWxzZSB7XG4gICAgdHJ5IHtcbiAgICAgIDsoeyBwYXRobmFtZTogcmF3UGF0aG5hbWUsIHNlYXJjaCB9ID0gbmV3IFVSTChyZXF1ZXN0LnVybCkpXG4gICAgfSBjYXRjaCB7XG4gICAgICByYXdQYXRobmFtZSA9IHNhbml0aXplTG9nVGV4dChyZXF1ZXN0LnVybCB8fCAnLycsIDEwMjQpXG4gICAgICBzZWFyY2ggPSAnJ1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHF1ZXJ5ID0gbmVlZHNRdWVyeSA/IHNlYXJjaCA6ICcnXG4gIGlmICghbmVlZHNQYXRobmFtZSkge1xuICAgIHJldHVybiB7IGNvbG9yZWRQYXRobmFtZTogJycsIHF1ZXJ5IH1cbiAgfVxuICBjb25zdCBwYXRobmFtZSA9IGNvbmZpZz8ubG9nUXVlcnlQYXJhbXNcbiAgICA/IGAke3Jhd1BhdGhuYW1lfSR7c2VhcmNofWBcbiAgICA6IHJhd1BhdGhuYW1lXG4gIHJldHVybiB7IGNvbG9yZWRQYXRobmFtZTogZ2V0Q29sb3JlZFBhdGhuYW1lKHBhdGhuYW1lLCB1c2VDb2xvcnMpLCBxdWVyeSB9XG59XG5cbi8qKiBge3N0YXR1c31gL2B7c3RhdHVzVGV4dH1gIHNoYXJlIGEgc2luZ2xlIHN0YXR1cy1jb2RlIHJlc29sdXRpb24uICovXG5jb25zdCBnZXRTdGF0dXNUb2tlbnMgPSAoXG4gIHRva2VuczogU2V0PHN0cmluZz4sXG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICB1c2VDb2xvcnM6IGJvb2xlYW5cbik6IHsgY29sb3JlZFN0YXR1czogc3RyaW5nOyBzdGF0dXNUZXh0OiBzdHJpbmcgfSA9PiB7XG4gIGNvbnN0IG5lZWRzU3RhdHVzID0gdG9rZW5zLmhhcygne3N0YXR1c30nKVxuICBjb25zdCBuZWVkc1N0YXR1c1RleHQgPSB0b2tlbnMuaGFzKCd7c3RhdHVzVGV4dH0nKVxuICBpZiAoIShuZWVkc1N0YXR1cyB8fCBuZWVkc1N0YXR1c1RleHQpKSB7XG4gICAgcmV0dXJuIHsgY29sb3JlZFN0YXR1czogJycsIHN0YXR1c1RleHQ6ICcnIH1cbiAgfVxuICBjb25zdCBzdGF0dXNWYWx1ZSA9IGRhdGEuc3RhdHVzXG4gIGNvbnN0IHN0YXR1c0NvZGUgPVxuICAgIHN0YXR1c1ZhbHVlID09PSBudWxsIHx8IHN0YXR1c1ZhbHVlID09PSB1bmRlZmluZWRcbiAgICAgID8gMjAwXG4gICAgICA6IGdldFN0YXR1c0NvZGUoc3RhdHVzVmFsdWUpXG4gIHJldHVybiB7XG4gICAgY29sb3JlZFN0YXR1czogbmVlZHNTdGF0dXMgPyBnZXRDb2xvcmVkU3RhdHVzKHN0YXR1c0NvZGUsIHVzZUNvbG9ycykgOiAnJyxcbiAgICBzdGF0dXNUZXh0OiBuZWVkc1N0YXR1c1RleHQgPyBnZXRTdGF0dXNUZXh0KHN0YXR1c0NvZGUpIDogJydcbiAgfVxufVxuXG5jb25zdCBnZXRJcFRva2VuID0gKFxuICB0b2tlbnM6IFNldDxzdHJpbmc+LFxuICByZXF1ZXN0OiBSZXF1ZXN0SW5mbyxcbiAgY29uZmlnOiBPcHRpb25zWydjb25maWcnXVxuKTogc3RyaW5nID0+IChjb25maWc/LmlwID09PSB0cnVlICYmIHRva2Vucy5oYXMoJ3tpcH0nKSA/IGdldElwKHJlcXVlc3QpIDogJycpXG5cbmNvbnN0IGhhc05vbkVtcHR5Q29udGV4dCA9IChcbiAgY29udGV4dDogdW5rbm93blxuKTogY29udGV4dCBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PlxuICBjb250ZXh0ICE9PSBudWxsICYmXG4gIGNvbnRleHQgIT09IHVuZGVmaW5lZCAmJlxuICB0eXBlb2YgY29udGV4dCA9PT0gJ29iamVjdCcgJiZcbiAgIUFycmF5LmlzQXJyYXkoY29udGV4dCkgJiZcbiAgT2JqZWN0LmtleXMoY29udGV4dCBhcyBvYmplY3QpLmxlbmd0aCA+IDBcblxuY29uc3QgZ2V0Q29udGV4dFRva2VuID0gKFxuICB0b2tlbnM6IFNldDxzdHJpbmc+LFxuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgY29uZmlnOiBPcHRpb25zWydjb25maWcnXVxuKTogc3RyaW5nID0+IHtcbiAgaWYgKCF0b2tlbnMuaGFzKCd7Y29udGV4dH0nKSkge1xuICAgIHJldHVybiAnJ1xuICB9XG4gIGNvbnN0IHNob3dUcmVlID0gY29uZmlnPy5zaG93Q29udGV4dFRyZWUgIT09IGZhbHNlXG4gIGlmIChzaG93VHJlZSAmJiBoYXNOb25FbXB0eUNvbnRleHQoZGF0YS5jb250ZXh0KSkge1xuICAgIHJldHVybiAnJ1xuICB9XG4gIHJldHVybiBnZXRDb250ZXh0U3RyaW5nKGRhdGEuY29udGV4dClcbn1cblxuLyoqIGB7ZHVyYXRpb259YC9ge3NwZWVkfWAgc2hhcmUgYSBzaW5nbGUgZHVyYXRpb24gc2FtcGxlIGFuZCBzbG93LXRocmVzaG9sZCBjaGVjay4gKi9cbmNvbnN0IGdldER1cmF0aW9uVG9rZW5zID0gKFxuICB0b2tlbnM6IFNldDxzdHJpbmc+LFxuICBzdG9yZTogU3RvcmVEYXRhLFxuICB1c2VDb2xvcnM6IGJvb2xlYW4sXG4gIHNsb3dUaHJlc2hvbGQ6IG51bWJlcixcbiAgdmVyeVNsb3dUaHJlc2hvbGQ6IG51bWJlcixcbiAgcHJlY29tcHV0ZWQ/OiBQcmVjb21wdXRlZExvZ1BhcnRzXG4pOiB7IGNvbG9yZWREdXJhdGlvbjogc3RyaW5nOyBzcGVlZFRva2VuOiBzdHJpbmcgfSA9PiB7XG4gIGNvbnN0IG5lZWRzRHVyYXRpb24gPSB0b2tlbnMuaGFzKCd7ZHVyYXRpb259JylcbiAgY29uc3QgbmVlZHNTcGVlZCA9IHRva2Vucy5oYXMoJ3tzcGVlZH0nKVxuICBpZiAoIShuZWVkc0R1cmF0aW9uIHx8IG5lZWRzU3BlZWQpKSB7XG4gICAgcmV0dXJuIHsgY29sb3JlZER1cmF0aW9uOiAnJywgc3BlZWRUb2tlbjogJycgfVxuICB9XG4gIGNvbnN0IGR1cmF0aW9uTXMgPSBwcmVjb21wdXRlZD8uZHVyYXRpb25NcyA/PyBlbGFwc2VkTXMoc3RvcmUuYmVmb3JlVGltZSlcbiAgY29uc3QgeyB0ZXh0LCBpc1ZlcnlTbG93IH0gPSBjb2xvckR1cmF0aW9uVGV4dChcbiAgICBkdXJhdGlvbk1zLFxuICAgIHVzZUNvbG9ycyxcbiAgICBzbG93VGhyZXNob2xkLFxuICAgIHZlcnlTbG93VGhyZXNob2xkXG4gIClcbiAgcmV0dXJuIHtcbiAgICBjb2xvcmVkRHVyYXRpb246IG5lZWRzRHVyYXRpb24gPyB0ZXh0IDogJycsXG4gICAgc3BlZWRUb2tlbjogbmVlZHNTcGVlZCA/IGdldFNwZWVkVG9rZW4oaXNWZXJ5U2xvdywgdXNlQ29sb3JzKSA6ICcnXG4gIH1cbn1cblxuY29uc3QgZ2V0UmVxdWVzdElkVG9rZW4gPSAoXG4gIHRva2VuczogU2V0PHN0cmluZz4sXG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4pOiBzdHJpbmcgPT4ge1xuICBpZiAoIXRva2Vucy5oYXMoJ3tyZXF1ZXN0SWR9JykpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuICBjb25zdCBjdHggPSBkYXRhLmNvbnRleHRcbiAgaWYgKHR5cGVvZiBjdHggIT09ICdvYmplY3QnIHx8IGN0eCA9PT0gbnVsbCB8fCAhKCdyZXF1ZXN0SWQnIGluIGN0eCkpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuICByZXR1cm4gc2FuaXRpemVMb2dUZXh0KFxuICAgIFN0cmluZygoY3R4IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KS5yZXF1ZXN0SWQpLFxuICAgIDEyOFxuICApXG59XG5cbmV4cG9ydCBjb25zdCBmb3JtYXRMb2dPdXRwdXQgPSAoe1xuICBsZXZlbCxcbiAgcmVxdWVzdCxcbiAgZGF0YSxcbiAgc3RvcmUsXG4gIG9wdGlvbnMsXG4gIGZvcm1hdENvbnRleHQsXG4gIHByZWNvbXB1dGVkXG59OiB7XG4gIGxldmVsOiBMb2dMZXZlbFxuICByZXF1ZXN0OiBSZXF1ZXN0SW5mb1xuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICBzdG9yZTogU3RvcmVEYXRhXG4gIG9wdGlvbnM6IE9wdGlvbnNcbiAgLyoqIEhvaXN0ZWQgcGVyLWxvZ2dlciBjb25zdGFudHM7IGNvbXB1dGVkIG9uIHRoZSBmbHkgd2hlbiBhIGRpcmVjdCBjYWxsZXIgb21pdHMgaXQuICovXG4gIGZvcm1hdENvbnRleHQ/OiBGb3JtYXRDb250ZXh0XG4gIC8qKiBEdXJhdGlvbi9VUkwgcGFydHMgYWxyZWFkeSBjb21wdXRlZCBieSB0aGUgY2FsbGVyOyBwYXJzZWQgb24gdGhlIGZseSB3aGVuIG9taXR0ZWQuICovXG4gIHByZWNvbXB1dGVkPzogUHJlY29tcHV0ZWRMb2dQYXJ0c1xufSk6IEZvcm1hdHRlZExvZ091dHB1dCA9PiB7XG4gIGNvbnN0IHsgY29uZmlnIH0gPSBvcHRpb25zXG4gIGNvbnN0IHtcbiAgICBmb3JtYXQsXG4gICAgc2VydmljZVRva2VuLFxuICAgIHNsb3dUaHJlc2hvbGQsXG4gICAgdG9rZW5zLFxuICAgIHVzZUNvbG9ycyxcbiAgICB2ZXJ5U2xvd1RocmVzaG9sZFxuICB9ID0gZm9ybWF0Q29udGV4dCA/PyBjcmVhdGVGb3JtYXRDb250ZXh0KG9wdGlvbnMpXG5cbiAgY29uc3QgeyB0aW1lc3RhbXAsIGVwb2NoIH0gPSBnZXRUaW1lc3RhbXBUb2tlbnMoXG4gICAgdG9rZW5zLFxuICAgIGNvbmZpZz8udGltZXN0YW1wPy50cmFuc2xhdGVUaW1lLFxuICAgIHVzZUNvbG9yc1xuICApXG4gIGNvbnN0IG1lc3NhZ2UgPSBnZXRNZXNzYWdlVG9rZW4odG9rZW5zLCBkYXRhKVxuICBjb25zdCB7IGNvbG9yZWRQYXRobmFtZSwgcXVlcnkgfSA9IGdldFBhdGhuYW1lVG9rZW5zKFxuICAgIHRva2VucyxcbiAgICByZXF1ZXN0LFxuICAgIGNvbmZpZyxcbiAgICB1c2VDb2xvcnMsXG4gICAgcHJlY29tcHV0ZWRcbiAgKVxuICBjb25zdCB7IGNvbG9yZWRTdGF0dXMsIHN0YXR1c1RleHQgfSA9IGdldFN0YXR1c1Rva2Vucyh0b2tlbnMsIGRhdGEsIHVzZUNvbG9ycylcbiAgY29uc3QgaXAgPSBnZXRJcFRva2VuKHRva2VucywgcmVxdWVzdCwgY29uZmlnKVxuICBjb25zdCBjdHhTdHJpbmcgPSBnZXRDb250ZXh0VG9rZW4odG9rZW5zLCBkYXRhLCBjb25maWcpXG4gIGNvbnN0IGNvbG9yZWRMZXZlbCA9IHRva2Vucy5oYXMoJ3tsZXZlbH0nKVxuICAgID8gZ2V0Q29sb3JlZExldmVsKGxldmVsLCB1c2VDb2xvcnMpXG4gICAgOiAnJ1xuICBjb25zdCBjb2xvcmVkTWV0aG9kID0gdG9rZW5zLmhhcygne21ldGhvZH0nKVxuICAgID8gZ2V0Q29sb3JlZE1ldGhvZFRva2VuKHJlcXVlc3QubWV0aG9kLCB1c2VDb2xvcnMpXG4gICAgOiAnJ1xuICBjb25zdCB7IGNvbG9yZWREdXJhdGlvbiwgc3BlZWRUb2tlbiB9ID0gZ2V0RHVyYXRpb25Ub2tlbnMoXG4gICAgdG9rZW5zLFxuICAgIHN0b3JlLFxuICAgIHVzZUNvbG9ycyxcbiAgICBzbG93VGhyZXNob2xkLFxuICAgIHZlcnlTbG93VGhyZXNob2xkLFxuICAgIHByZWNvbXB1dGVkXG4gIClcbiAgY29uc3QgaWNvbiA9IHRva2Vucy5oYXMoJ3tpY29ufScpID8gZ2V0TGV2ZWxJY29uKGxldmVsLCB1c2VDb2xvcnMpIDogJydcbiAgY29uc3QgcmVxdWVzdElkID0gZ2V0UmVxdWVzdElkVG9rZW4odG9rZW5zLCBkYXRhKVxuXG4gIGNvbnN0IHRva2VuTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICd7Y29udGV4dH0nOiBjdHhTdHJpbmcsXG4gICAgJ3tkdXJhdGlvbn0nOiBjb2xvcmVkRHVyYXRpb24sXG4gICAgJ3tlcG9jaH0nOiBlcG9jaCxcbiAgICAne2ljb259JzogaWNvbixcbiAgICAne2lwfSc6IGlwLFxuICAgICd7bGV2ZWx9JzogY29sb3JlZExldmVsLFxuICAgICd7bWVzc2FnZX0nOiBtZXNzYWdlLFxuICAgICd7bWV0aG9kfSc6IGNvbG9yZWRNZXRob2QsXG4gICAgJ3tub3d9JzogdGltZXN0YW1wLFxuICAgICd7cGF0aG5hbWV9JzogY29sb3JlZFBhdGhuYW1lLFxuICAgICd7cGF0aH0nOiBjb2xvcmVkUGF0aG5hbWUsXG4gICAgJ3txdWVyeX0nOiBxdWVyeSxcbiAgICAne3JlcXVlc3RJZH0nOiByZXF1ZXN0SWQsXG4gICAgJ3tzZXJ2aWNlfSc6IHNlcnZpY2VUb2tlbixcbiAgICAne3NwZWVkfSc6IHNwZWVkVG9rZW4sXG4gICAgJ3tzdGF0dXNUZXh0fSc6IHN0YXR1c1RleHQsXG4gICAgJ3tzdGF0dXN9JzogY29sb3JlZFN0YXR1c1xuICB9XG5cbiAgY29uc3QgbWFpbiA9IGZvcm1hdC5yZXBsYWNlKFxuICAgIExPR19GT1JNQVRfUkVHRVgsXG4gICAgbWF0Y2ggPT4gdG9rZW5NYXBbbWF0Y2hdID8/IG1hdGNoXG4gIClcblxuICBjb25zdCBjb250ZXh0TGluZXMgPSBidWlsZENvbnRleHRUcmVlTGluZXMobGV2ZWwsIGRhdGEsIG9wdGlvbnMsIHVzZUNvbG9ycylcblxuICByZXR1cm4geyBjb250ZXh0TGluZXMsIG1haW4gfVxufVxuIiwKICAgICJpbXBvcnQgeyBTVEFUVVNfQ09ERVMgfSBmcm9tICdub2RlOmh0dHAnXG5pbXBvcnQgeyBpc1N0YXR1c1Jlc3BvbnNlIH0gZnJvbSAnLi4vaGVscGVycy9zdGF0dXMnXG5pbXBvcnQgeyB0b1RleHQgfSBmcm9tICcuL3Nhbml0aXplJ1xuXG4vLyBFbHlzaWEgY29waWVzIGEgYHN0YXR1cyhjb2RlLCBib2R5KWAgYm9keSBpbnRvIGBlcnJvci5tZXNzYWdlYCwgc28gYSBtZXNzYWdlXG4vLyBpcyBub3QgYWx3YXlzIGEgc3RyaW5nLlxuZXhwb3J0IGNvbnN0IHBhcnNlRXJyb3IgPSAoZXJyb3I6IHVua25vd24pOiBzdHJpbmcgPT4ge1xuICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIHJldHVybiB0b1RleHQoZXJyb3IubWVzc2FnZSlcbiAgfVxuICBpZiAoZXJyb3IgJiYgdHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiAnbWVzc2FnZScgaW4gZXJyb3IpIHtcbiAgICByZXR1cm4gdG9UZXh0KGVycm9yLm1lc3NhZ2UpXG4gIH1cbiAgcmV0dXJuIFN0cmluZyhlcnJvcilcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdHJ1Y3R1cmVkRXJyb3Ige1xuICBjb2RlPzogc3RyaW5nXG4gIGZpeD86IHN0cmluZ1xuICBpbnRlcm5hbD86IHVua25vd25cbiAgbGluaz86IHN0cmluZ1xuICB3aHk/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGNvbnN0IGlzU3RydWN0dXJlZEVycm9yID0gKFxuICB2YWx1ZTogdW5rbm93blxuKTogdmFsdWUgaXMgU3RydWN0dXJlZEVycm9yICYgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT5cbiAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAoJ3doeScgaW4gdmFsdWUgfHxcbiAgICAnZml4JyBpbiB2YWx1ZSB8fFxuICAgICdsaW5rJyBpbiB2YWx1ZSB8fFxuICAgICdjb2RlJyBpbiB2YWx1ZSB8fFxuICAgICdpbnRlcm5hbCcgaW4gdmFsdWUpXG5cbmV4cG9ydCBpbnRlcmZhY2UgTm9ybWFsaXplZExvZ2dlZEVycm9yIHtcbiAgLyoqIFNhZmUgc3RydWN0dXJlZCByZXByZXNlbnRhdGlvbiBmb3IgZGF0YS90cmFuc3BvcnQgbWV0YS4gKi9cbiAgZXJyb3I6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gIC8qKiBTYWZlIG9uZS1saW5lIG1lc3NhZ2UgZm9yIHRoZSBsb2cgbGluZS4gKi9cbiAgbWVzc2FnZTogc3RyaW5nXG59XG5cbmNvbnN0IGlzVmFsaWRhdGlvbkVycm9yTGlrZSA9IChcbiAgdmFsdWU6IHVua25vd25cbik6IHZhbHVlIGlzIEVycm9yICYgeyBhbGw/OiB1bmtub3duW107IHN0YXR1cz86IG51bWJlcjsgdHlwZT86IHN0cmluZyB9ID0+XG4gIHZhbHVlIGluc3RhbmNlb2YgRXJyb3IgJiZcbiAgLy8gYGNvZGVgIGlzIEVseXNpYSdzIG1pbmlmaWNhdGlvbi1zYWZlIGRpc2NyaW1pbmFudCDigJQgYC5uYW1lYCBhbmRcbiAgLy8gYC5jb25zdHJ1Y3Rvci5uYW1lYCBib3RoIGRlZ3JhZGUgdG8gYSBtYW5nbGVkIHN0cmluZyB1bmRlciBidW5kbGVyXG4gIC8vIG1pbmlmaWNhdGlvbiAoZS5nLiBgYnVuIGJ1aWxkIC0tbWluaWZ5YCwgZXNidWlsZCksIHNvIGBjb2RlYCBtdXN0IGJlXG4gIC8vIGNoZWNrZWQgdG9vIG9yIHZhbGlkYXRpb24gYm9kaWVzIHNpbGVudGx5IHJlLWxlYWsgaW4gdGhhdCBidWlsZCBtb2RlLlxuICAoKHZhbHVlIGFzIHsgY29kZT86IHVua25vd24gfSkuY29kZSA9PT0gJ1ZBTElEQVRJT04nIHx8XG4gICAgdmFsdWUubmFtZSA9PT0gJ1ZhbGlkYXRpb25FcnJvcicgfHxcbiAgICB2YWx1ZS5jb25zdHJ1Y3Rvcj8ubmFtZSA9PT0gJ1ZhbGlkYXRpb25FcnJvcicpXG5cbmNvbnN0IFNUUlVDVFVSRURfRVJST1JfS0VZUyA9IFtcbiAgJ2NvZGUnLFxuICAnZml4JyxcbiAgJ2ludGVybmFsJyxcbiAgJ2xpbmsnLFxuICAnbWVzc2FnZScsXG4gICduYW1lJyxcbiAgJ3N0YXR1cycsXG4gICd3aHknXG5dIGFzIGNvbnN0XG5cbmNvbnN0IGNvcHlTdHJ1Y3R1cmVkRXJyb3JGaWVsZHMgPSAoXG4gIHJlY29yZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+IHtcbiAgY29uc3Qgc2FmZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fVxuICBmb3IgKGNvbnN0IGtleSBvZiBTVFJVQ1RVUkVEX0VSUk9SX0tFWVMpIHtcbiAgICBpZiAocmVjb3JkW2tleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgc2FmZVtrZXldID0gcmVjb3JkW2tleV1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHNhZmVcbn1cblxuZXhwb3J0IGNvbnN0IG5vcm1hbGl6ZUxvZ2dlZEVycm9yID0gKFxuICBlcnJvcjogdW5rbm93bixcbiAgbG9nRXJyb3JQYXlsb2FkOiBib29sZWFuXG4pOiBOb3JtYWxpemVkTG9nZ2VkRXJyb3IgPT4ge1xuICBpZiAoaXNTdGF0dXNSZXNwb25zZShlcnJvcikpIHtcbiAgICAvLyBBIHN0cmluZyBib2R5IGJlY29tZXMgdGhlIG1lc3NhZ2UuIEFueSBvdGhlciBib2R5IGlzIHRoZSBhcHAncyByZXNwb25zZVxuICAgIC8vIHBheWxvYWQgYW5kIG1heSBjYXJyeSB1c2VyIGRhdGEsIHNvIHRoZSBzdGF0dXMgdGV4dCBzdGFuZHMgaW4gZm9yIGl0LlxuICAgIGNvbnN0IG1lc3NhZ2UgPVxuICAgICAgdHlwZW9mIGVycm9yLnJlc3BvbnNlID09PSAnc3RyaW5nJyAmJiBlcnJvci5yZXNwb25zZSAhPT0gJydcbiAgICAgICAgPyBlcnJvci5yZXNwb25zZVxuICAgICAgICA6IChTVEFUVVNfQ09ERVNbZXJyb3IuY29kZV0gPz8gYEhUVFAgJHtlcnJvci5jb2RlfWApXG4gICAgcmV0dXJuIHtcbiAgICAgIGVycm9yOiB7IG1lc3NhZ2UsIG5hbWU6ICdTdGF0dXNSZXNwb25zZScsIHN0YXR1czogZXJyb3IuY29kZSB9LFxuICAgICAgbWVzc2FnZVxuICAgIH1cbiAgfVxuXG4gIGlmIChpc1ZhbGlkYXRpb25FcnJvckxpa2UoZXJyb3IpICYmICFsb2dFcnJvclBheWxvYWQpIHtcbiAgICBjb25zdCBmYWlsdXJlcyA9IEFycmF5LmlzQXJyYXkoZXJyb3IuYWxsKSA/IGVycm9yLmFsbCA6IFtdXG4gICAgY29uc3QgcGF0aHMgPSBmYWlsdXJlc1xuICAgICAgLm1hcChmYWlsdXJlID0+XG4gICAgICAgIHR5cGVvZiBmYWlsdXJlID09PSAnb2JqZWN0JyAmJiBmYWlsdXJlICE9PSBudWxsICYmICdwYXRoJyBpbiBmYWlsdXJlXG4gICAgICAgICAgPyBTdHJpbmcoKGZhaWx1cmUgYXMgeyBwYXRoOiB1bmtub3duIH0pLnBhdGgpXG4gICAgICAgICAgOiAnJ1xuICAgICAgKVxuICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgIGNvbnN0IHNjb3BlID0gdHlwZW9mIGVycm9yLnR5cGUgPT09ICdzdHJpbmcnID8gZXJyb3IudHlwZSA6ICdyZXF1ZXN0J1xuICAgIGNvbnN0IG1lc3NhZ2UgPVxuICAgICAgcGF0aHMubGVuZ3RoID4gMFxuICAgICAgICA/IGBWYWxpZGF0aW9uIGZhaWxlZCAoJHtzY29wZX0pOiAke3BhdGhzLmpvaW4oJywgJyl9YFxuICAgICAgICA6IGBWYWxpZGF0aW9uIGZhaWxlZCAoJHtzY29wZX0pYFxuICAgIHJldHVybiB7XG4gICAgICBlcnJvcjogeyBmYWlsZWRQYXRoczogcGF0aHMsIG5hbWU6ICdWYWxpZGF0aW9uRXJyb3InLCB0eXBlOiBzY29wZSB9LFxuICAgICAgbWVzc2FnZVxuICAgIH1cbiAgfVxuXG4gIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgY29uc3Qgc2FmZSA9IGNvcHlTdHJ1Y3R1cmVkRXJyb3JGaWVsZHMoXG4gICAgICBlcnJvciBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgKVxuICAgIHNhZmUubWVzc2FnZSA9IGVycm9yLm1lc3NhZ2VcbiAgICAvLyBOYXRpdmUgc3ViY2xhc3NlcyAoZS5nLiBgY2xhc3MgSHR0cEVycm9yIGV4dGVuZHMgRXJyb3JgKSBkb24ndCBzZXRcbiAgICAvLyBgLm5hbWVgIHVubGVzcyB0aGUgYXV0aG9yIG92ZXJyaWRlcyBpdCwgc28gaXQgcmVhZHMgYmFjayBhcyB0aGVcbiAgICAvLyBnZW5lcmljIFwiRXJyb3JcIi4gUHJlZmVyIHRoZSBjb25zdHJ1Y3RvciBuYW1lIGluIHRoYXQgY2FzZS5cbiAgICBzYWZlLm5hbWUgPVxuICAgICAgZXJyb3IubmFtZSA9PT0gJ0Vycm9yJ1xuICAgICAgICA/IChlcnJvci5jb25zdHJ1Y3Rvcj8ubmFtZSA/PyBlcnJvci5uYW1lKVxuICAgICAgICA6IGVycm9yLm5hbWVcbiAgICByZXR1cm4geyBlcnJvcjogc2FmZSwgbWVzc2FnZTogcGFyc2VFcnJvcihlcnJvcikgfVxuICB9XG5cbiAgaWYgKGlzU3RydWN0dXJlZEVycm9yKGVycm9yKSkge1xuICAgIHJldHVybiB7XG4gICAgICBlcnJvcjogY29weVN0cnVjdHVyZWRFcnJvckZpZWxkcyhlcnJvciBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiksXG4gICAgICBtZXNzYWdlOiBwYXJzZUVycm9yKGVycm9yKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IGVycm9yOiB7IHZhbHVlOiBTdHJpbmcoZXJyb3IpIH0sIG1lc3NhZ2U6IHBhcnNlRXJyb3IoZXJyb3IpIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUge1xuICBMb2dMZXZlbCxcbiAgT3B0aW9ucyxcbiAgUmVxdWVzdEluZm8sXG4gIFNpbmtFcnJvckNvbnRleHQsXG4gIFN0b3JlRGF0YVxufSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgZWxhcHNlZE1zIH0gZnJvbSAnLi4vdXRpbHMvZHVyYXRpb24nXG5pbXBvcnQgeyBjcmVhdGVFcnJvclJlcG9ydGVyIH0gZnJvbSAnLi4vdXRpbHMvcmVwb3J0J1xuXG5jb25zdCByZXBvcnRUcmFuc3BvcnRFcnJvciA9IGNyZWF0ZUVycm9yUmVwb3J0ZXIoXG4gICd0cmFuc3BvcnQnLFxuICAndHJhbnNwb3J0IGZhaWxlZCdcbilcblxuY29uc3QgTUFYX1RSQUNLRURfUEVORElORyA9IDEwMjRcbmNvbnN0IHBlbmRpbmdUcmFuc3BvcnRXb3JrID0gbmV3IFNldDxQcm9taXNlPHVua25vd24+PigpXG5cbi8qKlxuICogUmVtZW1iZXJzIGFuIGluLWZsaWdodCBgbG9nKClgIHByb21pc2Ugc28gc2h1dGRvd24gY2FuIHdhaXQgZm9yIGl0LCBhbmRcbiAqIHJlcG9ydHMgaXRzIHJlamVjdGlvbi4gVGhlIHNldCBpcyBib3VuZGVkOiB1bmRlciBzdXN0YWluZWQgbG9hZCB0aGUgb2xkZXN0XG4gKiBlbnRyeSBpcyBkcm9wcGVkIHJhdGhlciB0aGFuIGxldHRpbmcgYSBzbG93IHRyYW5zcG9ydCBncm93IGl0IHdpdGhvdXQgbGltaXQuXG4gKi9cbmNvbnN0IHdhdGNoID0gYXN5bmMgKFxuICBwZW5kaW5nOiBQcm9taXNlPHZvaWQ+LFxuICBvbkVycm9yOiAoKGNvbnRleHQ6IFNpbmtFcnJvckNvbnRleHQpID0+IHZvaWQpIHwgdW5kZWZpbmVkXG4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgaWYgKHBlbmRpbmdUcmFuc3BvcnRXb3JrLnNpemUgPj0gTUFYX1RSQUNLRURfUEVORElORykge1xuICAgIGNvbnN0IG9sZGVzdCA9IHBlbmRpbmdUcmFuc3BvcnRXb3JrLnZhbHVlcygpLm5leHQoKS52YWx1ZVxuICAgIGlmIChvbGRlc3QpIHtcbiAgICAgIHBlbmRpbmdUcmFuc3BvcnRXb3JrLmRlbGV0ZShvbGRlc3QpXG4gICAgfVxuICB9XG4gIHBlbmRpbmdUcmFuc3BvcnRXb3JrLmFkZChwZW5kaW5nKVxuICB0cnkge1xuICAgIGF3YWl0IHBlbmRpbmdcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXBvcnRUcmFuc3BvcnRFcnJvcihlcnJvciwgb25FcnJvcilcbiAgfSBmaW5hbGx5IHtcbiAgICBwZW5kaW5nVHJhbnNwb3J0V29yay5kZWxldGUocGVuZGluZylcbiAgfVxufVxuXG5pbnRlcmZhY2UgTG9nVG9UcmFuc3BvcnRzSW5wdXQge1xuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICBsZXZlbDogTG9nTGV2ZWxcbiAgb3B0aW9uczogT3B0aW9uc1xuICAvKiogRHVyYXRpb24gYWxyZWFkeSBjb21wdXRlZCBieSB0aGUgY2FsbGVyOyBzYW1wbGVkIG9uIHRoZSBmbHkgd2hlbiBvbWl0dGVkLiAqL1xuICBwcmVjb21wdXRlZD86IHsgZHVyYXRpb25NczogbnVtYmVyOyBwYXRobmFtZTogc3RyaW5nOyBzZWFyY2g6IHN0cmluZyB9XG4gIHJlcXVlc3Q6IFJlcXVlc3RJbmZvXG4gIHN0b3JlOiBTdG9yZURhdGFcbn1cblxuZXhwb3J0IGNvbnN0IGxvZ1RvVHJhbnNwb3J0cyA9IChpbnB1dDogTG9nVG9UcmFuc3BvcnRzSW5wdXQpOiB2b2lkID0+IHtcbiAgY29uc3QgeyBsZXZlbCwgcmVxdWVzdCwgZGF0YSwgc3RvcmUsIG9wdGlvbnMsIHByZWNvbXB1dGVkIH0gPSBpbnB1dFxuICBjb25zdCB0cmFuc3BvcnRzID0gb3B0aW9ucy5jb25maWc/LnRyYW5zcG9ydHMgPz8gW11cbiAgaWYgKHRyYW5zcG9ydHMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgY29uc3Qgb25FcnJvciA9IG9wdGlvbnMuY29uZmlnPy5vbkVycm9yXG5cbiAgY29uc3QgbWVzc2FnZSA9IHR5cGVvZiBkYXRhLm1lc3NhZ2UgPT09ICdzdHJpbmcnID8gZGF0YS5tZXNzYWdlIDogJydcbiAgY29uc3QgbWV0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG4gICAgcmVxdWVzdDoge1xuICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcbiAgICAgIHVybDogcmVxdWVzdC51cmxcbiAgICB9LFxuICAgIC4uLmRhdGEsXG4gICAgZHVyYXRpb25NczogcHJlY29tcHV0ZWQ/LmR1cmF0aW9uTXMgPz8gZWxhcHNlZE1zKHN0b3JlLmJlZm9yZVRpbWUpXG4gIH1cblxuICBmb3IgKGNvbnN0IHRyYW5zcG9ydCBvZiB0cmFuc3BvcnRzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRyYW5zcG9ydC5sb2cobGV2ZWwsIG1lc3NhZ2UsIG1ldGEpXG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIHdhdGNoKHJlc3VsdCwgb25FcnJvcilcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmVwb3J0VHJhbnNwb3J0RXJyb3IoZXJyb3IsIG9uRXJyb3IpXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUnVucyBvbmUgb3B0aW9uYWwgbGlmZWN5Y2xlIG1ldGhvZCBvbiBldmVyeSBjb25maWd1cmVkIHRyYW5zcG9ydC4gRmFpbHVyZXNcbiAqIGFyZSByZXBvcnRlZCBsaWtlIGBsb2coKWAgZmFpbHVyZXMgYW5kIG5ldmVyIHN0b3AgdGhlIG90aGVyIHRyYW5zcG9ydHMuXG4gKi9cbmNvbnN0IHJ1blRyYW5zcG9ydExpZmVjeWNsZSA9IChcbiAgb3B0aW9uczogT3B0aW9ucyxcbiAgbWV0aG9kOiAnY2xvc2UnIHwgJ2ZsdXNoJ1xuKTogUHJvbWlzZTx1bmtub3duPltdID0+IHtcbiAgY29uc3Qgb25FcnJvciA9IG9wdGlvbnMuY29uZmlnPy5vbkVycm9yXG4gIHJldHVybiAob3B0aW9ucy5jb25maWc/LnRyYW5zcG9ydHMgPz8gW10pLm1hcChhc3luYyB0cmFuc3BvcnQgPT4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBZaWVsZCBmaXJzdCBzbyB0aGUgbWV0aG9kIGlzIGNhbGxlZCBmcm9tIGEgbWljcm90YXNrLCBuZXZlciBpbmxpbmUuXG4gICAgICBhd2FpdCBQcm9taXNlLnJlc29sdmUoKVxuICAgICAgYXdhaXQgdHJhbnNwb3J0W21ldGhvZF0/LigpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJlcG9ydFRyYW5zcG9ydEVycm9yKGVycm9yLCBvbkVycm9yKVxuICAgIH1cbiAgfSlcbn1cblxuLyoqIFdhaXRzIGZvciBpbi1mbGlnaHQgYGxvZygpYCB3b3JrIGFuZCBldmVyeSB0cmFuc3BvcnQncyBvd24gYGZsdXNoKClgLiAqL1xuZXhwb3J0IGNvbnN0IGZsdXNoVHJhbnNwb3J0cyA9IGFzeW5jIChvcHRpb25zOiBPcHRpb25zKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbXG4gICAgLi4ucGVuZGluZ1RyYW5zcG9ydFdvcmssXG4gICAgLi4ucnVuVHJhbnNwb3J0TGlmZWN5Y2xlKG9wdGlvbnMsICdmbHVzaCcpXG4gIF0pXG59XG5cbi8qKiBSZWxlYXNlcyBlYWNoIHRyYW5zcG9ydCdzIHJlc291cmNlczsgb25seSByZWFjaGVkIHZpYSBgZmx1c2hMb2dpeGx5c2lhYC4gKi9cbmV4cG9ydCBjb25zdCBjbG9zZVRyYW5zcG9ydHMgPSBhc3luYyAob3B0aW9uczogT3B0aW9ucyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQocnVuVHJhbnNwb3J0TGlmZWN5Y2xlKG9wdGlvbnMsICdjbG9zZScpKVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IEZpbGVIYW5kbGUgfSBmcm9tICdub2RlOmZzL3Byb21pc2VzJ1xuaW1wb3J0IHsgb3BlbiB9IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnXG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnXG5pbXBvcnQgdHlwZSB7IExvZ1JvdGF0aW9uQ29uZmlnIH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcbmltcG9ydCB7IHBhcnNlSW50ZXJ2YWwsIHBhcnNlU2l6ZSB9IGZyb20gJy4uL3V0aWxzL3JvdGF0aW9uJ1xuaW1wb3J0IHsgc2V0dGxlIH0gZnJvbSAnLi4vdXRpbHMvc2V0dGxlJ1xuaW1wb3J0IHsgZW5zdXJlRGlyIH0gZnJvbSAnLi9mcydcbmltcG9ydCB7IHBlcmZvcm1Sb3RhdGlvbiB9IGZyb20gJy4vcm90YXRpb24tbWFuYWdlcidcblxuLyoqXG4gKiBUaGUgbGl2ZSBmaWxlJ3MgY3JlYXRpb24gdGltZSB3aGVuIHRoZSBmaWxlc3lzdGVtIHJlcG9ydHMgb25lO1xuICogc29tZSBmaWxlc3lzdGVtcyByZXBvcnQgMC9hYnNlbnQgYmlydGh0aW1lIOKAlCBmYWxsIGJhY2sgdG8gYG5vd2BcbiAqIChsb3NpbmcgcmVzdGFydC1zdXJ2aXZhbCBmb3IgdGhlIGludGVydmFsIGNsb2NrLCBidXQgbmV2ZXIgd3JvbmdcbiAqIGJ5IG1vcmUgdGhhbiB0aGUgcHJvY2VzcyBsaWZldGltZSkuXG4gKi9cbmV4cG9ydCBjb25zdCByZXNvbHZlT3BlbmVkQXQgPSAoXG4gIGJpcnRodGltZU1zOiBudW1iZXIgfCB1bmRlZmluZWQsXG4gIG5vdzogbnVtYmVyXG4pOiBudW1iZXIgPT4gKGJpcnRodGltZU1zICYmIGJpcnRodGltZU1zID4gMCA/IGJpcnRodGltZU1zIDogbm93KVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbGVTaW5rT3B0aW9ucyB7XG4gIGxvZ0Rpck1vZGU/OiBudW1iZXJcbiAgbG9nRmlsZU1vZGU/OiBudW1iZXJcbiAgbG9nUm90YXRpb24/OiBMb2dSb3RhdGlvbkNvbmZpZ1xuICAvKiogUmVwb3J0cyBhIHJvdGF0aW9uLXNpbmsgZmFpbHVyZTsgZmFsbHMgYmFjayB0byBhIHN0ZGVyciBsaW5lIHdoZW4gb21pdHRlZC4gKi9cbiAgb25Sb3RhdGlvbkVycm9yPzogKGVycm9yOiB1bmtub3duKSA9PiB2b2lkXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZVNpbmsge1xuICAvKiogRmx1c2hlcywgdGhlbiByZWxlYXNlcyB0aGUgZmlsZSBoYW5kbGUuIElkZW1wb3RlbnQuICovXG4gIGNsb3NlOiAoKSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKiBSZXNvbHZlcyBvbmNlIGV2ZXJ5IHdyaXRlIGlzc3VlZCBzbyBmYXIgaXMgZHVyYWJseSBvbiBkaXNrLiAqL1xuICBmbHVzaDogKCkgPT4gUHJvbWlzZTx2b2lkPlxuICAvKiogUmVzb2x2ZXMgYWZ0ZXIgYGxpbmVgIGlzIGR1cmFibHkgd3JpdHRlbiB0byBkaXNrLiAqL1xuICB3cml0ZTogKGxpbmU6IHN0cmluZywgb3B0aW9uczogRmlsZVNpbmtPcHRpb25zKSA9PiBQcm9taXNlPHZvaWQ+XG59XG5cbmludGVyZmFjZSBCYXRjaFJlc29sdmVyIHtcbiAgcmVqZWN0OiAoZXJyb3I6IHVua25vd24pID0+IHZvaWRcbiAgcmVzb2x2ZTogKCkgPT4gdm9pZFxufVxuXG5pbnRlcmZhY2UgUGVuZGluZ0JhdGNoIHtcbiAgbGluZXM6IHN0cmluZ1tdXG4gIHJlc29sdmVyczogQmF0Y2hSZXNvbHZlcltdXG59XG5cbmNvbnN0IHNpbmtzID0gbmV3IE1hcDxzdHJpbmcsIEZpbGVTaW5rPigpXG5cbmNsYXNzIEZpbGVTaW5rSW1wbCBpbXBsZW1lbnRzIEZpbGVTaW5rIHtcbiAgcHJpdmF0ZSByZWFkb25seSBmaWxlUGF0aDogc3RyaW5nXG4gIHByaXZhdGUgaGFuZGxlOiBGaWxlSGFuZGxlIHwgbnVsbCA9IG51bGxcbiAgcHJpdmF0ZSBieXRlc1dyaXR0ZW4gPSAwXG4gIHByaXZhdGUgb3BlbmVkQXQgPSAwXG4gIHByaXZhdGUgbGF0ZXN0T3B0aW9uczogRmlsZVNpbmtPcHRpb25zID0ge31cbiAgcHJpdmF0ZSBwZW5kaW5nQmF0Y2g6IFBlbmRpbmdCYXRjaCB8IG51bGwgPSBudWxsXG4gIC8vIFNlcmlhbGl6ZXMgZmx1c2ggYW5kIHJvdGF0aW9uIHdvcmsgcGVyIHBhdGg6IGV2ZXJ5IGJhdGNoIChhbmQgdGhlXG4gIC8vIHJvdGF0aW9uIGl0IG1heSB0cmlnZ2VyKSBpcyBjaGFpbmVkIG9udG8gdGhpcyBzbyBhdCBtb3N0IG9uZSBob2xkZXIgb2ZcbiAgLy8gdGhlIGZpbGUgaGFuZGxlIGlzIGRvaW5nIEkvTyBhdCBhIHRpbWUuXG4gIHByaXZhdGUgZmx1c2hDaGFpbjogUHJvbWlzZTx2b2lkPiA9IFByb21pc2UucmVzb2x2ZSgpXG5cbiAgY29uc3RydWN0b3IoZmlsZVBhdGg6IHN0cmluZykge1xuICAgIHRoaXMuZmlsZVBhdGggPSBmaWxlUGF0aFxuICB9XG5cbiAgd3JpdGUobGluZTogc3RyaW5nLCBvcHRpb25zOiBGaWxlU2lua09wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBBbHdheXMgdXNlIHRoZSBsYXRlc3QgY2FsbCdzIG9wdGlvbnMsIGluIGNhc2UgY29uZmlnIGRpZmZlcnMgYmV0d2VlblxuICAgIC8vIGNhbGxzIHRvIHRoZSBzYW1lIHBhdGggKGUuZy4gaW4gdGVzdHMpLlxuICAgIHRoaXMubGF0ZXN0T3B0aW9ucyA9IG9wdGlvbnNcblxuICAgIGNvbnN0IHsgcHJvbWlzZSwgcmVqZWN0LCByZXNvbHZlIH06IFByb21pc2VXaXRoUmVzb2x2ZXJzPHZvaWQ+ID1cbiAgICAgIFByb21pc2Uud2l0aFJlc29sdmVycygpXG5cbiAgICBpZiAodGhpcy5wZW5kaW5nQmF0Y2gpIHtcbiAgICAgIHRoaXMucGVuZGluZ0JhdGNoLmxpbmVzLnB1c2gobGluZSlcbiAgICAgIHRoaXMucGVuZGluZ0JhdGNoLnJlc29sdmVycy5wdXNoKHsgcmVqZWN0LCByZXNvbHZlIH0pXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cblxuICAgIGNvbnN0IGJhdGNoOiBQZW5kaW5nQmF0Y2ggPSB7XG4gICAgICBsaW5lczogW2xpbmVdLFxuICAgICAgcmVzb2x2ZXJzOiBbeyByZWplY3QsIHJlc29sdmUgfV1cbiAgICB9XG4gICAgdGhpcy5wZW5kaW5nQmF0Y2ggPSBiYXRjaFxuXG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgdGhpcy5wZW5kaW5nQmF0Y2ggPSBudWxsXG4gICAgICB0aGlzLmZsdXNoQ2hhaW4gPSB0aGlzLmZsdXNoQWZ0ZXIodGhpcy5mbHVzaENoYWluLCBiYXRjaClcbiAgICB9KVxuXG4gICAgcmV0dXJuIHByb21pc2VcbiAgfVxuXG4gIC8qKiBSdW5zIGBiYXRjaGAgb25jZSBgcHJpb3JgIHNldHRsZXMsIHdoZXRoZXIgaXQgcmVzb2x2ZWQgb3IgcmVqZWN0ZWQuICovXG4gIHByaXZhdGUgYXN5bmMgZmx1c2hBZnRlcihcbiAgICBwcmlvcjogUHJvbWlzZTx2b2lkPixcbiAgICBiYXRjaDogUGVuZGluZ0JhdGNoXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIEEgZmFpbGVkIGJhdGNoIGFscmVhZHkgcmVqZWN0ZWQgaXRzIG93biB3cml0ZXJzOyB0aGUgbmV4dCBvbmUgc3RpbGwgcnVucy5cbiAgICBhd2FpdCBzZXR0bGUocHJpb3IpXG4gICAgYXdhaXQgdGhpcy5mbHVzaEJhdGNoKGJhdGNoKVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmbHVzaEJhdGNoKGJhdGNoOiBQZW5kaW5nQmF0Y2gpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5sYXRlc3RPcHRpb25zXG4gICAgLy8gTGluZXMgYWxyZWFkeSBjYXJyeSB0aGVpciBvd24gdHJhaWxpbmcgbmV3bGluZTsgam9pbiBuZWVkcyBubyBzZXBhcmF0b3IuXG4gICAgY29uc3QgdGV4dCA9IGJhdGNoLmxpbmVzLmpvaW4oJycpXG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5lbnN1cmVPcGVuKG9wdGlvbnMpXG4gICAgICBjb25zdCBoYW5kbGUgPSB0aGlzLmhhbmRsZSBhcyBGaWxlSGFuZGxlXG4gICAgICBhd2FpdCBoYW5kbGUud3JpdGUodGV4dClcbiAgICAgIHRoaXMuYnl0ZXNXcml0dGVuICs9IEJ1ZmZlci5ieXRlTGVuZ3RoKHRleHQpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGZvciAoY29uc3QgcmVzb2x2ZXIgb2YgYmF0Y2gucmVzb2x2ZXJzKSB7XG4gICAgICAgIHJlc29sdmVyLnJlamVjdChlcnJvcilcbiAgICAgIH1cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIFJvdGF0aW9uIChpZiB0cmlnZ2VyZWQpIGlzIGF3YWl0ZWQgYmVmb3JlIHJlc29sdmluZyBzbyBjYWxsZXJzIG9ic2VydmVcbiAgICAvLyBhIGNvbnNpc3RlbnQgb24tZGlzayBzdGF0ZTogdGhlIGxpbmUncyB3cml0ZSBwbHVzIGFueSByb3RhdGlvbiBpdFxuICAgIC8vIGNhdXNlZC4gbWF5YmVSb3RhdGUoKSBjYXRjaGVzIGFuZCByZXBvcnRzIGl0cyBvd24gZXJyb3JzLCBzbyBpdCBuZXZlclxuICAgIC8vIHJlamVjdHMgdGhpcyBjaGFpbi5cbiAgICBhd2FpdCB0aGlzLm1heWJlUm90YXRlKG9wdGlvbnMpXG5cbiAgICBmb3IgKGNvbnN0IHJlc29sdmVyIG9mIGJhdGNoLnJlc29sdmVycykge1xuICAgICAgcmVzb2x2ZXIucmVzb2x2ZSgpXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVPcGVuKG9wdGlvbnM6IEZpbGVTaW5rT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmhhbmRsZSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gVGhlIGRpcmVjdG9yeSBvbmx5IG5lZWRzIGNyZWF0aW5nIG9uIGZpcnN0IG9wZW4gKG9yIG9uIHJlb3BlbiBhZnRlciBhXG4gICAgLy8gcm90YXRpb24gY2xlYXJlZCB0aGUgaGFuZGxlKSDigJQgbmV2ZXIgcGVyIGxpbmUuXG4gICAgYXdhaXQgZW5zdXJlRGlyKHBhdGguZGlybmFtZSh0aGlzLmZpbGVQYXRoKSwgb3B0aW9ucy5sb2dEaXJNb2RlKVxuICAgIGNvbnN0IGhhbmRsZSA9IGF3YWl0IG9wZW4odGhpcy5maWxlUGF0aCwgJ2EnLCBvcHRpb25zLmxvZ0ZpbGVNb2RlID8/IDBvNjAwKVxuICAgIGNvbnN0IHN0YXQgPSBhd2FpdCBoYW5kbGUuc3RhdCgpXG4gICAgdGhpcy5oYW5kbGUgPSBoYW5kbGVcbiAgICB0aGlzLmJ5dGVzV3JpdHRlbiA9IHN0YXQuc2l6ZVxuICAgIHRoaXMub3BlbmVkQXQgPSByZXNvbHZlT3BlbmVkQXQoc3RhdC5iaXJ0aHRpbWVNcywgRGF0ZS5ub3coKSlcbiAgfVxuXG4gIC8qKiBUcnVlIHdoZW4gZWl0aGVyIGNvbmZpZ3VyZWQgdHJpZ2dlciAoc2l6ZSwgaW50ZXJ2YWwpIGhhcyBiZWVuIGNyb3NzZWQuICovXG4gIHByaXZhdGUgc2hvdWxkUm90YXRlTm93KHJvdGF0aW9uOiBMb2dSb3RhdGlvbkNvbmZpZyk6IGJvb2xlYW4ge1xuICAgIGlmIChcbiAgICAgIHJvdGF0aW9uLm1heFNpemUgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgdGhpcy5ieXRlc1dyaXR0ZW4gPiBwYXJzZVNpemUocm90YXRpb24ubWF4U2l6ZSlcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICByb3RhdGlvbi5pbnRlcnZhbCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBEYXRlLm5vdygpIC0gdGhpcy5vcGVuZWRBdCA+PSBwYXJzZUludGVydmFsKHJvdGF0aW9uLmludGVydmFsKVxuICAgIClcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbWF5YmVSb3RhdGUob3B0aW9uczogRmlsZVNpbmtPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgcm90YXRpb24gPSBvcHRpb25zLmxvZ1JvdGF0aW9uXG4gICAgaWYgKFxuICAgICAgIXJvdGF0aW9uIHx8XG4gICAgICAocm90YXRpb24ubWF4U2l6ZSA9PT0gdW5kZWZpbmVkICYmIHJvdGF0aW9uLmludGVydmFsID09PSB1bmRlZmluZWQpXG4gICAgKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgaWYgKCF0aGlzLnNob3VsZFJvdGF0ZU5vdyhyb3RhdGlvbikpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsgaGFuZGxlIH0gPSB0aGlzXG4gICAgICB0aGlzLmhhbmRsZSA9IG51bGxcbiAgICAgIHRoaXMuYnl0ZXNXcml0dGVuID0gMFxuICAgICAgdGhpcy5vcGVuZWRBdCA9IERhdGUubm93KClcbiAgICAgIGF3YWl0IGhhbmRsZT8uY2xvc2UoKVxuICAgICAgYXdhaXQgcGVyZm9ybVJvdGF0aW9uKFxuICAgICAgICB0aGlzLmZpbGVQYXRoLFxuICAgICAgICByb3RhdGlvbixcbiAgICAgICAgb3B0aW9ucy5vblJvdGF0aW9uRXJyb3IsXG4gICAgICAgIG9wdGlvbnMubG9nRmlsZU1vZGVcbiAgICAgIClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gTG9nIGVudHJpZXMgd2VyZSBhbHJlYWR5IGR1cmFibHkgd3JpdHRlbiBhbmQgcmVzb2x2ZWQgYWJvdmU7XG4gICAgICAvLyByb3RhdGlvbiBmYWlsdXJlcyBtdXN0IG5vdCBmYWlsIHRoZSBjYWxsZXIncyB3cml0ZS5cbiAgICAgIGlmIChvcHRpb25zLm9uUm90YXRpb25FcnJvcikge1xuICAgICAgICBvcHRpb25zLm9uUm90YXRpb25FcnJvcihlcnJvcilcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgYFtsb2dpeGx5c2lhXSBGYWlsZWQgdG8gcm90YXRlIGxvZyBmaWxlICR7dGhpcy5maWxlUGF0aH06YCxcbiAgICAgICAgICBlcnJvclxuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZmx1c2goKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gd3JpdGUoKSBjaGFpbnMgb250byBmbHVzaENoYWluIGZyb20gYSBtaWNyb3Rhc2ssIHNvIHlpZWxkIG9uY2UgYmVmb3JlXG4gICAgLy8gcmVhZGluZyB0aGUgY2hhaW4gb3IgYSB3cml0ZSBpc3N1ZWQgaW4gdGhlIHNhbWUgdGljayB3b3VsZCBiZSBtaXNzZWQuXG4gICAgYXdhaXQgUHJvbWlzZS5yZXNvbHZlKClcbiAgICBhd2FpdCB0aGlzLmZsdXNoQ2hhaW5cbiAgfVxuXG4gIGFzeW5jIGNsb3NlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuZmx1c2goKVxuICAgIGNvbnN0IHsgaGFuZGxlIH0gPSB0aGlzXG4gICAgdGhpcy5oYW5kbGUgPSBudWxsXG4gICAgYXdhaXQgaGFuZGxlPy5jbG9zZSgpXG4gICAgc2lua3MuZGVsZXRlKHRoaXMuZmlsZVBhdGgpXG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGdldEZpbGVTaW5rID0gKGZpbGVQYXRoOiBzdHJpbmcpOiBGaWxlU2luayA9PiB7XG4gIGxldCBzaW5rID0gc2lua3MuZ2V0KGZpbGVQYXRoKVxuICBpZiAoIXNpbmspIHtcbiAgICBzaW5rID0gbmV3IEZpbGVTaW5rSW1wbChmaWxlUGF0aClcbiAgICBzaW5rcy5zZXQoZmlsZVBhdGgsIHNpbmspXG4gIH1cbiAgcmV0dXJuIHNpbmtcbn1cblxuZXhwb3J0IGNvbnN0IGZsdXNoQWxsRmlsZVNpbmtzID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoWy4uLnNpbmtzLnZhbHVlcygpXS5tYXAoc2luayA9PiBzaW5rLmZsdXNoKCkpKVxufVxuXG5leHBvcnQgY29uc3QgY2xvc2VBbGxGaWxlU2lua3MgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbLi4uc2lua3MudmFsdWVzKCldLm1hcChzaW5rID0+IHNpbmsuY2xvc2UoKSkpXG59XG4iLAogICAgImltcG9ydCB7IHByb21pc2VzIGFzIGZzIH0gZnJvbSAnbm9kZTpmcydcblxuZXhwb3J0IGNvbnN0IGVuc3VyZURpciA9IGFzeW5jIChcbiAgZGlyUGF0aDogc3RyaW5nLFxuICBtb2RlID0gMG83MDBcbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICBhd2FpdCBmcy5ta2RpcihkaXJQYXRoLCB7IG1vZGUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IFN0YXRzIH0gZnJvbSAnbm9kZTpmcydcbmltcG9ydCB7IHByb21pc2VzIGFzIGZzIH0gZnJvbSAnbm9kZTpmcydcbmltcG9ydCB7IHByb21pc2lmeSB9IGZyb20gJ25vZGU6dXRpbCdcbmltcG9ydCB7IGd6aXAgfSBmcm9tICdub2RlOnpsaWInXG5pbXBvcnQgdHlwZSB7IExvZ1JvdGF0aW9uQ29uZmlnIH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcbmltcG9ydCB7XG4gIGdldFJvdGF0ZWRGaWxlcyxcbiAgcGFyc2VSZXRlbnRpb24sXG4gIHBhcnNlU2l6ZSxcbiAgc2hvdWxkUm90YXRlQnlTaXplXG59IGZyb20gJy4uL3V0aWxzL3JvdGF0aW9uJ1xuaW1wb3J0IHsgY3JlYXRlS2V5ZWRNdXRleCB9IGZyb20gJy4va2V5ZWQtbXV0ZXgnXG5cbmNvbnN0IGd6aXBBc3luYyA9IHByb21pc2lmeShnemlwKVxuXG5jb25zdCBERUZBVUxUX0ZJTEVfTU9ERSA9IDBvNjAwXG5cbi8vIFByZXZlbnRzIGNvbmN1cnJlbnQgY29tcHJlc3Npb24gb2YgdGhlIHNhbWUgZmlsZSAoa2V5ZWQgYnkgZmlsZVBhdGgpLlxuY29uc3QgY29tcHJlc3Npb25Mb2NrID0gY3JlYXRlS2V5ZWRNdXRleCgpXG5cbi8qKiBSZXBvcnRzIGEgc2luayBmYWlsdXJlOyB3aGVuIG9taXR0ZWQsIHRoZSBjYWxsZXIgZmFsbHMgYmFjayB0byBzdGRlcnIuICovXG5leHBvcnQgdHlwZSBSb3RhdGlvbkVycm9yUmVwb3J0ZXIgPSAoZXJyb3I6IHVua25vd24pID0+IHZvaWRcblxuY29uc3QgcmVwb3J0Um90YXRpb25FcnJvciA9IChcbiAgbWVzc2FnZTogc3RyaW5nLFxuICBlcnJvcjogdW5rbm93bixcbiAgb25FcnJvcj86IFJvdGF0aW9uRXJyb3JSZXBvcnRlclxuKTogdm9pZCA9PiB7XG4gIGlmIChvbkVycm9yKSB7XG4gICAgb25FcnJvcihlcnJvcilcbiAgICByZXR1cm5cbiAgfVxuICBjb25zb2xlLmVycm9yKG1lc3NhZ2UsIGVycm9yKVxufVxuXG5jb25zdCBwYWQyID0gKHZhbHVlOiBudW1iZXIpOiBzdHJpbmcgPT4gU3RyaW5nKHZhbHVlKS5wYWRTdGFydCgyLCAnMCcpXG5cbmV4cG9ydCBjb25zdCBnZXRSb3RhdGVkRmlsZU5hbWUgPSAoZmlsZVBhdGg6IHN0cmluZywgZGF0ZTogRGF0ZSk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IHl5eXkgPSBkYXRlLmdldEZ1bGxZZWFyKClcbiAgY29uc3QgbW0gPSBwYWQyKGRhdGUuZ2V0TW9udGgoKSArIDEpXG4gIGNvbnN0IGRkID0gcGFkMihkYXRlLmdldERhdGUoKSlcbiAgY29uc3QgSEggPSBwYWQyKGRhdGUuZ2V0SG91cnMoKSlcbiAgY29uc3QgTU0gPSBwYWQyKGRhdGUuZ2V0TWludXRlcygpKVxuICBjb25zdCBzcyA9IHBhZDIoZGF0ZS5nZXRTZWNvbmRzKCkpXG4gIGNvbnN0IFNTUyA9IFN0cmluZyhkYXRlLmdldE1pbGxpc2Vjb25kcygpKS5wYWRTdGFydCgzLCAnMCcpXG4gIHJldHVybiBgJHtmaWxlUGF0aH0uJHt5eXl5fS0ke21tfS0ke2RkfS0ke0hIfS0ke01NfS0ke3NzfS0ke1NTU31gXG59XG5cbmV4cG9ydCBjb25zdCByb3RhdGVGaWxlID0gYXN5bmMgKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHN0YXQgPSBhd2FpdCBmcy5zdGF0KGZpbGVQYXRoKVxuICAgIGlmIChzdGF0LnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybiAnJ1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICBjb25zdCBiYXNlUm90YXRlZCA9IGdldFJvdGF0ZWRGaWxlTmFtZShmaWxlUGF0aCwgbmV3IERhdGUoKSlcbiAgY29uc3Qgcm90YXRlZCA9IGAke2Jhc2VSb3RhdGVkfS0ke3Byb2Nlc3MuaHJ0aW1lLmJpZ2ludCgpfWBcbiAgYXdhaXQgZnMucmVuYW1lKGZpbGVQYXRoLCByb3RhdGVkKVxuICByZXR1cm4gcm90YXRlZFxufVxuXG5leHBvcnQgY29uc3QgY29tcHJlc3NGaWxlID0gYXN5bmMgKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBvbkVycm9yPzogUm90YXRpb25FcnJvclJlcG9ydGVyLFxuICBmaWxlTW9kZSA9IERFRkFVTFRfRklMRV9NT0RFXG4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3QgcmVsZWFzZSA9IGF3YWl0IGNvbXByZXNzaW9uTG9jay5hY3F1aXJlKGZpbGVQYXRoKVxuICB0cnkge1xuICAgIC8vIENoZWNrIGlmIGZpbGUgc3RpbGwgZXhpc3RzIChtaWdodCBoYXZlIGJlZW4gY29tcHJlc3NlZCBieSBhbm90aGVyIHByb2Nlc3MpXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZzLmFjY2VzcyhmaWxlUGF0aClcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEZpbGUgZG9lc24ndCBleGlzdCwgYWxyZWFkeSBjb21wcmVzc2VkIG9yIGRlbGV0ZWRcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShmaWxlUGF0aClcbiAgICBjb25zdCBjb21wcmVzc2VkID0gYXdhaXQgZ3ppcEFzeW5jKGNvbnRlbnQpXG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKGAke2ZpbGVQYXRofS5nemAsIGNvbXByZXNzZWQsIHsgbW9kZTogZmlsZU1vZGUgfSlcbiAgICBhd2FpdCBmcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJlcG9ydFJvdGF0aW9uRXJyb3IoXG4gICAgICBgW2xvZ2l4bHlzaWFdIEZhaWxlZCB0byBjb21wcmVzcyBmaWxlICR7ZmlsZVBhdGh9OmAsXG4gICAgICBlcnJvcixcbiAgICAgIG9uRXJyb3JcbiAgICApXG4gICAgdGhyb3cgZXJyb3JcbiAgfSBmaW5hbGx5IHtcbiAgICByZWxlYXNlKClcbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgc2hvdWxkUm90YXRlID0gYXN5bmMgKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBjb25maWc6IExvZ1JvdGF0aW9uQ29uZmlnXG4pOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgaWYgKGNvbmZpZy5tYXhTaXplID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuICBjb25zdCBtYXhTaXplID0gcGFyc2VTaXplKGNvbmZpZy5tYXhTaXplKVxuICByZXR1cm4gYXdhaXQgc2hvdWxkUm90YXRlQnlTaXplKGZpbGVQYXRoLCBtYXhTaXplKVxufVxuXG5pbnRlcmZhY2UgRmlsZVN0YXQge1xuICBwYXRoOiBzdHJpbmdcbiAgc3RhdDogU3RhdHNcbn1cblxuY29uc3QgaXNGdWxmaWxsZWQgPSA8VD4oXG4gIHJlc3VsdDogUHJvbWlzZVNldHRsZWRSZXN1bHQ8VD5cbik6IHJlc3VsdCBpcyBQcm9taXNlRnVsZmlsbGVkUmVzdWx0PFQ+ID0+IHJlc3VsdC5zdGF0dXMgPT09ICdmdWxmaWxsZWQnXG5cbi8qKlxuICogRGVsZXRlcyByb3RhdGVkIGZpbGVzIGJleW9uZCBgcmV0ZW50aW9uYDogZm9yIGAnY291bnQnYCwga2VlcHMgdGhlIG5ld2VzdFxuICogYHJldGVudGlvbi52YWx1ZWAgZmlsZXMgKGJ5IG10aW1lKTsgZm9yIGAndGltZSdgLCBkZWxldGVzIGZpbGVzIG9sZGVyIHRoYW5cbiAqIGByZXRlbnRpb24udmFsdWVgIG1zLiBJbmRpdmlkdWFsIHN0YXQvZGVsZXRlIGZhaWx1cmVzIGFyZSB0b2xlcmF0ZWQgKHZpYVxuICogYGFsbFNldHRsZWRgKSBzbyBvbmUgYmFkIGZpbGUgbmV2ZXIgYmxvY2tzIGNsZWFudXAgb2YgdGhlIHJlc3QuXG4gKi9cbmNvbnN0IGNsZWFudXBSb3RhdGVkID0gYXN5bmMgKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICByZXRlbnRpb246IHsgdHlwZTogJ2NvdW50JyB8ICd0aW1lJzsgdmFsdWU6IG51bWJlciB9LFxuICBvbkVycm9yPzogUm90YXRpb25FcnJvclJlcG9ydGVyXG4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3Qgcm90YXRlZCA9IGF3YWl0IGdldFJvdGF0ZWRGaWxlcyhmaWxlUGF0aClcbiAgaWYgKHJvdGF0ZWQubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKHJldGVudGlvbi50eXBlID09PSAnY291bnQnICYmIHJvdGF0ZWQubGVuZ3RoIDw9IHJldGVudGlvbi52YWx1ZSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgLy8gVXNlIFByb21pc2UuYWxsU2V0dGxlZCB0byBoYW5kbGUgaW5kaXZpZHVhbCBmaWxlIHN0YXQgZmFpbHVyZXMgZ3JhY2VmdWxseVxuICBjb25zdCBzdGF0c1Jlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgcm90YXRlZC5tYXAoYXN5bmMgcCA9PiAoeyBwYXRoOiBwLCBzdGF0OiBhd2FpdCBmcy5zdGF0KHApIH0pKVxuICApXG5cbiAgLy8gRXh0cmFjdCBzdWNjZXNzZnVsIHN0YXRzLCBpZ25vcmUgZmlsZXMgdGhhdCB3ZXJlIGRlbGV0ZWQgY29uY3VycmVudGx5XG4gIGNvbnN0IHN0YXRzID0gc3RhdHNSZXN1bHRzLmZpbHRlcihpc0Z1bGZpbGxlZDxGaWxlU3RhdD4pLm1hcChyID0+IHIudmFsdWUpXG5cbiAgbGV0IHRvRGVsZXRlOiBGaWxlU3RhdFtdXG4gIGlmIChyZXRlbnRpb24udHlwZSA9PT0gJ2NvdW50Jykge1xuICAgIGlmIChzdGF0cy5sZW5ndGggPD0gcmV0ZW50aW9uLnZhbHVlKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgc3RhdHMuc29ydCgoYSwgYikgPT4gYi5zdGF0Lm10aW1lTXMgLSBhLnN0YXQubXRpbWVNcylcbiAgICB0b0RlbGV0ZSA9IHN0YXRzLnNsaWNlKHJldGVudGlvbi52YWx1ZSlcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpXG4gICAgdG9EZWxldGUgPSBzdGF0cy5maWx0ZXIoKHsgc3RhdCB9KSA9PiBub3cgLSBzdGF0Lm10aW1lTXMgPiByZXRlbnRpb24udmFsdWUpXG4gIH1cblxuICAvLyBEZWxldGUgZmlsZXMgaW5kaXZpZHVhbGx5LCBjb250aW51aW5nIGV2ZW4gaWYgc29tZSBmYWlsXG4gIGNvbnN0IGRlbGV0ZVJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgdG9EZWxldGUubWFwKCh7IHBhdGggfSkgPT4gZnMucm0ocGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSlcbiAgKVxuXG4gIC8vIExvZyBmYWlsdXJlcyBidXQgZG9uJ3QgY3Jhc2hcbiAgZm9yIChjb25zdCBbaWR4LCByZXN1bHRdIG9mIGRlbGV0ZVJlc3VsdHMuZW50cmllcygpKSB7XG4gICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09ICdyZWplY3RlZCcpIHtcbiAgICAgIHJlcG9ydFJvdGF0aW9uRXJyb3IoXG4gICAgICAgIGBbbG9naXhseXNpYV0gRmFpbGVkIHRvIGRlbGV0ZSByb3RhdGVkIGxvZyAke3RvRGVsZXRlW2lkeF0ucGF0aH06YCxcbiAgICAgICAgcmVzdWx0LnJlYXNvbixcbiAgICAgICAgb25FcnJvclxuICAgICAgKVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgcGVyZm9ybVJvdGF0aW9uID0gYXN5bmMgKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBjb25maWc6IExvZ1JvdGF0aW9uQ29uZmlnLFxuICBvbkVycm9yPzogUm90YXRpb25FcnJvclJlcG9ydGVyLFxuICBmaWxlTW9kZSA9IERFRkFVTFRfRklMRV9NT0RFXG4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3Qgcm90YXRlZCA9IGF3YWl0IHJvdGF0ZUZpbGUoZmlsZVBhdGgpXG4gIGlmICghcm90YXRlZCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3Qgc2hvdWxkQ29tcHJlc3MgPSBjb25maWcuY29tcHJlc3MgPT09IHRydWVcbiAgaWYgKHNob3VsZENvbXByZXNzKSB7XG4gICAgY29uc3QgYWxnbyA9IGNvbmZpZy5jb21wcmVzc2lvbiA/PyAnZ3ppcCdcbiAgICBpZiAoYWxnbyA9PT0gJ2d6aXAnKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBjb21wcmVzc0ZpbGUocm90YXRlZCwgb25FcnJvciwgZmlsZU1vZGUpXG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gY29tcHJlc3NGaWxlIGFscmVhZHkgcmVwb3J0ZWQgdGhpcyBlcnJvciB2aWEgb25FcnJvci9jb25zb2xlLmVycm9yO1xuICAgICAgICAvLyBzd2FsbG93IHRoZSByZXRocm93IGhlcmUgc28gcmV0ZW50aW9uIGNsZWFudXAgYmVsb3cgc3RpbGwgcnVucyBhbmRcbiAgICAgICAgLy8gdGhlIGZhaWx1cmUgaXNuJ3QgcmVwb3J0ZWQgYSBzZWNvbmQgdGltZSBieSB0aGUgY2FsbGVyJ3MgY2F0Y2guXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5tYXhGaWxlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgcmV0ZW50aW9uID0gcGFyc2VSZXRlbnRpb24oY29uZmlnLm1heEZpbGVzKVxuICAgIGF3YWl0IGNsZWFudXBSb3RhdGVkKGZpbGVQYXRoLCByZXRlbnRpb24sIG9uRXJyb3IpXG4gIH1cblxuICAvLyBJbnRlcnZhbC1iYXNlZCB0cmlnZ2VyaW5nIGxpdmVzIGluIGBGaWxlU2lua0ltcGwubWF5YmVSb3RhdGVgXG4gIC8vIChmaWxlLXNpbmsudHMpOyBwZXJmb3JtUm90YXRpb24gaXMgdHJpZ2dlci1hZ25vc3RpYyDigJQgaXQgcmVuYW1lcyxcbiAgLy8gY29tcHJlc3NlcywgYW5kIGNsZWFucyB1cCByZWdhcmRsZXNzIG9mIHdoeSByb3RhdGlvbiBmaXJlZC5cbn1cbiIsCiAgICAiZXhwb3J0IGludGVyZmFjZSBLZXllZE11dGV4IHtcbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgd29yayBmb3IgYGtleWA6IHJlc29sdmVzIG9uY2UgYW55IHByaW9yIGhvbGRlciBmb3IgdGhlIHNhbWVcbiAgICoga2V5IGhhcyByZWxlYXNlZCwgYW5kIHJldHVybnMgYSByZWxlYXNlIGZ1bmN0aW9uIHRoZSBjYWxsZXIgTVVTVCBjYWxsXG4gICAqIGV4YWN0bHkgb25jZSB0byBoYW5kIHRoZSBsb2NrIHRvIHRoZSBuZXh0IHdhaXRlciAoaWYgYW55KS5cbiAgICovXG4gIGFjcXVpcmU6IChrZXk6IHN0cmluZykgPT4gUHJvbWlzZTwoKSA9PiB2b2lkPlxufVxuXG4vKipcbiAqIENyZWF0ZXMgYW4gaW5kZXBlbmRlbnQga2V5ZWQgbXV0ZXg6IGFjcXVpc2l0aW9ucyBmb3IgZGlmZmVyZW50IGtleXMgbmV2ZXJcbiAqIGJsb2NrIGVhY2ggb3RoZXIsIHdoaWxlIGFjcXVpc2l0aW9ucyBmb3IgdGhlIHNhbWUga2V5IGFyZSBzZXJpYWxpemVkIGluXG4gKiBGSUZPIG9yZGVyLlxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlS2V5ZWRNdXRleCA9ICgpOiBLZXllZE11dGV4ID0+IHtcbiAgY29uc3QgbG9ja3MgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTx2b2lkPj4oKVxuXG4gIGNvbnN0IGFjcXVpcmUgPSBhc3luYyAoa2V5OiBzdHJpbmcpOiBQcm9taXNlPCgpID0+IHZvaWQ+ID0+IHtcbiAgICBjb25zdCBwcmlvciA9IGxvY2tzLmdldChrZXkpID8/IFByb21pc2UucmVzb2x2ZSgpXG5cbiAgICBjb25zdCB7IHByb21pc2U6IGN1cnJlbnQsIHJlc29sdmU6IHJlbGVhc2UgfTogUHJvbWlzZVdpdGhSZXNvbHZlcnM8dm9pZD4gPVxuICAgICAgUHJvbWlzZS53aXRoUmVzb2x2ZXJzKClcblxuICAgIC8vIFJlZ2lzdGVyIGJlZm9yZSBhd2FpdGluZzogc2FtZS10aWNrIGNhbGxlcnMgbXVzdCBjaGFpbiBvbnRvIFRISVMgbG9jayxcbiAgICAvLyBub3QgdGhlIG9uZSB0aGF0IHdhcyBjdXJyZW50IHdoZW4gdGhleSBjYWxsZWQgYWNxdWlyZSgpLlxuICAgIGxvY2tzLnNldChrZXksIGN1cnJlbnQpXG5cbiAgICBhd2FpdCBwcmlvclxuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHJlbGVhc2UoKVxuICAgICAgaWYgKGxvY2tzLmdldChrZXkpID09PSBjdXJyZW50KSB7XG4gICAgICAgIGxvY2tzLmRlbGV0ZShrZXkpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgYWNxdWlyZSB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgTG9nTGV2ZWwsIE9wdGlvbnMsIFJlcXVlc3RJbmZvLCBTdG9yZURhdGEgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgZWxhcHNlZE1zIH0gZnJvbSAnLi4vdXRpbHMvZHVyYXRpb24nXG5pbXBvcnQgeyBjcmVhdGVFcnJvclJlcG9ydGVyIH0gZnJvbSAnLi4vdXRpbHMvcmVwb3J0J1xuaW1wb3J0IHsgc2FuaXRpemVMb2dUZXh0IH0gZnJvbSAnLi4vdXRpbHMvc2FuaXRpemUnXG5pbXBvcnQgeyBnZXRGaWxlU2luayB9IGZyb20gJy4vZmlsZS1zaW5rJ1xuXG5jb25zdCByZXBvcnRGaWxlRXJyb3IgPSBjcmVhdGVFcnJvclJlcG9ydGVyKFxuICAnZmlsZScsXG4gICdmYWlsZWQgdG8gd3JpdGUgdG8gbG9nIGZpbGUnXG4pXG5jb25zdCByZXBvcnRSb3RhdGlvbkVycm9yID0gY3JlYXRlRXJyb3JSZXBvcnRlcihcbiAgJ3JvdGF0aW9uJyxcbiAgJ2xvZyByb3RhdGlvbiBmYWlsZWQnXG4pXG5cbmludGVyZmFjZSBMb2dUb0ZpbGVJbnB1dCB7XG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gIGZpbGVQYXRoOiBzdHJpbmdcbiAgbGV2ZWw6IExvZ0xldmVsXG4gIG9wdGlvbnM6IE9wdGlvbnNcbiAgLyoqIER1cmF0aW9uL1VSTCBwYXJ0cyBhbHJlYWR5IGNvbXB1dGVkIGJ5IHRoZSBjYWxsZXI7IHBhcnNlZCBvbiB0aGUgZmx5IHdoZW4gb21pdHRlZC4gKi9cbiAgcHJlY29tcHV0ZWQ/OiB7IGR1cmF0aW9uTXM6IG51bWJlcjsgcGF0aG5hbWU6IHN0cmluZzsgc2VhcmNoOiBzdHJpbmcgfVxuICByZXF1ZXN0OiBSZXF1ZXN0SW5mb1xuICBzdG9yZTogU3RvcmVEYXRhXG59XG5cbi8qKiBSZXNvbHZlcyB0aGUgbG9nZ2VkIHBhdGhuYW1lICh3aXRoIHF1ZXJ5IHN0cmluZyB3aGVuIGNvbmZpZ3VyZWQpIGZyb20gcHJlY29tcHV0ZWQgcGFydHMgb3IgYSBmcmVzaCBwYXJzZS4gKi9cbmNvbnN0IHJlc29sdmVQYXRobmFtZSA9IChcbiAgcmVxdWVzdDogUmVxdWVzdEluZm8sXG4gIGxvZ1F1ZXJ5UGFyYW1zOiBib29sZWFuIHwgdW5kZWZpbmVkLFxuICBwcmVjb21wdXRlZD86IHsgcGF0aG5hbWU6IHN0cmluZzsgc2VhcmNoOiBzdHJpbmcgfVxuKTogc3RyaW5nID0+IHtcbiAgaWYgKHByZWNvbXB1dGVkKSB7XG4gICAgY29uc3QgeyBwYXRobmFtZSwgc2VhcmNoIH0gPSBwcmVjb21wdXRlZFxuICAgIHJldHVybiBsb2dRdWVyeVBhcmFtcyA/IGAke3BhdGhuYW1lfSR7c2VhcmNofWAgOiBwYXRobmFtZVxuICB9XG4gIHRyeSB7XG4gICAgLy8gU2FmZWx5IHBhcnNlIFVSTCB0byBhdm9pZCBjcmFzaGVzIG9uIG1hbGZvcm1lZCBVUkxzXG4gICAgY29uc3QgeyBwYXRobmFtZSwgc2VhcmNoIH0gPSBuZXcgVVJMKHJlcXVlc3QudXJsKVxuICAgIHJldHVybiBsb2dRdWVyeVBhcmFtcyA/IGAke3BhdGhuYW1lfSR7c2VhcmNofWAgOiBwYXRobmFtZVxuICB9IGNhdGNoIHtcbiAgICAvLyBGYWxsYmFjayB0byByYXcgVVJMIGlmIHBhcnNpbmcgZmFpbHNcbiAgICByZXR1cm4gcmVxdWVzdC51cmxcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgbG9nVG9GaWxlID0gYXN5bmMgKGlucHV0OiBMb2dUb0ZpbGVJbnB1dCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICBjb25zdCB7IGZpbGVQYXRoLCBsZXZlbCwgcmVxdWVzdCwgZGF0YSwgc3RvcmUsIG9wdGlvbnMsIHByZWNvbXB1dGVkIH0gPSBpbnB1dFxuICBjb25zdCB7IGNvbmZpZyB9ID0gb3B0aW9uc1xuICBjb25zdCB1c2VUcmFuc3BvcnRzT25seSA9IGNvbmZpZz8udXNlVHJhbnNwb3J0c09ubHkgPT09IHRydWVcbiAgY29uc3QgZGlzYWJsZUZpbGVMb2dnaW5nID0gY29uZmlnPy5kaXNhYmxlRmlsZUxvZ2dpbmcgPT09IHRydWVcbiAgaWYgKHVzZVRyYW5zcG9ydHNPbmx5IHx8IGRpc2FibGVGaWxlTG9nZ2luZykge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgbWVzc2FnZSA9IHR5cGVvZiBkYXRhLm1lc3NhZ2UgPT09ICdzdHJpbmcnID8gZGF0YS5tZXNzYWdlIDogJydcbiAgY29uc3QgZHVyYXRpb25NcyA9IHByZWNvbXB1dGVkPy5kdXJhdGlvbk1zID8/IGVsYXBzZWRNcyhzdG9yZS5iZWZvcmVUaW1lKVxuXG4gIGNvbnN0IHBhdGhuYW1lID0gcmVzb2x2ZVBhdGhuYW1lKHJlcXVlc3QsIGNvbmZpZz8ubG9nUXVlcnlQYXJhbXMsIHByZWNvbXB1dGVkKVxuICBjb25zdCBsaW5lID0gYCR7bGV2ZWx9ICR7ZHVyYXRpb25Ncy50b0ZpeGVkKDIpfW1zICR7cmVxdWVzdC5tZXRob2R9ICR7c2FuaXRpemVMb2dUZXh0KHBhdGhuYW1lLCAxMDI0KX0gJHtzYW5pdGl6ZUxvZ1RleHQobWVzc2FnZSl9XFxuYFxuXG4gIGNvbnN0IG9uUm90YXRpb25FcnJvciA9IChlcnJvcjogdW5rbm93bik6IHZvaWQgPT5cbiAgICByZXBvcnRSb3RhdGlvbkVycm9yKGVycm9yLCBjb25maWc/Lm9uRXJyb3IpXG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBnZXRGaWxlU2luayhmaWxlUGF0aCkud3JpdGUobGluZSwge1xuICAgICAgbG9nRGlyTW9kZTogY29uZmlnPy5sb2dEaXJNb2RlLFxuICAgICAgbG9nRmlsZU1vZGU6IGNvbmZpZz8ubG9nRmlsZU1vZGUsXG4gICAgICBsb2dSb3RhdGlvbjogY29uZmlnPy5sb2dSb3RhdGlvbixcbiAgICAgIG9uUm90YXRpb25FcnJvclxuICAgIH0pXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmVwb3J0RmlsZUVycm9yKGVycm9yLCBjb25maWc/Lm9uRXJyb3IpXG4gICAgdGhyb3cgZXJyb3JcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgeyBtZXJnZUxvZ0RhdGFDb250ZXh0IH0gZnJvbSAnLi4vY29udGV4dC9yZXF1ZXN0LWNvbnRleHQnXG5pbXBvcnQgdHlwZSB7IFJlcXVlc3RDb250ZXh0U3RvcmUgfSBmcm9tICcuLi9jb250ZXh0L3JlcXVlc3QtY29udGV4dCdcbmltcG9ydCB0eXBlIHtcbiAgTG9nRmlsdGVyLFxuICBMb2dMZXZlbCxcbiAgT3B0aW9ucyxcbiAgUmVxdWVzdEluZm8sXG4gIFN0b3JlRGF0YVxufSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgbG9nVG9UcmFuc3BvcnRzIH0gZnJvbSAnLi4vb3V0cHV0J1xuaW1wb3J0IHsgbG9nVG9GaWxlIH0gZnJvbSAnLi4vb3V0cHV0L2ZpbGUnXG5pbXBvcnQgdHlwZSB7IFNhbXBsaW5nUnVudGltZSB9IGZyb20gJy4uL3NhbXBsaW5nJ1xuaW1wb3J0IHsgZWxhcHNlZE1zIH0gZnJvbSAnLi4vdXRpbHMvZHVyYXRpb24nXG5pbXBvcnQgeyByZWRhY3QsIHJlZGFjdFJlcXVlc3QgfSBmcm9tICcuLi91dGlscy9yZWRhY3QnXG5pbXBvcnQgeyBjcmVhdGVFcnJvclJlcG9ydGVyIH0gZnJvbSAnLi4vdXRpbHMvcmVwb3J0J1xuaW1wb3J0IHsgc2V0dGxlIH0gZnJvbSAnLi4vdXRpbHMvc2V0dGxlJ1xuaW1wb3J0IHsgZm9ybWF0TG9nT3V0cHV0IH0gZnJvbSAnLi9jcmVhdGUtbG9nZ2VyJ1xuaW1wb3J0IHR5cGUgeyBGb3JtYXRDb250ZXh0LCBQcmVjb21wdXRlZExvZ1BhcnRzIH0gZnJvbSAnLi9jcmVhdGUtbG9nZ2VyJ1xuXG4vKipcbiAqIFdoaWNoIHNpbmtzIGFyZSBhY3RpdmUgZm9yIGEgZ2l2ZW4gY29uZmlnLCByZXNvbHZlZCBvbmNlIHBlciBsb2dnZXJcbiAqIGluc3RhbmNlIChzZWUgYGNyZWF0ZUxvZ2dlcmApIHNpbmNlIG5vbmUgb2YgdGhlc2UgZGVwZW5kIG9uIHBlci1yZXF1ZXN0XG4gKiBzdGF0ZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaW5rcyB7XG4gIGhhc0ZpbGVMb2dnaW5nOiBib29sZWFuXG4gIGhhc0ludGVybmFsTG9nZ2VyOiBib29sZWFuXG4gIGhhc1RyYW5zcG9ydHM6IGJvb2xlYW5cbiAgLyoqIFRydWUgd2hlbiBubyBzaW5rIGlzIGFjdGl2ZSBhdCBhbGw6IGBsb2coKWAvYGhhbmRsZUh0dHBFcnJvcigpYCBjYW4gc2tpcCBhbGwgd29yay4gKi9cbiAgaXNFZmZlY3RpdmVseURpc2FibGVkOiBib29sZWFuXG4gIC8qKiBUcnVlIHdoZW4gYXQgbGVhc3Qgb25lIGFjdGl2ZSBzaW5rIHJlYWRzIHBhdGhuYW1lL3NlYXJjaCAoZmlsZSBsb2dnaW5nIG9yIHRoZSBjb25zb2xlIGZvcm1hdHRlcikuICovXG4gIG5lZWRzVXJsUGFydHM6IGJvb2xlYW5cbn1cblxuZXhwb3J0IGNvbnN0IHJlc29sdmVTaW5rcyA9IChjb25maWc6IE9wdGlvbnNbJ2NvbmZpZyddKTogU2lua3MgPT4ge1xuICBjb25zdCB1c2VUcmFuc3BvcnRzT25seSA9IGNvbmZpZz8udXNlVHJhbnNwb3J0c09ubHkgPT09IHRydWVcbiAgY29uc3QgZGlzYWJsZUludGVybmFsTG9nZ2VyID0gY29uZmlnPy5kaXNhYmxlSW50ZXJuYWxMb2dnZXIgPT09IHRydWVcbiAgY29uc3QgZGlzYWJsZUZpbGVMb2dnaW5nID0gY29uZmlnPy5kaXNhYmxlRmlsZUxvZ2dpbmcgPT09IHRydWVcblxuICBjb25zdCBoYXNUcmFuc3BvcnRzID0gKGNvbmZpZz8udHJhbnNwb3J0cz8ubGVuZ3RoID8/IDApID4gMFxuICBjb25zdCBoYXNGaWxlTG9nZ2luZyA9XG4gICAgISh1c2VUcmFuc3BvcnRzT25seSB8fCBkaXNhYmxlRmlsZUxvZ2dpbmcpICYmICEhY29uZmlnPy5sb2dGaWxlUGF0aFxuICBjb25zdCBoYXNJbnRlcm5hbExvZ2dlciA9ICEodXNlVHJhbnNwb3J0c09ubHkgfHwgZGlzYWJsZUludGVybmFsTG9nZ2VyKVxuICBjb25zdCBpc0VmZmVjdGl2ZWx5RGlzYWJsZWQgPSAhKFxuICAgIGhhc1RyYW5zcG9ydHMgfHxcbiAgICBoYXNGaWxlTG9nZ2luZyB8fFxuICAgIGhhc0ludGVybmFsTG9nZ2VyXG4gIClcbiAgY29uc3QgbmVlZHNVcmxQYXJ0cyA9IGhhc0ZpbGVMb2dnaW5nIHx8IGhhc0ludGVybmFsTG9nZ2VyXG5cbiAgcmV0dXJuIHtcbiAgICBoYXNGaWxlTG9nZ2luZyxcbiAgICBoYXNJbnRlcm5hbExvZ2dlcixcbiAgICBoYXNUcmFuc3BvcnRzLFxuICAgIGlzRWZmZWN0aXZlbHlEaXNhYmxlZCxcbiAgICBuZWVkc1VybFBhcnRzXG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHNob3VsZExvZyA9IChsZXZlbDogTG9nTGV2ZWwsIGxvZ0ZpbHRlcj86IExvZ0ZpbHRlcik6IGJvb2xlYW4gPT4ge1xuICBpZiAoIWxvZ0ZpbHRlcj8ubGV2ZWwgfHwgbG9nRmlsdGVyLmxldmVsLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cbiAgcmV0dXJuIGxvZ0ZpbHRlci5sZXZlbC5pbmNsdWRlcyhsZXZlbClcbn1cblxuLyoqIFBhcnNlcyB0aGUgVVJMIG9uY2U7IG9ubHkgY2FsbGVkIHdoZW4gYXQgbGVhc3Qgb25lIGFjdGl2ZSBzaW5rIHJlYWRzIHBhdGhuYW1lL3NlYXJjaC4gKi9cbmV4cG9ydCBjb25zdCBwYXJzZVJlcXVlc3RVcmxPbmNlID0gKFxuICByZXF1ZXN0OiBSZXF1ZXN0SW5mb1xuKTogeyBwYXRobmFtZTogc3RyaW5nOyBzZWFyY2g6IHN0cmluZyB9ID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCB7IHBhdGhuYW1lLCBzZWFyY2ggfSA9IG5ldyBVUkwocmVxdWVzdC51cmwpXG4gICAgcmV0dXJuIHsgcGF0aG5hbWUsIHNlYXJjaCB9XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB7IHBhdGhuYW1lOiByZXF1ZXN0LnVybCB8fCAnLycsIHNlYXJjaDogJycgfVxuICB9XG59XG5cbi8qKlxuICogU2FtcGxlcyBkdXJhdGlvbiBhbmQgcGFyc2VzIHRoZSBVUkwgb25jZSBwZXIgZW1pc3Npb24gZm9yIHRoZSBzaW5rcyB0aGF0IHdpbGwgYWN0dWFsbHkgcnVuLlxuICogYGxvZ1RvVHJhbnNwb3J0c2AnIG1ldGEgb25seSByZWFkcyBgZHVyYXRpb25Nc2AgKG5vdCBwYXRobmFtZS9zZWFyY2gpLCBzbyB0aGUgVVJMIGlzIHBhcnNlZFxuICogb25seSB3aGVuIGZpbGUgbG9nZ2luZyBvciB0aGUgaW50ZXJuYWwgY29uc29sZSBsb2dnZXIgaXMgYWN0aXZlIOKAlCBza2lwcGluZyBpdCBlbnRpcmVseSBmb3JcbiAqIHRyYW5zcG9ydHMtb25seSBjb25maWdzLCBtYXRjaGluZyB0aGF0IHBhdGgncyBwcmUtb3B0aW1pemF0aW9uIGJlaGF2aW9yLlxuICovXG5leHBvcnQgY29uc3QgY29tcHV0ZVByZWNvbXB1dGVkTG9nUGFydHMgPSAoXG4gIHN0b3JlOiBTdG9yZURhdGEsXG4gIHJlcXVlc3Q6IFJlcXVlc3RJbmZvLFxuICBuZWVkc1VybFBhcnRzOiBib29sZWFuLFxuICBkdXJhdGlvbk92ZXJyaWRlPzogbnVtYmVyXG4pOiBQcmVjb21wdXRlZExvZ1BhcnRzID0+IHtcbiAgY29uc3QgZHVyYXRpb25NcyA9IGR1cmF0aW9uT3ZlcnJpZGUgPz8gZWxhcHNlZE1zKHN0b3JlLmJlZm9yZVRpbWUpXG4gIGNvbnN0IHsgcGF0aG5hbWUsIHNlYXJjaCB9ID0gbmVlZHNVcmxQYXJ0c1xuICAgID8gcGFyc2VSZXF1ZXN0VXJsT25jZShyZXF1ZXN0KVxuICAgIDogeyBwYXRobmFtZTogJycsIHNlYXJjaDogJycgfVxuXG4gIHJldHVybiB7IGR1cmF0aW9uTXMsIHBhdGhuYW1lLCBzZWFyY2ggfVxufVxuXG5jb25zdCBjb25zb2xlRm9yTGV2ZWwgPSAobGV2ZWw6IExvZ0xldmVsKTogdHlwZW9mIGNvbnNvbGUubG9nID0+IHtcbiAgc3dpdGNoIChsZXZlbCkge1xuICAgIGNhc2UgJ0RFQlVHJzoge1xuICAgICAgcmV0dXJuIGNvbnNvbGUuZGVidWdcbiAgICB9XG4gICAgY2FzZSAnSU5GTyc6IHtcbiAgICAgIHJldHVybiBjb25zb2xlLmluZm9cbiAgICB9XG4gICAgY2FzZSAnV0FSTklORyc6IHtcbiAgICAgIHJldHVybiBjb25zb2xlLndhcm5cbiAgICB9XG4gICAgY2FzZSAnRVJST1InOiB7XG4gICAgICByZXR1cm4gY29uc29sZS5lcnJvclxuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICByZXR1cm4gY29uc29sZS5sb2dcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBFbWl0SW5wdXQge1xuICAvKiogU2tpcHMgdGhlIHNhbXBsaW5nIGdhdGU7IHNldCB3aGVuIHJlcGxheWluZyBhIHRhaWwtcmVzY3VlZCByZWNvcmQuICovXG4gIGJ5cGFzc1NhbXBsaW5nPzogYm9vbGVhblxuICAvKiogU2hhcmVkIHBlci1yZXF1ZXN0IGNvbnRleHQgYmFnIChwZWVrZWQsIG5ldmVyIGNsb25lZC9yZXRhaW5lZCkuICovXG4gIGNvbnRleHRTdG9yZTogUmVxdWVzdENvbnRleHRTdG9yZVxuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAvKiogRHVyYXRpb24gY2FwdHVyZWQgd2hlbiBhIHJlY29yZCB3YXMgYnVmZmVyZWQsIHJlcGxhY2luZyB0aGUgbGl2ZSBzYW1wbGUuICovXG4gIGR1cmF0aW9uT3ZlcnJpZGU/OiBudW1iZXJcbiAgLyoqIEhvaXN0ZWQgcGVyLWxvZ2dlciBjb25zdGFudHMgZm9yIGBmb3JtYXRMb2dPdXRwdXRgOyBvbmx5IHJlYWQgd2hlbiB0aGUgaW50ZXJuYWwgY29uc29sZSBsb2dnZXIgaXMgYWN0aXZlLiAqL1xuICBmb3JtYXRDb250ZXh0OiBGb3JtYXRDb250ZXh0XG4gIGxldmVsOiBMb2dMZXZlbFxuICBvcHRpb25zOiBPcHRpb25zXG4gIHJlcXVlc3Q6IFJlcXVlc3RJbmZvXG4gIC8qKiBIb2lzdGVkIHBlci1sb2dnZXIgc2FtcGxpbmcgcnVudGltZTsgdW5kZWZpbmVkIHdoZW4gc2FtcGxpbmcgaXMgb2ZmLiAqL1xuICBzYW1wbGluZz86IFNhbXBsaW5nUnVudGltZVxuICAvKiogSG9pc3RlZCBwZXItbG9nZ2VyIHNpbmsgZ2F0ZXMgZnJvbSB7QGxpbmsgcmVzb2x2ZVNpbmtzfS4gKi9cbiAgc2lua3M6IFNpbmtzXG4gIHN0b3JlOiBTdG9yZURhdGFcbn1cblxuLyoqIFNoYXJlZCBieSBgZW1pdGAgYW5kIGBoYW5kbGVIdHRwRXJyb3JgIHNvIGZvcm1hdHRpbmcgZmFpbHVyZXMgc2hhcmUgb25lIHJhdGUgbGltaXQuICovXG5leHBvcnQgY29uc3QgcmVwb3J0Rm9ybWF0RXJyb3IgPSBjcmVhdGVFcnJvclJlcG9ydGVyKFxuICAnZm9ybWF0JyxcbiAgJ2ZhaWxlZCB0byBidWlsZCBhIGxvZyByZWNvcmQnXG4pXG5cbmNvbnN0IHdyaXRlUmVjb3JkID0gKHtcbiAgY29udGV4dFN0b3JlLFxuICBkYXRhLFxuICBkdXJhdGlvbk92ZXJyaWRlLFxuICBmb3JtYXRDb250ZXh0LFxuICBsZXZlbCxcbiAgb3B0aW9ucyxcbiAgcmVxdWVzdCxcbiAgc2lua3MsXG4gIHN0b3JlXG59OiBFbWl0SW5wdXQpOiB2b2lkID0+IHtcbiAgY29uc3QgeyBjb25maWcgfSA9IG9wdGlvbnNcblxuICBjb25zdCBkYXRhV2l0aENvbnRleHQgPSBtZXJnZUxvZ0RhdGFDb250ZXh0KFxuICAgIGRhdGEsXG4gICAgLy8gbWVyZ2VMb2dEYXRhQ29udGV4dCBvbmx5IHJlYWRzL3NwcmVhZHMgdGhpcyBiYWcgaW50byBhIG5ldyBvYmplY3Q7IGl0IG5ldmVyIHJldGFpbnNcbiAgICAvLyB0aGUgcmVmZXJlbmNlLCBzbyBhIG5vbi1jbG9uaW5nIHBlZWsgaXMgc2FmZSBoZXJlLlxuICAgIGNvbnRleHRTdG9yZS5wZWVrQ29udGV4dChyZXF1ZXN0KVxuICApXG4gIGNvbnN0IGxvZ0RhdGEgPVxuICAgIGNvbmZpZz8uYXV0b1JlZGFjdCA9PT0gdHJ1ZVxuICAgICAgPyByZWRhY3QoZGF0YVdpdGhDb250ZXh0LCBjb25maWc/LnJlZGFjdEtleXMpXG4gICAgICA6IGRhdGFXaXRoQ29udGV4dFxuICBjb25zdCBsb2dSZXF1ZXN0ID1cbiAgICBjb25maWc/LmF1dG9SZWRhY3QgPT09IHRydWVcbiAgICAgID8gcmVkYWN0UmVxdWVzdChyZXF1ZXN0LCBjb25maWc/LnJlZGFjdEtleXMpXG4gICAgICA6IHJlcXVlc3RcblxuICBjb25zdCBwcmVjb21wdXRlZCA9IGNvbXB1dGVQcmVjb21wdXRlZExvZ1BhcnRzKFxuICAgIHN0b3JlLFxuICAgIGxvZ1JlcXVlc3QsXG4gICAgc2lua3MubmVlZHNVcmxQYXJ0cyxcbiAgICBkdXJhdGlvbk92ZXJyaWRlXG4gIClcblxuICBpZiAoc2lua3MuaGFzVHJhbnNwb3J0cykge1xuICAgIGxvZ1RvVHJhbnNwb3J0cyh7XG4gICAgICBkYXRhOiBsb2dEYXRhLFxuICAgICAgbGV2ZWwsXG4gICAgICBvcHRpb25zLFxuICAgICAgcHJlY29tcHV0ZWQsXG4gICAgICByZXF1ZXN0OiBsb2dSZXF1ZXN0LFxuICAgICAgc3RvcmVcbiAgICB9KVxuICB9XG5cbiAgaWYgKHNpbmtzLmhhc0ZpbGVMb2dnaW5nKSB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBjb25maWc/LmxvZ0ZpbGVQYXRoXG4gICAgaWYgKGZpbGVQYXRoKSB7XG4gICAgICAvLyBmaWxlLnRzIHJlcG9ydHMgYSBmYWlsZWQgd3JpdGUgaXRzZWxmIChjb25zb2xlLmVycm9yIG9yIGNvbmZpZy5vbkVycm9yKS5cbiAgICAgIHNldHRsZShcbiAgICAgICAgbG9nVG9GaWxlKHtcbiAgICAgICAgICBkYXRhOiBsb2dEYXRhLFxuICAgICAgICAgIGZpbGVQYXRoLFxuICAgICAgICAgIGxldmVsLFxuICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgcHJlY29tcHV0ZWQsXG4gICAgICAgICAgcmVxdWVzdDogbG9nUmVxdWVzdCxcbiAgICAgICAgICBzdG9yZVxuICAgICAgICB9KVxuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIGlmICghc2lua3MuaGFzSW50ZXJuYWxMb2dnZXIpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHsgbWFpbiwgY29udGV4dExpbmVzIH0gPSBmb3JtYXRMb2dPdXRwdXQoe1xuICAgIGRhdGE6IGxvZ0RhdGEsXG4gICAgZm9ybWF0Q29udGV4dCxcbiAgICBsZXZlbCxcbiAgICBvcHRpb25zLFxuICAgIHByZWNvbXB1dGVkLFxuICAgIHJlcXVlc3Q6IGxvZ1JlcXVlc3QsXG4gICAgc3RvcmVcbiAgfSlcbiAgY29uc3QgbWVzc2FnZSA9XG4gICAgY29udGV4dExpbmVzLmxlbmd0aCA+IDAgPyBgJHttYWlufVxcbiR7Y29udGV4dExpbmVzLmpvaW4oJ1xcbicpfWAgOiBtYWluXG5cbiAgY29uc29sZUZvckxldmVsKGxldmVsKShtZXNzYWdlKVxufVxuXG4vKipcbiAqIFRoZSBzaW5nbGUgbG9nLWVtaXNzaW9uIHBpcGVsaW5lIHNoYXJlZCBieSB0aGUgc3VjY2VzcyBwYXRoIChgbG9nKClgKSBhbmRcbiAqIHRoZSBlcnJvciBwYXRoIChgaGFuZGxlSHR0cEVycm9yKClgKTogZmlsdGVyIGNoZWNrIC0+IGNvbnRleHQgbWVyZ2UgLT5cbiAqIHJlZGFjdCAtPiB0cmFuc3BvcnRzIC0+IGZpbGUgLT4gY29uc29sZSwgYWxsIGdhdGVkIGJ5IHRoZSBzYW1lIGBzaW5rc2AuXG4gKi9cbmV4cG9ydCBjb25zdCBlbWl0ID0gKGlucHV0OiBFbWl0SW5wdXQpOiB2b2lkID0+IHtcbiAgY29uc3Qge1xuICAgIGJ5cGFzc1NhbXBsaW5nLFxuICAgIGRhdGEsXG4gICAgbGV2ZWwsXG4gICAgb3B0aW9ucyxcbiAgICByZXF1ZXN0LFxuICAgIHNhbXBsaW5nLFxuICAgIHNpbmtzLFxuICAgIHN0b3JlXG4gIH0gPSBpbnB1dFxuICBjb25zdCB7IGNvbmZpZyB9ID0gb3B0aW9uc1xuXG4gIGlmIChzaW5rcy5pc0VmZmVjdGl2ZWx5RGlzYWJsZWQgfHwgIXNob3VsZExvZyhsZXZlbCwgY29uZmlnPy5sb2dGaWx0ZXIpKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBpZiAoc2FtcGxpbmcgJiYgIWJ5cGFzc1NhbXBsaW5nKSB7XG4gICAgY29uc3QgZGVjaXNpb24gPSBzYW1wbGluZy5kZWNpZGUobGV2ZWwsIHJlcXVlc3QpXG4gICAgaWYgKGRlY2lzaW9uID09PSAnZHJvcCcpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAoZGVjaXNpb24gPT09ICdidWZmZXInKSB7XG4gICAgICAvLyBCdWZmZXJlZCByYXc6IGNvbnRleHQgbWVyZ2UsIHJlZGFjdGlvbiBhbmQgZm9ybWF0dGluZyBhcmUgZGVmZXJyZWQgdG9cbiAgICAgIC8vIHJlcGxheSwgc28gYSByZXF1ZXN0IHRoYXQgbmV2ZXIgZ2V0cyByZXNjdWVkIHBheXMgYWxtb3N0IG5vdGhpbmcuXG4gICAgICBzYW1wbGluZy5idWZmZXIocmVxdWVzdCwge1xuICAgICAgICBkYXRhLFxuICAgICAgICBkdXJhdGlvbk1zOiBlbGFwc2VkTXMoc3RvcmUuYmVmb3JlVGltZSksXG4gICAgICAgIGxldmVsXG4gICAgICB9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuICB9XG5cbiAgLy8gTG9nZ2luZyBtdXN0IG5ldmVyIGZhaWwgdGhlIHJlcXVlc3QgaXQgZGVzY3JpYmVzLlxuICB0cnkge1xuICAgIHdyaXRlUmVjb3JkKGlucHV0KVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJlcG9ydEZvcm1hdEVycm9yKGVycm9yLCBjb25maWc/Lm9uRXJyb3IpXG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBSZXF1ZXN0Q29udGV4dFN0b3JlIH0gZnJvbSAnLi4vY29udGV4dC9yZXF1ZXN0LWNvbnRleHQnXG5pbXBvcnQgeyBpc1N0YXR1c1Jlc3BvbnNlLCBsZXZlbEZvclN0YXR1cyB9IGZyb20gJy4uL2hlbHBlcnMvc3RhdHVzJ1xuaW1wb3J0IHR5cGUgeyBMb2dMZXZlbCwgT3B0aW9ucywgUmVxdWVzdEluZm8sIFN0b3JlRGF0YSB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgdHlwZSB7IFNhbXBsaW5nUnVudGltZSB9IGZyb20gJy4uL3NhbXBsaW5nJ1xuaW1wb3J0IHsgbm9ybWFsaXplTG9nZ2VkRXJyb3IgfSBmcm9tICcuLi91dGlscy9lcnJvcidcbmltcG9ydCB0eXBlIHsgRm9ybWF0Q29udGV4dCB9IGZyb20gJy4vY3JlYXRlLWxvZ2dlcidcbmltcG9ydCB7IGVtaXQsIHJlcG9ydEZvcm1hdEVycm9yLCBzaG91bGRMb2cgfSBmcm9tICcuL2VtaXQnXG5pbXBvcnQgdHlwZSB7IFNpbmtzIH0gZnJvbSAnLi9lbWl0J1xuXG5jb25zdCBpc0Vycm9yV2l0aFN0YXR1cyA9IChcbiAgdmFsdWU6IHVua25vd25cbik6IHZhbHVlIGlzIHsgc3RhdHVzOiBudW1iZXI7IG1lc3NhZ2U/OiBzdHJpbmcgfSA9PlxuICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gIHZhbHVlICE9PSBudWxsICYmXG4gICdzdGF0dXMnIGluIHZhbHVlICYmXG4gIHR5cGVvZiAodmFsdWUgYXMgeyBzdGF0dXM/OiB1bmtub3duIH0pLnN0YXR1cyA9PT0gJ251bWJlcidcblxuLyoqIFRoZSBzdGF0dXMgYSB0aHJvd24gdmFsdWUgbWFwcyB0bzsgYW55dGhpbmcgd2l0aG91dCBvbmUgaXMgYSA1MDAuICovXG5leHBvcnQgY29uc3QgZXJyb3JTdGF0dXMgPSAoZXJyb3I6IHVua25vd24pOiBudW1iZXIgPT4ge1xuICBpZiAoaXNTdGF0dXNSZXNwb25zZShlcnJvcikpIHtcbiAgICByZXR1cm4gZXJyb3IuY29kZVxuICB9XG4gIHJldHVybiBpc0Vycm9yV2l0aFN0YXR1cyhlcnJvcikgPyBlcnJvci5zdGF0dXMgOiA1MDBcbn1cblxuZXhwb3J0IGNvbnN0IGhhbmRsZUh0dHBFcnJvciA9IChcbiAgcmVxdWVzdDogUmVxdWVzdEluZm8sXG4gIGVycm9yOiB1bmtub3duLFxuICBzdG9yZTogU3RvcmVEYXRhLFxuICBvcHRpb25zOiBPcHRpb25zLFxuICBjb250ZXh0U3RvcmU6IFJlcXVlc3RDb250ZXh0U3RvcmUsXG4gIHNpbmtzOiBTaW5rcyxcbiAgZm9ybWF0Q29udGV4dDogRm9ybWF0Q29udGV4dCxcbiAgc2FtcGxpbmc/OiBTYW1wbGluZ1J1bnRpbWVcbik6IHZvaWQgPT4ge1xuICBjb25zdCB7IGNvbmZpZyB9ID0gb3B0aW9uc1xuXG4gIGNvbnN0IHN0YXR1cyA9IHN0b3JlLnN0YXR1cyA/PyBlcnJvclN0YXR1cyhlcnJvcilcbiAgLy8gQSB0aHJvd24gc3RhdHVzKCkgaXMgbG9nZ2VkIGF0IGl0cyBvd24gY29kZSdzIGxldmVsLiBBbnkgb3RoZXIgdGhyb3duXG4gIC8vIHZhbHVlIGlzIGFuIGVycm9yLCBldmVuIHdoZW4gdGhlIGNsaWVudCBhbHJlYWR5IGdvdCBhIDJ4eCBvciAzeHg6IHRoYXRcbiAgLy8gaXMgYSBib2R5IHRoYXQgZmFpbGVkIGFmdGVyIHRoZSBoZWFkZXJzIHdlbnQgb3V0LlxuICBjb25zdCBsZXZlbDogTG9nTGV2ZWwgPVxuICAgIGlzU3RhdHVzUmVzcG9uc2UoZXJyb3IpIHx8IHN0YXR1cyA+PSA0MDAgPyBsZXZlbEZvclN0YXR1cyhzdGF0dXMpIDogJ0VSUk9SJ1xuXG4gIC8vIE1pcnJvcnMgZW1pdCgpJ3Mgb3duIGdhdGUgY2hlY2ssIGJ1dCBwZXJmb3JtZWQgKmJlZm9yZSogbm9ybWFsaXppbmcgdGhlXG4gIC8vIGVycm9yIHNvIGEgZmlsdGVyZWQtb3V0L2Rpc2FibGVkIGxvZ2dlciBuZXZlciBwYXlzIGZvciB0aGF0IHdvcmsuXG4gIC8vIGVtaXQoKSByZS1jaGVja3MgdGhlIHNhbWUgZ2F0ZSwgd2hpY2ggaXMgY2hlYXAgYW5kIGtlZXBzIHRoaXMgZnVuY3Rpb24gYVxuICAvLyB0aGluLCBwcm92YWJseS1jb3JyZWN0IHdyYXBwZXIgYXJvdW5kIHRoZSBzaGFyZWQgcGlwZWxpbmUuXG4gIGlmIChzaW5rcy5pc0VmZmVjdGl2ZWx5RGlzYWJsZWQgfHwgIXNob3VsZExvZyhsZXZlbCwgY29uZmlnPy5sb2dGaWx0ZXIpKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICAvLyBlbWl0IGd1YXJkcyBpdHMgb3duIHdvcms7IHRoaXMgY292ZXJzIG5vcm1hbGl6aW5nIHRoZSBlcnJvciBiZWZvcmUgaXQuXG4gIHRyeSB7XG4gICAgY29uc3QgeyBlcnJvcjogc2FmZUVycm9yLCBtZXNzYWdlIH0gPSBub3JtYWxpemVMb2dnZWRFcnJvcihcbiAgICAgIGVycm9yLFxuICAgICAgY29uZmlnPy5sb2dFcnJvclBheWxvYWQgPT09IHRydWVcbiAgICApXG5cbiAgICBjb25zdCBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHsgZXJyb3I6IHNhZmVFcnJvciwgbWVzc2FnZSwgc3RhdHVzIH1cblxuICAgIGVtaXQoe1xuICAgICAgY29udGV4dFN0b3JlLFxuICAgICAgZGF0YSxcbiAgICAgIGZvcm1hdENvbnRleHQsXG4gICAgICBsZXZlbCxcbiAgICAgIG9wdGlvbnMsXG4gICAgICByZXF1ZXN0LFxuICAgICAgc2FtcGxpbmcsXG4gICAgICBzaW5rcyxcbiAgICAgIHN0b3JlXG4gICAgfSlcbiAgfSBjYXRjaCAoZmFpbHVyZSkge1xuICAgIHJlcG9ydEZvcm1hdEVycm9yKGZhaWx1cmUsIGNvbmZpZz8ub25FcnJvcilcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IFJlcXVlc3RJZENvbmZpZywgU2lua0Vycm9yQ29udGV4dCB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBjcmVhdGVFcnJvclJlcG9ydGVyIH0gZnJvbSAnLi4vdXRpbHMvcmVwb3J0J1xuXG5jb25zdCBERUZBVUxUX0hFQURFUiA9ICdYLVJlcXVlc3QtSWQnXG5jb25zdCBWQUxJRF9SRVFVRVNUX0lEID0gL15bQS1aYS16MC05Ll8tXXsxLDEyOH0kL3VcbmNvbnN0IFJFUE9SVEVEX0lEX01BWCA9IDY0XG5cbmNvbnN0IHJlcG9ydEdlbmVyYXRvckVycm9yID0gY3JlYXRlRXJyb3JSZXBvcnRlcihcbiAgJ2VucmljaGVyJyxcbiAgJ3JlcXVlc3QgaWQgZ2VuZXJhdG9yIGZhaWxlZCdcbilcblxuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZFJlcXVlc3RJZENvbmZpZyB7XG4gIGVuYWJsZWQ6IGJvb2xlYW5cbiAgZ2VuZXJhdG9yOiAoKSA9PiBzdHJpbmdcbiAgaGVhZGVyOiBzdHJpbmdcbiAgb25FcnJvcj86IChjb250ZXh0OiBTaW5rRXJyb3JDb250ZXh0KSA9PiB2b2lkXG59XG5cbi8qKlxuICogTm9ybWFsaXNlcyB0aGUgYHJlcXVlc3RJZGAgb3B0aW9uIGludG8gYSBjb25jcmV0ZSBjb25maWcgb2JqZWN0LlxuICpcbiAqIC0gYHVuZGVmaW5lZGAgLyBgZmFsc2VgIOKGkiBgbnVsbGAgKGRpc2FibGVkKVxuICogLSBgdHJ1ZWAg4oaSIGRlZmF1bHQgY29uZmlnXG4gKiAtIGBSZXF1ZXN0SWRDb25maWdgIOKGkiBtZXJnZWQgd2l0aCBkZWZhdWx0czsgYGVuYWJsZWQ6IGZhbHNlYCBpbnNpZGUgdGhlIG9iamVjdCBkaXNhYmxlcyB0aGUgZmVhdHVyZVxuICovXG5leHBvcnQgY29uc3QgcmVzb2x2ZVJlcXVlc3RJZENvbmZpZyA9IChcbiAgcmF3PzogYm9vbGVhbiB8IFJlcXVlc3RJZENvbmZpZyxcbiAgb25FcnJvcj86IChjb250ZXh0OiBTaW5rRXJyb3JDb250ZXh0KSA9PiB2b2lkXG4pOiBSZXNvbHZlZFJlcXVlc3RJZENvbmZpZyB8IG51bGwgPT4ge1xuICBpZiAocmF3ID09PSB1bmRlZmluZWQgfHwgcmF3ID09PSBmYWxzZSkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBpZiAocmF3ID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICBnZW5lcmF0b3I6ICgpID0+IGNyeXB0by5yYW5kb21VVUlEKCksXG4gICAgICBoZWFkZXI6IERFRkFVTFRfSEVBREVSLFxuICAgICAgb25FcnJvclxuICAgIH1cbiAgfVxuXG4gIC8vIE9iamVjdCBmb3JtIOKAlCBgZW5hYmxlZGAgZGVmYXVsdHMgdG8gYHRydWVgIHdoZW4gdGhlIG9iamVjdCBpcyBwcm92aWRlZFxuICBpZiAocmF3LmVuYWJsZWQgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZW5hYmxlZDogdHJ1ZSxcbiAgICBnZW5lcmF0b3I6IHJhdy5nZW5lcmF0b3IgPz8gKCgpID0+IGNyeXB0by5yYW5kb21VVUlEKCkpLFxuICAgIGhlYWRlcjogcmF3LmhlYWRlcj8udHJpbSgpIHx8IERFRkFVTFRfSEVBREVSLFxuICAgIG9uRXJyb3JcbiAgfVxufVxuXG4vKipcbiAqIFJlYWRzIGFuIGV4aXN0aW5nIHJlcXVlc3QgSUQgZnJvbSB0aGUgaW5jb21pbmcgcmVxdWVzdCBoZWFkZXIsIG9yIGdlbmVyYXRlcyBhXG4gKiBuZXcgb25lIHVzaW5nIHRoZSBjb25maWd1cmVkIGdlbmVyYXRvci5cbiAqXG4gKiBJbmJvdW5kIHZhbHVlcyBhcmUgdmFsaWRhdGVkIGFnYWluc3QgYFZBTElEX1JFUVVFU1RfSURgIChhbHBoYW51bWVyaWMgcGx1c1xuICogYC5gLCBgX2AsIGAtYCwgMS0xMjggY2hhcnMpIGJlZm9yZSBiZWluZyB0cnVzdGVkIOKAlCByZXF1ZXN0IElEcyBmbG93IGludG8gbG9nXG4gKiBsaW5lcywgcmVzcG9uc2UgaGVhZGVycywgYW5kIGNvbnRleHQgdHJlZXMsIHNvIG1hbGZvcm1lZCBvciBvdmVyc2l6ZWRcbiAqIHZhbHVlcyBhcmUgcmVwbGFjZWQgd2l0aCBhIGZyZXNobHkgZ2VuZXJhdGVkIG9uZSByYXRoZXIgdGhhbiBlY2hvZWQgYmFjay5cbiAqXG4gKiBHZW5lcmF0ZWQgdmFsdWVzIG11c3QgcGFzcyB0aGUgc2FtZSBjaGVjay4gVGhpcyBydW5zIGluIGBvblJlcXVlc3RgLCB3aGVyZVxuICogYSB0aHJvdyB3b3VsZCBsb2cgYW4gZXJyb3IgZm9yIGV2ZXJ5IHJlcXVlc3QsIHNvIGEgZ2VuZXJhdG9yIHRoYXQgdGhyb3dzXG4gKiBvciByZXR1cm5zIGFuIGludmFsaWQgaWQgaXMgcmVwb3J0ZWQgYW5kIHJlcGxhY2VkIHdpdGggYSByYW5kb20gVVVJRC5cbiAqL1xuZXhwb3J0IGNvbnN0IGdldE9yQ3JlYXRlUmVxdWVzdElkID0gKFxuICByZXF1ZXN0OiBSZXF1ZXN0LFxuICBjb25maWc6IFJlc29sdmVkUmVxdWVzdElkQ29uZmlnXG4pOiBzdHJpbmcgPT4ge1xuICBjb25zdCBleGlzdGluZyA9IHJlcXVlc3QuaGVhZGVycy5nZXQoY29uZmlnLmhlYWRlcilcbiAgaWYgKGV4aXN0aW5nICYmIFZBTElEX1JFUVVFU1RfSUQudGVzdChleGlzdGluZykpIHtcbiAgICByZXR1cm4gZXhpc3RpbmdcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgZ2VuZXJhdGVkOiB1bmtub3duID0gY29uZmlnLmdlbmVyYXRvcigpXG4gICAgaWYgKHR5cGVvZiBnZW5lcmF0ZWQgPT09ICdzdHJpbmcnICYmIFZBTElEX1JFUVVFU1RfSUQudGVzdChnZW5lcmF0ZWQpKSB7XG4gICAgICByZXR1cm4gZ2VuZXJhdGVkXG4gICAgfVxuICAgIHJlcG9ydEdlbmVyYXRvckVycm9yKFxuICAgICAgbmV3IEVycm9yKFxuICAgICAgICBgZ2VuZXJhdGVkIHJlcXVlc3QgaWQgaXMgbm90IHZhbGlkOiAke1N0cmluZyhnZW5lcmF0ZWQpLnNsaWNlKDAsIFJFUE9SVEVEX0lEX01BWCl9YFxuICAgICAgKSxcbiAgICAgIGNvbmZpZy5vbkVycm9yXG4gICAgKVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJlcG9ydEdlbmVyYXRvckVycm9yKGVycm9yLCBjb25maWcub25FcnJvcilcbiAgfVxuICByZXR1cm4gY3J5cHRvLnJhbmRvbVVVSUQoKVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IE9wdGlvbnMsIFNpbmtFcnJvckNvbnRleHQgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgc2V0dGxlIH0gZnJvbSAnLi4vdXRpbHMvc2V0dGxlJ1xuaW1wb3J0IHsgZmx1c2hBbGxGaWxlU2lua3MgfSBmcm9tICcuL2ZpbGUtc2luaydcbmltcG9ydCB7IGZsdXNoVHJhbnNwb3J0cyB9IGZyb20gJy4vaW5kZXgnXG5cbi8qKlxuICogUmVzb2x2ZXMgYHRydWVgIHdoZW4gYG1zYCBlbGFwc2VkIGJlZm9yZSBgd29ya2Agc2V0dGxlZCwgYGZhbHNlYCBvdGhlcndpc2UuXG4gKiBBIG5vbi1wb3NpdGl2ZSBgbXNgIG1lYW5zIFwic3RhcnQgdGhlIHdvcmsgYnV0IGRvIG5vdCB3YWl0XCIuXG4gKi9cbmV4cG9ydCBjb25zdCByYWNlV2l0aFRpbWVvdXQgPSBhc3luYyAoXG4gIHdvcms6IFByb21pc2U8dW5rbm93bj4sXG4gIG1zOiBudW1iZXJcbik6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICAvLyBUaGUgc2lua3MgcmVwb3J0IGEgZmFpbGVkIGZsdXNoIHRoZW1zZWx2ZXM7IGhlcmUgaXQgb25seSBjb3VudHMgYXNcbiAgLy8gc2V0dGxlZC5cbiAgY29uc3Qgc2V0dGxlZCA9IHNldHRsZSh3b3JrKVxuXG4gIGlmIChtcyA8PSAwKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGNvbnN0IHRpbWVvdXQgPSBQcm9taXNlLndpdGhSZXNvbHZlcnM8J3RpbWVvdXQnPigpXG4gIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB0aW1lb3V0LnJlc29sdmUoJ3RpbWVvdXQnKSwgbXMpXG4gIC8vIE5ldmVyIGhvbGQgdGhlIGV2ZW50IGxvb3Agb3BlbiBqdXN0IHRvIG9ic2VydmUgYSBmbHVzaCB0aGF0IGlzIHJhY2luZ1xuICAvLyBhbiBleGl0aW5nIHByb2Nlc3MuXG4gIHRpbWVyLnVucmVmPy4oKVxuICBjb25zdCB3aW5uZXIgPSBhd2FpdCBQcm9taXNlLnJhY2UoW3NldHRsZWQsIHRpbWVvdXQucHJvbWlzZV0pXG4gIGNsZWFyVGltZW91dCh0aW1lcilcbiAgcmV0dXJuIHdpbm5lciA9PT0gJ3RpbWVvdXQnXG59XG5cbi8qKlxuICogUmVwb3J0cyBhIHNodXRkb3duIGZsdXNoIHRoYXQgcmFuIG91dCBvZiB0aW1lIOKAlCB0aHJvdWdoIGBvbkVycm9yYCB3aGVuIHRoZVxuICogaG9vayBleGlzdHMsIG90aGVyd2lzZSBvbiBzdGRlcnIsIGJ1dCBuZXZlciBib3RoLlxuICovXG5leHBvcnQgY29uc3QgcmVwb3J0U2h1dGRvd25UaW1lb3V0ID0gKFxuICBvbkVycm9yOiAoKGNvbnRleHQ6IFNpbmtFcnJvckNvbnRleHQpID0+IHZvaWQpIHwgdW5kZWZpbmVkLFxuICB0aW1lb3V0TXM6IG51bWJlclxuKTogdm9pZCA9PiB7XG4gIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKFxuICAgIGBbbG9naXhseXNpYV0gc2h1dGRvd24gZmx1c2ggZGlkIG5vdCBjb21wbGV0ZSB3aXRoaW4gJHt0aW1lb3V0TXN9bXM7IHNvbWUgdHJhbnNwb3J0IG9yIGZpbGUgd3JpdGVzIG1heSBub3QgaGF2ZSBiZWVuIGZsdXNoZWQuYFxuICApXG5cbiAgaWYgKG9uRXJyb3IpIHtcbiAgICB0cnkge1xuICAgICAgb25FcnJvcih7IGVycm9yLCBzaW5rOiAnc2h1dGRvd24nIH0pXG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBTd2FsbG93IGVycm9ycyB0aHJvd24gYnkgdGhlIGhvb2sgaXRzZWxmLlxuICAgIH1cbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnNvbGUuZXJyb3IoZXJyb3IubWVzc2FnZSlcbn1cblxuLyoqIERyYWlucyBldmVyeSB0cmFuc3BvcnQgYW5kIGV2ZXJ5IHJlZ2lzdGVyZWQgZmlsZSBzaW5rLiAqL1xuZXhwb3J0IGNvbnN0IGZsdXNoQWxsID0gYXN5bmMgKG9wdGlvbnM6IE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFtmbHVzaFRyYW5zcG9ydHMob3B0aW9ucyksIGZsdXNoQWxsRmlsZVNpbmtzKCldKVxufVxuIiwKICAgICJpbXBvcnQgeyBrZXlPZiB9IGZyb20gJy4uL2NvbnRleHQvcmVxdWVzdC1jb250ZXh0J1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0Q29udGV4dFN0b3JlIH0gZnJvbSAnLi4vY29udGV4dC9yZXF1ZXN0LWNvbnRleHQnXG5pbXBvcnQgdHlwZSB7IExvZ2dlciwgT3B0aW9ucywgU3RvcmVEYXRhIH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcblxuZXhwb3J0IGludGVyZmFjZSBXZWJTb2NrZXRMaWtlIHtcbiAgcmVhZG9ubHkgZGF0YT86IHsgc3RvcmU/OiB7IGxvZ2dlcj86IExvZ2dlciB9IH1cbiAgcmVhZG9ubHkgaWQ/OiBzdHJpbmdcbiAgcmVhZG9ubHkgcmF3Pzogb2JqZWN0XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV3NIYW5kbGVySG9va3M8XG4gIFRNZXNzYWdlID0gdW5rbm93bixcbiAgVFdzIGV4dGVuZHMgV2ViU29ja2V0TGlrZSA9IFdlYlNvY2tldExpa2Vcbj4ge1xuICBjbG9zZT86ICh3czogVFdzLCBjb2RlPzogbnVtYmVyLCByZWFzb24/OiBzdHJpbmcpID0+IHVua25vd25cbiAgbWVzc2FnZT86ICh3czogVFdzLCBtZXNzYWdlOiBUTWVzc2FnZSkgPT4gdW5rbm93blxuICBvcGVuPzogKHdzOiBUV3MpID0+IHVua25vd25cbn1cblxuLy8gU3ludGhldGljIHJlcXVlc3RzIGFyZSBvbmx5IHJlYWQgKG1ldGhvZC91cmwpIGJ5IHRoZSBsb2cgcGlwZWxpbmUsIG5ldmVyIG11dGF0ZWQsIHNvIGNhY2hpbmdcbi8vIG9uZSBwZXIgcGF0aCBhdm9pZHMgYWxsb2NhdGluZyBhIGZyZXNoIFJlcXVlc3Qgb24gZXZlcnkgV1Mgb3Blbi9tZXNzYWdlL2Nsb3NlIGxvZyBldmVudC5cbmNvbnN0IHdzUmVxdWVzdENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIFJlcXVlc3Q+KClcblxuY29uc3Qgd3NTeW50aGV0aWNSZXF1ZXN0ID0gKHBhdGg6IHN0cmluZyk6IFJlcXVlc3QgPT4ge1xuICBsZXQgcmVxdWVzdCA9IHdzUmVxdWVzdENhY2hlLmdldChwYXRoKVxuICBpZiAoIXJlcXVlc3QpIHtcbiAgICByZXF1ZXN0ID0gbmV3IFJlcXVlc3QoYGh0dHA6Ly9sb2dpeGx5c2lhLmxvY2FsJHtwYXRofWAsIHsgbWV0aG9kOiAnV1MnIH0pXG4gICAgd3NSZXF1ZXN0Q2FjaGUuc2V0KHBhdGgsIHJlcXVlc3QpXG4gIH1cbiAgcmV0dXJuIHJlcXVlc3Rcbn1cblxuY29uc3QgcGF5bG9hZFR5cGVPZiA9IChtZXNzYWdlOiB1bmtub3duKTogc3RyaW5nID0+IHtcbiAgaWYgKG1lc3NhZ2UgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciB8fCBBcnJheUJ1ZmZlci5pc1ZpZXcobWVzc2FnZSkpIHtcbiAgICByZXR1cm4gJ2JpbmFyeSdcbiAgfVxuICBpZiAodHlwZW9mIG1lc3NhZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuICdzdHJpbmcnXG4gIH1cbiAgcmV0dXJuIHR5cGVvZiBtZXNzYWdlXG59XG5cbi8qKiBSdW5zIGBkb25lYCBvbmNlIGBwZW5kaW5nYCBzZXR0bGVzLCB0aGVuIGhhbmRzIHRoZSB2YWx1ZSBvciB0aGUgZmFpbHVyZSBvbiB1bnRvdWNoZWQuICovXG5jb25zdCBzZXR0bGVIb29rID0gYXN5bmMgKFxuICBwZW5kaW5nOiBQcm9taXNlPHVua25vd24+LFxuICBkb25lOiAoKSA9PiB2b2lkXG4pOiBQcm9taXNlPHVua25vd24+ID0+IHtcbiAgbGV0IHZhbHVlOiB1bmtub3duXG4gIHRyeSB7XG4gICAgdmFsdWUgPSBhd2FpdCBwZW5kaW5nXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgZG9uZSgpXG4gICAgdGhyb3cgZXJyb3JcbiAgfVxuICBkb25lKClcbiAgcmV0dXJuIHZhbHVlXG59XG5cbi8qKlxuICogSGFuZHMgdGhlIGhvb2sncyByZXN1bHQgYmFjayB0byBFbHlzaWEgdW50b3VjaGVkLCBzbyBhIHJldHVybmVkIHZhbHVlIGlzXG4gKiBzZW50LCBhIGdlbmVyYXRvciBpcyBpdGVyYXRlZCBhbmQgYSByZWplY3Rpb24gcmVhY2hlcyBFbHlzaWEncyBjYXRjaC4gVGhlXG4gKiBsaWZlY3ljbGUgbGluZSBpcyB3cml0dGVuIG9uY2UgdGhlIHJlc3VsdCBoYXMgc2V0dGxlZC4gVGhlIGBpbnN0YW5jZW9mXG4gKiBQcm9taXNlYCB0ZXN0IGlzIHRoZSBvbmUgRWx5c2lhIGl0c2VsZiB1c2VzIChgd3MvaW5kZXgubWpzOjExNmApLlxuICovXG5jb25zdCBhZnRlckhvb2sgPSAocmVzdWx0OiB1bmtub3duLCBkb25lOiAoKSA9PiB2b2lkKTogdW5rbm93biA9PiB7XG4gIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgcmV0dXJuIHNldHRsZUhvb2socmVzdWx0LCBkb25lKVxuICB9XG4gIGRvbmUoKVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVXc0hhbmRsZXJXcmFwcGVyID0gKFxuICBvcHRpb25zOiBPcHRpb25zLFxuICBsb2dnZXI6IExvZ2dlcixcbiAgY29udGV4dFN0b3JlOiBSZXF1ZXN0Q29udGV4dFN0b3JlXG4pID0+IHtcbiAgY29uc3Qgd3NUaW1pbmdzID0gbmV3IFdlYWtNYXA8b2JqZWN0LCBiaWdpbnQ+KClcblxuICBjb25zdCBsb2dXcyA9IChcbiAgICBsZXZlbDogJ0lORk8nIHwgJ1dBUk5JTkcnIHwgJ0VSUk9SJyxcbiAgICB3czogV2ViU29ja2V0TGlrZSxcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIGV4dHJhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKTogdm9pZCA9PiB7XG4gICAgY29uc3QgYmVmb3JlVGltZSA9IHdzVGltaW5ncy5nZXQoa2V5T2Yod3MpKSA/PyBwcm9jZXNzLmhydGltZS5iaWdpbnQoKVxuICAgIGNvbnN0IHN0b3JlOiBTdG9yZURhdGEgPSB7IGJlZm9yZVRpbWUgfVxuICAgIC8vIFJlYWQtb25seTogaW1tZWRpYXRlbHkgc3ByZWFkIGJlbG93IGludG8gYSBuZXcgb2JqZWN0LCBuZXZlciByZXRhaW5lZCBvciBtdXRhdGVkLlxuICAgIGNvbnN0IGFjY3VtdWxhdGVkID0gY29udGV4dFN0b3JlLnBlZWtDb250ZXh0KHdzKVxuICAgIGNvbnN0IGNvbnRleHQgPVxuICAgICAgT2JqZWN0LmtleXMoYWNjdW11bGF0ZWQpLmxlbmd0aCA+IDAgfHwgZXh0cmFcbiAgICAgICAgPyB7IC4uLmFjY3VtdWxhdGVkLCAuLi5leHRyYSwgd3NJZDogd3MuaWQgfVxuICAgICAgICA6IHsgd3NJZDogd3MuaWQgfVxuXG4gICAgbG9nZ2VyLmxvZyhcbiAgICAgIGxldmVsLFxuICAgICAgd3NTeW50aGV0aWNSZXF1ZXN0KHBhdGgpLFxuICAgICAgeyBjb250ZXh0LCBtZXNzYWdlLCBzdGF0dXM6IDIwMCB9LFxuICAgICAgc3RvcmVcbiAgICApXG4gIH1cblxuICByZXR1cm4gPFxuICAgIFRNZXNzYWdlLFxuICAgIFRXcyBleHRlbmRzIFdlYlNvY2tldExpa2UsXG4gICAgY29uc3QgVEhvb2tzIGV4dGVuZHMgV3NIYW5kbGVySG9va3M8VE1lc3NhZ2UsIFRXcz5cbiAgPihcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgaG9va3M6IFRIb29rc1xuICApOiBUSG9va3MgPT4ge1xuICAgIGlmICh0eXBlb2YgcGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgIFwibG9naXhseXNpYTogd3JhcFdzKHBhdGgsIGhvb2tzKSBleHBlY3RzIHRoZSByb3V0ZSBwYXRoIGZpcnN0LCBlLmcuIHBsdWdpbi53cmFwV3MoJy9jaGF0JywgeyBvcGVuKHdzKSB7fSB9KVwiXG4gICAgICApXG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAuLi5ob29rcyxcbiAgICAgIGNsb3NlKHdzLCBjb2RlLCByZWFzb24pIHtcbiAgICAgICAgY29uc3QgZG9uZSA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgICBpZiAob3B0aW9ucy5jb25maWc/LmRpc2FibGVXZWJTb2NrZXRMb2dnaW5nICE9PSB0cnVlKSB7XG4gICAgICAgICAgICBjb25zdCBleHRyYTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fVxuICAgICAgICAgICAgaWYgKGNvZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBleHRyYS5jb2RlID0gY29kZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlYXNvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIGV4dHJhLnJlYXNvbiA9IHJlYXNvblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbG9nV3MoXG4gICAgICAgICAgICAgICdJTkZPJyxcbiAgICAgICAgICAgICAgd3MsXG4gICAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICAgICdXZWJTb2NrZXQgY2xvc2VkJyxcbiAgICAgICAgICAgICAgT2JqZWN0LmtleXMoZXh0cmEpLmxlbmd0aCA+IDAgPyBleHRyYSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgKVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb250ZXh0U3RvcmUuY2xlYXJDb250ZXh0KHdzKVxuICAgICAgICAgIHdzVGltaW5ncy5kZWxldGUoa2V5T2Yod3MpKVxuICAgICAgICB9XG4gICAgICAgIGxldCByZXN1bHQ6IHVua25vd25cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXN1bHQgPSBob29rcy5jbG9zZT8uKHdzLCBjb2RlLCByZWFzb24pXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgZG9uZSgpXG4gICAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWZ0ZXJIb29rKHJlc3VsdCwgZG9uZSlcbiAgICAgIH0sXG4gICAgICBtZXNzYWdlKHdzLCBtZXNzYWdlKSB7XG4gICAgICAgIGNvbnN0IGRvbmUgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgICAgaWYgKG9wdGlvbnMuY29uZmlnPy5kaXNhYmxlV2ViU29ja2V0TG9nZ2luZyAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgbG9nV3MoJ0lORk8nLCB3cywgcGF0aCwgJ1dlYlNvY2tldCBtZXNzYWdlJywge1xuICAgICAgICAgICAgICBwYXlsb2FkVHlwZTogcGF5bG9hZFR5cGVPZihtZXNzYWdlKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJlc3VsdDogdW5rbm93blxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJlc3VsdCA9IGhvb2tzLm1lc3NhZ2U/Lih3cywgbWVzc2FnZSlcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBkb25lKClcbiAgICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhZnRlckhvb2socmVzdWx0LCBkb25lKVxuICAgICAgfSxcbiAgICAgIG9wZW4od3MpIHtcbiAgICAgICAgd3NUaW1pbmdzLnNldChrZXlPZih3cyksIHByb2Nlc3MuaHJ0aW1lLmJpZ2ludCgpKVxuICAgICAgICBjb25zdCBkb25lID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICAgIGlmIChvcHRpb25zLmNvbmZpZz8uZGlzYWJsZVdlYlNvY2tldExvZ2dpbmcgIT09IHRydWUpIHtcbiAgICAgICAgICAgIGxvZ1dzKCdJTkZPJywgd3MsIHBhdGgsICdXZWJTb2NrZXQgb3BlbmVkJylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJlc3VsdDogdW5rbm93blxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJlc3VsdCA9IGhvb2tzLm9wZW4/Lih3cylcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBkb25lKClcbiAgICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhZnRlckhvb2socmVzdWx0LCBkb25lKVxuICAgICAgfVxuICAgIH0gYXMgVEhvb2tzXG4gIH1cbn1cbiIsCiAgICAiLyoqIFRoZSBjbGllbnQtc2FmZSB2aWV3IG9mIGFuIHtAbGluayBIdHRwRXJyb3J9IOKAlCBldmVyeXRoaW5nIGJ1dCBgaW50ZXJuYWxgLiAqL1xuZXhwb3J0IGludGVyZmFjZSBIdHRwRXJyb3JQYXlsb2FkIHtcbiAgY29kZT86IHN0cmluZ1xuICBmaXg/OiBzdHJpbmdcbiAgbGluaz86IHN0cmluZ1xuICBtZXNzYWdlOiBzdHJpbmdcbiAgc3RhdHVzOiBudW1iZXJcbiAgd2h5Pzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSHR0cEVycm9ySW5pdCB7XG4gIC8qKlxuICAgKiBTdGFibGUsIG1hY2hpbmUtcmVhZGFibGUgaWRlbnRpZmllciB0aGUgY2xpZW50IGNhbiBicmFuY2ggb24sIGUuZy5cbiAgICogYFBBWU1FTlRfREVDTElORURgLiBVbmxpa2UgYG1lc3NhZ2VgLCBpdCBpcyBzYWZlIHRvIGRlcGVuZCBvbjogcmV3b3JkaW5nXG4gICAqIHRoZSBtZXNzYWdlIGRvZXMgbm90IGJyZWFrIGEgY2FsbGVyLlxuICAgKi9cbiAgY29kZT86IHN0cmluZ1xuICAvKiogV2hhdCB0aGUgY2FsbGVyIHNob3VsZCBkbyBhYm91dCBpdCwgaW4gcGxhaW4gbGFuZ3VhZ2UuICovXG4gIGZpeD86IHN0cmluZ1xuICAvKipcbiAgICogRGlhZ25vc3RpY3MgZm9yIHlvdSwgbm90IGZvciB0aGUgY2FsbGVyOiBhIHF1ZXJ5LCBhbiB1cHN0cmVhbSBib2R5LCBhbiBpZC5cbiAgICogTG9nZ2VkIGluIGZ1bGwsIG5ldmVyIHNlcmlhbGl6ZWQgaW50byB0aGUgcmVzcG9uc2UuXG4gICAqL1xuICBpbnRlcm5hbD86IHVua25vd25cbiAgLyoqIERvY3VtZW50YXRpb24gVVJMIGZvciB0aGlzIGZhaWx1cmUuICovXG4gIGxpbms/OiBzdHJpbmdcbiAgLyoqIFdoeSB0aGUgcmVxdWVzdCBmYWlsZWQsIGluIHBsYWluIGxhbmd1YWdlLiAqL1xuICB3aHk/OiBzdHJpbmdcbn1cblxuLyoqXG4gKiBBbiBIVFRQIGVycm9yIGNhcnJ5aW5nIHRoZSBjb250ZXh0IHRoYXQgbWFrZXMgYSBmYWlsdXJlIGFjdGlvbmFibGUuXG4gKlxuICogYGNvZGVgLCBgd2h5YCwgYGZpeGAsIGFuZCBgbGlua2AgYXBwZWFyIGluIGJvdGggdGhlIGxvZyBhbmQgdGhlIHJlc3BvbnNlLlxuICogYGludGVybmFsYCBhcHBlYXJzIG9ubHkgaW4gdGhlIGxvZyDigJQgaXQgaXMgbm9uLWVudW1lcmFibGUgYW5kIGV4Y2x1ZGVkIGZyb21cbiAqIGB0b0pTT04oKWAsIHNvIG5vIHNlcmlhbGl6ZXIgY2FuIGxlYWsgaXQgaW50byBhIHJlc3BvbnNlIGJvZHkuXG4gKlxuICogYGBgdHNcbiAqIHRocm93IG5ldyBIdHRwRXJyb3IoNDAyLCAnQ2FyZCBkZWNsaW5lZCcsIHtcbiAqICAgY29kZTogJ1BBWU1FTlRfREVDTElORUQnLFxuICogICB3aHk6ICdUaGUgaXNzdWluZyBiYW5rIHJlamVjdGVkIHRoZSBjaGFyZ2UuJyxcbiAqICAgZml4OiAnVHJ5IGEgZGlmZmVyZW50IGNhcmQsIG9yIGNvbnRhY3QgeW91ciBiYW5rLicsXG4gKiAgIGxpbms6ICdodHRwczovL2RvY3MuZXhhbXBsZS5jb20vZXJyb3JzL3BheW1lbnQtZGVjbGluZWQnLFxuICogICBpbnRlcm5hbDogeyBnYXRld2F5Q29kZTogJ2RvX25vdF9ob25vcicsIGNoYXJnZUlkIH1cbiAqIH0pXG4gKiBgYGBcbiAqXG4gKiBBIGJhcmUgYG5ldyBIdHRwRXJyb3IoNDA0LCAnTm90IGZvdW5kJylgIGJlaGF2ZXMgZXhhY3RseSBhcyBiZWZvcmU6IHRoZVxuICogcmVzcG9uc2UgYm9keSBpcyB0aGUgcGxhaW4gbWVzc2FnZS4gT25seSBhbiBlcnJvciB0aGF0IGNhcnJpZXMgYXQgbGVhc3Qgb25lXG4gKiBjbGllbnQtZmFjaW5nIGZpZWxkIHJlc3BvbmRzIGFzIEpTT04uXG4gKi9cbi8qKlxuICogU3RhdHVzZXMgdGhlIEZldGNoIHNwZWMgZm9yYmlkcyBhIGJvZHkgb24g4oCUIGBSZXNwb25zZS5qc29uYCB0aHJvd3MgZm9yXG4gKiB0aGVzZSwgYXMgaXQgZG9lcyBmb3IgYW55dGhpbmcgb3V0c2lkZSAyMDAtNTk5LlxuICovXG5jb25zdCBOVUxMX0JPRFlfU1RBVFVTRVMgPSBuZXcgU2V0KFsxMDEsIDEwMywgMjA0LCAyMDUsIDMwNF0pXG5jb25zdCBNSU5fUkVTUE9OU0VfU1RBVFVTID0gMjAwXG5jb25zdCBNQVhfUkVTUE9OU0VfU1RBVFVTID0gNTk5XG5jb25zdCBGQUxMQkFDS19SRVNQT05TRV9TVEFUVVMgPSA1MDBcblxuLyoqIEZhbGxzIGJhY2sgdG8gNTAwIGZvciBhIHN0YXR1cyBgUmVzcG9uc2UuanNvbmAgd291bGQgcmVqZWN0LiAqL1xuY29uc3QgcmVzcG9uc2VTdGF0dXMgPSAoc3RhdHVzOiBudW1iZXIpOiBudW1iZXIgPT5cbiAgc3RhdHVzID49IE1JTl9SRVNQT05TRV9TVEFUVVMgJiZcbiAgc3RhdHVzIDw9IE1BWF9SRVNQT05TRV9TVEFUVVMgJiZcbiAgIU5VTExfQk9EWV9TVEFUVVNFUy5oYXMoc3RhdHVzKVxuICAgID8gc3RhdHVzXG4gICAgOiBGQUxMQkFDS19SRVNQT05TRV9TVEFUVVNcblxuZXhwb3J0IGNsYXNzIEh0dHBFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgcmVhZG9ubHkgY29kZT86IHN0cmluZ1xuICByZWFkb25seSBmaXg/OiBzdHJpbmdcbiAgLyoqIExvZy1vbmx5IGRpYWdub3N0aWNzOyBzZWUgdGhlIGNsYXNzIGRvYy4gKi9cbiAgZGVjbGFyZSByZWFkb25seSBpbnRlcm5hbD86IHVua25vd25cbiAgcmVhZG9ubHkgbGluaz86IHN0cmluZ1xuICByZWFkb25seSBzdGF0dXM6IG51bWJlclxuICAvKipcbiAgICogUHJlc2VudCBvbmx5IHdoZW4gdGhlIGVycm9yIGNhcnJpZXMgYSBjbGllbnQtZmFjaW5nIGZpZWxkLCBzbyBhIHBsYWluXG4gICAqIGBuZXcgSHR0cEVycm9yKDQwNCwgJ05vdCBmb3VuZCcpYCBzdGlsbCByZW5kZXJzIGFzIHRoZSBiYXJlIG1lc3NhZ2UuXG4gICAqIEVseXNpYSBjYWxscyBpdCB0byBidWlsZCB0aGUgcmVzcG9uc2UuXG4gICAqL1xuICBkZWNsYXJlIHJlYWRvbmx5IHRvUmVzcG9uc2U/OiAoKSA9PiBSZXNwb25zZVxuICByZWFkb25seSB3aHk/OiBzdHJpbmdcblxuICBjb25zdHJ1Y3RvcihzdGF0dXM6IG51bWJlciwgbWVzc2FnZTogc3RyaW5nLCBpbml0OiBIdHRwRXJyb3JJbml0ID0ge30pIHtcbiAgICBzdXBlcihtZXNzYWdlKVxuICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzXG4gICAgdGhpcy5jb2RlID0gaW5pdC5jb2RlXG4gICAgdGhpcy5maXggPSBpbml0LmZpeFxuICAgIHRoaXMubGluayA9IGluaXQubGlua1xuICAgIHRoaXMud2h5ID0gaW5pdC53aHlcblxuICAgIC8vIFNldCBleHBsaWNpdGx5IOKAlCBhIG5hdGl2ZSBzdWJjbGFzcyBvdGhlcndpc2UgcmVwb3J0cyB0aGUgZ2VuZXJpY1xuICAgIC8vIFwiRXJyb3JcIiwgYW5kIHRoZSBjb25zdHJ1Y3Rvci1uYW1lIGZhbGxiYWNrIGJyZWFrcyB1bmRlciBtaW5pZmljYXRpb24uXG4gICAgLy8gVGhlbiBtYWRlIG5vbi1lbnVtZXJhYmxlIHRvIG1hdGNoIGBFcnJvci5wcm90b3R5cGUubmFtZWAuXG4gICAgdGhpcy5uYW1lID0gJ0h0dHBFcnJvcidcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ25hbWUnLCB7IGVudW1lcmFibGU6IGZhbHNlIH0pXG5cbiAgICAvLyBOb24tZW51bWVyYWJsZSBzbyBgSlNPTi5zdHJpbmdpZnlgLCBzcHJlYWRzLCBhbmQgZnJhbWV3b3JrIHNlcmlhbGl6ZXJzXG4gICAgLy8gdGhhdCB3YWxrIG93biBrZXlzIGNhbm5vdCBwaWNrIGl0IHVwLiBQcm9wZXJ0eSBhY2Nlc3Mgc3RpbGwgd29ya3MsIHdoaWNoXG4gICAgLy8gaXMgYWxsIHRoZSBsb2cgcGlwZWxpbmUgbmVlZHMuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdpbnRlcm5hbCcsIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgdmFsdWU6IGluaXQuaW50ZXJuYWwsXG4gICAgICB3cml0YWJsZTogZmFsc2VcbiAgICB9KVxuXG4gICAgLy8gRWx5c2lhIHJlbmRlcnMgYSB0aHJvd24gZXJyb3Igd2l0aCBgdG9SZXNwb25zZSgpYCB3aGVuIGl0IGhhcyBvbmUsIGFuZFxuICAgIC8vIGZhbGxzIGJhY2sgdG8gdGhlIHBsYWluIG1lc3NhZ2Ugb3RoZXJ3aXNlLiBEZWZpbmluZyBpdCBvbmx5IHdoZW4gdGhlcmVcbiAgICAvLyBpcyBzb21ldGhpbmcgc3RydWN0dXJlZCB0byBzYXkga2VlcHMgcGxhaW4gZXJyb3JzIGJ5dGUtaWRlbnRpY2FsIHRvXG4gICAgLy8gdGhlaXIgcHJlLWBIdHRwRXJyb3JJbml0YCBiZWhhdmlvdXIuXG4gICAgY29uc3QgaGFzQ2xpZW50RmllbGRzID1cbiAgICAgIGluaXQuY29kZSAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICBpbml0LndoeSAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICBpbml0LmZpeCAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICBpbml0LmxpbmsgIT09IHVuZGVmaW5lZFxuXG4gICAgaWYgKGhhc0NsaWVudEZpZWxkcykge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICd0b1Jlc3BvbnNlJywge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB2YWx1ZTogKCk6IFJlc3BvbnNlID0+XG4gICAgICAgICAgUmVzcG9uc2UuanNvbih0aGlzLnRvSlNPTigpLCB7XG4gICAgICAgICAgICBzdGF0dXM6IHJlc3BvbnNlU3RhdHVzKHRoaXMuc3RhdHVzKVxuICAgICAgICAgIH0pLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIGNsaWVudC1zYWZlIHBheWxvYWQuIGBpbnRlcm5hbGAgaXMgbmV2ZXIgcGFydCBvZiBpdDsgdW5zZXQgZmllbGRzIGFyZVxuICAgKiBgdW5kZWZpbmVkYCBhbmQgc28gYXJlIGRyb3BwZWQgYnkgYEpTT04uc3RyaW5naWZ5YC5cbiAgICovXG4gIHRvSlNPTigpOiBIdHRwRXJyb3JQYXlsb2FkIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29kZTogdGhpcy5jb2RlLFxuICAgICAgZml4OiB0aGlzLmZpeCxcbiAgICAgIGxpbms6IHRoaXMubGluayxcbiAgICAgIG1lc3NhZ2U6IHRoaXMubWVzc2FnZSxcbiAgICAgIHN0YXR1czogdGhpcy5zdGF0dXMsXG4gICAgICB3aHk6IHRoaXMud2h5XG4gICAgfVxuICB9XG59XG4iCiAgXSwKICAibWFwcGluZ3MiOiAibUVBQUEsaUJBQVMsZ0JDQVQsbUJBQVMsaUJBQ1QsMEJBRUEsSUFBTSxHQUFhLG9EQUNiLEdBQWlCLG1DQUNqQixHQUNKLHVFQUVXLEVBQVksQ0FBQyxJQUFtQyxDQUMzRCxHQUFJLE9BQU8sSUFBVSxTQUFVLENBQzdCLEdBQUksQ0FBQyxPQUFPLFNBQVMsQ0FBSyxHQUFLLEdBQVMsRUFDdEMsTUFBVSxNQUFNLGlCQUFpQixHQUFPLEVBRTFDLE9BQU8sRUFHVCxJQUFNLEVBQVUsRUFBTSxLQUFLLEVBQzNCLEdBQUksSUFBWSxHQUFJLENBQ2xCLElBQU0sRUFBVyxPQUFPLENBQU8sRUFDL0IsR0FBSSxPQUFPLFNBQVMsQ0FBUSxFQUFHLENBQzdCLEdBQUksR0FBWSxFQUNkLE1BQVUsTUFBTSxpQkFBaUIsR0FBTyxFQUUxQyxPQUFPLEdBSVgsSUFBTSxFQUFRLEVBQVEsTUFBTSxFQUFVLEVBQ3RDLEdBQUksQ0FBQyxFQUNILE1BQVUsTUFBTSx3QkFBd0IsR0FBTyxFQUdqRCxJQUFNLEVBQVMsT0FBTyxFQUFNLEVBQUUsRUFDeEIsRUFBTyxFQUFNLEdBQUcsWUFBWSxFQUU5QixFQUFPLEtBQ1gsR0FBSSxFQUFLLFdBQVcsR0FBRyxFQUNyQixFQUFPLFFBQ0YsUUFBSSxFQUFLLFdBQVcsR0FBRyxFQUM1QixFQUFPLFdBR1QsSUFBTSxFQUFRLEtBQUssTUFBTSxFQUFTLENBQUksRUFDdEMsR0FBSSxFQUFRLEVBQ1YsTUFBVSxNQUFNLHdCQUF3QixHQUFPLEVBRWpELE9BQU8sR0FHSSxFQUFnQixDQUFDLElBQTBCLENBQ3RELElBQU0sRUFBUSxFQUFNLEtBQUssRUFBRSxNQUFNLEVBQWMsRUFDL0MsR0FB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UUFDeEIsRUFBTSxXQUFhLEVBQU8sVUFDMUIsRUFBTyxhQUFhLENBQU8sRUFDdkIsRUFBaUIsQ0FDbkIsSUFBTSxFQUFZLEdBQXFCLEVBQVMsQ0FBZSxFQUMvRCxFQUFhLGFBQWEsRUFBUyxDQUFFLFdBQVUsQ0FBQyxFQUdoRCxFQUFJLFFBQVEsRUFBZ0IsUUFBVSxFQUd4QyxHQUFJLEVBQ0YsR0FBc0IsRUFBVyxFQUFjLEVBQVMsQ0FBVyxFQUtyRSxHQUFJLEdBQXdCLENBQUMsRUFBTyxRQUNsQyxFQUFjLFVBQVUsRUFBMEIsQ0FBTyxDQUFDLEVBRTdELEVBQ0EsY0FBYyxFQUFHLFVBQVMsTUFBSyxjQUFlLENBQzdDLElBQU0sRUFBUyxFQUFXLENBQU8sRUFDakMsR0FBSSxDQUFDLEVBQU8sUUFBUyxDQUNuQixFQUNFLEVBQ0EsRUFDQSxHQUFxQixFQUFJLE9BQVEsQ0FBUSxFQUN6QyxhQUFvQixTQUFXLEVBQVMsUUFBVSxNQUNwRCxFQUNBLE9BRUYsSUFBTSxFQUFVLEVBQVcsRUFBUyxFQUFRLENBQVEsRUFDcEQsR0FBSSxJQUFZLE9BQ2QsT0FBTyxFQUVWLEVBQ0EsUUFBUSxFQUFHLFVBQVMsV0FBWSxDQUMvQixJQUFNLEVBQVMsRUFBVyxDQUFPLEVBRWpDLEdBREEsRUFBTyxNQUFRLEVBQ1gsRUFBTyxRQUNULE9BRUYsR0FBSSxFQUFPLFFBQVUsU0FBVSxDQUc3QixFQUFPLGdCQUFnQixFQUFTLEVBQU8sQ0FBRSxXQUFZLEVBQU8sU0FBVSxDQUFDLEVBQ3ZFLEVBQWlCLEVBQ2pCLE9BRUYsRUFBZ0IsRUFBUyxFQUFRLEdBQVksQ0FBSyxDQUFDLEVBQ3BELEVBQ0EsZ0JBQWdCLEtBQVcsQ0FDMUIsSUFBUSxVQUFTLE9BQVEsRUFDbkIsRUFBUyxFQUFXLENBQU8sRUFDakMsR0FBSSxFQUFPLFFBQ1QsT0FJRixJQUFNLEVBQVEsVUFBVyxFQUFVLEVBQVEsTUFBUSxPQUNuRCxHQUFJLElBQVUsT0FDWixFQUFPLE1BQVEsRUFFakIsRUFBZ0IsRUFBUyxFQUFRLEVBQWMsRUFBSSxNQUFNLENBQUMsRUFDM0QsRUFDQSxHQUFHLFFBQVEsRUFFZCxPQUFPLE9BQU8sT0FBTyxHQUFRLENBQUUsUUFBTyxDQUFDLEdBUTVCLEdBQWtCLE1BQzdCLEdBQ0UsUUFBUSxJQUErQixDQUFDLElBQ3hCLENBRWxCLEdBREEsTUFBTSxHQUFTLENBQU8sRUFDbEIsRUFDRixNQUFNLFFBQVEsV0FBVyxDQUFDLEdBQWdCLENBQU8sRUFBRyxHQUFrQixDQUFDLENBQUMsR0FpRDdELE1BQ0YsR0FBNEMiLAogICJkZWJ1Z0lkIjogIjkzOEI5RTBGRkY1RUNDRjA2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9