@pori15/logixlysia 0.0.1 → 6.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/index.d.ts +10 -5
- package/dist/index.js +7 -7
- package/package.json +13 -4
- package/src/index.ts +1 -1
- package/src/interfaces.ts +12 -3
- package/src/logger/handle-http-error.ts +1 -0
- package/src/logger/index.ts +15 -1
- package/src/utils/error.ts +0 -2
- package/src/utils/handle-error.ts +289 -289
package/README.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<div align="center">
|
|
2
2
|
<h1><code>🦊</code> Logixlysia</h1>
|
|
3
3
|
<strong>Logixlysia is a logging library for ElysiaJS</strong>
|
|
4
|
-
<img src="
|
|
4
|
+
<img src="https://github.com/PunGrumpy/logixlysia/blob/main/apps/docs/app/opengraph-image.png?raw=true" alt="Logixlysia" width="100%" height="auto" />
|
|
5
5
|
</div>
|
|
6
6
|
|
|
7
7
|
## `📩` Installation
|
package/dist/index.d.ts
CHANGED
|
@@ -36,6 +36,7 @@ declare class ProblemError extends Error {
|
|
|
36
36
|
constructor(type: string | undefined, title: string, status: number, detail?: string, instance?: string, extensions?: Record<string, unknown>);
|
|
37
37
|
toJSON(): ProblemDocument;
|
|
38
38
|
}
|
|
39
|
+
declare const HttpError: {};
|
|
39
40
|
type Code = number | "PROBLEM_ERROR" | "UNKNOWN" | "VALIDATION" | "NOT_FOUND" | "PARSE" | "INTERNAL_SERVER_ERROR" | "INVALID_COOKIE_SIGNATURE" | "INVALID_FILE_TYPE";
|
|
40
41
|
type Pino = PinoLogger<never, boolean>;
|
|
41
42
|
type Request2 = Request2;
|
|
@@ -68,6 +69,13 @@ interface LogRotationConfig {
|
|
|
68
69
|
compress?: boolean;
|
|
69
70
|
compression?: "gzip";
|
|
70
71
|
}
|
|
72
|
+
interface LogFilter {
|
|
73
|
+
/**
|
|
74
|
+
* Array of log levels to allow. If specified, only logs with these levels will be processed.
|
|
75
|
+
* If not specified, all log levels will be allowed.
|
|
76
|
+
*/
|
|
77
|
+
level?: LogLevel[];
|
|
78
|
+
}
|
|
71
79
|
interface Options {
|
|
72
80
|
config?: {
|
|
73
81
|
showStartupMessage?: boolean;
|
|
@@ -78,6 +86,7 @@ interface Options {
|
|
|
78
86
|
translateTime?: string;
|
|
79
87
|
};
|
|
80
88
|
customLogFormat?: string;
|
|
89
|
+
logFilter?: LogFilter;
|
|
81
90
|
transports?: Transport[];
|
|
82
91
|
useTransportsOnly?: boolean;
|
|
83
92
|
disableInternalLogger?: boolean;
|
|
@@ -98,10 +107,6 @@ interface Options {
|
|
|
98
107
|
code: Code;
|
|
99
108
|
}) => ProblemError | unknown;
|
|
100
109
|
}
|
|
101
|
-
declare class HttpError2 extends Error {
|
|
102
|
-
readonly status: number;
|
|
103
|
-
constructor(status: number, message: string);
|
|
104
|
-
}
|
|
105
110
|
interface Logger {
|
|
106
111
|
pino: Pino;
|
|
107
112
|
log: (level: LogLevel, request: Request2, data: Record<string, unknown>, store: StoreData) => void;
|
|
@@ -151,4 +156,4 @@ type Logixlysia = Elysia<"Logixlysia", SingletonBase & {
|
|
|
151
156
|
store: LogixlysiaStore;
|
|
152
157
|
}>;
|
|
153
158
|
declare const logixlysia: (options?: Options) => Logixlysia;
|
|
154
|
-
export { toProblemJson, logixlysia, formatProblemJsonLog, logixlysia as default, Transport, StoreData, ProblemJson, Pino, Options, LogixlysiaStore, LogixlysiaContext, Logixlysia, Logger, LogLevel,
|
|
159
|
+
export { toProblemJson, logixlysia, formatProblemJsonLog, logixlysia as default, Transport, StoreData, ProblemJson, Pino, Options, LogixlysiaStore, LogixlysiaContext, Logixlysia, Logger, LogLevel, HttpError };
|
package/dist/index.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import{Elysia as
|
|
2
|
-
`)};var
|
|
3
|
-
`;await
|
|
4
|
-
${
|
|
5
|
-
`)}function
|
|
1
|
+
import{Elysia as X$}from"elysia";import J0 from"elysia/package.json";var V0=($,X)=>{if($.length>=X)return $.slice(0,X);let w=Math.floor((X-$.length)/2),K=X-$.length-w;return`${" ".repeat(w)}${$}${" ".repeat(K)}`},C=($)=>{let X=`Elysia v${J0.version}`,K=Math.max($.length,X.length)+4,Q=`┌${"─".repeat(K)}┐`,R=`└${"─".repeat(K)}┘`,Z=`│${" ".repeat(K)}│`,G=`│${V0(X,K)}│`,j=`│ ${$}${" ".repeat(Math.max(0,K-$.length-4))} │`;return[Q,Z,G,Z,j,Z,R].join(`
|
|
2
|
+
`)};var c=($,X)=>{if(!(X.config?.showStartupMessage??!0))return;let{port:K,hostname:Q,protocol:R}=$;if(K===void 0||!Q||!R)return;let G=`\uD83E\uDD8A Elysia is running at ${`${R}://${Q}:${K}`}`;if((X.config?.startupMessageFormat??"banner")==="simple"){console.log(G);return}console.log(C(G))};import p from"pino";var U=(...$)=>{let X=typeof $[0]==="string"?{level:$[0],request:$[1],data:$[2],store:$[3],options:$[4]}:$[0],{level:w,request:K,data:Q,store:R,options:Z}=X,G=Z.config?.transports??[];if(G.length===0)return;let j=typeof Q.message==="string"?Q.message:"",_={request:{method:K.method,url:K.url},...Q,beforeTime:R.beforeTime};for(let z of G)try{let J=z.log(w,j,_);if(J&&typeof J.catch==="function")J.catch(()=>{})}catch{}};import{appendFile as U0}from"node:fs/promises";import{dirname as T0}from"node:path";import{promises as j0}from"node:fs";var b=async($)=>{await j0.mkdir($,{recursive:!0})};import{promises as H}from"node:fs";import{promisify as H0}from"node:util";import{gzip as O0}from"node:zlib";import{promises as y}from"node:fs";import{basename as Y0,dirname as D0}from"node:path";var I0=/^(\d+(?:\.\d+)?)(k|kb|m|mb|g|gb)$/i,_0=/^(\d+)(h|d|w)$/i,z0=/\.(\d{4}-\d{2}-\d{2}-\d{2}-\d{2}-\d{2})(?:\.gz)?$/,x=($)=>{if(typeof $==="number")return $;let X=$.trim(),w=Number(X);if(Number.isFinite(w))return w;let K=X.match(I0);if(!K)throw Error(`Invalid size format: ${$}`);let Q=Number(K[1]),R=K[2].toLowerCase(),Z=1024;if(R.startsWith("m"))Z=1048576;else if(R.startsWith("g"))Z=1073741824;return Math.floor(Q*Z)},W0=($)=>{let X=$.trim().match(_0);if(!X)throw Error(`Invalid interval format: ${$}`);let w=Number(X[1]),K=X[2].toLowerCase(),Q=3600000;if(K==="d")Q=86400000;else if(K==="w")Q=604800000;return w*Q},P=($)=>{if(typeof $==="number")return{type:"count",value:$};return{type:"time",value:W0($)}},q=async($,X)=>{try{return(await y.stat($)).size>X}catch{return!1}},f=async($)=>{let X=D0($),w=Y0($),K;try{K=await y.readdir(X)}catch{return[]}return K.filter((Q)=>Q.startsWith(`${w}.`)&&z0.test(Q)).map((Q)=>`${X}/${Q}`)};var F0=H0(O0),B=($)=>String($).padStart(2,"0"),L0=($,X)=>{let w=X.getFullYear(),K=B(X.getMonth()+1),Q=B(X.getDate()),R=B(X.getHours()),Z=B(X.getMinutes()),G=B(X.getSeconds());return`${$}.${w}-${K}-${Q}-${R}-${Z}-${G}`},M0=async($)=>{try{if((await H.stat($)).size===0)return""}catch{return""}let X=L0($,new Date);return await H.rename($,X),X},A0=async($)=>{let X=await H.readFile($),w=await F0(X);await H.writeFile(`${$}.gz`,w),await H.rm($,{force:!0})},h=async($,X)=>{if(X.maxSize===void 0)return!1;let w=x(X.maxSize);return await q($,w)},B0=async($,X)=>{let w=await f($);if(w.length<=X)return;let K=await Promise.all(w.map(async(R)=>({path:R,stat:await H.stat(R)})));K.sort((R,Z)=>Z.stat.mtimeMs-R.stat.mtimeMs);let Q=K.slice(X);await Promise.all(Q.map(({path:R})=>H.rm(R,{force:!0})))},N0=async($,X)=>{let w=await f($);if(w.length===0)return;let K=Date.now(),R=(await Promise.all(w.map(async(Z)=>({path:Z,stat:await H.stat(Z)})))).filter(({stat:Z})=>K-Z.mtimeMs>X);await Promise.all(R.map(({path:Z})=>H.rm(Z,{force:!0})))},v=async($,X)=>{let w=await M0($);if(!w)return;if(X.compress===!0){if((X.compression??"gzip")==="gzip")await A0(w)}if(X.maxFiles!==void 0){let Q=P(X.maxFiles);if(Q.type==="count")await B0($,Q.value);else await N0($,Q.value)}};var T=async(...$)=>{let X=typeof $[0]==="string"?(()=>{let[M,A,F,L,k,S]=$;return{filePath:M,level:A,request:F,data:L,store:k,options:S}})():$[0],{filePath:w,level:K,request:Q,data:R,store:Z,options:G}=X,j=G.config,_=j?.useTransportsOnly===!0,z=j?.disableFileLogging===!0;if(_||z)return;let J=typeof R.message==="string"?R.message:"",V=Z.beforeTime===BigInt(0)?0:Number(process.hrtime.bigint()-Z.beforeTime)/1e6,D=`${K} ${V.toFixed(2)}ms ${Q.method} ${new URL(Q.url).pathname} ${J}
|
|
3
|
+
`;await b(T0(w)),await U0(w,D,{encoding:"utf-8"});let W=j?.logRotation;if(!W)return;if(await h(w,W))await v(w,W)};import Y from"chalk";import{StatusMap as k0}from"elysia";var S0=/^\d+$/,y0=/[_-]+/g,f0=/([a-z0-9])([A-Z])/g,E0=/([A-Z])([A-Z][a-z])/g,C0=/['’]/g,c0=/[^a-z0-9\s]+/g,b0=/\s+/g,m=($)=>{let X=$.trim();if(!X)return"";return X.replace(y0," ").replace(f0,"$1 $2").replace(E0,"$1 $2").replace(C0,"").toLowerCase().replace(c0," ").replace(b0," ").trim()},x0=(()=>{let $=new Map;for(let[X,w]of Object.entries(k0))$.set(m(X),w);return $})(),g=($)=>{if(typeof $==="number"&&Number.isFinite($))return $;if(typeof $==="string"){let X=$.trim();if(S0.test(X))return Number(X);return x0.get(m(X))??500}return 500};var N=($)=>String($).padStart(2,"0"),P0=($)=>String($).padStart(3,"0"),q0=($)=>{let w=$.config?.useColors??!0,K=typeof process<"u"&&process.stdout?.isTTY===!0;return w&&K},h0=($,X)=>{if(!X)return $.toISOString();let w=String($.getFullYear()),K=N($.getMonth()+1),Q=N($.getDate()),R=N($.getHours()),Z=N($.getMinutes()),G=N($.getSeconds()),j=P0($.getMilliseconds());return X.replaceAll("yyyy",w).replaceAll("mm",K).replaceAll("dd",Q).replaceAll("HH",R).replaceAll("MM",Z).replaceAll("ss",G).replaceAll("SSS",j)},v0=($)=>{let X=$.headers.get("x-forwarded-for");if(X)return X.split(",")[0]?.trim()??"";return $.headers.get("x-real-ip")??""},m0=($,X)=>{if(!X)return $;if($==="ERROR")return Y.bgRed.black($);if($==="WARNING")return Y.bgYellow.black($);if($==="DEBUG")return Y.bgBlue.black($);return Y.bgGreen.black($)},g0=($,X)=>{if(!X)return $;let w=$.toUpperCase();if(w==="GET")return Y.green.bold(w);if(w==="POST")return Y.blue.bold(w);if(w==="PUT")return Y.yellow.bold(w);if(w==="PATCH")return Y.yellowBright.bold(w);if(w==="DELETE")return Y.red.bold(w);if(w==="OPTIONS")return Y.cyan.bold(w);if(w==="HEAD")return Y.greenBright.bold(w);if(w==="TRACE")return Y.magenta.bold(w);if(w==="CONNECT")return Y.cyanBright.bold(w);return Y.white.bold(w)},n0=($,X)=>{if(!X)return $;let w=Number.parseInt($,10);if(!Number.isFinite(w))return $;if(w>=500)return Y.red($);if(w>=400)return Y.yellow($);if(w>=300)return Y.cyan($);if(w>=200)return Y.green($);return Y.gray($)},d0=($,X)=>{if(!X)return $;return Y.gray($)},p0=($,X)=>{if(!X)return $;return Y.bgHex("#FFA500").black($)},u0=($,X)=>{if(!X)return $;return Y.whiteBright($)},i0=($)=>{if(typeof $==="object"&&$!==null)return JSON.stringify($);return""},n=({level:$,request:X,data:w,store:K,options:Q})=>{let R=Q.config,Z=q0(Q),G=R?.customLogFormat??"\uD83E\uDD8A {now} {level} {duration} {method} {pathname} {status} {message} {ip} {context}",j=new Date,_=String(j.getTime()),z=h0(j,R?.timestamp?.translateTime),J=p0(z,Z),V=typeof w.message==="string"?w.message:"",D=K.beforeTime===BigInt(0)?0:Number(process.hrtime.bigint()-K.beforeTime)/1e6,W=new URL(X.url).pathname,O=w.status,M=O===null||O===void 0?200:g(O),A=String(M),F=R?.ip===!0?v0(X):"",L=i0(w.context),k=m0($,Z),S=g0(X.method,Z),E=u0(W,Z),Z0=n0(A,Z),G0=d0(`${D.toFixed(2)}ms`,Z);return G.replaceAll("{now}",J).replaceAll("{epoch}",_).replaceAll("{level}",k).replaceAll("{duration}",G0).replaceAll("{method}",S).replaceAll("{pathname}",E).replaceAll("{path}",E).replaceAll("{status}",Z0).replaceAll("{message}",V).replaceAll("{ip}",F).replaceAll("{context}",L)};var d=($,X,w,K)=>{let Q=K.config,R="ERROR",Z=X.toJSON(),G={status:X.status,message:X.detail||X.title,...Z};if(U({level:"ERROR",request:$,data:G,store:w,options:K}),!(Q?.useTransportsOnly||Q?.disableFileLogging)){let V=Q?.logFilePath;if(V)T({filePath:V,level:"ERROR",request:$,data:G,store:w,options:K}).catch(()=>{})}if(Q?.useTransportsOnly||Q?.disableInternalLogger)return;let j="";if(Q?.timestamp)j=`[${new Date().toISOString()}] `;let _=typeof $==="string"?"REQ":$.method,z=typeof $==="string"?$:$.url,J;try{J=z.includes("://")?new URL(z).pathname:z}catch{J=z}console.error(`${j}ERROR ${_} ${J} ${X.status} - ${X.title}`)};var u=($={})=>{let X=$.config,w=X?.pino,{prettyPrint:K,...Q}=w??{},Z=K===!0&&Q.transport===void 0?p.transport({target:"pino-pretty",options:{colorize:process.stdout?.isTTY===!0,translateTime:X?.timestamp?.translateTime,messageKey:Q.messageKey,errorKey:Q.errorKey}}):Q.transport,G=p({...Q,level:Q.level??"info",messageKey:Q.messageKey,errorKey:Q.errorKey,transport:Z}),j=(J,V)=>{if(!V?.level||V.level.length===0)return!0;return V.level.includes(J)},_=(J,V,D,W)=>{if(!j(J,X?.logFilter))return;U({level:J,request:V,data:D,store:W,options:$});let O=X?.useTransportsOnly===!0,M=X?.disableInternalLogger===!0,A=X?.disableFileLogging===!0;if(!(O||A)){let L=X?.logFilePath;if(L)T({filePath:L,level:J,request:V,data:D,store:W,options:$}).catch(()=>{})}if(O||M)return;let F=n({level:J,request:V,data:D,store:W,options:$});switch(J){case"DEBUG":{console.debug(F);break}case"INFO":{console.info(F);break}case"WARNING":{console.warn(F);break}case"ERROR":{console.error(F);break}default:{console.log(F);break}}},z=(J,V,D,W)=>{let O={beforeTime:process.hrtime.bigint()};_(J,V,{message:D,context:W},O)};return{pino:G,log:_,handleHttpError:(J,V,D)=>{d(J,V,D,$)},debug:(J,V,D)=>{z("DEBUG",J,V,D)},info:(J,V,D)=>{z("INFO",J,V,D)},warn:(J,V,D)=>{z("WARNING",J,V,D)},error:(J,V,D)=>{z("ERROR",J,V,D)}}};class I extends Error{status;title;type;detail;instance;extensions;constructor($="about:blank",X,w,K,Q,R={}){super(K||X);Object.setPrototypeOf(this,I.prototype),this.status=w,this.title=X,this.type=$,this.detail=K,this.instance=Q,this.extensions=R}toJSON(){return{type:this.type,title:this.title,status:this.status,...this.detail?{detail:this.detail}:{},...this.instance?{instance:this.instance}:{},...this.extensions}}}class i extends I{constructor($,X){super("https://httpstatuses.com/400","Bad Request",400,$,void 0,X)}}class l extends I{constructor($,X){super("https://httpstatuses.com/401","Unauthorized",401,$,void 0,X)}}class a extends I{constructor($,X){super("https://httpstatuses.com/403","Forbidden",403,$,void 0,X)}}class s extends I{constructor($,X){super("https://httpstatuses.com/404","Not Found",404,$,void 0,X)}}class o extends I{constructor($,X){super("https://httpstatuses.com/409","Conflict",409,$,void 0,X)}}class r extends I{constructor($,X){super("https://httpstatuses.com/402","Payment Required",402,$,void 0,X)}}class t extends I{constructor($,X){super("https://httpstatuses.com/405","Method Not Allowed",405,$,void 0,X)}}class e extends I{constructor($,X){super("https://httpstatuses.com/406","Not Acceptable",406,$,void 0,X)}}class $0 extends I{constructor($,X){super("https://httpstatuses.com/500","Internal Server Error",500,$,void 0,X)}}class X0 extends I{constructor($,X){super("https://httpstatuses.com/501","Not Implemented",501,$,void 0,X)}}class w0 extends I{constructor($,X){super("https://httpstatuses.com/502","Bad Gateway",502,$,void 0,X)}}class K0 extends I{constructor($,X){super("https://httpstatuses.com/503","Service Unavailable",503,$,void 0,X)}}class Q0 extends I{constructor($,X){super("https://httpstatuses.com/504","Gateway Timeout",504,$,void 0,X)}}var l0={BadRequest:i,Unauthorized:l,PaymentRequired:r,Forbidden:a,NotFound:s,MethodNotAllowed:t,NotAcceptable:e,Conflict:o,InternalServerError:$0,NotImplemented:X0,BadGateway:w0,ServiceUnavailable:K0,GatewayTimeout:Q0};var a0={400:"Bad Request",401:"Unauthorized",403:"Forbidden",404:"Not Found",409:"Conflict",422:"Unprocessable Entity",500:"Internal Server Error",503:"Service Unavailable"},R0=($,X,w,K="about:blank")=>{if($ instanceof I)return $.instance?$:new I($.type,$.title,$.status,$.detail,w,$.extensions);let Q=500,R="Internal Server Error",Z=$ instanceof Error?$.message:String($),G={};switch(X){case"VALIDATION":Q=400,R="Validation Failed",G={errors:$.all||[]};break;case"NOT_FOUND":Q=404,R="Resource Not Found";break;case"PARSE":Q=400,R="Invalid Payload",Z="The request body could not be parsed as valid JSON.";break;case"INVALID_COOKIE_SIGNATURE":Q=401,R="Invalid Credentials";break;default:if(typeof $?.status==="number")Q=$.status,R=a0[Q]||"Unknown Error";break}return new I(K==="about:blank"?K:`${K}/${X}`,R,Q,Z,w,G)},s0=($)=>typeof $==="object"&&$!==null&&("status"in $)&&typeof $.status==="number",o0=($)=>$ instanceof Error||typeof $==="object"&&$!==null&&("message"in $)&&typeof $.message==="string";function r0($,X,w={}){if(w.format){let G=w.format($,X);if(G)return G}let K=new URL(X.url),Q=s0($)?$.status:500,R=o0($)?$.message:String($??"Unknown Error"),Z={type:w.typeBaseUrl?`${w.typeBaseUrl}/${Q}`:"about:blank",title:t0(Q),status:Q,detail:R,instance:K.pathname+K.search};if(typeof $==="object"&&$!==null){let G=$;if("type"in G||"title"in G){if(G.type)Z.type=G.type;if(G.title)Z.title=G.title}for(let[j,_]of Object.entries(G))if(!["status","message","type","title","detail","instance"].includes(j))Z[j]=_}return Z}function t0($){return{400:"Bad Request",401:"Unauthorized",402:"Payment Required",403:"Forbidden",404:"Not Found",405:"Method Not Allowed",406:"Not Acceptable",407:"Proxy Authentication Required",408:"Request Timeout",409:"Conflict",410:"Gone",411:"Length Required",412:"Precondition Failed",413:"Payload Too Large",414:"URI Too Long",415:"Unsupported Media Type",416:"Range Not Satisfiable",417:"Expectation Failed",418:"I'm a teapot",422:"Unprocessable Entity",423:"Locked",424:"Failed Dependency",425:"Too Early",426:"Upgrade Required",428:"Precondition Required",429:"Too Many Requests",431:"Request Header Fields Too Large",451:"Unavailable For Legal Reasons",500:"Internal Server Error",501:"Not Implemented",502:"Bad Gateway",503:"Service Unavailable",504:"Gateway Timeout",505:"HTTP Version Not Supported",506:"Variant Also Negotiates",507:"Insufficient Storage",508:"Loop Detected",510:"Not Extended",511:"Network Authentication Required"}[$]||"Error"}function e0($,X){let w=new URL(X.url),K=[],Q=$.status.toString(),R=$$($.status);if(K.push(`
|
|
4
|
+
${R} [HTTP ${Q}] ${X.method} ${w.pathname}`),K.push(` Type: ${$.type}`),K.push(` Title: ${$.title}`),$.detail)K.push(` Detail: ${$.detail}`);if($.instance)K.push(` Instance: ${$.instance}`);let Z=Object.entries($).filter(([G])=>!["type","title","status","detail","instance"].includes(G));if(Z.length>0){K.push(" Extensions:");for(let[G,j]of Z)K.push(` ${G}: ${JSON.stringify(j)}`)}return K.join(`
|
|
5
|
+
`)}function $$($){if($>=500)return"\uD83D\uDD34";if($>=400)return"\uD83D\uDFE1";if($>=300)return"\uD83D\uDD35";if($>=200)return"\uD83D\uDFE2";return"⚪"}var w$=($={})=>{let X=new WeakSet,w=u($),K={...w,debug:(R,Z,G)=>{X.add(R),w.debug(R,Z,G)},info:(R,Z,G)=>{X.add(R),w.info(R,Z,G)},warn:(R,Z,G)=>{X.add(R),w.warn(R,Z,G)},error:(R,Z,G)=>{X.add(R),w.error(R,Z,G)}};return new X$({name:"Logixlysia",detail:{description:"Logixlysia is a plugin for Elysia that provides a logger and pino logger.",tags:["logging","pino"]}}).state("logger",K).state("pino",K.pino).state("beforeTime",BigInt(0)).onStart(({server:R})=>{if(R)c(R,$)}).onRequest(({store:R})=>{R.beforeTime=process.hrtime.bigint()}).onAfterHandle(({request:R,set:Z,store:G})=>{if(X.has(R))return;let j=typeof Z.status==="number"?Z.status:200,_="INFO";if(j>=500)_="ERROR";else if(j>=400)_="WARNING";K.log(_,R,{status:j},G)}).onError(({request:R,error:Z,code:G,path:j,store:_,set:z})=>{let J=$.transform?$.transform(Z,{request:R,code:G}):Z,V=R0(J,G,j,$.config?.error?.problemJson?.typeBaseUrl);return K.handleHttpError(R,V,_,$),z.status=V.status,z.headers["content-type"]="application/problem+json",V.toJSON()}).as("scoped")},l$=w$;export{r0 as toProblemJson,w$ as logixlysia,e0 as formatProblemJsonLog,l$ as default,l0 as HttpError};
|
|
6
6
|
|
|
7
|
-
//# debugId=
|
|
8
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjXFxpbmRleC50cyIsICJzcmNcXGV4dGVuc2lvbnNcXGJhbm5lci50cyIsICJzcmNcXGV4dGVuc2lvbnNcXGluZGV4LnRzIiwgInNyY1xcbG9nZ2VyXFxpbmRleC50cyIsICJzcmNcXG91dHB1dFxcaW5kZXgudHMiLCAic3JjXFxvdXRwdXRcXGZpbGUudHMiLCAic3JjXFxvdXRwdXRcXGZzLnRzIiwgInNyY1xcb3V0cHV0XFxyb3RhdGlvbi1tYW5hZ2VyLnRzIiwgInNyY1xcdXRpbHNcXHJvdGF0aW9uLnRzIiwgInNyY1xcbG9nZ2VyXFxjcmVhdGUtbG9nZ2VyLnRzIiwgInNyY1xcaGVscGVyc1xcc3RhdHVzLnRzIiwgInNyY1xcbG9nZ2VyXFxoYW5kbGUtaHR0cC1lcnJvci50cyIsICJzcmNcXEVycm9yXFxlcnJvcnMudHMiLCAic3JjXFx1dGlsc1xcaGFuZGxlLWVycm9yLnRzIiwgInNyY1xcaW50ZXJmYWNlcy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICJpbXBvcnQgeyBFbHlzaWEsIHR5cGUgU2luZ2xldG9uQmFzZSB9IGZyb20gJ2VseXNpYSdcclxuaW1wb3J0IHsgc3RhcnRTZXJ2ZXIgfSBmcm9tICcuL2V4dGVuc2lvbnMnXHJcbmltcG9ydCB0eXBlIHsgTG9naXhseXNpYVN0b3JlLCBPcHRpb25zIH0gZnJvbSAnLi9pbnRlcmZhY2VzJ1xyXG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICcuL2xvZ2dlcidcclxuaW1wb3J0IHsgbm9ybWFsaXplVG9Qcm9ibGVtIH0gZnJvbSAnLi91dGlscy9oYW5kbGUtZXJyb3InXHJcblxyXG5leHBvcnQgdHlwZSBMb2dpeGx5c2lhID0gRWx5c2lhPFxyXG4gICdMb2dpeGx5c2lhJyxcclxuICBTaW5nbGV0b25CYXNlICYgeyBzdG9yZTogTG9naXhseXNpYVN0b3JlIH1cclxuPlxyXG5cclxuZXhwb3J0IGNvbnN0IGxvZ2l4bHlzaWEgPSAob3B0aW9uczogT3B0aW9ucyA9IHt9KTogTG9naXhseXNpYSA9PiB7XHJcbiAgY29uc3QgZGlkQ3VzdG9tTG9nID0gbmV3IFdlYWtTZXQ8UmVxdWVzdD4oKVxyXG4gIGNvbnN0IGJhc2VMb2dnZXIgPSBjcmVhdGVMb2dnZXIob3B0aW9ucylcclxuICBjb25zdCBsb2dnZXIgPSB7XHJcbiAgICAuLi5iYXNlTG9nZ2VyLFxyXG4gICAgZGVidWc6IChcclxuICAgICAgcmVxdWVzdDogUmVxdWVzdCxcclxuICAgICAgbWVzc2FnZTogc3RyaW5nLFxyXG4gICAgICBjb250ZXh0PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cclxuICAgICkgPT4ge1xyXG4gICAgICBkaWRDdXN0b21Mb2cuYWRkKHJlcXVlc3QpXHJcbiAgICAgIGJhc2VMb2dnZXIuZGVidWcocmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dClcclxuICAgIH0sXHJcbiAgICBpbmZvOiAoXHJcbiAgICAgIHJlcXVlc3Q6IFJlcXVlc3QsXHJcbiAgICAgIG1lc3NhZ2U6IHN0cmluZyxcclxuICAgICAgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XHJcbiAgICApID0+IHtcclxuICAgICAgZGlkQ3VzdG9tTG9nLmFkZChyZXF1ZXN0KVxyXG4gICAgICBiYXNlTG9nZ2VyLmluZm8ocmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dClcclxuICAgIH0sXHJcbiAgICB3YXJuOiAoXHJcbiAgICAgIHJlcXVlc3Q6IFJlcXVlc3QsXHJcbiAgICAgIG1lc3NhZ2U6IHN0cmluZyxcclxuICAgICAgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XHJcbiAgICApID0+IHtcclxuICAgICAgZGlkQ3VzdG9tTG9nLmFkZChyZXF1ZXN0KVxyXG4gICAgICBiYXNlTG9nZ2VyLndhcm4ocmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dClcclxuICAgIH0sXHJcbiAgICBlcnJvcjogKFxyXG4gICAgICByZXF1ZXN0OiBSZXF1ZXN0LFxyXG4gICAgICBtZXNzYWdlOiBzdHJpbmcsXHJcbiAgICAgIGNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxyXG4gICAgKSA9PiB7XHJcbiAgICAgIGRpZEN1c3RvbUxvZy5hZGQocmVxdWVzdClcclxuICAgICAgYmFzZUxvZ2dlci5lcnJvcihyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29uc3QgYXBwID0gbmV3IEVseXNpYSh7XHJcbiAgICBuYW1lOiAnTG9naXhseXNpYScsXHJcbiAgICBkZXRhaWw6IHtcclxuICAgICAgZGVzY3JpcHRpb246XHJcbiAgICAgICAgJ0xvZ2l4bHlzaWEgaXMgYSBwbHVnaW4gZm9yIEVseXNpYSB0aGF0IHByb3ZpZGVzIGEgbG9nZ2VyIGFuZCBwaW5vIGxvZ2dlci4nLFxyXG4gICAgICB0YWdzOiBbJ2xvZ2dpbmcnLCAncGlubyddXHJcbiAgICB9XHJcbiAgfSlcclxuXHJcbiAgcmV0dXJuIChcclxuICAgIGFwcFxyXG4gICAgICAuc3RhdGUoJ2xvZ2dlcicsIGxvZ2dlcilcclxuICAgICAgLnN0YXRlKCdwaW5vJywgbG9nZ2VyLnBpbm8pXHJcbiAgICAgIC5zdGF0ZSgnYmVmb3JlVGltZScsIEJpZ0ludCgwKSlcclxuICAgICAgLm9uU3RhcnQoKHsgc2VydmVyIH0pID0+IHtcclxuICAgICAgICBpZiAoc2VydmVyKSB7XHJcbiAgICAgICAgICBzdGFydFNlcnZlcihzZXJ2ZXIsIG9wdGlvbnMpXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgICAub25SZXF1ZXN0KCh7IHN0b3JlIH0pID0+IHtcclxuICAgICAgICBzdG9yZS5iZWZvcmVUaW1lID0gcHJvY2Vzcy5ocnRpbWUuYmlnaW50KClcclxuICAgICAgfSlcclxuICAgICAgLm9uQWZ0ZXJIYW5kbGUoKHsgcmVxdWVzdCwgc2V0LCBzdG9yZSB9KSA9PiB7XHJcbiAgICAgICAgaWYgKGRpZEN1c3RvbUxvZy5oYXMocmVxdWVzdCkpIHtcclxuICAgICAgICAgIHJldHVyblxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gdHlwZW9mIHNldC5zdGF0dXMgPT09ICdudW1iZXInID8gc2V0LnN0YXR1cyA6IDIwMFxyXG4gICAgICAgIGxldCBsZXZlbDogJ0lORk8nIHwgJ1dBUk5JTkcnIHwgJ0VSUk9SJyA9ICdJTkZPJ1xyXG4gICAgICAgIGlmIChzdGF0dXMgPj0gNTAwKSB7XHJcbiAgICAgICAgICBsZXZlbCA9ICdFUlJPUidcclxuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA+PSA0MDApIHtcclxuICAgICAgICAgIGxldmVsID0gJ1dBUk5JTkcnXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsb2dnZXIubG9nKGxldmVsLCByZXF1ZXN0LCB7IHN0YXR1cyB9LCBzdG9yZSlcclxuICAgICAgfSlcclxuICAgICAgLm9uRXJyb3IoKHsgcmVxdWVzdCwgZXJyb3IsY29kZSwgcGF0aCxzdG9yZSxzZXQgfSkgPT4ge1xyXG4gICAgICAgIC8vIGxvZ2dlci5oYW5kbGVIdHRwRXJyb3IocmVxdWVzdCwgZXJyb3IsIHN0b3JlKVxyXG5cclxuICAgICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICAvLyBQaGFzZSAxOiBUcmFuc2Zvcm0gKOi9rOaNoilcclxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICBsZXQgcmVzdWx0ID0gb3B0aW9ucy50cmFuc2Zvcm0gPyBvcHRpb25zLnRyYW5zZm9ybShlcnJvciwgeyByZXF1ZXN0LCBjb2RlIH0pIDogZXJyb3JcclxuXHJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgLy8gUGhhc2UgMjogTm9ybWFsaXphdGlvbiAo6KeE6IyD5YyWKVxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gIC8vIOe7n+S4gOi9rOS4uiBQcm9ibGVtRXJyb3Ig5a6e5L6LXHJcbiAgY29uc3QgcHJvYmxlbSA9IG5vcm1hbGl6ZVRvUHJvYmxlbShyZXN1bHQsIGNvZGUsIHBhdGgsIG9wdGlvbnMuY29uZmlnPy5lcnJvcj8ucHJvYmxlbUpzb24/LnR5cGVCYXNlVXJsKVxyXG5cclxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICAvLyBQaGFzZSAzOiBMb2dnaW5nICjml6Xlv5cpXHJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgLy8g6LCD55So5LiK6Z2i5pS56YCg5ZCO55qE5Ye95pWw77yM5a6D546w5Zyo5Y+q6LSf6LSj6K6w5b2V77yM5LiN6LSf6LSj6YC76L6R5Yik5patXHJcbiAgbG9nZ2VyLmhhbmRsZUh0dHBFcnJvcihyZXF1ZXN0LCBwcm9ibGVtLCBzdG9yZSwgb3B0aW9ucylcclxuXHJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgLy8gUGhhc2UgNDogUmVzcG9uc2UgKOWTjeW6lClcclxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICAvLyDnu5/kuIDorr7nva4gSGVhZGVyIOWSjCBTdGF0dXNcclxuICBzZXQuc3RhdHVzID0gcHJvYmxlbS5zdGF0dXNcclxuICBzZXQuaGVhZGVyc1snY29udGVudC10eXBlJ10gPSAnYXBwbGljYXRpb24vcHJvYmxlbStqc29uJ1xyXG5cclxuICAvLyDov5Tlm57nrKblkIggUkZDIOagh+WHhueahCBKU09OXHJcbiAgcmV0dXJuIHByb2JsZW0udG9KU09OKClcclxuXHJcblxyXG4gICAgICB9KVxyXG4gICAgICAvLyBFbnN1cmUgcGx1Z2luIGxpZmVjeWNsZSBob29rcyAob25SZXF1ZXN0L29uQWZ0ZXJIYW5kbGUvb25FcnJvcikgYXBwbHkgdG8gdGhlIHBhcmVudCBhcHAuXHJcbiAgICAgIC5hcygnc2NvcGVkJykgYXMgdW5rbm93biBhcyBMb2dpeGx5c2lhXHJcbiAgKVxyXG59XHJcblxyXG5leHBvcnQgdHlwZSB7XHJcbiAgTG9nZ2VyLFxyXG4gIExvZ2l4bHlzaWFDb250ZXh0LFxyXG4gIExvZ2l4bHlzaWFTdG9yZSxcclxuICBMb2dMZXZlbCxcclxuICBPcHRpb25zLFxyXG4gIFBpbm8sXHJcbiAgU3RvcmVEYXRhLFxyXG4gIFRyYW5zcG9ydCxcclxufSBmcm9tICcuL2ludGVyZmFjZXMnXHJcblxyXG5leHBvcnQgeyBIdHRwRXJyb3IgfSBmcm9tICcuL2ludGVyZmFjZXMnXHJcbmV4cG9ydCB7IHRvUHJvYmxlbUpzb24sIGZvcm1hdFByb2JsZW1Kc29uTG9nIH0gZnJvbSAnLi91dGlscy9oYW5kbGUtZXJyb3InXHJcbmV4cG9ydCB0eXBlIHsgUHJvYmxlbUpzb24gfSBmcm9tICcuL3V0aWxzL2hhbmRsZS1lcnJvcidcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGxvZ2l4bHlzaWFcclxuXHJcbiIsCiAgICAiaW1wb3J0IGVseXNpYVBrZyBmcm9tICdlbHlzaWEvcGFja2FnZS5qc29uJ1xyXG5cclxuY29uc3QgY2VudGVyVGV4dCA9ICh0ZXh0OiBzdHJpbmcsIHdpZHRoOiBudW1iZXIpOiBzdHJpbmcgPT4ge1xyXG4gIGlmICh0ZXh0Lmxlbmd0aCA+PSB3aWR0aCkge1xyXG4gICAgcmV0dXJuIHRleHQuc2xpY2UoMCwgd2lkdGgpXHJcbiAgfVxyXG5cclxuICBjb25zdCBsZWZ0ID0gTWF0aC5mbG9vcigod2lkdGggLSB0ZXh0Lmxlbmd0aCkgLyAyKVxyXG4gIGNvbnN0IHJpZ2h0ID0gd2lkdGggLSB0ZXh0Lmxlbmd0aCAtIGxlZnRcclxuICByZXR1cm4gYCR7JyAnLnJlcGVhdChsZWZ0KX0ke3RleHR9JHsnICcucmVwZWF0KHJpZ2h0KX1gXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCByZW5kZXJCYW5uZXIgPSAobWVzc2FnZTogc3RyaW5nKTogc3RyaW5nID0+IHtcclxuICBjb25zdCB2ZXJzaW9uTGluZSA9IGBFbHlzaWEgdiR7ZWx5c2lhUGtnLnZlcnNpb259YFxyXG4gIGNvbnN0IGNvbnRlbnRXaWR0aCA9IE1hdGgubWF4KG1lc3NhZ2UubGVuZ3RoLCB2ZXJzaW9uTGluZS5sZW5ndGgpXHJcbiAgY29uc3QgaW5uZXJXaWR0aCA9IGNvbnRlbnRXaWR0aCArIDQgLy8gMiBzcGFjZXMgcGFkZGluZyBvbiBib3RoIHNpZGVzXHJcblxyXG4gIGNvbnN0IHRvcCA9IGDilIwkeyfilIAnLnJlcGVhdChpbm5lcldpZHRoKX3ilJBgXHJcbiAgY29uc3QgYm90ID0gYOKUlCR7J+KUgCcucmVwZWF0KGlubmVyV2lkdGgpfeKUmGBcclxuICBjb25zdCBlbXB0eSA9IGDilIIkeycgJy5yZXBlYXQoaW5uZXJXaWR0aCl94pSCYFxyXG5cclxuICBjb25zdCB2ZXJzaW9uUm93ID0gYOKUgiR7Y2VudGVyVGV4dCh2ZXJzaW9uTGluZSwgaW5uZXJXaWR0aCl94pSCYFxyXG4gIGNvbnN0IG1lc3NhZ2VSb3cgPSBg4pSCICAke21lc3NhZ2V9JHsnICcucmVwZWF0KE1hdGgubWF4KDAsIGlubmVyV2lkdGggLSBtZXNzYWdlLmxlbmd0aCAtIDQpKX0gIOKUgmBcclxuXHJcbiAgcmV0dXJuIFt0b3AsIGVtcHR5LCB2ZXJzaW9uUm93LCBlbXB0eSwgbWVzc2FnZVJvdywgZW1wdHksIGJvdF0uam9pbignXFxuJylcclxufVxyXG4iLAogICAgImltcG9ydCB0eXBlIHsgT3B0aW9ucyB9IGZyb20gJy4uL2ludGVyZmFjZXMnXHJcbmltcG9ydCB7IHJlbmRlckJhbm5lciB9IGZyb20gJy4vYmFubmVyJ1xyXG5cclxuZXhwb3J0IGNvbnN0IHN0YXJ0U2VydmVyID0gKFxyXG4gIHNlcnZlcjogeyBwb3J0PzogbnVtYmVyOyBob3N0bmFtZT86IHN0cmluZzsgcHJvdG9jb2w/OiBzdHJpbmcgfCBudWxsIH0sXHJcbiAgb3B0aW9uczogT3B0aW9uc1xyXG4pOiB2b2lkID0+IHtcclxuICBjb25zdCBzaG93U3RhcnR1cE1lc3NhZ2UgPSBvcHRpb25zLmNvbmZpZz8uc2hvd1N0YXJ0dXBNZXNzYWdlID8/IHRydWVcclxuICBpZiAoIXNob3dTdGFydHVwTWVzc2FnZSkge1xyXG4gICAgcmV0dXJuXHJcbiAgfVxyXG5cclxuICBjb25zdCB7IHBvcnQsIGhvc3RuYW1lLCBwcm90b2NvbCB9ID0gc2VydmVyXHJcbiAgaWYgKHBvcnQgPT09IHVuZGVmaW5lZCB8fCAhaG9zdG5hbWUgfHwgIXByb3RvY29sKSB7XHJcbiAgICByZXR1cm5cclxuICB9XHJcblxyXG4gIGNvbnN0IHVybCA9IGAke3Byb3RvY29sfTovLyR7aG9zdG5hbWV9OiR7cG9ydH1gXHJcbiAgY29uc3QgbWVzc2FnZSA9IGDwn6aKIEVseXNpYSBpcyBydW5uaW5nIGF0ICR7dXJsfWBcclxuXHJcbiAgY29uc3QgZm9ybWF0ID0gb3B0aW9ucy5jb25maWc/LnN0YXJ0dXBNZXNzYWdlRm9ybWF0ID8/ICdiYW5uZXInXHJcbiAgaWYgKGZvcm1hdCA9PT0gJ3NpbXBsZScpIHtcclxuICAgIGNvbnNvbGUubG9nKG1lc3NhZ2UpXHJcbiAgICByZXR1cm5cclxuICB9XHJcblxyXG4gIGNvbnNvbGUubG9nKHJlbmRlckJhbm5lcihtZXNzYWdlKSlcclxufVxyXG4iLAogICAgImltcG9ydCBwaW5vIGZyb20gJ3Bpbm8nXHJcbmltcG9ydCB0eXBlIHtcclxuICBMb2dnZXIsXHJcbiAgTG9nTGV2ZWwsXHJcbiAgT3B0aW9ucyxcclxuICBQaW5vLFxyXG4gIFN0b3JlRGF0YVxyXG59IGZyb20gJy4uL2ludGVyZmFjZXMnXHJcbmltcG9ydCB7IGxvZ1RvVHJhbnNwb3J0cyB9IGZyb20gJy4uL291dHB1dCdcclxuaW1wb3J0IHsgbG9nVG9GaWxlIH0gZnJvbSAnLi4vb3V0cHV0L2ZpbGUnXHJcbmltcG9ydCB7IGZvcm1hdExpbmUgfSBmcm9tICcuL2NyZWF0ZS1sb2dnZXInXHJcbmltcG9ydCB7IGhhbmRsZUh0dHBFcnJvciB9IGZyb20gJy4vaGFuZGxlLWh0dHAtZXJyb3InXHJcblxyXG5leHBvcnQgY29uc3QgY3JlYXRlTG9nZ2VyID0gKG9wdGlvbnM6IE9wdGlvbnMgPSB7fSk6IExvZ2dlciA9PiB7XHJcbiAgY29uc3QgY29uZmlnID0gb3B0aW9ucy5jb25maWdcclxuXHJcbiAgY29uc3QgcGlub0NvbmZpZyA9IGNvbmZpZz8ucGlub1xyXG4gIGNvbnN0IHsgcHJldHR5UHJpbnQsIC4uLnBpbm9PcHRpb25zIH0gPSBwaW5vQ29uZmlnID8/IHt9XHJcblxyXG4gIGNvbnN0IHNob3VsZFByZXR0eVByaW50ID1cclxuICAgIHByZXR0eVByaW50ID09PSB0cnVlICYmIHBpbm9PcHRpb25zLnRyYW5zcG9ydCA9PT0gdW5kZWZpbmVkXHJcblxyXG4gIGNvbnN0IHRyYW5zcG9ydCA9IHNob3VsZFByZXR0eVByaW50XHJcbiAgICA/IHBpbm8udHJhbnNwb3J0KHtcclxuICAgICAgICB0YXJnZXQ6ICdwaW5vLXByZXR0eScsXHJcbiAgICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgICAgY29sb3JpemU6IHByb2Nlc3Muc3Rkb3V0Py5pc1RUWSA9PT0gdHJ1ZSxcclxuICAgICAgICAgIHRyYW5zbGF0ZVRpbWU6IGNvbmZpZz8udGltZXN0YW1wPy50cmFuc2xhdGVUaW1lLFxyXG4gICAgICAgICAgbWVzc2FnZUtleTogcGlub09wdGlvbnMubWVzc2FnZUtleSxcclxuICAgICAgICAgIGVycm9yS2V5OiBwaW5vT3B0aW9ucy5lcnJvcktleVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgIDogcGlub09wdGlvbnMudHJhbnNwb3J0XHJcblxyXG4gIGNvbnN0IHBpbm9Mb2dnZXI6IFBpbm8gPSBwaW5vKHtcclxuICAgIC4uLnBpbm9PcHRpb25zLFxyXG4gICAgbGV2ZWw6IHBpbm9PcHRpb25zLmxldmVsID8/ICdpbmZvJyxcclxuICAgIG1lc3NhZ2VLZXk6IHBpbm9PcHRpb25zLm1lc3NhZ2VLZXksXHJcbiAgICBlcnJvcktleTogcGlub09wdGlvbnMuZXJyb3JLZXksXHJcbiAgICB0cmFuc3BvcnRcclxuICB9KVxyXG5cclxuICBjb25zdCBsb2cgPSAoXHJcbiAgICBsZXZlbDogTG9nTGV2ZWwsXHJcbiAgICByZXF1ZXN0OiBSZXF1ZXN0LFxyXG4gICAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXHJcbiAgICBzdG9yZTogU3RvcmVEYXRhXHJcbiAgKTogdm9pZCA9PiB7XHJcbiAgICBsb2dUb1RyYW5zcG9ydHMoeyBsZXZlbCwgcmVxdWVzdCwgZGF0YSwgc3RvcmUsIG9wdGlvbnMgfSlcclxuXHJcbiAgICBjb25zdCB1c2VUcmFuc3BvcnRzT25seSA9IGNvbmZpZz8udXNlVHJhbnNwb3J0c09ubHkgPT09IHRydWVcclxuICAgIGNvbnN0IGRpc2FibGVJbnRlcm5hbExvZ2dlciA9IGNvbmZpZz8uZGlzYWJsZUludGVybmFsTG9nZ2VyID09PSB0cnVlXHJcbiAgICBjb25zdCBkaXNhYmxlRmlsZUxvZ2dpbmcgPSBjb25maWc/LmRpc2FibGVGaWxlTG9nZ2luZyA9PT0gdHJ1ZVxyXG5cclxuICAgIGlmICghKHVzZVRyYW5zcG9ydHNPbmx5IHx8IGRpc2FibGVGaWxlTG9nZ2luZykpIHtcclxuICAgICAgY29uc3QgZmlsZVBhdGggPSBjb25maWc/LmxvZ0ZpbGVQYXRoXHJcbiAgICAgIGlmIChmaWxlUGF0aCkge1xyXG4gICAgICAgIGxvZ1RvRmlsZSh7IGZpbGVQYXRoLCBsZXZlbCwgcmVxdWVzdCwgZGF0YSwgc3RvcmUsIG9wdGlvbnMgfSkuY2F0Y2goXHJcbiAgICAgICAgICAoKSA9PiB7XHJcbiAgICAgICAgICAgIC8vIElnbm9yZSBlcnJvcnNcclxuICAgICAgICAgIH1cclxuICAgICAgICApXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAodXNlVHJhbnNwb3J0c09ubHkgfHwgZGlzYWJsZUludGVybmFsTG9nZ2VyKSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG1lc3NhZ2UgPSBmb3JtYXRMaW5lKHsgbGV2ZWwsIHJlcXVlc3QsIGRhdGEsIHN0b3JlLCBvcHRpb25zIH0pXHJcblxyXG4gICAgc3dpdGNoIChsZXZlbCkge1xyXG4gICAgICBjYXNlICdERUJVRyc6IHtcclxuICAgICAgICBjb25zb2xlLmRlYnVnKG1lc3NhZ2UpXHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgfVxyXG4gICAgICBjYXNlICdJTkZPJzoge1xyXG4gICAgICAgIGNvbnNvbGUuaW5mbyhtZXNzYWdlKVxyXG4gICAgICAgIGJyZWFrXHJcbiAgICAgIH1cclxuICAgICAgY2FzZSAnV0FSTklORyc6IHtcclxuICAgICAgICBjb25zb2xlLndhcm4obWVzc2FnZSlcclxuICAgICAgICBicmVha1xyXG4gICAgICB9XHJcbiAgICAgIGNhc2UgJ0VSUk9SJzoge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSlcclxuICAgICAgICBicmVha1xyXG4gICAgICB9XHJcbiAgICAgIGRlZmF1bHQ6IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhtZXNzYWdlKVxyXG4gICAgICAgIGJyZWFrXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbnN0IGxvZ1dpdGhDb250ZXh0ID0gKFxyXG4gICAgbGV2ZWw6IExvZ0xldmVsLFxyXG4gICAgcmVxdWVzdDogUmVxdWVzdCxcclxuICAgIG1lc3NhZ2U6IHN0cmluZyxcclxuICAgIGNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxyXG4gICk6IHZvaWQgPT4ge1xyXG4gICAgY29uc3Qgc3RvcmU6IFN0b3JlRGF0YSA9IHsgYmVmb3JlVGltZTogcHJvY2Vzcy5ocnRpbWUuYmlnaW50KCkgfVxyXG4gICAgbG9nKGxldmVsLCByZXF1ZXN0LCB7IG1lc3NhZ2UsIGNvbnRleHQgfSwgc3RvcmUpXHJcbiAgfVxyXG5cclxuICByZXR1cm4ge1xyXG4gICAgcGlubzogcGlub0xvZ2dlcixcclxuICAgIGxvZyxcclxuICAgIGhhbmRsZUh0dHBFcnJvcjogKHJlcXVlc3QsIGVycm9yLCBzdG9yZSkgPT4ge1xyXG4gICAgICBoYW5kbGVIdHRwRXJyb3IocmVxdWVzdCwgZXJyb3IsIHN0b3JlLCBvcHRpb25zKVxyXG4gICAgfSxcclxuICAgIGRlYnVnOiAocmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dCkgPT4ge1xyXG4gICAgICBsb2dXaXRoQ29udGV4dCgnREVCVUcnLCByZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KVxyXG4gICAgfSxcclxuICAgIGluZm86IChyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KSA9PiB7XHJcbiAgICAgIGxvZ1dpdGhDb250ZXh0KCdJTkZPJywgcmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dClcclxuICAgIH0sXHJcbiAgICB3YXJuOiAocmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dCkgPT4ge1xyXG4gICAgICBsb2dXaXRoQ29udGV4dCgnV0FSTklORycsIHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXHJcbiAgICB9LFxyXG4gICAgZXJyb3I6IChyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KSA9PiB7XHJcbiAgICAgIGxvZ1dpdGhDb250ZXh0KCdFUlJPUicsIHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBMb2dMZXZlbCwgT3B0aW9ucywgUmVxdWVzdCwgU3RvcmVEYXRhIH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcclxuXHJcbmludGVyZmFjZSBMb2dUb1RyYW5zcG9ydHNJbnB1dCB7XHJcbiAgbGV2ZWw6IExvZ0xldmVsXHJcbiAgcmVxdWVzdDogUmVxdWVzdFxyXG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XHJcbiAgc3RvcmU6IFN0b3JlRGF0YVxyXG4gIG9wdGlvbnM6IE9wdGlvbnNcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGxvZ1RvVHJhbnNwb3J0cyA9IChcclxuICAuLi5hcmdzOlxyXG4gICAgfCBbTG9nVG9UcmFuc3BvcnRzSW5wdXRdXHJcbiAgICB8IFtMb2dMZXZlbCwgUmVxdWVzdCwgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIFN0b3JlRGF0YSwgT3B0aW9uc11cclxuKTogdm9pZCA9PiB7XHJcbiAgY29uc3QgaW5wdXQ6IExvZ1RvVHJhbnNwb3J0c0lucHV0ID1cclxuICAgIHR5cGVvZiBhcmdzWzBdID09PSAnc3RyaW5nJ1xyXG4gICAgICA/IHtcclxuICAgICAgICAgIGxldmVsOiBhcmdzWzBdLFxyXG4gICAgICAgICAgcmVxdWVzdDogYXJnc1sxXSxcclxuICAgICAgICAgIGRhdGE6IGFyZ3NbMl0sXHJcbiAgICAgICAgICBzdG9yZTogYXJnc1szXSxcclxuICAgICAgICAgIG9wdGlvbnM6IGFyZ3NbNF1cclxuICAgICAgICB9XHJcbiAgICAgIDogYXJnc1swXVxyXG5cclxuICBjb25zdCB7IGxldmVsLCByZXF1ZXN0LCBkYXRhLCBzdG9yZSwgb3B0aW9ucyB9ID0gaW5wdXRcclxuICBjb25zdCB0cmFuc3BvcnRzID0gb3B0aW9ucy5jb25maWc/LnRyYW5zcG9ydHMgPz8gW11cclxuICBpZiAodHJhbnNwb3J0cy5sZW5ndGggPT09IDApIHtcclxuICAgIHJldHVyblxyXG4gIH1cclxuXHJcbiAgY29uc3QgbWVzc2FnZSA9IHR5cGVvZiBkYXRhLm1lc3NhZ2UgPT09ICdzdHJpbmcnID8gZGF0YS5tZXNzYWdlIDogJydcclxuICBjb25zdCBtZXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHtcclxuICAgIHJlcXVlc3Q6IHtcclxuICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcclxuICAgICAgdXJsOiByZXF1ZXN0LnVybFxyXG4gICAgfSxcclxuICAgIC4uLmRhdGEsXHJcbiAgICBiZWZvcmVUaW1lOiBzdG9yZS5iZWZvcmVUaW1lXHJcbiAgfVxyXG5cclxuICBmb3IgKGNvbnN0IHRyYW5zcG9ydCBvZiB0cmFuc3BvcnRzKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCByZXN1bHQgPSB0cmFuc3BvcnQubG9nKGxldmVsLCBtZXNzYWdlLCBtZXRhKVxyXG4gICAgICBpZiAoXHJcbiAgICAgICAgcmVzdWx0ICYmXHJcbiAgICAgICAgdHlwZW9mIChyZXN1bHQgYXMgeyBjYXRjaD86IHVua25vd24gfSkuY2F0Y2ggPT09ICdmdW5jdGlvbidcclxuICAgICAgKSB7XHJcbiAgICAgICAgOyhyZXN1bHQgYXMgUHJvbWlzZTx2b2lkPikuY2F0Y2goKCkgPT4ge1xyXG4gICAgICAgICAgLy8gSWdub3JlIGVycm9yc1xyXG4gICAgICAgIH0pXHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2gge1xyXG4gICAgICAvLyBUcmFuc3BvcnQgZmFpbHVyZXMgbXVzdCBuZXZlciBjcmFzaCBhcHBsaWNhdGlvbiBsb2dnaW5nLlxyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLAogICAgImltcG9ydCB7IGFwcGVuZEZpbGUgfSBmcm9tICdub2RlOmZzL3Byb21pc2VzJ1xyXG5pbXBvcnQgeyBkaXJuYW1lIH0gZnJvbSAnbm9kZTpwYXRoJ1xyXG5pbXBvcnQgdHlwZSB7IExvZ0xldmVsLCBPcHRpb25zLCBSZXF1ZXN0SW5mbywgU3RvcmVEYXRhIH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcclxuaW1wb3J0IHsgZW5zdXJlRGlyIH0gZnJvbSAnLi9mcydcclxuaW1wb3J0IHsgcGVyZm9ybVJvdGF0aW9uLCBzaG91bGRSb3RhdGUgfSBmcm9tICcuL3JvdGF0aW9uLW1hbmFnZXInXHJcblxyXG5pbnRlcmZhY2UgTG9nVG9GaWxlSW5wdXQge1xyXG4gIGZpbGVQYXRoOiBzdHJpbmdcclxuICBsZXZlbDogTG9nTGV2ZWxcclxuICByZXF1ZXN0OiBSZXF1ZXN0SW5mb1xyXG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XHJcbiAgc3RvcmU6IFN0b3JlRGF0YVxyXG4gIG9wdGlvbnM6IE9wdGlvbnNcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGxvZ1RvRmlsZSA9IGFzeW5jIChcclxuICAuLi5hcmdzOlxyXG4gICAgfCBbTG9nVG9GaWxlSW5wdXRdXHJcbiAgICB8IFtcclxuICAgICAgICBzdHJpbmcsXHJcbiAgICAgICAgTG9nTGV2ZWwsXHJcbiAgICAgICAgUmVxdWVzdEluZm8sXHJcbiAgICAgICAgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXHJcbiAgICAgICAgU3RvcmVEYXRhLFxyXG4gICAgICAgIE9wdGlvbnNcclxuICAgICAgXVxyXG4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcclxuICBjb25zdCBpbnB1dDogTG9nVG9GaWxlSW5wdXQgPVxyXG4gICAgdHlwZW9mIGFyZ3NbMF0gPT09ICdzdHJpbmcnXHJcbiAgICAgID8gKCgpID0+IHtcclxuICAgICAgICAgIGNvbnN0IFtcclxuICAgICAgICAgICAgZmlsZVBhdGhBcmcsXHJcbiAgICAgICAgICAgIGxldmVsQXJnLFxyXG4gICAgICAgICAgICByZXF1ZXN0QXJnLFxyXG4gICAgICAgICAgICBkYXRhQXJnLFxyXG4gICAgICAgICAgICBzdG9yZUFyZyxcclxuICAgICAgICAgICAgb3B0aW9uc0FyZ1xyXG4gICAgICAgICAgXSA9IGFyZ3MgYXMgW1xyXG4gICAgICAgICAgICBzdHJpbmcsXHJcbiAgICAgICAgICAgIExvZ0xldmVsLFxyXG4gICAgICAgICAgICBSZXF1ZXN0SW5mbyxcclxuICAgICAgICAgICAgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXHJcbiAgICAgICAgICAgIFN0b3JlRGF0YSxcclxuICAgICAgICAgICAgT3B0aW9uc1xyXG4gICAgICAgICAgXVxyXG4gICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgZmlsZVBhdGg6IGZpbGVQYXRoQXJnLFxyXG4gICAgICAgICAgICBsZXZlbDogbGV2ZWxBcmcsXHJcbiAgICAgICAgICAgIHJlcXVlc3Q6IHJlcXVlc3RBcmcsXHJcbiAgICAgICAgICAgIGRhdGE6IGRhdGFBcmcsXHJcbiAgICAgICAgICAgIHN0b3JlOiBzdG9yZUFyZyxcclxuICAgICAgICAgICAgb3B0aW9uczogb3B0aW9uc0FyZ1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pKClcclxuICAgICAgOiBhcmdzWzBdXHJcblxyXG4gIGNvbnN0IHsgZmlsZVBhdGgsIGxldmVsLCByZXF1ZXN0LCBkYXRhLCBzdG9yZSwgb3B0aW9ucyB9ID0gaW5wdXRcclxuICBjb25zdCBjb25maWcgPSBvcHRpb25zLmNvbmZpZ1xyXG4gIGNvbnN0IHVzZVRyYW5zcG9ydHNPbmx5ID0gY29uZmlnPy51c2VUcmFuc3BvcnRzT25seSA9PT0gdHJ1ZVxyXG4gIGNvbnN0IGRpc2FibGVGaWxlTG9nZ2luZyA9IGNvbmZpZz8uZGlzYWJsZUZpbGVMb2dnaW5nID09PSB0cnVlXHJcbiAgaWYgKHVzZVRyYW5zcG9ydHNPbmx5IHx8IGRpc2FibGVGaWxlTG9nZ2luZykge1xyXG4gICAgcmV0dXJuXHJcbiAgfVxyXG5cclxuICBjb25zdCBtZXNzYWdlID0gdHlwZW9mIGRhdGEubWVzc2FnZSA9PT0gJ3N0cmluZycgPyBkYXRhLm1lc3NhZ2UgOiAnJ1xyXG4gIGNvbnN0IGR1cmF0aW9uTXMgPVxyXG4gICAgc3RvcmUuYmVmb3JlVGltZSA9PT0gQmlnSW50KDApXHJcbiAgICAgID8gMFxyXG4gICAgICA6IE51bWJlcihwcm9jZXNzLmhydGltZS5iaWdpbnQoKSAtIHN0b3JlLmJlZm9yZVRpbWUpIC8gMV8wMDBfMDAwXHJcblxyXG4gIGNvbnN0IGxpbmUgPSBgJHtsZXZlbH0gJHtkdXJhdGlvbk1zLnRvRml4ZWQoMil9bXMgJHtyZXF1ZXN0Lm1ldGhvZH0gJHtuZXcgVVJMKHJlcXVlc3QudXJsKS5wYXRobmFtZX0gJHttZXNzYWdlfVxcbmBcclxuXHJcbiAgYXdhaXQgZW5zdXJlRGlyKGRpcm5hbWUoZmlsZVBhdGgpKVxyXG4gIGF3YWl0IGFwcGVuZEZpbGUoZmlsZVBhdGgsIGxpbmUsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSlcclxuXHJcbiAgY29uc3Qgcm90YXRpb24gPSBjb25maWc/LmxvZ1JvdGF0aW9uXHJcbiAgaWYgKCFyb3RhdGlvbikge1xyXG4gICAgcmV0dXJuXHJcbiAgfVxyXG5cclxuICBjb25zdCBzaG91bGQgPSBhd2FpdCBzaG91bGRSb3RhdGUoZmlsZVBhdGgsIHJvdGF0aW9uKVxyXG4gIGlmIChzaG91bGQpIHtcclxuICAgIGF3YWl0IHBlcmZvcm1Sb3RhdGlvbihmaWxlUGF0aCwgcm90YXRpb24pXHJcbiAgfVxyXG59XHJcbiIsCiAgICAiaW1wb3J0IHsgcHJvbWlzZXMgYXMgZnMgfSBmcm9tICdub2RlOmZzJ1xyXG5cclxuZXhwb3J0IGNvbnN0IGVuc3VyZURpciA9IGFzeW5jIChkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+ID0+IHtcclxuICBhd2FpdCBmcy5ta2RpcihkaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxyXG59XHJcbiIsCiAgICAiaW1wb3J0IHsgcHJvbWlzZXMgYXMgZnMgfSBmcm9tICdub2RlOmZzJ1xyXG5pbXBvcnQgeyBwcm9taXNpZnkgfSBmcm9tICdub2RlOnV0aWwnXHJcbmltcG9ydCB7IGd6aXAgfSBmcm9tICdub2RlOnpsaWInXHJcbmltcG9ydCB0eXBlIHsgTG9nUm90YXRpb25Db25maWcgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xyXG5pbXBvcnQge1xyXG4gIGdldFJvdGF0ZWRGaWxlcyxcclxuICBwYXJzZVJldGVudGlvbixcclxuICBwYXJzZVNpemUsXHJcbiAgc2hvdWxkUm90YXRlQnlTaXplXHJcbn0gZnJvbSAnLi4vdXRpbHMvcm90YXRpb24nXHJcblxyXG5jb25zdCBnemlwQXN5bmMgPSBwcm9taXNpZnkoZ3ppcClcclxuXHJcbmNvbnN0IHBhZDIgPSAodmFsdWU6IG51bWJlcik6IHN0cmluZyA9PiBTdHJpbmcodmFsdWUpLnBhZFN0YXJ0KDIsICcwJylcclxuXHJcbmV4cG9ydCBjb25zdCBnZXRSb3RhdGVkRmlsZU5hbWUgPSAoZmlsZVBhdGg6IHN0cmluZywgZGF0ZTogRGF0ZSk6IHN0cmluZyA9PiB7XHJcbiAgY29uc3QgeXl5eSA9IGRhdGUuZ2V0RnVsbFllYXIoKVxyXG4gIGNvbnN0IG1tID0gcGFkMihkYXRlLmdldE1vbnRoKCkgKyAxKVxyXG4gIGNvbnN0IGRkID0gcGFkMihkYXRlLmdldERhdGUoKSlcclxuICBjb25zdCBISCA9IHBhZDIoZGF0ZS5nZXRIb3VycygpKVxyXG4gIGNvbnN0IE1NID0gcGFkMihkYXRlLmdldE1pbnV0ZXMoKSlcclxuICBjb25zdCBzcyA9IHBhZDIoZGF0ZS5nZXRTZWNvbmRzKCkpXHJcbiAgcmV0dXJuIGAke2ZpbGVQYXRofS4ke3l5eXl9LSR7bW19LSR7ZGR9LSR7SEh9LSR7TU19LSR7c3N9YFxyXG59XHJcblxyXG5leHBvcnQgY29uc3Qgcm90YXRlRmlsZSA9IGFzeW5jIChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcclxuICB0cnkge1xyXG4gICAgY29uc3Qgc3RhdCA9IGF3YWl0IGZzLnN0YXQoZmlsZVBhdGgpXHJcbiAgICBpZiAoc3RhdC5zaXplID09PSAwKSB7XHJcbiAgICAgIHJldHVybiAnJ1xyXG4gICAgfVxyXG4gIH0gY2F0Y2gge1xyXG4gICAgcmV0dXJuICcnXHJcbiAgfVxyXG5cclxuICBjb25zdCByb3RhdGVkID0gZ2V0Um90YXRlZEZpbGVOYW1lKGZpbGVQYXRoLCBuZXcgRGF0ZSgpKVxyXG4gIGF3YWl0IGZzLnJlbmFtZShmaWxlUGF0aCwgcm90YXRlZClcclxuICByZXR1cm4gcm90YXRlZFxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgY29tcHJlc3NGaWxlID0gYXN5bmMgKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+ID0+IHtcclxuICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoZmlsZVBhdGgpXHJcbiAgY29uc3QgY29tcHJlc3NlZCA9IGF3YWl0IGd6aXBBc3luYyhjb250ZW50KVxyXG4gIGF3YWl0IGZzLndyaXRlRmlsZShgJHtmaWxlUGF0aH0uZ3pgLCBjb21wcmVzc2VkKVxyXG4gIGF3YWl0IGZzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBzaG91bGRSb3RhdGUgPSBhc3luYyAoXHJcbiAgZmlsZVBhdGg6IHN0cmluZyxcclxuICBjb25maWc6IExvZ1JvdGF0aW9uQ29uZmlnXHJcbik6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xyXG4gIGlmIChjb25maWcubWF4U2l6ZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICByZXR1cm4gZmFsc2VcclxuICB9XHJcbiAgY29uc3QgbWF4U2l6ZSA9IHBhcnNlU2l6ZShjb25maWcubWF4U2l6ZSlcclxuICByZXR1cm4gYXdhaXQgc2hvdWxkUm90YXRlQnlTaXplKGZpbGVQYXRoLCBtYXhTaXplKVxyXG59XHJcblxyXG5jb25zdCBjbGVhbnVwQnlDb3VudCA9IGFzeW5jIChcclxuICBmaWxlUGF0aDogc3RyaW5nLFxyXG4gIG1heEZpbGVzOiBudW1iZXJcclxuKTogUHJvbWlzZTx2b2lkPiA9PiB7XHJcbiAgY29uc3Qgcm90YXRlZCA9IGF3YWl0IGdldFJvdGF0ZWRGaWxlcyhmaWxlUGF0aClcclxuICBpZiAocm90YXRlZC5sZW5ndGggPD0gbWF4RmlsZXMpIHtcclxuICAgIHJldHVyblxyXG4gIH1cclxuXHJcbiAgY29uc3Qgc3RhdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcclxuICAgIHJvdGF0ZWQubWFwKGFzeW5jIHAgPT4gKHsgcGF0aDogcCwgc3RhdDogYXdhaXQgZnMuc3RhdChwKSB9KSlcclxuICApXHJcblxyXG4gIHN0YXRzLnNvcnQoKGEsIGIpID0+IGIuc3RhdC5tdGltZU1zIC0gYS5zdGF0Lm10aW1lTXMpXHJcbiAgY29uc3QgdG9EZWxldGUgPSBzdGF0cy5zbGljZShtYXhGaWxlcylcclxuICBhd2FpdCBQcm9taXNlLmFsbCh0b0RlbGV0ZS5tYXAoKHsgcGF0aCB9KSA9PiBmcy5ybShwYXRoLCB7IGZvcmNlOiB0cnVlIH0pKSlcclxufVxyXG5cclxuY29uc3QgY2xlYW51cEJ5VGltZSA9IGFzeW5jIChcclxuICBmaWxlUGF0aDogc3RyaW5nLFxyXG4gIG1heEFnZU1zOiBudW1iZXJcclxuKTogUHJvbWlzZTx2b2lkPiA9PiB7XHJcbiAgY29uc3Qgcm90YXRlZCA9IGF3YWl0IGdldFJvdGF0ZWRGaWxlcyhmaWxlUGF0aClcclxuICBpZiAocm90YXRlZC5sZW5ndGggPT09IDApIHtcclxuICAgIHJldHVyblxyXG4gIH1cclxuXHJcbiAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKVxyXG4gIGNvbnN0IHN0YXRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXHJcbiAgICByb3RhdGVkLm1hcChhc3luYyBwID0+ICh7IHBhdGg6IHAsIHN0YXQ6IGF3YWl0IGZzLnN0YXQocCkgfSkpXHJcbiAgKVxyXG5cclxuICBjb25zdCB0b0RlbGV0ZSA9IHN0YXRzLmZpbHRlcigoeyBzdGF0IH0pID0+IG5vdyAtIHN0YXQubXRpbWVNcyA+IG1heEFnZU1zKVxyXG4gIGF3YWl0IFByb21pc2UuYWxsKHRvRGVsZXRlLm1hcCgoeyBwYXRoIH0pID0+IGZzLnJtKHBhdGgsIHsgZm9yY2U6IHRydWUgfSkpKVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgcGVyZm9ybVJvdGF0aW9uID0gYXN5bmMgKFxyXG4gIGZpbGVQYXRoOiBzdHJpbmcsXHJcbiAgY29uZmlnOiBMb2dSb3RhdGlvbkNvbmZpZ1xyXG4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcclxuICBjb25zdCByb3RhdGVkID0gYXdhaXQgcm90YXRlRmlsZShmaWxlUGF0aClcclxuICBpZiAoIXJvdGF0ZWQpIHtcclxuICAgIHJldHVyblxyXG4gIH1cclxuXHJcbiAgY29uc3Qgc2hvdWxkQ29tcHJlc3MgPSBjb25maWcuY29tcHJlc3MgPT09IHRydWVcclxuICBpZiAoc2hvdWxkQ29tcHJlc3MpIHtcclxuICAgIGNvbnN0IGFsZ28gPSBjb25maWcuY29tcHJlc3Npb24gPz8gJ2d6aXAnXHJcbiAgICBpZiAoYWxnbyA9PT0gJ2d6aXAnKSB7XHJcbiAgICAgIGF3YWl0IGNvbXByZXNzRmlsZShyb3RhdGVkKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaWYgKGNvbmZpZy5tYXhGaWxlcyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICBjb25zdCByZXRlbnRpb24gPSBwYXJzZVJldGVudGlvbihjb25maWcubWF4RmlsZXMpXHJcbiAgICBpZiAocmV0ZW50aW9uLnR5cGUgPT09ICdjb3VudCcpIHtcclxuICAgICAgYXdhaXQgY2xlYW51cEJ5Q291bnQoZmlsZVBhdGgsIHJldGVudGlvbi52YWx1ZSlcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGF3YWl0IGNsZWFudXBCeVRpbWUoZmlsZVBhdGgsIHJldGVudGlvbi52YWx1ZSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIE9wdGlvbmFsIGludGVydmFsLWJhc2VkIHJvdGF0aW9uIGNsZWFudXAgKGNyZWF0ZSBpbnRlcnZhbCBkaXJlY3RvcmllcyAvIG5hbWluZykgaXMgbm90IHJlcXVpcmVkIGJ5IHRlc3RzLlxyXG59XHJcbiIsCiAgICAiaW1wb3J0IHsgcHJvbWlzZXMgYXMgZnMgfSBmcm9tICdub2RlOmZzJ1xyXG5pbXBvcnQgeyBiYXNlbmFtZSwgZGlybmFtZSB9IGZyb20gJ25vZGU6cGF0aCdcclxuXHJcbmNvbnN0IFNJWkVfUkVHRVggPSAvXihcXGQrKD86XFwuXFxkKyk/KShrfGtifG18bWJ8Z3xnYikkL2lcclxuY29uc3QgSU5URVJWQUxfUkVHRVggPSAvXihcXGQrKShofGR8dykkL2lcclxuY29uc3QgUk9UQVRFRF9SRUdFWCA9IC9cXC4oXFxkezR9LVxcZHsyfS1cXGR7Mn0tXFxkezJ9LVxcZHsyfS1cXGR7Mn0pKD86XFwuZ3opPyQvXHJcblxyXG5leHBvcnQgY29uc3QgcGFyc2VTaXplID0gKHZhbHVlOiBudW1iZXIgfCBzdHJpbmcpOiBudW1iZXIgPT4ge1xyXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XHJcbiAgICByZXR1cm4gdmFsdWVcclxuICB9XHJcblxyXG4gIGNvbnN0IHRyaW1tZWQgPSB2YWx1ZS50cmltKClcclxuICBjb25zdCBhc051bWJlciA9IE51bWJlcih0cmltbWVkKVxyXG4gIGlmIChOdW1iZXIuaXNGaW5pdGUoYXNOdW1iZXIpKSB7XHJcbiAgICByZXR1cm4gYXNOdW1iZXJcclxuICB9XHJcblxyXG4gIGNvbnN0IG1hdGNoID0gdHJpbW1lZC5tYXRjaChTSVpFX1JFR0VYKVxyXG4gIGlmICghbWF0Y2gpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzaXplIGZvcm1hdDogJHt2YWx1ZX1gKVxyXG4gIH1cclxuXHJcbiAgY29uc3QgYW1vdW50ID0gTnVtYmVyKG1hdGNoWzFdKVxyXG4gIGNvbnN0IHVuaXQgPSBtYXRjaFsyXS50b0xvd2VyQ2FzZSgpXHJcblxyXG4gIGxldCBiYXNlID0gMTAyNFxyXG4gIGlmICh1bml0LnN0YXJ0c1dpdGgoJ20nKSkge1xyXG4gICAgYmFzZSA9IDEwMjQgKiAxMDI0XHJcbiAgfSBlbHNlIGlmICh1bml0LnN0YXJ0c1dpdGgoJ2cnKSkge1xyXG4gICAgYmFzZSA9IDEwMjQgKiAxMDI0ICogMTAyNFxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIE1hdGguZmxvb3IoYW1vdW50ICogYmFzZSlcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IHBhcnNlSW50ZXJ2YWwgPSAodmFsdWU6IHN0cmluZyk6IG51bWJlciA9PiB7XHJcbiAgY29uc3QgbWF0Y2ggPSB2YWx1ZS50cmltKCkubWF0Y2goSU5URVJWQUxfUkVHRVgpXHJcbiAgaWYgKCFtYXRjaCkge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGludGVydmFsIGZvcm1hdDogJHt2YWx1ZX1gKVxyXG4gIH1cclxuXHJcbiAgY29uc3QgYW1vdW50ID0gTnVtYmVyKG1hdGNoWzFdKVxyXG4gIGNvbnN0IHVuaXQgPSBtYXRjaFsyXS50b0xvd2VyQ2FzZSgpXHJcblxyXG4gIGxldCBtcyA9IDYwICogNjAgKiAxMDAwXHJcbiAgaWYgKHVuaXQgPT09ICdkJykge1xyXG4gICAgbXMgPSAyNCAqIDYwICogNjAgKiAxMDAwXHJcbiAgfSBlbHNlIGlmICh1bml0ID09PSAndycpIHtcclxuICAgIG1zID0gNyAqIDI0ICogNjAgKiA2MCAqIDEwMDBcclxuICB9XHJcblxyXG4gIHJldHVybiBhbW91bnQgKiBtc1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgcGFyc2VSZXRlbnRpb24gPSAoXHJcbiAgdmFsdWU6IG51bWJlciB8IHN0cmluZ1xyXG4pOiB7IHR5cGU6ICdjb3VudCcgfCAndGltZSc7IHZhbHVlOiBudW1iZXIgfSA9PiB7XHJcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcclxuICAgIHJldHVybiB7IHR5cGU6ICdjb3VudCcsIHZhbHVlIH1cclxuICB9XHJcbiAgcmV0dXJuIHsgdHlwZTogJ3RpbWUnLCB2YWx1ZTogcGFyc2VJbnRlcnZhbCh2YWx1ZSkgfVxyXG59XHJcblxyXG5leHBvcnQgY29uc3Qgc2hvdWxkUm90YXRlQnlTaXplID0gYXN5bmMgKFxyXG4gIGZpbGVQYXRoOiBzdHJpbmcsXHJcbiAgbWF4U2l6ZUJ5dGVzOiBudW1iZXJcclxuKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XHJcbiAgdHJ5IHtcclxuICAgIGNvbnN0IHN0YXQgPSBhd2FpdCBmcy5zdGF0KGZpbGVQYXRoKVxyXG4gICAgcmV0dXJuIHN0YXQuc2l6ZSA+IG1heFNpemVCeXRlc1xyXG4gIH0gY2F0Y2gge1xyXG4gICAgcmV0dXJuIGZhbHNlXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgZ2V0Um90YXRlZEZpbGVzID0gYXN5bmMgKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdPiA9PiB7XHJcbiAgY29uc3QgZGlyID0gZGlybmFtZShmaWxlUGF0aClcclxuICBjb25zdCBiYXNlID0gYmFzZW5hbWUoZmlsZVBhdGgpXHJcblxyXG4gIGxldCBlbnRyaWVzOiBzdHJpbmdbXVxyXG4gIHRyeSB7XHJcbiAgICBlbnRyaWVzID0gYXdhaXQgZnMucmVhZGRpcihkaXIpXHJcbiAgfSBjYXRjaCB7XHJcbiAgICByZXR1cm4gW11cclxuICB9XHJcblxyXG4gIHJldHVybiBlbnRyaWVzXHJcbiAgICAuZmlsdGVyKG5hbWUgPT4gbmFtZS5zdGFydHNXaXRoKGAke2Jhc2V9LmApICYmIFJPVEFURURfUkVHRVgudGVzdChuYW1lKSlcclxuICAgIC5tYXAobmFtZSA9PiBgJHtkaXJ9LyR7bmFtZX1gKVxyXG59XHJcbiIsCiAgICAiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJ1xyXG5pbXBvcnQgeyBnZXRTdGF0dXNDb2RlIH0gZnJvbSAnLi4vaGVscGVycy9zdGF0dXMnXHJcbmltcG9ydCB0eXBlIHtcclxuICBMb2dMZXZlbCxcclxuICBPcHRpb25zLFxyXG4gIFBpbm8sXHJcbiAgU3RvcmVEYXRhLFxyXG4gXHJcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcydcclxuXHJcbmNvbnN0IHBhZDIgPSAodmFsdWU6IG51bWJlcik6IHN0cmluZyA9PiBTdHJpbmcodmFsdWUpLnBhZFN0YXJ0KDIsICcwJylcclxuY29uc3QgcGFkMyA9ICh2YWx1ZTogbnVtYmVyKTogc3RyaW5nID0+IFN0cmluZyh2YWx1ZSkucGFkU3RhcnQoMywgJzAnKVxyXG5cclxuY29uc3Qgc2hvdWxkVXNlQ29sb3JzID0gKG9wdGlvbnM6IE9wdGlvbnMpOiBib29sZWFuID0+IHtcclxuICBjb25zdCBjb25maWcgPSBvcHRpb25zLmNvbmZpZ1xyXG4gIGNvbnN0IGVuYWJsZWRCeUNvbmZpZyA9IGNvbmZpZz8udXNlQ29sb3JzID8/IHRydWVcclxuXHJcbiAgLy8gQXZvaWQgQU5TSSBzZXF1ZW5jZXMgaW4gbm9uLWludGVyYWN0aXZlIG91dHB1dCAocGlwZXMsIENJIGxvZ3MsIGZpbGVzKS5cclxuICBjb25zdCBpc1R0eSA9IHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBwcm9jZXNzLnN0ZG91dD8uaXNUVFkgPT09IHRydWVcclxuICByZXR1cm4gZW5hYmxlZEJ5Q29uZmlnICYmIGlzVHR5XHJcbn1cclxuXHJcbmNvbnN0IGZvcm1hdFRpbWVzdGFtcCA9IChkYXRlOiBEYXRlLCBwYXR0ZXJuPzogc3RyaW5nKTogc3RyaW5nID0+IHtcclxuICBpZiAoIXBhdHRlcm4pIHtcclxuICAgIHJldHVybiBkYXRlLnRvSVNPU3RyaW5nKClcclxuICB9XHJcblxyXG4gIGNvbnN0IHl5eXkgPSBTdHJpbmcoZGF0ZS5nZXRGdWxsWWVhcigpKVxyXG4gIGNvbnN0IG1tID0gcGFkMihkYXRlLmdldE1vbnRoKCkgKyAxKVxyXG4gIGNvbnN0IGRkID0gcGFkMihkYXRlLmdldERhdGUoKSlcclxuICBjb25zdCBISCA9IHBhZDIoZGF0ZS5nZXRIb3VycygpKVxyXG4gIGNvbnN0IE1NID0gcGFkMihkYXRlLmdldE1pbnV0ZXMoKSlcclxuICBjb25zdCBzcyA9IHBhZDIoZGF0ZS5nZXRTZWNvbmRzKCkpXHJcbiAgY29uc3QgU1NTID0gcGFkMyhkYXRlLmdldE1pbGxpc2Vjb25kcygpKVxyXG5cclxuICByZXR1cm4gcGF0dGVyblxyXG4gICAgLnJlcGxhY2VBbGwoJ3l5eXknLCB5eXl5KVxyXG4gICAgLnJlcGxhY2VBbGwoJ21tJywgbW0pXHJcbiAgICAucmVwbGFjZUFsbCgnZGQnLCBkZClcclxuICAgIC5yZXBsYWNlQWxsKCdISCcsIEhIKVxyXG4gICAgLnJlcGxhY2VBbGwoJ01NJywgTU0pXHJcbiAgICAucmVwbGFjZUFsbCgnc3MnLCBzcylcclxuICAgIC5yZXBsYWNlQWxsKCdTU1MnLCBTU1MpXHJcbn1cclxuXHJcbmNvbnN0IGdldElwID0gKHJlcXVlc3Q6IFJlcXVlc3QpOiBzdHJpbmcgPT4ge1xyXG4gIGNvbnN0IGZvcndhcmRlZCA9IHJlcXVlc3QuaGVhZGVycy5nZXQoJ3gtZm9yd2FyZGVkLWZvcicpXHJcbiAgaWYgKGZvcndhcmRlZCkge1xyXG4gICAgcmV0dXJuIGZvcndhcmRlZC5zcGxpdCgnLCcpWzBdPy50cmltKCkgPz8gJydcclxuICB9XHJcbiAgcmV0dXJuIHJlcXVlc3QuaGVhZGVycy5nZXQoJ3gtcmVhbC1pcCcpID8/ICcnXHJcbn1cclxuXHJcbmNvbnN0IGdldENvbG9yZWRMZXZlbCA9IChsZXZlbDogTG9nTGV2ZWwsIHVzZUNvbG9yczogYm9vbGVhbik6IHN0cmluZyA9PiB7XHJcbiAgaWYgKCF1c2VDb2xvcnMpIHtcclxuICAgIHJldHVybiBsZXZlbFxyXG4gIH1cclxuXHJcbiAgaWYgKGxldmVsID09PSAnRVJST1InKSB7XHJcbiAgICByZXR1cm4gY2hhbGsuYmdSZWQuYmxhY2sobGV2ZWwpXHJcbiAgfVxyXG4gIGlmIChsZXZlbCA9PT0gJ1dBUk5JTkcnKSB7XHJcbiAgICByZXR1cm4gY2hhbGsuYmdZZWxsb3cuYmxhY2sobGV2ZWwpXHJcbiAgfVxyXG4gIGlmIChsZXZlbCA9PT0gJ0RFQlVHJykge1xyXG4gICAgcmV0dXJuIGNoYWxrLmJnQmx1ZS5ibGFjayhsZXZlbClcclxuICB9XHJcblxyXG4gIHJldHVybiBjaGFsay5iZ0dyZWVuLmJsYWNrKGxldmVsKVxyXG59XHJcblxyXG5jb25zdCBnZXRDb2xvcmVkTWV0aG9kID0gKG1ldGhvZDogc3RyaW5nLCB1c2VDb2xvcnM6IGJvb2xlYW4pOiBzdHJpbmcgPT4ge1xyXG4gIGlmICghdXNlQ29sb3JzKSB7XHJcbiAgICByZXR1cm4gbWV0aG9kXHJcbiAgfVxyXG5cclxuICBjb25zdCB1cHBlciA9IG1ldGhvZC50b1VwcGVyQ2FzZSgpXHJcbiAgaWYgKHVwcGVyID09PSAnR0VUJykge1xyXG4gICAgcmV0dXJuIGNoYWxrLmdyZWVuLmJvbGQodXBwZXIpXHJcbiAgfVxyXG4gIGlmICh1cHBlciA9PT0gJ1BPU1QnKSB7XHJcbiAgICByZXR1cm4gY2hhbGsuYmx1ZS5ib2xkKHVwcGVyKVxyXG4gIH1cclxuICBpZiAodXBwZXIgPT09ICdQVVQnKSB7XHJcbiAgICByZXR1cm4gY2hhbGsueWVsbG93LmJvbGQodXBwZXIpXHJcbiAgfVxyXG4gIGlmICh1cHBlciA9PT0gJ1BBVENIJykge1xyXG4gICAgcmV0dXJuIGNoYWxrLnllbGxvd0JyaWdodC5ib2xkKHVwcGVyKVxyXG4gIH1cclxuICBpZiAodXBwZXIgPT09ICdERUxFVEUnKSB7XHJcbiAgICByZXR1cm4gY2hhbGsucmVkLmJvbGQodXBwZXIpXHJcbiAgfVxyXG4gIGlmICh1cHBlciA9PT0gJ09QVElPTlMnKSB7XHJcbiAgICByZXR1cm4gY2hhbGsuY3lhbi5ib2xkKHVwcGVyKVxyXG4gIH1cclxuICBpZiAodXBwZXIgPT09ICdIRUFEJykge1xyXG4gICAgcmV0dXJuIGNoYWxrLmdyZWVuQnJpZ2h0LmJvbGQodXBwZXIpXHJcbiAgfVxyXG4gIGlmICh1cHBlciA9PT0gJ1RSQUNFJykge1xyXG4gICAgcmV0dXJuIGNoYWxrLm1hZ2VudGEuYm9sZCh1cHBlcilcclxuICB9XHJcbiAgaWYgKHVwcGVyID09PSAnQ09OTkVDVCcpIHtcclxuICAgIHJldHVybiBjaGFsay5jeWFuQnJpZ2h0LmJvbGQodXBwZXIpXHJcbiAgfVxyXG5cclxuICByZXR1cm4gY2hhbGsud2hpdGUuYm9sZCh1cHBlcilcclxufVxyXG5cclxuY29uc3QgZ2V0Q29sb3JlZFN0YXR1cyA9IChzdGF0dXM6IHN0cmluZywgdXNlQ29sb3JzOiBib29sZWFuKTogc3RyaW5nID0+IHtcclxuICBpZiAoIXVzZUNvbG9ycykge1xyXG4gICAgcmV0dXJuIHN0YXR1c1xyXG4gIH1cclxuXHJcbiAgY29uc3QgbnVtZXJpYyA9IE51bWJlci5wYXJzZUludChzdGF0dXMsIDEwKVxyXG4gIGlmICghTnVtYmVyLmlzRmluaXRlKG51bWVyaWMpKSB7XHJcbiAgICByZXR1cm4gc3RhdHVzXHJcbiAgfVxyXG5cclxuICBpZiAobnVtZXJpYyA+PSA1MDApIHtcclxuICAgIHJldHVybiBjaGFsay5yZWQoc3RhdHVzKVxyXG4gIH1cclxuICBpZiAobnVtZXJpYyA+PSA0MDApIHtcclxuICAgIHJldHVybiBjaGFsay55ZWxsb3coc3RhdHVzKVxyXG4gIH1cclxuICBpZiAobnVtZXJpYyA+PSAzMDApIHtcclxuICAgIHJldHVybiBjaGFsay5jeWFuKHN0YXR1cylcclxuICB9XHJcbiAgaWYgKG51bWVyaWMgPj0gMjAwKSB7XHJcbiAgICByZXR1cm4gY2hhbGsuZ3JlZW4oc3RhdHVzKVxyXG4gIH1cclxuICByZXR1cm4gY2hhbGsuZ3JheShzdGF0dXMpXHJcbn1cclxuXHJcbmNvbnN0IGdldENvbG9yZWREdXJhdGlvbiA9IChkdXJhdGlvbjogc3RyaW5nLCB1c2VDb2xvcnM6IGJvb2xlYW4pOiBzdHJpbmcgPT4ge1xyXG4gIGlmICghdXNlQ29sb3JzKSB7XHJcbiAgICByZXR1cm4gZHVyYXRpb25cclxuICB9XHJcblxyXG4gIHJldHVybiBjaGFsay5ncmF5KGR1cmF0aW9uKVxyXG59XHJcblxyXG5jb25zdCBnZXRDb2xvcmVkVGltZXN0YW1wID0gKHRpbWVzdGFtcDogc3RyaW5nLCB1c2VDb2xvcnM6IGJvb2xlYW4pOiBzdHJpbmcgPT4ge1xyXG4gIGlmICghdXNlQ29sb3JzKSB7XHJcbiAgICByZXR1cm4gdGltZXN0YW1wXHJcbiAgfVxyXG5cclxuICByZXR1cm4gY2hhbGsuYmdIZXgoJyNGRkE1MDAnKS5ibGFjayh0aW1lc3RhbXApXHJcbn1cclxuXHJcbmNvbnN0IGdldENvbG9yZWRQYXRobmFtZSA9IChwYXRobmFtZTogc3RyaW5nLCB1c2VDb2xvcnM6IGJvb2xlYW4pOiBzdHJpbmcgPT4ge1xyXG4gIGlmICghdXNlQ29sb3JzKSB7XHJcbiAgICByZXR1cm4gcGF0aG5hbWVcclxuICB9XHJcblxyXG4gIHJldHVybiBjaGFsay53aGl0ZUJyaWdodChwYXRobmFtZSlcclxufVxyXG5cclxuY29uc3QgZ2V0Q29udGV4dFN0cmluZyA9ICh2YWx1ZTogdW5rbm93bik6IHN0cmluZyA9PiB7XHJcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwpIHtcclxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSlcclxuICB9XHJcblxyXG4gIHJldHVybiAnJ1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgZm9ybWF0TGluZSA9ICh7XHJcbiAgbGV2ZWwsXHJcbiAgcmVxdWVzdCxcclxuICBkYXRhLFxyXG4gIHN0b3JlLFxyXG4gIG9wdGlvbnNcclxufToge1xyXG4gIGxldmVsOiBMb2dMZXZlbFxyXG4gIHJlcXVlc3Q6IFJlcXVlc3RcclxuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxyXG4gIHN0b3JlOiBTdG9yZURhdGFcclxuICBvcHRpb25zOiBPcHRpb25zXHJcbn0pOiBzdHJpbmcgPT4ge1xyXG4gIGNvbnN0IGNvbmZpZyA9IG9wdGlvbnMuY29uZmlnXHJcbiAgY29uc3QgdXNlQ29sb3JzID0gc2hvdWxkVXNlQ29sb3JzKG9wdGlvbnMpXHJcbiAgY29uc3QgZm9ybWF0ID1cclxuICAgIGNvbmZpZz8uY3VzdG9tTG9nRm9ybWF0ID8/XHJcbiAgICAn8J+miiB7bm93fSB7bGV2ZWx9IHtkdXJhdGlvbn0ge21ldGhvZH0ge3BhdGhuYW1lfSB7c3RhdHVzfSB7bWVzc2FnZX0ge2lwfSB7Y29udGV4dH0nXHJcblxyXG4gIGNvbnN0IG5vdyA9IG5ldyBEYXRlKClcclxuICBjb25zdCBlcG9jaCA9IFN0cmluZyhub3cuZ2V0VGltZSgpKVxyXG4gIGNvbnN0IHJhd1RpbWVzdGFtcCA9IGZvcm1hdFRpbWVzdGFtcChub3csIGNvbmZpZz8udGltZXN0YW1wPy50cmFuc2xhdGVUaW1lKVxyXG4gIGNvbnN0IHRpbWVzdGFtcCA9IGdldENvbG9yZWRUaW1lc3RhbXAocmF3VGltZXN0YW1wLCB1c2VDb2xvcnMpXHJcblxyXG4gIGNvbnN0IG1lc3NhZ2UgPSB0eXBlb2YgZGF0YS5tZXNzYWdlID09PSAnc3RyaW5nJyA/IGRhdGEubWVzc2FnZSA6ICcnXHJcbiAgY29uc3QgZHVyYXRpb25NcyA9XHJcbiAgICBzdG9yZS5iZWZvcmVUaW1lID09PSBCaWdJbnQoMClcclxuICAgICAgPyAwXHJcbiAgICAgIDogTnVtYmVyKHByb2Nlc3MuaHJ0aW1lLmJpZ2ludCgpIC0gc3RvcmUuYmVmb3JlVGltZSkgLyAxXzAwMF8wMDBcclxuXHJcbiAgY29uc3QgcGF0aG5hbWUgPSBuZXcgVVJMKHJlcXVlc3QudXJsKS5wYXRobmFtZVxyXG4gIGNvbnN0IHN0YXR1c1ZhbHVlID0gZGF0YS5zdGF0dXNcclxuICBjb25zdCBzdGF0dXNDb2RlID1cclxuICAgIHN0YXR1c1ZhbHVlID09PSBudWxsIHx8IHN0YXR1c1ZhbHVlID09PSB1bmRlZmluZWRcclxuICAgICAgPyAyMDBcclxuICAgICAgOiBnZXRTdGF0dXNDb2RlKHN0YXR1c1ZhbHVlKVxyXG4gIGNvbnN0IHN0YXR1cyA9IFN0cmluZyhzdGF0dXNDb2RlKVxyXG4gIGNvbnN0IGlwID0gY29uZmlnPy5pcCA9PT0gdHJ1ZSA/IGdldElwKHJlcXVlc3QpIDogJydcclxuICBjb25zdCBjdHhTdHJpbmcgPSBnZXRDb250ZXh0U3RyaW5nKGRhdGEuY29udGV4dClcclxuICBjb25zdCBjb2xvcmVkTGV2ZWwgPSBnZXRDb2xvcmVkTGV2ZWwobGV2ZWwsIHVzZUNvbG9ycylcclxuICBjb25zdCBjb2xvcmVkTWV0aG9kID0gZ2V0Q29sb3JlZE1ldGhvZChyZXF1ZXN0Lm1ldGhvZCwgdXNlQ29sb3JzKVxyXG4gIGNvbnN0IGNvbG9yZWRQYXRobmFtZSA9IGdldENvbG9yZWRQYXRobmFtZShwYXRobmFtZSwgdXNlQ29sb3JzKVxyXG4gIGNvbnN0IGNvbG9yZWRTdGF0dXMgPSBnZXRDb2xvcmVkU3RhdHVzKHN0YXR1cywgdXNlQ29sb3JzKVxyXG4gIGNvbnN0IGNvbG9yZWREdXJhdGlvbiA9IGdldENvbG9yZWREdXJhdGlvbihcclxuICAgIGAke2R1cmF0aW9uTXMudG9GaXhlZCgyKX1tc2AsXHJcbiAgICB1c2VDb2xvcnNcclxuICApXHJcblxyXG4gIHJldHVybiBmb3JtYXRcclxuICAgIC5yZXBsYWNlQWxsKCd7bm93fScsIHRpbWVzdGFtcClcclxuICAgIC5yZXBsYWNlQWxsKCd7ZXBvY2h9JywgZXBvY2gpXHJcbiAgICAucmVwbGFjZUFsbCgne2xldmVsfScsIGNvbG9yZWRMZXZlbClcclxuICAgIC5yZXBsYWNlQWxsKCd7ZHVyYXRpb259JywgY29sb3JlZER1cmF0aW9uKVxyXG4gICAgLnJlcGxhY2VBbGwoJ3ttZXRob2R9JywgY29sb3JlZE1ldGhvZClcclxuICAgIC5yZXBsYWNlQWxsKCd7cGF0aG5hbWV9JywgY29sb3JlZFBhdGhuYW1lKVxyXG4gICAgLnJlcGxhY2VBbGwoJ3twYXRofScsIGNvbG9yZWRQYXRobmFtZSlcclxuICAgIC5yZXBsYWNlQWxsKCd7c3RhdHVzfScsIGNvbG9yZWRTdGF0dXMpXHJcbiAgICAucmVwbGFjZUFsbCgne21lc3NhZ2V9JywgbWVzc2FnZSlcclxuICAgIC5yZXBsYWNlQWxsKCd7aXB9JywgaXApXHJcbiAgICAucmVwbGFjZUFsbCgne2NvbnRleHR9JywgY3R4U3RyaW5nKVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgbG9nV2l0aFBpbm8gPSAoXHJcbiAgbG9nZ2VyOiBQaW5vLFxyXG4gIGxldmVsOiBMb2dMZXZlbCxcclxuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxyXG4pOiB2b2lkID0+IHtcclxuICBpZiAobGV2ZWwgPT09ICdFUlJPUicpIHtcclxuICAgIGxvZ2dlci5lcnJvcihkYXRhKVxyXG4gICAgcmV0dXJuXHJcbiAgfVxyXG4gIGlmIChsZXZlbCA9PT0gJ1dBUk5JTkcnKSB7XHJcbiAgICBsb2dnZXIud2FybihkYXRhKVxyXG4gICAgcmV0dXJuXHJcbiAgfVxyXG4gIGlmIChsZXZlbCA9PT0gJ0RFQlVHJykge1xyXG4gICAgbG9nZ2VyLmRlYnVnKGRhdGEpXHJcbiAgICByZXR1cm5cclxuICB9XHJcbiAgbG9nZ2VyLmluZm8oZGF0YSlcclxufVxyXG4iLAogICAgImltcG9ydCB7IFN0YXR1c01hcCB9IGZyb20gJ2VseXNpYSdcclxuXHJcbmNvbnN0IERJR0lUU19PTkxZID0gL15cXGQrJC9cclxuY29uc3QgREVMSU1JVEVSUyA9IC9bXy1dKy9nXHJcbmNvbnN0IENBTUVMX0JPVU5EQVJZXzEgPSAvKFthLXowLTldKShbQS1aXSkvZ1xyXG5jb25zdCBDQU1FTF9CT1VOREFSWV8yID0gLyhbQS1aXSkoW0EtWl1bYS16XSkvZ1xyXG5jb25zdCBBUE9TVFJPUEhFUyA9IC9bJ+KAmV0vZ1xyXG5jb25zdCBOT05fQUxQSEFOVU1FUklDID0gL1teYS16MC05XFxzXSsvZ1xyXG5jb25zdCBXSElURVNQQUNFID0gL1xccysvZ1xyXG5cclxuY29uc3Qgbm9ybWFsaXplU3RhdHVzTmFtZSA9ICh2YWx1ZTogc3RyaW5nKTogc3RyaW5nID0+IHtcclxuICAvLyBIYW5kbGVzIGNvbW1vbiB2YXJpYW50czpcclxuICAvLyAtIGNhc2UgZGlmZmVyZW5jZXM6IFwibm90IGZvdW5kXCIgdnMgXCJOb3QgRm91bmRcIlxyXG4gIC8vIC0gc3BhY2luZy9wdW5jdHVhdGlvbjogXCJOb3QtRm91bmRcIiwgXCJub3RfZm91bmRcIlxyXG4gIC8vIC0gY2FtZWxDYXNlL1Bhc2NhbENhc2U6IFwiSW50ZXJuYWxTZXJ2ZXJFcnJvclwiXHJcbiAgY29uc3QgdHJpbW1lZCA9IHZhbHVlLnRyaW0oKVxyXG4gIGlmICghdHJpbW1lZCkge1xyXG4gICAgcmV0dXJuICcnXHJcbiAgfVxyXG5cclxuICByZXR1cm4gdHJpbW1lZFxyXG4gICAgLnJlcGxhY2UoREVMSU1JVEVSUywgJyAnKVxyXG4gICAgLnJlcGxhY2UoQ0FNRUxfQk9VTkRBUllfMSwgJyQxICQyJylcclxuICAgIC5yZXBsYWNlKENBTUVMX0JPVU5EQVJZXzIsICckMSAkMicpXHJcbiAgICAucmVwbGFjZShBUE9TVFJPUEhFUywgJycpXHJcbiAgICAudG9Mb3dlckNhc2UoKVxyXG4gICAgLnJlcGxhY2UoTk9OX0FMUEhBTlVNRVJJQywgJyAnKVxyXG4gICAgLnJlcGxhY2UoV0hJVEVTUEFDRSwgJyAnKVxyXG4gICAgLnRyaW0oKVxyXG59XHJcblxyXG5jb25zdCBTVEFUVVNfQllfTk9STUFMSVpFRF9OQU1FID0gKCgpID0+IHtcclxuICBjb25zdCBtYXAgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpXHJcblxyXG4gIGZvciAoY29uc3QgW25hbWUsIGNvZGVdIG9mIE9iamVjdC5lbnRyaWVzKFN0YXR1c01hcCkpIHtcclxuICAgIG1hcC5zZXQobm9ybWFsaXplU3RhdHVzTmFtZShuYW1lKSwgY29kZSlcclxuICB9XHJcblxyXG4gIHJldHVybiBtYXBcclxufSkoKVxyXG5cclxuZXhwb3J0IGNvbnN0IGdldFN0YXR1c0NvZGUgPSAodmFsdWU6IHVua25vd24pOiBudW1iZXIgPT4ge1xyXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIE51bWJlci5pc0Zpbml0ZSh2YWx1ZSkpIHtcclxuICAgIHJldHVybiB2YWx1ZVxyXG4gIH1cclxuXHJcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcclxuICAgIGNvbnN0IHRyaW1tZWQgPSB2YWx1ZS50cmltKClcclxuICAgIGlmIChESUdJVFNfT05MWS50ZXN0KHRyaW1tZWQpKSB7XHJcbiAgICAgIHJldHVybiBOdW1iZXIodHJpbW1lZClcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBrbm93biA9IFNUQVRVU19CWV9OT1JNQUxJWkVEX05BTUUuZ2V0KG5vcm1hbGl6ZVN0YXR1c05hbWUodHJpbW1lZCkpXHJcbiAgICByZXR1cm4ga25vd24gPz8gNTAwXHJcbiAgfVxyXG5cclxuICByZXR1cm4gNTAwXHJcbn1cclxuIiwKICAgICJpbXBvcnQgeyBQcm9ibGVtRXJyb3IgfSBmcm9tICcuLi9FcnJvci9lcnJvcnMnXHJcbmltcG9ydCB0eXBlIHsgTG9nTGV2ZWwsIE9wdGlvbnMsIFN0b3JlRGF0YSB9IGZyb20gJy4uL2ludGVyZmFjZXMnXHJcbmltcG9ydCB7IGxvZ1RvVHJhbnNwb3J0cyB9IGZyb20gJy4uL291dHB1dCdcclxuaW1wb3J0IHsgbG9nVG9GaWxlIH0gZnJvbSAnLi4vb3V0cHV0L2ZpbGUnXHJcblxyXG5cclxuZXhwb3J0IGNvbnN0IGhhbmRsZUh0dHBFcnJvciA9IChcclxuICByZXF1ZXN0OiBSZXF1ZXN0LFxyXG4gIHByb2JsZW06IFByb2JsZW1FcnJvcixcclxuICBzdG9yZTogU3RvcmVEYXRhLFxyXG4gIG9wdGlvbnM6IE9wdGlvbnNcclxuKTogdm9pZCA9PiB7XHJcbiAgY29uc3QgY29uZmlnID0gb3B0aW9ucy5jb25maWdcclxuICAvLyAxLiDlh4blpIfml6Xlv5fmlbDmja7vvJrlsIYgUkZDIOagh+WHhuWtl+auteS4juaXpeW/l+WFg+aVsOaNruWQiOW5tlxyXG4gIGNvbnN0IGxldmVsOiBMb2dMZXZlbCA9ICdFUlJPUic7XHJcbiAgY29uc3QgcmZjRGF0YSA9IHByb2JsZW0udG9KU09OKCk7XHJcbiAgY29uc3QgZGF0YSA9IHsgXHJcbiAgICBzdGF0dXM6IHByb2JsZW0uc3RhdHVzLCBcclxuICAgIG1lc3NhZ2U6IHByb2JsZW0uZGV0YWlsIHx8IHByb2JsZW0udGl0bGUsIFxyXG4gICAgLi4ucmZjRGF0YSBcclxuICB9O1xyXG4vLyAyLiDpmLbmrrXvvJrkvKDovpPlsYIgKFRyYW5zcG9ydHMpXHJcbiAgbG9nVG9UcmFuc3BvcnRzKHsgbGV2ZWwsIHJlcXVlc3QsIGRhdGEsIHN0b3JlLCBvcHRpb25zIH0pO1xyXG4vLyAzLiDpmLbmrrXvvJrmjIHkuYXljJYgKEZpbGUgTG9nZ2luZylcclxuICAvLyDljLnphY3kvaDnmoTmjqXlj6PvvJp1c2VUcmFuc3BvcnRzT25seSDlkowgZGlzYWJsZUZpbGVMb2dnaW5nIOebtOaOpeWcqCBjb25maWcg5LiLXHJcbiAgaWYgKCEoY29uZmlnPy51c2VUcmFuc3BvcnRzT25seSB8fCBjb25maWc/LmRpc2FibGVGaWxlTG9nZ2luZykpIHtcclxuICAgIGNvbnN0IGZpbGVQYXRoID0gY29uZmlnPy5sb2dGaWxlUGF0aDtcclxuICAgIGlmIChmaWxlUGF0aCkge1xyXG4gICAgICBsb2dUb0ZpbGUoeyBmaWxlUGF0aCwgbGV2ZWwsIHJlcXVlc3QsIGRhdGEsIHN0b3JlLCBvcHRpb25zIH0pLmNhdGNoKCgpID0+IHt9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIDQuIOmYtuaute+8muaOp+WItuWPsOi+k+WHuiAoQ29uc29sZS9JbnRlcm5hbClcclxuICBpZiAoY29uZmlnPy51c2VUcmFuc3BvcnRzT25seSB8fCBjb25maWc/LmRpc2FibGVJbnRlcm5hbExvZ2dlcikgcmV0dXJuO1xyXG5cclxuXHJcbiAgLy8g5aSE55CG5pe26Ze05oiz5pi+56S66YC76L6RXHJcbiAgbGV0IHRpbWVzdGFtcCA9ICcnO1xyXG4gIGlmIChjb25maWc/LnRpbWVzdGFtcCkge1xyXG4gICAgdGltZXN0YW1wID0gYFske25ldyBEYXRlKCkudG9JU09TdHJpbmcoKX1dIGA7XHJcbiAgfVxyXG5cclxuLy8gMS4g5a6J5YWo5o+Q5Y+WIE1ldGhvZCDlkowgUGF0aFxyXG5jb25zdCBtZXRob2QgPSB0eXBlb2YgcmVxdWVzdCA9PT0gJ3N0cmluZycgPyAnUkVRJyA6IHJlcXVlc3QubWV0aG9kO1xyXG5jb25zdCB1cmxTdHJpbmcgPSB0eXBlb2YgcmVxdWVzdCA9PT0gJ3N0cmluZycgPyByZXF1ZXN0IDogcmVxdWVzdC51cmw7XHJcblxyXG5sZXQgcGF0aDogc3RyaW5nO1xyXG50cnkge1xyXG4gIC8vIOWmguaenOaYr+WujOaVtCBVUkwg5YiZ5o+Q5Y+WIHBhdGhuYW1l77yM5aaC5p6c5piv55u45a+56Lev5b6E5YiZ55u05o6l5L2/55SoXHJcbiAgcGF0aCA9IHVybFN0cmluZy5pbmNsdWRlcygnOi8vJykgXHJcbiAgICA/IG5ldyBVUkwodXJsU3RyaW5nKS5wYXRobmFtZSBcclxuICAgIDogdXJsU3RyaW5nO1xyXG59IGNhdGNoIHtcclxuICBwYXRoID0gdXJsU3RyaW5nO1xyXG59XHJcblxyXG4vLyAyLiDor63kuYnljJbnu4jnq6/miZPljbBcclxuLy8g546w5Zyo55qE5Luj56CB5a+5IHN0cmluZyDlkowgUmVxdWVzdCDnsbvlnovpg73nmb7liIbkuYvnmb7lronlhajkuoZcclxuY29uc29sZS5lcnJvcihcclxuICBgJHt0aW1lc3RhbXB9JHtsZXZlbH0gJHttZXRob2R9ICR7cGF0aH0gJHtwcm9ibGVtLnN0YXR1c30gLSAke3Byb2JsZW0udGl0bGV9YFxyXG4pO1xyXG59XHJcbiIsCiAgICAiLy8gc3JjL2xpYnMvZWx5c2lhLWh0dHAtcHJvYmxlbS1qc29uL2Vycm9ycy50c1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBQcm9ibGVtRG9jdW1lbnQge1xyXG4gIHR5cGU6IHN0cmluZztcclxuICB0aXRsZTogc3RyaW5nO1xyXG4gIHN0YXR1cz86IG51bWJlcjtcclxuICBkZXRhaWw/OiBzdHJpbmc7XHJcbiAgaW5zdGFuY2U/OiBzdHJpbmc7XHJcbiAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJGQyA5NDU3IFByb2JsZW0gRGV0YWlscyBFcnJvciBCYXNlIENsYXNzXHJcbiAqXHJcbiAqIENvcmUgbWVtYmVycyBhcyBwZXIgUkZDIDk0NTc6XHJcbiAqIC0gdHlwZTogQSBVUkkgcmVmZXJlbmNlIFtSRkMzOTg2XSB0aGF0IGlkZW50aWZpZXMgdGhlIHByb2JsZW0gdHlwZS5cclxuICogICAgICAgICBEZWZhdWx0cyB0byBcImFib3V0OmJsYW5rXCIgd2hlbiBvbWl0dGVkLlxyXG4gKiAtIHRpdGxlOiBBIHNob3J0LCBodW1hbi1yZWFkYWJsZSBzdW1tYXJ5IG9mIHRoZSBwcm9ibGVtIHR5cGUuXHJcbiAqIC0gc3RhdHVzOiBUaGUgSFRUUCBzdGF0dXMgY29kZSAoW1JGQzcyMzFdLCBTZWN0aW9uIDYpLlxyXG4gKiAtIGRldGFpbDogQSBodW1hbi1yZWFkYWJsZSBleHBsYW5hdGlvbiBzcGVjaWZpYyB0byB0aGlzIG9jY3VycmVuY2Ugb2YgdGhlIHByb2JsZW0uXHJcbiAqIC0gaW5zdGFuY2U6IEEgVVJJIHJlZmVyZW5jZSB0aGF0IGlkZW50aWZpZXMgdGhlIHNwZWNpZmljIG9jY3VycmVuY2Ugb2YgdGhlIHByb2JsZW0uXHJcbiAqXHJcbiAqIEV4dGVuc2lvbiBtZW1iZXJzOiBBZGRpdGlvbmFsIHByb3BlcnRpZXMgY2FuIGJlIGFkZGVkIHRvIHByb3ZpZGUgbW9yZSBjb250ZXh0LlxyXG4gKiBUaGVzZSBhcmUgc2VyaWFsaXplZCBhcy1pcyBpbiB0aGUgSlNPTiByZXNwb25zZS5cclxuICovXHJcbi8qKlxyXG4gKiBSRkMgOTQ1NyBFcnJvciBCYXNlIENsYXNzXHJcbiAqICog5L+u5pS55oCd6Lev77ya55u05o6l5L2/55SoIHB1YmxpYyByZWFkb25seSDlsZ7mgKfvvIzmi5Lnu53ltYzlpZfvvIzmi5Lnu50gR2V0dGVy44CCXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgUHJvYmxlbUVycm9yIGV4dGVuZHMgRXJyb3Ige1xyXG4gIC8vIDEuIOebtOaOpeWjsOaYjuWFrOW8gOWxnuaAp1xyXG4gIHB1YmxpYyByZWFkb25seSBzdGF0dXM6IG51bWJlcjtcclxuICBwdWJsaWMgcmVhZG9ubHkgdGl0bGU6IHN0cmluZztcclxuICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogc3RyaW5nO1xyXG4gIHB1YmxpYyByZWFkb25seSBkZXRhaWw/OiBzdHJpbmc7XHJcbiAgcHVibGljIHJlYWRvbmx5IGluc3RhbmNlPzogc3RyaW5nO1xyXG4gIHB1YmxpYyByZWFkb25seSBleHRlbnNpb25zPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgdHlwZSA9IFwiYWJvdXQ6YmxhbmtcIixcclxuICAgIHRpdGxlOiBzdHJpbmcsXHJcbiAgICBzdGF0dXM6IG51bWJlcixcclxuICAgIGRldGFpbD86IHN0cmluZyxcclxuICAgIGluc3RhbmNlPzogc3RyaW5nLFxyXG4gICAgZXh0ZW5zaW9uczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fVxyXG4gICkge1xyXG4gICAgc3VwZXIoZGV0YWlsIHx8IHRpdGxlKTtcclxuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBQcm9ibGVtRXJyb3IucHJvdG90eXBlKTtcclxuXHJcbiAgICAvLyAyLiDnm7TmjqXotYvlgLznu5kgdGhpc1xyXG4gICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7XHJcbiAgICB0aGlzLnRpdGxlID0gdGl0bGU7XHJcbiAgICB0aGlzLnR5cGUgPSB0eXBlO1xyXG4gICAgdGhpcy5kZXRhaWwgPSBkZXRhaWw7XHJcbiAgICB0aGlzLmluc3RhbmNlID0gaW5zdGFuY2U7XHJcbiAgICB0aGlzLmV4dGVuc2lvbnMgPSBleHRlbnNpb25zO1xyXG4gIH1cclxuXHJcbiAgLy8gMy4gdG9KU09OIOeahOaXtuWAmeWKqOaAgee7hOijheS4gOS4i+WNs+WPr1xyXG4gIHRvSlNPTigpOiBQcm9ibGVtRG9jdW1lbnQge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgdHlwZTogdGhpcy50eXBlLFxyXG4gICAgICB0aXRsZTogdGhpcy50aXRsZSxcclxuICAgICAgc3RhdHVzOiB0aGlzLnN0YXR1cyxcclxuICAgICAgLi4uKHRoaXMuZGV0YWlsID8geyBkZXRhaWw6IHRoaXMuZGV0YWlsIH0gOiB7fSksXHJcbiAgICAgIC4uLih0aGlzLmluc3RhbmNlID8geyBpbnN0YW5jZTogdGhpcy5pbnN0YW5jZSB9IDoge30pLFxyXG4gICAgICAvLyDmiormianlsZXlrZfmrrXlsZXlvIAgKGV4dGVuc2lvbnMpXHJcbiAgICAgIC4uLnRoaXMuZXh0ZW5zaW9ucyxcclxuICAgIH07XHJcbiAgfVxyXG59XHJcblxyXG4vLyAtLS0gNDBYIEVycm9ycyAtLS1cclxuY2xhc3MgQmFkUmVxdWVzdCBleHRlbmRzIFByb2JsZW1FcnJvciB7XHJcbiAgY29uc3RydWN0b3IoZGV0YWlsPzogc3RyaW5nLCBleHRlbnNpb25zPzogUmVjb3JkPHN0cmluZywgYW55Pikge1xyXG4gICAgc3VwZXIoXHJcbiAgICAgIFwiaHR0cHM6Ly9odHRwc3RhdHVzZXMuY29tLzQwMFwiLFxyXG4gICAgICBcIkJhZCBSZXF1ZXN0XCIsXHJcbiAgICAgIDQwMCxcclxuICAgICAgZGV0YWlsLFxyXG4gICAgICB1bmRlZmluZWQsXHJcbiAgICAgIGV4dGVuc2lvbnNcclxuICAgICk7XHJcbiAgfVxyXG59XHJcblxyXG5jbGFzcyBVbmF1dGhvcml6ZWQgZXh0ZW5kcyBQcm9ibGVtRXJyb3Ige1xyXG4gIGNvbnN0cnVjdG9yKGRldGFpbD86IHN0cmluZywgZXh0ZW5zaW9ucz86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcclxuICAgIHN1cGVyKFxyXG4gICAgICBcImh0dHBzOi8vaHR0cHN0YXR1c2VzLmNvbS80MDFcIixcclxuICAgICAgXCJVbmF1dGhvcml6ZWRcIixcclxuICAgICAgNDAxLFxyXG4gICAgICBkZXRhaWwsXHJcbiAgICAgIHVuZGVmaW5lZCxcclxuICAgICAgZXh0ZW5zaW9uc1xyXG4gICAgKTtcclxuICB9XHJcbn1cclxuXHJcbmNsYXNzIEZvcmJpZGRlbiBleHRlbmRzIFByb2JsZW1FcnJvciB7XHJcbiAgY29uc3RydWN0b3IoZGV0YWlsPzogc3RyaW5nLCBleHRlbnNpb25zPzogUmVjb3JkPHN0cmluZywgYW55Pikge1xyXG4gICAgc3VwZXIoXHJcbiAgICAgIFwiaHR0cHM6Ly9odHRwc3RhdHVzZXMuY29tLzQwM1wiLFxyXG4gICAgICBcIkZvcmJpZGRlblwiLFxyXG4gICAgICA0MDMsXHJcbiAgICAgIGRldGFpbCxcclxuICAgICAgdW5kZWZpbmVkLFxyXG4gICAgICBleHRlbnNpb25zXHJcbiAgICApO1xyXG4gIH1cclxufVxyXG5cclxuY2xhc3MgTm90Rm91bmQgZXh0ZW5kcyBQcm9ibGVtRXJyb3Ige1xyXG4gIGNvbnN0cnVjdG9yKGRldGFpbD86IHN0cmluZywgZXh0ZW5zaW9ucz86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcclxuICAgIHN1cGVyKFxyXG4gICAgICBcImh0dHBzOi8vaHR0cHN0YXR1c2VzLmNvbS80MDRcIixcclxuICAgICAgXCJOb3QgRm91bmRcIixcclxuICAgICAgNDA0LFxyXG4gICAgICBkZXRhaWwsXHJcbiAgICAgIHVuZGVmaW5lZCxcclxuICAgICAgZXh0ZW5zaW9uc1xyXG4gICAgKTtcclxuICB9XHJcbn1cclxuXHJcbmNsYXNzIENvbmZsaWN0IGV4dGVuZHMgUHJvYmxlbUVycm9yIHtcclxuICBjb25zdHJ1Y3RvcihkZXRhaWw/OiBzdHJpbmcsIGV4dGVuc2lvbnM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XHJcbiAgICBzdXBlcihcclxuICAgICAgXCJodHRwczovL2h0dHBzdGF0dXNlcy5jb20vNDA5XCIsXHJcbiAgICAgIFwiQ29uZmxpY3RcIixcclxuICAgICAgNDA5LFxyXG4gICAgICBkZXRhaWwsXHJcbiAgICAgIHVuZGVmaW5lZCxcclxuICAgICAgZXh0ZW5zaW9uc1xyXG4gICAgKTtcclxuICB9XHJcbn1cclxuXHJcbmNsYXNzIFBheW1lbnRSZXF1aXJlZCBleHRlbmRzIFByb2JsZW1FcnJvciB7XHJcbiAgY29uc3RydWN0b3IoZGV0YWlsPzogc3RyaW5nLCBleHRlbnNpb25zPzogUmVjb3JkPHN0cmluZywgYW55Pikge1xyXG4gICAgc3VwZXIoXHJcbiAgICAgIFwiaHR0cHM6Ly9odHRwc3RhdHVzZXMuY29tLzQwMlwiLFxyXG4gICAgICBcIlBheW1lbnQgUmVxdWlyZWRcIixcclxuICAgICAgNDAyLFxyXG4gICAgICBkZXRhaWwsXHJcbiAgICAgIHVuZGVmaW5lZCxcclxuICAgICAgZXh0ZW5zaW9uc1xyXG4gICAgKTtcclxuICB9XHJcbn1cclxuXHJcbmNsYXNzIE1ldGhvZE5vdEFsbG93ZWQgZXh0ZW5kcyBQcm9ibGVtRXJyb3Ige1xyXG4gIGNvbnN0cnVjdG9yKGRldGFpbD86IHN0cmluZywgZXh0ZW5zaW9ucz86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcclxuICAgIHN1cGVyKFxyXG4gICAgICBcImh0dHBzOi8vaHR0cHN0YXR1c2VzLmNvbS80MDVcIixcclxuICAgICAgXCJNZXRob2QgTm90IEFsbG93ZWRcIixcclxuICAgICAgNDA1LFxyXG4gICAgICBkZXRhaWwsXHJcbiAgICAgIHVuZGVmaW5lZCxcclxuICAgICAgZXh0ZW5zaW9uc1xyXG4gICAgKTtcclxuICB9XHJcbn1cclxuXHJcbmNsYXNzIE5vdEFjY2VwdGFibGUgZXh0ZW5kcyBQcm9ibGVtRXJyb3Ige1xyXG4gIGNvbnN0cnVjdG9yKGRldGFpbD86IHN0cmluZywgZXh0ZW5zaW9ucz86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcclxuICAgIHN1cGVyKFxyXG4gICAgICBcImh0dHBzOi8vaHR0cHN0YXR1c2VzLmNvbS80MDZcIixcclxuICAgICAgXCJOb3QgQWNjZXB0YWJsZVwiLFxyXG4gICAgICA0MDYsXHJcbiAgICAgIGRldGFpbCxcclxuICAgICAgdW5kZWZpbmVkLFxyXG4gICAgICBleHRlbnNpb25zXHJcbiAgICApO1xyXG4gIH1cclxufVxyXG5cclxuLy8gNTBYIEVycm9yc1xyXG5jbGFzcyBJbnRlcm5hbFNlcnZlckVycm9yIGV4dGVuZHMgUHJvYmxlbUVycm9yIHtcclxuICBjb25zdHJ1Y3RvcihkZXRhaWw/OiBzdHJpbmcsIGV4dGVuc2lvbnM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XHJcbiAgICBzdXBlcihcclxuICAgICAgXCJodHRwczovL2h0dHBzdGF0dXNlcy5jb20vNTAwXCIsXHJcbiAgICAgIFwiSW50ZXJuYWwgU2VydmVyIEVycm9yXCIsXHJcbiAgICAgIDUwMCxcclxuICAgICAgZGV0YWlsLFxyXG4gICAgICB1bmRlZmluZWQsXHJcbiAgICAgIGV4dGVuc2lvbnNcclxuICAgICk7XHJcbiAgfVxyXG59XHJcblxyXG5jbGFzcyBOb3RJbXBsZW1lbnRlZCBleHRlbmRzIFByb2JsZW1FcnJvciB7XHJcbiAgY29uc3RydWN0b3IoZGV0YWlsPzogc3RyaW5nLCBleHRlbnNpb25zPzogUmVjb3JkPHN0cmluZywgYW55Pikge1xyXG4gICAgc3VwZXIoXHJcbiAgICAgIFwiaHR0cHM6Ly9odHRwc3RhdHVzZXMuY29tLzUwMVwiLFxyXG4gICAgICBcIk5vdCBJbXBsZW1lbnRlZFwiLFxyXG4gICAgICA1MDEsXHJcbiAgICAgIGRldGFpbCxcclxuICAgICAgdW5kZWZpbmVkLFxyXG4gICAgICBleHRlbnNpb25zXHJcbiAgICApO1xyXG4gIH1cclxufVxyXG5cclxuY2xhc3MgQmFkR2F0ZXdheSBleHRlbmRzIFByb2JsZW1FcnJvciB7XHJcbiAgY29uc3RydWN0b3IoZGV0YWlsPzogc3RyaW5nLCBleHRlbnNpb25zPzogUmVjb3JkPHN0cmluZywgYW55Pikge1xyXG4gICAgc3VwZXIoXHJcbiAgICAgIFwiaHR0cHM6Ly9odHRwc3RhdHVzZXMuY29tLzUwMlwiLFxyXG4gICAgICBcIkJhZCBHYXRld2F5XCIsXHJcbiAgICAgIDUwMixcclxuICAgICAgZGV0YWlsLFxyXG4gICAgICB1bmRlZmluZWQsXHJcbiAgICAgIGV4dGVuc2lvbnNcclxuICAgICk7XHJcbiAgfVxyXG59XHJcblxyXG5jbGFzcyBTZXJ2aWNlVW5hdmFpbGFibGUgZXh0ZW5kcyBQcm9ibGVtRXJyb3Ige1xyXG4gIGNvbnN0cnVjdG9yKGRldGFpbD86IHN0cmluZywgZXh0ZW5zaW9ucz86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcclxuICAgIHN1cGVyKFxyXG4gICAgICBcImh0dHBzOi8vaHR0cHN0YXR1c2VzLmNvbS81MDNcIixcclxuICAgICAgXCJTZXJ2aWNlIFVuYXZhaWxhYmxlXCIsXHJcbiAgICAgIDUwMyxcclxuICAgICAgZGV0YWlsLFxyXG4gICAgICB1bmRlZmluZWQsXHJcbiAgICAgIGV4dGVuc2lvbnNcclxuICAgICk7XHJcbiAgfVxyXG59XHJcblxyXG5jbGFzcyBHYXRld2F5VGltZW91dCBleHRlbmRzIFByb2JsZW1FcnJvciB7XHJcbiAgY29uc3RydWN0b3IoZGV0YWlsPzogc3RyaW5nLCBleHRlbnNpb25zPzogUmVjb3JkPHN0cmluZywgYW55Pikge1xyXG4gICAgc3VwZXIoXHJcbiAgICAgIFwiaHR0cHM6Ly9odHRwc3RhdHVzZXMuY29tLzUwNFwiLFxyXG4gICAgICBcIkdhdGV3YXkgVGltZW91dFwiLFxyXG4gICAgICA1MDQsXHJcbiAgICAgIGRldGFpbCxcclxuICAgICAgdW5kZWZpbmVkLFxyXG4gICAgICBleHRlbnNpb25zXHJcbiAgICApO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IEh0dHBFcnJvciA9IHtcclxuICBCYWRSZXF1ZXN0LFxyXG4gIFVuYXV0aG9yaXplZCxcclxuICBQYXltZW50UmVxdWlyZWQsXHJcbiAgRm9yYmlkZGVuLFxyXG4gIE5vdEZvdW5kLFxyXG4gIE1ldGhvZE5vdEFsbG93ZWQsXHJcbiAgTm90QWNjZXB0YWJsZSxcclxuICBDb25mbGljdCxcclxuICBJbnRlcm5hbFNlcnZlckVycm9yLFxyXG4gIE5vdEltcGxlbWVudGVkLFxyXG4gIEJhZEdhdGV3YXksXHJcbiAgU2VydmljZVVuYXZhaWxhYmxlLFxyXG4gIEdhdGV3YXlUaW1lb3V0LFxyXG59IGFzIGNvbnN0O1xyXG4iLAogICAgIi8qKlxuICogUkZDIDk0NTcgUHJvYmxlbSBKU09OIOagvOW8j+WMluW3peWFt1xuICogQHNlZSBodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjOTQ1Ny5odG1sXG4gKi9cblxuaW1wb3J0IHsgUHJvYmxlbUVycm9yIH0gZnJvbSBcIi4uL0Vycm9yL2Vycm9yc1wiO1xuaW1wb3J0IHsgQ29kZSB9IGZyb20gXCIuLi9FcnJvci90eXBlXCI7XG5cblxuLyoqXG4gKiDpu5jorqTnmoTnirbmgIHnoIHkuI7moIfpopjmmKDlsITooaggKFJGQyDmoIflh4bmjqjojZApXG4gKi9cbmNvbnN0IERFRkFVTFRfVElUTEVTOiBSZWNvcmQ8bnVtYmVyLCBzdHJpbmc+ID0ge1xuICA0MDA6ICdCYWQgUmVxdWVzdCcsXG4gIDQwMTogJ1VuYXV0aG9yaXplZCcsXG4gIDQwMzogJ0ZvcmJpZGRlbicsXG4gIDQwNDogJ05vdCBGb3VuZCcsXG4gIDQwOTogJ0NvbmZsaWN0JyxcbiAgNDIyOiAnVW5wcm9jZXNzYWJsZSBFbnRpdHknLFxuICA1MDA6ICdJbnRlcm5hbCBTZXJ2ZXIgRXJyb3InLFxuICA1MDM6ICdTZXJ2aWNlIFVuYXZhaWxhYmxlJyxcbn07XG5cbmV4cG9ydCBjb25zdCBub3JtYWxpemVUb1Byb2JsZW0gPSAoXG4gIGVycm9yOiBhbnksXG4gIGNvZGU6IENvZGUsXG4gIHBhdGg6IHN0cmluZyxcbiAgdHlwZUJhc2VVcmw6IHN0cmluZyA9ICdhYm91dDpibGFuaydcbik6IFByb2JsZW1FcnJvciA9PiB7XG4gIC8vIDEuIOWmguaenOW3sue7j+aYryBQcm9ibGVtRXJyb3LvvIznm7TmjqXooaXlhYUgaW5zdGFuY2Ug5bm26L+U5ZueXG4gIGlmIChlcnJvciBpbnN0YW5jZW9mIFByb2JsZW1FcnJvcikge1xuICAgIC8vIOWmguaenOayoeaciSBpbnN0YW5jZe+8jOiHquWKqOihpeWFqOS4uuW9k+WJjeivt+axgui3r+W+hFxuICAgIHJldHVybiBlcnJvci5pbnN0YW5jZSA/IGVycm9yIDogbmV3IFByb2JsZW1FcnJvcihcbiAgICAgIGVycm9yLnR5cGUsXG4gICAgICBlcnJvci50aXRsZSxcbiAgICAgIGVycm9yLnN0YXR1cyxcbiAgICAgIGVycm9yLmRldGFpbCxcbiAgICAgIHBhdGgsXG4gICAgICBlcnJvci5leHRlbnNpb25zXG4gICAgKTtcbiAgfVxuXG4gIC8vIDIuIOWIneWni+WMlum7mOiupOWAvFxuICBsZXQgc3RhdHVzID0gNTAwO1xuICBsZXQgdGl0bGUgPSAnSW50ZXJuYWwgU2VydmVyIEVycm9yJztcbiAgbGV0IGRldGFpbCA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgbGV0IGV4dGVuc2lvbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cbiAgLy8gMy4g6K+G5YirIEVseXNpYSDlhoXnva7plJnor6/noIHlubbigJzlr7npvZDigJ3moIflh4ZcbiAgc3dpdGNoIChjb2RlKSB7XG4gICAgY2FzZSAnVkFMSURBVElPTic6XG4gICAgICBzdGF0dXMgPSA0MDA7XG4gICAgICB0aXRsZSA9ICdWYWxpZGF0aW9uIEZhaWxlZCc7XG4gICAgICAvLyDmj5Dlj5YgRWx5c2lhIOeahOagoemqjOe7huiKglxuICAgICAgZXh0ZW5zaW9ucyA9IHsgZXJyb3JzOiBlcnJvci5hbGwgfHwgW10gfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ05PVF9GT1VORCc6XG4gICAgICBzdGF0dXMgPSA0MDQ7XG4gICAgICB0aXRsZSA9ICdSZXNvdXJjZSBOb3QgRm91bmQnO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnUEFSU0UnOlxuICAgICAgc3RhdHVzID0gNDAwO1xuICAgICAgdGl0bGUgPSAnSW52YWxpZCBQYXlsb2FkJztcbiAgICAgIGRldGFpbCA9ICdUaGUgcmVxdWVzdCBib2R5IGNvdWxkIG5vdCBiZSBwYXJzZWQgYXMgdmFsaWQgSlNPTi4nO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnSU5WQUxJRF9DT09LSUVfU0lHTkFUVVJFJzpcbiAgICAgIHN0YXR1cyA9IDQwMTtcbiAgICAgIHRpdGxlID0gJ0ludmFsaWQgQ3JlZGVudGlhbHMnO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIOWmguaenOmUmeivr+WvueixoeacrOi6q+W4puacieeKtuaAgeegge+8iOavlOWmguafkOS6m+W6k+aKm+WHuueahO+8iVxuICAgICAgaWYgKHR5cGVvZiBlcnJvcj8uc3RhdHVzID09PSAnbnVtYmVyJykge1xuICAgICAgICBzdGF0dXMgPSBlcnJvci5zdGF0dXM7XG4gICAgICAgIHRpdGxlID0gREVGQVVMVF9USVRMRVNbc3RhdHVzXSB8fCAnVW5rbm93biBFcnJvcic7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgfVxuXG4gIC8vIDQuIOaehOmAoOW5tui/lOWbnuagh+WHhueahCBQcm9ibGVtRXJyb3JcbiAgcmV0dXJuIG5ldyBQcm9ibGVtRXJyb3IoXG4gICAgdHlwZUJhc2VVcmwgPT09ICdhYm91dDpibGFuaycgPyB0eXBlQmFzZVVybCA6IGAke3R5cGVCYXNlVXJsfS8ke2NvZGV9YCxcbiAgICB0aXRsZSxcbiAgICBzdGF0dXMsXG4gICAgZGV0YWlsLFxuICAgIHBhdGgsXG4gICAgZXh0ZW5zaW9uc1xuICApO1xufTtcblxuXG5leHBvcnQgaW50ZXJmYWNlIFByb2JsZW1Kc29uIHtcbiAgdHlwZT86IHN0cmluZ1xuICB0aXRsZTogc3RyaW5nXG4gIHN0YXR1czogbnVtYmVyXG4gIGRldGFpbD86IHN0cmluZ1xuICBpbnN0YW5jZT86IHN0cmluZ1xuICBba2V5OiBzdHJpbmddOiB1bmtub3duXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvYmxlbUpzb25PcHRpb25zIHtcbiAgLyoqXG4gICAqIOWfuuehgCBVUkzvvIznlKjkuo7nlJ/miJDplJnor6/nsbvlnovnmoTpk77mjqVcbiAgICogQGV4YW1wbGUgJ2h0dHBzOi8vYXBpLmV4YW1wbGUuY29tL2Vycm9ycydcbiAgICovXG4gIHR5cGVCYXNlVXJsPzogc3RyaW5nXG5cbiAgLyoqXG4gICAqIOaYr+WQpuWcqOaXpeW/l+S4reaYvuekuuWujOaVtOeahCBQcm9ibGVtIEpTT05cbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgZW5hYmxlZD86IGJvb2xlYW5cblxuICAvKipcbiAgICog6Ieq5a6a5LmJ5qC85byP5YyW5Ye95pWwXG4gICAqL1xuICBmb3JtYXQ/OiAoZXJyb3I6IHVua25vd24sIHJlcXVlc3Q6IFJlcXVlc3QpID0+IFByb2JsZW1Kc29uIHwgbnVsbFxufVxuXG5jb25zdCBpc0Vycm9yV2l0aFN0YXR1cyA9IChcbiAgdmFsdWU6IHVua25vd25cbik6IHZhbHVlIGlzIHsgc3RhdHVzOiBudW1iZXIgfSA9PlxuICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gIHZhbHVlICE9PSBudWxsICYmXG4gICdzdGF0dXMnIGluIHZhbHVlICYmXG4gIHR5cGVvZiAodmFsdWUgYXMgeyBzdGF0dXM/OiB1bmtub3duIH0pLnN0YXR1cyA9PT0gJ251bWJlcidcblxuY29uc3QgaXNFcnJvckxpa2UgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBFcnJvciA9PlxuICB2YWx1ZSBpbnN0YW5jZW9mIEVycm9yIHx8XG4gICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICAnbWVzc2FnZScgaW4gdmFsdWUgJiZcbiAgICB0eXBlb2YgKHZhbHVlIGFzIHsgbWVzc2FnZT86IHVua25vd24gfSkubWVzc2FnZSA9PT0gJ3N0cmluZycpXG5cbi8qKlxuICog5bCG6ZSZ6K+v6L2s5o2i5Li6IFJGQyA5NDU3IFByb2JsZW0gSlNPTiDmoLzlvI9cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvUHJvYmxlbUpzb24oXG4gIGVycm9yOiB1bmtub3duLFxuICByZXF1ZXN0OiBSZXF1ZXN0LFxuICBvcHRpb25zOiBQcm9ibGVtSnNvbk9wdGlvbnMgPSB7fVxuKTogUHJvYmxlbUpzb24ge1xuICAvLyDlpoLmnpzmj5Dkvpvkuoboh6rlrprkuYnmoLzlvI/ljJblh73mlbDvvIzkvb/nlKjlroNcbiAgaWYgKG9wdGlvbnMuZm9ybWF0KSB7XG4gICAgY29uc3QgY3VzdG9tID0gb3B0aW9ucy5mb3JtYXQoZXJyb3IsIHJlcXVlc3QpXG4gICAgaWYgKGN1c3RvbSkge1xuICAgICAgcmV0dXJuIGN1c3RvbVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHVybCA9IG5ldyBVUkwocmVxdWVzdC51cmwpXG4gIGNvbnN0IHN0YXR1cyA9IGlzRXJyb3JXaXRoU3RhdHVzKGVycm9yKSA/IGVycm9yLnN0YXR1cyA6IDUwMFxuICBjb25zdCBtZXNzYWdlID0gaXNFcnJvckxpa2UoZXJyb3IpXG4gICAgPyBlcnJvci5tZXNzYWdlXG4gICAgOiBTdHJpbmcoZXJyb3IgPz8gJ1Vua25vd24gRXJyb3InKVxuXG4gIC8vIOm7mOiupOeahCBQcm9ibGVtIEpTT04g57uT5p6EXG4gIGNvbnN0IHByb2JsZW06IFByb2JsZW1Kc29uID0ge1xuICAgIHR5cGU6IG9wdGlvbnMudHlwZUJhc2VVcmxcbiAgICAgID8gYCR7b3B0aW9ucy50eXBlQmFzZVVybH0vJHtzdGF0dXN9YFxuICAgICAgOiAnYWJvdXQ6YmxhbmsnLFxuICAgIHRpdGxlOiBnZXREZWZhdWx0VGl0bGUoc3RhdHVzKSxcbiAgICBzdGF0dXMsXG4gICAgZGV0YWlsOiBtZXNzYWdlLFxuICAgIGluc3RhbmNlOiB1cmwucGF0aG5hbWUgKyB1cmwuc2VhcmNoXG4gIH1cblxuICAvLyDlsJ3or5Xku47plJnor6/lr7nosaHkuK3mj5Dlj5bpop3lpJbnmoTkv6Hmga9cbiAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgIT09IG51bGwpIHtcbiAgICBjb25zdCBlcnIgPSBlcnJvciBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuXG4gICAgLy8g5aaC5p6c6ZSZ6K+v5bey57uP5pyJIFByb2JsZW0gSlNPTiDnu5PmnoTvvIznm7TmjqXkvb/nlKhcbiAgICBpZiAoJ3R5cGUnIGluIGVyciB8fCAndGl0bGUnIGluIGVycikge1xuICAgICAgaWYgKGVyci50eXBlKSBwcm9ibGVtLnR5cGUgPSBlcnIudHlwZSBhcyBzdHJpbmdcbiAgICAgIGlmIChlcnIudGl0bGUpIHByb2JsZW0udGl0bGUgPSBlcnIudGl0bGUgYXMgc3RyaW5nXG4gICAgfVxuXG4gICAgLy8g5re75Yqg5YW25LuW5omp5bGV5a2X5q6177yI5o6S6Zmk5qCH5YeG5a2X5q6177yJXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZXJyKSkge1xuICAgICAgaWYgKFxuICAgICAgICAhWydzdGF0dXMnLCAnbWVzc2FnZScsICd0eXBlJywgJ3RpdGxlJywgJ2RldGFpbCcsICdpbnN0YW5jZSddLmluY2x1ZGVzKFxuICAgICAgICAgIGtleVxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgcHJvYmxlbVtrZXldID0gdmFsdWVcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcHJvYmxlbVxufVxuXG4vKipcbiAqIOagueaNrueKtuaAgeeggeiOt+WPlum7mOiupOagh+mimFxuICovXG5mdW5jdGlvbiBnZXREZWZhdWx0VGl0bGUoc3RhdHVzOiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCB0aXRsZXM6IFJlY29yZDxudW1iZXIsIHN0cmluZz4gPSB7XG4gICAgNDAwOiAnQmFkIFJlcXVlc3QnLFxuICAgIDQwMTogJ1VuYXV0aG9yaXplZCcsXG4gICAgNDAyOiAnUGF5bWVudCBSZXF1aXJlZCcsXG4gICAgNDAzOiAnRm9yYmlkZGVuJyxcbiAgICA0MDQ6ICdOb3QgRm91bmQnLFxuICAgIDQwNTogJ01ldGhvZCBOb3QgQWxsb3dlZCcsXG4gICAgNDA2OiAnTm90IEFjY2VwdGFibGUnLFxuICAgIDQwNzogJ1Byb3h5IEF1dGhlbnRpY2F0aW9uIFJlcXVpcmVkJyxcbiAgICA0MDg6ICdSZXF1ZXN0IFRpbWVvdXQnLFxuICAgIDQwOTogJ0NvbmZsaWN0JyxcbiAgICA0MTA6ICdHb25lJyxcbiAgICA0MTE6ICdMZW5ndGggUmVxdWlyZWQnLFxuICAgIDQxMjogJ1ByZWNvbmRpdGlvbiBGYWlsZWQnLFxuICAgIDQxMzogJ1BheWxvYWQgVG9vIExhcmdlJyxcbiAgICA0MTQ6ICdVUkkgVG9vIExvbmcnLFxuICAgIDQxNTogJ1Vuc3VwcG9ydGVkIE1lZGlhIFR5cGUnLFxuICAgIDQxNjogJ1JhbmdlIE5vdCBTYXRpc2ZpYWJsZScsXG4gICAgNDE3OiAnRXhwZWN0YXRpb24gRmFpbGVkJyxcbiAgICA0MTg6IFwiSSdtIGEgdGVhcG90XCIsXG4gICAgNDIyOiAnVW5wcm9jZXNzYWJsZSBFbnRpdHknLFxuICAgIDQyMzogJ0xvY2tlZCcsXG4gICAgNDI0OiAnRmFpbGVkIERlcGVuZGVuY3knLFxuICAgIDQyNTogJ1RvbyBFYXJseScsXG4gICAgNDI2OiAnVXBncmFkZSBSZXF1aXJlZCcsXG4gICAgNDI4OiAnUHJlY29uZGl0aW9uIFJlcXVpcmVkJyxcbiAgICA0Mjk6ICdUb28gTWFueSBSZXF1ZXN0cycsXG4gICAgNDMxOiAnUmVxdWVzdCBIZWFkZXIgRmllbGRzIFRvbyBMYXJnZScsXG4gICAgNDUxOiAnVW5hdmFpbGFibGUgRm9yIExlZ2FsIFJlYXNvbnMnLFxuICAgIDUwMDogJ0ludGVybmFsIFNlcnZlciBFcnJvcicsXG4gICAgNTAxOiAnTm90IEltcGxlbWVudGVkJyxcbiAgICA1MDI6ICdCYWQgR2F0ZXdheScsXG4gICAgNTAzOiAnU2VydmljZSBVbmF2YWlsYWJsZScsXG4gICAgNTA0OiAnR2F0ZXdheSBUaW1lb3V0JyxcbiAgICA1MDU6ICdIVFRQIFZlcnNpb24gTm90IFN1cHBvcnRlZCcsXG4gICAgNTA2OiAnVmFyaWFudCBBbHNvIE5lZ290aWF0ZXMnLFxuICAgIDUwNzogJ0luc3VmZmljaWVudCBTdG9yYWdlJyxcbiAgICA1MDg6ICdMb29wIERldGVjdGVkJyxcbiAgICA1MTA6ICdOb3QgRXh0ZW5kZWQnLFxuICAgIDUxMTogJ05ldHdvcmsgQXV0aGVudGljYXRpb24gUmVxdWlyZWQnXG4gIH1cblxuICByZXR1cm4gdGl0bGVzW3N0YXR1c10gfHwgJ0Vycm9yJ1xufVxuXG4vKipcbiAqIOWwhiBQcm9ibGVtIEpTT04g5qC85byP5YyW5Li65pel5b+X5a2X56ym5LiyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRQcm9ibGVtSnNvbkxvZyhcbiAgcHJvYmxlbTogUHJvYmxlbUpzb24sXG4gIHJlcXVlc3Q6IFJlcXVlc3Rcbik6IHN0cmluZyB7XG4gIGNvbnN0IHVybCA9IG5ldyBVUkwocmVxdWVzdC51cmwpXG4gIGNvbnN0IHBhcnRzOiBzdHJpbmdbXSA9IFtdXG5cbiAgLy8g5qCH6aKY6KGMXG4gIGNvbnN0IHN0YXR1c1N0ciA9IHByb2JsZW0uc3RhdHVzLnRvU3RyaW5nKClcbiAgY29uc3QgZW1vamkgPSBnZXRTdGF0dXNFbW9qaShwcm9ibGVtLnN0YXR1cylcbiAgcGFydHMucHVzaChcbiAgICBgXFxuJHtlbW9qaX0gW0hUVFAgJHtzdGF0dXNTdHJ9XSAke3JlcXVlc3QubWV0aG9kfSAke3VybC5wYXRobmFtZX1gXG4gIClcblxuICAvLyBQcm9ibGVtIEpTT04g5YaF5a65XG4gIHBhcnRzLnB1c2goYCAgVHlwZTogICAgJHtwcm9ibGVtLnR5cGV9YClcbiAgcGFydHMucHVzaChgICBUaXRsZTogICAke3Byb2JsZW0udGl0bGV9YClcbiAgaWYgKHByb2JsZW0uZGV0YWlsKSB7XG4gICAgcGFydHMucHVzaChgICBEZXRhaWw6ICAke3Byb2JsZW0uZGV0YWlsfWApXG4gIH1cbiAgaWYgKHByb2JsZW0uaW5zdGFuY2UpIHtcbiAgICBwYXJ0cy5wdXNoKGAgIEluc3RhbmNlOiAke3Byb2JsZW0uaW5zdGFuY2V9YClcbiAgfVxuXG4gIC8vIOaJqeWxleWtl+autVxuICBjb25zdCBleHRlbnNpb25zID0gT2JqZWN0LmVudHJpZXMocHJvYmxlbSkuZmlsdGVyKFxuICAgIChba2V5XSkgPT5cbiAgICAgICFbJ3R5cGUnLCAndGl0bGUnLCAnc3RhdHVzJywgJ2RldGFpbCcsICdpbnN0YW5jZSddLmluY2x1ZGVzKGtleSlcbiAgKVxuICBpZiAoZXh0ZW5zaW9ucy5sZW5ndGggPiAwKSB7XG4gICAgcGFydHMucHVzaCgnICBFeHRlbnNpb25zOicpXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgZXh0ZW5zaW9ucykge1xuICAgICAgcGFydHMucHVzaChgICAgICR7a2V5fTogJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSl9YClcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcGFydHMuam9pbignXFxuJylcbn1cblxuZnVuY3Rpb24gZ2V0U3RhdHVzRW1vamkoc3RhdHVzOiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAoc3RhdHVzID49IDUwMCkgcmV0dXJuICfwn5S0J1xuICBpZiAoc3RhdHVzID49IDQwMCkgcmV0dXJuICfwn5+hJ1xuICBpZiAoc3RhdHVzID49IDMwMCkgcmV0dXJuICfwn5S1J1xuICBpZiAoc3RhdHVzID49IDIwMCkgcmV0dXJuICfwn5+iJ1xuICByZXR1cm4gJ+Kaqidcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUge1xyXG4gIExvZ2dlciBhcyBQaW5vTG9nZ2VyLFxyXG4gIExvZ2dlck9wdGlvbnMgYXMgUGlub0xvZ2dlck9wdGlvbnNcclxufSBmcm9tICdwaW5vJ1xyXG5pbXBvcnQgeyBQcm9ibGVtRXJyb3IgfSBmcm9tICcuL0Vycm9yL2Vycm9ycydcclxuaW1wb3J0IHsgQ29kZSB9IGZyb20gJy4vRXJyb3IvdHlwZSdcclxuXHJcbmV4cG9ydCB0eXBlIFBpbm8gPSBQaW5vTG9nZ2VyPG5ldmVyLCBib29sZWFuPlxyXG5leHBvcnQgdHlwZSBSZXF1ZXN0ID0gUmVxdWVzdFxyXG5cclxuZXhwb3J0IHR5cGUgTG9nTGV2ZWwgPSAnREVCVUcnIHwgJ0lORk8nIHwgJ1dBUk5JTkcnIHwgJ0VSUk9SJ1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBTdG9yZURhdGEge1xyXG4gIGJlZm9yZVRpbWU6IGJpZ2ludFxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIExvZ2l4bHlzaWFTdG9yZSB7XHJcbiAgbG9nZ2VyOiBMb2dnZXJcclxuICBwaW5vOiBQaW5vXHJcbiAgYmVmb3JlVGltZT86IGJpZ2ludFxyXG4gIFtrZXk6IHN0cmluZ106IHVua25vd25cclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBUcmFuc3BvcnQge1xyXG4gIGxvZzogKFxyXG4gICAgbGV2ZWw6IExvZ0xldmVsLFxyXG4gICAgbWVzc2FnZTogc3RyaW5nLFxyXG4gICAgbWV0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XHJcbiAgKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPlxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIExvZ1JvdGF0aW9uQ29uZmlnIHtcclxuICAvKipcclxuICAgKiBNYXggbG9nIGZpbGUgc2l6ZSBiZWZvcmUgcm90YXRpb24sIGUuZy4gJzEwbScsICc1aycsIG9yIGEgYnl0ZSBjb3VudC5cclxuICAgKi9cclxuICBtYXhTaXplPzogc3RyaW5nIHwgbnVtYmVyXHJcbiAgLyoqXHJcbiAgICogS2VlcCBhdCBtb3N0IE4gZmlsZXMgb3Iga2VlcCBmaWxlcyBmb3IgYSBkdXJhdGlvbiBsaWtlICc3ZCcuXHJcbiAgICovXHJcbiAgbWF4RmlsZXM/OiBudW1iZXIgfCBzdHJpbmdcclxuICAvKipcclxuICAgKiBSb3RhdGUgYXQgYSBmaXhlZCBpbnRlcnZhbCwgZS5nLiAnMWQnLCAnMTJoJy5cclxuICAgKi9cclxuICBpbnRlcnZhbD86IHN0cmluZ1xyXG4gIGNvbXByZXNzPzogYm9vbGVhblxyXG4gIGNvbXByZXNzaW9uPzogJ2d6aXAnXHJcbn1cclxuXHJcblxyXG5cclxuXHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIE9wdGlvbnMge1xyXG4gIGNvbmZpZz86IHtcclxuICAgIHNob3dTdGFydHVwTWVzc2FnZT86IGJvb2xlYW5cclxuICAgIHN0YXJ0dXBNZXNzYWdlRm9ybWF0PzogJ3NpbXBsZScgfCAnYmFubmVyJ1xyXG4gICAgdXNlQ29sb3JzPzogYm9vbGVhblxyXG4gICAgaXA/OiBib29sZWFuXHJcbiAgICB0aW1lc3RhbXA/OiB7XHJcbiAgICAgIHRyYW5zbGF0ZVRpbWU/OiBzdHJpbmdcclxuICAgIH1cclxuICAgIGN1c3RvbUxvZ0Zvcm1hdD86IHN0cmluZ1xyXG5cclxuICAgIC8vIE91dHB1dHNcclxuICAgIHRyYW5zcG9ydHM/OiBUcmFuc3BvcnRbXVxyXG4gICAgdXNlVHJhbnNwb3J0c09ubHk/OiBib29sZWFuXHJcbiAgICBkaXNhYmxlSW50ZXJuYWxMb2dnZXI/OiBib29sZWFuXHJcbiAgICBkaXNhYmxlRmlsZUxvZ2dpbmc/OiBib29sZWFuXHJcbiAgICBsb2dGaWxlUGF0aD86IHN0cmluZ1xyXG4gICAgbG9nUm90YXRpb24/OiBMb2dSb3RhdGlvbkNvbmZpZ1xyXG5cclxuICAgIC8vIFBpbm9cclxuICAgIHBpbm8/OiAoUGlub0xvZ2dlck9wdGlvbnMgJiB7IHByZXR0eVByaW50PzogYm9vbGVhbiB9KSB8IHVuZGVmaW5lZFxyXG4gIFxyXG4gICAgZXJyb3I/OnsgXHJcbiAgICAgcHJvYmxlbUpzb24/OnsgXHJcbiAgICAgIHR5cGVCYXNlVXJsPzogc3RyaW5nXHJcbiAgICB9XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiB0cmFuc2Zvcm0/OiAoZXJyb3I6IHVua25vd24sIGNvbnRleHQ6IHsgcmVxdWVzdDogUmVxdWVzdDsgY29kZTogQ29kZSB9KSA9PiBQcm9ibGVtRXJyb3IgfCB1bmtub3duXHJcblxyXG4gXHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBIdHRwRXJyb3IgZXh0ZW5kcyBFcnJvciB7XHJcbiAgcmVhZG9ubHkgc3RhdHVzOiBudW1iZXJcclxuXHJcbiAgY29uc3RydWN0b3Ioc3RhdHVzOiBudW1iZXIsIG1lc3NhZ2U6IHN0cmluZykge1xyXG4gICAgc3VwZXIobWVzc2FnZSlcclxuICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIExvZ2dlciB7XHJcbiAgcGlubzogUGlub1xyXG4gIGxvZzogKFxyXG4gICAgbGV2ZWw6IExvZ0xldmVsLFxyXG4gICAgcmVxdWVzdDogUmVxdWVzdCxcclxuICAgIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxyXG4gICAgc3RvcmU6IFN0b3JlRGF0YVxyXG4gICkgPT4gdm9pZFxyXG4gIGhhbmRsZUh0dHBFcnJvcjogKFxyXG4gICAgcmVxdWVzdDogUmVxdWVzdCxcclxuICAgIGVycm9yOiBQcm9ibGVtRXJyb3IsXHJcbiAgICBzdG9yZTogU3RvcmVEYXRhLFxyXG4gICAgb3B0aW9uczogT3B0aW9uc1xyXG4gICkgPT4gdm9pZFxyXG4gIGRlYnVnOiAoXHJcbiAgICByZXF1ZXN0OiBSZXF1ZXN0LFxyXG4gICAgbWVzc2FnZTogc3RyaW5nLFxyXG4gICAgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XHJcbiAgKSA9PiB2b2lkXHJcbiAgaW5mbzogKFxyXG4gICAgcmVxdWVzdDogUmVxdWVzdCxcclxuICAgIG1lc3NhZ2U6IHN0cmluZyxcclxuICAgIGNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxyXG4gICkgPT4gdm9pZFxyXG4gIHdhcm46IChcclxuICAgIHJlcXVlc3Q6IFJlcXVlc3QsXHJcbiAgICBtZXNzYWdlOiBzdHJpbmcsXHJcbiAgICBjb250ZXh0PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cclxuICApID0+IHZvaWRcclxuICBlcnJvcjogKFxyXG4gICAgcmVxdWVzdDogUmVxdWVzdCxcclxuICAgIG1lc3NhZ2U6IHN0cmluZyxcclxuICAgIGNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxyXG4gICkgPT4gdm9pZFxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIExvZ2l4bHlzaWFDb250ZXh0IHtcclxuICByZXF1ZXN0OiBSZXF1ZXN0XHJcbiAgc3RvcmU6IExvZ2l4bHlzaWFTdG9yZVxyXG59XHJcbiIKICBdLAogICJtYXBwaW5ncyI6ICJBQUFBLGlCQUFTLGdCQ0FULG1DQUVBLElBQU0sRUFBYSxDQUFDLEVBQWMsSUFBMEIsQ0FDMUQsR0FBSSxFQUFLLFFBQVUsRUFDakIsT0FBTyxFQUFLLE1BQU0sRUFBRyxDQUFLLEVBRzVCLElBQU0sRUFBTyxLQUFLLE9BQU8sRUFBUSxFQUFLLFFBQVUsQ0FBQyxFQUMzQyxFQUFRLEVBQVEsRUFBSyxPQUFTLEVBQ3BDLE1BQU8sR0FBRyxJQUFJLE9BQU8sQ0FBSSxJQUFJLElBQU8sSUFBSSxPQUFPLENBQUssS0FHekMsRUFBZSxDQUFDLElBQTRCLENBQ3ZELElBQU0sRUFBYyxXQUFXLEVBQVUsVUFFbkMsRUFEZSxLQUFLLElBQUksRUFBUSxPQUFRLEVBQVksTUFBTSxFQUM5QixFQUU1QixFQUFNLElBQUcsSUFBSSxPQUFPLENBQVUsS0FDOUIsRUFBTSxJQUFHLElBQUksT0FBTyxDQUFVLEtBQzlCLEVBQVEsSUFBRyxJQUFJLE9BQU8sQ0FBVSxLQUVoQyxFQUFhLElBQUcsRUFBVyxFQUFhLENBQVUsS0FDbEQsRUFBYSxNQUFLLElBQVUsSUFBSSxPQUFPLEtBQUssSUFBSSxFQUFHLEVBQWEsRUFBUSxPQUFTLENBQUMsQ0FBQyxPQUV6RixNQUFPLENBQUMsRUFBSyxFQUFPLEVBQVksRUFBTyxFQUFZLEVBQU8sQ0FBRyxFQUFFLEtBQUs7QUFBQSxDQUFJLEdDckJuRSxJQUFNLEVBQWMsQ0FDekIsRUFDQSxJQUNTLENBRVQsR0FBSSxFQUR1QixFQUFRLFFBQVEsb0JBQXNCLElB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RTlCLEVBQ0EsVUFBVSxFQUFHLFdBQVksQ0FDeEIsRUFBTSxXQUFhLFFBQVEsT0FBTyxPQUFPLEVBQzFDLEVBQ0EsY0FBYyxFQUFHLFVBQVMsTUFBSyxXQUFZLENBQzFDLEdBQUksRUFBYSxJQUFJLENBQU8sRUFDMUIsT0FHRixJQUFNLEVBQVMsT0FBTyxFQUFJLFNBQVcsU0FBVyxFQUFJLE9BQVMsSUFDekQsRUFBc0MsT0FDMUMsR0FBSSxHQUFVLElBQ1osRUFBUSxRQUNILFFBQUksR0FBVSxJQUNuQixFQUFRLFVBR1YsRUFBTyxJQUFJLEVBQU8sRUFBUyxDQUFFLFFBQU8sRUFBRyxDQUFLLEVBQzdDLEVBQ0EsUUFBUSxFQUFHLFVBQVMsUUFBTSxPQUFNLE9BQUssUUFBTSxTQUFVLENBTTFELElBQUksRUFBUyxFQUFRLFVBQVksRUFBUSxVQUFVLEVBQU8sQ0FBRSxVQUFTLE1BQUssQ0FBQyxFQUFJLEVBTXpFLEVBQVUsRUFBbUIsRUFBUSxFQUFNLEVBQU0sRUFBUSxRQUFRLE9BQU8sYUFBYSxXQUFXLEVBZ0J0RyxPQVZBLEVBQU8sZ0JBQWdCLEVBQVMsRUFBUyxFQUFPLENBQU8sRUFNdkQsRUFBSSxPQUFTLEVBQVEsT0FDckIsRUFBSSxRQUFRLGdCQUFrQiwyQkFHdkIsRUFBUSxPQUFPLEVBR2pCLEVBRUEsR0FBRyxRQUFRLEdBbUJIIiwKICAiZGVidWdJZCI6ICI1OEI2MjZDNjM5NkI0OTNFNjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==
|
|
7
|
+
//# debugId=687842488FA3B04264756E2164756E21
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjXFxpbmRleC50cyIsICJzcmNcXGV4dGVuc2lvbnNcXGJhbm5lci50cyIsICJzcmNcXGV4dGVuc2lvbnNcXGluZGV4LnRzIiwgInNyY1xcbG9nZ2VyXFxpbmRleC50cyIsICJzcmNcXG91dHB1dFxcaW5kZXgudHMiLCAic3JjXFxvdXRwdXRcXGZpbGUudHMiLCAic3JjXFxvdXRwdXRcXGZzLnRzIiwgInNyY1xcb3V0cHV0XFxyb3RhdGlvbi1tYW5hZ2VyLnRzIiwgInNyY1xcdXRpbHNcXHJvdGF0aW9uLnRzIiwgInNyY1xcbG9nZ2VyXFxjcmVhdGUtbG9nZ2VyLnRzIiwgInNyY1xcaGVscGVyc1xcc3RhdHVzLnRzIiwgInNyY1xcbG9nZ2VyXFxoYW5kbGUtaHR0cC1lcnJvci50cyIsICJzcmNcXEVycm9yXFxlcnJvcnMudHMiLCAic3JjXFx1dGlsc1xcaGFuZGxlLWVycm9yLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgImltcG9ydCB7IEVseXNpYSwgdHlwZSBTaW5nbGV0b25CYXNlIH0gZnJvbSAnZWx5c2lhJ1xyXG5pbXBvcnQgeyBzdGFydFNlcnZlciB9IGZyb20gJy4vZXh0ZW5zaW9ucydcclxuaW1wb3J0IHR5cGUgeyBMb2dpeGx5c2lhU3RvcmUsIE9wdGlvbnMgfSBmcm9tICcuL2ludGVyZmFjZXMnXHJcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyJ1xyXG5pbXBvcnQgeyBub3JtYWxpemVUb1Byb2JsZW0gfSBmcm9tICcuL3V0aWxzL2hhbmRsZS1lcnJvcidcclxuXHJcbmV4cG9ydCB0eXBlIExvZ2l4bHlzaWEgPSBFbHlzaWE8XHJcbiAgJ0xvZ2l4bHlzaWEnLFxyXG4gIFNpbmdsZXRvbkJhc2UgJiB7IHN0b3JlOiBMb2dpeGx5c2lhU3RvcmUgfVxyXG4+XHJcblxyXG5leHBvcnQgY29uc3QgbG9naXhseXNpYSA9IChvcHRpb25zOiBPcHRpb25zID0ge30pOiBMb2dpeGx5c2lhID0+IHtcclxuICBjb25zdCBkaWRDdXN0b21Mb2cgPSBuZXcgV2Vha1NldDxSZXF1ZXN0PigpXHJcbiAgY29uc3QgYmFzZUxvZ2dlciA9IGNyZWF0ZUxvZ2dlcihvcHRpb25zKVxyXG4gIGNvbnN0IGxvZ2dlciA9IHtcclxuICAgIC4uLmJhc2VMb2dnZXIsXHJcbiAgICBkZWJ1ZzogKFxyXG4gICAgICByZXF1ZXN0OiBSZXF1ZXN0LFxyXG4gICAgICBtZXNzYWdlOiBzdHJpbmcsXHJcbiAgICAgIGNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxyXG4gICAgKSA9PiB7XHJcbiAgICAgIGRpZEN1c3RvbUxvZy5hZGQocmVxdWVzdClcclxuICAgICAgYmFzZUxvZ2dlci5kZWJ1ZyhyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KVxyXG4gICAgfSxcclxuICAgIGluZm86IChcclxuICAgICAgcmVxdWVzdDogUmVxdWVzdCxcclxuICAgICAgbWVzc2FnZTogc3RyaW5nLFxyXG4gICAgICBjb250ZXh0PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cclxuICAgICkgPT4ge1xyXG4gICAgICBkaWRDdXN0b21Mb2cuYWRkKHJlcXVlc3QpXHJcbiAgICAgIGJhc2VMb2dnZXIuaW5mbyhyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KVxyXG4gICAgfSxcclxuICAgIHdhcm46IChcclxuICAgICAgcmVxdWVzdDogUmVxdWVzdCxcclxuICAgICAgbWVzc2FnZTogc3RyaW5nLFxyXG4gICAgICBjb250ZXh0PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cclxuICAgICkgPT4ge1xyXG4gICAgICBkaWRDdXN0b21Mb2cuYWRkKHJlcXVlc3QpXHJcbiAgICAgIGJhc2VMb2dnZXIud2FybihyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KVxyXG4gICAgfSxcclxuICAgIGVycm9yOiAoXHJcbiAgICAgIHJlcXVlc3Q6IFJlcXVlc3QsXHJcbiAgICAgIG1lc3NhZ2U6IHN0cmluZyxcclxuICAgICAgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XHJcbiAgICApID0+IHtcclxuICAgICAgZGlkQ3VzdG9tTG9nLmFkZChyZXF1ZXN0KVxyXG4gICAgICBiYXNlTG9nZ2VyLmVycm9yKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb25zdCBhcHAgPSBuZXcgRWx5c2lhKHtcclxuICAgIG5hbWU6ICdMb2dpeGx5c2lhJyxcclxuICAgIGRldGFpbDoge1xyXG4gICAgICBkZXNjcmlwdGlvbjpcclxuICAgICAgICAnTG9naXhseXNpYSBpcyBhIHBsdWdpbiBmb3IgRWx5c2lhIHRoYXQgcHJvdmlkZXMgYSBsb2dnZXIgYW5kIHBpbm8gbG9nZ2VyLicsXHJcbiAgICAgIHRhZ3M6IFsnbG9nZ2luZycsICdwaW5vJ11cclxuICAgIH1cclxuICB9KVxyXG5cclxuICByZXR1cm4gKFxyXG4gICAgYXBwXHJcbiAgICAgIC5zdGF0ZSgnbG9nZ2VyJywgbG9nZ2VyKVxyXG4gICAgICAuc3RhdGUoJ3Bpbm8nLCBsb2dnZXIucGlubylcclxuICAgICAgLnN0YXRlKCdiZWZvcmVUaW1lJywgQmlnSW50KDApKVxyXG4gICAgICAub25TdGFydCgoeyBzZXJ2ZXIgfSkgPT4ge1xyXG4gICAgICAgIGlmIChzZXJ2ZXIpIHtcclxuICAgICAgICAgIHN0YXJ0U2VydmVyKHNlcnZlciwgb3B0aW9ucylcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICAgIC5vblJlcXVlc3QoKHsgc3RvcmUgfSkgPT4ge1xyXG4gICAgICAgIHN0b3JlLmJlZm9yZVRpbWUgPSBwcm9jZXNzLmhydGltZS5iaWdpbnQoKVxyXG4gICAgICB9KVxyXG4gICAgICAub25BZnRlckhhbmRsZSgoeyByZXF1ZXN0LCBzZXQsIHN0b3JlIH0pID0+IHtcclxuICAgICAgICBpZiAoZGlkQ3VzdG9tTG9nLmhhcyhyZXF1ZXN0KSkge1xyXG4gICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBzdGF0dXMgPSB0eXBlb2Ygc2V0LnN0YXR1cyA9PT0gJ251bWJlcicgPyBzZXQuc3RhdHVzIDogMjAwXHJcbiAgICAgICAgbGV0IGxldmVsOiAnSU5GTycgfCAnV0FSTklORycgfCAnRVJST1InID0gJ0lORk8nXHJcbiAgICAgICAgaWYgKHN0YXR1cyA+PSA1MDApIHtcclxuICAgICAgICAgIGxldmVsID0gJ0VSUk9SJ1xyXG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID49IDQwMCkge1xyXG4gICAgICAgICAgbGV2ZWwgPSAnV0FSTklORydcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxvZ2dlci5sb2cobGV2ZWwsIHJlcXVlc3QsIHsgc3RhdHVzIH0sIHN0b3JlKVxyXG4gICAgICB9KVxyXG4gICAgICAub25FcnJvcigoeyByZXF1ZXN0LCBlcnJvcixjb2RlLCBwYXRoLHN0b3JlLHNldCB9KSA9PiB7XHJcbiAgICAgICAgLy8gbG9nZ2VyLmhhbmRsZUh0dHBFcnJvcihyZXF1ZXN0LCBlcnJvciwgc3RvcmUpXHJcblxyXG4gICAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gIC8vIFBoYXNlIDE6IFRyYW5zZm9ybSAo6L2s5o2iKVxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gIGxldCByZXN1bHQgPSBvcHRpb25zLnRyYW5zZm9ybSA/IG9wdGlvbnMudHJhbnNmb3JtKGVycm9yLCB7IHJlcXVlc3QsIGNvZGUgfSkgOiBlcnJvclxyXG5cclxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICAvLyBQaGFzZSAyOiBOb3JtYWxpemF0aW9uICjop4TojIPljJYpXHJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgLy8g57uf5LiA6L2s5Li6IFByb2JsZW1FcnJvciDlrp7kvotcclxuICBjb25zdCBwcm9ibGVtID0gbm9ybWFsaXplVG9Qcm9ibGVtKHJlc3VsdCwgY29kZSwgcGF0aCwgb3B0aW9ucy5jb25maWc/LmVycm9yPy5wcm9ibGVtSnNvbj8udHlwZUJhc2VVcmwpXHJcblxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gIC8vIFBoYXNlIDM6IExvZ2dpbmcgKOaXpeW/lylcclxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICAvLyDosIPnlKjkuIrpnaLmlLnpgKDlkI7nmoTlh73mlbDvvIzlroPnjrDlnKjlj6rotJ/otKPorrDlvZXvvIzkuI3otJ/otKPpgLvovpHliKTmlq1cclxuICBsb2dnZXIuaGFuZGxlSHR0cEVycm9yKHJlcXVlc3QsIHByb2JsZW0sIHN0b3JlLCBvcHRpb25zKVxyXG5cclxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICAvLyBQaGFzZSA0OiBSZXNwb25zZSAo5ZON5bqUKVxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gIC8vIOe7n+S4gOiuvue9riBIZWFkZXIg5ZKMIFN0YXR1c1xyXG4gIHNldC5zdGF0dXMgPSBwcm9ibGVtLnN0YXR1c1xyXG4gIHNldC5oZWFkZXJzWydjb250ZW50LXR5cGUnXSA9ICdhcHBsaWNhdGlvbi9wcm9ibGVtK2pzb24nXHJcblxyXG4gIC8vIOi/lOWbnuespuWQiCBSRkMg5qCH5YeG55qEIEpTT05cclxuICByZXR1cm4gcHJvYmxlbS50b0pTT04oKVxyXG5cclxuXHJcbiAgICAgIH0pXHJcbiAgICAgIC8vIEVuc3VyZSBwbHVnaW4gbGlmZWN5Y2xlIGhvb2tzIChvblJlcXVlc3Qvb25BZnRlckhhbmRsZS9vbkVycm9yKSBhcHBseSB0byB0aGUgcGFyZW50IGFwcC5cclxuICAgICAgLmFzKCdzY29wZWQnKSBhcyB1bmtub3duIGFzIExvZ2l4bHlzaWFcclxuICApXHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIHtcclxuICBMb2dnZXIsXHJcbiAgTG9naXhseXNpYUNvbnRleHQsXHJcbiAgTG9naXhseXNpYVN0b3JlLFxyXG4gIExvZ0xldmVsLFxyXG4gIE9wdGlvbnMsXHJcbiAgUGlubyxcclxuICBTdG9yZURhdGEsXHJcbiAgVHJhbnNwb3J0LFxyXG59IGZyb20gJy4vaW50ZXJmYWNlcydcclxuXHJcbmV4cG9ydCB7IEh0dHBFcnJvciB9IGZyb20gJy4vRXJyb3IvZXJyb3JzJ1xyXG5leHBvcnQgeyB0b1Byb2JsZW1Kc29uLCBmb3JtYXRQcm9ibGVtSnNvbkxvZyB9IGZyb20gJy4vdXRpbHMvaGFuZGxlLWVycm9yJ1xyXG5leHBvcnQgdHlwZSB7IFByb2JsZW1Kc29uIH0gZnJvbSAnLi91dGlscy9oYW5kbGUtZXJyb3InXHJcblxyXG5leHBvcnQgZGVmYXVsdCBsb2dpeGx5c2lhXHJcblxyXG4iLAogICAgImltcG9ydCBlbHlzaWFQa2cgZnJvbSAnZWx5c2lhL3BhY2thZ2UuanNvbidcclxuXHJcbmNvbnN0IGNlbnRlclRleHQgPSAodGV4dDogc3RyaW5nLCB3aWR0aDogbnVtYmVyKTogc3RyaW5nID0+IHtcclxuICBpZiAodGV4dC5sZW5ndGggPj0gd2lkdGgpIHtcclxuICAgIHJldHVybiB0ZXh0LnNsaWNlKDAsIHdpZHRoKVxyXG4gIH1cclxuXHJcbiAgY29uc3QgbGVmdCA9IE1hdGguZmxvb3IoKHdpZHRoIC0gdGV4dC5sZW5ndGgpIC8gMilcclxuICBjb25zdCByaWdodCA9IHdpZHRoIC0gdGV4dC5sZW5ndGggLSBsZWZ0XHJcbiAgcmV0dXJuIGAkeycgJy5yZXBlYXQobGVmdCl9JHt0ZXh0fSR7JyAnLnJlcGVhdChyaWdodCl9YFxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgcmVuZGVyQmFubmVyID0gKG1lc3NhZ2U6IHN0cmluZyk6IHN0cmluZyA9PiB7XHJcbiAgY29uc3QgdmVyc2lvbkxpbmUgPSBgRWx5c2lhIHYke2VseXNpYVBrZy52ZXJzaW9ufWBcclxuICBjb25zdCBjb250ZW50V2lkdGggPSBNYXRoLm1heChtZXNzYWdlLmxlbmd0aCwgdmVyc2lvbkxpbmUubGVuZ3RoKVxyXG4gIGNvbnN0IGlubmVyV2lkdGggPSBjb250ZW50V2lkdGggKyA0IC8vIDIgc3BhY2VzIHBhZGRpbmcgb24gYm90aCBzaWRlc1xyXG5cclxuICBjb25zdCB0b3AgPSBg4pSMJHsn4pSAJy5yZXBlYXQoaW5uZXJXaWR0aCl94pSQYFxyXG4gIGNvbnN0IGJvdCA9IGDilJQkeyfilIAnLnJlcGVhdChpbm5lcldpZHRoKX3ilJhgXHJcbiAgY29uc3QgZW1wdHkgPSBg4pSCJHsnICcucmVwZWF0KGlubmVyV2lkdGgpfeKUgmBcclxuXHJcbiAgY29uc3QgdmVyc2lvblJvdyA9IGDilIIke2NlbnRlclRleHQodmVyc2lvbkxpbmUsIGlubmVyV2lkdGgpfeKUgmBcclxuICBjb25zdCBtZXNzYWdlUm93ID0gYOKUgiAgJHttZXNzYWdlfSR7JyAnLnJlcGVhdChNYXRoLm1heCgwLCBpbm5lcldpZHRoIC0gbWVzc2FnZS5sZW5ndGggLSA0KSl9ICDilIJgXHJcblxyXG4gIHJldHVybiBbdG9wLCBlbXB0eSwgdmVyc2lvblJvdywgZW1wdHksIG1lc3NhZ2VSb3csIGVtcHR5LCBib3RdLmpvaW4oJ1xcbicpXHJcbn1cclxuIiwKICAgICJpbXBvcnQgdHlwZSB7IE9wdGlvbnMgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xyXG5pbXBvcnQgeyByZW5kZXJCYW5uZXIgfSBmcm9tICcuL2Jhbm5lcidcclxuXHJcbmV4cG9ydCBjb25zdCBzdGFydFNlcnZlciA9IChcclxuICBzZXJ2ZXI6IHsgcG9ydD86IG51bWJlcjsgaG9zdG5hbWU/OiBzdHJpbmc7IHByb3RvY29sPzogc3RyaW5nIHwgbnVsbCB9LFxyXG4gIG9wdGlvbnM6IE9wdGlvbnNcclxuKTogdm9pZCA9PiB7XHJcbiAgY29uc3Qgc2hvd1N0YXJ0dXBNZXNzYWdlID0gb3B0aW9ucy5jb25maWc/LnNob3dTdGFydHVwTWVzc2FnZSA/PyB0cnVlXHJcbiAgaWYgKCFzaG93U3RhcnR1cE1lc3NhZ2UpIHtcclxuICAgIHJldHVyblxyXG4gIH1cclxuXHJcbiAgY29uc3QgeyBwb3J0LCBob3N0bmFtZSwgcHJvdG9jb2wgfSA9IHNlcnZlclxyXG4gIGlmIChwb3J0ID09PSB1bmRlZmluZWQgfHwgIWhvc3RuYW1lIHx8ICFwcm90b2NvbCkge1xyXG4gICAgcmV0dXJuXHJcbiAgfVxyXG5cclxuICBjb25zdCB1cmwgPSBgJHtwcm90b2NvbH06Ly8ke2hvc3RuYW1lfToke3BvcnR9YFxyXG4gIGNvbnN0IG1lc3NhZ2UgPSBg8J+miiBFbHlzaWEgaXMgcnVubmluZyBhdCAke3VybH1gXHJcblxyXG4gIGNvbnN0IGZvcm1hdCA9IG9wdGlvbnMuY29uZmlnPy5zdGFydHVwTWVzc2FnZUZvcm1hdCA/PyAnYmFubmVyJ1xyXG4gIGlmIChmb3JtYXQgPT09ICdzaW1wbGUnKSB7XHJcbiAgICBjb25zb2xlLmxvZyhtZXNzYWdlKVxyXG4gICAgcmV0dXJuXHJcbiAgfVxyXG5cclxuICBjb25zb2xlLmxvZyhyZW5kZXJCYW5uZXIobWVzc2FnZSkpXHJcbn1cclxuIiwKICAgICJpbXBvcnQgcGlubyBmcm9tICdwaW5vJ1xyXG5pbXBvcnQgdHlwZSB7XHJcbiAgTG9nZ2VyLFxyXG4gIExvZ0xldmVsLFxyXG4gIE9wdGlvbnMsXHJcbiAgUGlubyxcclxuICBSZXF1ZXN0SW5mbyxcclxuICBTdG9yZURhdGEsXHJcbiAgTG9nRmlsdGVyXHJcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcydcclxuaW1wb3J0IHsgbG9nVG9UcmFuc3BvcnRzIH0gZnJvbSAnLi4vb3V0cHV0J1xyXG5pbXBvcnQgeyBsb2dUb0ZpbGUgfSBmcm9tICcuLi9vdXRwdXQvZmlsZSdcclxuaW1wb3J0IHsgZm9ybWF0TGluZSB9IGZyb20gJy4vY3JlYXRlLWxvZ2dlcidcclxuaW1wb3J0IHsgaGFuZGxlSHR0cEVycm9yIH0gZnJvbSAnLi9oYW5kbGUtaHR0cC1lcnJvcidcclxuXHJcbmV4cG9ydCBjb25zdCBjcmVhdGVMb2dnZXIgPSAob3B0aW9uczogT3B0aW9ucyA9IHt9KTogTG9nZ2VyID0+IHtcclxuICBjb25zdCBjb25maWcgPSBvcHRpb25zLmNvbmZpZ1xyXG5cclxuICBjb25zdCBwaW5vQ29uZmlnID0gY29uZmlnPy5waW5vXHJcbiAgY29uc3QgeyBwcmV0dHlQcmludCwgLi4ucGlub09wdGlvbnMgfSA9IHBpbm9Db25maWcgPz8ge31cclxuXHJcbiAgY29uc3Qgc2hvdWxkUHJldHR5UHJpbnQgPVxyXG4gICAgcHJldHR5UHJpbnQgPT09IHRydWUgJiYgcGlub09wdGlvbnMudHJhbnNwb3J0ID09PSB1bmRlZmluZWRcclxuXHJcbiAgY29uc3QgdHJhbnNwb3J0ID0gc2hvdWxkUHJldHR5UHJpbnRcclxuICAgID8gcGluby50cmFuc3BvcnQoe1xyXG4gICAgICAgIHRhcmdldDogJ3Bpbm8tcHJldHR5JyxcclxuICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICBjb2xvcml6ZTogcHJvY2Vzcy5zdGRvdXQ/LmlzVFRZID09PSB0cnVlLFxyXG4gICAgICAgICAgdHJhbnNsYXRlVGltZTogY29uZmlnPy50aW1lc3RhbXA/LnRyYW5zbGF0ZVRpbWUsXHJcbiAgICAgICAgICBtZXNzYWdlS2V5OiBwaW5vT3B0aW9ucy5tZXNzYWdlS2V5LFxyXG4gICAgICAgICAgZXJyb3JLZXk6IHBpbm9PcHRpb25zLmVycm9yS2V5XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgOiBwaW5vT3B0aW9ucy50cmFuc3BvcnRcclxuXHJcbiAgY29uc3QgcGlub0xvZ2dlcjogUGlubyA9IHBpbm8oe1xyXG4gICAgLi4ucGlub09wdGlvbnMsXHJcbiAgICBsZXZlbDogcGlub09wdGlvbnMubGV2ZWwgPz8gJ2luZm8nLFxyXG4gICAgbWVzc2FnZUtleTogcGlub09wdGlvbnMubWVzc2FnZUtleSxcclxuICAgIGVycm9yS2V5OiBwaW5vT3B0aW9ucy5lcnJvcktleSxcclxuICAgIHRyYW5zcG9ydFxyXG4gIH0pXHJcblxyXG4gIGNvbnN0IHNob3VsZExvZyA9IChsZXZlbDogTG9nTGV2ZWwsIGxvZ0ZpbHRlcj86IExvZ0ZpbHRlcik6IGJvb2xlYW4gPT4ge1xyXG4gICAgaWYgKCFsb2dGaWx0ZXI/LmxldmVsIHx8IGxvZ0ZpbHRlci5sZXZlbC5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmV0dXJuIHRydWVcclxuICAgIH1cclxuICAgIHJldHVybiBsb2dGaWx0ZXIubGV2ZWwuaW5jbHVkZXMobGV2ZWwpXHJcbiAgfVxyXG5cclxuICBjb25zdCBsb2cgPSAoXHJcbiAgICBsZXZlbDogTG9nTGV2ZWwsXHJcbiAgICByZXF1ZXN0OiBSZXF1ZXN0LFxyXG4gICAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXHJcbiAgICBzdG9yZTogU3RvcmVEYXRhXHJcbiAgKTogdm9pZCA9PiB7XHJcbiAgICAvLyBDaGVjayBpZiB0aGlzIGxvZyBsZXZlbCBzaG91bGQgYmUgZmlsdGVyZWRcclxuICAgIGlmICghc2hvdWxkTG9nKGxldmVsLCBjb25maWc/LmxvZ0ZpbHRlcikpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgbG9nVG9UcmFuc3BvcnRzKHsgbGV2ZWwsIHJlcXVlc3QsIGRhdGEsIHN0b3JlLCBvcHRpb25zIH0pXHJcblxyXG4gICAgY29uc3QgdXNlVHJhbnNwb3J0c09ubHkgPSBjb25maWc/LnVzZVRyYW5zcG9ydHNPbmx5ID09PSB0cnVlXHJcbiAgICBjb25zdCBkaXNhYmxlSW50ZXJuYWxMb2dnZXIgPSBjb25maWc/LmRpc2FibGVJbnRlcm5hbExvZ2dlciA9PT0gdHJ1ZVxyXG4gICAgY29uc3QgZGlzYWJsZUZpbGVMb2dnaW5nID0gY29uZmlnPy5kaXNhYmxlRmlsZUxvZ2dpbmcgPT09IHRydWVcclxuXHJcbiAgICBpZiAoISh1c2VUcmFuc3BvcnRzT25seSB8fCBkaXNhYmxlRmlsZUxvZ2dpbmcpKSB7XHJcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gY29uZmlnPy5sb2dGaWxlUGF0aFxyXG4gICAgICBpZiAoZmlsZVBhdGgpIHtcclxuICAgICAgICBsb2dUb0ZpbGUoeyBmaWxlUGF0aCwgbGV2ZWwsIHJlcXVlc3QsIGRhdGEsIHN0b3JlLCBvcHRpb25zIH0pLmNhdGNoKFxyXG4gICAgICAgICAgKCkgPT4ge1xyXG4gICAgICAgICAgICAvLyBJZ25vcmUgZXJyb3JzXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgKVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHVzZVRyYW5zcG9ydHNPbmx5IHx8IGRpc2FibGVJbnRlcm5hbExvZ2dlcikge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBtZXNzYWdlID0gZm9ybWF0TGluZSh7IGxldmVsLCByZXF1ZXN0LCBkYXRhLCBzdG9yZSwgb3B0aW9ucyB9KVxyXG5cclxuICAgIHN3aXRjaCAobGV2ZWwpIHtcclxuICAgICAgY2FzZSAnREVCVUcnOiB7XHJcbiAgICAgICAgY29uc29sZS5kZWJ1ZyhtZXNzYWdlKVxyXG4gICAgICAgIGJyZWFrXHJcbiAgICAgIH1cclxuICAgICAgY2FzZSAnSU5GTyc6IHtcclxuICAgICAgICBjb25zb2xlLmluZm8obWVzc2FnZSlcclxuICAgICAgICBicmVha1xyXG4gICAgICB9XHJcbiAgICAgIGNhc2UgJ1dBUk5JTkcnOiB7XHJcbiAgICAgICAgY29uc29sZS53YXJuKG1lc3NhZ2UpXHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgfVxyXG4gICAgICBjYXNlICdFUlJPUic6IHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UpXHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgfVxyXG4gICAgICBkZWZhdWx0OiB7XHJcbiAgICAgICAgY29uc29sZS5sb2cobWVzc2FnZSlcclxuICAgICAgICBicmVha1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb25zdCBsb2dXaXRoQ29udGV4dCA9IChcclxuICAgIGxldmVsOiBMb2dMZXZlbCxcclxuICAgIHJlcXVlc3Q6IFJlcXVlc3QsXHJcbiAgICBtZXNzYWdlOiBzdHJpbmcsXHJcbiAgICBjb250ZXh0PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cclxuICApOiB2b2lkID0+IHtcclxuICAgIGNvbnN0IHN0b3JlOiBTdG9yZURhdGEgPSB7IGJlZm9yZVRpbWU6IHByb2Nlc3MuaHJ0aW1lLmJpZ2ludCgpIH1cclxuICAgIGxvZyhsZXZlbCwgcmVxdWVzdCwgeyBtZXNzYWdlLCBjb250ZXh0IH0sIHN0b3JlKVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIHBpbm86IHBpbm9Mb2dnZXIsXHJcbiAgICBsb2csXHJcbiAgICBoYW5kbGVIdHRwRXJyb3I6IChyZXF1ZXN0LCBlcnJvciwgc3RvcmUpID0+IHtcclxuICAgICAgaGFuZGxlSHR0cEVycm9yKHJlcXVlc3QsIGVycm9yLCBzdG9yZSwgb3B0aW9ucylcclxuICAgIH0sXHJcbiAgICBkZWJ1ZzogKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpID0+IHtcclxuICAgICAgbG9nV2l0aENvbnRleHQoJ0RFQlVHJywgcmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dClcclxuICAgIH0sXHJcbiAgICBpbmZvOiAocmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dCkgPT4ge1xyXG4gICAgICBsb2dXaXRoQ29udGV4dCgnSU5GTycsIHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXHJcbiAgICB9LFxyXG4gICAgd2FybjogKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpID0+IHtcclxuICAgICAgbG9nV2l0aENvbnRleHQoJ1dBUk5JTkcnLCByZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KVxyXG4gICAgfSxcclxuICAgIGVycm9yOiAocmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dCkgPT4ge1xyXG4gICAgICBsb2dXaXRoQ29udGV4dCgnRVJST1InLCByZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLAogICAgImltcG9ydCB0eXBlIHsgTG9nTGV2ZWwsIE9wdGlvbnMsIFJlcXVlc3QsIFN0b3JlRGF0YSB9IGZyb20gJy4uL2ludGVyZmFjZXMnXHJcblxyXG5pbnRlcmZhY2UgTG9nVG9UcmFuc3BvcnRzSW5wdXQge1xyXG4gIGxldmVsOiBMb2dMZXZlbFxyXG4gIHJlcXVlc3Q6IFJlcXVlc3RcclxuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxyXG4gIHN0b3JlOiBTdG9yZURhdGFcclxuICBvcHRpb25zOiBPcHRpb25zXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBsb2dUb1RyYW5zcG9ydHMgPSAoXHJcbiAgLi4uYXJnczpcclxuICAgIHwgW0xvZ1RvVHJhbnNwb3J0c0lucHV0XVxyXG4gICAgfCBbTG9nTGV2ZWwsIFJlcXVlc3QsIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBTdG9yZURhdGEsIE9wdGlvbnNdXHJcbik6IHZvaWQgPT4ge1xyXG4gIGNvbnN0IGlucHV0OiBMb2dUb1RyYW5zcG9ydHNJbnB1dCA9XHJcbiAgICB0eXBlb2YgYXJnc1swXSA9PT0gJ3N0cmluZydcclxuICAgICAgPyB7XHJcbiAgICAgICAgICBsZXZlbDogYXJnc1swXSxcclxuICAgICAgICAgIHJlcXVlc3Q6IGFyZ3NbMV0sXHJcbiAgICAgICAgICBkYXRhOiBhcmdzWzJdLFxyXG4gICAgICAgICAgc3RvcmU6IGFyZ3NbM10sXHJcbiAgICAgICAgICBvcHRpb25zOiBhcmdzWzRdXHJcbiAgICAgICAgfVxyXG4gICAgICA6IGFyZ3NbMF1cclxuXHJcbiAgY29uc3QgeyBsZXZlbCwgcmVxdWVzdCwgZGF0YSwgc3RvcmUsIG9wdGlvbnMgfSA9IGlucHV0XHJcbiAgY29uc3QgdHJhbnNwb3J0cyA9IG9wdGlvbnMuY29uZmlnPy50cmFuc3BvcnRzID8/IFtdXHJcbiAgaWYgKHRyYW5zcG9ydHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICByZXR1cm5cclxuICB9XHJcblxyXG4gIGNvbnN0IG1lc3NhZ2UgPSB0eXBlb2YgZGF0YS5tZXNzYWdlID09PSAnc3RyaW5nJyA/IGRhdGEubWVzc2FnZSA6ICcnXHJcbiAgY29uc3QgbWV0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XHJcbiAgICByZXF1ZXN0OiB7XHJcbiAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXHJcbiAgICAgIHVybDogcmVxdWVzdC51cmxcclxuICAgIH0sXHJcbiAgICAuLi5kYXRhLFxyXG4gICAgYmVmb3JlVGltZTogc3RvcmUuYmVmb3JlVGltZVxyXG4gIH1cclxuXHJcbiAgZm9yIChjb25zdCB0cmFuc3BvcnQgb2YgdHJhbnNwb3J0cykge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgcmVzdWx0ID0gdHJhbnNwb3J0LmxvZyhsZXZlbCwgbWVzc2FnZSwgbWV0YSlcclxuICAgICAgaWYgKFxyXG4gICAgICAgIHJlc3VsdCAmJlxyXG4gICAgICAgIHR5cGVvZiAocmVzdWx0IGFzIHsgY2F0Y2g/OiB1bmtub3duIH0pLmNhdGNoID09PSAnZnVuY3Rpb24nXHJcbiAgICAgICkge1xyXG4gICAgICAgIDsocmVzdWx0IGFzIFByb21pc2U8dm9pZD4pLmNhdGNoKCgpID0+IHtcclxuICAgICAgICAgIC8vIElnbm9yZSBlcnJvcnNcclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIHtcclxuICAgICAgLy8gVHJhbnNwb3J0IGZhaWx1cmVzIG11c3QgbmV2ZXIgY3Jhc2ggYXBwbGljYXRpb24gbG9nZ2luZy5cclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwKICAgICJpbXBvcnQgeyBhcHBlbmRGaWxlIH0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcydcclxuaW1wb3J0IHsgZGlybmFtZSB9IGZyb20gJ25vZGU6cGF0aCdcclxuaW1wb3J0IHR5cGUgeyBMb2dMZXZlbCwgT3B0aW9ucywgUmVxdWVzdEluZm8sIFN0b3JlRGF0YSB9IGZyb20gJy4uL2ludGVyZmFjZXMnXHJcbmltcG9ydCB7IGVuc3VyZURpciB9IGZyb20gJy4vZnMnXHJcbmltcG9ydCB7IHBlcmZvcm1Sb3RhdGlvbiwgc2hvdWxkUm90YXRlIH0gZnJvbSAnLi9yb3RhdGlvbi1tYW5hZ2VyJ1xyXG5cclxuaW50ZXJmYWNlIExvZ1RvRmlsZUlucHV0IHtcclxuICBmaWxlUGF0aDogc3RyaW5nXHJcbiAgbGV2ZWw6IExvZ0xldmVsXHJcbiAgcmVxdWVzdDogUmVxdWVzdEluZm9cclxuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxyXG4gIHN0b3JlOiBTdG9yZURhdGFcclxuICBvcHRpb25zOiBPcHRpb25zXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBsb2dUb0ZpbGUgPSBhc3luYyAoXHJcbiAgLi4uYXJnczpcclxuICAgIHwgW0xvZ1RvRmlsZUlucHV0XVxyXG4gICAgfCBbXHJcbiAgICAgICAgc3RyaW5nLFxyXG4gICAgICAgIExvZ0xldmVsLFxyXG4gICAgICAgIFJlcXVlc3RJbmZvLFxyXG4gICAgICAgIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxyXG4gICAgICAgIFN0b3JlRGF0YSxcclxuICAgICAgICBPcHRpb25zXHJcbiAgICAgIF1cclxuKTogUHJvbWlzZTx2b2lkPiA9PiB7XHJcbiAgY29uc3QgaW5wdXQ6IExvZ1RvRmlsZUlucHV0ID1cclxuICAgIHR5cGVvZiBhcmdzWzBdID09PSAnc3RyaW5nJ1xyXG4gICAgICA/ICgoKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBbXHJcbiAgICAgICAgICAgIGZpbGVQYXRoQXJnLFxyXG4gICAgICAgICAgICBsZXZlbEFyZyxcclxuICAgICAgICAgICAgcmVxdWVzdEFyZyxcclxuICAgICAgICAgICAgZGF0YUFyZyxcclxuICAgICAgICAgICAgc3RvcmVBcmcsXHJcbiAgICAgICAgICAgIG9wdGlvbnNBcmdcclxuICAgICAgICAgIF0gPSBhcmdzIGFzIFtcclxuICAgICAgICAgICAgc3RyaW5nLFxyXG4gICAgICAgICAgICBMb2dMZXZlbCxcclxuICAgICAgICAgICAgUmVxdWVzdEluZm8sXHJcbiAgICAgICAgICAgIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxyXG4gICAgICAgICAgICBTdG9yZURhdGEsXHJcbiAgICAgICAgICAgIE9wdGlvbnNcclxuICAgICAgICAgIF1cclxuICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGZpbGVQYXRoOiBmaWxlUGF0aEFyZyxcclxuICAgICAgICAgICAgbGV2ZWw6IGxldmVsQXJnLFxyXG4gICAgICAgICAgICByZXF1ZXN0OiByZXF1ZXN0QXJnLFxyXG4gICAgICAgICAgICBkYXRhOiBkYXRhQXJnLFxyXG4gICAgICAgICAgICBzdG9yZTogc3RvcmVBcmcsXHJcbiAgICAgICAgICAgIG9wdGlvbnM6IG9wdGlvbnNBcmdcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KSgpXHJcbiAgICAgIDogYXJnc1swXVxyXG5cclxuICBjb25zdCB7IGZpbGVQYXRoLCBsZXZlbCwgcmVxdWVzdCwgZGF0YSwgc3RvcmUsIG9wdGlvbnMgfSA9IGlucHV0XHJcbiAgY29uc3QgY29uZmlnID0gb3B0aW9ucy5jb25maWdcclxuICBjb25zdCB1c2VUcmFuc3BvcnRzT25seSA9IGNvbmZpZz8udXNlVHJhbnNwb3J0c09ubHkgPT09IHRydWVcclxuICBjb25zdCBkaXNhYmxlRmlsZUxvZ2dpbmcgPSBjb25maWc/LmRpc2FibGVGaWxlTG9nZ2luZyA9PT0gdHJ1ZVxyXG4gIGlmICh1c2VUcmFuc3BvcnRzT25seSB8fCBkaXNhYmxlRmlsZUxvZ2dpbmcpIHtcclxuICAgIHJldHVyblxyXG4gIH1cclxuXHJcbiAgY29uc3QgbWVzc2FnZSA9IHR5cGVvZiBkYXRhLm1lc3NhZ2UgPT09ICdzdHJpbmcnID8gZGF0YS5tZXNzYWdlIDogJydcclxuICBjb25zdCBkdXJhdGlvbk1zID1cclxuICAgIHN0b3JlLmJlZm9yZVRpbWUgPT09IEJpZ0ludCgwKVxyXG4gICAgICA/IDBcclxuICAgICAgOiBOdW1iZXIocHJvY2Vzcy5ocnRpbWUuYmlnaW50KCkgLSBzdG9yZS5iZWZvcmVUaW1lKSAvIDFfMDAwXzAwMFxyXG5cclxuICBjb25zdCBsaW5lID0gYCR7bGV2ZWx9ICR7ZHVyYXRpb25Ncy50b0ZpeGVkKDIpfW1zICR7cmVxdWVzdC5tZXRob2R9ICR7bmV3IFVSTChyZXF1ZXN0LnVybCkucGF0aG5hbWV9ICR7bWVzc2FnZX1cXG5gXHJcblxyXG4gIGF3YWl0IGVuc3VyZURpcihkaXJuYW1lKGZpbGVQYXRoKSlcclxuICBhd2FpdCBhcHBlbmRGaWxlKGZpbGVQYXRoLCBsaW5lLCB7IGVuY29kaW5nOiAndXRmLTgnIH0pXHJcblxyXG4gIGNvbnN0IHJvdGF0aW9uID0gY29uZmlnPy5sb2dSb3RhdGlvblxyXG4gIGlmICghcm90YXRpb24pIHtcclxuICAgIHJldHVyblxyXG4gIH1cclxuXHJcbiAgY29uc3Qgc2hvdWxkID0gYXdhaXQgc2hvdWxkUm90YXRlKGZpbGVQYXRoLCByb3RhdGlvbilcclxuICBpZiAoc2hvdWxkKSB7XHJcbiAgICBhd2FpdCBwZXJmb3JtUm90YXRpb24oZmlsZVBhdGgsIHJvdGF0aW9uKVxyXG4gIH1cclxufVxyXG4iLAogICAgImltcG9ydCB7IHByb21pc2VzIGFzIGZzIH0gZnJvbSAnbm9kZTpmcydcclxuXHJcbmV4cG9ydCBjb25zdCBlbnN1cmVEaXIgPSBhc3luYyAoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiA9PiB7XHJcbiAgYXdhaXQgZnMubWtkaXIoZGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSlcclxufVxyXG4iLAogICAgImltcG9ydCB7IHByb21pc2VzIGFzIGZzIH0gZnJvbSAnbm9kZTpmcydcclxuaW1wb3J0IHsgcHJvbWlzaWZ5IH0gZnJvbSAnbm9kZTp1dGlsJ1xyXG5pbXBvcnQgeyBnemlwIH0gZnJvbSAnbm9kZTp6bGliJ1xyXG5pbXBvcnQgdHlwZSB7IExvZ1JvdGF0aW9uQ29uZmlnIH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcclxuaW1wb3J0IHtcclxuICBnZXRSb3RhdGVkRmlsZXMsXHJcbiAgcGFyc2VSZXRlbnRpb24sXHJcbiAgcGFyc2VTaXplLFxyXG4gIHNob3VsZFJvdGF0ZUJ5U2l6ZVxyXG59IGZyb20gJy4uL3V0aWxzL3JvdGF0aW9uJ1xyXG5cclxuY29uc3QgZ3ppcEFzeW5jID0gcHJvbWlzaWZ5KGd6aXApXHJcblxyXG5jb25zdCBwYWQyID0gKHZhbHVlOiBudW1iZXIpOiBzdHJpbmcgPT4gU3RyaW5nKHZhbHVlKS5wYWRTdGFydCgyLCAnMCcpXHJcblxyXG5leHBvcnQgY29uc3QgZ2V0Um90YXRlZEZpbGVOYW1lID0gKGZpbGVQYXRoOiBzdHJpbmcsIGRhdGU6IERhdGUpOiBzdHJpbmcgPT4ge1xyXG4gIGNvbnN0IHl5eXkgPSBkYXRlLmdldEZ1bGxZZWFyKClcclxuICBjb25zdCBtbSA9IHBhZDIoZGF0ZS5nZXRNb250aCgpICsgMSlcclxuICBjb25zdCBkZCA9IHBhZDIoZGF0ZS5nZXREYXRlKCkpXHJcbiAgY29uc3QgSEggPSBwYWQyKGRhdGUuZ2V0SG91cnMoKSlcclxuICBjb25zdCBNTSA9IHBhZDIoZGF0ZS5nZXRNaW51dGVzKCkpXHJcbiAgY29uc3Qgc3MgPSBwYWQyKGRhdGUuZ2V0U2Vjb25kcygpKVxyXG4gIHJldHVybiBgJHtmaWxlUGF0aH0uJHt5eXl5fS0ke21tfS0ke2RkfS0ke0hIfS0ke01NfS0ke3NzfWBcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IHJvdGF0ZUZpbGUgPSBhc3luYyAoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiA9PiB7XHJcbiAgdHJ5IHtcclxuICAgIGNvbnN0IHN0YXQgPSBhd2FpdCBmcy5zdGF0KGZpbGVQYXRoKVxyXG4gICAgaWYgKHN0YXQuc2l6ZSA9PT0gMCkge1xyXG4gICAgICByZXR1cm4gJydcclxuICAgIH1cclxuICB9IGNhdGNoIHtcclxuICAgIHJldHVybiAnJ1xyXG4gIH1cclxuXHJcbiAgY29uc3Qgcm90YXRlZCA9IGdldFJvdGF0ZWRGaWxlTmFtZShmaWxlUGF0aCwgbmV3IERhdGUoKSlcclxuICBhd2FpdCBmcy5yZW5hbWUoZmlsZVBhdGgsIHJvdGF0ZWQpXHJcbiAgcmV0dXJuIHJvdGF0ZWRcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGNvbXByZXNzRmlsZSA9IGFzeW5jIChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiA9PiB7XHJcbiAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGZpbGVQYXRoKVxyXG4gIGNvbnN0IGNvbXByZXNzZWQgPSBhd2FpdCBnemlwQXN5bmMoY29udGVudClcclxuICBhd2FpdCBmcy53cml0ZUZpbGUoYCR7ZmlsZVBhdGh9Lmd6YCwgY29tcHJlc3NlZClcclxuICBhd2FpdCBmcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KVxyXG59XHJcblxyXG5leHBvcnQgY29uc3Qgc2hvdWxkUm90YXRlID0gYXN5bmMgKFxyXG4gIGZpbGVQYXRoOiBzdHJpbmcsXHJcbiAgY29uZmlnOiBMb2dSb3RhdGlvbkNvbmZpZ1xyXG4pOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcclxuICBpZiAoY29uZmlnLm1heFNpemUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgcmV0dXJuIGZhbHNlXHJcbiAgfVxyXG4gIGNvbnN0IG1heFNpemUgPSBwYXJzZVNpemUoY29uZmlnLm1heFNpemUpXHJcbiAgcmV0dXJuIGF3YWl0IHNob3VsZFJvdGF0ZUJ5U2l6ZShmaWxlUGF0aCwgbWF4U2l6ZSlcclxufVxyXG5cclxuY29uc3QgY2xlYW51cEJ5Q291bnQgPSBhc3luYyAoXHJcbiAgZmlsZVBhdGg6IHN0cmluZyxcclxuICBtYXhGaWxlczogbnVtYmVyXHJcbik6IFByb21pc2U8dm9pZD4gPT4ge1xyXG4gIGNvbnN0IHJvdGF0ZWQgPSBhd2FpdCBnZXRSb3RhdGVkRmlsZXMoZmlsZVBhdGgpXHJcbiAgaWYgKHJvdGF0ZWQubGVuZ3RoIDw9IG1heEZpbGVzKSB7XHJcbiAgICByZXR1cm5cclxuICB9XHJcblxyXG4gIGNvbnN0IHN0YXRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXHJcbiAgICByb3RhdGVkLm1hcChhc3luYyBwID0+ICh7IHBhdGg6IHAsIHN0YXQ6IGF3YWl0IGZzLnN0YXQocCkgfSkpXHJcbiAgKVxyXG5cclxuICBzdGF0cy5zb3J0KChhLCBiKSA9PiBiLnN0YXQubXRpbWVNcyAtIGEuc3RhdC5tdGltZU1zKVxyXG4gIGNvbnN0IHRvRGVsZXRlID0gc3RhdHMuc2xpY2UobWF4RmlsZXMpXHJcbiAgYXdhaXQgUHJvbWlzZS5hbGwodG9EZWxldGUubWFwKCh7IHBhdGggfSkgPT4gZnMucm0ocGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSkpXHJcbn1cclxuXHJcbmNvbnN0IGNsZWFudXBCeVRpbWUgPSBhc3luYyAoXHJcbiAgZmlsZVBhdGg6IHN0cmluZyxcclxuICBtYXhBZ2VNczogbnVtYmVyXHJcbik6IFByb21pc2U8dm9pZD4gPT4ge1xyXG4gIGNvbnN0IHJvdGF0ZWQgPSBhd2FpdCBnZXRSb3RhdGVkRmlsZXMoZmlsZVBhdGgpXHJcbiAgaWYgKHJvdGF0ZWQubGVuZ3RoID09PSAwKSB7XHJcbiAgICByZXR1cm5cclxuICB9XHJcblxyXG4gIGNvbnN0IG5vdyA9IERhdGUubm93KClcclxuICBjb25zdCBzdGF0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxyXG4gICAgcm90YXRlZC5tYXAoYXN5bmMgcCA9PiAoeyBwYXRoOiBwLCBzdGF0OiBhd2FpdCBmcy5zdGF0KHApIH0pKVxyXG4gIClcclxuXHJcbiAgY29uc3QgdG9EZWxldGUgPSBzdGF0cy5maWx0ZXIoKHsgc3RhdCB9KSA9PiBub3cgLSBzdGF0Lm10aW1lTXMgPiBtYXhBZ2VNcylcclxuICBhd2FpdCBQcm9taXNlLmFsbCh0b0RlbGV0ZS5tYXAoKHsgcGF0aCB9KSA9PiBmcy5ybShwYXRoLCB7IGZvcmNlOiB0cnVlIH0pKSlcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IHBlcmZvcm1Sb3RhdGlvbiA9IGFzeW5jIChcclxuICBmaWxlUGF0aDogc3RyaW5nLFxyXG4gIGNvbmZpZzogTG9nUm90YXRpb25Db25maWdcclxuKTogUHJvbWlzZTx2b2lkPiA9PiB7XHJcbiAgY29uc3Qgcm90YXRlZCA9IGF3YWl0IHJvdGF0ZUZpbGUoZmlsZVBhdGgpXHJcbiAgaWYgKCFyb3RhdGVkKSB7XHJcbiAgICByZXR1cm5cclxuICB9XHJcblxyXG4gIGNvbnN0IHNob3VsZENvbXByZXNzID0gY29uZmlnLmNvbXByZXNzID09PSB0cnVlXHJcbiAgaWYgKHNob3VsZENvbXByZXNzKSB7XHJcbiAgICBjb25zdCBhbGdvID0gY29uZmlnLmNvbXByZXNzaW9uID8/ICdnemlwJ1xyXG4gICAgaWYgKGFsZ28gPT09ICdnemlwJykge1xyXG4gICAgICBhd2FpdCBjb21wcmVzc0ZpbGUocm90YXRlZClcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGlmIChjb25maWcubWF4RmlsZXMgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgY29uc3QgcmV0ZW50aW9uID0gcGFyc2VSZXRlbnRpb24oY29uZmlnLm1heEZpbGVzKVxyXG4gICAgaWYgKHJldGVudGlvbi50eXBlID09PSAnY291bnQnKSB7XHJcbiAgICAgIGF3YWl0IGNsZWFudXBCeUNvdW50KGZpbGVQYXRoLCByZXRlbnRpb24udmFsdWUpXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBhd2FpdCBjbGVhbnVwQnlUaW1lKGZpbGVQYXRoLCByZXRlbnRpb24udmFsdWUpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBPcHRpb25hbCBpbnRlcnZhbC1iYXNlZCByb3RhdGlvbiBjbGVhbnVwIChjcmVhdGUgaW50ZXJ2YWwgZGlyZWN0b3JpZXMgLyBuYW1pbmcpIGlzIG5vdCByZXF1aXJlZCBieSB0ZXN0cy5cclxufVxyXG4iLAogICAgImltcG9ydCB7IHByb21pc2VzIGFzIGZzIH0gZnJvbSAnbm9kZTpmcydcclxuaW1wb3J0IHsgYmFzZW5hbWUsIGRpcm5hbWUgfSBmcm9tICdub2RlOnBhdGgnXHJcblxyXG5jb25zdCBTSVpFX1JFR0VYID0gL14oXFxkKyg/OlxcLlxcZCspPykoa3xrYnxtfG1ifGd8Z2IpJC9pXHJcbmNvbnN0IElOVEVSVkFMX1JFR0VYID0gL14oXFxkKykoaHxkfHcpJC9pXHJcbmNvbnN0IFJPVEFURURfUkVHRVggPSAvXFwuKFxcZHs0fS1cXGR7Mn0tXFxkezJ9LVxcZHsyfS1cXGR7Mn0tXFxkezJ9KSg/OlxcLmd6KT8kL1xyXG5cclxuZXhwb3J0IGNvbnN0IHBhcnNlU2l6ZSA9ICh2YWx1ZTogbnVtYmVyIHwgc3RyaW5nKTogbnVtYmVyID0+IHtcclxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xyXG4gICAgcmV0dXJuIHZhbHVlXHJcbiAgfVxyXG5cclxuICBjb25zdCB0cmltbWVkID0gdmFsdWUudHJpbSgpXHJcbiAgY29uc3QgYXNOdW1iZXIgPSBOdW1iZXIodHJpbW1lZClcclxuICBpZiAoTnVtYmVyLmlzRmluaXRlKGFzTnVtYmVyKSkge1xyXG4gICAgcmV0dXJuIGFzTnVtYmVyXHJcbiAgfVxyXG5cclxuICBjb25zdCBtYXRjaCA9IHRyaW1tZWQubWF0Y2goU0laRV9SRUdFWClcclxuICBpZiAoIW1hdGNoKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc2l6ZSBmb3JtYXQ6ICR7dmFsdWV9YClcclxuICB9XHJcblxyXG4gIGNvbnN0IGFtb3VudCA9IE51bWJlcihtYXRjaFsxXSlcclxuICBjb25zdCB1bml0ID0gbWF0Y2hbMl0udG9Mb3dlckNhc2UoKVxyXG5cclxuICBsZXQgYmFzZSA9IDEwMjRcclxuICBpZiAodW5pdC5zdGFydHNXaXRoKCdtJykpIHtcclxuICAgIGJhc2UgPSAxMDI0ICogMTAyNFxyXG4gIH0gZWxzZSBpZiAodW5pdC5zdGFydHNXaXRoKCdnJykpIHtcclxuICAgIGJhc2UgPSAxMDI0ICogMTAyNCAqIDEwMjRcclxuICB9XHJcblxyXG4gIHJldHVybiBNYXRoLmZsb29yKGFtb3VudCAqIGJhc2UpXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBwYXJzZUludGVydmFsID0gKHZhbHVlOiBzdHJpbmcpOiBudW1iZXIgPT4ge1xyXG4gIGNvbnN0IG1hdGNoID0gdmFsdWUudHJpbSgpLm1hdGNoKElOVEVSVkFMX1JFR0VYKVxyXG4gIGlmICghbWF0Y2gpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBpbnRlcnZhbCBmb3JtYXQ6ICR7dmFsdWV9YClcclxuICB9XHJcblxyXG4gIGNvbnN0IGFtb3VudCA9IE51bWJlcihtYXRjaFsxXSlcclxuICBjb25zdCB1bml0ID0gbWF0Y2hbMl0udG9Mb3dlckNhc2UoKVxyXG5cclxuICBsZXQgbXMgPSA2MCAqIDYwICogMTAwMFxyXG4gIGlmICh1bml0ID09PSAnZCcpIHtcclxuICAgIG1zID0gMjQgKiA2MCAqIDYwICogMTAwMFxyXG4gIH0gZWxzZSBpZiAodW5pdCA9PT0gJ3cnKSB7XHJcbiAgICBtcyA9IDcgKiAyNCAqIDYwICogNjAgKiAxMDAwXHJcbiAgfVxyXG5cclxuICByZXR1cm4gYW1vdW50ICogbXNcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IHBhcnNlUmV0ZW50aW9uID0gKFxyXG4gIHZhbHVlOiBudW1iZXIgfCBzdHJpbmdcclxuKTogeyB0eXBlOiAnY291bnQnIHwgJ3RpbWUnOyB2YWx1ZTogbnVtYmVyIH0gPT4ge1xyXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XHJcbiAgICByZXR1cm4geyB0eXBlOiAnY291bnQnLCB2YWx1ZSB9XHJcbiAgfVxyXG4gIHJldHVybiB7IHR5cGU6ICd0aW1lJywgdmFsdWU6IHBhcnNlSW50ZXJ2YWwodmFsdWUpIH1cclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IHNob3VsZFJvdGF0ZUJ5U2l6ZSA9IGFzeW5jIChcclxuICBmaWxlUGF0aDogc3RyaW5nLFxyXG4gIG1heFNpemVCeXRlczogbnVtYmVyXHJcbik6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xyXG4gIHRyeSB7XHJcbiAgICBjb25zdCBzdGF0ID0gYXdhaXQgZnMuc3RhdChmaWxlUGF0aClcclxuICAgIHJldHVybiBzdGF0LnNpemUgPiBtYXhTaXplQnl0ZXNcclxuICB9IGNhdGNoIHtcclxuICAgIHJldHVybiBmYWxzZVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGdldFJvdGF0ZWRGaWxlcyA9IGFzeW5jIChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXT4gPT4ge1xyXG4gIGNvbnN0IGRpciA9IGRpcm5hbWUoZmlsZVBhdGgpXHJcbiAgY29uc3QgYmFzZSA9IGJhc2VuYW1lKGZpbGVQYXRoKVxyXG5cclxuICBsZXQgZW50cmllczogc3RyaW5nW11cclxuICB0cnkge1xyXG4gICAgZW50cmllcyA9IGF3YWl0IGZzLnJlYWRkaXIoZGlyKVxyXG4gIH0gY2F0Y2gge1xyXG4gICAgcmV0dXJuIFtdXHJcbiAgfVxyXG5cclxuICByZXR1cm4gZW50cmllc1xyXG4gICAgLmZpbHRlcihuYW1lID0+IG5hbWUuc3RhcnRzV2l0aChgJHtiYXNlfS5gKSAmJiBST1RBVEVEX1JFR0VYLnRlc3QobmFtZSkpXHJcbiAgICAubWFwKG5hbWUgPT4gYCR7ZGlyfS8ke25hbWV9YClcclxufVxyXG4iLAogICAgImltcG9ydCBjaGFsayBmcm9tICdjaGFsaydcclxuaW1wb3J0IHsgZ2V0U3RhdHVzQ29kZSB9IGZyb20gJy4uL2hlbHBlcnMvc3RhdHVzJ1xyXG5pbXBvcnQgdHlwZSB7XHJcbiAgTG9nTGV2ZWwsXHJcbiAgT3B0aW9ucyxcclxuICBQaW5vLFxyXG4gIFN0b3JlRGF0YSxcclxuIFxyXG59IGZyb20gJy4uL2ludGVyZmFjZXMnXHJcblxyXG5jb25zdCBwYWQyID0gKHZhbHVlOiBudW1iZXIpOiBzdHJpbmcgPT4gU3RyaW5nKHZhbHVlKS5wYWRTdGFydCgyLCAnMCcpXHJcbmNvbnN0IHBhZDMgPSAodmFsdWU6IG51bWJlcik6IHN0cmluZyA9PiBTdHJpbmcodmFsdWUpLnBhZFN0YXJ0KDMsICcwJylcclxuXHJcbmNvbnN0IHNob3VsZFVzZUNvbG9ycyA9IChvcHRpb25zOiBPcHRpb25zKTogYm9vbGVhbiA9PiB7XHJcbiAgY29uc3QgY29uZmlnID0gb3B0aW9ucy5jb25maWdcclxuICBjb25zdCBlbmFibGVkQnlDb25maWcgPSBjb25maWc/LnVzZUNvbG9ycyA/PyB0cnVlXHJcblxyXG4gIC8vIEF2b2lkIEFOU0kgc2VxdWVuY2VzIGluIG5vbi1pbnRlcmFjdGl2ZSBvdXRwdXQgKHBpcGVzLCBDSSBsb2dzLCBmaWxlcykuXHJcbiAgY29uc3QgaXNUdHkgPSB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgcHJvY2Vzcy5zdGRvdXQ/LmlzVFRZID09PSB0cnVlXHJcbiAgcmV0dXJuIGVuYWJsZWRCeUNvbmZpZyAmJiBpc1R0eVxyXG59XHJcblxyXG5jb25zdCBmb3JtYXRUaW1lc3RhbXAgPSAoZGF0ZTogRGF0ZSwgcGF0dGVybj86IHN0cmluZyk6IHN0cmluZyA9PiB7XHJcbiAgaWYgKCFwYXR0ZXJuKSB7XHJcbiAgICByZXR1cm4gZGF0ZS50b0lTT1N0cmluZygpXHJcbiAgfVxyXG5cclxuICBjb25zdCB5eXl5ID0gU3RyaW5nKGRhdGUuZ2V0RnVsbFllYXIoKSlcclxuICBjb25zdCBtbSA9IHBhZDIoZGF0ZS5nZXRNb250aCgpICsgMSlcclxuICBjb25zdCBkZCA9IHBhZDIoZGF0ZS5nZXREYXRlKCkpXHJcbiAgY29uc3QgSEggPSBwYWQyKGRhdGUuZ2V0SG91cnMoKSlcclxuICBjb25zdCBNTSA9IHBhZDIoZGF0ZS5nZXRNaW51dGVzKCkpXHJcbiAgY29uc3Qgc3MgPSBwYWQyKGRhdGUuZ2V0U2Vjb25kcygpKVxyXG4gIGNvbnN0IFNTUyA9IHBhZDMoZGF0ZS5nZXRNaWxsaXNlY29uZHMoKSlcclxuXHJcbiAgcmV0dXJuIHBhdHRlcm5cclxuICAgIC5yZXBsYWNlQWxsKCd5eXl5JywgeXl5eSlcclxuICAgIC5yZXBsYWNlQWxsKCdtbScsIG1tKVxyXG4gICAgLnJlcGxhY2VBbGwoJ2RkJywgZGQpXHJcbiAgICAucmVwbGFjZUFsbCgnSEgnLCBISClcclxuICAgIC5yZXBsYWNlQWxsKCdNTScsIE1NKVxyXG4gICAgLnJlcGxhY2VBbGwoJ3NzJywgc3MpXHJcbiAgICAucmVwbGFjZUFsbCgnU1NTJywgU1NTKVxyXG59XHJcblxyXG5jb25zdCBnZXRJcCA9IChyZXF1ZXN0OiBSZXF1ZXN0KTogc3RyaW5nID0+IHtcclxuICBjb25zdCBmb3J3YXJkZWQgPSByZXF1ZXN0LmhlYWRlcnMuZ2V0KCd4LWZvcndhcmRlZC1mb3InKVxyXG4gIGlmIChmb3J3YXJkZWQpIHtcclxuICAgIHJldHVybiBmb3J3YXJkZWQuc3BsaXQoJywnKVswXT8udHJpbSgpID8/ICcnXHJcbiAgfVxyXG4gIHJldHVybiByZXF1ZXN0LmhlYWRlcnMuZ2V0KCd4LXJlYWwtaXAnKSA/PyAnJ1xyXG59XHJcblxyXG5jb25zdCBnZXRDb2xvcmVkTGV2ZWwgPSAobGV2ZWw6IExvZ0xldmVsLCB1c2VDb2xvcnM6IGJvb2xlYW4pOiBzdHJpbmcgPT4ge1xyXG4gIGlmICghdXNlQ29sb3JzKSB7XHJcbiAgICByZXR1cm4gbGV2ZWxcclxuICB9XHJcblxyXG4gIGlmIChsZXZlbCA9PT0gJ0VSUk9SJykge1xyXG4gICAgcmV0dXJuIGNoYWxrLmJnUmVkLmJsYWNrKGxldmVsKVxyXG4gIH1cclxuICBpZiAobGV2ZWwgPT09ICdXQVJOSU5HJykge1xyXG4gICAgcmV0dXJuIGNoYWxrLmJnWWVsbG93LmJsYWNrKGxldmVsKVxyXG4gIH1cclxuICBpZiAobGV2ZWwgPT09ICdERUJVRycpIHtcclxuICAgIHJldHVybiBjaGFsay5iZ0JsdWUuYmxhY2sobGV2ZWwpXHJcbiAgfVxyXG5cclxuICByZXR1cm4gY2hhbGsuYmdHcmVlbi5ibGFjayhsZXZlbClcclxufVxyXG5cclxuY29uc3QgZ2V0Q29sb3JlZE1ldGhvZCA9IChtZXRob2Q6IHN0cmluZywgdXNlQ29sb3JzOiBib29sZWFuKTogc3RyaW5nID0+IHtcclxuICBpZiAoIXVzZUNvbG9ycykge1xyXG4gICAgcmV0dXJuIG1ldGhvZFxyXG4gIH1cclxuXHJcbiAgY29uc3QgdXBwZXIgPSBtZXRob2QudG9VcHBlckNhc2UoKVxyXG4gIGlmICh1cHBlciA9PT0gJ0dFVCcpIHtcclxuICAgIHJldHVybiBjaGFsay5ncmVlbi5ib2xkKHVwcGVyKVxyXG4gIH1cclxuICBpZiAodXBwZXIgPT09ICdQT1NUJykge1xyXG4gICAgcmV0dXJuIGNoYWxrLmJsdWUuYm9sZCh1cHBlcilcclxuICB9XHJcbiAgaWYgKHVwcGVyID09PSAnUFVUJykge1xyXG4gICAgcmV0dXJuIGNoYWxrLnllbGxvdy5ib2xkKHVwcGVyKVxyXG4gIH1cclxuICBpZiAodXBwZXIgPT09ICdQQVRDSCcpIHtcclxuICAgIHJldHVybiBjaGFsay55ZWxsb3dCcmlnaHQuYm9sZCh1cHBlcilcclxuICB9XHJcbiAgaWYgKHVwcGVyID09PSAnREVMRVRFJykge1xyXG4gICAgcmV0dXJuIGNoYWxrLnJlZC5ib2xkKHVwcGVyKVxyXG4gIH1cclxuICBpZiAodXBwZXIgPT09ICdPUFRJT05TJykge1xyXG4gICAgcmV0dXJuIGNoYWxrLmN5YW4uYm9sZCh1cHBlcilcclxuICB9XHJcbiAgaWYgKHVwcGVyID09PSAnSEVBRCcpIHtcclxuICAgIHJldHVybiBjaGFsay5ncmVlbkJyaWdodC5ib2xkKHVwcGVyKVxyXG4gIH1cclxuICBpZiAodXBwZXIgPT09ICdUUkFDRScpIHtcclxuICAgIHJldHVybiBjaGFsay5tYWdlbnRhLmJvbGQodXBwZXIpXHJcbiAgfVxyXG4gIGlmICh1cHBlciA9PT0gJ0NPTk5FQ1QnKSB7XHJcbiAgICByZXR1cm4gY2hhbGsuY3lhbkJyaWdodC5ib2xkKHVwcGVyKVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGNoYWxrLndoaXRlLmJvbGQodXBwZXIpXHJcbn1cclxuXHJcbmNvbnN0IGdldENvbG9yZWRTdGF0dXMgPSAoc3RhdHVzOiBzdHJpbmcsIHVzZUNvbG9yczogYm9vbGVhbik6IHN0cmluZyA9PiB7XHJcbiAgaWYgKCF1c2VDb2xvcnMpIHtcclxuICAgIHJldHVybiBzdGF0dXNcclxuICB9XHJcblxyXG4gIGNvbnN0IG51bWVyaWMgPSBOdW1iZXIucGFyc2VJbnQoc3RhdHVzLCAxMClcclxuICBpZiAoIU51bWJlci5pc0Zpbml0ZShudW1lcmljKSkge1xyXG4gICAgcmV0dXJuIHN0YXR1c1xyXG4gIH1cclxuXHJcbiAgaWYgKG51bWVyaWMgPj0gNTAwKSB7XHJcbiAgICByZXR1cm4gY2hhbGsucmVkKHN0YXR1cylcclxuICB9XHJcbiAgaWYgKG51bWVyaWMgPj0gNDAwKSB7XHJcbiAgICByZXR1cm4gY2hhbGsueWVsbG93KHN0YXR1cylcclxuICB9XHJcbiAgaWYgKG51bWVyaWMgPj0gMzAwKSB7XHJcbiAgICByZXR1cm4gY2hhbGsuY3lhbihzdGF0dXMpXHJcbiAgfVxyXG4gIGlmIChudW1lcmljID49IDIwMCkge1xyXG4gICAgcmV0dXJuIGNoYWxrLmdyZWVuKHN0YXR1cylcclxuICB9XHJcbiAgcmV0dXJuIGNoYWxrLmdyYXkoc3RhdHVzKVxyXG59XHJcblxyXG5jb25zdCBnZXRDb2xvcmVkRHVyYXRpb24gPSAoZHVyYXRpb246IHN0cmluZywgdXNlQ29sb3JzOiBib29sZWFuKTogc3RyaW5nID0+IHtcclxuICBpZiAoIXVzZUNvbG9ycykge1xyXG4gICAgcmV0dXJuIGR1cmF0aW9uXHJcbiAgfVxyXG5cclxuICByZXR1cm4gY2hhbGsuZ3JheShkdXJhdGlvbilcclxufVxyXG5cclxuY29uc3QgZ2V0Q29sb3JlZFRpbWVzdGFtcCA9ICh0aW1lc3RhbXA6IHN0cmluZywgdXNlQ29sb3JzOiBib29sZWFuKTogc3RyaW5nID0+IHtcclxuICBpZiAoIXVzZUNvbG9ycykge1xyXG4gICAgcmV0dXJuIHRpbWVzdGFtcFxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGNoYWxrLmJnSGV4KCcjRkZBNTAwJykuYmxhY2sodGltZXN0YW1wKVxyXG59XHJcblxyXG5jb25zdCBnZXRDb2xvcmVkUGF0aG5hbWUgPSAocGF0aG5hbWU6IHN0cmluZywgdXNlQ29sb3JzOiBib29sZWFuKTogc3RyaW5nID0+IHtcclxuICBpZiAoIXVzZUNvbG9ycykge1xyXG4gICAgcmV0dXJuIHBhdGhuYW1lXHJcbiAgfVxyXG5cclxuICByZXR1cm4gY2hhbGsud2hpdGVCcmlnaHQocGF0aG5hbWUpXHJcbn1cclxuXHJcbmNvbnN0IGdldENvbnRleHRTdHJpbmcgPSAodmFsdWU6IHVua25vd24pOiBzdHJpbmcgPT4ge1xyXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsKSB7XHJcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpXHJcbiAgfVxyXG5cclxuICByZXR1cm4gJydcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGZvcm1hdExpbmUgPSAoe1xyXG4gIGxldmVsLFxyXG4gIHJlcXVlc3QsXHJcbiAgZGF0YSxcclxuICBzdG9yZSxcclxuICBvcHRpb25zXHJcbn06IHtcclxuICBsZXZlbDogTG9nTGV2ZWxcclxuICByZXF1ZXN0OiBSZXF1ZXN0XHJcbiAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cclxuICBzdG9yZTogU3RvcmVEYXRhXHJcbiAgb3B0aW9uczogT3B0aW9uc1xyXG59KTogc3RyaW5nID0+IHtcclxuICBjb25zdCBjb25maWcgPSBvcHRpb25zLmNvbmZpZ1xyXG4gIGNvbnN0IHVzZUNvbG9ycyA9IHNob3VsZFVzZUNvbG9ycyhvcHRpb25zKVxyXG4gIGNvbnN0IGZvcm1hdCA9XHJcbiAgICBjb25maWc/LmN1c3RvbUxvZ0Zvcm1hdCA/P1xyXG4gICAgJ/Cfpooge25vd30ge2xldmVsfSB7ZHVyYXRpb259IHttZXRob2R9IHtwYXRobmFtZX0ge3N0YXR1c30ge21lc3NhZ2V9IHtpcH0ge2NvbnRleHR9J1xyXG5cclxuICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpXHJcbiAgY29uc3QgZXBvY2ggPSBTdHJpbmcobm93LmdldFRpbWUoKSlcclxuICBjb25zdCByYXdUaW1lc3RhbXAgPSBmb3JtYXRUaW1lc3RhbXAobm93LCBjb25maWc/LnRpbWVzdGFtcD8udHJhbnNsYXRlVGltZSlcclxuICBjb25zdCB0aW1lc3RhbXAgPSBnZXRDb2xvcmVkVGltZXN0YW1wKHJhd1RpbWVzdGFtcCwgdXNlQ29sb3JzKVxyXG5cclxuICBjb25zdCBtZXNzYWdlID0gdHlwZW9mIGRhdGEubWVzc2FnZSA9PT0gJ3N0cmluZycgPyBkYXRhLm1lc3NhZ2UgOiAnJ1xyXG4gIGNvbnN0IGR1cmF0aW9uTXMgPVxyXG4gICAgc3RvcmUuYmVmb3JlVGltZSA9PT0gQmlnSW50KDApXHJcbiAgICAgID8gMFxyXG4gICAgICA6IE51bWJlcihwcm9jZXNzLmhydGltZS5iaWdpbnQoKSAtIHN0b3JlLmJlZm9yZVRpbWUpIC8gMV8wMDBfMDAwXHJcblxyXG4gIGNvbnN0IHBhdGhuYW1lID0gbmV3IFVSTChyZXF1ZXN0LnVybCkucGF0aG5hbWVcclxuICBjb25zdCBzdGF0dXNWYWx1ZSA9IGRhdGEuc3RhdHVzXHJcbiAgY29uc3Qgc3RhdHVzQ29kZSA9XHJcbiAgICBzdGF0dXNWYWx1ZSA9PT0gbnVsbCB8fCBzdGF0dXNWYWx1ZSA9PT0gdW5kZWZpbmVkXHJcbiAgICAgID8gMjAwXHJcbiAgICAgIDogZ2V0U3RhdHVzQ29kZShzdGF0dXNWYWx1ZSlcclxuICBjb25zdCBzdGF0dXMgPSBTdHJpbmcoc3RhdHVzQ29kZSlcclxuICBjb25zdCBpcCA9IGNvbmZpZz8uaXAgPT09IHRydWUgPyBnZXRJcChyZXF1ZXN0KSA6ICcnXHJcbiAgY29uc3QgY3R4U3RyaW5nID0gZ2V0Q29udGV4dFN0cmluZyhkYXRhLmNvbnRleHQpXHJcbiAgY29uc3QgY29sb3JlZExldmVsID0gZ2V0Q29sb3JlZExldmVsKGxldmVsLCB1c2VDb2xvcnMpXHJcbiAgY29uc3QgY29sb3JlZE1ldGhvZCA9IGdldENvbG9yZWRNZXRob2QocmVxdWVzdC5tZXRob2QsIHVzZUNvbG9ycylcclxuICBjb25zdCBjb2xvcmVkUGF0aG5hbWUgPSBnZXRDb2xvcmVkUGF0aG5hbWUocGF0aG5hbWUsIHVzZUNvbG9ycylcclxuICBjb25zdCBjb2xvcmVkU3RhdHVzID0gZ2V0Q29sb3JlZFN0YXR1cyhzdGF0dXMsIHVzZUNvbG9ycylcclxuICBjb25zdCBjb2xvcmVkRHVyYXRpb24gPSBnZXRDb2xvcmVkRHVyYXRpb24oXHJcbiAgICBgJHtkdXJhdGlvbk1zLnRvRml4ZWQoMil9bXNgLFxyXG4gICAgdXNlQ29sb3JzXHJcbiAgKVxyXG5cclxuICByZXR1cm4gZm9ybWF0XHJcbiAgICAucmVwbGFjZUFsbCgne25vd30nLCB0aW1lc3RhbXApXHJcbiAgICAucmVwbGFjZUFsbCgne2Vwb2NofScsIGVwb2NoKVxyXG4gICAgLnJlcGxhY2VBbGwoJ3tsZXZlbH0nLCBjb2xvcmVkTGV2ZWwpXHJcbiAgICAucmVwbGFjZUFsbCgne2R1cmF0aW9ufScsIGNvbG9yZWREdXJhdGlvbilcclxuICAgIC5yZXBsYWNlQWxsKCd7bWV0aG9kfScsIGNvbG9yZWRNZXRob2QpXHJcbiAgICAucmVwbGFjZUFsbCgne3BhdGhuYW1lfScsIGNvbG9yZWRQYXRobmFtZSlcclxuICAgIC5yZXBsYWNlQWxsKCd7cGF0aH0nLCBjb2xvcmVkUGF0aG5hbWUpXHJcbiAgICAucmVwbGFjZUFsbCgne3N0YXR1c30nLCBjb2xvcmVkU3RhdHVzKVxyXG4gICAgLnJlcGxhY2VBbGwoJ3ttZXNzYWdlfScsIG1lc3NhZ2UpXHJcbiAgICAucmVwbGFjZUFsbCgne2lwfScsIGlwKVxyXG4gICAgLnJlcGxhY2VBbGwoJ3tjb250ZXh0fScsIGN0eFN0cmluZylcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGxvZ1dpdGhQaW5vID0gKFxyXG4gIGxvZ2dlcjogUGlubyxcclxuICBsZXZlbDogTG9nTGV2ZWwsXHJcbiAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cclxuKTogdm9pZCA9PiB7XHJcbiAgaWYgKGxldmVsID09PSAnRVJST1InKSB7XHJcbiAgICBsb2dnZXIuZXJyb3IoZGF0YSlcclxuICAgIHJldHVyblxyXG4gIH1cclxuICBpZiAobGV2ZWwgPT09ICdXQVJOSU5HJykge1xyXG4gICAgbG9nZ2VyLndhcm4oZGF0YSlcclxuICAgIHJldHVyblxyXG4gIH1cclxuICBpZiAobGV2ZWwgPT09ICdERUJVRycpIHtcclxuICAgIGxvZ2dlci5kZWJ1ZyhkYXRhKVxyXG4gICAgcmV0dXJuXHJcbiAgfVxyXG4gIGxvZ2dlci5pbmZvKGRhdGEpXHJcbn1cclxuIiwKICAgICJpbXBvcnQgeyBTdGF0dXNNYXAgfSBmcm9tICdlbHlzaWEnXHJcblxyXG5jb25zdCBESUdJVFNfT05MWSA9IC9eXFxkKyQvXHJcbmNvbnN0IERFTElNSVRFUlMgPSAvW18tXSsvZ1xyXG5jb25zdCBDQU1FTF9CT1VOREFSWV8xID0gLyhbYS16MC05XSkoW0EtWl0pL2dcclxuY29uc3QgQ0FNRUxfQk9VTkRBUllfMiA9IC8oW0EtWl0pKFtBLVpdW2Etel0pL2dcclxuY29uc3QgQVBPU1RST1BIRVMgPSAvWyfigJldL2dcclxuY29uc3QgTk9OX0FMUEhBTlVNRVJJQyA9IC9bXmEtejAtOVxcc10rL2dcclxuY29uc3QgV0hJVEVTUEFDRSA9IC9cXHMrL2dcclxuXHJcbmNvbnN0IG5vcm1hbGl6ZVN0YXR1c05hbWUgPSAodmFsdWU6IHN0cmluZyk6IHN0cmluZyA9PiB7XHJcbiAgLy8gSGFuZGxlcyBjb21tb24gdmFyaWFudHM6XHJcbiAgLy8gLSBjYXNlIGRpZmZlcmVuY2VzOiBcIm5vdCBmb3VuZFwiIHZzIFwiTm90IEZvdW5kXCJcclxuICAvLyAtIHNwYWNpbmcvcHVuY3R1YXRpb246IFwiTm90LUZvdW5kXCIsIFwibm90X2ZvdW5kXCJcclxuICAvLyAtIGNhbWVsQ2FzZS9QYXNjYWxDYXNlOiBcIkludGVybmFsU2VydmVyRXJyb3JcIlxyXG4gIGNvbnN0IHRyaW1tZWQgPSB2YWx1ZS50cmltKClcclxuICBpZiAoIXRyaW1tZWQpIHtcclxuICAgIHJldHVybiAnJ1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHRyaW1tZWRcclxuICAgIC5yZXBsYWNlKERFTElNSVRFUlMsICcgJylcclxuICAgIC5yZXBsYWNlKENBTUVMX0JPVU5EQVJZXzEsICckMSAkMicpXHJcbiAgICAucmVwbGFjZShDQU1FTF9CT1VOREFSWV8yLCAnJDEgJDInKVxyXG4gICAgLnJlcGxhY2UoQVBPU1RST1BIRVMsICcnKVxyXG4gICAgLnRvTG93ZXJDYXNlKClcclxuICAgIC5yZXBsYWNlKE5PTl9BTFBIQU5VTUVSSUMsICcgJylcclxuICAgIC5yZXBsYWNlKFdISVRFU1BBQ0UsICcgJylcclxuICAgIC50cmltKClcclxufVxyXG5cclxuY29uc3QgU1RBVFVTX0JZX05PUk1BTElaRURfTkFNRSA9ICgoKSA9PiB7XHJcbiAgY29uc3QgbWFwID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKVxyXG5cclxuICBmb3IgKGNvbnN0IFtuYW1lLCBjb2RlXSBvZiBPYmplY3QuZW50cmllcyhTdGF0dXNNYXApKSB7XHJcbiAgICBtYXAuc2V0KG5vcm1hbGl6ZVN0YXR1c05hbWUobmFtZSksIGNvZGUpXHJcbiAgfVxyXG5cclxuICByZXR1cm4gbWFwXHJcbn0pKClcclxuXHJcbmV4cG9ydCBjb25zdCBnZXRTdGF0dXNDb2RlID0gKHZhbHVlOiB1bmtub3duKTogbnVtYmVyID0+IHtcclxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUodmFsdWUpKSB7XHJcbiAgICByZXR1cm4gdmFsdWVcclxuICB9XHJcblxyXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICBjb25zdCB0cmltbWVkID0gdmFsdWUudHJpbSgpXHJcbiAgICBpZiAoRElHSVRTX09OTFkudGVzdCh0cmltbWVkKSkge1xyXG4gICAgICByZXR1cm4gTnVtYmVyKHRyaW1tZWQpXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qga25vd24gPSBTVEFUVVNfQllfTk9STUFMSVpFRF9OQU1FLmdldChub3JtYWxpemVTdGF0dXNOYW1lKHRyaW1tZWQpKVxyXG4gICAgcmV0dXJuIGtub3duID8/IDUwMFxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIDUwMFxyXG59XHJcbiIsCiAgICAiXHJcbmltcG9ydCB7IFByb2JsZW1FcnJvciB9IGZyb20gJy4uL0Vycm9yL2Vycm9ycydcclxuaW1wb3J0IHR5cGUgeyBMb2dMZXZlbCwgT3B0aW9ucywgU3RvcmVEYXRhIH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcclxuaW1wb3J0IHsgbG9nVG9UcmFuc3BvcnRzIH0gZnJvbSAnLi4vb3V0cHV0J1xyXG5pbXBvcnQgeyBsb2dUb0ZpbGUgfSBmcm9tICcuLi9vdXRwdXQvZmlsZSdcclxuXHJcblxyXG5leHBvcnQgY29uc3QgaGFuZGxlSHR0cEVycm9yID0gKFxyXG4gIHJlcXVlc3Q6IFJlcXVlc3QsXHJcbiAgcHJvYmxlbTogUHJvYmxlbUVycm9yLFxyXG4gIHN0b3JlOiBTdG9yZURhdGEsXHJcbiAgb3B0aW9uczogT3B0aW9uc1xyXG4pOiB2b2lkID0+IHtcclxuICBjb25zdCBjb25maWcgPSBvcHRpb25zLmNvbmZpZ1xyXG4gIC8vIDEuIOWHhuWkh+aXpeW/l+aVsOaNru+8muWwhiBSRkMg5qCH5YeG5a2X5q615LiO5pel5b+X5YWD5pWw5o2u5ZCI5bm2XHJcbiAgY29uc3QgbGV2ZWw6IExvZ0xldmVsID0gJ0VSUk9SJztcclxuICBjb25zdCByZmNEYXRhID0gcHJvYmxlbS50b0pTT04oKTtcclxuICBjb25zdCBkYXRhID0geyBcclxuICAgIHN0YXR1czogcHJvYmxlbS5zdGF0dXMsIFxyXG4gICAgbWVzc2FnZTogcHJvYmxlbS5kZXRhaWwgfHwgcHJvYmxlbS50aXRsZSwgXHJcbiAgICAuLi5yZmNEYXRhIFxyXG4gIH07XHJcbi8vIDIuIOmYtuaute+8muS8oOi+k+WxgiAoVHJhbnNwb3J0cylcclxuICBsb2dUb1RyYW5zcG9ydHMoeyBsZXZlbCwgcmVxdWVzdCwgZGF0YSwgc3RvcmUsIG9wdGlvbnMgfSk7XHJcbi8vIDMuIOmYtuaute+8muaMgeS5heWMliAoRmlsZSBMb2dnaW5nKVxyXG4gIC8vIOWMuemFjeS9oOeahOaOpeWPo++8mnVzZVRyYW5zcG9ydHNPbmx5IOWSjCBkaXNhYmxlRmlsZUxvZ2dpbmcg55u05o6l5ZyoIGNvbmZpZyDkuItcclxuICBpZiAoIShjb25maWc/LnVzZVRyYW5zcG9ydHNPbmx5IHx8IGNvbmZpZz8uZGlzYWJsZUZpbGVMb2dnaW5nKSkge1xyXG4gICAgY29uc3QgZmlsZVBhdGggPSBjb25maWc/LmxvZ0ZpbGVQYXRoO1xyXG4gICAgaWYgKGZpbGVQYXRoKSB7XHJcbiAgICAgIGxvZ1RvRmlsZSh7IGZpbGVQYXRoLCBsZXZlbCwgcmVxdWVzdCwgZGF0YSwgc3RvcmUsIG9wdGlvbnMgfSkuY2F0Y2goKCkgPT4ge30pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gNC4g6Zi25q6177ya5o6n5Yi25Y+w6L6T5Ye6IChDb25zb2xlL0ludGVybmFsKVxyXG4gIGlmIChjb25maWc/LnVzZVRyYW5zcG9ydHNPbmx5IHx8IGNvbmZpZz8uZGlzYWJsZUludGVybmFsTG9nZ2VyKSByZXR1cm47XHJcblxyXG5cclxuICAvLyDlpITnkIbml7bpl7TmiLPmmL7npLrpgLvovpFcclxuICBsZXQgdGltZXN0YW1wID0gJyc7XHJcbiAgaWYgKGNvbmZpZz8udGltZXN0YW1wKSB7XHJcbiAgICB0aW1lc3RhbXAgPSBgWyR7bmV3IERhdGUoKS50b0lTT1N0cmluZygpfV0gYDtcclxuICB9XHJcblxyXG4vLyAxLiDlronlhajmj5Dlj5YgTWV0aG9kIOWSjCBQYXRoXHJcbmNvbnN0IG1ldGhvZCA9IHR5cGVvZiByZXF1ZXN0ID09PSAnc3RyaW5nJyA/ICdSRVEnIDogcmVxdWVzdC5tZXRob2Q7XHJcbmNvbnN0IHVybFN0cmluZyA9IHR5cGVvZiByZXF1ZXN0ID09PSAnc3RyaW5nJyA/IHJlcXVlc3QgOiByZXF1ZXN0LnVybDtcclxuXHJcbmxldCBwYXRoOiBzdHJpbmc7XHJcbnRyeSB7XHJcbiAgLy8g5aaC5p6c5piv5a6M5pW0IFVSTCDliJnmj5Dlj5YgcGF0aG5hbWXvvIzlpoLmnpzmmK/nm7jlr7not6/lvoTliJnnm7TmjqXkvb/nlKhcclxuICBwYXRoID0gdXJsU3RyaW5nLmluY2x1ZGVzKCc6Ly8nKSBcclxuICAgID8gbmV3IFVSTCh1cmxTdHJpbmcpLnBhdGhuYW1lIFxyXG4gICAgOiB1cmxTdHJpbmc7XHJcbn0gY2F0Y2gge1xyXG4gIHBhdGggPSB1cmxTdHJpbmc7XHJcbn1cclxuXHJcbi8vIDIuIOivreS5ieWMlue7iOerr+aJk+WNsFxyXG4vLyDnjrDlnKjnmoTku6PnoIHlr7kgc3RyaW5nIOWSjCBSZXF1ZXN0IOexu+Wei+mDveeZvuWIhuS5i+eZvuWuieWFqOS6hlxyXG5jb25zb2xlLmVycm9yKFxyXG4gIGAke3RpbWVzdGFtcH0ke2xldmVsfSAke21ldGhvZH0gJHtwYXRofSAke3Byb2JsZW0uc3RhdHVzfSAtICR7cHJvYmxlbS50aXRsZX1gXHJcbik7XHJcbn1cclxuIiwKICAgICIvLyBzcmMvbGlicy9lbHlzaWEtaHR0cC1wcm9ibGVtLWpzb24vZXJyb3JzLnRzXHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFByb2JsZW1Eb2N1bWVudCB7XHJcbiAgdHlwZTogc3RyaW5nO1xyXG4gIHRpdGxlOiBzdHJpbmc7XHJcbiAgc3RhdHVzPzogbnVtYmVyO1xyXG4gIGRldGFpbD86IHN0cmluZztcclxuICBpbnN0YW5jZT86IHN0cmluZztcclxuICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xyXG59XHJcblxyXG4vKipcclxuICogUkZDIDk0NTcgUHJvYmxlbSBEZXRhaWxzIEVycm9yIEJhc2UgQ2xhc3NcclxuICpcclxuICogQ29yZSBtZW1iZXJzIGFzIHBlciBSRkMgOTQ1NzpcclxuICogLSB0eXBlOiBBIFVSSSByZWZlcmVuY2UgW1JGQzM5ODZdIHRoYXQgaWRlbnRpZmllcyB0aGUgcHJvYmxlbSB0eXBlLlxyXG4gKiAgICAgICAgIERlZmF1bHRzIHRvIFwiYWJvdXQ6YmxhbmtcIiB3aGVuIG9taXR0ZWQuXHJcbiAqIC0gdGl0bGU6IEEgc2hvcnQsIGh1bWFuLXJlYWRhYmxlIHN1bW1hcnkgb2YgdGhlIHByb2JsZW0gdHlwZS5cclxuICogLSBzdGF0dXM6IFRoZSBIVFRQIHN0YXR1cyBjb2RlIChbUkZDNzIzMV0sIFNlY3Rpb24gNikuXHJcbiAqIC0gZGV0YWlsOiBBIGh1bWFuLXJlYWRhYmxlIGV4cGxhbmF0aW9uIHNwZWNpZmljIHRvIHRoaXMgb2NjdXJyZW5jZSBvZiB0aGUgcHJvYmxlbS5cclxuICogLSBpbnN0YW5jZTogQSBVUkkgcmVmZXJlbmNlIHRoYXQgaWRlbnRpZmllcyB0aGUgc3BlY2lmaWMgb2NjdXJyZW5jZSBvZiB0aGUgcHJvYmxlbS5cclxuICpcclxuICogRXh0ZW5zaW9uIG1lbWJlcnM6IEFkZGl0aW9uYWwgcHJvcGVydGllcyBjYW4gYmUgYWRkZWQgdG8gcHJvdmlkZSBtb3JlIGNvbnRleHQuXHJcbiAqIFRoZXNlIGFyZSBzZXJpYWxpemVkIGFzLWlzIGluIHRoZSBKU09OIHJlc3BvbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIFJGQyA5NDU3IEVycm9yIEJhc2UgQ2xhc3NcclxuICogKiDkv67mlLnmgJ3ot6/vvJrnm7TmjqXkvb/nlKggcHVibGljIHJlYWRvbmx5IOWxnuaAp++8jOaLkue7neW1jOWll++8jOaLkue7nSBHZXR0ZXLjgIJcclxuICovXHJcbmV4cG9ydCBjbGFzcyBQcm9ibGVtRXJyb3IgZXh0ZW5kcyBFcnJvciB7XHJcbiAgLy8gMS4g55u05o6l5aOw5piO5YWs5byA5bGe5oCnXHJcbiAgcHVibGljIHJlYWRvbmx5IHN0YXR1czogbnVtYmVyO1xyXG4gIHB1YmxpYyByZWFkb25seSB0aXRsZTogc3RyaW5nO1xyXG4gIHB1YmxpYyByZWFkb25seSB0eXBlOiBzdHJpbmc7XHJcbiAgcHVibGljIHJlYWRvbmx5IGRldGFpbD86IHN0cmluZztcclxuICBwdWJsaWMgcmVhZG9ubHkgaW5zdGFuY2U/OiBzdHJpbmc7XHJcbiAgcHVibGljIHJlYWRvbmx5IGV4dGVuc2lvbnM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICB0eXBlID0gXCJhYm91dDpibGFua1wiLFxyXG4gICAgdGl0bGU6IHN0cmluZyxcclxuICAgIHN0YXR1czogbnVtYmVyLFxyXG4gICAgZGV0YWlsPzogc3RyaW5nLFxyXG4gICAgaW5zdGFuY2U/OiBzdHJpbmcsXHJcbiAgICBleHRlbnNpb25zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9XHJcbiAgKSB7XHJcbiAgICBzdXBlcihkZXRhaWwgfHwgdGl0bGUpO1xyXG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIFByb2JsZW1FcnJvci5wcm90b3R5cGUpO1xyXG5cclxuICAgIC8vIDIuIOebtOaOpei1i+WAvOe7mSB0aGlzXHJcbiAgICB0aGlzLnN0YXR1cyA9IHN0YXR1cztcclxuICAgIHRoaXMudGl0bGUgPSB0aXRsZTtcclxuICAgIHRoaXMudHlwZSA9IHR5cGU7XHJcbiAgICB0aGlzLmRldGFpbCA9IGRldGFpbDtcclxuICAgIHRoaXMuaW5zdGFuY2UgPSBpbnN0YW5jZTtcclxuICAgIHRoaXMuZXh0ZW5zaW9ucyA9IGV4dGVuc2lvbnM7XHJcbiAgfVxyXG5cclxuICAvLyAzLiB0b0pTT04g55qE5pe25YCZ5Yqo5oCB57uE6KOF5LiA5LiL5Y2z5Y+vXHJcbiAgdG9KU09OKCk6IFByb2JsZW1Eb2N1bWVudCB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB0eXBlOiB0aGlzLnR5cGUsXHJcbiAgICAgIHRpdGxlOiB0aGlzLnRpdGxlLFxyXG4gICAgICBzdGF0dXM6IHRoaXMuc3RhdHVzLFxyXG4gICAgICAuLi4odGhpcy5kZXRhaWwgPyB7IGRldGFpbDogdGhpcy5kZXRhaWwgfSA6IHt9KSxcclxuICAgICAgLi4uKHRoaXMuaW5zdGFuY2UgPyB7IGluc3RhbmNlOiB0aGlzLmluc3RhbmNlIH0gOiB7fSksXHJcbiAgICAgIC8vIOaKiuaJqeWxleWtl+auteWxleW8gCAoZXh0ZW5zaW9ucylcclxuICAgICAgLi4udGhpcy5leHRlbnNpb25zLFxyXG4gICAgfTtcclxuICB9XHJcbn1cclxuXHJcbi8vIC0tLSA0MFggRXJyb3JzIC0tLVxyXG5jbGFzcyBCYWRSZXF1ZXN0IGV4dGVuZHMgUHJvYmxlbUVycm9yIHtcclxuICBjb25zdHJ1Y3RvcihkZXRhaWw/OiBzdHJpbmcsIGV4dGVuc2lvbnM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XHJcbiAgICBzdXBlcihcclxuICAgICAgXCJodHRwczovL2h0dHBzdGF0dXNlcy5jb20vNDAwXCIsXHJcbiAgICAgIFwiQmFkIFJlcXVlc3RcIixcclxuICAgICAgNDAwLFxyXG4gICAgICBkZXRhaWwsXHJcbiAgICAgIHVuZGVmaW5lZCxcclxuICAgICAgZXh0ZW5zaW9uc1xyXG4gICAgKTtcclxuICB9XHJcbn1cclxuXHJcbmNsYXNzIFVuYXV0aG9yaXplZCBleHRlbmRzIFByb2JsZW1FcnJvciB7XHJcbiAgY29uc3RydWN0b3IoZGV0YWlsPzogc3RyaW5nLCBleHRlbnNpb25zPzogUmVjb3JkPHN0cmluZywgYW55Pikge1xyXG4gICAgc3VwZXIoXHJcbiAgICAgIFwiaHR0cHM6Ly9odHRwc3RhdHVzZXMuY29tLzQwMVwiLFxyXG4gICAgICBcIlVuYXV0aG9yaXplZFwiLFxyXG4gICAgICA0MDEsXHJcbiAgICAgIGRldGFpbCxcclxuICAgICAgdW5kZWZpbmVkLFxyXG4gICAgICBleHRlbnNpb25zXHJcbiAgICApO1xyXG4gIH1cclxufVxyXG5cclxuY2xhc3MgRm9yYmlkZGVuIGV4dGVuZHMgUHJvYmxlbUVycm9yIHtcclxuICBjb25zdHJ1Y3RvcihkZXRhaWw/OiBzdHJpbmcsIGV4dGVuc2lvbnM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XHJcbiAgICBzdXBlcihcclxuICAgICAgXCJodHRwczovL2h0dHBzdGF0dXNlcy5jb20vNDAzXCIsXHJcbiAgICAgIFwiRm9yYmlkZGVuXCIsXHJcbiAgICAgIDQwMyxcclxuICAgICAgZGV0YWlsLFxyXG4gICAgICB1bmRlZmluZWQsXHJcbiAgICAgIGV4dGVuc2lvbnNcclxuICAgICk7XHJcbiAgfVxyXG59XHJcblxyXG5jbGFzcyBOb3RGb3VuZCBleHRlbmRzIFByb2JsZW1FcnJvciB7XHJcbiAgY29uc3RydWN0b3IoZGV0YWlsPzogc3RyaW5nLCBleHRlbnNpb25zPzogUmVjb3JkPHN0cmluZywgYW55Pikge1xyXG4gICAgc3VwZXIoXHJcbiAgICAgIFwiaHR0cHM6Ly9odHRwc3RhdHVzZXMuY29tLzQwNFwiLFxyXG4gICAgICBcIk5vdCBGb3VuZFwiLFxyXG4gICAgICA0MDQsXHJcbiAgICAgIGRldGFpbCxcclxuICAgICAgdW5kZWZpbmVkLFxyXG4gICAgICBleHRlbnNpb25zXHJcbiAgICApO1xyXG4gIH1cclxufVxyXG5cclxuY2xhc3MgQ29uZmxpY3QgZXh0ZW5kcyBQcm9ibGVtRXJyb3Ige1xyXG4gIGNvbnN0cnVjdG9yKGRldGFpbD86IHN0cmluZywgZXh0ZW5zaW9ucz86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcclxuICAgIHN1cGVyKFxyXG4gICAgICBcImh0dHBzOi8vaHR0cHN0YXR1c2VzLmNvbS80MDlcIixcclxuICAgICAgXCJDb25mbGljdFwiLFxyXG4gICAgICA0MDksXHJcbiAgICAgIGRldGFpbCxcclxuICAgICAgdW5kZWZpbmVkLFxyXG4gICAgICBleHRlbnNpb25zXHJcbiAgICApO1xyXG4gIH1cclxufVxyXG5cclxuY2xhc3MgUGF5bWVudFJlcXVpcmVkIGV4dGVuZHMgUHJvYmxlbUVycm9yIHtcclxuICBjb25zdHJ1Y3RvcihkZXRhaWw/OiBzdHJpbmcsIGV4dGVuc2lvbnM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XHJcbiAgICBzdXBlcihcclxuICAgICAgXCJodHRwczovL2h0dHBzdGF0dXNlcy5jb20vNDAyXCIsXHJcbiAgICAgIFwiUGF5bWVudCBSZXF1aXJlZFwiLFxyXG4gICAgICA0MDIsXHJcbiAgICAgIGRldGFpbCxcclxuICAgICAgdW5kZWZpbmVkLFxyXG4gICAgICBleHRlbnNpb25zXHJcbiAgICApO1xyXG4gIH1cclxufVxyXG5cclxuY2xhc3MgTWV0aG9kTm90QWxsb3dlZCBleHRlbmRzIFByb2JsZW1FcnJvciB7XHJcbiAgY29uc3RydWN0b3IoZGV0YWlsPzogc3RyaW5nLCBleHRlbnNpb25zPzogUmVjb3JkPHN0cmluZywgYW55Pikge1xyXG4gICAgc3VwZXIoXHJcbiAgICAgIFwiaHR0cHM6Ly9odHRwc3RhdHVzZXMuY29tLzQwNVwiLFxyXG4gICAgICBcIk1ldGhvZCBOb3QgQWxsb3dlZFwiLFxyXG4gICAgICA0MDUsXHJcbiAgICAgIGRldGFpbCxcclxuICAgICAgdW5kZWZpbmVkLFxyXG4gICAgICBleHRlbnNpb25zXHJcbiAgICApO1xyXG4gIH1cclxufVxyXG5cclxuY2xhc3MgTm90QWNjZXB0YWJsZSBleHRlbmRzIFByb2JsZW1FcnJvciB7XHJcbiAgY29uc3RydWN0b3IoZGV0YWlsPzogc3RyaW5nLCBleHRlbnNpb25zPzogUmVjb3JkPHN0cmluZywgYW55Pikge1xyXG4gICAgc3VwZXIoXHJcbiAgICAgIFwiaHR0cHM6Ly9odHRwc3RhdHVzZXMuY29tLzQwNlwiLFxyXG4gICAgICBcIk5vdCBBY2NlcHRhYmxlXCIsXHJcbiAgICAgIDQwNixcclxuICAgICAgZGV0YWlsLFxyXG4gICAgICB1bmRlZmluZWQsXHJcbiAgICAgIGV4dGVuc2lvbnNcclxuICAgICk7XHJcbiAgfVxyXG59XHJcblxyXG4vLyA1MFggRXJyb3JzXHJcbmNsYXNzIEludGVybmFsU2VydmVyRXJyb3IgZXh0ZW5kcyBQcm9ibGVtRXJyb3Ige1xyXG4gIGNvbnN0cnVjdG9yKGRldGFpbD86IHN0cmluZywgZXh0ZW5zaW9ucz86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcclxuICAgIHN1cGVyKFxyXG4gICAgICBcImh0dHBzOi8vaHR0cHN0YXR1c2VzLmNvbS81MDBcIixcclxuICAgICAgXCJJbnRlcm5hbCBTZXJ2ZXIgRXJyb3JcIixcclxuICAgICAgNTAwLFxyXG4gICAgICBkZXRhaWwsXHJcbiAgICAgIHVuZGVmaW5lZCxcclxuICAgICAgZXh0ZW5zaW9uc1xyXG4gICAgKTtcclxuICB9XHJcbn1cclxuXHJcbmNsYXNzIE5vdEltcGxlbWVudGVkIGV4dGVuZHMgUHJvYmxlbUVycm9yIHtcclxuICBjb25zdHJ1Y3RvcihkZXRhaWw/OiBzdHJpbmcsIGV4dGVuc2lvbnM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XHJcbiAgICBzdXBlcihcclxuICAgICAgXCJodHRwczovL2h0dHBzdGF0dXNlcy5jb20vNTAxXCIsXHJcbiAgICAgIFwiTm90IEltcGxlbWVudGVkXCIsXHJcbiAgICAgIDUwMSxcclxuICAgICAgZGV0YWlsLFxyXG4gICAgICB1bmRlZmluZWQsXHJcbiAgICAgIGV4dGVuc2lvbnNcclxuICAgICk7XHJcbiAgfVxyXG59XHJcblxyXG5jbGFzcyBCYWRHYXRld2F5IGV4dGVuZHMgUHJvYmxlbUVycm9yIHtcclxuICBjb25zdHJ1Y3RvcihkZXRhaWw/OiBzdHJpbmcsIGV4dGVuc2lvbnM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XHJcbiAgICBzdXBlcihcclxuICAgICAgXCJodHRwczovL2h0dHBzdGF0dXNlcy5jb20vNTAyXCIsXHJcbiAgICAgIFwiQmFkIEdhdGV3YXlcIixcclxuICAgICAgNTAyLFxyXG4gICAgICBkZXRhaWwsXHJcbiAgICAgIHVuZGVmaW5lZCxcclxuICAgICAgZXh0ZW5zaW9uc1xyXG4gICAgKTtcclxuICB9XHJcbn1cclxuXHJcbmNsYXNzIFNlcnZpY2VVbmF2YWlsYWJsZSBleHRlbmRzIFByb2JsZW1FcnJvciB7XHJcbiAgY29uc3RydWN0b3IoZGV0YWlsPzogc3RyaW5nLCBleHRlbnNpb25zPzogUmVjb3JkPHN0cmluZywgYW55Pikge1xyXG4gICAgc3VwZXIoXHJcbiAgICAgIFwiaHR0cHM6Ly9odHRwc3RhdHVzZXMuY29tLzUwM1wiLFxyXG4gICAgICBcIlNlcnZpY2UgVW5hdmFpbGFibGVcIixcclxuICAgICAgNTAzLFxyXG4gICAgICBkZXRhaWwsXHJcbiAgICAgIHVuZGVmaW5lZCxcclxuICAgICAgZXh0ZW5zaW9uc1xyXG4gICAgKTtcclxuICB9XHJcbn1cclxuXHJcbmNsYXNzIEdhdGV3YXlUaW1lb3V0IGV4dGVuZHMgUHJvYmxlbUVycm9yIHtcclxuICBjb25zdHJ1Y3RvcihkZXRhaWw/OiBzdHJpbmcsIGV4dGVuc2lvbnM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XHJcbiAgICBzdXBlcihcclxuICAgICAgXCJodHRwczovL2h0dHBzdGF0dXNlcy5jb20vNTA0XCIsXHJcbiAgICAgIFwiR2F0ZXdheSBUaW1lb3V0XCIsXHJcbiAgICAgIDUwNCxcclxuICAgICAgZGV0YWlsLFxyXG4gICAgICB1bmRlZmluZWQsXHJcbiAgICAgIGV4dGVuc2lvbnNcclxuICAgICk7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgSHR0cEVycm9yID0ge1xyXG4gIEJhZFJlcXVlc3QsXHJcbiAgVW5hdXRob3JpemVkLFxyXG4gIFBheW1lbnRSZXF1aXJlZCxcclxuICBGb3JiaWRkZW4sXHJcbiAgTm90Rm91bmQsXHJcbiAgTWV0aG9kTm90QWxsb3dlZCxcclxuICBOb3RBY2NlcHRhYmxlLFxyXG4gIENvbmZsaWN0LFxyXG4gIEludGVybmFsU2VydmVyRXJyb3IsXHJcbiAgTm90SW1wbGVtZW50ZWQsXHJcbiAgQmFkR2F0ZXdheSxcclxuICBTZXJ2aWNlVW5hdmFpbGFibGUsXHJcbiAgR2F0ZXdheVRpbWVvdXQsXHJcbn0gYXMgY29uc3Q7XHJcbiIsCiAgICAiLyoqXHJcbiAqIFJGQyA5NDU3IFByb2JsZW0gSlNPTiDmoLzlvI/ljJblt6XlhbdcclxuICogQHNlZSBodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjOTQ1Ny5odG1sXHJcbiAqL1xyXG5cclxuaW1wb3J0IHsgUHJvYmxlbUVycm9yIH0gZnJvbSBcIi4uL0Vycm9yL2Vycm9yc1wiO1xyXG5pbXBvcnQgeyBDb2RlIH0gZnJvbSBcIi4uL0Vycm9yL3R5cGVcIjtcclxuXHJcblxyXG4vKipcclxuICog6buY6K6k55qE54q25oCB56CB5LiO5qCH6aKY5pig5bCE6KGoIChSRkMg5qCH5YeG5o6o6I2QKVxyXG4gKi9cclxuY29uc3QgREVGQVVMVF9USVRMRVM6IFJlY29yZDxudW1iZXIsIHN0cmluZz4gPSB7XHJcbiAgNDAwOiAnQmFkIFJlcXVlc3QnLFxyXG4gIDQwMTogJ1VuYXV0aG9yaXplZCcsXHJcbiAgNDAzOiAnRm9yYmlkZGVuJyxcclxuICA0MDQ6ICdOb3QgRm91bmQnLFxyXG4gIDQwOTogJ0NvbmZsaWN0JyxcclxuICA0MjI6ICdVbnByb2Nlc3NhYmxlIEVudGl0eScsXHJcbiAgNTAwOiAnSW50ZXJuYWwgU2VydmVyIEVycm9yJyxcclxuICA1MDM6ICdTZXJ2aWNlIFVuYXZhaWxhYmxlJyxcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBub3JtYWxpemVUb1Byb2JsZW0gPSAoXHJcbiAgZXJyb3I6IGFueSxcclxuICBjb2RlOiBDb2RlLFxyXG4gIHBhdGg6IHN0cmluZyxcclxuICB0eXBlQmFzZVVybDogc3RyaW5nID0gJ2Fib3V0OmJsYW5rJ1xyXG4pOiBQcm9ibGVtRXJyb3IgPT4ge1xyXG4gIC8vIDEuIOWmguaenOW3sue7j+aYryBQcm9ibGVtRXJyb3LvvIznm7TmjqXooaXlhYUgaW5zdGFuY2Ug5bm26L+U5ZueXHJcbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgUHJvYmxlbUVycm9yKSB7XHJcbiAgICAvLyDlpoLmnpzmsqHmnIkgaW5zdGFuY2XvvIzoh6rliqjooaXlhajkuLrlvZPliY3or7fmsYLot6/lvoRcclxuICAgIHJldHVybiBlcnJvci5pbnN0YW5jZSA/IGVycm9yIDogbmV3IFByb2JsZW1FcnJvcihcclxuICAgICAgZXJyb3IudHlwZSxcclxuICAgICAgZXJyb3IudGl0bGUsXHJcbiAgICAgIGVycm9yLnN0YXR1cyxcclxuICAgICAgZXJyb3IuZGV0YWlsLFxyXG4gICAgICBwYXRoLFxyXG4gICAgICBlcnJvci5leHRlbnNpb25zXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLy8gMi4g5Yid5aeL5YyW6buY6K6k5YC8XHJcbiAgbGV0IHN0YXR1cyA9IDUwMDtcclxuICBsZXQgdGl0bGUgPSAnSW50ZXJuYWwgU2VydmVyIEVycm9yJztcclxuICBsZXQgZGV0YWlsID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xyXG4gIGxldCBleHRlbnNpb25zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xyXG5cclxuICAvLyAzLiDor4bliKsgRWx5c2lhIOWGhee9rumUmeivr+eggeW5tuKAnOWvuem9kOKAneagh+WHhlxyXG4gIHN3aXRjaCAoY29kZSkge1xyXG4gICAgY2FzZSAnVkFMSURBVElPTic6XHJcbiAgICAgIHN0YXR1cyA9IDQwMDtcclxuICAgICAgdGl0bGUgPSAnVmFsaWRhdGlvbiBGYWlsZWQnO1xyXG4gICAgICAvLyDmj5Dlj5YgRWx5c2lhIOeahOagoemqjOe7huiKglxyXG4gICAgICBleHRlbnNpb25zID0geyBlcnJvcnM6IGVycm9yLmFsbCB8fCBbXSB9O1xyXG4gICAgICBicmVhaztcclxuICAgIGNhc2UgJ05PVF9GT1VORCc6XHJcbiAgICAgIHN0YXR1cyA9IDQwNDtcclxuICAgICAgdGl0bGUgPSAnUmVzb3VyY2UgTm90IEZvdW5kJztcclxuICAgICAgYnJlYWs7XHJcbiAgICBjYXNlICdQQVJTRSc6XHJcbiAgICAgIHN0YXR1cyA9IDQwMDtcclxuICAgICAgdGl0bGUgPSAnSW52YWxpZCBQYXlsb2FkJztcclxuICAgICAgZGV0YWlsID0gJ1RoZSByZXF1ZXN0IGJvZHkgY291bGQgbm90IGJlIHBhcnNlZCBhcyB2YWxpZCBKU09OLic7XHJcbiAgICAgIGJyZWFrO1xyXG4gICAgY2FzZSAnSU5WQUxJRF9DT09LSUVfU0lHTkFUVVJFJzpcclxuICAgICAgc3RhdHVzID0gNDAxO1xyXG4gICAgICB0aXRsZSA9ICdJbnZhbGlkIENyZWRlbnRpYWxzJztcclxuICAgICAgYnJlYWs7XHJcbiAgICBkZWZhdWx0OlxyXG4gICAgICAvLyDlpoLmnpzplJnor6/lr7nosaHmnKzouqvluKbmnInnirbmgIHnoIHvvIjmr5TlpoLmn5DkupvlupPmipvlh7rnmoTvvIlcclxuICAgICAgaWYgKHR5cGVvZiBlcnJvcj8uc3RhdHVzID09PSAnbnVtYmVyJykge1xyXG4gICAgICAgIHN0YXR1cyA9IGVycm9yLnN0YXR1cztcclxuICAgICAgICB0aXRsZSA9IERFRkFVTFRfVElUTEVTW3N0YXR1c10gfHwgJ1Vua25vd24gRXJyb3InO1xyXG4gICAgICB9XHJcbiAgICAgIGJyZWFrO1xyXG4gIH1cclxuXHJcbiAgLy8gNC4g5p6E6YCg5bm26L+U5Zue5qCH5YeG55qEIFByb2JsZW1FcnJvclxyXG4gIHJldHVybiBuZXcgUHJvYmxlbUVycm9yKFxyXG4gICAgdHlwZUJhc2VVcmwgPT09ICdhYm91dDpibGFuaycgPyB0eXBlQmFzZVVybCA6IGAke3R5cGVCYXNlVXJsfS8ke2NvZGV9YCxcclxuICAgIHRpdGxlLFxyXG4gICAgc3RhdHVzLFxyXG4gICAgZGV0YWlsLFxyXG4gICAgcGF0aCxcclxuICAgIGV4dGVuc2lvbnNcclxuICApO1xyXG59O1xyXG5cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUHJvYmxlbUpzb24ge1xyXG4gIHR5cGU/OiBzdHJpbmdcclxuICB0aXRsZTogc3RyaW5nXHJcbiAgc3RhdHVzOiBudW1iZXJcclxuICBkZXRhaWw/OiBzdHJpbmdcclxuICBpbnN0YW5jZT86IHN0cmluZ1xyXG4gIFtrZXk6IHN0cmluZ106IHVua25vd25cclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBQcm9ibGVtSnNvbk9wdGlvbnMge1xyXG4gIC8qKlxyXG4gICAqIOWfuuehgCBVUkzvvIznlKjkuo7nlJ/miJDplJnor6/nsbvlnovnmoTpk77mjqVcclxuICAgKiBAZXhhbXBsZSAnaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20vZXJyb3JzJ1xyXG4gICAqL1xyXG4gIHR5cGVCYXNlVXJsPzogc3RyaW5nXHJcblxyXG4gIC8qKlxyXG4gICAqIOaYr+WQpuWcqOaXpeW/l+S4reaYvuekuuWujOaVtOeahCBQcm9ibGVtIEpTT05cclxuICAgKiBAZGVmYXVsdCB0cnVlXHJcbiAgICovXHJcbiAgZW5hYmxlZD86IGJvb2xlYW5cclxuXHJcbiAgLyoqXHJcbiAgICog6Ieq5a6a5LmJ5qC85byP5YyW5Ye95pWwXHJcbiAgICovXHJcbiAgZm9ybWF0PzogKGVycm9yOiB1bmtub3duLCByZXF1ZXN0OiBSZXF1ZXN0KSA9PiBQcm9ibGVtSnNvbiB8IG51bGxcclxufVxyXG5cclxuY29uc3QgaXNFcnJvcldpdGhTdGF0dXMgPSAoXHJcbiAgdmFsdWU6IHVua25vd25cclxuKTogdmFsdWUgaXMgeyBzdGF0dXM6IG51bWJlciB9ID0+XHJcbiAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxyXG4gIHZhbHVlICE9PSBudWxsICYmXHJcbiAgJ3N0YXR1cycgaW4gdmFsdWUgJiZcclxuICB0eXBlb2YgKHZhbHVlIGFzIHsgc3RhdHVzPzogdW5rbm93biB9KS5zdGF0dXMgPT09ICdudW1iZXInXHJcblxyXG5jb25zdCBpc0Vycm9yTGlrZSA9ICh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIEVycm9yID0+XHJcbiAgdmFsdWUgaW5zdGFuY2VvZiBFcnJvciB8fFxyXG4gICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXHJcbiAgICB2YWx1ZSAhPT0gbnVsbCAmJlxyXG4gICAgJ21lc3NhZ2UnIGluIHZhbHVlICYmXHJcbiAgICB0eXBlb2YgKHZhbHVlIGFzIHsgbWVzc2FnZT86IHVua25vd24gfSkubWVzc2FnZSA9PT0gJ3N0cmluZycpXHJcblxyXG4vKipcclxuICog5bCG6ZSZ6K+v6L2s5o2i5Li6IFJGQyA5NDU3IFByb2JsZW0gSlNPTiDmoLzlvI9cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiB0b1Byb2JsZW1Kc29uKFxyXG4gIGVycm9yOiB1bmtub3duLFxyXG4gIHJlcXVlc3Q6IFJlcXVlc3QsXHJcbiAgb3B0aW9uczogUHJvYmxlbUpzb25PcHRpb25zID0ge31cclxuKTogUHJvYmxlbUpzb24ge1xyXG4gIC8vIOWmguaenOaPkOS+m+S6huiHquWumuS5ieagvOW8j+WMluWHveaVsO+8jOS9v+eUqOWug1xyXG4gIGlmIChvcHRpb25zLmZvcm1hdCkge1xyXG4gICAgY29uc3QgY3VzdG9tID0gb3B0aW9ucy5mb3JtYXQoZXJyb3IsIHJlcXVlc3QpXHJcbiAgICBpZiAoY3VzdG9tKSB7XHJcbiAgICAgIHJldHVybiBjdXN0b21cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbnN0IHVybCA9IG5ldyBVUkwocmVxdWVzdC51cmwpXHJcbiAgY29uc3Qgc3RhdHVzID0gaXNFcnJvcldpdGhTdGF0dXMoZXJyb3IpID8gZXJyb3Iuc3RhdHVzIDogNTAwXHJcbiAgY29uc3QgbWVzc2FnZSA9IGlzRXJyb3JMaWtlKGVycm9yKVxyXG4gICAgPyBlcnJvci5tZXNzYWdlXHJcbiAgICA6IFN0cmluZyhlcnJvciA/PyAnVW5rbm93biBFcnJvcicpXHJcblxyXG4gIC8vIOm7mOiupOeahCBQcm9ibGVtIEpTT04g57uT5p6EXHJcbiAgY29uc3QgcHJvYmxlbTogUHJvYmxlbUpzb24gPSB7XHJcbiAgICB0eXBlOiBvcHRpb25zLnR5cGVCYXNlVXJsXHJcbiAgICAgID8gYCR7b3B0aW9ucy50eXBlQmFzZVVybH0vJHtzdGF0dXN9YFxyXG4gICAgICA6ICdhYm91dDpibGFuaycsXHJcbiAgICB0aXRsZTogZ2V0RGVmYXVsdFRpdGxlKHN0YXR1cyksXHJcbiAgICBzdGF0dXMsXHJcbiAgICBkZXRhaWw6IG1lc3NhZ2UsXHJcbiAgICBpbnN0YW5jZTogdXJsLnBhdGhuYW1lICsgdXJsLnNlYXJjaFxyXG4gIH1cclxuXHJcbiAgLy8g5bCd6K+V5LuO6ZSZ6K+v5a+56LGh5Lit5o+Q5Y+W6aKd5aSW55qE5L+h5oGvXHJcbiAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgIT09IG51bGwpIHtcclxuICAgIGNvbnN0IGVyciA9IGVycm9yIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XHJcblxyXG4gICAgLy8g5aaC5p6c6ZSZ6K+v5bey57uP5pyJIFByb2JsZW0gSlNPTiDnu5PmnoTvvIznm7TmjqXkvb/nlKhcclxuICAgIGlmICgndHlwZScgaW4gZXJyIHx8ICd0aXRsZScgaW4gZXJyKSB7XHJcbiAgICAgIGlmIChlcnIudHlwZSkgcHJvYmxlbS50eXBlID0gZXJyLnR5cGUgYXMgc3RyaW5nXHJcbiAgICAgIGlmIChlcnIudGl0bGUpIHByb2JsZW0udGl0bGUgPSBlcnIudGl0bGUgYXMgc3RyaW5nXHJcbiAgICB9XHJcblxyXG4gICAgLy8g5re75Yqg5YW25LuW5omp5bGV5a2X5q6177yI5o6S6Zmk5qCH5YeG5a2X5q6177yJXHJcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhlcnIpKSB7XHJcbiAgICAgIGlmIChcclxuICAgICAgICAhWydzdGF0dXMnLCAnbWVzc2FnZScsICd0eXBlJywgJ3RpdGxlJywgJ2RldGFpbCcsICdpbnN0YW5jZSddLmluY2x1ZGVzKFxyXG4gICAgICAgICAga2V5XHJcbiAgICAgICAgKVxyXG4gICAgICApIHtcclxuICAgICAgICBwcm9ibGVtW2tleV0gPSB2YWx1ZVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXR1cm4gcHJvYmxlbVxyXG59XHJcblxyXG4vKipcclxuICog5qC55o2u54q25oCB56CB6I635Y+W6buY6K6k5qCH6aKYXHJcbiAqL1xyXG5mdW5jdGlvbiBnZXREZWZhdWx0VGl0bGUoc3RhdHVzOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gIGNvbnN0IHRpdGxlczogUmVjb3JkPG51bWJlciwgc3RyaW5nPiA9IHtcclxuICAgIDQwMDogJ0JhZCBSZXF1ZXN0JyxcclxuICAgIDQwMTogJ1VuYXV0aG9yaXplZCcsXHJcbiAgICA0MDI6ICdQYXltZW50IFJlcXVpcmVkJyxcclxuICAgIDQwMzogJ0ZvcmJpZGRlbicsXHJcbiAgICA0MDQ6ICdOb3QgRm91bmQnLFxyXG4gICAgNDA1OiAnTWV0aG9kIE5vdCBBbGxvd2VkJyxcclxuICAgIDQwNjogJ05vdCBBY2NlcHRhYmxlJyxcclxuICAgIDQwNzogJ1Byb3h5IEF1dGhlbnRpY2F0aW9uIFJlcXVpcmVkJyxcclxuICAgIDQwODogJ1JlcXVlc3QgVGltZW91dCcsXHJcbiAgICA0MDk6ICdDb25mbGljdCcsXHJcbiAgICA0MTA6ICdHb25lJyxcclxuICAgIDQxMTogJ0xlbmd0aCBSZXF1aXJlZCcsXHJcbiAgICA0MTI6ICdQcmVjb25kaXRpb24gRmFpbGVkJyxcclxuICAgIDQxMzogJ1BheWxvYWQgVG9vIExhcmdlJyxcclxuICAgIDQxNDogJ1VSSSBUb28gTG9uZycsXHJcbiAgICA0MTU6ICdVbnN1cHBvcnRlZCBNZWRpYSBUeXBlJyxcclxuICAgIDQxNjogJ1JhbmdlIE5vdCBTYXRpc2ZpYWJsZScsXHJcbiAgICA0MTc6ICdFeHBlY3RhdGlvbiBGYWlsZWQnLFxyXG4gICAgNDE4OiBcIkknbSBhIHRlYXBvdFwiLFxyXG4gICAgNDIyOiAnVW5wcm9jZXNzYWJsZSBFbnRpdHknLFxyXG4gICAgNDIzOiAnTG9ja2VkJyxcclxuICAgIDQyNDogJ0ZhaWxlZCBEZXBlbmRlbmN5JyxcclxuICAgIDQyNTogJ1RvbyBFYXJseScsXHJcbiAgICA0MjY6ICdVcGdyYWRlIFJlcXVpcmVkJyxcclxuICAgIDQyODogJ1ByZWNvbmRpdGlvbiBSZXF1aXJlZCcsXHJcbiAgICA0Mjk6ICdUb28gTWFueSBSZXF1ZXN0cycsXHJcbiAgICA0MzE6ICdSZXF1ZXN0IEhlYWRlciBGaWVsZHMgVG9vIExhcmdlJyxcclxuICAgIDQ1MTogJ1VuYXZhaWxhYmxlIEZvciBMZWdhbCBSZWFzb25zJyxcclxuICAgIDUwMDogJ0ludGVybmFsIFNlcnZlciBFcnJvcicsXHJcbiAgICA1MDE6ICdOb3QgSW1wbGVtZW50ZWQnLFxyXG4gICAgNTAyOiAnQmFkIEdhdGV3YXknLFxyXG4gICAgNTAzOiAnU2VydmljZSBVbmF2YWlsYWJsZScsXHJcbiAgICA1MDQ6ICdHYXRld2F5IFRpbWVvdXQnLFxyXG4gICAgNTA1OiAnSFRUUCBWZXJzaW9uIE5vdCBTdXBwb3J0ZWQnLFxyXG4gICAgNTA2OiAnVmFyaWFudCBBbHNvIE5lZ290aWF0ZXMnLFxyXG4gICAgNTA3OiAnSW5zdWZmaWNpZW50IFN0b3JhZ2UnLFxyXG4gICAgNTA4OiAnTG9vcCBEZXRlY3RlZCcsXHJcbiAgICA1MTA6ICdOb3QgRXh0ZW5kZWQnLFxyXG4gICAgNTExOiAnTmV0d29yayBBdXRoZW50aWNhdGlvbiBSZXF1aXJlZCdcclxuICB9XHJcblxyXG4gIHJldHVybiB0aXRsZXNbc3RhdHVzXSB8fCAnRXJyb3InXHJcbn1cclxuXHJcbi8qKlxyXG4gKiDlsIYgUHJvYmxlbSBKU09OIOagvOW8j+WMluS4uuaXpeW/l+Wtl+espuS4slxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFByb2JsZW1Kc29uTG9nKFxyXG4gIHByb2JsZW06IFByb2JsZW1Kc29uLFxyXG4gIHJlcXVlc3Q6IFJlcXVlc3RcclxuKTogc3RyaW5nIHtcclxuICBjb25zdCB1cmwgPSBuZXcgVVJMKHJlcXVlc3QudXJsKVxyXG4gIGNvbnN0IHBhcnRzOiBzdHJpbmdbXSA9IFtdXHJcblxyXG4gIC8vIOagh+mimOihjFxyXG4gIGNvbnN0IHN0YXR1c1N0ciA9IHByb2JsZW0uc3RhdHVzLnRvU3RyaW5nKClcclxuICBjb25zdCBlbW9qaSA9IGdldFN0YXR1c0Vtb2ppKHByb2JsZW0uc3RhdHVzKVxyXG4gIHBhcnRzLnB1c2goXHJcbiAgICBgXFxuJHtlbW9qaX0gW0hUVFAgJHtzdGF0dXNTdHJ9XSAke3JlcXVlc3QubWV0aG9kfSAke3VybC5wYXRobmFtZX1gXHJcbiAgKVxyXG5cclxuICAvLyBQcm9ibGVtIEpTT04g5YaF5a65XHJcbiAgcGFydHMucHVzaChgICBUeXBlOiAgICAke3Byb2JsZW0udHlwZX1gKVxyXG4gIHBhcnRzLnB1c2goYCAgVGl0bGU6ICAgJHtwcm9ibGVtLnRpdGxlfWApXHJcbiAgaWYgKHByb2JsZW0uZGV0YWlsKSB7XHJcbiAgICBwYXJ0cy5wdXNoKGAgIERldGFpbDogICR7cHJvYmxlbS5kZXRhaWx9YClcclxuICB9XHJcbiAgaWYgKHByb2JsZW0uaW5zdGFuY2UpIHtcclxuICAgIHBhcnRzLnB1c2goYCAgSW5zdGFuY2U6ICR7cHJvYmxlbS5pbnN0YW5jZX1gKVxyXG4gIH1cclxuXHJcbiAgLy8g5omp5bGV5a2X5q61XHJcbiAgY29uc3QgZXh0ZW5zaW9ucyA9IE9iamVjdC5lbnRyaWVzKHByb2JsZW0pLmZpbHRlcihcclxuICAgIChba2V5XSkgPT5cclxuICAgICAgIVsndHlwZScsICd0aXRsZScsICdzdGF0dXMnLCAnZGV0YWlsJywgJ2luc3RhbmNlJ10uaW5jbHVkZXMoa2V5KVxyXG4gIClcclxuICBpZiAoZXh0ZW5zaW9ucy5sZW5ndGggPiAwKSB7XHJcbiAgICBwYXJ0cy5wdXNoKCcgIEV4dGVuc2lvbnM6JylcclxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGV4dGVuc2lvbnMpIHtcclxuICAgICAgcGFydHMucHVzaChgICAgICR7a2V5fTogJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSl9YClcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldHVybiBwYXJ0cy5qb2luKCdcXG4nKVxyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRTdGF0dXNFbW9qaShzdGF0dXM6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgaWYgKHN0YXR1cyA+PSA1MDApIHJldHVybiAn8J+UtCdcclxuICBpZiAoc3RhdHVzID49IDQwMCkgcmV0dXJuICfwn5+hJ1xyXG4gIGlmIChzdGF0dXMgPj0gMzAwKSByZXR1cm4gJ/CflLUnXHJcbiAgaWYgKHN0YXR1cyA+PSAyMDApIHJldHVybiAn8J+foidcclxuICByZXR1cm4gJ+KaqidcclxufVxyXG4iCiAgXSwKICAibWFwcGluZ3MiOiAiQUFBQSxpQkFBUyxnQkNBVCxvQ0FFQSxJQUFNLEdBQWEsQ0FBQyxFQUFjLElBQTBCLENBQzFELEdBQUksRUFBSyxRQUFVLEVBQ2pCLE9BQU8sRUFBSyxNQUFNLEVBQUcsQ0FBSyxFQUc1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QUMsVUFBVyxNQUFNLENBQzFCLENBQ0YsQ0FBQyxFQUlJLE1BQU0sU0FBVSxDQUFNLEVBQ3RCLE1BQU0sT0FBUSxFQUFPLElBQUksRUFDekIsTUFBTSxhQUFjLE9BQU8sQ0FBQyxDQUFDLEVBQzdCLFFBQVEsRUFBRyxZQUFhLENBQ3ZCLEdBQUksRUFDRixFQUFZLEVBQVEsQ0FBTyxFQUU5QixFQUNBLFVBQVUsRUFBRyxXQUFZLENBQ3hCLEVBQU0sV0FBYSxRQUFRLE9BQU8sT0FBTyxFQUMxQyxFQUNBLGNBQWMsRUFBRyxVQUFTLE1BQUssV0FBWSxDQUMxQyxHQUFJLEVBQWEsSUFBSSxDQUFPLEVBQzFCLE9BR0YsSUFBTSxFQUFTLE9BQU8sRUFBSSxTQUFXLFNBQVcsRUFBSSxPQUFTLElBQ3pELEVBQXNDLE9BQzFDLEdBQUksR0FBVSxJQUNaLEVBQVEsUUFDSCxRQUFJLEdBQVUsSUFDbkIsRUFBUSxVQUdWLEVBQU8sSUFBSSxFQUFPLEVBQVMsQ0FBRSxRQUFPLEVBQUcsQ0FBSyxFQUM3QyxFQUNBLFFBQVEsRUFBRyxVQUFTLFFBQU0sT0FBTSxPQUFLLFFBQU0sU0FBVSxDQU0xRCxJQUFJLEVBQVMsRUFBUSxVQUFZLEVBQVEsVUFBVSxFQUFPLENBQUUsVUFBUyxNQUFLLENBQUMsRUFBSSxFQU16RSxFQUFVLEdBQW1CLEVBQVEsRUFBTSxFQUFNLEVBQVEsUUFBUSxPQUFPLGFBQWEsV0FBVyxFQWdCdEcsT0FWQSxFQUFPLGdCQUFnQixFQUFTLEVBQVMsRUFBTyxDQUFPLEVBTXZELEVBQUksT0FBUyxFQUFRLE9BQ3JCLEVBQUksUUFBUSxnQkFBa0IsMkJBR3ZCLEVBQVEsT0FBTyxFQUdqQixFQUVBLEdBQUcsUUFBUSxHQW1CSCIsCiAgImRlYnVnSWQiOiAiNjg3ODQyNDg4RkEzQjA0MjY0NzU2RTIxNjQ3NTZFMjEiLAogICJuYW1lcyI6IFtdCn0=
|