logixlysia 5.3.0 → 6.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -1,99 +1,71 @@
1
- import { Elysia } from "elysia";
2
- import { LoggerOptions, Logger as PinoLogger } from "pino";
3
- interface RequestInfo {
4
- headers: {
5
- get: (key: string) => string | null
6
- };
7
- method: string;
8
- url: string;
9
- }
10
- type LogLevel = "DEBUG" | "INFO" | "WARNING" | "ERROR" | string;
11
- interface LogData {
12
- status?: number;
13
- message?: string;
14
- context?: Record<string, string | number | boolean | null>;
15
- stack?: string;
16
- metrics?: {
17
- memoryUsage?: number
18
- cpuUsage?: number
19
- responseSize?: number
20
- };
21
- }
22
- interface Logger {
23
- store?: StoreData;
24
- pino: PinoLogger;
25
- log(level: LogLevel, request: RequestInfo, data: LogData, store: StoreData): void;
26
- handleHttpError(request: RequestInfo, error: HttpError, store: StoreData): Promise<void>;
27
- customLogFormat?: string;
28
- info(request: RequestInfo, message: string, context?: Record<string, string | number | boolean | null>, store?: StoreData): void;
29
- error(request: RequestInfo, message: string, context?: Record<string, string | number | boolean | null>, store?: StoreData): void;
30
- warn(request: RequestInfo, message: string, context?: Record<string, string | number | boolean | null>, store?: StoreData): void;
31
- debug(request: RequestInfo, message: string, context?: Record<string, string | number | boolean | null>, store?: StoreData): void;
32
- }
33
- interface StoreData {
1
+ import { Elysia, SingletonBase } from "elysia";
2
+ import { Logger as PinoLogger, LoggerOptions as PinoLoggerOptions } from "pino";
3
+ type Pino = PinoLogger<never, boolean>;
4
+ type LogLevel = "DEBUG" | "INFO" | "WARNING" | "ERROR";
5
+ type StoreData = {
34
6
  beforeTime: bigint;
35
- logger?: Logger;
36
- pino?: PinoLogger;
37
- hasCustomLog?: boolean;
38
- }
39
- interface LogixlysiaContext {
40
- store: {
41
- logger: Logger
42
- pino: PinoLogger
43
- beforeTime: bigint
44
- hasCustomLog: boolean
45
- };
46
- request: RequestInfo;
47
- }
48
- declare class HttpError extends Error {
49
- status: number;
50
- constructor(status: number, message: string);
51
- }
52
- type TransportFunction = (level: LogLevel, message: string, meta: {
53
- request: RequestInfo
54
- data: LogData
55
- store: StoreData
56
- }) => Promise<void> | void;
57
- interface Transport {
58
- log: TransportFunction;
59
- }
60
- interface TimestampConfig {
61
- translateTime?: boolean | string;
62
- }
63
- type PinoConfig = LoggerOptions & {
64
- prettyPrint?: boolean | Record<string, unknown>
65
7
  };
66
- interface LogRotationConfig {
8
+ type LogixlysiaStore = {
9
+ logger: Logger;
10
+ pino: Pino;
11
+ beforeTime?: bigint;
12
+ [key: string]: unknown;
13
+ };
14
+ type Transport = {
15
+ log: (level: LogLevel, message: string, meta?: Record<string, unknown>) => void | Promise<void>;
16
+ };
17
+ type LogRotationConfig = {
18
+ /**
19
+ * Max log file size before rotation, e.g. '10m', '5k', or a byte count.
20
+ */
67
21
  maxSize?: string | number;
68
- maxFiles?: string | number;
22
+ /**
23
+ * Keep at most N files or keep files for a duration like '7d'.
24
+ */
25
+ maxFiles?: number | string;
26
+ /**
27
+ * Rotate at a fixed interval, e.g. '1d', '12h'.
28
+ */
69
29
  interval?: string;
70
30
  compress?: boolean;
71
31
  compression?: "gzip";
72
- }
73
- interface Options {
32
+ };
33
+ type Options = {
74
34
  config?: {
75
- customLogFormat?: string
76
- logFilePath?: string
77
- logRotation?: LogRotationConfig
78
- logFilter?: {
79
- level?: LogLevel | LogLevel[]
80
- method?: string | string[]
81
- status?: number | number[]
82
- } | null
83
- ip?: boolean
84
- useColors?: boolean
85
- showStartupMessage?: boolean
86
- startupMessageFormat?: "banner" | "simple"
87
- transports?: Transport[]
88
- timestamp?: TimestampConfig
89
- disableInternalLogger?: boolean
90
- disableFileLogging?: boolean
91
- useTransportsOnly?: boolean
92
- pino?: PinoConfig
35
+ showStartupMessage?: boolean;
36
+ startupMessageFormat?: "simple" | "banner";
37
+ useColors?: boolean;
38
+ ip?: boolean;
39
+ timestamp?: {
40
+ translateTime?: string;
41
+ };
42
+ customLogFormat?: string;
43
+ transports?: Transport[];
44
+ useTransportsOnly?: boolean;
45
+ disableInternalLogger?: boolean;
46
+ disableFileLogging?: boolean;
47
+ logFilePath?: string;
48
+ logRotation?: LogRotationConfig;
49
+ pino?: (PinoLoggerOptions & {
50
+ prettyPrint?: boolean;
51
+ }) | undefined;
93
52
  };
94
- }
95
- declare function createLogger(options?: Options): Logger;
96
- declare function handleHttpError2(request: RequestInfo, error: HttpError, store: StoreData, options?: Options): Promise<void>;
97
- declare function logToTransports(level: LogLevel, request: RequestInfo, data: LogData, store: StoreData, options?: Options): Promise<void>;
98
- declare function logixlysia(options?: Options): Elysia;
99
- export { logToTransports, handleHttpError2 as handleHttpError, logixlysia as default, createLogger, Transport, StoreData, RequestInfo, Options, LogixlysiaContext, Logger, LogRotationConfig, LogLevel, LogData, HttpError };
53
+ };
54
+ type Logger = {
55
+ pino: Pino;
56
+ log: (level: LogLevel, request: RequestInfo, data: Record<string, unknown>, store: StoreData) => void;
57
+ handleHttpError: (request: RequestInfo, error: unknown, store: StoreData) => void;
58
+ debug: (request: RequestInfo, message: string, context?: Record<string, unknown>) => void;
59
+ info: (request: RequestInfo, message: string, context?: Record<string, unknown>) => void;
60
+ warn: (request: RequestInfo, message: string, context?: Record<string, unknown>) => void;
61
+ error: (request: RequestInfo, message: string, context?: Record<string, unknown>) => void;
62
+ };
63
+ type LogixlysiaContext = {
64
+ request: Request;
65
+ store: LogixlysiaStore;
66
+ };
67
+ type Logixlysia = Elysia<"Logixlysia", SingletonBase & {
68
+ store: LogixlysiaStore;
69
+ }>;
70
+ declare const logixlysia: (options?: Options) => Logixlysia;
71
+ export { logixlysia, logixlysia as default, Transport, StoreData, Pino, Options, LogixlysiaStore, LogixlysiaContext, Logixlysia, Logger, LogLevel };
package/dist/index.js CHANGED
@@ -1,13 +1,6 @@
1
- import{Elysia as Mr}from"elysia";var U=(r,o)=>{let n=Math.max(0,(o-r.length)/2),t=" ".repeat(n);return`${t}${r}${t}`.padEnd(o)};function w(r,o){let n=r?.hostname??"localhost",t=r?.port??3000,s=r?.protocol??"http";if(o?.config?.startupMessageFormat!=="simple"){let c=`\uD83E\uDD8A Elysia is running at ${s}://${n}:${t}`,u=Math.max(22,c.length)+4,f="─".repeat(u),i=U("",u);console.log(`
2
- ┌${f}
3
- │${i}
4
- │${U("Elysia with Logixlysia",u)}│
5
- │${i}│
6
- │${U(c,u)}│
7
- │${i}│
8
- └${f}┘
9
- `)}else console.log(`\uD83E\uDD8A Elysia is running at ${s}://${n}:${t}`)}import b from"chalk";import{StatusMap as h}from"elysia";function H(r){if(typeof r==="number")return r;return h[r]||500}function E(r,o){let n=r.toString();if(!o)return n;if(r>=500)return b.red(n);if(r>=400)return b.yellow(n);if(r>=300)return b.cyan(n);if(r>=200)return b.green(n);return b.white(n)}import x from"pino";import B from"chalk";import a from"chalk";var C={INFO:a.bgGreen.black,WARNING:a.bgYellow.black,ERROR:a.bgRed.black},T={GET:a.green,POST:a.yellow,PUT:a.blue,PATCH:a.magentaBright,DELETE:a.red,HEAD:a.cyan,OPTIONS:a.magenta};import K from"chalk";var z=[{unit:"s",threshold:1e9,decimalPlaces:2},{unit:"ms",threshold:1e6,decimalPlaces:0},{unit:"µs",threshold:1000,decimalPlaces:0},{unit:"ns",threshold:1,decimalPlaces:0}];function D(r,o){let n=Number(process.hrtime.bigint()-r);for(let{unit:t,threshold:s,decimalPlaces:e}of z)if(n>=s){let c=`${(n/s).toFixed(e)}${t}`.padStart(8).padEnd(16);return o?K.gray(c):c}return o?K.gray("0ns".padStart(8).padEnd(16)):"0ns".padStart(8).padEnd(16)}function R(r,o){let n=r.toUpperCase();return o?C[n]?.(n.padEnd(7))||n:n.padEnd(7)}function k(r,o){let n=T[r];return o&&n?n(r.padEnd(7)):r.padEnd(7)}function d(r){try{return new URL(r.url).pathname}catch{return}}var m=(r)=>r.toString().padStart(2,"0");function P(r){let o=r.getFullYear(),n=m(r.getMonth()+1),t=m(r.getDate()),s=m(r.getHours()),e=m(r.getMinutes()),g=m(r.getSeconds()),c=r.getMilliseconds().toString().padStart(3,"0");return`${o}-${n}-${t} ${s}:${e}:${g}.${c}`}function rr(r,o){let n={yyyy:r.getFullYear(),yy:r.getFullYear().toString().slice(-2),mm:m(r.getMonth()+1),dd:m(r.getDate()),HH:m(r.getHours()),MM:m(r.getMinutes()),ss:m(r.getSeconds()),SSS:m(r.getMilliseconds()),Z:-r.getTimezoneOffset()/60};return o.replace(/yyyy|yy|mm|dd|HH|MM|ss|SSS|Z/g,(t)=>(n[t]??"").toString())}function v(r,o){if(!o?.translateTime)return r.toISOString();if(o.translateTime===!0||o.translateTime==="SYS:STANDARD")return P(r);return rr(r,o.translateTime)}var or="\uD83E\uDD8A {now} {level} {duration} {method} {pathname} {status} {message} {context} {ip}";function nr(r,o){if(o?.config?.useColors!==void 0)return o.config.useColors&&process.env.NO_COLOR===void 0;return r&&process.env.NO_COLOR===void 0}function L(r,o,n,t,s,e=!0){let g=nr(e,s),c=new Date,u={now:g?B.bgYellow(B.black(v(c,s?.config?.timestamp))):v(c,s?.config?.timestamp),epoch:Math.floor(c.getTime()/1000).toString(),level:R(r,e),duration:D(t.beforeTime,e),method:k(o.method,e),pathname:d(o),status:E(n.status||200,e),message:n.message||"",context:n.context?(()=>{try{return JSON.stringify(n.context)}catch(i){return`[Error serializing context: ${i instanceof Error?i.message:"Unknown error"}]`}})():"",ip:s?.config?.ip&&o.headers.get("x-forwarded-for")?`IP: ${o.headers.get("x-forwarded-for")}`:""};return(s?.config?.customLogFormat||or).replace(/{(\w+)}/g,(i,S)=>{if(S in u)return u[S]||"";return""})}async function l(r,o,n,t,s){if(!s?.config?.transports||s.config.transports.length===0)return;let e=L(r,o,n,t,s,!1),g=s.config.transports.map((c)=>c.log(r,e,{request:o,data:n,store:t}));await Promise.all(g)}import{promises as X}from"node:fs";import{dirname as yr}from"node:path";import{promises as F}from"node:fs";import{basename as tr,dirname as sr,join as er}from"node:path";var gr=/^(\d+(?:\.\d+)?)\s*([kmg])?b?$/,cr=/^(\d+)\s*([hdw])$/,ur=/^(\d+)\s*d$/;function W(r){if(typeof r==="number")return r;let o={k:1024,m:1048576,g:1073741824},n=r.toLowerCase().match(gr);if(!n?.[1])throw Error(`Invalid size format: ${r}`);let t=Number.parseFloat(n[1]),s=n[2]??"";return Math.floor(t*(o[s]??1))}function M(r){let o={h:3600000,d:86400000,w:604800000},n=r.toLowerCase().match(cr);if(!n)throw Error(`Invalid interval format: ${r}`);let t=n[1],s=n[2];if(!t)throw Error(`Invalid interval format: ${r}`);if(!s)throw Error(`Invalid interval format: ${r}`);return Number.parseInt(t,10)*(o[s]??0)}function j(r){if(typeof r==="number")return{type:"count",value:r};let o=r.toLowerCase().match(ur);if(o?.[1])return{type:"time",value:Number.parseInt(o[1],10)*24*60*60*1000};throw Error(`Invalid retention format: ${r}`)}async function pr(r){try{return(await F.stat(r)).mtime.getTime()}catch{return Date.now()}}var N=new Map;async function _(r,o){let n=Date.now(),t=N.get(r);if(t!==void 0)return n-t>=o;let s=await pr(r);return N.set(r,s),n-s>=o}function Y(r){N.set(r,Date.now())}async function A(r){let o=sr(r),n=tr(r);try{let t=await F.readdir(o),s=new RegExp(`^${n.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}\\.\\d{4}-\\d{2}-\\d{2}(-\\d{2}-\\d{2}-\\d{2})?(\\.gz)?$`),e=t.filter((c)=>s.test(c)).map((c)=>er(o,c));return(await Promise.all(e.map(async(c)=>{let u=await F.stat(c);return{file:c,mtime:u.mtime.getTime()}}))).sort((c,u)=>u.mtime-c.mtime).map((c)=>c.file)}catch{return[]}}import{createReadStream as mr,createWriteStream as ar,promises as p}from"node:fs";import{pipeline as ir}from"node:stream/promises";import{createGzip as Lr}from"node:zlib";function lr(r,o){let n=o.getFullYear(),t=String(o.getMonth()+1).padStart(2,"0"),s=String(o.getDate()).padStart(2,"0"),e=String(o.getHours()).padStart(2,"0"),g=String(o.getMinutes()).padStart(2,"0"),c=String(o.getSeconds()).padStart(2,"0");return`${r}.${n}-${t}-${s}-${e}-${g}-${c}`}async function fr(r){try{if((await p.stat(r)).size===0)return"";let n=lr(r,new Date);return await p.rename(r,n),Y(r),n}catch(o){if(o.code!=="ENOENT")console.error(`Failed to rotate log file ${r}:`,o);return""}}async function br(r){try{let o=`${r}.gz`,n=mr(r),t=ar(o),s=Lr();await ir(n,s,t),await p.unlink(r)}catch(o){console.error(`Failed to compress file ${r}:`,o)}}async function Or(r,o){if(!o.maxFiles)return;try{let n=await A(r);if(n.length===0)return;let t=j(o.maxFiles);if(t.type==="count"){let s=n.slice(t.value);await Promise.all(s.map((e)=>p.unlink(e)))}else if(t.type==="time"){let s=Date.now()-t.value,e=await Promise.all(n.map(async(g)=>{return(await p.stat(g)).mtime.getTime()<s?g:null}));await Promise.all(e.filter((g)=>g!==null).map((g)=>p.unlink(g)))}}catch(n){console.error(`Failed to clean old log files for ${r}:`,n)}}async function J(r,o){try{let n=await fr(r);if(!n)return;if(o.compress)await br(n);await Or(r,o)}catch(n){console.error(`Failed to perform rotation for ${r}:`,n)}}async function q(r,o){try{await p.access(r)}catch{return!1}if(o.maxSize)try{let n=W(o.maxSize);if((await p.stat(r)).size>=n)return!0}catch(n){console.error(`Failed to check file size for ${r}:`,n)}if(o.interval)try{let n=M(o.interval),t=await p.stat(r);if(Date.now()-t.mtimeMs>=n)return!0}catch(n){console.error(`Failed to check file age for ${r}:`,n)}return!1}var Q=new Set;async function xr(r){let o=yr(r);if(!Q.has(o))await X.mkdir(o,{recursive:!0}),Q.add(o)}async function Sr(r,o){let n=o?.config?.logRotation;if(!n)return;let t=!1;if(n.maxSize)t=await q(r,n);if(!t&&n.interval)try{let s=M(n.interval);t=await _(r,s)}catch(s){console.error("Invalid interval format in log rotation config:",s)}if(t)await J(r,n)}async function O(r,o,n,t,s,e){await xr(r),await Sr(r,e);let g=`${L(o,n,t,s,e,!1)}
10
- `;await X.appendFile(r,g,{flag:"a"})}var G=(r,o)=>Array.isArray(r)?r.includes(o):r===o;function Z(r,o,n,t){let s=t?.config?.logFilter;if(!s)return!0;return(!s.level||G(s.level,r))&&(!s.status||G(s.status,o))&&(!s.method||G(s.method,n))}async function $(r,o,n,t){let e={status:o.status||500,message:o.message,stack:o.stack},g=[];if(!(t?.config?.useTransportsOnly||t?.config?.disableInternalLogger))console.error(L("ERROR",r,e,n,t));if(!t?.config?.useTransportsOnly&&t?.config?.logFilePath&&!t?.config?.disableFileLogging)g.push(O(t.config.logFilePath,"ERROR",r,e,n,t));if(t?.config?.transports?.length)g.push(l("ERROR",r,e,n,t));await Promise.all(g)}function wr(){let r=process.memoryUsage().heapUsed/1024/1024,o=process.cpuUsage();return{memoryUsage:r,cpuUsage:o.user/1e6}}function Er(r){return{level:r.level||"info",timestamp:r.timestamp??!0,messageKey:r.messageKey||"msg",errorKey:r.errorKey||"err",base:r.base||{pid:process.pid}}}function Dr(r){return x.transport({target:"pino-pretty",options:{colorize:!0,translateTime:"HH:MM:ss Z",ignore:"pid,hostname",...typeof r==="object"?r:{}}})}function Rr(r){let o=r?.config?.pino||{},{prettyPrint:n,transport:t,...s}=o,e={...Er(o),...s};if(n)return x(e,Dr(n));if(t){if(typeof t==="object"&&"target"in t)return x(e,x.transport(t));console.warn("Invalid transport configuration provided, falling back to default")}return x(e)}function kr(r){switch(r.toUpperCase()){case"DEBUG":return"debug";case"INFO":return"info";case"WARNING":case"WARN":return"warn";case"ERROR":return"error";default:return console.warn(`Unknown log level "${r}", defaulting to "info"`),"info"}}function dr(r,o,n,t,s){let e=kr(o),g=r[e],c=Boolean(s?.config?.pino?.transport||s?.config?.pino?.prettyPrint);if((!s?.config?.useTransportsOnly||c)&&typeof g==="function")g.call(r,n,t)}async function vr(r,o,n,t,s,e){let g=[];if(!(s?.config?.useTransportsOnly||s?.config?.disableInternalLogger))console.log(e);if(!s?.config?.useTransportsOnly&&s?.config?.logFilePath&&!s?.config?.disableFileLogging)g.push(O(s.config.logFilePath,r,o,n,t,s));if(s?.config?.transports?.length)g.push(l(r,o,n,t,s));await Promise.all(g)}async function y(r,o,n,t,s,e){if(!Z(o,t.status||200,n.method,e))return;if(!t.metrics)t.metrics=wr();if(o==="ERROR"&&!t.stack){let V=Error(t.message||"Unknown error");t.stack=V.stack}let g=e?.config?.pino?.errorKey||"err",c=o==="ERROR"&&t.stack?{name:"Error",message:t.message||"Unknown error",stack:t.stack}:void 0,u=n.headers.get("x-forwarded-for"),f=e?.config?.ip&&u?u.split(",")[0]?.trim():void 0,i={method:n.method,url:n.url,status:t.status,message:t.message,context:t.context,metrics:t.metrics,duration:Number(process.hrtime.bigint()-s.beforeTime)/1e6,ip:f,[g]:c};dr(r,o,i,t.message||"Request processed",e);let S=L(o,n,t,s,e,!0);await vr(o,n,t,s,e,S)}function I(r){let o=Rr(r),n={store:void 0,pino:o,log:(t,s,e,g)=>y(o,t,s,e,g,r),handleHttpError:async(t,s,e)=>await $(t,s,e,r),customLogFormat:r?.config?.customLogFormat,info:(t,s,e,g)=>{let c=g||n.store||{beforeTime:process.hrtime.bigint()};return c.hasCustomLog=!0,y(o,"INFO",t,{message:s,context:e,status:200},c,r)},error:(t,s,e,g)=>{let c=g||n.store||{beforeTime:process.hrtime.bigint()};return c.hasCustomLog=!0,y(o,"ERROR",t,{message:s,context:e,status:500},c,r)},warn:(t,s,e,g)=>{let c=g||n.store||{beforeTime:process.hrtime.bigint()};return c.hasCustomLog=!0,y(o,"WARNING",t,{message:s,context:e,status:200},c,r)},debug:(t,s,e,g)=>{let c=g||n.store||{beforeTime:process.hrtime.bigint()};return c.hasCustomLog=!0,y(o,"DEBUG",t,{message:s,context:e,status:200},c,r)}};return n}function $r(r){let o=I(r);return new Mr({name:"Logixlysia"}).onStart((n)=>{if(r?.config?.showStartupMessage??!0)w(n.server,r)}).onRequest((n)=>{let t={...n.store,beforeTime:process.hrtime.bigint(),logger:o,pino:o.pino,hasCustomLog:!1};n.store=t,o.store=t}).onAfterHandle({as:"global"},({request:n,set:t,store:s})=>{let e=s;if(!e.hasCustomLog){let g=H(t.status||200);o.log("INFO",n,{status:g,message:String(t.headers?.["x-message"]||"")},e)}}).onError({as:"global"},async({request:n,error:t,set:s,store:e})=>{let g=H(s.status||500);await o.handleHttpError(n,{...t,status:g},e)})}export{l as logToTransports,$ as handleHttpError,$r as default,I as createLogger};
1
+ import{Elysia as Hn}from"elysia";import v from"elysia/package.json";var u=(n,o)=>{if(n.length>=o)return n.slice(0,o);let r=Math.floor((o-n.length)/2),b=o-n.length-r;return`${" ".repeat(r)}${n}${" ".repeat(b)}`},B=(n)=>{let o=`Elysia v${v.version}`,b=Math.max(n.length,o.length)+4,c=`┌${"─".repeat(b)}┐`,i=`└${"─".repeat(b)}┘`,f=`│${" ".repeat(b)}│`,m=`│${u(o,b)}│`,L=`│ ${n}${" ".repeat(Math.max(0,b-n.length-4))} │`;return[c,f,m,f,L,f,i].join(`
2
+ `)};var V=(n,o)=>{if(!(o.config?.showStartupMessage??!0))return;let{port:b,hostname:c,protocol:i}=n;if(b===void 0||!c||!i)return;let m=`\uD83E\uDD8A Elysia is running at ${`${i}://${c}:${b}`}`;if((o.config?.startupMessageFormat??"banner")==="simple"){console.log(m);return}console.log(B(m))};import p from"pino";var j=(...n)=>{let o=typeof n[0]==="string"?{level:n[0],request:n[1],data:n[2],store:n[3],options:n[4]}:n[0],{level:r,request:b,data:c,store:i,options:f}=o,m=f.config?.transports??[];if(m.length===0)return;let L=typeof c.message==="string"?c.message:"",O={request:{method:b.method,url:b.url},...c,beforeTime:i.beforeTime};for(let $ of m)try{let R=$.log(r,L,O);if(R&&typeof R.catch==="function")R.catch(()=>{})}catch{}};import{appendFile as In}from"node:fs/promises";import{dirname as On}from"node:path";import{promises as d}from"node:fs";var Y=async(n)=>{await d.mkdir(n,{recursive:!0})};import{promises as T}from"node:fs";import{promisify as cn}from"node:util";import{gzip as bn}from"node:zlib";import{promises as Z}from"node:fs";import{basename as l,dirname as a}from"node:path";var e=/^(\d+(?:\.\d+)?)(k|kb|m|mb|g|gb)$/i,nn=/^(\d+)(h|d|w)$/i,on=/\.(\d{4}-\d{2}-\d{2}-\d{2}-\d{2}-\d{2})(?:\.gz)?$/,_=(n)=>{if(typeof n==="number")return n;let o=n.trim(),r=Number(o);if(Number.isFinite(r))return r;let b=o.match(e);if(!b)throw Error(`Invalid size format: ${n}`);let c=Number(b[1]),i=b[2].toLowerCase(),f=1024;if(i.startsWith("m"))f=1048576;else if(i.startsWith("g"))f=1073741824;return Math.floor(c*f)},rn=(n)=>{let o=n.trim().match(nn);if(!o)throw Error(`Invalid interval format: ${n}`);let r=Number(o[1]),b=o[2].toLowerCase(),c=3600000;if(b==="d")c=86400000;else if(b==="w")c=604800000;return r*c},H=(n)=>{if(typeof n==="number")return{type:"count",value:n};return{type:"time",value:rn(n)}},A=async(n,o)=>{try{return(await Z.stat(n)).size>o}catch{return!1}},U=async(n)=>{let o=a(n),r=l(n),b;try{b=await Z.readdir(o)}catch{return[]}return b.filter((c)=>c.startsWith(`${r}.`)&&on.test(c)).map((c)=>`${o}/${c}`)};var fn=cn(bn),D=(n)=>String(n).padStart(2,"0"),mn=(n,o)=>{let r=o.getFullYear(),b=D(o.getMonth()+1),c=D(o.getDate()),i=D(o.getHours()),f=D(o.getMinutes()),m=D(o.getSeconds());return`${n}.${r}-${b}-${c}-${i}-${f}-${m}`},Rn=async(n)=>{try{if((await T.stat(n)).size===0)return""}catch{return""}let o=mn(n,new Date);return await T.rename(n,o),o},$n=async(n)=>{let o=await T.readFile(n),r=await fn(o);await T.writeFile(`${n}.gz`,r),await T.rm(n,{force:!0})},S=async(n,o)=>{if(o.maxSize===void 0)return!1;let r=_(o.maxSize);return await A(n,r)},Ln=async(n,o)=>{let r=await U(n);if(r.length<=o)return;let b=await Promise.all(r.map(async(i)=>({path:i,stat:await T.stat(i)})));b.sort((i,f)=>f.stat.mtimeMs-i.stat.mtimeMs);let c=b.slice(o);await Promise.all(c.map(({path:i})=>T.rm(i,{force:!0})))},wn=async(n,o)=>{let r=await U(n);if(r.length===0)return;let b=Date.now(),i=(await Promise.all(r.map(async(f)=>({path:f,stat:await T.stat(f)})))).filter(({stat:f})=>b-f.mtimeMs>o);await Promise.all(i.map(({path:f})=>T.rm(f,{force:!0})))},k=async(n,o)=>{let r=await Rn(n);if(!r)return;if(o.compress===!0){if((o.compression??"gzip")==="gzip")await $n(r)}if(o.maxFiles!==void 0){let c=H(o.maxFiles);if(c.type==="count")await Ln(n,c.value);else await wn(n,c.value)}};var N=async(...n)=>{let o=typeof n[0]==="string"?(()=>{let[G,F,K,W,J,Q]=n;return{filePath:G,level:F,request:K,data:W,store:J,options:Q}})():n[0],{filePath:r,level:b,request:c,data:i,store:f,options:m}=o,L=m.config,O=L?.useTransportsOnly===!0,$=L?.disableFileLogging===!0;if(O||$)return;let R=typeof i.message==="string"?i.message:"",w=f.beforeTime===BigInt(0)?0:Number(process.hrtime.bigint()-f.beforeTime)/1e6,g=`${b} ${w.toFixed(2)}ms ${c.method} ${new URL(c.url).pathname} ${R}
3
+ `;await Y(On(r)),await In(r,g,{encoding:"utf-8"});let y=L?.logRotation;if(!y)return;if(await S(r,y))await k(r,y)};import I from"chalk";import{StatusMap as yn}from"elysia";var Tn=/^\d+$/,gn=/[_-]+/g,Fn=/([a-z0-9])([A-Z])/g,En=/([A-Z])([A-Z][a-z])/g,Kn=/['’]/g,Gn=/[^a-z0-9\s]+/g,Dn=/\s+/g,M=(n)=>{let o=n.trim();if(!o)return"";return o.replace(gn," ").replace(Fn,"$1 $2").replace(En,"$1 $2").replace(Kn,"").toLowerCase().replace(Gn," ").replace(Dn," ").trim()},Xn=(()=>{let n=new Map;for(let[o,r]of Object.entries(yn))n.set(M(o),r);return n})(),s=(n)=>{if(typeof n==="number"&&Number.isFinite(n))return n;if(typeof n==="string"){let o=n.trim();if(Tn.test(o))return Number(o);return Xn.get(M(o))??500}return 500};var X=(n)=>String(n).padStart(2,"0"),jn=(n)=>String(n).padStart(3,"0"),Nn=(n)=>{let r=n.config?.useColors??!0,b=typeof process<"u"&&process.stdout?.isTTY===!0;return r&&b},Wn=(n,o)=>{if(!o)return n.toISOString();let r=String(n.getFullYear()),b=X(n.getMonth()+1),c=X(n.getDate()),i=X(n.getHours()),f=X(n.getMinutes()),m=X(n.getSeconds()),L=jn(n.getMilliseconds());return o.replaceAll("yyyy",r).replaceAll("mm",b).replaceAll("dd",c).replaceAll("HH",i).replaceAll("MM",f).replaceAll("ss",m).replaceAll("SSS",L)},Jn=(n)=>{let o=n.headers.get("x-forwarded-for");if(o)return o.split(",")[0]?.trim()??"";return n.headers.get("x-real-ip")??""},Qn=(n,o)=>{if(!o)return n;if(n==="ERROR")return I.bgRed.black(n);if(n==="WARNING")return I.bgYellow.black(n);if(n==="DEBUG")return I.bgBlue.black(n);return I.bgGreen.black(n)},Zn=(n,o)=>{if(!o)return n;let r=n.toUpperCase();if(r==="GET")return I.green.bold(r);if(r==="POST")return I.blue.bold(r);if(r==="PUT")return I.yellow.bold(r);if(r==="PATCH")return I.yellowBright.bold(r);if(r==="DELETE")return I.red.bold(r);if(r==="OPTIONS")return I.cyan.bold(r);if(r==="HEAD")return I.greenBright.bold(r);if(r==="TRACE")return I.magenta.bold(r);if(r==="CONNECT")return I.cyanBright.bold(r);return I.white.bold(r)},Un=(n,o)=>{if(!o)return n;let r=Number.parseInt(n,10);if(!Number.isFinite(r))return n;if(r>=500)return I.red(n);if(r>=400)return I.yellow(n);if(r>=300)return I.cyan(n);if(r>=200)return I.green(n);return I.gray(n)},zn=(n,o)=>{if(!o)return n;return I.gray(n)},Bn=(n,o)=>{if(!o)return n;return I.bgHex("#FFA500").black(n)},Vn=(n,o)=>{if(!o)return n;return I.whiteBright(n)},Yn=(n)=>{if(typeof n==="object"&&n!==null)return JSON.stringify(n);return""},P=({level:n,request:o,data:r,store:b,options:c})=>{let i=c.config,f=Nn(c),m=i?.customLogFormat??"\uD83E\uDD8A {now} {level} {duration} {method} {pathname} {status} {message} {ip} {context}",L=new Date,O=String(L.getTime()),$=Wn(L,i?.timestamp?.translateTime),R=Bn($,f),w=typeof r.message==="string"?r.message:"",g=b.beforeTime===BigInt(0)?0:Number(process.hrtime.bigint()-b.beforeTime)/1e6,y=new URL(o.url).pathname,E=r.status,G=E===null||E===void 0?200:s(E),F=String(G),K=i?.ip===!0?Jn(o):"",W=Yn(r.context),J=Qn(n,f),Q=Zn(o.method,f),z=Vn(y,f),C=Un(F,f),h=zn(`${g.toFixed(2)}ms`,f);return m.replaceAll("{now}",R).replaceAll("{epoch}",O).replaceAll("{level}",J).replaceAll("{duration}",h).replaceAll("{method}",Q).replaceAll("{pathname}",z).replaceAll("{path}",z).replaceAll("{status}",C).replaceAll("{message}",w).replaceAll("{ip}",K).replaceAll("{context}",W)};var x=(n)=>{let o="An error occurred";if(n instanceof Error)o=n.message;else if(n&&typeof n==="object"&&"message"in n)o=n.message;else o=String(n);return console.error(`Parsing error: ${o}`),o};var _n=(n)=>typeof n==="object"&&n!==null&&("status"in n)&&typeof n.status==="number",t=(n,o,r,b)=>{let c=b.config,i=c?.useTransportsOnly===!0,f=c?.disableInternalLogger===!0,m=c?.disableFileLogging===!0,L=_n(o)?o.status:500,O=x(o),$="ERROR",R={status:L,message:O,error:o};if(j({level:"ERROR",request:n,data:R,store:r,options:b}),!(i||m)){let w=c?.logFilePath;if(w)N({filePath:w,level:"ERROR",request:n,data:R,store:r,options:b}).catch(()=>{})}if(i||f)return;console.error(`ERROR ${n.method} ${new URL(n.url).pathname} ${O}`)};var q=(n={})=>{let o=n.config,r=o?.pino,{prettyPrint:b,...c}=r??{},f=b===!0&&c.transport===void 0?p.transport({target:"pino-pretty",options:{colorize:process.stdout?.isTTY===!0,translateTime:o?.timestamp?.translateTime,messageKey:c.messageKey,errorKey:c.errorKey}}):c.transport,m=p({...c,level:c.level??"info",messageKey:c.messageKey,errorKey:c.errorKey,transport:f}),L=($,R,w,g)=>{j({level:$,request:R,data:w,store:g,options:n});let y=o?.useTransportsOnly===!0,E=o?.disableInternalLogger===!0,G=o?.disableFileLogging===!0;if(!(y||G)){let K=o?.logFilePath;if(K)N({filePath:K,level:$,request:R,data:w,store:g,options:n}).catch(()=>{})}if(y||E)return;let F=P({level:$,request:R,data:w,store:g,options:n});switch($){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}}},O=($,R,w,g)=>{let y={beforeTime:process.hrtime.bigint()};L($,R,{message:w,context:g},y)};return{pino:m,log:L,handleHttpError:($,R,w)=>{t($,R,w,n)},debug:($,R,w)=>{O("DEBUG",$,R,w)},info:($,R,w)=>{O("INFO",$,R,w)},warn:($,R,w)=>{O("WARNING",$,R,w)},error:($,R,w)=>{O("ERROR",$,R,w)}}};var An=(n={})=>{let o=new WeakSet,r=q(n),b={...r,debug:(i,f,m)=>{o.add(i),r.debug(i,f,m)},info:(i,f,m)=>{o.add(i),r.info(i,f,m)},warn:(i,f,m)=>{o.add(i),r.warn(i,f,m)},error:(i,f,m)=>{o.add(i),r.error(i,f,m)}};return new Hn({name:"Logixlysia",detail:{description:"Logixlysia is a plugin for Elysia that provides a logger and pino logger.",tags:["logging","pino"]}}).state("logger",b).state("pino",b.pino).state("beforeTime",BigInt(0)).onStart(({server:i})=>{if(i)V(i,n)}).onRequest(({store:i})=>{i.beforeTime=process.hrtime.bigint()}).onAfterHandle(({request:i,set:f,store:m})=>{if(o.has(i))return;let L=typeof f.status==="number"?f.status:200,O="INFO";if(L>=500)O="ERROR";else if(L>=400)O="WARNING";b.log(O,i,{status:L},m)}).onError(({request:i,error:f,store:m})=>{b.handleHttpError(i,f,m)}).as("scoped")},jo=An;export{An as logixlysia,jo as default};
11
4
 
12
- //# debugId=62A87E578A304FBB64756E2164756E21
13
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2luZGV4LnRzIiwgInNyYy9leHRlbnNpb25zL3N0YXJ0LXNlcnZlci50cyIsICJzcmMvaGVscGVycy9zdGF0dXMudHMiLCAic3JjL2xvZ2dlci9jcmVhdGUtbG9nZ2VyLnRzIiwgInNyYy9sb2dnZXIvYnVpbGQtbG9nLW1lc3NhZ2UudHMiLCAic3JjL2hlbHBlcnMvY29sb3ItbWFwcGluZy50cyIsICJzcmMvaGVscGVycy9kdXJhdGlvbi50cyIsICJzcmMvaGVscGVycy9sb2cudHMiLCAic3JjL2hlbHBlcnMvbWV0aG9kLnRzIiwgInNyYy9oZWxwZXJzL3BhdGgudHMiLCAic3JjL2hlbHBlcnMvdGltZXN0YW1wLnRzIiwgInNyYy9vdXRwdXQvY29uc29sZS50cyIsICJzcmMvb3V0cHV0L2ZpbGUudHMiLCAic3JjL3V0aWxzL3JvdGF0aW9uLnRzIiwgInNyYy9vdXRwdXQvcm90YXRpb24tbWFuYWdlci50cyIsICJzcmMvbG9nZ2VyL2ZpbHRlci50cyIsICJzcmMvbG9nZ2VyL2hhbmRsZS1odHRwLWVycm9yLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgImltcG9ydCB7IEVseXNpYSB9IGZyb20gJ2VseXNpYSdcblxuaW1wb3J0IHsgc3RhcnRTZXJ2ZXIgfSBmcm9tICcuL2V4dGVuc2lvbnMnXG5pbXBvcnQgeyBnZXRTdGF0dXNDb2RlIH0gZnJvbSAnLi9oZWxwZXJzL3N0YXR1cydcbmltcG9ydCB0eXBlIHsgSHR0cEVycm9yLCBPcHRpb25zLCBTZXJ2ZXIsIFN0b3JlRGF0YSB9IGZyb20gJy4vaW50ZXJmYWNlcydcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyJ1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBsb2dpeGx5c2lhKG9wdGlvbnM/OiBPcHRpb25zKTogRWx5c2lhIHtcbiAgY29uc3QgbG9nID0gY3JlYXRlTG9nZ2VyKG9wdGlvbnMpXG5cbiAgcmV0dXJuIG5ldyBFbHlzaWEoe1xuICAgIG5hbWU6ICdMb2dpeGx5c2lhJ1xuICB9KVxuICAgIC5vblN0YXJ0KGN0eCA9PiB7XG4gICAgICBjb25zdCBzaG93U3RhcnR1cE1lc3NhZ2UgPSBvcHRpb25zPy5jb25maWc/LnNob3dTdGFydHVwTWVzc2FnZSA/PyB0cnVlXG4gICAgICBpZiAoc2hvd1N0YXJ0dXBNZXNzYWdlKSB7XG4gICAgICAgIHN0YXJ0U2VydmVyKGN0eC5zZXJ2ZXIgYXMgU2VydmVyLCBvcHRpb25zKVxuICAgICAgfVxuICAgIH0pXG4gICAgLm9uUmVxdWVzdChjdHggPT4ge1xuICAgICAgY29uc3Qgc3RvcmUgPSB7XG4gICAgICAgIC4uLmN0eC5zdG9yZSxcbiAgICAgICAgYmVmb3JlVGltZTogcHJvY2Vzcy5ocnRpbWUuYmlnaW50KCksXG4gICAgICAgIGxvZ2dlcjogbG9nLFxuICAgICAgICBwaW5vOiBsb2cucGlubywgLy8gRXhwb3NlIFBpbm8gbG9nZ2VyIGRpcmVjdGx5XG4gICAgICAgIGhhc0N1c3RvbUxvZzogZmFsc2VcbiAgICAgIH1cbiAgICAgIGN0eC5zdG9yZSA9IHN0b3JlXG4gICAgICBsb2cuc3RvcmUgPSBzdG9yZVxuICAgIH0pXG4gICAgLm9uQWZ0ZXJIYW5kbGUoeyBhczogJ2dsb2JhbCcgfSwgKHsgcmVxdWVzdCwgc2V0LCBzdG9yZSB9KSA9PiB7XG4gICAgICBjb25zdCBzdG9yZURhdGEgPSBzdG9yZSBhcyBTdG9yZURhdGFcblxuICAgICAgaWYgKCFzdG9yZURhdGEuaGFzQ3VzdG9tTG9nKSB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IGdldFN0YXR1c0NvZGUoc2V0LnN0YXR1cyB8fCAyMDApXG4gICAgICAgIGxvZy5sb2coXG4gICAgICAgICAgJ0lORk8nLFxuICAgICAgICAgIHJlcXVlc3QsXG4gICAgICAgICAge1xuICAgICAgICAgICAgc3RhdHVzLFxuICAgICAgICAgICAgbWVzc2FnZTogU3RyaW5nKHNldC5oZWFkZXJzPy5bJ3gtbWVzc2FnZSddIHx8ICcnKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgc3RvcmVEYXRhXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9KVxuICAgIC5vbkVycm9yKHsgYXM6ICdnbG9iYWwnIH0sIGFzeW5jICh7IHJlcXVlc3QsIGVycm9yLCBzZXQsIHN0b3JlIH0pID0+IHtcbiAgICAgIGNvbnN0IHN0YXR1cyA9IGdldFN0YXR1c0NvZGUoc2V0LnN0YXR1cyB8fCA1MDApXG4gICAgICBhd2FpdCBsb2cuaGFuZGxlSHR0cEVycm9yKFxuICAgICAgICByZXF1ZXN0LFxuICAgICAgICB7IC4uLmVycm9yLCBzdGF0dXMgfSBhcyBIdHRwRXJyb3IsXG4gICAgICAgIHN0b3JlIGFzIFN0b3JlRGF0YVxuICAgICAgKVxuICAgIH0pXG59XG5cbmV4cG9ydCB0eXBlIHtcbiAgSHR0cEVycm9yLFxuICBMb2dEYXRhLFxuICBMb2dnZXIsXG4gIExvZ2l4bHlzaWFDb250ZXh0LFxuICBMb2dMZXZlbCxcbiAgTG9nUm90YXRpb25Db25maWcsXG4gIE9wdGlvbnMsXG4gIFJlcXVlc3RJbmZvLFxuICBTdG9yZURhdGEsXG4gIFRyYW5zcG9ydFxufSBmcm9tICcuL2ludGVyZmFjZXMnXG5leHBvcnQgeyBjcmVhdGVMb2dnZXIsIGhhbmRsZUh0dHBFcnJvciB9IGZyb20gJy4vbG9nZ2VyJ1xuZXhwb3J0IHsgbG9nVG9UcmFuc3BvcnRzIH0gZnJvbSAnLi9vdXRwdXQnXG4iLAogICAgImltcG9ydCB0eXBlIHsgT3B0aW9ucywgU2VydmVyIH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcblxuY29uc3QgY3JlYXRlQm94VGV4dCA9ICh0ZXh0OiBzdHJpbmcsIHdpZHRoOiBudW1iZXIpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBwYWRkaW5nTGVuZ3RoID0gTWF0aC5tYXgoMCwgKHdpZHRoIC0gdGV4dC5sZW5ndGgpIC8gMilcbiAgY29uc3QgcGFkZGluZyA9ICcgJy5yZXBlYXQocGFkZGluZ0xlbmd0aClcbiAgcmV0dXJuIGAke3BhZGRpbmd9JHt0ZXh0fSR7cGFkZGluZ31gLnBhZEVuZCh3aWR0aClcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc3RhcnRTZXJ2ZXIoY29uZmlnOiBTZXJ2ZXIsIG9wdGlvbnM/OiBPcHRpb25zKTogdm9pZCB7XG4gIGNvbnN0IGhvc3RuYW1lID0gY29uZmlnPy5ob3N0bmFtZSA/PyAnbG9jYWxob3N0J1xuICBjb25zdCBwb3J0ID0gY29uZmlnPy5wb3J0ID8/IDMwMDBcbiAgY29uc3QgcHJvdG9jb2wgPSBjb25maWc/LnByb3RvY29sID8/ICdodHRwJ1xuICBjb25zdCBzaG93QmFubmVyID0gb3B0aW9ucz8uY29uZmlnPy5zdGFydHVwTWVzc2FnZUZvcm1hdCAhPT0gJ3NpbXBsZSdcblxuICBpZiAoc2hvd0Jhbm5lcikge1xuICAgIGNvbnN0IHRpdGxlID0gJ0VseXNpYSB3aXRoIExvZ2l4bHlzaWEnXG4gICAgY29uc3QgbWVzc2FnZSA9IGDwn6aKIEVseXNpYSBpcyBydW5uaW5nIGF0ICR7cHJvdG9jb2x9Oi8vJHtob3N0bmFtZX06JHtwb3J0fWBcbiAgICBjb25zdCBib3hXaWR0aCA9IE1hdGgubWF4KHRpdGxlLmxlbmd0aCwgbWVzc2FnZS5sZW5ndGgpICsgNFxuICAgIGNvbnN0IGJvcmRlciA9ICfilIAnLnJlcGVhdChib3hXaWR0aClcbiAgICBjb25zdCBlbXB0eUxpbmUgPSBjcmVhdGVCb3hUZXh0KCcnLCBib3hXaWR0aClcblxuICAgIGNvbnNvbGUubG9nKGBcbiAgICAgIOKUjCR7Ym9yZGVyfeKUkFxuICAgICAg4pSCJHtlbXB0eUxpbmV94pSCXG4gICAgICDilIIke2NyZWF0ZUJveFRleHQodGl0bGUsIGJveFdpZHRoKX3ilIJcbiAgICAgIOKUgiR7ZW1wdHlMaW5lfeKUglxuICAgICAg4pSCJHtjcmVhdGVCb3hUZXh0KG1lc3NhZ2UsIGJveFdpZHRoKX3ilIJcbiAgICAgIOKUgiR7ZW1wdHlMaW5lfeKUglxuICAgICAg4pSUJHtib3JkZXJ94pSYXG4gICAgYClcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmxvZyhg8J+miiBFbHlzaWEgaXMgcnVubmluZyBhdCAke3Byb3RvY29sfTovLyR7aG9zdG5hbWV9OiR7cG9ydH1gKVxuICB9XG59XG4iLAogICAgImltcG9ydCBjaGFsayBmcm9tICdjaGFsaydcbmltcG9ydCB7IFN0YXR1c01hcCB9IGZyb20gJ2VseXNpYSdcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFN0YXR1c0NvZGUoc3RhdHVzOiBzdHJpbmcgfCBudW1iZXIpOiBudW1iZXIge1xuICBpZiAodHlwZW9mIHN0YXR1cyA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gc3RhdHVzXG4gIH1cbiAgcmV0dXJuIChTdGF0dXNNYXAgYXMgUmVjb3JkPHN0cmluZywgbnVtYmVyPilbc3RhdHVzXSB8fCA1MDBcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc3RhdHVzU3RyaW5nKFxuICBzdGF0dXM6IG51bWJlcixcbiAgdXNlQ29sb3JzOiBib29sZWFuXG4pOiBzdHJpbmcge1xuICBjb25zdCBzdGF0dXNTdHIgPSBzdGF0dXMudG9TdHJpbmcoKVxuICBpZiAoIXVzZUNvbG9ycykge1xuICAgIHJldHVybiBzdGF0dXNTdHJcbiAgfVxuXG4gIGlmIChzdGF0dXMgPj0gNTAwKSB7XG4gICAgcmV0dXJuIGNoYWxrLnJlZChzdGF0dXNTdHIpXG4gIH1cbiAgaWYgKHN0YXR1cyA+PSA0MDApIHtcbiAgICByZXR1cm4gY2hhbGsueWVsbG93KHN0YXR1c1N0cilcbiAgfVxuICBpZiAoc3RhdHVzID49IDMwMCkge1xuICAgIHJldHVybiBjaGFsay5jeWFuKHN0YXR1c1N0cilcbiAgfVxuICBpZiAoc3RhdHVzID49IDIwMCkge1xuICAgIHJldHVybiBjaGFsay5ncmVlbihzdGF0dXNTdHIpXG4gIH1cbiAgcmV0dXJuIGNoYWxrLndoaXRlKHN0YXR1c1N0cilcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBMb2dnZXIgYXMgUGlub0xvZ2dlciB9IGZyb20gJ3Bpbm8nXG5pbXBvcnQgcGlubyBmcm9tICdwaW5vJ1xuaW1wb3J0IHR5cGUge1xuICBMb2dEYXRhLFxuICBMb2dnZXIsXG4gIExvZ0xldmVsLFxuICBPcHRpb25zLFxuICBQaW5vQ29uZmlnLFxuICBSZXF1ZXN0SW5mbyxcbiAgU3RvcmVEYXRhXG59IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBsb2dUb0ZpbGUsIGxvZ1RvVHJhbnNwb3J0cyB9IGZyb20gJy4uL291dHB1dCdcbmltcG9ydCB7IGJ1aWxkTG9nTWVzc2FnZSB9IGZyb20gJy4vYnVpbGQtbG9nLW1lc3NhZ2UnXG5pbXBvcnQgeyBmaWx0ZXJMb2cgfSBmcm9tICcuL2ZpbHRlcidcbmltcG9ydCB7IGhhbmRsZUh0dHBFcnJvciB9IGZyb20gJy4vaGFuZGxlLWh0dHAtZXJyb3InXG5cbmZ1bmN0aW9uIGdldE1ldHJpY3MoKTogTG9nRGF0YVsnbWV0cmljcyddIHtcbiAgY29uc3QgbWVtb3J5VXNhZ2UgPSBwcm9jZXNzLm1lbW9yeVVzYWdlKCkuaGVhcFVzZWQgLyAxMDI0IC8gMTAyNCAvLyBNQlxuICBjb25zdCBjcHVVc2FnZSA9IHByb2Nlc3MuY3B1VXNhZ2UoKVxuXG4gIHJldHVybiB7XG4gICAgbWVtb3J5VXNhZ2UsXG4gICAgY3B1VXNhZ2U6IGNwdVVzYWdlLnVzZXIgLyAxXzAwMF8wMDAgLy8gY29udmVydCB0byBzZWNvbmRzXG4gIH1cbn1cblxuZnVuY3Rpb24gYnVpbGRQaW5vQ29uZmlnKHBpbm9Db25maWc6IFBpbm9Db25maWcpIHtcbiAgcmV0dXJuIHtcbiAgICBsZXZlbDogcGlub0NvbmZpZy5sZXZlbCB8fCAnaW5mbycsXG4gICAgdGltZXN0YW1wOiBwaW5vQ29uZmlnLnRpbWVzdGFtcCA/PyB0cnVlLFxuICAgIG1lc3NhZ2VLZXk6IHBpbm9Db25maWcubWVzc2FnZUtleSB8fCAnbXNnJyxcbiAgICBlcnJvcktleTogcGlub0NvbmZpZy5lcnJvcktleSB8fCAnZXJyJyxcbiAgICBiYXNlOiBwaW5vQ29uZmlnLmJhc2UgfHwgeyBwaWQ6IHByb2Nlc3MucGlkIH1cbiAgfSBhcyBjb25zdFxufVxuXG5mdW5jdGlvbiBjcmVhdGVQcmV0dHlUcmFuc3BvcnQocHJldHR5UHJpbnQ6IGJvb2xlYW4gfCBvYmplY3QpIHtcbiAgcmV0dXJuIHBpbm8udHJhbnNwb3J0KHtcbiAgICB0YXJnZXQ6ICdwaW5vLXByZXR0eScsXG4gICAgb3B0aW9uczoge1xuICAgICAgY29sb3JpemU6IHRydWUsXG4gICAgICB0cmFuc2xhdGVUaW1lOiAnSEg6TU06c3MgWicsXG4gICAgICBpZ25vcmU6ICdwaWQsaG9zdG5hbWUnLFxuICAgICAgLi4uKHR5cGVvZiBwcmV0dHlQcmludCA9PT0gJ29iamVjdCcgPyBwcmV0dHlQcmludCA6IHt9KVxuICAgIH1cbiAgfSlcbn1cblxuZnVuY3Rpb24gY3JlYXRlUGlub0luc3RhbmNlKG9wdGlvbnM/OiBPcHRpb25zKTogUGlub0xvZ2dlciB7XG4gIGNvbnN0IHBpbm9Db25maWcgPSBvcHRpb25zPy5jb25maWc/LnBpbm8gfHwge31cbiAgY29uc3QgeyBwcmV0dHlQcmludCwgdHJhbnNwb3J0LCAuLi5yZXN0IH0gPSBwaW5vQ29uZmlnXG4gIGNvbnN0IGNvbmZpZyA9IHtcbiAgICAuLi5idWlsZFBpbm9Db25maWcocGlub0NvbmZpZyksXG4gICAgLi4ucmVzdFxuICB9XG5cbiAgaWYgKHByZXR0eVByaW50ICYmIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICByZXR1cm4gcGlubyhjb25maWcsIGNyZWF0ZVByZXR0eVRyYW5zcG9ydChwcmV0dHlQcmludCkpXG4gIH1cblxuICBpZiAodHJhbnNwb3J0KSB7XG4gICAgaWYgKHR5cGVvZiB0cmFuc3BvcnQgPT09ICdvYmplY3QnICYmICd0YXJnZXQnIGluIHRyYW5zcG9ydCkge1xuICAgICAgcmV0dXJuIHBpbm8oXG4gICAgICAgIGNvbmZpZyxcbiAgICAgICAgcGluby50cmFuc3BvcnQoXG4gICAgICAgICAgdHJhbnNwb3J0IGFzIHBpbm8uVHJhbnNwb3J0U2luZ2xlT3B0aW9ucyB8IHBpbm8uVHJhbnNwb3J0TXVsdGlPcHRpb25zXG4gICAgICAgIClcbiAgICAgIClcbiAgICB9XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ0ludmFsaWQgdHJhbnNwb3J0IGNvbmZpZ3VyYXRpb24gcHJvdmlkZWQsIGZhbGxpbmcgYmFjayB0byBkZWZhdWx0J1xuICAgIClcbiAgfVxuXG4gIHJldHVybiBwaW5vKGNvbmZpZylcbn1cblxuZnVuY3Rpb24gbWFwTG9nTGV2ZWxUb1Bpbm8obGV2ZWw6IExvZ0xldmVsKTogc3RyaW5nIHtcbiAgc3dpdGNoIChsZXZlbC50b1VwcGVyQ2FzZSgpKSB7XG4gICAgY2FzZSAnREVCVUcnOlxuICAgICAgcmV0dXJuICdkZWJ1ZydcbiAgICBjYXNlICdJTkZPJzpcbiAgICAgIHJldHVybiAnaW5mbydcbiAgICBjYXNlICdXQVJOSU5HJzpcbiAgICBjYXNlICdXQVJOJzpcbiAgICAgIHJldHVybiAnd2FybidcbiAgICBjYXNlICdFUlJPUic6XG4gICAgICByZXR1cm4gJ2Vycm9yJ1xuICAgIGRlZmF1bHQ6XG4gICAgICBjb25zb2xlLndhcm4oYFVua25vd24gbG9nIGxldmVsIFwiJHtsZXZlbH1cIiwgZGVmYXVsdGluZyB0byBcImluZm9cImApXG4gICAgICByZXR1cm4gJ2luZm8nXG4gIH1cbn1cblxuZnVuY3Rpb24gZW1pdFBpbm9Mb2coXG4gIHBpbm9Mb2dnZXI6IFBpbm9Mb2dnZXIsXG4gIGxldmVsOiBMb2dMZXZlbCxcbiAgbG9nT2JqZWN0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgbWVzc2FnZTogc3RyaW5nLFxuICBvcHRpb25zPzogT3B0aW9uc1xuKTogdm9pZCB7XG4gIGNvbnN0IHBpbm9MZXZlbCA9IG1hcExvZ0xldmVsVG9QaW5vKGxldmVsKVxuICBjb25zdCBsb2dNZXRob2QgPSBwaW5vTG9nZ2VyW3Bpbm9MZXZlbCBhcyBrZXlvZiBQaW5vTG9nZ2VyXSBhcyAoXG4gICAgLi4uYXJnczogdW5rbm93bltdXG4gICkgPT4gdm9pZFxuICBjb25zdCBoYXNDdXN0b21QaW5vT3V0cHV0ID0gQm9vbGVhbihcbiAgICBvcHRpb25zPy5jb25maWc/LnBpbm8/LnRyYW5zcG9ydCB8fCBvcHRpb25zPy5jb25maWc/LnBpbm8/LnByZXR0eVByaW50XG4gIClcbiAgY29uc3Qgc2hvdWxkRW1pdFBpbm8gPVxuICAgICFvcHRpb25zPy5jb25maWc/LnVzZVRyYW5zcG9ydHNPbmx5IHx8IGhhc0N1c3RvbVBpbm9PdXRwdXRcblxuICBpZiAoc2hvdWxkRW1pdFBpbm8gJiYgdHlwZW9mIGxvZ01ldGhvZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGxvZ01ldGhvZC5jYWxsKHBpbm9Mb2dnZXIsIGxvZ09iamVjdCwgbWVzc2FnZSlcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVPdXRwdXRzKFxuICBsZXZlbDogTG9nTGV2ZWwsXG4gIHJlcXVlc3Q6IFJlcXVlc3RJbmZvLFxuICBkYXRhOiBMb2dEYXRhLFxuICBzdG9yZTogU3RvcmVEYXRhLFxuICBvcHRpb25zPzogT3B0aW9ucyxcbiAgbG9nTWVzc2FnZT86IHN0cmluZ1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByb21pc2VzOiBQcm9taXNlPHZvaWQ+W10gPSBbXVxuXG4gIC8vIEhhbmRsZSBjb25zb2xlIGxvZ2dpbmdcbiAgaWYgKFxuICAgICEoXG4gICAgICBvcHRpb25zPy5jb25maWc/LnVzZVRyYW5zcG9ydHNPbmx5IHx8XG4gICAgICBvcHRpb25zPy5jb25maWc/LmRpc2FibGVJbnRlcm5hbExvZ2dlclxuICAgIClcbiAgKSB7XG4gICAgY29uc29sZS5sb2cobG9nTWVzc2FnZSlcbiAgfVxuXG4gIC8vIEhhbmRsZSBmaWxlIGxvZ2dpbmdcbiAgaWYgKFxuICAgICFvcHRpb25zPy5jb25maWc/LnVzZVRyYW5zcG9ydHNPbmx5ICYmXG4gICAgb3B0aW9ucz8uY29uZmlnPy5sb2dGaWxlUGF0aCAmJlxuICAgICFvcHRpb25zPy5jb25maWc/LmRpc2FibGVGaWxlTG9nZ2luZ1xuICApIHtcbiAgICBwcm9taXNlcy5wdXNoKFxuICAgICAgbG9nVG9GaWxlKFxuICAgICAgICBvcHRpb25zLmNvbmZpZy5sb2dGaWxlUGF0aCxcbiAgICAgICAgbGV2ZWwsXG4gICAgICAgIHJlcXVlc3QsXG4gICAgICAgIGRhdGEsXG4gICAgICAgIHN0b3JlLFxuICAgICAgICBvcHRpb25zXG4gICAgICApXG4gICAgKVxuICB9XG5cbiAgLy8gSGFuZGxlIHRyYW5zcG9ydCBsb2dnaW5nXG4gIGlmIChvcHRpb25zPy5jb25maWc/LnRyYW5zcG9ydHM/Lmxlbmd0aCkge1xuICAgIHByb21pc2VzLnB1c2gobG9nVG9UcmFuc3BvcnRzKGxldmVsLCByZXF1ZXN0LCBkYXRhLCBzdG9yZSwgb3B0aW9ucykpXG4gIH1cblxuICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcylcbn1cblxuYXN5bmMgZnVuY3Rpb24gbG9nKFxuICBwaW5vTG9nZ2VyOiBQaW5vTG9nZ2VyLFxuICBsZXZlbDogTG9nTGV2ZWwsXG4gIHJlcXVlc3Q6IFJlcXVlc3RJbmZvLFxuICBkYXRhOiBMb2dEYXRhLFxuICBzdG9yZTogU3RvcmVEYXRhLFxuICBvcHRpb25zPzogT3B0aW9uc1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghZmlsdGVyTG9nKGxldmVsLCBkYXRhLnN0YXR1cyB8fCAyMDAsIHJlcXVlc3QubWV0aG9kLCBvcHRpb25zKSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgaWYgKCFkYXRhLm1ldHJpY3MpIHtcbiAgICBkYXRhLm1ldHJpY3MgPSBnZXRNZXRyaWNzKClcbiAgfVxuXG4gIGlmIChsZXZlbCA9PT0gJ0VSUk9SJyAmJiAhZGF0YS5zdGFjaykge1xuICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihkYXRhLm1lc3NhZ2UgfHwgJ1Vua25vd24gZXJyb3InKVxuICAgIGRhdGEuc3RhY2sgPSBlcnIuc3RhY2tcbiAgfVxuXG4gIGNvbnN0IGVycm9yS2V5ID0gb3B0aW9ucz8uY29uZmlnPy5waW5vPy5lcnJvcktleSB8fCAnZXJyJ1xuICBjb25zdCBlcnIgPVxuICAgIGxldmVsID09PSAnRVJST1InICYmIGRhdGEuc3RhY2tcbiAgICAgID8ge1xuICAgICAgICAgIG5hbWU6ICdFcnJvcicsXG4gICAgICAgICAgbWVzc2FnZTogZGF0YS5tZXNzYWdlIHx8ICdVbmtub3duIGVycm9yJyxcbiAgICAgICAgICBzdGFjazogZGF0YS5zdGFja1xuICAgICAgICB9XG4gICAgICA6IHVuZGVmaW5lZFxuXG4gIGNvbnN0IGZvcndhcmRlZEZvciA9IHJlcXVlc3QuaGVhZGVycy5nZXQoJ3gtZm9yd2FyZGVkLWZvcicpXG4gIGNvbnN0IGNsaWVudElwID1cbiAgICBvcHRpb25zPy5jb25maWc/LmlwICYmIGZvcndhcmRlZEZvclxuICAgICAgPyBmb3J3YXJkZWRGb3Iuc3BsaXQoJywnKVswXT8udHJpbSgpXG4gICAgICA6IHVuZGVmaW5lZFxuXG4gIGNvbnN0IGxvZ09iamVjdCA9IHtcbiAgICBtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxuICAgIHVybDogcmVxdWVzdC51cmwsXG4gICAgc3RhdHVzOiBkYXRhLnN0YXR1cyxcbiAgICBtZXNzYWdlOiBkYXRhLm1lc3NhZ2UsXG4gICAgY29udGV4dDogZGF0YS5jb250ZXh0LFxuICAgIG1ldHJpY3M6IGRhdGEubWV0cmljcyxcbiAgICBkdXJhdGlvbjogTnVtYmVyKHByb2Nlc3MuaHJ0aW1lLmJpZ2ludCgpIC0gc3RvcmUuYmVmb3JlVGltZSkgLyAxXzAwMF8wMDAsXG4gICAgaXA6IGNsaWVudElwLFxuICAgIFtlcnJvcktleV06IGVyclxuICB9XG5cbiAgZW1pdFBpbm9Mb2coXG4gICAgcGlub0xvZ2dlcixcbiAgICBsZXZlbCxcbiAgICBsb2dPYmplY3QsXG4gICAgZGF0YS5tZXNzYWdlIHx8ICdSZXF1ZXN0IHByb2Nlc3NlZCcsXG4gICAgb3B0aW9uc1xuICApXG5cbiAgY29uc3QgbG9nTWVzc2FnZSA9IGJ1aWxkTG9nTWVzc2FnZShsZXZlbCwgcmVxdWVzdCwgZGF0YSwgc3RvcmUsIG9wdGlvbnMsIHRydWUpXG5cbiAgYXdhaXQgaGFuZGxlT3V0cHV0cyhsZXZlbCwgcmVxdWVzdCwgZGF0YSwgc3RvcmUsIG9wdGlvbnMsIGxvZ01lc3NhZ2UpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVMb2dnZXIob3B0aW9ucz86IE9wdGlvbnMpOiBMb2dnZXIge1xuICBjb25zdCBwaW5vTG9nZ2VyID0gY3JlYXRlUGlub0luc3RhbmNlKG9wdGlvbnMpXG5cbiAgY29uc3QgbG9nZ2VyOiBMb2dnZXIgPSB7XG4gICAgc3RvcmU6IHVuZGVmaW5lZCxcbiAgICBwaW5vOiBwaW5vTG9nZ2VyLCAvLyBFeHBvc2UgdGhlIFBpbm8gaW5zdGFuY2VcbiAgICBsb2c6IChsZXZlbCwgcmVxdWVzdCwgZGF0YSwgc3RvcmUpID0+XG4gICAgICBsb2cocGlub0xvZ2dlciwgbGV2ZWwsIHJlcXVlc3QsIGRhdGEsIHN0b3JlLCBvcHRpb25zKSxcbiAgICBoYW5kbGVIdHRwRXJyb3I6IGFzeW5jIChyZXF1ZXN0LCBlcnJvciwgc3RvcmUpID0+XG4gICAgICBhd2FpdCBoYW5kbGVIdHRwRXJyb3IocmVxdWVzdCwgZXJyb3IsIHN0b3JlLCBvcHRpb25zKSxcbiAgICBjdXN0b21Mb2dGb3JtYXQ6IG9wdGlvbnM/LmNvbmZpZz8uY3VzdG9tTG9nRm9ybWF0LFxuICAgIGluZm86IChyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0LCBzdG9yZSkgPT4ge1xuICAgICAgY29uc3Qgc3RvcmVEYXRhID0gc3RvcmUgfHxcbiAgICAgICAgbG9nZ2VyLnN0b3JlIHx8IHsgYmVmb3JlVGltZTogcHJvY2Vzcy5ocnRpbWUuYmlnaW50KCkgfVxuICAgICAgc3RvcmVEYXRhLmhhc0N1c3RvbUxvZyA9IHRydWVcbiAgICAgIHJldHVybiBsb2coXG4gICAgICAgIHBpbm9Mb2dnZXIsXG4gICAgICAgICdJTkZPJyxcbiAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgeyBtZXNzYWdlLCBjb250ZXh0LCBzdGF0dXM6IDIwMCB9LFxuICAgICAgICBzdG9yZURhdGEsXG4gICAgICAgIG9wdGlvbnNcbiAgICAgIClcbiAgICB9LFxuICAgIGVycm9yOiAocmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dCwgc3RvcmUpID0+IHtcbiAgICAgIGNvbnN0IHN0b3JlRGF0YSA9IHN0b3JlIHx8XG4gICAgICAgIGxvZ2dlci5zdG9yZSB8fCB7IGJlZm9yZVRpbWU6IHByb2Nlc3MuaHJ0aW1lLmJpZ2ludCgpIH1cbiAgICAgIHN0b3JlRGF0YS5oYXNDdXN0b21Mb2cgPSB0cnVlXG4gICAgICByZXR1cm4gbG9nKFxuICAgICAgICBwaW5vTG9nZ2VyLFxuICAgICAgICAnRVJST1InLFxuICAgICAgICByZXF1ZXN0LFxuICAgICAgICB7IG1lc3NhZ2UsIGNvbnRleHQsIHN0YXR1czogNTAwIH0sXG4gICAgICAgIHN0b3JlRGF0YSxcbiAgICAgICAgb3B0aW9uc1xuICAgICAgKVxuICAgIH0sXG4gICAgd2FybjogKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQsIHN0b3JlKSA9PiB7XG4gICAgICBjb25zdCBzdG9yZURhdGEgPSBzdG9yZSB8fFxuICAgICAgICBsb2dnZXIuc3RvcmUgfHwgeyBiZWZvcmVUaW1lOiBwcm9jZXNzLmhydGltZS5iaWdpbnQoKSB9XG4gICAgICBzdG9yZURhdGEuaGFzQ3VzdG9tTG9nID0gdHJ1ZVxuICAgICAgcmV0dXJuIGxvZyhcbiAgICAgICAgcGlub0xvZ2dlcixcbiAgICAgICAgJ1dBUk5JTkcnLFxuICAgICAgICByZXF1ZXN0LFxuICAgICAgICB7IG1lc3NhZ2UsIGNvbnRleHQsIHN0YXR1czogMjAwIH0sXG4gICAgICAgIHN0b3JlRGF0YSxcbiAgICAgICAgb3B0aW9uc1xuICAgICAgKVxuICAgIH0sXG4gICAgZGVidWc6IChyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0LCBzdG9yZSkgPT4ge1xuICAgICAgY29uc3Qgc3RvcmVEYXRhID0gc3RvcmUgfHxcbiAgICAgICAgbG9nZ2VyLnN0b3JlIHx8IHsgYmVmb3JlVGltZTogcHJvY2Vzcy5ocnRpbWUuYmlnaW50KCkgfVxuICAgICAgc3RvcmVEYXRhLmhhc0N1c3RvbUxvZyA9IHRydWVcbiAgICAgIHJldHVybiBsb2coXG4gICAgICAgIHBpbm9Mb2dnZXIsXG4gICAgICAgICdERUJVRycsXG4gICAgICAgIHJlcXVlc3QsXG4gICAgICAgIHsgbWVzc2FnZSwgY29udGV4dCwgc3RhdHVzOiAyMDAgfSxcbiAgICAgICAgc3RvcmVEYXRhLFxuICAgICAgICBvcHRpb25zXG4gICAgICApXG4gICAgfVxuICB9XG4gIHJldHVybiBsb2dnZXJcbn1cbiIsCiAgICAiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJ1xuXG5pbXBvcnQge1xuICBkdXJhdGlvblN0cmluZyxcbiAgZm9ybWF0VGltZXN0YW1wLFxuICBsb2dTdHJpbmcsXG4gIG1ldGhvZFN0cmluZyxcbiAgcGF0aFN0cmluZyxcbiAgc3RhdHVzU3RyaW5nXG59IGZyb20gJy4uL2hlbHBlcnMnXG5pbXBvcnQgdHlwZSB7XG4gIExvZ0NvbXBvbmVudHMsXG4gIExvZ0RhdGEsXG4gIExvZ0xldmVsLFxuICBPcHRpb25zLFxuICBSZXF1ZXN0SW5mbyxcbiAgU3RvcmVEYXRhXG59IGZyb20gJy4uL2ludGVyZmFjZXMnXG5cbmNvbnN0IGRlZmF1bHRMb2dGb3JtYXQgPVxuICAn8J+miiB7bm93fSB7bGV2ZWx9IHtkdXJhdGlvbn0ge21ldGhvZH0ge3BhdGhuYW1lfSB7c3RhdHVzfSB7bWVzc2FnZX0ge2NvbnRleHR9IHtpcH0nXG5cbmZ1bmN0aW9uIHNob3VsZFVzZUNvbG9ycyh1c2VDb2xvcnM6IGJvb2xlYW4sIG9wdGlvbnM/OiBPcHRpb25zKTogYm9vbGVhbiB7XG4gIGlmIChvcHRpb25zPy5jb25maWc/LnVzZUNvbG9ycyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMuY29uZmlnLnVzZUNvbG9ycyAmJiBwcm9jZXNzLmVudi5OT19DT0xPUiA9PT0gdW5kZWZpbmVkXG4gIH1cbiAgcmV0dXJuIHVzZUNvbG9ycyAmJiBwcm9jZXNzLmVudi5OT19DT0xPUiA9PT0gdW5kZWZpbmVkXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZExvZ01lc3NhZ2UoXG4gIGxldmVsOiBMb2dMZXZlbCxcbiAgcmVxdWVzdDogUmVxdWVzdEluZm8sXG4gIGRhdGE6IExvZ0RhdGEsXG4gIHN0b3JlOiBTdG9yZURhdGEsXG4gIG9wdGlvbnM/OiBPcHRpb25zLFxuICB1c2VDb2xvcnMgPSB0cnVlXG4pOiBzdHJpbmcge1xuICBjb25zdCBhY3R1YWxseVVzZUNvbG9ycyA9IHNob3VsZFVzZUNvbG9ycyh1c2VDb2xvcnMsIG9wdGlvbnMpXG4gIGNvbnN0IG5vdyA9IG5ldyBEYXRlKClcbiAgY29uc3QgY29tcG9uZW50czogTG9nQ29tcG9uZW50cyA9IHtcbiAgICBub3c6IGFjdHVhbGx5VXNlQ29sb3JzXG4gICAgICA/IGNoYWxrLmJnWWVsbG93KFxuICAgICAgICAgIGNoYWxrLmJsYWNrKGZvcm1hdFRpbWVzdGFtcChub3csIG9wdGlvbnM/LmNvbmZpZz8udGltZXN0YW1wKSlcbiAgICAgICAgKVxuICAgICAgOiBmb3JtYXRUaW1lc3RhbXAobm93LCBvcHRpb25zPy5jb25maWc/LnRpbWVzdGFtcCksXG4gICAgZXBvY2g6IE1hdGguZmxvb3Iobm93LmdldFRpbWUoKSAvIDEwMDApLnRvU3RyaW5nKCksXG4gICAgbGV2ZWw6IGxvZ1N0cmluZyhsZXZlbCwgdXNlQ29sb3JzKSxcbiAgICBkdXJhdGlvbjogZHVyYXRpb25TdHJpbmcoc3RvcmUuYmVmb3JlVGltZSwgdXNlQ29sb3JzKSxcbiAgICBtZXRob2Q6IG1ldGhvZFN0cmluZyhyZXF1ZXN0Lm1ldGhvZCwgdXNlQ29sb3JzKSxcbiAgICBwYXRobmFtZTogcGF0aFN0cmluZyhyZXF1ZXN0KSxcbiAgICBzdGF0dXM6IHN0YXR1c1N0cmluZyhkYXRhLnN0YXR1cyB8fCAyMDAsIHVzZUNvbG9ycyksXG4gICAgbWVzc2FnZTogZGF0YS5tZXNzYWdlIHx8ICcnLFxuICAgIGNvbnRleHQ6IGRhdGEuY29udGV4dFxuICAgICAgPyAoKCkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZGF0YS5jb250ZXh0KVxuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gYFtFcnJvciBzZXJpYWxpemluZyBjb250ZXh0OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfV1gXG4gICAgICAgICAgfVxuICAgICAgICB9KSgpXG4gICAgICA6ICcnLFxuICAgIGlwOlxuICAgICAgb3B0aW9ucz8uY29uZmlnPy5pcCAmJiByZXF1ZXN0LmhlYWRlcnMuZ2V0KCd4LWZvcndhcmRlZC1mb3InKVxuICAgICAgICA/IGBJUDogJHtyZXF1ZXN0LmhlYWRlcnMuZ2V0KCd4LWZvcndhcmRlZC1mb3InKX1gXG4gICAgICAgIDogJydcbiAgfVxuXG4gIGNvbnN0IGxvZ0Zvcm1hdCA9IG9wdGlvbnM/LmNvbmZpZz8uY3VzdG9tTG9nRm9ybWF0IHx8IGRlZmF1bHRMb2dGb3JtYXRcblxuICByZXR1cm4gbG9nRm9ybWF0LnJlcGxhY2UoL3soXFx3Kyl9L2csIChfLCBrZXk6IHN0cmluZykgPT4ge1xuICAgIGlmIChrZXkgaW4gY29tcG9uZW50cykge1xuICAgICAgcmV0dXJuIGNvbXBvbmVudHNba2V5IGFzIGtleW9mIExvZ0NvbXBvbmVudHNdIHx8ICcnXG4gICAgfVxuICAgIHJldHVybiAnJ1xuICB9KVxufVxuIiwKICAgICJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnXG5cbmltcG9ydCB0eXBlIHsgQ29sb3JNYXAgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuXG5leHBvcnQgY29uc3QgTG9nTGV2ZWxDb2xvck1hcDogQ29sb3JNYXAgPSB7XG4gIElORk86IGNoYWxrLmJnR3JlZW4uYmxhY2ssXG4gIFdBUk5JTkc6IGNoYWxrLmJnWWVsbG93LmJsYWNrLFxuICBFUlJPUjogY2hhbGsuYmdSZWQuYmxhY2tcbn1cblxuZXhwb3J0IGNvbnN0IEh0dHBNZXRob2RDb2xvck1hcDogQ29sb3JNYXAgPSB7XG4gIEdFVDogY2hhbGsuZ3JlZW4sXG4gIFBPU1Q6IGNoYWxrLnllbGxvdyxcbiAgUFVUOiBjaGFsay5ibHVlLFxuICBQQVRDSDogY2hhbGsubWFnZW50YUJyaWdodCxcbiAgREVMRVRFOiBjaGFsay5yZWQsXG4gIEhFQUQ6IGNoYWxrLmN5YW4sXG4gIE9QVElPTlM6IGNoYWxrLm1hZ2VudGFcbn1cbiIsCiAgICAiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJ1xuXG5jb25zdCB0aW1lVW5pdHMgPSBbXG4gIHsgdW5pdDogJ3MnLCB0aHJlc2hvbGQ6IDFlOSwgZGVjaW1hbFBsYWNlczogMiB9LFxuICB7IHVuaXQ6ICdtcycsIHRocmVzaG9sZDogMWU2LCBkZWNpbWFsUGxhY2VzOiAwIH0sXG4gIHsgdW5pdDogJ8K1cycsIHRocmVzaG9sZDogMWUzLCBkZWNpbWFsUGxhY2VzOiAwIH0sXG4gIHsgdW5pdDogJ25zJywgdGhyZXNob2xkOiAxLCBkZWNpbWFsUGxhY2VzOiAwIH1cbl1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZHVyYXRpb25TdHJpbmcoXG4gIGJlZm9yZVRpbWU6IGJpZ2ludCxcbiAgdXNlQ29sb3JzOiBib29sZWFuXG4pOiBzdHJpbmcge1xuICBjb25zdCBuYW5vc2Vjb25kcyA9IE51bWJlcihwcm9jZXNzLmhydGltZS5iaWdpbnQoKSAtIGJlZm9yZVRpbWUpXG5cbiAgZm9yIChjb25zdCB7IHVuaXQsIHRocmVzaG9sZCwgZGVjaW1hbFBsYWNlcyB9IG9mIHRpbWVVbml0cykge1xuICAgIGlmIChuYW5vc2Vjb25kcyA+PSB0aHJlc2hvbGQpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gKG5hbm9zZWNvbmRzIC8gdGhyZXNob2xkKS50b0ZpeGVkKGRlY2ltYWxQbGFjZXMpXG4gICAgICBjb25zdCB0aW1lU3RyID0gYCR7dmFsdWV9JHt1bml0fWAucGFkU3RhcnQoOCkucGFkRW5kKDE2KVxuICAgICAgcmV0dXJuIHVzZUNvbG9ycyA/IGNoYWxrLmdyYXkodGltZVN0cikgOiB0aW1lU3RyXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVzZUNvbG9yc1xuICAgID8gY2hhbGsuZ3JheSgnMG5zJy5wYWRTdGFydCg4KS5wYWRFbmQoMTYpKVxuICAgIDogJzBucycucGFkU3RhcnQoOCkucGFkRW5kKDE2KVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IExvZ0xldmVsIH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcbmltcG9ydCB7IExvZ0xldmVsQ29sb3JNYXAgfSBmcm9tICcuL2NvbG9yLW1hcHBpbmcnXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGxvZ1N0cmluZyhsZXZlbDogTG9nTGV2ZWwsIHVzZUNvbG9yczogYm9vbGVhbik6IHN0cmluZyB7XG4gIGNvbnN0IGxldmVsU3RyID0gbGV2ZWwudG9VcHBlckNhc2UoKVxuICByZXR1cm4gdXNlQ29sb3JzXG4gICAgPyBMb2dMZXZlbENvbG9yTWFwW2xldmVsU3RyXT8uKGxldmVsU3RyLnBhZEVuZCg3KSkgfHwgbGV2ZWxTdHJcbiAgICA6IGxldmVsU3RyLnBhZEVuZCg3KVxufVxuIiwKICAgICJpbXBvcnQgeyBIdHRwTWV0aG9kQ29sb3JNYXAgfSBmcm9tICcuL2NvbG9yLW1hcHBpbmcnXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1ldGhvZFN0cmluZyhcbiAgbWV0aG9kOiBzdHJpbmcsXG4gIHVzZUNvbG9yczogYm9vbGVhblxuKTogc3RyaW5nIHtcbiAgY29uc3QgY29sb3JGdW5jdGlvbiA9IEh0dHBNZXRob2RDb2xvck1hcFttZXRob2RdXG4gIHJldHVybiB1c2VDb2xvcnMgJiYgY29sb3JGdW5jdGlvblxuICAgID8gY29sb3JGdW5jdGlvbihtZXRob2QucGFkRW5kKDcpKVxuICAgIDogbWV0aG9kLnBhZEVuZCg3KVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IFJlcXVlc3RJbmZvIH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcGF0aFN0cmluZyhcbiAgcmVxdWVzdEluZm86IFJlcXVlc3RJbmZvXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIHJldHVybiBuZXcgVVJMKHJlcXVlc3RJbmZvLnVybCkucGF0aG5hbWVcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuXG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBUaW1lc3RhbXBDb25maWcgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuXG4vLyBjb25zdCBERUZBVUxUX1RJTUVTVEFNUF9GT1JNQVQgPSAneXl5eS1tbS1kZCBISDpNTTpzcydcbmNvbnN0IFNZU19USU1FID0gJ1NZUzpTVEFOREFSRCdcblxuY29uc3QgcGFkID0gKG46IG51bWJlcik6IHN0cmluZyA9PiBuLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKVxuXG5mdW5jdGlvbiBmb3JtYXRTeXN0ZW1UaW1lKGRhdGU6IERhdGUpOiBzdHJpbmcge1xuICBjb25zdCB5ZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpXG4gIGNvbnN0IG1vbnRoID0gcGFkKGRhdGUuZ2V0TW9udGgoKSArIDEpXG4gIGNvbnN0IGRheSA9IHBhZChkYXRlLmdldERhdGUoKSlcbiAgY29uc3QgaG91cnMgPSBwYWQoZGF0ZS5nZXRIb3VycygpKVxuICBjb25zdCBtaW51dGVzID0gcGFkKGRhdGUuZ2V0TWludXRlcygpKVxuICBjb25zdCBzZWNvbmRzID0gcGFkKGRhdGUuZ2V0U2Vjb25kcygpKVxuICBjb25zdCBtcyA9IGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgzLCAnMCcpXG5cbiAgcmV0dXJuIGAke3llYXJ9LSR7bW9udGh9LSR7ZGF5fSAke2hvdXJzfToke21pbnV0ZXN9OiR7c2Vjb25kc30uJHttc31gXG59XG5cbmZ1bmN0aW9uIGZvcm1hdEN1c3RvbVRpbWUoZGF0ZTogRGF0ZSwgZm9ybWF0OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCB0b2tlbnM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIH0gPSB7XG4gICAgeXl5eTogZGF0ZS5nZXRGdWxsWWVhcigpLFxuICAgIHl5OiBkYXRlLmdldEZ1bGxZZWFyKCkudG9TdHJpbmcoKS5zbGljZSgtMiksXG4gICAgbW06IHBhZChkYXRlLmdldE1vbnRoKCkgKyAxKSxcbiAgICBkZDogcGFkKGRhdGUuZ2V0RGF0ZSgpKSxcbiAgICBISDogcGFkKGRhdGUuZ2V0SG91cnMoKSksXG4gICAgTU06IHBhZChkYXRlLmdldE1pbnV0ZXMoKSksXG4gICAgc3M6IHBhZChkYXRlLmdldFNlY29uZHMoKSksXG4gICAgU1NTOiBwYWQoZGF0ZS5nZXRNaWxsaXNlY29uZHMoKSksXG4gICAgWjogLWRhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKSAvIDYwXG4gIH1cblxuICByZXR1cm4gZm9ybWF0LnJlcGxhY2UoL3l5eXl8eXl8bW18ZGR8SEh8TU18c3N8U1NTfFovZywgbWF0Y2ggPT5cbiAgICAodG9rZW5zW21hdGNoXSA/PyAnJykudG9TdHJpbmcoKVxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRUaW1lc3RhbXAoZGF0ZTogRGF0ZSwgY29uZmlnPzogVGltZXN0YW1wQ29uZmlnKTogc3RyaW5nIHtcbiAgaWYgKCFjb25maWc/LnRyYW5zbGF0ZVRpbWUpIHtcbiAgICByZXR1cm4gZGF0ZS50b0lTT1N0cmluZygpXG4gIH1cblxuICBpZiAoY29uZmlnLnRyYW5zbGF0ZVRpbWUgPT09IHRydWUgfHwgY29uZmlnLnRyYW5zbGF0ZVRpbWUgPT09IFNZU19USU1FKSB7XG4gICAgcmV0dXJuIGZvcm1hdFN5c3RlbVRpbWUoZGF0ZSlcbiAgfVxuXG4gIHJldHVybiBmb3JtYXRDdXN0b21UaW1lKGRhdGUsIGNvbmZpZy50cmFuc2xhdGVUaW1lKVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7XG4gIExvZ0RhdGEsXG4gIExvZ0xldmVsLFxuICBPcHRpb25zLFxuICBSZXF1ZXN0SW5mbyxcbiAgU3RvcmVEYXRhXG59IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBidWlsZExvZ01lc3NhZ2UgfSBmcm9tICcuLi9sb2dnZXIvYnVpbGQtbG9nLW1lc3NhZ2UnXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2dUb1RyYW5zcG9ydHMoXG4gIGxldmVsOiBMb2dMZXZlbCxcbiAgcmVxdWVzdDogUmVxdWVzdEluZm8sXG4gIGRhdGE6IExvZ0RhdGEsXG4gIHN0b3JlOiBTdG9yZURhdGEsXG4gIG9wdGlvbnM/OiBPcHRpb25zXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFvcHRpb25zPy5jb25maWc/LnRyYW5zcG9ydHMgfHwgb3B0aW9ucy5jb25maWcudHJhbnNwb3J0cy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IG1lc3NhZ2UgPSBidWlsZExvZ01lc3NhZ2UobGV2ZWwsIHJlcXVlc3QsIGRhdGEsIHN0b3JlLCBvcHRpb25zLCBmYWxzZSlcblxuICBjb25zdCBwcm9taXNlcyA9IG9wdGlvbnMuY29uZmlnLnRyYW5zcG9ydHMubWFwKHRyYW5zcG9ydCA9PlxuICAgIHRyYW5zcG9ydC5sb2cobGV2ZWwsIG1lc3NhZ2UsIHsgcmVxdWVzdCwgZGF0YSwgc3RvcmUgfSlcbiAgKVxuXG4gIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKVxufVxuIiwKICAgICJpbXBvcnQgeyBwcm9taXNlcyBhcyBmcyB9IGZyb20gJ25vZGU6ZnMnXG5pbXBvcnQgeyBkaXJuYW1lIH0gZnJvbSAnbm9kZTpwYXRoJ1xuXG5pbXBvcnQgdHlwZSB7XG4gIExvZ0RhdGEsXG4gIExvZ0xldmVsLFxuICBPcHRpb25zLFxuICBSZXF1ZXN0SW5mbyxcbiAgU3RvcmVEYXRhXG59IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBidWlsZExvZ01lc3NhZ2UgfSBmcm9tICcuLi9sb2dnZXIvYnVpbGQtbG9nLW1lc3NhZ2UnXG5pbXBvcnQgeyBwYXJzZUludGVydmFsLCBzaG91bGRSb3RhdGVCeVRpbWUgfSBmcm9tICcuLi91dGlscy9yb3RhdGlvbidcbmltcG9ydCB7IHBlcmZvcm1Sb3RhdGlvbiwgc2hvdWxkUm90YXRlIH0gZnJvbSAnLi9yb3RhdGlvbi1tYW5hZ2VyJ1xuXG5jb25zdCBkaXJDYWNoZSA9IG5ldyBTZXQ8c3RyaW5nPigpXG5cbmFzeW5jIGZ1bmN0aW9uIGVuc3VyZURpcmVjdG9yeUV4aXN0cyhmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGRpciA9IGRpcm5hbWUoZmlsZVBhdGgpXG4gIGlmICghZGlyQ2FjaGUuaGFzKGRpcikpIHtcbiAgICBhd2FpdCBmcy5ta2RpcihkaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgZGlyQ2FjaGUuYWRkKGRpcilcbiAgfVxufVxuXG4vKipcbiAqIENoZWNrIGlmIHJvdGF0aW9uIGlzIG5lZWRlZCBhbmQgcGVyZm9ybSBpdFxuICovXG5hc3luYyBmdW5jdGlvbiBjaGVja0FuZFJvdGF0ZShcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgb3B0aW9ucz86IE9wdGlvbnNcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByb3RhdGlvbkNvbmZpZyA9IG9wdGlvbnM/LmNvbmZpZz8ubG9nUm90YXRpb25cbiAgaWYgKCFyb3RhdGlvbkNvbmZpZykge1xuICAgIHJldHVyblxuICB9XG5cbiAgbGV0IG5lZWRzUm90YXRpb24gPSBmYWxzZVxuXG4gIC8vIENoZWNrIHNpemUtYmFzZWQgcm90YXRpb25cbiAgaWYgKHJvdGF0aW9uQ29uZmlnLm1heFNpemUpIHtcbiAgICBuZWVkc1JvdGF0aW9uID0gYXdhaXQgc2hvdWxkUm90YXRlKGZpbGVQYXRoLCByb3RhdGlvbkNvbmZpZylcbiAgfVxuXG4gIC8vIENoZWNrIHRpbWUtYmFzZWQgcm90YXRpb25cbiAgaWYgKCFuZWVkc1JvdGF0aW9uICYmIHJvdGF0aW9uQ29uZmlnLmludGVydmFsKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGludGVydmFsTXMgPSBwYXJzZUludGVydmFsKHJvdGF0aW9uQ29uZmlnLmludGVydmFsKVxuICAgICAgbmVlZHNSb3RhdGlvbiA9IGF3YWl0IHNob3VsZFJvdGF0ZUJ5VGltZShmaWxlUGF0aCwgaW50ZXJ2YWxNcylcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignSW52YWxpZCBpbnRlcnZhbCBmb3JtYXQgaW4gbG9nIHJvdGF0aW9uIGNvbmZpZzonLCBlcnJvcilcbiAgICB9XG4gIH1cblxuICAvLyBQZXJmb3JtIHJvdGF0aW9uIGlmIG5lZWRlZFxuICBpZiAobmVlZHNSb3RhdGlvbikge1xuICAgIGF3YWl0IHBlcmZvcm1Sb3RhdGlvbihmaWxlUGF0aCwgcm90YXRpb25Db25maWcpXG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvZ1RvRmlsZShcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgbGV2ZWw6IExvZ0xldmVsLFxuICByZXF1ZXN0OiBSZXF1ZXN0SW5mbyxcbiAgZGF0YTogTG9nRGF0YSxcbiAgc3RvcmU6IFN0b3JlRGF0YSxcbiAgb3B0aW9ucz86IE9wdGlvbnNcbik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBlbnN1cmVEaXJlY3RvcnlFeGlzdHMoZmlsZVBhdGgpXG5cbiAgLy8gQ2hlY2sgYW5kIHBlcmZvcm0gcm90YXRpb24gaWYgbmVlZGVkXG4gIGF3YWl0IGNoZWNrQW5kUm90YXRlKGZpbGVQYXRoLCBvcHRpb25zKVxuXG4gIGNvbnN0IGxvZ01lc3NhZ2UgPSBgJHtidWlsZExvZ01lc3NhZ2UobGV2ZWwsIHJlcXVlc3QsIGRhdGEsIHN0b3JlLCBvcHRpb25zLCBmYWxzZSl9XFxuYFxuICBhd2FpdCBmcy5hcHBlbmRGaWxlKGZpbGVQYXRoLCBsb2dNZXNzYWdlLCB7IGZsYWc6ICdhJyB9KVxufVxuIiwKICAgICJpbXBvcnQgeyBwcm9taXNlcyBhcyBmcyB9IGZyb20gJ25vZGU6ZnMnXG5pbXBvcnQgeyBiYXNlbmFtZSwgZGlybmFtZSwgam9pbiB9IGZyb20gJ25vZGU6cGF0aCdcblxuZXhwb3J0IGludGVyZmFjZSBQYXJzZWRSZXRlbnRpb24ge1xuICB0eXBlOiAnY291bnQnIHwgJ3RpbWUnXG4gIHZhbHVlOiBudW1iZXJcbn1cblxuLy8gUmVnZXggcGF0dGVybnMgZGVmaW5lZCBhdCB0b3AgbGV2ZWwgZm9yIHBlcmZvcm1hbmNlXG5jb25zdCBTSVpFX1BBVFRFUk4gPSAvXihcXGQrKD86XFwuXFxkKyk/KVxccyooW2ttZ10pP2I/JC9cbmNvbnN0IElOVEVSVkFMX1BBVFRFUk4gPSAvXihcXGQrKVxccyooW2hkd10pJC9cbmNvbnN0IFJFVEVOVElPTl9QQVRURVJOID0gL14oXFxkKylcXHMqZCQvXG5cbi8qKlxuICogUGFyc2Ugc2l6ZSBzdHJpbmcgdG8gYnl0ZXNcbiAqIFN1cHBvcnRzOiAnMTBtJywgJzFnJywgJzEwMGsnLCBvciByYXcgbnVtYmVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVNpemUoc2l6ZTogc3RyaW5nIHwgbnVtYmVyKTogbnVtYmVyIHtcbiAgaWYgKHR5cGVvZiBzaXplID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBzaXplXG4gIH1cblxuICBjb25zdCB1bml0czogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHtcbiAgICBrOiAxMDI0LFxuICAgIG06IDEwMjQgKiAxMDI0LFxuICAgIGc6IDEwMjQgKiAxMDI0ICogMTAyNFxuICB9XG5cbiAgY29uc3QgbWF0Y2ggPSBzaXplLnRvTG93ZXJDYXNlKCkubWF0Y2goU0laRV9QQVRURVJOKVxuICBpZiAoIW1hdGNoPy5bMV0pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc2l6ZSBmb3JtYXQ6ICR7c2l6ZX1gKVxuICB9XG5cbiAgY29uc3QgdmFsdWUgPSBOdW1iZXIucGFyc2VGbG9hdChtYXRjaFsxXSlcbiAgY29uc3QgdW5pdCA9IG1hdGNoWzJdID8/ICcnXG5cbiAgcmV0dXJuIE1hdGguZmxvb3IodmFsdWUgKiAodW5pdHNbdW5pdF0gPz8gMSkpXG59XG5cbi8qKlxuICogUGFyc2UgaW50ZXJ2YWwgc3RyaW5nIHRvIG1pbGxpc2Vjb25kc1xuICogU3VwcG9ydHM6ICcxaCcsICcxZCcsICcxdydcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlSW50ZXJ2YWwoaW50ZXJ2YWw6IHN0cmluZyk6IG51bWJlciB7XG4gIGNvbnN0IHVuaXRzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge1xuICAgIGg6IDYwICogNjAgKiAxMDAwLCAvLyBob3VyXG4gICAgZDogMjQgKiA2MCAqIDYwICogMTAwMCwgLy8gZGF5XG4gICAgdzogNyAqIDI0ICogNjAgKiA2MCAqIDEwMDAgLy8gd2Vla1xuICB9XG5cbiAgY29uc3QgbWF0Y2ggPSBpbnRlcnZhbC50b0xvd2VyQ2FzZSgpLm1hdGNoKElOVEVSVkFMX1BBVFRFUk4pXG4gIGlmICghbWF0Y2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgaW50ZXJ2YWwgZm9ybWF0OiAke2ludGVydmFsfWApXG4gIH1cblxuICBjb25zdCB2YWx1ZVN0ciA9IG1hdGNoWzFdXG4gIGNvbnN0IHVuaXQgPSBtYXRjaFsyXSBhcyBzdHJpbmdcblxuICBpZiAoIXZhbHVlU3RyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGludGVydmFsIGZvcm1hdDogJHtpbnRlcnZhbH1gKVxuICB9XG4gIGlmICghdW5pdCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBpbnRlcnZhbCBmb3JtYXQ6ICR7aW50ZXJ2YWx9YClcbiAgfVxuXG4gIGNvbnN0IHZhbHVlID0gTnVtYmVyLnBhcnNlSW50KHZhbHVlU3RyLCAxMClcbiAgcmV0dXJuIHZhbHVlICogKHVuaXRzW3VuaXRdID8/IDApXG59XG5cbi8qKlxuICogUGFyc2UgcmV0ZW50aW9uIHN0cmluZyBvciBudW1iZXJcbiAqIFJldHVybnMgb2JqZWN0IHdpdGggdHlwZSAoY291bnQgb3IgdGltZSkgYW5kIHZhbHVlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVJldGVudGlvbihyZXRlbnRpb246IHN0cmluZyB8IG51bWJlcik6IFBhcnNlZFJldGVudGlvbiB7XG4gIGlmICh0eXBlb2YgcmV0ZW50aW9uID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB7IHR5cGU6ICdjb3VudCcsIHZhbHVlOiByZXRlbnRpb24gfVxuICB9XG5cbiAgLy8gQ2hlY2sgaWYgaXQncyBhIHRpbWUtYmFzZWQgcmV0ZW50aW9uIChlLmcuLCAnN2QnLCAnMzBkJylcbiAgY29uc3QgbWF0Y2ggPSByZXRlbnRpb24udG9Mb3dlckNhc2UoKS5tYXRjaChSRVRFTlRJT05fUEFUVEVSTilcbiAgaWYgKG1hdGNoPy5bMV0pIHtcbiAgICBjb25zdCBkYXlzID0gTnVtYmVyLnBhcnNlSW50KG1hdGNoWzFdLCAxMClcbiAgICByZXR1cm4geyB0eXBlOiAndGltZScsIHZhbHVlOiBkYXlzICogMjQgKiA2MCAqIDYwICogMTAwMCB9IC8vIGNvbnZlcnQgdG8gbWlsbGlzZWNvbmRzXG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcmV0ZW50aW9uIGZvcm1hdDogJHtyZXRlbnRpb259YClcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBmaWxlIHNob3VsZCBiZSByb3RhdGVkIGJhc2VkIG9uIHNpemVcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNob3VsZFJvdGF0ZUJ5U2l6ZShcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgbWF4U2l6ZTogbnVtYmVyXG4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0cyA9IGF3YWl0IGZzLnN0YXQoZmlsZVBhdGgpXG4gICAgcmV0dXJuIHN0YXRzLnNpemUgPj0gbWF4U2l6ZVxuICB9IGNhdGNoIHtcbiAgICAvLyBGaWxlIGRvZXNuJ3QgZXhpc3Qgb3IgY2FuJ3QgYmUgYWNjZXNzZWRcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG4vKipcbiAqIEdldCB0aGUgbGFzdCByb3RhdGlvbiB0aW1lIGZvciBhIGZpbGVcbiAqIFVzZXMgZmlsZSBtb2RpZmljYXRpb24gdGltZSBhcyBhIHByb3h5XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldExhc3RSb3RhdGlvblRpbWUoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmcy5zdGF0KGZpbGVQYXRoKVxuICAgIHJldHVybiBzdGF0cy5tdGltZS5nZXRUaW1lKClcbiAgfSBjYXRjaCB7XG4gICAgLy8gRmlsZSBkb2Vzbid0IGV4aXN0LCB1c2UgY3VycmVudCB0aW1lXG4gICAgcmV0dXJuIERhdGUubm93KClcbiAgfVxufVxuXG4vLyBUcmFjayBsYXN0IHJvdGF0aW9uIHRpbWVzIGluIG1lbW9yeSB0byBhdm9pZCBleGNlc3NpdmUgZmlsZSBjaGVja3NcbmNvbnN0IHJvdGF0aW9uVGltZUNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKVxuXG4vKipcbiAqIENoZWNrIGlmIGZpbGUgc2hvdWxkIGJlIHJvdGF0ZWQgYmFzZWQgb24gdGltZSBpbnRlcnZhbFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2hvdWxkUm90YXRlQnlUaW1lKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBpbnRlcnZhbDogbnVtYmVyXG4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKVxuXG4gIC8vIENoZWNrIGNhY2hlIGZpcnN0XG4gIGNvbnN0IGNhY2hlZFRpbWUgPSByb3RhdGlvblRpbWVDYWNoZS5nZXQoZmlsZVBhdGgpXG4gIGlmIChjYWNoZWRUaW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbm93IC0gY2FjaGVkVGltZSA+PSBpbnRlcnZhbFxuICB9XG5cbiAgLy8gR2V0IGxhc3Qgcm90YXRpb24gdGltZSBmcm9tIGZpbGVcbiAgY29uc3QgbGFzdFJvdGF0aW9uID0gYXdhaXQgZ2V0TGFzdFJvdGF0aW9uVGltZShmaWxlUGF0aClcbiAgcm90YXRpb25UaW1lQ2FjaGUuc2V0KGZpbGVQYXRoLCBsYXN0Um90YXRpb24pXG5cbiAgcmV0dXJuIG5vdyAtIGxhc3RSb3RhdGlvbiA+PSBpbnRlcnZhbFxufVxuXG4vKipcbiAqIFVwZGF0ZSB0aGUgbGFzdCByb3RhdGlvbiB0aW1lIGluIGNhY2hlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVSb3RhdGlvblRpbWUoZmlsZVBhdGg6IHN0cmluZyk6IHZvaWQge1xuICByb3RhdGlvblRpbWVDYWNoZS5zZXQoZmlsZVBhdGgsIERhdGUubm93KCkpXG59XG5cbi8qKlxuICogR2V0IHJvdGF0ZWQgZmlsZXMgZm9yIGEgZ2l2ZW4gbG9nIGZpbGVcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFJvdGF0ZWRGaWxlcyhmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCBkaXIgPSBkaXJuYW1lKGZpbGVQYXRoKVxuICBjb25zdCBiYXNlTmFtZSA9IGJhc2VuYW1lKGZpbGVQYXRoKVxuXG4gIHRyeSB7XG4gICAgY29uc3QgZmlsZXMgPSBhd2FpdCBmcy5yZWFkZGlyKGRpcilcbiAgICAvLyBNYXRjaCBmaWxlcyBsaWtlOiBhcHAubG9nLjIwMjUtMTAtMTAsIGFwcC5sb2cuMjAyNS0xMC0xMC5nelxuICAgIGNvbnN0IHJvdGF0ZWRQYXR0ZXJuID0gbmV3IFJlZ0V4cChcbiAgICAgIGBeJHtiYXNlTmFtZS5yZXBsYWNlKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgJ1xcXFwkJicpfVxcXFwuXFxcXGR7NH0tXFxcXGR7Mn0tXFxcXGR7Mn0oLVxcXFxkezJ9LVxcXFxkezJ9LVxcXFxkezJ9KT8oXFxcXC5neik/JGBcbiAgICApXG4gICAgY29uc3Qgcm90YXRlZEZpbGVzID0gZmlsZXNcbiAgICAgIC5maWx0ZXIoZmlsZSA9PiByb3RhdGVkUGF0dGVybi50ZXN0KGZpbGUpKVxuICAgICAgLm1hcChmaWxlID0+IGpvaW4oZGlyLCBmaWxlKSlcblxuICAgIC8vIFNvcnQgYnkgbW9kaWZpY2F0aW9uIHRpbWUgKG5ld2VzdCBmaXJzdClcbiAgICBjb25zdCBmaWxlc1dpdGhTdGF0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgcm90YXRlZEZpbGVzLm1hcChhc3luYyBmaWxlID0+IHtcbiAgICAgICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmcy5zdGF0KGZpbGUpXG4gICAgICAgIHJldHVybiB7IGZpbGUsIG10aW1lOiBzdGF0cy5tdGltZS5nZXRUaW1lKCkgfVxuICAgICAgfSlcbiAgICApXG5cbiAgICByZXR1cm4gZmlsZXNXaXRoU3RhdHNcbiAgICAgIC5zb3J0KChhLCBiKSA9PiBiLm10aW1lIC0gYS5tdGltZSlcbiAgICAgIC5tYXAoaXRlbSA9PiBpdGVtLmZpbGUpXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBbXVxuICB9XG59XG4iLAogICAgImltcG9ydCB7IGNyZWF0ZVJlYWRTdHJlYW0sIGNyZWF0ZVdyaXRlU3RyZWFtLCBwcm9taXNlcyBhcyBmcyB9IGZyb20gJ25vZGU6ZnMnXG5pbXBvcnQgeyBwaXBlbGluZSB9IGZyb20gJ25vZGU6c3RyZWFtL3Byb21pc2VzJ1xuaW1wb3J0IHsgY3JlYXRlR3ppcCB9IGZyb20gJ25vZGU6emxpYidcblxuaW1wb3J0IHR5cGUgeyBMb2dSb3RhdGlvbkNvbmZpZyB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQge1xuICBnZXRSb3RhdGVkRmlsZXMsXG4gIHBhcnNlSW50ZXJ2YWwsXG4gIHBhcnNlUmV0ZW50aW9uLFxuICBwYXJzZVNpemUsXG4gIHVwZGF0ZVJvdGF0aW9uVGltZVxufSBmcm9tICcuLi91dGlscy9yb3RhdGlvbidcblxuLyoqXG4gKiBHZW5lcmF0ZSBhIHJvdGF0ZWQgZmlsZSBuYW1lIHdpdGggdGltZXN0YW1wXG4gKiBFeGFtcGxlOiBhcHAubG9nIC0+IGFwcC5sb2cuMjAyNS0xMC0xMC0xNC0zMC00NVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Um90YXRlZEZpbGVOYW1lKGZpbGVQYXRoOiBzdHJpbmcsIHRpbWVzdGFtcDogRGF0ZSk6IHN0cmluZyB7XG4gIGNvbnN0IHllYXIgPSB0aW1lc3RhbXAuZ2V0RnVsbFllYXIoKVxuICBjb25zdCBtb250aCA9IFN0cmluZyh0aW1lc3RhbXAuZ2V0TW9udGgoKSArIDEpLnBhZFN0YXJ0KDIsICcwJylcbiAgY29uc3QgZGF5ID0gU3RyaW5nKHRpbWVzdGFtcC5nZXREYXRlKCkpLnBhZFN0YXJ0KDIsICcwJylcbiAgY29uc3QgaG91cnMgPSBTdHJpbmcodGltZXN0YW1wLmdldEhvdXJzKCkpLnBhZFN0YXJ0KDIsICcwJylcbiAgY29uc3QgbWludXRlcyA9IFN0cmluZyh0aW1lc3RhbXAuZ2V0TWludXRlcygpKS5wYWRTdGFydCgyLCAnMCcpXG4gIGNvbnN0IHNlY29uZHMgPSBTdHJpbmcodGltZXN0YW1wLmdldFNlY29uZHMoKSkucGFkU3RhcnQoMiwgJzAnKVxuXG4gIHJldHVybiBgJHtmaWxlUGF0aH0uJHt5ZWFyfS0ke21vbnRofS0ke2RheX0tJHtob3Vyc30tJHttaW51dGVzfS0ke3NlY29uZHN9YFxufVxuXG4vKipcbiAqIFJvdGF0ZSBhIGxvZyBmaWxlIGJ5IHJlbmFtaW5nIGl0IHdpdGggYSB0aW1lc3RhbXBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJvdGF0ZUZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIHRyeSB7XG4gICAgLy8gQ2hlY2sgaWYgZmlsZSBleGlzdHMgYW5kIGhhcyBjb250ZW50XG4gICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmcy5zdGF0KGZpbGVQYXRoKVxuICAgIGlmIChzdGF0cy5zaXplID09PSAwKSB7XG4gICAgICAvLyBEb24ndCByb3RhdGUgZW1wdHkgZmlsZXNcbiAgICAgIHJldHVybiAnJ1xuICAgIH1cblxuICAgIGNvbnN0IHJvdGF0ZWRQYXRoID0gZ2V0Um90YXRlZEZpbGVOYW1lKGZpbGVQYXRoLCBuZXcgRGF0ZSgpKVxuICAgIGF3YWl0IGZzLnJlbmFtZShmaWxlUGF0aCwgcm90YXRlZFBhdGgpXG4gICAgdXBkYXRlUm90YXRpb25UaW1lKGZpbGVQYXRoKVxuXG4gICAgcmV0dXJuIHJvdGF0ZWRQYXRoXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8gRmlsZSBkb2Vzbid0IGV4aXN0IG9yIGNhbid0IGJlIHJvdGF0ZWRcbiAgICBpZiAoKGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSAhPT0gJ0VOT0VOVCcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byByb3RhdGUgbG9nIGZpbGUgJHtmaWxlUGF0aH06YCwgZXJyb3IpXG4gICAgfVxuICAgIHJldHVybiAnJ1xuICB9XG59XG5cbi8qKlxuICogQ29tcHJlc3MgYSBmaWxlIHVzaW5nIGd6aXBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvbXByZXNzRmlsZShmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgY29tcHJlc3NlZFBhdGggPSBgJHtmaWxlUGF0aH0uZ3pgXG4gICAgY29uc3Qgc291cmNlID0gY3JlYXRlUmVhZFN0cmVhbShmaWxlUGF0aClcbiAgICBjb25zdCBkZXN0aW5hdGlvbiA9IGNyZWF0ZVdyaXRlU3RyZWFtKGNvbXByZXNzZWRQYXRoKVxuICAgIGNvbnN0IGd6aXAgPSBjcmVhdGVHemlwKClcblxuICAgIGF3YWl0IHBpcGVsaW5lKHNvdXJjZSwgZ3ppcCwgZGVzdGluYXRpb24pXG5cbiAgICAvLyBEZWxldGUgdGhlIG9yaWdpbmFsIGZpbGUgYWZ0ZXIgc3VjY2Vzc2Z1bCBjb21wcmVzc2lvblxuICAgIGF3YWl0IGZzLnVubGluayhmaWxlUGF0aClcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gY29tcHJlc3MgZmlsZSAke2ZpbGVQYXRofTpgLCBlcnJvcilcbiAgfVxufVxuXG4vKipcbiAqIENsZWFuIG9sZCByb3RhdGVkIGZpbGVzIGJhc2VkIG9uIHJldGVudGlvbiBwb2xpY3lcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNsZWFuT2xkRmlsZXMoXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIGNvbmZpZzogTG9nUm90YXRpb25Db25maWdcbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIWNvbmZpZy5tYXhGaWxlcykge1xuICAgIHJldHVyblxuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByb3RhdGVkRmlsZXMgPSBhd2FpdCBnZXRSb3RhdGVkRmlsZXMoZmlsZVBhdGgpXG4gICAgaWYgKHJvdGF0ZWRGaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHJldGVudGlvbiA9IHBhcnNlUmV0ZW50aW9uKGNvbmZpZy5tYXhGaWxlcylcblxuICAgIGlmIChyZXRlbnRpb24udHlwZSA9PT0gJ2NvdW50Jykge1xuICAgICAgLy8gS2VlcCBvbmx5IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGZpbGVzXG4gICAgICBjb25zdCBmaWxlc1RvRGVsZXRlID0gcm90YXRlZEZpbGVzLnNsaWNlKHJldGVudGlvbi52YWx1ZSlcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKGZpbGVzVG9EZWxldGUubWFwKGZpbGUgPT4gZnMudW5saW5rKGZpbGUpKSlcbiAgICB9IGVsc2UgaWYgKHJldGVudGlvbi50eXBlID09PSAndGltZScpIHtcbiAgICAgIC8vIERlbGV0ZSBmaWxlcyBvbGRlciB0aGFuIHRoZSBzcGVjaWZpZWQgdGltZVxuICAgICAgY29uc3QgY3V0b2ZmVGltZSA9IERhdGUubm93KCkgLSByZXRlbnRpb24udmFsdWVcbiAgICAgIGNvbnN0IGZpbGVzVG9EZWxldGUgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgcm90YXRlZEZpbGVzLm1hcChhc3luYyBmaWxlID0+IHtcbiAgICAgICAgICBjb25zdCBzdGF0cyA9IGF3YWl0IGZzLnN0YXQoZmlsZSlcbiAgICAgICAgICByZXR1cm4gc3RhdHMubXRpbWUuZ2V0VGltZSgpIDwgY3V0b2ZmVGltZSA/IGZpbGUgOiBudWxsXG4gICAgICAgIH0pXG4gICAgICApXG5cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBmaWxlc1RvRGVsZXRlXG4gICAgICAgICAgLmZpbHRlcigoZmlsZSk6IGZpbGUgaXMgc3RyaW5nID0+IGZpbGUgIT09IG51bGwpXG4gICAgICAgICAgLm1hcChmaWxlID0+IGZzLnVubGluayhmaWxlKSlcbiAgICAgIClcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGNsZWFuIG9sZCBsb2cgZmlsZXMgZm9yICR7ZmlsZVBhdGh9OmAsIGVycm9yKVxuICB9XG59XG5cbi8qKlxuICogUGVyZm9ybSBjb21wbGV0ZSByb3RhdGlvbjogcm90YXRlLCBjb21wcmVzcyAoaWYgZW5hYmxlZCksIGFuZCBjbGVhbiBvbGQgZmlsZXNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBlcmZvcm1Sb3RhdGlvbihcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgY29uZmlnOiBMb2dSb3RhdGlvbkNvbmZpZ1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgLy8gUm90YXRlIHRoZSBmaWxlXG4gICAgY29uc3Qgcm90YXRlZFBhdGggPSBhd2FpdCByb3RhdGVGaWxlKGZpbGVQYXRoKVxuXG4gICAgaWYgKCFyb3RhdGVkUGF0aCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gQ29tcHJlc3MgaWYgZW5hYmxlZCAoZGVmYXVsdHMgdG8gZ3ppcClcbiAgICBpZiAoY29uZmlnLmNvbXByZXNzKSB7XG4gICAgICBhd2FpdCBjb21wcmVzc0ZpbGUocm90YXRlZFBhdGgpXG4gICAgfVxuXG4gICAgLy8gQ2xlYW4gb2xkIGZpbGVzXG4gICAgYXdhaXQgY2xlYW5PbGRGaWxlcyhmaWxlUGF0aCwgY29uZmlnKVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBwZXJmb3JtIHJvdGF0aW9uIGZvciAke2ZpbGVQYXRofTpgLCBlcnJvcilcbiAgfVxufVxuXG4vKipcbiAqIENoZWNrIGlmIHJvdGF0aW9uIGlzIG5lZWRlZCBiYXNlZCBvbiBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzaG91bGRSb3RhdGUoXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIGNvbmZpZzogTG9nUm90YXRpb25Db25maWdcbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICB0cnkge1xuICAgIC8vIENoZWNrIGZpbGUgZXhpc3RlbmNlXG4gICAgYXdhaXQgZnMuYWNjZXNzKGZpbGVQYXRoKVxuICB9IGNhdGNoIHtcbiAgICAvLyBGaWxlIGRvZXNuJ3QgZXhpc3QsIG5vIHJvdGF0aW9uIG5lZWRlZFxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLy8gQ2hlY2sgc2l6ZS1iYXNlZCByb3RhdGlvblxuICBpZiAoY29uZmlnLm1heFNpemUpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgbWF4U2l6ZUJ5dGVzID0gcGFyc2VTaXplKGNvbmZpZy5tYXhTaXplKVxuICAgICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmcy5zdGF0KGZpbGVQYXRoKVxuICAgICAgaWYgKHN0YXRzLnNpemUgPj0gbWF4U2l6ZUJ5dGVzKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBjaGVjayBmaWxlIHNpemUgZm9yICR7ZmlsZVBhdGh9OmAsIGVycm9yKVxuICAgIH1cbiAgfVxuXG4gIC8vIENoZWNrIHRpbWUtYmFzZWQgcm90YXRpb25cbiAgaWYgKGNvbmZpZy5pbnRlcnZhbCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBpbnRlcnZhbE1zID0gcGFyc2VJbnRlcnZhbChjb25maWcuaW50ZXJ2YWwpXG4gICAgICBjb25zdCBzdGF0cyA9IGF3YWl0IGZzLnN0YXQoZmlsZVBhdGgpXG4gICAgICBjb25zdCBhZ2UgPSBEYXRlLm5vdygpIC0gc3RhdHMubXRpbWVNc1xuICAgICAgaWYgKGFnZSA+PSBpbnRlcnZhbE1zKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIExvZyBwYXJzZSBvciBzdGF0IGVycm9ycyBhbmQgdHJlYXQgYXMgbm8tb3BcbiAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBjaGVjayBmaWxlIGFnZSBmb3IgJHtmaWxlUGF0aH06YCwgZXJyb3IpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlXG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgTG9nTGV2ZWwsIE9wdGlvbnMgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuXG5jb25zdCBjaGVja0ZpbHRlciA9IChmaWx0ZXJWYWx1ZTogdW5rbm93biwgdmFsdWU6IHVua25vd24pID0+XG4gIEFycmF5LmlzQXJyYXkoZmlsdGVyVmFsdWUpXG4gICAgPyBmaWx0ZXJWYWx1ZS5pbmNsdWRlcyh2YWx1ZSlcbiAgICA6IGZpbHRlclZhbHVlID09PSB2YWx1ZVxuXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyTG9nKFxuICBsb2dMZXZlbDogTG9nTGV2ZWwsXG4gIHN0YXR1czogbnVtYmVyLFxuICBtZXRob2Q6IHN0cmluZyxcbiAgb3B0aW9ucz86IE9wdGlvbnNcbik6IGJvb2xlYW4ge1xuICBjb25zdCBmaWx0ZXIgPSBvcHRpb25zPy5jb25maWc/LmxvZ0ZpbHRlclxuICBpZiAoIWZpbHRlcikge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICByZXR1cm4gKFxuICAgICghZmlsdGVyLmxldmVsIHx8IGNoZWNrRmlsdGVyKGZpbHRlci5sZXZlbCwgbG9nTGV2ZWwpKSAmJlxuICAgICghZmlsdGVyLnN0YXR1cyB8fCBjaGVja0ZpbHRlcihmaWx0ZXIuc3RhdHVzLCBzdGF0dXMpKSAmJlxuICAgICghZmlsdGVyLm1ldGhvZCB8fCBjaGVja0ZpbHRlcihmaWx0ZXIubWV0aG9kLCBtZXRob2QpKVxuICApXG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgSHR0cEVycm9yLCBPcHRpb25zLCBSZXF1ZXN0SW5mbywgU3RvcmVEYXRhIH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcbmltcG9ydCB7IGxvZ1RvRmlsZSwgbG9nVG9UcmFuc3BvcnRzIH0gZnJvbSAnLi4vb3V0cHV0J1xuaW1wb3J0IHsgYnVpbGRMb2dNZXNzYWdlIH0gZnJvbSAnLi9idWlsZC1sb2ctbWVzc2FnZSdcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhhbmRsZUh0dHBFcnJvcihcbiAgcmVxdWVzdDogUmVxdWVzdEluZm8sXG4gIGVycm9yOiBIdHRwRXJyb3IsXG4gIHN0b3JlOiBTdG9yZURhdGEsXG4gIG9wdGlvbnM/OiBPcHRpb25zXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgc3RhdHVzQ29kZSA9IGVycm9yLnN0YXR1cyB8fCA1MDBcbiAgY29uc3QgbG9nRGF0YSA9IHtcbiAgICBzdGF0dXM6IHN0YXR1c0NvZGUsXG4gICAgbWVzc2FnZTogZXJyb3IubWVzc2FnZSxcbiAgICBzdGFjazogZXJyb3Iuc3RhY2tcbiAgfVxuXG4gIGNvbnN0IHByb21pc2VzOiBQcm9taXNlPHZvaWQ+W10gPSBbXVxuXG4gIC8vIEhhbmRsZSBjb25zb2xlIGxvZ2dpbmdcbiAgaWYgKFxuICAgICEoXG4gICAgICBvcHRpb25zPy5jb25maWc/LnVzZVRyYW5zcG9ydHNPbmx5IHx8XG4gICAgICBvcHRpb25zPy5jb25maWc/LmRpc2FibGVJbnRlcm5hbExvZ2dlclxuICAgIClcbiAgKSB7XG4gICAgY29uc29sZS5lcnJvcihidWlsZExvZ01lc3NhZ2UoJ0VSUk9SJywgcmVxdWVzdCwgbG9nRGF0YSwgc3RvcmUsIG9wdGlvbnMpKVxuICB9XG5cbiAgLy8gSGFuZGxlIGZpbGUgbG9nZ2luZ1xuICBpZiAoXG4gICAgIW9wdGlvbnM/LmNvbmZpZz8udXNlVHJhbnNwb3J0c09ubHkgJiZcbiAgICBvcHRpb25zPy5jb25maWc/LmxvZ0ZpbGVQYXRoICYmXG4gICAgIW9wdGlvbnM/LmNvbmZpZz8uZGlzYWJsZUZpbGVMb2dnaW5nXG4gICkge1xuICAgIHByb21pc2VzLnB1c2goXG4gICAgICBsb2dUb0ZpbGUoXG4gICAgICAgIG9wdGlvbnMuY29uZmlnLmxvZ0ZpbGVQYXRoLFxuICAgICAgICAnRVJST1InLFxuICAgICAgICByZXF1ZXN0LFxuICAgICAgICBsb2dEYXRhLFxuICAgICAgICBzdG9yZSxcbiAgICAgICAgb3B0aW9uc1xuICAgICAgKVxuICAgIClcbiAgfVxuXG4gIC8vIEhhbmRsZSB0cmFuc3BvcnQgbG9nZ2luZ1xuICBpZiAob3B0aW9ucz8uY29uZmlnPy50cmFuc3BvcnRzPy5sZW5ndGgpIHtcbiAgICBwcm9taXNlcy5wdXNoKGxvZ1RvVHJhbnNwb3J0cygnRVJST1InLCByZXF1ZXN0LCBsb2dEYXRhLCBzdG9yZSwgb3B0aW9ucykpXG4gIH1cblxuICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcylcbn1cbiIKICBdLAogICJtYXBwaW5ncyI6ICJBQUFBLGlCQUFTLGdCQ0VULElBQU0sRUFBZ0IsQ0FBQyxFQUFjLElBQTBCLENBQzdELElBQU0sRUFBZ0IsS0FBSyxJQUFJLEdBQUksRUFBUSxFQUFLLFFBQVUsQ0FBQyxFQUNyRCxFQUFVLElBQUksT0FBTyxDQUFhLEVBQ3hDLE1BQU8sR0FBRyxJQUFVLElBQU8sSUFBVSxPQUFPLENBQUssR0FHbkQsU0FBd0IsQ0FBVyxDQUFDLEVBQWdCLEVBQXlCLENBQzNFLElBQU0sRUFBVyxHQUFRLFVBQVksWUFDL0IsRUFBTyxHQUFRLE1BQVEsS0FDdkIsRUFBVyxHQUFRLFVBQVksT0FHckMsR0FGbUIsR0FBUyxRQUFRLHVCQUF5QixTQUU3QyxDQUVkLElBQU0sRUFBVSxxQ0FBMEIsT0FBYyxLQUFZLElBQzlELEVBQVcsS0FBSyxJQUFJLEdBQWMsRUFBUSxNQUFNLEVBQUksRUFDcEQsRUFBUyxJQUFHLE9BQU8sQ0FBUSxFQUMzQixFQUFZLEVBQWMsR0FBSSxDQUFRLEVBRTVDLFFB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QUFhLENBQU8sRUFFaEMsT0FBTyxJQUFJLEdBQU8sQ0FDaEIsS0FBTSxZQUNSLENBQUMsRUFDRSxRQUFRLEtBQU8sQ0FFZCxHQUQyQixHQUFTLFFBQVEsb0JBQXNCLEdBRWhFLEVBQVksRUFBSSxPQUFrQixDQUFPLEVBRTVDLEVBQ0EsVUFBVSxLQUFPLENBQ2hCLElBQU0sRUFBUSxJQUNULEVBQUksTUFDUCxXQUFZLFFBQVEsT0FBTyxPQUFPLEVBQ2xDLE9BQVEsRUFDUixLQUFNLEVBQUksS0FDVixhQUFjLEVBQ2hCLEVBQ0EsRUFBSSxNQUFRLEVBQ1osRUFBSSxNQUFRLEVBQ2IsRUFDQSxjQUFjLENBQUUsR0FBSSxRQUFTLEVBQUcsRUFBRyxVQUFTLE1BQUssV0FBWSxDQUM1RCxJQUFNLEVBQVksRUFFbEIsR0FBSSxDQUFDLEVBQVUsYUFBYyxDQUMzQixJQUFNLEVBQVMsRUFBYyxFQUFJLFFBQVUsR0FBRyxFQUM5QyxFQUFJLElBQ0YsT0FDQSxFQUNBLENBQ0UsU0FDQSxRQUFTLE9BQU8sRUFBSSxVQUFVLGNBQWdCLEVBQUUsQ0FDbEQsRUFDQSxDQUNGLEdBRUgsRUFDQSxRQUFRLENBQUUsR0FBSSxRQUFTLEVBQUcsT0FBUyxVQUFTLFFBQU8sTUFBSyxXQUFZLENBQ25FLElBQU0sRUFBUyxFQUFjLEVBQUksUUFBVSxHQUFHLEVBQzlDLE1BQU0sRUFBSSxnQkFDUixFQUNBLElBQUssRUFBTyxRQUFPLEVBQ25CLENBQ0YsRUFDRCIsCiAgImRlYnVnSWQiOiAiNjJBODdFNTc4QTMwNEZCQjY0NzU2RTIxNjQ3NTZFMjEiLAogICJuYW1lcyI6IFtdCn0=
5
+ //# debugId=7FAFEF1E34BEF02764756E2164756E21
6
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2luZGV4LnRzIiwgInNyYy9leHRlbnNpb25zL2Jhbm5lci50cyIsICJzcmMvZXh0ZW5zaW9ucy9pbmRleC50cyIsICJzcmMvbG9nZ2VyL2luZGV4LnRzIiwgInNyYy9vdXRwdXQvaW5kZXgudHMiLCAic3JjL291dHB1dC9maWxlLnRzIiwgInNyYy9vdXRwdXQvZnMudHMiLCAic3JjL291dHB1dC9yb3RhdGlvbi1tYW5hZ2VyLnRzIiwgInNyYy91dGlscy9yb3RhdGlvbi50cyIsICJzcmMvbG9nZ2VyL2NyZWF0ZS1sb2dnZXIudHMiLCAic3JjL2hlbHBlcnMvc3RhdHVzLnRzIiwgInNyYy91dGlscy9lcnJvci50cyIsICJzcmMvbG9nZ2VyL2hhbmRsZS1odHRwLWVycm9yLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgImltcG9ydCB7IEVseXNpYSwgdHlwZSBTaW5nbGV0b25CYXNlIH0gZnJvbSAnZWx5c2lhJ1xuaW1wb3J0IHsgc3RhcnRTZXJ2ZXIgfSBmcm9tICcuL2V4dGVuc2lvbnMnXG5pbXBvcnQgdHlwZSB7IExvZ2l4bHlzaWFTdG9yZSwgT3B0aW9ucyB9IGZyb20gJy4vaW50ZXJmYWNlcydcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyJ1xuXG5leHBvcnQgdHlwZSBMb2dpeGx5c2lhID0gRWx5c2lhPFxuICAnTG9naXhseXNpYScsXG4gIFNpbmdsZXRvbkJhc2UgJiB7IHN0b3JlOiBMb2dpeGx5c2lhU3RvcmUgfVxuPlxuXG5leHBvcnQgY29uc3QgbG9naXhseXNpYSA9IChvcHRpb25zOiBPcHRpb25zID0ge30pOiBMb2dpeGx5c2lhID0+IHtcbiAgY29uc3QgZGlkQ3VzdG9tTG9nID0gbmV3IFdlYWtTZXQ8UmVxdWVzdD4oKVxuICBjb25zdCBiYXNlTG9nZ2VyID0gY3JlYXRlTG9nZ2VyKG9wdGlvbnMpXG4gIGNvbnN0IGxvZ2dlciA9IHtcbiAgICAuLi5iYXNlTG9nZ2VyLFxuICAgIGRlYnVnOiAoXG4gICAgICByZXF1ZXN0OiBSZXF1ZXN0LFxuICAgICAgbWVzc2FnZTogc3RyaW5nLFxuICAgICAgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgKSA9PiB7XG4gICAgICBkaWRDdXN0b21Mb2cuYWRkKHJlcXVlc3QpXG4gICAgICBiYXNlTG9nZ2VyLmRlYnVnKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXG4gICAgfSxcbiAgICBpbmZvOiAoXG4gICAgICByZXF1ZXN0OiBSZXF1ZXN0LFxuICAgICAgbWVzc2FnZTogc3RyaW5nLFxuICAgICAgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgKSA9PiB7XG4gICAgICBkaWRDdXN0b21Mb2cuYWRkKHJlcXVlc3QpXG4gICAgICBiYXNlTG9nZ2VyLmluZm8ocmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dClcbiAgICB9LFxuICAgIHdhcm46IChcbiAgICAgIHJlcXVlc3Q6IFJlcXVlc3QsXG4gICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICBjb250ZXh0PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICApID0+IHtcbiAgICAgIGRpZEN1c3RvbUxvZy5hZGQocmVxdWVzdClcbiAgICAgIGJhc2VMb2dnZXIud2FybihyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KVxuICAgIH0sXG4gICAgZXJyb3I6IChcbiAgICAgIHJlcXVlc3Q6IFJlcXVlc3QsXG4gICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICBjb250ZXh0PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICApID0+IHtcbiAgICAgIGRpZEN1c3RvbUxvZy5hZGQocmVxdWVzdClcbiAgICAgIGJhc2VMb2dnZXIuZXJyb3IocmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dClcbiAgICB9XG4gIH1cblxuICBjb25zdCBhcHAgPSBuZXcgRWx5c2lhKHtcbiAgICBuYW1lOiAnTG9naXhseXNpYScsXG4gICAgZGV0YWlsOiB7XG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgJ0xvZ2l4bHlzaWEgaXMgYSBwbHVnaW4gZm9yIEVseXNpYSB0aGF0IHByb3ZpZGVzIGEgbG9nZ2VyIGFuZCBwaW5vIGxvZ2dlci4nLFxuICAgICAgdGFnczogWydsb2dnaW5nJywgJ3Bpbm8nXVxuICAgIH1cbiAgfSlcblxuICByZXR1cm4gKFxuICAgIGFwcFxuICAgICAgLnN0YXRlKCdsb2dnZXInLCBsb2dnZXIpXG4gICAgICAuc3RhdGUoJ3Bpbm8nLCBsb2dnZXIucGlubylcbiAgICAgIC5zdGF0ZSgnYmVmb3JlVGltZScsIEJpZ0ludCgwKSlcbiAgICAgIC5vblN0YXJ0KCh7IHNlcnZlciB9KSA9PiB7XG4gICAgICAgIGlmIChzZXJ2ZXIpIHtcbiAgICAgICAgICBzdGFydFNlcnZlcihzZXJ2ZXIsIG9wdGlvbnMpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAub25SZXF1ZXN0KCh7IHN0b3JlIH0pID0+IHtcbiAgICAgICAgc3RvcmUuYmVmb3JlVGltZSA9IHByb2Nlc3MuaHJ0aW1lLmJpZ2ludCgpXG4gICAgICB9KVxuICAgICAgLm9uQWZ0ZXJIYW5kbGUoKHsgcmVxdWVzdCwgc2V0LCBzdG9yZSB9KSA9PiB7XG4gICAgICAgIGlmIChkaWRDdXN0b21Mb2cuaGFzKHJlcXVlc3QpKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdGF0dXMgPSB0eXBlb2Ygc2V0LnN0YXR1cyA9PT0gJ251bWJlcicgPyBzZXQuc3RhdHVzIDogMjAwXG4gICAgICAgIGxldCBsZXZlbDogJ0lORk8nIHwgJ1dBUk5JTkcnIHwgJ0VSUk9SJyA9ICdJTkZPJ1xuICAgICAgICBpZiAoc3RhdHVzID49IDUwMCkge1xuICAgICAgICAgIGxldmVsID0gJ0VSUk9SJ1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA+PSA0MDApIHtcbiAgICAgICAgICBsZXZlbCA9ICdXQVJOSU5HJ1xuICAgICAgICB9XG5cbiAgICAgICAgbG9nZ2VyLmxvZyhsZXZlbCwgcmVxdWVzdCwgeyBzdGF0dXMgfSwgc3RvcmUpXG4gICAgICB9KVxuICAgICAgLm9uRXJyb3IoKHsgcmVxdWVzdCwgZXJyb3IsIHN0b3JlIH0pID0+IHtcbiAgICAgICAgbG9nZ2VyLmhhbmRsZUh0dHBFcnJvcihyZXF1ZXN0LCBlcnJvciwgc3RvcmUpXG4gICAgICB9KVxuICAgICAgLy8gRW5zdXJlIHBsdWdpbiBsaWZlY3ljbGUgaG9va3MgKG9uUmVxdWVzdC9vbkFmdGVySGFuZGxlL29uRXJyb3IpIGFwcGx5IHRvIHRoZSBwYXJlbnQgYXBwLlxuICAgICAgLmFzKCdzY29wZWQnKSBhcyB1bmtub3duIGFzIExvZ2l4bHlzaWFcbiAgKVxufVxuXG5leHBvcnQgdHlwZSB7XG4gIExvZ2dlcixcbiAgTG9naXhseXNpYUNvbnRleHQsXG4gIExvZ2l4bHlzaWFTdG9yZSxcbiAgTG9nTGV2ZWwsXG4gIE9wdGlvbnMsXG4gIFBpbm8sXG4gIFN0b3JlRGF0YSxcbiAgVHJhbnNwb3J0XG59IGZyb20gJy4vaW50ZXJmYWNlcydcblxuZXhwb3J0IGRlZmF1bHQgbG9naXhseXNpYVxuIiwKICAgICJpbXBvcnQgZWx5c2lhUGtnIGZyb20gJ2VseXNpYS9wYWNrYWdlLmpzb24nXG5cbmNvbnN0IGNlbnRlclRleHQgPSAodGV4dDogc3RyaW5nLCB3aWR0aDogbnVtYmVyKTogc3RyaW5nID0+IHtcbiAgaWYgKHRleHQubGVuZ3RoID49IHdpZHRoKSB7XG4gICAgcmV0dXJuIHRleHQuc2xpY2UoMCwgd2lkdGgpXG4gIH1cblxuICBjb25zdCBsZWZ0ID0gTWF0aC5mbG9vcigod2lkdGggLSB0ZXh0Lmxlbmd0aCkgLyAyKVxuICBjb25zdCByaWdodCA9IHdpZHRoIC0gdGV4dC5sZW5ndGggLSBsZWZ0XG4gIHJldHVybiBgJHsnICcucmVwZWF0KGxlZnQpfSR7dGV4dH0keycgJy5yZXBlYXQocmlnaHQpfWBcbn1cblxuZXhwb3J0IGNvbnN0IHJlbmRlckJhbm5lciA9IChtZXNzYWdlOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBjb25zdCB2ZXJzaW9uTGluZSA9IGBFbHlzaWEgdiR7ZWx5c2lhUGtnLnZlcnNpb259YFxuICBjb25zdCBjb250ZW50V2lkdGggPSBNYXRoLm1heChtZXNzYWdlLmxlbmd0aCwgdmVyc2lvbkxpbmUubGVuZ3RoKVxuICBjb25zdCBpbm5lcldpZHRoID0gY29udGVudFdpZHRoICsgNCAvLyAyIHNwYWNlcyBwYWRkaW5nIG9uIGJvdGggc2lkZXNcblxuICBjb25zdCB0b3AgPSBg4pSMJHsn4pSAJy5yZXBlYXQoaW5uZXJXaWR0aCl94pSQYFxuICBjb25zdCBib3QgPSBg4pSUJHsn4pSAJy5yZXBlYXQoaW5uZXJXaWR0aCl94pSYYFxuICBjb25zdCBlbXB0eSA9IGDilIIkeycgJy5yZXBlYXQoaW5uZXJXaWR0aCl94pSCYFxuXG4gIGNvbnN0IHZlcnNpb25Sb3cgPSBg4pSCJHtjZW50ZXJUZXh0KHZlcnNpb25MaW5lLCBpbm5lcldpZHRoKX3ilIJgXG4gIGNvbnN0IG1lc3NhZ2VSb3cgPSBg4pSCICAke21lc3NhZ2V9JHsnICcucmVwZWF0KE1hdGgubWF4KDAsIGlubmVyV2lkdGggLSBtZXNzYWdlLmxlbmd0aCAtIDQpKX0gIOKUgmBcblxuICByZXR1cm4gW3RvcCwgZW1wdHksIHZlcnNpb25Sb3csIGVtcHR5LCBtZXNzYWdlUm93LCBlbXB0eSwgYm90XS5qb2luKCdcXG4nKVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IE9wdGlvbnMgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgcmVuZGVyQmFubmVyIH0gZnJvbSAnLi9iYW5uZXInXG5cbmV4cG9ydCBjb25zdCBzdGFydFNlcnZlciA9IChcbiAgc2VydmVyOiB7IHBvcnQ/OiBudW1iZXI7IGhvc3RuYW1lPzogc3RyaW5nOyBwcm90b2NvbD86IHN0cmluZyB8IG51bGwgfSxcbiAgb3B0aW9uczogT3B0aW9uc1xuKTogdm9pZCA9PiB7XG4gIGNvbnN0IHNob3dTdGFydHVwTWVzc2FnZSA9IG9wdGlvbnMuY29uZmlnPy5zaG93U3RhcnR1cE1lc3NhZ2UgPz8gdHJ1ZVxuICBpZiAoIXNob3dTdGFydHVwTWVzc2FnZSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgeyBwb3J0LCBob3N0bmFtZSwgcHJvdG9jb2wgfSA9IHNlcnZlclxuICBpZiAocG9ydCA9PT0gdW5kZWZpbmVkIHx8ICFob3N0bmFtZSB8fCAhcHJvdG9jb2wpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHVybCA9IGAke3Byb3RvY29sfTovLyR7aG9zdG5hbWV9OiR7cG9ydH1gXG4gIGNvbnN0IG1lc3NhZ2UgPSBg8J+miiBFbHlzaWEgaXMgcnVubmluZyBhdCAke3VybH1gXG5cbiAgY29uc3QgZm9ybWF0ID0gb3B0aW9ucy5jb25maWc/LnN0YXJ0dXBNZXNzYWdlRm9ybWF0ID8/ICdiYW5uZXInXG4gIGlmIChmb3JtYXQgPT09ICdzaW1wbGUnKSB7XG4gICAgY29uc29sZS5sb2cobWVzc2FnZSlcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnNvbGUubG9nKHJlbmRlckJhbm5lcihtZXNzYWdlKSlcbn1cbiIsCiAgICAiaW1wb3J0IHBpbm8gZnJvbSAncGlubydcbmltcG9ydCB0eXBlIHtcbiAgTG9nZ2VyLFxuICBMb2dMZXZlbCxcbiAgT3B0aW9ucyxcbiAgUGlubyxcbiAgUmVxdWVzdEluZm8sXG4gIFN0b3JlRGF0YVxufSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgbG9nVG9UcmFuc3BvcnRzIH0gZnJvbSAnLi4vb3V0cHV0J1xuaW1wb3J0IHsgbG9nVG9GaWxlIH0gZnJvbSAnLi4vb3V0cHV0L2ZpbGUnXG5pbXBvcnQgeyBmb3JtYXRMaW5lIH0gZnJvbSAnLi9jcmVhdGUtbG9nZ2VyJ1xuaW1wb3J0IHsgaGFuZGxlSHR0cEVycm9yIH0gZnJvbSAnLi9oYW5kbGUtaHR0cC1lcnJvcidcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUxvZ2dlciA9IChvcHRpb25zOiBPcHRpb25zID0ge30pOiBMb2dnZXIgPT4ge1xuICBjb25zdCBjb25maWcgPSBvcHRpb25zLmNvbmZpZ1xuXG4gIGNvbnN0IHBpbm9Db25maWcgPSBjb25maWc/LnBpbm9cbiAgY29uc3QgeyBwcmV0dHlQcmludCwgLi4ucGlub09wdGlvbnMgfSA9IHBpbm9Db25maWcgPz8ge31cblxuICBjb25zdCBzaG91bGRQcmV0dHlQcmludCA9XG4gICAgcHJldHR5UHJpbnQgPT09IHRydWUgJiYgcGlub09wdGlvbnMudHJhbnNwb3J0ID09PSB1bmRlZmluZWRcblxuICBjb25zdCB0cmFuc3BvcnQgPSBzaG91bGRQcmV0dHlQcmludFxuICAgID8gcGluby50cmFuc3BvcnQoe1xuICAgICAgICB0YXJnZXQ6ICdwaW5vLXByZXR0eScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBjb2xvcml6ZTogcHJvY2Vzcy5zdGRvdXQ/LmlzVFRZID09PSB0cnVlLFxuICAgICAgICAgIHRyYW5zbGF0ZVRpbWU6IGNvbmZpZz8udGltZXN0YW1wPy50cmFuc2xhdGVUaW1lLFxuICAgICAgICAgIG1lc3NhZ2VLZXk6IHBpbm9PcHRpb25zLm1lc3NhZ2VLZXksXG4gICAgICAgICAgZXJyb3JLZXk6IHBpbm9PcHRpb25zLmVycm9yS2V5XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgOiBwaW5vT3B0aW9ucy50cmFuc3BvcnRcblxuICBjb25zdCBwaW5vTG9nZ2VyOiBQaW5vID0gcGlubyh7XG4gICAgLi4ucGlub09wdGlvbnMsXG4gICAgbGV2ZWw6IHBpbm9PcHRpb25zLmxldmVsID8/ICdpbmZvJyxcbiAgICBtZXNzYWdlS2V5OiBwaW5vT3B0aW9ucy5tZXNzYWdlS2V5LFxuICAgIGVycm9yS2V5OiBwaW5vT3B0aW9ucy5lcnJvcktleSxcbiAgICB0cmFuc3BvcnRcbiAgfSlcblxuICBjb25zdCBsb2cgPSAoXG4gICAgbGV2ZWw6IExvZ0xldmVsLFxuICAgIHJlcXVlc3Q6IFJlcXVlc3RJbmZvLFxuICAgIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIHN0b3JlOiBTdG9yZURhdGFcbiAgKTogdm9pZCA9PiB7XG4gICAgbG9nVG9UcmFuc3BvcnRzKHsgbGV2ZWwsIHJlcXVlc3QsIGRhdGEsIHN0b3JlLCBvcHRpb25zIH0pXG5cbiAgICBjb25zdCB1c2VUcmFuc3BvcnRzT25seSA9IGNvbmZpZz8udXNlVHJhbnNwb3J0c09ubHkgPT09IHRydWVcbiAgICBjb25zdCBkaXNhYmxlSW50ZXJuYWxMb2dnZXIgPSBjb25maWc/LmRpc2FibGVJbnRlcm5hbExvZ2dlciA9PT0gdHJ1ZVxuICAgIGNvbnN0IGRpc2FibGVGaWxlTG9nZ2luZyA9IGNvbmZpZz8uZGlzYWJsZUZpbGVMb2dnaW5nID09PSB0cnVlXG5cbiAgICBpZiAoISh1c2VUcmFuc3BvcnRzT25seSB8fCBkaXNhYmxlRmlsZUxvZ2dpbmcpKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IGNvbmZpZz8ubG9nRmlsZVBhdGhcbiAgICAgIGlmIChmaWxlUGF0aCkge1xuICAgICAgICBsb2dUb0ZpbGUoeyBmaWxlUGF0aCwgbGV2ZWwsIHJlcXVlc3QsIGRhdGEsIHN0b3JlLCBvcHRpb25zIH0pLmNhdGNoKFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIC8vIElnbm9yZSBlcnJvcnNcbiAgICAgICAgICB9XG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodXNlVHJhbnNwb3J0c09ubHkgfHwgZGlzYWJsZUludGVybmFsTG9nZ2VyKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBtZXNzYWdlID0gZm9ybWF0TGluZSh7IGxldmVsLCByZXF1ZXN0LCBkYXRhLCBzdG9yZSwgb3B0aW9ucyB9KVxuXG4gICAgc3dpdGNoIChsZXZlbCkge1xuICAgICAgY2FzZSAnREVCVUcnOiB7XG4gICAgICAgIGNvbnNvbGUuZGVidWcobWVzc2FnZSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0lORk8nOiB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhtZXNzYWdlKVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgY2FzZSAnV0FSTklORyc6IHtcbiAgICAgICAgY29uc29sZS53YXJuKG1lc3NhZ2UpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBjYXNlICdFUlJPUic6IHtcbiAgICAgICAgY29uc29sZS5lcnJvcihtZXNzYWdlKVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBjb25zb2xlLmxvZyhtZXNzYWdlKVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGxvZ1dpdGhDb250ZXh0ID0gKFxuICAgIGxldmVsOiBMb2dMZXZlbCxcbiAgICByZXF1ZXN0OiBSZXF1ZXN0SW5mbyxcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IHN0b3JlOiBTdG9yZURhdGEgPSB7IGJlZm9yZVRpbWU6IHByb2Nlc3MuaHJ0aW1lLmJpZ2ludCgpIH1cbiAgICBsb2cobGV2ZWwsIHJlcXVlc3QsIHsgbWVzc2FnZSwgY29udGV4dCB9LCBzdG9yZSlcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcGlubzogcGlub0xvZ2dlcixcbiAgICBsb2csXG4gICAgaGFuZGxlSHR0cEVycm9yOiAocmVxdWVzdCwgZXJyb3IsIHN0b3JlKSA9PiB7XG4gICAgICBoYW5kbGVIdHRwRXJyb3IocmVxdWVzdCwgZXJyb3IsIHN0b3JlLCBvcHRpb25zKVxuICAgIH0sXG4gICAgZGVidWc6IChyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KSA9PiB7XG4gICAgICBsb2dXaXRoQ29udGV4dCgnREVCVUcnLCByZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KVxuICAgIH0sXG4gICAgaW5mbzogKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpID0+IHtcbiAgICAgIGxvZ1dpdGhDb250ZXh0KCdJTkZPJywgcmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dClcbiAgICB9LFxuICAgIHdhcm46IChyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KSA9PiB7XG4gICAgICBsb2dXaXRoQ29udGV4dCgnV0FSTklORycsIHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXG4gICAgfSxcbiAgICBlcnJvcjogKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpID0+IHtcbiAgICAgIGxvZ1dpdGhDb250ZXh0KCdFUlJPUicsIHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXG4gICAgfVxuICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgTG9nTGV2ZWwsIE9wdGlvbnMsIFJlcXVlc3RJbmZvLCBTdG9yZURhdGEgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuXG50eXBlIExvZ1RvVHJhbnNwb3J0c0lucHV0ID0ge1xuICBsZXZlbDogTG9nTGV2ZWxcbiAgcmVxdWVzdDogUmVxdWVzdEluZm9cbiAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgc3RvcmU6IFN0b3JlRGF0YVxuICBvcHRpb25zOiBPcHRpb25zXG59XG5cbmV4cG9ydCBjb25zdCBsb2dUb1RyYW5zcG9ydHMgPSAoXG4gIC4uLmFyZ3M6XG4gICAgfCBbTG9nVG9UcmFuc3BvcnRzSW5wdXRdXG4gICAgfCBbTG9nTGV2ZWwsIFJlcXVlc3RJbmZvLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgU3RvcmVEYXRhLCBPcHRpb25zXVxuKTogdm9pZCA9PiB7XG4gIGNvbnN0IGlucHV0OiBMb2dUb1RyYW5zcG9ydHNJbnB1dCA9XG4gICAgdHlwZW9mIGFyZ3NbMF0gPT09ICdzdHJpbmcnXG4gICAgICA/IHtcbiAgICAgICAgICBsZXZlbDogYXJnc1swXSxcbiAgICAgICAgICByZXF1ZXN0OiBhcmdzWzFdLFxuICAgICAgICAgIGRhdGE6IGFyZ3NbMl0sXG4gICAgICAgICAgc3RvcmU6IGFyZ3NbM10sXG4gICAgICAgICAgb3B0aW9uczogYXJnc1s0XVxuICAgICAgICB9XG4gICAgICA6IGFyZ3NbMF1cblxuICBjb25zdCB7IGxldmVsLCByZXF1ZXN0LCBkYXRhLCBzdG9yZSwgb3B0aW9ucyB9ID0gaW5wdXRcbiAgY29uc3QgdHJhbnNwb3J0cyA9IG9wdGlvbnMuY29uZmlnPy50cmFuc3BvcnRzID8/IFtdXG4gIGlmICh0cmFuc3BvcnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgbWVzc2FnZSA9IHR5cGVvZiBkYXRhLm1lc3NhZ2UgPT09ICdzdHJpbmcnID8gZGF0YS5tZXNzYWdlIDogJydcbiAgY29uc3QgbWV0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG4gICAgcmVxdWVzdDoge1xuICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcbiAgICAgIHVybDogcmVxdWVzdC51cmxcbiAgICB9LFxuICAgIC4uLmRhdGEsXG4gICAgYmVmb3JlVGltZTogc3RvcmUuYmVmb3JlVGltZVxuICB9XG5cbiAgZm9yIChjb25zdCB0cmFuc3BvcnQgb2YgdHJhbnNwb3J0cykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSB0cmFuc3BvcnQubG9nKGxldmVsLCBtZXNzYWdlLCBtZXRhKVxuICAgICAgaWYgKFxuICAgICAgICByZXN1bHQgJiZcbiAgICAgICAgdHlwZW9mIChyZXN1bHQgYXMgeyBjYXRjaD86IHVua25vd24gfSkuY2F0Y2ggPT09ICdmdW5jdGlvbidcbiAgICAgICkge1xuICAgICAgICA7KHJlc3VsdCBhcyBQcm9taXNlPHZvaWQ+KS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgLy8gSWdub3JlIGVycm9yc1xuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gVHJhbnNwb3J0IGZhaWx1cmVzIG11c3QgbmV2ZXIgY3Jhc2ggYXBwbGljYXRpb24gbG9nZ2luZy5cbiAgICB9XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgYXBwZW5kRmlsZSB9IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnXG5pbXBvcnQgeyBkaXJuYW1lIH0gZnJvbSAnbm9kZTpwYXRoJ1xuaW1wb3J0IHR5cGUgeyBMb2dMZXZlbCwgT3B0aW9ucywgUmVxdWVzdEluZm8sIFN0b3JlRGF0YSB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBlbnN1cmVEaXIgfSBmcm9tICcuL2ZzJ1xuaW1wb3J0IHsgcGVyZm9ybVJvdGF0aW9uLCBzaG91bGRSb3RhdGUgfSBmcm9tICcuL3JvdGF0aW9uLW1hbmFnZXInXG5cbnR5cGUgTG9nVG9GaWxlSW5wdXQgPSB7XG4gIGZpbGVQYXRoOiBzdHJpbmdcbiAgbGV2ZWw6IExvZ0xldmVsXG4gIHJlcXVlc3Q6IFJlcXVlc3RJbmZvXG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gIHN0b3JlOiBTdG9yZURhdGFcbiAgb3B0aW9uczogT3B0aW9uc1xufVxuXG5leHBvcnQgY29uc3QgbG9nVG9GaWxlID0gYXN5bmMgKFxuICAuLi5hcmdzOlxuICAgIHwgW0xvZ1RvRmlsZUlucHV0XVxuICAgIHwgW1xuICAgICAgICBzdHJpbmcsXG4gICAgICAgIExvZ0xldmVsLFxuICAgICAgICBSZXF1ZXN0SW5mbyxcbiAgICAgICAgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgIFN0b3JlRGF0YSxcbiAgICAgICAgT3B0aW9uc1xuICAgICAgXVxuKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IGlucHV0OiBMb2dUb0ZpbGVJbnB1dCA9XG4gICAgdHlwZW9mIGFyZ3NbMF0gPT09ICdzdHJpbmcnXG4gICAgICA/ICgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgW1xuICAgICAgICAgICAgZmlsZVBhdGhBcmcsXG4gICAgICAgICAgICBsZXZlbEFyZyxcbiAgICAgICAgICAgIHJlcXVlc3RBcmcsXG4gICAgICAgICAgICBkYXRhQXJnLFxuICAgICAgICAgICAgc3RvcmVBcmcsXG4gICAgICAgICAgICBvcHRpb25zQXJnXG4gICAgICAgICAgXSA9IGFyZ3MgYXMgW1xuICAgICAgICAgICAgc3RyaW5nLFxuICAgICAgICAgICAgTG9nTGV2ZWwsXG4gICAgICAgICAgICBSZXF1ZXN0SW5mbyxcbiAgICAgICAgICAgIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICAgICAgU3RvcmVEYXRhLFxuICAgICAgICAgICAgT3B0aW9uc1xuICAgICAgICAgIF1cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZmlsZVBhdGg6IGZpbGVQYXRoQXJnLFxuICAgICAgICAgICAgbGV2ZWw6IGxldmVsQXJnLFxuICAgICAgICAgICAgcmVxdWVzdDogcmVxdWVzdEFyZyxcbiAgICAgICAgICAgIGRhdGE6IGRhdGFBcmcsXG4gICAgICAgICAgICBzdG9yZTogc3RvcmVBcmcsXG4gICAgICAgICAgICBvcHRpb25zOiBvcHRpb25zQXJnXG4gICAgICAgICAgfVxuICAgICAgICB9KSgpXG4gICAgICA6IGFyZ3NbMF1cblxuICBjb25zdCB7IGZpbGVQYXRoLCBsZXZlbCwgcmVxdWVzdCwgZGF0YSwgc3RvcmUsIG9wdGlvbnMgfSA9IGlucHV0XG4gIGNvbnN0IGNvbmZpZyA9IG9wdGlvbnMuY29uZmlnXG4gIGNvbnN0IHVzZVRyYW5zcG9ydHNPbmx5ID0gY29uZmlnPy51c2VUcmFuc3BvcnRzT25seSA9PT0gdHJ1ZVxuICBjb25zdCBkaXNhYmxlRmlsZUxvZ2dpbmcgPSBjb25maWc/LmRpc2FibGVGaWxlTG9nZ2luZyA9PT0gdHJ1ZVxuICBpZiAodXNlVHJhbnNwb3J0c09ubHkgfHwgZGlzYWJsZUZpbGVMb2dnaW5nKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCBtZXNzYWdlID0gdHlwZW9mIGRhdGEubWVzc2FnZSA9PT0gJ3N0cmluZycgPyBkYXRhLm1lc3NhZ2UgOiAnJ1xuICBjb25zdCBkdXJhdGlvbk1zID1cbiAgICBzdG9yZS5iZWZvcmVUaW1lID09PSBCaWdJbnQoMClcbiAgICAgID8gMFxuICAgICAgOiBOdW1iZXIocHJvY2Vzcy5ocnRpbWUuYmlnaW50KCkgLSBzdG9yZS5iZWZvcmVUaW1lKSAvIDFfMDAwXzAwMFxuXG4gIGNvbnN0IGxpbmUgPSBgJHtsZXZlbH0gJHtkdXJhdGlvbk1zLnRvRml4ZWQoMil9bXMgJHtyZXF1ZXN0Lm1ldGhvZH0gJHtuZXcgVVJMKHJlcXVlc3QudXJsKS5wYXRobmFtZX0gJHttZXNzYWdlfVxcbmBcblxuICBhd2FpdCBlbnN1cmVEaXIoZGlybmFtZShmaWxlUGF0aCkpXG4gIGF3YWl0IGFwcGVuZEZpbGUoZmlsZVBhdGgsIGxpbmUsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSlcblxuICBjb25zdCByb3RhdGlvbiA9IGNvbmZpZz8ubG9nUm90YXRpb25cbiAgaWYgKCFyb3RhdGlvbikge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3Qgc2hvdWxkID0gYXdhaXQgc2hvdWxkUm90YXRlKGZpbGVQYXRoLCByb3RhdGlvbilcbiAgaWYgKHNob3VsZCkge1xuICAgIGF3YWl0IHBlcmZvcm1Sb3RhdGlvbihmaWxlUGF0aCwgcm90YXRpb24pXG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgcHJvbWlzZXMgYXMgZnMgfSBmcm9tICdub2RlOmZzJ1xuXG5leHBvcnQgY29uc3QgZW5zdXJlRGlyID0gYXN5bmMgKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICBhd2FpdCBmcy5ta2RpcihkaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxufVxuIiwKICAgICJpbXBvcnQgeyBwcm9taXNlcyBhcyBmcyB9IGZyb20gJ25vZGU6ZnMnXG5pbXBvcnQgeyBwcm9taXNpZnkgfSBmcm9tICdub2RlOnV0aWwnXG5pbXBvcnQgeyBnemlwIH0gZnJvbSAnbm9kZTp6bGliJ1xuaW1wb3J0IHR5cGUgeyBMb2dSb3RhdGlvbkNvbmZpZyB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQge1xuICBnZXRSb3RhdGVkRmlsZXMsXG4gIHBhcnNlUmV0ZW50aW9uLFxuICBwYXJzZVNpemUsXG4gIHNob3VsZFJvdGF0ZUJ5U2l6ZVxufSBmcm9tICcuLi91dGlscy9yb3RhdGlvbidcblxuY29uc3QgZ3ppcEFzeW5jID0gcHJvbWlzaWZ5KGd6aXApXG5cbmNvbnN0IHBhZDIgPSAodmFsdWU6IG51bWJlcik6IHN0cmluZyA9PiBTdHJpbmcodmFsdWUpLnBhZFN0YXJ0KDIsICcwJylcblxuZXhwb3J0IGNvbnN0IGdldFJvdGF0ZWRGaWxlTmFtZSA9IChmaWxlUGF0aDogc3RyaW5nLCBkYXRlOiBEYXRlKTogc3RyaW5nID0+IHtcbiAgY29uc3QgeXl5eSA9IGRhdGUuZ2V0RnVsbFllYXIoKVxuICBjb25zdCBtbSA9IHBhZDIoZGF0ZS5nZXRNb250aCgpICsgMSlcbiAgY29uc3QgZGQgPSBwYWQyKGRhdGUuZ2V0RGF0ZSgpKVxuICBjb25zdCBISCA9IHBhZDIoZGF0ZS5nZXRIb3VycygpKVxuICBjb25zdCBNTSA9IHBhZDIoZGF0ZS5nZXRNaW51dGVzKCkpXG4gIGNvbnN0IHNzID0gcGFkMihkYXRlLmdldFNlY29uZHMoKSlcbiAgcmV0dXJuIGAke2ZpbGVQYXRofS4ke3l5eXl9LSR7bW19LSR7ZGR9LSR7SEh9LSR7TU19LSR7c3N9YFxufVxuXG5leHBvcnQgY29uc3Qgcm90YXRlRmlsZSA9IGFzeW5jIChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0ID0gYXdhaXQgZnMuc3RhdChmaWxlUGF0aClcbiAgICBpZiAoc3RhdC5zaXplID09PSAwKSB7XG4gICAgICByZXR1cm4gJydcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgY29uc3Qgcm90YXRlZCA9IGdldFJvdGF0ZWRGaWxlTmFtZShmaWxlUGF0aCwgbmV3IERhdGUoKSlcbiAgYXdhaXQgZnMucmVuYW1lKGZpbGVQYXRoLCByb3RhdGVkKVxuICByZXR1cm4gcm90YXRlZFxufVxuXG5leHBvcnQgY29uc3QgY29tcHJlc3NGaWxlID0gYXN5bmMgKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGZpbGVQYXRoKVxuICBjb25zdCBjb21wcmVzc2VkID0gYXdhaXQgZ3ppcEFzeW5jKGNvbnRlbnQpXG4gIGF3YWl0IGZzLndyaXRlRmlsZShgJHtmaWxlUGF0aH0uZ3pgLCBjb21wcmVzc2VkKVxuICBhd2FpdCBmcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KVxufVxuXG5leHBvcnQgY29uc3Qgc2hvdWxkUm90YXRlID0gYXN5bmMgKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBjb25maWc6IExvZ1JvdGF0aW9uQ29uZmlnXG4pOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgaWYgKGNvbmZpZy5tYXhTaXplID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuICBjb25zdCBtYXhTaXplID0gcGFyc2VTaXplKGNvbmZpZy5tYXhTaXplKVxuICByZXR1cm4gYXdhaXQgc2hvdWxkUm90YXRlQnlTaXplKGZpbGVQYXRoLCBtYXhTaXplKVxufVxuXG5jb25zdCBjbGVhbnVwQnlDb3VudCA9IGFzeW5jIChcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgbWF4RmlsZXM6IG51bWJlclxuKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IHJvdGF0ZWQgPSBhd2FpdCBnZXRSb3RhdGVkRmlsZXMoZmlsZVBhdGgpXG4gIGlmIChyb3RhdGVkLmxlbmd0aCA8PSBtYXhGaWxlcykge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3Qgc3RhdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICByb3RhdGVkLm1hcChhc3luYyBwID0+ICh7IHBhdGg6IHAsIHN0YXQ6IGF3YWl0IGZzLnN0YXQocCkgfSkpXG4gIClcblxuICBzdGF0cy5zb3J0KChhLCBiKSA9PiBiLnN0YXQubXRpbWVNcyAtIGEuc3RhdC5tdGltZU1zKVxuICBjb25zdCB0b0RlbGV0ZSA9IHN0YXRzLnNsaWNlKG1heEZpbGVzKVxuICBhd2FpdCBQcm9taXNlLmFsbCh0b0RlbGV0ZS5tYXAoKHsgcGF0aCB9KSA9PiBmcy5ybShwYXRoLCB7IGZvcmNlOiB0cnVlIH0pKSlcbn1cblxuY29uc3QgY2xlYW51cEJ5VGltZSA9IGFzeW5jIChcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgbWF4QWdlTXM6IG51bWJlclxuKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IHJvdGF0ZWQgPSBhd2FpdCBnZXRSb3RhdGVkRmlsZXMoZmlsZVBhdGgpXG4gIGlmIChyb3RhdGVkLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKVxuICBjb25zdCBzdGF0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgIHJvdGF0ZWQubWFwKGFzeW5jIHAgPT4gKHsgcGF0aDogcCwgc3RhdDogYXdhaXQgZnMuc3RhdChwKSB9KSlcbiAgKVxuXG4gIGNvbnN0IHRvRGVsZXRlID0gc3RhdHMuZmlsdGVyKCh7IHN0YXQgfSkgPT4gbm93IC0gc3RhdC5tdGltZU1zID4gbWF4QWdlTXMpXG4gIGF3YWl0IFByb21pc2UuYWxsKHRvRGVsZXRlLm1hcCgoeyBwYXRoIH0pID0+IGZzLnJtKHBhdGgsIHsgZm9yY2U6IHRydWUgfSkpKVxufVxuXG5leHBvcnQgY29uc3QgcGVyZm9ybVJvdGF0aW9uID0gYXN5bmMgKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBjb25maWc6IExvZ1JvdGF0aW9uQ29uZmlnXG4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3Qgcm90YXRlZCA9IGF3YWl0IHJvdGF0ZUZpbGUoZmlsZVBhdGgpXG4gIGlmICghcm90YXRlZCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3Qgc2hvdWxkQ29tcHJlc3MgPSBjb25maWcuY29tcHJlc3MgPT09IHRydWVcbiAgaWYgKHNob3VsZENvbXByZXNzKSB7XG4gICAgY29uc3QgYWxnbyA9IGNvbmZpZy5jb21wcmVzc2lvbiA/PyAnZ3ppcCdcbiAgICBpZiAoYWxnbyA9PT0gJ2d6aXAnKSB7XG4gICAgICBhd2FpdCBjb21wcmVzc0ZpbGUocm90YXRlZClcbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLm1heEZpbGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCByZXRlbnRpb24gPSBwYXJzZVJldGVudGlvbihjb25maWcubWF4RmlsZXMpXG4gICAgaWYgKHJldGVudGlvbi50eXBlID09PSAnY291bnQnKSB7XG4gICAgICBhd2FpdCBjbGVhbnVwQnlDb3VudChmaWxlUGF0aCwgcmV0ZW50aW9uLnZhbHVlKVxuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBjbGVhbnVwQnlUaW1lKGZpbGVQYXRoLCByZXRlbnRpb24udmFsdWUpXG4gICAgfVxuICB9XG5cbiAgLy8gT3B0aW9uYWwgaW50ZXJ2YWwtYmFzZWQgcm90YXRpb24gY2xlYW51cCAoY3JlYXRlIGludGVydmFsIGRpcmVjdG9yaWVzIC8gbmFtaW5nKSBpcyBub3QgcmVxdWlyZWQgYnkgdGVzdHMuXG59XG4iLAogICAgImltcG9ydCB7IHByb21pc2VzIGFzIGZzIH0gZnJvbSAnbm9kZTpmcydcbmltcG9ydCB7IGJhc2VuYW1lLCBkaXJuYW1lIH0gZnJvbSAnbm9kZTpwYXRoJ1xuXG5jb25zdCBTSVpFX1JFR0VYID0gL14oXFxkKyg/OlxcLlxcZCspPykoa3xrYnxtfG1ifGd8Z2IpJC9pXG5jb25zdCBJTlRFUlZBTF9SRUdFWCA9IC9eKFxcZCspKGh8ZHx3KSQvaVxuY29uc3QgUk9UQVRFRF9SRUdFWCA9IC9cXC4oXFxkezR9LVxcZHsyfS1cXGR7Mn0tXFxkezJ9LVxcZHsyfS1cXGR7Mn0pKD86XFwuZ3opPyQvXG5cbmV4cG9ydCBjb25zdCBwYXJzZVNpemUgPSAodmFsdWU6IG51bWJlciB8IHN0cmluZyk6IG51bWJlciA9PiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICBjb25zdCB0cmltbWVkID0gdmFsdWUudHJpbSgpXG4gIGNvbnN0IGFzTnVtYmVyID0gTnVtYmVyKHRyaW1tZWQpXG4gIGlmIChOdW1iZXIuaXNGaW5pdGUoYXNOdW1iZXIpKSB7XG4gICAgcmV0dXJuIGFzTnVtYmVyXG4gIH1cblxuICBjb25zdCBtYXRjaCA9IHRyaW1tZWQubWF0Y2goU0laRV9SRUdFWClcbiAgaWYgKCFtYXRjaCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzaXplIGZvcm1hdDogJHt2YWx1ZX1gKVxuICB9XG5cbiAgY29uc3QgYW1vdW50ID0gTnVtYmVyKG1hdGNoWzFdKVxuICBjb25zdCB1bml0ID0gbWF0Y2hbMl0udG9Mb3dlckNhc2UoKVxuXG4gIGxldCBiYXNlID0gMTAyNFxuICBpZiAodW5pdC5zdGFydHNXaXRoKCdtJykpIHtcbiAgICBiYXNlID0gMTAyNCAqIDEwMjRcbiAgfSBlbHNlIGlmICh1bml0LnN0YXJ0c1dpdGgoJ2cnKSkge1xuICAgIGJhc2UgPSAxMDI0ICogMTAyNCAqIDEwMjRcbiAgfVxuXG4gIHJldHVybiBNYXRoLmZsb29yKGFtb3VudCAqIGJhc2UpXG59XG5cbmV4cG9ydCBjb25zdCBwYXJzZUludGVydmFsID0gKHZhbHVlOiBzdHJpbmcpOiBudW1iZXIgPT4ge1xuICBjb25zdCBtYXRjaCA9IHZhbHVlLnRyaW0oKS5tYXRjaChJTlRFUlZBTF9SRUdFWClcbiAgaWYgKCFtYXRjaCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBpbnRlcnZhbCBmb3JtYXQ6ICR7dmFsdWV9YClcbiAgfVxuXG4gIGNvbnN0IGFtb3VudCA9IE51bWJlcihtYXRjaFsxXSlcbiAgY29uc3QgdW5pdCA9IG1hdGNoWzJdLnRvTG93ZXJDYXNlKClcblxuICBsZXQgbXMgPSA2MCAqIDYwICogMTAwMFxuICBpZiAodW5pdCA9PT0gJ2QnKSB7XG4gICAgbXMgPSAyNCAqIDYwICogNjAgKiAxMDAwXG4gIH0gZWxzZSBpZiAodW5pdCA9PT0gJ3cnKSB7XG4gICAgbXMgPSA3ICogMjQgKiA2MCAqIDYwICogMTAwMFxuICB9XG5cbiAgcmV0dXJuIGFtb3VudCAqIG1zXG59XG5cbmV4cG9ydCBjb25zdCBwYXJzZVJldGVudGlvbiA9IChcbiAgdmFsdWU6IG51bWJlciB8IHN0cmluZ1xuKTogeyB0eXBlOiAnY291bnQnIHwgJ3RpbWUnOyB2YWx1ZTogbnVtYmVyIH0gPT4ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB7IHR5cGU6ICdjb3VudCcsIHZhbHVlIH1cbiAgfVxuICByZXR1cm4geyB0eXBlOiAndGltZScsIHZhbHVlOiBwYXJzZUludGVydmFsKHZhbHVlKSB9XG59XG5cbmV4cG9ydCBjb25zdCBzaG91bGRSb3RhdGVCeVNpemUgPSBhc3luYyAoXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIG1heFNpemVCeXRlczogbnVtYmVyXG4pOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0ID0gYXdhaXQgZnMuc3RhdChmaWxlUGF0aClcbiAgICByZXR1cm4gc3RhdC5zaXplID4gbWF4U2l6ZUJ5dGVzXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBnZXRSb3RhdGVkRmlsZXMgPSBhc3luYyAoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10+ID0+IHtcbiAgY29uc3QgZGlyID0gZGlybmFtZShmaWxlUGF0aClcbiAgY29uc3QgYmFzZSA9IGJhc2VuYW1lKGZpbGVQYXRoKVxuXG4gIGxldCBlbnRyaWVzOiBzdHJpbmdbXVxuICB0cnkge1xuICAgIGVudHJpZXMgPSBhd2FpdCBmcy5yZWFkZGlyKGRpcilcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIFtdXG4gIH1cblxuICByZXR1cm4gZW50cmllc1xuICAgIC5maWx0ZXIobmFtZSA9PiBuYW1lLnN0YXJ0c1dpdGgoYCR7YmFzZX0uYCkgJiYgUk9UQVRFRF9SRUdFWC50ZXN0KG5hbWUpKVxuICAgIC5tYXAobmFtZSA9PiBgJHtkaXJ9LyR7bmFtZX1gKVxufVxuIiwKICAgICJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnXG5pbXBvcnQgeyBnZXRTdGF0dXNDb2RlIH0gZnJvbSAnLi4vaGVscGVycy9zdGF0dXMnXG5pbXBvcnQgdHlwZSB7XG4gIExvZ0xldmVsLFxuICBPcHRpb25zLFxuICBQaW5vLFxuICBSZXF1ZXN0SW5mbyxcbiAgU3RvcmVEYXRhXG59IGZyb20gJy4uL2ludGVyZmFjZXMnXG5cbmNvbnN0IHBhZDIgPSAodmFsdWU6IG51bWJlcik6IHN0cmluZyA9PiBTdHJpbmcodmFsdWUpLnBhZFN0YXJ0KDIsICcwJylcbmNvbnN0IHBhZDMgPSAodmFsdWU6IG51bWJlcik6IHN0cmluZyA9PiBTdHJpbmcodmFsdWUpLnBhZFN0YXJ0KDMsICcwJylcblxuY29uc3Qgc2hvdWxkVXNlQ29sb3JzID0gKG9wdGlvbnM6IE9wdGlvbnMpOiBib29sZWFuID0+IHtcbiAgY29uc3QgY29uZmlnID0gb3B0aW9ucy5jb25maWdcbiAgY29uc3QgZW5hYmxlZEJ5Q29uZmlnID0gY29uZmlnPy51c2VDb2xvcnMgPz8gdHJ1ZVxuXG4gIC8vIEF2b2lkIEFOU0kgc2VxdWVuY2VzIGluIG5vbi1pbnRlcmFjdGl2ZSBvdXRwdXQgKHBpcGVzLCBDSSBsb2dzLCBmaWxlcykuXG4gIGNvbnN0IGlzVHR5ID0gdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIHByb2Nlc3Muc3Rkb3V0Py5pc1RUWSA9PT0gdHJ1ZVxuICByZXR1cm4gZW5hYmxlZEJ5Q29uZmlnICYmIGlzVHR5XG59XG5cbmNvbnN0IGZvcm1hdFRpbWVzdGFtcCA9IChkYXRlOiBEYXRlLCBwYXR0ZXJuPzogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgaWYgKCFwYXR0ZXJuKSB7XG4gICAgcmV0dXJuIGRhdGUudG9JU09TdHJpbmcoKVxuICB9XG5cbiAgY29uc3QgeXl5eSA9IFN0cmluZyhkYXRlLmdldEZ1bGxZZWFyKCkpXG4gIGNvbnN0IG1tID0gcGFkMihkYXRlLmdldE1vbnRoKCkgKyAxKVxuICBjb25zdCBkZCA9IHBhZDIoZGF0ZS5nZXREYXRlKCkpXG4gIGNvbnN0IEhIID0gcGFkMihkYXRlLmdldEhvdXJzKCkpXG4gIGNvbnN0IE1NID0gcGFkMihkYXRlLmdldE1pbnV0ZXMoKSlcbiAgY29uc3Qgc3MgPSBwYWQyKGRhdGUuZ2V0U2Vjb25kcygpKVxuICBjb25zdCBTU1MgPSBwYWQzKGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCkpXG5cbiAgcmV0dXJuIHBhdHRlcm5cbiAgICAucmVwbGFjZUFsbCgneXl5eScsIHl5eXkpXG4gICAgLnJlcGxhY2VBbGwoJ21tJywgbW0pXG4gICAgLnJlcGxhY2VBbGwoJ2RkJywgZGQpXG4gICAgLnJlcGxhY2VBbGwoJ0hIJywgSEgpXG4gICAgLnJlcGxhY2VBbGwoJ01NJywgTU0pXG4gICAgLnJlcGxhY2VBbGwoJ3NzJywgc3MpXG4gICAgLnJlcGxhY2VBbGwoJ1NTUycsIFNTUylcbn1cblxuY29uc3QgZ2V0SXAgPSAocmVxdWVzdDogUmVxdWVzdEluZm8pOiBzdHJpbmcgPT4ge1xuICBjb25zdCBmb3J3YXJkZWQgPSByZXF1ZXN0LmhlYWRlcnMuZ2V0KCd4LWZvcndhcmRlZC1mb3InKVxuICBpZiAoZm9yd2FyZGVkKSB7XG4gICAgcmV0dXJuIGZvcndhcmRlZC5zcGxpdCgnLCcpWzBdPy50cmltKCkgPz8gJydcbiAgfVxuICByZXR1cm4gcmVxdWVzdC5oZWFkZXJzLmdldCgneC1yZWFsLWlwJykgPz8gJydcbn1cblxuY29uc3QgZ2V0Q29sb3JlZExldmVsID0gKGxldmVsOiBMb2dMZXZlbCwgdXNlQ29sb3JzOiBib29sZWFuKTogc3RyaW5nID0+IHtcbiAgaWYgKCF1c2VDb2xvcnMpIHtcbiAgICByZXR1cm4gbGV2ZWxcbiAgfVxuXG4gIGlmIChsZXZlbCA9PT0gJ0VSUk9SJykge1xuICAgIHJldHVybiBjaGFsay5iZ1JlZC5ibGFjayhsZXZlbClcbiAgfVxuICBpZiAobGV2ZWwgPT09ICdXQVJOSU5HJykge1xuICAgIHJldHVybiBjaGFsay5iZ1llbGxvdy5ibGFjayhsZXZlbClcbiAgfVxuICBpZiAobGV2ZWwgPT09ICdERUJVRycpIHtcbiAgICByZXR1cm4gY2hhbGsuYmdCbHVlLmJsYWNrKGxldmVsKVxuICB9XG5cbiAgcmV0dXJuIGNoYWxrLmJnR3JlZW4uYmxhY2sobGV2ZWwpXG59XG5cbmNvbnN0IGdldENvbG9yZWRNZXRob2QgPSAobWV0aG9kOiBzdHJpbmcsIHVzZUNvbG9yczogYm9vbGVhbik6IHN0cmluZyA9PiB7XG4gIGlmICghdXNlQ29sb3JzKSB7XG4gICAgcmV0dXJuIG1ldGhvZFxuICB9XG5cbiAgY29uc3QgdXBwZXIgPSBtZXRob2QudG9VcHBlckNhc2UoKVxuICBpZiAodXBwZXIgPT09ICdHRVQnKSB7XG4gICAgcmV0dXJuIGNoYWxrLmdyZWVuLmJvbGQodXBwZXIpXG4gIH1cbiAgaWYgKHVwcGVyID09PSAnUE9TVCcpIHtcbiAgICByZXR1cm4gY2hhbGsuYmx1ZS5ib2xkKHVwcGVyKVxuICB9XG4gIGlmICh1cHBlciA9PT0gJ1BVVCcpIHtcbiAgICByZXR1cm4gY2hhbGsueWVsbG93LmJvbGQodXBwZXIpXG4gIH1cbiAgaWYgKHVwcGVyID09PSAnUEFUQ0gnKSB7XG4gICAgcmV0dXJuIGNoYWxrLnllbGxvd0JyaWdodC5ib2xkKHVwcGVyKVxuICB9XG4gIGlmICh1cHBlciA9PT0gJ0RFTEVURScpIHtcbiAgICByZXR1cm4gY2hhbGsucmVkLmJvbGQodXBwZXIpXG4gIH1cbiAgaWYgKHVwcGVyID09PSAnT1BUSU9OUycpIHtcbiAgICByZXR1cm4gY2hhbGsuY3lhbi5ib2xkKHVwcGVyKVxuICB9XG4gIGlmICh1cHBlciA9PT0gJ0hFQUQnKSB7XG4gICAgcmV0dXJuIGNoYWxrLmdyZWVuQnJpZ2h0LmJvbGQodXBwZXIpXG4gIH1cbiAgaWYgKHVwcGVyID09PSAnVFJBQ0UnKSB7XG4gICAgcmV0dXJuIGNoYWxrLm1hZ2VudGEuYm9sZCh1cHBlcilcbiAgfVxuICBpZiAodXBwZXIgPT09ICdDT05ORUNUJykge1xuICAgIHJldHVybiBjaGFsay5jeWFuQnJpZ2h0LmJvbGQodXBwZXIpXG4gIH1cblxuICByZXR1cm4gY2hhbGsud2hpdGUuYm9sZCh1cHBlcilcbn1cblxuY29uc3QgZ2V0Q29sb3JlZFN0YXR1cyA9IChzdGF0dXM6IHN0cmluZywgdXNlQ29sb3JzOiBib29sZWFuKTogc3RyaW5nID0+IHtcbiAgaWYgKCF1c2VDb2xvcnMpIHtcbiAgICByZXR1cm4gc3RhdHVzXG4gIH1cblxuICBjb25zdCBudW1lcmljID0gTnVtYmVyLnBhcnNlSW50KHN0YXR1cywgMTApXG4gIGlmICghTnVtYmVyLmlzRmluaXRlKG51bWVyaWMpKSB7XG4gICAgcmV0dXJuIHN0YXR1c1xuICB9XG5cbiAgaWYgKG51bWVyaWMgPj0gNTAwKSB7XG4gICAgcmV0dXJuIGNoYWxrLnJlZChzdGF0dXMpXG4gIH1cbiAgaWYgKG51bWVyaWMgPj0gNDAwKSB7XG4gICAgcmV0dXJuIGNoYWxrLnllbGxvdyhzdGF0dXMpXG4gIH1cbiAgaWYgKG51bWVyaWMgPj0gMzAwKSB7XG4gICAgcmV0dXJuIGNoYWxrLmN5YW4oc3RhdHVzKVxuICB9XG4gIGlmIChudW1lcmljID49IDIwMCkge1xuICAgIHJldHVybiBjaGFsay5ncmVlbihzdGF0dXMpXG4gIH1cbiAgcmV0dXJuIGNoYWxrLmdyYXkoc3RhdHVzKVxufVxuXG5jb25zdCBnZXRDb2xvcmVkRHVyYXRpb24gPSAoZHVyYXRpb246IHN0cmluZywgdXNlQ29sb3JzOiBib29sZWFuKTogc3RyaW5nID0+IHtcbiAgaWYgKCF1c2VDb2xvcnMpIHtcbiAgICByZXR1cm4gZHVyYXRpb25cbiAgfVxuXG4gIHJldHVybiBjaGFsay5ncmF5KGR1cmF0aW9uKVxufVxuXG5jb25zdCBnZXRDb2xvcmVkVGltZXN0YW1wID0gKHRpbWVzdGFtcDogc3RyaW5nLCB1c2VDb2xvcnM6IGJvb2xlYW4pOiBzdHJpbmcgPT4ge1xuICBpZiAoIXVzZUNvbG9ycykge1xuICAgIHJldHVybiB0aW1lc3RhbXBcbiAgfVxuXG4gIHJldHVybiBjaGFsay5iZ0hleCgnI0ZGQTUwMCcpLmJsYWNrKHRpbWVzdGFtcClcbn1cblxuY29uc3QgZ2V0Q29sb3JlZFBhdGhuYW1lID0gKHBhdGhuYW1lOiBzdHJpbmcsIHVzZUNvbG9yczogYm9vbGVhbik6IHN0cmluZyA9PiB7XG4gIGlmICghdXNlQ29sb3JzKSB7XG4gICAgcmV0dXJuIHBhdGhuYW1lXG4gIH1cblxuICByZXR1cm4gY2hhbGsud2hpdGVCcmlnaHQocGF0aG5hbWUpXG59XG5cbmNvbnN0IGdldENvbnRleHRTdHJpbmcgPSAodmFsdWU6IHVua25vd24pOiBzdHJpbmcgPT4ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSlcbiAgfVxuXG4gIHJldHVybiAnJ1xufVxuXG5leHBvcnQgY29uc3QgZm9ybWF0TGluZSA9ICh7XG4gIGxldmVsLFxuICByZXF1ZXN0LFxuICBkYXRhLFxuICBzdG9yZSxcbiAgb3B0aW9uc1xufToge1xuICBsZXZlbDogTG9nTGV2ZWxcbiAgcmVxdWVzdDogUmVxdWVzdEluZm9cbiAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgc3RvcmU6IFN0b3JlRGF0YVxuICBvcHRpb25zOiBPcHRpb25zXG59KTogc3RyaW5nID0+IHtcbiAgY29uc3QgY29uZmlnID0gb3B0aW9ucy5jb25maWdcbiAgY29uc3QgdXNlQ29sb3JzID0gc2hvdWxkVXNlQ29sb3JzKG9wdGlvbnMpXG4gIGNvbnN0IGZvcm1hdCA9XG4gICAgY29uZmlnPy5jdXN0b21Mb2dGb3JtYXQgPz9cbiAgICAn8J+miiB7bm93fSB7bGV2ZWx9IHtkdXJhdGlvbn0ge21ldGhvZH0ge3BhdGhuYW1lfSB7c3RhdHVzfSB7bWVzc2FnZX0ge2lwfSB7Y29udGV4dH0nXG5cbiAgY29uc3Qgbm93ID0gbmV3IERhdGUoKVxuICBjb25zdCBlcG9jaCA9IFN0cmluZyhub3cuZ2V0VGltZSgpKVxuICBjb25zdCByYXdUaW1lc3RhbXAgPSBmb3JtYXRUaW1lc3RhbXAobm93LCBjb25maWc/LnRpbWVzdGFtcD8udHJhbnNsYXRlVGltZSlcbiAgY29uc3QgdGltZXN0YW1wID0gZ2V0Q29sb3JlZFRpbWVzdGFtcChyYXdUaW1lc3RhbXAsIHVzZUNvbG9ycylcblxuICBjb25zdCBtZXNzYWdlID0gdHlwZW9mIGRhdGEubWVzc2FnZSA9PT0gJ3N0cmluZycgPyBkYXRhLm1lc3NhZ2UgOiAnJ1xuICBjb25zdCBkdXJhdGlvbk1zID1cbiAgICBzdG9yZS5iZWZvcmVUaW1lID09PSBCaWdJbnQoMClcbiAgICAgID8gMFxuICAgICAgOiBOdW1iZXIocHJvY2Vzcy5ocnRpbWUuYmlnaW50KCkgLSBzdG9yZS5iZWZvcmVUaW1lKSAvIDFfMDAwXzAwMFxuXG4gIGNvbnN0IHBhdGhuYW1lID0gbmV3IFVSTChyZXF1ZXN0LnVybCkucGF0aG5hbWVcbiAgY29uc3Qgc3RhdHVzVmFsdWUgPSBkYXRhLnN0YXR1c1xuICBjb25zdCBzdGF0dXNDb2RlID1cbiAgICBzdGF0dXNWYWx1ZSA9PT0gbnVsbCB8fCBzdGF0dXNWYWx1ZSA9PT0gdW5kZWZpbmVkXG4gICAgICA/IDIwMFxuICAgICAgOiBnZXRTdGF0dXNDb2RlKHN0YXR1c1ZhbHVlKVxuICBjb25zdCBzdGF0dXMgPSBTdHJpbmcoc3RhdHVzQ29kZSlcbiAgY29uc3QgaXAgPSBjb25maWc/LmlwID09PSB0cnVlID8gZ2V0SXAocmVxdWVzdCkgOiAnJ1xuICBjb25zdCBjdHhTdHJpbmcgPSBnZXRDb250ZXh0U3RyaW5nKGRhdGEuY29udGV4dClcbiAgY29uc3QgY29sb3JlZExldmVsID0gZ2V0Q29sb3JlZExldmVsKGxldmVsLCB1c2VDb2xvcnMpXG4gIGNvbnN0IGNvbG9yZWRNZXRob2QgPSBnZXRDb2xvcmVkTWV0aG9kKHJlcXVlc3QubWV0aG9kLCB1c2VDb2xvcnMpXG4gIGNvbnN0IGNvbG9yZWRQYXRobmFtZSA9IGdldENvbG9yZWRQYXRobmFtZShwYXRobmFtZSwgdXNlQ29sb3JzKVxuICBjb25zdCBjb2xvcmVkU3RhdHVzID0gZ2V0Q29sb3JlZFN0YXR1cyhzdGF0dXMsIHVzZUNvbG9ycylcbiAgY29uc3QgY29sb3JlZER1cmF0aW9uID0gZ2V0Q29sb3JlZER1cmF0aW9uKFxuICAgIGAke2R1cmF0aW9uTXMudG9GaXhlZCgyKX1tc2AsXG4gICAgdXNlQ29sb3JzXG4gIClcblxuICByZXR1cm4gZm9ybWF0XG4gICAgLnJlcGxhY2VBbGwoJ3tub3d9JywgdGltZXN0YW1wKVxuICAgIC5yZXBsYWNlQWxsKCd7ZXBvY2h9JywgZXBvY2gpXG4gICAgLnJlcGxhY2VBbGwoJ3tsZXZlbH0nLCBjb2xvcmVkTGV2ZWwpXG4gICAgLnJlcGxhY2VBbGwoJ3tkdXJhdGlvbn0nLCBjb2xvcmVkRHVyYXRpb24pXG4gICAgLnJlcGxhY2VBbGwoJ3ttZXRob2R9JywgY29sb3JlZE1ldGhvZClcbiAgICAucmVwbGFjZUFsbCgne3BhdGhuYW1lfScsIGNvbG9yZWRQYXRobmFtZSlcbiAgICAucmVwbGFjZUFsbCgne3BhdGh9JywgY29sb3JlZFBhdGhuYW1lKVxuICAgIC5yZXBsYWNlQWxsKCd7c3RhdHVzfScsIGNvbG9yZWRTdGF0dXMpXG4gICAgLnJlcGxhY2VBbGwoJ3ttZXNzYWdlfScsIG1lc3NhZ2UpXG4gICAgLnJlcGxhY2VBbGwoJ3tpcH0nLCBpcClcbiAgICAucmVwbGFjZUFsbCgne2NvbnRleHR9JywgY3R4U3RyaW5nKVxufVxuXG5leHBvcnQgY29uc3QgbG9nV2l0aFBpbm8gPSAoXG4gIGxvZ2dlcjogUGlubyxcbiAgbGV2ZWw6IExvZ0xldmVsLFxuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuKTogdm9pZCA9PiB7XG4gIGlmIChsZXZlbCA9PT0gJ0VSUk9SJykge1xuICAgIGxvZ2dlci5lcnJvcihkYXRhKVxuICAgIHJldHVyblxuICB9XG4gIGlmIChsZXZlbCA9PT0gJ1dBUk5JTkcnKSB7XG4gICAgbG9nZ2VyLndhcm4oZGF0YSlcbiAgICByZXR1cm5cbiAgfVxuICBpZiAobGV2ZWwgPT09ICdERUJVRycpIHtcbiAgICBsb2dnZXIuZGVidWcoZGF0YSlcbiAgICByZXR1cm5cbiAgfVxuICBsb2dnZXIuaW5mbyhkYXRhKVxufVxuIiwKICAgICJpbXBvcnQgeyBTdGF0dXNNYXAgfSBmcm9tICdlbHlzaWEnXG5cbmNvbnN0IERJR0lUU19PTkxZID0gL15cXGQrJC9cbmNvbnN0IERFTElNSVRFUlMgPSAvW18tXSsvZ1xuY29uc3QgQ0FNRUxfQk9VTkRBUllfMSA9IC8oW2EtejAtOV0pKFtBLVpdKS9nXG5jb25zdCBDQU1FTF9CT1VOREFSWV8yID0gLyhbQS1aXSkoW0EtWl1bYS16XSkvZ1xuY29uc3QgQVBPU1RST1BIRVMgPSAvWyfigJldL2dcbmNvbnN0IE5PTl9BTFBIQU5VTUVSSUMgPSAvW15hLXowLTlcXHNdKy9nXG5jb25zdCBXSElURVNQQUNFID0gL1xccysvZ1xuXG5jb25zdCBub3JtYWxpemVTdGF0dXNOYW1lID0gKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICAvLyBIYW5kbGVzIGNvbW1vbiB2YXJpYW50czpcbiAgLy8gLSBjYXNlIGRpZmZlcmVuY2VzOiBcIm5vdCBmb3VuZFwiIHZzIFwiTm90IEZvdW5kXCJcbiAgLy8gLSBzcGFjaW5nL3B1bmN0dWF0aW9uOiBcIk5vdC1Gb3VuZFwiLCBcIm5vdF9mb3VuZFwiXG4gIC8vIC0gY2FtZWxDYXNlL1Bhc2NhbENhc2U6IFwiSW50ZXJuYWxTZXJ2ZXJFcnJvclwiXG4gIGNvbnN0IHRyaW1tZWQgPSB2YWx1ZS50cmltKClcbiAgaWYgKCF0cmltbWVkKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICByZXR1cm4gdHJpbW1lZFxuICAgIC5yZXBsYWNlKERFTElNSVRFUlMsICcgJylcbiAgICAucmVwbGFjZShDQU1FTF9CT1VOREFSWV8xLCAnJDEgJDInKVxuICAgIC5yZXBsYWNlKENBTUVMX0JPVU5EQVJZXzIsICckMSAkMicpXG4gICAgLnJlcGxhY2UoQVBPU1RST1BIRVMsICcnKVxuICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgLnJlcGxhY2UoTk9OX0FMUEhBTlVNRVJJQywgJyAnKVxuICAgIC5yZXBsYWNlKFdISVRFU1BBQ0UsICcgJylcbiAgICAudHJpbSgpXG59XG5cbmNvbnN0IFNUQVRVU19CWV9OT1JNQUxJWkVEX05BTUUgPSAoKCkgPT4ge1xuICBjb25zdCBtYXAgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpXG5cbiAgZm9yIChjb25zdCBbbmFtZSwgY29kZV0gb2YgT2JqZWN0LmVudHJpZXMoU3RhdHVzTWFwKSkge1xuICAgIG1hcC5zZXQobm9ybWFsaXplU3RhdHVzTmFtZShuYW1lKSwgY29kZSlcbiAgfVxuXG4gIHJldHVybiBtYXBcbn0pKClcblxuZXhwb3J0IGNvbnN0IGdldFN0YXR1c0NvZGUgPSAodmFsdWU6IHVua25vd24pOiBudW1iZXIgPT4ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IHRyaW1tZWQgPSB2YWx1ZS50cmltKClcbiAgICBpZiAoRElHSVRTX09OTFkudGVzdCh0cmltbWVkKSkge1xuICAgICAgcmV0dXJuIE51bWJlcih0cmltbWVkKVxuICAgIH1cblxuICAgIGNvbnN0IGtub3duID0gU1RBVFVTX0JZX05PUk1BTElaRURfTkFNRS5nZXQobm9ybWFsaXplU3RhdHVzTmFtZSh0cmltbWVkKSlcbiAgICByZXR1cm4ga25vd24gPz8gNTAwXG4gIH1cblxuICByZXR1cm4gNTAwXG59XG4iLAogICAgImV4cG9ydCBjb25zdCBwYXJzZUVycm9yID0gKGVycm9yOiB1bmtub3duKTogc3RyaW5nID0+IHtcbiAgbGV0IG1lc3NhZ2UgPSAnQW4gZXJyb3Igb2NjdXJyZWQnXG5cbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICBtZXNzYWdlID0gZXJyb3IubWVzc2FnZVxuICB9IGVsc2UgaWYgKGVycm9yICYmIHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgJ21lc3NhZ2UnIGluIGVycm9yKSB7XG4gICAgbWVzc2FnZSA9IGVycm9yLm1lc3NhZ2UgYXMgc3RyaW5nXG4gIH0gZWxzZSB7XG4gICAgbWVzc2FnZSA9IFN0cmluZyhlcnJvcilcbiAgfVxuXG4gIGNvbnNvbGUuZXJyb3IoYFBhcnNpbmcgZXJyb3I6ICR7bWVzc2FnZX1gKVxuXG4gIHJldHVybiBtZXNzYWdlXG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgTG9nTGV2ZWwsIE9wdGlvbnMsIFJlcXVlc3RJbmZvLCBTdG9yZURhdGEgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgbG9nVG9UcmFuc3BvcnRzIH0gZnJvbSAnLi4vb3V0cHV0J1xuaW1wb3J0IHsgbG9nVG9GaWxlIH0gZnJvbSAnLi4vb3V0cHV0L2ZpbGUnXG5pbXBvcnQgeyBwYXJzZUVycm9yIH0gZnJvbSAnLi4vdXRpbHMvZXJyb3InXG5cbmNvbnN0IGlzRXJyb3JXaXRoU3RhdHVzID0gKFxuICB2YWx1ZTogdW5rbm93blxuKTogdmFsdWUgaXMgeyBzdGF0dXM6IG51bWJlcjsgbWVzc2FnZT86IHN0cmluZyB9ID0+XG4gIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgdmFsdWUgIT09IG51bGwgJiZcbiAgJ3N0YXR1cycgaW4gdmFsdWUgJiZcbiAgdHlwZW9mICh2YWx1ZSBhcyB7IHN0YXR1cz86IHVua25vd24gfSkuc3RhdHVzID09PSAnbnVtYmVyJ1xuXG5leHBvcnQgY29uc3QgaGFuZGxlSHR0cEVycm9yID0gKFxuICByZXF1ZXN0OiBSZXF1ZXN0SW5mbyxcbiAgZXJyb3I6IHVua25vd24sXG4gIHN0b3JlOiBTdG9yZURhdGEsXG4gIG9wdGlvbnM6IE9wdGlvbnNcbik6IHZvaWQgPT4ge1xuICBjb25zdCBjb25maWcgPSBvcHRpb25zLmNvbmZpZ1xuICBjb25zdCB1c2VUcmFuc3BvcnRzT25seSA9IGNvbmZpZz8udXNlVHJhbnNwb3J0c09ubHkgPT09IHRydWVcbiAgY29uc3QgZGlzYWJsZUludGVybmFsTG9nZ2VyID0gY29uZmlnPy5kaXNhYmxlSW50ZXJuYWxMb2dnZXIgPT09IHRydWVcbiAgY29uc3QgZGlzYWJsZUZpbGVMb2dnaW5nID0gY29uZmlnPy5kaXNhYmxlRmlsZUxvZ2dpbmcgPT09IHRydWVcblxuICBjb25zdCBzdGF0dXMgPSBpc0Vycm9yV2l0aFN0YXR1cyhlcnJvcikgPyBlcnJvci5zdGF0dXMgOiA1MDBcbiAgY29uc3QgbWVzc2FnZSA9IHBhcnNlRXJyb3IoZXJyb3IpXG5cbiAgY29uc3QgbGV2ZWw6IExvZ0xldmVsID0gJ0VSUk9SJ1xuICBjb25zdCBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHsgc3RhdHVzLCBtZXNzYWdlLCBlcnJvciB9XG5cbiAgbG9nVG9UcmFuc3BvcnRzKHsgbGV2ZWwsIHJlcXVlc3QsIGRhdGEsIHN0b3JlLCBvcHRpb25zIH0pXG5cbiAgaWYgKCEodXNlVHJhbnNwb3J0c09ubHkgfHwgZGlzYWJsZUZpbGVMb2dnaW5nKSkge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gY29uZmlnPy5sb2dGaWxlUGF0aFxuICAgIGlmIChmaWxlUGF0aCkge1xuICAgICAgbG9nVG9GaWxlKHsgZmlsZVBhdGgsIGxldmVsLCByZXF1ZXN0LCBkYXRhLCBzdG9yZSwgb3B0aW9ucyB9KS5jYXRjaChcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIC8vIElnbm9yZSBlcnJvcnNcbiAgICAgICAgfVxuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIGlmICh1c2VUcmFuc3BvcnRzT25seSB8fCBkaXNhYmxlSW50ZXJuYWxMb2dnZXIpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnNvbGUuZXJyb3IoXG4gICAgYCR7bGV2ZWx9ICR7cmVxdWVzdC5tZXRob2R9ICR7bmV3IFVSTChyZXF1ZXN0LnVybCkucGF0aG5hbWV9ICR7bWVzc2FnZX1gXG4gIClc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RUFFOUMsRUFXQSxPQVRZLElBQUksR0FBTyxDQUNyQixLQUFNLGFBQ04sT0FBUSxDQUNOLFlBQ0UsNEVBQ0YsS0FBTSxDQUFDLFVBQVcsTUFBTSxDQUMxQixDQUNGLENBQUMsRUFJSSxNQUFNLFNBQVUsQ0FBTSxFQUN0QixNQUFNLE9BQVEsRUFBTyxJQUFJLEVBQ3pCLE1BQU0sYUFBYyxPQUFPLENBQUMsQ0FBQyxFQUM3QixRQUFRLEVBQUcsWUFBYSxDQUN2QixHQUFJLEVBQ0YsRUFBWSxFQUFRLENBQU8sRUFFOUIsRUFDQSxVQUFVLEVBQUcsV0FBWSxDQUN4QixFQUFNLFdBQWEsUUFBUSxPQUFPLE9BQU8sRUFDMUMsRUFDQSxjQUFjLEVBQUcsVUFBUyxNQUFLLFdBQVksQ0FDMUMsR0FBSSxFQUFhLElBQUksQ0FBTyxFQUMxQixPQUdGLElBQU0sRUFBUyxPQUFPLEVBQUksU0FBVyxTQUFXLEVBQUksT0FBUyxJQUN6RCxFQUFzQyxPQUMxQyxHQUFJLEdBQVUsSUFDWixFQUFRLFFBQ0gsUUFBSSxHQUFVLElBQ25CLEVBQVEsVUFHVixFQUFPLElBQUksRUFBTyxFQUFTLENBQUUsUUFBTyxFQUFHLENBQUssRUFDN0MsRUFDQSxRQUFRLEVBQUcsVUFBUyxRQUFPLFdBQVksQ0FDdEMsRUFBTyxnQkFBZ0IsRUFBUyxFQUFPLENBQUssRUFDN0MsRUFFQSxHQUFHLFFBQVEsR0FlSCIsCiAgImRlYnVnSWQiOiAiN0ZBRkVGMUUzNEJFRjAyNzY0NzU2RTIxNjQ3NTZFMjEiLAogICJuYW1lcyI6IFtdCn0=
package/package.json CHANGED
@@ -1,100 +1,52 @@
1
1
  {
2
2
  "name": "logixlysia",
3
- "version": "5.3.0",
3
+ "version": "6.0.0",
4
4
  "description": "🦊 Logixlysia is a logger for Elysia",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
7
- "module": "dist/index.js",
8
- "types": "dist/index.d.ts",
9
7
  "files": [
8
+ "src",
10
9
  "dist",
11
- "README.md",
12
- "LICENSE"
10
+ "README.md"
13
11
  ],
14
- "author": "PunGrumpy",
15
- "publisher": "PunGrumpy",
16
- "maintainers": [
17
- "PunGrumpy"
18
- ],
19
- "contributors": [
20
- {
21
- "name": "n0ky4",
22
- "url": "https://github.com/n0ky4"
23
- }
24
- ],
25
- "publishConfig": {
26
- "access": "public"
27
- },
28
- "license": "MIT",
29
12
  "scripts": {
30
- "lint": "ultracite lint",
31
- "format": "ultracite format",
32
- "test": "bun test --timeout 5000",
33
- "test:ci": "bun test --timeout 5000 --coverage --coverage-reporter=lcov",
34
- "dev": "cd website && bun dev",
35
- "prepare": "husky",
36
- "test:coverage": "bun test --timeout 5000 --coverage",
37
- "clean": "git clean -fdx",
13
+ "dev": "bunup --watch",
38
14
  "build": "bunup",
39
- "build:watch": "bunup --watch"
40
- },
41
- "os": [
42
- "darwin",
43
- "linux",
44
- "win32"
45
- ],
46
- "badges": [
47
- {
48
- "name": "npm",
49
- "url": "https://img.shields.io/npm/v/logixlysia.svg",
50
- "description": "npm version",
51
- "href": "https://www.npmjs.com/package/logixlysia"
52
- },
53
- {
54
- "name": "npm",
55
- "url": "https://img.shields.io/npm/dt/logixlysia.svg",
56
- "description": "npm downloads",
57
- "href": "https://www.npmjs.com/package/logixlysia"
58
- },
59
- {
60
- "name": "GitHub issues",
61
- "url": "https://img.shields.io/github/issues/PunGrumpy/logixlysia.svg",
62
- "description": "GitHub issues",
63
- "href": "https://github.com/PunGrumpy/logixlysia/issues"
64
- }
65
- ],
66
- "repository": {
67
- "type": "git",
68
- "url": "git+https://github.com/PunGrumpy/logixlysia.git"
15
+ "test": "bun test",
16
+ "test:coverage": "bun test --coverage --coverage-reporter=lcov",
17
+ "clean": "git clean -fdx .turbo dist node_modules coverage",
18
+ "typecheck": "tsc --noEmit --emitDeclarationOnly false"
69
19
  },
20
+ "author": "Noppakorn Kaewsalabnil <hello@pungrumpy.com>",
70
21
  "bugs": {
71
22
  "url": "https://github.com/PunGrumpy/logixlysia/issues"
72
23
  },
73
24
  "homepage": "https://logixlysia.vercel.app",
74
25
  "keywords": [
75
- "web",
76
- "logging",
77
- "logger",
78
- "elysia",
79
- "elysiajs",
80
26
  "logixlysia",
81
- "middleware"
27
+ "elysiajs",
28
+ "logger"
82
29
  ],
30
+ "license": "MIT",
31
+ "publishConfig": {
32
+ "access": "public",
33
+ "registry": "https://registry.npmjs.org/"
34
+ },
35
+ "repository": {
36
+ "type": "git",
37
+ "url": "git+https://github.com/PunGrumpy/logixlysia.git"
38
+ },
83
39
  "dependencies": {
84
40
  "chalk": "^5.6.2",
85
- "elysia": "^1.4.10",
86
- "pino": "^10.0.0",
87
- "pino-pretty": "^13.1.2"
41
+ "elysia": "^1.4.19",
42
+ "pino": "^10.1.0",
43
+ "pino-pretty": "^13.1.3"
88
44
  },
89
45
  "devDependencies": {
90
- "@biomejs/biome": "2.0.5",
91
- "bun-types": "^1.2.23",
92
- "bunup": "^0.14.20",
93
- "globals": "^16.4.0",
94
- "husky": "^9.1.7",
95
- "ultracite": "5.0.10"
46
+ "@types/bun": "^1.3.5",
47
+ "bunup": "^0.16.11"
96
48
  },
97
49
  "peerDependencies": {
98
- "typescript": "^5.2.2"
50
+ "typescript": "^5.9.3"
99
51
  }
100
52
  }