pulse-ui-client 0.1.32 → 0.1.37

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pulse-ui-client",
3
- "version": "0.1.32",
3
+ "version": "0.1.37",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -10,22 +10,21 @@
10
10
  "main": "./dist/index.js",
11
11
  "module": "./dist/index.js",
12
12
  "types": "./dist/index.d.ts",
13
- "dependencies": {
14
- "socket.io-client": "^4.8.1"
15
- },
16
13
  "exports": {
17
14
  ".": {
18
15
  "@pulse/source": "./src/index.ts",
19
- "types": "./dist/index.d.ts",
20
- "bun": "./dist/index.bun.js",
21
- "node": "./dist/index.node.js",
22
- "browser": {
23
- "development": "./dist/index.development.js",
24
- "default": "./dist/index.js"
25
- },
26
- "development": "./dist/index.development.js",
27
16
  "default": "./dist/index.js"
28
- }
17
+ },
18
+ "./package.json": "./package.json"
19
+ },
20
+ "scripts": {
21
+ "build": "tsdown",
22
+ "build:dev": "tsdown --env development",
23
+ "build:watch": "tsdown --watch",
24
+ "prepublishOnly": "bun run tsdown"
25
+ },
26
+ "dependencies": {
27
+ "socket.io-client": "^4.8.1"
29
28
  },
30
29
  "devDependencies": {
31
30
  "@types/bun": "latest",
@@ -33,6 +32,7 @@
33
32
  "@types/react": "^19.1.10",
34
33
  "@types/react-dom": "^19.1.7",
35
34
  "esbuild": "^0.25.10",
35
+ "tsdown": "^0.15.7",
36
36
  "typescript": "^5"
37
37
  },
38
38
  "peerDependencies": {
@@ -40,9 +40,10 @@
40
40
  "react-dom": "^18 || ^19",
41
41
  "react-router": "^7"
42
42
  },
43
- "scripts": {
44
- "build": "bun --bun scripts/build.ts && bun run build:types",
45
- "build:types": "tsc -p tsconfig.build.json",
46
- "prepublishOnly": "bun run build"
43
+ "publishConfig": {
44
+ "exports": {
45
+ ".": "./dist/index.js",
46
+ "./package.json": "./package.json"
47
+ }
47
48
  }
48
49
  }
package/dist/channel.d.ts DELETED
@@ -1,28 +0,0 @@
1
- import type { PulseSocketIOClient } from "./client";
2
- import type { ServerChannelMessage } from "./messages";
3
- export declare class PulseChannelResetError extends Error {
4
- constructor(message: string);
5
- }
6
- export type ChannelEventHandler = (payload: any) => any | Promise<any>;
7
- export declare class ChannelBridge {
8
- private client;
9
- readonly id: string;
10
- private handlers;
11
- private pending;
12
- private backlog;
13
- private closed;
14
- constructor(client: PulseSocketIOClient, id: string);
15
- emit(event: string, payload?: any): void;
16
- request(event: string, payload?: any): Promise<any>;
17
- on(event: string, handler: ChannelEventHandler): () => void;
18
- handleServerMessage(message: ServerChannelMessage): boolean;
19
- handleDisconnect(reason: PulseChannelResetError): void;
20
- dispose(reason: PulseChannelResetError): void;
21
- private ensureOpen;
22
- private flushBacklog;
23
- private dispatchEvent;
24
- private dispatchRequest;
25
- private resolvePending;
26
- private close;
27
- }
28
- export declare function createChannelBridge(client: PulseSocketIOClient, id: string): ChannelBridge;
package/dist/client.d.ts DELETED
@@ -1,40 +0,0 @@
1
- import type { NavigateFunction } from "react-router";
2
- import type { ChannelBridge } from "./channel";
3
- import type { RouteInfo } from "./helpers";
4
- import type { ClientMessage, ServerErrorInfo } from "./messages";
5
- import type { VDOM, VDOMUpdate } from "./vdom";
6
- export interface MountedView {
7
- routeInfo: RouteInfo;
8
- onInit: (vdom: VDOM, callbacks: string[], renderProps: string[], cssRefs: string[]) => void;
9
- onUpdate: (ops: VDOMUpdate[]) => void;
10
- }
11
- export type ConnectionStatusListener = (connected: boolean) => void;
12
- export type ServerErrorListener = (path: string, error: ServerErrorInfo | null) => void;
13
- export interface PulseClient {
14
- connect(): Promise<void>;
15
- disconnect(): void;
16
- isConnected(): boolean;
17
- onConnectionChange(listener: ConnectionStatusListener): () => void;
18
- navigate(path: string, routeInfo: RouteInfo): Promise<void>;
19
- leave(path: string): Promise<void>;
20
- invokeCallback(path: string, callback: string, args: any[]): Promise<void>;
21
- mountView(path: string, view: MountedView): () => void;
22
- }
23
- export declare class PulseSocketIOClient {
24
- #private;
25
- constructor(url: string, renderId: string, frameworkNavigate: NavigateFunction);
26
- isConnected(): boolean;
27
- connect(): Promise<void>;
28
- onConnectionChange(listener: ConnectionStatusListener): () => void;
29
- private notifyConnectionListeners;
30
- onServerError(listener: ServerErrorListener): () => void;
31
- private notifyServerError;
32
- sendMessage(payload: ClientMessage): void;
33
- mountView(path: string, view: MountedView): void;
34
- navigate(path: string, routeInfo: RouteInfo): Promise<void>;
35
- unmount(path: string): void;
36
- disconnect(): void;
37
- invokeCallback(path: string, callback: string, args: any[]): void;
38
- acquireChannel(id: string): ChannelBridge;
39
- releaseChannel(id: string): void;
40
- }
package/dist/form.d.ts DELETED
@@ -1,21 +0,0 @@
1
- import React from "react";
2
- export type PulseFormProps = React.ComponentPropsWithoutRef<"form"> & {
3
- action: string;
4
- };
5
- /**
6
- * PulseForm intercepts native form submissions and sends them through fetch so the
7
- * surrounding Pulse view stays mounted. Server-side handlers are still invoked via
8
- * the form action endpoint and reactive updates propagate over the socket.
9
- */
10
- export declare const PulseForm: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.FormHTMLAttributes<HTMLFormElement>, HTMLFormElement>, "ref"> & {
11
- action: string;
12
- } & React.RefAttributes<HTMLFormElement>>;
13
- interface SubmitForm {
14
- event: React.FormEvent<HTMLFormElement>;
15
- action: string;
16
- onSubmit?: PulseFormProps["onSubmit"];
17
- formData?: FormData;
18
- force?: boolean;
19
- }
20
- export declare function submitForm({ event, action, onSubmit, formData, force }: SubmitForm): Promise<void>;
21
- export {};
package/dist/helpers.d.ts DELETED
@@ -1,21 +0,0 @@
1
- import type { LoaderFunctionArgs } from "react-router";
2
- export interface RouteInfo {
3
- pathname: string;
4
- hash: string;
5
- query: string;
6
- queryParams: Record<string, string>;
7
- pathParams: Record<string, string | undefined>;
8
- catchall: string[];
9
- }
10
- export declare function extractServerRouteInfo({ params, request }: LoaderFunctionArgs): {
11
- hash: string;
12
- pathname: string;
13
- query: string;
14
- queryParams: {
15
- [k: string]: string;
16
- };
17
- pathParams: {
18
- readonly [x: string]: string | undefined;
19
- };
20
- catchall: string[];
21
- };
package/dist/index.bun.js DELETED
@@ -1,5 +0,0 @@
1
- // @bun
2
- class b extends Error{constructor(W){super(W);this.name="PulseChannelResetError"}}function N1(){if(typeof crypto<"u"&&typeof crypto.randomUUID==="function")return crypto.randomUUID().replace(/-/g,"");return Math.random().toString(16).slice(2)+Math.random().toString(16).slice(2)}function f1(W){if(W instanceof Error)return W.message;if(typeof W==="string")return W;try{return JSON.stringify(W)}catch{return String(W)}}function B1(W){return typeof W.responseTo==="string"}function C1(W){return typeof W.event==="string"}class t{client;id;handlers=new Map;pending=new Map;backlog=[];closed=!1;constructor(W,Z){this.client=W;this.id=Z}emit(W,Z){this.ensureOpen(),this.client.sendMessage({type:"channel_message",channel:this.id,event:W,payload:Z})}request(W,Z){this.ensureOpen();let $=N1();return new Promise((J,q)=>{this.pending.set($,{resolve:J,reject:q}),this.client.sendMessage({type:"channel_message",channel:this.id,event:W,payload:Z,requestId:$})})}on(W,Z){this.ensureOpen();let $=this.handlers.get(W);if(!$)$=new Set,this.handlers.set(W,$);return $.add(Z),this.flushBacklog(W),()=>{let J=this.handlers.get(W);if(!J)return;if(J.delete(Z),J.size===0)this.handlers.delete(W)}}handleServerMessage(W){if(B1(W))return this.resolvePending(W),this.closed;if(this.closed)return!0;if(!C1(W))return this.closed;if(W.event==="__close__")return this.close(new b("Channel closed by server")),!0;if(W.requestId)this.dispatchRequest(W);else this.dispatchEvent(W);return this.closed}handleDisconnect(W){this.close(W)}dispose(W){this.close(W)}ensureOpen(){if(this.closed)throw new b("Channel is closed")}flushBacklog(W){if(this.backlog.length===0)return;let Z=[];for(let $ of this.backlog)if($.event===W)this.dispatchEvent($);else Z.push($);this.backlog=Z}dispatchEvent(W){let Z=this.handlers.get(W.event);if(!Z||Z.size===0){this.backlog.push(W);return}for(let $ of Z)try{let J=$(W.payload);if(J&&typeof J.then==="function")J.catch((q)=>{console.error("Pulse channel handler error",q)})}catch(J){console.error("Pulse channel handler error",J)}}async dispatchRequest(W){let Z=this.handlers.get(W.event),$,J;if(Z&&Z.size>0)for(let q of Z)try{let G=q(W.payload);if($=await Promise.resolve(G),$!==void 0)break}catch(G){J=G;break}if(J){this.client.sendMessage({type:"channel_message",channel:this.id,event:void 0,responseTo:W.requestId,error:f1(J)});return}this.client.sendMessage({type:"channel_message",channel:this.id,event:void 0,responseTo:W.requestId,payload:$})}resolvePending(W){let Z=W.responseTo?this.pending.get(W.responseTo):void 0;if(!Z)return;if(this.pending.delete(W.responseTo),W.error!==void 0&&W.error!==null)Z.reject(new b(String(W.error)));else Z.resolve(W.payload)}close(W){if(this.closed)return;this.closed=!0;for(let Z of this.pending.values())Z.reject(W);this.pending.clear(),this.handlers.clear(),this.backlog=[]}}function e(W,Z){return new t(W,Z)}import{forwardRef as K1,useCallback as H1}from"react";import{jsx as P1}from"react/jsx-runtime";var I1=K1(function({onSubmit:Z,action:$,...J},q){return P1("form",{...J,action:$,ref:q,onSubmit:H1((G)=>W1({event:G,action:$,onSubmit:Z}),[$,Z])})});async function W1({event:W,action:Z,onSubmit:$,formData:J,force:q}){if($?.(W),!q&&W.defaultPrevented)return;let G=W.currentTarget;W.preventDefault();let U=W.nativeEvent;if(!J)J=new FormData(G,U.submitter);let F=new URL(Z,window.location.href);try{await fetch(F,{method:"POST",credentials:"include",body:J})}catch(O){throw O}}function b1({params:W,request:Z}){let{"*":$="",...J}=W,q=new URL(Z.url);return{hash:q.hash,pathname:q.pathname,query:q.search,queryParams:Object.fromEntries(q.searchParams.entries()),pathParams:J,catchall:$.length>1?$.split("/"):[]}}import{createContext as j1,useContext as A1,useEffect as m,useMemo as o,useState as s}from"react";import{useLocation as Q0,useNavigate as G0,useParams as z0}from"react-router";import{io as Z0}from"socket.io-client";function Y(){function W(Z,$){return(J)=>{let q={};for(let G of Z)q[G]=J[G];if($)for(let G in $){let U=$[G];q[G]=U(J)}return q}}return W}var Y1=(W)=>W.tagName.toLowerCase(),y1=["id","className","tagName","localName","clientHeight","clientLeft","clientTop","clientWidth","scrollHeight","scrollLeft","scrollTop","scrollWidth","slot"],w1=["autofocus","tabIndex","nonce"],L1=["accessKey","accessKeyLabel","autocapitalize","dir","draggable","hidden","inert","lang","offsetHeight","offsetLeft","offsetTop","offsetWidth","popover","spellcheck","title","translate","writingSuggestions","contentEditable","enterKeyHint","isContentEditable","inputMode"],M1=Y()(y1,{tagName:Y1}),S1=Y()(w1),k1=Y()(L1);function y(W){return{...M1(W),...S1(W),...k1(W)}}function X(W,Z){let $=Y()(W,Z);return(J)=>({...y(J),...$(J)})}var _1=["hash","host","hostname","href","origin","password","pathname","port","protocol","search","target","download","rel","hreflang","type","username","ping","referrerPolicy","text"],T1=X(_1),g1=["alt","coords","download","hash","host","hostname","href","origin","password","pathname","port","protocol","rel","search","shape","target","username","ping","referrerPolicy"],v1=X(g1),x1=["autoplay","controls","crossOrigin","currentSrc","currentTime","defaultMuted","defaultPlaybackRate","duration","ended","loop","muted","networkState","paused","playbackRate","preload","readyState","seeking","src","volume","preservesPitch"],X1=X(x1),u1=(W)=>X1(W),m1=["disabled","name","type","value","formAction","formEnctype","formMethod","formNoValidate","formTarget","popoverTargetAction"],h1=X(m1),E1=["value"],p1=X(E1),d1=["height","src","type","width","align","name"],i1=X(d1),c1=["disabled","name","type","validationMessage","willValidate"],n1=X(c1),l1=["acceptCharset","action","autocomplete","encoding","enctype","length","method","name","noValidate","target","rel"],o1=X(l1),s1=["allow","allowFullscreen","height","name","referrerPolicy","src","srcdoc","width","align","frameBorder","longDesc","marginHeight","marginWidth","scrolling","sandbox"],r1=X(s1),a1=["alt","crossOrigin","decoding","height","isMap","loading","naturalHeight","naturalWidth","referrerPolicy","sizes","src","srcset","useMap","width","align","border","complete","hspace","longDesc","lowsrc","name","vspace","x","y","fetchPriority"],t1=X(a1),e1=["accept","alt","autocomplete","checked","defaultChecked","defaultValue","dirName","disabled","height","indeterminate","max","maxLength","min","minLength","multiple","name","pattern","placeholder","readOnly","required","selectionDirection","selectionEnd","selectionStart","size","src","step","type","value","valueAsNumber","width","align","capture","formAction","formEnctype","formMethod","formNoValidate","formTarget","useMap","validationMessage","willValidate","popoverTargetAction"],WW=X(e1),ZW=["htmlFor"],$W=X(ZW),JW=["value","type"],qW=X(JW),XW=["as","crossOrigin","disabled","fetchPriority","href","hreflang","imageSizes","imageSrcset","integrity","media","referrerPolicy","rel","type","charset","rev","target","sizes"],FW=X(XW),QW=["name"],GW=X(QW),zW=["high","low","max","min","optimum","value"],UW=X(zW),DW=["cite","dateTime"],Z1=X(DW),VW=["reversed","start","type","compact"],jW=X(VW),AW=["data","height","name","type","useMap","width","validationMessage","willValidate","align","archive","border","code","codeBase","codeType","declare","hspace","standby","vspace"],OW=X(AW),RW=["disabled","label"],NW=X(RW),fW=["defaultSelected","disabled","index","label","selected","text","value"],BW=X(fW),CW=["defaultValue","name","type","value","htmlFor","validationMessage","willValidate"],KW=X(CW),HW=["max","position","value"],IW=X(HW),PW=["cite"],$1=X(PW),bW=(W)=>y(W),YW=["async","crossOrigin","defer","fetchPriority","integrity","noModule","referrerPolicy","src","text","type","charset"],yW=Y()(YW,{event:(W)=>W.event,htmlFor:(W)=>W.htmlFor}),wW=(W)=>({...y(W),...yW(W)}),LW=["autocomplete","disabled","length","multiple","name","required","selectedIndex","size","type","value","validationMessage","willValidate"],MW=X(LW),SW=["name"],kW=X(SW),_W=["height","media","sizes","src","srcset","type","width"],TW=X(_W),gW=["align"],vW=X(gW),xW=["abbr","cellIndex","colSpan","headers","rowSpan","scope","align","axis","bgColor","ch","chOff","height","noWrap","vAlign","width"],J1=X(xW),uW=["span","align","ch","chOff","vAlign","width"],q1=X(uW),mW=["align","bgColor","border","cellPadding","cellSpacing","frame","rules","summary","width"],hW=X(mW),EW=["rowIndex","sectionRowIndex","align","bgColor","ch","chOff","vAlign"],pW=X(EW),dW=["align","ch","chOff","vAlign"],p=X(dW),iW=(W)=>y(W),cW=["autocomplete","cols","defaultValue","dirName","disabled","maxLength","minLength","name","placeholder","readOnly","required","rows","selectionDirection","selectionEnd","selectionStart","value","wrap","textLength","validationMessage","willValidate"],nW=X(cW),lW=["dateTime"],oW=X(lW),sW=["default","kind","label","readyState","src","srclang"],rW=X(sW),aW=["height","poster","videoHeight","videoWidth","width","playsInline"],tW=Y()(aW),eW=(W)=>({...X1(W),...tW(W)}),WZ=["clear"],ZZ=X(WZ),$Z=["href","target"],JZ=X($Z),qZ=["aLink","background","bgColor","link","text","vLink"],XZ=X(qZ),FZ=["compact"],QZ=X(FZ),GZ=["open"],zZ=X(GZ),UZ=["open","returnValue"],DZ=X(UZ),VZ=["align"],jZ=X(VZ),AZ=(W)=>y(W),OZ=["align"],L=X(OZ),RZ=["align","color","noShade","size","width"],NZ=X(RZ),fZ=["version"],BZ=X(fZ),CZ=(W)=>y(W),KZ=["content","httpEquiv","name","scheme"],HZ=X(KZ),IZ=["align"],PZ=X(IZ),bZ=(W)=>y(W),YZ=["width"],yZ=X(YZ),wZ=(W)=>y(W),LZ=["media","type","disabled"],MZ=X(LZ),SZ=["text"],kZ=X(SZ),_Z=["compact","type"],TZ=X(_Z),gZ={A:T1,AREA:v1,AUDIO:u1,BASE:JZ,BLOCKQUOTE:$1,Q:$1,BODY:XZ,BR:ZZ,BUTTON:h1,CANVAS:y,CAPTION:vW,CITE:bW,COL:q1,COLGROUP:q1,DATA:p1,DETAILS:zZ,DIALOG:DZ,DIV:jZ,DL:QZ,EMBED:i1,FIELDSET:n1,FORM:o1,H1:L,H2:L,H3:L,H4:L,H5:L,H6:L,HEAD:AZ,HR:NZ,HTML:BZ,IFRAME:r1,IMG:t1,INPUT:WW,LABEL:$W,LI:qW,LINK:FW,MAP:GW,MENU:CZ,META:HZ,METER:UW,INS:Z1,DEL:Z1,OBJECT:OW,OL:jW,OPTGROUP:NW,OPTION:BW,OUTPUT:KW,P:PZ,PICTURE:bZ,PRE:yZ,PROGRESS:IW,SCRIPT:wW,SELECT:MW,SLOT:kW,SOURCE:TW,SPAN:wZ,STYLE:MZ,TABLE:hW,TBODY:p,THEAD:p,TFOOT:p,TD:J1,TH:J1,TEMPLATE:iW,TEXTAREA:nW,TIME:oW,TITLE:kZ,TR:pW,TRACK:rW,UL:TZ,VIDEO:eW};function g(W){let Z=W.tagName.toUpperCase(),$=gZ[Z];if($)return $(W);throw Error(`Unexpected HTML element tag: ${W.tagName} (update .web/custom/serialize.ts)`)}var vZ=(W)=>g(W.target),k=(W)=>W.relatedTarget?g(W.relatedTarget):null;function B(W,Z){return Y()(W,{target:vZ,...Z||{}})}var P=["target","bubbles","cancelable","defaultPrevented","eventPhase","isTrusted","timeStamp","type"],v=[...P,"detail"],x=[...v,"altKey","button","buttons","clientX","clientY","ctrlKey","metaKey","movementX","movementY","pageX","pageY","screenX","screenY","shiftKey"],xZ=[...x,"pointerId","pressure","tangentialPressure","tiltX","tiltY","twist","width","height","pointerType","isPrimary"],uZ=B(P),mZ=B(v),hZ=B(x,{relatedTarget:k}),EZ=B(P,{clipboardData:(W)=>F1(W.clipboardData)}),pZ=B([...P,"data"]),dZ=B(x,{relatedTarget:k,dataTransfer:(W)=>F1(W.dataTransfer)}),iZ=B(xZ,{relatedTarget:k}),cZ=B(P,{relatedTarget:k}),nZ=B(P),lZ=B(P),oZ=B(P),sZ=B([...v,"altKey","ctrlKey","code","key","locale","location","metaKey","repeat","shiftKey"]),rZ=B([...v,"altKey","ctrlKey","metaKey","shiftKey","changedTouches","targetTouches","touches"],{changedTouches:(W)=>d(W.changedTouches),targetTouches:(W)=>d(W.targetTouches),touches:(W)=>d(W.touches)}),aZ=B([...x,"deltaMode","deltaX","deltaY","deltaZ"],{relatedTarget:k}),tZ=B([...P,"animationName","elapsedTime","pseudoElement"]),eZ=B([...P,"oldState","newState"]),W0=B([...P,"elapsedTime","propertyName","pseudoElement"]);function d(W){return Array.from(W).map((Z)=>({target:g(Z.target),identifier:Z.identifier,screenX:Z.screenX,screenY:Z.screenY,clientX:Z.clientX,clientY:Z.clientY,pageX:Z.pageX,pageY:Z.pageY}))}function F1(W){if(!W)return null;let Z=[];if(W.items)for(let $=0;$<W.items.length;$++){let J=W.items[$];Z.push({kind:J.kind,type:J.type})}return{drop_effect:W.dropEffect,effect_allowed:W.effectAllowed,items:Z,types:Array.from(W.types||[])}}var C={};function H(W,Z,$){for(let J of Z)W[J]=$}H(C,["pointerdown","pointermove","pointerup","pointercancel","gotpointercapture","lostpointercapture","pointerenter","pointerleave","pointerover","pointerout"],iZ);H(C,["click","contextmenu","dblclick","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup"],hZ);H(C,["drag","dragend","dragenter","dragexit","dragleave","dragover","dragstart","drop"],dZ);H(C,["keydown","keypress","keyup"],sZ);H(C,["focus","blur"],cZ);H(C,["change","input"],oZ);H(C,["invalid"],lZ);H(C,["reset","submit"],nZ);H(C,["copy","cut","paste"],EZ);H(C,["compositionend","compositionstart","compositionupdate"],pZ);H(C,["touchcancel","touchend","touchmove","touchstart"],rZ);H(C,["scroll"],mZ);H(C,["wheel"],aZ);H(C,["animationstart","animationend","animationiteration"],tZ);H(C,["transitionend"],W0);H(C,["toggle"],eZ);function Q1(W){if(W&&typeof W==="object"&&"nativeEvent"in W&&typeof W.isDefaultPrevented==="function"){let Z=W;if(typeof Z.type!=="string")return W;let $=C[Z.type.toLowerCase()];if($)return $(Z);return uZ(Z)}return W}function _(W){let Z=new Map,$=[],J=[],q=[],G=[],U=0;function F(z){if(z==null||typeof z==="number"||typeof z==="string"||typeof z==="boolean")return z;let f=U++,V=Z.get(z);if(V!==void 0)return $.push(f),V;if(Z.set(z,f),z instanceof Date)return J.push(f),z.getTime();if(Array.isArray(z)){let j=z.length,Q=Array(j);for(let D=0;D<j;D++)Q[D]=F(z[D]);return Q}if(z instanceof Map){G.push(f);let j={};for(let[Q,D]of z.entries())j[String(Q)]=F(D);return j}if(z instanceof Set){q.push(f);let j=z.size,Q=Array(j),D=0;for(let A of z)Q[D]=F(A),D+=1;return Q}if(typeof z==="object"){let j={},Q=Object.keys(z);for(let D=0;D<Q.length;D++){let A=Q[D];j[A]=F(z[A])}return j}throw Error(`Unsupported value in serialization: ${z}`)}let O=F(W);return[[$,J,q,G],O]}function i(W,Z){let[[$,J,q,G],U]=W,F=new Set($),O=new Set(J),z=new Set(q),f=new Set(G),V=[];function j(Q){let D=V.length;if(F.has(D))return V.push(null),V[Q];if(O.has(D)){let A=new Date(Q);return V.push(A),A}if(Q==null||typeof Q==="number"||typeof Q==="string"||typeof Q==="boolean"){if(Z?.coerceNullsToUndefined)return Q??void 0;return Q}if(Array.isArray(Q)){if(z.has(D)){let R=new Set;V.push(R);for(let K=0;K<Q.length;K++)R.add(j(Q[K]));return R}let A=Q.length,N=Array(A);V.push(N);for(let R=0;R<A;R++)N[R]=j(Q[R]);return N}if(typeof Q==="object"){if(f.has(D)){let R=new Map;V.push(R);let K=Object.keys(Q);for(let w=0;w<K.length;w++){let I=K[w];R.set(I,j(Q[I]))}return R}let A={};V.push(A);let N=Object.keys(Q);for(let R=0;R<N.length;R++){let K=N[R];A[K]=j(Q[K])}return A}throw Error(`Unsupported value in deserialization: ${Q}`)}return j(U)}class c{#W;#Z=null;#J;#X=new Set;#$=new Map;#F=new Set;#q=new Map;#U;#D;#Q;constructor(W,Z,$){this.#U=W,this.#D=Z,this.#Q=$,this.#Z=null,this.#W=new Map,this.#J=[]}isConnected(){return this.#Z?.connected??!1}async connect(){if(this.#Z)return;return new Promise((W,Z)=>{let $=Z0(this.#U,{transports:["websocket","webtransport"],auth:{renderId:this.#D}});this.#Z=$,$.on("connect",()=>{console.log("[SocketIOTransport] Connected:",this.#Z?.id);for(let[J,q]of this.#W)$.emit("message",_({type:"mount",path:J,routeInfo:q.routeInfo}));for(let J of this.#J){if(J.type==="mount"&&this.#W.has(J.path))continue;if(J.type==="navigate")continue;$.emit("message",_(J))}this.#J=[],this.notifyConnectionListeners(!0),W()}),$.on("connect_error",(J)=>{console.error("[SocketIOTransport] Connection failed:",J),this.notifyConnectionListeners(!1),Z(J)}),$.on("disconnect",()=>{console.log("[SocketIOTransport] Disconnected"),this.#A(),this.notifyConnectionListeners(!1)}),$.on("message",(J)=>this.#j(i(J,{coerceNullsToUndefined:!0})))})}onConnectionChange(W){return this.#X.add(W),W(this.isConnected()),()=>{this.#X.delete(W)}}notifyConnectionListeners(W){for(let Z of this.#X)Z(W)}onServerError(W){this.#F.add(W);for(let[Z,$]of this.#$)W(Z,$);return()=>{this.#F.delete(W)}}notifyServerError(W,Z){for(let $ of this.#F)$(W,Z)}sendMessage(W){if(this.isConnected())this.#Z.emit("message",_(W));else this.#J.push(W)}mountView(W,Z){if(this.#W.has(W))throw Error(`Path ${W} is already mounted`);this.#W.set(W,Z),this.sendMessage({type:"mount",path:W,routeInfo:Z.routeInfo})}async navigate(W,Z){await this.sendMessage({type:"navigate",path:W,routeInfo:Z})}unmount(W){this.sendMessage({type:"unmount",path:W}),this.#W.delete(W)}disconnect(){this.#Z?.disconnect(),this.#Z=null,this.#J=[],this.#X.clear(),this.#W.clear(),this.#$.clear(),this.#F.clear();for(let{bridge:W}of this.#q.values())W.dispose(new b("Client disconnected"));this.#q.clear()}#j(W){switch(W.type){case"vdom_init":{let Z=this.#W.get(W.path);if(!Z)return;if(Z)Z.onInit(W.vdom,W.callbacks,W.render_props,W.css_refs);if(this.#$.has(W.path))this.#$.delete(W.path),this.notifyServerError(W.path,null);break}case"vdom_update":{let Z=this.#W.get(W.path);if(!Z)return;if(Z.onUpdate(W.ops),this.#$.has(W.path))this.#$.delete(W.path),this.notifyServerError(W.path,null);break}case"server_error":{if(!this.#W.has(W.path))return;this.#$.set(W.path,W.error),this.notifyServerError(W.path,W.error);break}case"api_call":{this.#G(W);break}case"navigate_to":{let Z=!!W.replace,$=W.path||"";if($.startsWith("//"))$=`${window.location.protocol}${$}`;if(/^[a-zA-Z][a-zA-Z0-9+.-]*:/.test($))if($.startsWith("http://")||$.startsWith("https://"))try{let q=new URL($);if(q.origin===window.location.origin){let G=`${q.pathname}${q.search}${q.hash}`;this.#Q(G,{replace:Z})}else if(Z)window.location.replace($);else window.location.assign($)}catch{if(Z)window.location.replace($);else window.location.assign($)}else if(Z)window.location.replace($);else window.location.assign($);else this.#Q($,{replace:Z});break}case"channel_message":{this.#V(W);break}default:console.error("Unexpected message:",W)}}async#G(W){try{let Z=await fetch(W.url,{method:W.method||"GET",headers:{...W.headers||{},...W.body!=null&&!("content-type"in(W.headers||{}))?{"content-type":"application/json"}:{}},body:W.body!=null?typeof W.body==="string"?W.body:JSON.stringify(W.body):void 0,credentials:W.credentials||"include"}),$={};Z.headers.forEach((U,F)=>{$[F]=U});let J=null;if((Z.headers.get("content-type")||"").includes("application/json"))J=await Z.json().catch(()=>null);else J=await Z.text().catch(()=>null);let G={type:"api_result",id:W.id,ok:Z.ok,status:Z.status,headers:$,body:J};this.sendMessage(G)}catch(Z){let $={type:"api_result",id:W.id,ok:!1,status:0,headers:{},body:{error:String(Z)}};this.sendMessage($)}}invokeCallback(W,Z,$){this.sendMessage({type:"callback",path:W,callback:Z,args:$.map(Q1)})}acquireChannel(W){let Z=this.#z(W);return Z.refCount+=1,Z.bridge}releaseChannel(W){let Z=this.#q.get(W);if(!Z)return;if(Z.refCount=Math.max(0,Z.refCount-1),Z.refCount===0)Z.bridge.dispose(new b("Channel released")),this.#q.delete(W)}#z(W){let Z=this.#q.get(W);if(!Z)Z={bridge:e(this,W),refCount:0},this.#q.set(W,Z);return Z}#V(W){let Z=this.#z(W.channel);if(Z.bridge.handleServerMessage(W)&&Z.refCount===0)this.#q.delete(W.channel)}#A(){for(let W of this.#q.values())W.bridge.handleDisconnect(new b("Connection lost"))}}import{cloneElement as T,createElement as n,Fragment as $0,isValidElement as J0,lazy as q0,Suspense as X0}from"react";var G1="$$fragment",z1="$$";function U1(W){return typeof W==="object"&&W!==null}function D1(W){return typeof W==="object"&&W!==null&&W.tag.startsWith("$$")&&W.tag!=="$$fragment"}import{jsx as V1}from"react/jsx-runtime";class l{#W;#Z;#J;#X;#$;#F;#q;#U;#D;constructor(W,Z,$,J,q=[],G=[],U=[]){this.#F=W,this.#q=Z,this.#U=$,this.#D=J,this.#W=new Set(q),this.#Z=new Map,this.#J=new Set(G),this.#X=new Set(U),this.#$=[...this.#W].sort()}hasCallbackPath(W){return this.#W.has(W)}hasRenderPropPath(W){return this.#J.has(W)}hasAnyCallbackUnder(W){if(W==="")return this.#$.length>0;let Z=this.#A(this.#$,W);return Z<this.#$.length&&this.#$[Z].startsWith(W)}applyCallbackDelta(W){if(W.remove)for(let Z of W.remove)this.#W.delete(Z),this.#Z.delete(Z);if(W.add)for(let Z of W.add)this.#W.add(Z);this.#$=[...this.#W].sort()}applyRenderPropsDelta(W){if(W.remove)for(let Z of W.remove)this.#J.delete(Z);if(W.add)for(let Z of W.add)this.#J.add(Z)}applyCssRefsDelta(W){if(W.remove)for(let Z of W.remove)this.#X.delete(Z);if(W.add)for(let Z of W.add)this.#X.add(Z)}getCallback(W,Z){let $=this.#Q(W,Z),J=this.#Z.get($);if(!J)J=(...q)=>this.#F.invokeCallback(this.#q,$,q),this.#Z.set($,J);return J}renderNode(W,Z=""){if(W==null||typeof W==="boolean"||typeof W==="number"||typeof W==="string")return W;if(U1(W)){let{tag:$,props:J={},children:q=[]}=W,G={};for(let[F,O]of Object.entries(J))G[F]=this.transformValue(Z,F,O);if(W.key)G.key=W.key;let U=[];for(let F=0;F<q.length;F+=1){let O=q[F],z=Z?`${Z}.${F}`:String(F);U.push(this.renderNode(O,z))}if(D1(W)){let F=W.tag.slice(z1.length),O=this.#U[F];if(!O)throw Error(`Could not find component ${F}. This is a Pulse internal error.`);return n(O,G,...U)}return n($===G1?$0:$,G,...U)}return null}#Q(W,Z){return W?`${W}.${Z}`:Z}transformValue(W,Z,$){let J=this.#Q(W,Z);if(this.#W.has(J))return this.getCallback(W,Z);if(this.#J.has(J))return this.renderNode($,J);if(this.#X.has(J))return this.#j($);return $}#j(W){let Z=W.indexOf(":");if(Z===-1)return W;let $=W.slice(0,Z),J=W.slice(Z+1);if(!$||!J)return W;let q=this.#D[$];if(!q)throw Error(`Received CSS reference for unknown module '${$}'`);let G=q[J];if(typeof G!=="string")throw Error(`Received CSS reference for missing class '${J}' in module '${$}'`);return G}init(W,Z,$,J){this.#W=new Set(Z);for(let q of Array.from(this.#Z.keys()))if(!this.#W.has(q))this.#Z.delete(q);return this.#$=[...this.#W].sort(),this.#J=new Set($),this.#X=new Set(J),this.renderNode(W)}#G(W){let Z=W.props?.children;if(Z==null)return[];return Array.isArray(Z)?Z.slice():[Z]}applyUpdates(W,Z){let $=W;for(let J of Z){if(J.type==="update_callbacks"){this.applyCallbackDelta(J.data);continue}if(J.type==="update_css_refs"){this.applyCssRefsDelta(J.data);continue}if(J.type==="update_render_props"){this.applyRenderPropsDelta(J.data);continue}let q=J.path.split(".").filter((U)=>U.length>0),G=(U,F,O)=>{if(F<q.length){this.#z(U,q,F);let z=U,f=q[F],V=+f,j=O?`${O}.${f}`:f;if(!Number.isNaN(V)){let Q=this.#G(z),D=Q[V];return Q[V]=G(D,F+1,j),T(z,void 0,...Q)}else{let Q=z.props??{},D=Q[f],A={...Q,[f]:G(D,F+1,j)};return T(z,A)}}switch(J.type){case"replace":return this.renderNode(J.data,J.path);case"update_props":{this.#z(U,q,F);let z=U,V={...z.props??{}},j=J.data;if(j.remove&&j.remove.length>0){for(let D of j.remove)if(D in V)delete V[D]}if(j.set)for(let[D,A]of Object.entries(j.set))V[D]=this.transformValue(O,D,A);if((j.remove?.length??0)>0)return V.key=z.key,V.ref=z.ref,n(z.type,V,...this.#G(z));else return T(z,V)}case"reconciliation":{this.#z(U,q,F);let z=U,f=this.#G(z),V=[],[j,Q]=J.new,[D,A]=J.reuse,N=-1,R=-1,K=-1,w=-1;if(j.length>0)N=j[0],K=0;if(D.length>0)R=D[0],w=0;for(let I=0;I<J.N;++I)if(I===N){let E=Q[K],S=O?`${O}.${I}`:String(I);V.push(this.renderNode(E,S)),N=K<j.length-1?j[++K]:-1}else if(I===R){let E=A[w],S=f[E],a=O?`${O}.${I}`:String(I);if(this.hasAnyCallbackUnder(a))S=this.#V(S,a);V.push(S),R=w<D.length-1?D[++w]:-1}else V.push(f[I]);return T(z,null,...V)}default:throw Error(`[Pulse renderer] Unknown update type: ${J?.type}`)}};$=G($,0,"")}return $}#z(W,Z,$){return!0}#V(W,Z){if(!J0(W))return W;let $=W,J=$.props??{},q={...J};for(let U of Object.keys(J)){let F=Z?`${Z}.${U}`:U;if(this.hasCallbackPath(F))q[U]=this.getCallback(Z,U);if(this.hasRenderPropPath(F)&&this.hasAnyCallbackUnder(F))q[U]=this.#V(J[U],F)}let G=this.#G($).map((U,F)=>{let O=Z?`${Z}.${F}`:String(F);if(this.hasAnyCallbackUnder(O))return this.#V(U,O);else return U});return T($,q,...G)}#A(W,Z){let $=0,J=W.length;while($<J){let q=$+J>>>1;if(W[q]<Z)$=q+1;else J=q}return $}}function F0(W,Z){let $=q0(W);return({children:J,...q})=>{return V1(X0,{fallback:Z,children:V1($,{...q,children:J})})}}import{jsx as M,jsxs as u}from"react/jsx-runtime";var O1=j1(null),R1=j1(null),h=()=>{let W=A1(O1);if(!W)throw Error("usePulseClient must be used within a PulseProvider");return W},U0=(W)=>{let Z=A1(R1);if(!Z)throw Error("usePulsePrerender must be used within a PulseProvider");let $=Z.views[W];if(!$)throw Error(`No prerender found for '${W}'`);return $},r=typeof window<"u";function D0({children:W,config:Z,prerender:$}){let[J,q]=s(!0),G=G0(),{renderId:U}=$,F=o(()=>new c(Z.serverAddress,U,G),[Z.serverAddress,G,U]);return m(()=>F.onConnectionChange(q),[F]),m(()=>{if(r)return F.connect(),()=>F.disconnect()},[F]),M(O1.Provider,{value:F,children:u(R1.Provider,{value:$,children:[!J&&M("div",{style:{position:"fixed",bottom:"20px",right:"20px",backgroundColor:"red",color:"white",padding:"10px",borderRadius:"5px",zIndex:1000},children:"Failed to connect to the server."}),W]})})}function V0({externalComponents:W,path:Z,cssModules:$}){let J=h(),q=U0(Z),G=q.vdom,U=o(()=>new l(J,Z,W,$,q.callbacks,q.render_props,q.css_refs),[J,Z,W,$,q]),[F,O]=s(()=>U.init(G,q.callbacks,q.render_props,q.css_refs)),[z,f]=s(null),V=Q0(),j=z0(),Q=o(()=>{let{"*":D="",...A}=j,N=new URLSearchParams(V.search);return{hash:V.hash,pathname:V.pathname,query:V.search,queryParams:Object.fromEntries(N.entries()),pathParams:A,catchall:D.length>0?D.split("/"):[]}},[V.hash,V.pathname,V.search,JSON.stringify(j)]);if(m(()=>{if(r){J.mountView(Z,{routeInfo:Q,onInit:(A,N,R,K)=>{O(U.init(A,N,R,K))},onUpdate:(A)=>{O((N)=>N==null?N:U.applyUpdates(N,A))}});let D=J.onServerError((A,N)=>{if(A===Z)f(N)});return()=>{D(),J.unmount(Z)}}},[J,U,Z,Q]),m(()=>{if(r)J.navigate(Z,Q)},[J,Z,Q]),z)return M(j0,{error:z});return F}function j0({error:W}){return u("div",{style:{padding:16,border:"1px solid #e00",background:"#fff5f5",color:"#900",fontFamily:'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace',whiteSpace:"pre-wrap"},children:[u("div",{style:{fontWeight:700,marginBottom:8},children:["Server Error during ",W.phase]}),W.message&&M("div",{children:W.message}),W.stack&&u("details",{open:!0,style:{marginTop:8},children:[M("summary",{children:"Stack trace"}),M("pre",{style:{margin:0},children:W.stack})]})]})}import{useEffect as A0,useMemo as O0}from"react";function R0(W){let Z=h(),$=O0(()=>{if(!W)throw Error("usePulseChannel requires a non-empty channelId");return Z.acquireChannel(W)},[Z,W]);return A0(()=>{return()=>{Z.releaseChannel(W)}},[Z,W]),$}export{h as usePulseClient,R0 as usePulseChannel,W1 as submitForm,_ as serialize,b1 as extractServerRouteInfo,i as deserialize,F0 as RenderLazy,V0 as PulseView,D0 as PulseProvider,I1 as PulseForm,b as PulseChannelResetError};
3
-
4
- //# debugId=897211C88EF55DB464756E2164756E21
5
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2NoYW5uZWwudHMiLCAiLi4vc3JjL2Zvcm0udHN4IiwgIi4uL3NyYy9oZWxwZXJzLnRzIiwgIi4uL3NyYy9wdWxzZS50c3giLCAiLi4vc3JjL2NsaWVudC50c3giLCAiLi4vc3JjL3NlcmlhbGl6ZS9leHRyYWN0b3IudHMiLCAiLi4vc3JjL3NlcmlhbGl6ZS9lbGVtZW50cy50cyIsICIuLi9zcmMvc2VyaWFsaXplL2V2ZW50cy50cyIsICIuLi9zcmMvc2VyaWFsaXplL3NlcmlhbGl6ZXIudHMiLCAiLi4vc3JjL3JlbmRlcmVyLnRzeCIsICIuLi9zcmMvdmRvbS50cyIsICIuLi9zcmMvdXNlUHVsc2VDaGFubmVsLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgImltcG9ydCB0eXBlIHsgUHVsc2VTb2NrZXRJT0NsaWVudCB9IGZyb20gXCIuL2NsaWVudFwiO1xuaW1wb3J0IHR5cGUge1xuXHRTZXJ2ZXJDaGFubmVsTWVzc2FnZSxcblx0U2VydmVyQ2hhbm5lbFJlcXVlc3RNZXNzYWdlLFxuXHRTZXJ2ZXJDaGFubmVsUmVzcG9uc2VNZXNzYWdlLFxufSBmcm9tIFwiLi9tZXNzYWdlc1wiO1xuXG5leHBvcnQgY2xhc3MgUHVsc2VDaGFubmVsUmVzZXRFcnJvciBleHRlbmRzIEVycm9yIHtcblx0Y29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG5cdFx0c3VwZXIobWVzc2FnZSk7XG5cdFx0dGhpcy5uYW1lID0gXCJQdWxzZUNoYW5uZWxSZXNldEVycm9yXCI7XG5cdH1cbn1cblxuZXhwb3J0IHR5cGUgQ2hhbm5lbEV2ZW50SGFuZGxlciA9IChwYXlsb2FkOiBhbnkpID0+IGFueSB8IFByb21pc2U8YW55PjtcblxuaW50ZXJmYWNlIFBlbmRpbmdSZXF1ZXN0IHtcblx0cmVzb2x2ZTogKHZhbHVlOiBhbnkpID0+IHZvaWQ7XG5cdHJlamVjdDogKGVycm9yOiBhbnkpID0+IHZvaWQ7XG59XG5cbmZ1bmN0aW9uIHJhbmRvbUlkKCk6IHN0cmluZyB7XG5cdGlmICh0eXBlb2YgY3J5cHRvICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiBjcnlwdG8ucmFuZG9tVVVJRCA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0cmV0dXJuIGNyeXB0by5yYW5kb21VVUlEKCkucmVwbGFjZSgvLS9nLCBcIlwiKTtcblx0fVxuXHRyZXR1cm4gTWF0aC5yYW5kb20oKS50b1N0cmluZygxNikuc2xpY2UoMikgKyBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDE2KS5zbGljZSgyKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0RXJyb3IoZXJyb3I6IHVua25vd24pOiBzdHJpbmcge1xuXHRpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikgcmV0dXJuIGVycm9yLm1lc3NhZ2U7XG5cdGlmICh0eXBlb2YgZXJyb3IgPT09IFwic3RyaW5nXCIpIHJldHVybiBlcnJvcjtcblx0dHJ5IHtcblx0XHRyZXR1cm4gSlNPTi5zdHJpbmdpZnkoZXJyb3IpO1xuXHR9IGNhdGNoIHtcblx0XHRyZXR1cm4gU3RyaW5nKGVycm9yKTtcblx0fVxufVxuXG5mdW5jdGlvbiBpc1NlcnZlclJlc3BvbnNlTWVzc2FnZShcblx0bWVzc2FnZTogU2VydmVyQ2hhbm5lbE1lc3NhZ2UsXG4pOiBtZXNzYWdlIGlzIFNlcnZlckNoYW5uZWxSZXNwb25zZU1lc3NhZ2Uge1xuXHRyZXR1cm4gdHlwZW9mIChtZXNzYWdlIGFzIFNlcnZlckNoYW5uZWxSZXNwb25zZU1lc3NhZ2UpLnJlc3BvbnNlVG8gPT09IFwic3RyaW5nXCI7XG59XG5cbmZ1bmN0aW9uIGlzU2VydmVyUmVxdWVzdE1lc3NhZ2UoXG5cdG1lc3NhZ2U6IFNlcnZlckNoYW5uZWxNZXNzYWdlLFxuKTogbWVzc2FnZSBpcyBTZXJ2ZXJDaGFubmVsUmVxdWVzdE1lc3NhZ2Uge1xuXHRyZXR1cm4gdHlwZW9mIChtZXNzYWdlIGFzIFNlcnZlckNoYW5uZWxSZXF1ZXN0TWVzc2FnZSkuZXZlbnQgPT09IFwic3RyaW5nXCI7XG59XG5cbmV4cG9ydCBjbGFzcyBDaGFubmVsQnJpZGdlIHtcblx0cHJpdmF0ZSBoYW5kbGVycyA9IG5ldyBNYXA8c3RyaW5nLCBTZXQ8Q2hhbm5lbEV2ZW50SGFuZGxlcj4+KCk7XG5cdHByaXZhdGUgcGVuZGluZyA9IG5ldyBNYXA8c3RyaW5nLCBQZW5kaW5nUmVxdWVzdD4oKTtcblx0cHJpdmF0ZSBiYWNrbG9nOiBTZXJ2ZXJDaGFubmVsUmVxdWVzdE1lc3NhZ2VbXSA9IFtdO1xuXHRwcml2YXRlIGNsb3NlZCA9IGZhbHNlO1xuXG5cdGNvbnN0cnVjdG9yKFxuXHRcdHByaXZhdGUgY2xpZW50OiBQdWxzZVNvY2tldElPQ2xpZW50LFxuXHRcdHB1YmxpYyByZWFkb25seSBpZDogc3RyaW5nLFxuXHQpIHt9XG5cblx0ZW1pdChldmVudDogc3RyaW5nLCBwYXlsb2FkPzogYW55KTogdm9pZCB7XG5cdFx0dGhpcy5lbnN1cmVPcGVuKCk7XG5cdFx0dGhpcy5jbGllbnQuc2VuZE1lc3NhZ2Uoe1xuXHRcdFx0dHlwZTogXCJjaGFubmVsX21lc3NhZ2VcIixcblx0XHRcdGNoYW5uZWw6IHRoaXMuaWQsXG5cdFx0XHRldmVudCxcblx0XHRcdHBheWxvYWQsXG5cdFx0fSk7XG5cdH1cblxuXHRyZXF1ZXN0KGV2ZW50OiBzdHJpbmcsIHBheWxvYWQ/OiBhbnkpOiBQcm9taXNlPGFueT4ge1xuXHRcdHRoaXMuZW5zdXJlT3BlbigpO1xuXHRcdGNvbnN0IHJlcXVlc3RJZCA9IHJhbmRvbUlkKCk7XG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdHRoaXMucGVuZGluZy5zZXQocmVxdWVzdElkLCB7IHJlc29sdmUsIHJlamVjdCB9KTtcblx0XHRcdHRoaXMuY2xpZW50LnNlbmRNZXNzYWdlKHtcblx0XHRcdFx0dHlwZTogXCJjaGFubmVsX21lc3NhZ2VcIixcblx0XHRcdFx0Y2hhbm5lbDogdGhpcy5pZCxcblx0XHRcdFx0ZXZlbnQsXG5cdFx0XHRcdHBheWxvYWQsXG5cdFx0XHRcdHJlcXVlc3RJZCxcblx0XHRcdH0pO1xuXHRcdH0pO1xuXHR9XG5cblx0b24oZXZlbnQ6IHN0cmluZywgaGFuZGxlcjogQ2hhbm5lbEV2ZW50SGFuZGxlcik6ICgpID0+IHZvaWQge1xuXHRcdHRoaXMuZW5zdXJlT3BlbigpO1xuXHRcdGxldCBidWNrZXQgPSB0aGlzLmhhbmRsZXJzLmdldChldmVudCk7XG5cdFx0aWYgKCFidWNrZXQpIHtcblx0XHRcdGJ1Y2tldCA9IG5ldyBTZXQoKTtcblx0XHRcdHRoaXMuaGFuZGxlcnMuc2V0KGV2ZW50LCBidWNrZXQpO1xuXHRcdH1cblx0XHRidWNrZXQuYWRkKGhhbmRsZXIpO1xuXHRcdHRoaXMuZmx1c2hCYWNrbG9nKGV2ZW50KTtcblx0XHRyZXR1cm4gKCkgPT4ge1xuXHRcdFx0Y29uc3Qgc2V0ID0gdGhpcy5oYW5kbGVycy5nZXQoZXZlbnQpO1xuXHRcdFx0aWYgKCFzZXQpIHJldHVybjtcblx0XHRcdHNldC5kZWxldGUoaGFuZGxlcik7XG5cdFx0XHRpZiAoc2V0LnNpemUgPT09IDApIHtcblx0XHRcdFx0dGhpcy5oYW5kbGVycy5kZWxldGUoZXZlbnQpO1xuXHRcdFx0fVxuXHRcdH07XG5cdH1cblxuXHRoYW5kbGVTZXJ2ZXJNZXNzYWdlKG1lc3NhZ2U6IFNlcnZlckNoYW5uZWxNZXNzYWdlKTogYm9vbGVhbiB7XG5cdFx0aWYgKGlzU2VydmVyUmVzcG9uc2VNZXNzYWdlKG1lc3NhZ2UpKSB7XG5cdFx0XHR0aGlzLnJlc29sdmVQZW5kaW5nKG1lc3NhZ2UpO1xuXHRcdFx0cmV0dXJuIHRoaXMuY2xvc2VkO1xuXHRcdH1cblx0XHRpZiAodGhpcy5jbG9zZWQpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0XHRpZiAoIWlzU2VydmVyUmVxdWVzdE1lc3NhZ2UobWVzc2FnZSkpIHtcblx0XHRcdHJldHVybiB0aGlzLmNsb3NlZDtcblx0XHR9XG5cblx0XHRpZiAobWVzc2FnZS5ldmVudCA9PT0gXCJfX2Nsb3NlX19cIikge1xuXHRcdFx0dGhpcy5jbG9zZShuZXcgUHVsc2VDaGFubmVsUmVzZXRFcnJvcihcIkNoYW5uZWwgY2xvc2VkIGJ5IHNlcnZlclwiKSk7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0aWYgKG1lc3NhZ2UucmVxdWVzdElkKSB7XG5cdFx0XHR2b2lkIHRoaXMuZGlzcGF0Y2hSZXF1ZXN0KFxuXHRcdFx0XHRtZXNzYWdlIGFzIFNlcnZlckNoYW5uZWxSZXF1ZXN0TWVzc2FnZSAmIHtcblx0XHRcdFx0XHRyZXF1ZXN0SWQ6IHN0cmluZztcblx0XHRcdFx0fSxcblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuZGlzcGF0Y2hFdmVudChtZXNzYWdlKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuY2xvc2VkO1xuXHR9XG5cblx0aGFuZGxlRGlzY29ubmVjdChyZWFzb246IFB1bHNlQ2hhbm5lbFJlc2V0RXJyb3IpOiB2b2lkIHtcblx0XHR0aGlzLmNsb3NlKHJlYXNvbik7XG5cdH1cblxuXHRkaXNwb3NlKHJlYXNvbjogUHVsc2VDaGFubmVsUmVzZXRFcnJvcik6IHZvaWQge1xuXHRcdHRoaXMuY2xvc2UocmVhc29uKTtcblx0fVxuXG5cdHByaXZhdGUgZW5zdXJlT3BlbigpOiB2b2lkIHtcblx0XHRpZiAodGhpcy5jbG9zZWQpIHtcblx0XHRcdHRocm93IG5ldyBQdWxzZUNoYW5uZWxSZXNldEVycm9yKFwiQ2hhbm5lbCBpcyBjbG9zZWRcIik7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBmbHVzaEJhY2tsb2coZXZlbnQ6IHN0cmluZyk6IHZvaWQge1xuXHRcdGlmICh0aGlzLmJhY2tsb2cubGVuZ3RoID09PSAwKSByZXR1cm47XG5cdFx0Y29uc3QgcmVtYWluaW5nOiBTZXJ2ZXJDaGFubmVsUmVxdWVzdE1lc3NhZ2VbXSA9IFtdO1xuXHRcdGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLmJhY2tsb2cpIHtcblx0XHRcdGlmIChpdGVtLmV2ZW50ID09PSBldmVudCkge1xuXHRcdFx0XHR0aGlzLmRpc3BhdGNoRXZlbnQoaXRlbSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZW1haW5pbmcucHVzaChpdGVtKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0dGhpcy5iYWNrbG9nID0gcmVtYWluaW5nO1xuXHR9XG5cblx0cHJpdmF0ZSBkaXNwYXRjaEV2ZW50KG1lc3NhZ2U6IFNlcnZlckNoYW5uZWxSZXF1ZXN0TWVzc2FnZSk6IHZvaWQge1xuXHRcdGNvbnN0IGhhbmRsZXJzID0gdGhpcy5oYW5kbGVycy5nZXQobWVzc2FnZS5ldmVudCk7XG5cdFx0aWYgKCFoYW5kbGVycyB8fCBoYW5kbGVycy5zaXplID09PSAwKSB7XG5cdFx0XHR0aGlzLmJhY2tsb2cucHVzaChtZXNzYWdlKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Zm9yIChjb25zdCBoYW5kbGVyIG9mIGhhbmRsZXJzKSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb25zdCByZXN1bHQgPSBoYW5kbGVyKG1lc3NhZ2UucGF5bG9hZCk7XG5cdFx0XHRcdGlmIChyZXN1bHQgJiYgdHlwZW9mIChyZXN1bHQgYXMgUHJvbWlzZTxhbnk+KS50aGVuID09PSBcImZ1bmN0aW9uXCIpIHtcblx0XHRcdFx0XHR2b2lkIChyZXN1bHQgYXMgUHJvbWlzZTxhbnk+KS5jYXRjaCgoZXJyKSA9PiB7XG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKFwiUHVsc2UgY2hhbm5lbCBoYW5kbGVyIGVycm9yXCIsIGVycik7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0XHRjb25zb2xlLmVycm9yKFwiUHVsc2UgY2hhbm5lbCBoYW5kbGVyIGVycm9yXCIsIGVycik7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBhc3luYyBkaXNwYXRjaFJlcXVlc3QoXG5cdFx0bWVzc2FnZTogU2VydmVyQ2hhbm5lbFJlcXVlc3RNZXNzYWdlICYgeyByZXF1ZXN0SWQ6IHN0cmluZyB9LFxuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBoYW5kbGVycyA9IHRoaXMuaGFuZGxlcnMuZ2V0KG1lc3NhZ2UuZXZlbnQpO1xuXHRcdGxldCByZXNwb25zZTogYW55O1xuXHRcdGxldCBlcnJvcjogYW55O1xuXHRcdGlmIChoYW5kbGVycyAmJiBoYW5kbGVycy5zaXplID4gMCkge1xuXHRcdFx0Zm9yIChjb25zdCBoYW5kbGVyIG9mIGhhbmRsZXJzKSB7XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0Y29uc3QgcmVzdWx0ID0gaGFuZGxlcihtZXNzYWdlLnBheWxvYWQpO1xuXHRcdFx0XHRcdHJlc3BvbnNlID0gYXdhaXQgUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCk7XG5cdFx0XHRcdFx0aWYgKHJlc3BvbnNlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHRcdFx0ZXJyb3IgPSBlcnI7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKGVycm9yKSB7XG5cdFx0XHR0aGlzLmNsaWVudC5zZW5kTWVzc2FnZSh7XG5cdFx0XHRcdHR5cGU6IFwiY2hhbm5lbF9tZXNzYWdlXCIsXG5cdFx0XHRcdGNoYW5uZWw6IHRoaXMuaWQsXG5cdFx0XHRcdGV2ZW50OiB1bmRlZmluZWQsXG5cdFx0XHRcdHJlc3BvbnNlVG86IG1lc3NhZ2UucmVxdWVzdElkLFxuXHRcdFx0XHRlcnJvcjogZm9ybWF0RXJyb3IoZXJyb3IpLFxuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdHRoaXMuY2xpZW50LnNlbmRNZXNzYWdlKHtcblx0XHRcdHR5cGU6IFwiY2hhbm5lbF9tZXNzYWdlXCIsXG5cdFx0XHRjaGFubmVsOiB0aGlzLmlkLFxuXHRcdFx0ZXZlbnQ6IHVuZGVmaW5lZCxcblx0XHRcdHJlc3BvbnNlVG86IG1lc3NhZ2UucmVxdWVzdElkLFxuXHRcdFx0cGF5bG9hZDogcmVzcG9uc2UsXG5cdFx0fSk7XG5cdH1cblxuXHRwcml2YXRlIHJlc29sdmVQZW5kaW5nKG1lc3NhZ2U6IFNlcnZlckNoYW5uZWxSZXNwb25zZU1lc3NhZ2UpOiB2b2lkIHtcblx0XHRjb25zdCBlbnRyeSA9IG1lc3NhZ2UucmVzcG9uc2VUbyA/IHRoaXMucGVuZGluZy5nZXQobWVzc2FnZS5yZXNwb25zZVRvKSA6IHVuZGVmaW5lZDtcblx0XHRpZiAoIWVudHJ5KSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdHRoaXMucGVuZGluZy5kZWxldGUobWVzc2FnZS5yZXNwb25zZVRvISk7XG5cdFx0aWYgKG1lc3NhZ2UuZXJyb3IgIT09IHVuZGVmaW5lZCAmJiBtZXNzYWdlLmVycm9yICE9PSBudWxsKSB7XG5cdFx0XHRlbnRyeS5yZWplY3QobmV3IFB1bHNlQ2hhbm5lbFJlc2V0RXJyb3IoU3RyaW5nKG1lc3NhZ2UuZXJyb3IpKSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGVudHJ5LnJlc29sdmUobWVzc2FnZS5wYXlsb2FkKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGNsb3NlKHJlYXNvbjogUHVsc2VDaGFubmVsUmVzZXRFcnJvcik6IHZvaWQge1xuXHRcdGlmICh0aGlzLmNsb3NlZCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHR0aGlzLmNsb3NlZCA9IHRydWU7XG5cdFx0Zm9yIChjb25zdCByZXF1ZXN0IG9mIHRoaXMucGVuZGluZy52YWx1ZXMoKSkge1xuXHRcdFx0cmVxdWVzdC5yZWplY3QocmVhc29uKTtcblx0XHR9XG5cdFx0dGhpcy5wZW5kaW5nLmNsZWFyKCk7XG5cdFx0dGhpcy5oYW5kbGVycy5jbGVhcigpO1xuXHRcdHRoaXMuYmFja2xvZyA9IFtdO1xuXHRcdC8vIE5vLW9wOiBvd25pbmcgY2xpZW50IG1hbmFnZXMgcmVnaXN0cnkgbGlmZWN5Y2xlLlxuXHR9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDaGFubmVsQnJpZGdlKGNsaWVudDogUHVsc2VTb2NrZXRJT0NsaWVudCwgaWQ6IHN0cmluZyk6IENoYW5uZWxCcmlkZ2Uge1xuXHRyZXR1cm4gbmV3IENoYW5uZWxCcmlkZ2UoY2xpZW50LCBpZCk7XG59XG4iLAogICAgImltcG9ydCBSZWFjdCwgeyB0eXBlIEZvcm1FdmVudCwgZm9yd2FyZFJlZiwgdXNlQ2FsbGJhY2sgfSBmcm9tIFwicmVhY3RcIjtcblxuZXhwb3J0IHR5cGUgUHVsc2VGb3JtUHJvcHMgPSBSZWFjdC5Db21wb25lbnRQcm9wc1dpdGhvdXRSZWY8XCJmb3JtXCI+ICYge1xuXHRhY3Rpb246IHN0cmluZztcbn07XG5cbi8qKlxuICogUHVsc2VGb3JtIGludGVyY2VwdHMgbmF0aXZlIGZvcm0gc3VibWlzc2lvbnMgYW5kIHNlbmRzIHRoZW0gdGhyb3VnaCBmZXRjaCBzbyB0aGVcbiAqIHN1cnJvdW5kaW5nIFB1bHNlIHZpZXcgc3RheXMgbW91bnRlZC4gU2VydmVyLXNpZGUgaGFuZGxlcnMgYXJlIHN0aWxsIGludm9rZWQgdmlhXG4gKiB0aGUgZm9ybSBhY3Rpb24gZW5kcG9pbnQgYW5kIHJlYWN0aXZlIHVwZGF0ZXMgcHJvcGFnYXRlIG92ZXIgdGhlIHNvY2tldC5cbiAqL1xuZXhwb3J0IGNvbnN0IFB1bHNlRm9ybSA9IGZvcndhcmRSZWY8SFRNTEZvcm1FbGVtZW50LCBQdWxzZUZvcm1Qcm9wcz4oZnVuY3Rpb24gUHVsc2VGb3JtKFxuXHR7IG9uU3VibWl0LCBhY3Rpb24sIC4uLnJlc3QgfSxcblx0cmVmLFxuKSB7XG5cdHJldHVybiAoXG5cdFx0PGZvcm1cblx0XHRcdHsuLi5yZXN0fVxuXHRcdFx0YWN0aW9uPXthY3Rpb259XG5cdFx0XHRyZWY9e3JlZn1cblx0XHRcdG9uU3VibWl0PXt1c2VDYWxsYmFjayhcblx0XHRcdFx0KGV2ZW50OiBGb3JtRXZlbnQ8SFRNTEZvcm1FbGVtZW50PikgPT4gc3VibWl0Rm9ybSh7IGV2ZW50LCBhY3Rpb24sIG9uU3VibWl0IH0pLFxuXHRcdFx0XHRbYWN0aW9uLCBvblN1Ym1pdF0sXG5cdFx0XHQpfVxuXHRcdC8+XG5cdCk7XG59KTtcblxuaW50ZXJmYWNlIFN1Ym1pdEZvcm0ge1xuXHRldmVudDogUmVhY3QuRm9ybUV2ZW50PEhUTUxGb3JtRWxlbWVudD47XG5cdGFjdGlvbjogc3RyaW5nO1xuXHRvblN1Ym1pdD86IFB1bHNlRm9ybVByb3BzW1wib25TdWJtaXRcIl07XG5cdGZvcm1EYXRhPzogRm9ybURhdGE7XG5cdGZvcmNlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN1Ym1pdEZvcm0oeyBldmVudCwgYWN0aW9uLCBvblN1Ym1pdCwgZm9ybURhdGEsIGZvcmNlIH06IFN1Ym1pdEZvcm0pIHtcblx0b25TdWJtaXQ/LihldmVudCk7XG5cdGlmICghZm9yY2UgJiYgZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuXHRcdHJldHVybjtcblx0fVxuXHRjb25zdCBmb3JtID0gZXZlbnQuY3VycmVudFRhcmdldDtcblx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0Y29uc3QgbmF0aXZlRXZlbnQgPSBldmVudC5uYXRpdmVFdmVudCBhcyBTdWJtaXRFdmVudDtcblx0aWYgKCFmb3JtRGF0YSkge1xuXHRcdGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKGZvcm0sIG5hdGl2ZUV2ZW50LnN1Ym1pdHRlcik7XG5cdH1cblx0Y29uc3QgdXJsID0gbmV3IFVSTChhY3Rpb24sIHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtcblx0dHJ5IHtcblx0XHRhd2FpdCBmZXRjaCh1cmwsIHtcblx0XHRcdG1ldGhvZDogXCJQT1NUXCIsXG5cdFx0XHQvLyBSZXF1aXJlZCBmb3Igb3VyIGhvc3Rpbmcgc2NlbmFyaW9zIG9mIHNhbWUgaG9zdCArIGRpZmZlcmVudCBwb3J0cyBvciAyIHN1YmRvbWFpbnNcblx0XHRcdGNyZWRlbnRpYWxzOiBcImluY2x1ZGVcIixcblx0XHRcdGJvZHk6IGZvcm1EYXRhLFxuXHRcdH0pO1xuXHR9IGNhdGNoIChlcnIpIHtcblx0XHRpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG5cdFx0XHRjb25zb2xlLmVycm9yKFwiW1B1bHNlXSBGb3JtIHN1Ym1pc3Npb24gZmFpbGVkXCIsIGVycik7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRocm93IGVycjtcblx0XHR9XG5cdH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBMb2FkZXJGdW5jdGlvbkFyZ3MgfSBmcm9tIFwicmVhY3Qtcm91dGVyXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUm91dGVJbmZvIHtcblx0cGF0aG5hbWU6IHN0cmluZztcblx0aGFzaDogc3RyaW5nO1xuXHRxdWVyeTogc3RyaW5nO1xuXHRxdWVyeVBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcblx0cGF0aFBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPjtcblx0Y2F0Y2hhbGw6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFNlcnZlclJvdXRlSW5mbyh7IHBhcmFtcywgcmVxdWVzdCB9OiBMb2FkZXJGdW5jdGlvbkFyZ3MpIHtcblx0Y29uc3QgeyBcIipcIjogY2F0Y2hhbGwgPSBcIlwiLCAuLi5wYXRoUGFyYW1zIH0gPSBwYXJhbXM7XG5cdGNvbnN0IHBhcnNlZFVybCA9IG5ldyBVUkwocmVxdWVzdC51cmwpO1xuXG5cdHJldHVybiB7XG5cdFx0aGFzaDogcGFyc2VkVXJsLmhhc2gsXG5cdFx0cGF0aG5hbWU6IHBhcnNlZFVybC5wYXRobmFtZSxcblx0XHRxdWVyeTogcGFyc2VkVXJsLnNlYXJjaCxcblx0XHRxdWVyeVBhcmFtczogT2JqZWN0LmZyb21FbnRyaWVzKHBhcnNlZFVybC5zZWFyY2hQYXJhbXMuZW50cmllcygpKSxcblx0XHRwYXRoUGFyYW1zLFxuXHRcdGNhdGNoYWxsOiBjYXRjaGFsbC5sZW5ndGggPiAxID8gY2F0Y2hhbGwuc3BsaXQoXCIvXCIpIDogW10sXG5cdH0gc2F0aXNmaWVzIFJvdXRlSW5mbztcbn1cbiIsCiAgICAiaW1wb3J0IHsgY3JlYXRlQ29udGV4dCwgdHlwZSBSZWFjdE5vZGUsIHVzZUNvbnRleHQsIHVzZUVmZmVjdCwgdXNlTWVtbywgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IHVzZUxvY2F0aW9uLCB1c2VOYXZpZ2F0ZSwgdXNlUGFyYW1zIH0gZnJvbSBcInJlYWN0LXJvdXRlclwiO1xuaW1wb3J0IHsgUHVsc2VTb2NrZXRJT0NsaWVudCB9IGZyb20gXCIuL2NsaWVudFwiO1xuaW1wb3J0IHR5cGUgeyBSb3V0ZUluZm8gfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5pbXBvcnQgdHlwZSB7IFNlcnZlckVycm9ySW5mbyB9IGZyb20gXCIuL21lc3NhZ2VzXCI7XG5pbXBvcnQgeyBWRE9NUmVuZGVyZXIgfSBmcm9tIFwiLi9yZW5kZXJlclwiO1xuaW1wb3J0IHR5cGUgeyBDb21wb25lbnRSZWdpc3RyeSwgVkRPTSB9IGZyb20gXCIuL3Zkb21cIjtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFR5cGVzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgaW50ZXJmYWNlIFB1bHNlQ29uZmlnIHtcblx0c2VydmVyQWRkcmVzczogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBQdWxzZVByZXJlbmRlclZpZXcgPSB7XG5cdHZkb206IFZET007XG5cdGNhbGxiYWNrczogc3RyaW5nW107XG5cdHJlbmRlcl9wcm9wczogc3RyaW5nW107XG5cdGNzc19yZWZzOiBzdHJpbmdbXTtcbn07XG5cbmV4cG9ydCB0eXBlIFB1bHNlUHJlcmVuZGVyID0ge1xuXHRyZW5kZXJJZDogc3RyaW5nO1xuXHR2aWV3czogUmVjb3JkPHN0cmluZywgUHVsc2VQcmVyZW5kZXJWaWV3Pjtcbn07XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQ29udGV4dCBhbmQgSG9va3Ncbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8vIENvbnRleHQgZm9yIHRoZSBjbGllbnQsIHByb3ZpZGVkIGJ5IFB1bHNlUHJvdmlkZXJcbmNvbnN0IFB1bHNlQ2xpZW50Q29udGV4dCA9IGNyZWF0ZUNvbnRleHQ8UHVsc2VTb2NrZXRJT0NsaWVudCB8IG51bGw+KG51bGwpO1xuY29uc3QgUHVsc2VQcmVyZW5kZXJDb250ZXh0ID0gY3JlYXRlQ29udGV4dDxQdWxzZVByZXJlbmRlciB8IG51bGw+KG51bGwpO1xuXG5leHBvcnQgY29uc3QgdXNlUHVsc2VDbGllbnQgPSAoKSA9PiB7XG5cdGNvbnN0IGNsaWVudCA9IHVzZUNvbnRleHQoUHVsc2VDbGllbnRDb250ZXh0KTtcblx0aWYgKCFjbGllbnQpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJ1c2VQdWxzZUNsaWVudCBtdXN0IGJlIHVzZWQgd2l0aGluIGEgUHVsc2VQcm92aWRlclwiKTtcblx0fVxuXHRyZXR1cm4gY2xpZW50O1xufTtcblxuZXhwb3J0IGNvbnN0IHVzZVB1bHNlUHJlcmVuZGVyID0gKHBhdGg6IHN0cmluZykgPT4ge1xuXHRjb25zdCBjdHggPSB1c2VDb250ZXh0KFB1bHNlUHJlcmVuZGVyQ29udGV4dCk7XG5cdGlmICghY3R4KSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwidXNlUHVsc2VQcmVyZW5kZXIgbXVzdCBiZSB1c2VkIHdpdGhpbiBhIFB1bHNlUHJvdmlkZXJcIik7XG5cdH1cblx0Y29uc3QgdmlldyA9IGN0eC52aWV3c1twYXRoXTtcblx0aWYgKCF2aWV3KSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKGBObyBwcmVyZW5kZXIgZm91bmQgZm9yICcke3BhdGh9J2ApO1xuXHR9XG5cdHJldHVybiB2aWV3O1xufTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFByb3ZpZGVyXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgaW50ZXJmYWNlIFB1bHNlUHJvdmlkZXJQcm9wcyB7XG5cdGNoaWxkcmVuOiBSZWFjdE5vZGU7XG5cdGNvbmZpZzogUHVsc2VDb25maWc7XG5cdHByZXJlbmRlcjogUHVsc2VQcmVyZW5kZXI7XG59XG5cbmNvbnN0IGluQnJvd3NlciA9IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBQdWxzZVByb3ZpZGVyKHsgY2hpbGRyZW4sIGNvbmZpZywgcHJlcmVuZGVyIH06IFB1bHNlUHJvdmlkZXJQcm9wcykge1xuXHRjb25zdCBbY29ubmVjdGVkLCBzZXRDb25uZWN0ZWRdID0gdXNlU3RhdGUodHJ1ZSk7XG5cdGNvbnN0IHJyTmF2aWdhdGUgPSB1c2VOYXZpZ2F0ZSgpO1xuXHRjb25zdCB7IHJlbmRlcklkIH0gPSBwcmVyZW5kZXI7XG5cblx0Y29uc3QgY2xpZW50ID0gdXNlTWVtbyhcblx0XHQoKSA9PiBuZXcgUHVsc2VTb2NrZXRJT0NsaWVudChjb25maWcuc2VydmVyQWRkcmVzcywgcmVuZGVySWQsIHJyTmF2aWdhdGUpLFxuXHRcdFtjb25maWcuc2VydmVyQWRkcmVzcywgcnJOYXZpZ2F0ZSwgcmVuZGVySWRdLFxuXHQpO1xuXG5cdHVzZUVmZmVjdCgoKSA9PiBjbGllbnQub25Db25uZWN0aW9uQ2hhbmdlKHNldENvbm5lY3RlZCksIFtjbGllbnRdKTtcblxuXHR1c2VFZmZlY3QoKCkgPT4ge1xuXHRcdGlmIChpbkJyb3dzZXIpIHtcblx0XHRcdGNsaWVudC5jb25uZWN0KCk7XG5cdFx0XHRyZXR1cm4gKCkgPT4gY2xpZW50LmRpc2Nvbm5lY3QoKTtcblx0XHR9XG5cdH0sIFtjbGllbnRdKTtcblxuXHRyZXR1cm4gKFxuXHRcdDxQdWxzZUNsaWVudENvbnRleHQuUHJvdmlkZXIgdmFsdWU9e2NsaWVudH0+XG5cdFx0XHQ8UHVsc2VQcmVyZW5kZXJDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXtwcmVyZW5kZXJ9PlxuXHRcdFx0XHR7IWNvbm5lY3RlZCAmJiAoXG5cdFx0XHRcdFx0PGRpdlxuXHRcdFx0XHRcdFx0c3R5bGU9e3tcblx0XHRcdFx0XHRcdFx0cG9zaXRpb246IFwiZml4ZWRcIixcblx0XHRcdFx0XHRcdFx0Ym90dG9tOiBcIjIwcHhcIixcblx0XHRcdFx0XHRcdFx0cmlnaHQ6IFwiMjBweFwiLFxuXHRcdFx0XHRcdFx0XHRiYWNrZ3JvdW5kQ29sb3I6IFwicmVkXCIsXG5cdFx0XHRcdFx0XHRcdGNvbG9yOiBcIndoaXRlXCIsXG5cdFx0XHRcdFx0XHRcdHBhZGRpbmc6IFwiMTBweFwiLFxuXHRcdFx0XHRcdFx0XHRib3JkZXJSYWRpdXM6IFwiNXB4XCIsXG5cdFx0XHRcdFx0XHRcdHpJbmRleDogMTAwMCxcblx0XHRcdFx0XHRcdH19XG5cdFx0XHRcdFx0PlxuXHRcdFx0XHRcdFx0RmFpbGVkIHRvIGNvbm5lY3QgdG8gdGhlIHNlcnZlci5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0KX1cblx0XHRcdFx0e2NoaWxkcmVufVxuXHRcdFx0PC9QdWxzZVByZXJlbmRlckNvbnRleHQuUHJvdmlkZXI+XG5cdFx0PC9QdWxzZUNsaWVudENvbnRleHQuUHJvdmlkZXI+XG5cdCk7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBWaWV3XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgaW50ZXJmYWNlIFB1bHNlVmlld1Byb3BzIHtcblx0ZXh0ZXJuYWxDb21wb25lbnRzOiBDb21wb25lbnRSZWdpc3RyeTtcblx0cGF0aDogc3RyaW5nO1xuXHRjc3NNb2R1bGVzOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Pjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFB1bHNlVmlldyh7IGV4dGVybmFsQ29tcG9uZW50cywgcGF0aCwgY3NzTW9kdWxlcyB9OiBQdWxzZVZpZXdQcm9wcykge1xuXHRjb25zdCBjbGllbnQgPSB1c2VQdWxzZUNsaWVudCgpO1xuXHRjb25zdCBpbml0aWFsVmlldyA9IHVzZVB1bHNlUHJlcmVuZGVyKHBhdGgpO1xuXHRjb25zdCBpbml0aWFsVkRPTSA9IGluaXRpYWxWaWV3LnZkb207XG5cdGNvbnN0IHJlbmRlcmVyID0gdXNlTWVtbyhcblx0XHQoKSA9PlxuXHRcdFx0bmV3IFZET01SZW5kZXJlcihcblx0XHRcdFx0Y2xpZW50LFxuXHRcdFx0XHRwYXRoLFxuXHRcdFx0XHRleHRlcm5hbENvbXBvbmVudHMsXG5cdFx0XHRcdGNzc01vZHVsZXMsXG5cdFx0XHRcdGluaXRpYWxWaWV3LmNhbGxiYWNrcyxcblx0XHRcdFx0aW5pdGlhbFZpZXcucmVuZGVyX3Byb3BzLFxuXHRcdFx0XHRpbml0aWFsVmlldy5jc3NfcmVmcyxcblx0XHRcdCksXG5cdFx0W2NsaWVudCwgcGF0aCwgZXh0ZXJuYWxDb21wb25lbnRzLCBjc3NNb2R1bGVzLCBpbml0aWFsVmlld10sXG5cdCk7XG5cdGNvbnN0IFt0cmVlLCBzZXRUcmVlXSA9IHVzZVN0YXRlPFJlYWN0Tm9kZT4oKCkgPT5cblx0XHRyZW5kZXJlci5pbml0KFxuXHRcdFx0aW5pdGlhbFZET00sXG5cdFx0XHRpbml0aWFsVmlldy5jYWxsYmFja3MsXG5cdFx0XHRpbml0aWFsVmlldy5yZW5kZXJfcHJvcHMsXG5cdFx0XHRpbml0aWFsVmlldy5jc3NfcmVmcyxcblx0XHQpLFxuXHQpO1xuXHRjb25zdCBbc2VydmVyRXJyb3IsIHNldFNlcnZlckVycm9yXSA9IHVzZVN0YXRlPFNlcnZlckVycm9ySW5mbyB8IG51bGw+KG51bGwpO1xuXG5cdGNvbnN0IGxvY2F0aW9uID0gdXNlTG9jYXRpb24oKTtcblx0Y29uc3QgcGFyYW1zID0gdXNlUGFyYW1zKCk7XG5cblx0Ly8gYmlvbWUtaWdub3JlIGxpbnQvY29ycmVjdG5lc3MvdXNlRXhoYXVzdGl2ZURlcGVuZGVuY2llczogdXNpbmcgaGFja3kgZGVlcCBlcXVhbGl0eSBmb3IgcGFyYW1zXG5cdGNvbnN0IHJvdXRlSW5mbyA9IHVzZU1lbW8oKCkgPT4ge1xuXHRcdGNvbnN0IHsgXCIqXCI6IGNhdGNoYWxsID0gXCJcIiwgLi4ucGF0aFBhcmFtcyB9ID0gcGFyYW1zO1xuXHRcdGNvbnN0IHF1ZXJ5UGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhsb2NhdGlvbi5zZWFyY2gpO1xuXHRcdHJldHVybiB7XG5cdFx0XHRoYXNoOiBsb2NhdGlvbi5oYXNoLFxuXHRcdFx0cGF0aG5hbWU6IGxvY2F0aW9uLnBhdGhuYW1lLFxuXHRcdFx0cXVlcnk6IGxvY2F0aW9uLnNlYXJjaCxcblx0XHRcdHF1ZXJ5UGFyYW1zOiBPYmplY3QuZnJvbUVudHJpZXMocXVlcnlQYXJhbXMuZW50cmllcygpKSxcblx0XHRcdHBhdGhQYXJhbXMsXG5cdFx0XHRjYXRjaGFsbDogY2F0Y2hhbGwubGVuZ3RoID4gMCA/IGNhdGNoYWxsLnNwbGl0KFwiL1wiKSA6IFtdLFxuXHRcdH0gc2F0aXNmaWVzIFJvdXRlSW5mbztcblx0fSwgW2xvY2F0aW9uLmhhc2gsIGxvY2F0aW9uLnBhdGhuYW1lLCBsb2NhdGlvbi5zZWFyY2gsIEpTT04uc3RyaW5naWZ5KHBhcmFtcyldKTtcblxuXHR1c2VFZmZlY3QoKCkgPT4ge1xuXHRcdGlmIChpbkJyb3dzZXIpIHtcblx0XHRcdGNsaWVudC5tb3VudFZpZXcocGF0aCwge1xuXHRcdFx0XHRyb3V0ZUluZm8sXG5cdFx0XHRcdG9uSW5pdDogKHZkb20sIGNhbGxiYWNrcywgcmVuZGVyUHJvcHMsIGNzc1JlZnMpID0+IHtcblx0XHRcdFx0XHRzZXRUcmVlKHJlbmRlcmVyLmluaXQodmRvbSwgY2FsbGJhY2tzLCByZW5kZXJQcm9wcywgY3NzUmVmcykpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRvblVwZGF0ZTogKG9wcykgPT4ge1xuXHRcdFx0XHRcdHNldFRyZWUoKHByZXYpID0+IChwcmV2ID09IG51bGwgPyBwcmV2IDogcmVuZGVyZXIuYXBwbHlVcGRhdGVzKHByZXYsIG9wcykpKTtcblx0XHRcdFx0fSxcblx0XHRcdH0pO1xuXHRcdFx0Y29uc3Qgb2ZmRXJyID0gY2xpZW50Lm9uU2VydmVyRXJyb3IoKHAsIGVycikgPT4ge1xuXHRcdFx0XHRpZiAocCA9PT0gcGF0aCkgc2V0U2VydmVyRXJyb3IoZXJyKTtcblx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuICgpID0+IHtcblx0XHRcdFx0b2ZmRXJyKCk7XG5cdFx0XHRcdGNsaWVudC51bm1vdW50KHBhdGgpO1xuXHRcdFx0fTtcblx0XHR9XG5cdFx0Ly8gcm91dGVJbmZvIGlzIE5PVCBpbmNsdWRlZCBoZXJlIG9uIHB1cnBvc2Vcblx0fSwgW2NsaWVudCwgcmVuZGVyZXIsIHBhdGgsIHJvdXRlSW5mb10pO1xuXG5cdHVzZUVmZmVjdCgoKSA9PiB7XG5cdFx0aWYgKGluQnJvd3Nlcikge1xuXHRcdFx0Y2xpZW50Lm5hdmlnYXRlKHBhdGgsIHJvdXRlSW5mbyk7XG5cdFx0fVxuXHR9LCBbY2xpZW50LCBwYXRoLCByb3V0ZUluZm9dKTtcblxuXHRpZiAoc2VydmVyRXJyb3IpIHtcblx0XHRyZXR1cm4gPFNlcnZlckVycm9yIGVycm9yPXtzZXJ2ZXJFcnJvcn0gLz47XG5cdH1cblxuXHRyZXR1cm4gdHJlZTtcbn1cblxuZnVuY3Rpb24gU2VydmVyRXJyb3IoeyBlcnJvciB9OiB7IGVycm9yOiBTZXJ2ZXJFcnJvckluZm8gfSkge1xuXHRyZXR1cm4gKFxuXHRcdDxkaXZcblx0XHRcdHN0eWxlPXt7XG5cdFx0XHRcdHBhZGRpbmc6IDE2LFxuXHRcdFx0XHRib3JkZXI6IFwiMXB4IHNvbGlkICNlMDBcIixcblx0XHRcdFx0YmFja2dyb3VuZDogXCIjZmZmNWY1XCIsXG5cdFx0XHRcdGNvbG9yOiBcIiM5MDBcIixcblx0XHRcdFx0Zm9udEZhbWlseTpcblx0XHRcdFx0XHQndWktbW9ub3NwYWNlLCBTRk1vbm8tUmVndWxhciwgTWVubG8sIE1vbmFjbywgQ29uc29sYXMsIFwiTGliZXJhdGlvbiBNb25vXCIsIFwiQ291cmllciBOZXdcIiwgbW9ub3NwYWNlJyxcblx0XHRcdFx0d2hpdGVTcGFjZTogXCJwcmUtd3JhcFwiLFxuXHRcdFx0fX1cblx0XHQ+XG5cdFx0XHQ8ZGl2IHN0eWxlPXt7IGZvbnRXZWlnaHQ6IDcwMCwgbWFyZ2luQm90dG9tOiA4IH19PlNlcnZlciBFcnJvciBkdXJpbmcge2Vycm9yLnBoYXNlfTwvZGl2PlxuXHRcdFx0e2Vycm9yLm1lc3NhZ2UgJiYgPGRpdj57ZXJyb3IubWVzc2FnZX08L2Rpdj59XG5cdFx0XHR7ZXJyb3Iuc3RhY2sgJiYgKFxuXHRcdFx0XHQ8ZGV0YWlscyBvcGVuIHN0eWxlPXt7IG1hcmdpblRvcDogOCB9fT5cblx0XHRcdFx0XHQ8c3VtbWFyeT5TdGFjayB0cmFjZTwvc3VtbWFyeT5cblx0XHRcdFx0XHQ8cHJlIHN0eWxlPXt7IG1hcmdpbjogMCB9fT57ZXJyb3Iuc3RhY2t9PC9wcmU+XG5cdFx0XHRcdDwvZGV0YWlscz5cblx0XHRcdCl9XG5cdFx0PC9kaXY+XG5cdCk7XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgTmF2aWdhdGVGdW5jdGlvbiB9IGZyb20gXCJyZWFjdC1yb3V0ZXJcIjtcbmltcG9ydCB7IGlvLCB0eXBlIFNvY2tldCB9IGZyb20gXCJzb2NrZXQuaW8tY2xpZW50XCI7XG5pbXBvcnQgdHlwZSB7IENoYW5uZWxCcmlkZ2UgfSBmcm9tIFwiLi9jaGFubmVsXCI7XG5pbXBvcnQgeyBjcmVhdGVDaGFubmVsQnJpZGdlLCBQdWxzZUNoYW5uZWxSZXNldEVycm9yIH0gZnJvbSBcIi4vY2hhbm5lbFwiO1xuaW1wb3J0IHR5cGUgeyBSb3V0ZUluZm8gfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5pbXBvcnQgdHlwZSB7XG5cdENsaWVudEFwaVJlc3VsdE1lc3NhZ2UsXG5cdENsaWVudE1lc3NhZ2UsXG5cdFNlcnZlckFwaUNhbGxNZXNzYWdlLFxuXHRTZXJ2ZXJDaGFubmVsTWVzc2FnZSxcblx0U2VydmVyRXJyb3JJbmZvLFxuXHRTZXJ2ZXJNZXNzYWdlLFxufSBmcm9tIFwiLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHsgZXh0cmFjdEV2ZW50IH0gZnJvbSBcIi4vc2VyaWFsaXplL2V2ZW50c1wiO1xuaW1wb3J0IHsgZGVzZXJpYWxpemUsIHNlcmlhbGl6ZSB9IGZyb20gXCIuL3NlcmlhbGl6ZS9zZXJpYWxpemVyXCI7XG5pbXBvcnQgdHlwZSB7IFZET00sIFZET01VcGRhdGUgfSBmcm9tIFwiLi92ZG9tXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW91bnRlZFZpZXcge1xuXHRyb3V0ZUluZm86IFJvdXRlSW5mbztcblx0b25Jbml0OiAodmRvbTogVkRPTSwgY2FsbGJhY2tzOiBzdHJpbmdbXSwgcmVuZGVyUHJvcHM6IHN0cmluZ1tdLCBjc3NSZWZzOiBzdHJpbmdbXSkgPT4gdm9pZDtcblx0b25VcGRhdGU6IChvcHM6IFZET01VcGRhdGVbXSkgPT4gdm9pZDtcbn1cbmV4cG9ydCB0eXBlIENvbm5lY3Rpb25TdGF0dXNMaXN0ZW5lciA9IChjb25uZWN0ZWQ6IGJvb2xlYW4pID0+IHZvaWQ7XG5leHBvcnQgdHlwZSBTZXJ2ZXJFcnJvckxpc3RlbmVyID0gKHBhdGg6IHN0cmluZywgZXJyb3I6IFNlcnZlckVycm9ySW5mbyB8IG51bGwpID0+IHZvaWQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHVsc2VDbGllbnQge1xuXHQvLyBDb25uZWN0aW9uIG1hbmFnZW1lbnRcblx0Y29ubmVjdCgpOiBQcm9taXNlPHZvaWQ+O1xuXHRkaXNjb25uZWN0KCk6IHZvaWQ7XG5cdGlzQ29ubmVjdGVkKCk6IGJvb2xlYW47XG5cdG9uQ29ubmVjdGlvbkNoYW5nZShsaXN0ZW5lcjogQ29ubmVjdGlvblN0YXR1c0xpc3RlbmVyKTogKCkgPT4gdm9pZDtcblx0Ly8gTWVzc2FnZXNcblx0bmF2aWdhdGUocGF0aDogc3RyaW5nLCByb3V0ZUluZm86IFJvdXRlSW5mbyk6IFByb21pc2U8dm9pZD47XG5cdGxlYXZlKHBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD47XG5cdGludm9rZUNhbGxiYWNrKHBhdGg6IHN0cmluZywgY2FsbGJhY2s6IHN0cmluZywgYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+O1xuXHQvLyBWRE9NIHN1YnNjcmlwdGlvblxuXHRtb3VudFZpZXcocGF0aDogc3RyaW5nLCB2aWV3OiBNb3VudGVkVmlldyk6ICgpID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBjbGFzcyBQdWxzZVNvY2tldElPQ2xpZW50IHtcblx0I2FjdGl2ZVZpZXdzOiBNYXA8c3RyaW5nLCBNb3VudGVkVmlldz47XG5cdCNzb2NrZXQ6IFNvY2tldCB8IG51bGwgPSBudWxsO1xuXHQjbWVzc2FnZVF1ZXVlOiBDbGllbnRNZXNzYWdlW107XG5cdCNjb25uZWN0aW9uTGlzdGVuZXJzOiBTZXQ8Q29ubmVjdGlvblN0YXR1c0xpc3RlbmVyPiA9IG5ldyBTZXQoKTtcblx0I3NlcnZlckVycm9yczogTWFwPHN0cmluZywgU2VydmVyRXJyb3JJbmZvPiA9IG5ldyBNYXAoKTtcblx0I3NlcnZlckVycm9yTGlzdGVuZXJzOiBTZXQ8U2VydmVyRXJyb3JMaXN0ZW5lcj4gPSBuZXcgU2V0KCk7XG5cdCNjaGFubmVsczogTWFwPHN0cmluZywgeyBicmlkZ2U6IENoYW5uZWxCcmlkZ2U7IHJlZkNvdW50OiBudW1iZXIgfT4gPSBuZXcgTWFwKCk7XG5cdCN1cmw6IHN0cmluZztcblx0I3JlbmRlcklkOiBzdHJpbmc7XG5cdCNmcmFtZXdvcmtOYXZpZ2F0ZTogTmF2aWdhdGVGdW5jdGlvbjtcblxuXHRjb25zdHJ1Y3Rvcih1cmw6IHN0cmluZywgcmVuZGVySWQ6IHN0cmluZywgZnJhbWV3b3JrTmF2aWdhdGU6IE5hdmlnYXRlRnVuY3Rpb24pIHtcblx0XHR0aGlzLiN1cmwgPSB1cmw7XG5cdFx0dGhpcy4jcmVuZGVySWQgPSByZW5kZXJJZDtcblx0XHR0aGlzLiNmcmFtZXdvcmtOYXZpZ2F0ZSA9IGZyYW1ld29ya05hdmlnYXRlO1xuXHRcdHRoaXMuI3NvY2tldCA9IG51bGw7XG5cdFx0dGhpcy4jYWN0aXZlVmlld3MgPSBuZXcgTWFwKCk7XG5cdFx0dGhpcy4jbWVzc2FnZVF1ZXVlID0gW107XG5cdH1cblx0cHVibGljIGlzQ29ubmVjdGVkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLiNzb2NrZXQ/LmNvbm5lY3RlZCA/PyBmYWxzZTtcblx0fVxuXG5cdHB1YmxpYyBhc3luYyBjb25uZWN0KCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmICh0aGlzLiNzb2NrZXQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdGNvbnN0IHNvY2tldCA9IGlvKHRoaXMuI3VybCwge1xuXHRcdFx0XHR0cmFuc3BvcnRzOiBbXCJ3ZWJzb2NrZXRcIiwgXCJ3ZWJ0cmFuc3BvcnRcIl0sXG5cdFx0XHRcdGF1dGg6IHsgcmVuZGVySWQ6IHRoaXMuI3JlbmRlcklkIH0sXG5cdFx0XHR9KTtcblx0XHRcdHRoaXMuI3NvY2tldCA9IHNvY2tldDtcblxuXHRcdFx0c29ja2V0Lm9uKFwiY29ubmVjdFwiLCAoKSA9PiB7XG5cdFx0XHRcdGNvbnNvbGUubG9nKFwiW1NvY2tldElPVHJhbnNwb3J0XSBDb25uZWN0ZWQ6XCIsIHRoaXMuI3NvY2tldD8uaWQpO1xuXHRcdFx0XHQvLyBNYWtlIHN1cmUgdG8gc2VuZCBhIG5hdmlnYXRlIHBheWxvYWQgZm9yIGFsbCB0aGUgcm91dGVzXG5cdFx0XHRcdGZvciAoY29uc3QgW3BhdGgsIHJvdXRlXSBvZiB0aGlzLiNhY3RpdmVWaWV3cykge1xuXHRcdFx0XHRcdHNvY2tldC5lbWl0KFxuXHRcdFx0XHRcdFx0XCJtZXNzYWdlXCIsXG5cdFx0XHRcdFx0XHRzZXJpYWxpemUoe1xuXHRcdFx0XHRcdFx0XHR0eXBlOiBcIm1vdW50XCIsXG5cdFx0XHRcdFx0XHRcdHBhdGg6IHBhdGgsXG5cdFx0XHRcdFx0XHRcdHJvdXRlSW5mbzogcm91dGUucm91dGVJbmZvLFxuXHRcdFx0XHRcdFx0fSksXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGZvciAoY29uc3QgcGF5bG9hZCBvZiB0aGlzLiNtZXNzYWdlUXVldWUpIHtcblx0XHRcdFx0XHQvLyBBbHJlYWR5IHNlbnQgYWJvdmVcblx0XHRcdFx0XHRpZiAocGF5bG9hZC50eXBlID09PSBcIm1vdW50XCIgJiYgdGhpcy4jYWN0aXZlVmlld3MuaGFzKHBheWxvYWQucGF0aCkpIHtcblx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQvLyBXZSdyZSByZW1vdW50aW5nIGFsbCB0aGUgcm91dGVzLCBzbyBubyBuZWVkIHRvIG5hdmlnYXRlXG5cdFx0XHRcdFx0aWYgKHBheWxvYWQudHlwZSA9PT0gXCJuYXZpZ2F0ZVwiKSB7XG5cdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0c29ja2V0LmVtaXQoXCJtZXNzYWdlXCIsIHNlcmlhbGl6ZShwYXlsb2FkKSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy4jbWVzc2FnZVF1ZXVlID0gW107XG5cblx0XHRcdFx0dGhpcy5ub3RpZnlDb25uZWN0aW9uTGlzdGVuZXJzKHRydWUpO1xuXHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHR9KTtcblxuXHRcdFx0c29ja2V0Lm9uKFwiY29ubmVjdF9lcnJvclwiLCAoZXJyKSA9PiB7XG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoXCJbU29ja2V0SU9UcmFuc3BvcnRdIENvbm5lY3Rpb24gZmFpbGVkOlwiLCBlcnIpO1xuXHRcdFx0XHR0aGlzLm5vdGlmeUNvbm5lY3Rpb25MaXN0ZW5lcnMoZmFsc2UpO1xuXHRcdFx0XHRyZWplY3QoZXJyKTtcblx0XHRcdH0pO1xuXG5cdFx0XHRzb2NrZXQub24oXCJkaXNjb25uZWN0XCIsICgpID0+IHtcblx0XHRcdFx0Y29uc29sZS5sb2coXCJbU29ja2V0SU9UcmFuc3BvcnRdIERpc2Nvbm5lY3RlZFwiKTtcblx0XHRcdFx0dGhpcy4jaGFuZGxlVHJhbnNwb3J0RGlzY29ubmVjdCgpO1xuXHRcdFx0XHR0aGlzLm5vdGlmeUNvbm5lY3Rpb25MaXN0ZW5lcnMoZmFsc2UpO1xuXHRcdFx0fSk7XG5cblx0XHRcdC8vIFdyYXAgaW4gYW4gYXJyb3cgZnVuY3Rpb24gdG8gYXZvaWQgbG9zaW5nIHRoZSBgdGhpc2AgcmVmZXJlbmNlXG5cdFx0XHRzb2NrZXQub24oXCJtZXNzYWdlXCIsIChkYXRhKSA9PlxuXHRcdFx0XHR0aGlzLiNoYW5kbGVTZXJ2ZXJNZXNzYWdlKGRlc2VyaWFsaXplKGRhdGEsIHsgY29lcmNlTnVsbHNUb1VuZGVmaW5lZDogdHJ1ZSB9KSksXG5cdFx0XHQpO1xuXHRcdH0pO1xuXHR9XG5cblx0b25Db25uZWN0aW9uQ2hhbmdlKGxpc3RlbmVyOiBDb25uZWN0aW9uU3RhdHVzTGlzdGVuZXIpOiAoKSA9PiB2b2lkIHtcblx0XHR0aGlzLiNjb25uZWN0aW9uTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7XG5cdFx0bGlzdGVuZXIodGhpcy5pc0Nvbm5lY3RlZCgpKTtcblx0XHRyZXR1cm4gKCkgPT4ge1xuXHRcdFx0dGhpcy4jY29ubmVjdGlvbkxpc3RlbmVycy5kZWxldGUobGlzdGVuZXIpO1xuXHRcdH07XG5cdH1cblxuXHRwcml2YXRlIG5vdGlmeUNvbm5lY3Rpb25MaXN0ZW5lcnMoY29ubmVjdGVkOiBib29sZWFuKTogdm9pZCB7XG5cdFx0Zm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLiNjb25uZWN0aW9uTGlzdGVuZXJzKSB7XG5cdFx0XHRsaXN0ZW5lcihjb25uZWN0ZWQpO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBvblNlcnZlckVycm9yKGxpc3RlbmVyOiBTZXJ2ZXJFcnJvckxpc3RlbmVyKTogKCkgPT4gdm9pZCB7XG5cdFx0dGhpcy4jc2VydmVyRXJyb3JMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTtcblx0XHQvLyBFbWl0IGN1cnJlbnQgZXJyb3JzIHRvIG5ldyBsaXN0ZW5lclxuXHRcdGZvciAoY29uc3QgW3BhdGgsIGVycl0gb2YgdGhpcy4jc2VydmVyRXJyb3JzKSBsaXN0ZW5lcihwYXRoLCBlcnIpO1xuXHRcdHJldHVybiAoKSA9PiB7XG5cdFx0XHR0aGlzLiNzZXJ2ZXJFcnJvckxpc3RlbmVycy5kZWxldGUobGlzdGVuZXIpO1xuXHRcdH07XG5cdH1cblxuXHRwcml2YXRlIG5vdGlmeVNlcnZlckVycm9yKHBhdGg6IHN0cmluZywgZXJyb3I6IFNlcnZlckVycm9ySW5mbyB8IG51bGwpIHtcblx0XHRmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIHRoaXMuI3NlcnZlckVycm9yTGlzdGVuZXJzKSBsaXN0ZW5lcihwYXRoLCBlcnJvcik7XG5cdH1cblxuXHRwdWJsaWMgc2VuZE1lc3NhZ2UocGF5bG9hZDogQ2xpZW50TWVzc2FnZSkge1xuXHRcdGlmICh0aGlzLmlzQ29ubmVjdGVkKCkpIHtcblx0XHRcdC8vIGNvbnNvbGUubG9nKFwiW1NvY2tldElPVHJhbnNwb3J0XSBTZW5kaW5nOlwiLCBwYXlsb2FkKTtcblx0XHRcdHRoaXMuI3NvY2tldCEuZW1pdChcIm1lc3NhZ2VcIiwgc2VyaWFsaXplKHBheWxvYWQgYXMgYW55KSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIGNvbnNvbGUubG9nKFwiW1NvY2tldElPVHJhbnNwb3J0XSBRdWV1aW5nIG1lc3NhZ2U6XCIsIHBheWxvYWQpO1xuXHRcdFx0dGhpcy4jbWVzc2FnZVF1ZXVlLnB1c2gocGF5bG9hZCk7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIG1vdW50VmlldyhwYXRoOiBzdHJpbmcsIHZpZXc6IE1vdW50ZWRWaWV3KSB7XG5cdFx0aWYgKHRoaXMuI2FjdGl2ZVZpZXdzLmhhcyhwYXRoKSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGBQYXRoICR7cGF0aH0gaXMgYWxyZWFkeSBtb3VudGVkYCk7XG5cdFx0fVxuXHRcdHRoaXMuI2FjdGl2ZVZpZXdzLnNldChwYXRoLCB2aWV3KTtcblx0XHR2b2lkIHRoaXMuc2VuZE1lc3NhZ2Uoe1xuXHRcdFx0dHlwZTogXCJtb3VudFwiLFxuXHRcdFx0cGF0aCxcblx0XHRcdHJvdXRlSW5mbzogdmlldy5yb3V0ZUluZm8sXG5cdFx0fSk7XG5cdH1cblxuXHRwdWJsaWMgYXN5bmMgbmF2aWdhdGUocGF0aDogc3RyaW5nLCByb3V0ZUluZm86IFJvdXRlSW5mbykge1xuXHRcdGF3YWl0IHRoaXMuc2VuZE1lc3NhZ2Uoe1xuXHRcdFx0dHlwZTogXCJuYXZpZ2F0ZVwiLFxuXHRcdFx0cGF0aCxcblx0XHRcdHJvdXRlSW5mbyxcblx0XHR9KTtcblx0fVxuXG5cdHB1YmxpYyB1bm1vdW50KHBhdGg6IHN0cmluZykge1xuXHRcdHZvaWQgdGhpcy5zZW5kTWVzc2FnZSh7IHR5cGU6IFwidW5tb3VudFwiLCBwYXRoIH0pO1xuXHRcdHRoaXMuI2FjdGl2ZVZpZXdzLmRlbGV0ZShwYXRoKTtcblx0fVxuXG5cdHB1YmxpYyBkaXNjb25uZWN0KCkge1xuXHRcdHRoaXMuI3NvY2tldD8uZGlzY29ubmVjdCgpO1xuXHRcdHRoaXMuI3NvY2tldCA9IG51bGw7XG5cdFx0dGhpcy4jbWVzc2FnZVF1ZXVlID0gW107XG5cdFx0dGhpcy4jY29ubmVjdGlvbkxpc3RlbmVycy5jbGVhcigpO1xuXHRcdHRoaXMuI2FjdGl2ZVZpZXdzLmNsZWFyKCk7XG5cdFx0dGhpcy4jc2VydmVyRXJyb3JzLmNsZWFyKCk7XG5cdFx0dGhpcy4jc2VydmVyRXJyb3JMaXN0ZW5lcnMuY2xlYXIoKTtcblx0XHRmb3IgKGNvbnN0IHsgYnJpZGdlIH0gb2YgdGhpcy4jY2hhbm5lbHMudmFsdWVzKCkpIHtcblx0XHRcdGJyaWRnZS5kaXNwb3NlKG5ldyBQdWxzZUNoYW5uZWxSZXNldEVycm9yKFwiQ2xpZW50IGRpc2Nvbm5lY3RlZFwiKSk7XG5cdFx0fVxuXHRcdHRoaXMuI2NoYW5uZWxzLmNsZWFyKCk7XG5cdH1cblxuXHQjaGFuZGxlU2VydmVyTWVzc2FnZShtZXNzYWdlOiBTZXJ2ZXJNZXNzYWdlKSB7XG5cdFx0Ly8gY29uc29sZS5sb2coXCJbUHVsc2VDbGllbnRdIFJlY2VpdmVkIG1lc3NhZ2U6XCIsIG1lc3NhZ2UpO1xuXHRcdHN3aXRjaCAobWVzc2FnZS50eXBlKSB7XG5cdFx0XHRjYXNlIFwidmRvbV9pbml0XCI6IHtcblx0XHRcdFx0Y29uc3Qgcm91dGUgPSB0aGlzLiNhY3RpdmVWaWV3cy5nZXQobWVzc2FnZS5wYXRoKTtcblx0XHRcdFx0Ly8gSWdub3JlIG1lc3NhZ2VzIGZvciBwYXRocyB0aGF0IGFyZSBub3QgbW91bnRlZFxuXHRcdFx0XHRpZiAoIXJvdXRlKSByZXR1cm47XG5cdFx0XHRcdGlmIChyb3V0ZSkge1xuXHRcdFx0XHRcdHJvdXRlLm9uSW5pdChtZXNzYWdlLnZkb20sIG1lc3NhZ2UuY2FsbGJhY2tzLCBtZXNzYWdlLnJlbmRlcl9wcm9wcywgbWVzc2FnZS5jc3NfcmVmcyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gQ2xlYXIgYW55IHByaW9yIGVycm9yIGZvciB0aGlzIHBhdGggb24gc3VjY2Vzc2Z1bCBpbml0XG5cdFx0XHRcdGlmICh0aGlzLiNzZXJ2ZXJFcnJvcnMuaGFzKG1lc3NhZ2UucGF0aCkpIHtcblx0XHRcdFx0XHR0aGlzLiNzZXJ2ZXJFcnJvcnMuZGVsZXRlKG1lc3NhZ2UucGF0aCk7XG5cdFx0XHRcdFx0dGhpcy5ub3RpZnlTZXJ2ZXJFcnJvcihtZXNzYWdlLnBhdGgsIG51bGwpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0Y2FzZSBcInZkb21fdXBkYXRlXCI6IHtcblx0XHRcdFx0Y29uc3Qgcm91dGUgPSB0aGlzLiNhY3RpdmVWaWV3cy5nZXQobWVzc2FnZS5wYXRoKTtcblx0XHRcdFx0aWYgKCFyb3V0ZSkgcmV0dXJuOyAvLyBOb3QgYW4gYWN0aXZlIHBhdGg7IGRpc2NhcmRcblx0XHRcdFx0cm91dGUub25VcGRhdGUobWVzc2FnZS5vcHMpO1xuXHRcdFx0XHQvLyBDbGVhciBhbnkgcHJpb3IgZXJyb3IgZm9yIHRoaXMgcGF0aCBvbiBzdWNjZXNzZnVsIHVwZGF0ZVxuXHRcdFx0XHRpZiAodGhpcy4jc2VydmVyRXJyb3JzLmhhcyhtZXNzYWdlLnBhdGgpKSB7XG5cdFx0XHRcdFx0dGhpcy4jc2VydmVyRXJyb3JzLmRlbGV0ZShtZXNzYWdlLnBhdGgpO1xuXHRcdFx0XHRcdHRoaXMubm90aWZ5U2VydmVyRXJyb3IobWVzc2FnZS5wYXRoLCBudWxsKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdGNhc2UgXCJzZXJ2ZXJfZXJyb3JcIjoge1xuXHRcdFx0XHRpZiAoIXRoaXMuI2FjdGl2ZVZpZXdzLmhhcyhtZXNzYWdlLnBhdGgpKSByZXR1cm47IC8vIGRpc2NhcmQgZm9yIGluYWN0aXZlIHBhdGhzXG5cdFx0XHRcdHRoaXMuI3NlcnZlckVycm9ycy5zZXQobWVzc2FnZS5wYXRoLCBtZXNzYWdlLmVycm9yKTtcblx0XHRcdFx0dGhpcy5ub3RpZnlTZXJ2ZXJFcnJvcihtZXNzYWdlLnBhdGgsIG1lc3NhZ2UuZXJyb3IpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdGNhc2UgXCJhcGlfY2FsbFwiOiB7XG5cdFx0XHRcdHZvaWQgdGhpcy4jcGVyZm9ybUFwaUNhbGwobWVzc2FnZSk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0Y2FzZSBcIm5hdmlnYXRlX3RvXCI6IHtcblx0XHRcdFx0Ly8gYG5hdmlnYXRlX3RvYCBpcyBuYXZpZ2F0aW9uYWw7IGFsbG93IHJlZ2FyZGxlc3Mgb2YgYWN0aXZlVmlld3MgbWVtYmVyc2hpcFxuXHRcdFx0XHRjb25zdCByZXBsYWNlID0gISFtZXNzYWdlLnJlcGxhY2U7XG5cdFx0XHRcdGxldCBkZXN0ID0gbWVzc2FnZS5wYXRoIHx8IFwiXCI7XG5cdFx0XHRcdC8vIE5vcm1hbGl6ZSBwcm90b2NvbC1yZWxhdGl2ZSBVUkxzIHRvIGFic29sdXRlXG5cdFx0XHRcdGlmIChkZXN0LnN0YXJ0c1dpdGgoXCIvL1wiKSkgZGVzdCA9IGAke3dpbmRvdy5sb2NhdGlvbi5wcm90b2NvbH0ke2Rlc3R9YDtcblx0XHRcdFx0Y29uc3QgaGFzU2NoZW1lID0gL15bYS16QS1aXVthLXpBLVowLTkrLi1dKjovLnRlc3QoZGVzdCk7XG5cdFx0XHRcdGlmIChoYXNTY2hlbWUpIHtcblx0XHRcdFx0XHRpZiAoZGVzdC5zdGFydHNXaXRoKFwiaHR0cDovL1wiKSB8fCBkZXN0LnN0YXJ0c1dpdGgoXCJodHRwczovL1wiKSkge1xuXHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgdXJsID0gbmV3IFVSTChkZXN0KTtcblx0XHRcdFx0XHRcdFx0aWYgKHVybC5vcmlnaW4gPT09IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4pIHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBpbnRlcm5hbCA9IGAke3VybC5wYXRobmFtZX0ke3VybC5zZWFyY2h9JHt1cmwuaGFzaH1gO1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMuI2ZyYW1ld29ya05hdmlnYXRlKGludGVybmFsLCB7IHJlcGxhY2UgfSk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHJlcGxhY2UpIHdpbmRvdy5sb2NhdGlvbi5yZXBsYWNlKGRlc3QpO1xuXHRcdFx0XHRcdFx0XHRcdGVsc2Ugd2luZG93LmxvY2F0aW9uLmFzc2lnbihkZXN0KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSBjYXRjaCB7XG5cdFx0XHRcdFx0XHRcdGlmIChyZXBsYWNlKSB3aW5kb3cubG9jYXRpb24ucmVwbGFjZShkZXN0KTtcblx0XHRcdFx0XHRcdFx0ZWxzZSB3aW5kb3cubG9jYXRpb24uYXNzaWduKGRlc3QpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHQvLyBtYWlsdG86LCB0ZWw6LCBkYXRhOiwgZXRjLlxuXHRcdFx0XHRcdFx0aWYgKHJlcGxhY2UpIHdpbmRvdy5sb2NhdGlvbi5yZXBsYWNlKGRlc3QpO1xuXHRcdFx0XHRcdFx0ZWxzZSB3aW5kb3cubG9jYXRpb24uYXNzaWduKGRlc3QpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBSZWxhdGl2ZSBvciByb290LXJlbGF0aXZlIHBhdGgg4oaSIFNQQSBuYXZpZ2F0ZVxuXHRcdFx0XHRcdHRoaXMuI2ZyYW1ld29ya05hdmlnYXRlKGRlc3QsIHsgcmVwbGFjZSB9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdGNhc2UgXCJjaGFubmVsX21lc3NhZ2VcIjoge1xuXHRcdFx0XHR0aGlzLiNyb3V0ZUNoYW5uZWxNZXNzYWdlKG1lc3NhZ2UpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdGRlZmF1bHQ6IHtcblx0XHRcdFx0Y29uc29sZS5lcnJvcihcIlVuZXhwZWN0ZWQgbWVzc2FnZTpcIiwgbWVzc2FnZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0YXN5bmMgI3BlcmZvcm1BcGlDYWxsKG1zZzogU2VydmVyQXBpQ2FsbE1lc3NhZ2UpIHtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgcmVzID0gYXdhaXQgZmV0Y2gobXNnLnVybCwge1xuXHRcdFx0XHRtZXRob2Q6IG1zZy5tZXRob2QgfHwgXCJHRVRcIixcblx0XHRcdFx0aGVhZGVyczoge1xuXHRcdFx0XHRcdC4uLihtc2cuaGVhZGVycyB8fCB7fSksXG5cdFx0XHRcdFx0Li4uKG1zZy5ib2R5ICE9IG51bGwgJiYgIShcImNvbnRlbnQtdHlwZVwiIGluIChtc2cuaGVhZGVycyB8fCB7fSkpXG5cdFx0XHRcdFx0XHQ/IHsgXCJjb250ZW50LXR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIgfVxuXHRcdFx0XHRcdFx0OiB7fSksXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGJvZHk6XG5cdFx0XHRcdFx0bXNnLmJvZHkgIT0gbnVsbFxuXHRcdFx0XHRcdFx0PyB0eXBlb2YgbXNnLmJvZHkgPT09IFwic3RyaW5nXCJcblx0XHRcdFx0XHRcdFx0PyBtc2cuYm9keVxuXHRcdFx0XHRcdFx0XHQ6IEpTT04uc3RyaW5naWZ5KG1zZy5ib2R5KVxuXHRcdFx0XHRcdFx0OiB1bmRlZmluZWQsXG5cdFx0XHRcdGNyZWRlbnRpYWxzOiBtc2cuY3JlZGVudGlhbHMgfHwgXCJpbmNsdWRlXCIsXG5cdFx0XHR9KTtcblx0XHRcdGNvbnN0IGhlYWRlcnNPYmo6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblx0XHRcdHJlcy5oZWFkZXJzLmZvckVhY2goKHYsIGspID0+IHtcblx0XHRcdFx0aGVhZGVyc09ialtrXSA9IHY7XG5cdFx0XHR9KTtcblx0XHRcdGxldCBib2R5OiBhbnkgPSBudWxsO1xuXHRcdFx0Y29uc3QgY3QgPSByZXMuaGVhZGVycy5nZXQoXCJjb250ZW50LXR5cGVcIikgfHwgXCJcIjtcblx0XHRcdGlmIChjdC5pbmNsdWRlcyhcImFwcGxpY2F0aW9uL2pzb25cIikpIHtcblx0XHRcdFx0Ym9keSA9IGF3YWl0IHJlcy5qc29uKCkuY2F0Y2goKCkgPT4gbnVsbCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRib2R5ID0gYXdhaXQgcmVzLnRleHQoKS5jYXRjaCgoKSA9PiBudWxsKTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IHJlcGx5OiBDbGllbnRBcGlSZXN1bHRNZXNzYWdlID0ge1xuXHRcdFx0XHR0eXBlOiBcImFwaV9yZXN1bHRcIixcblx0XHRcdFx0aWQ6IG1zZy5pZCxcblx0XHRcdFx0b2s6IHJlcy5vayxcblx0XHRcdFx0c3RhdHVzOiByZXMuc3RhdHVzLFxuXHRcdFx0XHRoZWFkZXJzOiBoZWFkZXJzT2JqLFxuXHRcdFx0XHRib2R5LFxuXHRcdFx0fTtcblx0XHRcdHRoaXMuc2VuZE1lc3NhZ2UocmVwbHkpO1xuXHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0Y29uc3QgcmVwbHk6IENsaWVudEFwaVJlc3VsdE1lc3NhZ2UgPSB7XG5cdFx0XHRcdHR5cGU6IFwiYXBpX3Jlc3VsdFwiLFxuXHRcdFx0XHRpZDogbXNnLmlkLFxuXHRcdFx0XHRvazogZmFsc2UsXG5cdFx0XHRcdHN0YXR1czogMCxcblx0XHRcdFx0aGVhZGVyczoge30sXG5cdFx0XHRcdGJvZHk6IHsgZXJyb3I6IFN0cmluZyhlcnIpIH0sXG5cdFx0XHR9O1xuXHRcdFx0dGhpcy5zZW5kTWVzc2FnZShyZXBseSk7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIGludm9rZUNhbGxiYWNrKHBhdGg6IHN0cmluZywgY2FsbGJhY2s6IHN0cmluZywgYXJnczogYW55W10pIHtcblx0XHR0aGlzLnNlbmRNZXNzYWdlKHtcblx0XHRcdHR5cGU6IFwiY2FsbGJhY2tcIixcblx0XHRcdHBhdGgsXG5cdFx0XHRjYWxsYmFjayxcblx0XHRcdGFyZ3M6IGFyZ3MubWFwKGV4dHJhY3RFdmVudCksXG5cdFx0fSk7XG5cdH1cblxuXHRwdWJsaWMgYWNxdWlyZUNoYW5uZWwoaWQ6IHN0cmluZyk6IENoYW5uZWxCcmlkZ2Uge1xuXHRcdGNvbnN0IGVudHJ5ID0gdGhpcy4jZW5zdXJlQ2hhbm5lbEVudHJ5KGlkKTtcblx0XHRlbnRyeS5yZWZDb3VudCArPSAxO1xuXHRcdHJldHVybiBlbnRyeS5icmlkZ2U7XG5cdH1cblxuXHRwdWJsaWMgcmVsZWFzZUNoYW5uZWwoaWQ6IHN0cmluZyk6IHZvaWQge1xuXHRcdGNvbnN0IGVudHJ5ID0gdGhpcy4jY2hhbm5lbHMuZ2V0KGlkKTtcblx0XHRpZiAoIWVudHJ5KSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGVudHJ5LnJlZkNvdW50ID0gTWF0aC5tYXgoMCwgZW50cnkucmVmQ291bnQgLSAxKTtcblx0XHRpZiAoZW50cnkucmVmQ291bnQgPT09IDApIHtcblx0XHRcdGVudHJ5LmJyaWRnZS5kaXNwb3NlKG5ldyBQdWxzZUNoYW5uZWxSZXNldEVycm9yKFwiQ2hhbm5lbCByZWxlYXNlZFwiKSk7XG5cdFx0XHR0aGlzLiNjaGFubmVscy5kZWxldGUoaWQpO1xuXHRcdH1cblx0fVxuXG5cdCNlbnN1cmVDaGFubmVsRW50cnkoaWQ6IHN0cmluZyk6IHtcblx0XHRicmlkZ2U6IENoYW5uZWxCcmlkZ2U7XG5cdFx0cmVmQ291bnQ6IG51bWJlcjtcblx0fSB7XG5cdFx0bGV0IGVudHJ5ID0gdGhpcy4jY2hhbm5lbHMuZ2V0KGlkKTtcblx0XHRpZiAoIWVudHJ5KSB7XG5cdFx0XHRlbnRyeSA9IHtcblx0XHRcdFx0YnJpZGdlOiBjcmVhdGVDaGFubmVsQnJpZGdlKHRoaXMsIGlkKSxcblx0XHRcdFx0cmVmQ291bnQ6IDAsXG5cdFx0XHR9O1xuXHRcdFx0dGhpcy4jY2hhbm5lbHMuc2V0KGlkLCBlbnRyeSk7XG5cdFx0fVxuXHRcdHJldHVybiBlbnRyeTtcblx0fVxuXG5cdCNyb3V0ZUNoYW5uZWxNZXNzYWdlKG1lc3NhZ2U6IFNlcnZlckNoYW5uZWxNZXNzYWdlKTogdm9pZCB7XG5cdFx0Y29uc3QgZW50cnkgPSB0aGlzLiNlbnN1cmVDaGFubmVsRW50cnkobWVzc2FnZS5jaGFubmVsKTtcblx0XHRjb25zdCBjbG9zZWQgPSBlbnRyeS5icmlkZ2UuaGFuZGxlU2VydmVyTWVzc2FnZShtZXNzYWdlKTtcblx0XHRpZiAoY2xvc2VkICYmIGVudHJ5LnJlZkNvdW50ID09PSAwKSB7XG5cdFx0XHR0aGlzLiNjaGFubmVscy5kZWxldGUobWVzc2FnZS5jaGFubmVsKTtcblx0XHR9XG5cdH1cblxuXHQjaGFuZGxlVHJhbnNwb3J0RGlzY29ubmVjdCgpOiB2b2lkIHtcblx0XHRmb3IgKGNvbnN0IGVudHJ5IG9mIHRoaXMuI2NoYW5uZWxzLnZhbHVlcygpKSB7XG5cdFx0XHRlbnRyeS5icmlkZ2UuaGFuZGxlRGlzY29ubmVjdChuZXcgUHVsc2VDaGFubmVsUmVzZXRFcnJvcihcIkNvbm5lY3Rpb24gbG9zdFwiKSk7XG5cdFx0fVxuXHR9XG59XG4iLAogICAgInR5cGUgU2ltcGxpZnk8VD4gPSB7IFtLIGluIGtleW9mIFRdOiBUW0tdIH0gJiB7fTtcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUV4dHJhY3RvcjxUIGV4dGVuZHMgb2JqZWN0PigpIHtcblx0ZnVuY3Rpb24gX2NyZWF0ZUV4dHJhY3Rvcjxcblx0XHRjb25zdCBLIGV4dGVuZHMgcmVhZG9ubHkgKGtleW9mIFQpW10sXG5cdFx0QyBleHRlbmRzIFBhcnRpYWw8UmVjb3JkPEtbbnVtYmVyXSB8IHN0cmluZywgKHNyYzogVCkgPT4gYW55Pj4sXG5cdD4oa2V5czogSywgY29tcHV0ZWQ/OiBDKSB7XG5cdFx0cmV0dXJuIChcblx0XHRcdHNyYzogVCxcblx0XHQpOiBTaW1wbGlmeTxcblx0XHRcdFBpY2s8VCwgS1tudW1iZXJdPiAmIHtcblx0XHRcdFx0W1AgaW4ga2V5b2YgQ10tPzogQ1tQXSBleHRlbmRzICguLi5hcmdzOiBhbnkpID0+IGluZmVyIFIgPyBSIDogbmV2ZXI7XG5cdFx0XHR9XG5cdFx0PiA9PiB7XG5cdFx0XHRjb25zdCBvdXQ6IGFueSA9IHt9O1xuXHRcdFx0Zm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuXHRcdFx0XHRvdXRba2V5IGFzIHN0cmluZ10gPSAoc3JjIGFzIGFueSlba2V5IGFzIHN0cmluZ107XG5cdFx0XHR9XG5cdFx0XHRpZiAoY29tcHV0ZWQpIHtcblx0XHRcdFx0Zm9yIChjb25zdCBrZXkgaW4gY29tcHV0ZWQpIHtcblx0XHRcdFx0XHRjb25zdCBmbiA9IGNvbXB1dGVkW2tleV0hO1xuXHRcdFx0XHRcdG91dFtrZXldID0gZm4oc3JjKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG91dDtcblx0XHR9O1xuXHR9XG5cdHJldHVybiBfY3JlYXRlRXh0cmFjdG9yO1xufVxuIiwKICAgICJpbXBvcnQgeyBjcmVhdGVFeHRyYWN0b3IgfSBmcm9tIFwiLi9leHRyYWN0b3JcIjtcblxuLy8gQmFzZSBleHRyYWN0b3JzIChjYW1lbENhc2UpIHNpbWlsYXIgdG8gZXZlbnRzLnRzIHN0eWxlXG5jb25zdCBsb3dlclRhZ05hbWUgPSAoZTogRWxlbWVudCkgPT4gZS50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbmNvbnN0IEVMRU1FTlRfS0VZUyA9IFtcblx0XCJpZFwiLFxuXHRcImNsYXNzTmFtZVwiLFxuXHRcInRhZ05hbWVcIixcblx0XCJsb2NhbE5hbWVcIixcblx0XCJjbGllbnRIZWlnaHRcIixcblx0XCJjbGllbnRMZWZ0XCIsXG5cdFwiY2xpZW50VG9wXCIsXG5cdFwiY2xpZW50V2lkdGhcIixcblx0XCJzY3JvbGxIZWlnaHRcIixcblx0XCJzY3JvbGxMZWZ0XCIsXG5cdFwic2Nyb2xsVG9wXCIsXG5cdFwic2Nyb2xsV2lkdGhcIixcblx0XCJzbG90XCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgRWxlbWVudClbXTtcblxuY29uc3QgSFRNTF9PUl9TVkdfS0VZUyA9IFtcblx0XCJhdXRvZm9jdXNcIixcblx0XCJ0YWJJbmRleFwiLFxuXHRcIm5vbmNlXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTE9yU1ZHRWxlbWVudClbXTtcblxuY29uc3QgSFRNTF9FTEVNRU5UX0JBU0VfS0VZUyA9IFtcblx0XCJhY2Nlc3NLZXlcIixcblx0XCJhY2Nlc3NLZXlMYWJlbFwiLFxuXHRcImF1dG9jYXBpdGFsaXplXCIsXG5cdFwiZGlyXCIsXG5cdFwiZHJhZ2dhYmxlXCIsXG5cdFwiaGlkZGVuXCIsXG5cdFwiaW5lcnRcIixcblx0XCJsYW5nXCIsXG5cdFwib2Zmc2V0SGVpZ2h0XCIsXG5cdFwib2Zmc2V0TGVmdFwiLFxuXHRcIm9mZnNldFRvcFwiLFxuXHRcIm9mZnNldFdpZHRoXCIsXG5cdFwicG9wb3ZlclwiLFxuXHRcInNwZWxsY2hlY2tcIixcblx0XCJ0aXRsZVwiLFxuXHRcInRyYW5zbGF0ZVwiLFxuXHRcIndyaXRpbmdTdWdnZXN0aW9uc1wiLFxuXHRcImNvbnRlbnRFZGl0YWJsZVwiLFxuXHRcImVudGVyS2V5SGludFwiLFxuXHRcImlzQ29udGVudEVkaXRhYmxlXCIsXG5cdFwiaW5wdXRNb2RlXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTEVsZW1lbnQpW107XG5cbmNvbnN0IGV4dHJhY3RFbGVtZW50ID0gY3JlYXRlRXh0cmFjdG9yPEVsZW1lbnQ+KCkoRUxFTUVOVF9LRVlTLCB7XG5cdHRhZ05hbWU6IGxvd2VyVGFnTmFtZSxcbn0pO1xuXG5jb25zdCBleHRyYWN0SFRNTE9yU1ZHRWxlbWVudCA9IGNyZWF0ZUV4dHJhY3RvcjxIVE1MT3JTVkdFbGVtZW50PigpKEhUTUxfT1JfU1ZHX0tFWVMpO1xuXG5jb25zdCBleHRyYWN0SFRNTEVsZW1lbnRCYXNlT25seSA9IGNyZWF0ZUV4dHJhY3RvcjxIVE1MRWxlbWVudD4oKShIVE1MX0VMRU1FTlRfQkFTRV9LRVlTKTtcblxuZnVuY3Rpb24gZXh0cmFjdEhUTUxFbGVtZW50QmFzZShlbHQ6IEhUTUxFbGVtZW50KSB7XG5cdHJldHVybiB7XG5cdFx0Li4uZXh0cmFjdEVsZW1lbnQoZWx0KSxcblx0XHQuLi5leHRyYWN0SFRNTE9yU1ZHRWxlbWVudChlbHQgYXMgSFRNTE9yU1ZHRWxlbWVudCksXG5cdFx0Li4uZXh0cmFjdEhUTUxFbGVtZW50QmFzZU9ubHkoZWx0KSxcblx0fTtcbn1cblxuLy8gSGVscGVyIHRvIGNvbXBvc2UgcGVyLWVsZW1lbnQgZXh0cmFjdG9ycyB3aXRoIHRoZSBzaGFyZWQgYmFzZVxuZnVuY3Rpb24gd2l0aEJhc2U8VCBleHRlbmRzIEhUTUxFbGVtZW50Pihcblx0a2V5czogcmVhZG9ubHkgKGtleW9mIFQpW10sXG5cdGNvbXB1dGVkPzogUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCAoc3JjOiBUKSA9PiBhbnk+Pixcbikge1xuXHRjb25zdCBvbmx5ID0gY3JlYXRlRXh0cmFjdG9yPFQ+KCkoa2V5cywgY29tcHV0ZWQgYXMgYW55KTtcblx0cmV0dXJuIChlbHQ6IFQpID0+ICh7IC4uLmV4dHJhY3RIVE1MRWxlbWVudEJhc2UoZWx0KSwgLi4ub25seShlbHQpIH0pO1xufVxuXG5jb25zdCBIVE1MX0FOQ0hPUl9LRVlTID0gW1xuXHRcImhhc2hcIixcblx0XCJob3N0XCIsXG5cdFwiaG9zdG5hbWVcIixcblx0XCJocmVmXCIsXG5cdFwib3JpZ2luXCIsXG5cdFwicGFzc3dvcmRcIixcblx0XCJwYXRobmFtZVwiLFxuXHRcInBvcnRcIixcblx0XCJwcm90b2NvbFwiLFxuXHRcInNlYXJjaFwiLFxuXHRcInRhcmdldFwiLFxuXHRcImRvd25sb2FkXCIsXG5cdFwicmVsXCIsXG5cdFwiaHJlZmxhbmdcIixcblx0XCJ0eXBlXCIsXG5cdFwidXNlcm5hbWVcIixcblx0XCJwaW5nXCIsXG5cdFwicmVmZXJyZXJQb2xpY3lcIixcblx0XCJ0ZXh0XCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTEFuY2hvckVsZW1lbnQpW107XG5jb25zdCBhbmNob3JFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MQW5jaG9yRWxlbWVudD4oSFRNTF9BTkNIT1JfS0VZUyk7XG5cbmNvbnN0IEhUTUxfQVJFQV9LRVlTID0gW1xuXHRcImFsdFwiLFxuXHRcImNvb3Jkc1wiLFxuXHRcImRvd25sb2FkXCIsXG5cdFwiaGFzaFwiLFxuXHRcImhvc3RcIixcblx0XCJob3N0bmFtZVwiLFxuXHRcImhyZWZcIixcblx0XCJvcmlnaW5cIixcblx0XCJwYXNzd29yZFwiLFxuXHRcInBhdGhuYW1lXCIsXG5cdFwicG9ydFwiLFxuXHRcInByb3RvY29sXCIsXG5cdFwicmVsXCIsXG5cdFwic2VhcmNoXCIsXG5cdFwic2hhcGVcIixcblx0XCJ0YXJnZXRcIixcblx0XCJ1c2VybmFtZVwiLFxuXHRcInBpbmdcIixcblx0XCJyZWZlcnJlclBvbGljeVwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxBcmVhRWxlbWVudClbXTtcbmNvbnN0IGFyZWFFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MQXJlYUVsZW1lbnQ+KEhUTUxfQVJFQV9LRVlTKTtcblxuY29uc3QgSFRNTF9NRURJQV9LRVlTID0gW1xuXHRcImF1dG9wbGF5XCIsXG5cdFwiY29udHJvbHNcIixcblx0XCJjcm9zc09yaWdpblwiLFxuXHRcImN1cnJlbnRTcmNcIixcblx0XCJjdXJyZW50VGltZVwiLFxuXHRcImRlZmF1bHRNdXRlZFwiLFxuXHRcImRlZmF1bHRQbGF5YmFja1JhdGVcIixcblx0XCJkdXJhdGlvblwiLFxuXHRcImVuZGVkXCIsXG5cdFwibG9vcFwiLFxuXHRcIm11dGVkXCIsXG5cdFwibmV0d29ya1N0YXRlXCIsXG5cdFwicGF1c2VkXCIsXG5cdFwicGxheWJhY2tSYXRlXCIsXG5cdFwicHJlbG9hZFwiLFxuXHRcInJlYWR5U3RhdGVcIixcblx0XCJzZWVraW5nXCIsXG5cdFwic3JjXCIsXG5cdFwidm9sdW1lXCIsXG5cdFwicHJlc2VydmVzUGl0Y2hcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MTWVkaWFFbGVtZW50KVtdO1xuY29uc3QgbWVkaWFFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MTWVkaWFFbGVtZW50PihIVE1MX01FRElBX0tFWVMpO1xuXG5jb25zdCBhdWRpb0V4dHJhY3RvciA9IChlbHQ6IEhUTUxBdWRpb0VsZW1lbnQpID0+IG1lZGlhRXh0cmFjdG9yKGVsdCk7XG5cbmNvbnN0IEhUTUxfQlVUVE9OX0tFWVMgPSBbXG5cdFwiZGlzYWJsZWRcIixcblx0XCJuYW1lXCIsXG5cdFwidHlwZVwiLFxuXHRcInZhbHVlXCIsXG5cdFwiZm9ybUFjdGlvblwiLFxuXHRcImZvcm1FbmN0eXBlXCIsXG5cdFwiZm9ybU1ldGhvZFwiLFxuXHRcImZvcm1Ob1ZhbGlkYXRlXCIsXG5cdFwiZm9ybVRhcmdldFwiLFxuXHRcInBvcG92ZXJUYXJnZXRBY3Rpb25cIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MQnV0dG9uRWxlbWVudClbXTtcbmNvbnN0IGJ1dHRvbkV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxCdXR0b25FbGVtZW50PihIVE1MX0JVVFRPTl9LRVlTKTtcblxuY29uc3QgSFRNTF9EQVRBX0tFWVMgPSBbXCJ2YWx1ZVwiXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxEYXRhRWxlbWVudClbXTtcbmNvbnN0IGRhdGFFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MRGF0YUVsZW1lbnQ+KEhUTUxfREFUQV9LRVlTKTtcblxuY29uc3QgSFRNTF9FTUJFRF9LRVlTID0gW1xuXHRcImhlaWdodFwiLFxuXHRcInNyY1wiLFxuXHRcInR5cGVcIixcblx0XCJ3aWR0aFwiLFxuXHRcImFsaWduXCIsXG5cdFwibmFtZVwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxFbWJlZEVsZW1lbnQpW107XG5jb25zdCBlbWJlZEV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxFbWJlZEVsZW1lbnQ+KEhUTUxfRU1CRURfS0VZUyk7XG5cbmNvbnN0IEhUTUxfRklFTERTRVRfS0VZUyA9IFtcblx0XCJkaXNhYmxlZFwiLFxuXHRcIm5hbWVcIixcblx0XCJ0eXBlXCIsXG5cdFwidmFsaWRhdGlvbk1lc3NhZ2VcIixcblx0XCJ3aWxsVmFsaWRhdGVcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MRmllbGRTZXRFbGVtZW50KVtdO1xuY29uc3QgZmllbGRzZXRFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MRmllbGRTZXRFbGVtZW50PihIVE1MX0ZJRUxEU0VUX0tFWVMpO1xuXG5jb25zdCBIVE1MX0ZPUk1fS0VZUyA9IFtcblx0XCJhY2NlcHRDaGFyc2V0XCIsXG5cdFwiYWN0aW9uXCIsXG5cdFwiYXV0b2NvbXBsZXRlXCIsXG5cdFwiZW5jb2RpbmdcIixcblx0XCJlbmN0eXBlXCIsXG5cdFwibGVuZ3RoXCIsXG5cdFwibWV0aG9kXCIsXG5cdFwibmFtZVwiLFxuXHRcIm5vVmFsaWRhdGVcIixcblx0XCJ0YXJnZXRcIixcblx0XCJyZWxcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MRm9ybUVsZW1lbnQpW107XG5jb25zdCBmb3JtRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTEZvcm1FbGVtZW50PihIVE1MX0ZPUk1fS0VZUyk7XG5cbmNvbnN0IEhUTUxfSUZSQU1FX0tFWVMgPSBbXG5cdFwiYWxsb3dcIixcblx0XCJhbGxvd0Z1bGxzY3JlZW5cIixcblx0XCJoZWlnaHRcIixcblx0XCJuYW1lXCIsXG5cdFwicmVmZXJyZXJQb2xpY3lcIixcblx0XCJzcmNcIixcblx0XCJzcmNkb2NcIixcblx0XCJ3aWR0aFwiLFxuXHRcImFsaWduXCIsXG5cdFwiZnJhbWVCb3JkZXJcIixcblx0XCJsb25nRGVzY1wiLFxuXHRcIm1hcmdpbkhlaWdodFwiLFxuXHRcIm1hcmdpbldpZHRoXCIsXG5cdFwic2Nyb2xsaW5nXCIsXG5cdFwic2FuZGJveFwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxJRnJhbWVFbGVtZW50KVtdO1xuY29uc3QgaWZyYW1lRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTElGcmFtZUVsZW1lbnQ+KEhUTUxfSUZSQU1FX0tFWVMpO1xuXG5jb25zdCBIVE1MX0lNQUdFX0tFWVMgPSBbXG5cdFwiYWx0XCIsXG5cdFwiY3Jvc3NPcmlnaW5cIixcblx0XCJkZWNvZGluZ1wiLFxuXHRcImhlaWdodFwiLFxuXHRcImlzTWFwXCIsXG5cdFwibG9hZGluZ1wiLFxuXHRcIm5hdHVyYWxIZWlnaHRcIixcblx0XCJuYXR1cmFsV2lkdGhcIixcblx0XCJyZWZlcnJlclBvbGljeVwiLFxuXHRcInNpemVzXCIsXG5cdFwic3JjXCIsXG5cdFwic3Jjc2V0XCIsXG5cdFwidXNlTWFwXCIsXG5cdFwid2lkdGhcIixcblx0XCJhbGlnblwiLFxuXHRcImJvcmRlclwiLFxuXHRcImNvbXBsZXRlXCIsXG5cdFwiaHNwYWNlXCIsXG5cdFwibG9uZ0Rlc2NcIixcblx0XCJsb3dzcmNcIixcblx0XCJuYW1lXCIsXG5cdFwidnNwYWNlXCIsXG5cdFwieFwiLFxuXHRcInlcIixcblx0XCJmZXRjaFByaW9yaXR5XCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTEltYWdlRWxlbWVudClbXTtcbmNvbnN0IGltYWdlRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTEltYWdlRWxlbWVudD4oSFRNTF9JTUFHRV9LRVlTKTtcblxuY29uc3QgSFRNTF9JTlBVVF9LRVlTID0gW1xuXHRcImFjY2VwdFwiLFxuXHRcImFsdFwiLFxuXHRcImF1dG9jb21wbGV0ZVwiLFxuXHRcImNoZWNrZWRcIixcblx0XCJkZWZhdWx0Q2hlY2tlZFwiLFxuXHRcImRlZmF1bHRWYWx1ZVwiLFxuXHRcImRpck5hbWVcIixcblx0XCJkaXNhYmxlZFwiLFxuXHRcImhlaWdodFwiLFxuXHRcImluZGV0ZXJtaW5hdGVcIixcblx0XCJtYXhcIixcblx0XCJtYXhMZW5ndGhcIixcblx0XCJtaW5cIixcblx0XCJtaW5MZW5ndGhcIixcblx0XCJtdWx0aXBsZVwiLFxuXHRcIm5hbWVcIixcblx0XCJwYXR0ZXJuXCIsXG5cdFwicGxhY2Vob2xkZXJcIixcblx0XCJyZWFkT25seVwiLFxuXHRcInJlcXVpcmVkXCIsXG5cdFwic2VsZWN0aW9uRGlyZWN0aW9uXCIsXG5cdFwic2VsZWN0aW9uRW5kXCIsXG5cdFwic2VsZWN0aW9uU3RhcnRcIixcblx0XCJzaXplXCIsXG5cdFwic3JjXCIsXG5cdFwic3RlcFwiLFxuXHRcInR5cGVcIixcblx0XCJ2YWx1ZVwiLFxuXHRcInZhbHVlQXNOdW1iZXJcIixcblx0XCJ3aWR0aFwiLFxuXHRcImFsaWduXCIsXG5cdFwiY2FwdHVyZVwiLFxuXHRcImZvcm1BY3Rpb25cIixcblx0XCJmb3JtRW5jdHlwZVwiLFxuXHRcImZvcm1NZXRob2RcIixcblx0XCJmb3JtTm9WYWxpZGF0ZVwiLFxuXHRcImZvcm1UYXJnZXRcIixcblx0XCJ1c2VNYXBcIixcblx0XCJ2YWxpZGF0aW9uTWVzc2FnZVwiLFxuXHRcIndpbGxWYWxpZGF0ZVwiLFxuXHRcInBvcG92ZXJUYXJnZXRBY3Rpb25cIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MSW5wdXRFbGVtZW50KVtdO1xuY29uc3QgaW5wdXRFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MSW5wdXRFbGVtZW50PihIVE1MX0lOUFVUX0tFWVMpO1xuXG5jb25zdCBIVE1MX0xBQkVMX0tFWVMgPSBbXCJodG1sRm9yXCJdIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTExhYmVsRWxlbWVudClbXTtcbmNvbnN0IGxhYmVsRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTExhYmVsRWxlbWVudD4oSFRNTF9MQUJFTF9LRVlTKTtcblxuY29uc3QgSFRNTF9MSV9LRVlTID0gW1widmFsdWVcIiwgXCJ0eXBlXCJdIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTExJRWxlbWVudClbXTtcbmNvbnN0IGxpRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTExJRWxlbWVudD4oSFRNTF9MSV9LRVlTKTtcblxuY29uc3QgSFRNTF9MSU5LX0tFWVMgPSBbXG5cdFwiYXNcIixcblx0XCJjcm9zc09yaWdpblwiLFxuXHRcImRpc2FibGVkXCIsXG5cdFwiZmV0Y2hQcmlvcml0eVwiLFxuXHRcImhyZWZcIixcblx0XCJocmVmbGFuZ1wiLFxuXHRcImltYWdlU2l6ZXNcIixcblx0XCJpbWFnZVNyY3NldFwiLFxuXHRcImludGVncml0eVwiLFxuXHRcIm1lZGlhXCIsXG5cdFwicmVmZXJyZXJQb2xpY3lcIixcblx0XCJyZWxcIixcblx0XCJ0eXBlXCIsXG5cdFwiY2hhcnNldFwiLFxuXHRcInJldlwiLFxuXHRcInRhcmdldFwiLFxuXHRcInNpemVzXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTExpbmtFbGVtZW50KVtdO1xuY29uc3QgbGlua0V4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxMaW5rRWxlbWVudD4oSFRNTF9MSU5LX0tFWVMpO1xuXG5jb25zdCBIVE1MX01BUF9LRVlTID0gW1wibmFtZVwiXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxNYXBFbGVtZW50KVtdO1xuY29uc3QgbWFwRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTE1hcEVsZW1lbnQ+KEhUTUxfTUFQX0tFWVMpO1xuXG5jb25zdCBIVE1MX01FVEVSX0tFWVMgPSBbXG5cdFwiaGlnaFwiLFxuXHRcImxvd1wiLFxuXHRcIm1heFwiLFxuXHRcIm1pblwiLFxuXHRcIm9wdGltdW1cIixcblx0XCJ2YWx1ZVwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxNZXRlckVsZW1lbnQpW107XG5jb25zdCBtZXRlckV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxNZXRlckVsZW1lbnQ+KEhUTUxfTUVURVJfS0VZUyk7XG5cbmNvbnN0IEhUTUxfTU9EX0tFWVMgPSBbXCJjaXRlXCIsIFwiZGF0ZVRpbWVcIl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MTW9kRWxlbWVudClbXTtcbmNvbnN0IG1vZEV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxNb2RFbGVtZW50PihIVE1MX01PRF9LRVlTKTtcblxuY29uc3QgSFRNTF9PTF9LRVlTID0gW1xuXHRcInJldmVyc2VkXCIsXG5cdFwic3RhcnRcIixcblx0XCJ0eXBlXCIsXG5cdFwiY29tcGFjdFwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxPTGlzdEVsZW1lbnQpW107XG5jb25zdCBvbGlzdEV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxPTGlzdEVsZW1lbnQ+KEhUTUxfT0xfS0VZUyk7XG5cbmNvbnN0IEhUTUxfT0JKRUNUX0tFWVMgPSBbXG5cdFwiZGF0YVwiLFxuXHRcImhlaWdodFwiLFxuXHRcIm5hbWVcIixcblx0XCJ0eXBlXCIsXG5cdFwidXNlTWFwXCIsXG5cdFwid2lkdGhcIixcblx0XCJ2YWxpZGF0aW9uTWVzc2FnZVwiLFxuXHRcIndpbGxWYWxpZGF0ZVwiLFxuXHRcImFsaWduXCIsXG5cdFwiYXJjaGl2ZVwiLFxuXHRcImJvcmRlclwiLFxuXHRcImNvZGVcIixcblx0XCJjb2RlQmFzZVwiLFxuXHRcImNvZGVUeXBlXCIsXG5cdFwiZGVjbGFyZVwiLFxuXHRcImhzcGFjZVwiLFxuXHRcInN0YW5kYnlcIixcblx0XCJ2c3BhY2VcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MT2JqZWN0RWxlbWVudClbXTtcbmNvbnN0IG9iamVjdEV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxPYmplY3RFbGVtZW50PihIVE1MX09CSkVDVF9LRVlTKTtcblxuY29uc3QgSFRNTF9PUFRHUk9VUF9LRVlTID0gW1xuXHRcImRpc2FibGVkXCIsXG5cdFwibGFiZWxcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MT3B0R3JvdXBFbGVtZW50KVtdO1xuY29uc3Qgb3B0Z3JvdXBFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MT3B0R3JvdXBFbGVtZW50PihIVE1MX09QVEdST1VQX0tFWVMpO1xuXG5jb25zdCBIVE1MX09QVElPTl9LRVlTID0gW1xuXHRcImRlZmF1bHRTZWxlY3RlZFwiLFxuXHRcImRpc2FibGVkXCIsXG5cdFwiaW5kZXhcIixcblx0XCJsYWJlbFwiLFxuXHRcInNlbGVjdGVkXCIsXG5cdFwidGV4dFwiLFxuXHRcInZhbHVlXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTE9wdGlvbkVsZW1lbnQpW107XG5jb25zdCBvcHRpb25FeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MT3B0aW9uRWxlbWVudD4oSFRNTF9PUFRJT05fS0VZUyk7XG5cbmNvbnN0IEhUTUxfT1VUUFVUX0tFWVMgPSBbXG5cdFwiZGVmYXVsdFZhbHVlXCIsXG5cdFwibmFtZVwiLFxuXHRcInR5cGVcIixcblx0XCJ2YWx1ZVwiLFxuXHRcImh0bWxGb3JcIixcblx0XCJ2YWxpZGF0aW9uTWVzc2FnZVwiLFxuXHRcIndpbGxWYWxpZGF0ZVwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxPdXRwdXRFbGVtZW50KVtdO1xuY29uc3Qgb3V0cHV0RXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTE91dHB1dEVsZW1lbnQ+KEhUTUxfT1VUUFVUX0tFWVMpO1xuXG5jb25zdCBIVE1MX1BST0dSRVNTX0tFWVMgPSBbXG5cdFwibWF4XCIsXG5cdFwicG9zaXRpb25cIixcblx0XCJ2YWx1ZVwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxQcm9ncmVzc0VsZW1lbnQpW107XG5jb25zdCBwcm9ncmVzc0V4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxQcm9ncmVzc0VsZW1lbnQ+KEhUTUxfUFJPR1JFU1NfS0VZUyk7XG5cbmNvbnN0IEhUTUxfUVVPVEVfS0VZUyA9IFtcImNpdGVcIl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MUXVvdGVFbGVtZW50KVtdO1xuY29uc3QgcXVvdGVFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MUXVvdGVFbGVtZW50PihIVE1MX1FVT1RFX0tFWVMpO1xuXG5jb25zdCBjaXRlRXh0cmFjdG9yID0gKGVsdDogSFRNTEVsZW1lbnQpID0+IGV4dHJhY3RIVE1MRWxlbWVudEJhc2UoZWx0KTtcblxuY29uc3QgSFRNTF9TQ1JJUFRfS0VZUyA9IFtcblx0XCJhc3luY1wiLFxuXHRcImNyb3NzT3JpZ2luXCIsXG5cdFwiZGVmZXJcIixcblx0XCJmZXRjaFByaW9yaXR5XCIsXG5cdFwiaW50ZWdyaXR5XCIsXG5cdFwibm9Nb2R1bGVcIixcblx0XCJyZWZlcnJlclBvbGljeVwiLFxuXHRcInNyY1wiLFxuXHRcInRleHRcIixcblx0XCJ0eXBlXCIsXG5cdFwiY2hhcnNldFwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxTY3JpcHRFbGVtZW50KVtdO1xuY29uc3QgZXh0cmFjdEhUTUxTY3JpcHRPbmx5ID0gY3JlYXRlRXh0cmFjdG9yPEhUTUxTY3JpcHRFbGVtZW50PigpKEhUTUxfU0NSSVBUX0tFWVMsIHtcblx0ZXZlbnQ6IChzKSA9PiAocyBhcyBhbnkpLmV2ZW50LFxuXHRodG1sRm9yOiAocykgPT4gKHMgYXMgYW55KS5odG1sRm9yLFxufSk7XG5jb25zdCBzY3JpcHRFeHRyYWN0b3IgPSAoZWx0OiBIVE1MU2NyaXB0RWxlbWVudCkgPT4gKHtcblx0Li4uZXh0cmFjdEhUTUxFbGVtZW50QmFzZShlbHQpLFxuXHQuLi5leHRyYWN0SFRNTFNjcmlwdE9ubHkoZWx0KSxcbn0pO1xuXG5jb25zdCBIVE1MX1NFTEVDVF9LRVlTID0gW1xuXHRcImF1dG9jb21wbGV0ZVwiLFxuXHRcImRpc2FibGVkXCIsXG5cdFwibGVuZ3RoXCIsXG5cdFwibXVsdGlwbGVcIixcblx0XCJuYW1lXCIsXG5cdFwicmVxdWlyZWRcIixcblx0XCJzZWxlY3RlZEluZGV4XCIsXG5cdFwic2l6ZVwiLFxuXHRcInR5cGVcIixcblx0XCJ2YWx1ZVwiLFxuXHRcInZhbGlkYXRpb25NZXNzYWdlXCIsXG5cdFwid2lsbFZhbGlkYXRlXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTFNlbGVjdEVsZW1lbnQpW107XG5jb25zdCBzZWxlY3RFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MU2VsZWN0RWxlbWVudD4oSFRNTF9TRUxFQ1RfS0VZUyk7XG5cbmNvbnN0IEhUTUxfU0xPVF9LRVlTID0gW1wibmFtZVwiXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxTbG90RWxlbWVudClbXTtcbmNvbnN0IHNsb3RFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MU2xvdEVsZW1lbnQ+KEhUTUxfU0xPVF9LRVlTKTtcblxuY29uc3QgSFRNTF9TT1VSQ0VfS0VZUyA9IFtcblx0XCJoZWlnaHRcIixcblx0XCJtZWRpYVwiLFxuXHRcInNpemVzXCIsXG5cdFwic3JjXCIsXG5cdFwic3Jjc2V0XCIsXG5cdFwidHlwZVwiLFxuXHRcIndpZHRoXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTFNvdXJjZUVsZW1lbnQpW107XG5jb25zdCBzb3VyY2VFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MU291cmNlRWxlbWVudD4oSFRNTF9TT1VSQ0VfS0VZUyk7XG5cbmNvbnN0IEhUTUxfVEFCTEVfQ0FQVElPTl9LRVlTID0gW1xuXHRcImFsaWduXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTFRhYmxlQ2FwdGlvbkVsZW1lbnQpW107XG5jb25zdCB0YWJsZUNhcHRpb25FeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MVGFibGVDYXB0aW9uRWxlbWVudD4oSFRNTF9UQUJMRV9DQVBUSU9OX0tFWVMpO1xuXG5jb25zdCBIVE1MX1RBQkxFX0NFTExfS0VZUyA9IFtcblx0XCJhYmJyXCIsXG5cdFwiY2VsbEluZGV4XCIsXG5cdFwiY29sU3BhblwiLFxuXHRcImhlYWRlcnNcIixcblx0XCJyb3dTcGFuXCIsXG5cdFwic2NvcGVcIixcblx0XCJhbGlnblwiLFxuXHRcImF4aXNcIixcblx0XCJiZ0NvbG9yXCIsXG5cdFwiY2hcIixcblx0XCJjaE9mZlwiLFxuXHRcImhlaWdodFwiLFxuXHRcIm5vV3JhcFwiLFxuXHRcInZBbGlnblwiLFxuXHRcIndpZHRoXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTFRhYmxlQ2VsbEVsZW1lbnQpW107XG5jb25zdCB0YWJsZUNlbGxFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MVGFibGVDZWxsRWxlbWVudD4oSFRNTF9UQUJMRV9DRUxMX0tFWVMpO1xuXG5jb25zdCBIVE1MX1RBQkxFX0NPTF9LRVlTID0gW1xuXHRcInNwYW5cIixcblx0XCJhbGlnblwiLFxuXHRcImNoXCIsXG5cdFwiY2hPZmZcIixcblx0XCJ2QWxpZ25cIixcblx0XCJ3aWR0aFwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxUYWJsZUNvbEVsZW1lbnQpW107XG5jb25zdCB0YWJsZUNvbEV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxUYWJsZUNvbEVsZW1lbnQ+KEhUTUxfVEFCTEVfQ09MX0tFWVMpO1xuXG5jb25zdCBIVE1MX1RBQkxFX0tFWVMgPSBbXG5cdFwiYWxpZ25cIixcblx0XCJiZ0NvbG9yXCIsXG5cdFwiYm9yZGVyXCIsXG5cdFwiY2VsbFBhZGRpbmdcIixcblx0XCJjZWxsU3BhY2luZ1wiLFxuXHRcImZyYW1lXCIsXG5cdFwicnVsZXNcIixcblx0XCJzdW1tYXJ5XCIsXG5cdFwid2lkdGhcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MVGFibGVFbGVtZW50KVtdO1xuY29uc3QgdGFibGVFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MVGFibGVFbGVtZW50PihIVE1MX1RBQkxFX0tFWVMpO1xuXG5jb25zdCBIVE1MX1RSX0tFWVMgPSBbXG5cdFwicm93SW5kZXhcIixcblx0XCJzZWN0aW9uUm93SW5kZXhcIixcblx0XCJhbGlnblwiLFxuXHRcImJnQ29sb3JcIixcblx0XCJjaFwiLFxuXHRcImNoT2ZmXCIsXG5cdFwidkFsaWduXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTFRhYmxlUm93RWxlbWVudClbXTtcbmNvbnN0IHRhYmxlUm93RXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTFRhYmxlUm93RWxlbWVudD4oSFRNTF9UUl9LRVlTKTtcblxuY29uc3QgSFRNTF9UU0VDVElPTl9LRVlTID0gW1xuXHRcImFsaWduXCIsXG5cdFwiY2hcIixcblx0XCJjaE9mZlwiLFxuXHRcInZBbGlnblwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50KVtdO1xuY29uc3QgdGFibGVTZWN0aW9uRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQ+KEhUTUxfVFNFQ1RJT05fS0VZUyk7XG5cbmNvbnN0IHRlbXBsYXRlRXh0cmFjdG9yID0gKGVsdDogSFRNTFRlbXBsYXRlRWxlbWVudCkgPT4gZXh0cmFjdEhUTUxFbGVtZW50QmFzZShlbHQpO1xuXG5jb25zdCBIVE1MX1RFWFRBUkVBX0tFWVMgPSBbXG5cdFwiYXV0b2NvbXBsZXRlXCIsXG5cdFwiY29sc1wiLFxuXHRcImRlZmF1bHRWYWx1ZVwiLFxuXHRcImRpck5hbWVcIixcblx0XCJkaXNhYmxlZFwiLFxuXHRcIm1heExlbmd0aFwiLFxuXHRcIm1pbkxlbmd0aFwiLFxuXHRcIm5hbWVcIixcblx0XCJwbGFjZWhvbGRlclwiLFxuXHRcInJlYWRPbmx5XCIsXG5cdFwicmVxdWlyZWRcIixcblx0XCJyb3dzXCIsXG5cdFwic2VsZWN0aW9uRGlyZWN0aW9uXCIsXG5cdFwic2VsZWN0aW9uRW5kXCIsXG5cdFwic2VsZWN0aW9uU3RhcnRcIixcblx0XCJ2YWx1ZVwiLFxuXHRcIndyYXBcIixcblx0XCJ0ZXh0TGVuZ3RoXCIsXG5cdFwidmFsaWRhdGlvbk1lc3NhZ2VcIixcblx0XCJ3aWxsVmFsaWRhdGVcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MVGV4dEFyZWFFbGVtZW50KVtdO1xuY29uc3QgdGV4dGFyZWFFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MVGV4dEFyZWFFbGVtZW50PihIVE1MX1RFWFRBUkVBX0tFWVMpO1xuXG5jb25zdCBIVE1MX1RJTUVfS0VZUyA9IFtcImRhdGVUaW1lXCJdIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTFRpbWVFbGVtZW50KVtdO1xuY29uc3QgdGltZUV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxUaW1lRWxlbWVudD4oSFRNTF9USU1FX0tFWVMpO1xuXG5jb25zdCBIVE1MX1RSQUNLX0tFWVMgPSBbXG5cdFwiZGVmYXVsdFwiLFxuXHRcImtpbmRcIixcblx0XCJsYWJlbFwiLFxuXHRcInJlYWR5U3RhdGVcIixcblx0XCJzcmNcIixcblx0XCJzcmNsYW5nXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTFRyYWNrRWxlbWVudClbXTtcbmNvbnN0IHRyYWNrRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTFRyYWNrRWxlbWVudD4oSFRNTF9UUkFDS19LRVlTKTtcblxuY29uc3QgSFRNTF9WSURFT19LRVlTID0gW1xuXHRcImhlaWdodFwiLFxuXHRcInBvc3RlclwiLFxuXHRcInZpZGVvSGVpZ2h0XCIsXG5cdFwidmlkZW9XaWR0aFwiLFxuXHRcIndpZHRoXCIsXG5cdFwicGxheXNJbmxpbmVcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MVmlkZW9FbGVtZW50KVtdO1xuY29uc3QgZXh0cmFjdEhUTUxWaWRlb09ubHkgPSBjcmVhdGVFeHRyYWN0b3I8SFRNTFZpZGVvRWxlbWVudD4oKShIVE1MX1ZJREVPX0tFWVMpO1xuY29uc3QgdmlkZW9FeHRyYWN0b3IgPSAoZWx0OiBIVE1MVmlkZW9FbGVtZW50KSA9PiAoe1xuXHQuLi5tZWRpYUV4dHJhY3RvcihlbHQpLFxuXHQuLi5leHRyYWN0SFRNTFZpZGVvT25seShlbHQpLFxufSk7XG5cbmNvbnN0IEhUTUxfQlJfS0VZUyA9IFtcImNsZWFyXCJdIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTEJSRWxlbWVudClbXTtcbmNvbnN0IGJyRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTEJSRWxlbWVudD4oSFRNTF9CUl9LRVlTKTtcblxuY29uc3QgSFRNTF9CQVNFX0tFWVMgPSBbXCJocmVmXCIsIFwidGFyZ2V0XCJdIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTEJhc2VFbGVtZW50KVtdO1xuY29uc3QgYmFzZUV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxCYXNlRWxlbWVudD4oSFRNTF9CQVNFX0tFWVMpO1xuXG5jb25zdCBIVE1MX0JPRFlfS0VZUyA9IFtcblx0XCJhTGlua1wiLFxuXHRcImJhY2tncm91bmRcIixcblx0XCJiZ0NvbG9yXCIsXG5cdFwibGlua1wiLFxuXHRcInRleHRcIixcblx0XCJ2TGlua1wiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxCb2R5RWxlbWVudClbXTtcbmNvbnN0IGJvZHlFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MQm9keUVsZW1lbnQ+KEhUTUxfQk9EWV9LRVlTKTtcblxuY29uc3QgSFRNTF9ETElTVF9LRVlTID0gW1wiY29tcGFjdFwiXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxETGlzdEVsZW1lbnQpW107XG5jb25zdCBkbGlzdEV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxETGlzdEVsZW1lbnQ+KEhUTUxfRExJU1RfS0VZUyk7XG5cbmNvbnN0IEhUTUxfREVUQUlMU19LRVlTID0gW1wib3BlblwiXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxEZXRhaWxzRWxlbWVudClbXTtcbmNvbnN0IGRldGFpbHNFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MRGV0YWlsc0VsZW1lbnQ+KEhUTUxfREVUQUlMU19LRVlTKTtcblxuY29uc3QgSFRNTF9ESUFMT0dfS0VZUyA9IFtcblx0XCJvcGVuXCIsXG5cdFwicmV0dXJuVmFsdWVcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MRGlhbG9nRWxlbWVudClbXTtcbmNvbnN0IGRpYWxvZ0V4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxEaWFsb2dFbGVtZW50PihIVE1MX0RJQUxPR19LRVlTKTtcblxuY29uc3QgSFRNTF9ESVZfS0VZUyA9IFtcImFsaWduXCJdIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTERpdkVsZW1lbnQpW107XG5jb25zdCBkaXZFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MRGl2RWxlbWVudD4oSFRNTF9ESVZfS0VZUyk7XG5cbmNvbnN0IGhlYWRFeHRyYWN0b3IgPSAoZWx0OiBIVE1MSGVhZEVsZW1lbnQpID0+IGV4dHJhY3RIVE1MRWxlbWVudEJhc2UoZWx0KTtcblxuY29uc3QgSFRNTF9IRUFESU5HX0tFWVMgPSBbXCJhbGlnblwiXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxIZWFkaW5nRWxlbWVudClbXTtcbmNvbnN0IGhlYWRpbmdFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MSGVhZGluZ0VsZW1lbnQ+KEhUTUxfSEVBRElOR19LRVlTKTtcblxuY29uc3QgSFRNTF9IUl9LRVlTID0gW1xuXHRcImFsaWduXCIsXG5cdFwiY29sb3JcIixcblx0XCJub1NoYWRlXCIsXG5cdFwic2l6ZVwiLFxuXHRcIndpZHRoXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTEhSRWxlbWVudClbXTtcbmNvbnN0IGhyRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTEhSRWxlbWVudD4oSFRNTF9IUl9LRVlTKTtcblxuY29uc3QgSFRNTF9IVE1MX0tFWVMgPSBbXCJ2ZXJzaW9uXCJdIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTEh0bWxFbGVtZW50KVtdO1xuY29uc3QgaHRtbEV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxIdG1sRWxlbWVudD4oSFRNTF9IVE1MX0tFWVMpO1xuXG5jb25zdCBtZW51RXh0cmFjdG9yID0gKGVsdDogSFRNTE1lbnVFbGVtZW50KSA9PiBleHRyYWN0SFRNTEVsZW1lbnRCYXNlKGVsdCk7XG5cbmNvbnN0IEhUTUxfTUVUQV9LRVlTID0gW1xuXHRcImNvbnRlbnRcIixcblx0XCJodHRwRXF1aXZcIixcblx0XCJuYW1lXCIsXG5cdFwic2NoZW1lXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTE1ldGFFbGVtZW50KVtdO1xuY29uc3QgbWV0YUV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxNZXRhRWxlbWVudD4oSFRNTF9NRVRBX0tFWVMpO1xuXG5jb25zdCBIVE1MX1BfS0VZUyA9IFtcImFsaWduXCJdIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTFBhcmFncmFwaEVsZW1lbnQpW107XG5jb25zdCBwYXJhZ3JhcGhFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MUGFyYWdyYXBoRWxlbWVudD4oSFRNTF9QX0tFWVMpO1xuXG5jb25zdCBwaWN0dXJlRXh0cmFjdG9yID0gKGVsdDogSFRNTFBpY3R1cmVFbGVtZW50KSA9PiBleHRyYWN0SFRNTEVsZW1lbnRCYXNlKGVsdCk7XG5cbmNvbnN0IEhUTUxfUFJFX0tFWVMgPSBbXCJ3aWR0aFwiXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxQcmVFbGVtZW50KVtdO1xuY29uc3QgcHJlRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTFByZUVsZW1lbnQ+KEhUTUxfUFJFX0tFWVMpO1xuXG5jb25zdCBzcGFuRXh0cmFjdG9yID0gKGVsdDogSFRNTFNwYW5FbGVtZW50KSA9PiBleHRyYWN0SFRNTEVsZW1lbnRCYXNlKGVsdCk7XG5cbmNvbnN0IEhUTUxfU1RZTEVfS0VZUyA9IFtcblx0XCJtZWRpYVwiLFxuXHRcInR5cGVcIixcblx0XCJkaXNhYmxlZFwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxTdHlsZUVsZW1lbnQpW107XG5jb25zdCBzdHlsZUV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxTdHlsZUVsZW1lbnQ+KEhUTUxfU1RZTEVfS0VZUyk7XG5cbmNvbnN0IEhUTUxfVElUTEVfS0VZUyA9IFtcInRleHRcIl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MVGl0bGVFbGVtZW50KVtdO1xuY29uc3QgdGl0bGVFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MVGl0bGVFbGVtZW50PihIVE1MX1RJVExFX0tFWVMpO1xuXG5jb25zdCBIVE1MX1VMX0tFWVMgPSBbXCJjb21wYWN0XCIsIFwidHlwZVwiXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxVTGlzdEVsZW1lbnQpW107XG5jb25zdCB1bGlzdEV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxVTGlzdEVsZW1lbnQ+KEhUTUxfVUxfS0VZUyk7XG5cbi8vIE1hcCBvZiB0YWdOYW1lIC0+IGV4dHJhY3RvciAoY29uY2lzZSwgbGlrZSBldmVudHMudHMpXG5jb25zdCBlbGVtZW50RXh0cmFjdG9yczogUmVjb3JkPHN0cmluZywgKGVsdDogYW55KSA9PiBvYmplY3Q+ID0ge1xuXHRBOiBhbmNob3JFeHRyYWN0b3IsXG5cdEFSRUE6IGFyZWFFeHRyYWN0b3IsXG5cdEFVRElPOiBhdWRpb0V4dHJhY3Rvcixcblx0QkFTRTogYmFzZUV4dHJhY3Rvcixcblx0QkxPQ0tRVU9URTogcXVvdGVFeHRyYWN0b3IsXG5cdFE6IHF1b3RlRXh0cmFjdG9yLFxuXHRCT0RZOiBib2R5RXh0cmFjdG9yLFxuXHRCUjogYnJFeHRyYWN0b3IsXG5cdEJVVFRPTjogYnV0dG9uRXh0cmFjdG9yLFxuXHRDQU5WQVM6IGV4dHJhY3RIVE1MRWxlbWVudEJhc2UsXG5cdENBUFRJT046IHRhYmxlQ2FwdGlvbkV4dHJhY3Rvcixcblx0Q0lURTogY2l0ZUV4dHJhY3Rvcixcblx0Q09MOiB0YWJsZUNvbEV4dHJhY3Rvcixcblx0Q09MR1JPVVA6IHRhYmxlQ29sRXh0cmFjdG9yLFxuXHREQVRBOiBkYXRhRXh0cmFjdG9yLFxuXHRERVRBSUxTOiBkZXRhaWxzRXh0cmFjdG9yLFxuXHRESUFMT0c6IGRpYWxvZ0V4dHJhY3Rvcixcblx0RElWOiBkaXZFeHRyYWN0b3IsXG5cdERMOiBkbGlzdEV4dHJhY3Rvcixcblx0RU1CRUQ6IGVtYmVkRXh0cmFjdG9yLFxuXHRGSUVMRFNFVDogZmllbGRzZXRFeHRyYWN0b3IsXG5cdEZPUk06IGZvcm1FeHRyYWN0b3IsXG5cdEgxOiBoZWFkaW5nRXh0cmFjdG9yLFxuXHRIMjogaGVhZGluZ0V4dHJhY3Rvcixcblx0SDM6IGhlYWRpbmdFeHRyYWN0b3IsXG5cdEg0OiBoZWFkaW5nRXh0cmFjdG9yLFxuXHRINTogaGVhZGluZ0V4dHJhY3Rvcixcblx0SDY6IGhlYWRpbmdFeHRyYWN0b3IsXG5cdEhFQUQ6IGhlYWRFeHRyYWN0b3IsXG5cdEhSOiBockV4dHJhY3Rvcixcblx0SFRNTDogaHRtbEV4dHJhY3Rvcixcblx0SUZSQU1FOiBpZnJhbWVFeHRyYWN0b3IsXG5cdElNRzogaW1hZ2VFeHRyYWN0b3IsXG5cdElOUFVUOiBpbnB1dEV4dHJhY3Rvcixcblx0TEFCRUw6IGxhYmVsRXh0cmFjdG9yLFxuXHRMSTogbGlFeHRyYWN0b3IsXG5cdExJTks6IGxpbmtFeHRyYWN0b3IsXG5cdE1BUDogbWFwRXh0cmFjdG9yLFxuXHRNRU5VOiBtZW51RXh0cmFjdG9yLFxuXHRNRVRBOiBtZXRhRXh0cmFjdG9yLFxuXHRNRVRFUjogbWV0ZXJFeHRyYWN0b3IsXG5cdElOUzogbW9kRXh0cmFjdG9yLFxuXHRERUw6IG1vZEV4dHJhY3Rvcixcblx0T0JKRUNUOiBvYmplY3RFeHRyYWN0b3IsXG5cdE9MOiBvbGlzdEV4dHJhY3Rvcixcblx0T1BUR1JPVVA6IG9wdGdyb3VwRXh0cmFjdG9yLFxuXHRPUFRJT046IG9wdGlvbkV4dHJhY3Rvcixcblx0T1VUUFVUOiBvdXRwdXRFeHRyYWN0b3IsXG5cdFA6IHBhcmFncmFwaEV4dHJhY3Rvcixcblx0UElDVFVSRTogcGljdHVyZUV4dHJhY3Rvcixcblx0UFJFOiBwcmVFeHRyYWN0b3IsXG5cdFBST0dSRVNTOiBwcm9ncmVzc0V4dHJhY3Rvcixcblx0U0NSSVBUOiBzY3JpcHRFeHRyYWN0b3IsXG5cdFNFTEVDVDogc2VsZWN0RXh0cmFjdG9yLFxuXHRTTE9UOiBzbG90RXh0cmFjdG9yLFxuXHRTT1VSQ0U6IHNvdXJjZUV4dHJhY3Rvcixcblx0U1BBTjogc3BhbkV4dHJhY3Rvcixcblx0U1RZTEU6IHN0eWxlRXh0cmFjdG9yLFxuXHRUQUJMRTogdGFibGVFeHRyYWN0b3IsXG5cdFRCT0RZOiB0YWJsZVNlY3Rpb25FeHRyYWN0b3IsXG5cdFRIRUFEOiB0YWJsZVNlY3Rpb25FeHRyYWN0b3IsXG5cdFRGT09UOiB0YWJsZVNlY3Rpb25FeHRyYWN0b3IsXG5cdFREOiB0YWJsZUNlbGxFeHRyYWN0b3IsXG5cdFRIOiB0YWJsZUNlbGxFeHRyYWN0b3IsXG5cdFRFTVBMQVRFOiB0ZW1wbGF0ZUV4dHJhY3Rvcixcblx0VEVYVEFSRUE6IHRleHRhcmVhRXh0cmFjdG9yLFxuXHRUSU1FOiB0aW1lRXh0cmFjdG9yLFxuXHRUSVRMRTogdGl0bGVFeHRyYWN0b3IsXG5cdFRSOiB0YWJsZVJvd0V4dHJhY3Rvcixcblx0VFJBQ0s6IHRyYWNrRXh0cmFjdG9yLFxuXHRVTDogdWxpc3RFeHRyYWN0b3IsXG5cdFZJREVPOiB2aWRlb0V4dHJhY3Rvcixcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0SFRNTEVsZW1lbnQoZWx0OiBIVE1MRWxlbWVudCk6IG9iamVjdCB7XG5cdGNvbnN0IHRhZ05hbWUgPSBlbHQudGFnTmFtZS50b1VwcGVyQ2FzZSgpO1xuXG5cdGNvbnN0IGV4dHJhY3RvciA9IGVsZW1lbnRFeHRyYWN0b3JzW3RhZ05hbWVdO1xuXHRpZiAoZXh0cmFjdG9yKSB7XG5cdFx0cmV0dXJuIGV4dHJhY3RvcihlbHQpO1xuXHR9XG5cdHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBIVE1MIGVsZW1lbnQgdGFnOiAke2VsdC50YWdOYW1lfSAodXBkYXRlIC53ZWIvY3VzdG9tL3NlcmlhbGl6ZS50cylgKTtcbn1cbiIsCiAgICAiLyogPT09IElNUE9SVEFOVCA9PT0gKi9cblxuaW1wb3J0IHsgZXh0cmFjdEhUTUxFbGVtZW50IH0gZnJvbSBcIi4vZWxlbWVudHNcIjtcbmltcG9ydCB7IGNyZWF0ZUV4dHJhY3RvciB9IGZyb20gXCIuL2V4dHJhY3RvclwiO1xuXG4vLyBSZXVzYWJsZSBjb21wdXRlZCBtYXBwZXJzIChoZWxwcyBidW5kbGVycy9taW5pZmllcnMgc2hhcmUgcmVmZXJlbmNlcylcbmNvbnN0IG1hcFRhcmdldCA9IChlOiB7IHRhcmdldDogRXZlbnRUYXJnZXQgfCBudWxsIH0pID0+XG5cdGV4dHJhY3RIVE1MRWxlbWVudChlLnRhcmdldCBhcyBIVE1MRWxlbWVudCk7XG5jb25zdCBtYXBSZWxhdGVkID0gKGU6IHsgcmVsYXRlZFRhcmdldDogRXZlbnRUYXJnZXQgfCBudWxsIH0pID0+XG5cdGUucmVsYXRlZFRhcmdldCA/IGV4dHJhY3RIVE1MRWxlbWVudChlLnJlbGF0ZWRUYXJnZXQgYXMgSFRNTEVsZW1lbnQpIDogbnVsbDtcblxuZnVuY3Rpb24gbWFrZUV4dHJhY3RvcjxLIGV4dGVuZHMgcmVhZG9ubHkgYW55W10+KFxuXHRrZXlzOiBLLFxuXHRjb21wdXRlZD86IFJlY29yZDxzdHJpbmcsIChldnQ6IGFueSkgPT4gYW55Pixcbikge1xuXHRyZXR1cm4gY3JlYXRlRXh0cmFjdG9yPGFueT4oKShcblx0XHRrZXlzIGFzIGFueSxcblx0XHR7XG5cdFx0XHR0YXJnZXQ6IG1hcFRhcmdldCxcblx0XHRcdC4uLihjb21wdXRlZCB8fCB7fSksXG5cdFx0fSBhcyBhbnksXG5cdCk7XG59XG5cbmNvbnN0IFNZTlRIRVRJQ19LRVlTID0gW1xuXHRcInRhcmdldFwiLFxuXHRcImJ1YmJsZXNcIixcblx0XCJjYW5jZWxhYmxlXCIsXG5cdFwiZGVmYXVsdFByZXZlbnRlZFwiLFxuXHRcImV2ZW50UGhhc2VcIixcblx0XCJpc1RydXN0ZWRcIixcblx0XCJ0aW1lU3RhbXBcIixcblx0XCJ0eXBlXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgUmVhY3QuU3ludGhldGljRXZlbnQpW107XG5cbmNvbnN0IFVJX0tFWVMgPSBbLi4uU1lOVEhFVElDX0tFWVMsIFwiZGV0YWlsXCJdIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgUmVhY3QuVUlFdmVudClbXTtcblxuY29uc3QgTU9VU0VfS0VZUyA9IFtcblx0Li4uVUlfS0VZUyxcblx0XCJhbHRLZXlcIixcblx0XCJidXR0b25cIixcblx0XCJidXR0b25zXCIsXG5cdFwiY2xpZW50WFwiLFxuXHRcImNsaWVudFlcIixcblx0XCJjdHJsS2V5XCIsXG5cdFwibWV0YUtleVwiLFxuXHRcIm1vdmVtZW50WFwiLFxuXHRcIm1vdmVtZW50WVwiLFxuXHRcInBhZ2VYXCIsXG5cdFwicGFnZVlcIixcblx0XCJzY3JlZW5YXCIsXG5cdFwic2NyZWVuWVwiLFxuXHRcInNoaWZ0S2V5XCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgUmVhY3QuTW91c2VFdmVudClbXTtcblxuY29uc3QgUE9JTlRFUl9LRVlTID0gW1xuXHQuLi5NT1VTRV9LRVlTLFxuXHRcInBvaW50ZXJJZFwiLFxuXHRcInByZXNzdXJlXCIsXG5cdFwidGFuZ2VudGlhbFByZXNzdXJlXCIsXG5cdFwidGlsdFhcIixcblx0XCJ0aWx0WVwiLFxuXHRcInR3aXN0XCIsXG5cdFwid2lkdGhcIixcblx0XCJoZWlnaHRcIixcblx0XCJwb2ludGVyVHlwZVwiLFxuXHRcImlzUHJpbWFyeVwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIFJlYWN0LlBvaW50ZXJFdmVudClbXTtcblxuY29uc3Qgc3ludGhldGljRXh0cmFjdG9yID0gbWFrZUV4dHJhY3RvcihTWU5USEVUSUNfS0VZUyk7XG5cbmNvbnN0IHVpRXh0cmFjdG9yID0gbWFrZUV4dHJhY3RvcihVSV9LRVlTKTtcblxuY29uc3QgbW91c2VFeHRyYWN0b3IgPSBtYWtlRXh0cmFjdG9yKE1PVVNFX0tFWVMsIHsgcmVsYXRlZFRhcmdldDogbWFwUmVsYXRlZCB9KTtcblxuY29uc3QgY2xpcGJvYXJkRXh0cmFjdG9yID0gbWFrZUV4dHJhY3RvcihTWU5USEVUSUNfS0VZUywge1xuXHRjbGlwYm9hcmREYXRhOiAoZSkgPT4gZXh0cmFjdERhdGFUcmFuc2ZlcihlLmNsaXBib2FyZERhdGEpLFxufSk7XG5cbmNvbnN0IGNvbXBvc2l0aW9uRXh0cmFjdG9yID0gbWFrZUV4dHJhY3RvcihbLi4uU1lOVEhFVElDX0tFWVMsIFwiZGF0YVwiXSBhcyBjb25zdCk7XG5cbmNvbnN0IGRyYWdFeHRyYWN0b3IgPSBtYWtlRXh0cmFjdG9yKE1PVVNFX0tFWVMsIHtcblx0cmVsYXRlZFRhcmdldDogbWFwUmVsYXRlZCxcblx0ZGF0YVRyYW5zZmVyOiAoZSkgPT4gZXh0cmFjdERhdGFUcmFuc2ZlcihlLmRhdGFUcmFuc2ZlciksXG59KTtcblxuY29uc3QgcG9pbnRlckV4dHJhY3RvciA9IG1ha2VFeHRyYWN0b3IoUE9JTlRFUl9LRVlTLCB7XG5cdHJlbGF0ZWRUYXJnZXQ6IG1hcFJlbGF0ZWQsXG59KTtcblxuY29uc3QgZm9jdXNFeHRyYWN0b3IgPSBtYWtlRXh0cmFjdG9yKFNZTlRIRVRJQ19LRVlTLCB7XG5cdHJlbGF0ZWRUYXJnZXQ6IG1hcFJlbGF0ZWQsXG59KTtcblxuY29uc3QgZm9ybUV4dHJhY3RvciA9IG1ha2VFeHRyYWN0b3IoU1lOVEhFVElDX0tFWVMpO1xuXG5jb25zdCBpbnZhbGlkRXh0cmFjdG9yID0gbWFrZUV4dHJhY3RvcihTWU5USEVUSUNfS0VZUyk7XG5cbmNvbnN0IGNoYW5nZUV4dHJhY3RvciA9IG1ha2VFeHRyYWN0b3IoU1lOVEhFVElDX0tFWVMpO1xuXG5jb25zdCBrZXlib2FyZEV4dHJhY3RvciA9IG1ha2VFeHRyYWN0b3IoW1xuXHQuLi5VSV9LRVlTLFxuXHRcImFsdEtleVwiLFxuXHRcImN0cmxLZXlcIixcblx0XCJjb2RlXCIsXG5cdFwia2V5XCIsXG5cdFwibG9jYWxlXCIsXG5cdFwibG9jYXRpb25cIixcblx0XCJtZXRhS2V5XCIsXG5cdFwicmVwZWF0XCIsXG5cdFwic2hpZnRLZXlcIixcbl0gYXMgY29uc3QpO1xuXG5jb25zdCB0b3VjaEV4dHJhY3RvciA9IG1ha2VFeHRyYWN0b3IoXG5cdFtcblx0XHQuLi5VSV9LRVlTLFxuXHRcdFwiYWx0S2V5XCIsXG5cdFx0XCJjdHJsS2V5XCIsXG5cdFx0XCJtZXRhS2V5XCIsXG5cdFx0XCJzaGlmdEtleVwiLFxuXHRcdFwiY2hhbmdlZFRvdWNoZXNcIixcblx0XHRcInRhcmdldFRvdWNoZXNcIixcblx0XHRcInRvdWNoZXNcIixcblx0XSBhcyBjb25zdCxcblx0e1xuXHRcdGNoYW5nZWRUb3VjaGVzOiAoZSkgPT4gbWFwVG91Y2hMaXN0KGUuY2hhbmdlZFRvdWNoZXMpLFxuXHRcdHRhcmdldFRvdWNoZXM6IChlKSA9PiBtYXBUb3VjaExpc3QoZS50YXJnZXRUb3VjaGVzKSxcblx0XHR0b3VjaGVzOiAoZSkgPT4gbWFwVG91Y2hMaXN0KGUudG91Y2hlcyksXG5cdH0sXG4pO1xuXG5jb25zdCB3aGVlbEV4dHJhY3RvciA9IG1ha2VFeHRyYWN0b3IoXG5cdFsuLi5NT1VTRV9LRVlTLCBcImRlbHRhTW9kZVwiLCBcImRlbHRhWFwiLCBcImRlbHRhWVwiLCBcImRlbHRhWlwiXSBhcyBjb25zdCxcblx0e1xuXHRcdHJlbGF0ZWRUYXJnZXQ6IG1hcFJlbGF0ZWQsXG5cdH0sXG4pO1xuXG5jb25zdCBhbmltYXRpb25FeHRyYWN0b3IgPSBtYWtlRXh0cmFjdG9yKFtcblx0Li4uU1lOVEhFVElDX0tFWVMsXG5cdFwiYW5pbWF0aW9uTmFtZVwiLFxuXHRcImVsYXBzZWRUaW1lXCIsXG5cdFwicHNldWRvRWxlbWVudFwiLFxuXSBhcyBjb25zdCk7XG5cbmNvbnN0IHRvZ2dsZUV4dHJhY3RvciA9IG1ha2VFeHRyYWN0b3IoWy4uLlNZTlRIRVRJQ19LRVlTLCBcIm9sZFN0YXRlXCIsIFwibmV3U3RhdGVcIl0gYXMgY29uc3QpO1xuXG5jb25zdCB0cmFuc2l0aW9uRXh0cmFjdG9yID0gbWFrZUV4dHJhY3RvcihbXG5cdC4uLlNZTlRIRVRJQ19LRVlTLFxuXHRcImVsYXBzZWRUaW1lXCIsXG5cdFwicHJvcGVydHlOYW1lXCIsXG5cdFwicHNldWRvRWxlbWVudFwiLFxuXSBhcyBjb25zdCk7XG5cbmZ1bmN0aW9uIG1hcFRvdWNoTGlzdChsaXN0OiBhbnkpOiBhbnlbXSB7XG5cdHJldHVybiBBcnJheS5mcm9tKGxpc3QgYXMgQXJyYXlMaWtlPGFueT4pLm1hcCgodG91Y2g6IGFueSkgPT4gKHtcblx0XHR0YXJnZXQ6IGV4dHJhY3RIVE1MRWxlbWVudCh0b3VjaC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLFxuXHRcdGlkZW50aWZpZXI6IHRvdWNoLmlkZW50aWZpZXIsXG5cdFx0c2NyZWVuWDogdG91Y2guc2NyZWVuWCxcblx0XHRzY3JlZW5ZOiB0b3VjaC5zY3JlZW5ZLFxuXHRcdGNsaWVudFg6IHRvdWNoLmNsaWVudFgsXG5cdFx0Y2xpZW50WTogdG91Y2guY2xpZW50WSxcblx0XHRwYWdlWDogdG91Y2gucGFnZVgsXG5cdFx0cGFnZVk6IHRvdWNoLnBhZ2VZLFxuXHR9KSk7XG59XG5cbi8vIEhlbHBlciBmdW5jdGlvbiB0byBleHRyYWN0IERhdGFUcmFuc2ZlciBwcm9wZXJ0aWVzXG5mdW5jdGlvbiBleHRyYWN0RGF0YVRyYW5zZmVyKGR0OiBEYXRhVHJhbnNmZXIgfCBudWxsKTogb2JqZWN0IHwgbnVsbCB7XG5cdGlmICghZHQpIHtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXHRjb25zdCBpdGVtcyA9IFtdO1xuXHRpZiAoZHQuaXRlbXMpIHtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGR0Lml0ZW1zLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRjb25zdCBpdGVtID0gZHQuaXRlbXNbaV0hO1xuXHRcdFx0aXRlbXMucHVzaCh7XG5cdFx0XHRcdGtpbmQ6IGl0ZW0ua2luZCxcblx0XHRcdFx0dHlwZTogaXRlbS50eXBlLFxuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiB7XG5cdFx0ZHJvcF9lZmZlY3Q6IGR0LmRyb3BFZmZlY3QsXG5cdFx0ZWZmZWN0X2FsbG93ZWQ6IGR0LmVmZmVjdEFsbG93ZWQsXG5cdFx0aXRlbXM6IGl0ZW1zLFxuXHRcdHR5cGVzOiBBcnJheS5mcm9tKGR0LnR5cGVzIHx8IFtdKSxcblx0fTtcbn1cblxuY29uc3QgZXZlbnRFeHRyYWN0b3JNYXA6IHsgW2tleTogc3RyaW5nXTogKGV2dDogYW55KSA9PiBvYmplY3QgfSA9IHt9O1xuXG5mdW5jdGlvbiBhZGQobWFwOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBuYW1lczogcmVhZG9ubHkgc3RyaW5nW10sIGZuOiBhbnkpIHtcblx0Zm9yIChjb25zdCBuIG9mIG5hbWVzKSBtYXBbbl0gPSBmbjtcbn1cblxuYWRkKFxuXHRldmVudEV4dHJhY3Rvck1hcCxcblx0W1xuXHRcdFwicG9pbnRlcmRvd25cIixcblx0XHRcInBvaW50ZXJtb3ZlXCIsXG5cdFx0XCJwb2ludGVydXBcIixcblx0XHRcInBvaW50ZXJjYW5jZWxcIixcblx0XHRcImdvdHBvaW50ZXJjYXB0dXJlXCIsXG5cdFx0XCJsb3N0cG9pbnRlcmNhcHR1cmVcIixcblx0XHRcInBvaW50ZXJlbnRlclwiLFxuXHRcdFwicG9pbnRlcmxlYXZlXCIsXG5cdFx0XCJwb2ludGVyb3ZlclwiLFxuXHRcdFwicG9pbnRlcm91dFwiLFxuXHRdLFxuXHRwb2ludGVyRXh0cmFjdG9yLFxuKTtcblxuYWRkKFxuXHRldmVudEV4dHJhY3Rvck1hcCxcblx0W1xuXHRcdFwiY2xpY2tcIixcblx0XHRcImNvbnRleHRtZW51XCIsXG5cdFx0XCJkYmxjbGlja1wiLFxuXHRcdFwibW91c2Vkb3duXCIsXG5cdFx0XCJtb3VzZWVudGVyXCIsXG5cdFx0XCJtb3VzZWxlYXZlXCIsXG5cdFx0XCJtb3VzZW1vdmVcIixcblx0XHRcIm1vdXNlb3V0XCIsXG5cdFx0XCJtb3VzZW92ZXJcIixcblx0XHRcIm1vdXNldXBcIixcblx0XSxcblx0bW91c2VFeHRyYWN0b3IsXG4pO1xuXG5hZGQoXG5cdGV2ZW50RXh0cmFjdG9yTWFwLFxuXHRbXCJkcmFnXCIsIFwiZHJhZ2VuZFwiLCBcImRyYWdlbnRlclwiLCBcImRyYWdleGl0XCIsIFwiZHJhZ2xlYXZlXCIsIFwiZHJhZ292ZXJcIiwgXCJkcmFnc3RhcnRcIiwgXCJkcm9wXCJdLFxuXHRkcmFnRXh0cmFjdG9yLFxuKTtcblxuYWRkKGV2ZW50RXh0cmFjdG9yTWFwLCBbXCJrZXlkb3duXCIsIFwia2V5cHJlc3NcIiwgXCJrZXl1cFwiXSwga2V5Ym9hcmRFeHRyYWN0b3IpO1xuYWRkKGV2ZW50RXh0cmFjdG9yTWFwLCBbXCJmb2N1c1wiLCBcImJsdXJcIl0sIGZvY3VzRXh0cmFjdG9yKTtcbmFkZChldmVudEV4dHJhY3Rvck1hcCwgW1wiY2hhbmdlXCIsIFwiaW5wdXRcIl0sIGNoYW5nZUV4dHJhY3Rvcik7XG5hZGQoZXZlbnRFeHRyYWN0b3JNYXAsIFtcImludmFsaWRcIl0sIGludmFsaWRFeHRyYWN0b3IpO1xuYWRkKGV2ZW50RXh0cmFjdG9yTWFwLCBbXCJyZXNldFwiLCBcInN1Ym1pdFwiXSwgZm9ybUV4dHJhY3Rvcik7XG5hZGQoZXZlbnRFeHRyYWN0b3JNYXAsIFtcImNvcHlcIiwgXCJjdXRcIiwgXCJwYXN0ZVwiXSwgY2xpcGJvYXJkRXh0cmFjdG9yKTtcbmFkZChcblx0ZXZlbnRFeHRyYWN0b3JNYXAsXG5cdFtcImNvbXBvc2l0aW9uZW5kXCIsIFwiY29tcG9zaXRpb25zdGFydFwiLCBcImNvbXBvc2l0aW9udXBkYXRlXCJdLFxuXHRjb21wb3NpdGlvbkV4dHJhY3Rvcixcbik7XG5hZGQoZXZlbnRFeHRyYWN0b3JNYXAsIFtcInRvdWNoY2FuY2VsXCIsIFwidG91Y2hlbmRcIiwgXCJ0b3VjaG1vdmVcIiwgXCJ0b3VjaHN0YXJ0XCJdLCB0b3VjaEV4dHJhY3Rvcik7XG5hZGQoZXZlbnRFeHRyYWN0b3JNYXAsIFtcInNjcm9sbFwiXSwgdWlFeHRyYWN0b3IpO1xuYWRkKGV2ZW50RXh0cmFjdG9yTWFwLCBbXCJ3aGVlbFwiXSwgd2hlZWxFeHRyYWN0b3IpO1xuYWRkKFxuXHRldmVudEV4dHJhY3Rvck1hcCxcblx0W1wiYW5pbWF0aW9uc3RhcnRcIiwgXCJhbmltYXRpb25lbmRcIiwgXCJhbmltYXRpb25pdGVyYXRpb25cIl0sXG5cdGFuaW1hdGlvbkV4dHJhY3Rvcixcbik7XG5hZGQoZXZlbnRFeHRyYWN0b3JNYXAsIFtcInRyYW5zaXRpb25lbmRcIl0sIHRyYW5zaXRpb25FeHRyYWN0b3IpO1xuYWRkKGV2ZW50RXh0cmFjdG9yTWFwLCBbXCJ0b2dnbGVcIl0sIHRvZ2dsZUV4dHJhY3Rvcik7XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0RXZlbnQodmFsdWU6IGFueSk6IGFueSB7XG5cdC8vIER1Y2stdHlwaW5nIGZvciBSZWFjdCdzIFN5bnRoZXRpY0V2ZW50LlxuXHQvLyBXZSBjaGVjayBmb3IgcHJvcGVydGllcyB0aGF0IGFyZSB1bmlxdWUgdG8gc3ludGhldGljIGV2ZW50cy5cblx0aWYgKFxuXHRcdHZhbHVlICYmXG5cdFx0dHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmXG5cdFx0XCJuYXRpdmVFdmVudFwiIGluIHZhbHVlICYmXG5cdFx0dHlwZW9mIHZhbHVlLmlzRGVmYXVsdFByZXZlbnRlZCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRcdGNvbnN0IGV2dCA9IHZhbHVlIGFzIFJlYWN0LlN5bnRoZXRpY0V2ZW50O1xuXHRcdC8vIFRoZSBgdHlwZWAgcHJvcGVydHkgaXMgY3J1Y2lhbCBmb3IgdGhlIGxvb2t1cC5cblx0XHRpZiAodHlwZW9mIGV2dC50eXBlICE9PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0fVxuXG5cdFx0Y29uc3QgZXh0cmFjdG9yID0gZXZlbnRFeHRyYWN0b3JNYXBbZXZ0LnR5cGUudG9Mb3dlckNhc2UoKV07XG5cdFx0aWYgKGV4dHJhY3Rvcikge1xuXHRcdFx0cmV0dXJuIGV4dHJhY3RvcihldnQpO1xuXHRcdH1cblxuXHRcdC8vIEZhbGxiYWNrIGZvciB1bmtub3duIGV2ZW50IHR5cGVzOiBtaW5pbWFsIHN5bnRoZXRpYyBleHRyYWN0b3Jcblx0XHRyZXR1cm4gc3ludGhldGljRXh0cmFjdG9yKGV2dCk7XG5cdH1cblxuXHQvLyBJZiBpdCdzIG5vdCBhIGR1Y2stdHlwZWQgZXZlbnQsIHJldHVybiBpdCBhcyBpcy5cblx0cmV0dXJuIHZhbHVlO1xufVxuIiwKICAgICJleHBvcnQgdHlwZSBQcmltaXRpdmUgPSBudW1iZXIgfCBzdHJpbmcgfCBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZDtcbmV4cG9ydCB0eXBlIEpTT048VD4gPSBUIHwgQXJyYXk8SlNPTjxUPj4gfCB7IFtLOiBzdHJpbmddOiBKU09OPFQ+IH07XG5leHBvcnQgdHlwZSBQbGFpbkpTT04gPSBKU09OPFByaW1pdGl2ZT47XG5leHBvcnQgdHlwZSBTZXJpYWxpemFibGUgPSBhbnk7XG5cbmV4cG9ydCB0eXBlIFNlcmlhbGl6ZWQgPSBbW251bWJlcltdLCBudW1iZXJbXSwgbnVtYmVyW10sIG51bWJlcltdXSwgUGxhaW5KU09OXTtcblxuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZShkYXRhOiBTZXJpYWxpemFibGUpOiBTZXJpYWxpemVkIHtcblx0Y29uc3Qgc2VlbiA9IG5ldyBNYXA8YW55LCBudW1iZXI+KCk7XG5cdGNvbnN0IHJlZnM6IG51bWJlcltdID0gW107XG5cdGNvbnN0IGRhdGVzOiBudW1iZXJbXSA9IFtdO1xuXHRjb25zdCBzZXRzOiBudW1iZXJbXSA9IFtdO1xuXHRjb25zdCBtYXBzOiBudW1iZXJbXSA9IFtdO1xuXG5cdC8vIFNpbmdsZSBnbG9iYWwgY291bnRlciAtIGluY3JlbWVudHMgb25jZSBwZXIgbm9kZSB2aXNpdFxuXHRsZXQgZ2xvYmFsSW5kZXggPSAwO1xuXG5cdGZ1bmN0aW9uIHByb2Nlc3ModmFsdWU6IFNlcmlhbGl6YWJsZSk6IFBsYWluSlNPTiB7XG5cdFx0aWYgKFxuXHRcdFx0dmFsdWUgPT0gbnVsbCB8fFxuXHRcdFx0dHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiIHx8XG5cdFx0XHR0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHxcblx0XHRcdHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCJcblx0XHQpIHtcblx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHR9XG5cblx0XHRjb25zdCBpZHggPSBnbG9iYWxJbmRleCsrO1xuXHRcdGNvbnN0IHByZXZSZWYgPSBzZWVuLmdldCh2YWx1ZSk7XG5cdFx0aWYgKHByZXZSZWYgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Ly8gTWFrZSBzdXJlIHRvIHB1c2ggdGhlIGN1cnJlbnQgaW5kZXgsIGJ1dCB1c2UgdGhlIHJlZidzIGluZGV4IGFzIHRoZSB2YWx1ZSFcblx0XHRcdHJlZnMucHVzaChpZHgpO1xuXHRcdFx0cmV0dXJuIHByZXZSZWY7XG5cdFx0fVxuXG5cdFx0c2Vlbi5zZXQodmFsdWUsIGlkeCk7XG5cblx0XHRpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG5cdFx0XHRkYXRlcy5wdXNoKGlkeCk7XG5cdFx0XHRyZXR1cm4gdmFsdWUuZ2V0VGltZSgpO1xuXHRcdH1cblxuXHRcdGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuXHRcdFx0Y29uc3QgbGVuZ3RoID0gdmFsdWUubGVuZ3RoO1xuXHRcdFx0Y29uc3QgcmVzdWx0ID0gbmV3IEFycmF5KGxlbmd0aCk7XG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdHJlc3VsdFtpXSA9IHByb2Nlc3ModmFsdWVbaV0pO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHR9XG5cblx0XHRpZiAodmFsdWUgaW5zdGFuY2VvZiBNYXApIHtcblx0XHRcdG1hcHMucHVzaChpZHgpO1xuXHRcdFx0Y29uc3QgcmVjOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG5cdFx0XHRmb3IgKGNvbnN0IFtrZXksIGVudHJ5XSBvZiB2YWx1ZS5lbnRyaWVzKCkpIHtcblx0XHRcdFx0cmVjW1N0cmluZyhrZXkpXSA9IHByb2Nlc3MoZW50cnkpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHJlYztcblx0XHR9XG5cblx0XHRpZiAodmFsdWUgaW5zdGFuY2VvZiBTZXQpIHtcblx0XHRcdHNldHMucHVzaChpZHgpO1xuXHRcdFx0Y29uc3Qgc2l6ZSA9IHZhbHVlLnNpemU7XG5cdFx0XHRjb25zdCByZXN1bHQgPSBuZXcgQXJyYXkoc2l6ZSk7XG5cdFx0XHRsZXQgaSA9IDA7XG5cdFx0XHRmb3IgKGNvbnN0IGVudHJ5IG9mIHZhbHVlKSB7XG5cdFx0XHRcdHJlc3VsdFtpXSA9IHByb2Nlc3MoZW50cnkpO1xuXHRcdFx0XHRpICs9IDE7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH1cblxuXHRcdGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdGNvbnN0IHJlYzogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuXHRcdFx0Y29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHZhbHVlKTtcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRjb25zdCBrZXkgPSBrZXlzW2ldO1xuXHRcdFx0XHRyZWNba2V5XSA9IHByb2Nlc3ModmFsdWVba2V5XSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcmVjO1xuXHRcdH1cblxuXHRcdHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgdmFsdWUgaW4gc2VyaWFsaXphdGlvbjogJHt2YWx1ZX1gKTtcblx0fVxuXG5cdGNvbnN0IHBheWxvYWQgPSBwcm9jZXNzKGRhdGEpO1xuXHRyZXR1cm4gW1tyZWZzLCBkYXRlcywgc2V0cywgbWFwc10sIHBheWxvYWRdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERlc2VyaWFsaXphdGlvbk9wdGlvbnMge1xuXHRjb2VyY2VOdWxsc1RvVW5kZWZpbmVkPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlc2VyaWFsaXplPERhdGEgZXh0ZW5kcyBTZXJpYWxpemFibGUgPSBTZXJpYWxpemFibGU+KFxuXHRwYXlsb2FkOiBTZXJpYWxpemVkLFxuXHRvcHRpb25zPzogRGVzZXJpYWxpemF0aW9uT3B0aW9ucyxcbik6IERhdGEge1xuXHRjb25zdCBbW3JlZnNBLCBkYXRlc0EsIHNldHNBLCBtYXBzQV0sIGRhdGFdID0gcGF5bG9hZDtcblxuXHRjb25zdCByZWZzID0gbmV3IFNldChyZWZzQSk7XG5cdGNvbnN0IGRhdGVzID0gbmV3IFNldChkYXRlc0EpO1xuXHRjb25zdCBzZXRzID0gbmV3IFNldChzZXRzQSk7XG5cdGNvbnN0IG1hcHMgPSBuZXcgU2V0KG1hcHNBKTtcblxuXHRjb25zdCBvYmplY3RzOiBBcnJheTxhbnk+ID0gW107XG5cblx0ZnVuY3Rpb24gcmVjb25zdHJ1Y3QodmFsdWU6IFBsYWluSlNPTik6IGFueSB7XG5cdFx0Y29uc3QgaWR4ID0gb2JqZWN0cy5sZW5ndGg7XG5cdFx0aWYgKHJlZnMuaGFzKGlkeCkpIHtcblx0XHRcdC8vIFdlIGluY3JlbWVudCB0aGUgY291bnRlciBvbiByZWZzIGR1cmluZyBzZXJpYWxpemF0aW9uLiBXZSdyZSBuZXZlclxuXHRcdFx0Ly8gZ29pbmcgdG8gdXNlIHRoaXMgZW50cnksIHNvIHdlIGNhbiBqdXN0IHB1c2ggbnVsbC5cblx0XHRcdG9iamVjdHMucHVzaChudWxsKTtcblx0XHRcdHJldHVybiBvYmplY3RzW3ZhbHVlIGFzIG51bWJlcl07XG5cdFx0fVxuXG5cdFx0aWYgKGRhdGVzLmhhcyhpZHgpKSB7XG5cdFx0XHRjb25zdCBkdCA9IG5ldyBEYXRlKHZhbHVlIGFzIG51bWJlcik7XG5cdFx0XHRvYmplY3RzLnB1c2goZHQpO1xuXHRcdFx0cmV0dXJuIGR0O1xuXHRcdH1cblxuXHRcdGlmIChcblx0XHRcdHZhbHVlID09IG51bGwgfHxcblx0XHRcdHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiB8fFxuXHRcdFx0dHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8XG5cdFx0XHR0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiXG5cdFx0KSB7XG5cdFx0XHRpZiAob3B0aW9ucz8uY29lcmNlTnVsbHNUb1VuZGVmaW5lZCkge1xuXHRcdFx0XHRyZXR1cm4gdmFsdWUgPz8gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdH1cblxuXHRcdGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuXHRcdFx0aWYgKHNldHMuaGFzKGlkeCkpIHtcblx0XHRcdFx0Y29uc3QgcmVzdWx0ID0gbmV3IFNldCgpO1xuXHRcdFx0XHRvYmplY3RzLnB1c2gocmVzdWx0KTtcblx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdHJlc3VsdC5hZGQocmVjb25zdHJ1Y3QodmFsdWVbaV0pKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBsZW5ndGggPSB2YWx1ZS5sZW5ndGg7XG5cdFx0XHRjb25zdCBhcnIgPSBuZXcgQXJyYXkobGVuZ3RoKTtcblx0XHRcdG9iamVjdHMucHVzaChhcnIpO1xuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuXHRcdFx0XHRhcnJbaV0gPSByZWNvbnN0cnVjdCh2YWx1ZVtpXSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gYXJyO1xuXHRcdH1cblxuXHRcdGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdGlmIChtYXBzLmhhcyhpZHgpKSB7XG5cdFx0XHRcdGNvbnN0IHJlc3VsdCA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCk7XG5cdFx0XHRcdG9iamVjdHMucHVzaChyZXN1bHQpO1xuXHRcdFx0XHRjb25zdCBrZXlzID0gT2JqZWN0LmtleXModmFsdWUpO1xuXHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRjb25zdCBrZXkgPSBrZXlzW2ldO1xuXHRcdFx0XHRcdHJlc3VsdC5zZXQoa2V5LCByZWNvbnN0cnVjdCh2YWx1ZVtrZXldKSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG5cdFx0XHRvYmplY3RzLnB1c2gocmVzdWx0KTtcblx0XHRcdGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh2YWx1ZSk7XG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0Y29uc3Qga2V5ID0ga2V5c1tpXTtcblx0XHRcdFx0cmVzdWx0W2tleV0gPSByZWNvbnN0cnVjdCh2YWx1ZVtrZXldKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fVxuXG5cdFx0dGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCB2YWx1ZSBpbiBkZXNlcmlhbGl6YXRpb246ICR7dmFsdWV9YCk7XG5cdH1cblxuXHRyZXR1cm4gcmVjb25zdHJ1Y3QoZGF0YSk7XG59XG4iLAogICAgImltcG9ydCB7XG5cdHR5cGUgQ29tcG9uZW50VHlwZSxcblx0Y2xvbmVFbGVtZW50LFxuXHRjcmVhdGVFbGVtZW50LFxuXHR0eXBlIEZDLFxuXHRGcmFnbWVudCxcblx0aXNWYWxpZEVsZW1lbnQsXG5cdGxhenksXG5cdHR5cGUgUHJvcHNXaXRoQ2hpbGRyZW4sXG5cdHR5cGUgUmVhY3RFbGVtZW50LFxuXHR0eXBlIFJlYWN0Tm9kZSxcblx0U3VzcGVuc2UsXG59IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHR5cGUgeyBQdWxzZVNvY2tldElPQ2xpZW50IH0gZnJvbSBcIi4vY2xpZW50XCI7XG5pbXBvcnQgdHlwZSB7IENvbXBvbmVudFJlZ2lzdHJ5LCBQYXRoRGVsdGEsIFZET00sIFZET01Ob2RlLCBWRE9NVXBkYXRlIH0gZnJvbSBcIi4vdmRvbVwiO1xuaW1wb3J0IHsgRlJBR01FTlRfVEFHLCBpc0VsZW1lbnROb2RlLCBpc01vdW50UG9pbnROb2RlLCBNT1VOVF9QT0lOVF9QUkVGSVggfSBmcm9tIFwiLi92ZG9tXCI7XG5cbmV4cG9ydCBjbGFzcyBWRE9NUmVuZGVyZXIge1xuXHQjY2FsbGJhY2tzOiBTZXQ8c3RyaW5nPjtcblx0I2NhbGxiYWNrQ2FjaGU6IE1hcDxzdHJpbmcsICguLi5hcmdzOiBhbnkpID0+IHZvaWQ+O1xuXHQjcmVuZGVyUHJvcEtleXM6IFNldDxzdHJpbmc+O1xuXHQjY3NzUHJvcHM6IFNldDxzdHJpbmc+O1xuXHQjY2FsbGJhY2tMaXN0OiBzdHJpbmdbXTtcblx0I2NsaWVudDogUHVsc2VTb2NrZXRJT0NsaWVudDtcblx0I3BhdGg6IHN0cmluZztcblx0I2NvbXBvbmVudHM6IENvbXBvbmVudFJlZ2lzdHJ5O1xuXHQjY3NzTW9kdWxlczogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgc3RyaW5nPj47XG5cblx0Y29uc3RydWN0b3IoXG5cdFx0Y2xpZW50OiBQdWxzZVNvY2tldElPQ2xpZW50LFxuXHRcdHBhdGg6IHN0cmluZyxcblx0XHRjb21wb25lbnRzOiBDb21wb25lbnRSZWdpc3RyeSxcblx0XHRjc3NNb2R1bGVzOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Pixcblx0XHRpbml0aWFsQ2FsbGJhY2tzOiBzdHJpbmdbXSA9IFtdLFxuXHRcdGluaXRpYWxSZW5kZXJQcm9wczogc3RyaW5nW10gPSBbXSxcblx0XHRpbml0aWFsQ3NzUmVmczogc3RyaW5nW10gPSBbXSxcblx0KSB7XG5cdFx0dGhpcy4jY2xpZW50ID0gY2xpZW50O1xuXHRcdHRoaXMuI3BhdGggPSBwYXRoO1xuXHRcdHRoaXMuI2NvbXBvbmVudHMgPSBjb21wb25lbnRzO1xuXHRcdHRoaXMuI2Nzc01vZHVsZXMgPSBjc3NNb2R1bGVzO1xuXHRcdHRoaXMuI2NhbGxiYWNrcyA9IG5ldyBTZXQoaW5pdGlhbENhbGxiYWNrcyk7XG5cdFx0dGhpcy4jY2FsbGJhY2tDYWNoZSA9IG5ldyBNYXAoKTtcblx0XHR0aGlzLiNyZW5kZXJQcm9wS2V5cyA9IG5ldyBTZXQoaW5pdGlhbFJlbmRlclByb3BzKTtcblx0XHR0aGlzLiNjc3NQcm9wcyA9IG5ldyBTZXQoaW5pdGlhbENzc1JlZnMpO1xuXHRcdHRoaXMuI2NhbGxiYWNrTGlzdCA9IFsuLi50aGlzLiNjYWxsYmFja3NdLnNvcnQoKTtcblx0fVxuXG5cdC8vIEFjY2Vzc29ycyB1c2VkIGJ5IHVwZGF0ZSBsb2dpYyB0byBkZXRlcm1pbmUgd2hpY2ggcHJvcHMgbmVlZCByZWJpbmRpbmdcblx0aGFzQ2FsbGJhY2tQYXRoKHBhdGg6IHN0cmluZykge1xuXHRcdHJldHVybiB0aGlzLiNjYWxsYmFja3MuaGFzKHBhdGgpO1xuXHR9XG5cblx0aGFzUmVuZGVyUHJvcFBhdGgocGF0aDogc3RyaW5nKSB7XG5cdFx0cmV0dXJuIHRoaXMuI3JlbmRlclByb3BLZXlzLmhhcyhwYXRoKTtcblx0fVxuXG5cdGhhc0FueUNhbGxiYWNrVW5kZXIocHJlZml4OiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRpZiAocHJlZml4ID09PSBcIlwiKSByZXR1cm4gdGhpcy4jY2FsbGJhY2tMaXN0Lmxlbmd0aCA+IDA7XG5cdFx0Y29uc3QgaSA9IHRoaXMuI2xvd2VyQm91bmQodGhpcy4jY2FsbGJhY2tMaXN0LCBwcmVmaXgpO1xuXHRcdHJldHVybiBpIDwgdGhpcy4jY2FsbGJhY2tMaXN0Lmxlbmd0aCAmJiB0aGlzLiNjYWxsYmFja0xpc3RbaV0hLnN0YXJ0c1dpdGgocHJlZml4KTtcblx0fVxuXG5cdGFwcGx5Q2FsbGJhY2tEZWx0YShkZWx0YTogUGF0aERlbHRhKSB7XG5cdFx0Ly8gT25seSB1cGRhdGUgdGhlIGludGVybmFsIGNhbGxiYWNrIHBhdGggcmVnaXN0cnkgYW5kIGNhY2hlLiBXZSByZWx5IG9uXG5cdFx0Ly8gYWNjb21wYW55aW5nIHVwZGF0ZV9wcm9wcyBvcGVyYXRpb25zIHRoYXQgY29udGFpbiB0aGUgXCIkY2JcIiBwbGFjZWhvbGRlclxuXHRcdC8vIHRvIHRyaWdnZXIgcHJvcCB1cGRhdGVzOyB0cmFuc2Zvcm1WYWx1ZSB3aWxsIHJlc29sdmUgdG8gZnVuY3Rpb25zLlxuXHRcdGlmIChkZWx0YS5yZW1vdmUpIHtcblx0XHRcdGZvciAoY29uc3Qga2V5IG9mIGRlbHRhLnJlbW92ZSkge1xuXHRcdFx0XHR0aGlzLiNjYWxsYmFja3MuZGVsZXRlKGtleSk7XG5cdFx0XHRcdHRoaXMuI2NhbGxiYWNrQ2FjaGUuZGVsZXRlKGtleSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChkZWx0YS5hZGQpIHtcblx0XHRcdGZvciAoY29uc3Qga2V5IG9mIGRlbHRhLmFkZCkge1xuXHRcdFx0XHR0aGlzLiNjYWxsYmFja3MuYWRkKGtleSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHRoaXMuI2NhbGxiYWNrTGlzdCA9IFsuLi50aGlzLiNjYWxsYmFja3NdLnNvcnQoKTtcblx0fVxuXG5cdGFwcGx5UmVuZGVyUHJvcHNEZWx0YShkZWx0YTogUGF0aERlbHRhKSB7XG5cdFx0aWYgKGRlbHRhLnJlbW92ZSkge1xuXHRcdFx0Zm9yIChjb25zdCBrZXkgb2YgZGVsdGEucmVtb3ZlKSB7XG5cdFx0XHRcdHRoaXMuI3JlbmRlclByb3BLZXlzLmRlbGV0ZShrZXkpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAoZGVsdGEuYWRkKSB7XG5cdFx0XHRmb3IgKGNvbnN0IGtleSBvZiBkZWx0YS5hZGQpIHtcblx0XHRcdFx0dGhpcy4jcmVuZGVyUHJvcEtleXMuYWRkKGtleSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0YXBwbHlDc3NSZWZzRGVsdGEoZGVsdGE6IFBhdGhEZWx0YSkge1xuXHRcdGlmIChkZWx0YS5yZW1vdmUpIHtcblx0XHRcdGZvciAoY29uc3QgcHJvcCBvZiBkZWx0YS5yZW1vdmUpIHtcblx0XHRcdFx0dGhpcy4jY3NzUHJvcHMuZGVsZXRlKHByb3ApO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAoZGVsdGEuYWRkKSB7XG5cdFx0XHRmb3IgKGNvbnN0IHByb3Agb2YgZGVsdGEuYWRkKSB7XG5cdFx0XHRcdHRoaXMuI2Nzc1Byb3BzLmFkZChwcm9wKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRnZXRDYWxsYmFjayhwYXRoOiBzdHJpbmcsIHByb3A6IHN0cmluZykge1xuXHRcdGNvbnN0IGtleSA9IHRoaXMuI3Byb3BQYXRoKHBhdGgsIHByb3ApO1xuXHRcdGxldCBmbiA9IHRoaXMuI2NhbGxiYWNrQ2FjaGUuZ2V0KGtleSk7XG5cdFx0aWYgKCFmbikge1xuXHRcdFx0Zm4gPSAoLi4uYXJnczogYW55W10pID0+IHRoaXMuI2NsaWVudC5pbnZva2VDYWxsYmFjayh0aGlzLiNwYXRoLCBrZXksIGFyZ3MpO1xuXHRcdFx0dGhpcy4jY2FsbGJhY2tDYWNoZS5zZXQoa2V5LCBmbik7XG5cdFx0fVxuXHRcdHJldHVybiBmbjtcblx0fVxuXG5cdHJlbmRlck5vZGUobm9kZTogVkRPTU5vZGUsIGN1cnJlbnRQYXRoID0gXCJcIik6IFJlYWN0Tm9kZSB7XG5cdFx0Ly8gSGFuZGxlIHByaW1pdGl2ZXMgZWFybHlcblx0XHRpZiAoXG5cdFx0XHRub2RlID09IG51bGwgfHwgLy8gY2F0Y2hlcyBib3RoIG51bGwgYW5kIHVuZGVmaW5lZFxuXHRcdFx0dHlwZW9mIG5vZGUgPT09IFwiYm9vbGVhblwiIHx8XG5cdFx0XHR0eXBlb2Ygbm9kZSA9PT0gXCJudW1iZXJcIiB8fFxuXHRcdFx0dHlwZW9mIG5vZGUgPT09IFwic3RyaW5nXCJcblx0XHQpIHtcblx0XHRcdHJldHVybiBub2RlO1xuXHRcdH1cblxuXHRcdC8vIEVsZW1lbnQgbm9kZXNcblx0XHRpZiAoaXNFbGVtZW50Tm9kZShub2RlKSkge1xuXHRcdFx0Y29uc3QgeyB0YWcsIHByb3BzID0ge30sIGNoaWxkcmVuID0gW10gfSA9IG5vZGU7XG5cblx0XHRcdGNvbnN0IG5ld1Byb3BzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG5cdFx0XHRmb3IgKGNvbnN0IFtwcm9wTmFtZSwgcHJvcFZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwcm9wcykpIHtcblx0XHRcdFx0bmV3UHJvcHNbcHJvcE5hbWVdID0gdGhpcy50cmFuc2Zvcm1WYWx1ZShjdXJyZW50UGF0aCwgcHJvcE5hbWUsIHByb3BWYWx1ZSk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChub2RlLmtleSkge1xuXHRcdFx0XHRuZXdQcm9wcy5rZXkgPSBub2RlLmtleTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgcmVuZGVyZWRDaGlsZHJlbiA9IFtdO1xuXHRcdFx0Zm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGNoaWxkcmVuLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuXHRcdFx0XHRjb25zdCBjaGlsZCA9IGNoaWxkcmVuW2luZGV4XSE7XG5cdFx0XHRcdGNvbnN0IGNoaWxkUGF0aCA9IGN1cnJlbnRQYXRoID8gYCR7Y3VycmVudFBhdGh9LiR7aW5kZXh9YCA6IFN0cmluZyhpbmRleCk7XG5cdFx0XHRcdHJlbmRlcmVkQ2hpbGRyZW4ucHVzaCh0aGlzLnJlbmRlck5vZGUoY2hpbGQsIGNoaWxkUGF0aCkpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoaXNNb3VudFBvaW50Tm9kZShub2RlKSkge1xuXHRcdFx0XHRjb25zdCBjb21wb25lbnRLZXkgPSBub2RlLnRhZy5zbGljZShNT1VOVF9QT0lOVF9QUkVGSVgubGVuZ3RoKTtcblx0XHRcdFx0Y29uc3QgQ29tcG9uZW50ID0gdGhpcy4jY29tcG9uZW50c1tjb21wb25lbnRLZXldITtcblx0XHRcdFx0aWYgKCFDb21wb25lbnQpIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXG5cdFx0XHRcdFx0XHRgQ291bGQgbm90IGZpbmQgY29tcG9uZW50ICR7Y29tcG9uZW50S2V5fS4gVGhpcyBpcyBhIFB1bHNlIGludGVybmFsIGVycm9yLmAsXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gY3JlYXRlRWxlbWVudChDb21wb25lbnQsIG5ld1Byb3BzLCAuLi5yZW5kZXJlZENoaWxkcmVuKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGNyZWF0ZUVsZW1lbnQodGFnID09PSBGUkFHTUVOVF9UQUcgPyBGcmFnbWVudCA6IHRhZywgbmV3UHJvcHMsIC4uLnJlbmRlcmVkQ2hpbGRyZW4pO1xuXHRcdH1cblxuXHRcdC8vIEZhbGxiYWNrIGZvciB1bmtub3duIG5vZGUgdHlwZXNcblx0XHRpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG5cdFx0XHRjb25zb2xlLmVycm9yKFwiVW5rbm93biBWRE9NIG5vZGUgdHlwZTpcIiwgbm9kZSk7XG5cdFx0fVxuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0I3Byb3BQYXRoKHBhdGg6IHN0cmluZywgcHJvcDogc3RyaW5nKSB7XG5cdFx0cmV0dXJuIHBhdGggPyBgJHtwYXRofS4ke3Byb3B9YCA6IHByb3A7XG5cdH1cblxuXHR0cmFuc2Zvcm1WYWx1ZShwYXRoOiBzdHJpbmcsIGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG5cdFx0Y29uc3QgcHJvcFBhdGggPSB0aGlzLiNwcm9wUGF0aChwYXRoLCBrZXkpO1xuXHRcdGlmICh0aGlzLiNjYWxsYmFja3MuaGFzKHByb3BQYXRoKSkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZ2V0Q2FsbGJhY2socGF0aCwga2V5KTtcblx0XHR9XG5cdFx0aWYgKHRoaXMuI3JlbmRlclByb3BLZXlzLmhhcyhwcm9wUGF0aCkpIHtcblx0XHRcdHJldHVybiB0aGlzLnJlbmRlck5vZGUodmFsdWUsIHByb3BQYXRoKTtcblx0XHR9XG5cdFx0aWYgKHRoaXMuI2Nzc1Byb3BzLmhhcyhwcm9wUGF0aCkpIHtcblx0XHRcdHJldHVybiB0aGlzLiNyZXNvbHZlQ3NzVG9rZW4odmFsdWUpO1xuXHRcdH1cblx0XHRyZXR1cm4gdmFsdWU7XG5cdH1cblxuXHQjcmVzb2x2ZUNzc1Rva2VuKHRva2VuOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRcdGNvbnN0IGlkeCA9IHRva2VuLmluZGV4T2YoXCI6XCIpO1xuXHRcdGlmIChpZHggPT09IC0xKSB7XG5cdFx0XHRyZXR1cm4gdG9rZW47XG5cdFx0fVxuXHRcdGNvbnN0IG1vZHVsZUlkID0gdG9rZW4uc2xpY2UoMCwgaWR4KTtcblx0XHRjb25zdCBjbGFzc05hbWUgPSB0b2tlbi5zbGljZShpZHggKyAxKTtcblx0XHRpZiAoIW1vZHVsZUlkIHx8ICFjbGFzc05hbWUpIHtcblx0XHRcdHJldHVybiB0b2tlbjtcblx0XHR9XG5cdFx0Y29uc3QgbW9kID0gdGhpcy4jY3NzTW9kdWxlc1ttb2R1bGVJZF07XG5cdFx0aWYgKCFtb2QpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihgUmVjZWl2ZWQgQ1NTIHJlZmVyZW5jZSBmb3IgdW5rbm93biBtb2R1bGUgJyR7bW9kdWxlSWR9J2ApO1xuXHRcdH1cblx0XHRjb25zdCByZXNvbHZlZCA9IG1vZFtjbGFzc05hbWVdO1xuXHRcdGlmICh0eXBlb2YgcmVzb2x2ZWQgIT09IFwic3RyaW5nXCIpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcblx0XHRcdFx0YFJlY2VpdmVkIENTUyByZWZlcmVuY2UgZm9yIG1pc3NpbmcgY2xhc3MgJyR7Y2xhc3NOYW1lfScgaW4gbW9kdWxlICcke21vZHVsZUlkfSdgLFxuXHRcdFx0KTtcblx0XHR9XG5cdFx0cmV0dXJuIHJlc29sdmVkO1xuXHR9XG5cblx0aW5pdCh2ZG9tOiBWRE9NLCBjYWxsYmFja3M6IHN0cmluZ1tdLCByZW5kZXJQcm9wczogc3RyaW5nW10sIGNzc1JlZnM6IHN0cmluZ1tdKTogUmVhY3ROb2RlIHtcblx0XHQvLyBTZXQgY2FsbGJhY2tzXG5cdFx0dGhpcy4jY2FsbGJhY2tzID0gbmV3IFNldChjYWxsYmFja3MpO1xuXHRcdC8vIHBydW5lIHN0YWxlIGNhY2hlZCBjYWxsYmFja3Ncblx0XHRmb3IgKGNvbnN0IGsgb2YgQXJyYXkuZnJvbSh0aGlzLiNjYWxsYmFja0NhY2hlLmtleXMoKSkpIHtcblx0XHRcdGlmICghdGhpcy4jY2FsbGJhY2tzLmhhcyhrKSkgdGhpcy4jY2FsbGJhY2tDYWNoZS5kZWxldGUoayk7XG5cdFx0fVxuXHRcdHRoaXMuI2NhbGxiYWNrTGlzdCA9IFsuLi50aGlzLiNjYWxsYmFja3NdLnNvcnQoKTtcblxuXHRcdC8vIFNldCByZW5kZXIgcHJvcHNcblx0XHR0aGlzLiNyZW5kZXJQcm9wS2V5cyA9IG5ldyBTZXQocmVuZGVyUHJvcHMpO1xuXG5cdFx0Ly8gU2V0IENTUyByZWZzXG5cdFx0dGhpcy4jY3NzUHJvcHMgPSBuZXcgU2V0KGNzc1JlZnMpO1xuXG5cdFx0cmV0dXJuIHRoaXMucmVuZGVyTm9kZSh2ZG9tKTtcblx0fVxuXG5cdCNlbnN1cmVDaGlsZHJlbkFycmF5KGVsOiBSZWFjdEVsZW1lbnQpOiBSZWFjdE5vZGVbXSB7XG5cdFx0Y29uc3QgY2hpbGRyZW4gPSAoZWwucHJvcHMgYXMgYW55KT8uY2hpbGRyZW4gYXMgUmVhY3ROb2RlIHwgdW5kZWZpbmVkO1xuXHRcdGlmIChjaGlsZHJlbiA9PSBudWxsKSByZXR1cm4gW107XG5cdFx0cmV0dXJuIEFycmF5LmlzQXJyYXkoY2hpbGRyZW4pID8gY2hpbGRyZW4uc2xpY2UoKSA6IFtjaGlsZHJlbl07XG5cdH1cblxuXHRhcHBseVVwZGF0ZXMoaW5pdGlhbFRyZWU6IFJlYWN0Tm9kZSwgdXBkYXRlczogVkRPTVVwZGF0ZVtdKTogUmVhY3ROb2RlIHtcblx0XHRsZXQgbmV3VHJlZTogUmVhY3ROb2RlID0gaW5pdGlhbFRyZWU7XG5cdFx0Zm9yIChjb25zdCB1cGRhdGUgb2YgdXBkYXRlcykge1xuXHRcdFx0aWYgKHVwZGF0ZS50eXBlID09PSBcInVwZGF0ZV9jYWxsYmFja3NcIikge1xuXHRcdFx0XHR0aGlzLmFwcGx5Q2FsbGJhY2tEZWx0YSh1cGRhdGUuZGF0YSk7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHVwZGF0ZS50eXBlID09PSBcInVwZGF0ZV9jc3NfcmVmc1wiKSB7XG5cdFx0XHRcdHRoaXMuYXBwbHlDc3NSZWZzRGVsdGEodXBkYXRlLmRhdGEpO1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblx0XHRcdGlmICh1cGRhdGUudHlwZSA9PT0gXCJ1cGRhdGVfcmVuZGVyX3Byb3BzXCIpIHtcblx0XHRcdFx0dGhpcy5hcHBseVJlbmRlclByb3BzRGVsdGEodXBkYXRlLmRhdGEpO1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgcGFydHMgPSB1cGRhdGUucGF0aC5zcGxpdChcIi5cIikuZmlsdGVyKChzKSA9PiBzLmxlbmd0aCA+IDApO1xuXG5cdFx0XHRjb25zdCBkZXNjZW5kID0gKG5vZGU6IFJlYWN0Tm9kZSwgZGVwdGg6IG51bWJlciwgcGF0aDogc3RyaW5nKTogUmVhY3ROb2RlID0+IHtcblx0XHRcdFx0aWYgKGRlcHRoIDwgcGFydHMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0dGhpcy4jYXNzZXJ0SXNFbGVtZW50KG5vZGUsIHBhcnRzLCBkZXB0aCk7XG5cdFx0XHRcdFx0Y29uc3QgZWxlbWVudCA9IG5vZGUgYXMgUmVhY3RFbGVtZW50PFJlY29yZDxzdHJpbmcsIGFueT4gfCBudWxsPjtcblx0XHRcdFx0XHRjb25zdCBjaGlsZEtleSA9IHBhcnRzW2RlcHRoXSE7XG5cdFx0XHRcdFx0Y29uc3QgY2hpbGRJZHggPSArY2hpbGRLZXk7XG5cdFx0XHRcdFx0Y29uc3QgY2hpbGRQYXRoID0gcGF0aCA/IGAke3BhdGh9LiR7Y2hpbGRLZXl9YCA6IGNoaWxkS2V5O1xuXHRcdFx0XHRcdGlmICghTnVtYmVyLmlzTmFOKGNoaWxkSWR4KSkge1xuXHRcdFx0XHRcdFx0Ly8gUmVndWxhciBjaGlsZCB0cmF2ZXJzYWxcblx0XHRcdFx0XHRcdGNvbnN0IGNoaWxkcmVuQXJyID0gdGhpcy4jZW5zdXJlQ2hpbGRyZW5BcnJheShlbGVtZW50KTtcblx0XHRcdFx0XHRcdGNvbnN0IGNoaWxkID0gY2hpbGRyZW5BcnJbY2hpbGRJZHhdO1xuXHRcdFx0XHRcdFx0Y2hpbGRyZW5BcnJbY2hpbGRJZHhdID0gZGVzY2VuZChjaGlsZCwgZGVwdGggKyAxLCBjaGlsZFBhdGgpIGFzIGFueTtcblx0XHRcdFx0XHRcdHJldHVybiBjbG9uZUVsZW1lbnQoZWxlbWVudCwgdW5kZWZpbmVkLCAuLi5jaGlsZHJlbkFycik7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdC8vIFJlbmRlciBwcm9wIHRyYXZlcnNhbFxuXHRcdFx0XHRcdFx0Y29uc3QgYmFzZVByb3BzID0gKGVsZW1lbnQucHJvcHMgPz8ge30pIGFzIFJlY29yZDxzdHJpbmcsIGFueT47XG5cdFx0XHRcdFx0XHRjb25zdCBjaGlsZCA9IGJhc2VQcm9wc1tjaGlsZEtleV07XG5cdFx0XHRcdFx0XHRjb25zdCBwcm9wcyA9IHtcblx0XHRcdFx0XHRcdFx0Li4uYmFzZVByb3BzLFxuXHRcdFx0XHRcdFx0XHRbY2hpbGRLZXldOiBkZXNjZW5kKGNoaWxkLCBkZXB0aCArIDEsIGNoaWxkUGF0aCksXG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0cmV0dXJuIGNsb25lRWxlbWVudChlbGVtZW50LCBwcm9wcyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHN3aXRjaCAodXBkYXRlLnR5cGUpIHtcblx0XHRcdFx0XHRjYXNlIFwicmVwbGFjZVwiOiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5yZW5kZXJOb2RlKHVwZGF0ZS5kYXRhLCB1cGRhdGUucGF0aCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNhc2UgXCJ1cGRhdGVfcHJvcHNcIjoge1xuXHRcdFx0XHRcdFx0dGhpcy4jYXNzZXJ0SXNFbGVtZW50KG5vZGUsIHBhcnRzLCBkZXB0aCk7XG5cdFx0XHRcdFx0XHRjb25zdCBlbGVtZW50ID0gbm9kZSBhcyBSZWFjdEVsZW1lbnQ7XG5cdFx0XHRcdFx0XHRjb25zdCBjdXJyZW50UHJvcHMgPSAoZWxlbWVudC5wcm9wcyA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgYW55Pjtcblx0XHRcdFx0XHRcdGNvbnN0IG5leHRQcm9wczogUmVjb3JkPHN0cmluZywgYW55PiA9IHsgLi4uY3VycmVudFByb3BzIH07XG5cdFx0XHRcdFx0XHRjb25zdCBkZWx0YSA9IHVwZGF0ZS5kYXRhO1xuXHRcdFx0XHRcdFx0aWYgKGRlbHRhLnJlbW92ZSAmJiBkZWx0YS5yZW1vdmUubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0XHRmb3IgKGNvbnN0IGtleSBvZiBkZWx0YS5yZW1vdmUpIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoa2V5IGluIG5leHRQcm9wcykge1xuXHRcdFx0XHRcdFx0XHRcdFx0ZGVsZXRlIG5leHRQcm9wc1trZXldO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKGRlbHRhLnNldCkge1xuXHRcdFx0XHRcdFx0XHRmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhkZWx0YS5zZXQpKSB7XG5cdFx0XHRcdFx0XHRcdFx0bmV4dFByb3BzW2tdID0gdGhpcy50cmFuc2Zvcm1WYWx1ZShwYXRoLCBrLCB2KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQvLyBJZiBzb21lIHByb3BzIHdlcmUgcmVtb3ZlZCwgdXNlIGBjcmVhdGVFbGVtZW50YCB0byBmdWxseSBvdmVycmlkZVxuXHRcdFx0XHRcdFx0Ly8gdGhlIHByb3BzLCBhcyBgY2xvbmVFbGVtZW50YCBzaGFsbG93bHkgbWVyZ2VzIHRoZSBuZXcgcHJvcHMgd2l0aFxuXHRcdFx0XHRcdFx0Ly8gdGhlIG9sZCBvbmVzLlxuXHRcdFx0XHRcdFx0Y29uc3QgcmVtb3ZlZFNvbWV0aGluZyA9IChkZWx0YS5yZW1vdmU/Lmxlbmd0aCA/PyAwKSA+IDA7XG5cdFx0XHRcdFx0XHRpZiAocmVtb3ZlZFNvbWV0aGluZykge1xuXHRcdFx0XHRcdFx0XHQvLyBQcmVzZXJ2ZSBrZXkgKyByZWZcblx0XHRcdFx0XHRcdFx0bmV4dFByb3BzLmtleSA9IGVsZW1lbnQua2V5O1xuXHRcdFx0XHRcdFx0XHRuZXh0UHJvcHMucmVmID0gKGVsZW1lbnQgYXMgYW55KS5yZWY7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBjcmVhdGVFbGVtZW50KGVsZW1lbnQudHlwZSwgbmV4dFByb3BzLCAuLi50aGlzLiNlbnN1cmVDaGlsZHJlbkFycmF5KGVsZW1lbnQpKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdC8vIERvbid0IHRvdWNoIGNoaWxkcmVuLiBLZXkgYW5kIHJlZiBhcmUgdHJhbnNmZXJyZWQgYnkgY2xvbmVFbGVtZW50LlxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gY2xvbmVFbGVtZW50KGVsZW1lbnQsIG5leHRQcm9wcyk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNhc2UgXCJyZWNvbmNpbGlhdGlvblwiOiB7XG5cdFx0XHRcdFx0XHR0aGlzLiNhc3NlcnRJc0VsZW1lbnQobm9kZSwgcGFydHMsIGRlcHRoKTtcblx0XHRcdFx0XHRcdGNvbnN0IGVsZW1lbnQgPSBub2RlIGFzIFJlYWN0RWxlbWVudDtcblx0XHRcdFx0XHRcdGNvbnN0IHByZXZDaGlsZHJlbiA9IHRoaXMuI2Vuc3VyZUNoaWxkcmVuQXJyYXkoZWxlbWVudCk7XG5cdFx0XHRcdFx0XHRjb25zdCBuZXh0Q2hpbGRyZW4gPSBbXTtcblxuXHRcdFx0XHRcdFx0Y29uc3QgW25ld0luZGljZXMsIG5ld0NvbnRlbnRzXSA9IHVwZGF0ZS5uZXc7XG5cdFx0XHRcdFx0XHRjb25zdCBbcmV1c2VJbmRpY2VzLCByZXVzZVNvdXJjZXNdID0gdXBkYXRlLnJldXNlO1xuXG5cdFx0XHRcdFx0XHRsZXQgbmV4dE5ldyA9IC0xLFxuXHRcdFx0XHRcdFx0XHRuZXh0UmV1c2UgPSAtMSxcblx0XHRcdFx0XHRcdFx0bmV3SWR4ID0gLTEsXG5cdFx0XHRcdFx0XHRcdHJldXNlSWR4ID0gLTE7XG5cdFx0XHRcdFx0XHRpZiAobmV3SW5kaWNlcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0XHRcdG5leHROZXcgPSBuZXdJbmRpY2VzWzBdO1xuXHRcdFx0XHRcdFx0XHRuZXdJZHggPSAwO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKHJldXNlSW5kaWNlcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0XHRcdG5leHRSZXVzZSA9IHJldXNlSW5kaWNlc1swXTtcblx0XHRcdFx0XHRcdFx0cmV1c2VJZHggPSAwO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB1cGRhdGUuTjsgKytpKSB7XG5cdFx0XHRcdFx0XHRcdGlmIChpID09PSBuZXh0TmV3KSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgY29udGVudHMgPSBuZXdDb250ZW50c1tuZXdJZHhdO1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IGNoaWxkUGF0aCA9IHBhdGggPyBgJHtwYXRofS4ke2l9YCA6IFN0cmluZyhpKTtcblx0XHRcdFx0XHRcdFx0XHRuZXh0Q2hpbGRyZW4ucHVzaCh0aGlzLnJlbmRlck5vZGUoY29udGVudHMsIGNoaWxkUGF0aCkpO1xuXHRcdFx0XHRcdFx0XHRcdG5leHROZXcgPSBuZXdJZHggPCBuZXdJbmRpY2VzLmxlbmd0aCAtIDEgPyBuZXdJbmRpY2VzWysrbmV3SWR4XSA6IC0xO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGkgPT09IG5leHRSZXVzZSkge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IHNyY0lkeCA9IHJldXNlU291cmNlc1tyZXVzZUlkeF07XG5cdFx0XHRcdFx0XHRcdFx0bGV0IHNyYyA9IHByZXZDaGlsZHJlbltzcmNJZHhdO1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IGNoaWxkUGF0aCA9IHBhdGggPyBgJHtwYXRofS4ke2l9YCA6IFN0cmluZyhpKTtcblx0XHRcdFx0XHRcdFx0XHQvLyBUaGUgbm9kZSBtYXkgaGF2ZSBjYWxsYmFja3MgdGhhdCBuZWVkIHRvIGJlIHVwZGF0ZWQgZm9yIHRoaXMgbmV3IHBhdGhcblx0XHRcdFx0XHRcdFx0XHRpZiAodGhpcy5oYXNBbnlDYWxsYmFja1VuZGVyKGNoaWxkUGF0aCkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdHNyYyA9IHRoaXMuI3JlYmluZENhbGxiYWNrc0luU3VidHJlZShzcmMsIGNoaWxkUGF0aCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdG5leHRDaGlsZHJlbi5wdXNoKHNyYyk7XG5cdFx0XHRcdFx0XHRcdFx0bmV4dFJldXNlID0gcmV1c2VJZHggPCByZXVzZUluZGljZXMubGVuZ3RoIC0gMSA/IHJldXNlSW5kaWNlc1srK3JldXNlSWR4XSA6IC0xO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdC8vIE5vIG5lZWQgdG8gcmViaW5kIGNhbGxiYWNrcywgdGhlIG5vZGUgaGFzbid0IG1vdmVkXG5cdFx0XHRcdFx0XHRcdFx0bmV4dENoaWxkcmVuLnB1c2gocHJldkNoaWxkcmVuW2ldKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0Ly8gUGFzcyBudWxsIHRvIHJldXNlIHByZXZpb3VzIHByb3BzXG5cdFx0XHRcdFx0XHRyZXR1cm4gY2xvbmVFbGVtZW50KGVsZW1lbnQsIG51bGwhLCAuLi5uZXh0Q2hpbGRyZW4pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBbUHVsc2UgcmVuZGVyZXJdIFVua25vd24gdXBkYXRlIHR5cGU6ICR7KHVwZGF0ZSBhcyBhbnkpPy50eXBlfWApO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXG5cdFx0XHRuZXdUcmVlID0gZGVzY2VuZChuZXdUcmVlLCAwLCBcIlwiKTtcblx0XHR9XG5cdFx0cmV0dXJuIG5ld1RyZWU7XG5cdH1cblxuXHQjYXNzZXJ0SXNFbGVtZW50KG5vZGU6IFJlYWN0Tm9kZSwgcGFydHM6IHN0cmluZ1tdLCBkZXB0aDogbnVtYmVyKTogbm9kZSBpcyBSZWFjdEVsZW1lbnQge1xuXHRcdGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgJiYgIWlzVmFsaWRFbGVtZW50KG5vZGUpKSB7XG5cdFx0XHRjb25zb2xlLmVycm9yKFwiSW52YWxpZCBub2RlOlwiLCBub2RlKTtcblx0XHRcdHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBub2RlIGF0IHBhdGggJHtwYXJ0cy5zbGljZSgwLCBkZXB0aCkuam9pbihcIi5cIil9YCk7XG5cdFx0fVxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0Ly8gUmViaW5kIGNhbGxiYWNrIGZ1bmN0aW9uIHByb3BzIHdpdGhpbiBhIHN1YnRyZWUgYWZ0ZXIgYSBwYXRoLWNoYW5naW5nIG1vdmVcblx0I3JlYmluZENhbGxiYWNrc0luU3VidHJlZShub2RlOiBSZWFjdE5vZGUsIHBhdGg6IHN0cmluZyk6IFJlYWN0Tm9kZSB7XG5cdFx0aWYgKCFpc1ZhbGlkRWxlbWVudChub2RlKSkgcmV0dXJuIG5vZGU7XG5cdFx0Y29uc3QgZWxlbWVudCA9IG5vZGUgYXMgUmVhY3RFbGVtZW50PFJlY29yZDxzdHJpbmcsIGFueT4gfCBudWxsPjtcblx0XHRjb25zdCBiYXNlUHJvcHMgPSAoZWxlbWVudC5wcm9wcyA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgYW55Pjtcblx0XHRjb25zdCBuZXh0UHJvcHM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7IC4uLmJhc2VQcm9wcyB9O1xuXG5cdFx0Ly8gUmViaW5kIG9ubHkgY2FsbGJhY2sgcHJvcHM7IENTUyByZWZzIGFyZSBwYXRoLWFnbm9zdGljIGFuZCByZW5kZXItcHJvcHNcblx0XHQvLyBhcmUgaGFuZGxlZCBieSB0aGUgc2VydmVyLXNpZGUgcmVuZGVyZXIgdmlhIGV4cGxpY2l0IHVwZGF0ZXNcblx0XHRmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhiYXNlUHJvcHMpKSB7XG5cdFx0XHRjb25zdCBwcm9wUGF0aCA9IHBhdGggPyBgJHtwYXRofS4ke2tleX1gIDoga2V5O1xuXHRcdFx0aWYgKHRoaXMuaGFzQ2FsbGJhY2tQYXRoKHByb3BQYXRoKSkge1xuXHRcdFx0XHRuZXh0UHJvcHNba2V5XSA9IHRoaXMuZ2V0Q2FsbGJhY2socGF0aCwga2V5KTtcblx0XHRcdH1cblx0XHRcdGlmICh0aGlzLmhhc1JlbmRlclByb3BQYXRoKHByb3BQYXRoKSAmJiB0aGlzLmhhc0FueUNhbGxiYWNrVW5kZXIocHJvcFBhdGgpKSB7XG5cdFx0XHRcdG5leHRQcm9wc1trZXldID0gdGhpcy4jcmViaW5kQ2FsbGJhY2tzSW5TdWJ0cmVlKGJhc2VQcm9wc1trZXldLCBwcm9wUGF0aCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Y29uc3QgY2hpbGRyZW4gPSB0aGlzLiNlbnN1cmVDaGlsZHJlbkFycmF5KGVsZW1lbnQpLm1hcCgoY2hpbGQsIGlkeCkgPT4ge1xuXHRcdFx0Y29uc3QgY2hpbGRQYXRoID0gcGF0aCA/IGAke3BhdGh9LiR7aWR4fWAgOiBTdHJpbmcoaWR4KTtcblx0XHRcdGlmICh0aGlzLmhhc0FueUNhbGxiYWNrVW5kZXIoY2hpbGRQYXRoKSkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy4jcmViaW5kQ2FsbGJhY2tzSW5TdWJ0cmVlKGNoaWxkLCBjaGlsZFBhdGgpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIGNoaWxkO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIGNsb25lRWxlbWVudChlbGVtZW50LCBuZXh0UHJvcHMsIC4uLmNoaWxkcmVuKTtcblx0fVxuXG5cdC8vIEJpbmFyeS1zZWFyY2ggbG93ZXIgYm91bmQgZm9yIHByZWZpeCBtYXRjaGluZyBvbiBzb3J0ZWQgY2FsbGJhY2sgcGF0aHNcblx0I2xvd2VyQm91bmQoYXJyOiBzdHJpbmdbXSwgdGFyZ2V0OiBzdHJpbmcpOiBudW1iZXIge1xuXHRcdGxldCBsbyA9IDA7XG5cdFx0bGV0IGhpID0gYXJyLmxlbmd0aDtcblx0XHR3aGlsZSAobG8gPCBoaSkge1xuXHRcdFx0Y29uc3QgbWlkID0gKGxvICsgaGkpID4+PiAxO1xuXHRcdFx0aWYgKGFyclttaWRdISA8IHRhcmdldCkge1xuXHRcdFx0XHRsbyA9IG1pZCArIDE7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRoaSA9IG1pZDtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGxvO1xuXHR9XG59XG5cbi8vIFRoZSBgY29tcG9uZW50YCBwcm9wIHNob3VsZCBiZSBzb21ldGhpbmcgbGlrZSBgKCkgPT5cbi8vIGltcG9ydCgnfi9wYXRoL3RvL2NvbXBvbmVudCcpICh3ZSdsbCBuZWVkIHRvIHJlbWFwIGlmIHdlJ3JlIGltcG9ydGluZyBhIG5hbWVkIGV4cG9ydCBhbmQgbm90IHRoZSBkZWZhdWx0KVxuZXhwb3J0IGZ1bmN0aW9uIFJlbmRlckxhenkoXG5cdGNvbXBvbmVudDogKCkgPT4gUHJvbWlzZTx7IGRlZmF1bHQ6IENvbXBvbmVudFR5cGU8YW55PiB9Pixcblx0ZmFsbGJhY2s/OiBSZWFjdE5vZGUsXG4pOiBGQzxQcm9wc1dpdGhDaGlsZHJlbjx1bmtub3duPj4ge1xuXHRjb25zdCBDb21wb25lbnQgPSBsYXp5KGNvbXBvbmVudCk7XG5cdHJldHVybiAoeyBjaGlsZHJlbiwgLi4ucHJvcHMgfTogUHJvcHNXaXRoQ2hpbGRyZW48dW5rbm93bj4pID0+IHtcblx0XHRyZXR1cm4gKFxuXHRcdFx0PFN1c3BlbnNlIGZhbGxiYWNrPXtmYWxsYmFja30+XG5cdFx0XHRcdDxDb21wb25lbnQgey4uLnByb3BzfT57Y2hpbGRyZW59PC9Db21wb25lbnQ+XG5cdFx0XHQ8L1N1c3BlbnNlPlxuXHRcdCk7XG5cdH07XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgQ29tcG9uZW50VHlwZSB9IGZyb20gXCJyZWFjdFwiO1xuXG4vLyBTcGVjaWFsIHByZWZpeGVzIGZvciByZXNlcnZlZCBub2RlIHR5cGVzXG5leHBvcnQgY29uc3QgRlJBR01FTlRfVEFHID0gXCIkJGZyYWdtZW50XCI7XG5leHBvcnQgY29uc3QgTU9VTlRfUE9JTlRfUFJFRklYID0gXCIkJFwiO1xuXG4vLyBleHBvcnQgdHlwZSBMYXp5Q29tcG9uZW50ID0gKCkgPT4gUHJvbWlzZTx7IGRlZmF1bHQ6IENvbXBvbmVudFR5cGU8YW55PiB9PjtcbmV4cG9ydCB0eXBlIFJlZ2lzdHJ5RW50cnkgPSBDb21wb25lbnRUeXBlPGFueT47XG5leHBvcnQgdHlwZSBDb21wb25lbnRSZWdpc3RyeSA9IFJlY29yZDxzdHJpbmcsIENvbXBvbmVudFR5cGU8YW55Pj47XG5cbmV4cG9ydCBpbnRlcmZhY2UgVkRPTUVsZW1lbnQge1xuXHR0YWc6IHN0cmluZztcblx0cHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuXHRjaGlsZHJlbj86IFZET01Ob2RlW107XG5cdGtleT86IHN0cmluZztcblx0bGF6eT86IGJvb2xlYW47XG59XG5cbi8vIFByaW1pdGl2ZSBub2RlcyB0aGF0IGNhbiBiZSByZW5kZXJlZFxuZXhwb3J0IHR5cGUgUHJpbWl0aXZlTm9kZSA9IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW47XG5cbi8vIFZET01Ob2RlIGlzIGVpdGhlciBhIHByaW1pdGl2ZSAoc3RyaW5nLCBudW1iZXIsIGJvb2xlYW4pIG9yIGFuIGVsZW1lbnQgbm9kZS5cbi8vIEJvb2xlYW5zIGFyZSB2YWxpZCBjaGlsZHJlbiBpbiBSZWFjdCBidXQgZG8gbm90IHJlbmRlciBhbnl0aGluZy5cbi8vIE1vdW50IHBvaW50cyBhcmUganVzdCBVSUVsZW1lbnROb2RlcyB3aXRoIHRhZ3Mgc3RhcnRpbmcgd2l0aCAkJENvbXBvbmVudEtleVxuZXhwb3J0IHR5cGUgVkRPTU5vZGUgPSBQcmltaXRpdmVOb2RlIHwgVkRPTUVsZW1lbnQ7XG5cbmV4cG9ydCB0eXBlIFZET00gPSBWRE9NTm9kZTtcblxuZXhwb3J0IGludGVyZmFjZSBWRE9NVXBkYXRlQmFzZSB7XG5cdHR5cGU6IHN0cmluZztcblx0cGF0aDogc3RyaW5nOyAvLyBEb3Qtc2VwYXJhdGVkIHBhdGggdG8gdGhlIG5vZGVcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXBsYWNlVXBkYXRlIGV4dGVuZHMgVkRPTVVwZGF0ZUJhc2Uge1xuXHR0eXBlOiBcInJlcGxhY2VcIjtcblx0ZGF0YTogVkRPTU5vZGU7IC8vIFRoZSBuZXcgbm9kZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZVByb3BzVXBkYXRlIGV4dGVuZHMgVkRPTVVwZGF0ZUJhc2Uge1xuXHR0eXBlOiBcInVwZGF0ZV9wcm9wc1wiO1xuXHRkYXRhOiB7XG5cdFx0c2V0PzogUmVjb3JkPHN0cmluZywgYW55Pjtcblx0XHRyZW1vdmU/OiBzdHJpbmdbXTtcblx0fTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZWNvbmNpbGlhdGlvblVwZGF0ZSB7XG5cdHR5cGU6IFwicmVjb25jaWxpYXRpb25cIjtcblx0cGF0aDogc3RyaW5nO1xuXHROOiBudW1iZXI7XG5cdG5ldzogW251bWJlcltdLCBWRE9NW11dO1xuXHRyZXVzZTogW251bWJlcltdLCBudW1iZXJbXV07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGF0aERlbHRhIHtcblx0YWRkPzogc3RyaW5nW107XG5cdHJlbW92ZT86IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZUNhbGxiYWNrc1VwZGF0ZSBleHRlbmRzIFZET01VcGRhdGVCYXNlIHtcblx0dHlwZTogXCJ1cGRhdGVfY2FsbGJhY2tzXCI7XG5cdGRhdGE6IFBhdGhEZWx0YTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVSZW5kZXJQcm9wc1VwZGF0ZSBleHRlbmRzIFZET01VcGRhdGVCYXNlIHtcblx0dHlwZTogXCJ1cGRhdGVfcmVuZGVyX3Byb3BzXCI7XG5cdGRhdGE6IFBhdGhEZWx0YTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVDc3NSZWZzVXBkYXRlIGV4dGVuZHMgVkRPTVVwZGF0ZUJhc2Uge1xuXHR0eXBlOiBcInVwZGF0ZV9jc3NfcmVmc1wiO1xuXHRkYXRhOiBQYXRoRGVsdGE7XG59XG5cbmV4cG9ydCB0eXBlIFZET01VcGRhdGUgPVxuXHR8IFJlcGxhY2VVcGRhdGVcblx0fCBVcGRhdGVQcm9wc1VwZGF0ZVxuXHR8IFJlY29uY2lsaWF0aW9uVXBkYXRlXG5cdHwgVXBkYXRlQ2FsbGJhY2tzVXBkYXRlXG5cdHwgVXBkYXRlUmVuZGVyUHJvcHNVcGRhdGVcblx0fCBVcGRhdGVDc3NSZWZzVXBkYXRlO1xuXG5leHBvcnQgdHlwZSBVcGRhdGVUeXBlID0gVkRPTVVwZGF0ZVtcInR5cGVcIl07XG5cbi8vIFV0aWxpdHkgZnVuY3Rpb25zIGZvciB3b3JraW5nIHdpdGggdGhlIFVJIHRyZWUgc3RydWN0dXJlXG5leHBvcnQgZnVuY3Rpb24gaXNFbGVtZW50Tm9kZShub2RlOiBWRE9NTm9kZSk6IG5vZGUgaXMgVkRPTUVsZW1lbnQge1xuXHQvLyBNYXRjaGVzIGFsbCBub24tdGV4dCBub2Rlc1xuXHRyZXR1cm4gdHlwZW9mIG5vZGUgPT09IFwib2JqZWN0XCIgJiYgbm9kZSAhPT0gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTW91bnRQb2ludE5vZGUobm9kZTogVkRPTU5vZGUpOiBub2RlIGlzIFZET01FbGVtZW50IHtcblx0cmV0dXJuIChcblx0XHR0eXBlb2Ygbm9kZSA9PT0gXCJvYmplY3RcIiAmJlxuXHRcdG5vZGUgIT09IG51bGwgJiZcblx0XHRub2RlLnRhZy5zdGFydHNXaXRoKE1PVU5UX1BPSU5UX1BSRUZJWCkgJiZcblx0XHRub2RlLnRhZyAhPT0gRlJBR01FTlRfVEFHXG5cdCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1RleHROb2RlKG5vZGU6IFZET01Ob2RlKTogbm9kZSBpcyBzdHJpbmcge1xuXHRyZXR1cm4gdHlwZW9mIG5vZGUgPT09IFwic3RyaW5nXCI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0ZyYWdtZW50KG5vZGU6IFZET01Ob2RlKTogYm9vbGVhbiB7XG5cdHJldHVybiB0eXBlb2Ygbm9kZSA9PT0gXCJvYmplY3RcIiAmJiBub2RlICE9PSBudWxsICYmIG5vZGUudGFnID09PSBGUkFHTUVOVF9UQUc7XG59XG4iLAogICAgImltcG9ydCB7IHVzZUVmZmVjdCwgdXNlTWVtbyB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHR5cGUgeyBDaGFubmVsQnJpZGdlIH0gZnJvbSBcIi4vY2hhbm5lbFwiO1xuaW1wb3J0IHsgdXNlUHVsc2VDbGllbnQgfSBmcm9tIFwiLi9wdWxzZVwiO1xuXG5leHBvcnQgZnVuY3Rpb24gdXNlUHVsc2VDaGFubmVsKGNoYW5uZWxJZDogc3RyaW5nKTogQ2hhbm5lbEJyaWRnZSB7XG5cdGNvbnN0IGNsaWVudCA9IHVzZVB1bHNlQ2xpZW50KCk7XG5cdGNvbnN0IGJyaWRnZSA9IHVzZU1lbW8oKCkgPT4ge1xuXHRcdGlmICghY2hhbm5lbElkKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJ1c2VQdWxzZUNoYW5uZWwgcmVxdWlyZXMgYSBub24tZW1wdHkgY2hhbm5lbElkXCIpO1xuXHRcdH1cblx0XHRyZXR1cm4gY2xpZW50LmFjcXVpcmVDaGFubmVsKGNoYW5uZWxJZCk7XG5cdH0sIFtjbGllbnQsIGNoYW5uZWxJZF0pO1xuXG5cdHVzZUVmZmVjdCgoKSA9PiB7XG5cdFx0cmV0dXJuICgpID0+IHtcblx0XHRcdGNsaWVudC5yZWxlYXNlQ2hhbm5lbChjaGFubmVsSWQpO1xuXHRcdH07XG5cdH0sIFtjbGllbnQsIGNoYW5uZWxJZF0pO1xuXG5cdHJldHVybiBicmlkZ2U7XG59XG4iCiAgXSwKICAibWFwcGluZ3MiOiAiO0FBT08sTUFBTSxVQUErQixLQUFNLENBQ2pELFdBQVcsQ0FBQyxFQUFpQixDQUM1QixNQUFNLENBQU8sRUFDYixLQUFLLEtBQU8seUJBRWQsQ0FTQSxTQUFTLEVBQVEsRUFBVyxDQUMzQixHQUFJLE9BQU8sT0FBVyxLQUFlLE9BQU8sT0FBTyxhQUFlLFdBQ2pFLE9BQU8sT0FBTyxXQUFXLEVBQUUsUUFBUSxLQUFNLEVBQUUsRUFFNUMsT0FBTyxLQUFLLE9BQU8sRUFBRSxTQUFTLEVBQUUsRUFBRSxNQUFNLENBQUMsRUFBSSxLQUFLLE9BQU8sRUFBRSxTQUFTLEVBQUUsRUFBRSxNQUFNLENBQUMsRUFHaEYsU0FBUyxFQUFXLENBQUMsRUFBd0IsQ0FDNUMsR0FBSSxhQUFpQixNQUFPLE9BQU8sRUFBTSxRQUN6QyxHQUFJLE9BQU8sSUFBVSxTQUFVLE9BQU8s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LEVBQU8sVUFBVSxFQUFNLENBQ3RCLFlBQ0EsT0FBUSxDQUFDLEVBQU0sRUFBVyxFQUFhLElBQVksQ0FDbEQsRUFBUSxFQUFTLEtBQUssRUFBTSxFQUFXLEVBQWEsQ0FBTyxDQUFDLEdBRTdELFNBQVUsQ0FBQyxJQUFRLENBQ2xCLEVBQVEsQ0FBQyxJQUFVLEdBQVEsS0FBTyxFQUFPLEVBQVMsYUFBYSxFQUFNLENBQUcsQ0FBRSxFQUU1RSxDQUFDLEVBQ0QsSUFBTSxFQUFTLEVBQU8sY0FBYyxDQUFDLEVBQUcsSUFBUSxDQUMvQyxHQUFJLElBQU0sRUFBTSxFQUFlLENBQUcsRUFDbEMsRUFDRCxNQUFPLElBQU0sQ0FDWixFQUFPLEVBQ1AsRUFBTyxRQUFRLENBQUksS0FJbkIsQ0FBQyxFQUFRLEVBQVUsRUFBTSxDQUFTLENBQUMsRUFFdEMsRUFBVSxJQUFNLENBQ2YsR0FBSSxFQUNILEVBQU8sU0FBUyxFQUFNLENBQVMsR0FFOUIsQ0FBQyxFQUFRLEVBQU0sQ0FBUyxDQUFDLEVBRXhCLEVBQ0gsT0FBTyxFQUFDLEdBQUQsQ0FBYSxNQUFPLEVBQWEsRUFHekMsT0FBTyxFQUdSLFNBQVMsRUFBVyxFQUFHLFNBQXFDLENBQzNELE9BQ0MsRUFtQkUsTUFuQkYsQ0FDQyxNQUFPLENBQ04sUUFBUyxHQUNULE9BQVEsaUJBQ1IsV0FBWSxVQUNaLE1BQU8sT0FDUCxXQUNDLHFHQUNELFdBQVksVUFDYixFQVRELFNBbUJFLENBUkQsRUFBcUYsTUFBckYsQ0FBSyxNQUFPLENBQUUsV0FBWSxJQUFLLGFBQWMsQ0FBRSxFQUEvQyxTQUFxRixDQUFyRix1QkFBdUUsRUFBTSxPQUFRLEVBQ3BGLEVBQU0sU0FBVyxFQUFzQixNQUF0QixVQUFNLEVBQU0sUUFBVSxFQUN2QyxFQUFNLE9BQ04sRUFHRSxVQUhGLENBQVMsS0FBSSxHQUFDLE1BQU8sQ0FBRSxVQUFXLENBQUUsRUFBcEMsU0FHRSxDQUZELEVBQXNCLFVBQXRCLHdCQUFzQixFQUN0QixFQUEwQyxNQUExQyxDQUFLLE1BQU8sQ0FBRSxPQUFRLENBQUUsRUFBeEIsU0FBNEIsRUFBTSxNQUFRLEdBQ3pDLEdBRUYsRVE3Tkosb0JBQVMsY0FBVyxlQUliLFNBQVMsRUFBZSxDQUFDLEVBQWtDLENBQ2pFLElBQU0sRUFBUyxFQUFlLEVBQ3hCLEVBQVMsR0FBUSxJQUFNLENBQzVCLEdBQUksQ0FBQyxFQUNKLE1BQVUsTUFBTSxnREFBZ0QsRUFFakUsT0FBTyxFQUFPLGVBQWUsQ0FBUyxHQUNwQyxDQUFDLEVBQVEsQ0FBUyxDQUFDLEVBUXRCLE9BTkEsR0FBVSxJQUFNLENBQ2YsTUFBTyxJQUFNLENBQ1osRUFBTyxlQUFlLENBQVMsSUFFOUIsQ0FBQyxFQUFRLENBQVMsQ0FBQyxFQUVmIiwKICAiZGVidWdJZCI6ICI4OTcyMTFDODhFRjU1REI0NjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==