UNPKG

87.8 kBJavaScriptView Raw
1#!/usr/bin/env node
2var Ke=Object.create;var M=Object.defineProperty,Qe=Object.defineProperties,Xe=Object.getOwnPropertyDescriptor,Ye=Object.getOwnPropertyDescriptors,Ze=Object.getOwnPropertyNames,ue=Object.getOwnPropertySymbols,et=Object.getPrototypeOf,fe=Object.prototype.hasOwnProperty,tt=Object.prototype.propertyIsEnumerable;var me=(e,t,o)=>t in e?M(e,t,{enumerable:!0,configurable:!0,writable:!0,value:o}):e[t]=o,h=(e,t)=>{for(var o in t||(t={}))fe.call(t,o)&&me(e,o,t[o]);if(ue)for(var o of ue(t))tt.call(t,o)&&me(e,o,t[o]);return e},R=(e,t)=>Qe(e,Ye(t)),de=e=>M(e,"__esModule",{value:!0});var ge=(e,t)=>{de(e);for(var o in t)M(e,o,{get:t[o],enumerable:!0})},rt=(e,t,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of Ze(t))!fe.call(e,s)&&s!=="default"&&M(e,s,{get:()=>t[s],enumerable:!(o=Xe(t,s))||o.enumerable});return e},c=e=>rt(de(M(e!=null?Ke(et(e)):{},"default",e&&e.__esModule&&"default"in e?{get:()=>e.default,enumerable:!0}:{value:e,enumerable:!0})),e);ge(exports,{registerRuntime:()=>X});var ze=c(require("path")),Ge=c(require("sade"));var ot="presta",st="0.45.2",it="Hyper minimal framework for the modern web.",nt="./dist/index.js",at="./dist/index.d.ts",lt={presta:"dist/bin.js"},ct=["dist"],pt={build:"node scripts/build && pnpx tsc --emitDeclarationOnly",cloc:"pnpm dlx cloc './lib/*.ts'",typecheck:"pnpx tsc --noEmit"},ut={type:"git",url:"git+ssh://git@github.com/sure-thing/presta.git"},ft="estrattonbailey",mt="MIT",dt={url:"https://github.com/sure-thing/presta/issues"},gt="https://github.com/sure-thing/presta#readme",bt={"@presta/utils":"workspace:^0.1.2",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","lambda-types":"^1.0.0","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",statues:"^1.0.0-alpha1",statuses:"^2.0.1","tiny-glob":"^0.2.9","watch-dependency-graph":"^3.0.1",ws:"^8.4.0"},yt={"@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"},be={name:ot,version:st,description:it,main:nt,types:at,bin:lt,files:ct,scripts:pt,repository:ut,author:ft,license:mt,bugs:dt,homepage:gt,dependencies:bt,devDependencies:yt};var Ae=c(require("path")),pe=c(require("chokidar"));var ee={};ge(ee,{Levels:()=>F,colors:()=>k.default,debug:()=>g,error:()=>x,getLogs:()=>vt,info:()=>b,logger:()=>B,newline:()=>wt,raw:()=>xt,warn:()=>C});var k=c(require("kleur"));var v={PRODUCTION:"production",DEVELOPMENT:"development"};var F;(function(r){r.Debug="debug",r.Info="info",r.Warn="warn",r.Err="error"})(F||(F={}));var Z=[],ht={[F.Debug]:"magenta",[F.Info]:"blue",[F.Warn]:"yellow",[F.Err]:"red"};function vt(){if(!process.env.TESTING)throw new Error("Internal method was called outside test mode");return Z}function B(e){if(process.env.TESTING)Z.push(e);else{let t=process.env.PRESTA_DEBUG,o=process.env.PRESTA_ENV===v.PRODUCTION?"prod":"dev";if(!t&&e.level===F.Debug)return;console.log([k.default.gray(o),k.default[ht[e.level||"info"]](e.label),e.message,e.duration?k.default.gray("+"+e.duration):"",e.error?`
3
4${e.error.stack||e.error}
5
6`:""].filter(Boolean).join(" "))}}function g(e){B(h({level:F.Debug},e))}function b(e){B(h({level:F.Info},e))}function C(e){B(h({level:F.Warn},e))}function x(e){B(h({level:F.Err},e))}function xt(...e){process.env.TESTING?Z.push(e):console.log(...e)}function wt(){process.env.TESTING||console.log("")}var ye=c(require("fs")),P=c(require("path")),he=c(require("get-port"));var E="presta.config.js";function j(e){return(0,he.default)({port:parseInt(e,10)})}function L(e,t=!1){let o=P.default.resolve(e||E);try{return delete require.cache[o],require(o)}catch(s){return ye.default.existsSync(o)&&(x({label:"error",error:s}),t&&process.exit(1)),{}}}function _(e,t,o,s=process.cwd()){let r=h({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.assets=t.assets),t.port&&(r.port=t.port),r.files&&(r.files=[].concat(r.files).map(i=>P.default.resolve(s,i))),r.output&&(r.output=P.default.resolve(s,r.output)),r.assets&&(r.assets=P.default.resolve(s,r.assets)),R(h({},r),{staticOutputDir:P.default.join(r.output,"static"),functionsOutputDir:P.default.join(r.output,"functions"),manifestFilepath:P.default.join(r.output,"manifest.json"),__unsafe_bundle_everything:r.__unsafe_bundle_everything||!1})}var ie=c(require("fs-extra")),Oe=c(require("path")),Re=c(require("watch-dependency-graph")),De=c(require("chokidar")),Me=c(require("picomatch")),ke=c(require("@presta/utils"));var te=c(require("fs-extra")),ve=c(require("path")),xe=c(require("route-sort")),we=c(require("@presta/utils"));function Ft(e){return e.replace(process.cwd(),"").split(".").reverse().slice(1).reverse().join("-").split("/").filter(Boolean).join("-")}function $(e,t){let o=e.map(i=>{try{let{route:n}=require(i),a=Ft(i),p=ve.default.join(t.functionsOutputDir,t.env===v.PRODUCTION?a+"-"+(0,we.hashContent)(te.default.readFileSync(i,"utf8"))+".js":a+".js");return g({label:"debug",message:`generating ${a} lambda`}),delete require.cache[i],delete require.cache[p],te.default.outputFileSync(p,`import { wrapHandler } from 'presta/dist/wrapHandler';
7 import * as file from '${i}';
8 export const route = file.route
9 export const handler = wrapHandler(file)`),{type:"dynamic",src:i,dest:p,route:n}}catch(n){x({label:"error",error:n})}}).filter(Boolean),s=(0,xe.default)(o.map(i=>i.route)),r=[];for(let i of s){let n=o.find(a=>a.route===i);n&&r.push(n)}return r}var re=c(require("fs-extra")),Fe=c(require("path")),Se=c(require("tiny-glob/sync"));function H(e){return/export\s.+\sroute\s+\=/.test(re.default.readFileSync(e,"utf-8"))}function N(e){return/export\s.+\sgetStaticPaths/.test(re.default.readFileSync(e,"utf-8"))}function q(e){return[].concat(e).map(t=>(0,Se.default)(t)).flat().map(t=>Fe.default.resolve(process.cwd(),t))}var oe=c(require("fs-extra")),se=c(require("path")),Pe=c(require("mime-types")),V=c(require("@presta/utils"));function St(e){return typeof e=="object"?JSON.stringify(e):e}function Pt(e){let t={};for(let o of Object.keys(e)){let s=o.toLowerCase(),r=e[o];t[s]=r||""}return t}function I(e){let{isBase64Encoded:t=!1,statusCode:o=200,headers:s={},multiValueHeaders:r={},body:i="",html:n=void 0,json:a=void 0,xml:p=void 0}=typeof e=="string"?{body:e}:e,l="text/html; charset=utf-8";a?l="application/json; charset=utf-8":p&&(l="application/xml; charset=utf-8");let u=Pt(s),f=h({"content-type":l},u);return{isBase64Encoded:t,statusCode:o,headers:f,multiValueHeaders:r,body:St(i||n||a||p||"")}}function A({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 Et(e,t="html"){return se.default.extname(e)?e:t==="html"?`${e}/index.html`:`${e}.${t}`}async function U(e){return g({label:"debug",message:`removing old static file ${e}`}),oe.default.remove(e)}async function Ct(e){return Promise.all(e.map(U))}async function Ot(e,t,{footer:o}){let s=require(e),r=await s.getStaticPaths(),i=[];if(!r||!r.length)return i;for(let n of r){let a=(0,V.timer)(),p={path:n,pathParameters:s.route?(0,V.parsePathParameters)(n,s.route):{}},l=I(await s.handler(p,{})),u=((l==null?void 0:l.headers)||{})["content-type"],f=Pe.default.extension(u)||"html",y=Et(n,f),w=l.body+(f==="html"?o:""),d=se.default.join(t,y);oe.default.outputFileSync(d,w,"utf-8"),b({label:"built",message:n,duration:a()}),i.push(d)}return i}async function W(e,t,o={}){let s=t.env===v.DEVELOPMENT,r=t.staticOutputDir,i=s?A({port:t.port}):"";for(let n of e)try{let a=n.replace(process.cwd(),""),p=o[n]||[],l=await Ot(n,r,{footer:i});if(!l||!l.length){C({label:"paths",message:`${a} - no paths to render`}),Ct(p);continue}for(let u of p)l.includes(u)||U(u);o[n]=l}catch(a){x({label:"error",error:a});break}return{staticFilesMap:o}}var Ee=c(require("fs-extra"));function z(e){return Object.keys(e).map(t=>e[t].map(o=>({type:"static",src:t,dest:o}))).flat()}function Ce(e){return e.files.filter(t=>t.type==="dynamic")}function G(e,t){Ee.default.outputFileSync(t.manifestFilepath,JSON.stringify(e,null," "),"utf8")}function Be(e,t){let o=(0,ke.timer)(),s=$(e,t);return e.length&&b({label:"built",message:"lambdas",duration:o()}),s}function Rt(e,t,o){return(0,Me.default)(t)(e)&&!o.includes(e)}async function He(e,t){let o={},s=q(e.files);s.length||C({label:"paths",message:"no files configured"});async function r(a,p,l){for(let y of a)delete require.cache[y];let u=await W(a.filter(N),l,o),f=Be(p.filter(H),l);o=Object.assign(o,u.staticFilesMap),G({files:[...z(o),...f]},l)}await r(s,s,e),t.emitBrowserRefresh();let i=(0,Re.create)({alias:{"@":process.cwd()}});i.onChange(async a=>{await r(a,s,e),t.emitBrowserRefresh()}),i.onRemove(async([a])=>{g({label:"watch",message:`removed ${a}`}),s.splice(s.indexOf(a),1),Be(s.filter(H),e),(o[a]||[]).forEach(p=>U(Oe.default.join(e.staticOutputDir,p))),t.emitBrowserRefresh()}),i.onError(a=>{x({label:"error",error:typeof a=="string"?new Error(a):a})}),await i.add(s);let n=De.default.watch(process.cwd(),{ignoreInitial:!0,ignored:[e.output,e.assets]});return n.on("add",async a=>{!ie.default.existsSync(a)||ie.default.lstatSync(a).isDirectory()||!Rt(a,e.files,s)||(g({label:"watch",message:`add ${a}`}),s.push(a),await i.add(a),await r([a],s,e),t.emitBrowserRefresh())}),t.onBuildFile(async({file:a})=>{await r([a],s,e),t.emitBrowserRefresh()}),{async close(){await i.close(),await n.close()}}}async function J(e,t,o){let s=await Promise.all(e.map(r=>{try{return r(t,o)}catch(i){x({label:"error",error:i})}}).filter(Boolean));return{async cleanup(){return Promise.all(s.map(r=>r&&r.cleanup&&r.cleanup()))}}}var Ie;(function(s){s.PostBuild="post-build",s.BuildFile="build-file",s.BrowserRefresh="browser-refresh"})(Ie||(Ie={}));function K(){let e={};function t(i,...n){e[i]&&e[i].map(a=>a(...n))}function o(i,n){return e[i]=e[i]?e[i].concat(n):[n],()=>e[i].splice(e[i].indexOf(n),1)}function s(){e={}}function r(i){return e[i]||[]}return{emit:t,on:o,clear:s,listeners:r}}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 Te=c(require("path")),ne=c(require("fs-extra")),je=c(require("esbuild")),O=c(require("@presta/utils"));async function Le(e,t){let o=(0,O.timer)(),s=q(e.files),r=s.filter(N),i=s.filter(H);if(g({label:"build",message:"starting build"}),!r.length&&!i.length)C({label:"files",message:"no files were found, nothing to build"});else{let n="",a=0,p="",l="",u=[],f=[],y=await Promise.allSettled([(async()=>{if(r.length){let d=(0,O.timer)(),{staticFilesMap:D}=await W(r,e);u=z(D),n=d(),a=Object.keys(D).reduce((Y,Je)=>Y+=D[Je].length,0)}})(),(async()=>{if(i.length){let d=(0,O.timer)(),D=(0,O.requireSafe)(Te.default.join(process.cwd(),"package.json"));f=$(i,e),await(0,je.build)({entryPoints:f.map(Y=>Y.dest),outdir:e.functionsOutputDir,platform:"node",target:["node12"],minify:!0,allowOverwrite:!0,external:e.__unsafe_bundle_everything?[]:Object.keys(D.dependencies||{}),bundle:!0,define:{"process.env.PRESTA_SERVERLESS_RUNTIME":"true"}}),p=d()}})(),(async()=>{if(ne.default.existsSync(e.assets)){let d=(0,O.timer)();ne.default.copySync(e.assets,e.staticOutputDir),l=d()}})()]);if(y.find(d=>d.status==="rejected"))throw g({label:"build",message:"build partially failed"}),y.forEach(d=>{d.status==="rejected"&&x({label:"error",error:d.reason})}),new Error("presta build failed");let w={files:[...u,...f]};G(w,e),t.emitPostBuild({output:e.output,staticOutput:e.staticOutputDir,functionsOutput:e.functionsOutputDir,manifest:w}),n&&b({label:"static",message:`rendered ${a} file(s)`,duration:n}),p&&b({label:"lambda",message:`compiled ${i.length} function(s)`,duration:p}),l&&b({label:"assets",message:"copied",duration:l}),(n||p)&&b({label:"build",message:"complete",duration:o()})}}var _e=c(require("http")),ae=c(require("sirv")),$e=c(require("mime-types")),Ne=c(require("regexparam")),le=c(require("statuses")),qe=c(require("ws")),S=c(require("@presta/utils"));function Dt(e,t){let o=new Error(t);return o.statusCode=e,o}function Mt(e){let t=((e==null?void 0:e.headers)||{})["content-type"];return $e.default.extension(t)||"html"}function kt(e,t){let s=Ce(t).map(r=>({matcher:(0,Ne.default)(r.route),file:r})).filter(({matcher:r})=>r.pattern.test(e.split("?")[0])).map(({file:r})=>r)[0];return s?require(s.dest):void 0}async function Bt(e,t){let o=e.headers.Accept||e.headers.accept,s=o&&o.includes("json");try{if(!t||!t.handler)throw Dt(404,"");return I(await t.handler(e,{awsRequestId:"presta dev"}))}catch(r){let i=r,{statusCode:n=500}=i;return n>499&&x({label:"error",message:i.message||le.default.message[n],error:i}),I({statusCode:n,html:s?void 0:(0,S.createDefaultHtmlResponse)({statusCode:n}),json:s?{detail:le.default.message[n]}:void 0})}}function Ht({port:e,config:t}){return async function(s,r){var y;let i=(0,S.timer)(),n=await(0,S.requestToEvent)(s),a=(0,S.requireFresh)(t.manifestFilepath),p=kt(n.path,a),l=await Bt(n,p),u=l.statusCode>299&&l.statusCode<399;Mt(l)==="html"&&(l.body=(l.body||"").split("</body>")[0]+A({port:e})),(0,S.sendServerlessResponse)(r,l),ee[l.statusCode<299?"info":"error"]({label:"serve",message:`${l.statusCode} ${u&&((y=l==null?void 0:l.headers)==null?void 0:y.Location)||n.path}`,duration:i()})}}function It({port:e,config:t}){let o=t.staticOutputDir,s=t.assets;return async function(i,n){let a=(0,S.timer)(),p=i.url;g({label:"debug",message:`handling ${p}`});function l(u,f){b({label:"serve",message:`${u.statusCode} ${f}`,duration:a()})}(0,ae.default)(s,{dev:!0,setHeaders:l})(i,n,()=>{(0,ae.default)(o,{dev:!0,setHeaders:l})(i,n,async()=>{Ht({port:e,config:t})(i,n)})})}}function ce(e,t){let o=e.port,s=_e.default.createServer(It({port:o,config:e})).listen(o),r=new qe.WebSocketServer({server:s}),i=[];return s.on("connection",n=>{i.push(n),n.on("close",()=>i.splice(i.indexOf(n),1))}),t.onBrowserRefresh(()=>{g({label:"debug",message:"refresh event received"}),r.clients.forEach(n=>n.send("refresh"))}),{async close(){return new Promise(n=>{s.close(()=>n(1)),i.forEach(a=>a.destroy())})}}}async function Ve(e){let t=L(e.config,!0),o=await j(e.port||t.port||4e3),s=K(),r=Q(s),i=_(v.PRODUCTION,R(h({},e),{port:o}),t);await J(i.plugins,i,r),b({label:"build"}),await Le(i,r)}async function Ue(e){let t=e["no-serve"],o,s,r=!1;async function i(){let a,p,l,u=L(e.config);(!s||u.port&&s!==u.port)&&(s=await j(e.port||u.port||4e3),process.env.PRESTA_SERVE_URL=`http://localhost:${s}`);let f=K(),y=Q(f),w=_(v.DEVELOPMENT,R(h({},e),{port:s}),u),d=await J(w.plugins,w,y);return g({label:"debug",message:`config created ${JSON.stringify(w)}`}),t||(p=ce(w,y),l=pe.default.watch(w.assets,{ignoreInitial:!0}).on("all",()=>{y.emitBrowserRefresh()})),b({label:r?"restart":"start",message:t?"":`http://localhost:${w.port}`}),a=await He(w,y),{config:w,async close(){f.clear(),await d.cleanup(),await l.close(),await a.close(),p&&await p.close()}}}let n=pe.default.watch(Ae.default.resolve(e.config||E),{ignoreInitial:!0}).on("all",async()=>{if(!r){r=!0;try{await o.close()}catch(a){console.error(a)}console.clear(),o=await i(),r=!1}});return o=await i(),{async close(){await n.close(),await o.close()}}}async function We(e){let t=L(e.config,!0),o=await j(e.port||t.port||4e3),s=K(),r=Q(s),i=_(v.PRODUCTION,R(h({},e),{port:o}),t);await J(i.plugins,i,r),ce(i,r),b({label:"serve",message:`http://localhost:${i.port}`})}function X(e={}){require("dotenv").config({path:ze.default.join(process.cwd(),".env")}),require("module-alias").addAliases({"@":process.cwd(),"presta:internal":__dirname}),require("esbuild-register/dist/node").register(e)}var T=(0,Ge.default)("presta");T.version(be.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");T.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(),X(),Ve(e)});T.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(),X(),Ue(e)});T.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(),X(),We(e)});T.parse(process.argv);0&&(module.exports={registerRuntime});
31//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vbGliL2Jpbi50cyIsICIuLi9saWIvY2xpLnRzIiwgIi4uL2xpYi9sb2cudHMiLCAiLi4vbGliL2NvbnN0YW50cy50cyIsICIuLi9saWIvY29uZmlnLnRzIiwgIi4uL2xpYi93YXRjaC50cyIsICIuLi9saWIvb3V0cHV0TGFtYmRhcy50cyIsICIuLi9saWIvZ2V0RmlsZXMudHMiLCAiLi4vbGliL2J1aWxkU3RhdGljRmlsZXMudHMiLCAiLi4vbGliL25vcm1hbGl6ZVJlc3BvbnNlLnRzIiwgIi4uL2xpYi91dGlscy50cyIsICIuLi9saWIvbWFuaWZlc3QudHMiLCAiLi4vbGliL3BsdWdpbnMudHMiLCAiLi4vbGliL2NyZWF0ZUVtaXR0ZXIudHMiLCAiLi4vbGliL2J1aWxkLnRzIiwgIi4uL2xpYi9zZXJ2ZS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiIyEvdXNyL2Jpbi9lbnYgbm9kZVxuXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJ1xuaW1wb3J0IHNhZGUgZnJvbSAnc2FkZSdcblxuaW1wb3J0IHBrZyBmcm9tICcuLi9wYWNrYWdlLmpzb24nXG5cbmltcG9ydCB7IGJ1aWxkQ29tbWFuZCwgZGV2Q29tbWFuZCwgc2VydmVDb21tYW5kIH0gZnJvbSAnLi9jbGknXG5pbXBvcnQgeyBkZWZhdWx0Q29uZmlnRmlsZXBhdGggfSBmcm9tICcuL2NvbmZpZydcbmltcG9ydCB7IEVudiB9IGZyb20gJy4vY29uc3RhbnRzJ1xuXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJSdW50aW1lKG9wdGlvbnMgPSB7fSkge1xuICByZXF1aXJlKCdkb3RlbnYnKS5jb25maWcoeyBwYXRoOiBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJy5lbnYnKSB9KVxuXG4gIHJlcXVpcmUoJ21vZHVsZS1hbGlhcycpLmFkZEFsaWFzZXMoe1xuICAgICdAJzogcHJvY2Vzcy5jd2QoKSxcbiAgICAncHJlc3RhOmludGVybmFsJzogX19kaXJuYW1lLCAvLyBUT0RPIHdoZXJldmVyIHRoaXMgaXMgcnVubmluZyBmcm9tXG4gIH0pXG5cbiAgcmVxdWlyZSgnZXNidWlsZC1yZWdpc3Rlci9kaXN0L25vZGUnKS5yZWdpc3RlcihvcHRpb25zKVxufVxuXG5jb25zdCBwcm9ncmFtID0gc2FkZSgncHJlc3RhJylcblxucHJvZ3JhbVxuICAudmVyc2lvbihwa2cudmVyc2lvbilcbiAgLy8gZG8gbm90IHByb3ZpZGUgZGVmYXVsdCBjb25maWcgaGVyZVxuICAub3B0aW9uKCctLWNvbmZpZywgLWMnLCBgUGF0aCB0byBhIGNvbmZpZyBmaWxlLiAgKGRlZmF1bHQgJHtkZWZhdWx0Q29uZmlnRmlsZXBhdGh9KWApXG4gIC5vcHRpb24oJy0tb3V0cHV0LCAtbycsIGBTcGVjaWZ5IG91dHB1dCBkaXJlY3RvcnkgZm9yIGJ1aWx0IGZpbGVzLiAgKGRlZmF1bHQgLi9idWlsZClgKVxuICAub3B0aW9uKCctLWFzc2V0cywgLWEnLCBgU3BlY2lmeSBzdGF0aWMgYXNzZXQgZGlyZWN0b3J5LiAgKGRlZmF1bHQgLi9wdWJsaWMpYClcbiAgLm9wdGlvbignLS1kZWJ1ZywgLWQnLCBgRW5hYmxlIGRlYnVnIG1vZGUgKHByaW50cyBtb3JlIGxvZ3MpYClcbiAgLmV4YW1wbGUoYGRldiBpbmRleC5qc3ggLW8gZGlzdGApXG4gIC5leGFtcGxlKGBkZXYgJ3BhZ2VzLyoudHN4JyAtbyBzdGF0aWNgKVxuICAuZXhhbXBsZShgJ3BhZ2VzLyoudHN4J2ApXG4gIC5leGFtcGxlKGAtYyBzaXRlLmpzb25gKVxuICAuZXhhbXBsZShgc2VydmUgLXAgODA4MGApXG5cbnByb2dyYW1cbiAgLmNvbW1hbmQoJ2J1aWxkJywgJ0J1aWxkIHByb2plY3QgdG8gb3V0cHV0IGRpcmVjdG9yeS4nLCB7IGRlZmF1bHQ6IHRydWUgfSlcbiAgLmV4YW1wbGUoYGApXG4gIC5leGFtcGxlKGBmaWxlcy8qKi8qLmpzYClcbiAgLmV4YW1wbGUoYC1jICR7ZGVmYXVsdENvbmZpZ0ZpbGVwYXRofWApXG4gIC5hY3Rpb24oKG9wdGlvbnMpID0+IHtcbiAgICBwcm9jZXNzLmVudi5QUkVTVEFfRU5WID0gRW52LlBST0RVQ1RJT05cbiAgICBwcm9jZXNzLmVudi5QUkVTVEFfREVCVUcgPSBvcHRpb25zLmRlYnVnID8gJ2RlYnVnJyA6ICcnXG4gICAgY29uc29sZS5jbGVhcigpXG4gICAgcmVnaXN0ZXJSdW50aW1lKClcbiAgICBidWlsZENvbW1hbmQob3B0aW9ucylcbiAgfSlcblxucHJvZ3JhbVxuICAuY29tbWFuZCgnZGV2JywgJ1N0YXJ0IFByZXN0YSBkZXYgc2VydmVyIGFuZCB3YXRjaCBmaWxlcycsIHsgYWxpYXM6ICd3YXRjaCcgfSlcbiAgLm9wdGlvbignLS1wb3J0LCAtcCcsIGBQb3J0IHRvIHJ1biB0aGUgbG9jYWwgc2VydmVyLiAgKGRlZmF1bHQgNDAwMClgKVxuICAub3B0aW9uKCctLW5vLXNlcnZlLCAtbicsIGBEbyBub3QgcnVuIGxvY2FsIGRldiBzZXJ2ZXIuICAoZGVmYXVsdCBmYWxzZSlgKVxuICAuZGVzY3JpYmUoJ1dhdGNoIHByb2plY3QgYW5kIGJ1aWxkIHRvIG91dHB1dCBkaXJlY3RvcnkuJylcbiAgLmV4YW1wbGUoYGRldmApXG4gIC5leGFtcGxlKGBkZXYgLi9maWxlcy8qKi8qLmpzYClcbiAgLmV4YW1wbGUoYGRldiAuL2ZpbGVzLyoqLyouanMgLW8gLi9vdXRgKVxuICAuZXhhbXBsZShgZGV2IC1jICR7ZGVmYXVsdENvbmZpZ0ZpbGVwYXRofWApXG4gIC5hY3Rpb24oKG9wdGlvbnMpID0+IHtcbiAgICBwcm9jZXNzLmVudi5QUkVTVEFfRU5WID0gRW52LkRFVkVMT1BNRU5UXG4gICAgcHJvY2Vzcy5lbnYuUFJFU1RBX0RFQlVHID0gb3B0aW9ucy5kZWJ1ZyA/ICdkZWJ1ZycgOiAnJ1xuICAgIGNvbnNvbGUuY2xlYXIoKVxuICAgIHJlZ2lzdGVyUnVudGltZSgpXG4gICAgZGV2Q29tbWFuZChvcHRpb25zKVxuICB9KVxuXG5wcm9ncmFtXG4gIC5jb21tYW5kKCdzZXJ2ZScpXG4gIC5vcHRpb24oJy0tcG9ydCwgLXAnLCBgUG9ydCB0byBydW4gdGhlIGxvY2FsIHNlcnZlci4gIChkZWZhdWx0IDQwMDApYClcbiAgLmRlc2NyaWJlKCdTZXJ2ZSBidWlsdCBmaWxlcywgbGFtYmRhcywgYW5kIHN0YXRpYyBhc3NldHMuJylcbiAgLmV4YW1wbGUoYHNlcnZlYClcbiAgLmV4YW1wbGUoYHNlcnZlIC1vIC4vb3V0IC1wIDgwODBgKVxuICAuZXhhbXBsZShgc2VydmUgLWMgJHtkZWZhdWx0Q29uZmlnRmlsZXBhdGh9YClcbiAgLmFjdGlvbihhc3luYyAob3B0aW9ucykgPT4ge1xuICAgIHByb2Nlc3MuZW52LlBSRVNUQV9FTlYgPSBFbnYuREVWRUxPUE1FTlRcbiAgICBwcm9jZXNzLmVudi5QUkVTVEFfREVCVUcgPSBvcHRpb25zLmRlYnVnID8gJ2RlYnVnJyA6ICcnXG4gICAgY29uc29sZS5jbGVhcigpXG4gICAgcmVnaXN0ZXJSdW50aW1lKClcbiAgICBzZXJ2ZUNvbW1hbmQob3B0aW9ucylcbiAgfSlcblxucHJvZ3JhbS5wYXJzZShwcm9jZXNzLmFyZ3YpXG4iLCAiaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcbmltcG9ydCBjaG9raWRhciBmcm9tICdjaG9raWRhcidcblxuaW1wb3J0ICogYXMgbG9nZ2VyIGZyb20gJy4vbG9nJ1xuaW1wb3J0IHsgT3B0aW9ucywgY3JlYXRlLCBnZXRDb25maWdGaWxlLCBkZWZhdWx0Q29uZmlnRmlsZXBhdGgsIGdldEF2YWlsYWJsZVBvcnQgfSBmcm9tICcuL2NvbmZpZydcbmltcG9ydCB7IHdhdGNoIH0gZnJvbSAnLi93YXRjaCdcbmltcG9ydCB7IGluaXRQbHVnaW5zIH0gZnJvbSAnLi9wbHVnaW5zJ1xuaW1wb3J0IHsgY3JlYXRlRW1pdHRlciwgY3JlYXRlSG9va3MgfSBmcm9tICcuL2NyZWF0ZUVtaXR0ZXInXG5pbXBvcnQgeyBidWlsZCB9IGZyb20gJy4vYnVpbGQnXG5pbXBvcnQgeyBzZXJ2ZSB9IGZyb20gJy4vc2VydmUnXG5pbXBvcnQgeyBFbnYgfSBmcm9tICcuL2NvbnN0YW50cydcblxuZXhwb3J0IHR5cGUgUHJlc3RhQ0xJT3B0aW9ucyA9IHtcbiAgY29uZmlnPzogc3RyaW5nXG4gIG91dHB1dD86IHN0cmluZ1xuICBkZWJ1Zz86IGJvb2xlYW5cbn0gJiBQYXJ0aWFsPE9wdGlvbnM+XG5cbmV4cG9ydCB0eXBlIFByZXN0YUNMSUJ1aWxkT3B0aW9ucyA9IFByZXN0YUNMSU9wdGlvbnMgJiB7XG4gIF86IHN0cmluZ1tdXG59XG5cbmV4cG9ydCB0eXBlIFByZXN0YUNMSVNlcnZlT3B0aW9ucyA9IFByZXN0YUNMSUJ1aWxkT3B0aW9ucyAmIHtcbiAgcG9ydD86IHN0cmluZ1xuICAnbm8tc2VydmUnOiBib29sZWFuXG59XG5cbmV4cG9ydCB0eXBlIFByZXN0YUNMSURldk9wdGlvbnMgPSBQcmVzdGFDTElTZXJ2ZU9wdGlvbnNcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkQ29tbWFuZChvcHRpb25zOiBQcmVzdGFDTElCdWlsZE9wdGlvbnMpIHtcbiAgY29uc3QgY29uZmlnRmlsZSA9IGdldENvbmZpZ0ZpbGUob3B0aW9ucy5jb25maWcsIHRydWUpXG4gIGNvbnN0IHBvcnQgPSBhd2FpdCBnZXRBdmFpbGFibGVQb3J0KG9wdGlvbnMucG9ydCB8fCBjb25maWdGaWxlLnBvcnQgfHwgNDAwMClcblxuICBjb25zdCBlbWl0dGVyID0gY3JlYXRlRW1pdHRlcigpXG4gIGNvbnN0IGhvb2tzID0gY3JlYXRlSG9va3MoZW1pdHRlcilcbiAgY29uc3QgY29uZmlnID0gY3JlYXRlKEVudi5QUk9EVUNUSU9OLCB7IC4uLm9wdGlvbnMsIHBvcnQgfSwgY29uZmlnRmlsZSlcbiAgYXdhaXQgaW5pdFBsdWdpbnMoY29uZmlnLnBsdWdpbnMsIGNvbmZpZywgaG9va3MpXG5cbiAgbG9nZ2VyLmluZm8oe1xuICAgIGxhYmVsOiAnYnVpbGQnLFxuICB9KVxuXG4gIGF3YWl0IGJ1aWxkKGNvbmZpZywgaG9va3MpXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZXZDb21tYW5kKG9wdGlvbnM6IFByZXN0YUNMSURldk9wdGlvbnMpIHtcbiAgY29uc3Qgbm9TZXJ2ZSA9IG9wdGlvbnNbJ25vLXNlcnZlJ11cbiAgbGV0IGRldlNlcnZlcjogYW55XG4gIGxldCBwb3J0OiBudW1iZXJcbiAgbGV0IHJlc3RhcnRpbmcgPSBmYWxzZVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHN0YXJ0RGV2U2VydmVyKCkge1xuICAgIGxldCB3YXRjaFRhc2s6IGFueVxuICAgIGxldCBodHRwU2VydmVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXJ2ZT5cbiAgICBsZXQgc3RhdGljQXNzZXRXYXRjaGVyOiBSZXR1cm5UeXBlPHR5cGVvZiBjaG9raWRhci53YXRjaD5cblxuICAgIGNvbnN0IHVzZXJDb25maWdGaWxlID0gZ2V0Q29uZmlnRmlsZShvcHRpb25zLmNvbmZpZylcblxuICAgIGlmICghcG9ydCB8fCAodXNlckNvbmZpZ0ZpbGUucG9ydCAmJiBwb3J0ICE9PSB1c2VyQ29uZmlnRmlsZS5wb3J0KSkge1xuICAgICAgcG9ydCA9IGF3YWl0IGdldEF2YWlsYWJsZVBvcnQob3B0aW9ucy5wb3J0IHx8IHVzZXJDb25maWdGaWxlLnBvcnQgfHwgNDAwMClcbiAgICAgIHByb2Nlc3MuZW52LlBSRVNUQV9TRVJWRV9VUkwgPSBgaHR0cDovL2xvY2FsaG9zdDoke3BvcnR9YFxuICAgIH1cblxuICAgIGNvbnN0IGVtaXR0ZXIgPSBjcmVhdGVFbWl0dGVyKClcbiAgICBjb25zdCBob29rcyA9IGNyZWF0ZUhvb2tzKGVtaXR0ZXIpXG4gICAgY29uc3QgY29uZmlnID0gY3JlYXRlKEVudi5ERVZFTE9QTUVOVCwgeyAuLi5vcHRpb25zLCBwb3J0IH0sIHVzZXJDb25maWdGaWxlKVxuICAgIGNvbnN0IHBsdWdpbnMgPSBhd2FpdCBpbml0UGx1Z2lucyhjb25maWcucGx1Z2lucywgY29uZmlnLCBob29rcylcblxuICAgIGxvZ2dlci5kZWJ1Zyh7XG4gICAgICBsYWJlbDogJ2RlYnVnJyxcbiAgICAgIG1lc3NhZ2U6IGBjb25maWcgY3JlYXRlZCAke0pTT04uc3RyaW5naWZ5KGNvbmZpZyl9YCxcbiAgICB9KVxuXG4gICAgaWYgKCFub1NlcnZlKSB7XG4gICAgICBodHRwU2VydmVyID0gc2VydmUoY29uZmlnLCBob29rcylcblxuICAgICAgc3RhdGljQXNzZXRXYXRjaGVyID0gY2hva2lkYXIud2F0Y2goY29uZmlnLmFzc2V0cywgeyBpZ25vcmVJbml0aWFsOiB0cnVlIH0pLm9uKCdhbGwnLCAoKSA9PiB7XG4gICAgICAgIGhvb2tzLmVtaXRCcm93c2VyUmVmcmVzaCgpXG4gICAgICB9KVxuICAgIH1cblxuICAgIGxvZ2dlci5pbmZvKHtcbiAgICAgIGxhYmVsOiByZXN0YXJ0aW5nID8gJ3Jlc3RhcnQnIDogJ3N0YXJ0JyxcbiAgICAgIG1lc3NhZ2U6ICFub1NlcnZlID8gYGh0dHA6Ly9sb2NhbGhvc3Q6JHtjb25maWcucG9ydH1gIDogJycsXG4gICAgfSlcblxuICAgIHdhdGNoVGFzayA9IGF3YWl0IHdhdGNoKGNvbmZpZywgaG9va3MpXG5cbiAgICByZXR1cm4ge1xuICAgICAgY29uZmlnLFxuICAgICAgYXN5bmMgY2xvc2UoKSB7XG4gICAgICAgIGVtaXR0ZXIuY2xlYXIoKVxuICAgICAgICBhd2FpdCBwbHVnaW5zLmNsZWFudXAoKVxuICAgICAgICBhd2FpdCBzdGF0aWNBc3NldFdhdGNoZXIuY2xvc2UoKVxuICAgICAgICBhd2FpdCB3YXRjaFRhc2suY2xvc2UoKVxuXG4gICAgICAgIGlmIChodHRwU2VydmVyKSB7XG4gICAgICAgICAgYXdhaXQgaHR0cFNlcnZlci5jbG9zZSgpXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfVxuICB9XG5cbiAgY29uc3QgY29uZmlnV2F0Y2hlciA9IGNob2tpZGFyXG4gICAgLndhdGNoKHBhdGgucmVzb2x2ZShvcHRpb25zLmNvbmZpZyB8fCBkZWZhdWx0Q29uZmlnRmlsZXBhdGgpLCB7IGlnbm9yZUluaXRpYWw6IHRydWUgfSlcbiAgICAub24oJ2FsbCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGlmIChyZXN0YXJ0aW5nKSByZXR1cm5cblxuICAgICAgcmVzdGFydGluZyA9IHRydWVcblxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZGV2U2VydmVyLmNsb3NlKClcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlKVxuICAgICAgfVxuXG4gICAgICBjb25zb2xlLmNsZWFyKClcblxuICAgICAgZGV2U2VydmVyID0gYXdhaXQgc3RhcnREZXZTZXJ2ZXIoKVxuXG4gICAgICByZXN0YXJ0aW5nID0gZmFsc2VcbiAgICB9KVxuXG4gIGRldlNlcnZlciA9IGF3YWl0IHN0YXJ0RGV2U2VydmVyKClcblxuICByZXR1cm4ge1xuICAgIGFzeW5jIGNsb3NlKCkge1xuICAgICAgYXdhaXQgY29uZmlnV2F0Y2hlci5jbG9zZSgpXG4gICAgICBhd2FpdCBkZXZTZXJ2ZXIuY2xvc2UoKVxuICAgIH0sXG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlcnZlQ29tbWFuZChvcHRpb25zOiBQcmVzdGFDTElTZXJ2ZU9wdGlvbnMpIHtcbiAgY29uc3QgY29uZmlnRmlsZSA9IGdldENvbmZpZ0ZpbGUob3B0aW9ucy5jb25maWcsIHRydWUpXG4gIGNvbnN0IHBvcnQgPSBhd2FpdCBnZXRBdmFpbGFibGVQb3J0KG9wdGlvbnMucG9ydCB8fCBjb25maWdGaWxlLnBvcnQgfHwgNDAwMClcblxuICBjb25zdCBlbWl0dGVyID0gY3JlYXRlRW1pdHRlcigpXG4gIGNvbnN0IGhvb2tzID0gY3JlYXRlSG9va3MoZW1pdHRlcilcbiAgY29uc3QgY29uZmlnID0gY3JlYXRlKEVudi5QUk9EVUNUSU9OLCB7IC4uLm9wdGlvbnMsIHBvcnQgfSwgY29uZmlnRmlsZSlcbiAgYXdhaXQgaW5pdFBsdWdpbnMoY29uZmlnLnBsdWdpbnMsIGNvbmZpZywgaG9va3MpXG5cbiAgc2VydmUoY29uZmlnLCBob29rcylcblxuICBsb2dnZXIuaW5mbyh7XG4gICAgbGFiZWw6ICdzZXJ2ZScsXG4gICAgbWVzc2FnZTogYGh0dHA6Ly9sb2NhbGhvc3Q6JHtjb25maWcucG9ydH1gLFxuICB9KVxufVxuIiwgImltcG9ydCBjLCB7IEtsZXVyIH0gZnJvbSAna2xldXInXG5cbmltcG9ydCB7IEVudiB9IGZyb20gJy4vY29uc3RhbnRzJ1xuXG5leHBvcnQgZW51bSBMZXZlbHMge1xuICBEZWJ1ZyA9ICdkZWJ1ZycsXG4gIEluZm8gPSAnaW5mbycsXG4gIFdhcm4gPSAnd2FybicsXG4gIEVyciA9ICdlcnJvcicsXG59XG5cbmV4cG9ydCB0eXBlIE1lc3NhZ2UgPSB7XG4gIGxldmVsPzogTGV2ZWxzXG4gIGxhYmVsOiBzdHJpbmcgfCBudW1iZXJcbiAgbWVzc2FnZT86IHN0cmluZ1xuICBkdXJhdGlvbj86IHN0cmluZyB8IG51bWJlclxuICBlcnJvcj86IEVycm9yXG59XG5cbmxldCBsb2dzOiBhbnlbXSA9IFtdXG5cbmNvbnN0IGNvbG9ycyA9IHtcbiAgW0xldmVscy5EZWJ1Z106ICdtYWdlbnRhJyxcbiAgW0xldmVscy5JbmZvXTogJ2JsdWUnLFxuICBbTGV2ZWxzLldhcm5dOiAneWVsbG93JyxcbiAgW0xldmVscy5FcnJdOiAncmVkJyxcbn1cblxuZXhwb3J0IHsgYyBhcyBjb2xvcnMgfVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TG9ncygpIHtcbiAgaWYgKCFwcm9jZXNzLmVudi5URVNUSU5HKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnRlcm5hbCBtZXRob2Qgd2FzIGNhbGxlZCBvdXRzaWRlIHRlc3QgbW9kZScpXG4gIH1cblxuICByZXR1cm4gbG9nc1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbG9nZ2VyKG1lc3NhZ2U6IE1lc3NhZ2UpIHtcbiAgaWYgKHByb2Nlc3MuZW52LlRFU1RJTkcpIHtcbiAgICBsb2dzLnB1c2gobWVzc2FnZSlcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBkZWJ1ZyA9IHByb2Nlc3MuZW52LlBSRVNUQV9ERUJVR1xuICAgIGNvbnN0IGNvbnRleHQgPSBwcm9jZXNzLmVudi5QUkVTVEFfRU5WID09PSBFbnYuUFJPRFVDVElPTiA/ICdwcm9kJyA6ICdkZXYnXG5cbiAgICBpZiAoIWRlYnVnICYmIG1lc3NhZ2UubGV2ZWwgPT09IExldmVscy5EZWJ1ZykgcmV0dXJuXG5cbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIFtcbiAgICAgICAgYy5ncmF5KGNvbnRleHQpLFxuICAgICAgICBjW2NvbG9yc1ttZXNzYWdlLmxldmVsIHx8ICdpbmZvJ10gYXMga2V5b2YgS2xldXJdKG1lc3NhZ2UubGFiZWwpLFxuICAgICAgICBtZXNzYWdlLm1lc3NhZ2UsXG4gICAgICAgIG1lc3NhZ2UuZHVyYXRpb24gPyBjLmdyYXkoJysnICsgbWVzc2FnZS5kdXJhdGlvbikgOiAnJyxcbiAgICAgICAgbWVzc2FnZS5lcnJvciA/IGBcXG5cXG4ke21lc3NhZ2UuZXJyb3Iuc3RhY2sgfHwgbWVzc2FnZS5lcnJvcn1cXG5cXG5gIDogJycsXG4gICAgICBdXG4gICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgLmpvaW4oJyAnKVxuICAgIClcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVidWcobWVzc2FnZTogTWVzc2FnZSkge1xuICBsb2dnZXIoeyBsZXZlbDogTGV2ZWxzLkRlYnVnLCAuLi5tZXNzYWdlIH0pXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbmZvKG1lc3NhZ2U6IE1lc3NhZ2UpIHtcbiAgbG9nZ2VyKHsgbGV2ZWw6IExldmVscy5JbmZvLCAuLi5tZXNzYWdlIH0pXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3YXJuKG1lc3NhZ2U6IE1lc3NhZ2UpIHtcbiAgbG9nZ2VyKHsgbGV2ZWw6IExldmVscy5XYXJuLCAuLi5tZXNzYWdlIH0pXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlcnJvcihtZXNzYWdlOiBNZXNzYWdlKSB7XG4gIGxvZ2dlcih7IGxldmVsOiBMZXZlbHMuRXJyLCAuLi5tZXNzYWdlIH0pXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByYXcoLi4uYXJnczogYW55W10pIHtcbiAgaWYgKHByb2Nlc3MuZW52LlRFU1RJTkcpIHtcbiAgICBsb2dzLnB1c2goYXJncylcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmxvZyguLi5hcmdzKVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBuZXdsaW5lKCkge1xuICBpZiAocHJvY2Vzcy5lbnYuVEVTVElORykgcmV0dXJuXG4gIGNvbnNvbGUubG9nKCcnKVxufVxuIiwgImV4cG9ydCBjb25zdCBFbnYgPSB7XG4gIFBST0RVQ1RJT046ICdwcm9kdWN0aW9uJyxcbiAgREVWRUxPUE1FTlQ6ICdkZXZlbG9wbWVudCcsXG59XG4iLCAiaW1wb3J0IGZzIGZyb20gJ2ZzJ1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcbmltcG9ydCBnZXRQb3J0IGZyb20gJ2dldC1wb3J0J1xuXG5pbXBvcnQgKiBhcyBsb2dnZXIgZnJvbSAnLi9sb2cnXG5pbXBvcnQgeyBQcmVzdGFDTElEZXZPcHRpb25zLCBQcmVzdGFDTElCdWlsZE9wdGlvbnMgfSBmcm9tICcuL2NsaSdcbmltcG9ydCB7IFBsdWdpbiB9IGZyb20gJy4vcGx1Z2lucydcblxuZXhwb3J0IHR5cGUgT3B0aW9ucyA9IHtcbiAgZmlsZXM6IHN0cmluZ1tdXG4gIG91dHB1dDogc3RyaW5nXG4gIGFzc2V0czogc3RyaW5nXG4gIHBsdWdpbnM6IFBsdWdpbltdXG4gIHBvcnQ6IG51bWJlclxuICBfX3Vuc2FmZV9idW5kbGVfZXZlcnl0aGluZzogYm9vbGVhblxufVxuXG5leHBvcnQgdHlwZSBDb25maWcgPSBPcHRpb25zICYge1xuICBlbnY6IHN0cmluZ1xuICBzdGF0aWNPdXRwdXREaXI6IHN0cmluZ1xuICBmdW5jdGlvbnNPdXRwdXREaXI6IHN0cmluZ1xuICBtYW5pZmVzdEZpbGVwYXRoOiBzdHJpbmdcbn1cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRDb25maWdGaWxlcGF0aCA9ICdwcmVzdGEuY29uZmlnLmpzJ1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QXZhaWxhYmxlUG9ydChwcmVmZXJyZWQ6IHN0cmluZykge1xuICByZXR1cm4gZ2V0UG9ydCh7IHBvcnQ6IHBhcnNlSW50KHByZWZlcnJlZCwgMTApIH0pXG59XG5cbi8qKlxuICogRmV0Y2ggYSBjb25maWcgZmlsZS4gSWYgb25lIHdhcyBzcGVjaWZpZWQgYnkgdGhlIHVzZXIsIGxldCB0aGVtIGtub3cgaWZcbiAqIGFueXRoaW5nIGdvZXMgd3JvbmcuIE91dHNpZGUgd2F0Y2ggbW9kZSwgdGhpcyBzaG91bGQgZXhpdCgxKSBpZiB0aGUgdXNlclxuICogcHJvdmlkZWQgYSBjb25maWcgYW5kIHRoZXJlIHdhcyBhbiBlcnJvclxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29uZmlnRmlsZShmaWxlcGF0aD86IHN0cmluZywgc2hvdWxkRXhpdDogYm9vbGVhbiA9IGZhbHNlKSB7XG4gIGNvbnN0IGZwID0gcGF0aC5yZXNvbHZlKGZpbGVwYXRoIHx8IGRlZmF1bHRDb25maWdGaWxlcGF0aClcblxuICB0cnkge1xuICAgIGRlbGV0ZSByZXF1aXJlLmNhY2hlW2ZwXVxuICAgIHJldHVybiByZXF1aXJlKGZwKVxuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc3QgZXhpc3RzID0gZnMuZXhpc3RzU3luYyhmcClcblxuICAgIC8vIGNvbmZpZyBmaWxlIGV4aXN0cywgc2hvdWxkIGxvZyBlcnJvciwgb3RoZXJ3aXNlIGlnbm9yZSBtaXNzaW5nIGZpbGVcbiAgICBpZiAoZXhpc3RzKSB7XG4gICAgICBsb2dnZXIuZXJyb3Ioe1xuICAgICAgICBsYWJlbDogJ2Vycm9yJyxcbiAgICAgICAgZXJyb3I6IGUgYXMgRXJyb3IsXG4gICAgICB9KVxuXG4gICAgICAvLyB3ZSdyZSBub3QgaW4gd2F0Y2ggbW9kZSwgZXhpdCBidWlsZFxuICAgICAgaWYgKHNob3VsZEV4aXQpIHByb2Nlc3MuZXhpdCgxKVxuICAgIH1cblxuICAgIHJldHVybiB7fVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGUoXG4gIGVudjogc3RyaW5nLFxuICBjbGk6IFByZXN0YUNMSUJ1aWxkT3B0aW9ucyB8IFByZXN0YUNMSURldk9wdGlvbnMsXG4gIGZpbGU6IFBhcnRpYWw8T3B0aW9ucz4sXG4gIGN3ZCA9IHByb2Nlc3MuY3dkKClcbik6IENvbmZpZyB7XG4gIGNvbnN0IGNvbmZpZyA9IHtcbiAgICBlbnYsXG4gICAgb3V0cHV0OiAnYnVpbGQnLFxuICAgIGFzc2V0czogJ3B1YmxpYycsXG4gICAgcGx1Z2luczogW10sXG4gICAgcG9ydDogNDAwMCxcbiAgICBmaWxlczogW10sIC8vIFRPRE8gd2hlcmUgZG8gd2UgdmFsaWRhdGVcbiAgICAuLi5maWxlLFxuICB9XG5cbiAgLy8gb3ZlcnJpZGUgd2l0aCBDTElcbiAgaWYgKGNsaS5fLmxlbmd0aCkgY29uZmlnLmZpbGVzID0gY2xpLl9cbiAgaWYgKGNsaS5vdXRwdXQpIGNvbmZpZy5vdXRwdXQgPSBjbGkub3V0cHV0XG4gIGlmIChjbGkuYXNzZXRzKSBjb25maWcuYXNzZXRzID0gY2xpLmFzc2V0c1xuICBpZiAoY2xpLnBvcnQpIGNvbmZpZy5wb3J0ID0gY2xpLnBvcnRcblxuICAvLyByZXNvbHZlIGFic29sdXRlIHBhdGhzXG4gIGlmIChjb25maWcuZmlsZXMpIGNvbmZpZy5maWxlcyA9IChbXSBhcyBzdHJpbmdbXSkuY29uY2F0KGNvbmZpZy5maWxlcykubWFwKChwKSA9PiBwYXRoLnJlc29sdmUoY3dkLCBwKSlcbiAgaWYgKGNvbmZpZy5vdXRwdXQpIGNvbmZpZy5vdXRwdXQgPSBwYXRoLnJlc29sdmUoY3dkLCBjb25maWcub3V0cHV0KVxuICBpZiAoY29uZmlnLmFzc2V0cykgY29uZmlnLmFzc2V0cyA9IHBhdGgucmVzb2x2ZShjd2QsIGNvbmZpZy5hc3NldHMpXG5cbiAgcmV0dXJuIHtcbiAgICAuLi5jb25maWcsXG4gICAgc3RhdGljT3V0cHV0RGlyOiBwYXRoLmpvaW4oY29uZmlnLm91dHB1dCwgJ3N0YXRpYycpLFxuICAgIGZ1bmN0aW9uc091dHB1dERpcjogcGF0aC5qb2luKGNvbmZpZy5vdXRwdXQsICdmdW5jdGlvbnMnKSxcbiAgICBtYW5pZmVzdEZpbGVwYXRoOiBwYXRoLmpvaW4oY29uZmlnLm91dHB1dCwgJ21hbmlmZXN0Lmpzb24nKSxcbiAgICBfX3Vuc2FmZV9idW5kbGVfZXZlcnl0aGluZzogY29uZmlnLl9fdW5zYWZlX2J1bmRsZV9ldmVyeXRoaW5nIHx8IGZhbHNlLFxuICB9XG59XG4iLCAiaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJ1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcbmltcG9ydCB7IGNyZWF0ZSB9IGZyb20gJ3dhdGNoLWRlcGVuZGVuY3ktZ3JhcGgnXG5pbXBvcnQgY2hva2lkYXIgZnJvbSAnY2hva2lkYXInXG5pbXBvcnQgbWF0Y2ggZnJvbSAncGljb21hdGNoJ1xuaW1wb3J0IHsgdGltZXIgfSBmcm9tICdAcHJlc3RhL3V0aWxzJ1xuXG5pbXBvcnQgeyBvdXRwdXRMYW1iZGFzIH0gZnJvbSAnLi9vdXRwdXRMYW1iZGFzJ1xuaW1wb3J0ICogYXMgbG9nZ2VyIGZyb20gJy4vbG9nJ1xuaW1wb3J0IHsgZ2V0RmlsZXMsIGlzU3RhdGljLCBpc0R5bmFtaWMgfSBmcm9tICcuL2dldEZpbGVzJ1xuaW1wb3J0IHsgYnVpbGRTdGF0aWNGaWxlcywgcmVtb3ZlQnVpbHRTdGF0aWNGaWxlLCBTdGF0aWNGaWxlc01hcCB9IGZyb20gJy4vYnVpbGRTdGF0aWNGaWxlcydcbmltcG9ydCB7IENvbmZpZyB9IGZyb20gJy4vY29uZmlnJ1xuaW1wb3J0IHsgSG9va3MgfSBmcm9tICcuL2NyZWF0ZUVtaXR0ZXInXG5pbXBvcnQgeyBzdGF0aWNGaWxlc01hcFRvTWFuaWZlc3RGaWxlcywgd3JpdGVNYW5pZmVzdCB9IGZyb20gJy4vbWFuaWZlc3QnXG5cbi8qXG4gKiBXcmFwcyBvdXRwdXRMYW1iZGFzIGZvciBsb2dnaW5nXG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZUxhbWJkYXMoaW5wdXRzOiBzdHJpbmdbXSwgY29uZmlnOiBDb25maWcpIHtcbiAgY29uc3QgdGltZSA9IHRpbWVyKClcblxuICAvLyBhbHdheXMgd3JpdGUgdGhpcywgZXZlbiBpZiBpbnB1dHMgPSBbXVxuICBjb25zdCBsYW1iZGFzID0gb3V0cHV0TGFtYmRhcyhpbnB1dHMsIGNvbmZpZylcblxuICAvLyBpZiB1c2VyIGFjdHVhbGx5IGhhcyByb3V0ZXMgY29uZmlndXJlZCwgZ2l2ZSBmZWVkYmFja1xuICBpZiAoaW5wdXRzLmxlbmd0aCkge1xuICAgIGxvZ2dlci5pbmZvKHtcbiAgICAgIGxhYmVsOiAnYnVpbHQnLFxuICAgICAgbWVzc2FnZTogYGxhbWJkYXNgLFxuICAgICAgZHVyYXRpb246IHRpbWUoKSxcbiAgICB9KVxuICB9XG5cbiAgcmV0dXJuIGxhbWJkYXNcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTmV3VmFsaWRGaWxlKGZpbGU6IHN0cmluZywgZ2xvYnM6IHN0cmluZ1tdLCBleGlzdGluZzogc3RyaW5nW10pIHtcbiAgcmV0dXJuIG1hdGNoKGdsb2JzKShmaWxlKSAmJiAhZXhpc3RpbmcuaW5jbHVkZXMoZmlsZSlcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdhdGNoKGNvbmZpZzogQ29uZmlnLCBob29rczogSG9va3MpIHtcbiAgbGV0IHN0YXRpY0ZpbGVzTWFwOiBTdGF0aWNGaWxlc01hcCA9IHt9XG4gIGNvbnN0IGFsbEZpbGVzID0gZ2V0RmlsZXMoY29uZmlnLmZpbGVzKVxuXG4gIGlmICghYWxsRmlsZXMubGVuZ3RoKSB7XG4gICAgbG9nZ2VyLndhcm4oe1xuICAgICAgbGFiZWw6ICdwYXRocycsXG4gICAgICBtZXNzYWdlOiAnbm8gZmlsZXMgY29uZmlndXJlZCcsXG4gICAgfSlcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGJ1aWxkRmlsZXMoZmlsZXM6IHN0cmluZ1tdLCBleGlzdGluZzogc3RyaW5nW10sIGNvbmZpZzogQ29uZmlnKSB7XG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICBkZWxldGUgcmVxdWlyZS5jYWNoZVtmaWxlXVxuICAgIH1cblxuICAgIGNvbnN0IGJ1aWx0U3RhdGljRmlsZXMgPSBhd2FpdCBidWlsZFN0YXRpY0ZpbGVzKGZpbGVzLmZpbHRlcihpc1N0YXRpYyksIGNvbmZpZywgc3RhdGljRmlsZXNNYXApXG4gICAgY29uc3QgYnVpbHRMYW1iZGFzID0gdXBkYXRlTGFtYmRhcyhleGlzdGluZy5maWx0ZXIoaXNEeW5hbWljKSwgY29uZmlnKVxuXG4gICAgLy8gbWVyZ2UgaW4gbmV3IHN0YXRpYyBmaWxlc1xuICAgIHN0YXRpY0ZpbGVzTWFwID0gT2JqZWN0LmFzc2lnbihzdGF0aWNGaWxlc01hcCwgYnVpbHRTdGF0aWNGaWxlcy5zdGF0aWNGaWxlc01hcClcblxuICAgIHdyaXRlTWFuaWZlc3QoXG4gICAgICB7XG4gICAgICAgIGZpbGVzOiBbLi4uc3RhdGljRmlsZXNNYXBUb01hbmlmZXN0RmlsZXMoc3RhdGljRmlsZXNNYXApLCAuLi5idWlsdExhbWJkYXNdLFxuICAgICAgfSxcbiAgICAgIGNvbmZpZ1xuICAgIClcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBvcnRhbnQ6IGlmIHdlIGV2ZXIgcmVtb3ZlIGluaXRpYWwgcmVuZGVyaW5nLCB3ZSB3aWxsIG5lZWQgdG9cbiAgICogcmUtaW50cm9kdWNlIFwiZmlsZSBwcmltaW5nXCIgd2hlcmUgd2UgcmVxdWlyZSBhbGwgZmlsZXMgYW5kIHN1cmZhY2UgZXJyb3JzXG4gICAqIG9uIHN0YXJ0dXAuXG4gICAqL1xuICBhd2FpdCBidWlsZEZpbGVzKGFsbEZpbGVzLCBhbGxGaWxlcywgY29uZmlnKVxuICBob29rcy5lbWl0QnJvd3NlclJlZnJlc2goKVxuXG4gIC8qXG4gICAqIEZpbGV3YXRjaGVyIHdhdGNoZXMgb25seSBwcmVzdGEgZmlsZXMuIEl0IGhhbmRsZXMgY2hhbmdlIGFuZCByZW1vdmVcbiAgICogZXZlbnRzLCBhcyB3ZWxsIGFzIHN1cmZhY2VzIGRlcGVuZGVuY3kgdHJlZSB0cmF2ZXJzYWwgZXJyb3JzXG4gICAqL1xuICBjb25zdCBmaWxlV2F0Y2hlciA9IGNyZWF0ZSh7IGFsaWFzOiB7ICdAJzogcHJvY2Vzcy5jd2QoKSB9IH0pXG5cbiAgZmlsZVdhdGNoZXIub25DaGFuZ2UoYXN5bmMgKGNoYW5nZWQpID0+IHtcbiAgICBhd2FpdCBidWlsZEZpbGVzKGNoYW5nZWQsIGFsbEZpbGVzLCBjb25maWcpXG4gICAgaG9va3MuZW1pdEJyb3dzZXJSZWZyZXNoKClcbiAgfSlcblxuICBmaWxlV2F0Y2hlci5vblJlbW92ZShhc3luYyAoW2lkXSkgPT4ge1xuICAgIGxvZ2dlci5kZWJ1Zyh7IGxhYmVsOiAnd2F0Y2gnLCBtZXNzYWdlOiBgcmVtb3ZlZCAke2lkfWAgfSlcblxuICAgIC8vIHJlbW92ZSBmcm9tIGxvY2FsIGhhc2hcbiAgICBhbGxGaWxlcy5zcGxpY2UoYWxsRmlsZXMuaW5kZXhPZihpZCksIDEpXG5cbiAgICAvLyB1cGRhdGUgdGhpcyByZWdhcmRsZXNzLCBub3Qgc3VyZSBpZiBbaWRdIHdhcyBkeW5hbWljIG9yIHN0YXRpY1xuICAgIHVwZGF0ZUxhbWJkYXMoYWxsRmlsZXMuZmlsdGVyKGlzRHluYW1pYyksIGNvbmZpZylcbiAgICA7KHN0YXRpY0ZpbGVzTWFwW2lkXSB8fCBbXSkuZm9yRWFjaCgoZmlsZSkgPT4gcmVtb3ZlQnVpbHRTdGF0aWNGaWxlKHBhdGguam9pbihjb25maWcuc3RhdGljT3V0cHV0RGlyLCBmaWxlKSkpXG5cbiAgICBob29rcy5lbWl0QnJvd3NlclJlZnJlc2goKVxuICB9KVxuXG4gIGZpbGVXYXRjaGVyLm9uRXJyb3IoKGUpID0+IHtcbiAgICBsb2dnZXIuZXJyb3Ioe1xuICAgICAgbGFiZWw6ICdlcnJvcicsXG4gICAgICBlcnJvcjogdHlwZW9mIGUgPT09ICdzdHJpbmcnID8gbmV3IEVycm9yKGUpIDogZSxcbiAgICB9KVxuICB9KVxuXG4gIGF3YWl0IGZpbGVXYXRjaGVyLmFkZChhbGxGaWxlcylcblxuICAvKlxuICAgKiBnbG9iYWxXYXRjaGVyIHdhdGNoZXMgdGhlIHJhdyBmaWxlIGdsb2JzIHBhc3NlZCB0byB0aGUgQ0xJIG9yIGFzIGBmaWxlc2BcbiAgICogaW4gdGhlIGNvbmZpZy4gSWYgY2hlY2tzIG9uIGFkZC9jaGFuZ2UgdG8gc2VlIGlmIGEgZmlsZSBzaG91bGQgYmUgdXBncmFkZWRcbiAgICogdG8gYSBhIFByZXN0YSBzb3VyY2UgZmlsZSwgYW5kIGFkZGVkIHRvIHRoZSBmaWxlV2F0Y2hlci5cbiAgICovXG4gIGNvbnN0IGdsb2JhbFdhdGNoZXIgPSBjaG9raWRhci53YXRjaChwcm9jZXNzLmN3ZCgpLCB7XG4gICAgaWdub3JlSW5pdGlhbDogdHJ1ZSxcbiAgICBpZ25vcmVkOiBbY29uZmlnLm91dHB1dCwgY29uZmlnLmFzc2V0c10sXG4gIH0pXG5cbiAgZ2xvYmFsV2F0Y2hlci5vbignYWRkJywgYXN5bmMgKGZpbGUpID0+IHtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZSkgfHwgZnMubHN0YXRTeW5jKGZpbGUpLmlzRGlyZWN0b3J5KCkpIHJldHVyblxuICAgIGlmICghaXNOZXdWYWxpZEZpbGUoZmlsZSwgY29uZmlnLmZpbGVzLCBhbGxGaWxlcykpIHJldHVyblxuXG4gICAgbG9nZ2VyLmRlYnVnKHsgbGFiZWw6ICd3YXRjaCcsIG1lc3NhZ2U6IGBhZGQgJHtmaWxlfWAgfSlcblxuICAgIGFsbEZpbGVzLnB1c2goZmlsZSlcbiAgICBhd2FpdCBmaWxlV2F0Y2hlci5hZGQoZmlsZSlcblxuICAgIGF3YWl0IGJ1aWxkRmlsZXMoW2ZpbGVdLCBhbGxGaWxlcywgY29uZmlnKVxuXG4gICAgaG9va3MuZW1pdEJyb3dzZXJSZWZyZXNoKClcbiAgfSlcblxuICAvKipcbiAgICogTGlzdGVucyBmb3IgZXZlbnRzIGZyb20gcGx1Z2lucyByZXF1ZXN0aW5nIGEgZmlsZSB0byBiZSBidWlsdFxuICAgKi9cbiAgaG9va3Mub25CdWlsZEZpbGUoYXN5bmMgKHsgZmlsZSB9KSA9PiB7XG4gICAgYXdhaXQgYnVpbGRGaWxlcyhbZmlsZV0sIGFsbEZpbGVzLCBjb25maWcpXG4gICAgaG9va3MuZW1pdEJyb3dzZXJSZWZyZXNoKClcbiAgfSlcblxuICByZXR1cm4ge1xuICAgIGFzeW5jIGNsb3NlKCkge1xuICAgICAgYXdhaXQgZmlsZVdhdGNoZXIuY2xvc2UoKVxuICAgICAgYXdhaXQgZ2xvYmFsV2F0Y2hlci5jbG9zZSgpXG4gICAgfSxcbiAgfVxufVxuIiwgImltcG9ydCBmcyBmcm9tICdmcy1leHRyYSdcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXG5pbXBvcnQgcnNvcnQgZnJvbSAncm91dGUtc29ydCdcbmltcG9ydCB7IGhhc2hDb250ZW50IH0gZnJvbSAnQHByZXN0YS91dGlscydcblxuaW1wb3J0ICogYXMgbG9nZ2VyIGZyb20gJy4vbG9nJ1xuaW1wb3J0IHsgQ29uZmlnIH0gZnJvbSAnLi9jb25maWcnXG5pbXBvcnQgeyBFbnYgfSBmcm9tICcuL2NvbnN0YW50cydcbmltcG9ydCB7IE1hbmlmZXN0RHluYW1pY0ZpbGUgfSBmcm9tICcuL21hbmlmZXN0J1xuXG5leHBvcnQgZnVuY3Rpb24gc2x1Z2lmeShmaWxlbmFtZTogc3RyaW5nKSB7XG4gIHJldHVybiBmaWxlbmFtZVxuICAgIC5yZXBsYWNlKHByb2Nlc3MuY3dkKCksICcnKSAvLyAvcGFnZXMvRmlsZS5wYWdlLmpzXG4gICAgLnNwbGl0KCcuJykgLy8gZXh0ZW5zaW9uLCBbL3BhZ2VzL0ZpbGUsIHBhZ2UsIGpzXVxuICAgIC5yZXZlcnNlKClcbiAgICAuc2xpY2UoMSlcbiAgICAucmV2ZXJzZSgpXG4gICAgLmpvaW4oJy0nKSAvLyAvcGFnZXMvRmlsZS5wYWdlXG4gICAgLnNwbGl0KCcvJylcbiAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgLmpvaW4oJy0nKSAvLyBwYWdlcy1GaWxlLXBhZ2Vcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG91dHB1dExhbWJkYXMoaW5wdXRzOiBzdHJpbmdbXSwgY29uZmlnOiBDb25maWcpIHtcbiAgY29uc3QgbGFtYmRhcyA9IGlucHV0c1xuICAgIC5tYXAoKGlucHV0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB7IHJvdXRlIH0gPSByZXF1aXJlKGlucHV0KVxuICAgICAgICBjb25zdCBuYW1lID0gc2x1Z2lmeShpbnB1dClcbiAgICAgICAgY29uc3Qgb3V0cHV0ID0gcGF0aC5qb2luKFxuICAgICAgICAgIGNvbmZpZy5mdW5jdGlvbnNPdXRwdXREaXIsXG4gICAgICAgICAgY29uZmlnLmVudiA9PT0gRW52LlBST0RVQ1RJT05cbiAgICAgICAgICAgID8gbmFtZSArICctJyArIGhhc2hDb250ZW50KGZzLnJlYWRGaWxlU3luYyhpbnB1dCwgJ3V0ZjgnKSkgKyAnLmpzJ1xuICAgICAgICAgICAgOiBuYW1lICsgJy5qcydcbiAgICAgICAgKVxuXG4gICAgICAgIGxvZ2dlci5kZWJ1Zyh7XG4gICAgICAgICAgbGFiZWw6ICdkZWJ1ZycsXG4gICAgICAgICAgbWVzc2FnZTogYGdlbmVyYXRpbmcgJHtuYW1lfSBsYW1iZGFgLFxuICAgICAgICB9KVxuXG4gICAgICAgIC8vIGltcG9ydGFudCBmb3Igd2F0Y2ggdGFza1xuICAgICAgICBkZWxldGUgcmVxdWlyZS5jYWNoZVtpbnB1dF1cbiAgICAgICAgZGVsZXRlIHJlcXVpcmUuY2FjaGVbb3V0cHV0XVxuXG4gICAgICAgIGZzLm91dHB1dEZpbGVTeW5jKFxuICAgICAgICAgIG91dHB1dCxcbiAgICAgICAgICBgaW1wb3J0IHsgd3JhcEhhbmRsZXIgfSBmcm9tICdwcmVzdGEvZGlzdC93cmFwSGFuZGxlcic7XG4gICAgICBpbXBvcnQgKiBhcyBmaWxlIGZyb20gJyR7aW5wdXR9JztcbiAgICAgIGV4cG9ydCBjb25zdCByb3V0ZSA9IGZpbGUucm91dGVcbiAgICAgIGV4cG9ydCBjb25zdCBoYW5kbGVyID0gd3JhcEhhbmRsZXIoZmlsZSlgXG4gICAgICAgIClcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6ICdkeW5hbWljJyxcbiAgICAgICAgICBzcmM6IGlucHV0LFxuICAgICAgICAgIGRlc3Q6IG91dHB1dCxcbiAgICAgICAgICByb3V0ZSxcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2dnZXIuZXJyb3Ioe1xuICAgICAgICAgIGxhYmVsOiAnZXJyb3InLFxuICAgICAgICAgIGVycm9yOiBlIGFzIEVycm9yLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG4gICAgLmZpbHRlcihCb29sZWFuKSBhcyBNYW5pZmVzdER5bmFtaWNGaWxlW11cblxuICBjb25zdCBzb3J0ZWRSb3V0ZXMgPSByc29ydChsYW1iZGFzLm1hcCgobCkgPT4gbC5yb3V0ZSkpXG4gIGNvbnN0IHNvcnRlZEZpbGVzOiBNYW5pZmVzdER5bmFtaWNGaWxlW10gPSBbXVxuXG4gIGZvciAoY29uc3Qgcm91dGUgb2Ygc29ydGVkUm91dGVzKSB7XG4gICAgY29uc3QgbWF0Y2ggPSBsYW1iZGFzLmZpbmQoKGwpID0+IGwucm91dGUgPT09IHJvdXRlKVxuXG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICBzb3J0ZWRGaWxlcy5wdXNoKG1hdGNoKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzb3J0ZWRGaWxlc1xufVxuIiwgImltcG9ydCBmcyBmcm9tICdmcy1leHRyYSdcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXG5pbXBvcnQgZ2xvYlN5bmMgZnJvbSAndGlueS1nbG9iL3N5bmMnXG5cbmV4cG9ydCBmdW5jdGlvbiBpc0R5bmFtaWMoZmlsZTogc3RyaW5nKSB7XG4gIHJldHVybiAvZXhwb3J0XFxzLitcXHNyb3V0ZVxccytcXD0vLnRlc3QoZnMucmVhZEZpbGVTeW5jKGZpbGUsICd1dGYtOCcpKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTdGF0aWMoZmlsZTogc3RyaW5nKSB7XG4gIHJldHVybiAvZXhwb3J0XFxzLitcXHNnZXRTdGF0aWNQYXRocy8udGVzdChmcy5yZWFkRmlsZVN5bmMoZmlsZSwgJ3V0Zi04JykpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGaWxlcyhmaWxlczogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gIHJldHVybiAoW10gYXMgc3RyaW5nW10pXG4gICAgLmNvbmNhdChmaWxlcylcbiAgICAubWFwKChmaWxlKSA9PiBnbG9iU3luYyhmaWxlKSlcbiAgICAuZmxhdCgpXG4gICAgLm1hcCgoZmlsZSkgPT4gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksIGZpbGUpKSAvLyBtYWtlIGFic29sdXRlXG59XG4iLCAiaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJ1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcbmltcG9ydCBtaW1lIGZyb20gJ21pbWUtdHlwZXMnXG5pbXBvcnQgeyB0aW1lciwgcGFyc2VQYXRoUGFyYW1ldGVycyB9IGZyb20gJ0BwcmVzdGEvdXRpbHMnXG5cbmltcG9ydCAqIGFzIGxvZ2dlciBmcm9tICcuL2xvZydcbmltcG9ydCB7IG5vcm1hbGl6ZVJlc3BvbnNlIH0gZnJvbSAnLi9ub3JtYWxpemVSZXNwb25zZSdcbmltcG9ydCB7IGNyZWF0ZUxpdmVSZWxvYWRTY3JpcHQgfSBmcm9tICcuL3V0aWxzJ1xuaW1wb3J0IHsgRW52IH0gZnJvbSAnLi9jb25zdGFudHMnXG5pbXBvcnQgeyBDb25maWcgfSBmcm9tICcuL2NvbmZpZydcblxuZXhwb3J0IHR5cGUgU3RhdGljRmlsZXNNYXAgPSB7IFtmaWxlbmFtZTogc3RyaW5nXTogc3RyaW5nW10gfVxuXG5leHBvcnQgZnVuY3Rpb24gcGF0aG5hbWVUb0ZpbGUocGF0aG5hbWU6IHN0cmluZywgZXh0ID0gJ2h0bWwnKSB7XG4gIHJldHVybiAhIXBhdGguZXh0bmFtZShwYXRobmFtZSlcbiAgICA/IHBhdGhuYW1lIC8vIGlmIHBhdGggaGFzIGV4dGVuc2lvbiwgdXNlIGl0XG4gICAgOiBleHQgPT09ICdodG1sJ1xuICAgID8gYCR7cGF0aG5hbWV9L2luZGV4Lmh0bWxgIC8vIGlmIEhUTUwgaXMgaW5mZXJyZWQsIGNyZWF0ZSBpbmRleFxuICAgIDogYCR7cGF0aG5hbWV9LiR7ZXh0fWAgLy8gYW55dGhpbmcgYnV0IEhUTUwgd2lsbCBuZWVkIGFuIGV4dGVuc2lvbiwgb3RoZXJ3aXNlIGJyb3dzZXJzIHdpbGwgcmVuZGVyIGFzIHRleHRcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbW92ZUJ1aWx0U3RhdGljRmlsZShmaWxlOiBzdHJpbmcpIHtcbiAgbG9nZ2VyLmRlYnVnKHtcbiAgICBsYWJlbDogJ2RlYnVnJyxcbiAgICBtZXNzYWdlOiBgcmVtb3Zpbmcgb2xkIHN0YXRpYyBmaWxlICR7ZmlsZX1gLFxuICB9KVxuXG4gIHJldHVybiBmcy5yZW1vdmUoZmlsZSlcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbW92ZUJ1aWx0U3RhdGljRmlsZXMoZmlsZXM6IHN0cmluZ1tdKSB7XG4gIHJldHVybiBQcm9taXNlLmFsbChmaWxlcy5tYXAocmVtb3ZlQnVpbHRTdGF0aWNGaWxlKSlcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkU3RhdGljRmlsZShmaWxlOiBzdHJpbmcsIG91dHB1dDogc3RyaW5nLCB7IGZvb3RlciB9OiB7IGZvb3Rlcjogc3RyaW5nIH0pIHtcbiAgY29uc3QgbGFtYmRhID0gcmVxdWlyZShmaWxlKVxuICBjb25zdCBwYXRocyA9IGF3YWl0IGxhbWJkYS5nZXRTdGF0aWNQYXRocygpXG5cbiAgY29uc3QgYnVpbHRGaWxlczogc3RyaW5nW10gPSBbXVxuXG4gIGlmICghcGF0aHMgfHwgIXBhdGhzLmxlbmd0aCkgcmV0dXJuIGJ1aWx0RmlsZXNcblxuICBmb3IgKGNvbnN0IHVybCBvZiBwYXRocykge1xuICAgIGNvbnN0IHRpbWUgPSB0aW1lcigpXG5cbiAgICBjb25zdCBldmVudCA9IHtcbiAgICAgIHBhdGg6IHVybCxcbiAgICAgIHBhdGhQYXJhbWV0ZXJzOiBsYW1iZGEucm91dGUgPyBwYXJzZVBhdGhQYXJhbWV0ZXJzKHVybCwgbGFtYmRhLnJvdXRlKSA6IHt9LFxuICAgIH1cblxuICAgIGNvbnN0IHJlc3BvbnNlID0gbm9ybWFsaXplUmVzcG9uc2UoYXdhaXQgbGFtYmRhLmhhbmRsZXIoZXZlbnQsIHt9KSlcbiAgICBjb25zdCB0eXBlID0gKHJlc3BvbnNlPy5oZWFkZXJzIHx8IHt9KVsnY29udGVudC10eXBlJ11cbiAgICBjb25zdCBleHQgPSBtaW1lLmV4dGVuc2lvbih0eXBlIGFzIHN0cmluZykgfHwgJ2h0bWwnXG4gICAgY29uc3QgZmlsZW5hbWUgPSBwYXRobmFtZVRvRmlsZSh1cmwsIGV4dClcbiAgICBjb25zdCBodG1sID0gcmVzcG9uc2UuYm9keSArIChleHQgPT09ICdodG1sJyA/IGZvb3RlciA6ICcnKVxuICAgIGNvbnN0IG91dGZpbGUgPSBwYXRoLmpvaW4ob3V0cHV0LCBmaWxlbmFtZSlcblxuICAgIGZzLm91dHB1dEZpbGVTeW5jKG91dGZpbGUsIGh0bWwsICd1dGYtOCcpXG5cbiAgICBsb2dnZXIuaW5mbyh7XG4gICAgICBsYWJlbDogJ2J1aWx0JyxcbiAgICAgIG1lc3NhZ2U6IHVybCxcbiAgICAgIGR1cmF0aW9uOiB0aW1lKCksXG4gICAgfSlcblxuICAgIGJ1aWx0RmlsZXMucHVzaChvdXRmaWxlKVxuICB9XG5cbiAgcmV0dXJuIGJ1aWx0RmlsZXNcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkU3RhdGljRmlsZXMoZmlsZXM6IHN0cmluZ1tdLCBjb25maWc6IENvbmZpZywgc3RhdGljRmlsZXNNYXA6IFN0YXRpY0ZpbGVzTWFwID0ge30pIHtcbiAgY29uc3QgaXNEZXYgPSBjb25maWcuZW52ID09PSBFbnYuREVWRUxPUE1FTlRcbiAgY29uc3Qgb3V0cHV0ID0gY29uZmlnLnN0YXRpY091dHB1dERpclxuICBjb25zdCBmb290ZXIgPSBpc0RldiA/IGNyZWF0ZUxpdmVSZWxvYWRTY3JpcHQoeyBwb3J0OiBjb25maWcucG9ydCB9KSA6ICcnXG5cbiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGZpbGVuYW1lID0gZmlsZS5yZXBsYWNlKHByb2Nlc3MuY3dkKCksICcnKVxuICAgICAgY29uc3QgcHJldkJ1aWx0RmlsZXMgPSBzdGF0aWNGaWxlc01hcFtmaWxlXSB8fCBbXVxuICAgICAgY29uc3QgYnVpbHRGaWxlcyA9IGF3YWl0IGJ1aWxkU3RhdGljRmlsZShmaWxlLCBvdXRwdXQsIHsgZm9vdGVyIH0pXG5cbiAgICAgIGlmICghYnVpbHRGaWxlcyB8fCAhYnVpbHRGaWxlcy5sZW5ndGgpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oe1xuICAgICAgICAgIGxhYmVsOiAncGF0aHMnLFxuICAgICAgICAgIG1lc3NhZ2U6IGAke2ZpbGVuYW1lfSAtIG5vIHBhdGhzIHRvIHJlbmRlcmAsXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmVtb3ZlQnVpbHRTdGF0aWNGaWxlcyhwcmV2QnVpbHRGaWxlcylcblxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyBkaWZmIGFuZCByZW1vdmUgZmlsZXNcbiAgICAgIGZvciAoY29uc3QgcHJldiBvZiBwcmV2QnVpbHRGaWxlcykge1xuICAgICAgICBpZiAoIWJ1aWx0RmlsZXMuaW5jbHVkZXMocHJldikpIHtcbiAgICAgICAgICByZW1vdmVCdWlsdFN0YXRpY0ZpbGUocHJldilcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBzdGF0aWNGaWxlc01hcFtmaWxlXSA9IGJ1aWx0RmlsZXNcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoeyBsYWJlbDogJ2Vycm9yJywgZXJyb3I6IGUgYXMgRXJyb3IgfSlcblxuICAgICAgLy8gZXhpdCBsb29wIG9uIGFueSBlcnJvclxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHN0YXRpY0ZpbGVzTWFwLFxuICB9XG59XG4iLCAiLyoqXG4gKiBUSElTIElTIFBST0QgQ09ERSwgQkUgQ0FSRUZVTCBXSEFUIFlPVSBBREQgVE8gVEhJUyBGSUxFXG4gKi9cblxuaW1wb3J0IHsgUmVzcG9uc2UgYXMgTGFtYmRhUmVzcG9uc2UgfSBmcm9tICdsYW1iZGEtdHlwZXMnXG5pbXBvcnQgeyBSZXNwb25zZSwgSGVhZGVycyB9IGZyb20gJy4vbGFtYmRhJ1xuXG5mdW5jdGlvbiBzdHJpbmdpZnkob2JqOiBvYmplY3QgfCBzdHJpbmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkob2JqKSA6IG9ialxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVIZWFkZXJzKGhlYWRlcnM6IEhlYWRlcnMpIHtcbiAgY29uc3Qgbm9ybWFsaXplZDogSGVhZGVycyA9IHt9XG5cbiAgZm9yIChjb25zdCBoZWFkZXIgb2YgT2JqZWN0LmtleXMoaGVhZGVycykpIHtcbiAgICBjb25zdCBrZXkgPSBoZWFkZXIudG9Mb3dlckNhc2UoKVxuICAgIGNvbnN0IHZhbHVlID0gaGVhZGVyc1toZWFkZXJdXG4gICAgbm9ybWFsaXplZFtrZXldID0gdmFsdWUgfHwgJydcbiAgfVxuXG4gIHJldHVybiBub3JtYWxpemVkXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVSZXNwb25zZShyZXNwb25zZTogUGFydGlhbDxSZXNwb25zZT4gfCBzdHJpbmcpOiBMYW1iZGFSZXNwb25zZSB7XG4gIGNvbnN0IHtcbiAgICBpc0Jhc2U2NEVuY29kZWQgPSBmYWxzZSxcbiAgICBzdGF0dXNDb2RlID0gMjAwLFxuICAgIGhlYWRlcnMgPSB7fSxcbiAgICBtdWx0aVZhbHVlSGVhZGVycyA9IHt9LFxuICAgIGJvZHkgPSAnJyxcbiAgICBodG1sID0gdW5kZWZpbmVkLFxuICAgIGpzb24gPSB1bmRlZmluZWQsXG4gICAgeG1sID0gdW5kZWZpbmVkLFxuICB9ID0gdHlwZW9mIHJlc3BvbnNlID09PSAnc3RyaW5nJ1xuICAgID8ge1xuICAgICAgICBib2R5OiByZXNwb25zZSxcbiAgICAgIH1cbiAgICA6IHJlc3BvbnNlXG5cbiAgbGV0IGNvbnRlbnRUeXBlID0gJ3RleHQvaHRtbDsgY2hhcnNldD11dGYtOCdcblxuICBpZiAoISFqc29uKSB7XG4gICAgY29udGVudFR5cGUgPSAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOCdcbiAgfSBlbHNlIGlmICghIXhtbCkge1xuICAgIGNvbnRlbnRUeXBlID0gJ2FwcGxpY2F0aW9uL3htbDsgY2hhcnNldD11dGYtOCdcbiAgfVxuXG4gIGNvbnN0IG5vcm1hbGl6ZWRJbmNvbWluZ0hlYWRlcnMgPSBub3JtYWxpemVIZWFkZXJzKGhlYWRlcnMgYXMgSGVhZGVycylcbiAgY29uc3Qgbm9ybWFsaXplZEhlYWRlcnM6IExhbWJkYVJlc3BvbnNlWydoZWFkZXJzJ10gPSB7XG4gICAgJ2NvbnRlbnQtdHlwZSc6IGNvbnRlbnRUeXBlLFxuICAgIC4uLm5vcm1hbGl6ZWRJbmNvbWluZ0hlYWRlcnMsXG4gIH1cblxuICByZXR1cm4ge1xuICAgIGlzQmFzZTY0RW5jb2RlZCxcbiAgICBzdGF0dXNDb2RlLFxuICAgIGhlYWRlcnM6IG5vcm1hbGl6ZWRIZWFkZXJzLFxuICAgIG11bHRpVmFsdWVIZWFkZXJzLFxuICAgIGJvZHk6IHN0cmluZ2lmeShib2R5IHx8IGh0bWwgfHwganNvbiB8fCB4bWwgfHwgJycpLFxuICB9XG59XG4iLCAiZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUxpdmVSZWxvYWRTY3JpcHQoeyBwb3J0IH06IHsgcG9ydDogbnVtYmVyIH0pIHtcbiAgcmV0dXJuIGBcbiAgICA8c2NyaXB0PlxuICAgICAgKGZ1bmN0aW9uIChnbG9iYWwpIHtcbiAgICAgICAgdmFyIHNvY2tldCA9IG5ldyBXZWJTb2NrZXQoJ3dzOi8vbG9jYWxob3N0OiR7cG9ydH0nKTtcblxuICAgICAgICBzb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcignb3BlbicsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdbcHJlc3RhXSBjb25uZWN0ZWQgb24gcG9ydCAke3BvcnR9JylcbiAgICAgICAgfSk7XG5cbiAgICAgICAgc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcXGAnW3ByZXN0YV0gcmVjZWl2ZWQgXFwkXFx7ZXZlbnQuZGF0YVxcfVxcYClcbiAgICAgICAgICBpZiAoZXZlbnQuZGF0YSA9PT0gJ3JlZnJlc2gnKSB7XG4gICAgICAgICAgICBnbG9iYWwubG9jYXRpb24ucmVsb2FkKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBzb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcignY2xvc2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ1twcmVzdGFdIGRpc2Nvbm5lY3RlZCcpXG4gICAgICAgIH0pO1xuICAgICAgfSkodGhpcyk7XG4gICAgPC9zY3JpcHQ+XG4gIGBcbn1cbiIsICJpbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnXG5cbmltcG9ydCB7IENvbmZpZyB9IGZyb20gJy4vY29uZmlnJ1xuaW1wb3J0IHsgU3RhdGljRmlsZXNNYXAgfSBmcm9tICcuL2J1aWxkU3RhdGljRmlsZXMnXG5cbmV4cG9ydCB0eXBlIE1hbmlmZXN0RHluYW1pY0ZpbGUgPSB7XG4gIHR5cGU6ICdkeW5hbWljJ1xuICBzcmM6IHN0cmluZ1xuICBkZXN0OiBzdHJpbmdcbiAgcm91dGU6IHN0cmluZ1xufVxuXG5leHBvcnQgdHlwZSBNYW5pZmVzdFN0YXRpY0ZpbGUgPSB7XG4gIHR5cGU6ICdzdGF0aWMnXG4gIHNyYzogc3RyaW5nXG4gIGRlc3Q6IHN0cmluZ1xufVxuXG5leHBvcnQgdHlwZSBNYW5pZmVzdEZpbGUgPSBNYW5pZmVzdER5bmFtaWNGaWxlIHwgTWFuaWZlc3RTdGF0aWNGaWxlXG5cbmV4cG9ydCB0eXBlIE1hbmlmZXN0ID0ge1xuICBmaWxlczogTWFuaWZlc3RGaWxlW11cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0YXRpY0ZpbGVzTWFwVG9NYW5pZmVzdEZpbGVzKHN0YXRpY0ZpbGVzTWFwOiBTdGF0aWNGaWxlc01hcCk6IE1hbmlmZXN0U3RhdGljRmlsZVtdIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKHN0YXRpY0ZpbGVzTWFwKVxuICAgIC5tYXAoKHNyYykgPT4ge1xuICAgICAgcmV0dXJuIHN0YXRpY0ZpbGVzTWFwW3NyY10ubWFwKChkZXN0KSA9PiAoe1xuICAgICAgICB0eXBlOiAnc3RhdGljJyxcbiAgICAgICAgc3JjLFxuICAgICAgICBkZXN0LFxuICAgICAgfSkpIGFzIE1hbmlmZXN0U3RhdGljRmlsZVtdXG4gICAgfSlcbiAgICAuZmxhdCgpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREeW5hbWljRmlsZXNGcm9tTWFuaWZlc3QobWFuaWZlc3Q6IE1hbmlmZXN0KTogTWFuaWZlc3REeW5hbWljRmlsZVtdIHtcbiAgcmV0dXJuIG1hbmlmZXN0LmZpbGVzLmZpbHRlcigoZmlsZSkgPT4gZmlsZS50eXBlID09PSAnZHluYW1pYycpIGFzIE1hbmlmZXN0RHluYW1pY0ZpbGVbXVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RhdGljRmlsZXNGcm9tTWFuaWZlc3QobWFuaWZlc3Q6IE1hbmlmZXN0KTogTWFuaWZlc3RTdGF0aWNGaWxlW10ge1xuICByZXR1cm4gbWFuaWZlc3QuZmlsZXMuZmlsdGVyKChmaWxlKSA9PiBmaWxlLnR5cGUgPT09ICdzdGF0aWMnKSBhcyBNYW5pZmVzdFN0YXRpY0ZpbGVbXVxufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVNYW5pZmVzdChtYW5pZmVzdDogTWFuaWZlc3QsIGNvbmZpZzogQ29uZmlnKTogdm9pZCB7XG4gIGZzLm91dHB1dEZpbGVTeW5jKGNvbmZpZy5tYW5pZmVzdEZpbGVwYXRoLCBKU09OLnN0cmluZ2lmeShtYW5pZmVzdCwgbnVsbCwgJyAgJyksICd1dGY4Jylcbn1cbiIsICJpbXBvcnQgKiBhcyBsb2dnZXIgZnJvbSAnLi9sb2cnXG5pbXBvcnQgeyBIb29rcyB9IGZyb20gJy4vY3JlYXRlRW1pdHRlcidcbmltcG9ydCB7IENvbmZpZyB9IGZyb20gJy4vY29uZmlnJ1xuXG5leHBvcnQgdHlwZSBQbHVnaW5JbnRlcmZhY2UgPSB7XG4gIGNsZWFudXA/KCk6IHZvaWRcbn1cbmV4cG9ydCB0eXBlIFBsdWdpbiA9IChjb25maWc6IENvbmZpZywgaG9va3M6IEhvb2tzKSA9PiBQcm9taXNlPFBsdWdpbkludGVyZmFjZSB8IHZvaWQ+IHwgUGx1Z2luSW50ZXJmYWNlIHwgdm9pZFxuZXhwb3J0IHR5cGUgUGx1Z2luSW5pdCA9ICguLi5wcm9wczogYW55KSA9PiBQbHVnaW5cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVBsdWdpbihpbml0OiBQbHVnaW5Jbml0KSB7XG4gIHJldHVybiBpbml0XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbml0UGx1Z2lucyhwbHVnaW5zOiBQbHVnaW5bXSwgaW5zdGFuY2U6IENvbmZpZywgaG9va3M6IEhvb2tzKSB7XG4gIGNvbnN0IGluc3RhbnRpYXRlZCA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgIHBsdWdpbnNcbiAgICAgIC5tYXAoKHApID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gcChpbnN0YW5jZSwgaG9va3MpXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBsb2dnZXIuZXJyb3Ioe1xuICAgICAgICAgICAgbGFiZWw6ICdlcnJvcicsXG4gICAgICAgICAgICBlcnJvcjogZSBhcyBFcnJvcixcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLmZpbHRlcihCb29sZWFuKSBhcyBQbHVnaW5JbnRlcmZhY2VbXVxuICApXG5cbiAgcmV0dXJuIHtcbiAgICBhc3luYyBjbGVhbnVwKCkge1xuICAgICAgcmV0dXJuIFByb21pc2UuYWxsKGluc3RhbnRpYXRlZC5tYXAoKHApID0+IHAgJiYgcC5jbGVhbnVwICYmIHAuY2xlYW51cCgpKSlcbiAgICB9LFxuICB9XG59XG4iLCAiaW1wb3J0IHsgTWFuaWZlc3QgfSBmcm9tICcuL21hbmlmZXN0J1xuXG5leHBvcnQgZW51bSBFdmVudHMge1xuICBQb3N0QnVpbGQgPSAncG9zdC1idWlsZCcsXG4gIEJ1aWxkRmlsZSA9ICdidWlsZC1maWxlJyxcbiAgQnJvd3NlclJlZnJlc2ggPSAnYnJvd3Nlci1yZWZyZXNoJyxcbn1cblxuZXhwb3J0IHR5cGUgQ2FsbGFibGUgPSAoLi4uYXJnczogYW55W10pID0+IHZvaWRcblxuZXhwb3J0IHR5cGUgSG9va1Bvc3RCdWlsZFBheWxvYWQgPSB7XG4gIG91dHB1dDogc3RyaW5nXG4gIHN0YXRpY091dHB1dDogc3RyaW5nXG4gIGZ1bmN0aW9uc091dHB1dDogc3RyaW5nXG4gIG1hbmlmZXN0OiBNYW5pZmVzdFxufVxuXG5leHBvcnQgdHlwZSBIb29rQnVpbGRGaWxlUGF5bG9hZCA9IHtcbiAgZmlsZTogc3RyaW5nXG59XG5cbmV4cG9ydCB0eXBlIERlc3Ryb3lIb29rQ2FsbGJhY2sgPSAoKSA9PiB2b2lkXG5cbmV4cG9ydCB0eXBlIEhvb2tzID0ge1xuICBlbWl0UG9zdEJ1aWxkKHByb3BzOiBIb29rUG9zdEJ1aWxkUGF5bG9hZCk6IHZvaWRcbiAgb25Qb3N0QnVpbGQoY2I6IChwcm9wczogSG9va1Bvc3RCdWlsZFBheWxvYWQpID0+IHZvaWQpOiBEZXN0cm95SG9va0NhbGxiYWNrXG4gIGVtaXRCdWlsZEZpbGUocHJvcHM6IEhvb2tCdWlsZEZpbGVQYXlsb2FkKTogdm9pZFxuICBvbkJ1aWxkRmlsZShjYjogKHByb3BzOiBIb29rQnVpbGRGaWxlUGF5bG9hZCkgPT4gdm9pZCk6IERlc3Ryb3lIb29rQ2FsbGJhY2tcbiAgZW1pdEJyb3dzZXJSZWZyZXNoKCk6IHZvaWRcbiAgb25Ccm93c2VyUmVmcmVzaChjYjogKCkgPT4gdm9pZCk6IERlc3Ryb3lIb29rQ2FsbGJhY2tcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUVtaXR0ZXIoKSB7XG4gIGxldCBldmVudHM6IHsgW2V2ZW50OiBzdHJpbmddOiBDYWxsYWJsZVtdIH0gPSB7fVxuXG4gIGZ1bmN0aW9uIGVtaXQoZXY6IHN0cmluZywgLi4uYXJnczogYW55W10pOiB2b2lkIHtcbiAgICBldmVudHNbZXZdID8gZXZlbnRzW2V2XS5tYXAoKGZuOiBDYWxsYWJsZSkgPT4gZm4oLi4uYXJncykpIDogW11cbiAgfVxuXG4gIGZ1bmN0aW9uIG9uKGV2OiBzdHJpbmcsIGZuOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQpIHtcbiAgICBldmVudHNbZXZdID0gZXZlbnRzW2V2XSA/IGV2ZW50c1tldl0uY29uY2F0KGZuKSA6IFtmbl1cbiAgICByZXR1cm4gKCkgPT4gZXZlbnRzW2V2XS5zcGxpY2UoZXZlbnRzW2V2XS5pbmRleE9mKGZuKSwgMSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGNsZWFyKCkge1xuICAgIGV2ZW50cyA9IHt9XG4gIH1cblxuICBmdW5jdGlvbiBsaXN0ZW5lcnMoZXY6IHN0cmluZykge1xuICAgIHJldHVybiBldmVudHNbZXZdIHx8IFtdXG4gIH1cblxuICByZXR1cm4ge1xuICAgIGVtaXQsXG4gICAgb24sXG4gICAgY2xlYXIsXG4gICAgbGlzdGVuZXJzLFxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVIb29rcyhlbWl0dGVyOiBSZXR1cm5UeXBlPHR5cGVvZiBjcmVhdGVFbWl0dGVyPik6IEhvb2tzIHtcbiAgcmV0dXJuIHtcbiAgICBlbWl0UG9zdEJ1aWxkKHByb3BzKSB7XG4gICAgICBlbWl0dGVyLmVtaXQoJ3Bvc3RCdWlsZCcsIHByb3BzKVxuICAgIH0sXG4gICAgb25Qb3N0QnVpbGQoY2IpIHtcbiAgICAgIHJldHVybiBlbWl0dGVyLm9uKCdwb3N0QnVpbGQnLCBjYilcbiAgICB9LFxuICAgIGVtaXRCdWlsZEZpbGUocHJvcHMpIHtcbiAgICAgIGVtaXR0ZXIuZW1pdCgnYnVpbGRGaWxlJywgcHJvcHMpXG4gICAgfSxcbiAgICBvbkJ1aWxkRmlsZShjYikge1xuICAgICAgcmV0dXJuIGVtaXR0ZXIub24oJ2J1aWxkRmlsZScsIGNiKVxuICAgIH0sXG4gICAgZW1pdEJyb3dzZXJSZWZyZXNoKCkge1xuICAgICAgZW1pdHRlci5lbWl0KCdicm93c2VyUmVmcmVzaCcpXG4gICAgfSxcbiAgICBvbkJyb3dzZXJSZWZyZXNoKGNiKSB7XG4gICAgICByZXR1cm4gZW1pdHRlci5vbignYnJvd3NlclJlZnJlc2gnLCBjYilcbiAgICB9LFxuICB9XG59XG4iLCAiaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcbmltcG9ydCBmcyBmcm9tICdmcy1leHRyYSdcbmltcG9ydCB7IGJ1aWxkIGFzIGVzYnVpbGQgfSBmcm9tICdlc2J1aWxkJ1xuaW1wb3J0IHsgcmVxdWlyZVNhZmUsIHRpbWVyIH0gZnJvbSAnQHByZXN0YS91dGlscydcblxuaW1wb3J0IHsgb3V0cHV0TGFtYmRhcyB9IGZyb20gJy4vb3V0cHV0TGFtYmRhcydcbmltcG9ydCB7IGdldEZpbGVzLCBpc1N0YXRpYywgaXNEeW5hbWljIH0gZnJvbSAnLi9nZXRGaWxlcydcbmltcG9ydCB7IGJ1aWxkU3RhdGljRmlsZXMgfSBmcm9tICcuL2J1aWxkU3RhdGljRmlsZXMnXG5pbXBvcnQgKiBhcyBsb2dnZXIgZnJvbSAnLi9sb2cnXG5pbXBvcnQgeyBDb25maWcgfSBmcm9tICcuL2NvbmZpZydcbmltcG9ydCB7IEhvb2tzIH0gZnJvbSAnLi9jcmVhdGVFbWl0dGVyJ1xuaW1wb3J0IHsgTWFuaWZlc3RTdGF0aWNGaWxlLCBNYW5pZmVzdER5bmFtaWNGaWxlLCBzdGF0aWNGaWxlc01hcFRvTWFuaWZlc3RGaWxlcywgd3JpdGVNYW5pZmVzdCB9IGZyb20gJy4vbWFuaWZlc3QnXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZChjb25maWc6IENvbmZpZywgaG9va3M6IEhvb2tzKSB7XG4gIGNvbnN0IHRvdGFsVGltZSA9IHRpbWVyKClcbiAgY29uc3QgZmlsZXMgPSBnZXRGaWxlcyhjb25maWcuZmlsZXMpXG4gIGNvbnN0IHN0YXRpY0lkcyA9IGZpbGVzLmZpbHRlcihpc1N0YXRpYylcbiAgY29uc3QgZHluYW1pY0lkcyA9IGZpbGVzLmZpbHRlcihpc0R5bmFtaWMpXG5cbiAgbG9nZ2VyLmRlYnVnKHtcbiAgICBsYWJlbDogJ2J1aWxkJyxcbiAgICBtZXNzYWdlOiAnc3RhcnRpbmcgYnVpbGQnLFxuICB9KVxuXG4gIGlmICghc3RhdGljSWRzLmxlbmd0aCAmJiAhZHluYW1pY0lkcy5sZW5ndGgpIHtcbiAgICBsb2dnZXIud2Fybih7XG4gICAgICBsYWJlbDogJ2ZpbGVzJyxcbiAgICAgIG1lc3NhZ2U6ICdubyBmaWxlcyB3ZXJlIGZvdW5kLCBub3RoaW5nIHRvIGJ1aWxkJyxcbiAgICB9KVxuICB9IGVsc2Uge1xuICAgIGxldCBzdGF0aWNUaW1lID0gJydcbiAgICBsZXQgc3RhdGljRmlsZUFtb3VudCA9IDBcbiAgICBsZXQgZHluYW1pY1RpbWUgPSAnJ1xuICAgIGxldCBjb3B5VGltZSA9ICcnXG4gICAgbGV0IG1hbmlmZXN0U3RhdGljRmlsZXM6IE1hbmlmZXN0U3RhdGljRmlsZVtdID0gW11cbiAgICBsZXQgbWFuaWZlc3REeW5hbWljRmlsZXM6IE1hbmlmZXN0RHluYW1pY0ZpbGVbXSA9IFtdXG5cbiAgICBjb25zdCB0YXNrcyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBpZiAoc3RhdGljSWRzLmxlbmd0aCkge1xuICAgICAgICAgIGNvbnN0IHRpbWUgPSB0aW1lcigpXG5cbiAgICAgICAgICBjb25zdCB7IHN0YXRpY0ZpbGVzTWFwIH0gPSBhd2FpdCBidWlsZFN0YXRpY0ZpbGVzKHN0YXRpY0lkcywgY29uZmlnKVxuICAgICAgICAgIG1hbmlmZXN0U3RhdGljRmlsZXMgPSBzdGF0aWNGaWxlc01hcFRvTWFuaWZlc3RGaWxlcyhzdGF0aWNGaWxlc01hcClcblxuICAgICAgICAgIHN0YXRpY1RpbWUgPSB0aW1lKClcbiAgICAgICAgICBzdGF0aWNGaWxlQW1vdW50ID0gT2JqZWN0LmtleXMoc3RhdGljRmlsZXNNYXApLnJlZHVjZSgoY291bnQsIGtleSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIChjb3VudCArPSBzdGF0aWNGaWxlc01hcFtrZXldLmxlbmd0aClcbiAgICAgICAgICB9LCAwKVxuICAgICAgICB9XG4gICAgICB9KSgpLFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgaWYgKGR5bmFtaWNJZHMubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3QgdGltZSA9IHRpbWVyKClcbiAgICAgICAgICBjb25zdCBwa2cgPSByZXF1aXJlU2FmZShwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJ3BhY2thZ2UuanNvbicpKVxuXG4gICAgICAgICAgbWFuaWZlc3REeW5hbWljRmlsZXMgPSBvdXRwdXRMYW1iZGFzKGR5bmFtaWNJZHMsIGNvbmZpZylcblxuICAgICAgICAgIGF3YWl0IGVzYnVpbGQoe1xuICAgICAgICAgICAgZW50cnlQb2ludHM6IG1hbmlmZXN0RHluYW1pY0ZpbGVzLm1hcCgoZikgPT4gZi5kZXN0KSxcbiAgICAgICAgICAgIG91dGRpcjogY29uZmlnLmZ1bmN0aW9uc091dHB1dERpcixcbiAgICAgICAgICAgIHBsYXRmb3JtOiAnbm9kZScsXG4gICAgICAgICAgICB0YXJnZXQ6IFsnbm9kZTEyJ10sXG4gICAgICAgICAgICBtaW5pZnk6IHRydWUsXG4gICAgICAgICAgICBhbGxvd092ZXJ3cml0ZTogdHJ1ZSxcbiAgICAgICAgICAgIGV4dGVybmFsOiBjb25maWcuX191bnNhZmVfYnVuZGxlX2V2ZXJ5dGhpbmcgPyBbXSA6IE9iamVjdC5rZXlzKHBrZy5kZXBlbmRlbmNpZXMgfHwge30pLFxuICAgICAgICAgICAgYnVuZGxlOiB0cnVlLFxuICAgICAgICAgICAgZGVmaW5lOiB7XG4gICAgICAgICAgICAgICdwcm9jZXNzLmVudi5QUkVTVEFfU0VSVkVSTEVTU19SVU5USU1FJzogJ3RydWUnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgZHluYW1pY1RpbWUgPSB0aW1lKClcbiAgICAgICAgfVxuICAgICAgfSkoKSxcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKGNvbmZpZy5hc3NldHMpKSB7XG4gICAgICAgICAgY29uc3QgdGltZSA9IHRpbWVyKClcblxuICAgICAgICAgIGZzLmNvcHlTeW5jKGNvbmZpZy5hc3NldHMsIGNvbmZpZy5zdGF0aWNPdXRwdXREaXIpXG5cbiAgICAgICAgICBjb3B5VGltZSA9IHRpbWUoKVxuICAgICAgICB9XG4gICAgICB9KSgpLFxuICAgIF0pXG5cbiAgICAvLyBzaW5jZSB3ZSdyZSBidWlsZGluZyAobm90IHdhdGNoKSBpZiBhbnkgdGFzayBmYWlscywgZXhpdCB3aXRoIGVycm9yXG4gICAgaWYgKHRhc2tzLmZpbmQoKHRhc2spID0+IHRhc2suc3RhdHVzID09PSAncmVqZWN0ZWQnKSkge1xuICAgICAgbG9nZ2VyLmRlYnVnKHtcbiAgICAgICAgbGFiZWw6ICdidWlsZCcsXG4gICAgICAgIG1lc3NhZ2U6ICdidWlsZCBwYXJ0aWFsbHkgZmFpbGVkJyxcbiAgICAgIH0pXG5cbiAgICAgIC8vIGxvZyBvdXQgZXJyb3JzXG4gICAgICB0YXNrcy5mb3JFYWNoKCh0YXNrKSA9PiB7XG4gICAgICAgIGlmICh0YXNrLnN0YXR1cyA9PT0gJ3JlamVjdGVkJykge1xuICAgICAgICAgIC8vIFRPRE8gY2FuIHN3YWxsb3cgZXJyb3JzIGluIHRlc3RpbmdcbiAgICAgICAgICBsb2dnZXIuZXJyb3Ioe1xuICAgICAgICAgICAgbGFiZWw6ICdlcnJvcicsXG4gICAgICAgICAgICBlcnJvcjogdGFzay5yZWFzb24sXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdwcmVzdGEgYnVpbGQgZmFpbGVkJylcbiAgICB9XG5cbiAgICBjb25zdCBtYW5pZmVzdCA9IHtcbiAgICAgIGZpbGVzOiBbLi4ubWFuaWZlc3RTdGF0aWNGaWxlcywgLi4ubWFuaWZlc3REeW5hbWljRmlsZXNdLFxuICAgIH1cblxuICAgIHdyaXRlTWFuaWZlc3QobWFuaWZlc3QsIGNvbmZpZylcblxuICAgIGhvb2tzLmVtaXRQb3N0QnVpbGQoe1xuICAgICAgb3V0cHV0OiBjb25maWcub3V0cHV0LFxuICAgICAgc3RhdGljT3V0cHV0OiBjb25maWcuc3RhdGljT3V0cHV0RGlyLFxuICAgICAgZnVuY3Rpb25zT3V0cHV0OiBjb25maWcuZnVuY3Rpb25zT3V0cHV0RGlyLFxuICAgICAgbWFuaWZlc3QsXG4gICAgfSlcblxuICAgIGlmIChzdGF0aWNUaW1lKSB7XG4gICAgICBsb2dnZXIuaW5mbyh7XG4gICAgICAgIGxhYmVsOiAnc3RhdGljJyxcbiAgICAgICAgbWVzc2FnZTogYHJlbmRlcmVkICR7c3RhdGljRmlsZUFtb3VudH0gZmlsZShzKWAsXG4gICAgICAgIGR1cmF0aW9uOiBzdGF0aWNUaW1lLFxuICAgICAgfSlcbiAgICB9XG5cbiAgICBpZiAoZHluYW1pY1RpbWUpIHtcbiAgICAgIGxvZ2dlci5pbmZvKHtcbiAgICAgICAgbGFiZWw6ICdsYW1iZGEnLFxuICAgICAgICBtZXNzYWdlOiBgY29tcGlsZWQgJHtkeW5hbWljSWRzLmxlbmd0aH0gZnVuY3Rpb24ocylgLFxuICAgICAgICBkdXJhdGlvbjogZHluYW1pY1RpbWUsXG4gICAgICB9KVxuICAgIH1cblxuICAgIGlmIChjb3B5VGltZSkge1xuICAgICAgbG9nZ2VyLmluZm8oe1xuICAgICAgICBsYWJlbDogJ2Fzc2V0cycsXG4gICAgICAgIG1lc3NhZ2U6IGBjb3BpZWRgLFxuICAgICAgICBkdXJhdGlvbjogY29weVRpbWUsXG4gICAgICB9KVxuICAgIH1cblxuICAgIGlmIChzdGF0aWNUaW1lIHx8IGR5bmFtaWNUaW1lKSB7XG4gICAgICBsb2dnZXIuaW5mbyh7XG4gICAgICAgIGxhYmVsOiAnYnVpbGQnLFxuICAgICAgICBtZXNzYWdlOiBgY29tcGxldGVgLFxuICAgICAgICBkdXJhdGlvbjogdG90YWxUaW1lKCksXG4gICAgICB9KVxuICAgIH1cbiAgfVxufVxuIiwgImltcG9ydCB7IFNvY2tldCB9IGZyb20gJ25ldCdcbmltcG9ydCBodHRwIGZyb20gJ2h0dHAnXG5pbXBvcnQgc2lydiBmcm9tICdzaXJ2J1xuaW1wb3J0IG1pbWUgZnJvbSAnbWltZS10eXBlcydcbmltcG9ydCB0b1JlZ0V4cCBmcm9tICdyZWdleHBhcmFtJ1xuaW1wb3J0IHN0YXR1cyBmcm9tICdzdGF0dXNlcydcbmltcG9ydCB7IFdlYlNvY2tldFNlcnZlciB9IGZyb20gJ3dzJ1xuaW1wb3J0IHsgdGltZXIsIHJlcXVlc3RUb0V2ZW50LCByZXF1aXJlRnJlc2gsIHNlbmRTZXJ2ZXJsZXNzUmVzcG9uc2UsIGNyZWF0ZURlZmF1bHRIdG1sUmVzcG9uc2UgfSBmcm9tICdAcHJlc3RhL3V0aWxzJ1xuXG5pbXBvcnQgKiBhcyBsb2dnZXIgZnJvbSAnLi9sb2cnXG5pbXBvcnQgeyBjcmVhdGVMaXZlUmVsb2FkU2NyaXB0IH0gZnJvbSAnLi91dGlscydcbmltcG9ydCB7IEhhbmRsZXIsIEV2ZW50LCBSZXNwb25zZSwgQ29udGV4dCB9IGZyb20gJy4vbGFtYmRhJ1xuaW1wb3J0IHsgQ29uZmlnIH0gZnJvbSAnLi9jb25maWcnXG5pbXBvcnQgeyBIb29rcyB9IGZyb20gJy4vY3JlYXRlRW1pdHRlcidcbmltcG9ydCB7IG5vcm1hbGl6ZVJlc3BvbnNlIH0gZnJvbSAnLi9ub3JtYWxpemVSZXNwb25zZSdcbmltcG9ydCB7IGdldER5bmFtaWNGaWxlc0Zyb21NYW5pZmVzdCwgTWFuaWZlc3QsIE1hbmlmZXN0RHluYW1pY0ZpbGUgfSBmcm9tICcuL21hbmlmZXN0J1xuXG5leHBvcnQgaW50ZXJmYWNlIEh0dHBFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgc3RhdHVzQ29kZT86IG51bWJlclxuICBtZXNzYWdlOiBzdHJpbmdcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUh0dHBFcnJvcihzdGF0dXNDb2RlOiBudW1iZXIsIG1lc3NhZ2U6IHN0cmluZyk6IEh0dHBFcnJvciB7XG4gIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKG1lc3NhZ2UpXG4gIC8vIEB0cy1pZ25vcmVcbiAgZXJyb3Iuc3RhdHVzQ29kZSA9IHN0YXR1c0NvZGVcbiAgcmV0dXJuIGVycm9yXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRNaW1lVHlwZShyZXNwb25zZTogUmVzcG9uc2UpIHtcbiAgY29uc3QgdHlwZSA9IChyZXNwb25zZT8uaGVhZGVycyB8fCB7fSlbJ2NvbnRlbnQtdHlwZSddXG4gIHJldHVybiBtaW1lLmV4dGVuc2lvbih0eXBlIGFzIHN0cmluZykgfHwgJ2h0bWwnXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsb2FkTGFtYmRhRnJvbU1hbmlmZXN0KHVybDogc3RyaW5nLCBtYW5pZmVzdDogTWFuaWZlc3QpOiB7IGhhbmRsZXI6IEhhbmRsZXIgfSB7XG4gIGNvbnN0IGR5bmFtaWNGaWxlcyA9IGdldER5bmFtaWNGaWxlc0Zyb21NYW5pZmVzdChtYW5pZmVzdClcbiAgY29uc3QgbGFtYmRhID0gZHluYW1pY0ZpbGVzXG4gICAgLm1hcCgoZmlsZSkgPT4gKHtcbiAgICAgIG1hdGNoZXI6IHRvUmVnRXhwKGZpbGUucm91dGUpLFxuICAgICAgZmlsZSxcbiAgICB9KSlcbiAgICAuZmlsdGVyKCh7IG1hdGNoZXIgfSkgPT4ge1xuICAgICAgcmV0dXJuIG1hdGNoZXIucGF0dGVybi50ZXN0KHVybC5zcGxpdCgnPycpWzBdKVxuICAgIH0pXG4gICAgLm1hcCgoeyBmaWxlIH0pID0+IGZpbGUpWzBdXG5cbiAgcmV0dXJuIGxhbWJkYSA/IHJlcXVpcmUobGFtYmRhLmRlc3QpIDogdW5kZWZpbmVkXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm9jZXNzSGFuZGxlcihldmVudDogRXZlbnQsIGxhbWJkYTogeyBoYW5kbGVyOiBIYW5kbGVyIH0pIHtcbiAgY29uc3QgYWNjZXB0ID0gZXZlbnQuaGVhZGVycy5BY2NlcHQgfHwgZXZlbnQuaGVhZGVycy5hY2NlcHRcbiAgY29uc3QgYWNjZXB0c0pzb24gPSBhY2NlcHQgJiYgYWNjZXB0LmluY2x1ZGVzKCdqc29uJylcblxuICAvKlxuICAgKiBObyBhc3NldCBmaWxlLCBubyBzdGF0aWMgZmlsZSwgdHJ5IGR5bmFtaWNcbiAgICovXG4gIHRyeSB7XG4gICAgaWYgKCFsYW1iZGEgfHwgIWxhbWJkYS5oYW5kbGVyKSB7XG4gICAgICB0aHJvdyBjcmVhdGVIdHRwRXJyb3IoNDA0LCAnJylcbiAgICB9XG5cbiAgICByZXR1cm4gbm9ybWFsaXplUmVzcG9uc2UoYXdhaXQgbGFtYmRhLmhhbmRsZXIoZXZlbnQsIHsgYXdzUmVxdWVzdElkOiAncHJlc3RhIGRldicgfSBhcyBDb250ZXh0KSlcbiAgfSBjYXRjaCAoZSkge1xuICAgIGNvbnN0IGVycm9yID0gZSBhcyBIdHRwRXJyb3JcbiAgICBjb25zdCB7IHN0YXR1c0NvZGUgPSA1MDAgfSA9IGVycm9yXG5cbiAgICBpZiAoc3RhdHVzQ29kZSA+IDQ5OSlcbiAgICAgIGxvZ2dlci5lcnJvcih7XG4gICAgICAgIGxhYmVsOiAnZXJyb3InLFxuICAgICAgICBtZXNzYWdlOiBlcnJvci5tZXNzYWdlIHx8IHN0YXR1cy5tZXNzYWdlW3N0YXR1c0NvZGVdLFxuICAgICAgICBlcnJvcixcbiAgICAgIH0pXG5cbiAgICByZXR1cm4gbm9ybWFsaXplUmVzcG9uc2Uoe1xuICAgICAgc3RhdHVzQ29kZTogc3RhdHVzQ29kZSxcbiAgICAgIGh0bWw6IGFjY2VwdHNKc29uID8gdW5kZWZpbmVkIDogY3JlYXRlRGVmYXVsdEh0bWxSZXNwb25zZSh7IHN0YXR1c0NvZGUgfSksXG4gICAgICBqc29uOiBhY2NlcHRzSnNvbiA/IHsgZGV0YWlsOiBzdGF0dXMubWVzc2FnZVtzdGF0dXNDb2RlXSB9IDogdW5kZWZpbmVkLFxuICAgIH0pXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlcXVlc3RIYW5kbGVyKHsgcG9ydCwgY29uZmlnIH06IHsgcG9ydDogbnVtYmVyOyBjb25maWc6IENvbmZpZyB9KSB7XG4gIHJldHVybiBhc3luYyBmdW5jdGlvbiByZXF1ZXN0SGFuZGxlcihyZXE6IGh0dHAuSW5jb21pbmdNZXNzYWdlLCByZXM6IGh0dHAuU2VydmVyUmVzcG9uc2UpIHtcbiAgICBjb25zdCB0aW1lID0gdGltZXIoKVxuICAgIGNvbnN0IGV2ZW50ID0gYXdhaXQgcmVxdWVzdFRvRXZlbnQocmVxKSAvLyBzdG9jayBBV1MgRXZlbnQgc2hhcGVcbiAgICBjb25zdCBtYW5pZmVzdCA9IHJlcXVpcmVGcmVzaChjb25maWcubWFuaWZlc3RGaWxlcGF0aCkgYXMgTWFuaWZlc3RcbiAgICBjb25zdCBsYW1iZGEgPSBsb2FkTGFtYmRhRnJvbU1hbmlmZXN0KGV2ZW50LnBhdGgsIG1hbmlmZXN0KVxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcHJvY2Vzc0hhbmRsZXIoZXZlbnQsIGxhbWJkYSlcbiAgICBjb25zdCByZWRpciA9IHJlc3BvbnNlLnN0YXR1c0NvZGUgPiAyOTkgJiYgcmVzcG9uc2Uuc3RhdHVzQ29kZSA8IDM5OVxuICAgIGNvbnN0IG1pbWUgPSBnZXRNaW1lVHlwZShyZXNwb25zZSlcblxuICAgIGlmIChtaW1lID09PSAnaHRtbCcpIHtcbiAgICAgIHJlc3BvbnNlLmJvZHkgPSAocmVzcG9uc2UuYm9keSB8fCAnJykuc3BsaXQoJzwvYm9keT4nKVswXSArIGNyZWF0ZUxpdmVSZWxvYWRTY3JpcHQoeyBwb3J0IH0pXG4gICAgfVxuXG4gICAgc2VuZFNlcnZlcmxlc3NSZXNwb25zZShyZXMsIHJlc3BvbnNlKVxuXG4gICAgbG9nZ2VyW3Jlc3BvbnNlLnN0YXR1c0NvZGUgPCAyOTkgPyAnaW5mbycgOiAnZXJyb3InXSh7XG4gICAgICBsYWJlbDogJ3NlcnZlJyxcbiAgICAgIG1lc3NhZ2U6IGAke3Jlc3BvbnNlLnN0YXR1c0NvZGV9ICR7cmVkaXIgPyByZXNwb25zZT8uaGVhZGVycz8uTG9jYXRpb24gfHwgZXZlbnQucGF0aCA6IGV2ZW50LnBhdGh9YCxcbiAgICAgIGR1cmF0aW9uOiB0aW1lKCksXG4gICAgfSlcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2VydmVySGFuZGxlcih7IHBvcnQsIGNvbmZpZyB9OiB7IHBvcnQ6IG51bWJlcjsgY29uZmlnOiBDb25maWcgfSkge1xuICBjb25zdCBzdGF0aWNEaXIgPSBjb25maWcuc3RhdGljT3V0cHV0RGlyXG4gIGNvbnN0IGFzc2V0RGlyID0gY29uZmlnLmFzc2V0c1xuXG4gIHJldHVybiBhc3luYyBmdW5jdGlvbiBzZXJ2ZUhhbmRsZXIocmVxOiBodHRwLkluY29taW5nTWVzc2FnZSwgcmVzOiBodHRwLlNlcnZlclJlc3BvbnNlKSB7XG4gICAgY29uc3QgdGltZSA9IHRpbWVyKClcbiAgICBjb25zdCB1cmwgPSByZXEudXJsIGFzIHN0cmluZ1xuXG4gICAgbG9nZ2VyLmRlYnVnKHtcbiAgICAgIGxhYmVsOiAnZGVidWcnLFxuICAgICAgbWVzc2FnZTogYGhhbmRsaW5nICR7dXJsfWAsXG4gICAgfSlcblxuICAgIC8vIGhvb2sgaW50byBzaXJ2IGZvciBsb2dnaW5nIG9ubHlcbiAgICAvKiBjOCBpZ25vcmUgc3RhcnQgKi9cbiAgICBmdW5jdGlvbiBzZXRIZWFkZXJzKHJlczogaHR0cC5TZXJ2ZXJSZXNwb25zZSwgcGF0aG5hbWU6IHN0cmluZykge1xuICAgICAgbG9nZ2VyLmluZm8oe1xuICAgICAgICBsYWJlbDogJ3NlcnZlJyxcbiAgICAgICAgbWVzc2FnZTogYCR7cmVzLnN0YXR1c0NvZGV9ICR7cGF0aG5hbWV9YCxcbiAgICAgICAgZHVyYXRpb246IHRpbWUoKSxcbiAgICAgIH0pXG4gICAgfVxuICAgIC8qIGM4IGlnbm9yZSBlbmQgKi9cblxuICAgIC8qIGM4IGlnbm9yZSBuZXh0IDIgKi9cbiAgICBzaXJ2KGFzc2V0RGlyLCB7IGRldjogdHJ1ZSwgc2V0SGVhZGVycyB9KShyZXEsIHJlcywgKCkgPT4ge1xuICAgICAgc2lydihzdGF0aWNEaXIsIHsgZGV2OiB0cnVlLCBzZXRIZWFkZXJzIH0pKHJlcSwgcmVzLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNyZWF0ZVJlcXVlc3RIYW5kbGVyKHsgcG9ydCwgY29uZmlnIH0pKHJlcSwgcmVzKVxuICAgICAgfSlcbiAgICB9KVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXJ2ZShjb25maWc6IENvbmZpZywgaG9va3M6IEhvb2tzKSB7XG4gIGNvbnN0IHBvcnQgPSBjb25maWcucG9ydFxuICBjb25zdCBzZXJ2ZXIgPSBodHRwLmNyZWF0ZVNlcnZlcihjcmVhdGVTZXJ2ZXJIYW5kbGVyKHsgcG9ydCwgY29uZmlnIH0pKS5saXN0ZW4ocG9ydClcbiAgY29uc3Qgd2Vic29ja2V0ID0gbmV3IFdlYlNvY2tldFNlcnZlcih7IHNlcnZlciB9KVxuICBjb25zdCBzb2NrZXRzOiBTb2NrZXRbXSA9IFtdXG5cbiAgc2VydmVyLm9uKCdjb25uZWN0aW9uJywgKHNvY2tldCkgPT4ge1xuICAgIHNvY2tldHMucHVzaChzb2NrZXQpXG4gICAgc29ja2V0Lm9uKCdjbG9zZScsICgpID0+IHNvY2tldHMuc3BsaWNlKHNvY2tldHMuaW5kZXhPZihzb2NrZXQpLCAxKSlcbiAgfSlcblxuICBob29rcy5vbkJyb3dzZXJSZWZyZXNoKCgpID0+IHtcbiAgICBsb2dnZXIuZGVidWcoe1xuICAgICAgbGFiZWw6ICdkZWJ1ZycsXG4gICAgICBtZXNzYWdlOiBgcmVmcmVzaCBldmVudCByZWNlaXZlZGAsXG4gICAgfSlcblxuICAgIHdlYnNvY2tldC5jbGllbnRzLmZvckVhY2goKHdzKSA9PiB3cy5zZW5kKCdyZWZyZXNoJykpXG4gIH0pXG5cbiAgcmV0dXJuIHtcbiAgICBhc3luYyBjbG9zZSgpIHtcbiAgICAgIC8vIHNvIGp1c3QgYWx3YXlzIHJlc29sdmUgT0tcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgoeSkgPT4ge1xuICAgICAgICBzZXJ2ZXIuY2xvc2UoKCkgPT4geSgxKSlcbiAgICAgICAgLy8gc29ja2V0cyBpbmNsdWRlcyB3cyBzb2NrZXRzXG4gICAgICAgIHNvY2tldHMuZm9yRWFjaCgod3MpID0+IHdzLmRlc3Ryb3koKSlcbiAgICAgIH0pXG4gICAgfSxcbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjttOEJBQUEsb0NBRUEsT0FBaUIsbUJBQ2pCLEdBQWlCLGcvQ0NIakIsT0FBaUIsbUJBQ2pCLEdBQXFCLHVCQ0RyQiwrSkFBeUIsb0JDQWxCLEdBQU0s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