@openai/agents-realtime 0.0.1

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.
Files changed (100) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +13 -0
  3. package/dist/bundle/openai-realtime-agents.mjs +8777 -0
  4. package/dist/bundle/openai-realtime-agents.umd.js +11 -0
  5. package/dist/clientMessages.d.ts +40 -0
  6. package/dist/clientMessages.js +2 -0
  7. package/dist/clientMessages.js.map +1 -0
  8. package/dist/clientMessages.mjs +2 -0
  9. package/dist/clientMessages.mjs.map +1 -0
  10. package/dist/guardrail.d.ts +32 -0
  11. package/dist/guardrail.js +34 -0
  12. package/dist/guardrail.js.map +1 -0
  13. package/dist/guardrail.mjs +34 -0
  14. package/dist/guardrail.mjs.map +1 -0
  15. package/dist/index.d.ts +18 -0
  16. package/dist/index.js +13 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/index.mjs +13 -0
  19. package/dist/index.mjs.map +1 -0
  20. package/dist/items.d.ts +183 -0
  21. package/dist/items.js +47 -0
  22. package/dist/items.js.map +1 -0
  23. package/dist/items.mjs +47 -0
  24. package/dist/items.mjs.map +1 -0
  25. package/dist/logger.d.ts +2 -0
  26. package/dist/logger.js +4 -0
  27. package/dist/logger.js.map +1 -0
  28. package/dist/logger.mjs +4 -0
  29. package/dist/logger.mjs.map +1 -0
  30. package/dist/metadata.d.ts +9 -0
  31. package/dist/metadata.js +11 -0
  32. package/dist/metadata.js.map +1 -0
  33. package/dist/metadata.mjs +11 -0
  34. package/dist/metadata.mjs.map +1 -0
  35. package/dist/openaiRealtimeBase.d.ts +143 -0
  36. package/dist/openaiRealtimeBase.js +449 -0
  37. package/dist/openaiRealtimeBase.js.map +1 -0
  38. package/dist/openaiRealtimeBase.mjs +449 -0
  39. package/dist/openaiRealtimeBase.mjs.map +1 -0
  40. package/dist/openaiRealtimeEvents.d.ts +3242 -0
  41. package/dist/openaiRealtimeEvents.js +439 -0
  42. package/dist/openaiRealtimeEvents.js.map +1 -0
  43. package/dist/openaiRealtimeEvents.mjs +439 -0
  44. package/dist/openaiRealtimeEvents.mjs.map +1 -0
  45. package/dist/openaiRealtimeWebRtc.d.ts +102 -0
  46. package/dist/openaiRealtimeWebRtc.js +245 -0
  47. package/dist/openaiRealtimeWebRtc.js.map +1 -0
  48. package/dist/openaiRealtimeWebRtc.mjs +245 -0
  49. package/dist/openaiRealtimeWebRtc.mjs.map +1 -0
  50. package/dist/openaiRealtimeWebsocket.d.ts +126 -0
  51. package/dist/openaiRealtimeWebsocket.js +293 -0
  52. package/dist/openaiRealtimeWebsocket.js.map +1 -0
  53. package/dist/openaiRealtimeWebsocket.mjs +293 -0
  54. package/dist/openaiRealtimeWebsocket.mjs.map +1 -0
  55. package/dist/realtimeAgent.d.ts +49 -0
  56. package/dist/realtimeAgent.js +37 -0
  57. package/dist/realtimeAgent.js.map +1 -0
  58. package/dist/realtimeAgent.mjs +37 -0
  59. package/dist/realtimeAgent.mjs.map +1 -0
  60. package/dist/realtimeSession.d.ts +210 -0
  61. package/dist/realtimeSession.js +469 -0
  62. package/dist/realtimeSession.js.map +1 -0
  63. package/dist/realtimeSession.mjs +469 -0
  64. package/dist/realtimeSession.mjs.map +1 -0
  65. package/dist/realtimeSessionEvents.d.ts +118 -0
  66. package/dist/realtimeSessionEvents.js +2 -0
  67. package/dist/realtimeSessionEvents.js.map +1 -0
  68. package/dist/realtimeSessionEvents.mjs +2 -0
  69. package/dist/realtimeSessionEvents.mjs.map +1 -0
  70. package/dist/shims/shims-browser.d.ts +9 -0
  71. package/dist/shims/shims-browser.js +6 -0
  72. package/dist/shims/shims-browser.js.map +1 -0
  73. package/dist/shims/shims-browser.mjs +6 -0
  74. package/dist/shims/shims-browser.mjs.map +1 -0
  75. package/dist/shims/shims-node.d.ts +2 -0
  76. package/dist/shims/shims-node.js +5 -0
  77. package/dist/shims/shims-node.js.map +1 -0
  78. package/dist/shims/shims-node.mjs +5 -0
  79. package/dist/shims/shims-node.mjs.map +1 -0
  80. package/dist/shims/shims.d.ts +1 -0
  81. package/dist/shims/shims.js +2 -0
  82. package/dist/shims/shims.js.map +1 -0
  83. package/dist/shims/shims.mjs +2 -0
  84. package/dist/shims/shims.mjs.map +1 -0
  85. package/dist/transportLayer.d.ts +96 -0
  86. package/dist/transportLayer.js +2 -0
  87. package/dist/transportLayer.js.map +1 -0
  88. package/dist/transportLayer.mjs +2 -0
  89. package/dist/transportLayer.mjs.map +1 -0
  90. package/dist/transportLayerEvents.d.ts +99 -0
  91. package/dist/transportLayerEvents.js +2 -0
  92. package/dist/transportLayerEvents.js.map +1 -0
  93. package/dist/transportLayerEvents.mjs +2 -0
  94. package/dist/transportLayerEvents.mjs.map +1 -0
  95. package/dist/utils.d.ts +61 -0
  96. package/dist/utils.js +183 -0
  97. package/dist/utils.js.map +1 -0
  98. package/dist/utils.mjs +183 -0
  99. package/dist/utils.mjs.map +1 -0
  100. package/package.json +77 -0
@@ -0,0 +1,11 @@
1
+ (function(N,B){typeof exports=="object"&&typeof module<"u"?B(exports):typeof define=="function"&&define.amd?define(["exports"],B):(N=typeof globalThis<"u"?globalThis:N||self,B(N.OpenAIAgentsRealtime={}))})(this,function(N){"use strict";var xc=Object.defineProperty;var ya=N=>{throw TypeError(N)};var Sc=(N,B,Y)=>B in N?xc(N,B,{enumerable:!0,configurable:!0,writable:!0,value:Y}):N[B]=Y;var _=(N,B,Y)=>Sc(N,typeof B!="symbol"?B+"":B,Y),Er=(N,B,Y)=>B.has(N)||ya("Cannot "+Y);var u=(N,B,Y)=>(Er(N,B,"read from private field"),Y?Y.call(N):B.get(N)),S=(N,B,Y)=>B.has(N)?ya("Cannot add the same private member more than once"):B instanceof WeakSet?B.add(N):B.set(N,Y),v=(N,B,Y,At)=>(Er(N,B,"write to private field"),At?At.call(N,Y):B.set(N,Y),Y),$=(N,B,Y)=>(Er(N,B,"access private method"),Y);var Ut,mt,Jt,Bt,gt,te,Re,Le,Ue,Gt,de,Or,wa,It,ge,Vt,zt,qt,Wt,rt,Je,Be,st,Ht,_t,De,oe,Ge,yt,le,Yt,vt,ve,Ve,Xt,Qt,Kt,en,wt,ne,Nr,Rr,Dr,ba,jr,at,tn,pe,nn,q,rn,bt,sn,it,xt,K,an,je,ot,St,Fn,xa,L,j,on,D,Tt,kt,un,H,cn,W,Ln,Un,Sa,Jn,Ta,Pr,ka;const B={version:"0.0.1"};function Y(n){const e=atob(n),t=e.length,r=new Uint8Array(t);for(let s=0;s<t;s++)r[s]=e.charCodeAt(s);return r.buffer}function At(n){const e=String.fromCharCode(...new Uint8Array(n));return btoa(e)}function Zr(n){if(typeof n>"u"||n===null||typeof n!="object"||!("type"in n)||typeof n.type!="string"||!n.type||n.type!=="message"||!("content"in n)||!Array.isArray(n.content)||n.content.length<1)return;const e=n.content[n.content.length-1];if(!(!("type"in e)||typeof e.type!="string")){if(e.type==="text")return typeof e.text=="string"?e.text:void 0;if(e.type==="audio")return typeof e.transcript=="string"?e.transcript:void 0}}function Ia(n,e){const t=n.filter(a=>!e.some(i=>i.itemId===a.itemId)),r=e.filter(a=>!n.some(i=>i.itemId===a.itemId)),s=e.filter(a=>n.some(i=>i.itemId===a.itemId&&JSON.stringify(i)!==JSON.stringify(a)));return{removals:t,additions:r,updates:s}}function Aa(){return typeof window>"u"?!1:typeof window.RTCPeerConnection<"u"}function Mr(n){return n.role==="system"?n:n.role==="assistant"?{...n,content:n.content.map(e=>e.type==="audio"?{...e,audio:null}:e)}:n.role==="user"?{...n,content:n.content.map(e=>e.type==="input_audio"?{...e,audio:null}:e)}:n}function Ca(n,e,t){const r=!t&&e.type==="message"?Mr(e):e,s=n.findIndex(a=>a.itemId===e.itemId);if(s!==-1)return n.map((a,i)=>i===s?r:!t&&a.type==="message"?Mr(a):a);if(e.previousItemId){const a=n.findIndex(i=>i.itemId===e.previousItemId);return a!==-1?[...n.slice(0,a+1),r,...n.slice(a+1)]:[...n,r]}else return[...n,r]}const Ea={"User-Agent":`Agents/JavaScript ${B.version}`,"X-OpenAI-Agents-SDK":`openai-agents-sdk.${B.version}`},Oa=`openai-agents-sdk.${B.version}`;function Na(n){return n&&n.__esModule&&Object.prototype.hasOwnProperty.call(n,"default")?n.default:n}var dn={exports:{}},Bn,$r;function Ra(){if($r)return Bn;$r=1;var n=1e3,e=n*60,t=e*60,r=t*24,s=r*7,a=r*365.25;Bn=function(l,h){h=h||{};var f=typeof l;if(f==="string"&&l.length>0)return i(l);if(f==="number"&&isFinite(l))return h.long?c(l):o(l);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(l))};function i(l){if(l=String(l),!(l.length>100)){var h=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(l);if(h){var f=parseFloat(h[1]),b=(h[2]||"ms").toLowerCase();switch(b){case"years":case"year":case"yrs":case"yr":case"y":return f*a;case"weeks":case"week":case"w":return f*s;case"days":case"day":case"d":return f*r;case"hours":case"hour":case"hrs":case"hr":case"h":return f*t;case"minutes":case"minute":case"mins":case"min":case"m":return f*e;case"seconds":case"second":case"secs":case"sec":case"s":return f*n;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return f;default:return}}}}function o(l){var h=Math.abs(l);return h>=r?Math.round(l/r)+"d":h>=t?Math.round(l/t)+"h":h>=e?Math.round(l/e)+"m":h>=n?Math.round(l/n)+"s":l+"ms"}function c(l){var h=Math.abs(l);return h>=r?p(l,h,r,"day"):h>=t?p(l,h,t,"hour"):h>=e?p(l,h,e,"minute"):h>=n?p(l,h,n,"second"):l+" ms"}function p(l,h,f,b){var A=h>=f*1.5;return Math.round(l/f)+" "+b+(A?"s":"")}return Bn}var Gn,Fr;function Da(){if(Fr)return Gn;Fr=1;function n(e){r.debug=r,r.default=r,r.coerce=p,r.disable=o,r.enable=a,r.enabled=c,r.humanize=Ra(),r.destroy=l,Object.keys(e).forEach(h=>{r[h]=e[h]}),r.names=[],r.skips=[],r.formatters={};function t(h){let f=0;for(let b=0;b<h.length;b++)f=(f<<5)-f+h.charCodeAt(b),f|=0;return r.colors[Math.abs(f)%r.colors.length]}r.selectColor=t;function r(h){let f,b=null,A,z;function M(...J){if(!M.enabled)return;const re=M,ue=Number(new Date),Pe=ue-(f||ue);re.diff=Pe,re.prev=f,re.curr=ue,f=ue,J[0]=r.coerce(J[0]),typeof J[0]!="string"&&J.unshift("%O");let ke=0;J[0]=J[0].replace(/%([a-zA-Z%])/g,(Cr,wc)=>{if(Cr==="%%")return"%";ke++;const _a=r.formatters[wc];if(typeof _a=="function"){const bc=J[ke];Cr=_a.call(re,bc),J.splice(ke,1),ke--}return Cr}),r.formatArgs.call(re,J),(re.log||r.log).apply(re,J)}return M.namespace=h,M.useColors=r.useColors(),M.color=r.selectColor(h),M.extend=s,M.destroy=r.destroy,Object.defineProperty(M,"enabled",{enumerable:!0,configurable:!1,get:()=>b!==null?b:(A!==r.namespaces&&(A=r.namespaces,z=r.enabled(h)),z),set:J=>{b=J}}),typeof r.init=="function"&&r.init(M),M}function s(h,f){const b=r(this.namespace+(typeof f>"u"?":":f)+h);return b.log=this.log,b}function a(h){r.save(h),r.namespaces=h,r.names=[],r.skips=[];const f=(typeof h=="string"?h:"").trim().replace(" ",",").split(",").filter(Boolean);for(const b of f)b[0]==="-"?r.skips.push(b.slice(1)):r.names.push(b)}function i(h,f){let b=0,A=0,z=-1,M=0;for(;b<h.length;)if(A<f.length&&(f[A]===h[b]||f[A]==="*"))f[A]==="*"?(z=A,M=b,A++):(b++,A++);else if(z!==-1)A=z+1,M++,b=M;else return!1;for(;A<f.length&&f[A]==="*";)A++;return A===f.length}function o(){const h=[...r.names,...r.skips.map(f=>"-"+f)].join(",");return r.enable(""),h}function c(h){for(const f of r.skips)if(i(h,f))return!1;for(const f of r.names)if(i(h,f))return!0;return!1}function p(h){return h instanceof Error?h.stack||h.message:h}function l(){console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.")}return r.enable(r.load()),r}return Gn=n,Gn}var Lr;function ja(){return Lr||(Lr=1,function(n,e){e.formatArgs=r,e.save=s,e.load=a,e.useColors=t,e.storage=i(),e.destroy=(()=>{let c=!1;return()=>{c||(c=!0,console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."))}})(),e.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"];function t(){if(typeof window<"u"&&window.process&&(window.process.type==="renderer"||window.process.__nwjs))return!0;if(typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/))return!1;let c;return typeof document<"u"&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||typeof window<"u"&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||typeof navigator<"u"&&navigator.userAgent&&(c=navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/))&&parseInt(c[1],10)>=31||typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)}function r(c){if(c[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+c[0]+(this.useColors?"%c ":" ")+"+"+n.exports.humanize(this.diff),!this.useColors)return;const p="color: "+this.color;c.splice(1,0,p,"color: inherit");let l=0,h=0;c[0].replace(/%[a-zA-Z%]/g,f=>{f!=="%%"&&(l++,f==="%c"&&(h=l))}),c.splice(h,0,p)}e.log=console.debug||console.log||(()=>{});function s(c){try{c?e.storage.setItem("debug",c):e.storage.removeItem("debug")}catch{}}function a(){let c;try{c=e.storage.getItem("debug")}catch{}return!c&&typeof process<"u"&&"env"in process&&(c=process.env.DEBUG),c}function i(){try{return localStorage}catch{}}n.exports=Da()(e);const{formatters:o}=n.exports;o.j=function(c){try{return JSON.stringify(c)}catch(p){return"[UnexpectedJSONParseError]: "+p.message}}}(dn,dn.exports)),dn.exports}var Pa=ja();const Za=Na(Pa);async function Vn(n){try{return[null,await n()]}catch(e){return[e,null]}}function Ma(n,e){const t={...n};return Object.defineProperties(t,{$brand:{value:"auto-parseable-response-format",enumerable:!1},$parseRaw:{value:e,enumerable:!1}}),t}const $a=Symbol("Let zodToJsonSchema decide on which parser to use"),Ur={name:void 0,$refStrategy:"root",effectStrategy:"input",pipeStrategy:"all",dateStrategy:"format:date-time",mapStrategy:"entries",nullableStrategy:"from-target",removeAdditionalStrategy:"passthrough",definitionPath:"definitions",target:"jsonSchema7",strictUnions:!1,errorMessages:!1,markdownDescription:!1,patternStrategy:"escape",applyRegexFlags:!1,emailStrategy:"format:email",base64Strategy:"contentEncoding:base64",nameStrategy:"ref"},Fa=n=>typeof n=="string"?{...Ur,basePath:["#"],definitions:{},name:n}:{...Ur,basePath:["#"],definitions:{},...n},zn=n=>"_def"in n?n._def:n;function La(n){if(!n)return!0;for(const e in n)return!1;return!0}const Ua=n=>{const e=Fa(n),t=e.name!==void 0?[...e.basePath,e.definitionPath,e.name]:e.basePath;return{...e,currentPath:t,propertyPath:void 0,seenRefs:new Set,seen:new Map(Object.entries(e.definitions).map(([r,s])=>[zn(s),{def:zn(s),path:[...e.basePath,e.definitionPath,r],jsonSchema:void 0}]))}};function Jr(n,e,t,r){r!=null&&r.errorMessages&&t&&(n.errorMessage={...n.errorMessage,[e]:t})}function V(n,e,t,r,s){n[e]=t,Jr(n,e,r,s)}var Ct;(function(n){n.assertEqual=s=>{};function e(s){}n.assertIs=e;function t(s){throw new Error}n.assertNever=t,n.arrayToEnum=s=>{const a={};for(const i of s)a[i]=i;return a},n.getValidEnumValues=s=>{const a=n.objectKeys(s).filter(o=>typeof s[s[o]]!="number"),i={};for(const o of a)i[o]=s[o];return n.objectValues(i)},n.objectValues=s=>n.objectKeys(s).map(function(a){return s[a]}),n.objectKeys=typeof Object.keys=="function"?s=>Object.keys(s):s=>{const a=[];for(const i in s)Object.prototype.hasOwnProperty.call(s,i)&&a.push(i);return a},n.find=(s,a)=>{for(const i of s)if(a(i))return i},n.isInteger=typeof Number.isInteger=="function"?s=>Number.isInteger(s):s=>typeof s=="number"&&Number.isFinite(s)&&Math.floor(s)===s;function r(s,a=" | "){return s.map(i=>typeof i=="string"?`'${i}'`:i).join(a)}n.joinValues=r,n.jsonStringifyReplacer=(s,a)=>typeof a=="bigint"?a.toString():a})(Ct||(Ct={}));var Br;(function(n){n.mergeShapes=(e,t)=>({...e,...t})})(Br||(Br={})),Ct.arrayToEnum(["string","nan","number","integer","float","boolean","date","bigint","symbol","function","undefined","null","array","object","unknown","promise","void","never","map","set"]),Ct.arrayToEnum(["invalid_type","invalid_literal","custom","invalid_union","invalid_union_discriminator","invalid_enum_value","unrecognized_keys","invalid_arguments","invalid_return_type","invalid_date","invalid_string","too_small","too_big","invalid_intersection_types","not_multiple_of","not_finite"]);let Gr=class va extends Error{get errors(){return this.issues}constructor(e){super(),this.issues=[],this.addIssue=r=>{this.issues=[...this.issues,r]},this.addIssues=(r=[])=>{this.issues=[...this.issues,...r]};const t=new.target.prototype;Object.setPrototypeOf?Object.setPrototypeOf(this,t):this.__proto__=t,this.name="ZodError",this.issues=e}format(e){const t=e||function(a){return a.message},r={_errors:[]},s=a=>{for(const i of a.issues)if(i.code==="invalid_union")i.unionErrors.map(s);else if(i.code==="invalid_return_type")s(i.returnTypeError);else if(i.code==="invalid_arguments")s(i.argumentsError);else if(i.path.length===0)r._errors.push(t(i));else{let o=r,c=0;for(;c<i.path.length;){const p=i.path[c];c===i.path.length-1?(o[p]=o[p]||{_errors:[]},o[p]._errors.push(t(i))):o[p]=o[p]||{_errors:[]},o=o[p],c++}}};return s(this),r}static assert(e){if(!(e instanceof va))throw new Error(`Not a ZodError: ${e}`)}toString(){return this.message}get message(){return JSON.stringify(this.issues,Ct.jsonStringifyReplacer,2)}get isEmpty(){return this.issues.length===0}flatten(e=t=>t.message){const t={},r=[];for(const s of this.issues)s.path.length>0?(t[s.path[0]]=t[s.path[0]]||[],t[s.path[0]].push(e(s))):r.push(e(s));return{formErrors:r,fieldErrors:t}}get formErrors(){return this.flatten()}};Gr.create=n=>new Gr(n);var Vr;(function(n){n.errToObj=e=>typeof e=="string"?{message:e}:e||{},n.toString=e=>typeof e=="string"?e:e==null?void 0:e.message})(Vr||(Vr={}));var O;(function(n){n.ZodString="ZodString",n.ZodNumber="ZodNumber",n.ZodNaN="ZodNaN",n.ZodBigInt="ZodBigInt",n.ZodBoolean="ZodBoolean",n.ZodDate="ZodDate",n.ZodSymbol="ZodSymbol",n.ZodUndefined="ZodUndefined",n.ZodNull="ZodNull",n.ZodAny="ZodAny",n.ZodUnknown="ZodUnknown",n.ZodNever="ZodNever",n.ZodVoid="ZodVoid",n.ZodArray="ZodArray",n.ZodObject="ZodObject",n.ZodUnion="ZodUnion",n.ZodDiscriminatedUnion="ZodDiscriminatedUnion",n.ZodIntersection="ZodIntersection",n.ZodTuple="ZodTuple",n.ZodRecord="ZodRecord",n.ZodMap="ZodMap",n.ZodSet="ZodSet",n.ZodFunction="ZodFunction",n.ZodLazy="ZodLazy",n.ZodLiteral="ZodLiteral",n.ZodEnum="ZodEnum",n.ZodEffects="ZodEffects",n.ZodNativeEnum="ZodNativeEnum",n.ZodOptional="ZodOptional",n.ZodNullable="ZodNullable",n.ZodDefault="ZodDefault",n.ZodCatch="ZodCatch",n.ZodPromise="ZodPromise",n.ZodBranded="ZodBranded",n.ZodPipeline="ZodPipeline",n.ZodReadonly="ZodReadonly"})(O||(O={}));function Ja(){return{}}function Ba(n,e){var r,s;const t={type:"array"};return((s=(r=n.type)==null?void 0:r._def)==null?void 0:s.typeName)!==O.ZodAny&&(t.items=F(n.type._def,{...e,currentPath:[...e.currentPath,"items"]})),n.minLength&&V(t,"minItems",n.minLength.value,n.minLength.message,e),n.maxLength&&V(t,"maxItems",n.maxLength.value,n.maxLength.message,e),n.exactLength&&(V(t,"minItems",n.exactLength.value,n.exactLength.message,e),V(t,"maxItems",n.exactLength.value,n.exactLength.message,e)),t}function Ga(n,e){const t={type:"integer",format:"int64"};if(!n.checks)return t;for(const r of n.checks)switch(r.kind){case"min":e.target==="jsonSchema7"?r.inclusive?V(t,"minimum",r.value,r.message,e):V(t,"exclusiveMinimum",r.value,r.message,e):(r.inclusive||(t.exclusiveMinimum=!0),V(t,"minimum",r.value,r.message,e));break;case"max":e.target==="jsonSchema7"?r.inclusive?V(t,"maximum",r.value,r.message,e):V(t,"exclusiveMaximum",r.value,r.message,e):(r.inclusive||(t.exclusiveMaximum=!0),V(t,"maximum",r.value,r.message,e));break;case"multipleOf":V(t,"multipleOf",r.value,r.message,e);break}return t}function Va(){return{type:"boolean"}}function za(n,e){return F(n.type._def,e)}const qa=(n,e)=>F(n.innerType._def,e);function zr(n,e,t){const r=t??e.dateStrategy;if(Array.isArray(r))return{anyOf:r.map((s,a)=>zr(n,e,s))};switch(r){case"string":case"format:date-time":return{type:"string",format:"date-time"};case"format:date":return{type:"string",format:"date"};case"integer":return Wa(n,e)}}const Wa=(n,e)=>{const t={type:"integer",format:"unix-time"};if(e.target==="openApi3")return t;for(const r of n.checks)switch(r.kind){case"min":V(t,"minimum",r.value,r.message,e);break;case"max":V(t,"maximum",r.value,r.message,e);break}return t};function Ha(n,e){return{...F(n.innerType._def,e),default:n.defaultValue()}}function Ya(n,e,t){return e.effectStrategy==="input"?F(n.schema._def,e,t):{}}function Xa(n){return{type:"string",enum:[...n.values]}}const Qa=n=>"type"in n&&n.type==="string"?!1:"allOf"in n;function Ka(n,e){const t=[F(n.left._def,{...e,currentPath:[...e.currentPath,"allOf","0"]}),F(n.right._def,{...e,currentPath:[...e.currentPath,"allOf","1"]})].filter(a=>!!a);let r=e.target==="jsonSchema2019-09"?{unevaluatedProperties:!1}:void 0;const s=[];return t.forEach(a=>{if(Qa(a))s.push(...a.allOf),a.unevaluatedProperties===void 0&&(r=void 0);else{let i=a;if("additionalProperties"in a&&a.additionalProperties===!1){const{additionalProperties:o,...c}=a;i=c}else r=void 0;s.push(i)}}),s.length?{allOf:s,...r}:void 0}function ei(n,e){const t=typeof n.value;return t!=="bigint"&&t!=="number"&&t!=="boolean"&&t!=="string"?{type:Array.isArray(n.value)?"array":"object"}:e.target==="openApi3"?{type:t==="bigint"?"integer":t,enum:[n.value]}:{type:t==="bigint"?"integer":t,const:n.value}}let qn;const ze={cuid:/^[cC][^\s-]{8,}$/,cuid2:/^[0-9a-z]+$/,ulid:/^[0-9A-HJKMNP-TV-Z]{26}$/,email:/^(?!\.)(?!.*\.\.)([a-zA-Z0-9_'+\-\.]*)[a-zA-Z0-9_+-]@([a-zA-Z0-9][a-zA-Z0-9\-]*\.)+[a-zA-Z]{2,}$/,emoji:()=>(qn===void 0&&(qn=RegExp("^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$","u")),qn),base64:/^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/,nanoid:/^[a-zA-Z0-9_-]{21}$/};function qr(n,e){const t={type:"string"};function r(s){return e.patternStrategy==="escape"?ti(s):s}if(n.checks)for(const s of n.checks)switch(s.kind){case"min":V(t,"minLength",typeof t.minLength=="number"?Math.max(t.minLength,s.value):s.value,s.message,e);break;case"max":V(t,"maxLength",typeof t.maxLength=="number"?Math.min(t.maxLength,s.value):s.value,s.message,e);break;case"email":switch(e.emailStrategy){case"format:email":_e(t,"email",s.message,e);break;case"format:idn-email":_e(t,"idn-email",s.message,e);break;case"pattern:zod":ye(t,ze.email,s.message,e);break}break;case"url":_e(t,"uri",s.message,e);break;case"uuid":_e(t,"uuid",s.message,e);break;case"regex":ye(t,s.regex,s.message,e);break;case"cuid":ye(t,ze.cuid,s.message,e);break;case"cuid2":ye(t,ze.cuid2,s.message,e);break;case"startsWith":ye(t,RegExp(`^${r(s.value)}`),s.message,e);break;case"endsWith":ye(t,RegExp(`${r(s.value)}$`),s.message,e);break;case"datetime":_e(t,"date-time",s.message,e);break;case"date":_e(t,"date",s.message,e);break;case"time":_e(t,"time",s.message,e);break;case"duration":_e(t,"duration",s.message,e);break;case"length":V(t,"minLength",typeof t.minLength=="number"?Math.max(t.minLength,s.value):s.value,s.message,e),V(t,"maxLength",typeof t.maxLength=="number"?Math.min(t.maxLength,s.value):s.value,s.message,e);break;case"includes":{ye(t,RegExp(r(s.value)),s.message,e);break}case"ip":{s.version!=="v6"&&_e(t,"ipv4",s.message,e),s.version!=="v4"&&_e(t,"ipv6",s.message,e);break}case"emoji":ye(t,ze.emoji,s.message,e);break;case"ulid":{ye(t,ze.ulid,s.message,e);break}case"base64":{switch(e.base64Strategy){case"format:binary":{_e(t,"binary",s.message,e);break}case"contentEncoding:base64":{V(t,"contentEncoding","base64",s.message,e);break}case"pattern:zod":{ye(t,ze.base64,s.message,e);break}}break}case"nanoid":ye(t,ze.nanoid,s.message,e)}return t}const ti=n=>Array.from(n).map(e=>/[a-zA-Z0-9]/.test(e)?e:`\\${e}`).join(""),_e=(n,e,t,r)=>{var s;n.format||(s=n.anyOf)!=null&&s.some(a=>a.format)?(n.anyOf||(n.anyOf=[]),n.format&&(n.anyOf.push({format:n.format,...n.errorMessage&&r.errorMessages&&{errorMessage:{format:n.errorMessage.format}}}),delete n.format,n.errorMessage&&(delete n.errorMessage.format,Object.keys(n.errorMessage).length===0&&delete n.errorMessage)),n.anyOf.push({format:e,...t&&r.errorMessages&&{errorMessage:{format:t}}})):V(n,"format",e,t,r)},ye=(n,e,t,r)=>{var s;n.pattern||(s=n.allOf)!=null&&s.some(a=>a.pattern)?(n.allOf||(n.allOf=[]),n.pattern&&(n.allOf.push({pattern:n.pattern,...n.errorMessage&&r.errorMessages&&{errorMessage:{pattern:n.errorMessage.pattern}}}),delete n.pattern,n.errorMessage&&(delete n.errorMessage.pattern,Object.keys(n.errorMessage).length===0&&delete n.errorMessage)),n.allOf.push({pattern:Wr(e,r),...t&&r.errorMessages&&{errorMessage:{pattern:t}}})):V(n,"pattern",Wr(e,r),t,r)},Wr=(n,e)=>{var p;const t=typeof n=="function"?n():n;if(!e.applyRegexFlags||!t.flags)return t.source;const r={i:t.flags.includes("i"),m:t.flags.includes("m"),s:t.flags.includes("s")},s=r.i?t.source.toLowerCase():t.source;let a="",i=!1,o=!1,c=!1;for(let l=0;l<s.length;l++){if(i){a+=s[l],i=!1;continue}if(r.i){if(o){if(s[l].match(/[a-z]/)){c?(a+=s[l],a+=`${s[l-2]}-${s[l]}`.toUpperCase(),c=!1):s[l+1]==="-"&&((p=s[l+2])!=null&&p.match(/[a-z]/))?(a+=s[l],c=!0):a+=`${s[l]}${s[l].toUpperCase()}`;continue}}else if(s[l].match(/[a-z]/)){a+=`[${s[l]}${s[l].toUpperCase()}]`;continue}}if(r.m){if(s[l]==="^"){a+=`(^|(?<=[\r
2
+ ]))`;continue}else if(s[l]==="$"){a+=`($|(?=[\r
3
+ ]))`;continue}}if(r.s&&s[l]==="."){a+=o?`${s[l]}\r
4
+ `:`[${s[l]}\r
5
+ ]`;continue}a+=s[l],s[l]==="\\"?i=!0:o&&s[l]==="]"?o=!1:!o&&s[l]==="["&&(o=!0)}try{const l=new RegExp(a)}catch{return console.warn(`Could not convert regex pattern at ${e.currentPath.join("/")} to a flag-independent form! Falling back to the flag-ignorant source`),t.source}return a};function Hr(n,e){var r,s,a,i;if(e.target==="openApi3"&&((r=n.keyType)==null?void 0:r._def.typeName)===O.ZodEnum)return{type:"object",required:n.keyType._def.values,properties:n.keyType._def.values.reduce((o,c)=>({...o,[c]:F(n.valueType._def,{...e,currentPath:[...e.currentPath,"properties",c]})??{}}),{}),additionalProperties:!1};const t={type:"object",additionalProperties:F(n.valueType._def,{...e,currentPath:[...e.currentPath,"additionalProperties"]})??{}};if(e.target==="openApi3")return t;if(((s=n.keyType)==null?void 0:s._def.typeName)===O.ZodString&&((a=n.keyType._def.checks)!=null&&a.length)){const o=Object.entries(qr(n.keyType._def,e)).reduce((c,[p,l])=>p==="type"?c:{...c,[p]:l},{});return{...t,propertyNames:o}}else if(((i=n.keyType)==null?void 0:i._def.typeName)===O.ZodEnum)return{...t,propertyNames:{enum:n.keyType._def.values}};return t}function ni(n,e){if(e.mapStrategy==="record")return Hr(n,e);const t=F(n.keyType._def,{...e,currentPath:[...e.currentPath,"items","items","0"]})||{},r=F(n.valueType._def,{...e,currentPath:[...e.currentPath,"items","items","1"]})||{};return{type:"array",maxItems:125,items:{type:"array",items:[t,r],minItems:2,maxItems:2}}}function ri(n){const e=n.values,r=Object.keys(n.values).filter(a=>typeof e[e[a]]!="number").map(a=>e[a]),s=Array.from(new Set(r.map(a=>typeof a)));return{type:s.length===1?s[0]==="string"?"string":"number":["string","number"],enum:r}}function si(){return{not:{}}}function ai(n){return n.target==="openApi3"?{enum:["null"],nullable:!0}:{type:"null"}}const ln={ZodString:"string",ZodNumber:"number",ZodBigInt:"integer",ZodBoolean:"boolean",ZodNull:"null"};function ii(n,e){if(e.target==="openApi3")return Yr(n,e);const t=n.options instanceof Map?Array.from(n.options.values()):n.options;if(t.every(r=>r._def.typeName in ln&&(!r._def.checks||!r._def.checks.length))){const r=t.reduce((s,a)=>{const i=ln[a._def.typeName];return i&&!s.includes(i)?[...s,i]:s},[]);return{type:r.length>1?r:r[0]}}else if(t.every(r=>r._def.typeName==="ZodLiteral"&&!r.description)){const r=t.reduce((s,a)=>{const i=typeof a._def.value;switch(i){case"string":case"number":case"boolean":return[...s,i];case"bigint":return[...s,"integer"];case"object":if(a._def.value===null)return[...s,"null"];case"symbol":case"undefined":case"function":default:return s}},[]);if(r.length===t.length){const s=r.filter((a,i,o)=>o.indexOf(a)===i);return{type:s.length>1?s:s[0],enum:t.reduce((a,i)=>a.includes(i._def.value)?a:[...a,i._def.value],[])}}}else if(t.every(r=>r._def.typeName==="ZodEnum"))return{type:"string",enum:t.reduce((r,s)=>[...r,...s._def.values.filter(a=>!r.includes(a))],[])};return Yr(n,e)}const Yr=(n,e)=>{const t=(n.options instanceof Map?Array.from(n.options.values()):n.options).map((r,s)=>F(r._def,{...e,currentPath:[...e.currentPath,"anyOf",`${s}`]})).filter(r=>!!r&&(!e.strictUnions||typeof r=="object"&&Object.keys(r).length>0));return t.length?{anyOf:t}:void 0};function oi(n,e){if(["ZodString","ZodNumber","ZodBigInt","ZodBoolean","ZodNull"].includes(n.innerType._def.typeName)&&(!n.innerType._def.checks||!n.innerType._def.checks.length))return e.target==="openApi3"||e.nullableStrategy==="property"?{type:ln[n.innerType._def.typeName],nullable:!0}:{type:[ln[n.innerType._def.typeName],"null"]};if(e.target==="openApi3"){const r=F(n.innerType._def,{...e,currentPath:[...e.currentPath]});return r&&"$ref"in r?{allOf:[r],nullable:!0}:r&&{...r,nullable:!0}}const t=F(n.innerType._def,{...e,currentPath:[...e.currentPath,"anyOf","0"]});return t&&{anyOf:[t,{type:"null"}]}}function ui(n,e){const t={type:"number"};if(!n.checks)return t;for(const r of n.checks)switch(r.kind){case"int":t.type="integer",Jr(t,"type",r.message,e);break;case"min":e.target==="jsonSchema7"?r.inclusive?V(t,"minimum",r.value,r.message,e):V(t,"exclusiveMinimum",r.value,r.message,e):(r.inclusive||(t.exclusiveMinimum=!0),V(t,"minimum",r.value,r.message,e));break;case"max":e.target==="jsonSchema7"?r.inclusive?V(t,"maximum",r.value,r.message,e):V(t,"exclusiveMaximum",r.value,r.message,e):(r.inclusive||(t.exclusiveMaximum=!0),V(t,"maximum",r.value,r.message,e));break;case"multipleOf":V(t,"multipleOf",r.value,r.message,e);break}return t}function ci(n,e){return e.removeAdditionalStrategy==="strict"?n.catchall._def.typeName==="ZodNever"?n.unknownKeys!=="strict":F(n.catchall._def,{...e,currentPath:[...e.currentPath,"additionalProperties"]})??!0:n.catchall._def.typeName==="ZodNever"?n.unknownKeys==="passthrough":F(n.catchall._def,{...e,currentPath:[...e.currentPath,"additionalProperties"]})??!0}function di(n,e){const t={type:"object",...Object.entries(n.shape()).reduce((r,[s,a])=>{var c;if(a===void 0||a._def===void 0)return r;const i=[...e.currentPath,"properties",s],o=F(a._def,{...e,currentPath:i,propertyPath:i});if(o===void 0)return r;if(e.openaiStrictMode&&a.isOptional()&&!a.isNullable()&&typeof((c=a._def)==null?void 0:c.defaultValue)>"u")throw new Error(`Zod field at \`${i.join("/")}\` uses \`.optional()\` without \`.nullable()\` which is not supported by the API. See: https://platform.openai.com/docs/guides/structured-outputs?api-mode=responses#all-fields-must-be-required`);return{properties:{...r.properties,[s]:o},required:a.isOptional()&&!e.openaiStrictMode?r.required:[...r.required,s]}},{properties:{},required:[]}),additionalProperties:ci(n,e)};return t.required.length||delete t.required,t}const li=(n,e)=>{var r;if(e.currentPath.toString()===((r=e.propertyPath)==null?void 0:r.toString()))return F(n.innerType._def,e);const t=F(n.innerType._def,{...e,currentPath:[...e.currentPath,"anyOf","1"]});return t?{anyOf:[{not:{}},t]}:{}},pi=(n,e)=>{if(e.pipeStrategy==="input")return F(n.in._def,e);if(e.pipeStrategy==="output")return F(n.out._def,e);const t=F(n.in._def,{...e,currentPath:[...e.currentPath,"allOf","0"]}),r=F(n.out._def,{...e,currentPath:[...e.currentPath,"allOf",t?"1":"0"]});return{allOf:[t,r].filter(s=>s!==void 0)}};function fi(n,e){return F(n.type._def,e)}function hi(n,e){const r={type:"array",uniqueItems:!0,items:F(n.valueType._def,{...e,currentPath:[...e.currentPath,"items"]})};return n.minSize&&V(r,"minItems",n.minSize.value,n.minSize.message,e),n.maxSize&&V(r,"maxItems",n.maxSize.value,n.maxSize.message,e),r}function mi(n,e){return n.rest?{type:"array",minItems:n.items.length,items:n.items.map((t,r)=>F(t._def,{...e,currentPath:[...e.currentPath,"items",`${r}`]})).reduce((t,r)=>r===void 0?t:[...t,r],[]),additionalItems:F(n.rest._def,{...e,currentPath:[...e.currentPath,"additionalItems"]})}:{type:"array",minItems:n.items.length,maxItems:n.items.length,items:n.items.map((t,r)=>F(t._def,{...e,currentPath:[...e.currentPath,"items",`${r}`]})).reduce((t,r)=>r===void 0?t:[...t,r],[])}}function gi(){return{not:{}}}function _i(){return{}}const yi=(n,e)=>F(n.innerType._def,e);function F(n,e,t=!1){var i;const r=e.seen.get(n);if(e.override){const o=(i=e.override)==null?void 0:i.call(e,n,e,r,t);if(o!==$a)return o}if(r&&!t){const o=vi(r,e);if(o!==void 0)return"$ref"in o&&e.seenRefs.add(o.$ref),o}const s={def:n,path:e.currentPath,jsonSchema:void 0};e.seen.set(n,s);const a=bi(n,n.typeName,e,t);return a&&xi(n,e,a),s.jsonSchema=a,a}const vi=(n,e)=>{switch(e.$refStrategy){case"root":return{$ref:n.path.join("/")};case"extract-to-root":const t=n.path.slice(e.basePath.length+1).join("_");return t!==e.name&&e.nameStrategy==="duplicate-ref"&&(e.definitions[t]=n.def),{$ref:[...e.basePath,e.definitionPath,t].join("/")};case"relative":return{$ref:wi(e.currentPath,n.path)};case"none":case"seen":return n.path.length<e.currentPath.length&&n.path.every((r,s)=>e.currentPath[s]===r)?(console.warn(`Recursive reference detected at ${e.currentPath.join("/")}! Defaulting to any`),{}):e.$refStrategy==="seen"?{}:void 0}},wi=(n,e)=>{let t=0;for(;t<n.length&&t<e.length&&n[t]===e[t];t++);return[(n.length-t).toString(),...e.slice(t)].join("/")},bi=(n,e,t,r)=>{switch(e){case O.ZodString:return qr(n,t);case O.ZodNumber:return ui(n,t);case O.ZodObject:return di(n,t);case O.ZodBigInt:return Ga(n,t);case O.ZodBoolean:return Va();case O.ZodDate:return zr(n,t);case O.ZodUndefined:return gi();case O.ZodNull:return ai(t);case O.ZodArray:return Ba(n,t);case O.ZodUnion:case O.ZodDiscriminatedUnion:return ii(n,t);case O.ZodIntersection:return Ka(n,t);case O.ZodTuple:return mi(n,t);case O.ZodRecord:return Hr(n,t);case O.ZodLiteral:return ei(n,t);case O.ZodEnum:return Xa(n);case O.ZodNativeEnum:return ri(n);case O.ZodNullable:return oi(n,t);case O.ZodOptional:return li(n,t);case O.ZodMap:return ni(n,t);case O.ZodSet:return hi(n,t);case O.ZodLazy:return F(n.getter()._def,t);case O.ZodPromise:return fi(n,t);case O.ZodNaN:case O.ZodNever:return si();case O.ZodEffects:return Ya(n,t,r);case O.ZodAny:return Ja();case O.ZodUnknown:return _i();case O.ZodDefault:return Ha(n,t);case O.ZodBranded:return za(n,t);case O.ZodReadonly:return yi(n,t);case O.ZodCatch:return qa(n,t);case O.ZodPipeline:return pi(n,t);case O.ZodFunction:case O.ZodVoid:case O.ZodSymbol:return;default:return(s=>{})()}},xi=(n,e,t)=>(n.description&&(t.description=n.description,e.markdownDescription&&(t.markdownDescription=n.description)),t),Si=(n,e)=>{const t=Ua(e),r=typeof e=="string"?e:(e==null?void 0:e.nameStrategy)==="title"||e==null?void 0:e.name,s=F(n._def,r===void 0?t:{...t,currentPath:[...t.basePath,t.definitionPath,r]},!1)??{},a=typeof e=="object"&&e.name!==void 0&&e.nameStrategy==="title"?e.name:void 0;a!==void 0&&(s.title=a);const i=(()=>{if(La(t.definitions))return;const c={},p=new Set;for(let l=0;l<500;l++){const h=Object.entries(t.definitions).filter(([f])=>!p.has(f));if(h.length===0)break;for(const[f,b]of h)c[f]=F(zn(b),{...t,currentPath:[...t.basePath,t.definitionPath,f]},!0)??{},p.add(f)}return c})(),o=r===void 0?i?{...s,[t.definitionPath]:i}:s:t.nameStrategy==="duplicate-ref"?{...s,...i||t.seenRefs.size?{[t.definitionPath]:{...i,...t.seenRefs.size?{[r]:s}:void 0}}:void 0}:{$ref:[...t.$refStrategy==="relative"?[]:t.basePath,t.definitionPath,r].join("/"),[t.definitionPath]:{...i,[r]:s}};return t.target==="jsonSchema7"?o.$schema="http://json-schema.org/draft-07/schema#":t.target==="jsonSchema2019-09"&&(o.$schema="https://json-schema.org/draft/2019-09/schema#"),o};function Ti(n,{parser:e,callback:t}){const r={...n};return Object.defineProperties(r,{$brand:{value:"auto-parseable-tool",enumerable:!1},$parseRaw:{value:e,enumerable:!1},$callback:{value:t,enumerable:!1}}),r}function Xr(n,e){return Si(n,{openaiStrictMode:!0,name:e.name,nameStrategy:"duplicate-ref",$refStrategy:"extract-to-root",nullableStrategy:"property"})}function ki(n,e,t){return Ma({type:"json_schema",...t,name:e,strict:!0,schema:Xr(n,{name:e})},r=>n.parse(JSON.parse(r)))}function Ii(n){return Ti({type:"function",name:n.name,parameters:Xr(n.parameters,{name:n.name}),strict:!0},{callback:n.function,parser:e=>n.parameters.parse(JSON.parse(e))})}class Ze extends Error{constructor(t,r){super(t);_(this,"state");this.state=r}}class Ai extends Ze{}class Qr extends Ze{}class fe extends Ze{}class Q extends Ze{}class Kr extends Ze{constructor(t,r,s){super(t,s);_(this,"error");this.error=r}}class Ci extends Ze{constructor(t,r,s){super(t,s);_(this,"error");this.error=r}}class es extends Ze{constructor(t,r,s){super(t,s);_(this,"result");this.result=r}}class pn extends Ze{constructor(t,r,s){super(t,s);_(this,"result");this.result=r}}function qe(n){return typeof n=="object"&&n!==null&&"_def"in n&&typeof n._def=="object"&&n._def!==null&&"typeName"in n._def&&n._def.typeName==="ZodObject"}function Ei(n){return typeof n=="object"&&n!==null&&"input"in n&&typeof n.input=="string"}function fn(n){if(n=n.replace(/\s/g,"_"),n=n.replace(/[^a-zA-Z0-9]/g,"_"),n.length===0)throw new Error("Tool name cannot be empty");return n}function Wn(n,e){const t=r=>JSON.parse(r);if(qe(n)){const r=Ii({name:e,parameters:n,function:()=>{}});return{schema:r.parameters,parser:r.$parseRaw}}else if(typeof n=="object"&&n!==null)return{schema:n,parser:t};throw new Q("Input type is not a ZodObject or a valid JSON schema")}function ts(n){if(n==="text")return"text";if(qe(n)){const e=ki(n,"output");return{type:e.type,name:e.name,strict:e.strict||!1,schema:e.schema}}return n}let ns;function we(){return ns??(ns=new Oo),ns}function Et(){const n=we().getStore();return n!=null&&n.trace?n.trace:null}function Ot(){const n=we().getStore();return n!=null&&n.span?n.span:null}function rs(n){return async()=>{const e=Et();if(!e)throw new Error("No trace found");await e.start();const t=await n(e);return await e.end(),t}}async function Oi(n,e,t={}){const r=typeof n=="string"?he().createTrace({...t,name:n}):n;return we().run({trace:r},rs(e))}async function Ni(n,e={}){if(Et())return await n();const r=he().createTrace(e);return we().run({trace:r},rs(n))}function hn(n){const e=we().getStore();if(!e)throw new Error("No existing trace found");e.span&&(e.span.previousSpan=e.previousSpan,e.previousSpan=e.span),e.span=n,we().enterWith(e)}function Nt(){var e;const n=we().getStore();n&&(n.span=n.previousSpan,n.previousSpan=(e=n.previousSpan)==null?void 0:e.previousSpan,we().enterWith(n))}function Rt(n){const e=Ot();e&&e.setError(n)}function Ri(n){var e,t,r;return{trace:(e=n.trace)==null?void 0:e.clone(),span:(t=n.span)==null?void 0:t.clone(),previousSpan:(r=n.previousSpan)==null?void 0:r.clone()}}function Hn(n){const e=we().getStore();if(!e)throw new Error("No existing trace found");const t=Ri(e);return we().run(t,n)}class Di{async export(e){if(Is.disabled){I.debug("Tracing is disabled. Skipping export");return}for(const t of e)t.type==="trace"?console.log(`[Exporter] Export trace traceId=${t.traceId} name=${t.name}`):console.log(`[Exporter] Export span: ${JSON.stringify(t)}`)}}class ji{constructor(e,{maxQueueSize:t=1e3,maxBatchSize:r=100,scheduleDelay:s=5e3,exportTriggerRatio:a=.8}={}){S(this,de);S(this,Ut);S(this,mt);S(this,Jt);S(this,Bt);S(this,gt);S(this,te,[]);S(this,Re);S(this,Le,null);S(this,Ue,!1);S(this,Gt,new AbortController);v(this,Ut,t),v(this,mt,r),v(this,Jt,s),v(this,Bt,t*a),v(this,gt,e),v(this,Re,Ro),I.warn("BatchTraceProcessor is not supported in the browser. Traces will not be exported.")}async onTraceStart(e){await $(this,de,Or).call(this,e)}async onTraceEnd(e){}async onSpanStart(e){}async onSpanEnd(e){await $(this,de,Or).call(this,e)}async shutdown(e){for(e&&u(this,Re).setTimeout(()=>{u(this,Gt).abort()},e),I.debug("Shutting down gracefully");u(this,te).length>0;){if(I.debug(`Waiting for buffer to empty. Items left: ${u(this,te).length}`),u(this,Ue)||await $(this,de,It).call(this,!0),u(this,Gt).signal.aborted){I.debug("Timeout reached, force flushing"),await $(this,de,It).call(this,!0);break}await new Promise(t=>u(this,Re).setTimeout(t,500))}I.debug("Buffer empty. Exiting"),u(this,Re)&&u(this,Le)&&u(this,Re).clearTimeout(u(this,Le))}async forceFlush(){u(this,te).length>0&&await $(this,de,It).call(this,!0)}}Ut=new WeakMap,mt=new WeakMap,Jt=new WeakMap,Bt=new WeakMap,gt=new WeakMap,te=new WeakMap,Re=new WeakMap,Le=new WeakMap,Ue=new WeakMap,Gt=new WeakMap,de=new WeakSet,Or=async function(e){if(u(this,te).length+1>u(this,Ut)){I.error("Dropping trace because buffer is full");return}u(this,te).push(e),u(this,te).length>u(this,Bt)&&await $(this,de,It).call(this)},wa=function(){v(this,Le,u(this,Re).setTimeout(async()=>{await $(this,de,It).call(this),$(this,de,wa).call(this)},u(this,Jt))),typeof u(this,Le).unref=="function"&&u(this,Le).unref()},It=async function(e=!1){if(u(this,te).length!==0){if(I.debug(`Exporting batches. Force: ${e}. Buffer size: ${u(this,te).length}`),e||u(this,te).length<u(this,mt)){const t=[...u(this,te)];v(this,te,[]),v(this,Ue,!0),await u(this,gt).export(t),v(this,Ue,!1)}else if(u(this,te).length>0){const t=u(this,te).splice(0,u(this,mt));v(this,Ue,!0),await u(this,gt).export(t),v(this,Ue,!1)}}};class Pi{constructor(){S(this,ge,[])}addTraceProcessor(e){u(this,ge).push(e)}setProcessors(e){I.debug("Shutting down old processors");for(const t of u(this,ge))t.shutdown();v(this,ge,e)}async onTraceStart(e){for(const t of u(this,ge))await t.onTraceStart(e)}async onTraceEnd(e){for(const t of u(this,ge))await t.onTraceEnd(e)}async onSpanStart(e){for(const t of u(this,ge))await t.onSpanStart(e)}async onSpanEnd(e){for(const t of u(this,ge))await t.onSpanEnd(e)}async shutdown(e){for(const t of u(this,ge))await t.shutdown(e)}async forceFlush(){for(const e of u(this,ge))await e.forceFlush()}}ge=new WeakMap;let Yn=null,Xn=null;function Zi(){return Yn||(Yn=new Di),Yn}function ss(){return Xn||(Xn=new ji(Zi())),Xn}function as(){return new Date().toISOString()}function is(){return`trace_${Ts().replace(/-/g,"")}`}function Mi(){return`span_${Ts().replace(/-/g,"").slice(0,24)}`}function $i(n){return Object.fromEntries(Object.entries(n).filter(([e])=>!e.startsWith("_")))}const Ir=class Ir{constructor(e,t){_(this,"type","trace.span");S(this,Vt);S(this,zt);S(this,qt);S(this,Wt);S(this,rt);S(this,Je);S(this,Be);S(this,st);S(this,Ht);v(this,zt,e.traceId),v(this,qt,e.spanId??Mi()),v(this,Vt,e.data),v(this,rt,t),v(this,Wt,e.parentId??null),v(this,st,e.error??null),v(this,Je,e.startedAt??null),v(this,Be,e.endedAt??null)}get traceId(){return u(this,zt)}get spanData(){return u(this,Vt)}get spanId(){return u(this,qt)}get parentId(){return u(this,Wt)}get previousSpan(){return u(this,Ht)}set previousSpan(e){v(this,Ht,e)}start(){if(u(this,Je)){I.warn("Span already started");return}v(this,Je,as()),u(this,rt).onSpanStart(this)}end(){if(u(this,Be)){I.debug("Span already finished",this.spanData);return}v(this,Be,as()),u(this,rt).onSpanEnd(this)}setError(e){v(this,st,e)}get error(){return u(this,st)}get startedAt(){return u(this,Je)}get endedAt(){return u(this,Be)}clone(){var t;const e=new Ir({traceId:this.traceId,spanId:this.spanId,parentId:this.parentId??void 0,data:this.spanData,startedAt:u(this,Je)??void 0,endedAt:u(this,Be)??void 0,error:u(this,st)??void 0},u(this,rt));return e.previousSpan=(t=this.previousSpan)==null?void 0:t.clone(),e}toJSON(){return{object:this.type,id:this.spanId,trace_id:this.traceId,parent_id:this.parentId,started_at:this.startedAt,ended_at:this.endedAt,span_data:$i(this.spanData),error:this.error}}};Vt=new WeakMap,zt=new WeakMap,qt=new WeakMap,Wt=new WeakMap,rt=new WeakMap,Je=new WeakMap,Be=new WeakMap,st=new WeakMap,Ht=new WeakMap;let Dt=Ir;class Me extends Dt{constructor(e,t){super({traceId:"no-op",spanId:"no-op",data:e},t)}start(){}end(){}setError(){}toJSON(){return null}}const Ar=class Ar{constructor(e,t){_(this,"type","trace");_(this,"traceId");_(this,"name");_(this,"groupId",null);_(this,"metadata");S(this,_t);S(this,De);this.traceId=e.traceId??is(),this.name=e.name??"Agent workflow",this.groupId=e.groupId??null,this.metadata=e.metadata??{},v(this,_t,t??ss()),v(this,De,e.started??!1)}async start(){u(this,De)||(v(this,De,!0),await u(this,_t).onTraceStart(this))}async end(){u(this,De)&&(v(this,De,!1),await u(this,_t).onTraceEnd(this))}clone(){return new Ar({traceId:this.traceId,name:this.name,groupId:this.groupId??void 0,metadata:this.metadata,started:u(this,De)})}toJSON(){return{object:this.type,id:this.traceId,workflow_name:this.name,group_id:this.groupId,metadata:this.metadata}}};_t=new WeakMap,De=new WeakMap;let jt=Ar;class Qn extends jt{constructor(){super({})}async start(){}async end(){}toJSON(){return null}}class Fi{constructor(){S(this,oe);S(this,Ge);v(this,oe,new Pi),v(this,Ge,Is.disabled),ks().NODE_ENV==="test"&&v(this,Ge,!0)}registerProcessor(e){u(this,oe).addTraceProcessor(e)}setProcessors(e){u(this,oe).setProcessors(e)}getCurrentTrace(){return Et()}getCurrentSpan(){return Ot()}setDisabled(e){v(this,Ge,e)}createTrace(e){if(u(this,Ge))return I.debug("Tracing is disabled, Not creating trace %o",e),new Qn;const t=e.traceId??is(),r=e.name??"Agent workflow";return I.debug("Creating trace %s with name %s",t,r),new jt({...e,name:r,traceId:t},u(this,oe))}createSpan(e,t){if(u(this,Ge)||e.disabled)return I.debug("Tracing is disabled, Not creating span %o",e),new Me(e.data,u(this,oe));let r,s;if(t){if(t instanceof jt){if(t instanceof Qn)return I.debug("Parent trace is no-op, returning NoopSpan"),new Me(e.data,u(this,oe));s=t.traceId}else if(t instanceof Dt){if(t instanceof Me)return I.debug("Parent span is no-op, returning NoopSpan"),new Me(e.data,u(this,oe));r=t.spanId,s=t.traceId}}else{const a=Et(),i=Ot();if(!a)return I.error("No active trace. Make sure to start a trace with `withTrace()` first. Returning NoopSpan."),new Me(e.data,u(this,oe));if(i instanceof Me||a instanceof Qn)return I.debug(`Parent ${i} or ${a} is no-op, returning NoopSpan`),new Me(e.data,u(this,oe));s=a.traceId,i?(I.debug("Using parent span %s",i.spanId),r=i.spanId):I.debug("No parent span, using current trace %s",a.traceId)}return s?(I.debug(`Creating span ${JSON.stringify(e.data)} with id ${e.spanId??s}`),new Dt({...e,traceId:s,parentId:r},u(this,oe))):(I.error("No traceId found. Make sure to start a trace with `withTrace()` first. Returning NoopSpan."),new Me(e.data,u(this,oe)))}shutdown(e){try{I.debug("Shutting down tracing provider"),u(this,oe).shutdown(e)}catch(t){I.error("Error shutting down tracing provider %o",t)}}}oe=new WeakMap,Ge=new WeakMap;let Kn;function he(){return Kn||(Kn=new Fi),Kn}function mn(n){return async(e,...t)=>Hn(async()=>{const r=n(...t);hn(r);try{return r.start(),await e(r)}catch(s){throw r.setError({message:s.message,data:s.data}),s}finally{r.end(),Nt()}})}function os(n,e){var t;return he().createSpan({...n,data:{type:"agent",name:((t=n==null?void 0:n.data)==null?void 0:t.name)??"Agent",...n==null?void 0:n.data}},e)}function Li(n,e){var t,r;return he().createSpan({...n,data:{type:"function",input:((t=n==null?void 0:n.data)==null?void 0:t.input)??"",output:((r=n==null?void 0:n.data)==null?void 0:r.output)??"",...n==null?void 0:n.data}},e)}const us=mn(Li);function Ui(n,e){return he().createSpan({...n,data:{type:"handoff",...n==null?void 0:n.data}},e)}const Ji=mn(Ui);function Bi(n,e){return he().createSpan({...n,data:{type:"guardrail",triggered:!1,...n==null?void 0:n.data}},e)}const cs=mn(Bi);function Gi(n,e){return he().createSpan({...n,data:{type:"mcp_tools",...n==null?void 0:n.data}},e)}const Vi=mn(Gi);function zi(n){he().registerProcessor(n)}const gn=async()=>{await he().shutdown()};typeof process<"u"&&(process.on("beforeExit",gn),process.on("SIGINT",gn),process.on("SIGTERM",gn),process.on("unhandledRejection",(n,e)=>{I.error("Unhandled rejection",n,e),gn()}));function We(n){if(n==null)return String(n);if(typeof n=="string")return n;if(typeof n=="object")try{return JSON.stringify(n)}catch{return"[object with circular references]"}return String(n)}function qi(n,e){return`An error occurred while running the tool. Please try again. Error: ${e instanceof Error?e.toString():String(e)}`}function _n(n){const e=n.name?fn(n.name):fn(n.execute.name),t=typeof n.errorFunction>"u"?qi:n.errorFunction;if(!e)throw new Error("Tool name cannot be empty. Either name your function or provide a name in the options.");const r=n.strict??!0;if(!r&&qe(n.parameters))throw new Q("Strict mode is required for Zod parameters");const{parser:s,schema:a}=Wn(n.parameters,e);async function i(p,l){const[h,f]=await Vn(()=>s(l));if(h!==null)throw I.dontLogToolData?I.debug(`Invalid JSON input for tool ${e}`):I.debug(`Invalid JSON input for tool ${e}: ${l}`),new fe("Invalid JSON input for tool");I.dontLogToolData?I.debug(`Invoking tool ${e}`):I.debug(`Invoking tool ${e} with input ${l}`);const b=await n.execute(f,p),A=We(b);return I.dontLogToolData?I.debug(`Tool ${e} completed`):I.debug(`Tool ${e} returned: ${A}`),b}async function o(p,l){return i(p,l).catch(h=>{if(t){const f=Ot();return f==null||f.setError({message:"Error running tool (non-fatal)",data:{tool_name:e,error:h.toString()}}),t(p,h)}throw h})}const c=typeof n.needsApproval=="function"?n.needsApproval:async()=>typeof n.needsApproval=="boolean"?n.needsApproval:!1;return{type:"function",name:e,description:n.description,parameters:a,strict:r,invoke:o,needsApproval:c}}var Z;(function(n){n.assertEqual=s=>{};function e(s){}n.assertIs=e;function t(s){throw new Error}n.assertNever=t,n.arrayToEnum=s=>{const a={};for(const i of s)a[i]=i;return a},n.getValidEnumValues=s=>{const a=n.objectKeys(s).filter(o=>typeof s[s[o]]!="number"),i={};for(const o of a)i[o]=s[o];return n.objectValues(i)},n.objectValues=s=>n.objectKeys(s).map(function(a){return s[a]}),n.objectKeys=typeof Object.keys=="function"?s=>Object.keys(s):s=>{const a=[];for(const i in s)Object.prototype.hasOwnProperty.call(s,i)&&a.push(i);return a},n.find=(s,a)=>{for(const i of s)if(a(i))return i},n.isInteger=typeof Number.isInteger=="function"?s=>Number.isInteger(s):s=>typeof s=="number"&&Number.isFinite(s)&&Math.floor(s)===s;function r(s,a=" | "){return s.map(i=>typeof i=="string"?`'${i}'`:i).join(a)}n.joinValues=r,n.jsonStringifyReplacer=(s,a)=>typeof a=="bigint"?a.toString():a})(Z||(Z={}));var ds;(function(n){n.mergeShapes=(e,t)=>({...e,...t})})(ds||(ds={}));const x=Z.arrayToEnum(["string","nan","number","integer","float","boolean","date","bigint","symbol","function","undefined","null","array","object","unknown","promise","void","never","map","set"]),$e=n=>{switch(typeof n){case"undefined":return x.undefined;case"string":return x.string;case"number":return Number.isNaN(n)?x.nan:x.number;case"boolean":return x.boolean;case"function":return x.function;case"bigint":return x.bigint;case"symbol":return x.symbol;case"object":return Array.isArray(n)?x.array:n===null?x.null:n.then&&typeof n.then=="function"&&n.catch&&typeof n.catch=="function"?x.promise:typeof Map<"u"&&n instanceof Map?x.map:typeof Set<"u"&&n instanceof Set?x.set:typeof Date<"u"&&n instanceof Date?x.date:x.object;default:return x.unknown}},y=Z.arrayToEnum(["invalid_type","invalid_literal","custom","invalid_union","invalid_union_discriminator","invalid_enum_value","unrecognized_keys","invalid_arguments","invalid_return_type","invalid_date","invalid_string","too_small","too_big","invalid_intersection_types","not_multiple_of","not_finite"]);class Ie extends Error{get errors(){return this.issues}constructor(e){super(),this.issues=[],this.addIssue=r=>{this.issues=[...this.issues,r]},this.addIssues=(r=[])=>{this.issues=[...this.issues,...r]};const t=new.target.prototype;Object.setPrototypeOf?Object.setPrototypeOf(this,t):this.__proto__=t,this.name="ZodError",this.issues=e}format(e){const t=e||function(a){return a.message},r={_errors:[]},s=a=>{for(const i of a.issues)if(i.code==="invalid_union")i.unionErrors.map(s);else if(i.code==="invalid_return_type")s(i.returnTypeError);else if(i.code==="invalid_arguments")s(i.argumentsError);else if(i.path.length===0)r._errors.push(t(i));else{let o=r,c=0;for(;c<i.path.length;){const p=i.path[c];c===i.path.length-1?(o[p]=o[p]||{_errors:[]},o[p]._errors.push(t(i))):o[p]=o[p]||{_errors:[]},o=o[p],c++}}};return s(this),r}static assert(e){if(!(e instanceof Ie))throw new Error(`Not a ZodError: ${e}`)}toString(){return this.message}get message(){return JSON.stringify(this.issues,Z.jsonStringifyReplacer,2)}get isEmpty(){return this.issues.length===0}flatten(e=t=>t.message){const t={},r=[];for(const s of this.issues)s.path.length>0?(t[s.path[0]]=t[s.path[0]]||[],t[s.path[0]].push(e(s))):r.push(e(s));return{formErrors:r,fieldErrors:t}}get formErrors(){return this.flatten()}}Ie.create=n=>new Ie(n);const er=(n,e)=>{let t;switch(n.code){case y.invalid_type:n.received===x.undefined?t="Required":t=`Expected ${n.expected}, received ${n.received}`;break;case y.invalid_literal:t=`Invalid literal value, expected ${JSON.stringify(n.expected,Z.jsonStringifyReplacer)}`;break;case y.unrecognized_keys:t=`Unrecognized key(s) in object: ${Z.joinValues(n.keys,", ")}`;break;case y.invalid_union:t="Invalid input";break;case y.invalid_union_discriminator:t=`Invalid discriminator value. Expected ${Z.joinValues(n.options)}`;break;case y.invalid_enum_value:t=`Invalid enum value. Expected ${Z.joinValues(n.options)}, received '${n.received}'`;break;case y.invalid_arguments:t="Invalid function arguments";break;case y.invalid_return_type:t="Invalid function return type";break;case y.invalid_date:t="Invalid date";break;case y.invalid_string:typeof n.validation=="object"?"includes"in n.validation?(t=`Invalid input: must include "${n.validation.includes}"`,typeof n.validation.position=="number"&&(t=`${t} at one or more positions greater than or equal to ${n.validation.position}`)):"startsWith"in n.validation?t=`Invalid input: must start with "${n.validation.startsWith}"`:"endsWith"in n.validation?t=`Invalid input: must end with "${n.validation.endsWith}"`:Z.assertNever(n.validation):n.validation!=="regex"?t=`Invalid ${n.validation}`:t="Invalid";break;case y.too_small:n.type==="array"?t=`Array must contain ${n.exact?"exactly":n.inclusive?"at least":"more than"} ${n.minimum} element(s)`:n.type==="string"?t=`String must contain ${n.exact?"exactly":n.inclusive?"at least":"over"} ${n.minimum} character(s)`:n.type==="number"?t=`Number must be ${n.exact?"exactly equal to ":n.inclusive?"greater than or equal to ":"greater than "}${n.minimum}`:n.type==="date"?t=`Date must be ${n.exact?"exactly equal to ":n.inclusive?"greater than or equal to ":"greater than "}${new Date(Number(n.minimum))}`:t="Invalid input";break;case y.too_big:n.type==="array"?t=`Array must contain ${n.exact?"exactly":n.inclusive?"at most":"less than"} ${n.maximum} element(s)`:n.type==="string"?t=`String must contain ${n.exact?"exactly":n.inclusive?"at most":"under"} ${n.maximum} character(s)`:n.type==="number"?t=`Number must be ${n.exact?"exactly":n.inclusive?"less than or equal to":"less than"} ${n.maximum}`:n.type==="bigint"?t=`BigInt must be ${n.exact?"exactly":n.inclusive?"less than or equal to":"less than"} ${n.maximum}`:n.type==="date"?t=`Date must be ${n.exact?"exactly":n.inclusive?"smaller than or equal to":"smaller than"} ${new Date(Number(n.maximum))}`:t="Invalid input";break;case y.custom:t="Invalid input";break;case y.invalid_intersection_types:t="Intersection results could not be merged";break;case y.not_multiple_of:t=`Number must be a multiple of ${n.multipleOf}`;break;case y.not_finite:t="Number must be finite";break;default:t=e.defaultError,Z.assertNever(n)}return{message:t}};let Wi=er;function Hi(){return Wi}const Yi=n=>{const{data:e,path:t,errorMaps:r,issueData:s}=n,a=[...t,...s.path||[]],i={...s,path:a};if(s.message!==void 0)return{...s,path:a,message:s.message};let o="";const c=r.filter(p=>!!p).slice().reverse();for(const p of c)o=p(i,{data:e,defaultError:o}).message;return{...s,path:a,message:o}};function w(n,e){const t=Hi(),r=Yi({issueData:e,data:n.data,path:n.path,errorMaps:[n.common.contextualErrorMap,n.schemaErrorMap,t,t===er?void 0:er].filter(s=>!!s)});n.common.issues.push(r)}class se{constructor(){this.value="valid"}dirty(){this.value==="valid"&&(this.value="dirty")}abort(){this.value!=="aborted"&&(this.value="aborted")}static mergeArray(e,t){const r=[];for(const s of t){if(s.status==="aborted")return C;s.status==="dirty"&&e.dirty(),r.push(s.value)}return{status:e.value,value:r}}static async mergeObjectAsync(e,t){const r=[];for(const s of t){const a=await s.key,i=await s.value;r.push({key:a,value:i})}return se.mergeObjectSync(e,r)}static mergeObjectSync(e,t){const r={};for(const s of t){const{key:a,value:i}=s;if(a.status==="aborted"||i.status==="aborted")return C;a.status==="dirty"&&e.dirty(),i.status==="dirty"&&e.dirty(),a.value!=="__proto__"&&(typeof i.value<"u"||s.alwaysSet)&&(r[a.value]=i.value)}return{status:e.value,value:r}}}const C=Object.freeze({status:"aborted"}),Pt=n=>({status:"dirty",value:n}),me=n=>({status:"valid",value:n}),ls=n=>n.status==="aborted",ps=n=>n.status==="dirty",ut=n=>n.status==="valid",yn=n=>typeof Promise<"u"&&n instanceof Promise;var T;(function(n){n.errToObj=e=>typeof e=="string"?{message:e}:e||{},n.toString=e=>typeof e=="string"?e:e==null?void 0:e.message})(T||(T={}));class be{constructor(e,t,r,s){this._cachedPath=[],this.parent=e,this.data=t,this._path=r,this._key=s}get path(){return this._cachedPath.length||(Array.isArray(this._key)?this._cachedPath.push(...this._path,...this._key):this._cachedPath.push(...this._path,this._key)),this._cachedPath}}const fs=(n,e)=>{if(ut(e))return{success:!0,data:e.value};if(!n.common.issues.length)throw new Error("Validation failed but no issues detected.");return{success:!1,get error(){if(this._error)return this._error;const t=new Ie(n.common.issues);return this._error=t,this._error}}};function R(n){if(!n)return{};const{errorMap:e,invalid_type_error:t,required_error:r,description:s}=n;if(e&&(t||r))throw new Error(`Can't use "invalid_type_error" or "required_error" in conjunction with custom error map.`);return e?{errorMap:e,description:s}:{errorMap:(i,o)=>{const{message:c}=n;return i.code==="invalid_enum_value"?{message:c??o.defaultError}:typeof o.data>"u"?{message:c??r??o.defaultError}:i.code!=="invalid_type"?{message:o.defaultError}:{message:c??t??o.defaultError}},description:s}}class P{get description(){return this._def.description}_getType(e){return $e(e.data)}_getOrReturnCtx(e,t){return t||{common:e.parent.common,data:e.data,parsedType:$e(e.data),schemaErrorMap:this._def.errorMap,path:e.path,parent:e.parent}}_processInputParams(e){return{status:new se,ctx:{common:e.parent.common,data:e.data,parsedType:$e(e.data),schemaErrorMap:this._def.errorMap,path:e.path,parent:e.parent}}}_parseSync(e){const t=this._parse(e);if(yn(t))throw new Error("Synchronous parse encountered promise.");return t}_parseAsync(e){const t=this._parse(e);return Promise.resolve(t)}parse(e,t){const r=this.safeParse(e,t);if(r.success)return r.data;throw r.error}safeParse(e,t){const r={common:{issues:[],async:(t==null?void 0:t.async)??!1,contextualErrorMap:t==null?void 0:t.errorMap},path:(t==null?void 0:t.path)||[],schemaErrorMap:this._def.errorMap,parent:null,data:e,parsedType:$e(e)},s=this._parseSync({data:e,path:r.path,parent:r});return fs(r,s)}"~validate"(e){var r,s;const t={common:{issues:[],async:!!this["~standard"].async},path:[],schemaErrorMap:this._def.errorMap,parent:null,data:e,parsedType:$e(e)};if(!this["~standard"].async)try{const a=this._parseSync({data:e,path:[],parent:t});return ut(a)?{value:a.value}:{issues:t.common.issues}}catch(a){(s=(r=a==null?void 0:a.message)==null?void 0:r.toLowerCase())!=null&&s.includes("encountered")&&(this["~standard"].async=!0),t.common={issues:[],async:!0}}return this._parseAsync({data:e,path:[],parent:t}).then(a=>ut(a)?{value:a.value}:{issues:t.common.issues})}async parseAsync(e,t){const r=await this.safeParseAsync(e,t);if(r.success)return r.data;throw r.error}async safeParseAsync(e,t){const r={common:{issues:[],contextualErrorMap:t==null?void 0:t.errorMap,async:!0},path:(t==null?void 0:t.path)||[],schemaErrorMap:this._def.errorMap,parent:null,data:e,parsedType:$e(e)},s=this._parse({data:e,path:r.path,parent:r}),a=await(yn(s)?s:Promise.resolve(s));return fs(r,a)}refine(e,t){const r=s=>typeof t=="string"||typeof t>"u"?{message:t}:typeof t=="function"?t(s):t;return this._refinement((s,a)=>{const i=e(s),o=()=>a.addIssue({code:y.custom,...r(s)});return typeof Promise<"u"&&i instanceof Promise?i.then(c=>c?!0:(o(),!1)):i?!0:(o(),!1)})}refinement(e,t){return this._refinement((r,s)=>e(r)?!0:(s.addIssue(typeof t=="function"?t(r,s):t),!1))}_refinement(e){return new Xe({schema:this,typeName:E.ZodEffects,effect:{type:"refinement",refinement:e}})}superRefine(e){return this._refinement(e)}constructor(e){this.spa=this.safeParseAsync,this._def=e,this.parse=this.parse.bind(this),this.safeParse=this.safeParse.bind(this),this.parseAsync=this.parseAsync.bind(this),this.safeParseAsync=this.safeParseAsync.bind(this),this.spa=this.spa.bind(this),this.refine=this.refine.bind(this),this.refinement=this.refinement.bind(this),this.superRefine=this.superRefine.bind(this),this.optional=this.optional.bind(this),this.nullable=this.nullable.bind(this),this.nullish=this.nullish.bind(this),this.array=this.array.bind(this),this.promise=this.promise.bind(this),this.or=this.or.bind(this),this.and=this.and.bind(this),this.transform=this.transform.bind(this),this.brand=this.brand.bind(this),this.default=this.default.bind(this),this.catch=this.catch.bind(this),this.describe=this.describe.bind(this),this.pipe=this.pipe.bind(this),this.readonly=this.readonly.bind(this),this.isNullable=this.isNullable.bind(this),this.isOptional=this.isOptional.bind(this),this["~standard"]={version:1,vendor:"zod",validate:t=>this["~validate"](t)}}optional(){return Ee.create(this,this._def)}nullable(){return Qe.create(this,this._def)}nullish(){return this.nullable().optional()}array(){return xe.create(this)}promise(){return kn.create(this,this._def)}or(e){return wn.create([this,e],this._def)}and(e){return bn.create(this,e,this._def)}transform(e){return new Xe({...R(this._def),schema:this,typeName:E.ZodEffects,effect:{type:"transform",transform:e}})}default(e){const t=typeof e=="function"?e:()=>e;return new In({...R(this._def),innerType:this,defaultValue:t,typeName:E.ZodDefault})}brand(){return new xs({typeName:E.ZodBranded,type:this,...R(this._def)})}catch(e){const t=typeof e=="function"?e:()=>e;return new An({...R(this._def),innerType:this,catchValue:t,typeName:E.ZodCatch})}describe(e){const t=this.constructor;return new t({...this._def,description:e})}pipe(e){return cr.create(this,e)}readonly(){return Cn.create(this)}isOptional(){return this.safeParse(void 0).success}isNullable(){return this.safeParse(null).success}}const Xi=/^c[^\s-]{8,}$/i,Qi=/^[0-9a-z]+$/,Ki=/^[0-9A-HJKMNP-TV-Z]{26}$/i,eo=/^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/i,to=/^[a-z0-9_-]{21}$/i,no=/^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$/,ro=/^[-+]?P(?!$)(?:(?:[-+]?\d+Y)|(?:[-+]?\d+[.,]\d+Y$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:(?:[-+]?\d+W)|(?:[-+]?\d+[.,]\d+W$))?(?:(?:[-+]?\d+D)|(?:[-+]?\d+[.,]\d+D$))?(?:T(?=[\d+-])(?:(?:[-+]?\d+H)|(?:[-+]?\d+[.,]\d+H$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:[-+]?\d+(?:[.,]\d+)?S)?)??$/,so=/^(?!\.)(?!.*\.\.)([A-Z0-9_'+\-\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\-]*\.)+[A-Z]{2,}$/i,ao="^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$";let tr;const io=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/,oo=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/(3[0-2]|[12]?[0-9])$/,uo=/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/,co=/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/,lo=/^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/,po=/^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/,hs="((\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\d|30)|(02)-(0[1-9]|1\\d|2[0-8])))",fo=new RegExp(`^${hs}$`);function ms(n){let e="[0-5]\\d";n.precision?e=`${e}\\.\\d{${n.precision}}`:n.precision==null&&(e=`${e}(\\.\\d+)?`);const t=n.precision?"+":"?";return`([01]\\d|2[0-3]):[0-5]\\d(:${e})${t}`}function ho(n){return new RegExp(`^${ms(n)}$`)}function mo(n){let e=`${hs}T${ms(n)}`;const t=[];return t.push(n.local?"Z?":"Z"),n.offset&&t.push("([+-]\\d{2}:?\\d{2})"),e=`${e}(${t.join("|")})`,new RegExp(`^${e}$`)}function go(n,e){return!!((e==="v4"||!e)&&io.test(n)||(e==="v6"||!e)&&uo.test(n))}function _o(n,e){if(!no.test(n))return!1;try{const[t]=n.split("."),r=t.replace(/-/g,"+").replace(/_/g,"/").padEnd(t.length+(4-t.length%4)%4,"="),s=JSON.parse(atob(r));return!(typeof s!="object"||s===null||"typ"in s&&(s==null?void 0:s.typ)!=="JWT"||!s.alg||e&&s.alg!==e)}catch{return!1}}function yo(n,e){return!!((e==="v4"||!e)&&oo.test(n)||(e==="v6"||!e)&&co.test(n))}class Ae extends P{_parse(e){if(this._def.coerce&&(e.data=String(e.data)),this._getType(e)!==x.string){const a=this._getOrReturnCtx(e);return w(a,{code:y.invalid_type,expected:x.string,received:a.parsedType}),C}const r=new se;let s;for(const a of this._def.checks)if(a.kind==="min")e.data.length<a.value&&(s=this._getOrReturnCtx(e,s),w(s,{code:y.too_small,minimum:a.value,type:"string",inclusive:!0,exact:!1,message:a.message}),r.dirty());else if(a.kind==="max")e.data.length>a.value&&(s=this._getOrReturnCtx(e,s),w(s,{code:y.too_big,maximum:a.value,type:"string",inclusive:!0,exact:!1,message:a.message}),r.dirty());else if(a.kind==="length"){const i=e.data.length>a.value,o=e.data.length<a.value;(i||o)&&(s=this._getOrReturnCtx(e,s),i?w(s,{code:y.too_big,maximum:a.value,type:"string",inclusive:!0,exact:!0,message:a.message}):o&&w(s,{code:y.too_small,minimum:a.value,type:"string",inclusive:!0,exact:!0,message:a.message}),r.dirty())}else if(a.kind==="email")so.test(e.data)||(s=this._getOrReturnCtx(e,s),w(s,{validation:"email",code:y.invalid_string,message:a.message}),r.dirty());else if(a.kind==="emoji")tr||(tr=new RegExp(ao,"u")),tr.test(e.data)||(s=this._getOrReturnCtx(e,s),w(s,{validation:"emoji",code:y.invalid_string,message:a.message}),r.dirty());else if(a.kind==="uuid")eo.test(e.data)||(s=this._getOrReturnCtx(e,s),w(s,{validation:"uuid",code:y.invalid_string,message:a.message}),r.dirty());else if(a.kind==="nanoid")to.test(e.data)||(s=this._getOrReturnCtx(e,s),w(s,{validation:"nanoid",code:y.invalid_string,message:a.message}),r.dirty());else if(a.kind==="cuid")Xi.test(e.data)||(s=this._getOrReturnCtx(e,s),w(s,{validation:"cuid",code:y.invalid_string,message:a.message}),r.dirty());else if(a.kind==="cuid2")Qi.test(e.data)||(s=this._getOrReturnCtx(e,s),w(s,{validation:"cuid2",code:y.invalid_string,message:a.message}),r.dirty());else if(a.kind==="ulid")Ki.test(e.data)||(s=this._getOrReturnCtx(e,s),w(s,{validation:"ulid",code:y.invalid_string,message:a.message}),r.dirty());else if(a.kind==="url")try{new URL(e.data)}catch{s=this._getOrReturnCtx(e,s),w(s,{validation:"url",code:y.invalid_string,message:a.message}),r.dirty()}else a.kind==="regex"?(a.regex.lastIndex=0,a.regex.test(e.data)||(s=this._getOrReturnCtx(e,s),w(s,{validation:"regex",code:y.invalid_string,message:a.message}),r.dirty())):a.kind==="trim"?e.data=e.data.trim():a.kind==="includes"?e.data.includes(a.value,a.position)||(s=this._getOrReturnCtx(e,s),w(s,{code:y.invalid_string,validation:{includes:a.value,position:a.position},message:a.message}),r.dirty()):a.kind==="toLowerCase"?e.data=e.data.toLowerCase():a.kind==="toUpperCase"?e.data=e.data.toUpperCase():a.kind==="startsWith"?e.data.startsWith(a.value)||(s=this._getOrReturnCtx(e,s),w(s,{code:y.invalid_string,validation:{startsWith:a.value},message:a.message}),r.dirty()):a.kind==="endsWith"?e.data.endsWith(a.value)||(s=this._getOrReturnCtx(e,s),w(s,{code:y.invalid_string,validation:{endsWith:a.value},message:a.message}),r.dirty()):a.kind==="datetime"?mo(a).test(e.data)||(s=this._getOrReturnCtx(e,s),w(s,{code:y.invalid_string,validation:"datetime",message:a.message}),r.dirty()):a.kind==="date"?fo.test(e.data)||(s=this._getOrReturnCtx(e,s),w(s,{code:y.invalid_string,validation:"date",message:a.message}),r.dirty()):a.kind==="time"?ho(a).test(e.data)||(s=this._getOrReturnCtx(e,s),w(s,{code:y.invalid_string,validation:"time",message:a.message}),r.dirty()):a.kind==="duration"?ro.test(e.data)||(s=this._getOrReturnCtx(e,s),w(s,{validation:"duration",code:y.invalid_string,message:a.message}),r.dirty()):a.kind==="ip"?go(e.data,a.version)||(s=this._getOrReturnCtx(e,s),w(s,{validation:"ip",code:y.invalid_string,message:a.message}),r.dirty()):a.kind==="jwt"?_o(e.data,a.alg)||(s=this._getOrReturnCtx(e,s),w(s,{validation:"jwt",code:y.invalid_string,message:a.message}),r.dirty()):a.kind==="cidr"?yo(e.data,a.version)||(s=this._getOrReturnCtx(e,s),w(s,{validation:"cidr",code:y.invalid_string,message:a.message}),r.dirty()):a.kind==="base64"?lo.test(e.data)||(s=this._getOrReturnCtx(e,s),w(s,{validation:"base64",code:y.invalid_string,message:a.message}),r.dirty()):a.kind==="base64url"?po.test(e.data)||(s=this._getOrReturnCtx(e,s),w(s,{validation:"base64url",code:y.invalid_string,message:a.message}),r.dirty()):Z.assertNever(a);return{status:r.value,value:e.data}}_regex(e,t,r){return this.refinement(s=>e.test(s),{validation:t,code:y.invalid_string,...T.errToObj(r)})}_addCheck(e){return new Ae({...this._def,checks:[...this._def.checks,e]})}email(e){return this._addCheck({kind:"email",...T.errToObj(e)})}url(e){return this._addCheck({kind:"url",...T.errToObj(e)})}emoji(e){return this._addCheck({kind:"emoji",...T.errToObj(e)})}uuid(e){return this._addCheck({kind:"uuid",...T.errToObj(e)})}nanoid(e){return this._addCheck({kind:"nanoid",...T.errToObj(e)})}cuid(e){return this._addCheck({kind:"cuid",...T.errToObj(e)})}cuid2(e){return this._addCheck({kind:"cuid2",...T.errToObj(e)})}ulid(e){return this._addCheck({kind:"ulid",...T.errToObj(e)})}base64(e){return this._addCheck({kind:"base64",...T.errToObj(e)})}base64url(e){return this._addCheck({kind:"base64url",...T.errToObj(e)})}jwt(e){return this._addCheck({kind:"jwt",...T.errToObj(e)})}ip(e){return this._addCheck({kind:"ip",...T.errToObj(e)})}cidr(e){return this._addCheck({kind:"cidr",...T.errToObj(e)})}datetime(e){return typeof e=="string"?this._addCheck({kind:"datetime",precision:null,offset:!1,local:!1,message:e}):this._addCheck({kind:"datetime",precision:typeof(e==null?void 0:e.precision)>"u"?null:e==null?void 0:e.precision,offset:(e==null?void 0:e.offset)??!1,local:(e==null?void 0:e.local)??!1,...T.errToObj(e==null?void 0:e.message)})}date(e){return this._addCheck({kind:"date",message:e})}time(e){return typeof e=="string"?this._addCheck({kind:"time",precision:null,message:e}):this._addCheck({kind:"time",precision:typeof(e==null?void 0:e.precision)>"u"?null:e==null?void 0:e.precision,...T.errToObj(e==null?void 0:e.message)})}duration(e){return this._addCheck({kind:"duration",...T.errToObj(e)})}regex(e,t){return this._addCheck({kind:"regex",regex:e,...T.errToObj(t)})}includes(e,t){return this._addCheck({kind:"includes",value:e,position:t==null?void 0:t.position,...T.errToObj(t==null?void 0:t.message)})}startsWith(e,t){return this._addCheck({kind:"startsWith",value:e,...T.errToObj(t)})}endsWith(e,t){return this._addCheck({kind:"endsWith",value:e,...T.errToObj(t)})}min(e,t){return this._addCheck({kind:"min",value:e,...T.errToObj(t)})}max(e,t){return this._addCheck({kind:"max",value:e,...T.errToObj(t)})}length(e,t){return this._addCheck({kind:"length",value:e,...T.errToObj(t)})}nonempty(e){return this.min(1,T.errToObj(e))}trim(){return new Ae({...this._def,checks:[...this._def.checks,{kind:"trim"}]})}toLowerCase(){return new Ae({...this._def,checks:[...this._def.checks,{kind:"toLowerCase"}]})}toUpperCase(){return new Ae({...this._def,checks:[...this._def.checks,{kind:"toUpperCase"}]})}get isDatetime(){return!!this._def.checks.find(e=>e.kind==="datetime")}get isDate(){return!!this._def.checks.find(e=>e.kind==="date")}get isTime(){return!!this._def.checks.find(e=>e.kind==="time")}get isDuration(){return!!this._def.checks.find(e=>e.kind==="duration")}get isEmail(){return!!this._def.checks.find(e=>e.kind==="email")}get isURL(){return!!this._def.checks.find(e=>e.kind==="url")}get isEmoji(){return!!this._def.checks.find(e=>e.kind==="emoji")}get isUUID(){return!!this._def.checks.find(e=>e.kind==="uuid")}get isNANOID(){return!!this._def.checks.find(e=>e.kind==="nanoid")}get isCUID(){return!!this._def.checks.find(e=>e.kind==="cuid")}get isCUID2(){return!!this._def.checks.find(e=>e.kind==="cuid2")}get isULID(){return!!this._def.checks.find(e=>e.kind==="ulid")}get isIP(){return!!this._def.checks.find(e=>e.kind==="ip")}get isCIDR(){return!!this._def.checks.find(e=>e.kind==="cidr")}get isBase64(){return!!this._def.checks.find(e=>e.kind==="base64")}get isBase64url(){return!!this._def.checks.find(e=>e.kind==="base64url")}get minLength(){let e=null;for(const t of this._def.checks)t.kind==="min"&&(e===null||t.value>e)&&(e=t.value);return e}get maxLength(){let e=null;for(const t of this._def.checks)t.kind==="max"&&(e===null||t.value<e)&&(e=t.value);return e}}Ae.create=n=>new Ae({checks:[],typeName:E.ZodString,coerce:(n==null?void 0:n.coerce)??!1,...R(n)});function vo(n,e){const t=(n.toString().split(".")[1]||"").length,r=(e.toString().split(".")[1]||"").length,s=t>r?t:r,a=Number.parseInt(n.toFixed(s).replace(".","")),i=Number.parseInt(e.toFixed(s).replace(".",""));return a%i/10**s}class ct extends P{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte,this.step=this.multipleOf}_parse(e){if(this._def.coerce&&(e.data=Number(e.data)),this._getType(e)!==x.number){const a=this._getOrReturnCtx(e);return w(a,{code:y.invalid_type,expected:x.number,received:a.parsedType}),C}let r;const s=new se;for(const a of this._def.checks)a.kind==="int"?Z.isInteger(e.data)||(r=this._getOrReturnCtx(e,r),w(r,{code:y.invalid_type,expected:"integer",received:"float",message:a.message}),s.dirty()):a.kind==="min"?(a.inclusive?e.data<a.value:e.data<=a.value)&&(r=this._getOrReturnCtx(e,r),w(r,{code:y.too_small,minimum:a.value,type:"number",inclusive:a.inclusive,exact:!1,message:a.message}),s.dirty()):a.kind==="max"?(a.inclusive?e.data>a.value:e.data>=a.value)&&(r=this._getOrReturnCtx(e,r),w(r,{code:y.too_big,maximum:a.value,type:"number",inclusive:a.inclusive,exact:!1,message:a.message}),s.dirty()):a.kind==="multipleOf"?vo(e.data,a.value)!==0&&(r=this._getOrReturnCtx(e,r),w(r,{code:y.not_multiple_of,multipleOf:a.value,message:a.message}),s.dirty()):a.kind==="finite"?Number.isFinite(e.data)||(r=this._getOrReturnCtx(e,r),w(r,{code:y.not_finite,message:a.message}),s.dirty()):Z.assertNever(a);return{status:s.value,value:e.data}}gte(e,t){return this.setLimit("min",e,!0,T.toString(t))}gt(e,t){return this.setLimit("min",e,!1,T.toString(t))}lte(e,t){return this.setLimit("max",e,!0,T.toString(t))}lt(e,t){return this.setLimit("max",e,!1,T.toString(t))}setLimit(e,t,r,s){return new ct({...this._def,checks:[...this._def.checks,{kind:e,value:t,inclusive:r,message:T.toString(s)}]})}_addCheck(e){return new ct({...this._def,checks:[...this._def.checks,e]})}int(e){return this._addCheck({kind:"int",message:T.toString(e)})}positive(e){return this._addCheck({kind:"min",value:0,inclusive:!1,message:T.toString(e)})}negative(e){return this._addCheck({kind:"max",value:0,inclusive:!1,message:T.toString(e)})}nonpositive(e){return this._addCheck({kind:"max",value:0,inclusive:!0,message:T.toString(e)})}nonnegative(e){return this._addCheck({kind:"min",value:0,inclusive:!0,message:T.toString(e)})}multipleOf(e,t){return this._addCheck({kind:"multipleOf",value:e,message:T.toString(t)})}finite(e){return this._addCheck({kind:"finite",message:T.toString(e)})}safe(e){return this._addCheck({kind:"min",inclusive:!0,value:Number.MIN_SAFE_INTEGER,message:T.toString(e)})._addCheck({kind:"max",inclusive:!0,value:Number.MAX_SAFE_INTEGER,message:T.toString(e)})}get minValue(){let e=null;for(const t of this._def.checks)t.kind==="min"&&(e===null||t.value>e)&&(e=t.value);return e}get maxValue(){let e=null;for(const t of this._def.checks)t.kind==="max"&&(e===null||t.value<e)&&(e=t.value);return e}get isInt(){return!!this._def.checks.find(e=>e.kind==="int"||e.kind==="multipleOf"&&Z.isInteger(e.value))}get isFinite(){let e=null,t=null;for(const r of this._def.checks){if(r.kind==="finite"||r.kind==="int"||r.kind==="multipleOf")return!0;r.kind==="min"?(t===null||r.value>t)&&(t=r.value):r.kind==="max"&&(e===null||r.value<e)&&(e=r.value)}return Number.isFinite(t)&&Number.isFinite(e)}}ct.create=n=>new ct({checks:[],typeName:E.ZodNumber,coerce:(n==null?void 0:n.coerce)||!1,...R(n)});class Zt extends P{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte}_parse(e){if(this._def.coerce)try{e.data=BigInt(e.data)}catch{return this._getInvalidInput(e)}if(this._getType(e)!==x.bigint)return this._getInvalidInput(e);let r;const s=new se;for(const a of this._def.checks)a.kind==="min"?(a.inclusive?e.data<a.value:e.data<=a.value)&&(r=this._getOrReturnCtx(e,r),w(r,{code:y.too_small,type:"bigint",minimum:a.value,inclusive:a.inclusive,message:a.message}),s.dirty()):a.kind==="max"?(a.inclusive?e.data>a.value:e.data>=a.value)&&(r=this._getOrReturnCtx(e,r),w(r,{code:y.too_big,type:"bigint",maximum:a.value,inclusive:a.inclusive,message:a.message}),s.dirty()):a.kind==="multipleOf"?e.data%a.value!==BigInt(0)&&(r=this._getOrReturnCtx(e,r),w(r,{code:y.not_multiple_of,multipleOf:a.value,message:a.message}),s.dirty()):Z.assertNever(a);return{status:s.value,value:e.data}}_getInvalidInput(e){const t=this._getOrReturnCtx(e);return w(t,{code:y.invalid_type,expected:x.bigint,received:t.parsedType}),C}gte(e,t){return this.setLimit("min",e,!0,T.toString(t))}gt(e,t){return this.setLimit("min",e,!1,T.toString(t))}lte(e,t){return this.setLimit("max",e,!0,T.toString(t))}lt(e,t){return this.setLimit("max",e,!1,T.toString(t))}setLimit(e,t,r,s){return new Zt({...this._def,checks:[...this._def.checks,{kind:e,value:t,inclusive:r,message:T.toString(s)}]})}_addCheck(e){return new Zt({...this._def,checks:[...this._def.checks,e]})}positive(e){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!1,message:T.toString(e)})}negative(e){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!1,message:T.toString(e)})}nonpositive(e){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!0,message:T.toString(e)})}nonnegative(e){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!0,message:T.toString(e)})}multipleOf(e,t){return this._addCheck({kind:"multipleOf",value:e,message:T.toString(t)})}get minValue(){let e=null;for(const t of this._def.checks)t.kind==="min"&&(e===null||t.value>e)&&(e=t.value);return e}get maxValue(){let e=null;for(const t of this._def.checks)t.kind==="max"&&(e===null||t.value<e)&&(e=t.value);return e}}Zt.create=n=>new Zt({checks:[],typeName:E.ZodBigInt,coerce:(n==null?void 0:n.coerce)??!1,...R(n)});class nr extends P{_parse(e){if(this._def.coerce&&(e.data=!!e.data),this._getType(e)!==x.boolean){const r=this._getOrReturnCtx(e);return w(r,{code:y.invalid_type,expected:x.boolean,received:r.parsedType}),C}return me(e.data)}}nr.create=n=>new nr({typeName:E.ZodBoolean,coerce:(n==null?void 0:n.coerce)||!1,...R(n)});class vn extends P{_parse(e){if(this._def.coerce&&(e.data=new Date(e.data)),this._getType(e)!==x.date){const a=this._getOrReturnCtx(e);return w(a,{code:y.invalid_type,expected:x.date,received:a.parsedType}),C}if(Number.isNaN(e.data.getTime())){const a=this._getOrReturnCtx(e);return w(a,{code:y.invalid_date}),C}const r=new se;let s;for(const a of this._def.checks)a.kind==="min"?e.data.getTime()<a.value&&(s=this._getOrReturnCtx(e,s),w(s,{code:y.too_small,message:a.message,inclusive:!0,exact:!1,minimum:a.value,type:"date"}),r.dirty()):a.kind==="max"?e.data.getTime()>a.value&&(s=this._getOrReturnCtx(e,s),w(s,{code:y.too_big,message:a.message,inclusive:!0,exact:!1,maximum:a.value,type:"date"}),r.dirty()):Z.assertNever(a);return{status:r.value,value:new Date(e.data.getTime())}}_addCheck(e){return new vn({...this._def,checks:[...this._def.checks,e]})}min(e,t){return this._addCheck({kind:"min",value:e.getTime(),message:T.toString(t)})}max(e,t){return this._addCheck({kind:"max",value:e.getTime(),message:T.toString(t)})}get minDate(){let e=null;for(const t of this._def.checks)t.kind==="min"&&(e===null||t.value>e)&&(e=t.value);return e!=null?new Date(e):null}get maxDate(){let e=null;for(const t of this._def.checks)t.kind==="max"&&(e===null||t.value<e)&&(e=t.value);return e!=null?new Date(e):null}}vn.create=n=>new vn({checks:[],coerce:(n==null?void 0:n.coerce)||!1,typeName:E.ZodDate,...R(n)});class gs extends P{_parse(e){if(this._getType(e)!==x.symbol){const r=this._getOrReturnCtx(e);return w(r,{code:y.invalid_type,expected:x.symbol,received:r.parsedType}),C}return me(e.data)}}gs.create=n=>new gs({typeName:E.ZodSymbol,...R(n)});class rr extends P{_parse(e){if(this._getType(e)!==x.undefined){const r=this._getOrReturnCtx(e);return w(r,{code:y.invalid_type,expected:x.undefined,received:r.parsedType}),C}return me(e.data)}}rr.create=n=>new rr({typeName:E.ZodUndefined,...R(n)});class sr extends P{_parse(e){if(this._getType(e)!==x.null){const r=this._getOrReturnCtx(e);return w(r,{code:y.invalid_type,expected:x.null,received:r.parsedType}),C}return me(e.data)}}sr.create=n=>new sr({typeName:E.ZodNull,...R(n)});class ar extends P{constructor(){super(...arguments),this._any=!0}_parse(e){return me(e.data)}}ar.create=n=>new ar({typeName:E.ZodAny,...R(n)});class _s extends P{constructor(){super(...arguments),this._unknown=!0}_parse(e){return me(e.data)}}_s.create=n=>new _s({typeName:E.ZodUnknown,...R(n)});class Fe extends P{_parse(e){const t=this._getOrReturnCtx(e);return w(t,{code:y.invalid_type,expected:x.never,received:t.parsedType}),C}}Fe.create=n=>new Fe({typeName:E.ZodNever,...R(n)});class ys extends P{_parse(e){if(this._getType(e)!==x.undefined){const r=this._getOrReturnCtx(e);return w(r,{code:y.invalid_type,expected:x.void,received:r.parsedType}),C}return me(e.data)}}ys.create=n=>new ys({typeName:E.ZodVoid,...R(n)});class xe extends P{_parse(e){const{ctx:t,status:r}=this._processInputParams(e),s=this._def;if(t.parsedType!==x.array)return w(t,{code:y.invalid_type,expected:x.array,received:t.parsedType}),C;if(s.exactLength!==null){const i=t.data.length>s.exactLength.value,o=t.data.length<s.exactLength.value;(i||o)&&(w(t,{code:i?y.too_big:y.too_small,minimum:o?s.exactLength.value:void 0,maximum:i?s.exactLength.value:void 0,type:"array",inclusive:!0,exact:!0,message:s.exactLength.message}),r.dirty())}if(s.minLength!==null&&t.data.length<s.minLength.value&&(w(t,{code:y.too_small,minimum:s.minLength.value,type:"array",inclusive:!0,exact:!1,message:s.minLength.message}),r.dirty()),s.maxLength!==null&&t.data.length>s.maxLength.value&&(w(t,{code:y.too_big,maximum:s.maxLength.value,type:"array",inclusive:!0,exact:!1,message:s.maxLength.message}),r.dirty()),t.common.async)return Promise.all([...t.data].map((i,o)=>s.type._parseAsync(new be(t,i,t.path,o)))).then(i=>se.mergeArray(r,i));const a=[...t.data].map((i,o)=>s.type._parseSync(new be(t,i,t.path,o)));return se.mergeArray(r,a)}get element(){return this._def.type}min(e,t){return new xe({...this._def,minLength:{value:e,message:T.toString(t)}})}max(e,t){return new xe({...this._def,maxLength:{value:e,message:T.toString(t)}})}length(e,t){return new xe({...this._def,exactLength:{value:e,message:T.toString(t)}})}nonempty(e){return this.min(1,e)}}xe.create=(n,e)=>new xe({type:n,minLength:null,maxLength:null,exactLength:null,typeName:E.ZodArray,...R(e)});function dt(n){if(n instanceof X){const e={};for(const t in n.shape){const r=n.shape[t];e[t]=Ee.create(dt(r))}return new X({...n._def,shape:()=>e})}else return n instanceof xe?new xe({...n._def,type:dt(n.element)}):n instanceof Ee?Ee.create(dt(n.unwrap())):n instanceof Qe?Qe.create(dt(n.unwrap())):n instanceof He?He.create(n.items.map(e=>dt(e))):n}class X extends P{constructor(){super(...arguments),this._cached=null,this.nonstrict=this.passthrough,this.augment=this.extend}_getCached(){if(this._cached!==null)return this._cached;const e=this._def.shape(),t=Z.objectKeys(e);return this._cached={shape:e,keys:t},this._cached}_parse(e){if(this._getType(e)!==x.object){const p=this._getOrReturnCtx(e);return w(p,{code:y.invalid_type,expected:x.object,received:p.parsedType}),C}const{status:r,ctx:s}=this._processInputParams(e),{shape:a,keys:i}=this._getCached(),o=[];if(!(this._def.catchall instanceof Fe&&this._def.unknownKeys==="strip"))for(const p in s.data)i.includes(p)||o.push(p);const c=[];for(const p of i){const l=a[p],h=s.data[p];c.push({key:{status:"valid",value:p},value:l._parse(new be(s,h,s.path,p)),alwaysSet:p in s.data})}if(this._def.catchall instanceof Fe){const p=this._def.unknownKeys;if(p==="passthrough")for(const l of o)c.push({key:{status:"valid",value:l},value:{status:"valid",value:s.data[l]}});else if(p==="strict")o.length>0&&(w(s,{code:y.unrecognized_keys,keys:o}),r.dirty());else if(p!=="strip")throw new Error("Internal ZodObject error: invalid unknownKeys value.")}else{const p=this._def.catchall;for(const l of o){const h=s.data[l];c.push({key:{status:"valid",value:l},value:p._parse(new be(s,h,s.path,l)),alwaysSet:l in s.data})}}return s.common.async?Promise.resolve().then(async()=>{const p=[];for(const l of c){const h=await l.key,f=await l.value;p.push({key:h,value:f,alwaysSet:l.alwaysSet})}return p}).then(p=>se.mergeObjectSync(r,p)):se.mergeObjectSync(r,c)}get shape(){return this._def.shape()}strict(e){return T.errToObj,new X({...this._def,unknownKeys:"strict",...e!==void 0?{errorMap:(t,r)=>{var a,i;const s=((i=(a=this._def).errorMap)==null?void 0:i.call(a,t,r).message)??r.defaultError;return t.code==="unrecognized_keys"?{message:T.errToObj(e).message??s}:{message:s}}}:{}})}strip(){return new X({...this._def,unknownKeys:"strip"})}passthrough(){return new X({...this._def,unknownKeys:"passthrough"})}extend(e){return new X({...this._def,shape:()=>({...this._def.shape(),...e})})}merge(e){return new X({unknownKeys:e._def.unknownKeys,catchall:e._def.catchall,shape:()=>({...this._def.shape(),...e._def.shape()}),typeName:E.ZodObject})}setKey(e,t){return this.augment({[e]:t})}catchall(e){return new X({...this._def,catchall:e})}pick(e){const t={};for(const r of Z.objectKeys(e))e[r]&&this.shape[r]&&(t[r]=this.shape[r]);return new X({...this._def,shape:()=>t})}omit(e){const t={};for(const r of Z.objectKeys(this.shape))e[r]||(t[r]=this.shape[r]);return new X({...this._def,shape:()=>t})}deepPartial(){return dt(this)}partial(e){const t={};for(const r of Z.objectKeys(this.shape)){const s=this.shape[r];e&&!e[r]?t[r]=s:t[r]=s.optional()}return new X({...this._def,shape:()=>t})}required(e){const t={};for(const r of Z.objectKeys(this.shape))if(e&&!e[r])t[r]=this.shape[r];else{let a=this.shape[r];for(;a instanceof Ee;)a=a._def.innerType;t[r]=a}return new X({...this._def,shape:()=>t})}keyof(){return ws(Z.objectKeys(this.shape))}}X.create=(n,e)=>new X({shape:()=>n,unknownKeys:"strip",catchall:Fe.create(),typeName:E.ZodObject,...R(e)}),X.strictCreate=(n,e)=>new X({shape:()=>n,unknownKeys:"strict",catchall:Fe.create(),typeName:E.ZodObject,...R(e)}),X.lazycreate=(n,e)=>new X({shape:n,unknownKeys:"strip",catchall:Fe.create(),typeName:E.ZodObject,...R(e)});class wn extends P{_parse(e){const{ctx:t}=this._processInputParams(e),r=this._def.options;function s(a){for(const o of a)if(o.result.status==="valid")return o.result;for(const o of a)if(o.result.status==="dirty")return t.common.issues.push(...o.ctx.common.issues),o.result;const i=a.map(o=>new Ie(o.ctx.common.issues));return w(t,{code:y.invalid_union,unionErrors:i}),C}if(t.common.async)return Promise.all(r.map(async a=>{const i={...t,common:{...t.common,issues:[]},parent:null};return{result:await a._parseAsync({data:t.data,path:t.path,parent:i}),ctx:i}})).then(s);{let a;const i=[];for(const c of r){const p={...t,common:{...t.common,issues:[]},parent:null},l=c._parseSync({data:t.data,path:t.path,parent:p});if(l.status==="valid")return l;l.status==="dirty"&&!a&&(a={result:l,ctx:p}),p.common.issues.length&&i.push(p.common.issues)}if(a)return t.common.issues.push(...a.ctx.common.issues),a.result;const o=i.map(c=>new Ie(c));return w(t,{code:y.invalid_union,unionErrors:o}),C}}get options(){return this._def.options}}wn.create=(n,e)=>new wn({options:n,typeName:E.ZodUnion,...R(e)});const Ce=n=>n instanceof Sn?Ce(n.schema):n instanceof Xe?Ce(n.innerType()):n instanceof Tn?[n.value]:n instanceof Ye?n.options:n instanceof ur?Z.objectValues(n.enum):n instanceof In?Ce(n._def.innerType):n instanceof rr?[void 0]:n instanceof sr?[null]:n instanceof Ee?[void 0,...Ce(n.unwrap())]:n instanceof Qe?[null,...Ce(n.unwrap())]:n instanceof xs||n instanceof Cn?Ce(n.unwrap()):n instanceof An?Ce(n._def.innerType):[];class ir extends P{_parse(e){const{ctx:t}=this._processInputParams(e);if(t.parsedType!==x.object)return w(t,{code:y.invalid_type,expected:x.object,received:t.parsedType}),C;const r=this.discriminator,s=t.data[r],a=this.optionsMap.get(s);return a?t.common.async?a._parseAsync({data:t.data,path:t.path,parent:t}):a._parseSync({data:t.data,path:t.path,parent:t}):(w(t,{code:y.invalid_union_discriminator,options:Array.from(this.optionsMap.keys()),path:[r]}),C)}get discriminator(){return this._def.discriminator}get options(){return this._def.options}get optionsMap(){return this._def.optionsMap}static create(e,t,r){const s=new Map;for(const a of t){const i=Ce(a.shape[e]);if(!i.length)throw new Error(`A discriminator value for key \`${e}\` could not be extracted from all schema options`);for(const o of i){if(s.has(o))throw new Error(`Discriminator property ${String(e)} has duplicate value ${String(o)}`);s.set(o,a)}}return new ir({typeName:E.ZodDiscriminatedUnion,discriminator:e,options:t,optionsMap:s,...R(r)})}}function or(n,e){const t=$e(n),r=$e(e);if(n===e)return{valid:!0,data:n};if(t===x.object&&r===x.object){const s=Z.objectKeys(e),a=Z.objectKeys(n).filter(o=>s.indexOf(o)!==-1),i={...n,...e};for(const o of a){const c=or(n[o],e[o]);if(!c.valid)return{valid:!1};i[o]=c.data}return{valid:!0,data:i}}else if(t===x.array&&r===x.array){if(n.length!==e.length)return{valid:!1};const s=[];for(let a=0;a<n.length;a++){const i=n[a],o=e[a],c=or(i,o);if(!c.valid)return{valid:!1};s.push(c.data)}return{valid:!0,data:s}}else return t===x.date&&r===x.date&&+n==+e?{valid:!0,data:n}:{valid:!1}}class bn extends P{_parse(e){const{status:t,ctx:r}=this._processInputParams(e),s=(a,i)=>{if(ls(a)||ls(i))return C;const o=or(a.value,i.value);return o.valid?((ps(a)||ps(i))&&t.dirty(),{status:t.value,value:o.data}):(w(r,{code:y.invalid_intersection_types}),C)};return r.common.async?Promise.all([this._def.left._parseAsync({data:r.data,path:r.path,parent:r}),this._def.right._parseAsync({data:r.data,path:r.path,parent:r})]).then(([a,i])=>s(a,i)):s(this._def.left._parseSync({data:r.data,path:r.path,parent:r}),this._def.right._parseSync({data:r.data,path:r.path,parent:r}))}}bn.create=(n,e,t)=>new bn({left:n,right:e,typeName:E.ZodIntersection,...R(t)});class He extends P{_parse(e){const{status:t,ctx:r}=this._processInputParams(e);if(r.parsedType!==x.array)return w(r,{code:y.invalid_type,expected:x.array,received:r.parsedType}),C;if(r.data.length<this._def.items.length)return w(r,{code:y.too_small,minimum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),C;!this._def.rest&&r.data.length>this._def.items.length&&(w(r,{code:y.too_big,maximum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),t.dirty());const a=[...r.data].map((i,o)=>{const c=this._def.items[o]||this._def.rest;return c?c._parse(new be(r,i,r.path,o)):null}).filter(i=>!!i);return r.common.async?Promise.all(a).then(i=>se.mergeArray(t,i)):se.mergeArray(t,a)}get items(){return this._def.items}rest(e){return new He({...this._def,rest:e})}}He.create=(n,e)=>{if(!Array.isArray(n))throw new Error("You must pass an array of schemas to z.tuple([ ... ])");return new He({items:n,typeName:E.ZodTuple,rest:null,...R(e)})};class xn extends P{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(e){const{status:t,ctx:r}=this._processInputParams(e);if(r.parsedType!==x.object)return w(r,{code:y.invalid_type,expected:x.object,received:r.parsedType}),C;const s=[],a=this._def.keyType,i=this._def.valueType;for(const o in r.data)s.push({key:a._parse(new be(r,o,r.path,o)),value:i._parse(new be(r,r.data[o],r.path,o)),alwaysSet:o in r.data});return r.common.async?se.mergeObjectAsync(t,s):se.mergeObjectSync(t,s)}get element(){return this._def.valueType}static create(e,t,r){return t instanceof P?new xn({keyType:e,valueType:t,typeName:E.ZodRecord,...R(r)}):new xn({keyType:Ae.create(),valueType:e,typeName:E.ZodRecord,...R(t)})}}class vs extends P{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(e){const{status:t,ctx:r}=this._processInputParams(e);if(r.parsedType!==x.map)return w(r,{code:y.invalid_type,expected:x.map,received:r.parsedType}),C;const s=this._def.keyType,a=this._def.valueType,i=[...r.data.entries()].map(([o,c],p)=>({key:s._parse(new be(r,o,r.path,[p,"key"])),value:a._parse(new be(r,c,r.path,[p,"value"]))}));if(r.common.async){const o=new Map;return Promise.resolve().then(async()=>{for(const c of i){const p=await c.key,l=await c.value;if(p.status==="aborted"||l.status==="aborted")return C;(p.status==="dirty"||l.status==="dirty")&&t.dirty(),o.set(p.value,l.value)}return{status:t.value,value:o}})}else{const o=new Map;for(const c of i){const p=c.key,l=c.value;if(p.status==="aborted"||l.status==="aborted")return C;(p.status==="dirty"||l.status==="dirty")&&t.dirty(),o.set(p.value,l.value)}return{status:t.value,value:o}}}}vs.create=(n,e,t)=>new vs({valueType:e,keyType:n,typeName:E.ZodMap,...R(t)});class Mt extends P{_parse(e){const{status:t,ctx:r}=this._processInputParams(e);if(r.parsedType!==x.set)return w(r,{code:y.invalid_type,expected:x.set,received:r.parsedType}),C;const s=this._def;s.minSize!==null&&r.data.size<s.minSize.value&&(w(r,{code:y.too_small,minimum:s.minSize.value,type:"set",inclusive:!0,exact:!1,message:s.minSize.message}),t.dirty()),s.maxSize!==null&&r.data.size>s.maxSize.value&&(w(r,{code:y.too_big,maximum:s.maxSize.value,type:"set",inclusive:!0,exact:!1,message:s.maxSize.message}),t.dirty());const a=this._def.valueType;function i(c){const p=new Set;for(const l of c){if(l.status==="aborted")return C;l.status==="dirty"&&t.dirty(),p.add(l.value)}return{status:t.value,value:p}}const o=[...r.data.values()].map((c,p)=>a._parse(new be(r,c,r.path,p)));return r.common.async?Promise.all(o).then(c=>i(c)):i(o)}min(e,t){return new Mt({...this._def,minSize:{value:e,message:T.toString(t)}})}max(e,t){return new Mt({...this._def,maxSize:{value:e,message:T.toString(t)}})}size(e,t){return this.min(e,t).max(e,t)}nonempty(e){return this.min(1,e)}}Mt.create=(n,e)=>new Mt({valueType:n,minSize:null,maxSize:null,typeName:E.ZodSet,...R(e)});class Sn extends P{get schema(){return this._def.getter()}_parse(e){const{ctx:t}=this._processInputParams(e);return this._def.getter()._parse({data:t.data,path:t.path,parent:t})}}Sn.create=(n,e)=>new Sn({getter:n,typeName:E.ZodLazy,...R(e)});class Tn extends P{_parse(e){if(e.data!==this._def.value){const t=this._getOrReturnCtx(e);return w(t,{received:t.data,code:y.invalid_literal,expected:this._def.value}),C}return{status:"valid",value:e.data}}get value(){return this._def.value}}Tn.create=(n,e)=>new Tn({value:n,typeName:E.ZodLiteral,...R(e)});function ws(n,e){return new Ye({values:n,typeName:E.ZodEnum,...R(e)})}class Ye extends P{_parse(e){if(typeof e.data!="string"){const t=this._getOrReturnCtx(e),r=this._def.values;return w(t,{expected:Z.joinValues(r),received:t.parsedType,code:y.invalid_type}),C}if(this._cache||(this._cache=new Set(this._def.values)),!this._cache.has(e.data)){const t=this._getOrReturnCtx(e),r=this._def.values;return w(t,{received:t.data,code:y.invalid_enum_value,options:r}),C}return me(e.data)}get options(){return this._def.values}get enum(){const e={};for(const t of this._def.values)e[t]=t;return e}get Values(){const e={};for(const t of this._def.values)e[t]=t;return e}get Enum(){const e={};for(const t of this._def.values)e[t]=t;return e}extract(e,t=this._def){return Ye.create(e,{...this._def,...t})}exclude(e,t=this._def){return Ye.create(this.options.filter(r=>!e.includes(r)),{...this._def,...t})}}Ye.create=ws;class ur extends P{_parse(e){const t=Z.getValidEnumValues(this._def.values),r=this._getOrReturnCtx(e);if(r.parsedType!==x.string&&r.parsedType!==x.number){const s=Z.objectValues(t);return w(r,{expected:Z.joinValues(s),received:r.parsedType,code:y.invalid_type}),C}if(this._cache||(this._cache=new Set(Z.getValidEnumValues(this._def.values))),!this._cache.has(e.data)){const s=Z.objectValues(t);return w(r,{received:r.data,code:y.invalid_enum_value,options:s}),C}return me(e.data)}get enum(){return this._def.values}}ur.create=(n,e)=>new ur({values:n,typeName:E.ZodNativeEnum,...R(e)});class kn extends P{unwrap(){return this._def.type}_parse(e){const{ctx:t}=this._processInputParams(e);if(t.parsedType!==x.promise&&t.common.async===!1)return w(t,{code:y.invalid_type,expected:x.promise,received:t.parsedType}),C;const r=t.parsedType===x.promise?t.data:Promise.resolve(t.data);return me(r.then(s=>this._def.type.parseAsync(s,{path:t.path,errorMap:t.common.contextualErrorMap})))}}kn.create=(n,e)=>new kn({type:n,typeName:E.ZodPromise,...R(e)});class Xe extends P{innerType(){return this._def.schema}sourceType(){return this._def.schema._def.typeName===E.ZodEffects?this._def.schema.sourceType():this._def.schema}_parse(e){const{status:t,ctx:r}=this._processInputParams(e),s=this._def.effect||null,a={addIssue:i=>{w(r,i),i.fatal?t.abort():t.dirty()},get path(){return r.path}};if(a.addIssue=a.addIssue.bind(a),s.type==="preprocess"){const i=s.transform(r.data,a);if(r.common.async)return Promise.resolve(i).then(async o=>{if(t.value==="aborted")return C;const c=await this._def.schema._parseAsync({data:o,path:r.path,parent:r});return c.status==="aborted"?C:c.status==="dirty"||t.value==="dirty"?Pt(c.value):c});{if(t.value==="aborted")return C;const o=this._def.schema._parseSync({data:i,path:r.path,parent:r});return o.status==="aborted"?C:o.status==="dirty"||t.value==="dirty"?Pt(o.value):o}}if(s.type==="refinement"){const i=o=>{const c=s.refinement(o,a);if(r.common.async)return Promise.resolve(c);if(c instanceof Promise)throw new Error("Async refinement encountered during synchronous parse operation. Use .parseAsync instead.");return o};if(r.common.async===!1){const o=this._def.schema._parseSync({data:r.data,path:r.path,parent:r});return o.status==="aborted"?C:(o.status==="dirty"&&t.dirty(),i(o.value),{status:t.value,value:o.value})}else return this._def.schema._parseAsync({data:r.data,path:r.path,parent:r}).then(o=>o.status==="aborted"?C:(o.status==="dirty"&&t.dirty(),i(o.value).then(()=>({status:t.value,value:o.value}))))}if(s.type==="transform")if(r.common.async===!1){const i=this._def.schema._parseSync({data:r.data,path:r.path,parent:r});if(!ut(i))return C;const o=s.transform(i.value,a);if(o instanceof Promise)throw new Error("Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.");return{status:t.value,value:o}}else return this._def.schema._parseAsync({data:r.data,path:r.path,parent:r}).then(i=>ut(i)?Promise.resolve(s.transform(i.value,a)).then(o=>({status:t.value,value:o})):C);Z.assertNever(s)}}Xe.create=(n,e,t)=>new Xe({schema:n,typeName:E.ZodEffects,effect:e,...R(t)}),Xe.createWithPreprocess=(n,e,t)=>new Xe({schema:e,effect:{type:"preprocess",transform:n},typeName:E.ZodEffects,...R(t)});class Ee extends P{_parse(e){return this._getType(e)===x.undefined?me(void 0):this._def.innerType._parse(e)}unwrap(){return this._def.innerType}}Ee.create=(n,e)=>new Ee({innerType:n,typeName:E.ZodOptional,...R(e)});class Qe extends P{_parse(e){return this._getType(e)===x.null?me(null):this._def.innerType._parse(e)}unwrap(){return this._def.innerType}}Qe.create=(n,e)=>new Qe({innerType:n,typeName:E.ZodNullable,...R(e)});class In extends P{_parse(e){const{ctx:t}=this._processInputParams(e);let r=t.data;return t.parsedType===x.undefined&&(r=this._def.defaultValue()),this._def.innerType._parse({data:r,path:t.path,parent:t})}removeDefault(){return this._def.innerType}}In.create=(n,e)=>new In({innerType:n,typeName:E.ZodDefault,defaultValue:typeof e.default=="function"?e.default:()=>e.default,...R(e)});class An extends P{_parse(e){const{ctx:t}=this._processInputParams(e),r={...t,common:{...t.common,issues:[]}},s=this._def.innerType._parse({data:r.data,path:r.path,parent:{...r}});return yn(s)?s.then(a=>({status:"valid",value:a.status==="valid"?a.value:this._def.catchValue({get error(){return new Ie(r.common.issues)},input:r.data})})):{status:"valid",value:s.status==="valid"?s.value:this._def.catchValue({get error(){return new Ie(r.common.issues)},input:r.data})}}removeCatch(){return this._def.innerType}}An.create=(n,e)=>new An({innerType:n,typeName:E.ZodCatch,catchValue:typeof e.catch=="function"?e.catch:()=>e.catch,...R(e)});class bs extends P{_parse(e){if(this._getType(e)!==x.nan){const r=this._getOrReturnCtx(e);return w(r,{code:y.invalid_type,expected:x.nan,received:r.parsedType}),C}return{status:"valid",value:e.data}}}bs.create=n=>new bs({typeName:E.ZodNaN,...R(n)});class xs extends P{_parse(e){const{ctx:t}=this._processInputParams(e),r=t.data;return this._def.type._parse({data:r,path:t.path,parent:t})}unwrap(){return this._def.type}}class cr extends P{_parse(e){const{status:t,ctx:r}=this._processInputParams(e);if(r.common.async)return(async()=>{const a=await this._def.in._parseAsync({data:r.data,path:r.path,parent:r});return a.status==="aborted"?C:a.status==="dirty"?(t.dirty(),Pt(a.value)):this._def.out._parseAsync({data:a.value,path:r.path,parent:r})})();{const s=this._def.in._parseSync({data:r.data,path:r.path,parent:r});return s.status==="aborted"?C:s.status==="dirty"?(t.dirty(),{status:"dirty",value:s.value}):this._def.out._parseSync({data:s.value,path:r.path,parent:r})}}static create(e,t){return new cr({in:e,out:t,typeName:E.ZodPipeline})}}class Cn extends P{_parse(e){const t=this._def.innerType._parse(e),r=s=>(ut(s)&&(s.value=Object.freeze(s.value)),s);return yn(t)?t.then(s=>r(s)):r(t)}unwrap(){return this._def.innerType}}Cn.create=(n,e)=>new Cn({innerType:n,typeName:E.ZodReadonly,...R(e)});var E;(function(n){n.ZodString="ZodString",n.ZodNumber="ZodNumber",n.ZodNaN="ZodNaN",n.ZodBigInt="ZodBigInt",n.ZodBoolean="ZodBoolean",n.ZodDate="ZodDate",n.ZodSymbol="ZodSymbol",n.ZodUndefined="ZodUndefined",n.ZodNull="ZodNull",n.ZodAny="ZodAny",n.ZodUnknown="ZodUnknown",n.ZodNever="ZodNever",n.ZodVoid="ZodVoid",n.ZodArray="ZodArray",n.ZodObject="ZodObject",n.ZodUnion="ZodUnion",n.ZodDiscriminatedUnion="ZodDiscriminatedUnion",n.ZodIntersection="ZodIntersection",n.ZodTuple="ZodTuple",n.ZodRecord="ZodRecord",n.ZodMap="ZodMap",n.ZodSet="ZodSet",n.ZodFunction="ZodFunction",n.ZodLazy="ZodLazy",n.ZodLiteral="ZodLiteral",n.ZodEnum="ZodEnum",n.ZodEffects="ZodEffects",n.ZodNativeEnum="ZodNativeEnum",n.ZodOptional="ZodOptional",n.ZodNullable="ZodNullable",n.ZodDefault="ZodDefault",n.ZodCatch="ZodCatch",n.ZodPromise="ZodPromise",n.ZodBranded="ZodBranded",n.ZodPipeline="ZodPipeline",n.ZodReadonly="ZodReadonly"})(E||(E={}));const d=Ae.create,k=ct.create,lt=nr.create,U=ar.create;Fe.create;const G=xe.create,g=X.create,Ss=wn.create,ce=ir.create;bn.create,He.create;const ae=xn.create,wo=Sn.create,m=Tn.create,ie=Ye.create;kn.create,Ee.create,Qe.create,g({name:d(),description:d().optional(),inputSchema:g({type:m("object"),properties:ae(d(),U()),required:G(d()),additionalProperties:lt()})});async function bo(n,e=!1){const t=[],r=new Set;for(const s of n){const a=await xo(s,e),o=[...new Set(a.map(c=>c.name))].filter(c=>r.has(c));if(o.length>0)throw new Q(`Duplicate tool names found across MCP servers: ${o.join(", ")}`);for(const c of a)r.add(c.name),t.push(c)}return t}const dr={};async function xo(n,e){return n.cacheToolsList&&dr[n.name]?dr[n.name]:Vi(async t=>{const r=await n.listTools();t.spanData.result=r.map(a=>a.name);const s=r.map(a=>To(a,n,e));return n.cacheToolsList&&(dr[n.name]=s),s},{data:{server:n.name}})}async function So(n,e=!1){return bo(n,e)}function To(n,e,t){var i,o,c,p;async function r(l,h){let f={};typeof l=="string"&&l?f=JSON.parse(l):typeof l=="object"&&l!=null&&(f=l);const b=Ot();b&&(b.spanData.mcp_data={server:e.name});const A=await e.callTool(n.name,f);return A.length===1?A[0]:A}const s={type:((i=n.inputSchema)==null?void 0:i.type)??"object",properties:((o=n.inputSchema)==null?void 0:o.properties)??{},required:((c=n.inputSchema)==null?void 0:c.required)??[],additionalProperties:((p=n.inputSchema)==null?void 0:p.additionalProperties)??!1};if(t||s.additionalProperties===!0)try{const l=ko(s);return _n({name:n.name,description:n.description||"",parameters:l,strict:!0,execute:r})}catch(l){I.warn(`Error converting MCP schema to strict mode: ${l}`)}const a={...s,additionalProperties:!0};return _n({name:n.name,description:n.description||"",parameters:a,strict:!1,execute:r})}function ko(n){const e={...n,additionalProperties:!1};return e.required||(e.required=[]),e}function Io(){return{}}class En{constructor(){S(this,yt,new EventTarget)}on(e,t){return u(this,yt).addEventListener(e,r=>t(...r.detail??[])),this}off(e,t){return u(this,yt).removeEventListener(e,r=>t(...r.detail??[])),this}emit(e,...t){const r=new CustomEvent(e,{detail:t});return u(this,yt).dispatchEvent(r)}once(e,t){const r=(...s)=>{this.off(e,r),t(...s)};return this.on(e,r),this}}yt=new WeakMap;const Ts=crypto.randomUUID,Ao=class{constructor(){}pipeTo(e,t){}pipeThrough(e,t){}},Co=globalThis.ReadableStream,Eo=globalThis.TransformStream;class Oo{constructor(){}run(){}getStore(){}enterWith(){}}class No{constructor(){}setTimeout(e,t){const r=setTimeout(e,t);return r.ref=typeof r.ref=="function"?r.ref:()=>r,r.unref=typeof r.unref=="function"?r.unref:()=>r,r.hasRef=typeof r.hasRef=="function"?r.hasRef:()=>!0,r.refresh=typeof r.refresh=="function"?r.refresh:()=>r,r}clearTimeout(e){window.clearTimeout(e)}}const Ro=new No;function ks(){return Io()}function lr(n){const e=ks();return typeof e<"u"&&(e[n]==="true"||e[n]==="1")}const Is={get disabled(){return lr("OPENAI_AGENTS_DISABLE_TRACING")}},As={get dontLogModelData(){return lr("OPENAI_AGENTS_DONT_LOG_MODEL_DATA")},get dontLogToolData(){return lr("OPENAI_AGENTS_DONT_LOG_TOOL_DATA")}},Do=As.dontLogModelData,jo=As.dontLogToolData;function Cs(n="openai-agents"){return{namespace:n,debug:Za(n),error:console.error,warn:console.warn,dontLogModelData:Do,dontLogToolData:jo}}const I=Cs("openai-agents:core");class pr{on(e,t){return this.eventEmitter.on(e,t),this.eventEmitter}off(e,t){return this.eventEmitter.off(e,t),this.eventEmitter}emit(e,...t){return this.eventEmitter.emit(e,...t)}once(e,t){return this.eventEmitter.once(e,t),this.eventEmitter}}class Po extends pr{constructor(){super(...arguments);_(this,"eventEmitter",new En)}}class Zo extends pr{constructor(){super(...arguments);_(this,"eventEmitter",new En)}}function Es({name:n,execute:e}){return{type:"input",name:n,guardrailFunction:e,async run(t){return{guardrail:{type:"input",name:n},output:await e(t)}}}}function fr({name:n,execute:e}){return{type:"output",name:n,guardrailFunction:e,async run(t){return{guardrail:{type:"output",name:n},agent:t.agent,agentOutput:t.agentOutput,output:await e(t)}}}}function Os(n){return`{'assistant': '${n.name}'}`}function Mo(n){return`transfer_to_${fn(n.name)}`}function $o(n){return`Handoff to the ${n.name} agent to handle the request. ${n.handoffDescription??""}`}class Ns{constructor(e,t){_(this,"toolName");_(this,"toolDescription");_(this,"inputJsonSchema",{type:"object",properties:{},required:[],additionalProperties:!1});_(this,"strictJsonSchema",!0);_(this,"onInvokeHandoff");_(this,"agentName");_(this,"inputFilter");_(this,"agent");this.agentName=e.name,this.onInvokeHandoff=t,this.toolName=Mo(e),this.toolDescription=$o(e),this.agent=e}getHandoffAsFunctionTool(){return{type:"function",name:this.toolName,description:this.toolDescription,parameters:this.inputJsonSchema,strict:this.strictJsonSchema}}}function Rs(n,e={}){let t;const r=!!e.onHandoff,s=!!e.inputType;if(!(r===s))throw new Q("You must provide either both `onHandoff` and `inputType` or neither.");async function i(c,p){var l;if(t){if(!p)throw Rt({message:`Handoff function expected non empty input but got: ${p}`,data:{details:"input is empty"}}),new fe("Handoff function expected non empty input");try{const h=await t(p);e.onHandoff&&await e.onHandoff(c,h)}catch(h){throw Rt({message:"Invalid JSON provided",data:{}}),I.dontLogToolData||I.error(`Invalid JSON when parsing: ${p}. Error: ${h}`),new fe("Invalid JSON provided")}}else await((l=e.onHandoff)==null?void 0:l.call(e,c));return n}const o=new Ns(n,i);if(e.inputType){const c=Wn(e.inputType,o.toolName);o.inputJsonSchema=c.schema,o.strictJsonSchema=!0,t=c.parser}return e.toolNameOverride&&(o.toolName=e.toolNameOverride),e.toolDescriptionOverride&&(o.toolDescription=e.toolDescriptionOverride),e.inputFilter&&(o.inputFilter=e.inputFilter),o}function On(n){return n instanceof Ns?n:Rs(n)}function Fo(){throw new Error("No default model provider set. Make sure to set a provider using setDefaultModelProvider before calling getDefaultModelProvider or pass an explicit provider.")}const ee=g({providerData:ae(d(),U()).optional()}),Ke=ee.extend({id:d().optional()}),Lo=ee.extend({type:m("refusal"),refusal:d()}),Uo=ee.extend({type:m("output_text"),text:d()}),hr=ee.extend({type:m("input_text"),text:d()}),Jo=ee.extend({type:m("input_image"),image:d().or(g({id:d()})).describe("Could be a URL, base64 or an object with a file ID.")}),Bo=ee.extend({type:m("input_file"),file:d().or(g({id:d()})).describe("Contents of the file or an object with a file ID.")}),Ds=ee.extend({type:m("audio"),audio:d().or(g({id:d()})).describe("Base64 encoded audio data or file id"),format:d().nullable().optional(),transcript:d().nullable().optional()}),Go=ee.extend({type:m("image"),image:d().describe("Base64 encoded image data")}),Vo=ee.extend({type:m("text"),text:d()}),zo=ee.extend({type:m("image"),data:d().describe("Base64 encoded image data"),mediaType:d().describe("IANA media type of the image")}),qo=ee.extend({type:m("computer_screenshot"),data:d().describe("Base64 encoded image data or URL")}),Wo=ce("type",[g({type:m("screenshot")}),g({type:m("click"),x:k(),y:k(),button:ie(["left","right","wheel","back","forward"])}),g({type:m("double_click"),x:k(),y:k()}),g({type:m("scroll"),x:k(),y:k(),scroll_x:k(),scroll_y:k()}),g({type:m("type"),text:d()}),g({type:m("wait")}),g({type:m("move"),x:k(),y:k()}),g({type:m("keypress"),keys:G(d())}),g({type:m("drag"),path:G(g({x:k(),y:k()}))})]),Ho=ce("type",[Uo,Lo,hr,Ds,Go]),mr=Ke.extend({type:m("message").optional()}),Nn=mr.extend({role:m("assistant"),status:ie(["in_progress","completed","incomplete"]),content:G(Ho)}),Yo=ce("type",[hr,Jo,Bo,Ds]),js=mr.extend({role:m("user"),content:G(Yo).or(d())}),Ps=mr.extend({role:m("system"),content:d()});ce("role",[Ps,Nn,js]);const Rn=Ke.extend({type:m("hosted_tool_call"),name:d().describe("The name of the hosted tool"),status:d().optional(),output:d().optional()}),$t=Ke.extend({type:m("function_call"),callId:d().describe("The ID of the tool call"),name:d().describe("The name of the function"),status:ie(["in_progress","completed","incomplete"]).optional(),arguments:d()}),gr=Ke.extend({type:m("function_call_result"),name:d().describe("The name of the tool"),callId:d().describe("The ID of the tool call"),status:ie(["in_progress","completed","incomplete"]),output:ce("type",[Vo,zo])}),_r=Ke.extend({type:m("computer_call"),callId:d().describe("The ID of the computer call"),status:ie(["in_progress","completed","incomplete"]),action:Wo}),Xo=Ke.extend({type:m("computer_call_result"),callId:d().describe("The ID of the computer call"),output:qo}),Qo=ce("type",[_r,$t,Rn]),yr=ee.extend({id:d().optional(),type:m("reasoning"),content:G(hr)}),Zs=Ke.extend({type:m("unknown")}),vr=ce("type",[Nn,Rn,$t,_r,yr,Zs]),Ko=Ss([js,Nn,Ps,Rn,$t,_r,gr,Xo,yr,Zs]),eu=g({requests:k().optional(),inputTokens:k(),outputTokens:k(),totalTokens:k(),inputTokensDetails:ae(d(),k()).optional(),outputTokensDetails:ae(d(),k()).optional()}),Ms=ee.extend({type:m("output_text_delta"),delta:d()}),tu=ee.extend({type:m("response_started")}),$s=ee.extend({type:m("response_done"),response:ee.extend({id:d(),usage:eu,output:G(vr)})}),nu=ee.extend({type:m("model"),event:U().describe("The event from the model")});ce("type",[Ms,$s,tu,nu]);class Dn{constructor(e){_(this,"requests");_(this,"inputTokens");_(this,"outputTokens");_(this,"totalTokens");_(this,"inputTokensDetails",[]);_(this,"outputTokensDetails",[]);typeof e>"u"?(this.requests=0,this.inputTokens=0,this.outputTokens=0,this.totalTokens=0,this.inputTokensDetails=[],this.outputTokensDetails=[]):(this.requests=(e==null?void 0:e.requests)??1,this.inputTokens=(e==null?void 0:e.inputTokens)??0,this.outputTokens=(e==null?void 0:e.outputTokens)??0,this.totalTokens=(e==null?void 0:e.totalTokens)??0,this.inputTokensDetails=e!=null&&e.inputTokensDetails?[e.inputTokensDetails]:[],this.outputTokensDetails=e!=null&&e.outputTokensDetails?[e.outputTokensDetails]:[])}add(e){this.requests+=e.requests,this.inputTokens+=e.inputTokens,this.outputTokens+=e.outputTokens,this.totalTokens+=e.totalTokens,this.inputTokensDetails.push(...e.inputTokensDetails),this.outputTokensDetails.push(...e.outputTokensDetails)}}class pt{constructor(e={}){_(this,"context");_(this,"usage");S(this,le);this.context=e,this.usage=new Dn,v(this,le,new Map)}_rebuildApprovals(e){v(this,le,new Map(Object.entries(e)))}isToolApproved({toolName:e,callId:t}){const r=u(this,le).get(e);if((r==null?void 0:r.approved)===!0&&r.rejected===!0)return I.warn("Tool is permanently approved and rejected at the same time. Approval takes precedence"),!0;if((r==null?void 0:r.approved)===!0)return!0;if((r==null?void 0:r.rejected)===!0)return!1;const s=Array.isArray(r==null?void 0:r.approved)?r.approved.includes(t):!1,a=Array.isArray(r==null?void 0:r.rejected)?r.rejected.includes(t):!1;if(s&&a)return I.warn(`Tool call ${t} is both approved and rejected at the same time. Approval takes precedence`),!0;if(s)return!0;if(a)return!1}approveTool(e,{alwaysApprove:t=!1}={}){const r=e.rawItem.name;if(t){u(this,le).set(r,{approved:!0,rejected:[]});return}const s=u(this,le).get(r)??{approved:[],rejected:[]};Array.isArray(s.approved)&&s.approved.push(e.rawItem.callId),u(this,le).set(r,s)}rejectTool(e,{alwaysReject:t=!1}={}){const r=e.rawItem.name;if(t){u(this,le).set(r,{approved:!1,rejected:!0});return}const s=u(this,le).get(r)??{approved:[],rejected:[]};Array.isArray(s.rejected)&&s.rejected.push(e.rawItem.callId),u(this,le).set(r,s)}toJSON(){return{context:this.context,usage:this.usage,approvals:Object.fromEntries(u(this,le).entries())}}}le=new WeakMap;class Fs{constructor(e){_(this,"state");this.state=e}get history(){return Mn(this.input,this.newItems)}get output(){return Mn([],this.newItems)}get input(){return this.state._originalInput}get newItems(){return this.state._generatedItems}get rawResponses(){return this.state._modelResponses}get lastResponseId(){const e=this.rawResponses;return e&&e.length>0?e[e.length-1].responseId:void 0}get lastAgent(){return this.state._currentAgent}get inputGuardrailResults(){return this.state._inputGuardrailResults}get outputGuardrailResults(){return this.state._outputGuardrailResults}get interruptions(){var e;return((e=this.state._currentStep)==null?void 0:e.type)==="next_step_interruption"?this.state._currentStep.data.interruptions:[]}get finalOutput(){var e;if(((e=this.state._currentStep)==null?void 0:e.type)==="next_step_final_output")return this.state._currentAgent.processFinalOutput(this.state._currentStep.output);I.warn("Accessed finalOutput before agent run is completed.")}}class Ls extends Fs{constructor(e){super(e)}}class ru extends Fs{constructor(t={}){super(t.state);_(this,"currentTurn",0);_(this,"maxTurns");S(this,Yt,null);S(this,vt);S(this,ve);S(this,Ve);S(this,Xt);S(this,Qt);S(this,Kt);S(this,en,!1);v(this,vt,t.signal),u(this,vt)&&u(this,vt).addEventListener("abort",async()=>{await u(this,Ve).cancel()}),v(this,Ve,new Co({start:r=>{v(this,ve,r)},cancel:()=>{v(this,en,!0)}})),v(this,Xt,new Promise((r,s)=>{v(this,Qt,r),v(this,Kt,s)}))}get currentAgent(){return this.lastAgent}_addItem(t){var r;this.cancelled||(r=u(this,ve))==null||r.enqueue(t)}_done(){var t;!this.cancelled&&u(this,ve)&&(u(this,ve).close(),v(this,ve,void 0),(t=u(this,Qt))==null||t.call(this))}_raiseError(t){var r;!this.cancelled&&u(this,ve)&&(u(this,ve).error(t),v(this,ve,void 0)),v(this,Yt,t),(r=u(this,Kt))==null||r.call(this,t)}get cancelled(){return u(this,en)}toStream(){return u(this,Ve)}get completed(){return u(this,Xt)}get error(){return u(this,Yt)}toTextStream(t={}){const r=u(this,Ve).pipeThrough(new Eo({transform(s,a){if(s.type==="raw_model_stream_event"&&s.data.type==="output_text_delta"){const i=Ms.parse(s.data);a.enqueue(i.delta)}}}));return t.compatibleWithNodeStreams?Ao.fromWeb(r):r}[Symbol.asyncIterator](){return u(this,Ve)[Symbol.asyncIterator]()}}Yt=new WeakMap,vt=new WeakMap,ve=new WeakMap,Ve=new WeakMap,Xt=new WeakMap,Qt=new WeakMap,Kt=new WeakMap,en=new WeakMap;function Us(n){return n.type==="function"?{type:"function",name:n.name,description:n.description,parameters:n.parameters,strict:n.strict}:n.type==="computer"?{type:"computer",name:n.name,environment:n.computer.environment,dimensions:n.computer.dimensions}:{type:"hosted_tool",name:n.name,providerData:n.providerData}}function Js(n){return{toolName:n.toolName,toolDescription:n.toolDescription,inputJsonSchema:n.inputJsonSchema,strictJsonSchema:n.strictJsonSchema}}class et{constructor(){_(this,"type","base_item");_(this,"rawItem")}toJSON(){return{type:this.type,rawItem:this.rawItem}}}class jn extends et{constructor(t,r){super();_(this,"rawItem");_(this,"agent");_(this,"type","message_output_item");this.rawItem=t,this.agent=r}toJSON(){return{...super.toJSON(),agent:this.agent.toJSON()}}get content(){let t="";for(const r of this.rawItem.content)r.type==="output_text"&&(t+=r.text);return t}}class Ft extends et{constructor(t,r){super();_(this,"rawItem");_(this,"agent");_(this,"type","tool_call_item");this.rawItem=t,this.agent=r}toJSON(){return{...super.toJSON(),agent:this.agent.toJSON()}}}class ft extends et{constructor(t,r,s){super();_(this,"rawItem");_(this,"agent");_(this,"output");_(this,"type","tool_call_output_item");this.rawItem=t,this.agent=r,this.output=s}toJSON(){return{...super.toJSON(),agent:this.agent.toJSON(),output:We(this.output)}}}class wr extends et{constructor(t,r){super();_(this,"rawItem");_(this,"agent");_(this,"type","reasoning_item");this.rawItem=t,this.agent=r}toJSON(){return{...super.toJSON(),agent:this.agent.toJSON()}}}class br extends et{constructor(t,r){super();_(this,"rawItem");_(this,"agent");_(this,"type","handoff_call_item");this.rawItem=t,this.agent=r}toJSON(){return{...super.toJSON(),agent:this.agent.toJSON()}}}class xr extends et{constructor(t,r,s){super();_(this,"rawItem");_(this,"sourceAgent");_(this,"targetAgent");_(this,"type","handoff_output_item");this.rawItem=t,this.sourceAgent=r,this.targetAgent=s}toJSON(){return{...super.toJSON(),sourceAgent:this.sourceAgent.toJSON(),targetAgent:this.targetAgent.toJSON()}}}class tt extends et{constructor(t,r){super();_(this,"rawItem");_(this,"agent");_(this,"type","tool_approval_item");this.rawItem=t,this.agent=r}toJSON(){return{...super.toJSON(),agent:this.agent.toJSON()}}}function Bs(n){if(n.type!=="message"||n.role!=="assistant")return;const e=n.content[n.content.length-1];if(e.type==="output_text")return e.text}function su(n){return n.output.length===0?"":Bs(n.output[n.output.length-1])||""}class au{constructor(e){_(this,"data");_(this,"type","raw_model_stream_event");this.data=e}}class iu{constructor(e,t){_(this,"name");_(this,"item");_(this,"type","run_item_stream_event");this.name=e,this.item=t}}class ou{constructor(e){_(this,"agent");_(this,"type","agent_updated_stream_event");this.agent=e}}function Gs(n,e,t,r){const s=[],a=[],i=[],o=[],c=[],p=new Map(r.map(f=>[f.toolName,f])),l=new Map(t.filter(f=>f.type==="function").map(f=>[f.name,f])),h=t.find(f=>f.type==="computer");for(const f of n.output){if(f.type==="message")f.role==="assistant"&&s.push(new jn(f,e));else if(f.type==="hosted_tool_call")s.push(new Ft(f,e)),c.push(f.name);else if(f.type==="reasoning")s.push(new wr(f,e));else if(f.type==="computer_call"){if(s.push(new Ft(f,e)),c.push("computer_use"),!h)throw Rt({message:"Model produced computer action without a computer tool.",data:{agent_name:e.name}}),new fe("Model produced computer action without a computer tool.");o.push({toolCall:f,computer:h})}if(f.type!=="function_call")continue;c.push(f.name);const b=p.get(f.name);if(b)s.push(new br(f,e)),a.push({toolCall:f,handoff:b});else{const A=l.get(f.name);if(!A)throw Rt({message:`Tool ${f.name} not found in agent ${e.name}.`,data:{tool_name:f.name,agent_name:e.name}}),new fe(`Tool ${f.name} not found in agent ${e.name}.`);s.push(new Ft(f,e)),i.push({toolCall:f,tool:A})}}return{newItems:s,handoffs:a,functions:i,computerActions:o,toolsUsed:c}}const uu=ce("type",[g({type:m("next_step_handoff"),newAgent:U()}),g({type:m("next_step_final_output"),output:d()}),g({type:m("next_step_run_again")}),g({type:m("next_step_interruption"),data:ae(d(),U())})]);class Se{constructor(e,t,r,s,a){_(this,"originalInput");_(this,"modelResponse");_(this,"preStepItems");_(this,"newStepItems");_(this,"nextStep");this.originalInput=e,this.modelResponse=t,this.preStepItems=r,this.newStepItems=s,this.nextStep=a}get generatedItems(){return this.preStepItems.concat(this.newStepItems)}}function Vs(n,e,t){return n.resetToolChoice&&e.hasUsedTools(n)?{...t,toolChoice:void 0}:t}async function zs(n,e,t,r,s,a,i){const o=t.filter(b=>!(b instanceof tt)),c=t.filter(b=>b instanceof tt).map(b=>b.rawItem.callId),p=s.functions.filter(b=>c.includes(b.toolCall.callId)),l=await Ws(n,p,a,i),h=l.map(b=>b.runItem),f=await Hs(n,l,i);return f.isFinalOutput?(a.emit("agent_end",i._context,n,f.finalOutput),n.emit("agent_end",i._context,f.finalOutput),new Se(e,r,o,h,{type:"next_step_final_output",output:f.finalOutput})):f.isInterrupted?new Se(e,r,o,h,{type:"next_step_interruption",data:{interruptions:f.interruptions}}):new Se(e,r,o,h,{type:"next_step_run_again"})}async function qs(n,e,t,r,s,a,i){const o=t;let c=s.newItems;const[p,l]=await Promise.all([Ws(n,s.functions,a,i),du(n,s.computerActions,a,i._context)]);if(c=c.concat(p.map(A=>A.runItem)),c=c.concat(l),s.handoffs.length>0)return await lu(n,e,o,c,r,s.handoffs,a,i._context);const h=await Hs(n,p,i);if(h.isFinalOutput)return a.emit("agent_end",i._context,n,h.finalOutput),n.emit("agent_end",i._context,h.finalOutput),new Se(e,r,o,c,{type:"next_step_final_output",output:h.finalOutput});if(h.isInterrupted)return new Se(e,r,o,c,{type:"next_step_interruption",data:{interruptions:h.interruptions}});const f=c.filter(A=>A instanceof jn),b=f.length>0?Bs(f[f.length-1].rawItem):void 0;if(!b)return new Se(e,r,o,c,{type:"next_step_run_again"});if(n.outputType==="text")return new Se(e,r,o,c,{type:"next_step_final_output",output:b});{const{parser:A}=Wn(n.outputType,"final_output"),[z]=await Vn(()=>A(b));if(z)throw Rt({message:"Invalid output type",data:{error:String(z)}}),new fe("Invalid output type");return new Se(e,r,o,c,{type:"next_step_final_output",output:b})}}function Pn(n,e){return{type:"function_call_result",name:n.name,callId:n.callId,status:"completed",output:{type:"text",text:We(e)}}}async function Ws(n,e,t,r){async function s(a){let i=a.toolCall.arguments;if(a.tool.parameters&&(qe(a.tool.parameters)?i=a.tool.parameters.parse(i):i=JSON.parse(i)),await a.tool.needsApproval(r._context,i,a.toolCall.callId)){const c=r._context.isToolApproved({toolName:a.tool.name,callId:a.toolCall.callId});if(c===!1)return us(async p=>{const l="Tool execution was not approved.";return p.setError({message:l,data:{tool_name:a.tool.name,error:`Tool execution for ${a.toolCall.callId} was manually rejected by user.`}}),p.spanData.output=l,{type:"function_output",tool:a.tool,output:l,runItem:new ft(Pn(a.toolCall,l),n,l)}},{data:{name:a.tool.name}});if(c!==!0)return{type:"function_approval",tool:a.tool,runItem:new tt(a.toolCall,n)}}return us(async c=>{t.config.traceIncludeSensitiveData&&(c.spanData.input=a.toolCall.arguments);try{t.emit("agent_tool_start",r._context,n,a.tool),n.emit("agent_tool_start",r._context,a.tool);const p=await a.tool.invoke(r._context,a.toolCall.arguments),l=We(p);return t.emit("agent_tool_end",r._context,n,a.tool,l),n.emit("agent_tool_end",r._context,a.tool,l),t.config.traceIncludeSensitiveData&&(c.spanData.output=l),{type:"function_output",tool:a.tool,output:p,runItem:new ft(Pn(a.toolCall,p),n,p)}}catch(p){throw c.setError({message:"Error running tool",data:{tool_name:a.tool.name,error:String(p)}}),p}},{data:{name:a.tool.name}})}try{return await Promise.all(e.map(s))}catch(a){throw new Ci(`Failed to run function tools: ${a}`,a,r)}}async function cu(n,e){const t=e.action;let r;switch(t.type){case"click":await n.click(t.x,t.y,t.button);break;case"double_click":await n.doubleClick(t.x,t.y);break;case"drag":await n.drag(t.path.map(s=>[s.x,s.y]));break;case"keypress":await n.keypress(t.keys);break;case"move":await n.move(t.x,t.y);break;case"screenshot":r=await n.screenshot();break;case"scroll":await n.scroll(t.x,t.y,t.scroll_x,t.scroll_y);break;case"type":await n.type(t.text);break;case"wait":await n.wait();break}if(typeof r<"u"||typeof n.screenshot=="function"&&(r=await n.screenshot(),typeof r<"u"))return r;throw new Error("Computer does not implement screenshot()")}async function du(n,e,t,r){const s=[];for(const a of e){const i=a.computer.computer,o=a.toolCall;t.emit("agent_tool_start",r,n,a.computer),typeof n.emit=="function"&&n.emit("agent_tool_start",r,a.computer);let c;try{c=await cu(i,o)}catch(h){I.error("Failed to execute computer action:",h),c=""}t.emit("agent_tool_end",r,n,a.computer,c),typeof n.emit=="function"&&n.emit("agent_tool_end",r,a.computer,c);const p=c?`data:image/png;base64,${c}`:"",l={type:"computer_call_result",callId:o.callId,output:{type:"computer_screenshot",data:p}};s.push(new ft(l,n,p))}return s}async function lu(n,e,t,r,s,a,i,o){if(r=[...r],a.length===0)return I.warn("Incorrectly called executeHandoffCalls with no handoffs. This should not happen. Moving on."),new Se(e,s,t,r,{type:"next_step_run_again"});if(a.length>1){const p="Multiple handoffs detected, ignorning this one.";for(let l=1;l<a.length;l++)r.push(new ft(Pn(a[l].toolCall,p),n,p))}const c=a[0];return Ji(async p=>{const l=c.handoff,h=await l.onInvokeHandoff(o,c.toolCall.arguments);if(p.spanData.to_agent=h.name,a.length>1){const b=a.map(A=>A.handoff.agentName);p.setError({message:"Multiple handoffs requested",data:{requested_agents:b}})}r.push(new xr(Pn(c.toolCall,Os(h)),n,h)),i.emit("agent_handoff",o,n,h),n.emit("agent_handoff",o,h);const f=l.inputFilter??i.config.handoffInputFilter;if(f){I.debug("Filtering inputs for handoff"),typeof f!="function"&&p.setError({message:"Invalid input filter",data:{details:"not callable"}});const b={inputHistory:Array.isArray(e)?[...e]:e,preHandoffItems:[...t],newItems:[...r]},A=f(b);e=A.inputHistory,t=A.preHandoffItems,r=A.newItems}return new Se(e,s,t,r,{type:"next_step_handoff",newAgent:h})},{data:{from_agent:n.name}})}const Zn={isFinalOutput:!1,isInterrupted:void 0};async function Hs(n,e,t){if(e.length===0)return Zn;const r=e.filter(i=>i.runItem instanceof tt).map(i=>i.runItem);if(r.length>0)return{isFinalOutput:!1,isInterrupted:!0,interruptions:r};if(n.toolUseBehavior==="run_llm_again")return Zn;const s=e[0];if(n.toolUseBehavior==="stop_on_first_tool")return(s==null?void 0:s.type)==="function_output"?{isFinalOutput:!0,isInterrupted:void 0,finalOutput:We(s.output)}:Zn;const a=n.toolUseBehavior;if(typeof a=="object"){const i=e.find(o=>a.stopAtToolNames.includes(o.tool.name));return(i==null?void 0:i.type)==="function_output"?{isFinalOutput:!0,isInterrupted:void 0,finalOutput:We(i.output)}:Zn}if(typeof a=="function")return a(t._context,e);throw I.error("Invalid toolUseBehavior: ",a),new Q(`Invalid toolUseBehavior: ${a}`,t)}function Ys(n,e){for(const t of e.newStepItems){let r;if(t instanceof jn)r="message_output_created";else if(t instanceof br)r="handoff_requested";else if(t instanceof xr)r="handoff_occurred";else if(t instanceof Ft)r="tool_called";else if(t instanceof ft)r="tool_output";else if(t instanceof wr)r="reasoning_item_created";else if(t instanceof tt)r="tool_approval_requested";else{I.warn("Unknown item type: ",t);continue}n._addItem(new iu(r,t))}}class Xs{constructor(){S(this,wt,new Map)}addToolUse(e,t){u(this,wt).set(e,t)}hasUsedTools(e){return u(this,wt).has(e)}toJSON(){return Object.fromEntries(Array.from(u(this,wt).entries()).map(([e,t])=>[e.name,t]))}}wt=new WeakMap;const Sr="1.0",pu=m(Sr),Te=g({name:d()}),Qs=g({object:m("trace.span"),id:d(),trace_id:d(),parent_id:d().nullable(),started_at:d().nullable(),ended_at:d().nullable(),error:g({message:d(),data:ae(d(),U()).optional()}).nullable(),span_data:ae(d(),U())}).extend({previous_span:wo(()=>Qs).optional()}),Ks=g({requests:k(),inputTokens:k(),outputTokens:k(),totalTokens:k()}),ea=g({usage:Ks,output:G(vr),responseId:d().optional()}),ta=ce("type",[g({type:m("message_output_item"),rawItem:Nn,agent:Te}),g({type:m("tool_call_item"),rawItem:Qo.or(Rn),agent:Te}),g({type:m("tool_call_output_item"),rawItem:gr,agent:Te,output:d()}),g({type:m("reasoning_item"),rawItem:yr,agent:Te}),g({type:m("handoff_call_item"),rawItem:$t,agent:Te}),g({type:m("handoff_output_item"),rawItem:gr,sourceAgent:Te,targetAgent:Te}),g({type:m("tool_approval_item"),rawItem:$t,agent:Te})]),fu=g({object:m("trace"),id:d(),workflow_name:d(),group_id:d().nullable(),metadata:ae(d(),U())}),hu=g({newItems:G(ta),toolsUsed:G(d()),handoffs:G(g({toolCall:U(),handoff:U()})),functions:G(g({toolCall:U(),tool:U()})),computerActions:G(g({toolCall:U(),computer:U()}))}),na=g({tripwireTriggered:lt(),outputInfo:U()}),mu=g({guardrail:g({type:m("input"),name:d()}),output:na}),gu=g({guardrail:g({type:m("output"),name:d()}),agentOutput:U(),agent:Te,output:na}),ra=g({$schemaVersion:pu,currentTurn:k(),currentAgent:Te,originalInput:d().or(G(Ko)),modelResponses:G(ea),context:g({usage:Ks,approvals:ae(d(),g({approved:G(d()).or(lt()),rejected:G(d()).or(lt())})),context:ae(d(),U())}),toolUseTracker:ae(d(),G(d())),maxTurns:k(),currentAgentSpan:Qs.nullable().optional(),noActiveAgentRun:lt(),inputGuardrailResults:G(mu),outputGuardrailResults:G(gu),currentStep:uu.optional(),lastModelResponse:ea.optional(),generatedItems:G(ta),lastProcessedResponse:hu.optional(),trace:fu.nullable()});class nt{constructor(e,t,r,s){_(this,"_currentTurn",0);_(this,"_currentAgent");_(this,"_originalInput");_(this,"_modelResponses");_(this,"_currentAgentSpan");_(this,"_context");_(this,"_toolUseTracker");_(this,"_generatedItems");_(this,"_maxTurns");_(this,"_noActiveAgentRun",!0);_(this,"_lastTurnResponse");_(this,"_inputGuardrailResults");_(this,"_outputGuardrailResults");_(this,"_currentStep");_(this,"_lastProcessedResponse");_(this,"_trace",null);this._context=e,this._originalInput=structuredClone(t),this._modelResponses=[],this._currentAgentSpan=void 0,this._currentAgent=r,this._toolUseTracker=new Xs,this._generatedItems=[],this._maxTurns=s,this._inputGuardrailResults=[],this._outputGuardrailResults=[],this._trace=Et()}approve(e,t={alwaysApprove:!1}){this._context.approveTool(e,t)}reject(e,t={alwaysReject:!1}){this._context.rejectTool(e,t)}toJSON(){var r;const e={$schemaVersion:"1.0",currentTurn:this._currentTurn,currentAgent:{name:this._currentAgent.name},originalInput:this._originalInput,modelResponses:this._modelResponses.map(s=>({usage:{requests:s.usage.requests,inputTokens:s.usage.inputTokens,outputTokens:s.usage.outputTokens,totalTokens:s.usage.totalTokens},output:s.output,responseId:s.responseId})),context:this._context.toJSON(),toolUseTracker:this._toolUseTracker.toJSON(),maxTurns:this._maxTurns,currentAgentSpan:(r=this._currentAgentSpan)==null?void 0:r.toJSON(),noActiveAgentRun:this._noActiveAgentRun,inputGuardrailResults:this._inputGuardrailResults,outputGuardrailResults:this._outputGuardrailResults.map(s=>({...s,agent:s.agent.toJSON()})),currentStep:this._currentStep,lastModelResponse:this._lastTurnResponse,generatedItems:this._generatedItems.map(s=>s.toJSON()),lastProcessedResponse:this._lastProcessedResponse,trace:this._trace?this._trace.toJSON():null},t=ra.safeParse(e);if(!t.success)throw new Ai(`Failed to serialize run state. ${t.error.message}`);return t.data}toString(){return JSON.stringify(this.toJSON())}static async fromString(e,t){var h,f,b,A,z;const[r,s]=await Vn(()=>JSON.parse(t));if(r)throw new Q(`Failed to parse run state. ${r instanceof Error?r.message:String(r)}`);const a=s.$schemaVersion;if(!a)throw new Q("Run state is missing schema version");if(a!==Sr)throw new Q(`Run state schema version ${a} is not supported. Please use version ${Sr}`);const i=ra.parse(JSON.parse(t)),o=_u(e),c=new pt(i.context.context);c._rebuildApprovals(i.context.approvals);const p=o.get(i.currentAgent.name);if(!p)throw new Q(`Agent ${i.currentAgent.name} not found`);const l=new nt(c,"",p,i.maxTurns);l._currentTurn=i.currentTurn,l._toolUseTracker=new Xs;for(const[M,J]of Object.entries(i.toolUseTracker))l._toolUseTracker.addToolUse(o.get(M),J);if(i.currentAgentSpan){i.trace||I.warn("Trace is not set, skipping tracing setup");const M=he().createTrace({traceId:(h=i.trace)==null?void 0:h.id,name:(f=i.trace)==null?void 0:f.workflow_name,groupId:((b=i.trace)==null?void 0:b.group_id)??void 0,metadata:(A=i.trace)==null?void 0:A.metadata});l._currentAgentSpan=sa(M,i.currentAgentSpan),l._trace=M}return l._noActiveAgentRun=i.noActiveAgentRun,l._inputGuardrailResults=i.inputGuardrailResults,l._outputGuardrailResults=i.outputGuardrailResults.map(M=>({...M,agent:o.get(M.agent.name)})),l._currentStep=i.currentStep,l._originalInput=i.originalInput,l._modelResponses=i.modelResponses.map(aa),l._lastTurnResponse=i.lastModelResponse?aa(i.lastModelResponse):void 0,l._generatedItems=i.generatedItems.map(M=>ia(M,o)),l._lastProcessedResponse=i.lastProcessedResponse?await yu(o,l._currentAgent,i.lastProcessedResponse):void 0,((z=i.currentStep)==null?void 0:z.type)==="next_step_handoff"&&(l._currentStep={type:"next_step_handoff",newAgent:o.get(i.currentStep.newAgent.name)}),l}}function _u(n){const e=new Map,t=[n];for(;t.length>0;){const r=t.shift();if(!e.has(r.name)){e.set(r.name,r);for(const s of r.handoffs)s instanceof ht?e.has(s.name)||t.push(s):s.agent&&(e.has(s.agent.name)||t.push(s.agent))}}return e}function sa(n,e){const t=e.span_data,r=e.previous_span?sa(n,e.previous_span):void 0,s=he().createSpan({spanId:e.id,traceId:e.trace_id,parentId:e.parent_id??void 0,startedAt:e.started_at??void 0,endedAt:e.ended_at??void 0,data:t},n);return s.previousSpan=r,s}function aa(n){const e=new Dn;return e.requests=n.usage.requests,e.inputTokens=n.usage.inputTokens,e.outputTokens=n.usage.outputTokens,e.totalTokens=n.usage.totalTokens,{usage:e,output:n.output.map(t=>vr.parse(t)),responseId:n.responseId}}function ia(n,e){switch(n.type){case"message_output_item":return new jn(n.rawItem,e.get(n.agent.name));case"tool_call_item":return new Ft(n.rawItem,e.get(n.agent.name));case"tool_call_output_item":return new ft(n.rawItem,e.get(n.agent.name),n.output);case"reasoning_item":return new wr(n.rawItem,e.get(n.agent.name));case"handoff_call_item":return new br(n.rawItem,e.get(n.agent.name));case"handoff_output_item":return new xr(n.rawItem,e.get(n.sourceAgent.name),e.get(n.targetAgent.name));case"tool_approval_item":return new tt(n.rawItem,e.get(n.agent.name))}}async function yu(n,e,t){const r=await e.getAllTools(),s=new Map(r.filter(o=>o.type==="function").map(o=>[o.name,o])),a=new Map(r.filter(o=>o.type==="computer").map(o=>[o.name,o])),i=new Map(e.handoffs.map(o=>o instanceof ht?[o.name,Rs(o)]:[o.toolName,o]));return{newItems:t.newItems.map(o=>ia(o,n)),toolsUsed:t.toolsUsed,handoffs:t.handoffs.map(o=>{if(!i.has(o.handoff.toolName))throw new Q(`Handoff ${o.handoff.toolName} not found`);return{toolCall:o.toolCall,handoff:i.get(o.handoff.toolName)}}),functions:await Promise.all(t.functions.map(async o=>{if(!s.has(o.tool.name))throw new Q(`Tool ${o.tool.name} not found`);return{toolCall:o.toolCall,tool:s.get(o.tool.name)}})),computerActions:t.computerActions.map(o=>{const c=o.computer.name;if(!a.has(c))throw new Q(`Computer tool ${c} not found`);return{toolCall:o.toolCall,computer:a.get(c)}})}}const oa=10;function ua(n,e){return n?!1:e?!0:"enabled_without_data"}function Mn(n,e){const t=e.map(r=>r.rawItem);return typeof n=="string"&&(n=[{type:"message",role:"user",content:n}]),[...n,...t]}class vu extends Zo{constructor(t={}){super();S(this,ne);_(this,"config");_(this,"inputGuardrailDefs");_(this,"outputGuardrailDefs");this.config={modelProvider:t.modelProvider??Fo(),model:t.model,modelSettings:t.modelSettings,handoffInputFilter:t.handoffInputFilter,inputGuardrails:t.inputGuardrails,outputGuardrails:t.outputGuardrails,tracingDisabled:t.tracingDisabled??!1,traceIncludeSensitiveData:t.traceIncludeSensitiveData??!0,workflowName:t.workflowName??"Agent workflow",traceId:t.traceId,groupId:t.groupId,traceMetadata:t.traceMetadata},this.inputGuardrailDefs=(t.inputGuardrails??[]).map(Es),this.outputGuardrailDefs=(t.outputGuardrails??[]).map(fr)}run(t,r,s={stream:!1,context:void 0}){return r instanceof nt&&r._trace?Oi(r._trace,async()=>(r._currentAgentSpan&&hn(r._currentAgentSpan),s!=null&&s.stream?$(this,ne,jr).call(this,t,r,s):$(this,ne,Nr).call(this,t,r,s))):Ni(async()=>s!=null&&s.stream?$(this,ne,jr).call(this,t,r,s):$(this,ne,Nr).call(this,t,r,s))}}ne=new WeakSet,Nr=async function(t,r,s){return Hn(async()=>{var i,o;const a=r instanceof nt?r:new nt(s.context instanceof pt?s.context:new pt(s.context),r,t,s.maxTurns??oa);try{for(;;){let c=a._currentAgent.model??this.config.model;if(typeof c=="string"&&(c=await this.config.modelProvider.getModel(c)),a._currentStep=a._currentStep??{type:"next_step_run_again"},a._currentStep.type==="next_step_interruption"){if(I.debug("Continuing from interruption"),!a._lastTurnResponse||!a._lastProcessedResponse)throw new Q("No model response found in previous state",a);const p=await zs(a._currentAgent,a._originalInput,a._generatedItems,a._lastTurnResponse,a._lastProcessedResponse,this,a);a._toolUseTracker.addToolUse(a._currentAgent,a._lastProcessedResponse.toolsUsed),a._originalInput=p.originalInput,a._generatedItems=p.generatedItems,a._currentStep=p.nextStep;continue}if(a._currentStep.type==="next_step_run_again"){const p=a._currentAgent.handoffs.map(On);if(!a._currentAgentSpan){const J=p.map(re=>re.agentName);a._currentAgentSpan=os({data:{name:a._currentAgent.name,handoffs:J,output_type:a._currentAgent.outputSchemaName}}),a._currentAgentSpan.start(),hn(a._currentAgentSpan)}const l=await a._currentAgent.getAllTools(),h=l.map(J=>Us(J)),f=p.map(J=>Js(J));if(a._currentAgentSpan&&(a._currentAgentSpan.spanData.tools=l.map(J=>J.name)),a._currentTurn++,a._currentTurn>a._maxTurns)throw(i=a._currentAgentSpan)==null||i.setError({message:"Max turns exceeded",data:{max_turns:a._maxTurns}}),new Qr(`Max turns (${a._maxTurns}) exceeded`,a);I.debug(`Running agent ${a._currentAgent.name} (turn ${a._currentTurn})`),a._currentTurn===1&&await $(this,ne,Rr).call(this,a);const b=Mn(a._originalInput,a._generatedItems);a._noActiveAgentRun&&(a._currentAgent.emit("agent_start",a._context,a._currentAgent),this.emit("agent_start",a._context,a._currentAgent));let A={...this.config.modelSettings,...a._currentAgent.modelSettings};A=Vs(a._currentAgent,a._toolUseTracker,A),a._lastTurnResponse=await c.getResponse({systemInstructions:await a._currentAgent.getSystemPrompt(a._context),input:b,previousResponseId:s.previousResponseId,modelSettings:A,tools:h,outputType:ts(a._currentAgent.outputType),handoffs:f,tracing:ua(this.config.tracingDisabled,this.config.traceIncludeSensitiveData)}),a._modelResponses.push(a._lastTurnResponse),a._context.usage.add(a._lastTurnResponse.usage),a._noActiveAgentRun=!1;const z=Gs(a._lastTurnResponse,a._currentAgent,l,p);a._lastProcessedResponse=z;const M=await qs(a._currentAgent,a._originalInput,a._generatedItems,a._lastTurnResponse,a._lastProcessedResponse,this,a);a._toolUseTracker.addToolUse(a._currentAgent,a._lastProcessedResponse.toolsUsed),a._originalInput=M.originalInput,a._generatedItems=M.generatedItems,a._currentStep=M.nextStep}if(a._currentStep&&a._currentStep.type==="next_step_final_output")return await $(this,ne,Dr).call(this,a,a._currentStep.output),this.emit("agent_end",a._context,a._currentAgent,a._currentStep.output),a._currentAgent.emit("agent_end",a._context,a._currentStep.output),new Ls(a);if(a._currentStep&&a._currentStep.type==="next_step_handoff")a._currentAgent=a._currentStep.newAgent,a._currentAgentSpan&&(a._currentAgentSpan.end(),Nt(),a._currentAgentSpan=void 0),a._noActiveAgentRun=!0,a._currentStep={type:"next_step_run_again"};else{if(a._currentStep&&a._currentStep.type==="next_step_interruption")return new Ls(a);I.debug("Running next loop")}}}catch(c){throw a._currentAgentSpan&&a._currentAgentSpan.setError({message:"Error in agent run",data:{error:String(c)}}),c}finally{a._currentAgentSpan&&(((o=a._currentStep)==null?void 0:o.type)!=="next_step_interruption"&&a._currentAgentSpan.end(),Nt())}})},Rr=async function(t){const r=this.inputGuardrailDefs.concat(t._currentAgent.inputGuardrails.map(Es));if(r.length>0){const s={agent:t._currentAgent,input:t._originalInput,context:t._context};try{const a=await Promise.all(r.map(async i=>cs(async o=>{const c=await i.run(s);return o.spanData.triggered=c.output.tripwireTriggered,c},{data:{name:i.name}},t._currentAgentSpan)));for(const i of a)if(i.output.tripwireTriggered)throw t._currentAgentSpan&&t._currentAgentSpan.setError({message:"Guardrail tripwire triggered",data:{guardrail:i.guardrail.name}}),new es(`Input guardrail triggered: ${JSON.stringify(i.output.outputInfo)}`,i,t)}catch(a){throw a instanceof es?a:(t._currentTurn--,new Kr(`Input guardrail failed to complete: ${a}`,a,t))}}},Dr=async function(t,r){const s=this.outputGuardrailDefs.concat(t._currentAgent.outputGuardrails.map(fr));if(s.length>0){const a=t._currentAgent.processFinalOutput(r),i={agent:t._currentAgent,agentOutput:a,context:t._context};try{const o=await Promise.all(s.map(async c=>cs(async p=>{const l=await c.run(i);return p.spanData.triggered=l.output.tripwireTriggered,l},{data:{name:c.name}},t._currentAgentSpan)));for(const c of o)if(c.output.tripwireTriggered)throw t._currentAgentSpan&&t._currentAgentSpan.setError({message:"Guardrail tripwire triggered",data:{guardrail:c.guardrail.name}}),new pn(`Output guardrail triggered: ${JSON.stringify(c.output.outputInfo)}`,c,t)}catch(o){throw o instanceof pn?o:new Kr(`Output guardrail failed to complete: ${o}`,o,t)}}},ba=async function(t,r){var s,a,i;try{for(;;){const o=t.state._currentAgent,c=o.handoffs.map(On),p=await o.getAllTools(),l=p.map(f=>Us(f)),h=c.map(f=>Js(f));if(t.state._currentStep=t.state._currentStep??{type:"next_step_run_again"},t.state._currentStep.type==="next_step_interruption"){if(I.debug("Continuing from interruption"),!t.state._lastTurnResponse||!t.state._lastProcessedResponse)throw new Q("No model response found in previous state",t.state);const f=await zs(t.state._currentAgent,t.state._originalInput,t.state._generatedItems,t.state._lastTurnResponse,t.state._lastProcessedResponse,this,t.state);Ys(t,f),t.state._toolUseTracker.addToolUse(t.state._currentAgent,t.state._lastProcessedResponse.toolsUsed),t.state._originalInput=f.originalInput,t.state._generatedItems=f.generatedItems,t.state._currentStep=f.nextStep;continue}if(t.state._currentStep.type==="next_step_run_again"){if(!t.state._currentAgentSpan){const re=c.map(ue=>ue.agentName);t.state._currentAgentSpan=os({data:{name:o.name,handoffs:re,tools:p.map(ue=>ue.name),output_type:o.outputSchemaName}}),t.state._currentAgentSpan.start(),hn(t.state._currentAgentSpan)}if(t.state._currentTurn++,t.state._currentTurn>t.state._maxTurns)throw(s=t.state._currentAgentSpan)==null||s.setError({message:"Max turns exceeded",data:{max_turns:t.state._maxTurns}}),new Qr(`Max turns (${t.state._maxTurns}) exceeded`,t.state);I.debug(`Running agent ${o.name} (turn ${t.state._currentTurn})`);let f=o.model??this.config.model;typeof f=="string"&&(f=await this.config.modelProvider.getModel(f)),t.state._currentTurn===1&&await $(this,ne,Rr).call(this,t.state);let b={...this.config.modelSettings,...o.modelSettings};b=Vs(o,t.state._toolUseTracker,b);const A=Mn(t.input,t.newItems);t.state._noActiveAgentRun&&(o.emit("agent_start",t.state._context,o),this.emit("agent_start",t.state._context,o));let z;for await(const re of f.getStreamedResponse({systemInstructions:await o.getSystemPrompt(t.state._context),input:A,previousResponseId:r.previousResponseId,modelSettings:b,tools:l,handoffs:h,outputType:ts(o.outputType),tracing:ua(this.config.tracingDisabled,this.config.traceIncludeSensitiveData)})){if(re.type==="response_done"){const ue=$s.parse(re);z={usage:new Dn(ue.response.usage),output:ue.response.output,responseId:ue.response.id}}if(t.cancelled)return;t._addItem(new au(re))}if(t.state._noActiveAgentRun=!1,!z)throw new fe("Model did not procude a final response!",t.state);t.state._lastTurnResponse=z,t.state._modelResponses.push(t.state._lastTurnResponse);const M=Gs(t.state._lastTurnResponse,o,p,c);t.state._lastProcessedResponse=M;const J=await qs(o,t.state._originalInput,t.state._generatedItems,t.state._lastTurnResponse,t.state._lastProcessedResponse,this,t.state);Ys(t,J),t.state._toolUseTracker.addToolUse(o,M.toolsUsed),t.state._originalInput=J.originalInput,t.state._generatedItems=J.generatedItems,t.state._currentStep=J.nextStep}if(t.state._currentStep.type==="next_step_final_output"){await $(this,ne,Dr).call(this,t.state,t.state._currentStep.output);return}else{if(t.state._currentStep.type==="next_step_interruption")return;t.state._currentStep.type==="next_step_handoff"?(t.state._currentAgent=(a=t.state._currentStep)==null?void 0:a.newAgent,t.state._currentAgentSpan&&(t.state._currentAgentSpan.end(),Nt()),t.state._currentAgentSpan=void 0,t._addItem(new ou(o)),t.state._noActiveAgentRun=!0,t.state._currentStep={type:"next_step_run_again"}):I.debug("Running next loop")}}}catch(o){throw t.state._currentAgentSpan&&t.state._currentAgentSpan.setError({message:"Error in agent run",data:{error:String(o)}}),o}finally{t.state._currentAgentSpan&&(((i=t.state._currentStep)==null?void 0:i.type)!=="next_step_interruption"&&t.state._currentAgentSpan.end(),Nt())}},jr=async function(t,r,s){return s=s??{},Hn(async()=>{const a=r instanceof nt?r:new nt(s.context instanceof pt?s.context:new pt(s.context),r,t,s.maxTurns??oa),i=new ru({signal:s.signal,state:a});return i.maxTurns=s.maxTurns??a._maxTurns,$(this,ne,ba).call(this,i,s).then(()=>{i._done()},o=>{i._raiseError(o)}),i})};class ht extends Po{constructor(t){super();_(this,"name");_(this,"instructions");_(this,"handoffDescription");_(this,"handoffs");_(this,"model");_(this,"modelSettings");_(this,"tools");_(this,"mcpServers");_(this,"inputGuardrails");_(this,"outputGuardrails");_(this,"outputType","text");_(this,"toolUseBehavior");_(this,"resetToolChoice");if(typeof t.name!="string"||t.name.trim()==="")throw new Q("Agent must have a name.");if(this.name=t.name,this.instructions=t.instructions??"",this.handoffDescription=t.handoffDescription??"",this.handoffs=t.handoffs??[],this.model=t.model??"",this.modelSettings=t.modelSettings??{},this.tools=t.tools??[],this.mcpServers=t.mcpServers??[],this.inputGuardrails=t.inputGuardrails??[],this.outputGuardrails=t.outputGuardrails??[],t.outputType&&(this.outputType=t.outputType),this.toolUseBehavior=t.toolUseBehavior??"run_llm_again",this.resetToolChoice=t.resetToolChoice??!0,(t.handoffOutputTypeWarningEnabled===void 0||t.handoffOutputTypeWarningEnabled)&&this.handoffs&&this.outputType){const r=new Set([JSON.stringify(this.outputType)]);for(const s of this.handoffs)"outputType"in s&&s.outputType?r.add(JSON.stringify(s.outputType)):"agent"in s&&s.agent.outputType&&r.add(JSON.stringify(s.agent.outputType));r.size>1&&I.warn(`[Agent] Warning: Handoff agents have different output types: ${Array.from(r).join(", ")}. You can make it type-safe by using Agent.create({ ... }) method instead.`)}}static create(t){return new ht({...t,handoffs:t.handoffs,outputType:t.outputType,handoffOutputTypeWarningEnabled:!1})}get outputSchemaName(){if(this.outputType==="text")return"text";if(qe(this.outputType))return"ZodOutput";if(typeof this.outputType=="object")return this.outputType.name;throw new Error(`Unknown output type: ${this.outputType}`)}clone(t){return new ht({...this,...t})}asTool(t){const{toolName:r,toolDescription:s,customOutputExtractor:a}=t;return _n({name:r??fn(this.name),description:s??"",parameters:{type:"object",properties:{input:{type:"string"}},required:["input"],additionalProperties:!1},strict:!0,execute:async(i,o)=>{if(!Ei(i))throw new fe("Agent tool called with invalid input");const p=await new vu().run(this,i.input,{context:o==null?void 0:o.context});return typeof a=="function"?a(p):su(p.rawResponses[p.rawResponses.length-1])}})}async getSystemPrompt(t){return typeof this.instructions=="function"?await this.instructions(t,this):this.instructions}async getMcpTools(){return this.mcpServers.length>0?So(this.mcpServers):[]}async getAllTools(){return[...await this.getMcpTools(),...this.tools]}processFinalOutput(t){if(this.outputType==="text")return t;if(typeof this.outputType=="object"){const r=JSON.parse(t);return qe(this.outputType)?this.outputType.parse(r):r}throw new Error(`Unknown output type: ${this.outputType}`)}toJSON(){return{name:this.name}}}zi(ss());const $n=async()=>{await he().shutdown()};typeof process<"u"&&(process.on("beforeExit",$n),process.on("SIGINT",$n),process.on("SIGTERM",$n),process.on("unhandledRejection",(n,e)=>{I.error("Unhandled rejection",n,e),$n()}));class wu extends ht{constructor(t){super(t);_(this,"voice");this.voice=t.voice??"ash"}}function bu(n){return{debounceTextLength:n.debounceTextLength??100}}function xu({policyHint:n,...e}){const t=fr(e),r=n??t.name;return{...t,policyHint:r,run:async s=>{const a=await t.run(s);return{...a,guardrail:{...a.guardrail,policyHint:r}}}}}function Su(n){return`
6
+ ⚠️ Your last answer was blocked.
7
+ Failed Guardrail Reason: ${n.guardrail.policyHint}.
8
+ Failure Details: ${JSON.stringify(n.output.outputInfo??{})}.
9
+ Please respond again following policy. Apologize for not being able to answer the question (while avoiding the specific reason) and divert discussion back to an approved topic immediately and not invite more discussion.
10
+ `.trim()}const Oe=Cs("openai-agents:realtime");g({itemId:d()});const ca=ce("role",[g({itemId:d(),previousItemId:d().nullable().optional(),type:m("message"),role:m("system"),content:G(g({type:m("input_text"),text:d()}))}),g({itemId:d(),previousItemId:d().nullable().optional(),type:m("message"),role:m("user"),status:ie(["in_progress","completed"]),content:G(g({type:m("input_text"),text:d()}).or(g({type:m("input_audio"),audio:d().nullable().optional(),transcript:d().nullable()})))}),g({itemId:d(),previousItemId:d().nullable().optional(),type:m("message"),role:m("assistant"),status:ie(["in_progress","completed","incomplete"]),content:G(g({type:m("text"),text:d()}).or(g({type:m("audio"),audio:d().nullable().optional(),transcript:d().nullable().optional()})))})]),da=g({itemId:d(),previousItemId:d().nullable().optional(),type:m("function_call"),status:ie(["in_progress","completed"]),arguments:d(),name:d(),output:d().nullable()}),la=g({id:d().optional(),conversation_id:d().optional(),max_output_tokens:k().or(m("inf")).optional(),metadata:ae(d(),U()).optional().nullable(),modalities:G(d()).optional(),object:m("realtime.response").optional(),output:G(U()).optional(),output_audio_format:d().optional(),status:ie(["completed","incomplete","failed","cancelled"]).optional(),status_details:ae(d(),U()).optional().nullable(),usage:g({input_tokens:k().optional(),input_tokens_details:ae(d(),U()).optional().nullable(),output_tokens:k().optional(),output_tokens_details:ae(d(),U()).optional().nullable()}).optional(),voice:d().optional()}),Tu=g({id:d().optional(),audio:d().nullable().optional(),text:d().nullable().optional(),transcript:d().nullable().optional(),type:Ss([m("input_text"),m("input_audio"),m("item_reference"),m("text"),m("audio")])}),Lt=g({id:d().optional(),arguments:d().optional(),call_id:d().optional(),content:G(Tu).optional(),name:d().optional(),object:m("realtime.item").optional(),output:d().optional(),role:ie(["user","assistant","system"]).optional(),status:ie(["completed","incomplete","in_progress"]).optional(),type:ie(["message","function_call","function_call_output"]).optional()}),ku=g({type:m("conversation.created"),event_id:d(),conversation:g({id:d().optional(),object:m("realtime.conversation").optional()})}),Iu=g({type:m("conversation.item.created"),event_id:d(),item:Lt,previous_item_id:d().nullable().optional()}),Au=g({type:m("conversation.item.deleted"),event_id:d(),item_id:d()}),Cu=g({type:m("conversation.item.input_audio_transcription.completed"),event_id:d(),item_id:d(),content_index:k(),transcript:d(),logprobs:G(U()).nullable().optional()}),Eu=g({type:m("conversation.item.input_audio_transcription.delta"),event_id:d(),item_id:d(),content_index:k().optional(),delta:d().optional(),logprobs:G(U()).nullable().optional()}),Ou=g({type:m("conversation.item.input_audio_transcription.failed"),event_id:d(),item_id:d(),content_index:k(),error:g({code:d().optional(),message:d().optional(),param:d().optional(),type:d().optional()})}),Nu=g({type:m("conversation.item.retrieved"),event_id:d(),item:Lt}),Ru=g({type:m("conversation.item.truncated"),event_id:d(),item_id:d(),audio_end_ms:k(),content_index:k()}),Du=g({type:m("conversation.item.create"),item:Lt,event_id:d().optional(),previous_item_id:d().nullable().optional()}),ju=g({type:m("conversation.item.delete"),item_id:d(),event_id:d().optional()}),Pu=g({type:m("conversation.item.retrieve"),item_id:d(),event_id:d().optional()}),Zu=g({type:m("conversation.item.truncate"),item_id:d(),audio_end_ms:k(),content_index:k(),event_id:d().optional()}),Mu=g({type:m("error"),event_id:d().optional(),error:U().optional()}),$u=g({type:m("input_audio_buffer.cleared"),event_id:d()}),Fu=g({type:m("input_audio_buffer.append"),audio:d(),event_id:d().optional()}),Lu=g({type:m("input_audio_buffer.clear"),event_id:d().optional()}),Uu=g({type:m("input_audio_buffer.commit"),event_id:d().optional()}),Ju=g({type:m("input_audio_buffer.committed"),event_id:d(),item_id:d(),previous_item_id:d().nullable().optional()}),Bu=g({type:m("input_audio_buffer.speech_started"),event_id:d(),item_id:d(),audio_start_ms:k()}),Gu=g({type:m("input_audio_buffer.speech_stopped"),event_id:d(),item_id:d(),audio_end_ms:k()}),Vu=g({type:m("output_audio_buffer.started"),event_id:d()}).passthrough(),zu=g({type:m("output_audio_buffer.stopped"),event_id:d()}).passthrough(),qu=g({type:m("output_audio_buffer.cleared"),event_id:d()}),Wu=g({type:m("rate_limits.updated"),event_id:d(),rate_limits:G(g({limit:k().optional(),name:ie(["requests","tokens"]).optional(),remaining:k().optional(),reset_seconds:k().optional()}))}),Hu=g({type:m("response.audio.delta"),event_id:d(),item_id:d(),content_index:k(),delta:d(),output_index:k(),response_id:d()}),Yu=g({type:m("response.audio.done"),event_id:d(),item_id:d(),content_index:k(),output_index:k(),response_id:d()}),Xu=g({type:m("response.audio_transcript.delta"),event_id:d(),item_id:d(),content_index:k(),delta:d(),output_index:k(),response_id:d()}),Qu=g({type:m("response.audio_transcript.done"),event_id:d(),item_id:d(),content_index:k(),transcript:d(),output_index:k(),response_id:d()}),Ku=g({type:m("response.content_part.added"),event_id:d(),item_id:d(),content_index:k(),output_index:k(),response_id:d(),part:g({audio:d().optional(),text:d().optional(),transcript:d().optional(),type:ie(["text","audio"]).optional()})}),ec=g({type:m("response.content_part.done"),event_id:d(),item_id:d(),content_index:k(),output_index:k(),response_id:d(),part:g({audio:d().optional(),text:d().optional(),transcript:d().optional(),type:ie(["text","audio"]).optional()})}),tc=g({type:m("response.created"),event_id:d(),response:la}),pa=g({type:m("response.done"),event_id:d(),response:la,test:lt()}),nc=g({type:m("response.function_call_arguments.delta"),event_id:d(),item_id:d(),call_id:d(),delta:d(),output_index:k(),response_id:d()}),rc=g({type:m("response.function_call_arguments.done"),event_id:d(),item_id:d(),call_id:d(),arguments:d(),output_index:k(),response_id:d()}),sc=g({type:m("response.output_item.added"),event_id:d(),item:Lt,output_index:k(),response_id:d()}),ac=g({type:m("response.output_item.done"),event_id:d(),item:Lt,output_index:k(),response_id:d()}),ic=g({type:m("response.text.delta"),event_id:d(),item_id:d(),content_index:k(),delta:d(),output_index:k(),response_id:d()}),oc=g({type:m("response.text.done"),event_id:d(),item_id:d(),content_index:k(),text:d(),output_index:k(),response_id:d()}),uc=g({type:m("session.created"),event_id:d(),session:U()}),cc=g({type:m("session.updated"),event_id:d(),session:U()}),dc=g({type:m("response.cancel"),event_id:d().optional(),response_id:d().optional()}),lc=g({type:m("response.create"),event_id:d().optional(),response:U().optional()}),pc=g({type:m("session.update"),event_id:d().optional(),session:U()}),fc=g({type:m("transcription_session.update"),event_id:d().optional(),session:U()}),hc=g({type:m("transcription_session.updated"),event_id:d(),session:U()}),mc=g({type:d(),event_id:d().optional().nullable()}).passthrough(),gc=ce("type",[ku,Iu,Au,Cu,Eu,Ou,Nu,Ru,Mu,$u,Ju,Bu,Gu,Vu,zu,qu,Wu,Hu,Yu,Xu,Qu,Ku,ec,tc,pa,nc,rc,sc,ac,ic,oc,uc,cc,hc]);ce("type",[Du,ju,Pu,Zu,Fu,Lu,Uu,dc,lc,pc,fc]);function Tr(n){const e=JSON.parse(n.data.toString()),t=gc.safeParse(e);if(!t.success){const r=mc.safeParse(e);return r.success?{data:r.data,isGeneric:!0}:{data:null,isGeneric:!0}}return{data:t.data,isGeneric:!1}}const fa="gpt-4o-realtime-preview",Ne={voice:"ash",modalities:["text","audio"],inputAudioFormat:"pcm16",outputAudioFormat:"pcm16",inputAudioTranscription:{model:"gpt-4o-mini-transcribe"},turnDetection:{type:"semantic_vad"}};class kr extends pr{constructor(t={}){super();S(this,at);S(this,tn);S(this,pe,null);_(this,"eventEmitter",new En);v(this,at,t.model??fa),v(this,tn,t.apiKey)}get currentModel(){return u(this,at)}set currentModel(t){v(this,at,t)}async _getApiKey(t){const r=t.apiKey??u(this,tn);return typeof r=="function"?await r():r}_onMessage(t){var a,i,o,c,p,l;const{data:r,isGeneric:s}=Tr(t);if(r!==null&&(this.emit("*",r),!s)){if(r.type==="error"?this.emit("error",{type:"error",error:r}):this.emit(r.type,r),r.type==="response.created"){this.emit("turn_started",{type:"response_started",providerData:{...r}});return}if(r.type==="response.done"){const h=pa.safeParse(r);if(!h.success){Oe.error("Error parsing response done event",h.error);return}const f=((a=h.data.response.usage)==null?void 0:a.input_tokens)??0,b=((i=h.data.response.usage)==null?void 0:i.output_tokens)??0,A=f+b,z=new Dn({inputTokens:f,inputTokensDetails:((o=h.data.response.usage)==null?void 0:o.input_tokens_details)??{},outputTokens:b,outputTokensDetails:((c=h.data.response.usage)==null?void 0:c.output_tokens_details)??{},totalTokens:A});this.emit("usage_update",z),this.emit("turn_done",{type:"response_done",response:{id:h.data.response.id??"",output:h.data.response.output??[],usage:{inputTokens:f,inputTokensDetails:((p=h.data.response.usage)==null?void 0:p.input_tokens_details)??{},outputTokens:b,outputTokensDetails:((l=h.data.response.usage)==null?void 0:l.output_tokens_details)??{},totalTokens:A}}});return}if(r.type==="response.audio.done"){this.emit("audio_done");return}if(r.type==="conversation.item.deleted"){this.emit("item_deleted",{itemId:r.item_id});return}if(r.type==="conversation.item.input_audio_transcription.completed"||r.type==="conversation.item.truncated"){this.sendEvent({type:"conversation.item.retrieve",item_id:r.item_id});return}if(r.type==="conversation.item.input_audio_transcription.delta"||r.type==="response.text.delta"||r.type==="response.audio_transcript.delta"||r.type==="response.function_call_arguments.delta"){r.type==="response.audio_transcript.delta"&&this.emit("audio_transcript_delta",{type:"transcript_delta",delta:r.delta,itemId:r.item_id});return}if((r.type==="conversation.item.created"||r.type==="conversation.item.retrieved")&&r.item.type==="message"){const h=r.type==="conversation.item.created"?r.previous_item_id:null,f=ca.parse({itemId:r.item.id,previousItemId:h,type:r.item.type,role:r.item.role,content:r.item.content,status:r.item.status});this.emit("item_update",f);return}if(r.type==="response.output_item.done"||r.type==="response.output_item.added"){const h=r.item;if(h.type==="function_call"&&h.status==="completed"){const f=da.parse({itemId:h.id,type:h.type,status:"in_progress",arguments:h.arguments,name:h.name,output:null});this.emit("item_update",f),this.emit("function_call",{id:h.id,type:"function_call",callId:h.call_id??"",arguments:h.arguments??"",name:h.name??""});return}if(h.type==="message"){const f=ca.parse({itemId:r.item.id,type:r.item.type,role:r.item.role,content:r.item.content,status:"in_progress"});this.emit("item_update",f);return}}}}_onError(t){this.emit("error",{type:"error",error:t})}_onOpen(){this.emit("connected")}_onClose(){this.emit("disconnected")}sendMessage(t,r){this.sendEvent({type:"conversation.item.create",item:typeof t=="string"?{type:"message",role:"user",content:[{type:"input_text",text:t}]}:t,...r}),this.sendEvent({type:"response.create"})}_getMergedSessionConfig(t){var s;return{instructions:t.instructions,model:t.model??u(this,at)??Ne.model,voice:t.voice??Ne.voice,modalities:t.modalities??Ne.modalities,input_audio_format:t.inputAudioFormat??Ne.inputAudioFormat,output_audio_format:t.outputAudioFormat??Ne.outputAudioFormat,input_audio_transcription:t.inputAudioTranscription??Ne.inputAudioTranscription,turn_detection:t.turnDetection??Ne.turnDetection,tool_choice:t.toolChoice??Ne.toolChoice,tools:(s=t.tools)==null?void 0:s.map(a=>({...a,strict:void 0})),...t.providerData??{}}}set _tracingConfig(t){v(this,pe,t)}_updateTracingConfig(t){var r,s,a;if(typeof u(this,pe)>"u"&&v(this,pe,null),t==="auto"){this.sendEvent({type:"session.update",session:{tracing:"auto"}});return}if(typeof u(this,pe)!="string"&&typeof t!="string"){Oe.warn("Tracing config is already set, skipping setting it again. This likely happens when you already set a tracing config on session creation.");return}if(t===null){Oe.debug("Disabling tracing for this session. It cannot be turned on for this session from this point on."),this.sendEvent({type:"session.update",session:{tracing:null}});return}if(u(this,pe)===null||typeof u(this,pe)=="string"){this.sendEvent({type:"session.update",session:{tracing:t}});return}if((t==null?void 0:t.group_id)!==((r=u(this,pe))==null?void 0:r.group_id)||(t==null?void 0:t.metadata)!==((s=u(this,pe))==null?void 0:s.metadata)||(t==null?void 0:t.workflow_name)!==((a=u(this,pe))==null?void 0:a.workflow_name)){Oe.warn("Mismatch in tracing config. Ignoring the new tracing config. This likely happens when you already set a tracing config on session creation. Current tracing config: %s, new tracing config: %s",JSON.stringify(u(this,pe)),JSON.stringify(t));return}this.sendEvent({type:"session.update",session:{tracing:t}})}updateSessionConfig(t){const r=this._getMergedSessionConfig(t);this.sendEvent({type:"session.update",session:r})}sendFunctionCallOutput(t,r,s=!0){this.sendEvent({type:"conversation.item.create",item:{type:"function_call_output",output:r,call_id:t.callId}});try{const a=da.parse({itemId:t.id,previousItemId:t.previousItemId,type:"function_call",status:"completed",arguments:t.arguments,name:t.name,output:r});this.emit("item_update",a)}catch(a){Oe.error("Error parsing tool call item",a,t)}s&&this.sendEvent({type:"response.create"})}sendAudio(t,{commit:r=!1}={}){this.sendEvent({type:"input_audio_buffer.append",audio:At(t)}),r&&this.sendEvent({type:"input_audio_buffer.commit"})}resetHistory(t,r){const{removals:s,additions:a,updates:i}=Ia(t,r),o=new Set(s.map(p=>p.itemId));for(const p of i)o.add(p.itemId);if(o.size>0)for(const p of o)this.sendEvent({type:"conversation.item.delete",item_id:p});const c=[...a,...i];for(const p of c)if(p.type==="message"){const l={type:"message",role:p.role,content:p.content,id:p.itemId};p.role!=="system"&&p.status&&(l.status=p.status),this.sendEvent({type:"conversation.item.create",item:l})}else p.type==="function_call"&&Oe.warn("Function calls cannot be manually added or updated at the moment. Ignoring.")}}at=new WeakMap,tn=new WeakMap,pe=new WeakMap;class ha extends kr{constructor(t={}){if(typeof RTCPeerConnection>"u")throw new Error("WebRTC is not supported in this environment");super(t);_(this,"options");S(this,nn);S(this,q,{status:"disconnected",peerConnection:void 0,dataChannel:void 0});S(this,rn);S(this,bt,!1);S(this,sn,!1);this.options=t,v(this,nn,t.baseUrl??"https://api.openai.com/v1/realtime"),v(this,rn,t.useInsecureApiKey??!1)}get status(){return u(this,q).status}get connectionState(){return u(this,q)}get muted(){return u(this,sn)}async connect(t){if(u(this,q).status==="connected")return;u(this,q).status==="connecting"&&Oe.warn("Realtime connection already in progress. Please await original promise");const r=t.model??this.currentModel;this.currentModel=r;const s=t.url??u(this,nn),a=await this._getApiKey(t),i=typeof a=="string"&&a.startsWith("ek_");if(!u(this,rn)&&!i)throw new Q("Using the WebRTC connection in a browser environment requires an insecure API key. Please use a WebSocket connection instead or set the useInsecureApiKey option to true.");return new Promise(async(o,c)=>{try{const p={...t.initialSessionConfig||{},model:this.currentModel},l=new URL(s),h=new RTCPeerConnection,f=h.createDataChannel("oai-events");v(this,q,{status:"connecting",peerConnection:h,dataChannel:f}),this.emit("connection_change",u(this,q).status),f.addEventListener("open",()=>{v(this,q,{status:"connected",peerConnection:h,dataChannel:f}),this.updateSessionConfig(p),this.emit("connection_change",u(this,q).status),this._onOpen(),o()}),f.addEventListener("error",Pe=>{this.close(),this._onError(Pe),c(Pe)}),f.addEventListener("message",Pe=>{this._onMessage(Pe);const{data:ke,isGeneric:ga}=Tr(Pe);!ke||ga||(ke.type==="response.created"?v(this,bt,!0):ke.type==="response.done"&&v(this,bt,!1),ke.type==="session.created"&&(this._tracingConfig=ke.session.tracing,this._updateTracingConfig(p.tracing??"auto")))});const b=this.options.audioElement??document.createElement("audio");b.autoplay=!0,h.ontrack=Pe=>{b.srcObject=Pe.streams[0]};const A=this.options.mediaStream??await navigator.mediaDevices.getUserMedia({audio:!0});h.addTrack(A.getAudioTracks()[0]);const z=await h.createOffer();if(await h.setLocalDescription(z),!z.sdp)throw new Error("Failed to create offer");const M={...this._getMergedSessionConfig(p),model:this.currentModel},J=new FormData;J.append("sdp",z.sdp),J.append("session",JSON.stringify(M));const ue={type:"answer",sdp:await(await fetch(l,{method:"POST",body:J,headers:{Authorization:`Bearer ${a}`,"X-OpenAI-Agents-SDK":Ea["X-OpenAI-Agents-SDK"]}})).text()};await h.setRemoteDescription(ue)}catch(p){this.close(),this._onError(p),c(p)}})}sendEvent(t){if(!u(this,q).dataChannel||u(this,q).dataChannel.readyState!=="open")throw new Error("WebRTC data channel is not connected. Make sure you call `connect()` before sending events.");u(this,q).dataChannel.send(JSON.stringify(t))}mute(t){v(this,sn,t),u(this,q).peerConnection&&u(this,q).peerConnection.getSenders().forEach(s=>{s.track&&(s.track.enabled=!t)})}close(){if(u(this,q).dataChannel&&u(this,q).dataChannel.close(),u(this,q).peerConnection){const t=u(this,q).peerConnection;t.getSenders().forEach(r=>{var s;(s=r.track)==null||s.stop()}),t.close()}u(this,q).status!=="disconnected"&&(v(this,q,{status:"disconnected",peerConnection:void 0,dataChannel:void 0}),this.emit("connection_change",u(this,q).status),this._onClose())}interrupt(){u(this,bt)&&this.sendEvent({type:"response.cancel"}),this.sendEvent({type:"output_audio_buffer.clear"})}}nn=new WeakMap,q=new WeakMap,rn=new WeakMap,bt=new WeakMap,sn=new WeakMap;const _c=globalThis.WebSocket;class ma extends kr{constructor(t={}){super(t);S(this,Fn);S(this,it);S(this,xt);S(this,K,{status:"disconnected",websocket:void 0});S(this,an);S(this,je);S(this,ot);_(this,"_firstAudioTimestamp");_(this,"_audioLengthMs",0);S(this,St,!1);v(this,xt,`wss://api.openai.com/v1/realtime?model=${this.currentModel}`),v(this,an,t.useInsecureApiKey??!1)}get status(){return u(this,K).status}get connectionState(){return u(this,K)}get muted(){return null}get currentItemId(){return u(this,je)}_onAudio(t){this.emit("audio",t)}async connect(t){const r=t.model??this.currentModel;this.currentModel=r,v(this,it,await this._getApiKey(t)),v(this,xt,t.url??`wss://api.openai.com/v1/realtime?model=${this.currentModel}`);const s={...t.initialSessionConfig||{},model:this.currentModel};await new Promise((a,i)=>{try{$(this,Fn,xa).call(this,a,i,s)}catch(o){i(o)}}),await this.updateSessionConfig(s)}sendEvent(t){if(!u(this,K).websocket)throw new Error("WebSocket is not connected. Make sure you call `connect()` before sending events.");u(this,K).websocket.send(JSON.stringify(t))}close(){var t;(t=u(this,K).websocket)==null||t.close(),v(this,je,void 0),this._firstAudioTimestamp=void 0,this._audioLengthMs=0,v(this,ot,void 0)}mute(t){throw new Error("Mute is not supported for the WebSocket transport. You have to mute the audio input yourself.")}sendAudio(t,r={}){u(this,K).status==="connected"&&super.sendAudio(t,r)}_cancelResponse(){u(this,St)&&this.sendEvent({type:"response.cancel"})}_interrupt(t){this.emit("audio_interrupted"),this.sendEvent({type:"conversation.item.truncate",item_id:u(this,je),content_index:u(this,ot),audio_end_ms:t})}interrupt(){if(!u(this,je)||typeof this._firstAudioTimestamp!="number")return;this._cancelResponse();const t=Date.now()-this._firstAudioTimestamp;console.log(`Interrupting response after ${t}ms`),console.log(`Audio length: ${this._audioLengthMs}ms`),t>=0&&t<this._audioLengthMs&&this._interrupt(t),v(this,je,void 0),this._firstAudioTimestamp=void 0,this._audioLengthMs=0,v(this,ot,void 0)}}it=new WeakMap,xt=new WeakMap,K=new WeakMap,an=new WeakMap,je=new WeakMap,ot=new WeakMap,St=new WeakMap,Fn=new WeakSet,xa=function(t,r,s){if(u(this,K).websocket){t();return}if(!u(this,it))throw new Q("API key is not set. Please call `connect()` with an API key first.");if(!u(this,it).startsWith("ek_")&&!u(this,an))throw new Q("Using the WebSocket connection in a browser environment requires an ephemeral client key. If you have to use a regular API key, set the `useInsecureApiKey` option to true.");const a=["realtime","openai-insecure-api-key."+u(this,it),"openai-beta.realtime-v1",Oa],i=new _c(u(this,xt),a);v(this,K,{status:"connecting",websocket:i}),this.emit("connection_change",u(this,K).status),i.addEventListener("open",()=>{v(this,K,{status:"connected",websocket:i}),this.emit("connection_change",u(this,K).status),this._onOpen(),t()}),i.addEventListener("error",o=>{this._onError(o),v(this,K,{status:"disconnected",websocket:void 0}),this.emit("connection_change",u(this,K).status),r(o)}),i.addEventListener("message",o=>{this._onMessage(o);const{data:c,isGeneric:p}=Tr(o);if(!(!c||p))if(c.type==="response.audio.delta"){v(this,ot,c.content_index),v(this,je,c.item_id),this._firstAudioTimestamp===void 0&&(this._firstAudioTimestamp=Date.now(),this._audioLengthMs=0);const l=Y(c.delta);this._audioLengthMs+=l.byteLength/24/2;const h={type:"audio",data:l,responseId:c.response_id};this._onAudio(h)}else c.type==="input_audio_buffer.speech_started"?this.interrupt():c.type==="response.created"?v(this,St,!0):c.type==="response.done"?v(this,St,!1):c.type==="session.created"&&(this._tracingConfig=c.session.tracing,this._updateTracingConfig(s.tracing??"auto"))}),i.addEventListener("close",()=>{v(this,K,{status:"disconnected",websocket:void 0}),this.emit("connection_change",u(this,K).status),this._onClose()})};class yc extends En{constructor(t,r={}){super();S(this,W);_(this,"initialAgent");_(this,"options");S(this,L);S(this,j);S(this,on,[]);S(this,D);S(this,Tt,[]);S(this,kt);S(this,un,{});S(this,H,[]);S(this,cn);this.initialAgent=t,this.options=r,typeof r.transport>"u"&&Aa()||r.transport==="webrtc"?v(this,L,new ha):r.transport==="websocket"||typeof r.transport>"u"?v(this,L,new ma):v(this,L,r.transport),v(this,j,t),v(this,D,new pt({...r.context??{},history:u(this,H)})),v(this,Tt,(r.outputGuardrails??[]).map(xu)),v(this,kt,bu(r.outputGuardrailSettings??{})),v(this,cn,r.historyStoreAudio??!1)}get transport(){return u(this,L)}get currentAgent(){return u(this,j)}get usage(){return u(this,D).usage}get context(){return u(this,D)}get muted(){return u(this,L).muted}get history(){return u(this,H)}async updateAgent(t){return u(this,j).emit("agent_handoff",u(this,D),t),this.emit("agent_handoff",u(this,D),u(this,j),t),await $(this,W,Ln).call(this,t),await u(this,L).updateSessionConfig(await $(this,W,Un).call(this)),t}async connect(t){await $(this,W,Ln).call(this,this.initialAgent),$(this,W,ka).call(this),await u(this,L).connect({apiKey:t.apiKey??this.options.apiKey,model:this.options.model,initialSessionConfig:await $(this,W,Un).call(this,this.options.config)}),v(this,H,[]),this.emit("history_updated",u(this,H))}updateHistory(t){let r;typeof t=="function"?r=t(u(this,H)):r=t,u(this,L).resetHistory(u(this,H),r)}sendMessage(t,r={}){u(this,L).sendMessage(t,r)}mute(t){u(this,L).mute(t)}close(){u(this,L).close()}sendAudio(t,r={}){u(this,L).sendAudio(t,r)}interrupt(){u(this,L).interrupt()}async approve(t,r={alwaysApprove:!1}){u(this,D).approveTool(t,r);const s=u(this,j).tools.find(a=>a.name===t.rawItem.name);if(s&&s.type==="function")await $(this,W,Jn).call(this,t.rawItem,s);else throw new fe(`Tool ${t.rawItem.name} not found`)}async reject(t,r={alwaysReject:!1}){u(this,D).rejectTool(t,r);const s=u(this,j).tools.find(a=>a.name===t.rawItem.name);if(s&&s.type==="function")await $(this,W,Jn).call(this,t.rawItem,s);else throw new fe(`Tool ${t.rawItem.name} not found`)}}L=new WeakMap,j=new WeakMap,on=new WeakMap,D=new WeakMap,Tt=new WeakMap,kt=new WeakMap,un=new WeakMap,H=new WeakMap,cn=new WeakMap,W=new WeakSet,Ln=async function(t){v(this,j,t);const s=u(this,j).handoffs.map(On).map(a=>a.getHandoffAsFunctionTool());v(this,on,[...(await u(this,j).getAllTools()).filter(a=>a.type==="function"),...s])},Un=async function(t={}){const r=await u(this,j).getSystemPrompt(u(this,D)),s=this.options.tracingDisabled?null:this.options.workflowName?{workflow_name:this.options.workflowName}:"auto";return s!==null&&s!=="auto"?(this.options.groupId&&(s.group_id=this.options.groupId),this.options.traceMetadata&&(s.metadata=this.options.traceMetadata)):(this.options.groupId||this.options.traceMetadata)&&Oe.warn("In order to set traceMetadata or a groupId you need to specify a workflowName."),{instructions:r,voice:u(this,j).voice,model:this.options.model,tools:u(this,on),tracing:s,...t}},Sa=async function(t,r){const s=await r.onInvokeHandoff(u(this,D),t.arguments);u(this,j).emit("agent_handoff",u(this,D),s),this.emit("agent_handoff",u(this,D),u(this,j),s),await $(this,W,Ln).call(this,s),await u(this,L).updateSessionConfig(await $(this,W,Un).call(this));const a=Os(s);return u(this,L).sendFunctionCallOutput(t,a,!0),s},Jn=async function(t,r){u(this,D).context.history=JSON.parse(JSON.stringify(u(this,H)));let s=t.arguments;if(r.parameters&&(qe(r.parameters)?s=r.parameters.parse(s):s=JSON.parse(s)),await r.needsApproval(u(this,D),s,t.callId)){const c=this.context.isToolApproved({toolName:r.name,callId:t.callId});if(c===!1){this.emit("agent_tool_start",u(this,D),u(this,j),r),u(this,j).emit("agent_tool_start",u(this,D),r);const p="Tool execution was not approved.";u(this,L).sendFunctionCallOutput(t,p,!0),this.emit("agent_tool_end",u(this,D),u(this,j),r,p),u(this,j).emit("agent_tool_end",u(this,D),r,p);return}else if(typeof c>"u"){this.emit("tool_approval_requested",u(this,D),u(this,j),{type:"function_approval",tool:r,approvalItem:new tt(t,u(this,j))});return}}this.emit("agent_tool_start",u(this,D),u(this,j),r),u(this,j).emit("agent_tool_start",u(this,D),r),u(this,D).context.history=JSON.parse(JSON.stringify(u(this,H)));const i=await r.invoke(u(this,D),t.arguments),o=We(i);u(this,L).sendFunctionCallOutput(t,o,!0),this.emit("agent_tool_end",u(this,D),u(this,j),r,o),u(this,j).emit("agent_tool_end",u(this,D),r,o)},Ta=async function(t){const r=new Map(u(this,j).handoffs.map(On).map(i=>[i.toolName,i])),s=new Map((await u(this,j).getAllTools()).map(i=>[i.name,i])),a=r.get(t.name);if(a)await $(this,W,Sa).call(this,t,a);else{const i=s.get(t.name);if(i&&i.type==="function")await $(this,W,Jn).call(this,t,i);else throw new fe(`Tool ${t.name} not found`)}},Pr=async function(t){if(u(this,Tt).length===0)return;const r={agent:u(this,j),agentOutput:t,context:u(this,D)},s=await Promise.all(u(this,Tt).map(a=>a.run(r)));for(const a of s)if(a.output.tripwireTriggered){const i=new pn(`Output guardrail triggered: ${JSON.stringify(a.output.outputInfo)}`,a);this.emit("guardrail_tripped",u(this,D),u(this,j),i),this.interrupt();const o=Su(a);this.sendMessage(o);break}},ka=function(){u(this,L).on("*",s=>{this.emit("transport_event",s)}),u(this,L).on("audio",s=>{this.emit("audio",s)}),u(this,L).on("turn_started",()=>{this.emit("agent_start",u(this,D),u(this,j)),u(this,j).emit("agent_start",u(this,D),u(this,j))}),u(this,L).on("turn_done",s=>{const a=s.response.output[s.response.output.length-1],i=Zr(a)??"";this.emit("agent_end",u(this,D),u(this,j),i),u(this,j).emit("agent_end",u(this,D),i),$(this,W,Pr).call(this,i)}),u(this,L).on("audio_done",()=>{this.emit("audio_stopped",u(this,D),u(this,j))});let t=0,r;u(this,L).on("audio_transcript_delta",s=>{try{const a=s.delta,i=s.itemId;r!==i&&(r=i,t=0);const c=(u(this,un)[i]??"")+a;if(u(this,un)[i]=c,u(this,kt).debounceTextLength<0)return;const p=Math.floor(c.length/u(this,kt).debounceTextLength);p>t&&(t=p,$(this,W,Pr).call(this,c))}catch(a){this.emit("error",{type:"error",error:a})}}),u(this,L).on("item_update",s=>{try{const a=!u(this,H).some(i=>i.itemId===s.itemId);if(v(this,H,Ca(u(this,H),s,u(this,cn))),u(this,D).context.history=u(this,H),a){const i=u(this,H).find(o=>o.itemId===s.itemId);i&&this.emit("history_added",i)}this.emit("history_updated",u(this,H))}catch(a){this.emit("error",{type:"error",error:a})}}),u(this,L).on("item_deleted",s=>{try{v(this,H,u(this,H).filter(a=>a.itemId!==s.itemId)),u(this,D).context.history=u(this,H),this.emit("history_updated",u(this,H))}catch(a){this.emit("error",{type:"error",error:a})}}),u(this,L).on("function_call",async s=>{try{await $(this,W,Ta).call(this,s)}catch(a){Oe.error("Error handling function call",a),this.emit("error",{type:"error",error:a})}}),u(this,L).on("usage_update",s=>{u(this,D).usage.add(s)}),u(this,L).on("audio_interrupted",()=>{this.emit("audio_interrupted",u(this,D),u(this,j))}),u(this,L).on("error",s=>{this.emit("error",s)})};const vc={base64ToArrayBuffer:Y,arrayBufferToBase64:At,getLastTextFromAudioOutputMessage:Zr};N.DEFAULT_OPENAI_REALTIME_MODEL=fa,N.DEFAULT_OPENAI_REALTIME_SESSION_CONFIG=Ne,N.ModelBehaviorError=fe,N.OpenAIRealtimeBase=kr,N.OpenAIRealtimeWebRTC=ha,N.OpenAIRealtimeWebSocket=ma,N.OutputGuardrailTripwireTriggered=pn,N.RealtimeAgent=wu,N.RealtimeSession=yc,N.UserError=Q,N.tool=_n,N.utils=vc,Object.defineProperty(N,Symbol.toStringTag,{value:"Module"})});
11
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmFpLXJlYWx0aW1lLWFnZW50cy51bWQuanMiLCJzb3VyY2VzIjpbIi4uL21ldGFkYXRhLm1qcyIsIi4uL3V0aWxzLm1qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9tcy9pbmRleC5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9kZWJ1Zy9zcmMvY29tbW9uLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2RlYnVnL3NyYy9icm93c2VyLmpzIiwiLi4vLi4vLi4vYWdlbnRzLWNvcmUvZGlzdC91dGlscy9zYWZlRXhlY3V0ZS5tanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvb3BlbmFpL2xpYi9wYXJzZXIubWpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL29wZW5haS9fdmVuZG9yL3pvZC10by1qc29uLXNjaGVtYS9PcHRpb25zLm1qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9vcGVuYWkvX3ZlbmRvci96b2QtdG8tanNvbi1zY2hlbWEvdXRpbC5tanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvb3BlbmFpL192ZW5kb3Ivem9kLXRvLWpzb24tc2NoZW1hL1JlZnMubWpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL29wZW5haS9fdmVuZG9yL3pvZC10by1qc29uLXNjaGVtYS9lcnJvck1lc3NhZ2VzLm1qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy96b2QvZGlzdC9lc20vdjMvaGVscGVycy91dGlsLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3pvZC9kaXN0L2VzbS92My9ab2RFcnJvci5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy96b2QvZGlzdC9lc20vdjMvaGVscGVycy9lcnJvclV0aWwuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvem9kL2Rpc3QvZXNtL3YzL3R5cGVzLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL29wZW5haS9fdmVuZG9yL3pvZC10by1qc29uLXNjaGVtYS9wYXJzZXJzL2FueS5tanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvb3BlbmFpL192ZW5kb3Ivem9kLXRvLWpzb24tc2NoZW1hL3BhcnNlcnMvYXJyYXkubWpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL29wZW5haS9fdmVuZG9yL3pvZC10by1qc29uLXNjaGVtYS9wYXJzZXJzL2JpZ2ludC5tanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvb3BlbmFpL192ZW5kb3Ivem9kLXRvLWpzb24tc2NoZW1hL3BhcnNlcnMvYm9vbGVhbi5tanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvb3BlbmFpL192ZW5kb3Ivem9kLXRvLWpzb24tc2NoZW1hL3BhcnNlcnMvYnJhbmRlZC5tanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvb3BlbmFpL192ZW5kb3Ivem9kLXRvLWpzb24tc2NoZW1hL3BhcnNlcnMvY2F0Y2gubWpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL29wZW5haS9fdmVuZG9yL3pvZC10by1qc29uLXNjaGVtYS9wYXJzZXJzL2RhdGUubWpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL29wZW5haS9fdmVuZG9yL3pvZC10by1qc29uLXNjaGVtYS9wYXJzZXJzL2RlZmF1bHQubWpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL29wZW5haS9fdmVuZG9yL3pvZC10by1qc29uLXNjaGVtYS9wYXJzZXJzL2VmZmVjdHMubWpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL29wZW5haS9fdmVuZG9yL3pvZC10by1qc29uLXNjaGVtYS9wYXJzZXJzL2VudW0ubWpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL29wZW5haS9fdmVuZG9yL3pvZC10by1qc29uLXNjaGVtYS9wYXJzZXJzL2ludGVyc2VjdGlvbi5tanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvb3BlbmFpL192ZW5kb3Ivem9kLXRvLWpzb24tc2NoZW1hL3BhcnNlcnMvbGl0ZXJhbC5tanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvb3BlbmFpL192ZW5kb3Ivem9kLXRvLWpzb24tc2NoZW1hL3BhcnNlcnMvc3RyaW5nLm1qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9vcGVuYWkvX3ZlbmRvci96b2QtdG8tanNvbi1zY2hlbWEvcGFyc2Vycy9yZWNvcmQubWpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL29wZW5haS9fdmVuZG9yL3pvZC10by1qc29uLXNjaGVtYS9wYXJzZXJzL21hcC5tanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvb3BlbmFpL192ZW5kb3Ivem9kLXRvLWpzb24tc2NoZW1hL3BhcnNlcnMvbmF0aXZlRW51bS5tanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvb3BlbmFpL192ZW5kb3Ivem9kLXRvLWpzb24tc2NoZW1hL3BhcnNlcnMvbmV2ZXIubWpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL29wZW5haS9fdmVuZG9yL3pvZC10by1qc29uLXNjaGVtYS9wYXJzZXJzL251bGwubWpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL29wZW5haS9fdmVuZG9yL3pvZC10by1qc29uLXNjaGVtYS9wYXJzZXJzL3VuaW9uLm1qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9vcGVuYWkvX3ZlbmRvci96b2QtdG8tanNvbi1zY2hlbWEvcGFyc2Vycy9udWxsYWJsZS5tanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvb3BlbmFpL192ZW5kb3Ivem9kLXRvLWpzb24tc2NoZW1hL3BhcnNlcnMvbnVtYmVyLm1qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9vcGVuYWkvX3ZlbmRvci96b2QtdG8tanNvbi1zY2hlbWEvcGFyc2Vycy9vYmplY3QubWpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL29wZW5haS9fdmVuZG9yL3pvZC10by1qc29uLXNjaGVtYS9wYXJzZXJzL29wdGlvbmFsLm1qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9vcGVuYWkvX3ZlbmRvci96b2QtdG8tanNvbi1zY2hlbWEvcGFyc2Vycy9waXBlbGluZS5tanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvb3BlbmFpL192ZW5kb3Ivem9kLXRvLWpzb24tc2NoZW1hL3BhcnNlcnMvcHJvbWlzZS5tanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvb3BlbmFpL192ZW5kb3Ivem9kLXRvLWpzb24tc2NoZW1hL3BhcnNlcnMvc2V0Lm1qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9vcGVuYWkvX3ZlbmRvci96b2QtdG8tanNvbi1zY2hlbWEvcGFyc2Vycy90dXBsZS5tanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvb3BlbmFpL192ZW5kb3Ivem9kLXRvLWpzb24tc2NoZW1hL3BhcnNlcnMvdW5kZWZpbmVkLm1qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9vcGVuYWkvX3ZlbmRvci96b2QtdG8tanNvbi1zY2hlbWEvcGFyc2Vycy91bmtub3duLm1qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9vcGVuYWkvX3ZlbmRvci96b2QtdG8tanNvbi1zY2hlbWEvcGFyc2Vycy9yZWFkb25seS5tanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvb3BlbmFpL192ZW5kb3Ivem9kLXRvLWpzb24tc2NoZW1hL3BhcnNlRGVmLm1qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9vcGVuYWkvX3ZlbmRvci96b2QtdG8tanNvbi1zY2hlbWEvem9kVG9Kc29uU2NoZW1hLm1qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9vcGVuYWkvbGliL1Jlc3BvbnNlc1BhcnNlci5tanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvb3BlbmFpL2hlbHBlcnMvem9kLm1qcyIsIi4uLy4uLy4uL2FnZW50cy1jb3JlL2Rpc3QvZXJyb3JzLm1qcyIsIi4uLy4uLy4uL2FnZW50cy1jb3JlL2Rpc3QvdXRpbHMvdHlwZUd1YXJkcy5tanMiLCIuLi8uLi8uLi9hZ2VudHMtY29yZS9kaXN0L3V0aWxzL3Rvb2xzLm1qcyIsIi4uLy4uLy4uL2FnZW50cy1jb3JlL2Rpc3QvdHJhY2luZy9jb250ZXh0Lm1qcyIsIi4uLy4uLy4uL2FnZW50cy1jb3JlL2Rpc3QvdHJhY2luZy9wcm9jZXNzb3IubWpzIiwiLi4vLi4vLi4vYWdlbnRzLWNvcmUvZGlzdC90cmFjaW5nL3V0aWxzLm1qcyIsIi4uLy4uLy4uL2FnZW50cy1jb3JlL2Rpc3QvdHJhY2luZy9zcGFucy5tanMiLCIuLi8uLi8uLi9hZ2VudHMtY29yZS9kaXN0L3RyYWNpbmcvdHJhY2VzLm1qcyIsIi4uLy4uLy4uL2FnZW50cy1jb3JlL2Rpc3QvdHJhY2luZy9wcm92aWRlci5tanMiLCIuLi8uLi8uLi9hZ2VudHMtY29yZS9kaXN0L3RyYWNpbmcvY3JlYXRlU3BhbnMubWpzIiwiLi4vLi4vLi4vYWdlbnRzLWNvcmUvZGlzdC90cmFjaW5nL2luZGV4Lm1qcyIsIi4uLy4uLy4uL2FnZW50cy1jb3JlL2Rpc3QvdXRpbHMvc21hcnRTdHJpbmcubWpzIiwiLi4vLi4vLi4vYWdlbnRzLWNvcmUvZGlzdC90b29sLm1qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9Ab3BlbmFpL3pvZC9kaXN0L2VzbS92My9oZWxwZXJzL3V0aWwuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQG9wZW5haS96b2QvZGlzdC9lc20vdjMvWm9kRXJyb3IuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQG9wZW5haS96b2QvZGlzdC9lc20vdjMvbG9jYWxlcy9lbi5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9Ab3BlbmFpL3pvZC9kaXN0L2VzbS92My9lcnJvcnMuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQG9wZW5haS96b2QvZGlzdC9lc20vdjMvaGVscGVycy9wYXJzZVV0aWwuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQG9wZW5haS96b2QvZGlzdC9lc20vdjMvaGVscGVycy9lcnJvclV0aWwuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQG9wZW5haS96b2QvZGlzdC9lc20vdjMvdHlwZXMuanMiLCIuLi8uLi8uLi9hZ2VudHMtY29yZS9kaXN0L21jcC5tanMiLCIuLi8uLi8uLi9hZ2VudHMtY29yZS9kaXN0L3NoaW1zL3NoaW1zLWJyb3dzZXIubWpzIiwiLi4vLi4vLi4vYWdlbnRzLWNvcmUvZGlzdC9jb25maWcubWpzIiwiLi4vLi4vLi4vYWdlbnRzLWNvcmUvZGlzdC9sb2dnZXIubWpzIiwiLi4vLi4vLi4vYWdlbnRzLWNvcmUvZGlzdC9saWZlY3ljbGUubWpzIiwiLi4vLi4vLi4vYWdlbnRzLWNvcmUvZGlzdC9ndWFyZHJhaWwubWpzIiwiLi4vLi4vLi4vYWdlbnRzLWNvcmUvZGlzdC9oYW5kb2ZmLm1qcyIsIi4uLy4uLy4uL2FnZW50cy1jb3JlL2Rpc3QvcHJvdmlkZXJzLm1qcyIsIi4uLy4uLy4uL2FnZW50cy1jb3JlL2Rpc3QvdHlwZXMvcHJvdG9jb2wubWpzIiwiLi4vLi4vLi4vYWdlbnRzLWNvcmUvZGlzdC91c2FnZS5tanMiLCIuLi8uLi8uLi9hZ2VudHMtY29yZS9kaXN0L3J1bkNvbnRleHQubWpzIiwiLi4vLi4vLi4vYWdlbnRzLWNvcmUvZGlzdC9yZXN1bHQubWpzIiwiLi4vLi4vLi4vYWdlbnRzLWNvcmUvZGlzdC91dGlscy9zZXJpYWxpemUubWpzIiwiLi4vLi4vLi4vYWdlbnRzLWNvcmUvZGlzdC9pdGVtcy5tanMiLCIuLi8uLi8uLi9hZ2VudHMtY29yZS9kaXN0L3V0aWxzL21lc3NhZ2VzLm1qcyIsIi4uLy4uLy4uL2FnZW50cy1jb3JlL2Rpc3QvZXZlbnRzLm1qcyIsIi4uLy4uLy4uL2FnZW50cy1jb3JlL2Rpc3QvcnVuSW1wbGVtZW50YXRpb24ubWpzIiwiLi4vLi4vLi4vYWdlbnRzLWNvcmUvZGlzdC9ydW5TdGF0ZS5tanMiLCIuLi8uLi8uLi9hZ2VudHMtY29yZS9kaXN0L3J1bi5tanMiLCIuLi8uLi8uLi9hZ2VudHMtY29yZS9kaXN0L2FnZW50Lm1qcyIsIi4uLy4uLy4uL2FnZW50cy1jb3JlL2Rpc3QvaW5kZXgubWpzIiwiLi4vcmVhbHRpbWVBZ2VudC5tanMiLCIuLi9ndWFyZHJhaWwubWpzIiwiLi4vbG9nZ2VyLm1qcyIsIi4uL2l0ZW1zLm1qcyIsIi4uL29wZW5haVJlYWx0aW1lRXZlbnRzLm1qcyIsIi4uL29wZW5haVJlYWx0aW1lQmFzZS5tanMiLCIuLi9vcGVuYWlSZWFsdGltZVdlYlJ0Yy5tanMiLCIuLi9zaGltcy9zaGltcy1icm93c2VyLm1qcyIsIi4uL29wZW5haVJlYWx0aW1lV2Vic29ja2V0Lm1qcyIsIi4uL3JlYWx0aW1lU2Vzc2lvbi5tanMiLCIuLi9pbmRleC5tanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkXG5leHBvcnQgY29uc3QgTUVUQURBVEEgPSB7XG4gICAgXCJuYW1lXCI6IFwiQG9wZW5haS9hZ2VudHMtcmVhbHRpbWVcIixcbiAgICBcInZlcnNpb25cIjogXCIwLjAuMVwiLFxuICAgIFwidmVyc2lvbnNcIjoge1xuICAgICAgICBcIkBvcGVuYWkvYWdlbnRzLXJlYWx0aW1lXCI6IFwiMC4wLjFcIixcbiAgICAgICAgXCJAb3BlbmFpL2FnZW50cy1jb3JlXCI6IFwid29ya3NwYWNlOipcIlxuICAgIH1cbn07XG5leHBvcnQgZGVmYXVsdCBNRVRBREFUQTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1ldGFkYXRhLm1qcy5tYXAiLCJpbXBvcnQgTUVUQURBVEEgZnJvbSBcIi4vbWV0YWRhdGEubWpzXCI7XG4vKipcbiAqIENvbnZlcnRzIGEgYmFzZTY0IHN0cmluZyB0byBhbiBBcnJheUJ1ZmZlclxuICogQHBhcmFtIHtzdHJpbmd9IGJhc2U2NFxuICogQHJldHVybnMge0FycmF5QnVmZmVyfVxuICovXG5leHBvcnQgZnVuY3Rpb24gYmFzZTY0VG9BcnJheUJ1ZmZlcihiYXNlNjQpIHtcbiAgICBjb25zdCBiaW5hcnlTdHJpbmcgPSBhdG9iKGJhc2U2NCk7XG4gICAgY29uc3QgbGVuID0gYmluYXJ5U3RyaW5nLmxlbmd0aDtcbiAgICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KGxlbik7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBieXRlc1tpXSA9IGJpbmFyeVN0cmluZy5jaGFyQ29kZUF0KGkpO1xuICAgIH1cbiAgICByZXR1cm4gYnl0ZXMuYnVmZmVyO1xufVxuLyoqXG4gKiBDb252ZXJ0cyBhbiBBcnJheUJ1ZmZlciB0byBhIGJhc2U2NCBzdHJpbmdcbiAqIEBwYXJhbSB7QXJyYXlCdWZmZXJ9IGFycmF5QnVmZmVyXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5leHBvcnQgZnVuY3Rpb24gYXJyYXlCdWZmZXJUb0Jhc2U2NChhcnJheUJ1ZmZlcikge1xuICAgIGNvbnN0IGJpbmFyeVN0cmluZyA9IFN0cmluZy5mcm9tQ2hhckNvZGUoLi4ubmV3IFVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIpKTtcbiAgICByZXR1cm4gYnRvYShiaW5hcnlTdHJpbmcpO1xufVxuLyoqXG4gKiBHZXQgdGhlIGxhc3QgdGV4dCBmcm9tIGFuIGF1ZGlvIG91dHB1dCBtZXNzYWdlXG4gKiBAcGFyYW0gaXRlbVxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldExhc3RUZXh0RnJvbUF1ZGlvT3V0cHV0TWVzc2FnZShpdGVtKSB7XG4gICAgaWYgKHR5cGVvZiBpdGVtID09PSAndW5kZWZpbmVkJyB8fFxuICAgICAgICBpdGVtID09PSBudWxsIHx8XG4gICAgICAgIHR5cGVvZiBpdGVtICE9PSAnb2JqZWN0JyB8fFxuICAgICAgICAhKCd0eXBlJyBpbiBpdGVtKSB8fFxuICAgICAgICB0eXBlb2YgaXRlbS50eXBlICE9PSAnc3RyaW5nJyB8fFxuICAgICAgICAhaXRlbS50eXBlKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmIChpdGVtLnR5cGUgIT09ICdtZXNzYWdlJykge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAoISgnY29udGVudCcgaW4gaXRlbSkgfHxcbiAgICAgICAgIUFycmF5LmlzQXJyYXkoaXRlbS5jb250ZW50KSB8fFxuICAgICAgICBpdGVtLmNvbnRlbnQubGVuZ3RoIDwgMSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBsYXN0Q29udGVudEl0ZW0gPSBpdGVtLmNvbnRlbnRbaXRlbS5jb250ZW50Lmxlbmd0aCAtIDFdO1xuICAgIGlmICghKCd0eXBlJyBpbiBsYXN0Q29udGVudEl0ZW0pIHx8XG4gICAgICAgIHR5cGVvZiBsYXN0Q29udGVudEl0ZW0udHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKGxhc3RDb250ZW50SXRlbS50eXBlID09PSAndGV4dCcpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBsYXN0Q29udGVudEl0ZW0udGV4dCA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgID8gbGFzdENvbnRlbnRJdGVtLnRleHRcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAobGFzdENvbnRlbnRJdGVtLnR5cGUgPT09ICdhdWRpbycpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBsYXN0Q29udGVudEl0ZW0udHJhbnNjcmlwdCA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgID8gbGFzdENvbnRlbnRJdGVtLnRyYW5zY3JpcHRcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xufVxuLyoqXG4gKiBDb21wYXJlIHR3byBjb252ZXJzYXRpb24gaGlzdG9yaWVzIHRvIGRldGVybWluZSB0aGUgcmVtb3ZhbHMsIGFkZGl0aW9ucywgYW5kIHVwZGF0ZXMuXG4gKiBAcGFyYW0gb2xkSGlzdG9yeSAtIFRoZSBvbGQgaGlzdG9yeS5cbiAqIEBwYXJhbSBuZXdIaXN0b3J5IC0gVGhlIG5ldyBoaXN0b3J5LlxuICogQHJldHVybnMgQSBkaWZmIG9mIHRoZSB0d28gaGlzdG9yaWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlmZlJlYWx0aW1lSGlzdG9yeShvbGRIaXN0b3J5LCBuZXdIaXN0b3J5KSB7XG4gICAgY29uc3QgcmVtb3ZhbHMgPSBvbGRIaXN0b3J5LmZpbHRlcigoaXRlbSkgPT4gIW5ld0hpc3Rvcnkuc29tZSgobmV3SXRlbSkgPT4gbmV3SXRlbS5pdGVtSWQgPT09IGl0ZW0uaXRlbUlkKSk7XG4gICAgY29uc3QgYWRkaXRpb25zID0gbmV3SGlzdG9yeS5maWx0ZXIoKGl0ZW0pID0+ICFvbGRIaXN0b3J5LnNvbWUoKG9sZEl0ZW0pID0+IG9sZEl0ZW0uaXRlbUlkID09PSBpdGVtLml0ZW1JZCkpO1xuICAgIGNvbnN0IHVwZGF0ZXMgPSBuZXdIaXN0b3J5LmZpbHRlcigoaXRlbSkgPT4gb2xkSGlzdG9yeS5zb21lKChvbGRJdGVtKSA9PiBvbGRJdGVtLml0ZW1JZCA9PT0gaXRlbS5pdGVtSWQgJiZcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkob2xkSXRlbSkgIT09IEpTT04uc3RyaW5naWZ5KGl0ZW0pKSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcmVtb3ZhbHMsXG4gICAgICAgIGFkZGl0aW9ucyxcbiAgICAgICAgdXBkYXRlcyxcbiAgICB9O1xufVxuLyoqXG4gKiBDaGVjayBpZiB0aGUgYnJvd3NlciBzdXBwb3J0cyBXZWJSVEMuXG4gKiBAcmV0dXJucyBUcnVlIGlmIFdlYlJUQyBpcyBzdXBwb3J0ZWQsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc1dlYlJUQ1N1cHBvcnQoKSB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHR5cGVvZiB3aW5kb3dbJ1JUQ1BlZXJDb25uZWN0aW9uJ10gIT09ICd1bmRlZmluZWQnO1xufVxuLyoqXG4gKiBSZW1vdmVzIHRoZSBhdWRpbyBkYXRhIGZyb20gYWxsIGNvbnRlbnQgaW4gYSBtZXNzYWdlIGJ5IHNldHRpbmcgaXQgdG8gbnVsbC5cbiAqIEBwYXJhbSBpdGVtXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlQXVkaW9Gcm9tQ29udGVudChpdGVtKSB7XG4gICAgaWYgKGl0ZW0ucm9sZSA9PT0gJ3N5c3RlbScpIHtcbiAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgfVxuICAgIGlmIChpdGVtLnJvbGUgPT09ICdhc3Npc3RhbnQnKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5pdGVtLFxuICAgICAgICAgICAgY29udGVudDogaXRlbS5jb250ZW50Lm1hcCgoZW50cnkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZW50cnkudHlwZSA9PT0gJ2F1ZGlvJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uZW50cnksXG4gICAgICAgICAgICAgICAgICAgICAgICBhdWRpbzogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5O1xuICAgICAgICAgICAgfSksXG4gICAgICAgIH07XG4gICAgfVxuICAgIGlmIChpdGVtLnJvbGUgPT09ICd1c2VyJykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgICAgIGNvbnRlbnQ6IGl0ZW0uY29udGVudC5tYXAoKGVudHJ5KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGVudHJ5LnR5cGUgPT09ICdpbnB1dF9hdWRpbycpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLmVudHJ5LFxuICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW86IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gaXRlbTtcbn1cbi8qKlxuICogVXBkYXRlcyB0aGUgcmVhbHRpbWUgaGlzdG9yeSBhcnJheSBiYXNlZCBvbiB0aGUgaW5jb21pbmcgZXZlbnQgYW5kIG9wdGlvbnMuXG4gKiBAcGFyYW0gaGlzdG9yeSAtIFRoZSBjdXJyZW50IGhpc3RvcnkgYXJyYXkuXG4gKiBAcGFyYW0gZXZlbnQgLSBUaGUgZXZlbnQgdG8gcHJvY2VzcyAoUmVhbHRpbWVJdGVtKS5cbiAqIEBwYXJhbSBzaG91bGRJbmNsdWRlQXVkaW9EYXRhIC0gV2hldGhlciB0byBpbmNsdWRlIGF1ZGlvIGRhdGEgaW4gbWVzc2FnZSBpdGVtcy5cbiAqIEByZXR1cm5zIFRoZSB1cGRhdGVkIGhpc3RvcnkgYXJyYXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVSZWFsdGltZUhpc3RvcnkoaGlzdG9yeSwgZXZlbnQsIHNob3VsZEluY2x1ZGVBdWRpb0RhdGEpIHtcbiAgICBjb25zdCBuZXdFdmVudCA9ICFzaG91bGRJbmNsdWRlQXVkaW9EYXRhICYmIGV2ZW50LnR5cGUgPT09ICdtZXNzYWdlJ1xuICAgICAgICA/IHJlbW92ZUF1ZGlvRnJvbUNvbnRlbnQoZXZlbnQpXG4gICAgICAgIDogZXZlbnQ7XG4gICAgY29uc3QgZXhpc3RpbmdJbmRleCA9IGhpc3RvcnkuZmluZEluZGV4KChpdGVtKSA9PiBpdGVtLml0ZW1JZCA9PT0gZXZlbnQuaXRlbUlkKTtcbiAgICBpZiAoZXhpc3RpbmdJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgLy8gVXBkYXRlIGV4aXN0aW5nIGl0ZW1cbiAgICAgICAgcmV0dXJuIGhpc3RvcnkubWFwKChpdGVtLCBpZHgpID0+IHtcbiAgICAgICAgICAgIGlmIChpZHggPT09IGV4aXN0aW5nSW5kZXgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3RXZlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXNob3VsZEluY2x1ZGVBdWRpb0RhdGEgJiYgaXRlbS50eXBlID09PSAnbWVzc2FnZScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVtb3ZlQXVkaW9Gcm9tQ29udGVudChpdGVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZXZlbnQucHJldmlvdXNJdGVtSWQpIHtcbiAgICAgICAgLy8gSW5zZXJ0IGFmdGVyIHByZXZpb3VzSXRlbUlkIGlmIGZvdW5kLCBlbHNlIGF0IGVuZFxuICAgICAgICBjb25zdCBwcmV2SW5kZXggPSBoaXN0b3J5LmZpbmRJbmRleCgoaXRlbSkgPT4gaXRlbS5pdGVtSWQgPT09IGV2ZW50LnByZXZpb3VzSXRlbUlkKTtcbiAgICAgICAgaWYgKHByZXZJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgLi4uaGlzdG9yeS5zbGljZSgwLCBwcmV2SW5kZXggKyAxKSxcbiAgICAgICAgICAgICAgICBuZXdFdmVudCxcbiAgICAgICAgICAgICAgICAuLi5oaXN0b3J5LnNsaWNlKHByZXZJbmRleCArIDEpLFxuICAgICAgICAgICAgXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBbLi4uaGlzdG9yeSwgbmV3RXZlbnRdO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gWy4uLmhpc3RvcnksIG5ld0V2ZW50XTtcbiAgICB9XG59XG4vKipcbiAqIFRoZSBoZWFkZXJzIHRvIHVzZSBmb3IgdGhlIFJlYWx0aW1lIEFQSS5cbiAqL1xuZXhwb3J0IGNvbnN0IEhFQURFUlMgPSB7XG4gICAgJ1VzZXItQWdlbnQnOiBgQWdlbnRzL0phdmFTY3JpcHQgJHtNRVRBREFUQS52ZXJzaW9ufWAsXG4gICAgJ1gtT3BlbkFJLUFnZW50cy1TREsnOiBgb3BlbmFpLWFnZW50cy1zZGsuJHtNRVRBREFUQS52ZXJzaW9ufWAsXG59O1xuLyoqXG4gKiBCcm93c2VyIHdlYnNvY2tldCBoZWFkZXJcbiAqL1xuZXhwb3J0IGNvbnN0IFdFQlNPQ0tFVF9NRVRBID0gYG9wZW5haS1hZ2VudHMtc2RrLiR7TUVUQURBVEEudmVyc2lvbn1gO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dXRpbHMubWpzLm1hcCIsIi8qKlxuICogSGVscGVycy5cbiAqL1xuXG52YXIgcyA9IDEwMDA7XG52YXIgbSA9IHMgKiA2MDtcbnZhciBoID0gbSAqIDYwO1xudmFyIGQgPSBoICogMjQ7XG52YXIgdyA9IGQgKiA3O1xudmFyIHkgPSBkICogMzY1LjI1O1xuXG4vKipcbiAqIFBhcnNlIG9yIGZvcm1hdCB0aGUgZ2l2ZW4gYHZhbGAuXG4gKlxuICogT3B0aW9uczpcbiAqXG4gKiAgLSBgbG9uZ2AgdmVyYm9zZSBmb3JtYXR0aW5nIFtmYWxzZV1cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xOdW1iZXJ9IHZhbFxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQHRocm93cyB7RXJyb3J9IHRocm93IGFuIGVycm9yIGlmIHZhbCBpcyBub3QgYSBub24tZW1wdHkgc3RyaW5nIG9yIGEgbnVtYmVyXG4gKiBAcmV0dXJuIHtTdHJpbmd8TnVtYmVyfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh2YWwsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbDtcbiAgaWYgKHR5cGUgPT09ICdzdHJpbmcnICYmIHZhbC5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIHBhcnNlKHZhbCk7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ251bWJlcicgJiYgaXNGaW5pdGUodmFsKSkge1xuICAgIHJldHVybiBvcHRpb25zLmxvbmcgPyBmbXRMb25nKHZhbCkgOiBmbXRTaG9ydCh2YWwpO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihcbiAgICAndmFsIGlzIG5vdCBhIG5vbi1lbXB0eSBzdHJpbmcgb3IgYSB2YWxpZCBudW1iZXIuIHZhbD0nICtcbiAgICAgIEpTT04uc3RyaW5naWZ5KHZhbClcbiAgKTtcbn07XG5cbi8qKlxuICogUGFyc2UgdGhlIGdpdmVuIGBzdHJgIGFuZCByZXR1cm4gbWlsbGlzZWNvbmRzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEByZXR1cm4ge051bWJlcn1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHBhcnNlKHN0cikge1xuICBzdHIgPSBTdHJpbmcoc3RyKTtcbiAgaWYgKHN0ci5sZW5ndGggPiAxMDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIG1hdGNoID0gL14oLT8oPzpcXGQrKT9cXC4/XFxkKykgKihtaWxsaXNlY29uZHM/fG1zZWNzP3xtc3xzZWNvbmRzP3xzZWNzP3xzfG1pbnV0ZXM/fG1pbnM/fG18aG91cnM/fGhycz98aHxkYXlzP3xkfHdlZWtzP3x3fHllYXJzP3x5cnM/fHkpPyQvaS5leGVjKFxuICAgIHN0clxuICApO1xuICBpZiAoIW1hdGNoKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBuID0gcGFyc2VGbG9hdChtYXRjaFsxXSk7XG4gIHZhciB0eXBlID0gKG1hdGNoWzJdIHx8ICdtcycpLnRvTG93ZXJDYXNlKCk7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ3llYXJzJzpcbiAgICBjYXNlICd5ZWFyJzpcbiAgICBjYXNlICd5cnMnOlxuICAgIGNhc2UgJ3lyJzpcbiAgICBjYXNlICd5JzpcbiAgICAgIHJldHVybiBuICogeTtcbiAgICBjYXNlICd3ZWVrcyc6XG4gICAgY2FzZSAnd2Vlayc6XG4gICAgY2FzZSAndyc6XG4gICAgICByZXR1cm4gbiAqIHc7XG4gICAgY2FzZSAnZGF5cyc6XG4gICAgY2FzZSAnZGF5JzpcbiAgICBjYXNlICdkJzpcbiAgICAgIHJldHVybiBuICogZDtcbiAgICBjYXNlICdob3Vycyc6XG4gICAgY2FzZSAnaG91cic6XG4gICAgY2FzZSAnaHJzJzpcbiAgICBjYXNlICdocic6XG4gICAgY2FzZSAnaCc6XG4gICAgICByZXR1cm4gbiAqIGg7XG4gICAgY2FzZSAnbWludXRlcyc6XG4gICAgY2FzZSAnbWludXRlJzpcbiAgICBjYXNlICdtaW5zJzpcbiAgICBjYXNlICdtaW4nOlxuICAgIGNhc2UgJ20nOlxuICAgICAgcmV0dXJuIG4gKiBtO1xuICAgIGNhc2UgJ3NlY29uZHMnOlxuICAgIGNhc2UgJ3NlY29uZCc6XG4gICAgY2FzZSAnc2Vjcyc6XG4gICAgY2FzZSAnc2VjJzpcbiAgICBjYXNlICdzJzpcbiAgICAgIHJldHVybiBuICogcztcbiAgICBjYXNlICdtaWxsaXNlY29uZHMnOlxuICAgIGNhc2UgJ21pbGxpc2Vjb25kJzpcbiAgICBjYXNlICdtc2Vjcyc6XG4gICAgY2FzZSAnbXNlYyc6XG4gICAgY2FzZSAnbXMnOlxuICAgICAgcmV0dXJuIG47XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBTaG9ydCBmb3JtYXQgZm9yIGBtc2AuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IG1zXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBmbXRTaG9ydChtcykge1xuICB2YXIgbXNBYnMgPSBNYXRoLmFicyhtcyk7XG4gIGlmIChtc0FicyA+PSBkKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBkKSArICdkJztcbiAgfVxuICBpZiAobXNBYnMgPj0gaCkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gaCkgKyAnaCc7XG4gIH1cbiAgaWYgKG1zQWJzID49IG0pIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIG0pICsgJ20nO1xuICB9XG4gIGlmIChtc0FicyA+PSBzKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBzKSArICdzJztcbiAgfVxuICByZXR1cm4gbXMgKyAnbXMnO1xufVxuXG4vKipcbiAqIExvbmcgZm9ybWF0IGZvciBgbXNgLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBtc1xuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZm10TG9uZyhtcykge1xuICB2YXIgbXNBYnMgPSBNYXRoLmFicyhtcyk7XG4gIGlmIChtc0FicyA+PSBkKSB7XG4gICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIGQsICdkYXknKTtcbiAgfVxuICBpZiAobXNBYnMgPj0gaCkge1xuICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBoLCAnaG91cicpO1xuICB9XG4gIGlmIChtc0FicyA+PSBtKSB7XG4gICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIG0sICdtaW51dGUnKTtcbiAgfVxuICBpZiAobXNBYnMgPj0gcykge1xuICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBzLCAnc2Vjb25kJyk7XG4gIH1cbiAgcmV0dXJuIG1zICsgJyBtcyc7XG59XG5cbi8qKlxuICogUGx1cmFsaXphdGlvbiBoZWxwZXIuXG4gKi9cblxuZnVuY3Rpb24gcGx1cmFsKG1zLCBtc0FicywgbiwgbmFtZSkge1xuICB2YXIgaXNQbHVyYWwgPSBtc0FicyA+PSBuICogMS41O1xuICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIG4pICsgJyAnICsgbmFtZSArIChpc1BsdXJhbCA/ICdzJyA6ICcnKTtcbn1cbiIsIlxuLyoqXG4gKiBUaGlzIGlzIHRoZSBjb21tb24gbG9naWMgZm9yIGJvdGggdGhlIE5vZGUuanMgYW5kIHdlYiBicm93c2VyXG4gKiBpbXBsZW1lbnRhdGlvbnMgb2YgYGRlYnVnKClgLlxuICovXG5cbmZ1bmN0aW9uIHNldHVwKGVudikge1xuXHRjcmVhdGVEZWJ1Zy5kZWJ1ZyA9IGNyZWF0ZURlYnVnO1xuXHRjcmVhdGVEZWJ1Zy5kZWZhdWx0ID0gY3JlYXRlRGVidWc7XG5cdGNyZWF0ZURlYnVnLmNvZXJjZSA9IGNvZXJjZTtcblx0Y3JlYXRlRGVidWcuZGlzYWJsZSA9IGRpc2FibGU7XG5cdGNyZWF0ZURlYnVnLmVuYWJsZSA9IGVuYWJsZTtcblx0Y3JlYXRlRGVidWcuZW5hYmxlZCA9IGVuYWJsZWQ7XG5cdGNyZWF0ZURlYnVnLmh1bWFuaXplID0gcmVxdWlyZSgnbXMnKTtcblx0Y3JlYXRlRGVidWcuZGVzdHJveSA9IGRlc3Ryb3k7XG5cblx0T2JqZWN0LmtleXMoZW52KS5mb3JFYWNoKGtleSA9PiB7XG5cdFx0Y3JlYXRlRGVidWdba2V5XSA9IGVudltrZXldO1xuXHR9KTtcblxuXHQvKipcblx0KiBUaGUgY3VycmVudGx5IGFjdGl2ZSBkZWJ1ZyBtb2RlIG5hbWVzLCBhbmQgbmFtZXMgdG8gc2tpcC5cblx0Ki9cblxuXHRjcmVhdGVEZWJ1Zy5uYW1lcyA9IFtdO1xuXHRjcmVhdGVEZWJ1Zy5za2lwcyA9IFtdO1xuXG5cdC8qKlxuXHQqIE1hcCBvZiBzcGVjaWFsIFwiJW5cIiBoYW5kbGluZyBmdW5jdGlvbnMsIGZvciB0aGUgZGVidWcgXCJmb3JtYXRcIiBhcmd1bWVudC5cblx0KlxuXHQqIFZhbGlkIGtleSBuYW1lcyBhcmUgYSBzaW5nbGUsIGxvd2VyIG9yIHVwcGVyLWNhc2UgbGV0dGVyLCBpLmUuIFwiblwiIGFuZCBcIk5cIi5cblx0Ki9cblx0Y3JlYXRlRGVidWcuZm9ybWF0dGVycyA9IHt9O1xuXG5cdC8qKlxuXHQqIFNlbGVjdHMgYSBjb2xvciBmb3IgYSBkZWJ1ZyBuYW1lc3BhY2Vcblx0KiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlIFRoZSBuYW1lc3BhY2Ugc3RyaW5nIGZvciB0aGUgZGVidWcgaW5zdGFuY2UgdG8gYmUgY29sb3JlZFxuXHQqIEByZXR1cm4ge051bWJlcnxTdHJpbmd9IEFuIEFOU0kgY29sb3IgY29kZSBmb3IgdGhlIGdpdmVuIG5hbWVzcGFjZVxuXHQqIEBhcGkgcHJpdmF0ZVxuXHQqL1xuXHRmdW5jdGlvbiBzZWxlY3RDb2xvcihuYW1lc3BhY2UpIHtcblx0XHRsZXQgaGFzaCA9IDA7XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IG5hbWVzcGFjZS5sZW5ndGg7IGkrKykge1xuXHRcdFx0aGFzaCA9ICgoaGFzaCA8PCA1KSAtIGhhc2gpICsgbmFtZXNwYWNlLmNoYXJDb2RlQXQoaSk7XG5cdFx0XHRoYXNoIHw9IDA7IC8vIENvbnZlcnQgdG8gMzJiaXQgaW50ZWdlclxuXHRcdH1cblxuXHRcdHJldHVybiBjcmVhdGVEZWJ1Zy5jb2xvcnNbTWF0aC5hYnMoaGFzaCkgJSBjcmVhdGVEZWJ1Zy5jb2xvcnMubGVuZ3RoXTtcblx0fVxuXHRjcmVhdGVEZWJ1Zy5zZWxlY3RDb2xvciA9IHNlbGVjdENvbG9yO1xuXG5cdC8qKlxuXHQqIENyZWF0ZSBhIGRlYnVnZ2VyIHdpdGggdGhlIGdpdmVuIGBuYW1lc3BhY2VgLlxuXHQqXG5cdCogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZVxuXHQqIEByZXR1cm4ge0Z1bmN0aW9ufVxuXHQqIEBhcGkgcHVibGljXG5cdCovXG5cdGZ1bmN0aW9uIGNyZWF0ZURlYnVnKG5hbWVzcGFjZSkge1xuXHRcdGxldCBwcmV2VGltZTtcblx0XHRsZXQgZW5hYmxlT3ZlcnJpZGUgPSBudWxsO1xuXHRcdGxldCBuYW1lc3BhY2VzQ2FjaGU7XG5cdFx0bGV0IGVuYWJsZWRDYWNoZTtcblxuXHRcdGZ1bmN0aW9uIGRlYnVnKC4uLmFyZ3MpIHtcblx0XHRcdC8vIERpc2FibGVkP1xuXHRcdFx0aWYgKCFkZWJ1Zy5lbmFibGVkKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3Qgc2VsZiA9IGRlYnVnO1xuXG5cdFx0XHQvLyBTZXQgYGRpZmZgIHRpbWVzdGFtcFxuXHRcdFx0Y29uc3QgY3VyciA9IE51bWJlcihuZXcgRGF0ZSgpKTtcblx0XHRcdGNvbnN0IG1zID0gY3VyciAtIChwcmV2VGltZSB8fCBjdXJyKTtcblx0XHRcdHNlbGYuZGlmZiA9IG1zO1xuXHRcdFx0c2VsZi5wcmV2ID0gcHJldlRpbWU7XG5cdFx0XHRzZWxmLmN1cnIgPSBjdXJyO1xuXHRcdFx0cHJldlRpbWUgPSBjdXJyO1xuXG5cdFx0XHRhcmdzWzBdID0gY3JlYXRlRGVidWcuY29lcmNlKGFyZ3NbMF0pO1xuXG5cdFx0XHRpZiAodHlwZW9mIGFyZ3NbMF0gIT09ICdzdHJpbmcnKSB7XG5cdFx0XHRcdC8vIEFueXRoaW5nIGVsc2UgbGV0J3MgaW5zcGVjdCB3aXRoICVPXG5cdFx0XHRcdGFyZ3MudW5zaGlmdCgnJU8nKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQXBwbHkgYW55IGBmb3JtYXR0ZXJzYCB0cmFuc2Zvcm1hdGlvbnNcblx0XHRcdGxldCBpbmRleCA9IDA7XG5cdFx0XHRhcmdzWzBdID0gYXJnc1swXS5yZXBsYWNlKC8lKFthLXpBLVolXSkvZywgKG1hdGNoLCBmb3JtYXQpID0+IHtcblx0XHRcdFx0Ly8gSWYgd2UgZW5jb3VudGVyIGFuIGVzY2FwZWQgJSB0aGVuIGRvbid0IGluY3JlYXNlIHRoZSBhcnJheSBpbmRleFxuXHRcdFx0XHRpZiAobWF0Y2ggPT09ICclJScpIHtcblx0XHRcdFx0XHRyZXR1cm4gJyUnO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGluZGV4Kys7XG5cdFx0XHRcdGNvbnN0IGZvcm1hdHRlciA9IGNyZWF0ZURlYnVnLmZvcm1hdHRlcnNbZm9ybWF0XTtcblx0XHRcdFx0aWYgKHR5cGVvZiBmb3JtYXR0ZXIgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdFx0XHRjb25zdCB2YWwgPSBhcmdzW2luZGV4XTtcblx0XHRcdFx0XHRtYXRjaCA9IGZvcm1hdHRlci5jYWxsKHNlbGYsIHZhbCk7XG5cblx0XHRcdFx0XHQvLyBOb3cgd2UgbmVlZCB0byByZW1vdmUgYGFyZ3NbaW5kZXhdYCBzaW5jZSBpdCdzIGlubGluZWQgaW4gdGhlIGBmb3JtYXRgXG5cdFx0XHRcdFx0YXJncy5zcGxpY2UoaW5kZXgsIDEpO1xuXHRcdFx0XHRcdGluZGV4LS07XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIG1hdGNoO1xuXHRcdFx0fSk7XG5cblx0XHRcdC8vIEFwcGx5IGVudi1zcGVjaWZpYyBmb3JtYXR0aW5nIChjb2xvcnMsIGV0Yy4pXG5cdFx0XHRjcmVhdGVEZWJ1Zy5mb3JtYXRBcmdzLmNhbGwoc2VsZiwgYXJncyk7XG5cblx0XHRcdGNvbnN0IGxvZ0ZuID0gc2VsZi5sb2cgfHwgY3JlYXRlRGVidWcubG9nO1xuXHRcdFx0bG9nRm4uYXBwbHkoc2VsZiwgYXJncyk7XG5cdFx0fVxuXG5cdFx0ZGVidWcubmFtZXNwYWNlID0gbmFtZXNwYWNlO1xuXHRcdGRlYnVnLnVzZUNvbG9ycyA9IGNyZWF0ZURlYnVnLnVzZUNvbG9ycygpO1xuXHRcdGRlYnVnLmNvbG9yID0gY3JlYXRlRGVidWcuc2VsZWN0Q29sb3IobmFtZXNwYWNlKTtcblx0XHRkZWJ1Zy5leHRlbmQgPSBleHRlbmQ7XG5cdFx0ZGVidWcuZGVzdHJveSA9IGNyZWF0ZURlYnVnLmRlc3Ryb3k7IC8vIFhYWCBUZW1wb3JhcnkuIFdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciByZWxlYXNlLlxuXG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGRlYnVnLCAnZW5hYmxlZCcsIHtcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuXHRcdFx0Z2V0OiAoKSA9PiB7XG5cdFx0XHRcdGlmIChlbmFibGVPdmVycmlkZSAhPT0gbnVsbCkge1xuXHRcdFx0XHRcdHJldHVybiBlbmFibGVPdmVycmlkZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAobmFtZXNwYWNlc0NhY2hlICE9PSBjcmVhdGVEZWJ1Zy5uYW1lc3BhY2VzKSB7XG5cdFx0XHRcdFx0bmFtZXNwYWNlc0NhY2hlID0gY3JlYXRlRGVidWcubmFtZXNwYWNlcztcblx0XHRcdFx0XHRlbmFibGVkQ2FjaGUgPSBjcmVhdGVEZWJ1Zy5lbmFibGVkKG5hbWVzcGFjZSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gZW5hYmxlZENhY2hlO1xuXHRcdFx0fSxcblx0XHRcdHNldDogdiA9PiB7XG5cdFx0XHRcdGVuYWJsZU92ZXJyaWRlID0gdjtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdC8vIEVudi1zcGVjaWZpYyBpbml0aWFsaXphdGlvbiBsb2dpYyBmb3IgZGVidWcgaW5zdGFuY2VzXG5cdFx0aWYgKHR5cGVvZiBjcmVhdGVEZWJ1Zy5pbml0ID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRjcmVhdGVEZWJ1Zy5pbml0KGRlYnVnKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZGVidWc7XG5cdH1cblxuXHRmdW5jdGlvbiBleHRlbmQobmFtZXNwYWNlLCBkZWxpbWl0ZXIpIHtcblx0XHRjb25zdCBuZXdEZWJ1ZyA9IGNyZWF0ZURlYnVnKHRoaXMubmFtZXNwYWNlICsgKHR5cGVvZiBkZWxpbWl0ZXIgPT09ICd1bmRlZmluZWQnID8gJzonIDogZGVsaW1pdGVyKSArIG5hbWVzcGFjZSk7XG5cdFx0bmV3RGVidWcubG9nID0gdGhpcy5sb2c7XG5cdFx0cmV0dXJuIG5ld0RlYnVnO1xuXHR9XG5cblx0LyoqXG5cdCogRW5hYmxlcyBhIGRlYnVnIG1vZGUgYnkgbmFtZXNwYWNlcy4gVGhpcyBjYW4gaW5jbHVkZSBtb2Rlc1xuXHQqIHNlcGFyYXRlZCBieSBhIGNvbG9uIGFuZCB3aWxkY2FyZHMuXG5cdCpcblx0KiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlc1xuXHQqIEBhcGkgcHVibGljXG5cdCovXG5cdGZ1bmN0aW9uIGVuYWJsZShuYW1lc3BhY2VzKSB7XG5cdFx0Y3JlYXRlRGVidWcuc2F2ZShuYW1lc3BhY2VzKTtcblx0XHRjcmVhdGVEZWJ1Zy5uYW1lc3BhY2VzID0gbmFtZXNwYWNlcztcblxuXHRcdGNyZWF0ZURlYnVnLm5hbWVzID0gW107XG5cdFx0Y3JlYXRlRGVidWcuc2tpcHMgPSBbXTtcblxuXHRcdGNvbnN0IHNwbGl0ID0gKHR5cGVvZiBuYW1lc3BhY2VzID09PSAnc3RyaW5nJyA/IG5hbWVzcGFjZXMgOiAnJylcblx0XHRcdC50cmltKClcblx0XHRcdC5yZXBsYWNlKCcgJywgJywnKVxuXHRcdFx0LnNwbGl0KCcsJylcblx0XHRcdC5maWx0ZXIoQm9vbGVhbik7XG5cblx0XHRmb3IgKGNvbnN0IG5zIG9mIHNwbGl0KSB7XG5cdFx0XHRpZiAobnNbMF0gPT09ICctJykge1xuXHRcdFx0XHRjcmVhdGVEZWJ1Zy5za2lwcy5wdXNoKG5zLnNsaWNlKDEpKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNyZWF0ZURlYnVnLm5hbWVzLnB1c2gobnMpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgdGhlIGdpdmVuIHN0cmluZyBtYXRjaGVzIGEgbmFtZXNwYWNlIHRlbXBsYXRlLCBob25vcmluZ1xuXHQgKiBhc3Rlcmlza3MgYXMgd2lsZGNhcmRzLlxuXHQgKlxuXHQgKiBAcGFyYW0ge1N0cmluZ30gc2VhcmNoXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSB0ZW1wbGF0ZVxuXHQgKiBAcmV0dXJuIHtCb29sZWFufVxuXHQgKi9cblx0ZnVuY3Rpb24gbWF0Y2hlc1RlbXBsYXRlKHNlYXJjaCwgdGVtcGxhdGUpIHtcblx0XHRsZXQgc2VhcmNoSW5kZXggPSAwO1xuXHRcdGxldCB0ZW1wbGF0ZUluZGV4ID0gMDtcblx0XHRsZXQgc3RhckluZGV4ID0gLTE7XG5cdFx0bGV0IG1hdGNoSW5kZXggPSAwO1xuXG5cdFx0d2hpbGUgKHNlYXJjaEluZGV4IDwgc2VhcmNoLmxlbmd0aCkge1xuXHRcdFx0aWYgKHRlbXBsYXRlSW5kZXggPCB0ZW1wbGF0ZS5sZW5ndGggJiYgKHRlbXBsYXRlW3RlbXBsYXRlSW5kZXhdID09PSBzZWFyY2hbc2VhcmNoSW5kZXhdIHx8IHRlbXBsYXRlW3RlbXBsYXRlSW5kZXhdID09PSAnKicpKSB7XG5cdFx0XHRcdC8vIE1hdGNoIGNoYXJhY3RlciBvciBwcm9jZWVkIHdpdGggd2lsZGNhcmRcblx0XHRcdFx0aWYgKHRlbXBsYXRlW3RlbXBsYXRlSW5kZXhdID09PSAnKicpIHtcblx0XHRcdFx0XHRzdGFySW5kZXggPSB0ZW1wbGF0ZUluZGV4O1xuXHRcdFx0XHRcdG1hdGNoSW5kZXggPSBzZWFyY2hJbmRleDtcblx0XHRcdFx0XHR0ZW1wbGF0ZUluZGV4Kys7IC8vIFNraXAgdGhlICcqJ1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHNlYXJjaEluZGV4Kys7XG5cdFx0XHRcdFx0dGVtcGxhdGVJbmRleCsrO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKHN0YXJJbmRleCAhPT0gLTEpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZWdhdGVkLWNvbmRpdGlvblxuXHRcdFx0XHQvLyBCYWNrdHJhY2sgdG8gdGhlIGxhc3QgJyonIGFuZCB0cnkgdG8gbWF0Y2ggbW9yZSBjaGFyYWN0ZXJzXG5cdFx0XHRcdHRlbXBsYXRlSW5kZXggPSBzdGFySW5kZXggKyAxO1xuXHRcdFx0XHRtYXRjaEluZGV4Kys7XG5cdFx0XHRcdHNlYXJjaEluZGV4ID0gbWF0Y2hJbmRleDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTsgLy8gTm8gbWF0Y2hcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBIYW5kbGUgdHJhaWxpbmcgJyonIGluIHRlbXBsYXRlXG5cdFx0d2hpbGUgKHRlbXBsYXRlSW5kZXggPCB0ZW1wbGF0ZS5sZW5ndGggJiYgdGVtcGxhdGVbdGVtcGxhdGVJbmRleF0gPT09ICcqJykge1xuXHRcdFx0dGVtcGxhdGVJbmRleCsrO1xuXHRcdH1cblxuXHRcdHJldHVybiB0ZW1wbGF0ZUluZGV4ID09PSB0ZW1wbGF0ZS5sZW5ndGg7XG5cdH1cblxuXHQvKipcblx0KiBEaXNhYmxlIGRlYnVnIG91dHB1dC5cblx0KlxuXHQqIEByZXR1cm4ge1N0cmluZ30gbmFtZXNwYWNlc1xuXHQqIEBhcGkgcHVibGljXG5cdCovXG5cdGZ1bmN0aW9uIGRpc2FibGUoKSB7XG5cdFx0Y29uc3QgbmFtZXNwYWNlcyA9IFtcblx0XHRcdC4uLmNyZWF0ZURlYnVnLm5hbWVzLFxuXHRcdFx0Li4uY3JlYXRlRGVidWcuc2tpcHMubWFwKG5hbWVzcGFjZSA9PiAnLScgKyBuYW1lc3BhY2UpXG5cdFx0XS5qb2luKCcsJyk7XG5cdFx0Y3JlYXRlRGVidWcuZW5hYmxlKCcnKTtcblx0XHRyZXR1cm4gbmFtZXNwYWNlcztcblx0fVxuXG5cdC8qKlxuXHQqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gbW9kZSBuYW1lIGlzIGVuYWJsZWQsIGZhbHNlIG90aGVyd2lzZS5cblx0KlxuXHQqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG5cdCogQHJldHVybiB7Qm9vbGVhbn1cblx0KiBAYXBpIHB1YmxpY1xuXHQqL1xuXHRmdW5jdGlvbiBlbmFibGVkKG5hbWUpIHtcblx0XHRmb3IgKGNvbnN0IHNraXAgb2YgY3JlYXRlRGVidWcuc2tpcHMpIHtcblx0XHRcdGlmIChtYXRjaGVzVGVtcGxhdGUobmFtZSwgc2tpcCkpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgbnMgb2YgY3JlYXRlRGVidWcubmFtZXMpIHtcblx0XHRcdGlmIChtYXRjaGVzVGVtcGxhdGUobmFtZSwgbnMpKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdC8qKlxuXHQqIENvZXJjZSBgdmFsYC5cblx0KlxuXHQqIEBwYXJhbSB7TWl4ZWR9IHZhbFxuXHQqIEByZXR1cm4ge01peGVkfVxuXHQqIEBhcGkgcHJpdmF0ZVxuXHQqL1xuXHRmdW5jdGlvbiBjb2VyY2UodmFsKSB7XG5cdFx0aWYgKHZhbCBpbnN0YW5jZW9mIEVycm9yKSB7XG5cdFx0XHRyZXR1cm4gdmFsLnN0YWNrIHx8IHZhbC5tZXNzYWdlO1xuXHRcdH1cblx0XHRyZXR1cm4gdmFsO1xuXHR9XG5cblx0LyoqXG5cdCogWFhYIERPIE5PVCBVU0UuIFRoaXMgaXMgYSB0ZW1wb3Jhcnkgc3R1YiBmdW5jdGlvbi5cblx0KiBYWFggSXQgV0lMTCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHJlbGVhc2UuXG5cdCovXG5cdGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG5cdFx0Y29uc29sZS53YXJuKCdJbnN0YW5jZSBtZXRob2QgYGRlYnVnLmRlc3Ryb3koKWAgaXMgZGVwcmVjYXRlZCBhbmQgbm8gbG9uZ2VyIGRvZXMgYW55dGhpbmcuIEl0IHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uIG9mIGBkZWJ1Z2AuJyk7XG5cdH1cblxuXHRjcmVhdGVEZWJ1Zy5lbmFibGUoY3JlYXRlRGVidWcubG9hZCgpKTtcblxuXHRyZXR1cm4gY3JlYXRlRGVidWc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2V0dXA7XG4iLCIvKiBlc2xpbnQtZW52IGJyb3dzZXIgKi9cblxuLyoqXG4gKiBUaGlzIGlzIHRoZSB3ZWIgYnJvd3NlciBpbXBsZW1lbnRhdGlvbiBvZiBgZGVidWcoKWAuXG4gKi9cblxuZXhwb3J0cy5mb3JtYXRBcmdzID0gZm9ybWF0QXJncztcbmV4cG9ydHMuc2F2ZSA9IHNhdmU7XG5leHBvcnRzLmxvYWQgPSBsb2FkO1xuZXhwb3J0cy51c2VDb2xvcnMgPSB1c2VDb2xvcnM7XG5leHBvcnRzLnN0b3JhZ2UgPSBsb2NhbHN0b3JhZ2UoKTtcbmV4cG9ydHMuZGVzdHJveSA9ICgoKSA9PiB7XG5cdGxldCB3YXJuZWQgPSBmYWxzZTtcblxuXHRyZXR1cm4gKCkgPT4ge1xuXHRcdGlmICghd2FybmVkKSB7XG5cdFx0XHR3YXJuZWQgPSB0cnVlO1xuXHRcdFx0Y29uc29sZS53YXJuKCdJbnN0YW5jZSBtZXRob2QgYGRlYnVnLmRlc3Ryb3koKWAgaXMgZGVwcmVjYXRlZCBhbmQgbm8gbG9uZ2VyIGRvZXMgYW55dGhpbmcuIEl0IHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uIG9mIGBkZWJ1Z2AuJyk7XG5cdFx0fVxuXHR9O1xufSkoKTtcblxuLyoqXG4gKiBDb2xvcnMuXG4gKi9cblxuZXhwb3J0cy5jb2xvcnMgPSBbXG5cdCcjMDAwMENDJyxcblx0JyMwMDAwRkYnLFxuXHQnIzAwMzNDQycsXG5cdCcjMDAzM0ZGJyxcblx0JyMwMDY2Q0MnLFxuXHQnIzAwNjZGRicsXG5cdCcjMDA5OUNDJyxcblx0JyMwMDk5RkYnLFxuXHQnIzAwQ0MwMCcsXG5cdCcjMDBDQzMzJyxcblx0JyMwMENDNjYnLFxuXHQnIzAwQ0M5OScsXG5cdCcjMDBDQ0NDJyxcblx0JyMwMENDRkYnLFxuXHQnIzMzMDBDQycsXG5cdCcjMzMwMEZGJyxcblx0JyMzMzMzQ0MnLFxuXHQnIzMzMzNGRicsXG5cdCcjMzM2NkNDJyxcblx0JyMzMzY2RkYnLFxuXHQnIzMzOTlDQycsXG5cdCcjMzM5OUZGJyxcblx0JyMzM0NDMDAnLFxuXHQnIzMzQ0MzMycsXG5cdCcjMzNDQzY2Jyxcblx0JyMzM0NDOTknLFxuXHQnIzMzQ0NDQycsXG5cdCcjMzNDQ0ZGJyxcblx0JyM2NjAwQ0MnLFxuXHQnIzY2MDBGRicsXG5cdCcjNjYzM0NDJyxcblx0JyM2NjMzRkYnLFxuXHQnIzY2Q0MwMCcsXG5cdCcjNjZDQzMzJyxcblx0JyM5OTAwQ0MnLFxuXHQnIzk5MDBGRicsXG5cdCcjOTkzM0NDJyxcblx0JyM5OTMzRkYnLFxuXHQnIzk5Q0MwMCcsXG5cdCcjOTlDQzMzJyxcblx0JyNDQzAwMDAnLFxuXHQnI0NDMDAzMycsXG5cdCcjQ0MwMDY2Jyxcblx0JyNDQzAwOTknLFxuXHQnI0NDMDBDQycsXG5cdCcjQ0MwMEZGJyxcblx0JyNDQzMzMDAnLFxuXHQnI0NDMzMzMycsXG5cdCcjQ0MzMzY2Jyxcblx0JyNDQzMzOTknLFxuXHQnI0NDMzNDQycsXG5cdCcjQ0MzM0ZGJyxcblx0JyNDQzY2MDAnLFxuXHQnI0NDNjYzMycsXG5cdCcjQ0M5OTAwJyxcblx0JyNDQzk5MzMnLFxuXHQnI0NDQ0MwMCcsXG5cdCcjQ0NDQzMzJyxcblx0JyNGRjAwMDAnLFxuXHQnI0ZGMDAzMycsXG5cdCcjRkYwMDY2Jyxcblx0JyNGRjAwOTknLFxuXHQnI0ZGMDBDQycsXG5cdCcjRkYwMEZGJyxcblx0JyNGRjMzMDAnLFxuXHQnI0ZGMzMzMycsXG5cdCcjRkYzMzY2Jyxcblx0JyNGRjMzOTknLFxuXHQnI0ZGMzNDQycsXG5cdCcjRkYzM0ZGJyxcblx0JyNGRjY2MDAnLFxuXHQnI0ZGNjYzMycsXG5cdCcjRkY5OTAwJyxcblx0JyNGRjk5MzMnLFxuXHQnI0ZGQ0MwMCcsXG5cdCcjRkZDQzMzJ1xuXTtcblxuLyoqXG4gKiBDdXJyZW50bHkgb25seSBXZWJLaXQtYmFzZWQgV2ViIEluc3BlY3RvcnMsIEZpcmVmb3ggPj0gdjMxLFxuICogYW5kIHRoZSBGaXJlYnVnIGV4dGVuc2lvbiAoYW55IEZpcmVmb3ggdmVyc2lvbikgYXJlIGtub3duXG4gKiB0byBzdXBwb3J0IFwiJWNcIiBDU1MgY3VzdG9taXphdGlvbnMuXG4gKlxuICogVE9ETzogYWRkIGEgYGxvY2FsU3RvcmFnZWAgdmFyaWFibGUgdG8gZXhwbGljaXRseSBlbmFibGUvZGlzYWJsZSBjb2xvcnNcbiAqL1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuZnVuY3Rpb24gdXNlQ29sb3JzKCkge1xuXHQvLyBOQjogSW4gYW4gRWxlY3Ryb24gcHJlbG9hZCBzY3JpcHQsIGRvY3VtZW50IHdpbGwgYmUgZGVmaW5lZCBidXQgbm90IGZ1bGx5XG5cdC8vIGluaXRpYWxpemVkLiBTaW5jZSB3ZSBrbm93IHdlJ3JlIGluIENocm9tZSwgd2UnbGwganVzdCBkZXRlY3QgdGhpcyBjYXNlXG5cdC8vIGV4cGxpY2l0bHlcblx0aWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5wcm9jZXNzICYmICh3aW5kb3cucHJvY2Vzcy50eXBlID09PSAncmVuZGVyZXInIHx8IHdpbmRvdy5wcm9jZXNzLl9fbndqcykpIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdC8vIEludGVybmV0IEV4cGxvcmVyIGFuZCBFZGdlIGRvIG5vdCBzdXBwb3J0IGNvbG9ycy5cblx0aWYgKHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvci51c2VyQWdlbnQgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLm1hdGNoKC8oZWRnZXx0cmlkZW50KVxcLyhcXGQrKS8pKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0bGV0IG07XG5cblx0Ly8gSXMgd2Via2l0PyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xNjQ1OTYwNi8zNzY3NzNcblx0Ly8gZG9jdW1lbnQgaXMgdW5kZWZpbmVkIGluIHJlYWN0LW5hdGl2ZTogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0LW5hdGl2ZS9wdWxsLzE2MzJcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJldHVybi1hc3NpZ25cblx0cmV0dXJuICh0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLldlYmtpdEFwcGVhcmFuY2UpIHx8XG5cdFx0Ly8gSXMgZmlyZWJ1Zz8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMzk4MTIwLzM3Njc3M1xuXHRcdCh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuY29uc29sZSAmJiAod2luZG93LmNvbnNvbGUuZmlyZWJ1ZyB8fCAod2luZG93LmNvbnNvbGUuZXhjZXB0aW9uICYmIHdpbmRvdy5jb25zb2xlLnRhYmxlKSkpIHx8XG5cdFx0Ly8gSXMgZmlyZWZveCA+PSB2MzE/XG5cdFx0Ly8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9Ub29scy9XZWJfQ29uc29sZSNTdHlsaW5nX21lc3NhZ2VzXG5cdFx0KHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvci51c2VyQWdlbnQgJiYgKG0gPSBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkubWF0Y2goL2ZpcmVmb3hcXC8oXFxkKykvKSkgJiYgcGFyc2VJbnQobVsxXSwgMTApID49IDMxKSB8fFxuXHRcdC8vIERvdWJsZSBjaGVjayB3ZWJraXQgaW4gdXNlckFnZW50IGp1c3QgaW4gY2FzZSB3ZSBhcmUgaW4gYSB3b3JrZXJcblx0XHQodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCAmJiBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkubWF0Y2goL2FwcGxld2Via2l0XFwvKFxcZCspLykpO1xufVxuXG4vKipcbiAqIENvbG9yaXplIGxvZyBhcmd1bWVudHMgaWYgZW5hYmxlZC5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGZvcm1hdEFyZ3MoYXJncykge1xuXHRhcmdzWzBdID0gKHRoaXMudXNlQ29sb3JzID8gJyVjJyA6ICcnKSArXG5cdFx0dGhpcy5uYW1lc3BhY2UgK1xuXHRcdCh0aGlzLnVzZUNvbG9ycyA/ICcgJWMnIDogJyAnKSArXG5cdFx0YXJnc1swXSArXG5cdFx0KHRoaXMudXNlQ29sb3JzID8gJyVjICcgOiAnICcpICtcblx0XHQnKycgKyBtb2R1bGUuZXhwb3J0cy5odW1hbml6ZSh0aGlzLmRpZmYpO1xuXG5cdGlmICghdGhpcy51c2VDb2xvcnMpIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRjb25zdCBjID0gJ2NvbG9yOiAnICsgdGhpcy5jb2xvcjtcblx0YXJncy5zcGxpY2UoMSwgMCwgYywgJ2NvbG9yOiBpbmhlcml0Jyk7XG5cblx0Ly8gVGhlIGZpbmFsIFwiJWNcIiBpcyBzb21ld2hhdCB0cmlja3ksIGJlY2F1c2UgdGhlcmUgY291bGQgYmUgb3RoZXJcblx0Ly8gYXJndW1lbnRzIHBhc3NlZCBlaXRoZXIgYmVmb3JlIG9yIGFmdGVyIHRoZSAlYywgc28gd2UgbmVlZCB0b1xuXHQvLyBmaWd1cmUgb3V0IHRoZSBjb3JyZWN0IGluZGV4IHRvIGluc2VydCB0aGUgQ1NTIGludG9cblx0bGV0IGluZGV4ID0gMDtcblx0bGV0IGxhc3RDID0gMDtcblx0YXJnc1swXS5yZXBsYWNlKC8lW2EtekEtWiVdL2csIG1hdGNoID0+IHtcblx0XHRpZiAobWF0Y2ggPT09ICclJScpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0aW5kZXgrKztcblx0XHRpZiAobWF0Y2ggPT09ICclYycpIHtcblx0XHRcdC8vIFdlIG9ubHkgYXJlIGludGVyZXN0ZWQgaW4gdGhlICpsYXN0KiAlY1xuXHRcdFx0Ly8gKHRoZSB1c2VyIG1heSBoYXZlIHByb3ZpZGVkIHRoZWlyIG93bilcblx0XHRcdGxhc3RDID0gaW5kZXg7XG5cdFx0fVxuXHR9KTtcblxuXHRhcmdzLnNwbGljZShsYXN0QywgMCwgYyk7XG59XG5cbi8qKlxuICogSW52b2tlcyBgY29uc29sZS5kZWJ1ZygpYCB3aGVuIGF2YWlsYWJsZS5cbiAqIE5vLW9wIHdoZW4gYGNvbnNvbGUuZGVidWdgIGlzIG5vdCBhIFwiZnVuY3Rpb25cIi5cbiAqIElmIGBjb25zb2xlLmRlYnVnYCBpcyBub3QgYXZhaWxhYmxlLCBmYWxscyBiYWNrXG4gKiB0byBgY29uc29sZS5sb2dgLlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cbmV4cG9ydHMubG9nID0gY29uc29sZS5kZWJ1ZyB8fCBjb25zb2xlLmxvZyB8fCAoKCkgPT4ge30pO1xuXG4vKipcbiAqIFNhdmUgYG5hbWVzcGFjZXNgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2VzXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gc2F2ZShuYW1lc3BhY2VzKSB7XG5cdHRyeSB7XG5cdFx0aWYgKG5hbWVzcGFjZXMpIHtcblx0XHRcdGV4cG9ydHMuc3RvcmFnZS5zZXRJdGVtKCdkZWJ1ZycsIG5hbWVzcGFjZXMpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRleHBvcnRzLnN0b3JhZ2UucmVtb3ZlSXRlbSgnZGVidWcnKTtcblx0XHR9XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0Ly8gU3dhbGxvd1xuXHRcdC8vIFhYWCAoQFFpeC0pIHNob3VsZCB3ZSBiZSBsb2dnaW5nIHRoZXNlP1xuXHR9XG59XG5cbi8qKlxuICogTG9hZCBgbmFtZXNwYWNlc2AuXG4gKlxuICogQHJldHVybiB7U3RyaW5nfSByZXR1cm5zIHRoZSBwcmV2aW91c2x5IHBlcnNpc3RlZCBkZWJ1ZyBtb2Rlc1xuICogQGFwaSBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGxvYWQoKSB7XG5cdGxldCByO1xuXHR0cnkge1xuXHRcdHIgPSBleHBvcnRzLnN0b3JhZ2UuZ2V0SXRlbSgnZGVidWcnKTtcblx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHQvLyBTd2FsbG93XG5cdFx0Ly8gWFhYIChAUWl4LSkgc2hvdWxkIHdlIGJlIGxvZ2dpbmcgdGhlc2U/XG5cdH1cblxuXHQvLyBJZiBkZWJ1ZyBpc24ndCBzZXQgaW4gTFMsIGFuZCB3ZSdyZSBpbiBFbGVjdHJvbiwgdHJ5IHRvIGxvYWQgJERFQlVHXG5cdGlmICghciAmJiB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgJ2VudicgaW4gcHJvY2Vzcykge1xuXHRcdHIgPSBwcm9jZXNzLmVudi5ERUJVRztcblx0fVxuXG5cdHJldHVybiByO1xufVxuXG4vKipcbiAqIExvY2Fsc3RvcmFnZSBhdHRlbXB0cyB0byByZXR1cm4gdGhlIGxvY2Fsc3RvcmFnZS5cbiAqXG4gKiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHNhZmFyaSB0aHJvd3NcbiAqIHdoZW4gYSB1c2VyIGRpc2FibGVzIGNvb2tpZXMvbG9jYWxzdG9yYWdlXG4gKiBhbmQgeW91IGF0dGVtcHQgdG8gYWNjZXNzIGl0LlxuICpcbiAqIEByZXR1cm4ge0xvY2FsU3RvcmFnZX1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGxvY2Fsc3RvcmFnZSgpIHtcblx0dHJ5IHtcblx0XHQvLyBUVk1MS2l0IChBcHBsZSBUViBKUyBSdW50aW1lKSBkb2VzIG5vdCBoYXZlIGEgd2luZG93IG9iamVjdCwganVzdCBsb2NhbFN0b3JhZ2UgaW4gdGhlIGdsb2JhbCBjb250ZXh0XG5cdFx0Ly8gVGhlIEJyb3dzZXIgYWxzbyBoYXMgbG9jYWxTdG9yYWdlIGluIHRoZSBnbG9iYWwgY29udGV4dC5cblx0XHRyZXR1cm4gbG9jYWxTdG9yYWdlO1xuXHR9IGNhdGNoIChlcnJvcikge1xuXHRcdC8vIFN3YWxsb3dcblx0XHQvLyBYWFggKEBRaXgtKSBzaG91bGQgd2UgYmUgbG9nZ2luZyB0aGVzZT9cblx0fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY29tbW9uJykoZXhwb3J0cyk7XG5cbmNvbnN0IHtmb3JtYXR0ZXJzfSA9IG1vZHVsZS5leHBvcnRzO1xuXG4vKipcbiAqIE1hcCAlaiB0byBgSlNPTi5zdHJpbmdpZnkoKWAsIHNpbmNlIG5vIFdlYiBJbnNwZWN0b3JzIGRvIHRoYXQgYnkgZGVmYXVsdC5cbiAqL1xuXG5mb3JtYXR0ZXJzLmogPSBmdW5jdGlvbiAodikge1xuXHR0cnkge1xuXHRcdHJldHVybiBKU09OLnN0cmluZ2lmeSh2KTtcblx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRyZXR1cm4gJ1tVbmV4cGVjdGVkSlNPTlBhcnNlRXJyb3JdOiAnICsgZXJyb3IubWVzc2FnZTtcblx0fVxufTtcbiIsImV4cG9ydCBhc3luYyBmdW5jdGlvbiBzYWZlRXhlY3V0ZShmbikge1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBbbnVsbCwgYXdhaXQgZm4oKV07XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICByZXR1cm4gW2Vycm9yLCBudWxsXTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zYWZlRXhlY3V0ZS5tanMubWFwIiwiaW1wb3J0IHsgQ29udGVudEZpbHRlckZpbmlzaFJlYXNvbkVycm9yLCBMZW5ndGhGaW5pc2hSZWFzb25FcnJvciwgT3BlbkFJRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3IubWpzXCI7XG5leHBvcnQgZnVuY3Rpb24gbWFrZVBhcnNlYWJsZVJlc3BvbnNlRm9ybWF0KHJlc3BvbnNlX2Zvcm1hdCwgcGFyc2VyKSB7XG4gICAgY29uc3Qgb2JqID0geyAuLi5yZXNwb25zZV9mb3JtYXQgfTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhvYmosIHtcbiAgICAgICAgJGJyYW5kOiB7XG4gICAgICAgICAgICB2YWx1ZTogJ2F1dG8tcGFyc2VhYmxlLXJlc3BvbnNlLWZvcm1hdCcsXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgICAgJHBhcnNlUmF3OiB7XG4gICAgICAgICAgICB2YWx1ZTogcGFyc2VyLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgfSk7XG4gICAgcmV0dXJuIG9iajtcbn1cbmV4cG9ydCBmdW5jdGlvbiBtYWtlUGFyc2VhYmxlVGV4dEZvcm1hdChyZXNwb25zZV9mb3JtYXQsIHBhcnNlcikge1xuICAgIGNvbnN0IG9iaiA9IHsgLi4ucmVzcG9uc2VfZm9ybWF0IH07XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMob2JqLCB7XG4gICAgICAgICRicmFuZDoge1xuICAgICAgICAgICAgdmFsdWU6ICdhdXRvLXBhcnNlYWJsZS1yZXNwb25zZS1mb3JtYXQnLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICAgICRwYXJzZVJhdzoge1xuICAgICAgICAgICAgdmFsdWU6IHBhcnNlcixcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0pO1xuICAgIHJldHVybiBvYmo7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNBdXRvUGFyc2FibGVSZXNwb25zZUZvcm1hdChyZXNwb25zZV9mb3JtYXQpIHtcbiAgICByZXR1cm4gcmVzcG9uc2VfZm9ybWF0Py5bJyRicmFuZCddID09PSAnYXV0by1wYXJzZWFibGUtcmVzcG9uc2UtZm9ybWF0Jztcbn1cbmV4cG9ydCBmdW5jdGlvbiBtYWtlUGFyc2VhYmxlVG9vbCh0b29sLCB7IHBhcnNlciwgY2FsbGJhY2ssIH0pIHtcbiAgICBjb25zdCBvYmogPSB7IC4uLnRvb2wgfTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhvYmosIHtcbiAgICAgICAgJGJyYW5kOiB7XG4gICAgICAgICAgICB2YWx1ZTogJ2F1dG8tcGFyc2VhYmxlLXRvb2wnLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICAgICRwYXJzZVJhdzoge1xuICAgICAgICAgICAgdmFsdWU6IHBhcnNlcixcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgICAkY2FsbGJhY2s6IHtcbiAgICAgICAgICAgIHZhbHVlOiBjYWxsYmFjayxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0pO1xuICAgIHJldHVybiBvYmo7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNBdXRvUGFyc2FibGVUb29sKHRvb2wpIHtcbiAgICByZXR1cm4gdG9vbD8uWyckYnJhbmQnXSA9PT0gJ2F1dG8tcGFyc2VhYmxlLXRvb2wnO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG1heWJlUGFyc2VDaGF0Q29tcGxldGlvbihjb21wbGV0aW9uLCBwYXJhbXMpIHtcbiAgICBpZiAoIXBhcmFtcyB8fCAhaGFzQXV0b1BhcnNlYWJsZUlucHV0KHBhcmFtcykpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLmNvbXBsZXRpb24sXG4gICAgICAgICAgICBjaG9pY2VzOiBjb21wbGV0aW9uLmNob2ljZXMubWFwKChjaG9pY2UpID0+ICh7XG4gICAgICAgICAgICAgICAgLi4uY2hvaWNlLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uY2hvaWNlLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIHBhcnNlZDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgLi4uKGNob2ljZS5tZXNzYWdlLnRvb2xfY2FsbHMgP1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2xfY2FsbHM6IGNob2ljZS5tZXNzYWdlLnRvb2xfY2FsbHMsXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pKSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlQ2hhdENvbXBsZXRpb24oY29tcGxldGlvbiwgcGFyYW1zKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUNoYXRDb21wbGV0aW9uKGNvbXBsZXRpb24sIHBhcmFtcykge1xuICAgIGNvbnN0IGNob2ljZXMgPSBjb21wbGV0aW9uLmNob2ljZXMubWFwKChjaG9pY2UpID0+IHtcbiAgICAgICAgaWYgKGNob2ljZS5maW5pc2hfcmVhc29uID09PSAnbGVuZ3RoJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IExlbmd0aEZpbmlzaFJlYXNvbkVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNob2ljZS5maW5pc2hfcmVhc29uID09PSAnY29udGVudF9maWx0ZXInKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQ29udGVudEZpbHRlckZpbmlzaFJlYXNvbkVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLmNob2ljZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHtcbiAgICAgICAgICAgICAgICAuLi5jaG9pY2UubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAuLi4oY2hvaWNlLm1lc3NhZ2UudG9vbF9jYWxscyA/XG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvb2xfY2FsbHM6IGNob2ljZS5tZXNzYWdlLnRvb2xfY2FsbHM/Lm1hcCgodG9vbENhbGwpID0+IHBhcnNlVG9vbENhbGwocGFyYW1zLCB0b29sQ2FsbCkpID8/IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCksXG4gICAgICAgICAgICAgICAgcGFyc2VkOiBjaG9pY2UubWVzc2FnZS5jb250ZW50ICYmICFjaG9pY2UubWVzc2FnZS5yZWZ1c2FsID9cbiAgICAgICAgICAgICAgICAgICAgcGFyc2VSZXNwb25zZUZvcm1hdChwYXJhbXMsIGNob2ljZS5tZXNzYWdlLmNvbnRlbnQpXG4gICAgICAgICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfSk7XG4gICAgcmV0dXJuIHsgLi4uY29tcGxldGlvbiwgY2hvaWNlcyB9O1xufVxuZnVuY3Rpb24gcGFyc2VSZXNwb25zZUZvcm1hdChwYXJhbXMsIGNvbnRlbnQpIHtcbiAgICBpZiAocGFyYW1zLnJlc3BvbnNlX2Zvcm1hdD8udHlwZSAhPT0gJ2pzb25fc2NoZW1hJykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKHBhcmFtcy5yZXNwb25zZV9mb3JtYXQ/LnR5cGUgPT09ICdqc29uX3NjaGVtYScpIHtcbiAgICAgICAgaWYgKCckcGFyc2VSYXcnIGluIHBhcmFtcy5yZXNwb25zZV9mb3JtYXQpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlX2Zvcm1hdCA9IHBhcmFtcy5yZXNwb25zZV9mb3JtYXQ7XG4gICAgICAgICAgICByZXR1cm4gcmVzcG9uc2VfZm9ybWF0LiRwYXJzZVJhdyhjb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShjb250ZW50KTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBwYXJzZVRvb2xDYWxsKHBhcmFtcywgdG9vbENhbGwpIHtcbiAgICBjb25zdCBpbnB1dFRvb2wgPSBwYXJhbXMudG9vbHM/LmZpbmQoKGlucHV0VG9vbCkgPT4gaW5wdXRUb29sLmZ1bmN0aW9uPy5uYW1lID09PSB0b29sQ2FsbC5mdW5jdGlvbi5uYW1lKTtcbiAgICByZXR1cm4ge1xuICAgICAgICAuLi50b29sQ2FsbCxcbiAgICAgICAgZnVuY3Rpb246IHtcbiAgICAgICAgICAgIC4uLnRvb2xDYWxsLmZ1bmN0aW9uLFxuICAgICAgICAgICAgcGFyc2VkX2FyZ3VtZW50czogaXNBdXRvUGFyc2FibGVUb29sKGlucHV0VG9vbCkgPyBpbnB1dFRvb2wuJHBhcnNlUmF3KHRvb2xDYWxsLmZ1bmN0aW9uLmFyZ3VtZW50cylcbiAgICAgICAgICAgICAgICA6IGlucHV0VG9vbD8uZnVuY3Rpb24uc3RyaWN0ID8gSlNPTi5wYXJzZSh0b29sQ2FsbC5mdW5jdGlvbi5hcmd1bWVudHMpXG4gICAgICAgICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgfSxcbiAgICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIHNob3VsZFBhcnNlVG9vbENhbGwocGFyYW1zLCB0b29sQ2FsbCkge1xuICAgIGlmICghcGFyYW1zKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRUb29sID0gcGFyYW1zLnRvb2xzPy5maW5kKChpbnB1dFRvb2wpID0+IGlucHV0VG9vbC5mdW5jdGlvbj8ubmFtZSA9PT0gdG9vbENhbGwuZnVuY3Rpb24ubmFtZSk7XG4gICAgcmV0dXJuIGlzQXV0b1BhcnNhYmxlVG9vbChpbnB1dFRvb2wpIHx8IGlucHV0VG9vbD8uZnVuY3Rpb24uc3RyaWN0IHx8IGZhbHNlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGhhc0F1dG9QYXJzZWFibGVJbnB1dChwYXJhbXMpIHtcbiAgICBpZiAoaXNBdXRvUGFyc2FibGVSZXNwb25zZUZvcm1hdChwYXJhbXMucmVzcG9uc2VfZm9ybWF0KSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIChwYXJhbXMudG9vbHM/LnNvbWUoKHQpID0+IGlzQXV0b1BhcnNhYmxlVG9vbCh0KSB8fCAodC50eXBlID09PSAnZnVuY3Rpb24nICYmIHQuZnVuY3Rpb24uc3RyaWN0ID09PSB0cnVlKSkgPz8gZmFsc2UpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlSW5wdXRUb29scyh0b29scykge1xuICAgIGZvciAoY29uc3QgdG9vbCBvZiB0b29scyA/PyBbXSkge1xuICAgICAgICBpZiAodG9vbC50eXBlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgT3BlbkFJRXJyb3IoYEN1cnJlbnRseSBvbmx5IFxcYGZ1bmN0aW9uXFxgIHRvb2wgdHlwZXMgc3VwcG9ydCBhdXRvLXBhcnNpbmc7IFJlY2VpdmVkIFxcYCR7dG9vbC50eXBlfVxcYGApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0b29sLmZ1bmN0aW9uLnN0cmljdCAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE9wZW5BSUVycm9yKGBUaGUgXFxgJHt0b29sLmZ1bmN0aW9uLm5hbWV9XFxgIHRvb2wgaXMgbm90IG1hcmtlZCB3aXRoIFxcYHN0cmljdDogdHJ1ZVxcYC4gT25seSBzdHJpY3QgZnVuY3Rpb24gdG9vbHMgY2FuIGJlIGF1dG8tcGFyc2VkYCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wYXJzZXIubWpzLm1hcCIsImV4cG9ydCBjb25zdCBpZ25vcmVPdmVycmlkZSA9IFN5bWJvbCgnTGV0IHpvZFRvSnNvblNjaGVtYSBkZWNpZGUgb24gd2hpY2ggcGFyc2VyIHRvIHVzZScpO1xuY29uc3QgZGVmYXVsdE9wdGlvbnMgPSB7XG4gICAgbmFtZTogdW5kZWZpbmVkLFxuICAgICRyZWZTdHJhdGVneTogJ3Jvb3QnLFxuICAgIGVmZmVjdFN0cmF0ZWd5OiAnaW5wdXQnLFxuICAgIHBpcGVTdHJhdGVneTogJ2FsbCcsXG4gICAgZGF0ZVN0cmF0ZWd5OiAnZm9ybWF0OmRhdGUtdGltZScsXG4gICAgbWFwU3RyYXRlZ3k6ICdlbnRyaWVzJyxcbiAgICBudWxsYWJsZVN0cmF0ZWd5OiAnZnJvbS10YXJnZXQnLFxuICAgIHJlbW92ZUFkZGl0aW9uYWxTdHJhdGVneTogJ3Bhc3N0aHJvdWdoJyxcbiAgICBkZWZpbml0aW9uUGF0aDogJ2RlZmluaXRpb25zJyxcbiAgICB0YXJnZXQ6ICdqc29uU2NoZW1hNycsXG4gICAgc3RyaWN0VW5pb25zOiBmYWxzZSxcbiAgICBlcnJvck1lc3NhZ2VzOiBmYWxzZSxcbiAgICBtYXJrZG93bkRlc2NyaXB0aW9uOiBmYWxzZSxcbiAgICBwYXR0ZXJuU3RyYXRlZ3k6ICdlc2NhcGUnLFxuICAgIGFwcGx5UmVnZXhGbGFnczogZmFsc2UsXG4gICAgZW1haWxTdHJhdGVneTogJ2Zvcm1hdDplbWFpbCcsXG4gICAgYmFzZTY0U3RyYXRlZ3k6ICdjb250ZW50RW5jb2Rpbmc6YmFzZTY0JyxcbiAgICBuYW1lU3RyYXRlZ3k6ICdyZWYnLFxufTtcbmV4cG9ydCBjb25zdCBnZXREZWZhdWx0T3B0aW9ucyA9IChvcHRpb25zKSA9PiB7XG4gICAgLy8gV2UgbmVlZCB0byBhZGQgYGRlZmluaXRpb25zYCBoZXJlIGFzIHdlIG1heSBtdXRhdGUgaXRcbiAgICByZXR1cm4gKHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJyA/XG4gICAgICAgIHtcbiAgICAgICAgICAgIC4uLmRlZmF1bHRPcHRpb25zLFxuICAgICAgICAgICAgYmFzZVBhdGg6IFsnIyddLFxuICAgICAgICAgICAgZGVmaW5pdGlvbnM6IHt9LFxuICAgICAgICAgICAgbmFtZTogb3B0aW9ucyxcbiAgICAgICAgfVxuICAgICAgICA6IHtcbiAgICAgICAgICAgIC4uLmRlZmF1bHRPcHRpb25zLFxuICAgICAgICAgICAgYmFzZVBhdGg6IFsnIyddLFxuICAgICAgICAgICAgZGVmaW5pdGlvbnM6IHt9LFxuICAgICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgfSk7XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9T3B0aW9ucy5tanMubWFwIiwiZXhwb3J0IGNvbnN0IHpvZERlZiA9ICh6b2RTY2hlbWEpID0+IHtcbiAgICByZXR1cm4gJ19kZWYnIGluIHpvZFNjaGVtYSA/IHpvZFNjaGVtYS5fZGVmIDogem9kU2NoZW1hO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBpc0VtcHR5T2JqKG9iaikge1xuICAgIGlmICghb2JqKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICBmb3IgKGNvbnN0IF9rIGluIG9iailcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dXRpbC5tanMubWFwIiwiaW1wb3J0IHsgZ2V0RGVmYXVsdE9wdGlvbnMgfSBmcm9tIFwiLi9PcHRpb25zLm1qc1wiO1xuaW1wb3J0IHsgem9kRGVmIH0gZnJvbSBcIi4vdXRpbC5tanNcIjtcbmV4cG9ydCBjb25zdCBnZXRSZWZzID0gKG9wdGlvbnMpID0+IHtcbiAgICBjb25zdCBfb3B0aW9ucyA9IGdldERlZmF1bHRPcHRpb25zKG9wdGlvbnMpO1xuICAgIGNvbnN0IGN1cnJlbnRQYXRoID0gX29wdGlvbnMubmFtZSAhPT0gdW5kZWZpbmVkID9cbiAgICAgICAgWy4uLl9vcHRpb25zLmJhc2VQYXRoLCBfb3B0aW9ucy5kZWZpbml0aW9uUGF0aCwgX29wdGlvbnMubmFtZV1cbiAgICAgICAgOiBfb3B0aW9ucy5iYXNlUGF0aDtcbiAgICByZXR1cm4ge1xuICAgICAgICAuLi5fb3B0aW9ucyxcbiAgICAgICAgY3VycmVudFBhdGg6IGN1cnJlbnRQYXRoLFxuICAgICAgICBwcm9wZXJ0eVBhdGg6IHVuZGVmaW5lZCxcbiAgICAgICAgc2VlblJlZnM6IG5ldyBTZXQoKSxcbiAgICAgICAgc2VlbjogbmV3IE1hcChPYmplY3QuZW50cmllcyhfb3B0aW9ucy5kZWZpbml0aW9ucykubWFwKChbbmFtZSwgZGVmXSkgPT4gW1xuICAgICAgICAgICAgem9kRGVmKGRlZiksXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZGVmOiB6b2REZWYoZGVmKSxcbiAgICAgICAgICAgICAgICBwYXRoOiBbLi4uX29wdGlvbnMuYmFzZVBhdGgsIF9vcHRpb25zLmRlZmluaXRpb25QYXRoLCBuYW1lXSxcbiAgICAgICAgICAgICAgICAvLyBSZXNvbHV0aW9uIG9mIHJlZmVyZW5jZXMgd2lsbCBiZSBmb3JjZWQgZXZlbiB0aG91Z2ggc2Vlbiwgc28gaXQncyBvayB0aGF0IHRoZSBzY2hlbWEgaXMgdW5kZWZpbmVkIGhlcmUgZm9yIG5vdy5cbiAgICAgICAgICAgICAgICBqc29uU2NoZW1hOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB9LFxuICAgICAgICBdKSksXG4gICAgfTtcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1SZWZzLm1qcy5tYXAiLCJleHBvcnQgZnVuY3Rpb24gYWRkRXJyb3JNZXNzYWdlKHJlcywga2V5LCBlcnJvck1lc3NhZ2UsIHJlZnMpIHtcbiAgICBpZiAoIXJlZnM/LmVycm9yTWVzc2FnZXMpXG4gICAgICAgIHJldHVybjtcbiAgICBpZiAoZXJyb3JNZXNzYWdlKSB7XG4gICAgICAgIHJlcy5lcnJvck1lc3NhZ2UgPSB7XG4gICAgICAgICAgICAuLi5yZXMuZXJyb3JNZXNzYWdlLFxuICAgICAgICAgICAgW2tleV06IGVycm9yTWVzc2FnZSxcbiAgICAgICAgfTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gc2V0UmVzcG9uc2VWYWx1ZUFuZEVycm9ycyhyZXMsIGtleSwgdmFsdWUsIGVycm9yTWVzc2FnZSwgcmVmcykge1xuICAgIHJlc1trZXldID0gdmFsdWU7XG4gICAgYWRkRXJyb3JNZXNzYWdlKHJlcywga2V5LCBlcnJvck1lc3NhZ2UsIHJlZnMpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZXJyb3JNZXNzYWdlcy5tanMubWFwIiwiZXhwb3J0IHZhciB1dGlsO1xuKGZ1bmN0aW9uICh1dGlsKSB7XG4gICAgdXRpbC5hc3NlcnRFcXVhbCA9IChfKSA9PiB7IH07XG4gICAgZnVuY3Rpb24gYXNzZXJ0SXMoX2FyZykgeyB9XG4gICAgdXRpbC5hc3NlcnRJcyA9IGFzc2VydElzO1xuICAgIGZ1bmN0aW9uIGFzc2VydE5ldmVyKF94KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigpO1xuICAgIH1cbiAgICB1dGlsLmFzc2VydE5ldmVyID0gYXNzZXJ0TmV2ZXI7XG4gICAgdXRpbC5hcnJheVRvRW51bSA9IChpdGVtcykgPT4ge1xuICAgICAgICBjb25zdCBvYmogPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICAgICAgICBvYmpbaXRlbV0gPSBpdGVtO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfTtcbiAgICB1dGlsLmdldFZhbGlkRW51bVZhbHVlcyA9IChvYmopID0+IHtcbiAgICAgICAgY29uc3QgdmFsaWRLZXlzID0gdXRpbC5vYmplY3RLZXlzKG9iaikuZmlsdGVyKChrKSA9PiB0eXBlb2Ygb2JqW29ialtrXV0gIT09IFwibnVtYmVyXCIpO1xuICAgICAgICBjb25zdCBmaWx0ZXJlZCA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGsgb2YgdmFsaWRLZXlzKSB7XG4gICAgICAgICAgICBmaWx0ZXJlZFtrXSA9IG9ialtrXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdXRpbC5vYmplY3RWYWx1ZXMoZmlsdGVyZWQpO1xuICAgIH07XG4gICAgdXRpbC5vYmplY3RWYWx1ZXMgPSAob2JqKSA9PiB7XG4gICAgICAgIHJldHVybiB1dGlsLm9iamVjdEtleXMob2JqKS5tYXAoZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIHJldHVybiBvYmpbZV07XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgdXRpbC5vYmplY3RLZXlzID0gdHlwZW9mIE9iamVjdC5rZXlzID09PSBcImZ1bmN0aW9uXCIgLy8gZXNsaW50LWRpc2FibGUtbGluZSBiYW4vYmFuXG4gICAgICAgID8gKG9iaikgPT4gT2JqZWN0LmtleXMob2JqKSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGJhbi9iYW5cbiAgICAgICAgOiAob2JqZWN0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBrZXlzID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmplY3QpIHtcbiAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSkge1xuICAgICAgICAgICAgICAgICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ga2V5cztcbiAgICAgICAgfTtcbiAgICB1dGlsLmZpbmQgPSAoYXJyLCBjaGVja2VyKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBhcnIpIHtcbiAgICAgICAgICAgIGlmIChjaGVja2VyKGl0ZW0pKVxuICAgICAgICAgICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICB1dGlsLmlzSW50ZWdlciA9IHR5cGVvZiBOdW1iZXIuaXNJbnRlZ2VyID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgPyAodmFsKSA9PiBOdW1iZXIuaXNJbnRlZ2VyKHZhbCkgLy8gZXNsaW50LWRpc2FibGUtbGluZSBiYW4vYmFuXG4gICAgICAgIDogKHZhbCkgPT4gdHlwZW9mIHZhbCA9PT0gXCJudW1iZXJcIiAmJiBOdW1iZXIuaXNGaW5pdGUodmFsKSAmJiBNYXRoLmZsb29yKHZhbCkgPT09IHZhbDtcbiAgICBmdW5jdGlvbiBqb2luVmFsdWVzKGFycmF5LCBzZXBhcmF0b3IgPSBcIiB8IFwiKSB7XG4gICAgICAgIHJldHVybiBhcnJheS5tYXAoKHZhbCkgPT4gKHR5cGVvZiB2YWwgPT09IFwic3RyaW5nXCIgPyBgJyR7dmFsfSdgIDogdmFsKSkuam9pbihzZXBhcmF0b3IpO1xuICAgIH1cbiAgICB1dGlsLmpvaW5WYWx1ZXMgPSBqb2luVmFsdWVzO1xuICAgIHV0aWwuanNvblN0cmluZ2lmeVJlcGxhY2VyID0gKF8sIHZhbHVlKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiYmlnaW50XCIpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9O1xufSkodXRpbCB8fCAodXRpbCA9IHt9KSk7XG5leHBvcnQgdmFyIG9iamVjdFV0aWw7XG4oZnVuY3Rpb24gKG9iamVjdFV0aWwpIHtcbiAgICBvYmplY3RVdGlsLm1lcmdlU2hhcGVzID0gKGZpcnN0LCBzZWNvbmQpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLmZpcnN0LFxuICAgICAgICAgICAgLi4uc2Vjb25kLCAvLyBzZWNvbmQgb3ZlcndyaXRlcyBmaXJzdFxuICAgICAgICB9O1xuICAgIH07XG59KShvYmplY3RVdGlsIHx8IChvYmplY3RVdGlsID0ge30pKTtcbmV4cG9ydCBjb25zdCBab2RQYXJzZWRUeXBlID0gdXRpbC5hcnJheVRvRW51bShbXG4gICAgXCJzdHJpbmdcIixcbiAgICBcIm5hblwiLFxuICAgIFwibnVtYmVyXCIsXG4gICAgXCJpbnRlZ2VyXCIsXG4gICAgXCJmbG9hdFwiLFxuICAgIFwiYm9vbGVhblwiLFxuICAgIFwiZGF0ZVwiLFxuICAgIFwiYmlnaW50XCIsXG4gICAgXCJzeW1ib2xcIixcbiAgICBcImZ1bmN0aW9uXCIsXG4gICAgXCJ1bmRlZmluZWRcIixcbiAgICBcIm51bGxcIixcbiAgICBcImFycmF5XCIsXG4gICAgXCJvYmplY3RcIixcbiAgICBcInVua25vd25cIixcbiAgICBcInByb21pc2VcIixcbiAgICBcInZvaWRcIixcbiAgICBcIm5ldmVyXCIsXG4gICAgXCJtYXBcIixcbiAgICBcInNldFwiLFxuXSk7XG5leHBvcnQgY29uc3QgZ2V0UGFyc2VkVHlwZSA9IChkYXRhKSA9PiB7XG4gICAgY29uc3QgdCA9IHR5cGVvZiBkYXRhO1xuICAgIHN3aXRjaCAodCkge1xuICAgICAgICBjYXNlIFwidW5kZWZpbmVkXCI6XG4gICAgICAgICAgICByZXR1cm4gWm9kUGFyc2VkVHlwZS51bmRlZmluZWQ7XG4gICAgICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgICAgICAgIHJldHVybiBab2RQYXJzZWRUeXBlLnN0cmluZztcbiAgICAgICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgICAgICAgcmV0dXJuIE51bWJlci5pc05hTihkYXRhKSA/IFpvZFBhcnNlZFR5cGUubmFuIDogWm9kUGFyc2VkVHlwZS5udW1iZXI7XG4gICAgICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICAgICAgICByZXR1cm4gWm9kUGFyc2VkVHlwZS5ib29sZWFuO1xuICAgICAgICBjYXNlIFwiZnVuY3Rpb25cIjpcbiAgICAgICAgICAgIHJldHVybiBab2RQYXJzZWRUeXBlLmZ1bmN0aW9uO1xuICAgICAgICBjYXNlIFwiYmlnaW50XCI6XG4gICAgICAgICAgICByZXR1cm4gWm9kUGFyc2VkVHlwZS5iaWdpbnQ7XG4gICAgICAgIGNhc2UgXCJzeW1ib2xcIjpcbiAgICAgICAgICAgIHJldHVybiBab2RQYXJzZWRUeXBlLnN5bWJvbDtcbiAgICAgICAgY2FzZSBcIm9iamVjdFwiOlxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gWm9kUGFyc2VkVHlwZS5hcnJheTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkYXRhID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFpvZFBhcnNlZFR5cGUubnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkYXRhLnRoZW4gJiYgdHlwZW9mIGRhdGEudGhlbiA9PT0gXCJmdW5jdGlvblwiICYmIGRhdGEuY2F0Y2ggJiYgdHlwZW9mIGRhdGEuY2F0Y2ggPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBab2RQYXJzZWRUeXBlLnByb21pc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIE1hcCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBkYXRhIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFpvZFBhcnNlZFR5cGUubWFwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBTZXQgIT09IFwidW5kZWZpbmVkXCIgJiYgZGF0YSBpbnN0YW5jZW9mIFNldCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBab2RQYXJzZWRUeXBlLnNldDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgRGF0ZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBkYXRhIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBab2RQYXJzZWRUeXBlLmRhdGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gWm9kUGFyc2VkVHlwZS5vYmplY3Q7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gWm9kUGFyc2VkVHlwZS51bmtub3duO1xuICAgIH1cbn07XG4iLCJpbXBvcnQgeyB1dGlsIH0gZnJvbSBcIi4vaGVscGVycy91dGlsLmpzXCI7XG5leHBvcnQgY29uc3QgWm9kSXNzdWVDb2RlID0gdXRpbC5hcnJheVRvRW51bShbXG4gICAgXCJpbnZhbGlkX3R5cGVcIixcbiAgICBcImludmFsaWRfbGl0ZXJhbFwiLFxuICAgIFwiY3VzdG9tXCIsXG4gICAgXCJpbnZhbGlkX3VuaW9uXCIsXG4gICAgXCJpbnZhbGlkX3VuaW9uX2Rpc2NyaW1pbmF0b3JcIixcbiAgICBcImludmFsaWRfZW51bV92YWx1ZVwiLFxuICAgIFwidW5yZWNvZ25pemVkX2tleXNcIixcbiAgICBcImludmFsaWRfYXJndW1lbnRzXCIsXG4gICAgXCJpbnZhbGlkX3JldHVybl90eXBlXCIsXG4gICAgXCJpbnZhbGlkX2RhdGVcIixcbiAgICBcImludmFsaWRfc3RyaW5nXCIsXG4gICAgXCJ0b29fc21hbGxcIixcbiAgICBcInRvb19iaWdcIixcbiAgICBcImludmFsaWRfaW50ZXJzZWN0aW9uX3R5cGVzXCIsXG4gICAgXCJub3RfbXVsdGlwbGVfb2ZcIixcbiAgICBcIm5vdF9maW5pdGVcIixcbl0pO1xuZXhwb3J0IGNvbnN0IHF1b3RlbGVzc0pzb24gPSAob2JqKSA9PiB7XG4gICAgY29uc3QganNvbiA9IEpTT04uc3RyaW5naWZ5KG9iaiwgbnVsbCwgMik7XG4gICAgcmV0dXJuIGpzb24ucmVwbGFjZSgvXCIoW15cIl0rKVwiOi9nLCBcIiQxOlwiKTtcbn07XG5leHBvcnQgY2xhc3MgWm9kRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgZ2V0IGVycm9ycygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNzdWVzO1xuICAgIH1cbiAgICBjb25zdHJ1Y3Rvcihpc3N1ZXMpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5pc3N1ZXMgPSBbXTtcbiAgICAgICAgdGhpcy5hZGRJc3N1ZSA9IChzdWIpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaXNzdWVzID0gWy4uLnRoaXMuaXNzdWVzLCBzdWJdO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmFkZElzc3VlcyA9IChzdWJzID0gW10pID0+IHtcbiAgICAgICAgICAgIHRoaXMuaXNzdWVzID0gWy4uLnRoaXMuaXNzdWVzLCAuLi5zdWJzXTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgYWN0dWFsUHJvdG8gPSBuZXcudGFyZ2V0LnByb3RvdHlwZTtcbiAgICAgICAgaWYgKE9iamVjdC5zZXRQcm90b3R5cGVPZikge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGJhbi9iYW5cbiAgICAgICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBhY3R1YWxQcm90byk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9fcHJvdG9fXyA9IGFjdHVhbFByb3RvO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubmFtZSA9IFwiWm9kRXJyb3JcIjtcbiAgICAgICAgdGhpcy5pc3N1ZXMgPSBpc3N1ZXM7XG4gICAgfVxuICAgIGZvcm1hdChfbWFwcGVyKSB7XG4gICAgICAgIGNvbnN0IG1hcHBlciA9IF9tYXBwZXIgfHxcbiAgICAgICAgICAgIGZ1bmN0aW9uIChpc3N1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpc3N1ZS5tZXNzYWdlO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgY29uc3QgZmllbGRFcnJvcnMgPSB7IF9lcnJvcnM6IFtdIH07XG4gICAgICAgIGNvbnN0IHByb2Nlc3NFcnJvciA9IChlcnJvcikgPT4ge1xuICAgICAgICAgICAgZm9yIChjb25zdCBpc3N1ZSBvZiBlcnJvci5pc3N1ZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNzdWUuY29kZSA9PT0gXCJpbnZhbGlkX3VuaW9uXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgaXNzdWUudW5pb25FcnJvcnMubWFwKHByb2Nlc3NFcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzc3VlLmNvZGUgPT09IFwiaW52YWxpZF9yZXR1cm5fdHlwZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NFcnJvcihpc3N1ZS5yZXR1cm5UeXBlRXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChpc3N1ZS5jb2RlID09PSBcImludmFsaWRfYXJndW1lbnRzXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0Vycm9yKGlzc3VlLmFyZ3VtZW50c0Vycm9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoaXNzdWUucGF0aC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZmllbGRFcnJvcnMuX2Vycm9ycy5wdXNoKG1hcHBlcihpc3N1ZSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGN1cnIgPSBmaWVsZEVycm9ycztcbiAgICAgICAgICAgICAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaSA8IGlzc3VlLnBhdGgubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbCA9IGlzc3VlLnBhdGhbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXJtaW5hbCA9IGkgPT09IGlzc3VlLnBhdGgubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGVybWluYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyW2VsXSA9IGN1cnJbZWxdIHx8IHsgX2Vycm9yczogW10gfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiAodHlwZW9mIGVsID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBjdXJyW2VsXSA9IGN1cnJbZWxdIHx8IHsgX2Vycm9yczogW10gfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB9IGVsc2UgaWYgKHR5cGVvZiBlbCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgY29uc3QgZXJyb3JBcnJheTogYW55ID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBlcnJvckFycmF5Ll9lcnJvcnMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgIGN1cnJbZWxdID0gY3VycltlbF0gfHwgZXJyb3JBcnJheTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyW2VsXSA9IGN1cnJbZWxdIHx8IHsgX2Vycm9yczogW10gfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyW2VsXS5fZXJyb3JzLnB1c2gobWFwcGVyKGlzc3VlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyID0gY3VycltlbF07XG4gICAgICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHByb2Nlc3NFcnJvcih0aGlzKTtcbiAgICAgICAgcmV0dXJuIGZpZWxkRXJyb3JzO1xuICAgIH1cbiAgICBzdGF0aWMgYXNzZXJ0KHZhbHVlKSB7XG4gICAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgWm9kRXJyb3IpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vdCBhIFpvZEVycm9yOiAke3ZhbHVlfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlO1xuICAgIH1cbiAgICBnZXQgbWVzc2FnZSgpIHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMuaXNzdWVzLCB1dGlsLmpzb25TdHJpbmdpZnlSZXBsYWNlciwgMik7XG4gICAgfVxuICAgIGdldCBpc0VtcHR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc3N1ZXMubGVuZ3RoID09PSAwO1xuICAgIH1cbiAgICBmbGF0dGVuKG1hcHBlciA9IChpc3N1ZSkgPT4gaXNzdWUubWVzc2FnZSkge1xuICAgICAgICBjb25zdCBmaWVsZEVycm9ycyA9IHt9O1xuICAgICAgICBjb25zdCBmb3JtRXJyb3JzID0gW107XG4gICAgICAgIGZvciAoY29uc3Qgc3ViIG9mIHRoaXMuaXNzdWVzKSB7XG4gICAgICAgICAgICBpZiAoc3ViLnBhdGgubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGZpZWxkRXJyb3JzW3N1Yi5wYXRoWzBdXSA9IGZpZWxkRXJyb3JzW3N1Yi5wYXRoWzBdXSB8fCBbXTtcbiAgICAgICAgICAgICAgICBmaWVsZEVycm9yc1tzdWIucGF0aFswXV0ucHVzaChtYXBwZXIoc3ViKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3JtRXJyb3JzLnB1c2gobWFwcGVyKHN1YikpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGZvcm1FcnJvcnMsIGZpZWxkRXJyb3JzIH07XG4gICAgfVxuICAgIGdldCBmb3JtRXJyb3JzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mbGF0dGVuKCk7XG4gICAgfVxufVxuWm9kRXJyb3IuY3JlYXRlID0gKGlzc3VlcykgPT4ge1xuICAgIGNvbnN0IGVycm9yID0gbmV3IFpvZEVycm9yKGlzc3Vlcyk7XG4gICAgcmV0dXJuIGVycm9yO1xufTtcbiIsImV4cG9ydCB2YXIgZXJyb3JVdGlsO1xuKGZ1bmN0aW9uIChlcnJvclV0aWwpIHtcbiAgICBlcnJvclV0aWwuZXJyVG9PYmogPSAobWVzc2FnZSkgPT4gdHlwZW9mIG1lc3NhZ2UgPT09IFwic3RyaW5nXCIgPyB7IG1lc3NhZ2UgfSA6IG1lc3NhZ2UgfHwge307XG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQ6XG4gICAgZXJyb3JVdGlsLnRvU3RyaW5nID0gKG1lc3NhZ2UpID0+IHR5cGVvZiBtZXNzYWdlID09PSBcInN0cmluZ1wiID8gbWVzc2FnZSA6IG1lc3NhZ2U/Lm1lc3NhZ2U7XG59KShlcnJvclV0aWwgfHwgKGVycm9yVXRpbCA9IHt9KSk7XG4iLCJpbXBvcnQgeyBab2RFcnJvciwgWm9kSXNzdWVDb2RlLCB9IGZyb20gXCIuL1pvZEVycm9yLmpzXCI7XG5pbXBvcnQgeyBkZWZhdWx0RXJyb3JNYXAsIGdldEVycm9yTWFwIH0gZnJvbSBcIi4vZXJyb3JzLmpzXCI7XG5pbXBvcnQgeyBlcnJvclV0aWwgfSBmcm9tIFwiLi9oZWxwZXJzL2Vycm9yVXRpbC5qc1wiO1xuaW1wb3J0IHsgRElSVFksIElOVkFMSUQsIE9LLCBQYXJzZVN0YXR1cywgYWRkSXNzdWVUb0NvbnRleHQsIGlzQWJvcnRlZCwgaXNBc3luYywgaXNEaXJ0eSwgaXNWYWxpZCwgbWFrZUlzc3VlLCB9IGZyb20gXCIuL2hlbHBlcnMvcGFyc2VVdGlsLmpzXCI7XG5pbXBvcnQgeyB1dGlsLCBab2RQYXJzZWRUeXBlLCBnZXRQYXJzZWRUeXBlIH0gZnJvbSBcIi4vaGVscGVycy91dGlsLmpzXCI7XG5jbGFzcyBQYXJzZUlucHV0TGF6eVBhdGgge1xuICAgIGNvbnN0cnVjdG9yKHBhcmVudCwgdmFsdWUsIHBhdGgsIGtleSkge1xuICAgICAgICB0aGlzLl9jYWNoZWRQYXRoID0gW107XG4gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgICAgICB0aGlzLmRhdGEgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5fcGF0aCA9IHBhdGg7XG4gICAgICAgIHRoaXMuX2tleSA9IGtleTtcbiAgICB9XG4gICAgZ2V0IHBhdGgoKSB7XG4gICAgICAgIGlmICghdGhpcy5fY2FjaGVkUGF0aC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuX2tleSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jYWNoZWRQYXRoLnB1c2goLi4udGhpcy5fcGF0aCwgLi4udGhpcy5fa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlZFBhdGgucHVzaCguLi50aGlzLl9wYXRoLCB0aGlzLl9rZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9jYWNoZWRQYXRoO1xuICAgIH1cbn1cbmNvbnN0IGhhbmRsZVJlc3VsdCA9IChjdHgsIHJlc3VsdCkgPT4ge1xuICAgIGlmIChpc1ZhbGlkKHJlc3VsdCkpIHtcbiAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgZGF0YTogcmVzdWx0LnZhbHVlIH07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAoIWN0eC5jb21tb24uaXNzdWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVmFsaWRhdGlvbiBmYWlsZWQgYnV0IG5vIGlzc3VlcyBkZXRlY3RlZC5cIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0IGVycm9yKCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9lcnJvcilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Vycm9yO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IFpvZEVycm9yKGN0eC5jb21tb24uaXNzdWVzKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9lcnJvciA9IGVycm9yO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9lcnJvcjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfVxufTtcbmZ1bmN0aW9uIHByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSB7XG4gICAgaWYgKCFwYXJhbXMpXG4gICAgICAgIHJldHVybiB7fTtcbiAgICBjb25zdCB7IGVycm9yTWFwLCBpbnZhbGlkX3R5cGVfZXJyb3IsIHJlcXVpcmVkX2Vycm9yLCBkZXNjcmlwdGlvbiB9ID0gcGFyYW1zO1xuICAgIGlmIChlcnJvck1hcCAmJiAoaW52YWxpZF90eXBlX2Vycm9yIHx8IHJlcXVpcmVkX2Vycm9yKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbid0IHVzZSBcImludmFsaWRfdHlwZV9lcnJvclwiIG9yIFwicmVxdWlyZWRfZXJyb3JcIiBpbiBjb25qdW5jdGlvbiB3aXRoIGN1c3RvbSBlcnJvciBtYXAuYCk7XG4gICAgfVxuICAgIGlmIChlcnJvck1hcClcbiAgICAgICAgcmV0dXJuIHsgZXJyb3JNYXA6IGVycm9yTWFwLCBkZXNjcmlwdGlvbiB9O1xuICAgIGNvbnN0IGN1c3RvbU1hcCA9IChpc3MsIGN0eCkgPT4ge1xuICAgICAgICBjb25zdCB7IG1lc3NhZ2UgfSA9IHBhcmFtcztcbiAgICAgICAgaWYgKGlzcy5jb2RlID09PSBcImludmFsaWRfZW51bV92YWx1ZVwiKSB7XG4gICAgICAgICAgICByZXR1cm4geyBtZXNzYWdlOiBtZXNzYWdlID8/IGN0eC5kZWZhdWx0RXJyb3IgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGN0eC5kYXRhID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICByZXR1cm4geyBtZXNzYWdlOiBtZXNzYWdlID8/IHJlcXVpcmVkX2Vycm9yID8/IGN0eC5kZWZhdWx0RXJyb3IgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNzLmNvZGUgIT09IFwiaW52YWxpZF90eXBlXCIpXG4gICAgICAgICAgICByZXR1cm4geyBtZXNzYWdlOiBjdHguZGVmYXVsdEVycm9yIH07XG4gICAgICAgIHJldHVybiB7IG1lc3NhZ2U6IG1lc3NhZ2UgPz8gaW52YWxpZF90eXBlX2Vycm9yID8/IGN0eC5kZWZhdWx0RXJyb3IgfTtcbiAgICB9O1xuICAgIHJldHVybiB7IGVycm9yTWFwOiBjdXN0b21NYXAsIGRlc2NyaXB0aW9uIH07XG59XG5leHBvcnQgY2xhc3MgWm9kVHlwZSB7XG4gICAgZ2V0IGRlc2NyaXB0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLmRlc2NyaXB0aW9uO1xuICAgIH1cbiAgICBfZ2V0VHlwZShpbnB1dCkge1xuICAgICAgICByZXR1cm4gZ2V0UGFyc2VkVHlwZShpbnB1dC5kYXRhKTtcbiAgICB9XG4gICAgX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpIHtcbiAgICAgICAgcmV0dXJuIChjdHggfHwge1xuICAgICAgICAgICAgY29tbW9uOiBpbnB1dC5wYXJlbnQuY29tbW9uLFxuICAgICAgICAgICAgZGF0YTogaW5wdXQuZGF0YSxcbiAgICAgICAgICAgIHBhcnNlZFR5cGU6IGdldFBhcnNlZFR5cGUoaW5wdXQuZGF0YSksXG4gICAgICAgICAgICBzY2hlbWFFcnJvck1hcDogdGhpcy5fZGVmLmVycm9yTWFwLFxuICAgICAgICAgICAgcGF0aDogaW5wdXQucGF0aCxcbiAgICAgICAgICAgIHBhcmVudDogaW5wdXQucGFyZW50LFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgX3Byb2Nlc3NJbnB1dFBhcmFtcyhpbnB1dCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3RhdHVzOiBuZXcgUGFyc2VTdGF0dXMoKSxcbiAgICAgICAgICAgIGN0eDoge1xuICAgICAgICAgICAgICAgIGNvbW1vbjogaW5wdXQucGFyZW50LmNvbW1vbixcbiAgICAgICAgICAgICAgICBkYXRhOiBpbnB1dC5kYXRhLFxuICAgICAgICAgICAgICAgIHBhcnNlZFR5cGU6IGdldFBhcnNlZFR5cGUoaW5wdXQuZGF0YSksXG4gICAgICAgICAgICAgICAgc2NoZW1hRXJyb3JNYXA6IHRoaXMuX2RlZi5lcnJvck1hcCxcbiAgICAgICAgICAgICAgICBwYXRoOiBpbnB1dC5wYXRoLFxuICAgICAgICAgICAgICAgIHBhcmVudDogaW5wdXQucGFyZW50LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgX3BhcnNlU3luYyhpbnB1dCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9wYXJzZShpbnB1dCk7XG4gICAgICAgIGlmIChpc0FzeW5jKHJlc3VsdCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlN5bmNocm9ub3VzIHBhcnNlIGVuY291bnRlcmVkIHByb21pc2UuXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIF9wYXJzZUFzeW5jKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX3BhcnNlKGlucHV0KTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXN1bHQpO1xuICAgIH1cbiAgICBwYXJzZShkYXRhLCBwYXJhbXMpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5zYWZlUGFyc2UoZGF0YSwgcGFyYW1zKTtcbiAgICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5kYXRhO1xuICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgfVxuICAgIHNhZmVQYXJzZShkYXRhLCBwYXJhbXMpIHtcbiAgICAgICAgY29uc3QgY3R4ID0ge1xuICAgICAgICAgICAgY29tbW9uOiB7XG4gICAgICAgICAgICAgICAgaXNzdWVzOiBbXSxcbiAgICAgICAgICAgICAgICBhc3luYzogcGFyYW1zPy5hc3luYyA/PyBmYWxzZSxcbiAgICAgICAgICAgICAgICBjb250ZXh0dWFsRXJyb3JNYXA6IHBhcmFtcz8uZXJyb3JNYXAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcGF0aDogcGFyYW1zPy5wYXRoIHx8IFtdLFxuICAgICAgICAgICAgc2NoZW1hRXJyb3JNYXA6IHRoaXMuX2RlZi5lcnJvck1hcCxcbiAgICAgICAgICAgIHBhcmVudDogbnVsbCxcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICBwYXJzZWRUeXBlOiBnZXRQYXJzZWRUeXBlKGRhdGEpLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9wYXJzZVN5bmMoeyBkYXRhLCBwYXRoOiBjdHgucGF0aCwgcGFyZW50OiBjdHggfSk7XG4gICAgICAgIHJldHVybiBoYW5kbGVSZXN1bHQoY3R4LCByZXN1bHQpO1xuICAgIH1cbiAgICBcIn52YWxpZGF0ZVwiKGRhdGEpIHtcbiAgICAgICAgY29uc3QgY3R4ID0ge1xuICAgICAgICAgICAgY29tbW9uOiB7XG4gICAgICAgICAgICAgICAgaXNzdWVzOiBbXSxcbiAgICAgICAgICAgICAgICBhc3luYzogISF0aGlzW1wifnN0YW5kYXJkXCJdLmFzeW5jLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHBhdGg6IFtdLFxuICAgICAgICAgICAgc2NoZW1hRXJyb3JNYXA6IHRoaXMuX2RlZi5lcnJvck1hcCxcbiAgICAgICAgICAgIHBhcmVudDogbnVsbCxcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICBwYXJzZWRUeXBlOiBnZXRQYXJzZWRUeXBlKGRhdGEpLFxuICAgICAgICB9O1xuICAgICAgICBpZiAoIXRoaXNbXCJ+c3RhbmRhcmRcIl0uYXN5bmMpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fcGFyc2VTeW5jKHsgZGF0YSwgcGF0aDogW10sIHBhcmVudDogY3R4IH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBpc1ZhbGlkKHJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogcmVzdWx0LnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNzdWVzOiBjdHguY29tbW9uLmlzc3VlcyxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyPy5tZXNzYWdlPy50b0xvd2VyQ2FzZSgpPy5pbmNsdWRlcyhcImVuY291bnRlcmVkXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXNbXCJ+c3RhbmRhcmRcIl0uYXN5bmMgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjdHguY29tbW9uID0ge1xuICAgICAgICAgICAgICAgICAgICBpc3N1ZXM6IFtdLFxuICAgICAgICAgICAgICAgICAgICBhc3luYzogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJzZUFzeW5jKHsgZGF0YSwgcGF0aDogW10sIHBhcmVudDogY3R4IH0pLnRoZW4oKHJlc3VsdCkgPT4gaXNWYWxpZChyZXN1bHQpXG4gICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogcmVzdWx0LnZhbHVlLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgaXNzdWVzOiBjdHguY29tbW9uLmlzc3VlcyxcbiAgICAgICAgICAgIH0pO1xuICAgIH1cbiAgICBhc3luYyBwYXJzZUFzeW5jKGRhdGEsIHBhcmFtcykge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNhZmVQYXJzZUFzeW5jKGRhdGEsIHBhcmFtcyk7XG4gICAgICAgIGlmIChyZXN1bHQuc3VjY2VzcylcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQuZGF0YTtcbiAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgIH1cbiAgICBhc3luYyBzYWZlUGFyc2VBc3luYyhkYXRhLCBwYXJhbXMpIHtcbiAgICAgICAgY29uc3QgY3R4ID0ge1xuICAgICAgICAgICAgY29tbW9uOiB7XG4gICAgICAgICAgICAgICAgaXNzdWVzOiBbXSxcbiAgICAgICAgICAgICAgICBjb250ZXh0dWFsRXJyb3JNYXA6IHBhcmFtcz8uZXJyb3JNYXAsXG4gICAgICAgICAgICAgICAgYXN5bmM6IHRydWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcGF0aDogcGFyYW1zPy5wYXRoIHx8IFtdLFxuICAgICAgICAgICAgc2NoZW1hRXJyb3JNYXA6IHRoaXMuX2RlZi5lcnJvck1hcCxcbiAgICAgICAgICAgIHBhcmVudDogbnVsbCxcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICBwYXJzZWRUeXBlOiBnZXRQYXJzZWRUeXBlKGRhdGEpLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBtYXliZUFzeW5jUmVzdWx0ID0gdGhpcy5fcGFyc2UoeyBkYXRhLCBwYXRoOiBjdHgucGF0aCwgcGFyZW50OiBjdHggfSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IChpc0FzeW5jKG1heWJlQXN5bmNSZXN1bHQpID8gbWF5YmVBc3luY1Jlc3VsdCA6IFByb21pc2UucmVzb2x2ZShtYXliZUFzeW5jUmVzdWx0KSk7XG4gICAgICAgIHJldHVybiBoYW5kbGVSZXN1bHQoY3R4LCByZXN1bHQpO1xuICAgIH1cbiAgICByZWZpbmUoY2hlY2ssIG1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3QgZ2V0SXNzdWVQcm9wZXJ0aWVzID0gKHZhbCkgPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBtZXNzYWdlID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiBtZXNzYWdlID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgbWVzc2FnZSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIG1lc3NhZ2UgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBtZXNzYWdlKHZhbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlZmluZW1lbnQoKHZhbCwgY3R4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBjaGVjayh2YWwpO1xuICAgICAgICAgICAgY29uc3Qgc2V0RXJyb3IgPSAoKSA9PiBjdHguYWRkSXNzdWUoe1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5jdXN0b20sXG4gICAgICAgICAgICAgICAgLi4uZ2V0SXNzdWVQcm9wZXJ0aWVzKHZhbCksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgUHJvbWlzZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiByZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC50aGVuKChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0RXJyb3IoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHNldEVycm9yKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZWZpbmVtZW50KGNoZWNrLCByZWZpbmVtZW50RGF0YSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVmaW5lbWVudCgodmFsLCBjdHgpID0+IHtcbiAgICAgICAgICAgIGlmICghY2hlY2sodmFsKSkge1xuICAgICAgICAgICAgICAgIGN0eC5hZGRJc3N1ZSh0eXBlb2YgcmVmaW5lbWVudERhdGEgPT09IFwiZnVuY3Rpb25cIiA/IHJlZmluZW1lbnREYXRhKHZhbCwgY3R4KSA6IHJlZmluZW1lbnREYXRhKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIF9yZWZpbmVtZW50KHJlZmluZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RFZmZlY3RzKHtcbiAgICAgICAgICAgIHNjaGVtYTogdGhpcyxcbiAgICAgICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kRWZmZWN0cyxcbiAgICAgICAgICAgIGVmZmVjdDogeyB0eXBlOiBcInJlZmluZW1lbnRcIiwgcmVmaW5lbWVudCB9LFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3VwZXJSZWZpbmUocmVmaW5lbWVudCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVmaW5lbWVudChyZWZpbmVtZW50KTtcbiAgICB9XG4gICAgY29uc3RydWN0b3IoZGVmKSB7XG4gICAgICAgIC8qKiBBbGlhcyBvZiBzYWZlUGFyc2VBc3luYyAqL1xuICAgICAgICB0aGlzLnNwYSA9IHRoaXMuc2FmZVBhcnNlQXN5bmM7XG4gICAgICAgIHRoaXMuX2RlZiA9IGRlZjtcbiAgICAgICAgdGhpcy5wYXJzZSA9IHRoaXMucGFyc2UuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5zYWZlUGFyc2UgPSB0aGlzLnNhZmVQYXJzZS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnBhcnNlQXN5bmMgPSB0aGlzLnBhcnNlQXN5bmMuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5zYWZlUGFyc2VBc3luYyA9IHRoaXMuc2FmZVBhcnNlQXN5bmMuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5zcGEgPSB0aGlzLnNwYS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnJlZmluZSA9IHRoaXMucmVmaW5lLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMucmVmaW5lbWVudCA9IHRoaXMucmVmaW5lbWVudC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnN1cGVyUmVmaW5lID0gdGhpcy5zdXBlclJlZmluZS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLm9wdGlvbmFsID0gdGhpcy5vcHRpb25hbC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLm51bGxhYmxlID0gdGhpcy5udWxsYWJsZS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLm51bGxpc2ggPSB0aGlzLm51bGxpc2guYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5hcnJheSA9IHRoaXMuYXJyYXkuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5wcm9taXNlID0gdGhpcy5wcm9taXNlLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMub3IgPSB0aGlzLm9yLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuYW5kID0gdGhpcy5hbmQuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy50cmFuc2Zvcm0gPSB0aGlzLnRyYW5zZm9ybS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmJyYW5kID0gdGhpcy5icmFuZC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmRlZmF1bHQgPSB0aGlzLmRlZmF1bHQuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5jYXRjaCA9IHRoaXMuY2F0Y2guYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5kZXNjcmliZSA9IHRoaXMuZGVzY3JpYmUuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5waXBlID0gdGhpcy5waXBlLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMucmVhZG9ubHkgPSB0aGlzLnJlYWRvbmx5LmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuaXNOdWxsYWJsZSA9IHRoaXMuaXNOdWxsYWJsZS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmlzT3B0aW9uYWwgPSB0aGlzLmlzT3B0aW9uYWwuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpc1tcIn5zdGFuZGFyZFwiXSA9IHtcbiAgICAgICAgICAgIHZlcnNpb246IDEsXG4gICAgICAgICAgICB2ZW5kb3I6IFwiem9kXCIsXG4gICAgICAgICAgICB2YWxpZGF0ZTogKGRhdGEpID0+IHRoaXNbXCJ+dmFsaWRhdGVcIl0oZGF0YSksXG4gICAgICAgIH07XG4gICAgfVxuICAgIG9wdGlvbmFsKCkge1xuICAgICAgICByZXR1cm4gWm9kT3B0aW9uYWwuY3JlYXRlKHRoaXMsIHRoaXMuX2RlZik7XG4gICAgfVxuICAgIG51bGxhYmxlKCkge1xuICAgICAgICByZXR1cm4gWm9kTnVsbGFibGUuY3JlYXRlKHRoaXMsIHRoaXMuX2RlZik7XG4gICAgfVxuICAgIG51bGxpc2goKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm51bGxhYmxlKCkub3B0aW9uYWwoKTtcbiAgICB9XG4gICAgYXJyYXkoKSB7XG4gICAgICAgIHJldHVybiBab2RBcnJheS5jcmVhdGUodGhpcyk7XG4gICAgfVxuICAgIHByb21pc2UoKSB7XG4gICAgICAgIHJldHVybiBab2RQcm9taXNlLmNyZWF0ZSh0aGlzLCB0aGlzLl9kZWYpO1xuICAgIH1cbiAgICBvcihvcHRpb24pIHtcbiAgICAgICAgcmV0dXJuIFpvZFVuaW9uLmNyZWF0ZShbdGhpcywgb3B0aW9uXSwgdGhpcy5fZGVmKTtcbiAgICB9XG4gICAgYW5kKGluY29taW5nKSB7XG4gICAgICAgIHJldHVybiBab2RJbnRlcnNlY3Rpb24uY3JlYXRlKHRoaXMsIGluY29taW5nLCB0aGlzLl9kZWYpO1xuICAgIH1cbiAgICB0cmFuc2Zvcm0odHJhbnNmb3JtKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kRWZmZWN0cyh7XG4gICAgICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHRoaXMuX2RlZiksXG4gICAgICAgICAgICBzY2hlbWE6IHRoaXMsXG4gICAgICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEVmZmVjdHMsXG4gICAgICAgICAgICBlZmZlY3Q6IHsgdHlwZTogXCJ0cmFuc2Zvcm1cIiwgdHJhbnNmb3JtIH0sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBkZWZhdWx0KGRlZikge1xuICAgICAgICBjb25zdCBkZWZhdWx0VmFsdWVGdW5jID0gdHlwZW9mIGRlZiA9PT0gXCJmdW5jdGlvblwiID8gZGVmIDogKCkgPT4gZGVmO1xuICAgICAgICByZXR1cm4gbmV3IFpvZERlZmF1bHQoe1xuICAgICAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyh0aGlzLl9kZWYpLFxuICAgICAgICAgICAgaW5uZXJUeXBlOiB0aGlzLFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBkZWZhdWx0VmFsdWVGdW5jLFxuICAgICAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2REZWZhdWx0LFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgYnJhbmQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kQnJhbmRlZCh7XG4gICAgICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEJyYW5kZWQsXG4gICAgICAgICAgICB0eXBlOiB0aGlzLFxuICAgICAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyh0aGlzLl9kZWYpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgY2F0Y2goZGVmKSB7XG4gICAgICAgIGNvbnN0IGNhdGNoVmFsdWVGdW5jID0gdHlwZW9mIGRlZiA9PT0gXCJmdW5jdGlvblwiID8gZGVmIDogKCkgPT4gZGVmO1xuICAgICAgICByZXR1cm4gbmV3IFpvZENhdGNoKHtcbiAgICAgICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXModGhpcy5fZGVmKSxcbiAgICAgICAgICAgIGlubmVyVHlwZTogdGhpcyxcbiAgICAgICAgICAgIGNhdGNoVmFsdWU6IGNhdGNoVmFsdWVGdW5jLFxuICAgICAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RDYXRjaCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGRlc2NyaWJlKGRlc2NyaXB0aW9uKSB7XG4gICAgICAgIGNvbnN0IFRoaXMgPSB0aGlzLmNvbnN0cnVjdG9yO1xuICAgICAgICByZXR1cm4gbmV3IFRoaXMoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwaXBlKHRhcmdldCkge1xuICAgICAgICByZXR1cm4gWm9kUGlwZWxpbmUuY3JlYXRlKHRoaXMsIHRhcmdldCk7XG4gICAgfVxuICAgIHJlYWRvbmx5KCkge1xuICAgICAgICByZXR1cm4gWm9kUmVhZG9ubHkuY3JlYXRlKHRoaXMpO1xuICAgIH1cbiAgICBpc09wdGlvbmFsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zYWZlUGFyc2UodW5kZWZpbmVkKS5zdWNjZXNzO1xuICAgIH1cbiAgICBpc051bGxhYmxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zYWZlUGFyc2UobnVsbCkuc3VjY2VzcztcbiAgICB9XG59XG5jb25zdCBjdWlkUmVnZXggPSAvXmNbXlxccy1dezgsfSQvaTtcbmNvbnN0IGN1aWQyUmVnZXggPSAvXlswLTlhLXpdKyQvO1xuY29uc3QgdWxpZFJlZ2V4ID0gL15bMC05QS1ISktNTlAtVFYtWl17MjZ9JC9pO1xuLy8gY29uc3QgdXVpZFJlZ2V4ID1cbi8vICAgL14oW2EtZjAtOV17OH0tW2EtZjAtOV17NH0tWzEtNV1bYS1mMC05XXszfS1bYS1mMC05XXs0fS1bYS1mMC05XXsxMn18MDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwKSQvaTtcbmNvbnN0IHV1aWRSZWdleCA9IC9eWzAtOWEtZkEtRl17OH1cXGItWzAtOWEtZkEtRl17NH1cXGItWzAtOWEtZkEtRl17NH1cXGItWzAtOWEtZkEtRl17NH1cXGItWzAtOWEtZkEtRl17MTJ9JC9pO1xuY29uc3QgbmFub2lkUmVnZXggPSAvXlthLXowLTlfLV17MjF9JC9pO1xuY29uc3Qgand0UmVnZXggPSAvXltBLVphLXowLTktX10rXFwuW0EtWmEtejAtOS1fXStcXC5bQS1aYS16MC05LV9dKiQvO1xuY29uc3QgZHVyYXRpb25SZWdleCA9IC9eWy0rXT9QKD8hJCkoPzooPzpbLStdP1xcZCtZKXwoPzpbLStdP1xcZCtbLixdXFxkK1kkKSk/KD86KD86Wy0rXT9cXGQrTSl8KD86Wy0rXT9cXGQrWy4sXVxcZCtNJCkpPyg/Oig/OlstK10/XFxkK1cpfCg/OlstK10/XFxkK1suLF1cXGQrVyQpKT8oPzooPzpbLStdP1xcZCtEKXwoPzpbLStdP1xcZCtbLixdXFxkK0QkKSk/KD86VCg/PVtcXGQrLV0pKD86KD86Wy0rXT9cXGQrSCl8KD86Wy0rXT9cXGQrWy4sXVxcZCtIJCkpPyg/Oig/OlstK10/XFxkK00pfCg/OlstK10/XFxkK1suLF1cXGQrTSQpKT8oPzpbLStdP1xcZCsoPzpbLixdXFxkKyk/Uyk/KT8/JC87XG4vLyBmcm9tIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS80NjE4MS8xNTUwMTU1XG4vLyBvbGQgdmVyc2lvbjogdG9vIHNsb3csIGRpZG4ndCBzdXBwb3J0IHVuaWNvZGVcbi8vIGNvbnN0IGVtYWlsUmVnZXggPSAvXigoKFthLXpdfFxcZHxbISNcXCQlJidcXCpcXCtcXC1cXC89XFw/XFxeX2B7XFx8fX5dfFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKSsoXFwuKFthLXpdfFxcZHxbISNcXCQlJidcXCpcXCtcXC1cXC89XFw/XFxeX2B7XFx8fX5dfFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKSspKil8KChcXHgyMikoKCgoXFx4MjB8XFx4MDkpKihcXHgwZFxceDBhKSk/KFxceDIwfFxceDA5KSspPygoW1xceDAxLVxceDA4XFx4MGJcXHgwY1xceDBlLVxceDFmXFx4N2ZdfFxceDIxfFtcXHgyMy1cXHg1Yl18W1xceDVkLVxceDdlXXxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSl8KFxcXFwoW1xceDAxLVxceDA5XFx4MGJcXHgwY1xceDBkLVxceDdmXXxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSkpKSkqKCgoXFx4MjB8XFx4MDkpKihcXHgwZFxceDBhKSk/KFxceDIwfFxceDA5KSspPyhcXHgyMikpKUAoKChbYS16XXxcXGR8W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pfCgoW2Etel18XFxkfFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKShbYS16XXxcXGR8LXxcXC58X3x+fFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKSooW2Etel18XFxkfFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKSkpXFwuKSsoKFthLXpdfFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKXwoKFthLXpdfFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKShbYS16XXxcXGR8LXxcXC58X3x+fFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKSooW2Etel18W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKSkkL2k7XG4vL29sZCBlbWFpbCByZWdleFxuLy8gY29uc3QgZW1haWxSZWdleCA9IC9eKChbXjw+KClbXFxdLiw7Olxcc0BcIl0rKFxcLltePD4oKVtcXF0uLDs6XFxzQFwiXSspKil8KFwiLitcIikpQCgoPyEtKShbXjw+KClbXFxdLiw7Olxcc0BcIl0rXFwuKStbXjw+KClbXFxdLiw7Olxcc0BcIl17MSx9KVteLTw+KClbXFxdLiw7Olxcc0BcIl0kL2k7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbi8vIGNvbnN0IGVtYWlsUmVnZXggPVxuLy8gICAvXigoW148PigpW1xcXVxcXFwuLDs6XFxzQFxcXCJdKyhcXC5bXjw+KClbXFxdXFxcXC4sOzpcXHNAXFxcIl0rKSopfChcXFwiLitcXFwiKSlAKChcXFsoKCgyNVswLTVdKXwoMlswLTRdWzAtOV0pfCgxWzAtOV17Mn0pfChbMC05XXsxLDJ9KSlcXC4pezN9KCgyNVswLTVdKXwoMlswLTRdWzAtOV0pfCgxWzAtOV17Mn0pfChbMC05XXsxLDJ9KSlcXF0pfChcXFtJUHY2OigoW2EtZjAtOV17MSw0fTopezd9fDo6KFthLWYwLTldezEsNH06KXswLDZ9fChbYS1mMC05XXsxLDR9Oil7MX06KFthLWYwLTldezEsNH06KXswLDV9fChbYS1mMC05XXsxLDR9Oil7Mn06KFthLWYwLTldezEsNH06KXswLDR9fChbYS1mMC05XXsxLDR9Oil7M306KFthLWYwLTldezEsNH06KXswLDN9fChbYS1mMC05XXsxLDR9Oil7NH06KFthLWYwLTldezEsNH06KXswLDJ9fChbYS1mMC05XXsxLDR9Oil7NX06KFthLWYwLTldezEsNH06KXswLDF9KShbYS1mMC05XXsxLDR9fCgoKDI1WzAtNV0pfCgyWzAtNF1bMC05XSl8KDFbMC05XXsyfSl8KFswLTldezEsMn0pKVxcLil7M30oKDI1WzAtNV0pfCgyWzAtNF1bMC05XSl8KDFbMC05XXsyfSl8KFswLTldezEsMn0pKSlcXF0pfChbQS1aYS16MC05XShbQS1aYS16MC05LV0qW0EtWmEtejAtOV0pKihcXC5bQS1aYS16XXsyLH0pKykpJC87XG4vLyBjb25zdCBlbWFpbFJlZ2V4ID1cbi8vICAgL15bYS16QS1aMC05XFwuXFwhXFwjXFwkXFwlXFwmXFwnXFwqXFwrXFwvXFw9XFw/XFxeXFxfXFxgXFx7XFx8XFx9XFx+XFwtXStAW2EtekEtWjAtOV0oPzpbYS16QS1aMC05LV17MCw2MX1bYS16QS1aMC05XSk/KD86XFwuW2EtekEtWjAtOV0oPzpbYS16QS1aMC05LV17MCw2MX1bYS16QS1aMC05XSk/KSokLztcbi8vIGNvbnN0IGVtYWlsUmVnZXggPVxuLy8gICAvXig/OlthLXowLTkhIyQlJicqKy89P15fYHt8fX4tXSsoPzpcXC5bYS16MC05ISMkJSYnKisvPT9eX2B7fH1+LV0rKSp8XCIoPzpbXFx4MDEtXFx4MDhcXHgwYlxceDBjXFx4MGUtXFx4MWZcXHgyMVxceDIzLVxceDViXFx4NWQtXFx4N2ZdfFxcXFxbXFx4MDEtXFx4MDlcXHgwYlxceDBjXFx4MGUtXFx4N2ZdKSpcIilAKD86KD86W2EtejAtOV0oPzpbYS16MC05LV0qW2EtejAtOV0pP1xcLikrW2EtejAtOV0oPzpbYS16MC05LV0qW2EtejAtOV0pP3xcXFsoPzooPzoyNVswLTVdfDJbMC00XVswLTldfFswMV0/WzAtOV1bMC05XT8pXFwuKXszfSg/OjI1WzAtNV18MlswLTRdWzAtOV18WzAxXT9bMC05XVswLTldP3xbYS16MC05LV0qW2EtejAtOV06KD86W1xceDAxLVxceDA4XFx4MGJcXHgwY1xceDBlLVxceDFmXFx4MjEtXFx4NWFcXHg1My1cXHg3Zl18XFxcXFtcXHgwMS1cXHgwOVxceDBiXFx4MGNcXHgwZS1cXHg3Zl0pKylcXF0pJC9pO1xuY29uc3QgZW1haWxSZWdleCA9IC9eKD8hXFwuKSg/IS4qXFwuXFwuKShbQS1aMC05XycrXFwtXFwuXSopW0EtWjAtOV8rLV1AKFtBLVowLTldW0EtWjAtOVxcLV0qXFwuKStbQS1aXXsyLH0kL2k7XG4vLyBjb25zdCBlbWFpbFJlZ2V4ID1cbi8vICAgL15bYS16MC05LiEjJCUm4oCZKisvPT9eX2B7fH1+LV0rQFthLXowLTktXSsoPzpcXC5bYS16MC05XFwtXSspKiQvaTtcbi8vIGZyb20gaHR0cHM6Ly90aGVrZXZpbnNjb3R0LmNvbS9lbW9qaXMtaW4tamF2YXNjcmlwdC8jd3JpdGluZy1hLXJlZ3VsYXItZXhwcmVzc2lvblxuY29uc3QgX2Vtb2ppUmVnZXggPSBgXihcXFxccHtFeHRlbmRlZF9QaWN0b2dyYXBoaWN9fFxcXFxwe0Vtb2ppX0NvbXBvbmVudH0pKyRgO1xubGV0IGVtb2ppUmVnZXg7XG4vLyBmYXN0ZXIsIHNpbXBsZXIsIHNhZmVyXG5jb25zdCBpcHY0UmVnZXggPSAvXig/Oig/OjI1WzAtNV18MlswLTRdWzAtOV18MVswLTldWzAtOV18WzEtOV1bMC05XXxbMC05XSlcXC4pezN9KD86MjVbMC01XXwyWzAtNF1bMC05XXwxWzAtOV1bMC05XXxbMS05XVswLTldfFswLTldKSQvO1xuY29uc3QgaXB2NENpZHJSZWdleCA9IC9eKD86KD86MjVbMC01XXwyWzAtNF1bMC05XXwxWzAtOV1bMC05XXxbMS05XVswLTldfFswLTldKVxcLil7M30oPzoyNVswLTVdfDJbMC00XVswLTldfDFbMC05XVswLTldfFsxLTldWzAtOV18WzAtOV0pXFwvKDNbMC0yXXxbMTJdP1swLTldKSQvO1xuLy8gY29uc3QgaXB2NlJlZ2V4ID1cbi8vIC9eKChbYS1mMC05XXsxLDR9Oil7N318OjooW2EtZjAtOV17MSw0fTopezAsNn18KFthLWYwLTldezEsNH06KXsxfTooW2EtZjAtOV17MSw0fTopezAsNX18KFthLWYwLTldezEsNH06KXsyfTooW2EtZjAtOV17MSw0fTopezAsNH18KFthLWYwLTldezEsNH06KXszfTooW2EtZjAtOV17MSw0fTopezAsM318KFthLWYwLTldezEsNH06KXs0fTooW2EtZjAtOV17MSw0fTopezAsMn18KFthLWYwLTldezEsNH06KXs1fTooW2EtZjAtOV17MSw0fTopezAsMX0pKFthLWYwLTldezEsNH18KCgoMjVbMC01XSl8KDJbMC00XVswLTldKXwoMVswLTldezJ9KXwoWzAtOV17MSwyfSkpXFwuKXszfSgoMjVbMC01XSl8KDJbMC00XVswLTldKXwoMVswLTldezJ9KXwoWzAtOV17MSwyfSkpKSQvO1xuY29uc3QgaXB2NlJlZ2V4ID0gL14oKFswLTlhLWZBLUZdezEsNH06KXs3LDd9WzAtOWEtZkEtRl17MSw0fXwoWzAtOWEtZkEtRl17MSw0fTopezEsN306fChbMC05YS1mQS1GXXsxLDR9Oil7MSw2fTpbMC05YS1mQS1GXXsxLDR9fChbMC05YS1mQS1GXXsxLDR9Oil7MSw1fSg6WzAtOWEtZkEtRl17MSw0fSl7MSwyfXwoWzAtOWEtZkEtRl17MSw0fTopezEsNH0oOlswLTlhLWZBLUZdezEsNH0pezEsM318KFswLTlhLWZBLUZdezEsNH06KXsxLDN9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDR9fChbMC05YS1mQS1GXXsxLDR9Oil7MSwyfSg6WzAtOWEtZkEtRl17MSw0fSl7MSw1fXxbMC05YS1mQS1GXXsxLDR9OigoOlswLTlhLWZBLUZdezEsNH0pezEsNn0pfDooKDpbMC05YS1mQS1GXXsxLDR9KXsxLDd9fDopfGZlODA6KDpbMC05YS1mQS1GXXswLDR9KXswLDR9JVswLTlhLXpBLVpdezEsfXw6OihmZmZmKDowezEsNH0pezAsMX06KXswLDF9KCgyNVswLTVdfCgyWzAtNF18MXswLDF9WzAtOV0pezAsMX1bMC05XSlcXC4pezMsM30oMjVbMC01XXwoMlswLTRdfDF7MCwxfVswLTldKXswLDF9WzAtOV0pfChbMC05YS1mQS1GXXsxLDR9Oil7MSw0fTooKDI1WzAtNV18KDJbMC00XXwxezAsMX1bMC05XSl7MCwxfVswLTldKVxcLil7MywzfSgyNVswLTVdfCgyWzAtNF18MXswLDF9WzAtOV0pezAsMX1bMC05XSkpJC87XG5jb25zdCBpcHY2Q2lkclJlZ2V4ID0gL14oKFswLTlhLWZBLUZdezEsNH06KXs3LDd9WzAtOWEtZkEtRl17MSw0fXwoWzAtOWEtZkEtRl17MSw0fTopezEsN306fChbMC05YS1mQS1GXXsxLDR9Oil7MSw2fTpbMC05YS1mQS1GXXsxLDR9fChbMC05YS1mQS1GXXsxLDR9Oil7MSw1fSg6WzAtOWEtZkEtRl17MSw0fSl7MSwyfXwoWzAtOWEtZkEtRl17MSw0fTopezEsNH0oOlswLTlhLWZBLUZdezEsNH0pezEsM318KFswLTlhLWZBLUZdezEsNH06KXsxLDN9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDR9fChbMC05YS1mQS1GXXsxLDR9Oil7MSwyfSg6WzAtOWEtZkEtRl17MSw0fSl7MSw1fXxbMC05YS1mQS1GXXsxLDR9OigoOlswLTlhLWZBLUZdezEsNH0pezEsNn0pfDooKDpbMC05YS1mQS1GXXsxLDR9KXsxLDd9fDopfGZlODA6KDpbMC05YS1mQS1GXXswLDR9KXswLDR9JVswLTlhLXpBLVpdezEsfXw6OihmZmZmKDowezEsNH0pezAsMX06KXswLDF9KCgyNVswLTVdfCgyWzAtNF18MXswLDF9WzAtOV0pezAsMX1bMC05XSlcXC4pezMsM30oMjVbMC01XXwoMlswLTRdfDF7MCwxfVswLTldKXswLDF9WzAtOV0pfChbMC05YS1mQS1GXXsxLDR9Oil7MSw0fTooKDI1WzAtNV18KDJbMC00XXwxezAsMX1bMC05XSl7MCwxfVswLTldKVxcLil7MywzfSgyNVswLTVdfCgyWzAtNF18MXswLDF9WzAtOV0pezAsMX1bMC05XSkpXFwvKDEyWzAtOF18MVswMV1bMC05XXxbMS05XT9bMC05XSkkLztcbi8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzc4NjAzOTIvZGV0ZXJtaW5lLWlmLXN0cmluZy1pcy1pbi1iYXNlNjQtdXNpbmctamF2YXNjcmlwdFxuY29uc3QgYmFzZTY0UmVnZXggPSAvXihbMC05YS16QS1aKy9dezR9KSooKFswLTlhLXpBLVorL117Mn09PSl8KFswLTlhLXpBLVorL117M309KSk/JC87XG4vLyBodHRwczovL2Jhc2U2NC5ndXJ1L3N0YW5kYXJkcy9iYXNlNjR1cmxcbmNvbnN0IGJhc2U2NHVybFJlZ2V4ID0gL14oWzAtOWEtekEtWi1fXXs0fSkqKChbMC05YS16QS1aLV9dezJ9KD09KT8pfChbMC05YS16QS1aLV9dezN9KD0pPykpPyQvO1xuLy8gc2ltcGxlXG4vLyBjb25zdCBkYXRlUmVnZXhTb3VyY2UgPSBgXFxcXGR7NH0tXFxcXGR7Mn0tXFxcXGR7Mn1gO1xuLy8gbm8gbGVhcCB5ZWFyIHZhbGlkYXRpb25cbi8vIGNvbnN0IGRhdGVSZWdleFNvdXJjZSA9IGBcXFxcZHs0fS0oKDBbMTM1NzhdfDEwfDEyKS0zMXwoMFsxMy05XXwxWzAtMl0pLTMwfCgwWzEtOV18MVswLTJdKS0oMFsxLTldfDFcXFxcZHwyXFxcXGQpKWA7XG4vLyB3aXRoIGxlYXAgeWVhciB2YWxpZGF0aW9uXG5jb25zdCBkYXRlUmVnZXhTb3VyY2UgPSBgKChcXFxcZFxcXFxkWzI0NjhdWzA0OF18XFxcXGRcXFxcZFsxMzU3OV1bMjZdfFxcXFxkXFxcXGQwWzQ4XXxbMDI0NjhdWzA0OF0wMHxbMTM1NzldWzI2XTAwKS0wMi0yOXxcXFxcZHs0fS0oKDBbMTM1NzhdfDFbMDJdKS0oMFsxLTldfFsxMl1cXFxcZHwzWzAxXSl8KDBbNDY5XXwxMSktKDBbMS05XXxbMTJdXFxcXGR8MzApfCgwMiktKDBbMS05XXwxXFxcXGR8MlswLThdKSkpYDtcbmNvbnN0IGRhdGVSZWdleCA9IG5ldyBSZWdFeHAoYF4ke2RhdGVSZWdleFNvdXJjZX0kYCk7XG5mdW5jdGlvbiB0aW1lUmVnZXhTb3VyY2UoYXJncykge1xuICAgIGxldCBzZWNvbmRzUmVnZXhTb3VyY2UgPSBgWzAtNV1cXFxcZGA7XG4gICAgaWYgKGFyZ3MucHJlY2lzaW9uKSB7XG4gICAgICAgIHNlY29uZHNSZWdleFNvdXJjZSA9IGAke3NlY29uZHNSZWdleFNvdXJjZX1cXFxcLlxcXFxkeyR7YXJncy5wcmVjaXNpb259fWA7XG4gICAgfVxuICAgIGVsc2UgaWYgKGFyZ3MucHJlY2lzaW9uID09IG51bGwpIHtcbiAgICAgICAgc2Vjb25kc1JlZ2V4U291cmNlID0gYCR7c2Vjb25kc1JlZ2V4U291cmNlfShcXFxcLlxcXFxkKyk/YDtcbiAgICB9XG4gICAgY29uc3Qgc2Vjb25kc1F1YW50aWZpZXIgPSBhcmdzLnByZWNpc2lvbiA/IFwiK1wiIDogXCI/XCI7IC8vIHJlcXVpcmUgc2Vjb25kcyBpZiBwcmVjaXNpb24gaXMgbm9uemVyb1xuICAgIHJldHVybiBgKFswMV1cXFxcZHwyWzAtM10pOlswLTVdXFxcXGQoOiR7c2Vjb25kc1JlZ2V4U291cmNlfSkke3NlY29uZHNRdWFudGlmaWVyfWA7XG59XG5mdW5jdGlvbiB0aW1lUmVnZXgoYXJncykge1xuICAgIHJldHVybiBuZXcgUmVnRXhwKGBeJHt0aW1lUmVnZXhTb3VyY2UoYXJncyl9JGApO1xufVxuLy8gQWRhcHRlZCBmcm9tIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8zMTQzMjMxXG5leHBvcnQgZnVuY3Rpb24gZGF0ZXRpbWVSZWdleChhcmdzKSB7XG4gICAgbGV0IHJlZ2V4ID0gYCR7ZGF0ZVJlZ2V4U291cmNlfVQke3RpbWVSZWdleFNvdXJjZShhcmdzKX1gO1xuICAgIGNvbnN0IG9wdHMgPSBbXTtcbiAgICBvcHRzLnB1c2goYXJncy5sb2NhbCA/IGBaP2AgOiBgWmApO1xuICAgIGlmIChhcmdzLm9mZnNldClcbiAgICAgICAgb3B0cy5wdXNoKGAoWystXVxcXFxkezJ9Oj9cXFxcZHsyfSlgKTtcbiAgICByZWdleCA9IGAke3JlZ2V4fSgke29wdHMuam9pbihcInxcIil9KWA7XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoYF4ke3JlZ2V4fSRgKTtcbn1cbmZ1bmN0aW9uIGlzVmFsaWRJUChpcCwgdmVyc2lvbikge1xuICAgIGlmICgodmVyc2lvbiA9PT0gXCJ2NFwiIHx8ICF2ZXJzaW9uKSAmJiBpcHY0UmVnZXgudGVzdChpcCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmICgodmVyc2lvbiA9PT0gXCJ2NlwiIHx8ICF2ZXJzaW9uKSAmJiBpcHY2UmVnZXgudGVzdChpcCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGlzVmFsaWRKV1Qoand0LCBhbGcpIHtcbiAgICBpZiAoIWp3dFJlZ2V4LnRlc3Qoand0KSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IFtoZWFkZXJdID0gand0LnNwbGl0KFwiLlwiKTtcbiAgICAgICAgLy8gQ29udmVydCBiYXNlNjR1cmwgdG8gYmFzZTY0XG4gICAgICAgIGNvbnN0IGJhc2U2NCA9IGhlYWRlclxuICAgICAgICAgICAgLnJlcGxhY2UoLy0vZywgXCIrXCIpXG4gICAgICAgICAgICAucmVwbGFjZSgvXy9nLCBcIi9cIilcbiAgICAgICAgICAgIC5wYWRFbmQoaGVhZGVyLmxlbmd0aCArICgoNCAtIChoZWFkZXIubGVuZ3RoICUgNCkpICUgNCksIFwiPVwiKTtcbiAgICAgICAgY29uc3QgZGVjb2RlZCA9IEpTT04ucGFyc2UoYXRvYihiYXNlNjQpKTtcbiAgICAgICAgaWYgKHR5cGVvZiBkZWNvZGVkICE9PSBcIm9iamVjdFwiIHx8IGRlY29kZWQgPT09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChcInR5cFwiIGluIGRlY29kZWQgJiYgZGVjb2RlZD8udHlwICE9PSBcIkpXVFwiKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoIWRlY29kZWQuYWxnKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoYWxnICYmIGRlY29kZWQuYWxnICE9PSBhbGcpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjYXRjaCB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5mdW5jdGlvbiBpc1ZhbGlkQ2lkcihpcCwgdmVyc2lvbikge1xuICAgIGlmICgodmVyc2lvbiA9PT0gXCJ2NFwiIHx8ICF2ZXJzaW9uKSAmJiBpcHY0Q2lkclJlZ2V4LnRlc3QoaXApKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoKHZlcnNpb24gPT09IFwidjZcIiB8fCAhdmVyc2lvbikgJiYgaXB2NkNpZHJSZWdleC50ZXN0KGlwKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZXhwb3J0IGNsYXNzIFpvZFN0cmluZyBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBpZiAodGhpcy5fZGVmLmNvZXJjZSkge1xuICAgICAgICAgICAgaW5wdXQuZGF0YSA9IFN0cmluZyhpbnB1dC5kYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXJzZWRUeXBlID0gdGhpcy5fZ2V0VHlwZShpbnB1dCk7XG4gICAgICAgIGlmIChwYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLnN0cmluZykge1xuICAgICAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpO1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS5zdHJpbmcsXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdGF0dXMgPSBuZXcgUGFyc2VTdGF0dXMoKTtcbiAgICAgICAgbGV0IGN0eCA9IHVuZGVmaW5lZDtcbiAgICAgICAgZm9yIChjb25zdCBjaGVjayBvZiB0aGlzLl9kZWYuY2hlY2tzKSB7XG4gICAgICAgICAgICBpZiAoY2hlY2sua2luZCA9PT0gXCJtaW5cIikge1xuICAgICAgICAgICAgICAgIGlmIChpbnB1dC5kYXRhLmxlbmd0aCA8IGNoZWNrLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS50b29fc21hbGwsXG4gICAgICAgICAgICAgICAgICAgICAgICBtaW5pbXVtOiBjaGVjay52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBleGFjdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJtYXhcIikge1xuICAgICAgICAgICAgICAgIGlmIChpbnB1dC5kYXRhLmxlbmd0aCA+IGNoZWNrLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS50b29fYmlnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWF4aW11bTogY2hlY2sudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXhhY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwibGVuZ3RoXCIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0b29CaWcgPSBpbnB1dC5kYXRhLmxlbmd0aCA+IGNoZWNrLnZhbHVlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvb1NtYWxsID0gaW5wdXQuZGF0YS5sZW5ndGggPCBjaGVjay52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAodG9vQmlnIHx8IHRvb1NtYWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodG9vQmlnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUudG9vX2JpZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhpbXVtOiBjaGVjay52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGFjdDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodG9vU21hbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS50b29fc21hbGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluaW11bTogY2hlY2sudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhhY3Q6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwiZW1haWxcIikge1xuICAgICAgICAgICAgICAgIGlmICghZW1haWxSZWdleC50ZXN0KGlucHV0LmRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IFwiZW1haWxcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcImVtb2ppXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWVtb2ppUmVnZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgZW1vamlSZWdleCA9IG5ldyBSZWdFeHAoX2Vtb2ppUmVnZXgsIFwidVwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFlbW9qaVJlZ2V4LnRlc3QoaW5wdXQuZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjogXCJlbW9qaVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwidXVpZFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF1dWlkUmVnZXgudGVzdChpbnB1dC5kYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uOiBcInV1aWRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcIm5hbm9pZFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFuYW5vaWRSZWdleC50ZXN0KGlucHV0LmRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IFwibmFub2lkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJjdWlkXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWN1aWRSZWdleC50ZXN0KGlucHV0LmRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IFwiY3VpZFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwiY3VpZDJcIikge1xuICAgICAgICAgICAgICAgIGlmICghY3VpZDJSZWdleC50ZXN0KGlucHV0LmRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IFwiY3VpZDJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcInVsaWRcIikge1xuICAgICAgICAgICAgICAgIGlmICghdWxpZFJlZ2V4LnRlc3QoaW5wdXQuZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjogXCJ1bGlkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJ1cmxcIikge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIG5ldyBVUkwoaW5wdXQuZGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjogXCJ1cmxcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcInJlZ2V4XCIpIHtcbiAgICAgICAgICAgICAgICBjaGVjay5yZWdleC5sYXN0SW5kZXggPSAwO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRlc3RSZXN1bHQgPSBjaGVjay5yZWdleC50ZXN0KGlucHV0LmRhdGEpO1xuICAgICAgICAgICAgICAgIGlmICghdGVzdFJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uOiBcInJlZ2V4XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJ0cmltXCIpIHtcbiAgICAgICAgICAgICAgICBpbnB1dC5kYXRhID0gaW5wdXQuZGF0YS50cmltKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcImluY2x1ZGVzXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWlucHV0LmRhdGEuaW5jbHVkZXMoY2hlY2sudmFsdWUsIGNoZWNrLnBvc2l0aW9uKSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uOiB7IGluY2x1ZGVzOiBjaGVjay52YWx1ZSwgcG9zaXRpb246IGNoZWNrLnBvc2l0aW9uIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJ0b0xvd2VyQ2FzZVwiKSB7XG4gICAgICAgICAgICAgICAgaW5wdXQuZGF0YSA9IGlucHV0LmRhdGEudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwidG9VcHBlckNhc2VcIikge1xuICAgICAgICAgICAgICAgIGlucHV0LmRhdGEgPSBpbnB1dC5kYXRhLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcInN0YXJ0c1dpdGhcIikge1xuICAgICAgICAgICAgICAgIGlmICghaW5wdXQuZGF0YS5zdGFydHNXaXRoKGNoZWNrLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uOiB7IHN0YXJ0c1dpdGg6IGNoZWNrLnZhbHVlIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJlbmRzV2l0aFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpbnB1dC5kYXRhLmVuZHNXaXRoKGNoZWNrLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uOiB7IGVuZHNXaXRoOiBjaGVjay52YWx1ZSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwiZGF0ZXRpbWVcIikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlZ2V4ID0gZGF0ZXRpbWVSZWdleChjaGVjayk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZWdleC50ZXN0KGlucHV0LmRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IFwiZGF0ZXRpbWVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcImRhdGVcIikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlZ2V4ID0gZGF0ZVJlZ2V4O1xuICAgICAgICAgICAgICAgIGlmICghcmVnZXgudGVzdChpbnB1dC5kYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcInRpbWVcIikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlZ2V4ID0gdGltZVJlZ2V4KGNoZWNrKTtcbiAgICAgICAgICAgICAgICBpZiAoIXJlZ2V4LnRlc3QoaW5wdXQuZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjogXCJ0aW1lXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJkdXJhdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFkdXJhdGlvblJlZ2V4LnRlc3QoaW5wdXQuZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjogXCJkdXJhdGlvblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwiaXBcIikge1xuICAgICAgICAgICAgICAgIGlmICghaXNWYWxpZElQKGlucHV0LmRhdGEsIGNoZWNrLnZlcnNpb24pKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IFwiaXBcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcImp3dFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc1ZhbGlkSldUKGlucHV0LmRhdGEsIGNoZWNrLmFsZykpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjogXCJqd3RcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcImNpZHJcIikge1xuICAgICAgICAgICAgICAgIGlmICghaXNWYWxpZENpZHIoaW5wdXQuZGF0YSwgY2hlY2sudmVyc2lvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjogXCJjaWRyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJiYXNlNjRcIikge1xuICAgICAgICAgICAgICAgIGlmICghYmFzZTY0UmVnZXgudGVzdChpbnB1dC5kYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uOiBcImJhc2U2NFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwiYmFzZTY0dXJsXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWJhc2U2NHVybFJlZ2V4LnRlc3QoaW5wdXQuZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjogXCJiYXNlNjR1cmxcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB1dGlsLmFzc2VydE5ldmVyKGNoZWNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBzdGF0dXM6IHN0YXR1cy52YWx1ZSwgdmFsdWU6IGlucHV0LmRhdGEgfTtcbiAgICB9XG4gICAgX3JlZ2V4KHJlZ2V4LCB2YWxpZGF0aW9uLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlZmluZW1lbnQoKGRhdGEpID0+IHJlZ2V4LnRlc3QoZGF0YSksIHtcbiAgICAgICAgICAgIHZhbGlkYXRpb24sXG4gICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsXG4gICAgICAgICAgICAuLi5lcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBfYWRkQ2hlY2soY2hlY2spIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RTdHJpbmcoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgY2hlY2tzOiBbLi4udGhpcy5fZGVmLmNoZWNrcywgY2hlY2tdLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZW1haWwobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soeyBraW5kOiBcImVtYWlsXCIsIC4uLmVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKSB9KTtcbiAgICB9XG4gICAgdXJsKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsga2luZDogXCJ1cmxcIiwgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpIH0pO1xuICAgIH1cbiAgICBlbW9qaShtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7IGtpbmQ6IFwiZW1vamlcIiwgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpIH0pO1xuICAgIH1cbiAgICB1dWlkKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsga2luZDogXCJ1dWlkXCIsIC4uLmVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKSB9KTtcbiAgICB9XG4gICAgbmFub2lkKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsga2luZDogXCJuYW5vaWRcIiwgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpIH0pO1xuICAgIH1cbiAgICBjdWlkKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsga2luZDogXCJjdWlkXCIsIC4uLmVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKSB9KTtcbiAgICB9XG4gICAgY3VpZDIobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soeyBraW5kOiBcImN1aWQyXCIsIC4uLmVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKSB9KTtcbiAgICB9XG4gICAgdWxpZChtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7IGtpbmQ6IFwidWxpZFwiLCAuLi5lcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSkgfSk7XG4gICAgfVxuICAgIGJhc2U2NChtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7IGtpbmQ6IFwiYmFzZTY0XCIsIC4uLmVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKSB9KTtcbiAgICB9XG4gICAgYmFzZTY0dXJsKG1lc3NhZ2UpIHtcbiAgICAgICAgLy8gYmFzZTY0dXJsIGVuY29kaW5nIGlzIGEgbW9kaWZpY2F0aW9uIG9mIGJhc2U2NCB0aGF0IGNhbiBzYWZlbHkgYmUgdXNlZCBpbiBVUkxzIGFuZCBmaWxlbmFtZXNcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwiYmFzZTY0dXJsXCIsXG4gICAgICAgICAgICAuLi5lcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBqd3Qob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soeyBraW5kOiBcImp3dFwiLCAuLi5lcnJvclV0aWwuZXJyVG9PYmoob3B0aW9ucykgfSk7XG4gICAgfVxuICAgIGlwKG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsga2luZDogXCJpcFwiLCAuLi5lcnJvclV0aWwuZXJyVG9PYmoob3B0aW9ucykgfSk7XG4gICAgfVxuICAgIGNpZHIob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soeyBraW5kOiBcImNpZHJcIiwgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG9wdGlvbnMpIH0pO1xuICAgIH1cbiAgICBkYXRldGltZShvcHRpb25zKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgICAgICBraW5kOiBcImRhdGV0aW1lXCIsXG4gICAgICAgICAgICAgICAgcHJlY2lzaW9uOiBudWxsLFxuICAgICAgICAgICAgICAgIG9mZnNldDogZmFsc2UsXG4gICAgICAgICAgICAgICAgbG9jYWw6IGZhbHNlLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IG9wdGlvbnMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJkYXRldGltZVwiLFxuICAgICAgICAgICAgcHJlY2lzaW9uOiB0eXBlb2Ygb3B0aW9ucz8ucHJlY2lzaW9uID09PSBcInVuZGVmaW5lZFwiID8gbnVsbCA6IG9wdGlvbnM/LnByZWNpc2lvbixcbiAgICAgICAgICAgIG9mZnNldDogb3B0aW9ucz8ub2Zmc2V0ID8/IGZhbHNlLFxuICAgICAgICAgICAgbG9jYWw6IG9wdGlvbnM/LmxvY2FsID8/IGZhbHNlLFxuICAgICAgICAgICAgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG9wdGlvbnM/Lm1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZGF0ZShtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7IGtpbmQ6IFwiZGF0ZVwiLCBtZXNzYWdlIH0pO1xuICAgIH1cbiAgICB0aW1lKG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAgICAgIGtpbmQ6IFwidGltZVwiLFxuICAgICAgICAgICAgICAgIHByZWNpc2lvbjogbnVsbCxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBvcHRpb25zLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwidGltZVwiLFxuICAgICAgICAgICAgcHJlY2lzaW9uOiB0eXBlb2Ygb3B0aW9ucz8ucHJlY2lzaW9uID09PSBcInVuZGVmaW5lZFwiID8gbnVsbCA6IG9wdGlvbnM/LnByZWNpc2lvbixcbiAgICAgICAgICAgIC4uLmVycm9yVXRpbC5lcnJUb09iaihvcHRpb25zPy5tZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGR1cmF0aW9uKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsga2luZDogXCJkdXJhdGlvblwiLCAuLi5lcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSkgfSk7XG4gICAgfVxuICAgIHJlZ2V4KHJlZ2V4LCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcInJlZ2V4XCIsXG4gICAgICAgICAgICByZWdleDogcmVnZXgsXG4gICAgICAgICAgICAuLi5lcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpbmNsdWRlcyh2YWx1ZSwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJpbmNsdWRlc1wiLFxuICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgcG9zaXRpb246IG9wdGlvbnM/LnBvc2l0aW9uLFxuICAgICAgICAgICAgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG9wdGlvbnM/Lm1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhcnRzV2l0aCh2YWx1ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJzdGFydHNXaXRoXCIsXG4gICAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgICAuLi5lcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBlbmRzV2l0aCh2YWx1ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJlbmRzV2l0aFwiLFxuICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbWluKG1pbkxlbmd0aCwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJtaW5cIixcbiAgICAgICAgICAgIHZhbHVlOiBtaW5MZW5ndGgsXG4gICAgICAgICAgICAuLi5lcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBtYXgobWF4TGVuZ3RoLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcIm1heFwiLFxuICAgICAgICAgICAgdmFsdWU6IG1heExlbmd0aCxcbiAgICAgICAgICAgIC4uLmVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGxlbmd0aChsZW4sIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwibGVuZ3RoXCIsXG4gICAgICAgICAgICB2YWx1ZTogbGVuLFxuICAgICAgICAgICAgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXF1aXZhbGVudCB0byBgLm1pbigxKWBcbiAgICAgKi9cbiAgICBub25lbXB0eShtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbigxLCBlcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSkpO1xuICAgIH1cbiAgICB0cmltKCkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZFN0cmluZyh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBjaGVja3M6IFsuLi50aGlzLl9kZWYuY2hlY2tzLCB7IGtpbmQ6IFwidHJpbVwiIH1dLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdG9Mb3dlckNhc2UoKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kU3RyaW5nKHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIGNoZWNrczogWy4uLnRoaXMuX2RlZi5jaGVja3MsIHsga2luZDogXCJ0b0xvd2VyQ2FzZVwiIH1dLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdG9VcHBlckNhc2UoKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kU3RyaW5nKHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIGNoZWNrczogWy4uLnRoaXMuX2RlZi5jaGVja3MsIHsga2luZDogXCJ0b1VwcGVyQ2FzZVwiIH1dLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0IGlzRGF0ZXRpbWUoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2RlZi5jaGVja3MuZmluZCgoY2gpID0+IGNoLmtpbmQgPT09IFwiZGF0ZXRpbWVcIik7XG4gICAgfVxuICAgIGdldCBpc0RhdGUoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2RlZi5jaGVja3MuZmluZCgoY2gpID0+IGNoLmtpbmQgPT09IFwiZGF0ZVwiKTtcbiAgICB9XG4gICAgZ2V0IGlzVGltZSgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKChjaCkgPT4gY2gua2luZCA9PT0gXCJ0aW1lXCIpO1xuICAgIH1cbiAgICBnZXQgaXNEdXJhdGlvbigpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKChjaCkgPT4gY2gua2luZCA9PT0gXCJkdXJhdGlvblwiKTtcbiAgICB9XG4gICAgZ2V0IGlzRW1haWwoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2RlZi5jaGVja3MuZmluZCgoY2gpID0+IGNoLmtpbmQgPT09IFwiZW1haWxcIik7XG4gICAgfVxuICAgIGdldCBpc1VSTCgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKChjaCkgPT4gY2gua2luZCA9PT0gXCJ1cmxcIik7XG4gICAgfVxuICAgIGdldCBpc0Vtb2ppKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoKGNoKSA9PiBjaC5raW5kID09PSBcImVtb2ppXCIpO1xuICAgIH1cbiAgICBnZXQgaXNVVUlEKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoKGNoKSA9PiBjaC5raW5kID09PSBcInV1aWRcIik7XG4gICAgfVxuICAgIGdldCBpc05BTk9JRCgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKChjaCkgPT4gY2gua2luZCA9PT0gXCJuYW5vaWRcIik7XG4gICAgfVxuICAgIGdldCBpc0NVSUQoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2RlZi5jaGVja3MuZmluZCgoY2gpID0+IGNoLmtpbmQgPT09IFwiY3VpZFwiKTtcbiAgICB9XG4gICAgZ2V0IGlzQ1VJRDIoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2RlZi5jaGVja3MuZmluZCgoY2gpID0+IGNoLmtpbmQgPT09IFwiY3VpZDJcIik7XG4gICAgfVxuICAgIGdldCBpc1VMSUQoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2RlZi5jaGVja3MuZmluZCgoY2gpID0+IGNoLmtpbmQgPT09IFwidWxpZFwiKTtcbiAgICB9XG4gICAgZ2V0IGlzSVAoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2RlZi5jaGVja3MuZmluZCgoY2gpID0+IGNoLmtpbmQgPT09IFwiaXBcIik7XG4gICAgfVxuICAgIGdldCBpc0NJRFIoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2RlZi5jaGVja3MuZmluZCgoY2gpID0+IGNoLmtpbmQgPT09IFwiY2lkclwiKTtcbiAgICB9XG4gICAgZ2V0IGlzQmFzZTY0KCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoKGNoKSA9PiBjaC5raW5kID09PSBcImJhc2U2NFwiKTtcbiAgICB9XG4gICAgZ2V0IGlzQmFzZTY0dXJsKCkge1xuICAgICAgICAvLyBiYXNlNjR1cmwgZW5jb2RpbmcgaXMgYSBtb2RpZmljYXRpb24gb2YgYmFzZTY0IHRoYXQgY2FuIHNhZmVseSBiZSB1c2VkIGluIFVSTHMgYW5kIGZpbGVuYW1lc1xuICAgICAgICByZXR1cm4gISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoKGNoKSA9PiBjaC5raW5kID09PSBcImJhc2U2NHVybFwiKTtcbiAgICB9XG4gICAgZ2V0IG1pbkxlbmd0aCgpIHtcbiAgICAgICAgbGV0IG1pbiA9IG51bGw7XG4gICAgICAgIGZvciAoY29uc3QgY2ggb2YgdGhpcy5fZGVmLmNoZWNrcykge1xuICAgICAgICAgICAgaWYgKGNoLmtpbmQgPT09IFwibWluXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAobWluID09PSBudWxsIHx8IGNoLnZhbHVlID4gbWluKVxuICAgICAgICAgICAgICAgICAgICBtaW4gPSBjaC52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWluO1xuICAgIH1cbiAgICBnZXQgbWF4TGVuZ3RoKCkge1xuICAgICAgICBsZXQgbWF4ID0gbnVsbDtcbiAgICAgICAgZm9yIChjb25zdCBjaCBvZiB0aGlzLl9kZWYuY2hlY2tzKSB7XG4gICAgICAgICAgICBpZiAoY2gua2luZCA9PT0gXCJtYXhcIikge1xuICAgICAgICAgICAgICAgIGlmIChtYXggPT09IG51bGwgfHwgY2gudmFsdWUgPCBtYXgpXG4gICAgICAgICAgICAgICAgICAgIG1heCA9IGNoLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYXg7XG4gICAgfVxufVxuWm9kU3RyaW5nLmNyZWF0ZSA9IChwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZFN0cmluZyh7XG4gICAgICAgIGNoZWNrczogW10sXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kU3RyaW5nLFxuICAgICAgICBjb2VyY2U6IHBhcmFtcz8uY29lcmNlID8/IGZhbHNlLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzk2NjQ4NC93aHktZG9lcy1tb2R1bHVzLW9wZXJhdG9yLXJldHVybi1mcmFjdGlvbmFsLW51bWJlci1pbi1qYXZhc2NyaXB0LzMxNzExMDM0IzMxNzExMDM0XG5mdW5jdGlvbiBmbG9hdFNhZmVSZW1haW5kZXIodmFsLCBzdGVwKSB7XG4gICAgY29uc3QgdmFsRGVjQ291bnQgPSAodmFsLnRvU3RyaW5nKCkuc3BsaXQoXCIuXCIpWzFdIHx8IFwiXCIpLmxlbmd0aDtcbiAgICBjb25zdCBzdGVwRGVjQ291bnQgPSAoc3RlcC50b1N0cmluZygpLnNwbGl0KFwiLlwiKVsxXSB8fCBcIlwiKS5sZW5ndGg7XG4gICAgY29uc3QgZGVjQ291bnQgPSB2YWxEZWNDb3VudCA+IHN0ZXBEZWNDb3VudCA/IHZhbERlY0NvdW50IDogc3RlcERlY0NvdW50O1xuICAgIGNvbnN0IHZhbEludCA9IE51bWJlci5wYXJzZUludCh2YWwudG9GaXhlZChkZWNDb3VudCkucmVwbGFjZShcIi5cIiwgXCJcIikpO1xuICAgIGNvbnN0IHN0ZXBJbnQgPSBOdW1iZXIucGFyc2VJbnQoc3RlcC50b0ZpeGVkKGRlY0NvdW50KS5yZXBsYWNlKFwiLlwiLCBcIlwiKSk7XG4gICAgcmV0dXJuICh2YWxJbnQgJSBzdGVwSW50KSAvIDEwICoqIGRlY0NvdW50O1xufVxuZXhwb3J0IGNsYXNzIFpvZE51bWJlciBleHRlbmRzIFpvZFR5cGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLm1pbiA9IHRoaXMuZ3RlO1xuICAgICAgICB0aGlzLm1heCA9IHRoaXMubHRlO1xuICAgICAgICB0aGlzLnN0ZXAgPSB0aGlzLm11bHRpcGxlT2Y7XG4gICAgfVxuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBpZiAodGhpcy5fZGVmLmNvZXJjZSkge1xuICAgICAgICAgICAgaW5wdXQuZGF0YSA9IE51bWJlcihpbnB1dC5kYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXJzZWRUeXBlID0gdGhpcy5fZ2V0VHlwZShpbnB1dCk7XG4gICAgICAgIGlmIChwYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLm51bWJlcikge1xuICAgICAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpO1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS5udW1iZXIsXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgY3R4ID0gdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBzdGF0dXMgPSBuZXcgUGFyc2VTdGF0dXMoKTtcbiAgICAgICAgZm9yIChjb25zdCBjaGVjayBvZiB0aGlzLl9kZWYuY2hlY2tzKSB7XG4gICAgICAgICAgICBpZiAoY2hlY2sua2luZCA9PT0gXCJpbnRcIikge1xuICAgICAgICAgICAgICAgIGlmICghdXRpbC5pc0ludGVnZXIoaW5wdXQuZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBcImludGVnZXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBcImZsb2F0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJtaW5cIikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvb1NtYWxsID0gY2hlY2suaW5jbHVzaXZlID8gaW5wdXQuZGF0YSA8IGNoZWNrLnZhbHVlIDogaW5wdXQuZGF0YSA8PSBjaGVjay52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAodG9vU21hbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLnRvb19zbWFsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbmltdW06IGNoZWNrLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogY2hlY2suaW5jbHVzaXZlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXhhY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwibWF4XCIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0b29CaWcgPSBjaGVjay5pbmNsdXNpdmUgPyBpbnB1dC5kYXRhID4gY2hlY2sudmFsdWUgOiBpbnB1dC5kYXRhID49IGNoZWNrLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmICh0b29CaWcpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLnRvb19iaWcsXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhpbXVtOiBjaGVjay52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IGNoZWNrLmluY2x1c2l2ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4YWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcIm11bHRpcGxlT2ZcIikge1xuICAgICAgICAgICAgICAgIGlmIChmbG9hdFNhZmVSZW1haW5kZXIoaW5wdXQuZGF0YSwgY2hlY2sudmFsdWUpICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5ub3RfbXVsdGlwbGVfb2YsXG4gICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZU9mOiBjaGVjay52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcImZpbml0ZVwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUoaW5wdXQuZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLm5vdF9maW5pdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdXRpbC5hc3NlcnROZXZlcihjaGVjayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiBzdGF0dXMudmFsdWUsIHZhbHVlOiBpbnB1dC5kYXRhIH07XG4gICAgfVxuICAgIGd0ZSh2YWx1ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXRMaW1pdChcIm1pblwiLCB2YWx1ZSwgdHJ1ZSwgZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpKTtcbiAgICB9XG4gICAgZ3QodmFsdWUsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0TGltaXQoXCJtaW5cIiwgdmFsdWUsIGZhbHNlLCBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkpO1xuICAgIH1cbiAgICBsdGUodmFsdWUsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0TGltaXQoXCJtYXhcIiwgdmFsdWUsIHRydWUsIGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSk7XG4gICAgfVxuICAgIGx0KHZhbHVlLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldExpbWl0KFwibWF4XCIsIHZhbHVlLCBmYWxzZSwgZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpKTtcbiAgICB9XG4gICAgc2V0TGltaXQoa2luZCwgdmFsdWUsIGluY2x1c2l2ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZE51bWJlcih7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBjaGVja3M6IFtcbiAgICAgICAgICAgICAgICAuLi50aGlzLl9kZWYuY2hlY2tzLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAga2luZCxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZSxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgX2FkZENoZWNrKGNoZWNrKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kTnVtYmVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIGNoZWNrczogWy4uLnRoaXMuX2RlZi5jaGVja3MsIGNoZWNrXSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGludChtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcImludFwiLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcG9zaXRpdmUobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJtaW5cIixcbiAgICAgICAgICAgIHZhbHVlOiAwLFxuICAgICAgICAgICAgaW5jbHVzaXZlOiBmYWxzZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG5lZ2F0aXZlKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwibWF4XCIsXG4gICAgICAgICAgICB2YWx1ZTogMCxcbiAgICAgICAgICAgIGluY2x1c2l2ZTogZmFsc2UsXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBub25wb3NpdGl2ZShtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcIm1heFwiLFxuICAgICAgICAgICAgdmFsdWU6IDAsXG4gICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBub25uZWdhdGl2ZShtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcIm1pblwiLFxuICAgICAgICAgICAgdmFsdWU6IDAsXG4gICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBtdWx0aXBsZU9mKHZhbHVlLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcIm11bHRpcGxlT2ZcIixcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGZpbml0ZShtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcImZpbml0ZVwiLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgc2FmZShtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcIm1pblwiLFxuICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IE51bWJlci5NSU5fU0FGRV9JTlRFR0VSLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpLFxuICAgICAgICB9KS5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJtYXhcIixcbiAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUixcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGdldCBtaW5WYWx1ZSgpIHtcbiAgICAgICAgbGV0IG1pbiA9IG51bGw7XG4gICAgICAgIGZvciAoY29uc3QgY2ggb2YgdGhpcy5fZGVmLmNoZWNrcykge1xuICAgICAgICAgICAgaWYgKGNoLmtpbmQgPT09IFwibWluXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAobWluID09PSBudWxsIHx8IGNoLnZhbHVlID4gbWluKVxuICAgICAgICAgICAgICAgICAgICBtaW4gPSBjaC52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWluO1xuICAgIH1cbiAgICBnZXQgbWF4VmFsdWUoKSB7XG4gICAgICAgIGxldCBtYXggPSBudWxsO1xuICAgICAgICBmb3IgKGNvbnN0IGNoIG9mIHRoaXMuX2RlZi5jaGVja3MpIHtcbiAgICAgICAgICAgIGlmIChjaC5raW5kID09PSBcIm1heFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1heCA9PT0gbnVsbCB8fCBjaC52YWx1ZSA8IG1heClcbiAgICAgICAgICAgICAgICAgICAgbWF4ID0gY2gudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1heDtcbiAgICB9XG4gICAgZ2V0IGlzSW50KCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoKGNoKSA9PiBjaC5raW5kID09PSBcImludFwiIHx8IChjaC5raW5kID09PSBcIm11bHRpcGxlT2ZcIiAmJiB1dGlsLmlzSW50ZWdlcihjaC52YWx1ZSkpKTtcbiAgICB9XG4gICAgZ2V0IGlzRmluaXRlKCkge1xuICAgICAgICBsZXQgbWF4ID0gbnVsbDtcbiAgICAgICAgbGV0IG1pbiA9IG51bGw7XG4gICAgICAgIGZvciAoY29uc3QgY2ggb2YgdGhpcy5fZGVmLmNoZWNrcykge1xuICAgICAgICAgICAgaWYgKGNoLmtpbmQgPT09IFwiZmluaXRlXCIgfHwgY2gua2luZCA9PT0gXCJpbnRcIiB8fCBjaC5raW5kID09PSBcIm11bHRpcGxlT2ZcIikge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2gua2luZCA9PT0gXCJtaW5cIikge1xuICAgICAgICAgICAgICAgIGlmIChtaW4gPT09IG51bGwgfHwgY2gudmFsdWUgPiBtaW4pXG4gICAgICAgICAgICAgICAgICAgIG1pbiA9IGNoLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2gua2luZCA9PT0gXCJtYXhcIikge1xuICAgICAgICAgICAgICAgIGlmIChtYXggPT09IG51bGwgfHwgY2gudmFsdWUgPCBtYXgpXG4gICAgICAgICAgICAgICAgICAgIG1heCA9IGNoLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBOdW1iZXIuaXNGaW5pdGUobWluKSAmJiBOdW1iZXIuaXNGaW5pdGUobWF4KTtcbiAgICB9XG59XG5ab2ROdW1iZXIuY3JlYXRlID0gKHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kTnVtYmVyKHtcbiAgICAgICAgY2hlY2tzOiBbXSxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2ROdW1iZXIsXG4gICAgICAgIGNvZXJjZTogcGFyYW1zPy5jb2VyY2UgfHwgZmFsc2UsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5leHBvcnQgY2xhc3MgWm9kQmlnSW50IGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMubWluID0gdGhpcy5ndGU7XG4gICAgICAgIHRoaXMubWF4ID0gdGhpcy5sdGU7XG4gICAgfVxuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBpZiAodGhpcy5fZGVmLmNvZXJjZSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpbnB1dC5kYXRhID0gQmlnSW50KGlucHV0LmRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2gge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRJbnZhbGlkSW5wdXQoaW5wdXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcnNlZFR5cGUgPSB0aGlzLl9nZXRUeXBlKGlucHV0KTtcbiAgICAgICAgaWYgKHBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUuYmlnaW50KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0SW52YWxpZElucHV0KGlucHV0KTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgY3R4ID0gdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBzdGF0dXMgPSBuZXcgUGFyc2VTdGF0dXMoKTtcbiAgICAgICAgZm9yIChjb25zdCBjaGVjayBvZiB0aGlzLl9kZWYuY2hlY2tzKSB7XG4gICAgICAgICAgICBpZiAoY2hlY2sua2luZCA9PT0gXCJtaW5cIikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvb1NtYWxsID0gY2hlY2suaW5jbHVzaXZlID8gaW5wdXQuZGF0YSA8IGNoZWNrLnZhbHVlIDogaW5wdXQuZGF0YSA8PSBjaGVjay52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAodG9vU21hbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLnRvb19zbWFsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiYmlnaW50XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBtaW5pbXVtOiBjaGVjay52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogY2hlY2suaW5jbHVzaXZlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwibWF4XCIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0b29CaWcgPSBjaGVjay5pbmNsdXNpdmUgPyBpbnB1dC5kYXRhID4gY2hlY2sudmFsdWUgOiBpbnB1dC5kYXRhID49IGNoZWNrLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmICh0b29CaWcpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLnRvb19iaWcsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImJpZ2ludFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWF4aW11bTogY2hlY2sudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IGNoZWNrLmluY2x1c2l2ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcIm11bHRpcGxlT2ZcIikge1xuICAgICAgICAgICAgICAgIGlmIChpbnB1dC5kYXRhICUgY2hlY2sudmFsdWUgIT09IEJpZ0ludCgwKSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUubm90X211bHRpcGxlX29mLFxuICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGVPZjogY2hlY2sudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdXRpbC5hc3NlcnROZXZlcihjaGVjayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiBzdGF0dXMudmFsdWUsIHZhbHVlOiBpbnB1dC5kYXRhIH07XG4gICAgfVxuICAgIF9nZXRJbnZhbGlkSW5wdXQoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpO1xuICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS5iaWdpbnQsXG4gICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICB9XG4gICAgZ3RlKHZhbHVlLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldExpbWl0KFwibWluXCIsIHZhbHVlLCB0cnVlLCBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkpO1xuICAgIH1cbiAgICBndCh2YWx1ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXRMaW1pdChcIm1pblwiLCB2YWx1ZSwgZmFsc2UsIGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSk7XG4gICAgfVxuICAgIGx0ZSh2YWx1ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXRMaW1pdChcIm1heFwiLCB2YWx1ZSwgdHJ1ZSwgZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpKTtcbiAgICB9XG4gICAgbHQodmFsdWUsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0TGltaXQoXCJtYXhcIiwgdmFsdWUsIGZhbHNlLCBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkpO1xuICAgIH1cbiAgICBzZXRMaW1pdChraW5kLCB2YWx1ZSwgaW5jbHVzaXZlLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kQmlnSW50KHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIGNoZWNrczogW1xuICAgICAgICAgICAgICAgIC4uLnRoaXMuX2RlZi5jaGVja3MsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBraW5kLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBfYWRkQ2hlY2soY2hlY2spIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RCaWdJbnQoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgY2hlY2tzOiBbLi4udGhpcy5fZGVmLmNoZWNrcywgY2hlY2tdLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcG9zaXRpdmUobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJtaW5cIixcbiAgICAgICAgICAgIHZhbHVlOiBCaWdJbnQoMCksXG4gICAgICAgICAgICBpbmNsdXNpdmU6IGZhbHNlLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbmVnYXRpdmUobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJtYXhcIixcbiAgICAgICAgICAgIHZhbHVlOiBCaWdJbnQoMCksXG4gICAgICAgICAgICBpbmNsdXNpdmU6IGZhbHNlLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbm9ucG9zaXRpdmUobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJtYXhcIixcbiAgICAgICAgICAgIHZhbHVlOiBCaWdJbnQoMCksXG4gICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBub25uZWdhdGl2ZShtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcIm1pblwiLFxuICAgICAgICAgICAgdmFsdWU6IEJpZ0ludCgwKSxcbiAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG11bHRpcGxlT2YodmFsdWUsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwibXVsdGlwbGVPZlwiLFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBnZXQgbWluVmFsdWUoKSB7XG4gICAgICAgIGxldCBtaW4gPSBudWxsO1xuICAgICAgICBmb3IgKGNvbnN0IGNoIG9mIHRoaXMuX2RlZi5jaGVja3MpIHtcbiAgICAgICAgICAgIGlmIChjaC5raW5kID09PSBcIm1pblwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1pbiA9PT0gbnVsbCB8fCBjaC52YWx1ZSA+IG1pbilcbiAgICAgICAgICAgICAgICAgICAgbWluID0gY2gudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1pbjtcbiAgICB9XG4gICAgZ2V0IG1heFZhbHVlKCkge1xuICAgICAgICBsZXQgbWF4ID0gbnVsbDtcbiAgICAgICAgZm9yIChjb25zdCBjaCBvZiB0aGlzLl9kZWYuY2hlY2tzKSB7XG4gICAgICAgICAgICBpZiAoY2gua2luZCA9PT0gXCJtYXhcIikge1xuICAgICAgICAgICAgICAgIGlmIChtYXggPT09IG51bGwgfHwgY2gudmFsdWUgPCBtYXgpXG4gICAgICAgICAgICAgICAgICAgIG1heCA9IGNoLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYXg7XG4gICAgfVxufVxuWm9kQmlnSW50LmNyZWF0ZSA9IChwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZEJpZ0ludCh7XG4gICAgICAgIGNoZWNrczogW10sXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kQmlnSW50LFxuICAgICAgICBjb2VyY2U6IHBhcmFtcz8uY29lcmNlID8/IGZhbHNlLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuZXhwb3J0IGNsYXNzIFpvZEJvb2xlYW4gZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgaWYgKHRoaXMuX2RlZi5jb2VyY2UpIHtcbiAgICAgICAgICAgIGlucHV0LmRhdGEgPSBCb29sZWFuKGlucHV0LmRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcnNlZFR5cGUgPSB0aGlzLl9nZXRUeXBlKGlucHV0KTtcbiAgICAgICAgaWYgKHBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUuYm9vbGVhbikge1xuICAgICAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpO1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS5ib29sZWFuLFxuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE9LKGlucHV0LmRhdGEpO1xuICAgIH1cbn1cblpvZEJvb2xlYW4uY3JlYXRlID0gKHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kQm9vbGVhbih7XG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kQm9vbGVhbixcbiAgICAgICAgY29lcmNlOiBwYXJhbXM/LmNvZXJjZSB8fCBmYWxzZSxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmV4cG9ydCBjbGFzcyBab2REYXRlIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGlmICh0aGlzLl9kZWYuY29lcmNlKSB7XG4gICAgICAgICAgICBpbnB1dC5kYXRhID0gbmV3IERhdGUoaW5wdXQuZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFyc2VkVHlwZSA9IHRoaXMuX2dldFR5cGUoaW5wdXQpO1xuICAgICAgICBpZiAocGFyc2VkVHlwZSAhPT0gWm9kUGFyc2VkVHlwZS5kYXRlKSB7XG4gICAgICAgICAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLmRhdGUsXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKGlucHV0LmRhdGEuZ2V0VGltZSgpKSkge1xuICAgICAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpO1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfZGF0ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3RhdHVzID0gbmV3IFBhcnNlU3RhdHVzKCk7XG4gICAgICAgIGxldCBjdHggPSB1bmRlZmluZWQ7XG4gICAgICAgIGZvciAoY29uc3QgY2hlY2sgb2YgdGhpcy5fZGVmLmNoZWNrcykge1xuICAgICAgICAgICAgaWYgKGNoZWNrLmtpbmQgPT09IFwibWluXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoaW5wdXQuZGF0YS5nZXRUaW1lKCkgPCBjaGVjay52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUudG9vX3NtYWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4YWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbmltdW06IGNoZWNrLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcIm1heFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlucHV0LmRhdGEuZ2V0VGltZSgpID4gY2hlY2sudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLnRvb19iaWcsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXhhY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWF4aW11bTogY2hlY2sudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHV0aWwuYXNzZXJ0TmV2ZXIoY2hlY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdGF0dXM6IHN0YXR1cy52YWx1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBuZXcgRGF0ZShpbnB1dC5kYXRhLmdldFRpbWUoKSksXG4gICAgICAgIH07XG4gICAgfVxuICAgIF9hZGRDaGVjayhjaGVjaykge1xuICAgICAgICByZXR1cm4gbmV3IFpvZERhdGUoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgY2hlY2tzOiBbLi4udGhpcy5fZGVmLmNoZWNrcywgY2hlY2tdLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbWluKG1pbkRhdGUsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwibWluXCIsXG4gICAgICAgICAgICB2YWx1ZTogbWluRGF0ZS5nZXRUaW1lKCksXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBtYXgobWF4RGF0ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJtYXhcIixcbiAgICAgICAgICAgIHZhbHVlOiBtYXhEYXRlLmdldFRpbWUoKSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGdldCBtaW5EYXRlKCkge1xuICAgICAgICBsZXQgbWluID0gbnVsbDtcbiAgICAgICAgZm9yIChjb25zdCBjaCBvZiB0aGlzLl9kZWYuY2hlY2tzKSB7XG4gICAgICAgICAgICBpZiAoY2gua2luZCA9PT0gXCJtaW5cIikge1xuICAgICAgICAgICAgICAgIGlmIChtaW4gPT09IG51bGwgfHwgY2gudmFsdWUgPiBtaW4pXG4gICAgICAgICAgICAgICAgICAgIG1pbiA9IGNoLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtaW4gIT0gbnVsbCA/IG5ldyBEYXRlKG1pbikgOiBudWxsO1xuICAgIH1cbiAgICBnZXQgbWF4RGF0ZSgpIHtcbiAgICAgICAgbGV0IG1heCA9IG51bGw7XG4gICAgICAgIGZvciAoY29uc3QgY2ggb2YgdGhpcy5fZGVmLmNoZWNrcykge1xuICAgICAgICAgICAgaWYgKGNoLmtpbmQgPT09IFwibWF4XCIpIHtcbiAgICAgICAgICAgICAgICBpZiAobWF4ID09PSBudWxsIHx8IGNoLnZhbHVlIDwgbWF4KVxuICAgICAgICAgICAgICAgICAgICBtYXggPSBjaC52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWF4ICE9IG51bGwgPyBuZXcgRGF0ZShtYXgpIDogbnVsbDtcbiAgICB9XG59XG5ab2REYXRlLmNyZWF0ZSA9IChwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZERhdGUoe1xuICAgICAgICBjaGVja3M6IFtdLFxuICAgICAgICBjb2VyY2U6IHBhcmFtcz8uY29lcmNlIHx8IGZhbHNlLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZERhdGUsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5leHBvcnQgY2xhc3MgWm9kU3ltYm9sIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFR5cGUgPSB0aGlzLl9nZXRUeXBlKGlucHV0KTtcbiAgICAgICAgaWYgKHBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUuc3ltYm9sKSB7XG4gICAgICAgICAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLnN5bWJvbCxcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBPSyhpbnB1dC5kYXRhKTtcbiAgICB9XG59XG5ab2RTeW1ib2wuY3JlYXRlID0gKHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kU3ltYm9sKHtcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RTeW1ib2wsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5leHBvcnQgY2xhc3MgWm9kVW5kZWZpbmVkIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFR5cGUgPSB0aGlzLl9nZXRUeXBlKGlucHV0KTtcbiAgICAgICAgaWYgKHBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUudW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLnVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBPSyhpbnB1dC5kYXRhKTtcbiAgICB9XG59XG5ab2RVbmRlZmluZWQuY3JlYXRlID0gKHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kVW5kZWZpbmVkKHtcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RVbmRlZmluZWQsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5leHBvcnQgY2xhc3MgWm9kTnVsbCBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCBwYXJzZWRUeXBlID0gdGhpcy5fZ2V0VHlwZShpbnB1dCk7XG4gICAgICAgIGlmIChwYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLm51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0KTtcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IFpvZFBhcnNlZFR5cGUubnVsbCxcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBPSyhpbnB1dC5kYXRhKTtcbiAgICB9XG59XG5ab2ROdWxsLmNyZWF0ZSA9IChwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZE51bGwoe1xuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE51bGwsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5leHBvcnQgY2xhc3MgWm9kQW55IGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIC8vIHRvIHByZXZlbnQgaW5zdGFuY2VzIG9mIG90aGVyIGNsYXNzZXMgZnJvbSBleHRlbmRpbmcgWm9kQW55LiB0aGlzIGNhdXNlcyBpc3N1ZXMgd2l0aCBjYXRjaGFsbCBpbiBab2RPYmplY3QuXG4gICAgICAgIHRoaXMuX2FueSA9IHRydWU7XG4gICAgfVxuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICByZXR1cm4gT0soaW5wdXQuZGF0YSk7XG4gICAgfVxufVxuWm9kQW55LmNyZWF0ZSA9IChwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZEFueSh7XG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kQW55LFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuZXhwb3J0IGNsYXNzIFpvZFVua25vd24gZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgLy8gcmVxdWlyZWRcbiAgICAgICAgdGhpcy5fdW5rbm93biA9IHRydWU7XG4gICAgfVxuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICByZXR1cm4gT0soaW5wdXQuZGF0YSk7XG4gICAgfVxufVxuWm9kVW5rbm93bi5jcmVhdGUgPSAocGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2RVbmtub3duKHtcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RVbmtub3duLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuZXhwb3J0IGNsYXNzIFpvZE5ldmVyIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0KTtcbiAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgZXhwZWN0ZWQ6IFpvZFBhcnNlZFR5cGUubmV2ZXIsXG4gICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICB9XG59XG5ab2ROZXZlci5jcmVhdGUgPSAocGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2ROZXZlcih7XG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kTmV2ZXIsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5leHBvcnQgY2xhc3MgWm9kVm9pZCBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCBwYXJzZWRUeXBlID0gdGhpcy5fZ2V0VHlwZShpbnB1dCk7XG4gICAgICAgIGlmIChwYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLnVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpO1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS52b2lkLFxuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE9LKGlucHV0LmRhdGEpO1xuICAgIH1cbn1cblpvZFZvaWQuY3JlYXRlID0gKHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kVm9pZCh7XG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kVm9pZCxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmV4cG9ydCBjbGFzcyBab2RBcnJheSBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCB7IGN0eCwgc3RhdHVzIH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpO1xuICAgICAgICBjb25zdCBkZWYgPSB0aGlzLl9kZWY7XG4gICAgICAgIGlmIChjdHgucGFyc2VkVHlwZSAhPT0gWm9kUGFyc2VkVHlwZS5hcnJheSkge1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS5hcnJheSxcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZWYuZXhhY3RMZW5ndGggIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHRvb0JpZyA9IGN0eC5kYXRhLmxlbmd0aCA+IGRlZi5leGFjdExlbmd0aC52YWx1ZTtcbiAgICAgICAgICAgIGNvbnN0IHRvb1NtYWxsID0gY3R4LmRhdGEubGVuZ3RoIDwgZGVmLmV4YWN0TGVuZ3RoLnZhbHVlO1xuICAgICAgICAgICAgaWYgKHRvb0JpZyB8fCB0b29TbWFsbCkge1xuICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICBjb2RlOiB0b29CaWcgPyBab2RJc3N1ZUNvZGUudG9vX2JpZyA6IFpvZElzc3VlQ29kZS50b29fc21hbGwsXG4gICAgICAgICAgICAgICAgICAgIG1pbmltdW06ICh0b29TbWFsbCA/IGRlZi5leGFjdExlbmd0aC52YWx1ZSA6IHVuZGVmaW5lZCksXG4gICAgICAgICAgICAgICAgICAgIG1heGltdW06ICh0b29CaWcgPyBkZWYuZXhhY3RMZW5ndGgudmFsdWUgOiB1bmRlZmluZWQpLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgZXhhY3Q6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGRlZi5leGFjdExlbmd0aC5tZXNzYWdlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChkZWYubWluTGVuZ3RoICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoY3R4LmRhdGEubGVuZ3RoIDwgZGVmLm1pbkxlbmd0aC52YWx1ZSkge1xuICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUudG9vX3NtYWxsLFxuICAgICAgICAgICAgICAgICAgICBtaW5pbXVtOiBkZWYubWluTGVuZ3RoLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgZXhhY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBkZWYubWluTGVuZ3RoLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlZi5tYXhMZW5ndGggIT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChjdHguZGF0YS5sZW5ndGggPiBkZWYubWF4TGVuZ3RoLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS50b29fYmlnLFxuICAgICAgICAgICAgICAgICAgICBtYXhpbXVtOiBkZWYubWF4TGVuZ3RoLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgZXhhY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBkZWYubWF4TGVuZ3RoLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGN0eC5jb21tb24uYXN5bmMpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChbLi4uY3R4LmRhdGFdLm1hcCgoaXRlbSwgaSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBkZWYudHlwZS5fcGFyc2VBc3luYyhuZXcgUGFyc2VJbnB1dExhenlQYXRoKGN0eCwgaXRlbSwgY3R4LnBhdGgsIGkpKTtcbiAgICAgICAgICAgIH0pKS50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUGFyc2VTdGF0dXMubWVyZ2VBcnJheShzdGF0dXMsIHJlc3VsdCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSBbLi4uY3R4LmRhdGFdLm1hcCgoaXRlbSwgaSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGRlZi50eXBlLl9wYXJzZVN5bmMobmV3IFBhcnNlSW5wdXRMYXp5UGF0aChjdHgsIGl0ZW0sIGN0eC5wYXRoLCBpKSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gUGFyc2VTdGF0dXMubWVyZ2VBcnJheShzdGF0dXMsIHJlc3VsdCk7XG4gICAgfVxuICAgIGdldCBlbGVtZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLnR5cGU7XG4gICAgfVxuICAgIG1pbihtaW5MZW5ndGgsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RBcnJheSh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBtaW5MZW5ndGg6IHsgdmFsdWU6IG1pbkxlbmd0aCwgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpIH0sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBtYXgobWF4TGVuZ3RoLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kQXJyYXkoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgbWF4TGVuZ3RoOiB7IHZhbHVlOiBtYXhMZW5ndGgsIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSB9LFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbGVuZ3RoKGxlbiwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZEFycmF5KHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIGV4YWN0TGVuZ3RoOiB7IHZhbHVlOiBsZW4sIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSB9LFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbm9uZW1wdHkobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5taW4oMSwgbWVzc2FnZSk7XG4gICAgfVxufVxuWm9kQXJyYXkuY3JlYXRlID0gKHNjaGVtYSwgcGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2RBcnJheSh7XG4gICAgICAgIHR5cGU6IHNjaGVtYSxcbiAgICAgICAgbWluTGVuZ3RoOiBudWxsLFxuICAgICAgICBtYXhMZW5ndGg6IG51bGwsXG4gICAgICAgIGV4YWN0TGVuZ3RoOiBudWxsLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEFycmF5LFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuZnVuY3Rpb24gZGVlcFBhcnRpYWxpZnkoc2NoZW1hKSB7XG4gICAgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIFpvZE9iamVjdCkge1xuICAgICAgICBjb25zdCBuZXdTaGFwZSA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBzY2hlbWEuc2hhcGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkU2NoZW1hID0gc2NoZW1hLnNoYXBlW2tleV07XG4gICAgICAgICAgICBuZXdTaGFwZVtrZXldID0gWm9kT3B0aW9uYWwuY3JlYXRlKGRlZXBQYXJ0aWFsaWZ5KGZpZWxkU2NoZW1hKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBab2RPYmplY3Qoe1xuICAgICAgICAgICAgLi4uc2NoZW1hLl9kZWYsXG4gICAgICAgICAgICBzaGFwZTogKCkgPT4gbmV3U2hhcGUsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBab2RBcnJheSkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZEFycmF5KHtcbiAgICAgICAgICAgIC4uLnNjaGVtYS5fZGVmLFxuICAgICAgICAgICAgdHlwZTogZGVlcFBhcnRpYWxpZnkoc2NoZW1hLmVsZW1lbnQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoc2NoZW1hIGluc3RhbmNlb2YgWm9kT3B0aW9uYWwpIHtcbiAgICAgICAgcmV0dXJuIFpvZE9wdGlvbmFsLmNyZWF0ZShkZWVwUGFydGlhbGlmeShzY2hlbWEudW53cmFwKCkpKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoc2NoZW1hIGluc3RhbmNlb2YgWm9kTnVsbGFibGUpIHtcbiAgICAgICAgcmV0dXJuIFpvZE51bGxhYmxlLmNyZWF0ZShkZWVwUGFydGlhbGlmeShzY2hlbWEudW53cmFwKCkpKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoc2NoZW1hIGluc3RhbmNlb2YgWm9kVHVwbGUpIHtcbiAgICAgICAgcmV0dXJuIFpvZFR1cGxlLmNyZWF0ZShzY2hlbWEuaXRlbXMubWFwKChpdGVtKSA9PiBkZWVwUGFydGlhbGlmeShpdGVtKSkpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHNjaGVtYTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgWm9kT2JqZWN0IGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMuX2NhY2hlZCA9IG51bGw7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZGVwcmVjYXRlZCBJbiBtb3N0IGNhc2VzLCB0aGlzIGlzIG5vIGxvbmdlciBuZWVkZWQgLSB1bmtub3duIHByb3BlcnRpZXMgYXJlIG5vdyBzaWxlbnRseSBzdHJpcHBlZC5cbiAgICAgICAgICogSWYgeW91IHdhbnQgdG8gcGFzcyB0aHJvdWdoIHVua25vd24gcHJvcGVydGllcywgdXNlIGAucGFzc3Rocm91Z2goKWAgaW5zdGVhZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubm9uc3RyaWN0ID0gdGhpcy5wYXNzdGhyb3VnaDtcbiAgICAgICAgLy8gZXh0ZW5kPFxuICAgICAgICAvLyAgIEF1Z21lbnRhdGlvbiBleHRlbmRzIFpvZFJhd1NoYXBlLFxuICAgICAgICAvLyAgIE5ld091dHB1dCBleHRlbmRzIHV0aWwuZmxhdHRlbjx7XG4gICAgICAgIC8vICAgICBbayBpbiBrZXlvZiBBdWdtZW50YXRpb24gfCBrZXlvZiBPdXRwdXRdOiBrIGV4dGVuZHMga2V5b2YgQXVnbWVudGF0aW9uXG4gICAgICAgIC8vICAgICAgID8gQXVnbWVudGF0aW9uW2tdW1wiX291dHB1dFwiXVxuICAgICAgICAvLyAgICAgICA6IGsgZXh0ZW5kcyBrZXlvZiBPdXRwdXRcbiAgICAgICAgLy8gICAgICAgPyBPdXRwdXRba11cbiAgICAgICAgLy8gICAgICAgOiBuZXZlcjtcbiAgICAgICAgLy8gICB9PixcbiAgICAgICAgLy8gICBOZXdJbnB1dCBleHRlbmRzIHV0aWwuZmxhdHRlbjx7XG4gICAgICAgIC8vICAgICBbayBpbiBrZXlvZiBBdWdtZW50YXRpb24gfCBrZXlvZiBJbnB1dF06IGsgZXh0ZW5kcyBrZXlvZiBBdWdtZW50YXRpb25cbiAgICAgICAgLy8gICAgICAgPyBBdWdtZW50YXRpb25ba11bXCJfaW5wdXRcIl1cbiAgICAgICAgLy8gICAgICAgOiBrIGV4dGVuZHMga2V5b2YgSW5wdXRcbiAgICAgICAgLy8gICAgICAgPyBJbnB1dFtrXVxuICAgICAgICAvLyAgICAgICA6IG5ldmVyO1xuICAgICAgICAvLyAgIH0+XG4gICAgICAgIC8vID4oXG4gICAgICAgIC8vICAgYXVnbWVudGF0aW9uOiBBdWdtZW50YXRpb25cbiAgICAgICAgLy8gKTogWm9kT2JqZWN0PFxuICAgICAgICAvLyAgIGV4dGVuZFNoYXBlPFQsIEF1Z21lbnRhdGlvbj4sXG4gICAgICAgIC8vICAgVW5rbm93bktleXMsXG4gICAgICAgIC8vICAgQ2F0Y2hhbGwsXG4gICAgICAgIC8vICAgTmV3T3V0cHV0LFxuICAgICAgICAvLyAgIE5ld0lucHV0XG4gICAgICAgIC8vID4ge1xuICAgICAgICAvLyAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHtcbiAgICAgICAgLy8gICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgLy8gICAgIHNoYXBlOiAoKSA9PiAoe1xuICAgICAgICAvLyAgICAgICAuLi50aGlzLl9kZWYuc2hhcGUoKSxcbiAgICAgICAgLy8gICAgICAgLi4uYXVnbWVudGF0aW9uLFxuICAgICAgICAvLyAgICAgfSksXG4gICAgICAgIC8vICAgfSkgYXMgYW55O1xuICAgICAgICAvLyB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZGVwcmVjYXRlZCBVc2UgYC5leHRlbmRgIGluc3RlYWRcbiAgICAgICAgICogICovXG4gICAgICAgIHRoaXMuYXVnbWVudCA9IHRoaXMuZXh0ZW5kO1xuICAgIH1cbiAgICBfZ2V0Q2FjaGVkKCkge1xuICAgICAgICBpZiAodGhpcy5fY2FjaGVkICE9PSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlZDtcbiAgICAgICAgY29uc3Qgc2hhcGUgPSB0aGlzLl9kZWYuc2hhcGUoKTtcbiAgICAgICAgY29uc3Qga2V5cyA9IHV0aWwub2JqZWN0S2V5cyhzaGFwZSk7XG4gICAgICAgIHRoaXMuX2NhY2hlZCA9IHsgc2hhcGUsIGtleXMgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlZDtcbiAgICB9XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFR5cGUgPSB0aGlzLl9nZXRUeXBlKGlucHV0KTtcbiAgICAgICAgaWYgKHBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUub2JqZWN0KSB7XG4gICAgICAgICAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLm9iamVjdCxcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgc3RhdHVzLCBjdHggfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhpbnB1dCk7XG4gICAgICAgIGNvbnN0IHsgc2hhcGUsIGtleXM6IHNoYXBlS2V5cyB9ID0gdGhpcy5fZ2V0Q2FjaGVkKCk7XG4gICAgICAgIGNvbnN0IGV4dHJhS2V5cyA9IFtdO1xuICAgICAgICBpZiAoISh0aGlzLl9kZWYuY2F0Y2hhbGwgaW5zdGFuY2VvZiBab2ROZXZlciAmJiB0aGlzLl9kZWYudW5rbm93bktleXMgPT09IFwic3RyaXBcIikpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIGN0eC5kYXRhKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFzaGFwZUtleXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICBleHRyYUtleXMucHVzaChrZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYWlycyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBzaGFwZUtleXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGtleVZhbGlkYXRvciA9IHNoYXBlW2tleV07XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGN0eC5kYXRhW2tleV07XG4gICAgICAgICAgICBwYWlycy5wdXNoKHtcbiAgICAgICAgICAgICAgICBrZXk6IHsgc3RhdHVzOiBcInZhbGlkXCIsIHZhbHVlOiBrZXkgfSxcbiAgICAgICAgICAgICAgICB2YWx1ZToga2V5VmFsaWRhdG9yLl9wYXJzZShuZXcgUGFyc2VJbnB1dExhenlQYXRoKGN0eCwgdmFsdWUsIGN0eC5wYXRoLCBrZXkpKSxcbiAgICAgICAgICAgICAgICBhbHdheXNTZXQ6IGtleSBpbiBjdHguZGF0YSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9kZWYuY2F0Y2hhbGwgaW5zdGFuY2VvZiBab2ROZXZlcikge1xuICAgICAgICAgICAgY29uc3QgdW5rbm93bktleXMgPSB0aGlzLl9kZWYudW5rbm93bktleXM7XG4gICAgICAgICAgICBpZiAodW5rbm93bktleXMgPT09IFwicGFzc3Rocm91Z2hcIikge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIGV4dHJhS2V5cykge1xuICAgICAgICAgICAgICAgICAgICBwYWlycy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogeyBzdGF0dXM6IFwidmFsaWRcIiwgdmFsdWU6IGtleSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHsgc3RhdHVzOiBcInZhbGlkXCIsIHZhbHVlOiBjdHguZGF0YVtrZXldIH0sXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHVua25vd25LZXlzID09PSBcInN0cmljdFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKGV4dHJhS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLnVucmVjb2duaXplZF9rZXlzLFxuICAgICAgICAgICAgICAgICAgICAgICAga2V5czogZXh0cmFLZXlzLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodW5rbm93bktleXMgPT09IFwic3RyaXBcIikge1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnRlcm5hbCBab2RPYmplY3QgZXJyb3I6IGludmFsaWQgdW5rbm93bktleXMgdmFsdWUuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBydW4gY2F0Y2hhbGwgdmFsaWRhdGlvblxuICAgICAgICAgICAgY29uc3QgY2F0Y2hhbGwgPSB0aGlzLl9kZWYuY2F0Y2hhbGw7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBleHRyYUtleXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGN0eC5kYXRhW2tleV07XG4gICAgICAgICAgICAgICAgcGFpcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGtleTogeyBzdGF0dXM6IFwidmFsaWRcIiwgdmFsdWU6IGtleSB9LFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogY2F0Y2hhbGwuX3BhcnNlKG5ldyBQYXJzZUlucHV0TGF6eVBhdGgoY3R4LCB2YWx1ZSwgY3R4LnBhdGgsIGtleSkgLy8sIGN0eC5jaGlsZChrZXkpLCB2YWx1ZSwgZ2V0UGFyc2VkVHlwZSh2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgYWx3YXlzU2V0OiBrZXkgaW4gY3R4LmRhdGEsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGN0eC5jb21tb24uYXN5bmMpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKVxuICAgICAgICAgICAgICAgIC50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzeW5jUGFpcnMgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHBhaXIgb2YgcGFpcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gYXdhaXQgcGFpci5rZXk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgcGFpci52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgc3luY1BhaXJzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBhbHdheXNTZXQ6IHBhaXIuYWx3YXlzU2V0LFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN5bmNQYWlycztcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnRoZW4oKHN5bmNQYWlycykgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBQYXJzZVN0YXR1cy5tZXJnZU9iamVjdFN5bmMoc3RhdHVzLCBzeW5jUGFpcnMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUGFyc2VTdGF0dXMubWVyZ2VPYmplY3RTeW5jKHN0YXR1cywgcGFpcnMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBzaGFwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5zaGFwZSgpO1xuICAgIH1cbiAgICBzdHJpY3QobWVzc2FnZSkge1xuICAgICAgICBlcnJvclV0aWwuZXJyVG9PYmo7XG4gICAgICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIHVua25vd25LZXlzOiBcInN0cmljdFwiLFxuICAgICAgICAgICAgLi4uKG1lc3NhZ2UgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICBlcnJvck1hcDogKGlzc3VlLCBjdHgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRFcnJvciA9IHRoaXMuX2RlZi5lcnJvck1hcD8uKGlzc3VlLCBjdHgpLm1lc3NhZ2UgPz8gY3R4LmRlZmF1bHRFcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc3N1ZS5jb2RlID09PSBcInVucmVjb2duaXplZF9rZXlzXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpLm1lc3NhZ2UgPz8gZGVmYXVsdEVycm9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGRlZmF1bHRFcnJvcixcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RyaXAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIHVua25vd25LZXlzOiBcInN0cmlwXCIsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwYXNzdGhyb3VnaCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RPYmplY3Qoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgdW5rbm93bktleXM6IFwicGFzc3Rocm91Z2hcIixcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8vIGNvbnN0IEF1Z21lbnRGYWN0b3J5ID1cbiAgICAvLyAgIDxEZWYgZXh0ZW5kcyBab2RPYmplY3REZWY+KGRlZjogRGVmKSA9PlxuICAgIC8vICAgPEF1Z21lbnRhdGlvbiBleHRlbmRzIFpvZFJhd1NoYXBlPihcbiAgICAvLyAgICAgYXVnbWVudGF0aW9uOiBBdWdtZW50YXRpb25cbiAgICAvLyAgICk6IFpvZE9iamVjdDxcbiAgICAvLyAgICAgZXh0ZW5kU2hhcGU8UmV0dXJuVHlwZTxEZWZbXCJzaGFwZVwiXT4sIEF1Z21lbnRhdGlvbj4sXG4gICAgLy8gICAgIERlZltcInVua25vd25LZXlzXCJdLFxuICAgIC8vICAgICBEZWZbXCJjYXRjaGFsbFwiXVxuICAgIC8vICAgPiA9PiB7XG4gICAgLy8gICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHtcbiAgICAvLyAgICAgICAuLi5kZWYsXG4gICAgLy8gICAgICAgc2hhcGU6ICgpID0+ICh7XG4gICAgLy8gICAgICAgICAuLi5kZWYuc2hhcGUoKSxcbiAgICAvLyAgICAgICAgIC4uLmF1Z21lbnRhdGlvbixcbiAgICAvLyAgICAgICB9KSxcbiAgICAvLyAgICAgfSkgYXMgYW55O1xuICAgIC8vICAgfTtcbiAgICBleHRlbmQoYXVnbWVudGF0aW9uKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIHNoYXBlOiAoKSA9PiAoe1xuICAgICAgICAgICAgICAgIC4uLnRoaXMuX2RlZi5zaGFwZSgpLFxuICAgICAgICAgICAgICAgIC4uLmF1Z21lbnRhdGlvbixcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUHJpb3IgdG8gem9kQDEuMC4xMiB0aGVyZSB3YXMgYSBidWcgaW4gdGhlXG4gICAgICogaW5mZXJyZWQgdHlwZSBvZiBtZXJnZWQgb2JqZWN0cy4gUGxlYXNlXG4gICAgICogdXBncmFkZSBpZiB5b3UgYXJlIGV4cGVyaWVuY2luZyBpc3N1ZXMuXG4gICAgICovXG4gICAgbWVyZ2UobWVyZ2luZykge1xuICAgICAgICBjb25zdCBtZXJnZWQgPSBuZXcgWm9kT2JqZWN0KHtcbiAgICAgICAgICAgIHVua25vd25LZXlzOiBtZXJnaW5nLl9kZWYudW5rbm93bktleXMsXG4gICAgICAgICAgICBjYXRjaGFsbDogbWVyZ2luZy5fZGVmLmNhdGNoYWxsLFxuICAgICAgICAgICAgc2hhcGU6ICgpID0+ICh7XG4gICAgICAgICAgICAgICAgLi4udGhpcy5fZGVmLnNoYXBlKCksXG4gICAgICAgICAgICAgICAgLi4ubWVyZ2luZy5fZGVmLnNoYXBlKCksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kT2JqZWN0LFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG1lcmdlZDtcbiAgICB9XG4gICAgLy8gbWVyZ2U8XG4gICAgLy8gICBJbmNvbWluZyBleHRlbmRzIEFueVpvZE9iamVjdCxcbiAgICAvLyAgIEF1Z21lbnRhdGlvbiBleHRlbmRzIEluY29taW5nW1wic2hhcGVcIl0sXG4gICAgLy8gICBOZXdPdXRwdXQgZXh0ZW5kcyB7XG4gICAgLy8gICAgIFtrIGluIGtleW9mIEF1Z21lbnRhdGlvbiB8IGtleW9mIE91dHB1dF06IGsgZXh0ZW5kcyBrZXlvZiBBdWdtZW50YXRpb25cbiAgICAvLyAgICAgICA/IEF1Z21lbnRhdGlvbltrXVtcIl9vdXRwdXRcIl1cbiAgICAvLyAgICAgICA6IGsgZXh0ZW5kcyBrZXlvZiBPdXRwdXRcbiAgICAvLyAgICAgICA/IE91dHB1dFtrXVxuICAgIC8vICAgICAgIDogbmV2ZXI7XG4gICAgLy8gICB9LFxuICAgIC8vICAgTmV3SW5wdXQgZXh0ZW5kcyB7XG4gICAgLy8gICAgIFtrIGluIGtleW9mIEF1Z21lbnRhdGlvbiB8IGtleW9mIElucHV0XTogayBleHRlbmRzIGtleW9mIEF1Z21lbnRhdGlvblxuICAgIC8vICAgICAgID8gQXVnbWVudGF0aW9uW2tdW1wiX2lucHV0XCJdXG4gICAgLy8gICAgICAgOiBrIGV4dGVuZHMga2V5b2YgSW5wdXRcbiAgICAvLyAgICAgICA/IElucHV0W2tdXG4gICAgLy8gICAgICAgOiBuZXZlcjtcbiAgICAvLyAgIH1cbiAgICAvLyA+KFxuICAgIC8vICAgbWVyZ2luZzogSW5jb21pbmdcbiAgICAvLyApOiBab2RPYmplY3Q8XG4gICAgLy8gICBleHRlbmRTaGFwZTxULCBSZXR1cm5UeXBlPEluY29taW5nW1wiX2RlZlwiXVtcInNoYXBlXCJdPj4sXG4gICAgLy8gICBJbmNvbWluZ1tcIl9kZWZcIl1bXCJ1bmtub3duS2V5c1wiXSxcbiAgICAvLyAgIEluY29taW5nW1wiX2RlZlwiXVtcImNhdGNoYWxsXCJdLFxuICAgIC8vICAgTmV3T3V0cHV0LFxuICAgIC8vICAgTmV3SW5wdXRcbiAgICAvLyA+IHtcbiAgICAvLyAgIGNvbnN0IG1lcmdlZDogYW55ID0gbmV3IFpvZE9iamVjdCh7XG4gICAgLy8gICAgIHVua25vd25LZXlzOiBtZXJnaW5nLl9kZWYudW5rbm93bktleXMsXG4gICAgLy8gICAgIGNhdGNoYWxsOiBtZXJnaW5nLl9kZWYuY2F0Y2hhbGwsXG4gICAgLy8gICAgIHNoYXBlOiAoKSA9PlxuICAgIC8vICAgICAgIG9iamVjdFV0aWwubWVyZ2VTaGFwZXModGhpcy5fZGVmLnNoYXBlKCksIG1lcmdpbmcuX2RlZi5zaGFwZSgpKSxcbiAgICAvLyAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RPYmplY3QsXG4gICAgLy8gICB9KSBhcyBhbnk7XG4gICAgLy8gICByZXR1cm4gbWVyZ2VkO1xuICAgIC8vIH1cbiAgICBzZXRLZXkoa2V5LCBzY2hlbWEpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXVnbWVudCh7IFtrZXldOiBzY2hlbWEgfSk7XG4gICAgfVxuICAgIC8vIG1lcmdlPEluY29taW5nIGV4dGVuZHMgQW55Wm9kT2JqZWN0PihcbiAgICAvLyAgIG1lcmdpbmc6IEluY29taW5nXG4gICAgLy8gKTogLy9ab2RPYmplY3Q8VCAmIEluY29taW5nW1wiX3NoYXBlXCJdLCBVbmtub3duS2V5cywgQ2F0Y2hhbGw+ID0gKG1lcmdpbmcpID0+IHtcbiAgICAvLyBab2RPYmplY3Q8XG4gICAgLy8gICBleHRlbmRTaGFwZTxULCBSZXR1cm5UeXBlPEluY29taW5nW1wiX2RlZlwiXVtcInNoYXBlXCJdPj4sXG4gICAgLy8gICBJbmNvbWluZ1tcIl9kZWZcIl1bXCJ1bmtub3duS2V5c1wiXSxcbiAgICAvLyAgIEluY29taW5nW1wiX2RlZlwiXVtcImNhdGNoYWxsXCJdXG4gICAgLy8gPiB7XG4gICAgLy8gICAvLyBjb25zdCBtZXJnZWRTaGFwZSA9IG9iamVjdFV0aWwubWVyZ2VTaGFwZXMoXG4gICAgLy8gICAvLyAgIHRoaXMuX2RlZi5zaGFwZSgpLFxuICAgIC8vICAgLy8gICBtZXJnaW5nLl9kZWYuc2hhcGUoKVxuICAgIC8vICAgLy8gKTtcbiAgICAvLyAgIGNvbnN0IG1lcmdlZDogYW55ID0gbmV3IFpvZE9iamVjdCh7XG4gICAgLy8gICAgIHVua25vd25LZXlzOiBtZXJnaW5nLl9kZWYudW5rbm93bktleXMsXG4gICAgLy8gICAgIGNhdGNoYWxsOiBtZXJnaW5nLl9kZWYuY2F0Y2hhbGwsXG4gICAgLy8gICAgIHNoYXBlOiAoKSA9PlxuICAgIC8vICAgICAgIG9iamVjdFV0aWwubWVyZ2VTaGFwZXModGhpcy5fZGVmLnNoYXBlKCksIG1lcmdpbmcuX2RlZi5zaGFwZSgpKSxcbiAgICAvLyAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RPYmplY3QsXG4gICAgLy8gICB9KSBhcyBhbnk7XG4gICAgLy8gICByZXR1cm4gbWVyZ2VkO1xuICAgIC8vIH1cbiAgICBjYXRjaGFsbChpbmRleCkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZE9iamVjdCh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBjYXRjaGFsbDogaW5kZXgsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwaWNrKG1hc2spIHtcbiAgICAgICAgY29uc3Qgc2hhcGUgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgdXRpbC5vYmplY3RLZXlzKG1hc2spKSB7XG4gICAgICAgICAgICBpZiAobWFza1trZXldICYmIHRoaXMuc2hhcGVba2V5XSkge1xuICAgICAgICAgICAgICAgIHNoYXBlW2tleV0gPSB0aGlzLnNoYXBlW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBab2RPYmplY3Qoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgc2hhcGU6ICgpID0+IHNoYXBlLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgb21pdChtYXNrKSB7XG4gICAgICAgIGNvbnN0IHNoYXBlID0ge307XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHV0aWwub2JqZWN0S2V5cyh0aGlzLnNoYXBlKSkge1xuICAgICAgICAgICAgaWYgKCFtYXNrW2tleV0pIHtcbiAgICAgICAgICAgICAgICBzaGFwZVtrZXldID0gdGhpcy5zaGFwZVtrZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIHNoYXBlOiAoKSA9PiBzaGFwZSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgZGVlcFBhcnRpYWwoKSB7XG4gICAgICAgIHJldHVybiBkZWVwUGFydGlhbGlmeSh0aGlzKTtcbiAgICB9XG4gICAgcGFydGlhbChtYXNrKSB7XG4gICAgICAgIGNvbnN0IG5ld1NoYXBlID0ge307XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHV0aWwub2JqZWN0S2V5cyh0aGlzLnNoYXBlKSkge1xuICAgICAgICAgICAgY29uc3QgZmllbGRTY2hlbWEgPSB0aGlzLnNoYXBlW2tleV07XG4gICAgICAgICAgICBpZiAobWFzayAmJiAhbWFza1trZXldKSB7XG4gICAgICAgICAgICAgICAgbmV3U2hhcGVba2V5XSA9IGZpZWxkU2NoZW1hO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbmV3U2hhcGVba2V5XSA9IGZpZWxkU2NoZW1hLm9wdGlvbmFsKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBab2RPYmplY3Qoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgc2hhcGU6ICgpID0+IG5ld1NoYXBlLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmVxdWlyZWQobWFzaykge1xuICAgICAgICBjb25zdCBuZXdTaGFwZSA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiB1dGlsLm9iamVjdEtleXModGhpcy5zaGFwZSkpIHtcbiAgICAgICAgICAgIGlmIChtYXNrICYmICFtYXNrW2tleV0pIHtcbiAgICAgICAgICAgICAgICBuZXdTaGFwZVtrZXldID0gdGhpcy5zaGFwZVtrZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmllbGRTY2hlbWEgPSB0aGlzLnNoYXBlW2tleV07XG4gICAgICAgICAgICAgICAgbGV0IG5ld0ZpZWxkID0gZmllbGRTY2hlbWE7XG4gICAgICAgICAgICAgICAgd2hpbGUgKG5ld0ZpZWxkIGluc3RhbmNlb2YgWm9kT3B0aW9uYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3RmllbGQgPSBuZXdGaWVsZC5fZGVmLmlubmVyVHlwZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbmV3U2hhcGVba2V5XSA9IG5ld0ZpZWxkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIHNoYXBlOiAoKSA9PiBuZXdTaGFwZSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGtleW9mKCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlWm9kRW51bSh1dGlsLm9iamVjdEtleXModGhpcy5zaGFwZSkpO1xuICAgIH1cbn1cblpvZE9iamVjdC5jcmVhdGUgPSAoc2hhcGUsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHtcbiAgICAgICAgc2hhcGU6ICgpID0+IHNoYXBlLFxuICAgICAgICB1bmtub3duS2V5czogXCJzdHJpcFwiLFxuICAgICAgICBjYXRjaGFsbDogWm9kTmV2ZXIuY3JlYXRlKCksXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kT2JqZWN0LFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuWm9kT2JqZWN0LnN0cmljdENyZWF0ZSA9IChzaGFwZSwgcGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2RPYmplY3Qoe1xuICAgICAgICBzaGFwZTogKCkgPT4gc2hhcGUsXG4gICAgICAgIHVua25vd25LZXlzOiBcInN0cmljdFwiLFxuICAgICAgICBjYXRjaGFsbDogWm9kTmV2ZXIuY3JlYXRlKCksXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kT2JqZWN0LFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuWm9kT2JqZWN0LmxhenljcmVhdGUgPSAoc2hhcGUsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHtcbiAgICAgICAgc2hhcGUsXG4gICAgICAgIHVua25vd25LZXlzOiBcInN0cmlwXCIsXG4gICAgICAgIGNhdGNoYWxsOiBab2ROZXZlci5jcmVhdGUoKSxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RPYmplY3QsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5leHBvcnQgY2xhc3MgWm9kVW5pb24gZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgeyBjdHggfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhpbnB1dCk7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLl9kZWYub3B0aW9ucztcbiAgICAgICAgZnVuY3Rpb24gaGFuZGxlUmVzdWx0cyhyZXN1bHRzKSB7XG4gICAgICAgICAgICAvLyByZXR1cm4gZmlyc3QgaXNzdWUtZnJlZSB2YWxpZGF0aW9uIGlmIGl0IGV4aXN0c1xuICAgICAgICAgICAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0cykge1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQucmVzdWx0LnN0YXR1cyA9PT0gXCJ2YWxpZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQucmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnJlc3VsdC5zdGF0dXMgPT09IFwiZGlydHlcIikge1xuICAgICAgICAgICAgICAgICAgICAvLyBhZGQgaXNzdWVzIGZyb20gZGlydHkgb3B0aW9uXG4gICAgICAgICAgICAgICAgICAgIGN0eC5jb21tb24uaXNzdWVzLnB1c2goLi4ucmVzdWx0LmN0eC5jb21tb24uaXNzdWVzKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gcmV0dXJuIGludmFsaWRcbiAgICAgICAgICAgIGNvbnN0IHVuaW9uRXJyb3JzID0gcmVzdWx0cy5tYXAoKHJlc3VsdCkgPT4gbmV3IFpvZEVycm9yKHJlc3VsdC5jdHguY29tbW9uLmlzc3VlcykpO1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdW5pb24sXG4gICAgICAgICAgICAgICAgdW5pb25FcnJvcnMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjdHguY29tbW9uLmFzeW5jKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwob3B0aW9ucy5tYXAoYXN5bmMgKG9wdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkQ3R4ID0ge1xuICAgICAgICAgICAgICAgICAgICAuLi5jdHgsXG4gICAgICAgICAgICAgICAgICAgIGNvbW1vbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3R4LmNvbW1vbixcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzc3VlczogW10sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudDogbnVsbCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdDogYXdhaXQgb3B0aW9uLl9wYXJzZUFzeW5jKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IGN0eC5kYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IGNoaWxkQ3R4LFxuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgY3R4OiBjaGlsZEN0eCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSkpLnRoZW4oaGFuZGxlUmVzdWx0cyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgZGlydHkgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBpc3N1ZXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZEN0eCA9IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uY3R4LFxuICAgICAgICAgICAgICAgICAgICBjb21tb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN0eC5jb21tb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBpc3N1ZXM6IFtdLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IG51bGwsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBvcHRpb24uX3BhcnNlU3luYyh7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IGN0eC5kYXRhLFxuICAgICAgICAgICAgICAgICAgICBwYXRoOiBjdHgucGF0aCxcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBjaGlsZEN0eCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gXCJ2YWxpZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdC5zdGF0dXMgPT09IFwiZGlydHlcIiAmJiAhZGlydHkpIHtcbiAgICAgICAgICAgICAgICAgICAgZGlydHkgPSB7IHJlc3VsdCwgY3R4OiBjaGlsZEN0eCB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY2hpbGRDdHguY29tbW9uLmlzc3Vlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgaXNzdWVzLnB1c2goY2hpbGRDdHguY29tbW9uLmlzc3Vlcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRpcnR5KSB7XG4gICAgICAgICAgICAgICAgY3R4LmNvbW1vbi5pc3N1ZXMucHVzaCguLi5kaXJ0eS5jdHguY29tbW9uLmlzc3Vlcyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRpcnR5LnJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHVuaW9uRXJyb3JzID0gaXNzdWVzLm1hcCgoaXNzdWVzKSA9PiBuZXcgWm9kRXJyb3IoaXNzdWVzKSk7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF91bmlvbixcbiAgICAgICAgICAgICAgICB1bmlvbkVycm9ycyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IG9wdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYub3B0aW9ucztcbiAgICB9XG59XG5ab2RVbmlvbi5jcmVhdGUgPSAodHlwZXMsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kVW5pb24oe1xuICAgICAgICBvcHRpb25zOiB0eXBlcyxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RVbmlvbixcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8vLy8vLy8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLy8vLy8vLy9cbi8vLy8vLy8vLy8gICAgICBab2REaXNjcmltaW5hdGVkVW5pb24gICAgICAvLy8vLy8vLy8vXG4vLy8vLy8vLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vLy8vLy8vL1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5jb25zdCBnZXREaXNjcmltaW5hdG9yID0gKHR5cGUpID0+IHtcbiAgICBpZiAodHlwZSBpbnN0YW5jZW9mIFpvZExhenkpIHtcbiAgICAgICAgcmV0dXJuIGdldERpc2NyaW1pbmF0b3IodHlwZS5zY2hlbWEpO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgWm9kRWZmZWN0cykge1xuICAgICAgICByZXR1cm4gZ2V0RGlzY3JpbWluYXRvcih0eXBlLmlubmVyVHlwZSgpKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIFpvZExpdGVyYWwpIHtcbiAgICAgICAgcmV0dXJuIFt0eXBlLnZhbHVlXTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIFpvZEVudW0pIHtcbiAgICAgICAgcmV0dXJuIHR5cGUub3B0aW9ucztcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIFpvZE5hdGl2ZUVudW0pIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGJhbi9iYW5cbiAgICAgICAgcmV0dXJuIHV0aWwub2JqZWN0VmFsdWVzKHR5cGUuZW51bSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBab2REZWZhdWx0KSB7XG4gICAgICAgIHJldHVybiBnZXREaXNjcmltaW5hdG9yKHR5cGUuX2RlZi5pbm5lclR5cGUpO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgWm9kVW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBbdW5kZWZpbmVkXTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIFpvZE51bGwpIHtcbiAgICAgICAgcmV0dXJuIFtudWxsXTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIFpvZE9wdGlvbmFsKSB7XG4gICAgICAgIHJldHVybiBbdW5kZWZpbmVkLCAuLi5nZXREaXNjcmltaW5hdG9yKHR5cGUudW53cmFwKCkpXTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIFpvZE51bGxhYmxlKSB7XG4gICAgICAgIHJldHVybiBbbnVsbCwgLi4uZ2V0RGlzY3JpbWluYXRvcih0eXBlLnVud3JhcCgpKV07XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBab2RCcmFuZGVkKSB7XG4gICAgICAgIHJldHVybiBnZXREaXNjcmltaW5hdG9yKHR5cGUudW53cmFwKCkpO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgWm9kUmVhZG9ubHkpIHtcbiAgICAgICAgcmV0dXJuIGdldERpc2NyaW1pbmF0b3IodHlwZS51bndyYXAoKSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBab2RDYXRjaCkge1xuICAgICAgICByZXR1cm4gZ2V0RGlzY3JpbWluYXRvcih0eXBlLl9kZWYuaW5uZXJUeXBlKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG59O1xuZXhwb3J0IGNsYXNzIFpvZERpc2NyaW1pbmF0ZWRVbmlvbiBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTtcbiAgICAgICAgaWYgKGN0eC5wYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLm9iamVjdCkge1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS5vYmplY3QsXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkaXNjcmltaW5hdG9yID0gdGhpcy5kaXNjcmltaW5hdG9yO1xuICAgICAgICBjb25zdCBkaXNjcmltaW5hdG9yVmFsdWUgPSBjdHguZGF0YVtkaXNjcmltaW5hdG9yXTtcbiAgICAgICAgY29uc3Qgb3B0aW9uID0gdGhpcy5vcHRpb25zTWFwLmdldChkaXNjcmltaW5hdG9yVmFsdWUpO1xuICAgICAgICBpZiAoIW9wdGlvbikge1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdW5pb25fZGlzY3JpbWluYXRvcixcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBBcnJheS5mcm9tKHRoaXMub3B0aW9uc01hcC5rZXlzKCkpLFxuICAgICAgICAgICAgICAgIHBhdGg6IFtkaXNjcmltaW5hdG9yXSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGN0eC5jb21tb24uYXN5bmMpIHtcbiAgICAgICAgICAgIHJldHVybiBvcHRpb24uX3BhcnNlQXN5bmMoe1xuICAgICAgICAgICAgICAgIGRhdGE6IGN0eC5kYXRhLFxuICAgICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgICAgIHBhcmVudDogY3R4LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9uLl9wYXJzZVN5bmMoe1xuICAgICAgICAgICAgICAgIGRhdGE6IGN0eC5kYXRhLFxuICAgICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgICAgIHBhcmVudDogY3R4LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IGRpc2NyaW1pbmF0b3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYuZGlzY3JpbWluYXRvcjtcbiAgICB9XG4gICAgZ2V0IG9wdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYub3B0aW9ucztcbiAgICB9XG4gICAgZ2V0IG9wdGlvbnNNYXAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYub3B0aW9uc01hcDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBkaXNjcmltaW5hdGVkIHVuaW9uIHNjaGVtYS4gSXRzIGJlaGF2aW91ciBpcyB2ZXJ5IHNpbWlsYXIgdG8gdGhhdCBvZiB0aGUgbm9ybWFsIHoudW5pb24oKSBjb25zdHJ1Y3Rvci5cbiAgICAgKiBIb3dldmVyLCBpdCBvbmx5IGFsbG93cyBhIHVuaW9uIG9mIG9iamVjdHMsIGFsbCBvZiB3aGljaCBuZWVkIHRvIHNoYXJlIGEgZGlzY3JpbWluYXRvciBwcm9wZXJ0eS4gVGhpcyBwcm9wZXJ0eSBtdXN0XG4gICAgICogaGF2ZSBhIGRpZmZlcmVudCB2YWx1ZSBmb3IgZWFjaCBvYmplY3QgaW4gdGhlIHVuaW9uLlxuICAgICAqIEBwYXJhbSBkaXNjcmltaW5hdG9yIHRoZSBuYW1lIG9mIHRoZSBkaXNjcmltaW5hdG9yIHByb3BlcnR5XG4gICAgICogQHBhcmFtIHR5cGVzIGFuIGFycmF5IG9mIG9iamVjdCBzY2hlbWFzXG4gICAgICogQHBhcmFtIHBhcmFtc1xuICAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGUoZGlzY3JpbWluYXRvciwgb3B0aW9ucywgcGFyYW1zKSB7XG4gICAgICAgIC8vIEdldCBhbGwgdGhlIHZhbGlkIGRpc2NyaW1pbmF0b3IgdmFsdWVzXG4gICAgICAgIGNvbnN0IG9wdGlvbnNNYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgIC8vIHRyeSB7XG4gICAgICAgIGZvciAoY29uc3QgdHlwZSBvZiBvcHRpb25zKSB7XG4gICAgICAgICAgICBjb25zdCBkaXNjcmltaW5hdG9yVmFsdWVzID0gZ2V0RGlzY3JpbWluYXRvcih0eXBlLnNoYXBlW2Rpc2NyaW1pbmF0b3JdKTtcbiAgICAgICAgICAgIGlmICghZGlzY3JpbWluYXRvclZhbHVlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEEgZGlzY3JpbWluYXRvciB2YWx1ZSBmb3Iga2V5IFxcYCR7ZGlzY3JpbWluYXRvcn1cXGAgY291bGQgbm90IGJlIGV4dHJhY3RlZCBmcm9tIGFsbCBzY2hlbWEgb3B0aW9uc2ApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBkaXNjcmltaW5hdG9yVmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnNNYXAuaGFzKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYERpc2NyaW1pbmF0b3IgcHJvcGVydHkgJHtTdHJpbmcoZGlzY3JpbWluYXRvcil9IGhhcyBkdXBsaWNhdGUgdmFsdWUgJHtTdHJpbmcodmFsdWUpfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBvcHRpb25zTWFwLnNldCh2YWx1ZSwgdHlwZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBab2REaXNjcmltaW5hdGVkVW5pb24oe1xuICAgICAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2REaXNjcmltaW5hdGVkVW5pb24sXG4gICAgICAgICAgICBkaXNjcmltaW5hdG9yLFxuICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgIG9wdGlvbnNNYXAsXG4gICAgICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIG1lcmdlVmFsdWVzKGEsIGIpIHtcbiAgICBjb25zdCBhVHlwZSA9IGdldFBhcnNlZFR5cGUoYSk7XG4gICAgY29uc3QgYlR5cGUgPSBnZXRQYXJzZWRUeXBlKGIpO1xuICAgIGlmIChhID09PSBiKSB7XG4gICAgICAgIHJldHVybiB7IHZhbGlkOiB0cnVlLCBkYXRhOiBhIH07XG4gICAgfVxuICAgIGVsc2UgaWYgKGFUeXBlID09PSBab2RQYXJzZWRUeXBlLm9iamVjdCAmJiBiVHlwZSA9PT0gWm9kUGFyc2VkVHlwZS5vYmplY3QpIHtcbiAgICAgICAgY29uc3QgYktleXMgPSB1dGlsLm9iamVjdEtleXMoYik7XG4gICAgICAgIGNvbnN0IHNoYXJlZEtleXMgPSB1dGlsLm9iamVjdEtleXMoYSkuZmlsdGVyKChrZXkpID0+IGJLZXlzLmluZGV4T2Yoa2V5KSAhPT0gLTEpO1xuICAgICAgICBjb25zdCBuZXdPYmogPSB7IC4uLmEsIC4uLmIgfTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2Ygc2hhcmVkS2V5cykge1xuICAgICAgICAgICAgY29uc3Qgc2hhcmVkVmFsdWUgPSBtZXJnZVZhbHVlcyhhW2tleV0sIGJba2V5XSk7XG4gICAgICAgICAgICBpZiAoIXNoYXJlZFZhbHVlLnZhbGlkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXdPYmpba2V5XSA9IHNoYXJlZFZhbHVlLmRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgdmFsaWQ6IHRydWUsIGRhdGE6IG5ld09iaiB9O1xuICAgIH1cbiAgICBlbHNlIGlmIChhVHlwZSA9PT0gWm9kUGFyc2VkVHlwZS5hcnJheSAmJiBiVHlwZSA9PT0gWm9kUGFyc2VkVHlwZS5hcnJheSkge1xuICAgICAgICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4geyB2YWxpZDogZmFsc2UgfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXdBcnJheSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgYS5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1BID0gYVtpbmRleF07XG4gICAgICAgICAgICBjb25zdCBpdGVtQiA9IGJbaW5kZXhdO1xuICAgICAgICAgICAgY29uc3Qgc2hhcmVkVmFsdWUgPSBtZXJnZVZhbHVlcyhpdGVtQSwgaXRlbUIpO1xuICAgICAgICAgICAgaWYgKCFzaGFyZWRWYWx1ZS52YWxpZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbGlkOiBmYWxzZSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmV3QXJyYXkucHVzaChzaGFyZWRWYWx1ZS5kYXRhKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyB2YWxpZDogdHJ1ZSwgZGF0YTogbmV3QXJyYXkgfTtcbiAgICB9XG4gICAgZWxzZSBpZiAoYVR5cGUgPT09IFpvZFBhcnNlZFR5cGUuZGF0ZSAmJiBiVHlwZSA9PT0gWm9kUGFyc2VkVHlwZS5kYXRlICYmICthID09PSArYikge1xuICAgICAgICByZXR1cm4geyB2YWxpZDogdHJ1ZSwgZGF0YTogYSB9O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlIH07XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIFpvZEludGVyc2VjdGlvbiBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCB7IHN0YXR1cywgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpO1xuICAgICAgICBjb25zdCBoYW5kbGVQYXJzZWQgPSAocGFyc2VkTGVmdCwgcGFyc2VkUmlnaHQpID0+IHtcbiAgICAgICAgICAgIGlmIChpc0Fib3J0ZWQocGFyc2VkTGVmdCkgfHwgaXNBYm9ydGVkKHBhcnNlZFJpZ2h0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbWVyZ2VkID0gbWVyZ2VWYWx1ZXMocGFyc2VkTGVmdC52YWx1ZSwgcGFyc2VkUmlnaHQudmFsdWUpO1xuICAgICAgICAgICAgaWYgKCFtZXJnZWQudmFsaWQpIHtcbiAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfaW50ZXJzZWN0aW9uX3R5cGVzLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzRGlydHkocGFyc2VkTGVmdCkgfHwgaXNEaXJ0eShwYXJzZWRSaWdodCkpIHtcbiAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IHN0YXR1czogc3RhdHVzLnZhbHVlLCB2YWx1ZTogbWVyZ2VkLmRhdGEgfTtcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGN0eC5jb21tb24uYXN5bmMpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgICAgdGhpcy5fZGVmLmxlZnQuX3BhcnNlQXN5bmMoe1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiBjdHguZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudDogY3R4LFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHRoaXMuX2RlZi5yaWdodC5fcGFyc2VBc3luYyh7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IGN0eC5kYXRhLFxuICAgICAgICAgICAgICAgICAgICBwYXRoOiBjdHgucGF0aCxcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBjdHgsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBdKS50aGVuKChbbGVmdCwgcmlnaHRdKSA9PiBoYW5kbGVQYXJzZWQobGVmdCwgcmlnaHQpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVQYXJzZWQodGhpcy5fZGVmLmxlZnQuX3BhcnNlU3luYyh7XG4gICAgICAgICAgICAgICAgZGF0YTogY3R4LmRhdGEsXG4gICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgcGFyZW50OiBjdHgsXG4gICAgICAgICAgICB9KSwgdGhpcy5fZGVmLnJpZ2h0Ll9wYXJzZVN5bmMoe1xuICAgICAgICAgICAgICAgIGRhdGE6IGN0eC5kYXRhLFxuICAgICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgICAgIHBhcmVudDogY3R4LFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgfVxufVxuWm9kSW50ZXJzZWN0aW9uLmNyZWF0ZSA9IChsZWZ0LCByaWdodCwgcGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2RJbnRlcnNlY3Rpb24oe1xuICAgICAgICBsZWZ0OiBsZWZ0LFxuICAgICAgICByaWdodDogcmlnaHQsXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kSW50ZXJzZWN0aW9uLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuLy8gdHlwZSBab2RUdXBsZUl0ZW1zID0gW1pvZFR5cGVBbnksIC4uLlpvZFR5cGVBbnlbXV07XG5leHBvcnQgY2xhc3MgWm9kVHVwbGUgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgeyBzdGF0dXMsIGN0eCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTtcbiAgICAgICAgaWYgKGN0eC5wYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLmFycmF5KSB7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLmFycmF5LFxuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGN0eC5kYXRhLmxlbmd0aCA8IHRoaXMuX2RlZi5pdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS50b29fc21hbGwsXG4gICAgICAgICAgICAgICAgbWluaW11bTogdGhpcy5fZGVmLml0ZW1zLmxlbmd0aCxcbiAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgZXhhY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzdCA9IHRoaXMuX2RlZi5yZXN0O1xuICAgICAgICBpZiAoIXJlc3QgJiYgY3R4LmRhdGEubGVuZ3RoID4gdGhpcy5fZGVmLml0ZW1zLmxlbmd0aCkge1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLnRvb19iaWcsXG4gICAgICAgICAgICAgICAgbWF4aW11bTogdGhpcy5fZGVmLml0ZW1zLmxlbmd0aCxcbiAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgZXhhY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXRlbXMgPSBbLi4uY3R4LmRhdGFdXG4gICAgICAgICAgICAubWFwKChpdGVtLCBpdGVtSW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNjaGVtYSA9IHRoaXMuX2RlZi5pdGVtc1tpdGVtSW5kZXhdIHx8IHRoaXMuX2RlZi5yZXN0O1xuICAgICAgICAgICAgaWYgKCFzY2hlbWEpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICByZXR1cm4gc2NoZW1hLl9wYXJzZShuZXcgUGFyc2VJbnB1dExhenlQYXRoKGN0eCwgaXRlbSwgY3R4LnBhdGgsIGl0ZW1JbmRleCkpO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLmZpbHRlcigoeCkgPT4gISF4KTsgLy8gZmlsdGVyIG51bGxzXG4gICAgICAgIGlmIChjdHguY29tbW9uLmFzeW5jKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoaXRlbXMpLnRoZW4oKHJlc3VsdHMpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUGFyc2VTdGF0dXMubWVyZ2VBcnJheShzdGF0dXMsIHJlc3VsdHMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUGFyc2VTdGF0dXMubWVyZ2VBcnJheShzdGF0dXMsIGl0ZW1zKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgaXRlbXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYuaXRlbXM7XG4gICAgfVxuICAgIHJlc3QocmVzdCkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZFR1cGxlKHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIHJlc3QsXG4gICAgICAgIH0pO1xuICAgIH1cbn1cblpvZFR1cGxlLmNyZWF0ZSA9IChzY2hlbWFzLCBwYXJhbXMpID0+IHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoc2NoZW1hcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiWW91IG11c3QgcGFzcyBhbiBhcnJheSBvZiBzY2hlbWFzIHRvIHoudHVwbGUoWyAuLi4gXSlcIik7XG4gICAgfVxuICAgIHJldHVybiBuZXcgWm9kVHVwbGUoe1xuICAgICAgICBpdGVtczogc2NoZW1hcyxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RUdXBsZSxcbiAgICAgICAgcmVzdDogbnVsbCxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmV4cG9ydCBjbGFzcyBab2RSZWNvcmQgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBnZXQga2V5U2NoZW1hKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLmtleVR5cGU7XG4gICAgfVxuICAgIGdldCB2YWx1ZVNjaGVtYSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi52YWx1ZVR5cGU7XG4gICAgfVxuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCB7IHN0YXR1cywgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpO1xuICAgICAgICBpZiAoY3R4LnBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUub2JqZWN0KSB7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLm9iamVjdCxcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhaXJzID0gW107XG4gICAgICAgIGNvbnN0IGtleVR5cGUgPSB0aGlzLl9kZWYua2V5VHlwZTtcbiAgICAgICAgY29uc3QgdmFsdWVUeXBlID0gdGhpcy5fZGVmLnZhbHVlVHlwZTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gY3R4LmRhdGEpIHtcbiAgICAgICAgICAgIHBhaXJzLnB1c2goe1xuICAgICAgICAgICAgICAgIGtleToga2V5VHlwZS5fcGFyc2UobmV3IFBhcnNlSW5wdXRMYXp5UGF0aChjdHgsIGtleSwgY3R4LnBhdGgsIGtleSkpLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZVR5cGUuX3BhcnNlKG5ldyBQYXJzZUlucHV0TGF6eVBhdGgoY3R4LCBjdHguZGF0YVtrZXldLCBjdHgucGF0aCwga2V5KSksXG4gICAgICAgICAgICAgICAgYWx3YXlzU2V0OiBrZXkgaW4gY3R4LmRhdGEsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY3R4LmNvbW1vbi5hc3luYykge1xuICAgICAgICAgICAgcmV0dXJuIFBhcnNlU3RhdHVzLm1lcmdlT2JqZWN0QXN5bmMoc3RhdHVzLCBwYWlycyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUGFyc2VTdGF0dXMubWVyZ2VPYmplY3RTeW5jKHN0YXR1cywgcGFpcnMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBlbGVtZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLnZhbHVlVHlwZTtcbiAgICB9XG4gICAgc3RhdGljIGNyZWF0ZShmaXJzdCwgc2Vjb25kLCB0aGlyZCkge1xuICAgICAgICBpZiAoc2Vjb25kIGluc3RhbmNlb2YgWm9kVHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBab2RSZWNvcmQoe1xuICAgICAgICAgICAgICAgIGtleVR5cGU6IGZpcnN0LFxuICAgICAgICAgICAgICAgIHZhbHVlVHlwZTogc2Vjb25kLFxuICAgICAgICAgICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kUmVjb3JkLFxuICAgICAgICAgICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXModGhpcmQpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBab2RSZWNvcmQoe1xuICAgICAgICAgICAga2V5VHlwZTogWm9kU3RyaW5nLmNyZWF0ZSgpLFxuICAgICAgICAgICAgdmFsdWVUeXBlOiBmaXJzdCxcbiAgICAgICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kUmVjb3JkLFxuICAgICAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhzZWNvbmQpLFxuICAgICAgICB9KTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgWm9kTWFwIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgZ2V0IGtleVNjaGVtYSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5rZXlUeXBlO1xuICAgIH1cbiAgICBnZXQgdmFsdWVTY2hlbWEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYudmFsdWVUeXBlO1xuICAgIH1cbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgeyBzdGF0dXMsIGN0eCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTtcbiAgICAgICAgaWYgKGN0eC5wYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLm1hcCkge1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS5tYXAsXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBrZXlUeXBlID0gdGhpcy5fZGVmLmtleVR5cGU7XG4gICAgICAgIGNvbnN0IHZhbHVlVHlwZSA9IHRoaXMuX2RlZi52YWx1ZVR5cGU7XG4gICAgICAgIGNvbnN0IHBhaXJzID0gWy4uLmN0eC5kYXRhLmVudHJpZXMoKV0ubWFwKChba2V5LCB2YWx1ZV0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGtleToga2V5VHlwZS5fcGFyc2UobmV3IFBhcnNlSW5wdXRMYXp5UGF0aChjdHgsIGtleSwgY3R4LnBhdGgsIFtpbmRleCwgXCJrZXlcIl0pKSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWVUeXBlLl9wYXJzZShuZXcgUGFyc2VJbnB1dExhenlQYXRoKGN0eCwgdmFsdWUsIGN0eC5wYXRoLCBbaW5kZXgsIFwidmFsdWVcIl0pKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoY3R4LmNvbW1vbi5hc3luYykge1xuICAgICAgICAgICAgY29uc3QgZmluYWxNYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbihhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBwYWlyIG9mIHBhaXJzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGF3YWl0IHBhaXIua2V5O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHBhaXIudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGlmIChrZXkuc3RhdHVzID09PSBcImFib3J0ZWRcIiB8fCB2YWx1ZS5zdGF0dXMgPT09IFwiYWJvcnRlZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoa2V5LnN0YXR1cyA9PT0gXCJkaXJ0eVwiIHx8IHZhbHVlLnN0YXR1cyA9PT0gXCJkaXJ0eVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmaW5hbE1hcC5zZXQoa2V5LnZhbHVlLCB2YWx1ZS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB7IHN0YXR1czogc3RhdHVzLnZhbHVlLCB2YWx1ZTogZmluYWxNYXAgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZmluYWxNYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHBhaXIgb2YgcGFpcnMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSBwYWlyLmtleTtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHBhaXIudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKGtleS5zdGF0dXMgPT09IFwiYWJvcnRlZFwiIHx8IHZhbHVlLnN0YXR1cyA9PT0gXCJhYm9ydGVkXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChrZXkuc3RhdHVzID09PSBcImRpcnR5XCIgfHwgdmFsdWUuc3RhdHVzID09PSBcImRpcnR5XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZpbmFsTWFwLnNldChrZXkudmFsdWUsIHZhbHVlLnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IHN0YXR1czogc3RhdHVzLnZhbHVlLCB2YWx1ZTogZmluYWxNYXAgfTtcbiAgICAgICAgfVxuICAgIH1cbn1cblpvZE1hcC5jcmVhdGUgPSAoa2V5VHlwZSwgdmFsdWVUeXBlLCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZE1hcCh7XG4gICAgICAgIHZhbHVlVHlwZSxcbiAgICAgICAga2V5VHlwZSxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RNYXAsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5leHBvcnQgY2xhc3MgWm9kU2V0IGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHsgc3RhdHVzLCBjdHggfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhpbnB1dCk7XG4gICAgICAgIGlmIChjdHgucGFyc2VkVHlwZSAhPT0gWm9kUGFyc2VkVHlwZS5zZXQpIHtcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IFpvZFBhcnNlZFR5cGUuc2V0LFxuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGVmID0gdGhpcy5fZGVmO1xuICAgICAgICBpZiAoZGVmLm1pblNpemUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChjdHguZGF0YS5zaXplIDwgZGVmLm1pblNpemUudmFsdWUpIHtcbiAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLnRvb19zbWFsbCxcbiAgICAgICAgICAgICAgICAgICAgbWluaW11bTogZGVmLm1pblNpemUudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwic2V0XCIsXG4gICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgZXhhY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBkZWYubWluU2l6ZS5tZXNzYWdlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChkZWYubWF4U2l6ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGN0eC5kYXRhLnNpemUgPiBkZWYubWF4U2l6ZS52YWx1ZSkge1xuICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUudG9vX2JpZyxcbiAgICAgICAgICAgICAgICAgICAgbWF4aW11bTogZGVmLm1heFNpemUudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwic2V0XCIsXG4gICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgZXhhY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBkZWYubWF4U2l6ZS5tZXNzYWdlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZhbHVlVHlwZSA9IHRoaXMuX2RlZi52YWx1ZVR5cGU7XG4gICAgICAgIGZ1bmN0aW9uIGZpbmFsaXplU2V0KGVsZW1lbnRzKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWRTZXQgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5zdGF0dXMgPT09IFwiYWJvcnRlZFwiKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5zdGF0dXMgPT09IFwiZGlydHlcIilcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgcGFyc2VkU2V0LmFkZChlbGVtZW50LnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IHN0YXR1czogc3RhdHVzLnZhbHVlLCB2YWx1ZTogcGFyc2VkU2V0IH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSBbLi4uY3R4LmRhdGEudmFsdWVzKCldLm1hcCgoaXRlbSwgaSkgPT4gdmFsdWVUeXBlLl9wYXJzZShuZXcgUGFyc2VJbnB1dExhenlQYXRoKGN0eCwgaXRlbSwgY3R4LnBhdGgsIGkpKSk7XG4gICAgICAgIGlmIChjdHguY29tbW9uLmFzeW5jKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoZWxlbWVudHMpLnRoZW4oKGVsZW1lbnRzKSA9PiBmaW5hbGl6ZVNldChlbGVtZW50cykpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZpbmFsaXplU2V0KGVsZW1lbnRzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBtaW4obWluU2l6ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZFNldCh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBtaW5TaXplOiB7IHZhbHVlOiBtaW5TaXplLCBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkgfSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG1heChtYXhTaXplLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kU2V0KHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIG1heFNpemU6IHsgdmFsdWU6IG1heFNpemUsIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSB9LFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgc2l6ZShzaXplLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbihzaXplLCBtZXNzYWdlKS5tYXgoc2l6ZSwgbWVzc2FnZSk7XG4gICAgfVxuICAgIG5vbmVtcHR5KG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWluKDEsIG1lc3NhZ2UpO1xuICAgIH1cbn1cblpvZFNldC5jcmVhdGUgPSAodmFsdWVUeXBlLCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZFNldCh7XG4gICAgICAgIHZhbHVlVHlwZSxcbiAgICAgICAgbWluU2l6ZTogbnVsbCxcbiAgICAgICAgbWF4U2l6ZTogbnVsbCxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RTZXQsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5leHBvcnQgY2xhc3MgWm9kRnVuY3Rpb24gZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy52YWxpZGF0ZSA9IHRoaXMuaW1wbGVtZW50O1xuICAgIH1cbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgeyBjdHggfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhpbnB1dCk7XG4gICAgICAgIGlmIChjdHgucGFyc2VkVHlwZSAhPT0gWm9kUGFyc2VkVHlwZS5mdW5jdGlvbikge1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS5mdW5jdGlvbixcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIG1ha2VBcmdzSXNzdWUoYXJncywgZXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBtYWtlSXNzdWUoe1xuICAgICAgICAgICAgICAgIGRhdGE6IGFyZ3MsXG4gICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgZXJyb3JNYXBzOiBbY3R4LmNvbW1vbi5jb250ZXh0dWFsRXJyb3JNYXAsIGN0eC5zY2hlbWFFcnJvck1hcCwgZ2V0RXJyb3JNYXAoKSwgZGVmYXVsdEVycm9yTWFwXS5maWx0ZXIoKHgpID0+ICEheCksXG4gICAgICAgICAgICAgICAgaXNzdWVEYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX2FyZ3VtZW50cyxcbiAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzRXJyb3I6IGVycm9yLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBtYWtlUmV0dXJuc0lzc3VlKHJldHVybnMsIGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gbWFrZUlzc3VlKHtcbiAgICAgICAgICAgICAgICBkYXRhOiByZXR1cm5zLFxuICAgICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgICAgIGVycm9yTWFwczogW2N0eC5jb21tb24uY29udGV4dHVhbEVycm9yTWFwLCBjdHguc2NoZW1hRXJyb3JNYXAsIGdldEVycm9yTWFwKCksIGRlZmF1bHRFcnJvck1hcF0uZmlsdGVyKCh4KSA9PiAhIXgpLFxuICAgICAgICAgICAgICAgIGlzc3VlRGF0YToge1xuICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9yZXR1cm5fdHlwZSxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuVHlwZUVycm9yOiBlcnJvcixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFyYW1zID0geyBlcnJvck1hcDogY3R4LmNvbW1vbi5jb250ZXh0dWFsRXJyb3JNYXAgfTtcbiAgICAgICAgY29uc3QgZm4gPSBjdHguZGF0YTtcbiAgICAgICAgaWYgKHRoaXMuX2RlZi5yZXR1cm5zIGluc3RhbmNlb2YgWm9kUHJvbWlzZSkge1xuICAgICAgICAgICAgLy8gV291bGQgbG92ZSBhIHdheSB0byBhdm9pZCBkaXNhYmxpbmcgdGhpcyBydWxlLCBidXQgd2UgbmVlZFxuICAgICAgICAgICAgLy8gYW4gYWxpYXMgKHVzaW5nIGFuIGFycm93IGZ1bmN0aW9uIHdhcyB3aGF0IGNhdXNlZCAyNjUxKS5cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuICAgICAgICAgICAgY29uc3QgbWUgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIE9LKGFzeW5jIGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgWm9kRXJyb3IoW10pO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZEFyZ3MgPSBhd2FpdCBtZS5fZGVmLmFyZ3MucGFyc2VBc3luYyhhcmdzLCBwYXJhbXMpLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yLmFkZElzc3VlKG1ha2VBcmdzSXNzdWUoYXJncywgZSkpO1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBSZWZsZWN0LmFwcGx5KGZuLCB0aGlzLCBwYXJzZWRBcmdzKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWRSZXR1cm5zID0gYXdhaXQgbWUuX2RlZi5yZXR1cm5zLl9kZWYudHlwZVxuICAgICAgICAgICAgICAgICAgICAucGFyc2VBc3luYyhyZXN1bHQsIHBhcmFtcylcbiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yLmFkZElzc3VlKG1ha2VSZXR1cm5zSXNzdWUocmVzdWx0LCBlKSk7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZWRSZXR1cm5zO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBXb3VsZCBsb3ZlIGEgd2F5IHRvIGF2b2lkIGRpc2FibGluZyB0aGlzIHJ1bGUsIGJ1dCB3ZSBuZWVkXG4gICAgICAgICAgICAvLyBhbiBhbGlhcyAodXNpbmcgYW4gYXJyb3cgZnVuY3Rpb24gd2FzIHdoYXQgY2F1c2VkIDI2NTEpLlxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG4gICAgICAgICAgICBjb25zdCBtZSA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gT0soZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWRBcmdzID0gbWUuX2RlZi5hcmdzLnNhZmVQYXJzZShhcmdzLCBwYXJhbXMpO1xuICAgICAgICAgICAgICAgIGlmICghcGFyc2VkQXJncy5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBab2RFcnJvcihbbWFrZUFyZ3NJc3N1ZShhcmdzLCBwYXJzZWRBcmdzLmVycm9yKV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBSZWZsZWN0LmFwcGx5KGZuLCB0aGlzLCBwYXJzZWRBcmdzLmRhdGEpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZFJldHVybnMgPSBtZS5fZGVmLnJldHVybnMuc2FmZVBhcnNlKHJlc3VsdCwgcGFyYW1zKTtcbiAgICAgICAgICAgICAgICBpZiAoIXBhcnNlZFJldHVybnMuc3VjY2Vzcykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWm9kRXJyb3IoW21ha2VSZXR1cm5zSXNzdWUocmVzdWx0LCBwYXJzZWRSZXR1cm5zLmVycm9yKV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VkUmV0dXJucy5kYXRhO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcGFyYW1ldGVycygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5hcmdzO1xuICAgIH1cbiAgICByZXR1cm5UeXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLnJldHVybnM7XG4gICAgfVxuICAgIGFyZ3MoLi4uaXRlbXMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RGdW5jdGlvbih7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBhcmdzOiBab2RUdXBsZS5jcmVhdGUoaXRlbXMpLnJlc3QoWm9kVW5rbm93bi5jcmVhdGUoKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm5zKHJldHVyblR5cGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RGdW5jdGlvbih7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICByZXR1cm5zOiByZXR1cm5UeXBlLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgaW1wbGVtZW50KGZ1bmMpIHtcbiAgICAgICAgY29uc3QgdmFsaWRhdGVkRnVuYyA9IHRoaXMucGFyc2UoZnVuYyk7XG4gICAgICAgIHJldHVybiB2YWxpZGF0ZWRGdW5jO1xuICAgIH1cbiAgICBzdHJpY3RJbXBsZW1lbnQoZnVuYykge1xuICAgICAgICBjb25zdCB2YWxpZGF0ZWRGdW5jID0gdGhpcy5wYXJzZShmdW5jKTtcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRlZEZ1bmM7XG4gICAgfVxuICAgIHN0YXRpYyBjcmVhdGUoYXJncywgcmV0dXJucywgcGFyYW1zKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kRnVuY3Rpb24oe1xuICAgICAgICAgICAgYXJnczogKGFyZ3MgPyBhcmdzIDogWm9kVHVwbGUuY3JlYXRlKFtdKS5yZXN0KFpvZFVua25vd24uY3JlYXRlKCkpKSxcbiAgICAgICAgICAgIHJldHVybnM6IHJldHVybnMgfHwgWm9kVW5rbm93bi5jcmVhdGUoKSxcbiAgICAgICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kRnVuY3Rpb24sXG4gICAgICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBab2RMYXp5IGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgZ2V0IHNjaGVtYSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5nZXR0ZXIoKTtcbiAgICB9XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpO1xuICAgICAgICBjb25zdCBsYXp5U2NoZW1hID0gdGhpcy5fZGVmLmdldHRlcigpO1xuICAgICAgICByZXR1cm4gbGF6eVNjaGVtYS5fcGFyc2UoeyBkYXRhOiBjdHguZGF0YSwgcGF0aDogY3R4LnBhdGgsIHBhcmVudDogY3R4IH0pO1xuICAgIH1cbn1cblpvZExhenkuY3JlYXRlID0gKGdldHRlciwgcGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2RMYXp5KHtcbiAgICAgICAgZ2V0dGVyOiBnZXR0ZXIsXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kTGF6eSxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmV4cG9ydCBjbGFzcyBab2RMaXRlcmFsIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGlmIChpbnB1dC5kYXRhICE9PSB0aGlzLl9kZWYudmFsdWUpIHtcbiAgICAgICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0KTtcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHguZGF0YSxcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9saXRlcmFsLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiB0aGlzLl9kZWYudmFsdWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHN0YXR1czogXCJ2YWxpZFwiLCB2YWx1ZTogaW5wdXQuZGF0YSB9O1xuICAgIH1cbiAgICBnZXQgdmFsdWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYudmFsdWU7XG4gICAgfVxufVxuWm9kTGl0ZXJhbC5jcmVhdGUgPSAodmFsdWUsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kTGl0ZXJhbCh7XG4gICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RMaXRlcmFsLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuZnVuY3Rpb24gY3JlYXRlWm9kRW51bSh2YWx1ZXMsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgWm9kRW51bSh7XG4gICAgICAgIHZhbHVlcyxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RFbnVtLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59XG5leHBvcnQgY2xhc3MgWm9kRW51bSBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBpZiAodHlwZW9mIGlucHV0LmRhdGEgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0KTtcbiAgICAgICAgICAgIGNvbnN0IGV4cGVjdGVkVmFsdWVzID0gdGhpcy5fZGVmLnZhbHVlcztcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiB1dGlsLmpvaW5WYWx1ZXMoZXhwZWN0ZWRWYWx1ZXMpLFxuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZSxcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuX2NhY2hlKSB7XG4gICAgICAgICAgICB0aGlzLl9jYWNoZSA9IG5ldyBTZXQodGhpcy5fZGVmLnZhbHVlcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLl9jYWNoZS5oYXMoaW5wdXQuZGF0YSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0KTtcbiAgICAgICAgICAgIGNvbnN0IGV4cGVjdGVkVmFsdWVzID0gdGhpcy5fZGVmLnZhbHVlcztcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHguZGF0YSxcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9lbnVtX3ZhbHVlLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGV4cGVjdGVkVmFsdWVzLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gT0soaW5wdXQuZGF0YSk7XG4gICAgfVxuICAgIGdldCBvcHRpb25zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLnZhbHVlcztcbiAgICB9XG4gICAgZ2V0IGVudW0oKSB7XG4gICAgICAgIGNvbnN0IGVudW1WYWx1ZXMgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCB2YWwgb2YgdGhpcy5fZGVmLnZhbHVlcykge1xuICAgICAgICAgICAgZW51bVZhbHVlc1t2YWxdID0gdmFsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbnVtVmFsdWVzO1xuICAgIH1cbiAgICBnZXQgVmFsdWVzKCkge1xuICAgICAgICBjb25zdCBlbnVtVmFsdWVzID0ge307XG4gICAgICAgIGZvciAoY29uc3QgdmFsIG9mIHRoaXMuX2RlZi52YWx1ZXMpIHtcbiAgICAgICAgICAgIGVudW1WYWx1ZXNbdmFsXSA9IHZhbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZW51bVZhbHVlcztcbiAgICB9XG4gICAgZ2V0IEVudW0oKSB7XG4gICAgICAgIGNvbnN0IGVudW1WYWx1ZXMgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCB2YWwgb2YgdGhpcy5fZGVmLnZhbHVlcykge1xuICAgICAgICAgICAgZW51bVZhbHVlc1t2YWxdID0gdmFsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbnVtVmFsdWVzO1xuICAgIH1cbiAgICBleHRyYWN0KHZhbHVlcywgbmV3RGVmID0gdGhpcy5fZGVmKSB7XG4gICAgICAgIHJldHVybiBab2RFbnVtLmNyZWF0ZSh2YWx1ZXMsIHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIC4uLm5ld0RlZixcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGV4Y2x1ZGUodmFsdWVzLCBuZXdEZWYgPSB0aGlzLl9kZWYpIHtcbiAgICAgICAgcmV0dXJuIFpvZEVudW0uY3JlYXRlKHRoaXMub3B0aW9ucy5maWx0ZXIoKG9wdCkgPT4gIXZhbHVlcy5pbmNsdWRlcyhvcHQpKSwge1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgLi4ubmV3RGVmLFxuICAgICAgICB9KTtcbiAgICB9XG59XG5ab2RFbnVtLmNyZWF0ZSA9IGNyZWF0ZVpvZEVudW07XG5leHBvcnQgY2xhc3MgWm9kTmF0aXZlRW51bSBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCBuYXRpdmVFbnVtVmFsdWVzID0gdXRpbC5nZXRWYWxpZEVudW1WYWx1ZXModGhpcy5fZGVmLnZhbHVlcyk7XG4gICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0KTtcbiAgICAgICAgaWYgKGN0eC5wYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLnN0cmluZyAmJiBjdHgucGFyc2VkVHlwZSAhPT0gWm9kUGFyc2VkVHlwZS5udW1iZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4cGVjdGVkVmFsdWVzID0gdXRpbC5vYmplY3RWYWx1ZXMobmF0aXZlRW51bVZhbHVlcyk7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogdXRpbC5qb2luVmFsdWVzKGV4cGVjdGVkVmFsdWVzKSxcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLl9jYWNoZSkge1xuICAgICAgICAgICAgdGhpcy5fY2FjaGUgPSBuZXcgU2V0KHV0aWwuZ2V0VmFsaWRFbnVtVmFsdWVzKHRoaXMuX2RlZi52YWx1ZXMpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuX2NhY2hlLmhhcyhpbnB1dC5kYXRhKSkge1xuICAgICAgICAgICAgY29uc3QgZXhwZWN0ZWRWYWx1ZXMgPSB1dGlsLm9iamVjdFZhbHVlcyhuYXRpdmVFbnVtVmFsdWVzKTtcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHguZGF0YSxcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9lbnVtX3ZhbHVlLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGV4cGVjdGVkVmFsdWVzLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gT0soaW5wdXQuZGF0YSk7XG4gICAgfVxuICAgIGdldCBlbnVtKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLnZhbHVlcztcbiAgICB9XG59XG5ab2ROYXRpdmVFbnVtLmNyZWF0ZSA9ICh2YWx1ZXMsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kTmF0aXZlRW51bSh7XG4gICAgICAgIHZhbHVlczogdmFsdWVzLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE5hdGl2ZUVudW0sXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5leHBvcnQgY2xhc3MgWm9kUHJvbWlzZSBleHRlbmRzIFpvZFR5cGUge1xuICAgIHVud3JhcCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi50eXBlO1xuICAgIH1cbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgeyBjdHggfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhpbnB1dCk7XG4gICAgICAgIGlmIChjdHgucGFyc2VkVHlwZSAhPT0gWm9kUGFyc2VkVHlwZS5wcm9taXNlICYmIGN0eC5jb21tb24uYXN5bmMgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLnByb21pc2UsXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcm9taXNpZmllZCA9IGN0eC5wYXJzZWRUeXBlID09PSBab2RQYXJzZWRUeXBlLnByb21pc2UgPyBjdHguZGF0YSA6IFByb21pc2UucmVzb2x2ZShjdHguZGF0YSk7XG4gICAgICAgIHJldHVybiBPSyhwcm9taXNpZmllZC50aGVuKChkYXRhKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZGVmLnR5cGUucGFyc2VBc3luYyhkYXRhLCB7XG4gICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgZXJyb3JNYXA6IGN0eC5jb21tb24uY29udGV4dHVhbEVycm9yTWFwLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pKTtcbiAgICB9XG59XG5ab2RQcm9taXNlLmNyZWF0ZSA9IChzY2hlbWEsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kUHJvbWlzZSh7XG4gICAgICAgIHR5cGU6IHNjaGVtYSxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RQcm9taXNlLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuZXhwb3J0IGNsYXNzIFpvZEVmZmVjdHMgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBpbm5lclR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYuc2NoZW1hO1xuICAgIH1cbiAgICBzb3VyY2VUeXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLnNjaGVtYS5fZGVmLnR5cGVOYW1lID09PSBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kRWZmZWN0c1xuICAgICAgICAgICAgPyB0aGlzLl9kZWYuc2NoZW1hLnNvdXJjZVR5cGUoKVxuICAgICAgICAgICAgOiB0aGlzLl9kZWYuc2NoZW1hO1xuICAgIH1cbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgeyBzdGF0dXMsIGN0eCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTtcbiAgICAgICAgY29uc3QgZWZmZWN0ID0gdGhpcy5fZGVmLmVmZmVjdCB8fCBudWxsO1xuICAgICAgICBjb25zdCBjaGVja0N0eCA9IHtcbiAgICAgICAgICAgIGFkZElzc3VlOiAoYXJnKSA9PiB7XG4gICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCBhcmcpO1xuICAgICAgICAgICAgICAgIGlmIChhcmcuZmF0YWwpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmFib3J0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2V0IHBhdGgoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGN0eC5wYXRoO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgY2hlY2tDdHguYWRkSXNzdWUgPSBjaGVja0N0eC5hZGRJc3N1ZS5iaW5kKGNoZWNrQ3R4KTtcbiAgICAgICAgaWYgKGVmZmVjdC50eXBlID09PSBcInByZXByb2Nlc3NcIikge1xuICAgICAgICAgICAgY29uc3QgcHJvY2Vzc2VkID0gZWZmZWN0LnRyYW5zZm9ybShjdHguZGF0YSwgY2hlY2tDdHgpO1xuICAgICAgICAgICAgaWYgKGN0eC5jb21tb24uYXN5bmMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHByb2Nlc3NlZCkudGhlbihhc3luYyAocHJvY2Vzc2VkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMudmFsdWUgPT09IFwiYWJvcnRlZFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuX2RlZi5zY2hlbWEuX3BhcnNlQXN5bmMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogcHJvY2Vzc2VkLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IGN0eCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSBcImFib3J0ZWRcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gXCJkaXJ0eVwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERJUlRZKHJlc3VsdC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMudmFsdWUgPT09IFwiZGlydHlcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBESVJUWShyZXN1bHQudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXR1cy52YWx1ZSA9PT0gXCJhYm9ydGVkXCIpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX2RlZi5zY2hlbWEuX3BhcnNlU3luYyh7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IHByb2Nlc3NlZCxcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudDogY3R4LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSBcImFib3J0ZWRcIilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IFwiZGlydHlcIilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERJUlRZKHJlc3VsdC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXR1cy52YWx1ZSA9PT0gXCJkaXJ0eVwiKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gRElSVFkocmVzdWx0LnZhbHVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChlZmZlY3QudHlwZSA9PT0gXCJyZWZpbmVtZW50XCIpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4ZWN1dGVSZWZpbmVtZW50ID0gKGFjYykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGVmZmVjdC5yZWZpbmVtZW50KGFjYywgY2hlY2tDdHgpO1xuICAgICAgICAgICAgICAgIGlmIChjdHguY29tbW9uLmFzeW5jKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQXN5bmMgcmVmaW5lbWVudCBlbmNvdW50ZXJlZCBkdXJpbmcgc3luY2hyb25vdXMgcGFyc2Ugb3BlcmF0aW9uLiBVc2UgLnBhcnNlQXN5bmMgaW5zdGVhZC5cIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKGN0eC5jb21tb24uYXN5bmMgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5uZXIgPSB0aGlzLl9kZWYuc2NoZW1hLl9wYXJzZVN5bmMoe1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiBjdHguZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudDogY3R4LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmIChpbm5lci5zdGF0dXMgPT09IFwiYWJvcnRlZFwiKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgICAgICAgICBpZiAoaW5uZXIuc3RhdHVzID09PSBcImRpcnR5XCIpXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIC8vIHJldHVybiB2YWx1ZSBpcyBpZ25vcmVkXG4gICAgICAgICAgICAgICAgZXhlY3V0ZVJlZmluZW1lbnQoaW5uZXIudmFsdWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHN0YXR1czogc3RhdHVzLnZhbHVlLCB2YWx1ZTogaW5uZXIudmFsdWUgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZWYuc2NoZW1hLl9wYXJzZUFzeW5jKHsgZGF0YTogY3R4LmRhdGEsIHBhdGg6IGN0eC5wYXRoLCBwYXJlbnQ6IGN0eCB9KS50aGVuKChpbm5lcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5uZXIuc3RhdHVzID09PSBcImFib3J0ZWRcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5uZXIuc3RhdHVzID09PSBcImRpcnR5XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV4ZWN1dGVSZWZpbmVtZW50KGlubmVyLnZhbHVlKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHN0YXR1czogc3RhdHVzLnZhbHVlLCB2YWx1ZTogaW5uZXIudmFsdWUgfTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVmZmVjdC50eXBlID09PSBcInRyYW5zZm9ybVwiKSB7XG4gICAgICAgICAgICBpZiAoY3R4LmNvbW1vbi5hc3luYyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBiYXNlID0gdGhpcy5fZGVmLnNjaGVtYS5fcGFyc2VTeW5jKHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogY3R4LmRhdGEsXG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IGN0eCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoIWlzVmFsaWQoYmFzZSkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGVmZmVjdC50cmFuc2Zvcm0oYmFzZS52YWx1ZSwgY2hlY2tDdHgpO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQXN5bmNocm9ub3VzIHRyYW5zZm9ybSBlbmNvdW50ZXJlZCBkdXJpbmcgc3luY2hyb25vdXMgcGFyc2Ugb3BlcmF0aW9uLiBVc2UgLnBhcnNlQXN5bmMgaW5zdGVhZC5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiBzdGF0dXMudmFsdWUsIHZhbHVlOiByZXN1bHQgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZWYuc2NoZW1hLl9wYXJzZUFzeW5jKHsgZGF0YTogY3R4LmRhdGEsIHBhdGg6IGN0eC5wYXRoLCBwYXJlbnQ6IGN0eCB9KS50aGVuKChiYXNlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNWYWxpZChiYXNlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGVmZmVjdC50cmFuc2Zvcm0oYmFzZS52YWx1ZSwgY2hlY2tDdHgpKS50aGVuKChyZXN1bHQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHN0YXR1cy52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiByZXN1bHQsXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB1dGlsLmFzc2VydE5ldmVyKGVmZmVjdCk7XG4gICAgfVxufVxuWm9kRWZmZWN0cy5jcmVhdGUgPSAoc2NoZW1hLCBlZmZlY3QsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kRWZmZWN0cyh7XG4gICAgICAgIHNjaGVtYSxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RFZmZlY3RzLFxuICAgICAgICBlZmZlY3QsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5ab2RFZmZlY3RzLmNyZWF0ZVdpdGhQcmVwcm9jZXNzID0gKHByZXByb2Nlc3MsIHNjaGVtYSwgcGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2RFZmZlY3RzKHtcbiAgICAgICAgc2NoZW1hLFxuICAgICAgICBlZmZlY3Q6IHsgdHlwZTogXCJwcmVwcm9jZXNzXCIsIHRyYW5zZm9ybTogcHJlcHJvY2VzcyB9LFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEVmZmVjdHMsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5leHBvcnQgeyBab2RFZmZlY3RzIGFzIFpvZFRyYW5zZm9ybWVyIH07XG5leHBvcnQgY2xhc3MgWm9kT3B0aW9uYWwgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgcGFyc2VkVHlwZSA9IHRoaXMuX2dldFR5cGUoaW5wdXQpO1xuICAgICAgICBpZiAocGFyc2VkVHlwZSA9PT0gWm9kUGFyc2VkVHlwZS51bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBPSyh1bmRlZmluZWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYuaW5uZXJUeXBlLl9wYXJzZShpbnB1dCk7XG4gICAgfVxuICAgIHVud3JhcCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5pbm5lclR5cGU7XG4gICAgfVxufVxuWm9kT3B0aW9uYWwuY3JlYXRlID0gKHR5cGUsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kT3B0aW9uYWwoe1xuICAgICAgICBpbm5lclR5cGU6IHR5cGUsXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kT3B0aW9uYWwsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5leHBvcnQgY2xhc3MgWm9kTnVsbGFibGUgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgcGFyc2VkVHlwZSA9IHRoaXMuX2dldFR5cGUoaW5wdXQpO1xuICAgICAgICBpZiAocGFyc2VkVHlwZSA9PT0gWm9kUGFyc2VkVHlwZS5udWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gT0sobnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5pbm5lclR5cGUuX3BhcnNlKGlucHV0KTtcbiAgICB9XG4gICAgdW53cmFwKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLmlubmVyVHlwZTtcbiAgICB9XG59XG5ab2ROdWxsYWJsZS5jcmVhdGUgPSAodHlwZSwgcGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2ROdWxsYWJsZSh7XG4gICAgICAgIGlubmVyVHlwZTogdHlwZSxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2ROdWxsYWJsZSxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmV4cG9ydCBjbGFzcyBab2REZWZhdWx0IGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpO1xuICAgICAgICBsZXQgZGF0YSA9IGN0eC5kYXRhO1xuICAgICAgICBpZiAoY3R4LnBhcnNlZFR5cGUgPT09IFpvZFBhcnNlZFR5cGUudW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBkYXRhID0gdGhpcy5fZGVmLmRlZmF1bHRWYWx1ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYuaW5uZXJUeXBlLl9wYXJzZSh7XG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICBwYXJlbnQ6IGN0eCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJlbW92ZURlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYuaW5uZXJUeXBlO1xuICAgIH1cbn1cblpvZERlZmF1bHQuY3JlYXRlID0gKHR5cGUsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kRGVmYXVsdCh7XG4gICAgICAgIGlubmVyVHlwZTogdHlwZSxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2REZWZhdWx0LFxuICAgICAgICBkZWZhdWx0VmFsdWU6IHR5cGVvZiBwYXJhbXMuZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiID8gcGFyYW1zLmRlZmF1bHQgOiAoKSA9PiBwYXJhbXMuZGVmYXVsdCxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmV4cG9ydCBjbGFzcyBab2RDYXRjaCBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTtcbiAgICAgICAgLy8gbmV3Q3R4IGlzIHVzZWQgdG8gbm90IGNvbGxlY3QgaXNzdWVzIGZyb20gaW5uZXIgdHlwZXMgaW4gY3R4XG4gICAgICAgIGNvbnN0IG5ld0N0eCA9IHtcbiAgICAgICAgICAgIC4uLmN0eCxcbiAgICAgICAgICAgIGNvbW1vbjoge1xuICAgICAgICAgICAgICAgIC4uLmN0eC5jb21tb24sXG4gICAgICAgICAgICAgICAgaXNzdWVzOiBbXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX2RlZi5pbm5lclR5cGUuX3BhcnNlKHtcbiAgICAgICAgICAgIGRhdGE6IG5ld0N0eC5kYXRhLFxuICAgICAgICAgICAgcGF0aDogbmV3Q3R4LnBhdGgsXG4gICAgICAgICAgICBwYXJlbnQ6IHtcbiAgICAgICAgICAgICAgICAuLi5uZXdDdHgsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGlzQXN5bmMocmVzdWx0KSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IFwidmFsaWRcIixcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHJlc3VsdC5zdGF0dXMgPT09IFwidmFsaWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPyByZXN1bHQudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgIDogdGhpcy5fZGVmLmNhdGNoVmFsdWUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldCBlcnJvcigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBab2RFcnJvcihuZXdDdHguY29tbW9uLmlzc3Vlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dDogbmV3Q3R4LmRhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHN0YXR1czogXCJ2YWxpZFwiLFxuICAgICAgICAgICAgICAgIHZhbHVlOiByZXN1bHQuc3RhdHVzID09PSBcInZhbGlkXCJcbiAgICAgICAgICAgICAgICAgICAgPyByZXN1bHQudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgOiB0aGlzLl9kZWYuY2F0Y2hWYWx1ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBnZXQgZXJyb3IoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBab2RFcnJvcihuZXdDdHguY29tbW9uLmlzc3Vlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IG5ld0N0eC5kYXRhLFxuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVtb3ZlQ2F0Y2goKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYuaW5uZXJUeXBlO1xuICAgIH1cbn1cblpvZENhdGNoLmNyZWF0ZSA9ICh0eXBlLCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZENhdGNoKHtcbiAgICAgICAgaW5uZXJUeXBlOiB0eXBlLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZENhdGNoLFxuICAgICAgICBjYXRjaFZhbHVlOiB0eXBlb2YgcGFyYW1zLmNhdGNoID09PSBcImZ1bmN0aW9uXCIgPyBwYXJhbXMuY2F0Y2ggOiAoKSA9PiBwYXJhbXMuY2F0Y2gsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5leHBvcnQgY2xhc3MgWm9kTmFOIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFR5cGUgPSB0aGlzLl9nZXRUeXBlKGlucHV0KTtcbiAgICAgICAgaWYgKHBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUubmFuKSB7XG4gICAgICAgICAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLm5hbixcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHN0YXR1czogXCJ2YWxpZFwiLCB2YWx1ZTogaW5wdXQuZGF0YSB9O1xuICAgIH1cbn1cblpvZE5hTi5jcmVhdGUgPSAocGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2ROYU4oe1xuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE5hTixcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmV4cG9ydCBjb25zdCBCUkFORCA9IFN5bWJvbChcInpvZF9icmFuZFwiKTtcbmV4cG9ydCBjbGFzcyBab2RCcmFuZGVkIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpO1xuICAgICAgICBjb25zdCBkYXRhID0gY3R4LmRhdGE7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYudHlwZS5fcGFyc2Uoe1xuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgcGFyZW50OiBjdHgsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB1bndyYXAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYudHlwZTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgWm9kUGlwZWxpbmUgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgeyBzdGF0dXMsIGN0eCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTtcbiAgICAgICAgaWYgKGN0eC5jb21tb24uYXN5bmMpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZUFzeW5jID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluUmVzdWx0ID0gYXdhaXQgdGhpcy5fZGVmLmluLl9wYXJzZUFzeW5jKHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogY3R4LmRhdGEsXG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IGN0eCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoaW5SZXN1bHQuc3RhdHVzID09PSBcImFib3J0ZWRcIilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgICAgICAgICAgaWYgKGluUmVzdWx0LnN0YXR1cyA9PT0gXCJkaXJ0eVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gRElSVFkoaW5SZXN1bHQudmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5vdXQuX3BhcnNlQXN5bmMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogaW5SZXN1bHQudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiBjdHgucGF0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudDogY3R4LFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUFzeW5jKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBpblJlc3VsdCA9IHRoaXMuX2RlZi5pbi5fcGFyc2VTeW5jKHtcbiAgICAgICAgICAgICAgICBkYXRhOiBjdHguZGF0YSxcbiAgICAgICAgICAgICAgICBwYXRoOiBjdHgucGF0aCxcbiAgICAgICAgICAgICAgICBwYXJlbnQ6IGN0eCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGluUmVzdWx0LnN0YXR1cyA9PT0gXCJhYm9ydGVkXCIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgICAgICBpZiAoaW5SZXN1bHQuc3RhdHVzID09PSBcImRpcnR5XCIpIHtcbiAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IFwiZGlydHlcIixcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGluUmVzdWx0LnZhbHVlLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZGVmLm91dC5fcGFyc2VTeW5jKHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogaW5SZXN1bHQudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IGN0eCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgY3JlYXRlKGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RQaXBlbGluZSh7XG4gICAgICAgICAgICBpbjogYSxcbiAgICAgICAgICAgIG91dDogYixcbiAgICAgICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kUGlwZWxpbmUsXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBab2RSZWFkb25seSBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9kZWYuaW5uZXJUeXBlLl9wYXJzZShpbnB1dCk7XG4gICAgICAgIGNvbnN0IGZyZWV6ZSA9IChkYXRhKSA9PiB7XG4gICAgICAgICAgICBpZiAoaXNWYWxpZChkYXRhKSkge1xuICAgICAgICAgICAgICAgIGRhdGEudmFsdWUgPSBPYmplY3QuZnJlZXplKGRhdGEudmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBpc0FzeW5jKHJlc3VsdCkgPyByZXN1bHQudGhlbigoZGF0YSkgPT4gZnJlZXplKGRhdGEpKSA6IGZyZWV6ZShyZXN1bHQpO1xuICAgIH1cbiAgICB1bndyYXAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYuaW5uZXJUeXBlO1xuICAgIH1cbn1cblpvZFJlYWRvbmx5LmNyZWF0ZSA9ICh0eXBlLCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZFJlYWRvbmx5KHtcbiAgICAgICAgaW5uZXJUeXBlOiB0eXBlLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZFJlYWRvbmx5LFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8vLy8vLy8vLyAgICAgICAgICAgICAgICAgICAgLy8vLy8vLy8vL1xuLy8vLy8vLy8vLyAgICAgIHouY3VzdG9tICAgICAgLy8vLy8vLy8vL1xuLy8vLy8vLy8vLyAgICAgICAgICAgICAgICAgICAgLy8vLy8vLy8vL1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuZnVuY3Rpb24gY2xlYW5QYXJhbXMocGFyYW1zLCBkYXRhKSB7XG4gICAgY29uc3QgcCA9IHR5cGVvZiBwYXJhbXMgPT09IFwiZnVuY3Rpb25cIiA/IHBhcmFtcyhkYXRhKSA6IHR5cGVvZiBwYXJhbXMgPT09IFwic3RyaW5nXCIgPyB7IG1lc3NhZ2U6IHBhcmFtcyB9IDogcGFyYW1zO1xuICAgIGNvbnN0IHAyID0gdHlwZW9mIHAgPT09IFwic3RyaW5nXCIgPyB7IG1lc3NhZ2U6IHAgfSA6IHA7XG4gICAgcmV0dXJuIHAyO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGN1c3RvbShjaGVjaywgX3BhcmFtcyA9IHt9LCBcbi8qKlxuICogQGRlcHJlY2F0ZWRcbiAqXG4gKiBQYXNzIGBmYXRhbGAgaW50byB0aGUgcGFyYW1zIG9iamVjdCBpbnN0ZWFkOlxuICpcbiAqIGBgYHRzXG4gKiB6LnN0cmluZygpLmN1c3RvbSgodmFsKSA9PiB2YWwubGVuZ3RoID4gNSwgeyBmYXRhbDogZmFsc2UgfSlcbiAqIGBgYFxuICpcbiAqL1xuZmF0YWwpIHtcbiAgICBpZiAoY2hlY2spXG4gICAgICAgIHJldHVybiBab2RBbnkuY3JlYXRlKCkuc3VwZXJSZWZpbmUoKGRhdGEsIGN0eCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgciA9IGNoZWNrKGRhdGEpO1xuICAgICAgICAgICAgaWYgKHIgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHIudGhlbigocikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IGNsZWFuUGFyYW1zKF9wYXJhbXMsIGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX2ZhdGFsID0gcGFyYW1zLmZhdGFsID8/IGZhdGFsID8/IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdHguYWRkSXNzdWUoeyBjb2RlOiBcImN1c3RvbVwiLCAuLi5wYXJhbXMsIGZhdGFsOiBfZmF0YWwgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IGNsZWFuUGFyYW1zKF9wYXJhbXMsIGRhdGEpO1xuICAgICAgICAgICAgICAgIGNvbnN0IF9mYXRhbCA9IHBhcmFtcy5mYXRhbCA/PyBmYXRhbCA/PyB0cnVlO1xuICAgICAgICAgICAgICAgIGN0eC5hZGRJc3N1ZSh7IGNvZGU6IFwiY3VzdG9tXCIsIC4uLnBhcmFtcywgZmF0YWw6IF9mYXRhbCB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSk7XG4gICAgcmV0dXJuIFpvZEFueS5jcmVhdGUoKTtcbn1cbmV4cG9ydCB7IFpvZFR5cGUgYXMgU2NoZW1hLCBab2RUeXBlIGFzIFpvZFNjaGVtYSB9O1xuZXhwb3J0IGNvbnN0IGxhdGUgPSB7XG4gICAgb2JqZWN0OiBab2RPYmplY3QubGF6eWNyZWF0ZSxcbn07XG5leHBvcnQgdmFyIFpvZEZpcnN0UGFydHlUeXBlS2luZDtcbihmdW5jdGlvbiAoWm9kRmlyc3RQYXJ0eVR5cGVLaW5kKSB7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kU3RyaW5nXCJdID0gXCJab2RTdHJpbmdcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2ROdW1iZXJcIl0gPSBcIlpvZE51bWJlclwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZE5hTlwiXSA9IFwiWm9kTmFOXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kQmlnSW50XCJdID0gXCJab2RCaWdJbnRcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RCb29sZWFuXCJdID0gXCJab2RCb29sZWFuXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kRGF0ZVwiXSA9IFwiWm9kRGF0ZVwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZFN5bWJvbFwiXSA9IFwiWm9kU3ltYm9sXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kVW5kZWZpbmVkXCJdID0gXCJab2RVbmRlZmluZWRcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2ROdWxsXCJdID0gXCJab2ROdWxsXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kQW55XCJdID0gXCJab2RBbnlcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RVbmtub3duXCJdID0gXCJab2RVbmtub3duXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kTmV2ZXJcIl0gPSBcIlpvZE5ldmVyXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kVm9pZFwiXSA9IFwiWm9kVm9pZFwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZEFycmF5XCJdID0gXCJab2RBcnJheVwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZE9iamVjdFwiXSA9IFwiWm9kT2JqZWN0XCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kVW5pb25cIl0gPSBcIlpvZFVuaW9uXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kRGlzY3JpbWluYXRlZFVuaW9uXCJdID0gXCJab2REaXNjcmltaW5hdGVkVW5pb25cIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RJbnRlcnNlY3Rpb25cIl0gPSBcIlpvZEludGVyc2VjdGlvblwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZFR1cGxlXCJdID0gXCJab2RUdXBsZVwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZFJlY29yZFwiXSA9IFwiWm9kUmVjb3JkXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kTWFwXCJdID0gXCJab2RNYXBcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RTZXRcIl0gPSBcIlpvZFNldFwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZEZ1bmN0aW9uXCJdID0gXCJab2RGdW5jdGlvblwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZExhenlcIl0gPSBcIlpvZExhenlcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RMaXRlcmFsXCJdID0gXCJab2RMaXRlcmFsXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kRW51bVwiXSA9IFwiWm9kRW51bVwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZEVmZmVjdHNcIl0gPSBcIlpvZEVmZmVjdHNcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2ROYXRpdmVFbnVtXCJdID0gXCJab2ROYXRpdmVFbnVtXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kT3B0aW9uYWxcIl0gPSBcIlpvZE9wdGlvbmFsXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kTnVsbGFibGVcIl0gPSBcIlpvZE51bGxhYmxlXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kRGVmYXVsdFwiXSA9IFwiWm9kRGVmYXVsdFwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZENhdGNoXCJdID0gXCJab2RDYXRjaFwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZFByb21pc2VcIl0gPSBcIlpvZFByb21pc2VcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RCcmFuZGVkXCJdID0gXCJab2RCcmFuZGVkXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kUGlwZWxpbmVcIl0gPSBcIlpvZFBpcGVsaW5lXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kUmVhZG9ubHlcIl0gPSBcIlpvZFJlYWRvbmx5XCI7XG59KShab2RGaXJzdFBhcnR5VHlwZUtpbmQgfHwgKFpvZEZpcnN0UGFydHlUeXBlS2luZCA9IHt9KSk7XG4vLyByZXF1aXJlcyBUUyA0LjQrXG5jbGFzcyBDbGFzcyB7XG4gICAgY29uc3RydWN0b3IoLi4uXykgeyB9XG59XG5jb25zdCBpbnN0YW5jZU9mVHlwZSA9IChcbi8vIGNvbnN0IGluc3RhbmNlT2ZUeXBlID0gPFQgZXh0ZW5kcyBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnk+KFxuY2xzLCBwYXJhbXMgPSB7XG4gICAgbWVzc2FnZTogYElucHV0IG5vdCBpbnN0YW5jZSBvZiAke2Nscy5uYW1lfWAsXG59KSA9PiBjdXN0b20oKGRhdGEpID0+IGRhdGEgaW5zdGFuY2VvZiBjbHMsIHBhcmFtcyk7XG5jb25zdCBzdHJpbmdUeXBlID0gWm9kU3RyaW5nLmNyZWF0ZTtcbmNvbnN0IG51bWJlclR5cGUgPSBab2ROdW1iZXIuY3JlYXRlO1xuY29uc3QgbmFuVHlwZSA9IFpvZE5hTi5jcmVhdGU7XG5jb25zdCBiaWdJbnRUeXBlID0gWm9kQmlnSW50LmNyZWF0ZTtcbmNvbnN0IGJvb2xlYW5UeXBlID0gWm9kQm9vbGVhbi5jcmVhdGU7XG5jb25zdCBkYXRlVHlwZSA9IFpvZERhdGUuY3JlYXRlO1xuY29uc3Qgc3ltYm9sVHlwZSA9IFpvZFN5bWJvbC5jcmVhdGU7XG5jb25zdCB1bmRlZmluZWRUeXBlID0gWm9kVW5kZWZpbmVkLmNyZWF0ZTtcbmNvbnN0IG51bGxUeXBlID0gWm9kTnVsbC5jcmVhdGU7XG5jb25zdCBhbnlUeXBlID0gWm9kQW55LmNyZWF0ZTtcbmNvbnN0IHVua25vd25UeXBlID0gWm9kVW5rbm93bi5jcmVhdGU7XG5jb25zdCBuZXZlclR5cGUgPSBab2ROZXZlci5jcmVhdGU7XG5jb25zdCB2b2lkVHlwZSA9IFpvZFZvaWQuY3JlYXRlO1xuY29uc3QgYXJyYXlUeXBlID0gWm9kQXJyYXkuY3JlYXRlO1xuY29uc3Qgb2JqZWN0VHlwZSA9IFpvZE9iamVjdC5jcmVhdGU7XG5jb25zdCBzdHJpY3RPYmplY3RUeXBlID0gWm9kT2JqZWN0LnN0cmljdENyZWF0ZTtcbmNvbnN0IHVuaW9uVHlwZSA9IFpvZFVuaW9uLmNyZWF0ZTtcbmNvbnN0IGRpc2NyaW1pbmF0ZWRVbmlvblR5cGUgPSBab2REaXNjcmltaW5hdGVkVW5pb24uY3JlYXRlO1xuY29uc3QgaW50ZXJzZWN0aW9uVHlwZSA9IFpvZEludGVyc2VjdGlvbi5jcmVhdGU7XG5jb25zdCB0dXBsZVR5cGUgPSBab2RUdXBsZS5jcmVhdGU7XG5jb25zdCByZWNvcmRUeXBlID0gWm9kUmVjb3JkLmNyZWF0ZTtcbmNvbnN0IG1hcFR5cGUgPSBab2RNYXAuY3JlYXRlO1xuY29uc3Qgc2V0VHlwZSA9IFpvZFNldC5jcmVhdGU7XG5jb25zdCBmdW5jdGlvblR5cGUgPSBab2RGdW5jdGlvbi5jcmVhdGU7XG5jb25zdCBsYXp5VHlwZSA9IFpvZExhenkuY3JlYXRlO1xuY29uc3QgbGl0ZXJhbFR5cGUgPSBab2RMaXRlcmFsLmNyZWF0ZTtcbmNvbnN0IGVudW1UeXBlID0gWm9kRW51bS5jcmVhdGU7XG5jb25zdCBuYXRpdmVFbnVtVHlwZSA9IFpvZE5hdGl2ZUVudW0uY3JlYXRlO1xuY29uc3QgcHJvbWlzZVR5cGUgPSBab2RQcm9taXNlLmNyZWF0ZTtcbmNvbnN0IGVmZmVjdHNUeXBlID0gWm9kRWZmZWN0cy5jcmVhdGU7XG5jb25zdCBvcHRpb25hbFR5cGUgPSBab2RPcHRpb25hbC5jcmVhdGU7XG5jb25zdCBudWxsYWJsZVR5cGUgPSBab2ROdWxsYWJsZS5jcmVhdGU7XG5jb25zdCBwcmVwcm9jZXNzVHlwZSA9IFpvZEVmZmVjdHMuY3JlYXRlV2l0aFByZXByb2Nlc3M7XG5jb25zdCBwaXBlbGluZVR5cGUgPSBab2RQaXBlbGluZS5jcmVhdGU7XG5jb25zdCBvc3RyaW5nID0gKCkgPT4gc3RyaW5nVHlwZSgpLm9wdGlvbmFsKCk7XG5jb25zdCBvbnVtYmVyID0gKCkgPT4gbnVtYmVyVHlwZSgpLm9wdGlvbmFsKCk7XG5jb25zdCBvYm9vbGVhbiA9ICgpID0+IGJvb2xlYW5UeXBlKCkub3B0aW9uYWwoKTtcbmV4cG9ydCBjb25zdCBjb2VyY2UgPSB7XG4gICAgc3RyaW5nOiAoKGFyZykgPT4gWm9kU3RyaW5nLmNyZWF0ZSh7IC4uLmFyZywgY29lcmNlOiB0cnVlIH0pKSxcbiAgICBudW1iZXI6ICgoYXJnKSA9PiBab2ROdW1iZXIuY3JlYXRlKHsgLi4uYXJnLCBjb2VyY2U6IHRydWUgfSkpLFxuICAgIGJvb2xlYW46ICgoYXJnKSA9PiBab2RCb29sZWFuLmNyZWF0ZSh7XG4gICAgICAgIC4uLmFyZyxcbiAgICAgICAgY29lcmNlOiB0cnVlLFxuICAgIH0pKSxcbiAgICBiaWdpbnQ6ICgoYXJnKSA9PiBab2RCaWdJbnQuY3JlYXRlKHsgLi4uYXJnLCBjb2VyY2U6IHRydWUgfSkpLFxuICAgIGRhdGU6ICgoYXJnKSA9PiBab2REYXRlLmNyZWF0ZSh7IC4uLmFyZywgY29lcmNlOiB0cnVlIH0pKSxcbn07XG5leHBvcnQgeyBhbnlUeXBlIGFzIGFueSwgYXJyYXlUeXBlIGFzIGFycmF5LCBiaWdJbnRUeXBlIGFzIGJpZ2ludCwgYm9vbGVhblR5cGUgYXMgYm9vbGVhbiwgZGF0ZVR5cGUgYXMgZGF0ZSwgZGlzY3JpbWluYXRlZFVuaW9uVHlwZSBhcyBkaXNjcmltaW5hdGVkVW5pb24sIGVmZmVjdHNUeXBlIGFzIGVmZmVjdCwgZW51bVR5cGUgYXMgZW51bSwgZnVuY3Rpb25UeXBlIGFzIGZ1bmN0aW9uLCBpbnN0YW5jZU9mVHlwZSBhcyBpbnN0YW5jZW9mLCBpbnRlcnNlY3Rpb25UeXBlIGFzIGludGVyc2VjdGlvbiwgbGF6eVR5cGUgYXMgbGF6eSwgbGl0ZXJhbFR5cGUgYXMgbGl0ZXJhbCwgbWFwVHlwZSBhcyBtYXAsIG5hblR5cGUgYXMgbmFuLCBuYXRpdmVFbnVtVHlwZSBhcyBuYXRpdmVFbnVtLCBuZXZlclR5cGUgYXMgbmV2ZXIsIG51bGxUeXBlIGFzIG51bGwsIG51bGxhYmxlVHlwZSBhcyBudWxsYWJsZSwgbnVtYmVyVHlwZSBhcyBudW1iZXIsIG9iamVjdFR5cGUgYXMgb2JqZWN0LCBvYm9vbGVhbiwgb251bWJlciwgb3B0aW9uYWxUeXBlIGFzIG9wdGlvbmFsLCBvc3RyaW5nLCBwaXBlbGluZVR5cGUgYXMgcGlwZWxpbmUsIHByZXByb2Nlc3NUeXBlIGFzIHByZXByb2Nlc3MsIHByb21pc2VUeXBlIGFzIHByb21pc2UsIHJlY29yZFR5cGUgYXMgcmVjb3JkLCBzZXRUeXBlIGFzIHNldCwgc3RyaWN0T2JqZWN0VHlwZSBhcyBzdHJpY3RPYmplY3QsIHN0cmluZ1R5cGUgYXMgc3RyaW5nLCBzeW1ib2xUeXBlIGFzIHN5bWJvbCwgZWZmZWN0c1R5cGUgYXMgdHJhbnNmb3JtZXIsIHR1cGxlVHlwZSBhcyB0dXBsZSwgdW5kZWZpbmVkVHlwZSBhcyB1bmRlZmluZWQsIHVuaW9uVHlwZSBhcyB1bmlvbiwgdW5rbm93blR5cGUgYXMgdW5rbm93biwgdm9pZFR5cGUgYXMgdm9pZCwgfTtcbmV4cG9ydCBjb25zdCBORVZFUiA9IElOVkFMSUQ7XG4iLCJleHBvcnQgZnVuY3Rpb24gcGFyc2VBbnlEZWYoKSB7XG4gICAgcmV0dXJuIHt9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YW55Lm1qcy5tYXAiLCJpbXBvcnQgeyBab2RGaXJzdFBhcnR5VHlwZUtpbmQgfSBmcm9tICd6b2QnO1xuaW1wb3J0IHsgc2V0UmVzcG9uc2VWYWx1ZUFuZEVycm9ycyB9IGZyb20gXCIuLi9lcnJvck1lc3NhZ2VzLm1qc1wiO1xuaW1wb3J0IHsgcGFyc2VEZWYgfSBmcm9tIFwiLi4vcGFyc2VEZWYubWpzXCI7XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VBcnJheURlZihkZWYsIHJlZnMpIHtcbiAgICBjb25zdCByZXMgPSB7XG4gICAgICAgIHR5cGU6ICdhcnJheScsXG4gICAgfTtcbiAgICBpZiAoZGVmLnR5cGU/Ll9kZWY/LnR5cGVOYW1lICE9PSBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kQW55KSB7XG4gICAgICAgIHJlcy5pdGVtcyA9IHBhcnNlRGVmKGRlZi50eXBlLl9kZWYsIHtcbiAgICAgICAgICAgIC4uLnJlZnMsXG4gICAgICAgICAgICBjdXJyZW50UGF0aDogWy4uLnJlZnMuY3VycmVudFBhdGgsICdpdGVtcyddLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGRlZi5taW5MZW5ndGgpIHtcbiAgICAgICAgc2V0UmVzcG9uc2VWYWx1ZUFuZEVycm9ycyhyZXMsICdtaW5JdGVtcycsIGRlZi5taW5MZW5ndGgudmFsdWUsIGRlZi5taW5MZW5ndGgubWVzc2FnZSwgcmVmcyk7XG4gICAgfVxuICAgIGlmIChkZWYubWF4TGVuZ3RoKSB7XG4gICAgICAgIHNldFJlc3BvbnNlVmFsdWVBbmRFcnJvcnMocmVzLCAnbWF4SXRlbXMnLCBkZWYubWF4TGVuZ3RoLnZhbHVlLCBkZWYubWF4TGVuZ3RoLm1lc3NhZ2UsIHJlZnMpO1xuICAgIH1cbiAgICBpZiAoZGVmLmV4YWN0TGVuZ3RoKSB7XG4gICAgICAgIHNldFJlc3BvbnNlVmFsdWVBbmRFcnJvcnMocmVzLCAnbWluSXRlbXMnLCBkZWYuZXhhY3RMZW5ndGgudmFsdWUsIGRlZi5leGFjdExlbmd0aC5tZXNzYWdlLCByZWZzKTtcbiAgICAgICAgc2V0UmVzcG9uc2VWYWx1ZUFuZEVycm9ycyhyZXMsICdtYXhJdGVtcycsIGRlZi5leGFjdExlbmd0aC52YWx1ZSwgZGVmLmV4YWN0TGVuZ3RoLm1lc3NhZ2UsIHJlZnMpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YXJyYXkubWpzLm1hcCIsImltcG9ydCB7IHNldFJlc3BvbnNlVmFsdWVBbmRFcnJvcnMgfSBmcm9tIFwiLi4vZXJyb3JNZXNzYWdlcy5tanNcIjtcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUJpZ2ludERlZihkZWYsIHJlZnMpIHtcbiAgICBjb25zdCByZXMgPSB7XG4gICAgICAgIHR5cGU6ICdpbnRlZ2VyJyxcbiAgICAgICAgZm9ybWF0OiAnaW50NjQnLFxuICAgIH07XG4gICAgaWYgKCFkZWYuY2hlY2tzKVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIGZvciAoY29uc3QgY2hlY2sgb2YgZGVmLmNoZWNrcykge1xuICAgICAgICBzd2l0Y2ggKGNoZWNrLmtpbmQpIHtcbiAgICAgICAgICAgIGNhc2UgJ21pbic6XG4gICAgICAgICAgICAgICAgaWYgKHJlZnMudGFyZ2V0ID09PSAnanNvblNjaGVtYTcnKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGVjay5pbmNsdXNpdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFJlc3BvbnNlVmFsdWVBbmRFcnJvcnMocmVzLCAnbWluaW11bScsIGNoZWNrLnZhbHVlLCBjaGVjay5tZXNzYWdlLCByZWZzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFJlc3BvbnNlVmFsdWVBbmRFcnJvcnMocmVzLCAnZXhjbHVzaXZlTWluaW11bScsIGNoZWNrLnZhbHVlLCBjaGVjay5tZXNzYWdlLCByZWZzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGVjay5pbmNsdXNpdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5leGNsdXNpdmVNaW5pbXVtID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBzZXRSZXNwb25zZVZhbHVlQW5kRXJyb3JzKHJlcywgJ21pbmltdW0nLCBjaGVjay52YWx1ZSwgY2hlY2subWVzc2FnZSwgcmVmcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbWF4JzpcbiAgICAgICAgICAgICAgICBpZiAocmVmcy50YXJnZXQgPT09ICdqc29uU2NoZW1hNycpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoZWNrLmluY2x1c2l2ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0UmVzcG9uc2VWYWx1ZUFuZEVycm9ycyhyZXMsICdtYXhpbXVtJywgY2hlY2sudmFsdWUsIGNoZWNrLm1lc3NhZ2UsIHJlZnMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0UmVzcG9uc2VWYWx1ZUFuZEVycm9ycyhyZXMsICdleGNsdXNpdmVNYXhpbXVtJywgY2hlY2sudmFsdWUsIGNoZWNrLm1lc3NhZ2UsIHJlZnMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNoZWNrLmluY2x1c2l2ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzLmV4Y2x1c2l2ZU1heGltdW0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHNldFJlc3BvbnNlVmFsdWVBbmRFcnJvcnMocmVzLCAnbWF4aW11bScsIGNoZWNrLnZhbHVlLCBjaGVjay5tZXNzYWdlLCByZWZzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdtdWx0aXBsZU9mJzpcbiAgICAgICAgICAgICAgICBzZXRSZXNwb25zZVZhbHVlQW5kRXJyb3JzKHJlcywgJ211bHRpcGxlT2YnLCBjaGVjay52YWx1ZSwgY2hlY2subWVzc2FnZSwgcmVmcyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJpZ2ludC5tanMubWFwIiwiZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQm9vbGVhbkRlZigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJvb2xlYW4ubWpzLm1hcCIsImltcG9ydCB7IHBhcnNlRGVmIH0gZnJvbSBcIi4uL3BhcnNlRGVmLm1qc1wiO1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQnJhbmRlZERlZihfZGVmLCByZWZzKSB7XG4gICAgcmV0dXJuIHBhcnNlRGVmKF9kZWYudHlwZS5fZGVmLCByZWZzKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJyYW5kZWQubWpzLm1hcCIsImltcG9ydCB7IHBhcnNlRGVmIH0gZnJvbSBcIi4uL3BhcnNlRGVmLm1qc1wiO1xuZXhwb3J0IGNvbnN0IHBhcnNlQ2F0Y2hEZWYgPSAoZGVmLCByZWZzKSA9PiB7XG4gICAgcmV0dXJuIHBhcnNlRGVmKGRlZi5pbm5lclR5cGUuX2RlZiwgcmVmcyk7XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y2F0Y2gubWpzLm1hcCIsImltcG9ydCB7IHNldFJlc3BvbnNlVmFsdWVBbmRFcnJvcnMgfSBmcm9tIFwiLi4vZXJyb3JNZXNzYWdlcy5tanNcIjtcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZURhdGVEZWYoZGVmLCByZWZzLCBvdmVycmlkZURhdGVTdHJhdGVneSkge1xuICAgIGNvbnN0IHN0cmF0ZWd5ID0gb3ZlcnJpZGVEYXRlU3RyYXRlZ3kgPz8gcmVmcy5kYXRlU3RyYXRlZ3k7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc3RyYXRlZ3kpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhbnlPZjogc3RyYXRlZ3kubWFwKChpdGVtLCBpKSA9PiBwYXJzZURhdGVEZWYoZGVmLCByZWZzLCBpdGVtKSksXG4gICAgICAgIH07XG4gICAgfVxuICAgIHN3aXRjaCAoc3RyYXRlZ3kpIHtcbiAgICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgY2FzZSAnZm9ybWF0OmRhdGUtdGltZSc6XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgICAgICAgIGZvcm1hdDogJ2RhdGUtdGltZScsXG4gICAgICAgICAgICB9O1xuICAgICAgICBjYXNlICdmb3JtYXQ6ZGF0ZSc6XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgICAgICAgIGZvcm1hdDogJ2RhdGUnLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgY2FzZSAnaW50ZWdlcic6XG4gICAgICAgICAgICByZXR1cm4gaW50ZWdlckRhdGVQYXJzZXIoZGVmLCByZWZzKTtcbiAgICB9XG59XG5jb25zdCBpbnRlZ2VyRGF0ZVBhcnNlciA9IChkZWYsIHJlZnMpID0+IHtcbiAgICBjb25zdCByZXMgPSB7XG4gICAgICAgIHR5cGU6ICdpbnRlZ2VyJyxcbiAgICAgICAgZm9ybWF0OiAndW5peC10aW1lJyxcbiAgICB9O1xuICAgIGlmIChyZWZzLnRhcmdldCA9PT0gJ29wZW5BcGkzJykge1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGNoZWNrIG9mIGRlZi5jaGVja3MpIHtcbiAgICAgICAgc3dpdGNoIChjaGVjay5raW5kKSB7XG4gICAgICAgICAgICBjYXNlICdtaW4nOlxuICAgICAgICAgICAgICAgIHNldFJlc3BvbnNlVmFsdWVBbmRFcnJvcnMocmVzLCAnbWluaW11bScsIGNoZWNrLnZhbHVlLCAvLyBUaGlzIGlzIGluIG1pbGxpc2Vjb25kc1xuICAgICAgICAgICAgICAgIGNoZWNrLm1lc3NhZ2UsIHJlZnMpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbWF4JzpcbiAgICAgICAgICAgICAgICBzZXRSZXNwb25zZVZhbHVlQW5kRXJyb3JzKHJlcywgJ21heGltdW0nLCBjaGVjay52YWx1ZSwgLy8gVGhpcyBpcyBpbiBtaWxsaXNlY29uZHNcbiAgICAgICAgICAgICAgICBjaGVjay5tZXNzYWdlLCByZWZzKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGUubWpzLm1hcCIsImltcG9ydCB7IHBhcnNlRGVmIH0gZnJvbSBcIi4uL3BhcnNlRGVmLm1qc1wiO1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRGVmYXVsdERlZihfZGVmLCByZWZzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgLi4ucGFyc2VEZWYoX2RlZi5pbm5lclR5cGUuX2RlZiwgcmVmcyksXG4gICAgICAgIGRlZmF1bHQ6IF9kZWYuZGVmYXVsdFZhbHVlKCksXG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRlZmF1bHQubWpzLm1hcCIsImltcG9ydCB7IHBhcnNlRGVmIH0gZnJvbSBcIi4uL3BhcnNlRGVmLm1qc1wiO1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRWZmZWN0c0RlZihfZGVmLCByZWZzLCBmb3JjZVJlc29sdXRpb24pIHtcbiAgICByZXR1cm4gcmVmcy5lZmZlY3RTdHJhdGVneSA9PT0gJ2lucHV0JyA/IHBhcnNlRGVmKF9kZWYuc2NoZW1hLl9kZWYsIHJlZnMsIGZvcmNlUmVzb2x1dGlvbikgOiB7fTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWVmZmVjdHMubWpzLm1hcCIsImV4cG9ydCBmdW5jdGlvbiBwYXJzZUVudW1EZWYoZGVmKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgIGVudW06IFsuLi5kZWYudmFsdWVzXSxcbiAgICB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZW51bS5tanMubWFwIiwiaW1wb3J0IHsgcGFyc2VEZWYgfSBmcm9tIFwiLi4vcGFyc2VEZWYubWpzXCI7XG5jb25zdCBpc0pzb25TY2hlbWE3QWxsT2ZUeXBlID0gKHR5cGUpID0+IHtcbiAgICBpZiAoJ3R5cGUnIGluIHR5cGUgJiYgdHlwZS50eXBlID09PSAnc3RyaW5nJylcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiAnYWxsT2YnIGluIHR5cGU7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlSW50ZXJzZWN0aW9uRGVmKGRlZiwgcmVmcykge1xuICAgIGNvbnN0IGFsbE9mID0gW1xuICAgICAgICBwYXJzZURlZihkZWYubGVmdC5fZGVmLCB7XG4gICAgICAgICAgICAuLi5yZWZzLFxuICAgICAgICAgICAgY3VycmVudFBhdGg6IFsuLi5yZWZzLmN1cnJlbnRQYXRoLCAnYWxsT2YnLCAnMCddLFxuICAgICAgICB9KSxcbiAgICAgICAgcGFyc2VEZWYoZGVmLnJpZ2h0Ll9kZWYsIHtcbiAgICAgICAgICAgIC4uLnJlZnMsXG4gICAgICAgICAgICBjdXJyZW50UGF0aDogWy4uLnJlZnMuY3VycmVudFBhdGgsICdhbGxPZicsICcxJ10sXG4gICAgICAgIH0pLFxuICAgIF0uZmlsdGVyKCh4KSA9PiAhIXgpO1xuICAgIGxldCB1bmV2YWx1YXRlZFByb3BlcnRpZXMgPSByZWZzLnRhcmdldCA9PT0gJ2pzb25TY2hlbWEyMDE5LTA5JyA/IHsgdW5ldmFsdWF0ZWRQcm9wZXJ0aWVzOiBmYWxzZSB9IDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IG1lcmdlZEFsbE9mID0gW107XG4gICAgLy8gSWYgZWl0aGVyIG9mIHRoZSBzY2hlbWFzIGlzIGFuIGFsbE9mLCBtZXJnZSB0aGVtIGludG8gYSBzaW5nbGUgYWxsT2ZcbiAgICBhbGxPZi5mb3JFYWNoKChzY2hlbWEpID0+IHtcbiAgICAgICAgaWYgKGlzSnNvblNjaGVtYTdBbGxPZlR5cGUoc2NoZW1hKSkge1xuICAgICAgICAgICAgbWVyZ2VkQWxsT2YucHVzaCguLi5zY2hlbWEuYWxsT2YpO1xuICAgICAgICAgICAgaWYgKHNjaGVtYS51bmV2YWx1YXRlZFByb3BlcnRpZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIC8vIElmIG9uZSBvZiB0aGUgc2NoZW1hcyBoYXMgbm8gdW5ldmFsdWF0ZWRQcm9wZXJ0aWVzIHNldCxcbiAgICAgICAgICAgICAgICAvLyB0aGUgbWVyZ2VkIHNjaGVtYSBzaG91bGQgYWxzbyBoYXZlIG5vIHVuZXZhbHVhdGVkUHJvcGVydGllcyBzZXRcbiAgICAgICAgICAgICAgICB1bmV2YWx1YXRlZFByb3BlcnRpZXMgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgbmVzdGVkU2NoZW1hID0gc2NoZW1hO1xuICAgICAgICAgICAgaWYgKCdhZGRpdGlvbmFsUHJvcGVydGllcycgaW4gc2NoZW1hICYmIHNjaGVtYS5hZGRpdGlvbmFsUHJvcGVydGllcyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGFkZGl0aW9uYWxQcm9wZXJ0aWVzLCAuLi5yZXN0IH0gPSBzY2hlbWE7XG4gICAgICAgICAgICAgICAgbmVzdGVkU2NoZW1hID0gcmVzdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEFzIHNvb24gYXMgb25lIG9mIHRoZSBzY2hlbWFzIGhhcyBhZGRpdGlvbmFsUHJvcGVydGllcyBzZXQgbm90IHRvIGZhbHNlLCB3ZSBhbGxvdyB1bmV2YWx1YXRlZFByb3BlcnRpZXNcbiAgICAgICAgICAgICAgICB1bmV2YWx1YXRlZFByb3BlcnRpZXMgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBtZXJnZWRBbGxPZi5wdXNoKG5lc3RlZFNjaGVtYSk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gbWVyZ2VkQWxsT2YubGVuZ3RoID9cbiAgICAgICAge1xuICAgICAgICAgICAgYWxsT2Y6IG1lcmdlZEFsbE9mLFxuICAgICAgICAgICAgLi4udW5ldmFsdWF0ZWRQcm9wZXJ0aWVzLFxuICAgICAgICB9XG4gICAgICAgIDogdW5kZWZpbmVkO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW50ZXJzZWN0aW9uLm1qcy5tYXAiLCJleHBvcnQgZnVuY3Rpb24gcGFyc2VMaXRlcmFsRGVmKGRlZiwgcmVmcykge1xuICAgIGNvbnN0IHBhcnNlZFR5cGUgPSB0eXBlb2YgZGVmLnZhbHVlO1xuICAgIGlmIChwYXJzZWRUeXBlICE9PSAnYmlnaW50JyAmJlxuICAgICAgICBwYXJzZWRUeXBlICE9PSAnbnVtYmVyJyAmJlxuICAgICAgICBwYXJzZWRUeXBlICE9PSAnYm9vbGVhbicgJiZcbiAgICAgICAgcGFyc2VkVHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IEFycmF5LmlzQXJyYXkoZGVmLnZhbHVlKSA/ICdhcnJheScgOiAnb2JqZWN0JyxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHJlZnMudGFyZ2V0ID09PSAnb3BlbkFwaTMnKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiBwYXJzZWRUeXBlID09PSAnYmlnaW50JyA/ICdpbnRlZ2VyJyA6IHBhcnNlZFR5cGUsXG4gICAgICAgICAgICBlbnVtOiBbZGVmLnZhbHVlXSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogcGFyc2VkVHlwZSA9PT0gJ2JpZ2ludCcgPyAnaW50ZWdlcicgOiBwYXJzZWRUeXBlLFxuICAgICAgICBjb25zdDogZGVmLnZhbHVlLFxuICAgIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1saXRlcmFsLm1qcy5tYXAiLCJpbXBvcnQgeyBzZXRSZXNwb25zZVZhbHVlQW5kRXJyb3JzIH0gZnJvbSBcIi4uL2Vycm9yTWVzc2FnZXMubWpzXCI7XG5sZXQgZW1vamlSZWdleDtcbi8qKlxuICogR2VuZXJhdGVkIGZyb20gdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbnMgZm91bmQgaGVyZSBhcyBvZiAyMDI0LTA1LTIyOlxuICogaHR0cHM6Ly9naXRodWIuY29tL2NvbGluaGFja3Mvem9kL2Jsb2IvbWFzdGVyL3NyYy90eXBlcy50cy5cbiAqXG4gKiBFeHByZXNzaW9ucyB3aXRoIC9pIGZsYWcgaGF2ZSBiZWVuIGNoYW5nZWQgYWNjb3JkaW5nbHkuXG4gKi9cbmV4cG9ydCBjb25zdCB6b2RQYXR0ZXJucyA9IHtcbiAgICAvKipcbiAgICAgKiBgY2Agd2FzIGNoYW5nZWQgdG8gYFtjQ11gIHRvIHJlcGxpY2F0ZSAvaSBmbGFnXG4gICAgICovXG4gICAgY3VpZDogL15bY0NdW15cXHMtXXs4LH0kLyxcbiAgICBjdWlkMjogL15bMC05YS16XSskLyxcbiAgICB1bGlkOiAvXlswLTlBLUhKS01OUC1UVi1aXXsyNn0kLyxcbiAgICAvKipcbiAgICAgKiBgYS16YCB3YXMgYWRkZWQgdG8gcmVwbGljYXRlIC9pIGZsYWdcbiAgICAgKi9cbiAgICBlbWFpbDogL14oPyFcXC4pKD8hLipcXC5cXC4pKFthLXpBLVowLTlfJytcXC1cXC5dKilbYS16QS1aMC05XystXUAoW2EtekEtWjAtOV1bYS16QS1aMC05XFwtXSpcXC4pK1thLXpBLVpdezIsfSQvLFxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdGVkIGEgdmFsaWQgVW5pY29kZSBSZWdFeHBcbiAgICAgKlxuICAgICAqIExhemlseSBpbnN0YW50aWF0ZSBzaW5jZSB0aGlzIHR5cGUgb2YgcmVnZXggaXNuJ3Qgc3VwcG9ydGVkXG4gICAgICogaW4gYWxsIGVudnMgKGUuZy4gUmVhY3QgTmF0aXZlKS5cbiAgICAgKlxuICAgICAqIFNlZTpcbiAgICAgKiBodHRwczovL2dpdGh1Yi5jb20vY29saW5oYWNrcy96b2QvaXNzdWVzLzI0MzNcbiAgICAgKiBGaXggaW4gWm9kOlxuICAgICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9jb2xpbmhhY2tzL3pvZC9jb21taXQvOTM0MGZkNTFlNDg1NzZhNzVhZGM5MTliZmY2NWRiYzRhNWQ0Yzk5YlxuICAgICAqL1xuICAgIGVtb2ppOiAoKSA9PiB7XG4gICAgICAgIGlmIChlbW9qaVJlZ2V4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGVtb2ppUmVnZXggPSBSZWdFeHAoJ14oXFxcXHB7RXh0ZW5kZWRfUGljdG9ncmFwaGljfXxcXFxccHtFbW9qaV9Db21wb25lbnR9KSskJywgJ3UnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZW1vamlSZWdleDtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFVudXNlZFxuICAgICAqL1xuICAgIHV1aWQ6IC9eWzAtOWEtZkEtRl17OH1cXGItWzAtOWEtZkEtRl17NH1cXGItWzAtOWEtZkEtRl17NH1cXGItWzAtOWEtZkEtRl17NH1cXGItWzAtOWEtZkEtRl17MTJ9JC8sXG4gICAgLyoqXG4gICAgICogVW51c2VkXG4gICAgICovXG4gICAgaXB2NDogL14oPzooPzoyNVswLTVdfDJbMC00XVswLTldfDFbMC05XVswLTldfFsxLTldWzAtOV18WzAtOV0pXFwuKXszfSg/OjI1WzAtNV18MlswLTRdWzAtOV18MVswLTldWzAtOV18WzEtOV1bMC05XXxbMC05XSkkLyxcbiAgICAvKipcbiAgICAgKiBVbnVzZWRcbiAgICAgKi9cbiAgICBpcHY2OiAvXigoW2EtZjAtOV17MSw0fTopezd9fDo6KFthLWYwLTldezEsNH06KXswLDZ9fChbYS1mMC05XXsxLDR9Oil7MX06KFthLWYwLTldezEsNH06KXswLDV9fChbYS1mMC05XXsxLDR9Oil7Mn06KFthLWYwLTldezEsNH06KXswLDR9fChbYS1mMC05XXsxLDR9Oil7M306KFthLWYwLTldezEsNH06KXswLDN9fChbYS1mMC05XXsxLDR9Oil7NH06KFthLWYwLTldezEsNH06KXswLDJ9fChbYS1mMC05XXsxLDR9Oil7NX06KFthLWYwLTldezEsNH06KXswLDF9KShbYS1mMC05XXsxLDR9fCgoKDI1WzAtNV0pfCgyWzAtNF1bMC05XSl8KDFbMC05XXsyfSl8KFswLTldezEsMn0pKVxcLil7M30oKDI1WzAtNV0pfCgyWzAtNF1bMC05XSl8KDFbMC05XXsyfSl8KFswLTldezEsMn0pKSkkLyxcbiAgICBiYXNlNjQ6IC9eKFswLTlhLXpBLVorL117NH0pKigoWzAtOWEtekEtWisvXXsyfT09KXwoWzAtOWEtekEtWisvXXszfT0pKT8kLyxcbiAgICBuYW5vaWQ6IC9eW2EtekEtWjAtOV8tXXsyMX0kLyxcbn07XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTdHJpbmdEZWYoZGVmLCByZWZzKSB7XG4gICAgY29uc3QgcmVzID0ge1xuICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICB9O1xuICAgIGZ1bmN0aW9uIHByb2Nlc3NQYXR0ZXJuKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiByZWZzLnBhdHRlcm5TdHJhdGVneSA9PT0gJ2VzY2FwZScgPyBlc2NhcGVOb25BbHBoYU51bWVyaWModmFsdWUpIDogdmFsdWU7XG4gICAgfVxuICAgIGlmIChkZWYuY2hlY2tzKSB7XG4gICAgICAgIGZvciAoY29uc3QgY2hlY2sgb2YgZGVmLmNoZWNrcykge1xuICAgICAgICAgICAgc3dpdGNoIChjaGVjay5raW5kKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnbWluJzpcbiAgICAgICAgICAgICAgICAgICAgc2V0UmVzcG9uc2VWYWx1ZUFuZEVycm9ycyhyZXMsICdtaW5MZW5ndGgnLCB0eXBlb2YgcmVzLm1pbkxlbmd0aCA9PT0gJ251bWJlcicgPyBNYXRoLm1heChyZXMubWluTGVuZ3RoLCBjaGVjay52YWx1ZSkgOiBjaGVjay52YWx1ZSwgY2hlY2subWVzc2FnZSwgcmVmcyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ21heCc6XG4gICAgICAgICAgICAgICAgICAgIHNldFJlc3BvbnNlVmFsdWVBbmRFcnJvcnMocmVzLCAnbWF4TGVuZ3RoJywgdHlwZW9mIHJlcy5tYXhMZW5ndGggPT09ICdudW1iZXInID8gTWF0aC5taW4ocmVzLm1heExlbmd0aCwgY2hlY2sudmFsdWUpIDogY2hlY2sudmFsdWUsIGNoZWNrLm1lc3NhZ2UsIHJlZnMpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdlbWFpbCc6XG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocmVmcy5lbWFpbFN0cmF0ZWd5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdmb3JtYXQ6ZW1haWwnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEZvcm1hdChyZXMsICdlbWFpbCcsIGNoZWNrLm1lc3NhZ2UsIHJlZnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZm9ybWF0Omlkbi1lbWFpbCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRm9ybWF0KHJlcywgJ2lkbi1lbWFpbCcsIGNoZWNrLm1lc3NhZ2UsIHJlZnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAncGF0dGVybjp6b2QnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFBhdHRlcm4ocmVzLCB6b2RQYXR0ZXJucy5lbWFpbCwgY2hlY2subWVzc2FnZSwgcmVmcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAndXJsJzpcbiAgICAgICAgICAgICAgICAgICAgYWRkRm9ybWF0KHJlcywgJ3VyaScsIGNoZWNrLm1lc3NhZ2UsIHJlZnMpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICd1dWlkJzpcbiAgICAgICAgICAgICAgICAgICAgYWRkRm9ybWF0KHJlcywgJ3V1aWQnLCBjaGVjay5tZXNzYWdlLCByZWZzKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAncmVnZXgnOlxuICAgICAgICAgICAgICAgICAgICBhZGRQYXR0ZXJuKHJlcywgY2hlY2sucmVnZXgsIGNoZWNrLm1lc3NhZ2UsIHJlZnMpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdjdWlkJzpcbiAgICAgICAgICAgICAgICAgICAgYWRkUGF0dGVybihyZXMsIHpvZFBhdHRlcm5zLmN1aWQsIGNoZWNrLm1lc3NhZ2UsIHJlZnMpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdjdWlkMic6XG4gICAgICAgICAgICAgICAgICAgIGFkZFBhdHRlcm4ocmVzLCB6b2RQYXR0ZXJucy5jdWlkMiwgY2hlY2subWVzc2FnZSwgcmVmcyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3N0YXJ0c1dpdGgnOlxuICAgICAgICAgICAgICAgICAgICBhZGRQYXR0ZXJuKHJlcywgUmVnRXhwKGBeJHtwcm9jZXNzUGF0dGVybihjaGVjay52YWx1ZSl9YCksIGNoZWNrLm1lc3NhZ2UsIHJlZnMpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdlbmRzV2l0aCc6XG4gICAgICAgICAgICAgICAgICAgIGFkZFBhdHRlcm4ocmVzLCBSZWdFeHAoYCR7cHJvY2Vzc1BhdHRlcm4oY2hlY2sudmFsdWUpfSRgKSwgY2hlY2subWVzc2FnZSwgcmVmcyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2RhdGV0aW1lJzpcbiAgICAgICAgICAgICAgICAgICAgYWRkRm9ybWF0KHJlcywgJ2RhdGUtdGltZScsIGNoZWNrLm1lc3NhZ2UsIHJlZnMpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdkYXRlJzpcbiAgICAgICAgICAgICAgICAgICAgYWRkRm9ybWF0KHJlcywgJ2RhdGUnLCBjaGVjay5tZXNzYWdlLCByZWZzKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAndGltZSc6XG4gICAgICAgICAgICAgICAgICAgIGFkZEZvcm1hdChyZXMsICd0aW1lJywgY2hlY2subWVzc2FnZSwgcmVmcyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2R1cmF0aW9uJzpcbiAgICAgICAgICAgICAgICAgICAgYWRkRm9ybWF0KHJlcywgJ2R1cmF0aW9uJywgY2hlY2subWVzc2FnZSwgcmVmcyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2xlbmd0aCc6XG4gICAgICAgICAgICAgICAgICAgIHNldFJlc3BvbnNlVmFsdWVBbmRFcnJvcnMocmVzLCAnbWluTGVuZ3RoJywgdHlwZW9mIHJlcy5taW5MZW5ndGggPT09ICdudW1iZXInID8gTWF0aC5tYXgocmVzLm1pbkxlbmd0aCwgY2hlY2sudmFsdWUpIDogY2hlY2sudmFsdWUsIGNoZWNrLm1lc3NhZ2UsIHJlZnMpO1xuICAgICAgICAgICAgICAgICAgICBzZXRSZXNwb25zZVZhbHVlQW5kRXJyb3JzKHJlcywgJ21heExlbmd0aCcsIHR5cGVvZiByZXMubWF4TGVuZ3RoID09PSAnbnVtYmVyJyA/IE1hdGgubWluKHJlcy5tYXhMZW5ndGgsIGNoZWNrLnZhbHVlKSA6IGNoZWNrLnZhbHVlLCBjaGVjay5tZXNzYWdlLCByZWZzKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnaW5jbHVkZXMnOiB7XG4gICAgICAgICAgICAgICAgICAgIGFkZFBhdHRlcm4ocmVzLCBSZWdFeHAocHJvY2Vzc1BhdHRlcm4oY2hlY2sudmFsdWUpKSwgY2hlY2subWVzc2FnZSwgcmVmcyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlICdpcCc6IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoZWNrLnZlcnNpb24gIT09ICd2NicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZEZvcm1hdChyZXMsICdpcHY0JywgY2hlY2subWVzc2FnZSwgcmVmcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoZWNrLnZlcnNpb24gIT09ICd2NCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZEZvcm1hdChyZXMsICdpcHY2JywgY2hlY2subWVzc2FnZSwgcmVmcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgJ2Vtb2ppJzpcbiAgICAgICAgICAgICAgICAgICAgYWRkUGF0dGVybihyZXMsIHpvZFBhdHRlcm5zLmVtb2ppLCBjaGVjay5tZXNzYWdlLCByZWZzKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAndWxpZCc6IHtcbiAgICAgICAgICAgICAgICAgICAgYWRkUGF0dGVybihyZXMsIHpvZFBhdHRlcm5zLnVsaWQsIGNoZWNrLm1lc3NhZ2UsIHJlZnMpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSAnYmFzZTY0Jzoge1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHJlZnMuYmFzZTY0U3RyYXRlZ3kpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2Zvcm1hdDpiaW5hcnknOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRm9ybWF0KHJlcywgJ2JpbmFyeScsIGNoZWNrLm1lc3NhZ2UsIHJlZnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnY29udGVudEVuY29kaW5nOmJhc2U2NCc6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRSZXNwb25zZVZhbHVlQW5kRXJyb3JzKHJlcywgJ2NvbnRlbnRFbmNvZGluZycsICdiYXNlNjQnLCBjaGVjay5tZXNzYWdlLCByZWZzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3BhdHRlcm46em9kJzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFBhdHRlcm4ocmVzLCB6b2RQYXR0ZXJucy5iYXNlNjQsIGNoZWNrLm1lc3NhZ2UsIHJlZnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlICduYW5vaWQnOiB7XG4gICAgICAgICAgICAgICAgICAgIGFkZFBhdHRlcm4ocmVzLCB6b2RQYXR0ZXJucy5uYW5vaWQsIGNoZWNrLm1lc3NhZ2UsIHJlZnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlICd0b0xvd2VyQ2FzZSc6XG4gICAgICAgICAgICAgICAgY2FzZSAndG9VcHBlckNhc2UnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ3RyaW0nOlxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAoKF8pID0+IHsgfSkoY2hlY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG5jb25zdCBlc2NhcGVOb25BbHBoYU51bWVyaWMgPSAodmFsdWUpID0+IEFycmF5LmZyb20odmFsdWUpXG4gICAgLm1hcCgoYykgPT4gKC9bYS16QS1aMC05XS8udGVzdChjKSA/IGMgOiBgXFxcXCR7Y31gKSlcbiAgICAuam9pbignJyk7XG5jb25zdCBhZGRGb3JtYXQgPSAoc2NoZW1hLCB2YWx1ZSwgbWVzc2FnZSwgcmVmcykgPT4ge1xuICAgIGlmIChzY2hlbWEuZm9ybWF0IHx8IHNjaGVtYS5hbnlPZj8uc29tZSgoeCkgPT4geC5mb3JtYXQpKSB7XG4gICAgICAgIGlmICghc2NoZW1hLmFueU9mKSB7XG4gICAgICAgICAgICBzY2hlbWEuYW55T2YgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2NoZW1hLmZvcm1hdCkge1xuICAgICAgICAgICAgc2NoZW1hLmFueU9mLnB1c2goe1xuICAgICAgICAgICAgICAgIGZvcm1hdDogc2NoZW1hLmZvcm1hdCxcbiAgICAgICAgICAgICAgICAuLi4oc2NoZW1hLmVycm9yTWVzc2FnZSAmJlxuICAgICAgICAgICAgICAgICAgICByZWZzLmVycm9yTWVzc2FnZXMgJiYge1xuICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2U6IHsgZm9ybWF0OiBzY2hlbWEuZXJyb3JNZXNzYWdlLmZvcm1hdCB9LFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBkZWxldGUgc2NoZW1hLmZvcm1hdDtcbiAgICAgICAgICAgIGlmIChzY2hlbWEuZXJyb3JNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHNjaGVtYS5lcnJvck1lc3NhZ2UuZm9ybWF0O1xuICAgICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhzY2hlbWEuZXJyb3JNZXNzYWdlKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHNjaGVtYS5lcnJvck1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHNjaGVtYS5hbnlPZi5wdXNoKHtcbiAgICAgICAgICAgIGZvcm1hdDogdmFsdWUsXG4gICAgICAgICAgICAuLi4obWVzc2FnZSAmJiByZWZzLmVycm9yTWVzc2FnZXMgJiYgeyBlcnJvck1lc3NhZ2U6IHsgZm9ybWF0OiBtZXNzYWdlIH0gfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgc2V0UmVzcG9uc2VWYWx1ZUFuZEVycm9ycyhzY2hlbWEsICdmb3JtYXQnLCB2YWx1ZSwgbWVzc2FnZSwgcmVmcyk7XG4gICAgfVxufTtcbmNvbnN0IGFkZFBhdHRlcm4gPSAoc2NoZW1hLCByZWdleCwgbWVzc2FnZSwgcmVmcykgPT4ge1xuICAgIGlmIChzY2hlbWEucGF0dGVybiB8fCBzY2hlbWEuYWxsT2Y/LnNvbWUoKHgpID0+IHgucGF0dGVybikpIHtcbiAgICAgICAgaWYgKCFzY2hlbWEuYWxsT2YpIHtcbiAgICAgICAgICAgIHNjaGVtYS5hbGxPZiA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzY2hlbWEucGF0dGVybikge1xuICAgICAgICAgICAgc2NoZW1hLmFsbE9mLnB1c2goe1xuICAgICAgICAgICAgICAgIHBhdHRlcm46IHNjaGVtYS5wYXR0ZXJuLFxuICAgICAgICAgICAgICAgIC4uLihzY2hlbWEuZXJyb3JNZXNzYWdlICYmXG4gICAgICAgICAgICAgICAgICAgIHJlZnMuZXJyb3JNZXNzYWdlcyAmJiB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZTogeyBwYXR0ZXJuOiBzY2hlbWEuZXJyb3JNZXNzYWdlLnBhdHRlcm4gfSxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZGVsZXRlIHNjaGVtYS5wYXR0ZXJuO1xuICAgICAgICAgICAgaWYgKHNjaGVtYS5lcnJvck1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgc2NoZW1hLmVycm9yTWVzc2FnZS5wYXR0ZXJuO1xuICAgICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhzY2hlbWEuZXJyb3JNZXNzYWdlKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHNjaGVtYS5lcnJvck1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHNjaGVtYS5hbGxPZi5wdXNoKHtcbiAgICAgICAgICAgIHBhdHRlcm46IHByb2Nlc3NSZWdFeHAocmVnZXgsIHJlZnMpLFxuICAgICAgICAgICAgLi4uKG1lc3NhZ2UgJiYgcmVmcy5lcnJvck1lc3NhZ2VzICYmIHsgZXJyb3JNZXNzYWdlOiB7IHBhdHRlcm46IG1lc3NhZ2UgfSB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBzZXRSZXNwb25zZVZhbHVlQW5kRXJyb3JzKHNjaGVtYSwgJ3BhdHRlcm4nLCBwcm9jZXNzUmVnRXhwKHJlZ2V4LCByZWZzKSwgbWVzc2FnZSwgcmVmcyk7XG4gICAgfVxufTtcbi8vIE11dGF0ZSB6LnN0cmluZy5yZWdleCgpIGluIGEgYmVzdCBhdHRlbXB0IHRvIGFjY29tbW9kYXRlIGZvciByZWdleCBmbGFncyB3aGVuIGFwcGx5UmVnZXhGbGFncyBpcyB0cnVlXG5jb25zdCBwcm9jZXNzUmVnRXhwID0gKHJlZ2V4T3JGdW5jdGlvbiwgcmVmcykgPT4ge1xuICAgIGNvbnN0IHJlZ2V4ID0gdHlwZW9mIHJlZ2V4T3JGdW5jdGlvbiA9PT0gJ2Z1bmN0aW9uJyA/IHJlZ2V4T3JGdW5jdGlvbigpIDogcmVnZXhPckZ1bmN0aW9uO1xuICAgIGlmICghcmVmcy5hcHBseVJlZ2V4RmxhZ3MgfHwgIXJlZ2V4LmZsYWdzKVxuICAgICAgICByZXR1cm4gcmVnZXguc291cmNlO1xuICAgIC8vIEN1cnJlbnRseSBoYW5kbGVkIGZsYWdzXG4gICAgY29uc3QgZmxhZ3MgPSB7XG4gICAgICAgIGk6IHJlZ2V4LmZsYWdzLmluY2x1ZGVzKCdpJyksIC8vIENhc2UtaW5zZW5zaXRpdmVcbiAgICAgICAgbTogcmVnZXguZmxhZ3MuaW5jbHVkZXMoJ20nKSwgLy8gYF5gIGFuZCBgJGAgbWF0Y2hlcyBhZGphY2VudCB0byBuZXdsaW5lIGNoYXJhY3RlcnNcbiAgICAgICAgczogcmVnZXguZmxhZ3MuaW5jbHVkZXMoJ3MnKSwgLy8gYC5gIG1hdGNoZXMgbmV3bGluZXNcbiAgICB9O1xuICAgIC8vIFRoZSBnZW5lcmFsIHByaW5jaXBsZSBoZXJlIGlzIHRvIHN0ZXAgdGhyb3VnaCBlYWNoIGNoYXJhY3Rlciwgb25lIGF0IGEgdGltZSwgYXBwbHlpbmcgbXV0YXRpb25zIGFzIGZsYWdzIHJlcXVpcmUuIFdlIGtlZXAgdHJhY2sgd2hlbiB0aGUgY3VycmVudCBjaGFyYWN0ZXIgaXMgZXNjYXBlZCwgYW5kIHdoZW4gaXQncyBpbnNpZGUgYSBncm91cCAvbGlrZSBbdGhpc10vIG9yIChhbHNvKSBhIHJhbmdlIGxpa2UgL1thLXpdLy4gVGhlIGZvbGxvd2luZyBpcyBmYWlybHkgYnJpdHRsZSBpbXBlcmF0aXZlIGNvZGU7IGVkaXQgYXQgeW91ciBwZXJpbCFcbiAgICBjb25zdCBzb3VyY2UgPSBmbGFncy5pID8gcmVnZXguc291cmNlLnRvTG93ZXJDYXNlKCkgOiByZWdleC5zb3VyY2U7XG4gICAgbGV0IHBhdHRlcm4gPSAnJztcbiAgICBsZXQgaXNFc2NhcGVkID0gZmFsc2U7XG4gICAgbGV0IGluQ2hhckdyb3VwID0gZmFsc2U7XG4gICAgbGV0IGluQ2hhclJhbmdlID0gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3VyY2UubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGlzRXNjYXBlZCkge1xuICAgICAgICAgICAgcGF0dGVybiArPSBzb3VyY2VbaV07XG4gICAgICAgICAgICBpc0VzY2FwZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmbGFncy5pKSB7XG4gICAgICAgICAgICBpZiAoaW5DaGFyR3JvdXApIHtcbiAgICAgICAgICAgICAgICBpZiAoc291cmNlW2ldLm1hdGNoKC9bYS16XS8pKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbkNoYXJSYW5nZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiArPSBzb3VyY2VbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuICs9IGAke3NvdXJjZVtpIC0gMl19LSR7c291cmNlW2ldfWAudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluQ2hhclJhbmdlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc291cmNlW2kgKyAxXSA9PT0gJy0nICYmIHNvdXJjZVtpICsgMl0/Lm1hdGNoKC9bYS16XS8pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuICs9IHNvdXJjZVtpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluQ2hhclJhbmdlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gKz0gYCR7c291cmNlW2ldfSR7c291cmNlW2ldLnRvVXBwZXJDYXNlKCl9YDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChzb3VyY2VbaV0ubWF0Y2goL1thLXpdLykpIHtcbiAgICAgICAgICAgICAgICBwYXR0ZXJuICs9IGBbJHtzb3VyY2VbaV19JHtzb3VyY2VbaV0udG9VcHBlckNhc2UoKX1dYDtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZmxhZ3MubSkge1xuICAgICAgICAgICAgaWYgKHNvdXJjZVtpXSA9PT0gJ14nKSB7XG4gICAgICAgICAgICAgICAgcGF0dGVybiArPSBgKF58KD88PVtcXHJcXG5dKSlgO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoc291cmNlW2ldID09PSAnJCcpIHtcbiAgICAgICAgICAgICAgICBwYXR0ZXJuICs9IGAoJHwoPz1bXFxyXFxuXSkpYDtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZmxhZ3MucyAmJiBzb3VyY2VbaV0gPT09ICcuJykge1xuICAgICAgICAgICAgcGF0dGVybiArPSBpbkNoYXJHcm91cCA/IGAke3NvdXJjZVtpXX1cXHJcXG5gIDogYFske3NvdXJjZVtpXX1cXHJcXG5dYDtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHBhdHRlcm4gKz0gc291cmNlW2ldO1xuICAgICAgICBpZiAoc291cmNlW2ldID09PSAnXFxcXCcpIHtcbiAgICAgICAgICAgIGlzRXNjYXBlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaW5DaGFyR3JvdXAgJiYgc291cmNlW2ldID09PSAnXScpIHtcbiAgICAgICAgICAgIGluQ2hhckdyb3VwID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIWluQ2hhckdyb3VwICYmIHNvdXJjZVtpXSA9PT0gJ1snKSB7XG4gICAgICAgICAgICBpbkNoYXJHcm91cCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVnZXhUZXN0ID0gbmV3IFJlZ0V4cChwYXR0ZXJuKTtcbiAgICB9XG4gICAgY2F0Y2gge1xuICAgICAgICBjb25zb2xlLndhcm4oYENvdWxkIG5vdCBjb252ZXJ0IHJlZ2V4IHBhdHRlcm4gYXQgJHtyZWZzLmN1cnJlbnRQYXRoLmpvaW4oJy8nKX0gdG8gYSBmbGFnLWluZGVwZW5kZW50IGZvcm0hIEZhbGxpbmcgYmFjayB0byB0aGUgZmxhZy1pZ25vcmFudCBzb3VyY2VgKTtcbiAgICAgICAgcmV0dXJuIHJlZ2V4LnNvdXJjZTtcbiAgICB9XG4gICAgcmV0dXJuIHBhdHRlcm47XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3RyaW5nLm1qcy5tYXAiLCJpbXBvcnQgeyBab2RGaXJzdFBhcnR5VHlwZUtpbmQgfSBmcm9tICd6b2QnO1xuaW1wb3J0IHsgcGFyc2VEZWYgfSBmcm9tIFwiLi4vcGFyc2VEZWYubWpzXCI7XG5pbXBvcnQgeyBwYXJzZVN0cmluZ0RlZiB9IGZyb20gXCIuL3N0cmluZy5tanNcIjtcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVJlY29yZERlZihkZWYsIHJlZnMpIHtcbiAgICBpZiAocmVmcy50YXJnZXQgPT09ICdvcGVuQXBpMycgJiYgZGVmLmtleVR5cGU/Ll9kZWYudHlwZU5hbWUgPT09IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RFbnVtKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICAgICAgICAgIHJlcXVpcmVkOiBkZWYua2V5VHlwZS5fZGVmLnZhbHVlcyxcbiAgICAgICAgICAgIHByb3BlcnRpZXM6IGRlZi5rZXlUeXBlLl9kZWYudmFsdWVzLnJlZHVjZSgoYWNjLCBrZXkpID0+ICh7XG4gICAgICAgICAgICAgICAgLi4uYWNjLFxuICAgICAgICAgICAgICAgIFtrZXldOiBwYXJzZURlZihkZWYudmFsdWVUeXBlLl9kZWYsIHtcbiAgICAgICAgICAgICAgICAgICAgLi4ucmVmcyxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFBhdGg6IFsuLi5yZWZzLmN1cnJlbnRQYXRoLCAncHJvcGVydGllcycsIGtleV0sXG4gICAgICAgICAgICAgICAgfSkgPz8ge30sXG4gICAgICAgICAgICB9KSwge30pLFxuICAgICAgICAgICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IGZhbHNlLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBzY2hlbWEgPSB7XG4gICAgICAgIHR5cGU6ICdvYmplY3QnLFxuICAgICAgICBhZGRpdGlvbmFsUHJvcGVydGllczogcGFyc2VEZWYoZGVmLnZhbHVlVHlwZS5fZGVmLCB7XG4gICAgICAgICAgICAuLi5yZWZzLFxuICAgICAgICAgICAgY3VycmVudFBhdGg6IFsuLi5yZWZzLmN1cnJlbnRQYXRoLCAnYWRkaXRpb25hbFByb3BlcnRpZXMnXSxcbiAgICAgICAgfSkgPz8ge30sXG4gICAgfTtcbiAgICBpZiAocmVmcy50YXJnZXQgPT09ICdvcGVuQXBpMycpIHtcbiAgICAgICAgcmV0dXJuIHNjaGVtYTtcbiAgICB9XG4gICAgaWYgKGRlZi5rZXlUeXBlPy5fZGVmLnR5cGVOYW1lID09PSBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kU3RyaW5nICYmIGRlZi5rZXlUeXBlLl9kZWYuY2hlY2tzPy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3Qga2V5VHlwZSA9IE9iamVjdC5lbnRyaWVzKHBhcnNlU3RyaW5nRGVmKGRlZi5rZXlUeXBlLl9kZWYsIHJlZnMpKS5yZWR1Y2UoKGFjYywgW2tleSwgdmFsdWVdKSA9PiAoa2V5ID09PSAndHlwZScgPyBhY2MgOiB7IC4uLmFjYywgW2tleV06IHZhbHVlIH0pLCB7fSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5zY2hlbWEsXG4gICAgICAgICAgICBwcm9wZXJ0eU5hbWVzOiBrZXlUeXBlLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBlbHNlIGlmIChkZWYua2V5VHlwZT8uX2RlZi50eXBlTmFtZSA9PT0gWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEVudW0pIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnNjaGVtYSxcbiAgICAgICAgICAgIHByb3BlcnR5TmFtZXM6IHtcbiAgICAgICAgICAgICAgICBlbnVtOiBkZWYua2V5VHlwZS5fZGVmLnZhbHVlcyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBzY2hlbWE7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZWNvcmQubWpzLm1hcCIsImltcG9ydCB7IHBhcnNlRGVmIH0gZnJvbSBcIi4uL3BhcnNlRGVmLm1qc1wiO1xuaW1wb3J0IHsgcGFyc2VSZWNvcmREZWYgfSBmcm9tIFwiLi9yZWNvcmQubWpzXCI7XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VNYXBEZWYoZGVmLCByZWZzKSB7XG4gICAgaWYgKHJlZnMubWFwU3RyYXRlZ3kgPT09ICdyZWNvcmQnKSB7XG4gICAgICAgIHJldHVybiBwYXJzZVJlY29yZERlZihkZWYsIHJlZnMpO1xuICAgIH1cbiAgICBjb25zdCBrZXlzID0gcGFyc2VEZWYoZGVmLmtleVR5cGUuX2RlZiwge1xuICAgICAgICAuLi5yZWZzLFxuICAgICAgICBjdXJyZW50UGF0aDogWy4uLnJlZnMuY3VycmVudFBhdGgsICdpdGVtcycsICdpdGVtcycsICcwJ10sXG4gICAgfSkgfHwge307XG4gICAgY29uc3QgdmFsdWVzID0gcGFyc2VEZWYoZGVmLnZhbHVlVHlwZS5fZGVmLCB7XG4gICAgICAgIC4uLnJlZnMsXG4gICAgICAgIGN1cnJlbnRQYXRoOiBbLi4ucmVmcy5jdXJyZW50UGF0aCwgJ2l0ZW1zJywgJ2l0ZW1zJywgJzEnXSxcbiAgICB9KSB8fCB7fTtcbiAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiAnYXJyYXknLFxuICAgICAgICBtYXhJdGVtczogMTI1LFxuICAgICAgICBpdGVtczoge1xuICAgICAgICAgICAgdHlwZTogJ2FycmF5JyxcbiAgICAgICAgICAgIGl0ZW1zOiBba2V5cywgdmFsdWVzXSxcbiAgICAgICAgICAgIG1pbkl0ZW1zOiAyLFxuICAgICAgICAgICAgbWF4SXRlbXM6IDIsXG4gICAgICAgIH0sXG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1hcC5tanMubWFwIiwiZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTmF0aXZlRW51bURlZihkZWYpIHtcbiAgICBjb25zdCBvYmplY3QgPSBkZWYudmFsdWVzO1xuICAgIGNvbnN0IGFjdHVhbEtleXMgPSBPYmplY3Qua2V5cyhkZWYudmFsdWVzKS5maWx0ZXIoKGtleSkgPT4ge1xuICAgICAgICByZXR1cm4gdHlwZW9mIG9iamVjdFtvYmplY3Rba2V5XV0gIT09ICdudW1iZXInO1xuICAgIH0pO1xuICAgIGNvbnN0IGFjdHVhbFZhbHVlcyA9IGFjdHVhbEtleXMubWFwKChrZXkpID0+IG9iamVjdFtrZXldKTtcbiAgICBjb25zdCBwYXJzZWRUeXBlcyA9IEFycmF5LmZyb20obmV3IFNldChhY3R1YWxWYWx1ZXMubWFwKCh2YWx1ZXMpID0+IHR5cGVvZiB2YWx1ZXMpKSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogcGFyc2VkVHlwZXMubGVuZ3RoID09PSAxID9cbiAgICAgICAgICAgIHBhcnNlZFR5cGVzWzBdID09PSAnc3RyaW5nJyA/XG4gICAgICAgICAgICAgICAgJ3N0cmluZydcbiAgICAgICAgICAgICAgICA6ICdudW1iZXInXG4gICAgICAgICAgICA6IFsnc3RyaW5nJywgJ251bWJlciddLFxuICAgICAgICBlbnVtOiBhY3R1YWxWYWx1ZXMsXG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW5hdGl2ZUVudW0ubWpzLm1hcCIsImV4cG9ydCBmdW5jdGlvbiBwYXJzZU5ldmVyRGVmKCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIG5vdDoge30sXG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW5ldmVyLm1qcy5tYXAiLCJleHBvcnQgZnVuY3Rpb24gcGFyc2VOdWxsRGVmKHJlZnMpIHtcbiAgICByZXR1cm4gcmVmcy50YXJnZXQgPT09ICdvcGVuQXBpMycgP1xuICAgICAgICB7XG4gICAgICAgICAgICBlbnVtOiBbJ251bGwnXSxcbiAgICAgICAgICAgIG51bGxhYmxlOiB0cnVlLFxuICAgICAgICB9XG4gICAgICAgIDoge1xuICAgICAgICAgICAgdHlwZTogJ251bGwnLFxuICAgICAgICB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bnVsbC5tanMubWFwIiwiaW1wb3J0IHsgcGFyc2VEZWYgfSBmcm9tIFwiLi4vcGFyc2VEZWYubWpzXCI7XG5leHBvcnQgY29uc3QgcHJpbWl0aXZlTWFwcGluZ3MgPSB7XG4gICAgWm9kU3RyaW5nOiAnc3RyaW5nJyxcbiAgICBab2ROdW1iZXI6ICdudW1iZXInLFxuICAgIFpvZEJpZ0ludDogJ2ludGVnZXInLFxuICAgIFpvZEJvb2xlYW46ICdib29sZWFuJyxcbiAgICBab2ROdWxsOiAnbnVsbCcsXG59O1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVW5pb25EZWYoZGVmLCByZWZzKSB7XG4gICAgaWYgKHJlZnMudGFyZ2V0ID09PSAnb3BlbkFwaTMnKVxuICAgICAgICByZXR1cm4gYXNBbnlPZihkZWYsIHJlZnMpO1xuICAgIGNvbnN0IG9wdGlvbnMgPSBkZWYub3B0aW9ucyBpbnN0YW5jZW9mIE1hcCA/IEFycmF5LmZyb20oZGVmLm9wdGlvbnMudmFsdWVzKCkpIDogZGVmLm9wdGlvbnM7XG4gICAgLy8gVGhpcyBibG9ja3MgdHJpZXMgdG8gbG9vayBhaGVhZCBhIGJpdCB0byBwcm9kdWNlIG5pY2VyIGxvb2tpbmcgc2NoZW1hcyB3aXRoIHR5cGUgYXJyYXkgaW5zdGVhZCBvZiBhbnlPZi5cbiAgICBpZiAob3B0aW9ucy5ldmVyeSgoeCkgPT4geC5fZGVmLnR5cGVOYW1lIGluIHByaW1pdGl2ZU1hcHBpbmdzICYmICgheC5fZGVmLmNoZWNrcyB8fCAheC5fZGVmLmNoZWNrcy5sZW5ndGgpKSkge1xuICAgICAgICAvLyBhbGwgdHlwZXMgaW4gdW5pb24gYXJlIHByaW1pdGl2ZSBhbmQgbGFjayBjaGVja3MsIHNvIG1pZ2h0IGFzIHdlbGwgc3F1YXNoIGludG8ge3R5cGU6IFsuLi5dfVxuICAgICAgICBjb25zdCB0eXBlcyA9IG9wdGlvbnMucmVkdWNlKCh0eXBlcywgeCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdHlwZSA9IHByaW1pdGl2ZU1hcHBpbmdzW3guX2RlZi50eXBlTmFtZV07IC8vQ2FuIGJlIHNhZmVseSBjYXN0ZWQgZHVlIHRvIHJvdyA0M1xuICAgICAgICAgICAgcmV0dXJuIHR5cGUgJiYgIXR5cGVzLmluY2x1ZGVzKHR5cGUpID8gWy4uLnR5cGVzLCB0eXBlXSA6IHR5cGVzO1xuICAgICAgICB9LCBbXSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiB0eXBlcy5sZW5ndGggPiAxID8gdHlwZXMgOiB0eXBlc1swXSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZWxzZSBpZiAob3B0aW9ucy5ldmVyeSgoeCkgPT4geC5fZGVmLnR5cGVOYW1lID09PSAnWm9kTGl0ZXJhbCcgJiYgIXguZGVzY3JpcHRpb24pKSB7XG4gICAgICAgIC8vIGFsbCBvcHRpb25zIGxpdGVyYWxzXG4gICAgICAgIGNvbnN0IHR5cGVzID0gb3B0aW9ucy5yZWR1Y2UoKGFjYywgeCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdHlwZSA9IHR5cGVvZiB4Ll9kZWYudmFsdWU7XG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgICAgICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbLi4uYWNjLCB0eXBlXTtcbiAgICAgICAgICAgICAgICBjYXNlICdiaWdpbnQnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWy4uLmFjYywgJ2ludGVnZXInXTtcbiAgICAgICAgICAgICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgICAgICAgICAgICAgICBpZiAoeC5fZGVmLnZhbHVlID09PSBudWxsKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsuLi5hY2MsICdudWxsJ107XG4gICAgICAgICAgICAgICAgY2FzZSAnc3ltYm9sJzpcbiAgICAgICAgICAgICAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCBbXSk7XG4gICAgICAgIGlmICh0eXBlcy5sZW5ndGggPT09IG9wdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAvLyBhbGwgdGhlIGxpdGVyYWxzIGFyZSBwcmltaXRpdmUsIGFzIGZhciBhcyBudWxsIGNhbiBiZSBjb25zaWRlcmVkIHByaW1pdGl2ZVxuICAgICAgICAgICAgY29uc3QgdW5pcXVlVHlwZXMgPSB0eXBlcy5maWx0ZXIoKHgsIGksIGEpID0+IGEuaW5kZXhPZih4KSA9PT0gaSk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHR5cGU6IHVuaXF1ZVR5cGVzLmxlbmd0aCA+IDEgPyB1bmlxdWVUeXBlcyA6IHVuaXF1ZVR5cGVzWzBdLFxuICAgICAgICAgICAgICAgIGVudW06IG9wdGlvbnMucmVkdWNlKChhY2MsIHgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFjYy5pbmNsdWRlcyh4Ll9kZWYudmFsdWUpID8gYWNjIDogWy4uLmFjYywgeC5fZGVmLnZhbHVlXTtcbiAgICAgICAgICAgICAgICB9LCBbXSksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKG9wdGlvbnMuZXZlcnkoKHgpID0+IHguX2RlZi50eXBlTmFtZSA9PT0gJ1pvZEVudW0nKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgICAgICBlbnVtOiBvcHRpb25zLnJlZHVjZSgoYWNjLCB4KSA9PiBbLi4uYWNjLCAuLi54Ll9kZWYudmFsdWVzLmZpbHRlcigoeCkgPT4gIWFjYy5pbmNsdWRlcyh4KSldLCBbXSksXG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBhc0FueU9mKGRlZiwgcmVmcyk7XG59XG5jb25zdCBhc0FueU9mID0gKGRlZiwgcmVmcykgPT4ge1xuICAgIGNvbnN0IGFueU9mID0gKGRlZi5vcHRpb25zIGluc3RhbmNlb2YgTWFwID8gQXJyYXkuZnJvbShkZWYub3B0aW9ucy52YWx1ZXMoKSkgOiBkZWYub3B0aW9ucylcbiAgICAgICAgLm1hcCgoeCwgaSkgPT4gcGFyc2VEZWYoeC5fZGVmLCB7XG4gICAgICAgIC4uLnJlZnMsXG4gICAgICAgIGN1cnJlbnRQYXRoOiBbLi4ucmVmcy5jdXJyZW50UGF0aCwgJ2FueU9mJywgYCR7aX1gXSxcbiAgICB9KSlcbiAgICAgICAgLmZpbHRlcigoeCkgPT4gISF4ICYmICghcmVmcy5zdHJpY3RVbmlvbnMgfHwgKHR5cGVvZiB4ID09PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cyh4KS5sZW5ndGggPiAwKSkpO1xuICAgIHJldHVybiBhbnlPZi5sZW5ndGggPyB7IGFueU9mIH0gOiB1bmRlZmluZWQ7XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dW5pb24ubWpzLm1hcCIsImltcG9ydCB7IHBhcnNlRGVmIH0gZnJvbSBcIi4uL3BhcnNlRGVmLm1qc1wiO1xuaW1wb3J0IHsgcHJpbWl0aXZlTWFwcGluZ3MgfSBmcm9tIFwiLi91bmlvbi5tanNcIjtcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZU51bGxhYmxlRGVmKGRlZiwgcmVmcykge1xuICAgIGlmIChbJ1pvZFN0cmluZycsICdab2ROdW1iZXInLCAnWm9kQmlnSW50JywgJ1pvZEJvb2xlYW4nLCAnWm9kTnVsbCddLmluY2x1ZGVzKGRlZi5pbm5lclR5cGUuX2RlZi50eXBlTmFtZSkgJiZcbiAgICAgICAgKCFkZWYuaW5uZXJUeXBlLl9kZWYuY2hlY2tzIHx8ICFkZWYuaW5uZXJUeXBlLl9kZWYuY2hlY2tzLmxlbmd0aCkpIHtcbiAgICAgICAgaWYgKHJlZnMudGFyZ2V0ID09PSAnb3BlbkFwaTMnIHx8IHJlZnMubnVsbGFibGVTdHJhdGVneSA9PT0gJ3Byb3BlcnR5Jykge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBwcmltaXRpdmVNYXBwaW5nc1tkZWYuaW5uZXJUeXBlLl9kZWYudHlwZU5hbWVdLFxuICAgICAgICAgICAgICAgIG51bGxhYmxlOiB0cnVlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogW3ByaW1pdGl2ZU1hcHBpbmdzW2RlZi5pbm5lclR5cGUuX2RlZi50eXBlTmFtZV0sICdudWxsJ10sXG4gICAgICAgIH07XG4gICAgfVxuICAgIGlmIChyZWZzLnRhcmdldCA9PT0gJ29wZW5BcGkzJykge1xuICAgICAgICBjb25zdCBiYXNlID0gcGFyc2VEZWYoZGVmLmlubmVyVHlwZS5fZGVmLCB7XG4gICAgICAgICAgICAuLi5yZWZzLFxuICAgICAgICAgICAgY3VycmVudFBhdGg6IFsuLi5yZWZzLmN1cnJlbnRQYXRoXSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChiYXNlICYmICckcmVmJyBpbiBiYXNlKVxuICAgICAgICAgICAgcmV0dXJuIHsgYWxsT2Y6IFtiYXNlXSwgbnVsbGFibGU6IHRydWUgfTtcbiAgICAgICAgcmV0dXJuIGJhc2UgJiYgeyAuLi5iYXNlLCBudWxsYWJsZTogdHJ1ZSB9O1xuICAgIH1cbiAgICBjb25zdCBiYXNlID0gcGFyc2VEZWYoZGVmLmlubmVyVHlwZS5fZGVmLCB7XG4gICAgICAgIC4uLnJlZnMsXG4gICAgICAgIGN1cnJlbnRQYXRoOiBbLi4ucmVmcy5jdXJyZW50UGF0aCwgJ2FueU9mJywgJzAnXSxcbiAgICB9KTtcbiAgICByZXR1cm4gYmFzZSAmJiB7IGFueU9mOiBbYmFzZSwgeyB0eXBlOiAnbnVsbCcgfV0gfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW51bGxhYmxlLm1qcy5tYXAiLCJpbXBvcnQgeyBhZGRFcnJvck1lc3NhZ2UsIHNldFJlc3BvbnNlVmFsdWVBbmRFcnJvcnMgfSBmcm9tIFwiLi4vZXJyb3JNZXNzYWdlcy5tanNcIjtcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZU51bWJlckRlZihkZWYsIHJlZnMpIHtcbiAgICBjb25zdCByZXMgPSB7XG4gICAgICAgIHR5cGU6ICdudW1iZXInLFxuICAgIH07XG4gICAgaWYgKCFkZWYuY2hlY2tzKVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIGZvciAoY29uc3QgY2hlY2sgb2YgZGVmLmNoZWNrcykge1xuICAgICAgICBzd2l0Y2ggKGNoZWNrLmtpbmQpIHtcbiAgICAgICAgICAgIGNhc2UgJ2ludCc6XG4gICAgICAgICAgICAgICAgcmVzLnR5cGUgPSAnaW50ZWdlcic7XG4gICAgICAgICAgICAgICAgYWRkRXJyb3JNZXNzYWdlKHJlcywgJ3R5cGUnLCBjaGVjay5tZXNzYWdlLCByZWZzKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ21pbic6XG4gICAgICAgICAgICAgICAgaWYgKHJlZnMudGFyZ2V0ID09PSAnanNvblNjaGVtYTcnKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGVjay5pbmNsdXNpdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFJlc3BvbnNlVmFsdWVBbmRFcnJvcnMocmVzLCAnbWluaW11bScsIGNoZWNrLnZhbHVlLCBjaGVjay5tZXNzYWdlLCByZWZzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFJlc3BvbnNlVmFsdWVBbmRFcnJvcnMocmVzLCAnZXhjbHVzaXZlTWluaW11bScsIGNoZWNrLnZhbHVlLCBjaGVjay5tZXNzYWdlLCByZWZzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGVjay5pbmNsdXNpdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5leGNsdXNpdmVNaW5pbXVtID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBzZXRSZXNwb25zZVZhbHVlQW5kRXJyb3JzKHJlcywgJ21pbmltdW0nLCBjaGVjay52YWx1ZSwgY2hlY2subWVzc2FnZSwgcmVmcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbWF4JzpcbiAgICAgICAgICAgICAgICBpZiAocmVmcy50YXJnZXQgPT09ICdqc29uU2NoZW1hNycpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoZWNrLmluY2x1c2l2ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0UmVzcG9uc2VWYWx1ZUFuZEVycm9ycyhyZXMsICdtYXhpbXVtJywgY2hlY2sudmFsdWUsIGNoZWNrLm1lc3NhZ2UsIHJlZnMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0UmVzcG9uc2VWYWx1ZUFuZEVycm9ycyhyZXMsICdleGNsdXNpdmVNYXhpbXVtJywgY2hlY2sudmFsdWUsIGNoZWNrLm1lc3NhZ2UsIHJlZnMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNoZWNrLmluY2x1c2l2ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzLmV4Y2x1c2l2ZU1heGltdW0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHNldFJlc3BvbnNlVmFsdWVBbmRFcnJvcnMocmVzLCAnbWF4aW11bScsIGNoZWNrLnZhbHVlLCBjaGVjay5tZXNzYWdlLCByZWZzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdtdWx0aXBsZU9mJzpcbiAgICAgICAgICAgICAgICBzZXRSZXNwb25zZVZhbHVlQW5kRXJyb3JzKHJlcywgJ211bHRpcGxlT2YnLCBjaGVjay52YWx1ZSwgY2hlY2subWVzc2FnZSwgcmVmcyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW51bWJlci5tanMubWFwIiwiaW1wb3J0IHsgcGFyc2VEZWYgfSBmcm9tIFwiLi4vcGFyc2VEZWYubWpzXCI7XG5mdW5jdGlvbiBkZWNpZGVBZGRpdGlvbmFsUHJvcGVydGllcyhkZWYsIHJlZnMpIHtcbiAgICBpZiAocmVmcy5yZW1vdmVBZGRpdGlvbmFsU3RyYXRlZ3kgPT09ICdzdHJpY3QnKSB7XG4gICAgICAgIHJldHVybiBkZWYuY2F0Y2hhbGwuX2RlZi50eXBlTmFtZSA9PT0gJ1pvZE5ldmVyJyA/XG4gICAgICAgICAgICBkZWYudW5rbm93bktleXMgIT09ICdzdHJpY3QnXG4gICAgICAgICAgICA6IHBhcnNlRGVmKGRlZi5jYXRjaGFsbC5fZGVmLCB7XG4gICAgICAgICAgICAgICAgLi4ucmVmcyxcbiAgICAgICAgICAgICAgICBjdXJyZW50UGF0aDogWy4uLnJlZnMuY3VycmVudFBhdGgsICdhZGRpdGlvbmFsUHJvcGVydGllcyddLFxuICAgICAgICAgICAgfSkgPz8gdHJ1ZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBkZWYuY2F0Y2hhbGwuX2RlZi50eXBlTmFtZSA9PT0gJ1pvZE5ldmVyJyA/XG4gICAgICAgICAgICBkZWYudW5rbm93bktleXMgPT09ICdwYXNzdGhyb3VnaCdcbiAgICAgICAgICAgIDogcGFyc2VEZWYoZGVmLmNhdGNoYWxsLl9kZWYsIHtcbiAgICAgICAgICAgICAgICAuLi5yZWZzLFxuICAgICAgICAgICAgICAgIGN1cnJlbnRQYXRoOiBbLi4ucmVmcy5jdXJyZW50UGF0aCwgJ2FkZGl0aW9uYWxQcm9wZXJ0aWVzJ10sXG4gICAgICAgICAgICB9KSA/PyB0cnVlO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZU9iamVjdERlZihkZWYsIHJlZnMpIHtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgIHR5cGU6ICdvYmplY3QnLFxuICAgICAgICAuLi5PYmplY3QuZW50cmllcyhkZWYuc2hhcGUoKSkucmVkdWNlKChhY2MsIFtwcm9wTmFtZSwgcHJvcERlZl0pID0+IHtcbiAgICAgICAgICAgIGlmIChwcm9wRGVmID09PSB1bmRlZmluZWQgfHwgcHJvcERlZi5fZGVmID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgICAgIGNvbnN0IHByb3BlcnR5UGF0aCA9IFsuLi5yZWZzLmN1cnJlbnRQYXRoLCAncHJvcGVydGllcycsIHByb3BOYW1lXTtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZERlZiA9IHBhcnNlRGVmKHByb3BEZWYuX2RlZiwge1xuICAgICAgICAgICAgICAgIC4uLnJlZnMsXG4gICAgICAgICAgICAgICAgY3VycmVudFBhdGg6IHByb3BlcnR5UGF0aCxcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eVBhdGgsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChwYXJzZWREZWYgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICAgICAgaWYgKHJlZnMub3BlbmFpU3RyaWN0TW9kZSAmJlxuICAgICAgICAgICAgICAgIHByb3BEZWYuaXNPcHRpb25hbCgpICYmXG4gICAgICAgICAgICAgICAgIXByb3BEZWYuaXNOdWxsYWJsZSgpICYmXG4gICAgICAgICAgICAgICAgdHlwZW9mIHByb3BEZWYuX2RlZj8uZGVmYXVsdFZhbHVlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgWm9kIGZpZWxkIGF0IFxcYCR7cHJvcGVydHlQYXRoLmpvaW4oJy8nKX1cXGAgdXNlcyBcXGAub3B0aW9uYWwoKVxcYCB3aXRob3V0IFxcYC5udWxsYWJsZSgpXFxgIHdoaWNoIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIEFQSS4gU2VlOiBodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9ndWlkZXMvc3RydWN0dXJlZC1vdXRwdXRzP2FwaS1tb2RlPXJlc3BvbnNlcyNhbGwtZmllbGRzLW11c3QtYmUtcmVxdWlyZWRgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgICAgICAgICAuLi5hY2MucHJvcGVydGllcyxcbiAgICAgICAgICAgICAgICAgICAgW3Byb3BOYW1lXTogcGFyc2VkRGVmLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHByb3BEZWYuaXNPcHRpb25hbCgpICYmICFyZWZzLm9wZW5haVN0cmljdE1vZGUgPyBhY2MucmVxdWlyZWQgOiBbLi4uYWNjLnJlcXVpcmVkLCBwcm9wTmFtZV0sXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LCB7IHByb3BlcnRpZXM6IHt9LCByZXF1aXJlZDogW10gfSksXG4gICAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBkZWNpZGVBZGRpdGlvbmFsUHJvcGVydGllcyhkZWYsIHJlZnMpLFxuICAgIH07XG4gICAgaWYgKCFyZXN1bHQucmVxdWlyZWQubGVuZ3RoKVxuICAgICAgICBkZWxldGUgcmVzdWx0LnJlcXVpcmVkO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1vYmplY3QubWpzLm1hcCIsImltcG9ydCB7IHBhcnNlRGVmIH0gZnJvbSBcIi4uL3BhcnNlRGVmLm1qc1wiO1xuZXhwb3J0IGNvbnN0IHBhcnNlT3B0aW9uYWxEZWYgPSAoZGVmLCByZWZzKSA9PiB7XG4gICAgaWYgKHJlZnMuY3VycmVudFBhdGgudG9TdHJpbmcoKSA9PT0gcmVmcy5wcm9wZXJ0eVBhdGg/LnRvU3RyaW5nKCkpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlRGVmKGRlZi5pbm5lclR5cGUuX2RlZiwgcmVmcyk7XG4gICAgfVxuICAgIGNvbnN0IGlubmVyU2NoZW1hID0gcGFyc2VEZWYoZGVmLmlubmVyVHlwZS5fZGVmLCB7XG4gICAgICAgIC4uLnJlZnMsXG4gICAgICAgIGN1cnJlbnRQYXRoOiBbLi4ucmVmcy5jdXJyZW50UGF0aCwgJ2FueU9mJywgJzEnXSxcbiAgICB9KTtcbiAgICByZXR1cm4gaW5uZXJTY2hlbWEgP1xuICAgICAgICB7XG4gICAgICAgICAgICBhbnlPZjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbm90OiB7fSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGlubmVyU2NoZW1hLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgfVxuICAgICAgICA6IHt9O1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW9wdGlvbmFsLm1qcy5tYXAiLCJpbXBvcnQgeyBwYXJzZURlZiB9IGZyb20gXCIuLi9wYXJzZURlZi5tanNcIjtcbmV4cG9ydCBjb25zdCBwYXJzZVBpcGVsaW5lRGVmID0gKGRlZiwgcmVmcykgPT4ge1xuICAgIGlmIChyZWZzLnBpcGVTdHJhdGVneSA9PT0gJ2lucHV0Jykge1xuICAgICAgICByZXR1cm4gcGFyc2VEZWYoZGVmLmluLl9kZWYsIHJlZnMpO1xuICAgIH1cbiAgICBlbHNlIGlmIChyZWZzLnBpcGVTdHJhdGVneSA9PT0gJ291dHB1dCcpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlRGVmKGRlZi5vdXQuX2RlZiwgcmVmcyk7XG4gICAgfVxuICAgIGNvbnN0IGEgPSBwYXJzZURlZihkZWYuaW4uX2RlZiwge1xuICAgICAgICAuLi5yZWZzLFxuICAgICAgICBjdXJyZW50UGF0aDogWy4uLnJlZnMuY3VycmVudFBhdGgsICdhbGxPZicsICcwJ10sXG4gICAgfSk7XG4gICAgY29uc3QgYiA9IHBhcnNlRGVmKGRlZi5vdXQuX2RlZiwge1xuICAgICAgICAuLi5yZWZzLFxuICAgICAgICBjdXJyZW50UGF0aDogWy4uLnJlZnMuY3VycmVudFBhdGgsICdhbGxPZicsIGEgPyAnMScgOiAnMCddLFxuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICAgIGFsbE9mOiBbYSwgYl0uZmlsdGVyKCh4KSA9PiB4ICE9PSB1bmRlZmluZWQpLFxuICAgIH07XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cGlwZWxpbmUubWpzLm1hcCIsImltcG9ydCB7IHBhcnNlRGVmIH0gZnJvbSBcIi4uL3BhcnNlRGVmLm1qc1wiO1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUHJvbWlzZURlZihkZWYsIHJlZnMpIHtcbiAgICByZXR1cm4gcGFyc2VEZWYoZGVmLnR5cGUuX2RlZiwgcmVmcyk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wcm9taXNlLm1qcy5tYXAiLCJpbXBvcnQgeyBzZXRSZXNwb25zZVZhbHVlQW5kRXJyb3JzIH0gZnJvbSBcIi4uL2Vycm9yTWVzc2FnZXMubWpzXCI7XG5pbXBvcnQgeyBwYXJzZURlZiB9IGZyb20gXCIuLi9wYXJzZURlZi5tanNcIjtcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVNldERlZihkZWYsIHJlZnMpIHtcbiAgICBjb25zdCBpdGVtcyA9IHBhcnNlRGVmKGRlZi52YWx1ZVR5cGUuX2RlZiwge1xuICAgICAgICAuLi5yZWZzLFxuICAgICAgICBjdXJyZW50UGF0aDogWy4uLnJlZnMuY3VycmVudFBhdGgsICdpdGVtcyddLFxuICAgIH0pO1xuICAgIGNvbnN0IHNjaGVtYSA9IHtcbiAgICAgICAgdHlwZTogJ2FycmF5JyxcbiAgICAgICAgdW5pcXVlSXRlbXM6IHRydWUsXG4gICAgICAgIGl0ZW1zLFxuICAgIH07XG4gICAgaWYgKGRlZi5taW5TaXplKSB7XG4gICAgICAgIHNldFJlc3BvbnNlVmFsdWVBbmRFcnJvcnMoc2NoZW1hLCAnbWluSXRlbXMnLCBkZWYubWluU2l6ZS52YWx1ZSwgZGVmLm1pblNpemUubWVzc2FnZSwgcmVmcyk7XG4gICAgfVxuICAgIGlmIChkZWYubWF4U2l6ZSkge1xuICAgICAgICBzZXRSZXNwb25zZVZhbHVlQW5kRXJyb3JzKHNjaGVtYSwgJ21heEl0ZW1zJywgZGVmLm1heFNpemUudmFsdWUsIGRlZi5tYXhTaXplLm1lc3NhZ2UsIHJlZnMpO1xuICAgIH1cbiAgICByZXR1cm4gc2NoZW1hO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2V0Lm1qcy5tYXAiLCJpbXBvcnQgeyBwYXJzZURlZiB9IGZyb20gXCIuLi9wYXJzZURlZi5tanNcIjtcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVR1cGxlRGVmKGRlZiwgcmVmcykge1xuICAgIGlmIChkZWYucmVzdCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogJ2FycmF5JyxcbiAgICAgICAgICAgIG1pbkl0ZW1zOiBkZWYuaXRlbXMubGVuZ3RoLFxuICAgICAgICAgICAgaXRlbXM6IGRlZi5pdGVtc1xuICAgICAgICAgICAgICAgIC5tYXAoKHgsIGkpID0+IHBhcnNlRGVmKHguX2RlZiwge1xuICAgICAgICAgICAgICAgIC4uLnJlZnMsXG4gICAgICAgICAgICAgICAgY3VycmVudFBhdGg6IFsuLi5yZWZzLmN1cnJlbnRQYXRoLCAnaXRlbXMnLCBgJHtpfWBdLFxuICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgLnJlZHVjZSgoYWNjLCB4KSA9PiAoeCA9PT0gdW5kZWZpbmVkID8gYWNjIDogWy4uLmFjYywgeF0pLCBbXSksXG4gICAgICAgICAgICBhZGRpdGlvbmFsSXRlbXM6IHBhcnNlRGVmKGRlZi5yZXN0Ll9kZWYsIHtcbiAgICAgICAgICAgICAgICAuLi5yZWZzLFxuICAgICAgICAgICAgICAgIGN1cnJlbnRQYXRoOiBbLi4ucmVmcy5jdXJyZW50UGF0aCwgJ2FkZGl0aW9uYWxJdGVtcyddLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogJ2FycmF5JyxcbiAgICAgICAgICAgIG1pbkl0ZW1zOiBkZWYuaXRlbXMubGVuZ3RoLFxuICAgICAgICAgICAgbWF4SXRlbXM6IGRlZi5pdGVtcy5sZW5ndGgsXG4gICAgICAgICAgICBpdGVtczogZGVmLml0ZW1zXG4gICAgICAgICAgICAgICAgLm1hcCgoeCwgaSkgPT4gcGFyc2VEZWYoeC5fZGVmLCB7XG4gICAgICAgICAgICAgICAgLi4ucmVmcyxcbiAgICAgICAgICAgICAgICBjdXJyZW50UGF0aDogWy4uLnJlZnMuY3VycmVudFBhdGgsICdpdGVtcycsIGAke2l9YF0sXG4gICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAucmVkdWNlKChhY2MsIHgpID0+ICh4ID09PSB1bmRlZmluZWQgPyBhY2MgOiBbLi4uYWNjLCB4XSksIFtdKSxcbiAgICAgICAgfTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD10dXBsZS5tanMubWFwIiwiZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVW5kZWZpbmVkRGVmKCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIG5vdDoge30sXG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXVuZGVmaW5lZC5tanMubWFwIiwiZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVW5rbm93bkRlZigpIHtcbiAgICByZXR1cm4ge307XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD11bmtub3duLm1qcy5tYXAiLCJpbXBvcnQgeyBwYXJzZURlZiB9IGZyb20gXCIuLi9wYXJzZURlZi5tanNcIjtcbmV4cG9ydCBjb25zdCBwYXJzZVJlYWRvbmx5RGVmID0gKGRlZiwgcmVmcykgPT4ge1xuICAgIHJldHVybiBwYXJzZURlZihkZWYuaW5uZXJUeXBlLl9kZWYsIHJlZnMpO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlYWRvbmx5Lm1qcy5tYXAiLCJpbXBvcnQgeyBab2RGaXJzdFBhcnR5VHlwZUtpbmQgfSBmcm9tICd6b2QnO1xuaW1wb3J0IHsgcGFyc2VBbnlEZWYgfSBmcm9tIFwiLi9wYXJzZXJzL2FueS5tanNcIjtcbmltcG9ydCB7IHBhcnNlQXJyYXlEZWYgfSBmcm9tIFwiLi9wYXJzZXJzL2FycmF5Lm1qc1wiO1xuaW1wb3J0IHsgcGFyc2VCaWdpbnREZWYgfSBmcm9tIFwiLi9wYXJzZXJzL2JpZ2ludC5tanNcIjtcbmltcG9ydCB7IHBhcnNlQm9vbGVhbkRlZiB9IGZyb20gXCIuL3BhcnNlcnMvYm9vbGVhbi5tanNcIjtcbmltcG9ydCB7IHBhcnNlQnJhbmRlZERlZiB9IGZyb20gXCIuL3BhcnNlcnMvYnJhbmRlZC5tanNcIjtcbmltcG9ydCB7IHBhcnNlQ2F0Y2hEZWYgfSBmcm9tIFwiLi9wYXJzZXJzL2NhdGNoLm1qc1wiO1xuaW1wb3J0IHsgcGFyc2VEYXRlRGVmIH0gZnJvbSBcIi4vcGFyc2Vycy9kYXRlLm1qc1wiO1xuaW1wb3J0IHsgcGFyc2VEZWZhdWx0RGVmIH0gZnJvbSBcIi4vcGFyc2Vycy9kZWZhdWx0Lm1qc1wiO1xuaW1wb3J0IHsgcGFyc2VFZmZlY3RzRGVmIH0gZnJvbSBcIi4vcGFyc2Vycy9lZmZlY3RzLm1qc1wiO1xuaW1wb3J0IHsgcGFyc2VFbnVtRGVmIH0gZnJvbSBcIi4vcGFyc2Vycy9lbnVtLm1qc1wiO1xuaW1wb3J0IHsgcGFyc2VJbnRlcnNlY3Rpb25EZWYgfSBmcm9tIFwiLi9wYXJzZXJzL2ludGVyc2VjdGlvbi5tanNcIjtcbmltcG9ydCB7IHBhcnNlTGl0ZXJhbERlZiB9IGZyb20gXCIuL3BhcnNlcnMvbGl0ZXJhbC5tanNcIjtcbmltcG9ydCB7IHBhcnNlTWFwRGVmIH0gZnJvbSBcIi4vcGFyc2Vycy9tYXAubWpzXCI7XG5pbXBvcnQgeyBwYXJzZU5hdGl2ZUVudW1EZWYgfSBmcm9tIFwiLi9wYXJzZXJzL25hdGl2ZUVudW0ubWpzXCI7XG5pbXBvcnQgeyBwYXJzZU5ldmVyRGVmIH0gZnJvbSBcIi4vcGFyc2Vycy9uZXZlci5tanNcIjtcbmltcG9ydCB7IHBhcnNlTnVsbERlZiB9IGZyb20gXCIuL3BhcnNlcnMvbnVsbC5tanNcIjtcbmltcG9ydCB7IHBhcnNlTnVsbGFibGVEZWYgfSBmcm9tIFwiLi9wYXJzZXJzL251bGxhYmxlLm1qc1wiO1xuaW1wb3J0IHsgcGFyc2VOdW1iZXJEZWYgfSBmcm9tIFwiLi9wYXJzZXJzL251bWJlci5tanNcIjtcbmltcG9ydCB7IHBhcnNlT2JqZWN0RGVmIH0gZnJvbSBcIi4vcGFyc2Vycy9vYmplY3QubWpzXCI7XG5pbXBvcnQgeyBwYXJzZU9wdGlvbmFsRGVmIH0gZnJvbSBcIi4vcGFyc2Vycy9vcHRpb25hbC5tanNcIjtcbmltcG9ydCB7IHBhcnNlUGlwZWxpbmVEZWYgfSBmcm9tIFwiLi9wYXJzZXJzL3BpcGVsaW5lLm1qc1wiO1xuaW1wb3J0IHsgcGFyc2VQcm9taXNlRGVmIH0gZnJvbSBcIi4vcGFyc2Vycy9wcm9taXNlLm1qc1wiO1xuaW1wb3J0IHsgcGFyc2VSZWNvcmREZWYgfSBmcm9tIFwiLi9wYXJzZXJzL3JlY29yZC5tanNcIjtcbmltcG9ydCB7IHBhcnNlU2V0RGVmIH0gZnJvbSBcIi4vcGFyc2Vycy9zZXQubWpzXCI7XG5pbXBvcnQgeyBwYXJzZVN0cmluZ0RlZiB9IGZyb20gXCIuL3BhcnNlcnMvc3RyaW5nLm1qc1wiO1xuaW1wb3J0IHsgcGFyc2VUdXBsZURlZiB9IGZyb20gXCIuL3BhcnNlcnMvdHVwbGUubWpzXCI7XG5pbXBvcnQgeyBwYXJzZVVuZGVmaW5lZERlZiB9IGZyb20gXCIuL3BhcnNlcnMvdW5kZWZpbmVkLm1qc1wiO1xuaW1wb3J0IHsgcGFyc2VVbmlvbkRlZiB9IGZyb20gXCIuL3BhcnNlcnMvdW5pb24ubWpzXCI7XG5pbXBvcnQgeyBwYXJzZVVua25vd25EZWYgfSBmcm9tIFwiLi9wYXJzZXJzL3Vua25vd24ubWpzXCI7XG5pbXBvcnQgeyBwYXJzZVJlYWRvbmx5RGVmIH0gZnJvbSBcIi4vcGFyc2Vycy9yZWFkb25seS5tanNcIjtcbmltcG9ydCB7IGlnbm9yZU92ZXJyaWRlIH0gZnJvbSBcIi4vT3B0aW9ucy5tanNcIjtcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZURlZihkZWYsIHJlZnMsIGZvcmNlUmVzb2x1dGlvbiA9IGZhbHNlKSB7XG4gICAgY29uc3Qgc2Vlbkl0ZW0gPSByZWZzLnNlZW4uZ2V0KGRlZik7XG4gICAgaWYgKHJlZnMub3ZlcnJpZGUpIHtcbiAgICAgICAgY29uc3Qgb3ZlcnJpZGVSZXN1bHQgPSByZWZzLm92ZXJyaWRlPy4oZGVmLCByZWZzLCBzZWVuSXRlbSwgZm9yY2VSZXNvbHV0aW9uKTtcbiAgICAgICAgaWYgKG92ZXJyaWRlUmVzdWx0ICE9PSBpZ25vcmVPdmVycmlkZSkge1xuICAgICAgICAgICAgcmV0dXJuIG92ZXJyaWRlUmVzdWx0O1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChzZWVuSXRlbSAmJiAhZm9yY2VSZXNvbHV0aW9uKSB7XG4gICAgICAgIGNvbnN0IHNlZW5TY2hlbWEgPSBnZXQkcmVmKHNlZW5JdGVtLCByZWZzKTtcbiAgICAgICAgaWYgKHNlZW5TY2hlbWEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaWYgKCckcmVmJyBpbiBzZWVuU2NoZW1hKSB7XG4gICAgICAgICAgICAgICAgcmVmcy5zZWVuUmVmcy5hZGQoc2VlblNjaGVtYS4kcmVmKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzZWVuU2NoZW1hO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG5ld0l0ZW0gPSB7IGRlZiwgcGF0aDogcmVmcy5jdXJyZW50UGF0aCwganNvblNjaGVtYTogdW5kZWZpbmVkIH07XG4gICAgcmVmcy5zZWVuLnNldChkZWYsIG5ld0l0ZW0pO1xuICAgIGNvbnN0IGpzb25TY2hlbWEgPSBzZWxlY3RQYXJzZXIoZGVmLCBkZWYudHlwZU5hbWUsIHJlZnMsIGZvcmNlUmVzb2x1dGlvbik7XG4gICAgaWYgKGpzb25TY2hlbWEpIHtcbiAgICAgICAgYWRkTWV0YShkZWYsIHJlZnMsIGpzb25TY2hlbWEpO1xuICAgIH1cbiAgICBuZXdJdGVtLmpzb25TY2hlbWEgPSBqc29uU2NoZW1hO1xuICAgIHJldHVybiBqc29uU2NoZW1hO1xufVxuY29uc3QgZ2V0JHJlZiA9IChpdGVtLCByZWZzKSA9PiB7XG4gICAgc3dpdGNoIChyZWZzLiRyZWZTdHJhdGVneSkge1xuICAgICAgICBjYXNlICdyb290JzpcbiAgICAgICAgICAgIHJldHVybiB7ICRyZWY6IGl0ZW0ucGF0aC5qb2luKCcvJykgfTtcbiAgICAgICAgLy8gdGhpcyBjYXNlIGlzIG5lZWRlZCBhcyBPcGVuQUkgc3RyaWN0IG1vZGUgZG9lc24ndCBzdXBwb3J0IHRvcC1sZXZlbCBgJHJlZmBzLCBpLmUuXG4gICAgICAgIC8vIHRoZSB0b3AtbGV2ZWwgc2NoZW1hICptdXN0KiBiZSBge1widHlwZVwiOiBcIm9iamVjdFwiLCBcInByb3BlcnRpZXNcIjogey4uLn19YCBidXQgaWYgd2UgZXZlclxuICAgICAgICAvLyBuZWVkIHRvIGRlZmluZSBhIGAkcmVmYCwgcmVsYXRpdmUgYCRyZWZgcyBhcmVuJ3Qgc3VwcG9ydGVkLCBzbyB3ZSBuZWVkIHRvIGV4dHJhY3RcbiAgICAgICAgLy8gdGhlIHNjaGVtYSB0byBgIy9kZWZpbml0aW9ucy9gIGFuZCByZWZlcmVuY2UgdGhhdC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gZS5nLiBpZiB3ZSBuZWVkIHRvIHJlZmVyZW5jZSBhIHNjaGVtYSBhdFxuICAgICAgICAvLyBgW1wiI1wiLFwiZGVmaW5pdGlvbnNcIixcImNvbnRhY3RQZXJzb25cIixcInByb3BlcnRpZXNcIixcInBlcnNvbjFcIixcInByb3BlcnRpZXNcIixcIm5hbWVcIl1gXG4gICAgICAgIC8vIHRoZW4gd2UnbGwgZXh0cmFjdCBpdCBvdXQgdG8gYGNvbnRhY3RQZXJzb25fcHJvcGVydGllc19wZXJzb24xX3Byb3BlcnRpZXNfbmFtZWBcbiAgICAgICAgY2FzZSAnZXh0cmFjdC10by1yb290JzpcbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBpdGVtLnBhdGguc2xpY2UocmVmcy5iYXNlUGF0aC5sZW5ndGggKyAxKS5qb2luKCdfJyk7XG4gICAgICAgICAgICAvLyB3ZSBkb24ndCBuZWVkIHRvIGV4dHJhY3QgdGhlIHJvb3Qgc2NoZW1hIGluIHRoaXMgY2FzZSwgYXMgaXQncyBhbHJlYWR5XG4gICAgICAgICAgICAvLyBiZWVuIGFkZGVkIHRvIHRoZSBkZWZpbml0aW9uc1xuICAgICAgICAgICAgaWYgKG5hbWUgIT09IHJlZnMubmFtZSAmJiByZWZzLm5hbWVTdHJhdGVneSA9PT0gJ2R1cGxpY2F0ZS1yZWYnKSB7XG4gICAgICAgICAgICAgICAgcmVmcy5kZWZpbml0aW9uc1tuYW1lXSA9IGl0ZW0uZGVmO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHsgJHJlZjogWy4uLnJlZnMuYmFzZVBhdGgsIHJlZnMuZGVmaW5pdGlvblBhdGgsIG5hbWVdLmpvaW4oJy8nKSB9O1xuICAgICAgICBjYXNlICdyZWxhdGl2ZSc6XG4gICAgICAgICAgICByZXR1cm4geyAkcmVmOiBnZXRSZWxhdGl2ZVBhdGgocmVmcy5jdXJyZW50UGF0aCwgaXRlbS5wYXRoKSB9O1xuICAgICAgICBjYXNlICdub25lJzpcbiAgICAgICAgY2FzZSAnc2Vlbic6IHtcbiAgICAgICAgICAgIGlmIChpdGVtLnBhdGgubGVuZ3RoIDwgcmVmcy5jdXJyZW50UGF0aC5sZW5ndGggJiZcbiAgICAgICAgICAgICAgICBpdGVtLnBhdGguZXZlcnkoKHZhbHVlLCBpbmRleCkgPT4gcmVmcy5jdXJyZW50UGF0aFtpbmRleF0gPT09IHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgUmVjdXJzaXZlIHJlZmVyZW5jZSBkZXRlY3RlZCBhdCAke3JlZnMuY3VycmVudFBhdGguam9pbignLycpfSEgRGVmYXVsdGluZyB0byBhbnlgKTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVmcy4kcmVmU3RyYXRlZ3kgPT09ICdzZWVuJyA/IHt9IDogdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfVxufTtcbmNvbnN0IGdldFJlbGF0aXZlUGF0aCA9IChwYXRoQSwgcGF0aEIpID0+IHtcbiAgICBsZXQgaSA9IDA7XG4gICAgZm9yICg7IGkgPCBwYXRoQS5sZW5ndGggJiYgaSA8IHBhdGhCLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChwYXRoQVtpXSAhPT0gcGF0aEJbaV0pXG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIFsocGF0aEEubGVuZ3RoIC0gaSkudG9TdHJpbmcoKSwgLi4ucGF0aEIuc2xpY2UoaSldLmpvaW4oJy8nKTtcbn07XG5jb25zdCBzZWxlY3RQYXJzZXIgPSAoZGVmLCB0eXBlTmFtZSwgcmVmcywgZm9yY2VSZXNvbHV0aW9uKSA9PiB7XG4gICAgc3dpdGNoICh0eXBlTmFtZSkge1xuICAgICAgICBjYXNlIFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RTdHJpbmc6XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VTdHJpbmdEZWYoZGVmLCByZWZzKTtcbiAgICAgICAgY2FzZSBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kTnVtYmVyOlxuICAgICAgICAgICAgcmV0dXJuIHBhcnNlTnVtYmVyRGVmKGRlZiwgcmVmcyk7XG4gICAgICAgIGNhc2UgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE9iamVjdDpcbiAgICAgICAgICAgIHJldHVybiBwYXJzZU9iamVjdERlZihkZWYsIHJlZnMpO1xuICAgICAgICBjYXNlIFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RCaWdJbnQ6XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VCaWdpbnREZWYoZGVmLCByZWZzKTtcbiAgICAgICAgY2FzZSBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kQm9vbGVhbjpcbiAgICAgICAgICAgIHJldHVybiBwYXJzZUJvb2xlYW5EZWYoKTtcbiAgICAgICAgY2FzZSBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kRGF0ZTpcbiAgICAgICAgICAgIHJldHVybiBwYXJzZURhdGVEZWYoZGVmLCByZWZzKTtcbiAgICAgICAgY2FzZSBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kVW5kZWZpbmVkOlxuICAgICAgICAgICAgcmV0dXJuIHBhcnNlVW5kZWZpbmVkRGVmKCk7XG4gICAgICAgIGNhc2UgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE51bGw6XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VOdWxsRGVmKHJlZnMpO1xuICAgICAgICBjYXNlIFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RBcnJheTpcbiAgICAgICAgICAgIHJldHVybiBwYXJzZUFycmF5RGVmKGRlZiwgcmVmcyk7XG4gICAgICAgIGNhc2UgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZFVuaW9uOlxuICAgICAgICBjYXNlIFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2REaXNjcmltaW5hdGVkVW5pb246XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VVbmlvbkRlZihkZWYsIHJlZnMpO1xuICAgICAgICBjYXNlIFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RJbnRlcnNlY3Rpb246XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VJbnRlcnNlY3Rpb25EZWYoZGVmLCByZWZzKTtcbiAgICAgICAgY2FzZSBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kVHVwbGU6XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VUdXBsZURlZihkZWYsIHJlZnMpO1xuICAgICAgICBjYXNlIFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RSZWNvcmQ6XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VSZWNvcmREZWYoZGVmLCByZWZzKTtcbiAgICAgICAgY2FzZSBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kTGl0ZXJhbDpcbiAgICAgICAgICAgIHJldHVybiBwYXJzZUxpdGVyYWxEZWYoZGVmLCByZWZzKTtcbiAgICAgICAgY2FzZSBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kRW51bTpcbiAgICAgICAgICAgIHJldHVybiBwYXJzZUVudW1EZWYoZGVmKTtcbiAgICAgICAgY2FzZSBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kTmF0aXZlRW51bTpcbiAgICAgICAgICAgIHJldHVybiBwYXJzZU5hdGl2ZUVudW1EZWYoZGVmKTtcbiAgICAgICAgY2FzZSBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kTnVsbGFibGU6XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VOdWxsYWJsZURlZihkZWYsIHJlZnMpO1xuICAgICAgICBjYXNlIFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RPcHRpb25hbDpcbiAgICAgICAgICAgIHJldHVybiBwYXJzZU9wdGlvbmFsRGVmKGRlZiwgcmVmcyk7XG4gICAgICAgIGNhc2UgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE1hcDpcbiAgICAgICAgICAgIHJldHVybiBwYXJzZU1hcERlZihkZWYsIHJlZnMpO1xuICAgICAgICBjYXNlIFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RTZXQ6XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VTZXREZWYoZGVmLCByZWZzKTtcbiAgICAgICAgY2FzZSBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kTGF6eTpcbiAgICAgICAgICAgIHJldHVybiBwYXJzZURlZihkZWYuZ2V0dGVyKCkuX2RlZiwgcmVmcyk7XG4gICAgICAgIGNhc2UgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZFByb21pc2U6XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VQcm9taXNlRGVmKGRlZiwgcmVmcyk7XG4gICAgICAgIGNhc2UgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE5hTjpcbiAgICAgICAgY2FzZSBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kTmV2ZXI6XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VOZXZlckRlZigpO1xuICAgICAgICBjYXNlIFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RFZmZlY3RzOlxuICAgICAgICAgICAgcmV0dXJuIHBhcnNlRWZmZWN0c0RlZihkZWYsIHJlZnMsIGZvcmNlUmVzb2x1dGlvbik7XG4gICAgICAgIGNhc2UgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEFueTpcbiAgICAgICAgICAgIHJldHVybiBwYXJzZUFueURlZigpO1xuICAgICAgICBjYXNlIFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RVbmtub3duOlxuICAgICAgICAgICAgcmV0dXJuIHBhcnNlVW5rbm93bkRlZigpO1xuICAgICAgICBjYXNlIFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2REZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIHBhcnNlRGVmYXVsdERlZihkZWYsIHJlZnMpO1xuICAgICAgICBjYXNlIFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RCcmFuZGVkOlxuICAgICAgICAgICAgcmV0dXJuIHBhcnNlQnJhbmRlZERlZihkZWYsIHJlZnMpO1xuICAgICAgICBjYXNlIFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RSZWFkb25seTpcbiAgICAgICAgICAgIHJldHVybiBwYXJzZVJlYWRvbmx5RGVmKGRlZiwgcmVmcyk7XG4gICAgICAgIGNhc2UgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZENhdGNoOlxuICAgICAgICAgICAgcmV0dXJuIHBhcnNlQ2F0Y2hEZWYoZGVmLCByZWZzKTtcbiAgICAgICAgY2FzZSBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kUGlwZWxpbmU6XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VQaXBlbGluZURlZihkZWYsIHJlZnMpO1xuICAgICAgICBjYXNlIFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RGdW5jdGlvbjpcbiAgICAgICAgY2FzZSBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kVm9pZDpcbiAgICAgICAgY2FzZSBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kU3ltYm9sOlxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiAoKF8pID0+IHVuZGVmaW5lZCkodHlwZU5hbWUpO1xuICAgIH1cbn07XG5jb25zdCBhZGRNZXRhID0gKGRlZiwgcmVmcywganNvblNjaGVtYSkgPT4ge1xuICAgIGlmIChkZWYuZGVzY3JpcHRpb24pIHtcbiAgICAgICAganNvblNjaGVtYS5kZXNjcmlwdGlvbiA9IGRlZi5kZXNjcmlwdGlvbjtcbiAgICAgICAgaWYgKHJlZnMubWFya2Rvd25EZXNjcmlwdGlvbikge1xuICAgICAgICAgICAganNvblNjaGVtYS5tYXJrZG93bkRlc2NyaXB0aW9uID0gZGVmLmRlc2NyaXB0aW9uO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBqc29uU2NoZW1hO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBhcnNlRGVmLm1qcy5tYXAiLCJpbXBvcnQgeyBwYXJzZURlZiB9IGZyb20gXCIuL3BhcnNlRGVmLm1qc1wiO1xuaW1wb3J0IHsgZ2V0UmVmcyB9IGZyb20gXCIuL1JlZnMubWpzXCI7XG5pbXBvcnQgeyB6b2REZWYsIGlzRW1wdHlPYmogfSBmcm9tIFwiLi91dGlsLm1qc1wiO1xuY29uc3Qgem9kVG9Kc29uU2NoZW1hID0gKHNjaGVtYSwgb3B0aW9ucykgPT4ge1xuICAgIGNvbnN0IHJlZnMgPSBnZXRSZWZzKG9wdGlvbnMpO1xuICAgIGNvbnN0IG5hbWUgPSB0eXBlb2Ygb3B0aW9ucyA9PT0gJ3N0cmluZycgPyBvcHRpb25zXG4gICAgICAgIDogb3B0aW9ucz8ubmFtZVN0cmF0ZWd5ID09PSAndGl0bGUnID8gdW5kZWZpbmVkXG4gICAgICAgICAgICA6IG9wdGlvbnM/Lm5hbWU7XG4gICAgY29uc3QgbWFpbiA9IHBhcnNlRGVmKHNjaGVtYS5fZGVmLCBuYW1lID09PSB1bmRlZmluZWQgPyByZWZzIDogKHtcbiAgICAgICAgLi4ucmVmcyxcbiAgICAgICAgY3VycmVudFBhdGg6IFsuLi5yZWZzLmJhc2VQYXRoLCByZWZzLmRlZmluaXRpb25QYXRoLCBuYW1lXSxcbiAgICB9KSwgZmFsc2UpID8/IHt9O1xuICAgIGNvbnN0IHRpdGxlID0gdHlwZW9mIG9wdGlvbnMgPT09ICdvYmplY3QnICYmIG9wdGlvbnMubmFtZSAhPT0gdW5kZWZpbmVkICYmIG9wdGlvbnMubmFtZVN0cmF0ZWd5ID09PSAndGl0bGUnID9cbiAgICAgICAgb3B0aW9ucy5uYW1lXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIGlmICh0aXRsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG1haW4udGl0bGUgPSB0aXRsZTtcbiAgICB9XG4gICAgY29uc3QgZGVmaW5pdGlvbnMgPSAoKCkgPT4ge1xuICAgICAgICBpZiAoaXNFbXB0eU9iaihyZWZzLmRlZmluaXRpb25zKSkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkZWZpbml0aW9ucyA9IHt9O1xuICAgICAgICBjb25zdCBwcm9jZXNzZWREZWZpbml0aW9ucyA9IG5ldyBTZXQoKTtcbiAgICAgICAgLy8gdGhlIGNhbGwgdG8gYHBhcnNlRGVmKClgIGhlcmUgbWlnaHQgaXRzZWxmIGFkZCBtb3JlIGVudHJpZXMgdG8gYC5kZWZpbml0aW9uc2BcbiAgICAgICAgLy8gc28gd2UgbmVlZCB0byBjb250aW51YWxseSBldmFsdWF0ZSBkZWZpbml0aW9ucyB1bnRpbCB3ZSd2ZSByZXNvbHZlZCBhbGwgb2YgdGhlbVxuICAgICAgICAvL1xuICAgICAgICAvLyB3ZSBoYXZlIGEgZ2VuZXJvdXMgaXRlcmF0aW9uIGxpbWl0IGhlcmUgdG8gYXZvaWQgYmxvd2luZyB1cCB0aGUgc3RhY2sgaWYgdGhlcmVcbiAgICAgICAgLy8gYXJlIGFueSBidWdzIHRoYXQgd291bGQgb3RoZXJ3aXNlIHJlc3VsdCBpbiB1cyBpdGVyYXRpbmcgaW5kZWZpbml0ZWx5XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNTAwOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld0RlZmluaXRpb25zID0gT2JqZWN0LmVudHJpZXMocmVmcy5kZWZpbml0aW9ucykuZmlsdGVyKChba2V5XSkgPT4gIXByb2Nlc3NlZERlZmluaXRpb25zLmhhcyhrZXkpKTtcbiAgICAgICAgICAgIGlmIChuZXdEZWZpbml0aW9ucy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHNjaGVtYV0gb2YgbmV3RGVmaW5pdGlvbnMpIHtcbiAgICAgICAgICAgICAgICBkZWZpbml0aW9uc1trZXldID1cbiAgICAgICAgICAgICAgICAgICAgcGFyc2VEZWYoem9kRGVmKHNjaGVtYSksIHsgLi4ucmVmcywgY3VycmVudFBhdGg6IFsuLi5yZWZzLmJhc2VQYXRoLCByZWZzLmRlZmluaXRpb25QYXRoLCBrZXldIH0sIHRydWUpID8/IHt9O1xuICAgICAgICAgICAgICAgIHByb2Nlc3NlZERlZmluaXRpb25zLmFkZChrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWZpbml0aW9ucztcbiAgICB9KSgpO1xuICAgIGNvbnN0IGNvbWJpbmVkID0gbmFtZSA9PT0gdW5kZWZpbmVkID9cbiAgICAgICAgZGVmaW5pdGlvbnMgP1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC4uLm1haW4sXG4gICAgICAgICAgICAgICAgW3JlZnMuZGVmaW5pdGlvblBhdGhdOiBkZWZpbml0aW9ucyxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDogbWFpblxuICAgICAgICA6IHJlZnMubmFtZVN0cmF0ZWd5ID09PSAnZHVwbGljYXRlLXJlZicgP1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC4uLm1haW4sXG4gICAgICAgICAgICAgICAgLi4uKGRlZmluaXRpb25zIHx8IHJlZnMuc2VlblJlZnMuc2l6ZSA/XG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyZWZzLmRlZmluaXRpb25QYXRoXToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmRlZmluaXRpb25zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgYWN0dWFsbHkgZHVwbGljYXRlIHRoZSBzY2hlbWEgZGVmaW5pdGlvbiBpZiBpdCB3YXMgZXZlciByZWZlcmVuY2VkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIHRoZSBkdXBsaWNhdGlvbiBpcyBjb21wbGV0ZWx5IHBvaW50bGVzc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLihyZWZzLnNlZW5SZWZzLnNpemUgPyB7IFtuYW1lXTogbWFpbiB9IDogdW5kZWZpbmVkKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQpLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgJHJlZjogWy4uLihyZWZzLiRyZWZTdHJhdGVneSA9PT0gJ3JlbGF0aXZlJyA/IFtdIDogcmVmcy5iYXNlUGF0aCksIHJlZnMuZGVmaW5pdGlvblBhdGgsIG5hbWVdLmpvaW4oJy8nKSxcbiAgICAgICAgICAgICAgICBbcmVmcy5kZWZpbml0aW9uUGF0aF06IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uZGVmaW5pdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgIFtuYW1lXTogbWFpbixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfTtcbiAgICBpZiAocmVmcy50YXJnZXQgPT09ICdqc29uU2NoZW1hNycpIHtcbiAgICAgICAgY29tYmluZWQuJHNjaGVtYSA9ICdodHRwOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LTA3L3NjaGVtYSMnO1xuICAgIH1cbiAgICBlbHNlIGlmIChyZWZzLnRhcmdldCA9PT0gJ2pzb25TY2hlbWEyMDE5LTA5Jykge1xuICAgICAgICBjb21iaW5lZC4kc2NoZW1hID0gJ2h0dHBzOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LzIwMTktMDkvc2NoZW1hIyc7XG4gICAgfVxuICAgIHJldHVybiBjb21iaW5lZDtcbn07XG5leHBvcnQgeyB6b2RUb0pzb25TY2hlbWEgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXpvZFRvSnNvblNjaGVtYS5tanMubWFwIiwiaW1wb3J0IHsgT3BlbkFJRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3IubWpzXCI7XG5pbXBvcnQgeyBpc0F1dG9QYXJzYWJsZVJlc3BvbnNlRm9ybWF0IH0gZnJvbSBcIi4uL2xpYi9wYXJzZXIubWpzXCI7XG5leHBvcnQgZnVuY3Rpb24gbWF5YmVQYXJzZVJlc3BvbnNlKHJlc3BvbnNlLCBwYXJhbXMpIHtcbiAgICBpZiAoIXBhcmFtcyB8fCAhaGFzQXV0b1BhcnNlYWJsZUlucHV0KHBhcmFtcykpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnJlc3BvbnNlLFxuICAgICAgICAgICAgb3V0cHV0X3BhcnNlZDogbnVsbCxcbiAgICAgICAgICAgIG91dHB1dDogcmVzcG9uc2Uub3V0cHV0Lm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpdGVtLnR5cGUgPT09ICdmdW5jdGlvbl9jYWxsJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZF9hcmd1bWVudHM6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChpdGVtLnR5cGUgPT09ICdtZXNzYWdlJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IGl0ZW0uY29udGVudC5tYXAoKGNvbnRlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY29udGVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZWQ6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlUmVzcG9uc2UocmVzcG9uc2UsIHBhcmFtcyk7XG59XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VSZXNwb25zZShyZXNwb25zZSwgcGFyYW1zKSB7XG4gICAgY29uc3Qgb3V0cHV0ID0gcmVzcG9uc2Uub3V0cHV0Lm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICBpZiAoaXRlbS50eXBlID09PSAnZnVuY3Rpb25fY2FsbCcpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgICAgICAgICBwYXJzZWRfYXJndW1lbnRzOiBwYXJzZVRvb2xDYWxsKHBhcmFtcywgaXRlbSksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChpdGVtLnR5cGUgPT09ICdtZXNzYWdlJykge1xuICAgICAgICAgICAgY29uc3QgY29udGVudCA9IGl0ZW0uY29udGVudC5tYXAoKGNvbnRlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY29udGVudC50eXBlID09PSAnb3V0cHV0X3RleHQnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5jb250ZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VkOiBwYXJzZVRleHRGb3JtYXQocGFyYW1zLCBjb250ZW50LnRleHQpLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGVudDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAuLi5pdGVtLFxuICAgICAgICAgICAgICAgIGNvbnRlbnQsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpdGVtO1xuICAgIH0pO1xuICAgIGNvbnN0IHBhcnNlZCA9IE9iamVjdC5hc3NpZ24oe30sIHJlc3BvbnNlLCB7IG91dHB1dCB9KTtcbiAgICBpZiAoIU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocmVzcG9uc2UsICdvdXRwdXRfdGV4dCcpKSB7XG4gICAgICAgIGFkZE91dHB1dFRleHQocGFyc2VkKTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHBhcnNlZCwgJ291dHB1dF9wYXJzZWQnLCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldCgpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgb3V0cHV0IG9mIHBhcnNlZC5vdXRwdXQpIHtcbiAgICAgICAgICAgICAgICBpZiAob3V0cHV0LnR5cGUgIT09ICdtZXNzYWdlJykge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBjb250ZW50IG9mIG91dHB1dC5jb250ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LnR5cGUgPT09ICdvdXRwdXRfdGV4dCcgJiYgY29udGVudC5wYXJzZWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250ZW50LnBhcnNlZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9LFxuICAgIH0pO1xuICAgIHJldHVybiBwYXJzZWQ7XG59XG5mdW5jdGlvbiBwYXJzZVRleHRGb3JtYXQocGFyYW1zLCBjb250ZW50KSB7XG4gICAgaWYgKHBhcmFtcy50ZXh0Py5mb3JtYXQ/LnR5cGUgIT09ICdqc29uX3NjaGVtYScpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmICgnJHBhcnNlUmF3JyBpbiBwYXJhbXMudGV4dD8uZm9ybWF0KSB7XG4gICAgICAgIGNvbnN0IHRleHRfZm9ybWF0ID0gcGFyYW1zLnRleHQ/LmZvcm1hdDtcbiAgICAgICAgcmV0dXJuIHRleHRfZm9ybWF0LiRwYXJzZVJhdyhjb250ZW50KTtcbiAgICB9XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoY29udGVudCk7XG59XG5leHBvcnQgZnVuY3Rpb24gaGFzQXV0b1BhcnNlYWJsZUlucHV0KHBhcmFtcykge1xuICAgIGlmIChpc0F1dG9QYXJzYWJsZVJlc3BvbnNlRm9ybWF0KHBhcmFtcy50ZXh0Py5mb3JtYXQpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5leHBvcnQgZnVuY3Rpb24gbWFrZVBhcnNlYWJsZVJlc3BvbnNlVG9vbCh0b29sLCB7IHBhcnNlciwgY2FsbGJhY2ssIH0pIHtcbiAgICBjb25zdCBvYmogPSB7IC4uLnRvb2wgfTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhvYmosIHtcbiAgICAgICAgJGJyYW5kOiB7XG4gICAgICAgICAgICB2YWx1ZTogJ2F1dG8tcGFyc2VhYmxlLXRvb2wnLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICAgICRwYXJzZVJhdzoge1xuICAgICAgICAgICAgdmFsdWU6IHBhcnNlcixcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgICAkY2FsbGJhY2s6IHtcbiAgICAgICAgICAgIHZhbHVlOiBjYWxsYmFjayxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0pO1xuICAgIHJldHVybiBvYmo7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNBdXRvUGFyc2FibGVUb29sKHRvb2wpIHtcbiAgICByZXR1cm4gdG9vbD8uWyckYnJhbmQnXSA9PT0gJ2F1dG8tcGFyc2VhYmxlLXRvb2wnO1xufVxuZnVuY3Rpb24gZ2V0SW5wdXRUb29sQnlOYW1lKGlucHV0X3Rvb2xzLCBuYW1lKSB7XG4gICAgcmV0dXJuIGlucHV0X3Rvb2xzLmZpbmQoKHRvb2wpID0+IHRvb2wudHlwZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0b29sLm5hbWUgPT09IG5hbWUpO1xufVxuZnVuY3Rpb24gcGFyc2VUb29sQ2FsbChwYXJhbXMsIHRvb2xDYWxsKSB7XG4gICAgY29uc3QgaW5wdXRUb29sID0gZ2V0SW5wdXRUb29sQnlOYW1lKHBhcmFtcy50b29scyA/PyBbXSwgdG9vbENhbGwubmFtZSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgLi4udG9vbENhbGwsXG4gICAgICAgIC4uLnRvb2xDYWxsLFxuICAgICAgICBwYXJzZWRfYXJndW1lbnRzOiBpc0F1dG9QYXJzYWJsZVRvb2woaW5wdXRUb29sKSA/IGlucHV0VG9vbC4kcGFyc2VSYXcodG9vbENhbGwuYXJndW1lbnRzKVxuICAgICAgICAgICAgOiBpbnB1dFRvb2w/LnN0cmljdCA/IEpTT04ucGFyc2UodG9vbENhbGwuYXJndW1lbnRzKVxuICAgICAgICAgICAgICAgIDogbnVsbCxcbiAgICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIHNob3VsZFBhcnNlVG9vbENhbGwocGFyYW1zLCB0b29sQ2FsbCkge1xuICAgIGlmICghcGFyYW1zKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRUb29sID0gZ2V0SW5wdXRUb29sQnlOYW1lKHBhcmFtcy50b29scyA/PyBbXSwgdG9vbENhbGwubmFtZSk7XG4gICAgcmV0dXJuIGlzQXV0b1BhcnNhYmxlVG9vbChpbnB1dFRvb2wpIHx8IGlucHV0VG9vbD8uc3RyaWN0IHx8IGZhbHNlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlSW5wdXRUb29scyh0b29scykge1xuICAgIGZvciAoY29uc3QgdG9vbCBvZiB0b29scyA/PyBbXSkge1xuICAgICAgICBpZiAodG9vbC50eXBlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgT3BlbkFJRXJyb3IoYEN1cnJlbnRseSBvbmx5IFxcYGZ1bmN0aW9uXFxgIHRvb2wgdHlwZXMgc3VwcG9ydCBhdXRvLXBhcnNpbmc7IFJlY2VpdmVkIFxcYCR7dG9vbC50eXBlfVxcYGApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0b29sLmZ1bmN0aW9uLnN0cmljdCAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE9wZW5BSUVycm9yKGBUaGUgXFxgJHt0b29sLmZ1bmN0aW9uLm5hbWV9XFxgIHRvb2wgaXMgbm90IG1hcmtlZCB3aXRoIFxcYHN0cmljdDogdHJ1ZVxcYC4gT25seSBzdHJpY3QgZnVuY3Rpb24gdG9vbHMgY2FuIGJlIGF1dG8tcGFyc2VkYCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gYWRkT3V0cHV0VGV4dChyc3ApIHtcbiAgICBjb25zdCB0ZXh0cyA9IFtdO1xuICAgIGZvciAoY29uc3Qgb3V0cHV0IG9mIHJzcC5vdXRwdXQpIHtcbiAgICAgICAgaWYgKG91dHB1dC50eXBlICE9PSAnbWVzc2FnZScpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgY29udGVudCBvZiBvdXRwdXQuY29udGVudCkge1xuICAgICAgICAgICAgaWYgKGNvbnRlbnQudHlwZSA9PT0gJ291dHB1dF90ZXh0Jykge1xuICAgICAgICAgICAgICAgIHRleHRzLnB1c2goY29udGVudC50ZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByc3Aub3V0cHV0X3RleHQgPSB0ZXh0cy5qb2luKCcnKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlc3BvbnNlc1BhcnNlci5tanMubWFwIiwiaW1wb3J0IHsgbWFrZVBhcnNlYWJsZVJlc3BvbnNlRm9ybWF0LCBtYWtlUGFyc2VhYmxlVGV4dEZvcm1hdCwgbWFrZVBhcnNlYWJsZVRvb2wsIH0gZnJvbSBcIi4uL2xpYi9wYXJzZXIubWpzXCI7XG5pbXBvcnQgeyB6b2RUb0pzb25TY2hlbWEgYXMgX3pvZFRvSnNvblNjaGVtYSB9IGZyb20gXCIuLi9fdmVuZG9yL3pvZC10by1qc29uLXNjaGVtYS9pbmRleC5tanNcIjtcbmltcG9ydCB7IG1ha2VQYXJzZWFibGVSZXNwb25zZVRvb2wgfSBmcm9tIFwiLi4vbGliL1Jlc3BvbnNlc1BhcnNlci5tanNcIjtcbmZ1bmN0aW9uIHpvZFRvSnNvblNjaGVtYShzY2hlbWEsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gX3pvZFRvSnNvblNjaGVtYShzY2hlbWEsIHtcbiAgICAgICAgb3BlbmFpU3RyaWN0TW9kZTogdHJ1ZSxcbiAgICAgICAgbmFtZTogb3B0aW9ucy5uYW1lLFxuICAgICAgICBuYW1lU3RyYXRlZ3k6ICdkdXBsaWNhdGUtcmVmJyxcbiAgICAgICAgJHJlZlN0cmF0ZWd5OiAnZXh0cmFjdC10by1yb290JyxcbiAgICAgICAgbnVsbGFibGVTdHJhdGVneTogJ3Byb3BlcnR5JyxcbiAgICB9KTtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIGNoYXQgY29tcGxldGlvbiBgSlNPTlNjaGVtYWAgcmVzcG9uc2UgZm9ybWF0IG9iamVjdCBmcm9tXG4gKiB0aGUgZ2l2ZW4gWm9kIHNjaGVtYS5cbiAqXG4gKiBJZiB0aGlzIGlzIHBhc3NlZCB0byB0aGUgYC5wYXJzZSgpYCwgYC5zdHJlYW0oKWAgb3IgYC5ydW5Ub29scygpYFxuICogY2hhdCBjb21wbGV0aW9uIG1ldGhvZHMgdGhlbiB0aGUgcmVzcG9uc2UgbWVzc2FnZSB3aWxsIGNvbnRhaW4gYVxuICogYC5wYXJzZWRgIHByb3BlcnR5IHRoYXQgaXMgdGhlIHJlc3VsdCBvZiBwYXJzaW5nIHRoZSBjb250ZW50IHdpdGhcbiAqIHRoZSBnaXZlbiBab2Qgb2JqZWN0LlxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCBjb21wbGV0aW9uID0gYXdhaXQgY2xpZW50LmNoYXQuY29tcGxldGlvbnMucGFyc2Uoe1xuICogICAgbW9kZWw6ICdncHQtNG8tMjAyNC0wOC0wNicsXG4gKiAgICBtZXNzYWdlczogW1xuICogICAgICB7IHJvbGU6ICdzeXN0ZW0nLCBjb250ZW50OiAnWW91IGFyZSBhIGhlbHBmdWwgbWF0aCB0dXRvci4nIH0sXG4gKiAgICAgIHsgcm9sZTogJ3VzZXInLCBjb250ZW50OiAnc29sdmUgOHggKyAzMSA9IDInIH0sXG4gKiAgICBdLFxuICogICAgcmVzcG9uc2VfZm9ybWF0OiB6b2RSZXNwb25zZUZvcm1hdChcbiAqICAgICAgei5vYmplY3Qoe1xuICogICAgICAgIHN0ZXBzOiB6LmFycmF5KHoub2JqZWN0KHtcbiAqICAgICAgICAgIGV4cGxhbmF0aW9uOiB6LnN0cmluZygpLFxuICogICAgICAgICAgYW5zd2VyOiB6LnN0cmluZygpLFxuICogICAgICAgIH0pKSxcbiAqICAgICAgICBmaW5hbF9hbnN3ZXI6IHouc3RyaW5nKCksXG4gKiAgICAgIH0pLFxuICogICAgICAnbWF0aF9hbnN3ZXInLFxuICogICAgKSxcbiAqICB9KTtcbiAqICBjb25zdCBtZXNzYWdlID0gY29tcGxldGlvbi5jaG9pY2VzWzBdPy5tZXNzYWdlO1xuICogIGlmIChtZXNzYWdlPy5wYXJzZWQpIHtcbiAqICAgIGNvbnNvbGUubG9nKG1lc3NhZ2UucGFyc2VkKTtcbiAqICAgIGNvbnNvbGUubG9nKG1lc3NhZ2UucGFyc2VkLmZpbmFsX2Fuc3dlcik7XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBUaGlzIGNhbiBiZSBwYXNzZWQgZGlyZWN0bHkgdG8gdGhlIGAuY3JlYXRlKClgIG1ldGhvZCBidXQgd2lsbCBub3RcbiAqIHJlc3VsdCBpbiBhbnkgYXV0b21hdGljIHBhcnNpbmcsIHlvdSdsbCBoYXZlIHRvIHBhcnNlIHRoZSByZXNwb25zZSB5b3Vyc2VsZi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHpvZFJlc3BvbnNlRm9ybWF0KHpvZE9iamVjdCwgbmFtZSwgcHJvcHMpIHtcbiAgICByZXR1cm4gbWFrZVBhcnNlYWJsZVJlc3BvbnNlRm9ybWF0KHtcbiAgICAgICAgdHlwZTogJ2pzb25fc2NoZW1hJyxcbiAgICAgICAganNvbl9zY2hlbWE6IHtcbiAgICAgICAgICAgIC4uLnByb3BzLFxuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIHN0cmljdDogdHJ1ZSxcbiAgICAgICAgICAgIHNjaGVtYTogem9kVG9Kc29uU2NoZW1hKHpvZE9iamVjdCwgeyBuYW1lIH0pLFxuICAgICAgICB9LFxuICAgIH0sIChjb250ZW50KSA9PiB6b2RPYmplY3QucGFyc2UoSlNPTi5wYXJzZShjb250ZW50KSkpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHpvZFRleHRGb3JtYXQoem9kT2JqZWN0LCBuYW1lLCBwcm9wcykge1xuICAgIHJldHVybiBtYWtlUGFyc2VhYmxlVGV4dEZvcm1hdCh7XG4gICAgICAgIHR5cGU6ICdqc29uX3NjaGVtYScsXG4gICAgICAgIC4uLnByb3BzLFxuICAgICAgICBuYW1lLFxuICAgICAgICBzdHJpY3Q6IHRydWUsXG4gICAgICAgIHNjaGVtYTogem9kVG9Kc29uU2NoZW1hKHpvZE9iamVjdCwgeyBuYW1lIH0pLFxuICAgIH0sIChjb250ZW50KSA9PiB6b2RPYmplY3QucGFyc2UoSlNPTi5wYXJzZShjb250ZW50KSkpO1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgY2hhdCBjb21wbGV0aW9uIGBmdW5jdGlvbmAgdG9vbCB0aGF0IGNhbiBiZSBpbnZva2VkXG4gKiBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBjaGF0IGNvbXBsZXRpb24gYC5ydW5Ub29scygpYCBtZXRob2Qgb3IgYXV0b21hdGljYWxseVxuICogcGFyc2VkIGJ5IGAucGFyc2UoKWAgLyBgLnN0cmVhbSgpYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHpvZEZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIFRPRE9cbiAgICByZXR1cm4gbWFrZVBhcnNlYWJsZVRvb2woe1xuICAgICAgICB0eXBlOiAnZnVuY3Rpb24nLFxuICAgICAgICBmdW5jdGlvbjoge1xuICAgICAgICAgICAgbmFtZTogb3B0aW9ucy5uYW1lLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogem9kVG9Kc29uU2NoZW1hKG9wdGlvbnMucGFyYW1ldGVycywgeyBuYW1lOiBvcHRpb25zLm5hbWUgfSksXG4gICAgICAgICAgICBzdHJpY3Q6IHRydWUsXG4gICAgICAgICAgICAuLi4ob3B0aW9ucy5kZXNjcmlwdGlvbiA/IHsgZGVzY3JpcHRpb246IG9wdGlvbnMuZGVzY3JpcHRpb24gfSA6IHVuZGVmaW5lZCksXG4gICAgICAgIH0sXG4gICAgfSwge1xuICAgICAgICBjYWxsYmFjazogb3B0aW9ucy5mdW5jdGlvbixcbiAgICAgICAgcGFyc2VyOiAoYXJncykgPT4gb3B0aW9ucy5wYXJhbWV0ZXJzLnBhcnNlKEpTT04ucGFyc2UoYXJncykpLFxuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHpvZFJlc3BvbnNlc0Z1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbWFrZVBhcnNlYWJsZVJlc3BvbnNlVG9vbCh7XG4gICAgICAgIHR5cGU6ICdmdW5jdGlvbicsXG4gICAgICAgIG5hbWU6IG9wdGlvbnMubmFtZSxcbiAgICAgICAgcGFyYW1ldGVyczogem9kVG9Kc29uU2NoZW1hKG9wdGlvbnMucGFyYW1ldGVycywgeyBuYW1lOiBvcHRpb25zLm5hbWUgfSksXG4gICAgICAgIHN0cmljdDogdHJ1ZSxcbiAgICAgICAgLi4uKG9wdGlvbnMuZGVzY3JpcHRpb24gPyB7IGRlc2NyaXB0aW9uOiBvcHRpb25zLmRlc2NyaXB0aW9uIH0gOiB1bmRlZmluZWQpLFxuICAgIH0sIHtcbiAgICAgICAgY2FsbGJhY2s6IG9wdGlvbnMuZnVuY3Rpb24sXG4gICAgICAgIHBhcnNlcjogKGFyZ3MpID0+IG9wdGlvbnMucGFyYW1ldGVycy5wYXJzZShKU09OLnBhcnNlKGFyZ3MpKSxcbiAgICB9KTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXpvZC5tanMubWFwIiwiLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBhbGwgZXJyb3JzIHRocm93biBieSB0aGUgbGlicmFyeS5cbiAqL1xuZXhwb3J0IGNsYXNzIEFnZW50c0Vycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIHN0YXRlO1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UsIHN0YXRlKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7XG4gICAgfVxufVxuLyoqXG4gKiBTeXN0ZW0gZXJyb3IgdGhyb3duIHdoZW4gdGhlIGxpYnJhcnkgZW5jb3VudGVycyBhbiBlcnJvciB0aGF0IGlzIG5vdCBjYXVzZWQgYnkgdGhlIHVzZXInc1xuICogbWlzY29uZmlndXJhdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIFN5c3RlbUVycm9yIGV4dGVuZHMgQWdlbnRzRXJyb3Ige1xufVxuLyoqXG4gKiBFcnJvciB0aHJvd24gd2hlbiB0aGUgbWF4aW11bSBudW1iZXIgb2YgdHVybnMgaXMgZXhjZWVkZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBNYXhUdXJuc0V4Y2VlZGVkRXJyb3IgZXh0ZW5kcyBBZ2VudHNFcnJvciB7XG59XG4vKipcbiAqIEVycm9yIHRocm93biB3aGVuIGEgbW9kZWwgYmVoYXZpb3IgaXMgdW5leHBlY3RlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIE1vZGVsQmVoYXZpb3JFcnJvciBleHRlbmRzIEFnZW50c0Vycm9yIHtcbn1cbi8qKlxuICogRXJyb3IgdGhyb3duIHdoZW4gdGhlIGVycm9yIGlzIGNhdXNlZCBieSB0aGUgbGlicmFyeSB1c2VyJ3MgbWlzY29uZmlndXJhdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIFVzZXJFcnJvciBleHRlbmRzIEFnZW50c0Vycm9yIHtcbn1cbi8qKlxuICogRXJyb3IgdGhyb3duIHdoZW4gYSBndWFyZHJhaWwgZXhlY3V0aW9uIGZhaWxzLlxuICovXG5leHBvcnQgY2xhc3MgR3VhcmRyYWlsRXhlY3V0aW9uRXJyb3IgZXh0ZW5kcyBBZ2VudHNFcnJvciB7XG4gICAgZXJyb3I7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZSwgZXJyb3IsIHN0YXRlKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UsIHN0YXRlKTtcbiAgICAgICAgdGhpcy5lcnJvciA9IGVycm9yO1xuICAgIH1cbn1cbi8qKlxuICogRXJyb3IgdGhyb3duIHdoZW4gYSB0b29sIGNhbGwgZmFpbHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBUb29sQ2FsbEVycm9yIGV4dGVuZHMgQWdlbnRzRXJyb3Ige1xuICAgIGVycm9yO1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UsIGVycm9yLCBzdGF0ZSkge1xuICAgICAgICBzdXBlcihtZXNzYWdlLCBzdGF0ZSk7XG4gICAgICAgIHRoaXMuZXJyb3IgPSBlcnJvcjtcbiAgICB9XG59XG4vKipcbiAqIEVycm9yIHRocm93biB3aGVuIGFuIGlucHV0IGd1YXJkcmFpbCB0cmlwd2lyZSBpcyB0cmlnZ2VyZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBJbnB1dEd1YXJkcmFpbFRyaXB3aXJlVHJpZ2dlcmVkIGV4dGVuZHMgQWdlbnRzRXJyb3Ige1xuICAgIHJlc3VsdDtcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlLCByZXN1bHQsIHN0YXRlKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UsIHN0YXRlKTtcbiAgICAgICAgdGhpcy5yZXN1bHQgPSByZXN1bHQ7XG4gICAgfVxufVxuLyoqXG4gKiBFcnJvciB0aHJvd24gd2hlbiBhbiBvdXRwdXQgZ3VhcmRyYWlsIHRyaXB3aXJlIGlzIHRyaWdnZXJlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIE91dHB1dEd1YXJkcmFpbFRyaXB3aXJlVHJpZ2dlcmVkIGV4dGVuZHMgQWdlbnRzRXJyb3Ige1xuICAgIHJlc3VsdDtcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlLCByZXN1bHQsIHN0YXRlKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UsIHN0YXRlKTtcbiAgICAgICAgdGhpcy5yZXN1bHQgPSByZXN1bHQ7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZXJyb3JzLm1qcy5tYXAiLCIvKipcbiAqIFZlcmlmaWVzIHRoYXQgYW4gaW5wdXQgaXMgYSBab2RPYmplY3Qgd2l0aG91dCBuZWVkaW5nIHRvIGhhdmUgWm9kIGF0IHJ1bnRpbWUgc2luY2UgaXQncyBhblxuICogb3B0aW9uYWwgZGVwZW5kZW5jeS5cbiAqIEBwYXJhbSBpbnB1dFxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzWm9kT2JqZWN0KGlucHV0KSB7XG4gICAgcmV0dXJuICh0eXBlb2YgaW5wdXQgPT09ICdvYmplY3QnICYmXG4gICAgICAgIGlucHV0ICE9PSBudWxsICYmXG4gICAgICAgICdfZGVmJyBpbiBpbnB1dCAmJlxuICAgICAgICB0eXBlb2YgaW5wdXQuX2RlZiA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgaW5wdXQuX2RlZiAhPT0gbnVsbCAmJlxuICAgICAgICAndHlwZU5hbWUnIGluIGlucHV0Ll9kZWYgJiZcbiAgICAgICAgaW5wdXQuX2RlZi50eXBlTmFtZSA9PT0gJ1pvZE9iamVjdCcpO1xufVxuLyoqXG4gKiBWZXJpZmllcyB0aGF0IGFuIGlucHV0IGlzIGFuIG9iamVjdCB3aXRoIGFuIGBpbnB1dGAgcHJvcGVydHkuXG4gKiBAcGFyYW0gaW5wdXRcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0FnZW50VG9vbElucHV0KGlucHV0KSB7XG4gICAgcmV0dXJuICh0eXBlb2YgaW5wdXQgPT09ICdvYmplY3QnICYmXG4gICAgICAgIGlucHV0ICE9PSBudWxsICYmXG4gICAgICAgICdpbnB1dCcgaW4gaW5wdXQgJiZcbiAgICAgICAgdHlwZW9mIGlucHV0LmlucHV0ID09PSAnc3RyaW5nJyk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD10eXBlR3VhcmRzLm1qcy5tYXAiLCJpbXBvcnQgeyB6b2RSZXNwb25zZXNGdW5jdGlvbiwgem9kVGV4dEZvcm1hdCB9IGZyb20gJ29wZW5haS9oZWxwZXJzL3pvZCc7XG5pbXBvcnQgeyBVc2VyRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzLm1qc1wiO1xuaW1wb3J0IHsgaXNab2RPYmplY3QgfSBmcm9tIFwiLi90eXBlR3VhcmRzLm1qc1wiO1xuLyoqXG4gKiBDb252ZXJ0IGEgc3RyaW5nIHRvIGEgZnVuY3Rpb24gdG9vbCBuYW1lIGJ5IHJlcGxhY2luZyBzcGFjZXMgd2l0aCB1bmRlcnNjb3JlcyBhbmRcbiAqIG5vbi1hbHBoYW51bWVyaWMgY2hhcmFjdGVycyB3aXRoIHVuZGVyc2NvcmVzLlxuICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdG9vbC5cbiAqIEByZXR1cm5zIFRoZSBmdW5jdGlvbiB0b29sIG5hbWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0Z1bmN0aW9uVG9vbE5hbWUobmFtZSkge1xuICAgIC8vIFJlcGxhY2Ugc3BhY2VzIHdpdGggdW5kZXJzY29yZXNcbiAgICBuYW1lID0gbmFtZS5yZXBsYWNlKC9cXHMvZywgJ18nKTtcbiAgICAvLyBSZXBsYWNlIG5vbi1hbHBoYW51bWVyaWMgY2hhcmFjdGVycyB3aXRoIHVuZGVyc2NvcmVzXG4gICAgbmFtZSA9IG5hbWUucmVwbGFjZSgvW15hLXpBLVowLTldL2csICdfJyk7XG4gICAgLy8gRW5zdXJlIHRoZSBuYW1lIGlzIG5vdCBlbXB0eVxuICAgIGlmIChuYW1lLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Rvb2wgbmFtZSBjYW5ub3QgYmUgZW1wdHknKTtcbiAgICB9XG4gICAgcmV0dXJuIG5hbWU7XG59XG4vKipcbiAqIEdldCB0aGUgc2NoZW1hIGFuZCBwYXJzZXIgZnJvbSBhbiBpbnB1dCB0eXBlLiBJZiB0aGUgaW5wdXQgdHlwZSBpcyBhIFpvZE9iamVjdCwgd2Ugd2lsbCBjb252ZXJ0XG4gKiBpdCBpbnRvIGEgSlNPTiBTY2hlbWEgYW5kIHVzZSBab2QgYXMgcGFyc2VyLiBJZiB0aGUgaW5wdXQgdHlwZSBpcyBhIEpTT04gc2NoZW1hLCB3ZSB1c2UgdGhlXG4gKiBKU09OLnBhcnNlIGZ1bmN0aW9uIHRvIGdldCB0aGUgcGFyc2VyLlxuICogQHBhcmFtIGlucHV0VHlwZSAtIFRoZSBpbnB1dCB0eXBlIHRvIGdldCB0aGUgc2NoZW1hIGFuZCBwYXJzZXIgZnJvbS5cbiAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRvb2wuXG4gKiBAcmV0dXJucyBUaGUgc2NoZW1hIGFuZCBwYXJzZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTY2hlbWFBbmRQYXJzZXJGcm9tSW5wdXRUeXBlKGlucHV0VHlwZSwgbmFtZSkge1xuICAgIGNvbnN0IHBhcnNlciA9IChpbnB1dCkgPT4gSlNPTi5wYXJzZShpbnB1dCk7XG4gICAgaWYgKGlzWm9kT2JqZWN0KGlucHV0VHlwZSkpIHtcbiAgICAgICAgY29uc3QgZm9ybWF0dGVkRnVuY3Rpb24gPSB6b2RSZXNwb25zZXNGdW5jdGlvbih7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogaW5wdXRUeXBlLFxuICAgICAgICAgICAgZnVuY3Rpb246ICgpID0+IHsgfSwgLy8gZW1wdHkgZnVuY3Rpb24gaGVyZSB0byBzYXRpc2Z5IHRoZSBPcGVuQUkgaGVscGVyXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJycsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc2NoZW1hOiBmb3JtYXR0ZWRGdW5jdGlvbi5wYXJhbWV0ZXJzLFxuICAgICAgICAgICAgcGFyc2VyOiBmb3JtYXR0ZWRGdW5jdGlvbi4kcGFyc2VSYXcsXG4gICAgICAgIH07XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBpbnB1dFR5cGUgPT09ICdvYmplY3QnICYmIGlucHV0VHlwZSAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc2NoZW1hOiBpbnB1dFR5cGUsXG4gICAgICAgICAgICBwYXJzZXIsXG4gICAgICAgIH07XG4gICAgfVxuICAgIHRocm93IG5ldyBVc2VyRXJyb3IoJ0lucHV0IHR5cGUgaXMgbm90IGEgWm9kT2JqZWN0IG9yIGEgdmFsaWQgSlNPTiBzY2hlbWEnKTtcbn1cbi8qKlxuICogQ29udmVydHMgdGhlIGFnZW50IG91dHB1dCB0eXBlIHByb3ZpZGVkIHRvIGEgc2VyaWFsaXphYmxlIHZlcnNpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRBZ2VudE91dHB1dFR5cGVUb1NlcmlhbGl6YWJsZShvdXRwdXRUeXBlKSB7XG4gICAgaWYgKG91dHB1dFR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgICByZXR1cm4gJ3RleHQnO1xuICAgIH1cbiAgICBpZiAoaXNab2RPYmplY3Qob3V0cHV0VHlwZSkpIHtcbiAgICAgICAgY29uc3Qgb3V0cHV0ID0gem9kVGV4dEZvcm1hdChvdXRwdXRUeXBlLCAnb3V0cHV0Jyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiBvdXRwdXQudHlwZSxcbiAgICAgICAgICAgIG5hbWU6IG91dHB1dC5uYW1lLFxuICAgICAgICAgICAgc3RyaWN0OiBvdXRwdXQuc3RyaWN0IHx8IGZhbHNlLFxuICAgICAgICAgICAgc2NoZW1hOiBvdXRwdXQuc2NoZW1hLFxuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0VHlwZTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRvb2xzLm1qcy5tYXAiLCJpbXBvcnQgeyBBc3luY0xvY2FsU3RvcmFnZSB9IGZyb20gJ0BvcGVuYWkvYWdlbnRzLWNvcmUvX3NoaW1zJztcbmltcG9ydCB7IGdldEdsb2JhbFRyYWNlUHJvdmlkZXIgfSBmcm9tIFwiLi9wcm92aWRlci5tanNcIjtcbmxldCBfY29udGV4dEFzeW5jTG9jYWxTdG9yYWdlO1xuZnVuY3Rpb24gZ2V0Q29udGV4dEFzeW5jTG9jYWxTdG9yYWdlKCkge1xuICAgIF9jb250ZXh0QXN5bmNMb2NhbFN0b3JhZ2UgPz89IG5ldyBBc3luY0xvY2FsU3RvcmFnZSgpO1xuICAgIHJldHVybiBfY29udGV4dEFzeW5jTG9jYWxTdG9yYWdlO1xufVxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgZ2V0IHRoZSBjdXJyZW50IHRyYWNlIGZyb20gdGhlIGV4ZWN1dGlvbiBjb250ZXh0LlxuICpcbiAqIEByZXR1cm5zIFRoZSBjdXJyZW50IHRyYWNlIG9yIG51bGwgaWYgdGhlcmUgaXMgbm8gdHJhY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDdXJyZW50VHJhY2UoKSB7XG4gICAgY29uc3QgY3VycmVudFRyYWNlID0gZ2V0Q29udGV4dEFzeW5jTG9jYWxTdG9yYWdlKCkuZ2V0U3RvcmUoKTtcbiAgICBpZiAoY3VycmVudFRyYWNlPy50cmFjZSkge1xuICAgICAgICByZXR1cm4gY3VycmVudFRyYWNlLnRyYWNlO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbi8qKlxuICogVGhpcyBmdW5jdGlvbiB3aWxsIGdldCB0aGUgY3VycmVudCBzcGFuIGZyb20gdGhlIGV4ZWN1dGlvbiBjb250ZXh0LlxuICpcbiAqIEByZXR1cm5zIFRoZSBjdXJyZW50IHNwYW4gb3IgbnVsbCBpZiB0aGVyZSBpcyBubyBzcGFuLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q3VycmVudFNwYW4oKSB7XG4gICAgY29uc3QgY3VycmVudFNwYW4gPSBnZXRDb250ZXh0QXN5bmNMb2NhbFN0b3JhZ2UoKS5nZXRTdG9yZSgpO1xuICAgIGlmIChjdXJyZW50U3Bhbj8uc3Bhbikge1xuICAgICAgICByZXR1cm4gY3VycmVudFNwYW4uc3BhbjtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG4vKipcbiAqIFRoaXMgaXMgYW4gQXN5bmNMb2NhbFN0b3JhZ2UgaW5zdGFuY2UgdGhhdCBzdG9yZXMgdGhlIGN1cnJlbnQgdHJhY2UuXG4gKiBJdCB3aWxsIGF1dG9tYXRpY2FsbHkgaGFuZGxlIHRoZSBleGVjdXRpb24gY29udGV4dCBvZiBkaWZmZXJlbnQgZXZlbnQgbG9vcCBleGVjdXRpb25zLlxuICpcbiAqIFRoZSBmdW5jdGlvbnMgYmVsb3cgc2hvdWxkIGJlIHRoZSBvbmx5IHdheSB0aGF0IHRoaXMgY29udGV4dCBnZXRzIGludGVyZmFjZWQgd2l0aC5cbiAqL1xuZnVuY3Rpb24gX3dyYXBGdW5jdGlvbldpdGhUcmFjZUxpZmVjeWNsZShmbikge1xuICAgIHJldHVybiBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHRyYWNlID0gZ2V0Q3VycmVudFRyYWNlKCk7XG4gICAgICAgIGlmICghdHJhY2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gdHJhY2UgZm91bmQnKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0cmFjZS5zdGFydCgpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmbih0cmFjZSk7XG4gICAgICAgIGF3YWl0IHRyYWNlLmVuZCgpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG59XG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjcmVhdGUgYSBuZXcgdHJhY2UgYW5kIGFzc2lnbiBpdCB0byB0aGUgZXhlY3V0aW9uIGNvbnRleHQgb2YgdGhlIGZ1bmN0aW9uXG4gKiBwYXNzZWQgdG8gaXQuXG4gKlxuICogQHBhcmFtIGZuIC0gVGhlIGZ1bmN0aW9uIHRvIHJ1biBhbmQgYXNzaWduIHRoZSB0cmFjZSBjb250ZXh0IHRvLlxuICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIGZvciB0aGUgY3JlYXRpb24gb2YgdGhlIHRyYWNlXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3aXRoVHJhY2UodHJhY2UsIGZuLCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBuZXdUcmFjZSA9IHR5cGVvZiB0cmFjZSA9PT0gJ3N0cmluZydcbiAgICAgICAgPyBnZXRHbG9iYWxUcmFjZVByb3ZpZGVyKCkuY3JlYXRlVHJhY2Uoe1xuICAgICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICAgIG5hbWU6IHRyYWNlLFxuICAgICAgICB9KVxuICAgICAgICA6IHRyYWNlO1xuICAgIHJldHVybiBnZXRDb250ZXh0QXN5bmNMb2NhbFN0b3JhZ2UoKS5ydW4oeyB0cmFjZTogbmV3VHJhY2UgfSwgX3dyYXBGdW5jdGlvbldpdGhUcmFjZUxpZmVjeWNsZShmbikpO1xufVxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2hlY2sgaWYgdGhlcmUgaXMgYW4gZXhpc3RpbmcgYWN0aXZlIHRyYWNlIGluIHRoZSBleGVjdXRpb24gY29udGV4dC4gSWYgdGhlcmVcbiAqIGlzLCBpdCB3aWxsIHJ1biB0aGUgZ2l2ZW4gZnVuY3Rpb24gd2l0aCB0aGUgZXhpc3RpbmcgdHJhY2UuIElmIHRoZXJlIGlzIG5vIHRyYWNlLCBpdCB3aWxsIGNyZWF0ZVxuICogYSBuZXcgb25lIGFuZCBhc3NpZ24gaXQgdG8gdGhlIGV4ZWN1dGlvbiBjb250ZXh0IG9mIHRoZSBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0gZm4gLSBUaGUgZnp1bmN0aW9uIHRvIHJ1biBhbmQgYXNzaWduIHRoZSB0cmFjZSBjb250ZXh0IHRvLlxuICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIGZvciB0aGUgY3JlYXRpb24gb2YgdGhlIHRyYWNlXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRPckNyZWF0ZVRyYWNlKGZuLCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBjdXJyZW50VHJhY2UgPSBnZXRDdXJyZW50VHJhY2UoKTtcbiAgICBpZiAoY3VycmVudFRyYWNlKSB7XG4gICAgICAgIC8vIGlmIHRoaXMgZXhlY3V0aW9uIGNvbnRleHQgYWxyZWFkeSBoYXMgYSB0cmFjZSBpbnN0YW5jZSBpbiBpdCB3ZSBqdXN0IGNvbnRpbnVlXG4gICAgICAgIHJldHVybiBhd2FpdCBmbigpO1xuICAgIH1cbiAgICBjb25zdCBuZXdUcmFjZSA9IGdldEdsb2JhbFRyYWNlUHJvdmlkZXIoKS5jcmVhdGVUcmFjZShvcHRpb25zKTtcbiAgICByZXR1cm4gZ2V0Q29udGV4dEFzeW5jTG9jYWxTdG9yYWdlKCkucnVuKHsgdHJhY2U6IG5ld1RyYWNlIH0sIF93cmFwRnVuY3Rpb25XaXRoVHJhY2VMaWZlY3ljbGUoZm4pKTtcbn1cbi8qKlxuICogVGhpcyBmdW5jdGlvbiB3aWxsIHNldCB0aGUgY3VycmVudCBzcGFuIGluIHRoZSBleGVjdXRpb24gY29udGV4dC5cbiAqXG4gKiBAcGFyYW0gc3BhbiAtIFRoZSBzcGFuIHRvIHNldCBhcyB0aGUgY3VycmVudCBzcGFuLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0Q3VycmVudFNwYW4oc3Bhbikge1xuICAgIGNvbnN0IGNvbnRleHQgPSBnZXRDb250ZXh0QXN5bmNMb2NhbFN0b3JhZ2UoKS5nZXRTdG9yZSgpO1xuICAgIGlmICghY29udGV4dCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGV4aXN0aW5nIHRyYWNlIGZvdW5kJyk7XG4gICAgfVxuICAgIGlmIChjb250ZXh0LnNwYW4pIHtcbiAgICAgICAgY29udGV4dC5zcGFuLnByZXZpb3VzU3BhbiA9IGNvbnRleHQucHJldmlvdXNTcGFuO1xuICAgICAgICBjb250ZXh0LnByZXZpb3VzU3BhbiA9IGNvbnRleHQuc3BhbjtcbiAgICB9XG4gICAgY29udGV4dC5zcGFuID0gc3BhbjtcbiAgICBnZXRDb250ZXh0QXN5bmNMb2NhbFN0b3JhZ2UoKS5lbnRlcldpdGgoY29udGV4dCk7XG59XG5leHBvcnQgZnVuY3Rpb24gcmVzZXRDdXJyZW50U3BhbigpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gZ2V0Q29udGV4dEFzeW5jTG9jYWxTdG9yYWdlKCkuZ2V0U3RvcmUoKTtcbiAgICBpZiAoY29udGV4dCkge1xuICAgICAgICBjb250ZXh0LnNwYW4gPSBjb250ZXh0LnByZXZpb3VzU3BhbjtcbiAgICAgICAgY29udGV4dC5wcmV2aW91c1NwYW4gPSBjb250ZXh0LnByZXZpb3VzU3Bhbj8ucHJldmlvdXNTcGFuO1xuICAgICAgICBnZXRDb250ZXh0QXN5bmNMb2NhbFN0b3JhZ2UoKS5lbnRlcldpdGgoY29udGV4dCk7XG4gICAgfVxufVxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYWRkIGFuIGVycm9yIHRvIHRoZSBjdXJyZW50IHNwYW4uXG4gKlxuICogQHBhcmFtIHNwYW5FcnJvciAtIFRoZSBlcnJvciB0byBhZGQgdG8gdGhlIGN1cnJlbnQgc3Bhbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZEVycm9yVG9DdXJyZW50U3BhbihzcGFuRXJyb3IpIHtcbiAgICBjb25zdCBjdXJyZW50U3BhbiA9IGdldEN1cnJlbnRTcGFuKCk7XG4gICAgaWYgKGN1cnJlbnRTcGFuKSB7XG4gICAgICAgIGN1cnJlbnRTcGFuLnNldEVycm9yKHNwYW5FcnJvcik7XG4gICAgfVxufVxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2xvbmUgdGhlIGN1cnJlbnQgY29udGV4dCBieSBjcmVhdGluZyBuZXcgaW5zdGFuY2VzIG9mIHRoZSB0cmFjZSwgc3BhbiwgYW5kXG4gKiBwcmV2aW91cyBzcGFuLlxuICpcbiAqIEBwYXJhbSBjb250ZXh0IC0gVGhlIGNvbnRleHQgdG8gY2xvbmUuXG4gKiBAcmV0dXJucyBBIGNsb25lIG9mIHRoZSBjb250ZXh0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xvbmVDdXJyZW50Q29udGV4dChjb250ZXh0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHJhY2U6IGNvbnRleHQudHJhY2U/LmNsb25lKCksXG4gICAgICAgIHNwYW46IGNvbnRleHQuc3Bhbj8uY2xvbmUoKSxcbiAgICAgICAgcHJldmlvdXNTcGFuOiBjb250ZXh0LnByZXZpb3VzU3Bhbj8uY2xvbmUoKSxcbiAgICB9O1xufVxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcnVuIHRoZSBnaXZlbiBmdW5jdGlvbiB3aXRoIGEgbmV3IHNwYW4gY29udGV4dC5cbiAqXG4gKiBAcGFyYW0gZm4gLSBUaGUgZnVuY3Rpb24gdG8gcnVuIHdpdGggdGhlIG5ldyBzcGFuIGNvbnRleHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRoTmV3U3BhbkNvbnRleHQoZm4pIHtcbiAgICBjb25zdCBjdXJyZW50Q29udGV4dCA9IGdldENvbnRleHRBc3luY0xvY2FsU3RvcmFnZSgpLmdldFN0b3JlKCk7XG4gICAgaWYgKCFjdXJyZW50Q29udGV4dCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGV4aXN0aW5nIHRyYWNlIGZvdW5kJyk7XG4gICAgfVxuICAgIGNvbnN0IGNvcHlPZkNvbnRleHQgPSBjbG9uZUN1cnJlbnRDb250ZXh0KGN1cnJlbnRDb250ZXh0KTtcbiAgICByZXR1cm4gZ2V0Q29udGV4dEFzeW5jTG9jYWxTdG9yYWdlKCkucnVuKGNvcHlPZkNvbnRleHQsIGZuKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbnRleHQubWpzLm1hcCIsImltcG9ydCBsb2dnZXIgZnJvbSBcIi4uL2xvZ2dlci5tanNcIjtcbmltcG9ydCB7IGlzQnJvd3NlckVudmlyb25tZW50LCB0aW1lciBhcyBfdGltZXIsIH0gZnJvbSAnQG9wZW5haS9hZ2VudHMtY29yZS9fc2hpbXMnO1xuaW1wb3J0IHsgdHJhY2luZyB9IGZyb20gXCIuLi9jb25maWcubWpzXCI7XG4vKipcbiAqIFByaW50cyB0aGUgdHJhY2VzIGFuZCBzcGFucyB0byB0aGUgY29uc29sZVxuICovXG5leHBvcnQgY2xhc3MgQ29uc29sZVNwYW5FeHBvcnRlciB7XG4gICAgYXN5bmMgZXhwb3J0KGl0ZW1zKSB7XG4gICAgICAgIGlmICh0cmFjaW5nLmRpc2FibGVkKSB7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1RyYWNpbmcgaXMgZGlzYWJsZWQuIFNraXBwaW5nIGV4cG9ydCcpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgICAgICAgICAgaWYgKGl0ZW0udHlwZSA9PT0gJ3RyYWNlJykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBbRXhwb3J0ZXJdIEV4cG9ydCB0cmFjZSB0cmFjZUlkPSR7aXRlbS50cmFjZUlkfSBuYW1lPSR7aXRlbS5uYW1lfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFtFeHBvcnRlcl0gRXhwb3J0IHNwYW46ICR7SlNPTi5zdHJpbmdpZnkoaXRlbSl9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnQgY2xhc3MgQmF0Y2hUcmFjZVByb2Nlc3NvciB7XG4gICAgI21heFF1ZXVlU2l6ZTtcbiAgICAjbWF4QmF0Y2hTaXplO1xuICAgICNzY2hlZHVsZURlbGF5O1xuICAgICNleHBvcnRUcmlnZ2VyU2l6ZTtcbiAgICAjZXhwb3J0ZXI7XG4gICAgI2J1ZmZlciA9IFtdO1xuICAgICN0aW1lcjtcbiAgICAjdGltZW91dCA9IG51bGw7XG4gICAgI2V4cG9ydEluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICAjdGltZW91dEFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICBjb25zdHJ1Y3RvcihleHBvcnRlciwgeyBtYXhRdWV1ZVNpemUgPSAxMDAwLCBtYXhCYXRjaFNpemUgPSAxMDAsIHNjaGVkdWxlRGVsYXkgPSA1MDAwLCAvLyA1IHNlY29uZHNcbiAgICBleHBvcnRUcmlnZ2VyUmF0aW8gPSAwLjgsIH0gPSB7fSkge1xuICAgICAgICB0aGlzLiNtYXhRdWV1ZVNpemUgPSBtYXhRdWV1ZVNpemU7XG4gICAgICAgIHRoaXMuI21heEJhdGNoU2l6ZSA9IG1heEJhdGNoU2l6ZTtcbiAgICAgICAgdGhpcy4jc2NoZWR1bGVEZWxheSA9IHNjaGVkdWxlRGVsYXk7XG4gICAgICAgIHRoaXMuI2V4cG9ydFRyaWdnZXJTaXplID0gbWF4UXVldWVTaXplICogZXhwb3J0VHJpZ2dlclJhdGlvO1xuICAgICAgICB0aGlzLiNleHBvcnRlciA9IGV4cG9ydGVyO1xuICAgICAgICB0aGlzLiN0aW1lciA9IF90aW1lcjtcbiAgICAgICAgaWYgKCFpc0Jyb3dzZXJFbnZpcm9ubWVudCgpKSB7XG4gICAgICAgICAgICB0aGlzLiNydW5FeHBvcnRMb29wKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybignQmF0Y2hUcmFjZVByb2Nlc3NvciBpcyBub3Qgc3VwcG9ydGVkIGluIHRoZSBicm93c2VyLiBUcmFjZXMgd2lsbCBub3QgYmUgZXhwb3J0ZWQuJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgI3NhZmVBZGRJdGVtKGl0ZW0pIHtcbiAgICAgICAgaWYgKHRoaXMuI2J1ZmZlci5sZW5ndGggKyAxID4gdGhpcy4jbWF4UXVldWVTaXplKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0Ryb3BwaW5nIHRyYWNlIGJlY2F1c2UgYnVmZmVyIGlzIGZ1bGwnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBhZGQgdGhlIGl0ZW0gdG8gdGhlIGJ1ZmZlclxuICAgICAgICB0aGlzLiNidWZmZXIucHVzaChpdGVtKTtcbiAgICAgICAgaWYgKHRoaXMuI2J1ZmZlci5sZW5ndGggPiB0aGlzLiNleHBvcnRUcmlnZ2VyU2l6ZSkge1xuICAgICAgICAgICAgLy8gc3RhcnQgZXhwb3J0aW5nIGltbWVkaWF0ZWx5XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNleHBvcnRCYXRjaGVzKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgI3J1bkV4cG9ydExvb3AoKSB7XG4gICAgICAgIHRoaXMuI3RpbWVvdXQgPSB0aGlzLiN0aW1lci5zZXRUaW1lb3V0KGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIC8vIHNjaGVkdWxlZCBleHBvcnRcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuI2V4cG9ydEJhdGNoZXMoKTtcbiAgICAgICAgICAgIHRoaXMuI3J1bkV4cG9ydExvb3AoKTtcbiAgICAgICAgfSwgdGhpcy4jc2NoZWR1bGVEZWxheSk7XG4gICAgICAgIC8vIFdlIHNldCB0aGlzIHNvIHRoYXQgTm9kZSBubyBsb25nZXIgY29uc2lkZXJzIHRoaXMgcGFydCBvZiB0aGUgZXZlbnQgbG9vcCBhbmQga2VlcHMgdGhlXG4gICAgICAgIC8vIHByb2Nlc3MgYWxpdmUgdW50aWwgdGhlIHRpbWVyIGlzIGRvbmUuXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy4jdGltZW91dC51bnJlZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy4jdGltZW91dC51bnJlZigpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jICNleHBvcnRCYXRjaGVzKGZvcmNlID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKHRoaXMuI2J1ZmZlci5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsb2dnZXIuZGVidWcoYEV4cG9ydGluZyBiYXRjaGVzLiBGb3JjZTogJHtmb3JjZX0uIEJ1ZmZlciBzaXplOiAke3RoaXMuI2J1ZmZlci5sZW5ndGh9YCk7XG4gICAgICAgIGlmIChmb3JjZSB8fCB0aGlzLiNidWZmZXIubGVuZ3RoIDwgdGhpcy4jbWF4QmF0Y2hTaXplKSB7XG4gICAgICAgICAgICBjb25zdCB0b0V4cG9ydCA9IFsuLi50aGlzLiNidWZmZXJdO1xuICAgICAgICAgICAgdGhpcy4jYnVmZmVyID0gW107XG4gICAgICAgICAgICB0aGlzLiNleHBvcnRJblByb2dyZXNzID0gdHJ1ZTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuI2V4cG9ydGVyLmV4cG9ydCh0b0V4cG9ydCk7XG4gICAgICAgICAgICB0aGlzLiNleHBvcnRJblByb2dyZXNzID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy4jYnVmZmVyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGJhdGNoID0gdGhpcy4jYnVmZmVyLnNwbGljZSgwLCB0aGlzLiNtYXhCYXRjaFNpemUpO1xuICAgICAgICAgICAgdGhpcy4jZXhwb3J0SW5Qcm9ncmVzcyA9IHRydWU7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNleHBvcnRlci5leHBvcnQoYmF0Y2gpO1xuICAgICAgICAgICAgdGhpcy4jZXhwb3J0SW5Qcm9ncmVzcyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIG9uVHJhY2VTdGFydCh0cmFjZSkge1xuICAgICAgICBhd2FpdCB0aGlzLiNzYWZlQWRkSXRlbSh0cmFjZSk7XG4gICAgfVxuICAgIGFzeW5jIG9uVHJhY2VFbmQoX3RyYWNlKSB7XG4gICAgICAgIC8vIFdlIGRvbid0IHNlbmQgdHJhY2VzIG9uIGVuZCBiZWNhdXNlIHdlIGFscmVhZHkgc2VuZCB0aGVtIG9uIHN0YXJ0XG4gICAgfVxuICAgIGFzeW5jIG9uU3BhblN0YXJ0KF9zcGFuKSB7XG4gICAgICAgIC8vIFdlIGRvbid0IHNlbmQgc3BhbnMgb24gc3RhcnQgYmVjYXVzZSB3ZSBzZW5kIHRoZW0gYXQgdGhlIGVuZFxuICAgIH1cbiAgICBhc3luYyBvblNwYW5FbmQoc3Bhbikge1xuICAgICAgICBhd2FpdCB0aGlzLiNzYWZlQWRkSXRlbShzcGFuKTtcbiAgICB9XG4gICAgYXN5bmMgc2h1dGRvd24odGltZW91dCkge1xuICAgICAgICBpZiAodGltZW91dCkge1xuICAgICAgICAgICAgdGhpcy4jdGltZXIuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gZm9yY2Ugc2h1dGRvd24gdGhlIEhUVFAgcmVxdWVzdFxuICAgICAgICAgICAgICAgIHRoaXMuI3RpbWVvdXRBYm9ydENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgICAgICAgIH0sIHRpbWVvdXQpO1xuICAgICAgICB9XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnU2h1dHRpbmcgZG93biBncmFjZWZ1bGx5Jyk7XG4gICAgICAgIHdoaWxlICh0aGlzLiNidWZmZXIubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBXYWl0aW5nIGZvciBidWZmZXIgdG8gZW1wdHkuIEl0ZW1zIGxlZnQ6ICR7dGhpcy4jYnVmZmVyLmxlbmd0aH1gKTtcbiAgICAgICAgICAgIGlmICghdGhpcy4jZXhwb3J0SW5Qcm9ncmVzcykge1xuICAgICAgICAgICAgICAgIC8vIG5vIGN1cnJlbnQgZXhwb3J0IGluIHByb2dyZXNzLiBGb3JjaW5nIGFsbCBpdGVtcyB0byBiZSBleHBvcnRlZFxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuI2V4cG9ydEJhdGNoZXModHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy4jdGltZW91dEFib3J0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnVGltZW91dCByZWFjaGVkLCBmb3JjZSBmbHVzaGluZycpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuI2V4cG9ydEJhdGNoZXModHJ1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyB1c2luZyBzZXRUaW1lb3V0IHRvIGFkZCB0byB0aGUgZXZlbnQgbG9vcCBhbmQga2VlcCB0aGlzIGFsaXZlIHVudGlsIGRvbmVcbiAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB0aGlzLiN0aW1lci5zZXRUaW1lb3V0KHJlc29sdmUsIDUwMCkpO1xuICAgICAgICB9XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnQnVmZmVyIGVtcHR5LiBFeGl0aW5nJyk7XG4gICAgICAgIGlmICh0aGlzLiN0aW1lciAmJiB0aGlzLiN0aW1lb3V0KSB7XG4gICAgICAgICAgICAvLyBtYWtpbmcgc3VyZSB0aGVyZSBhcmUgbm8gbW9yZSByZXF1ZXN0c1xuICAgICAgICAgICAgdGhpcy4jdGltZXIuY2xlYXJUaW1lb3V0KHRoaXMuI3RpbWVvdXQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIGZvcmNlRmx1c2goKSB7XG4gICAgICAgIGlmICh0aGlzLiNidWZmZXIubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy4jZXhwb3J0QmF0Y2hlcyh0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBNdWx0aVRyYWNpbmdQcm9jZXNzb3Ige1xuICAgICNwcm9jZXNzb3JzID0gW107XG4gICAgYWRkVHJhY2VQcm9jZXNzb3IocHJvY2Vzc29yKSB7XG4gICAgICAgIHRoaXMuI3Byb2Nlc3NvcnMucHVzaChwcm9jZXNzb3IpO1xuICAgIH1cbiAgICBzZXRQcm9jZXNzb3JzKHByb2Nlc3NvcnMpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdTaHV0dGluZyBkb3duIG9sZCBwcm9jZXNzb3JzJyk7XG4gICAgICAgIGZvciAoY29uc3QgcHJvY2Vzc29yIG9mIHRoaXMuI3Byb2Nlc3NvcnMpIHtcbiAgICAgICAgICAgIHByb2Nlc3Nvci5zaHV0ZG93bigpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI3Byb2Nlc3NvcnMgPSBwcm9jZXNzb3JzO1xuICAgIH1cbiAgICBhc3luYyBvblRyYWNlU3RhcnQodHJhY2UpIHtcbiAgICAgICAgZm9yIChjb25zdCBwcm9jZXNzb3Igb2YgdGhpcy4jcHJvY2Vzc29ycykge1xuICAgICAgICAgICAgYXdhaXQgcHJvY2Vzc29yLm9uVHJhY2VTdGFydCh0cmFjZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgb25UcmFjZUVuZCh0cmFjZSkge1xuICAgICAgICBmb3IgKGNvbnN0IHByb2Nlc3NvciBvZiB0aGlzLiNwcm9jZXNzb3JzKSB7XG4gICAgICAgICAgICBhd2FpdCBwcm9jZXNzb3Iub25UcmFjZUVuZCh0cmFjZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgb25TcGFuU3RhcnQoc3Bhbikge1xuICAgICAgICBmb3IgKGNvbnN0IHByb2Nlc3NvciBvZiB0aGlzLiNwcm9jZXNzb3JzKSB7XG4gICAgICAgICAgICBhd2FpdCBwcm9jZXNzb3Iub25TcGFuU3RhcnQoc3Bhbik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgb25TcGFuRW5kKHNwYW4pIHtcbiAgICAgICAgZm9yIChjb25zdCBwcm9jZXNzb3Igb2YgdGhpcy4jcHJvY2Vzc29ycykge1xuICAgICAgICAgICAgYXdhaXQgcHJvY2Vzc29yLm9uU3BhbkVuZChzcGFuKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBzaHV0ZG93bih0aW1lb3V0KSB7XG4gICAgICAgIGZvciAoY29uc3QgcHJvY2Vzc29yIG9mIHRoaXMuI3Byb2Nlc3NvcnMpIHtcbiAgICAgICAgICAgIGF3YWl0IHByb2Nlc3Nvci5zaHV0ZG93bih0aW1lb3V0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBmb3JjZUZsdXNoKCkge1xuICAgICAgICBmb3IgKGNvbnN0IHByb2Nlc3NvciBvZiB0aGlzLiNwcm9jZXNzb3JzKSB7XG4gICAgICAgICAgICBhd2FpdCBwcm9jZXNzb3IuZm9yY2VGbHVzaCgpO1xuICAgICAgICB9XG4gICAgfVxufVxubGV0IF9kZWZhdWx0RXhwb3J0ZXIgPSBudWxsO1xubGV0IF9kZWZhdWx0UHJvY2Vzc29yID0gbnVsbDtcbmV4cG9ydCBmdW5jdGlvbiBkZWZhdWx0RXhwb3J0ZXIoKSB7XG4gICAgaWYgKCFfZGVmYXVsdEV4cG9ydGVyKSB7XG4gICAgICAgIF9kZWZhdWx0RXhwb3J0ZXIgPSBuZXcgQ29uc29sZVNwYW5FeHBvcnRlcigpO1xuICAgIH1cbiAgICByZXR1cm4gX2RlZmF1bHRFeHBvcnRlcjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBkZWZhdWx0UHJvY2Vzc29yKCkge1xuICAgIGlmICghX2RlZmF1bHRQcm9jZXNzb3IpIHtcbiAgICAgICAgX2RlZmF1bHRQcm9jZXNzb3IgPSBuZXcgQmF0Y2hUcmFjZVByb2Nlc3NvcihkZWZhdWx0RXhwb3J0ZXIoKSk7XG4gICAgfVxuICAgIHJldHVybiBfZGVmYXVsdFByb2Nlc3Nvcjtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXByb2Nlc3Nvci5tanMubWFwIiwiaW1wb3J0IHsgcmFuZG9tVVVJRCB9IGZyb20gJ0BvcGVuYWkvYWdlbnRzLWNvcmUvX3NoaW1zJztcbi8qKlxuICogR2VuZXJhdGUgYW4gSVNPIDg2MDEgdGltZXN0YW1wIG9mIHRoZSBjdXJyZW50IHRpbWUuXG4gKiBAcmV0dXJucyBBbiBJU08gODYwMSB0aW1lc3RhbXAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0aW1lSXNvKCkge1xuICAgIHJldHVybiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG59XG4vKipcbiAqIEdlbmVyYXRlIGEgdHJhY2UgSUQgYnkgY3JlYXRpbmcgYSByYW5kb20gVVVJRCB2NCBhbmQgcmVtb3ZpbmcgdGhlIGRhc2hlcy4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudFxuICogb2YgYHV1aWQ0KCkuaGV4YCBpbiBQeXRob24gYW5kIHByZWZpeGluZyBpdCB3aXRoIGB0cmFjZV9gLlxuICogQHJldHVybnMgQSB0cmFjZSBJRC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlVHJhY2VJZCgpIHtcbiAgICByZXR1cm4gYHRyYWNlXyR7cmFuZG9tVVVJRCgpLnJlcGxhY2UoLy0vZywgJycpfWA7XG59XG4vKipcbiAqIEdlbmVyYXRlIGEgc3BhbiBJRCBieSBjcmVhdGluZyBhIHJhbmRvbSBVVUlEIHY0IGFuZCByZW1vdmluZyB0aGUgZGFzaGVzLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50XG4gKiBvZiBgdXVpZDQoKS5oZXhgIGluIFB5dGhvbiBhbmQgcHJlZml4aW5nIGl0IHdpdGggYHNwYW5fYC5cbiAqIEByZXR1cm5zIEEgc3BhbiBJRC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlU3BhbklkKCkge1xuICAgIHJldHVybiBgc3Bhbl8ke3JhbmRvbVVVSUQoKS5yZXBsYWNlKC8tL2csICcnKS5zbGljZSgwLCAyNCl9YDtcbn1cbi8qKlxuICogR2VuZXJhdGUgYSBncm91cCBJRCBieSBjcmVhdGluZyBhIHJhbmRvbSBVVUlEIHY0IGFuZCByZW1vdmluZyB0aGUgZGFzaGVzLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50XG4gKiBvZiBgdXVpZDQoKS5oZXhgIGluIFB5dGhvbiBhbmQgcHJlZml4aW5nIGl0IHdpdGggYGdyb3VwX2AuXG4gKiBAcmV0dXJucyBBIGdyb3VwIElELlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVHcm91cElkKCkge1xuICAgIHJldHVybiBgZ3JvdXBfJHtyYW5kb21VVUlEKCkucmVwbGFjZSgvLS9nLCAnJykuc2xpY2UoMCwgMjQpfWA7XG59XG4vKipcbiAqIFJlbW92ZSBmaWVsZHMgdGhhdCBzdGFydCB3aXRoIGFuIHVuZGVyc2NvcmUgZnJvbSBhbiBvYmplY3QuXG4gKiBAcGFyYW0gb2JqIC0gVGhlIG9iamVjdCB0byByZW1vdmUgcHJpdmF0ZSBmaWVsZHMgZnJvbS5cbiAqIEByZXR1cm5zIEEgbmV3IG9iamVjdCB3aXRoIHByaXZhdGUgZmllbGRzIHJlbW92ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVQcml2YXRlRmllbGRzKG9iaikge1xuICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMob2JqKS5maWx0ZXIoKFtrZXldKSA9PiAha2V5LnN0YXJ0c1dpdGgoJ18nKSkpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dXRpbHMubWpzLm1hcCIsImltcG9ydCBsb2dnZXIgZnJvbSBcIi4uL2xvZ2dlci5tanNcIjtcbmltcG9ydCB7IGdlbmVyYXRlU3BhbklkLCByZW1vdmVQcml2YXRlRmllbGRzLCB0aW1lSXNvIH0gZnJvbSBcIi4vdXRpbHMubWpzXCI7XG5leHBvcnQgY2xhc3MgU3BhbiB7XG4gICAgdHlwZSA9ICd0cmFjZS5zcGFuJztcbiAgICAjZGF0YTtcbiAgICAjdHJhY2VJZDtcbiAgICAjc3BhbklkO1xuICAgICNwYXJlbnRJZDtcbiAgICAjcHJvY2Vzc29yO1xuICAgICNzdGFydGVkQXQ7XG4gICAgI2VuZGVkQXQ7XG4gICAgI2Vycm9yO1xuICAgICNwcmV2aW91c1NwYW47XG4gICAgY29uc3RydWN0b3Iob3B0aW9ucywgcHJvY2Vzc29yKSB7XG4gICAgICAgIHRoaXMuI3RyYWNlSWQgPSBvcHRpb25zLnRyYWNlSWQ7XG4gICAgICAgIHRoaXMuI3NwYW5JZCA9IG9wdGlvbnMuc3BhbklkID8/IGdlbmVyYXRlU3BhbklkKCk7XG4gICAgICAgIHRoaXMuI2RhdGEgPSBvcHRpb25zLmRhdGE7XG4gICAgICAgIHRoaXMuI3Byb2Nlc3NvciA9IHByb2Nlc3NvcjtcbiAgICAgICAgdGhpcy4jcGFyZW50SWQgPSBvcHRpb25zLnBhcmVudElkID8/IG51bGw7XG4gICAgICAgIHRoaXMuI2Vycm9yID0gb3B0aW9ucy5lcnJvciA/PyBudWxsO1xuICAgICAgICB0aGlzLiNzdGFydGVkQXQgPSBvcHRpb25zLnN0YXJ0ZWRBdCA/PyBudWxsO1xuICAgICAgICB0aGlzLiNlbmRlZEF0ID0gb3B0aW9ucy5lbmRlZEF0ID8/IG51bGw7XG4gICAgfVxuICAgIGdldCB0cmFjZUlkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jdHJhY2VJZDtcbiAgICB9XG4gICAgZ2V0IHNwYW5EYXRhKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jZGF0YTtcbiAgICB9XG4gICAgZ2V0IHNwYW5JZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3NwYW5JZDtcbiAgICB9XG4gICAgZ2V0IHBhcmVudElkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcGFyZW50SWQ7XG4gICAgfVxuICAgIGdldCBwcmV2aW91c1NwYW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcmV2aW91c1NwYW47XG4gICAgfVxuICAgIHNldCBwcmV2aW91c1NwYW4oc3Bhbikge1xuICAgICAgICB0aGlzLiNwcmV2aW91c1NwYW4gPSBzcGFuO1xuICAgIH1cbiAgICBzdGFydCgpIHtcbiAgICAgICAgaWYgKHRoaXMuI3N0YXJ0ZWRBdCkge1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ1NwYW4gYWxyZWFkeSBzdGFydGVkJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jc3RhcnRlZEF0ID0gdGltZUlzbygpO1xuICAgICAgICB0aGlzLiNwcm9jZXNzb3Iub25TcGFuU3RhcnQodGhpcyk7XG4gICAgfVxuICAgIGVuZCgpIHtcbiAgICAgICAgaWYgKHRoaXMuI2VuZGVkQXQpIHtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnU3BhbiBhbHJlYWR5IGZpbmlzaGVkJywgdGhpcy5zcGFuRGF0YSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jZW5kZWRBdCA9IHRpbWVJc28oKTtcbiAgICAgICAgdGhpcy4jcHJvY2Vzc29yLm9uU3BhbkVuZCh0aGlzKTtcbiAgICB9XG4gICAgc2V0RXJyb3IoZXJyb3IpIHtcbiAgICAgICAgdGhpcy4jZXJyb3IgPSBlcnJvcjtcbiAgICB9XG4gICAgZ2V0IGVycm9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jZXJyb3I7XG4gICAgfVxuICAgIGdldCBzdGFydGVkQXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNzdGFydGVkQXQ7XG4gICAgfVxuICAgIGdldCBlbmRlZEF0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jZW5kZWRBdDtcbiAgICB9XG4gICAgY2xvbmUoKSB7XG4gICAgICAgIGNvbnN0IHNwYW4gPSBuZXcgU3Bhbih7XG4gICAgICAgICAgICB0cmFjZUlkOiB0aGlzLnRyYWNlSWQsXG4gICAgICAgICAgICBzcGFuSWQ6IHRoaXMuc3BhbklkLFxuICAgICAgICAgICAgcGFyZW50SWQ6IHRoaXMucGFyZW50SWQgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgICAgZGF0YTogdGhpcy5zcGFuRGF0YSxcbiAgICAgICAgICAgIHN0YXJ0ZWRBdDogdGhpcy4jc3RhcnRlZEF0ID8/IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGVuZGVkQXQ6IHRoaXMuI2VuZGVkQXQgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgICAgZXJyb3I6IHRoaXMuI2Vycm9yID8/IHVuZGVmaW5lZCxcbiAgICAgICAgfSwgdGhpcy4jcHJvY2Vzc29yKTtcbiAgICAgICAgc3Bhbi5wcmV2aW91c1NwYW4gPSB0aGlzLnByZXZpb3VzU3Bhbj8uY2xvbmUoKTtcbiAgICAgICAgcmV0dXJuIHNwYW47XG4gICAgfVxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG9iamVjdDogdGhpcy50eXBlLFxuICAgICAgICAgICAgaWQ6IHRoaXMuc3BhbklkLFxuICAgICAgICAgICAgdHJhY2VfaWQ6IHRoaXMudHJhY2VJZCxcbiAgICAgICAgICAgIHBhcmVudF9pZDogdGhpcy5wYXJlbnRJZCxcbiAgICAgICAgICAgIHN0YXJ0ZWRfYXQ6IHRoaXMuc3RhcnRlZEF0LFxuICAgICAgICAgICAgZW5kZWRfYXQ6IHRoaXMuZW5kZWRBdCxcbiAgICAgICAgICAgIHNwYW5fZGF0YTogcmVtb3ZlUHJpdmF0ZUZpZWxkcyh0aGlzLnNwYW5EYXRhKSxcbiAgICAgICAgICAgIGVycm9yOiB0aGlzLmVycm9yLFxuICAgICAgICB9O1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBOb29wU3BhbiBleHRlbmRzIFNwYW4ge1xuICAgIGNvbnN0cnVjdG9yKGRhdGEsIHByb2Nlc3Nvcikge1xuICAgICAgICBzdXBlcih7IHRyYWNlSWQ6ICduby1vcCcsIHNwYW5JZDogJ25vLW9wJywgZGF0YSB9LCBwcm9jZXNzb3IpO1xuICAgIH1cbiAgICBzdGFydCgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlbmQoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc2V0RXJyb3IoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdG9KU09OKCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zcGFucy5tanMubWFwIiwiaW1wb3J0IHsgZGVmYXVsdFByb2Nlc3NvciB9IGZyb20gXCIuL3Byb2Nlc3Nvci5tanNcIjtcbmltcG9ydCB7IGdlbmVyYXRlVHJhY2VJZCB9IGZyb20gXCIuL3V0aWxzLm1qc1wiO1xuZXhwb3J0IGNsYXNzIFRyYWNlIHtcbiAgICB0eXBlID0gJ3RyYWNlJztcbiAgICB0cmFjZUlkO1xuICAgIG5hbWU7XG4gICAgZ3JvdXBJZCA9IG51bGw7XG4gICAgbWV0YWRhdGE7XG4gICAgI3Byb2Nlc3NvcjtcbiAgICAjc3RhcnRlZDtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zLCBwcm9jZXNzb3IpIHtcbiAgICAgICAgdGhpcy50cmFjZUlkID0gb3B0aW9ucy50cmFjZUlkID8/IGdlbmVyYXRlVHJhY2VJZCgpO1xuICAgICAgICB0aGlzLm5hbWUgPSBvcHRpb25zLm5hbWUgPz8gJ0FnZW50IHdvcmtmbG93JztcbiAgICAgICAgdGhpcy5ncm91cElkID0gb3B0aW9ucy5ncm91cElkID8/IG51bGw7XG4gICAgICAgIHRoaXMubWV0YWRhdGEgPSBvcHRpb25zLm1ldGFkYXRhID8/IHt9O1xuICAgICAgICB0aGlzLiNwcm9jZXNzb3IgPSBwcm9jZXNzb3IgPz8gZGVmYXVsdFByb2Nlc3NvcigpO1xuICAgICAgICB0aGlzLiNzdGFydGVkID0gb3B0aW9ucy5zdGFydGVkID8/IGZhbHNlO1xuICAgIH1cbiAgICBhc3luYyBzdGFydCgpIHtcbiAgICAgICAgaWYgKHRoaXMuI3N0YXJ0ZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNzdGFydGVkID0gdHJ1ZTtcbiAgICAgICAgYXdhaXQgdGhpcy4jcHJvY2Vzc29yLm9uVHJhY2VTdGFydCh0aGlzKTtcbiAgICB9XG4gICAgYXN5bmMgZW5kKCkge1xuICAgICAgICBpZiAoIXRoaXMuI3N0YXJ0ZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNzdGFydGVkID0gZmFsc2U7XG4gICAgICAgIGF3YWl0IHRoaXMuI3Byb2Nlc3Nvci5vblRyYWNlRW5kKHRoaXMpO1xuICAgIH1cbiAgICBjbG9uZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUcmFjZSh7XG4gICAgICAgICAgICB0cmFjZUlkOiB0aGlzLnRyYWNlSWQsXG4gICAgICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgICAgICBncm91cElkOiB0aGlzLmdyb3VwSWQgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgICAgbWV0YWRhdGE6IHRoaXMubWV0YWRhdGEsXG4gICAgICAgICAgICBzdGFydGVkOiB0aGlzLiNzdGFydGVkLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdG9KU09OKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgb2JqZWN0OiB0aGlzLnR5cGUsXG4gICAgICAgICAgICBpZDogdGhpcy50cmFjZUlkLFxuICAgICAgICAgICAgd29ya2Zsb3dfbmFtZTogdGhpcy5uYW1lLFxuICAgICAgICAgICAgZ3JvdXBfaWQ6IHRoaXMuZ3JvdXBJZCxcbiAgICAgICAgICAgIG1ldGFkYXRhOiB0aGlzLm1ldGFkYXRhLFxuICAgICAgICB9O1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBOb29wVHJhY2UgZXh0ZW5kcyBUcmFjZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKHt9KTtcbiAgICB9XG4gICAgYXN5bmMgc3RhcnQoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXN5bmMgZW5kKCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dHJhY2VzLm1qcy5tYXAiLCJpbXBvcnQgeyBnZXRDdXJyZW50U3BhbiwgZ2V0Q3VycmVudFRyYWNlIH0gZnJvbSBcIi4vY29udGV4dC5tanNcIjtcbmltcG9ydCB7IGxvYWRFbnYsIHRyYWNpbmcgfSBmcm9tIFwiLi4vY29uZmlnLm1qc1wiO1xuaW1wb3J0IGxvZ2dlciBmcm9tIFwiLi4vbG9nZ2VyLm1qc1wiO1xuaW1wb3J0IHsgTXVsdGlUcmFjaW5nUHJvY2Vzc29yIH0gZnJvbSBcIi4vcHJvY2Vzc29yLm1qc1wiO1xuaW1wb3J0IHsgTm9vcFNwYW4sIFNwYW4gfSBmcm9tIFwiLi9zcGFucy5tanNcIjtcbmltcG9ydCB7IE5vb3BUcmFjZSwgVHJhY2UgfSBmcm9tIFwiLi90cmFjZXMubWpzXCI7XG5pbXBvcnQgeyBnZW5lcmF0ZVRyYWNlSWQgfSBmcm9tIFwiLi91dGlscy5tanNcIjtcbmV4cG9ydCBjbGFzcyBUcmFjZVByb3ZpZGVyIHtcbiAgICAjbXVsdGlQcm9jZXNzb3I7XG4gICAgI2Rpc2FibGVkO1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLiNtdWx0aVByb2Nlc3NvciA9IG5ldyBNdWx0aVRyYWNpbmdQcm9jZXNzb3IoKTtcbiAgICAgICAgdGhpcy4jZGlzYWJsZWQgPSB0cmFjaW5nLmRpc2FibGVkO1xuICAgICAgICBpZiAobG9hZEVudigpLk5PREVfRU5WID09PSAndGVzdCcpIHtcbiAgICAgICAgICAgIC8vIGRpc2FibGUgdHJhY2luZyBpbiB0ZXN0cyBieSBkZWZhdWx0XG4gICAgICAgICAgICB0aGlzLiNkaXNhYmxlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkIGEgcHJvY2Vzc29yIHRvIHRoZSBsaXN0IG9mIHByb2Nlc3NvcnMuIEVhY2ggcHJvY2Vzc29yIHdpbGwgcmVjZWl2ZSBhbGwgdHJhY2VzL3NwYW5zLlxuICAgICAqXG4gICAgICogQHBhcmFtIHByb2Nlc3NvciAtIFRoZSBwcm9jZXNzb3IgdG8gYWRkLlxuICAgICAqL1xuICAgIHJlZ2lzdGVyUHJvY2Vzc29yKHByb2Nlc3Nvcikge1xuICAgICAgICB0aGlzLiNtdWx0aVByb2Nlc3Nvci5hZGRUcmFjZVByb2Nlc3Nvcihwcm9jZXNzb3IpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGxpc3Qgb2YgcHJvY2Vzc29ycy4gVGhpcyB3aWxsIHJlcGxhY2UgYW55IGV4aXN0aW5nIHByb2Nlc3NvcnMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvY2Vzc29ycyAtIFRoZSBsaXN0IG9mIHByb2Nlc3NvcnMgdG8gc2V0LlxuICAgICAqL1xuICAgIHNldFByb2Nlc3NvcnMocHJvY2Vzc29ycykge1xuICAgICAgICB0aGlzLiNtdWx0aVByb2Nlc3Nvci5zZXRQcm9jZXNzb3JzKHByb2Nlc3NvcnMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGN1cnJlbnQgdHJhY2UuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgY3VycmVudCB0cmFjZS5cbiAgICAgKi9cbiAgICBnZXRDdXJyZW50VHJhY2UoKSB7XG4gICAgICAgIHJldHVybiBnZXRDdXJyZW50VHJhY2UoKTtcbiAgICB9XG4gICAgZ2V0Q3VycmVudFNwYW4oKSB7XG4gICAgICAgIHJldHVybiBnZXRDdXJyZW50U3BhbigpO1xuICAgIH1cbiAgICBzZXREaXNhYmxlZChkaXNhYmxlZCkge1xuICAgICAgICB0aGlzLiNkaXNhYmxlZCA9IGRpc2FibGVkO1xuICAgIH1cbiAgICBjcmVhdGVUcmFjZSh0cmFjZU9wdGlvbnMpIHtcbiAgICAgICAgaWYgKHRoaXMuI2Rpc2FibGVkKSB7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1RyYWNpbmcgaXMgZGlzYWJsZWQsIE5vdCBjcmVhdGluZyB0cmFjZSAlbycsIHRyYWNlT3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE5vb3BUcmFjZSgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRyYWNlSWQgPSB0cmFjZU9wdGlvbnMudHJhY2VJZCA/PyBnZW5lcmF0ZVRyYWNlSWQoKTtcbiAgICAgICAgY29uc3QgbmFtZSA9IHRyYWNlT3B0aW9ucy5uYW1lID8/ICdBZ2VudCB3b3JrZmxvdyc7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnQ3JlYXRpbmcgdHJhY2UgJXMgd2l0aCBuYW1lICVzJywgdHJhY2VJZCwgbmFtZSk7XG4gICAgICAgIHJldHVybiBuZXcgVHJhY2UoeyAuLi50cmFjZU9wdGlvbnMsIG5hbWUsIHRyYWNlSWQgfSwgdGhpcy4jbXVsdGlQcm9jZXNzb3IpO1xuICAgIH1cbiAgICBjcmVhdGVTcGFuKHNwYW5PcHRpb25zLCBwYXJlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuI2Rpc2FibGVkIHx8IHNwYW5PcHRpb25zLmRpc2FibGVkKSB7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1RyYWNpbmcgaXMgZGlzYWJsZWQsIE5vdCBjcmVhdGluZyBzcGFuICVvJywgc3Bhbk9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBOb29wU3BhbihzcGFuT3B0aW9ucy5kYXRhLCB0aGlzLiNtdWx0aVByb2Nlc3Nvcik7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHBhcmVudElkO1xuICAgICAgICBsZXQgdHJhY2VJZDtcbiAgICAgICAgaWYgKCFwYXJlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRUcmFjZSA9IGdldEN1cnJlbnRUcmFjZSgpO1xuICAgICAgICAgICAgY29uc3QgY3VycmVudFNwYW4gPSBnZXRDdXJyZW50U3BhbigpO1xuICAgICAgICAgICAgaWYgKCFjdXJyZW50VHJhY2UpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ05vIGFjdGl2ZSB0cmFjZS4gTWFrZSBzdXJlIHRvIHN0YXJ0IGEgdHJhY2Ugd2l0aCBgd2l0aFRyYWNlKClgIGZpcnN0LiBSZXR1cm5pbmcgTm9vcFNwYW4uJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBOb29wU3BhbihzcGFuT3B0aW9ucy5kYXRhLCB0aGlzLiNtdWx0aVByb2Nlc3Nvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY3VycmVudFNwYW4gaW5zdGFuY2VvZiBOb29wU3BhbiB8fFxuICAgICAgICAgICAgICAgIGN1cnJlbnRUcmFjZSBpbnN0YW5jZW9mIE5vb3BUcmFjZSkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgUGFyZW50ICR7Y3VycmVudFNwYW59IG9yICR7Y3VycmVudFRyYWNlfSBpcyBuby1vcCwgcmV0dXJuaW5nIE5vb3BTcGFuYCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBOb29wU3BhbihzcGFuT3B0aW9ucy5kYXRhLCB0aGlzLiNtdWx0aVByb2Nlc3Nvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cmFjZUlkID0gY3VycmVudFRyYWNlLnRyYWNlSWQ7XG4gICAgICAgICAgICBpZiAoY3VycmVudFNwYW4pIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1VzaW5nIHBhcmVudCBzcGFuICVzJywgY3VycmVudFNwYW4uc3BhbklkKTtcbiAgICAgICAgICAgICAgICBwYXJlbnRJZCA9IGN1cnJlbnRTcGFuLnNwYW5JZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnTm8gcGFyZW50IHNwYW4sIHVzaW5nIGN1cnJlbnQgdHJhY2UgJXMnLCBjdXJyZW50VHJhY2UudHJhY2VJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgVHJhY2UpIHtcbiAgICAgICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBOb29wVHJhY2UpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1BhcmVudCB0cmFjZSBpcyBuby1vcCwgcmV0dXJuaW5nIE5vb3BTcGFuJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBOb29wU3BhbihzcGFuT3B0aW9ucy5kYXRhLCB0aGlzLiNtdWx0aVByb2Nlc3Nvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cmFjZUlkID0gcGFyZW50LnRyYWNlSWQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgU3Bhbikge1xuICAgICAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIE5vb3BTcGFuKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdQYXJlbnQgc3BhbiBpcyBuby1vcCwgcmV0dXJuaW5nIE5vb3BTcGFuJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBOb29wU3BhbihzcGFuT3B0aW9ucy5kYXRhLCB0aGlzLiNtdWx0aVByb2Nlc3Nvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYXJlbnRJZCA9IHBhcmVudC5zcGFuSWQ7XG4gICAgICAgICAgICB0cmFjZUlkID0gcGFyZW50LnRyYWNlSWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0cmFjZUlkKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ05vIHRyYWNlSWQgZm91bmQuIE1ha2Ugc3VyZSB0byBzdGFydCBhIHRyYWNlIHdpdGggYHdpdGhUcmFjZSgpYCBmaXJzdC4gUmV0dXJuaW5nIE5vb3BTcGFuLicpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBOb29wU3BhbihzcGFuT3B0aW9ucy5kYXRhLCB0aGlzLiNtdWx0aVByb2Nlc3Nvcik7XG4gICAgICAgIH1cbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBDcmVhdGluZyBzcGFuICR7SlNPTi5zdHJpbmdpZnkoc3Bhbk9wdGlvbnMuZGF0YSl9IHdpdGggaWQgJHtzcGFuT3B0aW9ucy5zcGFuSWQgPz8gdHJhY2VJZH1gKTtcbiAgICAgICAgcmV0dXJuIG5ldyBTcGFuKHtcbiAgICAgICAgICAgIC4uLnNwYW5PcHRpb25zLFxuICAgICAgICAgICAgdHJhY2VJZCxcbiAgICAgICAgICAgIHBhcmVudElkLFxuICAgICAgICB9LCB0aGlzLiNtdWx0aVByb2Nlc3Nvcik7XG4gICAgfVxuICAgIHNodXRkb3duKHRpbWVvdXQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnU2h1dHRpbmcgZG93biB0cmFjaW5nIHByb3ZpZGVyJyk7XG4gICAgICAgICAgICB0aGlzLiNtdWx0aVByb2Nlc3Nvci5zaHV0ZG93bih0aW1lb3V0KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcignRXJyb3Igc2h1dHRpbmcgZG93biB0cmFjaW5nIHByb3ZpZGVyICVvJywgZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxufVxubGV0IEdMT0JBTF9UUkFDRV9QUk9WSURFUiA9IHVuZGVmaW5lZDtcbmV4cG9ydCBmdW5jdGlvbiBnZXRHbG9iYWxUcmFjZVByb3ZpZGVyKCkge1xuICAgIGlmICghR0xPQkFMX1RSQUNFX1BST1ZJREVSKSB7XG4gICAgICAgIEdMT0JBTF9UUkFDRV9QUk9WSURFUiA9IG5ldyBUcmFjZVByb3ZpZGVyKCk7XG4gICAgfVxuICAgIHJldHVybiBHTE9CQUxfVFJBQ0VfUFJPVklERVI7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wcm92aWRlci5tanMubWFwIiwiaW1wb3J0IHsgcmVzZXRDdXJyZW50U3Bhbiwgc2V0Q3VycmVudFNwYW4sIHdpdGhOZXdTcGFuQ29udGV4dCwgfSBmcm9tIFwiLi9jb250ZXh0Lm1qc1wiO1xuaW1wb3J0IHsgZ2V0R2xvYmFsVHJhY2VQcm92aWRlciB9IGZyb20gXCIuL3Byb3ZpZGVyLm1qc1wiO1xuZnVuY3Rpb24gX3dpdGhTcGFuRmFjdG9yeShjcmVhdGVTcGFuKSB7XG4gICAgcmV0dXJuIGFzeW5jIChmbiwgLi4uYXJncykgPT4ge1xuICAgICAgICAvLyBDcmVhdGluZyBhIG5ldyBzcGFuIGNvbnRleHQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHByZXZpb3VzIHNwYW4gaXMgY29ycmVjdGx5IHJlc2V0XG4gICAgICAgIHJldHVybiB3aXRoTmV3U3BhbkNvbnRleHQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3BhbiA9IGNyZWF0ZVNwYW4oLi4uYXJncyk7XG4gICAgICAgICAgICBzZXRDdXJyZW50U3BhbihzcGFuKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgc3Bhbi5zdGFydCgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBmbihzcGFuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHNwYW4uc2V0RXJyb3Ioe1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBlcnJvci5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiBlcnJvci5kYXRhLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgc3Bhbi5lbmQoKTtcbiAgICAgICAgICAgICAgICByZXNldEN1cnJlbnRTcGFuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG59XG4vKipcbiAqIENyZWF0ZSBhIG5ldyByZXNwb25zZSBzcGFuLiBUaGUgc3BhbiB3aWxsIG5vdCBiZSBzdGFydGVkIGF1dG9tYXRpY2FsbHksIHlvdSBzaG91bGQgZWl0aGVyXG4gKiB1c2UgYHdpdGhSZXNwb25zZVNwYW4oKWAgb3IgY2FsbCBgc3Bhbi5zdGFydCgpYCBhbmQgYHNwYW4uZW5kKClgIG1hbnVhbGx5LlxuICpcbiAqIFRoaXMgc3BhbiBjYXB0dXJlcyB0aGUgZGV0YWlscyBvZiBhIG1vZGVsIHJlc3BvbnNlLCBwcmltYXJpbHkgdGhlIHJlc3BvbnNlIGlkZW50aWZpZXIuXG4gKiBJZiB5b3UgbmVlZCB0byBjYXB0dXJlIGRldGFpbGVkIGdlbmVyYXRpb24gaW5mb3JtYXRpb24gc3VjaCBhcyBpbnB1dC9vdXRwdXQgbWVzc2FnZXMsXG4gKiBtb2RlbCBjb25maWd1cmF0aW9uLCBvciB1c2FnZSBkYXRhLCB1c2UgYGNyZWF0ZUdlbmVyYXRpb25TcGFuKClgIGluc3RlYWQuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBzcGFuIGNyZWF0aW9uIG9wdGlvbnMsIGluY2x1ZGluZyBzcGFuIGRhdGEgYW5kIGlkZW50aWZpZXJzLlxuICogQHBhcmFtIHBhcmVudCAtIFRoZSBwYXJlbnQgc3BhbiBvciB0cmFjZS4gSWYgbm90IHByb3ZpZGVkLCB0aGUgY3VycmVudCB0cmFjZS9zcGFuIHdpbGwgYmUgdXNlZFxuICogYXV0b21hdGljYWxseS5cbiAqXG4gKiBAcmV0dXJucyBUaGUgbmV3bHkgY3JlYXRlZCByZXNwb25zZSBzcGFuLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVzcG9uc2VTcGFuKG9wdGlvbnMsIHBhcmVudCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgICByZXR1cm4gZ2V0R2xvYmFsVHJhY2VQcm92aWRlcigpLmNyZWF0ZVNwYW4oe1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICB0eXBlOiAncmVzcG9uc2UnLFxuICAgICAgICAgICAgLi4ub3B0aW9ucy5kYXRhLFxuICAgICAgICB9LFxuICAgIH0sIHBhcmVudCk7XG59XG4vKipcbiAqIENyZWF0ZSBhIG5ldyByZXNwb25zZSBzcGFuIGFuZCBhdXRvbWF0aWNhbGx5IHN0YXJ0IGFuZCBlbmQgaXQuXG4gKlxuICogVGhpcyBzcGFuIGNhcHR1cmVzIHRoZSBkZXRhaWxzIG9mIGEgbW9kZWwgcmVzcG9uc2UsIHByaW1hcmlseSB0aGUgcmVzcG9uc2UgaWRlbnRpZmllci5cbiAqIElmIHlvdSBuZWVkIHRvIGNhcHR1cmUgZGV0YWlsZWQgZ2VuZXJhdGlvbiBpbmZvcm1hdGlvbiBzdWNoIGFzIGlucHV0L291dHB1dCBtZXNzYWdlcyxcbiAqIG1vZGVsIGNvbmZpZ3VyYXRpb24sIG9yIHVzYWdlIGRhdGEsIHVzZSBgZ2VuZXJhdGlvblNwYW4oKWAgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGNvbnN0IHdpdGhSZXNwb25zZVNwYW4gPSBfd2l0aFNwYW5GYWN0b3J5KGNyZWF0ZVJlc3BvbnNlU3Bhbik7XG4vKipcbiAqIENyZWF0ZSBhIG5ldyBhZ2VudCBzcGFuLiBUaGUgc3BhbiB3aWxsIG5vdCBiZSBzdGFydGVkIGF1dG9tYXRpY2FsbHksIHlvdSBzaG91bGQgZWl0aGVyXG4gKiB1c2UgYHdpdGhBZ2VudFNwYW4oKWAgb3IgY2FsbCBgc3Bhbi5zdGFydCgpYCBhbmQgYHNwYW4uZW5kKClgIG1hbnVhbGx5LlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgc3BhbiBjcmVhdGlvbiBvcHRpb25zLCBpbmNsdWRpbmcgc3BhbiBkYXRhIGFuZCBpZGVudGlmaWVycy5cbiAqIEBwYXJhbSBwYXJlbnQgLSBUaGUgcGFyZW50IHNwYW4gb3IgdHJhY2UuIElmIG5vdCBwcm92aWRlZCwgdGhlIGN1cnJlbnQgdHJhY2Uvc3BhbiB3aWxsIGJlIHVzZWRcbiAqIGF1dG9tYXRpY2FsbHkuXG4gKlxuICogQHJldHVybnMgVGhlIG5ld2x5IGNyZWF0ZWQgYWdlbnQgc3Bhbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFnZW50U3BhbihvcHRpb25zLCBwYXJlbnQpIHtcbiAgICByZXR1cm4gZ2V0R2xvYmFsVHJhY2VQcm92aWRlcigpLmNyZWF0ZVNwYW4oe1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICB0eXBlOiAnYWdlbnQnLFxuICAgICAgICAgICAgbmFtZTogb3B0aW9ucz8uZGF0YT8ubmFtZSA/PyAnQWdlbnQnLFxuICAgICAgICAgICAgLi4ub3B0aW9ucz8uZGF0YSxcbiAgICAgICAgfSxcbiAgICB9LCBwYXJlbnQpO1xufVxuLyoqXG4gKiBDcmVhdGUgYSBuZXcgYWdlbnQgc3BhbiBhbmQgYXV0b21hdGljYWxseSBzdGFydCBhbmQgZW5kIGl0LlxuICovXG5leHBvcnQgY29uc3Qgd2l0aEFnZW50U3BhbiA9IF93aXRoU3BhbkZhY3RvcnkoY3JlYXRlQWdlbnRTcGFuKTtcbi8qKlxuICogQ3JlYXRlIGEgbmV3IGZ1bmN0aW9uIHNwYW4uIFRoZSBzcGFuIHdpbGwgbm90IGJlIHN0YXJ0ZWQgYXV0b21hdGljYWxseSwgeW91IHNob3VsZCBlaXRoZXJcbiAqIHVzZSBgd2l0aEZ1bmN0aW9uU3BhbigpYCBvciBjYWxsIGBzcGFuLnN0YXJ0KClgIGFuZCBgc3Bhbi5lbmQoKWAgbWFudWFsbHkuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBzcGFuIGNyZWF0aW9uIG9wdGlvbnMsIGluY2x1ZGluZyBzcGFuIGRhdGEgYW5kIGlkZW50aWZpZXJzLlxuICogQHBhcmFtIHBhcmVudCAtIFRoZSBwYXJlbnQgc3BhbiBvciB0cmFjZS4gSWYgbm90IHByb3ZpZGVkLCB0aGUgY3VycmVudCB0cmFjZS9zcGFuIHdpbGwgYmUgdXNlZFxuICogYXV0b21hdGljYWxseS5cbiAqXG4gKiBAcmV0dXJucyBUaGUgbmV3bHkgY3JlYXRlZCBmdW5jdGlvbiBzcGFuLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRnVuY3Rpb25TcGFuKG9wdGlvbnMsIHBhcmVudCkge1xuICAgIHJldHVybiBnZXRHbG9iYWxUcmFjZVByb3ZpZGVyKCkuY3JlYXRlU3Bhbih7XG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIHR5cGU6ICdmdW5jdGlvbicsXG4gICAgICAgICAgICBpbnB1dDogb3B0aW9ucz8uZGF0YT8uaW5wdXQgPz8gJycsXG4gICAgICAgICAgICBvdXRwdXQ6IG9wdGlvbnM/LmRhdGE/Lm91dHB1dCA/PyAnJyxcbiAgICAgICAgICAgIC4uLm9wdGlvbnM/LmRhdGEsXG4gICAgICAgIH0sXG4gICAgfSwgcGFyZW50KTtcbn1cbi8qKlxuICogQ3JlYXRlIGEgbmV3IGZ1bmN0aW9uIHNwYW4gYW5kIGF1dG9tYXRpY2FsbHkgc3RhcnQgYW5kIGVuZCBpdC5cbiAqL1xuZXhwb3J0IGNvbnN0IHdpdGhGdW5jdGlvblNwYW4gPSBfd2l0aFNwYW5GYWN0b3J5KGNyZWF0ZUZ1bmN0aW9uU3Bhbik7XG4vKipcbiAqIENyZWF0ZSBhIG5ldyBoYW5kb2ZmIHNwYW4uIFRoZSBzcGFuIHdpbGwgbm90IGJlIHN0YXJ0ZWQgYXV0b21hdGljYWxseSwgeW91IHNob3VsZCBlaXRoZXJcbiAqIHVzZSBgd2l0aEhhbmRvZmZTcGFuKClgIG9yIGNhbGwgYHNwYW4uc3RhcnQoKWAgYW5kIGBzcGFuLmVuZCgpYCBtYW51YWxseS5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIHNwYW4gY3JlYXRpb24gb3B0aW9ucywgaW5jbHVkaW5nIHNwYW4gZGF0YSBhbmQgaWRlbnRpZmllcnMuXG4gKiBAcGFyYW0gcGFyZW50IC0gVGhlIHBhcmVudCBzcGFuIG9yIHRyYWNlLiBJZiBub3QgcHJvdmlkZWQsIHRoZSBjdXJyZW50IHRyYWNlL3NwYW4gd2lsbCBiZSB1c2VkXG4gKiBhdXRvbWF0aWNhbGx5LlxuICpcbiAqIEByZXR1cm5zIFRoZSBuZXdseSBjcmVhdGVkIGhhbmRvZmYgc3Bhbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUhhbmRvZmZTcGFuKG9wdGlvbnMsIHBhcmVudCkge1xuICAgIHJldHVybiBnZXRHbG9iYWxUcmFjZVByb3ZpZGVyKCkuY3JlYXRlU3Bhbih7XG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIGRhdGE6IHsgdHlwZTogJ2hhbmRvZmYnLCAuLi5vcHRpb25zPy5kYXRhIH0sXG4gICAgfSwgcGFyZW50KTtcbn1cbi8qKlxuICogQ3JlYXRlIGEgbmV3IGhhbmRvZmYgc3BhbiBhbmQgYXV0b21hdGljYWxseSBzdGFydCBhbmQgZW5kIGl0LlxuICovXG5leHBvcnQgY29uc3Qgd2l0aEhhbmRvZmZTcGFuID0gX3dpdGhTcGFuRmFjdG9yeShjcmVhdGVIYW5kb2ZmU3Bhbik7XG4vKipcbiAqIENyZWF0ZSBhIG5ldyBnZW5lcmF0aW9uIHNwYW4uIFRoZSBzcGFuIHdpbGwgbm90IGJlIHN0YXJ0ZWQgYXV0b21hdGljYWxseSwgeW91IHNob3VsZCBlaXRoZXJcbiAqIHVzZSBgd2l0aEdlbmVyYXRpb25TcGFuKClgIG9yIGNhbGwgYHNwYW4uc3RhcnQoKWAgYW5kIGBzcGFuLmVuZCgpYCBtYW51YWxseS5cbiAqXG4gKiBUaGlzIHNwYW4gY2FwdHVyZXMgdGhlIGRldGFpbHMgb2YgYSBtb2RlbCBnZW5lcmF0aW9uLCBpbmNsdWRpbmcgaW5wdXQvb3V0cHV0IG1lc3NhZ2VcbiAqIHNlcXVlbmNlcywgbW9kZWwgaW5mb3JtYXRpb24sIGFuZCB1c2FnZSBkYXRhLiBJZiB5b3Ugb25seSBuZWVkIHRvIGNhcHR1cmUgYSBtb2RlbCByZXNwb25zZVxuICogaWRlbnRpZmllciwgY29uc2lkZXIgdXNpbmcgYGNyZWF0ZVJlc3BvbnNlU3BhbigpYCBpbnN0ZWFkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlR2VuZXJhdGlvblNwYW4ob3B0aW9ucywgcGFyZW50KSB7XG4gICAgcmV0dXJuIGdldEdsb2JhbFRyYWNlUHJvdmlkZXIoKS5jcmVhdGVTcGFuKHtcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgdHlwZTogJ2dlbmVyYXRpb24nLFxuICAgICAgICAgICAgLi4ub3B0aW9ucz8uZGF0YSxcbiAgICAgICAgfSxcbiAgICB9LCBwYXJlbnQpO1xufVxuLyoqIEF1dG9tYXRpY2FsbHkgY3JlYXRlIGEgZ2VuZXJhdGlvbiBzcGFuLCBydW4gZm4gYW5kIGNsb3NlIHRoZSBzcGFuICovXG5leHBvcnQgY29uc3Qgd2l0aEdlbmVyYXRpb25TcGFuID0gX3dpdGhTcGFuRmFjdG9yeShjcmVhdGVHZW5lcmF0aW9uU3Bhbik7XG4vKipcbiAqIENyZWF0ZSBhIG5ldyBjdXN0b20gc3Bhbi4gVGhlIHNwYW4gd2lsbCBub3QgYmUgc3RhcnRlZCBhdXRvbWF0aWNhbGx5LCB5b3Ugc2hvdWxkIGVpdGhlciB1c2VcbiAqIGB3aXRoQ3VzdG9tU3BhbigpYCBvciBjYWxsIGBzcGFuLnN0YXJ0KClgIGFuZCBgc3Bhbi5lbmQoKWAgbWFudWFsbHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDdXN0b21TcGFuKG9wdGlvbnMsIHBhcmVudCkge1xuICAgIHJldHVybiBnZXRHbG9iYWxUcmFjZVByb3ZpZGVyKCkuY3JlYXRlU3Bhbih7XG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIHR5cGU6ICdjdXN0b20nLFxuICAgICAgICAgICAgZGF0YToge30sXG4gICAgICAgICAgICAuLi5vcHRpb25zPy5kYXRhLFxuICAgICAgICB9LFxuICAgIH0sIHBhcmVudCk7XG59XG5leHBvcnQgY29uc3Qgd2l0aEN1c3RvbVNwYW4gPSBfd2l0aFNwYW5GYWN0b3J5KGNyZWF0ZUN1c3RvbVNwYW4pO1xuLyoqXG4gKiBDcmVhdGUgYSBuZXcgZ3VhcmRyYWlsIHNwYW4uIFRoZSBzcGFuIHdpbGwgbm90IGJlIHN0YXJ0ZWQgYXV0b21hdGljYWxseSwgeW91IHNob3VsZCBlaXRoZXIgdXNlXG4gKiBgd2l0aEd1YXJkcmFpbFNwYW4oKWAgb3IgY2FsbCBgc3Bhbi5zdGFydCgpYCBhbmQgYHNwYW4uZW5kKClgIG1hbnVhbGx5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlR3VhcmRyYWlsU3BhbihvcHRpb25zLCBwYXJlbnQpIHtcbiAgICByZXR1cm4gZ2V0R2xvYmFsVHJhY2VQcm92aWRlcigpLmNyZWF0ZVNwYW4oe1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICB0eXBlOiAnZ3VhcmRyYWlsJyxcbiAgICAgICAgICAgIHRyaWdnZXJlZDogZmFsc2UsXG4gICAgICAgICAgICAuLi5vcHRpb25zPy5kYXRhLFxuICAgICAgICB9LFxuICAgIH0sIHBhcmVudCk7XG59XG5leHBvcnQgY29uc3Qgd2l0aEd1YXJkcmFpbFNwYW4gPSBfd2l0aFNwYW5GYWN0b3J5KGNyZWF0ZUd1YXJkcmFpbFNwYW4pO1xuLyoqXG4gKiBDcmVhdGUgYSBuZXcgdHJhbnNjcmlwdGlvbiBzcGFuLiBUaGUgc3BhbiB3aWxsIG5vdCBiZSBzdGFydGVkIGF1dG9tYXRpY2FsbHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVUcmFuc2NyaXB0aW9uU3BhbihvcHRpb25zLCBwYXJlbnQpIHtcbiAgICByZXR1cm4gZ2V0R2xvYmFsVHJhY2VQcm92aWRlcigpLmNyZWF0ZVNwYW4oe1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICB0eXBlOiAndHJhbnNjcmlwdGlvbicsXG4gICAgICAgICAgICAuLi5vcHRpb25zLmRhdGEsXG4gICAgICAgIH0sXG4gICAgfSwgcGFyZW50KTtcbn1cbmV4cG9ydCBjb25zdCB3aXRoVHJhbnNjcmlwdGlvblNwYW4gPSBfd2l0aFNwYW5GYWN0b3J5KGNyZWF0ZVRyYW5zY3JpcHRpb25TcGFuKTtcbi8qKlxuICogQ3JlYXRlIGEgbmV3IHNwZWVjaCBzcGFuLiBUaGUgc3BhbiB3aWxsIG5vdCBiZSBzdGFydGVkIGF1dG9tYXRpY2FsbHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTcGVlY2hTcGFuKG9wdGlvbnMsIHBhcmVudCkge1xuICAgIHJldHVybiBnZXRHbG9iYWxUcmFjZVByb3ZpZGVyKCkuY3JlYXRlU3Bhbih7XG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIHR5cGU6ICdzcGVlY2gnLFxuICAgICAgICAgICAgLi4ub3B0aW9ucy5kYXRhLFxuICAgICAgICB9LFxuICAgIH0sIHBhcmVudCk7XG59XG5leHBvcnQgY29uc3Qgd2l0aFNwZWVjaFNwYW4gPSBfd2l0aFNwYW5GYWN0b3J5KGNyZWF0ZVNwZWVjaFNwYW4pO1xuLyoqXG4gKiBDcmVhdGUgYSBuZXcgc3BlZWNoIGdyb3VwIHNwYW4uIFRoZSBzcGFuIHdpbGwgbm90IGJlIHN0YXJ0ZWQgYXV0b21hdGljYWxseS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNwZWVjaEdyb3VwU3BhbihvcHRpb25zLCBwYXJlbnQpIHtcbiAgICByZXR1cm4gZ2V0R2xvYmFsVHJhY2VQcm92aWRlcigpLmNyZWF0ZVNwYW4oe1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICB0eXBlOiAnc3BlZWNoX2dyb3VwJyxcbiAgICAgICAgICAgIC4uLm9wdGlvbnM/LmRhdGEsXG4gICAgICAgIH0sXG4gICAgfSwgcGFyZW50KTtcbn1cbmV4cG9ydCBjb25zdCB3aXRoU3BlZWNoR3JvdXBTcGFuID0gX3dpdGhTcGFuRmFjdG9yeShjcmVhdGVTcGVlY2hHcm91cFNwYW4pO1xuLyoqXG4gKiBDcmVhdGUgYSBuZXcgTUNQIGxpc3QgdG9vbHMgc3Bhbi4gVGhlIHNwYW4gd2lsbCBub3QgYmUgc3RhcnRlZCBhdXRvbWF0aWNhbGx5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTUNQTGlzdFRvb2xzU3BhbihvcHRpb25zLCBwYXJlbnQpIHtcbiAgICByZXR1cm4gZ2V0R2xvYmFsVHJhY2VQcm92aWRlcigpLmNyZWF0ZVNwYW4oe1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICB0eXBlOiAnbWNwX3Rvb2xzJyxcbiAgICAgICAgICAgIC4uLm9wdGlvbnM/LmRhdGEsXG4gICAgICAgIH0sXG4gICAgfSwgcGFyZW50KTtcbn1cbmV4cG9ydCBjb25zdCB3aXRoTUNQTGlzdFRvb2xzU3BhbiA9IF93aXRoU3BhbkZhY3RvcnkoY3JlYXRlTUNQTGlzdFRvb2xzU3Bhbik7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jcmVhdGVTcGFucy5tanMubWFwIiwiaW1wb3J0IGxvZ2dlciBmcm9tIFwiLi4vbG9nZ2VyLm1qc1wiO1xuaW1wb3J0IHsgZ2V0R2xvYmFsVHJhY2VQcm92aWRlciB9IGZyb20gXCIuL3Byb3ZpZGVyLm1qc1wiO1xuZXhwb3J0IHsgZ2V0Q3VycmVudFNwYW4sIGdldEN1cnJlbnRUcmFjZSwgZ2V0T3JDcmVhdGVUcmFjZSwgcmVzZXRDdXJyZW50U3Bhbiwgc2V0Q3VycmVudFNwYW4sIHdpdGhUcmFjZSwgfSBmcm9tIFwiLi9jb250ZXh0Lm1qc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vY3JlYXRlU3BhbnMubWpzXCI7XG5leHBvcnQgeyBCYXRjaFRyYWNlUHJvY2Vzc29yLCBDb25zb2xlU3BhbkV4cG9ydGVyLCB9IGZyb20gXCIuL3Byb2Nlc3Nvci5tanNcIjtcbmV4cG9ydCB7IE5vb3BTcGFuLCBTcGFuIH0gZnJvbSBcIi4vc3BhbnMubWpzXCI7XG5leHBvcnQgeyBOb29wVHJhY2UsIFRyYWNlIH0gZnJvbSBcIi4vdHJhY2VzLm1qc1wiO1xuZXhwb3J0IHsgZ2VuZXJhdGVHcm91cElkLCBnZW5lcmF0ZVNwYW5JZCwgZ2VuZXJhdGVUcmFjZUlkIH0gZnJvbSBcIi4vdXRpbHMubWpzXCI7XG4vKipcbiAqIEFkZCBhIHByb2Nlc3NvciB0byB0aGUgbGlzdCBvZiBwcm9jZXNzb3JzLiBFYWNoIHByb2Nlc3NvciB3aWxsIHJlY2VpdmUgYWxsIHRyYWNlcy9zcGFucy5cbiAqXG4gKiBAcGFyYW0gcHJvY2Vzc29yIC0gVGhlIHByb2Nlc3NvciB0byBhZGQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRUcmFjZVByb2Nlc3Nvcihwcm9jZXNzb3IpIHtcbiAgICBnZXRHbG9iYWxUcmFjZVByb3ZpZGVyKCkucmVnaXN0ZXJQcm9jZXNzb3IocHJvY2Vzc29yKTtcbn1cbi8qKlxuICogU2V0IHRoZSBsaXN0IG9mIHByb2Nlc3NvcnMuIFRoaXMgd2lsbCByZXBsYWNlIGFueSBleGlzdGluZyBwcm9jZXNzb3JzLlxuICpcbiAqIEBwYXJhbSBwcm9jZXNzb3JzIC0gVGhlIGxpc3Qgb2YgcHJvY2Vzc29ycyB0byBzZXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRUcmFjZVByb2Nlc3NvcnMocHJvY2Vzc29ycykge1xuICAgIGdldEdsb2JhbFRyYWNlUHJvdmlkZXIoKS5zZXRQcm9jZXNzb3JzKHByb2Nlc3NvcnMpO1xufVxuLyoqXG4gKiBTZXQgdGhlIGRpc2FibGVkIHN0YXRlIG9mIHRoZSB0cmFjaW5nIHByb3ZpZGVyLlxuICpcbiAqIEBwYXJhbSBkaXNhYmxlZCAtIFdoZXRoZXIgdG8gZGlzYWJsZSB0cmFjaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0VHJhY2luZ0Rpc2FibGVkKGRpc2FibGVkKSB7XG4gICAgZ2V0R2xvYmFsVHJhY2VQcm92aWRlcigpLnNldERpc2FibGVkKGRpc2FibGVkKTtcbn1cbmNvbnN0IGNsZWFudXAgPSBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgZ2V0R2xvYmFsVHJhY2VQcm92aWRlcigpLnNodXRkb3duKCk7XG59O1xuaWYgKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJykge1xuICAgIC8vIGhhbmRsaW5nIE5vZGUuanMgcHJvY2VzcyB0ZXJtaW5hdGlvblxuICAgIC8vIEhhbmRsZSBub3JtYWwgdGVybWluYXRpb25cbiAgICBwcm9jZXNzLm9uKCdiZWZvcmVFeGl0JywgY2xlYW51cCk7XG4gICAgLy8gSGFuZGxlIENUUkwrQyAoU0lHSU5UKVxuICAgIHByb2Nlc3Mub24oJ1NJR0lOVCcsIGNsZWFudXApO1xuICAgIC8vIEhhbmRsZSB0ZXJtaW5hdGlvbiAoU0lHVEVSTSlcbiAgICBwcm9jZXNzLm9uKCdTSUdURVJNJywgY2xlYW51cCk7XG4gICAgcHJvY2Vzcy5vbigndW5oYW5kbGVkUmVqZWN0aW9uJywgKHJlYXNvbiwgcHJvbWlzZSkgPT4ge1xuICAgICAgICBsb2dnZXIuZXJyb3IoJ1VuaGFuZGxlZCByZWplY3Rpb24nLCByZWFzb24sIHByb21pc2UpO1xuICAgICAgICBjbGVhbnVwKCk7XG4gICAgfSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5tanMubWFwIiwiZXhwb3J0IGZ1bmN0aW9uIHRvU21hcnRTdHJpbmcodmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKF9lKSB7XG4gICAgICAgICAgICByZXR1cm4gJ1tvYmplY3Qgd2l0aCBjaXJjdWxhciByZWZlcmVuY2VzXSc7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zbWFydFN0cmluZy5tanMubWFwIiwiaW1wb3J0IHsgc2FmZUV4ZWN1dGUgfSBmcm9tIFwiLi91dGlscy9zYWZlRXhlY3V0ZS5tanNcIjtcbmltcG9ydCB7IHRvRnVuY3Rpb25Ub29sTmFtZSB9IGZyb20gXCIuL3V0aWxzL3Rvb2xzLm1qc1wiO1xuaW1wb3J0IHsgZ2V0U2NoZW1hQW5kUGFyc2VyRnJvbUlucHV0VHlwZSB9IGZyb20gXCIuL3V0aWxzL3Rvb2xzLm1qc1wiO1xuaW1wb3J0IHsgaXNab2RPYmplY3QgfSBmcm9tIFwiLi91dGlscy90eXBlR3VhcmRzLm1qc1wiO1xuaW1wb3J0IHsgTW9kZWxCZWhhdmlvckVycm9yLCBVc2VyRXJyb3IgfSBmcm9tIFwiLi9lcnJvcnMubWpzXCI7XG5pbXBvcnQgbG9nZ2VyIGZyb20gXCIuL2xvZ2dlci5tanNcIjtcbmltcG9ydCB7IGdldEN1cnJlbnRTcGFuIH0gZnJvbSBcIi4vdHJhY2luZy9pbmRleC5tanNcIjtcbmltcG9ydCB7IHRvU21hcnRTdHJpbmcgfSBmcm9tIFwiLi91dGlscy9zbWFydFN0cmluZy5tanNcIjtcbi8qKlxuICogRXhwb3NlcyBhIGNvbXB1dGVyIHRvIHRoZSBhZ2VudCBhcyBhIHRvb2wgdG8gYmUgY2FsbGVkXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgQWRkaXRpb25hbCBjb25maWd1cmF0aW9uIGZvciB0aGUgY29tcHV0ZXIgdG9vbCBsaWtlIHNwZWNpZnlpbmcgdGhlIGxvY2F0aW9uIG9mIHlvdXIgYWdlbnRcbiAqIEByZXR1cm5zIGEgY29tcHV0ZXIgdG9vbCBkZWZpbml0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlclRvb2wob3B0aW9ucykge1xuICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6ICdjb21wdXRlcicsXG4gICAgICAgIG5hbWU6IG9wdGlvbnMubmFtZSA/PyAnY29tcHV0ZXJfdXNlX3ByZXZpZXcnLFxuICAgICAgICBjb21wdXRlcjogb3B0aW9ucy5jb21wdXRlcixcbiAgICB9O1xufVxuLyoqXG4gKiBUaGUgZGVmYXVsdCBmdW5jdGlvbiB0byBpbnZva2Ugd2hlbiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgcnVubmluZyB0aGUgdG9vbC5cbiAqXG4gKiBBbHdheXMgcmV0dXJucyBgQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgcnVubmluZyB0aGUgdG9vbC4gUGxlYXNlIHRyeSBhZ2Fpbi4gRXJyb3I6IDxlcnJvciBkZXRhaWxzPmBcbiAqXG4gKiBAcGFyYW0gY29udGV4dCBBbiBpbnN0YW5jZSBvZiB0aGUgY3VycmVudCBSdW5Db250ZXh0XG4gKiBAcGFyYW0gZXJyb3IgVGhlIGVycm9yIHRoYXQgb2NjdXJyZWRcbiAqL1xuZnVuY3Rpb24gZGVmYXVsdFRvb2xFcnJvckZ1bmN0aW9uKGNvbnRleHQsIGVycm9yKSB7XG4gICAgY29uc3QgZGV0YWlscyA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci50b1N0cmluZygpIDogU3RyaW5nKGVycm9yKTtcbiAgICByZXR1cm4gYEFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHJ1bm5pbmcgdGhlIHRvb2wuIFBsZWFzZSB0cnkgYWdhaW4uIEVycm9yOiAke2RldGFpbHN9YDtcbn1cbi8qKlxuICogRXhwb3NlcyBhIGZ1bmN0aW9uIHRvIHRoZSBhZ2VudCBhcyBhIHRvb2wgdG8gYmUgY2FsbGVkXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgZm9yIHRoZSB0b29sXG4gKiBAcmV0dXJucyBBIG5ldyB0b29sXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b29sKG9wdGlvbnMpIHtcbiAgICBjb25zdCBuYW1lID0gb3B0aW9ucy5uYW1lXG4gICAgICAgID8gdG9GdW5jdGlvblRvb2xOYW1lKG9wdGlvbnMubmFtZSlcbiAgICAgICAgOiB0b0Z1bmN0aW9uVG9vbE5hbWUob3B0aW9ucy5leGVjdXRlLm5hbWUpO1xuICAgIGNvbnN0IHRvb2xFcnJvckZ1bmN0aW9uID0gdHlwZW9mIG9wdGlvbnMuZXJyb3JGdW5jdGlvbiA9PT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgPyBkZWZhdWx0VG9vbEVycm9yRnVuY3Rpb25cbiAgICAgICAgOiBvcHRpb25zLmVycm9yRnVuY3Rpb247XG4gICAgaWYgKCFuYW1lKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVG9vbCBuYW1lIGNhbm5vdCBiZSBlbXB0eS4gRWl0aGVyIG5hbWUgeW91ciBmdW5jdGlvbiBvciBwcm92aWRlIGEgbmFtZSBpbiB0aGUgb3B0aW9ucy4nKTtcbiAgICB9XG4gICAgY29uc3Qgc3RyaWN0TW9kZSA9IG9wdGlvbnMuc3RyaWN0ID8/IHRydWU7XG4gICAgaWYgKCFzdHJpY3RNb2RlICYmIGlzWm9kT2JqZWN0KG9wdGlvbnMucGFyYW1ldGVycykpIHtcbiAgICAgICAgdGhyb3cgbmV3IFVzZXJFcnJvcignU3RyaWN0IG1vZGUgaXMgcmVxdWlyZWQgZm9yIFpvZCBwYXJhbWV0ZXJzJyk7XG4gICAgfVxuICAgIGNvbnN0IHsgcGFyc2VyLCBzY2hlbWE6IHBhcmFtZXRlcnMgfSA9IGdldFNjaGVtYUFuZFBhcnNlckZyb21JbnB1dFR5cGUob3B0aW9ucy5wYXJhbWV0ZXJzLCBuYW1lKTtcbiAgICBhc3luYyBmdW5jdGlvbiBfaW52b2tlKHJ1bkNvbnRleHQsIGlucHV0KSB7XG4gICAgICAgIGNvbnN0IFtlcnJvciwgcGFyc2VkXSA9IGF3YWl0IHNhZmVFeGVjdXRlKCgpID0+IHBhcnNlcihpbnB1dCkpO1xuICAgICAgICBpZiAoZXJyb3IgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChsb2dnZXIuZG9udExvZ1Rvb2xEYXRhKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBJbnZhbGlkIEpTT04gaW5wdXQgZm9yIHRvb2wgJHtuYW1lfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBJbnZhbGlkIEpTT04gaW5wdXQgZm9yIHRvb2wgJHtuYW1lfTogJHtpbnB1dH1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBNb2RlbEJlaGF2aW9yRXJyb3IoJ0ludmFsaWQgSlNPTiBpbnB1dCBmb3IgdG9vbCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb2dnZXIuZG9udExvZ1Rvb2xEYXRhKSB7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoYEludm9raW5nIHRvb2wgJHtuYW1lfWApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBJbnZva2luZyB0b29sICR7bmFtZX0gd2l0aCBpbnB1dCAke2lucHV0fWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG9wdGlvbnMuZXhlY3V0ZShwYXJzZWQsIHJ1bkNvbnRleHQpO1xuICAgICAgICBjb25zdCBzdHJpbmdSZXN1bHQgPSB0b1NtYXJ0U3RyaW5nKHJlc3VsdCk7XG4gICAgICAgIGlmIChsb2dnZXIuZG9udExvZ1Rvb2xEYXRhKSB7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoYFRvb2wgJHtuYW1lfSBjb21wbGV0ZWRgKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgVG9vbCAke25hbWV9IHJldHVybmVkOiAke3N0cmluZ1Jlc3VsdH1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBhc3luYyBmdW5jdGlvbiBpbnZva2UocnVuQ29udGV4dCwgaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIF9pbnZva2UocnVuQ29udGV4dCwgaW5wdXQpLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgaWYgKHRvb2xFcnJvckZ1bmN0aW9uKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFNwYW4gPSBnZXRDdXJyZW50U3BhbigpO1xuICAgICAgICAgICAgICAgIGN1cnJlbnRTcGFuPy5zZXRFcnJvcih7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdFcnJvciBydW5uaW5nIHRvb2wgKG5vbi1mYXRhbCknLFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b29sX25hbWU6IG5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogZXJyb3IudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdG9vbEVycm9yRnVuY3Rpb24ocnVuQ29udGV4dCwgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBuZWVkc0FwcHJvdmFsID0gdHlwZW9mIG9wdGlvbnMubmVlZHNBcHByb3ZhbCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICA/IG9wdGlvbnMubmVlZHNBcHByb3ZhbFxuICAgICAgICA6IGFzeW5jICgpID0+IHR5cGVvZiBvcHRpb25zLm5lZWRzQXBwcm92YWwgPT09ICdib29sZWFuJ1xuICAgICAgICAgICAgPyBvcHRpb25zLm5lZWRzQXBwcm92YWxcbiAgICAgICAgICAgIDogZmFsc2U7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ2Z1bmN0aW9uJyxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgZGVzY3JpcHRpb246IG9wdGlvbnMuZGVzY3JpcHRpb24sXG4gICAgICAgIHBhcmFtZXRlcnMsXG4gICAgICAgIHN0cmljdDogc3RyaWN0TW9kZSxcbiAgICAgICAgaW52b2tlLFxuICAgICAgICBuZWVkc0FwcHJvdmFsLFxuICAgIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD10b29sLm1qcy5tYXAiLCJleHBvcnQgdmFyIHV0aWw7XG4oZnVuY3Rpb24gKHV0aWwpIHtcbiAgICB1dGlsLmFzc2VydEVxdWFsID0gKF8pID0+IHsgfTtcbiAgICBmdW5jdGlvbiBhc3NlcnRJcyhfYXJnKSB7IH1cbiAgICB1dGlsLmFzc2VydElzID0gYXNzZXJ0SXM7XG4gICAgZnVuY3Rpb24gYXNzZXJ0TmV2ZXIoX3gpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgfVxuICAgIHV0aWwuYXNzZXJ0TmV2ZXIgPSBhc3NlcnROZXZlcjtcbiAgICB1dGlsLmFycmF5VG9FbnVtID0gKGl0ZW1zKSA9PiB7XG4gICAgICAgIGNvbnN0IG9iaiA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICAgICAgICAgIG9ialtpdGVtXSA9IGl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9iajtcbiAgICB9O1xuICAgIHV0aWwuZ2V0VmFsaWRFbnVtVmFsdWVzID0gKG9iaikgPT4ge1xuICAgICAgICBjb25zdCB2YWxpZEtleXMgPSB1dGlsLm9iamVjdEtleXMob2JqKS5maWx0ZXIoKGspID0+IHR5cGVvZiBvYmpbb2JqW2tdXSAhPT0gXCJudW1iZXJcIik7XG4gICAgICAgIGNvbnN0IGZpbHRlcmVkID0ge307XG4gICAgICAgIGZvciAoY29uc3QgayBvZiB2YWxpZEtleXMpIHtcbiAgICAgICAgICAgIGZpbHRlcmVkW2tdID0gb2JqW2tdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1dGlsLm9iamVjdFZhbHVlcyhmaWx0ZXJlZCk7XG4gICAgfTtcbiAgICB1dGlsLm9iamVjdFZhbHVlcyA9IChvYmopID0+IHtcbiAgICAgICAgcmV0dXJuIHV0aWwub2JqZWN0S2V5cyhvYmopLm1hcChmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIG9ialtlXTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICB1dGlsLm9iamVjdEtleXMgPSB0eXBlb2YgT2JqZWN0LmtleXMgPT09IFwiZnVuY3Rpb25cIiAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGJhbi9iYW5cbiAgICAgICAgPyAob2JqKSA9PiBPYmplY3Qua2V5cyhvYmopIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgYmFuL2JhblxuICAgICAgICA6IChvYmplY3QpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGtleXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIG9iamVjdCkge1xuICAgICAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGtleXMucHVzaChrZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBrZXlzO1xuICAgICAgICB9O1xuICAgIHV0aWwuZmluZCA9IChhcnIsIGNoZWNrZXIpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGFycikge1xuICAgICAgICAgICAgaWYgKGNoZWNrZXIoaXRlbSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIHV0aWwuaXNJbnRlZ2VyID0gdHlwZW9mIE51bWJlci5pc0ludGVnZXIgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICA/ICh2YWwpID0+IE51bWJlci5pc0ludGVnZXIodmFsKSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGJhbi9iYW5cbiAgICAgICAgOiAodmFsKSA9PiB0eXBlb2YgdmFsID09PSBcIm51bWJlclwiICYmIE51bWJlci5pc0Zpbml0ZSh2YWwpICYmIE1hdGguZmxvb3IodmFsKSA9PT0gdmFsO1xuICAgIGZ1bmN0aW9uIGpvaW5WYWx1ZXMoYXJyYXksIHNlcGFyYXRvciA9IFwiIHwgXCIpIHtcbiAgICAgICAgcmV0dXJuIGFycmF5Lm1hcCgodmFsKSA9PiAodHlwZW9mIHZhbCA9PT0gXCJzdHJpbmdcIiA/IGAnJHt2YWx9J2AgOiB2YWwpKS5qb2luKHNlcGFyYXRvcik7XG4gICAgfVxuICAgIHV0aWwuam9pblZhbHVlcyA9IGpvaW5WYWx1ZXM7XG4gICAgdXRpbC5qc29uU3RyaW5naWZ5UmVwbGFjZXIgPSAoXywgdmFsdWUpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJiaWdpbnRcIikge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH07XG59KSh1dGlsIHx8ICh1dGlsID0ge30pKTtcbmV4cG9ydCB2YXIgb2JqZWN0VXRpbDtcbihmdW5jdGlvbiAob2JqZWN0VXRpbCkge1xuICAgIG9iamVjdFV0aWwubWVyZ2VTaGFwZXMgPSAoZmlyc3QsIHNlY29uZCkgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uZmlyc3QsXG4gICAgICAgICAgICAuLi5zZWNvbmQsIC8vIHNlY29uZCBvdmVyd3JpdGVzIGZpcnN0XG4gICAgICAgIH07XG4gICAgfTtcbn0pKG9iamVjdFV0aWwgfHwgKG9iamVjdFV0aWwgPSB7fSkpO1xuZXhwb3J0IGNvbnN0IFpvZFBhcnNlZFR5cGUgPSB1dGlsLmFycmF5VG9FbnVtKFtcbiAgICBcInN0cmluZ1wiLFxuICAgIFwibmFuXCIsXG4gICAgXCJudW1iZXJcIixcbiAgICBcImludGVnZXJcIixcbiAgICBcImZsb2F0XCIsXG4gICAgXCJib29sZWFuXCIsXG4gICAgXCJkYXRlXCIsXG4gICAgXCJiaWdpbnRcIixcbiAgICBcInN5bWJvbFwiLFxuICAgIFwiZnVuY3Rpb25cIixcbiAgICBcInVuZGVmaW5lZFwiLFxuICAgIFwibnVsbFwiLFxuICAgIFwiYXJyYXlcIixcbiAgICBcIm9iamVjdFwiLFxuICAgIFwidW5rbm93blwiLFxuICAgIFwicHJvbWlzZVwiLFxuICAgIFwidm9pZFwiLFxuICAgIFwibmV2ZXJcIixcbiAgICBcIm1hcFwiLFxuICAgIFwic2V0XCIsXG5dKTtcbmV4cG9ydCBjb25zdCBnZXRQYXJzZWRUeXBlID0gKGRhdGEpID0+IHtcbiAgICBjb25zdCB0ID0gdHlwZW9mIGRhdGE7XG4gICAgc3dpdGNoICh0KSB7XG4gICAgICAgIGNhc2UgXCJ1bmRlZmluZWRcIjpcbiAgICAgICAgICAgIHJldHVybiBab2RQYXJzZWRUeXBlLnVuZGVmaW5lZDtcbiAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICAgICAgcmV0dXJuIFpvZFBhcnNlZFR5cGUuc3RyaW5nO1xuICAgICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICAgICAgICByZXR1cm4gTnVtYmVyLmlzTmFOKGRhdGEpID8gWm9kUGFyc2VkVHlwZS5uYW4gOiBab2RQYXJzZWRUeXBlLm51bWJlcjtcbiAgICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgICAgIHJldHVybiBab2RQYXJzZWRUeXBlLmJvb2xlYW47XG4gICAgICAgIGNhc2UgXCJmdW5jdGlvblwiOlxuICAgICAgICAgICAgcmV0dXJuIFpvZFBhcnNlZFR5cGUuZnVuY3Rpb247XG4gICAgICAgIGNhc2UgXCJiaWdpbnRcIjpcbiAgICAgICAgICAgIHJldHVybiBab2RQYXJzZWRUeXBlLmJpZ2ludDtcbiAgICAgICAgY2FzZSBcInN5bWJvbFwiOlxuICAgICAgICAgICAgcmV0dXJuIFpvZFBhcnNlZFR5cGUuc3ltYm9sO1xuICAgICAgICBjYXNlIFwib2JqZWN0XCI6XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBab2RQYXJzZWRUeXBlLmFycmF5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRhdGEgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gWm9kUGFyc2VkVHlwZS5udWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRhdGEudGhlbiAmJiB0eXBlb2YgZGF0YS50aGVuID09PSBcImZ1bmN0aW9uXCIgJiYgZGF0YS5jYXRjaCAmJiB0eXBlb2YgZGF0YS5jYXRjaCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFpvZFBhcnNlZFR5cGUucHJvbWlzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgTWFwICE9PSBcInVuZGVmaW5lZFwiICYmIGRhdGEgaW5zdGFuY2VvZiBNYXApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gWm9kUGFyc2VkVHlwZS5tYXA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIFNldCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBkYXRhIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFpvZFBhcnNlZFR5cGUuc2V0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBEYXRlICE9PSBcInVuZGVmaW5lZFwiICYmIGRhdGEgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFpvZFBhcnNlZFR5cGUuZGF0ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBab2RQYXJzZWRUeXBlLm9iamVjdDtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBab2RQYXJzZWRUeXBlLnVua25vd247XG4gICAgfVxufTtcbiIsImltcG9ydCB7IHV0aWwgfSBmcm9tIFwiLi9oZWxwZXJzL3V0aWwuanNcIjtcbmV4cG9ydCBjb25zdCBab2RJc3N1ZUNvZGUgPSB1dGlsLmFycmF5VG9FbnVtKFtcbiAgICBcImludmFsaWRfdHlwZVwiLFxuICAgIFwiaW52YWxpZF9saXRlcmFsXCIsXG4gICAgXCJjdXN0b21cIixcbiAgICBcImludmFsaWRfdW5pb25cIixcbiAgICBcImludmFsaWRfdW5pb25fZGlzY3JpbWluYXRvclwiLFxuICAgIFwiaW52YWxpZF9lbnVtX3ZhbHVlXCIsXG4gICAgXCJ1bnJlY29nbml6ZWRfa2V5c1wiLFxuICAgIFwiaW52YWxpZF9hcmd1bWVudHNcIixcbiAgICBcImludmFsaWRfcmV0dXJuX3R5cGVcIixcbiAgICBcImludmFsaWRfZGF0ZVwiLFxuICAgIFwiaW52YWxpZF9zdHJpbmdcIixcbiAgICBcInRvb19zbWFsbFwiLFxuICAgIFwidG9vX2JpZ1wiLFxuICAgIFwiaW52YWxpZF9pbnRlcnNlY3Rpb25fdHlwZXNcIixcbiAgICBcIm5vdF9tdWx0aXBsZV9vZlwiLFxuICAgIFwibm90X2Zpbml0ZVwiLFxuXSk7XG5leHBvcnQgY29uc3QgcXVvdGVsZXNzSnNvbiA9IChvYmopID0+IHtcbiAgICBjb25zdCBqc29uID0gSlNPTi5zdHJpbmdpZnkob2JqLCBudWxsLCAyKTtcbiAgICByZXR1cm4ganNvbi5yZXBsYWNlKC9cIihbXlwiXSspXCI6L2csIFwiJDE6XCIpO1xufTtcbmV4cG9ydCBjbGFzcyBab2RFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBnZXQgZXJyb3JzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc3N1ZXM7XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKGlzc3Vlcykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmlzc3VlcyA9IFtdO1xuICAgICAgICB0aGlzLmFkZElzc3VlID0gKHN1YikgPT4ge1xuICAgICAgICAgICAgdGhpcy5pc3N1ZXMgPSBbLi4udGhpcy5pc3N1ZXMsIHN1Yl07XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuYWRkSXNzdWVzID0gKHN1YnMgPSBbXSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5pc3N1ZXMgPSBbLi4udGhpcy5pc3N1ZXMsIC4uLnN1YnNdO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBhY3R1YWxQcm90byA9IG5ldy50YXJnZXQucHJvdG90eXBlO1xuICAgICAgICBpZiAoT2JqZWN0LnNldFByb3RvdHlwZU9mKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgYmFuL2JhblxuICAgICAgICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIGFjdHVhbFByb3RvKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX19wcm90b19fID0gYWN0dWFsUHJvdG87XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5uYW1lID0gXCJab2RFcnJvclwiO1xuICAgICAgICB0aGlzLmlzc3VlcyA9IGlzc3VlcztcbiAgICB9XG4gICAgZm9ybWF0KF9tYXBwZXIpIHtcbiAgICAgICAgY29uc3QgbWFwcGVyID0gX21hcHBlciB8fFxuICAgICAgICAgICAgZnVuY3Rpb24gKGlzc3VlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzc3VlLm1lc3NhZ2U7XG4gICAgICAgICAgICB9O1xuICAgICAgICBjb25zdCBmaWVsZEVycm9ycyA9IHsgX2Vycm9yczogW10gfTtcbiAgICAgICAgY29uc3QgcHJvY2Vzc0Vycm9yID0gKGVycm9yKSA9PiB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGlzc3VlIG9mIGVycm9yLmlzc3Vlcykge1xuICAgICAgICAgICAgICAgIGlmIChpc3N1ZS5jb2RlID09PSBcImludmFsaWRfdW5pb25cIikge1xuICAgICAgICAgICAgICAgICAgICBpc3N1ZS51bmlvbkVycm9ycy5tYXAocHJvY2Vzc0Vycm9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoaXNzdWUuY29kZSA9PT0gXCJpbnZhbGlkX3JldHVybl90eXBlXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0Vycm9yKGlzc3VlLnJldHVyblR5cGVFcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzc3VlLmNvZGUgPT09IFwiaW52YWxpZF9hcmd1bWVudHNcIikge1xuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzRXJyb3IoaXNzdWUuYXJndW1lbnRzRXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChpc3N1ZS5wYXRoLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBmaWVsZEVycm9ycy5fZXJyb3JzLnB1c2gobWFwcGVyKGlzc3VlKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY3VyciA9IGZpZWxkRXJyb3JzO1xuICAgICAgICAgICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChpIDwgaXNzdWUucGF0aC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsID0gaXNzdWUucGF0aFtpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRlcm1pbmFsID0gaSA9PT0gaXNzdWUucGF0aC5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0ZXJtaW5hbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJbZWxdID0gY3VycltlbF0gfHwgeyBfZXJyb3JzOiBbXSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmICh0eXBlb2YgZWwgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgIGN1cnJbZWxdID0gY3VycltlbF0gfHwgeyBfZXJyb3JzOiBbXSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIH0gZWxzZSBpZiAodHlwZW9mIGVsID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBjb25zdCBlcnJvckFycmF5OiBhbnkgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgIGVycm9yQXJyYXkuX2Vycm9ycyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgY3VycltlbF0gPSBjdXJyW2VsXSB8fCBlcnJvckFycmF5O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJbZWxdID0gY3VycltlbF0gfHwgeyBfZXJyb3JzOiBbXSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJbZWxdLl9lcnJvcnMucHVzaChtYXBwZXIoaXNzdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnIgPSBjdXJyW2VsXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcHJvY2Vzc0Vycm9yKHRoaXMpO1xuICAgICAgICByZXR1cm4gZmllbGRFcnJvcnM7XG4gICAgfVxuICAgIHN0YXRpYyBhc3NlcnQodmFsdWUpIHtcbiAgICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBab2RFcnJvcikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm90IGEgWm9kRXJyb3I6ICR7dmFsdWV9YCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1lc3NhZ2U7XG4gICAgfVxuICAgIGdldCBtZXNzYWdlKCkge1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcy5pc3N1ZXMsIHV0aWwuanNvblN0cmluZ2lmeVJlcGxhY2VyLCAyKTtcbiAgICB9XG4gICAgZ2V0IGlzRW1wdHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzc3Vlcy5sZW5ndGggPT09IDA7XG4gICAgfVxuICAgIGZsYXR0ZW4obWFwcGVyID0gKGlzc3VlKSA9PiBpc3N1ZS5tZXNzYWdlKSB7XG4gICAgICAgIGNvbnN0IGZpZWxkRXJyb3JzID0ge307XG4gICAgICAgIGNvbnN0IGZvcm1FcnJvcnMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBzdWIgb2YgdGhpcy5pc3N1ZXMpIHtcbiAgICAgICAgICAgIGlmIChzdWIucGF0aC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgZmllbGRFcnJvcnNbc3ViLnBhdGhbMF1dID0gZmllbGRFcnJvcnNbc3ViLnBhdGhbMF1dIHx8IFtdO1xuICAgICAgICAgICAgICAgIGZpZWxkRXJyb3JzW3N1Yi5wYXRoWzBdXS5wdXNoKG1hcHBlcihzdWIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvcm1FcnJvcnMucHVzaChtYXBwZXIoc3ViKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgZm9ybUVycm9ycywgZmllbGRFcnJvcnMgfTtcbiAgICB9XG4gICAgZ2V0IGZvcm1FcnJvcnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZsYXR0ZW4oKTtcbiAgICB9XG59XG5ab2RFcnJvci5jcmVhdGUgPSAoaXNzdWVzKSA9PiB7XG4gICAgY29uc3QgZXJyb3IgPSBuZXcgWm9kRXJyb3IoaXNzdWVzKTtcbiAgICByZXR1cm4gZXJyb3I7XG59O1xuIiwiaW1wb3J0IHsgWm9kSXNzdWVDb2RlIH0gZnJvbSBcIi4uL1pvZEVycm9yLmpzXCI7XG5pbXBvcnQgeyB1dGlsLCBab2RQYXJzZWRUeXBlIH0gZnJvbSBcIi4uL2hlbHBlcnMvdXRpbC5qc1wiO1xuY29uc3QgZXJyb3JNYXAgPSAoaXNzdWUsIF9jdHgpID0+IHtcbiAgICBsZXQgbWVzc2FnZTtcbiAgICBzd2l0Y2ggKGlzc3VlLmNvZGUpIHtcbiAgICAgICAgY2FzZSBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlOlxuICAgICAgICAgICAgaWYgKGlzc3VlLnJlY2VpdmVkID09PSBab2RQYXJzZWRUeXBlLnVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBcIlJlcXVpcmVkXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gYEV4cGVjdGVkICR7aXNzdWUuZXhwZWN0ZWR9LCByZWNlaXZlZCAke2lzc3VlLnJlY2VpdmVkfWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBab2RJc3N1ZUNvZGUuaW52YWxpZF9saXRlcmFsOlxuICAgICAgICAgICAgbWVzc2FnZSA9IGBJbnZhbGlkIGxpdGVyYWwgdmFsdWUsIGV4cGVjdGVkICR7SlNPTi5zdHJpbmdpZnkoaXNzdWUuZXhwZWN0ZWQsIHV0aWwuanNvblN0cmluZ2lmeVJlcGxhY2VyKX1gO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgWm9kSXNzdWVDb2RlLnVucmVjb2duaXplZF9rZXlzOlxuICAgICAgICAgICAgbWVzc2FnZSA9IGBVbnJlY29nbml6ZWQga2V5KHMpIGluIG9iamVjdDogJHt1dGlsLmpvaW5WYWx1ZXMoaXNzdWUua2V5cywgXCIsIFwiKX1gO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgWm9kSXNzdWVDb2RlLmludmFsaWRfdW5pb246XG4gICAgICAgICAgICBtZXNzYWdlID0gYEludmFsaWQgaW5wdXRgO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgWm9kSXNzdWVDb2RlLmludmFsaWRfdW5pb25fZGlzY3JpbWluYXRvcjpcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBgSW52YWxpZCBkaXNjcmltaW5hdG9yIHZhbHVlLiBFeHBlY3RlZCAke3V0aWwuam9pblZhbHVlcyhpc3N1ZS5vcHRpb25zKX1gO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgWm9kSXNzdWVDb2RlLmludmFsaWRfZW51bV92YWx1ZTpcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBgSW52YWxpZCBlbnVtIHZhbHVlLiBFeHBlY3RlZCAke3V0aWwuam9pblZhbHVlcyhpc3N1ZS5vcHRpb25zKX0sIHJlY2VpdmVkICcke2lzc3VlLnJlY2VpdmVkfSdgO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgWm9kSXNzdWVDb2RlLmludmFsaWRfYXJndW1lbnRzOlxuICAgICAgICAgICAgbWVzc2FnZSA9IGBJbnZhbGlkIGZ1bmN0aW9uIGFyZ3VtZW50c2A7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBab2RJc3N1ZUNvZGUuaW52YWxpZF9yZXR1cm5fdHlwZTpcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBgSW52YWxpZCBmdW5jdGlvbiByZXR1cm4gdHlwZWA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBab2RJc3N1ZUNvZGUuaW52YWxpZF9kYXRlOlxuICAgICAgICAgICAgbWVzc2FnZSA9IGBJbnZhbGlkIGRhdGVgO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nOlxuICAgICAgICAgICAgaWYgKHR5cGVvZiBpc3N1ZS52YWxpZGF0aW9uID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKFwiaW5jbHVkZXNcIiBpbiBpc3N1ZS52YWxpZGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBgSW52YWxpZCBpbnB1dDogbXVzdCBpbmNsdWRlIFwiJHtpc3N1ZS52YWxpZGF0aW9uLmluY2x1ZGVzfVwiYDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpc3N1ZS52YWxpZGF0aW9uLnBvc2l0aW9uID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gYCR7bWVzc2FnZX0gYXQgb25lIG9yIG1vcmUgcG9zaXRpb25zIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAke2lzc3VlLnZhbGlkYXRpb24ucG9zaXRpb259YDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChcInN0YXJ0c1dpdGhcIiBpbiBpc3N1ZS52YWxpZGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBgSW52YWxpZCBpbnB1dDogbXVzdCBzdGFydCB3aXRoIFwiJHtpc3N1ZS52YWxpZGF0aW9uLnN0YXJ0c1dpdGh9XCJgO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChcImVuZHNXaXRoXCIgaW4gaXNzdWUudmFsaWRhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gYEludmFsaWQgaW5wdXQ6IG11c3QgZW5kIHdpdGggXCIke2lzc3VlLnZhbGlkYXRpb24uZW5kc1dpdGh9XCJgO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdXRpbC5hc3NlcnROZXZlcihpc3N1ZS52YWxpZGF0aW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpc3N1ZS52YWxpZGF0aW9uICE9PSBcInJlZ2V4XCIpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gYEludmFsaWQgJHtpc3N1ZS52YWxpZGF0aW9ufWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gXCJJbnZhbGlkXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBab2RJc3N1ZUNvZGUudG9vX3NtYWxsOlxuICAgICAgICAgICAgaWYgKGlzc3VlLnR5cGUgPT09IFwiYXJyYXlcIilcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gYEFycmF5IG11c3QgY29udGFpbiAke2lzc3VlLmV4YWN0ID8gXCJleGFjdGx5XCIgOiBpc3N1ZS5pbmNsdXNpdmUgPyBgYXQgbGVhc3RgIDogYG1vcmUgdGhhbmB9ICR7aXNzdWUubWluaW11bX0gZWxlbWVudChzKWA7XG4gICAgICAgICAgICBlbHNlIGlmIChpc3N1ZS50eXBlID09PSBcInN0cmluZ1wiKVxuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBgU3RyaW5nIG11c3QgY29udGFpbiAke2lzc3VlLmV4YWN0ID8gXCJleGFjdGx5XCIgOiBpc3N1ZS5pbmNsdXNpdmUgPyBgYXQgbGVhc3RgIDogYG92ZXJgfSAke2lzc3VlLm1pbmltdW19IGNoYXJhY3RlcihzKWA7XG4gICAgICAgICAgICBlbHNlIGlmIChpc3N1ZS50eXBlID09PSBcIm51bWJlclwiKVxuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBgTnVtYmVyIG11c3QgYmUgJHtpc3N1ZS5leGFjdCA/IGBleGFjdGx5IGVxdWFsIHRvIGAgOiBpc3N1ZS5pbmNsdXNpdmUgPyBgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGAgOiBgZ3JlYXRlciB0aGFuIGB9JHtpc3N1ZS5taW5pbXVtfWA7XG4gICAgICAgICAgICBlbHNlIGlmIChpc3N1ZS50eXBlID09PSBcImRhdGVcIilcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gYERhdGUgbXVzdCBiZSAke2lzc3VlLmV4YWN0ID8gYGV4YWN0bHkgZXF1YWwgdG8gYCA6IGlzc3VlLmluY2x1c2l2ZSA/IGBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gYCA6IGBncmVhdGVyIHRoYW4gYH0ke25ldyBEYXRlKE51bWJlcihpc3N1ZS5taW5pbXVtKSl9YDtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gXCJJbnZhbGlkIGlucHV0XCI7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBab2RJc3N1ZUNvZGUudG9vX2JpZzpcbiAgICAgICAgICAgIGlmIChpc3N1ZS50eXBlID09PSBcImFycmF5XCIpXG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9IGBBcnJheSBtdXN0IGNvbnRhaW4gJHtpc3N1ZS5leGFjdCA/IGBleGFjdGx5YCA6IGlzc3VlLmluY2x1c2l2ZSA/IGBhdCBtb3N0YCA6IGBsZXNzIHRoYW5gfSAke2lzc3VlLm1heGltdW19IGVsZW1lbnQocylgO1xuICAgICAgICAgICAgZWxzZSBpZiAoaXNzdWUudHlwZSA9PT0gXCJzdHJpbmdcIilcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gYFN0cmluZyBtdXN0IGNvbnRhaW4gJHtpc3N1ZS5leGFjdCA/IGBleGFjdGx5YCA6IGlzc3VlLmluY2x1c2l2ZSA/IGBhdCBtb3N0YCA6IGB1bmRlcmB9ICR7aXNzdWUubWF4aW11bX0gY2hhcmFjdGVyKHMpYDtcbiAgICAgICAgICAgIGVsc2UgaWYgKGlzc3VlLnR5cGUgPT09IFwibnVtYmVyXCIpXG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9IGBOdW1iZXIgbXVzdCBiZSAke2lzc3VlLmV4YWN0ID8gYGV4YWN0bHlgIDogaXNzdWUuaW5jbHVzaXZlID8gYGxlc3MgdGhhbiBvciBlcXVhbCB0b2AgOiBgbGVzcyB0aGFuYH0gJHtpc3N1ZS5tYXhpbXVtfWA7XG4gICAgICAgICAgICBlbHNlIGlmIChpc3N1ZS50eXBlID09PSBcImJpZ2ludFwiKVxuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBgQmlnSW50IG11c3QgYmUgJHtpc3N1ZS5leGFjdCA/IGBleGFjdGx5YCA6IGlzc3VlLmluY2x1c2l2ZSA/IGBsZXNzIHRoYW4gb3IgZXF1YWwgdG9gIDogYGxlc3MgdGhhbmB9ICR7aXNzdWUubWF4aW11bX1gO1xuICAgICAgICAgICAgZWxzZSBpZiAoaXNzdWUudHlwZSA9PT0gXCJkYXRlXCIpXG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9IGBEYXRlIG11c3QgYmUgJHtpc3N1ZS5leGFjdCA/IGBleGFjdGx5YCA6IGlzc3VlLmluY2x1c2l2ZSA/IGBzbWFsbGVyIHRoYW4gb3IgZXF1YWwgdG9gIDogYHNtYWxsZXIgdGhhbmB9ICR7bmV3IERhdGUoTnVtYmVyKGlzc3VlLm1heGltdW0pKX1gO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBcIkludmFsaWQgaW5wdXRcIjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFpvZElzc3VlQ29kZS5jdXN0b206XG4gICAgICAgICAgICBtZXNzYWdlID0gYEludmFsaWQgaW5wdXRgO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgWm9kSXNzdWVDb2RlLmludmFsaWRfaW50ZXJzZWN0aW9uX3R5cGVzOlxuICAgICAgICAgICAgbWVzc2FnZSA9IGBJbnRlcnNlY3Rpb24gcmVzdWx0cyBjb3VsZCBub3QgYmUgbWVyZ2VkYDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFpvZElzc3VlQ29kZS5ub3RfbXVsdGlwbGVfb2Y6XG4gICAgICAgICAgICBtZXNzYWdlID0gYE51bWJlciBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgJHtpc3N1ZS5tdWx0aXBsZU9mfWA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBab2RJc3N1ZUNvZGUubm90X2Zpbml0ZTpcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBcIk51bWJlciBtdXN0IGJlIGZpbml0ZVwiO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBtZXNzYWdlID0gX2N0eC5kZWZhdWx0RXJyb3I7XG4gICAgICAgICAgICB1dGlsLmFzc2VydE5ldmVyKGlzc3VlKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgbWVzc2FnZSB9O1xufTtcbmV4cG9ydCBkZWZhdWx0IGVycm9yTWFwO1xuIiwiaW1wb3J0IGRlZmF1bHRFcnJvck1hcCBmcm9tIFwiLi9sb2NhbGVzL2VuLmpzXCI7XG5sZXQgb3ZlcnJpZGVFcnJvck1hcCA9IGRlZmF1bHRFcnJvck1hcDtcbmV4cG9ydCB7IGRlZmF1bHRFcnJvck1hcCB9O1xuZXhwb3J0IGZ1bmN0aW9uIHNldEVycm9yTWFwKG1hcCkge1xuICAgIG92ZXJyaWRlRXJyb3JNYXAgPSBtYXA7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0RXJyb3JNYXAoKSB7XG4gICAgcmV0dXJuIG92ZXJyaWRlRXJyb3JNYXA7XG59XG4iLCJpbXBvcnQgeyBnZXRFcnJvck1hcCB9IGZyb20gXCIuLi9lcnJvcnMuanNcIjtcbmltcG9ydCBkZWZhdWx0RXJyb3JNYXAgZnJvbSBcIi4uL2xvY2FsZXMvZW4uanNcIjtcbmV4cG9ydCBjb25zdCBtYWtlSXNzdWUgPSAocGFyYW1zKSA9PiB7XG4gICAgY29uc3QgeyBkYXRhLCBwYXRoLCBlcnJvck1hcHMsIGlzc3VlRGF0YSB9ID0gcGFyYW1zO1xuICAgIGNvbnN0IGZ1bGxQYXRoID0gWy4uLnBhdGgsIC4uLihpc3N1ZURhdGEucGF0aCB8fCBbXSldO1xuICAgIGNvbnN0IGZ1bGxJc3N1ZSA9IHtcbiAgICAgICAgLi4uaXNzdWVEYXRhLFxuICAgICAgICBwYXRoOiBmdWxsUGF0aCxcbiAgICB9O1xuICAgIGlmIChpc3N1ZURhdGEubWVzc2FnZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5pc3N1ZURhdGEsXG4gICAgICAgICAgICBwYXRoOiBmdWxsUGF0aCxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGlzc3VlRGF0YS5tZXNzYWdlLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBsZXQgZXJyb3JNZXNzYWdlID0gXCJcIjtcbiAgICBjb25zdCBtYXBzID0gZXJyb3JNYXBzXG4gICAgICAgIC5maWx0ZXIoKG0pID0+ICEhbSlcbiAgICAgICAgLnNsaWNlKClcbiAgICAgICAgLnJldmVyc2UoKTtcbiAgICBmb3IgKGNvbnN0IG1hcCBvZiBtYXBzKSB7XG4gICAgICAgIGVycm9yTWVzc2FnZSA9IG1hcChmdWxsSXNzdWUsIHsgZGF0YSwgZGVmYXVsdEVycm9yOiBlcnJvck1lc3NhZ2UgfSkubWVzc2FnZTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgLi4uaXNzdWVEYXRhLFxuICAgICAgICBwYXRoOiBmdWxsUGF0aCxcbiAgICAgICAgbWVzc2FnZTogZXJyb3JNZXNzYWdlLFxuICAgIH07XG59O1xuZXhwb3J0IGNvbnN0IEVNUFRZX1BBVEggPSBbXTtcbmV4cG9ydCBmdW5jdGlvbiBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIGlzc3VlRGF0YSkge1xuICAgIGNvbnN0IG92ZXJyaWRlTWFwID0gZ2V0RXJyb3JNYXAoKTtcbiAgICBjb25zdCBpc3N1ZSA9IG1ha2VJc3N1ZSh7XG4gICAgICAgIGlzc3VlRGF0YTogaXNzdWVEYXRhLFxuICAgICAgICBkYXRhOiBjdHguZGF0YSxcbiAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgIGVycm9yTWFwczogW1xuICAgICAgICAgICAgY3R4LmNvbW1vbi5jb250ZXh0dWFsRXJyb3JNYXAsIC8vIGNvbnRleHR1YWwgZXJyb3IgbWFwIGlzIGZpcnN0IHByaW9yaXR5XG4gICAgICAgICAgICBjdHguc2NoZW1hRXJyb3JNYXAsIC8vIHRoZW4gc2NoZW1hLWJvdW5kIG1hcCBpZiBhdmFpbGFibGVcbiAgICAgICAgICAgIG92ZXJyaWRlTWFwLCAvLyB0aGVuIGdsb2JhbCBvdmVycmlkZSBtYXBcbiAgICAgICAgICAgIG92ZXJyaWRlTWFwID09PSBkZWZhdWx0RXJyb3JNYXAgPyB1bmRlZmluZWQgOiBkZWZhdWx0RXJyb3JNYXAsIC8vIHRoZW4gZ2xvYmFsIGRlZmF1bHQgbWFwXG4gICAgICAgIF0uZmlsdGVyKCh4KSA9PiAhIXgpLFxuICAgIH0pO1xuICAgIGN0eC5jb21tb24uaXNzdWVzLnB1c2goaXNzdWUpO1xufVxuZXhwb3J0IGNsYXNzIFBhcnNlU3RhdHVzIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IFwidmFsaWRcIjtcbiAgICB9XG4gICAgZGlydHkoKSB7XG4gICAgICAgIGlmICh0aGlzLnZhbHVlID09PSBcInZhbGlkXCIpXG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gXCJkaXJ0eVwiO1xuICAgIH1cbiAgICBhYm9ydCgpIHtcbiAgICAgICAgaWYgKHRoaXMudmFsdWUgIT09IFwiYWJvcnRlZFwiKVxuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IFwiYWJvcnRlZFwiO1xuICAgIH1cbiAgICBzdGF0aWMgbWVyZ2VBcnJheShzdGF0dXMsIHJlc3VsdHMpIHtcbiAgICAgICAgY29uc3QgYXJyYXlWYWx1ZSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHMgb2YgcmVzdWx0cykge1xuICAgICAgICAgICAgaWYgKHMuc3RhdHVzID09PSBcImFib3J0ZWRcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgICAgIGlmIChzLnN0YXR1cyA9PT0gXCJkaXJ0eVwiKVxuICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgYXJyYXlWYWx1ZS5wdXNoKHMudmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHN0YXR1czogc3RhdHVzLnZhbHVlLCB2YWx1ZTogYXJyYXlWYWx1ZSB9O1xuICAgIH1cbiAgICBzdGF0aWMgYXN5bmMgbWVyZ2VPYmplY3RBc3luYyhzdGF0dXMsIHBhaXJzKSB7XG4gICAgICAgIGNvbnN0IHN5bmNQYWlycyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHBhaXIgb2YgcGFpcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGF3YWl0IHBhaXIua2V5O1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCBwYWlyLnZhbHVlO1xuICAgICAgICAgICAgc3luY1BhaXJzLnB1c2goe1xuICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQYXJzZVN0YXR1cy5tZXJnZU9iamVjdFN5bmMoc3RhdHVzLCBzeW5jUGFpcnMpO1xuICAgIH1cbiAgICBzdGF0aWMgbWVyZ2VPYmplY3RTeW5jKHN0YXR1cywgcGFpcnMpIHtcbiAgICAgICAgY29uc3QgZmluYWxPYmplY3QgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBwYWlyIG9mIHBhaXJzKSB7XG4gICAgICAgICAgICBjb25zdCB7IGtleSwgdmFsdWUgfSA9IHBhaXI7XG4gICAgICAgICAgICBpZiAoa2V5LnN0YXR1cyA9PT0gXCJhYm9ydGVkXCIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgICAgICBpZiAodmFsdWUuc3RhdHVzID09PSBcImFib3J0ZWRcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgICAgIGlmIChrZXkuc3RhdHVzID09PSBcImRpcnR5XCIpXG4gICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICBpZiAodmFsdWUuc3RhdHVzID09PSBcImRpcnR5XCIpXG4gICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICBpZiAoa2V5LnZhbHVlICE9PSBcIl9fcHJvdG9fX1wiICYmICh0eXBlb2YgdmFsdWUudmFsdWUgIT09IFwidW5kZWZpbmVkXCIgfHwgcGFpci5hbHdheXNTZXQpKSB7XG4gICAgICAgICAgICAgICAgZmluYWxPYmplY3Rba2V5LnZhbHVlXSA9IHZhbHVlLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHN0YXR1czogc3RhdHVzLnZhbHVlLCB2YWx1ZTogZmluYWxPYmplY3QgfTtcbiAgICB9XG59XG5leHBvcnQgY29uc3QgSU5WQUxJRCA9IE9iamVjdC5mcmVlemUoe1xuICAgIHN0YXR1czogXCJhYm9ydGVkXCIsXG59KTtcbmV4cG9ydCBjb25zdCBESVJUWSA9ICh2YWx1ZSkgPT4gKHsgc3RhdHVzOiBcImRpcnR5XCIsIHZhbHVlIH0pO1xuZXhwb3J0IGNvbnN0IE9LID0gKHZhbHVlKSA9PiAoeyBzdGF0dXM6IFwidmFsaWRcIiwgdmFsdWUgfSk7XG5leHBvcnQgY29uc3QgaXNBYm9ydGVkID0gKHgpID0+IHguc3RhdHVzID09PSBcImFib3J0ZWRcIjtcbmV4cG9ydCBjb25zdCBpc0RpcnR5ID0gKHgpID0+IHguc3RhdHVzID09PSBcImRpcnR5XCI7XG5leHBvcnQgY29uc3QgaXNWYWxpZCA9ICh4KSA9PiB4LnN0YXR1cyA9PT0gXCJ2YWxpZFwiO1xuZXhwb3J0IGNvbnN0IGlzQXN5bmMgPSAoeCkgPT4gdHlwZW9mIFByb21pc2UgIT09IFwidW5kZWZpbmVkXCIgJiYgeCBpbnN0YW5jZW9mIFByb21pc2U7XG4iLCJleHBvcnQgdmFyIGVycm9yVXRpbDtcbihmdW5jdGlvbiAoZXJyb3JVdGlsKSB7XG4gICAgZXJyb3JVdGlsLmVyclRvT2JqID0gKG1lc3NhZ2UpID0+IHR5cGVvZiBtZXNzYWdlID09PSBcInN0cmluZ1wiID8geyBtZXNzYWdlIH0gOiBtZXNzYWdlIHx8IHt9O1xuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50OlxuICAgIGVycm9yVXRpbC50b1N0cmluZyA9IChtZXNzYWdlKSA9PiB0eXBlb2YgbWVzc2FnZSA9PT0gXCJzdHJpbmdcIiA/IG1lc3NhZ2UgOiBtZXNzYWdlPy5tZXNzYWdlO1xufSkoZXJyb3JVdGlsIHx8IChlcnJvclV0aWwgPSB7fSkpO1xuIiwiaW1wb3J0IHsgWm9kRXJyb3IsIFpvZElzc3VlQ29kZSwgfSBmcm9tIFwiLi9ab2RFcnJvci5qc1wiO1xuaW1wb3J0IHsgZGVmYXVsdEVycm9yTWFwLCBnZXRFcnJvck1hcCB9IGZyb20gXCIuL2Vycm9ycy5qc1wiO1xuaW1wb3J0IHsgZXJyb3JVdGlsIH0gZnJvbSBcIi4vaGVscGVycy9lcnJvclV0aWwuanNcIjtcbmltcG9ydCB7IERJUlRZLCBJTlZBTElELCBPSywgUGFyc2VTdGF0dXMsIGFkZElzc3VlVG9Db250ZXh0LCBpc0Fib3J0ZWQsIGlzQXN5bmMsIGlzRGlydHksIGlzVmFsaWQsIG1ha2VJc3N1ZSwgfSBmcm9tIFwiLi9oZWxwZXJzL3BhcnNlVXRpbC5qc1wiO1xuaW1wb3J0IHsgdXRpbCwgWm9kUGFyc2VkVHlwZSwgZ2V0UGFyc2VkVHlwZSB9IGZyb20gXCIuL2hlbHBlcnMvdXRpbC5qc1wiO1xuY2xhc3MgUGFyc2VJbnB1dExhenlQYXRoIHtcbiAgICBjb25zdHJ1Y3RvcihwYXJlbnQsIHZhbHVlLCBwYXRoLCBrZXkpIHtcbiAgICAgICAgdGhpcy5fY2FjaGVkUGF0aCA9IFtdO1xuICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgdGhpcy5kYXRhID0gdmFsdWU7XG4gICAgICAgIHRoaXMuX3BhdGggPSBwYXRoO1xuICAgICAgICB0aGlzLl9rZXkgPSBrZXk7XG4gICAgfVxuICAgIGdldCBwYXRoKCkge1xuICAgICAgICBpZiAoIXRoaXMuX2NhY2hlZFBhdGgubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLl9rZXkpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVkUGF0aC5wdXNoKC4uLnRoaXMuX3BhdGgsIC4uLnRoaXMuX2tleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jYWNoZWRQYXRoLnB1c2goLi4udGhpcy5fcGF0aCwgdGhpcy5fa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fY2FjaGVkUGF0aDtcbiAgICB9XG59XG5jb25zdCBoYW5kbGVSZXN1bHQgPSAoY3R4LCByZXN1bHQpID0+IHtcbiAgICBpZiAoaXNWYWxpZChyZXN1bHQpKSB7XG4gICAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIGRhdGE6IHJlc3VsdC52YWx1ZSB9O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaWYgKCFjdHguY29tbW9uLmlzc3Vlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlZhbGlkYXRpb24gZmFpbGVkIGJ1dCBubyBpc3N1ZXMgZGV0ZWN0ZWQuXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIGdldCBlcnJvcigpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fZXJyb3IpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9lcnJvcjtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBab2RFcnJvcihjdHguY29tbW9uLmlzc3Vlcyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZXJyb3IgPSBlcnJvcjtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZXJyb3I7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH1cbn07XG5mdW5jdGlvbiBwcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcykge1xuICAgIGlmICghcGFyYW1zKVxuICAgICAgICByZXR1cm4ge307XG4gICAgY29uc3QgeyBlcnJvck1hcCwgaW52YWxpZF90eXBlX2Vycm9yLCByZXF1aXJlZF9lcnJvciwgZGVzY3JpcHRpb24gfSA9IHBhcmFtcztcbiAgICBpZiAoZXJyb3JNYXAgJiYgKGludmFsaWRfdHlwZV9lcnJvciB8fCByZXF1aXJlZF9lcnJvcikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW4ndCB1c2UgXCJpbnZhbGlkX3R5cGVfZXJyb3JcIiBvciBcInJlcXVpcmVkX2Vycm9yXCIgaW4gY29uanVuY3Rpb24gd2l0aCBjdXN0b20gZXJyb3IgbWFwLmApO1xuICAgIH1cbiAgICBpZiAoZXJyb3JNYXApXG4gICAgICAgIHJldHVybiB7IGVycm9yTWFwOiBlcnJvck1hcCwgZGVzY3JpcHRpb24gfTtcbiAgICBjb25zdCBjdXN0b21NYXAgPSAoaXNzLCBjdHgpID0+IHtcbiAgICAgICAgY29uc3QgeyBtZXNzYWdlIH0gPSBwYXJhbXM7XG4gICAgICAgIGlmIChpc3MuY29kZSA9PT0gXCJpbnZhbGlkX2VudW1fdmFsdWVcIikge1xuICAgICAgICAgICAgcmV0dXJuIHsgbWVzc2FnZTogbWVzc2FnZSA/PyBjdHguZGVmYXVsdEVycm9yIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBjdHguZGF0YSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgcmV0dXJuIHsgbWVzc2FnZTogbWVzc2FnZSA/PyByZXF1aXJlZF9lcnJvciA/PyBjdHguZGVmYXVsdEVycm9yIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzcy5jb2RlICE9PSBcImludmFsaWRfdHlwZVwiKVxuICAgICAgICAgICAgcmV0dXJuIHsgbWVzc2FnZTogY3R4LmRlZmF1bHRFcnJvciB9O1xuICAgICAgICByZXR1cm4geyBtZXNzYWdlOiBtZXNzYWdlID8/IGludmFsaWRfdHlwZV9lcnJvciA/PyBjdHguZGVmYXVsdEVycm9yIH07XG4gICAgfTtcbiAgICByZXR1cm4geyBlcnJvck1hcDogY3VzdG9tTWFwLCBkZXNjcmlwdGlvbiB9O1xufVxuZXhwb3J0IGNsYXNzIFpvZFR5cGUge1xuICAgIGdldCBkZXNjcmlwdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5kZXNjcmlwdGlvbjtcbiAgICB9XG4gICAgX2dldFR5cGUoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIGdldFBhcnNlZFR5cGUoaW5wdXQuZGF0YSk7XG4gICAgfVxuICAgIF9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KSB7XG4gICAgICAgIHJldHVybiAoY3R4IHx8IHtcbiAgICAgICAgICAgIGNvbW1vbjogaW5wdXQucGFyZW50LmNvbW1vbixcbiAgICAgICAgICAgIGRhdGE6IGlucHV0LmRhdGEsXG4gICAgICAgICAgICBwYXJzZWRUeXBlOiBnZXRQYXJzZWRUeXBlKGlucHV0LmRhdGEpLFxuICAgICAgICAgICAgc2NoZW1hRXJyb3JNYXA6IHRoaXMuX2RlZi5lcnJvck1hcCxcbiAgICAgICAgICAgIHBhdGg6IGlucHV0LnBhdGgsXG4gICAgICAgICAgICBwYXJlbnQ6IGlucHV0LnBhcmVudCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIF9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN0YXR1czogbmV3IFBhcnNlU3RhdHVzKCksXG4gICAgICAgICAgICBjdHg6IHtcbiAgICAgICAgICAgICAgICBjb21tb246IGlucHV0LnBhcmVudC5jb21tb24sXG4gICAgICAgICAgICAgICAgZGF0YTogaW5wdXQuZGF0YSxcbiAgICAgICAgICAgICAgICBwYXJzZWRUeXBlOiBnZXRQYXJzZWRUeXBlKGlucHV0LmRhdGEpLFxuICAgICAgICAgICAgICAgIHNjaGVtYUVycm9yTWFwOiB0aGlzLl9kZWYuZXJyb3JNYXAsXG4gICAgICAgICAgICAgICAgcGF0aDogaW5wdXQucGF0aCxcbiAgICAgICAgICAgICAgICBwYXJlbnQ6IGlucHV0LnBhcmVudCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfVxuICAgIF9wYXJzZVN5bmMoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fcGFyc2UoaW5wdXQpO1xuICAgICAgICBpZiAoaXNBc3luYyhyZXN1bHQpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTeW5jaHJvbm91cyBwYXJzZSBlbmNvdW50ZXJlZCBwcm9taXNlLlwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBfcGFyc2VBc3luYyhpbnB1dCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9wYXJzZShpbnB1dCk7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzdWx0KTtcbiAgICB9XG4gICAgcGFyc2UoZGF0YSwgcGFyYW1zKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuc2FmZVBhcnNlKGRhdGEsIHBhcmFtcyk7XG4gICAgICAgIGlmIChyZXN1bHQuc3VjY2VzcylcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQuZGF0YTtcbiAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgIH1cbiAgICBzYWZlUGFyc2UoZGF0YSwgcGFyYW1zKSB7XG4gICAgICAgIGNvbnN0IGN0eCA9IHtcbiAgICAgICAgICAgIGNvbW1vbjoge1xuICAgICAgICAgICAgICAgIGlzc3VlczogW10sXG4gICAgICAgICAgICAgICAgYXN5bmM6IHBhcmFtcz8uYXN5bmMgPz8gZmFsc2UsXG4gICAgICAgICAgICAgICAgY29udGV4dHVhbEVycm9yTWFwOiBwYXJhbXM/LmVycm9yTWFwLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHBhdGg6IHBhcmFtcz8ucGF0aCB8fCBbXSxcbiAgICAgICAgICAgIHNjaGVtYUVycm9yTWFwOiB0aGlzLl9kZWYuZXJyb3JNYXAsXG4gICAgICAgICAgICBwYXJlbnQ6IG51bGwsXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgcGFyc2VkVHlwZTogZ2V0UGFyc2VkVHlwZShkYXRhKSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fcGFyc2VTeW5jKHsgZGF0YSwgcGF0aDogY3R4LnBhdGgsIHBhcmVudDogY3R4IH0pO1xuICAgICAgICByZXR1cm4gaGFuZGxlUmVzdWx0KGN0eCwgcmVzdWx0KTtcbiAgICB9XG4gICAgXCJ+dmFsaWRhdGVcIihkYXRhKSB7XG4gICAgICAgIGNvbnN0IGN0eCA9IHtcbiAgICAgICAgICAgIGNvbW1vbjoge1xuICAgICAgICAgICAgICAgIGlzc3VlczogW10sXG4gICAgICAgICAgICAgICAgYXN5bmM6ICEhdGhpc1tcIn5zdGFuZGFyZFwiXS5hc3luYyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwYXRoOiBbXSxcbiAgICAgICAgICAgIHNjaGVtYUVycm9yTWFwOiB0aGlzLl9kZWYuZXJyb3JNYXAsXG4gICAgICAgICAgICBwYXJlbnQ6IG51bGwsXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgcGFyc2VkVHlwZTogZ2V0UGFyc2VkVHlwZShkYXRhKSxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKCF0aGlzW1wifnN0YW5kYXJkXCJdLmFzeW5jKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX3BhcnNlU3luYyh7IGRhdGEsIHBhdGg6IFtdLCBwYXJlbnQ6IGN0eCB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNWYWxpZChyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHJlc3VsdC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzc3VlczogY3R4LmNvbW1vbi5pc3N1ZXMsXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVycj8ubWVzc2FnZT8udG9Mb3dlckNhc2UoKT8uaW5jbHVkZXMoXCJlbmNvdW50ZXJlZFwiKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzW1wifnN0YW5kYXJkXCJdLmFzeW5jID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY3R4LmNvbW1vbiA9IHtcbiAgICAgICAgICAgICAgICAgICAgaXNzdWVzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgYXN5bmM6IHRydWUsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fcGFyc2VBc3luYyh7IGRhdGEsIHBhdGg6IFtdLCBwYXJlbnQ6IGN0eCB9KS50aGVuKChyZXN1bHQpID0+IGlzVmFsaWQocmVzdWx0KVxuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IHJlc3VsdC52YWx1ZSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgIGlzc3VlczogY3R4LmNvbW1vbi5pc3N1ZXMsXG4gICAgICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgcGFyc2VBc3luYyhkYXRhLCBwYXJhbXMpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zYWZlUGFyc2VBc3luYyhkYXRhLCBwYXJhbXMpO1xuICAgICAgICBpZiAocmVzdWx0LnN1Y2Nlc3MpXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0LmRhdGE7XG4gICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICB9XG4gICAgYXN5bmMgc2FmZVBhcnNlQXN5bmMoZGF0YSwgcGFyYW1zKSB7XG4gICAgICAgIGNvbnN0IGN0eCA9IHtcbiAgICAgICAgICAgIGNvbW1vbjoge1xuICAgICAgICAgICAgICAgIGlzc3VlczogW10sXG4gICAgICAgICAgICAgICAgY29udGV4dHVhbEVycm9yTWFwOiBwYXJhbXM/LmVycm9yTWFwLFxuICAgICAgICAgICAgICAgIGFzeW5jOiB0cnVlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHBhdGg6IHBhcmFtcz8ucGF0aCB8fCBbXSxcbiAgICAgICAgICAgIHNjaGVtYUVycm9yTWFwOiB0aGlzLl9kZWYuZXJyb3JNYXAsXG4gICAgICAgICAgICBwYXJlbnQ6IG51bGwsXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgcGFyc2VkVHlwZTogZ2V0UGFyc2VkVHlwZShkYXRhKSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgbWF5YmVBc3luY1Jlc3VsdCA9IHRoaXMuX3BhcnNlKHsgZGF0YSwgcGF0aDogY3R4LnBhdGgsIHBhcmVudDogY3R4IH0pO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCAoaXNBc3luYyhtYXliZUFzeW5jUmVzdWx0KSA/IG1heWJlQXN5bmNSZXN1bHQgOiBQcm9taXNlLnJlc29sdmUobWF5YmVBc3luY1Jlc3VsdCkpO1xuICAgICAgICByZXR1cm4gaGFuZGxlUmVzdWx0KGN0eCwgcmVzdWx0KTtcbiAgICB9XG4gICAgcmVmaW5lKGNoZWNrLCBtZXNzYWdlKSB7XG4gICAgICAgIGNvbnN0IGdldElzc3VlUHJvcGVydGllcyA9ICh2YWwpID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbWVzc2FnZSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgbWVzc2FnZSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IG1lc3NhZ2UgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBtZXNzYWdlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWVzc2FnZSh2YWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWZpbmVtZW50KCh2YWwsIGN0eCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gY2hlY2sodmFsKTtcbiAgICAgICAgICAgIGNvbnN0IHNldEVycm9yID0gKCkgPT4gY3R4LmFkZElzc3VlKHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuY3VzdG9tLFxuICAgICAgICAgICAgICAgIC4uLmdldElzc3VlUHJvcGVydGllcyh2YWwpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIFByb21pc2UgIT09IFwidW5kZWZpbmVkXCIgJiYgcmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQudGhlbigoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEVycm9yKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBzZXRFcnJvcigpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmVmaW5lbWVudChjaGVjaywgcmVmaW5lbWVudERhdGEpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlZmluZW1lbnQoKHZhbCwgY3R4KSA9PiB7XG4gICAgICAgICAgICBpZiAoIWNoZWNrKHZhbCkpIHtcbiAgICAgICAgICAgICAgICBjdHguYWRkSXNzdWUodHlwZW9mIHJlZmluZW1lbnREYXRhID09PSBcImZ1bmN0aW9uXCIgPyByZWZpbmVtZW50RGF0YSh2YWwsIGN0eCkgOiByZWZpbmVtZW50RGF0YSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBfcmVmaW5lbWVudChyZWZpbmVtZW50KSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kRWZmZWN0cyh7XG4gICAgICAgICAgICBzY2hlbWE6IHRoaXMsXG4gICAgICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEVmZmVjdHMsXG4gICAgICAgICAgICBlZmZlY3Q6IHsgdHlwZTogXCJyZWZpbmVtZW50XCIsIHJlZmluZW1lbnQgfSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN1cGVyUmVmaW5lKHJlZmluZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlZmluZW1lbnQocmVmaW5lbWVudCk7XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKGRlZikge1xuICAgICAgICAvKiogQWxpYXMgb2Ygc2FmZVBhcnNlQXN5bmMgKi9cbiAgICAgICAgdGhpcy5zcGEgPSB0aGlzLnNhZmVQYXJzZUFzeW5jO1xuICAgICAgICB0aGlzLl9kZWYgPSBkZWY7XG4gICAgICAgIHRoaXMucGFyc2UgPSB0aGlzLnBhcnNlLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuc2FmZVBhcnNlID0gdGhpcy5zYWZlUGFyc2UuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5wYXJzZUFzeW5jID0gdGhpcy5wYXJzZUFzeW5jLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuc2FmZVBhcnNlQXN5bmMgPSB0aGlzLnNhZmVQYXJzZUFzeW5jLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuc3BhID0gdGhpcy5zcGEuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5yZWZpbmUgPSB0aGlzLnJlZmluZS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnJlZmluZW1lbnQgPSB0aGlzLnJlZmluZW1lbnQuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5zdXBlclJlZmluZSA9IHRoaXMuc3VwZXJSZWZpbmUuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5vcHRpb25hbCA9IHRoaXMub3B0aW9uYWwuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5udWxsYWJsZSA9IHRoaXMubnVsbGFibGUuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5udWxsaXNoID0gdGhpcy5udWxsaXNoLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuYXJyYXkgPSB0aGlzLmFycmF5LmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMucHJvbWlzZSA9IHRoaXMucHJvbWlzZS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLm9yID0gdGhpcy5vci5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmFuZCA9IHRoaXMuYW5kLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMudHJhbnNmb3JtID0gdGhpcy50cmFuc2Zvcm0uYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5icmFuZCA9IHRoaXMuYnJhbmQuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5kZWZhdWx0ID0gdGhpcy5kZWZhdWx0LmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuY2F0Y2ggPSB0aGlzLmNhdGNoLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuZGVzY3JpYmUgPSB0aGlzLmRlc2NyaWJlLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMucGlwZSA9IHRoaXMucGlwZS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnJlYWRvbmx5ID0gdGhpcy5yZWFkb25seS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmlzTnVsbGFibGUgPSB0aGlzLmlzTnVsbGFibGUuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5pc09wdGlvbmFsID0gdGhpcy5pc09wdGlvbmFsLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXNbXCJ+c3RhbmRhcmRcIl0gPSB7XG4gICAgICAgICAgICB2ZXJzaW9uOiAxLFxuICAgICAgICAgICAgdmVuZG9yOiBcInpvZFwiLFxuICAgICAgICAgICAgdmFsaWRhdGU6IChkYXRhKSA9PiB0aGlzW1wifnZhbGlkYXRlXCJdKGRhdGEpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBvcHRpb25hbCgpIHtcbiAgICAgICAgcmV0dXJuIFpvZE9wdGlvbmFsLmNyZWF0ZSh0aGlzLCB0aGlzLl9kZWYpO1xuICAgIH1cbiAgICBudWxsYWJsZSgpIHtcbiAgICAgICAgcmV0dXJuIFpvZE51bGxhYmxlLmNyZWF0ZSh0aGlzLCB0aGlzLl9kZWYpO1xuICAgIH1cbiAgICBudWxsaXNoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5udWxsYWJsZSgpLm9wdGlvbmFsKCk7XG4gICAgfVxuICAgIGFycmF5KCkge1xuICAgICAgICByZXR1cm4gWm9kQXJyYXkuY3JlYXRlKHRoaXMpO1xuICAgIH1cbiAgICBwcm9taXNlKCkge1xuICAgICAgICByZXR1cm4gWm9kUHJvbWlzZS5jcmVhdGUodGhpcywgdGhpcy5fZGVmKTtcbiAgICB9XG4gICAgb3Iob3B0aW9uKSB7XG4gICAgICAgIHJldHVybiBab2RVbmlvbi5jcmVhdGUoW3RoaXMsIG9wdGlvbl0sIHRoaXMuX2RlZik7XG4gICAgfVxuICAgIGFuZChpbmNvbWluZykge1xuICAgICAgICByZXR1cm4gWm9kSW50ZXJzZWN0aW9uLmNyZWF0ZSh0aGlzLCBpbmNvbWluZywgdGhpcy5fZGVmKTtcbiAgICB9XG4gICAgdHJhbnNmb3JtKHRyYW5zZm9ybSkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZEVmZmVjdHMoe1xuICAgICAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyh0aGlzLl9kZWYpLFxuICAgICAgICAgICAgc2NoZW1hOiB0aGlzLFxuICAgICAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RFZmZlY3RzLFxuICAgICAgICAgICAgZWZmZWN0OiB7IHR5cGU6IFwidHJhbnNmb3JtXCIsIHRyYW5zZm9ybSB9LFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZGVmYXVsdChkZWYpIHtcbiAgICAgICAgY29uc3QgZGVmYXVsdFZhbHVlRnVuYyA9IHR5cGVvZiBkZWYgPT09IFwiZnVuY3Rpb25cIiA/IGRlZiA6ICgpID0+IGRlZjtcbiAgICAgICAgcmV0dXJuIG5ldyBab2REZWZhdWx0KHtcbiAgICAgICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXModGhpcy5fZGVmKSxcbiAgICAgICAgICAgIGlubmVyVHlwZTogdGhpcyxcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogZGVmYXVsdFZhbHVlRnVuYyxcbiAgICAgICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kRGVmYXVsdCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGJyYW5kKCkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZEJyYW5kZWQoe1xuICAgICAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RCcmFuZGVkLFxuICAgICAgICAgICAgdHlwZTogdGhpcyxcbiAgICAgICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXModGhpcy5fZGVmKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNhdGNoKGRlZikge1xuICAgICAgICBjb25zdCBjYXRjaFZhbHVlRnVuYyA9IHR5cGVvZiBkZWYgPT09IFwiZnVuY3Rpb25cIiA/IGRlZiA6ICgpID0+IGRlZjtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RDYXRjaCh7XG4gICAgICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHRoaXMuX2RlZiksXG4gICAgICAgICAgICBpbm5lclR5cGU6IHRoaXMsXG4gICAgICAgICAgICBjYXRjaFZhbHVlOiBjYXRjaFZhbHVlRnVuYyxcbiAgICAgICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kQ2F0Y2gsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBkZXNjcmliZShkZXNjcmlwdGlvbikge1xuICAgICAgICBjb25zdCBUaGlzID0gdGhpcy5jb25zdHJ1Y3RvcjtcbiAgICAgICAgcmV0dXJuIG5ldyBUaGlzKHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcGlwZSh0YXJnZXQpIHtcbiAgICAgICAgcmV0dXJuIFpvZFBpcGVsaW5lLmNyZWF0ZSh0aGlzLCB0YXJnZXQpO1xuICAgIH1cbiAgICByZWFkb25seSgpIHtcbiAgICAgICAgcmV0dXJuIFpvZFJlYWRvbmx5LmNyZWF0ZSh0aGlzKTtcbiAgICB9XG4gICAgaXNPcHRpb25hbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2FmZVBhcnNlKHVuZGVmaW5lZCkuc3VjY2VzcztcbiAgICB9XG4gICAgaXNOdWxsYWJsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2FmZVBhcnNlKG51bGwpLnN1Y2Nlc3M7XG4gICAgfVxufVxuY29uc3QgY3VpZFJlZ2V4ID0gL15jW15cXHMtXXs4LH0kL2k7XG5jb25zdCBjdWlkMlJlZ2V4ID0gL15bMC05YS16XSskLztcbmNvbnN0IHVsaWRSZWdleCA9IC9eWzAtOUEtSEpLTU5QLVRWLVpdezI2fSQvaTtcbi8vIGNvbnN0IHV1aWRSZWdleCA9XG4vLyAgIC9eKFthLWYwLTldezh9LVthLWYwLTldezR9LVsxLTVdW2EtZjAtOV17M30tW2EtZjAtOV17NH0tW2EtZjAtOV17MTJ9fDAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCkkL2k7XG5jb25zdCB1dWlkUmVnZXggPSAvXlswLTlhLWZBLUZdezh9XFxiLVswLTlhLWZBLUZdezR9XFxiLVswLTlhLWZBLUZdezR9XFxiLVswLTlhLWZBLUZdezR9XFxiLVswLTlhLWZBLUZdezEyfSQvaTtcbmNvbnN0IG5hbm9pZFJlZ2V4ID0gL15bYS16MC05Xy1dezIxfSQvaTtcbmNvbnN0IGp3dFJlZ2V4ID0gL15bQS1aYS16MC05LV9dK1xcLltBLVphLXowLTktX10rXFwuW0EtWmEtejAtOS1fXSokLztcbmNvbnN0IGR1cmF0aW9uUmVnZXggPSAvXlstK10/UCg/ISQpKD86KD86Wy0rXT9cXGQrWSl8KD86Wy0rXT9cXGQrWy4sXVxcZCtZJCkpPyg/Oig/OlstK10/XFxkK00pfCg/OlstK10/XFxkK1suLF1cXGQrTSQpKT8oPzooPzpbLStdP1xcZCtXKXwoPzpbLStdP1xcZCtbLixdXFxkK1ckKSk/KD86KD86Wy0rXT9cXGQrRCl8KD86Wy0rXT9cXGQrWy4sXVxcZCtEJCkpPyg/OlQoPz1bXFxkKy1dKSg/Oig/OlstK10/XFxkK0gpfCg/OlstK10/XFxkK1suLF1cXGQrSCQpKT8oPzooPzpbLStdP1xcZCtNKXwoPzpbLStdP1xcZCtbLixdXFxkK00kKSk/KD86Wy0rXT9cXGQrKD86Wy4sXVxcZCspP1MpPyk/PyQvO1xuLy8gZnJvbSBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvNDYxODEvMTU1MDE1NVxuLy8gb2xkIHZlcnNpb246IHRvbyBzbG93LCBkaWRuJ3Qgc3VwcG9ydCB1bmljb2RlXG4vLyBjb25zdCBlbWFpbFJlZ2V4ID0gL14oKChbYS16XXxcXGR8WyEjXFwkJSYnXFwqXFwrXFwtXFwvPVxcP1xcXl9ge1xcfH1+XXxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSkrKFxcLihbYS16XXxcXGR8WyEjXFwkJSYnXFwqXFwrXFwtXFwvPVxcP1xcXl9ge1xcfH1+XXxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSkrKSopfCgoXFx4MjIpKCgoKFxceDIwfFxceDA5KSooXFx4MGRcXHgwYSkpPyhcXHgyMHxcXHgwOSkrKT8oKFtcXHgwMS1cXHgwOFxceDBiXFx4MGNcXHgwZS1cXHgxZlxceDdmXXxcXHgyMXxbXFx4MjMtXFx4NWJdfFtcXHg1ZC1cXHg3ZV18W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pfChcXFxcKFtcXHgwMS1cXHgwOVxceDBiXFx4MGNcXHgwZC1cXHg3Zl18W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKSkpKigoKFxceDIwfFxceDA5KSooXFx4MGRcXHgwYSkpPyhcXHgyMHxcXHgwOSkrKT8oXFx4MjIpKSlAKCgoW2Etel18XFxkfFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKXwoKFthLXpdfFxcZHxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSkoW2Etel18XFxkfC18XFwufF98fnxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSkqKFthLXpdfFxcZHxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSkpKVxcLikrKChbYS16XXxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSl8KChbYS16XXxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSkoW2Etel18XFxkfC18XFwufF98fnxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSkqKFthLXpdfFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKSkpJC9pO1xuLy9vbGQgZW1haWwgcmVnZXhcbi8vIGNvbnN0IGVtYWlsUmVnZXggPSAvXigoW148PigpW1xcXS4sOzpcXHNAXCJdKyhcXC5bXjw+KClbXFxdLiw7Olxcc0BcIl0rKSopfChcIi4rXCIpKUAoKD8hLSkoW148PigpW1xcXS4sOzpcXHNAXCJdK1xcLikrW148PigpW1xcXS4sOzpcXHNAXCJdezEsfSlbXi08PigpW1xcXS4sOzpcXHNAXCJdJC9pO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4vLyBjb25zdCBlbWFpbFJlZ2V4ID1cbi8vICAgL14oKFtePD4oKVtcXF1cXFxcLiw7Olxcc0BcXFwiXSsoXFwuW148PigpW1xcXVxcXFwuLDs6XFxzQFxcXCJdKykqKXwoXFxcIi4rXFxcIikpQCgoXFxbKCgoMjVbMC01XSl8KDJbMC00XVswLTldKXwoMVswLTldezJ9KXwoWzAtOV17MSwyfSkpXFwuKXszfSgoMjVbMC01XSl8KDJbMC00XVswLTldKXwoMVswLTldezJ9KXwoWzAtOV17MSwyfSkpXFxdKXwoXFxbSVB2NjooKFthLWYwLTldezEsNH06KXs3fXw6OihbYS1mMC05XXsxLDR9Oil7MCw2fXwoW2EtZjAtOV17MSw0fTopezF9OihbYS1mMC05XXsxLDR9Oil7MCw1fXwoW2EtZjAtOV17MSw0fTopezJ9OihbYS1mMC05XXsxLDR9Oil7MCw0fXwoW2EtZjAtOV17MSw0fTopezN9OihbYS1mMC05XXsxLDR9Oil7MCwzfXwoW2EtZjAtOV17MSw0fTopezR9OihbYS1mMC05XXsxLDR9Oil7MCwyfXwoW2EtZjAtOV17MSw0fTopezV9OihbYS1mMC05XXsxLDR9Oil7MCwxfSkoW2EtZjAtOV17MSw0fXwoKCgyNVswLTVdKXwoMlswLTRdWzAtOV0pfCgxWzAtOV17Mn0pfChbMC05XXsxLDJ9KSlcXC4pezN9KCgyNVswLTVdKXwoMlswLTRdWzAtOV0pfCgxWzAtOV17Mn0pfChbMC05XXsxLDJ9KSkpXFxdKXwoW0EtWmEtejAtOV0oW0EtWmEtejAtOS1dKltBLVphLXowLTldKSooXFwuW0EtWmEtel17Mix9KSspKSQvO1xuLy8gY29uc3QgZW1haWxSZWdleCA9XG4vLyAgIC9eW2EtekEtWjAtOVxcLlxcIVxcI1xcJFxcJVxcJlxcJ1xcKlxcK1xcL1xcPVxcP1xcXlxcX1xcYFxce1xcfFxcfVxcflxcLV0rQFthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0pPyg/OlxcLlthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0pPykqJC87XG4vLyBjb25zdCBlbWFpbFJlZ2V4ID1cbi8vICAgL14oPzpbYS16MC05ISMkJSYnKisvPT9eX2B7fH1+LV0rKD86XFwuW2EtejAtOSEjJCUmJyorLz0/Xl9ge3x9fi1dKykqfFwiKD86W1xceDAxLVxceDA4XFx4MGJcXHgwY1xceDBlLVxceDFmXFx4MjFcXHgyMy1cXHg1YlxceDVkLVxceDdmXXxcXFxcW1xceDAxLVxceDA5XFx4MGJcXHgwY1xceDBlLVxceDdmXSkqXCIpQCg/Oig/OlthLXowLTldKD86W2EtejAtOS1dKlthLXowLTldKT9cXC4pK1thLXowLTldKD86W2EtejAtOS1dKlthLXowLTldKT98XFxbKD86KD86MjVbMC01XXwyWzAtNF1bMC05XXxbMDFdP1swLTldWzAtOV0/KVxcLil7M30oPzoyNVswLTVdfDJbMC00XVswLTldfFswMV0/WzAtOV1bMC05XT98W2EtejAtOS1dKlthLXowLTldOig/OltcXHgwMS1cXHgwOFxceDBiXFx4MGNcXHgwZS1cXHgxZlxceDIxLVxceDVhXFx4NTMtXFx4N2ZdfFxcXFxbXFx4MDEtXFx4MDlcXHgwYlxceDBjXFx4MGUtXFx4N2ZdKSspXFxdKSQvaTtcbmNvbnN0IGVtYWlsUmVnZXggPSAvXig/IVxcLikoPyEuKlxcLlxcLikoW0EtWjAtOV8nK1xcLVxcLl0qKVtBLVowLTlfKy1dQChbQS1aMC05XVtBLVowLTlcXC1dKlxcLikrW0EtWl17Mix9JC9pO1xuLy8gY29uc3QgZW1haWxSZWdleCA9XG4vLyAgIC9eW2EtejAtOS4hIyQlJuKAmSorLz0/Xl9ge3x9fi1dK0BbYS16MC05LV0rKD86XFwuW2EtejAtOVxcLV0rKSokL2k7XG4vLyBmcm9tIGh0dHBzOi8vdGhla2V2aW5zY290dC5jb20vZW1vamlzLWluLWphdmFzY3JpcHQvI3dyaXRpbmctYS1yZWd1bGFyLWV4cHJlc3Npb25cbmNvbnN0IF9lbW9qaVJlZ2V4ID0gYF4oXFxcXHB7RXh0ZW5kZWRfUGljdG9ncmFwaGljfXxcXFxccHtFbW9qaV9Db21wb25lbnR9KSskYDtcbmxldCBlbW9qaVJlZ2V4O1xuLy8gZmFzdGVyLCBzaW1wbGVyLCBzYWZlclxuY29uc3QgaXB2NFJlZ2V4ID0gL14oPzooPzoyNVswLTVdfDJbMC00XVswLTldfDFbMC05XVswLTldfFsxLTldWzAtOV18WzAtOV0pXFwuKXszfSg/OjI1WzAtNV18MlswLTRdWzAtOV18MVswLTldWzAtOV18WzEtOV1bMC05XXxbMC05XSkkLztcbmNvbnN0IGlwdjRDaWRyUmVnZXggPSAvXig/Oig/OjI1WzAtNV18MlswLTRdWzAtOV18MVswLTldWzAtOV18WzEtOV1bMC05XXxbMC05XSlcXC4pezN9KD86MjVbMC01XXwyWzAtNF1bMC05XXwxWzAtOV1bMC05XXxbMS05XVswLTldfFswLTldKVxcLygzWzAtMl18WzEyXT9bMC05XSkkLztcbi8vIGNvbnN0IGlwdjZSZWdleCA9XG4vLyAvXigoW2EtZjAtOV17MSw0fTopezd9fDo6KFthLWYwLTldezEsNH06KXswLDZ9fChbYS1mMC05XXsxLDR9Oil7MX06KFthLWYwLTldezEsNH06KXswLDV9fChbYS1mMC05XXsxLDR9Oil7Mn06KFthLWYwLTldezEsNH06KXswLDR9fChbYS1mMC05XXsxLDR9Oil7M306KFthLWYwLTldezEsNH06KXswLDN9fChbYS1mMC05XXsxLDR9Oil7NH06KFthLWYwLTldezEsNH06KXswLDJ9fChbYS1mMC05XXsxLDR9Oil7NX06KFthLWYwLTldezEsNH06KXswLDF9KShbYS1mMC05XXsxLDR9fCgoKDI1WzAtNV0pfCgyWzAtNF1bMC05XSl8KDFbMC05XXsyfSl8KFswLTldezEsMn0pKVxcLil7M30oKDI1WzAtNV0pfCgyWzAtNF1bMC05XSl8KDFbMC05XXsyfSl8KFswLTldezEsMn0pKSkkLztcbmNvbnN0IGlwdjZSZWdleCA9IC9eKChbMC05YS1mQS1GXXsxLDR9Oil7Nyw3fVswLTlhLWZBLUZdezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDd9OnwoWzAtOWEtZkEtRl17MSw0fTopezEsNn06WzAtOWEtZkEtRl17MSw0fXwoWzAtOWEtZkEtRl17MSw0fTopezEsNX0oOlswLTlhLWZBLUZdezEsNH0pezEsMn18KFswLTlhLWZBLUZdezEsNH06KXsxLDR9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDN9fChbMC05YS1mQS1GXXsxLDR9Oil7MSwzfSg6WzAtOWEtZkEtRl17MSw0fSl7MSw0fXwoWzAtOWEtZkEtRl17MSw0fTopezEsMn0oOlswLTlhLWZBLUZdezEsNH0pezEsNX18WzAtOWEtZkEtRl17MSw0fTooKDpbMC05YS1mQS1GXXsxLDR9KXsxLDZ9KXw6KCg6WzAtOWEtZkEtRl17MSw0fSl7MSw3fXw6KXxmZTgwOig6WzAtOWEtZkEtRl17MCw0fSl7MCw0fSVbMC05YS16QS1aXXsxLH18OjooZmZmZig6MHsxLDR9KXswLDF9Oil7MCwxfSgoMjVbMC01XXwoMlswLTRdfDF7MCwxfVswLTldKXswLDF9WzAtOV0pXFwuKXszLDN9KDI1WzAtNV18KDJbMC00XXwxezAsMX1bMC05XSl7MCwxfVswLTldKXwoWzAtOWEtZkEtRl17MSw0fTopezEsNH06KCgyNVswLTVdfCgyWzAtNF18MXswLDF9WzAtOV0pezAsMX1bMC05XSlcXC4pezMsM30oMjVbMC01XXwoMlswLTRdfDF7MCwxfVswLTldKXswLDF9WzAtOV0pKSQvO1xuY29uc3QgaXB2NkNpZHJSZWdleCA9IC9eKChbMC05YS1mQS1GXXsxLDR9Oil7Nyw3fVswLTlhLWZBLUZdezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDd9OnwoWzAtOWEtZkEtRl17MSw0fTopezEsNn06WzAtOWEtZkEtRl17MSw0fXwoWzAtOWEtZkEtRl17MSw0fTopezEsNX0oOlswLTlhLWZBLUZdezEsNH0pezEsMn18KFswLTlhLWZBLUZdezEsNH06KXsxLDR9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDN9fChbMC05YS1mQS1GXXsxLDR9Oil7MSwzfSg6WzAtOWEtZkEtRl17MSw0fSl7MSw0fXwoWzAtOWEtZkEtRl17MSw0fTopezEsMn0oOlswLTlhLWZBLUZdezEsNH0pezEsNX18WzAtOWEtZkEtRl17MSw0fTooKDpbMC05YS1mQS1GXXsxLDR9KXsxLDZ9KXw6KCg6WzAtOWEtZkEtRl17MSw0fSl7MSw3fXw6KXxmZTgwOig6WzAtOWEtZkEtRl17MCw0fSl7MCw0fSVbMC05YS16QS1aXXsxLH18OjooZmZmZig6MHsxLDR9KXswLDF9Oil7MCwxfSgoMjVbMC01XXwoMlswLTRdfDF7MCwxfVswLTldKXswLDF9WzAtOV0pXFwuKXszLDN9KDI1WzAtNV18KDJbMC00XXwxezAsMX1bMC05XSl7MCwxfVswLTldKXwoWzAtOWEtZkEtRl17MSw0fTopezEsNH06KCgyNVswLTVdfCgyWzAtNF18MXswLDF9WzAtOV0pezAsMX1bMC05XSlcXC4pezMsM30oMjVbMC01XXwoMlswLTRdfDF7MCwxfVswLTldKXswLDF9WzAtOV0pKVxcLygxMlswLThdfDFbMDFdWzAtOV18WzEtOV0/WzAtOV0pJC87XG4vLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy83ODYwMzkyL2RldGVybWluZS1pZi1zdHJpbmctaXMtaW4tYmFzZTY0LXVzaW5nLWphdmFzY3JpcHRcbmNvbnN0IGJhc2U2NFJlZ2V4ID0gL14oWzAtOWEtekEtWisvXXs0fSkqKChbMC05YS16QS1aKy9dezJ9PT0pfChbMC05YS16QS1aKy9dezN9PSkpPyQvO1xuLy8gaHR0cHM6Ly9iYXNlNjQuZ3VydS9zdGFuZGFyZHMvYmFzZTY0dXJsXG5jb25zdCBiYXNlNjR1cmxSZWdleCA9IC9eKFswLTlhLXpBLVotX117NH0pKigoWzAtOWEtekEtWi1fXXsyfSg9PSk/KXwoWzAtOWEtekEtWi1fXXszfSg9KT8pKT8kLztcbi8vIHNpbXBsZVxuLy8gY29uc3QgZGF0ZVJlZ2V4U291cmNlID0gYFxcXFxkezR9LVxcXFxkezJ9LVxcXFxkezJ9YDtcbi8vIG5vIGxlYXAgeWVhciB2YWxpZGF0aW9uXG4vLyBjb25zdCBkYXRlUmVnZXhTb3VyY2UgPSBgXFxcXGR7NH0tKCgwWzEzNTc4XXwxMHwxMiktMzF8KDBbMTMtOV18MVswLTJdKS0zMHwoMFsxLTldfDFbMC0yXSktKDBbMS05XXwxXFxcXGR8MlxcXFxkKSlgO1xuLy8gd2l0aCBsZWFwIHllYXIgdmFsaWRhdGlvblxuY29uc3QgZGF0ZVJlZ2V4U291cmNlID0gYCgoXFxcXGRcXFxcZFsyNDY4XVswNDhdfFxcXFxkXFxcXGRbMTM1NzldWzI2XXxcXFxcZFxcXFxkMFs0OF18WzAyNDY4XVswNDhdMDB8WzEzNTc5XVsyNl0wMCktMDItMjl8XFxcXGR7NH0tKCgwWzEzNTc4XXwxWzAyXSktKDBbMS05XXxbMTJdXFxcXGR8M1swMV0pfCgwWzQ2OV18MTEpLSgwWzEtOV18WzEyXVxcXFxkfDMwKXwoMDIpLSgwWzEtOV18MVxcXFxkfDJbMC04XSkpKWA7XG5jb25zdCBkYXRlUmVnZXggPSBuZXcgUmVnRXhwKGBeJHtkYXRlUmVnZXhTb3VyY2V9JGApO1xuZnVuY3Rpb24gdGltZVJlZ2V4U291cmNlKGFyZ3MpIHtcbiAgICBsZXQgc2Vjb25kc1JlZ2V4U291cmNlID0gYFswLTVdXFxcXGRgO1xuICAgIGlmIChhcmdzLnByZWNpc2lvbikge1xuICAgICAgICBzZWNvbmRzUmVnZXhTb3VyY2UgPSBgJHtzZWNvbmRzUmVnZXhTb3VyY2V9XFxcXC5cXFxcZHske2FyZ3MucHJlY2lzaW9ufX1gO1xuICAgIH1cbiAgICBlbHNlIGlmIChhcmdzLnByZWNpc2lvbiA9PSBudWxsKSB7XG4gICAgICAgIHNlY29uZHNSZWdleFNvdXJjZSA9IGAke3NlY29uZHNSZWdleFNvdXJjZX0oXFxcXC5cXFxcZCspP2A7XG4gICAgfVxuICAgIGNvbnN0IHNlY29uZHNRdWFudGlmaWVyID0gYXJncy5wcmVjaXNpb24gPyBcIitcIiA6IFwiP1wiOyAvLyByZXF1aXJlIHNlY29uZHMgaWYgcHJlY2lzaW9uIGlzIG5vbnplcm9cbiAgICByZXR1cm4gYChbMDFdXFxcXGR8MlswLTNdKTpbMC01XVxcXFxkKDoke3NlY29uZHNSZWdleFNvdXJjZX0pJHtzZWNvbmRzUXVhbnRpZmllcn1gO1xufVxuZnVuY3Rpb24gdGltZVJlZ2V4KGFyZ3MpIHtcbiAgICByZXR1cm4gbmV3IFJlZ0V4cChgXiR7dGltZVJlZ2V4U291cmNlKGFyZ3MpfSRgKTtcbn1cbi8vIEFkYXB0ZWQgZnJvbSBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMzE0MzIzMVxuZXhwb3J0IGZ1bmN0aW9uIGRhdGV0aW1lUmVnZXgoYXJncykge1xuICAgIGxldCByZWdleCA9IGAke2RhdGVSZWdleFNvdXJjZX1UJHt0aW1lUmVnZXhTb3VyY2UoYXJncyl9YDtcbiAgICBjb25zdCBvcHRzID0gW107XG4gICAgb3B0cy5wdXNoKGFyZ3MubG9jYWwgPyBgWj9gIDogYFpgKTtcbiAgICBpZiAoYXJncy5vZmZzZXQpXG4gICAgICAgIG9wdHMucHVzaChgKFsrLV1cXFxcZHsyfTo/XFxcXGR7Mn0pYCk7XG4gICAgcmVnZXggPSBgJHtyZWdleH0oJHtvcHRzLmpvaW4oXCJ8XCIpfSlgO1xuICAgIHJldHVybiBuZXcgUmVnRXhwKGBeJHtyZWdleH0kYCk7XG59XG5mdW5jdGlvbiBpc1ZhbGlkSVAoaXAsIHZlcnNpb24pIHtcbiAgICBpZiAoKHZlcnNpb24gPT09IFwidjRcIiB8fCAhdmVyc2lvbikgJiYgaXB2NFJlZ2V4LnRlc3QoaXApKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoKHZlcnNpb24gPT09IFwidjZcIiB8fCAhdmVyc2lvbikgJiYgaXB2NlJlZ2V4LnRlc3QoaXApKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBpc1ZhbGlkSldUKGp3dCwgYWxnKSB7XG4gICAgaWYgKCFqd3RSZWdleC50ZXN0KGp3dCkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBbaGVhZGVyXSA9IGp3dC5zcGxpdChcIi5cIik7XG4gICAgICAgIC8vIENvbnZlcnQgYmFzZTY0dXJsIHRvIGJhc2U2NFxuICAgICAgICBjb25zdCBiYXNlNjQgPSBoZWFkZXJcbiAgICAgICAgICAgIC5yZXBsYWNlKC8tL2csIFwiK1wiKVxuICAgICAgICAgICAgLnJlcGxhY2UoL18vZywgXCIvXCIpXG4gICAgICAgICAgICAucGFkRW5kKGhlYWRlci5sZW5ndGggKyAoKDQgLSAoaGVhZGVyLmxlbmd0aCAlIDQpKSAlIDQpLCBcIj1cIik7XG4gICAgICAgIGNvbnN0IGRlY29kZWQgPSBKU09OLnBhcnNlKGF0b2IoYmFzZTY0KSk7XG4gICAgICAgIGlmICh0eXBlb2YgZGVjb2RlZCAhPT0gXCJvYmplY3RcIiB8fCBkZWNvZGVkID09PSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoXCJ0eXBcIiBpbiBkZWNvZGVkICYmIGRlY29kZWQ/LnR5cCAhPT0gXCJKV1RcIilcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKCFkZWNvZGVkLmFsZylcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKGFsZyAmJiBkZWNvZGVkLmFsZyAhPT0gYWxnKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY2F0Y2gge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuZnVuY3Rpb24gaXNWYWxpZENpZHIoaXAsIHZlcnNpb24pIHtcbiAgICBpZiAoKHZlcnNpb24gPT09IFwidjRcIiB8fCAhdmVyc2lvbikgJiYgaXB2NENpZHJSZWdleC50ZXN0KGlwKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKCh2ZXJzaW9uID09PSBcInY2XCIgfHwgIXZlcnNpb24pICYmIGlwdjZDaWRyUmVnZXgudGVzdChpcCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmV4cG9ydCBjbGFzcyBab2RTdHJpbmcgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgaWYgKHRoaXMuX2RlZi5jb2VyY2UpIHtcbiAgICAgICAgICAgIGlucHV0LmRhdGEgPSBTdHJpbmcoaW5wdXQuZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFyc2VkVHlwZSA9IHRoaXMuX2dldFR5cGUoaW5wdXQpO1xuICAgICAgICBpZiAocGFyc2VkVHlwZSAhPT0gWm9kUGFyc2VkVHlwZS5zdHJpbmcpIHtcbiAgICAgICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0KTtcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IFpvZFBhcnNlZFR5cGUuc3RyaW5nLFxuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3RhdHVzID0gbmV3IFBhcnNlU3RhdHVzKCk7XG4gICAgICAgIGxldCBjdHggPSB1bmRlZmluZWQ7XG4gICAgICAgIGZvciAoY29uc3QgY2hlY2sgb2YgdGhpcy5fZGVmLmNoZWNrcykge1xuICAgICAgICAgICAgaWYgKGNoZWNrLmtpbmQgPT09IFwibWluXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoaW5wdXQuZGF0YS5sZW5ndGggPCBjaGVjay52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUudG9vX3NtYWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWluaW11bTogY2hlY2sudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXhhY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwibWF4XCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoaW5wdXQuZGF0YS5sZW5ndGggPiBjaGVjay52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUudG9vX2JpZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heGltdW06IGNoZWNrLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4YWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcImxlbmd0aFwiKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdG9vQmlnID0gaW5wdXQuZGF0YS5sZW5ndGggPiBjaGVjay52YWx1ZTtcbiAgICAgICAgICAgICAgICBjb25zdCB0b29TbWFsbCA9IGlucHV0LmRhdGEubGVuZ3RoIDwgY2hlY2sudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKHRvb0JpZyB8fCB0b29TbWFsbCkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRvb0JpZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLnRvb19iaWcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4aW11bTogY2hlY2sudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhhY3Q6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRvb1NtYWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUudG9vX3NtYWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbmltdW06IGNoZWNrLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4YWN0OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcImVtYWlsXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWVtYWlsUmVnZXgudGVzdChpbnB1dC5kYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uOiBcImVtYWlsXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJlbW9qaVwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFlbW9qaVJlZ2V4KSB7XG4gICAgICAgICAgICAgICAgICAgIGVtb2ppUmVnZXggPSBuZXcgUmVnRXhwKF9lbW9qaVJlZ2V4LCBcInVcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghZW1vamlSZWdleC50ZXN0KGlucHV0LmRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IFwiZW1vamlcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcInV1aWRcIikge1xuICAgICAgICAgICAgICAgIGlmICghdXVpZFJlZ2V4LnRlc3QoaW5wdXQuZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjogXCJ1dWlkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJuYW5vaWRcIikge1xuICAgICAgICAgICAgICAgIGlmICghbmFub2lkUmVnZXgudGVzdChpbnB1dC5kYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uOiBcIm5hbm9pZFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwiY3VpZFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjdWlkUmVnZXgudGVzdChpbnB1dC5kYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uOiBcImN1aWRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcImN1aWQyXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWN1aWQyUmVnZXgudGVzdChpbnB1dC5kYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uOiBcImN1aWQyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJ1bGlkXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXVsaWRSZWdleC50ZXN0KGlucHV0LmRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IFwidWxpZFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwidXJsXCIpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBuZXcgVVJMKGlucHV0LmRhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IFwidXJsXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJyZWdleFwiKSB7XG4gICAgICAgICAgICAgICAgY2hlY2sucmVnZXgubGFzdEluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXN0UmVzdWx0ID0gY2hlY2sucmVnZXgudGVzdChpbnB1dC5kYXRhKTtcbiAgICAgICAgICAgICAgICBpZiAoIXRlc3RSZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjogXCJyZWdleFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwidHJpbVwiKSB7XG4gICAgICAgICAgICAgICAgaW5wdXQuZGF0YSA9IGlucHV0LmRhdGEudHJpbSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJpbmNsdWRlc1wiKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpbnB1dC5kYXRhLmluY2x1ZGVzKGNoZWNrLnZhbHVlLCBjaGVjay5wb3NpdGlvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjogeyBpbmNsdWRlczogY2hlY2sudmFsdWUsIHBvc2l0aW9uOiBjaGVjay5wb3NpdGlvbiB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwidG9Mb3dlckNhc2VcIikge1xuICAgICAgICAgICAgICAgIGlucHV0LmRhdGEgPSBpbnB1dC5kYXRhLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcInRvVXBwZXJDYXNlXCIpIHtcbiAgICAgICAgICAgICAgICBpbnB1dC5kYXRhID0gaW5wdXQuZGF0YS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJzdGFydHNXaXRoXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWlucHV0LmRhdGEuc3RhcnRzV2l0aChjaGVjay52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjogeyBzdGFydHNXaXRoOiBjaGVjay52YWx1ZSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwiZW5kc1dpdGhcIikge1xuICAgICAgICAgICAgICAgIGlmICghaW5wdXQuZGF0YS5lbmRzV2l0aChjaGVjay52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjogeyBlbmRzV2l0aDogY2hlY2sudmFsdWUgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcImRhdGV0aW1lXCIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWdleCA9IGRhdGV0aW1lUmVnZXgoY2hlY2spO1xuICAgICAgICAgICAgICAgIGlmICghcmVnZXgudGVzdChpbnB1dC5kYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uOiBcImRhdGV0aW1lXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJkYXRlXCIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWdleCA9IGRhdGVSZWdleDtcbiAgICAgICAgICAgICAgICBpZiAoIXJlZ2V4LnRlc3QoaW5wdXQuZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJ0aW1lXCIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWdleCA9IHRpbWVSZWdleChjaGVjayk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZWdleC50ZXN0KGlucHV0LmRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IFwidGltZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwiZHVyYXRpb25cIikge1xuICAgICAgICAgICAgICAgIGlmICghZHVyYXRpb25SZWdleC50ZXN0KGlucHV0LmRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IFwiZHVyYXRpb25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcImlwXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWlzVmFsaWRJUChpbnB1dC5kYXRhLCBjaGVjay52ZXJzaW9uKSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uOiBcImlwXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJqd3RcIikge1xuICAgICAgICAgICAgICAgIGlmICghaXNWYWxpZEpXVChpbnB1dC5kYXRhLCBjaGVjay5hbGcpKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IFwiand0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJjaWRyXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWlzVmFsaWRDaWRyKGlucHV0LmRhdGEsIGNoZWNrLnZlcnNpb24pKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IFwiY2lkclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwiYmFzZTY0XCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWJhc2U2NFJlZ2V4LnRlc3QoaW5wdXQuZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjogXCJiYXNlNjRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcImJhc2U2NHVybFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFiYXNlNjR1cmxSZWdleC50ZXN0KGlucHV0LmRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IFwiYmFzZTY0dXJsXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdXRpbC5hc3NlcnROZXZlcihjaGVjayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiBzdGF0dXMudmFsdWUsIHZhbHVlOiBpbnB1dC5kYXRhIH07XG4gICAgfVxuICAgIF9yZWdleChyZWdleCwgdmFsaWRhdGlvbiwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWZpbmVtZW50KChkYXRhKSA9PiByZWdleC50ZXN0KGRhdGEpLCB7XG4gICAgICAgICAgICB2YWxpZGF0aW9uLFxuICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgICAgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgX2FkZENoZWNrKGNoZWNrKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kU3RyaW5nKHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIGNoZWNrczogWy4uLnRoaXMuX2RlZi5jaGVja3MsIGNoZWNrXSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVtYWlsKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsga2luZDogXCJlbWFpbFwiLCAuLi5lcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSkgfSk7XG4gICAgfVxuICAgIHVybChtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7IGtpbmQ6IFwidXJsXCIsIC4uLmVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKSB9KTtcbiAgICB9XG4gICAgZW1vamkobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soeyBraW5kOiBcImVtb2ppXCIsIC4uLmVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKSB9KTtcbiAgICB9XG4gICAgdXVpZChtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7IGtpbmQ6IFwidXVpZFwiLCAuLi5lcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSkgfSk7XG4gICAgfVxuICAgIG5hbm9pZChtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7IGtpbmQ6IFwibmFub2lkXCIsIC4uLmVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKSB9KTtcbiAgICB9XG4gICAgY3VpZChtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7IGtpbmQ6IFwiY3VpZFwiLCAuLi5lcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSkgfSk7XG4gICAgfVxuICAgIGN1aWQyKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsga2luZDogXCJjdWlkMlwiLCAuLi5lcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSkgfSk7XG4gICAgfVxuICAgIHVsaWQobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soeyBraW5kOiBcInVsaWRcIiwgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpIH0pO1xuICAgIH1cbiAgICBiYXNlNjQobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soeyBraW5kOiBcImJhc2U2NFwiLCAuLi5lcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSkgfSk7XG4gICAgfVxuICAgIGJhc2U2NHVybChtZXNzYWdlKSB7XG4gICAgICAgIC8vIGJhc2U2NHVybCBlbmNvZGluZyBpcyBhIG1vZGlmaWNhdGlvbiBvZiBiYXNlNjQgdGhhdCBjYW4gc2FmZWx5IGJlIHVzZWQgaW4gVVJMcyBhbmQgZmlsZW5hbWVzXG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcImJhc2U2NHVybFwiLFxuICAgICAgICAgICAgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgand0KG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsga2luZDogXCJqd3RcIiwgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG9wdGlvbnMpIH0pO1xuICAgIH1cbiAgICBpcChvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7IGtpbmQ6IFwiaXBcIiwgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG9wdGlvbnMpIH0pO1xuICAgIH1cbiAgICBjaWRyKG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsga2luZDogXCJjaWRyXCIsIC4uLmVycm9yVXRpbC5lcnJUb09iaihvcHRpb25zKSB9KTtcbiAgICB9XG4gICAgZGF0ZXRpbWUob3B0aW9ucykge1xuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICAgICAga2luZDogXCJkYXRldGltZVwiLFxuICAgICAgICAgICAgICAgIHByZWNpc2lvbjogbnVsbCxcbiAgICAgICAgICAgICAgICBvZmZzZXQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGxvY2FsOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBvcHRpb25zLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwiZGF0ZXRpbWVcIixcbiAgICAgICAgICAgIHByZWNpc2lvbjogdHlwZW9mIG9wdGlvbnM/LnByZWNpc2lvbiA9PT0gXCJ1bmRlZmluZWRcIiA/IG51bGwgOiBvcHRpb25zPy5wcmVjaXNpb24sXG4gICAgICAgICAgICBvZmZzZXQ6IG9wdGlvbnM/Lm9mZnNldCA/PyBmYWxzZSxcbiAgICAgICAgICAgIGxvY2FsOiBvcHRpb25zPy5sb2NhbCA/PyBmYWxzZSxcbiAgICAgICAgICAgIC4uLmVycm9yVXRpbC5lcnJUb09iaihvcHRpb25zPy5tZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGRhdGUobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soeyBraW5kOiBcImRhdGVcIiwgbWVzc2FnZSB9KTtcbiAgICB9XG4gICAgdGltZShvcHRpb25zKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgICAgICBraW5kOiBcInRpbWVcIixcbiAgICAgICAgICAgICAgICBwcmVjaXNpb246IG51bGwsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogb3B0aW9ucyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcInRpbWVcIixcbiAgICAgICAgICAgIHByZWNpc2lvbjogdHlwZW9mIG9wdGlvbnM/LnByZWNpc2lvbiA9PT0gXCJ1bmRlZmluZWRcIiA/IG51bGwgOiBvcHRpb25zPy5wcmVjaXNpb24sXG4gICAgICAgICAgICAuLi5lcnJvclV0aWwuZXJyVG9PYmoob3B0aW9ucz8ubWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBkdXJhdGlvbihtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7IGtpbmQ6IFwiZHVyYXRpb25cIiwgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpIH0pO1xuICAgIH1cbiAgICByZWdleChyZWdleCwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJyZWdleFwiLFxuICAgICAgICAgICAgcmVnZXg6IHJlZ2V4LFxuICAgICAgICAgICAgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgaW5jbHVkZXModmFsdWUsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwiaW5jbHVkZXNcIixcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgIHBvc2l0aW9uOiBvcHRpb25zPy5wb3NpdGlvbixcbiAgICAgICAgICAgIC4uLmVycm9yVXRpbC5lcnJUb09iaihvcHRpb25zPy5tZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXJ0c1dpdGgodmFsdWUsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwic3RhcnRzV2l0aFwiLFxuICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZW5kc1dpdGgodmFsdWUsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwiZW5kc1dpdGhcIixcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgIC4uLmVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG1pbihtaW5MZW5ndGgsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwibWluXCIsXG4gICAgICAgICAgICB2YWx1ZTogbWluTGVuZ3RoLFxuICAgICAgICAgICAgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbWF4KG1heExlbmd0aCwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJtYXhcIixcbiAgICAgICAgICAgIHZhbHVlOiBtYXhMZW5ndGgsXG4gICAgICAgICAgICAuLi5lcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBsZW5ndGgobGVuLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcImxlbmd0aFwiLFxuICAgICAgICAgICAgdmFsdWU6IGxlbixcbiAgICAgICAgICAgIC4uLmVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEVxdWl2YWxlbnQgdG8gYC5taW4oMSlgXG4gICAgICovXG4gICAgbm9uZW1wdHkobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5taW4oMSwgZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpKTtcbiAgICB9XG4gICAgdHJpbSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RTdHJpbmcoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgY2hlY2tzOiBbLi4udGhpcy5fZGVmLmNoZWNrcywgeyBraW5kOiBcInRyaW1cIiB9XSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRvTG93ZXJDYXNlKCkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZFN0cmluZyh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBjaGVja3M6IFsuLi50aGlzLl9kZWYuY2hlY2tzLCB7IGtpbmQ6IFwidG9Mb3dlckNhc2VcIiB9XSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRvVXBwZXJDYXNlKCkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZFN0cmluZyh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBjaGVja3M6IFsuLi50aGlzLl9kZWYuY2hlY2tzLCB7IGtpbmQ6IFwidG9VcHBlckNhc2VcIiB9XSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGdldCBpc0RhdGV0aW1lKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoKGNoKSA9PiBjaC5raW5kID09PSBcImRhdGV0aW1lXCIpO1xuICAgIH1cbiAgICBnZXQgaXNEYXRlKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoKGNoKSA9PiBjaC5raW5kID09PSBcImRhdGVcIik7XG4gICAgfVxuICAgIGdldCBpc1RpbWUoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2RlZi5jaGVja3MuZmluZCgoY2gpID0+IGNoLmtpbmQgPT09IFwidGltZVwiKTtcbiAgICB9XG4gICAgZ2V0IGlzRHVyYXRpb24oKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2RlZi5jaGVja3MuZmluZCgoY2gpID0+IGNoLmtpbmQgPT09IFwiZHVyYXRpb25cIik7XG4gICAgfVxuICAgIGdldCBpc0VtYWlsKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoKGNoKSA9PiBjaC5raW5kID09PSBcImVtYWlsXCIpO1xuICAgIH1cbiAgICBnZXQgaXNVUkwoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2RlZi5jaGVja3MuZmluZCgoY2gpID0+IGNoLmtpbmQgPT09IFwidXJsXCIpO1xuICAgIH1cbiAgICBnZXQgaXNFbW9qaSgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKChjaCkgPT4gY2gua2luZCA9PT0gXCJlbW9qaVwiKTtcbiAgICB9XG4gICAgZ2V0IGlzVVVJRCgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKChjaCkgPT4gY2gua2luZCA9PT0gXCJ1dWlkXCIpO1xuICAgIH1cbiAgICBnZXQgaXNOQU5PSUQoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2RlZi5jaGVja3MuZmluZCgoY2gpID0+IGNoLmtpbmQgPT09IFwibmFub2lkXCIpO1xuICAgIH1cbiAgICBnZXQgaXNDVUlEKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoKGNoKSA9PiBjaC5raW5kID09PSBcImN1aWRcIik7XG4gICAgfVxuICAgIGdldCBpc0NVSUQyKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoKGNoKSA9PiBjaC5raW5kID09PSBcImN1aWQyXCIpO1xuICAgIH1cbiAgICBnZXQgaXNVTElEKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoKGNoKSA9PiBjaC5raW5kID09PSBcInVsaWRcIik7XG4gICAgfVxuICAgIGdldCBpc0lQKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoKGNoKSA9PiBjaC5raW5kID09PSBcImlwXCIpO1xuICAgIH1cbiAgICBnZXQgaXNDSURSKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoKGNoKSA9PiBjaC5raW5kID09PSBcImNpZHJcIik7XG4gICAgfVxuICAgIGdldCBpc0Jhc2U2NCgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKChjaCkgPT4gY2gua2luZCA9PT0gXCJiYXNlNjRcIik7XG4gICAgfVxuICAgIGdldCBpc0Jhc2U2NHVybCgpIHtcbiAgICAgICAgLy8gYmFzZTY0dXJsIGVuY29kaW5nIGlzIGEgbW9kaWZpY2F0aW9uIG9mIGJhc2U2NCB0aGF0IGNhbiBzYWZlbHkgYmUgdXNlZCBpbiBVUkxzIGFuZCBmaWxlbmFtZXNcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKChjaCkgPT4gY2gua2luZCA9PT0gXCJiYXNlNjR1cmxcIik7XG4gICAgfVxuICAgIGdldCBtaW5MZW5ndGgoKSB7XG4gICAgICAgIGxldCBtaW4gPSBudWxsO1xuICAgICAgICBmb3IgKGNvbnN0IGNoIG9mIHRoaXMuX2RlZi5jaGVja3MpIHtcbiAgICAgICAgICAgIGlmIChjaC5raW5kID09PSBcIm1pblwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1pbiA9PT0gbnVsbCB8fCBjaC52YWx1ZSA+IG1pbilcbiAgICAgICAgICAgICAgICAgICAgbWluID0gY2gudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1pbjtcbiAgICB9XG4gICAgZ2V0IG1heExlbmd0aCgpIHtcbiAgICAgICAgbGV0IG1heCA9IG51bGw7XG4gICAgICAgIGZvciAoY29uc3QgY2ggb2YgdGhpcy5fZGVmLmNoZWNrcykge1xuICAgICAgICAgICAgaWYgKGNoLmtpbmQgPT09IFwibWF4XCIpIHtcbiAgICAgICAgICAgICAgICBpZiAobWF4ID09PSBudWxsIHx8IGNoLnZhbHVlIDwgbWF4KVxuICAgICAgICAgICAgICAgICAgICBtYXggPSBjaC52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWF4O1xuICAgIH1cbn1cblpvZFN0cmluZy5jcmVhdGUgPSAocGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2RTdHJpbmcoe1xuICAgICAgICBjaGVja3M6IFtdLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZFN0cmluZyxcbiAgICAgICAgY29lcmNlOiBwYXJhbXM/LmNvZXJjZSA/PyBmYWxzZSxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbi8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzM5NjY0ODQvd2h5LWRvZXMtbW9kdWx1cy1vcGVyYXRvci1yZXR1cm4tZnJhY3Rpb25hbC1udW1iZXItaW4tamF2YXNjcmlwdC8zMTcxMTAzNCMzMTcxMTAzNFxuZnVuY3Rpb24gZmxvYXRTYWZlUmVtYWluZGVyKHZhbCwgc3RlcCkge1xuICAgIGNvbnN0IHZhbERlY0NvdW50ID0gKHZhbC50b1N0cmluZygpLnNwbGl0KFwiLlwiKVsxXSB8fCBcIlwiKS5sZW5ndGg7XG4gICAgY29uc3Qgc3RlcERlY0NvdW50ID0gKHN0ZXAudG9TdHJpbmcoKS5zcGxpdChcIi5cIilbMV0gfHwgXCJcIikubGVuZ3RoO1xuICAgIGNvbnN0IGRlY0NvdW50ID0gdmFsRGVjQ291bnQgPiBzdGVwRGVjQ291bnQgPyB2YWxEZWNDb3VudCA6IHN0ZXBEZWNDb3VudDtcbiAgICBjb25zdCB2YWxJbnQgPSBOdW1iZXIucGFyc2VJbnQodmFsLnRvRml4ZWQoZGVjQ291bnQpLnJlcGxhY2UoXCIuXCIsIFwiXCIpKTtcbiAgICBjb25zdCBzdGVwSW50ID0gTnVtYmVyLnBhcnNlSW50KHN0ZXAudG9GaXhlZChkZWNDb3VudCkucmVwbGFjZShcIi5cIiwgXCJcIikpO1xuICAgIHJldHVybiAodmFsSW50ICUgc3RlcEludCkgLyAxMCAqKiBkZWNDb3VudDtcbn1cbmV4cG9ydCBjbGFzcyBab2ROdW1iZXIgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5taW4gPSB0aGlzLmd0ZTtcbiAgICAgICAgdGhpcy5tYXggPSB0aGlzLmx0ZTtcbiAgICAgICAgdGhpcy5zdGVwID0gdGhpcy5tdWx0aXBsZU9mO1xuICAgIH1cbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgaWYgKHRoaXMuX2RlZi5jb2VyY2UpIHtcbiAgICAgICAgICAgIGlucHV0LmRhdGEgPSBOdW1iZXIoaW5wdXQuZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFyc2VkVHlwZSA9IHRoaXMuX2dldFR5cGUoaW5wdXQpO1xuICAgICAgICBpZiAocGFyc2VkVHlwZSAhPT0gWm9kUGFyc2VkVHlwZS5udW1iZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0KTtcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IFpvZFBhcnNlZFR5cGUubnVtYmVyLFxuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGN0eCA9IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gbmV3IFBhcnNlU3RhdHVzKCk7XG4gICAgICAgIGZvciAoY29uc3QgY2hlY2sgb2YgdGhpcy5fZGVmLmNoZWNrcykge1xuICAgICAgICAgICAgaWYgKGNoZWNrLmtpbmQgPT09IFwiaW50XCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXV0aWwuaXNJbnRlZ2VyKGlucHV0LmRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZDogXCJpbnRlZ2VyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlZDogXCJmbG9hdFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwibWluXCIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0b29TbWFsbCA9IGNoZWNrLmluY2x1c2l2ZSA/IGlucHV0LmRhdGEgPCBjaGVjay52YWx1ZSA6IGlucHV0LmRhdGEgPD0gY2hlY2sudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKHRvb1NtYWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS50b29fc21hbGwsXG4gICAgICAgICAgICAgICAgICAgICAgICBtaW5pbXVtOiBjaGVjay52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IGNoZWNrLmluY2x1c2l2ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4YWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcIm1heFwiKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdG9vQmlnID0gY2hlY2suaW5jbHVzaXZlID8gaW5wdXQuZGF0YSA+IGNoZWNrLnZhbHVlIDogaW5wdXQuZGF0YSA+PSBjaGVjay52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAodG9vQmlnKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS50b29fYmlnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWF4aW11bTogY2hlY2sudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlOiBjaGVjay5pbmNsdXNpdmUsXG4gICAgICAgICAgICAgICAgICAgICAgICBleGFjdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJtdWx0aXBsZU9mXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoZmxvYXRTYWZlUmVtYWluZGVyKGlucHV0LmRhdGEsIGNoZWNrLnZhbHVlKSAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUubm90X211bHRpcGxlX29mLFxuICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGVPZjogY2hlY2sudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJmaW5pdGVcIikge1xuICAgICAgICAgICAgICAgIGlmICghTnVtYmVyLmlzRmluaXRlKGlucHV0LmRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5ub3RfZmluaXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHV0aWwuYXNzZXJ0TmV2ZXIoY2hlY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHN0YXR1czogc3RhdHVzLnZhbHVlLCB2YWx1ZTogaW5wdXQuZGF0YSB9O1xuICAgIH1cbiAgICBndGUodmFsdWUsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0TGltaXQoXCJtaW5cIiwgdmFsdWUsIHRydWUsIGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSk7XG4gICAgfVxuICAgIGd0KHZhbHVlLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldExpbWl0KFwibWluXCIsIHZhbHVlLCBmYWxzZSwgZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpKTtcbiAgICB9XG4gICAgbHRlKHZhbHVlLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldExpbWl0KFwibWF4XCIsIHZhbHVlLCB0cnVlLCBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkpO1xuICAgIH1cbiAgICBsdCh2YWx1ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXRMaW1pdChcIm1heFwiLCB2YWx1ZSwgZmFsc2UsIGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSk7XG4gICAgfVxuICAgIHNldExpbWl0KGtpbmQsIHZhbHVlLCBpbmNsdXNpdmUsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2ROdW1iZXIoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgY2hlY2tzOiBbXG4gICAgICAgICAgICAgICAgLi4udGhpcy5fZGVmLmNoZWNrcyxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGtpbmQsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmUsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIF9hZGRDaGVjayhjaGVjaykge1xuICAgICAgICByZXR1cm4gbmV3IFpvZE51bWJlcih7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBjaGVja3M6IFsuLi50aGlzLl9kZWYuY2hlY2tzLCBjaGVja10sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpbnQobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJpbnRcIixcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHBvc2l0aXZlKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwibWluXCIsXG4gICAgICAgICAgICB2YWx1ZTogMCxcbiAgICAgICAgICAgIGluY2x1c2l2ZTogZmFsc2UsXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBuZWdhdGl2ZShtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcIm1heFwiLFxuICAgICAgICAgICAgdmFsdWU6IDAsXG4gICAgICAgICAgICBpbmNsdXNpdmU6IGZhbHNlLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbm9ucG9zaXRpdmUobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJtYXhcIixcbiAgICAgICAgICAgIHZhbHVlOiAwLFxuICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbm9ubmVnYXRpdmUobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJtaW5cIixcbiAgICAgICAgICAgIHZhbHVlOiAwLFxuICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbXVsdGlwbGVPZih2YWx1ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJtdWx0aXBsZU9mXCIsXG4gICAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBmaW5pdGUobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJmaW5pdGVcIixcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHNhZmUobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJtaW5cIixcbiAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBOdW1iZXIuTUlOX1NBRkVfSU5URUdFUixcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSxcbiAgICAgICAgfSkuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwibWF4XCIsXG4gICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIsXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBnZXQgbWluVmFsdWUoKSB7XG4gICAgICAgIGxldCBtaW4gPSBudWxsO1xuICAgICAgICBmb3IgKGNvbnN0IGNoIG9mIHRoaXMuX2RlZi5jaGVja3MpIHtcbiAgICAgICAgICAgIGlmIChjaC5raW5kID09PSBcIm1pblwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1pbiA9PT0gbnVsbCB8fCBjaC52YWx1ZSA+IG1pbilcbiAgICAgICAgICAgICAgICAgICAgbWluID0gY2gudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1pbjtcbiAgICB9XG4gICAgZ2V0IG1heFZhbHVlKCkge1xuICAgICAgICBsZXQgbWF4ID0gbnVsbDtcbiAgICAgICAgZm9yIChjb25zdCBjaCBvZiB0aGlzLl9kZWYuY2hlY2tzKSB7XG4gICAgICAgICAgICBpZiAoY2gua2luZCA9PT0gXCJtYXhcIikge1xuICAgICAgICAgICAgICAgIGlmIChtYXggPT09IG51bGwgfHwgY2gudmFsdWUgPCBtYXgpXG4gICAgICAgICAgICAgICAgICAgIG1heCA9IGNoLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYXg7XG4gICAgfVxuICAgIGdldCBpc0ludCgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKChjaCkgPT4gY2gua2luZCA9PT0gXCJpbnRcIiB8fCAoY2gua2luZCA9PT0gXCJtdWx0aXBsZU9mXCIgJiYgdXRpbC5pc0ludGVnZXIoY2gudmFsdWUpKSk7XG4gICAgfVxuICAgIGdldCBpc0Zpbml0ZSgpIHtcbiAgICAgICAgbGV0IG1heCA9IG51bGw7XG4gICAgICAgIGxldCBtaW4gPSBudWxsO1xuICAgICAgICBmb3IgKGNvbnN0IGNoIG9mIHRoaXMuX2RlZi5jaGVja3MpIHtcbiAgICAgICAgICAgIGlmIChjaC5raW5kID09PSBcImZpbml0ZVwiIHx8IGNoLmtpbmQgPT09IFwiaW50XCIgfHwgY2gua2luZCA9PT0gXCJtdWx0aXBsZU9mXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoLmtpbmQgPT09IFwibWluXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAobWluID09PSBudWxsIHx8IGNoLnZhbHVlID4gbWluKVxuICAgICAgICAgICAgICAgICAgICBtaW4gPSBjaC52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoLmtpbmQgPT09IFwibWF4XCIpIHtcbiAgICAgICAgICAgICAgICBpZiAobWF4ID09PSBudWxsIHx8IGNoLnZhbHVlIDwgbWF4KVxuICAgICAgICAgICAgICAgICAgICBtYXggPSBjaC52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKG1pbikgJiYgTnVtYmVyLmlzRmluaXRlKG1heCk7XG4gICAgfVxufVxuWm9kTnVtYmVyLmNyZWF0ZSA9IChwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZE51bWJlcih7XG4gICAgICAgIGNoZWNrczogW10sXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kTnVtYmVyLFxuICAgICAgICBjb2VyY2U6IHBhcmFtcz8uY29lcmNlIHx8IGZhbHNlLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuZXhwb3J0IGNsYXNzIFpvZEJpZ0ludCBleHRlbmRzIFpvZFR5cGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLm1pbiA9IHRoaXMuZ3RlO1xuICAgICAgICB0aGlzLm1heCA9IHRoaXMubHRlO1xuICAgIH1cbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgaWYgKHRoaXMuX2RlZi5jb2VyY2UpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaW5wdXQuZGF0YSA9IEJpZ0ludChpbnB1dC5kYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0SW52YWxpZElucHV0KGlucHV0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXJzZWRUeXBlID0gdGhpcy5fZ2V0VHlwZShpbnB1dCk7XG4gICAgICAgIGlmIChwYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLmJpZ2ludCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldEludmFsaWRJbnB1dChpbnB1dCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGN0eCA9IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gbmV3IFBhcnNlU3RhdHVzKCk7XG4gICAgICAgIGZvciAoY29uc3QgY2hlY2sgb2YgdGhpcy5fZGVmLmNoZWNrcykge1xuICAgICAgICAgICAgaWYgKGNoZWNrLmtpbmQgPT09IFwibWluXCIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0b29TbWFsbCA9IGNoZWNrLmluY2x1c2l2ZSA/IGlucHV0LmRhdGEgPCBjaGVjay52YWx1ZSA6IGlucHV0LmRhdGEgPD0gY2hlY2sudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKHRvb1NtYWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS50b29fc21hbGwsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImJpZ2ludFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWluaW11bTogY2hlY2sudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IGNoZWNrLmluY2x1c2l2ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcIm1heFwiKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdG9vQmlnID0gY2hlY2suaW5jbHVzaXZlID8gaW5wdXQuZGF0YSA+IGNoZWNrLnZhbHVlIDogaW5wdXQuZGF0YSA+PSBjaGVjay52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAodG9vQmlnKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS50b29fYmlnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJiaWdpbnRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heGltdW06IGNoZWNrLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlOiBjaGVjay5pbmNsdXNpdmUsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJtdWx0aXBsZU9mXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoaW5wdXQuZGF0YSAlIGNoZWNrLnZhbHVlICE9PSBCaWdJbnQoMCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLm5vdF9tdWx0aXBsZV9vZixcbiAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpcGxlT2Y6IGNoZWNrLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHV0aWwuYXNzZXJ0TmV2ZXIoY2hlY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHN0YXR1czogc3RhdHVzLnZhbHVlLCB2YWx1ZTogaW5wdXQuZGF0YSB9O1xuICAgIH1cbiAgICBfZ2V0SW52YWxpZElucHV0KGlucHV0KSB7XG4gICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0KTtcbiAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgZXhwZWN0ZWQ6IFpvZFBhcnNlZFR5cGUuYmlnaW50LFxuICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgfVxuICAgIGd0ZSh2YWx1ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXRMaW1pdChcIm1pblwiLCB2YWx1ZSwgdHJ1ZSwgZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpKTtcbiAgICB9XG4gICAgZ3QodmFsdWUsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0TGltaXQoXCJtaW5cIiwgdmFsdWUsIGZhbHNlLCBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkpO1xuICAgIH1cbiAgICBsdGUodmFsdWUsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0TGltaXQoXCJtYXhcIiwgdmFsdWUsIHRydWUsIGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSk7XG4gICAgfVxuICAgIGx0KHZhbHVlLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldExpbWl0KFwibWF4XCIsIHZhbHVlLCBmYWxzZSwgZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpKTtcbiAgICB9XG4gICAgc2V0TGltaXQoa2luZCwgdmFsdWUsIGluY2x1c2l2ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZEJpZ0ludCh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBjaGVja3M6IFtcbiAgICAgICAgICAgICAgICAuLi50aGlzLl9kZWYuY2hlY2tzLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAga2luZCxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZSxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgX2FkZENoZWNrKGNoZWNrKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kQmlnSW50KHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIGNoZWNrczogWy4uLnRoaXMuX2RlZi5jaGVja3MsIGNoZWNrXSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHBvc2l0aXZlKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwibWluXCIsXG4gICAgICAgICAgICB2YWx1ZTogQmlnSW50KDApLFxuICAgICAgICAgICAgaW5jbHVzaXZlOiBmYWxzZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG5lZ2F0aXZlKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwibWF4XCIsXG4gICAgICAgICAgICB2YWx1ZTogQmlnSW50KDApLFxuICAgICAgICAgICAgaW5jbHVzaXZlOiBmYWxzZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG5vbnBvc2l0aXZlKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwibWF4XCIsXG4gICAgICAgICAgICB2YWx1ZTogQmlnSW50KDApLFxuICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbm9ubmVnYXRpdmUobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJtaW5cIixcbiAgICAgICAgICAgIHZhbHVlOiBCaWdJbnQoMCksXG4gICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBtdWx0aXBsZU9mKHZhbHVlLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcIm11bHRpcGxlT2ZcIixcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0IG1pblZhbHVlKCkge1xuICAgICAgICBsZXQgbWluID0gbnVsbDtcbiAgICAgICAgZm9yIChjb25zdCBjaCBvZiB0aGlzLl9kZWYuY2hlY2tzKSB7XG4gICAgICAgICAgICBpZiAoY2gua2luZCA9PT0gXCJtaW5cIikge1xuICAgICAgICAgICAgICAgIGlmIChtaW4gPT09IG51bGwgfHwgY2gudmFsdWUgPiBtaW4pXG4gICAgICAgICAgICAgICAgICAgIG1pbiA9IGNoLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtaW47XG4gICAgfVxuICAgIGdldCBtYXhWYWx1ZSgpIHtcbiAgICAgICAgbGV0IG1heCA9IG51bGw7XG4gICAgICAgIGZvciAoY29uc3QgY2ggb2YgdGhpcy5fZGVmLmNoZWNrcykge1xuICAgICAgICAgICAgaWYgKGNoLmtpbmQgPT09IFwibWF4XCIpIHtcbiAgICAgICAgICAgICAgICBpZiAobWF4ID09PSBudWxsIHx8IGNoLnZhbHVlIDwgbWF4KVxuICAgICAgICAgICAgICAgICAgICBtYXggPSBjaC52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWF4O1xuICAgIH1cbn1cblpvZEJpZ0ludC5jcmVhdGUgPSAocGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2RCaWdJbnQoe1xuICAgICAgICBjaGVja3M6IFtdLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEJpZ0ludCxcbiAgICAgICAgY29lcmNlOiBwYXJhbXM/LmNvZXJjZSA/PyBmYWxzZSxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmV4cG9ydCBjbGFzcyBab2RCb29sZWFuIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGlmICh0aGlzLl9kZWYuY29lcmNlKSB7XG4gICAgICAgICAgICBpbnB1dC5kYXRhID0gQm9vbGVhbihpbnB1dC5kYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXJzZWRUeXBlID0gdGhpcy5fZ2V0VHlwZShpbnB1dCk7XG4gICAgICAgIGlmIChwYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLmJvb2xlYW4pIHtcbiAgICAgICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0KTtcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IFpvZFBhcnNlZFR5cGUuYm9vbGVhbixcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBPSyhpbnB1dC5kYXRhKTtcbiAgICB9XG59XG5ab2RCb29sZWFuLmNyZWF0ZSA9IChwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZEJvb2xlYW4oe1xuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEJvb2xlYW4sXG4gICAgICAgIGNvZXJjZTogcGFyYW1zPy5jb2VyY2UgfHwgZmFsc2UsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5leHBvcnQgY2xhc3MgWm9kRGF0ZSBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBpZiAodGhpcy5fZGVmLmNvZXJjZSkge1xuICAgICAgICAgICAgaW5wdXQuZGF0YSA9IG5ldyBEYXRlKGlucHV0LmRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcnNlZFR5cGUgPSB0aGlzLl9nZXRUeXBlKGlucHV0KTtcbiAgICAgICAgaWYgKHBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUuZGF0ZSkge1xuICAgICAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpO1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS5kYXRlLFxuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKE51bWJlci5pc05hTihpbnB1dC5kYXRhLmdldFRpbWUoKSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0KTtcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX2RhdGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IG5ldyBQYXJzZVN0YXR1cygpO1xuICAgICAgICBsZXQgY3R4ID0gdW5kZWZpbmVkO1xuICAgICAgICBmb3IgKGNvbnN0IGNoZWNrIG9mIHRoaXMuX2RlZi5jaGVja3MpIHtcbiAgICAgICAgICAgIGlmIChjaGVjay5raW5kID09PSBcIm1pblwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlucHV0LmRhdGEuZ2V0VGltZSgpIDwgY2hlY2sudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLnRvb19zbWFsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBleGFjdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBtaW5pbXVtOiBjaGVjay52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJtYXhcIikge1xuICAgICAgICAgICAgICAgIGlmIChpbnB1dC5kYXRhLmdldFRpbWUoKSA+IGNoZWNrLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS50b29fYmlnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4YWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heGltdW06IGNoZWNrLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB1dGlsLmFzc2VydE5ldmVyKGNoZWNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3RhdHVzOiBzdGF0dXMudmFsdWUsXG4gICAgICAgICAgICB2YWx1ZTogbmV3IERhdGUoaW5wdXQuZGF0YS5nZXRUaW1lKCkpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBfYWRkQ2hlY2soY2hlY2spIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2REYXRlKHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIGNoZWNrczogWy4uLnRoaXMuX2RlZi5jaGVja3MsIGNoZWNrXSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG1pbihtaW5EYXRlLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcIm1pblwiLFxuICAgICAgICAgICAgdmFsdWU6IG1pbkRhdGUuZ2V0VGltZSgpLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbWF4KG1heERhdGUsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwibWF4XCIsXG4gICAgICAgICAgICB2YWx1ZTogbWF4RGF0ZS5nZXRUaW1lKCksXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBnZXQgbWluRGF0ZSgpIHtcbiAgICAgICAgbGV0IG1pbiA9IG51bGw7XG4gICAgICAgIGZvciAoY29uc3QgY2ggb2YgdGhpcy5fZGVmLmNoZWNrcykge1xuICAgICAgICAgICAgaWYgKGNoLmtpbmQgPT09IFwibWluXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAobWluID09PSBudWxsIHx8IGNoLnZhbHVlID4gbWluKVxuICAgICAgICAgICAgICAgICAgICBtaW4gPSBjaC52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWluICE9IG51bGwgPyBuZXcgRGF0ZShtaW4pIDogbnVsbDtcbiAgICB9XG4gICAgZ2V0IG1heERhdGUoKSB7XG4gICAgICAgIGxldCBtYXggPSBudWxsO1xuICAgICAgICBmb3IgKGNvbnN0IGNoIG9mIHRoaXMuX2RlZi5jaGVja3MpIHtcbiAgICAgICAgICAgIGlmIChjaC5raW5kID09PSBcIm1heFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1heCA9PT0gbnVsbCB8fCBjaC52YWx1ZSA8IG1heClcbiAgICAgICAgICAgICAgICAgICAgbWF4ID0gY2gudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1heCAhPSBudWxsID8gbmV3IERhdGUobWF4KSA6IG51bGw7XG4gICAgfVxufVxuWm9kRGF0ZS5jcmVhdGUgPSAocGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2REYXRlKHtcbiAgICAgICAgY2hlY2tzOiBbXSxcbiAgICAgICAgY29lcmNlOiBwYXJhbXM/LmNvZXJjZSB8fCBmYWxzZSxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2REYXRlLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuZXhwb3J0IGNsYXNzIFpvZFN5bWJvbCBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCBwYXJzZWRUeXBlID0gdGhpcy5fZ2V0VHlwZShpbnB1dCk7XG4gICAgICAgIGlmIChwYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLnN5bWJvbCkge1xuICAgICAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpO1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS5zeW1ib2wsXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gT0soaW5wdXQuZGF0YSk7XG4gICAgfVxufVxuWm9kU3ltYm9sLmNyZWF0ZSA9IChwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZFN5bWJvbCh7XG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kU3ltYm9sLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuZXhwb3J0IGNsYXNzIFpvZFVuZGVmaW5lZCBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCBwYXJzZWRUeXBlID0gdGhpcy5fZ2V0VHlwZShpbnB1dCk7XG4gICAgICAgIGlmIChwYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLnVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpO1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS51bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gT0soaW5wdXQuZGF0YSk7XG4gICAgfVxufVxuWm9kVW5kZWZpbmVkLmNyZWF0ZSA9IChwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZFVuZGVmaW5lZCh7XG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kVW5kZWZpbmVkLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuZXhwb3J0IGNsYXNzIFpvZE51bGwgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgcGFyc2VkVHlwZSA9IHRoaXMuX2dldFR5cGUoaW5wdXQpO1xuICAgICAgICBpZiAocGFyc2VkVHlwZSAhPT0gWm9kUGFyc2VkVHlwZS5udWxsKSB7XG4gICAgICAgICAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLm51bGwsXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gT0soaW5wdXQuZGF0YSk7XG4gICAgfVxufVxuWm9kTnVsbC5jcmVhdGUgPSAocGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2ROdWxsKHtcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2ROdWxsLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuZXhwb3J0IGNsYXNzIFpvZEFueSBleHRlbmRzIFpvZFR5cGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICAvLyB0byBwcmV2ZW50IGluc3RhbmNlcyBvZiBvdGhlciBjbGFzc2VzIGZyb20gZXh0ZW5kaW5nIFpvZEFueS4gdGhpcyBjYXVzZXMgaXNzdWVzIHdpdGggY2F0Y2hhbGwgaW4gWm9kT2JqZWN0LlxuICAgICAgICB0aGlzLl9hbnkgPSB0cnVlO1xuICAgIH1cbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIE9LKGlucHV0LmRhdGEpO1xuICAgIH1cbn1cblpvZEFueS5jcmVhdGUgPSAocGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2RBbnkoe1xuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEFueSxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmV4cG9ydCBjbGFzcyBab2RVbmtub3duIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIC8vIHJlcXVpcmVkXG4gICAgICAgIHRoaXMuX3Vua25vd24gPSB0cnVlO1xuICAgIH1cbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIE9LKGlucHV0LmRhdGEpO1xuICAgIH1cbn1cblpvZFVua25vd24uY3JlYXRlID0gKHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kVW5rbm93bih7XG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kVW5rbm93bixcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmV4cG9ydCBjbGFzcyBab2ROZXZlciBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7XG4gICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLm5ldmVyLFxuICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgfVxufVxuWm9kTmV2ZXIuY3JlYXRlID0gKHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kTmV2ZXIoe1xuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE5ldmVyLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuZXhwb3J0IGNsYXNzIFpvZFZvaWQgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgcGFyc2VkVHlwZSA9IHRoaXMuX2dldFR5cGUoaW5wdXQpO1xuICAgICAgICBpZiAocGFyc2VkVHlwZSAhPT0gWm9kUGFyc2VkVHlwZS51bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0KTtcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IFpvZFBhcnNlZFR5cGUudm9pZCxcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBPSyhpbnB1dC5kYXRhKTtcbiAgICB9XG59XG5ab2RWb2lkLmNyZWF0ZSA9IChwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZFZvaWQoe1xuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZFZvaWQsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5leHBvcnQgY2xhc3MgWm9kQXJyYXkgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgeyBjdHgsIHN0YXR1cyB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTtcbiAgICAgICAgY29uc3QgZGVmID0gdGhpcy5fZGVmO1xuICAgICAgICBpZiAoY3R4LnBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUuYXJyYXkpIHtcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IFpvZFBhcnNlZFR5cGUuYXJyYXksXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVmLmV4YWN0TGVuZ3RoICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCB0b29CaWcgPSBjdHguZGF0YS5sZW5ndGggPiBkZWYuZXhhY3RMZW5ndGgudmFsdWU7XG4gICAgICAgICAgICBjb25zdCB0b29TbWFsbCA9IGN0eC5kYXRhLmxlbmd0aCA8IGRlZi5leGFjdExlbmd0aC52YWx1ZTtcbiAgICAgICAgICAgIGlmICh0b29CaWcgfHwgdG9vU21hbGwpIHtcbiAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTogdG9vQmlnID8gWm9kSXNzdWVDb2RlLnRvb19iaWcgOiBab2RJc3N1ZUNvZGUudG9vX3NtYWxsLFxuICAgICAgICAgICAgICAgICAgICBtaW5pbXVtOiAodG9vU21hbGwgPyBkZWYuZXhhY3RMZW5ndGgudmFsdWUgOiB1bmRlZmluZWQpLFxuICAgICAgICAgICAgICAgICAgICBtYXhpbXVtOiAodG9vQmlnID8gZGVmLmV4YWN0TGVuZ3RoLnZhbHVlIDogdW5kZWZpbmVkKSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGV4YWN0OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBkZWYuZXhhY3RMZW5ndGgubWVzc2FnZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVmLm1pbkxlbmd0aCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGN0eC5kYXRhLmxlbmd0aCA8IGRlZi5taW5MZW5ndGgudmFsdWUpIHtcbiAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLnRvb19zbWFsbCxcbiAgICAgICAgICAgICAgICAgICAgbWluaW11bTogZGVmLm1pbkxlbmd0aC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGV4YWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZGVmLm1pbkxlbmd0aC5tZXNzYWdlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChkZWYubWF4TGVuZ3RoICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoY3R4LmRhdGEubGVuZ3RoID4gZGVmLm1heExlbmd0aC52YWx1ZSkge1xuICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUudG9vX2JpZyxcbiAgICAgICAgICAgICAgICAgICAgbWF4aW11bTogZGVmLm1heExlbmd0aC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGV4YWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZGVmLm1heExlbmd0aC5tZXNzYWdlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjdHguY29tbW9uLmFzeW5jKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoWy4uLmN0eC5kYXRhXS5tYXAoKGl0ZW0sIGkpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGVmLnR5cGUuX3BhcnNlQXN5bmMobmV3IFBhcnNlSW5wdXRMYXp5UGF0aChjdHgsIGl0ZW0sIGN0eC5wYXRoLCBpKSk7XG4gICAgICAgICAgICB9KSkudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFBhcnNlU3RhdHVzLm1lcmdlQXJyYXkoc3RhdHVzLCByZXN1bHQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gWy4uLmN0eC5kYXRhXS5tYXAoKGl0ZW0sIGkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBkZWYudHlwZS5fcGFyc2VTeW5jKG5ldyBQYXJzZUlucHV0TGF6eVBhdGgoY3R4LCBpdGVtLCBjdHgucGF0aCwgaSkpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIFBhcnNlU3RhdHVzLm1lcmdlQXJyYXkoc3RhdHVzLCByZXN1bHQpO1xuICAgIH1cbiAgICBnZXQgZWxlbWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi50eXBlO1xuICAgIH1cbiAgICBtaW4obWluTGVuZ3RoLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kQXJyYXkoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgbWluTGVuZ3RoOiB7IHZhbHVlOiBtaW5MZW5ndGgsIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSB9LFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbWF4KG1heExlbmd0aCwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZEFycmF5KHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIG1heExlbmd0aDogeyB2YWx1ZTogbWF4TGVuZ3RoLCBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkgfSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGxlbmd0aChsZW4sIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RBcnJheSh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBleGFjdExlbmd0aDogeyB2YWx1ZTogbGVuLCBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkgfSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG5vbmVtcHR5KG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWluKDEsIG1lc3NhZ2UpO1xuICAgIH1cbn1cblpvZEFycmF5LmNyZWF0ZSA9IChzY2hlbWEsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kQXJyYXkoe1xuICAgICAgICB0eXBlOiBzY2hlbWEsXG4gICAgICAgIG1pbkxlbmd0aDogbnVsbCxcbiAgICAgICAgbWF4TGVuZ3RoOiBudWxsLFxuICAgICAgICBleGFjdExlbmd0aDogbnVsbCxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RBcnJheSxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmZ1bmN0aW9uIGRlZXBQYXJ0aWFsaWZ5KHNjaGVtYSkge1xuICAgIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBab2RPYmplY3QpIHtcbiAgICAgICAgY29uc3QgbmV3U2hhcGUgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gc2NoZW1hLnNoYXBlKSB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZFNjaGVtYSA9IHNjaGVtYS5zaGFwZVtrZXldO1xuICAgICAgICAgICAgbmV3U2hhcGVba2V5XSA9IFpvZE9wdGlvbmFsLmNyZWF0ZShkZWVwUGFydGlhbGlmeShmaWVsZFNjaGVtYSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHtcbiAgICAgICAgICAgIC4uLnNjaGVtYS5fZGVmLFxuICAgICAgICAgICAgc2hhcGU6ICgpID0+IG5ld1NoYXBlLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoc2NoZW1hIGluc3RhbmNlb2YgWm9kQXJyYXkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RBcnJheSh7XG4gICAgICAgICAgICAuLi5zY2hlbWEuX2RlZixcbiAgICAgICAgICAgIHR5cGU6IGRlZXBQYXJ0aWFsaWZ5KHNjaGVtYS5lbGVtZW50KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIFpvZE9wdGlvbmFsKSB7XG4gICAgICAgIHJldHVybiBab2RPcHRpb25hbC5jcmVhdGUoZGVlcFBhcnRpYWxpZnkoc2NoZW1hLnVud3JhcCgpKSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIFpvZE51bGxhYmxlKSB7XG4gICAgICAgIHJldHVybiBab2ROdWxsYWJsZS5jcmVhdGUoZGVlcFBhcnRpYWxpZnkoc2NoZW1hLnVud3JhcCgpKSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIFpvZFR1cGxlKSB7XG4gICAgICAgIHJldHVybiBab2RUdXBsZS5jcmVhdGUoc2NoZW1hLml0ZW1zLm1hcCgoaXRlbSkgPT4gZGVlcFBhcnRpYWxpZnkoaXRlbSkpKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBzY2hlbWE7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIFpvZE9iamVjdCBleHRlbmRzIFpvZFR5cGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLl9jYWNoZWQgPSBudWxsO1xuICAgICAgICAvKipcbiAgICAgICAgICogQGRlcHJlY2F0ZWQgSW4gbW9zdCBjYXNlcywgdGhpcyBpcyBubyBsb25nZXIgbmVlZGVkIC0gdW5rbm93biBwcm9wZXJ0aWVzIGFyZSBub3cgc2lsZW50bHkgc3RyaXBwZWQuXG4gICAgICAgICAqIElmIHlvdSB3YW50IHRvIHBhc3MgdGhyb3VnaCB1bmtub3duIHByb3BlcnRpZXMsIHVzZSBgLnBhc3N0aHJvdWdoKClgIGluc3RlYWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm5vbnN0cmljdCA9IHRoaXMucGFzc3Rocm91Z2g7XG4gICAgICAgIC8vIGV4dGVuZDxcbiAgICAgICAgLy8gICBBdWdtZW50YXRpb24gZXh0ZW5kcyBab2RSYXdTaGFwZSxcbiAgICAgICAgLy8gICBOZXdPdXRwdXQgZXh0ZW5kcyB1dGlsLmZsYXR0ZW48e1xuICAgICAgICAvLyAgICAgW2sgaW4ga2V5b2YgQXVnbWVudGF0aW9uIHwga2V5b2YgT3V0cHV0XTogayBleHRlbmRzIGtleW9mIEF1Z21lbnRhdGlvblxuICAgICAgICAvLyAgICAgICA/IEF1Z21lbnRhdGlvbltrXVtcIl9vdXRwdXRcIl1cbiAgICAgICAgLy8gICAgICAgOiBrIGV4dGVuZHMga2V5b2YgT3V0cHV0XG4gICAgICAgIC8vICAgICAgID8gT3V0cHV0W2tdXG4gICAgICAgIC8vICAgICAgIDogbmV2ZXI7XG4gICAgICAgIC8vICAgfT4sXG4gICAgICAgIC8vICAgTmV3SW5wdXQgZXh0ZW5kcyB1dGlsLmZsYXR0ZW48e1xuICAgICAgICAvLyAgICAgW2sgaW4ga2V5b2YgQXVnbWVudGF0aW9uIHwga2V5b2YgSW5wdXRdOiBrIGV4dGVuZHMga2V5b2YgQXVnbWVudGF0aW9uXG4gICAgICAgIC8vICAgICAgID8gQXVnbWVudGF0aW9uW2tdW1wiX2lucHV0XCJdXG4gICAgICAgIC8vICAgICAgIDogayBleHRlbmRzIGtleW9mIElucHV0XG4gICAgICAgIC8vICAgICAgID8gSW5wdXRba11cbiAgICAgICAgLy8gICAgICAgOiBuZXZlcjtcbiAgICAgICAgLy8gICB9PlxuICAgICAgICAvLyA+KFxuICAgICAgICAvLyAgIGF1Z21lbnRhdGlvbjogQXVnbWVudGF0aW9uXG4gICAgICAgIC8vICk6IFpvZE9iamVjdDxcbiAgICAgICAgLy8gICBleHRlbmRTaGFwZTxULCBBdWdtZW50YXRpb24+LFxuICAgICAgICAvLyAgIFVua25vd25LZXlzLFxuICAgICAgICAvLyAgIENhdGNoYWxsLFxuICAgICAgICAvLyAgIE5ld091dHB1dCxcbiAgICAgICAgLy8gICBOZXdJbnB1dFxuICAgICAgICAvLyA+IHtcbiAgICAgICAgLy8gICByZXR1cm4gbmV3IFpvZE9iamVjdCh7XG4gICAgICAgIC8vICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgIC8vICAgICBzaGFwZTogKCkgPT4gKHtcbiAgICAgICAgLy8gICAgICAgLi4udGhpcy5fZGVmLnNoYXBlKCksXG4gICAgICAgIC8vICAgICAgIC4uLmF1Z21lbnRhdGlvbixcbiAgICAgICAgLy8gICAgIH0pLFxuICAgICAgICAvLyAgIH0pIGFzIGFueTtcbiAgICAgICAgLy8gfVxuICAgICAgICAvKipcbiAgICAgICAgICogQGRlcHJlY2F0ZWQgVXNlIGAuZXh0ZW5kYCBpbnN0ZWFkXG4gICAgICAgICAqICAqL1xuICAgICAgICB0aGlzLmF1Z21lbnQgPSB0aGlzLmV4dGVuZDtcbiAgICB9XG4gICAgX2dldENhY2hlZCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2NhY2hlZCAhPT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jYWNoZWQ7XG4gICAgICAgIGNvbnN0IHNoYXBlID0gdGhpcy5fZGVmLnNoYXBlKCk7XG4gICAgICAgIGNvbnN0IGtleXMgPSB1dGlsLm9iamVjdEtleXMoc2hhcGUpO1xuICAgICAgICB0aGlzLl9jYWNoZWQgPSB7IHNoYXBlLCBrZXlzIH07XG4gICAgICAgIHJldHVybiB0aGlzLl9jYWNoZWQ7XG4gICAgfVxuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCBwYXJzZWRUeXBlID0gdGhpcy5fZ2V0VHlwZShpbnB1dCk7XG4gICAgICAgIGlmIChwYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLm9iamVjdCkge1xuICAgICAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpO1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS5vYmplY3QsXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IHN0YXR1cywgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpO1xuICAgICAgICBjb25zdCB7IHNoYXBlLCBrZXlzOiBzaGFwZUtleXMgfSA9IHRoaXMuX2dldENhY2hlZCgpO1xuICAgICAgICBjb25zdCBleHRyYUtleXMgPSBbXTtcbiAgICAgICAgaWYgKCEodGhpcy5fZGVmLmNhdGNoYWxsIGluc3RhbmNlb2YgWm9kTmV2ZXIgJiYgdGhpcy5fZGVmLnVua25vd25LZXlzID09PSBcInN0cmlwXCIpKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBjdHguZGF0YSkge1xuICAgICAgICAgICAgICAgIGlmICghc2hhcGVLZXlzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZXh0cmFLZXlzLnB1c2goa2V5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFpcnMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2Ygc2hhcGVLZXlzKSB7XG4gICAgICAgICAgICBjb25zdCBrZXlWYWxpZGF0b3IgPSBzaGFwZVtrZXldO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjdHguZGF0YVtrZXldO1xuICAgICAgICAgICAgcGFpcnMucHVzaCh7XG4gICAgICAgICAgICAgICAga2V5OiB7IHN0YXR1czogXCJ2YWxpZFwiLCB2YWx1ZToga2V5IH0sXG4gICAgICAgICAgICAgICAgdmFsdWU6IGtleVZhbGlkYXRvci5fcGFyc2UobmV3IFBhcnNlSW5wdXRMYXp5UGF0aChjdHgsIHZhbHVlLCBjdHgucGF0aCwga2V5KSksXG4gICAgICAgICAgICAgICAgYWx3YXlzU2V0OiBrZXkgaW4gY3R4LmRhdGEsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fZGVmLmNhdGNoYWxsIGluc3RhbmNlb2YgWm9kTmV2ZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHVua25vd25LZXlzID0gdGhpcy5fZGVmLnVua25vd25LZXlzO1xuICAgICAgICAgICAgaWYgKHVua25vd25LZXlzID09PSBcInBhc3N0aHJvdWdoXCIpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBleHRyYUtleXMpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFpcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6IHsgc3RhdHVzOiBcInZhbGlkXCIsIHZhbHVlOiBrZXkgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB7IHN0YXR1czogXCJ2YWxpZFwiLCB2YWx1ZTogY3R4LmRhdGFba2V5XSB9LFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh1bmtub3duS2V5cyA9PT0gXCJzdHJpY3RcIikge1xuICAgICAgICAgICAgICAgIGlmIChleHRyYUtleXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS51bnJlY29nbml6ZWRfa2V5cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleXM6IGV4dHJhS2V5cyxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHVua25vd25LZXlzID09PSBcInN0cmlwXCIpIHtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW50ZXJuYWwgWm9kT2JqZWN0IGVycm9yOiBpbnZhbGlkIHVua25vd25LZXlzIHZhbHVlLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gcnVuIGNhdGNoYWxsIHZhbGlkYXRpb25cbiAgICAgICAgICAgIGNvbnN0IGNhdGNoYWxsID0gdGhpcy5fZGVmLmNhdGNoYWxsO1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgZXh0cmFLZXlzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjdHguZGF0YVtrZXldO1xuICAgICAgICAgICAgICAgIHBhaXJzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBrZXk6IHsgc3RhdHVzOiBcInZhbGlkXCIsIHZhbHVlOiBrZXkgfSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGNhdGNoYWxsLl9wYXJzZShuZXcgUGFyc2VJbnB1dExhenlQYXRoKGN0eCwgdmFsdWUsIGN0eC5wYXRoLCBrZXkpIC8vLCBjdHguY2hpbGQoa2V5KSwgdmFsdWUsIGdldFBhcnNlZFR5cGUodmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIGFsd2F5c1NldDoga2V5IGluIGN0eC5kYXRhLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjdHguY29tbW9uLmFzeW5jKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKClcbiAgICAgICAgICAgICAgICAudGhlbihhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3luY1BhaXJzID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBwYWlyIG9mIHBhaXJzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGF3YWl0IHBhaXIua2V5O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHBhaXIudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIHN5bmNQYWlycy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWx3YXlzU2V0OiBwYWlyLmFsd2F5c1NldCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBzeW5jUGFpcnM7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC50aGVuKChzeW5jUGFpcnMpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUGFyc2VTdGF0dXMubWVyZ2VPYmplY3RTeW5jKHN0YXR1cywgc3luY1BhaXJzKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFBhcnNlU3RhdHVzLm1lcmdlT2JqZWN0U3luYyhzdGF0dXMsIHBhaXJzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgc2hhcGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYuc2hhcGUoKTtcbiAgICB9XG4gICAgc3RyaWN0KG1lc3NhZ2UpIHtcbiAgICAgICAgZXJyb3JVdGlsLmVyclRvT2JqO1xuICAgICAgICByZXR1cm4gbmV3IFpvZE9iamVjdCh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICB1bmtub3duS2V5czogXCJzdHJpY3RcIixcbiAgICAgICAgICAgIC4uLihtZXNzYWdlICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JNYXA6IChpc3N1ZSwgY3R4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWZhdWx0RXJyb3IgPSB0aGlzLl9kZWYuZXJyb3JNYXA/Lihpc3N1ZSwgY3R4KS5tZXNzYWdlID8/IGN0eC5kZWZhdWx0RXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNzdWUuY29kZSA9PT0gXCJ1bnJlY29nbml6ZWRfa2V5c1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKS5tZXNzYWdlID8/IGRlZmF1bHRFcnJvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBkZWZhdWx0RXJyb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0cmlwKCkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZE9iamVjdCh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICB1bmtub3duS2V5czogXCJzdHJpcFwiLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcGFzc3Rocm91Z2goKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIHVua25vd25LZXlzOiBcInBhc3N0aHJvdWdoXCIsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBjb25zdCBBdWdtZW50RmFjdG9yeSA9XG4gICAgLy8gICA8RGVmIGV4dGVuZHMgWm9kT2JqZWN0RGVmPihkZWY6IERlZikgPT5cbiAgICAvLyAgIDxBdWdtZW50YXRpb24gZXh0ZW5kcyBab2RSYXdTaGFwZT4oXG4gICAgLy8gICAgIGF1Z21lbnRhdGlvbjogQXVnbWVudGF0aW9uXG4gICAgLy8gICApOiBab2RPYmplY3Q8XG4gICAgLy8gICAgIGV4dGVuZFNoYXBlPFJldHVyblR5cGU8RGVmW1wic2hhcGVcIl0+LCBBdWdtZW50YXRpb24+LFxuICAgIC8vICAgICBEZWZbXCJ1bmtub3duS2V5c1wiXSxcbiAgICAvLyAgICAgRGVmW1wiY2F0Y2hhbGxcIl1cbiAgICAvLyAgID4gPT4ge1xuICAgIC8vICAgICByZXR1cm4gbmV3IFpvZE9iamVjdCh7XG4gICAgLy8gICAgICAgLi4uZGVmLFxuICAgIC8vICAgICAgIHNoYXBlOiAoKSA9PiAoe1xuICAgIC8vICAgICAgICAgLi4uZGVmLnNoYXBlKCksXG4gICAgLy8gICAgICAgICAuLi5hdWdtZW50YXRpb24sXG4gICAgLy8gICAgICAgfSksXG4gICAgLy8gICAgIH0pIGFzIGFueTtcbiAgICAvLyAgIH07XG4gICAgZXh0ZW5kKGF1Z21lbnRhdGlvbikge1xuICAgICAgICByZXR1cm4gbmV3IFpvZE9iamVjdCh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBzaGFwZTogKCkgPT4gKHtcbiAgICAgICAgICAgICAgICAuLi50aGlzLl9kZWYuc2hhcGUoKSxcbiAgICAgICAgICAgICAgICAuLi5hdWdtZW50YXRpb24sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFByaW9yIHRvIHpvZEAxLjAuMTIgdGhlcmUgd2FzIGEgYnVnIGluIHRoZVxuICAgICAqIGluZmVycmVkIHR5cGUgb2YgbWVyZ2VkIG9iamVjdHMuIFBsZWFzZVxuICAgICAqIHVwZ3JhZGUgaWYgeW91IGFyZSBleHBlcmllbmNpbmcgaXNzdWVzLlxuICAgICAqL1xuICAgIG1lcmdlKG1lcmdpbmcpIHtcbiAgICAgICAgY29uc3QgbWVyZ2VkID0gbmV3IFpvZE9iamVjdCh7XG4gICAgICAgICAgICB1bmtub3duS2V5czogbWVyZ2luZy5fZGVmLnVua25vd25LZXlzLFxuICAgICAgICAgICAgY2F0Y2hhbGw6IG1lcmdpbmcuX2RlZi5jYXRjaGFsbCxcbiAgICAgICAgICAgIHNoYXBlOiAoKSA9PiAoe1xuICAgICAgICAgICAgICAgIC4uLnRoaXMuX2RlZi5zaGFwZSgpLFxuICAgICAgICAgICAgICAgIC4uLm1lcmdpbmcuX2RlZi5zaGFwZSgpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE9iamVjdCxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBtZXJnZWQ7XG4gICAgfVxuICAgIC8vIG1lcmdlPFxuICAgIC8vICAgSW5jb21pbmcgZXh0ZW5kcyBBbnlab2RPYmplY3QsXG4gICAgLy8gICBBdWdtZW50YXRpb24gZXh0ZW5kcyBJbmNvbWluZ1tcInNoYXBlXCJdLFxuICAgIC8vICAgTmV3T3V0cHV0IGV4dGVuZHMge1xuICAgIC8vICAgICBbayBpbiBrZXlvZiBBdWdtZW50YXRpb24gfCBrZXlvZiBPdXRwdXRdOiBrIGV4dGVuZHMga2V5b2YgQXVnbWVudGF0aW9uXG4gICAgLy8gICAgICAgPyBBdWdtZW50YXRpb25ba11bXCJfb3V0cHV0XCJdXG4gICAgLy8gICAgICAgOiBrIGV4dGVuZHMga2V5b2YgT3V0cHV0XG4gICAgLy8gICAgICAgPyBPdXRwdXRba11cbiAgICAvLyAgICAgICA6IG5ldmVyO1xuICAgIC8vICAgfSxcbiAgICAvLyAgIE5ld0lucHV0IGV4dGVuZHMge1xuICAgIC8vICAgICBbayBpbiBrZXlvZiBBdWdtZW50YXRpb24gfCBrZXlvZiBJbnB1dF06IGsgZXh0ZW5kcyBrZXlvZiBBdWdtZW50YXRpb25cbiAgICAvLyAgICAgICA/IEF1Z21lbnRhdGlvbltrXVtcIl9pbnB1dFwiXVxuICAgIC8vICAgICAgIDogayBleHRlbmRzIGtleW9mIElucHV0XG4gICAgLy8gICAgICAgPyBJbnB1dFtrXVxuICAgIC8vICAgICAgIDogbmV2ZXI7XG4gICAgLy8gICB9XG4gICAgLy8gPihcbiAgICAvLyAgIG1lcmdpbmc6IEluY29taW5nXG4gICAgLy8gKTogWm9kT2JqZWN0PFxuICAgIC8vICAgZXh0ZW5kU2hhcGU8VCwgUmV0dXJuVHlwZTxJbmNvbWluZ1tcIl9kZWZcIl1bXCJzaGFwZVwiXT4+LFxuICAgIC8vICAgSW5jb21pbmdbXCJfZGVmXCJdW1widW5rbm93bktleXNcIl0sXG4gICAgLy8gICBJbmNvbWluZ1tcIl9kZWZcIl1bXCJjYXRjaGFsbFwiXSxcbiAgICAvLyAgIE5ld091dHB1dCxcbiAgICAvLyAgIE5ld0lucHV0XG4gICAgLy8gPiB7XG4gICAgLy8gICBjb25zdCBtZXJnZWQ6IGFueSA9IG5ldyBab2RPYmplY3Qoe1xuICAgIC8vICAgICB1bmtub3duS2V5czogbWVyZ2luZy5fZGVmLnVua25vd25LZXlzLFxuICAgIC8vICAgICBjYXRjaGFsbDogbWVyZ2luZy5fZGVmLmNhdGNoYWxsLFxuICAgIC8vICAgICBzaGFwZTogKCkgPT5cbiAgICAvLyAgICAgICBvYmplY3RVdGlsLm1lcmdlU2hhcGVzKHRoaXMuX2RlZi5zaGFwZSgpLCBtZXJnaW5nLl9kZWYuc2hhcGUoKSksXG4gICAgLy8gICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kT2JqZWN0LFxuICAgIC8vICAgfSkgYXMgYW55O1xuICAgIC8vICAgcmV0dXJuIG1lcmdlZDtcbiAgICAvLyB9XG4gICAgc2V0S2V5KGtleSwgc2NoZW1hKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmF1Z21lbnQoeyBba2V5XTogc2NoZW1hIH0pO1xuICAgIH1cbiAgICAvLyBtZXJnZTxJbmNvbWluZyBleHRlbmRzIEFueVpvZE9iamVjdD4oXG4gICAgLy8gICBtZXJnaW5nOiBJbmNvbWluZ1xuICAgIC8vICk6IC8vWm9kT2JqZWN0PFQgJiBJbmNvbWluZ1tcIl9zaGFwZVwiXSwgVW5rbm93bktleXMsIENhdGNoYWxsPiA9IChtZXJnaW5nKSA9PiB7XG4gICAgLy8gWm9kT2JqZWN0PFxuICAgIC8vICAgZXh0ZW5kU2hhcGU8VCwgUmV0dXJuVHlwZTxJbmNvbWluZ1tcIl9kZWZcIl1bXCJzaGFwZVwiXT4+LFxuICAgIC8vICAgSW5jb21pbmdbXCJfZGVmXCJdW1widW5rbm93bktleXNcIl0sXG4gICAgLy8gICBJbmNvbWluZ1tcIl9kZWZcIl1bXCJjYXRjaGFsbFwiXVxuICAgIC8vID4ge1xuICAgIC8vICAgLy8gY29uc3QgbWVyZ2VkU2hhcGUgPSBvYmplY3RVdGlsLm1lcmdlU2hhcGVzKFxuICAgIC8vICAgLy8gICB0aGlzLl9kZWYuc2hhcGUoKSxcbiAgICAvLyAgIC8vICAgbWVyZ2luZy5fZGVmLnNoYXBlKClcbiAgICAvLyAgIC8vICk7XG4gICAgLy8gICBjb25zdCBtZXJnZWQ6IGFueSA9IG5ldyBab2RPYmplY3Qoe1xuICAgIC8vICAgICB1bmtub3duS2V5czogbWVyZ2luZy5fZGVmLnVua25vd25LZXlzLFxuICAgIC8vICAgICBjYXRjaGFsbDogbWVyZ2luZy5fZGVmLmNhdGNoYWxsLFxuICAgIC8vICAgICBzaGFwZTogKCkgPT5cbiAgICAvLyAgICAgICBvYmplY3RVdGlsLm1lcmdlU2hhcGVzKHRoaXMuX2RlZi5zaGFwZSgpLCBtZXJnaW5nLl9kZWYuc2hhcGUoKSksXG4gICAgLy8gICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kT2JqZWN0LFxuICAgIC8vICAgfSkgYXMgYW55O1xuICAgIC8vICAgcmV0dXJuIG1lcmdlZDtcbiAgICAvLyB9XG4gICAgY2F0Y2hhbGwoaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RPYmplY3Qoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgY2F0Y2hhbGw6IGluZGV4LFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcGljayhtYXNrKSB7XG4gICAgICAgIGNvbnN0IHNoYXBlID0ge307XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHV0aWwub2JqZWN0S2V5cyhtYXNrKSkge1xuICAgICAgICAgICAgaWYgKG1hc2tba2V5XSAmJiB0aGlzLnNoYXBlW2tleV0pIHtcbiAgICAgICAgICAgICAgICBzaGFwZVtrZXldID0gdGhpcy5zaGFwZVtrZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIHNoYXBlOiAoKSA9PiBzaGFwZSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG9taXQobWFzaykge1xuICAgICAgICBjb25zdCBzaGFwZSA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiB1dGlsLm9iamVjdEtleXModGhpcy5zaGFwZSkpIHtcbiAgICAgICAgICAgIGlmICghbWFza1trZXldKSB7XG4gICAgICAgICAgICAgICAgc2hhcGVba2V5XSA9IHRoaXMuc2hhcGVba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFpvZE9iamVjdCh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBzaGFwZTogKCkgPT4gc2hhcGUsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGRlZXBQYXJ0aWFsKCkge1xuICAgICAgICByZXR1cm4gZGVlcFBhcnRpYWxpZnkodGhpcyk7XG4gICAgfVxuICAgIHBhcnRpYWwobWFzaykge1xuICAgICAgICBjb25zdCBuZXdTaGFwZSA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiB1dGlsLm9iamVjdEtleXModGhpcy5zaGFwZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkU2NoZW1hID0gdGhpcy5zaGFwZVtrZXldO1xuICAgICAgICAgICAgaWYgKG1hc2sgJiYgIW1hc2tba2V5XSkge1xuICAgICAgICAgICAgICAgIG5ld1NoYXBlW2tleV0gPSBmaWVsZFNjaGVtYTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG5ld1NoYXBlW2tleV0gPSBmaWVsZFNjaGVtYS5vcHRpb25hbCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIHNoYXBlOiAoKSA9PiBuZXdTaGFwZSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJlcXVpcmVkKG1hc2spIHtcbiAgICAgICAgY29uc3QgbmV3U2hhcGUgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgdXRpbC5vYmplY3RLZXlzKHRoaXMuc2hhcGUpKSB7XG4gICAgICAgICAgICBpZiAobWFzayAmJiAhbWFza1trZXldKSB7XG4gICAgICAgICAgICAgICAgbmV3U2hhcGVba2V5XSA9IHRoaXMuc2hhcGVba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpZWxkU2NoZW1hID0gdGhpcy5zaGFwZVtrZXldO1xuICAgICAgICAgICAgICAgIGxldCBuZXdGaWVsZCA9IGZpZWxkU2NoZW1hO1xuICAgICAgICAgICAgICAgIHdoaWxlIChuZXdGaWVsZCBpbnN0YW5jZW9mIFpvZE9wdGlvbmFsKSB7XG4gICAgICAgICAgICAgICAgICAgIG5ld0ZpZWxkID0gbmV3RmllbGQuX2RlZi5pbm5lclR5cGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5ld1NoYXBlW2tleV0gPSBuZXdGaWVsZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFpvZE9iamVjdCh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBzaGFwZTogKCkgPT4gbmV3U2hhcGUsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBrZXlvZigpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZVpvZEVudW0odXRpbC5vYmplY3RLZXlzKHRoaXMuc2hhcGUpKTtcbiAgICB9XG59XG5ab2RPYmplY3QuY3JlYXRlID0gKHNoYXBlLCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZE9iamVjdCh7XG4gICAgICAgIHNoYXBlOiAoKSA9PiBzaGFwZSxcbiAgICAgICAgdW5rbm93bktleXM6IFwic3RyaXBcIixcbiAgICAgICAgY2F0Y2hhbGw6IFpvZE5ldmVyLmNyZWF0ZSgpLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE9iamVjdCxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcblpvZE9iamVjdC5zdHJpY3RDcmVhdGUgPSAoc2hhcGUsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHtcbiAgICAgICAgc2hhcGU6ICgpID0+IHNoYXBlLFxuICAgICAgICB1bmtub3duS2V5czogXCJzdHJpY3RcIixcbiAgICAgICAgY2F0Y2hhbGw6IFpvZE5ldmVyLmNyZWF0ZSgpLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE9iamVjdCxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcblpvZE9iamVjdC5sYXp5Y3JlYXRlID0gKHNoYXBlLCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZE9iamVjdCh7XG4gICAgICAgIHNoYXBlLFxuICAgICAgICB1bmtub3duS2V5czogXCJzdHJpcFwiLFxuICAgICAgICBjYXRjaGFsbDogWm9kTmV2ZXIuY3JlYXRlKCksXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kT2JqZWN0LFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuZXhwb3J0IGNsYXNzIFpvZFVuaW9uIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpO1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5fZGVmLm9wdGlvbnM7XG4gICAgICAgIGZ1bmN0aW9uIGhhbmRsZVJlc3VsdHMocmVzdWx0cykge1xuICAgICAgICAgICAgLy8gcmV0dXJuIGZpcnN0IGlzc3VlLWZyZWUgdmFsaWRhdGlvbiBpZiBpdCBleGlzdHNcbiAgICAgICAgICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnJlc3VsdC5zdGF0dXMgPT09IFwidmFsaWRcIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LnJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXN1bHRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5yZXN1bHQuc3RhdHVzID09PSBcImRpcnR5XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gYWRkIGlzc3VlcyBmcm9tIGRpcnR5IG9wdGlvblxuICAgICAgICAgICAgICAgICAgICBjdHguY29tbW9uLmlzc3Vlcy5wdXNoKC4uLnJlc3VsdC5jdHguY29tbW9uLmlzc3Vlcyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQucmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHJldHVybiBpbnZhbGlkXG4gICAgICAgICAgICBjb25zdCB1bmlvbkVycm9ycyA9IHJlc3VsdHMubWFwKChyZXN1bHQpID0+IG5ldyBab2RFcnJvcihyZXN1bHQuY3R4LmNvbW1vbi5pc3N1ZXMpKTtcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3VuaW9uLFxuICAgICAgICAgICAgICAgIHVuaW9uRXJyb3JzLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY3R4LmNvbW1vbi5hc3luYykge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKG9wdGlvbnMubWFwKGFzeW5jIChvcHRpb24pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZEN0eCA9IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uY3R4LFxuICAgICAgICAgICAgICAgICAgICBjb21tb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN0eC5jb21tb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBpc3N1ZXM6IFtdLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IG51bGwsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQ6IGF3YWl0IG9wdGlvbi5fcGFyc2VBc3luYyh7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBjdHguZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBjaGlsZEN0eCxcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgIGN0eDogY2hpbGRDdHgsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pKS50aGVuKGhhbmRsZVJlc3VsdHMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IGRpcnR5ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgaXNzdWVzID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiBvcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hpbGRDdHggPSB7XG4gICAgICAgICAgICAgICAgICAgIC4uLmN0eCxcbiAgICAgICAgICAgICAgICAgICAgY29tbW9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5jdHguY29tbW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNzdWVzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBudWxsLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gb3B0aW9uLl9wYXJzZVN5bmMoe1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiBjdHguZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudDogY2hpbGRDdHgsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IFwidmFsaWRcIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXN1bHQuc3RhdHVzID09PSBcImRpcnR5XCIgJiYgIWRpcnR5KSB7XG4gICAgICAgICAgICAgICAgICAgIGRpcnR5ID0geyByZXN1bHQsIGN0eDogY2hpbGRDdHggfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkQ3R4LmNvbW1vbi5pc3N1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlzc3Vlcy5wdXNoKGNoaWxkQ3R4LmNvbW1vbi5pc3N1ZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkaXJ0eSkge1xuICAgICAgICAgICAgICAgIGN0eC5jb21tb24uaXNzdWVzLnB1c2goLi4uZGlydHkuY3R4LmNvbW1vbi5pc3N1ZXMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBkaXJ0eS5yZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB1bmlvbkVycm9ycyA9IGlzc3Vlcy5tYXAoKGlzc3VlcykgPT4gbmV3IFpvZEVycm9yKGlzc3VlcykpO1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdW5pb24sXG4gICAgICAgICAgICAgICAgdW5pb25FcnJvcnMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBvcHRpb25zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLm9wdGlvbnM7XG4gICAgfVxufVxuWm9kVW5pb24uY3JlYXRlID0gKHR5cGVzLCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZFVuaW9uKHtcbiAgICAgICAgb3B0aW9uczogdHlwZXMsXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kVW5pb24sXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vLy8vLy8vLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8vLy8vLy8vXG4vLy8vLy8vLy8vICAgICAgWm9kRGlzY3JpbWluYXRlZFVuaW9uICAgICAgLy8vLy8vLy8vL1xuLy8vLy8vLy8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLy8vLy8vLy9cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuY29uc3QgZ2V0RGlzY3JpbWluYXRvciA9ICh0eXBlKSA9PiB7XG4gICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBab2RMYXp5KSB7XG4gICAgICAgIHJldHVybiBnZXREaXNjcmltaW5hdG9yKHR5cGUuc2NoZW1hKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIFpvZEVmZmVjdHMpIHtcbiAgICAgICAgcmV0dXJuIGdldERpc2NyaW1pbmF0b3IodHlwZS5pbm5lclR5cGUoKSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBab2RMaXRlcmFsKSB7XG4gICAgICAgIHJldHVybiBbdHlwZS52YWx1ZV07XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBab2RFbnVtKSB7XG4gICAgICAgIHJldHVybiB0eXBlLm9wdGlvbnM7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBab2ROYXRpdmVFbnVtKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBiYW4vYmFuXG4gICAgICAgIHJldHVybiB1dGlsLm9iamVjdFZhbHVlcyh0eXBlLmVudW0pO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgWm9kRGVmYXVsdCkge1xuICAgICAgICByZXR1cm4gZ2V0RGlzY3JpbWluYXRvcih0eXBlLl9kZWYuaW5uZXJUeXBlKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIFpvZFVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gW3VuZGVmaW5lZF07XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBab2ROdWxsKSB7XG4gICAgICAgIHJldHVybiBbbnVsbF07XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBab2RPcHRpb25hbCkge1xuICAgICAgICByZXR1cm4gW3VuZGVmaW5lZCwgLi4uZ2V0RGlzY3JpbWluYXRvcih0eXBlLnVud3JhcCgpKV07XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBab2ROdWxsYWJsZSkge1xuICAgICAgICByZXR1cm4gW251bGwsIC4uLmdldERpc2NyaW1pbmF0b3IodHlwZS51bndyYXAoKSldO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgWm9kQnJhbmRlZCkge1xuICAgICAgICByZXR1cm4gZ2V0RGlzY3JpbWluYXRvcih0eXBlLnVud3JhcCgpKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIFpvZFJlYWRvbmx5KSB7XG4gICAgICAgIHJldHVybiBnZXREaXNjcmltaW5hdG9yKHR5cGUudW53cmFwKCkpO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgWm9kQ2F0Y2gpIHtcbiAgICAgICAgcmV0dXJuIGdldERpc2NyaW1pbmF0b3IodHlwZS5fZGVmLmlubmVyVHlwZSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxufTtcbmV4cG9ydCBjbGFzcyBab2REaXNjcmltaW5hdGVkVW5pb24gZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgeyBjdHggfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhpbnB1dCk7XG4gICAgICAgIGlmIChjdHgucGFyc2VkVHlwZSAhPT0gWm9kUGFyc2VkVHlwZS5vYmplY3QpIHtcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IFpvZFBhcnNlZFR5cGUub2JqZWN0LFxuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGlzY3JpbWluYXRvciA9IHRoaXMuZGlzY3JpbWluYXRvcjtcbiAgICAgICAgY29uc3QgZGlzY3JpbWluYXRvclZhbHVlID0gY3R4LmRhdGFbZGlzY3JpbWluYXRvcl07XG4gICAgICAgIGNvbnN0IG9wdGlvbiA9IHRoaXMub3B0aW9uc01hcC5nZXQoZGlzY3JpbWluYXRvclZhbHVlKTtcbiAgICAgICAgaWYgKCFvcHRpb24pIHtcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3VuaW9uX2Rpc2NyaW1pbmF0b3IsXG4gICAgICAgICAgICAgICAgb3B0aW9uczogQXJyYXkuZnJvbSh0aGlzLm9wdGlvbnNNYXAua2V5cygpKSxcbiAgICAgICAgICAgICAgICBwYXRoOiBbZGlzY3JpbWluYXRvcl0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjdHguY29tbW9uLmFzeW5jKSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9uLl9wYXJzZUFzeW5jKHtcbiAgICAgICAgICAgICAgICBkYXRhOiBjdHguZGF0YSxcbiAgICAgICAgICAgICAgICBwYXRoOiBjdHgucGF0aCxcbiAgICAgICAgICAgICAgICBwYXJlbnQ6IGN0eCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbi5fcGFyc2VTeW5jKHtcbiAgICAgICAgICAgICAgICBkYXRhOiBjdHguZGF0YSxcbiAgICAgICAgICAgICAgICBwYXRoOiBjdHgucGF0aCxcbiAgICAgICAgICAgICAgICBwYXJlbnQ6IGN0eCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBkaXNjcmltaW5hdG9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLmRpc2NyaW1pbmF0b3I7XG4gICAgfVxuICAgIGdldCBvcHRpb25zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLm9wdGlvbnM7XG4gICAgfVxuICAgIGdldCBvcHRpb25zTWFwKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLm9wdGlvbnNNYXA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgZGlzY3JpbWluYXRlZCB1bmlvbiBzY2hlbWEuIEl0cyBiZWhhdmlvdXIgaXMgdmVyeSBzaW1pbGFyIHRvIHRoYXQgb2YgdGhlIG5vcm1hbCB6LnVuaW9uKCkgY29uc3RydWN0b3IuXG4gICAgICogSG93ZXZlciwgaXQgb25seSBhbGxvd3MgYSB1bmlvbiBvZiBvYmplY3RzLCBhbGwgb2Ygd2hpY2ggbmVlZCB0byBzaGFyZSBhIGRpc2NyaW1pbmF0b3IgcHJvcGVydHkuIFRoaXMgcHJvcGVydHkgbXVzdFxuICAgICAqIGhhdmUgYSBkaWZmZXJlbnQgdmFsdWUgZm9yIGVhY2ggb2JqZWN0IGluIHRoZSB1bmlvbi5cbiAgICAgKiBAcGFyYW0gZGlzY3JpbWluYXRvciB0aGUgbmFtZSBvZiB0aGUgZGlzY3JpbWluYXRvciBwcm9wZXJ0eVxuICAgICAqIEBwYXJhbSB0eXBlcyBhbiBhcnJheSBvZiBvYmplY3Qgc2NoZW1hc1xuICAgICAqIEBwYXJhbSBwYXJhbXNcbiAgICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlKGRpc2NyaW1pbmF0b3IsIG9wdGlvbnMsIHBhcmFtcykge1xuICAgICAgICAvLyBHZXQgYWxsIHRoZSB2YWxpZCBkaXNjcmltaW5hdG9yIHZhbHVlc1xuICAgICAgICBjb25zdCBvcHRpb25zTWFwID0gbmV3IE1hcCgpO1xuICAgICAgICAvLyB0cnkge1xuICAgICAgICBmb3IgKGNvbnN0IHR5cGUgb2Ygb3B0aW9ucykge1xuICAgICAgICAgICAgY29uc3QgZGlzY3JpbWluYXRvclZhbHVlcyA9IGdldERpc2NyaW1pbmF0b3IodHlwZS5zaGFwZVtkaXNjcmltaW5hdG9yXSk7XG4gICAgICAgICAgICBpZiAoIWRpc2NyaW1pbmF0b3JWYWx1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBIGRpc2NyaW1pbmF0b3IgdmFsdWUgZm9yIGtleSBcXGAke2Rpc2NyaW1pbmF0b3J9XFxgIGNvdWxkIG5vdCBiZSBleHRyYWN0ZWQgZnJvbSBhbGwgc2NoZW1hIG9wdGlvbnNgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgZGlzY3JpbWluYXRvclZhbHVlcykge1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zTWFwLmhhcyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEaXNjcmltaW5hdG9yIHByb3BlcnR5ICR7U3RyaW5nKGRpc2NyaW1pbmF0b3IpfSBoYXMgZHVwbGljYXRlIHZhbHVlICR7U3RyaW5nKHZhbHVlKX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb3B0aW9uc01hcC5zZXQodmFsdWUsIHR5cGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgWm9kRGlzY3JpbWluYXRlZFVuaW9uKHtcbiAgICAgICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kRGlzY3JpbWluYXRlZFVuaW9uLFxuICAgICAgICAgICAgZGlzY3JpbWluYXRvcixcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICBvcHRpb25zTWFwLFxuICAgICAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgICAgICB9KTtcbiAgICB9XG59XG5mdW5jdGlvbiBtZXJnZVZhbHVlcyhhLCBiKSB7XG4gICAgY29uc3QgYVR5cGUgPSBnZXRQYXJzZWRUeXBlKGEpO1xuICAgIGNvbnN0IGJUeXBlID0gZ2V0UGFyc2VkVHlwZShiKTtcbiAgICBpZiAoYSA9PT0gYikge1xuICAgICAgICByZXR1cm4geyB2YWxpZDogdHJ1ZSwgZGF0YTogYSB9O1xuICAgIH1cbiAgICBlbHNlIGlmIChhVHlwZSA9PT0gWm9kUGFyc2VkVHlwZS5vYmplY3QgJiYgYlR5cGUgPT09IFpvZFBhcnNlZFR5cGUub2JqZWN0KSB7XG4gICAgICAgIGNvbnN0IGJLZXlzID0gdXRpbC5vYmplY3RLZXlzKGIpO1xuICAgICAgICBjb25zdCBzaGFyZWRLZXlzID0gdXRpbC5vYmplY3RLZXlzKGEpLmZpbHRlcigoa2V5KSA9PiBiS2V5cy5pbmRleE9mKGtleSkgIT09IC0xKTtcbiAgICAgICAgY29uc3QgbmV3T2JqID0geyAuLi5hLCAuLi5iIH07XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHNoYXJlZEtleXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHNoYXJlZFZhbHVlID0gbWVyZ2VWYWx1ZXMoYVtrZXldLCBiW2tleV0pO1xuICAgICAgICAgICAgaWYgKCFzaGFyZWRWYWx1ZS52YWxpZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbGlkOiBmYWxzZSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmV3T2JqW2tleV0gPSBzaGFyZWRWYWx1ZS5kYXRhO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHZhbGlkOiB0cnVlLCBkYXRhOiBuZXdPYmogfTtcbiAgICB9XG4gICAgZWxzZSBpZiAoYVR5cGUgPT09IFpvZFBhcnNlZFR5cGUuYXJyYXkgJiYgYlR5cGUgPT09IFpvZFBhcnNlZFR5cGUuYXJyYXkpIHtcbiAgICAgICAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlIH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmV3QXJyYXkgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGEubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICBjb25zdCBpdGVtQSA9IGFbaW5kZXhdO1xuICAgICAgICAgICAgY29uc3QgaXRlbUIgPSBiW2luZGV4XTtcbiAgICAgICAgICAgIGNvbnN0IHNoYXJlZFZhbHVlID0gbWVyZ2VWYWx1ZXMoaXRlbUEsIGl0ZW1CKTtcbiAgICAgICAgICAgIGlmICghc2hhcmVkVmFsdWUudmFsaWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyB2YWxpZDogZmFsc2UgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5ld0FycmF5LnB1c2goc2hhcmVkVmFsdWUuZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgdmFsaWQ6IHRydWUsIGRhdGE6IG5ld0FycmF5IH07XG4gICAgfVxuICAgIGVsc2UgaWYgKGFUeXBlID09PSBab2RQYXJzZWRUeXBlLmRhdGUgJiYgYlR5cGUgPT09IFpvZFBhcnNlZFR5cGUuZGF0ZSAmJiArYSA9PT0gK2IpIHtcbiAgICAgICAgcmV0dXJuIHsgdmFsaWQ6IHRydWUsIGRhdGE6IGEgfTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiB7IHZhbGlkOiBmYWxzZSB9O1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBab2RJbnRlcnNlY3Rpb24gZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgeyBzdGF0dXMsIGN0eCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTtcbiAgICAgICAgY29uc3QgaGFuZGxlUGFyc2VkID0gKHBhcnNlZExlZnQsIHBhcnNlZFJpZ2h0KSA9PiB7XG4gICAgICAgICAgICBpZiAoaXNBYm9ydGVkKHBhcnNlZExlZnQpIHx8IGlzQWJvcnRlZChwYXJzZWRSaWdodCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG1lcmdlZCA9IG1lcmdlVmFsdWVzKHBhcnNlZExlZnQudmFsdWUsIHBhcnNlZFJpZ2h0LnZhbHVlKTtcbiAgICAgICAgICAgIGlmICghbWVyZ2VkLnZhbGlkKSB7XG4gICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX2ludGVyc2VjdGlvbl90eXBlcyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc0RpcnR5KHBhcnNlZExlZnQpIHx8IGlzRGlydHkocGFyc2VkUmlnaHQpKSB7XG4gICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyBzdGF0dXM6IHN0YXR1cy52YWx1ZSwgdmFsdWU6IG1lcmdlZC5kYXRhIH07XG4gICAgICAgIH07XG4gICAgICAgIGlmIChjdHguY29tbW9uLmFzeW5jKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICAgIHRoaXMuX2RlZi5sZWZ0Ll9wYXJzZUFzeW5jKHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogY3R4LmRhdGEsXG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IGN0eCxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICB0aGlzLl9kZWYucmlnaHQuX3BhcnNlQXN5bmMoe1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiBjdHguZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudDogY3R4LFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgXSkudGhlbigoW2xlZnQsIHJpZ2h0XSkgPT4gaGFuZGxlUGFyc2VkKGxlZnQsIHJpZ2h0KSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlUGFyc2VkKHRoaXMuX2RlZi5sZWZ0Ll9wYXJzZVN5bmMoe1xuICAgICAgICAgICAgICAgIGRhdGE6IGN0eC5kYXRhLFxuICAgICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgICAgIHBhcmVudDogY3R4LFxuICAgICAgICAgICAgfSksIHRoaXMuX2RlZi5yaWdodC5fcGFyc2VTeW5jKHtcbiAgICAgICAgICAgICAgICBkYXRhOiBjdHguZGF0YSxcbiAgICAgICAgICAgICAgICBwYXRoOiBjdHgucGF0aCxcbiAgICAgICAgICAgICAgICBwYXJlbnQ6IGN0eCxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblpvZEludGVyc2VjdGlvbi5jcmVhdGUgPSAobGVmdCwgcmlnaHQsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kSW50ZXJzZWN0aW9uKHtcbiAgICAgICAgbGVmdDogbGVmdCxcbiAgICAgICAgcmlnaHQ6IHJpZ2h0LFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEludGVyc2VjdGlvbixcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbi8vIHR5cGUgWm9kVHVwbGVJdGVtcyA9IFtab2RUeXBlQW55LCAuLi5ab2RUeXBlQW55W11dO1xuZXhwb3J0IGNsYXNzIFpvZFR1cGxlIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHsgc3RhdHVzLCBjdHggfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhpbnB1dCk7XG4gICAgICAgIGlmIChjdHgucGFyc2VkVHlwZSAhPT0gWm9kUGFyc2VkVHlwZS5hcnJheSkge1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS5hcnJheSxcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjdHguZGF0YS5sZW5ndGggPCB0aGlzLl9kZWYuaXRlbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUudG9vX3NtYWxsLFxuICAgICAgICAgICAgICAgIG1pbmltdW06IHRoaXMuX2RlZi5pdGVtcy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGV4YWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3QgPSB0aGlzLl9kZWYucmVzdDtcbiAgICAgICAgaWYgKCFyZXN0ICYmIGN0eC5kYXRhLmxlbmd0aCA+IHRoaXMuX2RlZi5pdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS50b29fYmlnLFxuICAgICAgICAgICAgICAgIG1heGltdW06IHRoaXMuX2RlZi5pdGVtcy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGV4YWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gWy4uLmN0eC5kYXRhXVxuICAgICAgICAgICAgLm1hcCgoaXRlbSwgaXRlbUluZGV4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzY2hlbWEgPSB0aGlzLl9kZWYuaXRlbXNbaXRlbUluZGV4XSB8fCB0aGlzLl9kZWYucmVzdDtcbiAgICAgICAgICAgIGlmICghc2NoZW1hKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHNjaGVtYS5fcGFyc2UobmV3IFBhcnNlSW5wdXRMYXp5UGF0aChjdHgsIGl0ZW0sIGN0eC5wYXRoLCBpdGVtSW5kZXgpKTtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5maWx0ZXIoKHgpID0+ICEheCk7IC8vIGZpbHRlciBudWxsc1xuICAgICAgICBpZiAoY3R4LmNvbW1vbi5hc3luYykge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKGl0ZW1zKS50aGVuKChyZXN1bHRzKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFBhcnNlU3RhdHVzLm1lcmdlQXJyYXkoc3RhdHVzLCByZXN1bHRzKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFBhcnNlU3RhdHVzLm1lcmdlQXJyYXkoc3RhdHVzLCBpdGVtcyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IGl0ZW1zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLml0ZW1zO1xuICAgIH1cbiAgICByZXN0KHJlc3QpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RUdXBsZSh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICByZXN0LFxuICAgICAgICB9KTtcbiAgICB9XG59XG5ab2RUdXBsZS5jcmVhdGUgPSAoc2NoZW1hcywgcGFyYW1zKSA9PiB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHNjaGVtYXMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIllvdSBtdXN0IHBhc3MgYW4gYXJyYXkgb2Ygc2NoZW1hcyB0byB6LnR1cGxlKFsgLi4uIF0pXCIpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFpvZFR1cGxlKHtcbiAgICAgICAgaXRlbXM6IHNjaGVtYXMsXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kVHVwbGUsXG4gICAgICAgIHJlc3Q6IG51bGwsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5leHBvcnQgY2xhc3MgWm9kUmVjb3JkIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgZ2V0IGtleVNjaGVtYSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5rZXlUeXBlO1xuICAgIH1cbiAgICBnZXQgdmFsdWVTY2hlbWEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYudmFsdWVUeXBlO1xuICAgIH1cbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgeyBzdGF0dXMsIGN0eCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTtcbiAgICAgICAgaWYgKGN0eC5wYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLm9iamVjdCkge1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS5vYmplY3QsXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYWlycyA9IFtdO1xuICAgICAgICBjb25zdCBrZXlUeXBlID0gdGhpcy5fZGVmLmtleVR5cGU7XG4gICAgICAgIGNvbnN0IHZhbHVlVHlwZSA9IHRoaXMuX2RlZi52YWx1ZVR5cGU7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGN0eC5kYXRhKSB7XG4gICAgICAgICAgICBwYWlycy5wdXNoKHtcbiAgICAgICAgICAgICAgICBrZXk6IGtleVR5cGUuX3BhcnNlKG5ldyBQYXJzZUlucHV0TGF6eVBhdGgoY3R4LCBrZXksIGN0eC5wYXRoLCBrZXkpKSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWVUeXBlLl9wYXJzZShuZXcgUGFyc2VJbnB1dExhenlQYXRoKGN0eCwgY3R4LmRhdGFba2V5XSwgY3R4LnBhdGgsIGtleSkpLFxuICAgICAgICAgICAgICAgIGFsd2F5c1NldDoga2V5IGluIGN0eC5kYXRhLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGN0eC5jb21tb24uYXN5bmMpIHtcbiAgICAgICAgICAgIHJldHVybiBQYXJzZVN0YXR1cy5tZXJnZU9iamVjdEFzeW5jKHN0YXR1cywgcGFpcnMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFBhcnNlU3RhdHVzLm1lcmdlT2JqZWN0U3luYyhzdGF0dXMsIHBhaXJzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgZWxlbWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi52YWx1ZVR5cGU7XG4gICAgfVxuICAgIHN0YXRpYyBjcmVhdGUoZmlyc3QsIHNlY29uZCwgdGhpcmQpIHtcbiAgICAgICAgaWYgKHNlY29uZCBpbnN0YW5jZW9mIFpvZFR5cGUpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgWm9kUmVjb3JkKHtcbiAgICAgICAgICAgICAgICBrZXlUeXBlOiBmaXJzdCxcbiAgICAgICAgICAgICAgICB2YWx1ZVR5cGU6IHNlY29uZCxcbiAgICAgICAgICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZFJlY29yZCxcbiAgICAgICAgICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHRoaXJkKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgWm9kUmVjb3JkKHtcbiAgICAgICAgICAgIGtleVR5cGU6IFpvZFN0cmluZy5jcmVhdGUoKSxcbiAgICAgICAgICAgIHZhbHVlVHlwZTogZmlyc3QsXG4gICAgICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZFJlY29yZCxcbiAgICAgICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMoc2Vjb25kKSxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIFpvZE1hcCBleHRlbmRzIFpvZFR5cGUge1xuICAgIGdldCBrZXlTY2hlbWEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYua2V5VHlwZTtcbiAgICB9XG4gICAgZ2V0IHZhbHVlU2NoZW1hKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLnZhbHVlVHlwZTtcbiAgICB9XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHsgc3RhdHVzLCBjdHggfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhpbnB1dCk7XG4gICAgICAgIGlmIChjdHgucGFyc2VkVHlwZSAhPT0gWm9kUGFyc2VkVHlwZS5tYXApIHtcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IFpvZFBhcnNlZFR5cGUubWFwLFxuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qga2V5VHlwZSA9IHRoaXMuX2RlZi5rZXlUeXBlO1xuICAgICAgICBjb25zdCB2YWx1ZVR5cGUgPSB0aGlzLl9kZWYudmFsdWVUeXBlO1xuICAgICAgICBjb25zdCBwYWlycyA9IFsuLi5jdHguZGF0YS5lbnRyaWVzKCldLm1hcCgoW2tleSwgdmFsdWVdLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBrZXk6IGtleVR5cGUuX3BhcnNlKG5ldyBQYXJzZUlucHV0TGF6eVBhdGgoY3R4LCBrZXksIGN0eC5wYXRoLCBbaW5kZXgsIFwia2V5XCJdKSksXG4gICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlVHlwZS5fcGFyc2UobmV3IFBhcnNlSW5wdXRMYXp5UGF0aChjdHgsIHZhbHVlLCBjdHgucGF0aCwgW2luZGV4LCBcInZhbHVlXCJdKSksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGN0eC5jb21tb24uYXN5bmMpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpbmFsTWFwID0gbmV3IE1hcCgpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcGFpciBvZiBwYWlycykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSBhd2FpdCBwYWlyLmtleTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCBwYWlyLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoa2V5LnN0YXR1cyA9PT0gXCJhYm9ydGVkXCIgfHwgdmFsdWUuc3RhdHVzID09PSBcImFib3J0ZWRcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGtleS5zdGF0dXMgPT09IFwiZGlydHlcIiB8fCB2YWx1ZS5zdGF0dXMgPT09IFwiZGlydHlcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZmluYWxNYXAuc2V0KGtleS52YWx1ZSwgdmFsdWUudmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4geyBzdGF0dXM6IHN0YXR1cy52YWx1ZSwgdmFsdWU6IGZpbmFsTWFwIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGZpbmFsTWFwID0gbmV3IE1hcCgpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBwYWlyIG9mIHBhaXJzKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gcGFpci5rZXk7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBwYWlyLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmIChrZXkuc3RhdHVzID09PSBcImFib3J0ZWRcIiB8fCB2YWx1ZS5zdGF0dXMgPT09IFwiYWJvcnRlZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoa2V5LnN0YXR1cyA9PT0gXCJkaXJ0eVwiIHx8IHZhbHVlLnN0YXR1cyA9PT0gXCJkaXJ0eVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmaW5hbE1hcC5zZXQoa2V5LnZhbHVlLCB2YWx1ZS52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyBzdGF0dXM6IHN0YXR1cy52YWx1ZSwgdmFsdWU6IGZpbmFsTWFwIH07XG4gICAgICAgIH1cbiAgICB9XG59XG5ab2RNYXAuY3JlYXRlID0gKGtleVR5cGUsIHZhbHVlVHlwZSwgcGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2RNYXAoe1xuICAgICAgICB2YWx1ZVR5cGUsXG4gICAgICAgIGtleVR5cGUsXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kTWFwLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuZXhwb3J0IGNsYXNzIFpvZFNldCBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCB7IHN0YXR1cywgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpO1xuICAgICAgICBpZiAoY3R4LnBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUuc2V0KSB7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLnNldCxcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRlZiA9IHRoaXMuX2RlZjtcbiAgICAgICAgaWYgKGRlZi5taW5TaXplICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoY3R4LmRhdGEuc2l6ZSA8IGRlZi5taW5TaXplLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS50b29fc21hbGwsXG4gICAgICAgICAgICAgICAgICAgIG1pbmltdW06IGRlZi5taW5TaXplLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInNldFwiLFxuICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGV4YWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZGVmLm1pblNpemUubWVzc2FnZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVmLm1heFNpemUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChjdHguZGF0YS5zaXplID4gZGVmLm1heFNpemUudmFsdWUpIHtcbiAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLnRvb19iaWcsXG4gICAgICAgICAgICAgICAgICAgIG1heGltdW06IGRlZi5tYXhTaXplLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInNldFwiLFxuICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGV4YWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZGVmLm1heFNpemUubWVzc2FnZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2YWx1ZVR5cGUgPSB0aGlzLl9kZWYudmFsdWVUeXBlO1xuICAgICAgICBmdW5jdGlvbiBmaW5hbGl6ZVNldChlbGVtZW50cykge1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkU2V0ID0gbmV3IFNldCgpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuc3RhdHVzID09PSBcImFib3J0ZWRcIilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuc3RhdHVzID09PSBcImRpcnR5XCIpXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIHBhcnNlZFNldC5hZGQoZWxlbWVudC52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyBzdGF0dXM6IHN0YXR1cy52YWx1ZSwgdmFsdWU6IHBhcnNlZFNldCB9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gWy4uLmN0eC5kYXRhLnZhbHVlcygpXS5tYXAoKGl0ZW0sIGkpID0+IHZhbHVlVHlwZS5fcGFyc2UobmV3IFBhcnNlSW5wdXRMYXp5UGF0aChjdHgsIGl0ZW0sIGN0eC5wYXRoLCBpKSkpO1xuICAgICAgICBpZiAoY3R4LmNvbW1vbi5hc3luYykge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKGVsZW1lbnRzKS50aGVuKChlbGVtZW50cykgPT4gZmluYWxpemVTZXQoZWxlbWVudHMpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmaW5hbGl6ZVNldChlbGVtZW50cyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbWluKG1pblNpemUsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RTZXQoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgbWluU2l6ZTogeyB2YWx1ZTogbWluU2l6ZSwgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpIH0sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBtYXgobWF4U2l6ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZFNldCh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBtYXhTaXplOiB7IHZhbHVlOiBtYXhTaXplLCBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkgfSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHNpemUoc2l6ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5taW4oc2l6ZSwgbWVzc2FnZSkubWF4KHNpemUsIG1lc3NhZ2UpO1xuICAgIH1cbiAgICBub25lbXB0eShtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbigxLCBtZXNzYWdlKTtcbiAgICB9XG59XG5ab2RTZXQuY3JlYXRlID0gKHZhbHVlVHlwZSwgcGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2RTZXQoe1xuICAgICAgICB2YWx1ZVR5cGUsXG4gICAgICAgIG1pblNpemU6IG51bGwsXG4gICAgICAgIG1heFNpemU6IG51bGwsXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kU2V0LFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuZXhwb3J0IGNsYXNzIFpvZEZ1bmN0aW9uIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMudmFsaWRhdGUgPSB0aGlzLmltcGxlbWVudDtcbiAgICB9XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpO1xuICAgICAgICBpZiAoY3R4LnBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUuZnVuY3Rpb24pIHtcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IFpvZFBhcnNlZFR5cGUuZnVuY3Rpb24sXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBtYWtlQXJnc0lzc3VlKGFyZ3MsIGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gbWFrZUlzc3VlKHtcbiAgICAgICAgICAgICAgICBkYXRhOiBhcmdzLFxuICAgICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgICAgIGVycm9yTWFwczogW2N0eC5jb21tb24uY29udGV4dHVhbEVycm9yTWFwLCBjdHguc2NoZW1hRXJyb3JNYXAsIGdldEVycm9yTWFwKCksIGRlZmF1bHRFcnJvck1hcF0uZmlsdGVyKCh4KSA9PiAhIXgpLFxuICAgICAgICAgICAgICAgIGlzc3VlRGF0YToge1xuICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9hcmd1bWVudHMsXG4gICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50c0Vycm9yOiBlcnJvcixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gbWFrZVJldHVybnNJc3N1ZShyZXR1cm5zLCBlcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIG1ha2VJc3N1ZSh7XG4gICAgICAgICAgICAgICAgZGF0YTogcmV0dXJucyxcbiAgICAgICAgICAgICAgICBwYXRoOiBjdHgucGF0aCxcbiAgICAgICAgICAgICAgICBlcnJvck1hcHM6IFtjdHguY29tbW9uLmNvbnRleHR1YWxFcnJvck1hcCwgY3R4LnNjaGVtYUVycm9yTWFwLCBnZXRFcnJvck1hcCgpLCBkZWZhdWx0RXJyb3JNYXBdLmZpbHRlcigoeCkgPT4gISF4KSxcbiAgICAgICAgICAgICAgICBpc3N1ZURhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfcmV0dXJuX3R5cGUsXG4gICAgICAgICAgICAgICAgICAgIHJldHVyblR5cGVFcnJvcjogZXJyb3IsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IHsgZXJyb3JNYXA6IGN0eC5jb21tb24uY29udGV4dHVhbEVycm9yTWFwIH07XG4gICAgICAgIGNvbnN0IGZuID0gY3R4LmRhdGE7XG4gICAgICAgIGlmICh0aGlzLl9kZWYucmV0dXJucyBpbnN0YW5jZW9mIFpvZFByb21pc2UpIHtcbiAgICAgICAgICAgIC8vIFdvdWxkIGxvdmUgYSB3YXkgdG8gYXZvaWQgZGlzYWJsaW5nIHRoaXMgcnVsZSwgYnV0IHdlIG5lZWRcbiAgICAgICAgICAgIC8vIGFuIGFsaWFzICh1c2luZyBhbiBhcnJvdyBmdW5jdGlvbiB3YXMgd2hhdCBjYXVzZWQgMjY1MSkuXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcbiAgICAgICAgICAgIGNvbnN0IG1lID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBPSyhhc3luYyBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IFpvZEVycm9yKFtdKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWRBcmdzID0gYXdhaXQgbWUuX2RlZi5hcmdzLnBhcnNlQXN5bmMoYXJncywgcGFyYW1zKS5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBlcnJvci5hZGRJc3N1ZShtYWtlQXJnc0lzc3VlKGFyZ3MsIGUpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgUmVmbGVjdC5hcHBseShmbiwgdGhpcywgcGFyc2VkQXJncyk7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkUmV0dXJucyA9IGF3YWl0IG1lLl9kZWYucmV0dXJucy5fZGVmLnR5cGVcbiAgICAgICAgICAgICAgICAgICAgLnBhcnNlQXN5bmMocmVzdWx0LCBwYXJhbXMpXG4gICAgICAgICAgICAgICAgICAgIC5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBlcnJvci5hZGRJc3N1ZShtYWtlUmV0dXJuc0lzc3VlKHJlc3VsdCwgZSkpO1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VkUmV0dXJucztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gV291bGQgbG92ZSBhIHdheSB0byBhdm9pZCBkaXNhYmxpbmcgdGhpcyBydWxlLCBidXQgd2UgbmVlZFxuICAgICAgICAgICAgLy8gYW4gYWxpYXMgKHVzaW5nIGFuIGFycm93IGZ1bmN0aW9uIHdhcyB3aGF0IGNhdXNlZCAyNjUxKS5cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuICAgICAgICAgICAgY29uc3QgbWUgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIE9LKGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkQXJncyA9IG1lLl9kZWYuYXJncy5zYWZlUGFyc2UoYXJncywgcGFyYW1zKTtcbiAgICAgICAgICAgICAgICBpZiAoIXBhcnNlZEFyZ3Muc3VjY2Vzcykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWm9kRXJyb3IoW21ha2VBcmdzSXNzdWUoYXJncywgcGFyc2VkQXJncy5lcnJvcildKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gUmVmbGVjdC5hcHBseShmbiwgdGhpcywgcGFyc2VkQXJncy5kYXRhKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWRSZXR1cm5zID0gbWUuX2RlZi5yZXR1cm5zLnNhZmVQYXJzZShyZXN1bHQsIHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgaWYgKCFwYXJzZWRSZXR1cm5zLnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFpvZEVycm9yKFttYWtlUmV0dXJuc0lzc3VlKHJlc3VsdCwgcGFyc2VkUmV0dXJucy5lcnJvcildKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlZFJldHVybnMuZGF0YTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHBhcmFtZXRlcnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYuYXJncztcbiAgICB9XG4gICAgcmV0dXJuVHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5yZXR1cm5zO1xuICAgIH1cbiAgICBhcmdzKC4uLml0ZW1zKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kRnVuY3Rpb24oe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgYXJnczogWm9kVHVwbGUuY3JlYXRlKGl0ZW1zKS5yZXN0KFpvZFVua25vd24uY3JlYXRlKCkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJucyhyZXR1cm5UeXBlKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kRnVuY3Rpb24oe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgcmV0dXJuczogcmV0dXJuVHlwZSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGltcGxlbWVudChmdW5jKSB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRlZEZ1bmMgPSB0aGlzLnBhcnNlKGZ1bmMpO1xuICAgICAgICByZXR1cm4gdmFsaWRhdGVkRnVuYztcbiAgICB9XG4gICAgc3RyaWN0SW1wbGVtZW50KGZ1bmMpIHtcbiAgICAgICAgY29uc3QgdmFsaWRhdGVkRnVuYyA9IHRoaXMucGFyc2UoZnVuYyk7XG4gICAgICAgIHJldHVybiB2YWxpZGF0ZWRGdW5jO1xuICAgIH1cbiAgICBzdGF0aWMgY3JlYXRlKGFyZ3MsIHJldHVybnMsIHBhcmFtcykge1xuICAgICAgICByZXR1cm4gbmV3IFpvZEZ1bmN0aW9uKHtcbiAgICAgICAgICAgIGFyZ3M6IChhcmdzID8gYXJncyA6IFpvZFR1cGxlLmNyZWF0ZShbXSkucmVzdChab2RVbmtub3duLmNyZWF0ZSgpKSksXG4gICAgICAgICAgICByZXR1cm5zOiByZXR1cm5zIHx8IFpvZFVua25vd24uY3JlYXRlKCksXG4gICAgICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEZ1bmN0aW9uLFxuICAgICAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgICAgICB9KTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgWm9kTGF6eSBleHRlbmRzIFpvZFR5cGUge1xuICAgIGdldCBzY2hlbWEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYuZ2V0dGVyKCk7XG4gICAgfVxuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTtcbiAgICAgICAgY29uc3QgbGF6eVNjaGVtYSA9IHRoaXMuX2RlZi5nZXR0ZXIoKTtcbiAgICAgICAgcmV0dXJuIGxhenlTY2hlbWEuX3BhcnNlKHsgZGF0YTogY3R4LmRhdGEsIHBhdGg6IGN0eC5wYXRoLCBwYXJlbnQ6IGN0eCB9KTtcbiAgICB9XG59XG5ab2RMYXp5LmNyZWF0ZSA9IChnZXR0ZXIsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kTGF6eSh7XG4gICAgICAgIGdldHRlcjogZ2V0dGVyLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZExhenksXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5leHBvcnQgY2xhc3MgWm9kTGl0ZXJhbCBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBpZiAoaW5wdXQuZGF0YSAhPT0gdGhpcy5fZGVmLnZhbHVlKSB7XG4gICAgICAgICAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LmRhdGEsXG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfbGl0ZXJhbCxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogdGhpcy5fZGVmLnZhbHVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBzdGF0dXM6IFwidmFsaWRcIiwgdmFsdWU6IGlucHV0LmRhdGEgfTtcbiAgICB9XG4gICAgZ2V0IHZhbHVlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLnZhbHVlO1xuICAgIH1cbn1cblpvZExpdGVyYWwuY3JlYXRlID0gKHZhbHVlLCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZExpdGVyYWwoe1xuICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kTGl0ZXJhbCxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmZ1bmN0aW9uIGNyZWF0ZVpvZEVudW0odmFsdWVzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IFpvZEVudW0oe1xuICAgICAgICB2YWx1ZXMsXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kRW51bSxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufVxuZXhwb3J0IGNsYXNzIFpvZEVudW0gZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBpbnB1dC5kYXRhICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7XG4gICAgICAgICAgICBjb25zdCBleHBlY3RlZFZhbHVlcyA9IHRoaXMuX2RlZi52YWx1ZXM7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogdXRpbC5qb2luVmFsdWVzKGV4cGVjdGVkVmFsdWVzKSxcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLl9jYWNoZSkge1xuICAgICAgICAgICAgdGhpcy5fY2FjaGUgPSBuZXcgU2V0KHRoaXMuX2RlZi52YWx1ZXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5fY2FjaGUuaGFzKGlucHV0LmRhdGEpKSB7XG4gICAgICAgICAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7XG4gICAgICAgICAgICBjb25zdCBleHBlY3RlZFZhbHVlcyA9IHRoaXMuX2RlZi52YWx1ZXM7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LmRhdGEsXG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfZW51bV92YWx1ZSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBleHBlY3RlZFZhbHVlcyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE9LKGlucHV0LmRhdGEpO1xuICAgIH1cbiAgICBnZXQgb3B0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi52YWx1ZXM7XG4gICAgfVxuICAgIGdldCBlbnVtKCkge1xuICAgICAgICBjb25zdCBlbnVtVmFsdWVzID0ge307XG4gICAgICAgIGZvciAoY29uc3QgdmFsIG9mIHRoaXMuX2RlZi52YWx1ZXMpIHtcbiAgICAgICAgICAgIGVudW1WYWx1ZXNbdmFsXSA9IHZhbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZW51bVZhbHVlcztcbiAgICB9XG4gICAgZ2V0IFZhbHVlcygpIHtcbiAgICAgICAgY29uc3QgZW51bVZhbHVlcyA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IHZhbCBvZiB0aGlzLl9kZWYudmFsdWVzKSB7XG4gICAgICAgICAgICBlbnVtVmFsdWVzW3ZhbF0gPSB2YWw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVudW1WYWx1ZXM7XG4gICAgfVxuICAgIGdldCBFbnVtKCkge1xuICAgICAgICBjb25zdCBlbnVtVmFsdWVzID0ge307XG4gICAgICAgIGZvciAoY29uc3QgdmFsIG9mIHRoaXMuX2RlZi52YWx1ZXMpIHtcbiAgICAgICAgICAgIGVudW1WYWx1ZXNbdmFsXSA9IHZhbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZW51bVZhbHVlcztcbiAgICB9XG4gICAgZXh0cmFjdCh2YWx1ZXMsIG5ld0RlZiA9IHRoaXMuX2RlZikge1xuICAgICAgICByZXR1cm4gWm9kRW51bS5jcmVhdGUodmFsdWVzLCB7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICAuLi5uZXdEZWYsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBleGNsdWRlKHZhbHVlcywgbmV3RGVmID0gdGhpcy5fZGVmKSB7XG4gICAgICAgIHJldHVybiBab2RFbnVtLmNyZWF0ZSh0aGlzLm9wdGlvbnMuZmlsdGVyKChvcHQpID0+ICF2YWx1ZXMuaW5jbHVkZXMob3B0KSksIHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIC4uLm5ld0RlZixcbiAgICAgICAgfSk7XG4gICAgfVxufVxuWm9kRW51bS5jcmVhdGUgPSBjcmVhdGVab2RFbnVtO1xuZXhwb3J0IGNsYXNzIFpvZE5hdGl2ZUVudW0gZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgbmF0aXZlRW51bVZhbHVlcyA9IHV0aWwuZ2V0VmFsaWRFbnVtVmFsdWVzKHRoaXMuX2RlZi52YWx1ZXMpO1xuICAgICAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7XG4gICAgICAgIGlmIChjdHgucGFyc2VkVHlwZSAhPT0gWm9kUGFyc2VkVHlwZS5zdHJpbmcgJiYgY3R4LnBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUubnVtYmVyKSB7XG4gICAgICAgICAgICBjb25zdCBleHBlY3RlZFZhbHVlcyA9IHV0aWwub2JqZWN0VmFsdWVzKG5hdGl2ZUVudW1WYWx1ZXMpO1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IHV0aWwuam9pblZhbHVlcyhleHBlY3RlZFZhbHVlcyksXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5fY2FjaGUpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhY2hlID0gbmV3IFNldCh1dGlsLmdldFZhbGlkRW51bVZhbHVlcyh0aGlzLl9kZWYudmFsdWVzKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLl9jYWNoZS5oYXMoaW5wdXQuZGF0YSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4cGVjdGVkVmFsdWVzID0gdXRpbC5vYmplY3RWYWx1ZXMobmF0aXZlRW51bVZhbHVlcyk7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LmRhdGEsXG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfZW51bV92YWx1ZSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBleHBlY3RlZFZhbHVlcyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE9LKGlucHV0LmRhdGEpO1xuICAgIH1cbiAgICBnZXQgZW51bSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi52YWx1ZXM7XG4gICAgfVxufVxuWm9kTmF0aXZlRW51bS5jcmVhdGUgPSAodmFsdWVzLCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZE5hdGl2ZUVudW0oe1xuICAgICAgICB2YWx1ZXM6IHZhbHVlcyxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2ROYXRpdmVFbnVtLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuZXhwb3J0IGNsYXNzIFpvZFByb21pc2UgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICB1bndyYXAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYudHlwZTtcbiAgICB9XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpO1xuICAgICAgICBpZiAoY3R4LnBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUucHJvbWlzZSAmJiBjdHguY29tbW9uLmFzeW5jID09PSBmYWxzZSkge1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS5wcm9taXNlLFxuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJvbWlzaWZpZWQgPSBjdHgucGFyc2VkVHlwZSA9PT0gWm9kUGFyc2VkVHlwZS5wcm9taXNlID8gY3R4LmRhdGEgOiBQcm9taXNlLnJlc29sdmUoY3R4LmRhdGEpO1xuICAgICAgICByZXR1cm4gT0socHJvbWlzaWZpZWQudGhlbigoZGF0YSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi50eXBlLnBhcnNlQXN5bmMoZGF0YSwge1xuICAgICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgICAgIGVycm9yTWFwOiBjdHguY29tbW9uLmNvbnRleHR1YWxFcnJvck1hcCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KSk7XG4gICAgfVxufVxuWm9kUHJvbWlzZS5jcmVhdGUgPSAoc2NoZW1hLCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZFByb21pc2Uoe1xuICAgICAgICB0eXBlOiBzY2hlbWEsXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kUHJvbWlzZSxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmV4cG9ydCBjbGFzcyBab2RFZmZlY3RzIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgaW5uZXJUeXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLnNjaGVtYTtcbiAgICB9XG4gICAgc291cmNlVHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5zY2hlbWEuX2RlZi50eXBlTmFtZSA9PT0gWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEVmZmVjdHNcbiAgICAgICAgICAgID8gdGhpcy5fZGVmLnNjaGVtYS5zb3VyY2VUeXBlKClcbiAgICAgICAgICAgIDogdGhpcy5fZGVmLnNjaGVtYTtcbiAgICB9XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHsgc3RhdHVzLCBjdHggfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhpbnB1dCk7XG4gICAgICAgIGNvbnN0IGVmZmVjdCA9IHRoaXMuX2RlZi5lZmZlY3QgfHwgbnVsbDtcbiAgICAgICAgY29uc3QgY2hlY2tDdHggPSB7XG4gICAgICAgICAgICBhZGRJc3N1ZTogKGFyZykgPT4ge1xuICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwgYXJnKTtcbiAgICAgICAgICAgICAgICBpZiAoYXJnLmZhdGFsKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5hYm9ydCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldCBwYXRoKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjdHgucGF0aDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGNoZWNrQ3R4LmFkZElzc3VlID0gY2hlY2tDdHguYWRkSXNzdWUuYmluZChjaGVja0N0eCk7XG4gICAgICAgIGlmIChlZmZlY3QudHlwZSA9PT0gXCJwcmVwcm9jZXNzXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IHByb2Nlc3NlZCA9IGVmZmVjdC50cmFuc2Zvcm0oY3R4LmRhdGEsIGNoZWNrQ3R4KTtcbiAgICAgICAgICAgIGlmIChjdHguY29tbW9uLmFzeW5jKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShwcm9jZXNzZWQpLnRoZW4oYXN5bmMgKHByb2Nlc3NlZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzLnZhbHVlID09PSBcImFib3J0ZWRcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLl9kZWYuc2NoZW1hLl9wYXJzZUFzeW5jKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHByb2Nlc3NlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBjdHgsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gXCJhYm9ydGVkXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IFwiZGlydHlcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBESVJUWShyZXN1bHQudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzLnZhbHVlID09PSBcImRpcnR5XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRElSVFkocmVzdWx0LnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChzdGF0dXMudmFsdWUgPT09IFwiYWJvcnRlZFwiKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9kZWYuc2NoZW1hLl9wYXJzZVN5bmMoe1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiBwcm9jZXNzZWQsXG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IGN0eCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gXCJhYm9ydGVkXCIpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSBcImRpcnR5XCIpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBESVJUWShyZXN1bHQudmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmIChzdGF0dXMudmFsdWUgPT09IFwiZGlydHlcIilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERJUlRZKHJlc3VsdC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZWZmZWN0LnR5cGUgPT09IFwicmVmaW5lbWVudFwiKSB7XG4gICAgICAgICAgICBjb25zdCBleGVjdXRlUmVmaW5lbWVudCA9IChhY2MpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBlZmZlY3QucmVmaW5lbWVudChhY2MsIGNoZWNrQ3R4KTtcbiAgICAgICAgICAgICAgICBpZiAoY3R4LmNvbW1vbi5hc3luYykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkFzeW5jIHJlZmluZW1lbnQgZW5jb3VudGVyZWQgZHVyaW5nIHN5bmNocm9ub3VzIHBhcnNlIG9wZXJhdGlvbi4gVXNlIC5wYXJzZUFzeW5jIGluc3RlYWQuXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChjdHguY29tbW9uLmFzeW5jID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlubmVyID0gdGhpcy5fZGVmLnNjaGVtYS5fcGFyc2VTeW5jKHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogY3R4LmRhdGEsXG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IGN0eCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoaW5uZXIuc3RhdHVzID09PSBcImFib3J0ZWRcIilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgICAgICAgICAgaWYgKGlubmVyLnN0YXR1cyA9PT0gXCJkaXJ0eVwiKVxuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICAvLyByZXR1cm4gdmFsdWUgaXMgaWdub3JlZFxuICAgICAgICAgICAgICAgIGV4ZWN1dGVSZWZpbmVtZW50KGlubmVyLnZhbHVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBzdGF0dXM6IHN0YXR1cy52YWx1ZSwgdmFsdWU6IGlubmVyLnZhbHVlIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZGVmLnNjaGVtYS5fcGFyc2VBc3luYyh7IGRhdGE6IGN0eC5kYXRhLCBwYXRoOiBjdHgucGF0aCwgcGFyZW50OiBjdHggfSkudGhlbigoaW5uZXIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlubmVyLnN0YXR1cyA9PT0gXCJhYm9ydGVkXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlubmVyLnN0YXR1cyA9PT0gXCJkaXJ0eVwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBleGVjdXRlUmVmaW5lbWVudChpbm5lci52YWx1ZSkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBzdGF0dXM6IHN0YXR1cy52YWx1ZSwgdmFsdWU6IGlubmVyLnZhbHVlIH07XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChlZmZlY3QudHlwZSA9PT0gXCJ0cmFuc2Zvcm1cIikge1xuICAgICAgICAgICAgaWYgKGN0eC5jb21tb24uYXN5bmMgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYmFzZSA9IHRoaXMuX2RlZi5zY2hlbWEuX3BhcnNlU3luYyh7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IGN0eC5kYXRhLFxuICAgICAgICAgICAgICAgICAgICBwYXRoOiBjdHgucGF0aCxcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBjdHgsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKCFpc1ZhbGlkKGJhc2UpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBlZmZlY3QudHJhbnNmb3JtKGJhc2UudmFsdWUsIGNoZWNrQ3R4KTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEFzeW5jaHJvbm91cyB0cmFuc2Zvcm0gZW5jb3VudGVyZWQgZHVyaW5nIHN5bmNocm9ub3VzIHBhcnNlIG9wZXJhdGlvbi4gVXNlIC5wYXJzZUFzeW5jIGluc3RlYWQuYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB7IHN0YXR1czogc3RhdHVzLnZhbHVlLCB2YWx1ZTogcmVzdWx0IH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZGVmLnNjaGVtYS5fcGFyc2VBc3luYyh7IGRhdGE6IGN0eC5kYXRhLCBwYXRoOiBjdHgucGF0aCwgcGFyZW50OiBjdHggfSkudGhlbigoYmFzZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzVmFsaWQoYmFzZSkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShlZmZlY3QudHJhbnNmb3JtKGJhc2UudmFsdWUsIGNoZWNrQ3R4KSkudGhlbigocmVzdWx0KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiBzdGF0dXMudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogcmVzdWx0LFxuICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdXRpbC5hc3NlcnROZXZlcihlZmZlY3QpO1xuICAgIH1cbn1cblpvZEVmZmVjdHMuY3JlYXRlID0gKHNjaGVtYSwgZWZmZWN0LCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZEVmZmVjdHMoe1xuICAgICAgICBzY2hlbWEsXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kRWZmZWN0cyxcbiAgICAgICAgZWZmZWN0LFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuWm9kRWZmZWN0cy5jcmVhdGVXaXRoUHJlcHJvY2VzcyA9IChwcmVwcm9jZXNzLCBzY2hlbWEsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kRWZmZWN0cyh7XG4gICAgICAgIHNjaGVtYSxcbiAgICAgICAgZWZmZWN0OiB7IHR5cGU6IFwicHJlcHJvY2Vzc1wiLCB0cmFuc2Zvcm06IHByZXByb2Nlc3MgfSxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RFZmZlY3RzLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuZXhwb3J0IHsgWm9kRWZmZWN0cyBhcyBab2RUcmFuc2Zvcm1lciB9O1xuZXhwb3J0IGNsYXNzIFpvZE9wdGlvbmFsIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFR5cGUgPSB0aGlzLl9nZXRUeXBlKGlucHV0KTtcbiAgICAgICAgaWYgKHBhcnNlZFR5cGUgPT09IFpvZFBhcnNlZFR5cGUudW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gT0sodW5kZWZpbmVkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLmlubmVyVHlwZS5fcGFyc2UoaW5wdXQpO1xuICAgIH1cbiAgICB1bndyYXAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYuaW5uZXJUeXBlO1xuICAgIH1cbn1cblpvZE9wdGlvbmFsLmNyZWF0ZSA9ICh0eXBlLCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZE9wdGlvbmFsKHtcbiAgICAgICAgaW5uZXJUeXBlOiB0eXBlLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE9wdGlvbmFsLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuZXhwb3J0IGNsYXNzIFpvZE51bGxhYmxlIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFR5cGUgPSB0aGlzLl9nZXRUeXBlKGlucHV0KTtcbiAgICAgICAgaWYgKHBhcnNlZFR5cGUgPT09IFpvZFBhcnNlZFR5cGUubnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIE9LKG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYuaW5uZXJUeXBlLl9wYXJzZShpbnB1dCk7XG4gICAgfVxuICAgIHVud3JhcCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5pbm5lclR5cGU7XG4gICAgfVxufVxuWm9kTnVsbGFibGUuY3JlYXRlID0gKHR5cGUsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kTnVsbGFibGUoe1xuICAgICAgICBpbm5lclR5cGU6IHR5cGUsXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kTnVsbGFibGUsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5leHBvcnQgY2xhc3MgWm9kRGVmYXVsdCBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTtcbiAgICAgICAgbGV0IGRhdGEgPSBjdHguZGF0YTtcbiAgICAgICAgaWYgKGN0eC5wYXJzZWRUeXBlID09PSBab2RQYXJzZWRUeXBlLnVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZGF0YSA9IHRoaXMuX2RlZi5kZWZhdWx0VmFsdWUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLmlubmVyVHlwZS5fcGFyc2Uoe1xuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgcGFyZW50OiBjdHgsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZW1vdmVEZWZhdWx0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLmlubmVyVHlwZTtcbiAgICB9XG59XG5ab2REZWZhdWx0LmNyZWF0ZSA9ICh0eXBlLCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZERlZmF1bHQoe1xuICAgICAgICBpbm5lclR5cGU6IHR5cGUsXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kRGVmYXVsdCxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiB0eXBlb2YgcGFyYW1zLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIiA/IHBhcmFtcy5kZWZhdWx0IDogKCkgPT4gcGFyYW1zLmRlZmF1bHQsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5leHBvcnQgY2xhc3MgWm9kQ2F0Y2ggZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgeyBjdHggfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhpbnB1dCk7XG4gICAgICAgIC8vIG5ld0N0eCBpcyB1c2VkIHRvIG5vdCBjb2xsZWN0IGlzc3VlcyBmcm9tIGlubmVyIHR5cGVzIGluIGN0eFxuICAgICAgICBjb25zdCBuZXdDdHggPSB7XG4gICAgICAgICAgICAuLi5jdHgsXG4gICAgICAgICAgICBjb21tb246IHtcbiAgICAgICAgICAgICAgICAuLi5jdHguY29tbW9uLFxuICAgICAgICAgICAgICAgIGlzc3VlczogW10sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9kZWYuaW5uZXJUeXBlLl9wYXJzZSh7XG4gICAgICAgICAgICBkYXRhOiBuZXdDdHguZGF0YSxcbiAgICAgICAgICAgIHBhdGg6IG5ld0N0eC5wYXRoLFxuICAgICAgICAgICAgcGFyZW50OiB7XG4gICAgICAgICAgICAgICAgLi4ubmV3Q3R4LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChpc0FzeW5jKHJlc3VsdCkpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiBcInZhbGlkXCIsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiByZXN1bHQuc3RhdHVzID09PSBcInZhbGlkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID8gcmVzdWx0LnZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuX2RlZi5jYXRjaFZhbHVlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQgZXJyb3IoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWm9kRXJyb3IobmV3Q3R4LmNvbW1vbi5pc3N1ZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IG5ld0N0eC5kYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBzdGF0dXM6IFwidmFsaWRcIixcbiAgICAgICAgICAgICAgICB2YWx1ZTogcmVzdWx0LnN0YXR1cyA9PT0gXCJ2YWxpZFwiXG4gICAgICAgICAgICAgICAgICAgID8gcmVzdWx0LnZhbHVlXG4gICAgICAgICAgICAgICAgICAgIDogdGhpcy5fZGVmLmNhdGNoVmFsdWUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0IGVycm9yKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWm9kRXJyb3IobmV3Q3R4LmNvbW1vbi5pc3N1ZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0OiBuZXdDdHguZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlbW92ZUNhdGNoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLmlubmVyVHlwZTtcbiAgICB9XG59XG5ab2RDYXRjaC5jcmVhdGUgPSAodHlwZSwgcGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2RDYXRjaCh7XG4gICAgICAgIGlubmVyVHlwZTogdHlwZSxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RDYXRjaCxcbiAgICAgICAgY2F0Y2hWYWx1ZTogdHlwZW9mIHBhcmFtcy5jYXRjaCA9PT0gXCJmdW5jdGlvblwiID8gcGFyYW1zLmNhdGNoIDogKCkgPT4gcGFyYW1zLmNhdGNoLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuZXhwb3J0IGNsYXNzIFpvZE5hTiBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCBwYXJzZWRUeXBlID0gdGhpcy5fZ2V0VHlwZShpbnB1dCk7XG4gICAgICAgIGlmIChwYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLm5hbikge1xuICAgICAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpO1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS5uYW4sXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBzdGF0dXM6IFwidmFsaWRcIiwgdmFsdWU6IGlucHV0LmRhdGEgfTtcbiAgICB9XG59XG5ab2ROYU4uY3JlYXRlID0gKHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kTmFOKHtcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2ROYU4sXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5leHBvcnQgY29uc3QgQlJBTkQgPSBTeW1ib2woXCJ6b2RfYnJhbmRcIik7XG5leHBvcnQgY2xhc3MgWm9kQnJhbmRlZCBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTtcbiAgICAgICAgY29uc3QgZGF0YSA9IGN0eC5kYXRhO1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLnR5cGUuX3BhcnNlKHtcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICBwYXRoOiBjdHgucGF0aCxcbiAgICAgICAgICAgIHBhcmVudDogY3R4LFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdW53cmFwKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLnR5cGU7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIFpvZFBpcGVsaW5lIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHsgc3RhdHVzLCBjdHggfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhpbnB1dCk7XG4gICAgICAgIGlmIChjdHguY29tbW9uLmFzeW5jKSB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVBc3luYyA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpblJlc3VsdCA9IGF3YWl0IHRoaXMuX2RlZi5pbi5fcGFyc2VBc3luYyh7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IGN0eC5kYXRhLFxuICAgICAgICAgICAgICAgICAgICBwYXRoOiBjdHgucGF0aCxcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBjdHgsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKGluUmVzdWx0LnN0YXR1cyA9PT0gXCJhYm9ydGVkXCIpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICAgICAgICAgIGlmIChpblJlc3VsdC5zdGF0dXMgPT09IFwiZGlydHlcIikge1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERJUlRZKGluUmVzdWx0LnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZWYub3V0Ll9wYXJzZUFzeW5jKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IGluUmVzdWx0LnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IGN0eCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVBc3luYygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgaW5SZXN1bHQgPSB0aGlzLl9kZWYuaW4uX3BhcnNlU3luYyh7XG4gICAgICAgICAgICAgICAgZGF0YTogY3R4LmRhdGEsXG4gICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgcGFyZW50OiBjdHgsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChpblJlc3VsdC5zdGF0dXMgPT09IFwiYWJvcnRlZFwiKVxuICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICAgICAgaWYgKGluUmVzdWx0LnN0YXR1cyA9PT0gXCJkaXJ0eVwiKSB7XG4gICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiBcImRpcnR5XCIsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBpblJlc3VsdC52YWx1ZSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5vdXQuX3BhcnNlU3luYyh7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IGluUmVzdWx0LnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBwYXRoOiBjdHgucGF0aCxcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBjdHgsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIGNyZWF0ZShhLCBiKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kUGlwZWxpbmUoe1xuICAgICAgICAgICAgaW46IGEsXG4gICAgICAgICAgICBvdXQ6IGIsXG4gICAgICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZFBpcGVsaW5lLFxuICAgICAgICB9KTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgWm9kUmVhZG9ubHkgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fZGVmLmlubmVyVHlwZS5fcGFyc2UoaW5wdXQpO1xuICAgICAgICBjb25zdCBmcmVlemUgPSAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgaWYgKGlzVmFsaWQoZGF0YSkpIHtcbiAgICAgICAgICAgICAgICBkYXRhLnZhbHVlID0gT2JqZWN0LmZyZWV6ZShkYXRhLnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gaXNBc3luYyhyZXN1bHQpID8gcmVzdWx0LnRoZW4oKGRhdGEpID0+IGZyZWV6ZShkYXRhKSkgOiBmcmVlemUocmVzdWx0KTtcbiAgICB9XG4gICAgdW53cmFwKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLmlubmVyVHlwZTtcbiAgICB9XG59XG5ab2RSZWFkb25seS5jcmVhdGUgPSAodHlwZSwgcGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2RSZWFkb25seSh7XG4gICAgICAgIGlubmVyVHlwZTogdHlwZSxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RSZWFkb25seSxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vLy8vLy8vLy8gICAgICAgICAgICAgICAgICAgIC8vLy8vLy8vLy9cbi8vLy8vLy8vLy8gICAgICB6LmN1c3RvbSAgICAgIC8vLy8vLy8vLy9cbi8vLy8vLy8vLy8gICAgICAgICAgICAgICAgICAgIC8vLy8vLy8vLy9cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbmZ1bmN0aW9uIGNsZWFuUGFyYW1zKHBhcmFtcywgZGF0YSkge1xuICAgIGNvbnN0IHAgPSB0eXBlb2YgcGFyYW1zID09PSBcImZ1bmN0aW9uXCIgPyBwYXJhbXMoZGF0YSkgOiB0eXBlb2YgcGFyYW1zID09PSBcInN0cmluZ1wiID8geyBtZXNzYWdlOiBwYXJhbXMgfSA6IHBhcmFtcztcbiAgICBjb25zdCBwMiA9IHR5cGVvZiBwID09PSBcInN0cmluZ1wiID8geyBtZXNzYWdlOiBwIH0gOiBwO1xuICAgIHJldHVybiBwMjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjdXN0b20oY2hlY2ssIF9wYXJhbXMgPSB7fSwgXG4vKipcbiAqIEBkZXByZWNhdGVkXG4gKlxuICogUGFzcyBgZmF0YWxgIGludG8gdGhlIHBhcmFtcyBvYmplY3QgaW5zdGVhZDpcbiAqXG4gKiBgYGB0c1xuICogei5zdHJpbmcoKS5jdXN0b20oKHZhbCkgPT4gdmFsLmxlbmd0aCA+IDUsIHsgZmF0YWw6IGZhbHNlIH0pXG4gKiBgYGBcbiAqXG4gKi9cbmZhdGFsKSB7XG4gICAgaWYgKGNoZWNrKVxuICAgICAgICByZXR1cm4gWm9kQW55LmNyZWF0ZSgpLnN1cGVyUmVmaW5lKChkYXRhLCBjdHgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHIgPSBjaGVjayhkYXRhKTtcbiAgICAgICAgICAgIGlmIChyIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiByLnRoZW4oKHIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJhbXMgPSBjbGVhblBhcmFtcyhfcGFyYW1zLCBkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9mYXRhbCA9IHBhcmFtcy5mYXRhbCA/PyBmYXRhbCA/PyB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3R4LmFkZElzc3VlKHsgY29kZTogXCJjdXN0b21cIiwgLi4ucGFyYW1zLCBmYXRhbDogX2ZhdGFsIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJhbXMgPSBjbGVhblBhcmFtcyhfcGFyYW1zLCBkYXRhKTtcbiAgICAgICAgICAgICAgICBjb25zdCBfZmF0YWwgPSBwYXJhbXMuZmF0YWwgPz8gZmF0YWwgPz8gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjdHguYWRkSXNzdWUoeyBjb2RlOiBcImN1c3RvbVwiLCAuLi5wYXJhbXMsIGZhdGFsOiBfZmF0YWwgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0pO1xuICAgIHJldHVybiBab2RBbnkuY3JlYXRlKCk7XG59XG5leHBvcnQgeyBab2RUeXBlIGFzIFNjaGVtYSwgWm9kVHlwZSBhcyBab2RTY2hlbWEgfTtcbmV4cG9ydCBjb25zdCBsYXRlID0ge1xuICAgIG9iamVjdDogWm9kT2JqZWN0LmxhenljcmVhdGUsXG59O1xuZXhwb3J0IHZhciBab2RGaXJzdFBhcnR5VHlwZUtpbmQ7XG4oZnVuY3Rpb24gKFpvZEZpcnN0UGFydHlUeXBlS2luZCkge1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZFN0cmluZ1wiXSA9IFwiWm9kU3RyaW5nXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kTnVtYmVyXCJdID0gXCJab2ROdW1iZXJcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2ROYU5cIl0gPSBcIlpvZE5hTlwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZEJpZ0ludFwiXSA9IFwiWm9kQmlnSW50XCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kQm9vbGVhblwiXSA9IFwiWm9kQm9vbGVhblwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZERhdGVcIl0gPSBcIlpvZERhdGVcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RTeW1ib2xcIl0gPSBcIlpvZFN5bWJvbFwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZFVuZGVmaW5lZFwiXSA9IFwiWm9kVW5kZWZpbmVkXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kTnVsbFwiXSA9IFwiWm9kTnVsbFwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZEFueVwiXSA9IFwiWm9kQW55XCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kVW5rbm93blwiXSA9IFwiWm9kVW5rbm93blwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZE5ldmVyXCJdID0gXCJab2ROZXZlclwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZFZvaWRcIl0gPSBcIlpvZFZvaWRcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RBcnJheVwiXSA9IFwiWm9kQXJyYXlcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RPYmplY3RcIl0gPSBcIlpvZE9iamVjdFwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZFVuaW9uXCJdID0gXCJab2RVbmlvblwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZERpc2NyaW1pbmF0ZWRVbmlvblwiXSA9IFwiWm9kRGlzY3JpbWluYXRlZFVuaW9uXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kSW50ZXJzZWN0aW9uXCJdID0gXCJab2RJbnRlcnNlY3Rpb25cIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RUdXBsZVwiXSA9IFwiWm9kVHVwbGVcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RSZWNvcmRcIl0gPSBcIlpvZFJlY29yZFwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZE1hcFwiXSA9IFwiWm9kTWFwXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kU2V0XCJdID0gXCJab2RTZXRcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RGdW5jdGlvblwiXSA9IFwiWm9kRnVuY3Rpb25cIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RMYXp5XCJdID0gXCJab2RMYXp5XCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kTGl0ZXJhbFwiXSA9IFwiWm9kTGl0ZXJhbFwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZEVudW1cIl0gPSBcIlpvZEVudW1cIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RFZmZlY3RzXCJdID0gXCJab2RFZmZlY3RzXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kTmF0aXZlRW51bVwiXSA9IFwiWm9kTmF0aXZlRW51bVwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZE9wdGlvbmFsXCJdID0gXCJab2RPcHRpb25hbFwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZE51bGxhYmxlXCJdID0gXCJab2ROdWxsYWJsZVwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZERlZmF1bHRcIl0gPSBcIlpvZERlZmF1bHRcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RDYXRjaFwiXSA9IFwiWm9kQ2F0Y2hcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RQcm9taXNlXCJdID0gXCJab2RQcm9taXNlXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kQnJhbmRlZFwiXSA9IFwiWm9kQnJhbmRlZFwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZFBpcGVsaW5lXCJdID0gXCJab2RQaXBlbGluZVwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZFJlYWRvbmx5XCJdID0gXCJab2RSZWFkb25seVwiO1xufSkoWm9kRmlyc3RQYXJ0eVR5cGVLaW5kIHx8IChab2RGaXJzdFBhcnR5VHlwZUtpbmQgPSB7fSkpO1xuLy8gcmVxdWlyZXMgVFMgNC40K1xuY2xhc3MgQ2xhc3Mge1xuICAgIGNvbnN0cnVjdG9yKC4uLl8pIHsgfVxufVxuY29uc3QgaW5zdGFuY2VPZlR5cGUgPSAoXG4vLyBjb25zdCBpbnN0YW5jZU9mVHlwZSA9IDxUIGV4dGVuZHMgbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55PihcbmNscywgcGFyYW1zID0ge1xuICAgIG1lc3NhZ2U6IGBJbnB1dCBub3QgaW5zdGFuY2Ugb2YgJHtjbHMubmFtZX1gLFxufSkgPT4gY3VzdG9tKChkYXRhKSA9PiBkYXRhIGluc3RhbmNlb2YgY2xzLCBwYXJhbXMpO1xuY29uc3Qgc3RyaW5nVHlwZSA9IFpvZFN0cmluZy5jcmVhdGU7XG5jb25zdCBudW1iZXJUeXBlID0gWm9kTnVtYmVyLmNyZWF0ZTtcbmNvbnN0IG5hblR5cGUgPSBab2ROYU4uY3JlYXRlO1xuY29uc3QgYmlnSW50VHlwZSA9IFpvZEJpZ0ludC5jcmVhdGU7XG5jb25zdCBib29sZWFuVHlwZSA9IFpvZEJvb2xlYW4uY3JlYXRlO1xuY29uc3QgZGF0ZVR5cGUgPSBab2REYXRlLmNyZWF0ZTtcbmNvbnN0IHN5bWJvbFR5cGUgPSBab2RTeW1ib2wuY3JlYXRlO1xuY29uc3QgdW5kZWZpbmVkVHlwZSA9IFpvZFVuZGVmaW5lZC5jcmVhdGU7XG5jb25zdCBudWxsVHlwZSA9IFpvZE51bGwuY3JlYXRlO1xuY29uc3QgYW55VHlwZSA9IFpvZEFueS5jcmVhdGU7XG5jb25zdCB1bmtub3duVHlwZSA9IFpvZFVua25vd24uY3JlYXRlO1xuY29uc3QgbmV2ZXJUeXBlID0gWm9kTmV2ZXIuY3JlYXRlO1xuY29uc3Qgdm9pZFR5cGUgPSBab2RWb2lkLmNyZWF0ZTtcbmNvbnN0IGFycmF5VHlwZSA9IFpvZEFycmF5LmNyZWF0ZTtcbmNvbnN0IG9iamVjdFR5cGUgPSBab2RPYmplY3QuY3JlYXRlO1xuY29uc3Qgc3RyaWN0T2JqZWN0VHlwZSA9IFpvZE9iamVjdC5zdHJpY3RDcmVhdGU7XG5jb25zdCB1bmlvblR5cGUgPSBab2RVbmlvbi5jcmVhdGU7XG5jb25zdCBkaXNjcmltaW5hdGVkVW5pb25UeXBlID0gWm9kRGlzY3JpbWluYXRlZFVuaW9uLmNyZWF0ZTtcbmNvbnN0IGludGVyc2VjdGlvblR5cGUgPSBab2RJbnRlcnNlY3Rpb24uY3JlYXRlO1xuY29uc3QgdHVwbGVUeXBlID0gWm9kVHVwbGUuY3JlYXRlO1xuY29uc3QgcmVjb3JkVHlwZSA9IFpvZFJlY29yZC5jcmVhdGU7XG5jb25zdCBtYXBUeXBlID0gWm9kTWFwLmNyZWF0ZTtcbmNvbnN0IHNldFR5cGUgPSBab2RTZXQuY3JlYXRlO1xuY29uc3QgZnVuY3Rpb25UeXBlID0gWm9kRnVuY3Rpb24uY3JlYXRlO1xuY29uc3QgbGF6eVR5cGUgPSBab2RMYXp5LmNyZWF0ZTtcbmNvbnN0IGxpdGVyYWxUeXBlID0gWm9kTGl0ZXJhbC5jcmVhdGU7XG5jb25zdCBlbnVtVHlwZSA9IFpvZEVudW0uY3JlYXRlO1xuY29uc3QgbmF0aXZlRW51bVR5cGUgPSBab2ROYXRpdmVFbnVtLmNyZWF0ZTtcbmNvbnN0IHByb21pc2VUeXBlID0gWm9kUHJvbWlzZS5jcmVhdGU7XG5jb25zdCBlZmZlY3RzVHlwZSA9IFpvZEVmZmVjdHMuY3JlYXRlO1xuY29uc3Qgb3B0aW9uYWxUeXBlID0gWm9kT3B0aW9uYWwuY3JlYXRlO1xuY29uc3QgbnVsbGFibGVUeXBlID0gWm9kTnVsbGFibGUuY3JlYXRlO1xuY29uc3QgcHJlcHJvY2Vzc1R5cGUgPSBab2RFZmZlY3RzLmNyZWF0ZVdpdGhQcmVwcm9jZXNzO1xuY29uc3QgcGlwZWxpbmVUeXBlID0gWm9kUGlwZWxpbmUuY3JlYXRlO1xuY29uc3Qgb3N0cmluZyA9ICgpID0+IHN0cmluZ1R5cGUoKS5vcHRpb25hbCgpO1xuY29uc3Qgb251bWJlciA9ICgpID0+IG51bWJlclR5cGUoKS5vcHRpb25hbCgpO1xuY29uc3Qgb2Jvb2xlYW4gPSAoKSA9PiBib29sZWFuVHlwZSgpLm9wdGlvbmFsKCk7XG5leHBvcnQgY29uc3QgY29lcmNlID0ge1xuICAgIHN0cmluZzogKChhcmcpID0+IFpvZFN0cmluZy5jcmVhdGUoeyAuLi5hcmcsIGNvZXJjZTogdHJ1ZSB9KSksXG4gICAgbnVtYmVyOiAoKGFyZykgPT4gWm9kTnVtYmVyLmNyZWF0ZSh7IC4uLmFyZywgY29lcmNlOiB0cnVlIH0pKSxcbiAgICBib29sZWFuOiAoKGFyZykgPT4gWm9kQm9vbGVhbi5jcmVhdGUoe1xuICAgICAgICAuLi5hcmcsXG4gICAgICAgIGNvZXJjZTogdHJ1ZSxcbiAgICB9KSksXG4gICAgYmlnaW50OiAoKGFyZykgPT4gWm9kQmlnSW50LmNyZWF0ZSh7IC4uLmFyZywgY29lcmNlOiB0cnVlIH0pKSxcbiAgICBkYXRlOiAoKGFyZykgPT4gWm9kRGF0ZS5jcmVhdGUoeyAuLi5hcmcsIGNvZXJjZTogdHJ1ZSB9KSksXG59O1xuZXhwb3J0IHsgYW55VHlwZSBhcyBhbnksIGFycmF5VHlwZSBhcyBhcnJheSwgYmlnSW50VHlwZSBhcyBiaWdpbnQsIGJvb2xlYW5UeXBlIGFzIGJvb2xlYW4sIGRhdGVUeXBlIGFzIGRhdGUsIGRpc2NyaW1pbmF0ZWRVbmlvblR5cGUgYXMgZGlzY3JpbWluYXRlZFVuaW9uLCBlZmZlY3RzVHlwZSBhcyBlZmZlY3QsIGVudW1UeXBlIGFzIGVudW0sIGZ1bmN0aW9uVHlwZSBhcyBmdW5jdGlvbiwgaW5zdGFuY2VPZlR5cGUgYXMgaW5zdGFuY2VvZiwgaW50ZXJzZWN0aW9uVHlwZSBhcyBpbnRlcnNlY3Rpb24sIGxhenlUeXBlIGFzIGxhenksIGxpdGVyYWxUeXBlIGFzIGxpdGVyYWwsIG1hcFR5cGUgYXMgbWFwLCBuYW5UeXBlIGFzIG5hbiwgbmF0aXZlRW51bVR5cGUgYXMgbmF0aXZlRW51bSwgbmV2ZXJUeXBlIGFzIG5ldmVyLCBudWxsVHlwZSBhcyBudWxsLCBudWxsYWJsZVR5cGUgYXMgbnVsbGFibGUsIG51bWJlclR5cGUgYXMgbnVtYmVyLCBvYmplY3RUeXBlIGFzIG9iamVjdCwgb2Jvb2xlYW4sIG9udW1iZXIsIG9wdGlvbmFsVHlwZSBhcyBvcHRpb25hbCwgb3N0cmluZywgcGlwZWxpbmVUeXBlIGFzIHBpcGVsaW5lLCBwcmVwcm9jZXNzVHlwZSBhcyBwcmVwcm9jZXNzLCBwcm9taXNlVHlwZSBhcyBwcm9taXNlLCByZWNvcmRUeXBlIGFzIHJlY29yZCwgc2V0VHlwZSBhcyBzZXQsIHN0cmljdE9iamVjdFR5cGUgYXMgc3RyaWN0T2JqZWN0LCBzdHJpbmdUeXBlIGFzIHN0cmluZywgc3ltYm9sVHlwZSBhcyBzeW1ib2wsIGVmZmVjdHNUeXBlIGFzIHRyYW5zZm9ybWVyLCB0dXBsZVR5cGUgYXMgdHVwbGUsIHVuZGVmaW5lZFR5cGUgYXMgdW5kZWZpbmVkLCB1bmlvblR5cGUgYXMgdW5pb24sIHVua25vd25UeXBlIGFzIHVua25vd24sIHZvaWRUeXBlIGFzIHZvaWQsIH07XG5leHBvcnQgY29uc3QgTkVWRVIgPSBJTlZBTElEO1xuIiwiaW1wb3J0IHsgdG9vbCB9IGZyb20gXCIuL3Rvb2wubWpzXCI7XG5pbXBvcnQgeyBVc2VyRXJyb3IgfSBmcm9tIFwiLi9lcnJvcnMubWpzXCI7XG5pbXBvcnQgeyBNQ1BTZXJ2ZXJTdGRpbyBhcyBVbmRlcmx5aW5nTUNQU2VydmVyU3RkaW8gfSBmcm9tICdAb3BlbmFpL2FnZW50cy1jb3JlL19zaGltcyc7XG5pbXBvcnQgeyBnZXRDdXJyZW50U3Bhbiwgd2l0aE1DUExpc3RUb29sc1NwYW4gfSBmcm9tIFwiLi90cmFjaW5nL2luZGV4Lm1qc1wiO1xuaW1wb3J0IHsgbG9nZ2VyIGFzIGdsb2JhbExvZ2dlciwgZ2V0TG9nZ2VyIH0gZnJvbSBcIi4vbG9nZ2VyLm1qc1wiO1xuaW1wb3J0IGRlYnVnIGZyb20gJ2RlYnVnJztcbmltcG9ydCB7IHogfSBmcm9tICdAb3BlbmFpL3pvZC92Myc7XG5leHBvcnQgY29uc3QgREVGQVVMVF9TVERJT19NQ1BfQ0xJRU5UX0xPR0dFUl9OQU1FID0gJ29wZW5haS1hZ2VudHM6c3RkaW8tbWNwLWNsaWVudCc7XG5leHBvcnQgY2xhc3MgQmFzZU1DUFNlcnZlclN0ZGlvIHtcbiAgICBjYWNoZVRvb2xzTGlzdDtcbiAgICBfY2FjaGVkVG9vbHMgPSB1bmRlZmluZWQ7XG4gICAgbG9nZ2VyO1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIgPVxuICAgICAgICAgICAgb3B0aW9ucy5sb2dnZXIgPz8gZ2V0TG9nZ2VyKERFRkFVTFRfU1RESU9fTUNQX0NMSUVOVF9MT0dHRVJfTkFNRSk7XG4gICAgICAgIHRoaXMuY2FjaGVUb29sc0xpc3QgPSBvcHRpb25zLmNhY2hlVG9vbHNMaXN0ID8/IHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExvZ3MgYSBkZWJ1ZyBtZXNzYWdlIHdoZW4gZGVidWcgbG9nZ2luZyBpcyBlbmFibGVkLlxuICAgICAqIEBwYXJhbSBidWlsZE1lc3NhZ2UgQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIG1lc3NhZ2UgdG8gbG9nLlxuICAgICAqL1xuICAgIGRlYnVnTG9nKGJ1aWxkTWVzc2FnZSkge1xuICAgICAgICBpZiAoZGVidWcuZW5hYmxlZCh0aGlzLmxvZ2dlci5uYW1lc3BhY2UpKSB7XG4gICAgICAgICAgICAvLyBvbmx5IHdoZW4gdGhpcyBpcyB0cnVlLCB0aGUgZnVuY3Rpb24gdG8gYnVpbGQgdGhlIHN0cmluZyBpcyBjYWxsZWRcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGJ1aWxkTWVzc2FnZSgpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuICogTWluaW11bSBNQ1AgdG9vbCBkYXRhIGRlZmluaXRpb24uXG4gKiBUaGlzIHR5cGUgZGVmaW5pdGlvbiBkb2VzIG5vdCBpbnRlbmQgdG8gY292ZXIgYWxsIHBvc3NpYmxlIHByb3BlcnRpZXMuXG4gKiBJdCBzdXBwb3J0cyB0aGUgcHJvcGVydGllcyB0aGF0IGFyZSB1c2VkIGluIHRoaXMgU0RLLlxuICovXG5leHBvcnQgY29uc3QgTUNQVG9vbCA9IHoub2JqZWN0KHtcbiAgICBuYW1lOiB6LnN0cmluZygpLFxuICAgIGRlc2NyaXB0aW9uOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgaW5wdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgICAgdHlwZTogei5saXRlcmFsKCdvYmplY3QnKSxcbiAgICAgICAgcHJvcGVydGllczogei5yZWNvcmQoei5zdHJpbmcoKSwgei5hbnkoKSksXG4gICAgICAgIHJlcXVpcmVkOiB6LmFycmF5KHouc3RyaW5nKCkpLFxuICAgICAgICBhZGRpdGlvbmFsUHJvcGVydGllczogei5ib29sZWFuKCksXG4gICAgfSksXG59KTtcbi8qKlxuICogUHVibGljIGludGVyZmFjZSBvZiBhbiBNQ1Agc2VydmVyIHRoYXQgcHJvdmlkZXMgdG9vbHMuXG4gKiBZb3UgY2FuIHVzZSB0aGlzIGNsYXNzIHRvIHBhc3MgTUNQIHNlcnZlciBzZXR0aW5ncyB0byB5b3VyIGFnZW50LlxuICovXG5leHBvcnQgY2xhc3MgTUNQU2VydmVyU3RkaW8gZXh0ZW5kcyBCYXNlTUNQU2VydmVyU3RkaW8ge1xuICAgIHVuZGVybHlpbmc7XG4gICAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgICAgICBzdXBlcihvcHRpb25zKTtcbiAgICAgICAgdGhpcy51bmRlcmx5aW5nID0gbmV3IFVuZGVybHlpbmdNQ1BTZXJ2ZXJTdGRpbyhvcHRpb25zKTtcbiAgICB9XG4gICAgZ2V0IG5hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnVuZGVybHlpbmcubmFtZTtcbiAgICB9XG4gICAgY29ubmVjdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudW5kZXJseWluZy5jb25uZWN0KCk7XG4gICAgfVxuICAgIGNsb3NlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy51bmRlcmx5aW5nLmNsb3NlKCk7XG4gICAgfVxuICAgIGFzeW5jIGxpc3RUb29scygpIHtcbiAgICAgICAgaWYgKHRoaXMuY2FjaGVUb29sc0xpc3QgJiYgdGhpcy5fY2FjaGVkVG9vbHMpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jYWNoZWRUb29scztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0b29scyA9IGF3YWl0IHRoaXMudW5kZXJseWluZy5saXN0VG9vbHMoKTtcbiAgICAgICAgaWYgKHRoaXMuY2FjaGVUb29sc0xpc3QpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhY2hlZFRvb2xzID0gdG9vbHM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRvb2xzO1xuICAgIH1cbiAgICBjYWxsVG9vbCh0b29sTmFtZSwgYXJncykge1xuICAgICAgICByZXR1cm4gdGhpcy51bmRlcmx5aW5nLmNhbGxUb29sKHRvb2xOYW1lLCBhcmdzKTtcbiAgICB9XG59XG4vKipcbiAqIEZldGNoZXMgYW5kIGZsYXR0ZW5zIGFsbCB0b29scyBmcm9tIG11bHRpcGxlIE1DUCBzZXJ2ZXJzLlxuICogTG9ncyBhbmQgc2tpcHMgYW55IHNlcnZlcnMgdGhhdCBmYWlsIHRvIHJlc3BvbmQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRBbGxNY3BGdW5jdGlvblRvb2xzKG1jcFNlcnZlcnMsIGNvbnZlcnRTY2hlbWFzVG9TdHJpY3QgPSBmYWxzZSkge1xuICAgIGNvbnN0IGFsbFRvb2xzID0gW107XG4gICAgY29uc3QgdG9vbE5hbWVzID0gbmV3IFNldCgpO1xuICAgIGZvciAoY29uc3Qgc2VydmVyIG9mIG1jcFNlcnZlcnMpIHtcbiAgICAgICAgY29uc3Qgc2VydmVyVG9vbHMgPSBhd2FpdCBnZXRGdW5jdGlvblRvb2xzRnJvbVNlcnZlcihzZXJ2ZXIsIGNvbnZlcnRTY2hlbWFzVG9TdHJpY3QpO1xuICAgICAgICBjb25zdCBzZXJ2ZXJUb29sTmFtZXMgPSBuZXcgU2V0KHNlcnZlclRvb2xzLm1hcCgodCkgPT4gdC5uYW1lKSk7XG4gICAgICAgIGNvbnN0IGludGVyc2VjdGlvbiA9IFsuLi5zZXJ2ZXJUb29sTmFtZXNdLmZpbHRlcigobikgPT4gdG9vbE5hbWVzLmhhcyhuKSk7XG4gICAgICAgIGlmIChpbnRlcnNlY3Rpb24ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJFcnJvcihgRHVwbGljYXRlIHRvb2wgbmFtZXMgZm91bmQgYWNyb3NzIE1DUCBzZXJ2ZXJzOiAke2ludGVyc2VjdGlvbi5qb2luKCcsICcpfWApO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgdCBvZiBzZXJ2ZXJUb29scykge1xuICAgICAgICAgICAgdG9vbE5hbWVzLmFkZCh0Lm5hbWUpO1xuICAgICAgICAgICAgYWxsVG9vbHMucHVzaCh0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYWxsVG9vbHM7XG59XG5jb25zdCBfY2FjaGVkVG9vbHMgPSB7fTtcbi8qKlxuICogUmVtb3ZlIGNhY2hlZCB0b29scyBmb3IgdGhlIGdpdmVuIHNlcnZlciBzbyB0aGUgbmV4dCBsb29rdXAgZmV0Y2hlcyBmcmVzaCBkYXRhLlxuICpcbiAqIEBwYXJhbSBzZXJ2ZXJOYW1lIC0gTmFtZSBvZiB0aGUgTUNQIHNlcnZlciB3aG9zZSBjYWNoZSBzaG91bGQgYmUgY2xlYXJlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGludmFsaWRhdGVTZXJ2ZXJUb29sc0NhY2hlKHNlcnZlck5hbWUpIHtcbiAgICBkZWxldGUgX2NhY2hlZFRvb2xzW3NlcnZlck5hbWVdO1xufVxuLyoqXG4gKiBGZXRjaGVzIGFsbCBmdW5jdGlvbiB0b29scyBmcm9tIGEgc2luZ2xlIE1DUCBzZXJ2ZXIuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEZ1bmN0aW9uVG9vbHNGcm9tU2VydmVyKHNlcnZlciwgY29udmVydFNjaGVtYXNUb1N0cmljdCkge1xuICAgIGlmIChzZXJ2ZXIuY2FjaGVUb29sc0xpc3QgJiYgX2NhY2hlZFRvb2xzW3NlcnZlci5uYW1lXSkge1xuICAgICAgICByZXR1cm4gX2NhY2hlZFRvb2xzW3NlcnZlci5uYW1lXTtcbiAgICB9XG4gICAgcmV0dXJuIHdpdGhNQ1BMaXN0VG9vbHNTcGFuKGFzeW5jIChzcGFuKSA9PiB7XG4gICAgICAgIGNvbnN0IG1jcFRvb2xzID0gYXdhaXQgc2VydmVyLmxpc3RUb29scygpO1xuICAgICAgICBzcGFuLnNwYW5EYXRhLnJlc3VsdCA9IG1jcFRvb2xzLm1hcCgodCkgPT4gdC5uYW1lKTtcbiAgICAgICAgY29uc3QgdG9vbHMgPSBtY3BUb29scy5tYXAoKHQpID0+IG1jcFRvRnVuY3Rpb25Ub29sKHQsIHNlcnZlciwgY29udmVydFNjaGVtYXNUb1N0cmljdCkpO1xuICAgICAgICBpZiAoc2VydmVyLmNhY2hlVG9vbHNMaXN0KSB7XG4gICAgICAgICAgICBfY2FjaGVkVG9vbHNbc2VydmVyLm5hbWVdID0gdG9vbHM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRvb2xzO1xuICAgIH0sIHsgZGF0YTogeyBzZXJ2ZXI6IHNlcnZlci5uYW1lIH0gfSk7XG59XG4vKipcbiAqIFJldHVybnMgYWxsIE1DUCB0b29scyBmcm9tIHRoZSBwcm92aWRlZCBzZXJ2ZXJzLCB1c2luZyB0aGUgZnVuY3Rpb24gdG9vbCBjb252ZXJzaW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QWxsTWNwVG9vbHMobWNwU2VydmVycywgY29udmVydFNjaGVtYXNUb1N0cmljdCA9IGZhbHNlKSB7XG4gICAgcmV0dXJuIGdldEFsbE1jcEZ1bmN0aW9uVG9vbHMobWNwU2VydmVycywgY29udmVydFNjaGVtYXNUb1N0cmljdCk7XG59XG4vKipcbiAqIENvbnZlcnRzIGFuIE1DUCB0b29sIGRlZmluaXRpb24gdG8gYSBmdW5jdGlvbiB0b29sIGZvciB0aGUgQWdlbnRzIFNESy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1jcFRvRnVuY3Rpb25Ub29sKG1jcFRvb2wsIHNlcnZlciwgY29udmVydFNjaGVtYXNUb1N0cmljdCkge1xuICAgIGFzeW5jIGZ1bmN0aW9uIGludm9rZShpbnB1dCwgX2NvbnRleHQpIHtcbiAgICAgICAgbGV0IGFyZ3MgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycgJiYgaW5wdXQpIHtcbiAgICAgICAgICAgIGFyZ3MgPSBKU09OLnBhcnNlKGlucHV0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgaW5wdXQgPT09ICdvYmplY3QnICYmIGlucHV0ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGFyZ3MgPSBpbnB1dDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjdXJyZW50U3BhbiA9IGdldEN1cnJlbnRTcGFuKCk7XG4gICAgICAgIGlmIChjdXJyZW50U3Bhbikge1xuICAgICAgICAgICAgY3VycmVudFNwYW4uc3BhbkRhdGFbJ21jcF9kYXRhJ10gPSB7IHNlcnZlcjogc2VydmVyLm5hbWUgfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgc2VydmVyLmNhbGxUb29sKG1jcFRvb2wubmFtZSwgYXJncyk7XG4gICAgICAgIHJldHVybiBjb250ZW50Lmxlbmd0aCA9PT0gMSA/IGNvbnRlbnRbMF0gOiBjb250ZW50O1xuICAgIH1cbiAgICBjb25zdCBzY2hlbWEgPSB7XG4gICAgICAgIHR5cGU6IG1jcFRvb2wuaW5wdXRTY2hlbWE/LnR5cGUgPz8gJ29iamVjdCcsXG4gICAgICAgIHByb3BlcnRpZXM6IG1jcFRvb2wuaW5wdXRTY2hlbWE/LnByb3BlcnRpZXMgPz8ge30sXG4gICAgICAgIHJlcXVpcmVkOiBtY3BUb29sLmlucHV0U2NoZW1hPy5yZXF1aXJlZCA/PyBbXSxcbiAgICAgICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IG1jcFRvb2wuaW5wdXRTY2hlbWE/LmFkZGl0aW9uYWxQcm9wZXJ0aWVzID8/IGZhbHNlLFxuICAgIH07XG4gICAgaWYgKGNvbnZlcnRTY2hlbWFzVG9TdHJpY3QgfHwgc2NoZW1hLmFkZGl0aW9uYWxQcm9wZXJ0aWVzID09PSB0cnVlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBzdHJpY3RTY2hlbWEgPSBlbnN1cmVTdHJpY3RKc29uU2NoZW1hKHNjaGVtYSk7XG4gICAgICAgICAgICByZXR1cm4gdG9vbCh7XG4gICAgICAgICAgICAgICAgbmFtZTogbWNwVG9vbC5uYW1lLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBtY3BUb29sLmRlc2NyaXB0aW9uIHx8ICcnLFxuICAgICAgICAgICAgICAgIHBhcmFtZXRlcnM6IHN0cmljdFNjaGVtYSxcbiAgICAgICAgICAgICAgICBzdHJpY3Q6IHRydWUsXG4gICAgICAgICAgICAgICAgZXhlY3V0ZTogaW52b2tlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGdsb2JhbExvZ2dlci53YXJuKGBFcnJvciBjb252ZXJ0aW5nIE1DUCBzY2hlbWEgdG8gc3RyaWN0IG1vZGU6ICR7ZX1gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBub25TdHJpY3RTY2hlbWEgPSB7XG4gICAgICAgIC4uLnNjaGVtYSxcbiAgICAgICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IHRydWUsXG4gICAgfTtcbiAgICByZXR1cm4gdG9vbCh7XG4gICAgICAgIG5hbWU6IG1jcFRvb2wubmFtZSxcbiAgICAgICAgZGVzY3JpcHRpb246IG1jcFRvb2wuZGVzY3JpcHRpb24gfHwgJycsXG4gICAgICAgIHBhcmFtZXRlcnM6IG5vblN0cmljdFNjaGVtYSxcbiAgICAgICAgc3RyaWN0OiBmYWxzZSxcbiAgICAgICAgZXhlY3V0ZTogaW52b2tlLFxuICAgIH0pO1xufVxuLyoqXG4gKiBFbnN1cmVzIHRoZSBnaXZlbiBKU09OIHNjaGVtYSBpcyBzdHJpY3QgKG5vIGFkZGl0aW9uYWwgcHJvcGVydGllcywgcmVxdWlyZWQgZmllbGRzIHNldCkuXG4gKi9cbmZ1bmN0aW9uIGVuc3VyZVN0cmljdEpzb25TY2hlbWEoc2NoZW1hKSB7XG4gICAgY29uc3Qgb3V0ID0ge1xuICAgICAgICAuLi5zY2hlbWEsXG4gICAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBmYWxzZSxcbiAgICB9O1xuICAgIGlmICghb3V0LnJlcXVpcmVkKVxuICAgICAgICBvdXQucmVxdWlyZWQgPSBbXTtcbiAgICByZXR1cm4gb3V0O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWNwLm1qcy5tYXAiLCIvLy8gPHJlZmVyZW5jZSBsaWI9XCJkb21cIiAvPlxuLy8gVXNlIGZ1bmN0aW9uIGluc3RlYWQgb2YgZXhwb3J0aW5nIHRoZSB2YWx1ZSB0byBwcmV2ZW50XG4vLyBjaXJjdWxhciBkZXBlbmRlbmN5IHJlc29sdXRpb24gaXNzdWVzIGNhdXNlZCBieSBvdGhlciBleHBvcnRzIGluICdAb3BlbmFpL2FnZW50cy1jb3JlL19zaGltcydcbmV4cG9ydCBmdW5jdGlvbiBsb2FkRW52KCkge1xuICAgIHJldHVybiB7fTtcbn1cbmV4cG9ydCBjbGFzcyBCcm93c2VyRXZlbnRFbWl0dGVyIHtcbiAgICAjdGFyZ2V0ID0gbmV3IEV2ZW50VGFyZ2V0KCk7XG4gICAgb24odHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy4jdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgKChldmVudCkgPT4gbGlzdGVuZXIoLi4uKGV2ZW50LmRldGFpbCA/PyBbXSkpKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBvZmYodHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy4jdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgKChldmVudCkgPT4gbGlzdGVuZXIoLi4uKGV2ZW50LmRldGFpbCA/PyBbXSkpKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBlbWl0KHR5cGUsIC4uLmFyZ3MpIHtcbiAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQodHlwZSwgeyBkZXRhaWw6IGFyZ3MgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLiN0YXJnZXQuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gICAgfVxuICAgIG9uY2UodHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgICAgY29uc3QgaGFuZGxlciA9ICguLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9mZih0eXBlLCBoYW5kbGVyKTtcbiAgICAgICAgICAgIGxpc3RlbmVyKC4uLmFyZ3MpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLm9uKHR5cGUsIGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG5leHBvcnQgeyBCcm93c2VyRXZlbnRFbWl0dGVyIGFzIFJ1bnRpbWVFdmVudEVtaXR0ZXIgfTtcbmV4cG9ydCBjb25zdCByYW5kb21VVUlEID0gY3J5cHRvLnJhbmRvbVVVSUQ7XG5leHBvcnQgY29uc3QgUmVhZGFibGUgPSBjbGFzcyBSZWFkYWJsZSB7XG4gICAgY29uc3RydWN0b3IoKSB7IH1cbiAgICBwaXBlVG8oX2Rlc3RpbmF0aW9uLCBfb3B0aW9ucykgeyB9XG4gICAgcGlwZVRocm91Z2goX3RyYW5zZm9ybSwgX29wdGlvbnMpIHsgfVxufTtcbmV4cG9ydCBjb25zdCBSZWFkYWJsZVN0cmVhbSA9IGdsb2JhbFRoaXMuUmVhZGFibGVTdHJlYW07XG5leHBvcnQgY29uc3QgUmVhZGFibGVTdHJlYW1Db250cm9sbGVyID0gZ2xvYmFsVGhpcy5SZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyO1xuZXhwb3J0IGNvbnN0IFRyYW5zZm9ybVN0cmVhbSA9IGdsb2JhbFRoaXMuVHJhbnNmb3JtU3RyZWFtO1xuZXhwb3J0IGNsYXNzIEFzeW5jTG9jYWxTdG9yYWdlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHsgfVxuICAgIHJ1bigpIHsgfVxuICAgIGdldFN0b3JlKCkgeyB9XG4gICAgZW50ZXJXaXRoKCkgeyB9XG59XG5leHBvcnQgZnVuY3Rpb24gaXNCcm93c2VyRW52aXJvbm1lbnQoKSB7XG4gICAgcmV0dXJuIHRydWU7XG59XG5leHBvcnQgeyBNQ1BTZXJ2ZXJTdGRpbyB9IGZyb20gXCIuL21jcC1zdGRpby9icm93c2VyLm1qc1wiO1xuY2xhc3MgQnJvd3NlclRpbWVyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHsgfVxuICAgIHNldFRpbWVvdXQoY2FsbGJhY2ssIG1zKSB7XG4gICAgICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KGNhbGxiYWNrLCBtcyk7XG4gICAgICAgIHRpbWVvdXQucmVmID1cbiAgICAgICAgICAgIHR5cGVvZiB0aW1lb3V0LnJlZiA9PT0gJ2Z1bmN0aW9uJyA/IHRpbWVvdXQucmVmIDogKCkgPT4gdGltZW91dDtcbiAgICAgICAgdGltZW91dC51bnJlZiA9XG4gICAgICAgICAgICB0eXBlb2YgdGltZW91dC51bnJlZiA9PT0gJ2Z1bmN0aW9uJyA/IHRpbWVvdXQudW5yZWYgOiAoKSA9PiB0aW1lb3V0O1xuICAgICAgICB0aW1lb3V0Lmhhc1JlZiA9XG4gICAgICAgICAgICB0eXBlb2YgdGltZW91dC5oYXNSZWYgPT09ICdmdW5jdGlvbicgPyB0aW1lb3V0Lmhhc1JlZiA6ICgpID0+IHRydWU7XG4gICAgICAgIHRpbWVvdXQucmVmcmVzaCA9XG4gICAgICAgICAgICB0eXBlb2YgdGltZW91dC5yZWZyZXNoID09PSAnZnVuY3Rpb24nID8gdGltZW91dC5yZWZyZXNoIDogKCkgPT4gdGltZW91dDtcbiAgICAgICAgcmV0dXJuIHRpbWVvdXQ7XG4gICAgfVxuICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpIHtcbiAgICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgIH1cbn1cbmNvbnN0IHRpbWVyID0gbmV3IEJyb3dzZXJUaW1lcigpO1xuZXhwb3J0IHsgdGltZXIgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNoaW1zLWJyb3dzZXIubWpzLm1hcCIsImltcG9ydCB7IGxvYWRFbnYgYXMgX2xvYWRFbnYgfSBmcm9tICdAb3BlbmFpL2FnZW50cy1jb3JlL19zaGltcyc7XG4vKipcbiAqIExvYWRzIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tIHRoZSBwcm9jZXNzIGVudmlyb25tZW50LlxuICpcbiAqIEByZXR1cm5zIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2FkRW52KCkge1xuICAgIHJldHVybiBfbG9hZEVudigpO1xufVxuLyoqXG4gKiBDaGVja3MgaWYgYSBmbGFnIGlzIGVuYWJsZWQgaW4gdGhlIGVudmlyb25tZW50LlxuICpcbiAqIEBwYXJhbSBmbGFnTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBmbGFnIHRvIGNoZWNrLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBmbGFnIGlzIGVuYWJsZWQsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICovXG5mdW5jdGlvbiBpc0VuYWJsZWQoZmxhZ05hbWUpIHtcbiAgICBjb25zdCBlbnYgPSBsb2FkRW52KCk7XG4gICAgcmV0dXJuICh0eXBlb2YgZW52ICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAoZW52W2ZsYWdOYW1lXSA9PT0gJ3RydWUnIHx8IGVudltmbGFnTmFtZV0gPT09ICcxJykpO1xufVxuLyoqXG4gKiBHbG9iYWwgY29uZmlndXJhdGlvbiBmb3IgdHJhY2luZy5cbiAqL1xuZXhwb3J0IGNvbnN0IHRyYWNpbmcgPSB7XG4gICAgZ2V0IGRpc2FibGVkKCkge1xuICAgICAgICByZXR1cm4gaXNFbmFibGVkKCdPUEVOQUlfQUdFTlRTX0RJU0FCTEVfVFJBQ0lORycpO1xuICAgIH0sXG59O1xuLyoqXG4gKiBHbG9iYWwgY29uZmlndXJhdGlvbiBmb3IgbG9nZ2luZy5cbiAqL1xuZXhwb3J0IGNvbnN0IGxvZ2dpbmcgPSB7XG4gICAgZ2V0IGRvbnRMb2dNb2RlbERhdGEoKSB7XG4gICAgICAgIHJldHVybiBpc0VuYWJsZWQoJ09QRU5BSV9BR0VOVFNfRE9OVF9MT0dfTU9ERUxfREFUQScpO1xuICAgIH0sXG4gICAgZ2V0IGRvbnRMb2dUb29sRGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIGlzRW5hYmxlZCgnT1BFTkFJX0FHRU5UU19ET05UX0xPR19UT09MX0RBVEEnKTtcbiAgICB9LFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbmZpZy5tanMubWFwIiwiaW1wb3J0IGRlYnVnIGZyb20gJ2RlYnVnJztcbmltcG9ydCB7IGxvZ2dpbmcgfSBmcm9tIFwiLi9jb25maWcubWpzXCI7XG4vKipcbiAqIEJ5IGRlZmF1bHQgd2UgZG9uJ3QgbG9nIExMTSBpbnB1dHMvb3V0cHV0cywgdG8gcHJldmVudCBleHBvc2luZyBzZW5zaXRpdmUgZGF0YS4gU2V0IHRoaXMgZmxhZ1xuICogdG8gZW5hYmxlIGxvZ2dpbmcgdGhlbS5cbiAqL1xuY29uc3QgZG9udExvZ01vZGVsRGF0YSA9IGxvZ2dpbmcuZG9udExvZ01vZGVsRGF0YTtcbi8qKlxuICogQnkgZGVmYXVsdCB3ZSBkb24ndCBsb2cgdG9vbCBpbnB1dHMvb3V0cHV0cywgdG8gcHJldmVudCBleHBvc2luZyBzZW5zaXRpdmUgZGF0YS4gU2V0IHRoaXMgZmxhZ1xuICogdG8gZW5hYmxlIGxvZ2dpbmcgdGhlbS5cbiAqL1xuY29uc3QgZG9udExvZ1Rvb2xEYXRhID0gbG9nZ2luZy5kb250TG9nVG9vbERhdGE7XG4vKipcbiAqIEdldCBhIGxvZ2dlciBmb3IgYSBnaXZlbiBwYWNrYWdlLlxuICpcbiAqIEBwYXJhbSBuYW1lc3BhY2UgLSB0aGUgbmFtZXNwYWNlIHRvIHVzZSBmb3IgdGhlIGxvZ2dlci5cbiAqIEByZXR1cm5zIEEgbG9nZ2VyIG9iamVjdCB3aXRoIGBkZWJ1Z2AgYW5kIGBlcnJvcmAgbWV0aG9kcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldExvZ2dlcihuYW1lc3BhY2UgPSAnb3BlbmFpLWFnZW50cycpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgIGRlYnVnOiBkZWJ1ZyhuYW1lc3BhY2UpLFxuICAgICAgICBlcnJvcjogY29uc29sZS5lcnJvcixcbiAgICAgICAgd2FybjogY29uc29sZS53YXJuLFxuICAgICAgICBkb250TG9nTW9kZWxEYXRhLFxuICAgICAgICBkb250TG9nVG9vbERhdGEsXG4gICAgfTtcbn1cbmV4cG9ydCBjb25zdCBsb2dnZXIgPSBnZXRMb2dnZXIoJ29wZW5haS1hZ2VudHM6Y29yZScpO1xuZXhwb3J0IGRlZmF1bHQgbG9nZ2VyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bG9nZ2VyLm1qcy5tYXAiLCJpbXBvcnQgeyBSdW50aW1lRXZlbnRFbWl0dGVyLCB9IGZyb20gJ0BvcGVuYWkvYWdlbnRzLWNvcmUvX3NoaW1zJztcbmV4cG9ydCBjbGFzcyBFdmVudEVtaXR0ZXJEZWxlZ2F0ZSB7XG4gICAgb24odHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5ldmVudEVtaXR0ZXIub24odHlwZSwgbGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gdGhpcy5ldmVudEVtaXR0ZXI7XG4gICAgfVxuICAgIG9mZih0eXBlLCBsaXN0ZW5lcikge1xuICAgICAgICB0aGlzLmV2ZW50RW1pdHRlci5vZmYodHlwZSwgbGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gdGhpcy5ldmVudEVtaXR0ZXI7XG4gICAgfVxuICAgIGVtaXQodHlwZSwgLi4uYXJncykge1xuICAgICAgICByZXR1cm4gdGhpcy5ldmVudEVtaXR0ZXIuZW1pdCh0eXBlLCAuLi5hcmdzKTtcbiAgICB9XG4gICAgb25jZSh0eXBlLCBsaXN0ZW5lcikge1xuICAgICAgICB0aGlzLmV2ZW50RW1pdHRlci5vbmNlKHR5cGUsIGxpc3RlbmVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXZlbnRFbWl0dGVyO1xuICAgIH1cbn1cbi8qKlxuICogRXZlbnQgZW1pdHRlciB0aGF0IGV2ZXJ5IEFnZW50IGluc3RhbmNlIGluaGVyaXRzIGZyb20gYW5kIHRoYXQgZW1pdHMgZXZlbnRzIGZvciB0aGUgbGlmZWN5Y2xlXG4gKiBvZiB0aGUgYWdlbnQuXG4gKi9cbmV4cG9ydCBjbGFzcyBBZ2VudEhvb2tzIGV4dGVuZHMgRXZlbnRFbWl0dGVyRGVsZWdhdGUge1xuICAgIGV2ZW50RW1pdHRlciA9IG5ldyBSdW50aW1lRXZlbnRFbWl0dGVyKCk7XG59XG4vKipcbiAqIEV2ZW50IGVtaXR0ZXIgdGhhdCBldmVyeSBSdW5uZXIgaW5zdGFuY2UgaW5oZXJpdHMgZnJvbSBhbmQgdGhhdCBlbWl0cyBldmVudHMgZm9yIHRoZSBsaWZlY3ljbGVcbiAqIG9mIHRoZSBvdmVyYWxsIHJ1bi5cbiAqL1xuZXhwb3J0IGNsYXNzIFJ1bkhvb2tzIGV4dGVuZHMgRXZlbnRFbWl0dGVyRGVsZWdhdGUge1xuICAgIGV2ZW50RW1pdHRlciA9IG5ldyBSdW50aW1lRXZlbnRFbWl0dGVyKCk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1saWZlY3ljbGUubWpzLm1hcCIsIi8qKlxuICogRGVmaW5lcyBhbiBpbnRlcm5hbCBpbnB1dCBndWFyZHJhaWwgZGVmaW5pdGlvbi5cbiAqIFNESyB1c2VycyB1c3VhbGx5IGRvIG5vdCBuZWVkIHRvIHVzZSB0aGlzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lSW5wdXRHdWFyZHJhaWwoeyBuYW1lLCBleGVjdXRlLCB9KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ2lucHV0JyxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgZ3VhcmRyYWlsRnVuY3Rpb246IGV4ZWN1dGUsXG4gICAgICAgIGFzeW5jIHJ1bihhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGd1YXJkcmFpbDogeyB0eXBlOiAnaW5wdXQnLCBuYW1lIH0sXG4gICAgICAgICAgICAgICAgb3V0cHV0OiBhd2FpdCBleGVjdXRlKGFyZ3MpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICB9O1xufVxuLyoqXG4gKiBDcmVhdGVzIGFuIGludGVybmFsIG91dHB1dCBndWFyZHJhaWwgZGVmaW5pdGlvbi5cbiAqIFNESyB1c2VycyB1c3VhbGx5IGRvIG5vdCBuZWVkIHRvIHVzZSB0aGlzLlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVPdXRwdXRHdWFyZHJhaWwoeyBuYW1lLCBleGVjdXRlLCB9KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ291dHB1dCcsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIGd1YXJkcmFpbEZ1bmN0aW9uOiBleGVjdXRlLFxuICAgICAgICBhc3luYyBydW4oYXJncykge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBndWFyZHJhaWw6IHsgdHlwZTogJ291dHB1dCcsIG5hbWUgfSxcbiAgICAgICAgICAgICAgICBhZ2VudDogYXJncy5hZ2VudCxcbiAgICAgICAgICAgICAgICBhZ2VudE91dHB1dDogYXJncy5hZ2VudE91dHB1dCxcbiAgICAgICAgICAgICAgICBvdXRwdXQ6IGF3YWl0IGV4ZWN1dGUoYXJncyksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ndWFyZHJhaWwubWpzLm1hcCIsImltcG9ydCB7IE1vZGVsQmVoYXZpb3JFcnJvciwgVXNlckVycm9yIH0gZnJvbSBcIi4vZXJyb3JzLm1qc1wiO1xuaW1wb3J0IHsgdG9GdW5jdGlvblRvb2xOYW1lIH0gZnJvbSBcIi4vdXRpbHMvdG9vbHMubWpzXCI7XG5pbXBvcnQgeyBnZXRTY2hlbWFBbmRQYXJzZXJGcm9tSW5wdXRUeXBlIH0gZnJvbSBcIi4vdXRpbHMvdG9vbHMubWpzXCI7XG5pbXBvcnQgeyBhZGRFcnJvclRvQ3VycmVudFNwYW4gfSBmcm9tIFwiLi90cmFjaW5nL2NvbnRleHQubWpzXCI7XG5pbXBvcnQgbG9nZ2VyIGZyb20gXCIuL2xvZ2dlci5tanNcIjtcbi8qKlxuICogR2VuZXJhdGVzIHRoZSBtZXNzYWdlIHRoYXQgd2lsbCBiZSBnaXZlbiBhcyB0b29sIG91dHB1dCB0byB0aGUgbW9kZWwgdGhhdCByZXF1ZXN0ZWQgdGhlIGhhbmRvZmYuXG4gKlxuICogQHBhcmFtIGFnZW50IFRoZSBhZ2VudCB0byB0cmFuc2ZlciB0b1xuICogQHJldHVybnMgVGhlIG1lc3NhZ2UgdGhhdCB3aWxsIGJlIGdpdmVuIGFzIHRvb2wgb3V0cHV0IHRvIHRoZSBtb2RlbCB0aGF0IHJlcXVlc3RlZCB0aGUgaGFuZG9mZlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHJhbnNmZXJNZXNzYWdlKGFnZW50KSB7XG4gICAgcmV0dXJuIGB7J2Fzc2lzdGFudCc6ICcke2FnZW50Lm5hbWV9J31gO1xufVxuLyoqXG4gKiBUaGUgZGVmYXVsdCBuYW1lIG9mIHRoZSB0b29sIHRoYXQgcmVwcmVzZW50cyB0aGUgaGFuZG9mZi5cbiAqXG4gKiBAcGFyYW0gYWdlbnQgVGhlIGFnZW50IHRvIHRyYW5zZmVyIHRvXG4gKiBAcmV0dXJucyBUaGUgbmFtZSBvZiB0aGUgdG9vbCB0aGF0IHJlcHJlc2VudHMgdGhlIGhhbmRvZmZcbiAqL1xuZnVuY3Rpb24gZGVmYXVsdEhhbmRvZmZUb29sTmFtZShhZ2VudCkge1xuICAgIHJldHVybiBgdHJhbnNmZXJfdG9fJHt0b0Z1bmN0aW9uVG9vbE5hbWUoYWdlbnQubmFtZSl9YDtcbn1cbi8qKlxuICogR2VuZXJhdGVzIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgdG9vbCB0aGF0IHJlcHJlc2VudHMgdGhlIGhhbmRvZmYuXG4gKlxuICogQHBhcmFtIGFnZW50IFRoZSBhZ2VudCB0byB0cmFuc2ZlciB0b1xuICogQHJldHVybnMgVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSB0b29sIHRoYXQgcmVwcmVzZW50cyB0aGUgaGFuZG9mZlxuICovXG5mdW5jdGlvbiBkZWZhdWx0SGFuZG9mZlRvb2xEZXNjcmlwdGlvbihhZ2VudCkge1xuICAgIHJldHVybiBgSGFuZG9mZiB0byB0aGUgJHthZ2VudC5uYW1lfSBhZ2VudCB0byBoYW5kbGUgdGhlIHJlcXVlc3QuICR7YWdlbnQuaGFuZG9mZkRlc2NyaXB0aW9uID8/ICcnfWA7XG59XG4vKipcbiAqIEEgaGFuZG9mZiBpcyB3aGVuIGFuIGFnZW50IGRlbGVnYXRlcyBhIHRhc2sgdG8gYW5vdGhlciBhZ2VudC5cbiAqIEZvciBleGFtcGxlLCBpbiBhIGN1c3RvbWVyIHN1cHBvcnQgc2NlbmFyaW8geW91IG1pZ2h0IGhhdmUgYSBcInRyaWFnZSBhZ2VudFwiIHRoYXQgZGV0ZXJtaW5lcyB3aGljaFxuICogYWdlbnQgc2hvdWxkIGhhbmRsZSB0aGUgdXNlcidzIHJlcXVlc3QsIGFuZCBzdWItYWdlbnRzIHRoYXQgc3BlY2lhbGl6ZSBpbiBkaWZmZXJlbnQgYXJlYXMgbGlrZVxuICogYmlsbGluZywgYWNjb3VudCBtYW5hZ2VtZW50LCBldGMuXG4gKlxuICogQHRlbXBsYXRlIFRDb250ZXh0IFRoZSBjb250ZXh0IG9mIHRoZSBoYW5kb2ZmXG4gKiBAdGVtcGxhdGUgVE91dHB1dCBUaGUgb3V0cHV0IHR5cGUgb2YgdGhlIGhhbmRvZmZcbiAqL1xuZXhwb3J0IGNsYXNzIEhhbmRvZmYge1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSB0b29sIHRoYXQgcmVwcmVzZW50cyB0aGUgaGFuZG9mZi5cbiAgICAgKi9cbiAgICB0b29sTmFtZTtcbiAgICAvKipcbiAgICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIHRvb2wgdGhhdCByZXByZXNlbnRzIHRoZSBoYW5kb2ZmLlxuICAgICAqL1xuICAgIHRvb2xEZXNjcmlwdGlvbjtcbiAgICAvKipcbiAgICAgKiBUaGUgSlNPTiBzY2hlbWEgZm9yIHRoZSBoYW5kb2ZmIGlucHV0LiBDYW4gYmUgZW1wdHkgaWYgdGhlIGhhbmRvZmYgZG9lcyBub3QgdGFrZSBhbiBpbnB1dFxuICAgICAqL1xuICAgIGlucHV0SnNvblNjaGVtYSA9IHtcbiAgICAgICAgdHlwZTogJ29iamVjdCcsXG4gICAgICAgIHByb3BlcnRpZXM6IHt9LFxuICAgICAgICByZXF1aXJlZDogW10sXG4gICAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBmYWxzZSxcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdGhlIGlucHV0IEpTT04gc2NoZW1hIGlzIGluIHN0cmljdCBtb2RlLiBXZSAqKnN0cm9uZ2x5KiogcmVjb21tZW5kIHNldHRpbmcgdGhpcyB0b1xuICAgICAqIHRydWUsIGFzIGl0IGluY3JlYXNlcyB0aGUgbGlrZWxpaG9vZCBvZiBjb3JyZWN0IEpTT04gaW5wdXQuXG4gICAgICovXG4gICAgc3RyaWN0SnNvblNjaGVtYSA9IHRydWU7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyB0aGUgaGFuZG9mZi4gVGhlIHBhcmFtZXRlcnMgcGFzc2VkIGFyZTpcbiAgICAgKiAxLiBUaGUgaGFuZG9mZiBydW4gY29udGV4dFxuICAgICAqIDIuIFRoZSBhcnVnbWVudHMgZnJvbSB0aGUgTExNLCBhcyBhIEpTT04gc3RyaW5nLiBFbXB0eSBzdHJpbmcgaWYgaW5wdXRKc29uU2NoZW1hIGlzIGVtcHR5LlxuICAgICAqXG4gICAgICogTXVzdCByZXR1cm4gYW4gYWdlbnRcbiAgICAgKi9cbiAgICBvbkludm9rZUhhbmRvZmY7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGFnZW50IHRoYXQgaXMgYmVpbmcgaGFuZGVkIG9mZiB0by5cbiAgICAgKi9cbiAgICBhZ2VudE5hbWU7XG4gICAgLyoqXG4gICAgICogQSBmdW5jdGlvbiB0aGF0IGZpbHRlcnMgdGhlIGlucHV0cyB0aGF0IGFyZSBwYXNzZWQgdG8gdGhlIG5leHQgYWdlbnQuIEJ5IGRlZmF1bHQsIHRoZSBuZXcgYWdlbnRcbiAgICAgKiBzZWVzIHRoZSBlbnRpcmUgY29udmVyc2F0aW9uIGhpc3RvcnkuIEluIHNvbWUgY2FzZXMsIHlvdSBtYXkgd2FudCB0byBmaWx0ZXIgaW5wdXRzIGUuZy4gdG9cbiAgICAgKiByZW1vdmUgb2xkZXIgaW5wdXRzLCBvciByZW1vdmUgdG9vbHMgZnJvbSBleGlzdGluZyBpbnB1dHMuXG4gICAgICpcbiAgICAgKiBUaGUgZnVuY3Rpb24gd2lsbCByZWNlaXZlIHRoZSBlbnRpcmUgY29udmVyc2F0aW9uIGhpc3N0b3J5IHNvIGZhciwgaW5jbHVkaW5nIHRoZSBpbnB1dCBpdGVtXG4gICAgICogdGhhdCB0cmlnZ2VyZWQgdGhlIGhhbmRvZmYgYW5kIGEgdG9vbCBjYWxsIG91dHB1dCBpdGVtIHJlcHJlc2VudGluZyB0aGUgaGFuZG9mZiB0b29sJ3Mgb3V0cHV0LlxuICAgICAqXG4gICAgICogWW91IGFyZSBmcmVlIHRvIG1vZGlmeSB0aGUgaW5wdXQgaGlzdG9yeSBvciBuZXcgaXRlbXMgYXMgeW91IHNlZSBmaXQuIFRoZSBuZXh0IGFnZW50IHRoYXQgcnVuc1xuICAgICAqIHdpbGwgcmVjZWl2ZSBgaGFuZG9mZklucHV0RGF0YS5hbGxJdGVtc1xuICAgICAqL1xuICAgIGlucHV0RmlsdGVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBhZ2VudCB0aGF0IGlzIGJlaW5nIGhhbmRlZCBvZmYgdG8uXG4gICAgICovXG4gICAgYWdlbnQ7XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIGZ1bmN0aW9uIHRvb2wgZGVmaW5pdGlvbiB0aGF0IGNhbiBiZSB1c2VkIHRvIGludm9rZSB0aGUgaGFuZG9mZi5cbiAgICAgKi9cbiAgICBnZXRIYW5kb2ZmQXNGdW5jdGlvblRvb2woKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiAnZnVuY3Rpb24nLFxuICAgICAgICAgICAgbmFtZTogdGhpcy50b29sTmFtZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLnRvb2xEZXNjcmlwdGlvbixcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IHRoaXMuaW5wdXRKc29uU2NoZW1hLFxuICAgICAgICAgICAgc3RyaWN0OiB0aGlzLnN0cmljdEpzb25TY2hlbWEsXG4gICAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKGFnZW50LCBvbkludm9rZUhhbmRvZmYpIHtcbiAgICAgICAgdGhpcy5hZ2VudE5hbWUgPSBhZ2VudC5uYW1lO1xuICAgICAgICB0aGlzLm9uSW52b2tlSGFuZG9mZiA9IG9uSW52b2tlSGFuZG9mZjtcbiAgICAgICAgdGhpcy50b29sTmFtZSA9IGRlZmF1bHRIYW5kb2ZmVG9vbE5hbWUoYWdlbnQpO1xuICAgICAgICB0aGlzLnRvb2xEZXNjcmlwdGlvbiA9IGRlZmF1bHRIYW5kb2ZmVG9vbERlc2NyaXB0aW9uKGFnZW50KTtcbiAgICAgICAgdGhpcy5hZ2VudCA9IGFnZW50O1xuICAgIH1cbn1cbi8qKlxuICogQ3JlYXRlcyBhIGhhbmRvZmYgZnJvbSBhbiBhZ2VudC4gSGFuZG9mZnMgYXJlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCB3aGVuIHlvdSBwYXNzIGFuIGFnZW50XG4gKiBpbnRvIHRoZSBgaGFuZG9mZnNgIG9wdGlvbiBvZiB0aGUgYEFnZW50YCBjb25zdHJ1Y3Rvci4gQWx0ZXJuYXRpdmVseSwgeW91IGNhbiB1c2UgdGhpcyBmdW5jdGlvblxuICogdG8gY3JlYXRlIGEgaGFuZG9mZiBtYW51YWxseSwgZ2l2aW5nIHlvdSBtb3JlIGNvbnRyb2wgb3ZlciBjb25maWd1cmF0aW9uLlxuICpcbiAqIEB0ZW1wbGF0ZSBUQ29udGV4dCBUaGUgY29udGV4dCBvZiB0aGUgaGFuZG9mZlxuICogQHRlbXBsYXRlIFRPdXRwdXQgVGhlIG91dHB1dCB0eXBlIG9mIHRoZSBoYW5kb2ZmXG4gKiBAdGVtcGxhdGUgVElucHV0VHlwZSBUaGUgaW5wdXQgdHlwZSBvZiB0aGUgaGFuZG9mZlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFuZG9mZihhZ2VudCwgY29uZmlnID0ge30pIHtcbiAgICBsZXQgcGFyc2VyID0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IGhhc09uSGFuZG9mZiA9ICEhY29uZmlnLm9uSGFuZG9mZjtcbiAgICBjb25zdCBoYXNJbnB1dFR5cGUgPSAhIWNvbmZpZy5pbnB1dFR5cGU7XG4gICAgY29uc3QgaGFzQm90aE9yTmVpdGhlckhhbmRvZmZBbmRJbnB1dFR5cGUgPSBoYXNPbkhhbmRvZmYgPT09IGhhc0lucHV0VHlwZTtcbiAgICBpZiAoIWhhc0JvdGhPck5laXRoZXJIYW5kb2ZmQW5kSW5wdXRUeXBlKSB7XG4gICAgICAgIHRocm93IG5ldyBVc2VyRXJyb3IoJ1lvdSBtdXN0IHByb3ZpZGUgZWl0aGVyIGJvdGggYG9uSGFuZG9mZmAgYW5kIGBpbnB1dFR5cGVgIG9yIG5laXRoZXIuJyk7XG4gICAgfVxuICAgIGFzeW5jIGZ1bmN0aW9uIG9uSW52b2tlSGFuZG9mZihjb250ZXh0LCBpbnB1dEpzb25TdHJpbmcpIHtcbiAgICAgICAgaWYgKHBhcnNlcikge1xuICAgICAgICAgICAgaWYgKCFpbnB1dEpzb25TdHJpbmcpIHtcbiAgICAgICAgICAgICAgICBhZGRFcnJvclRvQ3VycmVudFNwYW4oe1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgSGFuZG9mZiBmdW5jdGlvbiBleHBlY3RlZCBub24gZW1wdHkgaW5wdXQgYnV0IGdvdDogJHtpbnB1dEpzb25TdHJpbmd9YCxcbiAgICAgICAgICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsczogYGlucHV0IGlzIGVtcHR5YCxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTW9kZWxCZWhhdmlvckVycm9yKCdIYW5kb2ZmIGZ1bmN0aW9uIGV4cGVjdGVkIG5vbiBlbXB0eSBpbnB1dCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAvLyB2ZXJpZnkgdGhhdCBpdCdzIHZhbGlkIGlucHV0IGJ1dCB3ZSBkb24ndCBjYXJlIGFib3V0IHRoZSByZXN1bHRcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBhd2FpdCBwYXJzZXIoaW5wdXRKc29uU3RyaW5nKTtcbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnLm9uSGFuZG9mZikge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjb25maWcub25IYW5kb2ZmKGNvbnRleHQsIHBhcnNlZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgYWRkRXJyb3JUb0N1cnJlbnRTcGFuKHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYEludmFsaWQgSlNPTiBwcm92aWRlZGAsXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IHt9LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmICghbG9nZ2VyLmRvbnRMb2dUb29sRGF0YSkge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYEludmFsaWQgSlNPTiB3aGVuIHBhcnNpbmc6ICR7aW5wdXRKc29uU3RyaW5nfS4gRXJyb3I6ICR7ZXJyb3J9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBNb2RlbEJlaGF2aW9yRXJyb3IoJ0ludmFsaWQgSlNPTiBwcm92aWRlZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYXdhaXQgY29uZmlnLm9uSGFuZG9mZj8uKGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhZ2VudDtcbiAgICB9XG4gICAgY29uc3QgaGFuZG9mZiA9IG5ldyBIYW5kb2ZmKGFnZW50LCBvbkludm9rZUhhbmRvZmYpO1xuICAgIGlmIChjb25maWcuaW5wdXRUeXBlKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGdldFNjaGVtYUFuZFBhcnNlckZyb21JbnB1dFR5cGUoY29uZmlnLmlucHV0VHlwZSwgaGFuZG9mZi50b29sTmFtZSk7XG4gICAgICAgIGhhbmRvZmYuaW5wdXRKc29uU2NoZW1hID0gcmVzdWx0LnNjaGVtYTtcbiAgICAgICAgaGFuZG9mZi5zdHJpY3RKc29uU2NoZW1hID0gdHJ1ZTtcbiAgICAgICAgcGFyc2VyID0gcmVzdWx0LnBhcnNlcjtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy50b29sTmFtZU92ZXJyaWRlKSB7XG4gICAgICAgIGhhbmRvZmYudG9vbE5hbWUgPSBjb25maWcudG9vbE5hbWVPdmVycmlkZTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy50b29sRGVzY3JpcHRpb25PdmVycmlkZSkge1xuICAgICAgICBoYW5kb2ZmLnRvb2xEZXNjcmlwdGlvbiA9IGNvbmZpZy50b29sRGVzY3JpcHRpb25PdmVycmlkZTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5pbnB1dEZpbHRlcikge1xuICAgICAgICBoYW5kb2ZmLmlucHV0RmlsdGVyID0gY29uZmlnLmlucHV0RmlsdGVyO1xuICAgIH1cbiAgICByZXR1cm4gaGFuZG9mZjtcbn1cbi8qKlxuICogUmV0dXJucyBhIGhhbmRvZmYgZm9yIHRoZSBnaXZlbiBhZ2VudC4gSWYgdGhlIGFnZW50IGlzIGFscmVhZHkgd3JhcHBlZCBpbnRvIGEgaGFuZG9mZixcbiAqIGl0IHdpbGwgYmUgcmV0dXJuZWQgYXMgaXMuIE90aGVyd2lzZSwgYSBuZXcgaGFuZG9mZiBpbnN0YW5jZSB3aWxsIGJlIGNyZWF0ZWQuXG4gKlxuICogQHRlbXBsYXRlIFRDb250ZXh0IFRoZSBjb250ZXh0IG9mIHRoZSBoYW5kb2ZmXG4gKiBAdGVtcGxhdGUgVE91dHB1dCBUaGUgb3V0cHV0IHR5cGUgb2YgdGhlIGhhbmRvZmZcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEhhbmRvZmYoYWdlbnQpIHtcbiAgICBpZiAoYWdlbnQgaW5zdGFuY2VvZiBIYW5kb2ZmKSB7XG4gICAgICAgIHJldHVybiBhZ2VudDtcbiAgICB9XG4gICAgcmV0dXJuIGhhbmRvZmYoYWdlbnQpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aGFuZG9mZi5tanMubWFwIiwibGV0IERFRkFVTFRfUFJPVklERVI7XG4vKipcbiAqIFNldCB0aGUgbW9kZWwgcHJvdmlkZXIgdXNlZCB3aGVuIG5vIGV4cGxpY2l0IHByb3ZpZGVyIGlzIHN1cHBsaWVkLlxuICpcbiAqIEBwYXJhbSBwcm92aWRlciAtIFRoZSBwcm92aWRlciB0byB1c2UgYnkgZGVmYXVsdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldERlZmF1bHRNb2RlbFByb3ZpZGVyKHByb3ZpZGVyKSB7XG4gICAgREVGQVVMVF9QUk9WSURFUiA9IHByb3ZpZGVyO1xufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSBkZWZhdWx0IG1vZGVsIHByb3ZpZGVyLlxuICpcbiAqIEByZXR1cm5zIFRoZSBkZWZhdWx0IG1vZGVsIHByb3ZpZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVmYXVsdE1vZGVsUHJvdmlkZXIoKSB7XG4gICAgaWYgKHR5cGVvZiBERUZBVUxUX1BST1ZJREVSID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGRlZmF1bHQgbW9kZWwgcHJvdmlkZXIgc2V0LiBNYWtlIHN1cmUgdG8gc2V0IGEgcHJvdmlkZXIgdXNpbmcgc2V0RGVmYXVsdE1vZGVsUHJvdmlkZXIgYmVmb3JlIGNhbGxpbmcgZ2V0RGVmYXVsdE1vZGVsUHJvdmlkZXIgb3IgcGFzcyBhbiBleHBsaWNpdCBwcm92aWRlci4nKTtcbiAgICB9XG4gICAgcmV0dXJuIERFRkFVTFRfUFJPVklERVI7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wcm92aWRlcnMubWpzLm1hcCIsImltcG9ydCB7IHogfSBmcm9tICdAb3BlbmFpL3pvZC92Myc7XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTaGFyZWQgYmFzZSB0eXBlc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLyoqXG4gKiBFdmVyeSBpdGVtIGluIHRoZSBwcm90b2NvbCBwcm92aWRlcyBhIGBwcm92aWRlckRhdGFgIGZpZWxkIHRvIGFjY29tb2RhdGUgY3VzdG9tIGZ1bmN0aW9uYWxpdHlcbiAqIG9yIG5ldyBmaWVsZHNcbiAqL1xuZXhwb3J0IGNvbnN0IFNoYXJlZEJhc2UgPSB6Lm9iamVjdCh7XG4gICAgLyoqXG4gICAgICogQWRkaXRpb25hbCBvcHRpb25hbCBwcm92aWRlciBzcGVjaWZpYyBkYXRhLiBVc2VkIGZvciBjdXN0b20gZnVuY3Rpb25hbGl0eSBvciBtb2RlbCBwcm92aWRlclxuICAgICAqIHNwZWNpZmljIGZpZWxkcy5cbiAgICAgKi9cbiAgICBwcm92aWRlckRhdGE6IHoucmVjb3JkKHouc3RyaW5nKCksIHouYW55KCkpLm9wdGlvbmFsKCksXG59KTtcbi8qKlxuICogRXZlcnkgaXRlbSBoYXMgYSBzaGFyZWQgb2Ygc2hhcmVkIGl0ZW0gZGF0YSBpbmNsdWRpbmcgYW4gb3B0aW9uYWwgSUQuXG4gKi9cbmV4cG9ydCBjb25zdCBJdGVtQmFzZSA9IFNoYXJlZEJhc2UuZXh0ZW5kKHtcbiAgICAvKipcbiAgICAgKiBBbiBJRCB0byBpZGVudGlmeSB0aGUgaXRlbS4gVGhpcyBpcyBvcHRpb25hbCBieSBkZWZhdWx0LiBJZiBhIG1vZGVsIHByb3ZpZGVyIGFic29sdXRlbHlcbiAgICAgKiByZXF1aXJlcyB0aGlzIGZpZWxkLCBpdCB3aWxsIGJlIHZhbGlkYXRlZCBvbiB0aGUgbW9kZWwgbGV2ZWwuXG4gICAgICovXG4gICAgaWQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbn0pO1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQ29udGVudCB0eXBlc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuZXhwb3J0IGNvbnN0IFJlZnVzYWwgPSBTaGFyZWRCYXNlLmV4dGVuZCh7XG4gICAgdHlwZTogei5saXRlcmFsKCdyZWZ1c2FsJyksXG4gICAgLyoqXG4gICAgICogVGhlIHJlZnVzYWwgZXhwbGFuYXRpb24gZnJvbSB0aGUgbW9kZWwuXG4gICAgICovXG4gICAgcmVmdXNhbDogei5zdHJpbmcoKSxcbn0pO1xuZXhwb3J0IGNvbnN0IE91dHB1dFRleHQgPSBTaGFyZWRCYXNlLmV4dGVuZCh7XG4gICAgdHlwZTogei5saXRlcmFsKCdvdXRwdXRfdGV4dCcpLFxuICAgIC8qKlxuICAgICAqIFRoZSB0ZXh0IG91dHB1dCBmcm9tIHRoZSBtb2RlbC5cbiAgICAgKi9cbiAgICB0ZXh0OiB6LnN0cmluZygpLFxufSk7XG5leHBvcnQgY29uc3QgSW5wdXRUZXh0ID0gU2hhcmVkQmFzZS5leHRlbmQoe1xuICAgIHR5cGU6IHoubGl0ZXJhbCgnaW5wdXRfdGV4dCcpLFxuICAgIC8qKlxuICAgICAqIEEgdGV4dCBpbnB1dCBmb3IgZXhhbXBsZSBhIG1lc3NhZ2UgZnJvbSBhIHVzZXJcbiAgICAgKi9cbiAgICB0ZXh0OiB6LnN0cmluZygpLFxufSk7XG5leHBvcnQgY29uc3QgSW5wdXRJbWFnZSA9IFNoYXJlZEJhc2UuZXh0ZW5kKHtcbiAgICB0eXBlOiB6LmxpdGVyYWwoJ2lucHV0X2ltYWdlJyksXG4gICAgLyoqXG4gICAgICogVGhlIGltYWdlIGlucHV0IHRvIHRoZSBtb2RlbC4gQ291bGQgYmUgYSBVUkwsIGJhc2U2NCBvciBhbiBvYmplY3Qgd2l0aCBhIGZpbGUgSUQuXG4gICAgICovXG4gICAgaW1hZ2U6IHpcbiAgICAgICAgLnN0cmluZygpXG4gICAgICAgIC5vcih6Lm9iamVjdCh7XG4gICAgICAgIGlkOiB6LnN0cmluZygpLFxuICAgIH0pKVxuICAgICAgICAuZGVzY3JpYmUoJ0NvdWxkIGJlIGEgVVJMLCBiYXNlNjQgb3IgYW4gb2JqZWN0IHdpdGggYSBmaWxlIElELicpLFxufSk7XG5leHBvcnQgY29uc3QgSW5wdXRGaWxlID0gU2hhcmVkQmFzZS5leHRlbmQoe1xuICAgIHR5cGU6IHoubGl0ZXJhbCgnaW5wdXRfZmlsZScpLFxuICAgIC8qKlxuICAgICAqIFRoZSBmaWxlIGlucHV0IHRvIHRoZSBtb2RlbC4gQ291bGQgYmUgYSBVUkwsIGJhc2U2NCBvciBhbiBvYmplY3Qgd2l0aCBhIGZpbGUgSUQuXG4gICAgICovXG4gICAgZmlsZTogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLm9yKHoub2JqZWN0KHtcbiAgICAgICAgaWQ6IHouc3RyaW5nKCksXG4gICAgfSkpXG4gICAgICAgIC5kZXNjcmliZSgnQ29udGVudHMgb2YgdGhlIGZpbGUgb3IgYW4gb2JqZWN0IHdpdGggYSBmaWxlIElELicpLFxufSk7XG5leHBvcnQgY29uc3QgQXVkaW9Db250ZW50ID0gU2hhcmVkQmFzZS5leHRlbmQoe1xuICAgIHR5cGU6IHoubGl0ZXJhbCgnYXVkaW8nKSxcbiAgICAvKipcbiAgICAgKiBUaGUgYXVkaW8gaW5wdXQgdG8gdGhlIG1vZGVsLiBDb3VsZCBiZSBiYXNlNjQgZW5jb2RlZCBhdWRpbyBkYXRhIG9yIGFuIG9iamVjdCB3aXRoIGEgZmlsZSBJRC5cbiAgICAgKi9cbiAgICBhdWRpbzogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLm9yKHoub2JqZWN0KHtcbiAgICAgICAgaWQ6IHouc3RyaW5nKCksXG4gICAgfSkpXG4gICAgICAgIC5kZXNjcmliZSgnQmFzZTY0IGVuY29kZWQgYXVkaW8gZGF0YSBvciBmaWxlIGlkJyksXG4gICAgLyoqXG4gICAgICogVGhlIGZvcm1hdCBvZiB0aGUgYXVkaW8uXG4gICAgICovXG4gICAgZm9ybWF0OiB6LnN0cmluZygpLm51bGxhYmxlKCkub3B0aW9uYWwoKSxcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhbnNjcmlwdCBvZiB0aGUgYXVkaW8uXG4gICAgICovXG4gICAgdHJhbnNjcmlwdDogei5zdHJpbmcoKS5udWxsYWJsZSgpLm9wdGlvbmFsKCksXG59KTtcbmV4cG9ydCBjb25zdCBJbWFnZUNvbnRlbnQgPSBTaGFyZWRCYXNlLmV4dGVuZCh7XG4gICAgdHlwZTogei5saXRlcmFsKCdpbWFnZScpLFxuICAgIC8qKlxuICAgICAqIFRoZSBpbWFnZSBpbnB1dCB0byB0aGUgbW9kZWwuIENvdWxkIGJlIGJhc2U2NCBlbmNvZGVkIGltYWdlIGRhdGEgb3IgYW4gb2JqZWN0IHdpdGggYSBmaWxlIElELlxuICAgICAqL1xuICAgIGltYWdlOiB6LnN0cmluZygpLmRlc2NyaWJlKCdCYXNlNjQgZW5jb2RlZCBpbWFnZSBkYXRhJyksXG59KTtcbmV4cG9ydCBjb25zdCBUb29sT3V0cHV0VGV4dCA9IFNoYXJlZEJhc2UuZXh0ZW5kKHtcbiAgICB0eXBlOiB6LmxpdGVyYWwoJ3RleHQnKSxcbiAgICAvKipcbiAgICAgKiBUaGUgdGV4dCBvdXRwdXQgZnJvbSB0aGUgbW9kZWwuXG4gICAgICovXG4gICAgdGV4dDogei5zdHJpbmcoKSxcbn0pO1xuZXhwb3J0IGNvbnN0IFRvb2xPdXRwdXRJbWFnZSA9IFNoYXJlZEJhc2UuZXh0ZW5kKHtcbiAgICB0eXBlOiB6LmxpdGVyYWwoJ2ltYWdlJyksXG4gICAgLyoqXG4gICAgICogVGhlIGltYWdlIGRhdGEuIENvdWxkIGJlIGJhc2U2NCBlbmNvZGVkIGltYWdlIGRhdGEgb3IgYW4gb2JqZWN0IHdpdGggYSBmaWxlIElELlxuICAgICAqL1xuICAgIGRhdGE6IHouc3RyaW5nKCkuZGVzY3JpYmUoJ0Jhc2U2NCBlbmNvZGVkIGltYWdlIGRhdGEnKSxcbiAgICAvKipcbiAgICAgKiBUaGUgbWVkaWEgdHlwZSBvZiB0aGUgaW1hZ2UuXG4gICAgICovXG4gICAgbWVkaWFUeXBlOiB6LnN0cmluZygpLmRlc2NyaWJlKCdJQU5BIG1lZGlhIHR5cGUgb2YgdGhlIGltYWdlJyksXG59KTtcbmV4cG9ydCBjb25zdCBDb21wdXRlclRvb2xPdXRwdXQgPSBTaGFyZWRCYXNlLmV4dGVuZCh7XG4gICAgdHlwZTogei5saXRlcmFsKCdjb21wdXRlcl9zY3JlZW5zaG90JyksXG4gICAgLyoqXG4gICAgICogQSBiYXNlNjQgZW5jb2RlZCBpbWFnZSBkYXRhIG9yIGEgVVJMIHJlcHJlc2VudGluZyB0aGUgc2NyZWVuc2hvdC5cbiAgICAgKi9cbiAgICBkYXRhOiB6LnN0cmluZygpLmRlc2NyaWJlKCdCYXNlNjQgZW5jb2RlZCBpbWFnZSBkYXRhIG9yIFVSTCcpLFxufSk7XG5leHBvcnQgY29uc3QgY29tcHV0ZXJBY3Rpb25zID0gei5kaXNjcmltaW5hdGVkVW5pb24oJ3R5cGUnLCBbXG4gICAgei5vYmplY3QoeyB0eXBlOiB6LmxpdGVyYWwoJ3NjcmVlbnNob3QnKSB9KSxcbiAgICB6Lm9iamVjdCh7XG4gICAgICAgIHR5cGU6IHoubGl0ZXJhbCgnY2xpY2snKSxcbiAgICAgICAgeDogei5udW1iZXIoKSxcbiAgICAgICAgeTogei5udW1iZXIoKSxcbiAgICAgICAgYnV0dG9uOiB6LmVudW0oWydsZWZ0JywgJ3JpZ2h0JywgJ3doZWVsJywgJ2JhY2snLCAnZm9yd2FyZCddKSxcbiAgICB9KSxcbiAgICB6Lm9iamVjdCh7XG4gICAgICAgIHR5cGU6IHoubGl0ZXJhbCgnZG91YmxlX2NsaWNrJyksXG4gICAgICAgIHg6IHoubnVtYmVyKCksXG4gICAgICAgIHk6IHoubnVtYmVyKCksXG4gICAgfSksXG4gICAgei5vYmplY3Qoe1xuICAgICAgICB0eXBlOiB6LmxpdGVyYWwoJ3Njcm9sbCcpLFxuICAgICAgICB4OiB6Lm51bWJlcigpLFxuICAgICAgICB5OiB6Lm51bWJlcigpLFxuICAgICAgICBzY3JvbGxfeDogei5udW1iZXIoKSxcbiAgICAgICAgc2Nyb2xsX3k6IHoubnVtYmVyKCksXG4gICAgfSksXG4gICAgei5vYmplY3Qoe1xuICAgICAgICB0eXBlOiB6LmxpdGVyYWwoJ3R5cGUnKSxcbiAgICAgICAgdGV4dDogei5zdHJpbmcoKSxcbiAgICB9KSxcbiAgICB6Lm9iamVjdCh7IHR5cGU6IHoubGl0ZXJhbCgnd2FpdCcpIH0pLFxuICAgIHoub2JqZWN0KHtcbiAgICAgICAgdHlwZTogei5saXRlcmFsKCdtb3ZlJyksXG4gICAgICAgIHg6IHoubnVtYmVyKCksXG4gICAgICAgIHk6IHoubnVtYmVyKCksXG4gICAgfSksXG4gICAgei5vYmplY3Qoe1xuICAgICAgICB0eXBlOiB6LmxpdGVyYWwoJ2tleXByZXNzJyksXG4gICAgICAgIGtleXM6IHouYXJyYXkoei5zdHJpbmcoKSksXG4gICAgfSksXG4gICAgei5vYmplY3Qoe1xuICAgICAgICB0eXBlOiB6LmxpdGVyYWwoJ2RyYWcnKSxcbiAgICAgICAgcGF0aDogei5hcnJheSh6Lm9iamVjdCh7IHg6IHoubnVtYmVyKCksIHk6IHoubnVtYmVyKCkgfSkpLFxuICAgIH0pLFxuXSk7XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBNZXNzYWdlIHR5cGVzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5leHBvcnQgY29uc3QgQXNzaXN0YW50Q29udGVudCA9IHouZGlzY3JpbWluYXRlZFVuaW9uKCd0eXBlJywgW1xuICAgIE91dHB1dFRleHQsXG4gICAgUmVmdXNhbCxcbiAgICBJbnB1dFRleHQsXG4gICAgQXVkaW9Db250ZW50LFxuICAgIEltYWdlQ29udGVudCxcbl0pO1xuY29uc3QgTWVzc2FnZUJhc2UgPSBJdGVtQmFzZS5leHRlbmQoe1xuICAgIC8qKlxuICAgICAqIEFueSBpdGVtIHdpdGhvdXQgYSB0eXBlIGlzIHRyZWF0ZWQgYXMgYSBtZXNzYWdlXG4gICAgICovXG4gICAgdHlwZTogei5saXRlcmFsKCdtZXNzYWdlJykub3B0aW9uYWwoKSxcbn0pO1xuZXhwb3J0IGNvbnN0IEFzc2lzdGFudE1lc3NhZ2VJdGVtID0gTWVzc2FnZUJhc2UuZXh0ZW5kKHtcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRpbmcgYSBtZXNzYWdlIGZyb20gdGhlIGFzc2lzdGFudCAoaS5lLiB0aGUgbW9kZWwpXG4gICAgICovXG4gICAgcm9sZTogei5saXRlcmFsKCdhc3Npc3RhbnQnKSxcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhdHVzIG9mIHRoZSBtZXNzYWdlLlxuICAgICAqL1xuICAgIHN0YXR1czogei5lbnVtKFsnaW5fcHJvZ3Jlc3MnLCAnY29tcGxldGVkJywgJ2luY29tcGxldGUnXSksXG4gICAgLyoqXG4gICAgICogVGhlIGNvbnRlbnQgb2YgdGhlIG1lc3NhZ2UuXG4gICAgICovXG4gICAgY29udGVudDogei5hcnJheShBc3Npc3RhbnRDb250ZW50KSxcbn0pO1xuZXhwb3J0IGNvbnN0IFVzZXJDb250ZW50ID0gei5kaXNjcmltaW5hdGVkVW5pb24oJ3R5cGUnLCBbXG4gICAgSW5wdXRUZXh0LFxuICAgIElucHV0SW1hZ2UsXG4gICAgSW5wdXRGaWxlLFxuICAgIEF1ZGlvQ29udGVudCxcbl0pO1xuZXhwb3J0IGNvbnN0IFVzZXJNZXNzYWdlSXRlbSA9IE1lc3NhZ2VCYXNlLmV4dGVuZCh7XG4gICAgLy8gdHlwZTogei5saXRlcmFsKCdtZXNzYWdlJyksXG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50aW5nIGEgbWVzc2FnZSBmcm9tIHRoZSB1c2VyXG4gICAgICovXG4gICAgcm9sZTogei5saXRlcmFsKCd1c2VyJyksXG4gICAgLyoqXG4gICAgICogVGhlIGNvbnRlbnQgb2YgdGhlIG1lc3NhZ2UuXG4gICAgICovXG4gICAgY29udGVudDogei5hcnJheShVc2VyQ29udGVudCkub3Ioei5zdHJpbmcoKSksXG59KTtcbmNvbnN0IFN5c3RlbU1lc3NhZ2VJdGVtID0gTWVzc2FnZUJhc2UuZXh0ZW5kKHtcbiAgICAvLyB0eXBlOiB6LmxpdGVyYWwoJ21lc3NhZ2UnKSxcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRpbmcgYSBzeXN0ZW0gbWVzc2FnZSB0byB0aGUgdXNlclxuICAgICAqL1xuICAgIHJvbGU6IHoubGl0ZXJhbCgnc3lzdGVtJyksXG4gICAgLyoqXG4gICAgICogVGhlIGNvbnRlbnQgb2YgdGhlIG1lc3NhZ2UuXG4gICAgICovXG4gICAgY29udGVudDogei5zdHJpbmcoKSxcbn0pO1xuZXhwb3J0IGNvbnN0IE1lc3NhZ2VJdGVtID0gei5kaXNjcmltaW5hdGVkVW5pb24oJ3JvbGUnLCBbXG4gICAgU3lzdGVtTWVzc2FnZUl0ZW0sXG4gICAgQXNzaXN0YW50TWVzc2FnZUl0ZW0sXG4gICAgVXNlck1lc3NhZ2VJdGVtLFxuXSk7XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBUb29sIGNhbGwgdHlwZXNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmV4cG9ydCBjb25zdCBIb3N0ZWRUb29sQ2FsbEl0ZW0gPSBJdGVtQmFzZS5leHRlbmQoe1xuICAgIHR5cGU6IHoubGl0ZXJhbCgnaG9zdGVkX3Rvb2xfY2FsbCcpLFxuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBob3N0ZWQgdG9vbC4gRm9yIGV4YW1wbGUgYHdlYl9zZWFyY2hfY2FsbGAgb3IgYGZpbGVfc2VhcmNoX2NhbGxgXG4gICAgICovXG4gICAgbmFtZTogei5zdHJpbmcoKS5kZXNjcmliZSgnVGhlIG5hbWUgb2YgdGhlIGhvc3RlZCB0b29sJyksXG4gICAgLyoqXG4gICAgICogVGhlIHN0YXR1cyBvZiB0aGUgdG9vbCBjYWxsLlxuICAgICAqL1xuICAgIHN0YXR1czogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIC8qKlxuICAgICAqIFRoZSBwcmltYXJ5IG91dHB1dCBvZiB0aGUgdG9vbCBjYWxsLiBBZGRpdGlvbmFsIG91dHB1dCBtaWdodCBiZSBpbiB0aGUgYHByb3ZpZGVyRGF0YWAgZmllbGQuXG4gICAgICovXG4gICAgb3V0cHV0OiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG59KTtcbmV4cG9ydCBjb25zdCBGdW5jdGlvbkNhbGxJdGVtID0gSXRlbUJhc2UuZXh0ZW5kKHtcbiAgICB0eXBlOiB6LmxpdGVyYWwoJ2Z1bmN0aW9uX2NhbGwnKSxcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHRvb2wgY2FsbC4gUmVxdWlyZWQgdG8gbWF0Y2ggdXAgdGhlIHJlc3BlY3RpdmUgdG9vbCBjYWxsIHJlc3VsdC5cbiAgICAgKi9cbiAgICBjYWxsSWQ6IHouc3RyaW5nKCkuZGVzY3JpYmUoJ1RoZSBJRCBvZiB0aGUgdG9vbCBjYWxsJyksXG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIG5hbWU6IHouc3RyaW5nKCkuZGVzY3JpYmUoJ1RoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbicpLFxuICAgIC8qKlxuICAgICAqIFRoZSBzdGF0dXMgb2YgdGhlIGZ1bmN0aW9uIGNhbGwuXG4gICAgICovXG4gICAgc3RhdHVzOiB6LmVudW0oWydpbl9wcm9ncmVzcycsICdjb21wbGV0ZWQnLCAnaW5jb21wbGV0ZSddKS5vcHRpb25hbCgpLFxuICAgIC8qKlxuICAgICAqIFRoZSBhcmd1bWVudHMgb2YgdGhlIGZ1bmN0aW9uIGNhbGwuXG4gICAgICovXG4gICAgYXJndW1lbnRzOiB6LnN0cmluZygpLFxufSk7XG5leHBvcnQgY29uc3QgRnVuY3Rpb25DYWxsUmVzdWx0SXRlbSA9IEl0ZW1CYXNlLmV4dGVuZCh7XG4gICAgdHlwZTogei5saXRlcmFsKCdmdW5jdGlvbl9jYWxsX3Jlc3VsdCcpLFxuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSB0b29sIHRoYXQgd2FzIGNhbGxlZFxuICAgICAqL1xuICAgIG5hbWU6IHouc3RyaW5nKCkuZGVzY3JpYmUoJ1RoZSBuYW1lIG9mIHRoZSB0b29sJyksXG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSB0b29sIGNhbGwuIFJlcXVpcmVkIHRvIG1hdGNoIHVwIHRoZSByZXNwZWN0aXZlIHRvb2wgY2FsbCByZXN1bHQuXG4gICAgICovXG4gICAgY2FsbElkOiB6LnN0cmluZygpLmRlc2NyaWJlKCdUaGUgSUQgb2YgdGhlIHRvb2wgY2FsbCcpLFxuICAgIC8qKlxuICAgICAqIFRoZSBzdGF0dXMgb2YgdGhlIHRvb2wgY2FsbC5cbiAgICAgKi9cbiAgICBzdGF0dXM6IHouZW51bShbJ2luX3Byb2dyZXNzJywgJ2NvbXBsZXRlZCcsICdpbmNvbXBsZXRlJ10pLFxuICAgIC8qKlxuICAgICAqIFRoZSBvdXRwdXQgb2YgdGhlIHRvb2wgY2FsbC5cbiAgICAgKi9cbiAgICBvdXRwdXQ6IHouZGlzY3JpbWluYXRlZFVuaW9uKCd0eXBlJywgW1Rvb2xPdXRwdXRUZXh0LCBUb29sT3V0cHV0SW1hZ2VdKSxcbn0pO1xuZXhwb3J0IGNvbnN0IENvbXB1dGVyVXNlQ2FsbEl0ZW0gPSBJdGVtQmFzZS5leHRlbmQoe1xuICAgIHR5cGU6IHoubGl0ZXJhbCgnY29tcHV0ZXJfY2FsbCcpLFxuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgY29tcHV0ZXIgY2FsbC4gUmVxdWlyZWQgdG8gbWF0Y2ggdXAgdGhlIHJlc3BlY3RpdmUgY29tcHV0ZXIgY2FsbCByZXN1bHQuXG4gICAgICovXG4gICAgY2FsbElkOiB6LnN0cmluZygpLmRlc2NyaWJlKCdUaGUgSUQgb2YgdGhlIGNvbXB1dGVyIGNhbGwnKSxcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhdHVzIG9mIHRoZSBjb21wdXRlciBjYWxsLlxuICAgICAqL1xuICAgIHN0YXR1czogei5lbnVtKFsnaW5fcHJvZ3Jlc3MnLCAnY29tcGxldGVkJywgJ2luY29tcGxldGUnXSksXG4gICAgLyoqXG4gICAgICogVGhlIGFjdGlvbiB0byBiZSBwZXJmb3JtZWQgYnkgdGhlIGNvbXB1dGVyLlxuICAgICAqL1xuICAgIGFjdGlvbjogY29tcHV0ZXJBY3Rpb25zLFxufSk7XG5leHBvcnQgY29uc3QgQ29tcHV0ZXJDYWxsUmVzdWx0SXRlbSA9IEl0ZW1CYXNlLmV4dGVuZCh7XG4gICAgdHlwZTogei5saXRlcmFsKCdjb21wdXRlcl9jYWxsX3Jlc3VsdCcpLFxuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgY29tcHV0ZXIgY2FsbC4gUmVxdWlyZWQgdG8gbWF0Y2ggdXAgdGhlIHJlc3BlY3RpdmUgY29tcHV0ZXIgY2FsbCByZXN1bHQuXG4gICAgICovXG4gICAgY2FsbElkOiB6LnN0cmluZygpLmRlc2NyaWJlKCdUaGUgSUQgb2YgdGhlIGNvbXB1dGVyIGNhbGwnKSxcbiAgICAvKipcbiAgICAgKiBUaGUgb3V0cHV0IG9mIHRoZSBjb21wdXRlciBjYWxsLlxuICAgICAqL1xuICAgIG91dHB1dDogQ29tcHV0ZXJUb29sT3V0cHV0LFxufSk7XG5leHBvcnQgY29uc3QgVG9vbENhbGxJdGVtID0gei5kaXNjcmltaW5hdGVkVW5pb24oJ3R5cGUnLCBbXG4gICAgQ29tcHV0ZXJVc2VDYWxsSXRlbSxcbiAgICBGdW5jdGlvbkNhbGxJdGVtLFxuICAgIEhvc3RlZFRvb2xDYWxsSXRlbSxcbl0pO1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gU3BlY2lhbCBpdGVtIHR5cGVzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5leHBvcnQgY29uc3QgUmVhc29uaW5nSXRlbSA9IFNoYXJlZEJhc2UuZXh0ZW5kKHtcbiAgICBpZDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIHR5cGU6IHoubGl0ZXJhbCgncmVhc29uaW5nJyksXG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgZmFjaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByZWFzb25pbmcuIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gbWlnaHQgYmUgaW4gdGhlIGBwcm92aWRlckRhdGFgIGZpZWxkLlxuICAgICAqL1xuICAgIGNvbnRlbnQ6IHouYXJyYXkoSW5wdXRUZXh0KSxcbn0pO1xuLyoqXG4gKiBUaGlzIGlzIGEgY2F0Y2ggYWxsIGZvciBpdGVtcyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgcHJvdG9jb2wuXG4gKlxuICogRm9yIGV4YW1wbGUsIGEgbW9kZWwgbWlnaHQgcmV0dXJuIGFuIGl0ZW0gdGhhdCBpcyBub3QgcGFydCBvZiB0aGUgcHJvdG9jb2wgdXNpbmcgdGhpcyB0eXBlLlxuICpcbiAqIEluIHRoYXQgY2FzZSBldmVyeXRoaW5nIHJldHVybmVkIGZyb20gdGhlIG1vZGVsIHNob3VsZCBiZSBwYXNzZWQgaW4gdGhlIGBwcm92aWRlckRhdGFgIGZpZWxkLlxuICpcbiAqIFRoaXMgZW5hYmxlcyBuZXcgZmVhdHVyZXMgdG8gYmUgYWRkZWQgdG8gYmUgYWRkZWQgYnkgYSBtb2RlbCBwcm92aWRlciB3aXRob3V0IGJyZWFraW5nIHRoZSBwcm90b2NvbC5cbiAqL1xuZXhwb3J0IGNvbnN0IFVua25vd25JdGVtID0gSXRlbUJhc2UuZXh0ZW5kKHtcbiAgICB0eXBlOiB6LmxpdGVyYWwoJ3Vua25vd24nKSxcbn0pO1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gSm9pbmVkIGl0ZW0gdHlwZXNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmV4cG9ydCBjb25zdCBPdXRwdXRNb2RlbEl0ZW0gPSB6LmRpc2NyaW1pbmF0ZWRVbmlvbigndHlwZScsIFtcbiAgICBBc3Npc3RhbnRNZXNzYWdlSXRlbSxcbiAgICBIb3N0ZWRUb29sQ2FsbEl0ZW0sXG4gICAgRnVuY3Rpb25DYWxsSXRlbSxcbiAgICBDb21wdXRlclVzZUNhbGxJdGVtLFxuICAgIFJlYXNvbmluZ0l0ZW0sXG4gICAgVW5rbm93bkl0ZW0sXG5dKTtcbmV4cG9ydCBjb25zdCBNb2RlbEl0ZW0gPSB6LnVuaW9uKFtcbiAgICBVc2VyTWVzc2FnZUl0ZW0sXG4gICAgQXNzaXN0YW50TWVzc2FnZUl0ZW0sXG4gICAgU3lzdGVtTWVzc2FnZUl0ZW0sXG4gICAgSG9zdGVkVG9vbENhbGxJdGVtLFxuICAgIEZ1bmN0aW9uQ2FsbEl0ZW0sXG4gICAgQ29tcHV0ZXJVc2VDYWxsSXRlbSxcbiAgICBGdW5jdGlvbkNhbGxSZXN1bHRJdGVtLFxuICAgIENvbXB1dGVyQ2FsbFJlc3VsdEl0ZW0sXG4gICAgUmVhc29uaW5nSXRlbSxcbiAgICBVbmtub3duSXRlbSxcbl0pO1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gTWV0YSBkYXRhIHR5cGVzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5leHBvcnQgY29uc3QgVXNhZ2VEYXRhID0gei5vYmplY3Qoe1xuICAgIHJlcXVlc3RzOiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gICAgaW5wdXRUb2tlbnM6IHoubnVtYmVyKCksXG4gICAgb3V0cHV0VG9rZW5zOiB6Lm51bWJlcigpLFxuICAgIHRvdGFsVG9rZW5zOiB6Lm51bWJlcigpLFxuICAgIGlucHV0VG9rZW5zRGV0YWlsczogei5yZWNvcmQoei5zdHJpbmcoKSwgei5udW1iZXIoKSkub3B0aW9uYWwoKSxcbiAgICBvdXRwdXRUb2tlbnNEZXRhaWxzOiB6LnJlY29yZCh6LnN0cmluZygpLCB6Lm51bWJlcigpKS5vcHRpb25hbCgpLFxufSk7XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTdHJlYW0gZXZlbnQgdHlwZXNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8qKlxuICogRXZlbnQgcmV0dXJuZWQgYnkgdGhlIG1vZGVsIHdoZW4gbmV3IG91dHB1dCB0ZXh0IGlzIGF2YWlsYWJsZSB0byBzdHJlYW0gdG8gdGhlIHVzZXIuXG4gKi9cbmV4cG9ydCBjb25zdCBTdHJlYW1FdmVudFRleHRTdHJlYW0gPSBTaGFyZWRCYXNlLmV4dGVuZCh7XG4gICAgdHlwZTogei5saXRlcmFsKCdvdXRwdXRfdGV4dF9kZWx0YScpLFxuICAgIC8qKlxuICAgICAqIFRoZSBkZWx0YSB0ZXh0IHRoYXQgd2FzIHN0cmVhbWVkIGJ5IHRoZSBtb2RlbHRvIHRoZSB1c2VyLlxuICAgICAqL1xuICAgIGRlbHRhOiB6LnN0cmluZygpLFxufSk7XG4vKipcbiAqIEV2ZW50IHJldHVybmVkIGJ5IHRoZSBtb2RlbCB3aGVuIGEgbmV3IHJlc3BvbnNlIGlzIHN0YXJ0ZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBTdHJlYW1FdmVudFJlc3BvbnNlU3RhcnRlZCA9IFNoYXJlZEJhc2UuZXh0ZW5kKHtcbiAgICB0eXBlOiB6LmxpdGVyYWwoJ3Jlc3BvbnNlX3N0YXJ0ZWQnKSxcbn0pO1xuLyoqXG4gKiBFdmVudCByZXR1cm5lZCBieSB0aGUgbW9kZWwgd2hlbiBhIHJlc3BvbnNlIGlzIGNvbXBsZXRlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IFN0cmVhbUV2ZW50UmVzcG9uc2VDb21wbGV0ZWQgPSBTaGFyZWRCYXNlLmV4dGVuZCh7XG4gICAgdHlwZTogei5saXRlcmFsKCdyZXNwb25zZV9kb25lJyksXG4gICAgLyoqXG4gICAgICogVGhlIHJlc3BvbnNlIGZyb20gdGhlIG1vZGVsLlxuICAgICAqL1xuICAgIHJlc3BvbnNlOiBTaGFyZWRCYXNlLmV4dGVuZCh7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgSUQgb2YgdGhlIHJlc3BvbnNlLlxuICAgICAgICAgKi9cbiAgICAgICAgaWQ6IHouc3RyaW5nKCksXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgdXNhZ2UgZGF0YSBmb3IgdGhlIHJlc3BvbnNlLlxuICAgICAgICAgKi9cbiAgICAgICAgdXNhZ2U6IFVzYWdlRGF0YSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBvdXRwdXQgZnJvbSB0aGUgbW9kZWwuXG4gICAgICAgICAqL1xuICAgICAgICBvdXRwdXQ6IHouYXJyYXkoT3V0cHV0TW9kZWxJdGVtKSxcbiAgICB9KSxcbn0pO1xuLyoqXG4gKiBFdmVudCByZXR1cm5lZCBmb3IgZXZlcnkgaXRlbSB0aGF0IGdldHMgc3RyZWFtZWQgdG8gdGhlIG1vZGVsLiBVc2VkIHRvIGV4cG9zZSB0aGUgcmF3IGV2ZW50c1xuICogZnJvbSB0aGUgbW9kZWwuXG4gKi9cbmV4cG9ydCBjb25zdCBTdHJlYW1FdmVudEdlbmVyaWNJdGVtID0gU2hhcmVkQmFzZS5leHRlbmQoe1xuICAgIHR5cGU6IHoubGl0ZXJhbCgnbW9kZWwnKSxcbiAgICBldmVudDogei5hbnkoKS5kZXNjcmliZSgnVGhlIGV2ZW50IGZyb20gdGhlIG1vZGVsJyksXG59KTtcbmV4cG9ydCBjb25zdCBTdHJlYW1FdmVudCA9IHouZGlzY3JpbWluYXRlZFVuaW9uKCd0eXBlJywgW1xuICAgIFN0cmVhbUV2ZW50VGV4dFN0cmVhbSxcbiAgICBTdHJlYW1FdmVudFJlc3BvbnNlQ29tcGxldGVkLFxuICAgIFN0cmVhbUV2ZW50UmVzcG9uc2VTdGFydGVkLFxuICAgIFN0cmVhbUV2ZW50R2VuZXJpY0l0ZW0sXG5dKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXByb3RvY29sLm1qcy5tYXAiLCJpbXBvcnQgeyBVc2FnZURhdGEgfSBmcm9tIFwiLi90eXBlcy9wcm90b2NvbC5tanNcIjtcbi8qKlxuICogVHJhY2tzIHRva2VuIHVzYWdlIGFuZCByZXF1ZXN0IGNvdW50cyBmb3IgYW4gYWdlbnQgcnVuLlxuICovXG5leHBvcnQgY2xhc3MgVXNhZ2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgcmVxdWVzdHMgbWFkZSB0byB0aGUgTExNIEFQSS5cbiAgICAgKi9cbiAgICByZXF1ZXN0cztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGlucHV0IHRva2VucyB1c2VkIGFjcm9zcyBhbGwgcmVxdWVzdHMuXG4gICAgICovXG4gICAgaW5wdXRUb2tlbnM7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBvdXRwdXQgdG9rZW5zIHVzZWQgYWNyb3NzIGFsbCByZXF1ZXN0cy5cbiAgICAgKi9cbiAgICBvdXRwdXRUb2tlbnM7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiB0b2tlbnMgc2VudCBhbmQgcmVjZWl2ZWQsIGFjcm9zcyBhbGwgcmVxdWVzdHMuXG4gICAgICovXG4gICAgdG90YWxUb2tlbnM7XG4gICAgLyoqXG4gICAgICogRGV0YWlscyBhYm91dCB0aGUgaW5wdXQgdG9rZW5zIHVzZWQgYWNyb3NzIGFsbCByZXF1ZXN0cy5cbiAgICAgKi9cbiAgICBpbnB1dFRva2Vuc0RldGFpbHMgPSBbXTtcbiAgICAvKipcbiAgICAgKiBEZXRhaWxzIGFib3V0IHRoZSBvdXRwdXQgdG9rZW5zIHVzZWQgYWNyb3NzIGFsbCByZXF1ZXN0cy5cbiAgICAgKi9cbiAgICBvdXRwdXRUb2tlbnNEZXRhaWxzID0gW107XG4gICAgY29uc3RydWN0b3IoaW5wdXQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRoaXMucmVxdWVzdHMgPSAwO1xuICAgICAgICAgICAgdGhpcy5pbnB1dFRva2VucyA9IDA7XG4gICAgICAgICAgICB0aGlzLm91dHB1dFRva2VucyA9IDA7XG4gICAgICAgICAgICB0aGlzLnRvdGFsVG9rZW5zID0gMDtcbiAgICAgICAgICAgIHRoaXMuaW5wdXRUb2tlbnNEZXRhaWxzID0gW107XG4gICAgICAgICAgICB0aGlzLm91dHB1dFRva2Vuc0RldGFpbHMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVxdWVzdHMgPSBpbnB1dD8ucmVxdWVzdHMgPz8gMTtcbiAgICAgICAgICAgIHRoaXMuaW5wdXRUb2tlbnMgPSBpbnB1dD8uaW5wdXRUb2tlbnMgPz8gMDtcbiAgICAgICAgICAgIHRoaXMub3V0cHV0VG9rZW5zID0gaW5wdXQ/Lm91dHB1dFRva2VucyA/PyAwO1xuICAgICAgICAgICAgdGhpcy50b3RhbFRva2VucyA9IGlucHV0Py50b3RhbFRva2VucyA/PyAwO1xuICAgICAgICAgICAgdGhpcy5pbnB1dFRva2Vuc0RldGFpbHMgPSBpbnB1dD8uaW5wdXRUb2tlbnNEZXRhaWxzXG4gICAgICAgICAgICAgICAgPyBbaW5wdXQuaW5wdXRUb2tlbnNEZXRhaWxzXVxuICAgICAgICAgICAgICAgIDogW107XG4gICAgICAgICAgICB0aGlzLm91dHB1dFRva2Vuc0RldGFpbHMgPSBpbnB1dD8ub3V0cHV0VG9rZW5zRGV0YWlsc1xuICAgICAgICAgICAgICAgID8gW2lucHV0Lm91dHB1dFRva2Vuc0RldGFpbHNdXG4gICAgICAgICAgICAgICAgOiBbXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhZGQobmV3VXNhZ2UpIHtcbiAgICAgICAgdGhpcy5yZXF1ZXN0cyArPSBuZXdVc2FnZS5yZXF1ZXN0cztcbiAgICAgICAgdGhpcy5pbnB1dFRva2VucyArPSBuZXdVc2FnZS5pbnB1dFRva2VucztcbiAgICAgICAgdGhpcy5vdXRwdXRUb2tlbnMgKz0gbmV3VXNhZ2Uub3V0cHV0VG9rZW5zO1xuICAgICAgICB0aGlzLnRvdGFsVG9rZW5zICs9IG5ld1VzYWdlLnRvdGFsVG9rZW5zO1xuICAgICAgICB0aGlzLmlucHV0VG9rZW5zRGV0YWlscy5wdXNoKC4uLm5ld1VzYWdlLmlucHV0VG9rZW5zRGV0YWlscyk7XG4gICAgICAgIHRoaXMub3V0cHV0VG9rZW5zRGV0YWlscy5wdXNoKC4uLm5ld1VzYWdlLm91dHB1dFRva2Vuc0RldGFpbHMpO1xuICAgIH1cbn1cbmV4cG9ydCB7IFVzYWdlRGF0YSB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dXNhZ2UubWpzLm1hcCIsImltcG9ydCBsb2dnZXIgZnJvbSBcIi4vbG9nZ2VyLm1qc1wiO1xuaW1wb3J0IHsgVXNhZ2UgfSBmcm9tIFwiLi91c2FnZS5tanNcIjtcbi8qKlxuICogQSBjb250ZXh0IG9iamVjdCB0aGF0IGlzIHBhc3NlZCB0byB0aGUgYFJ1bm5lci5ydW4oKWAgbWV0aG9kLlxuICovXG5leHBvcnQgY2xhc3MgUnVuQ29udGV4dCB7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbnRleHQgb2JqZWN0IHBhc3NlZCBieSB5b3UgdG8gdGhlIGBSdW5uZXIucnVuKClgXG4gICAgICovXG4gICAgY29udGV4dDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNhZ2Ugb2YgdGhlIGFnZW50IHJ1biBzbyBmYXIuIEZvciBzdHJlYW1lZCByZXNwb25zZXMsIHRoZSB1c2FnZSB3aWxsIGJlIHN0YWxlIHVudGlsIHRoZVxuICAgICAqIGxhc3QgY2h1bmsgb2YgdGhlIHN0cmVhbSBpcyBwcm9jZXNzZWQuXG4gICAgICovXG4gICAgdXNhZ2U7XG4gICAgLyoqXG4gICAgICogQSBtYXAgb2YgdG9vbCBuYW1lcyB0byB3aGV0aGVyIHRoZXkgaGF2ZSBiZWVuIGFwcHJvdmVkLlxuICAgICAqL1xuICAgICNhcHByb3ZhbHM7XG4gICAgY29uc3RydWN0b3IoY29udGV4dCA9IHt9KSB7XG4gICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgICAgIHRoaXMudXNhZ2UgPSBuZXcgVXNhZ2UoKTtcbiAgICAgICAgdGhpcy4jYXBwcm92YWxzID0gbmV3IE1hcCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWJ1aWxkIHRoZSBhcHByb3ZhbHMgbWFwIGZyb20gYSBzZXJpYWxpemVkIHN0YXRlLlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqXG4gICAgICogQHBhcmFtIGFwcHJvdmFscyAtIFRoZSBhcHByb3ZhbHMgbWFwIHRvIHJlYnVpbGQuXG4gICAgICovXG4gICAgX3JlYnVpbGRBcHByb3ZhbHMoYXBwcm92YWxzKSB7XG4gICAgICAgIHRoaXMuI2FwcHJvdmFscyA9IG5ldyBNYXAoT2JqZWN0LmVudHJpZXMoYXBwcm92YWxzKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIGEgdG9vbCBjYWxsIGhhcyBiZWVuIGFwcHJvdmVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRvb2xOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRvb2wuXG4gICAgICogQHBhcmFtIGNhbGxJZCAtIFRoZSBjYWxsIElEIG9mIHRoZSB0b29sIGNhbGwuXG4gICAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSB0b29sIGNhbGwgaGFzIGJlZW4gYXBwcm92ZWQsIGBmYWxzZWAgaWYgYmxvY2tlZCBhbmQgYHVuZGVmaW5lZGAgaWYgbm90IHlldCBhcHByb3ZlZCBvciByZWplY3RlZC5cbiAgICAgKi9cbiAgICBpc1Rvb2xBcHByb3ZlZCh7IHRvb2xOYW1lLCBjYWxsSWQgfSkge1xuICAgICAgICBjb25zdCBhcHByb3ZhbEVudHJ5ID0gdGhpcy4jYXBwcm92YWxzLmdldCh0b29sTmFtZSk7XG4gICAgICAgIGlmIChhcHByb3ZhbEVudHJ5Py5hcHByb3ZlZCA9PT0gdHJ1ZSAmJiBhcHByb3ZhbEVudHJ5LnJlamVjdGVkID09PSB0cnVlKSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybignVG9vbCBpcyBwZXJtYW5lbnRseSBhcHByb3ZlZCBhbmQgcmVqZWN0ZWQgYXQgdGhlIHNhbWUgdGltZS4gQXBwcm92YWwgdGFrZXMgcHJlY2VkZW5jZScpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFwcHJvdmFsRW50cnk/LmFwcHJvdmVkID09PSB0cnVlKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXBwcm92YWxFbnRyeT8ucmVqZWN0ZWQgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbmRpdmlkdWFsQ2FsbEFwcHJvdmFsID0gQXJyYXkuaXNBcnJheShhcHByb3ZhbEVudHJ5Py5hcHByb3ZlZClcbiAgICAgICAgICAgID8gYXBwcm92YWxFbnRyeS5hcHByb3ZlZC5pbmNsdWRlcyhjYWxsSWQpXG4gICAgICAgICAgICA6IGZhbHNlO1xuICAgICAgICBjb25zdCBpbmRpdmlkdWFsQ2FsbFJlamVjdGlvbiA9IEFycmF5LmlzQXJyYXkoYXBwcm92YWxFbnRyeT8ucmVqZWN0ZWQpXG4gICAgICAgICAgICA/IGFwcHJvdmFsRW50cnkucmVqZWN0ZWQuaW5jbHVkZXMoY2FsbElkKVxuICAgICAgICAgICAgOiBmYWxzZTtcbiAgICAgICAgaWYgKGluZGl2aWR1YWxDYWxsQXBwcm92YWwgJiYgaW5kaXZpZHVhbENhbGxSZWplY3Rpb24pIHtcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKGBUb29sIGNhbGwgJHtjYWxsSWR9IGlzIGJvdGggYXBwcm92ZWQgYW5kIHJlamVjdGVkIGF0IHRoZSBzYW1lIHRpbWUuIEFwcHJvdmFsIHRha2VzIHByZWNlZGVuY2VgKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbmRpdmlkdWFsQ2FsbEFwcHJvdmFsKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5kaXZpZHVhbENhbGxSZWplY3Rpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBcHByb3ZlIGEgdG9vbCBjYWxsLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRvb2xOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRvb2wuXG4gICAgICogQHBhcmFtIGNhbGxJZCAtIFRoZSBjYWxsIElEIG9mIHRoZSB0b29sIGNhbGwuXG4gICAgICovXG4gICAgYXBwcm92ZVRvb2woYXBwcm92YWxJdGVtLCB7IGFsd2F5c0FwcHJvdmUgPSBmYWxzZSB9ID0ge30pIHtcbiAgICAgICAgY29uc3QgdG9vbE5hbWUgPSBhcHByb3ZhbEl0ZW0ucmF3SXRlbS5uYW1lO1xuICAgICAgICBpZiAoYWx3YXlzQXBwcm92ZSkge1xuICAgICAgICAgICAgdGhpcy4jYXBwcm92YWxzLnNldCh0b29sTmFtZSwge1xuICAgICAgICAgICAgICAgIGFwcHJvdmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHJlamVjdGVkOiBbXSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwcHJvdmFsRW50cnkgPSB0aGlzLiNhcHByb3ZhbHMuZ2V0KHRvb2xOYW1lKSA/PyB7XG4gICAgICAgICAgICBhcHByb3ZlZDogW10sXG4gICAgICAgICAgICByZWplY3RlZDogW10sXG4gICAgICAgIH07XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGFwcHJvdmFsRW50cnkuYXBwcm92ZWQpKSB7XG4gICAgICAgICAgICBhcHByb3ZhbEVudHJ5LmFwcHJvdmVkLnB1c2goYXBwcm92YWxJdGVtLnJhd0l0ZW0uY2FsbElkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNhcHByb3ZhbHMuc2V0KHRvb2xOYW1lLCBhcHByb3ZhbEVudHJ5KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVqZWN0IGEgdG9vbCBjYWxsLlxuICAgICAqXG4gICAgICogQHBhcmFtIGFwcHJvdmFsSXRlbSAtIFRoZSB0b29sIGFwcHJvdmFsIGl0ZW0gdG8gcmVqZWN0LlxuICAgICAqL1xuICAgIHJlamVjdFRvb2woYXBwcm92YWxJdGVtLCB7IGFsd2F5c1JlamVjdCA9IGZhbHNlIH0gPSB7fSkge1xuICAgICAgICBjb25zdCB0b29sTmFtZSA9IGFwcHJvdmFsSXRlbS5yYXdJdGVtLm5hbWU7XG4gICAgICAgIGlmIChhbHdheXNSZWplY3QpIHtcbiAgICAgICAgICAgIHRoaXMuI2FwcHJvdmFscy5zZXQodG9vbE5hbWUsIHtcbiAgICAgICAgICAgICAgICBhcHByb3ZlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgcmVqZWN0ZWQ6IHRydWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcHByb3ZhbEVudHJ5ID0gdGhpcy4jYXBwcm92YWxzLmdldCh0b29sTmFtZSkgPz8ge1xuICAgICAgICAgICAgYXBwcm92ZWQ6IFtdLFxuICAgICAgICAgICAgcmVqZWN0ZWQ6IFtdLFxuICAgICAgICB9O1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShhcHByb3ZhbEVudHJ5LnJlamVjdGVkKSkge1xuICAgICAgICAgICAgYXBwcm92YWxFbnRyeS5yZWplY3RlZC5wdXNoKGFwcHJvdmFsSXRlbS5yYXdJdGVtLmNhbGxJZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jYXBwcm92YWxzLnNldCh0b29sTmFtZSwgYXBwcm92YWxFbnRyeSk7XG4gICAgfVxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRleHQ6IHRoaXMuY29udGV4dCxcbiAgICAgICAgICAgIHVzYWdlOiB0aGlzLnVzYWdlLFxuICAgICAgICAgICAgYXBwcm92YWxzOiBPYmplY3QuZnJvbUVudHJpZXModGhpcy4jYXBwcm92YWxzLmVudHJpZXMoKSksXG4gICAgICAgIH07XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cnVuQ29udGV4dC5tanMubWFwIiwiaW1wb3J0IHsgUmVhZGFibGVTdHJlYW0gYXMgX1JlYWRhYmxlU3RyZWFtLCBUcmFuc2Zvcm1TdHJlYW0sIFJlYWRhYmxlLCB9IGZyb20gJ0BvcGVuYWkvYWdlbnRzLWNvcmUvX3NoaW1zJztcbmltcG9ydCB7IGdldFR1cm5JbnB1dCB9IGZyb20gXCIuL3J1bi5tanNcIjtcbmltcG9ydCBsb2dnZXIgZnJvbSBcIi4vbG9nZ2VyLm1qc1wiO1xuaW1wb3J0IHsgU3RyZWFtRXZlbnRUZXh0U3RyZWFtIH0gZnJvbSBcIi4vdHlwZXMvcHJvdG9jb2wubWpzXCI7XG5jbGFzcyBSdW5SZXN1bHRCYXNlIHtcbiAgICBzdGF0ZTtcbiAgICBjb25zdHJ1Y3RvcihzdGF0ZSkge1xuICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBoaXN0b3J5IG9mIHRoZSBhZ2VudCBydW4uIFRoaXMgaW5jbHVkZXMgdGhlIGlucHV0IGl0ZW1zIGFuZCB0aGUgbmV3IGl0ZW1zIGdlbmVyYXRlZCBkdXJpbmdcbiAgICAgKiB0aGUgYWdlbnQgcnVuLlxuICAgICAqXG4gICAgICogVGhpcyBjYW4gYmUgdXNlZCBhcyBpbnB1dHMgZm9yIHRoZSBuZXh0IGFnZW50IHJ1bi5cbiAgICAgKi9cbiAgICBnZXQgaGlzdG9yeSgpIHtcbiAgICAgICAgcmV0dXJuIGdldFR1cm5JbnB1dCh0aGlzLmlucHV0LCB0aGlzLm5ld0l0ZW1zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIG5ldyBpdGVtcyBnZW5lcmF0ZWQgZHVyaW5nIHRoZSBhZ2VudCBydW4uIFRoZXNlIGluY2x1ZGUgdGhpbmdzIGxpa2UgbmV3IG1lc3NhZ2VzLCB0b29sXG4gICAgICogY2FsbHMgYW5kIHRoZWlyIG91dHB1dHMsIGV0Yy5cbiAgICAgKlxuICAgICAqIEl0IGRvZXMgbm90IGluY2x1ZGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGFnZW50cyBhbmQgaW5zdGVhZCByZXByZXNlbnRzIHRoZSBtb2RlbCBkYXRhLlxuICAgICAqXG4gICAgICogRm9yIHRoZSBvdXRwdXQgaW5jbHVkaW5nIHRoZSBhZ2VudHMsIHVzZSB0aGUgYG5ld0l0ZW1zYCBwcm9wZXJ0eS5cbiAgICAgKi9cbiAgICBnZXQgb3V0cHV0KCkge1xuICAgICAgICByZXR1cm4gZ2V0VHVybklucHV0KFtdLCB0aGlzLm5ld0l0ZW1zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBjb3B5IG9mIHRoZSBvcmlnaW5hbCBpbnB1dCBpdGVtcy5cbiAgICAgKi9cbiAgICBnZXQgaW5wdXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRlLl9vcmlnaW5hbElucHV0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgcnVuIGl0ZW1zIGdlbmVyYXRlZCBkdXJpbmcgdGhlIGFnZW50IHJ1bi4gVGhpcyBhc3NvY2lhdGVzIHRoZSBtb2RlbCBkYXRhIHdpdGggdGhlIGFnZW50cy5cbiAgICAgKlxuICAgICAqIEZvciB0aGUgbW9kZWwgZGF0YSB0aGF0IGNhbiBiZSB1c2VkIGFzIGlucHV0cyBmb3IgdGhlIG5leHQgYWdlbnQgcnVuLCB1c2UgdGhlIGBvdXRwdXRgIHByb3BlcnR5LlxuICAgICAqL1xuICAgIGdldCBuZXdJdGVtcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUuX2dlbmVyYXRlZEl0ZW1zO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgcmF3IExMTSByZXNwb25zZXMgZ2VuZXJhdGVkIGJ5IHRoZSBtb2RlbCBkdXJpbmcgdGhlIGFnZW50IHJ1bi5cbiAgICAgKi9cbiAgICBnZXQgcmF3UmVzcG9uc2VzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZS5fbW9kZWxSZXNwb25zZXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IHJlc3BvbnNlIElEIGdlbmVyYXRlZCBieSB0aGUgbW9kZWwgZHVyaW5nIHRoZSBhZ2VudCBydW4uXG4gICAgICovXG4gICAgZ2V0IGxhc3RSZXNwb25zZUlkKCkge1xuICAgICAgICBjb25zdCByZXNwb25zZXMgPSB0aGlzLnJhd1Jlc3BvbnNlcztcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlcyAmJiByZXNwb25zZXMubGVuZ3RoID4gMFxuICAgICAgICAgICAgPyByZXNwb25zZXNbcmVzcG9uc2VzLmxlbmd0aCAtIDFdLnJlc3BvbnNlSWRcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCBhZ2VudCB0aGF0IHdhcyBydW5cbiAgICAgKi9cbiAgICBnZXQgbGFzdEFnZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZS5fY3VycmVudEFnZW50O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHdWFyZHJhaWwgcmVzdWx0cyBmb3IgdGhlIGlucHV0IG1lc3NhZ2VzLlxuICAgICAqL1xuICAgIGdldCBpbnB1dEd1YXJkcmFpbFJlc3VsdHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRlLl9pbnB1dEd1YXJkcmFpbFJlc3VsdHM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEd1YXJkcmFpbCByZXN1bHRzIGZvciB0aGUgZmluYWwgb3V0cHV0IG9mIHRoZSBhZ2VudC5cbiAgICAgKi9cbiAgICBnZXQgb3V0cHV0R3VhcmRyYWlsUmVzdWx0cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUuX291dHB1dEd1YXJkcmFpbFJlc3VsdHM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFueSBpbnRlcnJ1cHRpb25zIHRoYXQgb2NjdXJyZWQgZHVyaW5nIHRoZSBhZ2VudCBydW4gZm9yIGV4YW1wbGUgZm9yIHRvb2wgYXBwcm92YWxzLlxuICAgICAqL1xuICAgIGdldCBpbnRlcnJ1cHRpb25zKCkge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZS5fY3VycmVudFN0ZXA/LnR5cGUgPT09ICduZXh0X3N0ZXBfaW50ZXJydXB0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUuX2N1cnJlbnRTdGVwLmRhdGEuaW50ZXJydXB0aW9ucztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBmaW5hbCBvdXRwdXQgb2YgdGhlIGFnZW50LiBJZiB0aGUgb3V0cHV0IHR5cGUgd2FzIHNldCB0byBhbnl0aGluZyBvdGhlciB0aGFuIGB0ZXh0YCxcbiAgICAgKiB0aGlzIHdpbGwgYmUgcGFyc2VkIGVpdGhlciBhcyBKU09OIG9yIHVzaW5nIHRoZSBab2Qgc2NoZW1hIHlvdSBwcm92aWRlZC5cbiAgICAgKi9cbiAgICBnZXQgZmluYWxPdXRwdXQoKSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLl9jdXJyZW50U3RlcD8udHlwZSA9PT0gJ25leHRfc3RlcF9maW5hbF9vdXRwdXQnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZS5fY3VycmVudEFnZW50LnByb2Nlc3NGaW5hbE91dHB1dCh0aGlzLnN0YXRlLl9jdXJyZW50U3RlcC5vdXRwdXQpO1xuICAgICAgICB9XG4gICAgICAgIGxvZ2dlci53YXJuKCdBY2Nlc3NlZCBmaW5hbE91dHB1dCBiZWZvcmUgYWdlbnQgcnVuIGlzIGNvbXBsZXRlZC4nKTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG59XG4vKipcbiAqIFRoZSByZXN1bHQgb2YgYW4gYWdlbnQgcnVuLlxuICovXG5leHBvcnQgY2xhc3MgUnVuUmVzdWx0IGV4dGVuZHMgUnVuUmVzdWx0QmFzZSB7XG4gICAgY29uc3RydWN0b3Ioc3RhdGUpIHtcbiAgICAgICAgc3VwZXIoc3RhdGUpO1xuICAgIH1cbn1cbi8qKlxuICogVGhlIHJlc3VsdCBvZiBhbiBhZ2VudCBydW4gaW4gc3RyZWFtaW5nIG1vZGUuXG4gKi9cbmV4cG9ydCBjbGFzcyBTdHJlYW1lZFJ1blJlc3VsdCBleHRlbmRzIFJ1blJlc3VsdEJhc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50IGFnZW50IHRoYXQgaXMgcnVubmluZ1xuICAgICAqL1xuICAgIGdldCBjdXJyZW50QWdlbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxhc3RBZ2VudDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbnQgdHVybiBudW1iZXJcbiAgICAgKi9cbiAgICBjdXJyZW50VHVybiA9IDA7XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHR1cm5zIHRoYXQgY2FuIGJlIHJ1blxuICAgICAqL1xuICAgIG1heFR1cm5zO1xuICAgICNlcnJvciA9IG51bGw7XG4gICAgI3NpZ25hbDtcbiAgICAjcmVhZGFibGVDb250cm9sbGVyO1xuICAgICNyZWFkYWJsZVN0cmVhbTtcbiAgICAjY29tcGxldGVkUHJvbWlzZTtcbiAgICAjY29tcGxldGVkUHJvbWlzZVJlc29sdmU7XG4gICAgI2NvbXBsZXRlZFByb21pc2VSZWplY3Q7XG4gICAgI2NhbmNlbGxlZCA9IGZhbHNlO1xuICAgIGNvbnN0cnVjdG9yKHJlc3VsdCA9IHt9KSB7XG4gICAgICAgIHN1cGVyKHJlc3VsdC5zdGF0ZSk7XG4gICAgICAgIHRoaXMuI3NpZ25hbCA9IHJlc3VsdC5zaWduYWw7XG4gICAgICAgIGlmICh0aGlzLiNzaWduYWwpIHtcbiAgICAgICAgICAgIHRoaXMuI3NpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLiNyZWFkYWJsZVN0cmVhbS5jYW5jZWwoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI3JlYWRhYmxlU3RyZWFtID0gbmV3IF9SZWFkYWJsZVN0cmVhbSh7XG4gICAgICAgICAgICBzdGFydDogKGNvbnRyb2xsZXIpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLiNyZWFkYWJsZUNvbnRyb2xsZXIgPSBjb250cm9sbGVyO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNhbmNlbDogKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuI2NhbmNlbGxlZCA9IHRydWU7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy4jY29tcGxldGVkUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHRoaXMuI2NvbXBsZXRlZFByb21pc2VSZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgICAgICAgIHRoaXMuI2NvbXBsZXRlZFByb21pc2VSZWplY3QgPSByZWplY3Q7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKiBBZGRzIGFuIGl0ZW0gdG8gdGhlIHN0cmVhbSBvZiBvdXRwdXQgaXRlbXNcbiAgICAgKi9cbiAgICBfYWRkSXRlbShpdGVtKSB7XG4gICAgICAgIGlmICghdGhpcy5jYW5jZWxsZWQpIHtcbiAgICAgICAgICAgIHRoaXMuI3JlYWRhYmxlQ29udHJvbGxlcj8uZW5xdWV1ZShpdGVtKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgc3RyZWFtIGhhcyBiZWVuIGNvbXBsZXRlZFxuICAgICAqL1xuICAgIF9kb25lKCkge1xuICAgICAgICBpZiAoIXRoaXMuY2FuY2VsbGVkICYmIHRoaXMuI3JlYWRhYmxlQ29udHJvbGxlcikge1xuICAgICAgICAgICAgdGhpcy4jcmVhZGFibGVDb250cm9sbGVyLmNsb3NlKCk7XG4gICAgICAgICAgICB0aGlzLiNyZWFkYWJsZUNvbnRyb2xsZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0aGlzLiNjb21wbGV0ZWRQcm9taXNlUmVzb2x2ZT8uKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICogSGFuZGxlcyBhbiBlcnJvciBpbiB0aGUgc3RyZWFtIGxvb3AuXG4gICAgICovXG4gICAgX3JhaXNlRXJyb3IoZXJyKSB7XG4gICAgICAgIGlmICghdGhpcy5jYW5jZWxsZWQgJiYgdGhpcy4jcmVhZGFibGVDb250cm9sbGVyKSB7XG4gICAgICAgICAgICB0aGlzLiNyZWFkYWJsZUNvbnRyb2xsZXIuZXJyb3IoZXJyKTtcbiAgICAgICAgICAgIHRoaXMuI3JlYWRhYmxlQ29udHJvbGxlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNlcnJvciA9IGVycjtcbiAgICAgICAgdGhpcy4jY29tcGxldGVkUHJvbWlzZVJlamVjdD8uKGVycik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3RyZWFtIGhhcyBiZWVuIGNhbmNlbGxlZC5cbiAgICAgKi9cbiAgICBnZXQgY2FuY2VsbGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jY2FuY2VsbGVkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB1bmRlcmx5aW5nIHJlYWRhYmxlIHN0cmVhbS5cbiAgICAgKiBAcmV0dXJucyBBIHJlYWRhYmxlIHN0cmVhbSBvZiB0aGUgYWdlbnQgcnVuLlxuICAgICAqL1xuICAgIHRvU3RyZWFtKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcmVhZGFibGVTdHJlYW07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEF3YWl0IHRoaXMgcHJvbWlzZSB0byBlbnN1cmUgdGhhdCB0aGUgc3RyZWFtIGhhcyBiZWVuIGNvbXBsZXRlZCBpZiB5b3UgYXJlIG5vdCBjb25zdW1pbmcgdGhlXG4gICAgICogc3RyZWFtIGRpcmVjdGx5LlxuICAgICAqL1xuICAgIGdldCBjb21wbGV0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNjb21wbGV0ZWRQcm9taXNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFcnJvciB0aHJvd24gZHVyaW5nIHRoZSBydW4sIGlmIGFueS5cbiAgICAgKi9cbiAgICBnZXQgZXJyb3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNlcnJvcjtcbiAgICB9XG4gICAgdG9UZXh0U3RyZWFtKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCBzdHJlYW0gPSB0aGlzLiNyZWFkYWJsZVN0cmVhbS5waXBlVGhyb3VnaChuZXcgVHJhbnNmb3JtU3RyZWFtKHtcbiAgICAgICAgICAgIHRyYW5zZm9ybShldmVudCwgY29udHJvbGxlcikge1xuICAgICAgICAgICAgICAgIGlmIChldmVudC50eXBlID09PSAncmF3X21vZGVsX3N0cmVhbV9ldmVudCcgJiZcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQuZGF0YS50eXBlID09PSAnb3V0cHV0X3RleHRfZGVsdGEnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBTdHJlYW1FdmVudFRleHRTdHJlYW0ucGFyc2UoZXZlbnQuZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShpdGVtLmRlbHRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICB9KSk7XG4gICAgICAgIGlmIChvcHRpb25zLmNvbXBhdGlibGVXaXRoTm9kZVN0cmVhbXMpIHtcbiAgICAgICAgICAgIHJldHVybiBSZWFkYWJsZS5mcm9tV2ViKHN0cmVhbSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0cmVhbTtcbiAgICB9XG4gICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3JlYWRhYmxlU3RyZWFtW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlc3VsdC5tanMubWFwIiwiZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZVRvb2wodG9vbCkge1xuICAgIGlmICh0b29sLnR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6ICdmdW5jdGlvbicsXG4gICAgICAgICAgICBuYW1lOiB0b29sLm5hbWUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogdG9vbC5kZXNjcmlwdGlvbixcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IHRvb2wucGFyYW1ldGVycyxcbiAgICAgICAgICAgIHN0cmljdDogdG9vbC5zdHJpY3QsXG4gICAgICAgIH07XG4gICAgfVxuICAgIGlmICh0b29sLnR5cGUgPT09ICdjb21wdXRlcicpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6ICdjb21wdXRlcicsXG4gICAgICAgICAgICBuYW1lOiB0b29sLm5hbWUsXG4gICAgICAgICAgICBlbnZpcm9ubWVudDogdG9vbC5jb21wdXRlci5lbnZpcm9ubWVudCxcbiAgICAgICAgICAgIGRpbWVuc2lvbnM6IHRvb2wuY29tcHV0ZXIuZGltZW5zaW9ucyxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ2hvc3RlZF90b29sJyxcbiAgICAgICAgbmFtZTogdG9vbC5uYW1lLFxuICAgICAgICBwcm92aWRlckRhdGE6IHRvb2wucHJvdmlkZXJEYXRhLFxuICAgIH07XG59XG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplSGFuZG9mZihoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdG9vbE5hbWU6IGgudG9vbE5hbWUsXG4gICAgICAgIHRvb2xEZXNjcmlwdGlvbjogaC50b29sRGVzY3JpcHRpb24sXG4gICAgICAgIGlucHV0SnNvblNjaGVtYTogaC5pbnB1dEpzb25TY2hlbWEsXG4gICAgICAgIHN0cmljdEpzb25TY2hlbWE6IGguc3RyaWN0SnNvblNjaGVtYSxcbiAgICB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2VyaWFsaXplLm1qcy5tYXAiLCJpbXBvcnQgeyB0b1NtYXJ0U3RyaW5nIH0gZnJvbSBcIi4vdXRpbHMvc21hcnRTdHJpbmcubWpzXCI7XG5leHBvcnQgY2xhc3MgUnVuSXRlbUJhc2Uge1xuICAgIHR5cGUgPSAnYmFzZV9pdGVtJztcbiAgICByYXdJdGVtO1xuICAgIHRvSlNPTigpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgICAgICAgIHJhd0l0ZW06IHRoaXMucmF3SXRlbSxcbiAgICAgICAgfTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgUnVuTWVzc2FnZU91dHB1dEl0ZW0gZXh0ZW5kcyBSdW5JdGVtQmFzZSB7XG4gICAgcmF3SXRlbTtcbiAgICBhZ2VudDtcbiAgICB0eXBlID0gJ21lc3NhZ2Vfb3V0cHV0X2l0ZW0nO1xuICAgIGNvbnN0cnVjdG9yKHJhd0l0ZW0sIGFnZW50KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMucmF3SXRlbSA9IHJhd0l0ZW07XG4gICAgICAgIHRoaXMuYWdlbnQgPSBhZ2VudDtcbiAgICB9XG4gICAgdG9KU09OKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uc3VwZXIudG9KU09OKCksXG4gICAgICAgICAgICBhZ2VudDogdGhpcy5hZ2VudC50b0pTT04oKSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZ2V0IGNvbnRlbnQoKSB7XG4gICAgICAgIGxldCBjb250ZW50ID0gJyc7XG4gICAgICAgIGZvciAoY29uc3QgcGFydCBvZiB0aGlzLnJhd0l0ZW0uY29udGVudCkge1xuICAgICAgICAgICAgaWYgKHBhcnQudHlwZSA9PT0gJ291dHB1dF90ZXh0Jykge1xuICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gcGFydC50ZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb250ZW50O1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBSdW5Ub29sQ2FsbEl0ZW0gZXh0ZW5kcyBSdW5JdGVtQmFzZSB7XG4gICAgcmF3SXRlbTtcbiAgICBhZ2VudDtcbiAgICB0eXBlID0gJ3Rvb2xfY2FsbF9pdGVtJztcbiAgICBjb25zdHJ1Y3RvcihyYXdJdGVtLCBhZ2VudCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnJhd0l0ZW0gPSByYXdJdGVtO1xuICAgICAgICB0aGlzLmFnZW50ID0gYWdlbnQ7XG4gICAgfVxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnN1cGVyLnRvSlNPTigpLFxuICAgICAgICAgICAgYWdlbnQ6IHRoaXMuYWdlbnQudG9KU09OKCksXG4gICAgICAgIH07XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIFJ1blRvb2xDYWxsT3V0cHV0SXRlbSBleHRlbmRzIFJ1bkl0ZW1CYXNlIHtcbiAgICByYXdJdGVtO1xuICAgIGFnZW50O1xuICAgIG91dHB1dDtcbiAgICB0eXBlID0gJ3Rvb2xfY2FsbF9vdXRwdXRfaXRlbSc7XG4gICAgY29uc3RydWN0b3IocmF3SXRlbSwgYWdlbnQsIG91dHB1dCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnJhd0l0ZW0gPSByYXdJdGVtO1xuICAgICAgICB0aGlzLmFnZW50ID0gYWdlbnQ7XG4gICAgICAgIHRoaXMub3V0cHV0ID0gb3V0cHV0O1xuICAgIH1cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5zdXBlci50b0pTT04oKSxcbiAgICAgICAgICAgIGFnZW50OiB0aGlzLmFnZW50LnRvSlNPTigpLFxuICAgICAgICAgICAgb3V0cHV0OiB0b1NtYXJ0U3RyaW5nKHRoaXMub3V0cHV0KSxcbiAgICAgICAgfTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgUnVuUmVhc29uaW5nSXRlbSBleHRlbmRzIFJ1bkl0ZW1CYXNlIHtcbiAgICByYXdJdGVtO1xuICAgIGFnZW50O1xuICAgIHR5cGUgPSAncmVhc29uaW5nX2l0ZW0nO1xuICAgIGNvbnN0cnVjdG9yKHJhd0l0ZW0sIGFnZW50KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMucmF3SXRlbSA9IHJhd0l0ZW07XG4gICAgICAgIHRoaXMuYWdlbnQgPSBhZ2VudDtcbiAgICB9XG4gICAgdG9KU09OKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uc3VwZXIudG9KU09OKCksXG4gICAgICAgICAgICBhZ2VudDogdGhpcy5hZ2VudC50b0pTT04oKSxcbiAgICAgICAgfTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgUnVuSGFuZG9mZkNhbGxJdGVtIGV4dGVuZHMgUnVuSXRlbUJhc2Uge1xuICAgIHJhd0l0ZW07XG4gICAgYWdlbnQ7XG4gICAgdHlwZSA9ICdoYW5kb2ZmX2NhbGxfaXRlbSc7XG4gICAgY29uc3RydWN0b3IocmF3SXRlbSwgYWdlbnQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5yYXdJdGVtID0gcmF3SXRlbTtcbiAgICAgICAgdGhpcy5hZ2VudCA9IGFnZW50O1xuICAgIH1cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5zdXBlci50b0pTT04oKSxcbiAgICAgICAgICAgIGFnZW50OiB0aGlzLmFnZW50LnRvSlNPTigpLFxuICAgICAgICB9O1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBSdW5IYW5kb2ZmT3V0cHV0SXRlbSBleHRlbmRzIFJ1bkl0ZW1CYXNlIHtcbiAgICByYXdJdGVtO1xuICAgIHNvdXJjZUFnZW50O1xuICAgIHRhcmdldEFnZW50O1xuICAgIHR5cGUgPSAnaGFuZG9mZl9vdXRwdXRfaXRlbSc7XG4gICAgY29uc3RydWN0b3IocmF3SXRlbSwgc291cmNlQWdlbnQsIHRhcmdldEFnZW50KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMucmF3SXRlbSA9IHJhd0l0ZW07XG4gICAgICAgIHRoaXMuc291cmNlQWdlbnQgPSBzb3VyY2VBZ2VudDtcbiAgICAgICAgdGhpcy50YXJnZXRBZ2VudCA9IHRhcmdldEFnZW50O1xuICAgIH1cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5zdXBlci50b0pTT04oKSxcbiAgICAgICAgICAgIHNvdXJjZUFnZW50OiB0aGlzLnNvdXJjZUFnZW50LnRvSlNPTigpLFxuICAgICAgICAgICAgdGFyZ2V0QWdlbnQ6IHRoaXMudGFyZ2V0QWdlbnQudG9KU09OKCksXG4gICAgICAgIH07XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIFJ1blRvb2xBcHByb3ZhbEl0ZW0gZXh0ZW5kcyBSdW5JdGVtQmFzZSB7XG4gICAgcmF3SXRlbTtcbiAgICBhZ2VudDtcbiAgICB0eXBlID0gJ3Rvb2xfYXBwcm92YWxfaXRlbSc7XG4gICAgY29uc3RydWN0b3IocmF3SXRlbSwgYWdlbnQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5yYXdJdGVtID0gcmF3SXRlbTtcbiAgICAgICAgdGhpcy5hZ2VudCA9IGFnZW50O1xuICAgIH1cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5zdXBlci50b0pTT04oKSxcbiAgICAgICAgICAgIGFnZW50OiB0aGlzLmFnZW50LnRvSlNPTigpLFxuICAgICAgICB9O1xuICAgIH1cbn1cbi8qKlxuICogRXh0cmFjdCBhbGwgdGV4dCBvdXRwdXQgZnJvbSBhIGxpc3Qgb2YgcnVuIGl0ZW1zIGJ5IGNvbmNhdGVuYXRpbmcgdGhlIGNvbnRlbnQgb2YgYWxsXG4gKiBtZXNzYWdlIG91dHB1dCBpdGVtcy5cbiAqXG4gKiBAcGFyYW0gaXRlbXMgLSBUaGUgbGlzdCBvZiBydW4gaXRlbXMgdG8gZXh0cmFjdCB0ZXh0IGZyb20uXG4gKiBAcmV0dXJucyBBIHN0cmluZyBvZiBhbGwgdGhlIHRleHQgb3V0cHV0IGZyb20gdGhlIHJ1biBpdGVtcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RBbGxUZXh0T3V0cHV0KGl0ZW1zKSB7XG4gICAgcmV0dXJuIGl0ZW1zXG4gICAgICAgIC5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0udHlwZSA9PT0gJ21lc3NhZ2Vfb3V0cHV0X2l0ZW0nKVxuICAgICAgICAubWFwKChpdGVtKSA9PiBpdGVtLmNvbnRlbnQpXG4gICAgICAgIC5qb2luKCcnKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWl0ZW1zLm1qcy5tYXAiLCIvKipcbiAqIEdldCB0aGUgbGFzdCB0ZXh0IGZyb20gdGhlIG91dHB1dCBtZXNzYWdlLlxuICogQHBhcmFtIG91dHB1dE1lc3NhZ2VcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYXN0VGV4dEZyb21PdXRwdXRNZXNzYWdlKG91dHB1dE1lc3NhZ2UpIHtcbiAgICBpZiAob3V0cHV0TWVzc2FnZS50eXBlICE9PSAnbWVzc2FnZScpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKG91dHB1dE1lc3NhZ2Uucm9sZSAhPT0gJ2Fzc2lzdGFudCcpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgbGFzdEl0ZW0gPSBvdXRwdXRNZXNzYWdlLmNvbnRlbnRbb3V0cHV0TWVzc2FnZS5jb250ZW50Lmxlbmd0aCAtIDFdO1xuICAgIGlmIChsYXN0SXRlbS50eXBlICE9PSAnb3V0cHV0X3RleHQnKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBsYXN0SXRlbS50ZXh0O1xufVxuLyoqXG4gKiBHZXQgdGhlIGxhc3QgdGV4dCBmcm9tIHRoZSBvdXRwdXQgbWVzc2FnZS5cbiAqIEBwYXJhbSBvdXRwdXRcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRPdXRwdXRUZXh0KG91dHB1dCkge1xuICAgIGlmIChvdXRwdXQub3V0cHV0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIHJldHVybiAoZ2V0TGFzdFRleHRGcm9tT3V0cHV0TWVzc2FnZShvdXRwdXQub3V0cHV0W291dHB1dC5vdXRwdXQubGVuZ3RoIC0gMV0pIHx8ICcnKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1lc3NhZ2VzLm1qcy5tYXAiLCIvKipcbiAqIFN0cmVhbWluZyBldmVudCBmcm9tIHRoZSBMTE0uIFRoZXNlIGFyZSBgcmF3YCBldmVudHMsIGkuZS4gdGhleSBhcmUgZGlyZWN0bHkgcGFzc2VkIHRocm91Z2ggZnJvbVxuICogdGhlIExMTS5cbiAqL1xuZXhwb3J0IGNsYXNzIFJ1blJhd01vZGVsU3RyZWFtRXZlbnQge1xuICAgIGRhdGE7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgdGhlIGV2ZW50LlxuICAgICAqL1xuICAgIHR5cGUgPSAncmF3X21vZGVsX3N0cmVhbV9ldmVudCc7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIGRhdGEgVGhlIHJhdyByZXNwb25zZXMgc3RyZWFtIGV2ZW50cyBmcm9tIHRoZSBMTE0uXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoZGF0YSkge1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIH1cbn1cbi8qKlxuICogU3RyZWFtaW5nIGV2ZW50cyB0aGF0IHdyYXAgYSBgUnVuSXRlbWAuIEFzIHRoZSBhZ2VudCBwcm9jZXNzZXMgdGhlIExMTSByZXNwb25zZSwgaXQgd2lsbCBnZW5lcmF0ZVxuICogdGhlc2UgZXZlbnRzIGZyb20gbmV3IG1lc3NhZ2VzLCB0b29sIGNhbGxzLCB0b29sIG91dHB1dHMsIGhhbmRvZmZzLCBldGMuXG4gKi9cbmV4cG9ydCBjbGFzcyBSdW5JdGVtU3RyZWFtRXZlbnQge1xuICAgIG5hbWU7XG4gICAgaXRlbTtcbiAgICB0eXBlID0gJ3J1bl9pdGVtX3N0cmVhbV9ldmVudCc7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgICAqIEBwYXJhbSBpdGVtIFRoZSBpdGVtIHRoYXQgd2FzIGNyZWF0ZWQuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IobmFtZSwgaXRlbSkge1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLml0ZW0gPSBpdGVtO1xuICAgIH1cbn1cbi8qKlxuICogRXZlbnQgdGhhdCBub3RpZmllcyB0aGF0IHRoZXJlIGlzIGEgbmV3IGFnZW50IHJ1bm5pbmcuXG4gKi9cbmV4cG9ydCBjbGFzcyBSdW5BZ2VudFVwZGF0ZWRTdHJlYW1FdmVudCB7XG4gICAgYWdlbnQ7XG4gICAgdHlwZSA9ICdhZ2VudF91cGRhdGVkX3N0cmVhbV9ldmVudCc7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIGFnZW50IFRoZSBuZXcgYWdlbnRcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihhZ2VudCkge1xuICAgICAgICB0aGlzLmFnZW50ID0gYWdlbnQ7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZXZlbnRzLm1qcy5tYXAiLCJpbXBvcnQgeyBNb2RlbEJlaGF2aW9yRXJyb3IsIFRvb2xDYWxsRXJyb3IsIFVzZXJFcnJvciB9IGZyb20gXCIuL2Vycm9ycy5tanNcIjtcbmltcG9ydCB7IGdldFRyYW5zZmVyTWVzc2FnZSB9IGZyb20gXCIuL2hhbmRvZmYubWpzXCI7XG5pbXBvcnQgeyBSdW5IYW5kb2ZmQ2FsbEl0ZW0sIFJ1bkhhbmRvZmZPdXRwdXRJdGVtLCBSdW5NZXNzYWdlT3V0cHV0SXRlbSwgUnVuUmVhc29uaW5nSXRlbSwgUnVuVG9vbEFwcHJvdmFsSXRlbSwgUnVuVG9vbENhbGxJdGVtLCBSdW5Ub29sQ2FsbE91dHB1dEl0ZW0sIH0gZnJvbSBcIi4vaXRlbXMubWpzXCI7XG5pbXBvcnQgbG9nZ2VyIGZyb20gXCIuL2xvZ2dlci5tanNcIjtcbmltcG9ydCB7IGdldExhc3RUZXh0RnJvbU91dHB1dE1lc3NhZ2UgfSBmcm9tIFwiLi91dGlscy9tZXNzYWdlcy5tanNcIjtcbmltcG9ydCB7IHdpdGhGdW5jdGlvblNwYW4sIHdpdGhIYW5kb2ZmU3BhbiB9IGZyb20gXCIuL3RyYWNpbmcvY3JlYXRlU3BhbnMubWpzXCI7XG5pbXBvcnQgeyBnZXRTY2hlbWFBbmRQYXJzZXJGcm9tSW5wdXRUeXBlIH0gZnJvbSBcIi4vdXRpbHMvdG9vbHMubWpzXCI7XG5pbXBvcnQgeyBzYWZlRXhlY3V0ZSB9IGZyb20gXCIuL3V0aWxzL3NhZmVFeGVjdXRlLm1qc1wiO1xuaW1wb3J0IHsgYWRkRXJyb3JUb0N1cnJlbnRTcGFuIH0gZnJvbSBcIi4vdHJhY2luZy9jb250ZXh0Lm1qc1wiO1xuaW1wb3J0IHsgUnVuSXRlbVN0cmVhbUV2ZW50IH0gZnJvbSBcIi4vZXZlbnRzLm1qc1wiO1xuaW1wb3J0IHsgeiB9IGZyb20gJ0BvcGVuYWkvem9kL3YzJztcbmltcG9ydCB7IHRvU21hcnRTdHJpbmcgfSBmcm9tIFwiLi91dGlscy9zbWFydFN0cmluZy5tanNcIjtcbmltcG9ydCB7IGlzWm9kT2JqZWN0IH0gZnJvbSBcIi4vdXRpbHMvaW5kZXgubWpzXCI7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvY2Vzc01vZGVsUmVzcG9uc2UobW9kZWxSZXNwb25zZSwgYWdlbnQsIHRvb2xzLCBoYW5kb2Zmcykge1xuICAgIGNvbnN0IGl0ZW1zID0gW107XG4gICAgY29uc3QgcnVuSGFuZG9mZnMgPSBbXTtcbiAgICBjb25zdCBydW5GdW5jdGlvbnMgPSBbXTtcbiAgICBjb25zdCBydW5Db21wdXRlckFjdGlvbnMgPSBbXTtcbiAgICBjb25zdCB0b29sc1VzZWQgPSBbXTtcbiAgICBjb25zdCBoYW5kb2ZmTWFwID0gbmV3IE1hcChoYW5kb2Zmcy5tYXAoKGgpID0+IFtoLnRvb2xOYW1lLCBoXSkpO1xuICAgIGNvbnN0IGZ1bmN0aW9uTWFwID0gbmV3IE1hcCh0b29scy5maWx0ZXIoKHQpID0+IHQudHlwZSA9PT0gJ2Z1bmN0aW9uJykubWFwKCh0KSA9PiBbdC5uYW1lLCB0XSkpO1xuICAgIGNvbnN0IGNvbXB1dGVyVG9vbCA9IHRvb2xzLmZpbmQoKHQpID0+IHQudHlwZSA9PT0gJ2NvbXB1dGVyJyk7XG4gICAgZm9yIChjb25zdCBvdXRwdXQgb2YgbW9kZWxSZXNwb25zZS5vdXRwdXQpIHtcbiAgICAgICAgaWYgKG91dHB1dC50eXBlID09PSAnbWVzc2FnZScpIHtcbiAgICAgICAgICAgIGlmIChvdXRwdXQucm9sZSA9PT0gJ2Fzc2lzdGFudCcpIHtcbiAgICAgICAgICAgICAgICBpdGVtcy5wdXNoKG5ldyBSdW5NZXNzYWdlT3V0cHV0SXRlbShvdXRwdXQsIGFnZW50KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAob3V0cHV0LnR5cGUgPT09ICdob3N0ZWRfdG9vbF9jYWxsJykge1xuICAgICAgICAgICAgaXRlbXMucHVzaChuZXcgUnVuVG9vbENhbGxJdGVtKG91dHB1dCwgYWdlbnQpKTtcbiAgICAgICAgICAgIHRvb2xzVXNlZC5wdXNoKG91dHB1dC5uYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChvdXRwdXQudHlwZSA9PT0gJ3JlYXNvbmluZycpIHtcbiAgICAgICAgICAgIGl0ZW1zLnB1c2gobmV3IFJ1blJlYXNvbmluZ0l0ZW0ob3V0cHV0LCBhZ2VudCkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG91dHB1dC50eXBlID09PSAnY29tcHV0ZXJfY2FsbCcpIHtcbiAgICAgICAgICAgIGl0ZW1zLnB1c2gobmV3IFJ1blRvb2xDYWxsSXRlbShvdXRwdXQsIGFnZW50KSk7XG4gICAgICAgICAgICB0b29sc1VzZWQucHVzaCgnY29tcHV0ZXJfdXNlJyk7XG4gICAgICAgICAgICBpZiAoIWNvbXB1dGVyVG9vbCkge1xuICAgICAgICAgICAgICAgIGFkZEVycm9yVG9DdXJyZW50U3Bhbih7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdNb2RlbCBwcm9kdWNlZCBjb21wdXRlciBhY3Rpb24gd2l0aG91dCBhIGNvbXB1dGVyIHRvb2wuJyxcbiAgICAgICAgICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWdlbnRfbmFtZTogYWdlbnQubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTW9kZWxCZWhhdmlvckVycm9yKCdNb2RlbCBwcm9kdWNlZCBjb21wdXRlciBhY3Rpb24gd2l0aG91dCBhIGNvbXB1dGVyIHRvb2wuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBydW5Db21wdXRlckFjdGlvbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgdG9vbENhbGw6IG91dHB1dCxcbiAgICAgICAgICAgICAgICBjb21wdXRlcjogY29tcHV0ZXJUb29sLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG91dHB1dC50eXBlICE9PSAnZnVuY3Rpb25fY2FsbCcpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHRvb2xzVXNlZC5wdXNoKG91dHB1dC5uYW1lKTtcbiAgICAgICAgY29uc3QgaGFuZG9mZiA9IGhhbmRvZmZNYXAuZ2V0KG91dHB1dC5uYW1lKTtcbiAgICAgICAgaWYgKGhhbmRvZmYpIHtcbiAgICAgICAgICAgIGl0ZW1zLnB1c2gobmV3IFJ1bkhhbmRvZmZDYWxsSXRlbShvdXRwdXQsIGFnZW50KSk7XG4gICAgICAgICAgICBydW5IYW5kb2Zmcy5wdXNoKHtcbiAgICAgICAgICAgICAgICB0b29sQ2FsbDogb3V0cHV0LFxuICAgICAgICAgICAgICAgIGhhbmRvZmY6IGhhbmRvZmYsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGZ1bmN0aW9uVG9vbCA9IGZ1bmN0aW9uTWFwLmdldChvdXRwdXQubmFtZSk7XG4gICAgICAgICAgICBpZiAoIWZ1bmN0aW9uVG9vbCkge1xuICAgICAgICAgICAgICAgIGFkZEVycm9yVG9DdXJyZW50U3Bhbih7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBUb29sICR7b3V0cHV0Lm5hbWV9IG5vdCBmb3VuZCBpbiBhZ2VudCAke2FnZW50Lm5hbWV9LmAsXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvb2xfbmFtZTogb3V0cHV0Lm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBhZ2VudF9uYW1lOiBhZ2VudC5uYW1lLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBNb2RlbEJlaGF2aW9yRXJyb3IoYFRvb2wgJHtvdXRwdXQubmFtZX0gbm90IGZvdW5kIGluIGFnZW50ICR7YWdlbnQubmFtZX0uYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpdGVtcy5wdXNoKG5ldyBSdW5Ub29sQ2FsbEl0ZW0ob3V0cHV0LCBhZ2VudCkpO1xuICAgICAgICAgICAgcnVuRnVuY3Rpb25zLnB1c2goe1xuICAgICAgICAgICAgICAgIHRvb2xDYWxsOiBvdXRwdXQsXG4gICAgICAgICAgICAgICAgdG9vbDogZnVuY3Rpb25Ub29sLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbmV3SXRlbXM6IGl0ZW1zLFxuICAgICAgICBoYW5kb2ZmczogcnVuSGFuZG9mZnMsXG4gICAgICAgIGZ1bmN0aW9uczogcnVuRnVuY3Rpb25zLFxuICAgICAgICBjb21wdXRlckFjdGlvbnM6IHJ1bkNvbXB1dGVyQWN0aW9ucyxcbiAgICAgICAgdG9vbHNVc2VkOiB0b29sc1VzZWQsXG4gICAgfTtcbn1cbmV4cG9ydCBjb25zdCBuZXh0U3RlcFNjaGVtYSA9IHouZGlzY3JpbWluYXRlZFVuaW9uKCd0eXBlJywgW1xuICAgIHoub2JqZWN0KHtcbiAgICAgICAgdHlwZTogei5saXRlcmFsKCduZXh0X3N0ZXBfaGFuZG9mZicpLFxuICAgICAgICBuZXdBZ2VudDogei5hbnkoKSxcbiAgICB9KSxcbiAgICB6Lm9iamVjdCh7XG4gICAgICAgIHR5cGU6IHoubGl0ZXJhbCgnbmV4dF9zdGVwX2ZpbmFsX291dHB1dCcpLFxuICAgICAgICBvdXRwdXQ6IHouc3RyaW5nKCksXG4gICAgfSksXG4gICAgei5vYmplY3Qoe1xuICAgICAgICB0eXBlOiB6LmxpdGVyYWwoJ25leHRfc3RlcF9ydW5fYWdhaW4nKSxcbiAgICB9KSxcbiAgICB6Lm9iamVjdCh7XG4gICAgICAgIHR5cGU6IHoubGl0ZXJhbCgnbmV4dF9zdGVwX2ludGVycnVwdGlvbicpLFxuICAgICAgICBkYXRhOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LmFueSgpKSxcbiAgICB9KSxcbl0pO1xuY2xhc3MgU2luZ2xlU3RlcFJlc3VsdCB7XG4gICAgb3JpZ2luYWxJbnB1dDtcbiAgICBtb2RlbFJlc3BvbnNlO1xuICAgIHByZVN0ZXBJdGVtcztcbiAgICBuZXdTdGVwSXRlbXM7XG4gICAgbmV4dFN0ZXA7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgICogVGhlIGlucHV0IGl0ZW1zIGkuZS4gdGhlIGl0ZW1zIGJlZm9yZSBydW4oKSB3YXMgY2FsbGVkLiBNYXkgYmUgbXV0ZWQgYnkgaGFuZG9mZiBpbnB1dCBmaWx0ZXJzXG4gICAgICovXG4gICAgb3JpZ2luYWxJbnB1dCwgXG4gICAgLyoqXG4gICAgICogVGhlIG1vZGVsIHJlc3BvbnNlIGZvciB0aGUgY3VycmVudCBzdGVwXG4gICAgICovXG4gICAgbW9kZWxSZXNwb25zZSwgXG4gICAgLyoqXG4gICAgICogVGhlIGl0ZW1zIGJlZm9yZSB0aGUgY3VycmVudCBzdGVwIHdhcyBleGVjdXRlZFxuICAgICAqL1xuICAgIHByZVN0ZXBJdGVtcywgXG4gICAgLyoqXG4gICAgICogVGhlIGl0ZW1zIGFmdGVyIHRoZSBjdXJyZW50IHN0ZXAgd2FzIGV4ZWN1dGVkXG4gICAgICovXG4gICAgbmV3U3RlcEl0ZW1zLCBcbiAgICAvKipcbiAgICAgKiBUaGUgbmV4dCBzdGVwIHRvIGV4ZWN1dGVcbiAgICAgKi9cbiAgICBuZXh0U3RlcCkge1xuICAgICAgICB0aGlzLm9yaWdpbmFsSW5wdXQgPSBvcmlnaW5hbElucHV0O1xuICAgICAgICB0aGlzLm1vZGVsUmVzcG9uc2UgPSBtb2RlbFJlc3BvbnNlO1xuICAgICAgICB0aGlzLnByZVN0ZXBJdGVtcyA9IHByZVN0ZXBJdGVtcztcbiAgICAgICAgdGhpcy5uZXdTdGVwSXRlbXMgPSBuZXdTdGVwSXRlbXM7XG4gICAgICAgIHRoaXMubmV4dFN0ZXAgPSBuZXh0U3RlcDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGl0ZW1zIGdlbmVyYXRlZCBkdXJpbmcgdGhlIGFnZW50IHJ1biAoaS5lLiBldmVyeXRoaW5nIGdlbmVyYXRlZCBhZnRlciBvcmlnaW5hbElucHV0KVxuICAgICAqL1xuICAgIGdldCBnZW5lcmF0ZWRJdGVtcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJlU3RlcEl0ZW1zLmNvbmNhdCh0aGlzLm5ld1N0ZXBJdGVtcyk7XG4gICAgfVxufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1heWJlUmVzZXRUb29sQ2hvaWNlKGFnZW50LCB0b29sVXNlVHJhY2tlciwgbW9kZWxTZXR0aW5ncykge1xuICAgIGlmIChhZ2VudC5yZXNldFRvb2xDaG9pY2UgJiYgdG9vbFVzZVRyYWNrZXIuaGFzVXNlZFRvb2xzKGFnZW50KSkge1xuICAgICAgICByZXR1cm4geyAuLi5tb2RlbFNldHRpbmdzLCB0b29sQ2hvaWNlOiB1bmRlZmluZWQgfTtcbiAgICB9XG4gICAgcmV0dXJuIG1vZGVsU2V0dGluZ3M7XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZUludGVycnVwdGVkVG9vbHNBbmRTaWRlRWZmZWN0cyhhZ2VudCwgb3JpZ2luYWxJbnB1dCwgb3JpZ2luYWxQcmVTdGVwSXRlbXMsIG5ld1Jlc3BvbnNlLCBwcm9jZXNzZWRSZXNwb25zZSwgcnVubmVyLCBzdGF0ZSkge1xuICAgIGNvbnN0IHByZVN0ZXBJdGVtcyA9IG9yaWdpbmFsUHJlU3RlcEl0ZW1zLmZpbHRlcigoaXRlbSkgPT4ge1xuICAgICAgICByZXR1cm4gIShpdGVtIGluc3RhbmNlb2YgUnVuVG9vbEFwcHJvdmFsSXRlbSk7XG4gICAgfSk7XG4gICAgY29uc3QgYXBwcm92YWxSZXF1ZXN0cyA9IG9yaWdpbmFsUHJlU3RlcEl0ZW1zXG4gICAgICAgIC5maWx0ZXIoKGl0ZW0pID0+IHtcbiAgICAgICAgcmV0dXJuIGl0ZW0gaW5zdGFuY2VvZiBSdW5Ub29sQXBwcm92YWxJdGVtO1xuICAgIH0pXG4gICAgICAgIC5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgcmV0dXJuIGl0ZW0ucmF3SXRlbS5jYWxsSWQ7XG4gICAgfSk7XG4gICAgY29uc3QgZnVuY3Rpb25Ub29sUnVucyA9IHByb2Nlc3NlZFJlc3BvbnNlLmZ1bmN0aW9ucy5maWx0ZXIoKHJ1bikgPT4ge1xuICAgICAgICByZXR1cm4gYXBwcm92YWxSZXF1ZXN0cy5pbmNsdWRlcyhydW4udG9vbENhbGwuY2FsbElkKTtcbiAgICB9KTtcbiAgICBjb25zdCBmdW5jdGlvblJlc3VsdHMgPSBhd2FpdCBleGVjdXRlRnVuY3Rpb25Ub29sQ2FsbHMoYWdlbnQsIGZ1bmN0aW9uVG9vbFJ1bnMsIHJ1bm5lciwgc3RhdGUpO1xuICAgIGNvbnN0IG5ld0l0ZW1zID0gZnVuY3Rpb25SZXN1bHRzLm1hcCgocikgPT4gci5ydW5JdGVtKTtcbiAgICBjb25zdCBjaGVja1Rvb2xPdXRwdXQgPSBhd2FpdCBjaGVja0ZvckZpbmFsT3V0cHV0RnJvbVRvb2xzKGFnZW50LCBmdW5jdGlvblJlc3VsdHMsIHN0YXRlKTtcbiAgICBpZiAoY2hlY2tUb29sT3V0cHV0LmlzRmluYWxPdXRwdXQpIHtcbiAgICAgICAgcnVubmVyLmVtaXQoJ2FnZW50X2VuZCcsIHN0YXRlLl9jb250ZXh0LCBhZ2VudCwgY2hlY2tUb29sT3V0cHV0LmZpbmFsT3V0cHV0KTtcbiAgICAgICAgYWdlbnQuZW1pdCgnYWdlbnRfZW5kJywgc3RhdGUuX2NvbnRleHQsIGNoZWNrVG9vbE91dHB1dC5maW5hbE91dHB1dCk7XG4gICAgICAgIHJldHVybiBuZXcgU2luZ2xlU3RlcFJlc3VsdChvcmlnaW5hbElucHV0LCBuZXdSZXNwb25zZSwgcHJlU3RlcEl0ZW1zLCBuZXdJdGVtcywge1xuICAgICAgICAgICAgdHlwZTogJ25leHRfc3RlcF9maW5hbF9vdXRwdXQnLFxuICAgICAgICAgICAgb3V0cHV0OiBjaGVja1Rvb2xPdXRwdXQuZmluYWxPdXRwdXQsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBlbHNlIGlmIChjaGVja1Rvb2xPdXRwdXQuaXNJbnRlcnJ1cHRlZCkge1xuICAgICAgICByZXR1cm4gbmV3IFNpbmdsZVN0ZXBSZXN1bHQob3JpZ2luYWxJbnB1dCwgbmV3UmVzcG9uc2UsIHByZVN0ZXBJdGVtcywgbmV3SXRlbXMsIHtcbiAgICAgICAgICAgIHR5cGU6ICduZXh0X3N0ZXBfaW50ZXJydXB0aW9uJyxcbiAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICBpbnRlcnJ1cHRpb25zOiBjaGVja1Rvb2xPdXRwdXQuaW50ZXJydXB0aW9ucyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvLyB3ZSBvbmx5IHJhbiBuZXcgdG9vbHMgYW5kIHNpZGUgZWZmZWN0cy4gV2UgbmVlZCB0byBydW4gdGhlIHJlc3Qgb2YgdGhlIGFnZW50XG4gICAgcmV0dXJuIG5ldyBTaW5nbGVTdGVwUmVzdWx0KG9yaWdpbmFsSW5wdXQsIG5ld1Jlc3BvbnNlLCBwcmVTdGVwSXRlbXMsIG5ld0l0ZW1zLCB7IHR5cGU6ICduZXh0X3N0ZXBfcnVuX2FnYWluJyB9KTtcbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleGVjdXRlVG9vbHNBbmRTaWRlRWZmZWN0cyhhZ2VudCwgb3JpZ2luYWxJbnB1dCwgb3JpZ2luYWxQcmVTdGVwSXRlbXMsIG5ld1Jlc3BvbnNlLCBwcm9jZXNzZWRSZXNwb25zZSwgcnVubmVyLCBzdGF0ZSkge1xuICAgIGNvbnN0IHByZVN0ZXBJdGVtcyA9IG9yaWdpbmFsUHJlU3RlcEl0ZW1zO1xuICAgIGxldCBuZXdJdGVtcyA9IHByb2Nlc3NlZFJlc3BvbnNlLm5ld0l0ZW1zO1xuICAgIGNvbnN0IFtmdW5jdGlvblJlc3VsdHMsIGNvbXB1dGVyUmVzdWx0c10gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIGV4ZWN1dGVGdW5jdGlvblRvb2xDYWxscyhhZ2VudCwgcHJvY2Vzc2VkUmVzcG9uc2UuZnVuY3Rpb25zLCBydW5uZXIsIHN0YXRlKSxcbiAgICAgICAgZXhlY3V0ZUNvbXB1dGVyQWN0aW9ucyhhZ2VudCwgcHJvY2Vzc2VkUmVzcG9uc2UuY29tcHV0ZXJBY3Rpb25zLCBydW5uZXIsIHN0YXRlLl9jb250ZXh0KSxcbiAgICBdKTtcbiAgICBuZXdJdGVtcyA9IG5ld0l0ZW1zLmNvbmNhdChmdW5jdGlvblJlc3VsdHMubWFwKChyKSA9PiByLnJ1bkl0ZW0pKTtcbiAgICBuZXdJdGVtcyA9IG5ld0l0ZW1zLmNvbmNhdChjb21wdXRlclJlc3VsdHMpO1xuICAgIC8vIHByb2Nlc3MgaGFuZG9mZnNcbiAgICBpZiAocHJvY2Vzc2VkUmVzcG9uc2UuaGFuZG9mZnMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gYXdhaXQgZXhlY3V0ZUhhbmRvZmZDYWxscyhhZ2VudCwgb3JpZ2luYWxJbnB1dCwgcHJlU3RlcEl0ZW1zLCBuZXdJdGVtcywgbmV3UmVzcG9uc2UsIHByb2Nlc3NlZFJlc3BvbnNlLmhhbmRvZmZzLCBydW5uZXIsIHN0YXRlLl9jb250ZXh0KTtcbiAgICB9XG4gICAgY29uc3QgY2hlY2tUb29sT3V0cHV0ID0gYXdhaXQgY2hlY2tGb3JGaW5hbE91dHB1dEZyb21Ub29scyhhZ2VudCwgZnVuY3Rpb25SZXN1bHRzLCBzdGF0ZSk7XG4gICAgaWYgKGNoZWNrVG9vbE91dHB1dC5pc0ZpbmFsT3V0cHV0KSB7XG4gICAgICAgIHJ1bm5lci5lbWl0KCdhZ2VudF9lbmQnLCBzdGF0ZS5fY29udGV4dCwgYWdlbnQsIGNoZWNrVG9vbE91dHB1dC5maW5hbE91dHB1dCk7XG4gICAgICAgIGFnZW50LmVtaXQoJ2FnZW50X2VuZCcsIHN0YXRlLl9jb250ZXh0LCBjaGVja1Rvb2xPdXRwdXQuZmluYWxPdXRwdXQpO1xuICAgICAgICByZXR1cm4gbmV3IFNpbmdsZVN0ZXBSZXN1bHQob3JpZ2luYWxJbnB1dCwgbmV3UmVzcG9uc2UsIHByZVN0ZXBJdGVtcywgbmV3SXRlbXMsIHtcbiAgICAgICAgICAgIHR5cGU6ICduZXh0X3N0ZXBfZmluYWxfb3V0cHV0JyxcbiAgICAgICAgICAgIG91dHB1dDogY2hlY2tUb29sT3V0cHV0LmZpbmFsT3V0cHV0LFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoY2hlY2tUb29sT3V0cHV0LmlzSW50ZXJydXB0ZWQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTaW5nbGVTdGVwUmVzdWx0KG9yaWdpbmFsSW5wdXQsIG5ld1Jlc3BvbnNlLCBwcmVTdGVwSXRlbXMsIG5ld0l0ZW1zLCB7XG4gICAgICAgICAgICB0eXBlOiAnbmV4dF9zdGVwX2ludGVycnVwdGlvbicsXG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgaW50ZXJydXB0aW9uczogY2hlY2tUb29sT3V0cHV0LmludGVycnVwdGlvbnMsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLy8gY2hlY2sgaWYgdGhlIGFnZW50IHByb2R1Y2VkIGFueSBtZXNzYWdlc1xuICAgIGNvbnN0IG1lc3NhZ2VJdGVtcyA9IG5ld0l0ZW1zLmZpbHRlcigoaXRlbSkgPT4gaXRlbSBpbnN0YW5jZW9mIFJ1bk1lc3NhZ2VPdXRwdXRJdGVtKTtcbiAgICAvLyB3ZSB3aWxsIHVzZSB0aGUgbGFzdCBjb250ZW50IG91dHB1dCBhcyB0aGUgZmluYWwgb3V0cHV0XG4gICAgY29uc3QgcG90ZW50aWFsRmluYWxPdXRwdXQgPSBtZXNzYWdlSXRlbXMubGVuZ3RoID4gMFxuICAgICAgICA/IGdldExhc3RUZXh0RnJvbU91dHB1dE1lc3NhZ2UobWVzc2FnZUl0ZW1zW21lc3NhZ2VJdGVtcy5sZW5ndGggLSAxXS5yYXdJdGVtKVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAvLyBpZiB0aGVyZSBpcyBubyBvdXRwdXQgd2UganVzdCBydW4gYWdhaW5cbiAgICBpZiAoIXBvdGVudGlhbEZpbmFsT3V0cHV0KSB7XG4gICAgICAgIHJldHVybiBuZXcgU2luZ2xlU3RlcFJlc3VsdChvcmlnaW5hbElucHV0LCBuZXdSZXNwb25zZSwgcHJlU3RlcEl0ZW1zLCBuZXdJdGVtcywgeyB0eXBlOiAnbmV4dF9zdGVwX3J1bl9hZ2FpbicgfSk7XG4gICAgfVxuICAgIGlmIChhZ2VudC5vdXRwdXRUeXBlID09PSAndGV4dCcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTaW5nbGVTdGVwUmVzdWx0KG9yaWdpbmFsSW5wdXQsIG5ld1Jlc3BvbnNlLCBwcmVTdGVwSXRlbXMsIG5ld0l0ZW1zLCB7XG4gICAgICAgICAgICB0eXBlOiAnbmV4dF9zdGVwX2ZpbmFsX291dHB1dCcsXG4gICAgICAgICAgICBvdXRwdXQ6IHBvdGVudGlhbEZpbmFsT3V0cHV0LFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IHsgcGFyc2VyIH0gPSBnZXRTY2hlbWFBbmRQYXJzZXJGcm9tSW5wdXRUeXBlKGFnZW50Lm91dHB1dFR5cGUsICdmaW5hbF9vdXRwdXQnKTtcbiAgICAgICAgY29uc3QgW2Vycm9yXSA9IGF3YWl0IHNhZmVFeGVjdXRlKCgpID0+IHBhcnNlcihwb3RlbnRpYWxGaW5hbE91dHB1dCkpO1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIGFkZEVycm9yVG9DdXJyZW50U3Bhbih7XG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ0ludmFsaWQgb3V0cHV0IHR5cGUnLFxuICAgICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I6IFN0cmluZyhlcnJvciksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgbmV3IE1vZGVsQmVoYXZpb3JFcnJvcignSW52YWxpZCBvdXRwdXQgdHlwZScpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgU2luZ2xlU3RlcFJlc3VsdChvcmlnaW5hbElucHV0LCBuZXdSZXNwb25zZSwgcHJlU3RlcEl0ZW1zLCBuZXdJdGVtcywgeyB0eXBlOiAnbmV4dF9zdGVwX2ZpbmFsX291dHB1dCcsIG91dHB1dDogcG90ZW50aWFsRmluYWxPdXRwdXQgfSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgU2luZ2xlU3RlcFJlc3VsdChvcmlnaW5hbElucHV0LCBuZXdSZXNwb25zZSwgcHJlU3RlcEl0ZW1zLCBuZXdJdGVtcywgeyB0eXBlOiAnbmV4dF9zdGVwX3J1bl9hZ2FpbicgfSk7XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VG9vbENhbGxPdXRwdXRJdGVtKHRvb2xDYWxsLCBvdXRwdXQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiAnZnVuY3Rpb25fY2FsbF9yZXN1bHQnLFxuICAgICAgICBuYW1lOiB0b29sQ2FsbC5uYW1lLFxuICAgICAgICBjYWxsSWQ6IHRvb2xDYWxsLmNhbGxJZCxcbiAgICAgICAgc3RhdHVzOiAnY29tcGxldGVkJyxcbiAgICAgICAgb3V0cHV0OiB7XG4gICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICB0ZXh0OiB0b1NtYXJ0U3RyaW5nKG91dHB1dCksXG4gICAgICAgIH0sXG4gICAgfTtcbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleGVjdXRlRnVuY3Rpb25Ub29sQ2FsbHMoYWdlbnQsIHRvb2xSdW5zLCBydW5uZXIsIHN0YXRlKSB7XG4gICAgYXN5bmMgZnVuY3Rpb24gcnVuU2luZ2xlVG9vbCh0b29sUnVuKSB7XG4gICAgICAgIGxldCBwYXJzZWRBcmdzID0gdG9vbFJ1bi50b29sQ2FsbC5hcmd1bWVudHM7XG4gICAgICAgIGlmICh0b29sUnVuLnRvb2wucGFyYW1ldGVycykge1xuICAgICAgICAgICAgaWYgKGlzWm9kT2JqZWN0KHRvb2xSdW4udG9vbC5wYXJhbWV0ZXJzKSkge1xuICAgICAgICAgICAgICAgIHBhcnNlZEFyZ3MgPSB0b29sUnVuLnRvb2wucGFyYW1ldGVycy5wYXJzZShwYXJzZWRBcmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHBhcnNlZEFyZ3MgPSBKU09OLnBhcnNlKHBhcnNlZEFyZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5lZWRzQXBwcm92YWwgPSBhd2FpdCB0b29sUnVuLnRvb2wubmVlZHNBcHByb3ZhbChzdGF0ZS5fY29udGV4dCwgcGFyc2VkQXJncywgdG9vbFJ1bi50b29sQ2FsbC5jYWxsSWQpO1xuICAgICAgICBpZiAobmVlZHNBcHByb3ZhbCkge1xuICAgICAgICAgICAgY29uc3QgYXBwcm92YWwgPSBzdGF0ZS5fY29udGV4dC5pc1Rvb2xBcHByb3ZlZCh7XG4gICAgICAgICAgICAgICAgdG9vbE5hbWU6IHRvb2xSdW4udG9vbC5uYW1lLFxuICAgICAgICAgICAgICAgIGNhbGxJZDogdG9vbFJ1bi50b29sQ2FsbC5jYWxsSWQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChhcHByb3ZhbCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gd2l0aEZ1bmN0aW9uU3Bhbihhc3luYyAoc3BhbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9ICdUb29sIGV4ZWN1dGlvbiB3YXMgbm90IGFwcHJvdmVkLic7XG4gICAgICAgICAgICAgICAgICAgIHNwYW4uc2V0RXJyb3Ioe1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogcmVzcG9uc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9vbF9uYW1lOiB0b29sUnVuLnRvb2wubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogYFRvb2wgZXhlY3V0aW9uIGZvciAke3Rvb2xSdW4udG9vbENhbGwuY2FsbElkfSB3YXMgbWFudWFsbHkgcmVqZWN0ZWQgYnkgdXNlci5gLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHNwYW4uc3BhbkRhdGEub3V0cHV0ID0gcmVzcG9uc2U7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZnVuY3Rpb25fb3V0cHV0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvb2w6IHRvb2xSdW4udG9vbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dDogcmVzcG9uc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBydW5JdGVtOiBuZXcgUnVuVG9vbENhbGxPdXRwdXRJdGVtKGdldFRvb2xDYWxsT3V0cHV0SXRlbSh0b29sUnVuLnRvb2xDYWxsLCByZXNwb25zZSksIGFnZW50LCByZXNwb25zZSksXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiB0b29sUnVuLnRvb2wubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhcHByb3ZhbCAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdmdW5jdGlvbl9hcHByb3ZhbCcsXG4gICAgICAgICAgICAgICAgICAgIHRvb2w6IHRvb2xSdW4udG9vbCxcbiAgICAgICAgICAgICAgICAgICAgcnVuSXRlbTogbmV3IFJ1blRvb2xBcHByb3ZhbEl0ZW0odG9vbFJ1bi50b29sQ2FsbCwgYWdlbnQpLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdpdGhGdW5jdGlvblNwYW4oYXN5bmMgKHNwYW4pID0+IHtcbiAgICAgICAgICAgIGlmIChydW5uZXIuY29uZmlnLnRyYWNlSW5jbHVkZVNlbnNpdGl2ZURhdGEpIHtcbiAgICAgICAgICAgICAgICBzcGFuLnNwYW5EYXRhLmlucHV0ID0gdG9vbFJ1bi50b29sQ2FsbC5hcmd1bWVudHM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJ1bm5lci5lbWl0KCdhZ2VudF90b29sX3N0YXJ0Jywgc3RhdGUuX2NvbnRleHQsIGFnZW50LCB0b29sUnVuLnRvb2wpO1xuICAgICAgICAgICAgICAgIGFnZW50LmVtaXQoJ2FnZW50X3Rvb2xfc3RhcnQnLCBzdGF0ZS5fY29udGV4dCwgdG9vbFJ1bi50b29sKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0b29sUnVuLnRvb2wuaW52b2tlKHN0YXRlLl9jb250ZXh0LCB0b29sUnVuLnRvb2xDYWxsLmFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgICAgLy8gVXNlIHN0cmluZyBkYXRhIGZvciB0cmFjaW5nIGFuZCBldmVudCBlbWl0dGVyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nUmVzdWx0ID0gdG9TbWFydFN0cmluZyhyZXN1bHQpO1xuICAgICAgICAgICAgICAgIHJ1bm5lci5lbWl0KCdhZ2VudF90b29sX2VuZCcsIHN0YXRlLl9jb250ZXh0LCBhZ2VudCwgdG9vbFJ1bi50b29sLCBzdHJpbmdSZXN1bHQpO1xuICAgICAgICAgICAgICAgIGFnZW50LmVtaXQoJ2FnZW50X3Rvb2xfZW5kJywgc3RhdGUuX2NvbnRleHQsIHRvb2xSdW4udG9vbCwgc3RyaW5nUmVzdWx0KTtcbiAgICAgICAgICAgICAgICBpZiAocnVubmVyLmNvbmZpZy50cmFjZUluY2x1ZGVTZW5zaXRpdmVEYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIHNwYW4uc3BhbkRhdGEub3V0cHV0ID0gc3RyaW5nUmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZnVuY3Rpb25fb3V0cHV0JyxcbiAgICAgICAgICAgICAgICAgICAgdG9vbDogdG9vbFJ1bi50b29sLFxuICAgICAgICAgICAgICAgICAgICBvdXRwdXQ6IHJlc3VsdCxcbiAgICAgICAgICAgICAgICAgICAgcnVuSXRlbTogbmV3IFJ1blRvb2xDYWxsT3V0cHV0SXRlbShnZXRUb29sQ2FsbE91dHB1dEl0ZW0odG9vbFJ1bi50b29sQ2FsbCwgcmVzdWx0KSwgYWdlbnQsIHJlc3VsdCksXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHNwYW4uc2V0RXJyb3Ioe1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnRXJyb3IgcnVubmluZyB0b29sJyxcbiAgICAgICAgICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9vbF9uYW1lOiB0b29sUnVuLnRvb2wubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBTdHJpbmcoZXJyb3IpLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCB7XG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgbmFtZTogdG9vbFJ1bi50b29sLm5hbWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKHRvb2xSdW5zLm1hcChydW5TaW5nbGVUb29sKSk7XG4gICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICB0aHJvdyBuZXcgVG9vbENhbGxFcnJvcihgRmFpbGVkIHRvIHJ1biBmdW5jdGlvbiB0b29sczogJHtlfWAsIGUsIHN0YXRlKTtcbiAgICB9XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG4vLyBJbnRlcm5hbCBoZWxwZXI6IGRpc3BhdGNoIGEgY29tcHV0ZXIgYWN0aW9uIGFuZCByZXR1cm4gYSBzY3JlZW5zaG90IChzeW5jL2FzeW5jKVxuYXN5bmMgZnVuY3Rpb24gX3J1bkNvbXB1dGVyQWN0aW9uQW5kU2NyZWVuc2hvdChjb21wdXRlciwgdG9vbENhbGwpIHtcbiAgICBjb25zdCBhY3Rpb24gPSB0b29sQ2FsbC5hY3Rpb247XG4gICAgbGV0IHNjcmVlbnNob3Q7XG4gICAgLy8gRGlzcGF0Y2ggYmFzZWQgb24gYWN0aW9uIHR5cGUgc3RyaW5nIChhc3N1bWUgYWN0aW9uLnR5cGUgZXhpc3RzKVxuICAgIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnY2xpY2snOlxuICAgICAgICAgICAgYXdhaXQgY29tcHV0ZXIuY2xpY2soYWN0aW9uLngsIGFjdGlvbi55LCBhY3Rpb24uYnV0dG9uKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdkb3VibGVfY2xpY2snOlxuICAgICAgICAgICAgYXdhaXQgY29tcHV0ZXIuZG91YmxlQ2xpY2soYWN0aW9uLngsIGFjdGlvbi55KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdkcmFnJzpcbiAgICAgICAgICAgIGF3YWl0IGNvbXB1dGVyLmRyYWcoYWN0aW9uLnBhdGgubWFwKChwKSA9PiBbcC54LCBwLnldKSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAna2V5cHJlc3MnOlxuICAgICAgICAgICAgYXdhaXQgY29tcHV0ZXIua2V5cHJlc3MoYWN0aW9uLmtleXMpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ21vdmUnOlxuICAgICAgICAgICAgYXdhaXQgY29tcHV0ZXIubW92ZShhY3Rpb24ueCwgYWN0aW9uLnkpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3NjcmVlbnNob3QnOlxuICAgICAgICAgICAgc2NyZWVuc2hvdCA9IGF3YWl0IGNvbXB1dGVyLnNjcmVlbnNob3QoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdzY3JvbGwnOlxuICAgICAgICAgICAgYXdhaXQgY29tcHV0ZXIuc2Nyb2xsKGFjdGlvbi54LCBhY3Rpb24ueSwgYWN0aW9uLnNjcm9sbF94LCBhY3Rpb24uc2Nyb2xsX3kpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3R5cGUnOlxuICAgICAgICAgICAgYXdhaXQgY29tcHV0ZXIudHlwZShhY3Rpb24udGV4dCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnd2FpdCc6XG4gICAgICAgICAgICBhd2FpdCBjb21wdXRlci53YWl0KCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGFjdGlvbjsgLy8gZW5zdXJlcyB0aGF0IHdlIGhhbmRsZSBldmVyeSBhY3Rpb24gd2Uga25vdyBvZlxuICAgICAgICAgICAgLy8gVW5rbm93biBhY3Rpb24sIGp1c3QgdGFrZSBzY3JlZW5zaG90XG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBzY3JlZW5zaG90ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gc2NyZWVuc2hvdDtcbiAgICB9XG4gICAgLy8gQWx3YXlzIHJldHVybiBzY3JlZW5zaG90IGFzIGJhc2U2NCBzdHJpbmdcbiAgICBpZiAodHlwZW9mIGNvbXB1dGVyLnNjcmVlbnNob3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgc2NyZWVuc2hvdCA9IGF3YWl0IGNvbXB1dGVyLnNjcmVlbnNob3QoKTtcbiAgICAgICAgaWYgKHR5cGVvZiBzY3JlZW5zaG90ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIHNjcmVlbnNob3Q7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDb21wdXRlciBkb2VzIG5vdCBpbXBsZW1lbnQgc2NyZWVuc2hvdCgpJyk7XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZUNvbXB1dGVyQWN0aW9ucyhhZ2VudCwgYWN0aW9ucywgcnVubmVyLCBydW5Db250ZXh0KSB7XG4gICAgY29uc3QgcmVzdWx0cyA9IFtdO1xuICAgIGZvciAoY29uc3QgYWN0aW9uIG9mIGFjdGlvbnMpIHtcbiAgICAgICAgY29uc3QgY29tcHV0ZXIgPSBhY3Rpb24uY29tcHV0ZXIuY29tcHV0ZXI7XG4gICAgICAgIGNvbnN0IHRvb2xDYWxsID0gYWN0aW9uLnRvb2xDYWxsO1xuICAgICAgICAvLyBIb29rczogb25fdG9vbF9zdGFydCAoZ2xvYmFsICsgYWdlbnQpXG4gICAgICAgIHJ1bm5lci5lbWl0KCdhZ2VudF90b29sX3N0YXJ0JywgcnVuQ29udGV4dCwgYWdlbnQsIGFjdGlvbi5jb21wdXRlcik7XG4gICAgICAgIGlmICh0eXBlb2YgYWdlbnQuZW1pdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgYWdlbnQuZW1pdCgnYWdlbnRfdG9vbF9zdGFydCcsIHJ1bkNvbnRleHQsIGFjdGlvbi5jb21wdXRlcik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUnVuIHRoZSBhY3Rpb24gYW5kIGdldCBzY3JlZW5zaG90XG4gICAgICAgIGxldCBvdXRwdXQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBvdXRwdXQgPSBhd2FpdCBfcnVuQ29tcHV0ZXJBY3Rpb25BbmRTY3JlZW5zaG90KGNvbXB1dGVyLCB0b29sQ2FsbCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gZXhlY3V0ZSBjb21wdXRlciBhY3Rpb246JywgZXJyKTtcbiAgICAgICAgICAgIG91dHB1dCA9ICcnO1xuICAgICAgICB9XG4gICAgICAgIC8vIEhvb2tzOiBvbl90b29sX2VuZCAoZ2xvYmFsICsgYWdlbnQpXG4gICAgICAgIHJ1bm5lci5lbWl0KCdhZ2VudF90b29sX2VuZCcsIHJ1bkNvbnRleHQsIGFnZW50LCBhY3Rpb24uY29tcHV0ZXIsIG91dHB1dCk7XG4gICAgICAgIGlmICh0eXBlb2YgYWdlbnQuZW1pdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgYWdlbnQuZW1pdCgnYWdlbnRfdG9vbF9lbmQnLCBydW5Db250ZXh0LCBhY3Rpb24uY29tcHV0ZXIsIG91dHB1dCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQWx3YXlzIHJldHVybiBhIHNjcmVlbnNob3QgYXMgYSBiYXNlNjQgZGF0YSBVUkxcbiAgICAgICAgY29uc3QgaW1hZ2VVcmwgPSBvdXRwdXQgPyBgZGF0YTppbWFnZS9wbmc7YmFzZTY0LCR7b3V0cHV0fWAgOiAnJztcbiAgICAgICAgY29uc3QgcmF3SXRlbSA9IHtcbiAgICAgICAgICAgIHR5cGU6ICdjb21wdXRlcl9jYWxsX3Jlc3VsdCcsXG4gICAgICAgICAgICBjYWxsSWQ6IHRvb2xDYWxsLmNhbGxJZCxcbiAgICAgICAgICAgIG91dHB1dDogeyB0eXBlOiAnY29tcHV0ZXJfc2NyZWVuc2hvdCcsIGRhdGE6IGltYWdlVXJsIH0sXG4gICAgICAgIH07XG4gICAgICAgIHJlc3VsdHMucHVzaChuZXcgUnVuVG9vbENhbGxPdXRwdXRJdGVtKHJhd0l0ZW0sIGFnZW50LCBpbWFnZVVybCkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0cztcbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleGVjdXRlSGFuZG9mZkNhbGxzKGFnZW50LCBvcmlnaW5hbElucHV0LCBwcmVTdGVwSXRlbXMsIG5ld1N0ZXBJdGVtcywgbmV3UmVzcG9uc2UsIHJ1bkhhbmRvZmZzLCBydW5uZXIsIHJ1bkNvbnRleHQpIHtcbiAgICBuZXdTdGVwSXRlbXMgPSBbLi4ubmV3U3RlcEl0ZW1zXTtcbiAgICBpZiAocnVuSGFuZG9mZnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdJbmNvcnJlY3RseSBjYWxsZWQgZXhlY3V0ZUhhbmRvZmZDYWxscyB3aXRoIG5vIGhhbmRvZmZzLiBUaGlzIHNob3VsZCBub3QgaGFwcGVuLiBNb3Zpbmcgb24uJyk7XG4gICAgICAgIHJldHVybiBuZXcgU2luZ2xlU3RlcFJlc3VsdChvcmlnaW5hbElucHV0LCBuZXdSZXNwb25zZSwgcHJlU3RlcEl0ZW1zLCBuZXdTdGVwSXRlbXMsIHsgdHlwZTogJ25leHRfc3RlcF9ydW5fYWdhaW4nIH0pO1xuICAgIH1cbiAgICBpZiAocnVuSGFuZG9mZnMubGVuZ3RoID4gMSkge1xuICAgICAgICAvLyBtdWx0aXBsZSBoYW5kb2Zmcy4gSWdub3JpbmcgYWxsIGJ1dCB0aGUgZmlyc3Qgb25lIGJ5IGFkZGluZyByZWplY3QgcmVzcG9uc2VzIGZvciB0aG9zZVxuICAgICAgICBjb25zdCBvdXRwdXRNZXNzYWdlID0gJ011bHRpcGxlIGhhbmRvZmZzIGRldGVjdGVkLCBpZ25vcm5pbmcgdGhpcyBvbmUuJztcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBydW5IYW5kb2Zmcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbmV3U3RlcEl0ZW1zLnB1c2gobmV3IFJ1blRvb2xDYWxsT3V0cHV0SXRlbShnZXRUb29sQ2FsbE91dHB1dEl0ZW0ocnVuSGFuZG9mZnNbaV0udG9vbENhbGwsIG91dHB1dE1lc3NhZ2UpLCBhZ2VudCwgb3V0cHV0TWVzc2FnZSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGFjdHVhbEhhbmRvZmYgPSBydW5IYW5kb2Zmc1swXTtcbiAgICByZXR1cm4gd2l0aEhhbmRvZmZTcGFuKGFzeW5jIChoYW5kb2ZmU3BhbikgPT4ge1xuICAgICAgICBjb25zdCBoYW5kb2ZmID0gYWN0dWFsSGFuZG9mZi5oYW5kb2ZmO1xuICAgICAgICBjb25zdCBuZXdBZ2VudCA9IGF3YWl0IGhhbmRvZmYub25JbnZva2VIYW5kb2ZmKHJ1bkNvbnRleHQsIGFjdHVhbEhhbmRvZmYudG9vbENhbGwuYXJndW1lbnRzKTtcbiAgICAgICAgaGFuZG9mZlNwYW4uc3BhbkRhdGEudG9fYWdlbnQgPSBuZXdBZ2VudC5uYW1lO1xuICAgICAgICBpZiAocnVuSGFuZG9mZnMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgY29uc3QgcmVxdWVzdGVkQWdlbnRzID0gcnVuSGFuZG9mZnMubWFwKChoKSA9PiBoLmhhbmRvZmYuYWdlbnROYW1lKTtcbiAgICAgICAgICAgIGhhbmRvZmZTcGFuLnNldEVycm9yKHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiAnTXVsdGlwbGUgaGFuZG9mZnMgcmVxdWVzdGVkJyxcbiAgICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZF9hZ2VudHM6IHJlcXVlc3RlZEFnZW50cyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgbmV3U3RlcEl0ZW1zLnB1c2gobmV3IFJ1bkhhbmRvZmZPdXRwdXRJdGVtKGdldFRvb2xDYWxsT3V0cHV0SXRlbShhY3R1YWxIYW5kb2ZmLnRvb2xDYWxsLCBnZXRUcmFuc2Zlck1lc3NhZ2UobmV3QWdlbnQpKSwgYWdlbnQsIG5ld0FnZW50KSk7XG4gICAgICAgIHJ1bm5lci5lbWl0KCdhZ2VudF9oYW5kb2ZmJywgcnVuQ29udGV4dCwgYWdlbnQsIG5ld0FnZW50KTtcbiAgICAgICAgYWdlbnQuZW1pdCgnYWdlbnRfaGFuZG9mZicsIHJ1bkNvbnRleHQsIG5ld0FnZW50KTtcbiAgICAgICAgY29uc3QgaW5wdXRGaWx0ZXIgPSBoYW5kb2ZmLmlucHV0RmlsdGVyID8/IHJ1bm5lci5jb25maWcuaGFuZG9mZklucHV0RmlsdGVyO1xuICAgICAgICBpZiAoaW5wdXRGaWx0ZXIpIHtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnRmlsdGVyaW5nIGlucHV0cyBmb3IgaGFuZG9mZicpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBpbnB1dEZpbHRlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIGhhbmRvZmZTcGFuLnNldEVycm9yKHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ0ludmFsaWQgaW5wdXQgZmlsdGVyJyxcbiAgICAgICAgICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsczogJ25vdCBjYWxsYWJsZScsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBoYW5kb2ZmSW5wdXREYXRhID0ge1xuICAgICAgICAgICAgICAgIGlucHV0SGlzdG9yeTogQXJyYXkuaXNBcnJheShvcmlnaW5hbElucHV0KVxuICAgICAgICAgICAgICAgICAgICA/IFsuLi5vcmlnaW5hbElucHV0XVxuICAgICAgICAgICAgICAgICAgICA6IG9yaWdpbmFsSW5wdXQsXG4gICAgICAgICAgICAgICAgcHJlSGFuZG9mZkl0ZW1zOiBbLi4ucHJlU3RlcEl0ZW1zXSxcbiAgICAgICAgICAgICAgICBuZXdJdGVtczogWy4uLm5ld1N0ZXBJdGVtc10sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgZmlsdGVyZWQgPSBpbnB1dEZpbHRlcihoYW5kb2ZmSW5wdXREYXRhKTtcbiAgICAgICAgICAgIG9yaWdpbmFsSW5wdXQgPSBmaWx0ZXJlZC5pbnB1dEhpc3Rvcnk7XG4gICAgICAgICAgICBwcmVTdGVwSXRlbXMgPSBmaWx0ZXJlZC5wcmVIYW5kb2ZmSXRlbXM7XG4gICAgICAgICAgICBuZXdTdGVwSXRlbXMgPSBmaWx0ZXJlZC5uZXdJdGVtcztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFNpbmdsZVN0ZXBSZXN1bHQob3JpZ2luYWxJbnB1dCwgbmV3UmVzcG9uc2UsIHByZVN0ZXBJdGVtcywgbmV3U3RlcEl0ZW1zLCB7IHR5cGU6ICduZXh0X3N0ZXBfaGFuZG9mZicsIG5ld0FnZW50IH0pO1xuICAgIH0sIHtcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgZnJvbV9hZ2VudDogYWdlbnQubmFtZSxcbiAgICAgICAgfSxcbiAgICB9KTtcbn1cbmNvbnN0IE5PVF9GSU5BTF9PVVRQVVQgPSB7XG4gICAgaXNGaW5hbE91dHB1dDogZmFsc2UsXG4gICAgaXNJbnRlcnJ1cHRlZDogdW5kZWZpbmVkLFxufTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjaGVja0ZvckZpbmFsT3V0cHV0RnJvbVRvb2xzKGFnZW50LCB0b29sUmVzdWx0cywgc3RhdGUpIHtcbiAgICBpZiAodG9vbFJlc3VsdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBOT1RfRklOQUxfT1VUUFVUO1xuICAgIH1cbiAgICBjb25zdCBpbnRlcnJ1cHRpb25zID0gdG9vbFJlc3VsdHNcbiAgICAgICAgLmZpbHRlcigocikgPT4gci5ydW5JdGVtIGluc3RhbmNlb2YgUnVuVG9vbEFwcHJvdmFsSXRlbSlcbiAgICAgICAgLm1hcCgocikgPT4gci5ydW5JdGVtKTtcbiAgICBpZiAoaW50ZXJydXB0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpc0ZpbmFsT3V0cHV0OiBmYWxzZSxcbiAgICAgICAgICAgIGlzSW50ZXJydXB0ZWQ6IHRydWUsXG4gICAgICAgICAgICBpbnRlcnJ1cHRpb25zLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAoYWdlbnQudG9vbFVzZUJlaGF2aW9yID09PSAncnVuX2xsbV9hZ2FpbicpIHtcbiAgICAgICAgcmV0dXJuIE5PVF9GSU5BTF9PVVRQVVQ7XG4gICAgfVxuICAgIGNvbnN0IGZpcnN0VG9vbFJlc3VsdCA9IHRvb2xSZXN1bHRzWzBdO1xuICAgIGlmIChhZ2VudC50b29sVXNlQmVoYXZpb3IgPT09ICdzdG9wX29uX2ZpcnN0X3Rvb2wnKSB7XG4gICAgICAgIGlmIChmaXJzdFRvb2xSZXN1bHQ/LnR5cGUgPT09ICdmdW5jdGlvbl9vdXRwdXQnKSB7XG4gICAgICAgICAgICBjb25zdCBzdHJpbmdPdXRwdXQgPSB0b1NtYXJ0U3RyaW5nKGZpcnN0VG9vbFJlc3VsdC5vdXRwdXQpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBpc0ZpbmFsT3V0cHV0OiB0cnVlLFxuICAgICAgICAgICAgICAgIGlzSW50ZXJydXB0ZWQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBmaW5hbE91dHB1dDogc3RyaW5nT3V0cHV0LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gTk9UX0ZJTkFMX09VVFBVVDtcbiAgICB9XG4gICAgY29uc3QgdG9vbFVzZUJlaGF2aW9yID0gYWdlbnQudG9vbFVzZUJlaGF2aW9yO1xuICAgIGlmICh0eXBlb2YgdG9vbFVzZUJlaGF2aW9yID09PSAnb2JqZWN0Jykge1xuICAgICAgICBjb25zdCBzdG9wcGluZ1Rvb2wgPSB0b29sUmVzdWx0cy5maW5kKChyKSA9PiB0b29sVXNlQmVoYXZpb3Iuc3RvcEF0VG9vbE5hbWVzLmluY2x1ZGVzKHIudG9vbC5uYW1lKSk7XG4gICAgICAgIGlmIChzdG9wcGluZ1Rvb2w/LnR5cGUgPT09ICdmdW5jdGlvbl9vdXRwdXQnKSB7XG4gICAgICAgICAgICBjb25zdCBzdHJpbmdPdXRwdXQgPSB0b1NtYXJ0U3RyaW5nKHN0b3BwaW5nVG9vbC5vdXRwdXQpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBpc0ZpbmFsT3V0cHV0OiB0cnVlLFxuICAgICAgICAgICAgICAgIGlzSW50ZXJydXB0ZWQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBmaW5hbE91dHB1dDogc3RyaW5nT3V0cHV0LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gTk9UX0ZJTkFMX09VVFBVVDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB0b29sVXNlQmVoYXZpb3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIHRvb2xVc2VCZWhhdmlvcihzdGF0ZS5fY29udGV4dCwgdG9vbFJlc3VsdHMpO1xuICAgIH1cbiAgICBsb2dnZXIuZXJyb3IoJ0ludmFsaWQgdG9vbFVzZUJlaGF2aW9yOiAnLCB0b29sVXNlQmVoYXZpb3IpO1xuICAgIHRocm93IG5ldyBVc2VyRXJyb3IoYEludmFsaWQgdG9vbFVzZUJlaGF2aW9yOiAke3Rvb2xVc2VCZWhhdmlvcn1gLCBzdGF0ZSk7XG59XG5leHBvcnQgZnVuY3Rpb24gYWRkU3RlcFRvUnVuUmVzdWx0KHJlc3VsdCwgc3RlcCkge1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiBzdGVwLm5ld1N0ZXBJdGVtcykge1xuICAgICAgICBsZXQgaXRlbU5hbWU7XG4gICAgICAgIGlmIChpdGVtIGluc3RhbmNlb2YgUnVuTWVzc2FnZU91dHB1dEl0ZW0pIHtcbiAgICAgICAgICAgIGl0ZW1OYW1lID0gJ21lc3NhZ2Vfb3V0cHV0X2NyZWF0ZWQnO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBSdW5IYW5kb2ZmQ2FsbEl0ZW0pIHtcbiAgICAgICAgICAgIGl0ZW1OYW1lID0gJ2hhbmRvZmZfcmVxdWVzdGVkJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgUnVuSGFuZG9mZk91dHB1dEl0ZW0pIHtcbiAgICAgICAgICAgIGl0ZW1OYW1lID0gJ2hhbmRvZmZfb2NjdXJyZWQnO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBSdW5Ub29sQ2FsbEl0ZW0pIHtcbiAgICAgICAgICAgIGl0ZW1OYW1lID0gJ3Rvb2xfY2FsbGVkJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgUnVuVG9vbENhbGxPdXRwdXRJdGVtKSB7XG4gICAgICAgICAgICBpdGVtTmFtZSA9ICd0b29sX291dHB1dCc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFJ1blJlYXNvbmluZ0l0ZW0pIHtcbiAgICAgICAgICAgIGl0ZW1OYW1lID0gJ3JlYXNvbmluZ19pdGVtX2NyZWF0ZWQnO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBSdW5Ub29sQXBwcm92YWxJdGVtKSB7XG4gICAgICAgICAgICBpdGVtTmFtZSA9ICd0b29sX2FwcHJvdmFsX3JlcXVlc3RlZCc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybignVW5rbm93biBpdGVtIHR5cGU6ICcsIGl0ZW0pO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0Ll9hZGRJdGVtKG5ldyBSdW5JdGVtU3RyZWFtRXZlbnQoaXRlbU5hbWUsIGl0ZW0pKTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgQWdlbnRUb29sVXNlVHJhY2tlciB7XG4gICAgI2FnZW50VG9Ub29scyA9IG5ldyBNYXAoKTtcbiAgICBhZGRUb29sVXNlKGFnZW50LCB0b29sTmFtZXMpIHtcbiAgICAgICAgdGhpcy4jYWdlbnRUb1Rvb2xzLnNldChhZ2VudCwgdG9vbE5hbWVzKTtcbiAgICB9XG4gICAgaGFzVXNlZFRvb2xzKGFnZW50KSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNhZ2VudFRvVG9vbHMuaGFzKGFnZW50KTtcbiAgICB9XG4gICAgdG9KU09OKCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKEFycmF5LmZyb20odGhpcy4jYWdlbnRUb1Rvb2xzLmVudHJpZXMoKSkubWFwKChbYWdlbnQsIHRvb2xOYW1lc10pID0+IHtcbiAgICAgICAgICAgIHJldHVybiBbYWdlbnQubmFtZSwgdG9vbE5hbWVzXTtcbiAgICAgICAgfSkpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJ1bkltcGxlbWVudGF0aW9uLm1qcy5tYXAiLCJpbXBvcnQgeyB6IH0gZnJvbSAnQG9wZW5haS96b2QvdjMnO1xuaW1wb3J0IHsgQWdlbnQgfSBmcm9tIFwiLi9hZ2VudC5tanNcIjtcbmltcG9ydCB7IFJ1bk1lc3NhZ2VPdXRwdXRJdGVtLCBSdW5Ub29sQXBwcm92YWxJdGVtLCBSdW5Ub29sQ2FsbEl0ZW0sIFJ1blRvb2xDYWxsT3V0cHV0SXRlbSwgUnVuUmVhc29uaW5nSXRlbSwgUnVuSGFuZG9mZkNhbGxJdGVtLCBSdW5IYW5kb2ZmT3V0cHV0SXRlbSwgfSBmcm9tIFwiLi9pdGVtcy5tanNcIjtcbmltcG9ydCB7IFJ1bkNvbnRleHQgfSBmcm9tIFwiLi9ydW5Db250ZXh0Lm1qc1wiO1xuaW1wb3J0IHsgQWdlbnRUb29sVXNlVHJhY2tlciwgbmV4dFN0ZXBTY2hlbWEsIH0gZnJvbSBcIi4vcnVuSW1wbGVtZW50YXRpb24ubWpzXCI7XG5pbXBvcnQgeyBTeXN0ZW1FcnJvciwgVXNlckVycm9yIH0gZnJvbSBcIi4vZXJyb3JzLm1qc1wiO1xuaW1wb3J0IHsgZ2V0R2xvYmFsVHJhY2VQcm92aWRlciB9IGZyb20gXCIuL3RyYWNpbmcvcHJvdmlkZXIubWpzXCI7XG5pbXBvcnQgeyBVc2FnZSB9IGZyb20gXCIuL3VzYWdlLm1qc1wiO1xuaW1wb3J0IHsgZ2V0Q3VycmVudFRyYWNlIH0gZnJvbSBcIi4vdHJhY2luZy9pbmRleC5tanNcIjtcbmltcG9ydCBsb2dnZXIgZnJvbSBcIi4vbG9nZ2VyLm1qc1wiO1xuaW1wb3J0IHsgaGFuZG9mZiB9IGZyb20gXCIuL2hhbmRvZmYubWpzXCI7XG5pbXBvcnQgKiBhcyBwcm90b2NvbCBmcm9tIFwiLi90eXBlcy9wcm90b2NvbC5tanNcIjtcbmltcG9ydCB7IHNhZmVFeGVjdXRlIH0gZnJvbSBcIi4vdXRpbHMvc2FmZUV4ZWN1dGUubWpzXCI7XG4vKipcbiAqIFRoZSBzY2hlbWEgdmVyc2lvbiBvZiB0aGUgc2VyaWFsaXplZCBydW4gc3RhdGUuIFRoaXMgaXMgdXNlZCB0byBlbnN1cmUgdGhhdCB0aGUgc2VyaWFsaXplZFxuICogcnVuIHN0YXRlIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBTREsuXG4gKiBJZiBhbnl0aGluZyBpbiB0aGlzIHNjaGVtYSBjaGFuZ2VzLCB0aGUgdmVyc2lvbiB3aWxsIGhhdmUgdG8gYmUgaW5jcmVtZW50ZWQuXG4gKi9cbmNvbnN0IENVUlJFTlRfU0NIRU1BX1ZFUlNJT04gPSAnMS4wJztcbmNvbnN0ICRzY2hlbWFWZXJzaW9uID0gei5saXRlcmFsKENVUlJFTlRfU0NIRU1BX1ZFUlNJT04pO1xuY29uc3Qgc2VyaWFsaXplZEFnZW50U2NoZW1hID0gei5vYmplY3Qoe1xuICAgIG5hbWU6IHouc3RyaW5nKCksXG59KTtcbmNvbnN0IHNlcmlhbGl6ZWRTcGFuQmFzZSA9IHoub2JqZWN0KHtcbiAgICBvYmplY3Q6IHoubGl0ZXJhbCgndHJhY2Uuc3BhbicpLFxuICAgIGlkOiB6LnN0cmluZygpLFxuICAgIHRyYWNlX2lkOiB6LnN0cmluZygpLFxuICAgIHBhcmVudF9pZDogei5zdHJpbmcoKS5udWxsYWJsZSgpLFxuICAgIHN0YXJ0ZWRfYXQ6IHouc3RyaW5nKCkubnVsbGFibGUoKSxcbiAgICBlbmRlZF9hdDogei5zdHJpbmcoKS5udWxsYWJsZSgpLFxuICAgIGVycm9yOiB6XG4gICAgICAgIC5vYmplY3Qoe1xuICAgICAgICBtZXNzYWdlOiB6LnN0cmluZygpLFxuICAgICAgICBkYXRhOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LmFueSgpKS5vcHRpb25hbCgpLFxuICAgIH0pXG4gICAgICAgIC5udWxsYWJsZSgpLFxuICAgIHNwYW5fZGF0YTogei5yZWNvcmQoei5zdHJpbmcoKSwgei5hbnkoKSksXG59KTtcbmNvbnN0IFNlcmlhbGl6ZWRTcGFuID0gc2VyaWFsaXplZFNwYW5CYXNlLmV4dGVuZCh7XG4gICAgcHJldmlvdXNfc3Bhbjogei5sYXp5KCgpID0+IFNlcmlhbGl6ZWRTcGFuKS5vcHRpb25hbCgpLFxufSk7XG5jb25zdCB1c2FnZVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgICByZXF1ZXN0czogei5udW1iZXIoKSxcbiAgICBpbnB1dFRva2Vuczogei5udW1iZXIoKSxcbiAgICBvdXRwdXRUb2tlbnM6IHoubnVtYmVyKCksXG4gICAgdG90YWxUb2tlbnM6IHoubnVtYmVyKCksXG59KTtcbmNvbnN0IG1vZGVsUmVzcG9uc2VTY2hlbWEgPSB6Lm9iamVjdCh7XG4gICAgdXNhZ2U6IHVzYWdlU2NoZW1hLFxuICAgIG91dHB1dDogei5hcnJheShwcm90b2NvbC5PdXRwdXRNb2RlbEl0ZW0pLFxuICAgIHJlc3BvbnNlSWQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbn0pO1xuY29uc3QgaXRlbVNjaGVtYSA9IHouZGlzY3JpbWluYXRlZFVuaW9uKCd0eXBlJywgW1xuICAgIHoub2JqZWN0KHtcbiAgICAgICAgdHlwZTogei5saXRlcmFsKCdtZXNzYWdlX291dHB1dF9pdGVtJyksXG4gICAgICAgIHJhd0l0ZW06IHByb3RvY29sLkFzc2lzdGFudE1lc3NhZ2VJdGVtLFxuICAgICAgICBhZ2VudDogc2VyaWFsaXplZEFnZW50U2NoZW1hLFxuICAgIH0pLFxuICAgIHoub2JqZWN0KHtcbiAgICAgICAgdHlwZTogei5saXRlcmFsKCd0b29sX2NhbGxfaXRlbScpLFxuICAgICAgICByYXdJdGVtOiBwcm90b2NvbC5Ub29sQ2FsbEl0ZW0ub3IocHJvdG9jb2wuSG9zdGVkVG9vbENhbGxJdGVtKSxcbiAgICAgICAgYWdlbnQ6IHNlcmlhbGl6ZWRBZ2VudFNjaGVtYSxcbiAgICB9KSxcbiAgICB6Lm9iamVjdCh7XG4gICAgICAgIHR5cGU6IHoubGl0ZXJhbCgndG9vbF9jYWxsX291dHB1dF9pdGVtJyksXG4gICAgICAgIHJhd0l0ZW06IHByb3RvY29sLkZ1bmN0aW9uQ2FsbFJlc3VsdEl0ZW0sXG4gICAgICAgIGFnZW50OiBzZXJpYWxpemVkQWdlbnRTY2hlbWEsXG4gICAgICAgIG91dHB1dDogei5zdHJpbmcoKSxcbiAgICB9KSxcbiAgICB6Lm9iamVjdCh7XG4gICAgICAgIHR5cGU6IHoubGl0ZXJhbCgncmVhc29uaW5nX2l0ZW0nKSxcbiAgICAgICAgcmF3SXRlbTogcHJvdG9jb2wuUmVhc29uaW5nSXRlbSxcbiAgICAgICAgYWdlbnQ6IHNlcmlhbGl6ZWRBZ2VudFNjaGVtYSxcbiAgICB9KSxcbiAgICB6Lm9iamVjdCh7XG4gICAgICAgIHR5cGU6IHoubGl0ZXJhbCgnaGFuZG9mZl9jYWxsX2l0ZW0nKSxcbiAgICAgICAgcmF3SXRlbTogcHJvdG9jb2wuRnVuY3Rpb25DYWxsSXRlbSxcbiAgICAgICAgYWdlbnQ6IHNlcmlhbGl6ZWRBZ2VudFNjaGVtYSxcbiAgICB9KSxcbiAgICB6Lm9iamVjdCh7XG4gICAgICAgIHR5cGU6IHoubGl0ZXJhbCgnaGFuZG9mZl9vdXRwdXRfaXRlbScpLFxuICAgICAgICByYXdJdGVtOiBwcm90b2NvbC5GdW5jdGlvbkNhbGxSZXN1bHRJdGVtLFxuICAgICAgICBzb3VyY2VBZ2VudDogc2VyaWFsaXplZEFnZW50U2NoZW1hLFxuICAgICAgICB0YXJnZXRBZ2VudDogc2VyaWFsaXplZEFnZW50U2NoZW1hLFxuICAgIH0pLFxuICAgIHoub2JqZWN0KHtcbiAgICAgICAgdHlwZTogei5saXRlcmFsKCd0b29sX2FwcHJvdmFsX2l0ZW0nKSxcbiAgICAgICAgcmF3SXRlbTogcHJvdG9jb2wuRnVuY3Rpb25DYWxsSXRlbSxcbiAgICAgICAgYWdlbnQ6IHNlcmlhbGl6ZWRBZ2VudFNjaGVtYSxcbiAgICB9KSxcbl0pO1xuY29uc3Qgc2VyaWFsaXplZFRyYWNlU2NoZW1hID0gei5vYmplY3Qoe1xuICAgIG9iamVjdDogei5saXRlcmFsKCd0cmFjZScpLFxuICAgIGlkOiB6LnN0cmluZygpLFxuICAgIHdvcmtmbG93X25hbWU6IHouc3RyaW5nKCksXG4gICAgZ3JvdXBfaWQ6IHouc3RyaW5nKCkubnVsbGFibGUoKSxcbiAgICBtZXRhZGF0YTogei5yZWNvcmQoei5zdHJpbmcoKSwgei5hbnkoKSksXG59KTtcbmNvbnN0IHNlcmlhbGl6ZWRQcm9jZXNzZWRSZXNwb25zZVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgICBuZXdJdGVtczogei5hcnJheShpdGVtU2NoZW1hKSxcbiAgICB0b29sc1VzZWQ6IHouYXJyYXkoei5zdHJpbmcoKSksXG4gICAgaGFuZG9mZnM6IHouYXJyYXkoei5vYmplY3Qoe1xuICAgICAgICB0b29sQ2FsbDogei5hbnkoKSxcbiAgICAgICAgaGFuZG9mZjogei5hbnkoKSxcbiAgICB9KSksXG4gICAgZnVuY3Rpb25zOiB6LmFycmF5KHoub2JqZWN0KHtcbiAgICAgICAgdG9vbENhbGw6IHouYW55KCksXG4gICAgICAgIHRvb2w6IHouYW55KCksXG4gICAgfSkpLFxuICAgIGNvbXB1dGVyQWN0aW9uczogei5hcnJheSh6Lm9iamVjdCh7XG4gICAgICAgIHRvb2xDYWxsOiB6LmFueSgpLFxuICAgICAgICBjb21wdXRlcjogei5hbnkoKSxcbiAgICB9KSksXG59KTtcbmNvbnN0IGd1YXJkcmFpbEZ1bmN0aW9uT3V0cHV0U2NoZW1hID0gei5vYmplY3Qoe1xuICAgIHRyaXB3aXJlVHJpZ2dlcmVkOiB6LmJvb2xlYW4oKSxcbiAgICBvdXRwdXRJbmZvOiB6LmFueSgpLFxufSk7XG5jb25zdCBpbnB1dEd1YXJkcmFpbFJlc3VsdFNjaGVtYSA9IHoub2JqZWN0KHtcbiAgICBndWFyZHJhaWw6IHoub2JqZWN0KHtcbiAgICAgICAgdHlwZTogei5saXRlcmFsKCdpbnB1dCcpLFxuICAgICAgICBuYW1lOiB6LnN0cmluZygpLFxuICAgIH0pLFxuICAgIG91dHB1dDogZ3VhcmRyYWlsRnVuY3Rpb25PdXRwdXRTY2hlbWEsXG59KTtcbmNvbnN0IG91dHB1dEd1YXJkcmFpbFJlc3VsdFNjaGVtYSA9IHoub2JqZWN0KHtcbiAgICBndWFyZHJhaWw6IHoub2JqZWN0KHtcbiAgICAgICAgdHlwZTogei5saXRlcmFsKCdvdXRwdXQnKSxcbiAgICAgICAgbmFtZTogei5zdHJpbmcoKSxcbiAgICB9KSxcbiAgICBhZ2VudE91dHB1dDogei5hbnkoKSxcbiAgICBhZ2VudDogc2VyaWFsaXplZEFnZW50U2NoZW1hLFxuICAgIG91dHB1dDogZ3VhcmRyYWlsRnVuY3Rpb25PdXRwdXRTY2hlbWEsXG59KTtcbmV4cG9ydCBjb25zdCBTZXJpYWxpemVkUnVuU3RhdGUgPSB6Lm9iamVjdCh7XG4gICAgJHNjaGVtYVZlcnNpb24sXG4gICAgY3VycmVudFR1cm46IHoubnVtYmVyKCksXG4gICAgY3VycmVudEFnZW50OiBzZXJpYWxpemVkQWdlbnRTY2hlbWEsXG4gICAgb3JpZ2luYWxJbnB1dDogei5zdHJpbmcoKS5vcih6LmFycmF5KHByb3RvY29sLk1vZGVsSXRlbSkpLFxuICAgIG1vZGVsUmVzcG9uc2VzOiB6LmFycmF5KG1vZGVsUmVzcG9uc2VTY2hlbWEpLFxuICAgIGNvbnRleHQ6IHoub2JqZWN0KHtcbiAgICAgICAgdXNhZ2U6IHVzYWdlU2NoZW1hLFxuICAgICAgICBhcHByb3ZhbHM6IHoucmVjb3JkKHouc3RyaW5nKCksIHoub2JqZWN0KHtcbiAgICAgICAgICAgIGFwcHJvdmVkOiB6LmFycmF5KHouc3RyaW5nKCkpLm9yKHouYm9vbGVhbigpKSxcbiAgICAgICAgICAgIHJlamVjdGVkOiB6LmFycmF5KHouc3RyaW5nKCkpLm9yKHouYm9vbGVhbigpKSxcbiAgICAgICAgfSkpLFxuICAgICAgICBjb250ZXh0OiB6LnJlY29yZCh6LnN0cmluZygpLCB6LmFueSgpKSxcbiAgICB9KSxcbiAgICB0b29sVXNlVHJhY2tlcjogei5yZWNvcmQoei5zdHJpbmcoKSwgei5hcnJheSh6LnN0cmluZygpKSksXG4gICAgbWF4VHVybnM6IHoubnVtYmVyKCksXG4gICAgY3VycmVudEFnZW50U3BhbjogU2VyaWFsaXplZFNwYW4ubnVsbGFibGUoKS5vcHRpb25hbCgpLFxuICAgIG5vQWN0aXZlQWdlbnRSdW46IHouYm9vbGVhbigpLFxuICAgIGlucHV0R3VhcmRyYWlsUmVzdWx0czogei5hcnJheShpbnB1dEd1YXJkcmFpbFJlc3VsdFNjaGVtYSksXG4gICAgb3V0cHV0R3VhcmRyYWlsUmVzdWx0czogei5hcnJheShvdXRwdXRHdWFyZHJhaWxSZXN1bHRTY2hlbWEpLFxuICAgIGN1cnJlbnRTdGVwOiBuZXh0U3RlcFNjaGVtYS5vcHRpb25hbCgpLFxuICAgIGxhc3RNb2RlbFJlc3BvbnNlOiBtb2RlbFJlc3BvbnNlU2NoZW1hLm9wdGlvbmFsKCksXG4gICAgZ2VuZXJhdGVkSXRlbXM6IHouYXJyYXkoaXRlbVNjaGVtYSksXG4gICAgbGFzdFByb2Nlc3NlZFJlc3BvbnNlOiBzZXJpYWxpemVkUHJvY2Vzc2VkUmVzcG9uc2VTY2hlbWEub3B0aW9uYWwoKSxcbiAgICB0cmFjZTogc2VyaWFsaXplZFRyYWNlU2NoZW1hLm51bGxhYmxlKCksXG59KTtcbi8qKlxuICogU2VyaWFsaXphYmxlIHNuYXBzaG90IG9mIGFuIGFnZW50J3MgcnVuLCBpbmNsdWRpbmcgY29udGV4dCwgdXNhZ2UgYW5kIHRyYWNlLlxuICogV2hpbGUgdGhpcyBjbGFzcyBoYXMgcHVibGljbHkgd3JpdGFibGUgcHJvcGVydGllcyAocHJlZml4ZWQgd2l0aCBgX2ApLCB0aGV5IGFyZSBub3QgbWVhbnQgdG8gYmVcbiAqIHVzZWQgZGlyZWN0bHkuIFRvIHJlYWQgdGhlc2UgcHJvcGVydGllcywgdXNlIHRoZSBgUnVuUmVzdWx0YCBpbnN0ZWFkLlxuICpcbiAqIE1hbmlwdWxhdGlvbiBvZiB0aGUgc3RhdGUgZGlyZWN0bHkgY2FuIGxlYWQgdG8gdW5leHBlY3RlZCBiZWhhdmlvciBhbmQgc2hvdWxkIGJlIGF2b2lkZWQuXG4gKiBJbnN0ZWFkLCB1c2UgdGhlIGBhcHByb3ZlYCBhbmQgYHJlamVjdGAgbWV0aG9kcyB0byBpbnRlcmFjdCB3aXRoIHRoZSBzdGF0ZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFJ1blN0YXRlIHtcbiAgICAvKipcbiAgICAgKiBDdXJyZW50IHR1cm4gbnVtYmVyIGluIHRoZSBjb252ZXJzYXRpb24uXG4gICAgICovXG4gICAgX2N1cnJlbnRUdXJuID0gMDtcbiAgICAvKipcbiAgICAgKiBUaGUgYWdlbnQgY3VycmVudGx5IGhhbmRsaW5nIHRoZSBjb252ZXJzYXRpb24uXG4gICAgICovXG4gICAgX2N1cnJlbnRBZ2VudDtcbiAgICAvKipcbiAgICAgKiBPcmlnaW5hbCB1c2VyIGlucHV0IHByaW9yIHRvIGFueSBwcm9jZXNzaW5nLlxuICAgICAqL1xuICAgIF9vcmlnaW5hbElucHV0O1xuICAgIC8qKlxuICAgICAqIFJlc3BvbnNlcyBmcm9tIHRoZSBtb2RlbCBzbyBmYXIuXG4gICAgICovXG4gICAgX21vZGVsUmVzcG9uc2VzO1xuICAgIC8qKlxuICAgICAqIEFjdGl2ZSB0cmFjaW5nIHNwYW4gZm9yIHRoZSBjdXJyZW50IGFnZW50IGlmIHRyYWNpbmcgaXMgZW5hYmxlZC5cbiAgICAgKi9cbiAgICBfY3VycmVudEFnZW50U3BhbjtcbiAgICAvKipcbiAgICAgKiBSdW4gY29udGV4dCB0cmFja2luZyBhcHByb3ZhbHMsIHVzYWdlLCBhbmQgb3RoZXIgbWV0YWRhdGEuXG4gICAgICovXG4gICAgX2NvbnRleHQ7XG4gICAgLyoqXG4gICAgICogVHJhY2tzIHdoYXQgdG9vbHMgZWFjaCBhZ2VudCBoYXMgdXNlZC5cbiAgICAgKi9cbiAgICBfdG9vbFVzZVRyYWNrZXI7XG4gICAgLyoqXG4gICAgICogSXRlbXMgZ2VuZXJhdGVkIGJ5IHRoZSBhZ2VudCBkdXJpbmcgdGhlIHJ1bi5cbiAgICAgKi9cbiAgICBfZ2VuZXJhdGVkSXRlbXM7XG4gICAgLyoqXG4gICAgICogTWF4aW11bSBhbGxvd2VkIHR1cm5zIGJlZm9yZSBmb3JjaW5nIHRlcm1pbmF0aW9uLlxuICAgICAqL1xuICAgIF9tYXhUdXJucztcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRoZSBydW4gaGFzIGFuIGFjdGl2ZSBhZ2VudCBzdGVwIGluIHByb2dyZXNzLlxuICAgICAqL1xuICAgIF9ub0FjdGl2ZUFnZW50UnVuID0gdHJ1ZTtcbiAgICAvKipcbiAgICAgKiBMYXN0IG1vZGVsIHJlc3BvbnNlIGZvciB0aGUgcHJldmlvdXMgdHVybi5cbiAgICAgKi9cbiAgICBfbGFzdFR1cm5SZXNwb25zZTtcbiAgICAvKipcbiAgICAgKiBSZXN1bHRzIGZyb20gaW5wdXQgZ3VhcmRyYWlscyBhcHBsaWVkIHRvIHRoZSBydW4uXG4gICAgICovXG4gICAgX2lucHV0R3VhcmRyYWlsUmVzdWx0cztcbiAgICAvKipcbiAgICAgKiBSZXN1bHRzIGZyb20gb3V0cHV0IGd1YXJkcmFpbHMgYXBwbGllZCB0byB0aGUgcnVuLlxuICAgICAqL1xuICAgIF9vdXRwdXRHdWFyZHJhaWxSZXN1bHRzO1xuICAgIC8qKlxuICAgICAqIE5leHQgc3RlcCBjb21wdXRlZCBmb3IgdGhlIGFnZW50IHRvIHRha2UuXG4gICAgICovXG4gICAgX2N1cnJlbnRTdGVwID0gdW5kZWZpbmVkO1xuICAgIC8qKlxuICAgICAqIFBhcnNlZCBtb2RlbCByZXNwb25zZSBhZnRlciBhcHBseWluZyBndWFyZHJhaWxzIGFuZCB0b29scy5cbiAgICAgKi9cbiAgICBfbGFzdFByb2Nlc3NlZFJlc3BvbnNlID0gdW5kZWZpbmVkO1xuICAgIC8qKlxuICAgICAqIFRyYWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJ1biBpZiB0cmFjaW5nIGlzIGVuYWJsZWQuXG4gICAgICovXG4gICAgX3RyYWNlID0gbnVsbDtcbiAgICBjb25zdHJ1Y3Rvcihjb250ZXh0LCBvcmlnaW5hbElucHV0LCBzdGFydGluZ0FnZW50LCBtYXhUdXJucykge1xuICAgICAgICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgdGhpcy5fb3JpZ2luYWxJbnB1dCA9IHN0cnVjdHVyZWRDbG9uZShvcmlnaW5hbElucHV0KTtcbiAgICAgICAgdGhpcy5fbW9kZWxSZXNwb25zZXMgPSBbXTtcbiAgICAgICAgdGhpcy5fY3VycmVudEFnZW50U3BhbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fY3VycmVudEFnZW50ID0gc3RhcnRpbmdBZ2VudDtcbiAgICAgICAgdGhpcy5fdG9vbFVzZVRyYWNrZXIgPSBuZXcgQWdlbnRUb29sVXNlVHJhY2tlcigpO1xuICAgICAgICB0aGlzLl9nZW5lcmF0ZWRJdGVtcyA9IFtdO1xuICAgICAgICB0aGlzLl9tYXhUdXJucyA9IG1heFR1cm5zO1xuICAgICAgICB0aGlzLl9pbnB1dEd1YXJkcmFpbFJlc3VsdHMgPSBbXTtcbiAgICAgICAgdGhpcy5fb3V0cHV0R3VhcmRyYWlsUmVzdWx0cyA9IFtdO1xuICAgICAgICB0aGlzLl90cmFjZSA9IGdldEN1cnJlbnRUcmFjZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBcHByb3ZlcyBhIHRvb2wgY2FsbCByZXF1ZXN0ZWQgYnkgdGhlIGFnZW50IHRocm91Z2ggYW4gaW50ZXJydXB0aW9uIGFuZCBhcHByb3ZhbCBpdGVtIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBUbyBhcHByb3ZlIHRoZSByZXF1ZXN0IHVzZSB0aGlzIG1ldGhvZCBhbmQgdGhlbiBydW4gdGhlIGFnZW50IGFnYWluIHdpdGggdGhlIHNhbWUgc3RhdGUgb2JqZWN0XG4gICAgICogdG8gY29udGludWUgdGhlIGV4ZWN1dGlvbi5cbiAgICAgKlxuICAgICAqIEJ5IGRlZmF1bHQgaXQgd2lsbCBvbmx5IGFwcHJvdmUgdGhlIGN1cnJlbnQgdG9vbCBjYWxsLiBUbyBhbGxvdyB0aGUgdG9vbCB0byBiZSB1c2VkIG11bHRpcGxlXG4gICAgICogdGltZXMgdGhyb3VnaG91dCB0aGUgcnVuLCBzZXQgdGhlIGBhbHdheXNBcHByb3ZlYCBvcHRpb24gdG8gYHRydWVgLlxuICAgICAqXG4gICAgICogQHBhcmFtIGFwcHJvdmFsSXRlbSAtIFRoZSB0b29sIGNhbGwgYXBwcm92YWwgaXRlbSB0byBhcHByb3ZlLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyBmb3IgdGhlIGFwcHJvdmFsLlxuICAgICAqL1xuICAgIGFwcHJvdmUoYXBwcm92YWxJdGVtLCBvcHRpb25zID0geyBhbHdheXNBcHByb3ZlOiBmYWxzZSB9KSB7XG4gICAgICAgIHRoaXMuX2NvbnRleHQuYXBwcm92ZVRvb2woYXBwcm92YWxJdGVtLCBvcHRpb25zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVqZWN0cyBhIHRvb2wgY2FsbCByZXF1ZXN0ZWQgYnkgdGhlIGFnZW50IHRocm91Z2ggYW4gaW50ZXJydXB0aW9uIGFuZCBhcHByb3ZhbCBpdGVtIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBUbyByZWplY3QgdGhlIHJlcXVlc3QgdXNlIHRoaXMgbWV0aG9kIGFuZCB0aGVuIHJ1biB0aGUgYWdlbnQgYWdhaW4gd2l0aCB0aGUgc2FtZSBzdGF0ZSBvYmplY3RcbiAgICAgKiB0byBjb250aW51ZSB0aGUgZXhlY3V0aW9uLlxuICAgICAqXG4gICAgICogQnkgZGVmYXVsdCBpdCB3aWxsIG9ubHkgcmVqZWN0IHRoZSBjdXJyZW50IHRvb2wgY2FsbC4gVG8gYWxsb3cgdGhlIHRvb2wgdG8gYmUgdXNlZCBtdWx0aXBsZVxuICAgICAqIHRpbWVzIHRocm91Z2hvdXQgdGhlIHJ1biwgc2V0IHRoZSBgYWx3YXlzUmVqZWN0YCBvcHRpb24gdG8gYHRydWVgLlxuICAgICAqXG4gICAgICogQHBhcmFtIGFwcHJvdmFsSXRlbSAtIFRoZSB0b29sIGNhbGwgYXBwcm92YWwgaXRlbSB0byByZWplY3QuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIGZvciB0aGUgcmVqZWN0aW9uLlxuICAgICAqL1xuICAgIHJlamVjdChhcHByb3ZhbEl0ZW0sIG9wdGlvbnMgPSB7IGFsd2F5c1JlamVjdDogZmFsc2UgfSkge1xuICAgICAgICB0aGlzLl9jb250ZXh0LnJlamVjdFRvb2woYXBwcm92YWxJdGVtLCBvcHRpb25zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VyaWFsaXplcyB0aGUgcnVuIHN0YXRlIHRvIGEgSlNPTiBvYmplY3QuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIHNlcmlhbGl6ZSB0aGUgcnVuIHN0YXRlIHRvIGEgSlNPTiBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCB0b1xuICAgICAqIHJlc3VtZSB0aGUgcnVuIGxhdGVyLlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIHNlcmlhbGl6ZWQgcnVuIHN0YXRlLlxuICAgICAqL1xuICAgIHRvSlNPTigpIHtcbiAgICAgICAgY29uc3Qgb3V0cHV0ID0ge1xuICAgICAgICAgICAgJHNjaGVtYVZlcnNpb246ICcxLjAnLFxuICAgICAgICAgICAgY3VycmVudFR1cm46IHRoaXMuX2N1cnJlbnRUdXJuLFxuICAgICAgICAgICAgY3VycmVudEFnZW50OiB7XG4gICAgICAgICAgICAgICAgbmFtZTogdGhpcy5fY3VycmVudEFnZW50Lm5hbWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb3JpZ2luYWxJbnB1dDogdGhpcy5fb3JpZ2luYWxJbnB1dCxcbiAgICAgICAgICAgIG1vZGVsUmVzcG9uc2VzOiB0aGlzLl9tb2RlbFJlc3BvbnNlcy5tYXAoKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdXNhZ2U6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RzOiByZXNwb25zZS51c2FnZS5yZXF1ZXN0cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0VG9rZW5zOiByZXNwb25zZS51c2FnZS5pbnB1dFRva2VucyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFRva2VuczogcmVzcG9uc2UudXNhZ2Uub3V0cHV0VG9rZW5zLFxuICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxUb2tlbnM6IHJlc3BvbnNlLnVzYWdlLnRvdGFsVG9rZW5zLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBvdXRwdXQ6IHJlc3BvbnNlLm91dHB1dCxcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VJZDogcmVzcG9uc2UucmVzcG9uc2VJZCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBjb250ZXh0OiB0aGlzLl9jb250ZXh0LnRvSlNPTigpLFxuICAgICAgICAgICAgdG9vbFVzZVRyYWNrZXI6IHRoaXMuX3Rvb2xVc2VUcmFja2VyLnRvSlNPTigpLFxuICAgICAgICAgICAgbWF4VHVybnM6IHRoaXMuX21heFR1cm5zLFxuICAgICAgICAgICAgY3VycmVudEFnZW50U3BhbjogdGhpcy5fY3VycmVudEFnZW50U3Bhbj8udG9KU09OKCksXG4gICAgICAgICAgICBub0FjdGl2ZUFnZW50UnVuOiB0aGlzLl9ub0FjdGl2ZUFnZW50UnVuLFxuICAgICAgICAgICAgaW5wdXRHdWFyZHJhaWxSZXN1bHRzOiB0aGlzLl9pbnB1dEd1YXJkcmFpbFJlc3VsdHMsXG4gICAgICAgICAgICBvdXRwdXRHdWFyZHJhaWxSZXN1bHRzOiB0aGlzLl9vdXRwdXRHdWFyZHJhaWxSZXN1bHRzLm1hcCgocikgPT4gKHtcbiAgICAgICAgICAgICAgICAuLi5yLFxuICAgICAgICAgICAgICAgIGFnZW50OiByLmFnZW50LnRvSlNPTigpLFxuICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgY3VycmVudFN0ZXA6IHRoaXMuX2N1cnJlbnRTdGVwLFxuICAgICAgICAgICAgbGFzdE1vZGVsUmVzcG9uc2U6IHRoaXMuX2xhc3RUdXJuUmVzcG9uc2UsXG4gICAgICAgICAgICBnZW5lcmF0ZWRJdGVtczogdGhpcy5fZ2VuZXJhdGVkSXRlbXMubWFwKChpdGVtKSA9PiBpdGVtLnRvSlNPTigpKSxcbiAgICAgICAgICAgIGxhc3RQcm9jZXNzZWRSZXNwb25zZTogdGhpcy5fbGFzdFByb2Nlc3NlZFJlc3BvbnNlLFxuICAgICAgICAgICAgdHJhY2U6IHRoaXMuX3RyYWNlID8gdGhpcy5fdHJhY2UudG9KU09OKCkgOiBudWxsLFxuICAgICAgICB9O1xuICAgICAgICAvLyBwYXJzaW5nIHRoZSBzY2hlbWEgdG8gZW5zdXJlIHRoZSBvdXRwdXQgaXMgdmFsaWQgZm9yIHJlcGFyc2luZ1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBTZXJpYWxpemVkUnVuU3RhdGUuc2FmZVBhcnNlKG91dHB1dCk7XG4gICAgICAgIGlmICghcGFyc2VkLnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBTeXN0ZW1FcnJvcihgRmFpbGVkIHRvIHNlcmlhbGl6ZSBydW4gc3RhdGUuICR7cGFyc2VkLmVycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcnNlZC5kYXRhO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXJpYWxpemVzIHRoZSBydW4gc3RhdGUgdG8gYSBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIHNlcmlhbGl6ZSB0aGUgcnVuIHN0YXRlIHRvIGEgc3RyaW5nIHRoYXQgY2FuIGJlIHVzZWQgdG9cbiAgICAgKiByZXN1bWUgdGhlIHJ1biBsYXRlci5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSBzZXJpYWxpemVkIHJ1biBzdGF0ZS5cbiAgICAgKi9cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMudG9KU09OKCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZXNlcmlhbGl6ZXMgYSBydW4gc3RhdGUgZnJvbSBhIHN0cmluZy5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gZGVzZXJpYWxpemUgYSBydW4gc3RhdGUgZnJvbSBhIHN0cmluZyB0aGF0IHdhcyBzZXJpYWxpemVkIHVzaW5nIHRoZVxuICAgICAqIGB0b1N0cmluZ2AgbWV0aG9kLlxuICAgICAqL1xuICAgIHN0YXRpYyBhc3luYyBmcm9tU3RyaW5nKGluaXRpYWxBZ2VudCwgc3RyKSB7XG4gICAgICAgIGNvbnN0IFtwYXJzaW5nRXJyb3IsIGpzb25SZXN1bHRdID0gYXdhaXQgc2FmZUV4ZWN1dGUoKCkgPT4gSlNPTi5wYXJzZShzdHIpKTtcbiAgICAgICAgaWYgKHBhcnNpbmdFcnJvcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJFcnJvcihgRmFpbGVkIHRvIHBhcnNlIHJ1biBzdGF0ZS4gJHtwYXJzaW5nRXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IHBhcnNpbmdFcnJvci5tZXNzYWdlIDogU3RyaW5nKHBhcnNpbmdFcnJvcil9YCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY3VycmVudFNjaGVtYVZlcnNpb24gPSBqc29uUmVzdWx0LiRzY2hlbWFWZXJzaW9uO1xuICAgICAgICBpZiAoIWN1cnJlbnRTY2hlbWFWZXJzaW9uKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVXNlckVycm9yKCdSdW4gc3RhdGUgaXMgbWlzc2luZyBzY2hlbWEgdmVyc2lvbicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjdXJyZW50U2NoZW1hVmVyc2lvbiAhPT0gQ1VSUkVOVF9TQ0hFTUFfVkVSU0lPTikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJFcnJvcihgUnVuIHN0YXRlIHNjaGVtYSB2ZXJzaW9uICR7Y3VycmVudFNjaGVtYVZlcnNpb259IGlzIG5vdCBzdXBwb3J0ZWQuIFBsZWFzZSB1c2UgdmVyc2lvbiAke0NVUlJFTlRfU0NIRU1BX1ZFUlNJT059YCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3RhdGVKc29uID0gU2VyaWFsaXplZFJ1blN0YXRlLnBhcnNlKEpTT04ucGFyc2Uoc3RyKSk7XG4gICAgICAgIGNvbnN0IGFnZW50TWFwID0gYnVpbGRBZ2VudE1hcChpbml0aWFsQWdlbnQpO1xuICAgICAgICAvL1xuICAgICAgICAvLyBSZWJ1aWxkIHRoZSBjb250ZXh0XG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSBuZXcgUnVuQ29udGV4dChzdGF0ZUpzb24uY29udGV4dC5jb250ZXh0KTtcbiAgICAgICAgY29udGV4dC5fcmVidWlsZEFwcHJvdmFscyhzdGF0ZUpzb24uY29udGV4dC5hcHByb3ZhbHMpO1xuICAgICAgICAvL1xuICAgICAgICAvLyBGaW5kIHRoZSBjdXJyZW50IGFnZW50IGZyb20gdGhlIGluaXRpYWwgYWdlbnRcbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgY3VycmVudEFnZW50ID0gYWdlbnRNYXAuZ2V0KHN0YXRlSnNvbi5jdXJyZW50QWdlbnQubmFtZSk7XG4gICAgICAgIGlmICghY3VycmVudEFnZW50KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVXNlckVycm9yKGBBZ2VudCAke3N0YXRlSnNvbi5jdXJyZW50QWdlbnQubmFtZX0gbm90IGZvdW5kYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3RhdGUgPSBuZXcgUnVuU3RhdGUoY29udGV4dCwgJycsIGN1cnJlbnRBZ2VudCwgc3RhdGVKc29uLm1heFR1cm5zKTtcbiAgICAgICAgc3RhdGUuX2N1cnJlbnRUdXJuID0gc3RhdGVKc29uLmN1cnJlbnRUdXJuO1xuICAgICAgICAvLyByZWJ1aWxkIHRvb2wgdXNlIHRyYWNrZXJcbiAgICAgICAgc3RhdGUuX3Rvb2xVc2VUcmFja2VyID0gbmV3IEFnZW50VG9vbFVzZVRyYWNrZXIoKTtcbiAgICAgICAgZm9yIChjb25zdCBbYWdlbnROYW1lLCB0b29sTmFtZXNdIG9mIE9iamVjdC5lbnRyaWVzKHN0YXRlSnNvbi50b29sVXNlVHJhY2tlcikpIHtcbiAgICAgICAgICAgIHN0YXRlLl90b29sVXNlVHJhY2tlci5hZGRUb29sVXNlKGFnZW50TWFwLmdldChhZ2VudE5hbWUpLCB0b29sTmFtZXMpO1xuICAgICAgICB9XG4gICAgICAgIC8vIHJlYnVpbGQgY3VycmVudCBhZ2VudCBzcGFuXG4gICAgICAgIGlmIChzdGF0ZUpzb24uY3VycmVudEFnZW50U3Bhbikge1xuICAgICAgICAgICAgaWYgKCFzdGF0ZUpzb24udHJhY2UpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIud2FybignVHJhY2UgaXMgbm90IHNldCwgc2tpcHBpbmcgdHJhY2luZyBzZXR1cCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdHJhY2UgPSBnZXRHbG9iYWxUcmFjZVByb3ZpZGVyKCkuY3JlYXRlVHJhY2Uoe1xuICAgICAgICAgICAgICAgIHRyYWNlSWQ6IHN0YXRlSnNvbi50cmFjZT8uaWQsXG4gICAgICAgICAgICAgICAgbmFtZTogc3RhdGVKc29uLnRyYWNlPy53b3JrZmxvd19uYW1lLFxuICAgICAgICAgICAgICAgIGdyb3VwSWQ6IHN0YXRlSnNvbi50cmFjZT8uZ3JvdXBfaWQgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIG1ldGFkYXRhOiBzdGF0ZUpzb24udHJhY2U/Lm1ldGFkYXRhLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzdGF0ZS5fY3VycmVudEFnZW50U3BhbiA9IGRlc2VyaWFsaXplU3Bhbih0cmFjZSwgc3RhdGVKc29uLmN1cnJlbnRBZ2VudFNwYW4pO1xuICAgICAgICAgICAgc3RhdGUuX3RyYWNlID0gdHJhY2U7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUuX25vQWN0aXZlQWdlbnRSdW4gPSBzdGF0ZUpzb24ubm9BY3RpdmVBZ2VudFJ1bjtcbiAgICAgICAgc3RhdGUuX2lucHV0R3VhcmRyYWlsUmVzdWx0cyA9XG4gICAgICAgICAgICBzdGF0ZUpzb24uaW5wdXRHdWFyZHJhaWxSZXN1bHRzO1xuICAgICAgICBzdGF0ZS5fb3V0cHV0R3VhcmRyYWlsUmVzdWx0cyA9IHN0YXRlSnNvbi5vdXRwdXRHdWFyZHJhaWxSZXN1bHRzLm1hcCgocikgPT4gKHtcbiAgICAgICAgICAgIC4uLnIsXG4gICAgICAgICAgICBhZ2VudDogYWdlbnRNYXAuZ2V0KHIuYWdlbnQubmFtZSksXG4gICAgICAgIH0pKTtcbiAgICAgICAgc3RhdGUuX2N1cnJlbnRTdGVwID0gc3RhdGVKc29uLmN1cnJlbnRTdGVwO1xuICAgICAgICBzdGF0ZS5fb3JpZ2luYWxJbnB1dCA9IHN0YXRlSnNvbi5vcmlnaW5hbElucHV0O1xuICAgICAgICBzdGF0ZS5fbW9kZWxSZXNwb25zZXMgPSBzdGF0ZUpzb24ubW9kZWxSZXNwb25zZXMubWFwKGRlc2VyaWFsaXplTW9kZWxSZXNwb25zZSk7XG4gICAgICAgIHN0YXRlLl9sYXN0VHVyblJlc3BvbnNlID0gc3RhdGVKc29uLmxhc3RNb2RlbFJlc3BvbnNlXG4gICAgICAgICAgICA/IGRlc2VyaWFsaXplTW9kZWxSZXNwb25zZShzdGF0ZUpzb24ubGFzdE1vZGVsUmVzcG9uc2UpXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgc3RhdGUuX2dlbmVyYXRlZEl0ZW1zID0gc3RhdGVKc29uLmdlbmVyYXRlZEl0ZW1zLm1hcCgoaXRlbSkgPT4gZGVzZXJpYWxpemVJdGVtKGl0ZW0sIGFnZW50TWFwKSk7XG4gICAgICAgIHN0YXRlLl9sYXN0UHJvY2Vzc2VkUmVzcG9uc2UgPSBzdGF0ZUpzb24ubGFzdFByb2Nlc3NlZFJlc3BvbnNlXG4gICAgICAgICAgICA/IGF3YWl0IGRlc2VyaWFsaXplUHJvY2Vzc2VkUmVzcG9uc2UoYWdlbnRNYXAsIHN0YXRlLl9jdXJyZW50QWdlbnQsIHN0YXRlSnNvbi5sYXN0UHJvY2Vzc2VkUmVzcG9uc2UpXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHN0YXRlSnNvbi5jdXJyZW50U3RlcD8udHlwZSA9PT0gJ25leHRfc3RlcF9oYW5kb2ZmJykge1xuICAgICAgICAgICAgc3RhdGUuX2N1cnJlbnRTdGVwID0ge1xuICAgICAgICAgICAgICAgIHR5cGU6ICduZXh0X3N0ZXBfaGFuZG9mZicsXG4gICAgICAgICAgICAgICAgbmV3QWdlbnQ6IGFnZW50TWFwLmdldChzdGF0ZUpzb24uY3VycmVudFN0ZXAubmV3QWdlbnQubmFtZSksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRBZ2VudE1hcChpbml0aWFsQWdlbnQpIHtcbiAgICBjb25zdCBtYXAgPSBuZXcgTWFwKCk7XG4gICAgY29uc3QgcXVldWUgPSBbaW5pdGlhbEFnZW50XTtcbiAgICB3aGlsZSAocXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBjdXJyZW50QWdlbnQgPSBxdWV1ZS5zaGlmdCgpO1xuICAgICAgICBpZiAobWFwLmhhcyhjdXJyZW50QWdlbnQubmFtZSkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIG1hcC5zZXQoY3VycmVudEFnZW50Lm5hbWUsIGN1cnJlbnRBZ2VudCk7XG4gICAgICAgIGZvciAoY29uc3QgaGFuZG9mZiBvZiBjdXJyZW50QWdlbnQuaGFuZG9mZnMpIHtcbiAgICAgICAgICAgIGlmIChoYW5kb2ZmIGluc3RhbmNlb2YgQWdlbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoIW1hcC5oYXMoaGFuZG9mZi5uYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICBxdWV1ZS5wdXNoKGhhbmRvZmYpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGhhbmRvZmYuYWdlbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoIW1hcC5oYXMoaGFuZG9mZi5hZ2VudC5uYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICBxdWV1ZS5wdXNoKGhhbmRvZmYuYWdlbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWFwO1xufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlc2VyaWFsaXplU3Bhbih0cmFjZSwgc2VyaWFsaXplZFNwYW4pIHtcbiAgICBjb25zdCBzcGFuRGF0YSA9IHNlcmlhbGl6ZWRTcGFuLnNwYW5fZGF0YTtcbiAgICBjb25zdCBwcmV2aW91c1NwYW4gPSBzZXJpYWxpemVkU3Bhbi5wcmV2aW91c19zcGFuXG4gICAgICAgID8gZGVzZXJpYWxpemVTcGFuKHRyYWNlLCBzZXJpYWxpemVkU3Bhbi5wcmV2aW91c19zcGFuKVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBzcGFuID0gZ2V0R2xvYmFsVHJhY2VQcm92aWRlcigpLmNyZWF0ZVNwYW4oe1xuICAgICAgICBzcGFuSWQ6IHNlcmlhbGl6ZWRTcGFuLmlkLFxuICAgICAgICB0cmFjZUlkOiBzZXJpYWxpemVkU3Bhbi50cmFjZV9pZCxcbiAgICAgICAgcGFyZW50SWQ6IHNlcmlhbGl6ZWRTcGFuLnBhcmVudF9pZCA/PyB1bmRlZmluZWQsXG4gICAgICAgIHN0YXJ0ZWRBdDogc2VyaWFsaXplZFNwYW4uc3RhcnRlZF9hdCA/PyB1bmRlZmluZWQsXG4gICAgICAgIGVuZGVkQXQ6IHNlcmlhbGl6ZWRTcGFuLmVuZGVkX2F0ID8/IHVuZGVmaW5lZCxcbiAgICAgICAgZGF0YTogc3BhbkRhdGEsXG4gICAgfSwgdHJhY2UpO1xuICAgIHNwYW4ucHJldmlvdXNTcGFuID0gcHJldmlvdXNTcGFuO1xuICAgIHJldHVybiBzcGFuO1xufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlc2VyaWFsaXplTW9kZWxSZXNwb25zZShzZXJpYWxpemVkTW9kZWxSZXNwb25zZSkge1xuICAgIGNvbnN0IHVzYWdlID0gbmV3IFVzYWdlKCk7XG4gICAgdXNhZ2UucmVxdWVzdHMgPSBzZXJpYWxpemVkTW9kZWxSZXNwb25zZS51c2FnZS5yZXF1ZXN0cztcbiAgICB1c2FnZS5pbnB1dFRva2VucyA9IHNlcmlhbGl6ZWRNb2RlbFJlc3BvbnNlLnVzYWdlLmlucHV0VG9rZW5zO1xuICAgIHVzYWdlLm91dHB1dFRva2VucyA9IHNlcmlhbGl6ZWRNb2RlbFJlc3BvbnNlLnVzYWdlLm91dHB1dFRva2VucztcbiAgICB1c2FnZS50b3RhbFRva2VucyA9IHNlcmlhbGl6ZWRNb2RlbFJlc3BvbnNlLnVzYWdlLnRvdGFsVG9rZW5zO1xuICAgIHJldHVybiB7XG4gICAgICAgIHVzYWdlLFxuICAgICAgICBvdXRwdXQ6IHNlcmlhbGl6ZWRNb2RlbFJlc3BvbnNlLm91dHB1dC5tYXAoKGl0ZW0pID0+IHByb3RvY29sLk91dHB1dE1vZGVsSXRlbS5wYXJzZShpdGVtKSksXG4gICAgICAgIHJlc3BvbnNlSWQ6IHNlcmlhbGl6ZWRNb2RlbFJlc3BvbnNlLnJlc3BvbnNlSWQsXG4gICAgfTtcbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXNlcmlhbGl6ZUl0ZW0oc2VyaWFsaXplZEl0ZW0sIGFnZW50TWFwKSB7XG4gICAgc3dpdGNoIChzZXJpYWxpemVkSXRlbS50eXBlKSB7XG4gICAgICAgIGNhc2UgJ21lc3NhZ2Vfb3V0cHV0X2l0ZW0nOlxuICAgICAgICAgICAgcmV0dXJuIG5ldyBSdW5NZXNzYWdlT3V0cHV0SXRlbShzZXJpYWxpemVkSXRlbS5yYXdJdGVtLCBhZ2VudE1hcC5nZXQoc2VyaWFsaXplZEl0ZW0uYWdlbnQubmFtZSkpO1xuICAgICAgICBjYXNlICd0b29sX2NhbGxfaXRlbSc6XG4gICAgICAgICAgICByZXR1cm4gbmV3IFJ1blRvb2xDYWxsSXRlbShzZXJpYWxpemVkSXRlbS5yYXdJdGVtLCBhZ2VudE1hcC5nZXQoc2VyaWFsaXplZEl0ZW0uYWdlbnQubmFtZSkpO1xuICAgICAgICBjYXNlICd0b29sX2NhbGxfb3V0cHV0X2l0ZW0nOlxuICAgICAgICAgICAgcmV0dXJuIG5ldyBSdW5Ub29sQ2FsbE91dHB1dEl0ZW0oc2VyaWFsaXplZEl0ZW0ucmF3SXRlbSwgYWdlbnRNYXAuZ2V0KHNlcmlhbGl6ZWRJdGVtLmFnZW50Lm5hbWUpLCBzZXJpYWxpemVkSXRlbS5vdXRwdXQpO1xuICAgICAgICBjYXNlICdyZWFzb25pbmdfaXRlbSc6XG4gICAgICAgICAgICByZXR1cm4gbmV3IFJ1blJlYXNvbmluZ0l0ZW0oc2VyaWFsaXplZEl0ZW0ucmF3SXRlbSwgYWdlbnRNYXAuZ2V0KHNlcmlhbGl6ZWRJdGVtLmFnZW50Lm5hbWUpKTtcbiAgICAgICAgY2FzZSAnaGFuZG9mZl9jYWxsX2l0ZW0nOlxuICAgICAgICAgICAgcmV0dXJuIG5ldyBSdW5IYW5kb2ZmQ2FsbEl0ZW0oc2VyaWFsaXplZEl0ZW0ucmF3SXRlbSwgYWdlbnRNYXAuZ2V0KHNlcmlhbGl6ZWRJdGVtLmFnZW50Lm5hbWUpKTtcbiAgICAgICAgY2FzZSAnaGFuZG9mZl9vdXRwdXRfaXRlbSc6XG4gICAgICAgICAgICByZXR1cm4gbmV3IFJ1bkhhbmRvZmZPdXRwdXRJdGVtKHNlcmlhbGl6ZWRJdGVtLnJhd0l0ZW0sIGFnZW50TWFwLmdldChzZXJpYWxpemVkSXRlbS5zb3VyY2VBZ2VudC5uYW1lKSwgYWdlbnRNYXAuZ2V0KHNlcmlhbGl6ZWRJdGVtLnRhcmdldEFnZW50Lm5hbWUpKTtcbiAgICAgICAgY2FzZSAndG9vbF9hcHByb3ZhbF9pdGVtJzpcbiAgICAgICAgICAgIHJldHVybiBuZXcgUnVuVG9vbEFwcHJvdmFsSXRlbShzZXJpYWxpemVkSXRlbS5yYXdJdGVtLCBhZ2VudE1hcC5nZXQoc2VyaWFsaXplZEl0ZW0uYWdlbnQubmFtZSkpO1xuICAgIH1cbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRlc2VyaWFsaXplUHJvY2Vzc2VkUmVzcG9uc2UoYWdlbnRNYXAsIGN1cnJlbnRBZ2VudCwgc2VyaWFsaXplZFByb2Nlc3NlZFJlc3BvbnNlKSB7XG4gICAgY29uc3QgYWxsVG9vbHMgPSBhd2FpdCBjdXJyZW50QWdlbnQuZ2V0QWxsVG9vbHMoKTtcbiAgICBjb25zdCB0b29scyA9IG5ldyBNYXAoYWxsVG9vbHNcbiAgICAgICAgLmZpbHRlcigodG9vbCkgPT4gdG9vbC50eXBlID09PSAnZnVuY3Rpb24nKVxuICAgICAgICAubWFwKCh0b29sKSA9PiBbdG9vbC5uYW1lLCB0b29sXSkpO1xuICAgIGNvbnN0IGNvbXB1dGVyVG9vbHMgPSBuZXcgTWFwKGFsbFRvb2xzXG4gICAgICAgIC5maWx0ZXIoKHRvb2wpID0+IHRvb2wudHlwZSA9PT0gJ2NvbXB1dGVyJylcbiAgICAgICAgLm1hcCgodG9vbCkgPT4gW3Rvb2wubmFtZSwgdG9vbF0pKTtcbiAgICBjb25zdCBoYW5kb2ZmcyA9IG5ldyBNYXAoY3VycmVudEFnZW50LmhhbmRvZmZzLm1hcCgoZW50cnkpID0+IHtcbiAgICAgICAgaWYgKGVudHJ5IGluc3RhbmNlb2YgQWdlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBbZW50cnkubmFtZSwgaGFuZG9mZihlbnRyeSldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbZW50cnkudG9vbE5hbWUsIGVudHJ5XTtcbiAgICB9KSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbmV3SXRlbXM6IHNlcmlhbGl6ZWRQcm9jZXNzZWRSZXNwb25zZS5uZXdJdGVtcy5tYXAoKGl0ZW0pID0+IGRlc2VyaWFsaXplSXRlbShpdGVtLCBhZ2VudE1hcCkpLFxuICAgICAgICB0b29sc1VzZWQ6IHNlcmlhbGl6ZWRQcm9jZXNzZWRSZXNwb25zZS50b29sc1VzZWQsXG4gICAgICAgIGhhbmRvZmZzOiBzZXJpYWxpemVkUHJvY2Vzc2VkUmVzcG9uc2UuaGFuZG9mZnMubWFwKChoYW5kb2ZmKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWhhbmRvZmZzLmhhcyhoYW5kb2ZmLmhhbmRvZmYudG9vbE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJFcnJvcihgSGFuZG9mZiAke2hhbmRvZmYuaGFuZG9mZi50b29sTmFtZX0gbm90IGZvdW5kYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHRvb2xDYWxsOiBoYW5kb2ZmLnRvb2xDYWxsLFxuICAgICAgICAgICAgICAgIGhhbmRvZmY6IGhhbmRvZmZzLmdldChoYW5kb2ZmLmhhbmRvZmYudG9vbE5hbWUpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSksXG4gICAgICAgIGZ1bmN0aW9uczogYXdhaXQgUHJvbWlzZS5hbGwoc2VyaWFsaXplZFByb2Nlc3NlZFJlc3BvbnNlLmZ1bmN0aW9ucy5tYXAoYXN5bmMgKGZ1bmN0aW9uQ2FsbCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0b29scy5oYXMoZnVuY3Rpb25DYWxsLnRvb2wubmFtZSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVXNlckVycm9yKGBUb29sICR7ZnVuY3Rpb25DYWxsLnRvb2wubmFtZX0gbm90IGZvdW5kYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHRvb2xDYWxsOiBmdW5jdGlvbkNhbGwudG9vbENhbGwsXG4gICAgICAgICAgICAgICAgdG9vbDogdG9vbHMuZ2V0KGZ1bmN0aW9uQ2FsbC50b29sLm5hbWUpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSkpLFxuICAgICAgICBjb21wdXRlckFjdGlvbnM6IHNlcmlhbGl6ZWRQcm9jZXNzZWRSZXNwb25zZS5jb21wdXRlckFjdGlvbnMubWFwKChjb21wdXRlckFjdGlvbikgPT4ge1xuICAgICAgICAgICAgY29uc3QgdG9vbE5hbWUgPSBjb21wdXRlckFjdGlvbi5jb21wdXRlci5uYW1lO1xuICAgICAgICAgICAgaWYgKCFjb21wdXRlclRvb2xzLmhhcyh0b29sTmFtZSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVXNlckVycm9yKGBDb21wdXRlciB0b29sICR7dG9vbE5hbWV9IG5vdCBmb3VuZGApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0b29sQ2FsbDogY29tcHV0ZXJBY3Rpb24udG9vbENhbGwsXG4gICAgICAgICAgICAgICAgY29tcHV0ZXI6IGNvbXB1dGVyVG9vbHMuZ2V0KHRvb2xOYW1lKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pLFxuICAgIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ydW5TdGF0ZS5tanMubWFwIiwiaW1wb3J0IHsgZGVmaW5lSW5wdXRHdWFyZHJhaWwsIGRlZmluZU91dHB1dEd1YXJkcmFpbCwgfSBmcm9tIFwiLi9ndWFyZHJhaWwubWpzXCI7XG5pbXBvcnQgeyBnZXRIYW5kb2ZmIH0gZnJvbSBcIi4vaGFuZG9mZi5tanNcIjtcbmltcG9ydCB7IGdldERlZmF1bHRNb2RlbFByb3ZpZGVyIH0gZnJvbSBcIi4vcHJvdmlkZXJzLm1qc1wiO1xuaW1wb3J0IHsgUnVuQ29udGV4dCB9IGZyb20gXCIuL3J1bkNvbnRleHQubWpzXCI7XG5pbXBvcnQgeyBSdW5SZXN1bHQsIFN0cmVhbWVkUnVuUmVzdWx0IH0gZnJvbSBcIi4vcmVzdWx0Lm1qc1wiO1xuaW1wb3J0IHsgUnVuSG9va3MgfSBmcm9tIFwiLi9saWZlY3ljbGUubWpzXCI7XG5pbXBvcnQgbG9nZ2VyIGZyb20gXCIuL2xvZ2dlci5tanNcIjtcbmltcG9ydCB7IHNlcmlhbGl6ZVRvb2wsIHNlcmlhbGl6ZUhhbmRvZmYgfSBmcm9tIFwiLi91dGlscy9zZXJpYWxpemUubWpzXCI7XG5pbXBvcnQgeyBHdWFyZHJhaWxFeGVjdXRpb25FcnJvciwgSW5wdXRHdWFyZHJhaWxUcmlwd2lyZVRyaWdnZXJlZCwgTWF4VHVybnNFeGNlZWRlZEVycm9yLCBNb2RlbEJlaGF2aW9yRXJyb3IsIE91dHB1dEd1YXJkcmFpbFRyaXB3aXJlVHJpZ2dlcmVkLCBVc2VyRXJyb3IsIH0gZnJvbSBcIi4vZXJyb3JzLm1qc1wiO1xuaW1wb3J0IHsgYWRkU3RlcFRvUnVuUmVzdWx0LCBleGVjdXRlSW50ZXJydXB0ZWRUb29sc0FuZFNpZGVFZmZlY3RzLCBleGVjdXRlVG9vbHNBbmRTaWRlRWZmZWN0cywgbWF5YmVSZXNldFRvb2xDaG9pY2UsIHByb2Nlc3NNb2RlbFJlc3BvbnNlLCB9IGZyb20gXCIuL3J1bkltcGxlbWVudGF0aW9uLm1qc1wiO1xuaW1wb3J0IHsgZ2V0T3JDcmVhdGVUcmFjZSwgcmVzZXRDdXJyZW50U3Bhbiwgc2V0Q3VycmVudFNwYW4sIHdpdGhOZXdTcGFuQ29udGV4dCwgd2l0aFRyYWNlLCB9IGZyb20gXCIuL3RyYWNpbmcvY29udGV4dC5tanNcIjtcbmltcG9ydCB7IGNyZWF0ZUFnZW50U3Bhbiwgd2l0aEd1YXJkcmFpbFNwYW4gfSBmcm9tIFwiLi90cmFjaW5nL2luZGV4Lm1qc1wiO1xuaW1wb3J0IHsgVXNhZ2UgfSBmcm9tIFwiLi91c2FnZS5tanNcIjtcbmltcG9ydCB7IFJ1bkFnZW50VXBkYXRlZFN0cmVhbUV2ZW50LCBSdW5SYXdNb2RlbFN0cmVhbUV2ZW50IH0gZnJvbSBcIi4vZXZlbnRzLm1qc1wiO1xuaW1wb3J0IHsgUnVuU3RhdGUgfSBmcm9tIFwiLi9ydW5TdGF0ZS5tanNcIjtcbmltcG9ydCB7IFN0cmVhbUV2ZW50UmVzcG9uc2VDb21wbGV0ZWQgfSBmcm9tIFwiLi90eXBlcy9wcm90b2NvbC5tanNcIjtcbmltcG9ydCB7IGNvbnZlcnRBZ2VudE91dHB1dFR5cGVUb1NlcmlhbGl6YWJsZSB9IGZyb20gXCIuL3V0aWxzL3Rvb2xzLm1qc1wiO1xuY29uc3QgREVGQVVMVF9NQVhfVFVSTlMgPSAxMDtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUcmFjaW5nKHRyYWNpbmdEaXNhYmxlZCwgdHJhY2VJbmNsdWRlU2Vuc2l0aXZlRGF0YSkge1xuICAgIGlmICh0cmFjaW5nRGlzYWJsZWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAodHJhY2VJbmNsdWRlU2Vuc2l0aXZlRGF0YSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuICdlbmFibGVkX3dpdGhvdXRfZGF0YSc7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0VHVybklucHV0KG9yaWdpbmFsSW5wdXQsIGdlbmVyYXRlZEl0ZW1zKSB7XG4gICAgY29uc3QgcmF3SXRlbXMgPSBnZW5lcmF0ZWRJdGVtcy5tYXAoKGl0ZW0pID0+IGl0ZW0ucmF3SXRlbSk7XG4gICAgaWYgKHR5cGVvZiBvcmlnaW5hbElucHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgICBvcmlnaW5hbElucHV0ID0gW3sgdHlwZTogJ21lc3NhZ2UnLCByb2xlOiAndXNlcicsIGNvbnRlbnQ6IG9yaWdpbmFsSW5wdXQgfV07XG4gICAgfVxuICAgIHJldHVybiBbLi4ub3JpZ2luYWxJbnB1dCwgLi4ucmF3SXRlbXNdO1xufVxuLyoqXG4gKiBBIFJ1bm5lciBpcyByZXNwb25zaWJsZSBmb3IgcnVubmluZyBhbiBhZ2VudCB3b3JrZmxvdy5cbiAqL1xuZXhwb3J0IGNsYXNzIFJ1bm5lciBleHRlbmRzIFJ1bkhvb2tzIHtcbiAgICBjb25maWc7XG4gICAgaW5wdXRHdWFyZHJhaWxEZWZzO1xuICAgIG91dHB1dEd1YXJkcmFpbERlZnM7XG4gICAgY29uc3RydWN0b3IoY29uZmlnID0ge30pIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5jb25maWcgPSB7XG4gICAgICAgICAgICBtb2RlbFByb3ZpZGVyOiBjb25maWcubW9kZWxQcm92aWRlciA/PyBnZXREZWZhdWx0TW9kZWxQcm92aWRlcigpLFxuICAgICAgICAgICAgbW9kZWw6IGNvbmZpZy5tb2RlbCxcbiAgICAgICAgICAgIG1vZGVsU2V0dGluZ3M6IGNvbmZpZy5tb2RlbFNldHRpbmdzLFxuICAgICAgICAgICAgaGFuZG9mZklucHV0RmlsdGVyOiBjb25maWcuaGFuZG9mZklucHV0RmlsdGVyLFxuICAgICAgICAgICAgaW5wdXRHdWFyZHJhaWxzOiBjb25maWcuaW5wdXRHdWFyZHJhaWxzLFxuICAgICAgICAgICAgb3V0cHV0R3VhcmRyYWlsczogY29uZmlnLm91dHB1dEd1YXJkcmFpbHMsXG4gICAgICAgICAgICB0cmFjaW5nRGlzYWJsZWQ6IGNvbmZpZy50cmFjaW5nRGlzYWJsZWQgPz8gZmFsc2UsXG4gICAgICAgICAgICB0cmFjZUluY2x1ZGVTZW5zaXRpdmVEYXRhOiBjb25maWcudHJhY2VJbmNsdWRlU2Vuc2l0aXZlRGF0YSA/PyB0cnVlLFxuICAgICAgICAgICAgd29ya2Zsb3dOYW1lOiBjb25maWcud29ya2Zsb3dOYW1lID8/ICdBZ2VudCB3b3JrZmxvdycsXG4gICAgICAgICAgICB0cmFjZUlkOiBjb25maWcudHJhY2VJZCxcbiAgICAgICAgICAgIGdyb3VwSWQ6IGNvbmZpZy5ncm91cElkLFxuICAgICAgICAgICAgdHJhY2VNZXRhZGF0YTogY29uZmlnLnRyYWNlTWV0YWRhdGEsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaW5wdXRHdWFyZHJhaWxEZWZzID0gKGNvbmZpZy5pbnB1dEd1YXJkcmFpbHMgPz8gW10pLm1hcChkZWZpbmVJbnB1dEd1YXJkcmFpbCk7XG4gICAgICAgIHRoaXMub3V0cHV0R3VhcmRyYWlsRGVmcyA9IChjb25maWcub3V0cHV0R3VhcmRyYWlscyA/PyBbXSkubWFwKGRlZmluZU91dHB1dEd1YXJkcmFpbCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGFzeW5jICNydW5JbmRpdmlkdWFsTm9uU3RyZWFtKHN0YXJ0aW5nQWdlbnQsIGlucHV0LCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB3aXRoTmV3U3BhbkNvbnRleHQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZSBhIHNhdmVkIHN0YXRlIHdlIHVzZSB0aGF0IG9uZSwgb3RoZXJ3aXNlIHdlIGNyZWF0ZSBhIG5ldyBvbmVcbiAgICAgICAgICAgIGNvbnN0IHN0YXRlID0gaW5wdXQgaW5zdGFuY2VvZiBSdW5TdGF0ZVxuICAgICAgICAgICAgICAgID8gaW5wdXRcbiAgICAgICAgICAgICAgICA6IG5ldyBSdW5TdGF0ZShvcHRpb25zLmNvbnRleHQgaW5zdGFuY2VvZiBSdW5Db250ZXh0XG4gICAgICAgICAgICAgICAgICAgID8gb3B0aW9ucy5jb250ZXh0XG4gICAgICAgICAgICAgICAgICAgIDogbmV3IFJ1bkNvbnRleHQob3B0aW9ucy5jb250ZXh0KSwgaW5wdXQsIHN0YXJ0aW5nQWdlbnQsIG9wdGlvbnMubWF4VHVybnMgPz8gREVGQVVMVF9NQVhfVFVSTlMpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbW9kZWwgPSBzdGF0ZS5fY3VycmVudEFnZW50Lm1vZGVsID8/IHRoaXMuY29uZmlnLm1vZGVsO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG1vZGVsID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwgPSBhd2FpdCB0aGlzLmNvbmZpZy5tb2RlbFByb3ZpZGVyLmdldE1vZGVsKG1vZGVsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSBkb24ndCBoYXZlIGEgY3VycmVudCBzdGVwLCB3ZSB0cmVhdCB0aGlzIGFzIGEgbmV3IHJ1blxuICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fY3VycmVudFN0ZXAgPSBzdGF0ZS5fY3VycmVudFN0ZXAgPz8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ25leHRfc3RlcF9ydW5fYWdhaW4nLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuX2N1cnJlbnRTdGVwLnR5cGUgPT09ICduZXh0X3N0ZXBfaW50ZXJydXB0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdDb250aW51aW5nIGZyb20gaW50ZXJydXB0aW9uJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0YXRlLl9sYXN0VHVyblJlc3BvbnNlIHx8ICFzdGF0ZS5fbGFzdFByb2Nlc3NlZFJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJFcnJvcignTm8gbW9kZWwgcmVzcG9uc2UgZm91bmQgaW4gcHJldmlvdXMgc3RhdGUnLCBzdGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0dXJuUmVzdWx0ID0gYXdhaXQgZXhlY3V0ZUludGVycnVwdGVkVG9vbHNBbmRTaWRlRWZmZWN0cyhzdGF0ZS5fY3VycmVudEFnZW50LCBzdGF0ZS5fb3JpZ2luYWxJbnB1dCwgc3RhdGUuX2dlbmVyYXRlZEl0ZW1zLCBzdGF0ZS5fbGFzdFR1cm5SZXNwb25zZSwgc3RhdGUuX2xhc3RQcm9jZXNzZWRSZXNwb25zZSwgdGhpcywgc3RhdGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuX3Rvb2xVc2VUcmFja2VyLmFkZFRvb2xVc2Uoc3RhdGUuX2N1cnJlbnRBZ2VudCwgc3RhdGUuX2xhc3RQcm9jZXNzZWRSZXNwb25zZS50b29sc1VzZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuX29yaWdpbmFsSW5wdXQgPSB0dXJuUmVzdWx0Lm9yaWdpbmFsSW5wdXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZ2VuZXJhdGVkSXRlbXMgPSB0dXJuUmVzdWx0LmdlbmVyYXRlZEl0ZW1zO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2N1cnJlbnRTdGVwID0gdHVyblJlc3VsdC5uZXh0U3RlcDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5fY3VycmVudFN0ZXAudHlwZSA9PT0gJ25leHRfc3RlcF9ydW5fYWdhaW4nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoYW5kb2ZmcyA9IHN0YXRlLl9jdXJyZW50QWdlbnQuaGFuZG9mZnMubWFwKGdldEhhbmRvZmYpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGF0ZS5fY3VycmVudEFnZW50U3Bhbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhbmRvZmZOYW1lcyA9IGhhbmRvZmZzLm1hcCgoaCkgPT4gaC5hZ2VudE5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9jdXJyZW50QWdlbnRTcGFuID0gY3JlYXRlQWdlbnRTcGFuKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogc3RhdGUuX2N1cnJlbnRBZ2VudC5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZG9mZnM6IGhhbmRvZmZOYW1lcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF90eXBlOiBzdGF0ZS5fY3VycmVudEFnZW50Lm91dHB1dFNjaGVtYU5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2N1cnJlbnRBZ2VudFNwYW4uc3RhcnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDdXJyZW50U3BhbihzdGF0ZS5fY3VycmVudEFnZW50U3Bhbik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0b29scyA9IGF3YWl0IHN0YXRlLl9jdXJyZW50QWdlbnQuZ2V0QWxsVG9vbHMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlcmlhbGl6ZWRUb29scyA9IHRvb2xzLm1hcCgodCkgPT4gc2VyaWFsaXplVG9vbCh0KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZXJpYWxpemVkSGFuZG9mZnMgPSBoYW5kb2Zmcy5tYXAoKGgpID0+IHNlcmlhbGl6ZUhhbmRvZmYoaCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLl9jdXJyZW50QWdlbnRTcGFuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2N1cnJlbnRBZ2VudFNwYW4uc3BhbkRhdGEudG9vbHMgPSB0b29scy5tYXAoKHQpID0+IHQubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fY3VycmVudFR1cm4rKztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5fY3VycmVudFR1cm4gPiBzdGF0ZS5fbWF4VHVybnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fY3VycmVudEFnZW50U3Bhbj8uc2V0RXJyb3Ioe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnTWF4IHR1cm5zIGV4Y2VlZGVkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogeyBtYXhfdHVybnM6IHN0YXRlLl9tYXhUdXJucyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBNYXhUdXJuc0V4Y2VlZGVkRXJyb3IoYE1heCB0dXJucyAoJHtzdGF0ZS5fbWF4VHVybnN9KSBleGNlZWRlZGAsIHN0YXRlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgUnVubmluZyBhZ2VudCAke3N0YXRlLl9jdXJyZW50QWdlbnQubmFtZX0gKHR1cm4gJHtzdGF0ZS5fY3VycmVudFR1cm59KWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLl9jdXJyZW50VHVybiA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuI3J1bklucHV0R3VhcmRyYWlscyhzdGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0dXJuSW5wdXQgPSBnZXRUdXJuSW5wdXQoc3RhdGUuX29yaWdpbmFsSW5wdXQsIHN0YXRlLl9nZW5lcmF0ZWRJdGVtcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuX25vQWN0aXZlQWdlbnRSdW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fY3VycmVudEFnZW50LmVtaXQoJ2FnZW50X3N0YXJ0Jywgc3RhdGUuX2NvbnRleHQsIHN0YXRlLl9jdXJyZW50QWdlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnYWdlbnRfc3RhcnQnLCBzdGF0ZS5fY29udGV4dCwgc3RhdGUuX2N1cnJlbnRBZ2VudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbW9kZWxTZXR0aW5ncyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi50aGlzLmNvbmZpZy5tb2RlbFNldHRpbmdzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnN0YXRlLl9jdXJyZW50QWdlbnQubW9kZWxTZXR0aW5ncyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbFNldHRpbmdzID0gbWF5YmVSZXNldFRvb2xDaG9pY2Uoc3RhdGUuX2N1cnJlbnRBZ2VudCwgc3RhdGUuX3Rvb2xVc2VUcmFja2VyLCBtb2RlbFNldHRpbmdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9sYXN0VHVyblJlc3BvbnNlID0gYXdhaXQgbW9kZWwuZ2V0UmVzcG9uc2Uoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5c3RlbUluc3RydWN0aW9uczogYXdhaXQgc3RhdGUuX2N1cnJlbnRBZ2VudC5nZXRTeXN0ZW1Qcm9tcHQoc3RhdGUuX2NvbnRleHQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0OiB0dXJuSW5wdXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNSZXNwb25zZUlkOiBvcHRpb25zLnByZXZpb3VzUmVzcG9uc2VJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbFNldHRpbmdzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2xzOiBzZXJpYWxpemVkVG9vbHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0VHlwZTogY29udmVydEFnZW50T3V0cHV0VHlwZVRvU2VyaWFsaXphYmxlKHN0YXRlLl9jdXJyZW50QWdlbnQub3V0cHV0VHlwZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZG9mZnM6IHNlcmlhbGl6ZWRIYW5kb2ZmcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjaW5nOiBnZXRUcmFjaW5nKHRoaXMuY29uZmlnLnRyYWNpbmdEaXNhYmxlZCwgdGhpcy5jb25maWcudHJhY2VJbmNsdWRlU2Vuc2l0aXZlRGF0YSksXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9tb2RlbFJlc3BvbnNlcy5wdXNoKHN0YXRlLl9sYXN0VHVyblJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9jb250ZXh0LnVzYWdlLmFkZChzdGF0ZS5fbGFzdFR1cm5SZXNwb25zZS51c2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fbm9BY3RpdmVBZ2VudFJ1biA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvY2Vzc2VkUmVzcG9uc2UgPSBwcm9jZXNzTW9kZWxSZXNwb25zZShzdGF0ZS5fbGFzdFR1cm5SZXNwb25zZSwgc3RhdGUuX2N1cnJlbnRBZ2VudCwgdG9vbHMsIGhhbmRvZmZzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9sYXN0UHJvY2Vzc2VkUmVzcG9uc2UgPSBwcm9jZXNzZWRSZXNwb25zZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHR1cm5SZXN1bHQgPSBhd2FpdCBleGVjdXRlVG9vbHNBbmRTaWRlRWZmZWN0cyhzdGF0ZS5fY3VycmVudEFnZW50LCBzdGF0ZS5fb3JpZ2luYWxJbnB1dCwgc3RhdGUuX2dlbmVyYXRlZEl0ZW1zLCBzdGF0ZS5fbGFzdFR1cm5SZXNwb25zZSwgc3RhdGUuX2xhc3RQcm9jZXNzZWRSZXNwb25zZSwgdGhpcywgc3RhdGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuX3Rvb2xVc2VUcmFja2VyLmFkZFRvb2xVc2Uoc3RhdGUuX2N1cnJlbnRBZ2VudCwgc3RhdGUuX2xhc3RQcm9jZXNzZWRSZXNwb25zZS50b29sc1VzZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuX29yaWdpbmFsSW5wdXQgPSB0dXJuUmVzdWx0Lm9yaWdpbmFsSW5wdXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZ2VuZXJhdGVkSXRlbXMgPSB0dXJuUmVzdWx0LmdlbmVyYXRlZEl0ZW1zO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2N1cnJlbnRTdGVwID0gdHVyblJlc3VsdC5uZXh0U3RlcDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuX2N1cnJlbnRTdGVwICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fY3VycmVudFN0ZXAudHlwZSA9PT0gJ25leHRfc3RlcF9maW5hbF9vdXRwdXQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLiNydW5PdXRwdXRHdWFyZHJhaWxzKHN0YXRlLCBzdGF0ZS5fY3VycmVudFN0ZXAub3V0cHV0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnYWdlbnRfZW5kJywgc3RhdGUuX2NvbnRleHQsIHN0YXRlLl9jdXJyZW50QWdlbnQsIHN0YXRlLl9jdXJyZW50U3RlcC5vdXRwdXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2N1cnJlbnRBZ2VudC5lbWl0KCdhZ2VudF9lbmQnLCBzdGF0ZS5fY29udGV4dCwgc3RhdGUuX2N1cnJlbnRTdGVwLm91dHB1dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJ1blJlc3VsdChzdGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RhdGUuX2N1cnJlbnRTdGVwICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fY3VycmVudFN0ZXAudHlwZSA9PT0gJ25leHRfc3RlcF9oYW5kb2ZmJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2N1cnJlbnRBZ2VudCA9IHN0YXRlLl9jdXJyZW50U3RlcC5uZXdBZ2VudDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5fY3VycmVudEFnZW50U3Bhbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9jdXJyZW50QWdlbnRTcGFuLmVuZCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2V0Q3VycmVudFNwYW4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fY3VycmVudEFnZW50U3BhbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9ub0FjdGl2ZUFnZW50UnVuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlJ3ZlIHByb2Nlc3NlZCB0aGUgaGFuZG9mZiwgc28gd2UgbmVlZCB0byBydW4gdGhlIGxvb3AgYWdhaW5cbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9jdXJyZW50U3RlcCA9IHsgdHlwZTogJ25leHRfc3RlcF9ydW5fYWdhaW4nIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RhdGUuX2N1cnJlbnRTdGVwICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fY3VycmVudFN0ZXAudHlwZSA9PT0gJ25leHRfc3RlcF9pbnRlcnJ1cHRpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnRlcnJ1cHRlZC4gRG9uJ3QgcnVuIGFueSBndWFyZHJhaWxzXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJ1blJlc3VsdChzdGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1J1bm5pbmcgbmV4dCBsb29wJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXRlLl9jdXJyZW50QWdlbnRTcGFuKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLl9jdXJyZW50QWdlbnRTcGFuLnNldEVycm9yKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdFcnJvciBpbiBhZ2VudCBydW4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogeyBlcnJvcjogU3RyaW5nKGVycikgfSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5fY3VycmVudEFnZW50U3Bhbikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuX2N1cnJlbnRTdGVwPy50eXBlICE9PSAnbmV4dF9zdGVwX2ludGVycnVwdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IGVuZCB0aGUgc3BhbiBpZiB0aGUgcnVuIHdhcyBpbnRlcnJ1cHRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2N1cnJlbnRBZ2VudFNwYW4uZW5kKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmVzZXRDdXJyZW50U3BhbigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFzeW5jICNydW5JbnB1dEd1YXJkcmFpbHMoc3RhdGUpIHtcbiAgICAgICAgY29uc3QgZ3VhcmRyYWlscyA9IHRoaXMuaW5wdXRHdWFyZHJhaWxEZWZzLmNvbmNhdChzdGF0ZS5fY3VycmVudEFnZW50LmlucHV0R3VhcmRyYWlscy5tYXAoZGVmaW5lSW5wdXRHdWFyZHJhaWwpKTtcbiAgICAgICAgaWYgKGd1YXJkcmFpbHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgZ3VhcmRyYWlsQXJncyA9IHtcbiAgICAgICAgICAgICAgICBhZ2VudDogc3RhdGUuX2N1cnJlbnRBZ2VudCxcbiAgICAgICAgICAgICAgICBpbnB1dDogc3RhdGUuX29yaWdpbmFsSW5wdXQsXG4gICAgICAgICAgICAgICAgY29udGV4dDogc3RhdGUuX2NvbnRleHQsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoZ3VhcmRyYWlscy5tYXAoYXN5bmMgKGd1YXJkcmFpbCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2l0aEd1YXJkcmFpbFNwYW4oYXN5bmMgKHNwYW4pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGd1YXJkcmFpbC5ydW4oZ3VhcmRyYWlsQXJncyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzcGFuLnNwYW5EYXRhLnRyaWdnZXJlZCA9IHJlc3VsdC5vdXRwdXQudHJpcHdpcmVUcmlnZ2VyZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICB9LCB7IGRhdGE6IHsgbmFtZTogZ3VhcmRyYWlsLm5hbWUgfSB9LCBzdGF0ZS5fY3VycmVudEFnZW50U3Bhbik7XG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5vdXRwdXQudHJpcHdpcmVUcmlnZ2VyZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5fY3VycmVudEFnZW50U3Bhbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9jdXJyZW50QWdlbnRTcGFuLnNldEVycm9yKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ0d1YXJkcmFpbCB0cmlwd2lyZSB0cmlnZ2VyZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiB7IGd1YXJkcmFpbDogcmVzdWx0Lmd1YXJkcmFpbC5uYW1lIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW5wdXRHdWFyZHJhaWxUcmlwd2lyZVRyaWdnZXJlZChgSW5wdXQgZ3VhcmRyYWlsIHRyaWdnZXJlZDogJHtKU09OLnN0cmluZ2lmeShyZXN1bHQub3V0cHV0Lm91dHB1dEluZm8pfWAsIHJlc3VsdCwgc3RhdGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIElucHV0R3VhcmRyYWlsVHJpcHdpcmVUcmlnZ2VyZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gcm9sbCBiYWNrIHRoZSBjdXJyZW50IHR1cm4gdG8gZW5hYmxlIHJlcnVuc1xuICAgICAgICAgICAgICAgIHN0YXRlLl9jdXJyZW50VHVybi0tO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBHdWFyZHJhaWxFeGVjdXRpb25FcnJvcihgSW5wdXQgZ3VhcmRyYWlsIGZhaWxlZCB0byBjb21wbGV0ZTogJHtlfWAsIGUsIHN0YXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyAjcnVuT3V0cHV0R3VhcmRyYWlscyhzdGF0ZSwgb3V0cHV0KSB7XG4gICAgICAgIGNvbnN0IGd1YXJkcmFpbHMgPSB0aGlzLm91dHB1dEd1YXJkcmFpbERlZnMuY29uY2F0KHN0YXRlLl9jdXJyZW50QWdlbnQub3V0cHV0R3VhcmRyYWlscy5tYXAoZGVmaW5lT3V0cHV0R3VhcmRyYWlsKSk7XG4gICAgICAgIGlmIChndWFyZHJhaWxzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGFnZW50T3V0cHV0ID0gc3RhdGUuX2N1cnJlbnRBZ2VudC5wcm9jZXNzRmluYWxPdXRwdXQob3V0cHV0KTtcbiAgICAgICAgICAgIGNvbnN0IGd1YXJkcmFpbEFyZ3MgPSB7XG4gICAgICAgICAgICAgICAgYWdlbnQ6IHN0YXRlLl9jdXJyZW50QWdlbnQsXG4gICAgICAgICAgICAgICAgYWdlbnRPdXRwdXQsXG4gICAgICAgICAgICAgICAgY29udGV4dDogc3RhdGUuX2NvbnRleHQsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoZ3VhcmRyYWlscy5tYXAoYXN5bmMgKGd1YXJkcmFpbCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2l0aEd1YXJkcmFpbFNwYW4oYXN5bmMgKHNwYW4pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGd1YXJkcmFpbC5ydW4oZ3VhcmRyYWlsQXJncyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzcGFuLnNwYW5EYXRhLnRyaWdnZXJlZCA9IHJlc3VsdC5vdXRwdXQudHJpcHdpcmVUcmlnZ2VyZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICB9LCB7IGRhdGE6IHsgbmFtZTogZ3VhcmRyYWlsLm5hbWUgfSB9LCBzdGF0ZS5fY3VycmVudEFnZW50U3Bhbik7XG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5vdXRwdXQudHJpcHdpcmVUcmlnZ2VyZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5fY3VycmVudEFnZW50U3Bhbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9jdXJyZW50QWdlbnRTcGFuLnNldEVycm9yKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ0d1YXJkcmFpbCB0cmlwd2lyZSB0cmlnZ2VyZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiB7IGd1YXJkcmFpbDogcmVzdWx0Lmd1YXJkcmFpbC5uYW1lIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3V0cHV0R3VhcmRyYWlsVHJpcHdpcmVUcmlnZ2VyZWQoYE91dHB1dCBndWFyZHJhaWwgdHJpZ2dlcmVkOiAke0pTT04uc3RyaW5naWZ5KHJlc3VsdC5vdXRwdXQub3V0cHV0SW5mbyl9YCwgcmVzdWx0LCBzdGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgT3V0cHV0R3VhcmRyYWlsVHJpcHdpcmVUcmlnZ2VyZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEd1YXJkcmFpbEV4ZWN1dGlvbkVycm9yKGBPdXRwdXQgZ3VhcmRyYWlsIGZhaWxlZCB0byBjb21wbGV0ZTogJHtlfWAsIGUsIHN0YXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBhc3luYyAjcnVuU3RyZWFtTG9vcChyZXN1bHQsIG9wdGlvbnMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudEFnZW50ID0gcmVzdWx0LnN0YXRlLl9jdXJyZW50QWdlbnQ7XG4gICAgICAgICAgICAgICAgY29uc3QgaGFuZG9mZnMgPSBjdXJyZW50QWdlbnQuaGFuZG9mZnMubWFwKGdldEhhbmRvZmYpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvb2xzID0gYXdhaXQgY3VycmVudEFnZW50LmdldEFsbFRvb2xzKCk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VyaWFsaXplZFRvb2xzID0gdG9vbHMubWFwKCh0KSA9PiBzZXJpYWxpemVUb29sKHQpKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzZXJpYWxpemVkSGFuZG9mZnMgPSBoYW5kb2Zmcy5tYXAoKGgpID0+IHNlcmlhbGl6ZUhhbmRvZmYoaCkpO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5zdGF0ZS5fY3VycmVudFN0ZXAgPSByZXN1bHQuc3RhdGUuX2N1cnJlbnRTdGVwID8/IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ25leHRfc3RlcF9ydW5fYWdhaW4nLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5zdGF0ZS5fY3VycmVudFN0ZXAudHlwZSA9PT0gJ25leHRfc3RlcF9pbnRlcnJ1cHRpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnQ29udGludWluZyBmcm9tIGludGVycnVwdGlvbicpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdC5zdGF0ZS5fbGFzdFR1cm5SZXNwb25zZSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgIXJlc3VsdC5zdGF0ZS5fbGFzdFByb2Nlc3NlZFJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVXNlckVycm9yKCdObyBtb2RlbCByZXNwb25zZSBmb3VuZCBpbiBwcmV2aW91cyBzdGF0ZScsIHJlc3VsdC5zdGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHVyblJlc3VsdCA9IGF3YWl0IGV4ZWN1dGVJbnRlcnJ1cHRlZFRvb2xzQW5kU2lkZUVmZmVjdHMocmVzdWx0LnN0YXRlLl9jdXJyZW50QWdlbnQsIHJlc3VsdC5zdGF0ZS5fb3JpZ2luYWxJbnB1dCwgcmVzdWx0LnN0YXRlLl9nZW5lcmF0ZWRJdGVtcywgcmVzdWx0LnN0YXRlLl9sYXN0VHVyblJlc3BvbnNlLCByZXN1bHQuc3RhdGUuX2xhc3RQcm9jZXNzZWRSZXNwb25zZSwgdGhpcywgcmVzdWx0LnN0YXRlKTtcbiAgICAgICAgICAgICAgICAgICAgYWRkU3RlcFRvUnVuUmVzdWx0KHJlc3VsdCwgdHVyblJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zdGF0ZS5fdG9vbFVzZVRyYWNrZXIuYWRkVG9vbFVzZShyZXN1bHQuc3RhdGUuX2N1cnJlbnRBZ2VudCwgcmVzdWx0LnN0YXRlLl9sYXN0UHJvY2Vzc2VkUmVzcG9uc2UudG9vbHNVc2VkKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnN0YXRlLl9vcmlnaW5hbElucHV0ID0gdHVyblJlc3VsdC5vcmlnaW5hbElucHV0O1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQuc3RhdGUuX2dlbmVyYXRlZEl0ZW1zID0gdHVyblJlc3VsdC5nZW5lcmF0ZWRJdGVtcztcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnN0YXRlLl9jdXJyZW50U3RlcCA9IHR1cm5SZXN1bHQubmV4dFN0ZXA7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnN0YXRlLl9jdXJyZW50U3RlcC50eXBlID09PSAnbmV4dF9zdGVwX3J1bl9hZ2FpbicpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQuc3RhdGUuX2N1cnJlbnRBZ2VudFNwYW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhbmRvZmZOYW1lcyA9IGhhbmRvZmZzLm1hcCgoaCkgPT4gaC5hZ2VudE5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnN0YXRlLl9jdXJyZW50QWdlbnRTcGFuID0gY3JlYXRlQWdlbnRTcGFuKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGN1cnJlbnRBZ2VudC5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kb2ZmczogaGFuZG9mZk5hbWVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sczogdG9vbHMubWFwKCh0KSA9PiB0Lm5hbWUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfdHlwZTogY3VycmVudEFnZW50Lm91dHB1dFNjaGVtYU5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnN0YXRlLl9jdXJyZW50QWdlbnRTcGFuLnN0YXJ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRDdXJyZW50U3BhbihyZXN1bHQuc3RhdGUuX2N1cnJlbnRBZ2VudFNwYW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zdGF0ZS5fY3VycmVudFR1cm4rKztcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5zdGF0ZS5fY3VycmVudFR1cm4gPiByZXN1bHQuc3RhdGUuX21heFR1cm5zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuc3RhdGUuX2N1cnJlbnRBZ2VudFNwYW4/LnNldEVycm9yKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnTWF4IHR1cm5zIGV4Y2VlZGVkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiB7IG1heF90dXJuczogcmVzdWx0LnN0YXRlLl9tYXhUdXJucyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWF4VHVybnNFeGNlZWRlZEVycm9yKGBNYXggdHVybnMgKCR7cmVzdWx0LnN0YXRlLl9tYXhUdXJuc30pIGV4Y2VlZGVkYCwgcmVzdWx0LnN0YXRlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoYFJ1bm5pbmcgYWdlbnQgJHtjdXJyZW50QWdlbnQubmFtZX0gKHR1cm4gJHtyZXN1bHQuc3RhdGUuX2N1cnJlbnRUdXJufSlgKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1vZGVsID0gY3VycmVudEFnZW50Lm1vZGVsID8/IHRoaXMuY29uZmlnLm1vZGVsO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG1vZGVsID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwgPSBhd2FpdCB0aGlzLmNvbmZpZy5tb2RlbFByb3ZpZGVyLmdldE1vZGVsKG1vZGVsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnN0YXRlLl9jdXJyZW50VHVybiA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy4jcnVuSW5wdXRHdWFyZHJhaWxzKHJlc3VsdC5zdGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGV0IG1vZGVsU2V0dGluZ3MgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi50aGlzLmNvbmZpZy5tb2RlbFNldHRpbmdzLFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudEFnZW50Lm1vZGVsU2V0dGluZ3MsXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIG1vZGVsU2V0dGluZ3MgPSBtYXliZVJlc2V0VG9vbENob2ljZShjdXJyZW50QWdlbnQsIHJlc3VsdC5zdGF0ZS5fdG9vbFVzZVRyYWNrZXIsIG1vZGVsU2V0dGluZ3MpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0dXJuSW5wdXQgPSBnZXRUdXJuSW5wdXQocmVzdWx0LmlucHV0LCByZXN1bHQubmV3SXRlbXMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnN0YXRlLl9ub0FjdGl2ZUFnZW50UnVuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QWdlbnQuZW1pdCgnYWdlbnRfc3RhcnQnLCByZXN1bHQuc3RhdGUuX2NvbnRleHQsIGN1cnJlbnRBZ2VudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2FnZW50X3N0YXJ0JywgcmVzdWx0LnN0YXRlLl9jb250ZXh0LCBjdXJyZW50QWdlbnQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxldCBmaW5hbFJlc3BvbnNlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IGV2ZW50IG9mIG1vZGVsLmdldFN0cmVhbWVkUmVzcG9uc2Uoe1xuICAgICAgICAgICAgICAgICAgICAgICAgc3lzdGVtSW5zdHJ1Y3Rpb25zOiBhd2FpdCBjdXJyZW50QWdlbnQuZ2V0U3lzdGVtUHJvbXB0KHJlc3VsdC5zdGF0ZS5fY29udGV4dCksXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dDogdHVybklucHV0LFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNSZXNwb25zZUlkOiBvcHRpb25zLnByZXZpb3VzUmVzcG9uc2VJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsU2V0dGluZ3MsXG4gICAgICAgICAgICAgICAgICAgICAgICB0b29sczogc2VyaWFsaXplZFRvb2xzLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZG9mZnM6IHNlcmlhbGl6ZWRIYW5kb2ZmcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFR5cGU6IGNvbnZlcnRBZ2VudE91dHB1dFR5cGVUb1NlcmlhbGl6YWJsZShjdXJyZW50QWdlbnQub3V0cHV0VHlwZSksXG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFjaW5nOiBnZXRUcmFjaW5nKHRoaXMuY29uZmlnLnRyYWNpbmdEaXNhYmxlZCwgdGhpcy5jb25maWcudHJhY2VJbmNsdWRlU2Vuc2l0aXZlRGF0YSksXG4gICAgICAgICAgICAgICAgICAgIH0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ3Jlc3BvbnNlX2RvbmUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gU3RyZWFtRXZlbnRSZXNwb25zZUNvbXBsZXRlZC5wYXJzZShldmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxSZXNwb25zZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNhZ2U6IG5ldyBVc2FnZShwYXJzZWQucmVzcG9uc2UudXNhZ2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQ6IHBhcnNlZC5yZXNwb25zZS5vdXRwdXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlSWQ6IHBhcnNlZC5yZXNwb25zZS5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5jYW5jZWxsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIHRoZSB1c2VyJ3MgY29kZSBleGl0cyBhIGxvb3AgdG8gY29uc3VtZSB0aGUgc3RyZWFtLCB3ZSBuZWVkIHRvIGJyZWFrXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBsb29wIHRvIHByZXZlbnQgaW50ZXJuYWwgZmFsc2UgZXJyb3JzIGFuZCB1bm5lY2Vzc2FyeSBwcm9jZXNzaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Ll9hZGRJdGVtKG5ldyBSdW5SYXdNb2RlbFN0cmVhbUV2ZW50KGV2ZW50KSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnN0YXRlLl9ub0FjdGl2ZUFnZW50UnVuID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZmluYWxSZXNwb25zZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1vZGVsQmVoYXZpb3JFcnJvcignTW9kZWwgZGlkIG5vdCBwcm9jdWRlIGEgZmluYWwgcmVzcG9uc2UhJywgcmVzdWx0LnN0YXRlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXN1bHQuc3RhdGUuX2xhc3RUdXJuUmVzcG9uc2UgPSBmaW5hbFJlc3BvbnNlO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQuc3RhdGUuX21vZGVsUmVzcG9uc2VzLnB1c2gocmVzdWx0LnN0YXRlLl9sYXN0VHVyblJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvY2Vzc2VkUmVzcG9uc2UgPSBwcm9jZXNzTW9kZWxSZXNwb25zZShyZXN1bHQuc3RhdGUuX2xhc3RUdXJuUmVzcG9uc2UsIGN1cnJlbnRBZ2VudCwgdG9vbHMsIGhhbmRvZmZzKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnN0YXRlLl9sYXN0UHJvY2Vzc2VkUmVzcG9uc2UgPSBwcm9jZXNzZWRSZXNwb25zZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHVyblJlc3VsdCA9IGF3YWl0IGV4ZWN1dGVUb29sc0FuZFNpZGVFZmZlY3RzKGN1cnJlbnRBZ2VudCwgcmVzdWx0LnN0YXRlLl9vcmlnaW5hbElucHV0LCByZXN1bHQuc3RhdGUuX2dlbmVyYXRlZEl0ZW1zLCByZXN1bHQuc3RhdGUuX2xhc3RUdXJuUmVzcG9uc2UsIHJlc3VsdC5zdGF0ZS5fbGFzdFByb2Nlc3NlZFJlc3BvbnNlLCB0aGlzLCByZXN1bHQuc3RhdGUpO1xuICAgICAgICAgICAgICAgICAgICBhZGRTdGVwVG9SdW5SZXN1bHQocmVzdWx0LCB0dXJuUmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnN0YXRlLl90b29sVXNlVHJhY2tlci5hZGRUb29sVXNlKGN1cnJlbnRBZ2VudCwgcHJvY2Vzc2VkUmVzcG9uc2UudG9vbHNVc2VkKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnN0YXRlLl9vcmlnaW5hbElucHV0ID0gdHVyblJlc3VsdC5vcmlnaW5hbElucHV0O1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQuc3RhdGUuX2dlbmVyYXRlZEl0ZW1zID0gdHVyblJlc3VsdC5nZW5lcmF0ZWRJdGVtcztcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnN0YXRlLl9jdXJyZW50U3RlcCA9IHR1cm5SZXN1bHQubmV4dFN0ZXA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuc3RhdGUuX2N1cnJlbnRTdGVwLnR5cGUgPT09ICduZXh0X3N0ZXBfZmluYWxfb3V0cHV0Jykge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLiNydW5PdXRwdXRHdWFyZHJhaWxzKHJlc3VsdC5zdGF0ZSwgcmVzdWx0LnN0YXRlLl9jdXJyZW50U3RlcC5vdXRwdXQpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdC5zdGF0ZS5fY3VycmVudFN0ZXAudHlwZSA9PT0gJ25leHRfc3RlcF9pbnRlcnJ1cHRpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHdlIGFyZSBkb25lIGZvciBub3cuIERvbid0IHJ1biBhbnkgb3V0cHV0IGd1YXJkcmFpbHNcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXN1bHQuc3RhdGUuX2N1cnJlbnRTdGVwLnR5cGUgPT09ICduZXh0X3N0ZXBfaGFuZG9mZicpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnN0YXRlLl9jdXJyZW50QWdlbnQgPSByZXN1bHQuc3RhdGUuX2N1cnJlbnRTdGVwXG4gICAgICAgICAgICAgICAgICAgICAgICA/Lm5ld0FnZW50O1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnN0YXRlLl9jdXJyZW50QWdlbnRTcGFuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuc3RhdGUuX2N1cnJlbnRBZ2VudFNwYW4uZW5kKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNldEN1cnJlbnRTcGFuKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnN0YXRlLl9jdXJyZW50QWdlbnRTcGFuID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQuX2FkZEl0ZW0obmV3IFJ1bkFnZW50VXBkYXRlZFN0cmVhbUV2ZW50KGN1cnJlbnRBZ2VudCkpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQuc3RhdGUuX25vQWN0aXZlQWdlbnRSdW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAvLyB3ZSd2ZSBwcm9jZXNzZWQgdGhlIGhhbmRvZmYsIHNvIHdlIG5lZWQgdG8gcnVuIHRoZSBsb29wIGFnYWluXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zdGF0ZS5fY3VycmVudFN0ZXAgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbmV4dF9zdGVwX3J1bl9hZ2FpbicsXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1J1bm5pbmcgbmV4dCBsb29wJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKHJlc3VsdC5zdGF0ZS5fY3VycmVudEFnZW50U3Bhbikge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5zdGF0ZS5fY3VycmVudEFnZW50U3Bhbi5zZXRFcnJvcih7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdFcnJvciBpbiBhZ2VudCBydW4nLFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiB7IGVycm9yOiBTdHJpbmcoZXJyb3IpIH0sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIGlmIChyZXN1bHQuc3RhdGUuX2N1cnJlbnRBZ2VudFNwYW4pIHtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnN0YXRlLl9jdXJyZW50U3RlcD8udHlwZSAhPT0gJ25leHRfc3RlcF9pbnRlcnJ1cHRpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zdGF0ZS5fY3VycmVudEFnZW50U3Bhbi5lbmQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzZXRDdXJyZW50U3BhbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGFzeW5jICNydW5JbmRpdmlkdWFsU3RyZWFtKGFnZW50LCBpbnB1dCwgb3B0aW9ucykge1xuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyA/PyB7fTtcbiAgICAgICAgcmV0dXJuIHdpdGhOZXdTcGFuQ29udGV4dChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAvLyBJbml0aWFsaXplIG9yIHJldXNlIGV4aXN0aW5nIHN0YXRlXG4gICAgICAgICAgICBjb25zdCBzdGF0ZSA9IGlucHV0IGluc3RhbmNlb2YgUnVuU3RhdGVcbiAgICAgICAgICAgICAgICA/IGlucHV0XG4gICAgICAgICAgICAgICAgOiBuZXcgUnVuU3RhdGUob3B0aW9ucy5jb250ZXh0IGluc3RhbmNlb2YgUnVuQ29udGV4dFxuICAgICAgICAgICAgICAgICAgICA/IG9wdGlvbnMuY29udGV4dFxuICAgICAgICAgICAgICAgICAgICA6IG5ldyBSdW5Db250ZXh0KG9wdGlvbnMuY29udGV4dCksIGlucHV0LCBhZ2VudCwgb3B0aW9ucy5tYXhUdXJucyA/PyBERUZBVUxUX01BWF9UVVJOUyk7XG4gICAgICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBzdHJlYW1lZCByZXN1bHQgd2l0aCBleGlzdGluZyBzdGF0ZVxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IFN0cmVhbWVkUnVuUmVzdWx0KHtcbiAgICAgICAgICAgICAgICBzaWduYWw6IG9wdGlvbnMuc2lnbmFsLFxuICAgICAgICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBTZXR1cCBkZWZhdWx0c1xuICAgICAgICAgICAgcmVzdWx0Lm1heFR1cm5zID0gb3B0aW9ucy5tYXhUdXJucyA/PyBzdGF0ZS5fbWF4VHVybnM7XG4gICAgICAgICAgICAvLyBDb250aW51ZSB0aGUgc3RyZWFtIGxvb3Agd2l0aG91dCBibG9ja2luZ1xuICAgICAgICAgICAgdGhpcy4jcnVuU3RyZWFtTG9vcChyZXN1bHQsIG9wdGlvbnMpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5fZG9uZSgpO1xuICAgICAgICAgICAgfSwgKGVycikgPT4ge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5fcmFpc2VFcnJvcihlcnIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcnVuKGFnZW50LCBpbnB1dCwgb3B0aW9ucyA9IHtcbiAgICAgICAgc3RyZWFtOiBmYWxzZSxcbiAgICAgICAgY29udGV4dDogdW5kZWZpbmVkLFxuICAgIH0pIHtcbiAgICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgUnVuU3RhdGUgJiYgaW5wdXQuX3RyYWNlKSB7XG4gICAgICAgICAgICByZXR1cm4gd2l0aFRyYWNlKGlucHV0Ll90cmFjZSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpbnB1dC5fY3VycmVudEFnZW50U3Bhbikge1xuICAgICAgICAgICAgICAgICAgICBzZXRDdXJyZW50U3BhbihpbnB1dC5fY3VycmVudEFnZW50U3Bhbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zPy5zdHJlYW0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuI3J1bkluZGl2aWR1YWxTdHJlYW0oYWdlbnQsIGlucHV0LCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLiNydW5JbmRpdmlkdWFsTm9uU3RyZWFtKGFnZW50LCBpbnB1dCwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdldE9yQ3JlYXRlVHJhY2UoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnM/LnN0cmVhbSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLiNydW5JbmRpdmlkdWFsU3RyZWFtKGFnZW50LCBpbnB1dCwgb3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy4jcnVuSW5kaXZpZHVhbE5vblN0cmVhbShhZ2VudCwgaW5wdXQsIG9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59XG5sZXQgX2RlZmF1bHRSdW5uZXIgPSB1bmRlZmluZWQ7XG5mdW5jdGlvbiBnZXREZWZhdWx0UnVubmVyKCkge1xuICAgIGlmIChfZGVmYXVsdFJ1bm5lcikge1xuICAgICAgICByZXR1cm4gX2RlZmF1bHRSdW5uZXI7XG4gICAgfVxuICAgIF9kZWZhdWx0UnVubmVyID0gbmV3IFJ1bm5lcigpO1xuICAgIHJldHVybiBfZGVmYXVsdFJ1bm5lcjtcbn1cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW4oYWdlbnQsIGlucHV0LCBvcHRpb25zKSB7XG4gICAgY29uc3QgcnVubmVyID0gZ2V0RGVmYXVsdFJ1bm5lcigpO1xuICAgIGlmIChvcHRpb25zPy5zdHJlYW0pIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHJ1bm5lci5ydW4oYWdlbnQsIGlucHV0LCBvcHRpb25zKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBydW5uZXIucnVuKGFnZW50LCBpbnB1dCwgb3B0aW9ucyk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cnVuLm1qcy5tYXAiLCJpbXBvcnQgeyBBZ2VudEhvb2tzIH0gZnJvbSBcIi4vbGlmZWN5Y2xlLm1qc1wiO1xuaW1wb3J0IHsgZ2V0QWxsTWNwVG9vbHMgfSBmcm9tIFwiLi9tY3AubWpzXCI7XG5pbXBvcnQgeyB0b29sLCB9IGZyb20gXCIuL3Rvb2wubWpzXCI7XG5pbXBvcnQgeyBSdW5uZXIgfSBmcm9tIFwiLi9ydW4ubWpzXCI7XG5pbXBvcnQgeyB0b0Z1bmN0aW9uVG9vbE5hbWUgfSBmcm9tIFwiLi91dGlscy90b29scy5tanNcIjtcbmltcG9ydCB7IGdldE91dHB1dFRleHQgfSBmcm9tIFwiLi91dGlscy9tZXNzYWdlcy5tanNcIjtcbmltcG9ydCB7IGlzQWdlbnRUb29sSW5wdXQgfSBmcm9tIFwiLi91dGlscy90eXBlR3VhcmRzLm1qc1wiO1xuaW1wb3J0IHsgaXNab2RPYmplY3QgfSBmcm9tIFwiLi91dGlscy90eXBlR3VhcmRzLm1qc1wiO1xuaW1wb3J0IHsgTW9kZWxCZWhhdmlvckVycm9yLCBVc2VyRXJyb3IgfSBmcm9tIFwiLi9lcnJvcnMubWpzXCI7XG5pbXBvcnQgbG9nZ2VyIGZyb20gXCIuL2xvZ2dlci5tanNcIjtcbi8qKlxuICogVGhlIGNsYXNzIHJlcHJlc2VudGluZyBhbiBBSSBhZ2VudCBjb25maWd1cmVkIHdpdGggaW5zdHJ1Y3Rpb25zLCB0b29scywgZ3VhcmRyYWlscywgaGFuZG9mZnMgYW5kIG1vcmUuXG4gKlxuICogV2Ugc3Ryb25nbHkgcmVjb21tZW5kIHBhc3NpbmcgYGluc3RydWN0aW9uc2AsIHdoaWNoIGlzIHRoZSBcInN5c3RlbSBwcm9tcHRcIiBmb3IgdGhlIGFnZW50LiBJblxuICogYWRkaXRpb24sIHlvdSBjYW4gcGFzcyBgaGFuZG9mZkRlc2NyaXB0aW9uYCwgd2hpY2ggaXMgYSBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGVcbiAqIGFnZW50LCB1c2VkIHdoZW4gdGhlIGFnZW50IGlzIHVzZWQgaW5zaWRlIHRvb2xzL2hhbmRvZmZzLlxuICpcbiAqIEFnZW50cyBhcmUgZ2VuZXJpYyBvbiB0aGUgY29udGV4dCB0eXBlLiBUaGUgY29udGV4dCBpcyBhIChtdXRhYmxlKSBvYmplY3QgeW91IGNyZWF0ZS4gSXQgaXNcbiAqIHBhc3NlZCB0byB0b29sIGZ1bmN0aW9ucywgaGFuZG9mZnMsIGd1YXJkcmFpbHMsIGV0Yy5cbiAqL1xuZXhwb3J0IGNsYXNzIEFnZW50IGV4dGVuZHMgQWdlbnRIb29rcyB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGFuIEFnZW50IHdpdGggaGFuZG9mZnMgYW5kIGF1dG9tYXRpY2FsbHkgaW5mZXIgdGhlIHVuaW9uIHR5cGUgZm9yIFRPdXRwdXQgZnJvbSB0aGUgaGFuZG9mZiBhZ2VudHMnIG91dHB1dCB0eXBlcy5cbiAgICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlKGNvbmZpZykge1xuICAgICAgICByZXR1cm4gbmV3IEFnZW50KHtcbiAgICAgICAgICAgIC4uLmNvbmZpZyxcbiAgICAgICAgICAgIGhhbmRvZmZzOiBjb25maWcuaGFuZG9mZnMsXG4gICAgICAgICAgICBvdXRwdXRUeXBlOiBjb25maWcub3V0cHV0VHlwZSxcbiAgICAgICAgICAgIGhhbmRvZmZPdXRwdXRUeXBlV2FybmluZ0VuYWJsZWQ6IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbmFtZTtcbiAgICBpbnN0cnVjdGlvbnM7XG4gICAgaGFuZG9mZkRlc2NyaXB0aW9uO1xuICAgIGhhbmRvZmZzO1xuICAgIG1vZGVsO1xuICAgIG1vZGVsU2V0dGluZ3M7XG4gICAgdG9vbHM7XG4gICAgbWNwU2VydmVycztcbiAgICBpbnB1dEd1YXJkcmFpbHM7XG4gICAgb3V0cHV0R3VhcmRyYWlscztcbiAgICBvdXRwdXRUeXBlID0gJ3RleHQnO1xuICAgIHRvb2xVc2VCZWhhdmlvcjtcbiAgICByZXNldFRvb2xDaG9pY2U7XG4gICAgY29uc3RydWN0b3IoY29uZmlnKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm5hbWUgIT09ICdzdHJpbmcnIHx8IGNvbmZpZy5uYW1lLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBVc2VyRXJyb3IoJ0FnZW50IG11c3QgaGF2ZSBhIG5hbWUuJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5uYW1lID0gY29uZmlnLm5hbWU7XG4gICAgICAgIHRoaXMuaW5zdHJ1Y3Rpb25zID0gY29uZmlnLmluc3RydWN0aW9ucyA/PyAnJztcbiAgICAgICAgdGhpcy5oYW5kb2ZmRGVzY3JpcHRpb24gPSBjb25maWcuaGFuZG9mZkRlc2NyaXB0aW9uID8/ICcnO1xuICAgICAgICB0aGlzLmhhbmRvZmZzID0gY29uZmlnLmhhbmRvZmZzID8/IFtdO1xuICAgICAgICB0aGlzLm1vZGVsID0gY29uZmlnLm1vZGVsID8/ICcnO1xuICAgICAgICB0aGlzLm1vZGVsU2V0dGluZ3MgPSBjb25maWcubW9kZWxTZXR0aW5ncyA/PyB7fTtcbiAgICAgICAgdGhpcy50b29scyA9IGNvbmZpZy50b29scyA/PyBbXTtcbiAgICAgICAgdGhpcy5tY3BTZXJ2ZXJzID0gY29uZmlnLm1jcFNlcnZlcnMgPz8gW107XG4gICAgICAgIHRoaXMuaW5wdXRHdWFyZHJhaWxzID0gY29uZmlnLmlucHV0R3VhcmRyYWlscyA/PyBbXTtcbiAgICAgICAgdGhpcy5vdXRwdXRHdWFyZHJhaWxzID0gY29uZmlnLm91dHB1dEd1YXJkcmFpbHMgPz8gW107XG4gICAgICAgIGlmIChjb25maWcub3V0cHV0VHlwZSkge1xuICAgICAgICAgICAgdGhpcy5vdXRwdXRUeXBlID0gY29uZmlnLm91dHB1dFR5cGU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50b29sVXNlQmVoYXZpb3IgPSBjb25maWcudG9vbFVzZUJlaGF2aW9yID8/ICdydW5fbGxtX2FnYWluJztcbiAgICAgICAgdGhpcy5yZXNldFRvb2xDaG9pY2UgPSBjb25maWcucmVzZXRUb29sQ2hvaWNlID8/IHRydWU7XG4gICAgICAgIC8vIC0tLSBSdW50aW1lIHdhcm5pbmcgZm9yIGhhbmRvZmYgb3V0cHV0IHR5cGUgY29tcGF0aWJpbGl0eSAtLS1cbiAgICAgICAgaWYgKGNvbmZpZy5oYW5kb2ZmT3V0cHV0VHlwZVdhcm5pbmdFbmFibGVkID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgIGNvbmZpZy5oYW5kb2ZmT3V0cHV0VHlwZVdhcm5pbmdFbmFibGVkKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oYW5kb2ZmcyAmJiB0aGlzLm91dHB1dFR5cGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBvdXRwdXRUeXBlcyA9IG5ldyBTZXQoW0pTT04uc3RyaW5naWZ5KHRoaXMub3V0cHV0VHlwZSldKTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGggb2YgdGhpcy5oYW5kb2Zmcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoJ291dHB1dFR5cGUnIGluIGggJiYgaC5vdXRwdXRUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRUeXBlcy5hZGQoSlNPTi5zdHJpbmdpZnkoaC5vdXRwdXRUeXBlKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoJ2FnZW50JyBpbiBoICYmIGguYWdlbnQub3V0cHV0VHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0VHlwZXMuYWRkKEpTT04uc3RyaW5naWZ5KGguYWdlbnQub3V0cHV0VHlwZSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChvdXRwdXRUeXBlcy5zaXplID4gMSkge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybihgW0FnZW50XSBXYXJuaW5nOiBIYW5kb2ZmIGFnZW50cyBoYXZlIGRpZmZlcmVudCBvdXRwdXQgdHlwZXM6ICR7QXJyYXkuZnJvbShvdXRwdXRUeXBlcykuam9pbignLCAnKX0uIFlvdSBjYW4gbWFrZSBpdCB0eXBlLXNhZmUgYnkgdXNpbmcgQWdlbnQuY3JlYXRlKHsgLi4uIH0pIG1ldGhvZCBpbnN0ZWFkLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBPdXB1dCBzY2hlbWEgbmFtZVxuICAgICAqL1xuICAgIGdldCBvdXRwdXRTY2hlbWFOYW1lKCkge1xuICAgICAgICBpZiAodGhpcy5vdXRwdXRUeXBlID09PSAndGV4dCcpIHtcbiAgICAgICAgICAgIHJldHVybiAndGV4dCc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNab2RPYmplY3QodGhpcy5vdXRwdXRUeXBlKSkge1xuICAgICAgICAgICAgcmV0dXJuICdab2RPdXRwdXQnO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiB0aGlzLm91dHB1dFR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5vdXRwdXRUeXBlLm5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIG91dHB1dCB0eXBlOiAke3RoaXMub3V0cHV0VHlwZX1gKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTWFrZXMgYSBjb3B5IG9mIHRoZSBhZ2VudCwgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzIGNoYW5nZWQuIEZvciBleGFtcGxlLCB5b3UgY291bGQgZG86XG4gICAgICpcbiAgICAgKiBgYGBcbiAgICAgKiBjb25zdCBuZXdBZ2VudCA9IGFnZW50LmNsb25lKHsgaW5zdHJ1Y3Rpb25zOiAnTmV3IGluc3RydWN0aW9ucycgfSlcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb25maWcgLSBBIHBhcnRpYWwgY29uZmlndXJhdGlvbiB0byBjaGFuZ2UuXG4gICAgICogQHJldHVybnMgQSBuZXcgYWdlbnQgd2l0aCB0aGUgZ2l2ZW4gY2hhbmdlcy5cbiAgICAgKi9cbiAgICBjbG9uZShjb25maWcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBZ2VudCh7XG4gICAgICAgICAgICAuLi50aGlzLFxuICAgICAgICAgICAgLi4uY29uZmlnLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVHJhbnNmb3JtIHRoaXMgYWdlbnQgaW50byBhIHRvb2wsIGNhbGxhYmxlIGJ5IG90aGVyIGFnZW50cy5cbiAgICAgKlxuICAgICAqIFRoaXMgaXMgZGlmZmVyZW50IGZyb20gaGFuZG9mZnMgaW4gdHdvIHdheXM6XG4gICAgICogMS4gSW4gaGFuZG9mZnMsIHRoZSBuZXcgYWdlbnQgcmVjZWl2ZXMgdGhlIGNvbnZlcnNhdGlvbiBoaXN0b3J5LiBJbiB0aGlzIHRvb2wsIHRoZSBuZXcgYWdlbnRcbiAgICAgKiAgICByZWNlaXZlcyBnZW5lcmF0ZWQgaW5wdXQuXG4gICAgICogMi4gSW4gaGFuZG9mZnMsIHRoZSBuZXcgYWdlbnQgdGFrZXMgb3ZlciB0aGUgY29udmVyc2F0aW9uLiBJbiB0aGlzIHRvb2wsIHRoZSBuZXcgYWdlbnQgaXNcbiAgICAgKiAgICBjYWxsZWQgYXMgYSB0b29sLCBhbmQgdGhlIGNvbnZlcnNhdGlvbiBpcyBjb250aW51ZWQgYnkgdGhlIG9yaWdpbmFsIGFnZW50LlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIGZvciB0aGUgdG9vbC5cbiAgICAgKiBAcmV0dXJucyBBIHRvb2wgdGhhdCBydW5zIHRoZSBhZ2VudCBhbmQgcmV0dXJucyB0aGUgb3V0cHV0IHRleHQuXG4gICAgICovXG4gICAgYXNUb29sKG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgeyB0b29sTmFtZSwgdG9vbERlc2NyaXB0aW9uLCBjdXN0b21PdXRwdXRFeHRyYWN0b3IgfSA9IG9wdGlvbnM7XG4gICAgICAgIHJldHVybiB0b29sKHtcbiAgICAgICAgICAgIG5hbWU6IHRvb2xOYW1lID8/IHRvRnVuY3Rpb25Ub29sTmFtZSh0aGlzLm5hbWUpLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IHRvb2xEZXNjcmlwdGlvbiA/PyAnJyxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAgICAgICAgIGlucHV0OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiBbJ2lucHV0J10sXG4gICAgICAgICAgICAgICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IGZhbHNlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHN0cmljdDogdHJ1ZSxcbiAgICAgICAgICAgIGV4ZWN1dGU6IGFzeW5jIChkYXRhLCBjb250ZXh0KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc0FnZW50VG9vbElucHV0KGRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBNb2RlbEJlaGF2aW9yRXJyb3IoJ0FnZW50IHRvb2wgY2FsbGVkIHdpdGggaW52YWxpZCBpbnB1dCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBydW5uZXIgPSBuZXcgUnVubmVyKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnVubmVyLnJ1bih0aGlzLCBkYXRhLmlucHV0LCB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IGNvbnRleHQ/LmNvbnRleHQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjdXN0b21PdXRwdXRFeHRyYWN0b3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN1c3RvbU91dHB1dEV4dHJhY3RvcihyZXN1bHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0T3V0cHV0VGV4dChyZXN1bHQucmF3UmVzcG9uc2VzW3Jlc3VsdC5yYXdSZXNwb25zZXMubGVuZ3RoIC0gMV0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHN5c3RlbSBwcm9tcHQgZm9yIHRoZSBhZ2VudC5cbiAgICAgKlxuICAgICAqIElmIHRoZSBhZ2VudCBoYXMgYSBmdW5jdGlvbiBhcyBpdHMgaW5zdHJ1Y3Rpb25zLCB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlXG4gICAgICogcnVuQ29udGV4dCBhbmQgdGhlIGFnZW50IGluc3RhbmNlLlxuICAgICAqL1xuICAgIGFzeW5jIGdldFN5c3RlbVByb21wdChydW5Db250ZXh0KSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5pbnN0cnVjdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmluc3RydWN0aW9ucyhydW5Db250ZXh0LCB0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5pbnN0cnVjdGlvbnM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZldGNoZXMgdGhlIGF2YWlsYWJsZSB0b29scyBmcm9tIHRoZSBNQ1Agc2VydmVycy5cbiAgICAgKiBAcmV0dXJucyB0aGUgTUNQIHBvd2VyZWQgdG9vbHNcbiAgICAgKi9cbiAgICBhc3luYyBnZXRNY3BUb29scygpIHtcbiAgICAgICAgaWYgKHRoaXMubWNwU2VydmVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0QWxsTWNwVG9vbHModGhpcy5tY3BTZXJ2ZXJzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFMbCBhZ2VudCB0b29scywgaW5jbHVkaW5nIHRoZSBNQ1BsIGFuZCBmdW5jdGlvbiB0b29scy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIGFsbCBjb25maWd1cmVkIHRvb2xzXG4gICAgICovXG4gICAgYXN5bmMgZ2V0QWxsVG9vbHMoKSB7XG4gICAgICAgIHJldHVybiBbLi4uKGF3YWl0IHRoaXMuZ2V0TWNwVG9vbHMoKSksIC4uLnRoaXMudG9vbHNdO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzZXMgdGhlIGZpbmFsIG91dHB1dCBvZiB0aGUgYWdlbnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3V0cHV0IC0gVGhlIG91dHB1dCBvZiB0aGUgYWdlbnQuXG4gICAgICogQHJldHVybnMgVGhlIHBhcnNlZCBvdXQuXG4gICAgICovXG4gICAgcHJvY2Vzc0ZpbmFsT3V0cHV0KG91dHB1dCkge1xuICAgICAgICBpZiAodGhpcy5vdXRwdXRUeXBlID09PSAndGV4dCcpIHtcbiAgICAgICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm91dHB1dFR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKG91dHB1dCk7XG4gICAgICAgICAgICBpZiAoaXNab2RPYmplY3QodGhpcy5vdXRwdXRUeXBlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm91dHB1dFR5cGUucGFyc2UocGFyc2VkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwYXJzZWQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIG91dHB1dCB0eXBlOiAke3RoaXMub3V0cHV0VHlwZX1gKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhlIGFnZW50LCB3aGljaCBpcyBzZXJpYWxpemFibGUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBIEpTT04gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGFnZW50J3MgbmFtZS5cbiAgICAgKi9cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgIH07XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YWdlbnQubWpzLm1hcCIsImltcG9ydCBsb2dnZXIgZnJvbSBcIi4vbG9nZ2VyLm1qc1wiO1xuaW1wb3J0IHsgYWRkVHJhY2VQcm9jZXNzb3IgfSBmcm9tIFwiLi90cmFjaW5nL2luZGV4Lm1qc1wiO1xuaW1wb3J0IHsgZGVmYXVsdFByb2Nlc3NvciB9IGZyb20gXCIuL3RyYWNpbmcvcHJvY2Vzc29yLm1qc1wiO1xuaW1wb3J0IHsgZ2V0R2xvYmFsVHJhY2VQcm92aWRlciB9IGZyb20gXCIuL3RyYWNpbmcvcHJvdmlkZXIubWpzXCI7XG5leHBvcnQgeyBSdW50aW1lRXZlbnRFbWl0dGVyIH0gZnJvbSAnQG9wZW5haS9hZ2VudHMtY29yZS9fc2hpbXMnO1xuZXhwb3J0IHsgQWdlbnQsIH0gZnJvbSBcIi4vYWdlbnQubWpzXCI7XG5leHBvcnQgeyBBZ2VudHNFcnJvciwgR3VhcmRyYWlsRXhlY3V0aW9uRXJyb3IsIElucHV0R3VhcmRyYWlsVHJpcHdpcmVUcmlnZ2VyZWQsIE1heFR1cm5zRXhjZWVkZWRFcnJvciwgTW9kZWxCZWhhdmlvckVycm9yLCBPdXRwdXRHdWFyZHJhaWxUcmlwd2lyZVRyaWdnZXJlZCwgVG9vbENhbGxFcnJvciwgVXNlckVycm9yLCBTeXN0ZW1FcnJvciwgfSBmcm9tIFwiLi9lcnJvcnMubWpzXCI7XG5leHBvcnQgeyBSdW5BZ2VudFVwZGF0ZWRTdHJlYW1FdmVudCwgUnVuUmF3TW9kZWxTdHJlYW1FdmVudCwgUnVuSXRlbVN0cmVhbUV2ZW50LCB9IGZyb20gXCIuL2V2ZW50cy5tanNcIjtcbmV4cG9ydCB7IGRlZmluZU91dHB1dEd1YXJkcmFpbCwgfSBmcm9tIFwiLi9ndWFyZHJhaWwubWpzXCI7XG5leHBvcnQgeyBnZXRIYW5kb2ZmLCBnZXRUcmFuc2Zlck1lc3NhZ2UsIEhhbmRvZmYsIGhhbmRvZmYsIH0gZnJvbSBcIi4vaGFuZG9mZi5tanNcIjtcbmV4cG9ydCB7IGFzc2lzdGFudCwgc3lzdGVtLCB1c2VyIH0gZnJvbSBcIi4vaGVscGVycy9tZXNzYWdlLm1qc1wiO1xuZXhwb3J0IHsgZXh0cmFjdEFsbFRleHRPdXRwdXQsIFJ1bkhhbmRvZmZDYWxsSXRlbSwgUnVuTWVzc2FnZU91dHB1dEl0ZW0sIFJ1blJlYXNvbmluZ0l0ZW0sIFJ1blRvb2xBcHByb3ZhbEl0ZW0sIFJ1blRvb2xDYWxsSXRlbSwgUnVuVG9vbENhbGxPdXRwdXRJdGVtLCB9IGZyb20gXCIuL2l0ZW1zLm1qc1wiO1xuZXhwb3J0IHsgQWdlbnRIb29rcyB9IGZyb20gXCIuL2xpZmVjeWNsZS5tanNcIjtcbmV4cG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCIuL2xvZ2dlci5tanNcIjtcbmV4cG9ydCB7IGdldEFsbE1jcFRvb2xzLCBpbnZhbGlkYXRlU2VydmVyVG9vbHNDYWNoZSwgTUNQU2VydmVyU3RkaW8sIH0gZnJvbSBcIi4vbWNwLm1qc1wiO1xuZXhwb3J0IHsgc2V0RGVmYXVsdE1vZGVsUHJvdmlkZXIgfSBmcm9tIFwiLi9wcm92aWRlcnMubWpzXCI7XG5leHBvcnQgeyBSdW5SZXN1bHQsIFN0cmVhbWVkUnVuUmVzdWx0IH0gZnJvbSBcIi4vcmVzdWx0Lm1qc1wiO1xuZXhwb3J0IHsgcnVuLCBSdW5uZXIsIH0gZnJvbSBcIi4vcnVuLm1qc1wiO1xuZXhwb3J0IHsgUnVuQ29udGV4dCB9IGZyb20gXCIuL3J1bkNvbnRleHQubWpzXCI7XG5leHBvcnQgeyBSdW5TdGF0ZSB9IGZyb20gXCIuL3J1blN0YXRlLm1qc1wiO1xuZXhwb3J0IHsgY29tcHV0ZXJUb29sLCB0b29sLCB9IGZyb20gXCIuL3Rvb2wubWpzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi90cmFjaW5nL2luZGV4Lm1qc1wiO1xuZXhwb3J0IHsgZ2V0R2xvYmFsVHJhY2VQcm92aWRlciwgVHJhY2VQcm92aWRlciB9IGZyb20gXCIuL3RyYWNpbmcvcHJvdmlkZXIubWpzXCI7XG5leHBvcnQgeyBVc2FnZSB9IGZyb20gXCIuL3VzYWdlLm1qc1wiO1xuZXhwb3J0ICogYXMgcHJvdG9jb2wgZnJvbSBcIi4vdHlwZXMvcHJvdG9jb2wubWpzXCI7XG4vKipcbiAqIEFkZCB0aGUgZGVmYXVsdCBwcm9jZXNzb3IsIHdoaWNoIGV4cG9ydHMgdHJhY2VzIGFuZCBzcGFucyB0byB0aGUgYmFja2VuZCBpbiBiYXRjaGVzLiBZb3UgY2FuXG4gKiBjaGFuZ2UgdGhlIGRlZmF1bHQgYmVoYXZpb3IgYnkgZWl0aGVyOlxuICogMS4gY2FsbGluZyBhZGRUcmFjZVByb2Nlc3Nvciwgd2hpY2ggYWRkcyBhZGRpdGlvbmFsIHByb2Nlc3NvcnMsIG9yXG4gKiAyLiBjYWxsaW5nIHNldFRyYWNlUHJvY2Vzc29ycywgd2hpY2ggc2V0cyB0aGUgcHJvY2Vzc29ycyBhbmQgZGlzY2FyZHMgdGhlIGRlZmF1bHQgb25lXG4gKi9cbmFkZFRyYWNlUHJvY2Vzc29yKGRlZmF1bHRQcm9jZXNzb3IoKSk7XG5jb25zdCBjbGVhbnVwID0gYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGdldEdsb2JhbFRyYWNlUHJvdmlkZXIoKS5zaHV0ZG93bigpO1xufTtcbmlmICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAvLyBoYW5kbGluZyBOb2RlLmpzIHByb2Nlc3MgdGVybWluYXRpb25cbiAgICAvLyBIYW5kbGUgbm9ybWFsIHRlcm1pbmF0aW9uXG4gICAgcHJvY2Vzcy5vbignYmVmb3JlRXhpdCcsIGNsZWFudXApO1xuICAgIC8vIEhhbmRsZSBDVFJMK0MgKFNJR0lOVClcbiAgICBwcm9jZXNzLm9uKCdTSUdJTlQnLCBjbGVhbnVwKTtcbiAgICAvLyBIYW5kbGUgdGVybWluYXRpb24gKFNJR1RFUk0pXG4gICAgcHJvY2Vzcy5vbignU0lHVEVSTScsIGNsZWFudXApO1xuICAgIHByb2Nlc3Mub24oJ3VuaGFuZGxlZFJlamVjdGlvbicsIChyZWFzb24sIHByb21pc2UpID0+IHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKCdVbmhhbmRsZWQgcmVqZWN0aW9uJywgcmVhc29uLCBwcm9taXNlKTtcbiAgICAgICAgY2xlYW51cCgpO1xuICAgIH0pO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXgubWpzLm1hcCIsImltcG9ydCB7IEFnZW50LCB9IGZyb20gJ0BvcGVuYWkvYWdlbnRzLWNvcmUnO1xuLyoqXG4gKiBBIHNwZWNpYWxpemVkIGFnZW50IGluc3RhbmNlIHRoYXQgaXMgbWVhbnQgdG8gYmUgdXNlZCB3aXRoaW4gYSBgUmVhbHRpbWVTZXNzaW9uYCB0byBidWlsZFxuICogdm9pY2UgYWdlbnRzLiBEdWUgdG8gdGhlIG5hdHVyZSBvZiB0aGlzIGFnZW50LCBzb21lIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhcmUgbm90IHN1cHBvcnRlZFxuICogdGhhdCBhcmUgc3VwcG9ydGVkIGJ5IHJlZ3VsYXIgYEFnZW50YCBpbnN0YW5jZXMuIEZvciBleGFtcGxlOlxuICogLSBgbW9kZWxgIGNob2ljZSBpcyBub3Qgc3VwcG9ydGVkIGFzIGFsbCBSZWFsdGltZUFnZW50cyB3aWxsIGJlIGhhbmRsZWQgYnkgdGhlIHNhbWUgbW9kZWwgd2l0aGluXG4gKiAgIGEgYFJlYWx0aW1lU2Vzc2lvbmBcbiAqIC0gYG1vZGVsU2V0dGluZ3NgIGlzIG5vdCBzdXBwb3J0ZWQgYXMgYWxsIFJlYWx0aW1lQWdlbnRzIHdpbGwgYmUgaGFuZGxlZCBieSB0aGUgc2FtZSBtb2RlbCB3aXRoaW5cbiAqICAgYSBgUmVhbHRpbWVTZXNzaW9uYFxuICogLSBgb3V0cHV0VHlwZWAgaXMgbm90IHN1cHBvcnRlZCBhcyBSZWFsdGltZUFnZW50cyBkbyBub3Qgc3VwcG9ydCBzdHJ1Y3R1cmVkIG91dHB1dHNcbiAqIC0gYHRvb2xVc2VCZWhhdmlvcmAgaXMgbm90IHN1cHBvcnRlZCBhcyBhbGwgUmVhbHRpbWVBZ2VudHMgd2lsbCBiZSBoYW5kbGVkIGJ5IHRoZSBzYW1lIG1vZGVsIHdpdGhpblxuICogICBhIGBSZWFsdGltZVNlc3Npb25gXG4gKiAtIGB2b2ljZWAgY2FuIGJlIGNvbmZpZ3VyZWQgb24gYW4gYEFnZW50YCBsZXZlbCBob3dldmVyIGl0IGNhbm5vdCBiZSBjaGFuZ2VkIGFmdGVyIHRoZSBmaXJzdFxuICogICAgYWdlbnQgd2l0aGluIGEgYFJlYWx0aW1lU2Vzc2lvbmAgc3Bva2VcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGNvbnN0IGFnZW50ID0gbmV3IFJlYWx0aW1lQWdlbnQoe1xuICogICBuYW1lOiAnbXktYWdlbnQnLFxuICogICBpbnN0cnVjdGlvbnM6ICdZb3UgYXJlIGEgaGVscGZ1bCBhc3Npc3RhbnQgdGhhdCBjYW4gYW5zd2VyIHF1ZXN0aW9ucyBhbmQgaGVscCB3aXRoIHRhc2tzLicsXG4gKiB9KVxuICpcbiAqIGNvbnN0IHNlc3Npb24gPSBuZXcgUmVhbHRpbWVTZXNzaW9uKGFnZW50KTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgUmVhbHRpbWVBZ2VudCBleHRlbmRzIEFnZW50IHtcbiAgICAvKipcbiAgICAgKiBUaGUgdm9pY2UgaW50ZW5kZWQgdG8gYmUgdXNlZCBieSB0aGUgYWdlbnQuIElmIGFub3RoZXIgYWdlbnQgYWxyZWFkeSBzcG9rZSBkdXJpbmcgdGhlXG4gICAgICogUmVhbHRpbWVTZXNzaW9uLCBjaGFuZ2luZyB0aGUgdm9pY2UgZHVyaW5nIGEgaGFuZG9mZiB3aWxsIGZhaWwuXG4gICAgICovXG4gICAgdm9pY2U7XG4gICAgY29uc3RydWN0b3IoY29uZmlnKSB7XG4gICAgICAgIHN1cGVyKGNvbmZpZyk7XG4gICAgICAgIHRoaXMudm9pY2UgPSBjb25maWcudm9pY2UgPz8gJ2FzaCc7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmVhbHRpbWVBZ2VudC5tanMubWFwIiwiaW1wb3J0IHsgZGVmaW5lT3V0cHV0R3VhcmRyYWlsLCB9IGZyb20gJ0BvcGVuYWkvYWdlbnRzLWNvcmUnO1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJlYWx0aW1lR3VhcmRyYWlsU2V0dGluZ3Moc2V0dGluZ3MpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBkZWJvdW5jZVRleHRMZW5ndGg6IHNldHRpbmdzLmRlYm91bmNlVGV4dExlbmd0aCA/PyAxMDAsXG4gICAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVSZWFsdGltZU91dHB1dEd1YXJkcmFpbCh7IHBvbGljeUhpbnQ6IHBvbGljeUhpbnRJbnB1dCwgLi4ub3B0aW9ucyB9KSB7XG4gICAgY29uc3QgYmFzZUd1YXJkcmFpbCA9IGRlZmluZU91dHB1dEd1YXJkcmFpbChvcHRpb25zKTtcbiAgICBjb25zdCBwb2xpY3lIaW50ID0gcG9saWN5SGludElucHV0ID8/IGJhc2VHdWFyZHJhaWwubmFtZTtcbiAgICByZXR1cm4ge1xuICAgICAgICAuLi5iYXNlR3VhcmRyYWlsLFxuICAgICAgICBwb2xpY3lIaW50LFxuICAgICAgICBydW46IGFzeW5jIChhcmdzKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBiYXNlR3VhcmRyYWlsLnJ1bihhcmdzKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLi4ucmVzdWx0LFxuICAgICAgICAgICAgICAgIGd1YXJkcmFpbDogeyAuLi5yZXN1bHQuZ3VhcmRyYWlsLCBwb2xpY3lIaW50IH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgIH07XG59XG4vKipcbiAqIEdlbmVyYXRlcyBhIG1lc3NhZ2UgdGhhdCBpbmZvcm1zIHRoZSBtb2RlbCBhYm91dCB3aHkgdGhlIGd1YXJkcmFpbCB3YXMgdHJpZ2dlcmVkIGFuZCB0b1xuICogY29ycmVjdCB0aGUgYmVoYXZpb3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZWFsdGltZUd1YXJkcmFpbEZlZWRiYWNrTWVzc2FnZShyZXN1bHQpIHtcbiAgICByZXR1cm4gYFxu4pqg77iPIFlvdXIgbGFzdCBhbnN3ZXIgd2FzIGJsb2NrZWQuIFxuRmFpbGVkIEd1YXJkcmFpbCBSZWFzb246ICR7cmVzdWx0Lmd1YXJkcmFpbC5wb2xpY3lIaW50fS4gXG5GYWlsdXJlIERldGFpbHM6ICR7SlNPTi5zdHJpbmdpZnkocmVzdWx0Lm91dHB1dC5vdXRwdXRJbmZvID8/IHt9KX0uIFxuUGxlYXNlIHJlc3BvbmQgYWdhaW4gZm9sbG93aW5nIHBvbGljeS4gQXBvbG9naXplIGZvciBub3QgYmVpbmcgYWJsZSB0byBhbnN3ZXIgdGhlIHF1ZXN0aW9uICh3aGlsZSBhdm9pZGluZyB0aGUgc3BlY2lmaWMgcmVhc29uKSBhbmQgZGl2ZXJ0IGRpc2N1c3Npb24gYmFjayB0byBhbiBhcHByb3ZlZCB0b3BpYyBpbW1lZGlhdGVseSBhbmQgbm90IGludml0ZSBtb3JlIGRpc2N1c3Npb24uXG5gLnRyaW0oKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWd1YXJkcmFpbC5tanMubWFwIiwiaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnQG9wZW5haS9hZ2VudHMtY29yZSc7XG5jb25zdCBsb2dnZXIgPSBnZXRMb2dnZXIoJ29wZW5haS1hZ2VudHM6cmVhbHRpbWUnKTtcbmV4cG9ydCBkZWZhdWx0IGxvZ2dlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxvZ2dlci5tanMubWFwIiwiaW1wb3J0IHsgeiB9IGZyb20gJ0BvcGVuYWkvem9kL3YzJztcbmV4cG9ydCBjb25zdCBiYXNlSXRlbVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgICBpdGVtSWQ6IHouc3RyaW5nKCksXG59KTtcbmV4cG9ydCBjb25zdCByZWFsdGltZU1lc3NhZ2VJdGVtU2NoZW1hID0gei5kaXNjcmltaW5hdGVkVW5pb24oJ3JvbGUnLCBbXG4gICAgei5vYmplY3Qoe1xuICAgICAgICBpdGVtSWQ6IHouc3RyaW5nKCksXG4gICAgICAgIHByZXZpb3VzSXRlbUlkOiB6LnN0cmluZygpLm51bGxhYmxlKCkub3B0aW9uYWwoKSxcbiAgICAgICAgdHlwZTogei5saXRlcmFsKCdtZXNzYWdlJyksXG4gICAgICAgIHJvbGU6IHoubGl0ZXJhbCgnc3lzdGVtJyksXG4gICAgICAgIGNvbnRlbnQ6IHouYXJyYXkoei5vYmplY3QoeyB0eXBlOiB6LmxpdGVyYWwoJ2lucHV0X3RleHQnKSwgdGV4dDogei5zdHJpbmcoKSB9KSksXG4gICAgfSksXG4gICAgei5vYmplY3Qoe1xuICAgICAgICBpdGVtSWQ6IHouc3RyaW5nKCksXG4gICAgICAgIHByZXZpb3VzSXRlbUlkOiB6LnN0cmluZygpLm51bGxhYmxlKCkub3B0aW9uYWwoKSxcbiAgICAgICAgdHlwZTogei5saXRlcmFsKCdtZXNzYWdlJyksXG4gICAgICAgIHJvbGU6IHoubGl0ZXJhbCgndXNlcicpLFxuICAgICAgICBzdGF0dXM6IHouZW51bShbJ2luX3Byb2dyZXNzJywgJ2NvbXBsZXRlZCddKSxcbiAgICAgICAgY29udGVudDogei5hcnJheSh6Lm9iamVjdCh7IHR5cGU6IHoubGl0ZXJhbCgnaW5wdXRfdGV4dCcpLCB0ZXh0OiB6LnN0cmluZygpIH0pLm9yKHoub2JqZWN0KHtcbiAgICAgICAgICAgIHR5cGU6IHoubGl0ZXJhbCgnaW5wdXRfYXVkaW8nKSxcbiAgICAgICAgICAgIGF1ZGlvOiB6LnN0cmluZygpLm51bGxhYmxlKCkub3B0aW9uYWwoKSxcbiAgICAgICAgICAgIHRyYW5zY3JpcHQ6IHouc3RyaW5nKCkubnVsbGFibGUoKSxcbiAgICAgICAgfSkpKSxcbiAgICB9KSxcbiAgICB6Lm9iamVjdCh7XG4gICAgICAgIGl0ZW1JZDogei5zdHJpbmcoKSxcbiAgICAgICAgcHJldmlvdXNJdGVtSWQ6IHouc3RyaW5nKCkubnVsbGFibGUoKS5vcHRpb25hbCgpLFxuICAgICAgICB0eXBlOiB6LmxpdGVyYWwoJ21lc3NhZ2UnKSxcbiAgICAgICAgcm9sZTogei5saXRlcmFsKCdhc3Npc3RhbnQnKSxcbiAgICAgICAgc3RhdHVzOiB6LmVudW0oWydpbl9wcm9ncmVzcycsICdjb21wbGV0ZWQnLCAnaW5jb21wbGV0ZSddKSxcbiAgICAgICAgY29udGVudDogei5hcnJheSh6Lm9iamVjdCh7IHR5cGU6IHoubGl0ZXJhbCgndGV4dCcpLCB0ZXh0OiB6LnN0cmluZygpIH0pLm9yKHoub2JqZWN0KHtcbiAgICAgICAgICAgIHR5cGU6IHoubGl0ZXJhbCgnYXVkaW8nKSxcbiAgICAgICAgICAgIGF1ZGlvOiB6LnN0cmluZygpLm51bGxhYmxlKCkub3B0aW9uYWwoKSxcbiAgICAgICAgICAgIHRyYW5zY3JpcHQ6IHouc3RyaW5nKCkubnVsbGFibGUoKS5vcHRpb25hbCgpLFxuICAgICAgICB9KSkpLFxuICAgIH0pLFxuXSk7XG5leHBvcnQgY29uc3QgcmVhbHRpbWVUb29sQ2FsbEl0ZW0gPSB6Lm9iamVjdCh7XG4gICAgaXRlbUlkOiB6LnN0cmluZygpLFxuICAgIHByZXZpb3VzSXRlbUlkOiB6LnN0cmluZygpLm51bGxhYmxlKCkub3B0aW9uYWwoKSxcbiAgICB0eXBlOiB6LmxpdGVyYWwoJ2Z1bmN0aW9uX2NhbGwnKSxcbiAgICBzdGF0dXM6IHouZW51bShbJ2luX3Byb2dyZXNzJywgJ2NvbXBsZXRlZCddKSxcbiAgICBhcmd1bWVudHM6IHouc3RyaW5nKCksXG4gICAgbmFtZTogei5zdHJpbmcoKSxcbiAgICBvdXRwdXQ6IHouc3RyaW5nKCkubnVsbGFibGUoKSxcbn0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aXRlbXMubWpzLm1hcCIsImltcG9ydCB7IHogfSBmcm9tICdAb3BlbmFpL3pvZC92Myc7XG4vLyBFdmVudCBzY2hlbWFzIG1pcnJvcmluZyB0aGUgc3RydWN0dXJlcyBkZWZpbmVkIGluIHRoZSBPcGVuQUkgU0RLIHR5cGluZ3MuXG4vLyBNb3N0IGZpZWxkcyBmcm9tIHRoZSBpbnRlcmZhY2VzIGluIGByZWFsdGltZS5kLnRzYCBhcmUgY2FwdHVyZWQgaGVyZSB0b1xuLy8gcHJvdmlkZSBiZXR0ZXIgcnVudGltZSB2YWxpZGF0aW9uIHdoZW4gcGFyc2luZyBldmVudHMgZnJvbSB0aGUgc2VydmVyLlxuZXhwb3J0IGNvbnN0IHJlYWx0aW1lUmVzcG9uc2UgPSB6Lm9iamVjdCh7XG4gICAgaWQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICBjb252ZXJzYXRpb25faWQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICBtYXhfb3V0cHV0X3Rva2Vuczogei5udW1iZXIoKS5vcih6LmxpdGVyYWwoJ2luZicpKS5vcHRpb25hbCgpLFxuICAgIG1ldGFkYXRhOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LmFueSgpKS5vcHRpb25hbCgpLm51bGxhYmxlKCksXG4gICAgbW9kYWxpdGllczogei5hcnJheSh6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgIG9iamVjdDogei5saXRlcmFsKCdyZWFsdGltZS5yZXNwb25zZScpLm9wdGlvbmFsKCksXG4gICAgb3V0cHV0OiB6LmFycmF5KHouYW55KCkpLm9wdGlvbmFsKCksXG4gICAgb3V0cHV0X2F1ZGlvX2Zvcm1hdDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIHN0YXR1czogei5lbnVtKFsnY29tcGxldGVkJywgJ2luY29tcGxldGUnLCAnZmFpbGVkJywgJ2NhbmNlbGxlZCddKS5vcHRpb25hbCgpLFxuICAgIHN0YXR1c19kZXRhaWxzOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LmFueSgpKS5vcHRpb25hbCgpLm51bGxhYmxlKCksXG4gICAgdXNhZ2U6IHpcbiAgICAgICAgLm9iamVjdCh7XG4gICAgICAgIGlucHV0X3Rva2Vuczogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICAgICAgICBpbnB1dF90b2tlbnNfZGV0YWlsczogei5yZWNvcmQoei5zdHJpbmcoKSwgei5hbnkoKSkub3B0aW9uYWwoKS5udWxsYWJsZSgpLFxuICAgICAgICBvdXRwdXRfdG9rZW5zOiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gICAgICAgIG91dHB1dF90b2tlbnNfZGV0YWlsczogelxuICAgICAgICAgICAgLnJlY29yZCh6LnN0cmluZygpLCB6LmFueSgpKVxuICAgICAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgICAgIC5udWxsYWJsZSgpLFxuICAgIH0pXG4gICAgICAgIC5vcHRpb25hbCgpLFxuICAgIHZvaWNlOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG59KTtcbi8vIEJhc2ljIGNvbnRlbnQgc2NoZW1hIHVzZWQgYnkgQ29udmVyc2F0aW9uSXRlbS5cbmV4cG9ydCBjb25zdCBjb252ZXJzYXRpb25JdGVtQ29udGVudFNjaGVtYSA9IHoub2JqZWN0KHtcbiAgICBpZDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIGF1ZGlvOiB6LnN0cmluZygpLm51bGxhYmxlKCkub3B0aW9uYWwoKSxcbiAgICB0ZXh0OiB6LnN0cmluZygpLm51bGxhYmxlKCkub3B0aW9uYWwoKSxcbiAgICB0cmFuc2NyaXB0OiB6LnN0cmluZygpLm51bGxhYmxlKCkub3B0aW9uYWwoKSxcbiAgICB0eXBlOiB6LnVuaW9uKFtcbiAgICAgICAgei5saXRlcmFsKCdpbnB1dF90ZXh0JyksXG4gICAgICAgIHoubGl0ZXJhbCgnaW5wdXRfYXVkaW8nKSxcbiAgICAgICAgei5saXRlcmFsKCdpdGVtX3JlZmVyZW5jZScpLFxuICAgICAgICB6LmxpdGVyYWwoJ3RleHQnKSxcbiAgICAgICAgei5saXRlcmFsKCdhdWRpbycpLFxuICAgIF0pLFxufSk7XG5leHBvcnQgY29uc3QgY29udmVyc2F0aW9uSXRlbVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgICBpZDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIGFyZ3VtZW50czogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIGNhbGxfaWQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICBjb250ZW50OiB6LmFycmF5KGNvbnZlcnNhdGlvbkl0ZW1Db250ZW50U2NoZW1hKS5vcHRpb25hbCgpLFxuICAgIG5hbWU6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICBvYmplY3Q6IHoubGl0ZXJhbCgncmVhbHRpbWUuaXRlbScpLm9wdGlvbmFsKCksXG4gICAgb3V0cHV0OiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgcm9sZTogei5lbnVtKFsndXNlcicsICdhc3Npc3RhbnQnLCAnc3lzdGVtJ10pLm9wdGlvbmFsKCksXG4gICAgc3RhdHVzOiB6LmVudW0oWydjb21wbGV0ZWQnLCAnaW5jb21wbGV0ZScsICdpbl9wcm9ncmVzcyddKS5vcHRpb25hbCgpLFxuICAgIHR5cGU6IHouZW51bShbJ21lc3NhZ2UnLCAnZnVuY3Rpb25fY2FsbCcsICdmdW5jdGlvbl9jYWxsX291dHB1dCddKS5vcHRpb25hbCgpLFxufSk7XG5leHBvcnQgY29uc3QgY29udmVyc2F0aW9uQ3JlYXRlZEV2ZW50U2NoZW1hID0gei5vYmplY3Qoe1xuICAgIHR5cGU6IHoubGl0ZXJhbCgnY29udmVyc2F0aW9uLmNyZWF0ZWQnKSxcbiAgICBldmVudF9pZDogei5zdHJpbmcoKSxcbiAgICBjb252ZXJzYXRpb246IHoub2JqZWN0KHtcbiAgICAgICAgaWQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICAgICAgb2JqZWN0OiB6LmxpdGVyYWwoJ3JlYWx0aW1lLmNvbnZlcnNhdGlvbicpLm9wdGlvbmFsKCksXG4gICAgfSksXG59KTtcbmV4cG9ydCBjb25zdCBjb252ZXJzYXRpb25JdGVtQ3JlYXRlZEV2ZW50U2NoZW1hID0gei5vYmplY3Qoe1xuICAgIHR5cGU6IHoubGl0ZXJhbCgnY29udmVyc2F0aW9uLml0ZW0uY3JlYXRlZCcpLFxuICAgIGV2ZW50X2lkOiB6LnN0cmluZygpLFxuICAgIGl0ZW06IGNvbnZlcnNhdGlvbkl0ZW1TY2hlbWEsXG4gICAgcHJldmlvdXNfaXRlbV9pZDogei5zdHJpbmcoKS5udWxsYWJsZSgpLm9wdGlvbmFsKCksXG59KTtcbmV4cG9ydCBjb25zdCBjb252ZXJzYXRpb25JdGVtRGVsZXRlZEV2ZW50U2NoZW1hID0gei5vYmplY3Qoe1xuICAgIHR5cGU6IHoubGl0ZXJhbCgnY29udmVyc2F0aW9uLml0ZW0uZGVsZXRlZCcpLFxuICAgIGV2ZW50X2lkOiB6LnN0cmluZygpLFxuICAgIGl0ZW1faWQ6IHouc3RyaW5nKCksXG59KTtcbmV4cG9ydCBjb25zdCBjb252ZXJzYXRpb25JdGVtSW5wdXRBdWRpb1RyYW5zY3JpcHRpb25Db21wbGV0ZWRFdmVudFNjaGVtYSA9IHoub2JqZWN0KHtcbiAgICB0eXBlOiB6LmxpdGVyYWwoJ2NvbnZlcnNhdGlvbi5pdGVtLmlucHV0X2F1ZGlvX3RyYW5zY3JpcHRpb24uY29tcGxldGVkJyksXG4gICAgZXZlbnRfaWQ6IHouc3RyaW5nKCksXG4gICAgaXRlbV9pZDogei5zdHJpbmcoKSxcbiAgICBjb250ZW50X2luZGV4OiB6Lm51bWJlcigpLFxuICAgIHRyYW5zY3JpcHQ6IHouc3RyaW5nKCksXG4gICAgbG9ncHJvYnM6IHouYXJyYXkoei5hbnkoKSkubnVsbGFibGUoKS5vcHRpb25hbCgpLFxufSk7XG5leHBvcnQgY29uc3QgY29udmVyc2F0aW9uSXRlbUlucHV0QXVkaW9UcmFuc2NyaXB0aW9uRGVsdGFFdmVudFNjaGVtYSA9IHoub2JqZWN0KHtcbiAgICB0eXBlOiB6LmxpdGVyYWwoJ2NvbnZlcnNhdGlvbi5pdGVtLmlucHV0X2F1ZGlvX3RyYW5zY3JpcHRpb24uZGVsdGEnKSxcbiAgICBldmVudF9pZDogei5zdHJpbmcoKSxcbiAgICBpdGVtX2lkOiB6LnN0cmluZygpLFxuICAgIGNvbnRlbnRfaW5kZXg6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgICBkZWx0YTogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIGxvZ3Byb2JzOiB6LmFycmF5KHouYW55KCkpLm51bGxhYmxlKCkub3B0aW9uYWwoKSxcbn0pO1xuZXhwb3J0IGNvbnN0IGNvbnZlcnNhdGlvbkl0ZW1JbnB1dEF1ZGlvVHJhbnNjcmlwdGlvbkZhaWxlZEV2ZW50U2NoZW1hID0gei5vYmplY3Qoe1xuICAgIHR5cGU6IHoubGl0ZXJhbCgnY29udmVyc2F0aW9uLml0ZW0uaW5wdXRfYXVkaW9fdHJhbnNjcmlwdGlvbi5mYWlsZWQnKSxcbiAgICBldmVudF9pZDogei5zdHJpbmcoKSxcbiAgICBpdGVtX2lkOiB6LnN0cmluZygpLFxuICAgIGNvbnRlbnRfaW5kZXg6IHoubnVtYmVyKCksXG4gICAgZXJyb3I6IHoub2JqZWN0KHtcbiAgICAgICAgY29kZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgICBtZXNzYWdlOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICAgIHBhcmFtOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICAgIHR5cGU6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICB9KSxcbn0pO1xuZXhwb3J0IGNvbnN0IGNvbnZlcnNhdGlvbkl0ZW1SZXRyaWV2ZWRFdmVudFNjaGVtYSA9IHoub2JqZWN0KHtcbiAgICB0eXBlOiB6LmxpdGVyYWwoJ2NvbnZlcnNhdGlvbi5pdGVtLnJldHJpZXZlZCcpLFxuICAgIGV2ZW50X2lkOiB6LnN0cmluZygpLFxuICAgIGl0ZW06IGNvbnZlcnNhdGlvbkl0ZW1TY2hlbWEsXG59KTtcbmV4cG9ydCBjb25zdCBjb252ZXJzYXRpb25JdGVtVHJ1bmNhdGVkRXZlbnRTY2hlbWEgPSB6Lm9iamVjdCh7XG4gICAgdHlwZTogei5saXRlcmFsKCdjb252ZXJzYXRpb24uaXRlbS50cnVuY2F0ZWQnKSxcbiAgICBldmVudF9pZDogei5zdHJpbmcoKSxcbiAgICBpdGVtX2lkOiB6LnN0cmluZygpLFxuICAgIGF1ZGlvX2VuZF9tczogei5udW1iZXIoKSxcbiAgICBjb250ZW50X2luZGV4OiB6Lm51bWJlcigpLFxufSk7XG5leHBvcnQgY29uc3QgY29udmVyc2F0aW9uSXRlbUNyZWF0ZUV2ZW50U2NoZW1hID0gei5vYmplY3Qoe1xuICAgIHR5cGU6IHoubGl0ZXJhbCgnY29udmVyc2F0aW9uLml0ZW0uY3JlYXRlJyksXG4gICAgaXRlbTogY29udmVyc2F0aW9uSXRlbVNjaGVtYSxcbiAgICBldmVudF9pZDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIHByZXZpb3VzX2l0ZW1faWQ6IHouc3RyaW5nKCkubnVsbGFibGUoKS5vcHRpb25hbCgpLFxufSk7XG5leHBvcnQgY29uc3QgY29udmVyc2F0aW9uSXRlbURlbGV0ZUV2ZW50U2NoZW1hID0gei5vYmplY3Qoe1xuICAgIHR5cGU6IHoubGl0ZXJhbCgnY29udmVyc2F0aW9uLml0ZW0uZGVsZXRlJyksXG4gICAgaXRlbV9pZDogei5zdHJpbmcoKSxcbiAgICBldmVudF9pZDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxufSk7XG5leHBvcnQgY29uc3QgY29udmVyc2F0aW9uSXRlbVJldHJpZXZlRXZlbnRTY2hlbWEgPSB6Lm9iamVjdCh7XG4gICAgdHlwZTogei5saXRlcmFsKCdjb252ZXJzYXRpb24uaXRlbS5yZXRyaWV2ZScpLFxuICAgIGl0ZW1faWQ6IHouc3RyaW5nKCksXG4gICAgZXZlbnRfaWQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbn0pO1xuZXhwb3J0IGNvbnN0IGNvbnZlcnNhdGlvbkl0ZW1UcnVuY2F0ZUV2ZW50U2NoZW1hID0gei5vYmplY3Qoe1xuICAgIHR5cGU6IHoubGl0ZXJhbCgnY29udmVyc2F0aW9uLml0ZW0udHJ1bmNhdGUnKSxcbiAgICBpdGVtX2lkOiB6LnN0cmluZygpLFxuICAgIGF1ZGlvX2VuZF9tczogei5udW1iZXIoKSxcbiAgICBjb250ZW50X2luZGV4OiB6Lm51bWJlcigpLFxuICAgIGV2ZW50X2lkOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG59KTtcbmV4cG9ydCBjb25zdCBlcnJvckV2ZW50U2NoZW1hID0gei5vYmplY3Qoe1xuICAgIHR5cGU6IHoubGl0ZXJhbCgnZXJyb3InKSxcbiAgICBldmVudF9pZDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIGVycm9yOiB6LmFueSgpLm9wdGlvbmFsKCksXG59KTtcbmV4cG9ydCBjb25zdCBpbnB1dEF1ZGlvQnVmZmVyQ2xlYXJlZEV2ZW50U2NoZW1hID0gei5vYmplY3Qoe1xuICAgIHR5cGU6IHoubGl0ZXJhbCgnaW5wdXRfYXVkaW9fYnVmZmVyLmNsZWFyZWQnKSxcbiAgICBldmVudF9pZDogei5zdHJpbmcoKSxcbn0pO1xuZXhwb3J0IGNvbnN0IGlucHV0QXVkaW9CdWZmZXJBcHBlbmRFdmVudFNjaGVtYSA9IHoub2JqZWN0KHtcbiAgICB0eXBlOiB6LmxpdGVyYWwoJ2lucHV0X2F1ZGlvX2J1ZmZlci5hcHBlbmQnKSxcbiAgICBhdWRpbzogei5zdHJpbmcoKSxcbiAgICBldmVudF9pZDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxufSk7XG5leHBvcnQgY29uc3QgaW5wdXRBdWRpb0J1ZmZlckNsZWFyRXZlbnRTY2hlbWEgPSB6Lm9iamVjdCh7XG4gICAgdHlwZTogei5saXRlcmFsKCdpbnB1dF9hdWRpb19idWZmZXIuY2xlYXInKSxcbiAgICBldmVudF9pZDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxufSk7XG5leHBvcnQgY29uc3QgaW5wdXRBdWRpb0J1ZmZlckNvbW1pdEV2ZW50U2NoZW1hID0gei5vYmplY3Qoe1xuICAgIHR5cGU6IHoubGl0ZXJhbCgnaW5wdXRfYXVkaW9fYnVmZmVyLmNvbW1pdCcpLFxuICAgIGV2ZW50X2lkOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG59KTtcbmV4cG9ydCBjb25zdCBpbnB1dEF1ZGlvQnVmZmVyQ29tbWl0dGVkRXZlbnRTY2hlbWEgPSB6Lm9iamVjdCh7XG4gICAgdHlwZTogei5saXRlcmFsKCdpbnB1dF9hdWRpb19idWZmZXIuY29tbWl0dGVkJyksXG4gICAgZXZlbnRfaWQ6IHouc3RyaW5nKCksXG4gICAgaXRlbV9pZDogei5zdHJpbmcoKSxcbiAgICBwcmV2aW91c19pdGVtX2lkOiB6LnN0cmluZygpLm51bGxhYmxlKCkub3B0aW9uYWwoKSxcbn0pO1xuZXhwb3J0IGNvbnN0IGlucHV0QXVkaW9CdWZmZXJTcGVlY2hTdGFydGVkRXZlbnRTY2hlbWEgPSB6Lm9iamVjdCh7XG4gICAgdHlwZTogei5saXRlcmFsKCdpbnB1dF9hdWRpb19idWZmZXIuc3BlZWNoX3N0YXJ0ZWQnKSxcbiAgICBldmVudF9pZDogei5zdHJpbmcoKSxcbiAgICBpdGVtX2lkOiB6LnN0cmluZygpLFxuICAgIGF1ZGlvX3N0YXJ0X21zOiB6Lm51bWJlcigpLFxufSk7XG5leHBvcnQgY29uc3QgaW5wdXRBdWRpb0J1ZmZlclNwZWVjaFN0b3BwZWRFdmVudFNjaGVtYSA9IHoub2JqZWN0KHtcbiAgICB0eXBlOiB6LmxpdGVyYWwoJ2lucHV0X2F1ZGlvX2J1ZmZlci5zcGVlY2hfc3RvcHBlZCcpLFxuICAgIGV2ZW50X2lkOiB6LnN0cmluZygpLFxuICAgIGl0ZW1faWQ6IHouc3RyaW5nKCksXG4gICAgYXVkaW9fZW5kX21zOiB6Lm51bWJlcigpLFxufSk7XG5leHBvcnQgY29uc3Qgb3V0cHV0QXVkaW9CdWZmZXJTdGFydGVkRXZlbnRTY2hlbWEgPSB6XG4gICAgLm9iamVjdCh7XG4gICAgdHlwZTogei5saXRlcmFsKCdvdXRwdXRfYXVkaW9fYnVmZmVyLnN0YXJ0ZWQnKSxcbiAgICBldmVudF9pZDogei5zdHJpbmcoKSxcbn0pXG4gICAgLnBhc3N0aHJvdWdoKCk7XG5leHBvcnQgY29uc3Qgb3V0cHV0QXVkaW9CdWZmZXJTdG9wcGVkRXZlbnRTY2hlbWEgPSB6XG4gICAgLm9iamVjdCh7XG4gICAgdHlwZTogei5saXRlcmFsKCdvdXRwdXRfYXVkaW9fYnVmZmVyLnN0b3BwZWQnKSxcbiAgICBldmVudF9pZDogei5zdHJpbmcoKSxcbn0pXG4gICAgLnBhc3N0aHJvdWdoKCk7XG5leHBvcnQgY29uc3Qgb3V0cHV0QXVkaW9CdWZmZXJDbGVhcmVkRXZlbnRTY2hlbWEgPSB6Lm9iamVjdCh7XG4gICAgdHlwZTogei5saXRlcmFsKCdvdXRwdXRfYXVkaW9fYnVmZmVyLmNsZWFyZWQnKSxcbiAgICBldmVudF9pZDogei5zdHJpbmcoKSxcbn0pO1xuZXhwb3J0IGNvbnN0IHJhdGVMaW1pdHNVcGRhdGVkRXZlbnRTY2hlbWEgPSB6Lm9iamVjdCh7XG4gICAgdHlwZTogei5saXRlcmFsKCdyYXRlX2xpbWl0cy51cGRhdGVkJyksXG4gICAgZXZlbnRfaWQ6IHouc3RyaW5nKCksXG4gICAgcmF0ZV9saW1pdHM6IHouYXJyYXkoei5vYmplY3Qoe1xuICAgICAgICBsaW1pdDogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICAgICAgICBuYW1lOiB6LmVudW0oWydyZXF1ZXN0cycsICd0b2tlbnMnXSkub3B0aW9uYWwoKSxcbiAgICAgICAgcmVtYWluaW5nOiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gICAgICAgIHJlc2V0X3NlY29uZHM6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgICB9KSksXG59KTtcbmV4cG9ydCBjb25zdCByZXNwb25zZUF1ZGlvRGVsdGFFdmVudFNjaGVtYSA9IHoub2JqZWN0KHtcbiAgICB0eXBlOiB6LmxpdGVyYWwoJ3Jlc3BvbnNlLmF1ZGlvLmRlbHRhJyksXG4gICAgZXZlbnRfaWQ6IHouc3RyaW5nKCksXG4gICAgaXRlbV9pZDogei5zdHJpbmcoKSxcbiAgICBjb250ZW50X2luZGV4OiB6Lm51bWJlcigpLFxuICAgIGRlbHRhOiB6LnN0cmluZygpLFxuICAgIG91dHB1dF9pbmRleDogei5udW1iZXIoKSxcbiAgICByZXNwb25zZV9pZDogei5zdHJpbmcoKSxcbn0pO1xuZXhwb3J0IGNvbnN0IHJlc3BvbnNlQXVkaW9Eb25lRXZlbnRTY2hlbWEgPSB6Lm9iamVjdCh7XG4gICAgdHlwZTogei5saXRlcmFsKCdyZXNwb25zZS5hdWRpby5kb25lJyksXG4gICAgZXZlbnRfaWQ6IHouc3RyaW5nKCksXG4gICAgaXRlbV9pZDogei5zdHJpbmcoKSxcbiAgICBjb250ZW50X2luZGV4OiB6Lm51bWJlcigpLFxuICAgIG91dHB1dF9pbmRleDogei5udW1iZXIoKSxcbiAgICByZXNwb25zZV9pZDogei5zdHJpbmcoKSxcbn0pO1xuZXhwb3J0IGNvbnN0IHJlc3BvbnNlQXVkaW9UcmFuc2NyaXB0RGVsdGFFdmVudFNjaGVtYSA9IHoub2JqZWN0KHtcbiAgICB0eXBlOiB6LmxpdGVyYWwoJ3Jlc3BvbnNlLmF1ZGlvX3RyYW5zY3JpcHQuZGVsdGEnKSxcbiAgICBldmVudF9pZDogei5zdHJpbmcoKSxcbiAgICBpdGVtX2lkOiB6LnN0cmluZygpLFxuICAgIGNvbnRlbnRfaW5kZXg6IHoubnVtYmVyKCksXG4gICAgZGVsdGE6IHouc3RyaW5nKCksXG4gICAgb3V0cHV0X2luZGV4OiB6Lm51bWJlcigpLFxuICAgIHJlc3BvbnNlX2lkOiB6LnN0cmluZygpLFxufSk7XG5leHBvcnQgY29uc3QgcmVzcG9uc2VBdWRpb1RyYW5zY3JpcHREb25lRXZlbnRTY2hlbWEgPSB6Lm9iamVjdCh7XG4gICAgdHlwZTogei5saXRlcmFsKCdyZXNwb25zZS5hdWRpb190cmFuc2NyaXB0LmRvbmUnKSxcbiAgICBldmVudF9pZDogei5zdHJpbmcoKSxcbiAgICBpdGVtX2lkOiB6LnN0cmluZygpLFxuICAgIGNvbnRlbnRfaW5kZXg6IHoubnVtYmVyKCksXG4gICAgdHJhbnNjcmlwdDogei5zdHJpbmcoKSxcbiAgICBvdXRwdXRfaW5kZXg6IHoubnVtYmVyKCksXG4gICAgcmVzcG9uc2VfaWQ6IHouc3RyaW5nKCksXG59KTtcbmV4cG9ydCBjb25zdCByZXNwb25zZUNvbnRlbnRQYXJ0QWRkZWRFdmVudFNjaGVtYSA9IHoub2JqZWN0KHtcbiAgICB0eXBlOiB6LmxpdGVyYWwoJ3Jlc3BvbnNlLmNvbnRlbnRfcGFydC5hZGRlZCcpLFxuICAgIGV2ZW50X2lkOiB6LnN0cmluZygpLFxuICAgIGl0ZW1faWQ6IHouc3RyaW5nKCksXG4gICAgY29udGVudF9pbmRleDogei5udW1iZXIoKSxcbiAgICBvdXRwdXRfaW5kZXg6IHoubnVtYmVyKCksXG4gICAgcmVzcG9uc2VfaWQ6IHouc3RyaW5nKCksXG4gICAgcGFydDogei5vYmplY3Qoe1xuICAgICAgICBhdWRpbzogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgICB0ZXh0OiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICAgIHRyYW5zY3JpcHQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICAgICAgdHlwZTogei5lbnVtKFsndGV4dCcsICdhdWRpbyddKS5vcHRpb25hbCgpLFxuICAgIH0pLFxufSk7XG5leHBvcnQgY29uc3QgcmVzcG9uc2VDb250ZW50UGFydERvbmVFdmVudFNjaGVtYSA9IHoub2JqZWN0KHtcbiAgICB0eXBlOiB6LmxpdGVyYWwoJ3Jlc3BvbnNlLmNvbnRlbnRfcGFydC5kb25lJyksXG4gICAgZXZlbnRfaWQ6IHouc3RyaW5nKCksXG4gICAgaXRlbV9pZDogei5zdHJpbmcoKSxcbiAgICBjb250ZW50X2luZGV4OiB6Lm51bWJlcigpLFxuICAgIG91dHB1dF9pbmRleDogei5udW1iZXIoKSxcbiAgICByZXNwb25zZV9pZDogei5zdHJpbmcoKSxcbiAgICBwYXJ0OiB6Lm9iamVjdCh7XG4gICAgICAgIGF1ZGlvOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICAgIHRleHQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICAgICAgdHJhbnNjcmlwdDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgICB0eXBlOiB6LmVudW0oWyd0ZXh0JywgJ2F1ZGlvJ10pLm9wdGlvbmFsKCksXG4gICAgfSksXG59KTtcbmV4cG9ydCBjb25zdCByZXNwb25zZUNyZWF0ZWRFdmVudFNjaGVtYSA9IHoub2JqZWN0KHtcbiAgICB0eXBlOiB6LmxpdGVyYWwoJ3Jlc3BvbnNlLmNyZWF0ZWQnKSxcbiAgICBldmVudF9pZDogei5zdHJpbmcoKSxcbiAgICByZXNwb25zZTogcmVhbHRpbWVSZXNwb25zZSxcbn0pO1xuZXhwb3J0IGNvbnN0IHJlc3BvbnNlRG9uZUV2ZW50U2NoZW1hID0gei5vYmplY3Qoe1xuICAgIHR5cGU6IHoubGl0ZXJhbCgncmVzcG9uc2UuZG9uZScpLFxuICAgIGV2ZW50X2lkOiB6LnN0cmluZygpLFxuICAgIHJlc3BvbnNlOiByZWFsdGltZVJlc3BvbnNlLFxuICAgIHRlc3Q6IHouYm9vbGVhbigpLFxufSk7XG5leHBvcnQgY29uc3QgcmVzcG9uc2VGdW5jdGlvbkNhbGxBcmd1bWVudHNEZWx0YUV2ZW50U2NoZW1hID0gei5vYmplY3Qoe1xuICAgIHR5cGU6IHoubGl0ZXJhbCgncmVzcG9uc2UuZnVuY3Rpb25fY2FsbF9hcmd1bWVudHMuZGVsdGEnKSxcbiAgICBldmVudF9pZDogei5zdHJpbmcoKSxcbiAgICBpdGVtX2lkOiB6LnN0cmluZygpLFxuICAgIGNhbGxfaWQ6IHouc3RyaW5nKCksXG4gICAgZGVsdGE6IHouc3RyaW5nKCksXG4gICAgb3V0cHV0X2luZGV4OiB6Lm51bWJlcigpLFxuICAgIHJlc3BvbnNlX2lkOiB6LnN0cmluZygpLFxufSk7XG5leHBvcnQgY29uc3QgcmVzcG9uc2VGdW5jdGlvbkNhbGxBcmd1bWVudHNEb25lRXZlbnRTY2hlbWEgPSB6Lm9iamVjdCh7XG4gICAgdHlwZTogei5saXRlcmFsKCdyZXNwb25zZS5mdW5jdGlvbl9jYWxsX2FyZ3VtZW50cy5kb25lJyksXG4gICAgZXZlbnRfaWQ6IHouc3RyaW5nKCksXG4gICAgaXRlbV9pZDogei5zdHJpbmcoKSxcbiAgICBjYWxsX2lkOiB6LnN0cmluZygpLFxuICAgIGFyZ3VtZW50czogei5zdHJpbmcoKSxcbiAgICBvdXRwdXRfaW5kZXg6IHoubnVtYmVyKCksXG4gICAgcmVzcG9uc2VfaWQ6IHouc3RyaW5nKCksXG59KTtcbmV4cG9ydCBjb25zdCByZXNwb25zZU91dHB1dEl0ZW1BZGRlZEV2ZW50U2NoZW1hID0gei5vYmplY3Qoe1xuICAgIHR5cGU6IHoubGl0ZXJhbCgncmVzcG9uc2Uub3V0cHV0X2l0ZW0uYWRkZWQnKSxcbiAgICBldmVudF9pZDogei5zdHJpbmcoKSxcbiAgICBpdGVtOiBjb252ZXJzYXRpb25JdGVtU2NoZW1hLFxuICAgIG91dHB1dF9pbmRleDogei5udW1iZXIoKSxcbiAgICByZXNwb25zZV9pZDogei5zdHJpbmcoKSxcbn0pO1xuZXhwb3J0IGNvbnN0IHJlc3BvbnNlT3V0cHV0SXRlbURvbmVFdmVudFNjaGVtYSA9IHoub2JqZWN0KHtcbiAgICB0eXBlOiB6LmxpdGVyYWwoJ3Jlc3BvbnNlLm91dHB1dF9pdGVtLmRvbmUnKSxcbiAgICBldmVudF9pZDogei5zdHJpbmcoKSxcbiAgICBpdGVtOiBjb252ZXJzYXRpb25JdGVtU2NoZW1hLFxuICAgIG91dHB1dF9pbmRleDogei5udW1iZXIoKSxcbiAgICByZXNwb25zZV9pZDogei5zdHJpbmcoKSxcbn0pO1xuZXhwb3J0IGNvbnN0IHJlc3BvbnNlVGV4dERlbHRhRXZlbnRTY2hlbWEgPSB6Lm9iamVjdCh7XG4gICAgdHlwZTogei5saXRlcmFsKCdyZXNwb25zZS50ZXh0LmRlbHRhJyksXG4gICAgZXZlbnRfaWQ6IHouc3RyaW5nKCksXG4gICAgaXRlbV9pZDogei5zdHJpbmcoKSxcbiAgICBjb250ZW50X2luZGV4OiB6Lm51bWJlcigpLFxuICAgIGRlbHRhOiB6LnN0cmluZygpLFxuICAgIG91dHB1dF9pbmRleDogei5udW1iZXIoKSxcbiAgICByZXNwb25zZV9pZDogei5zdHJpbmcoKSxcbn0pO1xuZXhwb3J0IGNvbnN0IHJlc3BvbnNlVGV4dERvbmVFdmVudFNjaGVtYSA9IHoub2JqZWN0KHtcbiAgICB0eXBlOiB6LmxpdGVyYWwoJ3Jlc3BvbnNlLnRleHQuZG9uZScpLFxuICAgIGV2ZW50X2lkOiB6LnN0cmluZygpLFxuICAgIGl0ZW1faWQ6IHouc3RyaW5nKCksXG4gICAgY29udGVudF9pbmRleDogei5udW1iZXIoKSxcbiAgICB0ZXh0OiB6LnN0cmluZygpLFxuICAgIG91dHB1dF9pbmRleDogei5udW1iZXIoKSxcbiAgICByZXNwb25zZV9pZDogei5zdHJpbmcoKSxcbn0pO1xuZXhwb3J0IGNvbnN0IHNlc3Npb25DcmVhdGVkRXZlbnRTY2hlbWEgPSB6Lm9iamVjdCh7XG4gICAgdHlwZTogei5saXRlcmFsKCdzZXNzaW9uLmNyZWF0ZWQnKSxcbiAgICBldmVudF9pZDogei5zdHJpbmcoKSxcbiAgICBzZXNzaW9uOiB6LmFueSgpLFxufSk7XG5leHBvcnQgY29uc3Qgc2Vzc2lvblVwZGF0ZWRFdmVudFNjaGVtYSA9IHoub2JqZWN0KHtcbiAgICB0eXBlOiB6LmxpdGVyYWwoJ3Nlc3Npb24udXBkYXRlZCcpLFxuICAgIGV2ZW50X2lkOiB6LnN0cmluZygpLFxuICAgIHNlc3Npb246IHouYW55KCksXG59KTtcbmV4cG9ydCBjb25zdCByZXNwb25zZUNhbmNlbEV2ZW50U2NoZW1hID0gei5vYmplY3Qoe1xuICAgIHR5cGU6IHoubGl0ZXJhbCgncmVzcG9uc2UuY2FuY2VsJyksXG4gICAgZXZlbnRfaWQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICByZXNwb25zZV9pZDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxufSk7XG5leHBvcnQgY29uc3QgcmVzcG9uc2VDcmVhdGVFdmVudFNjaGVtYSA9IHoub2JqZWN0KHtcbiAgICB0eXBlOiB6LmxpdGVyYWwoJ3Jlc3BvbnNlLmNyZWF0ZScpLFxuICAgIGV2ZW50X2lkOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgcmVzcG9uc2U6IHouYW55KCkub3B0aW9uYWwoKSxcbn0pO1xuZXhwb3J0IGNvbnN0IHNlc3Npb25VcGRhdGVFdmVudFNjaGVtYSA9IHoub2JqZWN0KHtcbiAgICB0eXBlOiB6LmxpdGVyYWwoJ3Nlc3Npb24udXBkYXRlJyksXG4gICAgZXZlbnRfaWQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICBzZXNzaW9uOiB6LmFueSgpLFxufSk7XG5leHBvcnQgY29uc3QgdHJhbnNjcmlwdGlvblNlc3Npb25VcGRhdGVFdmVudFNjaGVtYSA9IHoub2JqZWN0KHtcbiAgICB0eXBlOiB6LmxpdGVyYWwoJ3RyYW5zY3JpcHRpb25fc2Vzc2lvbi51cGRhdGUnKSxcbiAgICBldmVudF9pZDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIHNlc3Npb246IHouYW55KCksXG59KTtcbmV4cG9ydCBjb25zdCB0cmFuc2NyaXB0aW9uU2Vzc2lvblVwZGF0ZWRFdmVudFNjaGVtYSA9IHoub2JqZWN0KHtcbiAgICB0eXBlOiB6LmxpdGVyYWwoJ3RyYW5zY3JpcHRpb25fc2Vzc2lvbi51cGRhdGVkJyksXG4gICAgZXZlbnRfaWQ6IHouc3RyaW5nKCksXG4gICAgc2Vzc2lvbjogei5hbnkoKSxcbn0pO1xuLyoqXG4gKiBUaGlzIHNjaGVtYSBpcyB1c2VkIGlmIGFuIGV2ZW50IGlzIHVua25vd24gdG8gdGhlIGNsaWVudC4gVGhlIFJlYWx0aW1lIEFQSSBtaWdodCBpbnRyb2R1Y2VcbiAqIG5ldyBldmVudHMgYXQgc29tZSBwb2ludCBhbmQgd2Ugc2hvdWxkIGhhbmRsZSB0aGVtIGdyYWNlZnVsbHkgYnkgdHJlYXRpbmcgdGhlbSBhcyBnZW5lcmljIGV2ZW50c1xuICogb25seSByZXF1aXJpbmcgYSB0eXBlIGFuZCBhbiBvcHRpb25hbCBldmVudF9pZC5cbiAqL1xuZXhwb3J0IGNvbnN0IGdlbmVyaWNFdmVudFNjaGVtYSA9IHpcbiAgICAub2JqZWN0KHtcbiAgICB0eXBlOiB6LnN0cmluZygpLFxuICAgIGV2ZW50X2lkOiB6LnN0cmluZygpLm9wdGlvbmFsKCkubnVsbGFibGUoKSxcbn0pXG4gICAgLnBhc3N0aHJvdWdoKCk7XG5leHBvcnQgY29uc3QgcmVhbHRpbWVTZXJ2ZXJFdmVudFNjaGVtYSA9IHouZGlzY3JpbWluYXRlZFVuaW9uKCd0eXBlJywgW1xuICAgIGNvbnZlcnNhdGlvbkNyZWF0ZWRFdmVudFNjaGVtYSxcbiAgICBjb252ZXJzYXRpb25JdGVtQ3JlYXRlZEV2ZW50U2NoZW1hLFxuICAgIGNvbnZlcnNhdGlvbkl0ZW1EZWxldGVkRXZlbnRTY2hlbWEsXG4gICAgY29udmVyc2F0aW9uSXRlbUlucHV0QXVkaW9UcmFuc2NyaXB0aW9uQ29tcGxldGVkRXZlbnRTY2hlbWEsXG4gICAgY29udmVyc2F0aW9uSXRlbUlucHV0QXVkaW9UcmFuc2NyaXB0aW9uRGVsdGFFdmVudFNjaGVtYSxcbiAgICBjb252ZXJzYXRpb25JdGVtSW5wdXRBdWRpb1RyYW5zY3JpcHRpb25GYWlsZWRFdmVudFNjaGVtYSxcbiAgICBjb252ZXJzYXRpb25JdGVtUmV0cmlldmVkRXZlbnRTY2hlbWEsXG4gICAgY29udmVyc2F0aW9uSXRlbVRydW5jYXRlZEV2ZW50U2NoZW1hLFxuICAgIGVycm9yRXZlbnRTY2hlbWEsXG4gICAgaW5wdXRBdWRpb0J1ZmZlckNsZWFyZWRFdmVudFNjaGVtYSxcbiAgICBpbnB1dEF1ZGlvQnVmZmVyQ29tbWl0dGVkRXZlbnRTY2hlbWEsXG4gICAgaW5wdXRBdWRpb0J1ZmZlclNwZWVjaFN0YXJ0ZWRFdmVudFNjaGVtYSxcbiAgICBpbnB1dEF1ZGlvQnVmZmVyU3BlZWNoU3RvcHBlZEV2ZW50U2NoZW1hLFxuICAgIG91dHB1dEF1ZGlvQnVmZmVyU3RhcnRlZEV2ZW50U2NoZW1hLFxuICAgIG91dHB1dEF1ZGlvQnVmZmVyU3RvcHBlZEV2ZW50U2NoZW1hLFxuICAgIG91dHB1dEF1ZGlvQnVmZmVyQ2xlYXJlZEV2ZW50U2NoZW1hLFxuICAgIHJhdGVMaW1pdHNVcGRhdGVkRXZlbnRTY2hlbWEsXG4gICAgcmVzcG9uc2VBdWRpb0RlbHRhRXZlbnRTY2hlbWEsXG4gICAgcmVzcG9uc2VBdWRpb0RvbmVFdmVudFNjaGVtYSxcbiAgICByZXNwb25zZUF1ZGlvVHJhbnNjcmlwdERlbHRhRXZlbnRTY2hlbWEsXG4gICAgcmVzcG9uc2VBdWRpb1RyYW5zY3JpcHREb25lRXZlbnRTY2hlbWEsXG4gICAgcmVzcG9uc2VDb250ZW50UGFydEFkZGVkRXZlbnRTY2hlbWEsXG4gICAgcmVzcG9uc2VDb250ZW50UGFydERvbmVFdmVudFNjaGVtYSxcbiAgICByZXNwb25zZUNyZWF0ZWRFdmVudFNjaGVtYSxcbiAgICByZXNwb25zZURvbmVFdmVudFNjaGVtYSxcbiAgICByZXNwb25zZUZ1bmN0aW9uQ2FsbEFyZ3VtZW50c0RlbHRhRXZlbnRTY2hlbWEsXG4gICAgcmVzcG9uc2VGdW5jdGlvbkNhbGxBcmd1bWVudHNEb25lRXZlbnRTY2hlbWEsXG4gICAgcmVzcG9uc2VPdXRwdXRJdGVtQWRkZWRFdmVudFNjaGVtYSxcbiAgICByZXNwb25zZU91dHB1dEl0ZW1Eb25lRXZlbnRTY2hlbWEsXG4gICAgcmVzcG9uc2VUZXh0RGVsdGFFdmVudFNjaGVtYSxcbiAgICByZXNwb25zZVRleHREb25lRXZlbnRTY2hlbWEsXG4gICAgc2Vzc2lvbkNyZWF0ZWRFdmVudFNjaGVtYSxcbiAgICBzZXNzaW9uVXBkYXRlZEV2ZW50U2NoZW1hLFxuICAgIHRyYW5zY3JpcHRpb25TZXNzaW9uVXBkYXRlZEV2ZW50U2NoZW1hLFxuXSk7XG5leHBvcnQgY29uc3QgcmVhbHRpbWVDbGllbnRFdmVudFNjaGVtYSA9IHouZGlzY3JpbWluYXRlZFVuaW9uKCd0eXBlJywgW1xuICAgIGNvbnZlcnNhdGlvbkl0ZW1DcmVhdGVFdmVudFNjaGVtYSxcbiAgICBjb252ZXJzYXRpb25JdGVtRGVsZXRlRXZlbnRTY2hlbWEsXG4gICAgY29udmVyc2F0aW9uSXRlbVJldHJpZXZlRXZlbnRTY2hlbWEsXG4gICAgY29udmVyc2F0aW9uSXRlbVRydW5jYXRlRXZlbnRTY2hlbWEsXG4gICAgaW5wdXRBdWRpb0J1ZmZlckFwcGVuZEV2ZW50U2NoZW1hLFxuICAgIGlucHV0QXVkaW9CdWZmZXJDbGVhckV2ZW50U2NoZW1hLFxuICAgIGlucHV0QXVkaW9CdWZmZXJDb21taXRFdmVudFNjaGVtYSxcbiAgICByZXNwb25zZUNhbmNlbEV2ZW50U2NoZW1hLFxuICAgIHJlc3BvbnNlQ3JlYXRlRXZlbnRTY2hlbWEsXG4gICAgc2Vzc2lvblVwZGF0ZUV2ZW50U2NoZW1hLFxuICAgIHRyYW5zY3JpcHRpb25TZXNzaW9uVXBkYXRlRXZlbnRTY2hlbWEsXG5dKTtcbi8qKlxuICogUGFyc2VzIGEgcmVhbHRpbWUgZXZlbnQgZnJvbSB0aGUgc2VydmVyLiBJZiB0aGUgZXZlbnQgaXMgdW5rbm93biB0byB0aGUgY2xpZW50LCBpdCB3aWxsIGJlIHRyZWF0ZWQgYXMgYSBnZW5lcmljIGV2ZW50LlxuICogQHBhcmFtIGV2ZW50IC0gVGhlIGV2ZW50IHRvIHBhcnNlLlxuICogQHJldHVybnMgVGhlIHBhcnNlZCBldmVudCBvciBudWxsIGlmIHRoZSBldmVudCBpcyB1bmtub3duIHRvIHRoZSBjbGllbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVJlYWx0aW1lRXZlbnQoZXZlbnQpIHtcbiAgICBjb25zdCByYXcgPSBKU09OLnBhcnNlKGV2ZW50LmRhdGEudG9TdHJpbmcoKSk7XG4gICAgY29uc3QgcGFyc2VkID0gcmVhbHRpbWVTZXJ2ZXJFdmVudFNjaGVtYS5zYWZlUGFyc2UocmF3KTtcbiAgICBpZiAoIXBhcnNlZC5zdWNjZXNzKSB7XG4gICAgICAgIGNvbnN0IGdlbmVyaWNQYXJzZWQgPSBnZW5lcmljRXZlbnRTY2hlbWEuc2FmZVBhcnNlKHJhdyk7XG4gICAgICAgIGlmIChnZW5lcmljUGFyc2VkLnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IGdlbmVyaWNQYXJzZWQuZGF0YSwgaXNHZW5lcmljOiB0cnVlIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgZGF0YTogbnVsbCwgaXNHZW5lcmljOiB0cnVlIH07XG4gICAgfVxuICAgIHJldHVybiB7IGRhdGE6IHBhcnNlZC5kYXRhLCBpc0dlbmVyaWM6IGZhbHNlIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1vcGVuYWlSZWFsdGltZUV2ZW50cy5tanMubWFwIiwiaW1wb3J0IHsgUnVudGltZUV2ZW50RW1pdHRlciwgVXNhZ2UgfSBmcm9tICdAb3BlbmFpL2FnZW50cy1jb3JlJztcbmltcG9ydCB7IHJlYWx0aW1lTWVzc2FnZUl0ZW1TY2hlbWEsIHJlYWx0aW1lVG9vbENhbGxJdGVtLCB9IGZyb20gXCIuL2l0ZW1zLm1qc1wiO1xuaW1wb3J0IGxvZ2dlciBmcm9tIFwiLi9sb2dnZXIubWpzXCI7XG5pbXBvcnQgeyBwYXJzZVJlYWx0aW1lRXZlbnQsIHJlc3BvbnNlRG9uZUV2ZW50U2NoZW1hLCB9IGZyb20gXCIuL29wZW5haVJlYWx0aW1lRXZlbnRzLm1qc1wiO1xuaW1wb3J0IHsgYXJyYXlCdWZmZXJUb0Jhc2U2NCwgZGlmZlJlYWx0aW1lSGlzdG9yeSB9IGZyb20gXCIuL3V0aWxzLm1qc1wiO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyRGVsZWdhdGUgfSBmcm9tICdAb3BlbmFpL2FnZW50cy1jb3JlL3V0aWxzJztcbi8qKlxuICogVGhlIGRlZmF1bHQgbW9kZWwgdGhhdCBpcyB1c2VkIGR1cmluZyB0aGUgY29ubmVjdGlvbiBpZiBubyBtb2RlbCBpcyBwcm92aWRlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfT1BFTkFJX1JFQUxUSU1FX01PREVMID0gJ2dwdC00by1yZWFsdGltZS1wcmV2aWV3Jztcbi8qKlxuICogVGhlIGRlZmF1bHQgc2Vzc2lvbiBjb25maWcgdGhhdCBnZXRzIHNlbmQgb3ZlciBkdXJpbmcgc2Vzc2lvbiBjb25uZWN0aW9uIHVubGVzcyBvdmVycmlkZW5cbiAqIGJ5IHRoZSB1c2VyLlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9PUEVOQUlfUkVBTFRJTUVfU0VTU0lPTl9DT05GSUcgPSB7XG4gICAgdm9pY2U6ICdhc2gnLFxuICAgIG1vZGFsaXRpZXM6IFsndGV4dCcsICdhdWRpbyddLFxuICAgIGlucHV0QXVkaW9Gb3JtYXQ6ICdwY20xNicsXG4gICAgb3V0cHV0QXVkaW9Gb3JtYXQ6ICdwY20xNicsXG4gICAgaW5wdXRBdWRpb1RyYW5zY3JpcHRpb246IHtcbiAgICAgICAgbW9kZWw6ICdncHQtNG8tbWluaS10cmFuc2NyaWJlJyxcbiAgICB9LFxuICAgIHR1cm5EZXRlY3Rpb246IHtcbiAgICAgICAgdHlwZTogJ3NlbWFudGljX3ZhZCcsXG4gICAgfSxcbn07XG5leHBvcnQgY2xhc3MgT3BlbkFJUmVhbHRpbWVCYXNlIGV4dGVuZHMgRXZlbnRFbWl0dGVyRGVsZWdhdGUge1xuICAgICNtb2RlbDtcbiAgICAjYXBpS2V5O1xuICAgICN0cmFjaW5nQ29uZmlnID0gbnVsbDtcbiAgICBldmVudEVtaXR0ZXIgPSBuZXcgUnVudGltZUV2ZW50RW1pdHRlcigpO1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLiNtb2RlbCA9IG9wdGlvbnMubW9kZWwgPz8gREVGQVVMVF9PUEVOQUlfUkVBTFRJTUVfTU9ERUw7XG4gICAgICAgIHRoaXMuI2FwaUtleSA9IG9wdGlvbnMuYXBpS2V5O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVudCBtb2RlbCB0aGF0IGlzIGJlaW5nIHVzZWQgYnkgdGhlIHRyYW5zcG9ydCBsYXllci5cbiAgICAgKi9cbiAgICBnZXQgY3VycmVudE1vZGVsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jbW9kZWw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50IG1vZGVsIHRoYXQgaXMgYmVpbmcgdXNlZCBieSB0aGUgdHJhbnNwb3J0IGxheWVyLlxuICAgICAqICoqTm90ZSoqOiBUaGUgbW9kZWwgY2Fubm90IGJlIGNoYW5nZWQgbWlkIGNvbnZlcnNhdGlvbi5cbiAgICAgKi9cbiAgICBzZXQgY3VycmVudE1vZGVsKG1vZGVsKSB7XG4gICAgICAgIHRoaXMuI21vZGVsID0gbW9kZWw7XG4gICAgfVxuICAgIGFzeW5jIF9nZXRBcGlLZXkob3B0aW9ucykge1xuICAgICAgICBjb25zdCBhcGlLZXkgPSBvcHRpb25zLmFwaUtleSA/PyB0aGlzLiNhcGlLZXk7XG4gICAgICAgIGlmICh0eXBlb2YgYXBpS2V5ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgYXBpS2V5KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFwaUtleTtcbiAgICB9XG4gICAgX29uTWVzc2FnZShldmVudCkge1xuICAgICAgICBjb25zdCB7IGRhdGE6IHBhcnNlZCwgaXNHZW5lcmljIH0gPSBwYXJzZVJlYWx0aW1lRXZlbnQoZXZlbnQpO1xuICAgICAgICBpZiAocGFyc2VkID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbWl0KCcqJywgcGFyc2VkKTtcbiAgICAgICAgaWYgKGlzR2VuZXJpYykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJzZWQudHlwZSA9PT0gJ2Vycm9yJykge1xuICAgICAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIHsgdHlwZTogJ2Vycm9yJywgZXJyb3I6IHBhcnNlZCB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdChwYXJzZWQudHlwZSwgcGFyc2VkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyc2VkLnR5cGUgPT09ICdyZXNwb25zZS5jcmVhdGVkJykge1xuICAgICAgICAgICAgdGhpcy5lbWl0KCd0dXJuX3N0YXJ0ZWQnLCB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ3Jlc3BvbnNlX3N0YXJ0ZWQnLFxuICAgICAgICAgICAgICAgIHByb3ZpZGVyRGF0YToge1xuICAgICAgICAgICAgICAgICAgICAuLi5wYXJzZWQsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJzZWQudHlwZSA9PT0gJ3Jlc3BvbnNlLmRvbmUnKSB7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3BvbnNlRG9uZUV2ZW50U2NoZW1hLnNhZmVQYXJzZShwYXJzZWQpO1xuICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdFcnJvciBwYXJzaW5nIHJlc3BvbnNlIGRvbmUgZXZlbnQnLCByZXNwb25zZS5lcnJvcik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgaW5wdXRUb2tlbnMgPSByZXNwb25zZS5kYXRhLnJlc3BvbnNlLnVzYWdlPy5pbnB1dF90b2tlbnMgPz8gMDtcbiAgICAgICAgICAgIGNvbnN0IG91dHB1dFRva2VucyA9IHJlc3BvbnNlLmRhdGEucmVzcG9uc2UudXNhZ2U/Lm91dHB1dF90b2tlbnMgPz8gMDtcbiAgICAgICAgICAgIGNvbnN0IHRvdGFsVG9rZW5zID0gaW5wdXRUb2tlbnMgKyBvdXRwdXRUb2tlbnM7XG4gICAgICAgICAgICBjb25zdCB1c2FnZSA9IG5ldyBVc2FnZSh7XG4gICAgICAgICAgICAgICAgaW5wdXRUb2tlbnMsXG4gICAgICAgICAgICAgICAgaW5wdXRUb2tlbnNEZXRhaWxzOiByZXNwb25zZS5kYXRhLnJlc3BvbnNlLnVzYWdlPy5pbnB1dF90b2tlbnNfZGV0YWlscyA/PyB7fSxcbiAgICAgICAgICAgICAgICBvdXRwdXRUb2tlbnMsXG4gICAgICAgICAgICAgICAgb3V0cHV0VG9rZW5zRGV0YWlsczogcmVzcG9uc2UuZGF0YS5yZXNwb25zZS51c2FnZT8ub3V0cHV0X3Rva2Vuc19kZXRhaWxzID8/IHt9LFxuICAgICAgICAgICAgICAgIHRvdGFsVG9rZW5zLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ3VzYWdlX3VwZGF0ZScsIHVzYWdlKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgndHVybl9kb25lJywge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdyZXNwb25zZV9kb25lJyxcbiAgICAgICAgICAgICAgICByZXNwb25zZToge1xuICAgICAgICAgICAgICAgICAgICBpZDogcmVzcG9uc2UuZGF0YS5yZXNwb25zZS5pZCA/PyAnJyxcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0OiByZXNwb25zZS5kYXRhLnJlc3BvbnNlLm91dHB1dCA/PyBbXSxcbiAgICAgICAgICAgICAgICAgICAgdXNhZ2U6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0VG9rZW5zLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRUb2tlbnNEZXRhaWxzOiByZXNwb25zZS5kYXRhLnJlc3BvbnNlLnVzYWdlPy5pbnB1dF90b2tlbnNfZGV0YWlscyA/PyB7fSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFRva2VucyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFRva2Vuc0RldGFpbHM6IHJlc3BvbnNlLmRhdGEucmVzcG9uc2UudXNhZ2U/Lm91dHB1dF90b2tlbnNfZGV0YWlscyA/PyB7fSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsVG9rZW5zLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyc2VkLnR5cGUgPT09ICdyZXNwb25zZS5hdWRpby5kb25lJykge1xuICAgICAgICAgICAgdGhpcy5lbWl0KCdhdWRpb19kb25lJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcnNlZC50eXBlID09PSAnY29udmVyc2F0aW9uLml0ZW0uZGVsZXRlZCcpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnaXRlbV9kZWxldGVkJywge1xuICAgICAgICAgICAgICAgIGl0ZW1JZDogcGFyc2VkLml0ZW1faWQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyc2VkLnR5cGUgPT09ICdjb252ZXJzYXRpb24uaXRlbS5pbnB1dF9hdWRpb190cmFuc2NyaXB0aW9uLmNvbXBsZXRlZCcgfHxcbiAgICAgICAgICAgIHBhcnNlZC50eXBlID09PSAnY29udmVyc2F0aW9uLml0ZW0udHJ1bmNhdGVkJykge1xuICAgICAgICAgICAgLy8gcmlnaHQgbm93IHJhdGhlciB0aGFuIGtlZXBpbmcgdHJhY2sgb2YgcGFydGlhbHMgYW5kIHJlYnVpbGRpbmcgdGhlIGl0ZW0gd2VcbiAgICAgICAgICAgIC8vIHdpbGwgcmV0cmlldmUgaXQgaW5zdGVhZCB3aGljaCB0cmlnZ2VycyB0aGUgYGNvbnZlcnNhdGlvbi5pdGVtLnJldHJpZXZlZGAgZXZlbnQgYmVsb3dcbiAgICAgICAgICAgIHRoaXMuc2VuZEV2ZW50KHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnY29udmVyc2F0aW9uLml0ZW0ucmV0cmlldmUnLFxuICAgICAgICAgICAgICAgIGl0ZW1faWQ6IHBhcnNlZC5pdGVtX2lkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcnNlZC50eXBlID09PSAnY29udmVyc2F0aW9uLml0ZW0uaW5wdXRfYXVkaW9fdHJhbnNjcmlwdGlvbi5kZWx0YScgfHxcbiAgICAgICAgICAgIHBhcnNlZC50eXBlID09PSAncmVzcG9uc2UudGV4dC5kZWx0YScgfHxcbiAgICAgICAgICAgIHBhcnNlZC50eXBlID09PSAncmVzcG9uc2UuYXVkaW9fdHJhbnNjcmlwdC5kZWx0YScgfHxcbiAgICAgICAgICAgIHBhcnNlZC50eXBlID09PSAncmVzcG9uc2UuZnVuY3Rpb25fY2FsbF9hcmd1bWVudHMuZGVsdGEnKSB7XG4gICAgICAgICAgICBpZiAocGFyc2VkLnR5cGUgPT09ICdyZXNwb25zZS5hdWRpb190cmFuc2NyaXB0LmRlbHRhJykge1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnYXVkaW9fdHJhbnNjcmlwdF9kZWx0YScsIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3RyYW5zY3JpcHRfZGVsdGEnLFxuICAgICAgICAgICAgICAgICAgICBkZWx0YTogcGFyc2VkLmRlbHRhLFxuICAgICAgICAgICAgICAgICAgICBpdGVtSWQ6IHBhcnNlZC5pdGVtX2lkLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gbm8gc3VwcG9ydCBmb3IgcGFydGlhbCB0cmFuc2NyaXB0cyB5ZXQuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcnNlZC50eXBlID09PSAnY29udmVyc2F0aW9uLml0ZW0uY3JlYXRlZCcgfHxcbiAgICAgICAgICAgIHBhcnNlZC50eXBlID09PSAnY29udmVyc2F0aW9uLml0ZW0ucmV0cmlldmVkJykge1xuICAgICAgICAgICAgaWYgKHBhcnNlZC5pdGVtLnR5cGUgPT09ICdtZXNzYWdlJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzSXRlbUlkID0gcGFyc2VkLnR5cGUgPT09ICdjb252ZXJzYXRpb24uaXRlbS5jcmVhdGVkJ1xuICAgICAgICAgICAgICAgICAgICA/IHBhcnNlZC5wcmV2aW91c19pdGVtX2lkXG4gICAgICAgICAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gcmVhbHRpbWVNZXNzYWdlSXRlbVNjaGVtYS5wYXJzZSh7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW1JZDogcGFyc2VkLml0ZW0uaWQsXG4gICAgICAgICAgICAgICAgICAgIHByZXZpb3VzSXRlbUlkLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBwYXJzZWQuaXRlbS50eXBlLFxuICAgICAgICAgICAgICAgICAgICByb2xlOiBwYXJzZWQuaXRlbS5yb2xlLFxuICAgICAgICAgICAgICAgICAgICBjb250ZW50OiBwYXJzZWQuaXRlbS5jb250ZW50LFxuICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHBhcnNlZC5pdGVtLnN0YXR1cyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2l0ZW1fdXBkYXRlJywgaXRlbSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJzZWQudHlwZSA9PT0gJ3Jlc3BvbnNlLm91dHB1dF9pdGVtLmRvbmUnIHx8XG4gICAgICAgICAgICBwYXJzZWQudHlwZSA9PT0gJ3Jlc3BvbnNlLm91dHB1dF9pdGVtLmFkZGVkJykge1xuICAgICAgICAgICAgY29uc3QgaXRlbSA9IHBhcnNlZC5pdGVtO1xuICAgICAgICAgICAgaWYgKGl0ZW0udHlwZSA9PT0gJ2Z1bmN0aW9uX2NhbGwnICYmIGl0ZW0uc3RhdHVzID09PSAnY29tcGxldGVkJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvb2xDYWxsID0gcmVhbHRpbWVUb29sQ2FsbEl0ZW0ucGFyc2Uoe1xuICAgICAgICAgICAgICAgICAgICBpdGVtSWQ6IGl0ZW0uaWQsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IGl0ZW0udHlwZSxcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiAnaW5fcHJvZ3Jlc3MnLCAvLyB3ZSBzZXQgaXQgdG8gaW5fcHJvZ3Jlc3MgZm9yIHRoZSBVSSBhcyBpdCB3aWxsIG9ubHkgYmUgY29tcGxldGVkIHdpdGggdGhlIG91dHB1dFxuICAgICAgICAgICAgICAgICAgICBhcmd1bWVudHM6IGl0ZW0uYXJndW1lbnRzLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBpdGVtLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIG91dHB1dDogbnVsbCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2l0ZW1fdXBkYXRlJywgdG9vbENhbGwpO1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnZnVuY3Rpb25fY2FsbCcsIHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGl0ZW0uaWQsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdmdW5jdGlvbl9jYWxsJyxcbiAgICAgICAgICAgICAgICAgICAgY2FsbElkOiBpdGVtLmNhbGxfaWQgPz8gJycsXG4gICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50czogaXRlbS5hcmd1bWVudHMgPz8gJycsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IGl0ZW0ubmFtZSA/PyAnJyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXRlbS50eXBlID09PSAnbWVzc2FnZScpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWFsdGltZUl0ZW0gPSByZWFsdGltZU1lc3NhZ2VJdGVtU2NoZW1hLnBhcnNlKHtcbiAgICAgICAgICAgICAgICAgICAgaXRlbUlkOiBwYXJzZWQuaXRlbS5pZCxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogcGFyc2VkLml0ZW0udHlwZSxcbiAgICAgICAgICAgICAgICAgICAgcm9sZTogcGFyc2VkLml0ZW0ucm9sZSxcbiAgICAgICAgICAgICAgICAgICAgY29udGVudDogcGFyc2VkLml0ZW0uY29udGVudCxcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiAnaW5fcHJvZ3Jlc3MnLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnaXRlbV91cGRhdGUnLCByZWFsdGltZUl0ZW0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBfb25FcnJvcihlcnJvcikge1xuICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywge1xuICAgICAgICAgICAgdHlwZTogJ2Vycm9yJyxcbiAgICAgICAgICAgIGVycm9yLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgX29uT3BlbigpIHtcbiAgICAgICAgdGhpcy5lbWl0KCdjb25uZWN0ZWQnKTtcbiAgICB9XG4gICAgX29uQ2xvc2UoKSB7XG4gICAgICAgIHRoaXMuZW1pdCgnZGlzY29ubmVjdGVkJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmQgYSBtZXNzYWdlIHRvIHRoZSBSZWFsdGltZSBBUEkuIFRoaXMgd2lsbCBjcmVhdGUgYSBuZXcgaXRlbSBpbiB0aGUgY29udmVyc2F0aW9uIGFuZFxuICAgICAqIHRyaWdnZXIgYSByZXNwb25zZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBtZXNzYWdlIC0gVGhlIG1lc3NhZ2UgdG8gc2VuZC5cbiAgICAgKiBAcGFyYW0gb3RoZXJFdmVudERhdGEgLSBBZGRpdGlvbmFsIGV2ZW50IGRhdGEgdG8gc2VuZC5cbiAgICAgKi9cbiAgICBzZW5kTWVzc2FnZShtZXNzYWdlLCBvdGhlckV2ZW50RGF0YSkge1xuICAgICAgICB0aGlzLnNlbmRFdmVudCh7XG4gICAgICAgICAgICB0eXBlOiAnY29udmVyc2F0aW9uLml0ZW0uY3JlYXRlJyxcbiAgICAgICAgICAgIGl0ZW06IHR5cGVvZiBtZXNzYWdlID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbWVzc2FnZScsXG4gICAgICAgICAgICAgICAgICAgIHJvbGU6ICd1c2VyJyxcbiAgICAgICAgICAgICAgICAgICAgY29udGVudDogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdpbnB1dF90ZXh0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBtZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgOiBtZXNzYWdlLFxuICAgICAgICAgICAgLi4ub3RoZXJFdmVudERhdGEsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnNlbmRFdmVudCh7XG4gICAgICAgICAgICB0eXBlOiAncmVzcG9uc2UuY3JlYXRlJyxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIF9nZXRNZXJnZWRTZXNzaW9uQ29uZmlnKGNvbmZpZykge1xuICAgICAgICBjb25zdCBzZXNzaW9uRGF0YSA9IHtcbiAgICAgICAgICAgIGluc3RydWN0aW9uczogY29uZmlnLmluc3RydWN0aW9ucyxcbiAgICAgICAgICAgIG1vZGVsOiBjb25maWcubW9kZWwgPz9cbiAgICAgICAgICAgICAgICB0aGlzLiNtb2RlbCA/P1xuICAgICAgICAgICAgICAgIERFRkFVTFRfT1BFTkFJX1JFQUxUSU1FX1NFU1NJT05fQ09ORklHLm1vZGVsLFxuICAgICAgICAgICAgdm9pY2U6IGNvbmZpZy52b2ljZSA/PyBERUZBVUxUX09QRU5BSV9SRUFMVElNRV9TRVNTSU9OX0NPTkZJRy52b2ljZSxcbiAgICAgICAgICAgIG1vZGFsaXRpZXM6IGNvbmZpZy5tb2RhbGl0aWVzID8/IERFRkFVTFRfT1BFTkFJX1JFQUxUSU1FX1NFU1NJT05fQ09ORklHLm1vZGFsaXRpZXMsXG4gICAgICAgICAgICBpbnB1dF9hdWRpb19mb3JtYXQ6IGNvbmZpZy5pbnB1dEF1ZGlvRm9ybWF0ID8/XG4gICAgICAgICAgICAgICAgREVGQVVMVF9PUEVOQUlfUkVBTFRJTUVfU0VTU0lPTl9DT05GSUcuaW5wdXRBdWRpb0Zvcm1hdCxcbiAgICAgICAgICAgIG91dHB1dF9hdWRpb19mb3JtYXQ6IGNvbmZpZy5vdXRwdXRBdWRpb0Zvcm1hdCA/P1xuICAgICAgICAgICAgICAgIERFRkFVTFRfT1BFTkFJX1JFQUxUSU1FX1NFU1NJT05fQ09ORklHLm91dHB1dEF1ZGlvRm9ybWF0LFxuICAgICAgICAgICAgaW5wdXRfYXVkaW9fdHJhbnNjcmlwdGlvbjogY29uZmlnLmlucHV0QXVkaW9UcmFuc2NyaXB0aW9uID8/XG4gICAgICAgICAgICAgICAgREVGQVVMVF9PUEVOQUlfUkVBTFRJTUVfU0VTU0lPTl9DT05GSUcuaW5wdXRBdWRpb1RyYW5zY3JpcHRpb24sXG4gICAgICAgICAgICB0dXJuX2RldGVjdGlvbjogY29uZmlnLnR1cm5EZXRlY3Rpb24gPz9cbiAgICAgICAgICAgICAgICBERUZBVUxUX09QRU5BSV9SRUFMVElNRV9TRVNTSU9OX0NPTkZJRy50dXJuRGV0ZWN0aW9uLFxuICAgICAgICAgICAgdG9vbF9jaG9pY2U6IGNvbmZpZy50b29sQ2hvaWNlID8/IERFRkFVTFRfT1BFTkFJX1JFQUxUSU1FX1NFU1NJT05fQ09ORklHLnRvb2xDaG9pY2UsXG4gICAgICAgICAgICB0b29sczogY29uZmlnLnRvb2xzPy5tYXAoKHRvb2wpID0+ICh7XG4gICAgICAgICAgICAgICAgLi4udG9vbCxcbiAgICAgICAgICAgICAgICBzdHJpY3Q6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgIC8vIFdlIGRvbid0IHNldCB0cmFjaW5nIGhlcmUgdG8gbWFrZSBzdXJlIHRoYXQgd2UgZG9uJ3QgdHJ5IHRvIG92ZXJyaWRlIGl0IG9uIGV2ZXJ5XG4gICAgICAgICAgICAvLyBzZXNzaW9uLnVwZGF0ZSBhcyBpdCBtaWdodCBsZWFkIHRvIGVycm9yc1xuICAgICAgICAgICAgLi4uKGNvbmZpZy5wcm92aWRlckRhdGEgPz8ge30pLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gc2Vzc2lvbkRhdGE7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGludGVybmFsIHRyYWNpbmcgY29uZmlnLiBUaGlzIGlzIHVzZWQgdG8gdHJhY2sgdGhlIHRyYWNpbmcgY29uZmlnIHRoYXQgaGFzIGJlZW4gc2V0XG4gICAgICogZHVyaW5nIHRoZSBzZXNzaW9uLmNyZWF0ZSBldmVudC5cbiAgICAgKi9cbiAgICBzZXQgX3RyYWNpbmdDb25maWcodHJhY2luZ0NvbmZpZykge1xuICAgICAgICB0aGlzLiN0cmFjaW5nQ29uZmlnID0gdHJhY2luZ0NvbmZpZztcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgdHJhY2luZyBjb25maWcgZm9yIHRoZSBzZXNzaW9uLiBUaGlzIHdpbGwgc2VuZCB0aGUgdHJhY2luZyBjb25maWcgdG8gdGhlIFJlYWx0aW1lIEFQSS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0cmFjaW5nQ29uZmlnIC0gVGhlIHRyYWNpbmcgY29uZmlnIHRvIHNldC4gV2UgZG9uJ3Qgc3VwcG9ydCAnYXV0bycgaGVyZSBhcyB0aGUgU0RLIHdpbGwgYWx3YXlzIGNvbmZpZ3VyZSBhIFdvcmtmbG93IE5hbWUgdW5sZXNzIGl0IGV4aXN0c1xuICAgICAqL1xuICAgIF91cGRhdGVUcmFjaW5nQ29uZmlnKHRyYWNpbmdDb25maWcpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLiN0cmFjaW5nQ29uZmlnID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgLy8gdHJlYXRpbmcgaXQgYXMgZGVmYXVsdCB2YWx1ZVxuICAgICAgICAgICAgdGhpcy4jdHJhY2luZ0NvbmZpZyA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRyYWNpbmdDb25maWcgPT09ICdhdXRvJykge1xuICAgICAgICAgICAgLy8gdHVybiBvbiB0cmFjaW5nIGluIGF1dG8gbW9kZVxuICAgICAgICAgICAgdGhpcy5zZW5kRXZlbnQoe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdzZXNzaW9uLnVwZGF0ZScsXG4gICAgICAgICAgICAgICAgc2Vzc2lvbjoge1xuICAgICAgICAgICAgICAgICAgICB0cmFjaW5nOiAnYXV0bycsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy4jdHJhY2luZ0NvbmZpZyAhPT0gJ3N0cmluZycgJiZcbiAgICAgICAgICAgIHR5cGVvZiB0cmFjaW5nQ29uZmlnICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgLy8gdHJhY2luZyBpcyBhbHJlYWR5IHNldCwgd2UgY2FuJ3QgY2hhbmdlIGl0XG4gICAgICAgICAgICBsb2dnZXIud2FybignVHJhY2luZyBjb25maWcgaXMgYWxyZWFkeSBzZXQsIHNraXBwaW5nIHNldHRpbmcgaXQgYWdhaW4uIFRoaXMgbGlrZWx5IGhhcHBlbnMgd2hlbiB5b3UgYWxyZWFkeSBzZXQgYSB0cmFjaW5nIGNvbmZpZyBvbiBzZXNzaW9uIGNyZWF0aW9uLicpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cmFjaW5nQ29uZmlnID09PSBudWxsKSB7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0Rpc2FibGluZyB0cmFjaW5nIGZvciB0aGlzIHNlc3Npb24uIEl0IGNhbm5vdCBiZSB0dXJuZWQgb24gZm9yIHRoaXMgc2Vzc2lvbiBmcm9tIHRoaXMgcG9pbnQgb24uJyk7XG4gICAgICAgICAgICB0aGlzLnNlbmRFdmVudCh7XG4gICAgICAgICAgICAgICAgdHlwZTogJ3Nlc3Npb24udXBkYXRlJyxcbiAgICAgICAgICAgICAgICBzZXNzaW9uOiB7XG4gICAgICAgICAgICAgICAgICAgIHRyYWNpbmc6IG51bGwsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLiN0cmFjaW5nQ29uZmlnID09PSBudWxsIHx8XG4gICAgICAgICAgICB0eXBlb2YgdGhpcy4jdHJhY2luZ0NvbmZpZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIC8vIHRyYWNpbmcgaXMgY3VycmVudGx5IG5vdCBzZXQgc28gd2UgY2FuIHNldCBpdCB0byB0aGUgbmV3IHZhbHVlXG4gICAgICAgICAgICB0aGlzLnNlbmRFdmVudCh7XG4gICAgICAgICAgICAgICAgdHlwZTogJ3Nlc3Npb24udXBkYXRlJyxcbiAgICAgICAgICAgICAgICBzZXNzaW9uOiB7XG4gICAgICAgICAgICAgICAgICAgIHRyYWNpbmc6IHRyYWNpbmdDb25maWcsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cmFjaW5nQ29uZmlnPy5ncm91cF9pZCAhPT0gdGhpcy4jdHJhY2luZ0NvbmZpZz8uZ3JvdXBfaWQgfHxcbiAgICAgICAgICAgIHRyYWNpbmdDb25maWc/Lm1ldGFkYXRhICE9PSB0aGlzLiN0cmFjaW5nQ29uZmlnPy5tZXRhZGF0YSB8fFxuICAgICAgICAgICAgdHJhY2luZ0NvbmZpZz8ud29ya2Zsb3dfbmFtZSAhPT0gdGhpcy4jdHJhY2luZ0NvbmZpZz8ud29ya2Zsb3dfbmFtZSkge1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ01pc21hdGNoIGluIHRyYWNpbmcgY29uZmlnLiBJZ25vcmluZyB0aGUgbmV3IHRyYWNpbmcgY29uZmlnLiBUaGlzIGxpa2VseSBoYXBwZW5zIHdoZW4geW91IGFscmVhZHkgc2V0IGEgdHJhY2luZyBjb25maWcgb24gc2Vzc2lvbiBjcmVhdGlvbi4gQ3VycmVudCB0cmFjaW5nIGNvbmZpZzogJXMsIG5ldyB0cmFjaW5nIGNvbmZpZzogJXMnLCBKU09OLnN0cmluZ2lmeSh0aGlzLiN0cmFjaW5nQ29uZmlnKSwgSlNPTi5zdHJpbmdpZnkodHJhY2luZ0NvbmZpZykpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2VuZEV2ZW50KHtcbiAgICAgICAgICAgIHR5cGU6ICdzZXNzaW9uLnVwZGF0ZScsXG4gICAgICAgICAgICBzZXNzaW9uOiB7XG4gICAgICAgICAgICAgICAgdHJhY2luZzogdHJhY2luZ0NvbmZpZyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHRoZSBzZXNzaW9uIGNvbmZpZy4gVGhpcyB3aWxsIG1lcmdlIGl0IHdpdGggdGhlIGN1cnJlbnQgc2Vzc2lvbiBjb25maWcgd2l0aCB0aGUgZGVmYXVsdFxuICAgICAqIHZhbHVlcyBhbmQgc2VuZCBpdCB0byB0aGUgUmVhbHRpbWUgQVBJLlxuICAgICAqXG4gICAgICogQHBhcmFtIGNvbmZpZyAtIFRoZSBzZXNzaW9uIGNvbmZpZyB0byB1cGRhdGUuXG4gICAgICovXG4gICAgdXBkYXRlU2Vzc2lvbkNvbmZpZyhjb25maWcpIHtcbiAgICAgICAgY29uc3Qgc2Vzc2lvbkRhdGEgPSB0aGlzLl9nZXRNZXJnZWRTZXNzaW9uQ29uZmlnKGNvbmZpZyk7XG4gICAgICAgIHRoaXMuc2VuZEV2ZW50KHtcbiAgICAgICAgICAgIHR5cGU6ICdzZXNzaW9uLnVwZGF0ZScsXG4gICAgICAgICAgICBzZXNzaW9uOiBzZXNzaW9uRGF0YSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmQgdGhlIG91dHB1dCBvZiBhIGZ1bmN0aW9uIGNhbGwgdG8gdGhlIFJlYWx0aW1lIEFQSS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0b29sQ2FsbCAtIFRoZSB0b29sIGNhbGwgdG8gc2VuZCB0aGUgb3V0cHV0IGZvci5cbiAgICAgKiBAcGFyYW0gb3V0cHV0IC0gVGhlIG91dHB1dCBvZiB0aGUgZnVuY3Rpb24gY2FsbC5cbiAgICAgKiBAcGFyYW0gc3RhcnRSZXNwb25zZSAtIFdoZXRoZXIgdG8gc3RhcnQgYSBuZXcgcmVzcG9uc2UgYWZ0ZXIgc2VuZGluZyB0aGUgb3V0cHV0LlxuICAgICAqL1xuICAgIHNlbmRGdW5jdGlvbkNhbGxPdXRwdXQodG9vbENhbGwsIG91dHB1dCwgc3RhcnRSZXNwb25zZSA9IHRydWUpIHtcbiAgICAgICAgdGhpcy5zZW5kRXZlbnQoe1xuICAgICAgICAgICAgdHlwZTogJ2NvbnZlcnNhdGlvbi5pdGVtLmNyZWF0ZScsXG4gICAgICAgICAgICBpdGVtOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2Z1bmN0aW9uX2NhbGxfb3V0cHV0JyxcbiAgICAgICAgICAgICAgICBvdXRwdXQsXG4gICAgICAgICAgICAgICAgY2FsbF9pZDogdG9vbENhbGwuY2FsbElkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBpdGVtID0gcmVhbHRpbWVUb29sQ2FsbEl0ZW0ucGFyc2Uoe1xuICAgICAgICAgICAgICAgIGl0ZW1JZDogdG9vbENhbGwuaWQsXG4gICAgICAgICAgICAgICAgcHJldmlvdXNJdGVtSWQ6IHRvb2xDYWxsLnByZXZpb3VzSXRlbUlkLFxuICAgICAgICAgICAgICAgIHR5cGU6ICdmdW5jdGlvbl9jYWxsJyxcbiAgICAgICAgICAgICAgICBzdGF0dXM6ICdjb21wbGV0ZWQnLFxuICAgICAgICAgICAgICAgIGFyZ3VtZW50czogdG9vbENhbGwuYXJndW1lbnRzLFxuICAgICAgICAgICAgICAgIG5hbWU6IHRvb2xDYWxsLm5hbWUsXG4gICAgICAgICAgICAgICAgb3V0cHV0LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2l0ZW1fdXBkYXRlJywgaXRlbSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0Vycm9yIHBhcnNpbmcgdG9vbCBjYWxsIGl0ZW0nLCBlcnJvciwgdG9vbENhbGwpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGFydFJlc3BvbnNlKSB7XG4gICAgICAgICAgICB0aGlzLnNlbmRFdmVudCh7XG4gICAgICAgICAgICAgICAgdHlwZTogJ3Jlc3BvbnNlLmNyZWF0ZScsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kIGFuIGF1ZGlvIGJ1ZmZlciB0byB0aGUgUmVhbHRpbWUgQVBJLiBJZiBgeyBjb21taXQ6IHRydWUgfWAgaXMgcGFzc2VkLCB0aGUgYXVkaW8gYnVmZmVyXG4gICAgICogd2lsbCBiZSBjb21taXR0ZWQgYW5kIHRoZSBtb2RlbCB3aWxsIHN0YXJ0IHByb2Nlc3NpbmcgaXQuIFRoaXMgaXMgbmVjZXNzYXJ5IGlmIHlvdSBoYXZlXG4gICAgICogZGlzYWJsZWQgdHVybiBkZXRlY3Rpb24gLyB2b2ljZSBhY3Rpdml0eSBkZXRlY3Rpb24gKFZBRCkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYXVkaW8gLSBUaGUgYXVkaW8gYnVmZmVyIHRvIHNlbmQuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgdGhlIGF1ZGlvIGJ1ZmZlci5cbiAgICAgKi9cbiAgICBzZW5kQXVkaW8oYXVkaW8sIHsgY29tbWl0ID0gZmFsc2UgfSA9IHt9KSB7XG4gICAgICAgIHRoaXMuc2VuZEV2ZW50KHtcbiAgICAgICAgICAgIHR5cGU6ICdpbnB1dF9hdWRpb19idWZmZXIuYXBwZW5kJyxcbiAgICAgICAgICAgIGF1ZGlvOiBhcnJheUJ1ZmZlclRvQmFzZTY0KGF1ZGlvKSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChjb21taXQpIHtcbiAgICAgICAgICAgIHRoaXMuc2VuZEV2ZW50KHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnaW5wdXRfYXVkaW9fYnVmZmVyLmNvbW1pdCcsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXNldCB0aGUgaGlzdG9yeSBvZiB0aGUgY29udmVyc2F0aW9uLiBUaGlzIHdpbGwgY3JlYXRlIGEgZGlmZiBiZXR3ZWVuIHRoZSBvbGQgYW5kIG5ldyBoaXN0b3J5XG4gICAgICogYW5kIHNlbmQgdGhlIG5lY2Vzc2FyeSBldmVudHMgdG8gdGhlIFJlYWx0aW1lIEFQSSB0byB1cGRhdGUgdGhlIGhpc3RvcnkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb2xkSGlzdG9yeSAtIFRoZSBvbGQgaGlzdG9yeSBvZiB0aGUgY29udmVyc2F0aW9uLlxuICAgICAqIEBwYXJhbSBuZXdIaXN0b3J5IC0gVGhlIG5ldyBoaXN0b3J5IG9mIHRoZSBjb252ZXJzYXRpb24uXG4gICAgICovXG4gICAgcmVzZXRIaXN0b3J5KG9sZEhpc3RvcnksIG5ld0hpc3RvcnkpIHtcbiAgICAgICAgY29uc3QgeyByZW1vdmFscywgYWRkaXRpb25zLCB1cGRhdGVzIH0gPSBkaWZmUmVhbHRpbWVIaXN0b3J5KG9sZEhpc3RvcnksIG5ld0hpc3RvcnkpO1xuICAgICAgICBjb25zdCByZW1vdmFsSWRzID0gbmV3IFNldChyZW1vdmFscy5tYXAoKGl0ZW0pID0+IGl0ZW0uaXRlbUlkKSk7XG4gICAgICAgIC8vIHdlIGRvbid0IGhhdmUgYW4gdXBkYXRlIGV2ZW50IGZvciBpdGVtcyBzbyB3ZSB3aWxsIHJlbW92ZSBhbmQgcmUtYWRkIHdoYXQncyB0aGVyZVxuICAgICAgICBmb3IgKGNvbnN0IHVwZGF0ZSBvZiB1cGRhdGVzKSB7XG4gICAgICAgICAgICByZW1vdmFsSWRzLmFkZCh1cGRhdGUuaXRlbUlkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVtb3ZhbElkcy5zaXplID4gMCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtSWQgb2YgcmVtb3ZhbElkcykge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VuZEV2ZW50KHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2NvbnZlcnNhdGlvbi5pdGVtLmRlbGV0ZScsXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1faWQ6IGl0ZW1JZCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhZGRpdGlvbnNBbmRVcGRhdGVzID0gWy4uLmFkZGl0aW9ucywgLi4udXBkYXRlc107XG4gICAgICAgIGZvciAoY29uc3QgYWRkaXRpb24gb2YgYWRkaXRpb25zQW5kVXBkYXRlcykge1xuICAgICAgICAgICAgaWYgKGFkZGl0aW9uLnR5cGUgPT09ICdtZXNzYWdlJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1FbnRyeSA9IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ21lc3NhZ2UnLFxuICAgICAgICAgICAgICAgICAgICByb2xlOiBhZGRpdGlvbi5yb2xlLFxuICAgICAgICAgICAgICAgICAgICBjb250ZW50OiBhZGRpdGlvbi5jb250ZW50LFxuICAgICAgICAgICAgICAgICAgICBpZDogYWRkaXRpb24uaXRlbUlkLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgaWYgKGFkZGl0aW9uLnJvbGUgIT09ICdzeXN0ZW0nICYmIGFkZGl0aW9uLnN0YXR1cykge1xuICAgICAgICAgICAgICAgICAgICBpdGVtRW50cnkuc3RhdHVzID0gYWRkaXRpb24uc3RhdHVzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnNlbmRFdmVudCh7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjb252ZXJzYXRpb24uaXRlbS5jcmVhdGUnLFxuICAgICAgICAgICAgICAgICAgICBpdGVtOiBpdGVtRW50cnksXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChhZGRpdGlvbi50eXBlID09PSAnZnVuY3Rpb25fY2FsbCcpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIud2FybignRnVuY3Rpb24gY2FsbHMgY2Fubm90IGJlIG1hbnVhbGx5IGFkZGVkIG9yIHVwZGF0ZWQgYXQgdGhlIG1vbWVudC4gSWdub3JpbmcuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1vcGVuYWlSZWFsdGltZUJhc2UubWpzLm1hcCIsIi8vLyA8cmVmZXJlbmNlIGxpYj1cImRvbVwiIC8+XG5pbXBvcnQgeyBpc0Jyb3dzZXJFbnZpcm9ubWVudCB9IGZyb20gJ0BvcGVuYWkvYWdlbnRzLWNvcmUvX3NoaW1zJztcbmltcG9ydCB7IFVzZXJFcnJvciB9IGZyb20gJ0BvcGVuYWkvYWdlbnRzLWNvcmUnO1xuaW1wb3J0IGxvZ2dlciBmcm9tIFwiLi9sb2dnZXIubWpzXCI7XG5pbXBvcnQgeyBPcGVuQUlSZWFsdGltZUJhc2UsIH0gZnJvbSBcIi4vb3BlbmFpUmVhbHRpbWVCYXNlLm1qc1wiO1xuaW1wb3J0IHsgcGFyc2VSZWFsdGltZUV2ZW50IH0gZnJvbSBcIi4vb3BlbmFpUmVhbHRpbWVFdmVudHMubWpzXCI7XG5pbXBvcnQgeyBIRUFERVJTIH0gZnJvbSBcIi4vdXRpbHMubWpzXCI7XG4vKipcbiAqIFRyYW5zcG9ydCBsYXllciB0aGF0J3MgaGFuZGxpbmcgdGhlIGNvbm5lY3Rpb24gYmV0d2VlbiB0aGUgY2xpZW50IGFuZCBPcGVuQUkncyBSZWFsdGltZSBBUElcbiAqIHZpYSBXZWJSVEMuIFdoaWxlIHRoaXMgdHJhbnNwb3J0IGxheWVyIGlzIGRlc2lnbmVkIHRvIGJlIHVzZWQgd2l0aGluIGEgUmVhbHRpbWVTZXNzaW9uLCBpdCBjYW5cbiAqIGFsc28gYmUgdXNlZCBzdGFuZGFsb25lIGlmIHlvdSB3YW50IHRvIGhhdmUgYSBkaXJlY3QgY29ubmVjdGlvbiB0byB0aGUgUmVhbHRpbWUgQVBJLlxuICpcbiAqIFVubGVzcyB5b3Ugc3BlY2lmeSBhIGBtZWRpYVN0cmVhbWAgb3IgYGF1ZGlvRWxlbWVudGAgb3B0aW9uLCB0aGUgdHJhbnNwb3J0IGxheWVyIHdpbGxcbiAqIGF1dG9tYXRpY2FsbHkgY29uZmlndXJlIHRoZSBtaWNyb3Bob25lIGFuZCBhdWRpbyBvdXRwdXQgdG8gYmUgdXNlZCBieSB0aGUgc2Vzc2lvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIE9wZW5BSVJlYWx0aW1lV2ViUlRDIGV4dGVuZHMgT3BlbkFJUmVhbHRpbWVCYXNlIHtcbiAgICBvcHRpb25zO1xuICAgICN1cmw7XG4gICAgI3N0YXRlID0ge1xuICAgICAgICBzdGF0dXM6ICdkaXNjb25uZWN0ZWQnLFxuICAgICAgICBwZWVyQ29ubmVjdGlvbjogdW5kZWZpbmVkLFxuICAgICAgICBkYXRhQ2hhbm5lbDogdW5kZWZpbmVkLFxuICAgIH07XG4gICAgI3VzZUluc2VjdXJlQXBpS2V5O1xuICAgICNvbmdvaW5nUmVzcG9uc2UgPSBmYWxzZTtcbiAgICAjbXV0ZWQgPSBmYWxzZTtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zID0ge30pIHtcbiAgICAgICAgaWYgKHR5cGVvZiBSVENQZWVyQ29ubmVjdGlvbiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV2ViUlRDIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBlbnZpcm9ubWVudCcpO1xuICAgICAgICB9XG4gICAgICAgIHN1cGVyKG9wdGlvbnMpO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICB0aGlzLiN1cmwgPSBvcHRpb25zLmJhc2VVcmwgPz8gYGh0dHBzOi8vYXBpLm9wZW5haS5jb20vdjEvcmVhbHRpbWVgO1xuICAgICAgICB0aGlzLiN1c2VJbnNlY3VyZUFwaUtleSA9IG9wdGlvbnMudXNlSW5zZWN1cmVBcGlLZXkgPz8gZmFsc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50IHN0YXR1cyBvZiB0aGUgV2ViUlRDIGNvbm5lY3Rpb24uXG4gICAgICovXG4gICAgZ2V0IHN0YXR1cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3N0YXRlLnN0YXR1cztcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbnQgY29ubmVjdGlvbiBzdGF0ZSBvZiB0aGUgV2ViUlRDIGNvbm5lY3Rpb24gaW5jbHVkaW5nIHRoZSBwZWVyIGNvbm5lY3Rpb24gYW5kIGRhdGFcbiAgICAgKiBjaGFubmVsLlxuICAgICAqL1xuICAgIGdldCBjb25uZWN0aW9uU3RhdGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNzdGF0ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGUgc2Vzc2lvbiBpcyBtdXRlZC5cbiAgICAgKi9cbiAgICBnZXQgbXV0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNtdXRlZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29ubmVjdCB0byB0aGUgUmVhbHRpbWUgQVBJLiBUaGlzIHdpbGwgZXN0YWJsaXNoIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBPcGVuQUkgUmVhbHRpbWUgQVBJXG4gICAgICogdmlhIFdlYlJUQy5cbiAgICAgKlxuICAgICAqIElmIHlvdSBhcmUgdXNpbmcgYSBicm93c2VyLCB0aGUgdHJhbnNwb3J0IGxheWVyIHdpbGwgYWxzbyBhdXRvbWF0aWNhbGx5IGNvbmZpZ3VyZSB0aGVcbiAgICAgKiBtaWNyb3Bob25lIGFuZCBhdWRpbyBvdXRwdXQgdG8gYmUgdXNlZCBieSB0aGUgc2Vzc2lvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIHRoZSBjb25uZWN0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIGNvbm5lY3Qob3B0aW9ucykge1xuICAgICAgICBpZiAodGhpcy4jc3RhdGUuc3RhdHVzID09PSAnY29ubmVjdGVkJykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLiNzdGF0ZS5zdGF0dXMgPT09ICdjb25uZWN0aW5nJykge1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ1JlYWx0aW1lIGNvbm5lY3Rpb24gYWxyZWFkeSBpbiBwcm9ncmVzcy4gUGxlYXNlIGF3YWl0IG9yaWdpbmFsIHByb21pc2UnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtb2RlbCA9IG9wdGlvbnMubW9kZWwgPz8gdGhpcy5jdXJyZW50TW9kZWw7XG4gICAgICAgIHRoaXMuY3VycmVudE1vZGVsID0gbW9kZWw7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBvcHRpb25zLnVybCA/PyB0aGlzLiN1cmw7XG4gICAgICAgIGNvbnN0IGFwaUtleSA9IGF3YWl0IHRoaXMuX2dldEFwaUtleShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgaXNDbGllbnRLZXkgPSB0eXBlb2YgYXBpS2V5ID09PSAnc3RyaW5nJyAmJiBhcGlLZXkuc3RhcnRzV2l0aCgnZWtfJyk7XG4gICAgICAgIGlmIChpc0Jyb3dzZXJFbnZpcm9ubWVudCgpICYmICF0aGlzLiN1c2VJbnNlY3VyZUFwaUtleSAmJiAhaXNDbGllbnRLZXkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBVc2VyRXJyb3IoJ1VzaW5nIHRoZSBXZWJSVEMgY29ubmVjdGlvbiBpbiBhIGJyb3dzZXIgZW52aXJvbm1lbnQgcmVxdWlyZXMgYW4gaW5zZWN1cmUgQVBJIGtleS4gUGxlYXNlIHVzZSBhIFdlYlNvY2tldCBjb25uZWN0aW9uIGluc3RlYWQgb3Igc2V0IHRoZSB1c2VJbnNlY3VyZUFwaUtleSBvcHRpb24gdG8gdHJ1ZS4nKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXN5bmMtcHJvbWlzZS1leGVjdXRvclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCB1c2VyU2Vzc2lvbkNvbmZpZyA9IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uKG9wdGlvbnMuaW5pdGlhbFNlc3Npb25Db25maWcgfHwge30pLFxuICAgICAgICAgICAgICAgICAgICBtb2RlbDogdGhpcy5jdXJyZW50TW9kZWwsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25uZWN0aW9uVXJsID0gbmV3IFVSTChiYXNlVXJsKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwZWVyQ29ubmVjdGlvbiA9IG5ldyBSVENQZWVyQ29ubmVjdGlvbigpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFDaGFubmVsID0gcGVlckNvbm5lY3Rpb24uY3JlYXRlRGF0YUNoYW5uZWwoJ29haS1ldmVudHMnKTtcbiAgICAgICAgICAgICAgICB0aGlzLiNzdGF0ZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiAnY29ubmVjdGluZycsXG4gICAgICAgICAgICAgICAgICAgIHBlZXJDb25uZWN0aW9uLFxuICAgICAgICAgICAgICAgICAgICBkYXRhQ2hhbm5lbCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnY29ubmVjdGlvbl9jaGFuZ2UnLCB0aGlzLiNzdGF0ZS5zdGF0dXMpO1xuICAgICAgICAgICAgICAgIGRhdGFDaGFubmVsLmFkZEV2ZW50TGlzdGVuZXIoJ29wZW4nLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI3N0YXRlID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiAnY29ubmVjdGVkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBlZXJDb25uZWN0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUNoYW5uZWwsXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIC8vIFNlbmRpbmcgdGhlIHNlc3Npb24gY29uZmlnIGFnYWluIGhlcmUgb25jZSB0aGUgY2hhbm5lbCBpcyBjb25uZWN0ZWQgdG8gZW5zdXJlXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoYXQgdGhlIHNlc3Npb24gY29uZmlnIGlzIHNlbnQgdG8gdGhlIHNlcnZlciBiZWZvcmUgdGhlIGZpcnN0IHJlc3BvbnNlIGlzIHJlY2VpdmVkXG4gICAgICAgICAgICAgICAgICAgIC8vIFNldHRpbmcgaXQgb24gY29ubmVjdGlvbiBzaG91bGQgd29yayBidXQgdGhlIGNvbmZpZyBpcyBub3QgYmVpbmcgdmFsaWRhdGVkIG9uIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyBzZXJ2ZXIuIFRoaXMgdHJpZ2dlcnMgYSB2YWxpZGF0aW9uIGVycm9yIGlmIHRoZSBjb25maWcgaXMgbm90IHZhbGlkLlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVNlc3Npb25Db25maWcodXNlclNlc3Npb25Db25maWcpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2Nvbm5lY3Rpb25fY2hhbmdlJywgdGhpcy4jc3RhdGUuc3RhdHVzKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25PcGVuKCk7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBkYXRhQ2hhbm5lbC5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX29uRXJyb3IoZXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXZlbnQpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGRhdGFDaGFubmVsLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25NZXNzYWdlKGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBkYXRhOiBwYXJzZWQsIGlzR2VuZXJpYyB9ID0gcGFyc2VSZWFsdGltZUV2ZW50KGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJzZWQgfHwgaXNHZW5lcmljKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnNlZC50eXBlID09PSAncmVzcG9uc2UuY3JlYXRlZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuI29uZ29pbmdSZXNwb25zZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocGFyc2VkLnR5cGUgPT09ICdyZXNwb25zZS5kb25lJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4jb25nb2luZ1Jlc3BvbnNlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnNlZC50eXBlID09PSAnc2Vzc2lvbi5jcmVhdGVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhY2luZ0NvbmZpZyA9IHBhcnNlZC5zZXNzaW9uLnRyYWNpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUcnlpbmcgdG8gdHVybiBvbiB0cmFjaW5nIGFmdGVyIHRoZSBzZXNzaW9uIGlzIGNyZWF0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVRyYWNpbmdDb25maWcodXNlclNlc3Npb25Db25maWcudHJhY2luZyA/PyAnYXV0bycpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgLy8gc2V0IHVwIGF1ZGlvIHBsYXliYWNrXG4gICAgICAgICAgICAgICAgY29uc3QgYXVkaW9FbGVtZW50ID0gdGhpcy5vcHRpb25zLmF1ZGlvRWxlbWVudCA/PyBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhdWRpbycpO1xuICAgICAgICAgICAgICAgIGF1ZGlvRWxlbWVudC5hdXRvcGxheSA9IHRydWU7XG4gICAgICAgICAgICAgICAgcGVlckNvbm5lY3Rpb24ub250cmFjayA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBhdWRpb0VsZW1lbnQuc3JjT2JqZWN0ID0gZXZlbnQuc3RyZWFtc1swXTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIC8vIGdldCBtaWNyb3Bob25lIHN0cmVhbVxuICAgICAgICAgICAgICAgIGNvbnN0IHN0cmVhbSA9IHRoaXMub3B0aW9ucy5tZWRpYVN0cmVhbSA/P1xuICAgICAgICAgICAgICAgICAgICAoYXdhaXQgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5nZXRVc2VyTWVkaWEoe1xuICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW86IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICBwZWVyQ29ubmVjdGlvbi5hZGRUcmFjayhzdHJlYW0uZ2V0QXVkaW9UcmFja3MoKVswXSk7XG4gICAgICAgICAgICAgICAgY29uc3Qgb2ZmZXIgPSBhd2FpdCBwZWVyQ29ubmVjdGlvbi5jcmVhdGVPZmZlcigpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHBlZXJDb25uZWN0aW9uLnNldExvY2FsRGVzY3JpcHRpb24ob2ZmZXIpO1xuICAgICAgICAgICAgICAgIGlmICghb2ZmZXIuc2RwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGNyZWF0ZSBvZmZlcicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBzZXNzaW9uQ29uZmlnID0ge1xuICAgICAgICAgICAgICAgICAgICAuLi50aGlzLl9nZXRNZXJnZWRTZXNzaW9uQ29uZmlnKHVzZXJTZXNzaW9uQ29uZmlnKSxcbiAgICAgICAgICAgICAgICAgICAgbW9kZWw6IHRoaXMuY3VycmVudE1vZGVsLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICAgICAgICAgICAgIGRhdGEuYXBwZW5kKCdzZHAnLCBvZmZlci5zZHApO1xuICAgICAgICAgICAgICAgIGRhdGEuYXBwZW5kKCdzZXNzaW9uJywgSlNPTi5zdHJpbmdpZnkoc2Vzc2lvbkNvbmZpZykpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNkcFJlc3BvbnNlID0gYXdhaXQgZmV0Y2goY29ubmVjdGlvblVybCwge1xuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICAgICAgYm9keTogZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke2FwaUtleX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ1gtT3BlbkFJLUFnZW50cy1TREsnOiBIRUFERVJTWydYLU9wZW5BSS1BZ2VudHMtU0RLJ10sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY29uc3QgYW5zd2VyID0ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYW5zd2VyJyxcbiAgICAgICAgICAgICAgICAgICAgc2RwOiBhd2FpdCBzZHBSZXNwb25zZS50ZXh0KCksXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBhd2FpdCBwZWVyQ29ubmVjdGlvbi5zZXRSZW1vdGVEZXNjcmlwdGlvbihhbnN3ZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuX29uRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kIGFuIGV2ZW50IHRvIHRoZSBSZWFsdGltZSBBUEkuIFRoaXMgd2lsbCBzdHJpbmdpZnkgdGhlIGV2ZW50IGFuZCBzZW5kIGl0IGRpcmVjdGx5IHRvIHRoZVxuICAgICAqIEFQSS4gVGhpcyBjYW4gYmUgdXNlZCBpZiB5b3Ugd2FudCB0byB0YWtlIGNvbnRyb2wgb3ZlciB0aGUgY29ubmVjdGlvbiBhbmQgc2VuZCBldmVudHMgbWFudWFsbHkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZXZlbnQgLSBUaGUgZXZlbnQgdG8gc2VuZC5cbiAgICAgKi9cbiAgICBzZW5kRXZlbnQoZXZlbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLiNzdGF0ZS5kYXRhQ2hhbm5lbCB8fFxuICAgICAgICAgICAgdGhpcy4jc3RhdGUuZGF0YUNoYW5uZWwucmVhZHlTdGF0ZSAhPT0gJ29wZW4nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dlYlJUQyBkYXRhIGNoYW5uZWwgaXMgbm90IGNvbm5lY3RlZC4gTWFrZSBzdXJlIHlvdSBjYWxsIGBjb25uZWN0KClgIGJlZm9yZSBzZW5kaW5nIGV2ZW50cy4nKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNzdGF0ZS5kYXRhQ2hhbm5lbC5zZW5kKEpTT04uc3RyaW5naWZ5KGV2ZW50KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE11dGUgb3IgdW5tdXRlIHRoZSBzZXNzaW9uLlxuICAgICAqIEBwYXJhbSBtdXRlZCAtIFdoZXRoZXIgdG8gbXV0ZSB0aGUgc2Vzc2lvbi5cbiAgICAgKi9cbiAgICBtdXRlKG11dGVkKSB7XG4gICAgICAgIHRoaXMuI211dGVkID0gbXV0ZWQ7XG4gICAgICAgIGlmICh0aGlzLiNzdGF0ZS5wZWVyQ29ubmVjdGlvbikge1xuICAgICAgICAgICAgY29uc3QgcGVlckNvbm5lY3Rpb24gPSB0aGlzLiNzdGF0ZS5wZWVyQ29ubmVjdGlvbjtcbiAgICAgICAgICAgIHBlZXJDb25uZWN0aW9uLmdldFNlbmRlcnMoKS5mb3JFYWNoKChzZW5kZXIpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoc2VuZGVyLnRyYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbmRlci50cmFjay5lbmFibGVkID0gIW11dGVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsb3NlIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBSZWFsdGltZSBBUEkgYW5kIGRpc2Nvbm5lY3RzIHRoZSB1bmRlcmx5aW5nIFdlYlJUQyBjb25uZWN0aW9uLlxuICAgICAqL1xuICAgIGNsb3NlKCkge1xuICAgICAgICBpZiAodGhpcy4jc3RhdGUuZGF0YUNoYW5uZWwpIHtcbiAgICAgICAgICAgIHRoaXMuI3N0YXRlLmRhdGFDaGFubmVsLmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuI3N0YXRlLnBlZXJDb25uZWN0aW9uKSB7XG4gICAgICAgICAgICBjb25zdCBwZWVyQ29ubmVjdGlvbiA9IHRoaXMuI3N0YXRlLnBlZXJDb25uZWN0aW9uO1xuICAgICAgICAgICAgcGVlckNvbm5lY3Rpb24uZ2V0U2VuZGVycygpLmZvckVhY2goKHNlbmRlcikgPT4ge1xuICAgICAgICAgICAgICAgIHNlbmRlci50cmFjaz8uc3RvcCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBwZWVyQ29ubmVjdGlvbi5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLiNzdGF0ZS5zdGF0dXMgIT09ICdkaXNjb25uZWN0ZWQnKSB7XG4gICAgICAgICAgICB0aGlzLiNzdGF0ZSA9IHtcbiAgICAgICAgICAgICAgICBzdGF0dXM6ICdkaXNjb25uZWN0ZWQnLFxuICAgICAgICAgICAgICAgIHBlZXJDb25uZWN0aW9uOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgZGF0YUNoYW5uZWw6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2Nvbm5lY3Rpb25fY2hhbmdlJywgdGhpcy4jc3RhdGUuc3RhdHVzKTtcbiAgICAgICAgICAgIHRoaXMuX29uQ2xvc2UoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnRlcnJ1cHQgdGhlIGN1cnJlbnQgcmVzcG9uc2UgaWYgb25lIGlzIG9uZ29pbmcgYW5kIGNsZWFyIHRoZSBhdWRpbyBidWZmZXIgc28gdGhhdCB0aGUgYWdlbnRcbiAgICAgKiBzdG9wcyB0YWxraW5nLlxuICAgICAqL1xuICAgIGludGVycnVwdCgpIHtcbiAgICAgICAgaWYgKHRoaXMuI29uZ29pbmdSZXNwb25zZSkge1xuICAgICAgICAgICAgdGhpcy5zZW5kRXZlbnQoe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdyZXNwb25zZS5jYW5jZWwnLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZW5kRXZlbnQoe1xuICAgICAgICAgICAgdHlwZTogJ291dHB1dF9hdWRpb19idWZmZXIuY2xlYXInLFxuICAgICAgICB9KTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1vcGVuYWlSZWFsdGltZVdlYlJ0Yy5tanMubWFwIiwiLy8vIDxyZWZlcmVuY2UgbGliPVwiZG9tXCIgLz5cbmV4cG9ydCBjb25zdCBXZWJTb2NrZXQgPSBnbG9iYWxUaGlzLldlYlNvY2tldDtcbmV4cG9ydCBmdW5jdGlvbiBpc0Jyb3dzZXJFbnZpcm9ubWVudCgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNoaW1zLWJyb3dzZXIubWpzLm1hcCIsImltcG9ydCB7IGlzQnJvd3NlckVudmlyb25tZW50LCBXZWJTb2NrZXQsIH0gZnJvbSAnQG9wZW5haS9hZ2VudHMtcmVhbHRpbWUvX3NoaW1zJztcbmltcG9ydCB7IE9wZW5BSVJlYWx0aW1lQmFzZSwgfSBmcm9tIFwiLi9vcGVuYWlSZWFsdGltZUJhc2UubWpzXCI7XG5pbXBvcnQgeyBiYXNlNjRUb0FycmF5QnVmZmVyLCBIRUFERVJTLCBXRUJTT0NLRVRfTUVUQSB9IGZyb20gXCIuL3V0aWxzLm1qc1wiO1xuaW1wb3J0IHsgVXNlckVycm9yIH0gZnJvbSAnQG9wZW5haS9hZ2VudHMtY29yZSc7XG5pbXBvcnQgeyBwYXJzZVJlYWx0aW1lRXZlbnQgfSBmcm9tIFwiLi9vcGVuYWlSZWFsdGltZUV2ZW50cy5tanNcIjtcbi8qKlxuICogVHJhbnNwb3J0IGxheWVyIHRoYXQncyBoYW5kbGluZyB0aGUgY29ubmVjdGlvbiBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIE9wZW5BSSdzIFJlYWx0aW1lIEFQSVxuICogdmlhIFdlYlNvY2tldHMuIFdoaWxlIHRoaXMgdHJhbnNwb3J0IGxheWVyIGlzIGRlc2lnbmVkIHRvIGJlIHVzZWQgd2l0aGluIGEgUmVhbHRpbWVTZXNzaW9uLCBpdFxuICogY2FuIGFsc28gYmUgdXNlZCBzdGFuZGFsb25lIGlmIHlvdSB3YW50IHRvIGhhdmUgYSBkaXJlY3QgY29ubmVjdGlvbiB0byB0aGUgUmVhbHRpbWUgQVBJLlxuICovXG5leHBvcnQgY2xhc3MgT3BlbkFJUmVhbHRpbWVXZWJTb2NrZXQgZXh0ZW5kcyBPcGVuQUlSZWFsdGltZUJhc2Uge1xuICAgICNhcGlLZXk7XG4gICAgI3VybDtcbiAgICAjc3RhdGUgPSB7XG4gICAgICAgIHN0YXR1czogJ2Rpc2Nvbm5lY3RlZCcsXG4gICAgICAgIHdlYnNvY2tldDogdW5kZWZpbmVkLFxuICAgIH07XG4gICAgI3VzZUluc2VjdXJlQXBpS2V5O1xuICAgICNjdXJyZW50SXRlbUlkO1xuICAgICNjdXJyZW50QXVkaW9Db250ZW50SW5kZXg7XG4gICAgLyoqXG4gICAgICogVGltZXN0YW1wIG1haW50YWluZWQgYnkgdGhlIHRyYW5zcG9ydCBsYXllciB0byBhaWQgd2l0aCB0aGUgY2FsY3VsYXRpb24gb2YgdGhlIGVsYXBzZWQgdGltZVxuICAgICAqIHNpbmNlIHRoZSByZXNwb25zZSBzdGFydGVkIHRvIGNvbXB1dGUgdGhlIHJpZ2h0IGludGVycnVwdGlvbiB0aW1lLlxuICAgICAqXG4gICAgICogTW9zdGx5IGludGVybmFsIGJ1dCBtaWdodCBiZSB1c2VkIGJ5IGV4dGVuZGVkIHRyYW5zcG9ydCBsYXllcnMgZm9yIHRoZWlyIGludGVycnVwdGlvblxuICAgICAqIGNhbGN1bGF0aW9uLlxuICAgICAqL1xuICAgIF9maXJzdEF1ZGlvVGltZXN0YW1wO1xuICAgIF9hdWRpb0xlbmd0aE1zID0gMDtcbiAgICAjb25nb2luZ1Jlc3BvbnNlID0gZmFsc2U7XG4gICAgY29uc3RydWN0b3Iob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHN1cGVyKG9wdGlvbnMpO1xuICAgICAgICB0aGlzLiN1cmwgPSBgd3NzOi8vYXBpLm9wZW5haS5jb20vdjEvcmVhbHRpbWU/bW9kZWw9JHt0aGlzLmN1cnJlbnRNb2RlbH1gO1xuICAgICAgICB0aGlzLiN1c2VJbnNlY3VyZUFwaUtleSA9IG9wdGlvbnMudXNlSW5zZWN1cmVBcGlLZXkgPz8gZmFsc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50IHN0YXR1cyBvZiB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb24uXG4gICAgICovXG4gICAgZ2V0IHN0YXR1cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3N0YXRlLnN0YXR1cztcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbnQgY29ubmVjdGlvbiBzdGF0ZSBvZiB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb24uXG4gICAgICovXG4gICAgZ2V0IGNvbm5lY3Rpb25TdGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3N0YXRlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbHdheXMgcmV0dXJucyBgbnVsbGAgYXMgdGhlIFdlYlNvY2tldCB0cmFuc3BvcnQgbGF5ZXIgZG9lcyBub3QgaGFuZGxlIG11dGluZy4gSW5zdGVhZCxcbiAgICAgKiB0aGlzIHNob3VsZCBiZSBoYW5kbGVkIGJ5IHRoZSBjbGllbnQgYnkgbm90IHRyaWdnZXJpbmcgdGhlIGBzZW5kQXVkaW9gIG1ldGhvZC5cbiAgICAgKi9cbiAgICBnZXQgbXV0ZWQoKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVudCBpdGVtIElEIG9mIHRoZSBvbmdvaW5nIHJlc3BvbnNlLlxuICAgICAqL1xuICAgIGdldCBjdXJyZW50SXRlbUlkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jY3VycmVudEl0ZW1JZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVHJpZ2dlcnMgdGhlIGBhdWRpb2AgZXZlbnQgdGhhdCBhIGNsaWVudCBtaWdodCBsaXN0ZW4gdG8gdG8gcmVjZWl2ZSB0aGUgYXVkaW8gYnVmZmVyLlxuICAgICAqIFByb3RlY3RlZCBmb3IgeW91IHRvIGJlIGFibGUgdG8gb3ZlcnJpZGUgYW5kIGRpc2FibGUgZW1pdHRpbmcgdGhpcyBldmVudCBpbiBjYXNlIHlvdXIgZXh0ZW5kZWRcbiAgICAgKiB0cmFuc3BvcnQgbGF5ZXIgaGFuZGxlcyBhdWRpbyBpbnRlcm5hbGx5LlxuICAgICAqXG4gICAgICogQHBhcmFtIGF1ZGlvRXZlbnQgLSBUaGUgYXVkaW8gZXZlbnQgdG8gZW1pdC5cbiAgICAgKi9cbiAgICBfb25BdWRpbyhhdWRpb0V2ZW50KSB7XG4gICAgICAgIHRoaXMuZW1pdCgnYXVkaW8nLCBhdWRpb0V2ZW50KTtcbiAgICB9XG4gICAgI3NldHVwV2ViU29ja2V0KHJlc29sdmUsIHJlamVjdCwgc2Vzc2lvbkNvbmZpZykge1xuICAgICAgICBpZiAodGhpcy4jc3RhdGUud2Vic29ja2V0KSB7XG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLiNhcGlLZXkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBVc2VyRXJyb3IoJ0FQSSBrZXkgaXMgbm90IHNldC4gUGxlYXNlIGNhbGwgYGNvbm5lY3QoKWAgd2l0aCBhbiBBUEkga2V5IGZpcnN0LicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0Jyb3dzZXJFbnZpcm9ubWVudCgpICYmXG4gICAgICAgICAgICAhdGhpcy4jYXBpS2V5LnN0YXJ0c1dpdGgoJ2VrXycpICYmXG4gICAgICAgICAgICAhdGhpcy4jdXNlSW5zZWN1cmVBcGlLZXkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBVc2VyRXJyb3IoJ1VzaW5nIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbiBpbiBhIGJyb3dzZXIgZW52aXJvbm1lbnQgcmVxdWlyZXMgYW4gZXBoZW1lcmFsIGNsaWVudCBrZXkuIElmIHlvdSBoYXZlIHRvIHVzZSBhIHJlZ3VsYXIgQVBJIGtleSwgc2V0IHRoZSBgdXNlSW5zZWN1cmVBcGlLZXlgIG9wdGlvbiB0byB0cnVlLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHdlYnNvY2tldEFyZ3VtZW50cyA9IGlzQnJvd3NlckVudmlyb25tZW50KClcbiAgICAgICAgICAgID8gW1xuICAgICAgICAgICAgICAgICdyZWFsdGltZScsXG4gICAgICAgICAgICAgICAgLy8gQXV0aFxuICAgICAgICAgICAgICAgICdvcGVuYWktaW5zZWN1cmUtYXBpLWtleS4nICsgdGhpcy4jYXBpS2V5LFxuICAgICAgICAgICAgICAgIC8vIEJldGEgcHJvdG9jb2wsIHJlcXVpcmVkXG4gICAgICAgICAgICAgICAgJ29wZW5haS1iZXRhLnJlYWx0aW1lLXYxJyxcbiAgICAgICAgICAgICAgICAvLyBWZXJzaW9uIGhlYWRlclxuICAgICAgICAgICAgICAgIFdFQlNPQ0tFVF9NRVRBLFxuICAgICAgICAgICAgXVxuICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dGhpcy4jYXBpS2V5fWAsXG4gICAgICAgICAgICAgICAgICAgICdPcGVuQUktQmV0YSc6ICdyZWFsdGltZT12MScsXG4gICAgICAgICAgICAgICAgICAgIC4uLkhFQURFUlMsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIGNvbnN0IHdzID0gbmV3IFdlYlNvY2tldCh0aGlzLiN1cmwsIHdlYnNvY2tldEFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMuI3N0YXRlID0ge1xuICAgICAgICAgICAgc3RhdHVzOiAnY29ubmVjdGluZycsXG4gICAgICAgICAgICB3ZWJzb2NrZXQ6IHdzLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmVtaXQoJ2Nvbm5lY3Rpb25fY2hhbmdlJywgdGhpcy4jc3RhdGUuc3RhdHVzKTtcbiAgICAgICAgd3MuYWRkRXZlbnRMaXN0ZW5lcignb3BlbicsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuI3N0YXRlID0ge1xuICAgICAgICAgICAgICAgIHN0YXR1czogJ2Nvbm5lY3RlZCcsXG4gICAgICAgICAgICAgICAgd2Vic29ja2V0OiB3cyxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2Nvbm5lY3Rpb25fY2hhbmdlJywgdGhpcy4jc3RhdGUuc3RhdHVzKTtcbiAgICAgICAgICAgIHRoaXMuX29uT3BlbigpO1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgd3MuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX29uRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgdGhpcy4jc3RhdGUgPSB7XG4gICAgICAgICAgICAgICAgc3RhdHVzOiAnZGlzY29ubmVjdGVkJyxcbiAgICAgICAgICAgICAgICB3ZWJzb2NrZXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2Nvbm5lY3Rpb25fY2hhbmdlJywgdGhpcy4jc3RhdGUuc3RhdHVzKTtcbiAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIH0pO1xuICAgICAgICB3cy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgKG1lc3NhZ2UpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX29uTWVzc2FnZShtZXNzYWdlKTtcbiAgICAgICAgICAgIGNvbnN0IHsgZGF0YTogcGFyc2VkLCBpc0dlbmVyaWMgfSA9IHBhcnNlUmVhbHRpbWVFdmVudChtZXNzYWdlKTtcbiAgICAgICAgICAgIGlmICghcGFyc2VkIHx8IGlzR2VuZXJpYykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwYXJzZWQudHlwZSA9PT0gJ3Jlc3BvbnNlLmF1ZGlvLmRlbHRhJykge1xuICAgICAgICAgICAgICAgIHRoaXMuI2N1cnJlbnRBdWRpb0NvbnRlbnRJbmRleCA9IHBhcnNlZC5jb250ZW50X2luZGV4O1xuICAgICAgICAgICAgICAgIHRoaXMuI2N1cnJlbnRJdGVtSWQgPSBwYXJzZWQuaXRlbV9pZDtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fZmlyc3RBdWRpb1RpbWVzdGFtcCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSByZXNwb25zZSBzdGFydCB0aW1lc3RhbXAgaXMgbm90IHNldCwgd2Ugc2V0IGl0IHRvIHRoZSBjdXJyZW50IHRpbWUuXG4gICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgdXNlZCB0byBjYWxjdWxhdGUgdGhlIGVsYXBzZWQgdGltZSBmb3IgaW50ZXJydXB0aW9uLlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9maXJzdEF1ZGlvVGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYXVkaW9MZW5ndGhNcyA9IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGJ1ZmYgPSBiYXNlNjRUb0FycmF5QnVmZmVyKHBhcnNlZC5kZWx0YSk7XG4gICAgICAgICAgICAgICAgLy8gY2FsY3VsYXRlIHRoZSBhdWRpbyBsZW5ndGggaW4gbWlsbGlzZWNvbmRzIGFzc3VtaW5nIDI0a0h6IHBjbTE2bGVcbiAgICAgICAgICAgICAgICB0aGlzLl9hdWRpb0xlbmd0aE1zICs9IGJ1ZmYuYnl0ZUxlbmd0aCAvIDI0IC8gMjsgLy8gMjRrSHogKiAyIGJ5dGVzIHBlciBzYW1wbGVcbiAgICAgICAgICAgICAgICBjb25zdCBhdWRpb0V2ZW50ID0ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYXVkaW8nLFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiBidWZmLFxuICAgICAgICAgICAgICAgICAgICByZXNwb25zZUlkOiBwYXJzZWQucmVzcG9uc2VfaWQsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB0aGlzLl9vbkF1ZGlvKGF1ZGlvRXZlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocGFyc2VkLnR5cGUgPT09ICdpbnB1dF9hdWRpb19idWZmZXIuc3BlZWNoX3N0YXJ0ZWQnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnRlcnJ1cHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHBhcnNlZC50eXBlID09PSAncmVzcG9uc2UuY3JlYXRlZCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNvbmdvaW5nUmVzcG9uc2UgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocGFyc2VkLnR5cGUgPT09ICdyZXNwb25zZS5kb25lJykge1xuICAgICAgICAgICAgICAgIHRoaXMuI29uZ29pbmdSZXNwb25zZSA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocGFyc2VkLnR5cGUgPT09ICdzZXNzaW9uLmNyZWF0ZWQnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdHJhY2luZ0NvbmZpZyA9IHBhcnNlZC5zZXNzaW9uLnRyYWNpbmc7XG4gICAgICAgICAgICAgICAgLy8gVHJ5aW5nIHRvIHR1cm4gb24gdHJhY2luZyBhZnRlciB0aGUgc2Vzc2lvbiBpcyBjcmVhdGVkXG4gICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlVHJhY2luZ0NvbmZpZyhzZXNzaW9uQ29uZmlnLnRyYWNpbmcgPz8gJ2F1dG8nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHdzLmFkZEV2ZW50TGlzdGVuZXIoJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy4jc3RhdGUgPSB7XG4gICAgICAgICAgICAgICAgc3RhdHVzOiAnZGlzY29ubmVjdGVkJyxcbiAgICAgICAgICAgICAgICB3ZWJzb2NrZXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2Nvbm5lY3Rpb25fY2hhbmdlJywgdGhpcy4jc3RhdGUuc3RhdHVzKTtcbiAgICAgICAgICAgIHRoaXMuX29uQ2xvc2UoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFzeW5jIGNvbm5lY3Qob3B0aW9ucykge1xuICAgICAgICBjb25zdCBtb2RlbCA9IG9wdGlvbnMubW9kZWwgPz8gdGhpcy5jdXJyZW50TW9kZWw7XG4gICAgICAgIHRoaXMuY3VycmVudE1vZGVsID0gbW9kZWw7XG4gICAgICAgIHRoaXMuI2FwaUtleSA9IGF3YWl0IHRoaXMuX2dldEFwaUtleShvcHRpb25zKTtcbiAgICAgICAgdGhpcy4jdXJsID1cbiAgICAgICAgICAgIG9wdGlvbnMudXJsID8/XG4gICAgICAgICAgICAgICAgYHdzczovL2FwaS5vcGVuYWkuY29tL3YxL3JlYWx0aW1lP21vZGVsPSR7dGhpcy5jdXJyZW50TW9kZWx9YDtcbiAgICAgICAgY29uc3Qgc2Vzc2lvbkNvbmZpZyA9IHtcbiAgICAgICAgICAgIC4uLihvcHRpb25zLmluaXRpYWxTZXNzaW9uQ29uZmlnIHx8IHt9KSxcbiAgICAgICAgICAgIG1vZGVsOiB0aGlzLmN1cnJlbnRNb2RlbCxcbiAgICAgICAgfTtcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB0aGlzLiNzZXR1cFdlYlNvY2tldChyZXNvbHZlLCByZWplY3QsIHNlc3Npb25Db25maWcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IHRoaXMudXBkYXRlU2Vzc2lvbkNvbmZpZyhzZXNzaW9uQ29uZmlnKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZCBhbiBldmVudCB0byB0aGUgUmVhbHRpbWUgQVBJLiBUaGlzIHdpbGwgc3RyaW5naWZ5IHRoZSBldmVudCBhbmQgc2VuZCBpdCBkaXJlY3RseSB0byB0aGVcbiAgICAgKiBBUEkuIFRoaXMgY2FuIGJlIHVzZWQgaWYgeW91IHdhbnQgdG8gdGFrZSBjb250cm9sIG92ZXIgdGhlIGNvbm5lY3Rpb24gYW5kIHNlbmQgZXZlbnRzIG1hbnVhbGx5LlxuICAgICAqXG4gICAgICogQHBhcmFtIGV2ZW50IC0gVGhlIGV2ZW50IHRvIHNlbmQuXG4gICAgICovXG4gICAgc2VuZEV2ZW50KGV2ZW50KSB7XG4gICAgICAgIGlmICghdGhpcy4jc3RhdGUud2Vic29ja2V0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dlYlNvY2tldCBpcyBub3QgY29ubmVjdGVkLiBNYWtlIHN1cmUgeW91IGNhbGwgYGNvbm5lY3QoKWAgYmVmb3JlIHNlbmRpbmcgZXZlbnRzLicpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI3N0YXRlLndlYnNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KGV2ZW50KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsb3NlIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbi5cbiAgICAgKlxuICAgICAqIFRoaXMgd2lsbCBhbHNvIHJlc2V0IGFueSBpbnRlcm5hbCBjb25uZWN0aW9uIHRyYWNraW5nIHVzZWQgZm9yIGludGVycnVwdGlvbiBoYW5kbGluZy5cbiAgICAgKi9cbiAgICBjbG9zZSgpIHtcbiAgICAgICAgdGhpcy4jc3RhdGUud2Vic29ja2V0Py5jbG9zZSgpO1xuICAgICAgICB0aGlzLiNjdXJyZW50SXRlbUlkID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9maXJzdEF1ZGlvVGltZXN0YW1wID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9hdWRpb0xlbmd0aE1zID0gMDtcbiAgICAgICAgdGhpcy4jY3VycmVudEF1ZGlvQ29udGVudEluZGV4ID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXaWxsIHRocm93IGFuIGVycm9yIGFzIHRoZSBXZWJTb2NrZXQgdHJhbnNwb3J0IGxheWVyIGRvZXMgbm90IHN1cHBvcnQgbXV0aW5nLlxuICAgICAqL1xuICAgIG11dGUoX211dGVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTXV0ZSBpcyBub3Qgc3VwcG9ydGVkIGZvciB0aGUgV2ViU29ja2V0IHRyYW5zcG9ydC4gWW91IGhhdmUgdG8gbXV0ZSB0aGUgYXVkaW8gaW5wdXQgeW91cnNlbGYuJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmQgYW4gYXVkaW8gYnVmZmVyIHRvIHRoZSBSZWFsdGltZSBBUEkuIFRoaXMgaXMgdXNlZCBmb3IgeW91ciBjbGllbnQgdG8gc2VuZCBhdWRpbyB0byB0aGVcbiAgICAgKiBtb2RlbCB0byByZXNwb25kLlxuICAgICAqXG4gICAgICogQHBhcmFtIGF1ZGlvIC0gVGhlIGF1ZGlvIGJ1ZmZlciB0byBzZW5kLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIHRoZSBhdWRpbyBidWZmZXIuXG4gICAgICovXG4gICAgc2VuZEF1ZGlvKGF1ZGlvLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgaWYgKHRoaXMuI3N0YXRlLnN0YXR1cyA9PT0gJ2Nvbm5lY3RlZCcpIHtcbiAgICAgICAgICAgIHN1cGVyLnNlbmRBdWRpbyhhdWRpbywgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZCBhIGNhbmNlbCByZXNwb25zZSBldmVudCB0byB0aGUgUmVhbHRpbWUgQVBJLiBUaGlzIGlzIHVzZWQgdG8gY2FuY2VsIGFuIG9uZ29pbmdcbiAgICAgKiAgcmVzcG9uc2UgdGhhdCB0aGUgbW9kZWwgaXMgY3VycmVudGx5IGdlbmVyYXRpbmcuXG4gICAgICovXG4gICAgX2NhbmNlbFJlc3BvbnNlKCkge1xuICAgICAgICAvLyBjYW5jZWwgdGhlIG9uZ29pbmcgcmVzcG9uc2VcbiAgICAgICAgaWYgKHRoaXMuI29uZ29pbmdSZXNwb25zZSkge1xuICAgICAgICAgICAgdGhpcy5zZW5kRXZlbnQoe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdyZXNwb25zZS5jYW5jZWwnLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogRG8gTk9UIGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHkuIENhbGwgYGludGVycnVwdCgpYCBpbnN0ZWFkIGZvciBwcm9wZXIgaW50ZXJydXB0aW9uIGhhbmRsaW5nLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBzZW5kIHRoZSByaWdodCBldmVudHMgdG8gdGhlIEFQSSB0byBpbmZvcm0gdGhlIG1vZGVsIHRoYXQgdGhlIHVzZXIgaGFzXG4gICAgICogaW50ZXJydXB0ZWQgdGhlIHJlc3BvbnNlLiBJdCBtaWdodCBiZSBvdmVycmlkZGVuL2V4dGVuZGVkIGJ5IGFuIGV4dGVuZGVkIHRyYW5zcG9ydCBsYXllci4gU2VlXG4gICAgICogdGhlIGBUd2lsaW9SZWFsdGltZVRyYW5zcG9ydExheWVyYCBmb3IgYW4gZXhhbXBsZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlbGFwc2VkVGltZSAtIFRoZSBlbGFwc2VkIHRpbWUgc2luY2UgdGhlIHJlc3BvbnNlIHN0YXJ0ZWQuXG4gICAgICovXG4gICAgX2ludGVycnVwdChlbGFwc2VkVGltZSkge1xuICAgICAgICAvLyBpbW1lZGlhdGVseSBlbWl0IHRoaXMgZXZlbnQgc28gdGhlIGNsaWVudCBjYW4gc3RvcCBwbGF5aW5nIGF1ZGlvXG4gICAgICAgIHRoaXMuZW1pdCgnYXVkaW9faW50ZXJydXB0ZWQnKTtcbiAgICAgICAgdGhpcy5zZW5kRXZlbnQoe1xuICAgICAgICAgICAgdHlwZTogJ2NvbnZlcnNhdGlvbi5pdGVtLnRydW5jYXRlJyxcbiAgICAgICAgICAgIGl0ZW1faWQ6IHRoaXMuI2N1cnJlbnRJdGVtSWQsXG4gICAgICAgICAgICBjb250ZW50X2luZGV4OiB0aGlzLiNjdXJyZW50QXVkaW9Db250ZW50SW5kZXgsXG4gICAgICAgICAgICBhdWRpb19lbmRfbXM6IGVsYXBzZWRUaW1lLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW50ZXJydXB0IHRoZSBvbmdvaW5nIHJlc3BvbnNlLiBUaGlzIG1ldGhvZCBpcyB0cmlnZ2VyZWQgYXV0b21hdGljYWxseSBieSB0aGUgY2xpZW50IHdoZW5cbiAgICAgKiB2b2ljZSBhY3Rpdml0eSBkZXRlY3Rpb24gKFZBRCkgaXMgZW5hYmxlZCAoZGVmYXVsdCkgYXMgd2VsbCBhcyB3aGVuIGFuIG91dHB1dCBndWFyZHJhaWwgZ290XG4gICAgICogdHJpZ2dlcmVkLlxuICAgICAqXG4gICAgICogWW91IGNhbiBhbHNvIGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHkgaWYgeW91IHdhbnQgdG8gaW50ZXJydXB0IHRoZSBjb252ZXJzYXRpb24gZm9yIGV4YW1wbGVcbiAgICAgKiBiYXNlZCBvbiBhbiBldmVudCBpbiB0aGUgY2xpZW50LlxuICAgICAqL1xuICAgIGludGVycnVwdCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLiNjdXJyZW50SXRlbUlkIHx8IHR5cGVvZiB0aGlzLl9maXJzdEF1ZGlvVGltZXN0YW1wICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NhbmNlbFJlc3BvbnNlKCk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lID0gRGF0ZS5ub3coKSAtIHRoaXMuX2ZpcnN0QXVkaW9UaW1lc3RhbXA7XG4gICAgICAgIGNvbnNvbGUubG9nKGBJbnRlcnJ1cHRpbmcgcmVzcG9uc2UgYWZ0ZXIgJHtlbGFwc2VkVGltZX1tc2ApO1xuICAgICAgICBjb25zb2xlLmxvZyhgQXVkaW8gbGVuZ3RoOiAke3RoaXMuX2F1ZGlvTGVuZ3RoTXN9bXNgKTtcbiAgICAgICAgaWYgKGVsYXBzZWRUaW1lID49IDAgJiYgZWxhcHNlZFRpbWUgPCB0aGlzLl9hdWRpb0xlbmd0aE1zKSB7XG4gICAgICAgICAgICB0aGlzLl9pbnRlcnJ1cHQoZWxhcHNlZFRpbWUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI2N1cnJlbnRJdGVtSWQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX2ZpcnN0QXVkaW9UaW1lc3RhbXAgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX2F1ZGlvTGVuZ3RoTXMgPSAwO1xuICAgICAgICB0aGlzLiNjdXJyZW50QXVkaW9Db250ZW50SW5kZXggPSB1bmRlZmluZWQ7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9b3BlbmFpUmVhbHRpbWVXZWJzb2NrZXQubWpzLm1hcCIsImltcG9ydCB7IGdldEhhbmRvZmYsIGdldFRyYW5zZmVyTWVzc2FnZSwgTW9kZWxCZWhhdmlvckVycm9yLCBPdXRwdXRHdWFyZHJhaWxUcmlwd2lyZVRyaWdnZXJlZCwgUnVuQ29udGV4dCwgUnVuVG9vbEFwcHJvdmFsSXRlbSwgfSBmcm9tICdAb3BlbmFpL2FnZW50cy1jb3JlJztcbmltcG9ydCB7IFJ1bnRpbWVFdmVudEVtaXR0ZXIgfSBmcm9tICdAb3BlbmFpL2FnZW50cy1jb3JlL19zaGltcyc7XG5pbXBvcnQgeyBpc1pvZE9iamVjdCwgdG9TbWFydFN0cmluZyB9IGZyb20gJ0BvcGVuYWkvYWdlbnRzLWNvcmUvdXRpbHMnO1xuaW1wb3J0IHsgZGVmaW5lUmVhbHRpbWVPdXRwdXRHdWFyZHJhaWwsIGdldFJlYWx0aW1lR3VhcmRyYWlsRmVlZGJhY2tNZXNzYWdlLCBnZXRSZWFsdGltZUd1YXJkcmFpbFNldHRpbmdzLCB9IGZyb20gXCIuL2d1YXJkcmFpbC5tanNcIjtcbmltcG9ydCB7IE9wZW5BSVJlYWx0aW1lV2ViUlRDIH0gZnJvbSBcIi4vb3BlbmFpUmVhbHRpbWVXZWJSdGMubWpzXCI7XG5pbXBvcnQgeyBPcGVuQUlSZWFsdGltZVdlYlNvY2tldCB9IGZyb20gXCIuL29wZW5haVJlYWx0aW1lV2Vic29ja2V0Lm1qc1wiO1xuaW1wb3J0IHsgZ2V0TGFzdFRleHRGcm9tQXVkaW9PdXRwdXRNZXNzYWdlLCBoYXNXZWJSVENTdXBwb3J0LCB1cGRhdGVSZWFsdGltZUhpc3RvcnksIH0gZnJvbSBcIi4vdXRpbHMubWpzXCI7XG5pbXBvcnQgbG9nZ2VyIGZyb20gXCIuL2xvZ2dlci5tanNcIjtcbi8qKlxuICogQSBgUmVhbHRpbWVTZXNzaW9uYCBpcyB0aGUgY29ybmVyIHBpZWNlIG9mIGJ1aWxkaW5nIFZvaWNlIEFnZW50cy4gSXQncyB0aGUgZXF1aXZhbGVudCBvZiBhXG4gKiBSdW5uZXIgaW4gdGV4dC1iYXNlZCBhZ2VudHMgZXhjZXB0IHRoYXQgaXQgYXV0b21hdGljYWxseSBoYW5kbGVzIG11bHRpcGxlIHR1cm5zIGJ5IG1haW50YWluaW5nIGFcbiAqIGNvbm5lY3Rpb24gd2l0aCB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQgbGF5ZXIuXG4gKlxuICogVGhlIHNlc3Npb24gaGFuZGxlcyBtYW5hZ2luZyB0aGUgbG9jYWwgaGlzdG9yeSBjb3B5LCBleGVjdXRlcyB0b29scywgcnVucyBvdXRwdXQgZ3VhcmRyYWlscywgYW5kXG4gKiBmYWNpbGl0aWVzIGhhbmRvZmZzLlxuICpcbiAqIFRoZSBhY3R1YWwgYXVkaW8gaGFuZGxpbmcgYW5kIGdlbmVyYXRpb24gb2YgbW9kZWwgcmVzcG9uc2VzIGlzIGhhbmRsZWQgYnkgdGhlIHVuZGVybHlpbmdcbiAqIHRyYW5zcG9ydCBsYXllci4gQnkgZGVmYXVsdCBpZiB5b3UgYXJlIHVzaW5nIGEgYnJvd3NlciB3aXRoIFdlYlJUQyBzdXBwb3J0LCB0aGUgc2Vzc2lvbiB3aWxsXG4gKiBhdXRvbWF0aWNhbGx5IHVzZSB0aGUgV2ViUlRDIHZlcnNpb24gb2YgdGhlIE9wZW5BSSBSZWFsdGltZSBBUEkuIE9uIHRoZSBzZXJ2ZXIgb3IgaWYgeW91IHBhc3NcbiAqIGB3ZWJzb2NrZXRgIGFzIHRoZSB0cmFuc3BvcnQgbGF5ZXIsIHRoZSBzZXNzaW9uIHdpbGwgZXN0YWJsaXNoIGEgY29ubmVjdGlvbiB1c2luZyBXZWJTb2NrZXRzLlxuICpcbiAqIEluIHRoZSBjYXNlIG9mIFdlYlJUQywgaW4gdGhlIGJyb3dzZXIsIHRoZSB0cmFuc3BvcnQgbGF5ZXIgd2lsbCBhbHNvIGF1dG9tYXRpY2FsbHkgY29uZmlndXJlIHRoZVxuICogbWljcm9waG9uZSBhbmQgYXVkaW8gb3V0cHV0IHRvIGJlIHVzZWQgYnkgdGhlIHNlc3Npb24uXG4gKlxuICogWW91IGNhbiBhbHNvIGNyZWF0ZSBhIHRyYW5zcG9ydCBsYXllciBpbnN0YW5jZSB5b3Vyc2VsZiBhbmQgcGFzcyBpdCBpbiB0byBoYXZlIG1vcmUgY29udHJvbCBvdmVyXG4gKiB0aGUgY29uZmlndXJhdGlvbiBvciBldmVuIGV4dGVuZCB0aGUgZXhpc3Rpbmcgb25lcy4gQ2hlY2sgb3V0IHRoZSBgVHdpbGlvUmVhbHRpbWVUcmFuc3BvcnRMYXllcmBcbiAqIGZvciBhbiBleGFtcGxlIG9mIGhvdyB0byBjcmVhdGUgYSBjdXN0b20gdHJhbnNwb3J0IGxheWVyLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogY29uc3QgYWdlbnQgPSBuZXcgUmVhbHRpbWVBZ2VudCh7XG4gKiAgIG5hbWU6ICdteS1hZ2VudCcsXG4gKiAgIGluc3RydWN0aW9uczogJ1lvdSBhcmUgYSBoZWxwZnVsIGFzc2lzdGFudCB0aGF0IGNhbiBhbnN3ZXIgcXVlc3Rpb25zIGFuZCBoZWxwIHdpdGggdGFza3MuJyxcbiAqIH0pXG4gKlxuICogY29uc3Qgc2Vzc2lvbiA9IG5ldyBSZWFsdGltZVNlc3Npb24oYWdlbnQpO1xuICogc2Vzc2lvbi5jb25uZWN0KHtcbiAqICAgYXBpS2V5OiAneW91ci1hcGkta2V5JyxcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBSZWFsdGltZVNlc3Npb24gZXh0ZW5kcyBSdW50aW1lRXZlbnRFbWl0dGVyIHtcbiAgICBpbml0aWFsQWdlbnQ7XG4gICAgb3B0aW9ucztcbiAgICAjdHJhbnNwb3J0O1xuICAgICNjdXJyZW50QWdlbnQ7XG4gICAgI2N1cnJlbnRUb29scyA9IFtdO1xuICAgICNjb250ZXh0O1xuICAgICNvdXRwdXRHdWFyZHJhaWxzID0gW107XG4gICAgI291dHB1dEd1YXJkcmFpbFNldHRpbmdzO1xuICAgICN0cmFuc2NyaWJlZFRleHREZWx0YXMgPSB7fTtcbiAgICAjaGlzdG9yeSA9IFtdO1xuICAgICNzaG91bGRJbmNsdWRlQXVkaW9EYXRhO1xuICAgIGNvbnN0cnVjdG9yKGluaXRpYWxBZ2VudCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuaW5pdGlhbEFnZW50ID0gaW5pdGlhbEFnZW50O1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICBpZiAoKHR5cGVvZiBvcHRpb25zLnRyYW5zcG9ydCA9PT0gJ3VuZGVmaW5lZCcgJiYgaGFzV2ViUlRDU3VwcG9ydCgpKSB8fFxuICAgICAgICAgICAgb3B0aW9ucy50cmFuc3BvcnQgPT09ICd3ZWJydGMnKSB7XG4gICAgICAgICAgICB0aGlzLiN0cmFuc3BvcnQgPSBuZXcgT3BlbkFJUmVhbHRpbWVXZWJSVEMoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChvcHRpb25zLnRyYW5zcG9ydCA9PT0gJ3dlYnNvY2tldCcgfHxcbiAgICAgICAgICAgIHR5cGVvZiBvcHRpb25zLnRyYW5zcG9ydCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRoaXMuI3RyYW5zcG9ydCA9IG5ldyBPcGVuQUlSZWFsdGltZVdlYlNvY2tldCgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy4jdHJhbnNwb3J0ID0gb3B0aW9ucy50cmFuc3BvcnQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jY3VycmVudEFnZW50ID0gaW5pdGlhbEFnZW50O1xuICAgICAgICB0aGlzLiNjb250ZXh0ID0gbmV3IFJ1bkNvbnRleHQoe1xuICAgICAgICAgICAgLi4uKG9wdGlvbnMuY29udGV4dCA/PyB7fSksXG4gICAgICAgICAgICBoaXN0b3J5OiB0aGlzLiNoaXN0b3J5LFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy4jb3V0cHV0R3VhcmRyYWlscyA9IChvcHRpb25zLm91dHB1dEd1YXJkcmFpbHMgPz8gW10pLm1hcChkZWZpbmVSZWFsdGltZU91dHB1dEd1YXJkcmFpbCk7XG4gICAgICAgIHRoaXMuI291dHB1dEd1YXJkcmFpbFNldHRpbmdzID0gZ2V0UmVhbHRpbWVHdWFyZHJhaWxTZXR0aW5ncyhvcHRpb25zLm91dHB1dEd1YXJkcmFpbFNldHRpbmdzID8/IHt9KTtcbiAgICAgICAgdGhpcy4jc2hvdWxkSW5jbHVkZUF1ZGlvRGF0YSA9IG9wdGlvbnMuaGlzdG9yeVN0b3JlQXVkaW8gPz8gZmFsc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSB0cmFuc3BvcnQgbGF5ZXIgdXNlZCBieSB0aGUgc2Vzc2lvbi5cbiAgICAgKi9cbiAgICBnZXQgdHJhbnNwb3J0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jdHJhbnNwb3J0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVudCBhZ2VudCBpbiB0aGUgc2Vzc2lvbi5cbiAgICAgKi9cbiAgICBnZXQgY3VycmVudEFnZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jY3VycmVudEFnZW50O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVudCB1c2FnZSBvZiB0aGUgc2Vzc2lvbi5cbiAgICAgKi9cbiAgICBnZXQgdXNhZ2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNjb250ZXh0LnVzYWdlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVudCBjb250ZXh0IG9mIHRoZSBzZXNzaW9uLlxuICAgICAqL1xuICAgIGdldCBjb250ZXh0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jY29udGV4dDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGUgc2Vzc2lvbiBpcyBtdXRlZC4gTWlnaHQgYmUgYG51bGxgIGlmIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCBsYXllciBkb2VzIG5vdFxuICAgICAqIHN1cHBvcnQgbXV0aW5nLlxuICAgICAqL1xuICAgIGdldCBtdXRlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3RyYW5zcG9ydC5tdXRlZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGhpc3Rvcnkgb2YgdGhlIHNlc3Npb24uXG4gICAgICovXG4gICAgZ2V0IGhpc3RvcnkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNoaXN0b3J5O1xuICAgIH1cbiAgICBhc3luYyAjc2V0Q3VycmVudEFnZW50KGFnZW50KSB7XG4gICAgICAgIHRoaXMuI2N1cnJlbnRBZ2VudCA9IGFnZW50O1xuICAgICAgICBjb25zdCBoYW5kb2ZmcyA9IHRoaXMuI2N1cnJlbnRBZ2VudC5oYW5kb2Zmcy5tYXAoZ2V0SGFuZG9mZik7XG4gICAgICAgIGNvbnN0IGhhbmRvZmZUb29scyA9IGhhbmRvZmZzLm1hcCgoaGFuZG9mZikgPT4gaGFuZG9mZi5nZXRIYW5kb2ZmQXNGdW5jdGlvblRvb2woKSk7XG4gICAgICAgIHRoaXMuI2N1cnJlbnRUb29scyA9IFtcbiAgICAgICAgICAgIC4uLihhd2FpdCB0aGlzLiNjdXJyZW50QWdlbnQuZ2V0QWxsVG9vbHMoKSkuZmlsdGVyKCh0b29sKSA9PiB0b29sLnR5cGUgPT09ICdmdW5jdGlvbicpLFxuICAgICAgICAgICAgLi4uaGFuZG9mZlRvb2xzLFxuICAgICAgICBdO1xuICAgIH1cbiAgICBhc3luYyAjZ2V0U2Vzc2lvbkNvbmZpZyhhZGRpdGlvbmFsQ29uZmlnID0ge30pIHtcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25zID0gYXdhaXQgdGhpcy4jY3VycmVudEFnZW50LmdldFN5c3RlbVByb21wdCh0aGlzLiNjb250ZXh0KTtcbiAgICAgICAgY29uc3QgdHJhY2luZ0NvbmZpZyA9IHRoaXMub3B0aW9uc1xuICAgICAgICAgICAgLnRyYWNpbmdEaXNhYmxlZFxuICAgICAgICAgICAgPyBudWxsXG4gICAgICAgICAgICA6IHRoaXMub3B0aW9ucy53b3JrZmxvd05hbWVcbiAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dfbmFtZTogdGhpcy5vcHRpb25zLndvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgOiAnYXV0byc7XG4gICAgICAgIGlmICh0cmFjaW5nQ29uZmlnICE9PSBudWxsICYmIHRyYWNpbmdDb25maWcgIT09ICdhdXRvJykge1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5ncm91cElkKSB7XG4gICAgICAgICAgICAgICAgdHJhY2luZ0NvbmZpZy5ncm91cF9pZCA9IHRoaXMub3B0aW9ucy5ncm91cElkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy50cmFjZU1ldGFkYXRhKSB7XG4gICAgICAgICAgICAgICAgdHJhY2luZ0NvbmZpZy5tZXRhZGF0YSA9IHRoaXMub3B0aW9ucy50cmFjZU1ldGFkYXRhO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMub3B0aW9ucy5ncm91cElkIHx8IHRoaXMub3B0aW9ucy50cmFjZU1ldGFkYXRhKSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybignSW4gb3JkZXIgdG8gc2V0IHRyYWNlTWV0YWRhdGEgb3IgYSBncm91cElkIHlvdSBuZWVkIHRvIHNwZWNpZnkgYSB3b3JrZmxvd05hbWUuJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGluc3RydWN0aW9ucyxcbiAgICAgICAgICAgIHZvaWNlOiB0aGlzLiNjdXJyZW50QWdlbnQudm9pY2UsXG4gICAgICAgICAgICBtb2RlbDogdGhpcy5vcHRpb25zLm1vZGVsLFxuICAgICAgICAgICAgdG9vbHM6IHRoaXMuI2N1cnJlbnRUb29scyxcbiAgICAgICAgICAgIHRyYWNpbmc6IHRyYWNpbmdDb25maWcsXG4gICAgICAgICAgICAuLi5hZGRpdGlvbmFsQ29uZmlnLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBhc3luYyB1cGRhdGVBZ2VudChuZXdBZ2VudCkge1xuICAgICAgICB0aGlzLiNjdXJyZW50QWdlbnQuZW1pdCgnYWdlbnRfaGFuZG9mZicsIHRoaXMuI2NvbnRleHQsIG5ld0FnZW50KTtcbiAgICAgICAgdGhpcy5lbWl0KCdhZ2VudF9oYW5kb2ZmJywgdGhpcy4jY29udGV4dCwgdGhpcy4jY3VycmVudEFnZW50LCBuZXdBZ2VudCk7XG4gICAgICAgIGF3YWl0IHRoaXMuI3NldEN1cnJlbnRBZ2VudChuZXdBZ2VudCk7XG4gICAgICAgIGF3YWl0IHRoaXMuI3RyYW5zcG9ydC51cGRhdGVTZXNzaW9uQ29uZmlnKGF3YWl0IHRoaXMuI2dldFNlc3Npb25Db25maWcoKSk7XG4gICAgICAgIHJldHVybiBuZXdBZ2VudDtcbiAgICB9XG4gICAgYXN5bmMgI2hhbmRsZUhhbmRvZmYodG9vbENhbGwsIGhhbmRvZmYpIHtcbiAgICAgICAgY29uc3QgbmV3QWdlbnQgPSAoYXdhaXQgaGFuZG9mZi5vbkludm9rZUhhbmRvZmYodGhpcy4jY29udGV4dCwgdG9vbENhbGwuYXJndW1lbnRzKSk7XG4gICAgICAgIHRoaXMuI2N1cnJlbnRBZ2VudC5lbWl0KCdhZ2VudF9oYW5kb2ZmJywgdGhpcy4jY29udGV4dCwgbmV3QWdlbnQpO1xuICAgICAgICB0aGlzLmVtaXQoJ2FnZW50X2hhbmRvZmYnLCB0aGlzLiNjb250ZXh0LCB0aGlzLiNjdXJyZW50QWdlbnQsIG5ld0FnZW50KTtcbiAgICAgICAgLy8gdXBkYXRlIHNlc3Npb24gd2l0aCBuZXcgYWdlbnRcbiAgICAgICAgYXdhaXQgdGhpcy4jc2V0Q3VycmVudEFnZW50KG5ld0FnZW50KTtcbiAgICAgICAgYXdhaXQgdGhpcy4jdHJhbnNwb3J0LnVwZGF0ZVNlc3Npb25Db25maWcoYXdhaXQgdGhpcy4jZ2V0U2Vzc2lvbkNvbmZpZygpKTtcbiAgICAgICAgY29uc3Qgb3V0cHV0ID0gZ2V0VHJhbnNmZXJNZXNzYWdlKG5ld0FnZW50KTtcbiAgICAgICAgdGhpcy4jdHJhbnNwb3J0LnNlbmRGdW5jdGlvbkNhbGxPdXRwdXQodG9vbENhbGwsIG91dHB1dCwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBuZXdBZ2VudDtcbiAgICB9XG4gICAgYXN5bmMgI2hhbmRsZUZ1bmN0aW9uVG9vbENhbGwodG9vbENhbGwsIHRvb2wpIHtcbiAgICAgICAgdGhpcy4jY29udGV4dC5jb250ZXh0Lmhpc3RvcnkgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuI2hpc3RvcnkpKTsgLy8gZGVlcCBjb3B5IG9mIHRoZSBoaXN0b3J5XG4gICAgICAgIGxldCBwYXJzZWRBcmdzID0gdG9vbENhbGwuYXJndW1lbnRzO1xuICAgICAgICBpZiAodG9vbC5wYXJhbWV0ZXJzKSB7XG4gICAgICAgICAgICBpZiAoaXNab2RPYmplY3QodG9vbC5wYXJhbWV0ZXJzKSkge1xuICAgICAgICAgICAgICAgIHBhcnNlZEFyZ3MgPSB0b29sLnBhcmFtZXRlcnMucGFyc2UocGFyc2VkQXJncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBwYXJzZWRBcmdzID0gSlNPTi5wYXJzZShwYXJzZWRBcmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZWVkc0FwcHJvdmFsID0gYXdhaXQgdG9vbC5uZWVkc0FwcHJvdmFsKHRoaXMuI2NvbnRleHQsIHBhcnNlZEFyZ3MsIHRvb2xDYWxsLmNhbGxJZCk7XG4gICAgICAgIGlmIChuZWVkc0FwcHJvdmFsKSB7XG4gICAgICAgICAgICBjb25zdCBhcHByb3ZhbCA9IHRoaXMuY29udGV4dC5pc1Rvb2xBcHByb3ZlZCh7XG4gICAgICAgICAgICAgICAgdG9vbE5hbWU6IHRvb2wubmFtZSxcbiAgICAgICAgICAgICAgICBjYWxsSWQ6IHRvb2xDYWxsLmNhbGxJZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGFwcHJvdmFsID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnYWdlbnRfdG9vbF9zdGFydCcsIHRoaXMuI2NvbnRleHQsIHRoaXMuI2N1cnJlbnRBZ2VudCwgdG9vbCk7XG4gICAgICAgICAgICAgICAgdGhpcy4jY3VycmVudEFnZW50LmVtaXQoJ2FnZW50X3Rvb2xfc3RhcnQnLCB0aGlzLiNjb250ZXh0LCB0b29sKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSAnVG9vbCBleGVjdXRpb24gd2FzIG5vdCBhcHByb3ZlZC4nO1xuICAgICAgICAgICAgICAgIHRoaXMuI3RyYW5zcG9ydC5zZW5kRnVuY3Rpb25DYWxsT3V0cHV0KHRvb2xDYWxsLCByZXN1bHQsIHRydWUpO1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnYWdlbnRfdG9vbF9lbmQnLCB0aGlzLiNjb250ZXh0LCB0aGlzLiNjdXJyZW50QWdlbnQsIHRvb2wsIHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgdGhpcy4jY3VycmVudEFnZW50LmVtaXQoJ2FnZW50X3Rvb2xfZW5kJywgdGhpcy4jY29udGV4dCwgdG9vbCwgcmVzdWx0KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgYXBwcm92YWwgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KCd0b29sX2FwcHJvdmFsX3JlcXVlc3RlZCcsIHRoaXMuI2NvbnRleHQsIHRoaXMuI2N1cnJlbnRBZ2VudCwge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZnVuY3Rpb25fYXBwcm92YWwnLFxuICAgICAgICAgICAgICAgICAgICB0b29sLFxuICAgICAgICAgICAgICAgICAgICBhcHByb3ZhbEl0ZW06IG5ldyBSdW5Ub29sQXBwcm92YWxJdGVtKHRvb2xDYWxsLCB0aGlzLiNjdXJyZW50QWdlbnQpLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVtaXQoJ2FnZW50X3Rvb2xfc3RhcnQnLCB0aGlzLiNjb250ZXh0LCB0aGlzLiNjdXJyZW50QWdlbnQsIHRvb2wpO1xuICAgICAgICB0aGlzLiNjdXJyZW50QWdlbnQuZW1pdCgnYWdlbnRfdG9vbF9zdGFydCcsIHRoaXMuI2NvbnRleHQsIHRvb2wpO1xuICAgICAgICB0aGlzLiNjb250ZXh0LmNvbnRleHQuaGlzdG9yeSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy4jaGlzdG9yeSkpOyAvLyBkZWVwIGNvcHkgb2YgdGhlIGhpc3RvcnlcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdG9vbC5pbnZva2UodGhpcy4jY29udGV4dCwgdG9vbENhbGwuYXJndW1lbnRzKTtcbiAgICAgICAgY29uc3Qgc3RyaW5nUmVzdWx0ID0gdG9TbWFydFN0cmluZyhyZXN1bHQpO1xuICAgICAgICB0aGlzLiN0cmFuc3BvcnQuc2VuZEZ1bmN0aW9uQ2FsbE91dHB1dCh0b29sQ2FsbCwgc3RyaW5nUmVzdWx0LCB0cnVlKTtcbiAgICAgICAgdGhpcy5lbWl0KCdhZ2VudF90b29sX2VuZCcsIHRoaXMuI2NvbnRleHQsIHRoaXMuI2N1cnJlbnRBZ2VudCwgdG9vbCwgc3RyaW5nUmVzdWx0KTtcbiAgICAgICAgdGhpcy4jY3VycmVudEFnZW50LmVtaXQoJ2FnZW50X3Rvb2xfZW5kJywgdGhpcy4jY29udGV4dCwgdG9vbCwgc3RyaW5nUmVzdWx0KTtcbiAgICB9XG4gICAgYXN5bmMgI2hhbmRsZUZ1bmN0aW9uQ2FsbCh0b29sQ2FsbCkge1xuICAgICAgICBjb25zdCBoYW5kb2ZmTWFwID0gbmV3IE1hcCh0aGlzLiNjdXJyZW50QWdlbnQuaGFuZG9mZnNcbiAgICAgICAgICAgIC5tYXAoZ2V0SGFuZG9mZilcbiAgICAgICAgICAgIC5tYXAoKGhhbmRvZmYpID0+IFtoYW5kb2ZmLnRvb2xOYW1lLCBoYW5kb2ZmXSkpO1xuICAgICAgICBjb25zdCBmdW5jdGlvblRvb2xNYXAgPSBuZXcgTWFwKChhd2FpdCB0aGlzLiNjdXJyZW50QWdlbnQuZ2V0QWxsVG9vbHMoKSkubWFwKCh0b29sKSA9PiBbdG9vbC5uYW1lLCB0b29sXSkpO1xuICAgICAgICBjb25zdCBwb3NzaWJsZUhhbmRvZmYgPSBoYW5kb2ZmTWFwLmdldCh0b29sQ2FsbC5uYW1lKTtcbiAgICAgICAgaWYgKHBvc3NpYmxlSGFuZG9mZikge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy4jaGFuZGxlSGFuZG9mZih0b29sQ2FsbCwgcG9zc2libGVIYW5kb2ZmKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGZ1bmN0aW9uVG9vbCA9IGZ1bmN0aW9uVG9vbE1hcC5nZXQodG9vbENhbGwubmFtZSk7XG4gICAgICAgICAgICBpZiAoZnVuY3Rpb25Ub29sICYmIGZ1bmN0aW9uVG9vbC50eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy4jaGFuZGxlRnVuY3Rpb25Ub29sQ2FsbCh0b29sQ2FsbCwgZnVuY3Rpb25Ub29sKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBNb2RlbEJlaGF2aW9yRXJyb3IoYFRvb2wgJHt0b29sQ2FsbC5uYW1lfSBub3QgZm91bmRgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyAjcnVuT3V0cHV0R3VhcmRyYWlscyhvdXRwdXQpIHtcbiAgICAgICAgaWYgKHRoaXMuI291dHB1dEd1YXJkcmFpbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZ3VhcmRyYWlsQXJncyA9IHtcbiAgICAgICAgICAgIGFnZW50OiB0aGlzLiNjdXJyZW50QWdlbnQsXG4gICAgICAgICAgICBhZ2VudE91dHB1dDogb3V0cHV0LFxuICAgICAgICAgICAgY29udGV4dDogdGhpcy4jY29udGV4dCxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKHRoaXMuI291dHB1dEd1YXJkcmFpbHMubWFwKChndWFyZHJhaWwpID0+IGd1YXJkcmFpbC5ydW4oZ3VhcmRyYWlsQXJncykpKTtcbiAgICAgICAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0cykge1xuICAgICAgICAgICAgaWYgKHJlc3VsdC5vdXRwdXQudHJpcHdpcmVUcmlnZ2VyZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBPdXRwdXRHdWFyZHJhaWxUcmlwd2lyZVRyaWdnZXJlZChgT3V0cHV0IGd1YXJkcmFpbCB0cmlnZ2VyZWQ6ICR7SlNPTi5zdHJpbmdpZnkocmVzdWx0Lm91dHB1dC5vdXRwdXRJbmZvKX1gLCByZXN1bHQpO1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnZ3VhcmRyYWlsX3RyaXBwZWQnLCB0aGlzLiNjb250ZXh0LCB0aGlzLiNjdXJyZW50QWdlbnQsIGVycm9yKTtcbiAgICAgICAgICAgICAgICB0aGlzLmludGVycnVwdCgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZlZWRiYWNrVGV4dCA9IGdldFJlYWx0aW1lR3VhcmRyYWlsRmVlZGJhY2tNZXNzYWdlKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZW5kTWVzc2FnZShmZWVkYmFja1RleHQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgICNzZXRFdmVudExpc3RlbmVycygpIHtcbiAgICAgICAgdGhpcy4jdHJhbnNwb3J0Lm9uKCcqJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ3RyYW5zcG9ydF9ldmVudCcsIGV2ZW50KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuI3RyYW5zcG9ydC5vbignYXVkaW8nLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnYXVkaW8nLCBldmVudCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLiN0cmFuc3BvcnQub24oJ3R1cm5fc3RhcnRlZCcsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnYWdlbnRfc3RhcnQnLCB0aGlzLiNjb250ZXh0LCB0aGlzLiNjdXJyZW50QWdlbnQpO1xuICAgICAgICAgICAgdGhpcy4jY3VycmVudEFnZW50LmVtaXQoJ2FnZW50X3N0YXJ0JywgdGhpcy4jY29udGV4dCwgdGhpcy4jY3VycmVudEFnZW50KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuI3RyYW5zcG9ydC5vbigndHVybl9kb25lJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpdGVtID0gZXZlbnQucmVzcG9uc2Uub3V0cHV0W2V2ZW50LnJlc3BvbnNlLm91dHB1dC5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgIGNvbnN0IHRleHRPdXRwdXQgPSBnZXRMYXN0VGV4dEZyb21BdWRpb091dHB1dE1lc3NhZ2UoaXRlbSkgPz8gJyc7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2FnZW50X2VuZCcsIHRoaXMuI2NvbnRleHQsIHRoaXMuI2N1cnJlbnRBZ2VudCwgdGV4dE91dHB1dCk7XG4gICAgICAgICAgICB0aGlzLiNjdXJyZW50QWdlbnQuZW1pdCgnYWdlbnRfZW5kJywgdGhpcy4jY29udGV4dCwgdGV4dE91dHB1dCk7XG4gICAgICAgICAgICB0aGlzLiNydW5PdXRwdXRHdWFyZHJhaWxzKHRleHRPdXRwdXQpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy4jdHJhbnNwb3J0Lm9uKCdhdWRpb19kb25lJywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5lbWl0KCdhdWRpb19zdG9wcGVkJywgdGhpcy4jY29udGV4dCwgdGhpcy4jY3VycmVudEFnZW50KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGxldCBsYXN0UnVuSW5kZXggPSAwO1xuICAgICAgICBsZXQgbGFzdEl0ZW1JZDtcbiAgICAgICAgdGhpcy4jdHJhbnNwb3J0Lm9uKCdhdWRpb190cmFuc2NyaXB0X2RlbHRhJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlbHRhID0gZXZlbnQuZGVsdGE7XG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbUlkID0gZXZlbnQuaXRlbUlkO1xuICAgICAgICAgICAgICAgIGlmIChsYXN0SXRlbUlkICE9PSBpdGVtSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGFzdEl0ZW1JZCA9IGl0ZW1JZDtcbiAgICAgICAgICAgICAgICAgICAgbGFzdFJ1bkluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFRleHQgPSB0aGlzLiN0cmFuc2NyaWJlZFRleHREZWx0YXNbaXRlbUlkXSA/PyAnJztcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdUZXh0ID0gY3VycmVudFRleHQgKyBkZWx0YTtcbiAgICAgICAgICAgICAgICB0aGlzLiN0cmFuc2NyaWJlZFRleHREZWx0YXNbaXRlbUlkXSA9IG5ld1RleHQ7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuI291dHB1dEd1YXJkcmFpbFNldHRpbmdzLmRlYm91bmNlVGV4dExlbmd0aCA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBuZXdSdW5JbmRleCA9IE1hdGguZmxvb3IobmV3VGV4dC5sZW5ndGggLyB0aGlzLiNvdXRwdXRHdWFyZHJhaWxTZXR0aW5ncy5kZWJvdW5jZVRleHRMZW5ndGgpO1xuICAgICAgICAgICAgICAgIGlmIChuZXdSdW5JbmRleCA+IGxhc3RSdW5JbmRleCkge1xuICAgICAgICAgICAgICAgICAgICBsYXN0UnVuSW5kZXggPSBuZXdSdW5JbmRleDtcbiAgICAgICAgICAgICAgICAgICAgLy8gV2UgZG9uJ3QgY2FuY2VsIGV4aXN0aW5nIHJ1bnMgYmVjYXVzZSB3ZSB3YW50IHRoZSBmaXJzdCBvbmUgdG8gZmFpbCB0byBmYWlsXG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSB0cmFuc3BvcnQgbGF5ZXIgc2hvdWxkIHVwb24gZmFpbHVyZSBoYW5kbGUgdGhlIGludGVycnVwdGlvbiBhbmQgc3RvcCB0aGUgbW9kZWxcbiAgICAgICAgICAgICAgICAgICAgLy8gZnJvbSBnZW5lcmF0aW5nIGZ1cnRoZXJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jcnVuT3V0cHV0R3VhcmRyYWlscyhuZXdUZXh0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGVycixcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuI3RyYW5zcG9ydC5vbignaXRlbV91cGRhdGUnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNOZXcgPSAhdGhpcy4jaGlzdG9yeS5zb21lKChpdGVtKSA9PiBpdGVtLml0ZW1JZCA9PT0gZXZlbnQuaXRlbUlkKTtcbiAgICAgICAgICAgICAgICB0aGlzLiNoaXN0b3J5ID0gdXBkYXRlUmVhbHRpbWVIaXN0b3J5KHRoaXMuI2hpc3RvcnksIGV2ZW50LCB0aGlzLiNzaG91bGRJbmNsdWRlQXVkaW9EYXRhKTtcbiAgICAgICAgICAgICAgICB0aGlzLiNjb250ZXh0LmNvbnRleHQuaGlzdG9yeSA9IHRoaXMuI2hpc3Rvcnk7XG4gICAgICAgICAgICAgICAgaWYgKGlzTmV3KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFkZGVkSXRlbSA9IHRoaXMuI2hpc3RvcnkuZmluZCgoaXRlbSkgPT4gaXRlbS5pdGVtSWQgPT09IGV2ZW50Lml0ZW1JZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhZGRlZEl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnaGlzdG9yeV9hZGRlZCcsIGFkZGVkSXRlbSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdoaXN0b3J5X3VwZGF0ZWQnLCB0aGlzLiNoaXN0b3J5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBlcnJvcjogZXJyLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy4jdHJhbnNwb3J0Lm9uKCdpdGVtX2RlbGV0ZWQnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jaGlzdG9yeSA9IHRoaXMuI2hpc3RvcnkuZmlsdGVyKChpdGVtKSA9PiBpdGVtLml0ZW1JZCAhPT0gZXZlbnQuaXRlbUlkKTtcbiAgICAgICAgICAgICAgICB0aGlzLiNjb250ZXh0LmNvbnRleHQuaGlzdG9yeSA9IHRoaXMuI2hpc3Rvcnk7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdoaXN0b3J5X3VwZGF0ZWQnLCB0aGlzLiNoaXN0b3J5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBlcnJvcjogZXJyLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy4jdHJhbnNwb3J0Lm9uKCdmdW5jdGlvbl9jYWxsJywgYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuI2hhbmRsZUZ1bmN0aW9uQ2FsbChldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0Vycm9yIGhhbmRsaW5nIGZ1bmN0aW9uIGNhbGwnLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLiN0cmFuc3BvcnQub24oJ3VzYWdlX3VwZGF0ZScsICh1c2FnZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy4jY29udGV4dC51c2FnZS5hZGQodXNhZ2UpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy4jdHJhbnNwb3J0Lm9uKCdhdWRpb19pbnRlcnJ1cHRlZCcsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnYXVkaW9faW50ZXJydXB0ZWQnLCB0aGlzLiNjb250ZXh0LCB0aGlzLiNjdXJyZW50QWdlbnQpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy4jdHJhbnNwb3J0Lm9uKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbm5lY3QgdG8gdGhlIHNlc3Npb24uIFRoaXMgd2lsbCBlc3RhYmxpc2ggdGhlIGNvbm5lY3Rpb24gdG8gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IGxheWVyXG4gICAgICogYW5kIHN0YXJ0IHRoZSBzZXNzaW9uLlxuICAgICAqXG4gICAgICogQWZ0ZXIgY29ubmVjdGluZywgdGhlIHNlc3Npb24gd2lsbCBhbHNvIGVtaXQgYSBgaGlzdG9yeV91cGRhdGVkYCBldmVudCB3aXRoIGFuIGVtcHR5IGhpc3RvcnkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciB0aGUgY29ubmVjdGlvbi5cbiAgICAgKi9cbiAgICBhc3luYyBjb25uZWN0KG9wdGlvbnMpIHtcbiAgICAgICAgLy8gbWFrZXMgc3VyZSB0aGUgY3VycmVudCBhZ2VudCBpcyBjb3JyZWN0bHkgc2V0IGFuZCBsb2FkcyB0aGUgdG9vbHNcbiAgICAgICAgYXdhaXQgdGhpcy4jc2V0Q3VycmVudEFnZW50KHRoaXMuaW5pdGlhbEFnZW50KTtcbiAgICAgICAgdGhpcy4jc2V0RXZlbnRMaXN0ZW5lcnMoKTtcbiAgICAgICAgYXdhaXQgdGhpcy4jdHJhbnNwb3J0LmNvbm5lY3Qoe1xuICAgICAgICAgICAgYXBpS2V5OiBvcHRpb25zLmFwaUtleSA/PyB0aGlzLm9wdGlvbnMuYXBpS2V5LFxuICAgICAgICAgICAgbW9kZWw6IHRoaXMub3B0aW9ucy5tb2RlbCxcbiAgICAgICAgICAgIGluaXRpYWxTZXNzaW9uQ29uZmlnOiBhd2FpdCB0aGlzLiNnZXRTZXNzaW9uQ29uZmlnKHRoaXMub3B0aW9ucy5jb25maWcpLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy4jaGlzdG9yeSA9IFtdO1xuICAgICAgICB0aGlzLmVtaXQoJ2hpc3RvcnlfdXBkYXRlZCcsIHRoaXMuI2hpc3RvcnkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdGhlIGhpc3Rvcnkgb2YgdGhlIHNlc3Npb24uXG4gICAgICogQHBhcmFtIG5ld0hpc3RvcnkgLSBUaGUgbmV3IGhpc3RvcnkgdG8gc2V0LlxuICAgICAqL1xuICAgIHVwZGF0ZUhpc3RvcnkobmV3SGlzdG9yeSkge1xuICAgICAgICBsZXQgdXBkYXRlZEhpc3Rvcnk7XG4gICAgICAgIGlmICh0eXBlb2YgbmV3SGlzdG9yeSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdXBkYXRlZEhpc3RvcnkgPSBuZXdIaXN0b3J5KHRoaXMuI2hpc3RvcnkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdXBkYXRlZEhpc3RvcnkgPSBuZXdIaXN0b3J5O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI3RyYW5zcG9ydC5yZXNldEhpc3RvcnkodGhpcy4jaGlzdG9yeSwgdXBkYXRlZEhpc3RvcnkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kIGEgbWVzc2FnZSB0byB0aGUgc2Vzc2lvbi5cbiAgICAgKiBAcGFyYW0gbWVzc2FnZSAtIFRoZSBtZXNzYWdlIHRvIHNlbmQuXG4gICAgICogQHBhcmFtIG90aGVyRXZlbnREYXRhIC0gQWRkaXRpb25hbCBldmVudCBkYXRhIHRvIHNlbmQuXG4gICAgICovXG4gICAgc2VuZE1lc3NhZ2UobWVzc2FnZSwgb3RoZXJFdmVudERhdGEgPSB7fSkge1xuICAgICAgICB0aGlzLiN0cmFuc3BvcnQuc2VuZE1lc3NhZ2UobWVzc2FnZSwgb3RoZXJFdmVudERhdGEpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBNdXRlIHRoZSBzZXNzaW9uLlxuICAgICAqIEBwYXJhbSBtdXRlZCAtIFdoZXRoZXIgdG8gbXV0ZSB0aGUgc2Vzc2lvbi5cbiAgICAgKi9cbiAgICBtdXRlKG11dGVkKSB7XG4gICAgICAgIHRoaXMuI3RyYW5zcG9ydC5tdXRlKG11dGVkKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGlzY29ubmVjdCBmcm9tIHRoZSBzZXNzaW9uLlxuICAgICAqL1xuICAgIGNsb3NlKCkge1xuICAgICAgICB0aGlzLiN0cmFuc3BvcnQuY2xvc2UoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZCBhdWRpbyB0byB0aGUgc2Vzc2lvbi5cbiAgICAgKiBAcGFyYW0gYXVkaW8gLSBUaGUgYXVkaW8gdG8gc2VuZC5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIEFkZGl0aW9uYWwgb3B0aW9ucy5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucy5jb21taXQgLSBXaGV0aGVyIHRvIGZpbmlzaCB0aGUgdHVybiB3aXRoIHRoaXMgYXVkaW8uXG4gICAgICovXG4gICAgc2VuZEF1ZGlvKGF1ZGlvLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgdGhpcy4jdHJhbnNwb3J0LnNlbmRBdWRpbyhhdWRpbywgb3B0aW9ucyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEludGVycnVwdCB0aGUgc2Vzc2lvbiBhcnRpZmljaWFsbHkgZm9yIGV4YW1wbGUgaWYgeW91IHdhbnQgdG8gYnVpbGQgYSBcInN0b3AgdGFsa2luZ1wiXG4gICAgICogYnV0dG9uLlxuICAgICAqL1xuICAgIGludGVycnVwdCgpIHtcbiAgICAgICAgdGhpcy4jdHJhbnNwb3J0LmludGVycnVwdCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBcHByb3ZlIGEgdG9vbCBjYWxsLiBUaGlzIHdpbGwgYWxzbyB0cmlnZ2VyIHRoZSB0b29sIGNhbGwgdG8gdGhlIGFnZW50LlxuICAgICAqIEBwYXJhbSBhcHByb3ZhbEl0ZW0gLSBUaGUgYXBwcm92YWwgaXRlbSB0byBhcHByb3ZlLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gQWRkaXRpb25hbCBvcHRpb25zLlxuICAgICAqIEBwYXJhbSBvcHRpb25zLmFsd2F5c0FwcHJvdmUgLSBXaGV0aGVyIHRvIGFsd2F5cyBhcHByb3ZlIHRoZSB0b29sIGNhbGwuXG4gICAgICovXG4gICAgYXN5bmMgYXBwcm92ZShhcHByb3ZhbEl0ZW0sIG9wdGlvbnMgPSB7IGFsd2F5c0FwcHJvdmU6IGZhbHNlIH0pIHtcbiAgICAgICAgdGhpcy4jY29udGV4dC5hcHByb3ZlVG9vbChhcHByb3ZhbEl0ZW0sIG9wdGlvbnMpO1xuICAgICAgICBjb25zdCB0b29sID0gdGhpcy4jY3VycmVudEFnZW50LnRvb2xzLmZpbmQoKHRvb2wpID0+IHRvb2wubmFtZSA9PT0gYXBwcm92YWxJdGVtLnJhd0l0ZW0ubmFtZSk7XG4gICAgICAgIGlmICh0b29sICYmIHRvb2wudHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy4jaGFuZGxlRnVuY3Rpb25Ub29sQ2FsbChhcHByb3ZhbEl0ZW0ucmF3SXRlbSwgdG9vbCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgTW9kZWxCZWhhdmlvckVycm9yKGBUb29sICR7YXBwcm92YWxJdGVtLnJhd0l0ZW0ubmFtZX0gbm90IGZvdW5kYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVqZWN0IGEgdG9vbCBjYWxsLiBUaGlzIHdpbGwgYWxzbyB0cmlnZ2VyIHRoZSB0b29sIGNhbGwgdG8gdGhlIGFnZW50LlxuICAgICAqIEBwYXJhbSBhcHByb3ZhbEl0ZW0gLSBUaGUgYXBwcm92YWwgaXRlbSB0byByZWplY3QuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBBZGRpdGlvbmFsIG9wdGlvbnMuXG4gICAgICogQHBhcmFtIG9wdGlvbnMuYWx3YXlzUmVqZWN0IC0gV2hldGhlciB0byBhbHdheXMgcmVqZWN0IHRoZSB0b29sIGNhbGwuXG4gICAgICovXG4gICAgYXN5bmMgcmVqZWN0KGFwcHJvdmFsSXRlbSwgb3B0aW9ucyA9IHsgYWx3YXlzUmVqZWN0OiBmYWxzZSB9KSB7XG4gICAgICAgIHRoaXMuI2NvbnRleHQucmVqZWN0VG9vbChhcHByb3ZhbEl0ZW0sIG9wdGlvbnMpO1xuICAgICAgICAvLyB3ZSBzdGlsbCBuZWVkIHRvIHNpbXVsYXRlIGEgdG9vbCBjYWxsIHRvIHRoZSBhZ2VudCB0byBsZXQgdGhlIGFnZW50IGtub3dcbiAgICAgICAgY29uc3QgdG9vbCA9IHRoaXMuI2N1cnJlbnRBZ2VudC50b29scy5maW5kKCh0b29sKSA9PiB0b29sLm5hbWUgPT09IGFwcHJvdmFsSXRlbS5yYXdJdGVtLm5hbWUpO1xuICAgICAgICBpZiAodG9vbCAmJiB0b29sLnR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuI2hhbmRsZUZ1bmN0aW9uVG9vbENhbGwoYXBwcm92YWxJdGVtLnJhd0l0ZW0sIHRvb2wpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE1vZGVsQmVoYXZpb3JFcnJvcihgVG9vbCAke2FwcHJvdmFsSXRlbS5yYXdJdGVtLm5hbWV9IG5vdCBmb3VuZGApO1xuICAgICAgICB9XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmVhbHRpbWVTZXNzaW9uLm1qcy5tYXAiLCJpbXBvcnQgKiBhcyB1dGlsSW1wb3J0IGZyb20gXCIuL3V0aWxzLm1qc1wiO1xuZXhwb3J0IHsgUmVhbHRpbWVBZ2VudCB9IGZyb20gXCIuL3JlYWx0aW1lQWdlbnQubWpzXCI7XG5leHBvcnQgeyBSZWFsdGltZVNlc3Npb24sIH0gZnJvbSBcIi4vcmVhbHRpbWVTZXNzaW9uLm1qc1wiO1xuZXhwb3J0IHsgT3BlbkFJUmVhbHRpbWVXZWJSVEMsIH0gZnJvbSBcIi4vb3BlbmFpUmVhbHRpbWVXZWJSdGMubWpzXCI7XG5leHBvcnQgeyBPcGVuQUlSZWFsdGltZVdlYlNvY2tldCwgfSBmcm9tIFwiLi9vcGVuYWlSZWFsdGltZVdlYnNvY2tldC5tanNcIjtcbmV4cG9ydCB7IE9wZW5BSVJlYWx0aW1lQmFzZSwgREVGQVVMVF9PUEVOQUlfUkVBTFRJTUVfTU9ERUwsIERFRkFVTFRfT1BFTkFJX1JFQUxUSU1FX1NFU1NJT05fQ09ORklHLCB9IGZyb20gXCIuL29wZW5haVJlYWx0aW1lQmFzZS5tanNcIjtcbmV4cG9ydCBjb25zdCB1dGlscyA9IHtcbiAgICBiYXNlNjRUb0FycmF5QnVmZmVyOiB1dGlsSW1wb3J0LmJhc2U2NFRvQXJyYXlCdWZmZXIsXG4gICAgYXJyYXlCdWZmZXJUb0Jhc2U2NDogdXRpbEltcG9ydC5hcnJheUJ1ZmZlclRvQmFzZTY0LFxuICAgIGdldExhc3RUZXh0RnJvbUF1ZGlvT3V0cHV0TWVzc2FnZTogdXRpbEltcG9ydC5nZXRMYXN0VGV4dEZyb21BdWRpb091dHB1dE1lc3NhZ2UsXG59O1xuZXhwb3J0IHsgTW9kZWxCZWhhdmlvckVycm9yLCBPdXRwdXRHdWFyZHJhaWxUcmlwd2lyZVRyaWdnZXJlZCwgdG9vbCwgVXNlckVycm9yLCB9IGZyb20gJ0BvcGVuYWkvYWdlbnRzLWNvcmUnO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXgubWpzLm1hcCJdLCJuYW1lcyI6WyJNRVRBREFUQSIsImJhc2U2NFRvQXJyYXlCdWZmZXIiLCJiYXNlNjQiLCJiaW5hcnlTdHJpbmciLCJsZW4iLCJieXRlcyIsImkiLCJhcnJheUJ1ZmZlclRvQmFzZTY0IiwiYXJyYXlCdWZmZXIiLCJnZXRMYXN0VGV4dEZyb21BdWRpb091dHB1dE1lc3NhZ2UiLCJpdGVtIiwibGFzdENvbnRlbnRJdGVtIiwiZGlmZlJlYWx0aW1lSGlzdG9yeSIsIm9sZEhpc3RvcnkiLCJuZXdIaXN0b3J5IiwicmVtb3ZhbHMiLCJuZXdJdGVtIiwiYWRkaXRpb25zIiwib2xkSXRlbSIsInVwZGF0ZXMiLCJoYXNXZWJSVENTdXBwb3J0IiwicmVtb3ZlQXVkaW9Gcm9tQ29udGVudCIsImVudHJ5IiwidXBkYXRlUmVhbHRpbWVIaXN0b3J5IiwiaGlzdG9yeSIsImV2ZW50Iiwic2hvdWxkSW5jbHVkZUF1ZGlvRGF0YSIsIm5ld0V2ZW50IiwiZXhpc3RpbmdJbmRleCIsImlkeCIsInByZXZJbmRleCIsIkhFQURFUlMiLCJXRUJTT0NLRVRfTUVUQSIsInMiLCJtIiwiaCIsImQiLCJ3IiwieSIsIm1zIiwidmFsIiwib3B0aW9ucyIsInR5cGUiLCJwYXJzZSIsImZtdExvbmciLCJmbXRTaG9ydCIsInN0ciIsIm1hdGNoIiwibiIsIm1zQWJzIiwicGx1cmFsIiwibmFtZSIsImlzUGx1cmFsIiwic2V0dXAiLCJlbnYiLCJjcmVhdGVEZWJ1ZyIsImNvZXJjZSIsImRpc2FibGUiLCJlbmFibGUiLCJlbmFibGVkIiwicmVxdWlyZSQkMCIsImRlc3Ryb3kiLCJrZXkiLCJzZWxlY3RDb2xvciIsIm5hbWVzcGFjZSIsImhhc2giLCJwcmV2VGltZSIsImVuYWJsZU92ZXJyaWRlIiwibmFtZXNwYWNlc0NhY2hlIiwiZW5hYmxlZENhY2hlIiwiZGVidWciLCJhcmdzIiwic2VsZiIsImN1cnIiLCJpbmRleCIsImZvcm1hdCIsImZvcm1hdHRlciIsImV4dGVuZCIsInYiLCJkZWxpbWl0ZXIiLCJuZXdEZWJ1ZyIsIm5hbWVzcGFjZXMiLCJzcGxpdCIsIm5zIiwibWF0Y2hlc1RlbXBsYXRlIiwic2VhcmNoIiwidGVtcGxhdGUiLCJzZWFyY2hJbmRleCIsInRlbXBsYXRlSW5kZXgiLCJzdGFySW5kZXgiLCJtYXRjaEluZGV4Iiwic2tpcCIsImNvbW1vbiIsImV4cG9ydHMiLCJmb3JtYXRBcmdzIiwic2F2ZSIsImxvYWQiLCJ1c2VDb2xvcnMiLCJsb2NhbHN0b3JhZ2UiLCJ3YXJuZWQiLCJtb2R1bGUiLCJjIiwibGFzdEMiLCJyIiwiZm9ybWF0dGVycyIsImVycm9yIiwic2FmZUV4ZWN1dGUiLCJmbiIsIm1ha2VQYXJzZWFibGVUZXh0Rm9ybWF0IiwicmVzcG9uc2VfZm9ybWF0IiwicGFyc2VyIiwib2JqIiwiaWdub3JlT3ZlcnJpZGUiLCJkZWZhdWx0T3B0aW9ucyIsImdldERlZmF1bHRPcHRpb25zIiwiem9kRGVmIiwiem9kU2NoZW1hIiwiaXNFbXB0eU9iaiIsIl9rIiwiZ2V0UmVmcyIsIl9vcHRpb25zIiwiY3VycmVudFBhdGgiLCJkZWYiLCJhZGRFcnJvck1lc3NhZ2UiLCJyZXMiLCJlcnJvck1lc3NhZ2UiLCJyZWZzIiwic2V0UmVzcG9uc2VWYWx1ZUFuZEVycm9ycyIsInZhbHVlIiwidXRpbCIsIl8iLCJhc3NlcnRJcyIsIl9hcmciLCJhc3NlcnROZXZlciIsIl94IiwiaXRlbXMiLCJ2YWxpZEtleXMiLCJrIiwiZmlsdGVyZWQiLCJlIiwib2JqZWN0Iiwia2V5cyIsImFyciIsImNoZWNrZXIiLCJqb2luVmFsdWVzIiwiYXJyYXkiLCJzZXBhcmF0b3IiLCJvYmplY3RVdGlsIiwiZmlyc3QiLCJzZWNvbmQiLCJ1dGlsJDEiLCJab2RFcnJvciIsImlzc3VlcyIsInN1YiIsInN1YnMiLCJhY3R1YWxQcm90byIsIl9tYXBwZXIiLCJtYXBwZXIiLCJpc3N1ZSIsImZpZWxkRXJyb3JzIiwicHJvY2Vzc0Vycm9yIiwiZWwiLCJmb3JtRXJyb3JzIiwiZXJyb3JVdGlsIiwibWVzc2FnZSIsIlpvZEZpcnN0UGFydHlUeXBlS2luZCIsInBhcnNlQW55RGVmIiwicGFyc2VBcnJheURlZiIsIl9iIiwiX2EiLCJwYXJzZURlZiIsInBhcnNlQmlnaW50RGVmIiwiY2hlY2siLCJwYXJzZUJvb2xlYW5EZWYiLCJwYXJzZUJyYW5kZWREZWYiLCJfZGVmIiwicGFyc2VDYXRjaERlZiIsInBhcnNlRGF0ZURlZiIsIm92ZXJyaWRlRGF0ZVN0cmF0ZWd5Iiwic3RyYXRlZ3kiLCJpbnRlZ2VyRGF0ZVBhcnNlciIsInBhcnNlRGVmYXVsdERlZiIsInBhcnNlRWZmZWN0c0RlZiIsImZvcmNlUmVzb2x1dGlvbiIsInBhcnNlRW51bURlZiIsImlzSnNvblNjaGVtYTdBbGxPZlR5cGUiLCJwYXJzZUludGVyc2VjdGlvbkRlZiIsImFsbE9mIiwieCIsInVuZXZhbHVhdGVkUHJvcGVydGllcyIsIm1lcmdlZEFsbE9mIiwic2NoZW1hIiwibmVzdGVkU2NoZW1hIiwiYWRkaXRpb25hbFByb3BlcnRpZXMiLCJyZXN0IiwicGFyc2VMaXRlcmFsRGVmIiwicGFyc2VkVHlwZSIsImVtb2ppUmVnZXgiLCJ6b2RQYXR0ZXJucyIsInBhcnNlU3RyaW5nRGVmIiwicHJvY2Vzc1BhdHRlcm4iLCJlc2NhcGVOb25BbHBoYU51bWVyaWMiLCJhZGRGb3JtYXQiLCJhZGRQYXR0ZXJuIiwicmVnZXgiLCJwcm9jZXNzUmVnRXhwIiwicmVnZXhPckZ1bmN0aW9uIiwiZmxhZ3MiLCJzb3VyY2UiLCJwYXR0ZXJuIiwiaXNFc2NhcGVkIiwiaW5DaGFyR3JvdXAiLCJpbkNoYXJSYW5nZSIsInJlZ2V4VGVzdCIsInBhcnNlUmVjb3JkRGVmIiwiYWNjIiwiX2MiLCJrZXlUeXBlIiwiX2QiLCJwYXJzZU1hcERlZiIsInZhbHVlcyIsInBhcnNlTmF0aXZlRW51bURlZiIsImFjdHVhbFZhbHVlcyIsInBhcnNlZFR5cGVzIiwicGFyc2VOZXZlckRlZiIsInBhcnNlTnVsbERlZiIsInByaW1pdGl2ZU1hcHBpbmdzIiwicGFyc2VVbmlvbkRlZiIsImFzQW55T2YiLCJ0eXBlcyIsInVuaXF1ZVR5cGVzIiwiYSIsImFueU9mIiwicGFyc2VOdWxsYWJsZURlZiIsImJhc2UiLCJwYXJzZU51bWJlckRlZiIsImRlY2lkZUFkZGl0aW9uYWxQcm9wZXJ0aWVzIiwicGFyc2VPYmplY3REZWYiLCJyZXN1bHQiLCJwcm9wTmFtZSIsInByb3BEZWYiLCJwcm9wZXJ0eVBhdGgiLCJwYXJzZWREZWYiLCJwYXJzZU9wdGlvbmFsRGVmIiwiaW5uZXJTY2hlbWEiLCJwYXJzZVBpcGVsaW5lRGVmIiwiYiIsInBhcnNlUHJvbWlzZURlZiIsInBhcnNlU2V0RGVmIiwicGFyc2VUdXBsZURlZiIsInBhcnNlVW5kZWZpbmVkRGVmIiwicGFyc2VVbmtub3duRGVmIiwicGFyc2VSZWFkb25seURlZiIsInNlZW5JdGVtIiwib3ZlcnJpZGVSZXN1bHQiLCJzZWVuU2NoZW1hIiwiZ2V0JHJlZiIsImpzb25TY2hlbWEiLCJzZWxlY3RQYXJzZXIiLCJhZGRNZXRhIiwiZ2V0UmVsYXRpdmVQYXRoIiwicGF0aEEiLCJwYXRoQiIsInR5cGVOYW1lIiwiem9kVG9Kc29uU2NoZW1hIiwibWFpbiIsInRpdGxlIiwiZGVmaW5pdGlvbnMiLCJwcm9jZXNzZWREZWZpbml0aW9ucyIsIm5ld0RlZmluaXRpb25zIiwiY29tYmluZWQiLCJtYWtlUGFyc2VhYmxlUmVzcG9uc2VUb29sIiwidG9vbCIsImNhbGxiYWNrIiwiX3pvZFRvSnNvblNjaGVtYSIsInpvZFRleHRGb3JtYXQiLCJ6b2RPYmplY3QiLCJwcm9wcyIsImNvbnRlbnQiLCJ6b2RSZXNwb25zZXNGdW5jdGlvbiIsIkFnZW50c0Vycm9yIiwic3RhdGUiLCJfX3B1YmxpY0ZpZWxkIiwiU3lzdGVtRXJyb3IiLCJNYXhUdXJuc0V4Y2VlZGVkRXJyb3IiLCJNb2RlbEJlaGF2aW9yRXJyb3IiLCJVc2VyRXJyb3IiLCJHdWFyZHJhaWxFeGVjdXRpb25FcnJvciIsIlRvb2xDYWxsRXJyb3IiLCJJbnB1dEd1YXJkcmFpbFRyaXB3aXJlVHJpZ2dlcmVkIiwiT3V0cHV0R3VhcmRyYWlsVHJpcHdpcmVUcmlnZ2VyZWQiLCJpc1pvZE9iamVjdCIsImlucHV0IiwiaXNBZ2VudFRvb2xJbnB1dCIsInRvRnVuY3Rpb25Ub29sTmFtZSIsImdldFNjaGVtYUFuZFBhcnNlckZyb21JbnB1dFR5cGUiLCJpbnB1dFR5cGUiLCJmb3JtYXR0ZWRGdW5jdGlvbiIsImNvbnZlcnRBZ2VudE91dHB1dFR5cGVUb1NlcmlhbGl6YWJsZSIsIm91dHB1dFR5cGUiLCJvdXRwdXQiLCJfY29udGV4dEFzeW5jTG9jYWxTdG9yYWdlIiwiZ2V0Q29udGV4dEFzeW5jTG9jYWxTdG9yYWdlIiwiQXN5bmNMb2NhbFN0b3JhZ2UiLCJnZXRDdXJyZW50VHJhY2UiLCJjdXJyZW50VHJhY2UiLCJnZXRDdXJyZW50U3BhbiIsImN1cnJlbnRTcGFuIiwiX3dyYXBGdW5jdGlvbldpdGhUcmFjZUxpZmVjeWNsZSIsInRyYWNlIiwid2l0aFRyYWNlIiwibmV3VHJhY2UiLCJnZXRHbG9iYWxUcmFjZVByb3ZpZGVyIiwiZ2V0T3JDcmVhdGVUcmFjZSIsInNldEN1cnJlbnRTcGFuIiwic3BhbiIsImNvbnRleHQiLCJyZXNldEN1cnJlbnRTcGFuIiwiYWRkRXJyb3JUb0N1cnJlbnRTcGFuIiwic3BhbkVycm9yIiwiY2xvbmVDdXJyZW50Q29udGV4dCIsIndpdGhOZXdTcGFuQ29udGV4dCIsImN1cnJlbnRDb250ZXh0IiwiY29weU9mQ29udGV4dCIsIkNvbnNvbGVTcGFuRXhwb3J0ZXIiLCJ0cmFjaW5nIiwibG9nZ2VyIiwiQmF0Y2hUcmFjZVByb2Nlc3NvciIsImV4cG9ydGVyIiwibWF4UXVldWVTaXplIiwibWF4QmF0Y2hTaXplIiwic2NoZWR1bGVEZWxheSIsImV4cG9ydFRyaWdnZXJSYXRpbyIsIl9fcHJpdmF0ZUFkZCIsIl9CYXRjaFRyYWNlUHJvY2Vzc29yX2luc3RhbmNlcyIsIl9tYXhRdWV1ZVNpemUiLCJfbWF4QmF0Y2hTaXplIiwiX3NjaGVkdWxlRGVsYXkiLCJfZXhwb3J0VHJpZ2dlclNpemUiLCJfZXhwb3J0ZXIiLCJfYnVmZmVyIiwiX3RpbWVyIiwiX3RpbWVvdXQiLCJfZXhwb3J0SW5Qcm9ncmVzcyIsIl90aW1lb3V0QWJvcnRDb250cm9sbGVyIiwiX19wcml2YXRlU2V0IiwiX19wcml2YXRlTWV0aG9kIiwic2FmZUFkZEl0ZW1fZm4iLCJfdHJhY2UiLCJfc3BhbiIsInRpbWVvdXQiLCJfX3ByaXZhdGVHZXQiLCJleHBvcnRCYXRjaGVzX2ZuIiwicmVzb2x2ZSIsInJ1bkV4cG9ydExvb3BfZm4iLCJmb3JjZSIsInRvRXhwb3J0IiwiYmF0Y2giLCJNdWx0aVRyYWNpbmdQcm9jZXNzb3IiLCJfcHJvY2Vzc29ycyIsInByb2Nlc3NvciIsInByb2Nlc3NvcnMiLCJfZGVmYXVsdEV4cG9ydGVyIiwiX2RlZmF1bHRQcm9jZXNzb3IiLCJkZWZhdWx0RXhwb3J0ZXIiLCJkZWZhdWx0UHJvY2Vzc29yIiwidGltZUlzbyIsImdlbmVyYXRlVHJhY2VJZCIsInJhbmRvbVVVSUQiLCJnZW5lcmF0ZVNwYW5JZCIsInJlbW92ZVByaXZhdGVGaWVsZHMiLCJfU3BhbiIsIl9kYXRhIiwiX3RyYWNlSWQiLCJfc3BhbklkIiwiX3BhcmVudElkIiwiX3Byb2Nlc3NvciIsIl9zdGFydGVkQXQiLCJfZW5kZWRBdCIsIl9lcnJvciIsIl9wcmV2aW91c1NwYW4iLCJTcGFuIiwiTm9vcFNwYW4iLCJkYXRhIiwiX1RyYWNlIiwiX3N0YXJ0ZWQiLCJUcmFjZSIsIk5vb3BUcmFjZSIsIlRyYWNlUHJvdmlkZXIiLCJfbXVsdGlQcm9jZXNzb3IiLCJfZGlzYWJsZWQiLCJsb2FkRW52IiwiZGlzYWJsZWQiLCJ0cmFjZU9wdGlvbnMiLCJ0cmFjZUlkIiwic3Bhbk9wdGlvbnMiLCJwYXJlbnQiLCJwYXJlbnRJZCIsIkdMT0JBTF9UUkFDRV9QUk9WSURFUiIsIl93aXRoU3BhbkZhY3RvcnkiLCJjcmVhdGVTcGFuIiwiY3JlYXRlQWdlbnRTcGFuIiwiY3JlYXRlRnVuY3Rpb25TcGFuIiwid2l0aEZ1bmN0aW9uU3BhbiIsImNyZWF0ZUhhbmRvZmZTcGFuIiwid2l0aEhhbmRvZmZTcGFuIiwiY3JlYXRlR3VhcmRyYWlsU3BhbiIsIndpdGhHdWFyZHJhaWxTcGFuIiwiY3JlYXRlTUNQTGlzdFRvb2xzU3BhbiIsIndpdGhNQ1BMaXN0VG9vbHNTcGFuIiwiYWRkVHJhY2VQcm9jZXNzb3IiLCJjbGVhbnVwIiwicmVhc29uIiwicHJvbWlzZSIsInRvU21hcnRTdHJpbmciLCJkZWZhdWx0VG9vbEVycm9yRnVuY3Rpb24iLCJ0b29sRXJyb3JGdW5jdGlvbiIsInN0cmljdE1vZGUiLCJwYXJhbWV0ZXJzIiwiX2ludm9rZSIsInJ1bkNvbnRleHQiLCJwYXJzZWQiLCJzdHJpbmdSZXN1bHQiLCJpbnZva2UiLCJuZWVkc0FwcHJvdmFsIiwiWm9kUGFyc2VkVHlwZSIsImdldFBhcnNlZFR5cGUiLCJab2RJc3N1ZUNvZGUiLCJlcnJvck1hcCIsIl9jdHgiLCJvdmVycmlkZUVycm9yTWFwIiwiZGVmYXVsdEVycm9yTWFwIiwiZ2V0RXJyb3JNYXAiLCJtYWtlSXNzdWUiLCJwYXJhbXMiLCJwYXRoIiwiZXJyb3JNYXBzIiwiaXNzdWVEYXRhIiwiZnVsbFBhdGgiLCJmdWxsSXNzdWUiLCJtYXBzIiwibWFwIiwiYWRkSXNzdWVUb0NvbnRleHQiLCJjdHgiLCJvdmVycmlkZU1hcCIsIlBhcnNlU3RhdHVzIiwic3RhdHVzIiwicmVzdWx0cyIsImFycmF5VmFsdWUiLCJJTlZBTElEIiwicGFpcnMiLCJzeW5jUGFpcnMiLCJwYWlyIiwiZmluYWxPYmplY3QiLCJESVJUWSIsIk9LIiwiaXNBYm9ydGVkIiwiaXNEaXJ0eSIsImlzVmFsaWQiLCJpc0FzeW5jIiwiUGFyc2VJbnB1dExhenlQYXRoIiwiaGFuZGxlUmVzdWx0IiwicHJvY2Vzc0NyZWF0ZVBhcmFtcyIsImludmFsaWRfdHlwZV9lcnJvciIsInJlcXVpcmVkX2Vycm9yIiwiZGVzY3JpcHRpb24iLCJpc3MiLCJab2RUeXBlIiwiZXJyIiwibWF5YmVBc3luY1Jlc3VsdCIsImdldElzc3VlUHJvcGVydGllcyIsInNldEVycm9yIiwicmVmaW5lbWVudERhdGEiLCJyZWZpbmVtZW50IiwiWm9kRWZmZWN0cyIsIlpvZE9wdGlvbmFsIiwiWm9kTnVsbGFibGUiLCJab2RBcnJheSIsIlpvZFByb21pc2UiLCJvcHRpb24iLCJab2RVbmlvbiIsImluY29taW5nIiwiWm9kSW50ZXJzZWN0aW9uIiwidHJhbnNmb3JtIiwiZGVmYXVsdFZhbHVlRnVuYyIsIlpvZERlZmF1bHQiLCJab2RCcmFuZGVkIiwiY2F0Y2hWYWx1ZUZ1bmMiLCJab2RDYXRjaCIsIlRoaXMiLCJ0YXJnZXQiLCJab2RQaXBlbGluZSIsIlpvZFJlYWRvbmx5IiwiY3VpZFJlZ2V4IiwiY3VpZDJSZWdleCIsInVsaWRSZWdleCIsInV1aWRSZWdleCIsIm5hbm9pZFJlZ2V4Iiwiand0UmVnZXgiLCJkdXJhdGlvblJlZ2V4IiwiZW1haWxSZWdleCIsIl9lbW9qaVJlZ2V4IiwiaXB2NFJlZ2V4IiwiaXB2NENpZHJSZWdleCIsImlwdjZSZWdleCIsImlwdjZDaWRyUmVnZXgiLCJiYXNlNjRSZWdleCIsImJhc2U2NHVybFJlZ2V4IiwiZGF0ZVJlZ2V4U291cmNlIiwiZGF0ZVJlZ2V4IiwidGltZVJlZ2V4U291cmNlIiwic2Vjb25kc1JlZ2V4U291cmNlIiwic2Vjb25kc1F1YW50aWZpZXIiLCJ0aW1lUmVnZXgiLCJkYXRldGltZVJlZ2V4Iiwib3B0cyIsImlzVmFsaWRJUCIsImlwIiwidmVyc2lvbiIsImlzVmFsaWRKV1QiLCJqd3QiLCJhbGciLCJoZWFkZXIiLCJkZWNvZGVkIiwiaXNWYWxpZENpZHIiLCJab2RTdHJpbmciLCJ0b29CaWciLCJ0b29TbWFsbCIsInZhbGlkYXRpb24iLCJtaW5MZW5ndGgiLCJtYXhMZW5ndGgiLCJjaCIsIm1pbiIsIm1heCIsImZsb2F0U2FmZVJlbWFpbmRlciIsInN0ZXAiLCJ2YWxEZWNDb3VudCIsInN0ZXBEZWNDb3VudCIsImRlY0NvdW50IiwidmFsSW50Iiwic3RlcEludCIsIlpvZE51bWJlciIsImtpbmQiLCJpbmNsdXNpdmUiLCJab2RCaWdJbnQiLCJab2RCb29sZWFuIiwiWm9kRGF0ZSIsIm1pbkRhdGUiLCJtYXhEYXRlIiwiWm9kU3ltYm9sIiwiWm9kVW5kZWZpbmVkIiwiWm9kTnVsbCIsIlpvZEFueSIsIlpvZFVua25vd24iLCJab2ROZXZlciIsIlpvZFZvaWQiLCJkZWVwUGFydGlhbGlmeSIsIlpvZE9iamVjdCIsIm5ld1NoYXBlIiwiZmllbGRTY2hlbWEiLCJab2RUdXBsZSIsInNoYXBlIiwic2hhcGVLZXlzIiwiZXh0cmFLZXlzIiwia2V5VmFsaWRhdG9yIiwidW5rbm93bktleXMiLCJjYXRjaGFsbCIsImRlZmF1bHRFcnJvciIsImF1Z21lbnRhdGlvbiIsIm1lcmdpbmciLCJtYXNrIiwibmV3RmllbGQiLCJjcmVhdGVab2RFbnVtIiwiaGFuZGxlUmVzdWx0cyIsInVuaW9uRXJyb3JzIiwiY2hpbGRDdHgiLCJkaXJ0eSIsImdldERpc2NyaW1pbmF0b3IiLCJab2RMYXp5IiwiWm9kTGl0ZXJhbCIsIlpvZEVudW0iLCJab2ROYXRpdmVFbnVtIiwiWm9kRGlzY3JpbWluYXRlZFVuaW9uIiwiZGlzY3JpbWluYXRvciIsImRpc2NyaW1pbmF0b3JWYWx1ZSIsIm9wdGlvbnNNYXAiLCJkaXNjcmltaW5hdG9yVmFsdWVzIiwibWVyZ2VWYWx1ZXMiLCJhVHlwZSIsImJUeXBlIiwiYktleXMiLCJzaGFyZWRLZXlzIiwibmV3T2JqIiwic2hhcmVkVmFsdWUiLCJuZXdBcnJheSIsIml0ZW1BIiwiaXRlbUIiLCJoYW5kbGVQYXJzZWQiLCJwYXJzZWRMZWZ0IiwicGFyc2VkUmlnaHQiLCJtZXJnZWQiLCJsZWZ0IiwicmlnaHQiLCJpdGVtSW5kZXgiLCJzY2hlbWFzIiwiWm9kUmVjb3JkIiwidmFsdWVUeXBlIiwidGhpcmQiLCJab2RNYXAiLCJmaW5hbE1hcCIsIlpvZFNldCIsImZpbmFsaXplU2V0IiwiZWxlbWVudHMiLCJwYXJzZWRTZXQiLCJlbGVtZW50IiwibWluU2l6ZSIsIm1heFNpemUiLCJzaXplIiwiZ2V0dGVyIiwiZXhwZWN0ZWRWYWx1ZXMiLCJlbnVtVmFsdWVzIiwibmV3RGVmIiwib3B0IiwibmF0aXZlRW51bVZhbHVlcyIsInByb21pc2lmaWVkIiwiZWZmZWN0IiwiY2hlY2tDdHgiLCJhcmciLCJwcm9jZXNzZWQiLCJleGVjdXRlUmVmaW5lbWVudCIsImlubmVyIiwicHJlcHJvY2VzcyIsIm5ld0N0eCIsIlpvZE5hTiIsImluUmVzdWx0IiwiZnJlZXplIiwic3RyaW5nVHlwZSIsIm51bWJlclR5cGUiLCJib29sZWFuVHlwZSIsImFueVR5cGUiLCJhcnJheVR5cGUiLCJvYmplY3RUeXBlIiwidW5pb25UeXBlIiwiZGlzY3JpbWluYXRlZFVuaW9uVHlwZSIsInJlY29yZFR5cGUiLCJsYXp5VHlwZSIsImxpdGVyYWxUeXBlIiwiZW51bVR5cGUiLCJ6Lm9iamVjdCIsInouc3RyaW5nIiwiei5saXRlcmFsIiwiei5yZWNvcmQiLCJ6LmFueSIsInouYXJyYXkiLCJ6LmJvb2xlYW4iLCJnZXRBbGxNY3BGdW5jdGlvblRvb2xzIiwibWNwU2VydmVycyIsImNvbnZlcnRTY2hlbWFzVG9TdHJpY3QiLCJhbGxUb29scyIsInRvb2xOYW1lcyIsInNlcnZlciIsInNlcnZlclRvb2xzIiwiZ2V0RnVuY3Rpb25Ub29sc0Zyb21TZXJ2ZXIiLCJpbnRlcnNlY3Rpb24iLCJ0IiwiX2NhY2hlZFRvb2xzIiwibWNwVG9vbHMiLCJ0b29scyIsIm1jcFRvRnVuY3Rpb25Ub29sIiwiZ2V0QWxsTWNwVG9vbHMiLCJtY3BUb29sIiwiX2NvbnRleHQiLCJzdHJpY3RTY2hlbWEiLCJlbnN1cmVTdHJpY3RKc29uU2NoZW1hIiwiZ2xvYmFsTG9nZ2VyIiwibm9uU3RyaWN0U2NoZW1hIiwib3V0IiwiQnJvd3NlckV2ZW50RW1pdHRlciIsIl90YXJnZXQiLCJsaXN0ZW5lciIsImhhbmRsZXIiLCJSZWFkYWJsZSIsIl9kZXN0aW5hdGlvbiIsIl90cmFuc2Zvcm0iLCJSZWFkYWJsZVN0cmVhbSIsIlRyYW5zZm9ybVN0cmVhbSIsIkJyb3dzZXJUaW1lciIsInRpbWVvdXRJZCIsInRpbWVyIiwiX2xvYWRFbnYiLCJpc0VuYWJsZWQiLCJmbGFnTmFtZSIsImxvZ2dpbmciLCJkb250TG9nTW9kZWxEYXRhIiwiZG9udExvZ1Rvb2xEYXRhIiwiZ2V0TG9nZ2VyIiwiRXZlbnRFbWl0dGVyRGVsZWdhdGUiLCJBZ2VudEhvb2tzIiwiUnVudGltZUV2ZW50RW1pdHRlciIsIlJ1bkhvb2tzIiwiZGVmaW5lSW5wdXRHdWFyZHJhaWwiLCJleGVjdXRlIiwiZGVmaW5lT3V0cHV0R3VhcmRyYWlsIiwiZ2V0VHJhbnNmZXJNZXNzYWdlIiwiYWdlbnQiLCJkZWZhdWx0SGFuZG9mZlRvb2xOYW1lIiwiZGVmYXVsdEhhbmRvZmZUb29sRGVzY3JpcHRpb24iLCJIYW5kb2ZmIiwib25JbnZva2VIYW5kb2ZmIiwiaGFuZG9mZiIsImNvbmZpZyIsImhhc09uSGFuZG9mZiIsImhhc0lucHV0VHlwZSIsImlucHV0SnNvblN0cmluZyIsImdldEhhbmRvZmYiLCJnZXREZWZhdWx0TW9kZWxQcm92aWRlciIsIlNoYXJlZEJhc2UiLCJJdGVtQmFzZSIsIlJlZnVzYWwiLCJPdXRwdXRUZXh0IiwiSW5wdXRUZXh0IiwiSW5wdXRJbWFnZSIsInpcbiAgICAgICAgLnN0cmluZyIsIklucHV0RmlsZSIsIkF1ZGlvQ29udGVudCIsIkltYWdlQ29udGVudCIsIlRvb2xPdXRwdXRUZXh0IiwiVG9vbE91dHB1dEltYWdlIiwiQ29tcHV0ZXJUb29sT3V0cHV0IiwiY29tcHV0ZXJBY3Rpb25zIiwiei5kaXNjcmltaW5hdGVkVW5pb24iLCJ6Lm51bWJlciIsInouZW51bSIsIkFzc2lzdGFudENvbnRlbnQiLCJNZXNzYWdlQmFzZSIsIkFzc2lzdGFudE1lc3NhZ2VJdGVtIiwiVXNlckNvbnRlbnQiLCJVc2VyTWVzc2FnZUl0ZW0iLCJTeXN0ZW1NZXNzYWdlSXRlbSIsIkhvc3RlZFRvb2xDYWxsSXRlbSIsIkZ1bmN0aW9uQ2FsbEl0ZW0iLCJGdW5jdGlvbkNhbGxSZXN1bHRJdGVtIiwiQ29tcHV0ZXJVc2VDYWxsSXRlbSIsIkNvbXB1dGVyQ2FsbFJlc3VsdEl0ZW0iLCJUb29sQ2FsbEl0ZW0iLCJSZWFzb25pbmdJdGVtIiwiVW5rbm93bkl0ZW0iLCJPdXRwdXRNb2RlbEl0ZW0iLCJNb2RlbEl0ZW0iLCJ6LnVuaW9uIiwiVXNhZ2VEYXRhIiwiU3RyZWFtRXZlbnRUZXh0U3RyZWFtIiwiU3RyZWFtRXZlbnRSZXNwb25zZVN0YXJ0ZWQiLCJTdHJlYW1FdmVudFJlc3BvbnNlQ29tcGxldGVkIiwiU3RyZWFtRXZlbnRHZW5lcmljSXRlbSIsIlVzYWdlIiwibmV3VXNhZ2UiLCJSdW5Db250ZXh0IiwiX2FwcHJvdmFscyIsImFwcHJvdmFscyIsInRvb2xOYW1lIiwiY2FsbElkIiwiYXBwcm92YWxFbnRyeSIsImluZGl2aWR1YWxDYWxsQXBwcm92YWwiLCJpbmRpdmlkdWFsQ2FsbFJlamVjdGlvbiIsImFwcHJvdmFsSXRlbSIsImFsd2F5c0FwcHJvdmUiLCJhbHdheXNSZWplY3QiLCJSdW5SZXN1bHRCYXNlIiwiZ2V0VHVybklucHV0IiwicmVzcG9uc2VzIiwiUnVuUmVzdWx0IiwiU3RyZWFtZWRSdW5SZXN1bHQiLCJfc2lnbmFsIiwiX3JlYWRhYmxlQ29udHJvbGxlciIsIl9yZWFkYWJsZVN0cmVhbSIsIl9jb21wbGV0ZWRQcm9taXNlIiwiX2NvbXBsZXRlZFByb21pc2VSZXNvbHZlIiwiX2NvbXBsZXRlZFByb21pc2VSZWplY3QiLCJfY2FuY2VsbGVkIiwiX1JlYWRhYmxlU3RyZWFtIiwiY29udHJvbGxlciIsInJlamVjdCIsInN0cmVhbSIsInNlcmlhbGl6ZVRvb2wiLCJzZXJpYWxpemVIYW5kb2ZmIiwiUnVuSXRlbUJhc2UiLCJSdW5NZXNzYWdlT3V0cHV0SXRlbSIsInJhd0l0ZW0iLCJwYXJ0IiwiUnVuVG9vbENhbGxJdGVtIiwiUnVuVG9vbENhbGxPdXRwdXRJdGVtIiwiUnVuUmVhc29uaW5nSXRlbSIsIlJ1bkhhbmRvZmZDYWxsSXRlbSIsIlJ1bkhhbmRvZmZPdXRwdXRJdGVtIiwic291cmNlQWdlbnQiLCJ0YXJnZXRBZ2VudCIsIlJ1blRvb2xBcHByb3ZhbEl0ZW0iLCJnZXRMYXN0VGV4dEZyb21PdXRwdXRNZXNzYWdlIiwib3V0cHV0TWVzc2FnZSIsImxhc3RJdGVtIiwiZ2V0T3V0cHV0VGV4dCIsIlJ1blJhd01vZGVsU3RyZWFtRXZlbnQiLCJSdW5JdGVtU3RyZWFtRXZlbnQiLCJSdW5BZ2VudFVwZGF0ZWRTdHJlYW1FdmVudCIsInByb2Nlc3NNb2RlbFJlc3BvbnNlIiwibW9kZWxSZXNwb25zZSIsImhhbmRvZmZzIiwicnVuSGFuZG9mZnMiLCJydW5GdW5jdGlvbnMiLCJydW5Db21wdXRlckFjdGlvbnMiLCJ0b29sc1VzZWQiLCJoYW5kb2ZmTWFwIiwiZnVuY3Rpb25NYXAiLCJjb21wdXRlclRvb2wiLCJmdW5jdGlvblRvb2wiLCJuZXh0U3RlcFNjaGVtYSIsIlNpbmdsZVN0ZXBSZXN1bHQiLCJvcmlnaW5hbElucHV0IiwicHJlU3RlcEl0ZW1zIiwibmV3U3RlcEl0ZW1zIiwibmV4dFN0ZXAiLCJtYXliZVJlc2V0VG9vbENob2ljZSIsInRvb2xVc2VUcmFja2VyIiwibW9kZWxTZXR0aW5ncyIsImV4ZWN1dGVJbnRlcnJ1cHRlZFRvb2xzQW5kU2lkZUVmZmVjdHMiLCJvcmlnaW5hbFByZVN0ZXBJdGVtcyIsIm5ld1Jlc3BvbnNlIiwicHJvY2Vzc2VkUmVzcG9uc2UiLCJydW5uZXIiLCJhcHByb3ZhbFJlcXVlc3RzIiwiZnVuY3Rpb25Ub29sUnVucyIsInJ1biIsImZ1bmN0aW9uUmVzdWx0cyIsImV4ZWN1dGVGdW5jdGlvblRvb2xDYWxscyIsIm5ld0l0ZW1zIiwiY2hlY2tUb29sT3V0cHV0IiwiY2hlY2tGb3JGaW5hbE91dHB1dEZyb21Ub29scyIsImV4ZWN1dGVUb29sc0FuZFNpZGVFZmZlY3RzIiwiY29tcHV0ZXJSZXN1bHRzIiwiZXhlY3V0ZUNvbXB1dGVyQWN0aW9ucyIsImV4ZWN1dGVIYW5kb2ZmQ2FsbHMiLCJtZXNzYWdlSXRlbXMiLCJwb3RlbnRpYWxGaW5hbE91dHB1dCIsImdldFRvb2xDYWxsT3V0cHV0SXRlbSIsInRvb2xDYWxsIiwidG9vbFJ1bnMiLCJydW5TaW5nbGVUb29sIiwidG9vbFJ1biIsInBhcnNlZEFyZ3MiLCJhcHByb3ZhbCIsInJlc3BvbnNlIiwiX3J1bkNvbXB1dGVyQWN0aW9uQW5kU2NyZWVuc2hvdCIsImNvbXB1dGVyIiwiYWN0aW9uIiwic2NyZWVuc2hvdCIsInAiLCJhY3Rpb25zIiwiaW1hZ2VVcmwiLCJhY3R1YWxIYW5kb2ZmIiwiaGFuZG9mZlNwYW4iLCJuZXdBZ2VudCIsInJlcXVlc3RlZEFnZW50cyIsImlucHV0RmlsdGVyIiwiaGFuZG9mZklucHV0RGF0YSIsIk5PVF9GSU5BTF9PVVRQVVQiLCJ0b29sUmVzdWx0cyIsImludGVycnVwdGlvbnMiLCJmaXJzdFRvb2xSZXN1bHQiLCJ0b29sVXNlQmVoYXZpb3IiLCJzdG9wcGluZ1Rvb2wiLCJhZGRTdGVwVG9SdW5SZXN1bHQiLCJpdGVtTmFtZSIsIkFnZW50VG9vbFVzZVRyYWNrZXIiLCJfYWdlbnRUb1Rvb2xzIiwiQ1VSUkVOVF9TQ0hFTUFfVkVSU0lPTiIsIiRzY2hlbWFWZXJzaW9uIiwic2VyaWFsaXplZEFnZW50U2NoZW1hIiwiU2VyaWFsaXplZFNwYW4iLCJ6XG4gICAgICAgIC5vYmplY3QiLCJ6LmxhenkiLCJ1c2FnZVNjaGVtYSIsIm1vZGVsUmVzcG9uc2VTY2hlbWEiLCJwcm90b2NvbC5PdXRwdXRNb2RlbEl0ZW0iLCJpdGVtU2NoZW1hIiwicHJvdG9jb2wuQXNzaXN0YW50TWVzc2FnZUl0ZW0iLCJwcm90b2NvbC5Ub29sQ2FsbEl0ZW0iLCJwcm90b2NvbC5Ib3N0ZWRUb29sQ2FsbEl0ZW0iLCJwcm90b2NvbC5GdW5jdGlvbkNhbGxSZXN1bHRJdGVtIiwicHJvdG9jb2wuUmVhc29uaW5nSXRlbSIsInByb3RvY29sLkZ1bmN0aW9uQ2FsbEl0ZW0iLCJzZXJpYWxpemVkVHJhY2VTY2hlbWEiLCJzZXJpYWxpemVkUHJvY2Vzc2VkUmVzcG9uc2VTY2hlbWEiLCJndWFyZHJhaWxGdW5jdGlvbk91dHB1dFNjaGVtYSIsImlucHV0R3VhcmRyYWlsUmVzdWx0U2NoZW1hIiwib3V0cHV0R3VhcmRyYWlsUmVzdWx0U2NoZW1hIiwiU2VyaWFsaXplZFJ1blN0YXRlIiwicHJvdG9jb2wuTW9kZWxJdGVtIiwiUnVuU3RhdGUiLCJzdGFydGluZ0FnZW50IiwibWF4VHVybnMiLCJpbml0aWFsQWdlbnQiLCJwYXJzaW5nRXJyb3IiLCJqc29uUmVzdWx0IiwiY3VycmVudFNjaGVtYVZlcnNpb24iLCJzdGF0ZUpzb24iLCJhZ2VudE1hcCIsImJ1aWxkQWdlbnRNYXAiLCJjdXJyZW50QWdlbnQiLCJhZ2VudE5hbWUiLCJkZXNlcmlhbGl6ZVNwYW4iLCJkZXNlcmlhbGl6ZU1vZGVsUmVzcG9uc2UiLCJkZXNlcmlhbGl6ZUl0ZW0iLCJkZXNlcmlhbGl6ZVByb2Nlc3NlZFJlc3BvbnNlIiwiX2UiLCJxdWV1ZSIsIkFnZW50Iiwic2VyaWFsaXplZFNwYW4iLCJzcGFuRGF0YSIsInByZXZpb3VzU3BhbiIsInNlcmlhbGl6ZWRNb2RlbFJlc3BvbnNlIiwidXNhZ2UiLCJzZXJpYWxpemVkSXRlbSIsInNlcmlhbGl6ZWRQcm9jZXNzZWRSZXNwb25zZSIsImNvbXB1dGVyVG9vbHMiLCJmdW5jdGlvbkNhbGwiLCJjb21wdXRlckFjdGlvbiIsIkRFRkFVTFRfTUFYX1RVUk5TIiwiZ2V0VHJhY2luZyIsInRyYWNpbmdEaXNhYmxlZCIsInRyYWNlSW5jbHVkZVNlbnNpdGl2ZURhdGEiLCJnZW5lcmF0ZWRJdGVtcyIsInJhd0l0ZW1zIiwiUnVubmVyIiwiX1J1bm5lcl9pbnN0YW5jZXMiLCJydW5JbmRpdmlkdWFsU3RyZWFtX2ZuIiwicnVuSW5kaXZpZHVhbE5vblN0cmVhbV9mbiIsIm1vZGVsIiwidHVyblJlc3VsdCIsImhhbmRvZmZOYW1lcyIsInNlcmlhbGl6ZWRUb29scyIsInNlcmlhbGl6ZWRIYW5kb2ZmcyIsInJ1bklucHV0R3VhcmRyYWlsc19mbiIsInR1cm5JbnB1dCIsInJ1bk91dHB1dEd1YXJkcmFpbHNfZm4iLCJndWFyZHJhaWxzIiwiZ3VhcmRyYWlsQXJncyIsImd1YXJkcmFpbCIsImFnZW50T3V0cHV0IiwicnVuU3RyZWFtTG9vcF9mbiIsImZpbmFsUmVzcG9uc2UiLCJvdXRwdXRUeXBlcyIsInRvb2xEZXNjcmlwdGlvbiIsImN1c3RvbU91dHB1dEV4dHJhY3RvciIsIlJlYWx0aW1lQWdlbnQiLCJnZXRSZWFsdGltZUd1YXJkcmFpbFNldHRpbmdzIiwic2V0dGluZ3MiLCJkZWZpbmVSZWFsdGltZU91dHB1dEd1YXJkcmFpbCIsInBvbGljeUhpbnRJbnB1dCIsImJhc2VHdWFyZHJhaWwiLCJwb2xpY3lIaW50IiwiZ2V0UmVhbHRpbWVHdWFyZHJhaWxGZWVkYmFja01lc3NhZ2UiLCJyZWFsdGltZU1lc3NhZ2VJdGVtU2NoZW1hIiwicmVhbHRpbWVUb29sQ2FsbEl0ZW0iLCJyZWFsdGltZVJlc3BvbnNlIiwielxuICAgICAgICAgICAgLnJlY29yZCIsImNvbnZlcnNhdGlvbkl0ZW1Db250ZW50U2NoZW1hIiwiY29udmVyc2F0aW9uSXRlbVNjaGVtYSIsImNvbnZlcnNhdGlvbkNyZWF0ZWRFdmVudFNjaGVtYSIsImNvbnZlcnNhdGlvbkl0ZW1DcmVhdGVkRXZlbnRTY2hlbWEiLCJjb252ZXJzYXRpb25JdGVtRGVsZXRlZEV2ZW50U2NoZW1hIiwiY29udmVyc2F0aW9uSXRlbUlucHV0QXVkaW9UcmFuc2NyaXB0aW9uQ29tcGxldGVkRXZlbnRTY2hlbWEiLCJjb252ZXJzYXRpb25JdGVtSW5wdXRBdWRpb1RyYW5zY3JpcHRpb25EZWx0YUV2ZW50U2NoZW1hIiwiY29udmVyc2F0aW9uSXRlbUlucHV0QXVkaW9UcmFuc2NyaXB0aW9uRmFpbGVkRXZlbnRTY2hlbWEiLCJjb252ZXJzYXRpb25JdGVtUmV0cmlldmVkRXZlbnRTY2hlbWEiLCJjb252ZXJzYXRpb25JdGVtVHJ1bmNhdGVkRXZlbnRTY2hlbWEiLCJjb252ZXJzYXRpb25JdGVtQ3JlYXRlRXZlbnRTY2hlbWEiLCJjb252ZXJzYXRpb25JdGVtRGVsZXRlRXZlbnRTY2hlbWEiLCJjb252ZXJzYXRpb25JdGVtUmV0cmlldmVFdmVudFNjaGVtYSIsImNvbnZlcnNhdGlvbkl0ZW1UcnVuY2F0ZUV2ZW50U2NoZW1hIiwiZXJyb3JFdmVudFNjaGVtYSIsImlucHV0QXVkaW9CdWZmZXJDbGVhcmVkRXZlbnRTY2hlbWEiLCJpbnB1dEF1ZGlvQnVmZmVyQXBwZW5kRXZlbnRTY2hlbWEiLCJpbnB1dEF1ZGlvQnVmZmVyQ2xlYXJFdmVudFNjaGVtYSIsImlucHV0QXVkaW9CdWZmZXJDb21taXRFdmVudFNjaGVtYSIsImlucHV0QXVkaW9CdWZmZXJDb21taXR0ZWRFdmVudFNjaGVtYSIsImlucHV0QXVkaW9CdWZmZXJTcGVlY2hTdGFydGVkRXZlbnRTY2hlbWEiLCJpbnB1dEF1ZGlvQnVmZmVyU3BlZWNoU3RvcHBlZEV2ZW50U2NoZW1hIiwib3V0cHV0QXVkaW9CdWZmZXJTdGFydGVkRXZlbnRTY2hlbWEiLCJ6XG4gICAgLm9iamVjdCIsIm91dHB1dEF1ZGlvQnVmZmVyU3RvcHBlZEV2ZW50U2NoZW1hIiwib3V0cHV0QXVkaW9CdWZmZXJDbGVhcmVkRXZlbnRTY2hlbWEiLCJyYXRlTGltaXRzVXBkYXRlZEV2ZW50U2NoZW1hIiwicmVzcG9uc2VBdWRpb0RlbHRhRXZlbnRTY2hlbWEiLCJyZXNwb25zZUF1ZGlvRG9uZUV2ZW50U2NoZW1hIiwicmVzcG9uc2VBdWRpb1RyYW5zY3JpcHREZWx0YUV2ZW50U2NoZW1hIiwicmVzcG9uc2VBdWRpb1RyYW5zY3JpcHREb25lRXZlbnRTY2hlbWEiLCJyZXNwb25zZUNvbnRlbnRQYXJ0QWRkZWRFdmVudFNjaGVtYSIsInJlc3BvbnNlQ29udGVudFBhcnREb25lRXZlbnRTY2hlbWEiLCJyZXNwb25zZUNyZWF0ZWRFdmVudFNjaGVtYSIsInJlc3BvbnNlRG9uZUV2ZW50U2NoZW1hIiwicmVzcG9uc2VGdW5jdGlvbkNhbGxBcmd1bWVudHNEZWx0YUV2ZW50U2NoZW1hIiwicmVzcG9uc2VGdW5jdGlvbkNhbGxBcmd1bWVudHNEb25lRXZlbnRTY2hlbWEiLCJyZXNwb25zZU91dHB1dEl0ZW1BZGRlZEV2ZW50U2NoZW1hIiwicmVzcG9uc2VPdXRwdXRJdGVtRG9uZUV2ZW50U2NoZW1hIiwicmVzcG9uc2VUZXh0RGVsdGFFdmVudFNjaGVtYSIsInJlc3BvbnNlVGV4dERvbmVFdmVudFNjaGVtYSIsInNlc3Npb25DcmVhdGVkRXZlbnRTY2hlbWEiLCJzZXNzaW9uVXBkYXRlZEV2ZW50U2NoZW1hIiwicmVzcG9uc2VDYW5jZWxFdmVudFNjaGVtYSIsInJlc3BvbnNlQ3JlYXRlRXZlbnRTY2hlbWEiLCJzZXNzaW9uVXBkYXRlRXZlbnRTY2hlbWEiLCJ0cmFuc2NyaXB0aW9uU2Vzc2lvblVwZGF0ZUV2ZW50U2NoZW1hIiwidHJhbnNjcmlwdGlvblNlc3Npb25VcGRhdGVkRXZlbnRTY2hlbWEiLCJnZW5lcmljRXZlbnRTY2hlbWEiLCJyZWFsdGltZVNlcnZlckV2ZW50U2NoZW1hIiwicGFyc2VSZWFsdGltZUV2ZW50IiwicmF3IiwiZ2VuZXJpY1BhcnNlZCIsIkRFRkFVTFRfT1BFTkFJX1JFQUxUSU1FX01PREVMIiwiREVGQVVMVF9PUEVOQUlfUkVBTFRJTUVfU0VTU0lPTl9DT05GSUciLCJPcGVuQUlSZWFsdGltZUJhc2UiLCJfbW9kZWwiLCJfYXBpS2V5IiwiX3RyYWNpbmdDb25maWciLCJhcGlLZXkiLCJpc0dlbmVyaWMiLCJpbnB1dFRva2VucyIsIm91dHB1dFRva2VucyIsInRvdGFsVG9rZW5zIiwiX2YiLCJwcmV2aW91c0l0ZW1JZCIsInJlYWx0aW1lSXRlbSIsIm90aGVyRXZlbnREYXRhIiwidHJhY2luZ0NvbmZpZyIsInNlc3Npb25EYXRhIiwic3RhcnRSZXNwb25zZSIsImF1ZGlvIiwiY29tbWl0IiwicmVtb3ZhbElkcyIsInVwZGF0ZSIsIml0ZW1JZCIsImFkZGl0aW9uc0FuZFVwZGF0ZXMiLCJhZGRpdGlvbiIsIml0ZW1FbnRyeSIsIk9wZW5BSVJlYWx0aW1lV2ViUlRDIiwiX3VybCIsIl9zdGF0ZSIsIl91c2VJbnNlY3VyZUFwaUtleSIsIl9vbmdvaW5nUmVzcG9uc2UiLCJfbXV0ZWQiLCJiYXNlVXJsIiwiaXNDbGllbnRLZXkiLCJ1c2VyU2Vzc2lvbkNvbmZpZyIsImNvbm5lY3Rpb25VcmwiLCJwZWVyQ29ubmVjdGlvbiIsImRhdGFDaGFubmVsIiwiYXVkaW9FbGVtZW50Iiwib2ZmZXIiLCJzZXNzaW9uQ29uZmlnIiwiYW5zd2VyIiwibXV0ZWQiLCJzZW5kZXIiLCJXZWJTb2NrZXQiLCJPcGVuQUlSZWFsdGltZVdlYlNvY2tldCIsIl9PcGVuQUlSZWFsdGltZVdlYlNvY2tldF9pbnN0YW5jZXMiLCJfY3VycmVudEl0ZW1JZCIsIl9jdXJyZW50QXVkaW9Db250ZW50SW5kZXgiLCJhdWRpb0V2ZW50Iiwic2V0dXBXZWJTb2NrZXRfZm4iLCJlbGFwc2VkVGltZSIsIndlYnNvY2tldEFyZ3VtZW50cyIsIndzIiwiYnVmZiIsIlJlYWx0aW1lU2Vzc2lvbiIsIl9SZWFsdGltZVNlc3Npb25faW5zdGFuY2VzIiwiX3RyYW5zcG9ydCIsIl9jdXJyZW50QWdlbnQiLCJfY3VycmVudFRvb2xzIiwiX291dHB1dEd1YXJkcmFpbHMiLCJfb3V0cHV0R3VhcmRyYWlsU2V0dGluZ3MiLCJfdHJhbnNjcmliZWRUZXh0RGVsdGFzIiwiX2hpc3RvcnkiLCJfc2hvdWxkSW5jbHVkZUF1ZGlvRGF0YSIsInNldEN1cnJlbnRBZ2VudF9mbiIsImdldFNlc3Npb25Db25maWdfZm4iLCJzZXRFdmVudExpc3RlbmVyc19mbiIsInVwZGF0ZWRIaXN0b3J5IiwiaGFuZGxlRnVuY3Rpb25Ub29sQ2FsbF9mbiIsImhhbmRvZmZUb29scyIsImFkZGl0aW9uYWxDb25maWciLCJpbnN0cnVjdGlvbnMiLCJoYW5kbGVIYW5kb2ZmX2ZuIiwiaGFuZGxlRnVuY3Rpb25DYWxsX2ZuIiwiZnVuY3Rpb25Ub29sTWFwIiwicG9zc2libGVIYW5kb2ZmIiwiZmVlZGJhY2tUZXh0IiwidGV4dE91dHB1dCIsImxhc3RSdW5JbmRleCIsImxhc3RJdGVtSWQiLCJkZWx0YSIsIm5ld1RleHQiLCJuZXdSdW5JbmRleCIsImlzTmV3IiwiYWRkZWRJdGVtIiwidXRpbHMiLCJ1dGlsSW1wb3J0LmJhc2U2NFRvQXJyYXlCdWZmZXIiLCJ1dGlsSW1wb3J0LmFycmF5QnVmZmVyVG9CYXNlNjQiLCJ1dGlsSW1wb3J0LmdldExhc3RUZXh0RnJvbUF1ZGlvT3V0cHV0TWVzc2FnZSJdLCJt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LEtBQU0sUUFDTixNQUFPQSxDQUMzQixDQUFpQixDQUNqQixDQUNBLENBQVMsRUFDRHJILEVBQUEsS0FBS3F0QixHQUFXLEdBQUcsZ0JBQWlCLE1BQU8zaEMsR0FBVSxDQUNqRCxHQUFJLENBQ0EsTUFBTWlVLEVBQUEsS0FBS3l0QixFQUFBa0IsSUFBTCxVQUF5QjVpQyxFQUMvQyxPQUNtQmdGLEVBQU8sQ0FDVjZOLEdBQU8sTUFBTSwrQkFBZ0M3TixDQUFLLEVBQ2xELEtBQUssS0FBSyxRQUFTLENBQ2YsS0FBTSxRQUNOLE1BQUFBLENBQ3BCLENBQWlCLENBQ2pCLENBQ0EsQ0FBUyxFQUNEc1AsRUFBQSxLQUFLcXRCLEdBQVcsR0FBRyxlQUFpQjNKLEdBQVUsQ0FDMUMxakIsRUFBQSxLQUFLZ1UsR0FBUyxNQUFNLElBQUkwUCxDQUFLLENBQ3pDLENBQVMsRUFDRDFqQixFQUFBLEtBQUtxdEIsR0FBVyxHQUFHLG9CQUFxQixJQUFNLENBQzFDLEtBQUssS0FBSyxvQkFBcUJydEIsRUFBQSxLQUFLZ1UsR0FBVWhVLEVBQUEsS0FBS3N0QixFQUFhLENBQzVFLENBQVMsRUFDRHR0QixFQUFBLEtBQUtxdEIsR0FBVyxHQUFHLFFBQVUzOEIsR0FBVSxDQUNuQyxLQUFLLEtBQUssUUFBU0EsQ0FBSyxDQUNwQyxDQUFTLENBQ1QsRUNwV1ksTUFBQ3crQixHQUFRLENBQ2pCLG9CQUFxQkMsRUFDckIsb0JBQXFCQyxHQUNyQixrQ0FBbUNDLEVBQ3ZDIiwieF9nb29nbGVfaWdub3JlTGlzdCI6WzIsMyw0LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsMjQsMjUsMjYsMjcsMjgsMjksMzAsMzEsMzIsMzMsMzQsMzUsMzYsMzcsMzgsMzksNDAsNDEsNDIsNDMsNDQsNDUsNDYsNDcsNDgsNjIsNjMsNjQsNjUsNjYsNjcsNjhdfQ==