UNPKG

101 kBJavaScriptView Raw
1#!/usr/bin/env node
2var tt=Object.create;var O=Object.defineProperty,rt=Object.defineProperties,ot=Object.getOwnPropertyDescriptor,st=Object.getOwnPropertyDescriptors,it=Object.getOwnPropertyNames,le=Object.getOwnPropertySymbols,nt=Object.getPrototypeOf,ce=Object.prototype.hasOwnProperty,at=Object.prototype.propertyIsEnumerable;var pe=(e,t,o)=>t in e?O(e,t,{enumerable:!0,configurable:!0,writable:!0,value:o}):e[t]=o,b=(e,t)=>{for(var o in t||(t={}))ce.call(t,o)&&pe(e,o,t[o]);if(le)for(var o of le(t))at.call(t,o)&&pe(e,o,t[o]);return e},k=(e,t)=>rt(e,st(t)),ue=e=>O(e,"__esModule",{value:!0});var me=(e,t)=>{ue(e);for(var o in t)O(e,o,{get:t[o],enumerable:!0})},lt=(e,t,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of it(t))!ce.call(e,r)&&r!=="default"&&O(e,r,{get:()=>t[r],enumerable:!(o=ot(t,r))||o.enumerable});return e},c=e=>lt(ue(O(e!=null?tt(nt(e)):{},"default",e&&e.__esModule&&"default"in e?{get:()=>e.default,enumerable:!0}:{value:e,enumerable:!0})),e);me(exports,{registerRuntime:()=>W});var Ye=c(require("path")),et=c(require("sade"));var ct="presta",pt="0.43.9",ut="Hyper minimal framework for the modern web.",mt="./dist/index.js",ft="./dist/index.d.ts",dt={presta:"dist/bin.js"},gt=["dist"],ht={build:"node scripts/build && pnpx tsc --emitDeclarationOnly",cloc:"pnpm dlx cloc './lib/*.ts'",typecheck:"pnpx tsc --noEmit"},yt={type:"git",url:"git+ssh://git@github.com/sure-thing/presta.git"},bt="estrattonbailey",vt="MIT",xt={url:"https://github.com/sure-thing/presta/issues"},wt="https://github.com/sure-thing/presta#readme",Pt={chokidar:"^3.4.3","deep-extend":"^0.6.0",dotenv:"^10.0.0",esbuild:"^0.12.28","esbuild-register":"^2.6.0",filewatcher:"^3.0.1","fs-extra":"^9.0.1","get-port":"^5.1.1",kleur:"^4.1.4","mime-types":"^2.1.31","module-alias":"^2.2.2",ms:"^2.1.2",picomatch:"^2.3.0","query-string":"^6.14.1","raw-body":"^2.4.1",regexparam:"^1.3.0","route-sort":"^1.0.0",sade:"^1.7.3",sirv:"^1.0.7",statuses:"^2.0.1","tiny-glob":"^0.2.9","watch-dependency-graph":"^3.0.1",ws:"^8.4.0"},St={"@netlify/functions":"^0.7.2","@types/deep-extend":"^0.4.32","@types/fs-extra":"^9.0.12","@types/mime-types":"^2.1.0","@types/picomatch":"^2.2.4","@types/sade":"^1.7.3","@types/statuses":"^2.0.0","@types/ws":"^8.2.2",proxyquire:"^2.1.3","supertest-fetch":"^1.4.3",typescript:"^4.5.2"},fe={name:ct,version:pt,description:ut,main:mt,types:ft,bin:dt,files:gt,scripts:ht,repository:yt,author:bt,license:vt,bugs:xt,homepage:wt,dependencies:Pt,devDependencies:St};var Ge=c(require("fs-extra")),Je=c(require("path")),ae=c(require("chokidar"));var Z={};me(Z,{Levels:()=>w,colors:()=>D.default,debug:()=>h,error:()=>d,getLogs:()=>Ct,info:()=>y,logger:()=>F,newline:()=>kt,raw:()=>Rt,warn:()=>C});var D=c(require("kleur"));var v={PRODUCTION:"production",DEVELOPMENT:"development"};var w;(function(i){i.Debug="debug",i.Info="info",i.Warn="warn",i.Err="error"})(w||(w={}));var J=[],Et={[w.Debug]:"magenta",[w.Info]:"blue",[w.Warn]:"yellow",[w.Err]:"red"};function Ct(){if(!process.env.TESTING)throw new Error("Internal method was called outside test mode");return J}function F(e){if(process.env.TESTING)J.push(e);else{let t=process.env.PRESTA_DEBUG,o=process.env.PRESTA_ENV===v.PRODUCTION?"prod":"dev";if(!t&&e.level===w.Debug)return;console.log([D.default.gray(o),D.default[Et[e.level||"info"]](e.label),e.message,e.duration?D.default.gray("+"+e.duration):"",e.error?`
3
4${e.error.stack||e.error}
5
6`:""].filter(Boolean).join(" "))}}function h(e){F(b({level:w.Debug},e))}function y(e){F(b({level:w.Info},e))}function C(e){F(b({level:w.Warn},e))}function d(e){F(b({level:w.Err},e))}function Rt(...e){process.env.TESTING?J.push(e):console.log(...e)}function kt(){process.env.TESTING||console.log("")}var de=c(require("fs")),S=c(require("path")),ge=c(require("get-port"));var E="presta.config.js";function T(e){return(0,ge.default)({port:parseInt(e,10)})}function M(e,t=!1){let o=S.default.resolve(e||E);try{return delete require.cache[o],require(o)}catch(r){return de.default.existsSync(o)&&(d({label:"error",error:r}),t&&process.exit(1)),{}}}function j(e,t,o){let r=b({env:e,output:"build",assets:"public",plugins:[],port:4e3,files:[]},o);return t._.length&&(r.files=t._),t.output&&(r.output=t.output),t.assets&&(r.output=t.assets),t.port&&(r.port=t.port),r.files&&(r.files=[].concat(r.files).map(i=>S.default.resolve(process.cwd(),i))),r.output&&(r.output=S.default.resolve(process.cwd(),r.output)),r.assets&&(r.assets=S.default.resolve(process.cwd(),r.assets)),k(b({},r),{staticOutputDir:S.default.join(r.output,"static"),functionsOutputDir:S.default.join(r.output,"functions"),functionsManifest:S.default.join(r.output,"routes.json")})}var Y=c(require("fs-extra")),Ee=c(require("path")),Ce=c(require("watch-dependency-graph")),Re=c(require("chokidar")),ke=c(require("picomatch")),Oe=c(require("deep-extend"));var L=c(require("fs-extra")),ye=c(require("path")),be=c(require("route-sort"));function he(e){for(var t=5381,o=e.length;o;)t=t*33^e.charCodeAt(--o);return(t>>>0).toString(36)}function Ot(e){return e.replace(process.cwd(),"").split(".").reverse().slice(1).reverse().join("-").split("/").filter(Boolean).join("-")}function $(e,t){let o=e.map(s=>{try{let{route:n}=require(s),p=Ot(s),a=ye.default.join(t.functionsOutputDir,t.env===v.PRODUCTION?p+"-"+he(L.default.readFileSync(s,"utf8"))+".js":p+".js");return h({label:"debug",message:`generating ${p} lambda`}),delete require.cache[s],delete require.cache[a],L.default.outputFileSync(a,`import { wrapHandler } from 'presta/dist/wrapHandler';
7 import * as file from '${s}';
8 export const route = file.route
9 export const handler = wrapHandler(file)`),[n,a]}catch(n){d({label:"error",error:n})}}).filter(Boolean),r=(0,be.default)(o.map(s=>s[0])),i={};for(let s of r){let n=o.find(p=>p[0]===s);n&&(i[s]=n[1])}return L.default.outputFileSync(t.functionsManifest,JSON.stringify(i)),o}var K=c(require("fs-extra")),ve=c(require("path")),xe=c(require("tiny-glob/sync"));function H(e){return/export\s.+\sroute\s+\=/.test(K.default.readFileSync(e,"utf-8"))}function q(e){return/export\s.+\sgetStaticPaths/.test(K.default.readFileSync(e,"utf-8"))}function A(e){try{return[].concat(e).map(t=>(0,xe.default)(t)).flat().map(t=>ve.default.resolve(process.cwd(),t))}catch(t){return d({label:"paths",message:"no files found",error:t}),[]}}var X=c(require("fs-extra")),B=c(require("path")),Se=c(require("mime-types"));function P(){let e=process.hrtime();return()=>{let[t,o]=process.hrtime(e),r=o/1e6;return t<1?(r>=1?r.toFixed(0):r.toFixed(2))+"ms":t+"."+r.toFixed(0)+"s"}}var we=c(require("regexparam"));function Pe(e,t){let[o]=e.split("?"),r=(0,we.default)(t),i=0,s={},n=r.pattern.exec(o)||[];for(;i<r.keys.length;)s[r.keys[i]]=n[++i];return s}function Dt(e){return typeof e=="object"?JSON.stringify(e):e}function R(e){let{isBase64Encoded:t=!1,statusCode:o=200,headers:r={},multiValueHeaders:i={},body:s="",html:n=void 0,json:p=void 0,xml:a=void 0}=typeof e=="string"?{body:e}:e,l="text/html; charset=utf-8";return p?l="application/json; charset=utf-8":a&&(l="application/xml; charset=utf-8"),{isBase64Encoded:t,statusCode:o,headers:b({"Content-Type":l},r),multiValueHeaders:i,body:Dt(s||n||p||a||"")}}function N({port:e}){return`
10 <script>
11 (function (global) {
12 var socket = new WebSocket('ws://localhost:${e}');
13
14 socket.addEventListener('open', function (event) {
15 console.log('[presta] connected on port ${e}')
16 });
17
18 socket.addEventListener('message', function (event) {
19 console.log(\`'[presta] received \${event.data}\`)
20 if (event.data === 'refresh') {
21 global.location.reload();
22 }
23 });
24
25 socket.addEventListener('close', function () {
26 console.log('[presta] disconnected')
27 });
28 })(this);
29 <\/script>
30 `}function Ft(e,t="html"){return B.default.extname(e)?e:t==="html"?`${e}/index.html`:`${e}.${t}`}async function V(e){return h({label:"debug",message:`removing old static file ${e}`}),X.default.remove(e)}async function Ht(e){return Promise.all(e.map(V))}async function Bt(e,t,{footer:o}){let r=require(e),i=await r.getStaticPaths(),s=[];if(!i||!i.length)return s;for(let n of i){let p=P(),a={path:n,pathParameters:r.route?Pe(n,r.route):{}},l=R(await r.handler(a,{})),u=l.headers?l.headers["Content-Type"]:"",m=u&&Se.default.extension(u)||"html",g=Ft(n,m),x=l.body+o;X.default.outputFileSync(B.default.join(t,g),x,"utf-8"),y({label:"built",message:n,duration:p()}),s.push(g)}return s}async function _(e,t,o={}){let r=t.env===v.DEVELOPMENT,i=t.staticOutputDir,s=r?N({port:t.port}):"";for(let n of e)try{let p=n.replace(process.cwd(),""),a=o[n]||[],l=await Bt(n,i,{footer:s});if(!l||!l.length){C({label:"paths",message:`${p} - no paths to render`}),Ht(a.map(u=>B.default.join(i,u)));continue}for(let u of a)l.includes(u)||V(B.default.join(i,u));o[n]=l}catch(p){d({label:"error",error:p});break}return{staticFilesMap:o}}function De(e,t){let o=P();$(e,t),e.length&&y({label:"built",message:"lambdas",duration:o()})}function It(e,t,o){return(0,ke.default)(t)(e)&&!o.includes(e)}async function Fe(e,t){let o={},r=A(e.files);r.length||C({label:"paths",message:"no files configured"});async function i(a,l,u){if(delete require.cache[a],q(a)){let m=await _([a],u,o);o=(0,Oe.default)({},o,m.staticFilesMap)}De(l.filter(H),u)}async function s(a,l,u){for(let m of a)await i(m,l,u)}await s(r,r,e),t.emitBrowserRefresh();let n=(0,Ce.create)({alias:{"@":process.cwd()}});n.onChange(async a=>{await s(a,r,e),t.emitBrowserRefresh()}),n.onRemove(async([a])=>{h({label:"watch",message:`removed ${a}`}),r.splice(r.indexOf(a),1),De(r.filter(H),e),(o[a]||[]).forEach(l=>V(Ee.default.join(e.staticOutputDir,l))),t.emitBrowserRefresh()}),n.onError(a=>{d({label:"error",error:typeof a=="string"?new Error(a):a})}),await n.add(r);let p=Re.default.watch(process.cwd(),{ignoreInitial:!0,ignored:[e.output,e.assets]});return p.on("add",async a=>{!Y.default.existsSync(a)||Y.default.lstatSync(a).isDirectory()||!It(a,e.files,r)||(h({label:"watch",message:`add ${a}`}),r.push(a),await n.add(a),await i(a,r,e),t.emitBrowserRefresh())}),t.onBuildFile(async({file:a})=>{await i(a,r,e),t.emitBrowserRefresh()}),{async close(){await n.close(),await p.close()}}}async function U(e,t,o){let r=await Promise.all(e.map(i=>{try{return i(t,o)}catch(s){d({label:"error",error:s})}}).filter(Boolean));return{async cleanup(){return Promise.all(r.map(i=>i&&i.cleanup&&i.cleanup()))}}}var He;(function(r){r.PostBuild="post-build",r.BuildFile="build-file",r.BrowserRefresh="browser-refresh"})(He||(He={}));function z(){let e={};function t(s,...n){e[s]&&e[s].map(p=>p(...n))}function o(s,n){return e[s]=e[s]?e[s].concat(n):[n],()=>e[s].splice(e[s].indexOf(n),1)}function r(){e={}}function i(s){return e[s]||[]}return{emit:t,on:o,clear:r,listeners:i}}function Q(e){return{emitPostBuild(t){e.emit("postBuild",t)},onPostBuild(t){return e.on("postBuild",t)},emitBuildFile(t){e.emit("buildFile",t)},onBuildFile(t){return e.on("buildFile",t)},emitBrowserRefresh(){e.emit("browserRefresh")},onBrowserRefresh(t){return e.on("browserRefresh",t)}}}var Be=c(require("path")),re=c(require("fs-extra")),Ie=c(require("esbuild"));function ee(e){return delete require.cache[e],require(e)}function te(e){try{return ee(e)}catch(t){return{}}}async function Te(e,t){let o=P(),r=A(e.files),i=r.filter(q),s=r.filter(H);if(h({label:"build",message:"starting build"}),!i.length&&!s.length)C({label:"files",message:"no files were found, nothing to build"});else{let n="",p=0,a="",l="",u=await Promise.allSettled([(async()=>{if(i.length){let m=P(),{staticFilesMap:g}=await _(i,e);n=m(),p=Object.keys(g).reduce((x,G)=>x+=g[G].length,0)}})(),(async()=>{if(s.length){let m=P(),g=te(Be.default.join(process.cwd(),"package.json"));$(s,e),await(0,Ie.build)({entryPoints:Object.values(require(e.functionsManifest)),outdir:e.functionsOutputDir,platform:"node",target:["node12"],minify:!0,allowOverwrite:!0,external:Object.keys(g.dependencies||{}),bundle:!0,define:{"process.env.PRESTA_SERVERLESS_RUNTIME":"true"}}),a=m()}})(),(async()=>{if(re.default.existsSync(e.assets)){let m=P();re.default.copySync(e.assets,e.staticOutputDir),l=m()}})()]);if(u.find(m=>m.status==="rejected"))throw h({label:"build",message:"build partially failed"}),u.forEach(m=>{m.status==="rejected"&&d({label:"error",error:m.reason})}),new Error("presta build failed");n&&y({label:"static",message:`rendered ${p} file(s)`,duration:n}),a&&y({label:"lambda",message:`compiled ${s.length} function(s)`,duration:a}),l&&y({label:"assets",message:`copied in ${l}`}),t.emitPostBuild({output:e.output,staticOutput:e.staticOutputDir,functionsOutput:e.functionsOutputDir,functionsManifest:te(e.functionsManifest)}),(n||a)&&y({label:"complete",message:`in ${o()}`})}}var Ue=c(require("http")),se=c(require("sirv")),ze=c(require("mime-types")),Qe=c(require("regexparam")),ie=c(require("statuses")),We=c(require("ws"));var oe=c(require("statuses"));function Me({statusCode:e}){return`<!-- built with presta https://npm.im/presta -->
31 <!DOCTYPE html>
32 <html>
33 <head>
34 <meta charset="UTF-8" />
35 <meta name="viewport" content="width=device-width,initial-scale=1" />
36 <title>${e} \u2014\xA0${oe.default.message[e]}</title>
37 <link rel="icon" type="image/png" href="https://presta.run/favicon.png">
38 <link rel="icon" type="image/svg" href="https://presta.run/favicon.svg">
39 <link rel="preconnect" href="https://fonts.googleapis.com">
40 <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
41 <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;900&display=swap" rel="stylesheet">
42 <link rel='stylesheet' href='https://unpkg.com/svbstrate@5.1.0/svbstrate.css' />
43 <style>
44 html,body {
45 font-family: 'Inter', 'sans-serif';
46 color: #23283D;
47 background-color: #DADEF0;
48 }
49 #favicon {
50 fill: #23283D;
51 }
52 @media (prefers-color-scheme: dark) {
53 html,body {
54 color: #DADEF0;
55 background-color: #23283D;
56 }
57 #favicon {
58 fill: #DADEF0;
59 }
60 }
61 </style>
62 </head>
63 <body class='w f aic jcc' style='height: 100vh'>
64 <div class='p12 tac'>
65 <h1>${e}</h1>
66 <p class='mb1'>${oe.default.message[e]}</p>
67
68 <svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
69 <g clip-path="url(#a)">
70 <path id="favicon" fill-rule="evenodd" clip-rule="evenodd" d="M10.4 7c-.3 0-.8.2-1 .5L1.1 22.1c-.2.3 0 .6.3.6l4 .3-2.1 2.6c-.2.3-.1.6.2.6l16.8 1.3c.4 0 .8-.2 1-.4L32 13.9c.2-.2.1-.5-.2-.5l-6.4-.5 2.2-4c.2-.3 0-.5-.3-.6L10.4 7ZM24 12.8l1.9-3.4-15.5-1.2-7.7 13.4 3.6.3 7.5-9.4c.3-.3.7-.5 1-.4l9.2.7ZM7.6 22l7.1-8.9 8.7.7-5.2 9L7.6 22Zm-1 1.1 11.6 1c.3 0 .8-.3 1-.6l5.5-9.6 5.5.5-9.7 12L5 25.2l1.7-2Z" fill="#23283D"/>
71 </g>
72 <defs>
73 <clipPath id="a">
74 <path fill="#fff" d="M0 0h32v32H0z"/>
75 </clipPath>
76 </defs>
77 </svg>
78 </div>
79 </body>
80 </html>
81 `}var qe=c(require("url")),Ae=c(require("raw-body")),Ne=c(require("mime-types"));function je(e){let t={},o={};for(let r of Object.keys(e)){let i=r.toLowerCase(),s=e[r];!s||(Array.isArray(s)?o[i]=s:t[i]=s)}return{headers:t,multiValueHeaders:o}}var Le=c(require("query-string"));function $e(e){let t=(0,Le.parse)(e,{arrayFormat:"comma"}),o={},r={};for(let i of Object.keys(t)){let s=t[i];Array.isArray(s)?r[i]=s:s&&(o[i]=s)}return{queryStringParameters:o,multiValueQueryStringParameters:r}}var Tt=/image|audio|video|application\/pdf|application\/zip|applicaton\/octet-stream/i;function Mt(e){return Boolean(e)&&Tt.test(e)}async function Ve(e){let{url:t="",method:o}=e,{headers:r,multiValueHeaders:i}=je(e.headers),s=Mt(r["content-type"]||""),p=r["content-length"]?await(0,Ae.default)(e,{limit:"1mb",encoding:r["content-type"]&&Ne.default.charset(r["content-type"])||!0}):void 0,a=(0,qe.parse)(t).query||"",{queryStringParameters:l,multiValueQueryStringParameters:u}=$e(a);return{rawUrl:t,path:t,httpMethod:o,headers:r,multiValueHeaders:i,rawQuery:a,queryStringParameters:l,multiValueQueryStringParameters:u,body:p?Buffer.from(p).toString(s?"base64":"utf8"):null,isBase64Encoded:s,pathParameters:{}}}function _e(e,t){let o=R(t);for(let r in t.multiValueHeaders)e.setHeader(r,String(t.multiValueHeaders[r]));for(let r in t.headers)e.setHeader(r,String(t.headers[r]));e.statusCode=o.statusCode,e.write(o.body),e.end()}function jt(e,t){let o=new Error(t);return o.statusCode=e,o}function Lt(e){let t=((e==null?void 0:e.headers)||{})["Content-Type"]||"html";return t&&ze.default.extension(String(t))||"html"}function $t(e,t){let r=Object.keys(t).map(i=>({matcher:(0,Qe.default)(i),route:i})).filter(({matcher:i})=>i.pattern.test(e.split("?")[0])).map(({route:i})=>t[i])[0];return r?require(r):void 0}async function qt(e,t){let o=e.headers.Accept||e.headers.accept,r=o&&o.includes("json");try{if(!t||!t.handler)throw jt(404,"");return R(await t.handler(e,{awsRequestId:"presta dev"}))}catch(i){let s=i,{statusCode:n=500}=s;return n>499&&d({label:"error",message:s.message||ie.default.message[n],error:s}),R({statusCode:n,html:r?void 0:Me({statusCode:n}),json:r?{detail:ie.default.message[n]}:void 0})}}function At({port:e,config:t}){return async function(r,i){var g;let s=P(),n=await Ve(r),p=ee(t.functionsManifest),a=$t(n.path,p),l=await qt(n,a),u=l.statusCode>299&&l.statusCode<399;Lt(l)==="html"&&(l.body=(l.body||"").split("</body>")[0]+N({port:e})),Z[l.statusCode<299?"info":"error"]({label:"serve",message:`${l.statusCode} ${u&&((g=l==null?void 0:l.headers)==null?void 0:g.Location)||n.path}`,duration:s()}),_e(i,l)}}function Nt({port:e,config:t}){let o=t.staticOutputDir,r=t.assets;return async function(s,n){let p=P(),a=s.url;h({label:"debug",message:`handling ${a}`});function l(u,m){y({label:"serve",message:`${u.statusCode} ${m}`,duration:p()})}(0,se.default)(r,{dev:!0,setHeaders:l})(s,n,()=>{(0,se.default)(o,{dev:!0,setHeaders:l})(s,n,async()=>{At({port:e,config:t})(s,n)})})}}function ne(e,t){let o=e.port,r=Ue.default.createServer(Nt({port:o,config:e})).listen(o),i=new We.WebSocketServer({server:r}),s=[];return r.on("connection",n=>{s.push(n),n.on("close",()=>s.splice(s.indexOf(n),1))}),t.onBrowserRefresh(()=>{h({label:"debug",message:"refresh event received"}),i.clients.forEach(n=>n.send("refresh"))}),{async close(){await new Promise(n=>{r.close(()=>n(1)),s.forEach(p=>p.destroy())})}}}async function Ze(e){let t=M(e.config,!0),o=await T(e.port||t.port||4e3),r=z(),i=Q(r),s=j(v.PRODUCTION,k(b({},e),{port:o}),t);await U(s.plugins,s,i),Ge.default.emptyDirSync(s.output),y({label:"build"}),await Te(s,i)}async function Ke(e){let t=e["no-serve"],o,r,i=!1;async function s(){let p,a,l,u=M(e.config);(!r||u.port&&r!==u.port)&&(r=await T(e.port||u.port||4e3),process.env.PRESTA_SERVE_URL=`http://localhost:${r}`);let m=z(),g=Q(m),x=j(v.DEVELOPMENT,k(b({},e),{port:r}),u),G=await U(x.plugins,x,g);return h({label:"debug",message:`config created ${JSON.stringify(x)}`}),t||(a=ne(x,g),l=ae.default.watch(x.assets,{ignoreInitial:!0}).on("all",()=>{g.emitBrowserRefresh()})),y({label:i?"restart":"start",message:t?"":`http://localhost:${x.port}`}),p=await Fe(x,g),{config:x,async close(){m.clear(),await G.cleanup(),await l.close(),await p.close(),a&&await a.close()}}}let n=ae.default.watch(Je.default.resolve(e.config||E),{ignoreInitial:!0}).on("all",async()=>{if(!i){i=!0;try{await o.close()}catch(p){console.error(p)}console.clear(),o=await s(),i=!1}});return o=await s(),{async close(){await n.close(),await o.close()}}}async function Xe(e){let t=M(e.config,!0),o=await T(e.port||t.port||4e3),r=z(),i=Q(r),s=j(v.PRODUCTION,k(b({},e),{port:o}),t);await U(s.plugins,s,i),ne(s,i),y({label:"serve",message:`http://localhost:${s.port}`})}function W(e={}){require("dotenv").config({path:Ye.default.join(process.cwd(),".env")}),require("module-alias").addAliases({"@":process.cwd(),"presta:internal":__dirname}),require("esbuild-register/dist/node").register(e)}var I=(0,et.default)("presta");I.version(fe.version).option("--config, -c",`Path to a config file. (default ${E})`).option("--output, -o","Specify output directory for built files. (default ./build)").option("--assets, -a","Specify static asset directory. (default ./public)").option("--debug, -d","Enable debug mode (prints more logs)").example("dev index.jsx -o dist").example("dev 'pages/*.tsx' -o static").example("'pages/*.tsx'").example("-c site.json").example("serve -p 8080");I.command("build","Build project to output directory.",{default:!0}).example("").example("files/**/*.js").example(`-c ${E}`).action(e=>{process.env.PRESTA_ENV=v.PRODUCTION,process.env.PRESTA_DEBUG=e.debug?"debug":"",console.clear(),W(),Ze(e)});I.command("dev","Start Presta dev server and watch files",{alias:"watch"}).option("--port, -p","Port to run the local server. (default 4000)").option("--no-serve, -n","Do not run local dev server. (default false)").describe("Watch project and build to output directory.").example("dev").example("dev ./files/**/*.js").example("dev ./files/**/*.js -o ./out").example(`dev -c ${E}`).action(e=>{process.env.PRESTA_ENV=v.DEVELOPMENT,process.env.PRESTA_DEBUG=e.debug?"debug":"",console.clear(),W(),Ke(e)});I.command("serve").option("--port, -p","Port to run the local server. (default 4000)").describe("Serve built files, lambdas, and static assets.").example("serve").example("serve -o ./out -p 8080").example(`serve -c ${E}`).action(async e=>{process.env.PRESTA_ENV=v.DEVELOPMENT,process.env.PRESTA_DEBUG=e.debug?"debug":"",console.clear(),W(),Xe(e)});I.parse(process.argv);0&&(module.exports={registerRuntime});
82//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vbGliL2Jpbi50cyIsICIuLi9saWIvY2xpLnRzIiwgIi4uL2xpYi9sb2cudHMiLCAiLi4vbGliL2NvbnN0YW50cy50cyIsICIuLi9saWIvY29uZmlnLnRzIiwgIi4uL2xpYi93YXRjaC50cyIsICIuLi9saWIvb3V0cHV0TGFtYmRhcy50cyIsICIuLi9saWIvaGFzaENvbnRlbnQudHMiLCAiLi4vbGliL2dldEZpbGVzLnRzIiwgIi4uL2xpYi9yZW5kZXJTdGF0aWNFbnRyaWVzLnRzIiwgIi4uL2xpYi90aW1lci50cyIsICIuLi9saWIvZ2V0Um91dGVQYXJhbXMudHMiLCAiLi4vbGliL25vcm1hbGl6ZVJlc3BvbnNlLnRzIiwgIi4uL2xpYi9saXZlUmVsb2FkU2NyaXB0LnRzIiwgIi4uL2xpYi9wbHVnaW5zLnRzIiwgIi4uL2xpYi9jcmVhdGVFbWl0dGVyLnRzIiwgIi4uL2xpYi9idWlsZC50cyIsICIuLi9saWIvdXRpbHMudHMiLCAiLi4vbGliL3NlcnZlLnRzIiwgIi4uL2xpYi9jcmVhdGVEZWZhdWx0SHRtbFJlc3BvbnNlLnRzIiwgIi4uL2xpYi9yZXF1ZXN0VG9FdmVudC50cyIsICIuLi9saWIvbm9ybWFsaXplSGVhZGVycy50cyIsICIuLi9saWIvcGFyc2VRdWVyeVN0cmluZ1BhcmFtZXRlcnMudHMiLCAiLi4vbGliL3NlbmRTZXJ2ZXJsZXNzUmVzcG9uc2UudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIiMhL3Vzci9iaW4vZW52IG5vZGVcblxuaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcbmltcG9ydCBzYWRlIGZyb20gJ3NhZGUnXG5cbmltcG9ydCBwa2cgZnJvbSAnLi4vcGFja2FnZS5qc29uJ1xuXG5pbXBvcnQgeyBidWlsZENvbW1hbmQsIGRldkNvbW1hbmQsIHNlcnZlQ29tbWFuZCB9IGZyb20gJy4vY2xpJ1xuaW1wb3J0IHsgZGVmYXVsdENvbmZpZ0ZpbGVwYXRoIH0gZnJvbSAnLi9jb25maWcnXG5pbXBvcnQgeyBFbnYgfSBmcm9tICcuL2NvbnN0YW50cydcblxuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyUnVudGltZShvcHRpb25zID0ge30pIHtcbiAgcmVxdWlyZSgnZG90ZW52JykuY29uZmlnKHsgcGF0aDogcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICcuZW52JykgfSlcblxuICByZXF1aXJlKCdtb2R1bGUtYWxpYXMnKS5hZGRBbGlhc2VzKHtcbiAgICAnQCc6IHByb2Nlc3MuY3dkKCksXG4gICAgJ3ByZXN0YTppbnRlcm5hbCc6IF9fZGlybmFtZSwgLy8gVE9ETyB3aGVyZXZlciB0aGlzIGlzIHJ1bm5pbmcgZnJvbVxuICB9KVxuXG4gIHJlcXVpcmUoJ2VzYnVpbGQtcmVnaXN0ZXIvZGlzdC9ub2RlJykucmVnaXN0ZXIob3B0aW9ucylcbn1cblxuY29uc3QgcHJvZ3JhbSA9IHNhZGUoJ3ByZXN0YScpXG5cbnByb2dyYW1cbiAgLnZlcnNpb24ocGtnLnZlcnNpb24pXG4gIC8vIGRvIG5vdCBwcm92aWRlIGRlZmF1bHQgY29uZmlnIGhlcmVcbiAgLm9wdGlvbignLS1jb25maWcsIC1jJywgYFBhdGggdG8gYSBjb25maWcgZmlsZS4gIChkZWZhdWx0ICR7ZGVmYXVsdENvbmZpZ0ZpbGVwYXRofSlgKVxuICAub3B0aW9uKCctLW91dHB1dCwgLW8nLCBgU3BlY2lmeSBvdXRwdXQgZGlyZWN0b3J5IGZvciBidWlsdCBmaWxlcy4gIChkZWZhdWx0IC4vYnVpbGQpYClcbiAgLm9wdGlvbignLS1hc3NldHMsIC1hJywgYFNwZWNpZnkgc3RhdGljIGFzc2V0IGRpcmVjdG9yeS4gIChkZWZhdWx0IC4vcHVibGljKWApXG4gIC5vcHRpb24oJy0tZGVidWcsIC1kJywgYEVuYWJsZSBkZWJ1ZyBtb2RlIChwcmludHMgbW9yZSBsb2dzKWApXG4gIC5leGFtcGxlKGBkZXYgaW5kZXguanN4IC1vIGRpc3RgKVxuICAuZXhhbXBsZShgZGV2ICdwYWdlcy8qLnRzeCcgLW8gc3RhdGljYClcbiAgLmV4YW1wbGUoYCdwYWdlcy8qLnRzeCdgKVxuICAuZXhhbXBsZShgLWMgc2l0ZS5qc29uYClcbiAgLmV4YW1wbGUoYHNlcnZlIC1wIDgwODBgKVxuXG5wcm9ncmFtXG4gIC5jb21tYW5kKCdidWlsZCcsICdCdWlsZCBwcm9qZWN0IHRvIG91dHB1dCBkaXJlY3RvcnkuJywgeyBkZWZhdWx0OiB0cnVlIH0pXG4gIC5leGFtcGxlKGBgKVxuICAuZXhhbXBsZShgZmlsZXMvKiovKi5qc2ApXG4gIC5leGFtcGxlKGAtYyAke2RlZmF1bHRDb25maWdGaWxlcGF0aH1gKVxuICAuYWN0aW9uKChvcHRpb25zKSA9PiB7XG4gICAgcHJvY2Vzcy5lbnYuUFJFU1RBX0VOViA9IEVudi5QUk9EVUNUSU9OXG4gICAgcHJvY2Vzcy5lbnYuUFJFU1RBX0RFQlVHID0gb3B0aW9ucy5kZWJ1ZyA/ICdkZWJ1ZycgOiAnJ1xuICAgIGNvbnNvbGUuY2xlYXIoKVxuICAgIHJlZ2lzdGVyUnVudGltZSgpXG4gICAgYnVpbGRDb21tYW5kKG9wdGlvbnMpXG4gIH0pXG5cbnByb2dyYW1cbiAgLmNvbW1hbmQoJ2RldicsICdTdGFydCBQcmVzdGEgZGV2IHNlcnZlciBhbmQgd2F0Y2ggZmlsZXMnLCB7IGFsaWFzOiAnd2F0Y2gnIH0pXG4gIC5vcHRpb24oJy0tcG9ydCwgLXAnLCBgUG9ydCB0byBydW4gdGhlIGxvY2FsIHNlcnZlci4gIChkZWZhdWx0IDQwMDApYClcbiAgLm9wdGlvbignLS1uby1zZXJ2ZSwgLW4nLCBgRG8gbm90IHJ1biBsb2NhbCBkZXYgc2VydmVyLiAgKGRlZmF1bHQgZmFsc2UpYClcbiAgLmRlc2NyaWJlKCdXYXRjaCBwcm9qZWN0IGFuZCBidWlsZCB0byBvdXRwdXQgZGlyZWN0b3J5LicpXG4gIC5leGFtcGxlKGBkZXZgKVxuICAuZXhhbXBsZShgZGV2IC4vZmlsZXMvKiovKi5qc2ApXG4gIC5leGFtcGxlKGBkZXYgLi9maWxlcy8qKi8qLmpzIC1vIC4vb3V0YClcbiAgLmV4YW1wbGUoYGRldiAtYyAke2RlZmF1bHRDb25maWdGaWxlcGF0aH1gKVxuICAuYWN0aW9uKChvcHRpb25zKSA9PiB7XG4gICAgcHJvY2Vzcy5lbnYuUFJFU1RBX0VOViA9IEVudi5ERVZFTE9QTUVOVFxuICAgIHByb2Nlc3MuZW52LlBSRVNUQV9ERUJVRyA9IG9wdGlvbnMuZGVidWcgPyAnZGVidWcnIDogJydcbiAgICBjb25zb2xlLmNsZWFyKClcbiAgICByZWdpc3RlclJ1bnRpbWUoKVxuICAgIGRldkNvbW1hbmQob3B0aW9ucylcbiAgfSlcblxucHJvZ3JhbVxuICAuY29tbWFuZCgnc2VydmUnKVxuICAub3B0aW9uKCctLXBvcnQsIC1wJywgYFBvcnQgdG8gcnVuIHRoZSBsb2NhbCBzZXJ2ZXIuICAoZGVmYXVsdCA0MDAwKWApXG4gIC5kZXNjcmliZSgnU2VydmUgYnVpbHQgZmlsZXMsIGxhbWJkYXMsIGFuZCBzdGF0aWMgYXNzZXRzLicpXG4gIC5leGFtcGxlKGBzZXJ2ZWApXG4gIC5leGFtcGxlKGBzZXJ2ZSAtbyAuL291dCAtcCA4MDgwYClcbiAgLmV4YW1wbGUoYHNlcnZlIC1jICR7ZGVmYXVsdENvbmZpZ0ZpbGVwYXRofWApXG4gIC5hY3Rpb24oYXN5bmMgKG9wdGlvbnMpID0+IHtcbiAgICBwcm9jZXNzLmVudi5QUkVTVEFfRU5WID0gRW52LkRFVkVMT1BNRU5UXG4gICAgcHJvY2Vzcy5lbnYuUFJFU1RBX0RFQlVHID0gb3B0aW9ucy5kZWJ1ZyA/ICdkZWJ1ZycgOiAnJ1xuICAgIGNvbnNvbGUuY2xlYXIoKVxuICAgIHJlZ2lzdGVyUnVudGltZSgpXG4gICAgc2VydmVDb21tYW5kKG9wdGlvbnMpXG4gIH0pXG5cbnByb2dyYW0ucGFyc2UocHJvY2Vzcy5hcmd2KVxuIiwgImltcG9ydCBmcyBmcm9tICdmcy1leHRyYSdcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXG5pbXBvcnQgY2hva2lkYXIgZnJvbSAnY2hva2lkYXInXG5cbmltcG9ydCAqIGFzIGxvZ2dlciBmcm9tICcuL2xvZydcbmltcG9ydCB7IE9wdGlvbnMsIGNyZWF0ZSwgZ2V0Q29uZmlnRmlsZSwgZGVmYXVsdENvbmZpZ0ZpbGVwYXRoLCBnZXRBdmFpbGFibGVQb3J0IH0gZnJvbSAnLi9jb25maWcnXG5pbXBvcnQgeyB3YXRjaCB9IGZyb20gJy4vd2F0Y2gnXG5pbXBvcnQgeyBpbml0UGx1Z2lucyB9IGZyb20gJy4vcGx1Z2lucydcbmltcG9ydCB7IGNyZWF0ZUVtaXR0ZXIsIGNyZWF0ZUhvb2tzIH0gZnJvbSAnLi9jcmVhdGVFbWl0dGVyJ1xuaW1wb3J0IHsgYnVpbGQgfSBmcm9tICcuL2J1aWxkJ1xuaW1wb3J0IHsgc2VydmUgfSBmcm9tICcuL3NlcnZlJ1xuaW1wb3J0IHsgRW52IH0gZnJvbSAnLi9jb25zdGFudHMnXG5cbmV4cG9ydCB0eXBlIFByZXN0YUNMSU9wdGlvbnMgPSB7XG4gIGNvbmZpZz86IHN0cmluZ1xuICBvdXRwdXQ/OiBzdHJpbmdcbiAgZGVidWc/OiBib29sZWFuXG59ICYgUGFydGlhbDxPcHRpb25zPlxuXG5leHBvcnQgdHlwZSBQcmVzdGFDTElCdWlsZE9wdGlvbnMgPSBQcmVzdGFDTElPcHRpb25zICYge1xuICBfOiBzdHJpbmdbXVxufVxuXG5leHBvcnQgdHlwZSBQcmVzdGFDTElTZXJ2ZU9wdGlvbnMgPSBQcmVzdGFDTElCdWlsZE9wdGlvbnMgJiB7XG4gIHBvcnQ/OiBzdHJpbmdcbiAgJ25vLXNlcnZlJzogYm9vbGVhblxufVxuXG5leHBvcnQgdHlwZSBQcmVzdGFDTElEZXZPcHRpb25zID0gUHJlc3RhQ0xJU2VydmVPcHRpb25zXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZENvbW1hbmQob3B0aW9uczogUHJlc3RhQ0xJQnVpbGRPcHRpb25zKSB7XG4gIGNvbnN0IGNvbmZpZ0ZpbGUgPSBnZXRDb25maWdGaWxlKG9wdGlvbnMuY29uZmlnLCB0cnVlKVxuICBjb25zdCBwb3J0ID0gYXdhaXQgZ2V0QXZhaWxhYmxlUG9ydChvcHRpb25zLnBvcnQgfHwgY29uZmlnRmlsZS5wb3J0IHx8IDQwMDApXG5cbiAgY29uc3QgZW1pdHRlciA9IGNyZWF0ZUVtaXR0ZXIoKVxuICBjb25zdCBob29rcyA9IGNyZWF0ZUhvb2tzKGVtaXR0ZXIpXG4gIGNvbnN0IGNvbmZpZyA9IGNyZWF0ZShFbnYuUFJPRFVDVElPTiwgeyAuLi5vcHRpb25zLCBwb3J0IH0sIGNvbmZpZ0ZpbGUpXG4gIGF3YWl0IGluaXRQbHVnaW5zKGNvbmZpZy5wbHVnaW5zLCBjb25maWcsIGhvb2tzKVxuXG4gIGZzLmVtcHR5RGlyU3luYyhjb25maWcub3V0cHV0KVxuXG4gIGxvZ2dlci5pbmZvKHtcbiAgICBsYWJlbDogJ2J1aWxkJyxcbiAgfSlcblxuICBhd2FpdCBidWlsZChjb25maWcsIGhvb2tzKVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGV2Q29tbWFuZChvcHRpb25zOiBQcmVzdGFDTElEZXZPcHRpb25zKSB7XG4gIGNvbnN0IG5vU2VydmUgPSBvcHRpb25zWyduby1zZXJ2ZSddXG4gIGxldCBkZXZTZXJ2ZXI6IGFueVxuICBsZXQgcG9ydDogbnVtYmVyXG4gIGxldCByZXN0YXJ0aW5nID0gZmFsc2VcblxuICBhc3luYyBmdW5jdGlvbiBzdGFydERldlNlcnZlcigpIHtcbiAgICBsZXQgd2F0Y2hUYXNrOiBhbnlcbiAgICBsZXQgaHR0cFNlcnZlcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2VydmU+XG4gICAgbGV0IHN0YXRpY0Fzc2V0V2F0Y2hlcjogUmV0dXJuVHlwZTx0eXBlb2YgY2hva2lkYXIud2F0Y2g+XG5cbiAgICBjb25zdCB1c2VyQ29uZmlnRmlsZSA9IGdldENvbmZpZ0ZpbGUob3B0aW9ucy5jb25maWcpXG5cbiAgICBpZiAoIXBvcnQgfHwgKHVzZXJDb25maWdGaWxlLnBvcnQgJiYgcG9ydCAhPT0gdXNlckNvbmZpZ0ZpbGUucG9ydCkpIHtcbiAgICAgIHBvcnQgPSBhd2FpdCBnZXRBdmFpbGFibGVQb3J0KG9wdGlvbnMucG9ydCB8fCB1c2VyQ29uZmlnRmlsZS5wb3J0IHx8IDQwMDApXG4gICAgICBwcm9jZXNzLmVudi5QUkVTVEFfU0VSVkVfVVJMID0gYGh0dHA6Ly9sb2NhbGhvc3Q6JHtwb3J0fWBcbiAgICB9XG5cbiAgICBjb25zdCBlbWl0dGVyID0gY3JlYXRlRW1pdHRlcigpXG4gICAgY29uc3QgaG9va3MgPSBjcmVhdGVIb29rcyhlbWl0dGVyKVxuICAgIGNvbnN0IGNvbmZpZyA9IGNyZWF0ZShFbnYuREVWRUxPUE1FTlQsIHsgLi4ub3B0aW9ucywgcG9ydCB9LCB1c2VyQ29uZmlnRmlsZSlcbiAgICBjb25zdCBwbHVnaW5zID0gYXdhaXQgaW5pdFBsdWdpbnMoY29uZmlnLnBsdWdpbnMsIGNvbmZpZywgaG9va3MpXG5cbiAgICBsb2dnZXIuZGVidWcoe1xuICAgICAgbGFiZWw6ICdkZWJ1ZycsXG4gICAgICBtZXNzYWdlOiBgY29uZmlnIGNyZWF0ZWQgJHtKU09OLnN0cmluZ2lmeShjb25maWcpfWAsXG4gICAgfSlcblxuICAgIGlmICghbm9TZXJ2ZSkge1xuICAgICAgaHR0cFNlcnZlciA9IHNlcnZlKGNvbmZpZywgaG9va3MpXG5cbiAgICAgIHN0YXRpY0Fzc2V0V2F0Y2hlciA9IGNob2tpZGFyLndhdGNoKGNvbmZpZy5hc3NldHMsIHsgaWdub3JlSW5pdGlhbDogdHJ1ZSB9KS5vbignYWxsJywgKCkgPT4ge1xuICAgICAgICBob29rcy5lbWl0QnJvd3NlclJlZnJlc2goKVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBsb2dnZXIuaW5mbyh7XG4gICAgICBsYWJlbDogcmVzdGFydGluZyA/ICdyZXN0YXJ0JyA6ICdzdGFydCcsXG4gICAgICBtZXNzYWdlOiAhbm9TZXJ2ZSA/IGBodHRwOi8vbG9jYWxob3N0OiR7Y29uZmlnLnBvcnR9YCA6ICcnLFxuICAgIH0pXG5cbiAgICB3YXRjaFRhc2sgPSBhd2FpdCB3YXRjaChjb25maWcsIGhvb2tzKVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbmZpZyxcbiAgICAgIGFzeW5jIGNsb3NlKCkge1xuICAgICAgICBlbWl0dGVyLmNsZWFyKClcbiAgICAgICAgYXdhaXQgcGx1Z2lucy5jbGVhbnVwKClcbiAgICAgICAgYXdhaXQgc3RhdGljQXNzZXRXYXRjaGVyLmNsb3NlKClcbiAgICAgICAgYXdhaXQgd2F0Y2hUYXNrLmNsb3NlKClcblxuICAgICAgICBpZiAoaHR0cFNlcnZlcikge1xuICAgICAgICAgIGF3YWl0IGh0dHBTZXJ2ZXIuY2xvc2UoKVxuICAgICAgICB9XG4gICAgICB9LFxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGNvbmZpZ1dhdGNoZXIgPSBjaG9raWRhclxuICAgIC53YXRjaChwYXRoLnJlc29sdmUob3B0aW9ucy5jb25maWcgfHwgZGVmYXVsdENvbmZpZ0ZpbGVwYXRoKSwgeyBpZ25vcmVJbml0aWFsOiB0cnVlIH0pXG4gICAgLm9uKCdhbGwnLCBhc3luYyAoKSA9PiB7XG4gICAgICBpZiAocmVzdGFydGluZykgcmV0dXJuXG5cbiAgICAgIHJlc3RhcnRpbmcgPSB0cnVlXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGRldlNlcnZlci5jbG9zZSgpXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZSlcbiAgICAgIH1cblxuICAgICAgY29uc29sZS5jbGVhcigpXG5cbiAgICAgIGRldlNlcnZlciA9IGF3YWl0IHN0YXJ0RGV2U2VydmVyKClcblxuICAgICAgcmVzdGFydGluZyA9IGZhbHNlXG4gICAgfSlcblxuICBkZXZTZXJ2ZXIgPSBhd2FpdCBzdGFydERldlNlcnZlcigpXG5cbiAgcmV0dXJuIHtcbiAgICBhc3luYyBjbG9zZSgpIHtcbiAgICAgIGF3YWl0IGNvbmZpZ1dhdGNoZXIuY2xvc2UoKVxuICAgICAgYXdhaXQgZGV2U2VydmVyLmNsb3NlKClcbiAgICB9LFxuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXJ2ZUNvbW1hbmQob3B0aW9uczogUHJlc3RhQ0xJU2VydmVPcHRpb25zKSB7XG4gIGNvbnN0IGNvbmZpZ0ZpbGUgPSBnZXRDb25maWdGaWxlKG9wdGlvbnMuY29uZmlnLCB0cnVlKVxuICBjb25zdCBwb3J0ID0gYXdhaXQgZ2V0QXZhaWxhYmxlUG9ydChvcHRpb25zLnBvcnQgfHwgY29uZmlnRmlsZS5wb3J0IHx8IDQwMDApXG5cbiAgY29uc3QgZW1pdHRlciA9IGNyZWF0ZUVtaXR0ZXIoKVxuICBjb25zdCBob29rcyA9IGNyZWF0ZUhvb2tzKGVtaXR0ZXIpXG4gIGNvbnN0IGNvbmZpZyA9IGNyZWF0ZShFbnYuUFJPRFVDVElPTiwgeyAuLi5vcHRpb25zLCBwb3J0IH0sIGNvbmZpZ0ZpbGUpXG4gIGF3YWl0IGluaXRQbHVnaW5zKGNvbmZpZy5wbHVnaW5zLCBjb25maWcsIGhvb2tzKVxuXG4gIHNlcnZlKGNvbmZpZywgaG9va3MpXG5cbiAgbG9nZ2VyLmluZm8oe1xuICAgIGxhYmVsOiAnc2VydmUnLFxuICAgIG1lc3NhZ2U6IGBodHRwOi8vbG9jYWxob3N0OiR7Y29uZmlnLnBvcnR9YCxcbiAgfSlcbn1cbiIsICJpbXBvcnQgYywgeyBLbGV1ciB9IGZyb20gJ2tsZXVyJ1xuXG5pbXBvcnQgeyBFbnYgfSBmcm9tICcuL2NvbnN0YW50cydcblxuZXhwb3J0IGVudW0gTGV2ZWxzIHtcbiAgRGVidWcgPSAnZGVidWcnLFxuICBJbmZvID0gJ2luZm8nLFxuICBXYXJuID0gJ3dhcm4nLFxuICBFcnIgPSAnZXJyb3InLFxufVxuXG5leHBvcnQgdHlwZSBNZXNzYWdlID0ge1xuICBsZXZlbD86IExldmVsc1xuICBsYWJlbDogc3RyaW5nIHwgbnVtYmVyXG4gIG1lc3NhZ2U/OiBzdHJpbmdcbiAgZHVyYXRpb24/OiBzdHJpbmcgfCBudW1iZXJcbiAgZXJyb3I/OiBFcnJvclxufVxuXG5sZXQgbG9nczogYW55W10gPSBbXVxuXG5jb25zdCBjb2xvcnMgPSB7XG4gIFtMZXZlbHMuRGVidWddOiAnbWFnZW50YScsXG4gIFtMZXZlbHMuSW5mb106ICdibHVlJyxcbiAgW0xldmVscy5XYXJuXTogJ3llbGxvdycsXG4gIFtMZXZlbHMuRXJyXTogJ3JlZCcsXG59XG5cbmV4cG9ydCB7IGMgYXMgY29sb3JzIH1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldExvZ3MoKSB7XG4gIGlmICghcHJvY2Vzcy5lbnYuVEVTVElORykge1xuICAgIHRocm93IG5ldyBFcnJvcignSW50ZXJuYWwgbWV0aG9kIHdhcyBjYWxsZWQgb3V0c2lkZSB0ZXN0IG1vZGUnKVxuICB9XG5cbiAgcmV0dXJuIGxvZ3Ncbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxvZ2dlcihtZXNzYWdlOiBNZXNzYWdlKSB7XG4gIGlmIChwcm9jZXNzLmVudi5URVNUSU5HKSB7XG4gICAgbG9ncy5wdXNoKG1lc3NhZ2UpXG4gIH0gZWxzZSB7XG4gICAgY29uc3QgZGVidWcgPSBwcm9jZXNzLmVudi5QUkVTVEFfREVCVUdcbiAgICBjb25zdCBjb250ZXh0ID0gcHJvY2Vzcy5lbnYuUFJFU1RBX0VOViA9PT0gRW52LlBST0RVQ1RJT04gPyAncHJvZCcgOiAnZGV2J1xuXG4gICAgaWYgKCFkZWJ1ZyAmJiBtZXNzYWdlLmxldmVsID09PSBMZXZlbHMuRGVidWcpIHJldHVyblxuXG4gICAgY29uc29sZS5sb2coXG4gICAgICBbXG4gICAgICAgIGMuZ3JheShjb250ZXh0KSxcbiAgICAgICAgY1tjb2xvcnNbbWVzc2FnZS5sZXZlbCB8fCAnaW5mbyddIGFzIGtleW9mIEtsZXVyXShtZXNzYWdlLmxhYmVsKSxcbiAgICAgICAgbWVzc2FnZS5tZXNzYWdlLFxuICAgICAgICBtZXNzYWdlLmR1cmF0aW9uID8gYy5ncmF5KCcrJyArIG1lc3NhZ2UuZHVyYXRpb24pIDogJycsXG4gICAgICAgIG1lc3NhZ2UuZXJyb3IgPyBgXFxuXFxuJHttZXNzYWdlLmVycm9yLnN0YWNrIHx8IG1lc3NhZ2UuZXJyb3J9XFxuXFxuYCA6ICcnLFxuICAgICAgXVxuICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgIC5qb2luKCcgJylcbiAgICApXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlYnVnKG1lc3NhZ2U6IE1lc3NhZ2UpIHtcbiAgbG9nZ2VyKHsgbGV2ZWw6IExldmVscy5EZWJ1ZywgLi4ubWVzc2FnZSB9KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5mbyhtZXNzYWdlOiBNZXNzYWdlKSB7XG4gIGxvZ2dlcih7IGxldmVsOiBMZXZlbHMuSW5mbywgLi4ubWVzc2FnZSB9KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gd2FybihtZXNzYWdlOiBNZXNzYWdlKSB7XG4gIGxvZ2dlcih7IGxldmVsOiBMZXZlbHMuV2FybiwgLi4ubWVzc2FnZSB9KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZXJyb3IobWVzc2FnZTogTWVzc2FnZSkge1xuICBsb2dnZXIoeyBsZXZlbDogTGV2ZWxzLkVyciwgLi4ubWVzc2FnZSB9KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmF3KC4uLmFyZ3M6IGFueVtdKSB7XG4gIGlmIChwcm9jZXNzLmVudi5URVNUSU5HKSB7XG4gICAgbG9ncy5wdXNoKGFyZ3MpXG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5sb2coLi4uYXJncylcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbmV3bGluZSgpIHtcbiAgaWYgKHByb2Nlc3MuZW52LlRFU1RJTkcpIHJldHVyblxuICBjb25zb2xlLmxvZygnJylcbn1cbiIsICJleHBvcnQgY29uc3QgRW52ID0ge1xuICBQUk9EVUNUSU9OOiAncHJvZHVjdGlvbicsXG4gIERFVkVMT1BNRU5UOiAnZGV2ZWxvcG1lbnQnLFxufVxuIiwgImltcG9ydCBmcyBmcm9tICdmcydcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXG5pbXBvcnQgZ2V0UG9ydCBmcm9tICdnZXQtcG9ydCdcblxuaW1wb3J0ICogYXMgbG9nZ2VyIGZyb20gJy4vbG9nJ1xuaW1wb3J0IHsgUHJlc3RhQ0xJRGV2T3B0aW9ucywgUHJlc3RhQ0xJQnVpbGRPcHRpb25zIH0gZnJvbSAnLi9jbGknXG5pbXBvcnQgeyBQbHVnaW4gfSBmcm9tICcuL3BsdWdpbnMnXG5cbmV4cG9ydCB0eXBlIE9wdGlvbnMgPSB7XG4gIGZpbGVzOiBzdHJpbmdbXVxuICBvdXRwdXQ6IHN0cmluZ1xuICBhc3NldHM6IHN0cmluZ1xuICBwbHVnaW5zOiBQbHVnaW5bXVxuICBwb3J0OiBudW1iZXJcbn1cblxuZXhwb3J0IHR5cGUgQ29uZmlnID0gT3B0aW9ucyAmIHtcbiAgZW52OiBzdHJpbmdcbiAgc3RhdGljT3V0cHV0RGlyOiBzdHJpbmdcbiAgZnVuY3Rpb25zT3V0cHV0RGlyOiBzdHJpbmdcbiAgZnVuY3Rpb25zTWFuaWZlc3Q6IHN0cmluZ1xufVxuXG5leHBvcnQgY29uc3QgZGVmYXVsdENvbmZpZ0ZpbGVwYXRoID0gJ3ByZXN0YS5jb25maWcuanMnXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBdmFpbGFibGVQb3J0KHByZWZlcnJlZDogc3RyaW5nKSB7XG4gIHJldHVybiBnZXRQb3J0KHsgcG9ydDogcGFyc2VJbnQocHJlZmVycmVkLCAxMCkgfSlcbn1cblxuLyoqXG4gKiBGZXRjaCBhIGNvbmZpZyBmaWxlLiBJZiBvbmUgd2FzIHNwZWNpZmllZCBieSB0aGUgdXNlciwgbGV0IHRoZW0ga25vdyBpZlxuICogYW55dGhpbmcgZ29lcyB3cm9uZy4gT3V0c2lkZSB3YXRjaCBtb2RlLCB0aGlzIHNob3VsZCBleGl0KDEpIGlmIHRoZSB1c2VyXG4gKiBwcm92aWRlZCBhIGNvbmZpZyBhbmQgdGhlcmUgd2FzIGFuIGVycm9yXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb25maWdGaWxlKGZpbGVwYXRoPzogc3RyaW5nLCBzaG91bGRFeGl0OiBib29sZWFuID0gZmFsc2UpIHtcbiAgY29uc3QgZnAgPSBwYXRoLnJlc29sdmUoZmlsZXBhdGggfHwgZGVmYXVsdENvbmZpZ0ZpbGVwYXRoKVxuXG4gIHRyeSB7XG4gICAgZGVsZXRlIHJlcXVpcmUuY2FjaGVbZnBdXG4gICAgcmV0dXJuIHJlcXVpcmUoZnApXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zdCBleGlzdHMgPSBmcy5leGlzdHNTeW5jKGZwKVxuXG4gICAgLy8gY29uZmlnIGZpbGUgZXhpc3RzLCBzaG91bGQgbG9nIGVycm9yLCBvdGhlcndpc2UgaWdub3JlIG1pc3NpbmcgZmlsZVxuICAgIGlmIChleGlzdHMpIHtcbiAgICAgIGxvZ2dlci5lcnJvcih7XG4gICAgICAgIGxhYmVsOiAnZXJyb3InLFxuICAgICAgICBlcnJvcjogZSBhcyBFcnJvcixcbiAgICAgIH0pXG5cbiAgICAgIC8vIHdlJ3JlIG5vdCBpbiB3YXRjaCBtb2RlLCBleGl0IGJ1aWxkXG4gICAgICBpZiAoc2hvdWxkRXhpdCkgcHJvY2Vzcy5leGl0KDEpXG4gICAgfVxuXG4gICAgcmV0dXJuIHt9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZShlbnY6IHN0cmluZywgY2xpOiBQcmVzdGFDTElCdWlsZE9wdGlvbnMgfCBQcmVzdGFDTElEZXZPcHRpb25zLCBmaWxlOiBQYXJ0aWFsPE9wdGlvbnM+KTogQ29uZmlnIHtcbiAgY29uc3QgY29uZmlnID0ge1xuICAgIGVudixcbiAgICBvdXRwdXQ6ICdidWlsZCcsXG4gICAgYXNzZXRzOiAncHVibGljJyxcbiAgICBwbHVnaW5zOiBbXSxcbiAgICBwb3J0OiA0MDAwLFxuICAgIGZpbGVzOiBbXSwgLy8gVE9ETyB3aGVyZSBkbyB3ZSB2YWxpZGF0ZVxuICAgIC4uLmZpbGUsXG4gIH1cblxuICAvLyBvdmVycmlkZSB3aXRoIENMSVxuICBpZiAoY2xpLl8ubGVuZ3RoKSBjb25maWcuZmlsZXMgPSBjbGkuX1xuICBpZiAoY2xpLm91dHB1dCkgY29uZmlnLm91dHB1dCA9IGNsaS5vdXRwdXRcbiAgaWYgKGNsaS5hc3NldHMpIGNvbmZpZy5vdXRwdXQgPSBjbGkuYXNzZXRzXG4gIGlmIChjbGkucG9ydCkgY29uZmlnLnBvcnQgPSBjbGkucG9ydFxuXG4gIC8vIHJlc29sdmUgYWJzb2x1dGUgcGF0aHNcbiAgaWYgKGNvbmZpZy5maWxlcykgY29uZmlnLmZpbGVzID0gKFtdIGFzIHN0cmluZ1tdKS5jb25jYXQoY29uZmlnLmZpbGVzKS5tYXAoKHApID0+IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBwKSlcbiAgaWYgKGNvbmZpZy5vdXRwdXQpIGNvbmZpZy5vdXRwdXQgPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgY29uZmlnLm91dHB1dClcbiAgaWYgKGNvbmZpZy5hc3NldHMpIGNvbmZpZy5hc3NldHMgPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgY29uZmlnLmFzc2V0cylcblxuICByZXR1cm4ge1xuICAgIC4uLmNvbmZpZyxcbiAgICBzdGF0aWNPdXRwdXREaXI6IHBhdGguam9pbihjb25maWcub3V0cHV0LCAnc3RhdGljJyksXG4gICAgZnVuY3Rpb25zT3V0cHV0RGlyOiBwYXRoLmpvaW4oY29uZmlnLm91dHB1dCwgJ2Z1bmN0aW9ucycpLFxuICAgIGZ1bmN0aW9uc01hbmlmZXN0OiBwYXRoLmpvaW4oY29uZmlnLm91dHB1dCwgJ3JvdXRlcy5qc29uJyksXG4gIH1cbn1cbiIsICJpbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJ1xuaW1wb3J0IHsgY3JlYXRlIH0gZnJvbSAnd2F0Y2gtZGVwZW5kZW5jeS1ncmFwaCdcbmltcG9ydCBjaG9raWRhciBmcm9tICdjaG9raWRhcidcbmltcG9ydCBtYXRjaCBmcm9tICdwaWNvbWF0Y2gnXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcC1leHRlbmQnXG5cbmltcG9ydCB7IG91dHB1dExhbWJkYXMgfSBmcm9tICcuL291dHB1dExhbWJkYXMnXG5pbXBvcnQgKiBhcyBsb2dnZXIgZnJvbSAnLi9sb2cnXG5pbXBvcnQgeyBnZXRGaWxlcywgaXNTdGF0aWMsIGlzRHluYW1pYyB9IGZyb20gJy4vZ2V0RmlsZXMnXG5pbXBvcnQgeyBidWlsZFN0YXRpY0ZpbGVzLCByZW1vdmVCdWlsdFN0YXRpY0ZpbGUsIFN0YXRpY0ZpbGVzTWFwIH0gZnJvbSAnLi9yZW5kZXJTdGF0aWNFbnRyaWVzJ1xuaW1wb3J0IHsgdGltZXIgfSBmcm9tICcuL3RpbWVyJ1xuaW1wb3J0IHsgQ29uZmlnIH0gZnJvbSAnLi9jb25maWcnXG5pbXBvcnQgeyBIb29rcyB9IGZyb20gJy4vY3JlYXRlRW1pdHRlcidcblxuLypcbiAqIFdyYXBzIG91dHB1dExhbWJkYXMgZm9yIGxvZ2dpbmdcbiAqL1xuZnVuY3Rpb24gdXBkYXRlTGFtYmRhcyhpbnB1dHM6IHN0cmluZ1tdLCBjb25maWc6IENvbmZpZykge1xuICBjb25zdCB0aW1lID0gdGltZXIoKVxuXG4gIC8vIGFsd2F5cyB3cml0ZSB0aGlzLCBldmVuIGlmIGlucHV0cyA9IFtdXG4gIG91dHB1dExhbWJkYXMoaW5wdXRzLCBjb25maWcpXG5cbiAgLy8gaWYgdXNlciBhY3R1YWxseSBoYXMgcm91dGVzIGNvbmZpZ3VyZWQsIGdpdmUgZmVlZGJhY2tcbiAgaWYgKGlucHV0cy5sZW5ndGgpIHtcbiAgICBsb2dnZXIuaW5mbyh7XG4gICAgICBsYWJlbDogJ2J1aWx0JyxcbiAgICAgIG1lc3NhZ2U6IGBsYW1iZGFzYCxcbiAgICAgIGR1cmF0aW9uOiB0aW1lKCksXG4gICAgfSlcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNOZXdWYWxpZEZpbGUoZmlsZTogc3RyaW5nLCBnbG9iczogc3RyaW5nW10sIGV4aXN0aW5nOiBzdHJpbmdbXSkge1xuICByZXR1cm4gbWF0Y2goZ2xvYnMpKGZpbGUpICYmICFleGlzdGluZy5pbmNsdWRlcyhmaWxlKVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2F0Y2goY29uZmlnOiBDb25maWcsIGhvb2tzOiBIb29rcykge1xuICBsZXQgc3RhdGljRmlsZXNNYXA6IFN0YXRpY0ZpbGVzTWFwID0ge31cbiAgY29uc3QgZmlsZXMgPSBnZXRGaWxlcyhjb25maWcuZmlsZXMpXG5cbiAgaWYgKCFmaWxlcy5sZW5ndGgpIHtcbiAgICBsb2dnZXIud2Fybih7XG4gICAgICBsYWJlbDogJ3BhdGhzJyxcbiAgICAgIG1lc3NhZ2U6ICdubyBmaWxlcyBjb25maWd1cmVkJyxcbiAgICB9KVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gYnVpbGRGaWxlKGZpbGU6IHN0cmluZywgZXhpc3Rpbmc6IHN0cmluZ1tdLCBjb25maWc6IENvbmZpZykge1xuICAgIGRlbGV0ZSByZXF1aXJlLmNhY2hlW2ZpbGVdXG5cbiAgICAvLyByZW5kZXIganVzdCBmaWxlIHRoYXQgY2hhbmdlZFxuICAgIGlmIChpc1N0YXRpYyhmaWxlKSkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYnVpbGRTdGF0aWNGaWxlcyhbZmlsZV0sIGNvbmZpZywgc3RhdGljRmlsZXNNYXApXG4gICAgICBzdGF0aWNGaWxlc01hcCA9IG1lcmdlKHt9LCBzdGF0aWNGaWxlc01hcCwgcmVzdWx0LnN0YXRpY0ZpbGVzTWFwKVxuICAgIH1cblxuICAgIC8vIHVwZGF0ZSBkeW5hbWljIGVudHJ5IHdpdGggQUxMIGR5bmFtaWMgZmlsZXNcbiAgICB1cGRhdGVMYW1iZGFzKGV4aXN0aW5nLmZpbHRlcihpc0R5bmFtaWMpLCBjb25maWcpXG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBidWlsZEZpbGVzKGZpbGVzOiBzdHJpbmdbXSwgZXhpc3Rpbmc6IHN0cmluZ1tdLCBjb25maWc6IENvbmZpZykge1xuICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgICAgYXdhaXQgYnVpbGRGaWxlKGZpbGUsIGV4aXN0aW5nLCBjb25maWcpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEltcG9ydGFudDogaWYgd2UgZXZlciByZW1vdmUgaW5pdGlhbCByZW5kZXJpbmcsIHdlIHdpbGwgbmVlZCB0b1xuICAgKiByZS1pbnRyb2R1Y2UgXCJmaWxlIHByaW1pbmdcIiB3aGVyZSB3ZSByZXF1aXJlIGFsbCBmaWxlcyBhbmQgc3VyZmFjZSBlcnJvcnNcbiAgICogb24gc3RhcnR1cC5cbiAgICovXG4gIGF3YWl0IGJ1aWxkRmlsZXMoZmlsZXMsIGZpbGVzLCBjb25maWcpXG4gIGhvb2tzLmVtaXRCcm93c2VyUmVmcmVzaCgpXG5cbiAgLypcbiAgICogRmlsZXdhdGNoZXIgd2F0Y2hlcyBvbmx5IHByZXN0YSBmaWxlcy4gSXQgaGFuZGxlcyBjaGFuZ2UgYW5kIHJlbW92ZVxuICAgKiBldmVudHMsIGFzIHdlbGwgYXMgc3VyZmFjZXMgZGVwZW5kZW5jeSB0cmVlIHRyYXZlcnNhbCBlcnJvcnNcbiAgICovXG4gIGNvbnN0IGZpbGVXYXRjaGVyID0gY3JlYXRlKHsgYWxpYXM6IHsgJ0AnOiBwcm9jZXNzLmN3ZCgpIH0gfSlcblxuICBmaWxlV2F0Y2hlci5vbkNoYW5nZShhc3luYyAoY2hhbmdlZCkgPT4ge1xuICAgIGF3YWl0IGJ1aWxkRmlsZXMoY2hhbmdlZCwgZmlsZXMsIGNvbmZpZylcbiAgICBob29rcy5lbWl0QnJvd3NlclJlZnJlc2goKVxuICB9KVxuXG4gIGZpbGVXYXRjaGVyLm9uUmVtb3ZlKGFzeW5jIChbaWRdKSA9PiB7XG4gICAgbG9nZ2VyLmRlYnVnKHsgbGFiZWw6ICd3YXRjaCcsIG1lc3NhZ2U6IGByZW1vdmVkICR7aWR9YCB9KVxuXG4gICAgLy8gcmVtb3ZlIGZyb20gbG9jYWwgaGFzaFxuICAgIGZpbGVzLnNwbGljZShmaWxlcy5pbmRleE9mKGlkKSwgMSlcblxuICAgIC8vIHVwZGF0ZSB0aGlzIHJlZ2FyZGxlc3MsIG5vdCBzdXJlIGlmIFtpZF0gd2FzIGR5bmFtaWMgb3Igc3RhdGljXG4gICAgdXBkYXRlTGFtYmRhcyhmaWxlcy5maWx0ZXIoaXNEeW5hbWljKSwgY29uZmlnKVxuICAgIDsoc3RhdGljRmlsZXNNYXBbaWRdIHx8IFtdKS5mb3JFYWNoKChmaWxlKSA9PiByZW1vdmVCdWlsdFN0YXRpY0ZpbGUocGF0aC5qb2luKGNvbmZpZy5zdGF0aWNPdXRwdXREaXIsIGZpbGUpKSlcblxuICAgIGhvb2tzLmVtaXRCcm93c2VyUmVmcmVzaCgpXG4gIH0pXG5cbiAgZmlsZVdhdGNoZXIub25FcnJvcigoZSkgPT4ge1xuICAgIGxvZ2dlci5lcnJvcih7XG4gICAgICBsYWJlbDogJ2Vycm9yJyxcbiAgICAgIGVycm9yOiB0eXBlb2YgZSA9PT0gJ3N0cmluZycgPyBuZXcgRXJyb3IoZSkgOiBlLFxuICAgIH0pXG4gIH0pXG5cbiAgYXdhaXQgZmlsZVdhdGNoZXIuYWRkKGZpbGVzKVxuXG4gIC8qXG4gICAqIGdsb2JhbFdhdGNoZXIgd2F0Y2hlcyB0aGUgcmF3IGZpbGUgZ2xvYnMgcGFzc2VkIHRvIHRoZSBDTEkgb3IgYXMgYGZpbGVzYFxuICAgKiBpbiB0aGUgY29uZmlnLiBJZiBjaGVja3Mgb24gYWRkL2NoYW5nZSB0byBzZWUgaWYgYSBmaWxlIHNob3VsZCBiZSB1cGdyYWRlZFxuICAgKiB0byBhIGEgUHJlc3RhIHNvdXJjZSBmaWxlLCBhbmQgYWRkZWQgdG8gdGhlIGZpbGVXYXRjaGVyLlxuICAgKi9cbiAgY29uc3QgZ2xvYmFsV2F0Y2hlciA9IGNob2tpZGFyLndhdGNoKHByb2Nlc3MuY3dkKCksIHtcbiAgICBpZ25vcmVJbml0aWFsOiB0cnVlLFxuICAgIGlnbm9yZWQ6IFtjb25maWcub3V0cHV0LCBjb25maWcuYXNzZXRzXSxcbiAgfSlcblxuICBnbG9iYWxXYXRjaGVyLm9uKCdhZGQnLCBhc3luYyAoZmlsZSkgPT4ge1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhmaWxlKSB8fCBmcy5sc3RhdFN5bmMoZmlsZSkuaXNEaXJlY3RvcnkoKSkgcmV0dXJuXG4gICAgaWYgKCFpc05ld1ZhbGlkRmlsZShmaWxlLCBjb25maWcuZmlsZXMsIGZpbGVzKSkgcmV0dXJuXG5cbiAgICBsb2dnZXIuZGVidWcoeyBsYWJlbDogJ3dhdGNoJywgbWVzc2FnZTogYGFkZCAke2ZpbGV9YCB9KVxuXG4gICAgZmlsZXMucHVzaChmaWxlKVxuICAgIGF3YWl0IGZpbGVXYXRjaGVyLmFkZChmaWxlKVxuXG4gICAgYXdhaXQgYnVpbGRGaWxlKGZpbGUsIGZpbGVzLCBjb25maWcpXG5cbiAgICBob29rcy5lbWl0QnJvd3NlclJlZnJlc2goKVxuICB9KVxuXG4gIC8qKlxuICAgKiBMaXN0ZW5zIGZvciBldmVudHMgZnJvbSBwbHVnaW5zIHJlcXVlc3RpbmcgYSBmaWxlIHRvIGJlIGJ1aWx0XG4gICAqL1xuICBob29rcy5vbkJ1aWxkRmlsZShhc3luYyAoeyBmaWxlIH0pID0+IHtcbiAgICBhd2FpdCBidWlsZEZpbGUoZmlsZSwgZmlsZXMsIGNvbmZpZylcbiAgICBob29rcy5lbWl0QnJvd3NlclJlZnJlc2goKVxuICB9KVxuXG4gIHJldHVybiB7XG4gICAgYXN5bmMgY2xvc2UoKSB7XG4gICAgICBhd2FpdCBmaWxlV2F0Y2hlci5jbG9zZSgpXG4gICAgICBhd2FpdCBnbG9iYWxXYXRjaGVyLmNsb3NlKClcbiAgICB9LFxuICB9XG59XG4iLCAiaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJ1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcbmltcG9ydCByc29ydCBmcm9tICdyb3V0ZS1zb3J0J1xuXG5pbXBvcnQgeyBoYXNoQ29udGVudCB9IGZyb20gJy4vaGFzaENvbnRlbnQnXG5pbXBvcnQgKiBhcyBsb2dnZXIgZnJvbSAnLi9sb2cnXG5pbXBvcnQgeyBDb25maWcgfSBmcm9tICcuL2NvbmZpZydcbmltcG9ydCB7IEVudiB9IGZyb20gJy4vY29uc3RhbnRzJ1xuXG5mdW5jdGlvbiBzbHVnaWZ5KGZpbGVuYW1lOiBzdHJpbmcpIHtcbiAgcmV0dXJuIGZpbGVuYW1lXG4gICAgLnJlcGxhY2UocHJvY2Vzcy5jd2QoKSwgJycpIC8vIC9wYWdlcy9GaWxlLnBhZ2UuanNcbiAgICAuc3BsaXQoJy4nKSAvLyBbL3BhZ2VzL0ZpbGUsIHBhZ2UsIGpzXVxuICAgIC5yZXZlcnNlKClcbiAgICAuc2xpY2UoMSlcbiAgICAucmV2ZXJzZSgpXG4gICAgLmpvaW4oJy0nKSAvLyAvcGFnZXMvRmlsZS5wYWdlXG4gICAgLnNwbGl0KCcvJylcbiAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgLmpvaW4oJy0nKSAvLyBwYWdlcy1GaWxlLXBhZ2Vcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG91dHB1dExhbWJkYXMoaW5wdXRzOiBzdHJpbmdbXSwgY29uZmlnOiBDb25maWcpIHtcbiAgY29uc3QgbGFtYmRhcyA9IGlucHV0c1xuICAgIC5tYXAoKGlucHV0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB7IHJvdXRlIH0gPSByZXF1aXJlKGlucHV0KVxuICAgICAgICBjb25zdCBuYW1lID0gc2x1Z2lmeShpbnB1dClcbiAgICAgICAgY29uc3Qgb3V0cHV0ID0gcGF0aC5qb2luKFxuICAgICAgICAgIGNvbmZpZy5mdW5jdGlvbnNPdXRwdXREaXIsXG4gICAgICAgICAgY29uZmlnLmVudiA9PT0gRW52LlBST0RVQ1RJT05cbiAgICAgICAgICAgID8gbmFtZSArICctJyArIGhhc2hDb250ZW50KGZzLnJlYWRGaWxlU3luYyhpbnB1dCwgJ3V0ZjgnKSkgKyAnLmpzJ1xuICAgICAgICAgICAgOiBuYW1lICsgJy5qcydcbiAgICAgICAgKVxuXG4gICAgICAgIGxvZ2dlci5kZWJ1Zyh7XG4gICAgICAgICAgbGFiZWw6ICdkZWJ1ZycsXG4gICAgICAgICAgbWVzc2FnZTogYGdlbmVyYXRpbmcgJHtuYW1lfSBsYW1iZGFgLFxuICAgICAgICB9KVxuXG4gICAgICAgIC8vIGltcG9ydGFudCBmb3Igd2F0Y2ggdGFza1xuICAgICAgICBkZWxldGUgcmVxdWlyZS5jYWNoZVtpbnB1dF1cbiAgICAgICAgZGVsZXRlIHJlcXVpcmUuY2FjaGVbb3V0cHV0XVxuXG4gICAgICAgIGZzLm91dHB1dEZpbGVTeW5jKFxuICAgICAgICAgIG91dHB1dCxcbiAgICAgICAgICBgaW1wb3J0IHsgd3JhcEhhbmRsZXIgfSBmcm9tICdwcmVzdGEvZGlzdC93cmFwSGFuZGxlcic7XG4gICAgICBpbXBvcnQgKiBhcyBmaWxlIGZyb20gJyR7aW5wdXR9JztcbiAgICAgIGV4cG9ydCBjb25zdCByb3V0ZSA9IGZpbGUucm91dGVcbiAgICAgIGV4cG9ydCBjb25zdCBoYW5kbGVyID0gd3JhcEhhbmRsZXIoZmlsZSlgXG4gICAgICAgIClcblxuICAgICAgICByZXR1cm4gW3JvdXRlLCBvdXRwdXRdXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcih7XG4gICAgICAgICAgbGFiZWw6ICdlcnJvcicsXG4gICAgICAgICAgZXJyb3I6IGUgYXMgRXJyb3IsXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pIGFzIFtzdHJpbmcsIHN0cmluZ11bXVxuXG4gIGNvbnN0IHNvcnRlZCA9IHJzb3J0KGxhbWJkYXMubWFwKChsKSA9PiBsWzBdKSlcbiAgY29uc3QgbWFuaWZlc3Q6IHsgW3JvdXRlOiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9XG5cbiAgZm9yIChjb25zdCByb3V0ZSBvZiBzb3J0ZWQpIHtcbiAgICBjb25zdCBtYXRjaCA9IGxhbWJkYXMuZmluZCgobCkgPT4gbFswXSA9PT0gcm91dGUpXG5cbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIG1hbmlmZXN0W3JvdXRlXSA9IG1hdGNoWzFdXG4gICAgfVxuICB9XG5cbiAgZnMub3V0cHV0RmlsZVN5bmMoY29uZmlnLmZ1bmN0aW9uc01hbmlmZXN0LCBKU09OLnN0cmluZ2lmeShtYW5pZmVzdCkpXG5cbiAgcmV0dXJuIGxhbWJkYXNcbn1cbiIsICJleHBvcnQgZnVuY3Rpb24gaGFzaENvbnRlbnQoY29udGVudDogc3RyaW5nKSB7XG4gIHZhciBoID0gNTM4MSxcbiAgICBpID0gY29udGVudC5sZW5ndGhcblxuICB3aGlsZSAoaSkgaCA9IChoICogMzMpIF4gY29udGVudC5jaGFyQ29kZUF0KC0taSlcblxuICByZXR1cm4gKGggPj4+IDApLnRvU3RyaW5nKDM2KVxufVxuIiwgImltcG9ydCBmcyBmcm9tICdmcy1leHRyYSdcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXG5pbXBvcnQgZ2xvYlN5bmMgZnJvbSAndGlueS1nbG9iL3N5bmMnXG5cbmltcG9ydCAqIGFzIGxvZ2dlciBmcm9tICcuL2xvZydcblxuZXhwb3J0IGZ1bmN0aW9uIGlzRHluYW1pYyhmaWxlOiBzdHJpbmcpIHtcbiAgcmV0dXJuIC9leHBvcnRcXHMuK1xcc3JvdXRlXFxzK1xcPS8udGVzdChmcy5yZWFkRmlsZVN5bmMoZmlsZSwgJ3V0Zi04JykpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1N0YXRpYyhmaWxlOiBzdHJpbmcpIHtcbiAgcmV0dXJuIC9leHBvcnRcXHMuK1xcc2dldFN0YXRpY1BhdGhzLy50ZXN0KGZzLnJlYWRGaWxlU3luYyhmaWxlLCAndXRmLTgnKSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUHJlc3RhRmlsZShmaWxlOiBzdHJpbmcpIHtcbiAgcmV0dXJuIGlzU3RhdGljKGZpbGUpIHx8IGlzRHluYW1pYyhmaWxlKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmlsZXMoZmlsZXM6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICB0cnkge1xuICAgIHJldHVybiAoW10gYXMgc3RyaW5nW10pXG4gICAgICAuY29uY2F0KGZpbGVzKVxuICAgICAgLm1hcCgoZmlsZSkgPT4gZ2xvYlN5bmMoZmlsZSkpXG4gICAgICAuZmxhdCgpXG4gICAgICAubWFwKChmaWxlKSA9PiBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgZmlsZSkpIC8vIG1ha2UgYWJzb2x1dGVcbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZ2dlci5lcnJvcih7XG4gICAgICBsYWJlbDogJ3BhdGhzJyxcbiAgICAgIG1lc3NhZ2U6IGBubyBmaWxlcyBmb3VuZGAsXG4gICAgICBlcnJvcjogZSBhcyBFcnJvcixcbiAgICB9KVxuXG4gICAgcmV0dXJuIFtdXG4gIH1cbn1cbiIsICJpbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJ1xuaW1wb3J0IG1pbWUgZnJvbSAnbWltZS10eXBlcydcblxuaW1wb3J0ICogYXMgbG9nZ2VyIGZyb20gJy4vbG9nJ1xuaW1wb3J0IHsgdGltZXIgfSBmcm9tICcuL3RpbWVyJ1xuaW1wb3J0IHsgZ2V0Um91dGVQYXJhbXMgfSBmcm9tICcuL2dldFJvdXRlUGFyYW1zJ1xuaW1wb3J0IHsgbm9ybWFsaXplUmVzcG9uc2UgfSBmcm9tICcuL25vcm1hbGl6ZVJlc3BvbnNlJ1xuaW1wb3J0IHsgY3JlYXRlTGl2ZVJlbG9hZFNjcmlwdCB9IGZyb20gJy4vbGl2ZVJlbG9hZFNjcmlwdCdcbmltcG9ydCB7IEVudiB9IGZyb20gJy4vY29uc3RhbnRzJ1xuaW1wb3J0IHsgQ29uZmlnIH0gZnJvbSAnLi9jb25maWcnXG5cbmV4cG9ydCB0eXBlIFN0YXRpY0ZpbGVzTWFwID0geyBbZmlsZW5hbWU6IHN0cmluZ106IHN0cmluZ1tdIH1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhdGhuYW1lVG9GaWxlKHBhdGhuYW1lOiBzdHJpbmcsIGV4dCA9ICdodG1sJykge1xuICByZXR1cm4gISFwYXRoLmV4dG5hbWUocGF0aG5hbWUpXG4gICAgPyBwYXRobmFtZSAvLyBpZiBwYXRoIGhhcyBleHRlbnNpb24sIHVzZSBpdFxuICAgIDogZXh0ID09PSAnaHRtbCdcbiAgICA/IGAke3BhdGhuYW1lfS9pbmRleC5odG1sYCAvLyBpZiBIVE1MIGlzIGluZmVycmVkLCBjcmVhdGUgaW5kZXhcbiAgICA6IGAke3BhdGhuYW1lfS4ke2V4dH1gIC8vIGFueXRoaW5nIGJ1dCBIVE1MIHdpbGwgbmVlZCBhbiBleHRlbnNpb24sIG90aGVyd2lzZSBicm93c2VycyB3aWxsIHJlbmRlciBhcyB0ZXh0XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW1vdmVCdWlsdFN0YXRpY0ZpbGUoZmlsZTogc3RyaW5nKSB7XG4gIGxvZ2dlci5kZWJ1Zyh7XG4gICAgbGFiZWw6ICdkZWJ1ZycsXG4gICAgbWVzc2FnZTogYHJlbW92aW5nIG9sZCBzdGF0aWMgZmlsZSAke2ZpbGV9YCxcbiAgfSlcblxuICByZXR1cm4gZnMucmVtb3ZlKGZpbGUpXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW1vdmVCdWlsdEZpbGVzKGZpbGVzOiBzdHJpbmdbXSkge1xuICByZXR1cm4gUHJvbWlzZS5hbGwoZmlsZXMubWFwKHJlbW92ZUJ1aWx0U3RhdGljRmlsZSkpXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZFN0YXRpY0ZpbGUoZmlsZTogc3RyaW5nLCBvdXRwdXQ6IHN0cmluZywgeyBmb290ZXIgfTogeyBmb290ZXI6IHN0cmluZyB9KSB7XG4gIGNvbnN0IGxhbWJkYSA9IHJlcXVpcmUoZmlsZSlcbiAgY29uc3QgcGF0aHMgPSBhd2FpdCBsYW1iZGEuZ2V0U3RhdGljUGF0aHMoKVxuXG4gIGNvbnN0IGJ1aWx0RmlsZXM6IHN0cmluZ1tdID0gW11cblxuICBpZiAoIXBhdGhzIHx8ICFwYXRocy5sZW5ndGgpIHJldHVybiBidWlsdEZpbGVzXG5cbiAgZm9yIChjb25zdCB1cmwgb2YgcGF0aHMpIHtcbiAgICBjb25zdCB0aW1lID0gdGltZXIoKVxuXG4gICAgY29uc3QgZXZlbnQgPSB7XG4gICAgICBwYXRoOiB1cmwsXG4gICAgICBwYXRoUGFyYW1ldGVyczogbGFtYmRhLnJvdXRlID8gZ2V0Um91dGVQYXJhbXModXJsLCBsYW1iZGEucm91dGUpIDoge30sXG4gICAgfVxuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBub3JtYWxpemVSZXNwb25zZShhd2FpdCBsYW1iZGEuaGFuZGxlcihldmVudCwge30pKVxuICAgIGNvbnN0IHR5cGUgPSByZXNwb25zZS5oZWFkZXJzID8gcmVzcG9uc2UuaGVhZGVyc1snQ29udGVudC1UeXBlJ10gOiAnJ1xuICAgIGNvbnN0IGV4dCA9IHR5cGUgPyBtaW1lLmV4dGVuc2lvbih0eXBlIGFzIHN0cmluZykgfHwgJ2h0bWwnIDogJ2h0bWwnXG4gICAgY29uc3QgZmlsZW5hbWUgPSBwYXRobmFtZVRvRmlsZSh1cmwsIGV4dClcbiAgICBjb25zdCBodG1sID0gcmVzcG9uc2UuYm9keSArIGZvb3RlclxuXG4gICAgZnMub3V0cHV0RmlsZVN5bmMocGF0aC5qb2luKG91dHB1dCwgZmlsZW5hbWUpLCBodG1sLCAndXRmLTgnKVxuXG4gICAgbG9nZ2VyLmluZm8oe1xuICAgICAgbGFiZWw6ICdidWlsdCcsXG4gICAgICBtZXNzYWdlOiB1cmwsXG4gICAgICBkdXJhdGlvbjogdGltZSgpLFxuICAgIH0pXG5cbiAgICBidWlsdEZpbGVzLnB1c2goZmlsZW5hbWUpXG4gIH1cblxuICByZXR1cm4gYnVpbHRGaWxlc1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRTdGF0aWNGaWxlcyhmaWxlczogc3RyaW5nW10sIGNvbmZpZzogQ29uZmlnLCBzdGF0aWNGaWxlc01hcDogU3RhdGljRmlsZXNNYXAgPSB7fSkge1xuICBjb25zdCBpc0RldiA9IGNvbmZpZy5lbnYgPT09IEVudi5ERVZFTE9QTUVOVFxuICBjb25zdCBvdXRwdXQgPSBjb25maWcuc3RhdGljT3V0cHV0RGlyXG4gIGNvbnN0IGZvb3RlciA9IGlzRGV2ID8gY3JlYXRlTGl2ZVJlbG9hZFNjcmlwdCh7IHBvcnQ6IGNvbmZpZy5wb3J0IH0pIDogJydcblxuICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZmlsZW5hbWUgPSBmaWxlLnJlcGxhY2UocHJvY2Vzcy5jd2QoKSwgJycpXG4gICAgICBjb25zdCBwcmV2QnVpbHRGaWxlcyA9IHN0YXRpY0ZpbGVzTWFwW2ZpbGVdIHx8IFtdXG4gICAgICBjb25zdCBidWlsdEZpbGVzID0gYXdhaXQgYnVpbGRTdGF0aWNGaWxlKGZpbGUsIG91dHB1dCwgeyBmb290ZXIgfSlcblxuICAgICAgaWYgKCFidWlsdEZpbGVzIHx8ICFidWlsdEZpbGVzLmxlbmd0aCkge1xuICAgICAgICBsb2dnZXIud2Fybih7XG4gICAgICAgICAgbGFiZWw6ICdwYXRocycsXG4gICAgICAgICAgbWVzc2FnZTogYCR7ZmlsZW5hbWV9IC0gbm8gcGF0aHMgdG8gcmVuZGVyYCxcbiAgICAgICAgfSlcblxuICAgICAgICByZW1vdmVCdWlsdEZpbGVzKHByZXZCdWlsdEZpbGVzLm1hcCgoZmlsZSkgPT4gcGF0aC5qb2luKG91dHB1dCwgZmlsZSkpKVxuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIGRpZmYgYW5kIHJlbW92ZSBmaWxlc1xuICAgICAgZm9yIChjb25zdCBmaWxlIG9mIHByZXZCdWlsdEZpbGVzKSB7XG4gICAgICAgIGlmICghYnVpbHRGaWxlcy5pbmNsdWRlcyhmaWxlKSkge1xuICAgICAgICAgIHJlbW92ZUJ1aWx0U3RhdGljRmlsZShwYXRoLmpvaW4ob3V0cHV0LCBmaWxlKSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBzdGF0aWNGaWxlc01hcFtmaWxlXSA9IGJ1aWx0RmlsZXNcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoeyBsYWJlbDogJ2Vycm9yJywgZXJyb3I6IGUgYXMgRXJyb3IgfSlcblxuICAgICAgLy8gZXhpdCBsb29wIG9uIGFueSBlcnJvclxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHN0YXRpY0ZpbGVzTWFwLFxuICB9XG59XG4iLCAiZXhwb3J0IGZ1bmN0aW9uIHRpbWVyKCkge1xuICBjb25zdCBzdGFydCA9IHByb2Nlc3MuaHJ0aW1lKClcbiAgcmV0dXJuICgpID0+IHtcbiAgICBjb25zdCBbcywgbmFub3NdID0gcHJvY2Vzcy5ocnRpbWUoc3RhcnQpXG4gICAgY29uc3QgbXMgPSBuYW5vcyAvIDEwMDAwMDBcblxuICAgIGlmIChzIDwgMSkge1xuICAgICAgcmV0dXJuIChtcyA+PSAxID8gbXMudG9GaXhlZCgwKSA6IG1zLnRvRml4ZWQoMikpICsgJ21zJ1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcyArICcuJyArIG1zLnRvRml4ZWQoMCkgKyAncydcbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQgdG9SZWdFeHAgZnJvbSAncmVnZXhwYXJhbSdcblxuaW1wb3J0IHsgUGF0aFBhcmFtZXRlcnMgfSBmcm9tICcuL2xhbWJkYSdcblxuLy8gQHNlZSBodHRwczovL2dpdGh1Yi5jb20vbHVrZWVkL3JlZ2V4cGFyYW0jdXNhZ2VcbmV4cG9ydCBmdW5jdGlvbiBnZXRSb3V0ZVBhcmFtcyh1cmw6IHN0cmluZywgcm91dGU6IHN0cmluZyk6IFBhdGhQYXJhbWV0ZXJzIHtcbiAgY29uc3QgW3BhdGhdID0gdXJsLnNwbGl0KCc/JylcbiAgY29uc3QgcmVzdWx0ID0gdG9SZWdFeHAocm91dGUpXG4gIGxldCBpID0gMFxuICBsZXQgb3V0OiBQYXRoUGFyYW1ldGVycyA9IHt9XG4gIGxldCBtYXRjaGVzID0gcmVzdWx0LnBhdHRlcm4uZXhlYyhwYXRoKSB8fCBbXVxuXG4gIHdoaWxlIChpIDwgcmVzdWx0LmtleXMubGVuZ3RoKSB7XG4gICAgb3V0W3Jlc3VsdC5rZXlzW2ldXSA9IG1hdGNoZXNbKytpXVxuICB9XG5cbiAgcmV0dXJuIG91dFxufVxuIiwgIi8qKlxuICogVEhJUyBJUyBQUk9EIENPREUsIEJFIENBUkVGVUwgV0hBVCBZT1UgQUREIFRPIFRISVMgRklMRVxuICovXG5cbmltcG9ydCB7IFJlc3BvbnNlIGFzIExhbWJkYVJlc3BvbnNlIH0gZnJvbSAnbGFtYmRhLXR5cGVzJ1xuaW1wb3J0IHsgUmVzcG9uc2UgfSBmcm9tICcuL2xhbWJkYSdcblxuZnVuY3Rpb24gc3RyaW5naWZ5KG9iajogb2JqZWN0IHwgc3RyaW5nKSB7XG4gIHJldHVybiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KG9iaikgOiBvYmpcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVJlc3BvbnNlKHJlc3BvbnNlOiBQYXJ0aWFsPFJlc3BvbnNlPiB8IHN0cmluZyk6IExhbWJkYVJlc3BvbnNlIHtcbiAgY29uc3Qge1xuICAgIGlzQmFzZTY0RW5jb2RlZCA9IGZhbHNlLFxuICAgIHN0YXR1c0NvZGUgPSAyMDAsXG4gICAgaGVhZGVycyA9IHt9LFxuICAgIG11bHRpVmFsdWVIZWFkZXJzID0ge30sXG4gICAgYm9keSA9ICcnLFxuICAgIGh0bWwgPSB1bmRlZmluZWQsXG4gICAganNvbiA9IHVuZGVmaW5lZCxcbiAgICB4bWwgPSB1bmRlZmluZWQsXG4gIH0gPSB0eXBlb2YgcmVzcG9uc2UgPT09ICdzdHJpbmcnXG4gICAgPyB7XG4gICAgICAgIGJvZHk6IHJlc3BvbnNlLFxuICAgICAgfVxuICAgIDogcmVzcG9uc2VcblxuICBsZXQgY29udGVudFR5cGUgPSAndGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04J1xuXG4gIGlmICghIWpzb24pIHtcbiAgICBjb250ZW50VHlwZSA9ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04J1xuICB9IGVsc2UgaWYgKCEheG1sKSB7XG4gICAgY29udGVudFR5cGUgPSAnYXBwbGljYXRpb24veG1sOyBjaGFyc2V0PXV0Zi04J1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBpc0Jhc2U2NEVuY29kZWQsXG4gICAgc3RhdHVzQ29kZSxcbiAgICBoZWFkZXJzOiB7XG4gICAgICAnQ29udGVudC1UeXBlJzogY29udGVudFR5cGUsXG4gICAgICAuLi5oZWFkZXJzLFxuICAgIH0sXG4gICAgbXVsdGlWYWx1ZUhlYWRlcnMsXG4gICAgYm9keTogc3RyaW5naWZ5KGJvZHkgfHwgaHRtbCB8fCBqc29uIHx8IHhtbCB8fCAnJyksXG4gIH1cbn1cbiIsICJleHBvcnQgZnVuY3Rpb24gY3JlYXRlTGl2ZVJlbG9hZFNjcmlwdCh7IHBvcnQgfTogeyBwb3J0OiBudW1iZXIgfSkge1xuICByZXR1cm4gYFxuICAgIDxzY3JpcHQ+XG4gICAgICAoZnVuY3Rpb24gKGdsb2JhbCkge1xuICAgICAgICB2YXIgc29ja2V0ID0gbmV3IFdlYlNvY2tldCgnd3M6Ly9sb2NhbGhvc3Q6JHtwb3J0fScpO1xuXG4gICAgICAgIHNvY2tldC5hZGRFdmVudExpc3RlbmVyKCdvcGVuJywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ1twcmVzdGFdIGNvbm5lY3RlZCBvbiBwb3J0ICR7cG9ydH0nKVxuICAgICAgICB9KTtcblxuICAgICAgICBzb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFxcYCdbcHJlc3RhXSByZWNlaXZlZCBcXCRcXHtldmVudC5kYXRhXFx9XFxgKVxuICAgICAgICAgIGlmIChldmVudC5kYXRhID09PSAncmVmcmVzaCcpIHtcbiAgICAgICAgICAgIGdsb2JhbC5sb2NhdGlvbi5yZWxvYWQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHNvY2tldC5hZGRFdmVudExpc3RlbmVyKCdjbG9zZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnW3ByZXN0YV0gZGlzY29ubmVjdGVkJylcbiAgICAgICAgfSk7XG4gICAgICB9KSh0aGlzKTtcbiAgICA8L3NjcmlwdD5cbiAgYFxufVxuIiwgImltcG9ydCAqIGFzIGxvZ2dlciBmcm9tICcuL2xvZydcbmltcG9ydCB7IEhvb2tzIH0gZnJvbSAnLi9jcmVhdGVFbWl0dGVyJ1xuaW1wb3J0IHsgQ29uZmlnIH0gZnJvbSAnLi9jb25maWcnXG5cbmV4cG9ydCB0eXBlIFBsdWdpbkludGVyZmFjZSA9IHtcbiAgY2xlYW51cD8oKTogdm9pZFxufVxuZXhwb3J0IHR5cGUgUGx1Z2luID0gKGNvbmZpZzogQ29uZmlnLCBob29rczogSG9va3MpID0+IFByb21pc2U8UGx1Z2luSW50ZXJmYWNlIHwgdm9pZD4gfCBQbHVnaW5JbnRlcmZhY2UgfCB2b2lkXG5leHBvcnQgdHlwZSBQbHVnaW5Jbml0ID0gKC4uLnByb3BzOiBhbnkpID0+IFBsdWdpblxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUGx1Z2luKGluaXQ6IFBsdWdpbkluaXQpIHtcbiAgcmV0dXJuIGluaXRcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGluaXRQbHVnaW5zKHBsdWdpbnM6IFBsdWdpbltdLCBpbnN0YW5jZTogQ29uZmlnLCBob29rczogSG9va3MpIHtcbiAgY29uc3QgaW5zdGFudGlhdGVkID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgcGx1Z2luc1xuICAgICAgLm1hcCgocCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBwKGluc3RhbmNlLCBob29rcylcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGxvZ2dlci5lcnJvcih7XG4gICAgICAgICAgICBsYWJlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgIGVycm9yOiBlIGFzIEVycm9yLFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pIGFzIFBsdWdpbkludGVyZmFjZVtdXG4gIClcblxuICByZXR1cm4ge1xuICAgIGFzeW5jIGNsZWFudXAoKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5hbGwoaW5zdGFudGlhdGVkLm1hcCgocCkgPT4gcCAmJiBwLmNsZWFudXAgJiYgcC5jbGVhbnVwKCkpKVxuICAgIH0sXG4gIH1cbn1cbiIsICJleHBvcnQgZW51bSBFdmVudHMge1xuICBQb3N0QnVpbGQgPSAncG9zdC1idWlsZCcsXG4gIEJ1aWxkRmlsZSA9ICdidWlsZC1maWxlJyxcbiAgQnJvd3NlclJlZnJlc2ggPSAnYnJvd3Nlci1yZWZyZXNoJyxcbn1cblxuZXhwb3J0IHR5cGUgQ2FsbGFibGUgPSAoLi4uYXJnczogYW55W10pID0+IHZvaWRcblxuZXhwb3J0IHR5cGUgSG9va1Bvc3RCdWlsZFBheWxvYWQgPSB7XG4gIG91dHB1dDogc3RyaW5nXG4gIHN0YXRpY091dHB1dDogc3RyaW5nXG4gIGZ1bmN0aW9uc091dHB1dDogc3RyaW5nXG4gIGZ1bmN0aW9uc01hbmlmZXN0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG59XG5cbmV4cG9ydCB0eXBlIEhvb2tCdWlsZEZpbGVQYXlsb2FkID0ge1xuICBmaWxlOiBzdHJpbmdcbn1cblxuZXhwb3J0IHR5cGUgRGVzdHJveUhvb2tDYWxsYmFjayA9ICgpID0+IHZvaWRcblxuZXhwb3J0IHR5cGUgSG9va3MgPSB7XG4gIGVtaXRQb3N0QnVpbGQocHJvcHM6IEhvb2tQb3N0QnVpbGRQYXlsb2FkKTogdm9pZFxuICBvblBvc3RCdWlsZChjYjogKHByb3BzOiBIb29rUG9zdEJ1aWxkUGF5bG9hZCkgPT4gdm9pZCk6IERlc3Ryb3lIb29rQ2FsbGJhY2tcbiAgZW1pdEJ1aWxkRmlsZShwcm9wczogSG9va0J1aWxkRmlsZVBheWxvYWQpOiB2b2lkXG4gIG9uQnVpbGRGaWxlKGNiOiAocHJvcHM6IEhvb2tCdWlsZEZpbGVQYXlsb2FkKSA9PiB2b2lkKTogRGVzdHJveUhvb2tDYWxsYmFja1xuICBlbWl0QnJvd3NlclJlZnJlc2goKTogdm9pZFxuICBvbkJyb3dzZXJSZWZyZXNoKGNiOiAoKSA9PiB2b2lkKTogRGVzdHJveUhvb2tDYWxsYmFja1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRW1pdHRlcigpIHtcbiAgbGV0IGV2ZW50czogeyBbZXZlbnQ6IHN0cmluZ106IENhbGxhYmxlW10gfSA9IHt9XG5cbiAgZnVuY3Rpb24gZW1pdChldjogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IHZvaWQge1xuICAgIGV2ZW50c1tldl0gPyBldmVudHNbZXZdLm1hcCgoZm46IENhbGxhYmxlKSA9PiBmbiguLi5hcmdzKSkgOiBbXVxuICB9XG5cbiAgZnVuY3Rpb24gb24oZXY6IHN0cmluZywgZm46ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCkge1xuICAgIGV2ZW50c1tldl0gPSBldmVudHNbZXZdID8gZXZlbnRzW2V2XS5jb25jYXQoZm4pIDogW2ZuXVxuICAgIHJldHVybiAoKSA9PiBldmVudHNbZXZdLnNwbGljZShldmVudHNbZXZdLmluZGV4T2YoZm4pLCAxKVxuICB9XG5cbiAgZnVuY3Rpb24gY2xlYXIoKSB7XG4gICAgZXZlbnRzID0ge31cbiAgfVxuXG4gIGZ1bmN0aW9uIGxpc3RlbmVycyhldjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGV2ZW50c1tldl0gfHwgW11cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZW1pdCxcbiAgICBvbixcbiAgICBjbGVhcixcbiAgICBsaXN0ZW5lcnMsXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUhvb2tzKGVtaXR0ZXI6IFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZUVtaXR0ZXI+KTogSG9va3Mge1xuICByZXR1cm4ge1xuICAgIGVtaXRQb3N0QnVpbGQocHJvcHMpIHtcbiAgICAgIGVtaXR0ZXIuZW1pdCgncG9zdEJ1aWxkJywgcHJvcHMpXG4gICAgfSxcbiAgICBvblBvc3RCdWlsZChjYikge1xuICAgICAgcmV0dXJuIGVtaXR0ZXIub24oJ3Bvc3RCdWlsZCcsIGNiKVxuICAgIH0sXG4gICAgZW1pdEJ1aWxkRmlsZShwcm9wcykge1xuICAgICAgZW1pdHRlci5lbWl0KCdidWlsZEZpbGUnLCBwcm9wcylcbiAgICB9LFxuICAgIG9uQnVpbGRGaWxlKGNiKSB7XG4gICAgICByZXR1cm4gZW1pdHRlci5vbignYnVpbGRGaWxlJywgY2IpXG4gICAgfSxcbiAgICBlbWl0QnJvd3NlclJlZnJlc2goKSB7XG4gICAgICBlbWl0dGVyLmVtaXQoJ2Jyb3dzZXJSZWZyZXNoJylcbiAgICB9LFxuICAgIG9uQnJvd3NlclJlZnJlc2goY2IpIHtcbiAgICAgIHJldHVybiBlbWl0dGVyLm9uKCdicm93c2VyUmVmcmVzaCcsIGNiKVxuICAgIH0sXG4gIH1cbn1cbiIsICJpbXBvcnQgcGF0aCBmcm9tICdwYXRoJ1xuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJ1xuaW1wb3J0IHsgYnVpbGQgYXMgZXNidWlsZCB9IGZyb20gJ2VzYnVpbGQnXG5cbmltcG9ydCB7IG91dHB1dExhbWJkYXMgfSBmcm9tICcuL291dHB1dExhbWJkYXMnXG5pbXBvcnQgeyBnZXRGaWxlcywgaXNTdGF0aWMsIGlzRHluYW1pYyB9IGZyb20gJy4vZ2V0RmlsZXMnXG5pbXBvcnQgeyBidWlsZFN0YXRpY0ZpbGVzIH0gZnJvbSAnLi9yZW5kZXJTdGF0aWNFbnRyaWVzJ1xuaW1wb3J0IHsgdGltZXIgfSBmcm9tICcuL3RpbWVyJ1xuaW1wb3J0ICogYXMgbG9nZ2VyIGZyb20gJy4vbG9nJ1xuaW1wb3J0IHsgQ29uZmlnIH0gZnJvbSAnLi9jb25maWcnXG5pbXBvcnQgeyBIb29rcyB9IGZyb20gJy4vY3JlYXRlRW1pdHRlcidcbmltcG9ydCB7IHJlcXVpcmVTYWZlIH0gZnJvbSAnLi91dGlscydcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkKGNvbmZpZzogQ29uZmlnLCBob29rczogSG9va3MpIHtcbiAgY29uc3QgdG90YWxUaW1lID0gdGltZXIoKVxuICBjb25zdCBmaWxlcyA9IGdldEZpbGVzKGNvbmZpZy5maWxlcylcbiAgY29uc3Qgc3RhdGljSWRzID0gZmlsZXMuZmlsdGVyKGlzU3RhdGljKVxuICBjb25zdCBkeW5hbWljSWRzID0gZmlsZXMuZmlsdGVyKGlzRHluYW1pYylcblxuICBsb2dnZXIuZGVidWcoe1xuICAgIGxhYmVsOiAnYnVpbGQnLFxuICAgIG1lc3NhZ2U6ICdzdGFydGluZyBidWlsZCcsXG4gIH0pXG5cbiAgaWYgKCFzdGF0aWNJZHMubGVuZ3RoICYmICFkeW5hbWljSWRzLmxlbmd0aCkge1xuICAgIGxvZ2dlci53YXJuKHtcbiAgICAgIGxhYmVsOiAnZmlsZXMnLFxuICAgICAgbWVzc2FnZTogJ25vIGZpbGVzIHdlcmUgZm91bmQsIG5vdGhpbmcgdG8gYnVpbGQnLFxuICAgIH0pXG4gIH0gZWxzZSB7XG4gICAgbGV0IHN0YXRpY1RpbWUgPSAnJ1xuICAgIGxldCBzdGF0aWNGaWxlQW1vdW50ID0gMFxuICAgIGxldCBkeW5hbWljVGltZSA9ICcnXG4gICAgbGV0IGNvcHlUaW1lID0gJydcblxuICAgIGNvbnN0IHRhc2tzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFtcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmIChzdGF0aWNJZHMubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3QgdGltZSA9IHRpbWVyKClcblxuICAgICAgICAgIGNvbnN0IHsgc3RhdGljRmlsZXNNYXAgfSA9IGF3YWl0IGJ1aWxkU3RhdGljRmlsZXMoc3RhdGljSWRzLCBjb25maWcpXG5cbiAgICAgICAgICBzdGF0aWNUaW1lID0gdGltZSgpXG4gICAgICAgICAgc3RhdGljRmlsZUFtb3VudCA9IE9iamVjdC5rZXlzKHN0YXRpY0ZpbGVzTWFwKS5yZWR1Y2UoKGNvdW50LCBrZXkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiAoY291bnQgKz0gc3RhdGljRmlsZXNNYXBba2V5XS5sZW5ndGgpXG4gICAgICAgICAgfSwgMClcbiAgICAgICAgfVxuICAgICAgfSkoKSxcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmIChkeW5hbWljSWRzLmxlbmd0aCkge1xuICAgICAgICAgIGNvbnN0IHRpbWUgPSB0aW1lcigpXG4gICAgICAgICAgY29uc3QgcGtnID0gcmVxdWlyZVNhZmUocGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICdwYWNrYWdlLmpzb24nKSlcblxuICAgICAgICAgIG91dHB1dExhbWJkYXMoZHluYW1pY0lkcywgY29uZmlnKVxuXG4gICAgICAgICAgYXdhaXQgZXNidWlsZCh7XG4gICAgICAgICAgICBlbnRyeVBvaW50czogT2JqZWN0LnZhbHVlcyhyZXF1aXJlKGNvbmZpZy5mdW5jdGlvbnNNYW5pZmVzdCkpLFxuICAgICAgICAgICAgb3V0ZGlyOiBjb25maWcuZnVuY3Rpb25zT3V0cHV0RGlyLFxuICAgICAgICAgICAgcGxhdGZvcm06ICdub2RlJyxcbiAgICAgICAgICAgIHRhcmdldDogWydub2RlMTInXSxcbiAgICAgICAgICAgIG1pbmlmeTogdHJ1ZSxcbiAgICAgICAgICAgIGFsbG93T3ZlcndyaXRlOiB0cnVlLFxuICAgICAgICAgICAgZXh0ZXJuYWw6IE9iamVjdC5rZXlzKHBrZy5kZXBlbmRlbmNpZXMgfHwge30pLFxuICAgICAgICAgICAgYnVuZGxlOiB0cnVlLFxuICAgICAgICAgICAgZGVmaW5lOiB7XG4gICAgICAgICAgICAgICdwcm9jZXNzLmVudi5QUkVTVEFfU0VSVkVSTEVTU19SVU5USU1FJzogJ3RydWUnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgZHluYW1pY1RpbWUgPSB0aW1lKClcbiAgICAgICAgfVxuICAgICAgfSkoKSxcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKGNvbmZpZy5hc3NldHMpKSB7XG4gICAgICAgICAgY29uc3QgdGltZSA9IHRpbWVyKClcblxuICAgICAgICAgIGZzLmNvcHlTeW5jKGNvbmZpZy5hc3NldHMsIGNvbmZpZy5zdGF0aWNPdXRwdXREaXIpXG5cbiAgICAgICAgICBjb3B5VGltZSA9IHRpbWUoKVxuICAgICAgICB9XG4gICAgICB9KSgpLFxuICAgIF0pXG5cbiAgICAvLyBzaW5jZSB3ZSdyZSBidWlsZGluZyAobm90IHdhdGNoKSBpZiBhbnkgdGFzayBmYWlscywgZXhpdCB3aXRoIGVycm9yXG4gICAgaWYgKHRhc2tzLmZpbmQoKHRhc2spID0+IHRhc2suc3RhdHVzID09PSAncmVqZWN0ZWQnKSkge1xuICAgICAgbG9nZ2VyLmRlYnVnKHtcbiAgICAgICAgbGFiZWw6ICdidWlsZCcsXG4gICAgICAgIG1lc3NhZ2U6ICdidWlsZCBwYXJ0aWFsbHkgZmFpbGVkJyxcbiAgICAgIH0pXG5cbiAgICAgIC8vIGxvZyBvdXQgZXJyb3JzXG4gICAgICB0YXNrcy5mb3JFYWNoKCh0YXNrKSA9PiB7XG4gICAgICAgIGlmICh0YXNrLnN0YXR1cyA9PT0gJ3JlamVjdGVkJykge1xuICAgICAgICAgIC8vIFRPRE8gY2FuIHN3YWxsb3cgZXJyb3JzIGluIHRlc3RpbmdcbiAgICAgICAgICBsb2dnZXIuZXJyb3Ioe1xuICAgICAgICAgICAgbGFiZWw6ICdlcnJvcicsXG4gICAgICAgICAgICBlcnJvcjogdGFzay5yZWFzb24sXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdwcmVzdGEgYnVpbGQgZmFpbGVkJylcbiAgICB9XG5cbiAgICBpZiAoc3RhdGljVGltZSkge1xuICAgICAgbG9nZ2VyLmluZm8oe1xuICAgICAgICBsYWJlbDogJ3N0YXRpYycsXG4gICAgICAgIG1lc3NhZ2U6IGByZW5kZXJlZCAke3N0YXRpY0ZpbGVBbW91bnR9IGZpbGUocylgLFxuICAgICAgICBkdXJhdGlvbjogc3RhdGljVGltZSxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKGR5bmFtaWNUaW1lKSB7XG4gICAgICBsb2dnZXIuaW5mbyh7XG4gICAgICAgIGxhYmVsOiAnbGFtYmRhJyxcbiAgICAgICAgbWVzc2FnZTogYGNvbXBpbGVkICR7ZHluYW1pY0lkcy5sZW5ndGh9IGZ1bmN0aW9uKHMpYCxcbiAgICAgICAgZHVyYXRpb246IGR5bmFtaWNUaW1lLFxuICAgICAgfSlcbiAgICB9XG5cbiAgICBpZiAoY29weVRpbWUpIHtcbiAgICAgIGxvZ2dlci5pbmZvKHtcbiAgICAgICAgbGFiZWw6ICdhc3NldHMnLFxuICAgICAgICBtZXNzYWdlOiBgY29waWVkIGluICR7Y29weVRpbWV9YCxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaG9va3MuZW1pdFBvc3RCdWlsZCh7XG4gICAgICBvdXRwdXQ6IGNvbmZpZy5vdXRwdXQsXG4gICAgICBzdGF0aWNPdXRwdXQ6IGNvbmZpZy5zdGF0aWNPdXRwdXREaXIsXG4gICAgICBmdW5jdGlvbnNPdXRwdXQ6IGNvbmZpZy5mdW5jdGlvbnNPdXRwdXREaXIsXG4gICAgICBmdW5jdGlvbnNNYW5pZmVzdDogcmVxdWlyZVNhZmUoY29uZmlnLmZ1bmN0aW9uc01hbmlmZXN0KSxcbiAgICB9KVxuXG4gICAgaWYgKHN0YXRpY1RpbWUgfHwgZHluYW1pY1RpbWUpIHtcbiAgICAgIGxvZ2dlci5pbmZvKHtcbiAgICAgICAgbGFiZWw6ICdjb21wbGV0ZScsXG4gICAgICAgIG1lc3NhZ2U6IGBpbiAke3RvdGFsVGltZSgpfWAsXG4gICAgICB9KVxuICAgIH1cbiAgfVxufVxuIiwgImV4cG9ydCBmdW5jdGlvbiByZXF1aXJlRnJlc2gobW9kOiBzdHJpbmcpIHtcbiAgZGVsZXRlIHJlcXVpcmUuY2FjaGVbbW9kXVxuICByZXR1cm4gcmVxdWlyZShtb2QpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXF1aXJlU2FmZShtb2Q6IHN0cmluZykge1xuICB0cnkge1xuICAgIHJldHVybiByZXF1aXJlRnJlc2gobW9kKVxuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIHt9XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBTb2NrZXQgfSBmcm9tICduZXQnXG5pbXBvcnQgaHR0cCBmcm9tICdodHRwJ1xuaW1wb3J0IHNpcnYgZnJvbSAnc2lydidcbmltcG9ydCBtaW1lIGZyb20gJ21pbWUtdHlwZXMnXG5pbXBvcnQgdG9SZWdFeHAgZnJvbSAncmVnZXhwYXJhbSdcbmltcG9ydCBzdGF0dXMgZnJvbSAnc3RhdHVzZXMnXG5pbXBvcnQgeyBXZWJTb2NrZXRTZXJ2ZXIgfSBmcm9tICd3cydcblxuaW1wb3J0IHsgdGltZXIgfSBmcm9tICcuL3RpbWVyJ1xuaW1wb3J0ICogYXMgbG9nZ2VyIGZyb20gJy4vbG9nJ1xuaW1wb3J0IHsgY3JlYXRlRGVmYXVsdEh0bWxSZXNwb25zZSB9IGZyb20gJy4vY3JlYXRlRGVmYXVsdEh0bWxSZXNwb25zZSdcbmltcG9ydCB7IHJlcXVlc3RUb0V2ZW50IH0gZnJvbSAnLi9yZXF1ZXN0VG9FdmVudCdcbmltcG9ydCB7IHNlbmRTZXJ2ZXJsZXNzUmVzcG9uc2UgfSBmcm9tICcuL3NlbmRTZXJ2ZXJsZXNzUmVzcG9uc2UnXG5pbXBvcnQgeyBjcmVhdGVMaXZlUmVsb2FkU2NyaXB0IH0gZnJvbSAnLi9saXZlUmVsb2FkU2NyaXB0J1xuaW1wb3J0IHsgSGFuZGxlciwgRXZlbnQsIFJlc3BvbnNlLCBDb250ZXh0IH0gZnJvbSAnLi9sYW1iZGEnXG5pbXBvcnQgeyBDb25maWcgfSBmcm9tICcuL2NvbmZpZydcbmltcG9ydCB7IEhvb2tzIH0gZnJvbSAnLi9jcmVhdGVFbWl0dGVyJ1xuaW1wb3J0IHsgbm9ybWFsaXplUmVzcG9uc2UgfSBmcm9tICcuL25vcm1hbGl6ZVJlc3BvbnNlJ1xuaW1wb3J0IHsgcmVxdWlyZUZyZXNoIH0gZnJvbSAnLi91dGlscydcblxuZXhwb3J0IGludGVyZmFjZSBIdHRwRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHN0YXR1c0NvZGU/OiBudW1iZXJcbiAgbWVzc2FnZTogc3RyaW5nXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVIdHRwRXJyb3Ioc3RhdHVzQ29kZTogbnVtYmVyLCBtZXNzYWdlOiBzdHJpbmcpOiBIdHRwRXJyb3Ige1xuICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcihtZXNzYWdlKVxuICAvLyBAdHMtaWdub3JlXG4gIGVycm9yLnN0YXR1c0NvZGUgPSBzdGF0dXNDb2RlXG4gIHJldHVybiBlcnJvclxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWltZVR5cGUocmVzcG9uc2U6IFJlc3BvbnNlKSB7XG4gIGNvbnN0IHR5cGUgPSAocmVzcG9uc2U/LmhlYWRlcnMgfHwge30pWydDb250ZW50LVR5cGUnXSB8fCAnaHRtbCdcbiAgcmV0dXJuIHR5cGUgPyBtaW1lLmV4dGVuc2lvbihTdHJpbmcodHlwZSkpIHx8ICdodG1sJyA6ICdodG1sJ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbG9hZExhbWJkYUZyb01hbmlmZXN0KHVybDogc3RyaW5nLCBtYW5pZmVzdDogeyBbcm91dGU6IHN0cmluZ106IHN0cmluZyB9KTogeyBoYW5kbGVyOiBIYW5kbGVyIH0ge1xuICBjb25zdCByb3V0ZXMgPSBPYmplY3Qua2V5cyhtYW5pZmVzdClcbiAgY29uc3QgbGFtYmRhRmlsZXBhdGggPSByb3V0ZXNcbiAgICAubWFwKChyb3V0ZSkgPT4gKHtcbiAgICAgIG1hdGNoZXI6IHRvUmVnRXhwKHJvdXRlKSxcbiAgICAgIHJvdXRlLFxuICAgIH0pKVxuICAgIC5maWx0ZXIoKHsgbWF0Y2hlciB9KSA9PiB7XG4gICAgICByZXR1cm4gbWF0Y2hlci5wYXR0ZXJuLnRlc3QodXJsLnNwbGl0KCc/JylbMF0pXG4gICAgfSlcbiAgICAubWFwKCh7IHJvdXRlIH0pID0+IG1hbmlmZXN0W3JvdXRlXSlbMF1cblxuICByZXR1cm4gbGFtYmRhRmlsZXBhdGggPyByZXF1aXJlKGxhbWJkYUZpbGVwYXRoKSA6IHVuZGVmaW5lZFxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0hhbmRsZXIoZXZlbnQ6IEV2ZW50LCBsYW1iZGE6IHsgaGFuZGxlcjogSGFuZGxlciB9KSB7XG4gIGNvbnN0IGFjY2VwdCA9IGV2ZW50LmhlYWRlcnMuQWNjZXB0IHx8IGV2ZW50LmhlYWRlcnMuYWNjZXB0XG4gIGNvbnN0IGFjY2VwdHNKc29uID0gYWNjZXB0ICYmIGFjY2VwdC5pbmNsdWRlcygnanNvbicpXG5cbiAgLypcbiAgICogTm8gYXNzZXQgZmlsZSwgbm8gc3RhdGljIGZpbGUsIHRyeSBkeW5hbWljXG4gICAqL1xuICB0cnkge1xuICAgIGlmICghbGFtYmRhIHx8ICFsYW1iZGEuaGFuZGxlcikge1xuICAgICAgdGhyb3cgY3JlYXRlSHR0cEVycm9yKDQwNCwgJycpXG4gICAgfVxuXG4gICAgcmV0dXJuIG5vcm1hbGl6ZVJlc3BvbnNlKGF3YWl0IGxhbWJkYS5oYW5kbGVyKGV2ZW50LCB7IGF3c1JlcXVlc3RJZDogJ3ByZXN0YSBkZXYnIH0gYXMgQ29udGV4dCkpXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zdCBlcnJvciA9IGUgYXMgSHR0cEVycm9yXG4gICAgY29uc3QgeyBzdGF0dXNDb2RlID0gNTAwIH0gPSBlcnJvclxuXG4gICAgaWYgKHN0YXR1c0NvZGUgPiA0OTkpXG4gICAgICBsb2dnZXIuZXJyb3Ioe1xuICAgICAgICBsYWJlbDogJ2Vycm9yJyxcbiAgICAgICAgbWVzc2FnZTogZXJyb3IubWVzc2FnZSB8fCBzdGF0dXMubWVzc2FnZVtzdGF0dXNDb2RlXSxcbiAgICAgICAgZXJyb3IsXG4gICAgICB9KVxuXG4gICAgcmV0dXJuIG5vcm1hbGl6ZVJlc3BvbnNlKHtcbiAgICAgIHN0YXR1c0NvZGU6IHN0YXR1c0NvZGUsXG4gICAgICBodG1sOiBhY2NlcHRzSnNvbiA/IHVuZGVmaW5lZCA6IGNyZWF0ZURlZmF1bHRIdG1sUmVzcG9uc2UoeyBzdGF0dXNDb2RlIH0pLFxuICAgICAganNvbjogYWNjZXB0c0pzb24gPyB7IGRldGFpbDogc3RhdHVzLm1lc3NhZ2Vbc3RhdHVzQ29kZV0gfSA6IHVuZGVmaW5lZCxcbiAgICB9KVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZXF1ZXN0SGFuZGxlcih7IHBvcnQsIGNvbmZpZyB9OiB7IHBvcnQ6IG51bWJlcjsgY29uZmlnOiBDb25maWcgfSkge1xuICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gcmVxdWVzdEhhbmRsZXIocmVxOiBodHRwLkluY29taW5nTWVzc2FnZSwgcmVzOiBodHRwLlNlcnZlclJlc3BvbnNlKSB7XG4gICAgY29uc3QgdGltZSA9IHRpbWVyKClcbiAgICBjb25zdCBldmVudCA9IGF3YWl0IHJlcXVlc3RUb0V2ZW50KHJlcSkgLy8gc3RvY2sgQVdTIEV2ZW50IHNoYXBlXG4gICAgY29uc3QgbWFuaWZlc3QgPSByZXF1aXJlRnJlc2goY29uZmlnLmZ1bmN0aW9uc01hbmlmZXN0KVxuICAgIGNvbnN0IGxhbWJkYSA9IGxvYWRMYW1iZGFGcm9NYW5pZmVzdChldmVudC5wYXRoLCBtYW5pZmVzdClcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHByb2Nlc3NIYW5kbGVyKGV2ZW50LCBsYW1iZGEpXG4gICAgY29uc3QgcmVkaXIgPSByZXNwb25zZS5zdGF0dXNDb2RlID4gMjk5ICYmIHJlc3BvbnNlLnN0YXR1c0NvZGUgPCAzOTlcbiAgICBjb25zdCBtaW1lID0gZ2V0TWltZVR5cGUocmVzcG9uc2UpXG5cbiAgICBpZiAobWltZSA9PT0gJ2h0bWwnKSB7XG4gICAgICByZXNwb25zZS5ib2R5ID0gKHJlc3BvbnNlLmJvZHkgfHwgJycpLnNwbGl0KCc8L2JvZHk+JylbMF0gKyBjcmVhdGVMaXZlUmVsb2FkU2NyaXB0KHsgcG9ydCB9KVxuICAgIH1cblxuICAgIGxvZ2dlcltyZXNwb25zZS5zdGF0dXNDb2RlIDwgMjk5ID8gJ2luZm8nIDogJ2Vycm9yJ10oe1xuICAgICAgbGFiZWw6ICdzZXJ2ZScsXG4gICAgICBtZXNzYWdlOiBgJHtyZXNwb25zZS5zdGF0dXNDb2RlfSAke3JlZGlyID8gcmVzcG9uc2U/LmhlYWRlcnM/LkxvY2F0aW9uIHx8IGV2ZW50LnBhdGggOiBldmVudC5wYXRofWAsXG4gICAgICBkdXJhdGlvbjogdGltZSgpLFxuICAgIH0pXG5cbiAgICBzZW5kU2VydmVybGVzc1Jlc3BvbnNlKHJlcywgcmVzcG9uc2UpXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNlcnZlckhhbmRsZXIoeyBwb3J0LCBjb25maWcgfTogeyBwb3J0OiBudW1iZXI7IGNvbmZpZzogQ29uZmlnIH0pIHtcbiAgY29uc3Qgc3RhdGljRGlyID0gY29uZmlnLnN0YXRpY091dHB1dERpclxuICBjb25zdCBhc3NldERpciA9IGNvbmZpZy5hc3NldHNcblxuICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gc2VydmVIYW5kbGVyKHJlcTogaHR0cC5JbmNvbWluZ01lc3NhZ2UsIHJlczogaHR0cC5TZXJ2ZXJSZXNwb25zZSkge1xuICAgIGNvbnN0IHRpbWUgPSB0aW1lcigpXG4gICAgY29uc3QgdXJsID0gcmVxLnVybCBhcyBzdHJpbmdcblxuICAgIGxvZ2dlci5kZWJ1Zyh7XG4gICAgICBsYWJlbDogJ2RlYnVnJyxcbiAgICAgIG1lc3NhZ2U6IGBoYW5kbGluZyAke3VybH1gLFxuICAgIH0pXG5cbiAgICAvLyBob29rIGludG8gc2lydiBmb3IgbG9nZ2luZyBvbmx5XG4gICAgZnVuY3Rpb24gc2V0SGVhZGVycyhyZXM6IGh0dHAuU2VydmVyUmVzcG9uc2UsIHBhdGhuYW1lOiBzdHJpbmcpIHtcbiAgICAgIGxvZ2dlci5pbmZvKHtcbiAgICAgICAgbGFiZWw6ICdzZXJ2ZScsXG4gICAgICAgIG1lc3NhZ2U6IGAke3Jlcy5zdGF0dXNDb2RlfSAke3BhdGhuYW1lfWAsXG4gICAgICAgIGR1cmF0aW9uOiB0aW1lKCksXG4gICAgICB9KVxuICAgIH1cblxuICAgIHNpcnYoYXNzZXREaXIsIHsgZGV2OiB0cnVlLCBzZXRIZWFkZXJzIH0pKHJlcSwgcmVzLCAoKSA9PiB7XG4gICAgICBzaXJ2KHN0YXRpY0RpciwgeyBkZXY6IHRydWUsIHNldEhlYWRlcnMgfSkocmVxLCByZXMsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY3JlYXRlUmVxdWVzdEhhbmRsZXIoeyBwb3J0LCBjb25maWcgfSkocmVxLCByZXMpXG4gICAgICB9KVxuICAgIH0pXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNlcnZlKGNvbmZpZzogQ29uZmlnLCBob29rczogSG9va3MpIHtcbiAgY29uc3QgcG9ydCA9IGNvbmZpZy5wb3J0XG4gIGNvbnN0IHNlcnZlciA9IGh0dHAuY3JlYXRlU2VydmVyKGNyZWF0ZVNlcnZlckhhbmRsZXIoeyBwb3J0LCBjb25maWcgfSkpLmxpc3Rlbihwb3J0KVxuICBjb25zdCB3ZWJzb2NrZXQgPSBuZXcgV2ViU29ja2V0U2VydmVyKHsgc2VydmVyIH0pXG4gIGNvbnN0IHNvY2tldHM6IFNvY2tldFtdID0gW11cblxuICBzZXJ2ZXIub24oJ2Nvbm5lY3Rpb24nLCAoc29ja2V0KSA9PiB7XG4gICAgc29ja2V0cy5wdXNoKHNvY2tldClcbiAgICBzb2NrZXQub24oJ2Nsb3NlJywgKCkgPT4gc29ja2V0cy5zcGxpY2Uoc29ja2V0cy5pbmRleE9mKHNvY2tldCksIDEpKVxuICB9KVxuXG4gIGhvb2tzLm9uQnJvd3NlclJlZnJlc2goKCkgPT4ge1xuICAgIGxvZ2dlci5kZWJ1Zyh7XG4gICAgICBsYWJlbDogJ2RlYnVnJyxcbiAgICAgIG1lc3NhZ2U6IGByZWZyZXNoIGV2ZW50IHJlY2VpdmVkYCxcbiAgICB9KVxuXG4gICAgd2Vic29ja2V0LmNsaWVudHMuZm9yRWFjaCgod3MpID0+IHdzLnNlbmQoJ3JlZnJlc2gnKSlcbiAgfSlcblxuICByZXR1cm4ge1xuICAgIGFzeW5jIGNsb3NlKCkge1xuICAgICAgLy8gc28ganVzdCBhbHdheXMgcmVzb2x2ZSBPS1xuICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHkpID0+IHtcbiAgICAgICAgc2VydmVyLmNsb3NlKCgpID0+IHkoMSkpXG4gICAgICAgIC8vIHNvY2tldHMgaW5jbHVkZXMgd3Mgc29ja2V0c1xuICAgICAgICBzb2NrZXRzLmZvckVhY2goKHdzKSA9PiB3cy5kZXN0cm95KCkpXG4gICAgICB9KVxuICAgIH0sXG4gIH1cbn1cbiIsICJpbXBvcnQgc3RhdHVzIGZyb20gJ3N0YXR1c2VzJ1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRGVmYXVsdEh0bWxSZXNwb25zZSh7IHN0YXR1c0NvZGUgfTogeyBzdGF0dXNDb2RlOiBudW1iZXIgfSkge1xuICByZXR1cm4gYDwhLS0gYnVpbHQgd2l0aCBwcmVzdGEgaHR0cHM6Ly9ucG0uaW0vcHJlc3RhIC0tPlxuICAgIDwhRE9DVFlQRSBodG1sPlxuICAgIDxodG1sPlxuICAgICAgPGhlYWQ+XG4gICAgICAgIDxtZXRhIGNoYXJzZXQ9XCJVVEYtOFwiIC8+XG4gICAgICAgIDxtZXRhIG5hbWU9XCJ2aWV3cG9ydFwiIGNvbnRlbnQ9XCJ3aWR0aD1kZXZpY2Utd2lkdGgsaW5pdGlhbC1zY2FsZT0xXCIgLz5cbiAgICAgICAgPHRpdGxlPiR7c3RhdHVzQ29kZX0gXHUyMDE0XHUwMEEwJHtzdGF0dXMubWVzc2FnZVtzdGF0dXNDb2RlXX08L3RpdGxlPlxuICAgICAgICA8bGluayByZWw9XCJpY29uXCIgdHlwZT1cImltYWdlL3BuZ1wiIGhyZWY9XCJodHRwczovL3ByZXN0YS5ydW4vZmF2aWNvbi5wbmdcIj5cbiAgICAgICAgPGxpbmsgcmVsPVwiaWNvblwiIHR5cGU9XCJpbWFnZS9zdmdcIiBocmVmPVwiaHR0cHM6Ly9wcmVzdGEucnVuL2Zhdmljb24uc3ZnXCI+XG4gICAgICAgIDxsaW5rIHJlbD1cInByZWNvbm5lY3RcIiBocmVmPVwiaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbVwiPlxuICAgICAgICA8bGluayByZWw9XCJwcmVjb25uZWN0XCIgaHJlZj1cImh0dHBzOi8vZm9udHMuZ3N0YXRpYy5jb21cIiBjcm9zc29yaWdpbj5cbiAgICAgICAgPGxpbmsgaHJlZj1cImh0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzMj9mYW1pbHk9SW50ZXI6d2dodEA0MDA7OTAwJmRpc3BsYXk9c3dhcFwiIHJlbD1cInN0eWxlc2hlZXRcIj4gXG4gICAgICAgIDxsaW5rIHJlbD0nc3R5bGVzaGVldCcgaHJlZj0naHR0cHM6Ly91bnBrZy5jb20vc3Zic3RyYXRlQDUuMS4wL3N2YnN0cmF0ZS5jc3MnIC8+XG4gICAgICAgIDxzdHlsZT5cbiAgICAgICAgICBodG1sLGJvZHkge1xuICAgICAgICAgICAgZm9udC1mYW1pbHk6ICdJbnRlcicsICdzYW5zLXNlcmlmJztcbiAgICAgICAgICAgIGNvbG9yOiAjMjMyODNEO1xuICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI0RBREVGMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgI2Zhdmljb24ge1xuICAgICAgICAgICAgZmlsbDogIzIzMjgzRDtcbiAgICAgICAgICB9XG4gICAgICAgICAgQG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaykge1xuICAgICAgICAgICAgaHRtbCxib2R5IHtcbiAgICAgICAgICAgICAgY29sb3I6ICNEQURFRjA7XG4gICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICMyMzI4M0Q7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAjZmF2aWNvbiB7XG4gICAgICAgICAgICAgIGZpbGw6ICNEQURFRjA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICA8L3N0eWxlPlxuICAgICAgPC9oZWFkPlxuICAgICAgPGJvZHkgY2xhc3M9J3cgZiBhaWMgamNjJyBzdHlsZT0naGVpZ2h0OiAxMDB2aCc+XG4gICAgICAgIDxkaXYgY2xhc3M9J3AxMiB0YWMnPlxuICAgICAgICAgIDxoMT4ke3N0YXR1c0NvZGV9PC9oMT5cbiAgICAgICAgICA8cCBjbGFzcz0nbWIxJz4ke3N0YXR1cy5tZXNzYWdlW3N0YXR1c0NvZGVdfTwvcD5cblxuICAgICAgICAgIDxzdmcgd2lkdGg9XCIzMlwiIGhlaWdodD1cIjMyXCIgdmlld0JveD1cIjAgMCAzMiAzMlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNhKVwiPlxuICAgICAgICAgICAgICA8cGF0aCBpZD1cImZhdmljb25cIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIGQ9XCJNMTAuNCA3Yy0uMyAwLS44LjItMSAuNUwxLjEgMjIuMWMtLjIuMyAwIC42LjMuNmw0IC4zLTIuMSAyLjZjLS4yLjMtLjEuNi4yLjZsMTYuOCAxLjNjLjQgMCAuOC0uMiAxLS40TDMyIDEzLjljLjItLjIuMS0uNS0uMi0uNWwtNi40LS41IDIuMi00Yy4yLS4zIDAtLjUtLjMtLjZMMTAuNCA3Wk0yNCAxMi44bDEuOS0zLjQtMTUuNS0xLjItNy43IDEzLjQgMy42LjMgNy41LTkuNGMuMy0uMy43LS41IDEtLjRsOS4yLjdaTTcuNiAyMmw3LjEtOC45IDguNy43LTUuMiA5TDcuNiAyMlptLTEgMS4xIDExLjYgMWMuMyAwIC44LS4zIDEtLjZsNS41LTkuNiA1LjUuNS05LjcgMTJMNSAyNS4ybDEuNy0yWlwiIGZpbGw9XCIjMjMyODNEXCIvPlxuICAgICAgICAgICAgPC9nPlxuICAgICAgICAgICAgPGRlZnM+XG4gICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cImFcIj5cbiAgICAgICAgICAgICAgICA8cGF0aCBmaWxsPVwiI2ZmZlwiIGQ9XCJNMCAwaDMydjMySDB6XCIvPlxuICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxuICAgICAgICAgICAgPC9kZWZzPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvYm9keT5cbiAgICA8L2h0bWw+XG4gIGBcbn1cbiIsICJpbXBvcnQgaHR0cCBmcm9tICdodHRwJ1xuaW1wb3J0IHsgcGFyc2UgYXMgcGFyc2VVcmwgfSBmcm9tICd1cmwnXG5pbXBvcnQgcmF3Qm9keSBmcm9tICdyYXctYm9keSdcbmltcG9ydCBtaW1lIGZyb20gJ21pbWUtdHlwZXMnXG5cbmltcG9ydCB7IEV2ZW50IH0gZnJvbSAnLi9sYW1iZGEnXG5pbXBvcnQgeyBub3JtYWxpemVIZWFkZXJzIH0gZnJvbSAnLi9ub3JtYWxpemVIZWFkZXJzJ1xuaW1wb3J0IHsgcGFyc2VRdWVyeVN0cmluZ1BhcmFtZXRlcnMgfSBmcm9tICcuL3BhcnNlUXVlcnlTdHJpbmdQYXJhbWV0ZXJzJ1xuXG4vLyBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9uZXRsaWZ5L2NsaS9ibG9iLzI3YmI3YjliMzBkNDY1YWJlODZmODdmNDI3NGRkN2E3MWIxYjAwM2Ivc3JjL3V0aWxzL3NlcnZlLWZ1bmN0aW9ucy5qcyNMMTY3XG5jb25zdCBCQVNFXzY0X01JTUVfUkVHRVhQID0gL2ltYWdlfGF1ZGlvfHZpZGVvfGFwcGxpY2F0aW9uXFwvcGRmfGFwcGxpY2F0aW9uXFwvemlwfGFwcGxpY2F0b25cXC9vY3RldC1zdHJlYW0vaVxuZnVuY3Rpb24gc2hvdWxkQmFzZTY0RW5jb2RlKGNvbnRlbnRUeXBlOiBzdHJpbmcpIHtcbiAgcmV0dXJuIEJvb2xlYW4oY29udGVudFR5cGUpICYmIEJBU0VfNjRfTUlNRV9SRUdFWFAudGVzdChjb250ZW50VHlwZSlcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlcXVlc3RUb0V2ZW50KHJlcTogaHR0cC5JbmNvbWluZ01lc3NhZ2UpOiBQcm9taXNlPEV2ZW50PiB7XG4gIGNvbnN0IHsgdXJsOiBwYXRoID0gJycsIG1ldGhvZCB9ID0gcmVxXG4gIGNvbnN0IHsgaGVhZGVycywgbXVsdGlWYWx1ZUhlYWRlcnMgfSA9IG5vcm1hbGl6ZUhlYWRlcnMocmVxLmhlYWRlcnMpXG4gIGNvbnN0IGlzQmFzZTY0RW5jb2RlZCA9IHNob3VsZEJhc2U2NEVuY29kZShoZWFkZXJzWydjb250ZW50LXR5cGUnXSB8fCAnJylcbiAgY29uc3QgY29udGVudExlbmd0aEhlYWRlciA9IGhlYWRlcnNbJ2NvbnRlbnQtbGVuZ3RoJ11cbiAgY29uc3QgYm9keSA9IGNvbnRlbnRMZW5ndGhIZWFkZXJcbiAgICA/IGF3YWl0IHJhd0JvZHkocmVxLCB7XG4gICAgICAgIGxpbWl0OiAnMW1iJyxcbiAgICAgICAgZW5jb2Rpbmc6IGhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddID8gbWltZS5jaGFyc2V0KGhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddKSB8fCB0cnVlIDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgOiB1bmRlZmluZWRcbiAgY29uc3QgcmF3UXVlcnkgPSBwYXJzZVVybChwYXRoKS5xdWVyeSB8fCAnJ1xuICBjb25zdCB7IHF1ZXJ5U3RyaW5nUGFyYW1ldGVycywgbXVsdGlWYWx1ZVF1ZXJ5U3RyaW5nUGFyYW1ldGVycyB9ID0gcGFyc2VRdWVyeVN0cmluZ1BhcmFtZXRlcnMocmF3UXVlcnkpXG5cbiAgcmV0dXJuIHtcbiAgICByYXdVcmw6IHBhdGgsXG4gICAgcGF0aCxcbiAgICBodHRwTWV0aG9kOiBtZXRob2QgYXMgc3RyaW5nLFxuICAgIGhlYWRlcnMsXG4gICAgbXVsdGlWYWx1ZUhlYWRlcnMsXG4gICAgcmF3UXVlcnksXG4gICAgcXVlcnlTdHJpbmdQYXJhbWV0ZXJzLFxuICAgIG11bHRpVmFsdWVRdWVyeVN0cmluZ1BhcmFtZXRlcnMsXG4gICAgYm9keTogYm9keSA/IEJ1ZmZlci5mcm9tKGJvZHkpLnRvU3RyaW5nKGlzQmFzZTY0RW5jb2RlZCA/ICdiYXNlNjQnIDogJ3V0ZjgnKSA6IG51bGwsXG4gICAgaXNCYXNlNjRFbmNvZGVkLFxuICAgIHBhdGhQYXJhbWV0ZXJzOiB7fSxcbiAgfVxufVxuIiwgImltcG9ydCBodHRwIGZyb20gJ2h0dHAnXG5pbXBvcnQgeyBIZWFkZXJzLCBNdWx0aVZhbHVlSGVhZGVycyB9IGZyb20gJy4vbGFtYmRhJ1xuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplSGVhZGVycyhyYXdIZWFkZXJzOiBodHRwLkluY29taW5nTWVzc2FnZVsnaGVhZGVycyddKSB7XG4gIGNvbnN0IGhlYWRlcnM6IEhlYWRlcnMgPSB7fVxuICBjb25zdCBtdWx0aVZhbHVlSGVhZGVyczogTXVsdGlWYWx1ZUhlYWRlcnMgPSB7fVxuXG4gIGZvciAoY29uc3QgaGVhZGVyIG9mIE9iamVjdC5rZXlzKHJhd0hlYWRlcnMpKSB7XG4gICAgY29uc3Qga2V5ID0gaGVhZGVyLnRvTG93ZXJDYXNlKClcbiAgICBjb25zdCB2YWx1ZSA9IHJhd0hlYWRlcnNbaGVhZGVyXVxuXG4gICAgaWYgKCF2YWx1ZSkgY29udGludWVcblxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgbXVsdGlWYWx1ZUhlYWRlcnNba2V5XSA9IHZhbHVlXG4gICAgfSBlbHNlIHtcbiAgICAgIGhlYWRlcnNba2V5XSA9IHZhbHVlXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgaGVhZGVycywgbXVsdGlWYWx1ZUhlYWRlcnMgfVxufVxuIiwgIi8qKlxuICogVEhJUyBJUyBQUk9EIENPREUsIEJFIENBUkVGVUwgV0hBVCBZT1UgQUREIFRPIFRISVMgRklMRVxuICovXG5cbmltcG9ydCB7IHBhcnNlIGFzIHBhcnNlUXVlcnkgfSBmcm9tICdxdWVyeS1zdHJpbmcnXG5pbXBvcnQgeyBRdWVyeVN0cmluZ1BhcmFtZXRlcnMsIE11bHRpVmFsdWVRdWVyeVN0cmluZ1BhcmFtZXRlcnMgfSBmcm9tICcuL2xhbWJkYSdcblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUXVlcnlTdHJpbmdQYXJhbWV0ZXJzKHF1ZXJ5OiBzdHJpbmcpIHtcbiAgY29uc3QgcGFyYW1zID0gcGFyc2VRdWVyeShxdWVyeSwgeyBhcnJheUZvcm1hdDogJ2NvbW1hJyB9KVxuXG4gIGNvbnN0IHF1ZXJ5U3RyaW5nUGFyYW1ldGVyczogUXVlcnlTdHJpbmdQYXJhbWV0ZXJzID0ge31cbiAgY29uc3QgbXVsdGlWYWx1ZVF1ZXJ5U3RyaW5nUGFyYW1ldGVyczogTXVsdGlWYWx1ZVF1ZXJ5U3RyaW5nUGFyYW1ldGVycyA9IHt9XG5cbiAgZm9yIChjb25zdCBwYXJhbSBvZiBPYmplY3Qua2V5cyhwYXJhbXMpKSB7XG4gICAgY29uc3QgdmFsdWUgPSBwYXJhbXNbcGFyYW1dXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBtdWx0aVZhbHVlUXVlcnlTdHJpbmdQYXJhbWV0ZXJzW3BhcmFtXSA9IHZhbHVlXG4gICAgfSBlbHNlIGlmICh2YWx1ZSkge1xuICAgICAgcXVlcnlTdHJpbmdQYXJhbWV0ZXJzW3BhcmFtXSA9IHZhbHVlXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgcXVlcnlTdHJpbmdQYXJhbWV0ZXJzLCBtdWx0aVZhbHVlUXVlcnlTdHJpbmdQYXJhbWV0ZXJzIH1cbn1cbiIsICJpbXBvcnQgaHR0cCBmcm9tICdodHRwJ1xuXG5pbXBvcnQgeyBub3JtYWxpemVSZXNwb25zZSB9IGZyb20gJy4vbm9ybWFsaXplUmVzcG9uc2UnXG5pbXBvcnQgeyBSZXNwb25zZSB9IGZyb20gJy4vbGFtYmRhJ1xuXG5leHBvcnQgZnVuY3Rpb24gc2VuZFNlcnZlcmxlc3NSZXNwb25zZShyZXM6IGh0dHAuU2VydmVyUmVzcG9uc2UsIHI6IFBhcnRpYWw8UmVzcG9uc2U+KSB7XG4gIGNvbnN0IHJlc3BvbnNlID0gbm9ybWFsaXplUmVzcG9uc2UocilcblxuICAvLyBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9uZXRsaWZ5L2NsaS9ibG9iLzI3YmI3YjliMzBkNDY1YWJlODZmODdmNDI3NGRkN2E3MWIxYjAwM2Ivc3JjL3V0aWxzL3NlcnZlLWZ1bmN0aW9ucy5qcyNMNzNcbiAgZm9yIChjb25zdCBrZXkgaW4gci5tdWx0aVZhbHVlSGVhZGVycykge1xuICAgIHJlcy5zZXRIZWFkZXIoa2V5LCBTdHJpbmcoci5tdWx0aVZhbHVlSGVhZGVyc1trZXldKSlcbiAgfVxuXG4gIGZvciAoY29uc3Qga2V5IGluIHIuaGVhZGVycykge1xuICAgIHJlcy5zZXRIZWFkZXIoa2V5LCBTdHJpbmcoci5oZWFkZXJzW2tleV0pKVxuICB9XG5cbiAgcmVzLnN0YXR1c0NvZGUgPSByZXNwb25zZS5zdGF0dXNDb2RlXG4gIHJlcy53cml0ZShyZXNwb25zZS5ib2R5KVxuICByZXMuZW5kKClcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7bThCQUFBLG9DQUVBLE9BQWlCLG1CQUNqQixHQUFpQiw2NUNDSGpCLE9BQWUsdUJBQ2YsR0FBaUIsbUJBQ2pCLEdBQXFCLHVCQ0ZyQiw2SkFBeUIsb0JDQWxCLEdBQU0sR0FBTSxDQUNqQixXQUFZLGFBQ1osWUFBYSxlREVSLEdBQUssR0FBTCxVQUFLLEVBQUwsQ0FDTCxRQUFRLFFBQ1IsT0FBTyxPQUNQLE9BQU8sT0FDUCxNQUFNLFVBSkksV0FlWixHQUFJLEdBQWMsR0FFWixHQUFTLEVBQ1osRUFBTyxPQUFRLFdBQ2YsRUFBTyxNQUFPLFFBQ2QsRUFBTyxNQUFPLFVBQ2QsRUFBTyxLQUFNLE9BS1QsYUFBbUIsQ0FDeEIsR0FBSSxDQUFDLFFBQVEsSUFBSSxRQUNmLEtBQU0sSUFBSSxPQUFNLGdEQUdsQixNQUFPLEdBR0YsV0FBZ0IsRUFBa0IsQ0FDdkMsR0FBSSxRQUFRLElBQUksUUFDZCxFQUFLLEtBQUssT0FDTCxDQUNMLEdBQU0sR0FBUSxRQUFRLElBQUksYUFDcEIsRUFBVSxRQUFRLElBQUksYUFBZSxFQUFJLFdBQWEsT0FBUyxNQUVyRSxHQUFJLENBQUMsR0FBUyxFQUFRLFFBQVUsRUFBTyxNQUFPLE9BRTlDLFFBQVEsSUFDTixDQUNFLFVBQUUsS0FBSyxHQUNQLFVBQUUsR0FBTyxFQUFRLE9BQVMsU0FBd0IsRUFBUSxPQUMxRCxFQUFRLFFBQ1IsRUFBUSxTQUFXLFVBQUUsS0FBSyxJQUFNLEVBQVEsVUFBWSxHQUNwRCxFQUFRLE1BQVE7QUFBQTtBQUFBLEVBQU8sRUFBUSxNQUFNLE9BQVMsRUFBUTtBQUFBO0FBQUEsRUFBYyxJQUVuRSxPQUFPLFNBQ1AsS0FBSyxPQUtQLFdBQWUsRUFBa0IsQ0FDdEMsRUFBTyxHQUFFLE1BQU8sRUFBTyxPQUFVLElBRzVCLFdBQWMsRUFBa0IsQ0FDckMsRUFBTyxHQUFFLE1BQU8sRUFBTyxNQUFT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