@worktif/runtime 0.3.0-edge.38 → 0.3.0-edge.39

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.
@@ -14,7 +14,7 @@
14
14
  "info": "runtime info"
15
15
  },
16
16
  "dependencies": {
17
- "@worktif/runtime": "^0.3.0-edge.38",
17
+ "@worktif/runtime": "^0.3.0-edge.39",
18
18
  "react": "^19.1.1",
19
19
  "react-dom": "^19.1.1",
20
20
  "react-router": "^7.7.1"
@@ -14,7 +14,7 @@
14
14
  "info": "runtime info"
15
15
  },
16
16
  "dependencies": {
17
- "@worktif/runtime": "^0.3.0-edge.38",
17
+ "@worktif/runtime": "^0.3.0-edge.39",
18
18
  "react": "^19.1.1",
19
19
  "react-dom": "^19.1.1",
20
20
  "react-router": "^7.7.1"
@@ -1,8 +1,8 @@
1
- "use strict";var Ge=Object.create;var h=Object.defineProperty;var We=Object.getOwnPropertyDescriptor;var Qe=Object.getOwnPropertyNames;var Ye=Object.getPrototypeOf,Ve=Object.prototype.hasOwnProperty;var N=(e,r)=>()=>(r||e((r={exports:{}}).exports,r),r.exports),je=(e,r)=>{for(var t in r)h(e,t,{get:r[t],enumerable:!0})},ee=(e,r,t,n)=>{if(r&&typeof r=="object"||typeof r=="function")for(let i of Qe(r))!Ve.call(e,i)&&i!==t&&h(e,i,{get:()=>r[i],enumerable:!(n=We(r,i))||n.enumerable});return e};var f=(e,r,t)=>(t=e!=null?Ge(Ye(e)):{},ee(r||!e||!e.__esModule?h(t,"default",{value:e,enumerable:!0}):t,e)),ke=e=>ee(h({},"__esModule",{value:!0}),e);var $=N(o=>{"use strict";Object.defineProperty(o,"__esModule",{value:!0});o.USE_PROXY=o.UNSUPPORTED_MEDIA_TYPE=o.UNPROCESSABLE_ENTITY=o.UNAUTHORIZED=o.TOO_MANY_REQUESTS=o.TEMPORARY_REDIRECT=o.SWITCHING_PROTOCOLS=o.SERVICE_UNAVAILABLE=o.SEE_OTHER=o.RESET_CONTENT=o.REQUESTED_RANGE_NOT_SATISFIABLE=o.REQUEST_URI_TOO_LONG=o.REQUEST_TOO_LONG=o.REQUEST_TIMEOUT=o.REQUEST_HEADER_FIELDS_TOO_LARGE=o.PROXY_AUTHENTICATION_REQUIRED=o.PROCESSING=o.PRECONDITION_REQUIRED=o.PRECONDITION_FAILED=o.PERMANENT_REDIRECT=o.PAYMENT_REQUIRED=o.PARTIAL_CONTENT=o.OK=o.NOT_MODIFIED=o.NOT_IMPLEMENTED=o.NOT_FOUND=o.NOT_ACCEPTABLE=o.NON_AUTHORITATIVE_INFORMATION=o.NO_CONTENT=o.NETWORK_AUTHENTICATION_REQUIRED=o.MULTIPLE_CHOICES=o.MULTI_STATUS=o.MOVED_TEMPORARILY=o.MOVED_PERMANENTLY=o.METHOD_NOT_ALLOWED=o.METHOD_FAILURE=o.LOCKED=o.LENGTH_REQUIRED=o.INTERNAL_SERVER_ERROR=o.INSUFFICIENT_STORAGE=o.INSUFFICIENT_SPACE_ON_RESOURCE=o.IM_A_TEAPOT=o.HTTP_VERSION_NOT_SUPPORTED=o.GONE=o.GATEWAY_TIMEOUT=o.FORBIDDEN=o.FAILED_DEPENDENCY=o.EXPECTATION_FAILED=o.CREATED=o.CONTINUE=o.CONFLICT=o.BAD_REQUEST=o.BAD_GATEWAY=o.ACCEPTED=void 0;o.ACCEPTED=202;o.BAD_GATEWAY=502;o.BAD_REQUEST=400;o.CONFLICT=409;o.CONTINUE=100;o.CREATED=201;o.EXPECTATION_FAILED=417;o.FAILED_DEPENDENCY=424;o.FORBIDDEN=403;o.GATEWAY_TIMEOUT=504;o.GONE=410;o.HTTP_VERSION_NOT_SUPPORTED=505;o.IM_A_TEAPOT=418;o.INSUFFICIENT_SPACE_ON_RESOURCE=419;o.INSUFFICIENT_STORAGE=507;o.INTERNAL_SERVER_ERROR=500;o.LENGTH_REQUIRED=411;o.LOCKED=423;o.METHOD_FAILURE=420;o.METHOD_NOT_ALLOWED=405;o.MOVED_PERMANENTLY=301;o.MOVED_TEMPORARILY=302;o.MULTI_STATUS=207;o.MULTIPLE_CHOICES=300;o.NETWORK_AUTHENTICATION_REQUIRED=511;o.NO_CONTENT=204;o.NON_AUTHORITATIVE_INFORMATION=203;o.NOT_ACCEPTABLE=406;o.NOT_FOUND=404;o.NOT_IMPLEMENTED=501;o.NOT_MODIFIED=304;o.OK=200;o.PARTIAL_CONTENT=206;o.PAYMENT_REQUIRED=402;o.PERMANENT_REDIRECT=308;o.PRECONDITION_FAILED=412;o.PRECONDITION_REQUIRED=428;o.PROCESSING=102;o.PROXY_AUTHENTICATION_REQUIRED=407;o.REQUEST_HEADER_FIELDS_TOO_LARGE=431;o.REQUEST_TIMEOUT=408;o.REQUEST_TOO_LONG=413;o.REQUEST_URI_TOO_LONG=414;o.REQUESTED_RANGE_NOT_SATISFIABLE=416;o.RESET_CONTENT=205;o.SEE_OTHER=303;o.SERVICE_UNAVAILABLE=503;o.SWITCHING_PROTOCOLS=101;o.TEMPORARY_REDIRECT=307;o.TOO_MANY_REQUESTS=429;o.UNAUTHORIZED=401;o.UNPROCESSABLE_ENTITY=422;o.UNSUPPORTED_MEDIA_TYPE=415;o.USE_PROXY=305;o.default={ACCEPTED:o.ACCEPTED,BAD_GATEWAY:o.BAD_GATEWAY,BAD_REQUEST:o.BAD_REQUEST,CONFLICT:o.CONFLICT,CONTINUE:o.CONTINUE,CREATED:o.CREATED,EXPECTATION_FAILED:o.EXPECTATION_FAILED,FORBIDDEN:o.FORBIDDEN,GATEWAY_TIMEOUT:o.GATEWAY_TIMEOUT,GONE:o.GONE,HTTP_VERSION_NOT_SUPPORTED:o.HTTP_VERSION_NOT_SUPPORTED,IM_A_TEAPOT:o.IM_A_TEAPOT,INSUFFICIENT_SPACE_ON_RESOURCE:o.INSUFFICIENT_SPACE_ON_RESOURCE,INSUFFICIENT_STORAGE:o.INSUFFICIENT_STORAGE,INTERNAL_SERVER_ERROR:o.INTERNAL_SERVER_ERROR,LENGTH_REQUIRED:o.LENGTH_REQUIRED,LOCKED:o.LOCKED,METHOD_FAILURE:o.METHOD_FAILURE,METHOD_NOT_ALLOWED:o.METHOD_NOT_ALLOWED,MOVED_PERMANENTLY:o.MOVED_PERMANENTLY,MOVED_TEMPORARILY:o.MOVED_TEMPORARILY,MULTI_STATUS:o.MULTI_STATUS,MULTIPLE_CHOICES:o.MULTIPLE_CHOICES,NETWORK_AUTHENTICATION_REQUIRED:o.NETWORK_AUTHENTICATION_REQUIRED,NO_CONTENT:o.NO_CONTENT,NON_AUTHORITATIVE_INFORMATION:o.NON_AUTHORITATIVE_INFORMATION,NOT_ACCEPTABLE:o.NOT_ACCEPTABLE,NOT_FOUND:o.NOT_FOUND,NOT_IMPLEMENTED:o.NOT_IMPLEMENTED,NOT_MODIFIED:o.NOT_MODIFIED,OK:o.OK,PARTIAL_CONTENT:o.PARTIAL_CONTENT,PAYMENT_REQUIRED:o.PAYMENT_REQUIRED,PERMANENT_REDIRECT:o.PERMANENT_REDIRECT,PRECONDITION_FAILED:o.PRECONDITION_FAILED,PRECONDITION_REQUIRED:o.PRECONDITION_REQUIRED,PROCESSING:o.PROCESSING,PROXY_AUTHENTICATION_REQUIRED:o.PROXY_AUTHENTICATION_REQUIRED,REQUEST_HEADER_FIELDS_TOO_LARGE:o.REQUEST_HEADER_FIELDS_TOO_LARGE,REQUEST_TIMEOUT:o.REQUEST_TIMEOUT,REQUEST_TOO_LONG:o.REQUEST_TOO_LONG,REQUEST_URI_TOO_LONG:o.REQUEST_URI_TOO_LONG,REQUESTED_RANGE_NOT_SATISFIABLE:o.REQUESTED_RANGE_NOT_SATISFIABLE,RESET_CONTENT:o.RESET_CONTENT,SEE_OTHER:o.SEE_OTHER,SERVICE_UNAVAILABLE:o.SERVICE_UNAVAILABLE,SWITCHING_PROTOCOLS:o.SWITCHING_PROTOCOLS,TEMPORARY_REDIRECT:o.TEMPORARY_REDIRECT,TOO_MANY_REQUESTS:o.TOO_MANY_REQUESTS,UNAUTHORIZED:o.UNAUTHORIZED,UNPROCESSABLE_ENTITY:o.UNPROCESSABLE_ENTITY,UNSUPPORTED_MEDIA_TYPE:o.UNSUPPORTED_MEDIA_TYPE,USE_PROXY:o.USE_PROXY}});var me=N(g=>{"use strict";Object.defineProperty(g,"__esModule",{value:!0});g.reasonPhraseToStatusCode=g.statusCodeToReasonPhrase=void 0;g.statusCodeToReasonPhrase={202:"Accepted",502:"Bad Gateway",400:"Bad Request",409:"Conflict",100:"Continue",201:"Created",417:"Expectation Failed",424:"Failed Dependency",403:"Forbidden",504:"Gateway Timeout",410:"Gone",505:"HTTP Version Not Supported",418:"I'm a teapot",419:"Insufficient Space on Resource",507:"Insufficient Storage",500:"Internal Server Error",411:"Length Required",423:"Locked",420:"Method Failure",405:"Method Not Allowed",301:"Moved Permanently",302:"Moved Temporarily",207:"Multi-Status",300:"Multiple Choices",511:"Network Authentication Required",204:"No Content",203:"Non Authoritative Information",406:"Not Acceptable",404:"Not Found",501:"Not Implemented",304:"Not Modified",200:"OK",206:"Partial Content",402:"Payment Required",308:"Permanent Redirect",412:"Precondition Failed",428:"Precondition Required",102:"Processing",103:"Early Hints",426:"Upgrade Required",407:"Proxy Authentication Required",431:"Request Header Fields Too Large",408:"Request Timeout",413:"Request Entity Too Large",414:"Request-URI Too Long",416:"Requested Range Not Satisfiable",205:"Reset Content",303:"See Other",503:"Service Unavailable",101:"Switching Protocols",307:"Temporary Redirect",429:"Too Many Requests",401:"Unauthorized",451:"Unavailable For Legal Reasons",422:"Unprocessable Entity",415:"Unsupported Media Type",305:"Use Proxy",421:"Misdirected Request"};g.reasonPhraseToStatusCode={Accepted:202,"Bad Gateway":502,"Bad Request":400,Conflict:409,Continue:100,Created:201,"Expectation Failed":417,"Failed Dependency":424,Forbidden:403,"Gateway Timeout":504,Gone:410,"HTTP Version Not Supported":505,"I'm a teapot":418,"Insufficient Space on Resource":419,"Insufficient Storage":507,"Internal Server Error":500,"Length Required":411,Locked:423,"Method Failure":420,"Method Not Allowed":405,"Moved Permanently":301,"Moved Temporarily":302,"Multi-Status":207,"Multiple Choices":300,"Network Authentication Required":511,"No Content":204,"Non Authoritative Information":203,"Not Acceptable":406,"Not Found":404,"Not Implemented":501,"Not Modified":304,OK:200,"Partial Content":206,"Payment Required":402,"Permanent Redirect":308,"Precondition Failed":412,"Precondition Required":428,Processing:102,"Early Hints":103,"Upgrade Required":426,"Proxy Authentication Required":407,"Request Header Fields Too Large":431,"Request Timeout":408,"Request Entity Too Large":413,"Request-URI Too Long":414,"Requested Range Not Satisfiable":416,"Reset Content":205,"See Other":303,"Service Unavailable":503,"Switching Protocols":101,"Temporary Redirect":307,"Too Many Requests":429,Unauthorized:401,"Unavailable For Legal Reasons":451,"Unprocessable Entity":422,"Unsupported Media Type":415,"Use Proxy":305,"Misdirected Request":421}});var K=N(p=>{"use strict";Object.defineProperty(p,"__esModule",{value:!0});p.getStatusText=p.getStatusCode=p.getReasonPhrase=void 0;var de=me();function Te(e){var r=de.statusCodeToReasonPhrase[e.toString()];if(!r)throw new Error("Status code does not exist: "+e);return r}p.getReasonPhrase=Te;function nt(e){var r=de.reasonPhraseToStatusCode[e];if(!r)throw new Error("Reason phrase does not exist: "+e);return r}p.getStatusCode=nt;p.getStatusText=Te});var pe=N(y=>{"use strict";Object.defineProperty(y,"__esModule",{value:!0});y.StatusCodes=void 0;var it;(function(e){e[e.CONTINUE=100]="CONTINUE",e[e.SWITCHING_PROTOCOLS=101]="SWITCHING_PROTOCOLS",e[e.PROCESSING=102]="PROCESSING",e[e.EARLY_HINTS=103]="EARLY_HINTS",e[e.OK=200]="OK",e[e.CREATED=201]="CREATED",e[e.ACCEPTED=202]="ACCEPTED",e[e.NON_AUTHORITATIVE_INFORMATION=203]="NON_AUTHORITATIVE_INFORMATION",e[e.NO_CONTENT=204]="NO_CONTENT",e[e.RESET_CONTENT=205]="RESET_CONTENT",e[e.PARTIAL_CONTENT=206]="PARTIAL_CONTENT",e[e.MULTI_STATUS=207]="MULTI_STATUS",e[e.MULTIPLE_CHOICES=300]="MULTIPLE_CHOICES",e[e.MOVED_PERMANENTLY=301]="MOVED_PERMANENTLY",e[e.MOVED_TEMPORARILY=302]="MOVED_TEMPORARILY",e[e.SEE_OTHER=303]="SEE_OTHER",e[e.NOT_MODIFIED=304]="NOT_MODIFIED",e[e.USE_PROXY=305]="USE_PROXY",e[e.TEMPORARY_REDIRECT=307]="TEMPORARY_REDIRECT",e[e.PERMANENT_REDIRECT=308]="PERMANENT_REDIRECT",e[e.BAD_REQUEST=400]="BAD_REQUEST",e[e.UNAUTHORIZED=401]="UNAUTHORIZED",e[e.PAYMENT_REQUIRED=402]="PAYMENT_REQUIRED",e[e.FORBIDDEN=403]="FORBIDDEN",e[e.NOT_FOUND=404]="NOT_FOUND",e[e.METHOD_NOT_ALLOWED=405]="METHOD_NOT_ALLOWED",e[e.NOT_ACCEPTABLE=406]="NOT_ACCEPTABLE",e[e.PROXY_AUTHENTICATION_REQUIRED=407]="PROXY_AUTHENTICATION_REQUIRED",e[e.REQUEST_TIMEOUT=408]="REQUEST_TIMEOUT",e[e.CONFLICT=409]="CONFLICT",e[e.GONE=410]="GONE",e[e.LENGTH_REQUIRED=411]="LENGTH_REQUIRED",e[e.PRECONDITION_FAILED=412]="PRECONDITION_FAILED",e[e.REQUEST_TOO_LONG=413]="REQUEST_TOO_LONG",e[e.REQUEST_URI_TOO_LONG=414]="REQUEST_URI_TOO_LONG",e[e.UNSUPPORTED_MEDIA_TYPE=415]="UNSUPPORTED_MEDIA_TYPE",e[e.REQUESTED_RANGE_NOT_SATISFIABLE=416]="REQUESTED_RANGE_NOT_SATISFIABLE",e[e.EXPECTATION_FAILED=417]="EXPECTATION_FAILED",e[e.IM_A_TEAPOT=418]="IM_A_TEAPOT",e[e.INSUFFICIENT_SPACE_ON_RESOURCE=419]="INSUFFICIENT_SPACE_ON_RESOURCE",e[e.METHOD_FAILURE=420]="METHOD_FAILURE",e[e.MISDIRECTED_REQUEST=421]="MISDIRECTED_REQUEST",e[e.UNPROCESSABLE_ENTITY=422]="UNPROCESSABLE_ENTITY",e[e.LOCKED=423]="LOCKED",e[e.FAILED_DEPENDENCY=424]="FAILED_DEPENDENCY",e[e.UPGRADE_REQUIRED=426]="UPGRADE_REQUIRED",e[e.PRECONDITION_REQUIRED=428]="PRECONDITION_REQUIRED",e[e.TOO_MANY_REQUESTS=429]="TOO_MANY_REQUESTS",e[e.REQUEST_HEADER_FIELDS_TOO_LARGE=431]="REQUEST_HEADER_FIELDS_TOO_LARGE",e[e.UNAVAILABLE_FOR_LEGAL_REASONS=451]="UNAVAILABLE_FOR_LEGAL_REASONS",e[e.INTERNAL_SERVER_ERROR=500]="INTERNAL_SERVER_ERROR",e[e.NOT_IMPLEMENTED=501]="NOT_IMPLEMENTED",e[e.BAD_GATEWAY=502]="BAD_GATEWAY",e[e.SERVICE_UNAVAILABLE=503]="SERVICE_UNAVAILABLE",e[e.GATEWAY_TIMEOUT=504]="GATEWAY_TIMEOUT",e[e.HTTP_VERSION_NOT_SUPPORTED=505]="HTTP_VERSION_NOT_SUPPORTED",e[e.INSUFFICIENT_STORAGE=507]="INSUFFICIENT_STORAGE",e[e.NETWORK_AUTHENTICATION_REQUIRED=511]="NETWORK_AUTHENTICATION_REQUIRED"})(it=y.StatusCodes||(y.StatusCodes={}))});var fe=N(U=>{"use strict";Object.defineProperty(U,"__esModule",{value:!0});U.ReasonPhrases=void 0;var at;(function(e){e.ACCEPTED="Accepted",e.BAD_GATEWAY="Bad Gateway",e.BAD_REQUEST="Bad Request",e.CONFLICT="Conflict",e.CONTINUE="Continue",e.CREATED="Created",e.EXPECTATION_FAILED="Expectation Failed",e.FAILED_DEPENDENCY="Failed Dependency",e.FORBIDDEN="Forbidden",e.GATEWAY_TIMEOUT="Gateway Timeout",e.GONE="Gone",e.HTTP_VERSION_NOT_SUPPORTED="HTTP Version Not Supported",e.IM_A_TEAPOT="I'm a teapot",e.INSUFFICIENT_SPACE_ON_RESOURCE="Insufficient Space on Resource",e.INSUFFICIENT_STORAGE="Insufficient Storage",e.INTERNAL_SERVER_ERROR="Internal Server Error",e.LENGTH_REQUIRED="Length Required",e.LOCKED="Locked",e.METHOD_FAILURE="Method Failure",e.METHOD_NOT_ALLOWED="Method Not Allowed",e.MOVED_PERMANENTLY="Moved Permanently",e.MOVED_TEMPORARILY="Moved Temporarily",e.MULTI_STATUS="Multi-Status",e.MULTIPLE_CHOICES="Multiple Choices",e.NETWORK_AUTHENTICATION_REQUIRED="Network Authentication Required",e.NO_CONTENT="No Content",e.NON_AUTHORITATIVE_INFORMATION="Non Authoritative Information",e.NOT_ACCEPTABLE="Not Acceptable",e.NOT_FOUND="Not Found",e.NOT_IMPLEMENTED="Not Implemented",e.NOT_MODIFIED="Not Modified",e.OK="OK",e.PARTIAL_CONTENT="Partial Content",e.PAYMENT_REQUIRED="Payment Required",e.PERMANENT_REDIRECT="Permanent Redirect",e.PRECONDITION_FAILED="Precondition Failed",e.PRECONDITION_REQUIRED="Precondition Required",e.PROCESSING="Processing",e.EARLY_HINTS="Early Hints",e.UPGRADE_REQUIRED="Upgrade Required",e.PROXY_AUTHENTICATION_REQUIRED="Proxy Authentication Required",e.REQUEST_HEADER_FIELDS_TOO_LARGE="Request Header Fields Too Large",e.REQUEST_TIMEOUT="Request Timeout",e.REQUEST_TOO_LONG="Request Entity Too Large",e.REQUEST_URI_TOO_LONG="Request-URI Too Long",e.REQUESTED_RANGE_NOT_SATISFIABLE="Requested Range Not Satisfiable",e.RESET_CONTENT="Reset Content",e.SEE_OTHER="See Other",e.SERVICE_UNAVAILABLE="Service Unavailable",e.SWITCHING_PROTOCOLS="Switching Protocols",e.TEMPORARY_REDIRECT="Temporary Redirect",e.TOO_MANY_REQUESTS="Too Many Requests",e.UNAUTHORIZED="Unauthorized",e.UNAVAILABLE_FOR_LEGAL_REASONS="Unavailable For Legal Reasons",e.UNPROCESSABLE_ENTITY="Unprocessable Entity",e.UNSUPPORTED_MEDIA_TYPE="Unsupported Media Type",e.USE_PROXY="Use Proxy",e.MISDIRECTED_REQUEST="Misdirected Request"})(at=U.ReasonPhrases||(U.ReasonPhrases={}))});var Oe=N(l=>{"use strict";var v=l&&l.__assign||function(){return v=Object.assign||function(e){for(var r,t=1,n=arguments.length;t<n;t++){r=arguments[t];for(var i in r)Object.prototype.hasOwnProperty.call(r,i)&&(e[i]=r[i])}return e},v.apply(this,arguments)},ut=l&&l.__createBinding||(Object.create?(function(e,r,t,n){n===void 0&&(n=t),Object.defineProperty(e,n,{enumerable:!0,get:function(){return r[t]}})}):(function(e,r,t,n){n===void 0&&(n=t),e[n]=r[t]})),st=l&&l.__exportStar||function(e,r){for(var t in e)t!=="default"&&!r.hasOwnProperty(t)&&ut(r,e,t)},ct=l&&l.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(l,"__esModule",{value:!0});var Et=ct($()),_e=K(),z=K();Object.defineProperty(l,"getStatusCode",{enumerable:!0,get:function(){return z.getStatusCode}});Object.defineProperty(l,"getReasonPhrase",{enumerable:!0,get:function(){return z.getReasonPhrase}});Object.defineProperty(l,"getStatusText",{enumerable:!0,get:function(){return z.getStatusText}});var lt=pe();Object.defineProperty(l,"StatusCodes",{enumerable:!0,get:function(){return lt.StatusCodes}});var Rt=fe();Object.defineProperty(l,"ReasonPhrases",{enumerable:!0,get:function(){return Rt.ReasonPhrases}});st($(),l);l.default=v(v({},Et.default),{getStatusCode:_e.getStatusCode,getStatusText:_e.getStatusText})});var gt={};je(gt,{ApiGatewayExecutionRouters:()=>xe,ApiGatewayStages:()=>Pe,AwsRegionSchema:()=>Ot,BrowserPipeline:()=>F,CloudFrontDistributions:()=>Le,DEFAULT_CLI_CONFIG:()=>It,DeployStacks:()=>Me,DynamoDbTables:()=>Ce,EnginesBrowserFramework:()=>De,ErrorBoundary:()=>k,ErrorBoundaryNotFound:()=>et,FeaturesConfigSchema:()=>he,IamExecutionRoles:()=>we,LambdaFunctions:()=>ve,PathsConfigSchema:()=>Ue,RuntimeAppServer:()=>le,RuntimeConfigSchema:()=>Nt,RuntimeHeadManager:()=>tt,RuntimeRouter:()=>I,RuntimeRouterProvider:()=>Ze,S3Buckets:()=>be,StageConfigSchema:()=>ye,createRouteLoader:()=>V,createSeoRetriever:()=>Q,executeRuntimeAsync:()=>oe,fetchSeoMetadata:()=>re,getDefaultSeoMeta:()=>W,injectFlow:()=>se,intersection:()=>j,isBrowser:()=>X,isLambdaRuntime:()=>w,isValidServiceName:()=>Se,mergeLoaderResults:()=>ne,routePath:()=>T,routerContext:()=>Z,runtime:()=>pt,runtimeRouter:()=>Je,runtimeThreads:()=>ge,useRuntimeData:()=>qe,useRuntimeSeoMeta:()=>$e});module.exports=ke(gt);var u=f(require("react")),ce=require("react");var G=require("react-router");function qe(){let e=(0,G.useLoaderData)();if(e===void 0)throw new Error("[Runtime] useRuntimeData must be called within a route component with a loader. Ensure the route has a loader function or runtimeAsync retrievers defined.");if(typeof e!="object"||e===null)throw new Error('[Runtime] useRuntimeData received invalid loader data. Expected an object with "internal" and "business" properties.');if(!("business"in e))throw new Error('[Runtime] useRuntimeData received loader data without "business" property. This may indicate the route is not using a Runtime-generated loader.');return e.business}function $e(){let e=(0,G.useLoaderData)();if(e&&!(typeof e!="object"||e===null)&&"internal"in e)return e.internal?.seoMeta}function Ke(e){let r=process.env.PURE_ENV_API_BASE_URL;if(!r)throw new Error("[Runtime] PURE_ENV_API_BASE_URL environment variable is not configured. Please set this variable to your API Gateway base URL.");return`${r.replace(/\/+$/,"")}/seo-meta?route=${encodeURIComponent(e)}`}async function te(e){try{let r=Ke(e),t=await fetch(r);if(!t.ok)return console.warn(`[Runtime] SEO API returned status ${t.status} for route "${e}"`),null;let n=await t.json();return ze(n)}catch(r){return r instanceof Error&&r.message.includes("PURE_ENV_API_BASE_URL")?console.error(r.message):console.warn(`[Runtime] Failed to fetch SEO metadata from API for route "${e}":`,r),null}}function ze(e){return{title:e.title,description:e.description,keywords:e.keywords,ogTitle:e.ogTitle,ogDescription:e.ogDescription,ogImage:e.ogImage,ogUrl:e.canonicalUrl,ogType:"website",twitterCard:"summary",twitterTitle:e.twitterTitle,twitterDescription:e.twitterDescription,twitterImage:e.twitterImage,canonicalUrl:e.canonicalUrl,robots:e.robots}}function Q(e){return async r=>{try{return{seoMeta:await re(e,r)||W()}}catch(t){return console.warn(`[Runtime] SEO retriever failed for route "${e}":`,t),{seoMeta:W()}}}}async function re(e,r){if(typeof window>"u")return null;try{let t=e;return r.params&&Object.entries(r.params).forEach(([n,i])=>{t=t.replace(`:${n}`,String(i))}),await te(t)}catch(t){return console.warn(`[Runtime] Failed to fetch SEO metadata for route "${e}":`,t),null}}function W(){return{title:"Runtime Web Application",description:"A Runtime Web serverless application",robots:"index, follow",keywords:["aws","serverless","react","serverless rendering"],ogTitle:"Runtime Web Application",ogDescription:"A Runtime Web serverless application",ogImage:"/og-image.png",ogUrl:"/",ogType:"website",twitterCard:"summary_large_image",twitterTitle:"Runtime Web Application",twitterDescription:"A Runtime Web serverless application",twitterImage:"/twitter-card.png",canonicalUrl:"/"}}var Y="internal";function V(e,r){return async t=>{let{params:n,request:i}=t,c=new URL(i.url).searchParams,R={params:n,request:i,searchParams:c},m=[{retriever:Q(e),isInternal:!0,name:"Internal SEO retriever"}],d=r.map((He,Be)=>({retriever:He,isInternal:!1,name:`User retriever ${Be+1}`})),E=[...m,...d],Fe=await oe(E,R,e);return ne(Fe,E,e)}}async function oe(e,r,t){if(e.length===0)return[];let n=e.map(({retriever:i})=>i(r));return Promise.allSettled(n)}function ne(e,r,t){let n={internal:{},business:{}};return e.forEach((i,a)=>{let{isInternal:c,name:R}=r[a];if(i.status==="fulfilled"){let m=i.value;if(c)Object.assign(n.internal,m);else if(Y in m){console.warn(`[Runtime] ${R} for route "${t}" returned reserved key "${Y}", ignoring it`);let{[Y]:d,...E}=m;Object.assign(n.business,E)}else Object.assign(n.business,m)}else Xe(i.reason,R,t,c)}),n}function Xe(e,r,t,n){let i;try{i=e instanceof Error?e:new Error(String(e))}catch{try{i=new Error(JSON.stringify(e))}catch{i=new Error("[Unable to serialize error reason]")}}let a=i.message,c=i.stack,R="[Runtime Loader Error]",m={retriever:r,route:t,type:n?"internal":"user",timestamp:new Date().toISOString()};console.warn(`${R} ${r} failed for route "${t}"`,`
1
+ "use strict";var Ge=Object.create;var h=Object.defineProperty;var We=Object.getOwnPropertyDescriptor;var Qe=Object.getOwnPropertyNames;var Ye=Object.getPrototypeOf,Ve=Object.prototype.hasOwnProperty;var N=(e,r)=>()=>(r||e((r={exports:{}}).exports,r),r.exports),je=(e,r)=>{for(var t in r)h(e,t,{get:r[t],enumerable:!0})},ee=(e,r,t,n)=>{if(r&&typeof r=="object"||typeof r=="function")for(let i of Qe(r))!Ve.call(e,i)&&i!==t&&h(e,i,{get:()=>r[i],enumerable:!(n=We(r,i))||n.enumerable});return e};var f=(e,r,t)=>(t=e!=null?Ge(Ye(e)):{},ee(r||!e||!e.__esModule?h(t,"default",{value:e,enumerable:!0}):t,e)),ke=e=>ee(h({},"__esModule",{value:!0}),e);var $=N(o=>{"use strict";Object.defineProperty(o,"__esModule",{value:!0});o.USE_PROXY=o.UNSUPPORTED_MEDIA_TYPE=o.UNPROCESSABLE_ENTITY=o.UNAUTHORIZED=o.TOO_MANY_REQUESTS=o.TEMPORARY_REDIRECT=o.SWITCHING_PROTOCOLS=o.SERVICE_UNAVAILABLE=o.SEE_OTHER=o.RESET_CONTENT=o.REQUESTED_RANGE_NOT_SATISFIABLE=o.REQUEST_URI_TOO_LONG=o.REQUEST_TOO_LONG=o.REQUEST_TIMEOUT=o.REQUEST_HEADER_FIELDS_TOO_LARGE=o.PROXY_AUTHENTICATION_REQUIRED=o.PROCESSING=o.PRECONDITION_REQUIRED=o.PRECONDITION_FAILED=o.PERMANENT_REDIRECT=o.PAYMENT_REQUIRED=o.PARTIAL_CONTENT=o.OK=o.NOT_MODIFIED=o.NOT_IMPLEMENTED=o.NOT_FOUND=o.NOT_ACCEPTABLE=o.NON_AUTHORITATIVE_INFORMATION=o.NO_CONTENT=o.NETWORK_AUTHENTICATION_REQUIRED=o.MULTIPLE_CHOICES=o.MULTI_STATUS=o.MOVED_TEMPORARILY=o.MOVED_PERMANENTLY=o.METHOD_NOT_ALLOWED=o.METHOD_FAILURE=o.LOCKED=o.LENGTH_REQUIRED=o.INTERNAL_SERVER_ERROR=o.INSUFFICIENT_STORAGE=o.INSUFFICIENT_SPACE_ON_RESOURCE=o.IM_A_TEAPOT=o.HTTP_VERSION_NOT_SUPPORTED=o.GONE=o.GATEWAY_TIMEOUT=o.FORBIDDEN=o.FAILED_DEPENDENCY=o.EXPECTATION_FAILED=o.CREATED=o.CONTINUE=o.CONFLICT=o.BAD_REQUEST=o.BAD_GATEWAY=o.ACCEPTED=void 0;o.ACCEPTED=202;o.BAD_GATEWAY=502;o.BAD_REQUEST=400;o.CONFLICT=409;o.CONTINUE=100;o.CREATED=201;o.EXPECTATION_FAILED=417;o.FAILED_DEPENDENCY=424;o.FORBIDDEN=403;o.GATEWAY_TIMEOUT=504;o.GONE=410;o.HTTP_VERSION_NOT_SUPPORTED=505;o.IM_A_TEAPOT=418;o.INSUFFICIENT_SPACE_ON_RESOURCE=419;o.INSUFFICIENT_STORAGE=507;o.INTERNAL_SERVER_ERROR=500;o.LENGTH_REQUIRED=411;o.LOCKED=423;o.METHOD_FAILURE=420;o.METHOD_NOT_ALLOWED=405;o.MOVED_PERMANENTLY=301;o.MOVED_TEMPORARILY=302;o.MULTI_STATUS=207;o.MULTIPLE_CHOICES=300;o.NETWORK_AUTHENTICATION_REQUIRED=511;o.NO_CONTENT=204;o.NON_AUTHORITATIVE_INFORMATION=203;o.NOT_ACCEPTABLE=406;o.NOT_FOUND=404;o.NOT_IMPLEMENTED=501;o.NOT_MODIFIED=304;o.OK=200;o.PARTIAL_CONTENT=206;o.PAYMENT_REQUIRED=402;o.PERMANENT_REDIRECT=308;o.PRECONDITION_FAILED=412;o.PRECONDITION_REQUIRED=428;o.PROCESSING=102;o.PROXY_AUTHENTICATION_REQUIRED=407;o.REQUEST_HEADER_FIELDS_TOO_LARGE=431;o.REQUEST_TIMEOUT=408;o.REQUEST_TOO_LONG=413;o.REQUEST_URI_TOO_LONG=414;o.REQUESTED_RANGE_NOT_SATISFIABLE=416;o.RESET_CONTENT=205;o.SEE_OTHER=303;o.SERVICE_UNAVAILABLE=503;o.SWITCHING_PROTOCOLS=101;o.TEMPORARY_REDIRECT=307;o.TOO_MANY_REQUESTS=429;o.UNAUTHORIZED=401;o.UNPROCESSABLE_ENTITY=422;o.UNSUPPORTED_MEDIA_TYPE=415;o.USE_PROXY=305;o.default={ACCEPTED:o.ACCEPTED,BAD_GATEWAY:o.BAD_GATEWAY,BAD_REQUEST:o.BAD_REQUEST,CONFLICT:o.CONFLICT,CONTINUE:o.CONTINUE,CREATED:o.CREATED,EXPECTATION_FAILED:o.EXPECTATION_FAILED,FORBIDDEN:o.FORBIDDEN,GATEWAY_TIMEOUT:o.GATEWAY_TIMEOUT,GONE:o.GONE,HTTP_VERSION_NOT_SUPPORTED:o.HTTP_VERSION_NOT_SUPPORTED,IM_A_TEAPOT:o.IM_A_TEAPOT,INSUFFICIENT_SPACE_ON_RESOURCE:o.INSUFFICIENT_SPACE_ON_RESOURCE,INSUFFICIENT_STORAGE:o.INSUFFICIENT_STORAGE,INTERNAL_SERVER_ERROR:o.INTERNAL_SERVER_ERROR,LENGTH_REQUIRED:o.LENGTH_REQUIRED,LOCKED:o.LOCKED,METHOD_FAILURE:o.METHOD_FAILURE,METHOD_NOT_ALLOWED:o.METHOD_NOT_ALLOWED,MOVED_PERMANENTLY:o.MOVED_PERMANENTLY,MOVED_TEMPORARILY:o.MOVED_TEMPORARILY,MULTI_STATUS:o.MULTI_STATUS,MULTIPLE_CHOICES:o.MULTIPLE_CHOICES,NETWORK_AUTHENTICATION_REQUIRED:o.NETWORK_AUTHENTICATION_REQUIRED,NO_CONTENT:o.NO_CONTENT,NON_AUTHORITATIVE_INFORMATION:o.NON_AUTHORITATIVE_INFORMATION,NOT_ACCEPTABLE:o.NOT_ACCEPTABLE,NOT_FOUND:o.NOT_FOUND,NOT_IMPLEMENTED:o.NOT_IMPLEMENTED,NOT_MODIFIED:o.NOT_MODIFIED,OK:o.OK,PARTIAL_CONTENT:o.PARTIAL_CONTENT,PAYMENT_REQUIRED:o.PAYMENT_REQUIRED,PERMANENT_REDIRECT:o.PERMANENT_REDIRECT,PRECONDITION_FAILED:o.PRECONDITION_FAILED,PRECONDITION_REQUIRED:o.PRECONDITION_REQUIRED,PROCESSING:o.PROCESSING,PROXY_AUTHENTICATION_REQUIRED:o.PROXY_AUTHENTICATION_REQUIRED,REQUEST_HEADER_FIELDS_TOO_LARGE:o.REQUEST_HEADER_FIELDS_TOO_LARGE,REQUEST_TIMEOUT:o.REQUEST_TIMEOUT,REQUEST_TOO_LONG:o.REQUEST_TOO_LONG,REQUEST_URI_TOO_LONG:o.REQUEST_URI_TOO_LONG,REQUESTED_RANGE_NOT_SATISFIABLE:o.REQUESTED_RANGE_NOT_SATISFIABLE,RESET_CONTENT:o.RESET_CONTENT,SEE_OTHER:o.SEE_OTHER,SERVICE_UNAVAILABLE:o.SERVICE_UNAVAILABLE,SWITCHING_PROTOCOLS:o.SWITCHING_PROTOCOLS,TEMPORARY_REDIRECT:o.TEMPORARY_REDIRECT,TOO_MANY_REQUESTS:o.TOO_MANY_REQUESTS,UNAUTHORIZED:o.UNAUTHORIZED,UNPROCESSABLE_ENTITY:o.UNPROCESSABLE_ENTITY,UNSUPPORTED_MEDIA_TYPE:o.UNSUPPORTED_MEDIA_TYPE,USE_PROXY:o.USE_PROXY}});var me=N(g=>{"use strict";Object.defineProperty(g,"__esModule",{value:!0});g.reasonPhraseToStatusCode=g.statusCodeToReasonPhrase=void 0;g.statusCodeToReasonPhrase={202:"Accepted",502:"Bad Gateway",400:"Bad Request",409:"Conflict",100:"Continue",201:"Created",417:"Expectation Failed",424:"Failed Dependency",403:"Forbidden",504:"Gateway Timeout",410:"Gone",505:"HTTP Version Not Supported",418:"I'm a teapot",419:"Insufficient Space on Resource",507:"Insufficient Storage",500:"Internal Server Error",411:"Length Required",423:"Locked",420:"Method Failure",405:"Method Not Allowed",301:"Moved Permanently",302:"Moved Temporarily",207:"Multi-Status",300:"Multiple Choices",511:"Network Authentication Required",204:"No Content",203:"Non Authoritative Information",406:"Not Acceptable",404:"Not Found",501:"Not Implemented",304:"Not Modified",200:"OK",206:"Partial Content",402:"Payment Required",308:"Permanent Redirect",412:"Precondition Failed",428:"Precondition Required",102:"Processing",103:"Early Hints",426:"Upgrade Required",407:"Proxy Authentication Required",431:"Request Header Fields Too Large",408:"Request Timeout",413:"Request Entity Too Large",414:"Request-URI Too Long",416:"Requested Range Not Satisfiable",205:"Reset Content",303:"See Other",503:"Service Unavailable",101:"Switching Protocols",307:"Temporary Redirect",429:"Too Many Requests",401:"Unauthorized",451:"Unavailable For Legal Reasons",422:"Unprocessable Entity",415:"Unsupported Media Type",305:"Use Proxy",421:"Misdirected Request"};g.reasonPhraseToStatusCode={Accepted:202,"Bad Gateway":502,"Bad Request":400,Conflict:409,Continue:100,Created:201,"Expectation Failed":417,"Failed Dependency":424,Forbidden:403,"Gateway Timeout":504,Gone:410,"HTTP Version Not Supported":505,"I'm a teapot":418,"Insufficient Space on Resource":419,"Insufficient Storage":507,"Internal Server Error":500,"Length Required":411,Locked:423,"Method Failure":420,"Method Not Allowed":405,"Moved Permanently":301,"Moved Temporarily":302,"Multi-Status":207,"Multiple Choices":300,"Network Authentication Required":511,"No Content":204,"Non Authoritative Information":203,"Not Acceptable":406,"Not Found":404,"Not Implemented":501,"Not Modified":304,OK:200,"Partial Content":206,"Payment Required":402,"Permanent Redirect":308,"Precondition Failed":412,"Precondition Required":428,Processing:102,"Early Hints":103,"Upgrade Required":426,"Proxy Authentication Required":407,"Request Header Fields Too Large":431,"Request Timeout":408,"Request Entity Too Large":413,"Request-URI Too Long":414,"Requested Range Not Satisfiable":416,"Reset Content":205,"See Other":303,"Service Unavailable":503,"Switching Protocols":101,"Temporary Redirect":307,"Too Many Requests":429,Unauthorized:401,"Unavailable For Legal Reasons":451,"Unprocessable Entity":422,"Unsupported Media Type":415,"Use Proxy":305,"Misdirected Request":421}});var K=N(p=>{"use strict";Object.defineProperty(p,"__esModule",{value:!0});p.getStatusText=p.getStatusCode=p.getReasonPhrase=void 0;var de=me();function Te(e){var r=de.statusCodeToReasonPhrase[e.toString()];if(!r)throw new Error("Status code does not exist: "+e);return r}p.getReasonPhrase=Te;function nt(e){var r=de.reasonPhraseToStatusCode[e];if(!r)throw new Error("Reason phrase does not exist: "+e);return r}p.getStatusCode=nt;p.getStatusText=Te});var pe=N(y=>{"use strict";Object.defineProperty(y,"__esModule",{value:!0});y.StatusCodes=void 0;var it;(function(e){e[e.CONTINUE=100]="CONTINUE",e[e.SWITCHING_PROTOCOLS=101]="SWITCHING_PROTOCOLS",e[e.PROCESSING=102]="PROCESSING",e[e.EARLY_HINTS=103]="EARLY_HINTS",e[e.OK=200]="OK",e[e.CREATED=201]="CREATED",e[e.ACCEPTED=202]="ACCEPTED",e[e.NON_AUTHORITATIVE_INFORMATION=203]="NON_AUTHORITATIVE_INFORMATION",e[e.NO_CONTENT=204]="NO_CONTENT",e[e.RESET_CONTENT=205]="RESET_CONTENT",e[e.PARTIAL_CONTENT=206]="PARTIAL_CONTENT",e[e.MULTI_STATUS=207]="MULTI_STATUS",e[e.MULTIPLE_CHOICES=300]="MULTIPLE_CHOICES",e[e.MOVED_PERMANENTLY=301]="MOVED_PERMANENTLY",e[e.MOVED_TEMPORARILY=302]="MOVED_TEMPORARILY",e[e.SEE_OTHER=303]="SEE_OTHER",e[e.NOT_MODIFIED=304]="NOT_MODIFIED",e[e.USE_PROXY=305]="USE_PROXY",e[e.TEMPORARY_REDIRECT=307]="TEMPORARY_REDIRECT",e[e.PERMANENT_REDIRECT=308]="PERMANENT_REDIRECT",e[e.BAD_REQUEST=400]="BAD_REQUEST",e[e.UNAUTHORIZED=401]="UNAUTHORIZED",e[e.PAYMENT_REQUIRED=402]="PAYMENT_REQUIRED",e[e.FORBIDDEN=403]="FORBIDDEN",e[e.NOT_FOUND=404]="NOT_FOUND",e[e.METHOD_NOT_ALLOWED=405]="METHOD_NOT_ALLOWED",e[e.NOT_ACCEPTABLE=406]="NOT_ACCEPTABLE",e[e.PROXY_AUTHENTICATION_REQUIRED=407]="PROXY_AUTHENTICATION_REQUIRED",e[e.REQUEST_TIMEOUT=408]="REQUEST_TIMEOUT",e[e.CONFLICT=409]="CONFLICT",e[e.GONE=410]="GONE",e[e.LENGTH_REQUIRED=411]="LENGTH_REQUIRED",e[e.PRECONDITION_FAILED=412]="PRECONDITION_FAILED",e[e.REQUEST_TOO_LONG=413]="REQUEST_TOO_LONG",e[e.REQUEST_URI_TOO_LONG=414]="REQUEST_URI_TOO_LONG",e[e.UNSUPPORTED_MEDIA_TYPE=415]="UNSUPPORTED_MEDIA_TYPE",e[e.REQUESTED_RANGE_NOT_SATISFIABLE=416]="REQUESTED_RANGE_NOT_SATISFIABLE",e[e.EXPECTATION_FAILED=417]="EXPECTATION_FAILED",e[e.IM_A_TEAPOT=418]="IM_A_TEAPOT",e[e.INSUFFICIENT_SPACE_ON_RESOURCE=419]="INSUFFICIENT_SPACE_ON_RESOURCE",e[e.METHOD_FAILURE=420]="METHOD_FAILURE",e[e.MISDIRECTED_REQUEST=421]="MISDIRECTED_REQUEST",e[e.UNPROCESSABLE_ENTITY=422]="UNPROCESSABLE_ENTITY",e[e.LOCKED=423]="LOCKED",e[e.FAILED_DEPENDENCY=424]="FAILED_DEPENDENCY",e[e.UPGRADE_REQUIRED=426]="UPGRADE_REQUIRED",e[e.PRECONDITION_REQUIRED=428]="PRECONDITION_REQUIRED",e[e.TOO_MANY_REQUESTS=429]="TOO_MANY_REQUESTS",e[e.REQUEST_HEADER_FIELDS_TOO_LARGE=431]="REQUEST_HEADER_FIELDS_TOO_LARGE",e[e.UNAVAILABLE_FOR_LEGAL_REASONS=451]="UNAVAILABLE_FOR_LEGAL_REASONS",e[e.INTERNAL_SERVER_ERROR=500]="INTERNAL_SERVER_ERROR",e[e.NOT_IMPLEMENTED=501]="NOT_IMPLEMENTED",e[e.BAD_GATEWAY=502]="BAD_GATEWAY",e[e.SERVICE_UNAVAILABLE=503]="SERVICE_UNAVAILABLE",e[e.GATEWAY_TIMEOUT=504]="GATEWAY_TIMEOUT",e[e.HTTP_VERSION_NOT_SUPPORTED=505]="HTTP_VERSION_NOT_SUPPORTED",e[e.INSUFFICIENT_STORAGE=507]="INSUFFICIENT_STORAGE",e[e.NETWORK_AUTHENTICATION_REQUIRED=511]="NETWORK_AUTHENTICATION_REQUIRED"})(it=y.StatusCodes||(y.StatusCodes={}))});var fe=N(U=>{"use strict";Object.defineProperty(U,"__esModule",{value:!0});U.ReasonPhrases=void 0;var at;(function(e){e.ACCEPTED="Accepted",e.BAD_GATEWAY="Bad Gateway",e.BAD_REQUEST="Bad Request",e.CONFLICT="Conflict",e.CONTINUE="Continue",e.CREATED="Created",e.EXPECTATION_FAILED="Expectation Failed",e.FAILED_DEPENDENCY="Failed Dependency",e.FORBIDDEN="Forbidden",e.GATEWAY_TIMEOUT="Gateway Timeout",e.GONE="Gone",e.HTTP_VERSION_NOT_SUPPORTED="HTTP Version Not Supported",e.IM_A_TEAPOT="I'm a teapot",e.INSUFFICIENT_SPACE_ON_RESOURCE="Insufficient Space on Resource",e.INSUFFICIENT_STORAGE="Insufficient Storage",e.INTERNAL_SERVER_ERROR="Internal Server Error",e.LENGTH_REQUIRED="Length Required",e.LOCKED="Locked",e.METHOD_FAILURE="Method Failure",e.METHOD_NOT_ALLOWED="Method Not Allowed",e.MOVED_PERMANENTLY="Moved Permanently",e.MOVED_TEMPORARILY="Moved Temporarily",e.MULTI_STATUS="Multi-Status",e.MULTIPLE_CHOICES="Multiple Choices",e.NETWORK_AUTHENTICATION_REQUIRED="Network Authentication Required",e.NO_CONTENT="No Content",e.NON_AUTHORITATIVE_INFORMATION="Non Authoritative Information",e.NOT_ACCEPTABLE="Not Acceptable",e.NOT_FOUND="Not Found",e.NOT_IMPLEMENTED="Not Implemented",e.NOT_MODIFIED="Not Modified",e.OK="OK",e.PARTIAL_CONTENT="Partial Content",e.PAYMENT_REQUIRED="Payment Required",e.PERMANENT_REDIRECT="Permanent Redirect",e.PRECONDITION_FAILED="Precondition Failed",e.PRECONDITION_REQUIRED="Precondition Required",e.PROCESSING="Processing",e.EARLY_HINTS="Early Hints",e.UPGRADE_REQUIRED="Upgrade Required",e.PROXY_AUTHENTICATION_REQUIRED="Proxy Authentication Required",e.REQUEST_HEADER_FIELDS_TOO_LARGE="Request Header Fields Too Large",e.REQUEST_TIMEOUT="Request Timeout",e.REQUEST_TOO_LONG="Request Entity Too Large",e.REQUEST_URI_TOO_LONG="Request-URI Too Long",e.REQUESTED_RANGE_NOT_SATISFIABLE="Requested Range Not Satisfiable",e.RESET_CONTENT="Reset Content",e.SEE_OTHER="See Other",e.SERVICE_UNAVAILABLE="Service Unavailable",e.SWITCHING_PROTOCOLS="Switching Protocols",e.TEMPORARY_REDIRECT="Temporary Redirect",e.TOO_MANY_REQUESTS="Too Many Requests",e.UNAUTHORIZED="Unauthorized",e.UNAVAILABLE_FOR_LEGAL_REASONS="Unavailable For Legal Reasons",e.UNPROCESSABLE_ENTITY="Unprocessable Entity",e.UNSUPPORTED_MEDIA_TYPE="Unsupported Media Type",e.USE_PROXY="Use Proxy",e.MISDIRECTED_REQUEST="Misdirected Request"})(at=U.ReasonPhrases||(U.ReasonPhrases={}))});var Oe=N(l=>{"use strict";var v=l&&l.__assign||function(){return v=Object.assign||function(e){for(var r,t=1,n=arguments.length;t<n;t++){r=arguments[t];for(var i in r)Object.prototype.hasOwnProperty.call(r,i)&&(e[i]=r[i])}return e},v.apply(this,arguments)},ut=l&&l.__createBinding||(Object.create?(function(e,r,t,n){n===void 0&&(n=t),Object.defineProperty(e,n,{enumerable:!0,get:function(){return r[t]}})}):(function(e,r,t,n){n===void 0&&(n=t),e[n]=r[t]})),st=l&&l.__exportStar||function(e,r){for(var t in e)t!=="default"&&!r.hasOwnProperty(t)&&ut(r,e,t)},ct=l&&l.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(l,"__esModule",{value:!0});var Et=ct($()),_e=K(),z=K();Object.defineProperty(l,"getStatusCode",{enumerable:!0,get:function(){return z.getStatusCode}});Object.defineProperty(l,"getReasonPhrase",{enumerable:!0,get:function(){return z.getReasonPhrase}});Object.defineProperty(l,"getStatusText",{enumerable:!0,get:function(){return z.getStatusText}});var lt=pe();Object.defineProperty(l,"StatusCodes",{enumerable:!0,get:function(){return lt.StatusCodes}});var Rt=fe();Object.defineProperty(l,"ReasonPhrases",{enumerable:!0,get:function(){return Rt.ReasonPhrases}});st($(),l);l.default=v(v({},Et.default),{getStatusCode:_e.getStatusCode,getStatusText:_e.getStatusText})});var gt={};je(gt,{ApiGatewayExecutionRouters:()=>xe,ApiGatewayStages:()=>Pe,AwsRegionSchema:()=>Ot,BrowserPipeline:()=>F,CloudFrontDistributions:()=>Le,DEFAULT_CLI_CONFIG:()=>It,DeployStacks:()=>Ce,DynamoDbTables:()=>Me,EnginesBrowserFramework:()=>De,ErrorBoundary:()=>k,ErrorBoundaryNotFound:()=>et,FeaturesConfigSchema:()=>he,IamExecutionRoles:()=>we,LambdaFunctions:()=>ve,PathsConfigSchema:()=>Ue,RuntimeAppServer:()=>le,RuntimeConfigSchema:()=>Nt,RuntimeHeadManager:()=>tt,RuntimeRouter:()=>I,RuntimeRouterProvider:()=>Ze,S3Buckets:()=>be,StageConfigSchema:()=>ye,createRouteLoader:()=>V,createSeoRetriever:()=>Q,executeRuntimeAsync:()=>oe,fetchSeoMetadata:()=>re,getDefaultSeoMeta:()=>W,injectFlow:()=>se,intersection:()=>j,isBrowser:()=>X,isLambdaRuntime:()=>w,isValidServiceName:()=>Se,mergeLoaderResults:()=>ne,routePath:()=>T,routerContext:()=>Z,runtime:()=>pt,runtimeRouter:()=>Je,runtimeThreads:()=>ge,useRuntimeData:()=>qe,useRuntimeSeoMeta:()=>$e});module.exports=ke(gt);var u=f(require("react")),ce=require("react");var G=require("react-router");function qe(){let e=(0,G.useLoaderData)();if(e===void 0)throw new Error("[Runtime] useRuntimeData must be called within a route component with a loader. Ensure the route has a loader function or runtimeAsync retrievers defined.");if(typeof e!="object"||e===null)throw new Error('[Runtime] useRuntimeData received invalid loader data. Expected an object with "internal" and "business" properties.');if(!("business"in e))throw new Error('[Runtime] useRuntimeData received loader data without "business" property. This may indicate the route is not using a Runtime-generated loader.');return e.business}function $e(){let e=(0,G.useLoaderData)();if(e&&!(typeof e!="object"||e===null)&&"internal"in e)return e.internal?.seoMeta}function Ke(e){let r=process.env.PURE_ENV_API_BASE_URL;if(!r)throw new Error("[Runtime] PURE_ENV_API_BASE_URL environment variable is not configured. Please set this variable to your API Gateway base URL.");return`${r.replace(/\/+$/,"")}/seo-meta?route=${encodeURIComponent(e)}`}async function te(e){try{let r=Ke(e),t=await fetch(r);if(!t.ok)return console.warn(`[Runtime] SEO API returned status ${t.status} for route "${e}"`),null;let n=await t.json();return ze(n)}catch(r){return r instanceof Error&&r.message.includes("PURE_ENV_API_BASE_URL")?console.error(r.message):console.warn(`[Runtime] Failed to fetch SEO metadata from API for route "${e}":`,r),null}}function ze(e){return{title:e.title,description:e.description,keywords:e.keywords,ogTitle:e.ogTitle,ogDescription:e.ogDescription,ogImage:e.ogImage,ogUrl:e.canonicalUrl,ogType:"website",twitterCard:"summary",twitterTitle:e.twitterTitle,twitterDescription:e.twitterDescription,twitterImage:e.twitterImage,canonicalUrl:e.canonicalUrl,robots:e.robots}}function Q(e){return async r=>{try{return{seoMeta:await re(e,r)||W()}}catch(t){return console.warn(`[Runtime] SEO retriever failed for route "${e}":`,t),{seoMeta:W()}}}}async function re(e,r){if(typeof window>"u")return null;try{let t=e;return r.params&&Object.entries(r.params).forEach(([n,i])=>{t=t.replace(`:${n}`,String(i))}),await te(t)}catch(t){return console.warn(`[Runtime] Failed to fetch SEO metadata for route "${e}":`,t),null}}function W(){return{title:"Runtime Web Application",description:"A Runtime Web serverless application",robots:"index, follow",keywords:["aws","serverless","react","serverless rendering"],ogTitle:"Runtime Web Application",ogDescription:"A Runtime Web serverless application",ogImage:"/og-image.png",ogUrl:"/",ogType:"website",twitterCard:"summary_large_image",twitterTitle:"Runtime Web Application",twitterDescription:"A Runtime Web serverless application",twitterImage:"/twitter-card.png",canonicalUrl:"/"}}var Y="internal";function V(e,r){return async t=>{let{params:n,request:i}=t,c=new URL(i.url).searchParams,R={params:n,request:i,searchParams:c},m=[{retriever:Q(e),isInternal:!0,name:"Internal SEO retriever"}],d=r.map((He,Be)=>({retriever:He,isInternal:!1,name:`User retriever ${Be+1}`})),E=[...m,...d],Fe=await oe(E,R,e);return ne(Fe,E,e)}}async function oe(e,r,t){if(e.length===0)return[];let n=e.map(({retriever:i})=>i(r));return Promise.allSettled(n)}function ne(e,r,t){let n={internal:{},business:{}};return e.forEach((i,a)=>{let{isInternal:c,name:R}=r[a];if(i.status==="fulfilled"){let m=i.value;if(c)Object.assign(n.internal,m);else if(Y in m){console.warn(`[Runtime] ${R} for route "${t}" returned reserved key "${Y}", ignoring it`);let{[Y]:d,...E}=m;Object.assign(n.business,E)}else Object.assign(n.business,m)}else Xe(i.reason,R,t,c)}),n}function Xe(e,r,t,n){let i;try{i=e instanceof Error?e:new Error(String(e))}catch{try{i=new Error(JSON.stringify(e))}catch{i=new Error("[Unable to serialize error reason]")}}let a=i.message,c=i.stack,R="[Runtime Loader Error]",m={retriever:r,route:t,type:n?"internal":"user",timestamp:new Date().toISOString()};console.warn(`${R} ${r} failed for route "${t}"`,`
2
2
  Error:`,a,`
3
3
  Context:`,m),c&&console.warn(`${R} Stack trace:`,c),typeof process<"u"&&console.warn(`${R} Debug info:`,`
4
4
  - Retriever type:`,n?"Internal framework retriever":"User-provided retriever",`
5
5
  - Route:`,t,`
6
6
  - Error type:`,i.constructor.name,`
7
- - Timestamp:`,m.timestamp)}var ie=f(require("react")),M=require("react"),ae=require("react-router"),Ze=({router:e})=>{let[r,t]=(0,M.useState)(e);return(0,M.useEffect)(()=>{t(e)},[e]),e?ie.createElement(ae.RouterProvider,{key:"runtime-router-provider",router:r}):null};var ue=f(require("react")),_=require("react"),T=e=>"/".concat([...e].join("/")).replace(/\/+/g,"/");function se({children:e,router:r}){return e?r?_.Children.map(e,t=>(0,_.isValidElement)(t)?(t.type?.displayName||t.type?.name)==="RuntimeRouterProvider"?(console.log("[RuntimeRouter] Injecting router instance into RuntimeRouterProvider"),ue.cloneElement(t,{...t.props,router:r})):t.props.children?(0,_.cloneElement)(t,{children:se({children:t.props.children,router:r})}):t:t):(console.warn("[RuntimeRouter] injectFlow called with no router"),_.Children.toArray(e)):(console.warn("[RuntimeRouter] injectFlow called with no children"),[])}function j(e,r){let t=new Set(e),n=new Set(r),i=[];return Array.from(t).forEach(a=>{n.has(a)&&i.push(a)}),i}var I=class{constructor({router:r,defaults:t}){if(!r||!Array.isArray(r)||r.length===0)throw new Error("[RuntimeRouter] Invalid routing configuration: route definitions must be provided as a non-empty array");if(!t)throw new Error("[RuntimeRouter] Invalid configuration: runtime configuration router defaults object is required");this._defaults=t;let n=this.transformRoutes(r),i=Object.keys(this._defaults);this._router=Object.fromEntries(n.map((a,c)=>{a.id||(console.warn(`[RuntimeRouter] Route at index ${c} missing ID, generating one`),a.id=`route-${c}`);let R=Object.keys(a),m=j(i,R);return i.forEach(d=>{m.includes(d)||(a[d]=t[d])}),[a.id,a]})),console.log(`[RuntimeRouter] Routing graph initialized with ${Object.keys(this._router).length} route definition(s)`)}transformRoutes(r){return r.map(t=>this.transformRoute(t))}transformRoute(r){let{path:t,runtimeAsync:n,children:i,index:a,...c}=r,R=T([t??"/"]),m=V(R,n||[]),d=i?this.transformRoutes(i):void 0,E={...c,path:R,loader:m,children:d};return a===!1&&(E.index=!1),E}getRoutes(){return Object.values(this._router)}getRouteById(r){return this._router[r]}getRouteByPath(r){return this.getRoutes().find(t=>t.path===r)}get routes(){return Object.values(this._router)}get defaults(){return this._defaults}};function Je(e){return new I(e)}var k=class extends ce.Component{constructor(t){super(t);this.REDIRECT_TIMEOUT=10;this.isProduction=typeof window>"u"?process.env.PURE_ENV_STAGE==="prod":!1;this.handleReset=()=>{this.clearRedirectInterval(),this.setState({hasError:!1,error:null,errorInfo:null,redirectTimer:this.REDIRECT_TIMEOUT})};this.state={hasError:!1,error:null,errorInfo:null,redirectTimer:this.REDIRECT_TIMEOUT}}static getDerivedStateFromError(t){return{hasError:!0,error:t}}componentDidCatch(t,n){if(console.group("[ErrorBoundary] Error caught"),console.error("Error:",t),console.error("Error Info:",n),console.error("Component Stack:",n.componentStack),console.groupEnd(),this.setState({errorInfo:n}),this.props.onError)try{this.props.onError(t,n)}catch(i){console.error("[ErrorBoundary] Error in custom error handler:",i)}this.startRedirectCountdown()}startRedirectCountdown(){this.redirectInterval=setInterval(()=>{this.setState(t=>{let n=t.redirectTimer-1;return n<=0?(this.clearRedirectInterval(),this.redirectToHome(),{redirectTimer:0}):{redirectTimer:n}})},1e3)}clearRedirectInterval(){this.redirectInterval&&(clearInterval(this.redirectInterval),this.redirectInterval=void 0)}redirectToHome(){window.location.href=T(["/"])}componentWillUnmount(){this.clearRedirectInterval()}render(){if(this.state.hasError){if(this.props.fallback)return this.props.fallback;let t={container:{display:"flex",justifyContent:"center",alignItems:"center",minHeight:"100vh",padding:"20px",fontFamily:'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif',backgroundColor:"#f5f5f5"},content:{maxWidth:"800px",width:"100%",backgroundColor:"#ffffff",borderRadius:"8px",padding:"40px",boxShadow:"0 2px 8px rgba(0, 0, 0, 0.1)"},heading:{fontSize:"2rem",fontWeight:600,textAlign:"center",marginBottom:"20px",color:"#333"},errorBox:{backgroundColor:"#f5f5f5",padding:"16px",borderRadius:"4px",marginBottom:"20px",border:"1px solid #e0e0e0"},errorTitle:{fontSize:"1.125rem",fontWeight:600,color:"#d32f2f",marginBottom:"12px"},errorText:{whiteSpace:"pre-wrap",wordBreak:"break-word",fontFamily:"monospace",fontSize:"0.875rem",color:"#666",maxHeight:"200px",overflow:"auto",margin:0},message:{fontSize:"1rem",textAlign:"center",marginBottom:"16px",color:"#666"},timer:{fontSize:"1rem",textAlign:"center",marginBottom:"24px",color:"#999"},buttonContainer:{display:"flex",justifyContent:"center",gap:"16px",flexWrap:"wrap"},button:{padding:"12px 24px",fontSize:"1rem",fontWeight:500,borderRadius:"4px",border:"none",cursor:"pointer",textDecoration:"none",display:"inline-block",transition:"background-color 0.2s"},primaryButton:{backgroundColor:"#1976d2",color:"#ffffff"},secondaryButton:{backgroundColor:"#ffffff",color:"#1976d2",border:"1px solid #1976d2"}};return u.createElement("div",{style:t.container},u.createElement("div",{style:t.content},u.createElement("h1",{style:t.heading},this.isProduction?"Something went wrong":"An error occurred"),!this.isProduction&&this.state.error&&u.createElement("div",{style:t.errorBox},u.createElement("div",{style:t.errorTitle},"Error Details:"),u.createElement("pre",{style:t.errorText},this.state.error.toString()),this.state.errorInfo&&u.createElement(u.Fragment,null,u.createElement("div",{style:{...t.errorTitle,marginTop:"16px"}},"Component Stack:"),u.createElement("pre",{style:t.errorText},this.state.errorInfo.componentStack))),u.createElement("p",{style:t.message},this.isProduction?"We're sorry for the inconvenience. Please try again.":"Check the console for more details."),this.state.redirectTimer>0&&u.createElement("p",{style:t.timer},`Redirecting to homepage in ${this.state.redirectTimer} seconds`),u.createElement("div",{style:t.buttonContainer},u.createElement("button",{style:{...t.button,...t.primaryButton},onClick:this.handleReset,onMouseOver:n=>{n.currentTarget.style.backgroundColor="#1565c0"},onMouseOut:n=>{n.currentTarget.style.backgroundColor="#1976d2"}},"Try Again"),u.createElement("a",{style:{...t.button,...t.secondaryButton},href:T(["/"]),onMouseOver:n=>{n.currentTarget.style.backgroundColor="#f5f5f5"},onMouseOut:n=>{n.currentTarget.style.backgroundColor="#ffffff"}},"Go to Homepage"))))}return this.props.children}};function et(){let[r,t]=u.useState(10);u.useEffect(()=>{if(r>0){let i=setInterval(()=>{t(a=>a-1)},1e3);return()=>clearInterval(i)}else window.location.href=T(["/"])},[r]);let n={container:{display:"flex",justifyContent:"center",alignItems:"center",minHeight:"100vh",padding:"20px",fontFamily:'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif',backgroundColor:"#f5f5f5"},content:{maxWidth:"800px",width:"100%",backgroundColor:"#ffffff",borderRadius:"8px",padding:"40px",boxShadow:"0 2px 8px rgba(0, 0, 0, 0.1)",textAlign:"center"},heading:{fontSize:"2rem",fontWeight:600,marginBottom:"20px",color:"#333"},message:{fontSize:"1rem",marginBottom:"16px",color:"#666"},link:{color:"#1976d2",textDecoration:"none",fontSize:"1rem",fontWeight:500}};return u.createElement("div",{style:n.container},u.createElement("div",{style:n.content},u.createElement("h1",{style:n.heading},"We couldn't find the page you were looking for."),u.createElement("p",{style:n.message},`We'll take you back to the homepage in ${r} seconds`),u.createElement("p",{style:n.message},u.createElement("a",{href:T(["/"]),style:n.link,onMouseOver:i=>{i.currentTarget.style.textDecoration="underline"},onMouseOut:i=>{i.currentTarget.style.textDecoration="none"}},"Click to go to homepage"))))}var S=require("react"),P=require("react-router"),C=0;function tt(){let e=(0,P.useLocation)(),r=(0,P.useMatches)(),t=(0,S.useRef)(!1);return console.debug("[Runtime] Route change detected, syncing <head> for path: ",e.pathname),(0,S.useEffect)(()=>(t.current||(C++,t.current=!0,C>1&&console.warn(`[Runtime] Multiple RuntimeHeadManager instances detected (${C}). Only one instance should be mounted at the root of your application. Multiple instances may cause unexpected behavior.`)),()=>{t.current&&(C--,t.current=!1)}),[]),(0,S.useEffect)(()=>{if(typeof document>"u"||!document.head){console.warn("[Runtime] document.head is not accessible. Skipping head updates.");return}let a=r[r.length-1]?.data?.internal?.seoMeta;if(!(!a||a===null))try{a.title&&document.title!==a.title&&(document.title=a.title),q("description",a.description),q("keywords",a.keywords?.join(", ")),q("robots",a.robots),A("og:title",a.ogTitle),A("og:description",a.ogDescription),A("og:image",a.ogImage),A("og:url",a.ogUrl),A("og:type",a.ogType),b("twitter:card",a.twitterCard),b("twitter:title",a.twitterTitle),b("twitter:description",a.twitterDescription),b("twitter:image",a.twitterImage),rt("canonical",a.canonicalUrl),ot(a.jsonLd)}catch(c){console.error("[Runtime] Error updating document head:",c)}},[e,r]),null}function q(e,r){try{if(!document.head){console.warn(`[Runtime] Cannot update meta tag "${e}": document.head is not accessible`);return}let t=document.querySelector(`meta[name="${e}"][data-runtime-meta]`);if(t||(t=document.querySelector(`meta[name="${e}"]`)),!r||r===null||r.trim()===""){t&&t.remove();return}let n=L(r);t?t.setAttribute("data-runtime-meta","true"):(t=document.createElement("meta"),t.setAttribute("name",e),t.setAttribute("data-runtime-meta","true"),document.head.appendChild(t)),t.getAttribute("content")!==n&&t.setAttribute("content",n)}catch(t){console.warn(`[Runtime] Failed to update meta tag "${e}":`,t)}}function A(e,r){try{if(!document.head){console.warn(`[Runtime] Cannot update meta property "${e}": document.head is not accessible`);return}let t=document.querySelector(`meta[property="${e}"][data-runtime-meta]`);if(t||(t=document.querySelector(`meta[property="${e}"]`)),!r||r===null||r.trim()===""){t&&t.remove();return}let n=L(r);t?t.setAttribute("data-runtime-meta","true"):(t=document.createElement("meta"),t.setAttribute("property",e),t.setAttribute("data-runtime-meta","true"),document.head.appendChild(t)),t.getAttribute("content")!==n&&t.setAttribute("content",n)}catch(t){console.warn(`[Runtime] Failed to update meta property "${e}":`,t)}}function b(e,r){try{if(!document.head){console.warn(`[Runtime] Cannot update meta name "${e}": document.head is not accessible`);return}let t=document.querySelector(`meta[name="${e}"][data-runtime-meta]`);if(t||(t=document.querySelector(`meta[name="${e}"]`)),!r||r===null||r.trim()===""){t&&t.remove();return}let n=L(r);t?t.setAttribute("data-runtime-meta","true"):(t=document.createElement("meta"),t.setAttribute("name",e),t.setAttribute("data-runtime-meta","true"),document.head.appendChild(t)),t.getAttribute("content")!==n&&t.setAttribute("content",n)}catch(t){console.warn(`[Runtime] Failed to update meta name "${e}":`,t)}}function rt(e,r){try{if(!document.head){console.warn(`[Runtime] Cannot update link tag "${e}": document.head is not accessible`);return}let t=document.querySelector(`link[rel="${e}"][data-runtime-link]`);if(t||(t=document.querySelector(`link[rel="${e}"]`)),!r||r===null||r.trim()===""){t&&t.remove();return}let n=L(r);t?t.setAttribute("data-runtime-link","true"):(t=document.createElement("link"),t.setAttribute("rel",e),t.setAttribute("data-runtime-link","true"),document.head.appendChild(t)),t.getAttribute("href")!==n&&t.setAttribute("href",n)}catch(t){console.warn(`[Runtime] Failed to update link tag "${e}":`,t)}}function ot(e){try{if(!document.head){console.warn("[Runtime] Cannot update JSON-LD: document.head is not accessible");return}let r=document.querySelector("script[data-runtime-jsonld]");if(!e||e===null){r&&r.remove();return}let t=JSON.stringify(e);if(!r)if(r=document.querySelector('script[type="application/ld+json"]'),r&&!r.hasAttribute("data-runtime-jsonld")){r.setAttribute("data-runtime-jsonld","true"),r.textContent!==t&&(r.textContent=t);return}else r||(r=document.createElement("script"),r.setAttribute("type","application/ld+json"),r.setAttribute("data-runtime-jsonld","true"),document.head.appendChild(r));r.textContent!==t&&(r.textContent=t)}catch(r){console.error("[Runtime] Failed to update JSON-LD:",r)}}function L(e){if(!e||e===null)return"";try{let r=document.createElement("div");return r.textContent=e,r.innerHTML}catch(r){return console.warn("[Runtime] DOM-based HTML escaping failed, using fallback:",r),e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;")}}var Ee=f(require("react")),D=require("react"),le=({children:e})=>{let[r,t]=(0,D.useState)(!1),[n,i]=(0,D.useState)(!1);return(0,D.useEffect)(()=>{t(!0);let a=setTimeout(()=>{i(!0)},10);return()=>clearTimeout(a)},[]),Ee.createElement("div",{style:{position:r?"relative":"absolute",top:r?"auto":"-9999px",left:r?"auto":"-9999px",visibility:r?"visible":"hidden",pointerEvents:r?"auto":"none",opacity:n?1:0,transition:"opacity 0.6s ease-in-out"}},e)},Re=le;var Ne=f(Oe()),X=typeof window<"u"&&typeof document<"u";function Ie(e,r){if(e.path===r||e.path?.includes(":")&&mt(e.path,r))return{params:dt(e.path,r),pathname:r,route:e,pathnameBase:"/"};if(e.children)for(let t of e.children){let n=Ie(t,r);if(n)return n}return null}function mt(e,r){let t=e.split("/"),n=r.split("/");return t.length!==n.length?!1:t.every((i,a)=>i.startsWith(":")||i===n[a])}function dt(e,r){let t={},n=e.split("/"),i=r.split("/");return n.forEach((a,c)=>{a.startsWith(":")&&(t[a.substring(1)]=i[c])}),t}var Z=(e,r)=>{e.search.length>0&&!e.search.startsWith("?")&&(e.search=`?${e.search}`);let t=e.pathname.includes(process.env.PURE_ENV_STAGE)?e.pathname.replace(`/${process.env.PURE_ENV_STAGE}`,"/"):e.pathname,n=r.routes.map(i=>Ie(i,t)).filter(Boolean);return n.length===0&&console.warn("[Runtime] No matching routes found for:",e.pathname),{basename:"/",matches:n??[],location:e,loaderData:{},actionData:{},errors:n.length===0?{4:{path:`/${Ne.StatusCodes.NOT_FOUND}}`,id:"4",Component:r.defaults.ErrorBoundary,ErrorBoundary:r.defaults.ErrorBoundary,hasErrorBoundary:!0}}:null,statusCode:n.length>0?200:404,loaderHeaders:{},actionHeaders:{}}};var O=f(require("react")),J=require("react-router"),x=require("react-dom/client");function w(){return typeof window>"u"?Object.keys(process.env).some(e=>["AWS_LAMBDA_FUNCTION_NAME","LAMBDA_TASK_ROOT","FUNCTIONS_WORKER_RUNTIME","WEBSITE_INSTANCE_ID","FUNCTION_NAME","K_SERVICE","VERCEL","NETLIFY","FAAS_ENV","__OW_ACTION_NAME"].includes(e)):!1}var Tt="",ge;function pt(e){if(ge={...e},!e)throw new Error("[Runtime] Invalid configuration: runtime threads configuration object is required");if(!e.app||typeof e.app!="function")throw new Error("[Runtime] Invalid configuration: application entry function is required");if(!e.router||!(e.router instanceof I))throw new Error("[Runtime] Invalid configuration: router instance is required");if(console.log("[Runtime] Web runtime initialization started with configuration: ",{hasApp:!!e.app,hasRouter:!!e.router,serviceName:e.config?.serviceName,stage:e.config?.stage}),w()){console.log("[Runtime] Lambda runtime detected, skipping browser rendering pipeline");return}try{ft(e)}catch(r){throw console.error("[Runtime] Web runtime render failed:",r),r}}function ft(e){if(console.log("[Runtime] Web runtime boot sequence started..."),!X){console.warn("[Runtime] Non-browser environment detected, skipping web runtime rendering");return}if(w()){console.warn("[Runtime] Lambda runtime detected, skipping web runtime boot");return}let r=document.getElementById("root-internal"),t=document.getElementById("root-runtime");if(t?.hasChildNodes()){console.log("[Runtime] Pre-rendered DOM snapshot confirmed, binding client runtime...");try{r&&r.remove();try{let d=process.env.PURE_ENV_STAGE}catch{console.warn("\x1B[33m%s\x1B[0m","[WARNING] PURE_ENV_STAGE environment variable is not defined. This may cause unexpected behavior in the application. Please set PURE_ENV_STAGE (e.g., dev, staging, prod)")}let n=process.env.PURE_ENV_STAGE,i=window.location.pathname.includes(n)?window.location.pathname.replace(`/${n}/`,"/"):window.location.pathname;console.log("[Runtime] Route context loaded for:",i);let a={pathname:i,search:window.location.search,hash:window.location.hash||Tt,key:"default",state:null},c=Z(a,e.router);console.log("[Runtime] Routing graph resolved (",c.matches?.length||0,"match(es))");let R=(0,J.createBrowserRouter)(e.router.routes,{hydrationData:c});(0,x.hydrateRoot)(t,O.createElement(Re,null,O.createElement(()=>e.app({router:R}),null)),{onRecoverableError:(d,E)=>{}}),console.log("[Runtime] Web runtime boot sequence finished successfully")}catch(n){throw console.error("[Runtime] Web runtime boot sequence failed:",n),new Error(`[Runtime] Web runtime boot sequence failed: ${n instanceof Error?n.message:String(n)}`)}}else{if(console.log("[Runtime] No pre-rendered DOM snapshot found, creating fresh application root"),!r)throw new Error('[Runtime] Root element "root-internal" not found in DOM. Ensure your HTML includes <div id="root-internal"></div>');try{let n=(0,J.createBrowserRouter)(e.router.getRoutes()),i=(0,x.createRoot)(r),a=()=>e.app({router:n});i.render(O.createElement(O.StrictMode,null,O.createElement(a,null))),console.log("[Runtime] Fresh web runtime render completed successfully")}catch(n){throw console.error("[Runtime] Fresh web runtime render failed:",n),new Error(`[Runtime] Render error details:: ${n instanceof Error?n.message:String(n)}`)}}}var H=f(require("react")),Ae=require("react-dom/client"),B=require("react-router"),F=class{async execute(r,t){try{console.info("Starting browser pipeline execution",{serviceName:r.serviceName,stage:r.stage,url:t.metadata.url,userAgent:t.metadata.userAgent,viewport:t.metadata.viewport});let n=this.createBrowserRouter(r),i=this.createAppElement(r),a=H.createElement(B.RouterProvider,{router:n},i);this.hydrateApplication(a),this.setupHttpClient(r),console.info("Browser pipeline execution completed successfully",{serviceName:r.serviceName,stage:r.stage})}catch(n){throw console.error("Browser pipeline execution failed",{serviceName:r.serviceName,stage:r.stage,error:n instanceof Error?n.message:String(n),stack:n instanceof Error?n.stack:void 0}),n}}createBrowserRouter(r){console.debug("Creating browser router",{routeCount:r.router.getRoutes().length});let t=r.router.getRoutes(),n=(0,B.createBrowserRouter)(t);return console.debug("Browser router created successfully",{routeCount:t.length}),n}createAppElement(r){console.debug("Creating app element from factory");try{let t=r.app({router:r.router});if(!H.isValidElement(t))throw new Error("App factory must return a valid React element");return console.debug("App element created successfully"),t}catch(t){throw console.error("Failed to create app element",{error:t instanceof Error?t.message:String(t)}),new Error(`Failed to create app element: ${t instanceof Error?t.message:String(t)}`)}}hydrateApplication(r){console.debug("Starting React hydration");try{let t=document.getElementById("root");if(!t)throw new Error('Root container element not found. Expected element with id="root"');(0,Ae.hydrateRoot)(t,r),console.info("React hydration completed successfully")}catch(t){throw console.error("React hydration failed",{error:t instanceof Error?t.message:String(t)}),new Error(`React hydration failed: ${t instanceof Error?t.message:String(t)}`)}}setupHttpClient(r){console.debug("Setting up HTTP client for Lambda endpoints");try{let t=this.getApiBaseUrl(r.stage);typeof window<"u"&&(window.__RUNTIME_CONFIG__={serviceName:r.serviceName,stage:r.stage,apiBaseUrl:t}),console.info("HTTP client configured successfully",{baseUrl:t,stage:r.stage})}catch(t){throw console.error("Failed to setup HTTP client",{error:t instanceof Error?t.message:String(t)}),new Error(`Failed to setup HTTP client: ${t instanceof Error?t.message:String(t)}`)}}getApiBaseUrl(r){return`${typeof window<"u"?window.location.origin:""}/api`}};function Se(e){return/^[a-zA-Z][a-zA-Z0-9-]{0,127}$/.test(e)}var De=(E=>(E.React="react",E.Angular="angular",E.Vue="vue",E.Svelte="svelte",E.SvelteKit="sveltekit",E.Solid="solid",E.Polymer="polymer",E.Ember="ember",E.Preact="preact",E.Riot="riot",E))(De||{});var s=require("zod"),_t=["us-east-1","us-east-2","us-west-1","us-west-2","eu-west-1","eu-west-2","eu-west-3","eu-central-1","eu-central-2","eu-north-1","eu-south-1","eu-south-2","ap-southeast-1","ap-southeast-2","ap-southeast-3","ap-south-1","ap-south-2","ap-northeast-1","ap-northeast-2","ap-northeast-3","ap-east-1","sa-east-1","ca-central-1","me-south-1","me-central-1","af-south-1"],Ot=s.z.enum(_t),ye=s.z.object({name:s.z.enum(["dev","staging","prod"]),awsRegion:s.z.string().min(1),awsProfile:s.z.string().optional(),domain:s.z.string().optional(),subdomain:s.z.string().optional()}),Ue=s.z.object({srcDir:s.z.string().default("src"),reactEntry:s.z.string().default("src/index.tsx"),outDir:s.z.string().default("out/dist"),cdkDir:s.z.string().default("cdk").optional()}),he=s.z.object({enableSeo:s.z.boolean().default(!1),enableManifest:s.z.boolean().default(!0),enableWarmup:s.z.boolean().default(!1),clearCacheOnDeploy:s.z.boolean().default(!0)}),Nt=s.z.object({projectName:s.z.string().min(1),stages:s.z.array(ye).min(1),paths:Ue,infraMode:s.z.enum(["cdk","auto"]).default("cdk"),features:he.optional()}),It={projectName:"runtime-web-app",stages:[{name:"dev",awsRegion:"us-east-1"}],paths:{srcDir:"src",reactEntry:"src/index.tsx",outDir:"out/dist",cdkDir:"cdk"},infraMode:"cdk",features:{enableSeo:!1,enableManifest:!0,enableWarmup:!1,clearCacheOnDeploy:!0}};var Me=(r=>(r.RuntimeWebStack="runtime-web-stack",r))(Me||{}),Ce=(r=>(r.SeoEngineDynamoDbEntity="runtime_web_seo_engine",r))(Ce||{}),be=(r=>(r.StaticS3Bucket="runtime_web_static",r))(be||{}),Pe=(r=>(r.RuntimeWebApiGatewayStage="runtime_web_api_gateway_stage",r))(Pe||{}),Le=(r=>(r.CloudFrontDistribution="runtime_web_distribution",r))(Le||{}),ve=(i=>(i.RuntimeWebHandlerLambda="lambdaRuntimeWebHandler",i.RuntimeWebSeoLambda="lambdaRuntimeWebSeoHandler",i.RuntimeWebWarmupLambda="lambdaRuntimeWebWarmupHandler",i.RuntimeWebManifestLambda="lambdaRuntimeWebManifestHandler",i))(ve||{}),we=(r=>(r.RuntimeLambdaExecutionRole="runtime_web_lambda_execution_role",r))(we||{}),xe=(r=>(r.RuntimeWebApiGatewayExecutionRouter="runtime_web_api_gateway_execution_router",r))(xe||{});0&&(module.exports={ApiGatewayExecutionRouters,ApiGatewayStages,AwsRegionSchema,BrowserPipeline,CloudFrontDistributions,DEFAULT_CLI_CONFIG,DeployStacks,DynamoDbTables,EnginesBrowserFramework,ErrorBoundary,ErrorBoundaryNotFound,FeaturesConfigSchema,IamExecutionRoles,LambdaFunctions,PathsConfigSchema,RuntimeAppServer,RuntimeConfigSchema,RuntimeHeadManager,RuntimeRouter,RuntimeRouterProvider,S3Buckets,StageConfigSchema,createRouteLoader,createSeoRetriever,executeRuntimeAsync,fetchSeoMetadata,getDefaultSeoMeta,injectFlow,intersection,isBrowser,isLambdaRuntime,isValidServiceName,mergeLoaderResults,routePath,routerContext,runtime,runtimeRouter,runtimeThreads,useRuntimeData,useRuntimeSeoMeta});
7
+ - Timestamp:`,m.timestamp)}var ie=f(require("react")),C=require("react"),ae=require("react-router"),Ze=({router:e})=>{let[r,t]=(0,C.useState)(e);return(0,C.useEffect)(()=>{t(e)},[e]),e?ie.createElement(ae.RouterProvider,{key:"runtime-router-provider",router:r}):null};var ue=f(require("react")),_=require("react"),T=e=>"/".concat([...e].join("/")).replace(/\/+/g,"/");function se({children:e,router:r}){return e?r?_.Children.map(e,t=>(0,_.isValidElement)(t)?(t.type?.displayName||t.type?.name)==="RuntimeRouterProvider"?(console.log("[RuntimeRouter] Injecting router instance into RuntimeRouterProvider"),ue.cloneElement(t,{...t.props,router:r})):t.props.children?(0,_.cloneElement)(t,{children:se({children:t.props.children,router:r})}):t:t):(console.warn("[RuntimeRouter] injectFlow called with no router"),_.Children.toArray(e)):(console.warn("[RuntimeRouter] injectFlow called with no children"),[])}function j(e,r){let t=new Set(e),n=new Set(r),i=[];return Array.from(t).forEach(a=>{n.has(a)&&i.push(a)}),i}var I=class{constructor({router:r,defaults:t}){if(!r||!Array.isArray(r)||r.length===0)throw new Error("[RuntimeRouter] Invalid routing configuration: route definitions must be provided as a non-empty array");if(!t)throw new Error("[RuntimeRouter] Invalid configuration: runtime configuration router defaults object is required");this._defaults=t;let n=this.transformRoutes(r),i=Object.keys(this._defaults);this._router=Object.fromEntries(n.map((a,c)=>{a.id||(console.warn(`[RuntimeRouter] Route at index ${c} missing ID, generating one`),a.id=`route-${c}`);let R=Object.keys(a),m=j(i,R);return i.forEach(d=>{m.includes(d)||(a[d]=t[d])}),[a.id,a]})),console.log(`[RuntimeRouter] Routing graph initialized with ${Object.keys(this._router).length} route definition(s)`)}transformRoutes(r){return r.map(t=>this.transformRoute(t))}transformRoute(r){let{path:t,runtimeAsync:n,children:i,index:a,...c}=r,R=T([t??"/"]),m=V(R,n||[]),d=i?this.transformRoutes(i):void 0,E={...c,path:R,loader:m,children:d};return a===!1&&(E.index=!1),E}getRoutes(){return Object.values(this._router)}getRouteById(r){return this._router[r]}getRouteByPath(r){return this.getRoutes().find(t=>t.path===r)}get routes(){return Object.values(this._router)}get defaults(){return this._defaults}};function Je(e){return new I(e)}var k=class extends ce.Component{constructor(t){super(t);this.REDIRECT_TIMEOUT=10;this.isProduction=typeof window>"u"?process.env.PURE_ENV_STAGE==="prod":!1;this.handleReset=()=>{this.clearRedirectInterval(),this.setState({hasError:!1,error:null,errorInfo:null,redirectTimer:this.REDIRECT_TIMEOUT})};this.state={hasError:!1,error:null,errorInfo:null,redirectTimer:this.REDIRECT_TIMEOUT}}static getDerivedStateFromError(t){return{hasError:!0,error:t}}componentDidCatch(t,n){if(console.group("[ErrorBoundary] Error caught"),console.error("Error:",t),console.error("Error Info:",n),console.error("Component Stack:",n.componentStack),console.groupEnd(),this.setState({errorInfo:n}),this.props.onError)try{this.props.onError(t,n)}catch(i){console.error("[ErrorBoundary] Error in custom error handler:",i)}this.startRedirectCountdown()}startRedirectCountdown(){this.redirectInterval=setInterval(()=>{this.setState(t=>{let n=t.redirectTimer-1;return n<=0?(this.clearRedirectInterval(),this.redirectToHome(),{redirectTimer:0}):{redirectTimer:n}})},1e3)}clearRedirectInterval(){this.redirectInterval&&(clearInterval(this.redirectInterval),this.redirectInterval=void 0)}redirectToHome(){window.location.href=T(["/"])}componentWillUnmount(){this.clearRedirectInterval()}render(){if(this.state.hasError){if(this.props.fallback)return this.props.fallback;let t={container:{display:"flex",justifyContent:"center",alignItems:"center",minHeight:"100vh",padding:"20px",fontFamily:'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif',backgroundColor:"#f5f5f5"},content:{maxWidth:"800px",width:"100%",backgroundColor:"#ffffff",borderRadius:"8px",padding:"40px",boxShadow:"0 2px 8px rgba(0, 0, 0, 0.1)"},heading:{fontSize:"2rem",fontWeight:600,textAlign:"center",marginBottom:"20px",color:"#333"},errorBox:{backgroundColor:"#f5f5f5",padding:"16px",borderRadius:"4px",marginBottom:"20px",border:"1px solid #e0e0e0"},errorTitle:{fontSize:"1.125rem",fontWeight:600,color:"#d32f2f",marginBottom:"12px"},errorText:{whiteSpace:"pre-wrap",wordBreak:"break-word",fontFamily:"monospace",fontSize:"0.875rem",color:"#666",maxHeight:"200px",overflow:"auto",margin:0},message:{fontSize:"1rem",textAlign:"center",marginBottom:"16px",color:"#666"},timer:{fontSize:"1rem",textAlign:"center",marginBottom:"24px",color:"#999"},buttonContainer:{display:"flex",justifyContent:"center",gap:"16px",flexWrap:"wrap"},button:{padding:"12px 24px",fontSize:"1rem",fontWeight:500,borderRadius:"4px",border:"none",cursor:"pointer",textDecoration:"none",display:"inline-block",transition:"background-color 0.2s"},primaryButton:{backgroundColor:"#1976d2",color:"#ffffff"},secondaryButton:{backgroundColor:"#ffffff",color:"#1976d2",border:"1px solid #1976d2"}};return u.createElement("div",{style:t.container},u.createElement("div",{style:t.content},u.createElement("h1",{style:t.heading},this.isProduction?"Something went wrong":"An error occurred"),!this.isProduction&&this.state.error&&u.createElement("div",{style:t.errorBox},u.createElement("div",{style:t.errorTitle},"Error Details:"),u.createElement("pre",{style:t.errorText},this.state.error.toString()),this.state.errorInfo&&u.createElement(u.Fragment,null,u.createElement("div",{style:{...t.errorTitle,marginTop:"16px"}},"Component Stack:"),u.createElement("pre",{style:t.errorText},this.state.errorInfo.componentStack))),u.createElement("p",{style:t.message},this.isProduction?"We're sorry for the inconvenience. Please try again.":"Check the console for more details."),this.state.redirectTimer>0&&u.createElement("p",{style:t.timer},`Redirecting to homepage in ${this.state.redirectTimer} seconds`),u.createElement("div",{style:t.buttonContainer},u.createElement("button",{style:{...t.button,...t.primaryButton},onClick:this.handleReset,onMouseOver:n=>{n.currentTarget.style.backgroundColor="#1565c0"},onMouseOut:n=>{n.currentTarget.style.backgroundColor="#1976d2"}},"Try Again"),u.createElement("a",{style:{...t.button,...t.secondaryButton},href:T(["/"]),onMouseOver:n=>{n.currentTarget.style.backgroundColor="#f5f5f5"},onMouseOut:n=>{n.currentTarget.style.backgroundColor="#ffffff"}},"Go to Homepage"))))}return this.props.children}};function et(){let[r,t]=u.useState(10);u.useEffect(()=>{if(r>0){let i=setInterval(()=>{t(a=>a-1)},1e3);return()=>clearInterval(i)}else window.location.href=T(["/"])},[r]);let n={container:{display:"flex",justifyContent:"center",alignItems:"center",minHeight:"100vh",padding:"20px",fontFamily:'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif',backgroundColor:"#f5f5f5"},content:{maxWidth:"800px",width:"100%",backgroundColor:"#ffffff",borderRadius:"8px",padding:"40px",boxShadow:"0 2px 8px rgba(0, 0, 0, 0.1)",textAlign:"center"},heading:{fontSize:"2rem",fontWeight:600,marginBottom:"20px",color:"#333"},message:{fontSize:"1rem",marginBottom:"16px",color:"#666"},link:{color:"#1976d2",textDecoration:"none",fontSize:"1rem",fontWeight:500}};return u.createElement("div",{style:n.container},u.createElement("div",{style:n.content},u.createElement("h1",{style:n.heading},"We couldn't find the page you were looking for."),u.createElement("p",{style:n.message},`We'll take you back to the homepage in ${r} seconds`),u.createElement("p",{style:n.message},u.createElement("a",{href:T(["/"]),style:n.link,onMouseOver:i=>{i.currentTarget.style.textDecoration="underline"},onMouseOut:i=>{i.currentTarget.style.textDecoration="none"}},"Click to go to homepage"))))}var S=require("react"),P=require("react-router"),M=0;function tt(){let e=(0,P.useLocation)(),r=(0,P.useMatches)(),t=(0,S.useRef)(!1);return console.debug("[Runtime] Route change detected, syncing <head> for path: ",e.pathname),(0,S.useEffect)(()=>(t.current||(M++,t.current=!0,M>1&&console.warn(`[Runtime] Multiple RuntimeHeadManager instances detected (${M}). Only one instance should be mounted at the root of your application. Multiple instances may cause unexpected behavior.`)),()=>{t.current&&(M--,t.current=!1)}),[]),(0,S.useEffect)(()=>{if(typeof document>"u"||!document.head){console.warn("[Runtime] document.head is not accessible. Skipping head updates.");return}let a=r[r.length-1]?.data?.internal?.seoMeta;if(!(!a||a===null))try{a.title&&document.title!==a.title&&(document.title=a.title),q("description",a.description),q("keywords",a.keywords?.join(", ")),q("robots",a.robots),A("og:title",a.ogTitle),A("og:description",a.ogDescription),A("og:image",a.ogImage),A("og:url",a.ogUrl),A("og:type",a.ogType),b("twitter:card",a.twitterCard),b("twitter:title",a.twitterTitle),b("twitter:description",a.twitterDescription),b("twitter:image",a.twitterImage),rt("canonical",a.canonicalUrl),ot(a.jsonLd)}catch(c){console.error("[Runtime] Error updating document head:",c)}},[e,r]),null}function q(e,r){try{if(!document.head){console.warn(`[Runtime] Cannot update meta tag "${e}": document.head is not accessible`);return}let t=document.querySelector(`meta[name="${e}"][data-runtime-meta]`);if(t||(t=document.querySelector(`meta[name="${e}"]`)),!r||r===null||r.trim()===""){t&&t.remove();return}let n=L(r);t?t.setAttribute("data-runtime-meta","true"):(t=document.createElement("meta"),t.setAttribute("name",e),t.setAttribute("data-runtime-meta","true"),document.head.appendChild(t)),t.getAttribute("content")!==n&&t.setAttribute("content",n)}catch(t){console.warn(`[Runtime] Failed to update meta tag "${e}":`,t)}}function A(e,r){try{if(!document.head){console.warn(`[Runtime] Cannot update meta property "${e}": document.head is not accessible`);return}let t=document.querySelector(`meta[property="${e}"][data-runtime-meta]`);if(t||(t=document.querySelector(`meta[property="${e}"]`)),!r||r===null||r.trim()===""){t&&t.remove();return}let n=L(r);t?t.setAttribute("data-runtime-meta","true"):(t=document.createElement("meta"),t.setAttribute("property",e),t.setAttribute("data-runtime-meta","true"),document.head.appendChild(t)),t.getAttribute("content")!==n&&t.setAttribute("content",n)}catch(t){console.warn(`[Runtime] Failed to update meta property "${e}":`,t)}}function b(e,r){try{if(!document.head){console.warn(`[Runtime] Cannot update meta name "${e}": document.head is not accessible`);return}let t=document.querySelector(`meta[name="${e}"][data-runtime-meta]`);if(t||(t=document.querySelector(`meta[name="${e}"]`)),!r||r===null||r.trim()===""){t&&t.remove();return}let n=L(r);t?t.setAttribute("data-runtime-meta","true"):(t=document.createElement("meta"),t.setAttribute("name",e),t.setAttribute("data-runtime-meta","true"),document.head.appendChild(t)),t.getAttribute("content")!==n&&t.setAttribute("content",n)}catch(t){console.warn(`[Runtime] Failed to update meta name "${e}":`,t)}}function rt(e,r){try{if(!document.head){console.warn(`[Runtime] Cannot update link tag "${e}": document.head is not accessible`);return}let t=document.querySelector(`link[rel="${e}"][data-runtime-link]`);if(t||(t=document.querySelector(`link[rel="${e}"]`)),!r||r===null||r.trim()===""){t&&t.remove();return}let n=L(r);t?t.setAttribute("data-runtime-link","true"):(t=document.createElement("link"),t.setAttribute("rel",e),t.setAttribute("data-runtime-link","true"),document.head.appendChild(t)),t.getAttribute("href")!==n&&t.setAttribute("href",n)}catch(t){console.warn(`[Runtime] Failed to update link tag "${e}":`,t)}}function ot(e){try{if(!document.head){console.warn("[Runtime] Cannot update JSON-LD: document.head is not accessible");return}let r=document.querySelector("script[data-runtime-jsonld]");if(!e||e===null){r&&r.remove();return}let t=JSON.stringify(e);if(!r)if(r=document.querySelector('script[type="application/ld+json"]'),r&&!r.hasAttribute("data-runtime-jsonld")){r.setAttribute("data-runtime-jsonld","true"),r.textContent!==t&&(r.textContent=t);return}else r||(r=document.createElement("script"),r.setAttribute("type","application/ld+json"),r.setAttribute("data-runtime-jsonld","true"),document.head.appendChild(r));r.textContent!==t&&(r.textContent=t)}catch(r){console.error("[Runtime] Failed to update JSON-LD:",r)}}function L(e){if(!e||e===null)return"";try{let r=document.createElement("div");return r.textContent=e,r.innerHTML}catch(r){return console.warn("[Runtime] DOM-based HTML escaping failed, using fallback:",r),e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;")}}var Ee=f(require("react")),D=require("react"),le=({children:e})=>{let[r,t]=(0,D.useState)(!1),[n,i]=(0,D.useState)(!1);return(0,D.useEffect)(()=>{t(!0);let a=setTimeout(()=>{i(!0)},10);return()=>clearTimeout(a)},[]),Ee.createElement("div",{style:{position:r?"relative":"absolute",top:r?"auto":"-9999px",left:r?"auto":"-9999px",visibility:r?"visible":"hidden",pointerEvents:r?"auto":"none",opacity:n?1:0,transition:"opacity 0.6s ease-in-out"}},e)},Re=le;var Ne=f(Oe()),X=typeof window<"u"&&typeof document<"u";function Ie(e,r){if(e.path===r||e.path?.includes(":")&&mt(e.path,r))return{params:dt(e.path,r),pathname:r,route:e,pathnameBase:"/"};if(e.children)for(let t of e.children){let n=Ie(t,r);if(n)return n}return null}function mt(e,r){let t=e.split("/"),n=r.split("/");return t.length!==n.length?!1:t.every((i,a)=>i.startsWith(":")||i===n[a])}function dt(e,r){let t={},n=e.split("/"),i=r.split("/");return n.forEach((a,c)=>{a.startsWith(":")&&(t[a.substring(1)]=i[c])}),t}var Z=(e,r)=>{e.search.length>0&&!e.search.startsWith("?")&&(e.search=`?${e.search}`);let t=e.pathname.includes(process.env.PURE_ENV_STAGE)?e.pathname.replace(`/${process.env.PURE_ENV_STAGE}`,"/"):e.pathname,n=r.routes.map(i=>Ie(i,t)).filter(Boolean);return n.length===0&&console.warn("[Runtime] No matching routes found for:",e.pathname),{basename:"/",matches:n??[],location:e,loaderData:{},actionData:{},errors:n.length===0?{4:{path:`/${Ne.StatusCodes.NOT_FOUND}}`,id:"4",Component:r.defaults.ErrorBoundary,ErrorBoundary:r.defaults.ErrorBoundary,hasErrorBoundary:!0}}:null,statusCode:n.length>0?200:404,loaderHeaders:{},actionHeaders:{}}};var O=f(require("react")),J=require("react-router"),x=require("react-dom/client");function w(){return typeof window>"u"?Object.keys(process.env).some(e=>["AWS_LAMBDA_FUNCTION_NAME","LAMBDA_TASK_ROOT","FUNCTIONS_WORKER_RUNTIME","WEBSITE_INSTANCE_ID","FUNCTION_NAME","K_SERVICE","VERCEL","NETLIFY","FAAS_ENV","__OW_ACTION_NAME"].includes(e)):!1}var Tt="",ge;function pt(e){if(ge={...e},!e)throw new Error("[Runtime] Invalid configuration: runtime threads configuration object is required");if(!e.app||typeof e.app!="function")throw new Error("[Runtime] Invalid configuration: application entry function is required");if(!e.router||!(e.router instanceof I))throw new Error("[Runtime] Invalid configuration: router instance is required");if(console.log("[Runtime] Web runtime initialization started with configuration: ",{hasApp:!!e.app,hasRouter:!!e.router,serviceName:e.config?.serviceName,stage:e.config?.stage}),w()){console.log("[Runtime] Lambda runtime detected, skipping browser rendering pipeline");return}try{ft(e)}catch(r){throw console.error("[Runtime] Web runtime render failed:",r),r}}function ft(e){if(console.log("[Runtime] Web runtime boot sequence started..."),!X){console.warn("[Runtime] Non-browser environment detected, skipping web runtime rendering");return}if(w()){console.warn("[Runtime] Lambda runtime detected, skipping web runtime boot");return}let r=document.getElementById("root-internal"),t=document.getElementById("root-runtime");if(t?.hasChildNodes()){console.log("[Runtime] Pre-rendered DOM snapshot confirmed, binding client runtime...");try{r&&r.remove();try{let d=process.env.PURE_ENV_STAGE}catch{console.warn("\x1B[33m%s\x1B[0m","[WARNING] PURE_ENV_STAGE environment variable is not defined. This may cause unexpected behavior in the application. Please set PURE_ENV_STAGE (e.g., dev, staging, prod)")}let n=process.env.PURE_ENV_STAGE,i=window.location.pathname.includes(n)?window.location.pathname.replace(`/${n}/`,"/"):window.location.pathname;console.log("[Runtime] Route context loaded for:",i);let a={pathname:i,search:window.location.search,hash:window.location.hash||Tt,key:"default",state:null},c=Z(a,e.router);console.log("[Runtime] Routing graph resolved (",c.matches?.length||0,"match(es))");let R=(0,J.createBrowserRouter)(e.router.routes,{hydrationData:c});(0,x.hydrateRoot)(t,O.createElement(Re,null,O.createElement(()=>e.app({router:R}),null)),{onRecoverableError:(d,E)=>{}}),console.log("[Runtime] Web runtime boot sequence finished successfully")}catch(n){throw console.error("[Runtime] Web runtime boot sequence failed:",n),new Error(`[Runtime] Web runtime boot sequence failed: ${n instanceof Error?n.message:String(n)}`)}}else{if(console.log("[Runtime] No pre-rendered DOM snapshot found, creating fresh application root"),!r)throw new Error('[Runtime] Root element "root-internal" not found in DOM. Ensure your HTML includes <div id="root-internal"></div>');try{let n=(0,J.createBrowserRouter)(e.router.getRoutes()),i=(0,x.createRoot)(r),a=()=>e.app({router:n});i.render(O.createElement(O.StrictMode,null,O.createElement(a,null))),console.log("[Runtime] Fresh web runtime render completed successfully")}catch(n){throw console.error("[Runtime] Fresh web runtime render failed:",n),new Error(`[Runtime] Render error details:: ${n instanceof Error?n.message:String(n)}`)}}}var H=f(require("react")),Ae=require("react-dom/client"),B=require("react-router"),F=class{async execute(r,t){try{console.info("Starting browser pipeline execution",{serviceName:r.serviceName,stage:r.stage,url:t.metadata.url,userAgent:t.metadata.userAgent,viewport:t.metadata.viewport});let n=this.createBrowserRouter(r),i=this.createAppElement(r),a=H.createElement(B.RouterProvider,{router:n},i);this.hydrateApplication(a),this.setupHttpClient(r),console.info("Browser pipeline execution completed successfully",{serviceName:r.serviceName,stage:r.stage})}catch(n){throw console.error("Browser pipeline execution failed",{serviceName:r.serviceName,stage:r.stage,error:n instanceof Error?n.message:String(n),stack:n instanceof Error?n.stack:void 0}),n}}createBrowserRouter(r){console.debug("Creating browser router",{routeCount:r.router.getRoutes().length});let t=r.router.getRoutes(),n=(0,B.createBrowserRouter)(t);return console.debug("Browser router created successfully",{routeCount:t.length}),n}createAppElement(r){console.debug("Creating app element from factory");try{let t=r.app({router:r.router});if(!H.isValidElement(t))throw new Error("App factory must return a valid React element");return console.debug("App element created successfully"),t}catch(t){throw console.error("Failed to create app element",{error:t instanceof Error?t.message:String(t)}),new Error(`Failed to create app element: ${t instanceof Error?t.message:String(t)}`)}}hydrateApplication(r){console.debug("Starting React hydration");try{let t=document.getElementById("root");if(!t)throw new Error('Root container element not found. Expected element with id="root"');(0,Ae.hydrateRoot)(t,r),console.info("React hydration completed successfully")}catch(t){throw console.error("React hydration failed",{error:t instanceof Error?t.message:String(t)}),new Error(`React hydration failed: ${t instanceof Error?t.message:String(t)}`)}}setupHttpClient(r){console.debug("Setting up HTTP client for Lambda endpoints");try{let t=this.getApiBaseUrl(r.stage);typeof window<"u"&&(window.__RUNTIME_CONFIG__={serviceName:r.serviceName,stage:r.stage,apiBaseUrl:t}),console.info("HTTP client configured successfully",{baseUrl:t,stage:r.stage})}catch(t){throw console.error("Failed to setup HTTP client",{error:t instanceof Error?t.message:String(t)}),new Error(`Failed to setup HTTP client: ${t instanceof Error?t.message:String(t)}`)}}getApiBaseUrl(r){return`${typeof window<"u"?window.location.origin:""}/api`}};function Se(e){return/^[a-zA-Z][a-zA-Z0-9-]{0,127}$/.test(e)}var De=(E=>(E.React="react",E.Angular="angular",E.Vue="vue",E.Svelte="svelte",E.SvelteKit="sveltekit",E.Solid="solid",E.Polymer="polymer",E.Ember="ember",E.Preact="preact",E.Riot="riot",E))(De||{});var s=require("zod"),_t=["us-east-1","us-east-2","us-west-1","us-west-2","eu-west-1","eu-west-2","eu-west-3","eu-central-1","eu-central-2","eu-north-1","eu-south-1","eu-south-2","ap-southeast-1","ap-southeast-2","ap-southeast-3","ap-south-1","ap-south-2","ap-northeast-1","ap-northeast-2","ap-northeast-3","ap-east-1","sa-east-1","ca-central-1","me-south-1","me-central-1","af-south-1"],Ot=s.z.enum(_t),ye=s.z.object({name:s.z.enum(["dev","staging","prod"]),awsRegion:s.z.string().min(1),awsProfile:s.z.string().optional(),domain:s.z.string().optional(),subdomain:s.z.string().optional()}),Ue=s.z.object({srcDir:s.z.string().default("src"),reactEntry:s.z.string().default("src/index.tsx"),outDir:s.z.string().default("out/dist"),cdkDir:s.z.string().default("cdk").optional()}),he=s.z.object({enableSeo:s.z.boolean().default(!1),enableManifest:s.z.boolean().default(!0),enableWarmup:s.z.boolean().default(!1),clearCacheOnDeploy:s.z.boolean().default(!0)}),Nt=s.z.object({projectName:s.z.string().min(1),stages:s.z.array(ye).min(1),paths:Ue,infraMode:s.z.enum(["cdk","auto"]).default("cdk"),features:he.optional()}),It={projectName:"runtime-web-app",stages:[{name:"dev",awsRegion:"us-east-1"}],paths:{srcDir:"src",reactEntry:"src/index.tsx",outDir:"out/dist",cdkDir:"cdk"},infraMode:"cdk",features:{enableSeo:!1,enableManifest:!0,enableWarmup:!1,clearCacheOnDeploy:!0}};var Ce=(r=>(r.RuntimeWebStack="runtime-web-stack",r))(Ce||{}),Me=(r=>(r.SeoEngineDynamoDbEntity="runtime_web_seo_engine",r))(Me||{}),be=(r=>(r.StaticS3Bucket="runtime_web_static",r))(be||{}),Pe=(r=>(r.RuntimeWebApiGatewayStage="runtime_web_api_gateway_stage",r))(Pe||{}),Le=(r=>(r.CloudFrontDistribution="runtime_web_distribution",r))(Le||{}),ve=(i=>(i.RuntimeWebHandlerLambda="lambdaRuntimeWebHandler",i.RuntimeWebSeoLambda="lambdaRuntimeWebSeoHandler",i.RuntimeWebWarmupLambda="lambdaRuntimeWebWarmupHandler",i.RuntimeWebManifestLambda="lambdaRuntimeWebManifestHandler",i))(ve||{}),we=(r=>(r.RuntimeLambdaExecutionRole="runtime_web_lambda_execution_role",r))(we||{}),xe=(r=>(r.RuntimeWebApiGatewayExecutionRouter="runtime_web_api_gateway_execution_router",r))(xe||{});0&&(module.exports={ApiGatewayExecutionRouters,ApiGatewayStages,AwsRegionSchema,BrowserPipeline,CloudFrontDistributions,DEFAULT_CLI_CONFIG,DeployStacks,DynamoDbTables,EnginesBrowserFramework,ErrorBoundary,ErrorBoundaryNotFound,FeaturesConfigSchema,IamExecutionRoles,LambdaFunctions,PathsConfigSchema,RuntimeAppServer,RuntimeConfigSchema,RuntimeHeadManager,RuntimeRouter,RuntimeRouterProvider,S3Buckets,StageConfigSchema,createRouteLoader,createSeoRetriever,executeRuntimeAsync,fetchSeoMetadata,getDefaultSeoMeta,injectFlow,intersection,isBrowser,isLambdaRuntime,isValidServiceName,mergeLoaderResults,routePath,routerContext,runtime,runtimeRouter,runtimeThreads,useRuntimeData,useRuntimeSeoMeta});
8
8
  //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2h0dHAtc3RhdHVzLWNvZGVzL2J1aWxkL2Nqcy9sZWdhY3kuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2h0dHAtc3RhdHVzLWNvZGVzL2J1aWxkL2Nqcy91dGlscy5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvaHR0cC1zdGF0dXMtY29kZXMvYnVpbGQvY2pzL3V0aWxzLWZ1bmN0aW9ucy5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvaHR0cC1zdGF0dXMtY29kZXMvYnVpbGQvY2pzL3N0YXR1cy1jb2Rlcy5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvaHR0cC1zdGF0dXMtY29kZXMvYnVpbGQvY2pzL3JlYXNvbi1waHJhc2VzLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9odHRwLXN0YXR1cy1jb2Rlcy9idWlsZC9janMvaW5kZXguanMiLCAiLi4vLi4vLi4vc3JjL2luZGV4LnRzeCIsICIuLi8uLi8uLi9zcmMvbGliL3J1bnRpbWUtY29yZS9jb21wb25lbnRzL2Vycm9yLmJvdW5kYXJ5L2luZGV4LnRzeCIsICIuLi8uLi8uLi9zcmMvbGliL3J1bnRpbWUtY29yZS9ydW50aW1lLnJvdXRlci9ydW50aW1lLnJvdXRlci5ob29rcy50cyIsICIuLi8uLi8uLi9zcmMvbGliL3J1bnRpbWUtY29yZS9ydW50aW1lLnJvdXRlci9ydW50aW1lLnJvdXRlci5zZW8uYXBpLWNsaWVudC50cyIsICIuLi8uLi8uLi9zcmMvbGliL3J1bnRpbWUtY29yZS9ydW50aW1lLnJvdXRlci9ydW50aW1lLnJvdXRlci5zZW8udHMiLCAiLi4vLi4vLi4vc3JjL2xpYi9ydW50aW1lLWNvcmUvcnVudGltZS5yb3V0ZXIvcnVudGltZS5yb3V0ZXIubG9hZGVyLnRzIiwgIi4uLy4uLy4uL3NyYy9saWIvcnVudGltZS1jb3JlL3J1bnRpbWUucm91dGVyL3J1bnRpbWUucm91dGVyLnByb3ZpZGVyLnRzeCIsICIuLi8uLi8uLi9zcmMvbGliL3J1bnRpbWUtY29yZS9ydW50aW1lLnJvdXRlci9ydW50aW1lLnJvdXRlci51dGlscy50c3giLCAiLi4vLi4vLi4vc3JjL2xpYi9ydW50aW1lLWNvcmUvcnVudGltZS5yb3V0ZXIvcnVudGltZS5yb3V0ZXIudHN4IiwgIi4uLy4uLy4uL3NyYy9saWIvcnVudGltZS1jb3JlL2NvbXBvbmVudHMvcnVudGltZS13ZWItaGVhZC1tYW5hZ2VyLnRzeCIsICIuLi8uLi8uLi9zcmMvbGliL3J1bnRpbWUtY29yZS9ydW50aW1lLmFwcC5zZXJ2ZXIudHN4IiwgIi4uLy4uLy4uL3NyYy9saWIvcnVudGltZS1jb3JlL3JlYWN0LnV0aWxzLnRzeCIsICIuLi8uLi8uLi9zcmMvbGliL3J1bnRpbWUtY29yZS9ydW50aW1lLnRzeCIsICIuLi8uLi8uLi9zcmMvbGliL3J1bnRpbWUtY29yZS9ydW50aW1lLnV0aWxzLnRzeCIsICIuLi8uLi8uLi9zcmMvbGliL3J1bnRpbWUtd2ViL3BpcGVsaW5lcy9icm93c2VyLXBpcGVsaW5lLnRzIiwgIi4uLy4uLy4uL3NyYy9saWIvcnVudGltZS13ZWIvdHlwZXMvcnVudGltZS13ZWIuY29uZmlnLnR5cGVzLnRzIiwgIi4uLy4uLy4uL3NyYy9saWIvcnVudGltZS50eXBlcy50c3giLCAiLi4vLi4vLi4vc3JjL3V0aWxzL3R5cGVzL3J1bnRpbWUuY29uZmlnLnRzIiwgIi4uLy4uLy4uL3NyYy91dGlscy90eXBlcy9jbG91ZHMvY2xvdWRzLmF3cy50eXBlcy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiXCJ1c2Ugc3RyaWN0XCI7XG4vLyBFeHBvcnRpbmcgY29uc3RhbnRzIGRpcmVjdGx5IHRvIG1haW50YWluIGNvbXBhdGFiaWxpdHkgd2l0aCB2MVxuLy8gVGhlc2UgYXJlIGRlcHJlY2F0ZWQuIFBsZWFzZSBkb24ndCBhZGQgYW55IG5ldyBjb2RlcyBoZXJlLlxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5VU0VfUFJPWFkgPSBleHBvcnRzLlVOU1VQUE9SVEVEX01FRElBX1RZUEUgPSBleHBvcnRzLlVOUFJPQ0VTU0FCTEVfRU5USVRZID0gZXhwb3J0cy5VTkFVVEhPUklaRUQgPSBleHBvcnRzLlRPT19NQU5ZX1JFUVVFU1RTID0gZXhwb3J0cy5URU1QT1JBUllfUkVESVJFQ1QgPSBleHBvcnRzLlNXSVRDSElOR19QUk9UT0NPTFMgPSBleHBvcnRzLlNFUlZJQ0VfVU5BVkFJTEFCTEUgPSBleHBvcnRzLlNFRV9PVEhFUiA9IGV4cG9ydHMuUkVTRVRfQ09OVEVOVCA9IGV4cG9ydHMuUkVRVUVTVEVEX1JBTkdFX05PVF9TQVRJU0ZJQUJMRSA9IGV4cG9ydHMuUkVRVUVTVF9VUklfVE9PX0xPTkcgPSBleHBvcnRzLlJFUVVFU1RfVE9PX0xPTkcgPSBleHBvcnRzLlJFUVVFU1RfVElNRU9VVCA9IGV4cG9ydHMuUkVRVUVTVF9IRUFERVJfRklFTERTX1RPT19MQVJHRSA9IGV4cG9ydHMuUFJPWFlfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQgPSBleHBvcnRzLlBST0NFU1NJTkcgPSBleHBvcnRzLlBSRUNPTkRJVElPTl9SRVFVSVJFRCA9IGV4cG9ydHMuUFJFQ09ORElUSU9OX0ZBSUxFRCA9IGV4cG9ydHMuUEVSTUFORU5UX1JFRElSRUNUID0gZXhwb3J0cy5QQVlNRU5UX1JFUVVJUkVEID0gZXhwb3J0cy5QQVJUSUFMX0NPTlRFTlQgPSBleHBvcnRzLk9LID0gZXhwb3J0cy5OT1RfTU9ESUZJRUQgPSBleHBvcnRzLk5PVF9JTVBMRU1FTlRFRCA9IGV4cG9ydHMuTk9UX0ZPVU5EID0gZXhwb3J0cy5OT1RfQUNDRVBUQUJMRSA9IGV4cG9ydHMuTk9OX0FVVEhPUklUQVRJVkVfSU5GT1JNQVRJT04gPSBleHBvcnRzLk5PX0NPTlRFTlQgPSBleHBvcnRzLk5FVFdPUktfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQgPSBleHBvcnRzLk1VTFRJUExFX0NIT0lDRVMgPSBleHBvcnRzLk1VTFRJX1NUQVRVUyA9IGV4cG9ydHMuTU9WRURfVEVNUE9SQVJJTFkgPSBleHBvcnRzLk1PVkVEX1BFUk1BTkVOVExZID0gZXhwb3J0cy5NRVRIT0RfTk9UX0FMTE9XRUQgPSBleHBvcnRzLk1FVEhPRF9GQUlMVVJFID0gZXhwb3J0cy5MT0NLRUQgPSBleHBvcnRzLkxFTkdUSF9SRVFVSVJFRCA9IGV4cG9ydHMuSU5URVJOQUxfU0VSVkVSX0VSUk9SID0gZXhwb3J0cy5JTlNVRkZJQ0lFTlRfU1RPUkFHRSA9IGV4cG9ydHMuSU5TVUZGSUNJRU5UX1NQQUNFX09OX1JFU09VUkNFID0gZXhwb3J0cy5JTV9BX1RFQVBPVCA9IGV4cG9ydHMuSFRUUF9WRVJTSU9OX05PVF9TVVBQT1JURUQgPSBleHBvcnRzLkdPTkUgPSBleHBvcnRzLkdBVEVXQVlfVElNRU9VVCA9IGV4cG9ydHMuRk9SQklEREVOID0gZXhwb3J0cy5GQUlMRURfREVQRU5ERU5DWSA9IGV4cG9ydHMuRVhQRUNUQVRJT05fRkFJTEVEID0gZXhwb3J0cy5DUkVBVEVEID0gZXhwb3J0cy5DT05USU5VRSA9IGV4cG9ydHMuQ09ORkxJQ1QgPSBleHBvcnRzLkJBRF9SRVFVRVNUID0gZXhwb3J0cy5CQURfR0FURVdBWSA9IGV4cG9ydHMuQUNDRVBURUQgPSB2b2lkIDA7XG4vKipcbiAqIEBkZXByZWNhdGVkIFBsZWFzZSB1c2UgU3RhdHVzQ29kZXMuQUNDRVBURURcbiAqXG4gKiAqL1xuZXhwb3J0cy5BQ0NFUFRFRCA9IDIwMjtcbi8qKlxuICogQGRlcHJlY2F0ZWQgUGxlYXNlIHVzZSBTdGF0dXNDb2Rlcy5CQURfR0FURVdBWVxuICpcbiAqICovXG5leHBvcnRzLkJBRF9HQVRFV0FZID0gNTAyO1xuLyoqXG4gKiBAZGVwcmVjYXRlZCBQbGVhc2UgdXNlIFN0YXR1c0NvZGVzLkJBRF9SRVFVRVNUXG4gKlxuICogKi9cbmV4cG9ydHMuQkFEX1JFUVVFU1QgPSA0MDA7XG4vKipcbiAqIEBkZXByZWNhdGVkIFBsZWFzZSB1c2UgU3RhdHVzQ29kZXMuQ09ORkxJQ1RcbiAqXG4gKiAqL1xuZXhwb3J0cy5DT05GTElDVCA9IDQwOTtcbi8qKlxuICogQGRlcHJlY2F0ZWQgUGxlYXNlIHVzZSBTdGF0dXNDb2Rlcy5DT05USU5VRVxuICpcbiAqICovXG5leHBvcnRzLkNPTlRJTlVFID0gMTAwO1xuLyoqXG4gKiBAZGVwcmVjYXRlZCBQbGVhc2UgdXNlIFN0YXR1c0NvZGVzLkNSRUFURURcbiAqXG4gKiAqL1xuZXhwb3J0cy5DUkVBVEVEID0gMjAxO1xuLyoqXG4gKiBAZGVwcmVjYXRlZCBQbGVhc2UgdXNlIFN0YXR1c0NvZGVzLkVYUEVDVEFUSU9OX0ZBSUxFRFxuICpcbiAqICovXG5leHBvcnRzLkVYUEVDVEFUSU9OX0ZBSUxFRCA9IDQxNztcbi8qKlxuICogQGRlcHJlY2F0ZWQgUGxlYXNlIHVzZSBTdGF0dXNDb2Rlcy5GQUlMRURfREVQRU5ERU5DWVxuICpcbiAqICovXG5leHBvcnRzLkZBSUxFRF9ERVBFTkRFTkNZID0gNDI0O1xuLyoqXG4gKiBAZGVwcmVjYXRlZCBQbGVhc2UgdXNlIFN0YXR1c0NvZGVzLkZPUkJJRERFTlxuICpcbiAqICovXG5leHBvcnRzLkZPUkJJRERFTiA9IDQwMztcbi8qKlxuICogQGRlcHJlY2F0ZWQgUGxlYXNlIHVzZSBTdGF0dXNDb2Rlcy5HQVRFV0FZX1RJTUVPVVRcbiAqXG4gKiAqL1xuZXhwb3J0cy5HQVRFV0FZX1RJTUVPVVQgPSA1MDQ7XG4vKipcbiAqIEBkZXByZWNhdGVkIFBsZWFzZSB1c2UgU3RhdHVzQ29kZXMuR09ORVxuICpcbiAqICovXG5leHBvcnRzLkdPTkUgPSA0MTA7XG4vKipcbiAqIEBkZXByZWNhdGVkIFBsZWFzZSB1c2UgU3RhdHVzQ29kZXMuSFRUUF9WRVJTSU9OX05PVF9TVVBQT1JURURcbiAqXG4gKiAqL1xuZXhwb3J0cy5IVFRQX1ZFUlNJT05fTk9UX1NVUFBPUlRFRCA9IDUwNTtcbi8qKlxuICogQGRlcHJlY2F0ZWQgUGxlYXNlIHVzZSBTdGF0dXNDb2Rlcy5JTV9BX1RFQVBPVFxuICpcbiAqICovXG5leHBvcnRzLklNX0FfVEVBUE9UID0gNDE4O1xuLyoqXG4gKiBAZGVwcmVjYXRlZCBQbGVhc2UgdXNlIFN0YXR1c0NvZGVzLklOU1VGRklDSUVOVF9TUEFDRV9PTl9SRVNPVVJDRVxuICpcbiAqICovXG5leHBvcnRzLklOU1VGRklDSUVOVF9TUEFDRV9PTl9SRVNPVVJDRSA9IDQxOTtcbi8qKlxuICogQGRlcHJlY2F0ZWQgUGxlYXNlIHVzZSBTdGF0dXNDb2Rlcy5JTlNVRkZJQ0lFTlRfU1RPUkFHRVxuICpcbiAqICovXG5leHBvcnRzLklOU1VGRklDSUVOVF9TVE9SQUdFID0gNTA3O1xuLyoqXG4gKiBAZGVwcmVjYXRlZCBQbGVhc2UgdXNlIFN0YXR1c0NvZGVzLklOVEVSTkFMX1NFUlZFUl9FUlJPUlxuICpcbiAqICovXG5leHBvcnRzLklOVEVSTkFMX1NFUlZFUl9FUlJPUiA9IDUwMDtcbi8qKlxuICogQGRlcHJlY2F0ZWQgUGxlYXNlIHVzZSBTdGF0dXNDb2Rlcy5MRU5HVEhfUkVRVUlSRURcbiAqXG4gKiAqL1xuZXhwb3J0cy5MRU5HVEhfUkVRVUlSRUQgPSA0MTE7XG4vKipcbiAqIEBkZXByZWNhdGVkIFBsZWFzZSB1c2UgU3RhdHVzQ29kZXMuTE9DS0VEXG4gKlxuICogKi9cbmV4cG9ydHMuTE9DS0VEID0gNDIzO1xuLyoqXG4gKiBAZGVwcmVjYXRlZCBQbGVhc2UgdXNlIFN0YXR1c0NvZGVzLk1FVEhPRF9GQUlMVVJFXG4gKlxuICogKi9cbmV4cG9ydHMuTUVUSE9EX0ZBSUxVUkUgPSA0MjA7XG4vKipcbiAqIEBkZXByZWNhdGVkIFBsZWFzZSB1c2UgU3RhdHVzQ29kZXMuTUVUSE9EX05PVF9BTExPV0VEXG4gKlxuICogKi9cbmV4cG9ydHMuTUVUSE9EX05PVF9BTExPV0VEID0gNDA1O1xuLyoqXG4gKiBAZGVwcmVjYXRlZCBQbGVhc2UgdXNlIFN0YXR1c0NvZGVzLk1PVkVEX1BFUk1BTkVOVExZXG4gKlxuICogKi9cbmV4cG9ydHMuTU9WRURfUEVSTUFORU5UTFkgPSAzMDE7XG4vKipcbiAqIEBkZXByZWNhdGVkIFBsZWFzZSB1c2UgU3RhdHVzQ29kZXMuTU9WRURfVEVNUE9SQVJJTFlcbiAqXG4gKiAqL1xuZXhwb3J0cy5NT1ZFRF9URU1QT1JBUklMWSA9IDMwMjtcbi8qKlxuICogQGRlcHJlY2F0ZWQgUGxlYXNlIHVzZSBTdGF0dXNDb2Rlcy5NVUxUSV9TVEFUVVNcbiAqXG4gKiAqL1xuZXhwb3J0cy5NVUxUSV9TVEFUVVMgPSAyMDc7XG4vKipcbiAqIEBkZXByZWNhdGVkIFBsZWFzZSB1c2UgU3RhdHVzQ29kZXMuTVVMVElQTEVfQ0hPSUNFU1xuICpcbiAqICovXG5leHBvcnRzLk1VTFRJUExFX0NIT0lDRVMgPSAzMDA7XG4vKipcbiAqIEBkZXByZWNhdGVkIFBsZWFzZSB1c2UgU3RhdHVzQ29kZXMuTkVUV09SS19BVVRIRU5USUNBVElPTl9SRVFVSVJFRFxuICpcbiAqICovXG5leHBvcnRzLk5FVFdPUktfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQgPSA1MTE7XG4vKipcbiAqIEBkZXByZWNhdGVkIFBsZWFzZSB1c2UgU3RhdHVzQ29kZXMuTk9fQ09OVEVOVFxuICpcbiAqICovXG5leHBvcnRzLk5PX0NPTlRFTlQgPSAyMDQ7XG4vKipcbiAqIEBkZXByZWNhdGVkIFBsZWFzZSB1c2UgU3RhdHVzQ29kZXMuTk9OX0FVVEhPUklUQVRJVkVfSU5GT1JNQVRJT05cbiAqXG4gKiAqL1xuZXhwb3J0cy5OT05fQVVUSE9SSVRBVElWRV9JTkZPUk1BVElPTiA9IDIwMztcbi8qKlxuICogQGRlcHJlY2F0ZWQgUGxlYXNlIHVzZSBTdGF0dXNDb2Rlcy5OT1RfQUNDRVBUQUJMRVxuICpcbiAqICovXG5leHBvcnRzLk5PVF9BQ0NFUFRBQkxFID0gNDA2O1xuLyoqXG4gKiBAZGVwcmVjYXRlZCBQbGVhc2UgdXNlIFN0YXR1c0NvZGVzLk5PVF9GT1VORFxuICpcbiAqICovXG5leHBvcnRzLk5PVF9GT1VORCA9IDQwNDtcbi8qKlxuICogQGRlcHJlY2F0ZWQgUGxlYXNlIHVzZSBTdGF0dXNDb2Rlcy5OT1RfSU1QTEVNRU5URURcbiAqXG4gKiAqL1xuZXhwb3J0cy5OT1RfSU1QTEVNRU5URUQgPSA1MDE7XG4vKipcbiAqIEBkZXByZWNhdGVkIFBsZWFzZSB1c2UgU3RhdHVzQ29kZXMuTk9UX01PRElGSUVEXG4gKlxuICogKi9cbmV4cG9ydHMuTk9UX01PRElGSUVEID0gMzA0O1xuLyoqXG4gKiBAZGVwcmVjYXRlZCBQbGVhc2UgdXNlIFN0YXR1c0NvZGVzLk9LXG4gKlxuICogKi9cbmV4cG9ydHMuT0sgPSAyMDA7XG4vKipcbiAqIEBkZXByZWNhdGVkIFBsZWFzZSB1c2UgU3RhdHVzQ29kZXMuUEFSVElBTF9DT05URU5UXG4gKlxuICogKi9cbmV4cG9ydHMuUEFSVElBTF9DT05URU5UID0gMjA2O1xuLyoqXG4gKiBAZGVwcmVjYXRlZCBQbGVhc2UgdXNlIFN0YXR1c0NvZGVzLlBBWU1FTlRfUkVRVUlSRURcbiAqXG4gKiAqL1xuZXhwb3J0cy5QQVlNRU5UX1JFUVVJUkVEID0gNDAyO1xuLyoqXG4gKiBAZGVwcmVjYXRlZCBQbGVhc2UgdXNlIFN0YXR1c0NvZGVzLlBFUk1BTkVOVF9SRURJUkVDVFxuICpcbiAqICovXG5leHBvcnRzLlBFUk1BTkVOVF9SRURJUkVDVCA9IDMwODtcbi8qKlxuICogQGRlcHJlY2F0ZWQgUGxlYXNlIHVzZSBTdGF0dXNDb2Rlcy5QUkVDT05ESVRJT05fRkFJTEVEXG4gKlxuICogKi9cbmV4cG9ydHMuUFJFQ09ORElUSU9OX0ZBSUxFRCA9IDQxMjtcbi8qKlxuICogQGRlcHJlY2F0ZWQgUGxlYXNlIHVzZSBTdGF0dXNDb2Rlcy5QUkVDT05ESVRJT05fUkVRVUlSRURcbiAqXG4gKiAqL1xuZXhwb3J0cy5QUkVDT05ESVRJT05fUkVRVUlSRUQgPSA0Mjg7XG4vKipcbiAqIEBkZXByZWNhdGVkIFBsZWFzZSB1c2UgU3RhdHVzQ29kZXMuUFJPQ0VTU0lOR1xuICpcbiAqICovXG5leHBvcnRzLlBST0NFU1NJTkcgPSAxMDI7XG4vKipcbiAqIEBkZXByZWNhdGVkIFBsZWFzZSB1c2UgU3RhdHVzQ29kZXMuUFJPWFlfQVVUSEVOVElDQVRJT05fUkVRVUlSRURcbiAqXG4gKiAqL1xuZXhwb3J0cy5QUk9YWV9BVVRIRU5USUNBVElPTl9SRVFVSVJFRCA9IDQwNztcbi8qKlxuICogQGRlcHJlY2F0ZWQgUGxlYXNlIHVzZSBTdGF0dXNDb2Rlcy5SRVFVRVNUX0hFQURFUl9GSUVMRFNfVE9PX0xBUkdFXG4gKlxuICogKi9cbmV4cG9ydHMuUkVRVUVTVF9IRUFERVJfRklFTERTX1RPT19MQVJHRSA9IDQzMTtcbi8qKlxuICogQGRlcHJlY2F0ZWQgUGxlYXNlIHVzZSBTdGF0dXNDb2Rlcy5SRVFVRVNUX1RJTUVPVVRcbiAqXG4gKiAqL1xuZXhwb3J0cy5SRVFVRVNUX1RJTUVPVVQgPSA0MDg7XG4vKipcbiAqIEBkZXByZWNhdGVkIFBsZWFzZSB1c2UgU3RhdHVzQ29kZXMuUkVRVUVTVF9UT09fTE9OR1xuICpcbiAqICovXG5leHBvcnRzLlJFUVVFU1RfVE9PX0xPTkcgPSA0MTM7XG4vKipcbiAqIEBkZXByZWNhdGVkIFBsZWFzZSB1c2UgU3RhdHVzQ29kZXMuUkVRVUVTVF9VUklfVE9PX0xPTkdcbiAqXG4gKiAqL1xuZXhwb3J0cy5SRVFVRVNUX1VSSV9UT09fTE9ORyA9IDQxNDtcbi8qKlxuICogQGRlcHJlY2F0ZWQgUGxlYXNlIHVzZSBTdGF0dXNDb2Rlcy5SRVFVRVNURURfUkFOR0VfTk9UX1NBVElTRklBQkxFXG4gKlxuICogKi9cbmV4cG9ydHMuUkVRVUVTVEVEX1JBTkdFX05PVF9TQVRJU0ZJQUJMRSA9IDQxNjtcbi8qKlxuICogQGRlcHJlY2F0ZWQgUGxlYXNlIHVzZSBTdGF0dXNDb2Rlcy5SRVNFVF9DT05URU5UXG4gKlxuICogKi9cbmV4cG9ydHMuUkVTRVRfQ09OVEVOVCA9IDIwNTtcbi8qKlxuICogQGRlcHJlY2F0ZWQgUGxlYXNlIHVzZSBTdGF0dXNDb2Rlcy5TRUVfT1RIRVJcbiAqXG4gKiAqL1xuZXhwb3J0cy5TRUVfT1RIRVIgPSAzMDM7XG4vKipcbiAqIEBkZXByZWNhdGVkIFBsZWFzZSB1c2UgU3RhdHVzQ29kZXMuU0VSVklDRV9VTkFWQUlMQUJMRVxuICpcbiAqICovXG5leHBvcnRzLlNFUlZJQ0VfVU5BVkFJTEFCTEUgPSA1MDM7XG4vKipcbiAqIEBkZXByZWNhdGVkIFBsZWFzZSB1c2UgU3RhdHVzQ29kZXMuU1dJVENISU5HX1BST1RPQ09MU1xuICpcbiAqICovXG5leHBvcnRzLlNXSVRDSElOR19QUk9UT0NPTFMgPSAxMDE7XG4vKipcbiAqIEBkZXByZWNhdGVkIFBsZWFzZSB1c2UgU3RhdHVzQ29kZXMuVEVNUE9SQVJZX1JFRElSRUNUXG4gKlxuICogKi9cbmV4cG9ydHMuVEVNUE9SQVJZX1JFRElSRUNUID0gMzA3O1xuLyoqXG4gKiBAZGVwcmVjYXRlZCBQbGVhc2UgdXNlIFN0YXR1c0NvZGVzLlRPT19NQU5ZX1JFUVVFU1RTXG4gKlxuICogKi9cbmV4cG9ydHMuVE9PX01BTllfUkVRVUVTVFMgPSA0Mjk7XG4vKipcbiAqIEBkZXByZWNhdGVkIFBsZWFzZSB1c2UgU3RhdHVzQ29kZXMuVU5BVVRIT1JJWkVEXG4gKlxuICogKi9cbmV4cG9ydHMuVU5BVVRIT1JJWkVEID0gNDAxO1xuLyoqXG4gKiBAZGVwcmVjYXRlZCBQbGVhc2UgdXNlIFN0YXR1c0NvZGVzLlVOUFJPQ0VTU0FCTEVfRU5USVRZXG4gKlxuICogKi9cbmV4cG9ydHMuVU5QUk9DRVNTQUJMRV9FTlRJVFkgPSA0MjI7XG4vKipcbiAqIEBkZXByZWNhdGVkIFBsZWFzZSB1c2UgU3RhdHVzQ29kZXMuVU5TVVBQT1JURURfTUVESUFfVFlQRVxuICpcbiAqICovXG5leHBvcnRzLlVOU1VQUE9SVEVEX01FRElBX1RZUEUgPSA0MTU7XG4vKipcbiAqIEBkZXByZWNhdGVkIFBsZWFzZSB1c2UgU3RhdHVzQ29kZXMuVVNFX1BST1hZXG4gKlxuICogKi9cbmV4cG9ydHMuVVNFX1BST1hZID0gMzA1O1xuZXhwb3J0cy5kZWZhdWx0ID0ge1xuICAgIEFDQ0VQVEVEOiBleHBvcnRzLkFDQ0VQVEVELFxuICAgIEJBRF9HQVRFV0FZOiBleHBvcnRzLkJBRF9HQVRFV0FZLFxuICAgIEJBRF9SRVFVRVNUOiBleHBvcnRzLkJBRF9SRVFVRVNULFxuICAgIENPTkZMSUNUOiBleHBvcnRzLkNPTkZMSUNULFxuICAgIENPTlRJTlVFOiBleHBvcnRzLkNPTlRJTlVFLFxuICAgIENSRUFURUQ6IGV4cG9ydHMuQ1JFQVRFRCxcbiAgICBFWFBFQ1RBVElPTl9GQUlMRUQ6IGV4cG9ydHMuRVhQRUNUQVRJT05fRkFJTEVELFxuICAgIEZPUkJJRERFTjogZXhwb3J0cy5GT1JCSURERU4sXG4gICAgR0FURVdBWV9USU1FT1VUOiBleHBvcnRzLkdBVEVXQVlfVElNRU9VVCxcbiAgICBHT05FOiBleHBvcnRzLkdPTkUsXG4gICAgSFRUUF9WRVJTSU9OX05PVF9TVVBQT1JURUQ6IGV4cG9ydHMuSFRUUF9WRVJTSU9OX05PVF9TVVBQT1JURUQsXG4gICAgSU1fQV9URUFQT1Q6IGV4cG9ydHMuSU1fQV9URUFQT1QsXG4gICAgSU5TVUZGSUNJRU5UX1NQQUNFX09OX1JFU09VUkNFOiBleHBvcnRzLklOU1VGRklDSUVOVF9TUEFDRV9PTl9SRVNPVVJDRSxcbiAgICBJTlNVRkZJQ0lFTlRfU1RPUkFHRTogZXhwb3J0cy5JTlNVRkZJQ0lFTlRfU1RPUkFHRSxcbiAgICBJTlRFUk5BTF9TRVJWRVJfRVJST1I6IGV4cG9ydHMuSU5URVJOQUxfU0VSVkVSX0VSUk9SLFxuICAgIExFTkdUSF9SRVFVSVJFRDogZXhwb3J0cy5MRU5HVEhfUkVRVUlSRUQsXG4gICAgTE9DS0VEOiBleHBvcnRzLkxPQ0tFRCxcbiAgICBNRVRIT0RfRkFJTFVSRTogZXhwb3J0cy5NRVRIT0RfRkFJTFVSRSxcbiAgICBNRVRIT0RfTk9UX0FMTE9XRUQ6IGV4cG9ydHMuTUVUSE9EX05PVF9BTExPV0VELFxuICAgIE1PVkVEX1BFUk1BTkVOVExZOiBleHBvcnRzLk1PVkVEX1BFUk1BTkVOVExZLFxuICAgIE1PVkVEX1RFTVBPUkFSSUxZOiBleHBvcnRzLk1PVkVEX1RFTVBPUkFSSUxZLFxuICAgIE1VTFRJX1NUQVRVUzogZXhwb3J0cy5NVUxUSV9TVEFUVVMsXG4gICAgTVVMVElQTEVfQ0hPSUNFUzogZXhwb3J0cy5NVUxUSVBMRV9DSE9JQ0VTLFxuICAgIE5FVFdPUktfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQ6IGV4cG9ydHMuTkVUV09SS19BVVRIRU5USUNBVElPTl9SRVFVSVJFRCxcbiAgICBOT19DT05URU5UOiBleHBvcnRzLk5PX0NPTlRFTlQsXG4gICAgTk9OX0FVVEhPUklUQVRJVkVfSU5GT1JNQVRJT046IGV4cG9ydHMuTk9OX0FVVEhPUklUQVRJVkVfSU5GT1JNQVRJT04sXG4gICAgTk9UX0FDQ0VQVEFCTEU6IGV4cG9ydHMuTk9UX0FDQ0VQVEFCTEUsXG4gICAgTk9UX0ZPVU5EOiBleHBvcnRzLk5PVF9GT1VORCxcbiAgICBOT1RfSU1QTEVNRU5URUQ6IGV4cG9ydHMuTk9UX0lNUExFTUVOVEVELFxuICAgIE5PVF9NT0RJRklFRDogZXhwb3J0cy5OT1RfTU9ESUZJRUQsXG4gICAgT0s6IGV4cG9ydHMuT0ssXG4gICAgUEFSVElBTF9DT05URU5UOiBleHBvcnRzLlBBUlRJQUxfQ09OVEVOVCxcbiAgICBQQVlNRU5UX1JFUVVJUkVEOiBleHBvcnRzLlBBWU1FTlRfUkVRVUlSRUQsXG4gICAgUEVSTUFORU5UX1JFRElSRUNUOiBleHBvcnRzLlBFUk1BTkVOVF9SRURJUkVDVCxcbiAgICBQUkVDT05ESVRJT05fRkFJTEVEOiBleHBvcnRzLlBSRUNPTkRJVElPTl9GQUlMRUQsXG4gICAgUFJFQ09ORElUSU9OX1JFUVVJUkVEOiBleHBvcnRzLlBSRUNPTkRJVElPTl9SRVFVSVJFRCxcbiAgICBQUk9DRVNTSU5HOiBleHBvcnRzLlBST0NFU1NJTkcsXG4gICAgUFJPWFlfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQ6IGV4cG9ydHMuUFJPWFlfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQsXG4gICAgUkVRVUVTVF9IRUFERVJfRklFTERTX1RPT19MQVJHRTogZXhwb3J0cy5SRVFVRVNUX0hFQURFUl9GSUVMRFNfVE9PX0xBUkdFLFxuICAgIFJFUVVFU1RfVElNRU9VVDogZXhwb3J0cy5SRVFVRVNUX1RJTUVPVVQsXG4gICAgUkVRVUVTVF9UT09fTE9ORzogZXhwb3J0cy5SRVFVRVNUX1RPT19MT05HLFxuICAgIFJFUVVFU1RfVVJJX1RPT19MT05HOiBleHBvcnRzLlJFUVVFU1RfVVJJX1RPT19MT05HLFxuICAgIFJFUVVFU1RFRF9SQU5HRV9OT1RfU0FUSVNGSUFCTEU6IGV4cG9ydHMuUkVRVUVTVEVEX1JBTkdFX05PVF9TQVRJU0ZJQUJMRSxcbiAgICBSRVNFVF9DT05URU5UOiBleHBvcnRzLlJFU0VUX0NPTlRFTlQsXG4gICAgU0VFX09USEVSOiBleHBvcnRzLlNFRV9PVEhFUixcbiAgICBTRVJWSUNFX1VOQVZBSUxBQkxFOiBleHBvcnRzLlNFUlZJQ0VfVU5BVkFJTEFCTEUsXG4gICAgU1dJVENISU5HX1BST1RPQ09MUzogZXhwb3J0cy5TV0lUQ0hJTkdfUFJPVE9DT0xTLFxuICAgIFRFTVBPUkFSWV9SRURJUkVDVDogZXhwb3J0cy5URU1QT1JBUllfUkVESVJFQ1QsXG4gICAgVE9PX01BTllfUkVRVUVTVFM6IGV4cG9ydHMuVE9PX01BTllfUkVRVUVTVFMsXG4gICAgVU5BVVRIT1JJWkVEOiBleHBvcnRzLlVOQVVUSE9SSVpFRCxcbiAgICBVTlBST0NFU1NBQkxFX0VOVElUWTogZXhwb3J0cy5VTlBST0NFU1NBQkxFX0VOVElUWSxcbiAgICBVTlNVUFBPUlRFRF9NRURJQV9UWVBFOiBleHBvcnRzLlVOU1VQUE9SVEVEX01FRElBX1RZUEUsXG4gICAgVVNFX1BST1hZOiBleHBvcnRzLlVTRV9QUk9YWSxcbn07XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnJlYXNvblBocmFzZVRvU3RhdHVzQ29kZSA9IGV4cG9ydHMuc3RhdHVzQ29kZVRvUmVhc29uUGhyYXNlID0gdm9pZCAwO1xuLy8gR2VuZXJhdGVkIGZpbGUuIERvIG5vdCBlZGl0XG5leHBvcnRzLnN0YXR1c0NvZGVUb1JlYXNvblBocmFzZSA9IHtcbiAgICBcIjIwMlwiOiBcIkFjY2VwdGVkXCIsXG4gICAgXCI1MDJcIjogXCJCYWQgR2F0ZXdheVwiLFxuICAgIFwiNDAwXCI6IFwiQmFkIFJlcXVlc3RcIixcbiAgICBcIjQwOVwiOiBcIkNvbmZsaWN0XCIsXG4gICAgXCIxMDBcIjogXCJDb250aW51ZVwiLFxuICAgIFwiMjAxXCI6IFwiQ3JlYXRlZFwiLFxuICAgIFwiNDE3XCI6IFwiRXhwZWN0YXRpb24gRmFpbGVkXCIsXG4gICAgXCI0MjRcIjogXCJGYWlsZWQgRGVwZW5kZW5jeVwiLFxuICAgIFwiNDAzXCI6IFwiRm9yYmlkZGVuXCIsXG4gICAgXCI1MDRcIjogXCJHYXRld2F5IFRpbWVvdXRcIixcbiAgICBcIjQxMFwiOiBcIkdvbmVcIixcbiAgICBcIjUwNVwiOiBcIkhUVFAgVmVyc2lvbiBOb3QgU3VwcG9ydGVkXCIsXG4gICAgXCI0MThcIjogXCJJJ20gYSB0ZWFwb3RcIixcbiAgICBcIjQxOVwiOiBcIkluc3VmZmljaWVudCBTcGFjZSBvbiBSZXNvdXJjZVwiLFxuICAgIFwiNTA3XCI6IFwiSW5zdWZmaWNpZW50IFN0b3JhZ2VcIixcbiAgICBcIjUwMFwiOiBcIkludGVybmFsIFNlcnZlciBFcnJvclwiLFxuICAgIFwiNDExXCI6IFwiTGVuZ3RoIFJlcXVpcmVkXCIsXG4gICAgXCI0MjNcIjogXCJMb2NrZWRcIixcbiAgICBcIjQyMFwiOiBcIk1ldGhvZCBGYWlsdXJlXCIsXG4gICAgXCI0MDVcIjogXCJNZXRob2QgTm90IEFsbG93ZWRcIixcbiAgICBcIjMwMVwiOiBcIk1vdmVkIFBlcm1hbmVudGx5XCIsXG4gICAgXCIzMDJcIjogXCJNb3ZlZCBUZW1wb3JhcmlseVwiLFxuICAgIFwiMjA3XCI6IFwiTXVsdGktU3RhdHVzXCIsXG4gICAgXCIzMDBcIjogXCJNdWx0aXBsZSBDaG9pY2VzXCIsXG4gICAgXCI1MTFcIjogXCJOZXR3b3JrIEF1dGhlbnRpY2F0aW9uIFJlcXVpcmVkXCIsXG4gICAgXCIyMDRcIjogXCJObyBDb250ZW50XCIsXG4gICAgXCIyMDNcIjogXCJOb24gQXV0aG9yaXRhdGl2ZSBJbmZvcm1hdGlvblwiLFxuICAgIFwiNDA2XCI6IFwiTm90IEFjY2VwdGFibGVcIixcbiAgICBcIjQwNFwiOiBcIk5vdCBGb3VuZFwiLFxuICAgIFwiNTAxXCI6IFwiTm90IEltcGxlbWVudGVkXCIsXG4gICAgXCIzMDRcIjogXCJOb3QgTW9kaWZpZWRcIixcbiAgICBcIjIwMFwiOiBcIk9LXCIsXG4gICAgXCIyMDZcIjogXCJQYXJ0aWFsIENvbnRlbnRcIixcbiAgICBcIjQwMlwiOiBcIlBheW1lbnQgUmVxdWlyZWRcIixcbiAgICBcIjMwOFwiOiBcIlBlcm1hbmVudCBSZWRpcmVjdFwiLFxuICAgIFwiNDEyXCI6IFwiUHJlY29uZGl0aW9uIEZhaWxlZFwiLFxuICAgIFwiNDI4XCI6IFwiUHJlY29uZGl0aW9uIFJlcXVpcmVkXCIsXG4gICAgXCIxMDJcIjogXCJQcm9jZXNzaW5nXCIsXG4gICAgXCIxMDNcIjogXCJFYXJseSBIaW50c1wiLFxuICAgIFwiNDI2XCI6IFwiVXBncmFkZSBSZXF1aXJlZFwiLFxuICAgIFwiNDA3XCI6IFwiUHJveHkgQXV0aGVudGljYXRpb24gUmVxdWlyZWRcIixcbiAgICBcIjQzMVwiOiBcIlJlcXVlc3QgSGVhZGVyIEZpZWxkcyBUb28gTGFyZ2VcIixcbiAgICBcIjQwOFwiOiBcIlJlcXVlc3QgVGltZW91dFwiLFxuICAgIFwiNDEzXCI6IFwiUmVxdWVzdCBFbnRpdHkgVG9vIExhcmdlXCIsXG4gICAgXCI0MTRcIjogXCJSZXF1ZXN0LVVSSSBUb28gTG9uZ1wiLFxuICAgIFwiNDE2XCI6IFwiUmVxdWVzdGVkIFJhbmdlIE5vdCBTYXRpc2ZpYWJsZVwiLFxuICAgIFwiMjA1XCI6IFwiUmVzZXQgQ29udGVudFwiLFxuICAgIFwiMzAzXCI6IFwiU2VlIE90aGVyXCIsXG4gICAgXCI1MDNcIjogXCJTZXJ2aWNlIFVuYXZhaWxhYmxlXCIsXG4gICAgXCIxMDFcIjogXCJTd2l0Y2hpbmcgUHJvdG9jb2xzXCIsXG4gICAgXCIzMDdcIjogXCJUZW1wb3JhcnkgUmVkaXJlY3RcIixcbiAgICBcIjQyOVwiOiBcIlRvbyBNYW55IFJlcXVlc3RzXCIsXG4gICAgXCI0MDFcIjogXCJVbmF1dGhvcml6ZWRcIixcbiAgICBcIjQ1MVwiOiBcIlVuYXZhaWxhYmxlIEZvciBMZWdhbCBSZWFzb25zXCIsXG4gICAgXCI0MjJcIjogXCJVbnByb2Nlc3NhYmxlIEVudGl0eVwiLFxuICAgIFwiNDE1XCI6IFwiVW5zdXBwb3J0ZWQgTWVkaWEgVHlwZVwiLFxuICAgIFwiMzA1XCI6IFwiVXNlIFByb3h5XCIsXG4gICAgXCI0MjFcIjogXCJNaXNkaXJlY3RlZCBSZXF1ZXN0XCJcbn07XG5leHBvcnRzLnJlYXNvblBocmFzZVRvU3RhdHVzQ29kZSA9IHtcbiAgICBcIkFjY2VwdGVkXCI6IDIwMixcbiAgICBcIkJhZCBHYXRld2F5XCI6IDUwMixcbiAgICBcIkJhZCBSZXF1ZXN0XCI6IDQwMCxcbiAgICBcIkNvbmZsaWN0XCI6IDQwOSxcbiAgICBcIkNvbnRpbnVlXCI6IDEwMCxcbiAgICBcIkNyZWF0ZWRcIjogMjAxLFxuICAgIFwiRXhwZWN0YXRpb24gRmFpbGVkXCI6IDQxNyxcbiAgICBcIkZhaWxlZCBEZXBlbmRlbmN5XCI6IDQyNCxcbiAgICBcIkZvcmJpZGRlblwiOiA0MDMsXG4gICAgXCJHYXRld2F5IFRpbWVvdXRcIjogNTA0LFxuICAgIFwiR29uZVwiOiA0MTAsXG4gICAgXCJIVFRQIFZlcnNpb24gTm90IFN1cHBvcnRlZFwiOiA1MDUsXG4gICAgXCJJJ20gYSB0ZWFwb3RcIjogNDE4LFxuICAgIFwiSW5zdWZmaWNpZW50IFNwYWNlIG9uIFJlc291cmNlXCI6IDQxOSxcbiAgICBcIkluc3VmZmljaWVudCBTdG9yYWdlXCI6IDUwNyxcbiAgICBcIkludGVybmFsIFNlcnZlciBFcnJvclwiOiA1MDAsXG4gICAgXCJMZW5ndGggUmVxdWlyZWRcIjogNDExLFxuICAgIFwiTG9ja2VkXCI6IDQyMyxcbiAgICBcIk1ldGhvZCBGYWlsdXJlXCI6IDQyMCxcbiAgICBcIk1ldGhvZCBOb3QgQWxsb3dlZFwiOiA0MDUsXG4gICAgXCJNb3ZlZCBQZXJtYW5lbnRseVwiOiAzMDEsXG4gICAgXCJNb3ZlZCBUZW1wb3JhcmlseVwiOiAzMDIsXG4gICAgXCJNdWx0aS1TdGF0dXNcIjogMjA3LFxuICAgIFwiTXVsdGlwbGUgQ2hvaWNlc1wiOiAzMDAsXG4gICAgXCJOZXR3b3JrIEF1dGhlbnRpY2F0aW9uIFJlcXVpcmVkXCI6IDUxMSxcbiAgICBcIk5vIENvbnRlbnRcIjogMjA0LFxuICAgIFwiTm9uIEF1dGhvcml0YXRpdmUgSW5mb3JtYXRpb25cIjogMjAzLFxuICAgIFwiTm90IEFjY2VwdGFibGVcIjogNDA2LFxuICAgIFwiTm90IEZvdW5kXCI6IDQwNCxcbiAgICBcIk5vdCBJbXBsZW1lbnRlZFwiOiA1MDEsXG4gICAgXCJOb3QgTW9kaWZpZWRcIjogMzA0LFxuICAgIFwiT0tcIjogMjAwLFxuICAgIFwiUGFydGlhbCBDb250ZW50XCI6IDIwNixcbiAgICBcIlBheW1lbnQgUmVxdWlyZWRcIjogNDAyLFxuICAgIFwiUGVybWFuZW50IFJlZGlyZWN0XCI6IDMwOCxcbiAgICBcIlByZWNvbmRpdGlvbiBGYWlsZWRcIjogNDEyLFxuICAgIFwiUHJlY29uZGl0aW9uIFJlcXVpcmVkXCI6IDQyOCxcbiAgICBcIlByb2Nlc3NpbmdcIjogMTAyLFxuICAgIFwiRWFybHkgSGludHNcIjogMTAzLFxuICAgIFwiVXBncmFkZSBSZXF1aXJlZFwiOiA0MjYsXG4gICAgXCJQcm94eSBBdXRoZW50aWNhdGlvbiBSZXF1aXJlZFwiOiA0MDcsXG4gICAgXCJSZXF1ZXN0IEhlYWRlciBGaWVsZHMgVG9vIExhcmdlXCI6IDQzMSxcbiAgICBcIlJlcXVlc3QgVGltZW91dFwiOiA0MDgsXG4gICAgXCJSZXF1ZXN0IEVudGl0eSBUb28gTGFyZ2VcIjogNDEzLFxuICAgIFwiUmVxdWVzdC1VUkkgVG9vIExvbmdcIjogNDE0LFxuICAgIFwiUmVxdWVzdGVkIFJhbmdlIE5vdCBTYXRpc2ZpYWJsZVwiOiA0MTYsXG4gICAgXCJSZXNldCBDb250ZW50XCI6IDIwNSxcbiAgICBcIlNlZSBPdGhlclwiOiAzMDMsXG4gICAgXCJTZXJ2aWNlIFVuYXZhaWxhYmxlXCI6IDUwMyxcbiAgICBcIlN3aXRjaGluZyBQcm90b2NvbHNcIjogMTAxLFxuICAgIFwiVGVtcG9yYXJ5IFJlZGlyZWN0XCI6IDMwNyxcbiAgICBcIlRvbyBNYW55IFJlcXVlc3RzXCI6IDQyOSxcbiAgICBcIlVuYXV0aG9yaXplZFwiOiA0MDEsXG4gICAgXCJVbmF2YWlsYWJsZSBGb3IgTGVnYWwgUmVhc29uc1wiOiA0NTEsXG4gICAgXCJVbnByb2Nlc3NhYmxlIEVudGl0eVwiOiA0MjIsXG4gICAgXCJVbnN1cHBvcnRlZCBNZWRpYSBUeXBlXCI6IDQxNSxcbiAgICBcIlVzZSBQcm94eVwiOiAzMDUsXG4gICAgXCJNaXNkaXJlY3RlZCBSZXF1ZXN0XCI6IDQyMVxufTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZ2V0U3RhdHVzVGV4dCA9IGV4cG9ydHMuZ2V0U3RhdHVzQ29kZSA9IGV4cG9ydHMuZ2V0UmVhc29uUGhyYXNlID0gdm9pZCAwO1xudmFyIHV0aWxzXzEgPSByZXF1aXJlKFwiLi91dGlsc1wiKTtcbi8qKlxuICogUmV0dXJucyB0aGUgcmVhc29uIHBocmFzZSBmb3IgdGhlIGdpdmVuIHN0YXR1cyBjb2RlLlxuICogSWYgdGhlIGdpdmVuIHN0YXR1cyBjb2RlIGRvZXMgbm90IGV4aXN0LCBhbiBlcnJvciBpcyB0aHJvd24uXG4gKlxuICogQHBhcmFtIHtudW1iZXJ8c3RyaW5nfSBzdGF0dXNDb2RlIFRoZSBIVFRQIHN0YXR1cyBjb2RlXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgYXNzb2NpYXRlZCByZWFzb24gcGhyYXNlIChlLmcuIFwiQmFkIFJlcXVlc3RcIiwgXCJPS1wiKVxuICogKi9cbmZ1bmN0aW9uIGdldFJlYXNvblBocmFzZShzdGF0dXNDb2RlKSB7XG4gICAgdmFyIHJlc3VsdCA9IHV0aWxzXzEuc3RhdHVzQ29kZVRvUmVhc29uUGhyYXNlW3N0YXR1c0NvZGUudG9TdHJpbmcoKV07XG4gICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU3RhdHVzIGNvZGUgZG9lcyBub3QgZXhpc3Q6IFwiICsgc3RhdHVzQ29kZSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5leHBvcnRzLmdldFJlYXNvblBocmFzZSA9IGdldFJlYXNvblBocmFzZTtcbi8qKlxuICogUmV0dXJucyB0aGUgc3RhdHVzIGNvZGUgZm9yIHRoZSBnaXZlbiByZWFzb24gcGhyYXNlLlxuICogSWYgdGhlIGdpdmVuIHJlYXNvbiBwaHJhc2UgZG9lcyBub3QgZXhpc3QsIHVuZGVmaW5lZCBpcyByZXR1cm5lZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVhc29uUGhyYXNlIFRoZSBIVFRQIHJlYXNvbiBwaHJhc2UgKGUuZy4gXCJCYWQgUmVxdWVzdFwiLCBcIk9LXCIpXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgYXNzb2NpYXRlZCBzdGF0dXMgY29kZVxuICogKi9cbmZ1bmN0aW9uIGdldFN0YXR1c0NvZGUocmVhc29uUGhyYXNlKSB7XG4gICAgdmFyIHJlc3VsdCA9IHV0aWxzXzEucmVhc29uUGhyYXNlVG9TdGF0dXNDb2RlW3JlYXNvblBocmFzZV07XG4gICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUmVhc29uIHBocmFzZSBkb2VzIG5vdCBleGlzdDogXCIgKyByZWFzb25QaHJhc2UpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0cy5nZXRTdGF0dXNDb2RlID0gZ2V0U3RhdHVzQ29kZTtcbi8qKlxuICogQGRlcHJlY2F0ZWRcbiAqXG4gKiBSZXR1cm5zIHRoZSByZWFzb24gcGhyYXNlIGZvciB0aGUgZ2l2ZW4gc3RhdHVzIGNvZGUuXG4gKiBJZiB0aGUgZ2l2ZW4gc3RhdHVzIGNvZGUgZG9lcyBub3QgZXhpc3QsIHVuZGVmaW5lZCBpcyByZXR1cm5lZC5cbiAqXG4gKiBEZXByZWNhdGVkIGluIGZhdm9yIG9mIGdldFJlYXNvblBocmFzZVxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfHN0cmluZ30gc3RhdHVzQ29kZSBUaGUgSFRUUCBzdGF0dXMgY29kZVxuICogQHJldHVybnMge3N0cmluZ3x1bmRlZmluZWR9IFRoZSBhc3NvY2lhdGVkIHJlYXNvbiBwaHJhc2UgKGUuZy4gXCJCYWQgUmVxdWVzdFwiLCBcIk9LXCIpXG4gKiAqL1xuZXhwb3J0cy5nZXRTdGF0dXNUZXh0ID0gZ2V0UmVhc29uUGhyYXNlO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5TdGF0dXNDb2RlcyA9IHZvaWQgMDtcbi8vIEdlbmVyYXRlZCBmaWxlLiBEbyBub3QgZWRpdFxudmFyIFN0YXR1c0NvZGVzO1xuKGZ1bmN0aW9uIChTdGF0dXNDb2Rlcykge1xuICAgIC8qKlxuICAgICAqIE9mZmljaWFsIERvY3VtZW50YXRpb24gQCBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMSNzZWN0aW9uLTYuMi4xXG4gICAgICpcbiAgICAgKiBUaGlzIGludGVyaW0gcmVzcG9uc2UgaW5kaWNhdGVzIHRoYXQgZXZlcnl0aGluZyBzbyBmYXIgaXMgT0sgYW5kIHRoYXQgdGhlIGNsaWVudCBzaG91bGQgY29udGludWUgd2l0aCB0aGUgcmVxdWVzdCBvciBpZ25vcmUgaXQgaWYgaXQgaXMgYWxyZWFkeSBmaW5pc2hlZC5cbiAgICAgKi9cbiAgICBTdGF0dXNDb2Rlc1tTdGF0dXNDb2Rlc1tcIkNPTlRJTlVFXCJdID0gMTAwXSA9IFwiQ09OVElOVUVcIjtcbiAgICAvKipcbiAgICAgKiBPZmZpY2lhbCBEb2N1bWVudGF0aW9uIEAgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzEjc2VjdGlvbi02LjIuMlxuICAgICAqXG4gICAgICogVGhpcyBjb2RlIGlzIHNlbnQgaW4gcmVzcG9uc2UgdG8gYW4gVXBncmFkZSByZXF1ZXN0IGhlYWRlciBieSB0aGUgY2xpZW50LCBhbmQgaW5kaWNhdGVzIHRoZSBwcm90b2NvbCB0aGUgc2VydmVyIGlzIHN3aXRjaGluZyB0b28uXG4gICAgICovXG4gICAgU3RhdHVzQ29kZXNbU3RhdHVzQ29kZXNbXCJTV0lUQ0hJTkdfUFJPVE9DT0xTXCJdID0gMTAxXSA9IFwiU1dJVENISU5HX1BST1RPQ09MU1wiO1xuICAgIC8qKlxuICAgICAqIE9mZmljaWFsIERvY3VtZW50YXRpb24gQCBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMjUxOCNzZWN0aW9uLTEwLjFcbiAgICAgKlxuICAgICAqIFRoaXMgY29kZSBpbmRpY2F0ZXMgdGhhdCB0aGUgc2VydmVyIGhhcyByZWNlaXZlZCBhbmQgaXMgcHJvY2Vzc2luZyB0aGUgcmVxdWVzdCwgYnV0IG5vIHJlc3BvbnNlIGlzIGF2YWlsYWJsZSB5ZXQuXG4gICAgICovXG4gICAgU3RhdHVzQ29kZXNbU3RhdHVzQ29kZXNbXCJQUk9DRVNTSU5HXCJdID0gMTAyXSA9IFwiUFJPQ0VTU0lOR1wiO1xuICAgIC8qKlxuICAgICAqIE9mZmljaWFsIERvY3VtZW50YXRpb24gQCBodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjODI5NyNwYWdlLTNcbiAgICAgKlxuICAgICAqIFRoaXMgY29kZSBpbmRpY2F0ZXMgdG8gdGhlIGNsaWVudCB0aGF0IHRoZSBzZXJ2ZXIgaXMgbGlrZWx5IHRvIHNlbmQgYSBmaW5hbCByZXNwb25zZSB3aXRoIHRoZSBoZWFkZXIgZmllbGRzIGluY2x1ZGVkIGluIHRoZSBpbmZvcm1hdGlvbmFsIHJlc3BvbnNlLlxuICAgICAqL1xuICAgIFN0YXR1c0NvZGVzW1N0YXR1c0NvZGVzW1wiRUFSTFlfSElOVFNcIl0gPSAxMDNdID0gXCJFQVJMWV9ISU5UU1wiO1xuICAgIC8qKlxuICAgICAqIE9mZmljaWFsIERvY3VtZW50YXRpb24gQCBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMSNzZWN0aW9uLTYuMy4xXG4gICAgICpcbiAgICAgKiBUaGUgcmVxdWVzdCBoYXMgc3VjY2VlZGVkLiBUaGUgbWVhbmluZyBvZiBhIHN1Y2Nlc3MgdmFyaWVzIGRlcGVuZGluZyBvbiB0aGUgSFRUUCBtZXRob2Q6XG4gICAgICogR0VUOiBUaGUgcmVzb3VyY2UgaGFzIGJlZW4gZmV0Y2hlZCBhbmQgaXMgdHJhbnNtaXR0ZWQgaW4gdGhlIG1lc3NhZ2UgYm9keS5cbiAgICAgKiBIRUFEOiBUaGUgZW50aXR5IGhlYWRlcnMgYXJlIGluIHRoZSBtZXNzYWdlIGJvZHkuXG4gICAgICogUE9TVDogVGhlIHJlc291cmNlIGRlc2NyaWJpbmcgdGhlIHJlc3VsdCBvZiB0aGUgYWN0aW9uIGlzIHRyYW5zbWl0dGVkIGluIHRoZSBtZXNzYWdlIGJvZHkuXG4gICAgICogVFJBQ0U6IFRoZSBtZXNzYWdlIGJvZHkgY29udGFpbnMgdGhlIHJlcXVlc3QgbWVzc2FnZSBhcyByZWNlaXZlZCBieSB0aGUgc2VydmVyXG4gICAgICovXG4gICAgU3RhdHVzQ29kZXNbU3RhdHVzQ29kZXNbXCJPS1wiXSA9IDIwMF0gPSBcIk9LXCI7XG4gICAgLyoqXG4gICAgICogT2ZmaWNpYWwgRG9jdW1lbnRhdGlvbiBAIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMxI3NlY3Rpb24tNi4zLjJcbiAgICAgKlxuICAgICAqIFRoZSByZXF1ZXN0IGhhcyBzdWNjZWVkZWQgYW5kIGEgbmV3IHJlc291cmNlIGhhcyBiZWVuIGNyZWF0ZWQgYXMgYSByZXN1bHQgb2YgaXQuIFRoaXMgaXMgdHlwaWNhbGx5IHRoZSByZXNwb25zZSBzZW50IGFmdGVyIGEgUFVUIHJlcXVlc3QuXG4gICAgICovXG4gICAgU3RhdHVzQ29kZXNbU3RhdHVzQ29kZXNbXCJDUkVBVEVEXCJdID0gMjAxXSA9IFwiQ1JFQVRFRFwiO1xuICAgIC8qKlxuICAgICAqIE9mZmljaWFsIERvY3VtZW50YXRpb24gQCBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMSNzZWN0aW9uLTYuMy4zXG4gICAgICpcbiAgICAgKiBUaGUgcmVxdWVzdCBoYXMgYmVlbiByZWNlaXZlZCBidXQgbm90IHlldCBhY3RlZCB1cG9uLiBJdCBpcyBub24tY29tbWl0dGFsLCBtZWFuaW5nIHRoYXQgdGhlcmUgaXMgbm8gd2F5IGluIEhUVFAgdG8gbGF0ZXIgc2VuZCBhbiBhc3luY2hyb25vdXMgcmVzcG9uc2UgaW5kaWNhdGluZyB0aGUgb3V0Y29tZSBvZiBwcm9jZXNzaW5nIHRoZSByZXF1ZXN0LiBJdCBpcyBpbnRlbmRlZCBmb3IgY2FzZXMgd2hlcmUgYW5vdGhlciBwcm9jZXNzIG9yIHNlcnZlciBoYW5kbGVzIHRoZSByZXF1ZXN0LCBvciBmb3IgYmF0Y2ggcHJvY2Vzc2luZy5cbiAgICAgKi9cbiAgICBTdGF0dXNDb2Rlc1tTdGF0dXNDb2Rlc1tcIkFDQ0VQVEVEXCJdID0gMjAyXSA9IFwiQUNDRVBURURcIjtcbiAgICAvKipcbiAgICAgKiBPZmZpY2lhbCBEb2N1bWVudGF0aW9uIEAgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzEjc2VjdGlvbi02LjMuNFxuICAgICAqXG4gICAgICogVGhpcyByZXNwb25zZSBjb2RlIG1lYW5zIHJldHVybmVkIG1ldGEtaW5mb3JtYXRpb24gc2V0IGlzIG5vdCBleGFjdCBzZXQgYXMgYXZhaWxhYmxlIGZyb20gdGhlIG9yaWdpbiBzZXJ2ZXIsIGJ1dCBjb2xsZWN0ZWQgZnJvbSBhIGxvY2FsIG9yIGEgdGhpcmQgcGFydHkgY29weS4gRXhjZXB0IHRoaXMgY29uZGl0aW9uLCAyMDAgT0sgcmVzcG9uc2Ugc2hvdWxkIGJlIHByZWZlcnJlZCBpbnN0ZWFkIG9mIHRoaXMgcmVzcG9uc2UuXG4gICAgICovXG4gICAgU3RhdHVzQ29kZXNbU3RhdHVzQ29kZXNbXCJOT05fQVVUSE9SSVRBVElWRV9JTkZPUk1BVElPTlwiXSA9IDIwM10gPSBcIk5PTl9BVVRIT1JJVEFUSVZFX0lORk9STUFUSU9OXCI7XG4gICAgLyoqXG4gICAgICogT2ZmaWNpYWwgRG9jdW1lbnRhdGlvbiBAIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMxI3NlY3Rpb24tNi4zLjVcbiAgICAgKlxuICAgICAqIFRoZXJlIGlzIG5vIGNvbnRlbnQgdG8gc2VuZCBmb3IgdGhpcyByZXF1ZXN0LCBidXQgdGhlIGhlYWRlcnMgbWF5IGJlIHVzZWZ1bC4gVGhlIHVzZXItYWdlbnQgbWF5IHVwZGF0ZSBpdHMgY2FjaGVkIGhlYWRlcnMgZm9yIHRoaXMgcmVzb3VyY2Ugd2l0aCB0aGUgbmV3IG9uZXMuXG4gICAgICovXG4gICAgU3RhdHVzQ29kZXNbU3RhdHVzQ29kZXNbXCJOT19DT05URU5UXCJdID0gMjA0XSA9IFwiTk9fQ09OVEVOVFwiO1xuICAgIC8qKlxuICAgICAqIE9mZmljaWFsIERvY3VtZW50YXRpb24gQCBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMSNzZWN0aW9uLTYuMy42XG4gICAgICpcbiAgICAgKiBUaGlzIHJlc3BvbnNlIGNvZGUgaXMgc2VudCBhZnRlciBhY2NvbXBsaXNoaW5nIHJlcXVlc3QgdG8gdGVsbCB1c2VyIGFnZW50IHJlc2V0IGRvY3VtZW50IHZpZXcgd2hpY2ggc2VudCB0aGlzIHJlcXVlc3QuXG4gICAgICovXG4gICAgU3RhdHVzQ29kZXNbU3RhdHVzQ29kZXNbXCJSRVNFVF9DT05URU5UXCJdID0gMjA1XSA9IFwiUkVTRVRfQ09OVEVOVFwiO1xuICAgIC8qKlxuICAgICAqIE9mZmljaWFsIERvY3VtZW50YXRpb24gQCBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMyNzZWN0aW9uLTQuMVxuICAgICAqXG4gICAgICogVGhpcyByZXNwb25zZSBjb2RlIGlzIHVzZWQgYmVjYXVzZSBvZiByYW5nZSBoZWFkZXIgc2VudCBieSB0aGUgY2xpZW50IHRvIHNlcGFyYXRlIGRvd25sb2FkIGludG8gbXVsdGlwbGUgc3RyZWFtcy5cbiAgICAgKi9cbiAgICBTdGF0dXNDb2Rlc1tTdGF0dXNDb2Rlc1tcIlBBUlRJQUxfQ09OVEVOVFwiXSA9IDIwNl0gPSBcIlBBUlRJQUxfQ09OVEVOVFwiO1xuICAgIC8qKlxuICAgICAqIE9mZmljaWFsIERvY3VtZW50YXRpb24gQCBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMjUxOCNzZWN0aW9uLTEwLjJcbiAgICAgKlxuICAgICAqIEEgTXVsdGktU3RhdHVzIHJlc3BvbnNlIGNvbnZleXMgaW5mb3JtYXRpb24gYWJvdXQgbXVsdGlwbGUgcmVzb3VyY2VzIGluIHNpdHVhdGlvbnMgd2hlcmUgbXVsdGlwbGUgc3RhdHVzIGNvZGVzIG1pZ2h0IGJlIGFwcHJvcHJpYXRlLlxuICAgICAqL1xuICAgIFN0YXR1c0NvZGVzW1N0YXR1c0NvZGVzW1wiTVVMVElfU1RBVFVTXCJdID0gMjA3XSA9IFwiTVVMVElfU1RBVFVTXCI7XG4gICAgLyoqXG4gICAgICogT2ZmaWNpYWwgRG9jdW1lbnRhdGlvbiBAIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMxI3NlY3Rpb24tNi40LjFcbiAgICAgKlxuICAgICAqIFRoZSByZXF1ZXN0IGhhcyBtb3JlIHRoYW4gb25lIHBvc3NpYmxlIHJlc3BvbnNlcy4gVXNlci1hZ2VudCBvciB1c2VyIHNob3VsZCBjaG9vc2Ugb25lIG9mIHRoZW0uIFRoZXJlIGlzIG5vIHN0YW5kYXJkaXplZCB3YXkgdG8gY2hvb3NlIG9uZSBvZiB0aGUgcmVzcG9uc2VzLlxuICAgICAqL1xuICAgIFN0YXR1c0NvZGVzW1N0YXR1c0NvZGVzW1wiTVVMVElQTEVfQ0hPSUNFU1wiXSA9IDMwMF0gPSBcIk1VTFRJUExFX0NIT0lDRVNcIjtcbiAgICAvKipcbiAgICAgKiBPZmZpY2lhbCBEb2N1bWVudGF0aW9uIEAgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzEjc2VjdGlvbi02LjQuMlxuICAgICAqXG4gICAgICogVGhpcyByZXNwb25zZSBjb2RlIG1lYW5zIHRoYXQgVVJJIG9mIHJlcXVlc3RlZCByZXNvdXJjZSBoYXMgYmVlbiBjaGFuZ2VkLiBQcm9iYWJseSwgbmV3IFVSSSB3b3VsZCBiZSBnaXZlbiBpbiB0aGUgcmVzcG9uc2UuXG4gICAgICovXG4gICAgU3RhdHVzQ29kZXNbU3RhdHVzQ29kZXNbXCJNT1ZFRF9QRVJNQU5FTlRMWVwiXSA9IDMwMV0gPSBcIk1PVkVEX1BFUk1BTkVOVExZXCI7XG4gICAgLyoqXG4gICAgICogT2ZmaWNpYWwgRG9jdW1lbnRhdGlvbiBAIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMxI3NlY3Rpb24tNi40LjNcbiAgICAgKlxuICAgICAqIFRoaXMgcmVzcG9uc2UgY29kZSBtZWFucyB0aGF0IFVSSSBvZiByZXF1ZXN0ZWQgcmVzb3VyY2UgaGFzIGJlZW4gY2hhbmdlZCB0ZW1wb3JhcmlseS4gTmV3IGNoYW5nZXMgaW4gdGhlIFVSSSBtaWdodCBiZSBtYWRlIGluIHRoZSBmdXR1cmUuIFRoZXJlZm9yZSwgdGhpcyBzYW1lIFVSSSBzaG91bGQgYmUgdXNlZCBieSB0aGUgY2xpZW50IGluIGZ1dHVyZSByZXF1ZXN0cy5cbiAgICAgKi9cbiAgICBTdGF0dXNDb2Rlc1tTdGF0dXNDb2Rlc1tcIk1PVkVEX1RFTVBPUkFSSUxZXCJdID0gMzAyXSA9IFwiTU9WRURfVEVNUE9SQVJJTFlcIjtcbiAgICAvKipcbiAgICAgKiBPZmZpY2lhbCBEb2N1bWVudGF0aW9uIEAgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzEjc2VjdGlvbi02LjQuNFxuICAgICAqXG4gICAgICogU2VydmVyIHNlbnQgdGhpcyByZXNwb25zZSB0byBkaXJlY3RpbmcgY2xpZW50IHRvIGdldCByZXF1ZXN0ZWQgcmVzb3VyY2UgdG8gYW5vdGhlciBVUkkgd2l0aCBhbiBHRVQgcmVxdWVzdC5cbiAgICAgKi9cbiAgICBTdGF0dXNDb2Rlc1tTdGF0dXNDb2Rlc1tcIlNFRV9PVEhFUlwiXSA9IDMwM10gPSBcIlNFRV9PVEhFUlwiO1xuICAgIC8qKlxuICAgICAqIE9mZmljaWFsIERvY3VtZW50YXRpb24gQCBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMiNzZWN0aW9uLTQuMVxuICAgICAqXG4gICAgICogVGhpcyBpcyB1c2VkIGZvciBjYWNoaW5nIHB1cnBvc2VzLiBJdCBpcyB0ZWxsaW5nIHRvIGNsaWVudCB0aGF0IHJlc3BvbnNlIGhhcyBub3QgYmVlbiBtb2RpZmllZC4gU28sIGNsaWVudCBjYW4gY29udGludWUgdG8gdXNlIHNhbWUgY2FjaGVkIHZlcnNpb24gb2YgcmVzcG9uc2UuXG4gICAgICovXG4gICAgU3RhdHVzQ29kZXNbU3RhdHVzQ29kZXNbXCJOT1RfTU9ESUZJRURcIl0gPSAzMDRdID0gXCJOT1RfTU9ESUZJRURcIjtcbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqIE9mZmljaWFsIERvY3VtZW50YXRpb24gQCBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMSNzZWN0aW9uLTYuNC42XG4gICAgICpcbiAgICAgKiBXYXMgZGVmaW5lZCBpbiBhIHByZXZpb3VzIHZlcnNpb24gb2YgdGhlIEhUVFAgc3BlY2lmaWNhdGlvbiB0byBpbmRpY2F0ZSB0aGF0IGEgcmVxdWVzdGVkIHJlc3BvbnNlIG11c3QgYmUgYWNjZXNzZWQgYnkgYSBwcm94eS4gSXQgaGFzIGJlZW4gZGVwcmVjYXRlZCBkdWUgdG8gc2VjdXJpdHkgY29uY2VybnMgcmVnYXJkaW5nIGluLWJhbmQgY29uZmlndXJhdGlvbiBvZiBhIHByb3h5LlxuICAgICAqL1xuICAgIFN0YXR1c0NvZGVzW1N0YXR1c0NvZGVzW1wiVVNFX1BST1hZXCJdID0gMzA1XSA9IFwiVVNFX1BST1hZXCI7XG4gICAgLyoqXG4gICAgICogT2ZmaWNpYWwgRG9jdW1lbnRhdGlvbiBAIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMxI3NlY3Rpb24tNi40LjdcbiAgICAgKlxuICAgICAqIFNlcnZlciBzZW50IHRoaXMgcmVzcG9uc2UgdG8gZGlyZWN0aW5nIGNsaWVudCB0byBnZXQgcmVxdWVzdGVkIHJlc291cmNlIHRvIGFub3RoZXIgVVJJIHdpdGggc2FtZSBtZXRob2QgdGhhdCB1c2VkIHByaW9yIHJlcXVlc3QuIFRoaXMgaGFzIHRoZSBzYW1lIHNlbWFudGljIHRoYW4gdGhlIDMwMiBGb3VuZCBIVFRQIHJlc3BvbnNlIGNvZGUsIHdpdGggdGhlIGV4Y2VwdGlvbiB0aGF0IHRoZSB1c2VyIGFnZW50IG11c3Qgbm90IGNoYW5nZSB0aGUgSFRUUCBtZXRob2QgdXNlZDogaWYgYSBQT1NUIHdhcyB1c2VkIGluIHRoZSBmaXJzdCByZXF1ZXN0LCBhIFBPU1QgbXVzdCBiZSB1c2VkIGluIHRoZSBzZWNvbmQgcmVxdWVzdC5cbiAgICAgKi9cbiAgICBTdGF0dXNDb2Rlc1tTdGF0dXNDb2Rlc1tcIlRFTVBPUkFSWV9SRURJUkVDVFwiXSA9IDMwN10gPSBcIlRFTVBPUkFSWV9SRURJUkVDVFwiO1xuICAgIC8qKlxuICAgICAqIE9mZmljaWFsIERvY3VtZW50YXRpb24gQCBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzUzOCNzZWN0aW9uLTNcbiAgICAgKlxuICAgICAqIFRoaXMgbWVhbnMgdGhhdCB0aGUgcmVzb3VyY2UgaXMgbm93IHBlcm1hbmVudGx5IGxvY2F0ZWQgYXQgYW5vdGhlciBVUkksIHNwZWNpZmllZCBieSB0aGUgTG9jYXRpb246IEhUVFAgUmVzcG9uc2UgaGVhZGVyLiBUaGlzIGhhcyB0aGUgc2FtZSBzZW1hbnRpY3MgYXMgdGhlIDMwMSBNb3ZlZCBQZXJtYW5lbnRseSBIVFRQIHJlc3BvbnNlIGNvZGUsIHdpdGggdGhlIGV4Y2VwdGlvbiB0aGF0IHRoZSB1c2VyIGFnZW50IG11c3Qgbm90IGNoYW5nZSB0aGUgSFRUUCBtZXRob2QgdXNlZDogaWYgYSBQT1NUIHdhcyB1c2VkIGluIHRoZSBmaXJzdCByZXF1ZXN0LCBhIFBPU1QgbXVzdCBiZSB1c2VkIGluIHRoZSBzZWNvbmQgcmVxdWVzdC5cbiAgICAgKi9cbiAgICBTdGF0dXNDb2Rlc1tTdGF0dXNDb2Rlc1tcIlBFUk1BTkVOVF9SRURJUkVDVFwiXSA9IDMwOF0gPSBcIlBFUk1BTkVOVF9SRURJUkVDVFwiO1xuICAgIC8qKlxuICAgICAqIE9mZmljaWFsIERvY3VtZW50YXRpb24gQCBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMSNzZWN0aW9uLTYuNS4xXG4gICAgICpcbiAgICAgKiBUaGlzIHJlc3BvbnNlIG1lYW5zIHRoYXQgc2VydmVyIGNvdWxkIG5vdCB1bmRlcnN0YW5kIHRoZSByZXF1ZXN0IGR1ZSB0byBpbnZhbGlkIHN5bnRheC5cbiAgICAgKi9cbiAgICBTdGF0dXNDb2Rlc1tTdGF0dXNDb2Rlc1tcIkJBRF9SRVFVRVNUXCJdID0gNDAwXSA9IFwiQkFEX1JFUVVFU1RcIjtcbiAgICAvKipcbiAgICAgKiBPZmZpY2lhbCBEb2N1bWVudGF0aW9uIEAgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzUjc2VjdGlvbi0zLjFcbiAgICAgKlxuICAgICAqIEFsdGhvdWdoIHRoZSBIVFRQIHN0YW5kYXJkIHNwZWNpZmllcyBcInVuYXV0aG9yaXplZFwiLCBzZW1hbnRpY2FsbHkgdGhpcyByZXNwb25zZSBtZWFucyBcInVuYXV0aGVudGljYXRlZFwiLiBUaGF0IGlzLCB0aGUgY2xpZW50IG11c3QgYXV0aGVudGljYXRlIGl0c2VsZiB0byBnZXQgdGhlIHJlcXVlc3RlZCByZXNwb25zZS5cbiAgICAgKi9cbiAgICBTdGF0dXNDb2Rlc1tTdGF0dXNDb2Rlc1tcIlVOQVVUSE9SSVpFRFwiXSA9IDQwMV0gPSBcIlVOQVVUSE9SSVpFRFwiO1xuICAgIC8qKlxuICAgICAqIE9mZmljaWFsIERvY3VtZW50YXRpb24gQCBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMSNzZWN0aW9uLTYuNS4yXG4gICAgICpcbiAgICAgKiBUaGlzIHJlc3BvbnNlIGNvZGUgaXMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuIEluaXRpYWwgYWltIGZvciBjcmVhdGluZyB0aGlzIGNvZGUgd2FzIHVzaW5nIGl0IGZvciBkaWdpdGFsIHBheW1lbnQgc3lzdGVtcyBob3dldmVyIHRoaXMgaXMgbm90IHVzZWQgY3VycmVudGx5LlxuICAgICAqL1xuICAgIFN0YXR1c0NvZGVzW1N0YXR1c0NvZGVzW1wiUEFZTUVOVF9SRVFVSVJFRFwiXSA9IDQwMl0gPSBcIlBBWU1FTlRfUkVRVUlSRURcIjtcbiAgICAvKipcbiAgICAgKiBPZmZpY2lhbCBEb2N1bWVudGF0aW9uIEAgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzEjc2VjdGlvbi02LjUuM1xuICAgICAqXG4gICAgICogVGhlIGNsaWVudCBkb2VzIG5vdCBoYXZlIGFjY2VzcyByaWdodHMgdG8gdGhlIGNvbnRlbnQsIGkuZS4gdGhleSBhcmUgdW5hdXRob3JpemVkLCBzbyBzZXJ2ZXIgaXMgcmVqZWN0aW5nIHRvIGdpdmUgcHJvcGVyIHJlc3BvbnNlLiBVbmxpa2UgNDAxLCB0aGUgY2xpZW50J3MgaWRlbnRpdHkgaXMga25vd24gdG8gdGhlIHNlcnZlci5cbiAgICAgKi9cbiAgICBTdGF0dXNDb2Rlc1tTdGF0dXNDb2Rlc1tcIkZPUkJJRERFTlwiXSA9IDQwM10gPSBcIkZPUkJJRERFTlwiO1xuICAgIC8qKlxuICAgICAqIE9mZmljaWFsIERvY3VtZW50YXRpb24gQCBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMSNzZWN0aW9uLTYuNS40XG4gICAgICpcbiAgICAgKiBUaGUgc2VydmVyIGNhbiBub3QgZmluZCByZXF1ZXN0ZWQgcmVzb3VyY2UuIEluIHRoZSBicm93c2VyLCB0aGlzIG1lYW5zIHRoZSBVUkwgaXMgbm90IHJlY29nbml6ZWQuIEluIGFuIEFQSSwgdGhpcyBjYW4gYWxzbyBtZWFuIHRoYXQgdGhlIGVuZHBvaW50IGlzIHZhbGlkIGJ1dCB0aGUgcmVzb3VyY2UgaXRzZWxmIGRvZXMgbm90IGV4aXN0LiBTZXJ2ZXJzIG1heSBhbHNvIHNlbmQgdGhpcyByZXNwb25zZSBpbnN0ZWFkIG9mIDQwMyB0byBoaWRlIHRoZSBleGlzdGVuY2Ugb2YgYSByZXNvdXJjZSBmcm9tIGFuIHVuYXV0aG9yaXplZCBjbGllbnQuIFRoaXMgcmVzcG9uc2UgY29kZSBpcyBwcm9iYWJseSB0aGUgbW9zdCBmYW1vdXMgb25lIGR1ZSB0byBpdHMgZnJlcXVlbnQgb2NjdXJlbmNlIG9uIHRoZSB3ZWIuXG4gICAgICovXG4gICAgU3RhdHVzQ29kZXNbU3RhdHVzQ29kZXNbXCJOT1RfRk9VTkRcIl0gPSA0MDRdID0gXCJOT1RfRk9VTkRcIjtcbiAgICAvKipcbiAgICAgKiBPZmZpY2lhbCBEb2N1bWVudGF0aW9uIEAgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzEjc2VjdGlvbi02LjUuNVxuICAgICAqXG4gICAgICogVGhlIHJlcXVlc3QgbWV0aG9kIGlzIGtub3duIGJ5IHRoZSBzZXJ2ZXIgYnV0IGhhcyBiZWVuIGRpc2FibGVkIGFuZCBjYW5ub3QgYmUgdXNlZC4gRm9yIGV4YW1wbGUsIGFuIEFQSSBtYXkgZm9yYmlkIERFTEVURS1pbmcgYSByZXNvdXJjZS4gVGhlIHR3byBtYW5kYXRvcnkgbWV0aG9kcywgR0VUIGFuZCBIRUFELCBtdXN0IG5ldmVyIGJlIGRpc2FibGVkIGFuZCBzaG91bGQgbm90IHJldHVybiB0aGlzIGVycm9yIGNvZGUuXG4gICAgICovXG4gICAgU3RhdHVzQ29kZXNbU3RhdHVzQ29kZXNbXCJNRVRIT0RfTk9UX0FMTE9XRURcIl0gPSA0MDVdID0gXCJNRVRIT0RfTk9UX0FMTE9XRURcIjtcbiAgICAvKipcbiAgICAgKiBPZmZpY2lhbCBEb2N1bWVudGF0aW9uIEAgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzEjc2VjdGlvbi02LjUuNlxuICAgICAqXG4gICAgICogVGhpcyByZXNwb25zZSBpcyBzZW50IHdoZW4gdGhlIHdlYiBzZXJ2ZXIsIGFmdGVyIHBlcmZvcm1pbmcgc2VydmVyLWRyaXZlbiBjb250ZW50IG5lZ290aWF0aW9uLCBkb2Vzbid0IGZpbmQgYW55IGNvbnRlbnQgZm9sbG93aW5nIHRoZSBjcml0ZXJpYSBnaXZlbiBieSB0aGUgdXNlciBhZ2VudC5cbiAgICAgKi9cbiAgICBTdGF0dXNDb2Rlc1tTdGF0dXNDb2Rlc1tcIk5PVF9BQ0NFUFRBQkxFXCJdID0gNDA2XSA9IFwiTk9UX0FDQ0VQVEFCTEVcIjtcbiAgICAvKipcbiAgICAgKiBPZmZpY2lhbCBEb2N1bWVudGF0aW9uIEAgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzUjc2VjdGlvbi0zLjJcbiAgICAgKlxuICAgICAqIFRoaXMgaXMgc2ltaWxhciB0byA0MDEgYnV0IGF1dGhlbnRpY2F0aW9uIGlzIG5lZWRlZCB0byBiZSBkb25lIGJ5IGEgcHJveHkuXG4gICAgICovXG4gICAgU3RhdHVzQ29kZXNbU3RhdHVzQ29kZXNbXCJQUk9YWV9BVVRIRU5USUNBVElPTl9SRVFVSVJFRFwiXSA9IDQwN10gPSBcIlBST1hZX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEXCI7XG4gICAgLyoqXG4gICAgICogT2ZmaWNpYWwgRG9jdW1lbnRhdGlvbiBAIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMxI3NlY3Rpb24tNi41LjdcbiAgICAgKlxuICAgICAqIFRoaXMgcmVzcG9uc2UgaXMgc2VudCBvbiBhbiBpZGxlIGNvbm5lY3Rpb24gYnkgc29tZSBzZXJ2ZXJzLCBldmVuIHdpdGhvdXQgYW55IHByZXZpb3VzIHJlcXVlc3QgYnkgdGhlIGNsaWVudC4gSXQgbWVhbnMgdGhhdCB0aGUgc2VydmVyIHdvdWxkIGxpa2UgdG8gc2h1dCBkb3duIHRoaXMgdW51c2VkIGNvbm5lY3Rpb24uIFRoaXMgcmVzcG9uc2UgaXMgdXNlZCBtdWNoIG1vcmUgc2luY2Ugc29tZSBicm93c2VycywgbGlrZSBDaHJvbWUsIEZpcmVmb3ggMjcrLCBvciBJRTksIHVzZSBIVFRQIHByZS1jb25uZWN0aW9uIG1lY2hhbmlzbXMgdG8gc3BlZWQgdXAgc3VyZmluZy4gQWxzbyBub3RlIHRoYXQgc29tZSBzZXJ2ZXJzIG1lcmVseSBzaHV0IGRvd24gdGhlIGNvbm5lY3Rpb24gd2l0aG91dCBzZW5kaW5nIHRoaXMgbWVzc2FnZS5cbiAgICAgKi9cbiAgICBTdGF0dXNDb2Rlc1tTdGF0dXNDb2Rlc1tcIlJFUVVFU1RfVElNRU9VVFwiXSA9IDQwOF0gPSBcIlJFUVVFU1RfVElNRU9VVFwiO1xuICAgIC8qKlxuICAgICAqIE9mZmljaWFsIERvY3VtZW50YXRpb24gQCBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMSNzZWN0aW9uLTYuNS44XG4gICAgICpcbiAgICAgKiBUaGlzIHJlc3BvbnNlIGlzIHNlbnQgd2hlbiBhIHJlcXVlc3QgY29uZmxpY3RzIHdpdGggdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHNlcnZlci5cbiAgICAgKi9cbiAgICBTdGF0dXNDb2Rlc1tTdGF0dXNDb2Rlc1tcIkNPTkZMSUNUXCJdID0gNDA5XSA9IFwiQ09ORkxJQ1RcIjtcbiAgICAvKipcbiAgICAgKiBPZmZpY2lhbCBEb2N1bWVudGF0aW9uIEAgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzEjc2VjdGlvbi02LjUuOVxuICAgICAqXG4gICAgICogVGhpcyByZXNwb25zZSB3b3VsZCBiZSBzZW50IHdoZW4gdGhlIHJlcXVlc3RlZCBjb250ZW50IGhhcyBiZWVuIHBlcm1lbmFudGx5IGRlbGV0ZWQgZnJvbSBzZXJ2ZXIsIHdpdGggbm8gZm9yd2FyZGluZyBhZGRyZXNzLiBDbGllbnRzIGFyZSBleHBlY3RlZCB0byByZW1vdmUgdGhlaXIgY2FjaGVzIGFuZCBsaW5rcyB0byB0aGUgcmVzb3VyY2UuIFRoZSBIVFRQIHNwZWNpZmljYXRpb24gaW50ZW5kcyB0aGlzIHN0YXR1cyBjb2RlIHRvIGJlIHVzZWQgZm9yIFwibGltaXRlZC10aW1lLCBwcm9tb3Rpb25hbCBzZXJ2aWNlc1wiLiBBUElzIHNob3VsZCBub3QgZmVlbCBjb21wZWxsZWQgdG8gaW5kaWNhdGUgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGRlbGV0ZWQgd2l0aCB0aGlzIHN0YXR1cyBjb2RlLlxuICAgICAqL1xuICAgIFN0YXR1c0NvZGVzW1N0YXR1c0NvZGVzW1wiR09ORVwiXSA9IDQxMF0gPSBcIkdPTkVcIjtcbiAgICAvKipcbiAgICAgKiBPZmZpY2lhbCBEb2N1bWVudGF0aW9uIEAgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzEjc2VjdGlvbi02LjUuMTBcbiAgICAgKlxuICAgICAqIFRoZSBzZXJ2ZXIgcmVqZWN0ZWQgdGhlIHJlcXVlc3QgYmVjYXVzZSB0aGUgQ29udGVudC1MZW5ndGggaGVhZGVyIGZpZWxkIGlzIG5vdCBkZWZpbmVkIGFuZCB0aGUgc2VydmVyIHJlcXVpcmVzIGl0LlxuICAgICAqL1xuICAgIFN0YXR1c0NvZGVzW1N0YXR1c0NvZGVzW1wiTEVOR1RIX1JFUVVJUkVEXCJdID0gNDExXSA9IFwiTEVOR1RIX1JFUVVJUkVEXCI7XG4gICAgLyoqXG4gICAgICogT2ZmaWNpYWwgRG9jdW1lbnRhdGlvbiBAIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMyI3NlY3Rpb24tNC4yXG4gICAgICpcbiAgICAgKiBUaGUgY2xpZW50IGhhcyBpbmRpY2F0ZWQgcHJlY29uZGl0aW9ucyBpbiBpdHMgaGVhZGVycyB3aGljaCB0aGUgc2VydmVyIGRvZXMgbm90IG1lZXQuXG4gICAgICovXG4gICAgU3RhdHVzQ29kZXNbU3RhdHVzQ29kZXNbXCJQUkVDT05ESVRJT05fRkFJTEVEXCJdID0gNDEyXSA9IFwiUFJFQ09ORElUSU9OX0ZBSUxFRFwiO1xuICAgIC8qKlxuICAgICAqIE9mZmljaWFsIERvY3VtZW50YXRpb24gQCBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMSNzZWN0aW9uLTYuNS4xMVxuICAgICAqXG4gICAgICogUmVxdWVzdCBlbnRpdHkgaXMgbGFyZ2VyIHRoYW4gbGltaXRzIGRlZmluZWQgYnkgc2VydmVyOyB0aGUgc2VydmVyIG1pZ2h0IGNsb3NlIHRoZSBjb25uZWN0aW9uIG9yIHJldHVybiBhbiBSZXRyeS1BZnRlciBoZWFkZXIgZmllbGQuXG4gICAgICovXG4gICAgU3RhdHVzQ29kZXNbU3RhdHVzQ29kZXNbXCJSRVFVRVNUX1RPT19MT05HXCJdID0gNDEzXSA9IFwiUkVRVUVTVF9UT09fTE9OR1wiO1xuICAgIC8qKlxuICAgICAqIE9mZmljaWFsIERvY3VtZW50YXRpb24gQCBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMSNzZWN0aW9uLTYuNS4xMlxuICAgICAqXG4gICAgICogVGhlIFVSSSByZXF1ZXN0ZWQgYnkgdGhlIGNsaWVudCBpcyBsb25nZXIgdGhhbiB0aGUgc2VydmVyIGlzIHdpbGxpbmcgdG8gaW50ZXJwcmV0LlxuICAgICAqL1xuICAgIFN0YXR1c0NvZGVzW1N0YXR1c0NvZGVzW1wiUkVRVUVTVF9VUklfVE9PX0xPTkdcIl0gPSA0MTRdID0gXCJSRVFVRVNUX1VSSV9UT09fTE9OR1wiO1xuICAgIC8qKlxuICAgICAqIE9mZmljaWFsIERvY3VtZW50YXRpb24gQCBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMSNzZWN0aW9uLTYuNS4xM1xuICAgICAqXG4gICAgICogVGhlIG1lZGlhIGZvcm1hdCBvZiB0aGUgcmVxdWVzdGVkIGRhdGEgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgc2VydmVyLCBzbyB0aGUgc2VydmVyIGlzIHJlamVjdGluZyB0aGUgcmVxdWVzdC5cbiAgICAgKi9cbiAgICBTdGF0dXNDb2Rlc1tTdGF0dXNDb2Rlc1tcIlVOU1VQUE9SVEVEX01FRElBX1RZUEVcIl0gPSA0MTVdID0gXCJVTlNVUFBPUlRFRF9NRURJQV9UWVBFXCI7XG4gICAgLyoqXG4gICAgICogT2ZmaWNpYWwgRG9jdW1lbnRhdGlvbiBAIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMzI3NlY3Rpb24tNC40XG4gICAgICpcbiAgICAgKiBUaGUgcmFuZ2Ugc3BlY2lmaWVkIGJ5IHRoZSBSYW5nZSBoZWFkZXIgZmllbGQgaW4gdGhlIHJlcXVlc3QgY2FuJ3QgYmUgZnVsZmlsbGVkOyBpdCdzIHBvc3NpYmxlIHRoYXQgdGhlIHJhbmdlIGlzIG91dHNpZGUgdGhlIHNpemUgb2YgdGhlIHRhcmdldCBVUkkncyBkYXRhLlxuICAgICAqL1xuICAgIFN0YXR1c0NvZGVzW1N0YXR1c0NvZGVzW1wiUkVRVUVTVEVEX1JBTkdFX05PVF9TQVRJU0ZJQUJMRVwiXSA9IDQxNl0gPSBcIlJFUVVFU1RFRF9SQU5HRV9OT1RfU0FUSVNGSUFCTEVcIjtcbiAgICAvKipcbiAgICAgKiBPZmZpY2lhbCBEb2N1bWVudGF0aW9uIEAgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzEjc2VjdGlvbi02LjUuMTRcbiAgICAgKlxuICAgICAqIFRoaXMgcmVzcG9uc2UgY29kZSBtZWFucyB0aGUgZXhwZWN0YXRpb24gaW5kaWNhdGVkIGJ5IHRoZSBFeHBlY3QgcmVxdWVzdCBoZWFkZXIgZmllbGQgY2FuJ3QgYmUgbWV0IGJ5IHRoZSBzZXJ2ZXIuXG4gICAgICovXG4gICAgU3RhdHVzQ29kZXNbU3RhdHVzQ29kZXNbXCJFWFBFQ1RBVElPTl9GQUlMRURcIl0gPSA0MTddID0gXCJFWFBFQ1RBVElPTl9GQUlMRURcIjtcbiAgICAvKipcbiAgICAgKiBPZmZpY2lhbCBEb2N1bWVudGF0aW9uIEAgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzIzMjQjc2VjdGlvbi0yLjMuMlxuICAgICAqXG4gICAgICogQW55IGF0dGVtcHQgdG8gYnJldyBjb2ZmZWUgd2l0aCBhIHRlYXBvdCBzaG91bGQgcmVzdWx0IGluIHRoZSBlcnJvciBjb2RlIFwiNDE4IEknbSBhIHRlYXBvdFwiLiBUaGUgcmVzdWx0aW5nIGVudGl0eSBib2R5IE1BWSBiZSBzaG9ydCBhbmQgc3RvdXQuXG4gICAgICovXG4gICAgU3RhdHVzQ29kZXNbU3RhdHVzQ29kZXNbXCJJTV9BX1RFQVBPVFwiXSA9IDQxOF0gPSBcIklNX0FfVEVBUE9UXCI7XG4gICAgLyoqXG4gICAgICogT2ZmaWNpYWwgRG9jdW1lbnRhdGlvbiBAIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMyNTE4I3NlY3Rpb24tMTAuNlxuICAgICAqXG4gICAgICogVGhlIDUwNyAoSW5zdWZmaWNpZW50IFN0b3JhZ2UpIHN0YXR1cyBjb2RlIG1lYW5zIHRoZSBtZXRob2QgY291bGQgbm90IGJlIHBlcmZvcm1lZCBvbiB0aGUgcmVzb3VyY2UgYmVjYXVzZSB0aGUgc2VydmVyIGlzIHVuYWJsZSB0byBzdG9yZSB0aGUgcmVwcmVzZW50YXRpb24gbmVlZGVkIHRvIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZSB0aGUgcmVxdWVzdC4gVGhpcyBjb25kaXRpb24gaXMgY29uc2lkZXJlZCB0byBiZSB0ZW1wb3JhcnkuIElmIHRoZSByZXF1ZXN0IHdoaWNoIHJlY2VpdmVkIHRoaXMgc3RhdHVzIGNvZGUgd2FzIHRoZSByZXN1bHQgb2YgYSB1c2VyIGFjdGlvbiwgdGhlIHJlcXVlc3QgTVVTVCBOT1QgYmUgcmVwZWF0ZWQgdW50aWwgaXQgaXMgcmVxdWVzdGVkIGJ5IGEgc2VwYXJhdGUgdXNlciBhY3Rpb24uXG4gICAgICovXG4gICAgU3RhdHVzQ29kZXNbU3RhdHVzQ29kZXNbXCJJTlNVRkZJQ0lFTlRfU1BBQ0VfT05fUkVTT1VSQ0VcIl0gPSA0MTldID0gXCJJTlNVRkZJQ0lFTlRfU1BBQ0VfT05fUkVTT1VSQ0VcIjtcbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqIE9mZmljaWFsIERvY3VtZW50YXRpb24gQCBodHRwczovL3Rvb2xzLmlldGYub3JnL3JmY2RpZmY/ZGlmZnR5cGU9LS1od2RpZmYmdXJsMj1kcmFmdC1pZXRmLXdlYmRhdi1wcm90b2NvbC0wNi50eHRcbiAgICAgKlxuICAgICAqIEEgZGVwcmVjYXRlZCByZXNwb25zZSB1c2VkIGJ5IHRoZSBTcHJpbmcgRnJhbWV3b3JrIHdoZW4gYSBtZXRob2QgaGFzIGZhaWxlZC5cbiAgICAgKi9cbiAgICBTdGF0dXNDb2Rlc1tTdGF0dXNDb2Rlc1tcIk1FVEhPRF9GQUlMVVJFXCJdID0gNDIwXSA9IFwiTUVUSE9EX0ZBSUxVUkVcIjtcbiAgICAvKipcbiAgICAgKiBPZmZpY2lhbCBEb2N1bWVudGF0aW9uIEAgaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmM3NTQwI3NlY3Rpb24tOS4xLjJcbiAgICAgKlxuICAgICAqIERlZmluZWQgaW4gdGhlIHNwZWNpZmljYXRpb24gb2YgSFRUUC8yIHRvIGluZGljYXRlIHRoYXQgYSBzZXJ2ZXIgaXMgbm90IGFibGUgdG8gcHJvZHVjZSBhIHJlc3BvbnNlIGZvciB0aGUgY29tYmluYXRpb24gb2Ygc2NoZW1lIGFuZCBhdXRob3JpdHkgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIHJlcXVlc3QgVVJJLlxuICAgICAqL1xuICAgIFN0YXR1c0NvZGVzW1N0YXR1c0NvZGVzW1wiTUlTRElSRUNURURfUkVRVUVTVFwiXSA9IDQyMV0gPSBcIk1JU0RJUkVDVEVEX1JFUVVFU1RcIjtcbiAgICAvKipcbiAgICAgKiBPZmZpY2lhbCBEb2N1bWVudGF0aW9uIEAgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzI1MTgjc2VjdGlvbi0xMC4zXG4gICAgICpcbiAgICAgKiBUaGUgcmVxdWVzdCB3YXMgd2VsbC1mb3JtZWQgYnV0IHdhcyB1bmFibGUgdG8gYmUgZm9sbG93ZWQgZHVlIHRvIHNlbWFudGljIGVycm9ycy5cbiAgICAgKi9cbiAgICBTdGF0dXNDb2Rlc1tTdGF0dXNDb2Rlc1tcIlVOUFJPQ0VTU0FCTEVfRU5USVRZXCJdID0gNDIyXSA9IFwiVU5QUk9DRVNTQUJMRV9FTlRJVFlcIjtcbiAgICAvKipcbiAgICAgKiBPZmZpY2lhbCBEb2N1bWVudGF0aW9uIEAgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzI1MTgjc2VjdGlvbi0xMC40XG4gICAgICpcbiAgICAgKiBUaGUgcmVzb3VyY2UgdGhhdCBpcyBiZWluZyBhY2Nlc3NlZCBpcyBsb2NrZWQuXG4gICAgICovXG4gICAgU3RhdHVzQ29kZXNbU3RhdHVzQ29kZXNbXCJMT0NLRURcIl0gPSA0MjNdID0gXCJMT0NLRURcIjtcbiAgICAvKipcbiAgICAgKiBPZmZpY2lhbCBEb2N1bWVudGF0aW9uIEAgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzI1MTgjc2VjdGlvbi0xMC41XG4gICAgICpcbiAgICAgKiBUaGUgcmVxdWVzdCBmYWlsZWQgZHVlIHRvIGZhaWx1cmUgb2YgYSBwcmV2aW91cyByZXF1ZXN0LlxuICAgICAqL1xuICAgIFN0YXR1c0NvZGVzW1N0YXR1c0NvZGVzW1wiRkFJTEVEX0RFUEVOREVOQ1lcIl0gPSA0MjRdID0gXCJGQUlMRURfREVQRU5ERU5DWVwiO1xuICAgIC8qKlxuICAgICAqIE9mZmljaWFsIERvY3VtZW50YXRpb24gQCBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzcyMzEjc2VjdGlvbi02LjUuMTVcbiAgICAgKlxuICAgICAqIFRoZSBzZXJ2ZXIgcmVmdXNlcyB0byBwZXJmb3JtIHRoZSByZXF1ZXN0IHVzaW5nIHRoZSBjdXJyZW50IHByb3RvY29sIGJ1dCBtaWdodCBiZSB3aWxsaW5nIHRvIGRvIHNvIGFmdGVyIHRoZSBjbGllbnQgdXBncmFkZXMgdG8gYSBkaWZmZXJlbnQgcHJvdG9jb2wuXG4gICAgICovXG4gICAgU3RhdHVzQ29kZXNbU3RhdHVzQ29kZXNbXCJVUEdSQURFX1JFUVVJUkVEXCJdID0gNDI2XSA9IFwiVVBHUkFERV9SRVFVSVJFRFwiO1xuICAgIC8qKlxuICAgICAqIE9mZmljaWFsIERvY3VtZW50YXRpb24gQCBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNjU4NSNzZWN0aW9uLTNcbiAgICAgKlxuICAgICAqIFRoZSBvcmlnaW4gc2VydmVyIHJlcXVpcmVzIHRoZSByZXF1ZXN0IHRvIGJlIGNvbmRpdGlvbmFsLiBJbnRlbmRlZCB0byBwcmV2ZW50IHRoZSAnbG9zdCB1cGRhdGUnIHByb2JsZW0sIHdoZXJlIGEgY2xpZW50IEdFVHMgYSByZXNvdXJjZSdzIHN0YXRlLCBtb2RpZmllcyBpdCwgYW5kIFBVVHMgaXQgYmFjayB0byB0aGUgc2VydmVyLCB3aGVuIG1lYW53aGlsZSBhIHRoaXJkIHBhcnR5IGhhcyBtb2RpZmllZCB0aGUgc3RhdGUgb24gdGhlIHNlcnZlciwgbGVhZGluZyB0byBhIGNvbmZsaWN0LlxuICAgICAqL1xuICAgIFN0YXR1c0NvZGVzW1N0YXR1c0NvZGVzW1wiUFJFQ09ORElUSU9OX1JFUVVJUkVEXCJdID0gNDI4XSA9IFwiUFJFQ09ORElUSU9OX1JFUVVJUkVEXCI7XG4gICAgLyoqXG4gICAgICogT2ZmaWNpYWwgRG9jdW1lbnRhdGlvbiBAIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2NTg1I3NlY3Rpb24tNFxuICAgICAqXG4gICAgICogVGhlIHVzZXIgaGFzIHNlbnQgdG9vIG1hbnkgcmVxdWVzdHMgaW4gYSBnaXZlbiBhbW91bnQgb2YgdGltZSAoXCJyYXRlIGxpbWl0aW5nXCIpLlxuICAgICAqL1xuICAgIFN0YXR1c0NvZGVzW1N0YXR1c0NvZGVzW1wiVE9PX01BTllfUkVRVUVTVFNcIl0gPSA0MjldID0gXCJUT09fTUFOWV9SRVFVRVNUU1wiO1xuICAgIC8qKlxuICAgICAqIE9mZmljaWFsIERvY3VtZW50YXRpb24gQCBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNjU4NSNzZWN0aW9uLTVcbiAgICAgKlxuICAgICAqIFRoZSBzZXJ2ZXIgaXMgdW53aWxsaW5nIHRvIHByb2Nlc3MgdGhlIHJlcXVlc3QgYmVjYXVzZSBpdHMgaGVhZGVyIGZpZWxkcyBhcmUgdG9vIGxhcmdlLiBUaGUgcmVxdWVzdCBNQVkgYmUgcmVzdWJtaXR0ZWQgYWZ0ZXIgcmVkdWNpbmcgdGhlIHNpemUgb2YgdGhlIHJlcXVlc3QgaGVhZGVyIGZpZWxkcy5cbiAgICAgKi9cbiAgICBTdGF0dXNDb2Rlc1tTdGF0dXNDb2Rlc1tcIlJFUVVFU1RfSEVBREVSX0ZJRUxEU19UT09fTEFSR0VcIl0gPSA0MzFdID0gXCJSRVFVRVNUX0hFQURFUl9GSUVMRFNfVE9PX0xBUkdFXCI7XG4gICAgLyoqXG4gICAgICogT2ZmaWNpYWwgRG9jdW1lbnRhdGlvbiBAIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3NzI1XG4gICAgICpcbiAgICAgKiBUaGUgdXNlci1hZ2VudCByZXF1ZXN0ZWQgYSByZXNvdXJjZSB0aGF0IGNhbm5vdCBsZWdhbGx5IGJlIHByb3ZpZGVkLCBzdWNoIGFzIGEgd2ViIHBhZ2UgY2Vuc29yZWQgYnkgYSBnb3Zlcm5tZW50LlxuICAgICAqL1xuICAgIFN0YXR1c0NvZGVzW1N0YXR1c0NvZGVzW1wiVU5BVkFJTEFCTEVfRk9SX0xFR0FMX1JFQVNPTlNcIl0gPSA0NTFdID0gXCJVTkFWQUlMQUJMRV9GT1JfTEVHQUxfUkVBU09OU1wiO1xuICAgIC8qKlxuICAgICAqIE9mZmljaWFsIERvY3VtZW50YXRpb24gQCBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMSNzZWN0aW9uLTYuNi4xXG4gICAgICpcbiAgICAgKiBUaGUgc2VydmVyIGVuY291bnRlcmVkIGFuIHVuZXhwZWN0ZWQgY29uZGl0aW9uIHRoYXQgcHJldmVudGVkIGl0IGZyb20gZnVsZmlsbGluZyB0aGUgcmVxdWVzdC5cbiAgICAgKi9cbiAgICBTdGF0dXNDb2Rlc1tTdGF0dXNDb2Rlc1tcIklOVEVSTkFMX1NFUlZFUl9FUlJPUlwiXSA9IDUwMF0gPSBcIklOVEVSTkFMX1NFUlZFUl9FUlJPUlwiO1xuICAgIC8qKlxuICAgICAqIE9mZmljaWFsIERvY3VtZW50YXRpb24gQCBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMSNzZWN0aW9uLTYuNi4yXG4gICAgICpcbiAgICAgKiBUaGUgcmVxdWVzdCBtZXRob2QgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgc2VydmVyIGFuZCBjYW5ub3QgYmUgaGFuZGxlZC4gVGhlIG9ubHkgbWV0aG9kcyB0aGF0IHNlcnZlcnMgYXJlIHJlcXVpcmVkIHRvIHN1cHBvcnQgKGFuZCB0aGVyZWZvcmUgdGhhdCBtdXN0IG5vdCByZXR1cm4gdGhpcyBjb2RlKSBhcmUgR0VUIGFuZCBIRUFELlxuICAgICAqL1xuICAgIFN0YXR1c0NvZGVzW1N0YXR1c0NvZGVzW1wiTk9UX0lNUExFTUVOVEVEXCJdID0gNTAxXSA9IFwiTk9UX0lNUExFTUVOVEVEXCI7XG4gICAgLyoqXG4gICAgICogT2ZmaWNpYWwgRG9jdW1lbnRhdGlvbiBAIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMxI3NlY3Rpb24tNi42LjNcbiAgICAgKlxuICAgICAqIFRoaXMgZXJyb3IgcmVzcG9uc2UgbWVhbnMgdGhhdCB0aGUgc2VydmVyLCB3aGlsZSB3b3JraW5nIGFzIGEgZ2F0ZXdheSB0byBnZXQgYSByZXNwb25zZSBuZWVkZWQgdG8gaGFuZGxlIHRoZSByZXF1ZXN0LCBnb3QgYW4gaW52YWxpZCByZXNwb25zZS5cbiAgICAgKi9cbiAgICBTdGF0dXNDb2Rlc1tTdGF0dXNDb2Rlc1tcIkJBRF9HQVRFV0FZXCJdID0gNTAyXSA9IFwiQkFEX0dBVEVXQVlcIjtcbiAgICAvKipcbiAgICAgKiBPZmZpY2lhbCBEb2N1bWVudGF0aW9uIEAgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzEjc2VjdGlvbi02LjYuNFxuICAgICAqXG4gICAgICogVGhlIHNlcnZlciBpcyBub3QgcmVhZHkgdG8gaGFuZGxlIHRoZSByZXF1ZXN0LiBDb21tb24gY2F1c2VzIGFyZSBhIHNlcnZlciB0aGF0IGlzIGRvd24gZm9yIG1haW50ZW5hbmNlIG9yIHRoYXQgaXMgb3ZlcmxvYWRlZC4gTm90ZSB0aGF0IHRvZ2V0aGVyIHdpdGggdGhpcyByZXNwb25zZSwgYSB1c2VyLWZyaWVuZGx5IHBhZ2UgZXhwbGFpbmluZyB0aGUgcHJvYmxlbSBzaG91bGQgYmUgc2VudC4gVGhpcyByZXNwb25zZXMgc2hvdWxkIGJlIHVzZWQgZm9yIHRlbXBvcmFyeSBjb25kaXRpb25zIGFuZCB0aGUgUmV0cnktQWZ0ZXI6IEhUVFAgaGVhZGVyIHNob3VsZCwgaWYgcG9zc2libGUsIGNvbnRhaW4gdGhlIGVzdGltYXRlZCB0aW1lIGJlZm9yZSB0aGUgcmVjb3Zlcnkgb2YgdGhlIHNlcnZpY2UuIFRoZSB3ZWJtYXN0ZXIgbXVzdCBhbHNvIHRha2UgY2FyZSBhYm91dCB0aGUgY2FjaGluZy1yZWxhdGVkIGhlYWRlcnMgdGhhdCBhcmUgc2VudCBhbG9uZyB3aXRoIHRoaXMgcmVzcG9uc2UsIGFzIHRoZXNlIHRlbXBvcmFyeSBjb25kaXRpb24gcmVzcG9uc2VzIHNob3VsZCB1c3VhbGx5IG5vdCBiZSBjYWNoZWQuXG4gICAgICovXG4gICAgU3RhdHVzQ29kZXNbU3RhdHVzQ29kZXNbXCJTRVJWSUNFX1VOQVZBSUxBQkxFXCJdID0gNTAzXSA9IFwiU0VSVklDRV9VTkFWQUlMQUJMRVwiO1xuICAgIC8qKlxuICAgICAqIE9mZmljaWFsIERvY3VtZW50YXRpb24gQCBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMSNzZWN0aW9uLTYuNi41XG4gICAgICpcbiAgICAgKiBUaGlzIGVycm9yIHJlc3BvbnNlIGlzIGdpdmVuIHdoZW4gdGhlIHNlcnZlciBpcyBhY3RpbmcgYXMgYSBnYXRld2F5IGFuZCBjYW5ub3QgZ2V0IGEgcmVzcG9uc2UgaW4gdGltZS5cbiAgICAgKi9cbiAgICBTdGF0dXNDb2Rlc1tTdGF0dXNDb2Rlc1tcIkdBVEVXQVlfVElNRU9VVFwiXSA9IDUwNF0gPSBcIkdBVEVXQVlfVElNRU9VVFwiO1xuICAgIC8qKlxuICAgICAqIE9mZmljaWFsIERvY3VtZW50YXRpb24gQCBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMSNzZWN0aW9uLTYuNi42XG4gICAgICpcbiAgICAgKiBUaGUgSFRUUCB2ZXJzaW9uIHVzZWQgaW4gdGhlIHJlcXVlc3QgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgc2VydmVyLlxuICAgICAqL1xuICAgIFN0YXR1c0NvZGVzW1N0YXR1c0NvZGVzW1wiSFRUUF9WRVJTSU9OX05PVF9TVVBQT1JURURcIl0gPSA1MDVdID0gXCJIVFRQX1ZFUlNJT05fTk9UX1NVUFBPUlRFRFwiO1xuICAgIC8qKlxuICAgICAqIE9mZmljaWFsIERvY3VtZW50YXRpb24gQCBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMjUxOCNzZWN0aW9uLTEwLjZcbiAgICAgKlxuICAgICAqIFRoZSBzZXJ2ZXIgaGFzIGFuIGludGVybmFsIGNvbmZpZ3VyYXRpb24gZXJyb3I6IHRoZSBjaG9zZW4gdmFyaWFudCByZXNvdXJjZSBpcyBjb25maWd1cmVkIHRvIGVuZ2FnZSBpbiB0cmFuc3BhcmVudCBjb250ZW50IG5lZ290aWF0aW9uIGl0c2VsZiwgYW5kIGlzIHRoZXJlZm9yZSBub3QgYSBwcm9wZXIgZW5kIHBvaW50IGluIHRoZSBuZWdvdGlhdGlvbiBwcm9jZXNzLlxuICAgICAqL1xuICAgIFN0YXR1c0NvZGVzW1N0YXR1c0NvZGVzW1wiSU5TVUZGSUNJRU5UX1NUT1JBR0VcIl0gPSA1MDddID0gXCJJTlNVRkZJQ0lFTlRfU1RPUkFHRVwiO1xuICAgIC8qKlxuICAgICAqIE9mZmljaWFsIERvY3VtZW50YXRpb24gQCBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNjU4NSNzZWN0aW9uLTZcbiAgICAgKlxuICAgICAqIFRoZSA1MTEgc3RhdHVzIGNvZGUgaW5kaWNhdGVzIHRoYXQgdGhlIGNsaWVudCBuZWVkcyB0byBhdXRoZW50aWNhdGUgdG8gZ2FpbiBuZXR3b3JrIGFjY2Vzcy5cbiAgICAgKi9cbiAgICBTdGF0dXNDb2Rlc1tTdGF0dXNDb2Rlc1tcIk5FVFdPUktfQVVUSEVOVElDQVRJT05fUkVRVUlSRURcIl0gPSA1MTFdID0gXCJORVRXT1JLX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEXCI7XG59KShTdGF0dXNDb2RlcyA9IGV4cG9ydHMuU3RhdHVzQ29kZXMgfHwgKGV4cG9ydHMuU3RhdHVzQ29kZXMgPSB7fSkpO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5SZWFzb25QaHJhc2VzID0gdm9pZCAwO1xuLy8gR2VuZXJhdGVkIGZpbGUuIERvIG5vdCBlZGl0XG52YXIgUmVhc29uUGhyYXNlcztcbihmdW5jdGlvbiAoUmVhc29uUGhyYXNlcykge1xuICAgIC8qKlxuICAgICAqIE9mZmljaWFsIERvY3VtZW50YXRpb24gQCBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMSNzZWN0aW9uLTYuMy4zXG4gICAgICpcbiAgICAgKiBUaGUgcmVxdWVzdCBoYXMgYmVlbiByZWNlaXZlZCBidXQgbm90IHlldCBhY3RlZCB1cG9uLiBJdCBpcyBub24tY29tbWl0dGFsLCBtZWFuaW5nIHRoYXQgdGhlcmUgaXMgbm8gd2F5IGluIEhUVFAgdG8gbGF0ZXIgc2VuZCBhbiBhc3luY2hyb25vdXMgcmVzcG9uc2UgaW5kaWNhdGluZyB0aGUgb3V0Y29tZSBvZiBwcm9jZXNzaW5nIHRoZSByZXF1ZXN0LiBJdCBpcyBpbnRlbmRlZCBmb3IgY2FzZXMgd2hlcmUgYW5vdGhlciBwcm9jZXNzIG9yIHNlcnZlciBoYW5kbGVzIHRoZSByZXF1ZXN0LCBvciBmb3IgYmF0Y2ggcHJvY2Vzc2luZy5cbiAgICAgKi9cbiAgICBSZWFzb25QaHJhc2VzW1wiQUNDRVBURURcIl0gPSBcIkFjY2VwdGVkXCI7XG4gICAgLyoqXG4gICAgICogT2ZmaWNpYWwgRG9jdW1lbnRhdGlvbiBAIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMxI3NlY3Rpb24tNi42LjNcbiAgICAgKlxuICAgICAqIFRoaXMgZXJyb3IgcmVzcG9uc2UgbWVhbnMgdGhhdCB0aGUgc2VydmVyLCB3aGlsZSB3b3JraW5nIGFzIGEgZ2F0ZXdheSB0byBnZXQgYSByZXNwb25zZSBuZWVkZWQgdG8gaGFuZGxlIHRoZSByZXF1ZXN0LCBnb3QgYW4gaW52YWxpZCByZXNwb25zZS5cbiAgICAgKi9cbiAgICBSZWFzb25QaHJhc2VzW1wiQkFEX0dBVEVXQVlcIl0gPSBcIkJhZCBHYXRld2F5XCI7XG4gICAgLyoqXG4gICAgICogT2ZmaWNpYWwgRG9jdW1lbnRhdGlvbiBAIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMxI3NlY3Rpb24tNi41LjFcbiAgICAgKlxuICAgICAqIFRoaXMgcmVzcG9uc2UgbWVhbnMgdGhhdCBzZXJ2ZXIgY291bGQgbm90IHVuZGVyc3RhbmQgdGhlIHJlcXVlc3QgZHVlIHRvIGludmFsaWQgc3ludGF4LlxuICAgICAqL1xuICAgIFJlYXNvblBocmFzZXNbXCJCQURfUkVRVUVTVFwiXSA9IFwiQmFkIFJlcXVlc3RcIjtcbiAgICAvKipcbiAgICAgKiBPZmZpY2lhbCBEb2N1bWVudGF0aW9uIEAgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzEjc2VjdGlvbi02LjUuOFxuICAgICAqXG4gICAgICogVGhpcyByZXNwb25zZSBpcyBzZW50IHdoZW4gYSByZXF1ZXN0IGNvbmZsaWN0cyB3aXRoIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBzZXJ2ZXIuXG4gICAgICovXG4gICAgUmVhc29uUGhyYXNlc1tcIkNPTkZMSUNUXCJdID0gXCJDb25mbGljdFwiO1xuICAgIC8qKlxuICAgICAqIE9mZmljaWFsIERvY3VtZW50YXRpb24gQCBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMSNzZWN0aW9uLTYuMi4xXG4gICAgICpcbiAgICAgKiBUaGlzIGludGVyaW0gcmVzcG9uc2UgaW5kaWNhdGVzIHRoYXQgZXZlcnl0aGluZyBzbyBmYXIgaXMgT0sgYW5kIHRoYXQgdGhlIGNsaWVudCBzaG91bGQgY29udGludWUgd2l0aCB0aGUgcmVxdWVzdCBvciBpZ25vcmUgaXQgaWYgaXQgaXMgYWxyZWFkeSBmaW5pc2hlZC5cbiAgICAgKi9cbiAgICBSZWFzb25QaHJhc2VzW1wiQ09OVElOVUVcIl0gPSBcIkNvbnRpbnVlXCI7XG4gICAgLyoqXG4gICAgICogT2ZmaWNpYWwgRG9jdW1lbnRhdGlvbiBAIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMxI3NlY3Rpb24tNi4zLjJcbiAgICAgKlxuICAgICAqIFRoZSByZXF1ZXN0IGhhcyBzdWNjZWVkZWQgYW5kIGEgbmV3IHJlc291cmNlIGhhcyBiZWVuIGNyZWF0ZWQgYXMgYSByZXN1bHQgb2YgaXQuIFRoaXMgaXMgdHlwaWNhbGx5IHRoZSByZXNwb25zZSBzZW50IGFmdGVyIGEgUFVUIHJlcXVlc3QuXG4gICAgICovXG4gICAgUmVhc29uUGhyYXNlc1tcIkNSRUFURURcIl0gPSBcIkNyZWF0ZWRcIjtcbiAgICAvKipcbiAgICAgKiBPZmZpY2lhbCBEb2N1bWVudGF0aW9uIEAgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzEjc2VjdGlvbi02LjUuMTRcbiAgICAgKlxuICAgICAqIFRoaXMgcmVzcG9uc2UgY29kZSBtZWFucyB0aGUgZXhwZWN0YXRpb24gaW5kaWNhdGVkIGJ5IHRoZSBFeHBlY3QgcmVxdWVzdCBoZWFkZXIgZmllbGQgY2FuJ3QgYmUgbWV0IGJ5IHRoZSBzZXJ2ZXIuXG4gICAgICovXG4gICAgUmVhc29uUGhyYXNlc1tcIkVYUEVDVEFUSU9OX0ZBSUxFRFwiXSA9IFwiRXhwZWN0YXRpb24gRmFpbGVkXCI7XG4gICAgLyoqXG4gICAgICogT2ZmaWNpYWwgRG9jdW1lbnRhdGlvbiBAIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMyNTE4I3NlY3Rpb24tMTAuNVxuICAgICAqXG4gICAgICogVGhlIHJlcXVlc3QgZmFpbGVkIGR1ZSB0byBmYWlsdXJlIG9mIGEgcHJldmlvdXMgcmVxdWVzdC5cbiAgICAgKi9cbiAgICBSZWFzb25QaHJhc2VzW1wiRkFJTEVEX0RFUEVOREVOQ1lcIl0gPSBcIkZhaWxlZCBEZXBlbmRlbmN5XCI7XG4gICAgLyoqXG4gICAgICogT2ZmaWNpYWwgRG9jdW1lbnRhdGlvbiBAIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMxI3NlY3Rpb24tNi41LjNcbiAgICAgKlxuICAgICAqIFRoZSBjbGllbnQgZG9lcyBub3QgaGF2ZSBhY2Nlc3MgcmlnaHRzIHRvIHRoZSBjb250ZW50LCBpLmUuIHRoZXkgYXJlIHVuYXV0aG9yaXplZCwgc28gc2VydmVyIGlzIHJlamVjdGluZyB0byBnaXZlIHByb3BlciByZXNwb25zZS4gVW5saWtlIDQwMSwgdGhlIGNsaWVudCdzIGlkZW50aXR5IGlzIGtub3duIHRvIHRoZSBzZXJ2ZXIuXG4gICAgICovXG4gICAgUmVhc29uUGhyYXNlc1tcIkZPUkJJRERFTlwiXSA9IFwiRm9yYmlkZGVuXCI7XG4gICAgLyoqXG4gICAgICogT2ZmaWNpYWwgRG9jdW1lbnRhdGlvbiBAIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMxI3NlY3Rpb24tNi42LjVcbiAgICAgKlxuICAgICAqIFRoaXMgZXJyb3IgcmVzcG9uc2UgaXMgZ2l2ZW4gd2hlbiB0aGUgc2VydmVyIGlzIGFjdGluZyBhcyBhIGdhdGV3YXkgYW5kIGNhbm5vdCBnZXQgYSByZXNwb25zZSBpbiB0aW1lLlxuICAgICAqL1xuICAgIFJlYXNvblBocmFzZXNbXCJHQVRFV0FZX1RJTUVPVVRcIl0gPSBcIkdhdGV3YXkgVGltZW91dFwiO1xuICAgIC8qKlxuICAgICAqIE9mZmljaWFsIERvY3VtZW50YXRpb24gQCBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMSNzZWN0aW9uLTYuNS45XG4gICAgICpcbiAgICAgKiBUaGlzIHJlc3BvbnNlIHdvdWxkIGJlIHNlbnQgd2hlbiB0aGUgcmVxdWVzdGVkIGNvbnRlbnQgaGFzIGJlZW4gcGVybWVuYW50bHkgZGVsZXRlZCBmcm9tIHNlcnZlciwgd2l0aCBubyBmb3J3YXJkaW5nIGFkZHJlc3MuIENsaWVudHMgYXJlIGV4cGVjdGVkIHRvIHJlbW92ZSB0aGVpciBjYWNoZXMgYW5kIGxpbmtzIHRvIHRoZSByZXNvdXJjZS4gVGhlIEhUVFAgc3BlY2lmaWNhdGlvbiBpbnRlbmRzIHRoaXMgc3RhdHVzIGNvZGUgdG8gYmUgdXNlZCBmb3IgXCJsaW1pdGVkLXRpbWUsIHByb21vdGlvbmFsIHNlcnZpY2VzXCIuIEFQSXMgc2hvdWxkIG5vdCBmZWVsIGNvbXBlbGxlZCB0byBpbmRpY2F0ZSByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gZGVsZXRlZCB3aXRoIHRoaXMgc3RhdHVzIGNvZGUuXG4gICAgICovXG4gICAgUmVhc29uUGhyYXNlc1tcIkdPTkVcIl0gPSBcIkdvbmVcIjtcbiAgICAvKipcbiAgICAgKiBPZmZpY2lhbCBEb2N1bWVudGF0aW9uIEAgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzEjc2VjdGlvbi02LjYuNlxuICAgICAqXG4gICAgICogVGhlIEhUVFAgdmVyc2lvbiB1c2VkIGluIHRoZSByZXF1ZXN0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHNlcnZlci5cbiAgICAgKi9cbiAgICBSZWFzb25QaHJhc2VzW1wiSFRUUF9WRVJTSU9OX05PVF9TVVBQT1JURURcIl0gPSBcIkhUVFAgVmVyc2lvbiBOb3QgU3VwcG9ydGVkXCI7XG4gICAgLyoqXG4gICAgICogT2ZmaWNpYWwgRG9jdW1lbnRhdGlvbiBAIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMyMzI0I3NlY3Rpb24tMi4zLjJcbiAgICAgKlxuICAgICAqIEFueSBhdHRlbXB0IHRvIGJyZXcgY29mZmVlIHdpdGggYSB0ZWFwb3Qgc2hvdWxkIHJlc3VsdCBpbiB0aGUgZXJyb3IgY29kZSBcIjQxOCBJJ20gYSB0ZWFwb3RcIi4gVGhlIHJlc3VsdGluZyBlbnRpdHkgYm9keSBNQVkgYmUgc2hvcnQgYW5kIHN0b3V0LlxuICAgICAqL1xuICAgIFJlYXNvblBocmFzZXNbXCJJTV9BX1RFQVBPVFwiXSA9IFwiSSdtIGEgdGVhcG90XCI7XG4gICAgLyoqXG4gICAgICogT2ZmaWNpYWwgRG9jdW1lbnRhdGlvbiBAIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMyNTE4I3NlY3Rpb24tMTAuNlxuICAgICAqXG4gICAgICogVGhlIDUwNyAoSW5zdWZmaWNpZW50IFN0b3JhZ2UpIHN0YXR1cyBjb2RlIG1lYW5zIHRoZSBtZXRob2QgY291bGQgbm90IGJlIHBlcmZvcm1lZCBvbiB0aGUgcmVzb3VyY2UgYmVjYXVzZSB0aGUgc2VydmVyIGlzIHVuYWJsZSB0byBzdG9yZSB0aGUgcmVwcmVzZW50YXRpb24gbmVlZGVkIHRvIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZSB0aGUgcmVxdWVzdC4gVGhpcyBjb25kaXRpb24gaXMgY29uc2lkZXJlZCB0byBiZSB0ZW1wb3JhcnkuIElmIHRoZSByZXF1ZXN0IHdoaWNoIHJlY2VpdmVkIHRoaXMgc3RhdHVzIGNvZGUgd2FzIHRoZSByZXN1bHQgb2YgYSB1c2VyIGFjdGlvbiwgdGhlIHJlcXVlc3QgTVVTVCBOT1QgYmUgcmVwZWF0ZWQgdW50aWwgaXQgaXMgcmVxdWVzdGVkIGJ5IGEgc2VwYXJhdGUgdXNlciBhY3Rpb24uXG4gICAgICovXG4gICAgUmVhc29uUGhyYXNlc1tcIklOU1VGRklDSUVOVF9TUEFDRV9PTl9SRVNPVVJDRVwiXSA9IFwiSW5zdWZmaWNpZW50IFNwYWNlIG9uIFJlc291cmNlXCI7XG4gICAgLyoqXG4gICAgICogT2ZmaWNpYWwgRG9jdW1lbnRhdGlvbiBAIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMyNTE4I3NlY3Rpb24tMTAuNlxuICAgICAqXG4gICAgICogVGhlIHNlcnZlciBoYXMgYW4gaW50ZXJuYWwgY29uZmlndXJhdGlvbiBlcnJvcjogdGhlIGNob3NlbiB2YXJpYW50IHJlc291cmNlIGlzIGNvbmZpZ3VyZWQgdG8gZW5nYWdlIGluIHRyYW5zcGFyZW50IGNvbnRlbnQgbmVnb3RpYXRpb24gaXRzZWxmLCBhbmQgaXMgdGhlcmVmb3JlIG5vdCBhIHByb3BlciBlbmQgcG9pbnQgaW4gdGhlIG5lZ290aWF0aW9uIHByb2Nlc3MuXG4gICAgICovXG4gICAgUmVhc29uUGhyYXNlc1tcIklOU1VGRklDSUVOVF9TVE9SQUdFXCJdID0gXCJJbnN1ZmZpY2llbnQgU3RvcmFnZVwiO1xuICAgIC8qKlxuICAgICAqIE9mZmljaWFsIERvY3VtZW50YXRpb24gQCBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMSNzZWN0aW9uLTYuNi4xXG4gICAgICpcbiAgICAgKiBUaGUgc2VydmVyIGVuY291bnRlcmVkIGFuIHVuZXhwZWN0ZWQgY29uZGl0aW9uIHRoYXQgcHJldmVudGVkIGl0IGZyb20gZnVsZmlsbGluZyB0aGUgcmVxdWVzdC5cbiAgICAgKi9cbiAgICBSZWFzb25QaHJhc2VzW1wiSU5URVJOQUxfU0VSVkVSX0VSUk9SXCJdID0gXCJJbnRlcm5hbCBTZXJ2ZXIgRXJyb3JcIjtcbiAgICAvKipcbiAgICAgKiBPZmZpY2lhbCBEb2N1bWVudGF0aW9uIEAgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzEjc2VjdGlvbi02LjUuMTBcbiAgICAgKlxuICAgICAqIFRoZSBzZXJ2ZXIgcmVqZWN0ZWQgdGhlIHJlcXVlc3QgYmVjYXVzZSB0aGUgQ29udGVudC1MZW5ndGggaGVhZGVyIGZpZWxkIGlzIG5vdCBkZWZpbmVkIGFuZCB0aGUgc2VydmVyIHJlcXVpcmVzIGl0LlxuICAgICAqL1xuICAgIFJlYXNvblBocmFzZXNbXCJMRU5HVEhfUkVRVUlSRURcIl0gPSBcIkxlbmd0aCBSZXF1aXJlZFwiO1xuICAgIC8qKlxuICAgICAqIE9mZmljaWFsIERvY3VtZW50YXRpb24gQCBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMjUxOCNzZWN0aW9uLTEwLjRcbiAgICAgKlxuICAgICAqIFRoZSByZXNvdXJjZSB0aGF0IGlzIGJlaW5nIGFjY2Vzc2VkIGlzIGxvY2tlZC5cbiAgICAgKi9cbiAgICBSZWFzb25QaHJhc2VzW1wiTE9DS0VEXCJdID0gXCJMb2NrZWRcIjtcbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqIE9mZmljaWFsIERvY3VtZW50YXRpb24gQCBodHRwczovL3Rvb2xzLmlldGYub3JnL3JmY2RpZmY/ZGlmZnR5cGU9LS1od2RpZmYmdXJsMj1kcmFmdC1pZXRmLXdlYmRhdi1wcm90b2NvbC0wNi50eHRcbiAgICAgKlxuICAgICAqIEEgZGVwcmVjYXRlZCByZXNwb25zZSB1c2VkIGJ5IHRoZSBTcHJpbmcgRnJhbWV3b3JrIHdoZW4gYSBtZXRob2QgaGFzIGZhaWxlZC5cbiAgICAgKi9cbiAgICBSZWFzb25QaHJhc2VzW1wiTUVUSE9EX0ZBSUxVUkVcIl0gPSBcIk1ldGhvZCBGYWlsdXJlXCI7XG4gICAgLyoqXG4gICAgICogT2ZmaWNpYWwgRG9jdW1lbnRhdGlvbiBAIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMxI3NlY3Rpb24tNi41LjVcbiAgICAgKlxuICAgICAqIFRoZSByZXF1ZXN0IG1ldGhvZCBpcyBrbm93biBieSB0aGUgc2VydmVyIGJ1dCBoYXMgYmVlbiBkaXNhYmxlZCBhbmQgY2Fubm90IGJlIHVzZWQuIEZvciBleGFtcGxlLCBhbiBBUEkgbWF5IGZvcmJpZCBERUxFVEUtaW5nIGEgcmVzb3VyY2UuIFRoZSB0d28gbWFuZGF0b3J5IG1ldGhvZHMsIEdFVCBhbmQgSEVBRCwgbXVzdCBuZXZlciBiZSBkaXNhYmxlZCBhbmQgc2hvdWxkIG5vdCByZXR1cm4gdGhpcyBlcnJvciBjb2RlLlxuICAgICAqL1xuICAgIFJlYXNvblBocmFzZXNbXCJNRVRIT0RfTk9UX0FMTE9XRURcIl0gPSBcIk1ldGhvZCBOb3QgQWxsb3dlZFwiO1xuICAgIC8qKlxuICAgICAqIE9mZmljaWFsIERvY3VtZW50YXRpb24gQCBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMSNzZWN0aW9uLTYuNC4yXG4gICAgICpcbiAgICAgKiBUaGlzIHJlc3BvbnNlIGNvZGUgbWVhbnMgdGhhdCBVUkkgb2YgcmVxdWVzdGVkIHJlc291cmNlIGhhcyBiZWVuIGNoYW5nZWQuIFByb2JhYmx5LCBuZXcgVVJJIHdvdWxkIGJlIGdpdmVuIGluIHRoZSByZXNwb25zZS5cbiAgICAgKi9cbiAgICBSZWFzb25QaHJhc2VzW1wiTU9WRURfUEVSTUFORU5UTFlcIl0gPSBcIk1vdmVkIFBlcm1hbmVudGx5XCI7XG4gICAgLyoqXG4gICAgICogT2ZmaWNpYWwgRG9jdW1lbnRhdGlvbiBAIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMxI3NlY3Rpb24tNi40LjNcbiAgICAgKlxuICAgICAqIFRoaXMgcmVzcG9uc2UgY29kZSBtZWFucyB0aGF0IFVSSSBvZiByZXF1ZXN0ZWQgcmVzb3VyY2UgaGFzIGJlZW4gY2hhbmdlZCB0ZW1wb3JhcmlseS4gTmV3IGNoYW5nZXMgaW4gdGhlIFVSSSBtaWdodCBiZSBtYWRlIGluIHRoZSBmdXR1cmUuIFRoZXJlZm9yZSwgdGhpcyBzYW1lIFVSSSBzaG91bGQgYmUgdXNlZCBieSB0aGUgY2xpZW50IGluIGZ1dHVyZSByZXF1ZXN0cy5cbiAgICAgKi9cbiAgICBSZWFzb25QaHJhc2VzW1wiTU9WRURfVEVNUE9SQVJJTFlcIl0gPSBcIk1vdmVkIFRlbXBvcmFyaWx5XCI7XG4gICAgLyoqXG4gICAgICogT2ZmaWNpYWwgRG9jdW1lbnRhdGlvbiBAIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMyNTE4I3NlY3Rpb24tMTAuMlxuICAgICAqXG4gICAgICogQSBNdWx0aS1TdGF0dXMgcmVzcG9uc2UgY29udmV5cyBpbmZvcm1hdGlvbiBhYm91dCBtdWx0aXBsZSByZXNvdXJjZXMgaW4gc2l0dWF0aW9ucyB3aGVyZSBtdWx0aXBsZSBzdGF0dXMgY29kZXMgbWlnaHQgYmUgYXBwcm9wcmlhdGUuXG4gICAgICovXG4gICAgUmVhc29uUGhyYXNlc1tcIk1VTFRJX1NUQVRVU1wiXSA9IFwiTXVsdGktU3RhdHVzXCI7XG4gICAgLyoqXG4gICAgICogT2ZmaWNpYWwgRG9jdW1lbnRhdGlvbiBAIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMxI3NlY3Rpb24tNi40LjFcbiAgICAgKlxuICAgICAqIFRoZSByZXF1ZXN0IGhhcyBtb3JlIHRoYW4gb25lIHBvc3NpYmxlIHJlc3BvbnNlcy4gVXNlci1hZ2VudCBvciB1c2VyIHNob3VsZCBjaG9vc2Ugb25lIG9mIHRoZW0uIFRoZXJlIGlzIG5vIHN0YW5kYXJkaXplZCB3YXkgdG8gY2hvb3NlIG9uZSBvZiB0aGUgcmVzcG9uc2VzLlxuICAgICAqL1xuICAgIFJlYXNvblBocmFzZXNbXCJNVUxUSVBMRV9DSE9JQ0VTXCJdID0gXCJNdWx0aXBsZSBDaG9pY2VzXCI7XG4gICAgLyoqXG4gICAgICogT2ZmaWNpYWwgRG9jdW1lbnRhdGlvbiBAIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2NTg1I3NlY3Rpb24tNlxuICAgICAqXG4gICAgICogVGhlIDUxMSBzdGF0dXMgY29kZSBpbmRpY2F0ZXMgdGhhdCB0aGUgY2xpZW50IG5lZWRzIHRvIGF1dGhlbnRpY2F0ZSB0byBnYWluIG5ldHdvcmsgYWNjZXNzLlxuICAgICAqL1xuICAgIFJlYXNvblBocmFzZXNbXCJORVRXT1JLX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEXCJdID0gXCJOZXR3b3JrIEF1dGhlbnRpY2F0aW9uIFJlcXVpcmVkXCI7XG4gICAgLyoqXG4gICAgICogT2ZmaWNpYWwgRG9jdW1lbnRhdGlvbiBAIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMxI3NlY3Rpb24tNi4zLjVcbiAgICAgKlxuICAgICAqIFRoZXJlIGlzIG5vIGNvbnRlbnQgdG8gc2VuZCBmb3IgdGhpcyByZXF1ZXN0LCBidXQgdGhlIGhlYWRlcnMgbWF5IGJlIHVzZWZ1bC4gVGhlIHVzZXItYWdlbnQgbWF5IHVwZGF0ZSBpdHMgY2FjaGVkIGhlYWRlcnMgZm9yIHRoaXMgcmVzb3VyY2Ugd2l0aCB0aGUgbmV3IG9uZXMuXG4gICAgICovXG4gICAgUmVhc29uUGhyYXNlc1tcIk5PX0NPTlRFTlRcIl0gPSBcIk5vIENvbnRlbnRcIjtcbiAgICAvKipcbiAgICAgKiBPZmZpY2lhbCBEb2N1bWVudGF0aW9uIEAgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzEjc2VjdGlvbi02LjMuNFxuICAgICAqXG4gICAgICogVGhpcyByZXNwb25zZSBjb2RlIG1lYW5zIHJldHVybmVkIG1ldGEtaW5mb3JtYXRpb24gc2V0IGlzIG5vdCBleGFjdCBzZXQgYXMgYXZhaWxhYmxlIGZyb20gdGhlIG9yaWdpbiBzZXJ2ZXIsIGJ1dCBjb2xsZWN0ZWQgZnJvbSBhIGxvY2FsIG9yIGEgdGhpcmQgcGFydHkgY29weS4gRXhjZXB0IHRoaXMgY29uZGl0aW9uLCAyMDAgT0sgcmVzcG9uc2Ugc2hvdWxkIGJlIHByZWZlcnJlZCBpbnN0ZWFkIG9mIHRoaXMgcmVzcG9uc2UuXG4gICAgICovXG4gICAgUmVhc29uUGhyYXNlc1tcIk5PTl9BVVRIT1JJVEFUSVZFX0lORk9STUFUSU9OXCJdID0gXCJOb24gQXV0aG9yaXRhdGl2ZSBJbmZvcm1hdGlvblwiO1xuICAgIC8qKlxuICAgICAqIE9mZmljaWFsIERvY3VtZW50YXRpb24gQCBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMSNzZWN0aW9uLTYuNS42XG4gICAgICpcbiAgICAgKiBUaGlzIHJlc3BvbnNlIGlzIHNlbnQgd2hlbiB0aGUgd2ViIHNlcnZlciwgYWZ0ZXIgcGVyZm9ybWluZyBzZXJ2ZXItZHJpdmVuIGNvbnRlbnQgbmVnb3RpYXRpb24sIGRvZXNuJ3QgZmluZCBhbnkgY29udGVudCBmb2xsb3dpbmcgdGhlIGNyaXRlcmlhIGdpdmVuIGJ5IHRoZSB1c2VyIGFnZW50LlxuICAgICAqL1xuICAgIFJlYXNvblBocmFzZXNbXCJOT1RfQUNDRVBUQUJMRVwiXSA9IFwiTm90IEFjY2VwdGFibGVcIjtcbiAgICAvKipcbiAgICAgKiBPZmZpY2lhbCBEb2N1bWVudGF0aW9uIEAgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzEjc2VjdGlvbi02LjUuNFxuICAgICAqXG4gICAgICogVGhlIHNlcnZlciBjYW4gbm90IGZpbmQgcmVxdWVzdGVkIHJlc291cmNlLiBJbiB0aGUgYnJvd3NlciwgdGhpcyBtZWFucyB0aGUgVVJMIGlzIG5vdCByZWNvZ25pemVkLiBJbiBhbiBBUEksIHRoaXMgY2FuIGFsc28gbWVhbiB0aGF0IHRoZSBlbmRwb2ludCBpcyB2YWxpZCBidXQgdGhlIHJlc291cmNlIGl0c2VsZiBkb2VzIG5vdCBleGlzdC4gU2VydmVycyBtYXkgYWxzbyBzZW5kIHRoaXMgcmVzcG9uc2UgaW5zdGVhZCBvZiA0MDMgdG8gaGlkZSB0aGUgZXhpc3RlbmNlIG9mIGEgcmVzb3VyY2UgZnJvbSBhbiB1bmF1dGhvcml6ZWQgY2xpZW50LiBUaGlzIHJlc3BvbnNlIGNvZGUgaXMgcHJvYmFibHkgdGhlIG1vc3QgZmFtb3VzIG9uZSBkdWUgdG8gaXRzIGZyZXF1ZW50IG9jY3VyZW5jZSBvbiB0aGUgd2ViLlxuICAgICAqL1xuICAgIFJlYXNvblBocmFzZXNbXCJOT1RfRk9VTkRcIl0gPSBcIk5vdCBGb3VuZFwiO1xuICAgIC8qKlxuICAgICAqIE9mZmljaWFsIERvY3VtZW50YXRpb24gQCBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMSNzZWN0aW9uLTYuNi4yXG4gICAgICpcbiAgICAgKiBUaGUgcmVxdWVzdCBtZXRob2QgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgc2VydmVyIGFuZCBjYW5ub3QgYmUgaGFuZGxlZC4gVGhlIG9ubHkgbWV0aG9kcyB0aGF0IHNlcnZlcnMgYXJlIHJlcXVpcmVkIHRvIHN1cHBvcnQgKGFuZCB0aGVyZWZvcmUgdGhhdCBtdXN0IG5vdCByZXR1cm4gdGhpcyBjb2RlKSBhcmUgR0VUIGFuZCBIRUFELlxuICAgICAqL1xuICAgIFJlYXNvblBocmFzZXNbXCJOT1RfSU1QTEVNRU5URURcIl0gPSBcIk5vdCBJbXBsZW1lbnRlZFwiO1xuICAgIC8qKlxuICAgICAqIE9mZmljaWFsIERvY3VtZW50YXRpb24gQCBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMiNzZWN0aW9uLTQuMVxuICAgICAqXG4gICAgICogVGhpcyBpcyB1c2VkIGZvciBjYWNoaW5nIHB1cnBvc2VzLiBJdCBpcyB0ZWxsaW5nIHRvIGNsaWVudCB0aGF0IHJlc3BvbnNlIGhhcyBub3QgYmVlbiBtb2RpZmllZC4gU28sIGNsaWVudCBjYW4gY29udGludWUgdG8gdXNlIHNhbWUgY2FjaGVkIHZlcnNpb24gb2YgcmVzcG9uc2UuXG4gICAgICovXG4gICAgUmVhc29uUGhyYXNlc1tcIk5PVF9NT0RJRklFRFwiXSA9IFwiTm90IE1vZGlmaWVkXCI7XG4gICAgLyoqXG4gICAgICogT2ZmaWNpYWwgRG9jdW1lbnRhdGlvbiBAIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMxI3NlY3Rpb24tNi4zLjFcbiAgICAgKlxuICAgICAqIFRoZSByZXF1ZXN0IGhhcyBzdWNjZWVkZWQuIFRoZSBtZWFuaW5nIG9mIGEgc3VjY2VzcyB2YXJpZXMgZGVwZW5kaW5nIG9uIHRoZSBIVFRQIG1ldGhvZDpcbiAgICAgKiBHRVQ6IFRoZSByZXNvdXJjZSBoYXMgYmVlbiBmZXRjaGVkIGFuZCBpcyB0cmFuc21pdHRlZCBpbiB0aGUgbWVzc2FnZSBib2R5LlxuICAgICAqIEhFQUQ6IFRoZSBlbnRpdHkgaGVhZGVycyBhcmUgaW4gdGhlIG1lc3NhZ2UgYm9keS5cbiAgICAgKiBQT1NUOiBUaGUgcmVzb3VyY2UgZGVzY3JpYmluZyB0aGUgcmVzdWx0IG9mIHRoZSBhY3Rpb24gaXMgdHJhbnNtaXR0ZWQgaW4gdGhlIG1lc3NhZ2UgYm9keS5cbiAgICAgKiBUUkFDRTogVGhlIG1lc3NhZ2UgYm9keSBjb250YWlucyB0aGUgcmVxdWVzdCBtZXNzYWdlIGFzIHJlY2VpdmVkIGJ5IHRoZSBzZXJ2ZXJcbiAgICAgKi9cbiAgICBSZWFzb25QaHJhc2VzW1wiT0tcIl0gPSBcIk9LXCI7XG4gICAgLyoqXG4gICAgICogT2ZmaWNpYWwgRG9jdW1lbnRhdGlvbiBAIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMzI3NlY3Rpb24tNC4xXG4gICAgICpcbiAgICAgKiBUaGlzIHJlc3BvbnNlIGNvZGUgaXMgdXNlZCBiZWNhdXNlIG9mIHJhbmdlIGhlYWRlciBzZW50IGJ5IHRoZSBjbGllbnQgdG8gc2VwYXJhdGUgZG93bmxvYWQgaW50byBtdWx0aXBsZSBzdHJlYW1zLlxuICAgICAqL1xuICAgIFJlYXNvblBocmFzZXNbXCJQQVJUSUFMX0NPTlRFTlRcIl0gPSBcIlBhcnRpYWwgQ29udGVudFwiO1xuICAgIC8qKlxuICAgICAqIE9mZmljaWFsIERvY3VtZW50YXRpb24gQCBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMSNzZWN0aW9uLTYuNS4yXG4gICAgICpcbiAgICAgKiBUaGlzIHJlc3BvbnNlIGNvZGUgaXMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuIEluaXRpYWwgYWltIGZvciBjcmVhdGluZyB0aGlzIGNvZGUgd2FzIHVzaW5nIGl0IGZvciBkaWdpdGFsIHBheW1lbnQgc3lzdGVtcyBob3dldmVyIHRoaXMgaXMgbm90IHVzZWQgY3VycmVudGx5LlxuICAgICAqL1xuICAgIFJlYXNvblBocmFzZXNbXCJQQVlNRU5UX1JFUVVJUkVEXCJdID0gXCJQYXltZW50IFJlcXVpcmVkXCI7XG4gICAgLyoqXG4gICAgICogT2ZmaWNpYWwgRG9jdW1lbnRhdGlvbiBAIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3NTM4I3NlY3Rpb24tM1xuICAgICAqXG4gICAgICogVGhpcyBtZWFucyB0aGF0IHRoZSByZXNvdXJjZSBpcyBub3cgcGVybWFuZW50bHkgbG9jYXRlZCBhdCBhbm90aGVyIFVSSSwgc3BlY2lmaWVkIGJ5IHRoZSBMb2NhdGlvbjogSFRUUCBSZXNwb25zZSBoZWFkZXIuIFRoaXMgaGFzIHRoZSBzYW1lIHNlbWFudGljcyBhcyB0aGUgMzAxIE1vdmVkIFBlcm1hbmVudGx5IEhUVFAgcmVzcG9uc2UgY29kZSwgd2l0aCB0aGUgZXhjZXB0aW9uIHRoYXQgdGhlIHVzZXIgYWdlbnQgbXVzdCBub3QgY2hhbmdlIHRoZSBIVFRQIG1ldGhvZCB1c2VkOiBpZiBhIFBPU1Qgd2FzIHVzZWQgaW4gdGhlIGZpcnN0IHJlcXVlc3QsIGEgUE9TVCBtdXN0IGJlIHVzZWQgaW4gdGhlIHNlY29uZCByZXF1ZXN0LlxuICAgICAqL1xuICAgIFJlYXNvblBocmFzZXNbXCJQRVJNQU5FTlRfUkVESVJFQ1RcIl0gPSBcIlBlcm1hbmVudCBSZWRpcmVjdFwiO1xuICAgIC8qKlxuICAgICAqIE9mZmljaWFsIERvY3VtZW50YXRpb24gQCBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMiNzZWN0aW9uLTQuMlxuICAgICAqXG4gICAgICogVGhlIGNsaWVudCBoYXMgaW5kaWNhdGVkIHByZWNvbmRpdGlvbnMgaW4gaXRzIGhlYWRlcnMgd2hpY2ggdGhlIHNlcnZlciBkb2VzIG5vdCBtZWV0LlxuICAgICAqL1xuICAgIFJlYXNvblBocmFzZXNbXCJQUkVDT05ESVRJT05fRkFJTEVEXCJdID0gXCJQcmVjb25kaXRpb24gRmFpbGVkXCI7XG4gICAgLyoqXG4gICAgICogT2ZmaWNpYWwgRG9jdW1lbnRhdGlvbiBAIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2NTg1I3NlY3Rpb24tM1xuICAgICAqXG4gICAgICogVGhlIG9yaWdpbiBzZXJ2ZXIgcmVxdWlyZXMgdGhlIHJlcXVlc3QgdG8gYmUgY29uZGl0aW9uYWwuIEludGVuZGVkIHRvIHByZXZlbnQgdGhlICdsb3N0IHVwZGF0ZScgcHJvYmxlbSwgd2hlcmUgYSBjbGllbnQgR0VUcyBhIHJlc291cmNlJ3Mgc3RhdGUsIG1vZGlmaWVzIGl0LCBhbmQgUFVUcyBpdCBiYWNrIHRvIHRoZSBzZXJ2ZXIsIHdoZW4gbWVhbndoaWxlIGEgdGhpcmQgcGFydHkgaGFzIG1vZGlmaWVkIHRoZSBzdGF0ZSBvbiB0aGUgc2VydmVyLCBsZWFkaW5nIHRvIGEgY29uZmxpY3QuXG4gICAgICovXG4gICAgUmVhc29uUGhyYXNlc1tcIlBSRUNPTkRJVElPTl9SRVFVSVJFRFwiXSA9IFwiUHJlY29uZGl0aW9uIFJlcXVpcmVkXCI7XG4gICAgLyoqXG4gICAgICogT2ZmaWNpYWwgRG9jdW1lbnRhdGlvbiBAIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMyNTE4I3NlY3Rpb24tMTAuMVxuICAgICAqXG4gICAgICogVGhpcyBjb2RlIGluZGljYXRlcyB0aGF0IHRoZSBzZXJ2ZXIgaGFzIHJlY2VpdmVkIGFuZCBpcyBwcm9jZXNzaW5nIHRoZSByZXF1ZXN0LCBidXQgbm8gcmVzcG9uc2UgaXMgYXZhaWxhYmxlIHlldC5cbiAgICAgKi9cbiAgICBSZWFzb25QaHJhc2VzW1wiUFJPQ0VTU0lOR1wiXSA9IFwiUHJvY2Vzc2luZ1wiO1xuICAgIC8qKlxuICAgICAqIE9mZmljaWFsIERvY3VtZW50YXRpb24gQCBodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjODI5NyNwYWdlLTNcbiAgICAgKlxuICAgICAqIFRoaXMgY29kZSBpbmRpY2F0ZXMgdG8gdGhlIGNsaWVudCB0aGF0IHRoZSBzZXJ2ZXIgaXMgbGlrZWx5IHRvIHNlbmQgYSBmaW5hbCByZXNwb25zZSB3aXRoIHRoZSBoZWFkZXIgZmllbGRzIGluY2x1ZGVkIGluIHRoZSBpbmZvcm1hdGlvbmFsIHJlc3BvbnNlLlxuICAgICAqL1xuICAgIFJlYXNvblBocmFzZXNbXCJFQVJMWV9ISU5UU1wiXSA9IFwiRWFybHkgSGludHNcIjtcbiAgICAvKipcbiAgICAgKiBPZmZpY2lhbCBEb2N1bWVudGF0aW9uIEAgaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmM3MjMxI3NlY3Rpb24tNi41LjE1XG4gICAgICpcbiAgICAgKiBUaGUgc2VydmVyIHJlZnVzZXMgdG8gcGVyZm9ybSB0aGUgcmVxdWVzdCB1c2luZyB0aGUgY3VycmVudCBwcm90b2NvbCBidXQgbWlnaHQgYmUgd2lsbGluZyB0byBkbyBzbyBhZnRlciB0aGUgY2xpZW50IHVwZ3JhZGVzIHRvIGEgZGlmZmVyZW50IHByb3RvY29sLlxuICAgICAqL1xuICAgIFJlYXNvblBocmFzZXNbXCJVUEdSQURFX1JFUVVJUkVEXCJdID0gXCJVcGdyYWRlIFJlcXVpcmVkXCI7XG4gICAgLyoqXG4gICAgICogT2ZmaWNpYWwgRG9jdW1lbnRhdGlvbiBAIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjM1I3NlY3Rpb24tMy4yXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIHNpbWlsYXIgdG8gNDAxIGJ1dCBhdXRoZW50aWNhdGlvbiBpcyBuZWVkZWQgdG8gYmUgZG9uZSBieSBhIHByb3h5LlxuICAgICAqL1xuICAgIFJlYXNvblBocmFzZXNbXCJQUk9YWV9BVVRIRU5USUNBVElPTl9SRVFVSVJFRFwiXSA9IFwiUHJveHkgQXV0aGVudGljYXRpb24gUmVxdWlyZWRcIjtcbiAgICAvKipcbiAgICAgKiBPZmZpY2lhbCBEb2N1bWVudGF0aW9uIEAgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzY1ODUjc2VjdGlvbi01XG4gICAgICpcbiAgICAgKiBUaGUgc2VydmVyIGlzIHVud2lsbGluZyB0byBwcm9jZXNzIHRoZSByZXF1ZXN0IGJlY2F1c2UgaXRzIGhlYWRlciBmaWVsZHMgYXJlIHRvbyBsYXJnZS4gVGhlIHJlcXVlc3QgTUFZIGJlIHJlc3VibWl0dGVkIGFmdGVyIHJlZHVjaW5nIHRoZSBzaXplIG9mIHRoZSByZXF1ZXN0IGhlYWRlciBmaWVsZHMuXG4gICAgICovXG4gICAgUmVhc29uUGhyYXNlc1tcIlJFUVVFU1RfSEVBREVSX0ZJRUxEU19UT09fTEFSR0VcIl0gPSBcIlJlcXVlc3QgSGVhZGVyIEZpZWxkcyBUb28gTGFyZ2VcIjtcbiAgICAvKipcbiAgICAgKiBPZmZpY2lhbCBEb2N1bWVudGF0aW9uIEAgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzEjc2VjdGlvbi02LjUuN1xuICAgICAqXG4gICAgICogVGhpcyByZXNwb25zZSBpcyBzZW50IG9uIGFuIGlkbGUgY29ubmVjdGlvbiBieSBzb21lIHNlcnZlcnMsIGV2ZW4gd2l0aG91dCBhbnkgcHJldmlvdXMgcmVxdWVzdCBieSB0aGUgY2xpZW50LiBJdCBtZWFucyB0aGF0IHRoZSBzZXJ2ZXIgd291bGQgbGlrZSB0byBzaHV0IGRvd24gdGhpcyB1bnVzZWQgY29ubmVjdGlvbi4gVGhpcyByZXNwb25zZSBpcyB1c2VkIG11Y2ggbW9yZSBzaW5jZSBzb21lIGJyb3dzZXJzLCBsaWtlIENocm9tZSwgRmlyZWZveCAyNyssIG9yIElFOSwgdXNlIEhUVFAgcHJlLWNvbm5lY3Rpb24gbWVjaGFuaXNtcyB0byBzcGVlZCB1cCBzdXJmaW5nLiBBbHNvIG5vdGUgdGhhdCBzb21lIHNlcnZlcnMgbWVyZWx5IHNodXQgZG93biB0aGUgY29ubmVjdGlvbiB3aXRob3V0IHNlbmRpbmcgdGhpcyBtZXNzYWdlLlxuICAgICAqL1xuICAgIFJlYXNvblBocmFzZXNbXCJSRVFVRVNUX1RJTUVPVVRcIl0gPSBcIlJlcXVlc3QgVGltZW91dFwiO1xuICAgIC8qKlxuICAgICAqIE9mZmljaWFsIERvY3VtZW50YXRpb24gQCBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMSNzZWN0aW9uLTYuNS4xMVxuICAgICAqXG4gICAgICogUmVxdWVzdCBlbnRpdHkgaXMgbGFyZ2VyIHRoYW4gbGltaXRzIGRlZmluZWQgYnkgc2VydmVyOyB0aGUgc2VydmVyIG1pZ2h0IGNsb3NlIHRoZSBjb25uZWN0aW9uIG9yIHJldHVybiBhbiBSZXRyeS1BZnRlciBoZWFkZXIgZmllbGQuXG4gICAgICovXG4gICAgUmVhc29uUGhyYXNlc1tcIlJFUVVFU1RfVE9PX0xPTkdcIl0gPSBcIlJlcXVlc3QgRW50aXR5IFRvbyBMYXJnZVwiO1xuICAgIC8qKlxuICAgICAqIE9mZmljaWFsIERvY3VtZW50YXRpb24gQCBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMSNzZWN0aW9uLTYuNS4xMlxuICAgICAqXG4gICAgICogVGhlIFVSSSByZXF1ZXN0ZWQgYnkgdGhlIGNsaWVudCBpcyBsb25nZXIgdGhhbiB0aGUgc2VydmVyIGlzIHdpbGxpbmcgdG8gaW50ZXJwcmV0LlxuICAgICAqL1xuICAgIFJlYXNvblBocmFzZXNbXCJSRVFVRVNUX1VSSV9UT09fTE9OR1wiXSA9IFwiUmVxdWVzdC1VUkkgVG9vIExvbmdcIjtcbiAgICAvKipcbiAgICAgKiBPZmZpY2lhbCBEb2N1bWVudGF0aW9uIEAgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzMjc2VjdGlvbi00LjRcbiAgICAgKlxuICAgICAqIFRoZSByYW5nZSBzcGVjaWZpZWQgYnkgdGhlIFJhbmdlIGhlYWRlciBmaWVsZCBpbiB0aGUgcmVxdWVzdCBjYW4ndCBiZSBmdWxmaWxsZWQ7IGl0J3MgcG9zc2libGUgdGhhdCB0aGUgcmFuZ2UgaXMgb3V0c2lkZSB0aGUgc2l6ZSBvZiB0aGUgdGFyZ2V0IFVSSSdzIGRhdGEuXG4gICAgICovXG4gICAgUmVhc29uUGhyYXNlc1tcIlJFUVVFU1RFRF9SQU5HRV9OT1RfU0FUSVNGSUFCTEVcIl0gPSBcIlJlcXVlc3RlZCBSYW5nZSBOb3QgU2F0aXNmaWFibGVcIjtcbiAgICAvKipcbiAgICAgKiBPZmZpY2lhbCBEb2N1bWVudGF0aW9uIEAgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzEjc2VjdGlvbi02LjMuNlxuICAgICAqXG4gICAgICogVGhpcyByZXNwb25zZSBjb2RlIGlzIHNlbnQgYWZ0ZXIgYWNjb21wbGlzaGluZyByZXF1ZXN0IHRvIHRlbGwgdXNlciBhZ2VudCByZXNldCBkb2N1bWVudCB2aWV3IHdoaWNoIHNlbnQgdGhpcyByZXF1ZXN0LlxuICAgICAqL1xuICAgIFJlYXNvblBocmFzZXNbXCJSRVNFVF9DT05URU5UXCJdID0gXCJSZXNldCBDb250ZW50XCI7XG4gICAgLyoqXG4gICAgICogT2ZmaWNpYWwgRG9jdW1lbnRhdGlvbiBAIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMxI3NlY3Rpb24tNi40LjRcbiAgICAgKlxuICAgICAqIFNlcnZlciBzZW50IHRoaXMgcmVzcG9uc2UgdG8gZGlyZWN0aW5nIGNsaWVudCB0byBnZXQgcmVxdWVzdGVkIHJlc291cmNlIHRvIGFub3RoZXIgVVJJIHdpdGggYW4gR0VUIHJlcXVlc3QuXG4gICAgICovXG4gICAgUmVhc29uUGhyYXNlc1tcIlNFRV9PVEhFUlwiXSA9IFwiU2VlIE90aGVyXCI7XG4gICAgLyoqXG4gICAgICogT2ZmaWNpYWwgRG9jdW1lbnRhdGlvbiBAIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMxI3NlY3Rpb24tNi42LjRcbiAgICAgKlxuICAgICAqIFRoZSBzZXJ2ZXIgaXMgbm90IHJlYWR5IHRvIGhhbmRsZSB0aGUgcmVxdWVzdC4gQ29tbW9uIGNhdXNlcyBhcmUgYSBzZXJ2ZXIgdGhhdCBpcyBkb3duIGZvciBtYWludGVuYW5jZSBvciB0aGF0IGlzIG92ZXJsb2FkZWQuIE5vdGUgdGhhdCB0b2dldGhlciB3aXRoIHRoaXMgcmVzcG9uc2UsIGEgdXNlci1mcmllbmRseSBwYWdlIGV4cGxhaW5pbmcgdGhlIHByb2JsZW0gc2hvdWxkIGJlIHNlbnQuIFRoaXMgcmVzcG9uc2VzIHNob3VsZCBiZSB1c2VkIGZvciB0ZW1wb3JhcnkgY29uZGl0aW9ucyBhbmQgdGhlIFJldHJ5LUFmdGVyOiBIVFRQIGhlYWRlciBzaG91bGQsIGlmIHBvc3NpYmxlLCBjb250YWluIHRoZSBlc3RpbWF0ZWQgdGltZSBiZWZvcmUgdGhlIHJlY292ZXJ5IG9mIHRoZSBzZXJ2aWNlLiBUaGUgd2VibWFzdGVyIG11c3QgYWxzbyB0YWtlIGNhcmUgYWJvdXQgdGhlIGNhY2hpbmctcmVsYXRlZCBoZWFkZXJzIHRoYXQgYXJlIHNlbnQgYWxvbmcgd2l0aCB0aGlzIHJlc3BvbnNlLCBhcyB0aGVzZSB0ZW1wb3JhcnkgY29uZGl0aW9uIHJlc3BvbnNlcyBzaG91bGQgdXN1YWxseSBub3QgYmUgY2FjaGVkLlxuICAgICAqL1xuICAgIFJlYXNvblBocmFzZXNbXCJTRVJWSUNFX1VOQVZBSUxBQkxFXCJdID0gXCJTZXJ2aWNlIFVuYXZhaWxhYmxlXCI7XG4gICAgLyoqXG4gICAgICogT2ZmaWNpYWwgRG9jdW1lbnRhdGlvbiBAIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMxI3NlY3Rpb24tNi4yLjJcbiAgICAgKlxuICAgICAqIFRoaXMgY29kZSBpcyBzZW50IGluIHJlc3BvbnNlIHRvIGFuIFVwZ3JhZGUgcmVxdWVzdCBoZWFkZXIgYnkgdGhlIGNsaWVudCwgYW5kIGluZGljYXRlcyB0aGUgcHJvdG9jb2wgdGhlIHNlcnZlciBpcyBzd2l0Y2hpbmcgdG9vLlxuICAgICAqL1xuICAgIFJlYXNvblBocmFzZXNbXCJTV0lUQ0hJTkdfUFJPVE9DT0xTXCJdID0gXCJTd2l0Y2hpbmcgUHJvdG9jb2xzXCI7XG4gICAgLyoqXG4gICAgICogT2ZmaWNpYWwgRG9jdW1lbnRhdGlvbiBAIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMxI3NlY3Rpb24tNi40LjdcbiAgICAgKlxuICAgICAqIFNlcnZlciBzZW50IHRoaXMgcmVzcG9uc2UgdG8gZGlyZWN0aW5nIGNsaWVudCB0byBnZXQgcmVxdWVzdGVkIHJlc291cmNlIHRvIGFub3RoZXIgVVJJIHdpdGggc2FtZSBtZXRob2QgdGhhdCB1c2VkIHByaW9yIHJlcXVlc3QuIFRoaXMgaGFzIHRoZSBzYW1lIHNlbWFudGljIHRoYW4gdGhlIDMwMiBGb3VuZCBIVFRQIHJlc3BvbnNlIGNvZGUsIHdpdGggdGhlIGV4Y2VwdGlvbiB0aGF0IHRoZSB1c2VyIGFnZW50IG11c3Qgbm90IGNoYW5nZSB0aGUgSFRUUCBtZXRob2QgdXNlZDogaWYgYSBQT1NUIHdhcyB1c2VkIGluIHRoZSBmaXJzdCByZXF1ZXN0LCBhIFBPU1QgbXVzdCBiZSB1c2VkIGluIHRoZSBzZWNvbmQgcmVxdWVzdC5cbiAgICAgKi9cbiAgICBSZWFzb25QaHJhc2VzW1wiVEVNUE9SQVJZX1JFRElSRUNUXCJdID0gXCJUZW1wb3JhcnkgUmVkaXJlY3RcIjtcbiAgICAvKipcbiAgICAgKiBPZmZpY2lhbCBEb2N1bWVudGF0aW9uIEAgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzY1ODUjc2VjdGlvbi00XG4gICAgICpcbiAgICAgKiBUaGUgdXNlciBoYXMgc2VudCB0b28gbWFueSByZXF1ZXN0cyBpbiBhIGdpdmVuIGFtb3VudCBvZiB0aW1lIChcInJhdGUgbGltaXRpbmdcIikuXG4gICAgICovXG4gICAgUmVhc29uUGhyYXNlc1tcIlRPT19NQU5ZX1JFUVVFU1RTXCJdID0gXCJUb28gTWFueSBSZXF1ZXN0c1wiO1xuICAgIC8qKlxuICAgICAqIE9mZmljaWFsIERvY3VtZW50YXRpb24gQCBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzNSNzZWN0aW9uLTMuMVxuICAgICAqXG4gICAgICogQWx0aG91Z2ggdGhlIEhUVFAgc3RhbmRhcmQgc3BlY2lmaWVzIFwidW5hdXRob3JpemVkXCIsIHNlbWFudGljYWxseSB0aGlzIHJlc3BvbnNlIG1lYW5zIFwidW5hdXRoZW50aWNhdGVkXCIuIFRoYXQgaXMsIHRoZSBjbGllbnQgbXVzdCBhdXRoZW50aWNhdGUgaXRzZWxmIHRvIGdldCB0aGUgcmVxdWVzdGVkIHJlc3BvbnNlLlxuICAgICAqL1xuICAgIFJlYXNvblBocmFzZXNbXCJVTkFVVEhPUklaRURcIl0gPSBcIlVuYXV0aG9yaXplZFwiO1xuICAgIC8qKlxuICAgICAqIE9mZmljaWFsIERvY3VtZW50YXRpb24gQCBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzcyNVxuICAgICAqXG4gICAgICogVGhlIHVzZXItYWdlbnQgcmVxdWVzdGVkIGEgcmVzb3VyY2UgdGhhdCBjYW5ub3QgbGVnYWxseSBiZSBwcm92aWRlZCwgc3VjaCBhcyBhIHdlYiBwYWdlIGNlbnNvcmVkIGJ5IGEgZ292ZXJubWVudC5cbiAgICAgKi9cbiAgICBSZWFzb25QaHJhc2VzW1wiVU5BVkFJTEFCTEVfRk9SX0xFR0FMX1JFQVNPTlNcIl0gPSBcIlVuYXZhaWxhYmxlIEZvciBMZWdhbCBSZWFzb25zXCI7XG4gICAgLyoqXG4gICAgICogT2ZmaWNpYWwgRG9jdW1lbnRhdGlvbiBAIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMyNTE4I3NlY3Rpb24tMTAuM1xuICAgICAqXG4gICAgICogVGhlIHJlcXVlc3Qgd2FzIHdlbGwtZm9ybWVkIGJ1dCB3YXMgdW5hYmxlIHRvIGJlIGZvbGxvd2VkIGR1ZSB0byBzZW1hbnRpYyBlcnJvcnMuXG4gICAgICovXG4gICAgUmVhc29uUGhyYXNlc1tcIlVOUFJPQ0VTU0FCTEVfRU5USVRZXCJdID0gXCJVbnByb2Nlc3NhYmxlIEVudGl0eVwiO1xuICAgIC8qKlxuICAgICAqIE9mZmljaWFsIERvY3VtZW50YXRpb24gQCBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMSNzZWN0aW9uLTYuNS4xM1xuICAgICAqXG4gICAgICogVGhlIG1lZGlhIGZvcm1hdCBvZiB0aGUgcmVxdWVzdGVkIGRhdGEgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgc2VydmVyLCBzbyB0aGUgc2VydmVyIGlzIHJlamVjdGluZyB0aGUgcmVxdWVzdC5cbiAgICAgKi9cbiAgICBSZWFzb25QaHJhc2VzW1wiVU5TVVBQT1JURURfTUVESUFfVFlQRVwiXSA9IFwiVW5zdXBwb3J0ZWQgTWVkaWEgVHlwZVwiO1xuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICogT2ZmaWNpYWwgRG9jdW1lbnRhdGlvbiBAIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMxI3NlY3Rpb24tNi40LjZcbiAgICAgKlxuICAgICAqIFdhcyBkZWZpbmVkIGluIGEgcHJldmlvdXMgdmVyc2lvbiBvZiB0aGUgSFRUUCBzcGVjaWZpY2F0aW9uIHRvIGluZGljYXRlIHRoYXQgYSByZXF1ZXN0ZWQgcmVzcG9uc2UgbXVzdCBiZSBhY2Nlc3NlZCBieSBhIHByb3h5LiBJdCBoYXMgYmVlbiBkZXByZWNhdGVkIGR1ZSB0byBzZWN1cml0eSBjb25jZXJucyByZWdhcmRpbmcgaW4tYmFuZCBjb25maWd1cmF0aW9uIG9mIGEgcHJveHkuXG4gICAgICovXG4gICAgUmVhc29uUGhyYXNlc1tcIlVTRV9QUk9YWVwiXSA9IFwiVXNlIFByb3h5XCI7XG4gICAgLyoqXG4gICAgICogT2ZmaWNpYWwgRG9jdW1lbnRhdGlvbiBAIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjNzU0MCNzZWN0aW9uLTkuMS4yXG4gICAgICpcbiAgICAgKiBEZWZpbmVkIGluIHRoZSBzcGVjaWZpY2F0aW9uIG9mIEhUVFAvMiB0byBpbmRpY2F0ZSB0aGF0IGEgc2VydmVyIGlzIG5vdCBhYmxlIHRvIHByb2R1Y2UgYSByZXNwb25zZSBmb3IgdGhlIGNvbWJpbmF0aW9uIG9mIHNjaGVtZSBhbmQgYXV0aG9yaXR5IHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoZSByZXF1ZXN0IFVSSS5cbiAgICAgKi9cbiAgICBSZWFzb25QaHJhc2VzW1wiTUlTRElSRUNURURfUkVRVUVTVFwiXSA9IFwiTWlzZGlyZWN0ZWQgUmVxdWVzdFwiO1xufSkoUmVhc29uUGhyYXNlcyA9IGV4cG9ydHMuUmVhc29uUGhyYXNlcyB8fCAoZXhwb3J0cy5SZWFzb25QaHJhc2VzID0ge30pKTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2Fzc2lnbiA9ICh0aGlzICYmIHRoaXMuX19hc3NpZ24pIHx8IGZ1bmN0aW9uICgpIHtcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24odCkge1xuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpXG4gICAgICAgICAgICAgICAgdFtwXSA9IHNbcF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgfTtcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn07XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfSk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fZXhwb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19leHBvcnRTdGFyKSB8fCBmdW5jdGlvbihtLCBleHBvcnRzKSB7XG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIWV4cG9ydHMuaGFzT3duUHJvcGVydHkocCkpIF9fY3JlYXRlQmluZGluZyhleHBvcnRzLCBtLCBwKTtcbn07XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgbGVnYWN5XzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vbGVnYWN5XCIpKTtcbnZhciB1dGlsc19mdW5jdGlvbnNfMSA9IHJlcXVpcmUoXCIuL3V0aWxzLWZ1bmN0aW9uc1wiKTtcbnZhciB1dGlsc19mdW5jdGlvbnNfMiA9IHJlcXVpcmUoXCIuL3V0aWxzLWZ1bmN0aW9uc1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImdldFN0YXR1c0NvZGVcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHV0aWxzX2Z1bmN0aW9uc18yLmdldFN0YXR1c0NvZGU7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJnZXRSZWFzb25QaHJhc2VcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHV0aWxzX2Z1bmN0aW9uc18yLmdldFJlYXNvblBocmFzZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImdldFN0YXR1c1RleHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHV0aWxzX2Z1bmN0aW9uc18yLmdldFN0YXR1c1RleHQ7IH0gfSk7XG52YXIgc3RhdHVzX2NvZGVzXzEgPSByZXF1aXJlKFwiLi9zdGF0dXMtY29kZXNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJTdGF0dXNDb2Rlc1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gc3RhdHVzX2NvZGVzXzEuU3RhdHVzQ29kZXM7IH0gfSk7XG52YXIgcmVhc29uX3BocmFzZXNfMSA9IHJlcXVpcmUoXCIuL3JlYXNvbi1waHJhc2VzXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUmVhc29uUGhyYXNlc1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gcmVhc29uX3BocmFzZXNfMS5SZWFzb25QaHJhc2VzOyB9IH0pO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL2xlZ2FjeVwiKSwgZXhwb3J0cyk7XG5leHBvcnRzLmRlZmF1bHQgPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgbGVnYWN5XzEuZGVmYXVsdCksIHsgZ2V0U3RhdHVzQ29kZTogdXRpbHNfZnVuY3Rpb25zXzEuZ2V0U3RhdHVzQ29kZSxcbiAgICBnZXRTdGF0dXNUZXh0OiB1dGlsc19mdW5jdGlvbnNfMS5nZXRTdGF0dXNUZXh0IH0pO1xuIiwgIi8qXG4gKiBFbGFzdGljIExpY2Vuc2UgMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiB3b3JrdGlmLnJ1bnRpbWUuY2RrIDx3b3JrdGlmX3J1bnRpbWVfY2RrPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBFbGFzdGljIExpY2Vuc2UgMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9saWNlbnNpbmcvZWxhc3RpYy1saWNlbnNlIGZvciBkZXRhaWxzLlxuICpcbiAqIFJlLWxpY2Vuc2luZyBub3RpY2U6XG4gKiAgIFRoaXMgZmlsZSB3YXMgcHJldmlvdXNseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgQnVzaW5lc3MgU291cmNlIExpY2Vuc2UgMS4xIChCVVNMLTEuMSkuXG4gKiAgIEFzIG9mIDIwMjUtMDktMjIsIGl0IGlzIHJlLWxpY2Vuc2VkIHVuZGVyIEVsYXN0aWMgTGljZW5zZSAyLjAuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVsYXN0aWMtMi4wXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9saWInO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscyc7XG4iLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IHdvcmt0aWYucnVudGltZS5jZGsgPHdvcmt0aWZfcnVudGltZV9jZGs+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0yMiwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBDb21wb25lbnQsIEVycm9ySW5mbywgUmVhY3ROb2RlIH0gZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQgeyByb3V0ZVBhdGggfSBmcm9tICcuLi8uLi9ydW50aW1lLnJvdXRlcic7XG5cbi8qKlxuICogUHJvcHMgZm9yIHRoZSBFcnJvckJvdW5kYXJ5IGNvbXBvbmVudFxuICovXG5pbnRlcmZhY2UgRXJyb3JCb3VuZGFyeVByb3BzIHtcbiAgY2hpbGRyZW46IFJlYWN0Tm9kZTtcbiAgZmFsbGJhY2s/OiBSZWFjdE5vZGU7XG4gIG9uRXJyb3I/OiAoZXJyb3I6IEVycm9yLCBlcnJvckluZm86IEVycm9ySW5mbykgPT4gdm9pZDtcbn1cblxuLyoqXG4gKiBTdGF0ZSBmb3IgdGhlIEVycm9yQm91bmRhcnkgY29tcG9uZW50XG4gKi9cbmludGVyZmFjZSBFcnJvckJvdW5kYXJ5U3RhdGUge1xuICBoYXNFcnJvcjogYm9vbGVhbjtcbiAgZXJyb3I6IEVycm9yIHwgbnVsbDtcbiAgZXJyb3JJbmZvOiBFcnJvckluZm8gfCBudWxsO1xuICByZWRpcmVjdFRpbWVyOiBudW1iZXI7XG59XG5cbi8qKlxuICogRXJyb3JCb3VuZGFyeSBjb21wb25lbnQgdGhhdCBjYXRjaGVzIEphdmFTY3JpcHQgZXJyb3JzIGFueXdoZXJlIGluIHRoZSBjaGlsZCBjb21wb25lbnQgdHJlZSxcbiAqIGxvZ3MgdGhvc2UgZXJyb3JzLCBhbmQgZGlzcGxheXMgYSBmYWxsYmFjayBVSSBpbnN0ZWFkIG9mIHRoZSBjb21wb25lbnQgdHJlZSB0aGF0IGNyYXNoZWQuXG4gKlxuICogRmVhdHVyZXM6XG4gKiAtIEdyYWNlZnVsIGVycm9yIGhhbmRsaW5nIHdpdGggdXNlci1mcmllbmRseSBtZXNzYWdlc1xuICogLSBQcm9kdWN0aW9uIHZzIGRldmVsb3BtZW50IGVycm9yIGRpc3BsYXlcbiAqIC0gQXV0b21hdGljIHJlZGlyZWN0IHRvIGhvbWVwYWdlIGFmdGVyIHRpbWVvdXRcbiAqIC0gSW50ZWdyYXRpb24gd2l0aCBsb2dnaW5nIHN5c3RlbVxuICogLSBNYW51YWwgZXJyb3IgcmVjb3Zlcnkgb3B0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBFcnJvckJvdW5kYXJ5IGV4dGVuZHMgQ29tcG9uZW50PEVycm9yQm91bmRhcnlQcm9wcywgRXJyb3JCb3VuZGFyeVN0YXRlPiB7XG4gIHByaXZhdGUgcmVkaXJlY3RJbnRlcnZhbD86IE5vZGVKUy5UaW1lb3V0O1xuICBwcml2YXRlIHJlYWRvbmx5IFJFRElSRUNUX1RJTUVPVVQgPSAxMDsgLy8gc2Vjb25kc1xuICBwcml2YXRlIHJlYWRvbmx5IGlzUHJvZHVjdGlvbiA9IHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnID8gcHJvY2Vzcy5lbnYuUFVSRV9FTlZfU1RBR0UgPT09ICdwcm9kJyA6IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBFcnJvckJvdW5kYXJ5UHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGhhc0Vycm9yOiBmYWxzZSxcbiAgICAgIGVycm9yOiBudWxsLFxuICAgICAgZXJyb3JJbmZvOiBudWxsLFxuICAgICAgcmVkaXJlY3RUaW1lcjogdGhpcy5SRURJUkVDVF9USU1FT1VULFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogU3RhdGljIG1ldGhvZCBjYWxsZWQgd2hlbiBhbiBlcnJvciBpcyB0aHJvd24gaW4gYSBjaGlsZCBjb21wb25lbnQuXG4gICAqIFVwZGF0ZXMgc3RhdGUgdG8gdHJpZ2dlciBlcnJvciBVSSByZW5kZXJpbmcuXG4gICAqL1xuICBzdGF0aWMgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yKGVycm9yOiBFcnJvcik6IFBhcnRpYWw8RXJyb3JCb3VuZGFyeVN0YXRlPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGhhc0Vycm9yOiB0cnVlLFxuICAgICAgZXJyb3IsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaWZlY3ljbGUgbWV0aG9kIGNhbGxlZCBhZnRlciBhbiBlcnJvciBoYXMgYmVlbiB0aHJvd24gYnkgYSBkZXNjZW5kYW50IGNvbXBvbmVudC5cbiAgICogVXNlZCBmb3IgbG9nZ2luZyBlcnJvciBpbmZvcm1hdGlvbi5cbiAgICovXG4gIGNvbXBvbmVudERpZENhdGNoKGVycm9yOiBFcnJvciwgZXJyb3JJbmZvOiBFcnJvckluZm8pOiB2b2lkIHtcbiAgICAvLyBMb2cgZXJyb3IgZGV0YWlsc1xuICAgIGNvbnNvbGUuZ3JvdXAoJ1tFcnJvckJvdW5kYXJ5XSBFcnJvciBjYXVnaHQnKTtcbiAgICBjb25zb2xlLmVycm9yKCdFcnJvcjonLCBlcnJvcik7XG4gICAgY29uc29sZS5lcnJvcignRXJyb3IgSW5mbzonLCBlcnJvckluZm8pO1xuICAgIGNvbnNvbGUuZXJyb3IoJ0NvbXBvbmVudCBTdGFjazonLCBlcnJvckluZm8uY29tcG9uZW50U3RhY2spO1xuICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcblxuICAgIC8vIFVwZGF0ZSBzdGF0ZSB3aXRoIGVycm9yIGluZm9cbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIGVycm9ySW5mbyxcbiAgICB9KTtcblxuICAgIC8vIENhbGwgY3VzdG9tIGVycm9yIGhhbmRsZXIgaWYgcHJvdmlkZWRcbiAgICBpZiAodGhpcy5wcm9wcy5vbkVycm9yKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLnByb3BzLm9uRXJyb3IoZXJyb3IsIGVycm9ySW5mbyk7XG4gICAgICB9IGNhdGNoIChoYW5kbGVyRXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignW0Vycm9yQm91bmRhcnldIEVycm9yIGluIGN1c3RvbSBlcnJvciBoYW5kbGVyOicsIGhhbmRsZXJFcnJvcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU3RhcnQgcmVkaXJlY3QgY291bnRkb3duXG4gICAgdGhpcy5zdGFydFJlZGlyZWN0Q291bnRkb3duKCk7XG4gIH1cblxuICAvKipcbiAgICogU3RhcnRzIHRoZSBjb3VudGRvd24gdGltZXIgZm9yIGF1dG9tYXRpYyByZWRpcmVjdCB0byBob21lcGFnZVxuICAgKi9cbiAgcHJpdmF0ZSBzdGFydFJlZGlyZWN0Q291bnRkb3duKCk6IHZvaWQge1xuICAgIHRoaXMucmVkaXJlY3RJbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoKHByZXZTdGF0ZSkgPT4ge1xuICAgICAgICBjb25zdCBuZXdUaW1lciA9IHByZXZTdGF0ZS5yZWRpcmVjdFRpbWVyIC0gMTtcblxuICAgICAgICBpZiAobmV3VGltZXIgPD0gMCkge1xuICAgICAgICAgIHRoaXMuY2xlYXJSZWRpcmVjdEludGVydmFsKCk7XG4gICAgICAgICAgdGhpcy5yZWRpcmVjdFRvSG9tZSgpO1xuICAgICAgICAgIHJldHVybiB7IHJlZGlyZWN0VGltZXI6IDAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IHJlZGlyZWN0VGltZXI6IG5ld1RpbWVyIH07XG4gICAgICB9KTtcbiAgICB9LCAxMDAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgdGhlIHJlZGlyZWN0IGludGVydmFsIHRpbWVyXG4gICAqL1xuICBwcml2YXRlIGNsZWFyUmVkaXJlY3RJbnRlcnZhbCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yZWRpcmVjdEludGVydmFsKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMucmVkaXJlY3RJbnRlcnZhbCk7XG4gICAgICB0aGlzLnJlZGlyZWN0SW50ZXJ2YWwgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlZGlyZWN0cyB0byB0aGUgaG9tZXBhZ2VcbiAgICovXG4gIHByaXZhdGUgcmVkaXJlY3RUb0hvbWUoKTogdm9pZCB7XG4gICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSByb3V0ZVBhdGgoWycvJ10pO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0dGVtcHRzIHRvIHJlY292ZXIgZnJvbSB0aGUgZXJyb3IgYnkgcmVzZXR0aW5nIHN0YXRlXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZVJlc2V0ID0gKCk6IHZvaWQgPT4ge1xuICAgIHRoaXMuY2xlYXJSZWRpcmVjdEludGVydmFsKCk7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBoYXNFcnJvcjogZmFsc2UsXG4gICAgICBlcnJvcjogbnVsbCxcbiAgICAgIGVycm9ySW5mbzogbnVsbCxcbiAgICAgIHJlZGlyZWN0VGltZXI6IHRoaXMuUkVESVJFQ1RfVElNRU9VVCxcbiAgICB9KTtcbiAgfTtcblxuICAvKipcbiAgICogQ2xlYW51cCBvbiBjb21wb25lbnQgdW5tb3VudFxuICAgKi9cbiAgY29tcG9uZW50V2lsbFVubW91bnQoKTogdm9pZCB7XG4gICAgdGhpcy5jbGVhclJlZGlyZWN0SW50ZXJ2YWwoKTtcbiAgfVxuXG4gIHJlbmRlcigpOiBSZWFjdE5vZGUge1xuICAgIGlmICh0aGlzLnN0YXRlLmhhc0Vycm9yKSB7XG4gICAgICAvLyBVc2UgY3VzdG9tIGZhbGxiYWNrIGlmIHByb3ZpZGVkXG4gICAgICBpZiAodGhpcy5wcm9wcy5mYWxsYmFjaykge1xuICAgICAgICByZXR1cm4gdGhpcy5wcm9wcy5mYWxsYmFjaztcbiAgICAgIH1cblxuICAgICAgLy8gRGVmYXVsdCBlcnJvciBVSSB3aXRoIGlubGluZSBzdHlsZXNcbiAgICAgIGNvbnN0IHN0eWxlcyA9IHtcbiAgICAgICAgY29udGFpbmVyOiB7XG4gICAgICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgICAgIGp1c3RpZnlDb250ZW50OiAnY2VudGVyJyxcbiAgICAgICAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICAgICAgICBtaW5IZWlnaHQ6ICcxMDB2aCcsXG4gICAgICAgICAgcGFkZGluZzogJzIwcHgnLFxuICAgICAgICAgIGZvbnRGYW1pbHk6ICctYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsIFwiU2Vnb2UgVUlcIiwgUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIEFyaWFsLCBzYW5zLXNlcmlmJyxcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICcjZjVmNWY1JyxcbiAgICAgICAgfSBhcyBSZWFjdC5DU1NQcm9wZXJ0aWVzLFxuICAgICAgICBjb250ZW50OiB7XG4gICAgICAgICAgbWF4V2lkdGg6ICc4MDBweCcsXG4gICAgICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICcjZmZmZmZmJyxcbiAgICAgICAgICBib3JkZXJSYWRpdXM6ICc4cHgnLFxuICAgICAgICAgIHBhZGRpbmc6ICc0MHB4JyxcbiAgICAgICAgICBib3hTaGFkb3c6ICcwIDJweCA4cHggcmdiYSgwLCAwLCAwLCAwLjEpJyxcbiAgICAgICAgfSBhcyBSZWFjdC5DU1NQcm9wZXJ0aWVzLFxuICAgICAgICBoZWFkaW5nOiB7XG4gICAgICAgICAgZm9udFNpemU6ICcycmVtJyxcbiAgICAgICAgICBmb250V2VpZ2h0OiA2MDAsXG4gICAgICAgICAgdGV4dEFsaWduOiAnY2VudGVyJyBhcyBjb25zdCxcbiAgICAgICAgICBtYXJnaW5Cb3R0b206ICcyMHB4JyxcbiAgICAgICAgICBjb2xvcjogJyMzMzMnLFxuICAgICAgICB9IGFzIFJlYWN0LkNTU1Byb3BlcnRpZXMsXG4gICAgICAgIGVycm9yQm94OiB7XG4gICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAnI2Y1ZjVmNScsXG4gICAgICAgICAgcGFkZGluZzogJzE2cHgnLFxuICAgICAgICAgIGJvcmRlclJhZGl1czogJzRweCcsXG4gICAgICAgICAgbWFyZ2luQm90dG9tOiAnMjBweCcsXG4gICAgICAgICAgYm9yZGVyOiAnMXB4IHNvbGlkICNlMGUwZTAnLFxuICAgICAgICB9IGFzIFJlYWN0LkNTU1Byb3BlcnRpZXMsXG4gICAgICAgIGVycm9yVGl0bGU6IHtcbiAgICAgICAgICBmb250U2l6ZTogJzEuMTI1cmVtJyxcbiAgICAgICAgICBmb250V2VpZ2h0OiA2MDAsXG4gICAgICAgICAgY29sb3I6ICcjZDMyZjJmJyxcbiAgICAgICAgICBtYXJnaW5Cb3R0b206ICcxMnB4JyxcbiAgICAgICAgfSBhcyBSZWFjdC5DU1NQcm9wZXJ0aWVzLFxuICAgICAgICBlcnJvclRleHQ6IHtcbiAgICAgICAgICB3aGl0ZVNwYWNlOiAncHJlLXdyYXAnIGFzIGNvbnN0LFxuICAgICAgICAgIHdvcmRCcmVhazogJ2JyZWFrLXdvcmQnIGFzIGNvbnN0LFxuICAgICAgICAgIGZvbnRGYW1pbHk6ICdtb25vc3BhY2UnLFxuICAgICAgICAgIGZvbnRTaXplOiAnMC44NzVyZW0nLFxuICAgICAgICAgIGNvbG9yOiAnIzY2NicsXG4gICAgICAgICAgbWF4SGVpZ2h0OiAnMjAwcHgnLFxuICAgICAgICAgIG92ZXJmbG93OiAnYXV0bycsXG4gICAgICAgICAgbWFyZ2luOiAwLFxuICAgICAgICB9IGFzIFJlYWN0LkNTU1Byb3BlcnRpZXMsXG4gICAgICAgIG1lc3NhZ2U6IHtcbiAgICAgICAgICBmb250U2l6ZTogJzFyZW0nLFxuICAgICAgICAgIHRleHRBbGlnbjogJ2NlbnRlcicgYXMgY29uc3QsXG4gICAgICAgICAgbWFyZ2luQm90dG9tOiAnMTZweCcsXG4gICAgICAgICAgY29sb3I6ICcjNjY2JyxcbiAgICAgICAgfSBhcyBSZWFjdC5DU1NQcm9wZXJ0aWVzLFxuICAgICAgICB0aW1lcjoge1xuICAgICAgICAgIGZvbnRTaXplOiAnMXJlbScsXG4gICAgICAgICAgdGV4dEFsaWduOiAnY2VudGVyJyBhcyBjb25zdCxcbiAgICAgICAgICBtYXJnaW5Cb3R0b206ICcyNHB4JyxcbiAgICAgICAgICBjb2xvcjogJyM5OTknLFxuICAgICAgICB9IGFzIFJlYWN0LkNTU1Byb3BlcnRpZXMsXG4gICAgICAgIGJ1dHRvbkNvbnRhaW5lcjoge1xuICAgICAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgICAgICBqdXN0aWZ5Q29udGVudDogJ2NlbnRlcicsXG4gICAgICAgICAgZ2FwOiAnMTZweCcsXG4gICAgICAgICAgZmxleFdyYXA6ICd3cmFwJyBhcyBjb25zdCxcbiAgICAgICAgfSBhcyBSZWFjdC5DU1NQcm9wZXJ0aWVzLFxuICAgICAgICBidXR0b246IHtcbiAgICAgICAgICBwYWRkaW5nOiAnMTJweCAyNHB4JyxcbiAgICAgICAgICBmb250U2l6ZTogJzFyZW0nLFxuICAgICAgICAgIGZvbnRXZWlnaHQ6IDUwMCxcbiAgICAgICAgICBib3JkZXJSYWRpdXM6ICc0cHgnLFxuICAgICAgICAgIGJvcmRlcjogJ25vbmUnLFxuICAgICAgICAgIGN1cnNvcjogJ3BvaW50ZXInLFxuICAgICAgICAgIHRleHREZWNvcmF0aW9uOiAnbm9uZScsXG4gICAgICAgICAgZGlzcGxheTogJ2lubGluZS1ibG9jaycsXG4gICAgICAgICAgdHJhbnNpdGlvbjogJ2JhY2tncm91bmQtY29sb3IgMC4ycycsXG4gICAgICAgIH0gYXMgUmVhY3QuQ1NTUHJvcGVydGllcyxcbiAgICAgICAgcHJpbWFyeUJ1dHRvbjoge1xuICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJyMxOTc2ZDInLFxuICAgICAgICAgIGNvbG9yOiAnI2ZmZmZmZicsXG4gICAgICAgIH0gYXMgUmVhY3QuQ1NTUHJvcGVydGllcyxcbiAgICAgICAgc2Vjb25kYXJ5QnV0dG9uOiB7XG4gICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAnI2ZmZmZmZicsXG4gICAgICAgICAgY29sb3I6ICcjMTk3NmQyJyxcbiAgICAgICAgICBib3JkZXI6ICcxcHggc29saWQgIzE5NzZkMicsXG4gICAgICAgIH0gYXMgUmVhY3QuQ1NTUHJvcGVydGllcyxcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxkaXYgc3R5bGU9e3N0eWxlcy5jb250YWluZXJ9PlxuICAgICAgICAgIDxkaXYgc3R5bGU9e3N0eWxlcy5jb250ZW50fT5cbiAgICAgICAgICAgIDxoMSBzdHlsZT17c3R5bGVzLmhlYWRpbmd9PlxuICAgICAgICAgICAgICB7dGhpcy5pc1Byb2R1Y3Rpb25cbiAgICAgICAgICAgICAgICA/ICdTb21ldGhpbmcgd2VudCB3cm9uZydcbiAgICAgICAgICAgICAgICA6ICdBbiBlcnJvciBvY2N1cnJlZCd9XG4gICAgICAgICAgICA8L2gxPlxuXG4gICAgICAgICAgICB7LyogU2hvdyBlcnJvciBkZXRhaWxzIGluIGRldmVsb3BtZW50ICovfVxuICAgICAgICAgICAgeyF0aGlzLmlzUHJvZHVjdGlvbiAmJiB0aGlzLnN0YXRlLmVycm9yICYmIChcbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT17c3R5bGVzLmVycm9yQm94fT5cbiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXtzdHlsZXMuZXJyb3JUaXRsZX0+RXJyb3IgRGV0YWlsczo8L2Rpdj5cbiAgICAgICAgICAgICAgICA8cHJlIHN0eWxlPXtzdHlsZXMuZXJyb3JUZXh0fT5cbiAgICAgICAgICAgICAgICAgIHt0aGlzLnN0YXRlLmVycm9yLnRvU3RyaW5nKCl9XG4gICAgICAgICAgICAgICAgPC9wcmU+XG4gICAgICAgICAgICAgICAge3RoaXMuc3RhdGUuZXJyb3JJbmZvICYmIChcbiAgICAgICAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3sgLi4uc3R5bGVzLmVycm9yVGl0bGUsIG1hcmdpblRvcDogJzE2cHgnIH19PlxuICAgICAgICAgICAgICAgICAgICAgIENvbXBvbmVudCBTdGFjazpcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxwcmUgc3R5bGU9e3N0eWxlcy5lcnJvclRleHR9PlxuICAgICAgICAgICAgICAgICAgICAgIHt0aGlzLnN0YXRlLmVycm9ySW5mby5jb21wb25lbnRTdGFja31cbiAgICAgICAgICAgICAgICAgICAgPC9wcmU+XG4gICAgICAgICAgICAgICAgICA8Lz5cbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICl9XG5cbiAgICAgICAgICAgIDxwIHN0eWxlPXtzdHlsZXMubWVzc2FnZX0+XG4gICAgICAgICAgICAgIHt0aGlzLmlzUHJvZHVjdGlvblxuICAgICAgICAgICAgICAgID8gJ1dlXFwncmUgc29ycnkgZm9yIHRoZSBpbmNvbnZlbmllbmNlLiBQbGVhc2UgdHJ5IGFnYWluLidcbiAgICAgICAgICAgICAgICA6ICdDaGVjayB0aGUgY29uc29sZSBmb3IgbW9yZSBkZXRhaWxzLid9XG4gICAgICAgICAgICA8L3A+XG5cbiAgICAgICAgICAgIHt0aGlzLnN0YXRlLnJlZGlyZWN0VGltZXIgPiAwICYmIChcbiAgICAgICAgICAgICAgPHAgc3R5bGU9e3N0eWxlcy50aW1lcn0+XG4gICAgICAgICAgICAgICAge2BSZWRpcmVjdGluZyB0byBob21lcGFnZSBpbiAke3RoaXMuc3RhdGUucmVkaXJlY3RUaW1lcn0gc2Vjb25kc2B9XG4gICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICl9XG5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9e3N0eWxlcy5idXR0b25Db250YWluZXJ9PlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgc3R5bGU9e3sgLi4uc3R5bGVzLmJ1dHRvbiwgLi4uc3R5bGVzLnByaW1hcnlCdXR0b24gfX1cbiAgICAgICAgICAgICAgICBvbkNsaWNrPXt0aGlzLmhhbmRsZVJlc2V0fVxuICAgICAgICAgICAgICAgIG9uTW91c2VPdmVyPXsoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgZS5jdXJyZW50VGFyZ2V0LnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICcjMTU2NWMwJztcbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgIG9uTW91c2VPdXQ9eyhlKSA9PiB7XG4gICAgICAgICAgICAgICAgICBlLmN1cnJlbnRUYXJnZXQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJyMxOTc2ZDInO1xuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBUcnkgQWdhaW5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgc3R5bGU9e3sgLi4uc3R5bGVzLmJ1dHRvbiwgLi4uc3R5bGVzLnNlY29uZGFyeUJ1dHRvbiB9fVxuICAgICAgICAgICAgICAgIGhyZWY9e3JvdXRlUGF0aChbJy8nXSl9XG4gICAgICAgICAgICAgICAgb25Nb3VzZU92ZXI9eyhlKSA9PiB7XG4gICAgICAgICAgICAgICAgICBlLmN1cnJlbnRUYXJnZXQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJyNmNWY1ZjUnO1xuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgb25Nb3VzZU91dD17KGUpID0+IHtcbiAgICAgICAgICAgICAgICAgIGUuY3VycmVudFRhcmdldC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAnI2ZmZmZmZic7XG4gICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIEdvIHRvIEhvbWVwYWdlXG4gICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucHJvcHMuY2hpbGRyZW47XG4gIH1cbn1cblxuLyoqXG4gKiBMZWdhY3kgZnVuY3Rpb25hbCBjb21wb25lbnQgZm9yIDQwNCBlcnJvcnMgKGtlcHQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkpXG4gKiBUaGlzIGlzIHVzZWQgc3BlY2lmaWNhbGx5IGZvciByb3V0ZSBub3QgZm91bmQgZXJyb3JzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gRXJyb3JCb3VuZGFyeU5vdEZvdW5kKCkge1xuICBjb25zdCB0aW1lb3V0U3VjY2VzcyA9IDEwO1xuICBjb25zdCBbcmVkaXJlY3RUaW1lciwgc2V0UmVkaXJlY3RUaW1lcl0gPSBSZWFjdC51c2VTdGF0ZSh0aW1lb3V0U3VjY2Vzcyk7XG5cbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAocmVkaXJlY3RUaW1lciA+IDApIHtcbiAgICAgIGNvbnN0IGNvdW50ZG93biA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgc2V0UmVkaXJlY3RUaW1lcigocHJldikgPT4gcHJldiAtIDEpO1xuICAgICAgfSwgMTAwMCk7XG4gICAgICByZXR1cm4gKCkgPT4gY2xlYXJJbnRlcnZhbChjb3VudGRvd24pO1xuICAgIH0gZWxzZSB7XG4gICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHJvdXRlUGF0aChbJy8nXSk7XG4gICAgfVxuICB9LCBbcmVkaXJlY3RUaW1lcl0pO1xuXG4gIGNvbnN0IHN0eWxlcyA9IHtcbiAgICBjb250YWluZXI6IHtcbiAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgIGp1c3RpZnlDb250ZW50OiAnY2VudGVyJyxcbiAgICAgIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICAgICAgbWluSGVpZ2h0OiAnMTAwdmgnLFxuICAgICAgcGFkZGluZzogJzIwcHgnLFxuICAgICAgZm9udEZhbWlseTogJy1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgXCJTZWdvZSBVSVwiLCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgQXJpYWwsIHNhbnMtc2VyaWYnLFxuICAgICAgYmFja2dyb3VuZENvbG9yOiAnI2Y1ZjVmNScsXG4gICAgfSBhcyBSZWFjdC5DU1NQcm9wZXJ0aWVzLFxuICAgIGNvbnRlbnQ6IHtcbiAgICAgIG1heFdpZHRoOiAnODAwcHgnLFxuICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgIGJhY2tncm91bmRDb2xvcjogJyNmZmZmZmYnLFxuICAgICAgYm9yZGVyUmFkaXVzOiAnOHB4JyxcbiAgICAgIHBhZGRpbmc6ICc0MHB4JyxcbiAgICAgIGJveFNoYWRvdzogJzAgMnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMSknLFxuICAgICAgdGV4dEFsaWduOiAnY2VudGVyJyBhcyBjb25zdCxcbiAgICB9IGFzIFJlYWN0LkNTU1Byb3BlcnRpZXMsXG4gICAgaGVhZGluZzoge1xuICAgICAgZm9udFNpemU6ICcycmVtJyxcbiAgICAgIGZvbnRXZWlnaHQ6IDYwMCxcbiAgICAgIG1hcmdpbkJvdHRvbTogJzIwcHgnLFxuICAgICAgY29sb3I6ICcjMzMzJyxcbiAgICB9IGFzIFJlYWN0LkNTU1Byb3BlcnRpZXMsXG4gICAgbWVzc2FnZToge1xuICAgICAgZm9udFNpemU6ICcxcmVtJyxcbiAgICAgIG1hcmdpbkJvdHRvbTogJzE2cHgnLFxuICAgICAgY29sb3I6ICcjNjY2JyxcbiAgICB9IGFzIFJlYWN0LkNTU1Byb3BlcnRpZXMsXG4gICAgbGluazoge1xuICAgICAgY29sb3I6ICcjMTk3NmQyJyxcbiAgICAgIHRleHREZWNvcmF0aW9uOiAnbm9uZScsXG4gICAgICBmb250U2l6ZTogJzFyZW0nLFxuICAgICAgZm9udFdlaWdodDogNTAwLFxuICAgIH0gYXMgUmVhY3QuQ1NTUHJvcGVydGllcyxcbiAgfTtcblxuICByZXR1cm4gKFxuICAgIDxkaXYgc3R5bGU9e3N0eWxlcy5jb250YWluZXJ9PlxuICAgICAgPGRpdiBzdHlsZT17c3R5bGVzLmNvbnRlbnR9PlxuICAgICAgICA8aDEgc3R5bGU9e3N0eWxlcy5oZWFkaW5nfT5cbiAgICAgICAgICBXZSBjb3VsZG4ndCBmaW5kIHRoZSBwYWdlIHlvdSB3ZXJlIGxvb2tpbmcgZm9yLlxuICAgICAgICA8L2gxPlxuICAgICAgICA8cCBzdHlsZT17c3R5bGVzLm1lc3NhZ2V9PlxuICAgICAgICAgIHtgV2UnbGwgdGFrZSB5b3UgYmFjayB0byB0aGUgaG9tZXBhZ2UgaW4gJHtyZWRpcmVjdFRpbWVyfSBzZWNvbmRzYH1cbiAgICAgICAgPC9wPlxuICAgICAgICA8cCBzdHlsZT17c3R5bGVzLm1lc3NhZ2V9PlxuICAgICAgICAgIDxhXG4gICAgICAgICAgICBocmVmPXtyb3V0ZVBhdGgoWycvJ10pfVxuICAgICAgICAgICAgc3R5bGU9e3N0eWxlcy5saW5rfVxuICAgICAgICAgICAgb25Nb3VzZU92ZXI9eyhlKSA9PiB7XG4gICAgICAgICAgICAgIGUuY3VycmVudFRhcmdldC5zdHlsZS50ZXh0RGVjb3JhdGlvbiA9ICd1bmRlcmxpbmUnO1xuICAgICAgICAgICAgfX1cbiAgICAgICAgICAgIG9uTW91c2VPdXQ9eyhlKSA9PiB7XG4gICAgICAgICAgICAgIGUuY3VycmVudFRhcmdldC5zdHlsZS50ZXh0RGVjb3JhdGlvbiA9ICdub25lJztcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgPlxuICAgICAgICAgICAgQ2xpY2sgdG8gZ28gdG8gaG9tZXBhZ2VcbiAgICAgICAgICA8L2E+XG4gICAgICAgIDwvcD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICApO1xufVxuIiwgIi8qXG4gKiBFbGFzdGljIExpY2Vuc2UgMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiB3b3JrdGlmLnJ1bnRpbWUuY2RrIDx3b3JrdGlmX3J1bnRpbWVfY2RrPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBFbGFzdGljIExpY2Vuc2UgMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9saWNlbnNpbmcvZWxhc3RpYy1saWNlbnNlIGZvciBkZXRhaWxzLlxuICpcbiAqIFJlLWxpY2Vuc2luZyBub3RpY2U6XG4gKiAgIFRoaXMgZmlsZSB3YXMgcHJldmlvdXNseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgQnVzaW5lc3MgU291cmNlIExpY2Vuc2UgMS4xIChCVVNMLTEuMSkuXG4gKiAgIEFzIG9mIDIwMjUtMDktMjIsIGl0IGlzIHJlLWxpY2Vuc2VkIHVuZGVyIEVsYXN0aWMgTGljZW5zZSAyLjAuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVsYXN0aWMtMi4wXG4gKi9cblxuaW1wb3J0IHsgdXNlTG9hZGVyRGF0YSB9IGZyb20gJ3JlYWN0LXJvdXRlcic7XG5cbmltcG9ydCB7IFJ1bnRpbWVMb2FkZXJSZXN1bHQsIFNlb01ldGEgfSBmcm9tICcuL3J1bnRpbWUucm91dGVyLnR5cGVzJztcblxuLyoqXG4gKiBSZWFjdCBob29rIHRvIGFjY2VzcyBidXNpbmVzcyBkYXRhIGZyb20gdGhlIGN1cnJlbnQgcm91dGUncyBsb2FkZXIuXG4gKiBFeHRyYWN0cyBhbmQgcmV0dXJucyBvbmx5IHRoZSBidXNpbmVzcyBwcm9wZXJ0eSBmcm9tIFJ1bnRpbWVMb2FkZXJSZXN1bHQuXG4gKlxuICogVGhpcyBob29rIHNob3VsZCBiZSBjYWxsZWQgd2l0aGluIGEgcm91dGUgY29tcG9uZW50IHRoYXQgaGFzIGEgbG9hZGVyLlxuICogSXQgcHJvdmlkZXMgdHlwZS1zYWZlIGFjY2VzcyB0byBkYXRhIGxvYWRlZCBieSBydW50aW1lQXN5bmMgcmV0cmlldmVycy5cbiAqXG4gKiBAdGVtcGxhdGUgVCAtIFRoZSBleHBlY3RlZCB0eXBlIG9mIHRoZSBidXNpbmVzcyBkYXRhIChkZWZhdWx0cyB0byBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilcbiAqIEByZXR1cm5zIHtUfSBUaGUgYnVzaW5lc3MgZGF0YSBmcm9tIHRoZSBjdXJyZW50IHJvdXRlJ3MgbG9hZGVyXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgY2FsbGVkIG91dHNpZGUgYSByb3V0ZSBjb250ZXh0IG9yIGlmIGxvYWRlciBkYXRhIGlzIG1pc3NpbmdcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gSW4gYSByb3V0ZSBjb21wb25lbnRcbiAqIGZ1bmN0aW9uIFByb2R1Y3RQYWdlKCkge1xuICogICBjb25zdCB7IHByb2R1Y3QsIHJldmlld3MgfSA9IHVzZVJ1bnRpbWVEYXRhPHsgcHJvZHVjdDogUHJvZHVjdDsgcmV2aWV3czogUmV2aWV3W10gfT4oKTtcbiAqICAgcmV0dXJuIDxkaXY+e3Byb2R1Y3QubmFtZX08L2Rpdj47XG4gKiB9XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFdpdGhvdXQgdHlwZSBwYXJhbWV0ZXIgKGluZmVycmVkIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVxuICogZnVuY3Rpb24gSG9tZVBhZ2UoKSB7XG4gKiAgIGNvbnN0IGRhdGEgPSB1c2VSdW50aW1lRGF0YSgpO1xuICogICByZXR1cm4gPGRpdj57SlNPTi5zdHJpbmdpZnkoZGF0YSl9PC9kaXY+O1xuICogfVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlUnVudGltZURhdGE8VCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+PigpOiBUIHtcbiAgY29uc3QgbG9hZGVyRGF0YSA9IHVzZUxvYWRlckRhdGEoKSBhcyBSdW50aW1lTG9hZGVyUmVzdWx0IHwgdW5kZWZpbmVkO1xuXG4gIC8vIENoZWNrIGZvciB1bmRlZmluZWQgKG91dHNpZGUgcm91dGUgY29udGV4dClcbiAgaWYgKGxvYWRlckRhdGEgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdbUnVudGltZV0gdXNlUnVudGltZURhdGEgbXVzdCBiZSBjYWxsZWQgd2l0aGluIGEgcm91dGUgY29tcG9uZW50IHdpdGggYSBsb2FkZXIuICcgK1xuICAgICAgJ0Vuc3VyZSB0aGUgcm91dGUgaGFzIGEgbG9hZGVyIGZ1bmN0aW9uIG9yIHJ1bnRpbWVBc3luYyByZXRyaWV2ZXJzIGRlZmluZWQuJyxcbiAgICApO1xuICB9XG5cbiAgLy8gVmVyaWZ5IHRoZSBsb2FkZXIgZGF0YSBoYXMgdGhlIGV4cGVjdGVkIHN0cnVjdHVyZSAoY2hlY2sgZm9yIG51bGwgYW5kIG5vbi1vYmplY3QgdHlwZXMpXG4gIGlmICh0eXBlb2YgbG9hZGVyRGF0YSAhPT0gJ29iamVjdCcgfHwgbG9hZGVyRGF0YSA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdbUnVudGltZV0gdXNlUnVudGltZURhdGEgcmVjZWl2ZWQgaW52YWxpZCBsb2FkZXIgZGF0YS4gJyArXG4gICAgICAnRXhwZWN0ZWQgYW4gb2JqZWN0IHdpdGggXCJpbnRlcm5hbFwiIGFuZCBcImJ1c2luZXNzXCIgcHJvcGVydGllcy4nLFxuICAgICk7XG4gIH1cblxuICBpZiAoISgnYnVzaW5lc3MnIGluIGxvYWRlckRhdGEpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ1tSdW50aW1lXSB1c2VSdW50aW1lRGF0YSByZWNlaXZlZCBsb2FkZXIgZGF0YSB3aXRob3V0IFwiYnVzaW5lc3NcIiBwcm9wZXJ0eS4gJyArXG4gICAgICAnVGhpcyBtYXkgaW5kaWNhdGUgdGhlIHJvdXRlIGlzIG5vdCB1c2luZyBhIFJ1bnRpbWUtZ2VuZXJhdGVkIGxvYWRlci4nLFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gbG9hZGVyRGF0YS5idXNpbmVzcyBhcyBUO1xufVxuXG4vKipcbiAqIFJlYWN0IGhvb2sgdG8gYWNjZXNzIFNFTyBtZXRhZGF0YSBmcm9tIHRoZSBjdXJyZW50IHJvdXRlJ3MgbG9hZGVyLlxuICogRXh0cmFjdHMgYW5kIHJldHVybnMgdGhlIHNlb01ldGEgZnJvbSB0aGUgaW50ZXJuYWwgcHJvcGVydHkgb2YgUnVudGltZUxvYWRlclJlc3VsdC5cbiAqXG4gKiBUaGlzIGhvb2sgaXMgcHJpbWFyaWx5IHVzZWQgYnkgdGhlIFJ1bnRpbWVIZWFkTWFuYWdlciBjb21wb25lbnQgdG8gdXBkYXRlXG4gKiBkb2N1bWVudC50aXRsZSBhbmQgbWV0YSB0YWdzIGR1cmluZyBjbGllbnQtc2lkZSBuYXZpZ2F0aW9uLiBJdCBjYW4gYWxzbyBiZVxuICogdXNlZCBieSB1c2VyIGNvbXBvbmVudHMgdGhhdCBuZWVkIGFjY2VzcyB0byBTRU8gbWV0YWRhdGEuXG4gKlxuICogQHJldHVybnMge1Nlb01ldGEgfCB1bmRlZmluZWR9IFRoZSBTRU8gbWV0YWRhdGEgZnJvbSB0aGUgY3VycmVudCByb3V0ZSdzIGxvYWRlciwgb3IgdW5kZWZpbmVkIGlmIG5vdCBhdmFpbGFibGVcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gSW4gdGhlIGhlYWQgbWFuYWdlciBjb21wb25lbnRcbiAqIGZ1bmN0aW9uIFJ1bnRpbWVIZWFkTWFuYWdlcigpIHtcbiAqICAgY29uc3Qgc2VvTWV0YSA9IHVzZVJ1bnRpbWVTZW9NZXRhKCk7XG4gKlxuICogICB1c2VFZmZlY3QoKCkgPT4ge1xuICogICAgIGlmIChzZW9NZXRhPy50aXRsZSkge1xuICogICAgICAgZG9jdW1lbnQudGl0bGUgPSBzZW9NZXRhLnRpdGxlO1xuICogICAgIH1cbiAqICAgfSwgW3Nlb01ldGFdKTtcbiAqXG4gKiAgIHJldHVybiBudWxsO1xuICogfVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBJbiBhIHVzZXIgY29tcG9uZW50IHRoYXQgbmVlZHMgU0VPIGRhdGFcbiAqIGZ1bmN0aW9uIFBhZ2VIZWFkZXIoKSB7XG4gKiAgIGNvbnN0IHNlb01ldGEgPSB1c2VSdW50aW1lU2VvTWV0YSgpO1xuICogICByZXR1cm4gPGgxPntzZW9NZXRhPy50aXRsZSB8fCAnRGVmYXVsdCBUaXRsZSd9PC9oMT47XG4gKiB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VSdW50aW1lU2VvTWV0YSgpOiBTZW9NZXRhIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbG9hZGVyRGF0YSA9IHVzZUxvYWRlckRhdGEoKSBhcyBSdW50aW1lTG9hZGVyUmVzdWx0IHwgdW5kZWZpbmVkO1xuXG4gIC8vIFJldHVybiB1bmRlZmluZWQgaWYgY2FsbGVkIG91dHNpZGUgcm91dGUgY29udGV4dCBvciBpZiBsb2FkZXIgZGF0YSBpcyBtaXNzaW5nXG4gIGlmICghbG9hZGVyRGF0YSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvLyBWZXJpZnkgdGhlIGxvYWRlciBkYXRhIGhhcyB0aGUgZXhwZWN0ZWQgc3RydWN0dXJlXG4gIGlmICh0eXBlb2YgbG9hZGVyRGF0YSAhPT0gJ29iamVjdCcgfHwgbG9hZGVyRGF0YSA9PT0gbnVsbCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBpZiAoISgnaW50ZXJuYWwnIGluIGxvYWRlckRhdGEpKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8vIFJldHVybiB0aGUgc2VvTWV0YSBmcm9tIGludGVybmFsIGRhdGEgKG1heSBiZSB1bmRlZmluZWQpXG4gIHJldHVybiBsb2FkZXJEYXRhLmludGVybmFsPy5zZW9NZXRhO1xufVxuIiwgIi8qXG4gKiBFbGFzdGljIExpY2Vuc2UgMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiB3b3JrdGlmLnJ1bnRpbWUuY2RrIDx3b3JrdGlmX3J1bnRpbWVfY2RrPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBFbGFzdGljIExpY2Vuc2UgMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9saWNlbnNpbmcvZWxhc3RpYy1saWNlbnNlIGZvciBkZXRhaWxzLlxuICpcbiAqIFJlLWxpY2Vuc2luZyBub3RpY2U6XG4gKiAgIFRoaXMgZmlsZSB3YXMgcHJldmlvdXNseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgQnVzaW5lc3MgU291cmNlIExpY2Vuc2UgMS4xIChCVVNMLTEuMSkuXG4gKiAgIEFzIG9mIDIwMjUtMDktMjIsIGl0IGlzIHJlLWxpY2Vuc2VkIHVuZGVyIEVsYXN0aWMgTGljZW5zZSAyLjAuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVsYXN0aWMtMi4wXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBTZW9NZXRhIH0gZnJvbSAnLi9ydW50aW1lLnJvdXRlci50eXBlcyc7XG5cbi8qKlxuICogQmFja2VuZCBTRU8gbWV0YWRhdGEgdHlwZSBmcm9tIHRoZSBBUEkgcmVzcG9uc2UuXG4gKiBUaGlzIG1hdGNoZXMgdGhlIHN0cnVjdHVyZSByZXR1cm5lZCBieSB0aGUgU0VPIGJ5IFJvdXRlIExhbWJkYS5cbiAqL1xudHlwZSBCYWNrZW5kU2VvTWV0YURhdGEgPSB7XG4gIHJvdXRlOiBzdHJpbmc7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIGtleXdvcmRzOiBzdHJpbmdbXTtcbiAgb2dUaXRsZTogc3RyaW5nO1xuICBvZ0Rlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIG9nSW1hZ2U6IHN0cmluZztcbiAgdHdpdHRlclRpdGxlOiBzdHJpbmc7XG4gIHR3aXR0ZXJEZXNjcmlwdGlvbjogc3RyaW5nO1xuICB0d2l0dGVySW1hZ2U6IHN0cmluZztcbiAgY2Fub25pY2FsVXJsOiBzdHJpbmc7XG4gIHJvYm90czogc3RyaW5nO1xufTtcblxuLyoqXG4gKiBDb25zdHJ1Y3RzIHRoZSBTRU8gQVBJIFVSTCBmb3IgYSBnaXZlbiByb3V0ZS5cbiAqIFVzZXMgdGhlIFBVUkVfRU5WX0FQSV9CQVNFX1VSTCBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBidWlsZCB0aGUgZnVsbCBVUkwuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJvdXRlIC0gVGhlIGFwcGxpY2F0aW9uIHJvdXRlIHRvIGZldGNoIFNFTyBtZXRhZGF0YSBmb3JcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBmdWxsIEFQSSBVUkwgd2l0aCBlbmNvZGVkIHJvdXRlIHBhcmFtZXRlclxuICogQHRocm93cyB7RXJyb3J9IElmIFBVUkVfRU5WX0FQSV9CQVNFX1VSTCBpcyBub3QgY29uZmlndXJlZFxuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdHJ1Y3RTZW9BcGlVcmwoJy9hYm91dCcpXG4gKiAvLyBSZXR1cm5zOiAnaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20vc2VvLW1ldGE/cm91dGU9JTJGYWJvdXQnXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0cnVjdFNlb0FwaVVybCgnL3Byb2R1Y3RzLzEyMycpXG4gKiAvLyBSZXR1cm5zOiAnaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20vc2VvLW1ldGE/cm91dGU9JTJGcHJvZHVjdHMlMkYxMjMnXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25zdHJ1Y3RTZW9BcGlVcmwocm91dGU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGFwaUJhc2VVcmwgPSBwcm9jZXNzLmVudi5QVVJFX0VOVl9BUElfQkFTRV9VUkw7XG5cbiAgaWYgKCFhcGlCYXNlVXJsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ1tSdW50aW1lXSBQVVJFX0VOVl9BUElfQkFTRV9VUkwgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbm90IGNvbmZpZ3VyZWQuICcgK1xuICAgICAgJ1BsZWFzZSBzZXQgdGhpcyB2YXJpYWJsZSB0byB5b3VyIEFQSSBHYXRld2F5IGJhc2UgVVJMLicsXG4gICAgKTtcbiAgfVxuXG4gIC8vIFJlbW92ZSBhbGwgdHJhaWxpbmcgc2xhc2hlcyBmcm9tIGJhc2UgVVJMXG4gIGNvbnN0IGJhc2VVcmwgPSBhcGlCYXNlVXJsLnJlcGxhY2UoL1xcLyskLywgJycpO1xuXG4gIC8vIENvbnN0cnVjdCB0aGUgZnVsbCBVUkwgd2l0aCBlbmNvZGVkIHJvdXRlIHBhcmFtZXRlclxuICByZXR1cm4gYCR7YmFzZVVybH0vc2VvLW1ldGE/cm91dGU9JHtlbmNvZGVVUklDb21wb25lbnQocm91dGUpfWA7XG59XG5cbi8qKlxuICogRmV0Y2hlcyBTRU8gbWV0YWRhdGEgZm9yIGEgc3BlY2lmaWMgcm91dGUgZnJvbSB0aGUgQVBJIEdhdGV3YXkgZW5kcG9pbnQuXG4gKiBIYW5kbGVzIGVycm9ycyBncmFjZWZ1bGx5IGFuZCByZXR1cm5zIG51bGwgb24gZmFpbHVyZS5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIHdvcmsgaW4gYnJvd3NlciBlbnZpcm9ubWVudHMgb25seS5cbiAqIEl0IHNob3VsZCBub3QgYmUgY2FsbGVkIGR1cmluZyBzZXJ2ZXJsZXNzIHJlbmRlcmluZy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcm91dGUgLSBUaGUgYXBwbGljYXRpb24gcm91dGUgdG8gZmV0Y2ggU0VPIG1ldGFkYXRhIGZvclxuICogQHJldHVybnMge1Byb21pc2U8U2VvTWV0YSB8IG51bGw+fSBTRU8gbWV0YWRhdGEgb3IgbnVsbCBpZiB1bmF2YWlsYWJsZVxuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBzZW9NZXRhID0gYXdhaXQgZmV0Y2hTZW9NZXRhZGF0YUZyb21BcGkoJy9hYm91dCcpO1xuICogaWYgKHNlb01ldGEpIHtcbiAqICAgY29uc29sZS5sb2coc2VvTWV0YS50aXRsZSk7IC8vIFwiQWJvdXQgVXNcIlxuICogfVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBIYW5kbGVzIGVycm9ycyBncmFjZWZ1bGx5XG4gKiBjb25zdCBzZW9NZXRhID0gYXdhaXQgZmV0Y2hTZW9NZXRhZGF0YUZyb21BcGkoJy9ub24tZXhpc3RlbnQnKTtcbiAqIC8vIFJldHVybnMgbnVsbCBhbmQgbG9ncyB3YXJuaW5nXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmZXRjaFNlb01ldGFkYXRhRnJvbUFwaShyb3V0ZTogc3RyaW5nKTogUHJvbWlzZTxTZW9NZXRhIHwgbnVsbD4ge1xuICB0cnkge1xuICAgIC8vIENvbnN0cnVjdCB0aGUgQVBJIFVSTFxuICAgIGNvbnN0IHVybCA9IGNvbnN0cnVjdFNlb0FwaVVybChyb3V0ZSk7XG5cbiAgICAvLyBNYWtlIHRoZSBBUEkgcmVxdWVzdFxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKTtcblxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIC8vIEFQSSByZXR1cm5lZCBub24tT0sgc3RhdHVzICg0MDQsIDUwMCwgZXRjLilcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFtSdW50aW1lXSBTRU8gQVBJIHJldHVybmVkIHN0YXR1cyAke3Jlc3BvbnNlLnN0YXR1c30gZm9yIHJvdXRlIFwiJHtyb3V0ZX1cImAsXG4gICAgICApO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gUGFyc2UgdGhlIEpTT04gcmVzcG9uc2VcbiAgICBjb25zdCBkYXRhOiBCYWNrZW5kU2VvTWV0YURhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cbiAgICAvLyBBZGFwdCBiYWNrZW5kIGZvcm1hdCB0byBmcm9udGVuZCBmb3JtYXRcbiAgICByZXR1cm4gYWRhcHRCYWNrZW5kU2VvVG9Gcm9udGVuZChkYXRhKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBIYW5kbGUgbmV0d29yayBlcnJvcnMsIEpTT04gcGFyc2luZyBlcnJvcnMsIG9yIG1pc3NpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdQVVJFX0VOVl9BUElfQkFTRV9VUkwnKSkge1xuICAgICAgLy8gUmUtdGhyb3cgY29uZmlndXJhdGlvbiBlcnJvcnMgc28gdGhleSdyZSB2aXNpYmxlIHRvIGRldmVsb3BlcnNcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IubWVzc2FnZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIExvZyBvdGhlciBlcnJvcnMgYXMgd2FybmluZ3MgKG5ldHdvcmsgaXNzdWVzLCBldGMuKVxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW1J1bnRpbWVdIEZhaWxlZCB0byBmZXRjaCBTRU8gbWV0YWRhdGEgZnJvbSBBUEkgZm9yIHJvdXRlIFwiJHtyb3V0ZX1cIjpgLFxuICAgICAgICBlcnJvcixcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbi8qKlxuICogQWRhcHRzIGJhY2tlbmQgU0VPIG1ldGFkYXRhIHR5cGUgdG8gZnJvbnRlbmQgU2VvTWV0YSB0eXBlLlxuICogQ29udmVydHMgdGhlIGJhY2tlbmQgU2VvTWV0YURhdGEgc3RydWN0dXJlIHRvIHRoZSBmcm9udGVuZCBTZW9NZXRhIHN0cnVjdHVyZSxcbiAqIGVuc3VyaW5nIGNvbXBhdGliaWxpdHkgYmV0d2VlbiBiYWNrZW5kIGFuZCBmcm9udGVuZCBkYXRhIGNvbnRyYWN0cy5cbiAqXG4gKiBUaGUgYmFja2VuZCBub3cgcmV0dXJucyBmdWxseSBtZXJnZWQgU0VPIG1ldGFkYXRhIChkZWZhdWx0cyArIHJvdXRlLXNwZWNpZmljKSxcbiAqIHNvIHRoaXMgZnVuY3Rpb24gc2ltcGx5IG1hcHMgdGhlIGZpZWxkcyB0byB0aGUgZnJvbnRlbmQgdHlwZS5cbiAqXG4gKiBAcGFyYW0ge0JhY2tlbmRTZW9NZXRhRGF0YX0gYmFja2VuZCAtIEJhY2tlbmQgU0VPIG1ldGFkYXRhIGZyb20gQVBJIChhbHJlYWR5IG1lcmdlZCB3aXRoIGRlZmF1bHRzKVxuICogQHJldHVybnMge1Nlb01ldGF9IEZyb250ZW5kLWNvbXBhdGlibGUgU0VPIG1ldGFkYXRhXG4gKi9cbmZ1bmN0aW9uIGFkYXB0QmFja2VuZFNlb1RvRnJvbnRlbmQoYmFja2VuZDogQmFja2VuZFNlb01ldGFEYXRhKTogU2VvTWV0YSB7XG4gIHJldHVybiB7XG4gICAgdGl0bGU6IGJhY2tlbmQudGl0bGUsXG4gICAgZGVzY3JpcHRpb246IGJhY2tlbmQuZGVzY3JpcHRpb24sXG4gICAga2V5d29yZHM6IGJhY2tlbmQua2V5d29yZHMsXG4gICAgb2dUaXRsZTogYmFja2VuZC5vZ1RpdGxlLFxuICAgIG9nRGVzY3JpcHRpb246IGJhY2tlbmQub2dEZXNjcmlwdGlvbixcbiAgICBvZ0ltYWdlOiBiYWNrZW5kLm9nSW1hZ2UsXG4gICAgLy8gQmFja2VuZCBkb2Vzbid0IGhhdmUgb2dVcmwgYW5kIG9nVHlwZSB5ZXQsIHdpbGwgYmUgYWRkZWQgaW4gZnV0dXJlXG4gICAgb2dVcmw6IGJhY2tlbmQuY2Fub25pY2FsVXJsLCAvLyBVc2UgY2Fub25pY2FsIFVSTCBhcyBmYWxsYmFja1xuICAgIG9nVHlwZTogJ3dlYnNpdGUnLCAvLyBEZWZhdWx0IHR5cGVcbiAgICB0d2l0dGVyQ2FyZDogJ3N1bW1hcnknLCAvLyBEZWZhdWx0IGNhcmQgdHlwZVxuICAgIHR3aXR0ZXJUaXRsZTogYmFja2VuZC50d2l0dGVyVGl0bGUsXG4gICAgdHdpdHRlckRlc2NyaXB0aW9uOiBiYWNrZW5kLnR3aXR0ZXJEZXNjcmlwdGlvbixcbiAgICB0d2l0dGVySW1hZ2U6IGJhY2tlbmQudHdpdHRlckltYWdlLFxuICAgIGNhbm9uaWNhbFVybDogYmFja2VuZC5jYW5vbmljYWxVcmwsXG4gICAgcm9ib3RzOiBiYWNrZW5kLnJvYm90cyxcbiAgICAvLyBqc29uTGQgaXMgbm90IGluIGJhY2tlbmQgdHlwZSB5ZXQsIHdpbGwgYmUgYWRkZWQgaW4gZnV0dXJlXG4gIH07XG59XG4iLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IHdvcmt0aWYucnVudGltZS5jZGsgPHdvcmt0aWZfcnVudGltZV9jZGs+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0yMiwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IERhdGFSZXRyaWV2ZXIsIERhdGFSZXRyaWV2ZXJDb250ZXh0LCBTZW9NZXRhIH0gZnJvbSAnLi9ydW50aW1lLnJvdXRlci50eXBlcyc7XG5pbXBvcnQgeyBmZXRjaFNlb01ldGFkYXRhRnJvbUFwaSB9IGZyb20gJy4vcnVudGltZS5yb3V0ZXIuc2VvLmFwaS1jbGllbnQnO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gaW50ZXJuYWwgU0VPIHJldHJpZXZlciB0aGF0IGZldGNoZXMgU0VPIG1ldGFkYXRhIGZvciBhIHJvdXRlLlxuICogVGhpcyByZXRyaWV2ZXIgaXMgYXV0b21hdGljYWxseSBhZGRlZCB0byBhbGwgcm91dGVzIGFuZCBleGVjdXRlcyBpbiBwYXJhbGxlbFxuICogd2l0aCB1c2VyLXByb3ZpZGVkIHJldHJpZXZlcnMuXG4gKlxuICogVGhlIFNFTyByZXRyaWV2ZXIgaGFuZGxlcyBib3RoIGJyb3dzZXIgYW5kIHNlcnZlcmxlc3MgcmVuZGVyaW5nIGVudmlyb25tZW50czpcbiAqIC0gQnJvd3NlcjogRmV0Y2hlcyBTRU8gZGF0YSBmcm9tIEFQSSBlbmRwb2ludCAoYWxyZWFkeSBtZXJnZWQgd2l0aCBkZWZhdWx0cyBieSBMYW1iZGEpXG4gKiAtIFNlcnZlcmxlc3MgcmVuZGVyaW5nOiBSZXR1cm5zIG51bGwgKFNFTyBkYXRhIGlzIGFscmVhZHkgaW4gdGhlIHBhZ2UgZnJvbSBMYW1iZGEpXG4gKlxuICogVGhlIGJhY2tlbmQgTGFtYmRhIGhhbmRsZXIgKExhbWJkYVJ1bnRpbWVTZW9CeVJvdXRlKSB1c2VzIFNlb1Byb3ZpZGVyIHRvIG1lcmdlXG4gKiByb3V0ZS1zcGVjaWZpYyBtZXRhZGF0YSB3aXRoIGRlZmF1bHRzIGJlZm9yZSByZXR1cm5pbmcsIGVuc3VyaW5nOlxuICogLSBEZWZhdWx0IFNFTyBtZXRhZGF0YSBpcyBhbHdheXMgYXBwbGllZCBhcyBhIGJhc2VcbiAqIC0gUm91dGUtc3BlY2lmaWMgbWV0YWRhdGEgaXMgbWVyZ2VkIG9uIHRvcCBvZiBkZWZhdWx0c1xuICogLSBObyBzdGF0ZSBsZWFrYWdlIG9jY3VycyBiZXR3ZWVuIHJvdXRlc1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSByb3V0ZVBhdGggLSBUaGUgcGF0aCBvZiB0aGUgcm91dGUgdG8gZmV0Y2ggU0VPIG1ldGFkYXRhIGZvclxuICogQHJldHVybnMge0RhdGFSZXRyaWV2ZXJ9IEEgZGF0YSByZXRyaWV2ZXIgZnVuY3Rpb24gdGhhdCByZXR1cm5zIFNFTyBtZXRhZGF0YVxuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBzZW9SZXRyaWV2ZXIgPSBjcmVhdGVTZW9SZXRyaWV2ZXIoJy9wcm9kdWN0cy86aWQnKTtcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNlb1JldHJpZXZlcihjb250ZXh0KTtcbiAqIC8vIHJlc3VsdCA9IHsgc2VvTWV0YTogeyB0aXRsZTogJy4uLicsIGRlc2NyaXB0aW9uOiAnLi4uJywgLi4uIH0gfVxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2VvUmV0cmlldmVyKHJvdXRlUGF0aDogc3RyaW5nKTogRGF0YVJldHJpZXZlciB7XG4gIHJldHVybiBhc3luYyAoY3R4OiBEYXRhUmV0cmlldmVyQ29udGV4dCk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+ID0+IHtcbiAgICB0cnkge1xuICAgICAgLy8gRmV0Y2ggU0VPIG1ldGFkYXRhIGZvciB0aGUgcm91dGUgKGFscmVhZHkgbWVyZ2VkIHdpdGggZGVmYXVsdHMgYnkgYmFja2VuZClcbiAgICAgIGNvbnN0IHNlb01ldGEgPSBhd2FpdCBmZXRjaFNlb01ldGFkYXRhKHJvdXRlUGF0aCwgY3R4KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2VvTWV0YTogc2VvTWV0YSB8fCBnZXREZWZhdWx0U2VvTWV0YSgpLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gU0VPIHJldHJpZXZlciBpcyBub24tY3JpdGljYWwgLSBsb2cgZXJyb3IgYW5kIHJldHVybiBkZWZhdWx0c1xuICAgICAgY29uc29sZS53YXJuKGBbUnVudGltZV0gU0VPIHJldHJpZXZlciBmYWlsZWQgZm9yIHJvdXRlIFwiJHtyb3V0ZVBhdGh9XCI6YCwgZXJyb3IpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2VvTWV0YTogZ2V0RGVmYXVsdFNlb01ldGEoKSxcbiAgICAgIH07XG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIEZldGNoZXMgU0VPIG1ldGFkYXRhIGZvciBhIHJvdXRlIGZyb20gdGhlIGJhY2tlbmQuXG4gKiBIYW5kbGVzIGJvdGggYnJvd3NlciBhbmQgc2VydmVybGVzcyByZW5kZXJpbmcgZW52aXJvbm1lbnRzIGRpZmZlcmVudGx5OlxuICpcbiAqIC0gQnJvd3NlcjogTWFrZXMgYW4gQVBJIGNhbGwgdG8gZmV0Y2ggU0VPIGRhdGEgZnJvbSB0aGUgZGVkaWNhdGVkIFNFTyBBUEkgZW5kcG9pbnRcbiAqICAgVGhlIGJhY2tlbmQgTGFtYmRhIGhhbmRsZXIgbWVyZ2VzIHJvdXRlLXNwZWNpZmljIG1ldGFkYXRhIHdpdGggZGVmYXVsdHMgYmVmb3JlIHJldHVybmluZ1xuICogLSBTZXJ2ZXJsZXNzIHJlbmRlcmluZzogUmV0dXJucyBudWxsIChkYXRhIGlzIGFscmVhZHkgaW4gdGhlIHBhZ2UgZnJvbSBMYW1iZGEgc2VydmVybGVzcyByZW5kZXJpbmcpXG4gKlxuICogRm9yIGR5bmFtaWMgcm91dGVzIChlLmcuLCBgL3Byb2R1Y3RzLzppZGApLCByb3V0ZSBwYXJhbWV0ZXJzIGFyZSByZXBsYWNlZCB3aXRoXG4gKiBhY3R1YWwgdmFsdWVzIGZyb20gdGhlIGNvbnRleHQgYmVmb3JlIGZldGNoaW5nLlxuICpcbiAqIFRoZSByZXR1cm5lZCBtZXRhZGF0YSBpcyBhbHJlYWR5IG1lcmdlZCB3aXRoIGRlZmF1bHRzIGJ5IHRoZSBiYWNrZW5kLCBlbnN1cmluZzpcbiAqIC0gQWxsIFNFTyBmaWVsZHMgaGF2ZSB2YWx1ZXMgKGVpdGhlciByb3V0ZS1zcGVjaWZpYyBvciBkZWZhdWx0KVxuICogLSBObyBzdGF0ZSBsZWFrYWdlIGJldHdlZW4gcm91dGVzXG4gKiAtIENvbnNpc3RlbnQgYmVoYXZpb3IgYWNyb3NzIGFsbCByb3V0ZXNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcm91dGVQYXRoIC0gVGhlIHJvdXRlIHBhdGggdG8gZmV0Y2ggU0VPIG1ldGFkYXRhIGZvciAobWF5IGNvbnRhaW4gcGFyYW1zIGxpa2UgYDppZGApXG4gKiBAcGFyYW0ge0RhdGFSZXRyaWV2ZXJDb250ZXh0fSBjdHggLSBDb250ZXh0IGNvbnRhaW5pbmcgcm91dGUgcGFyYW1zIGZvciBkeW5hbWljIHJvdXRlc1xuICogQHJldHVybnMge1Byb21pc2U8U2VvTWV0YSB8IG51bGw+fSBTRU8gbWV0YWRhdGEgKG1lcmdlZCB3aXRoIGRlZmF1bHRzKSBvciBudWxsIGlmIHVuYXZhaWxhYmxlXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEZvciBhIHN0YXRpYyByb3V0ZVxuICogY29uc3Qgc2VvTWV0YSA9IGF3YWl0IGZldGNoU2VvTWV0YWRhdGEoJy9hYm91dCcsIGN0eCk7XG4gKiAvLyBGZXRjaGVzIGZyb206ICR7UFVSRV9FTlZfQVBJX0JBU0VfVVJMfS9zZW8tbWV0YT9yb3V0ZT0lMkZhYm91dFxuICogLy8gUmV0dXJuczogTWVyZ2VkIG1ldGFkYXRhIChyb3V0ZS1zcGVjaWZpYyArIGRlZmF1bHRzKVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBGb3IgYSBkeW5hbWljIHJvdXRlXG4gKiBjb25zdCBzZW9NZXRhID0gYXdhaXQgZmV0Y2hTZW9NZXRhZGF0YSgnL3Byb2R1Y3RzLzppZCcsIHsgcGFyYW1zOiB7IGlkOiAnMTIzJyB9LCAuLi4gfSk7XG4gKiAvLyBGZXRjaGVzIGZyb206ICR7UFVSRV9FTlZfQVBJX0JBU0VfVVJMfS9zZW8tbWV0YT9yb3V0ZT0lMkZwcm9kdWN0cyUyRjEyM1xuICogLy8gUmV0dXJuczogTWVyZ2VkIG1ldGFkYXRhIChyb3V0ZS1zcGVjaWZpYyArIGRlZmF1bHRzKVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmV0Y2hTZW9NZXRhZGF0YShcbiAgcm91dGVQYXRoOiBzdHJpbmcsXG4gIGN0eDogRGF0YVJldHJpZXZlckNvbnRleHQsXG4pOiBQcm9taXNlPFNlb01ldGEgfCBudWxsPiB7XG4gIC8vIEluIHNlcnZlcmxlc3MgcmVuZGVyaW5nIGVudmlyb25tZW50LCBTRU8gZGF0YSBpcyBhbHJlYWR5IGluIHRoZSBwYWdlIGZyb20gTGFtYmRhXG4gIC8vIFRoZSBsb2FkZXIgZGF0YSB3aWxsIGJlIGh5ZHJhdGVkIGZyb20gc2VydmVyLCBzbyB3ZSBkb24ndCBuZWVkIHRvIGZldGNoXG4gIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gQ2xpZW50LXNpZGU6IGZldGNoIGZyb20gZGVkaWNhdGVkIFNFTyBBUEkgZW5kcG9pbnRcbiAgLy8gVGhlIGJhY2tlbmQgbWVyZ2VzIHJvdXRlLXNwZWNpZmljIG1ldGFkYXRhIHdpdGggZGVmYXVsdHMgYmVmb3JlIHJldHVybmluZ1xuICB0cnkge1xuICAgIC8vIFJlcGxhY2Ugcm91dGUgcGFyYW1zIHdpdGggYWN0dWFsIHZhbHVlcyBmb3IgZHluYW1pYyByb3V0ZXNcbiAgICBsZXQgcmVzb2x2ZWRQYXRoID0gcm91dGVQYXRoO1xuICAgIGlmIChjdHgucGFyYW1zKSB7XG4gICAgICBPYmplY3QuZW50cmllcyhjdHgucGFyYW1zKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgcmVzb2x2ZWRQYXRoID0gcmVzb2x2ZWRQYXRoLnJlcGxhY2UoYDoke2tleX1gLCBTdHJpbmcodmFsdWUpKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFVzZSB0aGUgbmV3IFNFTyBBUEkgY2xpZW50IHRvIGZldGNoIG1ldGFkYXRhIChhbHJlYWR5IG1lcmdlZCB3aXRoIGRlZmF1bHRzKVxuICAgIHJldHVybiBhd2FpdCBmZXRjaFNlb01ldGFkYXRhRnJvbUFwaShyZXNvbHZlZFBhdGgpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUud2FybihgW1J1bnRpbWVdIEZhaWxlZCB0byBmZXRjaCBTRU8gbWV0YWRhdGEgZm9yIHJvdXRlIFwiJHtyb3V0ZVBhdGh9XCI6YCwgZXJyb3IpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyBkZWZhdWx0IFNFTyBtZXRhZGF0YSBhcyBhIGZhbGxiYWNrIHdoZW4gZmV0Y2hpbmcgZmFpbHMuXG4gKiBUaGVzZSBkZWZhdWx0cyBlbnN1cmUgdGhlIGFwcGxpY2F0aW9uIGFsd2F5cyBoYXMgdmFsaWQgU0VPIG1ldGFkYXRhXG4gKiBldmVuIHdoZW4gdGhlIGJhY2tlbmQgaXMgdW5hdmFpbGFibGUgb3IgcmV0dXJucyBlcnJvcnMuXG4gKlxuICogSW5jbHVkZXMgYWxsIFNFTyBmaWVsZHMgdG8gZW5zdXJlIHByb3BlciBtZXRhIHRhZyBtYW5hZ2VtZW50OlxuICogLSBCYXNpYyBtZXRhIHRhZ3MgKHRpdGxlLCBkZXNjcmlwdGlvbiwgcm9ib3RzKVxuICogLSBPcGVuIEdyYXBoIHRhZ3MgZm9yIHNvY2lhbCBtZWRpYSBzaGFyaW5nXG4gKiAtIFR3aXR0ZXIgQ2FyZCB0YWdzIGZvciBUd2l0dGVyIHNoYXJpbmdcbiAqIC0gQ2Fub25pY2FsIFVSTFxuICpcbiAqIEByZXR1cm5zIHtTZW9NZXRhfSBEZWZhdWx0IFNFTyBtZXRhZGF0YSBvYmplY3Qgd2l0aCBhbGwgZmllbGRzIHBvcHVsYXRlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVmYXVsdFNlb01ldGEoKTogU2VvTWV0YSB7XG4gIHJldHVybiB7XG4gICAgdGl0bGU6ICdSdW50aW1lIFdlYiBBcHBsaWNhdGlvbicsXG4gICAgZGVzY3JpcHRpb246ICdBIFJ1bnRpbWUgV2ViIHNlcnZlcmxlc3MgYXBwbGljYXRpb24nLFxuICAgIHJvYm90czogJ2luZGV4LCBmb2xsb3cnLFxuICAgIGtleXdvcmRzOiBbJ2F3cycsICdzZXJ2ZXJsZXNzJywgJ3JlYWN0JywgJ3NlcnZlcmxlc3MgcmVuZGVyaW5nJ10sXG4gICAgb2dUaXRsZTogJ1J1bnRpbWUgV2ViIEFwcGxpY2F0aW9uJyxcbiAgICBvZ0Rlc2NyaXB0aW9uOiAnQSBSdW50aW1lIFdlYiBzZXJ2ZXJsZXNzIGFwcGxpY2F0aW9uJyxcbiAgICBvZ0ltYWdlOiAnL29nLWltYWdlLnBuZycsXG4gICAgb2dVcmw6ICcvJyxcbiAgICBvZ1R5cGU6ICd3ZWJzaXRlJyxcbiAgICB0d2l0dGVyQ2FyZDogJ3N1bW1hcnlfbGFyZ2VfaW1hZ2UnLFxuICAgIHR3aXR0ZXJUaXRsZTogJ1J1bnRpbWUgV2ViIEFwcGxpY2F0aW9uJyxcbiAgICB0d2l0dGVyRGVzY3JpcHRpb246ICdBIFJ1bnRpbWUgV2ViIHNlcnZlcmxlc3MgYXBwbGljYXRpb24nLFxuICAgIHR3aXR0ZXJJbWFnZTogJy90d2l0dGVyLWNhcmQucG5nJyxcbiAgICBjYW5vbmljYWxVcmw6ICcvJyxcbiAgfTtcbn1cblxuXG4iLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IHdvcmt0aWYucnVudGltZS5jZGsgPHdvcmt0aWZfcnVudGltZV9jZGs+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0yMiwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG5pbXBvcnQgeyBMb2FkZXJGdW5jdGlvbkFyZ3MgfSBmcm9tICdyZWFjdC1yb3V0ZXInO1xuXG5pbXBvcnQgeyBEYXRhUmV0cmlldmVyLCBEYXRhUmV0cmlldmVyQ29udGV4dCwgUnVudGltZUxvYWRlclJlc3VsdCB9IGZyb20gJy4vcnVudGltZS5yb3V0ZXIudHlwZXMnO1xuaW1wb3J0IHsgY3JlYXRlU2VvUmV0cmlldmVyIH0gZnJvbSAnLi9ydW50aW1lLnJvdXRlci5zZW8nO1xuXG4vKipcbiAqIFJlc2VydmVkIGtleSBuYW1lIGZvciBpbnRlcm5hbCBmcmFtZXdvcmsgZGF0YS5cbiAqIFVzZXIgcmV0cmlldmVycyBjYW5ub3QgcmV0dXJuIG9iamVjdHMgY29udGFpbmluZyB0aGlzIGtleS5cbiAqL1xuY29uc3QgUkVTRVJWRURfSU5URVJOQUxfS0VZID0gJ2ludGVybmFsJztcblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgcmV0cmlldmVyIHdpdGggbWV0YWRhdGEgYWJvdXQgd2hldGhlciBpdCdzIGludGVybmFsIG9yIHVzZXItcHJvdmlkZWQuXG4gKi9cbnR5cGUgUmV0cmlldmVyV2l0aE1ldGFkYXRhID0ge1xuICByZXRyaWV2ZXI6IERhdGFSZXRyaWV2ZXI7XG4gIGlzSW50ZXJuYWw6IGJvb2xlYW47XG4gIG5hbWU6IHN0cmluZztcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIGxvYWRlciBmdW5jdGlvbiBmb3IgYSByb3V0ZSB0aGF0IGV4ZWN1dGVzIGFsbCBkYXRhIHJldHJpZXZlcnMgaW4gcGFyYWxsZWwuXG4gKiBUaGUgbG9hZGVyIG9yY2hlc3RyYXRlcyBib3RoIGludGVybmFsIGZyYW1ld29yayByZXRyaWV2ZXJzIChTRU8pIGFuZCB1c2VyLXByb3ZpZGVkIHJldHJpZXZlcnMuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW50ZXJuYWxseSBieSB0aGUgcm91dGVyIHRyYW5zZm9ybWF0aW9uIGxvZ2ljIGFuZCBpcyBub3QgdHlwaWNhbGx5XG4gKiB1c2VkIGRpcmVjdGx5IGJ5IGFwcGxpY2F0aW9uIGRldmVsb3BlcnMuIEl0IGdlbmVyYXRlcyBSZWFjdCBSb3V0ZXItY29tcGF0aWJsZSBsb2FkZXIgZnVuY3Rpb25zXG4gKiB0aGF0IGV4ZWN1dGUgZGF0YSByZXRyaWV2ZXJzIHVzaW5nIFByb21pc2UuYWxsU2V0dGxlZCBmb3IgcGFyYWxsZWwgZXhlY3V0aW9uLlxuICpcbiAqIEtleSBmZWF0dXJlczpcbiAqIC0gRXhlY3V0ZXMgYWxsIHJldHJpZXZlcnMgaW4gcGFyYWxsZWwgKG5vbi1ibG9ja2luZylcbiAqIC0gQXV0b21hdGljYWxseSBpbmNsdWRlcyBpbnRlcm5hbCBTRU8gcmV0cmlldmVyXG4gKiAtIFZhbGlkYXRlcyB1c2VyIGRhdGEgZG9lc24ndCBjb250YWluIHJlc2VydmVkIGtleXNcbiAqIC0gU2VwYXJhdGVzIGludGVybmFsIGZyYW1ld29yayBkYXRhIGZyb20gYnVzaW5lc3MgZGF0YVxuICogLSBMb2dzIHJldHJpZXZlciBmYWlsdXJlcyB3aXRob3V0IGJyZWFraW5nIHRoZSByb3V0ZVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSByb3V0ZVBhdGggLSBUaGUgcGF0aCBvZiB0aGUgcm91dGUgdGhpcyBsb2FkZXIgaXMgZm9yICh1c2VkIGZvciBsb2dnaW5nKVxuICogQHBhcmFtIHtEYXRhUmV0cmlldmVyW119IHVzZXJSZXRyaWV2ZXJzIC0gQXJyYXkgb2YgdXNlci1wcm92aWRlZCBkYXRhIHJldHJpZXZlciBmdW5jdGlvbnNcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gQSBSZWFjdCBSb3V0ZXIgbG9hZGVyIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBSdW50aW1lTG9hZGVyUmVzdWx0XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEludGVybmFsIHVzYWdlIGJ5IHJvdXRlciB0cmFuc2Zvcm1hdGlvblxuICogY29uc3QgbG9hZGVyID0gY3JlYXRlUm91dGVMb2FkZXIoJy9wcm9kdWN0cy86aWQnLCBbXG4gKiAgIGFzeW5jICh7IHBhcmFtcyB9KSA9PiAoeyBwcm9kdWN0OiBhd2FpdCBmZXRjaFByb2R1Y3QocGFyYW1zLmlkKSB9KSxcbiAqICAgYXN5bmMgKHsgcGFyYW1zIH0pID0+ICh7IHJldmlld3M6IGF3YWl0IGZldGNoUmV2aWV3cyhwYXJhbXMuaWQpIH0pXG4gKiBdKTtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gVGhlIGdlbmVyYXRlZCBsb2FkZXIgcmV0dXJucyBzdHJ1Y3R1cmVkIGRhdGE6XG4gKiAvLyB7XG4gKiAvLyAgIGludGVybmFsOiB7IHNlb01ldGE6IHsgdGl0bGU6ICcuLi4nLCBkZXNjcmlwdGlvbjogJy4uLicgfSB9LFxuICogLy8gICBidXNpbmVzczogeyBwcm9kdWN0OiB7Li4ufSwgcmV2aWV3czogWy4uLl0gfVxuICogLy8gfVxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUm91dGVMb2FkZXIoXG4gIHJvdXRlUGF0aDogc3RyaW5nLFxuICB1c2VyUmV0cmlldmVyczogRGF0YVJldHJpZXZlcltdLFxuKTogKGFyZ3M6IExvYWRlckZ1bmN0aW9uQXJncykgPT4gUHJvbWlzZTxSdW50aW1lTG9hZGVyUmVzdWx0PiB7XG4gIHJldHVybiBhc3luYyAoYXJnczogTG9hZGVyRnVuY3Rpb25BcmdzKTogUHJvbWlzZTxSdW50aW1lTG9hZGVyUmVzdWx0PiA9PiB7XG4gICAgY29uc3QgeyBwYXJhbXMsIHJlcXVlc3QgfSA9IGFyZ3M7XG4gICAgY29uc3QgdXJsID0gbmV3IFVSTChyZXF1ZXN0LnVybCk7XG4gICAgY29uc3Qgc2VhcmNoUGFyYW1zID0gdXJsLnNlYXJjaFBhcmFtcztcblxuICAgIC8vIEJ1aWxkIGNvbnRleHQgZm9yIHJldHJpZXZlcnNcbiAgICBjb25zdCBjb250ZXh0OiBEYXRhUmV0cmlldmVyQ29udGV4dCA9IHtcbiAgICAgIHBhcmFtcyxcbiAgICAgIHJlcXVlc3QsXG4gICAgICBzZWFyY2hQYXJhbXMsXG4gICAgfTtcblxuICAgIC8vIENvbGxlY3QgYWxsIHJldHJpZXZlcnM6IGludGVybmFsICsgdXNlclxuICAgIGNvbnN0IGludGVybmFsUmV0cmlldmVyczogUmV0cmlldmVyV2l0aE1ldGFkYXRhW10gPSBbXG4gICAgICB7XG4gICAgICAgIHJldHJpZXZlcjogY3JlYXRlU2VvUmV0cmlldmVyKHJvdXRlUGF0aCksXG4gICAgICAgIGlzSW50ZXJuYWw6IHRydWUsXG4gICAgICAgIG5hbWU6ICdJbnRlcm5hbCBTRU8gcmV0cmlldmVyJyxcbiAgICAgIH0sXG4gICAgXTtcblxuICAgIGNvbnN0IHVzZXJSZXRyaWV2ZXJzV2l0aE1ldGFkYXRhOiBSZXRyaWV2ZXJXaXRoTWV0YWRhdGFbXSA9IHVzZXJSZXRyaWV2ZXJzLm1hcChcbiAgICAgIChyZXRyaWV2ZXIsIGluZGV4KSA9PiAoe1xuICAgICAgICByZXRyaWV2ZXIsXG4gICAgICAgIGlzSW50ZXJuYWw6IGZhbHNlLFxuICAgICAgICBuYW1lOiBgVXNlciByZXRyaWV2ZXIgJHtpbmRleCArIDF9YCxcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICBjb25zdCBhbGxSZXRyaWV2ZXJzID0gWy4uLmludGVybmFsUmV0cmlldmVycywgLi4udXNlclJldHJpZXZlcnNXaXRoTWV0YWRhdGFdO1xuXG4gICAgLy8gRXhlY3V0ZSBhbGwgcmV0cmlldmVycyBpbiBwYXJhbGxlbCB1c2luZyBQcm9taXNlLmFsbFNldHRsZWRcbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgZXhlY3V0ZVJ1bnRpbWVBc3luYyhhbGxSZXRyaWV2ZXJzLCBjb250ZXh0LCByb3V0ZVBhdGgpO1xuXG4gICAgLy8gTWVyZ2UgcmVzdWx0cyBpbnRvIHN0cnVjdHVyZWQgbG9hZGVyIHJlc3VsdFxuICAgIHJldHVybiBtZXJnZUxvYWRlclJlc3VsdHMocmVzdWx0cywgYWxsUmV0cmlldmVycywgcm91dGVQYXRoKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBFeGVjdXRlcyBhbGwgZGF0YSByZXRyaWV2ZXJzIGluIHBhcmFsbGVsIHVzaW5nIFByb21pc2UuYWxsU2V0dGxlZC5cbiAqIFRoaXMgZW5zdXJlcyB0aGF0IG9uZSBzbG93IG9yIGZhaWxpbmcgcmV0cmlldmVyIGRvZXNuJ3QgYmxvY2sgb3RoZXJzLlxuICpcbiAqIFByb21pc2UuYWxsU2V0dGxlZCBpcyB1c2VkIGluc3RlYWQgb2YgUHJvbWlzZS5hbGwgdG8gZW5zdXJlIHRoYXQ6XG4gKiAtIEFsbCByZXRyaWV2ZXJzIGV4ZWN1dGUgcmVnYXJkbGVzcyBvZiBpbmRpdmlkdWFsIGZhaWx1cmVzXG4gKiAtIEZhaWxlZCByZXRyaWV2ZXJzIGRvbid0IHByZXZlbnQgc3VjY2Vzc2Z1bCBvbmVzIGZyb20gY29tcGxldGluZ1xuICogLSBFYWNoIHJlc3VsdCAoZnVsZmlsbGVkIG9yIHJlamVjdGVkKSBjYW4gYmUgcHJvY2Vzc2VkIGluZGVwZW5kZW50bHlcbiAqXG4gKiBAcGFyYW0ge1JldHJpZXZlcldpdGhNZXRhZGF0YVtdfSByZXRyaWV2ZXJzIC0gQXJyYXkgb2YgcmV0cmlldmVycyB3aXRoIG1ldGFkYXRhXG4gKiBAcGFyYW0ge0RhdGFSZXRyaWV2ZXJDb250ZXh0fSBjb250ZXh0IC0gQ29udGV4dCB0byBwYXNzIHRvIGVhY2ggcmV0cmlldmVyXG4gKiBAcGFyYW0ge3N0cmluZ30gcm91dGVQYXRoIC0gUm91dGUgcGF0aCBmb3IgbG9nZ2luZyBwdXJwb3Nlc1xuICogQHJldHVybnMge1Byb21pc2U8UHJvbWlzZVNldHRsZWRSZXN1bHQ8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+W10+fSBBcnJheSBvZiBzZXR0bGVkIHByb21pc2UgcmVzdWx0c1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBJbnRlcm5hbCB1c2FnZVxuICogY29uc3QgcmVzdWx0cyA9IGF3YWl0IGV4ZWN1dGVSdW50aW1lQXN5bmMoXG4gKiAgIFtcbiAqICAgICB7IHJldHJpZXZlcjogZmV0Y2hQcm9kdWN0LCBpc0ludGVybmFsOiBmYWxzZSwgbmFtZTogJ1Byb2R1Y3QgcmV0cmlldmVyJyB9LFxuICogICAgIHsgcmV0cmlldmVyOiBmZXRjaFJldmlld3MsIGlzSW50ZXJuYWw6IGZhbHNlLCBuYW1lOiAnUmV2aWV3cyByZXRyaWV2ZXInIH1cbiAqICAgXSxcbiAqICAgeyBwYXJhbXM6IHsgaWQ6ICcxMjMnIH0sIHJlcXVlc3QsIHNlYXJjaFBhcmFtcyB9LFxuICogICAnL3Byb2R1Y3RzLzppZCdcbiAqICk7XG4gKiAvLyBSZXR1cm5zOiBbXG4gKiAvLyAgIHsgc3RhdHVzOiAnZnVsZmlsbGVkJywgdmFsdWU6IHsgcHJvZHVjdDogey4uLn0gfSB9LFxuICogLy8gICB7IHN0YXR1czogJ2Z1bGZpbGxlZCcsIHZhbHVlOiB7IHJldmlld3M6IFsuLi5dIH0gfVxuICogLy8gXVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZVJ1bnRpbWVBc3luYyhcbiAgcmV0cmlldmVyczogUmV0cmlldmVyV2l0aE1ldGFkYXRhW10sXG4gIGNvbnRleHQ6IERhdGFSZXRyaWV2ZXJDb250ZXh0LFxuICByb3V0ZVBhdGg6IHN0cmluZyxcbik6IFByb21pc2U8UHJvbWlzZVNldHRsZWRSZXN1bHQ8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+W10+IHtcbiAgaWYgKHJldHJpZXZlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgLy8gRXhlY3V0ZSBhbGwgcmV0cmlldmVycyBpbiBwYXJhbGxlbFxuICBjb25zdCBwcm9taXNlcyA9IHJldHJpZXZlcnMubWFwKCh7IHJldHJpZXZlciB9KSA9PiByZXRyaWV2ZXIoY29udGV4dCkpO1xuXG4gIHJldHVybiBQcm9taXNlLmFsbFNldHRsZWQocHJvbWlzZXMpO1xufVxuXG4vKipcbiAqIE1lcmdlcyByZXRyaWV2ZXIgcmVzdWx0cyBpbnRvIGEgc3RydWN0dXJlZCBSdW50aW1lTG9hZGVyUmVzdWx0LlxuICogSGFuZGxlcyBib3RoIGZ1bGZpbGxlZCBhbmQgcmVqZWN0ZWQgcHJvbWlzZXMsIHZhbGlkYXRlcyByZXNlcnZlZCBrZXlzLFxuICogYW5kIHNlcGFyYXRlcyBpbnRlcm5hbCBmcm9tIGJ1c2luZXNzIGRhdGEuXG4gKlxuICogUHJvY2Vzc2luZyBsb2dpYzpcbiAqIC0gRnVsZmlsbGVkIGludGVybmFsIHJldHJpZXZlcnMgXHUyMTkyIG1lcmdlZCBpbnRvIGBpbnRlcm5hbGAgZmllbGRcbiAqIC0gRnVsZmlsbGVkIHVzZXIgcmV0cmlldmVycyBcdTIxOTIgbWVyZ2VkIGludG8gYGJ1c2luZXNzYCBmaWVsZCAoYWZ0ZXIgdmFsaWRhdGlvbilcbiAqIC0gUmVqZWN0ZWQgcmV0cmlldmVycyBcdTIxOTIgbG9nZ2VkIHdpdGggY29udGV4dCwgZG9uJ3QgYmxvY2sgcm91dGUgcmVuZGVyaW5nXG4gKiAtIFJlc2VydmVkIGtleSB2aW9sYXRpb25zIFx1MjE5MiBmaWx0ZXJlZCBvdXQgd2l0aCB3YXJuaW5nXG4gKlxuICogRnV0dXJlIGVuaGFuY2VtZW50OiBTdXBwb3J0IGZvciBmYXRhbCByZXRyaWV2ZXJzIHRoYXQgdGhyb3cgZXJyb3JzIG9uIGZhaWx1cmUuXG4gKlxuICogQHBhcmFtIHtQcm9taXNlU2V0dGxlZFJlc3VsdDxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj5bXX0gcmVzdWx0cyAtIFJlc3VsdHMgZnJvbSBQcm9taXNlLmFsbFNldHRsZWRcbiAqIEBwYXJhbSB7UmV0cmlldmVyV2l0aE1ldGFkYXRhW119IHJldHJpZXZlcnMgLSBPcmlnaW5hbCByZXRyaWV2ZXJzIHdpdGggbWV0YWRhdGFcbiAqIEBwYXJhbSB7c3RyaW5nfSByb3V0ZVBhdGggLSBSb3V0ZSBwYXRoIGZvciBsb2dnaW5nIHB1cnBvc2VzXG4gKiBAcmV0dXJucyB7UnVudGltZUxvYWRlclJlc3VsdH0gU3RydWN0dXJlZCBsb2FkZXIgcmVzdWx0IHdpdGggaW50ZXJuYWwgYW5kIGJ1c2luZXNzIGRhdGFcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBhIGZhdGFsIHJldHJpZXZlciBmYWlscyAoZnV0dXJlIGVuaGFuY2VtZW50KVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBJbnRlcm5hbCB1c2FnZVxuICogY29uc3QgbG9hZGVyUmVzdWx0ID0gbWVyZ2VMb2FkZXJSZXN1bHRzKFxuICogICBbXG4gKiAgICAgeyBzdGF0dXM6ICdmdWxmaWxsZWQnLCB2YWx1ZTogeyBzZW9NZXRhOiB7Li4ufSB9IH0sXG4gKiAgICAgeyBzdGF0dXM6ICdmdWxmaWxsZWQnLCB2YWx1ZTogeyBwcm9kdWN0OiB7Li4ufSB9IH0sXG4gKiAgICAgeyBzdGF0dXM6ICdyZWplY3RlZCcsIHJlYXNvbjogbmV3IEVycm9yKCdOZXR3b3JrIGVycm9yJykgfVxuICogICBdLFxuICogICBbXG4gKiAgICAgeyByZXRyaWV2ZXI6IHNlb1JldHJpZXZlciwgaXNJbnRlcm5hbDogdHJ1ZSwgbmFtZTogJ1NFTycgfSxcbiAqICAgICB7IHJldHJpZXZlcjogcHJvZHVjdFJldHJpZXZlciwgaXNJbnRlcm5hbDogZmFsc2UsIG5hbWU6ICdQcm9kdWN0JyB9LFxuICogICAgIHsgcmV0cmlldmVyOiByZXZpZXdzUmV0cmlldmVyLCBpc0ludGVybmFsOiBmYWxzZSwgbmFtZTogJ1Jldmlld3MnIH1cbiAqICAgXSxcbiAqICAgJy9wcm9kdWN0cy86aWQnXG4gKiApO1xuICogLy8gUmV0dXJuczoge1xuICogLy8gICBpbnRlcm5hbDogeyBzZW9NZXRhOiB7Li4ufSB9LFxuICogLy8gICBidXNpbmVzczogeyBwcm9kdWN0OiB7Li4ufSB9XG4gKiAvLyB9XG4gKiAvLyBOb3RlOiBSZXZpZXdzIHJldHJpZXZlciBmYWlsZWQgYnV0IGRpZG4ndCBicmVhayB0aGUgcm91dGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlTG9hZGVyUmVzdWx0cyhcbiAgcmVzdWx0czogUHJvbWlzZVNldHRsZWRSZXN1bHQ8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+W10sXG4gIHJldHJpZXZlcnM6IFJldHJpZXZlcldpdGhNZXRhZGF0YVtdLFxuICByb3V0ZVBhdGg6IHN0cmluZyxcbik6IFJ1bnRpbWVMb2FkZXJSZXN1bHQge1xuICBjb25zdCBsb2FkZXJSZXN1bHQ6IFJ1bnRpbWVMb2FkZXJSZXN1bHQgPSB7XG4gICAgaW50ZXJuYWw6IHt9LFxuICAgIGJ1c2luZXNzOiB7fSxcbiAgfTtcblxuICAvLyBAbm90ZTogcmVhZCBub3RlcyBiZWxvd1xuICAvLyBjb25zdCBmYXRhbEVycm9yczogQXJyYXk8eyBuYW1lOiBzdHJpbmc7IGVycm9yOiBFcnJvciB9PiA9IFtdO1xuXG4gIHJlc3VsdHMuZm9yRWFjaCgocmVzdWx0LCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IHsgaXNJbnRlcm5hbCwgbmFtZSB9ID0gcmV0cmlldmVyc1tpbmRleF07XG5cbiAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gJ2Z1bGZpbGxlZCcpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSByZXN1bHQudmFsdWU7XG5cbiAgICAgIC8vIFZhbGlkYXRlIGFuZCBtZXJnZSBkYXRhIGJhc2VkIG9uIHJldHJpZXZlciB0eXBlXG4gICAgICBpZiAoaXNJbnRlcm5hbCkge1xuICAgICAgICAvLyBJbnRlcm5hbCByZXRyaWV2ZXJzIG1lcmdlIGludG8gaW50ZXJuYWwgZmllbGRcbiAgICAgICAgT2JqZWN0LmFzc2lnbihsb2FkZXJSZXN1bHQuaW50ZXJuYWwsIGRhdGEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVXNlciByZXRyaWV2ZXJzOiB2YWxpZGF0ZSByZXNlcnZlZCBrZXkgYW5kIG1lcmdlIGludG8gYnVzaW5lc3MgZmllbGRcbiAgICAgICAgaWYgKFJFU0VSVkVEX0lOVEVSTkFMX0tFWSBpbiBkYXRhKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgYFtSdW50aW1lXSAke25hbWV9IGZvciByb3V0ZSBcIiR7cm91dGVQYXRofVwiIHJldHVybmVkIHJlc2VydmVkIGtleSBcIiR7UkVTRVJWRURfSU5URVJOQUxfS0VZfVwiLCBpZ25vcmluZyBpdGAsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIEZpbHRlciBvdXQgdGhlIHJlc2VydmVkIGtleVxuICAgICAgICAgIGNvbnN0IHsgW1JFU0VSVkVEX0lOVEVSTkFMX0tFWV06IF8sIC4uLnJlc3QgfSA9IGRhdGE7XG4gICAgICAgICAgT2JqZWN0LmFzc2lnbihsb2FkZXJSZXN1bHQuYnVzaW5lc3MsIHJlc3QpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIE9iamVjdC5hc3NpZ24obG9hZGVyUmVzdWx0LmJ1c2luZXNzLCBkYXRhKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBIYW5kbGUgcmVqZWN0aW9uIC0gY29tcHJlaGVuc2l2ZSBlcnJvciBsb2dnaW5nXG4gICAgICBsb2dSZXRyaWV2ZXJGYWlsdXJlKHJlc3VsdC5yZWFzb24sIG5hbWUsIHJvdXRlUGF0aCwgaXNJbnRlcm5hbCk7XG5cbiAgICAgIC8vIEZ1dHVyZSBlbmhhbmNlbWVudDogQ2hlY2sgaWYgcmV0cmlldmVyIGlzIG1hcmtlZCBhcyBmYXRhbFxuICAgICAgLy8gRm9yIG5vdywgYWxsIHJldHJpZXZlcnMgYXJlIG5vbi1jcml0aWNhbFxuICAgICAgLy8gSWYgYSByZXRyaWV2ZXIgaGFkIGlzRmF0YWw6IHRydWUsIHdlIHdvdWxkIGFkZCBpdCB0byBmYXRhbEVycm9ycyBhcnJheVxuICAgICAgLy8gRXhhbXBsZTpcbiAgICAgIC8vIGlmIChyZXRyaWV2ZXIuaXNGYXRhbCkge1xuICAgICAgLy8gICAgIGZhdGFsRXJyb3JzLnB1c2goeyBuYW1lLCBlcnJvcjogcmVzdWx0LnJlYXNvbiB9KTtcbiAgICAgIC8vIH1cbiAgICB9XG4gIH0pO1xuXG4gIC8vIEZ1dHVyZSBlbmhhbmNlbWVudDogVGhyb3cgYWdncmVnYXRlIGVycm9yIGlmIGFueSBmYXRhbCByZXRyaWV2ZXJzIGZhaWxlZFxuICAvLyBUaGlzIHdvdWxkIGFsbG93IFJlYWN0IFJvdXRlcidzIGVycm9yIGJvdW5kYXJ5IHRvIGNhdGNoIGFuZCBkaXNwbGF5IHRoZSBlcnJvclxuICAvLyBpZiAoZmF0YWxFcnJvcnMubGVuZ3RoID4gMCkge1xuICAvLyAgICAgdGhyb3cgY3JlYXRlQWdncmVnYXRlRXJyb3IoZmF0YWxFcnJvcnMsIHJvdXRlUGF0aCk7XG4gIC8vIH1cblxuICByZXR1cm4gbG9hZGVyUmVzdWx0O1xufVxuXG4vKipcbiAqIExvZ3MgYSByZXRyaWV2ZXIgZmFpbHVyZSB3aXRoIGNvbXByZWhlbnNpdmUgY29udGV4dCBpbmZvcm1hdGlvbi5cbiAqIFVzZXMgYXBwcm9wcmlhdGUgbG9nIGxldmVscyBiYXNlZCBvbiByZXRyaWV2ZXIgdHlwZSBhbmQgY3JpdGljYWxpdHkuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSByZWFzb24gLSBUaGUgZXJyb3Igb3IgcmVqZWN0aW9uIHJlYXNvblxuICogQHBhcmFtIHtzdHJpbmd9IHJldHJpZXZlck5hbWUgLSBOYW1lIG9mIHRoZSBmYWlsZWQgcmV0cmlldmVyXG4gKiBAcGFyYW0ge3N0cmluZ30gcm91dGVQYXRoIC0gUm91dGUgcGF0aCB3aGVyZSB0aGUgZmFpbHVyZSBvY2N1cnJlZFxuICogQHBhcmFtIHtib29sZWFufSBpc0ludGVybmFsIC0gV2hldGhlciB0aGlzIGlzIGFuIGludGVybmFsIGZyYW1ld29yayByZXRyaWV2ZXJcbiAqL1xuZnVuY3Rpb24gbG9nUmV0cmlldmVyRmFpbHVyZShcbiAgcmVhc29uOiB1bmtub3duLFxuICByZXRyaWV2ZXJOYW1lOiBzdHJpbmcsXG4gIHJvdXRlUGF0aDogc3RyaW5nLFxuICBpc0ludGVybmFsOiBib29sZWFuLFxuKTogdm9pZCB7XG4gIC8vIEV4dHJhY3QgZXJyb3IgZGV0YWlscyAtIGhhbmRsZSBhbnkgdHlwZSBvZiByZWplY3Rpb24gcmVhc29uIHNhZmVseVxuICBsZXQgZXJyb3I6IEVycm9yO1xuICB0cnkge1xuICAgIGVycm9yID0gcmVhc29uIGluc3RhbmNlb2YgRXJyb3IgPyByZWFzb24gOiBuZXcgRXJyb3IoU3RyaW5nKHJlYXNvbikpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBJZiBTdHJpbmcocmVhc29uKSBmYWlscyAoZS5nLiwgb2JqZWN0IHdpdGggYnJva2VuIHRvU3RyaW5nKSwgdXNlIEpTT04uc3RyaW5naWZ5XG4gICAgdHJ5IHtcbiAgICAgIGVycm9yID0gbmV3IEVycm9yKEpTT04uc3RyaW5naWZ5KHJlYXNvbikpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gSWYgZXZlbiBKU09OLnN0cmluZ2lmeSBmYWlscywgdXNlIGEgZ2VuZXJpYyBtZXNzYWdlXG4gICAgICBlcnJvciA9IG5ldyBFcnJvcignW1VuYWJsZSB0byBzZXJpYWxpemUgZXJyb3IgcmVhc29uXScpO1xuICAgIH1cbiAgfVxuICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvci5tZXNzYWdlO1xuICBjb25zdCBzdGFja1RyYWNlID0gZXJyb3Iuc3RhY2s7XG5cbiAgLy8gTG9nIHdpdGggY29tcHJlaGVuc2l2ZSBjb250ZXh0XG4gIGNvbnN0IGxvZ1ByZWZpeCA9ICdbUnVudGltZSBMb2FkZXIgRXJyb3JdJztcbiAgY29uc3QgY29udGV4dCA9IHtcbiAgICByZXRyaWV2ZXI6IHJldHJpZXZlck5hbWUsXG4gICAgcm91dGU6IHJvdXRlUGF0aCxcbiAgICB0eXBlOiBpc0ludGVybmFsID8gJ2ludGVybmFsJyA6ICd1c2VyJyxcbiAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgfTtcblxuICAvLyBGb3Igbm93LCBhbGwgcmV0cmlldmVycyBhcmUgbm9uLWNyaXRpY2FsLCBzbyB3ZSB1c2UgY29uc29sZS53YXJuXG4gIC8vIEZ1dHVyZSBlbmhhbmNlbWVudDogc3VwcG9ydCBpc0ZhdGFsIGZsYWcgdG8gdXNlIGNvbnNvbGUuZXJyb3IgZm9yIGZhdGFsIHJldHJpZXZlcnNcbiAgY29uc29sZS53YXJuKFxuICAgIGAke2xvZ1ByZWZpeH0gJHtyZXRyaWV2ZXJOYW1lfSBmYWlsZWQgZm9yIHJvdXRlIFwiJHtyb3V0ZVBhdGh9XCJgLFxuICAgICdcXG5FcnJvcjonLCBlcnJvck1lc3NhZ2UsXG4gICAgJ1xcbkNvbnRleHQ6JywgY29udGV4dCxcbiAgKTtcblxuICAvLyBMb2cgc3RhY2sgdHJhY2Ugc2VwYXJhdGVseSBmb3IgYmV0dGVyIHJlYWRhYmlsaXR5XG4gIGlmIChzdGFja1RyYWNlKSB7XG4gICAgY29uc29sZS53YXJuKGAke2xvZ1ByZWZpeH0gU3RhY2sgdHJhY2U6YCwgc3RhY2tUcmFjZSk7XG4gIH1cblxuICAvLyBJbiBkZXZlbG9wbWVudCwgcHJvdmlkZSBhZGRpdGlvbmFsIGRlYnVnZ2luZyBpbmZvcm1hdGlvblxuICBpZiAodHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIHByb2Nlc3MuZW52Py5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50Jykge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgIGAke2xvZ1ByZWZpeH0gRGVidWcgaW5mbzpgLFxuICAgICAgJ1xcbi0gUmV0cmlldmVyIHR5cGU6JywgaXNJbnRlcm5hbCA/ICdJbnRlcm5hbCBmcmFtZXdvcmsgcmV0cmlldmVyJyA6ICdVc2VyLXByb3ZpZGVkIHJldHJpZXZlcicsXG4gICAgICAnXFxuLSBSb3V0ZTonLCByb3V0ZVBhdGgsXG4gICAgICAnXFxuLSBFcnJvciB0eXBlOicsIGVycm9yLmNvbnN0cnVjdG9yLm5hbWUsXG4gICAgICAnXFxuLSBUaW1lc3RhbXA6JywgY29udGV4dC50aW1lc3RhbXAsXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYW4gYWdncmVnYXRlIGVycm9yIGZyb20gbXVsdGlwbGUgZmF0YWwgcmV0cmlldmVyIGZhaWx1cmVzLlxuICogVGhpcyBlcnJvciBjYW4gYmUgY2F1Z2h0IGJ5IFJlYWN0IFJvdXRlcidzIGVycm9yIGJvdW5kYXJ5LlxuICpcbiAqIEBwYXJhbSB7QXJyYXk8e25hbWU6IHN0cmluZzsgZXJyb3I6IEVycm9yfT59IGZhdGFsRXJyb3JzIC0gQXJyYXkgb2YgZmF0YWwgZXJyb3JzXG4gKiBAcGFyYW0ge3N0cmluZ30gcm91dGVQYXRoIC0gUm91dGUgcGF0aCB3aGVyZSBmYWlsdXJlcyBvY2N1cnJlZFxuICogQHJldHVybnMge0Vycm9yfSBBZ2dyZWdhdGUgZXJyb3Igd2l0aCBkZXRhaWxzIG9mIGFsbCBmYWlsdXJlc1xuICpcbiAqIEBpbnRlcm5hbCBUaGlzIGlzIGEgZnV0dXJlIGVuaGFuY2VtZW50IGZvciBmYXRhbCByZXRyaWV2ZXIgc3VwcG9ydFxuICovXG5mdW5jdGlvbiBjcmVhdGVBZ2dyZWdhdGVFcnJvcihcbiAgZmF0YWxFcnJvcnM6IEFycmF5PHsgbmFtZTogc3RyaW5nOyBlcnJvcjogRXJyb3IgfT4sXG4gIHJvdXRlUGF0aDogc3RyaW5nLFxuKTogRXJyb3Ige1xuICBjb25zdCBlcnJvck1lc3NhZ2VzID0gZmF0YWxFcnJvcnNcbiAgICAubWFwKCh7IG5hbWUsIGVycm9yIH0pID0+IGAke25hbWV9OiAke2Vycm9yLm1lc3NhZ2V9YClcbiAgICAuam9pbignXFxuJyk7XG5cbiAgY29uc3QgYWdncmVnYXRlRXJyb3IgPSBuZXcgRXJyb3IoXG4gICAgYEZhdGFsIHJldHJpZXZlciBmYWlsdXJlcyBmb3Igcm91dGUgXCIke3JvdXRlUGF0aH1cIjpcXG4ke2Vycm9yTWVzc2FnZXN9YCxcbiAgKTtcblxuICAvLyBBdHRhY2ggYWRkaXRpb25hbCBjb250ZXh0IGZvciBlcnJvciBib3VuZGFyaWVzXG4gIChhZ2dyZWdhdGVFcnJvciBhcyBhbnkpLnJldHJpZXZlckVycm9ycyA9IGZhdGFsRXJyb3JzO1xuICAoYWdncmVnYXRlRXJyb3IgYXMgYW55KS5yb3V0ZVBhdGggPSByb3V0ZVBhdGg7XG5cbiAgcmV0dXJuIGFnZ3JlZ2F0ZUVycm9yO1xufVxuIiwgIi8qXG4gKiBFbGFzdGljIExpY2Vuc2UgMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiB3b3JrdGlmLnJ1bnRpbWUuY2RrIDx3b3JrdGlmX3J1bnRpbWVfY2RrPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBFbGFzdGljIExpY2Vuc2UgMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9saWNlbnNpbmcvZWxhc3RpYy1saWNlbnNlIGZvciBkZXRhaWxzLlxuICpcbiAqIFJlLWxpY2Vuc2luZyBub3RpY2U6XG4gKiAgIFRoaXMgZmlsZSB3YXMgcHJldmlvdXNseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgQnVzaW5lc3MgU291cmNlIExpY2Vuc2UgMS4xIChCVVNMLTEuMSkuXG4gKiAgIEFzIG9mIDIwMjUtMDktMjIsIGl0IGlzIHJlLWxpY2Vuc2VkIHVuZGVyIEVsYXN0aWMgTGljZW5zZSAyLjAuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVsYXN0aWMtMi4wXG4gKi9cblxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IFJvdXRlclByb3ZpZGVyIH0gZnJvbSAncmVhY3Qtcm91dGVyJztcblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBwcm9wZXJ0aWVzIHRoYXQgY2FuIGJlIHVzZWQgd2l0aGluIGEgY29tcG9uZW50LlxuICpcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFByb3BzXG4gKiBAcHJvcGVydHkge2FueX0gW3JvdXRlcl0gLSBBbiBvcHRpb25hbCBwcm9wZXJ0eSB0aGF0IG1heSBjb250YWluIHJvdXRlci1yZWxhdGVkIGluZm9ybWF0aW9uIG9yIG1ldGhvZHMuXG4gKi9cbnR5cGUgUHJvcHMgPSB7XG4gIHJvdXRlcj86IGFueTtcbn07XG5cbi8qKlxuICogUnVudGltZVJvdXRlclByb3ZpZGVyIGlzIGEgUmVhY3QgRnVuY3Rpb25hbCBDb21wb25lbnQgdGhhdCBzZXJ2ZXMgYXMgYSBjdXN0b21cbiAqIHJvdXRlciBwcm92aWRlciBmb3IgdGhlIGFwcGxpY2F0aW9uLiBJdCB3cmFwcyBhcm91bmQgYSBSb3V0ZXJQcm92aWRlciBjb21wb25lbnRcbiAqIGFuZCBhbGxvd3MgZm9yIGRlcGVuZGVuY3kgaW5qZWN0aW9uIG9mIGN1c3RvbSByb3V0ZXIgY29uZmlndXJhdGlvbnMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHByb3BzIC0gVGhlIHByb3BlcnRpZXMgb2JqZWN0LlxuICogQHBhcmFtIHtBcnJheX0gcHJvcHMucm91dGVyIC0gQW4gb3B0aW9uYWwgYXJyYXkgdG8gZGVmaW5lIGN1c3RvbSByb3V0ZXIgY29uZmlndXJhdGlvbnMuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdHMgdG8gYW4gZW1wdHkgYXJyYXkgaWYgbm90IHByb3ZpZGVkLlxuICogQHJldHVybnMge0pTWC5FbGVtZW50fSBUaGUgd3JhcHBlZCBSb3V0ZXJQcm92aWRlciBjb21wb25lbnQgd2l0aCB0aGUgcHJvdmlkZWQgY3VzdG9tIHJvdXRlci5cbiAqL1xuZXhwb3J0IGNvbnN0IFJ1bnRpbWVSb3V0ZXJQcm92aWRlcjogUmVhY3QuRkM8UHJvcHM+ID0gKHsgcm91dGVyIH0pID0+IHtcbiAgY29uc3QgW2N1cnJlbnRSb3V0ZXIsIHNldEN1cnJlbnRSb3V0ZXJdID0gdXNlU3RhdGUocm91dGVyKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHNldEN1cnJlbnRSb3V0ZXIocm91dGVyKTtcbiAgfSwgW3JvdXRlcl0pO1xuXG4gIHJldHVybiByb3V0ZXJcbiAgICA/IChcbiAgICAgIDxSb3V0ZXJQcm92aWRlclxuICAgICAgICBrZXk9eydydW50aW1lLXJvdXRlci1wcm92aWRlcid9XG4gICAgICAgIHJvdXRlcj17Y3VycmVudFJvdXRlcn1cbiAgICAgIC8+XG4gICAgKVxuICAgIDogbnVsbDtcbn07XG4iLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IHdvcmt0aWYucnVudGltZS5jZGsgPHdvcmt0aWZfcnVudGltZV9jZGs+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0yMiwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBDaGlsZHJlbiwgY2xvbmVFbGVtZW50LCBpc1ZhbGlkRWxlbWVudCwgUmVhY3RFbGVtZW50IH0gZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQgeyBJbmplY3RSb3V0ZXJPcHRpb25zLCBSdW50aW1lUm91dGVyUHJvdmlkZXJQcm9wcywgUmVhY3RDb21wb25lbnRQcm9wcyB9IGZyb20gJy4uL3J1bnRpbWUudXRpbHMudHlwZXMnO1xuXG4vKipcbiAqIENvbnN0cnVjdHMgYSByb3V0ZSBwYXRoIGJ5IGFwcGVuZGluZyBhIGdpdmVuIHBhdGggdG8gdGhlIGJhc2Ugcm91dGUgc3RhZ2UgZGVmaW5lZFxuICogaW4gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlICdQVVJFX0VOVl9ST1VURV9TVEFHRScuIFRoZSByZXN1bHRpbmcgcGF0aCBpcyBub3JtYWxpemVkXG4gKiBieSByZXBsYWNpbmcgbXVsdGlwbGUgY29uc2VjdXRpdmUgc2xhc2hlcyB3aXRoIGEgc2luZ2xlIHNsYXNoIGFuZCBlbnN1cmluZyBpdCBlbmRzXG4gKiB3aXRoIGEgdHJhaWxpbmcgc2xhc2guXG4gKlxuICogQHBhcmFtIHtzdHJpbmdbXX0gcGF0aCAtIEFuIGFycmF5IG9mIHBhdGggc2VnbWVudHMgdG8gYmUgYXBwZW5kZWQgdG8gdGhlIGJhc2Ugcm91dGUgc3RhZ2UuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgbm9ybWFsaXplZCByb3V0ZSBwYXRoLlxuICovXG5leHBvcnQgY29uc3Qgcm91dGVQYXRoID0gKHBhdGg6IHN0cmluZ1tdKSA9PiB7XG4gIHJldHVybiAnLycuY29uY2F0KFsuLi5wYXRoXS5qb2luKCcvJykpLnJlcGxhY2UoL1xcLysvZywgJy8nKTtcbn07XG5cblxuLyoqXG4gKiBJbmplY3RzIGEgcm91dGluZyBmbG93IGludG8gdGhlIHByb3ZpZGVkIFJlYWN0IGNoaWxkcmVuIGVsZW1lbnRzIGJ5IG1hcHBpbmcgb3ZlciB0aGVtIGFuZCBhdWdtZW50aW5nIHdpdGggdGhlIHJvdXRlciBpbnN0YW5jZS5cbiAqXG4gKiBUaGlzIG1ldGhvZCByZWN1cnNpdmVseSB0cmF2ZXJzZXMgdGhlIFJlYWN0IGNvbXBvbmVudCB0cmVlIGFuZCBpbmplY3RzIHRoZSByb3V0ZXIgaW5zdGFuY2UgaW50b1xuICogY29tcG9uZW50cyB0aGF0IGFyZSBpZGVudGlmaWVkIGFzIGBSdW50aW1lUm91dGVyUHJvdmlkZXJgIGJ5IHRoZWlyIGRpc3BsYXlOYW1lIG9yIG5hbWUuXG4gKlxuICogQHBhcmFtIHtJbmplY3RSb3V0ZXJPcHRpb25zfSBwYXJhbXMgLSBDb250YWlucyB0aGUgY2hpbGRyZW4gZWxlbWVudHMgdG8gcHJvY2VzcyBhbmQgdGhlIHJvdXRlciBpbnN0YW5jZSB0byBpbmplY3QuXG4gKiBAcGFyYW0ge1JlYWN0RWxlbWVudDxSZWFjdENvbXBvbmVudFByb3BzPltdfSBwYXJhbXMuY2hpbGRyZW4gLSBUaGUgY2hpbGQgY29tcG9uZW50cyB0byB3aGljaCB0aGUgcm91dGVyIGZ1bmN0aW9uYWxpdHkgd2lsbCBiZSBpbmplY3RlZC5cbiAqIEBwYXJhbSB7YW55fSBwYXJhbXMucm91dGVyIC0gVGhlIHJvdXRlciBpbnN0YW5jZSB0byBiZSBpbmplY3RlZCBpbnRvIHRoZSBjaGlsZCBjb21wb25lbnRzLlxuICogQHJldHVybiB7UmVhY3RFbGVtZW50PFJlYWN0Q29tcG9uZW50UHJvcHM+W119IFJldHVybnMgdGhlIG1vZGlmaWVkIGNoaWxkcmVuIGVsZW1lbnRzIHdpdGggdGhlIHJvdXRlciBpbmplY3RlZCB3aGVyZSBhcHBsaWNhYmxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0RmxvdyhcbiAgeyBjaGlsZHJlbiwgcm91dGVyIH06IEluamVjdFJvdXRlck9wdGlvbnMsXG4pOiBSZWFjdEVsZW1lbnQ8UmVhY3RDb21wb25lbnRQcm9wcz5bXSB7XG4gIGlmICghY2hpbGRyZW4pIHtcbiAgICBjb25zb2xlLndhcm4oJ1tSdW50aW1lUm91dGVyXSBpbmplY3RGbG93IGNhbGxlZCB3aXRoIG5vIGNoaWxkcmVuJyk7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgaWYgKCFyb3V0ZXIpIHtcbiAgICBjb25zb2xlLndhcm4oJ1tSdW50aW1lUm91dGVyXSBpbmplY3RGbG93IGNhbGxlZCB3aXRoIG5vIHJvdXRlcicpO1xuICAgIHJldHVybiBDaGlsZHJlbi50b0FycmF5KGNoaWxkcmVuKSBhcyBSZWFjdEVsZW1lbnQ8UmVhY3RDb21wb25lbnRQcm9wcz5bXTtcbiAgfVxuXG4gIHJldHVybiBDaGlsZHJlbi5tYXA8UmVhY3RFbGVtZW50PFJlYWN0Q29tcG9uZW50UHJvcHM+LCBSZWFjdEVsZW1lbnQ8UmVhY3RDb21wb25lbnRQcm9wcz4+KFxuICAgIGNoaWxkcmVuLFxuICAgIChjaGlsZDogUmVhY3RFbGVtZW50PFJlYWN0Q29tcG9uZW50UHJvcHM+KTogUmVhY3RFbGVtZW50PFJlYWN0Q29tcG9uZW50UHJvcHM+ID0+IHtcbiAgICAgIC8vIFNraXAgbm9uLXZhbGlkIFJlYWN0IGVsZW1lbnRzXG4gICAgICBpZiAoIWlzVmFsaWRFbGVtZW50KGNoaWxkKSkge1xuICAgICAgICByZXR1cm4gY2hpbGQ7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYSBSdW50aW1lUm91dGVyUHJvdmlkZXIgY29tcG9uZW50XG4gICAgICBjb25zdCB0eXBlTmFtZSA9IChjaGlsZC50eXBlIGFzIGFueSk/LmRpc3BsYXlOYW1lIHx8IChjaGlsZC50eXBlIGFzIGFueSk/Lm5hbWU7XG5cbiAgICAgIGlmICh0eXBlTmFtZSA9PT0gJ1J1bnRpbWVSb3V0ZXJQcm92aWRlcicpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ1tSdW50aW1lUm91dGVyXSBJbmplY3Rpbmcgcm91dGVyIGluc3RhbmNlIGludG8gUnVudGltZVJvdXRlclByb3ZpZGVyJyk7XG4gICAgICAgIHJldHVybiBSZWFjdC5jbG9uZUVsZW1lbnQoXG4gICAgICAgICAgY2hpbGQgYXMgUmVhY3RFbGVtZW50PFJ1bnRpbWVSb3V0ZXJQcm92aWRlclByb3BzPixcbiAgICAgICAgICB7IC4uLmNoaWxkLnByb3BzLCByb3V0ZXIgfSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gUmVjdXJzaXZlbHkgcHJvY2VzcyBjaGlsZHJlblxuICAgICAgaWYgKChjaGlsZC5wcm9wcyBhcyBSZWFjdENvbXBvbmVudFByb3BzKS5jaGlsZHJlbikge1xuICAgICAgICByZXR1cm4gY2xvbmVFbGVtZW50KGNoaWxkLCB7XG4gICAgICAgICAgY2hpbGRyZW46IGluamVjdEZsb3coe1xuICAgICAgICAgICAgY2hpbGRyZW46IGNoaWxkLnByb3BzLmNoaWxkcmVuLFxuICAgICAgICAgICAgcm91dGVyLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNoaWxkO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIENvbXB1dGVzIHRoZSBpbnRlcnNlY3Rpb24gb2YgdHdvIGFycmF5cywgcmV0dXJuaW5nIGFuIGFycmF5IHRoYXQgY29udGFpbnMgb25seSB0aGUgZWxlbWVudHNcbiAqIHRoYXQgYXJlIHByZXNlbnQgaW4gYm90aCBpbnB1dCBhcnJheXMuIER1cGxpY2F0ZSB2YWx1ZXMgaW4gdGhlIGlucHV0IGFycmF5cyBhcmUgaWdub3JlZC5cbiAqIGludGVyc2VjdGlvblxuICogQHBhcmFtIHtUW119IGFycjEgLSBUaGUgZmlyc3QgaW5wdXQgYXJyYXkuXG4gKiBAcGFyYW0ge1RbXX0gYXJyMiAtIFRoZSBzZWNvbmQgaW5wdXQgYXJyYXkuXG4gKiBAcmV0dXJuIHtUW119IEFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIHRoYXQgYXJlIHByZXNlbnQgaW4gYm90aCBgYXJyMWAgYW5kIGBhcnIyYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGludGVyc2VjdGlvbjxUPihhcnIxOiBUW10sIGFycjI6IFRbXSk6IFRbXSB7XG4gIGNvbnN0IHNldDEgPSBuZXcgU2V0KGFycjEpO1xuICBjb25zdCBzZXQyID0gbmV3IFNldChhcnIyKTtcbiAgY29uc3QgcmVzdWx0OiBUW10gPSBbXTtcblxuICBBcnJheS5mcm9tKHNldDEpLmZvckVhY2goaXRlbSA9PiB7XG4gICAgaWYgKHNldDIuaGFzKGl0ZW0pKSB7XG4gICAgICByZXN1bHQucHVzaChpdGVtKTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbiIsICIvKlxuICogRWxhc3RpYyBMaWNlbnNlIDIuMFxuICogQ29weXJpZ2h0IChDKSAyMDI1XHUyMDEzcHJlc2VudCBSYW1hbiBNYXJvemF1LCBXb3JrIFRhcmdldCBJbnNpZ2h0IEZ1bmN0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQ29udGFjdDogcmFtYW5Ad29ya3RpZi5jb21cbiAqXG4gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGljZW5zZWQgV29yazogd29ya3RpZi5ydW50aW1lLmNkayA8d29ya3RpZl9ydW50aW1lX2Nkaz4uXG4gKiBVc2Ugb2YgdGhpcyBzb2Z0d2FyZSBpcyBnb3Zlcm5lZCBieSB0aGUgRWxhc3RpYyBMaWNlbnNlIDIuMDsgc2VlIHRoZSBMSUNFTlNFIGZpbGVcbiAqIG9yIGh0dHBzOi8vd3d3LmVsYXN0aWMuY28vbGljZW5zaW5nL2VsYXN0aWMtbGljZW5zZSBmb3IgZGV0YWlscy5cbiAqXG4gKiBSZS1saWNlbnNpbmcgbm90aWNlOlxuICogICBUaGlzIGZpbGUgd2FzIHByZXZpb3VzbHkgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJ1c2luZXNzIFNvdXJjZSBMaWNlbnNlIDEuMSAoQlVTTC0xLjEpLlxuICogICBBcyBvZiAyMDI1LTA5LTIyLCBpdCBpcyByZS1saWNlbnNlZCB1bmRlciBFbGFzdGljIExpY2Vuc2UgMi4wLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFbGFzdGljLTIuMFxuICovXG5cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IFJvdXRlT2JqZWN0IH0gZnJvbSAncmVhY3Qtcm91dGVyJztcblxuaW1wb3J0IHsgUnVudGltZVJvdXRlIH0gZnJvbSAnLi9ydW50aW1lLnJvdXRlci50eXBlcyc7XG5pbXBvcnQgeyBjcmVhdGVSb3V0ZUxvYWRlciB9IGZyb20gJy4vcnVudGltZS5yb3V0ZXIubG9hZGVyJztcbmltcG9ydCB7IGludGVyc2VjdGlvbiwgcm91dGVQYXRoIH0gZnJvbSAnLi9ydW50aW1lLnJvdXRlci51dGlscyc7XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgZGVmYXVsdCB0eXBlIGZvciBkZWZpbmluZyByb3V0ZSBvYmplY3RzIGluIHRoZSBhcHBsaWNhdGlvbi5cbiAqIEl0IGNvbWJpbmVzIHRoZSBwcm9wZXJ0aWVzIG9mIGBSb3V0ZU9iamVjdGAgd2l0aCBhbiBvcHRpb25hbCBgaW5kZXhgIHByb3BlcnR5LlxuICpcbiAqIEB0eXBlZGVmIHtSb3V0ZU9iamVjdH0gUnVudGltZVJvdXRlckRlZmF1bHRzXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtpbmRleF0gT3B0aW9uYWwgcHJvcGVydHkgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSByb3V0ZSBpcyBhbiBpbmRleCByb3V0ZS5cbiAqL1xuZXhwb3J0IHR5cGUgUnVudGltZVJvdXRlckRlZmF1bHRzID0gUm91dGVPYmplY3QgJiB7IGluZGV4PzogYm9vbGVhbjsgW2tleTogc3RyaW5nXTogYW55IH07XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIHJvdXRlciBjb25maWd1cmF0aW9uIG9iamVjdCBmb3IgdGhlIFJ1bnRpbWUgYXBwbGljYXRpb24uXG4gKlxuICogQHR5cGVkZWYge09iamVjdH0gUnVudGltZVJvdXRlclxuICogQHByb3BlcnR5IHtSdW50aW1lUm91dGVbXX0gcm91dGVyIC0gQW4gYXJyYXkgb2YgUnVudGltZSByb3V0ZSBvYmplY3RzIGRlZmluaW5nIHRoZSBhcHBsaWNhdGlvbidzIHJvdXRpbmcgc3RydWN0dXJlLlxuICogQHByb3BlcnR5IHtSdW50aW1lUm91dGVyRGVmYXVsdHN9IFtkZWZhdWx0c10gLSBPcHRpb25hbCBkZWZhdWx0IGNvbmZpZ3VyYXRpb25zIGZvciB0aGUgcm91dGVyLlxuICpcbiAqIEB0b2RvIHYyIHwgR3JhcGhRTCBsb2FkZXJzXG4gKi9cbmV4cG9ydCB0eXBlIFJ1bnRpbWVSb3V0ZXJPcHRpb25zID0ge1xuICByb3V0ZXI6IFJ1bnRpbWVSb3V0ZVtdO1xuICBkZWZhdWx0czogUnVudGltZVJvdXRlckRlZmF1bHRzO1xuICAvLyBAdG9kbzogdjIgfCBHcmFwaFFMIGxvYWRlcnNcbiAgLy8gLi4uXG59XG5cbmV4cG9ydCBjbGFzcyBSdW50aW1lUm91dGVyIHtcbiAgLyoqXG4gICAqIFJlcHJlc2VudHMgdGhlIGNvbGxlY3Rpb24gb2Ygcm91dGUgY29uZmlndXJhdGlvbnMgZm9yIGFuIGFwcGxpY2F0aW9uLlxuICAgKiBFYWNoIHJvdXRlIG9iamVjdCBkZWZpbmVzIGEgcGF0aCwgYXNzb2NpYXRlZCBjb21wb25lbnQsIGFuZCBhZGRpdGlvbmFsIG9wdGlvbnMgb3IgbmVzdGVkIHJvdXRlcy5cbiAgICpcbiAgICogVGhlIGBfcm91dGVyYCB2YXJpYWJsZSBpcyBhIG1hcCBvZiByb3V0ZSBvYmplY3RzIGtleWVkIGJ5IHJvdXRlIElELCB3aGVyZSBlYWNoIG9iamVjdCBjb25mb3JtcyB0byB0aGVcbiAgICogc3RydWN0dXJlIGRlZmluZWQgYnkgdGhlIGBSb3V0ZU9iamVjdGAgdHlwZS4gVGhpcyBpcyB0eXBpY2FsbHkgdXNlZCBpbiByb3V0aW5nIGxpYnJhcmllc1xuICAgKiB0byBjb25maWd1cmUgbmF2aWdhdGlvbiBhbmQgdmlldyByZW5kZXJpbmcuXG4gICAqXG4gICAqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBSb3V0ZU9iamVjdD59XG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9yb3V0ZXI6IHsgW2tleTogc3RyaW5nXTogUm91dGVPYmplY3QgfTtcblxuXG4gIC8qKlxuICAgKiBSZXByZXNlbnRzIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgZm9yIGEgYFJ1bnRpbWVSb3V0ZXJgLlxuICAgKlxuICAgKiBUaGlzIHZhcmlhYmxlIHN0b3JlcyBhbiBpbnN0YW5jZSBvZiBgUnVudGltZVJvdXRlckRlZmF1bHRzYCxcbiAgICogd2hpY2ggc2VydmVzIGFzIHRoZSBiYXNlIGNvbmZpZ3VyYXRpb24gZm9yIGluaXRpYWxpemluZyBvciBtb2RpZnlpbmdcbiAgICogYSBgUnVudGltZVJvdXRlcmAuXG4gICAqXG4gICAqIEFkanVzdGluZyB0aGVzZSBkZWZhdWx0cyBhbGxvd3MgZm9yIGFsdGVyaW5nIHRoZSBiZWhhdmlvciBvZlxuICAgKiB0aGUgcm91dGVyIHRvIGJldHRlciBzdWl0IGFwcGxpY2F0aW9uIHJlcXVpcmVtZW50cy5cbiAgICpcbiAgICogSXQgaXMgcmVjb21tZW5kZWQgdG8gY2FyZWZ1bGx5IG1hbmFnZSBtb2RpZmljYXRpb25zIHRvIGBfZGVmYXVsdHNgXG4gICAqIHRvIG1haW50YWluIGNvbnNpc3RlbnQgYW5kIHByZWRpY3RhYmxlIHJvdXRpbmcgZnVuY3Rpb25hbGl0eS5cbiAgICpcbiAgICogQHR5cGUge1J1bnRpbWVSb3V0ZXJEZWZhdWx0c31cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX2RlZmF1bHRzOiBSdW50aW1lUm91dGVyRGVmYXVsdHM7XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFJ1bnRpbWVSb3V0ZXIgd2l0aCB0aGUgc3BlY2lmaWVkIHJvdXRlciBhbmQgZGVmYXVsdCBvcHRpb25zLlxuICAgKlxuICAgKiBUaGlzIGNvbnN0cnVjdG9yIHRyYW5zZm9ybXMgUnVudGltZVJvdXRlIHJvdXRlcyBpbnRvIFJlYWN0IFJvdXRlciBSb3V0ZU9iamVjdCByb3V0ZXMsXG4gICAqIGdlbmVyYXRpbmcgbG9hZGVycyBmb3Igcm91dGVzIHdpdGggcnVudGltZUFzeW5jIGFuZCBhcHBseWluZyBkZWZhdWx0IHNldHRpbmdzLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIHRvIGluaXRpYWxpemUgdGhlIGNvbnN0cnVjdG9yIHdpdGguXG4gICAqIEBwYXJhbSB7UnVudGltZVJvdXRlW119IG9wdGlvbnMucm91dGVyIC0gQXJyYXkgb2YgUnVudGltZSByb3V0ZSBvYmplY3RzIHRvIGJlIG1hbmFnZWQuXG4gICAqIEBwYXJhbSB7UnVudGltZVJvdXRlckRlZmF1bHRzfSBvcHRpb25zLmRlZmF1bHRzIC0gVGhlIGRlZmF1bHQgc2V0dGluZ3MgZm9yIGFsbCByb3V0ZXMuXG4gICAqIEByZXR1cm4ge3ZvaWR9IEluaXRpYWxpemVzIHRoZSBjbGFzcyBpbnN0YW5jZS5cbiAgICogQHRocm93cyB7RXJyb3J9IElmIHJvdXRlciBhcnJheSBpcyBlbXB0eSBvciByb3V0ZXMgYXJlIG1pc3NpbmcgcmVxdWlyZWQgcHJvcGVydGllc1xuICAgKi9cbiAgY29uc3RydWN0b3IoeyByb3V0ZXIsIGRlZmF1bHRzIH06IFJ1bnRpbWVSb3V0ZXJPcHRpb25zKSB7XG4gICAgLy8gVmFsaWRhdGUgaW5wdXRzXG4gICAgaWYgKCFyb3V0ZXIgfHwgIUFycmF5LmlzQXJyYXkocm91dGVyKSB8fCByb3V0ZXIubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1tSdW50aW1lUm91dGVyXSBJbnZhbGlkIHJvdXRpbmcgY29uZmlndXJhdGlvbjogcm91dGUgZGVmaW5pdGlvbnMgbXVzdCBiZSBwcm92aWRlZCBhcyBhIG5vbi1lbXB0eSBhcnJheScpO1xuICAgIH1cblxuICAgIGlmICghZGVmYXVsdHMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignW1J1bnRpbWVSb3V0ZXJdIEludmFsaWQgY29uZmlndXJhdGlvbjogcnVudGltZSBjb25maWd1cmF0aW9uIHJvdXRlciBkZWZhdWx0cyBvYmplY3QgaXMgcmVxdWlyZWQnKTtcbiAgICB9XG5cbiAgICB0aGlzLl9kZWZhdWx0cyA9IGRlZmF1bHRzO1xuXG4gICAgLy8gVHJhbnNmb3JtIFJ1bnRpbWVSb3V0ZVtdIHRvIFJvdXRlT2JqZWN0W10gd2l0aCBnZW5lcmF0ZWQgbG9hZGVyc1xuICAgIGNvbnN0IHRyYW5zZm9ybWVkUm91dGVzID0gdGhpcy50cmFuc2Zvcm1Sb3V0ZXMocm91dGVyKTtcblxuICAgIGNvbnN0IGRlZmF1bHRzS2V5czogc3RyaW5nW10gPSBPYmplY3Qua2V5cyh0aGlzLl9kZWZhdWx0cyk7XG5cbiAgICAvLyBCdWlsZCByb3V0ZXIgbWFwIHdpdGggZGVmYXVsdHMgYXBwbGllZFxuICAgIHRoaXMuX3JvdXRlciA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIHRyYW5zZm9ybWVkUm91dGVzLm1hcCgocm91dGU6IFJvdXRlT2JqZWN0LCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgIC8vIEVuc3VyZSByb3V0ZSBoYXMgYW4gSURcbiAgICAgICAgaWYgKCFyb3V0ZS5pZCkge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgW1J1bnRpbWVSb3V0ZXJdIFJvdXRlIGF0IGluZGV4ICR7aW5kZXh9IG1pc3NpbmcgSUQsIGdlbmVyYXRpbmcgb25lYCk7XG4gICAgICAgICAgcm91dGUuaWQgPSBgcm91dGUtJHtpbmRleH1gO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQXBwbHkgZGVmYXVsdHMgdG8gcm91dGUgKG9ubHkgZm9yIGtleXMgbm90IGFscmVhZHkgcHJlc2VudClcbiAgICAgICAgY29uc3Qgcm91dGVyS2V5czogc3RyaW5nW10gPSBPYmplY3Qua2V5cyhyb3V0ZSk7XG4gICAgICAgIGNvbnN0IGludGVyc2VjdGVkOiBzdHJpbmdbXSA9IGludGVyc2VjdGlvbihkZWZhdWx0c0tleXMsIHJvdXRlcktleXMpO1xuXG4gICAgICAgIGRlZmF1bHRzS2V5cy5mb3JFYWNoKChrZXk6IGtleW9mIFJ1bnRpbWVSb3V0ZXJEZWZhdWx0cyB8IHN0cmluZykgPT4ge1xuICAgICAgICAgIGlmICghaW50ZXJzZWN0ZWQuaW5jbHVkZXMoa2V5IGFzIHN0cmluZykpIHtcbiAgICAgICAgICAgIChyb3V0ZSBhcyBhbnkpW2tleSBhcyBrZXlvZiBSb3V0ZU9iamVjdF0gPSAoZGVmYXVsdHMgYXMgYW55KVtrZXkgYXMga2V5b2YgUm91dGVPYmplY3RdO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIFtyb3V0ZS5pZCwgcm91dGVdO1xuICAgICAgfSksXG4gICAgKTtcblxuICAgIGNvbnNvbGUubG9nKGBbUnVudGltZVJvdXRlcl0gUm91dGluZyBncmFwaCBpbml0aWFsaXplZCB3aXRoICR7T2JqZWN0LmtleXModGhpcy5fcm91dGVyKS5sZW5ndGh9IHJvdXRlIGRlZmluaXRpb24ocylgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFuc2Zvcm1zIGFuIGFycmF5IG9mIFJ1bnRpbWVSb3V0ZSBpbnRvIFJlYWN0IFJvdXRlciBSb3V0ZU9iamVjdCBhcnJheS5cbiAgICogUmVjdXJzaXZlbHkgcHJvY2Vzc2VzIG5lc3RlZCByb3V0ZXMgYW5kIGdlbmVyYXRlcyBsb2FkZXJzIGZvciByb3V0ZXMgd2l0aCBydW50aW1lQXN5bmMuXG4gICAqXG4gICAqIEBwYXJhbSB7UnVudGltZVJvdXRlW119IHJvdXRlcyAtIEFycmF5IG9mIFJ1bnRpbWUgcm91dGUgb2JqZWN0cyB0byB0cmFuc2Zvcm1cbiAgICogQHJldHVybiB7Um91dGVPYmplY3RbXX0gQXJyYXkgb2YgUmVhY3QgUm91dGVyIHJvdXRlIG9iamVjdHMgd2l0aCBnZW5lcmF0ZWQgbG9hZGVyc1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSB0cmFuc2Zvcm1Sb3V0ZXMocm91dGVzOiBSdW50aW1lUm91dGVbXSk6IFJvdXRlT2JqZWN0W10ge1xuICAgIHJldHVybiByb3V0ZXMubWFwKHJvdXRlID0+IHRoaXMudHJhbnNmb3JtUm91dGUocm91dGUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFuc2Zvcm1zIGEgc2luZ2xlIFJ1bnRpbWVSb3V0ZSBpbnRvIGEgUmVhY3QgUm91dGVyIFJvdXRlT2JqZWN0LlxuICAgKiBHZW5lcmF0ZXMgYSBsb2FkZXIgZnVuY3Rpb24gaWYgcnVudGltZUFzeW5jIGlzIHByZXNlbnQsIHJlY3Vyc2l2ZWx5IHRyYW5zZm9ybXMgY2hpbGRyZW4sXG4gICAqIGFuZCBlbnN1cmVzIHJ1bnRpbWVBc3luYyBwcm9wZXJ0eSBpcyBub3QgcGFzc2VkIHRvIFJlYWN0IFJvdXRlci5cbiAgICpcbiAgICogQHBhcmFtIHtSdW50aW1lUm91dGV9IHJvdXRlIC0gUnVudGltZSByb3V0ZSBvYmplY3QgdG8gdHJhbnNmb3JtXG4gICAqIEByZXR1cm4ge1JvdXRlT2JqZWN0fSBSZWFjdCBSb3V0ZXIgcm91dGUgb2JqZWN0IHdpdGggZ2VuZXJhdGVkIGxvYWRlclxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSB0cmFuc2Zvcm1Sb3V0ZShyb3V0ZTogUnVudGltZVJvdXRlKTogUm91dGVPYmplY3Qge1xuICAgIGNvbnN0IHsgcGF0aCwgcnVudGltZUFzeW5jLCBjaGlsZHJlbiwgaW5kZXgsIC4uLnJvdXRlUHJvcHMgfSA9IHJvdXRlO1xuICAgIGNvbnN0IHJvdXRlUGF0aG5hbWUgPSByb3V0ZVBhdGgoW3BhdGggPz8gJy8nXSk7XG5cblxuICAgIC8vIEdlbmVyYXRlIGxvYWRlciBmb3IgdGhpcyByb3V0ZVxuICAgIC8vIEV2ZW4gcm91dGVzIHdpdGhvdXQgcnVudGltZUFzeW5jIGdldCBhIGxvYWRlciAoZm9yIGludGVybmFsIFNFTyByZXRyaWV2ZXIpXG4gICAgY29uc3QgbG9hZGVyID0gY3JlYXRlUm91dGVMb2FkZXIoXG4gICAgICByb3V0ZVBhdGhuYW1lLFxuICAgICAgcnVudGltZUFzeW5jIHx8IFtdLFxuICAgICk7XG5cbiAgICAvLyBSZWN1cnNpdmVseSB0cmFuc2Zvcm0gY2hpbGRyZW5cbiAgICBjb25zdCB0cmFuc2Zvcm1lZENoaWxkcmVuID0gY2hpbGRyZW5cbiAgICAgID8gdGhpcy50cmFuc2Zvcm1Sb3V0ZXMoY2hpbGRyZW4pXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIC8vIFJldHVybiBSb3V0ZU9iamVjdCB3aXRob3V0IHJ1bnRpbWVBc3luYyBwcm9wZXJ0eVxuICAgIC8vIE5vdGU6IGluZGV4IHJvdXRlcyBjYW5ub3QgaGF2ZSBsb2FkZXJzLCBzbyB3ZSBleGNsdWRlIGluZGV4IGlmIHByZXNlbnRcbiAgICBjb25zdCByZXN1bHQ6IFJvdXRlT2JqZWN0ID0ge1xuICAgICAgLi4ucm91dGVQcm9wcyxcbiAgICAgIHBhdGg6IHJvdXRlUGF0aG5hbWUsXG4gICAgICBsb2FkZXIsXG4gICAgICBjaGlsZHJlbjogdHJhbnNmb3JtZWRDaGlsZHJlbixcbiAgICB9O1xuXG4gICAgLy8gT25seSBhZGQgaW5kZXggaWYgaXQncyBleHBsaWNpdGx5IGZhbHNlIChpbmRleCByb3V0ZXMgY2FuJ3QgaGF2ZSBsb2FkZXJzKVxuICAgIGlmIChpbmRleCA9PT0gZmFsc2UpIHtcbiAgICAgIHJlc3VsdC5pbmRleCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIGFsbCByb3V0ZSBvYmplY3RzIGFzIGFuIGFycmF5LlxuICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGZvciBjcmVhdGluZyBicm93c2VyIHJvdXRlcnMgYW5kIHNlcnZlcmxlc3MgcmVuZGVyaW5nIHN0YXRpYyBoYW5kbGVycy5cbiAgICpcbiAgICogQHJldHVybiB7Um91dGVPYmplY3RbXX0gQXJyYXkgb2YgYWxsIHJvdXRlIG9iamVjdHMgbWFuYWdlZCBieSB0aGlzIHJvdXRlclxuICAgKi9cbiAgZ2V0Um91dGVzKCk6IFJvdXRlT2JqZWN0W10ge1xuICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMuX3JvdXRlcik7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYSByb3V0ZSBieSBpdHMgSUQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgcm91dGVcbiAgICogQHJldHVybiB7Um91dGVPYmplY3QgfCB1bmRlZmluZWR9IFRoZSByb3V0ZSBvYmplY3QgaWYgZm91bmQsIHVuZGVmaW5lZCBvdGhlcndpc2VcbiAgICovXG4gIGdldFJvdXRlQnlJZChpZDogc3RyaW5nKTogUm91dGVPYmplY3QgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9yb3V0ZXJbaWRdO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIGEgcm91dGUgYnkgaXRzIHBhdGguXG4gICAqIFVzZWZ1bCBmb3Igc2VydmVybGVzcyByZW5kZXJpbmcgcm91dGUgcmVzb2x1dGlvbiBhbmQgbmF2aWdhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBUaGUgcGF0aCB0byBzZWFyY2ggZm9yXG4gICAqIEByZXR1cm4ge1JvdXRlT2JqZWN0IHwgdW5kZWZpbmVkfSBUaGUgcm91dGUgb2JqZWN0IGlmIGZvdW5kLCB1bmRlZmluZWQgb3RoZXJ3aXNlXG4gICAqL1xuICBnZXRSb3V0ZUJ5UGF0aChwYXRoOiBzdHJpbmcpOiBSb3V0ZU9iamVjdCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Um91dGVzKCkuZmluZCgocm91dGUpID0+IHJvdXRlLnBhdGggPT09IHBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgY3VycmVudCBsaXN0IG9mIHJvdXRlIG9iamVjdHMgbWFuYWdlZCBieSB0aGUgcm91dGVyLlxuICAgKlxuICAgKiBAcmV0dXJuIHtSb3V0ZU9iamVjdFtdfSBBbiBhcnJheSBvZiByb3V0ZSBvYmplY3RzIHJlcHJlc2VudGluZyB0aGUgYXZhaWxhYmxlIHJvdXRlcy5cbiAgICovXG4gIGdldCByb3V0ZXMoKTogUm91dGVPYmplY3RbXSB7XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5fcm91dGVyKTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGZvciB0aGUgUnVudGltZVJvdXRlci5cbiAgICpcbiAgICogQHJldHVybiB7UnVudGltZVJvdXRlckRlZmF1bHRzfSBUaGUgZGVmYXVsdCBzZXR0aW5ncyBvZiB0aGUgcm91dGVyLlxuICAgKi9cbiAgZ2V0IGRlZmF1bHRzKCk6IFJ1bnRpbWVSb3V0ZXJEZWZhdWx0cyB7XG4gICAgcmV0dXJuIHRoaXMuX2RlZmF1bHRzO1xuICB9XG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZXMgYW5kIHJldHVybnMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFJ1bnRpbWVSb3V0ZXIuXG4gKiBUaGlzIGlzIHRoZSBtYWluIGVudHJ5IHBvaW50IGZvciBjcmVhdGluZyBhIFJ1bnRpbWUgcm91dGVyIHdpdGggYXV0b21hdGljIGRhdGEgbG9hZGluZy5cbiAqXG4gKiBUaGUgcm91dGVyIHRyYW5zZm9ybXMgUnVudGltZVJvdXRlIHJvdXRlcyBpbnRvIFJlYWN0IFJvdXRlciByb3V0ZXMgd2l0aCBnZW5lcmF0ZWQgbG9hZGVyc1xuICogdGhhdCBleGVjdXRlIGRhdGEgcmV0cmlldmVycyBpbiBwYXJhbGxlbCBhbmQgbWFuYWdlIFNFTyBtZXRhZGF0YSBhdXRvbWF0aWNhbGx5LlxuICpcbiAqIEBwYXJhbSB7UnVudGltZVJvdXRlck9wdGlvbnN9IG9wdGlvbnMgLSBBbiBvYmplY3QgY29udGFpbmluZyBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSByb3V0ZXIuXG4gKiBAcmV0dXJuIHtSdW50aW1lUm91dGVyfSBBIG5ldyBpbnN0YW5jZSBvZiB0aGUgUnVudGltZVJvdXRlciBjb25maWd1cmVkIHdpdGggdGhlIHByb3ZpZGVkIG9wdGlvbnMuXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEJhc2ljIHVzYWdlIHdpdGggcnVudGltZUFzeW5jIGRhdGEgcmV0cmlldmVyc1xuICogaW1wb3J0IHsgcnVudGltZVJvdXRlciB9IGZyb20gJ0B3b3JrdGlmL3J1bnRpbWUnO1xuICpcbiAqIGNvbnN0IHJvdXRlciA9IHJ1bnRpbWVSb3V0ZXIoe1xuICogICByb3V0ZXI6IFtcbiAqICAgICB7XG4gKiAgICAgICBwYXRoOiAnLycsXG4gKiAgICAgICBlbGVtZW50OiA8SG9tZVBhZ2UgLz4sXG4gKiAgICAgICBydW50aW1lQXN5bmM6IFtcbiAqICAgICAgICAgYXN5bmMgKHsgcGFyYW1zLCByZXF1ZXN0LCBzZWFyY2hQYXJhbXMgfSkgPT4ge1xuICogICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBmZXRjaEhvbWVEYXRhKCk7XG4gKiAgICAgICAgICAgcmV0dXJuIHsgaG9tZURhdGE6IGRhdGEgfTtcbiAqICAgICAgICAgfVxuICogICAgICAgXVxuICogICAgIH0sXG4gKiAgICAge1xuICogICAgICAgcGF0aDogJy9wcm9kdWN0cy86aWQnLFxuICogICAgICAgZWxlbWVudDogPFByb2R1Y3RQYWdlIC8+LFxuICogICAgICAgcnVudGltZUFzeW5jOiBbXG4gKiAgICAgICAgIGFzeW5jICh7IHBhcmFtcyB9KSA9PiB7XG4gKiAgICAgICAgICAgY29uc3QgcHJvZHVjdCA9IGF3YWl0IGZldGNoUHJvZHVjdChwYXJhbXMuaWQpO1xuICogICAgICAgICAgIHJldHVybiB7IHByb2R1Y3QgfTtcbiAqICAgICAgICAgfSxcbiAqICAgICAgICAgYXN5bmMgKHsgcGFyYW1zIH0pID0+IHtcbiAqICAgICAgICAgICBjb25zdCByZXZpZXdzID0gYXdhaXQgZmV0Y2hSZXZpZXdzKHBhcmFtcy5pZCk7XG4gKiAgICAgICAgICAgcmV0dXJuIHsgcmV2aWV3cyB9O1xuICogICAgICAgICB9XG4gKiAgICAgICBdXG4gKiAgICAgfVxuICogICBdLFxuICogICBkZWZhdWx0czoge1xuICogICAgIGVycm9yRWxlbWVudDogPEVycm9yQm91bmRhcnkgLz5cbiAqICAgfVxuICogfSk7XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFVzaW5nIHRoZSByb3V0ZXIgd2l0aCBSdW50aW1lIFJvdXRlclxuICogaW1wb3J0IHsgUnVudGltZVJvdXRlclByb3ZpZGVyIH0gZnJvbSAnQHdvcmt0aWYvcnVudGltZSc7XG4gKlxuICogZnVuY3Rpb24gQXBwKCkge1xuICogICByZXR1cm4gPFJ1bnRpbWVSb3V0ZXJQcm92aWRlciByb3V0ZXI9e3JvdXRlcn0gLz47XG4gKiB9XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEFjY2Vzc2luZyBkYXRhIGluIGNvbXBvbmVudHNcbiAqIGltcG9ydCB7IHVzZVJ1bnRpbWVEYXRhIH0gZnJvbSAnQHdvcmt0aWYvcnVudGltZSc7XG4gKlxuICogZnVuY3Rpb24gUHJvZHVjdFBhZ2UoKSB7XG4gKiAgIGNvbnN0IHsgcHJvZHVjdCwgcmV2aWV3cyB9ID0gdXNlUnVudGltZURhdGE8eyBwcm9kdWN0OiBQcm9kdWN0OyByZXZpZXdzOiBSZXZpZXdbXSB9PigpO1xuICpcbiAqICAgcmV0dXJuIChcbiAqICAgICA8ZGl2PlxuICogICAgICAgPGgxPntwcm9kdWN0Lm5hbWV9PC9oMT5cbiAqICAgICAgIDxwPntwcm9kdWN0LmRlc2NyaXB0aW9ufTwvcD5cbiAqICAgICAgIDxSZXZpZXdMaXN0IHJldmlld3M9e3Jldmlld3N9IC8+XG4gKiAgICAgPC9kaXY+XG4gKiAgICk7XG4gKiB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBydW50aW1lUm91dGVyKG9wdGlvbnM6IFJ1bnRpbWVSb3V0ZXJPcHRpb25zKTogUnVudGltZVJvdXRlciB7XG4gIHJldHVybiBuZXcgUnVudGltZVJvdXRlcihvcHRpb25zKTtcbn1cbiIsICIvKlxuICogRWxhc3RpYyBMaWNlbnNlIDIuMFxuICogQ29weXJpZ2h0IChDKSAyMDI1XHUyMDEzcHJlc2VudCBSYW1hbiBNYXJvemF1LCBXb3JrIFRhcmdldCBJbnNpZ2h0IEZ1bmN0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQ29udGFjdDogcmFtYW5Ad29ya3RpZi5jb21cbiAqXG4gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGljZW5zZWQgV29yazogd29ya3RpZi5ydW50aW1lLmNkayA8d29ya3RpZl9ydW50aW1lX2Nkaz4uXG4gKiBVc2Ugb2YgdGhpcyBzb2Z0d2FyZSBpcyBnb3Zlcm5lZCBieSB0aGUgRWxhc3RpYyBMaWNlbnNlIDIuMDsgc2VlIHRoZSBMSUNFTlNFIGZpbGVcbiAqIG9yIGh0dHBzOi8vd3d3LmVsYXN0aWMuY28vbGljZW5zaW5nL2VsYXN0aWMtbGljZW5zZSBmb3IgZGV0YWlscy5cbiAqXG4gKiBSZS1saWNlbnNpbmcgbm90aWNlOlxuICogICBUaGlzIGZpbGUgd2FzIHByZXZpb3VzbHkgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJ1c2luZXNzIFNvdXJjZSBMaWNlbnNlIDEuMSAoQlVTTC0xLjEpLlxuICogICBBcyBvZiAyMDI1LTA5LTIyLCBpdCBpcyByZS1saWNlbnNlZCB1bmRlciBFbGFzdGljIExpY2Vuc2UgMi4wLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFbGFzdGljLTIuMFxuICovXG5cbmltcG9ydCB7IHVzZUVmZmVjdCwgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlTG9jYXRpb24sIHVzZU1hdGNoZXMgfSBmcm9tICdyZWFjdC1yb3V0ZXInO1xuXG5pbXBvcnQgeyBSdW50aW1lTG9hZGVyUmVzdWx0IH0gZnJvbSAnLi4vcnVudGltZS5yb3V0ZXInO1xuXG4vLyBUcmFjayBpZiBhIGhlYWQgbWFuYWdlciBpbnN0YW5jZSBpcyBhbHJlYWR5IG1vdW50ZWRcbmxldCBoZWFkTWFuYWdlckluc3RhbmNlQ291bnQgPSAwO1xuXG4vKipcbiAqIEhlYWQgbWFuYWdlciBjb21wb25lbnQgdGhhdCB1cGRhdGVzIGRvY3VtZW50LnRpdGxlIGFuZCBtZXRhIHRhZ3Mgb24gcm91dGUgY2hhbmdlcy5cbiAqIFRoaXMgY29tcG9uZW50IHN1YnNjcmliZXMgdG8gcm91dGUgbG9hZGVyIGNoYW5nZXMgYW5kIHVwZGF0ZXMgdGhlIGRvY3VtZW50IGhlYWRcbiAqIHdpdGggU0VPIG1ldGFkYXRhIGZvciBjbGllbnQtc2lkZSBuYXZpZ2F0aW9uLlxuICpcbiAqIEZlYXR1cmVzOlxuICogLSBVcGRhdGVzIGRvY3VtZW50LnRpdGxlIGJhc2VkIG9uIHNlb01ldGEudGl0bGVcbiAqIC0gQ3JlYXRlcy91cGRhdGVzIG1ldGEgdGFncyBmb3IgZGVzY3JpcHRpb24sIGtleXdvcmRzLCByb2JvdHNcbiAqIC0gTWFuYWdlcyBPcGVuIEdyYXBoIHRhZ3MgZm9yIHNvY2lhbCBtZWRpYSBzaGFyaW5nXG4gKiAtIE1hbmFnZXMgVHdpdHRlciBjYXJkIHRhZ3NcbiAqIC0gSGFuZGxlcyBKU09OLUxEIHN0cnVjdHVyZWQgZGF0YVxuICogLSBQcmVzZXJ2ZXMgU2VydmVybGVzcyByZW5kZXJpbmcgdGFncyBvbiBoeWRyYXRpb25cbiAqIC0gQXZvaWRzIGR1cGxpY2F0ZSBtZXRhIHRhZ3NcbiAqIC0gSGFuZGxlcyBlZGdlIGNhc2VzOiB1bmRlZmluZWQvbnVsbCBtZXRhZGF0YSwgaW5hY2Nlc3NpYmxlIGRvY3VtZW50LmhlYWQsIG11bHRpcGxlIGluc3RhbmNlc1xuICpcbiAqICoqSW1wb3J0YW50Kio6IFBsYWNlIHRoaXMgY29tcG9uZW50IGF0IHRoZSByb290IGxldmVsIG9mIHlvdXIgYXBwbGljYXRpb24sIGluc2lkZSB0aGUgUm91dGVyUHJvdmlkZXIuXG4gKiBPbmx5IG9uZSBpbnN0YW5jZSBzaG91bGQgYmUgbW91bnRlZCBwZXIgYXBwbGljYXRpb24uXG4gKlxuICogQHJldHVybnMge251bGx9IFRoaXMgY29tcG9uZW50IGRvZXNuJ3QgcmVuZGVyIGFueXRoaW5nXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEJhc2ljIHVzYWdlIHdpdGggUm91dGVyUHJvdmlkZXJcbiAqIGltcG9ydCB7IFJ1bnRpbWVIZWFkTWFuYWdlciwgUnVudGltZVdlYlJvdXRlclByb3ZpZGVyIH0gZnJvbSAnQHdvcmt0aWYvcnVudGltZSc7XG4gKlxuICogZnVuY3Rpb24gQXBwKHsgcm91dGVyIH0pIHtcbiAqICAgcmV0dXJuIChcbiAqICAgICA8PlxuICogICAgICAgPFJ1bnRpbWVIZWFkTWFuYWdlciAvPlxuICogICAgICAgPFlvdXJBcHBDb250ZW50IC8+XG4gKiAgICAgPC8+XG4gKiAgICk7XG4gKiB9XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENvbXBsZXRlIHNldHVwIHdpdGggcnVudGltZVJvdXRlclxuICogaW1wb3J0IHsgcnVudGltZVJvdXRlciwgUnVudGltZUhlYWRNYW5hZ2VyLCBSdW50aW1lV2ViUm91dGVyUHJvdmlkZXIgfSBmcm9tICdAd29ya3RpZi9ydW50aW1lJztcbiAqXG4gKiBjb25zdCByb3V0ZXIgPSBydW50aW1lUm91dGVyKHtcbiAqICAgcm91dGVyOiBbXG4gKiAgICAge1xuICogICAgICAgcGF0aDogJy8nLFxuICogICAgICAgZWxlbWVudDogPEhvbWVQYWdlIC8+LFxuICogICAgICAgcnVudGltZUFzeW5jOiBbXG4gKiAgICAgICAgIGFzeW5jICgpID0+ICh7IGhvbWVEYXRhOiBhd2FpdCBmZXRjaEhvbWVEYXRhKCkgfSlcbiAqICAgICAgIF1cbiAqICAgICB9XG4gKiAgIF0sXG4gKiAgIGRlZmF1bHRzOiB7fVxuICogfSk7XG4gKlxuICogZnVuY3Rpb24gQXBwKCkge1xuICogICByZXR1cm4gKFxuICogICAgIDw+XG4gKiAgICAgICA8UnVudGltZUhlYWRNYW5hZ2VyIC8+XG4gKiAgICAgICA8T3V0bGV0IC8+XG4gKiAgICAgPC8+XG4gKiAgICk7XG4gKiB9XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFRoZSBoZWFkIG1hbmFnZXIgYXV0b21hdGljYWxseSB1cGRhdGVzIG1ldGEgdGFncyB3aGVuIG5hdmlnYXRpbmdcbiAqIC8vIElmIHlvdXIgcm91dGUgbG9hZGVyIHJldHVybnMgU0VPIG1ldGFkYXRhIGxpa2UgdGhpczpcbiAqIC8vIHsgaW50ZXJuYWw6IHsgc2VvTWV0YTogeyB0aXRsZTogJ1Byb2R1Y3QgUGFnZScsIGRlc2NyaXB0aW9uOiAnLi4uJyB9IH0gfVxuICogLy9cbiAqIC8vIFRoZSBoZWFkIG1hbmFnZXIgd2lsbCBhdXRvbWF0aWNhbGx5OlxuICogLy8gMS4gVXBkYXRlIGRvY3VtZW50LnRpdGxlIHRvICdQcm9kdWN0IFBhZ2UnXG4gKiAvLyAyLiBVcGRhdGUgbWV0YSBkZXNjcmlwdGlvbiB0YWdcbiAqIC8vIDMuIFVwZGF0ZSBPcGVuIEdyYXBoIHRhZ3NcbiAqIC8vIDQuIFVwZGF0ZSBUd2l0dGVyIGNhcmQgdGFnc1xuICogLy8gNS4gVXBkYXRlIEpTT04tTEQgc3RydWN0dXJlZCBkYXRhXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBSdW50aW1lSGVhZE1hbmFnZXIoKTogbnVsbCB7XG4gIGNvbnN0IGxvY2F0aW9uID0gdXNlTG9jYXRpb24oKTtcbiAgY29uc3QgbWF0Y2hlcyA9IHVzZU1hdGNoZXMoKTtcbiAgY29uc3QgaXNNb3VudGVkUmVmID0gdXNlUmVmKGZhbHNlKTtcblxuICBjb25zb2xlLmRlYnVnKGBbUnVudGltZV0gUm91dGUgY2hhbmdlIGRldGVjdGVkLCBzeW5jaW5nIDxoZWFkPiBmb3IgcGF0aDogYCwgbG9jYXRpb24ucGF0aG5hbWUpO1xuXG4gIC8vIERldGVjdCBtdWx0aXBsZSBoZWFkIG1hbmFnZXIgaW5zdGFuY2VzIG9uIG1vdW50XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFpc01vdW50ZWRSZWYuY3VycmVudCkge1xuICAgICAgaGVhZE1hbmFnZXJJbnN0YW5jZUNvdW50Kys7XG4gICAgICBpc01vdW50ZWRSZWYuY3VycmVudCA9IHRydWU7XG5cbiAgICAgIGlmIChoZWFkTWFuYWdlckluc3RhbmNlQ291bnQgPiAxKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgW1J1bnRpbWVdIE11bHRpcGxlIFJ1bnRpbWVIZWFkTWFuYWdlciBpbnN0YW5jZXMgZGV0ZWN0ZWQgKCR7aGVhZE1hbmFnZXJJbnN0YW5jZUNvdW50fSkuIGAgK1xuICAgICAgICAgICdPbmx5IG9uZSBpbnN0YW5jZSBzaG91bGQgYmUgbW91bnRlZCBhdCB0aGUgcm9vdCBvZiB5b3VyIGFwcGxpY2F0aW9uLiAnICtcbiAgICAgICAgICAnTXVsdGlwbGUgaW5zdGFuY2VzIG1heSBjYXVzZSB1bmV4cGVjdGVkIGJlaGF2aW9yLicsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2xlYW51cCBvbiB1bm1vdW50XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGlmIChpc01vdW50ZWRSZWYuY3VycmVudCkge1xuICAgICAgICBoZWFkTWFuYWdlckluc3RhbmNlQ291bnQtLTtcbiAgICAgICAgaXNNb3VudGVkUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9O1xuICB9LCBbXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAvLyBDaGVjayBpZiBkb2N1bWVudC5oZWFkIGlzIGFjY2Vzc2libGVcbiAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJyB8fCAhZG9jdW1lbnQuaGVhZCkge1xuICAgICAgY29uc29sZS53YXJuKCdbUnVudGltZV0gZG9jdW1lbnQuaGVhZCBpcyBub3QgYWNjZXNzaWJsZS4gU2tpcHBpbmcgaGVhZCB1cGRhdGVzLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEdldCB0aGUgbGFzdCBtYXRjaCAoY3VycmVudCByb3V0ZSlcbiAgICBjb25zdCBjdXJyZW50TWF0Y2ggPSBtYXRjaGVzW21hdGNoZXMubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgbG9hZGVyRGF0YSA9IGN1cnJlbnRNYXRjaD8uZGF0YSBhcyBSdW50aW1lTG9hZGVyUmVzdWx0IHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IHNlb01ldGEgPSBsb2FkZXJEYXRhPy5pbnRlcm5hbD8uc2VvTWV0YTtcblxuICAgIC8vIFNraXAgaWYgbm8gU0VPIG1ldGFkYXRhICh1bmRlZmluZWQgb3IgbnVsbClcbiAgICBpZiAoIXNlb01ldGEgfHwgc2VvTWV0YSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAvLyBVcGRhdGUgZG9jdW1lbnQgdGl0bGUgKG9ubHkgaWYgZGlmZmVyZW50IHRvIHByZXZlbnQgZmxpY2tlcmluZylcbiAgICAgIGlmIChzZW9NZXRhLnRpdGxlICYmIGRvY3VtZW50LnRpdGxlICE9PSBzZW9NZXRhLnRpdGxlKSB7XG4gICAgICAgIGRvY3VtZW50LnRpdGxlID0gc2VvTWV0YS50aXRsZTtcbiAgICAgIH1cblxuICAgICAgLy8gQHRvZG86IGltcGxlbWVudCBhYmlsaXR5IHRvIGN1c3RvbWlzZSBtZXRhLXRhZ3MgSFRNTCByZXNvbHZlclxuICAgICAgLy8gICAgICAgIEN1c3RvbSBtZWFzbiBSdW50aW1lV2ViUm91dGVyUHJvdmlkZXIgcHJvcGVydHkgdG8gbWFyZ2UgY3VycmVudCBhbmQgY3VzdG9tIGFwcHJvYWNoZXNcbiAgICAgIC8vIFVwZGF0ZSBiYXNpYyBtZXRhIHRhZ3NcbiAgICAgIHVwZGF0ZU1ldGFUYWcoJ2Rlc2NyaXB0aW9uJywgc2VvTWV0YS5kZXNjcmlwdGlvbik7XG4gICAgICB1cGRhdGVNZXRhVGFnKCdrZXl3b3JkcycsIHNlb01ldGEua2V5d29yZHM/LmpvaW4oJywgJykpO1xuICAgICAgdXBkYXRlTWV0YVRhZygncm9ib3RzJywgc2VvTWV0YS5yb2JvdHMpO1xuXG4gICAgICAvLyBVcGRhdGUgT3BlbiBHcmFwaCB0YWdzXG4gICAgICB1cGRhdGVNZXRhUHJvcGVydHkoJ29nOnRpdGxlJywgc2VvTWV0YS5vZ1RpdGxlKTtcbiAgICAgIHVwZGF0ZU1ldGFQcm9wZXJ0eSgnb2c6ZGVzY3JpcHRpb24nLCBzZW9NZXRhLm9nRGVzY3JpcHRpb24pO1xuICAgICAgdXBkYXRlTWV0YVByb3BlcnR5KCdvZzppbWFnZScsIHNlb01ldGEub2dJbWFnZSk7XG4gICAgICB1cGRhdGVNZXRhUHJvcGVydHkoJ29nOnVybCcsIHNlb01ldGEub2dVcmwpO1xuICAgICAgdXBkYXRlTWV0YVByb3BlcnR5KCdvZzp0eXBlJywgc2VvTWV0YS5vZ1R5cGUpO1xuXG4gICAgICAvLyBVcGRhdGUgVHdpdHRlciBjYXJkIHRhZ3NcbiAgICAgIHVwZGF0ZU1ldGFOYW1lKCd0d2l0dGVyOmNhcmQnLCBzZW9NZXRhLnR3aXR0ZXJDYXJkKTtcbiAgICAgIHVwZGF0ZU1ldGFOYW1lKCd0d2l0dGVyOnRpdGxlJywgc2VvTWV0YS50d2l0dGVyVGl0bGUpO1xuICAgICAgdXBkYXRlTWV0YU5hbWUoJ3R3aXR0ZXI6ZGVzY3JpcHRpb24nLCBzZW9NZXRhLnR3aXR0ZXJEZXNjcmlwdGlvbik7XG4gICAgICB1cGRhdGVNZXRhTmFtZSgndHdpdHRlcjppbWFnZScsIHNlb01ldGEudHdpdHRlckltYWdlKTtcblxuICAgICAgLy8gVXBkYXRlIGNhbm9uaWNhbCBVUkxcbiAgICAgIHVwZGF0ZUxpbmtUYWcoJ2Nhbm9uaWNhbCcsIHNlb01ldGEuY2Fub25pY2FsVXJsKTtcblxuICAgICAgLy8gVXBkYXRlIEpTT04tTERcbiAgICAgIHVwZGF0ZUpzb25MZChzZW9NZXRhLmpzb25MZCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tSdW50aW1lXSBFcnJvciB1cGRhdGluZyBkb2N1bWVudCBoZWFkOicsIGVycm9yKTtcbiAgICB9XG4gIH0sIFtsb2NhdGlvbiwgbWF0Y2hlc10pO1xuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgb3IgY3JlYXRlcyBhIG1ldGEgdGFnIHdpdGggYSBuYW1lIGF0dHJpYnV0ZS5cbiAqIFJldXNlcyBleGlzdGluZyB0YWdzIHRvIGF2b2lkIGR1cGxpY2F0ZXMuXG4gKiBPbmx5IHVwZGF0ZXMgaWYgY29udGVudCBkaWZmZXJzIGZyb20gZXhpc3RpbmcgdmFsdWUgdG8gcHJldmVudCBmbGlja2VyaW5nLlxuICogUmVtb3ZlcyB0aGUgdGFnIGlmIGNvbnRlbnQgaXMgZW1wdHkgdG8gcHJldmVudCBzdGFsZSB2YWx1ZXMgZnJvbSBwcmV2aW91cyByb3V0ZXMuXG4gKiBIYW5kbGVzIGVkZ2UgY2FzZXM6IG51bGwvdW5kZWZpbmVkIGNvbnRlbnQsIGluYWNjZXNzaWJsZSBkb2N1bWVudC5oZWFkLCBET00gZXJyb3JzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgYXR0cmlidXRlIHZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gY29udGVudCAtIFRoZSBjb250ZW50IGF0dHJpYnV0ZSB2YWx1ZVxuICovXG5mdW5jdGlvbiB1cGRhdGVNZXRhVGFnKG5hbWU6IHN0cmluZywgY29udGVudDogc3RyaW5nIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIHRyeSB7XG4gICAgLy8gQ2hlY2sgaWYgZG9jdW1lbnQuaGVhZCBpcyBhY2Nlc3NpYmxlXG4gICAgaWYgKCFkb2N1bWVudC5oZWFkKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFtSdW50aW1lXSBDYW5ub3QgdXBkYXRlIG1ldGEgdGFnIFwiJHtuYW1lfVwiOiBkb2N1bWVudC5oZWFkIGlzIG5vdCBhY2Nlc3NpYmxlYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRmluZCBleGlzdGluZyB0YWcgKHdpdGggb3Igd2l0aG91dCBvdXIgbWFya2VyKVxuICAgIGxldCBtZXRhID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgbWV0YVtuYW1lPVwiJHtuYW1lfVwiXVtkYXRhLXJ1bnRpbWUtbWV0YV1gKSBhcyBIVE1MTWV0YUVsZW1lbnQgfCBudWxsO1xuICAgIGlmICghbWV0YSkge1xuICAgICAgbWV0YSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYG1ldGFbbmFtZT1cIiR7bmFtZX1cIl1gKSBhcyBIVE1MTWV0YUVsZW1lbnQgfCBudWxsO1xuICAgIH1cblxuICAgIC8vIElmIGNvbnRlbnQgaXMgZW1wdHksIHJlbW92ZSB0aGUgdGFnIHRvIHByZXZlbnQgc3RhbGUgdmFsdWVzXG4gICAgaWYgKCFjb250ZW50IHx8IGNvbnRlbnQgPT09IG51bGwgfHwgY29udGVudC50cmltKCkgPT09ICcnKSB7XG4gICAgICBpZiAobWV0YSkge1xuICAgICAgICBtZXRhLnJlbW92ZSgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEVzY2FwZSBjb250ZW50IHRvIHByZXZlbnQgWFNTXG4gICAgY29uc3QgZXNjYXBlZENvbnRlbnQgPSBlc2NhcGVIdG1sKGNvbnRlbnQpO1xuXG4gICAgaWYgKCFtZXRhKSB7XG4gICAgICAvLyBDcmVhdGUgbmV3IHRhZ1xuICAgICAgbWV0YSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ21ldGEnKTtcbiAgICAgIG1ldGEuc2V0QXR0cmlidXRlKCduYW1lJywgbmFtZSk7XG4gICAgICBtZXRhLnNldEF0dHJpYnV0ZSgnZGF0YS1ydW50aW1lLW1ldGEnLCAndHJ1ZScpO1xuICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChtZXRhKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTWFyayBleGlzdGluZyB0YWcgYXMgb3Vyc1xuICAgICAgbWV0YS5zZXRBdHRyaWJ1dGUoJ2RhdGEtcnVudGltZS1tZXRhJywgJ3RydWUnKTtcbiAgICB9XG5cbiAgICAvLyBPbmx5IHVwZGF0ZSBpZiBjb250ZW50IGRpZmZlcnNcbiAgICBpZiAobWV0YS5nZXRBdHRyaWJ1dGUoJ2NvbnRlbnQnKSAhPT0gZXNjYXBlZENvbnRlbnQpIHtcbiAgICAgIG1ldGEuc2V0QXR0cmlidXRlKCdjb250ZW50JywgZXNjYXBlZENvbnRlbnQpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLndhcm4oYFtSdW50aW1lXSBGYWlsZWQgdG8gdXBkYXRlIG1ldGEgdGFnIFwiJHtuYW1lfVwiOmAsIGVycm9yKTtcbiAgfVxufVxuXG4vKipcbiAqIFVwZGF0ZXMgb3IgY3JlYXRlcyBhIG1ldGEgdGFnIHdpdGggYSBwcm9wZXJ0eSBhdHRyaWJ1dGUgKGZvciBPcGVuIEdyYXBoIHRhZ3MpLlxuICogUmV1c2VzIGV4aXN0aW5nIHRhZ3MgdG8gYXZvaWQgZHVwbGljYXRlcy5cbiAqIE9ubHkgdXBkYXRlcyBpZiBjb250ZW50IGRpZmZlcnMgZnJvbSBleGlzdGluZyB2YWx1ZSB0byBwcmV2ZW50IGZsaWNrZXJpbmcuXG4gKiBSZW1vdmVzIHRoZSB0YWcgaWYgY29udGVudCBpcyBlbXB0eSB0byBwcmV2ZW50IHN0YWxlIHZhbHVlcyBmcm9tIHByZXZpb3VzIHJvdXRlcy5cbiAqIEhhbmRsZXMgZWRnZSBjYXNlczogbnVsbC91bmRlZmluZWQgY29udGVudCwgaW5hY2Nlc3NpYmxlIGRvY3VtZW50LmhlYWQsIERPTSBlcnJvcnMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IC0gVGhlIHByb3BlcnR5IGF0dHJpYnV0ZSB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWR9IGNvbnRlbnQgLSBUaGUgY29udGVudCBhdHRyaWJ1dGUgdmFsdWVcbiAqL1xuZnVuY3Rpb24gdXBkYXRlTWV0YVByb3BlcnR5KHByb3BlcnR5OiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICB0cnkge1xuICAgIC8vIENoZWNrIGlmIGRvY3VtZW50LmhlYWQgaXMgYWNjZXNzaWJsZVxuICAgIGlmICghZG9jdW1lbnQuaGVhZCkge1xuICAgICAgY29uc29sZS53YXJuKGBbUnVudGltZV0gQ2Fubm90IHVwZGF0ZSBtZXRhIHByb3BlcnR5IFwiJHtwcm9wZXJ0eX1cIjogZG9jdW1lbnQuaGVhZCBpcyBub3QgYWNjZXNzaWJsZWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEZpbmQgZXhpc3RpbmcgdGFnICh3aXRoIG9yIHdpdGhvdXQgb3VyIG1hcmtlcilcbiAgICBsZXQgbWV0YSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYG1ldGFbcHJvcGVydHk9XCIke3Byb3BlcnR5fVwiXVtkYXRhLXJ1bnRpbWUtbWV0YV1gKSBhcyBIVE1MTWV0YUVsZW1lbnQgfCBudWxsO1xuICAgIGlmICghbWV0YSkge1xuICAgICAgbWV0YSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYG1ldGFbcHJvcGVydHk9XCIke3Byb3BlcnR5fVwiXWApIGFzIEhUTUxNZXRhRWxlbWVudCB8IG51bGw7XG4gICAgfVxuXG4gICAgLy8gSWYgY29udGVudCBpcyBlbXB0eSwgcmVtb3ZlIHRoZSB0YWcgdG8gcHJldmVudCBzdGFsZSB2YWx1ZXNcbiAgICBpZiAoIWNvbnRlbnQgfHwgY29udGVudCA9PT0gbnVsbCB8fCBjb250ZW50LnRyaW0oKSA9PT0gJycpIHtcbiAgICAgIGlmIChtZXRhKSB7XG4gICAgICAgIG1ldGEucmVtb3ZlKCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRXNjYXBlIGNvbnRlbnQgdG8gcHJldmVudCBYU1NcbiAgICBjb25zdCBlc2NhcGVkQ29udGVudCA9IGVzY2FwZUh0bWwoY29udGVudCk7XG5cbiAgICBpZiAoIW1ldGEpIHtcbiAgICAgIC8vIENyZWF0ZSBuZXcgdGFnXG4gICAgICBtZXRhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbWV0YScpO1xuICAgICAgbWV0YS5zZXRBdHRyaWJ1dGUoJ3Byb3BlcnR5JywgcHJvcGVydHkpO1xuICAgICAgbWV0YS5zZXRBdHRyaWJ1dGUoJ2RhdGEtcnVudGltZS1tZXRhJywgJ3RydWUnKTtcbiAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobWV0YSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE1hcmsgZXhpc3RpbmcgdGFnIGFzIG91cnNcbiAgICAgIG1ldGEuc2V0QXR0cmlidXRlKCdkYXRhLXJ1bnRpbWUtbWV0YScsICd0cnVlJyk7XG4gICAgfVxuXG4gICAgLy8gT25seSB1cGRhdGUgaWYgY29udGVudCBkaWZmZXJzXG4gICAgaWYgKG1ldGEuZ2V0QXR0cmlidXRlKCdjb250ZW50JykgIT09IGVzY2FwZWRDb250ZW50KSB7XG4gICAgICBtZXRhLnNldEF0dHJpYnV0ZSgnY29udGVudCcsIGVzY2FwZWRDb250ZW50KTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS53YXJuKGBbUnVudGltZV0gRmFpbGVkIHRvIHVwZGF0ZSBtZXRhIHByb3BlcnR5IFwiJHtwcm9wZXJ0eX1cIjpgLCBlcnJvcik7XG4gIH1cbn1cblxuLyoqXG4gKiBVcGRhdGVzIG9yIGNyZWF0ZXMgYSBtZXRhIHRhZyB3aXRoIGEgbmFtZSBhdHRyaWJ1dGUgKHNwZWNpZmljYWxseSBmb3IgVHdpdHRlciBjYXJkcykuXG4gKiBSZXVzZXMgZXhpc3RpbmcgdGFncyB0byBhdm9pZCBkdXBsaWNhdGVzLlxuICogT25seSB1cGRhdGVzIGlmIGNvbnRlbnQgZGlmZmVycyBmcm9tIGV4aXN0aW5nIHZhbHVlIHRvIHByZXZlbnQgZmxpY2tlcmluZy5cbiAqIFJlbW92ZXMgdGhlIHRhZyBpZiBjb250ZW50IGlzIGVtcHR5IHRvIHByZXZlbnQgc3RhbGUgdmFsdWVzIGZyb20gcHJldmlvdXMgcm91dGVzLlxuICogSGFuZGxlcyBlZGdlIGNhc2VzOiBudWxsL3VuZGVmaW5lZCBjb250ZW50LCBpbmFjY2Vzc2libGUgZG9jdW1lbnQuaGVhZCwgRE9NIGVycm9ycy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIGF0dHJpYnV0ZSB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWR9IGNvbnRlbnQgLSBUaGUgY29udGVudCBhdHRyaWJ1dGUgdmFsdWVcbiAqL1xuZnVuY3Rpb24gdXBkYXRlTWV0YU5hbWUobmFtZTogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgdHJ5IHtcbiAgICAvLyBDaGVjayBpZiBkb2N1bWVudC5oZWFkIGlzIGFjY2Vzc2libGVcbiAgICBpZiAoIWRvY3VtZW50LmhlYWQpIHtcbiAgICAgIGNvbnNvbGUud2FybihgW1J1bnRpbWVdIENhbm5vdCB1cGRhdGUgbWV0YSBuYW1lIFwiJHtuYW1lfVwiOiBkb2N1bWVudC5oZWFkIGlzIG5vdCBhY2Nlc3NpYmxlYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRmluZCBleGlzdGluZyB0YWcgKHdpdGggb3Igd2l0aG91dCBvdXIgbWFya2VyKVxuICAgIGxldCBtZXRhID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgbWV0YVtuYW1lPVwiJHtuYW1lfVwiXVtkYXRhLXJ1bnRpbWUtbWV0YV1gKSBhcyBIVE1MTWV0YUVsZW1lbnQgfCBudWxsO1xuICAgIGlmICghbWV0YSkge1xuICAgICAgbWV0YSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYG1ldGFbbmFtZT1cIiR7bmFtZX1cIl1gKSBhcyBIVE1MTWV0YUVsZW1lbnQgfCBudWxsO1xuICAgIH1cblxuICAgIC8vIElmIGNvbnRlbnQgaXMgZW1wdHksIHJlbW92ZSB0aGUgdGFnIHRvIHByZXZlbnQgc3RhbGUgdmFsdWVzXG4gICAgaWYgKCFjb250ZW50IHx8IGNvbnRlbnQgPT09IG51bGwgfHwgY29udGVudC50cmltKCkgPT09ICcnKSB7XG4gICAgICBpZiAobWV0YSkge1xuICAgICAgICBtZXRhLnJlbW92ZSgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEVzY2FwZSBjb250ZW50IHRvIHByZXZlbnQgWFNTXG4gICAgY29uc3QgZXNjYXBlZENvbnRlbnQgPSBlc2NhcGVIdG1sKGNvbnRlbnQpO1xuXG4gICAgaWYgKCFtZXRhKSB7XG4gICAgICAvLyBDcmVhdGUgbmV3IHRhZ1xuICAgICAgbWV0YSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ21ldGEnKTtcbiAgICAgIG1ldGEuc2V0QXR0cmlidXRlKCduYW1lJywgbmFtZSk7XG4gICAgICBtZXRhLnNldEF0dHJpYnV0ZSgnZGF0YS1ydW50aW1lLW1ldGEnLCAndHJ1ZScpO1xuICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChtZXRhKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTWFyayBleGlzdGluZyB0YWcgYXMgb3Vyc1xuICAgICAgbWV0YS5zZXRBdHRyaWJ1dGUoJ2RhdGEtcnVudGltZS1tZXRhJywgJ3RydWUnKTtcbiAgICB9XG5cbiAgICAvLyBPbmx5IHVwZGF0ZSBpZiBjb250ZW50IGRpZmZlcnNcbiAgICBpZiAobWV0YS5nZXRBdHRyaWJ1dGUoJ2NvbnRlbnQnKSAhPT0gZXNjYXBlZENvbnRlbnQpIHtcbiAgICAgIG1ldGEuc2V0QXR0cmlidXRlKCdjb250ZW50JywgZXNjYXBlZENvbnRlbnQpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLndhcm4oYFtSdW50aW1lXSBGYWlsZWQgdG8gdXBkYXRlIG1ldGEgbmFtZSBcIiR7bmFtZX1cIjpgLCBlcnJvcik7XG4gIH1cbn1cblxuLyoqXG4gKiBVcGRhdGVzIG9yIGNyZWF0ZXMgYSBsaW5rIHRhZyB3aXRoIGEgcmVsIGF0dHJpYnV0ZSAoZm9yIGNhbm9uaWNhbCBVUkwpLlxuICogUmV1c2VzIGV4aXN0aW5nIHRhZ3MgdG8gYXZvaWQgZHVwbGljYXRlcy5cbiAqIE9ubHkgdXBkYXRlcyBpZiBocmVmIGRpZmZlcnMgZnJvbSBleGlzdGluZyB2YWx1ZSB0byBwcmV2ZW50IGZsaWNrZXJpbmcuXG4gKiBSZW1vdmVzIHRoZSB0YWcgaWYgaHJlZiBpcyBlbXB0eSB0byBwcmV2ZW50IHN0YWxlIHZhbHVlcyBmcm9tIHByZXZpb3VzIHJvdXRlcy5cbiAqIEhhbmRsZXMgZWRnZSBjYXNlczogbnVsbC91bmRlZmluZWQgaHJlZiwgaW5hY2Nlc3NpYmxlIGRvY3VtZW50LmhlYWQsIERPTSBlcnJvcnMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJlbCAtIFRoZSByZWwgYXR0cmlidXRlIHZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gaHJlZiAtIFRoZSBocmVmIGF0dHJpYnV0ZSB2YWx1ZVxuICovXG5mdW5jdGlvbiB1cGRhdGVMaW5rVGFnKHJlbDogc3RyaW5nLCBocmVmOiBzdHJpbmcgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgdHJ5IHtcbiAgICAvLyBDaGVjayBpZiBkb2N1bWVudC5oZWFkIGlzIGFjY2Vzc2libGVcbiAgICBpZiAoIWRvY3VtZW50LmhlYWQpIHtcbiAgICAgIGNvbnNvbGUud2FybihgW1J1bnRpbWVdIENhbm5vdCB1cGRhdGUgbGluayB0YWcgXCIke3JlbH1cIjogZG9jdW1lbnQuaGVhZCBpcyBub3QgYWNjZXNzaWJsZWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEZpbmQgZXhpc3RpbmcgdGFnICh3aXRoIG9yIHdpdGhvdXQgb3VyIG1hcmtlcilcbiAgICBsZXQgbGluayA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYGxpbmtbcmVsPVwiJHtyZWx9XCJdW2RhdGEtcnVudGltZS1saW5rXWApIGFzIEhUTUxMaW5rRWxlbWVudCB8IG51bGw7XG4gICAgaWYgKCFsaW5rKSB7XG4gICAgICBsaW5rID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgbGlua1tyZWw9XCIke3JlbH1cIl1gKSBhcyBIVE1MTGlua0VsZW1lbnQgfCBudWxsO1xuICAgIH1cblxuICAgIC8vIElmIGhyZWYgaXMgZW1wdHksIHJlbW92ZSB0aGUgdGFnIHRvIHByZXZlbnQgc3RhbGUgdmFsdWVzXG4gICAgaWYgKCFocmVmIHx8IGhyZWYgPT09IG51bGwgfHwgaHJlZi50cmltKCkgPT09ICcnKSB7XG4gICAgICBpZiAobGluaykge1xuICAgICAgICBsaW5rLnJlbW92ZSgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEVzY2FwZSBocmVmIHRvIHByZXZlbnQgWFNTXG4gICAgY29uc3QgZXNjYXBlZEhyZWYgPSBlc2NhcGVIdG1sKGhyZWYpO1xuXG4gICAgaWYgKCFsaW5rKSB7XG4gICAgICAvLyBDcmVhdGUgbmV3IHRhZ1xuICAgICAgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTtcbiAgICAgIGxpbmsuc2V0QXR0cmlidXRlKCdyZWwnLCByZWwpO1xuICAgICAgbGluay5zZXRBdHRyaWJ1dGUoJ2RhdGEtcnVudGltZS1saW5rJywgJ3RydWUnKTtcbiAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobGluayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE1hcmsgZXhpc3RpbmcgdGFnIGFzIG91cnNcbiAgICAgIGxpbmsuc2V0QXR0cmlidXRlKCdkYXRhLXJ1bnRpbWUtbGluaycsICd0cnVlJyk7XG4gICAgfVxuXG4gICAgLy8gT25seSB1cGRhdGUgaWYgaHJlZiBkaWZmZXJzXG4gICAgaWYgKGxpbmsuZ2V0QXR0cmlidXRlKCdocmVmJykgIT09IGVzY2FwZWRIcmVmKSB7XG4gICAgICBsaW5rLnNldEF0dHJpYnV0ZSgnaHJlZicsIGVzY2FwZWRIcmVmKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS53YXJuKGBbUnVudGltZV0gRmFpbGVkIHRvIHVwZGF0ZSBsaW5rIHRhZyBcIiR7cmVsfVwiOmAsIGVycm9yKTtcbiAgfVxufVxuXG4vKipcbiAqIFVwZGF0ZXMgb3IgY3JlYXRlcyBhIEpTT04tTEQgc2NyaXB0IHRhZyBmb3Igc3RydWN0dXJlZCBkYXRhLlxuICogUmVtb3ZlcyB0aGUgc2NyaXB0IHRhZyBpZiBqc29uTGQgaXMgdW5kZWZpbmVkIG9yIG51bGwuXG4gKiBPbmx5IHVwZGF0ZXMgaWYgY29udGVudCBkaWZmZXJzIGZyb20gZXhpc3RpbmcgdmFsdWUgdG8gcHJldmVudCBmbGlja2VyaW5nLlxuICogSGFuZGxlcyBlZGdlIGNhc2VzOiBudWxsL3VuZGVmaW5lZCBqc29uTGQsIGluYWNjZXNzaWJsZSBkb2N1bWVudC5oZWFkLCBzZXJpYWxpemF0aW9uIGVycm9ycy5cbiAqXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkfSBqc29uTGQgLSBUaGUgSlNPTi1MRCBvYmplY3QgdG8gc2VyaWFsaXplXG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZUpzb25MZChqc29uTGQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIHRyeSB7XG4gICAgLy8gQ2hlY2sgaWYgZG9jdW1lbnQuaGVhZCBpcyBhY2Nlc3NpYmxlXG4gICAgaWYgKCFkb2N1bWVudC5oZWFkKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tSdW50aW1lXSBDYW5ub3QgdXBkYXRlIEpTT04tTEQ6IGRvY3VtZW50LmhlYWQgaXMgbm90IGFjY2Vzc2libGUnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgc2NyaXB0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcignc2NyaXB0W2RhdGEtcnVudGltZS1qc29ubGRdJykgYXMgSFRNTFNjcmlwdEVsZW1lbnQgfCBudWxsO1xuXG4gICAgLy8gUmVtb3ZlIHNjcmlwdCBpZiBqc29uTGQgaXMgbnVsbCwgdW5kZWZpbmVkLCBvciBlbXB0eVxuICAgIGlmICghanNvbkxkIHx8IGpzb25MZCA9PT0gbnVsbCkge1xuICAgICAgaWYgKHNjcmlwdCkge1xuICAgICAgICBzY3JpcHQucmVtb3ZlKCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU2VyaWFsaXplIEpTT04tTEQgY29udGVudFxuICAgIGNvbnN0IGpzb25TdHJpbmcgPSBKU09OLnN0cmluZ2lmeShqc29uTGQpO1xuXG4gICAgaWYgKCFzY3JpcHQpIHtcbiAgICAgIC8vIENoZWNrIGlmIHRoZXJlJ3MgYW4gZXhpc3RpbmcgdGFnIHdpdGhvdXQgb3VyIG1hcmtlciAoZnJvbSBzZXJ2ZXJsZXNzIHJlbmRlcmluZylcbiAgICAgIHNjcmlwdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3NjcmlwdFt0eXBlPVwiYXBwbGljYXRpb24vbGQranNvblwiXScpIGFzIEhUTUxTY3JpcHRFbGVtZW50IHwgbnVsbDtcbiAgICAgIGlmIChzY3JpcHQgJiYgIXNjcmlwdC5oYXNBdHRyaWJ1dGUoJ2RhdGEtcnVudGltZS1qc29ubGQnKSkge1xuICAgICAgICAvLyBNYXJrIGl0IGFzIG91cnNcbiAgICAgICAgc2NyaXB0LnNldEF0dHJpYnV0ZSgnZGF0YS1ydW50aW1lLWpzb25sZCcsICd0cnVlJyk7XG4gICAgICAgIC8vIE9ubHkgdXBkYXRlIGlmIGNvbnRlbnQgZGlmZmVycyBmcm9tIHNlcnZlcmxlc3MgcmVuZGVyaW5nXG4gICAgICAgIGlmIChzY3JpcHQudGV4dENvbnRlbnQgIT09IGpzb25TdHJpbmcpIHtcbiAgICAgICAgICBzY3JpcHQudGV4dENvbnRlbnQgPSBqc29uU3RyaW5nO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSBpZiAoIXNjcmlwdCkge1xuICAgICAgICAvLyBDcmVhdGUgbmV3IHNjcmlwdCB0YWdcbiAgICAgICAgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICAgIHNjcmlwdC5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCAnYXBwbGljYXRpb24vbGQranNvbicpO1xuICAgICAgICBzY3JpcHQuc2V0QXR0cmlidXRlKCdkYXRhLXJ1bnRpbWUtanNvbmxkJywgJ3RydWUnKTtcbiAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzY3JpcHQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIE9ubHkgdXBkYXRlIGlmIGNvbnRlbnQgZGlmZmVyc1xuICAgIGlmIChzY3JpcHQudGV4dENvbnRlbnQgIT09IGpzb25TdHJpbmcpIHtcbiAgICAgIHNjcmlwdC50ZXh0Q29udGVudCA9IGpzb25TdHJpbmc7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoJ1tSdW50aW1lXSBGYWlsZWQgdG8gdXBkYXRlIEpTT04tTEQ6JywgZXJyb3IpO1xuICB9XG59XG5cbi8qKlxuICogRXNjYXBlcyBIVE1MIHNwZWNpYWwgY2hhcmFjdGVycyB0byBwcmV2ZW50IFhTUyBhdHRhY2tzLlxuICogSGFuZGxlcyBlZGdlIGNhc2VzOiBudWxsL3VuZGVmaW5lZCB0ZXh0LCBET00gZXJyb3JzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gVGhlIHRleHQgdG8gZXNjYXBlXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgZXNjYXBlZCB0ZXh0XG4gKi9cbmZ1bmN0aW9uIGVzY2FwZUh0bWwodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gSGFuZGxlIG51bGwvdW5kZWZpbmVkXG4gIGlmICghdGV4dCB8fCB0ZXh0ID09PSBudWxsKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBkaXYudGV4dENvbnRlbnQgPSB0ZXh0O1xuICAgIHJldHVybiBkaXYuaW5uZXJIVE1MO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIEZhbGxiYWNrIHRvIG1hbnVhbCBlc2NhcGluZyBpZiBET00gbWFuaXB1bGF0aW9uIGZhaWxzXG4gICAgY29uc29sZS53YXJuKCdbUnVudGltZV0gRE9NLWJhc2VkIEhUTUwgZXNjYXBpbmcgZmFpbGVkLCB1c2luZyBmYWxsYmFjazonLCBlcnJvcik7XG4gICAgcmV0dXJuIHRleHRcbiAgICAgIC5yZXBsYWNlKC8mL2csICcmYW1wOycpXG4gICAgICAucmVwbGFjZSgvPC9nLCAnJmx0OycpXG4gICAgICAucmVwbGFjZSgvPi9nLCAnJmd0OycpXG4gICAgICAucmVwbGFjZSgvXCIvZywgJyZxdW90OycpXG4gICAgICAucmVwbGFjZSgvJy9nLCAnJiMwMzk7Jyk7XG4gIH1cbn1cbiIsICIvKlxuICogRWxhc3RpYyBMaWNlbnNlIDIuMFxuICogQ29weXJpZ2h0IChDKSAyMDI1XHUyMDEzcHJlc2VudCBSYW1hbiBNYXJvemF1LCBXb3JrIFRhcmdldCBJbnNpZ2h0IEZ1bmN0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQ29udGFjdDogcmFtYW5Ad29ya3RpZi5jb21cbiAqXG4gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGljZW5zZWQgV29yazogd29ya3RpZi5ydW50aW1lLmNkayA8d29ya3RpZl9ydW50aW1lX2Nkaz4uXG4gKiBVc2Ugb2YgdGhpcyBzb2Z0d2FyZSBpcyBnb3Zlcm5lZCBieSB0aGUgRWxhc3RpYyBMaWNlbnNlIDIuMDsgc2VlIHRoZSBMSUNFTlNFIGZpbGVcbiAqIG9yIGh0dHBzOi8vd3d3LmVsYXN0aWMuY28vbGljZW5zaW5nL2VsYXN0aWMtbGljZW5zZSBmb3IgZGV0YWlscy5cbiAqXG4gKiBSZS1saWNlbnNpbmcgbm90aWNlOlxuICogICBUaGlzIGZpbGUgd2FzIHByZXZpb3VzbHkgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJ1c2luZXNzIFNvdXJjZSBMaWNlbnNlIDEuMSAoQlVTTC0xLjEpLlxuICogICBBcyBvZiAyMDI1LTA5LTIyLCBpdCBpcyByZS1saWNlbnNlZCB1bmRlciBFbGFzdGljIExpY2Vuc2UgMi4wLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFbGFzdGljLTIuMFxuICovXG5cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUVmZmVjdCwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5cbi8vIGltcG9ydCAnLi9BcHAuY3NzJztcblxudHlwZSBQcm9wcyA9IHtcbiAgY2hpbGRyZW4/OiBhbnk7XG59O1xuXG4vKipcbiAqIEEgUmVhY3QgZnVuY3Rpb25hbCBjb21wb25lbnQgdGhhdCB3cmFwcyBpdHMgY2hpbGRyZW4gaW4gYSBzdHlsZWQgY29udGFpbmVyIHdpdGhcbiAqIGEgZmFkZS1pbiBlZmZlY3QgdXBvbiBtb3VudGluZy4gVGhpcyBjb21wb25lbnQgaXMgcHJpbWFyaWx5IHVzZWQgdG8gbWFuYWdlIHRoZVxuICogdmlzaWJpbGl0eSBhbmQgdHJhbnNpdGlvbiBlZmZlY3RzIG9mIGl0cyBjaGlsZHJlbi5cbiAqXG4gKiBUaGUgZmFkZS1pbiBlZmZlY3QgaXMgY29udHJvbGxlZCB1c2luZyBpbnRlcm5hbCBzdGF0ZSBob29rcyB0aGF0IGRldGVybWluZSB0aGVcbiAqIGBvcGFjaXR5YCBhbmQgdmlzaWJpbGl0eSBvZiB0aGUgY29tcG9uZW50IGFmdGVyIG1vdW50aW5nLiBTdHlsZXMgYXJlIGR5bmFtaWNhbGx5XG4gKlxuICogYXBwbGllZCB0byBmYWNpbGl0YXRlIHRoZSB0cmFuc2l0aW9uLlxuICpcbiAqIEB0eXBlIHtSZWFjdC5GQzxQcm9wcz59XG4gKiBAcGFyYW0ge1Byb3BzfSBwcm9wcyAtIFRoZSBwcm9wcyBvYmplY3QgdGhhdCBpbmNsdWRlcyB0aGUgY2hpbGRyZW4gZWxlbWVudHMgdG8gYmUgd3JhcHBlZC5cbiAqIEBwcm9wZXJ0eSB7UmVhY3QuUmVhY3ROb2RlfSBwcm9wcy5jaGlsZHJlbiAtIFRoZSBjb250ZW50IHRvIGJlIHJlbmRlcmVkIGluc2lkZSB0aGUgY29tcG9uZW50LlxuICogQHJlbWFya3NcbiAqIC0gSW50ZXJuYWwgc3RhdGUgYG1vdW50ZWRgIG1hbmFnZXMgdGhlIGluaXRpYWwgc2V0dXAgZm9yIHZpc2liaWxpdHkgYW5kIHBvc2l0aW9uaW5nXG4gKiAgIGJlZm9yZSB0aGUgY29tcG9uZW50IGlzIGZ1bGx5IG1vdW50ZWQuXG4gKiAtIEludGVybmFsIHN0YXRlIGBmYWRlSW5gIGNvbnRyb2xzIHRoZSBncmFkdWFsIGFwcGVhcmFuY2Ugb2YgdGhlIGNvbXBvbmVudCBhZnRlciB0aGVcbiAqICAgbW91bnRpbmcgaXMgaW5pdGlhbGl6ZWQuXG4gKiAtIFVzZXMgYHVzZUVmZmVjdGAgdG8gdHJpZ2dlciB0aGUgZmFkZS1pbiB0cmFuc2l0aW9uIHdpdGggYSBicmllZiBkZWxheS5cbiAqIC0gU3R5bGVkIHVzaW5nIGlubGluZSBgQm94YCBzdHlsZXMgdG8gaGFuZGxlIHBvc2l0aW9uaW5nLCB2aXNpYmlsaXR5LCBhbmQgdHJhbnNpdGlvbiBlZmZlY3RzLlxuICovXG5leHBvcnQgY29uc3QgUnVudGltZUFwcFNlcnZlcjogUmVhY3QuRkM8UHJvcHM+ID0gKHsgY2hpbGRyZW4gfSkgPT4ge1xuICAvLyBAaW1wb3J0YW50OiBmcmFtZXdvcmssIHBhY2thZ2VcbiAgY29uc3QgW21vdW50ZWQsIHNldE1vdW50ZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbZmFkZUluLCBzZXRGYWRlSW5dID0gdXNlU3RhdGUoZmFsc2UpO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgc2V0TW91bnRlZCh0cnVlKTtcblxuICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHNldEZhZGVJbih0cnVlKTtcbiAgICB9LCAxMCk7XG5cbiAgICByZXR1cm4gKCkgPT4gY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICB9LCBbXSk7XG5cbiAgLy8tLS0tLS0gQGltcG9ydGFudDogZnJhbWV3b3JrLCBwYWNrYWdlXG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICBzdHlsZT17e1xuICAgICAgICBwb3NpdGlvbjogbW91bnRlZCA/ICdyZWxhdGl2ZScgOiAnYWJzb2x1dGUnLFxuICAgICAgICB0b3A6IG1vdW50ZWQgPyAnYXV0bycgOiAnLTk5OTlweCcsXG4gICAgICAgIGxlZnQ6IG1vdW50ZWQgPyAnYXV0bycgOiAnLTk5OTlweCcsXG4gICAgICAgIHZpc2liaWxpdHk6IG1vdW50ZWQgPyAndmlzaWJsZScgOiAnaGlkZGVuJyxcbiAgICAgICAgcG9pbnRlckV2ZW50czogbW91bnRlZCA/ICdhdXRvJyA6ICdub25lJyxcbiAgICAgICAgb3BhY2l0eTogZmFkZUluID8gMSA6IDAsXG4gICAgICAgIHRyYW5zaXRpb246ICdvcGFjaXR5IDAuNnMgZWFzZS1pbi1vdXQnLFxuICAgICAgfX1cbiAgICA+XG4gICAgICB7Y2hpbGRyZW59XG4gICAgPC9kaXY+XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBSdW50aW1lQXBwU2VydmVyO1xuIiwgIi8qXG4gKiBFbGFzdGljIExpY2Vuc2UgMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiB3b3JrdGlmLnJ1bnRpbWUuY2RrIDx3b3JrdGlmX3J1bnRpbWVfY2RrPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBFbGFzdGljIExpY2Vuc2UgMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9saWNlbnNpbmcvZWxhc3RpYy1saWNlbnNlIGZvciBkZXRhaWxzLlxuICpcbiAqIFJlLWxpY2Vuc2luZyBub3RpY2U6XG4gKiAgIFRoaXMgZmlsZSB3YXMgcHJldmlvdXNseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgQnVzaW5lc3MgU291cmNlIExpY2Vuc2UgMS4xIChCVVNMLTEuMSkuXG4gKiAgIEFzIG9mIDIwMjUtMDktMjIsIGl0IGlzIHJlLWxpY2Vuc2VkIHVuZGVyIEVsYXN0aWMgTGljZW5zZSAyLjAuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVsYXN0aWMtMi4wXG4gKi9cblxuaW1wb3J0IHsgUm91dGVPYmplY3QsIFJvdXRlclN0YXRlLCBTdGF0aWNIYW5kbGVyQ29udGV4dCB9IGZyb20gJ3JlYWN0LXJvdXRlcic7XG5cbmltcG9ydCB7IFN0YXR1c0NvZGVzIH0gZnJvbSAnaHR0cC1zdGF0dXMtY29kZXMnO1xuXG5pbXBvcnQgeyBSdW50aW1lUm91dGVyIH0gZnJvbSAnLi9ydW50aW1lLnJvdXRlcic7XG5cblxuLyoqXG4gKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY29kZSBpcyBydW5uaW5nIGluIGEgYnJvd3NlciBlbnZpcm9ubWVudC5cbiAqIFRoZSB2YWx1ZSBpcyBgdHJ1ZWAgaWYgdGhlIGB3aW5kb3dgIG9iamVjdCBpcyBkZWZpbmVkLCB3aGljaCBzaWduaWZpZXNcbiAqIGEgY2xpZW50LXNpZGUgZW52aXJvbm1lbnQsIGFuZCBgZmFsc2VgIG90aGVyd2lzZS5cbiAqXG4gKiBUaGlzIHZhcmlhYmxlIGNhbiBiZSB1c2VkIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gc2VydmVyLXNpZGVcbiAqIGFuZCBjbGllbnQtc2lkZSBleGVjdXRpb24uXG4gKi9cbmV4cG9ydCBjb25zdCBpc0Jyb3dzZXIgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJlxuICB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnO1xuXG4vKipcbiAqIEZpbmRzIGEgbWF0Y2hpbmcgcm91dGUgZm9yIHRoZSBnaXZlbiBwYXRobmFtZSB3aXRoaW4gYSByb3V0ZSBvYmplY3QgaGllcmFyY2h5LlxuICpcbiAqIEBwYXJhbSB7Um91dGVPYmplY3R9IHJvdXRlIC0gVGhlIHJvdXRlIG9iamVjdCB0byBzZWFyY2ggd2l0aGluLCB3aGljaCBtYXkgY29udGFpbiBjaGlsZCByb3V0ZXMuXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aG5hbWUgLSBUaGUgcGF0aG5hbWUgdG8gbWF0Y2ggYWdhaW5zdCB0aGUgcm91dGUgb2JqZWN0LlxuICogQHJldHVybiB7Um91dGVyU3RhdGVbJ21hdGNoZXMnXVtudW1iZXJdIHwgbnVsbH0gQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgbWF0Y2hpbmcgcm91dGUgYW5kIGRldGFpbHMsXG4gKiBvciBudWxsIGlmIG5vIG1hdGNoaW5nIHJvdXRlIGlzIGZvdW5kLlxuICovXG5mdW5jdGlvbiBmaW5kTWF0Y2hpbmdSb3V0ZShcbiAgcm91dGU6IFJvdXRlT2JqZWN0LFxuICBwYXRobmFtZTogc3RyaW5nLFxuKTogUm91dGVyU3RhdGVbJ21hdGNoZXMnXVtudW1iZXJdIHwgbnVsbCB7XG4gIGlmIChcbiAgICByb3V0ZS5wYXRoID09PSBwYXRobmFtZSB8fFxuICAgIChyb3V0ZS5wYXRoPy5pbmNsdWRlcygnOicpICYmIG1hdGNoRHluYW1pY1JvdXRlKHJvdXRlLnBhdGgsIHBhdGhuYW1lKSlcbiAgKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhcmFtczogZXh0cmFjdFBhcmFtcyhyb3V0ZS5wYXRoLCBwYXRobmFtZSksXG4gICAgICBwYXRobmFtZSxcbiAgICAgIHJvdXRlOiByb3V0ZSBhcyBSb3V0ZXJTdGF0ZVsnbWF0Y2hlcyddW251bWJlcl1bJ3JvdXRlJ10sXG4gICAgICAvLyBwYXRobmFtZUJhc2U6IGAvJHtwcm9jZXNzLmVudi5QVVJFX0VOVl9TVEFHRX0vYCxcbiAgICAgIHBhdGhuYW1lQmFzZTogJy8nLFxuICAgIH07XG4gIH1cblxuICBpZiAocm91dGUuY2hpbGRyZW4pIHtcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHJvdXRlLmNoaWxkcmVuKSB7XG4gICAgICBjb25zdCBtYXRjaCA9IGZpbmRNYXRjaGluZ1JvdXRlKGNoaWxkLCBwYXRobmFtZSk7XG4gICAgICBpZiAobWF0Y2gpIHJldHVybiBtYXRjaDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBNYXRjaGVzIGEgZHluYW1pYyByb3V0ZSB3aXRoIGEgZ2l2ZW4gcGF0aG5hbWUgYnkgY29tcGFyaW5nIHRoZWlyIHNlZ21lbnRzLlxuICogRHluYW1pYyByb3V0ZSBwYXJhbWV0ZXJzIGFyZSBwcmVmaXhlZCB3aXRoIGEgY29sb24gKDopIGFuZCBjYW4gbWF0Y2ggYW55IHN0cmluZyBzZWdtZW50LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSByb3V0ZVBhdGggVGhlIHJvdXRlIHBhdGggc3RyaW5nLCB3aGljaCBtYXkgaW5jbHVkZSBkeW5hbWljIHNlZ21lbnRzIHByZWZpeGVkIHdpdGggYSBjb2xvbiAoOikuXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aG5hbWUgVGhlIHBhdGhuYW1lIHRvIGJlIG1hdGNoZWQgYWdhaW5zdCB0aGUgcm91dGUgcGF0aC5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IFJldHVybnMgdHJ1ZSBpZiB0aGUgcm91dGVQYXRoIG1hdGNoZXMgdGhlIHBhdGhuYW1lLCBjb25zaWRlcmluZyBkeW5hbWljIHNlZ21lbnRzOyBvdGhlcndpc2UgcmV0dXJucyBmYWxzZS5cbiAqL1xuZnVuY3Rpb24gbWF0Y2hEeW5hbWljUm91dGUocm91dGVQYXRoOiBzdHJpbmcsIHBhdGhuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3Qgcm91dGVTZWdtZW50cyA9IHJvdXRlUGF0aC5zcGxpdCgnLycpO1xuICBjb25zdCBwYXRobmFtZVNlZ21lbnRzID0gcGF0aG5hbWUuc3BsaXQoJy8nKTtcbiAgaWYgKHJvdXRlU2VnbWVudHMubGVuZ3RoICE9PSBwYXRobmFtZVNlZ21lbnRzLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiByb3V0ZVNlZ21lbnRzLmV2ZXJ5KFxuICAgIChzZWdtZW50LCBpbmRleCkgPT5cbiAgICAgIHNlZ21lbnQuc3RhcnRzV2l0aCgnOicpIHx8IHNlZ21lbnQgPT09IHBhdGhuYW1lU2VnbWVudHNbaW5kZXhdLFxuICApO1xufVxuXG4vKipcbiAqIEV4dHJhY3RzIHJvdXRlIHBhcmFtZXRlcnMgZnJvbSBhIGdpdmVuIHBhdGhuYW1lIGJhc2VkIG9uIGEgc3BlY2lmaWVkIHJvdXRlIHBhdGguXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJvdXRlUGF0aCAtIFRoZSByb3V0ZSBwYXRoIGNvbnRhaW5pbmcgcGFyYW1ldGVyIG1hcmtlcnMgKGUuZy4sICcvdXNlcnMvOmlkJykuXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aG5hbWUgLSBUaGUgYWN0dWFsIHBhdGhuYW1lIHRvIGV4dHJhY3QgcGFyYW1ldGVycyBmcm9tIChlLmcuLCAnL3VzZXJzLzEyMycpLlxuICogQHJldHVybiB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gQSBrZXktdmFsdWUgbWFwcGluZyBvZiBwYXJhbWV0ZXIgbmFtZXMgdG8gdGhlaXIgY29ycmVzcG9uZGluZyB2YWx1ZXMgZnJvbSB0aGUgcGF0aG5hbWUuXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RQYXJhbXMoXG4gIHJvdXRlUGF0aDogc3RyaW5nLFxuICBwYXRobmFtZTogc3RyaW5nLFxuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IHBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBjb25zdCByb3V0ZVNlZ21lbnRzID0gcm91dGVQYXRoLnNwbGl0KCcvJyk7XG4gIGNvbnN0IHBhdGhuYW1lU2VnbWVudHMgPSBwYXRobmFtZS5zcGxpdCgnLycpO1xuXG4gIHJvdXRlU2VnbWVudHMuZm9yRWFjaCgoc2VnbWVudCwgaW5kZXgpID0+IHtcbiAgICBpZiAoc2VnbWVudC5zdGFydHNXaXRoKCc6JykpIHtcbiAgICAgIHBhcmFtc1tzZWdtZW50LnN1YnN0cmluZygxKV0gPSBwYXRobmFtZVNlZ21lbnRzW2luZGV4XTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBwYXJhbXM7XG59XG5cbi8qKlxuICogUHJvY2Vzc2VzIGFuZCByZXR1cm5zIHRoZSBjb250ZXh0IG5lY2Vzc2FyeSBmb3Igc3RhdGljIHJvdXRlIGhhbmRsaW5nLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gdGFrZXMgYSBsb2NhdGlvbiBvYmplY3QgYW5kIGEgcm91dGVyIGluc3RhbmNlLCBhbmFseXplcyB0aGUgVVJMIHBhdGggYW5kIHF1ZXJ5IHBhcmFtZXRlcnMsXG4gKiBhbmQgZGV0ZXJtaW5lcyBtYXRjaGluZyByb3V0ZXMuIEl0IGNvbnN0cnVjdHMgYW5kIHJldHVybnMgYSBgU3RhdGljSGFuZGxlckNvbnRleHRgIG9iamVjdCwgd2hpY2ggY29udGFpbnNcbiAqIGRldGFpbHMgYWJvdXQgdGhlIGN1cnJlbnQgcm91dGUgbWF0Y2hpbmcgc3RhdGUsIGxvYWRlci9hY3Rpb24gZGF0YSwgc3RhdHVzIGNvZGUsIGVycm9yIGJvdW5kYXJpZXMsIGFuZCBtb3JlLlxuICogSXQgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCBmb3Igc2VydmVyLXNpZGUgcmVuZGVyaW5nIGFuZCBzdGF0aWMgcm91dGUgYW5hbHlzaXMuXG4gKlxuICogQHBhcmFtIHtSb3V0ZXJTdGF0ZVsnbG9jYXRpb24nXX0gbG9jYXRpb24gLSBUaGUgbG9jYXRpb24gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBVUkwgc3RhdGUgKHBhdGggYW5kIHF1ZXJ5IHBhcmFtZXRlcnMpLlxuICogQHBhcmFtIHtSdW50aW1lUm91dGVyfSByb3V0ZXIgLSBUaGUgcm91dGVyIGluc3RhbmNlIGNvbnRhaW5pbmcgcm91dGUgZGVmaW5pdGlvbnMgYW5kIGRlZmF1bHRzLlxuICogQHJldHVybnMge1N0YXRpY0hhbmRsZXJDb250ZXh0fSAtIFRoZSBjb250ZXh0IG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHN0YXRlIG9mIHRoZSByb3V0ZSBoYW5kbGluZyBwcm9jZXNzLFxuICogaW5jbHVkaW5nIG1hdGNoaW5nIHJvdXRlcywgbG9hZGVyIGFuZCBhY3Rpb24gZGF0YSwgc3RhdHVzIGNvZGVzLCBhbmQgZXJyb3IgaW5mb3JtYXRpb24uXG4gKi9cbmV4cG9ydCBjb25zdCByb3V0ZXJDb250ZXh0ID0gKFxuICBsb2NhdGlvbjogUm91dGVyU3RhdGVbJ2xvY2F0aW9uJ10sXG4gIHJvdXRlcjogUnVudGltZVJvdXRlcixcbik6IFN0YXRpY0hhbmRsZXJDb250ZXh0ID0+IHtcbiAgaWYgKGxvY2F0aW9uLnNlYXJjaC5sZW5ndGggPiAwICYmICFsb2NhdGlvbi5zZWFyY2guc3RhcnRzV2l0aCgnPycpKSB7XG4gICAgbG9jYXRpb24uc2VhcmNoID0gYD8ke2xvY2F0aW9uLnNlYXJjaH1gO1xuICB9XG5cbiAgY29uc3QgcGF0aG5hbWUgPSBsb2NhdGlvbi5wYXRobmFtZS5pbmNsdWRlcyhcbiAgICBwcm9jZXNzLmVudi5QVVJFX0VOVl9TVEFHRSEsXG4gIClcbiAgICA/IGxvY2F0aW9uLnBhdGhuYW1lLnJlcGxhY2UoYC8ke3Byb2Nlc3MuZW52LlBVUkVfRU5WX1NUQUdFfWAsICcvJylcbiAgICA6IGxvY2F0aW9uLnBhdGhuYW1lO1xuXG4gIGNvbnN0IG1hdGNoZXMgPSByb3V0ZXIucm91dGVzXG4gICAgLm1hcCgocm91dGU6IFJvdXRlT2JqZWN0KSA9PiBmaW5kTWF0Y2hpbmdSb3V0ZShyb3V0ZSwgcGF0aG5hbWUpKVxuICAgIC5maWx0ZXIoQm9vbGVhbikgYXMgUm91dGVyU3RhdGVbJ21hdGNoZXMnXTtcblxuICBpZiAobWF0Y2hlcy5sZW5ndGggPT09IDApIHtcbiAgICBjb25zb2xlLndhcm4oJ1tSdW50aW1lXSBObyBtYXRjaGluZyByb3V0ZXMgZm91bmQgZm9yOicsIGxvY2F0aW9uLnBhdGhuYW1lKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLy8gYmFzZW5hbWU6IGAvJHtwcm9jZXNzLmVudi5QVVJFX0VOVl9TVEFHRX0vYCxcbiAgICBiYXNlbmFtZTogJy8nLFxuICAgIG1hdGNoZXM6IG1hdGNoZXMgPz8gW10sXG4gICAgbG9jYXRpb24sXG4gICAgbG9hZGVyRGF0YToge30sXG4gICAgYWN0aW9uRGF0YToge30sXG4gICAgZXJyb3JzOlxuICAgICAgbWF0Y2hlcy5sZW5ndGggPT09IDBcbiAgICAgICAgPyB7XG4gICAgICAgICAgJzQnOiB7XG4gICAgICAgICAgICBwYXRoOiBgLyR7U3RhdHVzQ29kZXMuTk9UX0ZPVU5EfX1gLFxuICAgICAgICAgICAgaWQ6ICc0JyxcbiAgICAgICAgICAgIENvbXBvbmVudDogcm91dGVyLmRlZmF1bHRzLkVycm9yQm91bmRhcnksXG4gICAgICAgICAgICBFcnJvckJvdW5kYXJ5OiByb3V0ZXIuZGVmYXVsdHMuRXJyb3JCb3VuZGFyeSxcbiAgICAgICAgICAgIGhhc0Vycm9yQm91bmRhcnk6IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgfVxuICAgICAgICA6IG51bGwsXG4gICAgc3RhdHVzQ29kZTogbWF0Y2hlcy5sZW5ndGggPiAwID8gMjAwIDogNDA0LFxuICAgIGxvYWRlckhlYWRlcnM6IHt9LFxuICAgIGFjdGlvbkhlYWRlcnM6IHt9LFxuICAgIC8vIF9kZWVwZXN0UmVuZGVyZWRCb3VuZGFyeUlkOiBNYXRoLmZsb29yKDEwMDAwMCArIE1hdGgucmFuZG9tKCkgKiA5MDAwMDApLnRvU3RyaW5nKCksXG4gIH07XG59O1xuIiwgIi8qXG4gKiBFbGFzdGljIExpY2Vuc2UgMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiB3b3JrdGlmLnJ1bnRpbWUuY2RrIDx3b3JrdGlmX3J1bnRpbWVfY2RrPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBFbGFzdGljIExpY2Vuc2UgMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9saWNlbnNpbmcvZWxhc3RpYy1saWNlbnNlIGZvciBkZXRhaWxzLlxuICpcbiAqIFJlLWxpY2Vuc2luZyBub3RpY2U6XG4gKiAgIFRoaXMgZmlsZSB3YXMgcHJldmlvdXNseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgQnVzaW5lc3MgU291cmNlIExpY2Vuc2UgMS4xIChCVVNMLTEuMSkuXG4gKiAgIEFzIG9mIDIwMjUtMDktMjIsIGl0IGlzIHJlLWxpY2Vuc2VkIHVuZGVyIEVsYXN0aWMgTGljZW5zZSAyLjAuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVsYXN0aWMtMi4wXG4gKi9cblxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY3JlYXRlQnJvd3NlclJvdXRlciwgUm91dGVyU3RhdGUgfSBmcm9tICdyZWFjdC1yb3V0ZXInO1xuaW1wb3J0IHsgY3JlYXRlUm9vdCwgaHlkcmF0ZVJvb3QgfSBmcm9tICdyZWFjdC1kb20vY2xpZW50JztcblxuaW1wb3J0IHsgaXNCcm93c2VyLCByb3V0ZXJDb250ZXh0IH0gZnJvbSAnLi9yZWFjdC51dGlscyc7XG5pbXBvcnQgUnVudGltZUFwcFNlcnZlciBmcm9tICcuL3J1bnRpbWUuYXBwLnNlcnZlcic7XG5pbXBvcnQgeyBSdW50aW1lUm91dGVyIH0gZnJvbSAnLi9ydW50aW1lLnJvdXRlcic7XG5pbXBvcnQgeyBpc0xhbWJkYVJ1bnRpbWUgfSBmcm9tICcuL3J1bnRpbWUudXRpbHMnO1xuXG5pbXBvcnQgeyBSdW50aW1lVGhyZWFkcyB9IGZyb20gJy4uL3J1bnRpbWUudHlwZXMnO1xuXG4vLyBUeXBlIGFsaWFzIGZvciBvcHRpb25hbCB2YWx1ZXNcbnR5cGUgTWF5YmU8VD4gPSBUIHwgdW5kZWZpbmVkO1xuXG4vLyBDb25zdGFudCBmb3IgZW1wdHkgc3RyaW5nXG5jb25zdCBFTVBUWV9TVFJJTkcgPSAnJztcblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBydW50aW1lIGluc3RhbmNlIG9mIGEgY29yZSBidW5kbGUsIHdoaWNoIG1heSBvciBtYXkgbm90IGJlIGRlZmluZWQuXG4gKlxuICogVGhpcyB2YXJpYWJsZSBpcyBpbml0aWFsaXplZCB3aXRoIGFuIHVuZGVmaW5lZCB2YWx1ZSBhbmQgY2FuIGJlIGxhdGVyIGFzc2lnbmVkXG4gKiB0byBhIHZhbGlkIGBDb3JlQnVuZGxlYCBpbnN0YW5jZSBpZiBhcHBsaWNhYmxlLlxuICpcbiAqIFRoZSB1c2Ugb2YgYE1heWJlYCB0eXBlIGluZGljYXRlcyB0aGF0IHRoZSBydW50aW1lIGNhbiBlaXRoZXIgaG9sZCBhIGBDb3JlQnVuZGxlYFxuICogaW5zdGFuY2Ugb3Igc3RheSB1bmRlZmluZWQuXG4gKi9cbmV4cG9ydCBsZXQgcnVudGltZVRocmVhZHM6IE1heWJlPFJ1bnRpbWVUaHJlYWRzPiA9IHZvaWQgMDtcblxuLyoqXG4gKiBDb25maWd1cmVzIGFuZCBpbml0aWFsaXplcyB0aGUgUnVudGltZSBhcHBsaWNhdGlvbiB3aXRoIHRoZSBwcm92aWRlZCBvcHRpb25zLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gb3BlcmF0ZXMgaW4gZGlmZmVyZW50IG1vZGVzIGJhc2VkIG9uIHRoZSBleGVjdXRpb24gY29udGV4dDpcbiAqIC0gTGFtYmRhIFJ1bnRpbWU6IFNraXBzIHJlbmRlcmluZyB3aGVuIHJ1bm5pbmcgaW4gQVdTIExhbWJkYSAoc2VydmVybGVzcyByZW5kZXJpbmcgaGFuZGxlZCBzZXBhcmF0ZWx5KVxuICogLSBCcm93c2VyIFJ1bnRpbWU6IEluaXRpYWxpemVzIGFuZCByZW5kZXJzIHRoZSBSZWFjdCBhcHBsaWNhdGlvbiB3aXRoIGh5ZHJhdGlvbiBzdXBwb3J0XG4gKlxuICogQHBhcmFtIHtSdW50aW1lVGhyZWFkc30gcnVudGltZVRocmVhZHNJbnN0YW5jZSAtIFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBSdW50aW1lIGFwcGxpY2F0aW9uLlxuICogQHJldHVybiB7dm9pZH0gVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4gYSB2YWx1ZS5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiByZXF1aXJlZCBjb25maWd1cmF0aW9uIGlzIG1pc3Npbmcgb3IgaW52YWxpZFxuICovXG5leHBvcnQgZnVuY3Rpb24gcnVudGltZShydW50aW1lVGhyZWFkc0luc3RhbmNlOiBSdW50aW1lVGhyZWFkcyk6IHZvaWQge1xuICAvLyBTdG9yZSBydW50aW1lIGNvbmZpZ3VyYXRpb25cbiAgcnVudGltZVRocmVhZHMgPSB7XG4gICAgLi4ucnVudGltZVRocmVhZHNJbnN0YW5jZSxcbiAgfTtcblxuICAvLyBWYWxpZGF0ZSByZXF1aXJlZCBjb25maWd1cmF0aW9uXG4gIGlmICghcnVudGltZVRocmVhZHNJbnN0YW5jZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignW1J1bnRpbWVdIEludmFsaWQgY29uZmlndXJhdGlvbjogcnVudGltZSB0aHJlYWRzIGNvbmZpZ3VyYXRpb24gb2JqZWN0IGlzIHJlcXVpcmVkJyk7XG4gIH1cblxuICBpZiAoIXJ1bnRpbWVUaHJlYWRzSW5zdGFuY2UuYXBwIHx8IHR5cGVvZiBydW50aW1lVGhyZWFkc0luc3RhbmNlLmFwcCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBFcnJvcignW1J1bnRpbWVdIEludmFsaWQgY29uZmlndXJhdGlvbjogYXBwbGljYXRpb24gZW50cnkgZnVuY3Rpb24gaXMgcmVxdWlyZWQnKTtcbiAgfVxuXG4gIGlmICghcnVudGltZVRocmVhZHNJbnN0YW5jZS5yb3V0ZXIgfHwgIShydW50aW1lVGhyZWFkc0luc3RhbmNlLnJvdXRlciBpbnN0YW5jZW9mIFJ1bnRpbWVSb3V0ZXIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdbUnVudGltZV0gSW52YWxpZCBjb25maWd1cmF0aW9uOiByb3V0ZXIgaW5zdGFuY2UgaXMgcmVxdWlyZWQnKTtcbiAgfVxuXG4gIGNvbnNvbGUubG9nKCdbUnVudGltZV0gV2ViIHJ1bnRpbWUgaW5pdGlhbGl6YXRpb24gc3RhcnRlZCB3aXRoIGNvbmZpZ3VyYXRpb246ICcsIHtcbiAgICBoYXNBcHA6ICEhcnVudGltZVRocmVhZHNJbnN0YW5jZS5hcHAsXG4gICAgaGFzUm91dGVyOiAhIXJ1bnRpbWVUaHJlYWRzSW5zdGFuY2Uucm91dGVyLFxuICAgIHNlcnZpY2VOYW1lOiBydW50aW1lVGhyZWFkc0luc3RhbmNlLmNvbmZpZz8uc2VydmljZU5hbWUsXG4gICAgc3RhZ2U6IHJ1bnRpbWVUaHJlYWRzSW5zdGFuY2UuY29uZmlnPy5zdGFnZSxcbiAgfSk7XG5cbiAgLy8gU2tpcCByZW5kZXJpbmcgaW4gTGFtYmRhIHJ1bnRpbWUgKHNlcnZlcmxlc3MgcmVuZGVyaW5nIGlzIGhhbmRsZWQgYnkgTGFtYmRhIGhhbmRsZXIpXG4gIGlmIChpc0xhbWJkYVJ1bnRpbWUoKSkge1xuICAgIGNvbnNvbGUubG9nKCdbUnVudGltZV0gTGFtYmRhIHJ1bnRpbWUgZGV0ZWN0ZWQsIHNraXBwaW5nIGJyb3dzZXIgcmVuZGVyaW5nIHBpcGVsaW5lJyk7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuXG4gIC8vIFJlbmRlciBSZWFjdCBhcHBsaWNhdGlvbiBpbiBicm93c2VyXG4gIHRyeSB7XG4gICAgcmVuZGVyUmVhY3RBcHAocnVudGltZVRocmVhZHNJbnN0YW5jZSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcignW1J1bnRpbWVdIFdlYiBydW50aW1lIHJlbmRlciBmYWlsZWQ6JywgZXJyb3IpO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbi8qKlxuICogUmVuZGVycyB0aGUgc3BlY2lmaWVkIFJlYWN0IGFwcGxpY2F0aW9uIHdpdGggdGhlIHByb3ZpZGVkIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy5cbiAqIFRoZSBtZXRob2QgaGFuZGxlcyBzZXJ2ZXItc2lkZSBoeWRyYXRpb24gaWYgc2VydmVybGVzcyByZW5kZXJpbmcgSFRNTCBleGlzdHMsIG90aGVyd2lzZSBpbml0aWFsaXplcyBhIG5ldyBSZWFjdCByb290IGVsZW1lbnQuXG4gKlxuICogQHBhcmFtIHtSdW50aW1lVGhyZWFkc30gYXBwT3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHJvdXRlciBjb25maWd1cmF0aW9uIGFuZCBhcHBsaWNhdGlvbiBjb21wb25lbnQuXG4gKiBAcmV0dXJucyB7dm9pZH0gVGhpcyBtZXRob2QgZG9lcyBub3QgcmV0dXJuIGEgdmFsdWUuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgcmVxdWlyZWQgRE9NIGVsZW1lbnRzIGFyZSBtaXNzaW5nIG9yIHJlbmRlcmluZyBmYWlsc1xuICovXG5mdW5jdGlvbiByZW5kZXJSZWFjdEFwcChhcHBPcHRpb25zOiBSdW50aW1lVGhyZWFkcyk6IHZvaWQge1xuICAvLyBAdG9kbzogaW5jbHVkZSBjdXN0b20gbG9nZ2VyIHRvIGV2YWx1YXRlIERFQlVHIG9yIERFViB0byBkaXNwbGF5IGxvZ3MsIGV4Y2x1ZGluZyBwcm9kdWN0aW9uIGVudmlyb25tZW50XG4gIGNvbnNvbGUubG9nKCdbUnVudGltZV0gV2ViIHJ1bnRpbWUgYm9vdCBzZXF1ZW5jZSBzdGFydGVkLi4uJyk7XG5cbiAgLy8gRW5zdXJlIHdlJ3JlIGluIGEgYnJvd3NlciBlbnZpcm9ubWVudFxuICBpZiAoIWlzQnJvd3Nlcikge1xuICAgIGNvbnNvbGUud2FybignW1J1bnRpbWVdIE5vbi1icm93c2VyIGVudmlyb25tZW50IGRldGVjdGVkLCBza2lwcGluZyB3ZWIgcnVudGltZSByZW5kZXJpbmcnKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBEb3VibGUtY2hlY2sgTGFtYmRhIHJ1bnRpbWUgKHNob3VsZCBub3QgcmVhY2ggaGVyZSBpbiBMYW1iZGEpXG4gIGlmIChpc0xhbWJkYVJ1bnRpbWUoKSkge1xuICAgIGNvbnNvbGUud2FybignW1J1bnRpbWVdIExhbWJkYSBydW50aW1lIGRldGVjdGVkLCBza2lwcGluZyB3ZWIgcnVudGltZSBib290Jyk7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuXG4gIC8vIEdldCBET00gZWxlbWVudHNcbiAgY29uc3Qgcm9vdEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncm9vdC1pbnRlcm5hbCcpIGFzIEhUTUxFbGVtZW50O1xuICBjb25zdCByb290UnVudGltZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyb290LXJ1bnRpbWUnKSBhcyBIVE1MRWxlbWVudDtcblxuICAvLyBTZXJ2ZXJsZXNzIHJlbmRlcmluZyBIeWRyYXRpb24gUGF0aDogcm9vdFJ1bnRpbWUgZXhpc3RzIHdpdGggc2VydmVybGVzcyByZW5kZXJpbmcgSFRNTFxuICBpZiAocm9vdFJ1bnRpbWU/Lmhhc0NoaWxkTm9kZXMoKSkge1xuICAgIGNvbnNvbGUubG9nKCdbUnVudGltZV0gUHJlLXJlbmRlcmVkIERPTSBzbmFwc2hvdCBjb25maXJtZWQsIGJpbmRpbmcgY2xpZW50IHJ1bnRpbWUuLi4nKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBSZW1vdmUgZmFsbGJhY2sgcm9vdCBlbGVtZW50IGlmIGl0IGV4aXN0c1xuICAgICAgcm9vdEVsZW1lbnQgJiYgcm9vdEVsZW1lbnQucmVtb3ZlKCk7XG4gICAgICAvLyBpZiAocm9vdEVsZW1lbnQpIHtcbiAgICAgIC8vICAgcm9vdEVsZW1lbnQucmVtb3ZlKCk7XG4gICAgICAvLyBjb25zb2xlLmxvZygnW1J1bnRpbWVdIFRlbXBvcmFyeSBmYWxsYmFjayBub2RlIHJlbW92ZWQnKTsgLy8gQHRvZG86IHRoaXMgbG9nIGlzIHJlbGF0ZWQgdG8gREVCVUcgbG9ncyBsZXZlbFxuICAgICAgLy8gfVxuXG4gICAgICAvLyBDaGVjayBpZiBQVVJFX0VOVl9TVEFHRSBpcyBkZWZpbmVkXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBzdGFnZSA9IHByb2Nlc3MuZW52LlBVUkVfRU5WX1NUQUdFO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdcXHgxYlszM20lc1xceDFiWzBtJywgJ1tXQVJOSU5HXSBQVVJFX0VOVl9TVEFHRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBub3QgZGVmaW5lZC4gVGhpcyBtYXkgY2F1c2UgdW5leHBlY3RlZCBiZWhhdmlvciBpbiB0aGUgYXBwbGljYXRpb24uIFBsZWFzZSBzZXQgUFVSRV9FTlZfU1RBR0UgKGUuZy4sIGRldiwgc3RhZ2luZywgcHJvZCknKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3RhZ2UgPSBwcm9jZXNzLmVudi5QVVJFX0VOVl9TVEFHRVxuXG4gICAgICAvLyBOb3JtYWxpemUgcGF0aG5hbWUgYnkgcmVtb3Zpbmcgc3RhZ2UgcHJlZml4IGlmIHByZXNlbnRcbiAgICAgIGNvbnN0IHBhdGhuYW1lID0gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLmluY2x1ZGVzKHN0YWdlISlcbiAgICAgICAgPyB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUucmVwbGFjZShgLyR7c3RhZ2V9L2AsICcvJylcbiAgICAgICAgOiB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWU7XG5cbiAgICAgIGNvbnNvbGUubG9nKCdbUnVudGltZV0gUm91dGUgY29udGV4dCBsb2FkZWQgZm9yOicsIHBhdGhuYW1lKTtcblxuICAgICAgLy8gQnVpbGQgbG9jYXRpb24gb2JqZWN0IGZvciByb3V0ZXIgY29udGV4dFxuICAgICAgY29uc3QgbG9jYXRpb246IFJvdXRlclN0YXRlWydsb2NhdGlvbiddID0ge1xuICAgICAgICBwYXRobmFtZTogcGF0aG5hbWUsXG4gICAgICAgIHNlYXJjaDogd2luZG93LmxvY2F0aW9uLnNlYXJjaCxcbiAgICAgICAgaGFzaDogd2luZG93LmxvY2F0aW9uLmhhc2ggfHwgRU1QVFlfU1RSSU5HLFxuICAgICAgICBrZXk6ICdkZWZhdWx0JyxcbiAgICAgICAgc3RhdGU6IG51bGwsXG4gICAgICB9O1xuXG4gICAgICAvLyBDcmVhdGUgcm91dGVyIGNvbnRleHQgd2l0aCBtYXRjaGVkIHJvdXRlc1xuICAgICAgY29uc3QgY29udGV4dDogYW55ID0gcm91dGVyQ29udGV4dChsb2NhdGlvbiwgYXBwT3B0aW9ucy5yb3V0ZXIpO1xuICAgICAgY29uc29sZS5sb2coJ1tSdW50aW1lXSBSb3V0aW5nIGdyYXBoIHJlc29sdmVkICgnLCBjb250ZXh0Lm1hdGNoZXM/Lmxlbmd0aCB8fCAwLCAnbWF0Y2goZXMpKScpO1xuXG4gICAgICAvLyBDcmVhdGUgYnJvd3NlciByb3V0ZXIgd2l0aCBoeWRyYXRpb24gZGF0YVxuICAgICAgY29uc3Qgcm91dGVyQnJvd3NlciA9IGNyZWF0ZUJyb3dzZXJSb3V0ZXIoYXBwT3B0aW9ucy5yb3V0ZXIucm91dGVzLCB7XG4gICAgICAgIGh5ZHJhdGlvbkRhdGE6IGNvbnRleHQsXG4gICAgICB9KTtcblxuICAgICAgLy8gSW5qZWN0IHJvdXRlciBpbnRvIGFwcCBjb21wb25lbnQgdHJlZVxuICAgICAgLy8gY29uc3QgYXBwUm91dGVkOiBSZWFjdEVsZW1lbnQ8UmVhY3RDb21wb25lbnRQcm9wcywgc3RyaW5nIHwgUmVhY3QuSlNYRWxlbWVudENvbnN0cnVjdG9yPGFueT4+W10gPSBpbmplY3RGbG93KHtcbiAgICAgIC8vICAgY2hpbGRyZW46IGFwcE9wdGlvbnMuYXBwKHsgcm91dGVyOiByb3V0ZXJCcm93c2VyIH0pIGFzIFJlYWN0RWxlbWVudDxSZWFjdENvbXBvbmVudFByb3BzPixcbiAgICAgIC8vICAgcm91dGVyOiBhcHBPcHRpb25zLnJvdXRlcixcbiAgICAgIC8vIH0pO1xuXG4gICAgICBjb25zdCBBcHBSb3V0ZWQgPSAoKSA9PiBhcHBPcHRpb25zLmFwcCh7IHJvdXRlcjogcm91dGVyQnJvd3NlciB9KTtcblxuICAgICAgLy8gSHlkcmF0ZSB0aGUgc2VydmVybGVzcyByZW5kZXJpbmcgSFRNTFxuICAgICAgaHlkcmF0ZVJvb3QoXG4gICAgICAgIHJvb3RSdW50aW1lLFxuICAgICAgICA8UnVudGltZUFwcFNlcnZlcj5cbiAgICAgICAgICA8QXBwUm91dGVkLz5cbiAgICAgICAgPC9SdW50aW1lQXBwU2VydmVyPixcbiAgICAgICAge1xuICAgICAgICAgIG9uUmVjb3ZlcmFibGVFcnJvcjogKGVycm9yLCBlcnJvckluZm8pID0+IHtcbiAgICAgICAgICAgIC8vIExvZyBoeWRyYXRpb24gZXJyb3JzIGluIG5vbi1wcm9kdWN0aW9uIGVudmlyb25tZW50c1xuICAgICAgICAgICAgLy8gaWYgKHByb2Nlc3MuZW52LlBVUkVfRU5WX1NUQUdFICE9PSAncHJvZCcpIHtcbiAgICAgICAgICAgIC8vICAgY29uc29sZS5ncm91cCgnW1J1bnRpbWVdIEh5ZHJhdGlvbiBFcnJvcicpO1xuICAgICAgICAgICAgLy8gICBjb25zb2xlLmVycm9yKCdFcnJvcjonLCBlcnJvcik7XG4gICAgICAgICAgICAvLyAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIEluZm86JywgZXJyb3JJbmZvKTtcbiAgICAgICAgICAgIC8vICAgY29uc29sZS5ncm91cEVuZCgpO1xuICAgICAgICAgICAgLy8gfVxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICApO1xuXG4gICAgICBjb25zb2xlLmxvZygnW1J1bnRpbWVdIFdlYiBydW50aW1lIGJvb3Qgc2VxdWVuY2UgZmluaXNoZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tSdW50aW1lXSBXZWIgcnVudGltZSBib290IHNlcXVlbmNlIGZhaWxlZDonLCBlcnJvcik7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFtSdW50aW1lXSBXZWIgcnVudGltZSBib290IHNlcXVlbmNlIGZhaWxlZDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCk7XG4gICAgfVxuICB9XG4gIC8vIEZyZXNoIFJlbmRlciBQYXRoOiBObyBzZXJ2ZXJsZXNzIHJlbmRlcmluZyBIVE1MLCBjcmVhdGUgbmV3IHJvb3RcbiAgZWxzZSB7XG4gICAgY29uc29sZS5sb2coJ1tSdW50aW1lXSBObyBwcmUtcmVuZGVyZWQgRE9NIHNuYXBzaG90IGZvdW5kLCBjcmVhdGluZyBmcmVzaCBhcHBsaWNhdGlvbiByb290Jyk7XG5cbiAgICAvLyBFbnN1cmUgcm9vdCBlbGVtZW50IGV4aXN0c1xuICAgIGlmICghcm9vdEVsZW1lbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignW1J1bnRpbWVdIFJvb3QgZWxlbWVudCBcInJvb3QtaW50ZXJuYWxcIiBub3QgZm91bmQgaW4gRE9NLiBFbnN1cmUgeW91ciBIVE1MIGluY2x1ZGVzIDxkaXYgaWQ9XCJyb290LWludGVybmFsXCI+PC9kaXY+Jyk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIENyZWF0ZSBicm93c2VyIHJvdXRlciB3aXRob3V0IGh5ZHJhdGlvbiBkYXRhXG4gICAgICBjb25zdCByb3V0ZXJCcm93c2VyOiBhbnkgPSBjcmVhdGVCcm93c2VyUm91dGVyKGFwcE9wdGlvbnMucm91dGVyLmdldFJvdXRlcygpKTtcblxuICAgICAgLy8gQ3JlYXRlIFJlYWN0IHJvb3RcbiAgICAgIGNvbnN0IHJvb3QgPSBjcmVhdGVSb290KHJvb3RFbGVtZW50KTtcblxuICAgICAgLy8gSW5qZWN0IHJvdXRlciBpbnRvIGFwcCBjb21wb25lbnQgdHJlZVxuICAgICAgLy8gY29uc3QgYXBwUm91dGVkOiBSZWFjdEVsZW1lbnQ8UmVhY3RDb21wb25lbnRQcm9wcywgc3RyaW5nIHwgUmVhY3QuSlNYRWxlbWVudENvbnN0cnVjdG9yPGFueT4+W10gPSBpbmplY3RGbG93KHtcbiAgICAgIC8vICAgY2hpbGRyZW46IGFwcE9wdGlvbnMuYXBwKHsgcm91dGVyOiByb3V0ZXJCcm93c2VyIH0pIGFzIFJlYWN0RWxlbWVudDxSZWFjdENvbXBvbmVudFByb3BzPixcbiAgICAgIC8vICAgcm91dGVyOiBhcHBPcHRpb25zLnJvdXRlcixcbiAgICAgIC8vIH0pO1xuXG4gICAgICBjb25zdCBBcHBSb3V0ZWQgPSAoKSA9PiBhcHBPcHRpb25zLmFwcCh7IHJvdXRlcjogcm91dGVyQnJvd3NlciB9KTtcblxuICAgICAgLy8gUmVuZGVyIHRoZSBhcHBsaWNhdGlvblxuICAgICAgcm9vdC5yZW5kZXIoXG4gICAgICAgIDxSZWFjdC5TdHJpY3RNb2RlPlxuICAgICAgICAgIDxBcHBSb3V0ZWQvPlxuICAgICAgICA8L1JlYWN0LlN0cmljdE1vZGU+LFxuICAgICAgKTtcblxuICAgICAgY29uc29sZS5sb2coJ1tSdW50aW1lXSBGcmVzaCB3ZWIgcnVudGltZSByZW5kZXIgY29tcGxldGVkIHN1Y2Nlc3NmdWxseScpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbUnVudGltZV0gRnJlc2ggd2ViIHJ1bnRpbWUgcmVuZGVyIGZhaWxlZDonLCBlcnJvcik7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFtSdW50aW1lXSBSZW5kZXIgZXJyb3IgZGV0YWlsczo6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWApO1xuICAgIH1cbiAgfVxufVxuIiwgIi8qXG4gKiBFbGFzdGljIExpY2Vuc2UgMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiB3b3JrdGlmLnJ1bnRpbWUuY2RrIDx3b3JrdGlmX3J1bnRpbWVfY2RrPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBFbGFzdGljIExpY2Vuc2UgMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9saWNlbnNpbmcvZWxhc3RpYy1saWNlbnNlIGZvciBkZXRhaWxzLlxuICpcbiAqIFJlLWxpY2Vuc2luZyBub3RpY2U6XG4gKiAgIFRoaXMgZmlsZSB3YXMgcHJldmlvdXNseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgQnVzaW5lc3MgU291cmNlIExpY2Vuc2UgMS4xIChCVVNMLTEuMSkuXG4gKiAgIEFzIG9mIDIwMjUtMDktMjIsIGl0IGlzIHJlLWxpY2Vuc2VkIHVuZGVyIEVsYXN0aWMgTGljZW5zZSAyLjAuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVsYXN0aWMtMi4wXG4gKi9cblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQgaXMgYSBMYW1iZGEgb3Igc2VydmVybGVzcyBydW50aW1lLlxuICpcbiAqIFRoZSBmdW5jdGlvbiBpbnNwZWN0cyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgY29tbW9ubHkgc2V0IGJ5IHZhcmlvdXNcbiAqIHNlcnZlcmxlc3MgcGxhdGZvcm1zIGxpa2UgQVdTIExhbWJkYSwgVmVyY2VsLCBOZXRsaWZ5LCBHb29nbGUgQ2xvdWQgRnVuY3Rpb25zLCBldGMuXG4gKlxuICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBlbnZpcm9ubWVudCBtYXRjaGVzIHNlcnZlcmxlc3MgcnVudGltZSBjb25kaXRpb25zLCBvdGhlcndpc2UgZmFsc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0xhbWJkYVJ1bnRpbWUoKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJ1xuICAgID8gT2JqZWN0LmtleXMocHJvY2Vzcy5lbnYpXG4gICAgICAuc29tZSgoa2V5OiBzdHJpbmcpID0+IFtcbiAgICAgICAgJ0FXU19MQU1CREFfRlVOQ1RJT05fTkFNRScsXG4gICAgICAgICdMQU1CREFfVEFTS19ST09UJyxcbiAgICAgICAgJ0ZVTkNUSU9OU19XT1JLRVJfUlVOVElNRScsXG4gICAgICAgICdXRUJTSVRFX0lOU1RBTkNFX0lEJyxcbiAgICAgICAgJ0ZVTkNUSU9OX05BTUUnLFxuICAgICAgICAnS19TRVJWSUNFJyxcbiAgICAgICAgJ1ZFUkNFTCcsXG4gICAgICAgICdORVRMSUZZJyxcbiAgICAgICAgJ0ZBQVNfRU5WJyxcbiAgICAgICAgJ19fT1dfQUNUSU9OX05BTUUnLFxuICAgICAgXS5pbmNsdWRlcyhrZXkpKVxuICAgIDogZmFsc2U7XG59XG4iLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IHdvcmt0aWYucnVudGltZS5jZGsgPHdvcmt0aWZfcnVudGltZV9jZGs+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0yMiwgaXQgaXMgcmUtbGljZW5zaW5nIHVuZGVyIEVsYXN0aWMgTGljZW5zZSAyLjAuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVsYXN0aWMtMi4wXG4gKi9cblxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgaHlkcmF0ZVJvb3QgfSBmcm9tICdyZWFjdC1kb20vY2xpZW50JztcbmltcG9ydCB7IGNyZWF0ZUJyb3dzZXJSb3V0ZXIsIFJvdXRlclByb3ZpZGVyIH0gZnJvbSAncmVhY3Qtcm91dGVyJztcblxuaW1wb3J0IHR5cGUgeyBCcm93c2VyTWV0YWRhdGEsIFJ1bnRpbWVXZWJDb25maWcgfSBmcm9tICdAbGliL3J1bnRpbWUtd2ViL3R5cGVzJztcblxuLy8gaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnQHdvcmt0aWYvdXRpbHMnO1xuXG4vKipcbiAqIEJyb3dzZXIgZXhlY3V0aW9uIHBpcGVsaW5lIGZvciBSdW50aW1lIFdlYiBDb3JlLlxuICpcbiAqIEB0b2RvOiBvcmRpbmF0ZSB0aGlzIGNsYXNzIHRvIGluZnJhIG9yIGNvcmUgY2F1c2Ugd2UgaGF2ZSBOb2RlLmpzIHJlc3BvbnNpYmlsaXR5XG4gKiAgICAgIC0tLS0gT1IgXHUyMDEzPiBSRU1PVkUgTE9HR0VSXG4gKlxuICogKipBUkNISVRFQ1RVUkUgTk9URSoqOiBUaGlzIGZpbGUgaXMgaW4gYHNyYy9saWIvYCBiZWNhdXNlIGl0OlxuICogLSBVc2VzIGJyb3dzZXItb25seSBBUElzICh3aW5kb3csIGRvY3VtZW50LCBoeWRyYXRlUm9vdClcbiAqIC0gUnVucyBPTkxZIGluIGJyb3dzZXIgZW52aXJvbm1lbnRcbiAqIC0gTXVzdCBiZSBpc29tb3JwaGljLXNhZmUgKG5vIE5vZGUuanMgQVBJcylcbiAqIC0gTkVWRVIgcnVucyBpbiBMYW1iZGFcbiAqXG4gKiBIYW5kbGVzIGNsaWVudC1zaWRlIGh5ZHJhdGlvbiBvZiBSZWFjdCBhcHBsaWNhdGlvbnMgd2l0aCBwcmUtbG9hZGVkIGRhdGFcbiAqIGZyb20gc2VydmVyLXNpZGUgcmVuZGVyaW5nLiBTZXRzIHVwIGNsaWVudC1zaWRlIHJvdXRpbmcgYW5kIEhUVFAgY2xpZW50XG4gKiBmb3IgcG9zdC1oeWRyYXRpb24gQVBJIGNhbGxzIHRvIExhbWJkYSBlbmRwb2ludHMuXG4gKlxuICogKipFeGVjdXRpb24gRmxvdyoqOlxuICogMS4gSHlkcmF0ZSBSZWFjdCBhcHAgd2l0aCBleGlzdGluZyBSdW50aW1lUm91dGVyXG4gKiAyLiBDYWxsIGNvbmZpZy5hcHAoeyByb3V0ZXIgfSkgdG8gZ2V0IFJlYWN0IGVsZW1lbnRcbiAqIDMuIEluaXRpYWxpemUgY2xpZW50LXNpZGUgbmF2aWdhdGlvblxuICogNC4gU2V0IHVwIEhUVFAgY2xpZW50IGZvciBMYW1iZGEgZW5kcG9pbnQgY2FsbHNcbiAqXG4gKiAqKlJlcXVpcmVtZW50cyoqOiBSRVEtMDYsIFJFUS0xMlxuICovXG5leHBvcnQgY2xhc3MgQnJvd3NlclBpcGVsaW5lIHtcbiAgLy8gcHJpdmF0ZSByZWFkb25seSBsb2dnZXIgPSBsb2dnZXIoe1xuICAvLyAgIHNlcnZpY2VOYW1lOiAnQGxpYi9ydW50aW1lLXdlYi9waXBlbGluZXMvYnJvd3Nlci1waXBlbGluZScsXG4gIC8vIH0pO1xuXG4gIC8qKlxuICAgKiBFeGVjdXRlIGJyb3dzZXIgcGlwZWxpbmUgZm9yIGNsaWVudC1zaWRlIGh5ZHJhdGlvbi5cbiAgICpcbiAgICogSHlkcmF0ZXMgdGhlIFJlYWN0IGFwcGxpY2F0aW9uIHdpdGggcHJlLWxvYWRlZCBkYXRhIGZyb20gc2VydmVybGVzcyByZW5kZXJpbmcgYW5kIHNldHMgdXBcbiAgICogY2xpZW50LXNpZGUgcm91dGluZy4gVXNlcyBSZWFjdCBoeWRyYXRpb24gKG5vdCByZW5kZXIpIHRvIG1hdGNoIHRoZVxuICAgKiBzZXJ2ZXItcmVuZGVyZWQgSFRNTCBleGFjdGx5LlxuICAgKlxuICAgKiBAcGFyYW0gY29uZmlnIC0gUnVudGltZSBjb25maWd1cmF0aW9uIHdpdGggYXBwIGZhY3RvcnkgYW5kIHJvdXRlclxuICAgKiBAcGFyYW0gY29udGV4dCAtIEJyb3dzZXIgZW52aXJvbm1lbnQgY29udGV4dCB3aXRoIG1ldGFkYXRhXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcGlwZWxpbmUgPSBuZXcgQnJvd3NlclBpcGVsaW5lKCk7XG4gICAqIGF3YWl0IHBpcGVsaW5lLmV4ZWN1dGUoY29uZmlnLCB7XG4gICAqICAgdHlwZTogJ2Jyb3dzZXInLFxuICAgKiAgIG1ldGFkYXRhOiB7XG4gICAqICAgICB1c2VyQWdlbnQ6IG5hdmlnYXRvci51c2VyQWdlbnQsXG4gICAqICAgICB1cmw6IHdpbmRvdy5sb2NhdGlvbi5ocmVmLFxuICAgKiAgICAgdmlld3BvcnQ6IHsgd2lkdGg6IHdpbmRvdy5pbm5lcldpZHRoLCBoZWlnaHQ6IHdpbmRvdy5pbm5lckhlaWdodCB9XG4gICAqICAgfVxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBleGVjdXRlKGNvbmZpZzogUnVudGltZVdlYkNvbmZpZywgY29udGV4dDogeyB0eXBlOiAnYnJvd3Nlcic7IG1ldGFkYXRhOiBCcm93c2VyTWV0YWRhdGEgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zb2xlLmluZm8oJ1N0YXJ0aW5nIGJyb3dzZXIgcGlwZWxpbmUgZXhlY3V0aW9uJywge1xuICAgICAgICBzZXJ2aWNlTmFtZTogY29uZmlnLnNlcnZpY2VOYW1lLFxuICAgICAgICBzdGFnZTogY29uZmlnLnN0YWdlLFxuICAgICAgICB1cmw6IGNvbnRleHQubWV0YWRhdGEudXJsLFxuICAgICAgICB1c2VyQWdlbnQ6IGNvbnRleHQubWV0YWRhdGEudXNlckFnZW50LFxuICAgICAgICB2aWV3cG9ydDogY29udGV4dC5tZXRhZGF0YS52aWV3cG9ydCxcbiAgICAgIH0pO1xuXG4gICAgICAvLyAxLiBDcmVhdGUgYnJvd3NlciByb3V0ZXIgZnJvbSBSdW50aW1lUm91dGVyXG4gICAgICBjb25zdCBicm93c2VyUm91dGVyID0gdGhpcy5jcmVhdGVCcm93c2VyUm91dGVyKGNvbmZpZyk7XG5cbiAgICAgIC8vIDIuIEdldCBSZWFjdCBlbGVtZW50IGZyb20gYXBwIGZhY3RvcnlcbiAgICAgIGNvbnN0IGFwcEVsZW1lbnQgPSB0aGlzLmNyZWF0ZUFwcEVsZW1lbnQoY29uZmlnKTtcblxuICAgICAgLy8gMy4gQ3JlYXRlIHJvdXRlciBwcm92aWRlciB3aXRoIHRoZSBhcHBcbiAgICAgIGNvbnN0IHJvdXRlclByb3ZpZGVyID0gUmVhY3QuY3JlYXRlRWxlbWVudChSb3V0ZXJQcm92aWRlciwge1xuICAgICAgICByb3V0ZXI6IGJyb3dzZXJSb3V0ZXIsXG4gICAgICB9LCBhcHBFbGVtZW50KTtcblxuICAgICAgLy8gNC4gSHlkcmF0ZSB0aGUgYXBwbGljYXRpb24gKHVzZSBoeWRyYXRpb24sIG5vdCByZW5kZXIpXG4gICAgICB0aGlzLmh5ZHJhdGVBcHBsaWNhdGlvbihyb3V0ZXJQcm92aWRlcik7XG5cbiAgICAgIC8vIDUuIFNldCB1cCBIVFRQIGNsaWVudCBmb3IgcG9zdC1oeWRyYXRpb24gQVBJIGNhbGxzXG4gICAgICB0aGlzLnNldHVwSHR0cENsaWVudChjb25maWcpO1xuXG4gICAgICBjb25zb2xlLmluZm8oJ0Jyb3dzZXIgcGlwZWxpbmUgZXhlY3V0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHknLCB7XG4gICAgICAgIHNlcnZpY2VOYW1lOiBjb25maWcuc2VydmljZU5hbWUsXG4gICAgICAgIHN0YWdlOiBjb25maWcuc3RhZ2UsXG4gICAgICB9KTtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdCcm93c2VyIHBpcGVsaW5lIGV4ZWN1dGlvbiBmYWlsZWQnLCB7XG4gICAgICAgIHNlcnZpY2VOYW1lOiBjb25maWcuc2VydmljZU5hbWUsXG4gICAgICAgIHN0YWdlOiBjb25maWcuc3RhZ2UsXG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICAgIHN0YWNrOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3Iuc3RhY2sgOiB1bmRlZmluZWQsXG4gICAgICB9KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYnJvd3NlciByb3V0ZXIgZnJvbSBSdW50aW1lUm91dGVyIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIFVzZXMgdGhlIGV4aXN0aW5nIFJ1bnRpbWVSb3V0ZXIgdG8gZ2V0IHJvdXRlcyBhbmQgY3JlYXRlcyBhIFJlYWN0IFJvdXRlclxuICAgKiBicm93c2VyIHJvdXRlciBmb3IgY2xpZW50LXNpZGUgbmF2aWdhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGNvbmZpZyAtIFJ1bnRpbWUgY29uZmlndXJhdGlvblxuICAgKiBAcmV0dXJucyBCcm93c2VyIHJvdXRlciBpbnN0YW5jZVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVCcm93c2VyUm91dGVyKGNvbmZpZzogUnVudGltZVdlYkNvbmZpZykge1xuICAgIGNvbnNvbGUuZGVidWcoJ0NyZWF0aW5nIGJyb3dzZXIgcm91dGVyJywge1xuICAgICAgcm91dGVDb3VudDogY29uZmlnLnJvdXRlci5nZXRSb3V0ZXMoKS5sZW5ndGgsXG4gICAgfSk7XG5cbiAgICAvLyBHZXQgcm91dGVzIGZyb20gUnVudGltZVJvdXRlclxuICAgIGNvbnN0IHJvdXRlcyA9IGNvbmZpZy5yb3V0ZXIuZ2V0Um91dGVzKCk7XG5cbiAgICAvLyBDcmVhdGUgYnJvd3NlciByb3V0ZXIgd2l0aCByb3V0ZXMgKGNhc3QgdG8gUm91dGVPYmplY3RbXSBmb3IgY29tcGF0aWJpbGl0eSlcbiAgICBjb25zdCBicm93c2VyUm91dGVyID0gY3JlYXRlQnJvd3NlclJvdXRlcihyb3V0ZXMgYXMgYW55KTtcblxuICAgIGNvbnNvbGUuZGVidWcoJ0Jyb3dzZXIgcm91dGVyIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5Jywge1xuICAgICAgcm91dGVDb3VudDogcm91dGVzLmxlbmd0aCxcbiAgICB9KTtcblxuICAgIHJldHVybiBicm93c2VyUm91dGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBSZWFjdCBlbGVtZW50IGZyb20gYXBwIGZhY3RvcnkgZnVuY3Rpb24uXG4gICAqXG4gICAqIENhbGxzIHRoZSB1c2VyJ3MgYXBwIGZhY3RvcnkgZnVuY3Rpb24gd2l0aCB0aGUgcm91dGVyIGRlcGVuZGVuY3lcbiAgICogdG8gZ2V0IHRoZSByb290IFJlYWN0IGVsZW1lbnQgZm9yIHRoZSBhcHBsaWNhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGNvbmZpZyAtIFJ1bnRpbWUgY29uZmlndXJhdGlvblxuICAgKiBAcmV0dXJucyBSb290IFJlYWN0IGVsZW1lbnRcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlQXBwRWxlbWVudChjb25maWc6IFJ1bnRpbWVXZWJDb25maWcpOiBSZWFjdC5SZWFjdEVsZW1lbnQge1xuICAgIGNvbnNvbGUuZGVidWcoJ0NyZWF0aW5nIGFwcCBlbGVtZW50IGZyb20gZmFjdG9yeScpO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIENhbGwgYXBwIGZhY3Rvcnkgd2l0aCByb3V0ZXIgZGVwZW5kZW5jeVxuICAgICAgY29uc3QgYXBwRWxlbWVudCA9IGNvbmZpZy5hcHAoeyByb3V0ZXI6IGNvbmZpZy5yb3V0ZXIgfSk7XG5cbiAgICAgIGlmICghUmVhY3QuaXNWYWxpZEVsZW1lbnQoYXBwRWxlbWVudCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcHAgZmFjdG9yeSBtdXN0IHJldHVybiBhIHZhbGlkIFJlYWN0IGVsZW1lbnQnKTtcbiAgICAgIH1cblxuICAgICAgY29uc29sZS5kZWJ1ZygnQXBwIGVsZW1lbnQgY3JlYXRlZCBzdWNjZXNzZnVsbHknKTtcbiAgICAgIHJldHVybiBhcHBFbGVtZW50O1xuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBjcmVhdGUgYXBwIGVsZW1lbnQnLCB7XG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICB9KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSBhcHAgZWxlbWVudDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEh5ZHJhdGUgdGhlIFJlYWN0IGFwcGxpY2F0aW9uIGluIHRoZSBicm93c2VyLlxuICAgKlxuICAgKiBVc2VzIFJlYWN0J3MgaHlkcmF0ZVJvb3QgdG8gaHlkcmF0ZSB0aGUgc2VydmVyLXJlbmRlcmVkIEhUTUwgd2l0aFxuICAgKiB0aGUgY2xpZW50LXNpZGUgUmVhY3QgYXBwbGljYXRpb24uIFRoaXMgZW5zdXJlcyB0aGUgY2xpZW50IG1hdGNoZXNcbiAgICogdGhlIHNlcnZlciBleGFjdGx5IHRvIGF2b2lkIGh5ZHJhdGlvbiBtaXNtYXRjaGVzLlxuICAgKlxuICAgKiBAcGFyYW0gcm91dGVyUHJvdmlkZXIgLSBSb3V0ZXIgcHJvdmlkZXIgZWxlbWVudCB0byBoeWRyYXRlXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGh5ZHJhdGVBcHBsaWNhdGlvbihyb3V0ZXJQcm92aWRlcjogUmVhY3QuUmVhY3RFbGVtZW50KTogdm9pZCB7XG4gICAgY29uc29sZS5kZWJ1ZygnU3RhcnRpbmcgUmVhY3QgaHlkcmF0aW9uJyk7XG5cbiAgICB0cnkge1xuICAgICAgLy8gR2V0IHRoZSByb290IGNvbnRhaW5lciBlbGVtZW50XG4gICAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncm9vdCcpO1xuICAgICAgaWYgKCFjb250YWluZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSb290IGNvbnRhaW5lciBlbGVtZW50IG5vdCBmb3VuZC4gRXhwZWN0ZWQgZWxlbWVudCB3aXRoIGlkPVwicm9vdFwiJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIEh5ZHJhdGUgdGhlIGFwcGxpY2F0aW9uIChub3QgcmVuZGVyIC0gbXVzdCBtYXRjaCBzZXJ2ZXIgSFRNTClcbiAgICAgIGh5ZHJhdGVSb290KGNvbnRhaW5lciwgcm91dGVyUHJvdmlkZXIpO1xuXG4gICAgICBjb25zb2xlLmluZm8oJ1JlYWN0IGh5ZHJhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5Jyk7XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignUmVhY3QgaHlkcmF0aW9uIGZhaWxlZCcsIHtcbiAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZWFjdCBoeWRyYXRpb24gZmFpbGVkOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0IHVwIEhUVFAgY2xpZW50IGZvciBMYW1iZGEgZW5kcG9pbnQgY2FsbHMuXG4gICAqXG4gICAqIENvbmZpZ3VyZXMgdGhlIEhUVFAgY2xpZW50IGZvciBtYWtpbmcgQVBJIGNhbGxzIHRvIExhbWJkYSBlbmRwb2ludHNcbiAgICogYWZ0ZXIgaHlkcmF0aW9uLiBUaGlzIGlzIHVzZWQgZm9yIHBvc3QtaHlkcmF0aW9uIGludGVyYWN0aW9ucyB0aGF0XG4gICAqIHJlcXVpcmUgc2VydmVyLXNpZGUgZGF0YS5cbiAgICpcbiAgICogQHBhcmFtIGNvbmZpZyAtIFJ1bnRpbWUgY29uZmlndXJhdGlvblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBzZXR1cEh0dHBDbGllbnQoY29uZmlnOiBSdW50aW1lV2ViQ29uZmlnKTogdm9pZCB7XG4gICAgY29uc29sZS5kZWJ1ZygnU2V0dGluZyB1cCBIVFRQIGNsaWVudCBmb3IgTGFtYmRhIGVuZHBvaW50cycpO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFNldCB1cCBiYXNlIFVSTCBmb3IgQVBJIGNhbGxzIGJhc2VkIG9uIHN0YWdlXG4gICAgICBjb25zdCBiYXNlVXJsID0gdGhpcy5nZXRBcGlCYXNlVXJsKGNvbmZpZy5zdGFnZSk7XG5cbiAgICAgIC8vIFN0b3JlIGNvbmZpZ3VyYXRpb24gZ2xvYmFsbHkgZm9yIHVzZSBieSBkYXRhIGxvYWRlcnNcbiAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAod2luZG93IGFzIGFueSkuX19SVU5USU1FX0NPTkZJR19fID0ge1xuICAgICAgICAgIHNlcnZpY2VOYW1lOiBjb25maWcuc2VydmljZU5hbWUsXG4gICAgICAgICAgc3RhZ2U6IGNvbmZpZy5zdGFnZSxcbiAgICAgICAgICBhcGlCYXNlVXJsOiBiYXNlVXJsLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjb25zb2xlLmluZm8oJ0hUVFAgY2xpZW50IGNvbmZpZ3VyZWQgc3VjY2Vzc2Z1bGx5Jywge1xuICAgICAgICBiYXNlVXJsLFxuICAgICAgICBzdGFnZTogY29uZmlnLnN0YWdlLFxuICAgICAgfSk7XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIHNldHVwIEhUVFAgY2xpZW50Jywge1xuICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgICAgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBzZXR1cCBIVFRQIGNsaWVudDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBBUEkgYmFzZSBVUkwgYmFzZWQgb24gZGVwbG95bWVudCBzdGFnZS5cbiAgICpcbiAgICogRGV0ZXJtaW5lcyB0aGUgYXBwcm9wcmlhdGUgQVBJIGJhc2UgVVJMIGZvciBtYWtpbmcgSFRUUCByZXF1ZXN0c1xuICAgKiB0byBMYW1iZGEgZW5kcG9pbnRzIGJhc2VkIG9uIHRoZSBkZXBsb3ltZW50IHN0YWdlLlxuICAgKlxuICAgKiBAcGFyYW0gc3RhZ2UgLSBEZXBsb3ltZW50IHN0YWdlXG4gICAqIEByZXR1cm5zIEFQSSBiYXNlIFVSTFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBnZXRBcGlCYXNlVXJsKHN0YWdlOiAnZGV2JyB8ICdzdGFnaW5nJyB8ICdwcm9kJyk6IHN0cmluZyB7XG4gICAgLy8gSW4gYnJvd3NlciBjb250ZXh0LCBBUEkgY2FsbHMgZ28gdGhyb3VnaCB0aGUgc2FtZSBvcmlnaW5cbiAgICAvLyBUaGUgYWN0dWFsIEFQSSBHYXRld2F5IFVSTCBpcyBoYW5kbGVkIGJ5IENsb3VkRnJvbnQgcm91dGluZ1xuICAgIGNvbnN0IG9yaWdpbiA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gd2luZG93LmxvY2F0aW9uLm9yaWdpbiA6ICcnO1xuXG4gICAgLy8gQVBJIGVuZHBvaW50cyBhcmUgdHlwaWNhbGx5IHVuZGVyIC9hcGkgcGF0aFxuICAgIHJldHVybiBgJHtvcmlnaW59L2FwaWA7XG4gIH1cbn1cbiIsICIvKlxuICogRWxhc3RpYyBMaWNlbnNlIDIuMFxuICogQ29weXJpZ2h0IChDKSAyMDI1XHUyMDEzcHJlc2VudCBSYW1hbiBNYXJvemF1LCBXb3JrIFRhcmdldCBJbnNpZ2h0IEZ1bmN0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQ29udGFjdDogcmFtYW5Ad29ya3RpZi5jb21cbiAqXG4gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGljZW5zZWQgV29yazogd29ya3RpZi5ydW50aW1lLmNkayA8d29ya3RpZl9ydW50aW1lX2Nkaz4uXG4gKiBVc2Ugb2YgdGhpcyBzb2Z0d2FyZSBpcyBnb3Zlcm5lZCBieSB0aGUgRWxhc3RpYyBMaWNlbnNlIDIuMDsgc2VlIHRoZSBMSUNFTlNFIGZpbGVcbiAqIG9yIGh0dHBzOi8vd3d3LmVsYXN0aWMuY28vbGljZW5zaW5nL2VsYXN0aWMtbGljZW5zZSBmb3IgZGV0YWlscy5cbiAqXG4gKiBSZS1saWNlbnNpbmcgbm90aWNlOlxuICogICBUaGlzIGZpbGUgd2FzIHByZXZpb3VzbHkgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJ1c2luZXNzIFNvdXJjZSBMaWNlbnNlIDEuMSAoQlVTTC0xLjEpLlxuICogICBBcyBvZiAyMDI1LTA5LTIyLCBpdCBpcyByZS1saWNlbnNlZCB1bmRlciBFbGFzdGljIExpY2Vuc2UgMi4wLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFbGFzdGljLTIuMFxuICovXG5cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IFJvdXRlT2JqZWN0IH0gZnJvbSAncmVhY3Qtcm91dGVyJztcblxuaW1wb3J0IHR5cGUgeyBJbmZyYU9wdGlvbnMgfSBmcm9tICcuL2luZnJhLnR5cGVzJztcbmltcG9ydCB0eXBlIHsgTWljcm9zZXJ2aWNlRGVmaW5pdGlvbiB9IGZyb20gJy4vbWljcm9zZXJ2aWNlLnR5cGVzJztcbmltcG9ydCB7IFJ1bnRpbWVSb3V0ZXJEZWZhdWx0cyB9IGZyb20gJy4uLy4uL3J1bnRpbWUtY29yZSc7XG5cbi8qKlxuICogUnVudGltZVJvdXRlciBpbnRlcmZhY2UgZm9yIHJ1bnRpbWUtd2ViIGludGVncmF0aW9uLlxuICpcbiAqIERlZmluZXMgdGhlIGVzc2VudGlhbCBtZXRob2RzIG5lZWRlZCBieSB0aGUgcnVudGltZS13ZWIgcGlwZWxpbmVzLlxuICogVGhpcyBpbnRlcmZhY2UgbWF0Y2hlcyB0aGUgYWN0dWFsIFJ1bnRpbWVSb3V0ZXIgY2xhc3MgZnJvbSBAbGliL3J1bnRpbWUtY29yZS9ydW50aW1lLnJvdXRlci5cbiAqL1xuaW50ZXJmYWNlIFJ1bnRpbWVSb3V0ZXJJbnRlcmZhY2Uge1xuICAvKipcbiAgICogR2V0IGFsbCByb3V0ZSBvYmplY3RzIGFzIGFuIGFycmF5LlxuICAgKiBVc2VkIGZvciBjcmVhdGluZyBicm93c2VyIHJvdXRlcnMgYW5kIHNlcnZlcmxlc3MgcmVuZGVyaW5nIHN0YXRpYyBoYW5kbGVycy5cbiAgICovXG4gIGdldFJvdXRlcygpOiBBcnJheTxSb3V0ZU9iamVjdD47XG5cbiAgLyoqXG4gICAqIEZpbmQgYSByb3V0ZSBieSBpdHMgSUQuXG4gICAqL1xuICBnZXRSb3V0ZUJ5SWQ/KGlkOiBzdHJpbmcpOiBSb3V0ZU9iamVjdCB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogRmluZCBhIHJvdXRlIGJ5IGl0cyBwYXRoLlxuICAgKi9cbiAgZ2V0Um91dGVCeVBhdGg/KHBhdGg6IHN0cmluZyk6IFJvdXRlT2JqZWN0IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHJvdXRlcyBhcnJheSAoZ2V0dGVyKS5cbiAgICovXG4gIHJvdXRlcz86IEFycmF5PFJvdXRlT2JqZWN0PjtcblxuICAvKipcbiAgICogR2V0IHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBkZWZhdWx0cz86IFJ1bnRpbWVSb3V0ZXJEZWZhdWx0cztcbn1cblxuLyoqXG4gKiBTdGFnZSBlbnZpcm9ubWVudCBmb3IgZGVwbG95bWVudC5cbiAqXG4gKiAtIGBkZXZgOiBEZXZlbG9wbWVudCBlbnZpcm9ubWVudFxuICogLSBgc3RhZ2luZ2A6IFN0YWdpbmcvcHJlLXByb2R1Y3Rpb24gZW52aXJvbm1lbnRcbiAqIC0gYHByb2RgOiBQcm9kdWN0aW9uIGVudmlyb25tZW50XG4gKi9cbmV4cG9ydCB0eXBlIFN0YWdlID0gJ2RldicgfCAnc3RhZ2luZycgfCAncHJvZCc7XG5cbi8qKlxuICogVXRpbGl0eSB0eXBlIHRvIGV4dHJhY3Qgc2VydmljZSBuYW1lcyBmcm9tIHJlZ2lzdGVyIGNvbmZpZ3VyYXRpb24uXG4gKlxuICogVGhpcyBlbmFibGVzIGNvbXBpbGUtdGltZSB2YWxpZGF0aW9uIG9mIHNlcnZpY2UgbmFtZXMgYW5kIHByb3ZpZGVzXG4gKiB0eXBlLXNhZmUgYWNjZXNzIHRvIHNlcnZpY2UgaWRlbnRpZmllcnMgdGhyb3VnaG91dCB0aGUgZnJhbWV3b3JrLlxuICpcbiAqIEB0ZW1wbGF0ZSBUIC0gVGhlIHJlZ2lzdGVyIGNvbmZpZ3VyYXRpb24gb2JqZWN0IHR5cGVcbiAqL1xuZXhwb3J0IHR5cGUgU2VydmljZU5hbWVzPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBNaWNyb3NlcnZpY2VEZWZpbml0aW9uPj4gPSBrZXlvZiBUO1xuXG4vKipcbiAqIFV0aWxpdHkgdHlwZSB0byBnZW5lcmF0ZSBMYW1iZGEgSURzIGZyb20gc2VydmljZSBjb25maWd1cmF0aW9uLlxuICpcbiAqIENvbWJpbmVzIHNlcnZpY2UgbmFtZXMgd2l0aCBMYW1iZGEgSURzIHRvIGNyZWF0ZSBmdWxseSBxdWFsaWZpZWRcbiAqIExhbWJkYSBpZGVudGlmaWVycyBmb3IgdHlwZS1zYWZlIExhbWJkYSByZXNvbHV0aW9uLlxuICpcbiAqIEB0ZW1wbGF0ZSBUIC0gVGhlIHJlZ2lzdGVyIGNvbmZpZ3VyYXRpb24gb2JqZWN0IHR5cGVcbiAqL1xuZXhwb3J0IHR5cGUgTGFtYmRhSWRzPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBNaWNyb3NlcnZpY2VEZWZpbml0aW9uPj4gPSB7XG4gIFtLIGluIGtleW9mIFRdOiBUW0tdWydsYW1iZGFzJ11bbnVtYmVyXSBleHRlbmRzIHsgaWQ6IGluZmVyIEkgfVxuICAgID8gSSBleHRlbmRzIHN0cmluZ1xuICAgICAgPyBgJHtLICYgc3RyaW5nfS4ke0l9YFxuICAgICAgOiBuZXZlclxuICAgIDogbmV2ZXI7XG59W2tleW9mIFRdO1xuXG4vKipcbiAqIFR5cGUgY29uc3RyYWludCBmb3IgdmFsaWQgc2VydmljZSBuYW1lcy5cbiAqXG4gKiBFbnN1cmVzIHNlcnZpY2UgbmFtZXMgZm9sbG93IHRoZSB2YWxpZGF0aW9uIHBhdHRlcm46XG4gKiAtIE11c3Qgc3RhcnQgd2l0aCBhIGxldHRlciAoYS16LCBBLVopXG4gKiAtIENhbiBjb250YWluIGxldHRlcnMsIG51bWJlcnMsIGFuZCBoeXBoZW5zXG4gKiAtIE1heGltdW0gbGVuZ3RoOiAxMjggY2hhcmFjdGVyc1xuICpcbiAqIFRoaXMgaXMgYSBicmFuZGVkIHR5cGUgdGhhdCBwcm92aWRlcyBjb21waWxlLXRpbWUgdmFsaWRhdGlvbi5cbiAqL1xuZXhwb3J0IHR5cGUgVmFsaWRTZXJ2aWNlTmFtZSA9IHN0cmluZyAmIHsgcmVhZG9ubHkgX19icmFuZDogJ1ZhbGlkU2VydmljZU5hbWUnIH07XG5cbi8qKlxuICogVHlwZSBndWFyZCB0byB2YWxpZGF0ZSBzZXJ2aWNlIG5hbWUgZm9ybWF0LlxuICpcbiAqIEBwYXJhbSBzZXJ2aWNlTmFtZSAtIFRoZSBzZXJ2aWNlIG5hbWUgdG8gdmFsaWRhdGVcbiAqIEByZXR1cm5zIFR5cGUgcHJlZGljYXRlIGluZGljYXRpbmcgaWYgdGhlIHNlcnZpY2UgbmFtZSBpcyB2YWxpZFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFNlcnZpY2VOYW1lKHNlcnZpY2VOYW1lOiBzdHJpbmcpOiBzZXJ2aWNlTmFtZSBpcyBWYWxpZFNlcnZpY2VOYW1lIHtcbiAgcmV0dXJuIC9eW2EtekEtWl1bYS16QS1aMC05LV17MCwxMjd9JC8udGVzdChzZXJ2aWNlTmFtZSk7XG59XG5cbi8qKlxuICogTWFpbiBjb25maWd1cmF0aW9uIGludGVyZmFjZSBmb3IgUnVudGltZSBXZWIgQ29yZS5cbiAqXG4gKiBUaGlzIGludGVyZmFjZSBwcm92aWRlcyBhIHVuaWZpZWQgY29uZmlndXJhdGlvbiB0aGF0IHdvcmtzIGFjcm9zcyBhbGwgZXhlY3V0aW9uIGNvbnRleHRzOlxuICogLSBCcm93c2VyOiBIeWRyYXRlcyBSZWFjdCBhcHBsaWNhdGlvbiB3aXRoIGNsaWVudC1zaWRlIHJvdXRpbmdcbiAqIC0gTGFtYmRhOiBFeGVjdXRlcyBzZXJ2ZXItc2lkZSByZW5kZXJpbmcgYW5kIGJ1c2luZXNzIGxvZ2ljXG4gKiAtIENESzogU3ludGhlc2l6ZXMgQ2xvdWRGb3JtYXRpb24gaW5mcmFzdHJ1Y3R1cmVcbiAqXG4gKiBAdGVtcGxhdGUgVFJlZ2lzdGVyIC0gVGhlIHJlZ2lzdGVyIGNvbmZpZ3VyYXRpb24gdHlwZSBmb3IgdHlwZS1zYWZlIHNlcnZpY2UgbmFtZXNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgcnVudGltZSB9IGZyb20gJ0B3b3JrdGlmL3J1bnRpbWUvcnVudGltZS13ZWInO1xuICogaW1wb3J0IHsgUnVudGltZVJvdXRlciB9IGZyb20gJ0B3b3JrdGlmL3J1bnRpbWUnO1xuICpcbiAqIGNvbnN0IGNvbmZpZyA9IHtcbiAqICAgYXBwOiAoeyByb3V0ZXIgfSkgPT4gPEFwcCByb3V0ZXI9e3JvdXRlcn0gLz4sXG4gKiAgIHJvdXRlcjogbmV3IFJ1bnRpbWVSb3V0ZXIoeyByb3V0ZXI6IHJvdXRlcywgZGVmYXVsdHM6IHt9IH0pLFxuICogICBzZXJ2aWNlTmFtZTogJ215LWFwcCcsXG4gKiAgIHN0YWdlOiAnZGV2JyxcbiAqICAgcmVnaXN0ZXI6IHtcbiAqICAgICBwYXltZW50czoge1xuICogICAgICAgdGllczogW1BheW1lbnRzVGllc10sXG4gKiAgICAgICBsYW1iZGFzOiBbY2hhcmdlSGFuZGxlciwgcmVmdW5kSGFuZGxlcl1cbiAqICAgICB9LFxuICogICAgIHVzZXJzOiB7XG4gKiAgICAgICB0aWVzOiBbVXNlcnNUaWVzXSxcbiAqICAgICAgIGxhbWJkYXM6IFtjcmVhdGVVc2VySGFuZGxlciwgZ2V0VXNlckhhbmRsZXJdXG4gKiAgICAgfVxuICogICB9IGFzIGNvbnN0LCAgLy8gVXNlICdhcyBjb25zdCcgZm9yIGJldHRlciB0eXBlIGluZmVyZW5jZVxuICogICBpbmZyYToge1xuICogICAgIGVudjogeyBhY2NvdW50OiAnMTIzNDU2Nzg5MDEyJywgcmVnaW9uOiAndXMtZWFzdC0xJyB9LFxuICogICAgIHN0YWdlOiAnZGV2JyxcbiAqICAgICByZWFjdEVudHJ5OiAnLi9zcmMvaW5kZXgudHN4JyxcbiAqICAgICBhcGlNb2RlOiAnYXBpR2F0ZXdheSdcbiAqICAgfVxuICogfSBzYXRpc2ZpZXMgUnVudGltZVdlYkNvbmZpZztcbiAqXG4gKiBydW50aW1lKGNvbmZpZyk7XG4gKiBgYGBcbiAqXG4gKiBAdG9kbzogYWZ0ZXIgUnVudGltZVdlYiByZXBvIHdpbGwgYmUgcmVzb2x2ZWQsIFJ1bnRpbWVXZWJDb25maWcgTVVTVCBleHRlbmQgUnVudGltZVdlYkNvbmZpZyBDb3JlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnVudGltZVdlYkNvbmZpZzxUUmVnaXN0ZXIgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBNaWNyb3NlcnZpY2VEZWZpbml0aW9uPiA9IFJlY29yZDxzdHJpbmcsIE1pY3Jvc2VydmljZURlZmluaXRpb24+PiB7XG4gIC8qKlxuICAgKiBSZWFjdCBhcHBsaWNhdGlvbiBjb21wb25lbnQgZmFjdG9yeSBmdW5jdGlvbi5cbiAgICpcbiAgICogUmVjZWl2ZXMgdGhlIHJvdXRlciBpbnN0YW5jZSBhcyBhIGRlcGVuZGVuY3kgYW5kIHJldHVybnMgdGhlIHJvb3QgUmVhY3QgZWxlbWVudC5cbiAgICogVGhpcyBwYXR0ZXJuIGVuYWJsZXMgZGVwZW5kZW5jeSBpbmplY3Rpb24gb2YgdGhlIHJvdXRlciBpbnRvIHlvdXIgYXBwbGljYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBkZXBzIC0gRGVwZW5kZW5jaWVzIG9iamVjdCBjb250YWluaW5nIHRoZSByb3V0ZXJcbiAgICogQHBhcmFtIGRlcHMucm91dGVyIC0gUnVudGltZVJvdXRlciBpbnN0YW5jZSBmb3IgbmF2aWdhdGlvbiBhbmQgcm91dGluZ1xuICAgKiBAcmV0dXJucyBSb290IFJlYWN0IGVsZW1lbnQgKFJlYWN0LlJlYWN0RWxlbWVudClcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBhcHA6ICh7IHJvdXRlciB9KSA9PiA8QXBwIHJvdXRlcj17cm91dGVyfSAvPlxuICAgKiBgYGBcbiAgICovXG4gIGFwcDogKGRlcHM6IHsgcm91dGVyOiBSdW50aW1lUm91dGVySW50ZXJmYWNlIH0pID0+IFJlYWN0LlJlYWN0RWxlbWVudDtcblxuICAvKipcbiAgICogUnVudGltZVJvdXRlciBpbnN0YW5jZSBmb3IgYXBwbGljYXRpb24gcm91dGluZy5cbiAgICpcbiAgICogRGVmaW5lcyBhbGwgcm91dGVzLCBsb2FkZXJzLCBhbmQgbmF2aWdhdGlvbiBjb25maWd1cmF0aW9uLlxuICAgKiBUaGUgcm91dGVyIGlzIHVzZWQgaW4gYm90aCBzZXJ2ZXItc2lkZSByZW5kZXJpbmcgKExhbWJkYSkgYW5kIGNsaWVudC1zaWRlIGh5ZHJhdGlvbiAoYnJvd3NlcikuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIFJ1bnRpbWVSb3V0ZXJJbnRlcmZhY2V9IGZvciByb3V0ZXIgY29uZmlndXJhdGlvblxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIHJvdXRlcjogbmV3IFJ1bnRpbWVSb3V0ZXIoe1xuICAgKiAgIHJvdXRlcjogW1xuICAgKiAgICAgeyBwYXRoOiAnLycsIGVsZW1lbnQ6IDxIb21lIC8+IH0sXG4gICAqICAgICB7IHBhdGg6ICcvYWJvdXQnLCBlbGVtZW50OiA8QWJvdXQgLz4gfVxuICAgKiAgIF0sXG4gICAqICAgZGVmYXVsdHM6IHt9XG4gICAqIH0pXG4gICAqIGBgYFxuICAgKi9cbiAgcm91dGVyOiBSdW50aW1lUm91dGVySW50ZXJmYWNlO1xuXG4gIC8qKlxuICAgKiBTZXJ2aWNlIG5hbWUgaWRlbnRpZmllciBmb3IgdGhlIGFwcGxpY2F0aW9uLlxuICAgKlxuICAgKiBVc2VkIGFzIGEgcHJlZml4IGZvciBhbGwgQVdTIHJlc291cmNlcyAoTGFtYmRhIGZ1bmN0aW9ucywgQVBJIEdhdGV3YXksIFMzIGJ1Y2tldHMsIGV0Yy4pLlxuICAgKiBNdXN0IGJlIHVuaXF1ZSB3aXRoaW4geW91ciBBV1MgYWNjb3VudCBhbmQgcmVnaW9uLlxuICAgKlxuICAgKiAqKlZhbGlkYXRpb24gUnVsZXMqKjpcbiAgICogLSBNdXN0IHN0YXJ0IHdpdGggYSBsZXR0ZXIgKGEteiwgQS1aKVxuICAgKiAtIENhbiBjb250YWluIGxldHRlcnMsIG51bWJlcnMsIGFuZCBoeXBoZW5zXG4gICAqIC0gTWF4aW11bSBsZW5ndGg6IDEyOCBjaGFyYWN0ZXJzXG4gICAqIC0gUGF0dGVybjogYC9eW2EtekEtWl1bYS16QS1aMC05LV17MCwxMjd9JC9gXG4gICAqXG4gICAqICoqRXhhbXBsZXMqKjpcbiAgICogLSBWYWxpZDogYG15LWFwcGAsIGBNeUFwcGAsIGBhcHAxMjNgLCBgbXktYXBwLXYyYFxuICAgKiAtIEludmFsaWQ6IGAxMjNhcHBgIChzdGFydHMgd2l0aCBudW1iZXIpLCBgbXlfYXBwYCAodW5kZXJzY29yZSksIGBteSBhcHBgIChzcGFjZSlcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBzZXJ2aWNlTmFtZTogJ215LWFwcGxpY2F0aW9uJ1xuICAgKiBgYGBcbiAgICovXG4gIHNlcnZpY2VOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERlcGxveW1lbnQgc3RhZ2UvZW52aXJvbm1lbnQuXG4gICAqXG4gICAqIERldGVybWluZXMgdGhlIGVudmlyb25tZW50LXNwZWNpZmljIGNvbmZpZ3VyYXRpb24gYW5kIHJlc291cmNlIG5hbWluZy5cbiAgICogVXNlZCB0byBjcmVhdGUgc2VwYXJhdGUgaW5mcmFzdHJ1Y3R1cmUgc3RhY2tzIGZvciBkaWZmZXJlbnQgZW52aXJvbm1lbnRzLlxuICAgKlxuICAgKiAqKlZhbHVlcyoqOlxuICAgKiAtIGBkZXZgOiBEZXZlbG9wbWVudCBlbnZpcm9ubWVudCAobG9jYWwgdGVzdGluZywgcmFwaWQgaXRlcmF0aW9uKVxuICAgKiAtIGBzdGFnaW5nYDogU3RhZ2luZy9wcmUtcHJvZHVjdGlvbiBlbnZpcm9ubWVudCAoUUEsIGludGVncmF0aW9uIHRlc3RpbmcpXG4gICAqIC0gYHByb2RgOiBQcm9kdWN0aW9uIGVudmlyb25tZW50IChsaXZlIHVzZXJzKVxuICAgKlxuICAgKiAqKkltcGFjdCoqOlxuICAgKiAtIFJlc291cmNlIG5hbWluZzogYHtzZXJ2aWNlTmFtZX0te3Jlc291cmNlfS17c3RhZ2V9YFxuICAgKiAtIEVudmlyb25tZW50IHZhcmlhYmxlczogRGlmZmVyZW50IGNvbmZpZ3MgcGVyIHN0YWdlXG4gICAqIC0gQ2FjaGUgVFRMOiBTaG9ydGVyIGluIGRldiwgbG9uZ2VyIGluIHByb2RcbiAgICogLSBMb2dnaW5nOiBNb3JlIHZlcmJvc2UgaW4gZGV2LCBzdHJ1Y3R1cmVkIGluIHByb2RcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBzdGFnZTogJ2RldidcbiAgICogYGBgXG4gICAqL1xuICBzdGFnZTogU3RhZ2U7XG5cbiAgLyoqXG4gICAqIE1pY3Jvc2VydmljZSByZWdpc3RyeSAocnVudGltZS1sZXZlbCBjb25maWd1cmF0aW9uKS5cbiAgICpcbiAgICogKipSZXF1aXJlZCoqOiBEZWZpbmVzIGFsbCBtaWNyb3NlcnZpY2VzLCB0aGVpciBESSBjb250YWluZXJzLCBhbmQgTGFtYmRhIGVuZHBvaW50cy5cbiAgICogKipVc2VkIGluIGFsbCBjb250ZXh0cyoqOiBCcm93c2VyIChmb3IgdHlwZSBnZW5lcmF0aW9uKSwgTGFtYmRhIChmb3IgREkpLCBDREsgKGZvciBpbmZyYXN0cnVjdHVyZSkuXG4gICAqICoqQXJjaGl0ZWN0dXJlKio6IFRoaXMgaXMgcnVudGltZSBjb25maWd1cmF0aW9uLCBzZXBhcmF0ZSBmcm9tIGluZnJhc3RydWN0dXJlIGNvbmNlcm5zLlxuICAgKlxuICAgKiBFYWNoIG1pY3Jvc2VydmljZSBnZXRzIGl0cyBvd24gUHVyZUNvbnRhaW5lciBpbnN0YW5jZSBidWlsdCBmcm9tIHRoZSBUaWVzIGNsYXNzZXMuXG4gICAqIExhbWJkYSBmdW5jdGlvbnMgYXJlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBhbmQgd2lyZWQgd2l0aCBkZXBlbmRlbmN5IGluamVjdGlvbi5cbiAgICpcbiAgICogKipUeXBlIFNhZmV0eSoqOiBTZXJ2aWNlIG5hbWVzIGFyZSBkZXJpdmVkIGZyb20gb2JqZWN0IGtleXMsIGVuc3VyaW5nIGNvbXBpbGUtdGltZSB2YWxpZGF0aW9uLlxuICAgKiAqKk5vIE1hZ2ljIFN0cmluZ3MqKjogQWxsIHNlcnZpY2UgaWRlbnRpZmllcnMgYXJlIHR5cGUtc2FmZSBhbmQgYXV0by1nZW5lcmF0ZWQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIE1pY3Jvc2VydmljZURlZmluaXRpb259IGZvciBtaWNyb3NlcnZpY2Ugc3RydWN0dXJlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogcmVnaXN0ZXI6IHtcbiAgICogICBwYXltZW50czoge1xuICAgKiAgICAgdGllczogW1BheW1lbnRzVGllcywgQmlsbGluZ1RpZXNdLFxuICAgKiAgICAgbGFtYmRhczogW2NoYXJnZUhhbmRsZXIsIHJlZnVuZEhhbmRsZXIsIHdlYmhvb2tIYW5kbGVyXVxuICAgKiAgIH0sXG4gICAqICAgdXNlcnM6IHtcbiAgICogICAgIHRpZXM6IFtVc2Vyc1RpZXMsIEF1dGhUaWVzXSxcbiAgICogICAgIGxhbWJkYXM6IFtjcmVhdGVVc2VySGFuZGxlciwgZ2V0VXNlckhhbmRsZXIsIGxvZ2luSGFuZGxlcl1cbiAgICogICB9XG4gICAqIH0gYXMgY29uc3QgIC8vIFVzZSAnYXMgY29uc3QnIGZvciBiZXR0ZXIgdHlwZSBpbmZlcmVuY2VcbiAgICogYGBgXG4gICAqL1xuICByZWdpc3RlcjogVFJlZ2lzdGVyO1xuXG4gIC8qKlxuICAgKiBJbmZyYXN0cnVjdHVyZSBjb25maWd1cmF0aW9uIGZvciBDREsgZGVwbG95bWVudC5cbiAgICpcbiAgICogKipPcHRpb25hbCoqOiBPbmx5IHJlcXVpcmVkIHdoZW4gcnVubmluZyBpbiBDREsgY29udGV4dCAoc3ludGhlc2l6aW5nIENsb3VkRm9ybWF0aW9uIHRlbXBsYXRlcykuXG4gICAqICoqTm90IHVzZWQqKjogSW4gYnJvd3NlciBhbmQgTGFtYmRhIGNvbnRleHRzIChydW50aW1lIGNvbmZpZ3VyYXRpb24gaXMgaW4gcmVnaXN0ZXIpLlxuICAgKiAqKlB1cmUgaW5mcmFzdHJ1Y3R1cmUqKjogQ29udGFpbnMgb25seSBBV1MgcmVzb3VyY2UgY29uZmlndXJhdGlvbiwgbm8gYnVzaW5lc3MgbG9naWMuXG4gICAqXG4gICAqIERlZmluZXM6XG4gICAqIC0gQVdTIGFjY291bnQgYW5kIHJlZ2lvblxuICAgKiAtIExhbWJkYSBjb25maWd1cmF0aW9uIChtZW1vcnksIHRpbWVvdXQsIFZQQylcbiAgICogLSBBUEkgR2F0ZXdheSBvciBMYW1iZGEgVVJMIG1vZGVcbiAgICogLSBDdXN0b20gZG9tYWluIGNvbmZpZ3VyYXRpb25cbiAgICogLSBSZWFjdCBlbnRyeSBwb2ludCBmb3Igc2VydmVybGVzcyByZW5kZXJpbmcgTGFtYmRhXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIEluZnJhT3B0aW9uc30gZm9yIGRldGFpbGVkIGNvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGluZnJhOiB7XG4gICAqICAgZW52OiB7IGFjY291bnQ6ICcxMjM0NTY3ODkwMTInLCByZWdpb246ICd1cy1lYXN0LTEnIH0sXG4gICAqICAgc3RhZ2U6ICdkZXYnLFxuICAgKiAgIHJlYWN0RW50cnk6ICcuL3NyYy9pbmRleC50c3gnLFxuICAgKiAgIGFwaU1vZGU6ICdhcGlHYXRld2F5JyxcbiAgICogICBsYW1iZGFNZW1vcnlTaXplOiAxMDI0LFxuICAgKiAgIGxhbWJkYVRpbWVvdXQ6IDMwLFxuICAgKiAgIGRvbWFpbjoge1xuICAgKiAgICAgcm9vdERvbWFpbjogJ215YXBwLmNvbScsXG4gICAqICAgICBzdWJkb21haW46ICdhcGknXG4gICAqICAgfVxuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgaW5mcmE/OiBJbmZyYU9wdGlvbnM7XG59XG5cbi8qKlxuICogVHlwZS1zYWZlIFJ1bnRpbWUgY29uZmlndXJhdGlvbiB3aXRoIGluZmVycmVkIHNlcnZpY2UgbmFtZXMuXG4gKlxuICogVGhpcyB0eXBlIHByb3ZpZGVzIGVuaGFuY2VkIHR5cGUgc2FmZXR5IGJ5IGluZmVycmluZyBzZXJ2aWNlIG5hbWVzIGZyb20gdGhlIHJlZ2lzdGVyXG4gKiBjb25maWd1cmF0aW9uLCBlbmFibGluZyBjb21waWxlLXRpbWUgdmFsaWRhdGlvbiBvZiBzZXJ2aWNlIHJlZmVyZW5jZXMuXG4gKlxuICogQHRlbXBsYXRlIFRSZWdpc3RlciAtIFRoZSByZWdpc3RlciBjb25maWd1cmF0aW9uIHR5cGVcbiAqL1xuZXhwb3J0IHR5cGUgVHlwZVNhZmVSdW50aW1lV2ViQ29uZmlnPFRSZWdpc3RlciBleHRlbmRzIFJlY29yZDxzdHJpbmcsIE1pY3Jvc2VydmljZURlZmluaXRpb24+PiA9XG4gIFJ1bnRpbWVXZWJDb25maWc8VFJlZ2lzdGVyPiAmIHtcbiAgLyoqXG4gICAqIFR5cGUtc2FmZSBzZXJ2aWNlIG5hbWVzIGRlcml2ZWQgZnJvbSByZWdpc3RlciBrZXlzLlxuICAgKiBBdmFpbGFibGUgYXQgY29tcGlsZS10aW1lIGZvciB0eXBlIGNoZWNraW5nIGFuZCBJREUgYXV0b2NvbXBsZXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgc2VydmljZU5hbWVzPzogU2VydmljZU5hbWVzPFRSZWdpc3Rlcj47XG5cbiAgLyoqXG4gICAqIFR5cGUtc2FmZSBMYW1iZGEgSURzIGRlcml2ZWQgZnJvbSByZWdpc3RlciBjb25maWd1cmF0aW9uLlxuICAgKiBBdmFpbGFibGUgYXQgY29tcGlsZS10aW1lIGZvciB0eXBlIGNoZWNraW5nIGFuZCBJREUgYXV0b2NvbXBsZXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgbGFtYmRhSWRzPzogTGFtYmRhSWRzPFRSZWdpc3Rlcj47XG59O1xuIiwgIi8qXG4gKiBFbGFzdGljIExpY2Vuc2UgMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiB3b3JrdGlmLnJ1bnRpbWUuY2RrIDx3b3JrdGlmX3J1bnRpbWVfY2RrPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBFbGFzdGljIExpY2Vuc2UgMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9saWNlbnNpbmcvZWxhc3RpYy1saWNlbnNlIGZvciBkZXRhaWxzLlxuICpcbiAqIFJlLWxpY2Vuc2luZyBub3RpY2U6XG4gKiAgIFRoaXMgZmlsZSB3YXMgcHJldmlvdXNseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgQnVzaW5lc3MgU291cmNlIExpY2Vuc2UgMS4xIChCVVNMLTEuMSkuXG4gKiAgIEFzIG9mIDIwMjUtMDktMjIsIGl0IGlzIHJlLWxpY2Vuc2VkIHVuZGVyIEVsYXN0aWMgTGljZW5zZSAyLjAuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVsYXN0aWMtMi4wXG4gKi9cblxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQgeyBDbG91ZEJ1bmRsZUNvbmZpZywgQ2xvdWRCdW5kbGVDb25maWdUeXBlIH0gZnJvbSAnLi9ydW50aW1lLmNsb3VkLnR5cGVzJztcbmltcG9ydCB7IFJ1bnRpbWVSb3V0ZXIgfSBmcm9tICcuL3J1bnRpbWUtY29yZS9ydW50aW1lLnJvdXRlci9ydW50aW1lLnJvdXRlcic7XG5pbXBvcnQgeyBSZWFjdENvbXBvbmVudFByb3BzIH0gZnJvbSAnLi9ydW50aW1lLWNvcmUvcnVudGltZS51dGlscy50eXBlcyc7XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgU0VPIG1ldGFkYXRhIHN0cnVjdHVyZSB1c2VkIHRocm91Z2hvdXQgdGhlIGFwcGxpY2F0aW9uLlxuICogVGhpcyBpcyBhIHBhcnRpYWwgdHlwZSBhbGxvd2luZyBvcHRpb25hbCBmaWVsZHMgZm9yIGZsZXhpYmxlIGNvbmZpZ3VyYXRpb24uXG4gKi9cbmV4cG9ydCB0eXBlIFNlb01ldGFEYXRhID0ge1xuICByb3V0ZT86IHN0cmluZztcbiAgdGl0bGU/OiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBrZXl3b3Jkcz86IHN0cmluZ1tdO1xuICBvZ1RpdGxlPzogc3RyaW5nO1xuICBvZ0Rlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBvZ0ltYWdlPzogc3RyaW5nO1xuICB0d2l0dGVyVGl0bGU/OiBzdHJpbmc7XG4gIHR3aXR0ZXJEZXNjcmlwdGlvbj86IHN0cmluZztcbiAgdHdpdHRlckltYWdlPzogc3RyaW5nO1xuICBjYW5vbmljYWxVcmw/OiBzdHJpbmc7XG4gIHJvYm90cz86IHN0cmluZztcbn07XG5cbi8qKlxuICogU2VvTWlkZGxld2FyZSBpcyBhIG1pZGRsZXdhcmUgZnVuY3Rpb24gdHlwZSBkZXNpZ25lZCB0byBwcm9jZXNzIFNFTy1yZWxhdGVkXG4gKiBtZXRhZGF0YSBieSB0YWtpbmcgaW4gdmFyaW91cyBvcHRpb25zIGFuZCByZXR1cm5pbmcgYW4gb2JqZWN0IGNvbnRhaW5pbmcgU0VPXG4gKiBtZXRhZGF0YSBkZXRhaWxzLlxuICpcbiAqIEl0IGlzIGNvbW1vbmx5IHVzZWQgaW4gYXBwbGljYXRpb25zIGZvciBlbmhhbmNpbmcgd2ViIHBhZ2VzIHdpdGggU0VPXG4gKiBhdHRyaWJ1dGVzIHN1Y2ggYXMgdGl0bGUsIGRlc2NyaXB0aW9uLCBjYW5vbmljYWwgVVJMLCBhbmQgbWV0YSB0YWdzLlxuICpcbiAqIEB0eXBlZGVmIHtmdW5jdGlvbn0gU2VvTWlkZGxld2FyZUZuXG4gKiBAcGFyYW0gey4uLmFueX0gb3B0aW9ucyAtIEEgbGlzdCBvZiBvcHRpb25zIG9yIHBhcmFtZXRlcnMgdGhhdCB0aGUgbWlkZGxld2FyZVxuICogZnVuY3Rpb24gY2FuIGludGVycHJldCB0byBnZW5lcmF0ZSBTRU8gbWV0YWRhdGEuXG4gKiBAcmV0dXJucyB7U2VvTWV0YURhdGF9IEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBwcm9jZXNzZWQgU0VPIG1ldGFkYXRhLlxuICovXG5leHBvcnQgdHlwZSBTZW9NaWRkbGV3YXJlRm4gPSAoLi4ub3B0aW9uczogYW55KSA9PiBQcm9taXNlPGFueVtdPjtcblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBSdW50aW1lIGFwcGxpY2F0aW9uLlxuICogVGhpcyB0eXBlIGRlZmluZXMgdGhlIHByb3BlcnRpZXMgYW5kIGV4cGVjdGVkIHR5cGVzIGZvciBpbml0aWFsaXppbmdcbiAqIGFuZCBtYW5hZ2luZyB0aGUgYXBwbGljYXRpb24sIGluY2x1ZGluZyBVSSBzdHJ1Y3R1cmUsIHJvdXRpbmcsIFNFTyxcbiAqIGFuZCBjbG91ZCBidW5kbGUgc2V0dGluZ3MuXG4gKi9cbmV4cG9ydCB0eXBlIFJ1bnRpbWVUaHJlYWRzID0ge1xuICAvKipcbiAgICogUmVwcmVzZW50cyBhIFJlYWN0IGNvbXBvbmVudCBvciBlbGVtZW50LlxuICAgKiBUaGUgYGFwcGAgdmFyaWFibGUgaXMgaW50ZW5kZWQgdG8gc3RvcmUgYSBSZWFjdEVsZW1lbnQgdGhhdCBkZWZpbmVzIHRoZSBzdHJ1Y3R1cmVcbiAgICogYW5kIGJlaGF2aW9yIG9mIGEgcG9ydGlvbiBvciB0aGUgZW50aXJlIHVzZXIgaW50ZXJmYWNlIG9mIHRoZSBhcHBsaWNhdGlvbi5cbiAgICpcbiAgICogVGhpcyBlbGVtZW50IGlzIHVzZWQgYXMgYSBSZWFjdCBhcHBsaWNhdGlvbiBhbmQgY2FuIGJlIHJlbmRlcmVkXG4gICAqIGludG8gdGhlIERPTSBvciBvdGhlciByZW5kZXIgdGFyZ2V0cyBzdXBwb3J0ZWQgYnkgUmVhY3QuXG4gICAqXG4gICAqIFR5cGU6IFJlYWN0LlJlYWN0RWxlbWVudFxuICAgKi9cbiAgYXBwOiBSZWFjdC5GQzxSZWFjdENvbXBvbmVudFByb3BzPjtcblxuICAvKipcbiAgICogQ29uZmlndXJhdGlvbiBvYmplY3QgdGhhdCBkZWZpbmVzIHRoZSBzZXR0aW5ncyBhbmQgcGFyYW1ldGVycyBmb3IgYSBzcGVjaWZpYyBjbG91ZCBidW5kbGUgdHlwZS5cbiAgICogVGhpcyB2YXJpYWJsZSB1c2VzIHRoZSBgQ2xvdWRCdW5kbGVDb25maWdgIGludGVyZmFjZSBhbmQgYXNzb2NpYXRlcyBpdCB3aXRoXG4gICAqIGEgYENsb3VkQnVuZGxlQ29uZmlnVHlwZWAgdG8gc3BlY2lmeSB0aGUgc3BlY2lmaWMgY29uZmlndXJhdGlvbiBkZXRhaWxzLlxuICAgKlxuICAgKiBAdHlwZSB7Q2xvdWRCdW5kbGVDb25maWdbQ2xvdWRCdW5kbGVDb25maWdUeXBlXX1cbiAgICpcbiAgICogQHRvZG86IGFkZCBjb25maWcgc2NoZW1hIHZhbGlkYXRpb25cbiAgICovXG4gIGNvbmZpZzogQ2xvdWRCdW5kbGVDb25maWdbQ2xvdWRCdW5kbGVDb25maWdUeXBlXTtcblxuICAvKipcbiAgICogUmVwcmVzZW50cyBhIGNvbGxlY3Rpb24gb2Ygcm91dGUgb2JqZWN0cyB1c2VkIGZvciBkZWZpbmluZyBhcHBsaWNhdGlvbiByb3V0aW5nLlxuICAgKiBFYWNoIFJvdXRlT2JqZWN0IGluIHRoZSBhcnJheSBzcGVjaWZpZXMgYSBzaW5nbGUgcm91dGUgY29uZmlndXJhdGlvbiwgaW5jbHVkaW5nXG4gICAqIHBhdGgsIGNvbXBvbmVudCwgY2hpbGQgcm91dGVzLCBhbmQgYWRkaXRpb25hbCBzZXR0aW5ncy5cbiAgICpcbiAgICogVGhlIGByb3V0ZXJgIHZhcmlhYmxlIGFsbG93cyBmb3IgZGVjbGFyYXRpdmUgcm91dGluZyBhbmQgaXMgdHlwaWNhbGx5IHVzZWRcbiAgICogaW4gY29uanVuY3Rpb24gd2l0aCBhIHJvdXRpbmcgbGlicmFyeSB0byBtYW5hZ2UgbmF2aWdhdGlvbiBhbmQgcmVuZGVyaW5nIGNvbXBvbmVudHNcbiAgICogYmFzZWQgb24gdGhlIFVSTCBwYXRoLlxuICAgKlxuICAgKiBUeXBlOiBgUm91dGVyW11gXG4gICAqL1xuICByb3V0ZXI6IFJ1bnRpbWVSb3V0ZXI7XG5cbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIG1pZGRsZXdhcmUgZnVuY3Rpb24gZGVzaWduZWQgdG8gaGFuZGxlIFNFTyAoU2VhcmNoIEVuZ2luZSBPcHRpbWl6YXRpb24pIHByb2Nlc3NpbmcuXG4gICAqIFRoaXMgbWlkZGxld2FyZSBtYXkgYmUgdXNlZCB0byBtb2RpZnksIGFuYWx5emUsIG9yIGVuaGFuY2Ugc2VydmVyIHJlc3BvbnNlcyxcbiAgICogaW5jbHVkaW5nIHNldHRpbmcgbWV0YWRhdGEsIHRpdGxlcywgZGVzY3JpcHRpb25zLCBvciBoZWFkZXJzIGZvciBiZXR0ZXIgc2VhcmNoIGVuZ2luZSB2aXNpYmlsaXR5LlxuICAgKlxuICAgKiBAdHlwZSB7U2VvTWlkZGxld2FyZUZuIHwgdW5kZWZpbmVkfVxuICAgKi9cbiAgc2VvTWlkZGxld2FyZT86IFNlb01pZGRsZXdhcmVGbjtcblxuICAvKipcbiAgICogT3B0aW9uYWwgZGVmYXVsdCBTRU8gbWV0YWRhdGEgdG8gYmUgdXNlZCBhcyB0aGUgYmFzZS1sZXZlbCBkZWZhdWx0cyB0aHJvdWdob3V0IHRoZSBhcHBsaWNhdGlvbi5cbiAgICogVGhlc2UgZGVmYXVsdHMgYXJlIHVzZWQgYnkgdGhlIFNFTyBzZXJ2aWNlIHdoZW46XG4gICAqIC0gTm8gcm91dGUtc3BlY2lmaWMgU0VPIG1ldGFkYXRhIGV4aXN0cyBpbiBEeW5hbW9EQlxuICAgKiAtIE5vIGRlZmF1bHQgU0VPIG1ldGFkYXRhIGV4aXN0cyBpbiBEeW5hbW9EQiAocm91dGUgYFtzZW8tZGVmYXVsdHNdYClcbiAgICpcbiAgICogSWYgbm90IHByb3ZpZGVkLCB0aGUgZnJhbWV3b3JrIHdpbGwgZmFsbCBiYWNrIHRvIGhhcmRjb2RlZCBkZWZhdWx0cy5cbiAgICpcbiAgICogUHJpb3JpdHkgb3JkZXI6XG4gICAqIDEuIFJvdXRlLXNwZWNpZmljIG1ldGFkYXRhIGZyb20gRHluYW1vREIgKGhpZ2hlc3QgcHJpb3JpdHkpXG4gICAqIDIuIERlZmF1bHQgbWV0YWRhdGEgZnJvbSBEeW5hbW9EQiAoYFtzZW8tZGVmYXVsdHNdYCByb3V0ZSlcbiAgICogMy4gSW5pdGlhbGl6YXRpb24gZGVmYXVsdHMgKHRoaXMgcHJvcGVydHkpXG4gICAqIDQuIEhhcmRjb2RlZCBmcmFtZXdvcmsgZGVmYXVsdHMgKGxvd2VzdCBwcmlvcml0eSlcbiAgICpcbiAgICogQHR5cGUge1BhcnRpYWw8U2VvTWV0YURhdGE+IHwgdW5kZWZpbmVkfVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBydW50aW1lKHtcbiAgICogICBhcHA6IEFwcCxcbiAgICogICByb3V0ZXI6IG15Um91dGVyLFxuICAgKiAgIGNvbmZpZzogbXlDb25maWcsXG4gICAqICAgZGVmYXVsdFNlb01ldGE6IHtcbiAgICogICAgIHRpdGxlOiAnTXkgQXBwbGljYXRpb24nLFxuICAgKiAgICAgZGVzY3JpcHRpb246ICdXZWxjb21lIHRvIG15IGFwcGxpY2F0aW9uJyxcbiAgICogICAgIGtleXdvcmRzOiBbJ2FwcCcsICdyZWFjdCcsICdzZXJ2ZXJsZXNzIHJlbmRlcmluZyddLFxuICAgKiAgICAgb2dJbWFnZTogJy9pbWFnZXMvb2ctZGVmYXVsdC5wbmcnLFxuICAgKiAgICAgdHdpdHRlckNhcmQ6ICdzdW1tYXJ5X2xhcmdlX2ltYWdlJ1xuICAgKiAgIH1cbiAgICogfSk7XG4gICAqL1xuICBkZWZhdWx0U2VvTWV0YT86IFBhcnRpYWw8U2VvTWV0YURhdGE+O1xufTtcblxuXG5leHBvcnQgZW51bSBFbmdpbmVzQnJvd3NlckZyYW1ld29yayB7XG4gIFJlYWN0ID0gJ3JlYWN0JyxcbiAgQW5ndWxhciA9ICdhbmd1bGFyJyxcbiAgVnVlID0gJ3Z1ZScsXG4gIFN2ZWx0ZSA9ICdzdmVsdGUnLFxuICBTdmVsdGVLaXQgPSAnc3ZlbHRla2l0JyxcbiAgU29saWQgPSAnc29saWQnLFxuICBQb2x5bWVyID0gJ3BvbHltZXInLFxuICBFbWJlciA9ICdlbWJlcicsXG4gIFByZWFjdCA9ICdwcmVhY3QnLFxuICBSaW90ID0gJ3Jpb3QnLFxufVxuXG4iLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IHdvcmt0aWYucnVudGltZS5jZGsgPHdvcmt0aWZfcnVudGltZV9jZGs+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0xNSwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG5pbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcblxuIGNvbnN0IEFXU19SRUdJT05TID0gW1xuICAndXMtZWFzdC0xJyxcbiAgJ3VzLWVhc3QtMicsXG4gICd1cy13ZXN0LTEnLFxuICAndXMtd2VzdC0yJyxcbiAgJ2V1LXdlc3QtMScsXG4gICdldS13ZXN0LTInLFxuICAnZXUtd2VzdC0zJyxcbiAgJ2V1LWNlbnRyYWwtMScsXG4gICdldS1jZW50cmFsLTInLFxuICAnZXUtbm9ydGgtMScsXG4gICdldS1zb3V0aC0xJyxcbiAgJ2V1LXNvdXRoLTInLFxuICAnYXAtc291dGhlYXN0LTEnLFxuICAnYXAtc291dGhlYXN0LTInLFxuICAnYXAtc291dGhlYXN0LTMnLFxuICAnYXAtc291dGgtMScsXG4gICdhcC1zb3V0aC0yJyxcbiAgJ2FwLW5vcnRoZWFzdC0xJyxcbiAgJ2FwLW5vcnRoZWFzdC0yJyxcbiAgJ2FwLW5vcnRoZWFzdC0zJyxcbiAgJ2FwLWVhc3QtMScsXG4gICdzYS1lYXN0LTEnLFxuICAnY2EtY2VudHJhbC0xJyxcbiAgJ21lLXNvdXRoLTEnLFxuICAnbWUtY2VudHJhbC0xJyxcbiAgJ2FmLXNvdXRoLTEnLFxuXSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IEF3c1JlZ2lvblNjaGVtYSA9IHouZW51bShBV1NfUkVHSU9OUyk7XG5cbi8qKlxuICogU3RhZ2UgY29uZmlndXJhdGlvbiBmb3IgZGVwbG95bWVudCBlbnZpcm9ubWVudHMuXG4gKlxuICogRGVmaW5lcyBlbnZpcm9ubWVudC1zcGVjaWZpYyBzZXR0aW5ncyBmb3IgZGVwbG95aW5nIFJ1bnRpbWUgV2ViIGFwcGxpY2F0aW9ucyB0byBBV1MuXG4gKiBFYWNoIHN0YWdlIHJlcHJlc2VudHMgYSBzZXBhcmF0ZSBkZXBsb3ltZW50IGVudmlyb25tZW50IChkZXZlbG9wbWVudCwgc3RhZ2luZywgcHJvZHVjdGlvbilcbiAqIHdpdGggaXRzIG93biBBV1MgcmVzb3VyY2VzIGFuZCBjb25maWd1cmF0aW9uLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBkZXZTdGFnZTogU3RhZ2VDb25maWcgPSB7XG4gKiAgIG5hbWU6ICdkZXYnLFxuICogICBhd3NSZWdpb246ICd1cy1lYXN0LTEnLFxuICogICBhd3NQcm9maWxlOiAnbXktZGV2LXByb2ZpbGUnLFxuICogICBkb21haW46ICdleGFtcGxlLmNvbScsXG4gKiAgIHN1YmRvbWFpbjogJ2RldidcbiAqIH07XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IFN0YWdlQ29uZmlnU2NoZW1hID0gei5vYmplY3Qoe1xuICAvKipcbiAgICogU3RhZ2UgbmFtZSBpZGVudGlmaWVyLlxuICAgKlxuICAgKiBNdXN0IGJlIG9uZSBvZjogJ2RldicsICdzdGFnaW5nJywgb3IgJ3Byb2QnLlxuICAgKiBUaGlzIHZhbHVlIGlzIHVzZWQgdG8gbmFtZXNwYWNlIEFXUyByZXNvdXJjZXMgYW5kIHNlbGVjdCBlbnZpcm9ubWVudC1zcGVjaWZpYyBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBAZXhhbXBsZSAnZGV2JyB8ICdzdGFnaW5nJyB8ICdwcm9kJ1xuICAgKi9cbiAgbmFtZTogei5lbnVtKFsnZGV2JywgJ3N0YWdpbmcnLCAncHJvZCddKSxcblxuICAvKipcbiAgICogQVdTIHJlZ2lvbiBmb3IgZGVwbG95bWVudC5cbiAgICpcbiAgICogVGhlIEFXUyByZWdpb24gd2hlcmUgQ2xvdWRGb3JtYXRpb24gc3RhY2tzLCBMYW1iZGEgZnVuY3Rpb25zLCBTMyBidWNrZXRzLFxuICAgKiBhbmQgb3RoZXIgcmVzb3VyY2VzIHdpbGwgYmUgZGVwbG95ZWQuIE11c3QgYmUgYSB2YWxpZCBBV1MgcmVnaW9uIGlkZW50aWZpZXIuXG4gICAqXG4gICAqIEBleGFtcGxlICd1cy1lYXN0LTEnIHwgJ2V1LXdlc3QtMScgfCAnYXAtc291dGhlYXN0LTInXG4gICAqL1xuICBhd3NSZWdpb246IHouc3RyaW5nKCkubWluKDEpLFxuXG4gIC8qKlxuICAgKiBBV1MgQ0xJIHByb2ZpbGUgbmFtZSAob3B0aW9uYWwpLlxuICAgKlxuICAgKiBJZiBzcGVjaWZpZWQsIHRoZSBDTEkgd2lsbCB1c2UgdGhpcyBBV1MgcHJvZmlsZSBmcm9tIHlvdXIgfi8uYXdzL2NyZWRlbnRpYWxzIGZpbGVcbiAgICogZm9yIGF1dGhlbnRpY2F0aW9uLiBJZiBvbWl0dGVkLCB1c2VzIHRoZSBkZWZhdWx0IEFXUyBjcmVkZW50aWFsIGNoYWluLlxuICAgKlxuICAgKiBAZXhhbXBsZSAnbXktY29tcGFueS1kZXYnIHwgJ3Byb2R1Y3Rpb24tZGVwbG95ZXInXG4gICAqL1xuICBhd3NQcm9maWxlOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG5cbiAgLyoqXG4gICAqIEN1c3RvbSBkb21haW4gbmFtZSAob3B0aW9uYWwpLlxuICAgKlxuICAgKiBUaGUgcm9vdCBkb21haW4gZm9yIHlvdXIgYXBwbGljYXRpb24uIFdoZW4gc3BlY2lmaWVkIGFsb25nIHdpdGggc3ViZG9tYWluLFxuICAgKiB0aGUgYXBwbGljYXRpb24gd2lsbCBiZSBhY2Nlc3NpYmxlIGF0IGBzdWJkb21haW4uZG9tYWluYC5cbiAgICogUmVxdWlyZXMgRE5TIGNvbmZpZ3VyYXRpb24gYW5kIEFDTSBjZXJ0aWZpY2F0ZSBzZXR1cC5cbiAgICpcbiAgICogQGV4YW1wbGUgJ2V4YW1wbGUuY29tJyB8ICdteWFwcC5pbydcbiAgICovXG4gIGRvbWFpbjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuXG4gIC8qKlxuICAgKiBTdWJkb21haW4gcHJlZml4IChvcHRpb25hbCkuXG4gICAqXG4gICAqIFRoZSBzdWJkb21haW4gcHJlZml4IGZvciB0aGlzIHN0YWdlLiBDb21iaW5lZCB3aXRoIGRvbWFpbiB0byBmb3JtIHRoZSBmdWxsIFVSTC5cbiAgICogVHlwaWNhbGx5IHVzZWQgdG8gc2VwYXJhdGUgZW52aXJvbm1lbnRzIChlLmcuLCAnZGV2JywgJ3N0YWdpbmcnLCAnd3d3JykuXG4gICAqXG4gICAqIEBleGFtcGxlICdkZXYnIHwgJ3N0YWdpbmcnIHwgJ3d3dycgfCAnYXBwJ1xuICAgKi9cbiAgc3ViZG9tYWluOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG59KTtcblxuLyoqXG4gKiBUeXBlIGRlZmluaXRpb24gZm9yIHN0YWdlIGNvbmZpZ3VyYXRpb24uXG4gKlxuICogSW5mZXJyZWQgZnJvbSBTdGFnZUNvbmZpZ1NjaGVtYSBmb3IgdHlwZS1zYWZlIGNvbmZpZ3VyYXRpb24gb2JqZWN0cy5cbiAqL1xuZXhwb3J0IHR5cGUgU3RhZ2VDb25maWcgPSB6LmluZmVyPHR5cGVvZiBTdGFnZUNvbmZpZ1NjaGVtYT47XG5cbi8qKlxuICogUGF0aCBjb25maWd1cmF0aW9uIGZvciBwcm9qZWN0IHN0cnVjdHVyZS5cbiAqXG4gKiBEZWZpbmVzIHRoZSBkaXJlY3RvcnkgbGF5b3V0IGFuZCBlbnRyeSBwb2ludHMgZm9yIHlvdXIgUnVudGltZSBXZWIgYXBwbGljYXRpb24uXG4gKiBUaGVzZSBwYXRocyBhcmUgdXNlZCBieSB0aGUgYnVpbGQgc3lzdGVtLCBkZXZlbG9wbWVudCBzZXJ2ZXIsIGFuZCBkZXBsb3ltZW50IHByb2Nlc3MuXG4gKiBBbGwgcGF0aHMgYXJlIHJlbGF0aXZlIHRvIHRoZSBwcm9qZWN0IHJvb3QgZGlyZWN0b3J5LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBwYXRoczogUGF0aHNDb25maWcgPSB7XG4gKiAgIHNyY0RpcjogJ3NyYycsXG4gKiAgIHJlYWN0RW50cnk6ICdzcmMvaW5kZXgudHN4JyxcbiAqICAgb3V0RGlyOiAnb3V0L2Rpc3QnLFxuICogICBjZGtEaXI6ICdpbmZyYXN0cnVjdHVyZSdcbiAqIH07XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IFBhdGhzQ29uZmlnU2NoZW1hID0gei5vYmplY3Qoe1xuICAvKipcbiAgICogU291cmNlIGRpcmVjdG9yeSBwYXRoLlxuICAgKlxuICAgKiBUaGUgcm9vdCBkaXJlY3RvcnkgY29udGFpbmluZyB5b3VyIGFwcGxpY2F0aW9uIHNvdXJjZSBjb2RlLlxuICAgKiBUaGlzIGlzIHdoZXJlIHRoZSBidWlsZCBzeXN0ZW0gd2lsbCBsb29rIGZvciBUeXBlU2NyaXB0L0phdmFTY3JpcHQgZmlsZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0ICdzcmMnXG4gICAqIEBleGFtcGxlICdzcmMnIHwgJ2FwcCcgfCAnc291cmNlJ1xuICAgKi9cbiAgc3JjRGlyOiB6LnN0cmluZygpLmRlZmF1bHQoJ3NyYycpLFxuXG4gIC8qKlxuICAgKiBSZWFjdCBhcHBsaWNhdGlvbiBlbnRyeSBwb2ludC5cbiAgICpcbiAgICogVGhlIG1haW4gZW50cnkgZmlsZSBmb3IgeW91ciBSZWFjdCBhcHBsaWNhdGlvbi4gVGhpcyBmaWxlIHNob3VsZCBleHBvcnRcbiAgICogb3IgY2FsbCB0aGUgYHJ1bnRpbWUoKWAgZnVuY3Rpb24gdG8gY29uZmlndXJlIHlvdXIgc2VydmVybGVzcyByZW5kZXJpbmcgY3Jvc3MtZG9tYWluIGFwcGxpY2F0aW9uLlxuICAgKiBNdXN0IGJlIGEgVHlwZVNjcmlwdCAoLnRzeC8udHMpIG9yIEphdmFTY3JpcHQgKC5qc3gvLmpzKSBmaWxlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAnc3JjL2luZGV4LnRzeCdcbiAgICogQGV4YW1wbGUgJ3NyYy9pbmRleC50c3gnIHwgJ3NyYy9hcHAudHN4JyB8ICdzcmMvbWFpbi50c3gnXG4gICAqL1xuICByZWFjdEVudHJ5OiB6LnN0cmluZygpLmRlZmF1bHQoJ3NyYy9pbmRleC50c3gnKSxcblxuICAvKipcbiAgICogT3V0cHV0IGRpcmVjdG9yeSBmb3IgYnVpbGQgYXJ0aWZhY3RzLlxuICAgKlxuICAgKiBUaGUgZGlyZWN0b3J5IHdoZXJlIGNvbXBpbGVkIEphdmFTY3JpcHQgYnVuZGxlcywgdHlwZSBkZWNsYXJhdGlvbnMsXG4gICAqIGFuZCBvdGhlciBidWlsZCBhcnRpZmFjdHMgd2lsbCBiZSB3cml0dGVuLiBUaGlzIGRpcmVjdG9yeSBpcyB0eXBpY2FsbHlcbiAgICogYWRkZWQgdG8gLmdpdGlnbm9yZSBhbmQgc2hvdWxkIG5vdCBiZSBjb21taXR0ZWQgdG8gdmVyc2lvbiBjb250cm9sLlxuICAgKlxuICAgKiBAZGVmYXVsdCAnb3V0L2Rpc3QnXG4gICAqIEBleGFtcGxlICdvdXQvZGlzdCcgfCAnZGlzdCcgfCAnYnVpbGQnXG4gICAqL1xuICBvdXREaXI6IHouc3RyaW5nKCkuZGVmYXVsdCgnb3V0L2Rpc3QnKSxcblxuICAvKipcbiAgICogQ0RLIGluZnJhc3RydWN0dXJlIGRpcmVjdG9yeSAob3B0aW9uYWwpLlxuICAgKlxuICAgKiBUaGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgQVdTIENESyBpbmZyYXN0cnVjdHVyZSBjb2RlIGZvciBkZXBsb3lpbmdcbiAgICogeW91ciBhcHBsaWNhdGlvbi4gSWYgdXNpbmcgdGhlIGRlZmF1bHQgQ0RLIHNldHVwLCB0aGlzIGNhbiBiZSBvbWl0dGVkLlxuICAgKiBPbmx5IG5lZWRlZCBpZiB5b3UgaGF2ZSBjdXN0b20gQ0RLIGNvbnN0cnVjdHMgb3Igc3RhY2tzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAnY2RrJ1xuICAgKiBAZXhhbXBsZSAnY2RrJyB8ICdpbmZyYXN0cnVjdHVyZScgfCAnaW5mcmEnXG4gICAqL1xuICBjZGtEaXI6IHouc3RyaW5nKCkuZGVmYXVsdCgnY2RrJykub3B0aW9uYWwoKSxcbn0pO1xuXG4vKipcbiAqIFR5cGUgZGVmaW5pdGlvbiBmb3IgcGF0aCBjb25maWd1cmF0aW9uLlxuICpcbiAqIEluZmVycmVkIGZyb20gUGF0aHNDb25maWdTY2hlbWEgZm9yIHR5cGUtc2FmZSBjb25maWd1cmF0aW9uIG9iamVjdHMuXG4gKi9cbmV4cG9ydCB0eXBlIFBhdGhzQ29uZmlnID0gei5pbmZlcjx0eXBlb2YgUGF0aHNDb25maWdTY2hlbWE+O1xuXG4vKipcbiAqIEZlYXR1cmUgZmxhZ3MgY29uZmlndXJhdGlvbi5cbiAqXG4gKiBPcHRpb25hbCBmZWF0dXJlIHRvZ2dsZXMgZm9yIGVuYWJsaW5nIG9yIGRpc2FibGluZyBzcGVjaWZpYyBSdW50aW1lIFdlYiBmdW5jdGlvbmFsaXR5LlxuICogVGhlc2UgZmxhZ3MgY29udHJvbCB3aGljaCBMYW1iZGEgaGFuZGxlcnMgYXJlIGRlcGxveWVkIGFuZCB3aGljaCBmZWF0dXJlcyBhcmVcbiAqIGF2YWlsYWJsZSBpbiB5b3VyIGFwcGxpY2F0aW9uLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBmZWF0dXJlczogRmVhdHVyZXNDb25maWcgPSB7XG4gKiAgIGVuYWJsZVNlbzogdHJ1ZSxcbiAqICAgZW5hYmxlTWFuaWZlc3Q6IHRydWUsXG4gKiAgIGVuYWJsZVdhcm11cDogZmFsc2UsXG4gKiAgIGNsZWFyQ2FjaGVPbkRlcGxveTogdHJ1ZVxuICogfTtcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3QgRmVhdHVyZXNDb25maWdTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIC8qKlxuICAgKiBFbmFibGUgU0VPIG1ldGFkYXRhIHN0b3JhZ2UgaW4gRHluYW1vREIuXG4gICAqXG4gICAqIFdoZW4gZW5hYmxlZCwgZGVwbG95cyBhIExhbWJkYSBoYW5kbGVyIGFuZCBEeW5hbW9EQiB0YWJsZSBmb3Igc3RvcmluZ1xuICAgKiBhbmQgcmV0cmlldmluZyBTRU8gbWV0YWRhdGEgKG1ldGEgdGFncywgT3BlbiBHcmFwaCBkYXRhLCBldGMuKSBmb3JcbiAgICogc2VydmVyLXNpZGUgcmVuZGVyZWQgcGFnZXMuIFVzZWZ1bCBmb3IgZHluYW1pYyBTRU8gb3B0aW1pemF0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKiBAZXhhbXBsZSB0cnVlIHwgZmFsc2VcbiAgICovXG4gIGVuYWJsZVNlbzogei5ib29sZWFuKCkuZGVmYXVsdChmYWxzZSksXG5cbiAgLyoqXG4gICAqIEVuYWJsZSBtYW5pZmVzdCBnZW5lcmF0aW9uLlxuICAgKlxuICAgKiBXaGVuIGVuYWJsZWQsIGRlcGxveXMgYSBMYW1iZGEgaGFuZGxlciB0aGF0IGdlbmVyYXRlcyBhbmQgc2VydmVzXG4gICAqIHdlYiBhcHAgbWFuaWZlc3QgZmlsZXMgKG1hbmlmZXN0Lmpzb24pIGZvciBQcm9ncmVzc2l2ZSBXZWIgQXBwIChQV0EpXG4gICAqIGZ1bmN0aW9uYWxpdHkuIEluY2x1ZGVzIGljb25zLCB0aGVtZSBjb2xvcnMsIGFuZCBhcHAgbWV0YWRhdGEuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICogQGV4YW1wbGUgdHJ1ZSB8IGZhbHNlXG4gICAqL1xuICBlbmFibGVNYW5pZmVzdDogei5ib29sZWFuKCkuZGVmYXVsdCh0cnVlKSxcblxuICAvKipcbiAgICogRW5hYmxlIExhbWJkYSB3YXJtdXAgZnVuY3Rpb24uXG4gICAqXG4gICAqIFdoZW4gZW5hYmxlZCwgZGVwbG95cyBhIHNjaGVkdWxlZCBMYW1iZGEgZnVuY3Rpb24gdGhhdCBwZXJpb2RpY2FsbHlcbiAgICogaW52b2tlcyB5b3VyIHNlcnZlcmxlc3MgcmVuZGVyaW5nIGNyb3NzLWRvbWFpbiBoYW5kbGVyIHRvIGtlZXAgaXQgd2FybSBhbmQgcmVkdWNlIGNvbGQgc3RhcnQgbGF0ZW5jeS5cbiAgICogVXNlZnVsIGZvciBwcm9kdWN0aW9uIGVudmlyb25tZW50cyB3aXRoIHN0cmljdCBwZXJmb3JtYW5jZSByZXF1aXJlbWVudHMuXG4gICAqIE5vdGU6IFRoaXMgd2lsbCBpbmNyZWFzZSBBV1MgY29zdHMgZHVlIHRvIGFkZGl0aW9uYWwgTGFtYmRhIGludm9jYXRpb25zLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKiBAZXhhbXBsZSB0cnVlIHwgZmFsc2VcbiAgICovXG4gIGVuYWJsZVdhcm11cDogei5ib29sZWFuKCkuZGVmYXVsdChmYWxzZSksXG5cbiAgLyoqXG4gICAqIENsZWFyIFMzIGNhY2hlIGRpcmVjdG9yeSBvbiBkZXBsb3ltZW50LlxuICAgKlxuICAgKiBXaGVuIGVuYWJsZWQsIGF1dG9tYXRpY2FsbHkgY2xlYXJzIHRoZSBTMyBjYWNoZSBkaXJlY3RvcnkgKGNhY2hlLykgZHVyaW5nXG4gICAqIGRlcGxveW1lbnQgdG8gZW5zdXJlIGZyZXNoIHNlcnZlcmxlc3MgcmVuZGVyaW5nIGNyb3NzLWRvbWFpbiByZXNwb25zZXMgYWZ0ZXIgY29kZSBjaGFuZ2VzLiBUaGlzIHByZXZlbnRzXG4gICAqIHNlcnZpbmcgc3RhbGUgY2FjaGVkIGNvbnRlbnQgYWZ0ZXIgdXBkYXRlcy5cbiAgICpcbiAgICogRGlzYWJsZSB0aGlzIG9wdGlvbiBpZiB5b3Ugd2FudCB0byBwcmVzZXJ2ZSBjYWNoZSBiZXR3ZWVuIGRlcGxveW1lbnRzXG4gICAqIChlLmcuLCBmb3IgZmFzdGVyIHJvbGxiYWNrcyBvciB3aGVuIGNhY2hlIGludmFsaWRhdGlvbiBpcyBoYW5kbGVkIHNlcGFyYXRlbHkpLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqIEBleGFtcGxlIHRydWUgfCBmYWxzZVxuICAgKi9cbiAgY2xlYXJDYWNoZU9uRGVwbG95OiB6LmJvb2xlYW4oKS5kZWZhdWx0KHRydWUpLFxufSk7XG5cbi8qKlxuICogVHlwZSBkZWZpbml0aW9uIGZvciBmZWF0dXJlcyBjb25maWd1cmF0aW9uLlxuICpcbiAqIEluZmVycmVkIGZyb20gRmVhdHVyZXNDb25maWdTY2hlbWEgZm9yIHR5cGUtc2FmZSBjb25maWd1cmF0aW9uIG9iamVjdHMuXG4gKi9cbmV4cG9ydCB0eXBlIEZlYXR1cmVzQ29uZmlnID0gei5pbmZlcjx0eXBlb2YgRmVhdHVyZXNDb25maWdTY2hlbWE+O1xuXG4vKipcbiAqIE1haW4gUnVudGltZSBXZWIgQ0xJIGNvbmZpZ3VyYXRpb24gc2NoZW1hLlxuICpcbiAqIFRoZSByb290IGNvbmZpZ3VyYXRpb24gb2JqZWN0IGZvciBSdW50aW1lIFdlYiBhcHBsaWNhdGlvbnMuIFRoaXMgc2NoZW1hIGRlZmluZXNcbiAqIGFsbCBhdmFpbGFibGUgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgQ0xJIHRvb2wsIGluY2x1ZGluZyBwcm9qZWN0IG1ldGFkYXRhLFxuICogZGVwbG95bWVudCBzdGFnZXMsIGZpbGUgcGF0aHMsIGluZnJhc3RydWN0dXJlIG1vZGUsIGFuZCBmZWF0dXJlIGZsYWdzLlxuICpcbiAqIENvbmZpZ3VyYXRpb24gZmlsZXMgc2hvdWxkIGJlIG5hbWVkIGBydW50aW1lLmNvbmZpZy50c2BcbiAqIGFuZCBwbGFjZWQgaW4gdGhlIHByb2plY3Qgcm9vdCBkaXJlY3RvcnkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIHJ1bnRpbWUuY29uZmlnLnRzXG4gKiBpbXBvcnQgeyBSdW50aW1lQ29uZmlnIH0gZnJvbSAnQHdvcmt0aWYvcnVudGltZSc7XG4gKlxuICogY29uc3QgY29uZmlnOiBSdW50aW1lQ29uZmlnID0ge1xuICogICBwcm9qZWN0TmFtZTogJ215LWFwcCcsXG4gKiAgIHN0YWdlczogW1xuICogICAgIHtcbiAqICAgICAgIG5hbWU6ICdkZXYnLFxuICogICAgICAgYXdzUmVnaW9uOiAndXMtZWFzdC0xJyxcbiAqICAgICAgIGF3c1Byb2ZpbGU6ICdkZXYtcHJvZmlsZSdcbiAqICAgICB9LFxuICogICAgIHtcbiAqICAgICAgIG5hbWU6ICdwcm9kJyxcbiAqICAgICAgIGF3c1JlZ2lvbjogJ3VzLXdlc3QtMicsXG4gKiAgICAgICBkb21haW46ICdleGFtcGxlLmNvbScsXG4gKiAgICAgICBzdWJkb21haW46ICd3d3cnXG4gKiAgICAgfVxuICogICBdLFxuICogICBwYXRoczoge1xuICogICAgIHNyY0RpcjogJ3NyYycsXG4gKiAgICAgcmVhY3RFbnRyeTogJ3NyYy9pbmRleC50c3gnLFxuICogICAgIG91dERpcjogJ291dC9kaXN0J1xuICogICB9LFxuICogICBpbmZyYU1vZGU6ICdjZGsnLFxuICogICBmZWF0dXJlczoge1xuICogICAgIGVuYWJsZVNlbzogdHJ1ZSxcbiAqICAgICBlbmFibGVNYW5pZmVzdDogdHJ1ZSxcbiAqICAgICBlbmFibGVXYXJtdXA6IGZhbHNlLFxuICogICAgIGNsZWFyQ2FjaGVPbkRlcGxveTogdHJ1ZVxuICogICB9XG4gKiB9O1xuICpcbiAqIGV4cG9ydCBkZWZhdWx0IGNvbmZpZztcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3QgUnVudGltZUNvbmZpZ1NjaGVtYSA9IHoub2JqZWN0KHtcbiAgLyoqXG4gICAqIFByb2plY3QgbmFtZSBpZGVudGlmaWVyLlxuICAgKlxuICAgKiBBIHVuaXF1ZSBuYW1lIGZvciB5b3VyIHByb2plY3QuIFRoaXMgaXMgdXNlZCB0byBuYW1lc3BhY2UgQVdTIHJlc291cmNlc1xuICAgKiAoQ2xvdWRGb3JtYXRpb24gc3RhY2tzLCBTMyBidWNrZXRzLCBMYW1iZGEgZnVuY3Rpb25zKSBhbmQgbXVzdCBiZSB1bmlxdWVcbiAgICogd2l0aGluIHlvdXIgQVdTIGFjY291bnQuIFVzZSBsb3dlcmNhc2UgbGV0dGVycywgbnVtYmVycywgYW5kIGh5cGhlbnMgb25seS5cbiAgICpcbiAgICogQGV4YW1wbGUgJ215LWFwcCcgfCAnY29tcGFueS13ZWJzaXRlJyB8ICdhcGktZ2F0ZXdheSdcbiAgICovXG4gIHByb2plY3ROYW1lOiB6LnN0cmluZygpLm1pbigxKSxcblxuICAvKipcbiAgICogRGVwbG95bWVudCBzdGFnZSBjb25maWd1cmF0aW9ucy5cbiAgICpcbiAgICogQW4gYXJyYXkgb2Ygc3RhZ2UgY29uZmlndXJhdGlvbnMgZGVmaW5pbmcgZGlmZmVyZW50IGRlcGxveW1lbnQgZW52aXJvbm1lbnRzLlxuICAgKiBFYWNoIHN0YWdlIHJlcHJlc2VudHMgYSBzZXBhcmF0ZSBBV1MgZGVwbG95bWVudCB3aXRoIGl0cyBvd24gcmVzb3VyY2VzLlxuICAgKiBBdCBsZWFzdCBvbmUgc3RhZ2UgaXMgcmVxdWlyZWQuIENvbW1vbiBwYXR0ZXJucyBpbmNsdWRlOlxuICAgKiAtIFNpbmdsZSBzdGFnZTogWydkZXYnXVxuICAgKiAtIFR3byBzdGFnZXM6IFsnZGV2JywgJ3Byb2QnXVxuICAgKiAtIFRocmVlIHN0YWdlczogWydkZXYnLCAnc3RhZ2luZycsICdwcm9kJ11cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBzdGFnZXM6IFtcbiAgICogICB7IG5hbWU6ICdkZXYnLCBhd3NSZWdpb246ICd1cy1lYXN0LTEnIH0sXG4gICAqICAgeyBuYW1lOiAncHJvZCcsIGF3c1JlZ2lvbjogJ3VzLXdlc3QtMicsIGRvbWFpbjogJ2V4YW1wbGUuY29tJyB9XG4gICAqIF1cbiAgICogYGBgXG4gICAqL1xuICBzdGFnZXM6IHouYXJyYXkoU3RhZ2VDb25maWdTY2hlbWEpLm1pbigxKSxcblxuICAvKipcbiAgICogUHJvamVjdCBwYXRoIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIERlZmluZXMgdGhlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgYW5kIGVudHJ5IHBvaW50cyBmb3IgeW91ciBhcHBsaWNhdGlvbi5cbiAgICogVGhlc2UgcGF0aHMgYXJlIHVzZWQgYnkgdGhlIGJ1aWxkIHN5c3RlbSwgZGV2ZWxvcG1lbnQgc2VydmVyLCBhbmQgQ0xJIGNvbW1hbmRzLlxuICAgKiBBbGwgcGF0aHMgYXJlIHJlbGF0aXZlIHRvIHRoZSBwcm9qZWN0IHJvb3QgZGlyZWN0b3J5LlxuICAgKlxuICAgKiBAc2VlIFBhdGhzQ29uZmlnIGZvciBkZXRhaWxlZCBwYXRoIG9wdGlvbnNcbiAgICovXG4gIHBhdGhzOiBQYXRoc0NvbmZpZ1NjaGVtYSxcblxuICAvKipcbiAgICogSW5mcmFzdHJ1Y3R1cmUgbW9kZS5cbiAgICpcbiAgICogRGV0ZXJtaW5lcyBob3cgQVdTIGluZnJhc3RydWN0dXJlIGlzIG1hbmFnZWQ6XG4gICAqIC0gJ2Nkayc6IFVzZSBBV1MgQ0RLIGZvciBpbmZyYXN0cnVjdHVyZSBhcyBjb2RlIChyZWNvbW1lbmRlZClcbiAgICogLSAnYXV0byc6IEF1dG9tYXRpYyBpbmZyYXN0cnVjdHVyZSBtYW5hZ2VtZW50IChleHBlcmltZW50YWwpXG4gICAqXG4gICAqIENESyBtb2RlIHByb3ZpZGVzIGZ1bGwgY29udHJvbCBvdmVyIEFXUyByZXNvdXJjZXMgYW5kIGlzIHByb2R1Y3Rpb24tcmVhZHkuXG4gICAqIEF1dG8gbW9kZSBpcyBleHBlcmltZW50YWwgYW5kIG1heSBoYXZlIGxpbWl0YXRpb25zLlxuICAgKlxuICAgKiBAZGVmYXVsdCAnY2RrJ1xuICAgKiBAZXhhbXBsZSAnY2RrJyB8ICdhdXRvJ1xuICAgKi9cbiAgaW5mcmFNb2RlOiB6LmVudW0oWydjZGsnLCAnYXV0byddKS5kZWZhdWx0KCdjZGsnKSxcblxuICAvKipcbiAgICogT3B0aW9uYWwgZmVhdHVyZSBmbGFncy5cbiAgICpcbiAgICogRW5hYmxlIG9yIGRpc2FibGUgc3BlY2lmaWMgUnVudGltZSBXZWIgZmVhdHVyZXMuIFdoZW4gb21pdHRlZCwgZGVmYXVsdCB2YWx1ZXNcbiAgICogYXJlIHVzZWQgZm9yIGFsbCBmZWF0dXJlcy4gVXNlIHRoaXMgdG8gY29udHJvbCB3aGljaCBMYW1iZGEgaGFuZGxlcnMgYXJlXG4gICAqIGRlcGxveWVkIGFuZCB3aGljaCBmdW5jdGlvbmFsaXR5IGlzIGF2YWlsYWJsZSBpbiB5b3VyIGFwcGxpY2F0aW9uLlxuICAgKlxuICAgKiBAc2VlIEZlYXR1cmVzQ29uZmlnIGZvciBhdmFpbGFibGUgZmVhdHVyZSBmbGFnc1xuICAgKi9cbiAgZmVhdHVyZXM6IEZlYXR1cmVzQ29uZmlnU2NoZW1hLm9wdGlvbmFsKCksXG59KTtcblxuLyoqXG4gKiBUeXBlIGRlZmluaXRpb24gZm9yIFJ1bnRpbWUgV2ViIENMSSBjb25maWd1cmF0aW9uLlxuICpcbiAqIEluZmVycmVkIGZyb20gUnVudGltZUNvbmZpZ1NjaGVtYSBmb3IgdHlwZS1zYWZlIGNvbmZpZ3VyYXRpb24gb2JqZWN0cy5cbiAqIFVzZSB0aGlzIHR5cGUgd2hlbiBjcmVhdGluZyBjb25maWd1cmF0aW9uIGZpbGVzIG9yIHdvcmtpbmcgd2l0aCBjb25maWd1cmF0aW9uXG4gKiBvYmplY3RzIGluIHlvdXIgYXBwbGljYXRpb24gY29kZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgUnVudGltZUNvbmZpZyB9IGZyb20gJ0B3b3JrdGlmL3J1bnRpbWUnO1xuICpcbiAqIGNvbnN0IGNvbmZpZzogUnVudGltZUNvbmZpZyA9IHtcbiAqICAgcHJvamVjdE5hbWU6ICdteS1hcHAnLFxuICogICBzdGFnZXM6IFt7IG5hbWU6ICdkZXYnLCBhd3NSZWdpb246ICd1cy1lYXN0LTEnIH1dLFxuICogICBwYXRoczoge1xuICogICAgIHNyY0RpcjogJ3NyYycsXG4gKiAgICAgcmVhY3RFbnRyeTogJ3NyYy9pbmRleC50c3gnLFxuICogICAgIG91dERpcjogJ291dC9kaXN0J1xuICogICB9LFxuICogICBpbmZyYU1vZGU6ICdjZGsnXG4gKiB9O1xuICogYGBgXG4gKi9cbmV4cG9ydCB0eXBlIFJ1bnRpbWVDb25maWcgPSB6LmluZmVyPHR5cGVvZiBSdW50aW1lQ29uZmlnU2NoZW1hPjtcblxuLyoqXG4gKiBEZWZhdWx0IGNvbmZpZ3VyYXRpb24gdmFsdWVzLlxuICpcbiAqIFByb3ZpZGVzIHNlbnNpYmxlIGRlZmF1bHRzIGZvciBhbGwgY29uZmlndXJhdGlvbiBvcHRpb25zLiBUaGVzZSB2YWx1ZXMgYXJlIHVzZWRcbiAqIHdoZW4gYSBjb25maWd1cmF0aW9uIGZpbGUgaXMgbWlzc2luZyBvciB3aGVuIHNwZWNpZmljIG9wdGlvbnMgYXJlIG9taXR0ZWQgZnJvbVxuICogdGhlIHVzZXIncyBjb25maWd1cmF0aW9uLiBUaGUgQ0xJIHdpbGwgbWVyZ2UgdXNlci1wcm92aWRlZCBjb25maWd1cmF0aW9uIHdpdGhcbiAqIHRoZXNlIGRlZmF1bHRzIHRvIGVuc3VyZSBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBwcmVzZW50LlxuICpcbiAqIERlZmF1bHQgY29uZmlndXJhdGlvbiBpbmNsdWRlczpcbiAqIC0gUHJvamVjdCBuYW1lOiAncnVudGltZS13ZWItYXBwJ1xuICogLSBTaW5nbGUgZGV2ZWxvcG1lbnQgc3RhZ2UgaW4gdXMtZWFzdC0xXG4gKiAtIFN0YW5kYXJkIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgKHNyYy8sIG91dC9kaXN0LylcbiAqIC0gQ0RLIGluZnJhc3RydWN0dXJlIG1vZGVcbiAqIC0gTWFuaWZlc3QgZW5hYmxlZCwgU0VPIGFuZCB3YXJtdXAgZGlzYWJsZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgREVGQVVMVF9DTElfQ09ORklHIH0gZnJvbSAnQHdvcmt0aWYvcnVudGltZSc7XG4gKlxuICogLy8gTWVyZ2UgdXNlciBjb25maWcgd2l0aCBkZWZhdWx0c1xuICogY29uc3QgY29uZmlnID0geyAuLi5ERUZBVUxUX0NMSV9DT05GSUcsIC4uLnVzZXJDb25maWcgfTtcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9DTElfQ09ORklHOiBSdW50aW1lQ29uZmlnID0ge1xuICBwcm9qZWN0TmFtZTogJ3J1bnRpbWUtd2ViLWFwcCcsXG4gIHN0YWdlczogW1xuICAgIHtcbiAgICAgIG5hbWU6ICdkZXYnLFxuICAgICAgYXdzUmVnaW9uOiAndXMtZWFzdC0xJyxcbiAgICB9LFxuICBdLFxuICBwYXRoczoge1xuICAgIHNyY0RpcjogJ3NyYycsXG4gICAgcmVhY3RFbnRyeTogJ3NyYy9pbmRleC50c3gnLFxuICAgIG91dERpcjogJ291dC9kaXN0JyxcbiAgICBjZGtEaXI6ICdjZGsnLFxuICB9LFxuICBpbmZyYU1vZGU6ICdjZGsnLFxuICBmZWF0dXJlczoge1xuICAgIGVuYWJsZVNlbzogZmFsc2UsXG4gICAgZW5hYmxlTWFuaWZlc3Q6IHRydWUsXG4gICAgZW5hYmxlV2FybXVwOiBmYWxzZSxcbiAgICBjbGVhckNhY2hlT25EZXBsb3k6IHRydWUsXG4gIH0sXG59O1xuXG4iLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IHdvcmt0aWYucnVudGltZS5jZGsgPHdvcmt0aWZfcnVudGltZV9jZGs+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0yMiwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG4vKipcbiAqIEVudW0gcmVwcmVzZW50aW5nIHRoZSBwb3NzaWJsZSBkZXBsb3ltZW50IHN0YWNrcyBmb3IgdGhlIGFwcGxpY2F0aW9uLlxuICpcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKiBAcmVhZG9ubHlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBSdW50aW1lV2ViU3RhY2sgUmVwcmVzZW50cyB0aGUgc3RhY2sgdmFsdWUgJ3J1bnRpbWUtd2ViLXN0YWNrJy5cbiAqL1xuZXhwb3J0IGVudW0gRGVwbG95U3RhY2tzIHtcbiAgUnVudGltZVdlYlN0YWNrID0gJ3J1bnRpbWUtd2ViLXN0YWNrJyxcbn1cblxuLyoqXG4gKiBFbnVtIHJlcHJlc2VudGluZyBEeW5hbW9EQiB0YWJsZSBuYW1lcy5cbiAqXG4gKiBUaGlzIGVudW0gY29udGFpbnMgY29uc3RhbnRzIHRoYXQgbWFwIHRvIHRoZSBuYW1lcyBvZiB0YWJsZXMgdXNlZCBpblxuICogRHluYW1vREIgZm9yIHRoZSBhcHBsaWNhdGlvbi4gRWFjaCBjb25zdGFudCByZXByZXNlbnRzIGEgc3RyaW5nXG4gKiBpZGVudGlmeWluZyB0aGUgdGFibGUncyBuYW1lIGluIHRoZSBkYXRhYmFzZS5cbiAqL1xuZXhwb3J0IGVudW0gRHluYW1vRGJUYWJsZXMge1xuICBTZW9FbmdpbmVEeW5hbW9EYkVudGl0eSA9ICdydW50aW1lX3dlYl9zZW9fZW5naW5lJyxcbn1cblxuXG4vKipcbiAqIEVudW1lcmF0aW9uIHJlcHJlc2VudGluZyBTMyBidWNrZXQgbmFtZXMuIFRoaXMgZW51bSBpcyB1c2VkIHRvIGRlZmluZVxuICogYW5kIG1hbmFnZSB0aGUgaWRlbnRpZmllcnMgZm9yIHNwZWNpZmljIFMzIGJ1Y2tldHMgd2l0aGluIHRoZSBhcHBsaWNhdGlvbi5cbiAqXG4gKiBNZW1iZXJzOlxuICogLSBTdGF0aWNTM0J1Y2tldDogUmVwcmVzZW50cyBhIHN0YXRpYyBTMyBidWNrZXQgaWRlbnRpZmllci5cbiAqL1xuZXhwb3J0IGVudW0gUzNCdWNrZXRzIHtcbiAgU3RhdGljUzNCdWNrZXQgPSAncnVudGltZV93ZWJfc3RhdGljJyxcbn1cblxuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIHN0YWdlcyBmb3IgdGhlIEFQSSBHYXRld2F5IGluIHRoZSBhcHBsaWNhdGlvbi5cbiAqXG4gKiBUaGlzIGVudW1lcmF0aW9uIGhvbGRzIGRpZmZlcmVudCBzdGFnZSB2YWx1ZXMgbGlua2VkIHRvIHRoZSBBUEkgR2F0ZXdheSBjb25maWd1cmF0aW9uLlxuICogVGhlc2Ugc3RhZ2VzIGFyZSB1c2VkIHRvIGRlZmluZSBhbmQgaWRlbnRpZnkgdmFyaW91cyBkZXBsb3ltZW50IGVudmlyb25tZW50cyBvciBzdGFnZXNcbiAqIG9mIHRoZSBBUEkgR2F0ZXdheSwgd2hpY2ggaGVscHMgaW4gcm91dGluZyByZXF1ZXN0cyBhcHByb3ByaWF0ZWx5IHdpdGhpbiB0aGUgc3lzdGVtLlxuICpcbiAqIEVudW1lcmF0aW9uIE1lbWJlcnM6XG4gKiAtIGBSdW50aW1lQXBpR2F0ZXdheVN0YWdlYDogUmVmZXJzIHRvIHRoZSBzdGFnZSBsYWJlbGVkIGFzICdydW50aW1lX3dlYl9hcGlfZ2F0ZXdheV9zdGFnZScuXG4gKlxuICogRGVzaWduZWQgdG8gbWFuYWdlIGFuZCBzdHJlYW1saW5lIGNvbW11bmljYXRpb24gd2l0aCBBUEkgR2F0ZXdheSBieSBsZXZlcmFnaW5nIHNwZWNpZmljIHN0YWdlIGlkZW50aWZpZXJzLlxuICovXG5leHBvcnQgZW51bSBBcGlHYXRld2F5U3RhZ2VzIHtcbiAgUnVudGltZVdlYkFwaUdhdGV3YXlTdGFnZSA9ICdydW50aW1lX3dlYl9hcGlfZ2F0ZXdheV9zdGFnZScsXG59XG5cbi8qKlxuICogRW51bWVyYXRpb24gcmVwcmVzZW50aW5nIHR5cGVzIG9mIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9ucy5cbiAqXG4gKiBUaGUgZW51bSBjb250YWlucyB0aGUgcG9zc2libGUgdmFsdWVzIHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVwcmVzZW50XG4gKiBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbiB0eXBlcy4gVGhpcyBjYW4gYmUgdXNlZCwgZm9yIGV4YW1wbGUsIHRvXG4gKiBzcGVjaWZ5IG9yIGlkZW50aWZ5IGRpc3RyaWJ1dGlvbiBjb25maWd1cmF0aW9ucyBvciBjYXRlZ29yaWVzXG4gKiB3aXRoaW4gdGhlIENsb3VkRnJvbnQgc2VydmljZS5cbiAqXG4gKiBNZW1iZXJzOlxuICogLSBDbG91ZEZyb250RGlzdHJpYnV0aW9uOiBSZXByZXNlbnRzIGEgc3RhbmRhcmQgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24gdHlwZS5cbiAqL1xuZXhwb3J0IGVudW0gQ2xvdWRGcm9udERpc3RyaWJ1dGlvbnMge1xuICBDbG91ZEZyb250RGlzdHJpYnV0aW9uID0gJ3J1bnRpbWVfd2ViX2Rpc3RyaWJ1dGlvbicsXG59XG5cblxuLyoqXG4gKiBFbnVtZXJhdGlvbiByZXByZXNlbnRpbmcgdmFyaW91cyBMYW1iZGEgZnVuY3Rpb25zIHV0aWxpemVkIHdpdGhpbiB0aGUgYXBwbGljYXRpb24uXG4gKlxuICogVGhpcyBlbnVtIGlzIHVzZWQgdG8gcmVmZXJlbmNlIHNwZWNpZmljIExhbWJkYSBmdW5jdGlvbnMgYnkgdGhlaXIgaWRlbnRpZmllciBzdHJpbmdzLlxuICpcbiAqIEVudW0gbWVtYmVyczpcbiAqIC0gYFJ1bnRpbWVIYW5kbGVyTGFtYmRhYDogUmVwcmVzZW50cyB0aGUgaGFuZGxlciBmb3Igc2VydmVybGVzcyByZW5kZXJpbmcgY3Jvc3MtZG9tYWluIG9wZXJhdGlvbnMuXG4gKiAtIGBTc3JTZW9MYW1iZGFgOiBSZXByZXNlbnRzIHRoZSBMYW1iZGEgaGFuZGxpbmcgU0VPLXJlbGF0ZWQgc2VydmVybGVzcyByZW5kZXJpbmcgY3Jvc3MtZG9tYWluIHRhc2tzLlxuICogLSBgU3NyTWFuaWZlc3RMYW1iZGFgOiBSZXByZXNlbnRzIHRoZSBMYW1iZGEgcmVzcG9uc2libGUgZm9yIG1hbmFnaW5nIHNlcnZlcmxlc3MgcmVuZGVyaW5nIGNyb3NzLWRvbWFpbiBtYW5pZmVzdHMuXG4gKi9cbmV4cG9ydCBlbnVtIExhbWJkYUZ1bmN0aW9ucyB7XG4gIFJ1bnRpbWVXZWJIYW5kbGVyTGFtYmRhID0gJ2xhbWJkYVJ1bnRpbWVXZWJIYW5kbGVyJyxcbiAgUnVudGltZVdlYlNlb0xhbWJkYSA9ICdsYW1iZGFSdW50aW1lV2ViU2VvSGFuZGxlcicsXG4gIFJ1bnRpbWVXZWJXYXJtdXBMYW1iZGEgPSAnbGFtYmRhUnVudGltZVdlYldhcm11cEhhbmRsZXInLFxuICBSdW50aW1lV2ViTWFuaWZlc3RMYW1iZGEgPSAnbGFtYmRhUnVudGltZVdlYk1hbmlmZXN0SGFuZGxlcicsXG59XG5cblxuLyoqXG4gKiBFbnVtIHJlcHJlc2VudGluZyB0aGUgZXhlY3V0aW9uIHJvbGUgdXNlZCBmb3IgUmVhY3Qgc2VydmVybGVzcyBMYW1iZGEgZnVuY3Rpb25zLlxuICpcbiAqIFRoZSBgUnVudGltZUxhbWJkYUV4ZWN1dGlvblJvbGVgIGVudW0gaXMgdXRpbGl6ZWQgdG8gZGVmaW5lIGFuZCByZXByZXNlbnRcbiAqIHRoZSBzcGVjaWZpYyBleGVjdXRpb24gcm9sZSByZXF1aXJlZCBieSBhIFJlYWN0IHNlcnZlcmxlc3MgTGFtYmRhIGZ1bmN0aW9uXG4gKiB0byBpbnRlcmFjdCB3aXRoIEFXUyBzZXJ2aWNlcyBzZWN1cmVseS5cbiAqXG4gKiBUaGlzIGVudW0gZW5zdXJlcyBjb25zaXN0ZW50IHVzYWdlIG9mIHRoZSByb2xlIG5hbWUgYWNyb3NzIHRoZSBhcHBsaWNhdGlvblxuICogd2hlbiB3b3JraW5nIHdpdGggc2VydmVybGVzcyBMYW1iZGEgZnVuY3Rpb25zIHdpdGhpbiBhIFJlYWN0IGZyYW1ld29yay5cbiAqXG4gKiBFbnVtIG1lbWJlcnM6XG4gKiAtIGBSdW50aW1lV2ViTGFtYmRhRXhlY3V0aW9uUm9sZWA6IFJlcHJlc2VudHMgdGhlIGV4ZWN1dGlvbiByb2xlIGlkZW50aWZpZXJcbiAqICAgZm9yIFJ1bnRpbWUgTGFtYmRhIGZ1bmN0aW9ucy5cbiAqL1xuZXhwb3J0IGVudW0gSWFtRXhlY3V0aW9uUm9sZXMge1xuICBSdW50aW1lTGFtYmRhRXhlY3V0aW9uUm9sZSA9ICdydW50aW1lX3dlYl9sYW1iZGFfZXhlY3V0aW9uX3JvbGUnLFxufVxuXG4vKipcbiAqIEVudW0gcmVwcmVzZW50aW5nIHRoZSBBUEkgR2F0ZXdheSBFeGVjdXRpb24gUm91dGVyLlxuICpcbiAqIFRoaXMgZW51bSBwcm92aWRlcyByb3V0ZSBpZGVudGlmaWVycyBmb3IgZGlmZmVyZW50IEFQSSBHYXRld2F5IGV4ZWN1dGlvbiByb3V0ZXJzLlxuICpcbiAqIEVudW0gTWVtYmVyczpcbiAqIC0gUnVudGltZVdlYkFwaUdhdGV3YXlFeGVjdXRpb25Sb3V0ZXI6IFJlcHJlc2VudHMgdGhlIGV4ZWN1dGlvbiByb3V0ZXIgZm9yIFJ1bnRpbWUgV2ViIEFQSSBHYXRld2F5LlxuICovXG5leHBvcnQgZW51bSBBcGlHYXRld2F5RXhlY3V0aW9uUm91dGVycyB7XG4gIFJ1bnRpbWVXZWJBcGlHYXRld2F5RXhlY3V0aW9uUm91dGVyID0gJ3J1bnRpbWVfd2ViX2FwaV9nYXRld2F5X2V4ZWN1dGlvbl9yb3V0ZXInLFxufVxuXG5cbiJdLAogICJtYXBwaW5ncyI6ICJtb0JBQUEsSUFBQUEsRUFBQUMsRUFBQUMsR0FBQSxjQUdBLE9BQU8sZUFBZUEsRUFBUyxhQUFjLENBQUUsTUFBTyxFQUFLLENBQUMsRUFDNURBLEVBQVEsVUFBWUEsRUFBUSx1QkFBeUJBLEVBQVEscUJBQXVCQSxFQUFRLGFBQWVBLEVBQVEsa0JBQW9CQSxFQUFRLG1CQUFxQkEsRUFBUSxvQkFBc0JBLEVBQVEsb0JBQXNCQSxFQUFRLFVBQVlBLEVBQVEsY0FBZ0JBLEVBQVEsZ0NBQWtDQSxFQUFRLHFCQUF1QkEsRUFBUSxpQkFBbUJBLEVBQVEsZ0JBQWtCQSxFQUFRLGdDQUFrQ0EsRUFBUSw4QkFBZ0NBLEVBQVEsV0FBYUEsRUFBUSxzQkFBd0JBLEVBQVEsb0JBQXNCQSxFQUFRLG1CQUFxQkEsRUFBUSxpQkFBbUJBLEVBQVEsZ0JBQWtCQSxFQUFRLEdBQUtBLEVBQVEsYUFBZUEsRUFBUSxnQkFBa0JBLEVBQVEsVUFBWUEsRUFBUSxlQUFpQkEsRUFBUSw4QkFBZ0NBLEVBQVEsV0FBYUEsRUFBUSxnQ0FBa0NBLEVBQVEsaUJBQW1CQSxFQUFRLGFBQWVBLEVBQVEsa0JBQW9CQSxFQUFRLGtCQUFvQkEsRUFBUSxtQkFBcUJBLEVBQVEsZUFBaUJBLEVBQVEsT0FBU0EsRUFBUSxnQkFBa0JBLEVBQVEsc0JBQXdCQSxFQUFRLHFCQUF1QkEsRUFBUSwrQkFBaUNBLEVBQVEsWUFBY0EsRUFBUSwyQkFBNkJBLEVBQVEsS0FBT0EsRUFBUSxnQkFBa0JBLEVBQVEsVUFBWUEsRUFBUSxrQkFBb0JBLEVBQVEsbUJBQXFCQSxFQUFRLFFBQVVBLEVBQVEsU0FBV0EsRUFBUSxTQUFX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UUFBUSxFQUFFLFFBQVEsRUFBSSxDQUM5QyxDQUFDLEVBd0RZQyxHQUFzQixJQUFFLE9BQU8sQ0FVMUMsWUFBYSxJQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsRUFvQjdCLE9BQVEsSUFBRSxNQUFNSCxFQUFpQixFQUFFLElBQUksQ0FBQyxFQVd4QyxNQUFPQyxHQWVQLFVBQVcsSUFBRSxLQUFLLENBQUMsTUFBTyxNQUFNLENBQUMsRUFBRSxRQUFRLEtBQUssRUFXaEQsU0FBVUMsR0FBcUIsU0FBUyxDQUMxQyxDQUFDLEVBa0RZRSxHQUFvQyxDQUMvQyxZQUFhLGtCQUNiLE9BQVEsQ0FDTixDQUNFLEtBQU0sTUFDTixVQUFXLFdBQ2IsQ0FDRixFQUNBLE1BQU8sQ0FDTCxPQUFRLE1BQ1IsV0FBWSxnQkFDWixPQUFRLFdBQ1IsT0FBUSxLQUNWLEVBQ0EsVUFBVyxNQUNYLFNBQVUsQ0FDUixVQUFXLEdBQ1gsZUFBZ0IsR0FDaEIsYUFBYyxHQUNkLG1CQUFvQixFQUN0QixDQUNGLEVDemJPLElBQUtDLFFBQ1ZBLEVBQUEsZ0JBQWtCLG9CQURSQSxRQUFBLElBV0FDLFFBQ1ZBLEVBQUEsd0JBQTBCLHlCQURoQkEsUUFBQSxJQVlBQyxRQUNWQSxFQUFBLGVBQWlCLHFCQURQQSxRQUFBLElBaUJBQyxRQUNWQSxFQUFBLDBCQUE0QixnQ0FEbEJBLFFBQUEsSUFlQUMsUUFDVkEsRUFBQSx1QkFBeUIsMkJBRGZBLFFBQUEsSUFlQUMsUUFDVkEsRUFBQSx3QkFBMEIsMEJBQzFCQSxFQUFBLG9CQUFzQiw2QkFDdEJBLEVBQUEsdUJBQXlCLGdDQUN6QkEsRUFBQSx5QkFBMkIsa0NBSmpCQSxRQUFBLElBc0JBQyxRQUNWQSxFQUFBLDJCQUE2QixvQ0FEbkJBLFFBQUEsSUFZQUMsUUFDVkEsRUFBQSxvQ0FBc0MsMkNBRDVCQSxRQUFBIiwKICAibmFtZXMiOiBbInJlcXVpcmVfbGVnYWN5IiwgIl9fY29tbW9uSlNNaW4iLCAiZXhwb3J0cyIsICJyZXF1aXJlX3V0aWxzIiwgIl9fY29tbW9uSlNNaW4iLCAiZXhwb3J0cyIsICJyZXF1aXJlX3V0aWxzX2Z1bmN0aW9ucyIsICJfX2NvbW1vbkpTTWluIiwgImV4cG9ydHMiLCAidXRpbHNfMSIsICJnZXRSZWFzb25QaHJhc2UiLCAic3RhdHVzQ29kZSIsICJyZXN1bHQiLCAiZ2V0U3RhdHVzQ29kZSIsICJyZWFzb25QaHJhc2UiLCAicmVxdWlyZV9zdGF0dXNfY29kZXMiLCAiX19jb21tb25KU01pbiIsICJleHBvcnRzIiwgIlN0YXR1c0NvZGVzIiwgInJlcXVpcmVfcmVhc29uX3BocmFzZXMiLCAiX19jb21tb25KU01pbiIsICJleHBvcnRzIiwgIlJlYXNvblBocmFzZXMiLCAicmVxdWlyZV9janMiLCAiX19jb21tb25KU01pbiIsICJleHBvcnRzIiwgIl9fYXNzaWduIiwgInQiLCAicyIsICJpIiwgInAiLCAiX19jcmVhdGVCaW5kaW5nIiwgIm8iLCAibSIsICJrIiwgImsyIiwgIl9fZXhwb3J0U3RhciIsICJfX2ltcG9ydERlZmF1bHQiLCAibW9kIiwgImxlZ2FjeV8xIiwgInV0aWxzX2Z1bmN0aW9uc18xIiwgInV0aWxzX2Z1bmN0aW9uc18yIiwgInN0YXR1c19jb2Rlc18xIiwgInJlYXNvbl9waHJhc2VzXzEiLCAiaW5kZXhfZXhwb3J0cyIsICJfX2V4cG9ydCIsICJBcGlHYXRld2F5RXhlY3V0aW9uUm91dGVycyIsICJBcGlHYXRld2F5U3RhZ2VzIiwgIkF3c1JlZ2lvblNjaGVtYSIsICJCcm93c2VyUGlwZWxpbmUiLCAiQ2xvdWRGcm9udERpc3RyaWJ1dGlvbnMiLCAiREVGQVVMVF9DTElfQ09ORklHIiwgIkRlcGxveVN0YWNrcyIsICJEeW5hbW9EYlRhYmxlcyIsICJFbmdpbmVzQnJvd3NlckZyYW1ld29yayIsICJFcnJvckJvdW5kYXJ5IiwgIkVycm9yQm91bmRhcnlOb3RGb3VuZCIsICJGZWF0dXJlc0NvbmZpZ1NjaGVtYSIsICJJYW1FeGVjdXRpb25Sb2xlcyIsICJMYW1iZGFGdW5jdGlvbnMiLCAiUGF0aHNDb25maWdTY2hlbWEiLCAiUnVudGltZUFwcFNlcnZlciIsICJSdW50aW1lQ29uZmlnU2NoZW1hIiwgIlJ1bnRpbWVIZWFkTWFuYWdlciIsICJSdW50aW1lUm91dGVyIiwgIlJ1bnRpbWVSb3V0ZXJQcm92aWRlciIsICJTM0J1Y2tldHMiLCAiU3RhZ2VDb25maWdTY2hlbWEiLCAiY3JlYXRlUm91dGVMb2FkZXIiLCAiY3JlYXRlU2VvUmV0cmlldmVyIiwgImV4ZWN1dGVSdW50aW1lQXN5bmMiLCAiZmV0Y2hTZW9NZXRhZGF0YSIsICJnZXREZWZhdWx0U2VvTWV0YSIsICJpbmplY3RGbG93IiwgImludGVyc2VjdGlvbiIsICJpc0Jyb3dzZXIiLCAiaXNMYW1iZGFSdW50aW1lIiwgImlzVmFsaWRTZXJ2aWNlTmFtZSIsICJtZXJnZUxvYWRlclJlc3VsdHMiLCAicm91dGVQYXRoIiwgInJvdXRlckNvbnRleHQiLCAicnVudGltZSIsICJydW50aW1lUm91dGVyIiwgInJ1bnRpbWVUaHJlYWRzIiwgInVzZVJ1bnRpbWVEYXRhIiwgInVzZVJ1bnRpbWVTZW9NZXRhIiwgIl9fdG9Db21tb25KUyIsICJSZWFjdCIsICJpbXBvcnRfcmVhY3QiLCAiaW1wb3J0X3JlYWN0X3JvdXRlciIsICJ1c2VSdW50aW1lRGF0YSIsICJsb2FkZXJEYXRhIiwgInVzZVJ1bnRpbWVTZW9NZXRhIiwgImNvbnN0cnVjdFNlb0FwaVVybCIsICJyb3V0ZSIsICJhcGlCYXNlVXJsIiwgImZldGNoU2VvTWV0YWRhdGFGcm9tQXBpIiwgInVybCIsICJyZXNwb25zZSIsICJkYXRhIiwgImFkYXB0QmFja2VuZFNlb1RvRnJvbnRlbmQiLCAiZXJyb3IiLCAiYmFja2VuZCIsICJjcmVhdGVTZW9SZXRyaWV2ZXIiLCAicm91dGVQYXRoIiwgImN0eCIsICJmZXRjaFNlb01ldGFkYXRhIiwgImdldERlZmF1bHRTZW9NZXRhIiwgImVycm9yIiwgInJlc29sdmVkUGF0aCIsICJrZXkiLCAidmFsdWUiLCAiZmV0Y2hTZW9NZXRhZGF0YUZyb21BcGkiLCAiUkVTRVJWRURfSU5URVJOQUxfS0VZIiwgImNyZWF0ZVJvdXRlTG9hZGVyIiwgInJvdXRlUGF0aCIsICJ1c2VyUmV0cmlldmVycyIsICJhcmdzIiwgInBhcmFtcyIsICJyZXF1ZXN0IiwgInNlYXJjaFBhcmFtcyIsICJjb250ZXh0IiwgImludGVybmFsUmV0cmlldmVycyIsICJjcmVhdGVTZW9SZXRyaWV2ZXIiLCAidXNlclJldHJpZXZlcnNXaXRoTWV0YWRhdGEiLCAicmV0cmlldmVyIiwgImluZGV4IiwgImFsbFJldHJpZXZlcnMiLCAicmVzdWx0cyIsICJleGVjdXRlUnVudGltZUFzeW5jIiwgIm1lcmdlTG9hZGVyUmVzdWx0cyIsICJyZXRyaWV2ZXJzIiwgInByb21pc2VzIiwgImxvYWRlclJlc3VsdCIsICJyZXN1bHQiLCAiaXNJbnRlcm5hbCIsICJuYW1lIiwgImRhdGEiLCAiXyIsICJyZXN0IiwgImxvZ1JldHJpZXZlckZhaWx1cmUiLCAicmVhc29uIiwgInJldHJpZXZlck5hbWUiLCAiZXJyb3IiLCAiZXJyb3JNZXNzYWdlIiwgInN0YWNrVHJhY2UiLCAibG9nUHJlZml4IiwgIlJlYWN0IiwgImltcG9ydF9yZWFjdCIsICJpbXBvcnRfcmVhY3Rfcm91dGVyIiwgIlJ1bnRpbWVSb3V0ZXJQcm92aWRlciIsICJyb3V0ZXIiLCAiY3VycmVudFJvdXRlciIsICJzZXRDdXJyZW50Um91dGVyIiwgIlJlYWN0IiwgImltcG9ydF9yZWFjdCIsICJyb3V0ZVBhdGgiLCAicGF0aCIsICJpbmplY3RGbG93IiwgImNoaWxkcmVuIiwgInJvdXRlciIsICJjaGlsZCIsICJpbnRlcnNlY3Rpb24iLCAiYXJyMSIsICJhcnIyIiwgInNldDEiLCAic2V0MiIsICJyZXN1bHQiLCAiaXRlbSIsICJSdW50aW1lUm91dGVyIiwgInJvdXRlciIsICJkZWZhdWx0cyIsICJ0cmFuc2Zvcm1lZFJvdXRlcyIsICJkZWZhdWx0c0tleXMiLCAicm91dGUiLCAiaW5kZXgiLCAicm91dGVyS2V5cyIsICJpbnRlcnNlY3RlZCIsICJpbnRlcnNlY3Rpb24iLCAia2V5IiwgInJvdXRlcyIsICJwYXRoIiwgInJ1bnRpbWVBc3luYyIsICJjaGlsZHJlbiIsICJyb3V0ZVByb3BzIiwgInJvdXRlUGF0aG5hbWUiLCAicm91dGVQYXRoIiwgImxvYWRlciIsICJjcmVhdGVSb3V0ZUxvYWRlciIsICJ0cmFuc2Zvcm1lZENoaWxkcmVuIiwgInJlc3VsdCIsICJpZCIsICJydW50aW1lUm91dGVyIiwgIm9wdGlvbnMiLCAiRXJyb3JCb3VuZGFyeSIsICJwcm9wcyIsICJlcnJvciIsICJlcnJvckluZm8iLCAiaGFuZGxlckVycm9yIiwgInByZXZTdGF0ZSIsICJuZXdUaW1lciIsICJyb3V0ZVBhdGgiLCAic3R5bGVzIiwgImUiLCAiRXJyb3JCb3VuZGFyeU5vdEZvdW5kIiwgInJlZGlyZWN0VGltZXIiLCAic2V0UmVkaXJlY3RUaW1lciIsICJjb3VudGRvd24iLCAicHJldiIsICJpbXBvcnRfcmVhY3QiLCAiaW1wb3J0X3JlYWN0X3JvdXRlciIsICJoZWFkTWFuYWdlckluc3RhbmNlQ291bnQiLCAiUnVudGltZUhlYWRNYW5hZ2VyIiwgImxvY2F0aW9uIiwgIm1hdGNoZXMiLCAiaXNNb3VudGVkUmVmIiwgInNlb01ldGEiLCAidXBkYXRlTWV0YVRhZyIsICJ1cGRhdGVNZXRhUHJvcGVydHkiLCAidXBkYXRlTWV0YU5hbWUiLCAidXBkYXRlTGlua1RhZyIsICJ1cGRhdGVKc29uTGQiLCAiZXJyb3IiLCAibmFtZSIsICJjb250ZW50IiwgIm1ldGEiLCAiZXNjYXBlZENvbnRlbnQiLCAiZXNjYXBlSHRtbCIsICJwcm9wZXJ0eSIsICJyZWwiLCAiaHJlZiIsICJsaW5rIiwgImVzY2FwZWRIcmVmIiwgImpzb25MZCIsICJzY3JpcHQiLCAianNvblN0cmluZyIsICJ0ZXh0IiwgImRpdiIsICJSZWFjdCIsICJpbXBvcnRfcmVhY3QiLCAiUnVudGltZUFwcFNlcnZlciIsICJjaGlsZHJlbiIsICJtb3VudGVkIiwgInNldE1vdW50ZWQiLCAiZmFkZUluIiwgInNldEZhZGVJbiIsICJ0aW1lb3V0IiwgInJ1bnRpbWVfYXBwX3NlcnZlcl9kZWZhdWx0IiwgImltcG9ydF9odHRwX3N0YXR1c19jb2RlcyIsICJpc0Jyb3dzZXIiLCAiZmluZE1hdGNoaW5nUm91dGUiLCAicm91dGUiLCAicGF0aG5hbWUiLCAibWF0Y2hEeW5hbWljUm91dGUiLCAiZXh0cmFjdFBhcmFtcyIsICJjaGlsZCIsICJtYXRjaCIsICJyb3V0ZVBhdGgiLCAicm91dGVTZWdtZW50cyIsICJwYXRobmFtZVNlZ21lbnRzIiwgInNlZ21lbnQiLCAiaW5kZXgiLCAicGFyYW1zIiwgInJvdXRlckNvbnRleHQiLCAibG9jYXRpb24iLCAicm91dGVyIiwgIm1hdGNoZXMiLCAiUmVhY3QiLCAiaW1wb3J0X3JlYWN0X3JvdXRlciIsICJpbXBvcnRfY2xpZW50IiwgImlzTGFtYmRhUnVudGltZSIsICJrZXkiLCAiRU1QVFlfU1RSSU5HIiwgInJ1bnRpbWVUaHJlYWRzIiwgInJ1bnRpbWUiLCAicnVudGltZVRocmVhZHNJbnN0YW5jZSIsICJSdW50aW1lUm91dGVyIiwgImlzTGFtYmRhUnVudGltZSIsICJyZW5kZXJSZWFjdEFwcCIsICJlcnJvciIsICJhcHBPcHRpb25zIiwgImlzQnJvd3NlciIsICJyb290RWxlbWVudCIsICJyb290UnVudGltZSIsICJzdGFnZSIsICJwYXRobmFtZSIsICJsb2NhdGlvbiIsICJjb250ZXh0IiwgInJvdXRlckNvbnRleHQiLCAicm91dGVyQnJvd3NlciIsICJydW50aW1lX2FwcF9zZXJ2ZXJfZGVmYXVsdCIsICJlcnJvckluZm8iLCAicm9vdCIsICJBcHBSb3V0ZWQiLCAiUmVhY3QiLCAiaW1wb3J0X2NsaWVudCIsICJpbXBvcnRfcmVhY3Rfcm91dGVyIiwgIkJyb3dzZXJQaXBlbGluZSIsICJjb25maWciLCAiY29udGV4dCIsICJicm93c2VyUm91dGVyIiwgImFwcEVsZW1lbnQiLCAicm91dGVyUHJvdmlkZXIiLCAiZXJyb3IiLCAicm91dGVzIiwgImNvbnRhaW5lciIsICJiYXNlVXJsIiwgInN0YWdlIiwgImlzVmFsaWRTZXJ2aWNlTmFtZSIsICJzZXJ2aWNlTmFtZSIsICJFbmdpbmVzQnJvd3NlckZyYW1ld29yayIsICJpbXBvcnRfem9kIiwgIkFXU19SRUdJT05TIiwgIkF3c1JlZ2lvblNjaGVtYSIsICJTdGFnZUNvbmZpZ1NjaGVtYSIsICJQYXRoc0NvbmZpZ1NjaGVtYSIsICJGZWF0dXJlc0NvbmZpZ1NjaGVtYSIsICJSdW50aW1lQ29uZmlnU2NoZW1hIiwgIkRFRkFVTFRfQ0xJX0NPTkZJRyIsICJEZXBsb3lTdGFja3MiLCAiRHluYW1vRGJUYWJsZXMiLCAiUzNCdWNrZXRzIiwgIkFwaUdhdGV3YXlTdGFnZXMiLCAiQ2xvdWRGcm9udERpc3RyaWJ1dGlvbnMiLCAiTGFtYmRhRnVuY3Rpb25zIiwgIklhbUV4ZWN1dGlvblJvbGVzIiwgIkFwaUdhdGV3YXlFeGVjdXRpb25Sb3V0ZXJzIl0KfQo=
@@ -1,3 +1,4 @@
1
1
  export * from './runtime-core';
2
2
  export * from './runtime-web';
3
3
  export * from './runtime.types';
4
+ export type { RuntimeConfig } from '../utils/types/runtime.config';
@@ -1,3 +1,4 @@
1
1
  export * from './runtime-core';
2
2
  export * from './runtime-web';
3
3
  export * from './runtime.types';
4
+ export type { RuntimeConfig } from '../utils/types/runtime.config';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@worktif/runtime",
3
- "version": "0.3.0-edge.38",
3
+ "version": "0.3.0-edge.39",
4
4
  "description": "Serverless web framework running on AWS Lambda with support for server-side rendering, caching, and CI/CD.",
5
5
  "repository": "git@bitbucket.org:worktif/runtime-target.git",
6
6
  "author": "Raman Marozau <raman@worktif.com>",