@worktif/runtime 0.3.0-edge.10 → 0.3.0-edge.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- "use strict";var C=Object.create;var u=Object.defineProperty;var x=Object.getOwnPropertyDescriptor;var E=Object.getOwnPropertyNames;var N=Object.getPrototypeOf,S=Object.prototype.hasOwnProperty;var T=(r,t)=>{for(var e in t)u(r,e,{get:t[e],enumerable:!0})},s=(r,t,e,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of E(t))!S.call(r,n)&&n!==e&&u(r,n,{get:()=>t[n],enumerable:!(o=x(t,n))||o.enumerable});return r},c=(r,t,e)=>(s(r,t,"default"),e&&s(e,t,"default")),k=(r,t,e)=>(e=r!=null?C(N(r)):{},s(t||!r||!r.__esModule?u(e,"default",{value:r,enumerable:!0}):e,r)),P=r=>s(u({},"__esModule",{value:!0}),r);var a={};T(a,{BrowserPipeline:()=>d,ConfigValidationError:()=>l,EnvironmentDetectionError:()=>f,createRuntimeConfig:()=>b,extractRuntimeConfig:()=>v,isRuntimeConfig:()=>y,isValidServiceName:()=>w,mergeRuntimeConfig:()=>g,pureweb:()=>D});module.exports=P(a);c(a,require("@worktif/purenow"),module.exports);var p=k(require("react")),R=require("react-dom/client"),m=require("react-router"),d=class{async execute(t,e){try{console.info("Starting browser pipeline execution",{serviceName:t.serviceName,stage:t.stage,url:e.metadata.url,userAgent:e.metadata.userAgent,viewport:e.metadata.viewport});let o=this.createBrowserRouter(t),n=this.createAppElement(t),h=p.createElement(m.RouterProvider,{router:o},n);this.hydrateApplication(h),this.setupHttpClient(t),console.info("Browser pipeline execution completed successfully",{serviceName:t.serviceName,stage:t.stage})}catch(o){throw console.error("Browser pipeline execution failed",{serviceName:t.serviceName,stage:t.stage,error:o instanceof Error?o.message:String(o),stack:o instanceof Error?o.stack:void 0}),o}}createBrowserRouter(t){console.debug("Creating browser router",{routeCount:t.router.getRoutes().length});let e=t.router.getRoutes(),o=(0,m.createBrowserRouter)(e);return console.debug("Browser router created successfully",{routeCount:e.length}),o}createAppElement(t){console.debug("Creating app element from factory");try{let e=t.app({router:t.router});if(!p.isValidElement(e))throw new Error("App factory must return a valid React element");return console.debug("App element created successfully"),e}catch(e){throw console.error("Failed to create app element",{error:e instanceof Error?e.message:String(e)}),new Error(`Failed to create app element: ${e instanceof Error?e.message:String(e)}`)}}hydrateApplication(t){console.debug("Starting React hydration");try{let e=document.getElementById("root");if(!e)throw new Error('Root container element not found. Expected element with id="root"');(0,R.hydrateRoot)(e,t),console.info("React hydration completed successfully")}catch(e){throw console.error("React hydration failed",{error:e instanceof Error?e.message:String(e)}),new Error(`React hydration failed: ${e instanceof Error?e.message:String(e)}`)}}setupHttpClient(t){console.debug("Setting up HTTP client for Lambda endpoints");try{let e=this.getApiBaseUrl(t.stage);typeof window<"u"&&(window.__PURENOW_CONFIG__={serviceName:t.serviceName,stage:t.stage,apiBaseUrl:e}),console.info("HTTP client configured successfully",{baseUrl:e,stage:t.stage})}catch(e){throw console.error("Failed to setup HTTP client",{error:e instanceof Error?e.message:String(e)}),new Error(`Failed to setup HTTP client: ${e instanceof Error?e.message:String(e)}`)}}getApiBaseUrl(t){return`${typeof window<"u"?window.location.origin:""}/api`}};function w(r){return/^[a-zA-Z][a-zA-Z0-9-]{0,127}$/.test(r)}var i=require("@worktif/purenow"),l=class extends Error{constructor(t){super(`Configuration validation failed:
2
- ${t.map(e=>` - ${e}`).join(`
3
- `)}`),this.name="ConfigValidationError",this.errors=t,Error.captureStackTrace(this,this.constructor)}},f=class extends Error{constructor(t){super(t),this.name="EnvironmentDetectionError",Error.captureStackTrace(this,this.constructor)}};function A(){return typeof window<"u"?"browser":typeof process<"u"&&process.env?.AWS_LAMBDA_FUNCTION_NAME?"lambda":(typeof process<"u"&&(process.env?.PURENOW_MODE==="cdk"||process.env?.CDK_DEFAULT_ACCOUNT||process.env?.CDK_DEFAULT_REGION||process.argv?.some(r=>r.includes("cdk")||r.includes("synth"))),"cdk")}function M(r,t){let e=[];return(!r.serviceName||!/^[a-zA-Z][a-zA-Z0-9-]{0,127}$/.test(r.serviceName))&&e.push("serviceName must start with a letter, contain only alphanumeric characters and hyphens, and be max 128 characters"),["dev","staging","prod"].includes(r.stage)||e.push("stage must be one of: dev, staging, prod"),t&&!r.infra&&e.push("infra configuration is required in CDK context"),{valid:e.length===0,errors:e}}function D(r){let t=A(),o=M(r,t==="cdk");if(!o.valid)throw new l(o.errors);switch(t){case"browser":{(0,i.purenow)({app:({router:n})=>r.app({router:n}),router:(0,i.purenowRouter)({router:r.router.getRoutes(),defaults:r.router.defaults}),config:{serviceName:r.serviceName,stage:r.stage}});break}case"lambda":case"cdk":{console.log("[Runtime] Server-side pipeline detected (%s)",t),(0,i.purenow)({app:({router:n})=>r.app({router:n}),router:(0,i.purenowRouter)({router:r.router.getRoutes(),defaults:r.router.defaults}),config:{serviceName:r.serviceName,stage:r.stage}});break}default:console.log("[Runtime Web] Unknown environment type: %s",t);break}}function g(r,t){return{...r,runtime:{enableThirdStack:!1,runtimeWebMode:"development",additionalFeatures:[],devServerEnhancements:{hotReload:!0,debugMode:!1,performanceMonitoring:!1},buildOptimizations:{bundleAnalysis:!1,treeshaking:!0,codeMinification:!0},...t}}}function y(r){return!!(r&&typeof r=="object"&&"runtime"in r)}function v(r){return r.runtime}function b(r){return g(r)}0&&(module.exports={BrowserPipeline,ConfigValidationError,EnvironmentDetectionError,createRuntimeConfig,extractRuntimeConfig,isRuntimeConfig,isValidServiceName,mergeRuntimeConfig,pureweb,...require("@worktif/purenow")});
4
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2luZGV4LnRzeCIsICIuLi8uLi8uLi9zcmMvbGliL3J1bnRpbWUtd2ViL3BpcGVsaW5lcy9icm93c2VyLXBpcGVsaW5lLnRzIiwgIi4uLy4uLy4uL3NyYy9saWIvcnVudGltZS13ZWIvdHlwZXMvY29uZmlnLnR5cGVzLnRzIiwgIi4uLy4uLy4uL3NyYy9saWIvcnVudGltZS13ZWIvcHVyZXdlYi50cyIsICIuLi8uLi8uLi9zcmMvbGliL3J1bnRpbWUtd2ViL3J1bnRpbWUuY29uZmlnLnR5cGVzLnRzeCJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IHdvcmt0aWYucHVyZW5vdy5jZGsgPHdvcmt0aWZfcHVyZW5vd19jZGs+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0yMiwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG4vLyBSZS1leHBvcnQgZXZlcnl0aGluZyBmcm9tIHRoZSBiYXNlIFB1cmVub3cgZnJhbWV3b3JrXG5leHBvcnQgKiBmcm9tICdAd29ya3RpZi9wdXJlbm93JztcblxuLy8gRXhwb3J0IHJ1bnRpbWUtd2ViIHNwZWNpZmljIGZ1bmN0aW9uYWxpdHlcbmV4cG9ydCAqIGZyb20gJy4vbGliL3J1bnRpbWUtd2ViJztcblxuLy8gRXhwb3J0IHJ1bnRpbWUgY29uZmlndXJhdGlvbiB0eXBlcyBhbmQgdXRpbGl0aWVzXG4vLyBleHBvcnQgKiBmcm9tICcuL3V0aWxzJztcblxuXG4vLyBSZS1leHBvcnQgcHVyZW5vdyBiaW4gZnVuY3Rpb25hbGl0eVxuLy8gZXhwb3J0ICogZnJvbSAnQHdvcmt0aWYvcHVyZW5vdyc7XG4iLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IHdvcmt0aWYucHVyZW5vdy5jZGsgPHdvcmt0aWZfcHVyZW5vd19jZGs+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0yMiwgaXQgaXMgcmUtbGljZW5zaW5nIHVuZGVyIEVsYXN0aWMgTGljZW5zZSAyLjAuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVsYXN0aWMtMi4wXG4gKi9cblxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgaHlkcmF0ZVJvb3QgfSBmcm9tICdyZWFjdC1kb20vY2xpZW50JztcbmltcG9ydCB7IGNyZWF0ZUJyb3dzZXJSb3V0ZXIsIFJvdXRlclByb3ZpZGVyIH0gZnJvbSAncmVhY3Qtcm91dGVyJztcblxuaW1wb3J0IHR5cGUgeyBCcm93c2VyTWV0YWRhdGEsIFJ1bnRpbWVXZWJDb25maWcgfSBmcm9tICdAbGliL3J1bnRpbWUtd2ViL3R5cGVzJztcblxuLy8gaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnQHdvcmt0aWYvdXRpbHMnO1xuXG4vKipcbiAqIEJyb3dzZXIgZXhlY3V0aW9uIHBpcGVsaW5lIGZvciBSdW50aW1lIFRhcmdldCBDb3JlLlxuICpcbiAqIEB0b2RvOiBvcmRpbmF0ZSB0aGlzIGNsYXNzIHRvIGluZnJhIG9yIGNvcmUgY2F1c2Ugd2UgaGF2ZSBOb2RlLmpzIHJlc3BvbnNpYmlsaXR5XG4gKiAgICAgIC0tLS0gT1IgXHUyMDEzPiBSRU1PVkUgTE9HR0VSXG4gKlxuICogKipBUkNISVRFQ1RVUkUgTk9URSoqOiBUaGlzIGZpbGUgaXMgaW4gYHNyYy9saWIvYCBiZWNhdXNlIGl0OlxuICogLSBVc2VzIGJyb3dzZXItb25seSBBUElzICh3aW5kb3csIGRvY3VtZW50LCBoeWRyYXRlUm9vdClcbiAqIC0gUnVucyBPTkxZIGluIGJyb3dzZXIgZW52aXJvbm1lbnRcbiAqIC0gTXVzdCBiZSBpc29tb3JwaGljLXNhZmUgKG5vIE5vZGUuanMgQVBJcylcbiAqIC0gTkVWRVIgcnVucyBpbiBMYW1iZGFcbiAqXG4gKiBIYW5kbGVzIGNsaWVudC1zaWRlIGh5ZHJhdGlvbiBvZiBSZWFjdCBhcHBsaWNhdGlvbnMgd2l0aCBwcmUtbG9hZGVkIGRhdGFcbiAqIGZyb20gc2VydmVyLXNpZGUgcmVuZGVyaW5nLiBTZXRzIHVwIGNsaWVudC1zaWRlIHJvdXRpbmcgYW5kIEhUVFAgY2xpZW50XG4gKiBmb3IgcG9zdC1oeWRyYXRpb24gQVBJIGNhbGxzIHRvIExhbWJkYSBlbmRwb2ludHMuXG4gKlxuICogKipFeGVjdXRpb24gRmxvdyoqOlxuICogMS4gSHlkcmF0ZSBSZWFjdCBhcHAgd2l0aCBleGlzdGluZyBQdXJlbm93Um91dGVyXG4gKiAyLiBDYWxsIGNvbmZpZy5hcHAoeyByb3V0ZXIgfSkgdG8gZ2V0IFJlYWN0IGVsZW1lbnRcbiAqIDMuIEluaXRpYWxpemUgY2xpZW50LXNpZGUgbmF2aWdhdGlvblxuICogNC4gU2V0IHVwIEhUVFAgY2xpZW50IGZvciBMYW1iZGEgZW5kcG9pbnQgY2FsbHNcbiAqXG4gKiAqKlJlcXVpcmVtZW50cyoqOiBSRVEtMDYsIFJFUS0xMlxuICovXG5leHBvcnQgY2xhc3MgQnJvd3NlclBpcGVsaW5lIHtcbiAgLy8gcHJpdmF0ZSByZWFkb25seSBsb2dnZXIgPSBsb2dnZXIoe1xuICAvLyAgIHNlcnZpY2VOYW1lOiAnQGxpYi9ydW50aW1lLXdlYi9waXBlbGluZXMvYnJvd3Nlci1waXBlbGluZScsXG4gIC8vIH0pO1xuXG4gIC8qKlxuICAgKiBFeGVjdXRlIGJyb3dzZXIgcGlwZWxpbmUgZm9yIGNsaWVudC1zaWRlIGh5ZHJhdGlvbi5cbiAgICpcbiAgICogSHlkcmF0ZXMgdGhlIFJlYWN0IGFwcGxpY2F0aW9uIHdpdGggcHJlLWxvYWRlZCBkYXRhIGZyb20gU1NSIGFuZCBzZXRzIHVwXG4gICAqIGNsaWVudC1zaWRlIHJvdXRpbmcuIFVzZXMgUmVhY3QgaHlkcmF0aW9uIChub3QgcmVuZGVyKSB0byBtYXRjaCB0aGVcbiAgICogc2VydmVyLXJlbmRlcmVkIEhUTUwgZXhhY3RseS5cbiAgICpcbiAgICogQHBhcmFtIGNvbmZpZyAtIFB1cmVub3cgY29uZmlndXJhdGlvbiB3aXRoIGFwcCBmYWN0b3J5IGFuZCByb3V0ZXJcbiAgICogQHBhcmFtIGNvbnRleHQgLSBCcm93c2VyIGVudmlyb25tZW50IGNvbnRleHQgd2l0aCBtZXRhZGF0YVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHBpcGVsaW5lID0gbmV3IEJyb3dzZXJQaXBlbGluZSgpO1xuICAgKiBhd2FpdCBwaXBlbGluZS5leGVjdXRlKGNvbmZpZywge1xuICAgKiAgIHR5cGU6ICdicm93c2VyJyxcbiAgICogICBtZXRhZGF0YToge1xuICAgKiAgICAgdXNlckFnZW50OiBuYXZpZ2F0b3IudXNlckFnZW50LFxuICAgKiAgICAgdXJsOiB3aW5kb3cubG9jYXRpb24uaHJlZixcbiAgICogICAgIHZpZXdwb3J0OiB7IHdpZHRoOiB3aW5kb3cuaW5uZXJXaWR0aCwgaGVpZ2h0OiB3aW5kb3cuaW5uZXJIZWlnaHQgfVxuICAgKiAgIH1cbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZShjb25maWc6IFJ1bnRpbWVXZWJDb25maWcsIGNvbnRleHQ6IHsgdHlwZTogJ2Jyb3dzZXInOyBtZXRhZGF0YTogQnJvd3Nlck1ldGFkYXRhIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc29sZS5pbmZvKCdTdGFydGluZyBicm93c2VyIHBpcGVsaW5lIGV4ZWN1dGlvbicsIHtcbiAgICAgICAgc2VydmljZU5hbWU6IGNvbmZpZy5zZXJ2aWNlTmFtZSxcbiAgICAgICAgc3RhZ2U6IGNvbmZpZy5zdGFnZSxcbiAgICAgICAgdXJsOiBjb250ZXh0Lm1ldGFkYXRhLnVybCxcbiAgICAgICAgdXNlckFnZW50OiBjb250ZXh0Lm1ldGFkYXRhLnVzZXJBZ2VudCxcbiAgICAgICAgdmlld3BvcnQ6IGNvbnRleHQubWV0YWRhdGEudmlld3BvcnQsXG4gICAgICB9KTtcblxuICAgICAgLy8gMS4gQ3JlYXRlIGJyb3dzZXIgcm91dGVyIGZyb20gUHVyZW5vd1JvdXRlclxuICAgICAgY29uc3QgYnJvd3NlclJvdXRlciA9IHRoaXMuY3JlYXRlQnJvd3NlclJvdXRlcihjb25maWcpO1xuXG4gICAgICAvLyAyLiBHZXQgUmVhY3QgZWxlbWVudCBmcm9tIGFwcCBmYWN0b3J5XG4gICAgICBjb25zdCBhcHBFbGVtZW50ID0gdGhpcy5jcmVhdGVBcHBFbGVtZW50KGNvbmZpZyk7XG5cbiAgICAgIC8vIDMuIENyZWF0ZSByb3V0ZXIgcHJvdmlkZXIgd2l0aCB0aGUgYXBwXG4gICAgICBjb25zdCByb3V0ZXJQcm92aWRlciA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoUm91dGVyUHJvdmlkZXIsIHtcbiAgICAgICAgcm91dGVyOiBicm93c2VyUm91dGVyLFxuICAgICAgfSwgYXBwRWxlbWVudCk7XG5cbiAgICAgIC8vIDQuIEh5ZHJhdGUgdGhlIGFwcGxpY2F0aW9uICh1c2UgaHlkcmF0aW9uLCBub3QgcmVuZGVyKVxuICAgICAgdGhpcy5oeWRyYXRlQXBwbGljYXRpb24ocm91dGVyUHJvdmlkZXIpO1xuXG4gICAgICAvLyA1LiBTZXQgdXAgSFRUUCBjbGllbnQgZm9yIHBvc3QtaHlkcmF0aW9uIEFQSSBjYWxsc1xuICAgICAgdGhpcy5zZXR1cEh0dHBDbGllbnQoY29uZmlnKTtcblxuICAgICAgY29uc29sZS5pbmZvKCdCcm93c2VyIHBpcGVsaW5lIGV4ZWN1dGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5Jywge1xuICAgICAgICBzZXJ2aWNlTmFtZTogY29uZmlnLnNlcnZpY2VOYW1lLFxuICAgICAgICBzdGFnZTogY29uZmlnLnN0YWdlLFxuICAgICAgfSk7XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignQnJvd3NlciBwaXBlbGluZSBleGVjdXRpb24gZmFpbGVkJywge1xuICAgICAgICBzZXJ2aWNlTmFtZTogY29uZmlnLnNlcnZpY2VOYW1lLFxuICAgICAgICBzdGFnZTogY29uZmlnLnN0YWdlLFxuICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgICAgICBzdGFjazogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLnN0YWNrIDogdW5kZWZpbmVkLFxuICAgICAgfSk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGJyb3dzZXIgcm91dGVyIGZyb20gUHVyZW5vd1JvdXRlciBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBVc2VzIHRoZSBleGlzdGluZyBQdXJlbm93Um91dGVyIHRvIGdldCByb3V0ZXMgYW5kIGNyZWF0ZXMgYSBSZWFjdCBSb3V0ZXJcbiAgICogYnJvd3NlciByb3V0ZXIgZm9yIGNsaWVudC1zaWRlIG5hdmlnYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBjb25maWcgLSBQdXJlbm93IGNvbmZpZ3VyYXRpb25cbiAgICogQHJldHVybnMgQnJvd3NlciByb3V0ZXIgaW5zdGFuY2VcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlQnJvd3NlclJvdXRlcihjb25maWc6IFJ1bnRpbWVXZWJDb25maWcpIHtcbiAgICBjb25zb2xlLmRlYnVnKCdDcmVhdGluZyBicm93c2VyIHJvdXRlcicsIHtcbiAgICAgIHJvdXRlQ291bnQ6IGNvbmZpZy5yb3V0ZXIuZ2V0Um91dGVzKCkubGVuZ3RoLFxuICAgIH0pO1xuXG4gICAgLy8gR2V0IHJvdXRlcyBmcm9tIFB1cmVub3dSb3V0ZXJcbiAgICBjb25zdCByb3V0ZXMgPSBjb25maWcucm91dGVyLmdldFJvdXRlcygpO1xuXG4gICAgLy8gQ3JlYXRlIGJyb3dzZXIgcm91dGVyIHdpdGggcm91dGVzIChjYXN0IHRvIFJvdXRlT2JqZWN0W10gZm9yIGNvbXBhdGliaWxpdHkpXG4gICAgY29uc3QgYnJvd3NlclJvdXRlciA9IGNyZWF0ZUJyb3dzZXJSb3V0ZXIocm91dGVzIGFzIGFueSk7XG5cbiAgICBjb25zb2xlLmRlYnVnKCdCcm93c2VyIHJvdXRlciBjcmVhdGVkIHN1Y2Nlc3NmdWxseScsIHtcbiAgICAgIHJvdXRlQ291bnQ6IHJvdXRlcy5sZW5ndGgsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gYnJvd3NlclJvdXRlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgUmVhY3QgZWxlbWVudCBmcm9tIGFwcCBmYWN0b3J5IGZ1bmN0aW9uLlxuICAgKlxuICAgKiBDYWxscyB0aGUgdXNlcidzIGFwcCBmYWN0b3J5IGZ1bmN0aW9uIHdpdGggdGhlIHJvdXRlciBkZXBlbmRlbmN5XG4gICAqIHRvIGdldCB0aGUgcm9vdCBSZWFjdCBlbGVtZW50IGZvciB0aGUgYXBwbGljYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBjb25maWcgLSBQdXJlbm93IGNvbmZpZ3VyYXRpb25cbiAgICogQHJldHVybnMgUm9vdCBSZWFjdCBlbGVtZW50XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUFwcEVsZW1lbnQoY29uZmlnOiBSdW50aW1lV2ViQ29uZmlnKTogUmVhY3QuUmVhY3RFbGVtZW50IHtcbiAgICBjb25zb2xlLmRlYnVnKCdDcmVhdGluZyBhcHAgZWxlbWVudCBmcm9tIGZhY3RvcnknKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBDYWxsIGFwcCBmYWN0b3J5IHdpdGggcm91dGVyIGRlcGVuZGVuY3lcbiAgICAgIGNvbnN0IGFwcEVsZW1lbnQgPSBjb25maWcuYXBwKHsgcm91dGVyOiBjb25maWcucm91dGVyIH0pO1xuXG4gICAgICBpZiAoIVJlYWN0LmlzVmFsaWRFbGVtZW50KGFwcEVsZW1lbnQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQXBwIGZhY3RvcnkgbXVzdCByZXR1cm4gYSB2YWxpZCBSZWFjdCBlbGVtZW50Jyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnNvbGUuZGVidWcoJ0FwcCBlbGVtZW50IGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgICByZXR1cm4gYXBwRWxlbWVudDtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gY3JlYXRlIGFwcCBlbGVtZW50Jywge1xuICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgICAgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBjcmVhdGUgYXBwIGVsZW1lbnQ6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIeWRyYXRlIHRoZSBSZWFjdCBhcHBsaWNhdGlvbiBpbiB0aGUgYnJvd3Nlci5cbiAgICpcbiAgICogVXNlcyBSZWFjdCdzIGh5ZHJhdGVSb290IHRvIGh5ZHJhdGUgdGhlIHNlcnZlci1yZW5kZXJlZCBIVE1MIHdpdGhcbiAgICogdGhlIGNsaWVudC1zaWRlIFJlYWN0IGFwcGxpY2F0aW9uLiBUaGlzIGVuc3VyZXMgdGhlIGNsaWVudCBtYXRjaGVzXG4gICAqIHRoZSBzZXJ2ZXIgZXhhY3RseSB0byBhdm9pZCBoeWRyYXRpb24gbWlzbWF0Y2hlcy5cbiAgICpcbiAgICogQHBhcmFtIHJvdXRlclByb3ZpZGVyIC0gUm91dGVyIHByb3ZpZGVyIGVsZW1lbnQgdG8gaHlkcmF0ZVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBoeWRyYXRlQXBwbGljYXRpb24ocm91dGVyUHJvdmlkZXI6IFJlYWN0LlJlYWN0RWxlbWVudCk6IHZvaWQge1xuICAgIGNvbnNvbGUuZGVidWcoJ1N0YXJ0aW5nIFJlYWN0IGh5ZHJhdGlvbicpO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIEdldCB0aGUgcm9vdCBjb250YWluZXIgZWxlbWVudFxuICAgICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jvb3QnKTtcbiAgICAgIGlmICghY29udGFpbmVyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUm9vdCBjb250YWluZXIgZWxlbWVudCBub3QgZm91bmQuIEV4cGVjdGVkIGVsZW1lbnQgd2l0aCBpZD1cInJvb3RcIicpO1xuICAgICAgfVxuXG4gICAgICAvLyBIeWRyYXRlIHRoZSBhcHBsaWNhdGlvbiAobm90IHJlbmRlciAtIG11c3QgbWF0Y2ggc2VydmVyIEhUTUwpXG4gICAgICBoeWRyYXRlUm9vdChjb250YWluZXIsIHJvdXRlclByb3ZpZGVyKTtcblxuICAgICAgY29uc29sZS5pbmZvKCdSZWFjdCBoeWRyYXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseScpO1xuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1JlYWN0IGh5ZHJhdGlvbiBmYWlsZWQnLCB7XG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICB9KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUmVhY3QgaHlkcmF0aW9uIGZhaWxlZDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldCB1cCBIVFRQIGNsaWVudCBmb3IgTGFtYmRhIGVuZHBvaW50IGNhbGxzLlxuICAgKlxuICAgKiBDb25maWd1cmVzIHRoZSBIVFRQIGNsaWVudCBmb3IgbWFraW5nIEFQSSBjYWxscyB0byBMYW1iZGEgZW5kcG9pbnRzXG4gICAqIGFmdGVyIGh5ZHJhdGlvbi4gVGhpcyBpcyB1c2VkIGZvciBwb3N0LWh5ZHJhdGlvbiBpbnRlcmFjdGlvbnMgdGhhdFxuICAgKiByZXF1aXJlIHNlcnZlci1zaWRlIGRhdGEuXG4gICAqXG4gICAqIEBwYXJhbSBjb25maWcgLSBQdXJlbm93IGNvbmZpZ3VyYXRpb25cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgc2V0dXBIdHRwQ2xpZW50KGNvbmZpZzogUnVudGltZVdlYkNvbmZpZyk6IHZvaWQge1xuICAgIGNvbnNvbGUuZGVidWcoJ1NldHRpbmcgdXAgSFRUUCBjbGllbnQgZm9yIExhbWJkYSBlbmRwb2ludHMnKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBTZXQgdXAgYmFzZSBVUkwgZm9yIEFQSSBjYWxscyBiYXNlZCBvbiBzdGFnZVxuICAgICAgY29uc3QgYmFzZVVybCA9IHRoaXMuZ2V0QXBpQmFzZVVybChjb25maWcuc3RhZ2UpO1xuXG4gICAgICAvLyBTdG9yZSBjb25maWd1cmF0aW9uIGdsb2JhbGx5IGZvciB1c2UgYnkgZGF0YSBsb2FkZXJzXG4gICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgKHdpbmRvdyBhcyBhbnkpLl9fUFVSRU5PV19DT05GSUdfXyA9IHtcbiAgICAgICAgICBzZXJ2aWNlTmFtZTogY29uZmlnLnNlcnZpY2VOYW1lLFxuICAgICAgICAgIHN0YWdlOiBjb25maWcuc3RhZ2UsXG4gICAgICAgICAgYXBpQmFzZVVybDogYmFzZVVybCxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY29uc29sZS5pbmZvKCdIVFRQIGNsaWVudCBjb25maWd1cmVkIHN1Y2Nlc3NmdWxseScsIHtcbiAgICAgICAgYmFzZVVybCxcbiAgICAgICAgc3RhZ2U6IGNvbmZpZy5zdGFnZSxcbiAgICAgIH0pO1xuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBzZXR1cCBIVFRQIGNsaWVudCcsIHtcbiAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gc2V0dXAgSFRUUCBjbGllbnQ6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgQVBJIGJhc2UgVVJMIGJhc2VkIG9uIGRlcGxveW1lbnQgc3RhZ2UuXG4gICAqXG4gICAqIERldGVybWluZXMgdGhlIGFwcHJvcHJpYXRlIEFQSSBiYXNlIFVSTCBmb3IgbWFraW5nIEhUVFAgcmVxdWVzdHNcbiAgICogdG8gTGFtYmRhIGVuZHBvaW50cyBiYXNlZCBvbiB0aGUgZGVwbG95bWVudCBzdGFnZS5cbiAgICpcbiAgICogQHBhcmFtIHN0YWdlIC0gRGVwbG95bWVudCBzdGFnZVxuICAgKiBAcmV0dXJucyBBUEkgYmFzZSBVUkxcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgZ2V0QXBpQmFzZVVybChzdGFnZTogJ2RldicgfCAnc3RhZ2luZycgfCAncHJvZCcpOiBzdHJpbmcge1xuICAgIC8vIEluIGJyb3dzZXIgY29udGV4dCwgQVBJIGNhbGxzIGdvIHRocm91Z2ggdGhlIHNhbWUgb3JpZ2luXG4gICAgLy8gVGhlIGFjdHVhbCBBUEkgR2F0ZXdheSBVUkwgaXMgaGFuZGxlZCBieSBDbG91ZEZyb250IHJvdXRpbmdcbiAgICBjb25zdCBvcmlnaW4gPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4gOiAnJztcblxuICAgIC8vIEFQSSBlbmRwb2ludHMgYXJlIHR5cGljYWxseSB1bmRlciAvYXBpIHBhdGhcbiAgICByZXR1cm4gYCR7b3JpZ2lufS9hcGlgO1xuICB9XG59XG4iLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IHdvcmt0aWYucHVyZW5vdy5jZGsgPHdvcmt0aWZfcHVyZW5vd19jZGs+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0yMiwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdHlwZSB7IEluZnJhT3B0aW9ucyB9IGZyb20gJy4vaW5mcmEudHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBNaWNyb3NlcnZpY2VEZWZpbml0aW9uIH0gZnJvbSAnLi9taWNyb3NlcnZpY2UudHlwZXMnO1xuXG4vKipcbiAqIFB1cmVub3dSb3V0ZXIgaW50ZXJmYWNlIGZvciBydW50aW1lLXdlYiBpbnRlZ3JhdGlvbi5cbiAqXG4gKiBEZWZpbmVzIHRoZSBlc3NlbnRpYWwgbWV0aG9kcyBuZWVkZWQgYnkgdGhlIHJ1bnRpbWUtd2ViIHBpcGVsaW5lcy5cbiAqIFRoaXMgaW50ZXJmYWNlIG1hdGNoZXMgdGhlIGFjdHVhbCBQdXJlbm93Um91dGVyIGNsYXNzIGZyb20gQGxpYi9yZWFjdC9wdXJlbm93LnJvdXRlci5cbiAqL1xuaW50ZXJmYWNlIFB1cmVub3dSb3V0ZXIge1xuICAvKipcbiAgICogR2V0IGFsbCByb3V0ZSBvYmplY3RzIGFzIGFuIGFycmF5LlxuICAgKiBVc2VkIGZvciBjcmVhdGluZyBicm93c2VyIHJvdXRlcnMgYW5kIFNTUiBzdGF0aWMgaGFuZGxlcnMuXG4gICAqL1xuICBnZXRSb3V0ZXMoKTogQXJyYXk8e1xuICAgIHBhdGg/OiBzdHJpbmc7XG4gICAgZWxlbWVudD86IHVua25vd247XG4gICAgbG9hZGVyPzogdW5rbm93bjtcbiAgICBjaGlsZHJlbj86IHVua25vd247XG4gICAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcbiAgfT47XG5cbiAgLyoqXG4gICAqIEZpbmQgYSByb3V0ZSBieSBpdHMgSUQuXG4gICAqL1xuICBnZXRSb3V0ZUJ5SWQ/KGlkOiBzdHJpbmcpOiB1bmtub3duO1xuXG4gIC8qKlxuICAgKiBGaW5kIGEgcm91dGUgYnkgaXRzIHBhdGguXG4gICAqL1xuICBnZXRSb3V0ZUJ5UGF0aD8ocGF0aDogc3RyaW5nKTogdW5rbm93bjtcblxuICAvKipcbiAgICogR2V0IHRoZSByb3V0ZXMgYXJyYXkgKGdldHRlcikuXG4gICAqL1xuICByb3V0ZXM/OiBBcnJheTx1bmtub3duPjtcblxuICAvKipcbiAgICogR2V0IHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBkZWZhdWx0cz86IHVua25vd247XG59XG5cbi8qKlxuICogU3RhZ2UgZW52aXJvbm1lbnQgZm9yIGRlcGxveW1lbnQuXG4gKlxuICogLSBgZGV2YDogRGV2ZWxvcG1lbnQgZW52aXJvbm1lbnRcbiAqIC0gYHN0YWdpbmdgOiBTdGFnaW5nL3ByZS1wcm9kdWN0aW9uIGVudmlyb25tZW50XG4gKiAtIGBwcm9kYDogUHJvZHVjdGlvbiBlbnZpcm9ubWVudFxuICovXG5leHBvcnQgdHlwZSBTdGFnZSA9ICdkZXYnIHwgJ3N0YWdpbmcnIHwgJ3Byb2QnO1xuXG4vKipcbiAqIFV0aWxpdHkgdHlwZSB0byBleHRyYWN0IHNlcnZpY2UgbmFtZXMgZnJvbSByZWdpc3RlciBjb25maWd1cmF0aW9uLlxuICpcbiAqIFRoaXMgZW5hYmxlcyBjb21waWxlLXRpbWUgdmFsaWRhdGlvbiBvZiBzZXJ2aWNlIG5hbWVzIGFuZCBwcm92aWRlc1xuICogdHlwZS1zYWZlIGFjY2VzcyB0byBzZXJ2aWNlIGlkZW50aWZpZXJzIHRocm91Z2hvdXQgdGhlIGZyYW1ld29yay5cbiAqXG4gKiBAdGVtcGxhdGUgVCAtIFRoZSByZWdpc3RlciBjb25maWd1cmF0aW9uIG9iamVjdCB0eXBlXG4gKi9cbmV4cG9ydCB0eXBlIFNlcnZpY2VOYW1lczxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgTWljcm9zZXJ2aWNlRGVmaW5pdGlvbj4+ID0ga2V5b2YgVDtcblxuLyoqXG4gKiBVdGlsaXR5IHR5cGUgdG8gZ2VuZXJhdGUgTGFtYmRhIElEcyBmcm9tIHNlcnZpY2UgY29uZmlndXJhdGlvbi5cbiAqXG4gKiBDb21iaW5lcyBzZXJ2aWNlIG5hbWVzIHdpdGggTGFtYmRhIElEcyB0byBjcmVhdGUgZnVsbHkgcXVhbGlmaWVkXG4gKiBMYW1iZGEgaWRlbnRpZmllcnMgZm9yIHR5cGUtc2FmZSBMYW1iZGEgcmVzb2x1dGlvbi5cbiAqXG4gKiBAdGVtcGxhdGUgVCAtIFRoZSByZWdpc3RlciBjb25maWd1cmF0aW9uIG9iamVjdCB0eXBlXG4gKi9cbmV4cG9ydCB0eXBlIExhbWJkYUlkczxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgTWljcm9zZXJ2aWNlRGVmaW5pdGlvbj4+ID0ge1xuICBbSyBpbiBrZXlvZiBUXTogVFtLXVsnbGFtYmRhcyddW251bWJlcl0gZXh0ZW5kcyB7IGlkOiBpbmZlciBJIH1cbiAgICA/IEkgZXh0ZW5kcyBzdHJpbmdcbiAgICAgID8gYCR7SyAmIHN0cmluZ30uJHtJfWBcbiAgICAgIDogbmV2ZXJcbiAgICA6IG5ldmVyO1xufVtrZXlvZiBUXTtcblxuLyoqXG4gKiBUeXBlIGNvbnN0cmFpbnQgZm9yIHZhbGlkIHNlcnZpY2UgbmFtZXMuXG4gKlxuICogRW5zdXJlcyBzZXJ2aWNlIG5hbWVzIGZvbGxvdyB0aGUgdmFsaWRhdGlvbiBwYXR0ZXJuOlxuICogLSBNdXN0IHN0YXJ0IHdpdGggYSBsZXR0ZXIgKGEteiwgQS1aKVxuICogLSBDYW4gY29udGFpbiBsZXR0ZXJzLCBudW1iZXJzLCBhbmQgaHlwaGVuc1xuICogLSBNYXhpbXVtIGxlbmd0aDogMTI4IGNoYXJhY3RlcnNcbiAqXG4gKiBUaGlzIGlzIGEgYnJhbmRlZCB0eXBlIHRoYXQgcHJvdmlkZXMgY29tcGlsZS10aW1lIHZhbGlkYXRpb24uXG4gKi9cbmV4cG9ydCB0eXBlIFZhbGlkU2VydmljZU5hbWUgPSBzdHJpbmcgJiB7IHJlYWRvbmx5IF9fYnJhbmQ6ICdWYWxpZFNlcnZpY2VOYW1lJyB9O1xuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gdmFsaWRhdGUgc2VydmljZSBuYW1lIGZvcm1hdC5cbiAqXG4gKiBAcGFyYW0gc2VydmljZU5hbWUgLSBUaGUgc2VydmljZSBuYW1lIHRvIHZhbGlkYXRlXG4gKiBAcmV0dXJucyBUeXBlIHByZWRpY2F0ZSBpbmRpY2F0aW5nIGlmIHRoZSBzZXJ2aWNlIG5hbWUgaXMgdmFsaWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRTZXJ2aWNlTmFtZShzZXJ2aWNlTmFtZTogc3RyaW5nKTogc2VydmljZU5hbWUgaXMgVmFsaWRTZXJ2aWNlTmFtZSB7XG4gIHJldHVybiAvXlthLXpBLVpdW2EtekEtWjAtOS1dezAsMTI3fSQvLnRlc3Qoc2VydmljZU5hbWUpO1xufVxuXG4vKipcbiAqIE1haW4gY29uZmlndXJhdGlvbiBpbnRlcmZhY2UgZm9yIFJ1bnRpbWUgVGFyZ2V0IENvcmUuXG4gKlxuICogVGhpcyBpbnRlcmZhY2UgcHJvdmlkZXMgYSB1bmlmaWVkIGNvbmZpZ3VyYXRpb24gdGhhdCB3b3JrcyBhY3Jvc3MgYWxsIGV4ZWN1dGlvbiBjb250ZXh0czpcbiAqIC0gQnJvd3NlcjogSHlkcmF0ZXMgUmVhY3QgYXBwbGljYXRpb24gd2l0aCBjbGllbnQtc2lkZSByb3V0aW5nXG4gKiAtIExhbWJkYTogRXhlY3V0ZXMgc2VydmVyLXNpZGUgcmVuZGVyaW5nIGFuZCBidXNpbmVzcyBsb2dpY1xuICogLSBDREs6IFN5bnRoZXNpemVzIENsb3VkRm9ybWF0aW9uIGluZnJhc3RydWN0dXJlXG4gKlxuICogQHRlbXBsYXRlIFRSZWdpc3RlciAtIFRoZSByZWdpc3RlciBjb25maWd1cmF0aW9uIHR5cGUgZm9yIHR5cGUtc2FmZSBzZXJ2aWNlIG5hbWVzXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IHB1cmVub3cgfSBmcm9tICdAd29ya3RpZi9wdXJlbm93L3J1bnRpbWUtd2ViJztcbiAqIGltcG9ydCB7IFB1cmVub3dSb3V0ZXIgfSBmcm9tICdAd29ya3RpZi9wdXJlbm93JztcbiAqXG4gKiBjb25zdCBjb25maWcgPSB7XG4gKiAgIGFwcDogKHsgcm91dGVyIH0pID0+IDxBcHAgcm91dGVyPXtyb3V0ZXJ9IC8+LFxuICogICByb3V0ZXI6IG5ldyBQdXJlbm93Um91dGVyKHsgcm91dGVyOiByb3V0ZXMsIGRlZmF1bHRzOiB7fSB9KSxcbiAqICAgc2VydmljZU5hbWU6ICdteS1hcHAnLFxuICogICBzdGFnZTogJ2RldicsXG4gKiAgIHJlZ2lzdGVyOiB7XG4gKiAgICAgcGF5bWVudHM6IHtcbiAqICAgICAgIHRpZXM6IFtQYXltZW50c1RpZXNdLFxuICogICAgICAgbGFtYmRhczogW2NoYXJnZUhhbmRsZXIsIHJlZnVuZEhhbmRsZXJdXG4gKiAgICAgfSxcbiAqICAgICB1c2Vyczoge1xuICogICAgICAgdGllczogW1VzZXJzVGllc10sXG4gKiAgICAgICBsYW1iZGFzOiBbY3JlYXRlVXNlckhhbmRsZXIsIGdldFVzZXJIYW5kbGVyXVxuICogICAgIH1cbiAqICAgfSBhcyBjb25zdCwgIC8vIFVzZSAnYXMgY29uc3QnIGZvciBiZXR0ZXIgdHlwZSBpbmZlcmVuY2VcbiAqICAgaW5mcmE6IHtcbiAqICAgICBlbnY6IHsgYWNjb3VudDogJzEyMzQ1Njc4OTAxMicsIHJlZ2lvbjogJ3VzLWVhc3QtMScgfSxcbiAqICAgICBzdGFnZTogJ2RldicsXG4gKiAgICAgcmVhY3RFbnRyeTogJy4vc3JjL2luZGV4LnRzeCcsXG4gKiAgICAgYXBpTW9kZTogJ2FwaUdhdGV3YXknXG4gKiAgIH1cbiAqIH0gc2F0aXNmaWVzIFB1cmVub3dDb25maWc7XG4gKlxuICogcHVyZW5vdyhjb25maWcpO1xuICogYGBgXG4gKlxuICogQHRvZG86IGFmdGVyIFJ1bnRpbWVXZWIgcmVwbyB3aWxsIGJlIHJlc29sdmVkLCBSdW50aW1lV2ViQ29uZmlnIE1VU1QgZXh0ZW5kIFB1cmVub3dDb25maWcgQ29yZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJ1bnRpbWVXZWJDb25maWc8VFJlZ2lzdGVyIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgTWljcm9zZXJ2aWNlRGVmaW5pdGlvbj4gPSBSZWNvcmQ8c3RyaW5nLCBNaWNyb3NlcnZpY2VEZWZpbml0aW9uPj4ge1xuICAvKipcbiAgICogUmVhY3QgYXBwbGljYXRpb24gY29tcG9uZW50IGZhY3RvcnkgZnVuY3Rpb24uXG4gICAqXG4gICAqIFJlY2VpdmVzIHRoZSByb3V0ZXIgaW5zdGFuY2UgYXMgYSBkZXBlbmRlbmN5IGFuZCByZXR1cm5zIHRoZSByb290IFJlYWN0IGVsZW1lbnQuXG4gICAqIFRoaXMgcGF0dGVybiBlbmFibGVzIGRlcGVuZGVuY3kgaW5qZWN0aW9uIG9mIHRoZSByb3V0ZXIgaW50byB5b3VyIGFwcGxpY2F0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gZGVwcyAtIERlcGVuZGVuY2llcyBvYmplY3QgY29udGFpbmluZyB0aGUgcm91dGVyXG4gICAqIEBwYXJhbSBkZXBzLnJvdXRlciAtIFB1cmVub3dSb3V0ZXIgaW5zdGFuY2UgZm9yIG5hdmlnYXRpb24gYW5kIHJvdXRpbmdcbiAgICogQHJldHVybnMgUm9vdCBSZWFjdCBlbGVtZW50IChSZWFjdC5SZWFjdEVsZW1lbnQpXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogYXBwOiAoeyByb3V0ZXIgfSkgPT4gPEFwcCByb3V0ZXI9e3JvdXRlcn0gLz5cbiAgICogYGBgXG4gICAqL1xuICBhcHA6IChkZXBzOiB7IHJvdXRlcjogUHVyZW5vd1JvdXRlciB9KSA9PiBSZWFjdC5SZWFjdEVsZW1lbnQ7XG5cbiAgLyoqXG4gICAqIFB1cmVub3dSb3V0ZXIgaW5zdGFuY2UgZm9yIGFwcGxpY2F0aW9uIHJvdXRpbmcuXG4gICAqXG4gICAqIERlZmluZXMgYWxsIHJvdXRlcywgbG9hZGVycywgYW5kIG5hdmlnYXRpb24gY29uZmlndXJhdGlvbi5cbiAgICogVGhlIHJvdXRlciBpcyB1c2VkIGluIGJvdGggc2VydmVyLXNpZGUgcmVuZGVyaW5nIChMYW1iZGEpIGFuZCBjbGllbnQtc2lkZSBoeWRyYXRpb24gKGJyb3dzZXIpLlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBQdXJlbm93Um91dGVyfSBmb3Igcm91dGVyIGNvbmZpZ3VyYXRpb25cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiByb3V0ZXI6IG5ldyBQdXJlbm93Um91dGVyKHtcbiAgICogICByb3V0ZXI6IFtcbiAgICogICAgIHsgcGF0aDogJy8nLCBlbGVtZW50OiA8SG9tZSAvPiB9LFxuICAgKiAgICAgeyBwYXRoOiAnL2Fib3V0JywgZWxlbWVudDogPEFib3V0IC8+IH1cbiAgICogICBdLFxuICAgKiAgIGRlZmF1bHRzOiB7fVxuICAgKiB9KVxuICAgKiBgYGBcbiAgICovXG4gIHJvdXRlcjogUHVyZW5vd1JvdXRlcjtcblxuICAvKipcbiAgICogU2VydmljZSBuYW1lIGlkZW50aWZpZXIgZm9yIHRoZSBhcHBsaWNhdGlvbi5cbiAgICpcbiAgICogVXNlZCBhcyBhIHByZWZpeCBmb3IgYWxsIEFXUyByZXNvdXJjZXMgKExhbWJkYSBmdW5jdGlvbnMsIEFQSSBHYXRld2F5LCBTMyBidWNrZXRzLCBldGMuKS5cbiAgICogTXVzdCBiZSB1bmlxdWUgd2l0aGluIHlvdXIgQVdTIGFjY291bnQgYW5kIHJlZ2lvbi5cbiAgICpcbiAgICogKipWYWxpZGF0aW9uIFJ1bGVzKio6XG4gICAqIC0gTXVzdCBzdGFydCB3aXRoIGEgbGV0dGVyIChhLXosIEEtWilcbiAgICogLSBDYW4gY29udGFpbiBsZXR0ZXJzLCBudW1iZXJzLCBhbmQgaHlwaGVuc1xuICAgKiAtIE1heGltdW0gbGVuZ3RoOiAxMjggY2hhcmFjdGVyc1xuICAgKiAtIFBhdHRlcm46IGAvXlthLXpBLVpdW2EtekEtWjAtOS1dezAsMTI3fSQvYFxuICAgKlxuICAgKiAqKkV4YW1wbGVzKio6XG4gICAqIC0gVmFsaWQ6IGBteS1hcHBgLCBgTXlBcHBgLCBgYXBwMTIzYCwgYG15LWFwcC12MmBcbiAgICogLSBJbnZhbGlkOiBgMTIzYXBwYCAoc3RhcnRzIHdpdGggbnVtYmVyKSwgYG15X2FwcGAgKHVuZGVyc2NvcmUpLCBgbXkgYXBwYCAoc3BhY2UpXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogc2VydmljZU5hbWU6ICdteS1hcHBsaWNhdGlvbidcbiAgICogYGBgXG4gICAqL1xuICBzZXJ2aWNlTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBEZXBsb3ltZW50IHN0YWdlL2Vudmlyb25tZW50LlxuICAgKlxuICAgKiBEZXRlcm1pbmVzIHRoZSBlbnZpcm9ubWVudC1zcGVjaWZpYyBjb25maWd1cmF0aW9uIGFuZCByZXNvdXJjZSBuYW1pbmcuXG4gICAqIFVzZWQgdG8gY3JlYXRlIHNlcGFyYXRlIGluZnJhc3RydWN0dXJlIHN0YWNrcyBmb3IgZGlmZmVyZW50IGVudmlyb25tZW50cy5cbiAgICpcbiAgICogKipWYWx1ZXMqKjpcbiAgICogLSBgZGV2YDogRGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgKGxvY2FsIHRlc3RpbmcsIHJhcGlkIGl0ZXJhdGlvbilcbiAgICogLSBgc3RhZ2luZ2A6IFN0YWdpbmcvcHJlLXByb2R1Y3Rpb24gZW52aXJvbm1lbnQgKFFBLCBpbnRlZ3JhdGlvbiB0ZXN0aW5nKVxuICAgKiAtIGBwcm9kYDogUHJvZHVjdGlvbiBlbnZpcm9ubWVudCAobGl2ZSB1c2VycylcbiAgICpcbiAgICogKipJbXBhY3QqKjpcbiAgICogLSBSZXNvdXJjZSBuYW1pbmc6IGB7c2VydmljZU5hbWV9LXtyZXNvdXJjZX0te3N0YWdlfWBcbiAgICogLSBFbnZpcm9ubWVudCB2YXJpYWJsZXM6IERpZmZlcmVudCBjb25maWdzIHBlciBzdGFnZVxuICAgKiAtIENhY2hlIFRUTDogU2hvcnRlciBpbiBkZXYsIGxvbmdlciBpbiBwcm9kXG4gICAqIC0gTG9nZ2luZzogTW9yZSB2ZXJib3NlIGluIGRldiwgc3RydWN0dXJlZCBpbiBwcm9kXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogc3RhZ2U6ICdkZXYnXG4gICAqIGBgYFxuICAgKi9cbiAgc3RhZ2U6IFN0YWdlO1xuXG4gIC8qKlxuICAgKiBNaWNyb3NlcnZpY2UgcmVnaXN0cnkgKHJ1bnRpbWUtbGV2ZWwgY29uZmlndXJhdGlvbikuXG4gICAqXG4gICAqICoqUmVxdWlyZWQqKjogRGVmaW5lcyBhbGwgbWljcm9zZXJ2aWNlcywgdGhlaXIgREkgY29udGFpbmVycywgYW5kIExhbWJkYSBlbmRwb2ludHMuXG4gICAqICoqVXNlZCBpbiBhbGwgY29udGV4dHMqKjogQnJvd3NlciAoZm9yIHR5cGUgZ2VuZXJhdGlvbiksIExhbWJkYSAoZm9yIERJKSwgQ0RLIChmb3IgaW5mcmFzdHJ1Y3R1cmUpLlxuICAgKiAqKkFyY2hpdGVjdHVyZSoqOiBUaGlzIGlzIHJ1bnRpbWUgY29uZmlndXJhdGlvbiwgc2VwYXJhdGUgZnJvbSBpbmZyYXN0cnVjdHVyZSBjb25jZXJucy5cbiAgICpcbiAgICogRWFjaCBtaWNyb3NlcnZpY2UgZ2V0cyBpdHMgb3duIFB1cmVDb250YWluZXIgaW5zdGFuY2UgYnVpbHQgZnJvbSB0aGUgVGllcyBjbGFzc2VzLlxuICAgKiBMYW1iZGEgZnVuY3Rpb25zIGFyZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgYW5kIHdpcmVkIHdpdGggZGVwZW5kZW5jeSBpbmplY3Rpb24uXG4gICAqXG4gICAqICoqVHlwZSBTYWZldHkqKjogU2VydmljZSBuYW1lcyBhcmUgZGVyaXZlZCBmcm9tIG9iamVjdCBrZXlzLCBlbnN1cmluZyBjb21waWxlLXRpbWUgdmFsaWRhdGlvbi5cbiAgICogKipObyBNYWdpYyBTdHJpbmdzKio6IEFsbCBzZXJ2aWNlIGlkZW50aWZpZXJzIGFyZSB0eXBlLXNhZmUgYW5kIGF1dG8tZ2VuZXJhdGVkLlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBNaWNyb3NlcnZpY2VEZWZpbml0aW9ufSBmb3IgbWljcm9zZXJ2aWNlIHN0cnVjdHVyZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIHJlZ2lzdGVyOiB7XG4gICAqICAgcGF5bWVudHM6IHtcbiAgICogICAgIHRpZXM6IFtQYXltZW50c1RpZXMsIEJpbGxpbmdUaWVzXSxcbiAgICogICAgIGxhbWJkYXM6IFtjaGFyZ2VIYW5kbGVyLCByZWZ1bmRIYW5kbGVyLCB3ZWJob29rSGFuZGxlcl1cbiAgICogICB9LFxuICAgKiAgIHVzZXJzOiB7XG4gICAqICAgICB0aWVzOiBbVXNlcnNUaWVzLCBBdXRoVGllc10sXG4gICAqICAgICBsYW1iZGFzOiBbY3JlYXRlVXNlckhhbmRsZXIsIGdldFVzZXJIYW5kbGVyLCBsb2dpbkhhbmRsZXJdXG4gICAqICAgfVxuICAgKiB9IGFzIGNvbnN0ICAvLyBVc2UgJ2FzIGNvbnN0JyBmb3IgYmV0dGVyIHR5cGUgaW5mZXJlbmNlXG4gICAqIGBgYFxuICAgKi9cbiAgcmVnaXN0ZXI6IFRSZWdpc3RlcjtcblxuICAvKipcbiAgICogSW5mcmFzdHJ1Y3R1cmUgY29uZmlndXJhdGlvbiBmb3IgQ0RLIGRlcGxveW1lbnQuXG4gICAqXG4gICAqICoqT3B0aW9uYWwqKjogT25seSByZXF1aXJlZCB3aGVuIHJ1bm5pbmcgaW4gQ0RLIGNvbnRleHQgKHN5bnRoZXNpemluZyBDbG91ZEZvcm1hdGlvbiB0ZW1wbGF0ZXMpLlxuICAgKiAqKk5vdCB1c2VkKio6IEluIGJyb3dzZXIgYW5kIExhbWJkYSBjb250ZXh0cyAocnVudGltZSBjb25maWd1cmF0aW9uIGlzIGluIHJlZ2lzdGVyKS5cbiAgICogKipQdXJlIGluZnJhc3RydWN0dXJlKio6IENvbnRhaW5zIG9ubHkgQVdTIHJlc291cmNlIGNvbmZpZ3VyYXRpb24sIG5vIGJ1c2luZXNzIGxvZ2ljLlxuICAgKlxuICAgKiBEZWZpbmVzOlxuICAgKiAtIEFXUyBhY2NvdW50IGFuZCByZWdpb25cbiAgICogLSBMYW1iZGEgY29uZmlndXJhdGlvbiAobWVtb3J5LCB0aW1lb3V0LCBWUEMpXG4gICAqIC0gQVBJIEdhdGV3YXkgb3IgTGFtYmRhIFVSTCBtb2RlXG4gICAqIC0gQ3VzdG9tIGRvbWFpbiBjb25maWd1cmF0aW9uXG4gICAqIC0gUmVhY3QgZW50cnkgcG9pbnQgZm9yIFNTUiBMYW1iZGFcbiAgICpcbiAgICogQHNlZSB7QGxpbmsgSW5mcmFPcHRpb25zfSBmb3IgZGV0YWlsZWQgY29uZmlndXJhdGlvbiBvcHRpb25zXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogaW5mcmE6IHtcbiAgICogICBlbnY6IHsgYWNjb3VudDogJzEyMzQ1Njc4OTAxMicsIHJlZ2lvbjogJ3VzLWVhc3QtMScgfSxcbiAgICogICBzdGFnZTogJ2RldicsXG4gICAqICAgcmVhY3RFbnRyeTogJy4vc3JjL2luZGV4LnRzeCcsXG4gICAqICAgYXBpTW9kZTogJ2FwaUdhdGV3YXknLFxuICAgKiAgIGxhbWJkYU1lbW9yeVNpemU6IDEwMjQsXG4gICAqICAgbGFtYmRhVGltZW91dDogMzAsXG4gICAqICAgZG9tYWluOiB7XG4gICAqICAgICByb290RG9tYWluOiAnbXlhcHAuY29tJyxcbiAgICogICAgIHN1YmRvbWFpbjogJ2FwaSdcbiAgICogICB9XG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBpbmZyYT86IEluZnJhT3B0aW9ucztcbn1cblxuLyoqXG4gKiBUeXBlLXNhZmUgUHVyZW5vdyBjb25maWd1cmF0aW9uIHdpdGggaW5mZXJyZWQgc2VydmljZSBuYW1lcy5cbiAqXG4gKiBUaGlzIHR5cGUgcHJvdmlkZXMgUnVudGltZSBDb3JlIHR5cGUgc2FmZXR5IGJ5IGluZmVycmluZyBzZXJ2aWNlIG5hbWVzIGZyb20gdGhlIHJlZ2lzdGVyXG4gKiBjb25maWd1cmF0aW9uLCBlbmFibGluZyBjb21waWxlLXRpbWUgdmFsaWRhdGlvbiBvZiBzZXJ2aWNlIHJlZmVyZW5jZXMuXG4gKlxuICogQHRlbXBsYXRlIFRSZWdpc3RlciAtIFRoZSByZWdpc3RlciBjb25maWd1cmF0aW9uIHR5cGVcbiAqL1xuZXhwb3J0IHR5cGUgVHlwZVNhZmVQdXJlbm93Q29uZmlnPFRSZWdpc3RlciBleHRlbmRzIFJlY29yZDxzdHJpbmcsIE1pY3Jvc2VydmljZURlZmluaXRpb24+PiA9XG4gIFJ1bnRpbWVXZWJDb25maWc8VFJlZ2lzdGVyPiAmIHtcbiAgLyoqXG4gICAqIFR5cGUtc2FmZSBzZXJ2aWNlIG5hbWVzIGRlcml2ZWQgZnJvbSByZWdpc3RlciBrZXlzLlxuICAgKiBBdmFpbGFibGUgYXQgY29tcGlsZS10aW1lIGZvciB0eXBlIGNoZWNraW5nIGFuZCBJREUgYXV0b2NvbXBsZXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgc2VydmljZU5hbWVzPzogU2VydmljZU5hbWVzPFRSZWdpc3Rlcj47XG5cbiAgLyoqXG4gICAqIFR5cGUtc2FmZSBMYW1iZGEgSURzIGRlcml2ZWQgZnJvbSByZWdpc3RlciBjb25maWd1cmF0aW9uLlxuICAgKiBBdmFpbGFibGUgYXQgY29tcGlsZS10aW1lIGZvciB0eXBlIGNoZWNraW5nIGFuZCBJREUgYXV0b2NvbXBsZXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgbGFtYmRhSWRzPzogTGFtYmRhSWRzPFRSZWdpc3Rlcj47XG59O1xuIiwgIi8qXG4gKiBFbGFzdGljIExpY2Vuc2UgMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiB3b3JrdGlmLnB1cmVub3cuY2RrIDx3b3JrdGlmX3B1cmVub3dfY2RrPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBFbGFzdGljIExpY2Vuc2UgMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9saWNlbnNpbmcvZWxhc3RpYy1saWNlbnNlIGZvciBkZXRhaWxzLlxuICpcbiAqIFJlLWxpY2Vuc2luZyBub3RpY2U6XG4gKiAgIFRoaXMgZmlsZSB3YXMgcHJldmlvdXNseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgQnVzaW5lc3MgU291cmNlIExpY2Vuc2UgMS4xIChCVVNMLTEuMSkuXG4gKiAgIEFzIG9mIDIwMjUtMDktMjIsIGl0IGlzIHJlLWxpY2Vuc2VkIHVuZGVyIEVsYXN0aWMgTGljZW5zZSAyLjAuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVsYXN0aWMtMi4wXG4gKi9cblxuaW1wb3J0IHsgcHVyZW5vdywgUHVyZW5vd1JvdXRlLCBwdXJlbm93Um91dGVyLCBQdXJlbm93Um91dGVyRGVmYXVsdHMgfSBmcm9tICdAd29ya3RpZi9wdXJlbm93JztcbmltcG9ydCB7IFJ1bnRpbWVXZWJDb25maWcgfSBmcm9tICdAbGliL3J1bnRpbWUtd2ViL3R5cGVzJztcblxuLyoqXG4gKiBFcnJvciB0aHJvd24gd2hlbiBjb25maWd1cmF0aW9uIHZhbGlkYXRpb24gZmFpbHMuXG4gKiBGb2xsb3dzIHB1cmVub3cgZXJyb3IgcGF0dGVybnMgd2l0aG91dCBlbW9qaS5cbiAqL1xuZXhwb3J0IGNsYXNzIENvbmZpZ1ZhbGlkYXRpb25FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgLyoqIEFycmF5IG9mIHZhbGlkYXRpb24gZXJyb3IgbWVzc2FnZXMgKi9cbiAgcmVhZG9ubHkgZXJyb3JzOiBzdHJpbmdbXTtcblxuICBjb25zdHJ1Y3RvcihlcnJvcnM6IHN0cmluZ1tdKSB7XG4gICAgc3VwZXIoYENvbmZpZ3VyYXRpb24gdmFsaWRhdGlvbiBmYWlsZWQ6XFxuJHtlcnJvcnMubWFwKGUgPT4gYCAgLSAke2V9YCkuam9pbignXFxuJyl9YCk7XG4gICAgdGhpcy5uYW1lID0gJ0NvbmZpZ1ZhbGlkYXRpb25FcnJvcic7XG4gICAgdGhpcy5lcnJvcnMgPSBlcnJvcnM7XG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7XG4gIH1cbn1cblxuLyoqXG4gKiBFcnJvciB0aHJvd24gd2hlbiBlbnZpcm9ubWVudCBkZXRlY3Rpb24gZmFpbHMuXG4gKiBGb2xsb3dzIHB1cmVub3cgZXJyb3IgcGF0dGVybnMgd2l0aG91dCBlbW9qaS5cbiAqL1xuZXhwb3J0IGNsYXNzIEVudmlyb25tZW50RGV0ZWN0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9ICdFbnZpcm9ubWVudERldGVjdGlvbkVycm9yJztcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCB0aGlzLmNvbnN0cnVjdG9yKTtcbiAgfVxufVxuXG4vKipcbiAqIERldGVjdCB0aGUgY3VycmVudCBydW50aW1lIGVudmlyb25tZW50LlxuICogVGhpcyBpcyBhIGxpZ2h0d2VpZ2h0IGRldGVjdGlvbiB0aGF0IHdvcmtzIGluIGFsbCBlbnZpcm9ubWVudHMuXG4gKi9cbmZ1bmN0aW9uIGRldGVjdEVudmlyb25tZW50KCk6ICdicm93c2VyJyB8ICdsYW1iZGEnIHwgJ2Nkaycge1xuICAvLyBCcm93c2VyIGRldGVjdGlvblxuICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gJ2Jyb3dzZXInO1xuICB9XG5cbiAgLy8gTGFtYmRhIGRldGVjdGlvblxuICBpZiAodHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIHByb2Nlc3MuZW52Py5BV1NfTEFNQkRBX0ZVTkNUSU9OX05BTUUpIHtcbiAgICByZXR1cm4gJ2xhbWJkYSc7XG4gIH1cblxuICAvLyBDREsgZGV0ZWN0aW9uXG4gIGlmICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnY/LlBVUkVOT1dfTU9ERSA9PT0gJ2NkaycpIHtcbiAgICAgIHJldHVybiAnY2RrJztcbiAgICB9XG4gICAgaWYgKHByb2Nlc3MuZW52Py5DREtfREVGQVVMVF9BQ0NPVU5UIHx8IHByb2Nlc3MuZW52Py5DREtfREVGQVVMVF9SRUdJT04pIHtcbiAgICAgIHJldHVybiAnY2RrJztcbiAgICB9XG4gICAgaWYgKHByb2Nlc3MuYXJndj8uc29tZShhcmcgPT4gYXJnLmluY2x1ZGVzKCdjZGsnKSB8fCBhcmcuaW5jbHVkZXMoJ3N5bnRoJykpKSB7XG4gICAgICByZXR1cm4gJ2Nkayc7XG4gICAgfVxuICB9XG5cbiAgLy8gRGVmYXVsdCB0byBDREsgZm9yIE5vZGUuanMgZW52aXJvbm1lbnRzIChidWlsZCB0aW1lKVxuICByZXR1cm4gJ2Nkayc7XG59XG5cbi8qKlxuICogVmFsaWRhdGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIGdpdmVuIGVudmlyb25tZW50LlxuICogTGlnaHR3ZWlnaHQgdmFsaWRhdGlvbiB0aGF0IHdvcmtzIGluIGFsbCBlbnZpcm9ubWVudHMuXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlQ29uZmlnKGNvbmZpZzogUnVudGltZVdlYkNvbmZpZywgaXNDREtDb250ZXh0OiBib29sZWFuKTogeyB2YWxpZDogYm9vbGVhbjsgZXJyb3JzOiBzdHJpbmdbXSB9IHtcbiAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIC8vIFNlcnZpY2UgbmFtZSB2YWxpZGF0aW9uXG4gIGlmICghY29uZmlnLnNlcnZpY2VOYW1lIHx8ICEvXlthLXpBLVpdW2EtekEtWjAtOS1dezAsMTI3fSQvLnRlc3QoY29uZmlnLnNlcnZpY2VOYW1lKSkge1xuICAgIGVycm9ycy5wdXNoKCdzZXJ2aWNlTmFtZSBtdXN0IHN0YXJ0IHdpdGggYSBsZXR0ZXIsIGNvbnRhaW4gb25seSBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBhbmQgaHlwaGVucywgYW5kIGJlIG1heCAxMjggY2hhcmFjdGVycycpO1xuICB9XG5cbiAgLy8gU3RhZ2UgdmFsaWRhdGlvblxuICBpZiAoIVsnZGV2JywgJ3N0YWdpbmcnLCAncHJvZCddLmluY2x1ZGVzKGNvbmZpZy5zdGFnZSkpIHtcbiAgICBlcnJvcnMucHVzaCgnc3RhZ2UgbXVzdCBiZSBvbmUgb2Y6IGRldiwgc3RhZ2luZywgcHJvZCcpO1xuICB9XG5cbiAgLy8gSW5mcmEgdmFsaWRhdGlvbiBmb3IgQ0RLIGNvbnRleHRcbiAgaWYgKGlzQ0RLQ29udGV4dCAmJiAhY29uZmlnLmluZnJhKSB7XG4gICAgZXJyb3JzLnB1c2goJ2luZnJhIGNvbmZpZ3VyYXRpb24gaXMgcmVxdWlyZWQgaW4gQ0RLIGNvbnRleHQnKTtcbiAgfVxuXG4gIHJldHVybiB7IHZhbGlkOiBlcnJvcnMubGVuZ3RoID09PSAwLCBlcnJvcnMgfTtcbn1cblxuLyoqXG4gKiBVbmlmaWVkIGVudHJ5IHBvaW50IGZvciBSdW50aW1lIFRhcmdldCBDb3JlLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgYSBzaW5nbGUgQVBJIHRoYXQgd29ya3MgYWNyb3NzIGFsbCBleGVjdXRpb24gY29udGV4dHM6XG4gKiAtICoqQnJvd3NlcioqOiBIeWRyYXRlcyBSZWFjdCBhcHBsaWNhdGlvbiB3aXRoIGNsaWVudC1zaWRlIHJvdXRpbmdcbiAqIC0gKipMYW1iZGEqKjogRXhlY3V0ZXMgc2VydmVyLXNpZGUgcmVuZGVyaW5nIGFuZCBidXNpbmVzcyBsb2dpYyB3aXRoIERJXG4gKiAtICoqQ0RLKio6IFN5bnRoZXNpemVzIENsb3VkRm9ybWF0aW9uIGluZnJhc3RydWN0dXJlIHRlbXBsYXRlc1xuICpcbiAqIFRoZSBmdW5jdGlvbiBhdXRvbWF0aWNhbGx5IGRldGVjdHMgdGhlIHJ1bnRpbWUgZW52aXJvbm1lbnQgYW5kIHJvdXRlc1xuICogZXhlY3V0aW9uIHRvIHRoZSBhcHByb3ByaWF0ZSBwaXBlbGluZSB3aXRob3V0IHVzZXIgaW50ZXJ2ZW50aW9uLlxuICpcbiAqICoqTm90ZSoqOiBGb3IgTGFtYmRhIGFuZCBDREsgY29udGV4dHMsIHVzZSB0aGUgc2VydmVyLXNpZGUgZW50cnkgcG9pbnRcbiAqIGZyb20gYEBjb3JlL3J1bnRpbWUtd2ViYCBpbnN0ZWFkLiBUaGlzIGJyb3dzZXItY29tcGF0aWJsZSB2ZXJzaW9uXG4gKiBvbmx5IHN1cHBvcnRzIGJyb3dzZXIgaHlkcmF0aW9uLlxuICpcbiAqIEBwYXJhbSBjb25maWcgLSBVbmlmaWVkIGNvbmZpZ3VyYXRpb24gZm9yIGFsbCBjb250ZXh0c1xuICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gZXhlY3V0aW9uIGNvbXBsZXRlc1xuICogQHRocm93cyBDb25maWdWYWxpZGF0aW9uRXJyb3IgaWYgY29uZmlndXJhdGlvbiBpcyBpbnZhbGlkXG4gKiBAdGhyb3dzIEVudmlyb25tZW50RGV0ZWN0aW9uRXJyb3IgaWYgZW52aXJvbm1lbnQgY2Fubm90IGJlIGRldGVjdGVkXG4gKiBAdGhyb3dzIEVycm9yIGlmIGV4ZWN1dGlvbiBmYWlsc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBwdXJlbm93IH0gZnJvbSAnQHdvcmt0aWYvcHVyZW5vdy9ydW50aW1lLXdlYic7XG4gKiBpbXBvcnQgeyBQdXJlbm93Um91dGVyIH0gZnJvbSAnQHdvcmt0aWYvcHVyZW5vdyc7XG4gKlxuICogcHVyZW5vdyh7XG4gKiAgIGFwcDogKHsgcm91dGVyIH0pID0+IDxBcHAgcm91dGVyPXtyb3V0ZXJ9IC8+LFxuICogICByb3V0ZXI6IG5ldyBQdXJlbm93Um91dGVyKHsgcm91dGVzLCBkZWZhdWx0czoge30gfSksXG4gKiAgIHNlcnZpY2VOYW1lOiAnbXktYXBwJyxcbiAqICAgc3RhZ2U6ICdkZXYnLFxuICogICByZWdpc3Rlcjoge1xuICogICAgIHBheW1lbnRzOiB7XG4gKiAgICAgICB0aWVzOiBbUGF5bWVudHNUaWVzXSxcbiAqICAgICAgIGxhbWJkYXM6IFtjaGFyZ2VIYW5kbGVyLCByZWZ1bmRIYW5kbGVyXVxuICogICAgIH1cbiAqICAgfSxcbiAqICAgaW5mcmE6IHtcbiAqICAgICBlbnY6IHsgYWNjb3VudDogJzEyMzQ1Njc4OTAxMicsIHJlZ2lvbjogJ3VzLWVhc3QtMScgfSxcbiAqICAgICBzdGFnZTogJ2RldicsXG4gKiAgICAgcmVhY3RFbnRyeTogJy4vc3JjL2luZGV4LnRzeCcsXG4gKiAgICAgYXBpTW9kZTogJ2FwaUdhdGV3YXknXG4gKiAgIH1cbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwdXJld2ViKGNvbmZpZzogUnVudGltZVdlYkNvbmZpZyk6IHZvaWQge1xuICAvLyAxLiBEZXRlY3QgcnVudGltZSBlbnZpcm9ubWVudCB1c2luZyBsaWdodHdlaWdodCBkZXRlY3Rpb25cbiAgY29uc3QgZW52VHlwZSA9IGRldGVjdEVudmlyb25tZW50KCk7XG4gIGNvbnN0IGlzQ0RLQ29udGV4dCA9IGVudlR5cGUgPT09ICdjZGsnO1xuXG4gIC8vIDIuIFZhbGlkYXRlIGNvbmZpZ3VyYXRpb25cbiAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IHZhbGlkYXRlQ29uZmlnKGNvbmZpZywgaXNDREtDb250ZXh0KTtcblxuICBpZiAoIXZhbGlkYXRpb25SZXN1bHQudmFsaWQpIHtcbiAgICB0aHJvdyBuZXcgQ29uZmlnVmFsaWRhdGlvbkVycm9yKHZhbGlkYXRpb25SZXN1bHQuZXJyb3JzKTtcbiAgfVxuXG4gIC8vIDMuIFJvdXRlIHRvIGFwcHJvcHJpYXRlIHBpcGVsaW5lIGJhc2VkIG9uIGVudmlyb25tZW50XG4gIHN3aXRjaCAoZW52VHlwZSkge1xuICAgIGNhc2UgJ2Jyb3dzZXInOiB7XG4gICAgICAvLyBCcm93c2VyIHBpcGVsaW5lIC0gaHlkcmF0ZSBSZWFjdCBhcHBcbiAgICAgIC8vIFRoaXMgaXMgdGhlIG9ubHkgcGF0aCB0aGF0IHJ1bnMgaW4gdGhlIGJyb3dzZXJcbiAgICAgIHB1cmVub3coe1xuICAgICAgICBhcHA6ICh7IHJvdXRlciB9KSA9PiBjb25maWcuYXBwKHsgcm91dGVyIH0pLFxuICAgICAgICByb3V0ZXI6IHB1cmVub3dSb3V0ZXIoe1xuICAgICAgICAgIHJvdXRlcjogY29uZmlnLnJvdXRlci5nZXRSb3V0ZXMoKSBhcyBQdXJlbm93Um91dGVbXSxcbiAgICAgICAgICBkZWZhdWx0czogY29uZmlnLnJvdXRlci5kZWZhdWx0cyBhcyBQdXJlbm93Um91dGVyRGVmYXVsdHMsXG4gICAgICAgIH0pLFxuICAgICAgICBjb25maWc6IHtcbiAgICAgICAgICBzZXJ2aWNlTmFtZTogY29uZmlnLnNlcnZpY2VOYW1lLFxuICAgICAgICAgIHN0YWdlOiBjb25maWcuc3RhZ2UsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGNhc2UgJ2xhbWJkYSc6XG4gICAgY2FzZSAnY2RrJzoge1xuICAgICAgLy8gTGFtYmRhIGFuZCBDREsgcGlwZWxpbmVzIHJlcXVpcmUgc2VydmVyLXNpZGUgY29kZVxuICAgICAgLy8gVGhlc2Ugc2hvdWxkIHVzZSB0aGUgc2VydmVyLXNpZGUgZW50cnkgcG9pbnQgZnJvbSBAY29yZS9ydW50aW1lLXdlYlxuICAgICAgY29uc29sZS5sb2coJ1tSdW50aW1lXSBTZXJ2ZXItc2lkZSBwaXBlbGluZSBkZXRlY3RlZCAoJXMpJywgZW52VHlwZSk7XG4gICAgICBwdXJlbm93KHtcbiAgICAgICAgYXBwOiAoeyByb3V0ZXIgfSkgPT4gY29uZmlnLmFwcCh7IHJvdXRlciB9KSxcbiAgICAgICAgcm91dGVyOiBwdXJlbm93Um91dGVyKHtcbiAgICAgICAgICByb3V0ZXI6IGNvbmZpZy5yb3V0ZXIuZ2V0Um91dGVzKCkgYXMgUHVyZW5vd1JvdXRlW10sXG4gICAgICAgICAgZGVmYXVsdHM6IGNvbmZpZy5yb3V0ZXIuZGVmYXVsdHMgYXMgUHVyZW5vd1JvdXRlckRlZmF1bHRzLFxuICAgICAgICB9KSxcbiAgICAgICAgY29uZmlnOiB7XG4gICAgICAgICAgc2VydmljZU5hbWU6IGNvbmZpZy5zZXJ2aWNlTmFtZSxcbiAgICAgICAgICBzdGFnZTogY29uZmlnLnN0YWdlLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBicmVhaztcbiAgICAgIC8vIGNvbnNvbGUubG9nKCdbUnVudGltZSBXZWJdIExhbWJkYSBydW50aW1lIGRldGVjdGVkLCBza2lwcGluZyBicm93c2VyIHJlbmRlcmluZyBwaXBlbGluZScpO1xuICAgICAgLy8gdGhyb3cgbmV3IEVudmlyb25tZW50RGV0ZWN0aW9uRXJyb3IoXG4gICAgICAvLyAgIGBTZXJ2ZXItc2lkZSBlbnZpcm9ubWVudCBkZXRlY3RlZCAoJHtlbnZUeXBlfSkuIGAgK1xuICAgICAgLy8gICBgVXNlIHRoZSBzZXJ2ZXItc2lkZSBlbnRyeSBwb2ludCBmcm9tICdAY29yZS9ydW50aW1lLXdlYicgZm9yIExhbWJkYSBhbmQgQ0RLIGNvbnRleHRzLmAsXG4gICAgICAvLyApO1xuICAgIH1cblxuICAgIGRlZmF1bHQ6XG4gICAgICBjb25zb2xlLmxvZygnW1J1bnRpbWUgV2ViXSBVbmtub3duIGVudmlyb25tZW50IHR5cGU6ICVzJywgZW52VHlwZSk7XG4gICAgICBicmVhaztcbiAgICAvLyB0aHJvdyBuZXcgRW52aXJvbm1lbnREZXRlY3Rpb25FcnJvcihcbiAgICAvLyAgIGBVbmtub3duIGVudmlyb25tZW50IHR5cGU6ICR7ZW52VHlwZX1gLFxuICAgIC8vICk7XG4gIH1cbn1cblxuLyoqXG4gKiBFeGVjdXRlIHRoZSBicm93c2VyIHBpcGVsaW5lIGZvciBSZWFjdCBoeWRyYXRpb24uXG4gKiBUaGlzIGlzIGJyb3dzZXItc2FmZSBjb2RlIHRoYXQgZG9lc24ndCBpbXBvcnQgZnJvbSBAY29yZS8uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVCcm93c2VyUGlwZWxpbmUoY29uZmlnOiBSdW50aW1lV2ViQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIC8vIEVuc3VyZSB3ZSdyZSBpbiBhIGJyb3dzZXIgZW52aXJvbm1lbnRcbiAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgdGhyb3cgbmV3IEVudmlyb25tZW50RGV0ZWN0aW9uRXJyb3IoJ0Jyb3dzZXIgZW52aXJvbm1lbnQgcmVxdWlyZWQgZm9yIGJyb3dzZXIgcGlwZWxpbmUnKTtcbiAgfVxuXG4gIC8vIEltcG9ydCBSZWFjdCBET00gZm9yIGh5ZHJhdGlvblxuICBjb25zdCB7IGh5ZHJhdGVSb290LCBjcmVhdGVSb290IH0gPSBhd2FpdCBpbXBvcnQoJ3JlYWN0LWRvbS9jbGllbnQnKTtcbiAgY29uc3QgeyBjcmVhdGVCcm93c2VyUm91dGVyIH0gPSBhd2FpdCBpbXBvcnQoJ3JlYWN0LXJvdXRlcicpO1xuICBjb25zdCBSZWFjdCA9IGF3YWl0IGltcG9ydCgncmVhY3QnKTtcblxuICAvLyBHZXQgRE9NIGVsZW1lbnRzXG4gIGNvbnN0IHJvb3RQdXJlbm93ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jvb3QtcHVyZW5vdycpO1xuICBjb25zdCByb290SW50ZXJuYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncm9vdC1pbnRlcm5hbCcpO1xuXG4gIC8vIERldGVybWluZSB3aGljaCByb290IGVsZW1lbnQgdG8gdXNlXG4gIGNvbnN0IHJvb3RFbGVtZW50ID0gcm9vdFB1cmVub3cgfHwgcm9vdEludGVybmFsO1xuXG4gIGlmICghcm9vdEVsZW1lbnQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnW1J1bnRpbWVdIFJvb3QgZWxlbWVudCBub3QgZm91bmQuICcgK1xuICAgICAgJ0Vuc3VyZSB5b3VyIEhUTUwgaW5jbHVkZXMgPGRpdiBpZD1cInJvb3QtcHVyZW5vd1wiPjwvZGl2PiBvciA8ZGl2IGlkPVwicm9vdC1pbnRlcm5hbFwiPjwvZGl2PicsXG4gICAgKTtcbiAgfVxuXG4gIC8vIEdldCByb3V0ZXMgZnJvbSB0aGUgcm91dGVyIC0gdXNlIHJvdXRlcyBwcm9wZXJ0eSBvciBnZXRSb3V0ZXMgbWV0aG9kXG4gIGNvbnN0IHJvdXRlcyA9IGNvbmZpZy5yb3V0ZXIucm91dGVzIHx8IChjb25maWcucm91dGVyIGFzIGFueSkuZ2V0Um91dGVzPy4oKSB8fCBbXTtcblxuICAvLyBDcmVhdGUgYnJvd3NlciByb3V0ZXIgLSBjYXN0IHJvdXRlcyB0byBhbnkgdG8gYXZvaWQgdHlwZSBpc3N1ZXMgd2l0aCBkaWZmZXJlbnQgcmVhY3Qtcm91dGVyIHZlcnNpb25zXG4gIGNvbnN0IGJyb3dzZXJSb3V0ZXIgPSBjcmVhdGVCcm93c2VyUm91dGVyKHJvdXRlcyBhcyBhbnkpO1xuXG4gIC8vIENyZWF0ZSB0aGUgYXBwIGVsZW1lbnQgLSBwYXNzIHRoZSBicm93c2VyIHJvdXRlclxuICBjb25zdCBBcHBFbGVtZW50ID0gY29uZmlnLmFwcCh7IHJvdXRlcjogYnJvd3NlclJvdXRlciBhcyBhbnkgfSk7XG5cbiAgLy8gQ2hlY2sgaWYgd2Ugc2hvdWxkIGh5ZHJhdGUgKFNTUiBIVE1MIGV4aXN0cykgb3IgcmVuZGVyIGZyZXNoXG4gIGlmIChyb290UHVyZW5vdz8uaGFzQ2hpbGROb2RlcygpKSB7XG4gICAgLy8gSHlkcmF0ZSBTU1IgSFRNTFxuICAgIGNvbnNvbGUubG9nKCdbUnVudGltZV0gSHlkcmF0aW5nIFNTUiBIVE1MLi4uJyk7XG4gICAgaHlkcmF0ZVJvb3Qocm9vdEVsZW1lbnQsIFJlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuU3RyaWN0TW9kZSwgbnVsbCwgQXBwRWxlbWVudCkpO1xuICAgIGNvbnNvbGUubG9nKCdbUnVudGltZV0gSHlkcmF0aW9uIGNvbXBsZXRlJyk7XG4gIH0gZWxzZSB7XG4gICAgLy8gRnJlc2ggcmVuZGVyXG4gICAgY29uc29sZS5sb2coJ1tSdW50aW1lXSBDcmVhdGluZyBmcmVzaCBSZWFjdCByb290Li4uJyk7XG4gICAgY29uc3Qgcm9vdCA9IGNyZWF0ZVJvb3Qocm9vdEVsZW1lbnQpO1xuICAgIHJvb3QucmVuZGVyKFJlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuU3RyaWN0TW9kZSwgbnVsbCwgQXBwRWxlbWVudCkpO1xuICAgIGNvbnNvbGUubG9nKCdbUnVudGltZV0gUmVuZGVyIGNvbXBsZXRlJyk7XG4gIH1cbn1cbiIsICIvKlxuICogRWxhc3RpYyBMaWNlbnNlIDIuMFxuICogQ29weXJpZ2h0IChDKSAyMDI1XHUyMDEzcHJlc2VudCBSYW1hbiBNYXJvemF1LCBXb3JrIFRhcmdldCBJbnNpZ2h0IEZ1bmN0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQ29udGFjdDogcmFtYW5Ad29ya3RpZi5jb21cbiAqXG4gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGljZW5zZWQgV29yazogd29ya3RpZi5wdXJlbm93LmNkayA8d29ya3RpZl9wdXJlbm93X2Nkaz4uXG4gKiBVc2Ugb2YgdGhpcyBzb2Z0d2FyZSBpcyBnb3Zlcm5lZCBieSB0aGUgRWxhc3RpYyBMaWNlbnNlIDIuMDsgc2VlIHRoZSBMSUNFTlNFIGZpbGVcbiAqIG9yIGh0dHBzOi8vd3d3LmVsYXN0aWMuY28vbGljZW5zaW5nL2VsYXN0aWMtbGljZW5zZSBmb3IgZGV0YWlscy5cbiAqXG4gKiBSZS1saWNlbnNpbmcgbm90aWNlOlxuICogICBUaGlzIGZpbGUgd2FzIHByZXZpb3VzbHkgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJ1c2luZXNzIFNvdXJjZSBMaWNlbnNlIDEuMSAoQlVTTC0xLjEpLlxuICogICBBcyBvZiAyMDI1LTA5LTIyLCBpdCBpcyByZS1saWNlbnNlZCB1bmRlciBFbGFzdGljIExpY2Vuc2UgMi4wLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFbGFzdGljLTIuMFxuICovXG5cblxuaW1wb3J0IHR5cGUgeyBQdXJlbm93Q29uZmlnIH0gZnJvbSAnQHdvcmt0aWYvcHVyZW5vdyc7XG5cbi8qKlxuICogUnVudGltZS1zcGVjaWZpYyBjb25maWd1cmF0aW9uIHRoYXQgZXh0ZW5kcyBQdXJlbm93Q29uZmlnLlxuICpcbiAqIFRoaXMgaW50ZXJmYWNlIGFkZHMgcnVudGltZSB3b3Jrc3BhY2UgZnVuY3Rpb25hbGl0eSB3aGlsZSBwcmVzZXJ2aW5nXG4gKiBhbGwgZXhpc3RpbmcgcHVyZW5vdyBjb25maWd1cmF0aW9uIG9wdGlvbnMuIFRoZSBydW50aW1lIGNvbmZpZ3VyYXRpb25cbiAqIGlzIG1lcmdlZCB3aXRoIHB1cmVub3cgY29uZmlndXJhdGlvbiByYXRoZXIgdGhhbiByZXBsYWNpbmcgaXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnVudGltZUNvbmZpZyBleHRlbmRzIFB1cmVub3dDb25maWcge1xuICAvKipcbiAgICogUnVudGltZS1zcGVjaWZpYyBjb25maWd1cmF0aW9uIG9wdGlvbnMuXG4gICAqIFRoZXNlIHNldHRpbmdzIGV4dGVuZCBwdXJlbm93IGZ1bmN0aW9uYWxpdHkgd2l0aG91dCByZXBsYWNpbmcgaXQuXG4gICAqL1xuICBydW50aW1lPzoge1xuICAgIC8qKiBFbmFibGUgUnVudGltZSBDb3JlIHN0YWNrIGRlcGxveW1lbnQgKGV4dGVuZHMgcHVyZW5vdydzIHR3by1zdGFjayBhcmNoaXRlY3R1cmUpICovXG4gICAgZW5hYmxlVGhpcmRTdGFjaz86IGJvb2xlYW47XG5cbiAgICAvKiogUnVudGltZSB3ZWIgbW9kZSBjb25maWd1cmF0aW9uICovXG4gICAgcnVudGltZVdlYk1vZGU/OiAnZGV2ZWxvcG1lbnQnIHwgJ3Byb2R1Y3Rpb24nO1xuXG4gICAgLyoqIEFkZGl0aW9uYWwgcnVudGltZSBmZWF0dXJlcyB0byBlbmFibGUgKi9cbiAgICBhZGRpdGlvbmFsRmVhdHVyZXM/OiBzdHJpbmdbXTtcblxuICAgIC8qKiBEZXZlbG9wbWVudCBzZXJ2ZXIgZW5oYW5jZW1lbnRzICovXG4gICAgZGV2U2VydmVyRW5oYW5jZW1lbnRzPzoge1xuICAgICAgLyoqIEVuYWJsZSBob3QgbW9kdWxlIHJlcGxhY2VtZW50ICovXG4gICAgICBob3RSZWxvYWQ/OiBib29sZWFuO1xuICAgICAgLyoqIEVuYWJsZSBkZWJ1ZyBtb2RlIHdpdGggYWRkaXRpb25hbCBsb2dnaW5nICovXG4gICAgICBkZWJ1Z01vZGU/OiBib29sZWFuO1xuICAgICAgLyoqIEVuYWJsZSBwZXJmb3JtYW5jZSBtb25pdG9yaW5nICovXG4gICAgICBwZXJmb3JtYW5jZU1vbml0b3Jpbmc/OiBib29sZWFuO1xuICAgIH07XG5cbiAgICAvKiogQnVpbGQgb3B0aW1pemF0aW9ucyAqL1xuICAgIGJ1aWxkT3B0aW1pemF0aW9ucz86IHtcbiAgICAgIC8qKiBFbmFibGUgYnVuZGxlIGFuYWx5c2lzICovXG4gICAgICBidW5kbGVBbmFseXNpcz86IGJvb2xlYW47XG4gICAgICAvKiogRW5hYmxlIHRyZWUgc2hha2luZyAqL1xuICAgICAgdHJlZXNoYWtpbmc/OiBib29sZWFuO1xuICAgICAgLyoqIEVuYWJsZSBjb2RlIG1pbmlmaWNhdGlvbiAqL1xuICAgICAgY29kZU1pbmlmaWNhdGlvbj86IGJvb2xlYW47XG4gICAgfTtcbiAgfTtcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIG1lcmdpbmcgdXRpbGl0eSB0aGF0IHByZXNlcnZlcyBhbGwgcHVyZW5vdyBzZXR0aW5nc1xuICogd2hpbGUgYWRkaW5nIHJ1bnRpbWUtc3BlY2lmaWMgZXh0ZW5zaW9ucy5cbiAqXG4gKiBAcGFyYW0gcHVyZW5vd0NvbmZpZyAtIEJhc2UgcHVyZW5vdyBjb25maWd1cmF0aW9uXG4gKiBAcGFyYW0gcnVudGltZUNvbmZpZyAtIFJ1bnRpbWUtc3BlY2lmaWMgY29uZmlndXJhdGlvbiB0byBtZXJnZVxuICogQHJldHVybnMgTWVyZ2VkIGNvbmZpZ3VyYXRpb24gd2l0aCBhbGwgcHVyZW5vdyBzZXR0aW5ncyBwcmVzZXJ2ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlUnVudGltZUNvbmZpZyhcbiAgcHVyZW5vd0NvbmZpZzogUHVyZW5vd0NvbmZpZyxcbiAgcnVudGltZUNvbmZpZz86IFBhcnRpYWw8UnVudGltZUNvbmZpZ1sncnVudGltZSddPixcbik6IFJ1bnRpbWVDb25maWcge1xuICByZXR1cm4ge1xuICAgIC4uLnB1cmVub3dDb25maWcsXG4gICAgcnVudGltZToge1xuICAgICAgZW5hYmxlVGhpcmRTdGFjazogZmFsc2UsXG4gICAgICBydW50aW1lV2ViTW9kZTogJ2RldmVsb3BtZW50JyxcbiAgICAgIGFkZGl0aW9uYWxGZWF0dXJlczogW10sXG5cbiAgICAgIC8vIEB0b2RvOiBjcml0aWFsIHRvIGltcHJvdmUgdGhpcyBzb2x1dGlvbi4gT3RoZXJ3aXNlIFx1MjAxMz4gVU5ORUNFU1NBUlkgT1BUSU9OUyBUT1RBTExZXG4gICAgICBkZXZTZXJ2ZXJFbmhhbmNlbWVudHM6IHtcbiAgICAgICAgaG90UmVsb2FkOiB0cnVlLFxuICAgICAgICBkZWJ1Z01vZGU6IGZhbHNlLFxuICAgICAgICBwZXJmb3JtYW5jZU1vbml0b3Jpbmc6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIGJ1aWxkT3B0aW1pemF0aW9uczoge1xuICAgICAgICBidW5kbGVBbmFseXNpczogZmFsc2UsXG4gICAgICAgIHRyZWVzaGFraW5nOiB0cnVlLFxuICAgICAgICBjb2RlTWluaWZpY2F0aW9uOiB0cnVlLFxuICAgICAgfSxcbiAgICAgIC4uLnJ1bnRpbWVDb25maWcsXG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGEgY29uZmlndXJhdGlvbiBpcyBhIFJ1bnRpbWVDb25maWcuXG4gKlxuICogQHBhcmFtIGNvbmZpZyAtIENvbmZpZ3VyYXRpb24gdG8gY2hlY2tcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGNvbmZpZ3VyYXRpb24gaGFzIHJ1bnRpbWUtc3BlY2lmaWMgcHJvcGVydGllc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNSdW50aW1lQ29uZmlnKGNvbmZpZzogYW55KTogY29uZmlnIGlzIFJ1bnRpbWVDb25maWcge1xuICByZXR1cm4gISEoY29uZmlnICYmIHR5cGVvZiBjb25maWcgPT09ICdvYmplY3QnICYmICdydW50aW1lJyBpbiBjb25maWcpO1xufVxuXG4vKipcbiAqIEV4dHJhY3QgcnVudGltZS1zcGVjaWZpYyBjb25maWd1cmF0aW9uIGZyb20gYSBSdW50aW1lQ29uZmlnLlxuICpcbiAqIEBwYXJhbSBjb25maWcgLSBSdW50aW1lQ29uZmlnIHRvIGV4dHJhY3QgZnJvbVxuICogQHJldHVybnMgUnVudGltZS1zcGVjaWZpYyBjb25maWd1cmF0aW9uIG9yIHVuZGVmaW5lZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFJ1bnRpbWVDb25maWcoY29uZmlnOiBSdW50aW1lQ29uZmlnKTogUnVudGltZUNvbmZpZ1sncnVudGltZSddIHtcbiAgcmV0dXJuIGNvbmZpZy5ydW50aW1lO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIFJ1bnRpbWVDb25maWcgZnJvbSBhIGJhc2UgUHVyZW5vd0NvbmZpZyB3aXRoIGRlZmF1bHQgcnVudGltZSBzZXR0aW5ncy5cbiAqXG4gKiBAcGFyYW0gcHVyZW5vd0NvbmZpZyAtIEJhc2UgcHVyZW5vdyBjb25maWd1cmF0aW9uXG4gKiBAcmV0dXJucyBSdW50aW1lQ29uZmlnIHdpdGggZGVmYXVsdCBydW50aW1lIHNldHRpbmdzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSdW50aW1lQ29uZmlnKHB1cmVub3dDb25maWc6IFB1cmVub3dDb25maWcpOiBSdW50aW1lQ29uZmlnIHtcbiAgcmV0dXJuIG1lcmdlUnVudGltZUNvbmZpZyhwdXJlbm93Q29uZmlnKTtcbn1cbiJdLAog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LFFBQVEsSUFBSSwrQ0FBZ0RHLENBQU8sS0FDbkUsV0FBUSxDQUNOLElBQUssQ0FBQyxDQUFFLE9BQUFFLENBQU8sSUFBTUwsRUFBTyxJQUFJLENBQUUsT0FBQUssQ0FBTyxDQUFDLEVBQzFDLFVBQVEsaUJBQWMsQ0FDcEIsT0FBUUwsRUFBTyxPQUFPLFVBQVUsRUFDaEMsU0FBVUEsRUFBTyxPQUFPLFFBQzFCLENBQUMsRUFDRCxPQUFRLENBQ04sWUFBYUEsRUFBTyxZQUNwQixNQUFPQSxFQUFPLEtBQ2hCLENBQ0YsQ0FBQyxFQUNELEtBTUYsQ0FFQSxRQUNFLFFBQVEsSUFBSSw2Q0FBOENHLENBQU8sRUFDakUsS0FJSixDQUNGLENDN0lPLFNBQVNHLEVBQ2RDLEVBQ0FDLEVBQ2UsQ0FDZixNQUFPLENBQ0wsR0FBR0QsRUFDSCxRQUFTLENBQ1AsaUJBQWtCLEdBQ2xCLGVBQWdCLGNBQ2hCLG1CQUFvQixDQUFDLEVBR3JCLHNCQUF1QixDQUNyQixVQUFXLEdBQ1gsVUFBVyxHQUNYLHNCQUF1QixFQUN6QixFQUNBLG1CQUFvQixDQUNsQixlQUFnQixHQUNoQixZQUFhLEdBQ2IsaUJBQWtCLEVBQ3BCLEVBQ0EsR0FBR0MsQ0FDTCxDQUNGLENBQ0YsQ0FRTyxTQUFTQyxFQUFnQkMsRUFBc0MsQ0FDcEUsTUFBTyxDQUFDLEVBQUVBLEdBQVUsT0FBT0EsR0FBVyxVQUFZLFlBQWFBLEVBQ2pFLENBUU8sU0FBU0MsRUFBcUJELEVBQWlELENBQ3BGLE9BQU9BLEVBQU8sT0FDaEIsQ0FRTyxTQUFTRSxFQUFvQkwsRUFBNkMsQ0FDL0UsT0FBT0QsRUFBbUJDLENBQWEsQ0FDekMiLAogICJuYW1lcyI6IFsiaW5kZXhfZXhwb3J0cyIsICJfX2V4cG9ydCIsICJCcm93c2VyUGlwZWxpbmUiLCAiQ29uZmlnVmFsaWRhdGlvbkVycm9yIiwgIkVudmlyb25tZW50RGV0ZWN0aW9uRXJyb3IiLCAiY3JlYXRlUnVudGltZUNvbmZpZyIsICJleHRyYWN0UnVudGltZUNvbmZpZyIsICJpc1J1bnRpbWVDb25maWciLCAiaXNWYWxpZFNlcnZpY2VOYW1lIiwgIm1lcmdlUnVudGltZUNvbmZpZyIsICJwdXJld2ViIiwgIl9fdG9Db21tb25KUyIsICJfX3JlRXhwb3J0IiwgIlJlYWN0IiwgImltcG9ydF9jbGllbnQiLCAiaW1wb3J0X3JlYWN0X3JvdXRlciIsICJCcm93c2VyUGlwZWxpbmUiLCAiY29uZmlnIiwgImNvbnRleHQiLCAiYnJvd3NlclJvdXRlciIsICJhcHBFbGVtZW50IiwgInJvdXRlclByb3ZpZGVyIiwgImVycm9yIiwgInJvdXRlcyIsICJjb250YWluZXIiLCAiYmFzZVVybCIsICJzdGFnZSIsICJpc1ZhbGlkU2VydmljZU5hbWUiLCAic2VydmljZU5hbWUiLCAiaW1wb3J0X3B1cmVub3ciLCAiQ29uZmlnVmFsaWRhdGlvbkVycm9yIiwgImVycm9ycyIsICJFbnZpcm9ubWVudERldGVjdGlvbkVycm9yIiwgIm1lc3NhZ2UiLCAiZGV0ZWN0RW52aXJvbm1lbnQiLCAiYXJnIiwgInZhbGlkYXRlQ29uZmlnIiwgImNvbmZpZyIsICJpc0NES0NvbnRleHQiLCAicHVyZXdlYiIsICJlbnZUeXBlIiwgInZhbGlkYXRpb25SZXN1bHQiLCAicm91dGVyIiwgIm1lcmdlUnVudGltZUNvbmZpZyIsICJwdXJlbm93Q29uZmlnIiwgInJ1bnRpbWVDb25maWciLCAiaXNSdW50aW1lQ29uZmlnIiwgImNvbmZpZyIsICJleHRyYWN0UnVudGltZUNvbmZpZyIsICJjcmVhdGVSdW50aW1lQ29uZmlnIl0KfQo=
1
+ "use strict";var C=Object.create;var u=Object.defineProperty;var x=Object.getOwnPropertyDescriptor;var E=Object.getOwnPropertyNames;var N=Object.getPrototypeOf,k=Object.prototype.hasOwnProperty;var T=(t,r)=>{for(var e in r)u(t,e,{get:r[e],enumerable:!0})},s=(t,r,e,o)=>{if(r&&typeof r=="object"||typeof r=="function")for(let n of E(r))!k.call(t,n)&&n!==e&&u(t,n,{get:()=>r[n],enumerable:!(o=x(r,n))||o.enumerable});return t},c=(t,r,e)=>(s(t,r,"default"),e&&s(e,r,"default")),S=(t,r,e)=>(e=t!=null?C(N(t)):{},s(r||!t||!t.__esModule?u(e,"default",{value:t,enumerable:!0}):e,t)),A=t=>s(u({},"__esModule",{value:!0}),t);var a={};T(a,{BrowserPipeline:()=>p,ConfigValidationError:()=>l,EnvironmentDetectionError:()=>f,createRuntimeConfig:()=>b,extractRuntimeConfig:()=>w,isRuntimeConfig:()=>y,isValidServiceName:()=>v,mergeRuntimeConfig:()=>g,pureweb:()=>D});module.exports=A(a);c(a,require("@worktif/purenow"),module.exports);var d=S(require("react")),R=require("react-dom/client"),m=require("react-router"),p=class{async execute(r,e){try{console.info("Starting browser pipeline execution",{serviceName:r.serviceName,stage:r.stage,url:e.metadata.url,userAgent:e.metadata.userAgent,viewport:e.metadata.viewport});let o=this.createBrowserRouter(r),n=this.createAppElement(r),h=d.createElement(m.RouterProvider,{router:o},n);this.hydrateApplication(h),this.setupHttpClient(r),console.info("Browser pipeline execution completed successfully",{serviceName:r.serviceName,stage:r.stage})}catch(o){throw console.error("Browser pipeline execution failed",{serviceName:r.serviceName,stage:r.stage,error:o instanceof Error?o.message:String(o),stack:o instanceof Error?o.stack:void 0}),o}}createBrowserRouter(r){console.debug("Creating browser router",{routeCount:r.router.getRoutes().length});let e=r.router.getRoutes(),o=(0,m.createBrowserRouter)(e);return console.debug("Browser router created successfully",{routeCount:e.length}),o}createAppElement(r){console.debug("Creating app element from factory");try{let e=r.app({router:r.router});if(!d.isValidElement(e))throw new Error("App factory must return a valid React element");return console.debug("App element created successfully"),e}catch(e){throw console.error("Failed to create app element",{error:e instanceof Error?e.message:String(e)}),new Error(`Failed to create app element: ${e instanceof Error?e.message:String(e)}`)}}hydrateApplication(r){console.debug("Starting React hydration");try{let e=document.getElementById("root");if(!e)throw new Error('Root container element not found. Expected element with id="root"');(0,R.hydrateRoot)(e,r),console.info("React hydration completed successfully")}catch(e){throw console.error("React hydration failed",{error:e instanceof Error?e.message:String(e)}),new Error(`React hydration failed: ${e instanceof Error?e.message:String(e)}`)}}setupHttpClient(r){console.debug("Setting up HTTP client for Lambda endpoints");try{let e=this.getApiBaseUrl(r.stage);typeof window<"u"&&(window.__PURENOW_CONFIG__={serviceName:r.serviceName,stage:r.stage,apiBaseUrl:e}),console.info("HTTP client configured successfully",{baseUrl:e,stage:r.stage})}catch(e){throw console.error("Failed to setup HTTP client",{error:e instanceof Error?e.message:String(e)}),new Error(`Failed to setup HTTP client: ${e instanceof Error?e.message:String(e)}`)}}getApiBaseUrl(r){return`${typeof window<"u"?window.location.origin:""}/api`}};function v(t){return/^[a-zA-Z][a-zA-Z0-9-]{0,127}$/.test(t)}var i=require("@worktif/purenow"),l=class extends Error{constructor(r){super(`Configuration validation failed:
2
+ ${r.map(e=>` - ${e}`).join(`
3
+ `)}`),this.name="ConfigValidationError",this.errors=r,Error.captureStackTrace(this,this.constructor)}},f=class extends Error{constructor(r){super(r),this.name="EnvironmentDetectionError",Error.captureStackTrace(this,this.constructor)}};function P(){return typeof window<"u"?"browser":typeof process<"u"&&process.env?.AWS_LAMBDA_FUNCTION_NAME?"lambda":(typeof process<"u"&&(process.env?.PURENOW_MODE==="cdk"||process.env?.CDK_DEFAULT_ACCOUNT||process.env?.CDK_DEFAULT_REGION||process.argv?.some(t=>t.includes("cdk")||t.includes("synth"))),"cdk")}function M(t,r){let e=[];return(!t.serviceName||!/^[a-zA-Z][a-zA-Z0-9-]{0,127}$/.test(t.serviceName))&&e.push("serviceName must start with a letter, contain only alphanumeric characters and hyphens, and be max 128 characters"),["dev","staging","prod"].includes(t.stage)||e.push("stage must be one of: dev, staging, prod"),r&&!t.infra&&e.push("infra configuration is required in CDK context"),{valid:e.length===0,errors:e}}function D(t){let r=P(),o=M(t,r==="cdk");if(!o.valid)throw new l(o.errors);switch(r){case"browser":{(0,i.purenow)({app:({router:n})=>t.app({router:n}),router:(0,i.purenowRouter)({router:t.router.getRoutes(),defaults:t.router.defaults}),config:{serviceName:t.serviceName,stage:t.stage}});break}case"lambda":case"cdk":{console.log("[Runtime] Server-side pipeline detected (%s)",r),(0,i.purenow)({app:({router:n})=>t.app({router:n}),router:(0,i.purenowRouter)({router:t.router.getRoutes(),defaults:t.router.defaults}),config:{serviceName:t.serviceName,stage:t.stage}});break}default:console.log("[Runtime Web] Unknown environment type: %s",r);break}}function g(t,r){return{...t,runtime:{enableThirdStack:!1,runtimeWebMode:"development",additionalFeatures:[],devServerEnhancements:{hotReload:!0,debugMode:!1,performanceMonitoring:!1},buildOptimizations:{bundleAnalysis:!1,treeshaking:!0,codeMinification:!0},...r}}}function y(t){return!!(t&&typeof t=="object"&&"runtime"in t)}function w(t){return t.runtime}function b(t){return g(t)}0&&(module.exports={BrowserPipeline,ConfigValidationError,EnvironmentDetectionError,createRuntimeConfig,extractRuntimeConfig,isRuntimeConfig,isValidServiceName,mergeRuntimeConfig,pureweb,...require("@worktif/purenow")});
4
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2luZGV4LnRzeCIsICIuLi8uLi8uLi9zcmMvbGliL3J1bnRpbWUtd2ViL3BpcGVsaW5lcy9icm93c2VyLXBpcGVsaW5lLnRzIiwgIi4uLy4uLy4uL3NyYy9saWIvcnVudGltZS13ZWIvdHlwZXMvY29uZmlnLnR5cGVzLnRzIiwgIi4uLy4uLy4uL3NyYy9saWIvcnVudGltZS13ZWIvcHVyZXdlYi50cyIsICIuLi8uLi8uLi9zcmMvbGliL3J1bnRpbWUtd2ViL3J1bnRpbWUuY29uZmlnLnR5cGVzLnRzeCJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IHdvcmt0aWYucHVyZW5vdy5jZGsgPHdvcmt0aWZfcHVyZW5vd19jZGs+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0yMiwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG4vLyBSZS1leHBvcnQgZXZlcnl0aGluZyBmcm9tIHRoZSBiYXNlIFB1cmVub3cgZnJhbWV3b3JrXG5leHBvcnQgKiBmcm9tICdAd29ya3RpZi9wdXJlbm93JztcblxuLy8gRXhwb3J0IHJ1bnRpbWUtd2ViIHNwZWNpZmljIGZ1bmN0aW9uYWxpdHlcbmV4cG9ydCAqIGZyb20gJy4vbGliL3J1bnRpbWUtd2ViJztcblxuLy8gRXhwb3J0IHJ1bnRpbWUgY29uZmlndXJhdGlvbiB0eXBlcyBhbmQgdXRpbGl0aWVzXG4vLyBleHBvcnQgKiBmcm9tICcuL3V0aWxzJztcblxuXG4vLyBSZS1leHBvcnQgcHVyZW5vdyBiaW4gZnVuY3Rpb25hbGl0eVxuLy8gZXhwb3J0ICogZnJvbSAnQHdvcmt0aWYvcHVyZW5vdyc7XG4iLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IHdvcmt0aWYucHVyZW5vdy5jZGsgPHdvcmt0aWZfcHVyZW5vd19jZGs+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0yMiwgaXQgaXMgcmUtbGljZW5zaW5nIHVuZGVyIEVsYXN0aWMgTGljZW5zZSAyLjAuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVsYXN0aWMtMi4wXG4gKi9cblxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgaHlkcmF0ZVJvb3QgfSBmcm9tICdyZWFjdC1kb20vY2xpZW50JztcbmltcG9ydCB7IGNyZWF0ZUJyb3dzZXJSb3V0ZXIsIFJvdXRlclByb3ZpZGVyIH0gZnJvbSAncmVhY3Qtcm91dGVyJztcblxuaW1wb3J0IHR5cGUgeyBCcm93c2VyTWV0YWRhdGEsIFJ1bnRpbWVXZWJDb25maWcgfSBmcm9tICdAbGliL3J1bnRpbWUtd2ViL3R5cGVzJztcblxuLy8gaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnQHdvcmt0aWYvdXRpbHMnO1xuXG4vKipcbiAqIEJyb3dzZXIgZXhlY3V0aW9uIHBpcGVsaW5lIGZvciBSdW50aW1lIFRhcmdldCBDb3JlLlxuICpcbiAqIEB0b2RvOiBvcmRpbmF0ZSB0aGlzIGNsYXNzIHRvIGluZnJhIG9yIGNvcmUgY2F1c2Ugd2UgaGF2ZSBOb2RlLmpzIHJlc3BvbnNpYmlsaXR5XG4gKiAgICAgIC0tLS0gT1IgXHUyMDEzPiBSRU1PVkUgTE9HR0VSXG4gKlxuICogKipBUkNISVRFQ1RVUkUgTk9URSoqOiBUaGlzIGZpbGUgaXMgaW4gYHNyYy9saWIvYCBiZWNhdXNlIGl0OlxuICogLSBVc2VzIGJyb3dzZXItb25seSBBUElzICh3aW5kb3csIGRvY3VtZW50LCBoeWRyYXRlUm9vdClcbiAqIC0gUnVucyBPTkxZIGluIGJyb3dzZXIgZW52aXJvbm1lbnRcbiAqIC0gTXVzdCBiZSBpc29tb3JwaGljLXNhZmUgKG5vIE5vZGUuanMgQVBJcylcbiAqIC0gTkVWRVIgcnVucyBpbiBMYW1iZGFcbiAqXG4gKiBIYW5kbGVzIGNsaWVudC1zaWRlIGh5ZHJhdGlvbiBvZiBSZWFjdCBhcHBsaWNhdGlvbnMgd2l0aCBwcmUtbG9hZGVkIGRhdGFcbiAqIGZyb20gc2VydmVyLXNpZGUgcmVuZGVyaW5nLiBTZXRzIHVwIGNsaWVudC1zaWRlIHJvdXRpbmcgYW5kIEhUVFAgY2xpZW50XG4gKiBmb3IgcG9zdC1oeWRyYXRpb24gQVBJIGNhbGxzIHRvIExhbWJkYSBlbmRwb2ludHMuXG4gKlxuICogKipFeGVjdXRpb24gRmxvdyoqOlxuICogMS4gSHlkcmF0ZSBSZWFjdCBhcHAgd2l0aCBleGlzdGluZyBQdXJlbm93Um91dGVyXG4gKiAyLiBDYWxsIGNvbmZpZy5hcHAoeyByb3V0ZXIgfSkgdG8gZ2V0IFJlYWN0IGVsZW1lbnRcbiAqIDMuIEluaXRpYWxpemUgY2xpZW50LXNpZGUgbmF2aWdhdGlvblxuICogNC4gU2V0IHVwIEhUVFAgY2xpZW50IGZvciBMYW1iZGEgZW5kcG9pbnQgY2FsbHNcbiAqXG4gKiAqKlJlcXVpcmVtZW50cyoqOiBSRVEtMDYsIFJFUS0xMlxuICovXG5leHBvcnQgY2xhc3MgQnJvd3NlclBpcGVsaW5lIHtcbiAgLy8gcHJpdmF0ZSByZWFkb25seSBsb2dnZXIgPSBsb2dnZXIoe1xuICAvLyAgIHNlcnZpY2VOYW1lOiAnQGxpYi9ydW50aW1lLXdlYi9waXBlbGluZXMvYnJvd3Nlci1waXBlbGluZScsXG4gIC8vIH0pO1xuXG4gIC8qKlxuICAgKiBFeGVjdXRlIGJyb3dzZXIgcGlwZWxpbmUgZm9yIGNsaWVudC1zaWRlIGh5ZHJhdGlvbi5cbiAgICpcbiAgICogSHlkcmF0ZXMgdGhlIFJlYWN0IGFwcGxpY2F0aW9uIHdpdGggcHJlLWxvYWRlZCBkYXRhIGZyb20gU1NSIGFuZCBzZXRzIHVwXG4gICAqIGNsaWVudC1zaWRlIHJvdXRpbmcuIFVzZXMgUmVhY3QgaHlkcmF0aW9uIChub3QgcmVuZGVyKSB0byBtYXRjaCB0aGVcbiAgICogc2VydmVyLXJlbmRlcmVkIEhUTUwgZXhhY3RseS5cbiAgICpcbiAgICogQHBhcmFtIGNvbmZpZyAtIFB1cmVub3cgY29uZmlndXJhdGlvbiB3aXRoIGFwcCBmYWN0b3J5IGFuZCByb3V0ZXJcbiAgICogQHBhcmFtIGNvbnRleHQgLSBCcm93c2VyIGVudmlyb25tZW50IGNvbnRleHQgd2l0aCBtZXRhZGF0YVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHBpcGVsaW5lID0gbmV3IEJyb3dzZXJQaXBlbGluZSgpO1xuICAgKiBhd2FpdCBwaXBlbGluZS5leGVjdXRlKGNvbmZpZywge1xuICAgKiAgIHR5cGU6ICdicm93c2VyJyxcbiAgICogICBtZXRhZGF0YToge1xuICAgKiAgICAgdXNlckFnZW50OiBuYXZpZ2F0b3IudXNlckFnZW50LFxuICAgKiAgICAgdXJsOiB3aW5kb3cubG9jYXRpb24uaHJlZixcbiAgICogICAgIHZpZXdwb3J0OiB7IHdpZHRoOiB3aW5kb3cuaW5uZXJXaWR0aCwgaGVpZ2h0OiB3aW5kb3cuaW5uZXJIZWlnaHQgfVxuICAgKiAgIH1cbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZShjb25maWc6IFJ1bnRpbWVXZWJDb25maWcsIGNvbnRleHQ6IHsgdHlwZTogJ2Jyb3dzZXInOyBtZXRhZGF0YTogQnJvd3Nlck1ldGFkYXRhIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc29sZS5pbmZvKCdTdGFydGluZyBicm93c2VyIHBpcGVsaW5lIGV4ZWN1dGlvbicsIHtcbiAgICAgICAgc2VydmljZU5hbWU6IGNvbmZpZy5zZXJ2aWNlTmFtZSxcbiAgICAgICAgc3RhZ2U6IGNvbmZpZy5zdGFnZSxcbiAgICAgICAgdXJsOiBjb250ZXh0Lm1ldGFkYXRhLnVybCxcbiAgICAgICAgdXNlckFnZW50OiBjb250ZXh0Lm1ldGFkYXRhLnVzZXJBZ2VudCxcbiAgICAgICAgdmlld3BvcnQ6IGNvbnRleHQubWV0YWRhdGEudmlld3BvcnQsXG4gICAgICB9KTtcblxuICAgICAgLy8gMS4gQ3JlYXRlIGJyb3dzZXIgcm91dGVyIGZyb20gUHVyZW5vd1JvdXRlclxuICAgICAgY29uc3QgYnJvd3NlclJvdXRlciA9IHRoaXMuY3JlYXRlQnJvd3NlclJvdXRlcihjb25maWcpO1xuXG4gICAgICAvLyAyLiBHZXQgUmVhY3QgZWxlbWVudCBmcm9tIGFwcCBmYWN0b3J5XG4gICAgICBjb25zdCBhcHBFbGVtZW50ID0gdGhpcy5jcmVhdGVBcHBFbGVtZW50KGNvbmZpZyk7XG5cbiAgICAgIC8vIDMuIENyZWF0ZSByb3V0ZXIgcHJvdmlkZXIgd2l0aCB0aGUgYXBwXG4gICAgICBjb25zdCByb3V0ZXJQcm92aWRlciA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoUm91dGVyUHJvdmlkZXIsIHtcbiAgICAgICAgcm91dGVyOiBicm93c2VyUm91dGVyLFxuICAgICAgfSwgYXBwRWxlbWVudCk7XG5cbiAgICAgIC8vIDQuIEh5ZHJhdGUgdGhlIGFwcGxpY2F0aW9uICh1c2UgaHlkcmF0aW9uLCBub3QgcmVuZGVyKVxuICAgICAgdGhpcy5oeWRyYXRlQXBwbGljYXRpb24ocm91dGVyUHJvdmlkZXIpO1xuXG4gICAgICAvLyA1LiBTZXQgdXAgSFRUUCBjbGllbnQgZm9yIHBvc3QtaHlkcmF0aW9uIEFQSSBjYWxsc1xuICAgICAgdGhpcy5zZXR1cEh0dHBDbGllbnQoY29uZmlnKTtcblxuICAgICAgY29uc29sZS5pbmZvKCdCcm93c2VyIHBpcGVsaW5lIGV4ZWN1dGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5Jywge1xuICAgICAgICBzZXJ2aWNlTmFtZTogY29uZmlnLnNlcnZpY2VOYW1lLFxuICAgICAgICBzdGFnZTogY29uZmlnLnN0YWdlLFxuICAgICAgfSk7XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignQnJvd3NlciBwaXBlbGluZSBleGVjdXRpb24gZmFpbGVkJywge1xuICAgICAgICBzZXJ2aWNlTmFtZTogY29uZmlnLnNlcnZpY2VOYW1lLFxuICAgICAgICBzdGFnZTogY29uZmlnLnN0YWdlLFxuICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgICAgICBzdGFjazogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLnN0YWNrIDogdW5kZWZpbmVkLFxuICAgICAgfSk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGJyb3dzZXIgcm91dGVyIGZyb20gUHVyZW5vd1JvdXRlciBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBVc2VzIHRoZSBleGlzdGluZyBQdXJlbm93Um91dGVyIHRvIGdldCByb3V0ZXMgYW5kIGNyZWF0ZXMgYSBSZWFjdCBSb3V0ZXJcbiAgICogYnJvd3NlciByb3V0ZXIgZm9yIGNsaWVudC1zaWRlIG5hdmlnYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBjb25maWcgLSBQdXJlbm93IGNvbmZpZ3VyYXRpb25cbiAgICogQHJldHVybnMgQnJvd3NlciByb3V0ZXIgaW5zdGFuY2VcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlQnJvd3NlclJvdXRlcihjb25maWc6IFJ1bnRpbWVXZWJDb25maWcpIHtcbiAgICBjb25zb2xlLmRlYnVnKCdDcmVhdGluZyBicm93c2VyIHJvdXRlcicsIHtcbiAgICAgIHJvdXRlQ291bnQ6IGNvbmZpZy5yb3V0ZXIuZ2V0Um91dGVzKCkubGVuZ3RoLFxuICAgIH0pO1xuXG4gICAgLy8gR2V0IHJvdXRlcyBmcm9tIFB1cmVub3dSb3V0ZXJcbiAgICBjb25zdCByb3V0ZXMgPSBjb25maWcucm91dGVyLmdldFJvdXRlcygpO1xuXG4gICAgLy8gQ3JlYXRlIGJyb3dzZXIgcm91dGVyIHdpdGggcm91dGVzIChjYXN0IHRvIFJvdXRlT2JqZWN0W10gZm9yIGNvbXBhdGliaWxpdHkpXG4gICAgY29uc3QgYnJvd3NlclJvdXRlciA9IGNyZWF0ZUJyb3dzZXJSb3V0ZXIocm91dGVzIGFzIGFueSk7XG5cbiAgICBjb25zb2xlLmRlYnVnKCdCcm93c2VyIHJvdXRlciBjcmVhdGVkIHN1Y2Nlc3NmdWxseScsIHtcbiAgICAgIHJvdXRlQ291bnQ6IHJvdXRlcy5sZW5ndGgsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gYnJvd3NlclJvdXRlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgUmVhY3QgZWxlbWVudCBmcm9tIGFwcCBmYWN0b3J5IGZ1bmN0aW9uLlxuICAgKlxuICAgKiBDYWxscyB0aGUgdXNlcidzIGFwcCBmYWN0b3J5IGZ1bmN0aW9uIHdpdGggdGhlIHJvdXRlciBkZXBlbmRlbmN5XG4gICAqIHRvIGdldCB0aGUgcm9vdCBSZWFjdCBlbGVtZW50IGZvciB0aGUgYXBwbGljYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBjb25maWcgLSBQdXJlbm93IGNvbmZpZ3VyYXRpb25cbiAgICogQHJldHVybnMgUm9vdCBSZWFjdCBlbGVtZW50XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUFwcEVsZW1lbnQoY29uZmlnOiBSdW50aW1lV2ViQ29uZmlnKTogUmVhY3QuUmVhY3RFbGVtZW50IHtcbiAgICBjb25zb2xlLmRlYnVnKCdDcmVhdGluZyBhcHAgZWxlbWVudCBmcm9tIGZhY3RvcnknKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBDYWxsIGFwcCBmYWN0b3J5IHdpdGggcm91dGVyIGRlcGVuZGVuY3lcbiAgICAgIGNvbnN0IGFwcEVsZW1lbnQgPSBjb25maWcuYXBwKHsgcm91dGVyOiBjb25maWcucm91dGVyIH0pO1xuXG4gICAgICBpZiAoIVJlYWN0LmlzVmFsaWRFbGVtZW50KGFwcEVsZW1lbnQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQXBwIGZhY3RvcnkgbXVzdCByZXR1cm4gYSB2YWxpZCBSZWFjdCBlbGVtZW50Jyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnNvbGUuZGVidWcoJ0FwcCBlbGVtZW50IGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgICByZXR1cm4gYXBwRWxlbWVudDtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gY3JlYXRlIGFwcCBlbGVtZW50Jywge1xuICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgICAgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBjcmVhdGUgYXBwIGVsZW1lbnQ6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIeWRyYXRlIHRoZSBSZWFjdCBhcHBsaWNhdGlvbiBpbiB0aGUgYnJvd3Nlci5cbiAgICpcbiAgICogVXNlcyBSZWFjdCdzIGh5ZHJhdGVSb290IHRvIGh5ZHJhdGUgdGhlIHNlcnZlci1yZW5kZXJlZCBIVE1MIHdpdGhcbiAgICogdGhlIGNsaWVudC1zaWRlIFJlYWN0IGFwcGxpY2F0aW9uLiBUaGlzIGVuc3VyZXMgdGhlIGNsaWVudCBtYXRjaGVzXG4gICAqIHRoZSBzZXJ2ZXIgZXhhY3RseSB0byBhdm9pZCBoeWRyYXRpb24gbWlzbWF0Y2hlcy5cbiAgICpcbiAgICogQHBhcmFtIHJvdXRlclByb3ZpZGVyIC0gUm91dGVyIHByb3ZpZGVyIGVsZW1lbnQgdG8gaHlkcmF0ZVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBoeWRyYXRlQXBwbGljYXRpb24ocm91dGVyUHJvdmlkZXI6IFJlYWN0LlJlYWN0RWxlbWVudCk6IHZvaWQge1xuICAgIGNvbnNvbGUuZGVidWcoJ1N0YXJ0aW5nIFJlYWN0IGh5ZHJhdGlvbicpO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIEdldCB0aGUgcm9vdCBjb250YWluZXIgZWxlbWVudFxuICAgICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jvb3QnKTtcbiAgICAgIGlmICghY29udGFpbmVyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUm9vdCBjb250YWluZXIgZWxlbWVudCBub3QgZm91bmQuIEV4cGVjdGVkIGVsZW1lbnQgd2l0aCBpZD1cInJvb3RcIicpO1xuICAgICAgfVxuXG4gICAgICAvLyBIeWRyYXRlIHRoZSBhcHBsaWNhdGlvbiAobm90IHJlbmRlciAtIG11c3QgbWF0Y2ggc2VydmVyIEhUTUwpXG4gICAgICBoeWRyYXRlUm9vdChjb250YWluZXIsIHJvdXRlclByb3ZpZGVyKTtcblxuICAgICAgY29uc29sZS5pbmZvKCdSZWFjdCBoeWRyYXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseScpO1xuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1JlYWN0IGh5ZHJhdGlvbiBmYWlsZWQnLCB7XG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICB9KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUmVhY3QgaHlkcmF0aW9uIGZhaWxlZDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldCB1cCBIVFRQIGNsaWVudCBmb3IgTGFtYmRhIGVuZHBvaW50IGNhbGxzLlxuICAgKlxuICAgKiBDb25maWd1cmVzIHRoZSBIVFRQIGNsaWVudCBmb3IgbWFraW5nIEFQSSBjYWxscyB0byBMYW1iZGEgZW5kcG9pbnRzXG4gICAqIGFmdGVyIGh5ZHJhdGlvbi4gVGhpcyBpcyB1c2VkIGZvciBwb3N0LWh5ZHJhdGlvbiBpbnRlcmFjdGlvbnMgdGhhdFxuICAgKiByZXF1aXJlIHNlcnZlci1zaWRlIGRhdGEuXG4gICAqXG4gICAqIEBwYXJhbSBjb25maWcgLSBQdXJlbm93IGNvbmZpZ3VyYXRpb25cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgc2V0dXBIdHRwQ2xpZW50KGNvbmZpZzogUnVudGltZVdlYkNvbmZpZyk6IHZvaWQge1xuICAgIGNvbnNvbGUuZGVidWcoJ1NldHRpbmcgdXAgSFRUUCBjbGllbnQgZm9yIExhbWJkYSBlbmRwb2ludHMnKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBTZXQgdXAgYmFzZSBVUkwgZm9yIEFQSSBjYWxscyBiYXNlZCBvbiBzdGFnZVxuICAgICAgY29uc3QgYmFzZVVybCA9IHRoaXMuZ2V0QXBpQmFzZVVybChjb25maWcuc3RhZ2UpO1xuXG4gICAgICAvLyBTdG9yZSBjb25maWd1cmF0aW9uIGdsb2JhbGx5IGZvciB1c2UgYnkgZGF0YSBsb2FkZXJzXG4gICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgKHdpbmRvdyBhcyBhbnkpLl9fUFVSRU5PV19DT05GSUdfXyA9IHtcbiAgICAgICAgICBzZXJ2aWNlTmFtZTogY29uZmlnLnNlcnZpY2VOYW1lLFxuICAgICAgICAgIHN0YWdlOiBjb25maWcuc3RhZ2UsXG4gICAgICAgICAgYXBpQmFzZVVybDogYmFzZVVybCxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY29uc29sZS5pbmZvKCdIVFRQIGNsaWVudCBjb25maWd1cmVkIHN1Y2Nlc3NmdWxseScsIHtcbiAgICAgICAgYmFzZVVybCxcbiAgICAgICAgc3RhZ2U6IGNvbmZpZy5zdGFnZSxcbiAgICAgIH0pO1xuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBzZXR1cCBIVFRQIGNsaWVudCcsIHtcbiAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gc2V0dXAgSFRUUCBjbGllbnQ6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgQVBJIGJhc2UgVVJMIGJhc2VkIG9uIGRlcGxveW1lbnQgc3RhZ2UuXG4gICAqXG4gICAqIERldGVybWluZXMgdGhlIGFwcHJvcHJpYXRlIEFQSSBiYXNlIFVSTCBmb3IgbWFraW5nIEhUVFAgcmVxdWVzdHNcbiAgICogdG8gTGFtYmRhIGVuZHBvaW50cyBiYXNlZCBvbiB0aGUgZGVwbG95bWVudCBzdGFnZS5cbiAgICpcbiAgICogQHBhcmFtIHN0YWdlIC0gRGVwbG95bWVudCBzdGFnZVxuICAgKiBAcmV0dXJucyBBUEkgYmFzZSBVUkxcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgZ2V0QXBpQmFzZVVybChzdGFnZTogJ2RldicgfCAnc3RhZ2luZycgfCAncHJvZCcpOiBzdHJpbmcge1xuICAgIC8vIEluIGJyb3dzZXIgY29udGV4dCwgQVBJIGNhbGxzIGdvIHRocm91Z2ggdGhlIHNhbWUgb3JpZ2luXG4gICAgLy8gVGhlIGFjdHVhbCBBUEkgR2F0ZXdheSBVUkwgaXMgaGFuZGxlZCBieSBDbG91ZEZyb250IHJvdXRpbmdcbiAgICBjb25zdCBvcmlnaW4gPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4gOiAnJztcblxuICAgIC8vIEFQSSBlbmRwb2ludHMgYXJlIHR5cGljYWxseSB1bmRlciAvYXBpIHBhdGhcbiAgICByZXR1cm4gYCR7b3JpZ2lufS9hcGlgO1xuICB9XG59XG4iLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IHdvcmt0aWYucHVyZW5vdy5jZGsgPHdvcmt0aWZfcHVyZW5vd19jZGs+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0yMiwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdHlwZSB7IEluZnJhT3B0aW9ucyB9IGZyb20gJy4vaW5mcmEudHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBNaWNyb3NlcnZpY2VEZWZpbml0aW9uIH0gZnJvbSAnLi9taWNyb3NlcnZpY2UudHlwZXMnO1xuXG4vKipcbiAqIFB1cmVub3dSb3V0ZXIgaW50ZXJmYWNlIGZvciBydW50aW1lLXdlYiBpbnRlZ3JhdGlvbi5cbiAqXG4gKiBEZWZpbmVzIHRoZSBlc3NlbnRpYWwgbWV0aG9kcyBuZWVkZWQgYnkgdGhlIHJ1bnRpbWUtd2ViIHBpcGVsaW5lcy5cbiAqIFRoaXMgaW50ZXJmYWNlIG1hdGNoZXMgdGhlIGFjdHVhbCBQdXJlbm93Um91dGVyIGNsYXNzIGZyb20gQGxpYi9yZWFjdC9wdXJlbm93LnJvdXRlci5cbiAqL1xuaW50ZXJmYWNlIFB1cmVub3dSb3V0ZXIge1xuICAvKipcbiAgICogR2V0IGFsbCByb3V0ZSBvYmplY3RzIGFzIGFuIGFycmF5LlxuICAgKiBVc2VkIGZvciBjcmVhdGluZyBicm93c2VyIHJvdXRlcnMgYW5kIFNTUiBzdGF0aWMgaGFuZGxlcnMuXG4gICAqL1xuICBnZXRSb3V0ZXMoKTogQXJyYXk8e1xuICAgIHBhdGg/OiBzdHJpbmc7XG4gICAgZWxlbWVudD86IHVua25vd247XG4gICAgbG9hZGVyPzogdW5rbm93bjtcbiAgICBjaGlsZHJlbj86IHVua25vd247XG4gICAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcbiAgfT47XG5cbiAgLyoqXG4gICAqIEZpbmQgYSByb3V0ZSBieSBpdHMgSUQuXG4gICAqL1xuICBnZXRSb3V0ZUJ5SWQ/KGlkOiBzdHJpbmcpOiB1bmtub3duO1xuXG4gIC8qKlxuICAgKiBGaW5kIGEgcm91dGUgYnkgaXRzIHBhdGguXG4gICAqL1xuICBnZXRSb3V0ZUJ5UGF0aD8ocGF0aDogc3RyaW5nKTogdW5rbm93bjtcblxuICAvKipcbiAgICogR2V0IHRoZSByb3V0ZXMgYXJyYXkgKGdldHRlcikuXG4gICAqL1xuICByb3V0ZXM/OiBBcnJheTx1bmtub3duPjtcblxuICAvKipcbiAgICogR2V0IHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBkZWZhdWx0cz86IHVua25vd247XG59XG5cbi8qKlxuICogU3RhZ2UgZW52aXJvbm1lbnQgZm9yIGRlcGxveW1lbnQuXG4gKlxuICogLSBgZGV2YDogRGV2ZWxvcG1lbnQgZW52aXJvbm1lbnRcbiAqIC0gYHN0YWdpbmdgOiBTdGFnaW5nL3ByZS1wcm9kdWN0aW9uIGVudmlyb25tZW50XG4gKiAtIGBwcm9kYDogUHJvZHVjdGlvbiBlbnZpcm9ubWVudFxuICovXG5leHBvcnQgdHlwZSBTdGFnZSA9ICdkZXYnIHwgJ3N0YWdpbmcnIHwgJ3Byb2QnO1xuXG4vKipcbiAqIFV0aWxpdHkgdHlwZSB0byBleHRyYWN0IHNlcnZpY2UgbmFtZXMgZnJvbSByZWdpc3RlciBjb25maWd1cmF0aW9uLlxuICpcbiAqIFRoaXMgZW5hYmxlcyBjb21waWxlLXRpbWUgdmFsaWRhdGlvbiBvZiBzZXJ2aWNlIG5hbWVzIGFuZCBwcm92aWRlc1xuICogdHlwZS1zYWZlIGFjY2VzcyB0byBzZXJ2aWNlIGlkZW50aWZpZXJzIHRocm91Z2hvdXQgdGhlIGZyYW1ld29yay5cbiAqXG4gKiBAdGVtcGxhdGUgVCAtIFRoZSByZWdpc3RlciBjb25maWd1cmF0aW9uIG9iamVjdCB0eXBlXG4gKi9cbmV4cG9ydCB0eXBlIFNlcnZpY2VOYW1lczxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgTWljcm9zZXJ2aWNlRGVmaW5pdGlvbj4+ID0ga2V5b2YgVDtcblxuLyoqXG4gKiBVdGlsaXR5IHR5cGUgdG8gZ2VuZXJhdGUgTGFtYmRhIElEcyBmcm9tIHNlcnZpY2UgY29uZmlndXJhdGlvbi5cbiAqXG4gKiBDb21iaW5lcyBzZXJ2aWNlIG5hbWVzIHdpdGggTGFtYmRhIElEcyB0byBjcmVhdGUgZnVsbHkgcXVhbGlmaWVkXG4gKiBMYW1iZGEgaWRlbnRpZmllcnMgZm9yIHR5cGUtc2FmZSBMYW1iZGEgcmVzb2x1dGlvbi5cbiAqXG4gKiBAdGVtcGxhdGUgVCAtIFRoZSByZWdpc3RlciBjb25maWd1cmF0aW9uIG9iamVjdCB0eXBlXG4gKi9cbmV4cG9ydCB0eXBlIExhbWJkYUlkczxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgTWljcm9zZXJ2aWNlRGVmaW5pdGlvbj4+ID0ge1xuICBbSyBpbiBrZXlvZiBUXTogVFtLXVsnbGFtYmRhcyddW251bWJlcl0gZXh0ZW5kcyB7IGlkOiBpbmZlciBJIH1cbiAgICA/IEkgZXh0ZW5kcyBzdHJpbmdcbiAgICAgID8gYCR7SyAmIHN0cmluZ30uJHtJfWBcbiAgICAgIDogbmV2ZXJcbiAgICA6IG5ldmVyO1xufVtrZXlvZiBUXTtcblxuLyoqXG4gKiBUeXBlIGNvbnN0cmFpbnQgZm9yIHZhbGlkIHNlcnZpY2UgbmFtZXMuXG4gKlxuICogRW5zdXJlcyBzZXJ2aWNlIG5hbWVzIGZvbGxvdyB0aGUgdmFsaWRhdGlvbiBwYXR0ZXJuOlxuICogLSBNdXN0IHN0YXJ0IHdpdGggYSBsZXR0ZXIgKGEteiwgQS1aKVxuICogLSBDYW4gY29udGFpbiBsZXR0ZXJzLCBudW1iZXJzLCBhbmQgaHlwaGVuc1xuICogLSBNYXhpbXVtIGxlbmd0aDogMTI4IGNoYXJhY3RlcnNcbiAqXG4gKiBUaGlzIGlzIGEgYnJhbmRlZCB0eXBlIHRoYXQgcHJvdmlkZXMgY29tcGlsZS10aW1lIHZhbGlkYXRpb24uXG4gKi9cbmV4cG9ydCB0eXBlIFZhbGlkU2VydmljZU5hbWUgPSBzdHJpbmcgJiB7IHJlYWRvbmx5IF9fYnJhbmQ6ICdWYWxpZFNlcnZpY2VOYW1lJyB9O1xuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gdmFsaWRhdGUgc2VydmljZSBuYW1lIGZvcm1hdC5cbiAqXG4gKiBAcGFyYW0gc2VydmljZU5hbWUgLSBUaGUgc2VydmljZSBuYW1lIHRvIHZhbGlkYXRlXG4gKiBAcmV0dXJucyBUeXBlIHByZWRpY2F0ZSBpbmRpY2F0aW5nIGlmIHRoZSBzZXJ2aWNlIG5hbWUgaXMgdmFsaWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRTZXJ2aWNlTmFtZShzZXJ2aWNlTmFtZTogc3RyaW5nKTogc2VydmljZU5hbWUgaXMgVmFsaWRTZXJ2aWNlTmFtZSB7XG4gIHJldHVybiAvXlthLXpBLVpdW2EtekEtWjAtOS1dezAsMTI3fSQvLnRlc3Qoc2VydmljZU5hbWUpO1xufVxuXG4vKipcbiAqIE1haW4gY29uZmlndXJhdGlvbiBpbnRlcmZhY2UgZm9yIFJ1bnRpbWUgVGFyZ2V0IENvcmUuXG4gKlxuICogVGhpcyBpbnRlcmZhY2UgcHJvdmlkZXMgYSB1bmlmaWVkIGNvbmZpZ3VyYXRpb24gdGhhdCB3b3JrcyBhY3Jvc3MgYWxsIGV4ZWN1dGlvbiBjb250ZXh0czpcbiAqIC0gQnJvd3NlcjogSHlkcmF0ZXMgUmVhY3QgYXBwbGljYXRpb24gd2l0aCBjbGllbnQtc2lkZSByb3V0aW5nXG4gKiAtIExhbWJkYTogRXhlY3V0ZXMgc2VydmVyLXNpZGUgcmVuZGVyaW5nIGFuZCBidXNpbmVzcyBsb2dpY1xuICogLSBDREs6IFN5bnRoZXNpemVzIENsb3VkRm9ybWF0aW9uIGluZnJhc3RydWN0dXJlXG4gKlxuICogQHRlbXBsYXRlIFRSZWdpc3RlciAtIFRoZSByZWdpc3RlciBjb25maWd1cmF0aW9uIHR5cGUgZm9yIHR5cGUtc2FmZSBzZXJ2aWNlIG5hbWVzXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IHB1cmVub3cgfSBmcm9tICdAd29ya3RpZi9wdXJlbm93L3J1bnRpbWUtd2ViJztcbiAqIGltcG9ydCB7IFB1cmVub3dSb3V0ZXIgfSBmcm9tICdAd29ya3RpZi9wdXJlbm93JztcbiAqXG4gKiBjb25zdCBjb25maWcgPSB7XG4gKiAgIGFwcDogKHsgcm91dGVyIH0pID0+IDxBcHAgcm91dGVyPXtyb3V0ZXJ9IC8+LFxuICogICByb3V0ZXI6IG5ldyBQdXJlbm93Um91dGVyKHsgcm91dGVyOiByb3V0ZXMsIGRlZmF1bHRzOiB7fSB9KSxcbiAqICAgc2VydmljZU5hbWU6ICdteS1hcHAnLFxuICogICBzdGFnZTogJ2RldicsXG4gKiAgIHJlZ2lzdGVyOiB7XG4gKiAgICAgcGF5bWVudHM6IHtcbiAqICAgICAgIHRpZXM6IFtQYXltZW50c1RpZXNdLFxuICogICAgICAgbGFtYmRhczogW2NoYXJnZUhhbmRsZXIsIHJlZnVuZEhhbmRsZXJdXG4gKiAgICAgfSxcbiAqICAgICB1c2Vyczoge1xuICogICAgICAgdGllczogW1VzZXJzVGllc10sXG4gKiAgICAgICBsYW1iZGFzOiBbY3JlYXRlVXNlckhhbmRsZXIsIGdldFVzZXJIYW5kbGVyXVxuICogICAgIH1cbiAqICAgfSBhcyBjb25zdCwgIC8vIFVzZSAnYXMgY29uc3QnIGZvciBiZXR0ZXIgdHlwZSBpbmZlcmVuY2VcbiAqICAgaW5mcmE6IHtcbiAqICAgICBlbnY6IHsgYWNjb3VudDogJzEyMzQ1Njc4OTAxMicsIHJlZ2lvbjogJ3VzLWVhc3QtMScgfSxcbiAqICAgICBzdGFnZTogJ2RldicsXG4gKiAgICAgcmVhY3RFbnRyeTogJy4vc3JjL2luZGV4LnRzeCcsXG4gKiAgICAgYXBpTW9kZTogJ2FwaUdhdGV3YXknXG4gKiAgIH1cbiAqIH0gc2F0aXNmaWVzIFB1cmVub3dDb25maWc7XG4gKlxuICogcHVyZW5vdyhjb25maWcpO1xuICogYGBgXG4gKlxuICogQHRvZG86IGFmdGVyIFJ1bnRpbWVXZWIgcmVwbyB3aWxsIGJlIHJlc29sdmVkLCBSdW50aW1lV2ViQ29uZmlnIE1VU1QgZXh0ZW5kIFB1cmVub3dDb25maWcgQ29yZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJ1bnRpbWVXZWJDb25maWc8VFJlZ2lzdGVyIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgTWljcm9zZXJ2aWNlRGVmaW5pdGlvbj4gPSBSZWNvcmQ8c3RyaW5nLCBNaWNyb3NlcnZpY2VEZWZpbml0aW9uPj4ge1xuICAvKipcbiAgICogUmVhY3QgYXBwbGljYXRpb24gY29tcG9uZW50IGZhY3RvcnkgZnVuY3Rpb24uXG4gICAqXG4gICAqIFJlY2VpdmVzIHRoZSByb3V0ZXIgaW5zdGFuY2UgYXMgYSBkZXBlbmRlbmN5IGFuZCByZXR1cm5zIHRoZSByb290IFJlYWN0IGVsZW1lbnQuXG4gICAqIFRoaXMgcGF0dGVybiBlbmFibGVzIGRlcGVuZGVuY3kgaW5qZWN0aW9uIG9mIHRoZSByb3V0ZXIgaW50byB5b3VyIGFwcGxpY2F0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gZGVwcyAtIERlcGVuZGVuY2llcyBvYmplY3QgY29udGFpbmluZyB0aGUgcm91dGVyXG4gICAqIEBwYXJhbSBkZXBzLnJvdXRlciAtIFB1cmVub3dSb3V0ZXIgaW5zdGFuY2UgZm9yIG5hdmlnYXRpb24gYW5kIHJvdXRpbmdcbiAgICogQHJldHVybnMgUm9vdCBSZWFjdCBlbGVtZW50IChSZWFjdC5SZWFjdEVsZW1lbnQpXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogYXBwOiAoeyByb3V0ZXIgfSkgPT4gPEFwcCByb3V0ZXI9e3JvdXRlcn0gLz5cbiAgICogYGBgXG4gICAqL1xuICBhcHA6IChkZXBzOiB7IHJvdXRlcjogUHVyZW5vd1JvdXRlciB9KSA9PiBSZWFjdC5SZWFjdEVsZW1lbnQ7XG5cbiAgLyoqXG4gICAqIFB1cmVub3dSb3V0ZXIgaW5zdGFuY2UgZm9yIGFwcGxpY2F0aW9uIHJvdXRpbmcuXG4gICAqXG4gICAqIERlZmluZXMgYWxsIHJvdXRlcywgbG9hZGVycywgYW5kIG5hdmlnYXRpb24gY29uZmlndXJhdGlvbi5cbiAgICogVGhlIHJvdXRlciBpcyB1c2VkIGluIGJvdGggc2VydmVyLXNpZGUgcmVuZGVyaW5nIChMYW1iZGEpIGFuZCBjbGllbnQtc2lkZSBoeWRyYXRpb24gKGJyb3dzZXIpLlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBQdXJlbm93Um91dGVyfSBmb3Igcm91dGVyIGNvbmZpZ3VyYXRpb25cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiByb3V0ZXI6IG5ldyBQdXJlbm93Um91dGVyKHtcbiAgICogICByb3V0ZXI6IFtcbiAgICogICAgIHsgcGF0aDogJy8nLCBlbGVtZW50OiA8SG9tZSAvPiB9LFxuICAgKiAgICAgeyBwYXRoOiAnL2Fib3V0JywgZWxlbWVudDogPEFib3V0IC8+IH1cbiAgICogICBdLFxuICAgKiAgIGRlZmF1bHRzOiB7fVxuICAgKiB9KVxuICAgKiBgYGBcbiAgICovXG4gIHJvdXRlcjogUHVyZW5vd1JvdXRlcjtcblxuICAvKipcbiAgICogU2VydmljZSBuYW1lIGlkZW50aWZpZXIgZm9yIHRoZSBhcHBsaWNhdGlvbi5cbiAgICpcbiAgICogVXNlZCBhcyBhIHByZWZpeCBmb3IgYWxsIEFXUyByZXNvdXJjZXMgKExhbWJkYSBmdW5jdGlvbnMsIEFQSSBHYXRld2F5LCBTMyBidWNrZXRzLCBldGMuKS5cbiAgICogTXVzdCBiZSB1bmlxdWUgd2l0aGluIHlvdXIgQVdTIGFjY291bnQgYW5kIHJlZ2lvbi5cbiAgICpcbiAgICogKipWYWxpZGF0aW9uIFJ1bGVzKio6XG4gICAqIC0gTXVzdCBzdGFydCB3aXRoIGEgbGV0dGVyIChhLXosIEEtWilcbiAgICogLSBDYW4gY29udGFpbiBsZXR0ZXJzLCBudW1iZXJzLCBhbmQgaHlwaGVuc1xuICAgKiAtIE1heGltdW0gbGVuZ3RoOiAxMjggY2hhcmFjdGVyc1xuICAgKiAtIFBhdHRlcm46IGAvXlthLXpBLVpdW2EtekEtWjAtOS1dezAsMTI3fSQvYFxuICAgKlxuICAgKiAqKkV4YW1wbGVzKio6XG4gICAqIC0gVmFsaWQ6IGBteS1hcHBgLCBgTXlBcHBgLCBgYXBwMTIzYCwgYG15LWFwcC12MmBcbiAgICogLSBJbnZhbGlkOiBgMTIzYXBwYCAoc3RhcnRzIHdpdGggbnVtYmVyKSwgYG15X2FwcGAgKHVuZGVyc2NvcmUpLCBgbXkgYXBwYCAoc3BhY2UpXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogc2VydmljZU5hbWU6ICdteS1hcHBsaWNhdGlvbidcbiAgICogYGBgXG4gICAqL1xuICBzZXJ2aWNlTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBEZXBsb3ltZW50IHN0YWdlL2Vudmlyb25tZW50LlxuICAgKlxuICAgKiBEZXRlcm1pbmVzIHRoZSBlbnZpcm9ubWVudC1zcGVjaWZpYyBjb25maWd1cmF0aW9uIGFuZCByZXNvdXJjZSBuYW1pbmcuXG4gICAqIFVzZWQgdG8gY3JlYXRlIHNlcGFyYXRlIGluZnJhc3RydWN0dXJlIHN0YWNrcyBmb3IgZGlmZmVyZW50IGVudmlyb25tZW50cy5cbiAgICpcbiAgICogKipWYWx1ZXMqKjpcbiAgICogLSBgZGV2YDogRGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgKGxvY2FsIHRlc3RpbmcsIHJhcGlkIGl0ZXJhdGlvbilcbiAgICogLSBgc3RhZ2luZ2A6IFN0YWdpbmcvcHJlLXByb2R1Y3Rpb24gZW52aXJvbm1lbnQgKFFBLCBpbnRlZ3JhdGlvbiB0ZXN0aW5nKVxuICAgKiAtIGBwcm9kYDogUHJvZHVjdGlvbiBlbnZpcm9ubWVudCAobGl2ZSB1c2VycylcbiAgICpcbiAgICogKipJbXBhY3QqKjpcbiAgICogLSBSZXNvdXJjZSBuYW1pbmc6IGB7c2VydmljZU5hbWV9LXtyZXNvdXJjZX0te3N0YWdlfWBcbiAgICogLSBFbnZpcm9ubWVudCB2YXJpYWJsZXM6IERpZmZlcmVudCBjb25maWdzIHBlciBzdGFnZVxuICAgKiAtIENhY2hlIFRUTDogU2hvcnRlciBpbiBkZXYsIGxvbmdlciBpbiBwcm9kXG4gICAqIC0gTG9nZ2luZzogTW9yZSB2ZXJib3NlIGluIGRldiwgc3RydWN0dXJlZCBpbiBwcm9kXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogc3RhZ2U6ICdkZXYnXG4gICAqIGBgYFxuICAgKi9cbiAgc3RhZ2U6IFN0YWdlO1xuXG4gIC8qKlxuICAgKiBNaWNyb3NlcnZpY2UgcmVnaXN0cnkgKHJ1bnRpbWUtbGV2ZWwgY29uZmlndXJhdGlvbikuXG4gICAqXG4gICAqICoqUmVxdWlyZWQqKjogRGVmaW5lcyBhbGwgbWljcm9zZXJ2aWNlcywgdGhlaXIgREkgY29udGFpbmVycywgYW5kIExhbWJkYSBlbmRwb2ludHMuXG4gICAqICoqVXNlZCBpbiBhbGwgY29udGV4dHMqKjogQnJvd3NlciAoZm9yIHR5cGUgZ2VuZXJhdGlvbiksIExhbWJkYSAoZm9yIERJKSwgQ0RLIChmb3IgaW5mcmFzdHJ1Y3R1cmUpLlxuICAgKiAqKkFyY2hpdGVjdHVyZSoqOiBUaGlzIGlzIHJ1bnRpbWUgY29uZmlndXJhdGlvbiwgc2VwYXJhdGUgZnJvbSBpbmZyYXN0cnVjdHVyZSBjb25jZXJucy5cbiAgICpcbiAgICogRWFjaCBtaWNyb3NlcnZpY2UgZ2V0cyBpdHMgb3duIFB1cmVDb250YWluZXIgaW5zdGFuY2UgYnVpbHQgZnJvbSB0aGUgVGllcyBjbGFzc2VzLlxuICAgKiBMYW1iZGEgZnVuY3Rpb25zIGFyZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgYW5kIHdpcmVkIHdpdGggZGVwZW5kZW5jeSBpbmplY3Rpb24uXG4gICAqXG4gICAqICoqVHlwZSBTYWZldHkqKjogU2VydmljZSBuYW1lcyBhcmUgZGVyaXZlZCBmcm9tIG9iamVjdCBrZXlzLCBlbnN1cmluZyBjb21waWxlLXRpbWUgdmFsaWRhdGlvbi5cbiAgICogKipObyBNYWdpYyBTdHJpbmdzKio6IEFsbCBzZXJ2aWNlIGlkZW50aWZpZXJzIGFyZSB0eXBlLXNhZmUgYW5kIGF1dG8tZ2VuZXJhdGVkLlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBNaWNyb3NlcnZpY2VEZWZpbml0aW9ufSBmb3IgbWljcm9zZXJ2aWNlIHN0cnVjdHVyZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIHJlZ2lzdGVyOiB7XG4gICAqICAgcGF5bWVudHM6IHtcbiAgICogICAgIHRpZXM6IFtQYXltZW50c1RpZXMsIEJpbGxpbmdUaWVzXSxcbiAgICogICAgIGxhbWJkYXM6IFtjaGFyZ2VIYW5kbGVyLCByZWZ1bmRIYW5kbGVyLCB3ZWJob29rSGFuZGxlcl1cbiAgICogICB9LFxuICAgKiAgIHVzZXJzOiB7XG4gICAqICAgICB0aWVzOiBbVXNlcnNUaWVzLCBBdXRoVGllc10sXG4gICAqICAgICBsYW1iZGFzOiBbY3JlYXRlVXNlckhhbmRsZXIsIGdldFVzZXJIYW5kbGVyLCBsb2dpbkhhbmRsZXJdXG4gICAqICAgfVxuICAgKiB9IGFzIGNvbnN0ICAvLyBVc2UgJ2FzIGNvbnN0JyBmb3IgYmV0dGVyIHR5cGUgaW5mZXJlbmNlXG4gICAqIGBgYFxuICAgKi9cbiAgcmVnaXN0ZXI6IFRSZWdpc3RlcjtcblxuICAvKipcbiAgICogSW5mcmFzdHJ1Y3R1cmUgY29uZmlndXJhdGlvbiBmb3IgQ0RLIGRlcGxveW1lbnQuXG4gICAqXG4gICAqICoqT3B0aW9uYWwqKjogT25seSByZXF1aXJlZCB3aGVuIHJ1bm5pbmcgaW4gQ0RLIGNvbnRleHQgKHN5bnRoZXNpemluZyBDbG91ZEZvcm1hdGlvbiB0ZW1wbGF0ZXMpLlxuICAgKiAqKk5vdCB1c2VkKio6IEluIGJyb3dzZXIgYW5kIExhbWJkYSBjb250ZXh0cyAocnVudGltZSBjb25maWd1cmF0aW9uIGlzIGluIHJlZ2lzdGVyKS5cbiAgICogKipQdXJlIGluZnJhc3RydWN0dXJlKio6IENvbnRhaW5zIG9ubHkgQVdTIHJlc291cmNlIGNvbmZpZ3VyYXRpb24sIG5vIGJ1c2luZXNzIGxvZ2ljLlxuICAgKlxuICAgKiBEZWZpbmVzOlxuICAgKiAtIEFXUyBhY2NvdW50IGFuZCByZWdpb25cbiAgICogLSBMYW1iZGEgY29uZmlndXJhdGlvbiAobWVtb3J5LCB0aW1lb3V0LCBWUEMpXG4gICAqIC0gQVBJIEdhdGV3YXkgb3IgTGFtYmRhIFVSTCBtb2RlXG4gICAqIC0gQ3VzdG9tIGRvbWFpbiBjb25maWd1cmF0aW9uXG4gICAqIC0gUmVhY3QgZW50cnkgcG9pbnQgZm9yIFNTUiBMYW1iZGFcbiAgICpcbiAgICogQHNlZSB7QGxpbmsgSW5mcmFPcHRpb25zfSBmb3IgZGV0YWlsZWQgY29uZmlndXJhdGlvbiBvcHRpb25zXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogaW5mcmE6IHtcbiAgICogICBlbnY6IHsgYWNjb3VudDogJzEyMzQ1Njc4OTAxMicsIHJlZ2lvbjogJ3VzLWVhc3QtMScgfSxcbiAgICogICBzdGFnZTogJ2RldicsXG4gICAqICAgcmVhY3RFbnRyeTogJy4vc3JjL2luZGV4LnRzeCcsXG4gICAqICAgYXBpTW9kZTogJ2FwaUdhdGV3YXknLFxuICAgKiAgIGxhbWJkYU1lbW9yeVNpemU6IDEwMjQsXG4gICAqICAgbGFtYmRhVGltZW91dDogMzAsXG4gICAqICAgZG9tYWluOiB7XG4gICAqICAgICByb290RG9tYWluOiAnbXlhcHAuY29tJyxcbiAgICogICAgIHN1YmRvbWFpbjogJ2FwaSdcbiAgICogICB9XG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBpbmZyYT86IEluZnJhT3B0aW9ucztcbn1cblxuLyoqXG4gKiBUeXBlLXNhZmUgUHVyZW5vdyBjb25maWd1cmF0aW9uIHdpdGggaW5mZXJyZWQgc2VydmljZSBuYW1lcy5cbiAqXG4gKiBUaGlzIHR5cGUgcHJvdmlkZXMgUnVudGltZSBDb3JlIHR5cGUgc2FmZXR5IGJ5IGluZmVycmluZyBzZXJ2aWNlIG5hbWVzIGZyb20gdGhlIHJlZ2lzdGVyXG4gKiBjb25maWd1cmF0aW9uLCBlbmFibGluZyBjb21waWxlLXRpbWUgdmFsaWRhdGlvbiBvZiBzZXJ2aWNlIHJlZmVyZW5jZXMuXG4gKlxuICogQHRlbXBsYXRlIFRSZWdpc3RlciAtIFRoZSByZWdpc3RlciBjb25maWd1cmF0aW9uIHR5cGVcbiAqL1xuZXhwb3J0IHR5cGUgVHlwZVNhZmVQdXJlbm93Q29uZmlnPFRSZWdpc3RlciBleHRlbmRzIFJlY29yZDxzdHJpbmcsIE1pY3Jvc2VydmljZURlZmluaXRpb24+PiA9XG4gIFJ1bnRpbWVXZWJDb25maWc8VFJlZ2lzdGVyPiAmIHtcbiAgLyoqXG4gICAqIFR5cGUtc2FmZSBzZXJ2aWNlIG5hbWVzIGRlcml2ZWQgZnJvbSByZWdpc3RlciBrZXlzLlxuICAgKiBBdmFpbGFibGUgYXQgY29tcGlsZS10aW1lIGZvciB0eXBlIGNoZWNraW5nIGFuZCBJREUgYXV0b2NvbXBsZXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgc2VydmljZU5hbWVzPzogU2VydmljZU5hbWVzPFRSZWdpc3Rlcj47XG5cbiAgLyoqXG4gICAqIFR5cGUtc2FmZSBMYW1iZGEgSURzIGRlcml2ZWQgZnJvbSByZWdpc3RlciBjb25maWd1cmF0aW9uLlxuICAgKiBBdmFpbGFibGUgYXQgY29tcGlsZS10aW1lIGZvciB0eXBlIGNoZWNraW5nIGFuZCBJREUgYXV0b2NvbXBsZXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgbGFtYmRhSWRzPzogTGFtYmRhSWRzPFRSZWdpc3Rlcj47XG59O1xuIiwgIi8qXG4gKiBFbGFzdGljIExpY2Vuc2UgMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiB3b3JrdGlmLnB1cmVub3cuY2RrIDx3b3JrdGlmX3B1cmVub3dfY2RrPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBFbGFzdGljIExpY2Vuc2UgMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9saWNlbnNpbmcvZWxhc3RpYy1saWNlbnNlIGZvciBkZXRhaWxzLlxuICpcbiAqIFJlLWxpY2Vuc2luZyBub3RpY2U6XG4gKiAgIFRoaXMgZmlsZSB3YXMgcHJldmlvdXNseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgQnVzaW5lc3MgU291cmNlIExpY2Vuc2UgMS4xIChCVVNMLTEuMSkuXG4gKiAgIEFzIG9mIDIwMjUtMDktMjIsIGl0IGlzIHJlLWxpY2Vuc2VkIHVuZGVyIEVsYXN0aWMgTGljZW5zZSAyLjAuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVsYXN0aWMtMi4wXG4gKi9cblxuaW1wb3J0IHsgcHVyZW5vdywgUHVyZW5vd1JvdXRlLCBwdXJlbm93Um91dGVyLCBQdXJlbm93Um91dGVyRGVmYXVsdHMgfSBmcm9tICdAd29ya3RpZi9wdXJlbm93JztcbmltcG9ydCB7IFJ1bnRpbWVXZWJDb25maWcgfSBmcm9tICdAbGliL3J1bnRpbWUtd2ViL3R5cGVzJztcblxuLyoqXG4gKiBFcnJvciB0aHJvd24gd2hlbiBjb25maWd1cmF0aW9uIHZhbGlkYXRpb24gZmFpbHMuXG4gKiBGb2xsb3dzIHB1cmVub3cgZXJyb3IgcGF0dGVybnMgd2l0aG91dCBlbW9qaS5cbiAqL1xuZXhwb3J0IGNsYXNzIENvbmZpZ1ZhbGlkYXRpb25FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgLyoqIEFycmF5IG9mIHZhbGlkYXRpb24gZXJyb3IgbWVzc2FnZXMgKi9cbiAgcmVhZG9ubHkgZXJyb3JzOiBzdHJpbmdbXTtcblxuICBjb25zdHJ1Y3RvcihlcnJvcnM6IHN0cmluZ1tdKSB7XG4gICAgc3VwZXIoYENvbmZpZ3VyYXRpb24gdmFsaWRhdGlvbiBmYWlsZWQ6XFxuJHtlcnJvcnMubWFwKGUgPT4gYCAgLSAke2V9YCkuam9pbignXFxuJyl9YCk7XG4gICAgdGhpcy5uYW1lID0gJ0NvbmZpZ1ZhbGlkYXRpb25FcnJvcic7XG4gICAgdGhpcy5lcnJvcnMgPSBlcnJvcnM7XG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7XG4gIH1cbn1cblxuLyoqXG4gKiBFcnJvciB0aHJvd24gd2hlbiBlbnZpcm9ubWVudCBkZXRlY3Rpb24gZmFpbHMuXG4gKiBGb2xsb3dzIHB1cmVub3cgZXJyb3IgcGF0dGVybnMgd2l0aG91dCBlbW9qaS5cbiAqL1xuZXhwb3J0IGNsYXNzIEVudmlyb25tZW50RGV0ZWN0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9ICdFbnZpcm9ubWVudERldGVjdGlvbkVycm9yJztcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCB0aGlzLmNvbnN0cnVjdG9yKTtcbiAgfVxufVxuXG4vKipcbiAqIERldGVjdCB0aGUgY3VycmVudCBydW50aW1lIGVudmlyb25tZW50LlxuICogVGhpcyBpcyBhIGxpZ2h0d2VpZ2h0IGRldGVjdGlvbiB0aGF0IHdvcmtzIGluIGFsbCBlbnZpcm9ubWVudHMuXG4gKi9cbmZ1bmN0aW9uIGRldGVjdEVudmlyb25tZW50KCk6ICdicm93c2VyJyB8ICdsYW1iZGEnIHwgJ2Nkaycge1xuICAvLyBCcm93c2VyIGRldGVjdGlvblxuICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gJ2Jyb3dzZXInO1xuICB9XG5cbiAgLy8gTGFtYmRhIGRldGVjdGlvblxuICBpZiAodHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIHByb2Nlc3MuZW52Py5BV1NfTEFNQkRBX0ZVTkNUSU9OX05BTUUpIHtcbiAgICByZXR1cm4gJ2xhbWJkYSc7XG4gIH1cblxuICAvLyBDREsgZGV0ZWN0aW9uXG4gIGlmICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnY/LlBVUkVOT1dfTU9ERSA9PT0gJ2NkaycpIHtcbiAgICAgIHJldHVybiAnY2RrJztcbiAgICB9XG4gICAgaWYgKHByb2Nlc3MuZW52Py5DREtfREVGQVVMVF9BQ0NPVU5UIHx8IHByb2Nlc3MuZW52Py5DREtfREVGQVVMVF9SRUdJT04pIHtcbiAgICAgIHJldHVybiAnY2RrJztcbiAgICB9XG4gICAgaWYgKHByb2Nlc3MuYXJndj8uc29tZShhcmcgPT4gYXJnLmluY2x1ZGVzKCdjZGsnKSB8fCBhcmcuaW5jbHVkZXMoJ3N5bnRoJykpKSB7XG4gICAgICByZXR1cm4gJ2Nkayc7XG4gICAgfVxuICB9XG5cbiAgLy8gRGVmYXVsdCB0byBDREsgZm9yIE5vZGUuanMgZW52aXJvbm1lbnRzIChidWlsZCB0aW1lKVxuICByZXR1cm4gJ2Nkayc7XG59XG5cbi8qKlxuICogVmFsaWRhdGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIGdpdmVuIGVudmlyb25tZW50LlxuICogTGlnaHR3ZWlnaHQgdmFsaWRhdGlvbiB0aGF0IHdvcmtzIGluIGFsbCBlbnZpcm9ubWVudHMuXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlQ29uZmlnKGNvbmZpZzogUnVudGltZVdlYkNvbmZpZywgaXNDREtDb250ZXh0OiBib29sZWFuKTogeyB2YWxpZDogYm9vbGVhbjsgZXJyb3JzOiBzdHJpbmdbXSB9IHtcbiAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIC8vIFNlcnZpY2UgbmFtZSB2YWxpZGF0aW9uXG4gIGlmICghY29uZmlnLnNlcnZpY2VOYW1lIHx8ICEvXlthLXpBLVpdW2EtekEtWjAtOS1dezAsMTI3fSQvLnRlc3QoY29uZmlnLnNlcnZpY2VOYW1lKSkge1xuICAgIGVycm9ycy5wdXNoKCdzZXJ2aWNlTmFtZSBtdXN0IHN0YXJ0IHdpdGggYSBsZXR0ZXIsIGNvbnRhaW4gb25seSBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBhbmQgaHlwaGVucywgYW5kIGJlIG1heCAxMjggY2hhcmFjdGVycycpO1xuICB9XG5cbiAgLy8gU3RhZ2UgdmFsaWRhdGlvblxuICBpZiAoIVsnZGV2JywgJ3N0YWdpbmcnLCAncHJvZCddLmluY2x1ZGVzKGNvbmZpZy5zdGFnZSkpIHtcbiAgICBlcnJvcnMucHVzaCgnc3RhZ2UgbXVzdCBiZSBvbmUgb2Y6IGRldiwgc3RhZ2luZywgcHJvZCcpO1xuICB9XG5cbiAgLy8gSW5mcmEgdmFsaWRhdGlvbiBmb3IgQ0RLIGNvbnRleHRcbiAgaWYgKGlzQ0RLQ29udGV4dCAmJiAhY29uZmlnLmluZnJhKSB7XG4gICAgZXJyb3JzLnB1c2goJ2luZnJhIGNvbmZpZ3VyYXRpb24gaXMgcmVxdWlyZWQgaW4gQ0RLIGNvbnRleHQnKTtcbiAgfVxuXG4gIHJldHVybiB7IHZhbGlkOiBlcnJvcnMubGVuZ3RoID09PSAwLCBlcnJvcnMgfTtcbn1cblxuLyoqXG4gKiBVbmlmaWVkIGVudHJ5IHBvaW50IGZvciBSdW50aW1lIFRhcmdldCBDb3JlLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgYSBzaW5nbGUgQVBJIHRoYXQgd29ya3MgYWNyb3NzIGFsbCBleGVjdXRpb24gY29udGV4dHM6XG4gKiAtICoqQnJvd3NlcioqOiBIeWRyYXRlcyBSZWFjdCBhcHBsaWNhdGlvbiB3aXRoIGNsaWVudC1zaWRlIHJvdXRpbmdcbiAqIC0gKipMYW1iZGEqKjogRXhlY3V0ZXMgc2VydmVyLXNpZGUgcmVuZGVyaW5nIGFuZCBidXNpbmVzcyBsb2dpYyB3aXRoIERJXG4gKiAtICoqQ0RLKio6IFN5bnRoZXNpemVzIENsb3VkRm9ybWF0aW9uIGluZnJhc3RydWN0dXJlIHRlbXBsYXRlc1xuICpcbiAqIFRoZSBmdW5jdGlvbiBhdXRvbWF0aWNhbGx5IGRldGVjdHMgdGhlIHJ1bnRpbWUgZW52aXJvbm1lbnQgYW5kIHJvdXRlc1xuICogZXhlY3V0aW9uIHRvIHRoZSBhcHByb3ByaWF0ZSBwaXBlbGluZSB3aXRob3V0IHVzZXIgaW50ZXJ2ZW50aW9uLlxuICpcbiAqICoqTm90ZSoqOiBGb3IgTGFtYmRhIGFuZCBDREsgY29udGV4dHMsIHVzZSB0aGUgc2VydmVyLXNpZGUgZW50cnkgcG9pbnRcbiAqIGZyb20gYEBjb3JlL3J1bnRpbWUtd2ViYCBpbnN0ZWFkLiBUaGlzIGJyb3dzZXItY29tcGF0aWJsZSB2ZXJzaW9uXG4gKiBvbmx5IHN1cHBvcnRzIGJyb3dzZXIgaHlkcmF0aW9uLlxuICpcbiAqIEBwYXJhbSBjb25maWcgLSBVbmlmaWVkIGNvbmZpZ3VyYXRpb24gZm9yIGFsbCBjb250ZXh0c1xuICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gZXhlY3V0aW9uIGNvbXBsZXRlc1xuICogQHRocm93cyBDb25maWdWYWxpZGF0aW9uRXJyb3IgaWYgY29uZmlndXJhdGlvbiBpcyBpbnZhbGlkXG4gKiBAdGhyb3dzIEVudmlyb25tZW50RGV0ZWN0aW9uRXJyb3IgaWYgZW52aXJvbm1lbnQgY2Fubm90IGJlIGRldGVjdGVkXG4gKiBAdGhyb3dzIEVycm9yIGlmIGV4ZWN1dGlvbiBmYWlsc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBwdXJlbm93IH0gZnJvbSAnQHdvcmt0aWYvcHVyZW5vdy9ydW50aW1lLXdlYic7XG4gKiBpbXBvcnQgeyBQdXJlbm93Um91dGVyIH0gZnJvbSAnQHdvcmt0aWYvcHVyZW5vdyc7XG4gKlxuICogcHVyZW5vdyh7XG4gKiAgIGFwcDogKHsgcm91dGVyIH0pID0+IDxBcHAgcm91dGVyPXtyb3V0ZXJ9IC8+LFxuICogICByb3V0ZXI6IG5ldyBQdXJlbm93Um91dGVyKHsgcm91dGVzLCBkZWZhdWx0czoge30gfSksXG4gKiAgIHNlcnZpY2VOYW1lOiAnbXktYXBwJyxcbiAqICAgc3RhZ2U6ICdkZXYnLFxuICogICByZWdpc3Rlcjoge1xuICogICAgIHBheW1lbnRzOiB7XG4gKiAgICAgICB0aWVzOiBbUGF5bWVudHNUaWVzXSxcbiAqICAgICAgIGxhbWJkYXM6IFtjaGFyZ2VIYW5kbGVyLCByZWZ1bmRIYW5kbGVyXVxuICogICAgIH1cbiAqICAgfSxcbiAqICAgaW5mcmE6IHtcbiAqICAgICBlbnY6IHsgYWNjb3VudDogJzEyMzQ1Njc4OTAxMicsIHJlZ2lvbjogJ3VzLWVhc3QtMScgfSxcbiAqICAgICBzdGFnZTogJ2RldicsXG4gKiAgICAgcmVhY3RFbnRyeTogJy4vc3JjL2luZGV4LnRzeCcsXG4gKiAgICAgYXBpTW9kZTogJ2FwaUdhdGV3YXknXG4gKiAgIH1cbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwdXJld2ViKGNvbmZpZzogUnVudGltZVdlYkNvbmZpZyk6IHZvaWQge1xuICAvLyAxLiBEZXRlY3QgcnVudGltZSBlbnZpcm9ubWVudCB1c2luZyBsaWdodHdlaWdodCBkZXRlY3Rpb25cbiAgY29uc3QgZW52VHlwZSA9IGRldGVjdEVudmlyb25tZW50KCk7XG4gIGNvbnN0IGlzQ0RLQ29udGV4dCA9IGVudlR5cGUgPT09ICdjZGsnO1xuXG4gIC8vIDIuIFZhbGlkYXRlIGNvbmZpZ3VyYXRpb25cbiAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IHZhbGlkYXRlQ29uZmlnKGNvbmZpZywgaXNDREtDb250ZXh0KTtcblxuICBpZiAoIXZhbGlkYXRpb25SZXN1bHQudmFsaWQpIHtcbiAgICB0aHJvdyBuZXcgQ29uZmlnVmFsaWRhdGlvbkVycm9yKHZhbGlkYXRpb25SZXN1bHQuZXJyb3JzKTtcbiAgfVxuXG4gIC8vIDMuIFJvdXRlIHRvIGFwcHJvcHJpYXRlIHBpcGVsaW5lIGJhc2VkIG9uIGVudmlyb25tZW50XG4gIHN3aXRjaCAoZW52VHlwZSkge1xuICAgIGNhc2UgJ2Jyb3dzZXInOiB7XG4gICAgICAvLyBCcm93c2VyIHBpcGVsaW5lIC0gaHlkcmF0ZSBSZWFjdCBhcHBcbiAgICAgIC8vIFRoaXMgaXMgdGhlIG9ubHkgcGF0aCB0aGF0IHJ1bnMgaW4gdGhlIGJyb3dzZXJcbiAgICAgIHB1cmVub3coe1xuICAgICAgICBhcHA6ICh7IHJvdXRlciB9KSA9PiBjb25maWcuYXBwKHsgcm91dGVyIH0pLFxuICAgICAgICByb3V0ZXI6IHB1cmVub3dSb3V0ZXIoe1xuICAgICAgICAgIHJvdXRlcjogY29uZmlnLnJvdXRlci5nZXRSb3V0ZXMoKSBhcyBQdXJlbm93Um91dGVbXSxcbiAgICAgICAgICBkZWZhdWx0czogY29uZmlnLnJvdXRlci5kZWZhdWx0cyBhcyBQdXJlbm93Um91dGVyRGVmYXVsdHMsXG4gICAgICAgIH0pLFxuICAgICAgICBjb25maWc6IHtcbiAgICAgICAgICBzZXJ2aWNlTmFtZTogY29uZmlnLnNlcnZpY2VOYW1lLFxuICAgICAgICAgIHN0YWdlOiBjb25maWcuc3RhZ2UsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGNhc2UgJ2xhbWJkYSc6XG4gICAgY2FzZSAnY2RrJzoge1xuICAgICAgLy8gTGFtYmRhIGFuZCBDREsgcGlwZWxpbmVzIHJlcXVpcmUgc2VydmVyLXNpZGUgY29kZVxuICAgICAgLy8gVGhlc2Ugc2hvdWxkIHVzZSB0aGUgc2VydmVyLXNpZGUgZW50cnkgcG9pbnQgZnJvbSBAY29yZS9ydW50aW1lLXdlYlxuICAgICAgY29uc29sZS5sb2coJ1tSdW50aW1lXSBTZXJ2ZXItc2lkZSBwaXBlbGluZSBkZXRlY3RlZCAoJXMpJywgZW52VHlwZSk7XG4gICAgICBwdXJlbm93KHtcbiAgICAgICAgYXBwOiAoeyByb3V0ZXIgfSkgPT4gY29uZmlnLmFwcCh7IHJvdXRlciB9KSxcbiAgICAgICAgcm91dGVyOiBwdXJlbm93Um91dGVyKHtcbiAgICAgICAgICByb3V0ZXI6IGNvbmZpZy5yb3V0ZXIuZ2V0Um91dGVzKCkgYXMgUHVyZW5vd1JvdXRlW10sXG4gICAgICAgICAgZGVmYXVsdHM6IGNvbmZpZy5yb3V0ZXIuZGVmYXVsdHMgYXMgUHVyZW5vd1JvdXRlckRlZmF1bHRzLFxuICAgICAgICB9KSxcbiAgICAgICAgY29uZmlnOiB7XG4gICAgICAgICAgc2VydmljZU5hbWU6IGNvbmZpZy5zZXJ2aWNlTmFtZSxcbiAgICAgICAgICBzdGFnZTogY29uZmlnLnN0YWdlLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBicmVhaztcbiAgICAgIC8vIGNvbnNvbGUubG9nKCdbUnVudGltZSBXZWJdIExhbWJkYSBydW50aW1lIGRldGVjdGVkLCBza2lwcGluZyBicm93c2VyIHJlbmRlcmluZyBwaXBlbGluZScpO1xuICAgICAgLy8gdGhyb3cgbmV3IEVudmlyb25tZW50RGV0ZWN0aW9uRXJyb3IoXG4gICAgICAvLyAgIGBTZXJ2ZXItc2lkZSBlbnZpcm9ubWVudCBkZXRlY3RlZCAoJHtlbnZUeXBlfSkuIGAgK1xuICAgICAgLy8gICBgVXNlIHRoZSBzZXJ2ZXItc2lkZSBlbnRyeSBwb2ludCBmcm9tICdAY29yZS9ydW50aW1lLXdlYicgZm9yIExhbWJkYSBhbmQgQ0RLIGNvbnRleHRzLmAsXG4gICAgICAvLyApO1xuICAgIH1cblxuICAgIGRlZmF1bHQ6XG4gICAgICBjb25zb2xlLmxvZygnW1J1bnRpbWUgV2ViXSBVbmtub3duIGVudmlyb25tZW50IHR5cGU6ICVzJywgZW52VHlwZSk7XG4gICAgICBicmVhaztcbiAgICAvLyB0aHJvdyBuZXcgRW52aXJvbm1lbnREZXRlY3Rpb25FcnJvcihcbiAgICAvLyAgIGBVbmtub3duIGVudmlyb25tZW50IHR5cGU6ICR7ZW52VHlwZX1gLFxuICAgIC8vICk7XG4gIH1cbn1cblxuXG4iLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IHdvcmt0aWYucHVyZW5vdy5jZGsgPHdvcmt0aWZfcHVyZW5vd19jZGs+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0yMiwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG5cbmltcG9ydCB0eXBlIHsgUHVyZW5vd0NvbmZpZyB9IGZyb20gJ0B3b3JrdGlmL3B1cmVub3cnO1xuXG4vKipcbiAqIFJ1bnRpbWUtc3BlY2lmaWMgY29uZmlndXJhdGlvbiB0aGF0IGV4dGVuZHMgUHVyZW5vd0NvbmZpZy5cbiAqXG4gKiBUaGlzIGludGVyZmFjZSBhZGRzIHJ1bnRpbWUgd29ya3NwYWNlIGZ1bmN0aW9uYWxpdHkgd2hpbGUgcHJlc2VydmluZ1xuICogYWxsIGV4aXN0aW5nIHB1cmVub3cgY29uZmlndXJhdGlvbiBvcHRpb25zLiBUaGUgcnVudGltZSBjb25maWd1cmF0aW9uXG4gKiBpcyBtZXJnZWQgd2l0aCBwdXJlbm93IGNvbmZpZ3VyYXRpb24gcmF0aGVyIHRoYW4gcmVwbGFjaW5nIGl0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJ1bnRpbWVDb25maWcgZXh0ZW5kcyBQdXJlbm93Q29uZmlnIHtcbiAgLyoqXG4gICAqIFJ1bnRpbWUtc3BlY2lmaWMgY29uZmlndXJhdGlvbiBvcHRpb25zLlxuICAgKiBUaGVzZSBzZXR0aW5ncyBleHRlbmQgcHVyZW5vdyBmdW5jdGlvbmFsaXR5IHdpdGhvdXQgcmVwbGFjaW5nIGl0LlxuICAgKi9cbiAgcnVudGltZT86IHtcbiAgICAvKiogRW5hYmxlIFJ1bnRpbWUgQ29yZSBzdGFjayBkZXBsb3ltZW50IChleHRlbmRzIHB1cmVub3cncyB0d28tc3RhY2sgYXJjaGl0ZWN0dXJlKSAqL1xuICAgIGVuYWJsZVRoaXJkU3RhY2s/OiBib29sZWFuO1xuXG4gICAgLyoqIFJ1bnRpbWUgd2ViIG1vZGUgY29uZmlndXJhdGlvbiAqL1xuICAgIHJ1bnRpbWVXZWJNb2RlPzogJ2RldmVsb3BtZW50JyB8ICdwcm9kdWN0aW9uJztcblxuICAgIC8qKiBBZGRpdGlvbmFsIHJ1bnRpbWUgZmVhdHVyZXMgdG8gZW5hYmxlICovXG4gICAgYWRkaXRpb25hbEZlYXR1cmVzPzogc3RyaW5nW107XG5cbiAgICAvKiogRGV2ZWxvcG1lbnQgc2VydmVyIGVuaGFuY2VtZW50cyAqL1xuICAgIGRldlNlcnZlckVuaGFuY2VtZW50cz86IHtcbiAgICAgIC8qKiBFbmFibGUgaG90IG1vZHVsZSByZXBsYWNlbWVudCAqL1xuICAgICAgaG90UmVsb2FkPzogYm9vbGVhbjtcbiAgICAgIC8qKiBFbmFibGUgZGVidWcgbW9kZSB3aXRoIGFkZGl0aW9uYWwgbG9nZ2luZyAqL1xuICAgICAgZGVidWdNb2RlPzogYm9vbGVhbjtcbiAgICAgIC8qKiBFbmFibGUgcGVyZm9ybWFuY2UgbW9uaXRvcmluZyAqL1xuICAgICAgcGVyZm9ybWFuY2VNb25pdG9yaW5nPzogYm9vbGVhbjtcbiAgICB9O1xuXG4gICAgLyoqIEJ1aWxkIG9wdGltaXphdGlvbnMgKi9cbiAgICBidWlsZE9wdGltaXphdGlvbnM/OiB7XG4gICAgICAvKiogRW5hYmxlIGJ1bmRsZSBhbmFseXNpcyAqL1xuICAgICAgYnVuZGxlQW5hbHlzaXM/OiBib29sZWFuO1xuICAgICAgLyoqIEVuYWJsZSB0cmVlIHNoYWtpbmcgKi9cbiAgICAgIHRyZWVzaGFraW5nPzogYm9vbGVhbjtcbiAgICAgIC8qKiBFbmFibGUgY29kZSBtaW5pZmljYXRpb24gKi9cbiAgICAgIGNvZGVNaW5pZmljYXRpb24/OiBib29sZWFuO1xuICAgIH07XG4gIH07XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBtZXJnaW5nIHV0aWxpdHkgdGhhdCBwcmVzZXJ2ZXMgYWxsIHB1cmVub3cgc2V0dGluZ3NcbiAqIHdoaWxlIGFkZGluZyBydW50aW1lLXNwZWNpZmljIGV4dGVuc2lvbnMuXG4gKlxuICogQHBhcmFtIHB1cmVub3dDb25maWcgLSBCYXNlIHB1cmVub3cgY29uZmlndXJhdGlvblxuICogQHBhcmFtIHJ1bnRpbWVDb25maWcgLSBSdW50aW1lLXNwZWNpZmljIGNvbmZpZ3VyYXRpb24gdG8gbWVyZ2VcbiAqIEByZXR1cm5zIE1lcmdlZCBjb25maWd1cmF0aW9uIHdpdGggYWxsIHB1cmVub3cgc2V0dGluZ3MgcHJlc2VydmVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZVJ1bnRpbWVDb25maWcoXG4gIHB1cmVub3dDb25maWc6IFB1cmVub3dDb25maWcsXG4gIHJ1bnRpbWVDb25maWc/OiBQYXJ0aWFsPFJ1bnRpbWVDb25maWdbJ3J1bnRpbWUnXT4sXG4pOiBSdW50aW1lQ29uZmlnIHtcbiAgcmV0dXJuIHtcbiAgICAuLi5wdXJlbm93Q29uZmlnLFxuICAgIHJ1bnRpbWU6IHtcbiAgICAgIGVuYWJsZVRoaXJkU3RhY2s6IGZhbHNlLFxuICAgICAgcnVudGltZVdlYk1vZGU6ICdkZXZlbG9wbWVudCcsXG4gICAgICBhZGRpdGlvbmFsRmVhdHVyZXM6IFtdLFxuXG4gICAgICAvLyBAdG9kbzogY3JpdGlhbCB0byBpbXByb3ZlIHRoaXMgc29sdXRpb24uIE90aGVyd2lzZSBcdTIwMTM+IFVOTkVDRVNTQVJZIE9QVElPTlMgVE9UQUxMWVxuICAgICAgZGV2U2VydmVyRW5oYW5jZW1lbnRzOiB7XG4gICAgICAgIGhvdFJlbG9hZDogdHJ1ZSxcbiAgICAgICAgZGVidWdNb2RlOiBmYWxzZSxcbiAgICAgICAgcGVyZm9ybWFuY2VNb25pdG9yaW5nOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICBidWlsZE9wdGltaXphdGlvbnM6IHtcbiAgICAgICAgYnVuZGxlQW5hbHlzaXM6IGZhbHNlLFxuICAgICAgICB0cmVlc2hha2luZzogdHJ1ZSxcbiAgICAgICAgY29kZU1pbmlmaWNhdGlvbjogdHJ1ZSxcbiAgICAgIH0sXG4gICAgICAuLi5ydW50aW1lQ29uZmlnLFxuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogVHlwZSBndWFyZCB0byBjaGVjayBpZiBhIGNvbmZpZ3VyYXRpb24gaXMgYSBSdW50aW1lQ29uZmlnLlxuICpcbiAqIEBwYXJhbSBjb25maWcgLSBDb25maWd1cmF0aW9uIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBjb25maWd1cmF0aW9uIGhhcyBydW50aW1lLXNwZWNpZmljIHByb3BlcnRpZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUnVudGltZUNvbmZpZyhjb25maWc6IGFueSk6IGNvbmZpZyBpcyBSdW50aW1lQ29uZmlnIHtcbiAgcmV0dXJuICEhKGNvbmZpZyAmJiB0eXBlb2YgY29uZmlnID09PSAnb2JqZWN0JyAmJiAncnVudGltZScgaW4gY29uZmlnKTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0IHJ1bnRpbWUtc3BlY2lmaWMgY29uZmlndXJhdGlvbiBmcm9tIGEgUnVudGltZUNvbmZpZy5cbiAqXG4gKiBAcGFyYW0gY29uZmlnIC0gUnVudGltZUNvbmZpZyB0byBleHRyYWN0IGZyb21cbiAqIEByZXR1cm5zIFJ1bnRpbWUtc3BlY2lmaWMgY29uZmlndXJhdGlvbiBvciB1bmRlZmluZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RSdW50aW1lQ29uZmlnKGNvbmZpZzogUnVudGltZUNvbmZpZyk6IFJ1bnRpbWVDb25maWdbJ3J1bnRpbWUnXSB7XG4gIHJldHVybiBjb25maWcucnVudGltZTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBSdW50aW1lQ29uZmlnIGZyb20gYSBiYXNlIFB1cmVub3dDb25maWcgd2l0aCBkZWZhdWx0IHJ1bnRpbWUgc2V0dGluZ3MuXG4gKlxuICogQHBhcmFtIHB1cmVub3dDb25maWcgLSBCYXNlIHB1cmVub3cgY29uZmlndXJhdGlvblxuICogQHJldHVybnMgUnVudGltZUNvbmZpZyB3aXRoIGRlZmF1bHQgcnVudGltZSBzZXR0aW5nc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUnVudGltZUNvbmZpZyhwdXJlbm93Q29uZmlnOiBQdXJlbm93Q29uZmlnKTogUnVudGltZUNvbmZpZyB7XG4gIHJldHVybiBtZXJnZVJ1bnRpbWVDb25maWcocHVyZW5vd0NvbmZpZyk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAid21CQUFBLElBQUFBLEVBQUEsR0FBQUMsRUFBQUQsRUFBQSxxQkFBQUUsRUFBQSwwQkFBQUMsRUFBQSw4QkFBQUMsRUFBQSx3QkFBQUMsRUFBQSx5QkFBQUMsRUFBQSxvQkFBQUMsRUFBQSx1QkFBQUMsRUFBQSx1QkFBQUMsRUFBQSxZQUFBQyxJQUFBLGVBQUFDLEVBQUFYLEdBaUJBWSxFQUFBWixFQUFjLDRCQWpCZCxnQkNnQkEsSUFBQWEsRUFBdUIsb0JBQ3ZCQyxFQUE0Qiw0QkFDNUJDLEVBQW9ELHdCQThCdkNDLEVBQU4sS0FBc0IsQ0E0QjNCLE1BQU0sUUFBUUMsRUFBMEJDLEVBQXdFLENBQzlHLEdBQUksQ0FDRixRQUFRLEtBQUss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QUNBQyxFQUNlLENBQ2YsTUFBTyxDQUNMLEdBQUdELEVBQ0gsUUFBUyxDQUNQLGlCQUFrQixHQUNsQixlQUFnQixjQUNoQixtQkFBb0IsQ0FBQyxFQUdyQixzQkFBdUIsQ0FDckIsVUFBVyxHQUNYLFVBQVcsR0FDWCxzQkFBdUIsRUFDekIsRUFDQSxtQkFBb0IsQ0FDbEIsZUFBZ0IsR0FDaEIsWUFBYSxHQUNiLGlCQUFrQixFQUNwQixFQUNBLEdBQUdDLENBQ0wsQ0FDRixDQUNGLENBUU8sU0FBU0MsRUFBZ0JDLEVBQXNDLENBQ3BFLE1BQU8sQ0FBQyxFQUFFQSxHQUFVLE9BQU9BLEdBQVcsVUFBWSxZQUFhQSxFQUNqRSxDQVFPLFNBQVNDLEVBQXFCRCxFQUFpRCxDQUNwRixPQUFPQSxFQUFPLE9BQ2hCLENBUU8sU0FBU0UsRUFBb0JMLEVBQTZDLENBQy9FLE9BQU9ELEVBQW1CQyxDQUFhLENBQ3pDIiwKICAibmFtZXMiOiBbImluZGV4X2V4cG9ydHMiLCAiX19leHBvcnQiLCAiQnJvd3NlclBpcGVsaW5lIiwgIkNvbmZpZ1ZhbGlkYXRpb25FcnJvciIsICJFbnZpcm9ubWVudERldGVjdGlvbkVycm9yIiwgImNyZWF0ZVJ1bnRpbWVDb25maWciLCAiZXh0cmFjdFJ1bnRpbWVDb25maWciLCAiaXNSdW50aW1lQ29uZmlnIiwgImlzVmFsaWRTZXJ2aWNlTmFtZSIsICJtZXJnZVJ1bnRpbWVDb25maWciLCAicHVyZXdlYiIsICJfX3RvQ29tbW9uSlMiLCAiX19yZUV4cG9ydCIsICJSZWFjdCIsICJpbXBvcnRfY2xpZW50IiwgImltcG9ydF9yZWFjdF9yb3V0ZXIiLCAiQnJvd3NlclBpcGVsaW5lIiwgImNvbmZpZyIsICJjb250ZXh0IiwgImJyb3dzZXJSb3V0ZXIiLCAiYXBwRWxlbWVudCIsICJyb3V0ZXJQcm92aWRlciIsICJlcnJvciIsICJyb3V0ZXMiLCAiY29udGFpbmVyIiwgImJhc2VVcmwiLCAic3RhZ2UiLCAiaXNWYWxpZFNlcnZpY2VOYW1lIiwgInNlcnZpY2VOYW1lIiwgImltcG9ydF9wdXJlbm93IiwgIkNvbmZpZ1ZhbGlkYXRpb25FcnJvciIsICJlcnJvcnMiLCAiRW52aXJvbm1lbnREZXRlY3Rpb25FcnJvciIsICJtZXNzYWdlIiwgImRldGVjdEVudmlyb25tZW50IiwgImFyZyIsICJ2YWxpZGF0ZUNvbmZpZyIsICJjb25maWciLCAiaXNDREtDb250ZXh0IiwgInB1cmV3ZWIiLCAiZW52VHlwZSIsICJ2YWxpZGF0aW9uUmVzdWx0IiwgInJvdXRlciIsICJtZXJnZVJ1bnRpbWVDb25maWciLCAicHVyZW5vd0NvbmZpZyIsICJydW50aW1lQ29uZmlnIiwgImlzUnVudGltZUNvbmZpZyIsICJjb25maWciLCAiZXh0cmFjdFJ1bnRpbWVDb25maWciLCAiY3JlYXRlUnVudGltZUNvbmZpZyJdCn0K
@@ -0,0 +1,4 @@
1
+ export*from"@worktif/purenow";import*as i from"react";import{hydrateRoot as l}from"react-dom/client";import{createBrowserRouter as f,RouterProvider as g}from"react-router";var a=class{async execute(r,e){try{console.info("Starting browser pipeline execution",{serviceName:r.serviceName,stage:r.stage,url:e.metadata.url,userAgent:e.metadata.userAgent,viewport:e.metadata.viewport});let o=this.createBrowserRouter(r),n=this.createAppElement(r),m=i.createElement(g,{router:o},n);this.hydrateApplication(m),this.setupHttpClient(r),console.info("Browser pipeline execution completed successfully",{serviceName:r.serviceName,stage:r.stage})}catch(o){throw console.error("Browser pipeline execution failed",{serviceName:r.serviceName,stage:r.stage,error:o instanceof Error?o.message:String(o),stack:o instanceof Error?o.stack:void 0}),o}}createBrowserRouter(r){console.debug("Creating browser router",{routeCount:r.router.getRoutes().length});let e=r.router.getRoutes(),o=f(e);return console.debug("Browser router created successfully",{routeCount:e.length}),o}createAppElement(r){console.debug("Creating app element from factory");try{let e=r.app({router:r.router});if(!i.isValidElement(e))throw new Error("App factory must return a valid React element");return console.debug("App element created successfully"),e}catch(e){throw console.error("Failed to create app element",{error:e instanceof Error?e.message:String(e)}),new Error(`Failed to create app element: ${e instanceof Error?e.message:String(e)}`)}}hydrateApplication(r){console.debug("Starting React hydration");try{let e=document.getElementById("root");if(!e)throw new Error('Root container element not found. Expected element with id="root"');l(e,r),console.info("React hydration completed successfully")}catch(e){throw console.error("React hydration failed",{error:e instanceof Error?e.message:String(e)}),new Error(`React hydration failed: ${e instanceof Error?e.message:String(e)}`)}}setupHttpClient(r){console.debug("Setting up HTTP client for Lambda endpoints");try{let e=this.getApiBaseUrl(r.stage);typeof window<"u"&&(window.__PURENOW_CONFIG__={serviceName:r.serviceName,stage:r.stage,apiBaseUrl:e}),console.info("HTTP client configured successfully",{baseUrl:e,stage:r.stage})}catch(e){throw console.error("Failed to setup HTTP client",{error:e instanceof Error?e.message:String(e)}),new Error(`Failed to setup HTTP client: ${e instanceof Error?e.message:String(e)}`)}}getApiBaseUrl(r){return`${typeof window<"u"?window.location.origin:""}/api`}};function R(t){return/^[a-zA-Z][a-zA-Z0-9-]{0,127}$/.test(t)}import{purenow as u,purenowRouter as c}from"@worktif/purenow";var s=class extends Error{constructor(r){super(`Configuration validation failed:
2
+ ${r.map(e=>` - ${e}`).join(`
3
+ `)}`),this.name="ConfigValidationError",this.errors=r,Error.captureStackTrace(this,this.constructor)}},p=class extends Error{constructor(r){super(r),this.name="EnvironmentDetectionError",Error.captureStackTrace(this,this.constructor)}};function v(){return typeof window<"u"?"browser":typeof process<"u"&&process.env?.AWS_LAMBDA_FUNCTION_NAME?"lambda":(typeof process<"u"&&(process.env?.PURENOW_MODE==="cdk"||process.env?.CDK_DEFAULT_ACCOUNT||process.env?.CDK_DEFAULT_REGION||process.argv?.some(t=>t.includes("cdk")||t.includes("synth"))),"cdk")}function y(t,r){let e=[];return(!t.serviceName||!/^[a-zA-Z][a-zA-Z0-9-]{0,127}$/.test(t.serviceName))&&e.push("serviceName must start with a letter, contain only alphanumeric characters and hyphens, and be max 128 characters"),["dev","staging","prod"].includes(t.stage)||e.push("stage must be one of: dev, staging, prod"),r&&!t.infra&&e.push("infra configuration is required in CDK context"),{valid:e.length===0,errors:e}}function I(t){let r=v(),o=y(t,r==="cdk");if(!o.valid)throw new s(o.errors);switch(r){case"browser":{u({app:({router:n})=>t.app({router:n}),router:c({router:t.router.getRoutes(),defaults:t.router.defaults}),config:{serviceName:t.serviceName,stage:t.stage}});break}case"lambda":case"cdk":{console.log("[Runtime] Server-side pipeline detected (%s)",r),u({app:({router:n})=>t.app({router:n}),router:c({router:t.router.getRoutes(),defaults:t.router.defaults}),config:{serviceName:t.serviceName,stage:t.stage}});break}default:console.log("[Runtime Web] Unknown environment type: %s",r);break}}function d(t,r){return{...t,runtime:{enableThirdStack:!1,runtimeWebMode:"development",additionalFeatures:[],devServerEnhancements:{hotReload:!0,debugMode:!1,performanceMonitoring:!1},buildOptimizations:{bundleAnalysis:!1,treeshaking:!0,codeMinification:!0},...r}}}function w(t){return!!(t&&typeof t=="object"&&"runtime"in t)}function b(t){return t.runtime}function h(t){return d(t)}export{a as BrowserPipeline,s as ConfigValidationError,p as EnvironmentDetectionError,h as createRuntimeConfig,b as extractRuntimeConfig,w as isRuntimeConfig,R as isValidServiceName,d as mergeRuntimeConfig,I as pureweb};
4
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2luZGV4LnRzeCIsICIuLi8uLi8uLi9zcmMvbGliL3J1bnRpbWUtd2ViL3BpcGVsaW5lcy9icm93c2VyLXBpcGVsaW5lLnRzIiwgIi4uLy4uLy4uL3NyYy9saWIvcnVudGltZS13ZWIvdHlwZXMvY29uZmlnLnR5cGVzLnRzIiwgIi4uLy4uLy4uL3NyYy9saWIvcnVudGltZS13ZWIvcHVyZXdlYi50cyIsICIuLi8uLi8uLi9zcmMvbGliL3J1bnRpbWUtd2ViL3J1bnRpbWUuY29uZmlnLnR5cGVzLnRzeCJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IHdvcmt0aWYucHVyZW5vdy5jZGsgPHdvcmt0aWZfcHVyZW5vd19jZGs+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0yMiwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG4vLyBSZS1leHBvcnQgZXZlcnl0aGluZyBmcm9tIHRoZSBiYXNlIFB1cmVub3cgZnJhbWV3b3JrXG5leHBvcnQgKiBmcm9tICdAd29ya3RpZi9wdXJlbm93JztcblxuLy8gRXhwb3J0IHJ1bnRpbWUtd2ViIHNwZWNpZmljIGZ1bmN0aW9uYWxpdHlcbmV4cG9ydCAqIGZyb20gJy4vbGliL3J1bnRpbWUtd2ViJztcblxuLy8gRXhwb3J0IHJ1bnRpbWUgY29uZmlndXJhdGlvbiB0eXBlcyBhbmQgdXRpbGl0aWVzXG4vLyBleHBvcnQgKiBmcm9tICcuL3V0aWxzJztcblxuXG4vLyBSZS1leHBvcnQgcHVyZW5vdyBiaW4gZnVuY3Rpb25hbGl0eVxuLy8gZXhwb3J0ICogZnJvbSAnQHdvcmt0aWYvcHVyZW5vdyc7XG4iLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IHdvcmt0aWYucHVyZW5vdy5jZGsgPHdvcmt0aWZfcHVyZW5vd19jZGs+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0yMiwgaXQgaXMgcmUtbGljZW5zaW5nIHVuZGVyIEVsYXN0aWMgTGljZW5zZSAyLjAuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVsYXN0aWMtMi4wXG4gKi9cblxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgaHlkcmF0ZVJvb3QgfSBmcm9tICdyZWFjdC1kb20vY2xpZW50JztcbmltcG9ydCB7IGNyZWF0ZUJyb3dzZXJSb3V0ZXIsIFJvdXRlclByb3ZpZGVyIH0gZnJvbSAncmVhY3Qtcm91dGVyJztcblxuaW1wb3J0IHR5cGUgeyBCcm93c2VyTWV0YWRhdGEsIFJ1bnRpbWVXZWJDb25maWcgfSBmcm9tICdAbGliL3J1bnRpbWUtd2ViL3R5cGVzJztcblxuLy8gaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnQHdvcmt0aWYvdXRpbHMnO1xuXG4vKipcbiAqIEJyb3dzZXIgZXhlY3V0aW9uIHBpcGVsaW5lIGZvciBSdW50aW1lIFRhcmdldCBDb3JlLlxuICpcbiAqIEB0b2RvOiBvcmRpbmF0ZSB0aGlzIGNsYXNzIHRvIGluZnJhIG9yIGNvcmUgY2F1c2Ugd2UgaGF2ZSBOb2RlLmpzIHJlc3BvbnNpYmlsaXR5XG4gKiAgICAgIC0tLS0gT1IgXHUyMDEzPiBSRU1PVkUgTE9HR0VSXG4gKlxuICogKipBUkNISVRFQ1RVUkUgTk9URSoqOiBUaGlzIGZpbGUgaXMgaW4gYHNyYy9saWIvYCBiZWNhdXNlIGl0OlxuICogLSBVc2VzIGJyb3dzZXItb25seSBBUElzICh3aW5kb3csIGRvY3VtZW50LCBoeWRyYXRlUm9vdClcbiAqIC0gUnVucyBPTkxZIGluIGJyb3dzZXIgZW52aXJvbm1lbnRcbiAqIC0gTXVzdCBiZSBpc29tb3JwaGljLXNhZmUgKG5vIE5vZGUuanMgQVBJcylcbiAqIC0gTkVWRVIgcnVucyBpbiBMYW1iZGFcbiAqXG4gKiBIYW5kbGVzIGNsaWVudC1zaWRlIGh5ZHJhdGlvbiBvZiBSZWFjdCBhcHBsaWNhdGlvbnMgd2l0aCBwcmUtbG9hZGVkIGRhdGFcbiAqIGZyb20gc2VydmVyLXNpZGUgcmVuZGVyaW5nLiBTZXRzIHVwIGNsaWVudC1zaWRlIHJvdXRpbmcgYW5kIEhUVFAgY2xpZW50XG4gKiBmb3IgcG9zdC1oeWRyYXRpb24gQVBJIGNhbGxzIHRvIExhbWJkYSBlbmRwb2ludHMuXG4gKlxuICogKipFeGVjdXRpb24gRmxvdyoqOlxuICogMS4gSHlkcmF0ZSBSZWFjdCBhcHAgd2l0aCBleGlzdGluZyBQdXJlbm93Um91dGVyXG4gKiAyLiBDYWxsIGNvbmZpZy5hcHAoeyByb3V0ZXIgfSkgdG8gZ2V0IFJlYWN0IGVsZW1lbnRcbiAqIDMuIEluaXRpYWxpemUgY2xpZW50LXNpZGUgbmF2aWdhdGlvblxuICogNC4gU2V0IHVwIEhUVFAgY2xpZW50IGZvciBMYW1iZGEgZW5kcG9pbnQgY2FsbHNcbiAqXG4gKiAqKlJlcXVpcmVtZW50cyoqOiBSRVEtMDYsIFJFUS0xMlxuICovXG5leHBvcnQgY2xhc3MgQnJvd3NlclBpcGVsaW5lIHtcbiAgLy8gcHJpdmF0ZSByZWFkb25seSBsb2dnZXIgPSBsb2dnZXIoe1xuICAvLyAgIHNlcnZpY2VOYW1lOiAnQGxpYi9ydW50aW1lLXdlYi9waXBlbGluZXMvYnJvd3Nlci1waXBlbGluZScsXG4gIC8vIH0pO1xuXG4gIC8qKlxuICAgKiBFeGVjdXRlIGJyb3dzZXIgcGlwZWxpbmUgZm9yIGNsaWVudC1zaWRlIGh5ZHJhdGlvbi5cbiAgICpcbiAgICogSHlkcmF0ZXMgdGhlIFJlYWN0IGFwcGxpY2F0aW9uIHdpdGggcHJlLWxvYWRlZCBkYXRhIGZyb20gU1NSIGFuZCBzZXRzIHVwXG4gICAqIGNsaWVudC1zaWRlIHJvdXRpbmcuIFVzZXMgUmVhY3QgaHlkcmF0aW9uIChub3QgcmVuZGVyKSB0byBtYXRjaCB0aGVcbiAgICogc2VydmVyLXJlbmRlcmVkIEhUTUwgZXhhY3RseS5cbiAgICpcbiAgICogQHBhcmFtIGNvbmZpZyAtIFB1cmVub3cgY29uZmlndXJhdGlvbiB3aXRoIGFwcCBmYWN0b3J5IGFuZCByb3V0ZXJcbiAgICogQHBhcmFtIGNvbnRleHQgLSBCcm93c2VyIGVudmlyb25tZW50IGNvbnRleHQgd2l0aCBtZXRhZGF0YVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHBpcGVsaW5lID0gbmV3IEJyb3dzZXJQaXBlbGluZSgpO1xuICAgKiBhd2FpdCBwaXBlbGluZS5leGVjdXRlKGNvbmZpZywge1xuICAgKiAgIHR5cGU6ICdicm93c2VyJyxcbiAgICogICBtZXRhZGF0YToge1xuICAgKiAgICAgdXNlckFnZW50OiBuYXZpZ2F0b3IudXNlckFnZW50LFxuICAgKiAgICAgdXJsOiB3aW5kb3cubG9jYXRpb24uaHJlZixcbiAgICogICAgIHZpZXdwb3J0OiB7IHdpZHRoOiB3aW5kb3cuaW5uZXJXaWR0aCwgaGVpZ2h0OiB3aW5kb3cuaW5uZXJIZWlnaHQgfVxuICAgKiAgIH1cbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZShjb25maWc6IFJ1bnRpbWVXZWJDb25maWcsIGNvbnRleHQ6IHsgdHlwZTogJ2Jyb3dzZXInOyBtZXRhZGF0YTogQnJvd3Nlck1ldGFkYXRhIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc29sZS5pbmZvKCdTdGFydGluZyBicm93c2VyIHBpcGVsaW5lIGV4ZWN1dGlvbicsIHtcbiAgICAgICAgc2VydmljZU5hbWU6IGNvbmZpZy5zZXJ2aWNlTmFtZSxcbiAgICAgICAgc3RhZ2U6IGNvbmZpZy5zdGFnZSxcbiAgICAgICAgdXJsOiBjb250ZXh0Lm1ldGFkYXRhLnVybCxcbiAgICAgICAgdXNlckFnZW50OiBjb250ZXh0Lm1ldGFkYXRhLnVzZXJBZ2VudCxcbiAgICAgICAgdmlld3BvcnQ6IGNvbnRleHQubWV0YWRhdGEudmlld3BvcnQsXG4gICAgICB9KTtcblxuICAgICAgLy8gMS4gQ3JlYXRlIGJyb3dzZXIgcm91dGVyIGZyb20gUHVyZW5vd1JvdXRlclxuICAgICAgY29uc3QgYnJvd3NlclJvdXRlciA9IHRoaXMuY3JlYXRlQnJvd3NlclJvdXRlcihjb25maWcpO1xuXG4gICAgICAvLyAyLiBHZXQgUmVhY3QgZWxlbWVudCBmcm9tIGFwcCBmYWN0b3J5XG4gICAgICBjb25zdCBhcHBFbGVtZW50ID0gdGhpcy5jcmVhdGVBcHBFbGVtZW50KGNvbmZpZyk7XG5cbiAgICAgIC8vIDMuIENyZWF0ZSByb3V0ZXIgcHJvdmlkZXIgd2l0aCB0aGUgYXBwXG4gICAgICBjb25zdCByb3V0ZXJQcm92aWRlciA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoUm91dGVyUHJvdmlkZXIsIHtcbiAgICAgICAgcm91dGVyOiBicm93c2VyUm91dGVyLFxuICAgICAgfSwgYXBwRWxlbWVudCk7XG5cbiAgICAgIC8vIDQuIEh5ZHJhdGUgdGhlIGFwcGxpY2F0aW9uICh1c2UgaHlkcmF0aW9uLCBub3QgcmVuZGVyKVxuICAgICAgdGhpcy5oeWRyYXRlQXBwbGljYXRpb24ocm91dGVyUHJvdmlkZXIpO1xuXG4gICAgICAvLyA1LiBTZXQgdXAgSFRUUCBjbGllbnQgZm9yIHBvc3QtaHlkcmF0aW9uIEFQSSBjYWxsc1xuICAgICAgdGhpcy5zZXR1cEh0dHBDbGllbnQoY29uZmlnKTtcblxuICAgICAgY29uc29sZS5pbmZvKCdCcm93c2VyIHBpcGVsaW5lIGV4ZWN1dGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5Jywge1xuICAgICAgICBzZXJ2aWNlTmFtZTogY29uZmlnLnNlcnZpY2VOYW1lLFxuICAgICAgICBzdGFnZTogY29uZmlnLnN0YWdlLFxuICAgICAgfSk7XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignQnJvd3NlciBwaXBlbGluZSBleGVjdXRpb24gZmFpbGVkJywge1xuICAgICAgICBzZXJ2aWNlTmFtZTogY29uZmlnLnNlcnZpY2VOYW1lLFxuICAgICAgICBzdGFnZTogY29uZmlnLnN0YWdlLFxuICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgICAgICBzdGFjazogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLnN0YWNrIDogdW5kZWZpbmVkLFxuICAgICAgfSk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGJyb3dzZXIgcm91dGVyIGZyb20gUHVyZW5vd1JvdXRlciBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBVc2VzIHRoZSBleGlzdGluZyBQdXJlbm93Um91dGVyIHRvIGdldCByb3V0ZXMgYW5kIGNyZWF0ZXMgYSBSZWFjdCBSb3V0ZXJcbiAgICogYnJvd3NlciByb3V0ZXIgZm9yIGNsaWVudC1zaWRlIG5hdmlnYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBjb25maWcgLSBQdXJlbm93IGNvbmZpZ3VyYXRpb25cbiAgICogQHJldHVybnMgQnJvd3NlciByb3V0ZXIgaW5zdGFuY2VcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlQnJvd3NlclJvdXRlcihjb25maWc6IFJ1bnRpbWVXZWJDb25maWcpIHtcbiAgICBjb25zb2xlLmRlYnVnKCdDcmVhdGluZyBicm93c2VyIHJvdXRlcicsIHtcbiAgICAgIHJvdXRlQ291bnQ6IGNvbmZpZy5yb3V0ZXIuZ2V0Um91dGVzKCkubGVuZ3RoLFxuICAgIH0pO1xuXG4gICAgLy8gR2V0IHJvdXRlcyBmcm9tIFB1cmVub3dSb3V0ZXJcbiAgICBjb25zdCByb3V0ZXMgPSBjb25maWcucm91dGVyLmdldFJvdXRlcygpO1xuXG4gICAgLy8gQ3JlYXRlIGJyb3dzZXIgcm91dGVyIHdpdGggcm91dGVzIChjYXN0IHRvIFJvdXRlT2JqZWN0W10gZm9yIGNvbXBhdGliaWxpdHkpXG4gICAgY29uc3QgYnJvd3NlclJvdXRlciA9IGNyZWF0ZUJyb3dzZXJSb3V0ZXIocm91dGVzIGFzIGFueSk7XG5cbiAgICBjb25zb2xlLmRlYnVnKCdCcm93c2VyIHJvdXRlciBjcmVhdGVkIHN1Y2Nlc3NmdWxseScsIHtcbiAgICAgIHJvdXRlQ291bnQ6IHJvdXRlcy5sZW5ndGgsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gYnJvd3NlclJvdXRlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgUmVhY3QgZWxlbWVudCBmcm9tIGFwcCBmYWN0b3J5IGZ1bmN0aW9uLlxuICAgKlxuICAgKiBDYWxscyB0aGUgdXNlcidzIGFwcCBmYWN0b3J5IGZ1bmN0aW9uIHdpdGggdGhlIHJvdXRlciBkZXBlbmRlbmN5XG4gICAqIHRvIGdldCB0aGUgcm9vdCBSZWFjdCBlbGVtZW50IGZvciB0aGUgYXBwbGljYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBjb25maWcgLSBQdXJlbm93IGNvbmZpZ3VyYXRpb25cbiAgICogQHJldHVybnMgUm9vdCBSZWFjdCBlbGVtZW50XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUFwcEVsZW1lbnQoY29uZmlnOiBSdW50aW1lV2ViQ29uZmlnKTogUmVhY3QuUmVhY3RFbGVtZW50IHtcbiAgICBjb25zb2xlLmRlYnVnKCdDcmVhdGluZyBhcHAgZWxlbWVudCBmcm9tIGZhY3RvcnknKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBDYWxsIGFwcCBmYWN0b3J5IHdpdGggcm91dGVyIGRlcGVuZGVuY3lcbiAgICAgIGNvbnN0IGFwcEVsZW1lbnQgPSBjb25maWcuYXBwKHsgcm91dGVyOiBjb25maWcucm91dGVyIH0pO1xuXG4gICAgICBpZiAoIVJlYWN0LmlzVmFsaWRFbGVtZW50KGFwcEVsZW1lbnQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQXBwIGZhY3RvcnkgbXVzdCByZXR1cm4gYSB2YWxpZCBSZWFjdCBlbGVtZW50Jyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnNvbGUuZGVidWcoJ0FwcCBlbGVtZW50IGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgICByZXR1cm4gYXBwRWxlbWVudDtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gY3JlYXRlIGFwcCBlbGVtZW50Jywge1xuICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgICAgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBjcmVhdGUgYXBwIGVsZW1lbnQ6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIeWRyYXRlIHRoZSBSZWFjdCBhcHBsaWNhdGlvbiBpbiB0aGUgYnJvd3Nlci5cbiAgICpcbiAgICogVXNlcyBSZWFjdCdzIGh5ZHJhdGVSb290IHRvIGh5ZHJhdGUgdGhlIHNlcnZlci1yZW5kZXJlZCBIVE1MIHdpdGhcbiAgICogdGhlIGNsaWVudC1zaWRlIFJlYWN0IGFwcGxpY2F0aW9uLiBUaGlzIGVuc3VyZXMgdGhlIGNsaWVudCBtYXRjaGVzXG4gICAqIHRoZSBzZXJ2ZXIgZXhhY3RseSB0byBhdm9pZCBoeWRyYXRpb24gbWlzbWF0Y2hlcy5cbiAgICpcbiAgICogQHBhcmFtIHJvdXRlclByb3ZpZGVyIC0gUm91dGVyIHByb3ZpZGVyIGVsZW1lbnQgdG8gaHlkcmF0ZVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBoeWRyYXRlQXBwbGljYXRpb24ocm91dGVyUHJvdmlkZXI6IFJlYWN0LlJlYWN0RWxlbWVudCk6IHZvaWQge1xuICAgIGNvbnNvbGUuZGVidWcoJ1N0YXJ0aW5nIFJlYWN0IGh5ZHJhdGlvbicpO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIEdldCB0aGUgcm9vdCBjb250YWluZXIgZWxlbWVudFxuICAgICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jvb3QnKTtcbiAgICAgIGlmICghY29udGFpbmVyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUm9vdCBjb250YWluZXIgZWxlbWVudCBub3QgZm91bmQuIEV4cGVjdGVkIGVsZW1lbnQgd2l0aCBpZD1cInJvb3RcIicpO1xuICAgICAgfVxuXG4gICAgICAvLyBIeWRyYXRlIHRoZSBhcHBsaWNhdGlvbiAobm90IHJlbmRlciAtIG11c3QgbWF0Y2ggc2VydmVyIEhUTUwpXG4gICAgICBoeWRyYXRlUm9vdChjb250YWluZXIsIHJvdXRlclByb3ZpZGVyKTtcblxuICAgICAgY29uc29sZS5pbmZvKCdSZWFjdCBoeWRyYXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseScpO1xuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1JlYWN0IGh5ZHJhdGlvbiBmYWlsZWQnLCB7XG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICB9KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUmVhY3QgaHlkcmF0aW9uIGZhaWxlZDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldCB1cCBIVFRQIGNsaWVudCBmb3IgTGFtYmRhIGVuZHBvaW50IGNhbGxzLlxuICAgKlxuICAgKiBDb25maWd1cmVzIHRoZSBIVFRQIGNsaWVudCBmb3IgbWFraW5nIEFQSSBjYWxscyB0byBMYW1iZGEgZW5kcG9pbnRzXG4gICAqIGFmdGVyIGh5ZHJhdGlvbi4gVGhpcyBpcyB1c2VkIGZvciBwb3N0LWh5ZHJhdGlvbiBpbnRlcmFjdGlvbnMgdGhhdFxuICAgKiByZXF1aXJlIHNlcnZlci1zaWRlIGRhdGEuXG4gICAqXG4gICAqIEBwYXJhbSBjb25maWcgLSBQdXJlbm93IGNvbmZpZ3VyYXRpb25cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgc2V0dXBIdHRwQ2xpZW50KGNvbmZpZzogUnVudGltZVdlYkNvbmZpZyk6IHZvaWQge1xuICAgIGNvbnNvbGUuZGVidWcoJ1NldHRpbmcgdXAgSFRUUCBjbGllbnQgZm9yIExhbWJkYSBlbmRwb2ludHMnKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBTZXQgdXAgYmFzZSBVUkwgZm9yIEFQSSBjYWxscyBiYXNlZCBvbiBzdGFnZVxuICAgICAgY29uc3QgYmFzZVVybCA9IHRoaXMuZ2V0QXBpQmFzZVVybChjb25maWcuc3RhZ2UpO1xuXG4gICAgICAvLyBTdG9yZSBjb25maWd1cmF0aW9uIGdsb2JhbGx5IGZvciB1c2UgYnkgZGF0YSBsb2FkZXJzXG4gICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgKHdpbmRvdyBhcyBhbnkpLl9fUFVSRU5PV19DT05GSUdfXyA9IHtcbiAgICAgICAgICBzZXJ2aWNlTmFtZTogY29uZmlnLnNlcnZpY2VOYW1lLFxuICAgICAgICAgIHN0YWdlOiBjb25maWcuc3RhZ2UsXG4gICAgICAgICAgYXBpQmFzZVVybDogYmFzZVVybCxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY29uc29sZS5pbmZvKCdIVFRQIGNsaWVudCBjb25maWd1cmVkIHN1Y2Nlc3NmdWxseScsIHtcbiAgICAgICAgYmFzZVVybCxcbiAgICAgICAgc3RhZ2U6IGNvbmZpZy5zdGFnZSxcbiAgICAgIH0pO1xuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBzZXR1cCBIVFRQIGNsaWVudCcsIHtcbiAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gc2V0dXAgSFRUUCBjbGllbnQ6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgQVBJIGJhc2UgVVJMIGJhc2VkIG9uIGRlcGxveW1lbnQgc3RhZ2UuXG4gICAqXG4gICAqIERldGVybWluZXMgdGhlIGFwcHJvcHJpYXRlIEFQSSBiYXNlIFVSTCBmb3IgbWFraW5nIEhUVFAgcmVxdWVzdHNcbiAgICogdG8gTGFtYmRhIGVuZHBvaW50cyBiYXNlZCBvbiB0aGUgZGVwbG95bWVudCBzdGFnZS5cbiAgICpcbiAgICogQHBhcmFtIHN0YWdlIC0gRGVwbG95bWVudCBzdGFnZVxuICAgKiBAcmV0dXJucyBBUEkgYmFzZSBVUkxcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgZ2V0QXBpQmFzZVVybChzdGFnZTogJ2RldicgfCAnc3RhZ2luZycgfCAncHJvZCcpOiBzdHJpbmcge1xuICAgIC8vIEluIGJyb3dzZXIgY29udGV4dCwgQVBJIGNhbGxzIGdvIHRocm91Z2ggdGhlIHNhbWUgb3JpZ2luXG4gICAgLy8gVGhlIGFjdHVhbCBBUEkgR2F0ZXdheSBVUkwgaXMgaGFuZGxlZCBieSBDbG91ZEZyb250IHJvdXRpbmdcbiAgICBjb25zdCBvcmlnaW4gPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4gOiAnJztcblxuICAgIC8vIEFQSSBlbmRwb2ludHMgYXJlIHR5cGljYWxseSB1bmRlciAvYXBpIHBhdGhcbiAgICByZXR1cm4gYCR7b3JpZ2lufS9hcGlgO1xuICB9XG59XG4iLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IHdvcmt0aWYucHVyZW5vdy5jZGsgPHdvcmt0aWZfcHVyZW5vd19jZGs+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0yMiwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdHlwZSB7IEluZnJhT3B0aW9ucyB9IGZyb20gJy4vaW5mcmEudHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBNaWNyb3NlcnZpY2VEZWZpbml0aW9uIH0gZnJvbSAnLi9taWNyb3NlcnZpY2UudHlwZXMnO1xuXG4vKipcbiAqIFB1cmVub3dSb3V0ZXIgaW50ZXJmYWNlIGZvciBydW50aW1lLXdlYiBpbnRlZ3JhdGlvbi5cbiAqXG4gKiBEZWZpbmVzIHRoZSBlc3NlbnRpYWwgbWV0aG9kcyBuZWVkZWQgYnkgdGhlIHJ1bnRpbWUtd2ViIHBpcGVsaW5lcy5cbiAqIFRoaXMgaW50ZXJmYWNlIG1hdGNoZXMgdGhlIGFjdHVhbCBQdXJlbm93Um91dGVyIGNsYXNzIGZyb20gQGxpYi9yZWFjdC9wdXJlbm93LnJvdXRlci5cbiAqL1xuaW50ZXJmYWNlIFB1cmVub3dSb3V0ZXIge1xuICAvKipcbiAgICogR2V0IGFsbCByb3V0ZSBvYmplY3RzIGFzIGFuIGFycmF5LlxuICAgKiBVc2VkIGZvciBjcmVhdGluZyBicm93c2VyIHJvdXRlcnMgYW5kIFNTUiBzdGF0aWMgaGFuZGxlcnMuXG4gICAqL1xuICBnZXRSb3V0ZXMoKTogQXJyYXk8e1xuICAgIHBhdGg/OiBzdHJpbmc7XG4gICAgZWxlbWVudD86IHVua25vd247XG4gICAgbG9hZGVyPzogdW5rbm93bjtcbiAgICBjaGlsZHJlbj86IHVua25vd247XG4gICAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcbiAgfT47XG5cbiAgLyoqXG4gICAqIEZpbmQgYSByb3V0ZSBieSBpdHMgSUQuXG4gICAqL1xuICBnZXRSb3V0ZUJ5SWQ/KGlkOiBzdHJpbmcpOiB1bmtub3duO1xuXG4gIC8qKlxuICAgKiBGaW5kIGEgcm91dGUgYnkgaXRzIHBhdGguXG4gICAqL1xuICBnZXRSb3V0ZUJ5UGF0aD8ocGF0aDogc3RyaW5nKTogdW5rbm93bjtcblxuICAvKipcbiAgICogR2V0IHRoZSByb3V0ZXMgYXJyYXkgKGdldHRlcikuXG4gICAqL1xuICByb3V0ZXM/OiBBcnJheTx1bmtub3duPjtcblxuICAvKipcbiAgICogR2V0IHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBkZWZhdWx0cz86IHVua25vd247XG59XG5cbi8qKlxuICogU3RhZ2UgZW52aXJvbm1lbnQgZm9yIGRlcGxveW1lbnQuXG4gKlxuICogLSBgZGV2YDogRGV2ZWxvcG1lbnQgZW52aXJvbm1lbnRcbiAqIC0gYHN0YWdpbmdgOiBTdGFnaW5nL3ByZS1wcm9kdWN0aW9uIGVudmlyb25tZW50XG4gKiAtIGBwcm9kYDogUHJvZHVjdGlvbiBlbnZpcm9ubWVudFxuICovXG5leHBvcnQgdHlwZSBTdGFnZSA9ICdkZXYnIHwgJ3N0YWdpbmcnIHwgJ3Byb2QnO1xuXG4vKipcbiAqIFV0aWxpdHkgdHlwZSB0byBleHRyYWN0IHNlcnZpY2UgbmFtZXMgZnJvbSByZWdpc3RlciBjb25maWd1cmF0aW9uLlxuICpcbiAqIFRoaXMgZW5hYmxlcyBjb21waWxlLXRpbWUgdmFsaWRhdGlvbiBvZiBzZXJ2aWNlIG5hbWVzIGFuZCBwcm92aWRlc1xuICogdHlwZS1zYWZlIGFjY2VzcyB0byBzZXJ2aWNlIGlkZW50aWZpZXJzIHRocm91Z2hvdXQgdGhlIGZyYW1ld29yay5cbiAqXG4gKiBAdGVtcGxhdGUgVCAtIFRoZSByZWdpc3RlciBjb25maWd1cmF0aW9uIG9iamVjdCB0eXBlXG4gKi9cbmV4cG9ydCB0eXBlIFNlcnZpY2VOYW1lczxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgTWljcm9zZXJ2aWNlRGVmaW5pdGlvbj4+ID0ga2V5b2YgVDtcblxuLyoqXG4gKiBVdGlsaXR5IHR5cGUgdG8gZ2VuZXJhdGUgTGFtYmRhIElEcyBmcm9tIHNlcnZpY2UgY29uZmlndXJhdGlvbi5cbiAqXG4gKiBDb21iaW5lcyBzZXJ2aWNlIG5hbWVzIHdpdGggTGFtYmRhIElEcyB0byBjcmVhdGUgZnVsbHkgcXVhbGlmaWVkXG4gKiBMYW1iZGEgaWRlbnRpZmllcnMgZm9yIHR5cGUtc2FmZSBMYW1iZGEgcmVzb2x1dGlvbi5cbiAqXG4gKiBAdGVtcGxhdGUgVCAtIFRoZSByZWdpc3RlciBjb25maWd1cmF0aW9uIG9iamVjdCB0eXBlXG4gKi9cbmV4cG9ydCB0eXBlIExhbWJkYUlkczxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgTWljcm9zZXJ2aWNlRGVmaW5pdGlvbj4+ID0ge1xuICBbSyBpbiBrZXlvZiBUXTogVFtLXVsnbGFtYmRhcyddW251bWJlcl0gZXh0ZW5kcyB7IGlkOiBpbmZlciBJIH1cbiAgICA/IEkgZXh0ZW5kcyBzdHJpbmdcbiAgICAgID8gYCR7SyAmIHN0cmluZ30uJHtJfWBcbiAgICAgIDogbmV2ZXJcbiAgICA6IG5ldmVyO1xufVtrZXlvZiBUXTtcblxuLyoqXG4gKiBUeXBlIGNvbnN0cmFpbnQgZm9yIHZhbGlkIHNlcnZpY2UgbmFtZXMuXG4gKlxuICogRW5zdXJlcyBzZXJ2aWNlIG5hbWVzIGZvbGxvdyB0aGUgdmFsaWRhdGlvbiBwYXR0ZXJuOlxuICogLSBNdXN0IHN0YXJ0IHdpdGggYSBsZXR0ZXIgKGEteiwgQS1aKVxuICogLSBDYW4gY29udGFpbiBsZXR0ZXJzLCBudW1iZXJzLCBhbmQgaHlwaGVuc1xuICogLSBNYXhpbXVtIGxlbmd0aDogMTI4IGNoYXJhY3RlcnNcbiAqXG4gKiBUaGlzIGlzIGEgYnJhbmRlZCB0eXBlIHRoYXQgcHJvdmlkZXMgY29tcGlsZS10aW1lIHZhbGlkYXRpb24uXG4gKi9cbmV4cG9ydCB0eXBlIFZhbGlkU2VydmljZU5hbWUgPSBzdHJpbmcgJiB7IHJlYWRvbmx5IF9fYnJhbmQ6ICdWYWxpZFNlcnZpY2VOYW1lJyB9O1xuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gdmFsaWRhdGUgc2VydmljZSBuYW1lIGZvcm1hdC5cbiAqXG4gKiBAcGFyYW0gc2VydmljZU5hbWUgLSBUaGUgc2VydmljZSBuYW1lIHRvIHZhbGlkYXRlXG4gKiBAcmV0dXJucyBUeXBlIHByZWRpY2F0ZSBpbmRpY2F0aW5nIGlmIHRoZSBzZXJ2aWNlIG5hbWUgaXMgdmFsaWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRTZXJ2aWNlTmFtZShzZXJ2aWNlTmFtZTogc3RyaW5nKTogc2VydmljZU5hbWUgaXMgVmFsaWRTZXJ2aWNlTmFtZSB7XG4gIHJldHVybiAvXlthLXpBLVpdW2EtekEtWjAtOS1dezAsMTI3fSQvLnRlc3Qoc2VydmljZU5hbWUpO1xufVxuXG4vKipcbiAqIE1haW4gY29uZmlndXJhdGlvbiBpbnRlcmZhY2UgZm9yIFJ1bnRpbWUgVGFyZ2V0IENvcmUuXG4gKlxuICogVGhpcyBpbnRlcmZhY2UgcHJvdmlkZXMgYSB1bmlmaWVkIGNvbmZpZ3VyYXRpb24gdGhhdCB3b3JrcyBhY3Jvc3MgYWxsIGV4ZWN1dGlvbiBjb250ZXh0czpcbiAqIC0gQnJvd3NlcjogSHlkcmF0ZXMgUmVhY3QgYXBwbGljYXRpb24gd2l0aCBjbGllbnQtc2lkZSByb3V0aW5nXG4gKiAtIExhbWJkYTogRXhlY3V0ZXMgc2VydmVyLXNpZGUgcmVuZGVyaW5nIGFuZCBidXNpbmVzcyBsb2dpY1xuICogLSBDREs6IFN5bnRoZXNpemVzIENsb3VkRm9ybWF0aW9uIGluZnJhc3RydWN0dXJlXG4gKlxuICogQHRlbXBsYXRlIFRSZWdpc3RlciAtIFRoZSByZWdpc3RlciBjb25maWd1cmF0aW9uIHR5cGUgZm9yIHR5cGUtc2FmZSBzZXJ2aWNlIG5hbWVzXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IHB1cmVub3cgfSBmcm9tICdAd29ya3RpZi9wdXJlbm93L3J1bnRpbWUtd2ViJztcbiAqIGltcG9ydCB7IFB1cmVub3dSb3V0ZXIgfSBmcm9tICdAd29ya3RpZi9wdXJlbm93JztcbiAqXG4gKiBjb25zdCBjb25maWcgPSB7XG4gKiAgIGFwcDogKHsgcm91dGVyIH0pID0+IDxBcHAgcm91dGVyPXtyb3V0ZXJ9IC8+LFxuICogICByb3V0ZXI6IG5ldyBQdXJlbm93Um91dGVyKHsgcm91dGVyOiByb3V0ZXMsIGRlZmF1bHRzOiB7fSB9KSxcbiAqICAgc2VydmljZU5hbWU6ICdteS1hcHAnLFxuICogICBzdGFnZTogJ2RldicsXG4gKiAgIHJlZ2lzdGVyOiB7XG4gKiAgICAgcGF5bWVudHM6IHtcbiAqICAgICAgIHRpZXM6IFtQYXltZW50c1RpZXNdLFxuICogICAgICAgbGFtYmRhczogW2NoYXJnZUhhbmRsZXIsIHJlZnVuZEhhbmRsZXJdXG4gKiAgICAgfSxcbiAqICAgICB1c2Vyczoge1xuICogICAgICAgdGllczogW1VzZXJzVGllc10sXG4gKiAgICAgICBsYW1iZGFzOiBbY3JlYXRlVXNlckhhbmRsZXIsIGdldFVzZXJIYW5kbGVyXVxuICogICAgIH1cbiAqICAgfSBhcyBjb25zdCwgIC8vIFVzZSAnYXMgY29uc3QnIGZvciBiZXR0ZXIgdHlwZSBpbmZlcmVuY2VcbiAqICAgaW5mcmE6IHtcbiAqICAgICBlbnY6IHsgYWNjb3VudDogJzEyMzQ1Njc4OTAxMicsIHJlZ2lvbjogJ3VzLWVhc3QtMScgfSxcbiAqICAgICBzdGFnZTogJ2RldicsXG4gKiAgICAgcmVhY3RFbnRyeTogJy4vc3JjL2luZGV4LnRzeCcsXG4gKiAgICAgYXBpTW9kZTogJ2FwaUdhdGV3YXknXG4gKiAgIH1cbiAqIH0gc2F0aXNmaWVzIFB1cmVub3dDb25maWc7XG4gKlxuICogcHVyZW5vdyhjb25maWcpO1xuICogYGBgXG4gKlxuICogQHRvZG86IGFmdGVyIFJ1bnRpbWVXZWIgcmVwbyB3aWxsIGJlIHJlc29sdmVkLCBSdW50aW1lV2ViQ29uZmlnIE1VU1QgZXh0ZW5kIFB1cmVub3dDb25maWcgQ29yZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJ1bnRpbWVXZWJDb25maWc8VFJlZ2lzdGVyIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgTWljcm9zZXJ2aWNlRGVmaW5pdGlvbj4gPSBSZWNvcmQ8c3RyaW5nLCBNaWNyb3NlcnZpY2VEZWZpbml0aW9uPj4ge1xuICAvKipcbiAgICogUmVhY3QgYXBwbGljYXRpb24gY29tcG9uZW50IGZhY3RvcnkgZnVuY3Rpb24uXG4gICAqXG4gICAqIFJlY2VpdmVzIHRoZSByb3V0ZXIgaW5zdGFuY2UgYXMgYSBkZXBlbmRlbmN5IGFuZCByZXR1cm5zIHRoZSByb290IFJlYWN0IGVsZW1lbnQuXG4gICAqIFRoaXMgcGF0dGVybiBlbmFibGVzIGRlcGVuZGVuY3kgaW5qZWN0aW9uIG9mIHRoZSByb3V0ZXIgaW50byB5b3VyIGFwcGxpY2F0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gZGVwcyAtIERlcGVuZGVuY2llcyBvYmplY3QgY29udGFpbmluZyB0aGUgcm91dGVyXG4gICAqIEBwYXJhbSBkZXBzLnJvdXRlciAtIFB1cmVub3dSb3V0ZXIgaW5zdGFuY2UgZm9yIG5hdmlnYXRpb24gYW5kIHJvdXRpbmdcbiAgICogQHJldHVybnMgUm9vdCBSZWFjdCBlbGVtZW50IChSZWFjdC5SZWFjdEVsZW1lbnQpXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogYXBwOiAoeyByb3V0ZXIgfSkgPT4gPEFwcCByb3V0ZXI9e3JvdXRlcn0gLz5cbiAgICogYGBgXG4gICAqL1xuICBhcHA6IChkZXBzOiB7IHJvdXRlcjogUHVyZW5vd1JvdXRlciB9KSA9PiBSZWFjdC5SZWFjdEVsZW1lbnQ7XG5cbiAgLyoqXG4gICAqIFB1cmVub3dSb3V0ZXIgaW5zdGFuY2UgZm9yIGFwcGxpY2F0aW9uIHJvdXRpbmcuXG4gICAqXG4gICAqIERlZmluZXMgYWxsIHJvdXRlcywgbG9hZGVycywgYW5kIG5hdmlnYXRpb24gY29uZmlndXJhdGlvbi5cbiAgICogVGhlIHJvdXRlciBpcyB1c2VkIGluIGJvdGggc2VydmVyLXNpZGUgcmVuZGVyaW5nIChMYW1iZGEpIGFuZCBjbGllbnQtc2lkZSBoeWRyYXRpb24gKGJyb3dzZXIpLlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBQdXJlbm93Um91dGVyfSBmb3Igcm91dGVyIGNvbmZpZ3VyYXRpb25cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiByb3V0ZXI6IG5ldyBQdXJlbm93Um91dGVyKHtcbiAgICogICByb3V0ZXI6IFtcbiAgICogICAgIHsgcGF0aDogJy8nLCBlbGVtZW50OiA8SG9tZSAvPiB9LFxuICAgKiAgICAgeyBwYXRoOiAnL2Fib3V0JywgZWxlbWVudDogPEFib3V0IC8+IH1cbiAgICogICBdLFxuICAgKiAgIGRlZmF1bHRzOiB7fVxuICAgKiB9KVxuICAgKiBgYGBcbiAgICovXG4gIHJvdXRlcjogUHVyZW5vd1JvdXRlcjtcblxuICAvKipcbiAgICogU2VydmljZSBuYW1lIGlkZW50aWZpZXIgZm9yIHRoZSBhcHBsaWNhdGlvbi5cbiAgICpcbiAgICogVXNlZCBhcyBhIHByZWZpeCBmb3IgYWxsIEFXUyByZXNvdXJjZXMgKExhbWJkYSBmdW5jdGlvbnMsIEFQSSBHYXRld2F5LCBTMyBidWNrZXRzLCBldGMuKS5cbiAgICogTXVzdCBiZSB1bmlxdWUgd2l0aGluIHlvdXIgQVdTIGFjY291bnQgYW5kIHJlZ2lvbi5cbiAgICpcbiAgICogKipWYWxpZGF0aW9uIFJ1bGVzKio6XG4gICAqIC0gTXVzdCBzdGFydCB3aXRoIGEgbGV0dGVyIChhLXosIEEtWilcbiAgICogLSBDYW4gY29udGFpbiBsZXR0ZXJzLCBudW1iZXJzLCBhbmQgaHlwaGVuc1xuICAgKiAtIE1heGltdW0gbGVuZ3RoOiAxMjggY2hhcmFjdGVyc1xuICAgKiAtIFBhdHRlcm46IGAvXlthLXpBLVpdW2EtekEtWjAtOS1dezAsMTI3fSQvYFxuICAgKlxuICAgKiAqKkV4YW1wbGVzKio6XG4gICAqIC0gVmFsaWQ6IGBteS1hcHBgLCBgTXlBcHBgLCBgYXBwMTIzYCwgYG15LWFwcC12MmBcbiAgICogLSBJbnZhbGlkOiBgMTIzYXBwYCAoc3RhcnRzIHdpdGggbnVtYmVyKSwgYG15X2FwcGAgKHVuZGVyc2NvcmUpLCBgbXkgYXBwYCAoc3BhY2UpXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogc2VydmljZU5hbWU6ICdteS1hcHBsaWNhdGlvbidcbiAgICogYGBgXG4gICAqL1xuICBzZXJ2aWNlTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBEZXBsb3ltZW50IHN0YWdlL2Vudmlyb25tZW50LlxuICAgKlxuICAgKiBEZXRlcm1pbmVzIHRoZSBlbnZpcm9ubWVudC1zcGVjaWZpYyBjb25maWd1cmF0aW9uIGFuZCByZXNvdXJjZSBuYW1pbmcuXG4gICAqIFVzZWQgdG8gY3JlYXRlIHNlcGFyYXRlIGluZnJhc3RydWN0dXJlIHN0YWNrcyBmb3IgZGlmZmVyZW50IGVudmlyb25tZW50cy5cbiAgICpcbiAgICogKipWYWx1ZXMqKjpcbiAgICogLSBgZGV2YDogRGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgKGxvY2FsIHRlc3RpbmcsIHJhcGlkIGl0ZXJhdGlvbilcbiAgICogLSBgc3RhZ2luZ2A6IFN0YWdpbmcvcHJlLXByb2R1Y3Rpb24gZW52aXJvbm1lbnQgKFFBLCBpbnRlZ3JhdGlvbiB0ZXN0aW5nKVxuICAgKiAtIGBwcm9kYDogUHJvZHVjdGlvbiBlbnZpcm9ubWVudCAobGl2ZSB1c2VycylcbiAgICpcbiAgICogKipJbXBhY3QqKjpcbiAgICogLSBSZXNvdXJjZSBuYW1pbmc6IGB7c2VydmljZU5hbWV9LXtyZXNvdXJjZX0te3N0YWdlfWBcbiAgICogLSBFbnZpcm9ubWVudCB2YXJpYWJsZXM6IERpZmZlcmVudCBjb25maWdzIHBlciBzdGFnZVxuICAgKiAtIENhY2hlIFRUTDogU2hvcnRlciBpbiBkZXYsIGxvbmdlciBpbiBwcm9kXG4gICAqIC0gTG9nZ2luZzogTW9yZSB2ZXJib3NlIGluIGRldiwgc3RydWN0dXJlZCBpbiBwcm9kXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogc3RhZ2U6ICdkZXYnXG4gICAqIGBgYFxuICAgKi9cbiAgc3RhZ2U6IFN0YWdlO1xuXG4gIC8qKlxuICAgKiBNaWNyb3NlcnZpY2UgcmVnaXN0cnkgKHJ1bnRpbWUtbGV2ZWwgY29uZmlndXJhdGlvbikuXG4gICAqXG4gICAqICoqUmVxdWlyZWQqKjogRGVmaW5lcyBhbGwgbWljcm9zZXJ2aWNlcywgdGhlaXIgREkgY29udGFpbmVycywgYW5kIExhbWJkYSBlbmRwb2ludHMuXG4gICAqICoqVXNlZCBpbiBhbGwgY29udGV4dHMqKjogQnJvd3NlciAoZm9yIHR5cGUgZ2VuZXJhdGlvbiksIExhbWJkYSAoZm9yIERJKSwgQ0RLIChmb3IgaW5mcmFzdHJ1Y3R1cmUpLlxuICAgKiAqKkFyY2hpdGVjdHVyZSoqOiBUaGlzIGlzIHJ1bnRpbWUgY29uZmlndXJhdGlvbiwgc2VwYXJhdGUgZnJvbSBpbmZyYXN0cnVjdHVyZSBjb25jZXJucy5cbiAgICpcbiAgICogRWFjaCBtaWNyb3NlcnZpY2UgZ2V0cyBpdHMgb3duIFB1cmVDb250YWluZXIgaW5zdGFuY2UgYnVpbHQgZnJvbSB0aGUgVGllcyBjbGFzc2VzLlxuICAgKiBMYW1iZGEgZnVuY3Rpb25zIGFyZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgYW5kIHdpcmVkIHdpdGggZGVwZW5kZW5jeSBpbmplY3Rpb24uXG4gICAqXG4gICAqICoqVHlwZSBTYWZldHkqKjogU2VydmljZSBuYW1lcyBhcmUgZGVyaXZlZCBmcm9tIG9iamVjdCBrZXlzLCBlbnN1cmluZyBjb21waWxlLXRpbWUgdmFsaWRhdGlvbi5cbiAgICogKipObyBNYWdpYyBTdHJpbmdzKio6IEFsbCBzZXJ2aWNlIGlkZW50aWZpZXJzIGFyZSB0eXBlLXNhZmUgYW5kIGF1dG8tZ2VuZXJhdGVkLlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBNaWNyb3NlcnZpY2VEZWZpbml0aW9ufSBmb3IgbWljcm9zZXJ2aWNlIHN0cnVjdHVyZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIHJlZ2lzdGVyOiB7XG4gICAqICAgcGF5bWVudHM6IHtcbiAgICogICAgIHRpZXM6IFtQYXltZW50c1RpZXMsIEJpbGxpbmdUaWVzXSxcbiAgICogICAgIGxhbWJkYXM6IFtjaGFyZ2VIYW5kbGVyLCByZWZ1bmRIYW5kbGVyLCB3ZWJob29rSGFuZGxlcl1cbiAgICogICB9LFxuICAgKiAgIHVzZXJzOiB7XG4gICAqICAgICB0aWVzOiBbVXNlcnNUaWVzLCBBdXRoVGllc10sXG4gICAqICAgICBsYW1iZGFzOiBbY3JlYXRlVXNlckhhbmRsZXIsIGdldFVzZXJIYW5kbGVyLCBsb2dpbkhhbmRsZXJdXG4gICAqICAgfVxuICAgKiB9IGFzIGNvbnN0ICAvLyBVc2UgJ2FzIGNvbnN0JyBmb3IgYmV0dGVyIHR5cGUgaW5mZXJlbmNlXG4gICAqIGBgYFxuICAgKi9cbiAgcmVnaXN0ZXI6IFRSZWdpc3RlcjtcblxuICAvKipcbiAgICogSW5mcmFzdHJ1Y3R1cmUgY29uZmlndXJhdGlvbiBmb3IgQ0RLIGRlcGxveW1lbnQuXG4gICAqXG4gICAqICoqT3B0aW9uYWwqKjogT25seSByZXF1aXJlZCB3aGVuIHJ1bm5pbmcgaW4gQ0RLIGNvbnRleHQgKHN5bnRoZXNpemluZyBDbG91ZEZvcm1hdGlvbiB0ZW1wbGF0ZXMpLlxuICAgKiAqKk5vdCB1c2VkKio6IEluIGJyb3dzZXIgYW5kIExhbWJkYSBjb250ZXh0cyAocnVudGltZSBjb25maWd1cmF0aW9uIGlzIGluIHJlZ2lzdGVyKS5cbiAgICogKipQdXJlIGluZnJhc3RydWN0dXJlKio6IENvbnRhaW5zIG9ubHkgQVdTIHJlc291cmNlIGNvbmZpZ3VyYXRpb24sIG5vIGJ1c2luZXNzIGxvZ2ljLlxuICAgKlxuICAgKiBEZWZpbmVzOlxuICAgKiAtIEFXUyBhY2NvdW50IGFuZCByZWdpb25cbiAgICogLSBMYW1iZGEgY29uZmlndXJhdGlvbiAobWVtb3J5LCB0aW1lb3V0LCBWUEMpXG4gICAqIC0gQVBJIEdhdGV3YXkgb3IgTGFtYmRhIFVSTCBtb2RlXG4gICAqIC0gQ3VzdG9tIGRvbWFpbiBjb25maWd1cmF0aW9uXG4gICAqIC0gUmVhY3QgZW50cnkgcG9pbnQgZm9yIFNTUiBMYW1iZGFcbiAgICpcbiAgICogQHNlZSB7QGxpbmsgSW5mcmFPcHRpb25zfSBmb3IgZGV0YWlsZWQgY29uZmlndXJhdGlvbiBvcHRpb25zXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogaW5mcmE6IHtcbiAgICogICBlbnY6IHsgYWNjb3VudDogJzEyMzQ1Njc4OTAxMicsIHJlZ2lvbjogJ3VzLWVhc3QtMScgfSxcbiAgICogICBzdGFnZTogJ2RldicsXG4gICAqICAgcmVhY3RFbnRyeTogJy4vc3JjL2luZGV4LnRzeCcsXG4gICAqICAgYXBpTW9kZTogJ2FwaUdhdGV3YXknLFxuICAgKiAgIGxhbWJkYU1lbW9yeVNpemU6IDEwMjQsXG4gICAqICAgbGFtYmRhVGltZW91dDogMzAsXG4gICAqICAgZG9tYWluOiB7XG4gICAqICAgICByb290RG9tYWluOiAnbXlhcHAuY29tJyxcbiAgICogICAgIHN1YmRvbWFpbjogJ2FwaSdcbiAgICogICB9XG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBpbmZyYT86IEluZnJhT3B0aW9ucztcbn1cblxuLyoqXG4gKiBUeXBlLXNhZmUgUHVyZW5vdyBjb25maWd1cmF0aW9uIHdpdGggaW5mZXJyZWQgc2VydmljZSBuYW1lcy5cbiAqXG4gKiBUaGlzIHR5cGUgcHJvdmlkZXMgUnVudGltZSBDb3JlIHR5cGUgc2FmZXR5IGJ5IGluZmVycmluZyBzZXJ2aWNlIG5hbWVzIGZyb20gdGhlIHJlZ2lzdGVyXG4gKiBjb25maWd1cmF0aW9uLCBlbmFibGluZyBjb21waWxlLXRpbWUgdmFsaWRhdGlvbiBvZiBzZXJ2aWNlIHJlZmVyZW5jZXMuXG4gKlxuICogQHRlbXBsYXRlIFRSZWdpc3RlciAtIFRoZSByZWdpc3RlciBjb25maWd1cmF0aW9uIHR5cGVcbiAqL1xuZXhwb3J0IHR5cGUgVHlwZVNhZmVQdXJlbm93Q29uZmlnPFRSZWdpc3RlciBleHRlbmRzIFJlY29yZDxzdHJpbmcsIE1pY3Jvc2VydmljZURlZmluaXRpb24+PiA9XG4gIFJ1bnRpbWVXZWJDb25maWc8VFJlZ2lzdGVyPiAmIHtcbiAgLyoqXG4gICAqIFR5cGUtc2FmZSBzZXJ2aWNlIG5hbWVzIGRlcml2ZWQgZnJvbSByZWdpc3RlciBrZXlzLlxuICAgKiBBdmFpbGFibGUgYXQgY29tcGlsZS10aW1lIGZvciB0eXBlIGNoZWNraW5nIGFuZCBJREUgYXV0b2NvbXBsZXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgc2VydmljZU5hbWVzPzogU2VydmljZU5hbWVzPFRSZWdpc3Rlcj47XG5cbiAgLyoqXG4gICAqIFR5cGUtc2FmZSBMYW1iZGEgSURzIGRlcml2ZWQgZnJvbSByZWdpc3RlciBjb25maWd1cmF0aW9uLlxuICAgKiBBdmFpbGFibGUgYXQgY29tcGlsZS10aW1lIGZvciB0eXBlIGNoZWNraW5nIGFuZCBJREUgYXV0b2NvbXBsZXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgbGFtYmRhSWRzPzogTGFtYmRhSWRzPFRSZWdpc3Rlcj47XG59O1xuIiwgIi8qXG4gKiBFbGFzdGljIExpY2Vuc2UgMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiB3b3JrdGlmLnB1cmVub3cuY2RrIDx3b3JrdGlmX3B1cmVub3dfY2RrPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBFbGFzdGljIExpY2Vuc2UgMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9saWNlbnNpbmcvZWxhc3RpYy1saWNlbnNlIGZvciBkZXRhaWxzLlxuICpcbiAqIFJlLWxpY2Vuc2luZyBub3RpY2U6XG4gKiAgIFRoaXMgZmlsZSB3YXMgcHJldmlvdXNseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgQnVzaW5lc3MgU291cmNlIExpY2Vuc2UgMS4xIChCVVNMLTEuMSkuXG4gKiAgIEFzIG9mIDIwMjUtMDktMjIsIGl0IGlzIHJlLWxpY2Vuc2VkIHVuZGVyIEVsYXN0aWMgTGljZW5zZSAyLjAuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVsYXN0aWMtMi4wXG4gKi9cblxuaW1wb3J0IHsgcHVyZW5vdywgUHVyZW5vd1JvdXRlLCBwdXJlbm93Um91dGVyLCBQdXJlbm93Um91dGVyRGVmYXVsdHMgfSBmcm9tICdAd29ya3RpZi9wdXJlbm93JztcbmltcG9ydCB7IFJ1bnRpbWVXZWJDb25maWcgfSBmcm9tICdAbGliL3J1bnRpbWUtd2ViL3R5cGVzJztcblxuLyoqXG4gKiBFcnJvciB0aHJvd24gd2hlbiBjb25maWd1cmF0aW9uIHZhbGlkYXRpb24gZmFpbHMuXG4gKiBGb2xsb3dzIHB1cmVub3cgZXJyb3IgcGF0dGVybnMgd2l0aG91dCBlbW9qaS5cbiAqL1xuZXhwb3J0IGNsYXNzIENvbmZpZ1ZhbGlkYXRpb25FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgLyoqIEFycmF5IG9mIHZhbGlkYXRpb24gZXJyb3IgbWVzc2FnZXMgKi9cbiAgcmVhZG9ubHkgZXJyb3JzOiBzdHJpbmdbXTtcblxuICBjb25zdHJ1Y3RvcihlcnJvcnM6IHN0cmluZ1tdKSB7XG4gICAgc3VwZXIoYENvbmZpZ3VyYXRpb24gdmFsaWRhdGlvbiBmYWlsZWQ6XFxuJHtlcnJvcnMubWFwKGUgPT4gYCAgLSAke2V9YCkuam9pbignXFxuJyl9YCk7XG4gICAgdGhpcy5uYW1lID0gJ0NvbmZpZ1ZhbGlkYXRpb25FcnJvcic7XG4gICAgdGhpcy5lcnJvcnMgPSBlcnJvcnM7XG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7XG4gIH1cbn1cblxuLyoqXG4gKiBFcnJvciB0aHJvd24gd2hlbiBlbnZpcm9ubWVudCBkZXRlY3Rpb24gZmFpbHMuXG4gKiBGb2xsb3dzIHB1cmVub3cgZXJyb3IgcGF0dGVybnMgd2l0aG91dCBlbW9qaS5cbiAqL1xuZXhwb3J0IGNsYXNzIEVudmlyb25tZW50RGV0ZWN0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9ICdFbnZpcm9ubWVudERldGVjdGlvbkVycm9yJztcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCB0aGlzLmNvbnN0cnVjdG9yKTtcbiAgfVxufVxuXG4vKipcbiAqIERldGVjdCB0aGUgY3VycmVudCBydW50aW1lIGVudmlyb25tZW50LlxuICogVGhpcyBpcyBhIGxpZ2h0d2VpZ2h0IGRldGVjdGlvbiB0aGF0IHdvcmtzIGluIGFsbCBlbnZpcm9ubWVudHMuXG4gKi9cbmZ1bmN0aW9uIGRldGVjdEVudmlyb25tZW50KCk6ICdicm93c2VyJyB8ICdsYW1iZGEnIHwgJ2Nkaycge1xuICAvLyBCcm93c2VyIGRldGVjdGlvblxuICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gJ2Jyb3dzZXInO1xuICB9XG5cbiAgLy8gTGFtYmRhIGRldGVjdGlvblxuICBpZiAodHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIHByb2Nlc3MuZW52Py5BV1NfTEFNQkRBX0ZVTkNUSU9OX05BTUUpIHtcbiAgICByZXR1cm4gJ2xhbWJkYSc7XG4gIH1cblxuICAvLyBDREsgZGV0ZWN0aW9uXG4gIGlmICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnY/LlBVUkVOT1dfTU9ERSA9PT0gJ2NkaycpIHtcbiAgICAgIHJldHVybiAnY2RrJztcbiAgICB9XG4gICAgaWYgKHByb2Nlc3MuZW52Py5DREtfREVGQVVMVF9BQ0NPVU5UIHx8IHByb2Nlc3MuZW52Py5DREtfREVGQVVMVF9SRUdJT04pIHtcbiAgICAgIHJldHVybiAnY2RrJztcbiAgICB9XG4gICAgaWYgKHByb2Nlc3MuYXJndj8uc29tZShhcmcgPT4gYXJnLmluY2x1ZGVzKCdjZGsnKSB8fCBhcmcuaW5jbHVkZXMoJ3N5bnRoJykpKSB7XG4gICAgICByZXR1cm4gJ2Nkayc7XG4gICAgfVxuICB9XG5cbiAgLy8gRGVmYXVsdCB0byBDREsgZm9yIE5vZGUuanMgZW52aXJvbm1lbnRzIChidWlsZCB0aW1lKVxuICByZXR1cm4gJ2Nkayc7XG59XG5cbi8qKlxuICogVmFsaWRhdGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIGdpdmVuIGVudmlyb25tZW50LlxuICogTGlnaHR3ZWlnaHQgdmFsaWRhdGlvbiB0aGF0IHdvcmtzIGluIGFsbCBlbnZpcm9ubWVudHMuXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlQ29uZmlnKGNvbmZpZzogUnVudGltZVdlYkNvbmZpZywgaXNDREtDb250ZXh0OiBib29sZWFuKTogeyB2YWxpZDogYm9vbGVhbjsgZXJyb3JzOiBzdHJpbmdbXSB9IHtcbiAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIC8vIFNlcnZpY2UgbmFtZSB2YWxpZGF0aW9uXG4gIGlmICghY29uZmlnLnNlcnZpY2VOYW1lIHx8ICEvXlthLXpBLVpdW2EtekEtWjAtOS1dezAsMTI3fSQvLnRlc3QoY29uZmlnLnNlcnZpY2VOYW1lKSkge1xuICAgIGVycm9ycy5wdXNoKCdzZXJ2aWNlTmFtZSBtdXN0IHN0YXJ0IHdpdGggYSBsZXR0ZXIsIGNvbnRhaW4gb25seSBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBhbmQgaHlwaGVucywgYW5kIGJlIG1heCAxMjggY2hhcmFjdGVycycpO1xuICB9XG5cbiAgLy8gU3RhZ2UgdmFsaWRhdGlvblxuICBpZiAoIVsnZGV2JywgJ3N0YWdpbmcnLCAncHJvZCddLmluY2x1ZGVzKGNvbmZpZy5zdGFnZSkpIHtcbiAgICBlcnJvcnMucHVzaCgnc3RhZ2UgbXVzdCBiZSBvbmUgb2Y6IGRldiwgc3RhZ2luZywgcHJvZCcpO1xuICB9XG5cbiAgLy8gSW5mcmEgdmFsaWRhdGlvbiBmb3IgQ0RLIGNvbnRleHRcbiAgaWYgKGlzQ0RLQ29udGV4dCAmJiAhY29uZmlnLmluZnJhKSB7XG4gICAgZXJyb3JzLnB1c2goJ2luZnJhIGNvbmZpZ3VyYXRpb24gaXMgcmVxdWlyZWQgaW4gQ0RLIGNvbnRleHQnKTtcbiAgfVxuXG4gIHJldHVybiB7IHZhbGlkOiBlcnJvcnMubGVuZ3RoID09PSAwLCBlcnJvcnMgfTtcbn1cblxuLyoqXG4gKiBVbmlmaWVkIGVudHJ5IHBvaW50IGZvciBSdW50aW1lIFRhcmdldCBDb3JlLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgYSBzaW5nbGUgQVBJIHRoYXQgd29ya3MgYWNyb3NzIGFsbCBleGVjdXRpb24gY29udGV4dHM6XG4gKiAtICoqQnJvd3NlcioqOiBIeWRyYXRlcyBSZWFjdCBhcHBsaWNhdGlvbiB3aXRoIGNsaWVudC1zaWRlIHJvdXRpbmdcbiAqIC0gKipMYW1iZGEqKjogRXhlY3V0ZXMgc2VydmVyLXNpZGUgcmVuZGVyaW5nIGFuZCBidXNpbmVzcyBsb2dpYyB3aXRoIERJXG4gKiAtICoqQ0RLKio6IFN5bnRoZXNpemVzIENsb3VkRm9ybWF0aW9uIGluZnJhc3RydWN0dXJlIHRlbXBsYXRlc1xuICpcbiAqIFRoZSBmdW5jdGlvbiBhdXRvbWF0aWNhbGx5IGRldGVjdHMgdGhlIHJ1bnRpbWUgZW52aXJvbm1lbnQgYW5kIHJvdXRlc1xuICogZXhlY3V0aW9uIHRvIHRoZSBhcHByb3ByaWF0ZSBwaXBlbGluZSB3aXRob3V0IHVzZXIgaW50ZXJ2ZW50aW9uLlxuICpcbiAqICoqTm90ZSoqOiBGb3IgTGFtYmRhIGFuZCBDREsgY29udGV4dHMsIHVzZSB0aGUgc2VydmVyLXNpZGUgZW50cnkgcG9pbnRcbiAqIGZyb20gYEBjb3JlL3J1bnRpbWUtd2ViYCBpbnN0ZWFkLiBUaGlzIGJyb3dzZXItY29tcGF0aWJsZSB2ZXJzaW9uXG4gKiBvbmx5IHN1cHBvcnRzIGJyb3dzZXIgaHlkcmF0aW9uLlxuICpcbiAqIEBwYXJhbSBjb25maWcgLSBVbmlmaWVkIGNvbmZpZ3VyYXRpb24gZm9yIGFsbCBjb250ZXh0c1xuICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gZXhlY3V0aW9uIGNvbXBsZXRlc1xuICogQHRocm93cyBDb25maWdWYWxpZGF0aW9uRXJyb3IgaWYgY29uZmlndXJhdGlvbiBpcyBpbnZhbGlkXG4gKiBAdGhyb3dzIEVudmlyb25tZW50RGV0ZWN0aW9uRXJyb3IgaWYgZW52aXJvbm1lbnQgY2Fubm90IGJlIGRldGVjdGVkXG4gKiBAdGhyb3dzIEVycm9yIGlmIGV4ZWN1dGlvbiBmYWlsc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBwdXJlbm93IH0gZnJvbSAnQHdvcmt0aWYvcHVyZW5vdy9ydW50aW1lLXdlYic7XG4gKiBpbXBvcnQgeyBQdXJlbm93Um91dGVyIH0gZnJvbSAnQHdvcmt0aWYvcHVyZW5vdyc7XG4gKlxuICogcHVyZW5vdyh7XG4gKiAgIGFwcDogKHsgcm91dGVyIH0pID0+IDxBcHAgcm91dGVyPXtyb3V0ZXJ9IC8+LFxuICogICByb3V0ZXI6IG5ldyBQdXJlbm93Um91dGVyKHsgcm91dGVzLCBkZWZhdWx0czoge30gfSksXG4gKiAgIHNlcnZpY2VOYW1lOiAnbXktYXBwJyxcbiAqICAgc3RhZ2U6ICdkZXYnLFxuICogICByZWdpc3Rlcjoge1xuICogICAgIHBheW1lbnRzOiB7XG4gKiAgICAgICB0aWVzOiBbUGF5bWVudHNUaWVzXSxcbiAqICAgICAgIGxhbWJkYXM6IFtjaGFyZ2VIYW5kbGVyLCByZWZ1bmRIYW5kbGVyXVxuICogICAgIH1cbiAqICAgfSxcbiAqICAgaW5mcmE6IHtcbiAqICAgICBlbnY6IHsgYWNjb3VudDogJzEyMzQ1Njc4OTAxMicsIHJlZ2lvbjogJ3VzLWVhc3QtMScgfSxcbiAqICAgICBzdGFnZTogJ2RldicsXG4gKiAgICAgcmVhY3RFbnRyeTogJy4vc3JjL2luZGV4LnRzeCcsXG4gKiAgICAgYXBpTW9kZTogJ2FwaUdhdGV3YXknXG4gKiAgIH1cbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwdXJld2ViKGNvbmZpZzogUnVudGltZVdlYkNvbmZpZyk6IHZvaWQge1xuICAvLyAxLiBEZXRlY3QgcnVudGltZSBlbnZpcm9ubWVudCB1c2luZyBsaWdodHdlaWdodCBkZXRlY3Rpb25cbiAgY29uc3QgZW52VHlwZSA9IGRldGVjdEVudmlyb25tZW50KCk7XG4gIGNvbnN0IGlzQ0RLQ29udGV4dCA9IGVudlR5cGUgPT09ICdjZGsnO1xuXG4gIC8vIDIuIFZhbGlkYXRlIGNvbmZpZ3VyYXRpb25cbiAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IHZhbGlkYXRlQ29uZmlnKGNvbmZpZywgaXNDREtDb250ZXh0KTtcblxuICBpZiAoIXZhbGlkYXRpb25SZXN1bHQudmFsaWQpIHtcbiAgICB0aHJvdyBuZXcgQ29uZmlnVmFsaWRhdGlvbkVycm9yKHZhbGlkYXRpb25SZXN1bHQuZXJyb3JzKTtcbiAgfVxuXG4gIC8vIDMuIFJvdXRlIHRvIGFwcHJvcHJpYXRlIHBpcGVsaW5lIGJhc2VkIG9uIGVudmlyb25tZW50XG4gIHN3aXRjaCAoZW52VHlwZSkge1xuICAgIGNhc2UgJ2Jyb3dzZXInOiB7XG4gICAgICAvLyBCcm93c2VyIHBpcGVsaW5lIC0gaHlkcmF0ZSBSZWFjdCBhcHBcbiAgICAgIC8vIFRoaXMgaXMgdGhlIG9ubHkgcGF0aCB0aGF0IHJ1bnMgaW4gdGhlIGJyb3dzZXJcbiAgICAgIHB1cmVub3coe1xuICAgICAgICBhcHA6ICh7IHJvdXRlciB9KSA9PiBjb25maWcuYXBwKHsgcm91dGVyIH0pLFxuICAgICAgICByb3V0ZXI6IHB1cmVub3dSb3V0ZXIoe1xuICAgICAgICAgIHJvdXRlcjogY29uZmlnLnJvdXRlci5nZXRSb3V0ZXMoKSBhcyBQdXJlbm93Um91dGVbXSxcbiAgICAgICAgICBkZWZhdWx0czogY29uZmlnLnJvdXRlci5kZWZhdWx0cyBhcyBQdXJlbm93Um91dGVyRGVmYXVsdHMsXG4gICAgICAgIH0pLFxuICAgICAgICBjb25maWc6IHtcbiAgICAgICAgICBzZXJ2aWNlTmFtZTogY29uZmlnLnNlcnZpY2VOYW1lLFxuICAgICAgICAgIHN0YWdlOiBjb25maWcuc3RhZ2UsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGNhc2UgJ2xhbWJkYSc6XG4gICAgY2FzZSAnY2RrJzoge1xuICAgICAgLy8gTGFtYmRhIGFuZCBDREsgcGlwZWxpbmVzIHJlcXVpcmUgc2VydmVyLXNpZGUgY29kZVxuICAgICAgLy8gVGhlc2Ugc2hvdWxkIHVzZSB0aGUgc2VydmVyLXNpZGUgZW50cnkgcG9pbnQgZnJvbSBAY29yZS9ydW50aW1lLXdlYlxuICAgICAgY29uc29sZS5sb2coJ1tSdW50aW1lXSBTZXJ2ZXItc2lkZSBwaXBlbGluZSBkZXRlY3RlZCAoJXMpJywgZW52VHlwZSk7XG4gICAgICBwdXJlbm93KHtcbiAgICAgICAgYXBwOiAoeyByb3V0ZXIgfSkgPT4gY29uZmlnLmFwcCh7IHJvdXRlciB9KSxcbiAgICAgICAgcm91dGVyOiBwdXJlbm93Um91dGVyKHtcbiAgICAgICAgICByb3V0ZXI6IGNvbmZpZy5yb3V0ZXIuZ2V0Um91dGVzKCkgYXMgUHVyZW5vd1JvdXRlW10sXG4gICAgICAgICAgZGVmYXVsdHM6IGNvbmZpZy5yb3V0ZXIuZGVmYXVsdHMgYXMgUHVyZW5vd1JvdXRlckRlZmF1bHRzLFxuICAgICAgICB9KSxcbiAgICAgICAgY29uZmlnOiB7XG4gICAgICAgICAgc2VydmljZU5hbWU6IGNvbmZpZy5zZXJ2aWNlTmFtZSxcbiAgICAgICAgICBzdGFnZTogY29uZmlnLnN0YWdlLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBicmVhaztcbiAgICAgIC8vIGNvbnNvbGUubG9nKCdbUnVudGltZSBXZWJdIExhbWJkYSBydW50aW1lIGRldGVjdGVkLCBza2lwcGluZyBicm93c2VyIHJlbmRlcmluZyBwaXBlbGluZScpO1xuICAgICAgLy8gdGhyb3cgbmV3IEVudmlyb25tZW50RGV0ZWN0aW9uRXJyb3IoXG4gICAgICAvLyAgIGBTZXJ2ZXItc2lkZSBlbnZpcm9ubWVudCBkZXRlY3RlZCAoJHtlbnZUeXBlfSkuIGAgK1xuICAgICAgLy8gICBgVXNlIHRoZSBzZXJ2ZXItc2lkZSBlbnRyeSBwb2ludCBmcm9tICdAY29yZS9ydW50aW1lLXdlYicgZm9yIExhbWJkYSBhbmQgQ0RLIGNvbnRleHRzLmAsXG4gICAgICAvLyApO1xuICAgIH1cblxuICAgIGRlZmF1bHQ6XG4gICAgICBjb25zb2xlLmxvZygnW1J1bnRpbWUgV2ViXSBVbmtub3duIGVudmlyb25tZW50IHR5cGU6ICVzJywgZW52VHlwZSk7XG4gICAgICBicmVhaztcbiAgICAvLyB0aHJvdyBuZXcgRW52aXJvbm1lbnREZXRlY3Rpb25FcnJvcihcbiAgICAvLyAgIGBVbmtub3duIGVudmlyb25tZW50IHR5cGU6ICR7ZW52VHlwZX1gLFxuICAgIC8vICk7XG4gIH1cbn1cblxuXG4iLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IHdvcmt0aWYucHVyZW5vdy5jZGsgPHdvcmt0aWZfcHVyZW5vd19jZGs+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0yMiwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG5cbmltcG9ydCB0eXBlIHsgUHVyZW5vd0NvbmZpZyB9IGZyb20gJ0B3b3JrdGlmL3B1cmVub3cnO1xuXG4vKipcbiAqIFJ1bnRpbWUtc3BlY2lmaWMgY29uZmlndXJhdGlvbiB0aGF0IGV4dGVuZHMgUHVyZW5vd0NvbmZpZy5cbiAqXG4gKiBUaGlzIGludGVyZmFjZSBhZGRzIHJ1bnRpbWUgd29ya3NwYWNlIGZ1bmN0aW9uYWxpdHkgd2hpbGUgcHJlc2VydmluZ1xuICogYWxsIGV4aXN0aW5nIHB1cmVub3cgY29uZmlndXJhdGlvbiBvcHRpb25zLiBUaGUgcnVudGltZSBjb25maWd1cmF0aW9uXG4gKiBpcyBtZXJnZWQgd2l0aCBwdXJlbm93IGNvbmZpZ3VyYXRpb24gcmF0aGVyIHRoYW4gcmVwbGFjaW5nIGl0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJ1bnRpbWVDb25maWcgZXh0ZW5kcyBQdXJlbm93Q29uZmlnIHtcbiAgLyoqXG4gICAqIFJ1bnRpbWUtc3BlY2lmaWMgY29uZmlndXJhdGlvbiBvcHRpb25zLlxuICAgKiBUaGVzZSBzZXR0aW5ncyBleHRlbmQgcHVyZW5vdyBmdW5jdGlvbmFsaXR5IHdpdGhvdXQgcmVwbGFjaW5nIGl0LlxuICAgKi9cbiAgcnVudGltZT86IHtcbiAgICAvKiogRW5hYmxlIFJ1bnRpbWUgQ29yZSBzdGFjayBkZXBsb3ltZW50IChleHRlbmRzIHB1cmVub3cncyB0d28tc3RhY2sgYXJjaGl0ZWN0dXJlKSAqL1xuICAgIGVuYWJsZVRoaXJkU3RhY2s/OiBib29sZWFuO1xuXG4gICAgLyoqIFJ1bnRpbWUgd2ViIG1vZGUgY29uZmlndXJhdGlvbiAqL1xuICAgIHJ1bnRpbWVXZWJNb2RlPzogJ2RldmVsb3BtZW50JyB8ICdwcm9kdWN0aW9uJztcblxuICAgIC8qKiBBZGRpdGlvbmFsIHJ1bnRpbWUgZmVhdHVyZXMgdG8gZW5hYmxlICovXG4gICAgYWRkaXRpb25hbEZlYXR1cmVzPzogc3RyaW5nW107XG5cbiAgICAvKiogRGV2ZWxvcG1lbnQgc2VydmVyIGVuaGFuY2VtZW50cyAqL1xuICAgIGRldlNlcnZlckVuaGFuY2VtZW50cz86IHtcbiAgICAgIC8qKiBFbmFibGUgaG90IG1vZHVsZSByZXBsYWNlbWVudCAqL1xuICAgICAgaG90UmVsb2FkPzogYm9vbGVhbjtcbiAgICAgIC8qKiBFbmFibGUgZGVidWcgbW9kZSB3aXRoIGFkZGl0aW9uYWwgbG9nZ2luZyAqL1xuICAgICAgZGVidWdNb2RlPzogYm9vbGVhbjtcbiAgICAgIC8qKiBFbmFibGUgcGVyZm9ybWFuY2UgbW9uaXRvcmluZyAqL1xuICAgICAgcGVyZm9ybWFuY2VNb25pdG9yaW5nPzogYm9vbGVhbjtcbiAgICB9O1xuXG4gICAgLyoqIEJ1aWxkIG9wdGltaXphdGlvbnMgKi9cbiAgICBidWlsZE9wdGltaXphdGlvbnM/OiB7XG4gICAgICAvKiogRW5hYmxlIGJ1bmRsZSBhbmFseXNpcyAqL1xuICAgICAgYnVuZGxlQW5hbHlzaXM/OiBib29sZWFuO1xuICAgICAgLyoqIEVuYWJsZSB0cmVlIHNoYWtpbmcgKi9cbiAgICAgIHRyZWVzaGFraW5nPzogYm9vbGVhbjtcbiAgICAgIC8qKiBFbmFibGUgY29kZSBtaW5pZmljYXRpb24gKi9cbiAgICAgIGNvZGVNaW5pZmljYXRpb24/OiBib29sZWFuO1xuICAgIH07XG4gIH07XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBtZXJnaW5nIHV0aWxpdHkgdGhhdCBwcmVzZXJ2ZXMgYWxsIHB1cmVub3cgc2V0dGluZ3NcbiAqIHdoaWxlIGFkZGluZyBydW50aW1lLXNwZWNpZmljIGV4dGVuc2lvbnMuXG4gKlxuICogQHBhcmFtIHB1cmVub3dDb25maWcgLSBCYXNlIHB1cmVub3cgY29uZmlndXJhdGlvblxuICogQHBhcmFtIHJ1bnRpbWVDb25maWcgLSBSdW50aW1lLXNwZWNpZmljIGNvbmZpZ3VyYXRpb24gdG8gbWVyZ2VcbiAqIEByZXR1cm5zIE1lcmdlZCBjb25maWd1cmF0aW9uIHdpdGggYWxsIHB1cmVub3cgc2V0dGluZ3MgcHJlc2VydmVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZVJ1bnRpbWVDb25maWcoXG4gIHB1cmVub3dDb25maWc6IFB1cmVub3dDb25maWcsXG4gIHJ1bnRpbWVDb25maWc/OiBQYXJ0aWFsPFJ1bnRpbWVDb25maWdbJ3J1bnRpbWUnXT4sXG4pOiBSdW50aW1lQ29uZmlnIHtcbiAgcmV0dXJuIHtcbiAgICAuLi5wdXJlbm93Q29uZmlnLFxuICAgIHJ1bnRpbWU6IHtcbiAgICAgIGVuYWJsZVRoaXJkU3RhY2s6IGZhbHNlLFxuICAgICAgcnVudGltZVdlYk1vZGU6ICdkZXZlbG9wbWVudCcsXG4gICAgICBhZGRpdGlvbmFsRmVhdHVyZXM6IFtdLFxuXG4gICAgICAvLyBAdG9kbzogY3JpdGlhbCB0byBpbXByb3ZlIHRoaXMgc29sdXRpb24uIE90aGVyd2lzZSBcdTIwMTM+IFVOTkVDRVNTQVJZIE9QVElPTlMgVE9UQUxMWVxuICAgICAgZGV2U2VydmVyRW5oYW5jZW1lbnRzOiB7XG4gICAgICAgIGhvdFJlbG9hZDogdHJ1ZSxcbiAgICAgICAgZGVidWdNb2RlOiBmYWxzZSxcbiAgICAgICAgcGVyZm9ybWFuY2VNb25pdG9yaW5nOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICBidWlsZE9wdGltaXphdGlvbnM6IHtcbiAgICAgICAgYnVuZGxlQW5hbHlzaXM6IGZhbHNlLFxuICAgICAgICB0cmVlc2hha2luZzogdHJ1ZSxcbiAgICAgICAgY29kZU1pbmlmaWNhdGlvbjogdHJ1ZSxcbiAgICAgIH0sXG4gICAgICAuLi5ydW50aW1lQ29uZmlnLFxuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogVHlwZSBndWFyZCB0byBjaGVjayBpZiBhIGNvbmZpZ3VyYXRpb24gaXMgYSBSdW50aW1lQ29uZmlnLlxuICpcbiAqIEBwYXJhbSBjb25maWcgLSBDb25maWd1cmF0aW9uIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBjb25maWd1cmF0aW9uIGhhcyBydW50aW1lLXNwZWNpZmljIHByb3BlcnRpZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUnVudGltZUNvbmZpZyhjb25maWc6IGFueSk6IGNvbmZpZyBpcyBSdW50aW1lQ29uZmlnIHtcbiAgcmV0dXJuICEhKGNvbmZpZyAmJiB0eXBlb2YgY29uZmlnID09PSAnb2JqZWN0JyAmJiAncnVudGltZScgaW4gY29uZmlnKTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0IHJ1bnRpbWUtc3BlY2lmaWMgY29uZmlndXJhdGlvbiBmcm9tIGEgUnVudGltZUNvbmZpZy5cbiAqXG4gKiBAcGFyYW0gY29uZmlnIC0gUnVudGltZUNvbmZpZyB0byBleHRyYWN0IGZyb21cbiAqIEByZXR1cm5zIFJ1bnRpbWUtc3BlY2lmaWMgY29uZmlndXJhdGlvbiBvciB1bmRlZmluZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RSdW50aW1lQ29uZmlnKGNvbmZpZzogUnVudGltZUNvbmZpZyk6IFJ1bnRpbWVDb25maWdbJ3J1bnRpbWUnXSB7XG4gIHJldHVybiBjb25maWcucnVudGltZTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBSdW50aW1lQ29uZmlnIGZyb20gYSBiYXNlIFB1cmVub3dDb25maWcgd2l0aCBkZWZhdWx0IHJ1bnRpbWUgc2V0dGluZ3MuXG4gKlxuICogQHBhcmFtIHB1cmVub3dDb25maWcgLSBCYXNlIHB1cmVub3cgY29uZmlndXJhdGlvblxuICogQHJldHVybnMgUnVudGltZUNvbmZpZyB3aXRoIGRlZmF1bHQgcnVudGltZSBzZXR0aW5nc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUnVudGltZUNvbmZpZyhwdXJlbm93Q29uZmlnOiBQdXJlbm93Q29uZmlnKTogUnVudGltZUNvbmZpZyB7XG4gIHJldHVybiBtZXJnZVJ1bnRpbWVDb25maWcocHVyZW5vd0NvbmZpZyk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiQUFpQkEsV0FBYyxtQkNEZCxVQUFZQSxNQUFXLFFBQ3ZCLE9BQVMsZUFBQUMsTUFBbUIsbUJBQzVCLE9BQVMsdUJBQUFDLEVBQXFCLGtCQUFBQyxNQUFzQixlQThCN0MsSUFBTUMsRUFBTixLQUFzQixDQTRCM0IsTUFBTSxRQUFRQyxFQUEwQkMsRUFBd0UsQ0FDOUcsR0FBSSxDQUNGLFFBQVEsS0FBSyxzQ0FBdUMsQ0FDbEQsWUFBYUQsRUFBTyxZQUNwQixNQUFPQSxFQUFPLE1BQ2QsSUFBS0MsRUFBUSxTQUFTLElBQ3RCLFVBQVdBLEVBQVEsU0FBUyxVQUM1QixTQUFVQSxFQUFRLFNBQVMsUUFDN0IsQ0FBQyxFQUdELElBQU1DLEVBQWdC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R0FDWCxVQUFXLEdBQ1gsc0JBQXVCLEVBQ3pCLEVBQ0EsbUJBQW9CLENBQ2xCLGVBQWdCLEdBQ2hCLFlBQWEsR0FDYixpQkFBa0IsRUFDcEIsRUFDQSxHQUFHQyxDQUNMLENBQ0YsQ0FDRixDQVFPLFNBQVNDLEVBQWdCQyxFQUFzQyxDQUNwRSxNQUFPLENBQUMsRUFBRUEsR0FBVSxPQUFPQSxHQUFXLFVBQVksWUFBYUEsRUFDakUsQ0FRTyxTQUFTQyxFQUFxQkQsRUFBaUQsQ0FDcEYsT0FBT0EsRUFBTyxPQUNoQixDQVFPLFNBQVNFLEVBQW9CTCxFQUE2QyxDQUMvRSxPQUFPRCxFQUFtQkMsQ0FBYSxDQUN6QyIsCiAgIm5hbWVzIjogWyJSZWFjdCIsICJoeWRyYXRlUm9vdCIsICJjcmVhdGVCcm93c2VyUm91dGVyIiwgIlJvdXRlclByb3ZpZGVyIiwgIkJyb3dzZXJQaXBlbGluZSIsICJjb25maWciLCAiY29udGV4dCIsICJicm93c2VyUm91dGVyIiwgImFwcEVsZW1lbnQiLCAicm91dGVyUHJvdmlkZXIiLCAiZXJyb3IiLCAicm91dGVzIiwgImNvbnRhaW5lciIsICJiYXNlVXJsIiwgInN0YWdlIiwgImlzVmFsaWRTZXJ2aWNlTmFtZSIsICJzZXJ2aWNlTmFtZSIsICJwdXJlbm93IiwgInB1cmVub3dSb3V0ZXIiLCAiQ29uZmlnVmFsaWRhdGlvbkVycm9yIiwgImVycm9ycyIsICJFbnZpcm9ubWVudERldGVjdGlvbkVycm9yIiwgIm1lc3NhZ2UiLCAiZGV0ZWN0RW52aXJvbm1lbnQiLCAiYXJnIiwgInZhbGlkYXRlQ29uZmlnIiwgImNvbmZpZyIsICJpc0NES0NvbnRleHQiLCAicHVyZXdlYiIsICJlbnZUeXBlIiwgInZhbGlkYXRpb25SZXN1bHQiLCAicm91dGVyIiwgIm1lcmdlUnVudGltZUNvbmZpZyIsICJwdXJlbm93Q29uZmlnIiwgInJ1bnRpbWVDb25maWciLCAiaXNSdW50aW1lQ29uZmlnIiwgImNvbmZpZyIsICJleHRyYWN0UnVudGltZUNvbmZpZyIsICJjcmVhdGVSdW50aW1lQ29uZmlnIl0KfQo=
@@ -0,0 +1,14 @@
1
+ import { CommandResult, Logger } from '@worktif/purenow/bin';
2
+ /**
3
+ * Options for the build command
4
+ */
5
+ export interface BuildOptions {
6
+ /** Specific target to build (react, lambda, cdk, or all) */
7
+ target?: 'react' | 'lambda' | 'cdk' | 'all';
8
+ }
9
+ /**
10
+ * Build application targets
11
+ */
12
+ export declare function buildCommand(options: BuildOptions, config: any, // TODO: Use proper PurenowCliConfig type
13
+ logger: Logger, cwd?: string, envValidator?: any): Promise<CommandResult>;
14
+ //# sourceMappingURL=build.command.d.ts.map
@@ -1,3 +1,4 @@
1
1
  import 'reflect-metadata';
2
2
  export { RuntimeWebDeploymentService } from './runtime-web-deployment.service';
3
+ export { buildCommand, type BuildOptions } from './build.command';
3
4
  //# sourceMappingURL=index.d.ts.map
@@ -12,6 +12,10 @@ import { PurenowRuntimeCliContext } from './services';
12
12
  export declare class RuntimeWebCli extends PurenowCli {
13
13
  static defaultToolName: string;
14
14
  constructor();
15
+ /**
16
+ * Add runtime-specific build commands
17
+ */
18
+ private addBuildCommands;
15
19
  /**
16
20
  * Create Purenow-specific context with all required services
17
21
  */
@@ -1,6 +1,6 @@
1
1
  import { PureContainer } from '@worktif/utils';
2
2
  import type { LambdaDefinition } from '../../../lib/runtime-web/types';
3
- import type { RuntimeWebLambdaHandler } from './runtime-web-lambda-handler';
3
+ import { RuntimeWebLambdaHandler } from './runtime-web-lambda-handler';
4
4
  /**
5
5
  * Factory for creating Lambda handlers with dependency injection.
6
6
  *
@@ -1 +1 @@
1
- {"version":3,"file":"lambda-handler-factory.d.ts","sourceRoot":"","sources":["../../../../../../src/core/runtime-web/factory/lambda-handler-factory.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAmB,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEhE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAG/D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAE5E;;;;;;;;;;;;;;;GAeG;AACH,qBACa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;;IAQhC;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,MAAM,CAAC,UAAU,EAAE,gBAAgB,EAAE,SAAS,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,uBAAuB;IAY/F;;;;;;;;;;;;;;;;;;OAkBG;IACH,kBAAkB,CAChB,IAAI,EAAE,KAAK,CAAC,KAAK,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,EAChD,SAAS,EAAE,aAAa,CAAC,MAAM,CAAC,GAC/B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAqC1B;;;;;;;;;;;;;;;;;;OAkBG;IACH,WAAW,CACT,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,EAC/D,QAAQ,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GACxC,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC;IAIzD;;;;;;;;;;;;;;;;OAgBG;IACH,OAAO,CAAC,WAAW;CAGpB"}
1
+ {"version":3,"file":"lambda-handler-factory.d.ts","sourceRoot":"","sources":["../../../../../../src/core/runtime-web/factory/lambda-handler-factory.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAmB,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEhE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE/D,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAEvE;;;;;;;;;;;;;;;GAeG;AACH,qBACa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;;IAQhC;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,MAAM,CAAC,UAAU,EAAE,gBAAgB,EAAE,SAAS,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,uBAAuB;IAU/F;;;;;;;;;;;;;;;;;;OAkBG;IACH,kBAAkB,CAChB,IAAI,EAAE,KAAK,CAAC,KAAK,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,EAChD,SAAS,EAAE,aAAa,CAAC,MAAM,CAAC,GAC/B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAqC1B;;;;;;;;;;;;;;;;;;OAkBG;IACH,WAAW,CACT,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,EAC/D,QAAQ,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GACxC,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC;IAIzD;;;;;;;;;;;;;;;;OAgBG;IACH,OAAO,CAAC,WAAW;CAGpB"}
@@ -121,6 +121,9 @@ export declare class LambdaBuilder extends Construct implements PurenowInfraReso
121
121
  *
122
122
  * // @todp: here smth wrong I see
123
123
  *
124
+ * @todo: complete requried CommonJS for Lambda if it does not work
125
+ * Revert old version whether it does not work
126
+ *
124
127
  * @param definition - Lambda definition
125
128
  * @returns Lambda Code asset
126
129
  * @private