pulse-ui-client 0.0.10 → 0.0.13
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/dist/channel.d.ts +28 -0
- package/dist/channel.test.d.ts +1 -0
- package/dist/client.d.ts +9 -1
- package/dist/form.d.ts +21 -0
- package/dist/index.bun.js +3 -3
- package/dist/index.d.ts +7 -2
- package/dist/index.js +2 -2
- package/dist/index.js.map +11 -9
- package/dist/index.node.js +3 -3
- package/dist/messages.d.ts +40 -2
- package/dist/serialize/v3.d.ts +12 -0
- package/dist/serialize/v3.test.d.ts +1 -0
- package/dist/usePulseChannel.d.ts +2 -0
- package/package.json +1 -1
package/dist/index.node.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{useEffect as p,useState as c,useMemo as n,createContext as z1,useContext as G1}from"react";import D1,{cloneElement as k,createElement as e,lazy as R1,Suspense as A1}from"react";var o="$$fragment",r="$$";function a(W){return typeof W==="object"&&W!==null}function t(W){return typeof W==="object"&&W!==null&&W.tag.startsWith("$$")&&W.tag!=="$$fragment"}import{jsx as x,Fragment as f1}from"react/jsx-runtime";class M{client;path;components;callbackCache;constructor(W,q,Z){this.client=W;this.path=q;this.components=Z;this.callbackCache=new Map}getCallback(W){let q=this.callbackCache.get(W);if(!q)q=(...Z)=>this.client.invokeCallback(this.path,W,Z),this.callbackCache.set(W,q);return q}renderNode(W){if(W==null||typeof W==="boolean"||typeof W==="number"||typeof W==="string")return W;if(a(W)){let{tag:q,props:Z={},children:J=[]}=W,$={};for(let[z,Q]of Object.entries(Z))if(typeof Q==="string"&&Q.startsWith("$$fn:")){let X=Q.substring(5);$[z]=this.getCallback(X)}else $[z]=Q;if(W.key)$.key=W.key;let G=[];for(let z of J)G.push(this.renderNode(z));if(t(W)){let z=W.tag.slice(r.length),Q=this.components[z];return e(Q,$,...G)}return e(q===o?D1.Fragment:q,$,...G)}return null}}function y(W){let q=W.props?.children;if(q==null)return[];return Array.isArray(q)?q.slice():[q]}function N1(W,q){let Z={};for(let[J,$]of Object.entries(q||{}))if(typeof $==="string"&&$.startsWith("$$fn:")){let G=$.substring(5);Z[J]=W.getCallback(G)}else Z[J]=$;return Z}function O1(W,q){return k(W,void 0,...q)}function u(W,q,Z){let J=W;for(let $ of q){let G=$.path.split(".").filter((Q)=>Q.length>0).map(Number),z=(Q,X)=>{if(X<G.length){H(Q,G,X),Q=Q;let F=G[X],U=y(Q),P=U[F];return U[F]=z(P,X+1),O1(Q,U)}switch($.type){case"replace":return Z.renderNode($.data);case"update_props":{H(Q,G,X),Q=Q;let U={...Q.props??{}};console.log("update_props, data:",$.data);let P=$.data;if(P.remove&&P.remove.length>0){for(let D of P.remove)if(D in U)delete U[D]}if(P.set){let D=N1(Z,P.set);for(let[R,f]of Object.entries(D))U[R]=f}return console.log("Old props:",Q.props),console.log("New props:",U),k(Q,U)}case"insert":{H(Q,G,X),Q=Q;let F=y(Q);return F.splice($.idx,0,Z.renderNode($.data)),k(Q,null,...F)}case"remove":{H(Q,G,X),Q=Q;let F=y(Q);return F.splice($.idx,1),k(Q,null,...F)}case"move":{H(Q,G,X),Q=Q;let F=y(Q),U=F.splice($.data.from_index,1)[0];return F.splice($.data.to_index,0,U),k(Q,null,...F)}default:throw Error(`[Pulse renderer] Unknown update type: ${$.type}`)}};J=z(J,0)}return J}function C1(W,q){let Z=R1(W);return({children:J,...$})=>{return x(A1,{fallback:q??x(f1,{}),children:x(Z,{...$,children:J})})}}function H(W,q,Z){return!0}function I(){function W(q,Z){return(J)=>{let $={};for(let G of q)$[G]=J[G];if(Z)for(let G in Z){let z=Z[G];$[G]=z(J)}return $}}return W}var I1=(W)=>W.tagName.toLowerCase(),B1=["id","className","tagName","localName","clientHeight","clientLeft","clientTop","clientWidth","scrollHeight","scrollLeft","scrollTop","scrollWidth","slot"],K1=["autofocus","tabIndex","nonce"],w1=["accessKey","accessKeyLabel","autocapitalize","dir","draggable","hidden","inert","lang","offsetHeight","offsetLeft","offsetTop","offsetWidth","popover","spellcheck","title","translate","writingSuggestions","contentEditable","enterKeyHint","isContentEditable","inputMode"],g1=I()(B1,{tagName:I1}),H1=I()(K1),k1=I()(w1);function B(W){return{...g1(W),...H1(W),...k1(W)}}function V(W,q){let Z=I()(W,q);return(J)=>({...B(J),...Z(J)})}var Y1=["hash","host","hostname","href","origin","password","pathname","port","protocol","search","target","download","rel","hreflang","type","username","ping","referrerPolicy","text"],j1=V(Y1),L1=["alt","coords","download","hash","host","hostname","href","origin","password","pathname","port","protocol","rel","search","shape","target","username","ping","referrerPolicy"],y1=V(L1),M1=["autoplay","controls","crossOrigin","currentSrc","currentTime","defaultMuted","defaultPlaybackRate","duration","ended","loop","muted","networkState","paused","playbackRate","preload","readyState","seeking","src","volume","preservesPitch"],Q1=V(M1),b1=(W)=>Q1(W),S1=["disabled","name","type","value","formAction","formEnctype","formMethod","formNoValidate","formTarget","popoverTargetAction"],_1=V(S1),T1=["value"],h1=V(T1),m1=["height","src","type","width","align","name"],p1=V(m1),x1=["disabled","name","type","validationMessage","willValidate"],u1=V(x1),E1=["acceptCharset","action","autocomplete","encoding","enctype","length","method","name","noValidate","target","rel"],v1=V(E1),i1=["allow","allowFullscreen","height","name","referrerPolicy","src","srcdoc","width","align","frameBorder","longDesc","marginHeight","marginWidth","scrolling","sandbox"],c1=V(i1),n1=["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"],s1=V(n1),l1=["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"],d1=V(l1),o1=["htmlFor"],r1=V(o1),a1=["value","type"],t1=V(a1),e1=["as","crossOrigin","disabled","fetchPriority","href","hreflang","imageSizes","imageSrcset","integrity","media","referrerPolicy","rel","type","charset","rev","target","sizes"],WW=V(e1),qW=["name"],ZW=V(qW),$W=["high","low","max","min","optimum","value"],QW=V($W),JW=["cite","dateTime"],W1=V(JW),XW=["reversed","start","type","compact"],zW=V(XW),GW=["data","height","name","type","useMap","width","validationMessage","willValidate","align","archive","border","code","codeBase","codeType","declare","hspace","standby","vspace"],FW=V(GW),VW=["disabled","label"],UW=V(VW),PW=["defaultSelected","disabled","index","label","selected","text","value"],DW=V(PW),RW=["defaultValue","name","type","value","htmlFor","validationMessage","willValidate"],AW=V(RW),NW=["max","position","value"],OW=V(NW),CW=["cite"],q1=V(CW),fW=(W)=>B(W),IW=["async","crossOrigin","defer","fetchPriority","integrity","noModule","referrerPolicy","src","text","type","charset"],BW=I()(IW,{event:(W)=>W.event,htmlFor:(W)=>W.htmlFor}),KW=(W)=>({...B(W),...BW(W)}),wW=["autocomplete","disabled","length","multiple","name","required","selectedIndex","size","type","value","validationMessage","willValidate"],gW=V(wW),HW=["name"],kW=V(HW),YW=["height","media","sizes","src","srcset","type","width"],jW=V(YW),LW=["align"],yW=V(LW),MW=["abbr","cellIndex","colSpan","headers","rowSpan","scope","align","axis","bgColor","ch","chOff","height","noWrap","vAlign","width"],Z1=V(MW),bW=["span","align","ch","chOff","vAlign","width"],$1=V(bW),SW=["align","bgColor","border","cellPadding","cellSpacing","frame","rules","summary","width"],_W=V(SW),TW=["rowIndex","sectionRowIndex","align","bgColor","ch","chOff","vAlign"],hW=V(TW),mW=["align","ch","chOff","vAlign"],E=V(mW),pW=(W)=>B(W),xW=["autocomplete","cols","defaultValue","dirName","disabled","maxLength","minLength","name","placeholder","readOnly","required","rows","selectionDirection","selectionEnd","selectionStart","value","wrap","textLength","validationMessage","willValidate"],uW=V(xW),EW=["dateTime"],vW=V(EW),iW=["default","kind","label","readyState","src","srclang"],cW=V(iW),nW=["height","poster","videoHeight","videoWidth","width","playsInline"],sW=I()(nW),lW=(W)=>({...Q1(W),...sW(W)}),dW=["clear"],oW=V(dW),rW=["href","target"],aW=V(rW),tW=["aLink","background","bgColor","link","text","vLink"],eW=V(tW),Wq=["compact"],qq=V(Wq),Zq=["open"],$q=V(Zq),Qq=["open","returnValue"],Jq=V(Qq),Xq=["align"],zq=V(Xq),Gq=(W)=>B(W),Fq=["align"],K=V(Fq),Vq=["align","color","noShade","size","width"],Uq=V(Vq),Pq=["version"],Dq=V(Pq),Rq=(W)=>B(W),Aq=["content","httpEquiv","name","scheme"],Nq=V(Aq),Oq=["align"],Cq=V(Oq),fq=(W)=>B(W),Iq=["width"],Bq=V(Iq),Kq=(W)=>B(W),wq=["media","type","disabled"],gq=V(wq),Hq=["text"],kq=V(Hq),Yq=["compact","type"],jq=V(Yq),Lq={A:j1,AREA:y1,AUDIO:b1,BASE:aW,BLOCKQUOTE:q1,Q:q1,BODY:eW,BR:oW,BUTTON:_1,CANVAS:B,CAPTION:yW,CITE:fW,COL:$1,COLGROUP:$1,DATA:h1,DETAILS:$q,DIALOG:Jq,DIV:zq,DL:qq,EMBED:p1,FIELDSET:u1,FORM:v1,H1:K,H2:K,H3:K,H4:K,H5:K,H6:K,HEAD:Gq,HR:Uq,HTML:Dq,IFRAME:c1,IMG:s1,INPUT:d1,LABEL:r1,LI:t1,LINK:WW,MAP:ZW,MENU:Rq,META:Nq,METER:QW,INS:W1,DEL:W1,OBJECT:FW,OL:zW,OPTGROUP:UW,OPTION:DW,OUTPUT:AW,P:Cq,PICTURE:fq,PRE:Bq,PROGRESS:OW,SCRIPT:KW,SELECT:gW,SLOT:kW,SOURCE:jW,SPAN:Kq,STYLE:gq,TABLE:_W,TBODY:E,THEAD:E,TFOOT:E,TD:Z1,TH:Z1,TEMPLATE:pW,TEXTAREA:uW,TIME:vW,TITLE:kq,TR:hW,TRACK:cW,UL:jq,VIDEO:lW};function b(W){let q=W.tagName.toUpperCase(),Z=Lq[q];if(Z)return Z(W);throw Error(`Unexpected HTML element tag: ${W.tagName} (update .web/custom/serialize.ts)`)}var yq=(W)=>b(W.target),Y=(W)=>W.relatedTarget?b(W.relatedTarget):null;function A(W,q){return I()(W,{target:yq,...q||{}})}var C=["target","bubbles","cancelable","defaultPrevented","eventPhase","isTrusted","timeStamp","type"],S=[...C,"detail"],_=[...S,"altKey","button","buttons","clientX","clientY","ctrlKey","metaKey","movementX","movementY","pageX","pageY","screenX","screenY","shiftKey"],Mq=[..._,"pointerId","pressure","tangentialPressure","tiltX","tiltY","twist","width","height","pointerType","isPrimary"],bq=A(C),Sq=A(S),_q=A(_,{relatedTarget:Y}),Tq=A(C,{clipboardData:(W)=>J1(W.clipboardData)}),hq=A([...C,"data"]),mq=A(_,{relatedTarget:Y,dataTransfer:(W)=>J1(W.dataTransfer)}),pq=A(Mq,{relatedTarget:Y}),xq=A(C,{relatedTarget:Y}),uq=A(C),Eq=A(C),vq=A(C),iq=A([...S,"altKey","ctrlKey","code","key","locale","location","metaKey","repeat","shiftKey"]),cq=A([...S,"altKey","ctrlKey","metaKey","shiftKey","changedTouches","targetTouches","touches"],{changedTouches:(W)=>v(W.changedTouches),targetTouches:(W)=>v(W.targetTouches),touches:(W)=>v(W.touches)}),nq=A([..._,"deltaMode","deltaX","deltaY","deltaZ"],{relatedTarget:Y}),sq=A([...C,"animationName","elapsedTime","pseudoElement"]),lq=A([...C,"oldState","newState"]),dq=A([...C,"elapsedTime","propertyName","pseudoElement"]);function v(W){return Array.from(W).map((q)=>({target:b(q.target),identifier:q.identifier,screenX:q.screenX,screenY:q.screenY,clientX:q.clientX,clientY:q.clientY,pageX:q.pageX,pageY:q.pageY}))}function J1(W){if(!W)return null;let q=[];if(W.items)for(let Z=0;Z<W.items.length;Z++){let J=W.items[Z];q.push({kind:J.kind,type:J.type})}return{drop_effect:W.dropEffect,effect_allowed:W.effectAllowed,items:q,types:Array.from(W.types||[])}}var N={};function O(W,q,Z){for(let J of q)W[J]=Z}O(N,["pointerdown","pointermove","pointerup","pointercancel","gotpointercapture","lostpointercapture","pointerenter","pointerleave","pointerover","pointerout"],pq);O(N,["click","contextmenu","dblclick","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup"],_q);O(N,["drag","dragend","dragenter","dragexit","dragleave","dragover","dragstart","drop"],mq);O(N,["keydown","keypress","keyup"],iq);O(N,["focus","blur"],xq);O(N,["change","input"],vq);O(N,["invalid"],Eq);O(N,["reset","submit"],uq);O(N,["copy","cut","paste"],Tq);O(N,["compositionend","compositionstart","compositionupdate"],hq);O(N,["touchcancel","touchend","touchmove","touchstart"],cq);O(N,["scroll"],Sq);O(N,["wheel"],nq);O(N,["animationstart","animationend","animationiteration"],sq);O(N,["transitionend"],dq);O(N,["toggle"],lq);function i(W){if(W&&typeof W==="object"&&"nativeEvent"in W&&typeof W.isDefaultPrevented==="function"){let q=W;if(typeof q.type!=="string")return W;let Z=N[q.type.toLowerCase()];if(Z)return Z(q);return bq(q)}return W}function T(W,q){let Z=[],J=q.map(()=>[]),$=new Map,G=(z)=>{let Q=$.get(z);if(Q!==void 0)return Q;if(z==null||typeof z==="number"||typeof z==="string"||typeof z==="boolean"){let X=Z.length;return Z.push(z),$.set(z,X),X}for(let X=0;X<q.length;X++){let F=q[X];if(F.check(z)){if($.has(z))return $.get(z);let U=Z.length;Z.push([]),$.set(z,U);let P=F.encode(z,(D)=>G(D));return Z[U]=P,J[X].push(U),U}}if(z&&typeof z==="object"){if($.has(z))return $.get(z);if(Array.isArray(z)){let U=Z.length;Z.push([]),$.set(z,U);let P=[];for(let D=0;D<z.length;D++)P.push(G(z[D]));return Z[U]=P,U}let X=Z.length;Z.push({}),$.set(z,X);let F={};for(let U of Object.keys(z)){let P=z[U],D=G(P);F[U]=D}return Z[X]=F,X}throw Error(`Unsupported value in serialize(): ${String(z)} (type ${typeof z})`)};return G(W),[J,Z]}function X1(W,q){let[Z,J]=W,$=new Map;for(let Q=0;Q<Z.length;Q++)for(let X of Z[Q]??[])$.set(X,Q);let G=new Map,z=(Q)=>{if(G.has(Q))return G.get(Q);if(Q<0||Q>=J.length)throw Error(`Invalid serialized data: missing entry at index ${Q}`);let X=J[Q];if($.has(Q)){let D=q[$.get(Q)].decode(J[Q],(R)=>z(R));return G.set(Q,D),D}if(X==null||typeof X==="number"||typeof X==="string"||typeof X==="boolean")return X??=void 0,G.set(Q,X),X;if(Array.isArray(X)){let P=[];G.set(Q,P);for(let D of X)P.push(z(D));return P}let F={};G.set(Q,F);let U=X;for(let P in U)F[P]=z(U[P]);return F};if(J.length===0)throw Error("Invalid serialized data: empty entries array");return z(0)}var oq={check(W){return W instanceof Date},encode(W,q){return{t:q("date"),ts:q(W.getTime())}},decode(W,q){if(q(W.t)!=="date")throw Error("Invalid date payload");let J=q(W.ts);return new Date(J)}},rq={check(W){return typeof File<"u"&&W instanceof File},encode(W,q){return{t:q("file"),n:q(W.name),tp:q(W.type),sz:q(W.size),lm:q(W.lastModified),b:W}},decode(W,q){let Z=W;if(q(Z.t)!=="file")throw Error("Invalid file payload");let $=q(Z.n),G=q(Z.tp),z=q(Z.sz),Q=q(Z.lm),X=Z.file;if(typeof File<"u"){if(X instanceof File)return X;if(X&&(X instanceof Uint8Array||X instanceof ArrayBuffer)){let F=X instanceof Uint8Array?X:new Uint8Array(X);return new File([F],$,{type:G,lastModified:Q})}if(typeof Blob<"u"&&X instanceof Blob)return new File([X],$,{type:G,lastModified:Q})}return{name:$,type:G,size:z,lastModified:Q,file:X}}},aq={check(W){return typeof FormData<"u"&&W instanceof FormData},encode(W,q){let Z={};for(let[J,$]of W.entries()){let G=Z[J];if(G===void 0)Z[J]=$;else if(Array.isArray(G))G.push($);else Z[J]=[G,$]}return{t:q("formdata"),f:q(Z)}},decode(W,q){if(q(W.t)!=="formdata")throw Error("Invalid formdata payload");let J=q(W.f),$=new FormData;for(let[G,z]of Object.entries(J))if(Array.isArray(z))for(let Q of z)$.append(G,Q);else $.append(G,z);return $}},tq={check(W){return W instanceof Set},encode(W,q){return{t:q("set"),items:q(Array.from(W.values()))}},decode(W,q){if(q(W.t)!=="set")throw Error("Invalid set payload");let J=q(W.items);return new Set(J)}},eq={check(W){return W instanceof Map},encode(W,q){return{t:q("map"),entries:q(Array.from(W.entries()))}},decode(W,q){if(q(W.t)!=="map")throw Error("Invalid map payload");let J=q(W.entries);return new Map(J)}};function j(){return[oq,rq,aq,tq,eq]}import{io as WZ}from"socket.io-client";class h{url;renderId;frameworkNavigate;activeViews;socket=null;messageQueue;connectionListeners=new Set;serverErrors=new Map;serverErrorListeners=new Set;constructor(W,q,Z){this.url=W;this.renderId=q;this.frameworkNavigate=Z;this.socket=null,this.activeViews=new Map,this.messageQueue=[]}isConnected(){return this.socket?.connected??!1}async connect(){if(this.socket)return;return new Promise((W,q)=>{let Z=WZ(this.url,{transports:["websocket","webtransport"],auth:{renderId:this.renderId}});this.socket=Z,Z.on("connect",()=>{console.log("[SocketIOTransport] Connected:",this.socket?.id);for(let[J,$]of this.activeViews)Z.emit("message",T({type:"mount",path:J,routeInfo:$.routeInfo},j()));for(let J of this.messageQueue){if(J.type==="mount"&&this.activeViews.has(J.path))continue;if(J.type==="navigate")continue;Z.emit("message",T(J,j()))}this.messageQueue=[],this.notifyConnectionListeners(!0),W()}),Z.on("connect_error",(J)=>{console.error("[SocketIOTransport] Connection failed:",J),this.notifyConnectionListeners(!1),q(J)}),Z.on("disconnect",()=>{console.log("[SocketIOTransport] Disconnected"),this.notifyConnectionListeners(!1)}),Z.on("message",(J)=>this.handleServerMessage(X1(J,j())))})}onConnectionChange(W){return this.connectionListeners.add(W),W(this.isConnected()),()=>{this.connectionListeners.delete(W)}}notifyConnectionListeners(W){for(let q of this.connectionListeners)q(W)}onServerError(W){this.serverErrorListeners.add(W);for(let[q,Z]of this.serverErrors)W(q,Z);return()=>{this.serverErrorListeners.delete(W)}}notifyServerError(W,q){for(let Z of this.serverErrorListeners)Z(W,q)}async sendMessage(W){if(this.isConnected())this.socket.emit("message",T(W,j()));else this.messageQueue.push(W)}mountView(W,q){if(this.activeViews.has(W))throw Error(`Path ${W} is already mounted`);this.activeViews.set(W,q),this.sendMessage({type:"mount",path:W,routeInfo:q.routeInfo})}async navigate(W,q){await this.sendMessage({type:"navigate",path:W,routeInfo:q})}unmount(W){this.sendMessage({type:"unmount",path:W}),this.activeViews.delete(W)}disconnect(){this.socket?.disconnect(),this.socket=null,this.messageQueue=[],this.connectionListeners.clear(),this.activeViews.clear(),this.serverErrors.clear(),this.serverErrorListeners.clear()}handleServerMessage(W){switch(W.type){case"vdom_init":{let q=this.activeViews.get(W.path);if(!q)return;if(q)q.onInit(W.vdom);if(this.serverErrors.has(W.path))this.serverErrors.delete(W.path),this.notifyServerError(W.path,null);break}case"vdom_update":{let q=this.activeViews.get(W.path);if(!q)return;if(q.onUpdate(W.ops),this.serverErrors.has(W.path))this.serverErrors.delete(W.path),this.notifyServerError(W.path,null);break}case"server_error":{if(!this.activeViews.has(W.path))return;this.serverErrors.set(W.path,W.error),this.notifyServerError(W.path,W.error);break}case"api_call":{this.performApiCall(W);break}case"navigate_to":{let q=!!W.replace,Z=W.path||"";if(Z.startsWith("//"))Z=`${window.location.protocol}${Z}`;if(/^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(Z))if(Z.startsWith("http://")||Z.startsWith("https://"))try{let $=new URL(Z);if($.origin===window.location.origin){let G=`${$.pathname}${$.search}${$.hash}`;this.frameworkNavigate(G,{replace:q})}else if(q)window.location.replace(Z);else window.location.assign(Z)}catch{if(q)window.location.replace(Z);else window.location.assign(Z)}else if(q)window.location.replace(Z);else window.location.assign(Z);else this.frameworkNavigate(Z,{replace:q});break}default:console.error("Unexpected message:",W)}}async performApiCall(W){try{let q=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={};q.headers.forEach((z,Q)=>Z[Q]=z);let J=null;if((q.headers.get("content-type")||"").includes("application/json"))J=await q.json().catch(()=>null);else J=await q.text().catch(()=>null);let G={type:"api_result",id:W.id,ok:q.ok,status:q.status,headers:Z,body:J};await this.sendMessage(G)}catch(q){let Z={type:"api_result",id:W.id,ok:!1,status:0,headers:{},body:{error:String(q)}};await this.sendMessage(Z)}}async invokeCallback(W,q,Z){await this.sendMessage({type:"callback",path:W,callback:q,args:Z.map(i)})}}import{useLocation as qZ,useParams as ZZ,useNavigate as $Z}from"react-router";import{jsx as w,jsxs as m}from"react/jsx-runtime";var F1=z1(null),V1=z1(null),U1=()=>{let W=G1(F1);if(!W)throw Error("usePulseClient must be used within a PulseProvider");return W},QZ=(W)=>{let q=G1(V1);if(!q)throw Error("usePulsePrerender must be used within a PulseProvider");let Z=q.views[W];if(!Z)throw Error(`No prerender found for '${W}'`);return Z},s=typeof window<"u";function JZ({children:W,config:q,prerender:Z}){let[J,$]=c(!0),G=$Z(),{renderId:z,views:Q}=Z,X=n(()=>new h(q.serverAddress,z,G),[q.serverAddress,G,z]);return p(()=>X.onConnectionChange($),[X]),p(()=>{if(s)return X.connect(),()=>X.disconnect()},[X]),w(F1.Provider,{value:X,children:m(V1.Provider,{value:Z,children:[!J&&w("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 XZ({externalComponents:W,path:q}){let Z=U1(),J=QZ(q),$=n(()=>new M(Z,q,W),[Z,q,W]),[G,z]=c(()=>$.renderNode(J)),[Q,X]=c(null),F=qZ(),U=ZZ(),P=n(()=>{let{"*":D="",...R}=U,f=new URLSearchParams(F.search);return{hash:F.hash,pathname:F.pathname,query:F.search,queryParams:Object.fromEntries(f.entries()),pathParams:R,catchall:D.length>0?D.split("/"):[]}},[F.hash,F.pathname,F.search,JSON.stringify(U)]);if(p(()=>{if(s){Z.mountView(q,{routeInfo:P,onInit:(R)=>{z($.renderNode(R))},onUpdate:(R)=>{z((f)=>f==null?f:u(f,R,$))}});let D=Z.onServerError((R,f)=>{if(R===q)X(f)});return()=>{D(),Z.unmount(q)}}},[Z]),p(()=>{if(s)Z.navigate(q,P)},[Z,q,P]),Q)return w(zZ,{error:Q});return G}function zZ({error:W}){return m("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:[m("div",{style:{fontWeight:700,marginBottom:8},children:["Server Error during ",W.phase]}),W.message&&w("div",{children:W.message}),W.stack&&m("details",{open:!0,style:{marginTop:8},children:[w("summary",{children:"Stack trace"}),w("pre",{style:{margin:0},children:W.stack})]})]})}import{io as GZ}from"socket.io-client";class P1{url;socket=null;listener=null;messageQueue=[];connectionListeners=new Set;constructor(W){this.url=W}connect(W){return this.listener=W,new Promise((q,Z)=>{this.socket=GZ(this.url,{transports:["websocket"]}),this.socket.on("connect",()=>{console.log("[SocketIOTransport] Connected:",this.socket?.id);for(let J of this.messageQueue)this.socket?.emit("message",J);this.messageQueue=[],this.notifyConnectionListeners(!0),q()}),this.socket.on("connect_error",(J)=>{console.error("[SocketIOTransport] Connection failed:",J),this.notifyConnectionListeners(!1),Z(J)}),this.socket.on("disconnect",()=>{console.log("[SocketIOTransport] Disconnected"),this.notifyConnectionListeners(!1)}),this.socket.on("message",(J)=>{this.listener?.(J)})})}disconnect(){this.socket?.disconnect(),this.socket=null,this.listener=null,this.messageQueue=[],this.connectionListeners.clear()}async sendMessage(W){if(this.isConnected())this.socket.emit("message",W);else this.messageQueue.push(W)}isConnected(){return this.socket?.connected||!1}onConnectionChange(W){return this.connectionListeners.add(W),W(this.isConnected()),()=>{this.connectionListeners.delete(W)}}notifyConnectionListeners(W){for(let q of this.connectionListeners)q(W)}}function FZ({params:W,request:q}){let{"*":Z="",...J}=W,$=new URL(q.url);return{hash:$.hash,pathname:$.pathname,query:$.search,queryParams:Object.fromEntries($.searchParams.entries()),pathParams:J,catchall:Z.length>1?Z.split("/"):[]}}function VZ(W){if(W===null||typeof W!=="object")return!1;let q=Object.getPrototypeOf(W);return q===Object.prototype||q===null}function l(W){return typeof W==="function"||typeof W==="symbol"||typeof W>"u"}async function UZ(W){let q=await W.arrayBuffer();return Array.from(new Uint8Array(q))}async function PZ(W){return await L(W,{seen:new WeakMap,nextId:1})}function DZ(W,q){if(W.seen.get(q)!==void 0)return null;let J=W.nextId++;return W.seen.set(q,J),J}async function L(W,q){if(W===null||typeof W!=="object")return W;if(W instanceof Date)return{__t:"datetime",timestamp:W.getTime()};if(W instanceof FormData){let Q=DZ(q,W);if(Q===null)return{__t:"ref",id:q.seen.get(W)};let X={};for(let[U,P]of W.entries()){let D=await L(P,q);if(D===void 0)continue;if(Object.prototype.hasOwnProperty.call(X,U)){let R=X[U];if(Array.isArray(R))R.push(D);else X[U]=[R,D]}else X[U]=D}return{__t:"formdata",fields:X,__id:Q}}if(W instanceof File){let Q=W,X=await UZ(W);return{__t:"file",name:Q.name,type:Q.type,size:Q.size,lastModified:Q.lastModified,content:X}}let Z=W,J=q.seen.get(Z);if(J!==void 0)return{__t:"ref",id:J};let $=q.nextId++;if(q.seen.set(Z,$),Array.isArray(W)){let X=(await Promise.all(W.map((U)=>L(U,q)))).filter((U)=>U!==void 0);return{__t:"array",__id:$,items:X}}let G={};if(VZ(W))for(let Q of Object.keys(W)){let X=W[Q];if(l(X))continue;let F=await L(X,q);if(F!==void 0)G[Q]=F}else for(let Q in W){let X=W[Q];if(l(X))continue;let F=await L(X,q);if(F!==void 0)G[Q]=F}return{__t:"object",__id:$,props:G}}function RZ(W){return g(W)}function g(W){if(W===null||typeof W!=="object")return W;let q=W,Z=q.__t;if(Z==="datetime"){let $=q.timestamp;return new Date($)}if(Z==="file"){let $=q.content;if(Array.isArray($))return{...q,content:new Uint8Array($)};return q}if(Z==="formdata"){let $=q.fields,G={};for(let z of Object.keys($)){let Q=$[z];if(Array.isArray(Q))G[z]=Q.map((X)=>g(X));else G[z]=g(Q)}return{__t:"formdata",fields:G}}if(Z==="array")return q.items.map((G)=>g(G));if(Z==="object"){let $=q.props,G={};for(let z of Object.keys($))G[z]=g($[z]);return G}if(Z==="ref")return q;let J={};for(let $ of Object.keys(q))J[$]=g(q[$]);return J}function AZ(W){return d(W,new WeakSet)}function d(W,q){if(W===null||typeof W!=="object")return W;if(q.has(W))return;if(q.add(W),Array.isArray(W))return W.map((J)=>d(J,q)).filter((J)=>J!==void 0);let Z={};for(let J in W){let $=W[J];if(l($))continue;let G=d($,q);if(G!==void 0)Z[J]=G}return Z}function NZ(W){return W instanceof Date}function OZ(W){return typeof File<"u"&&W instanceof File}function CZ(W){return typeof FormData<"u"&&W instanceof FormData}function fZ(W){let q=new Map,Z=1,J=($)=>{if($===null||typeof $!=="object")return $;let G=$;if(q.has(G))return{__ref:q.get(G)};if(NZ($)){let X=Z++;return q.set(G,X),{__pulse:"date",__id:X,timestamp:$.getTime()}}if(OZ($)){let X=Z++;return q.set(G,X),{__pulse:"file",__id:X,name:$.name,type:$.type,size:$.size,lastModified:$.lastModified,file:$}}if(CZ($)){let X=Z++;q.set(G,X);let F={};for(let[U,P]of $.entries()){let D=J(P);if(Object.prototype.hasOwnProperty.call(F,U)){let R=F[U];if(Array.isArray(R))R.push(D);else F[U]=[R,D]}else F[U]=D}return{__pulse:"formdata",__id:X,fields:F}}let z=Z++;if(q.set(G,z),Array.isArray($))return{__pulse:"array",__id:z,items:$.map(J)};let Q={};for(let X in $){let F=$[X];if(typeof F==="function"||typeof F==="symbol"||typeof F>"u")continue;Q[X]=J(F)}return{__pulse:"object",__id:z,__data:Q}};return J(W)}function IZ(W){let q=new Map,Z=(J)=>{if(J===null||typeof J!=="object")return J;if(Array.isArray(J))return J.map(Z);let $=J;if($.__ref!==void 0){let z=$.__ref;return q.get(z)||null}if($.__pulse==="date"){let z=$.__id,Q=new Date($.timestamp);return q.set(z,Q),Q}if($.__pulse==="file"){let{__id:z,file:Q}=$;return q.set(z,Q),Q}if($.__pulse==="formdata"){let{__id:z,fields:Q}=$,X=new FormData;q.set(z,X);for(let[F,U]of Object.entries(Q))if(Array.isArray(U))for(let P of U){let D=Z(P);X.append(F,D)}else{let P=Z(U);X.append(F,P)}return X}if($.__pulse==="array"){let z=$.__id,Q=[];q.set(z,Q);let X=$.items;for(let F=0;F<X.length;F++)Q[F]=Z(X[F]);return Q}if($.__pulse==="object"){let z=$.__id,Q={};q.set(z,Q);let X=$.__data;for(let[F,U]of Object.entries(X))Q[F]=Z(U);return Q}let G={};for(let[z,Q]of Object.entries($))G[z]=Z(Q);return G};return Z(W)}export{U1 as usePulseClient,fZ as stringify,IZ as parse,FZ as extractServerRouteInfo,i as extractEvent,PZ as encodeForWire,RZ as decodeFromWire,AZ as cleanForSerialization,u as applyReactTreeUpdates,M as VDOMRenderer,P1 as SocketIOTransport,C1 as RenderLazy,XZ as PulseView,h as PulseSocketIOClient,JZ as PulseProvider};
|
|
1
|
+
import{useEffect as E,useState as a,useMemo as t,createContext as AW,useContext as NW}from"react";import jW,{cloneElement as L,createElement as XW,lazy as BW,Suspense as KW}from"react";var QW="$$fragment",qW="$$";function zW(W){return typeof W==="object"&&W!==null}function JW(W){return typeof W==="object"&&W!==null&&W.tag.startsWith("$$")&&W.tag!=="$$fragment"}import{jsx as n,Fragment as YW}from"react/jsx-runtime";class h{client;path;components;callbackCache;constructor(W,Z,$){this.client=W;this.path=Z;this.components=$;this.callbackCache=new Map}getCallback(W){let Z=this.callbackCache.get(W);if(!Z)Z=(...$)=>this.client.invokeCallback(this.path,W,$),this.callbackCache.set(W,Z);return Z}renderNode(W){if(W==null||typeof W==="boolean"||typeof W==="number"||typeof W==="string")return W;if(zW(W)){let{tag:Z,props:$={},children:Q=[]}=W,q={};for(let[U,z]of Object.entries($))if(typeof z==="string"&&z.startsWith("$$fn:")){let V=z.substring(5);q[U]=this.getCallback(V)}else q[U]=z;if(W.key)q.key=W.key;let J=[];for(let U of Q)J.push(this.renderNode(U));if(JW(W)){let U=W.tag.slice(qW.length),z=this.components[U];return XW(z,q,...J)}return XW(Z===QW?jW.Fragment:Z,q,...J)}return null}}function g(W){let Z=W.props?.children;if(Z==null)return[];return Array.isArray(Z)?Z.slice():[Z]}function kW(W,Z){let $={};for(let[Q,q]of Object.entries(Z||{}))if(typeof q==="string"&&q.startsWith("$$fn:")){let J=q.substring(5);$[Q]=W.getCallback(J)}else $[Q]=q;return $}function HW(W,Z){return L(W,void 0,...Z)}function d(W,Z,$){let Q=W;for(let q of Z){let J=q.path.split(".").filter((z)=>z.length>0).map(Number),U=(z,V)=>{if(V<J.length){M(z,J,V),z=z;let X=J[V],P=g(z),C=P[X];return P[X]=U(C,V+1),HW(z,P)}switch(q.type){case"replace":return $.renderNode(q.data);case"update_props":{M(z,J,V),z=z;let P={...z.props??{}},C=q.data;if(C.remove&&C.remove.length>0){for(let D of C.remove)if(D in P)delete P[D]}if(C.set){let D=kW($,C.set);for(let[G,f]of Object.entries(D))P[G]=f}return L(z,P)}case"insert":{M(z,J,V),z=z;let X=g(z);return X.splice(q.idx,0,$.renderNode(q.data)),L(z,null,...X)}case"remove":{M(z,J,V),z=z;let X=g(z);return X.splice(q.idx,1),L(z,null,...X)}case"move":{M(z,J,V),z=z;let X=g(z),P=X.splice(q.data.from_index,1)[0];return X.splice(q.data.to_index,0,P),L(z,null,...X)}default:throw Error(`[Pulse renderer] Unknown update type: ${q.type}`)}};Q=U(Q,0)}return Q}function yW(W,Z){let $=BW(W);return({children:Q,...q})=>{return n(KW,{fallback:Z??n(YW,{}),children:n($,{...q,children:Q})})}}function M(W,Z,$){return!0}function B(){function W(Z,$){return(Q)=>{let q={};for(let J of Z)q[J]=Q[J];if($)for(let J in $){let U=$[J];q[J]=U(Q)}return q}}return W}var bW=(W)=>W.tagName.toLowerCase(),MW=["id","className","tagName","localName","clientHeight","clientLeft","clientTop","clientWidth","scrollHeight","scrollLeft","scrollTop","scrollWidth","slot"],LW=["autofocus","tabIndex","nonce"],SW=["accessKey","accessKeyLabel","autocapitalize","dir","draggable","hidden","inert","lang","offsetHeight","offsetLeft","offsetTop","offsetWidth","popover","spellcheck","title","translate","writingSuggestions","contentEditable","enterKeyHint","isContentEditable","inputMode"],TW=B()(MW,{tagName:bW}),_W=B()(LW),gW=B()(SW);function K(W){return{...TW(W),..._W(W),...gW(W)}}function F(W,Z){let $=B()(W,Z);return(Q)=>({...K(Q),...$(Q)})}var hW=["hash","host","hostname","href","origin","password","pathname","port","protocol","search","target","download","rel","hreflang","type","username","ping","referrerPolicy","text"],xW=F(hW),pW=["alt","coords","download","hash","host","hostname","href","origin","password","pathname","port","protocol","rel","search","shape","target","username","ping","referrerPolicy"],mW=F(pW),vW=["autoplay","controls","crossOrigin","currentSrc","currentTime","defaultMuted","defaultPlaybackRate","duration","ended","loop","muted","networkState","paused","playbackRate","preload","readyState","seeking","src","volume","preservesPitch"],DW=F(vW),uW=(W)=>DW(W),EW=["disabled","name","type","value","formAction","formEnctype","formMethod","formNoValidate","formTarget","popoverTargetAction"],iW=F(EW),cW=["value"],nW=F(cW),dW=["height","src","type","width","align","name"],lW=F(dW),oW=["disabled","name","type","validationMessage","willValidate"],sW=F(oW),rW=["acceptCharset","action","autocomplete","encoding","enctype","length","method","name","noValidate","target","rel"],aW=F(rW),tW=["allow","allowFullscreen","height","name","referrerPolicy","src","srcdoc","width","align","frameBorder","longDesc","marginHeight","marginWidth","scrolling","sandbox"],eW=F(tW),W1=["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"],Z1=F(W1),$1=["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"],Q1=F($1),q1=["htmlFor"],z1=F(q1),J1=["value","type"],X1=F(J1),F1=["as","crossOrigin","disabled","fetchPriority","href","hreflang","imageSizes","imageSrcset","integrity","media","referrerPolicy","rel","type","charset","rev","target","sizes"],G1=F(F1),V1=["name"],U1=F(V1),D1=["high","low","max","min","optimum","value"],P1=F(D1),f1=["cite","dateTime"],FW=F(f1),C1=["reversed","start","type","compact"],A1=F(C1),N1=["data","height","name","type","useMap","width","validationMessage","willValidate","align","archive","border","code","codeBase","codeType","declare","hspace","standby","vspace"],O1=F(N1),R1=["disabled","label"],I1=F(R1),w1=["defaultSelected","disabled","index","label","selected","text","value"],j1=F(w1),B1=["defaultValue","name","type","value","htmlFor","validationMessage","willValidate"],K1=F(B1),k1=["max","position","value"],H1=F(k1),y1=["cite"],GW=F(y1),Y1=(W)=>K(W),b1=["async","crossOrigin","defer","fetchPriority","integrity","noModule","referrerPolicy","src","text","type","charset"],M1=B()(b1,{event:(W)=>W.event,htmlFor:(W)=>W.htmlFor}),L1=(W)=>({...K(W),...M1(W)}),S1=["autocomplete","disabled","length","multiple","name","required","selectedIndex","size","type","value","validationMessage","willValidate"],T1=F(S1),_1=["name"],g1=F(_1),h1=["height","media","sizes","src","srcset","type","width"],x1=F(h1),p1=["align"],m1=F(p1),v1=["abbr","cellIndex","colSpan","headers","rowSpan","scope","align","axis","bgColor","ch","chOff","height","noWrap","vAlign","width"],VW=F(v1),u1=["span","align","ch","chOff","vAlign","width"],UW=F(u1),E1=["align","bgColor","border","cellPadding","cellSpacing","frame","rules","summary","width"],i1=F(E1),c1=["rowIndex","sectionRowIndex","align","bgColor","ch","chOff","vAlign"],n1=F(c1),d1=["align","ch","chOff","vAlign"],l=F(d1),l1=(W)=>K(W),o1=["autocomplete","cols","defaultValue","dirName","disabled","maxLength","minLength","name","placeholder","readOnly","required","rows","selectionDirection","selectionEnd","selectionStart","value","wrap","textLength","validationMessage","willValidate"],s1=F(o1),r1=["dateTime"],a1=F(r1),t1=["default","kind","label","readyState","src","srclang"],e1=F(t1),W3=["height","poster","videoHeight","videoWidth","width","playsInline"],Z3=B()(W3),$3=(W)=>({...DW(W),...Z3(W)}),Q3=["clear"],q3=F(Q3),z3=["href","target"],J3=F(z3),X3=["aLink","background","bgColor","link","text","vLink"],F3=F(X3),G3=["compact"],V3=F(G3),U3=["open"],D3=F(U3),P3=["open","returnValue"],f3=F(P3),C3=["align"],A3=F(C3),N3=(W)=>K(W),O3=["align"],y=F(O3),R3=["align","color","noShade","size","width"],I3=F(R3),w3=["version"],j3=F(w3),B3=(W)=>K(W),K3=["content","httpEquiv","name","scheme"],k3=F(K3),H3=["align"],y3=F(H3),Y3=(W)=>K(W),b3=["width"],M3=F(b3),L3=(W)=>K(W),S3=["media","type","disabled"],T3=F(S3),_3=["text"],g3=F(_3),h3=["compact","type"],x3=F(h3),p3={A:xW,AREA:mW,AUDIO:uW,BASE:J3,BLOCKQUOTE:GW,Q:GW,BODY:F3,BR:q3,BUTTON:iW,CANVAS:K,CAPTION:m1,CITE:Y1,COL:UW,COLGROUP:UW,DATA:nW,DETAILS:D3,DIALOG:f3,DIV:A3,DL:V3,EMBED:lW,FIELDSET:sW,FORM:aW,H1:y,H2:y,H3:y,H4:y,H5:y,H6:y,HEAD:N3,HR:I3,HTML:j3,IFRAME:eW,IMG:Z1,INPUT:Q1,LABEL:z1,LI:X1,LINK:G1,MAP:U1,MENU:B3,META:k3,METER:P1,INS:FW,DEL:FW,OBJECT:O1,OL:A1,OPTGROUP:I1,OPTION:j1,OUTPUT:K1,P:y3,PICTURE:Y3,PRE:M3,PROGRESS:H1,SCRIPT:L1,SELECT:T1,SLOT:g1,SOURCE:x1,SPAN:L3,STYLE:T3,TABLE:i1,TBODY:l,THEAD:l,TFOOT:l,TD:VW,TH:VW,TEMPLATE:l1,TEXTAREA:s1,TIME:a1,TITLE:g3,TR:n1,TRACK:e1,UL:x3,VIDEO:$3};function x(W){let Z=W.tagName.toUpperCase(),$=p3[Z];if($)return $(W);throw Error(`Unexpected HTML element tag: ${W.tagName} (update .web/custom/serialize.ts)`)}var m3=(W)=>x(W.target),S=(W)=>W.relatedTarget?x(W.relatedTarget):null;function A(W,Z){return B()(W,{target:m3,...Z||{}})}var w=["target","bubbles","cancelable","defaultPrevented","eventPhase","isTrusted","timeStamp","type"],p=[...w,"detail"],m=[...p,"altKey","button","buttons","clientX","clientY","ctrlKey","metaKey","movementX","movementY","pageX","pageY","screenX","screenY","shiftKey"],v3=[...m,"pointerId","pressure","tangentialPressure","tiltX","tiltY","twist","width","height","pointerType","isPrimary"],u3=A(w),E3=A(p),i3=A(m,{relatedTarget:S}),c3=A(w,{clipboardData:(W)=>PW(W.clipboardData)}),n3=A([...w,"data"]),d3=A(m,{relatedTarget:S,dataTransfer:(W)=>PW(W.dataTransfer)}),l3=A(v3,{relatedTarget:S}),o3=A(w,{relatedTarget:S}),s3=A(w),r3=A(w),a3=A(w),t3=A([...p,"altKey","ctrlKey","code","key","locale","location","metaKey","repeat","shiftKey"]),e3=A([...p,"altKey","ctrlKey","metaKey","shiftKey","changedTouches","targetTouches","touches"],{changedTouches:(W)=>o(W.changedTouches),targetTouches:(W)=>o(W.targetTouches),touches:(W)=>o(W.touches)}),WZ=A([...m,"deltaMode","deltaX","deltaY","deltaZ"],{relatedTarget:S}),ZZ=A([...w,"animationName","elapsedTime","pseudoElement"]),$Z=A([...w,"oldState","newState"]),QZ=A([...w,"elapsedTime","propertyName","pseudoElement"]);function o(W){return Array.from(W).map((Z)=>({target:x(Z.target),identifier:Z.identifier,screenX:Z.screenX,screenY:Z.screenY,clientX:Z.clientX,clientY:Z.clientY,pageX:Z.pageX,pageY:Z.pageY}))}function PW(W){if(!W)return null;let Z=[];if(W.items)for(let $=0;$<W.items.length;$++){let Q=W.items[$];Z.push({kind:Q.kind,type:Q.type})}return{drop_effect:W.dropEffect,effect_allowed:W.effectAllowed,items:Z,types:Array.from(W.types||[])}}var N={};function R(W,Z,$){for(let Q of Z)W[Q]=$}R(N,["pointerdown","pointermove","pointerup","pointercancel","gotpointercapture","lostpointercapture","pointerenter","pointerleave","pointerover","pointerout"],l3);R(N,["click","contextmenu","dblclick","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup"],i3);R(N,["drag","dragend","dragenter","dragexit","dragleave","dragover","dragstart","drop"],d3);R(N,["keydown","keypress","keyup"],t3);R(N,["focus","blur"],o3);R(N,["change","input"],a3);R(N,["invalid"],r3);R(N,["reset","submit"],s3);R(N,["copy","cut","paste"],c3);R(N,["compositionend","compositionstart","compositionupdate"],n3);R(N,["touchcancel","touchend","touchmove","touchstart"],e3);R(N,["scroll"],E3);R(N,["wheel"],WZ);R(N,["animationstart","animationend","animationiteration"],ZZ);R(N,["transitionend"],QZ);R(N,["toggle"],$Z);function s(W){if(W&&typeof W==="object"&&"nativeEvent"in W&&typeof W.isDefaultPrevented==="function"){let Z=W;if(typeof Z.type!=="string")return W;let $=N[Z.type.toLowerCase()];if($)return $(Z);return u3(Z)}return W}function T(W){let Z=new Map,$=[],Q=[],q=[],J=[],U=0;function z(X){if(X==null||typeof X==="number"||typeof X==="string"||typeof X==="boolean")return X;let P=U++,C=Z.get(X);if(C!==void 0)return $.push(P),C;if(Z.set(X,P),X instanceof Date)return Q.push(P),X.getTime();if(Array.isArray(X)){let D=X.length,G=Array(D);for(let f=0;f<D;f++)G[f]=z(X[f]);return G}if(X instanceof Map){J.push(P);let D={};for(let[G,f]of X.entries())D[String(G)]=z(f);return D}if(X instanceof Set){q.push(P);let D=X.size,G=Array(D),f=0;for(let I of X)G[f]=z(I),f+=1;return G}if(typeof X==="object"){let D={},G=Object.keys(X);for(let f=0;f<G.length;f++){let I=G[f];D[I]=z(X[I])}return D}throw Error(`Unsupported value in serialization: ${X}`)}let V=z(W);return[[$,Q,q,J],V]}function r(W,Z){let[[$,Q,q,J],U]=W,z=new Set($),V=new Set(Q),X=new Set(q),P=new Set(J),C=[];function D(G){let f=C.length;if(z.has(f))return C.push(null),C[G];if(V.has(f)){let I=new Date(G);return C.push(I),I}if(G==null||typeof G==="number"||typeof G==="string"||typeof G==="boolean"){if(Z?.coerceNullsToUndefined)return G??void 0;return G}if(Array.isArray(G)){if(X.has(f)){let O=new Set;C.push(O);for(let j=0;j<G.length;j++)O.add(D(G[j]));return O}let I=G.length,H=Array(I);C.push(H);for(let O=0;O<I;O++)H[O]=D(G[O]);return H}if(typeof G==="object"){if(P.has(f)){let O=new Map;C.push(O);let j=Object.keys(G);for(let c=0;c<j.length;c++){let $W=j[c];O.set($W,D(G[$W]))}return O}let I={};C.push(I);let H=Object.keys(G);for(let O=0;O<H.length;O++){let j=H[O];I[j]=D(G[j])}return I}throw Error(`Unsupported value in deserialization: ${G}`)}return D(U)}import{io as FZ}from"socket.io-client";class k extends Error{constructor(W){super(W);this.name="PulseChannelResetError"}}function qZ(){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 zZ(W){if(W instanceof Error)return W.message;if(typeof W==="string")return W;try{return JSON.stringify(W)}catch{return String(W)}}function JZ(W){return typeof W.responseTo==="string"}function XZ(W){return typeof W.event==="string"}class fW{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.sendChannelMessage({type:"channel_message",channel:this.id,event:W,payload:Z})}async request(W,Z){this.ensureOpen();let $=qZ();return new Promise((Q,q)=>{this.pending.set($,{resolve:Q,reject:q}),this.client.sendChannelMessage({type:"channel_message",channel:this.id,event:W,payload:Z,requestId:$}).catch((J)=>{this.pending.delete($),q(J)})})}on(W,Z){this.ensureOpen();let $=this.handlers.get(W);if(!$)$=new Set,this.handlers.set(W,$);return $.add(Z),this.flushBacklog(W),()=>{let Q=this.handlers.get(W);if(!Q)return;if(Q.delete(Z),Q.size===0)this.handlers.delete(W)}}handleServerMessage(W){if(JZ(W))return this.resolvePending(W),this.closed;if(this.closed)return!0;if(!XZ(W))return this.closed;if(W.event==="__close__")return this.close(new k("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 k("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 Q=$(W.payload);if(Q&&typeof Q.then==="function")Q.catch((q)=>{console.error("Pulse channel handler error",q)})}catch(Q){console.error("Pulse channel handler error",Q)}}async dispatchRequest(W){let Z=this.handlers.get(W.event),$,Q;if(Z&&Z.size>0)for(let q of Z)try{let J=q(W.payload);if($=await Promise.resolve(J),$!==void 0)break}catch(J){Q=J;break}if(Q){await this.client.sendChannelMessage({type:"channel_message",channel:this.id,event:void 0,responseTo:W.requestId,error:zZ(Q)});return}await this.client.sendChannelMessage({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 k(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 CW(W,Z){return new fW(W,Z)}class v{url;renderId;frameworkNavigate;activeViews;socket=null;messageQueue;connectionListeners=new Set;serverErrors=new Map;serverErrorListeners=new Set;channels=new Map;constructor(W,Z,$){this.url=W;this.renderId=Z;this.frameworkNavigate=$;this.socket=null,this.activeViews=new Map,this.messageQueue=[]}isConnected(){return this.socket?.connected??!1}async connect(){if(this.socket)return;return new Promise((W,Z)=>{let $=FZ(this.url,{transports:["websocket","webtransport"],auth:{renderId:this.renderId}});this.socket=$,$.on("connect",()=>{console.log("[SocketIOTransport] Connected:",this.socket?.id);for(let[Q,q]of this.activeViews)$.emit("message",T({type:"mount",path:Q,routeInfo:q.routeInfo}));for(let Q of this.messageQueue){if(Q.type==="mount"&&this.activeViews.has(Q.path))continue;if(Q.type==="navigate")continue;$.emit("message",T(Q))}this.messageQueue=[],this.notifyConnectionListeners(!0),W()}),$.on("connect_error",(Q)=>{console.error("[SocketIOTransport] Connection failed:",Q),this.notifyConnectionListeners(!1),Z(Q)}),$.on("disconnect",()=>{console.log("[SocketIOTransport] Disconnected"),this.handleTransportDisconnect(),this.notifyConnectionListeners(!1)}),$.on("message",(Q)=>this.handleServerMessage(r(Q,{coerceNullsToUndefined:!0})))})}onConnectionChange(W){return this.connectionListeners.add(W),W(this.isConnected()),()=>{this.connectionListeners.delete(W)}}notifyConnectionListeners(W){for(let Z of this.connectionListeners)Z(W)}onServerError(W){this.serverErrorListeners.add(W);for(let[Z,$]of this.serverErrors)W(Z,$);return()=>{this.serverErrorListeners.delete(W)}}notifyServerError(W,Z){for(let $ of this.serverErrorListeners)$(W,Z)}async sendMessage(W){if(this.isConnected())this.socket.emit("message",T(W));else this.messageQueue.push(W)}async sendChannelMessage(W){await this.sendMessage(W)}mountView(W,Z){if(this.activeViews.has(W))throw Error(`Path ${W} is already mounted`);this.activeViews.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.activeViews.delete(W)}disconnect(){this.socket?.disconnect(),this.socket=null,this.messageQueue=[],this.connectionListeners.clear(),this.activeViews.clear(),this.serverErrors.clear(),this.serverErrorListeners.clear();for(let{bridge:W}of this.channels.values())W.dispose(new k("Client disconnected"));this.channels.clear()}handleServerMessage(W){switch(W.type){case"vdom_init":{let Z=this.activeViews.get(W.path);if(!Z)return;if(Z)Z.onInit(W.vdom);if(this.serverErrors.has(W.path))this.serverErrors.delete(W.path),this.notifyServerError(W.path,null);break}case"vdom_update":{let Z=this.activeViews.get(W.path);if(!Z)return;if(Z.onUpdate(W.ops),this.serverErrors.has(W.path))this.serverErrors.delete(W.path),this.notifyServerError(W.path,null);break}case"server_error":{if(!this.activeViews.has(W.path))return;this.serverErrors.set(W.path,W.error),this.notifyServerError(W.path,W.error);break}case"api_call":{this.performApiCall(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 J=`${q.pathname}${q.search}${q.hash}`;this.frameworkNavigate(J,{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.frameworkNavigate($,{replace:Z});break}case"channel_message":{this.routeChannelMessage(W);break}default:console.error("Unexpected message:",W)}}async performApiCall(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,z)=>$[z]=U);let Q=null;if((Z.headers.get("content-type")||"").includes("application/json"))Q=await Z.json().catch(()=>null);else Q=await Z.text().catch(()=>null);let J={type:"api_result",id:W.id,ok:Z.ok,status:Z.status,headers:$,body:Q};await this.sendMessage(J)}catch(Z){let $={type:"api_result",id:W.id,ok:!1,status:0,headers:{},body:{error:String(Z)}};await this.sendMessage($)}}async invokeCallback(W,Z,$){await this.sendMessage({type:"callback",path:W,callback:Z,args:$.map(s)})}acquireChannel(W){let Z=this.ensureChannelEntry(W);return Z.refCount+=1,Z.bridge}releaseChannel(W){let Z=this.channels.get(W);if(!Z)return;if(Z.refCount=Math.max(0,Z.refCount-1),Z.refCount===0)Z.bridge.dispose(new k("Channel released")),this.channels.delete(W)}ensureChannelEntry(W){let Z=this.channels.get(W);if(!Z)Z={bridge:CW(this,W),refCount:0},this.channels.set(W,Z);return Z}routeChannelMessage(W){let Z=this.ensureChannelEntry(W.channel);if(Z.bridge.handleServerMessage(W)&&Z.refCount===0)this.channels.delete(W.channel)}handleTransportDisconnect(){for(let W of this.channels.values())W.bridge.handleDisconnect(new k("Connection lost"))}}import{useLocation as GZ,useParams as VZ,useNavigate as UZ}from"react-router";import{jsx as Y,jsxs as u}from"react/jsx-runtime";var OW=AW(null),RW=AW(null),i=()=>{let W=NW(OW);if(!W)throw Error("usePulseClient must be used within a PulseProvider");return W},DZ=(W)=>{let Z=NW(RW);if(!Z)throw Error("usePulsePrerender must be used within a PulseProvider");let $=Z.views[W];if(!$)throw Error(`No prerender found for '${W}'`);return $},e=typeof window<"u";function PZ({children:W,config:Z,prerender:$}){let[Q,q]=a(!0),J=UZ(),{renderId:U}=$,z=t(()=>new v(Z.serverAddress,U,J),[Z.serverAddress,J,U]);return E(()=>z.onConnectionChange(q),[z]),E(()=>{if(e)return z.connect(),()=>z.disconnect()},[z]),Y(OW.Provider,{value:z,children:u(RW.Provider,{value:$,children:[!Q&&Y("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 fZ({externalComponents:W,path:Z}){let $=i(),Q=DZ(Z),q=t(()=>new h($,Z,W),[$,Z,W]),[J,U]=a(()=>q.renderNode(Q)),[z,V]=a(null),X=GZ(),P=VZ(),C=t(()=>{let{"*":D="",...G}=P,f=new URLSearchParams(X.search);return{hash:X.hash,pathname:X.pathname,query:X.search,queryParams:Object.fromEntries(f.entries()),pathParams:G,catchall:D.length>0?D.split("/"):[]}},[X.hash,X.pathname,X.search,JSON.stringify(P)]);if(E(()=>{if(e){$.mountView(Z,{routeInfo:C,onInit:(G)=>{U(q.renderNode(G))},onUpdate:(G)=>{U((f)=>f==null?f:d(f,G,q))}});let D=$.onServerError((G,f)=>{if(G===Z)V(f)});return()=>{D(),$.unmount(Z)}}},[$]),E(()=>{if(e)$.navigate(Z,C)},[$,Z,C]),z)return Y(CZ,{error:z});return J}function CZ({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&&Y("div",{children:W.message}),W.stack&&u("details",{open:!0,style:{marginTop:8},children:[Y("summary",{children:"Stack trace"}),Y("pre",{style:{margin:0},children:W.stack})]})]})}import{useEffect as AZ,useMemo as NZ}from"react";function OZ(W){let Z=i(),$=NZ(()=>{if(!W)throw Error("usePulseChannel requires a non-empty channelId");return Z.acquireChannel(W)},[Z,W]);return AZ(()=>{return()=>{Z.releaseChannel(W)}},[Z,W]),$}import{forwardRef as RZ,useCallback as IZ}from"react";import{jsx as jZ}from"react/jsx-runtime";var wZ=RZ(function({onSubmit:Z,action:$,...Q},q){return jZ("form",{...Q,action:$,ref:q,onSubmit:IZ((J)=>IW({event:J,action:$,onSubmit:Z}),[$,Z])})});async function IW({event:W,action:Z,onSubmit:$,formData:Q,force:q}){if($?.(W),!q&&W.defaultPrevented)return;let J=W.currentTarget;W.preventDefault();let U=W.nativeEvent;if(!Q)Q=new FormData(J,U.submitter);let z=new URL(Z,window.location.href);try{await fetch(z,{method:"POST",credentials:"include",body:Q})}catch(V){throw V}}import{io as BZ}from"socket.io-client";class wW{url;socket=null;listener=null;messageQueue=[];connectionListeners=new Set;constructor(W){this.url=W}connect(W){return this.listener=W,new Promise((Z,$)=>{this.socket=BZ(this.url,{transports:["websocket"]}),this.socket.on("connect",()=>{console.log("[SocketIOTransport] Connected:",this.socket?.id);for(let Q of this.messageQueue)this.socket?.emit("message",Q);this.messageQueue=[],this.notifyConnectionListeners(!0),Z()}),this.socket.on("connect_error",(Q)=>{console.error("[SocketIOTransport] Connection failed:",Q),this.notifyConnectionListeners(!1),$(Q)}),this.socket.on("disconnect",()=>{console.log("[SocketIOTransport] Disconnected"),this.notifyConnectionListeners(!1)}),this.socket.on("message",(Q)=>{this.listener?.(Q)})})}disconnect(){this.socket?.disconnect(),this.socket=null,this.listener=null,this.messageQueue=[],this.connectionListeners.clear()}async sendMessage(W){if(this.isConnected())this.socket.emit("message",W);else this.messageQueue.push(W)}isConnected(){return this.socket?.connected||!1}onConnectionChange(W){return this.connectionListeners.add(W),W(this.isConnected()),()=>{this.connectionListeners.delete(W)}}notifyConnectionListeners(W){for(let Z of this.connectionListeners)Z(W)}}function KZ({params:W,request:Z}){let{"*":$="",...Q}=W,q=new URL(Z.url);return{hash:q.hash,pathname:q.pathname,query:q.search,queryParams:Object.fromEntries(q.searchParams.entries()),pathParams:Q,catchall:$.length>1?$.split("/"):[]}}function kZ(W){if(W===null||typeof W!=="object")return!1;let Z=Object.getPrototypeOf(W);return Z===Object.prototype||Z===null}function WW(W){return typeof W==="function"||typeof W==="symbol"||typeof W>"u"}async function HZ(W){let Z=await W.arrayBuffer();return Array.from(new Uint8Array(Z))}async function yZ(W){return await _(W,{seen:new WeakMap,nextId:1})}function YZ(W,Z){if(W.seen.get(Z)!==void 0)return null;let Q=W.nextId++;return W.seen.set(Z,Q),Q}async function _(W,Z){if(W===null||typeof W!=="object")return W;if(W instanceof Date)return{__t:"datetime",timestamp:W.getTime()};if(W instanceof FormData){let z=YZ(Z,W);if(z===null)return{__t:"ref",id:Z.seen.get(W)};let V={};for(let[P,C]of W.entries()){let D=await _(C,Z);if(D===void 0)continue;if(Object.prototype.hasOwnProperty.call(V,P)){let G=V[P];if(Array.isArray(G))G.push(D);else V[P]=[G,D]}else V[P]=D}return{__t:"formdata",fields:V,__id:z}}if(W instanceof File){let z=W,V=await HZ(W);return{__t:"file",name:z.name,type:z.type,size:z.size,lastModified:z.lastModified,content:V}}let $=W,Q=Z.seen.get($);if(Q!==void 0)return{__t:"ref",id:Q};let q=Z.nextId++;if(Z.seen.set($,q),Array.isArray(W)){let V=(await Promise.all(W.map((P)=>_(P,Z)))).filter((P)=>P!==void 0);return{__t:"array",__id:q,items:V}}let J={};if(kZ(W))for(let z of Object.keys(W)){let V=W[z];if(WW(V))continue;let X=await _(V,Z);if(X!==void 0)J[z]=X}else for(let z in W){let V=W[z];if(WW(V))continue;let X=await _(V,Z);if(X!==void 0)J[z]=X}return{__t:"object",__id:q,props:J}}function bZ(W){return b(W)}function b(W){if(W===null||typeof W!=="object")return W;let Z=W,$=Z.__t;if($==="datetime"){let q=Z.timestamp;return new Date(q)}if($==="file"){let q=Z.content;if(Array.isArray(q))return{...Z,content:new Uint8Array(q)};return Z}if($==="formdata"){let q=Z.fields,J={};for(let U of Object.keys(q)){let z=q[U];if(Array.isArray(z))J[U]=z.map((V)=>b(V));else J[U]=b(z)}return{__t:"formdata",fields:J}}if($==="array")return Z.items.map((J)=>b(J));if($==="object"){let q=Z.props,J={};for(let U of Object.keys(q))J[U]=b(q[U]);return J}if($==="ref")return Z;let Q={};for(let q of Object.keys(Z))Q[q]=b(Z[q]);return Q}function MZ(W){return ZW(W,new WeakSet)}function ZW(W,Z){if(W===null||typeof W!=="object")return W;if(Z.has(W))return;if(Z.add(W),Array.isArray(W))return W.map((Q)=>ZW(Q,Z)).filter((Q)=>Q!==void 0);let $={};for(let Q in W){let q=W[Q];if(WW(q))continue;let J=ZW(q,Z);if(J!==void 0)$[Q]=J}return $}export{i as usePulseClient,OZ as usePulseChannel,IW as submitForm,T as serialize,KZ as extractServerRouteInfo,s as extractEvent,yZ as encodeForWire,r as deserialize,bZ as decodeFromWire,MZ as cleanForSerialization,d as applyReactTreeUpdates,h as VDOMRenderer,wW as SocketIOTransport,yW as RenderLazy,fZ as PulseView,v as PulseSocketIOClient,PZ as PulseProvider,wZ as PulseForm,k as PulseChannelResetError};
|
|
2
2
|
|
|
3
|
-
//# debugId=
|
|
4
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3B1bHNlLnRzeCIsICIuLi9zcmMvcmVuZGVyZXIudHN4IiwgIi4uL3NyYy92ZG9tLnRzIiwgIi4uL3NyYy9zZXJpYWxpemUvZXh0cmFjdG9yLnRzIiwgIi4uL3NyYy9zZXJpYWxpemUvZWxlbWVudHMudHMiLCAiLi4vc3JjL3NlcmlhbGl6ZS9ldmVudHMudHMiLCAiLi4vc3JjL3NlcmlhbGl6ZS92Mi50cyIsICIuLi9zcmMvY2xpZW50LnRzeCIsICIuLi9zcmMvdHJhbnNwb3J0LnRzIiwgIi4uL3NyYy9oZWxwZXJzLnRzIiwgIi4uL3NyYy9zZXJpYWxpemUvY2xlYW4udHMiLCAiLi4vc3JjL3NlcmlhbGl6ZS92MS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICJpbXBvcnQgUmVhY3QsIHtcbiAgdXNlRWZmZWN0LFxuICB1c2VTdGF0ZSxcbiAgdXNlTWVtbyxcbiAgY3JlYXRlQ29udGV4dCxcbiAgdXNlQ29udGV4dCxcbiAgdHlwZSBDb21wb25lbnRUeXBlLFxufSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IFZET01SZW5kZXJlciwgYXBwbHlVcGRhdGVzIH0gZnJvbSBcIi4vcmVuZGVyZXJcIjtcbmltcG9ydCB7IFB1bHNlU29ja2V0SU9DbGllbnQgfSBmcm9tIFwiLi9jbGllbnRcIjtcbmltcG9ydCB0eXBlIHsgVkRPTSwgQ29tcG9uZW50UmVnaXN0cnksIFJlZ2lzdHJ5RW50cnkgfSBmcm9tIFwiLi92ZG9tXCI7XG5pbXBvcnQgeyB1c2VMb2NhdGlvbiwgdXNlUGFyYW1zLCB1c2VOYXZpZ2F0ZSB9IGZyb20gXCJyZWFjdC1yb3V0ZXJcIjtcbmltcG9ydCB0eXBlIHsgU2VydmVyRXJyb3JJbmZvIH0gZnJvbSBcIi4vbWVzc2FnZXNcIjtcbmltcG9ydCB0eXBlIHsgUm91dGVJbmZvIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVHlwZXNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHVsc2VDb25maWcge1xuICBzZXJ2ZXJBZGRyZXNzOiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIFB1bHNlUHJlcmVuZGVyID0ge1xuICByZW5kZXJJZDogc3RyaW5nO1xuICB2aWV3czogUmVjb3JkPHN0cmluZywgVkRPTT47XG59O1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIENvbnRleHQgYW5kIEhvb2tzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vLyBDb250ZXh0IGZvciB0aGUgY2xpZW50LCBwcm92aWRlZCBieSBQdWxzZVByb3ZpZGVyXG5jb25zdCBQdWxzZUNsaWVudENvbnRleHQgPSBjcmVhdGVDb250ZXh0PFB1bHNlU29ja2V0SU9DbGllbnQgfCBudWxsPihudWxsKTtcbmNvbnN0IFB1bHNlUHJlcmVuZGVyQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQ8UHVsc2VQcmVyZW5kZXIgfCBudWxsPihudWxsKTtcblxuZXhwb3J0IGNvbnN0IHVzZVB1bHNlQ2xpZW50ID0gKCkgPT4ge1xuICBjb25zdCBjbGllbnQgPSB1c2VDb250ZXh0KFB1bHNlQ2xpZW50Q29udGV4dCk7XG4gIGlmICghY2xpZW50KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwidXNlUHVsc2VDbGllbnQgbXVzdCBiZSB1c2VkIHdpdGhpbiBhIFB1bHNlUHJvdmlkZXJcIik7XG4gIH1cbiAgcmV0dXJuIGNsaWVudDtcbn07XG5cbmV4cG9ydCBjb25zdCB1c2VQdWxzZVByZXJlbmRlciA9IChwYXRoOiBzdHJpbmcpID0+IHtcbiAgY29uc3QgY3R4ID0gdXNlQ29udGV4dChQdWxzZVByZXJlbmRlckNvbnRleHQpO1xuICBpZiAoIWN0eCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcInVzZVB1bHNlUHJlcmVuZGVyIG11c3QgYmUgdXNlZCB3aXRoaW4gYSBQdWxzZVByb3ZpZGVyXCIpO1xuICB9XG4gIGNvbnN0IHZpZXcgPSBjdHgudmlld3NbcGF0aF07XG4gIGlmICghdmlldykge1xuICAgIHRocm93IG5ldyBFcnJvcihgTm8gcHJlcmVuZGVyIGZvdW5kIGZvciAnJHtwYXRofSdgKTtcbiAgfVxuICByZXR1cm4gdmlldztcbn07XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBQcm92aWRlclxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGludGVyZmFjZSBQdWxzZVByb3ZpZGVyUHJvcHMge1xuICBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlO1xuICBjb25maWc6IFB1bHNlQ29uZmlnO1xuICBwcmVyZW5kZXI6IFB1bHNlUHJlcmVuZGVyO1xufVxuXG5jb25zdCBpbkJyb3dzZXIgPSB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiO1xuXG5leHBvcnQgZnVuY3Rpb24gUHVsc2VQcm92aWRlcih7XG4gIGNoaWxkcmVuLFxuICBjb25maWcsXG4gIHByZXJlbmRlcixcbn06IFB1bHNlUHJvdmlkZXJQcm9wcykge1xuICBjb25zdCBbY29ubmVjdGVkLCBzZXRDb25uZWN0ZWRdID0gdXNlU3RhdGUodHJ1ZSk7XG4gIGNvbnN0IHJyTmF2aWdhdGUgPSB1c2VOYXZpZ2F0ZSgpO1xuICBjb25zdCB7IHJlbmRlcklkLCB2aWV3cyB9ID0gcHJlcmVuZGVyO1xuXG4gIGNvbnN0IGNsaWVudCA9IHVzZU1lbW8oXG4gICAgKCkgPT4gbmV3IFB1bHNlU29ja2V0SU9DbGllbnQoY29uZmlnLnNlcnZlckFkZHJlc3MsIHJlbmRlcklkLCByck5hdmlnYXRlKSxcbiAgICBbY29uZmlnLnNlcnZlckFkZHJlc3MsIHJyTmF2aWdhdGUsIHJlbmRlcklkXVxuICApO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiBjbGllbnQub25Db25uZWN0aW9uQ2hhbmdlKHNldENvbm5lY3RlZCksIFtjbGllbnRdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChpbkJyb3dzZXIpIHtcbiAgICAgIGNsaWVudC5jb25uZWN0KCk7XG4gICAgICByZXR1cm4gKCkgPT4gY2xpZW50LmRpc2Nvbm5lY3QoKTtcbiAgICB9XG4gIH0sIFtjbGllbnRdKTtcblxuICByZXR1cm4gKFxuICAgIDxQdWxzZUNsaWVudENvbnRleHQuUHJvdmlkZXIgdmFsdWU9e2NsaWVudH0+XG4gICAgICA8UHVsc2VQcmVyZW5kZXJDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXtwcmVyZW5kZXJ9PlxuICAgICAgICB7IWNvbm5lY3RlZCAmJiAoXG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgcG9zaXRpb246IFwiZml4ZWRcIixcbiAgICAgICAgICAgICAgYm90dG9tOiBcIjIwcHhcIixcbiAgICAgICAgICAgICAgcmlnaHQ6IFwiMjBweFwiLFxuICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwicmVkXCIsXG4gICAgICAgICAgICAgIGNvbG9yOiBcIndoaXRlXCIsXG4gICAgICAgICAgICAgIHBhZGRpbmc6IFwiMTBweFwiLFxuICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6IFwiNXB4XCIsXG4gICAgICAgICAgICAgIHpJbmRleDogMTAwMCxcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgPlxuICAgICAgICAgICAgRmFpbGVkIHRvIGNvbm5lY3QgdG8gdGhlIHNlcnZlci5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKX1cbiAgICAgICAge2NoaWxkcmVufVxuICAgICAgPC9QdWxzZVByZXJlbmRlckNvbnRleHQuUHJvdmlkZXI+XG4gICAgPC9QdWxzZUNsaWVudENvbnRleHQuUHJvdmlkZXI+XG4gICk7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBWaWV3XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgaW50ZXJmYWNlIFB1bHNlVmlld1Byb3BzIHtcbiAgZXh0ZXJuYWxDb21wb25lbnRzOiBDb21wb25lbnRSZWdpc3RyeTtcbiAgcGF0aDogc3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gUHVsc2VWaWV3KHsgZXh0ZXJuYWxDb21wb25lbnRzLCBwYXRoIH06IFB1bHNlVmlld1Byb3BzKSB7XG4gIGNvbnN0IGNsaWVudCA9IHVzZVB1bHNlQ2xpZW50KCk7XG4gIGNvbnN0IGluaXRpYWxWRE9NID0gdXNlUHVsc2VQcmVyZW5kZXIocGF0aCk7XG4gIGNvbnN0IHJlbmRlcmVyID0gdXNlTWVtbyhcbiAgICAoKSA9PiBuZXcgVkRPTVJlbmRlcmVyKGNsaWVudCwgcGF0aCwgZXh0ZXJuYWxDb21wb25lbnRzKSxcbiAgICBbY2xpZW50LCBwYXRoLCBleHRlcm5hbENvbXBvbmVudHNdXG4gICk7XG4gIGNvbnN0IFt0cmVlLCBzZXRUcmVlXSA9IHVzZVN0YXRlPFJlYWN0LlJlYWN0Tm9kZT4oKCkgPT5cbiAgICByZW5kZXJlci5yZW5kZXJOb2RlKGluaXRpYWxWRE9NKVxuICApO1xuICBjb25zdCBbc2VydmVyRXJyb3IsIHNldFNlcnZlckVycm9yXSA9IHVzZVN0YXRlPFNlcnZlckVycm9ySW5mbyB8IG51bGw+KG51bGwpO1xuXG4gIGNvbnN0IGxvY2F0aW9uID0gdXNlTG9jYXRpb24oKTtcbiAgY29uc3QgcGFyYW1zID0gdXNlUGFyYW1zKCk7XG5cbiAgY29uc3Qgcm91dGVJbmZvID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgeyBcIipcIjogY2F0Y2hhbGwgPSBcIlwiLCAuLi5wYXRoUGFyYW1zIH0gPSBwYXJhbXM7XG4gICAgY29uc3QgcXVlcnlQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKGxvY2F0aW9uLnNlYXJjaCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGhhc2g6IGxvY2F0aW9uLmhhc2gsXG4gICAgICBwYXRobmFtZTogbG9jYXRpb24ucGF0aG5hbWUsXG4gICAgICBxdWVyeTogbG9jYXRpb24uc2VhcmNoLFxuICAgICAgcXVlcnlQYXJhbXM6IE9iamVjdC5mcm9tRW50cmllcyhxdWVyeVBhcmFtcy5lbnRyaWVzKCkpLFxuICAgICAgcGF0aFBhcmFtcyxcbiAgICAgIGNhdGNoYWxsOiBjYXRjaGFsbC5sZW5ndGggPiAwID8gY2F0Y2hhbGwuc3BsaXQoXCIvXCIpIDogW10sXG4gICAgfSBzYXRpc2ZpZXMgUm91dGVJbmZvO1xuICB9LCBbXG4gICAgbG9jYXRpb24uaGFzaCxcbiAgICBsb2NhdGlvbi5wYXRobmFtZSxcbiAgICBsb2NhdGlvbi5zZWFyY2gsXG4gICAgSlNPTi5zdHJpbmdpZnkocGFyYW1zKSxcbiAgXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoaW5Ccm93c2VyKSB7XG4gICAgICBjbGllbnQubW91bnRWaWV3KHBhdGgsIHtcbiAgICAgICAgcm91dGVJbmZvLFxuICAgICAgICBvbkluaXQ6ICh2ZG9tKSA9PiB7XG4gICAgICAgICAgc2V0VHJlZShyZW5kZXJlci5yZW5kZXJOb2RlKHZkb20pKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25VcGRhdGU6IChvcHMpID0+IHtcbiAgICAgICAgICBzZXRUcmVlKChwcmV2KSA9PlxuICAgICAgICAgICAgcHJldiA9PSBudWxsID8gcHJldiA6IGFwcGx5VXBkYXRlcyhwcmV2LCBvcHMsIHJlbmRlcmVyKVxuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IG9mZkVyciA9IGNsaWVudC5vblNlcnZlckVycm9yKChwLCBlcnIpID0+IHtcbiAgICAgICAgaWYgKHAgPT09IHBhdGgpIHNldFNlcnZlckVycm9yKGVycik7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIG9mZkVycigpO1xuICAgICAgICBjbGllbnQudW5tb3VudChwYXRoKTtcbiAgICAgIH07XG4gICAgfVxuICAgIC8vIHJvdXRlSW5mbyBpcyBOT1QgaW5jbHVkZWQgaGVyZSBvbiBwdXJwb3NlXG4gIH0sIFtjbGllbnRdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChpbkJyb3dzZXIpIHtcbiAgICAgIGNsaWVudC5uYXZpZ2F0ZShwYXRoLCByb3V0ZUluZm8pO1xuICAgIH1cbiAgfSwgW2NsaWVudCwgcGF0aCwgcm91dGVJbmZvXSk7XG5cbiAgaWYgKHNlcnZlckVycm9yKSB7XG4gICAgcmV0dXJuIDxTZXJ2ZXJFcnJvciBlcnJvcj17c2VydmVyRXJyb3J9IC8+O1xuICB9XG5cbiAgcmV0dXJuIHRyZWU7XG59XG5cbmZ1bmN0aW9uIFNlcnZlckVycm9yKHsgZXJyb3IgfTogeyBlcnJvcjogU2VydmVyRXJyb3JJbmZvIH0pIHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICBzdHlsZT17e1xuICAgICAgICBwYWRkaW5nOiAxNixcbiAgICAgICAgYm9yZGVyOiBcIjFweCBzb2xpZCAjZTAwXCIsXG4gICAgICAgIGJhY2tncm91bmQ6IFwiI2ZmZjVmNVwiLFxuICAgICAgICBjb2xvcjogXCIjOTAwXCIsXG4gICAgICAgIGZvbnRGYW1pbHk6XG4gICAgICAgICAgJ3VpLW1vbm9zcGFjZSwgU0ZNb25vLVJlZ3VsYXIsIE1lbmxvLCBNb25hY28sIENvbnNvbGFzLCBcIkxpYmVyYXRpb24gTW9ub1wiLCBcIkNvdXJpZXIgTmV3XCIsIG1vbm9zcGFjZScsXG4gICAgICAgIHdoaXRlU3BhY2U6IFwicHJlLXdyYXBcIixcbiAgICAgIH19XG4gICAgPlxuICAgICAgPGRpdiBzdHlsZT17eyBmb250V2VpZ2h0OiA3MDAsIG1hcmdpbkJvdHRvbTogOCB9fT5cbiAgICAgICAgU2VydmVyIEVycm9yIGR1cmluZyB7ZXJyb3IucGhhc2V9XG4gICAgICA8L2Rpdj5cbiAgICAgIHtlcnJvci5tZXNzYWdlICYmIDxkaXY+e2Vycm9yLm1lc3NhZ2V9PC9kaXY+fVxuICAgICAge2Vycm9yLnN0YWNrICYmIChcbiAgICAgICAgPGRldGFpbHMgb3BlbiBzdHlsZT17eyBtYXJnaW5Ub3A6IDggfX0+XG4gICAgICAgICAgPHN1bW1hcnk+U3RhY2sgdHJhY2U8L3N1bW1hcnk+XG4gICAgICAgICAgPHByZSBzdHlsZT17eyBtYXJnaW46IDAgfX0+e2Vycm9yLnN0YWNrfTwvcHJlPlxuICAgICAgICA8L2RldGFpbHM+XG4gICAgICApfVxuICAgIDwvZGl2PlxuICApO1xufVxuIiwKICAgICJpbXBvcnQgUmVhY3QsIHtcbiAgY2xvbmVFbGVtZW50LFxuICBjcmVhdGVFbGVtZW50LFxuICBpc1ZhbGlkRWxlbWVudCxcbiAgbGF6eSxcbiAgU3VzcGVuc2UsXG4gIHR5cGUgQ29tcG9uZW50VHlwZSxcbn0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgdHlwZSB7IENvbXBvbmVudFJlZ2lzdHJ5LCBWRE9NTm9kZSwgVkRPTVVwZGF0ZSB9IGZyb20gXCIuL3Zkb21cIjtcbmltcG9ydCB7XG4gIEZSQUdNRU5UX1RBRyxcbiAgaXNFbGVtZW50Tm9kZSxcbiAgaXNNb3VudFBvaW50Tm9kZSxcbiAgTU9VTlRfUE9JTlRfUFJFRklYLFxufSBmcm9tIFwiLi92ZG9tXCI7XG5pbXBvcnQgdHlwZSB7IFB1bHNlU29ja2V0SU9DbGllbnQgfSBmcm9tIFwiLi9jbGllbnRcIjtcblxuZXhwb3J0IGNsYXNzIFZET01SZW5kZXJlciB7XG4gIHByaXZhdGUgY2FsbGJhY2tDYWNoZTogTWFwPHN0cmluZywgKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkPjtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjbGllbnQ6IFB1bHNlU29ja2V0SU9DbGllbnQsXG4gICAgcHJpdmF0ZSBwYXRoOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBjb21wb25lbnRzOiBDb21wb25lbnRSZWdpc3RyeVxuICApIHtcbiAgICB0aGlzLmNhbGxiYWNrQ2FjaGUgPSBuZXcgTWFwKCk7XG4gIH1cblxuICBnZXRDYWxsYmFjayhrZXk6IHN0cmluZykge1xuICAgIGxldCBmbiA9IHRoaXMuY2FsbGJhY2tDYWNoZS5nZXQoa2V5KTtcbiAgICBpZiAoIWZuKSB7XG4gICAgICBmbiA9ICguLi5hcmdzKSA9PiB0aGlzLmNsaWVudC5pbnZva2VDYWxsYmFjayh0aGlzLnBhdGgsIGtleSwgYXJncyk7XG4gICAgICB0aGlzLmNhbGxiYWNrQ2FjaGUuc2V0KGtleSwgZm4pO1xuICAgIH1cbiAgICByZXR1cm4gZm47XG4gIH1cblxuICByZW5kZXJOb2RlKG5vZGU6IFZET01Ob2RlKTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgICAvLyBIYW5kbGUgcHJpbWl0aXZlcyBlYXJseVxuICAgIGlmIChcbiAgICAgIG5vZGUgPT0gbnVsbCB8fCAvLyBjYXRjaGVzIGJvdGggbnVsbCBhbmQgdW5kZWZpbmVkXG4gICAgICB0eXBlb2Ygbm9kZSA9PT0gXCJib29sZWFuXCIgfHxcbiAgICAgIHR5cGVvZiBub2RlID09PSBcIm51bWJlclwiIHx8XG4gICAgICB0eXBlb2Ygbm9kZSA9PT0gXCJzdHJpbmdcIlxuICAgICkge1xuICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuXG4gICAgLy8gRWxlbWVudCBub2Rlc1xuICAgIGlmIChpc0VsZW1lbnROb2RlKG5vZGUpKSB7XG4gICAgICBjb25zdCB7IHRhZywgcHJvcHMgPSB7fSwgY2hpbGRyZW4gPSBbXSB9ID0gbm9kZTtcblxuICAgICAgLy8gUHJvY2VzcyBwcm9wcyBmb3IgY2FsbGJhY2tzXG4gICAgICBjb25zdCBwcm9jZXNzZWRQcm9wczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgICAgZm9yIChjb25zdCBbcHJvcEtleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHByb3BzKSkge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIHZhbHVlLnN0YXJ0c1dpdGgoXCIkJGZuOlwiKSkge1xuICAgICAgICAgIGNvbnN0IGNhbGxiYWNrS2V5ID0gdmFsdWUuc3Vic3RyaW5nKFwiJCRmbjpcIi5sZW5ndGgpO1xuICAgICAgICAgIHByb2Nlc3NlZFByb3BzW3Byb3BLZXldID0gdGhpcy5nZXRDYWxsYmFjayhjYWxsYmFja0tleSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvY2Vzc2VkUHJvcHNbcHJvcEtleV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG5vZGUua2V5KSB7XG4gICAgICAgIHByb2Nlc3NlZFByb3BzLmtleSA9IG5vZGUua2V5O1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZW5kZXJlZENoaWxkcmVuID0gW107XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgICAgIHJlbmRlcmVkQ2hpbGRyZW4ucHVzaCh0aGlzLnJlbmRlck5vZGUoY2hpbGQpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzTW91bnRQb2ludE5vZGUobm9kZSkpIHtcbiAgICAgICAgY29uc3QgY29tcG9uZW50S2V5ID0gbm9kZS50YWcuc2xpY2UoTU9VTlRfUE9JTlRfUFJFRklYLmxlbmd0aCk7XG4gICAgICAgIGNvbnN0IENvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50c1tjb21wb25lbnRLZXldITtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoQ29tcG9uZW50LCBwcm9jZXNzZWRQcm9wcywgLi4ucmVuZGVyZWRDaGlsZHJlbik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjcmVhdGVFbGVtZW50KFxuICAgICAgICB0YWcgPT09IEZSQUdNRU5UX1RBRyA/IFJlYWN0LkZyYWdtZW50IDogdGFnLFxuICAgICAgICBwcm9jZXNzZWRQcm9wcyxcbiAgICAgICAgLi4ucmVuZGVyZWRDaGlsZHJlblxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayBmb3IgdW5rbm93biBub2RlIHR5cGVzXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgY29uc29sZS5lcnJvcihcIlVua25vd24gVkRPTSBub2RlIHR5cGU6XCIsIG5vZGUpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVXBkYXRlIEZ1bmN0aW9ucyAoc2hhbGxvdy1jbG9uZSBhbG9uZyB1cGRhdGUgcGF0aClcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIHRvQ2hpbGRyZW5BcnJheUZyb21FbGVtZW50KGVsOiBSZWFjdC5SZWFjdEVsZW1lbnQpOiBSZWFjdC5SZWFjdE5vZGVbXSB7XG4gIGNvbnN0IGNoaWxkcmVuID0gKGVsLnByb3BzIGFzIGFueSk/LmNoaWxkcmVuIGFzIFJlYWN0LlJlYWN0Tm9kZSB8IHVuZGVmaW5lZDtcbiAgaWYgKGNoaWxkcmVuID09IG51bGwpIHJldHVybiBbXTtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoY2hpbGRyZW4pID8gY2hpbGRyZW4uc2xpY2UoKSA6IFtjaGlsZHJlbl07XG59XG5cbmZ1bmN0aW9uIHByb2Nlc3NQcm9wc0ZvckNhbGxiYWNrcyhcbiAgcmVuZGVyZXI6IFZET01SZW5kZXJlcixcbiAgcHJvcHM6IFJlY29yZDxzdHJpbmcsIGFueT5cbik6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICBjb25zdCBwcm9jZXNzZWQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgZm9yIChjb25zdCBbcHJvcEtleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHByb3BzIHx8IHt9KSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgdmFsdWUuc3RhcnRzV2l0aChcIiQkZm46XCIpKSB7XG4gICAgICBjb25zdCBjYWxsYmFja0tleSA9IHZhbHVlLnN1YnN0cmluZyhcIiQkZm46XCIubGVuZ3RoKTtcbiAgICAgIHByb2Nlc3NlZFtwcm9wS2V5XSA9IHJlbmRlcmVyLmdldENhbGxiYWNrKGNhbGxiYWNrS2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvY2Vzc2VkW3Byb3BLZXldID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBwcm9jZXNzZWQ7XG59XG5cbmZ1bmN0aW9uIGNsb25lRWxlbWVudFdpdGhDaGlsZHJlbihcbiAgZWw6IFJlYWN0LlJlYWN0RWxlbWVudCxcbiAgY2hpbGRyZW46IFJlYWN0LlJlYWN0Tm9kZVtdXG4pOiBSZWFjdC5SZWFjdEVsZW1lbnQge1xuICAvLyBQcmVzZXJ2ZSBleGlzdGluZyBwcm9wczsgb25seSBvdmVycmlkZSBjaGlsZHJlblxuICByZXR1cm4gY2xvbmVFbGVtZW50KGVsLCB1bmRlZmluZWQsIC4uLmNoaWxkcmVuKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5VXBkYXRlcyhcbiAgaW5pdGlhbFRyZWU6IFJlYWN0LlJlYWN0Tm9kZSxcbiAgdXBkYXRlczogVkRPTVVwZGF0ZVtdLFxuICByZW5kZXJlcjogVkRPTVJlbmRlcmVyXG4pOiBSZWFjdC5SZWFjdE5vZGUge1xuICBsZXQgbmV3VHJlZTogUmVhY3QuUmVhY3ROb2RlID0gaW5pdGlhbFRyZWU7XG4gIGZvciAoY29uc3QgdXBkYXRlIG9mIHVwZGF0ZXMpIHtcbiAgICBjb25zdCBwYXJ0cyA9IHVwZGF0ZS5wYXRoXG4gICAgICAuc3BsaXQoXCIuXCIpXG4gICAgICAuZmlsdGVyKChzKSA9PiBzLmxlbmd0aCA+IDApXG4gICAgICAubWFwKE51bWJlcik7XG5cbiAgICBjb25zdCBkZXNjZW5kID0gKG5vZGU6IFJlYWN0LlJlYWN0Tm9kZSwgZGVwdGg6IG51bWJlcik6IFJlYWN0LlJlYWN0Tm9kZSA9PiB7XG4gICAgICBpZiAoZGVwdGggPCBwYXJ0cy5sZW5ndGgpIHtcbiAgICAgICAgYXNzZXJ0SXNFbGVtZW50KG5vZGUsIHBhcnRzLCBkZXB0aCk7XG4gICAgICAgIG5vZGUgPSBub2RlIGFzIFJlYWN0LlJlYWN0RWxlbWVudDtcbiAgICAgICAgY29uc3QgY2hpbGRJZHggPSBwYXJ0c1tkZXB0aF0hO1xuICAgICAgICBjb25zdCBjaGlsZHJlbkFyciA9IHRvQ2hpbGRyZW5BcnJheUZyb21FbGVtZW50KG5vZGUpO1xuICAgICAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuQXJyW2NoaWxkSWR4XTtcbiAgICAgICAgY2hpbGRyZW5BcnJbY2hpbGRJZHhdID0gZGVzY2VuZChjaGlsZCwgZGVwdGggKyAxKSBhcyBhbnk7XG4gICAgICAgIHJldHVybiBjbG9uZUVsZW1lbnRXaXRoQ2hpbGRyZW4obm9kZSwgY2hpbGRyZW5BcnIpO1xuICAgICAgfVxuICAgICAgc3dpdGNoICh1cGRhdGUudHlwZSkge1xuICAgICAgICBjYXNlIFwicmVwbGFjZVwiOiB7XG4gICAgICAgICAgcmV0dXJuIHJlbmRlcmVyLnJlbmRlck5vZGUodXBkYXRlLmRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJ1cGRhdGVfcHJvcHNcIjoge1xuICAgICAgICAgIGFzc2VydElzRWxlbWVudChub2RlLCBwYXJ0cywgZGVwdGgpO1xuICAgICAgICAgIG5vZGUgPSBub2RlIGFzIFJlYWN0LlJlYWN0RWxlbWVudDtcbiAgICAgICAgICBjb25zdCBjdXJyZW50UHJvcHMgPSAobm9kZS5wcm9wcyA/PyB7fSkgYXMgb2JqZWN0O1xuICAgICAgICAgIGNvbnN0IG5leHRQcm9wczogUmVjb3JkPHN0cmluZywgYW55PiA9IHsgLi4uY3VycmVudFByb3BzIH07XG5cbiAgICAgICAgICBjb25zb2xlLmxvZyhcInVwZGF0ZV9wcm9wcywgZGF0YTpcIiwgdXBkYXRlLmRhdGEpO1xuICAgICAgICAgIGNvbnN0IGRlbHRhID0gdXBkYXRlLmRhdGE7XG4gICAgICAgICAgaWYgKGRlbHRhLnJlbW92ZSAmJiBkZWx0YS5yZW1vdmUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgZGVsdGEucmVtb3ZlKSB7XG4gICAgICAgICAgICAgIGlmIChrZXkgaW4gbmV4dFByb3BzKSBkZWxldGUgbmV4dFByb3BzW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChkZWx0YS5zZXQpIHtcbiAgICAgICAgICAgIGNvbnN0IHByb2Nlc3NlZCA9IHByb2Nlc3NQcm9wc0ZvckNhbGxiYWNrcyhyZW5kZXJlciwgZGVsdGEuc2V0KTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKHByb2Nlc3NlZCkpIHtcbiAgICAgICAgICAgICAgbmV4dFByb3BzW2tdID0gdjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gTm90IHBhc3NpbmcgY2hpbGRyZW4gLT4gb25seSB1cGRhdGUgdGhlIHByb3BzXG4gICAgICAgICAgY29uc29sZS5sb2coXCJPbGQgcHJvcHM6XCIsIG5vZGUucHJvcHMpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKFwiTmV3IHByb3BzOlwiLCBuZXh0UHJvcHMpO1xuICAgICAgICAgIHJldHVybiBjbG9uZUVsZW1lbnQobm9kZSwgbmV4dFByb3BzKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwiaW5zZXJ0XCI6IHtcbiAgICAgICAgICBhc3NlcnRJc0VsZW1lbnQobm9kZSwgcGFydHMsIGRlcHRoKTtcbiAgICAgICAgICBub2RlID0gbm9kZSBhcyBSZWFjdC5SZWFjdEVsZW1lbnQ7XG4gICAgICAgICAgY29uc3QgY2hpbGRyZW4gPSB0b0NoaWxkcmVuQXJyYXlGcm9tRWxlbWVudChub2RlKTtcbiAgICAgICAgICBjaGlsZHJlbi5zcGxpY2UodXBkYXRlLmlkeCwgMCwgcmVuZGVyZXIucmVuZGVyTm9kZSh1cGRhdGUuZGF0YSkpO1xuICAgICAgICAgIC8vIE9ubHkgdXBkYXRlIHRoZSBjaGlsZHJlbiAoVHlwZVNjcmlwdCBkb2Vzbid0IGxpa2UgdGhlIGBudWxsYCwgYnV0IHRoYXQncyB3aGF0IHRoZSBvZmZpY2lhbCBSZWFjdCBkb2NzIHNheSlcbiAgICAgICAgICByZXR1cm4gY2xvbmVFbGVtZW50KG5vZGUsIG51bGwhLCAuLi5jaGlsZHJlbik7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcInJlbW92ZVwiOiB7XG4gICAgICAgICAgYXNzZXJ0SXNFbGVtZW50KG5vZGUsIHBhcnRzLCBkZXB0aCk7XG4gICAgICAgICAgbm9kZSA9IG5vZGUgYXMgUmVhY3QuUmVhY3RFbGVtZW50O1xuICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gdG9DaGlsZHJlbkFycmF5RnJvbUVsZW1lbnQobm9kZSk7XG4gICAgICAgICAgY2hpbGRyZW4uc3BsaWNlKHVwZGF0ZS5pZHgsIDEpO1xuICAgICAgICAgIC8vIE9ubHkgdXBkYXRlIHRoZSBjaGlsZHJlbiAoVHlwZVNjcmlwdCBkb2Vzbid0IGxpa2UgdGhlIGBudWxsYCwgYnV0IHRoYXQncyB3aGF0IHRoZSBvZmZpY2lhbCBSZWFjdCBkb2NzIHNheSlcbiAgICAgICAgICByZXR1cm4gY2xvbmVFbGVtZW50KG5vZGUsIG51bGwhLCAuLi5jaGlsZHJlbik7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcIm1vdmVcIjoge1xuICAgICAgICAgIGFzc2VydElzRWxlbWVudChub2RlLCBwYXJ0cywgZGVwdGgpO1xuICAgICAgICAgIG5vZGUgPSBub2RlIGFzIFJlYWN0LlJlYWN0RWxlbWVudDtcbiAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IHRvQ2hpbGRyZW5BcnJheUZyb21FbGVtZW50KG5vZGUpO1xuICAgICAgICAgIGNvbnN0IGl0ZW0gPSBjaGlsZHJlbi5zcGxpY2UodXBkYXRlLmRhdGEuZnJvbV9pbmRleCwgMSlbMF07XG4gICAgICAgICAgY2hpbGRyZW4uc3BsaWNlKHVwZGF0ZS5kYXRhLnRvX2luZGV4LCAwLCBpdGVtKTtcbiAgICAgICAgICAvLyBPbmx5IHVwZGF0ZSB0aGUgY2hpbGRyZW4gKFR5cGVTY3JpcHQgZG9lc24ndCBsaWtlIHRoZSBgbnVsbGAsIGJ1dCB0aGF0J3Mgd2hhdCB0aGUgb2ZmaWNpYWwgUmVhY3QgZG9jcyBzYXkpXG4gICAgICAgICAgcmV0dXJuIGNsb25lRWxlbWVudChub2RlLCBudWxsISwgLi4uY2hpbGRyZW4pO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFtQdWxzZSByZW5kZXJlcl0gVW5rbm93biB1cGRhdGUgdHlwZTogJHt1cGRhdGVbXCJ0eXBlXCJdfWBcbiAgICAgICAgICApO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBuZXdUcmVlID0gZGVzY2VuZChuZXdUcmVlLCAwKTtcbiAgfVxuICByZXR1cm4gbmV3VHJlZTtcbn1cblxuLy8gVGhlIGBjb21wb25lbnRgIHByb3Agc2hvdWxkIGJlIHNvbWV0aGluZyBsaWtlIGAoKSA9PlxuLy8gaW1wb3J0KCd+L3BhdGgvdG8vY29tcG9uZW50JykgKHdlJ2xsIG5lZWQgdG8gcmVtYXAgaWYgd2UncmUgaW1wb3J0aW5nIGEgbmFtZWQgZXhwb3J0IGFuZCBub3QgdGhlIGRlZmF1bHQpXG5leHBvcnQgZnVuY3Rpb24gUmVuZGVyTGF6eShcbiAgY29tcG9uZW50OiAoKSA9PiBQcm9taXNlPHsgZGVmYXVsdDogQ29tcG9uZW50VHlwZTxhbnk+IH0+LFxuICBmYWxsYmFjaz86IFJlYWN0LlJlYWN0Tm9kZVxuKTogUmVhY3QuRkM8UmVhY3QuUHJvcHNXaXRoQ2hpbGRyZW48dW5rbm93bj4+IHtcbiAgY29uc3QgQ29tcG9uZW50ID0gbGF6eShjb21wb25lbnQpO1xuICByZXR1cm4gKHsgY2hpbGRyZW4sIC4uLnByb3BzIH06IFJlYWN0LlByb3BzV2l0aENoaWxkcmVuPHVua25vd24+KSA9PiB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxTdXNwZW5zZSBmYWxsYmFjaz17ZmFsbGJhY2sgPz8gPD48Lz59PlxuICAgICAgICA8Q29tcG9uZW50IHsuLi5wcm9wc30+e2NoaWxkcmVufTwvQ29tcG9uZW50PlxuICAgICAgPC9TdXNwZW5zZT5cbiAgICApO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhc3NlcnRJc0VsZW1lbnQoXG4gIG5vZGU6IFJlYWN0LlJlYWN0Tm9kZSxcbiAgcGFydHM6IG51bWJlcltdLFxuICBkZXB0aDogbnVtYmVyXG4pOiBub2RlIGlzIFJlYWN0LlJlYWN0RWxlbWVudCB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgJiYgIWlzVmFsaWRFbGVtZW50KG5vZGUpKSB7XG4gICAgY29uc29sZS5lcnJvcihcIkludmFsaWQgbm9kZTpcIiwgbm9kZSk7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBub2RlIGF0IHBhdGggXCIgKyBwYXJ0cy5zbGljZSgwLCBkZXB0aCkuam9pbihcIi5cIikpO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IENvbXBvbmVudFR5cGUgfSBmcm9tIFwicmVhY3RcIjtcblxuLy8gU3BlY2lhbCBwcmVmaXhlcyBmb3IgcmVzZXJ2ZWQgbm9kZSB0eXBlc1xuZXhwb3J0IGNvbnN0IEZSQUdNRU5UX1RBRyA9IFwiJCRmcmFnbWVudFwiO1xuZXhwb3J0IGNvbnN0IE1PVU5UX1BPSU5UX1BSRUZJWCA9IFwiJCRcIjtcblxuLy8gZXhwb3J0IHR5cGUgTGF6eUNvbXBvbmVudCA9ICgpID0+IFByb21pc2U8eyBkZWZhdWx0OiBDb21wb25lbnRUeXBlPGFueT4gfT47XG5leHBvcnQgdHlwZSBSZWdpc3RyeUVudHJ5ID0gQ29tcG9uZW50VHlwZTxhbnk+O1xuZXhwb3J0IHR5cGUgQ29tcG9uZW50UmVnaXN0cnkgPSBSZWNvcmQ8c3RyaW5nLCBDb21wb25lbnRUeXBlPGFueT4+O1xuXG5leHBvcnQgaW50ZXJmYWNlIFZET01FbGVtZW50IHtcbiAgdGFnOiBzdHJpbmc7XG4gIHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgY2hpbGRyZW4/OiBWRE9NTm9kZVtdO1xuICBrZXk/OiBzdHJpbmc7XG4gIGxhenk/OiBib29sZWFuO1xufVxuXG4vLyBQcmltaXRpdmUgbm9kZXMgdGhhdCBjYW4gYmUgcmVuZGVyZWRcbmV4cG9ydCB0eXBlIFByaW1pdGl2ZU5vZGUgPSBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuO1xuXG4vLyBWRE9NTm9kZSBpcyBlaXRoZXIgYSBwcmltaXRpdmUgKHN0cmluZywgbnVtYmVyLCBib29sZWFuKSBvciBhbiBlbGVtZW50IG5vZGUuXG4vLyBCb29sZWFucyBhcmUgdmFsaWQgY2hpbGRyZW4gaW4gUmVhY3QgYnV0IGRvIG5vdCByZW5kZXIgYW55dGhpbmcuXG4vLyBNb3VudCBwb2ludHMgYXJlIGp1c3QgVUlFbGVtZW50Tm9kZXMgd2l0aCB0YWdzIHN0YXJ0aW5nIHdpdGggJCRDb21wb25lbnRLZXlcbmV4cG9ydCB0eXBlIFZET01Ob2RlID0gUHJpbWl0aXZlTm9kZSB8IFZET01FbGVtZW50O1xuXG5leHBvcnQgdHlwZSBWRE9NID0gVkRPTU5vZGU7XG5cbmV4cG9ydCB0eXBlIFVwZGF0ZVR5cGUgPVxuICB8IFwiaW5zZXJ0XCJcbiAgfCBcInJlbW92ZVwiXG4gIHwgXCJyZXBsYWNlXCJcbiAgfCBcInVwZGF0ZV9wcm9wc1wiXG4gIHwgXCJtb3ZlXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVkRPTVVwZGF0ZUJhc2Uge1xuICB0eXBlOiBVcGRhdGVUeXBlO1xuICBwYXRoOiBzdHJpbmc7IC8vIERvdC1zZXBhcmF0ZWQgcGF0aCB0byB0aGUgbm9kZVxuICBkYXRhPzogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEluc2VydFVwZGF0ZSBleHRlbmRzIFZET01VcGRhdGVCYXNlIHtcbiAgdHlwZTogXCJpbnNlcnRcIjtcbiAgZGF0YTogVkRPTU5vZGU7IC8vIFRoZSBub2RlIHRvIGluc2VydFxuICBpZHg6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZW1vdmVVcGRhdGUgZXh0ZW5kcyBWRE9NVXBkYXRlQmFzZSB7XG4gIHR5cGU6IFwicmVtb3ZlXCI7XG4gIGlkeDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlcGxhY2VVcGRhdGUgZXh0ZW5kcyBWRE9NVXBkYXRlQmFzZSB7XG4gIHR5cGU6IFwicmVwbGFjZVwiO1xuICBkYXRhOiBWRE9NTm9kZTsgLy8gVGhlIG5ldyBub2RlXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlUHJvcHNVcGRhdGUgZXh0ZW5kcyBWRE9NVXBkYXRlQmFzZSB7XG4gIHR5cGU6IFwidXBkYXRlX3Byb3BzXCI7XG4gIGRhdGE6IHtcbiAgICBzZXQ/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIHJlbW92ZT86IHN0cmluZ1tdO1xuICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1vdmVVcGRhdGUgZXh0ZW5kcyBWRE9NVXBkYXRlQmFzZSB7XG4gIHR5cGU6IFwibW92ZVwiO1xuICBkYXRhOiB7XG4gICAgZnJvbV9pbmRleDogbnVtYmVyO1xuICAgIHRvX2luZGV4OiBudW1iZXI7XG4gIH07XG59XG5cbmV4cG9ydCB0eXBlIFZET01VcGRhdGUgPVxuICB8IEluc2VydFVwZGF0ZVxuICB8IFJlbW92ZVVwZGF0ZVxuICB8IFJlcGxhY2VVcGRhdGVcbiAgfCBVcGRhdGVQcm9wc1VwZGF0ZVxuICB8IE1vdmVVcGRhdGU7XG5cbi8vIFV0aWxpdHkgZnVuY3Rpb25zIGZvciB3b3JraW5nIHdpdGggdGhlIFVJIHRyZWUgc3RydWN0dXJlXG5leHBvcnQgZnVuY3Rpb24gaXNFbGVtZW50Tm9kZShub2RlOiBWRE9NTm9kZSk6IG5vZGUgaXMgVkRPTUVsZW1lbnQge1xuICAvLyBNYXRjaGVzIGFsbCBub24tdGV4dCBub2Rlc1xuICByZXR1cm4gdHlwZW9mIG5vZGUgPT09IFwib2JqZWN0XCIgJiYgbm9kZSAhPT0gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTW91bnRQb2ludE5vZGUobm9kZTogVkRPTU5vZGUpOiBub2RlIGlzIFZET01FbGVtZW50IHtcbiAgcmV0dXJuIChcbiAgICB0eXBlb2Ygbm9kZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgIG5vZGUgIT09IG51bGwgJiZcbiAgICBub2RlLnRhZy5zdGFydHNXaXRoKE1PVU5UX1BPSU5UX1BSRUZJWCkgJiZcbiAgICBub2RlLnRhZyAhPT0gRlJBR01FTlRfVEFHXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1RleHROb2RlKG5vZGU6IFZET01Ob2RlKTogbm9kZSBpcyBzdHJpbmcge1xuICByZXR1cm4gdHlwZW9mIG5vZGUgPT09IFwic3RyaW5nXCI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0ZyYWdtZW50KG5vZGU6IFZET01Ob2RlKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2Ygbm9kZSA9PT0gXCJvYmplY3RcIiAmJiBub2RlICE9PSBudWxsICYmIG5vZGUudGFnID09PSBGUkFHTUVOVF9UQUc7XG59XG4iLAogICAgIlxudHlwZSBTaW1wbGlmeTxUPiA9IHsgW0sgaW4ga2V5b2YgVF06IFRbS10gfSAmIHt9O1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRXh0cmFjdG9yPFQgZXh0ZW5kcyBvYmplY3Q+KCkge1xuICBmdW5jdGlvbiBfY3JlYXRlRXh0cmFjdG9yPFxuICAgIGNvbnN0IEsgZXh0ZW5kcyByZWFkb25seSAoa2V5b2YgVClbXSxcbiAgICBDIGV4dGVuZHMgUGFydGlhbDxSZWNvcmQ8S1tudW1iZXJdIHwgc3RyaW5nLCAoc3JjOiBUKSA9PiBhbnk+PixcbiAgPihrZXlzOiBLLCBjb21wdXRlZD86IEMpIHtcbiAgICByZXR1cm4gKFxuICAgICAgc3JjOiBUXG4gICAgKTogU2ltcGxpZnk8XG4gICAgICBQaWNrPFQsIEtbbnVtYmVyXT4gJiB7XG4gICAgICAgIFtQIGluIGtleW9mIENdLT86IENbUF0gZXh0ZW5kcyAoLi4uYXJnczogYW55KSA9PiBpbmZlciBSID8gUiA6IG5ldmVyO1xuICAgICAgfVxuICAgID4gPT4ge1xuICAgICAgY29uc3Qgb3V0OiBhbnkgPSB7fTtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgICAgb3V0W2tleSBhcyBzdHJpbmddID0gKHNyYyBhcyBhbnkpW2tleSBhcyBzdHJpbmddO1xuICAgICAgfVxuICAgICAgaWYgKGNvbXB1dGVkKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGNvbXB1dGVkKSB7XG4gICAgICAgICAgY29uc3QgZm4gPSBjb21wdXRlZFtrZXldITtcbiAgICAgICAgICBvdXRba2V5XSA9IGZuKHNyYyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBvdXQ7XG4gICAgfTtcbiAgfVxuICByZXR1cm4gX2NyZWF0ZUV4dHJhY3Rvcjtcbn0iLAogICAgImltcG9ydCB7IGNyZWF0ZUV4dHJhY3RvciB9IGZyb20gXCIuL2V4dHJhY3RvclwiO1xuXG4vLyBCYXNlIGV4dHJhY3RvcnMgKGNhbWVsQ2FzZSkgc2ltaWxhciB0byBldmVudHMudHMgc3R5bGVcbmNvbnN0IGxvd2VyVGFnTmFtZSA9IChlOiBFbGVtZW50KSA9PiBlLnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcblxuY29uc3QgRUxFTUVOVF9LRVlTID0gW1xuICBcImlkXCIsXG4gIFwiY2xhc3NOYW1lXCIsXG4gIFwidGFnTmFtZVwiLFxuICBcImxvY2FsTmFtZVwiLFxuICBcImNsaWVudEhlaWdodFwiLFxuICBcImNsaWVudExlZnRcIixcbiAgXCJjbGllbnRUb3BcIixcbiAgXCJjbGllbnRXaWR0aFwiLFxuICBcInNjcm9sbEhlaWdodFwiLFxuICBcInNjcm9sbExlZnRcIixcbiAgXCJzY3JvbGxUb3BcIixcbiAgXCJzY3JvbGxXaWR0aFwiLFxuICBcInNsb3RcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBFbGVtZW50KVtdO1xuXG5jb25zdCBIVE1MX09SX1NWR19LRVlTID0gW1xuICBcImF1dG9mb2N1c1wiLFxuICBcInRhYkluZGV4XCIsXG4gIFwibm9uY2VcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MT3JTVkdFbGVtZW50KVtdO1xuXG5jb25zdCBIVE1MX0VMRU1FTlRfQkFTRV9LRVlTID0gW1xuICBcImFjY2Vzc0tleVwiLFxuICBcImFjY2Vzc0tleUxhYmVsXCIsXG4gIFwiYXV0b2NhcGl0YWxpemVcIixcbiAgXCJkaXJcIixcbiAgXCJkcmFnZ2FibGVcIixcbiAgXCJoaWRkZW5cIixcbiAgXCJpbmVydFwiLFxuICBcImxhbmdcIixcbiAgXCJvZmZzZXRIZWlnaHRcIixcbiAgXCJvZmZzZXRMZWZ0XCIsXG4gIFwib2Zmc2V0VG9wXCIsXG4gIFwib2Zmc2V0V2lkdGhcIixcbiAgXCJwb3BvdmVyXCIsXG4gIFwic3BlbGxjaGVja1wiLFxuICBcInRpdGxlXCIsXG4gIFwidHJhbnNsYXRlXCIsXG4gIFwid3JpdGluZ1N1Z2dlc3Rpb25zXCIsXG4gIFwiY29udGVudEVkaXRhYmxlXCIsXG4gIFwiZW50ZXJLZXlIaW50XCIsXG4gIFwiaXNDb250ZW50RWRpdGFibGVcIixcbiAgXCJpbnB1dE1vZGVcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MRWxlbWVudClbXTtcblxuY29uc3QgZXh0cmFjdEVsZW1lbnQgPSBjcmVhdGVFeHRyYWN0b3I8RWxlbWVudD4oKShFTEVNRU5UX0tFWVMsIHtcbiAgdGFnTmFtZTogbG93ZXJUYWdOYW1lLFxufSk7XG5cbmNvbnN0IGV4dHJhY3RIVE1MT3JTVkdFbGVtZW50ID1cbiAgY3JlYXRlRXh0cmFjdG9yPEhUTUxPclNWR0VsZW1lbnQ+KCkoSFRNTF9PUl9TVkdfS0VZUyk7XG5cbmNvbnN0IGV4dHJhY3RIVE1MRWxlbWVudEJhc2VPbmx5ID0gY3JlYXRlRXh0cmFjdG9yPEhUTUxFbGVtZW50PigpKFxuICBIVE1MX0VMRU1FTlRfQkFTRV9LRVlTXG4pO1xuXG5mdW5jdGlvbiBleHRyYWN0SFRNTEVsZW1lbnRCYXNlKGVsdDogSFRNTEVsZW1lbnQpIHtcbiAgcmV0dXJuIHtcbiAgICAuLi5leHRyYWN0RWxlbWVudChlbHQpLFxuICAgIC4uLmV4dHJhY3RIVE1MT3JTVkdFbGVtZW50KGVsdCBhcyBIVE1MT3JTVkdFbGVtZW50KSxcbiAgICAuLi5leHRyYWN0SFRNTEVsZW1lbnRCYXNlT25seShlbHQpLFxuICB9O1xufVxuXG4vLyBIZWxwZXIgdG8gY29tcG9zZSBwZXItZWxlbWVudCBleHRyYWN0b3JzIHdpdGggdGhlIHNoYXJlZCBiYXNlXG5mdW5jdGlvbiB3aXRoQmFzZTxUIGV4dGVuZHMgSFRNTEVsZW1lbnQ+KFxuICBrZXlzOiByZWFkb25seSAoa2V5b2YgVClbXSxcbiAgY29tcHV0ZWQ/OiBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIChzcmM6IFQpID0+IGFueT4+XG4pIHtcbiAgY29uc3Qgb25seSA9IGNyZWF0ZUV4dHJhY3RvcjxUPigpKGtleXMsIGNvbXB1dGVkIGFzIGFueSk7XG4gIHJldHVybiAoZWx0OiBUKSA9PiAoeyAuLi5leHRyYWN0SFRNTEVsZW1lbnRCYXNlKGVsdCksIC4uLm9ubHkoZWx0KSB9KTtcbn1cblxuY29uc3QgSFRNTF9BTkNIT1JfS0VZUyA9IFtcbiAgXCJoYXNoXCIsXG4gIFwiaG9zdFwiLFxuICBcImhvc3RuYW1lXCIsXG4gIFwiaHJlZlwiLFxuICBcIm9yaWdpblwiLFxuICBcInBhc3N3b3JkXCIsXG4gIFwicGF0aG5hbWVcIixcbiAgXCJwb3J0XCIsXG4gIFwicHJvdG9jb2xcIixcbiAgXCJzZWFyY2hcIixcbiAgXCJ0YXJnZXRcIixcbiAgXCJkb3dubG9hZFwiLFxuICBcInJlbFwiLFxuICBcImhyZWZsYW5nXCIsXG4gIFwidHlwZVwiLFxuICBcInVzZXJuYW1lXCIsXG4gIFwicGluZ1wiLFxuICBcInJlZmVycmVyUG9saWN5XCIsXG4gIFwidGV4dFwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxBbmNob3JFbGVtZW50KVtdO1xuY29uc3QgYW5jaG9yRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTEFuY2hvckVsZW1lbnQ+KEhUTUxfQU5DSE9SX0tFWVMpO1xuXG5jb25zdCBIVE1MX0FSRUFfS0VZUyA9IFtcbiAgXCJhbHRcIixcbiAgXCJjb29yZHNcIixcbiAgXCJkb3dubG9hZFwiLFxuICBcImhhc2hcIixcbiAgXCJob3N0XCIsXG4gIFwiaG9zdG5hbWVcIixcbiAgXCJocmVmXCIsXG4gIFwib3JpZ2luXCIsXG4gIFwicGFzc3dvcmRcIixcbiAgXCJwYXRobmFtZVwiLFxuICBcInBvcnRcIixcbiAgXCJwcm90b2NvbFwiLFxuICBcInJlbFwiLFxuICBcInNlYXJjaFwiLFxuICBcInNoYXBlXCIsXG4gIFwidGFyZ2V0XCIsXG4gIFwidXNlcm5hbWVcIixcbiAgXCJwaW5nXCIsXG4gIFwicmVmZXJyZXJQb2xpY3lcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MQXJlYUVsZW1lbnQpW107XG5jb25zdCBhcmVhRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTEFyZWFFbGVtZW50PihIVE1MX0FSRUFfS0VZUyk7XG5cbmNvbnN0IEhUTUxfTUVESUFfS0VZUyA9IFtcbiAgXCJhdXRvcGxheVwiLFxuICBcImNvbnRyb2xzXCIsXG4gIFwiY3Jvc3NPcmlnaW5cIixcbiAgXCJjdXJyZW50U3JjXCIsXG4gIFwiY3VycmVudFRpbWVcIixcbiAgXCJkZWZhdWx0TXV0ZWRcIixcbiAgXCJkZWZhdWx0UGxheWJhY2tSYXRlXCIsXG4gIFwiZHVyYXRpb25cIixcbiAgXCJlbmRlZFwiLFxuICBcImxvb3BcIixcbiAgXCJtdXRlZFwiLFxuICBcIm5ldHdvcmtTdGF0ZVwiLFxuICBcInBhdXNlZFwiLFxuICBcInBsYXliYWNrUmF0ZVwiLFxuICBcInByZWxvYWRcIixcbiAgXCJyZWFkeVN0YXRlXCIsXG4gIFwic2Vla2luZ1wiLFxuICBcInNyY1wiLFxuICBcInZvbHVtZVwiLFxuICBcInByZXNlcnZlc1BpdGNoXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTE1lZGlhRWxlbWVudClbXTtcbmNvbnN0IG1lZGlhRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTE1lZGlhRWxlbWVudD4oSFRNTF9NRURJQV9LRVlTKTtcblxuY29uc3QgYXVkaW9FeHRyYWN0b3IgPSAoZWx0OiBIVE1MQXVkaW9FbGVtZW50KSA9PiBtZWRpYUV4dHJhY3RvcihlbHQpO1xuXG5jb25zdCBIVE1MX0JVVFRPTl9LRVlTID0gW1xuICBcImRpc2FibGVkXCIsXG4gIFwibmFtZVwiLFxuICBcInR5cGVcIixcbiAgXCJ2YWx1ZVwiLFxuICBcImZvcm1BY3Rpb25cIixcbiAgXCJmb3JtRW5jdHlwZVwiLFxuICBcImZvcm1NZXRob2RcIixcbiAgXCJmb3JtTm9WYWxpZGF0ZVwiLFxuICBcImZvcm1UYXJnZXRcIixcbiAgXCJwb3BvdmVyVGFyZ2V0QWN0aW9uXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTEJ1dHRvbkVsZW1lbnQpW107XG5jb25zdCBidXR0b25FeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MQnV0dG9uRWxlbWVudD4oSFRNTF9CVVRUT05fS0VZUyk7XG5cbmNvbnN0IEhUTUxfREFUQV9LRVlTID0gW1xuICBcInZhbHVlXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTERhdGFFbGVtZW50KVtdO1xuY29uc3QgZGF0YUV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxEYXRhRWxlbWVudD4oSFRNTF9EQVRBX0tFWVMpO1xuXG5jb25zdCBIVE1MX0VNQkVEX0tFWVMgPSBbXG4gIFwiaGVpZ2h0XCIsXG4gIFwic3JjXCIsXG4gIFwidHlwZVwiLFxuICBcIndpZHRoXCIsXG4gIFwiYWxpZ25cIixcbiAgXCJuYW1lXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTEVtYmVkRWxlbWVudClbXTtcbmNvbnN0IGVtYmVkRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTEVtYmVkRWxlbWVudD4oSFRNTF9FTUJFRF9LRVlTKTtcblxuY29uc3QgSFRNTF9GSUVMRFNFVF9LRVlTID0gW1xuICBcImRpc2FibGVkXCIsXG4gIFwibmFtZVwiLFxuICBcInR5cGVcIixcbiAgXCJ2YWxpZGF0aW9uTWVzc2FnZVwiLFxuICBcIndpbGxWYWxpZGF0ZVwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxGaWVsZFNldEVsZW1lbnQpW107XG5jb25zdCBmaWVsZHNldEV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxGaWVsZFNldEVsZW1lbnQ+KEhUTUxfRklFTERTRVRfS0VZUyk7XG5cbmNvbnN0IEhUTUxfRk9STV9LRVlTID0gW1xuICBcImFjY2VwdENoYXJzZXRcIixcbiAgXCJhY3Rpb25cIixcbiAgXCJhdXRvY29tcGxldGVcIixcbiAgXCJlbmNvZGluZ1wiLFxuICBcImVuY3R5cGVcIixcbiAgXCJsZW5ndGhcIixcbiAgXCJtZXRob2RcIixcbiAgXCJuYW1lXCIsXG4gIFwibm9WYWxpZGF0ZVwiLFxuICBcInRhcmdldFwiLFxuICBcInJlbFwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxGb3JtRWxlbWVudClbXTtcbmNvbnN0IGZvcm1FeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MRm9ybUVsZW1lbnQ+KEhUTUxfRk9STV9LRVlTKTtcblxuY29uc3QgSFRNTF9JRlJBTUVfS0VZUyA9IFtcbiAgXCJhbGxvd1wiLFxuICBcImFsbG93RnVsbHNjcmVlblwiLFxuICBcImhlaWdodFwiLFxuICBcIm5hbWVcIixcbiAgXCJyZWZlcnJlclBvbGljeVwiLFxuICBcInNyY1wiLFxuICBcInNyY2RvY1wiLFxuICBcIndpZHRoXCIsXG4gIFwiYWxpZ25cIixcbiAgXCJmcmFtZUJvcmRlclwiLFxuICBcImxvbmdEZXNjXCIsXG4gIFwibWFyZ2luSGVpZ2h0XCIsXG4gIFwibWFyZ2luV2lkdGhcIixcbiAgXCJzY3JvbGxpbmdcIixcbiAgXCJzYW5kYm94XCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTElGcmFtZUVsZW1lbnQpW107XG5jb25zdCBpZnJhbWVFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MSUZyYW1lRWxlbWVudD4oSFRNTF9JRlJBTUVfS0VZUyk7XG5cbmNvbnN0IEhUTUxfSU1BR0VfS0VZUyA9IFtcbiAgXCJhbHRcIixcbiAgXCJjcm9zc09yaWdpblwiLFxuICBcImRlY29kaW5nXCIsXG4gIFwiaGVpZ2h0XCIsXG4gIFwiaXNNYXBcIixcbiAgXCJsb2FkaW5nXCIsXG4gIFwibmF0dXJhbEhlaWdodFwiLFxuICBcIm5hdHVyYWxXaWR0aFwiLFxuICBcInJlZmVycmVyUG9saWN5XCIsXG4gIFwic2l6ZXNcIixcbiAgXCJzcmNcIixcbiAgXCJzcmNzZXRcIixcbiAgXCJ1c2VNYXBcIixcbiAgXCJ3aWR0aFwiLFxuICBcImFsaWduXCIsXG4gIFwiYm9yZGVyXCIsXG4gIFwiY29tcGxldGVcIixcbiAgXCJoc3BhY2VcIixcbiAgXCJsb25nRGVzY1wiLFxuICBcImxvd3NyY1wiLFxuICBcIm5hbWVcIixcbiAgXCJ2c3BhY2VcIixcbiAgXCJ4XCIsXG4gIFwieVwiLFxuICBcImZldGNoUHJpb3JpdHlcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MSW1hZ2VFbGVtZW50KVtdO1xuY29uc3QgaW1hZ2VFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MSW1hZ2VFbGVtZW50PihIVE1MX0lNQUdFX0tFWVMpO1xuXG5jb25zdCBIVE1MX0lOUFVUX0tFWVMgPSBbXG4gIFwiYWNjZXB0XCIsXG4gIFwiYWx0XCIsXG4gIFwiYXV0b2NvbXBsZXRlXCIsXG4gIFwiY2hlY2tlZFwiLFxuICBcImRlZmF1bHRDaGVja2VkXCIsXG4gIFwiZGVmYXVsdFZhbHVlXCIsXG4gIFwiZGlyTmFtZVwiLFxuICBcImRpc2FibGVkXCIsXG4gIFwiaGVpZ2h0XCIsXG4gIFwiaW5kZXRlcm1pbmF0ZVwiLFxuICBcIm1heFwiLFxuICBcIm1heExlbmd0aFwiLFxuICBcIm1pblwiLFxuICBcIm1pbkxlbmd0aFwiLFxuICBcIm11bHRpcGxlXCIsXG4gIFwibmFtZVwiLFxuICBcInBhdHRlcm5cIixcbiAgXCJwbGFjZWhvbGRlclwiLFxuICBcInJlYWRPbmx5XCIsXG4gIFwicmVxdWlyZWRcIixcbiAgXCJzZWxlY3Rpb25EaXJlY3Rpb25cIixcbiAgXCJzZWxlY3Rpb25FbmRcIixcbiAgXCJzZWxlY3Rpb25TdGFydFwiLFxuICBcInNpemVcIixcbiAgXCJzcmNcIixcbiAgXCJzdGVwXCIsXG4gIFwidHlwZVwiLFxuICBcInZhbHVlXCIsXG4gIFwidmFsdWVBc051bWJlclwiLFxuICBcIndpZHRoXCIsXG4gIFwiYWxpZ25cIixcbiAgXCJjYXB0dXJlXCIsXG4gIFwiZm9ybUFjdGlvblwiLFxuICBcImZvcm1FbmN0eXBlXCIsXG4gIFwiZm9ybU1ldGhvZFwiLFxuICBcImZvcm1Ob1ZhbGlkYXRlXCIsXG4gIFwiZm9ybVRhcmdldFwiLFxuICBcInVzZU1hcFwiLFxuICBcInZhbGlkYXRpb25NZXNzYWdlXCIsXG4gIFwid2lsbFZhbGlkYXRlXCIsXG4gIFwicG9wb3ZlclRhcmdldEFjdGlvblwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxJbnB1dEVsZW1lbnQpW107XG5jb25zdCBpbnB1dEV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxJbnB1dEVsZW1lbnQ+KEhUTUxfSU5QVVRfS0VZUyk7XG5cbmNvbnN0IEhUTUxfTEFCRUxfS0VZUyA9IFtcbiAgXCJodG1sRm9yXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTExhYmVsRWxlbWVudClbXTtcbmNvbnN0IGxhYmVsRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTExhYmVsRWxlbWVudD4oSFRNTF9MQUJFTF9LRVlTKTtcblxuY29uc3QgSFRNTF9MSV9LRVlTID0gW1xuICBcInZhbHVlXCIsXG4gIFwidHlwZVwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxMSUVsZW1lbnQpW107XG5jb25zdCBsaUV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxMSUVsZW1lbnQ+KEhUTUxfTElfS0VZUyk7XG5cbmNvbnN0IEhUTUxfTElOS19LRVlTID0gW1xuICBcImFzXCIsXG4gIFwiY3Jvc3NPcmlnaW5cIixcbiAgXCJkaXNhYmxlZFwiLFxuICBcImZldGNoUHJpb3JpdHlcIixcbiAgXCJocmVmXCIsXG4gIFwiaHJlZmxhbmdcIixcbiAgXCJpbWFnZVNpemVzXCIsXG4gIFwiaW1hZ2VTcmNzZXRcIixcbiAgXCJpbnRlZ3JpdHlcIixcbiAgXCJtZWRpYVwiLFxuICBcInJlZmVycmVyUG9saWN5XCIsXG4gIFwicmVsXCIsXG4gIFwidHlwZVwiLFxuICBcImNoYXJzZXRcIixcbiAgXCJyZXZcIixcbiAgXCJ0YXJnZXRcIixcbiAgXCJzaXplc1wiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxMaW5rRWxlbWVudClbXTtcbmNvbnN0IGxpbmtFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MTGlua0VsZW1lbnQ+KEhUTUxfTElOS19LRVlTKTtcblxuY29uc3QgSFRNTF9NQVBfS0VZUyA9IFtcbiAgXCJuYW1lXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTE1hcEVsZW1lbnQpW107XG5jb25zdCBtYXBFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MTWFwRWxlbWVudD4oSFRNTF9NQVBfS0VZUyk7XG5cbmNvbnN0IEhUTUxfTUVURVJfS0VZUyA9IFtcbiAgXCJoaWdoXCIsXG4gIFwibG93XCIsXG4gIFwibWF4XCIsXG4gIFwibWluXCIsXG4gIFwib3B0aW11bVwiLFxuICBcInZhbHVlXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTE1ldGVyRWxlbWVudClbXTtcbmNvbnN0IG1ldGVyRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTE1ldGVyRWxlbWVudD4oSFRNTF9NRVRFUl9LRVlTKTtcblxuY29uc3QgSFRNTF9NT0RfS0VZUyA9IFtcbiAgXCJjaXRlXCIsXG4gIFwiZGF0ZVRpbWVcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MTW9kRWxlbWVudClbXTtcbmNvbnN0IG1vZEV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxNb2RFbGVtZW50PihIVE1MX01PRF9LRVlTKTtcblxuY29uc3QgSFRNTF9PTF9LRVlTID0gW1xuICBcInJldmVyc2VkXCIsXG4gIFwic3RhcnRcIixcbiAgXCJ0eXBlXCIsXG4gIFwiY29tcGFjdFwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxPTGlzdEVsZW1lbnQpW107XG5jb25zdCBvbGlzdEV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxPTGlzdEVsZW1lbnQ+KEhUTUxfT0xfS0VZUyk7XG5cbmNvbnN0IEhUTUxfT0JKRUNUX0tFWVMgPSBbXG4gIFwiZGF0YVwiLFxuICBcImhlaWdodFwiLFxuICBcIm5hbWVcIixcbiAgXCJ0eXBlXCIsXG4gIFwidXNlTWFwXCIsXG4gIFwid2lkdGhcIixcbiAgXCJ2YWxpZGF0aW9uTWVzc2FnZVwiLFxuICBcIndpbGxWYWxpZGF0ZVwiLFxuICBcImFsaWduXCIsXG4gIFwiYXJjaGl2ZVwiLFxuICBcImJvcmRlclwiLFxuICBcImNvZGVcIixcbiAgXCJjb2RlQmFzZVwiLFxuICBcImNvZGVUeXBlXCIsXG4gIFwiZGVjbGFyZVwiLFxuICBcImhzcGFjZVwiLFxuICBcInN0YW5kYnlcIixcbiAgXCJ2c3BhY2VcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MT2JqZWN0RWxlbWVudClbXTtcbmNvbnN0IG9iamVjdEV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxPYmplY3RFbGVtZW50PihIVE1MX09CSkVDVF9LRVlTKTtcblxuY29uc3QgSFRNTF9PUFRHUk9VUF9LRVlTID0gW1xuICBcImRpc2FibGVkXCIsXG4gIFwibGFiZWxcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MT3B0R3JvdXBFbGVtZW50KVtdO1xuY29uc3Qgb3B0Z3JvdXBFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MT3B0R3JvdXBFbGVtZW50PihIVE1MX09QVEdST1VQX0tFWVMpO1xuXG5jb25zdCBIVE1MX09QVElPTl9LRVlTID0gW1xuICBcImRlZmF1bHRTZWxlY3RlZFwiLFxuICBcImRpc2FibGVkXCIsXG4gIFwiaW5kZXhcIixcbiAgXCJsYWJlbFwiLFxuICBcInNlbGVjdGVkXCIsXG4gIFwidGV4dFwiLFxuICBcInZhbHVlXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTE9wdGlvbkVsZW1lbnQpW107XG5jb25zdCBvcHRpb25FeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MT3B0aW9uRWxlbWVudD4oSFRNTF9PUFRJT05fS0VZUyk7XG5cbmNvbnN0IEhUTUxfT1VUUFVUX0tFWVMgPSBbXG4gIFwiZGVmYXVsdFZhbHVlXCIsXG4gIFwibmFtZVwiLFxuICBcInR5cGVcIixcbiAgXCJ2YWx1ZVwiLFxuICBcImh0bWxGb3JcIixcbiAgXCJ2YWxpZGF0aW9uTWVzc2FnZVwiLFxuICBcIndpbGxWYWxpZGF0ZVwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxPdXRwdXRFbGVtZW50KVtdO1xuY29uc3Qgb3V0cHV0RXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTE91dHB1dEVsZW1lbnQ+KEhUTUxfT1VUUFVUX0tFWVMpO1xuXG5jb25zdCBIVE1MX1BST0dSRVNTX0tFWVMgPSBbXG4gIFwibWF4XCIsXG4gIFwicG9zaXRpb25cIixcbiAgXCJ2YWx1ZVwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxQcm9ncmVzc0VsZW1lbnQpW107XG5jb25zdCBwcm9ncmVzc0V4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxQcm9ncmVzc0VsZW1lbnQ+KEhUTUxfUFJPR1JFU1NfS0VZUyk7XG5cbmNvbnN0IEhUTUxfUVVPVEVfS0VZUyA9IFtcbiAgXCJjaXRlXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTFF1b3RlRWxlbWVudClbXTtcbmNvbnN0IHF1b3RlRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTFF1b3RlRWxlbWVudD4oSFRNTF9RVU9URV9LRVlTKTtcblxuY29uc3QgY2l0ZUV4dHJhY3RvciA9IChlbHQ6IEhUTUxFbGVtZW50KSA9PiBleHRyYWN0SFRNTEVsZW1lbnRCYXNlKGVsdCk7XG5cbmNvbnN0IEhUTUxfU0NSSVBUX0tFWVMgPSBbXG4gIFwiYXN5bmNcIixcbiAgXCJjcm9zc09yaWdpblwiLFxuICBcImRlZmVyXCIsXG4gIFwiZmV0Y2hQcmlvcml0eVwiLFxuICBcImludGVncml0eVwiLFxuICBcIm5vTW9kdWxlXCIsXG4gIFwicmVmZXJyZXJQb2xpY3lcIixcbiAgXCJzcmNcIixcbiAgXCJ0ZXh0XCIsXG4gIFwidHlwZVwiLFxuICBcImNoYXJzZXRcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MU2NyaXB0RWxlbWVudClbXTtcbmNvbnN0IGV4dHJhY3RIVE1MU2NyaXB0T25seSA9IGNyZWF0ZUV4dHJhY3RvcjxIVE1MU2NyaXB0RWxlbWVudD4oKShcbiAgSFRNTF9TQ1JJUFRfS0VZUyxcbiAge1xuICAgIGV2ZW50OiAocykgPT4gKHMgYXMgYW55KS5ldmVudCxcbiAgICBodG1sRm9yOiAocykgPT4gKHMgYXMgYW55KS5odG1sRm9yLFxuICB9XG4pO1xuY29uc3Qgc2NyaXB0RXh0cmFjdG9yID0gKGVsdDogSFRNTFNjcmlwdEVsZW1lbnQpID0+ICh7XG4gIC4uLmV4dHJhY3RIVE1MRWxlbWVudEJhc2UoZWx0KSxcbiAgLi4uZXh0cmFjdEhUTUxTY3JpcHRPbmx5KGVsdCksXG59KTtcblxuY29uc3QgSFRNTF9TRUxFQ1RfS0VZUyA9IFtcbiAgXCJhdXRvY29tcGxldGVcIixcbiAgXCJkaXNhYmxlZFwiLFxuICBcImxlbmd0aFwiLFxuICBcIm11bHRpcGxlXCIsXG4gIFwibmFtZVwiLFxuICBcInJlcXVpcmVkXCIsXG4gIFwic2VsZWN0ZWRJbmRleFwiLFxuICBcInNpemVcIixcbiAgXCJ0eXBlXCIsXG4gIFwidmFsdWVcIixcbiAgXCJ2YWxpZGF0aW9uTWVzc2FnZVwiLFxuICBcIndpbGxWYWxpZGF0ZVwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxTZWxlY3RFbGVtZW50KVtdO1xuY29uc3Qgc2VsZWN0RXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTFNlbGVjdEVsZW1lbnQ+KEhUTUxfU0VMRUNUX0tFWVMpO1xuXG5jb25zdCBIVE1MX1NMT1RfS0VZUyA9IFtcbiAgXCJuYW1lXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTFNsb3RFbGVtZW50KVtdO1xuY29uc3Qgc2xvdEV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxTbG90RWxlbWVudD4oSFRNTF9TTE9UX0tFWVMpO1xuXG5jb25zdCBIVE1MX1NPVVJDRV9LRVlTID0gW1xuICBcImhlaWdodFwiLFxuICBcIm1lZGlhXCIsXG4gIFwic2l6ZXNcIixcbiAgXCJzcmNcIixcbiAgXCJzcmNzZXRcIixcbiAgXCJ0eXBlXCIsXG4gIFwid2lkdGhcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MU291cmNlRWxlbWVudClbXTtcbmNvbnN0IHNvdXJjZUV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxTb3VyY2VFbGVtZW50PihIVE1MX1NPVVJDRV9LRVlTKTtcblxuY29uc3QgSFRNTF9UQUJMRV9DQVBUSU9OX0tFWVMgPSBbXG4gIFwiYWxpZ25cIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MVGFibGVDYXB0aW9uRWxlbWVudClbXTtcbmNvbnN0IHRhYmxlQ2FwdGlvbkV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxUYWJsZUNhcHRpb25FbGVtZW50PihcbiAgSFRNTF9UQUJMRV9DQVBUSU9OX0tFWVNcbik7XG5cbmNvbnN0IEhUTUxfVEFCTEVfQ0VMTF9LRVlTID0gW1xuICBcImFiYnJcIixcbiAgXCJjZWxsSW5kZXhcIixcbiAgXCJjb2xTcGFuXCIsXG4gIFwiaGVhZGVyc1wiLFxuICBcInJvd1NwYW5cIixcbiAgXCJzY29wZVwiLFxuICBcImFsaWduXCIsXG4gIFwiYXhpc1wiLFxuICBcImJnQ29sb3JcIixcbiAgXCJjaFwiLFxuICBcImNoT2ZmXCIsXG4gIFwiaGVpZ2h0XCIsXG4gIFwibm9XcmFwXCIsXG4gIFwidkFsaWduXCIsXG4gIFwid2lkdGhcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MVGFibGVDZWxsRWxlbWVudClbXTtcbmNvbnN0IHRhYmxlQ2VsbEV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxUYWJsZUNlbGxFbGVtZW50PihIVE1MX1RBQkxFX0NFTExfS0VZUyk7XG5cbmNvbnN0IEhUTUxfVEFCTEVfQ09MX0tFWVMgPSBbXG4gIFwic3BhblwiLFxuICBcImFsaWduXCIsXG4gIFwiY2hcIixcbiAgXCJjaE9mZlwiLFxuICBcInZBbGlnblwiLFxuICBcIndpZHRoXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTFRhYmxlQ29sRWxlbWVudClbXTtcbmNvbnN0IHRhYmxlQ29sRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTFRhYmxlQ29sRWxlbWVudD4oSFRNTF9UQUJMRV9DT0xfS0VZUyk7XG5cbmNvbnN0IEhUTUxfVEFCTEVfS0VZUyA9IFtcbiAgXCJhbGlnblwiLFxuICBcImJnQ29sb3JcIixcbiAgXCJib3JkZXJcIixcbiAgXCJjZWxsUGFkZGluZ1wiLFxuICBcImNlbGxTcGFjaW5nXCIsXG4gIFwiZnJhbWVcIixcbiAgXCJydWxlc1wiLFxuICBcInN1bW1hcnlcIixcbiAgXCJ3aWR0aFwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxUYWJsZUVsZW1lbnQpW107XG5jb25zdCB0YWJsZUV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxUYWJsZUVsZW1lbnQ+KEhUTUxfVEFCTEVfS0VZUyk7XG5cbmNvbnN0IEhUTUxfVFJfS0VZUyA9IFtcbiAgXCJyb3dJbmRleFwiLFxuICBcInNlY3Rpb25Sb3dJbmRleFwiLFxuICBcImFsaWduXCIsXG4gIFwiYmdDb2xvclwiLFxuICBcImNoXCIsXG4gIFwiY2hPZmZcIixcbiAgXCJ2QWxpZ25cIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MVGFibGVSb3dFbGVtZW50KVtdO1xuY29uc3QgdGFibGVSb3dFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MVGFibGVSb3dFbGVtZW50PihIVE1MX1RSX0tFWVMpO1xuXG5jb25zdCBIVE1MX1RTRUNUSU9OX0tFWVMgPSBbXG4gIFwiYWxpZ25cIixcbiAgXCJjaFwiLFxuICBcImNoT2ZmXCIsXG4gIFwidkFsaWduXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQpW107XG5jb25zdCB0YWJsZVNlY3Rpb25FeHRyYWN0b3IgPVxuICB3aXRoQmFzZTxIVE1MVGFibGVTZWN0aW9uRWxlbWVudD4oSFRNTF9UU0VDVElPTl9LRVlTKTtcblxuY29uc3QgdGVtcGxhdGVFeHRyYWN0b3IgPSAoZWx0OiBIVE1MVGVtcGxhdGVFbGVtZW50KSA9PlxuICBleHRyYWN0SFRNTEVsZW1lbnRCYXNlKGVsdCk7XG5cbmNvbnN0IEhUTUxfVEVYVEFSRUFfS0VZUyA9IFtcbiAgXCJhdXRvY29tcGxldGVcIixcbiAgXCJjb2xzXCIsXG4gIFwiZGVmYXVsdFZhbHVlXCIsXG4gIFwiZGlyTmFtZVwiLFxuICBcImRpc2FibGVkXCIsXG4gIFwibWF4TGVuZ3RoXCIsXG4gIFwibWluTGVuZ3RoXCIsXG4gIFwibmFtZVwiLFxuICBcInBsYWNlaG9sZGVyXCIsXG4gIFwicmVhZE9ubHlcIixcbiAgXCJyZXF1aXJlZFwiLFxuICBcInJvd3NcIixcbiAgXCJzZWxlY3Rpb25EaXJlY3Rpb25cIixcbiAgXCJzZWxlY3Rpb25FbmRcIixcbiAgXCJzZWxlY3Rpb25TdGFydFwiLFxuICBcInZhbHVlXCIsXG4gIFwid3JhcFwiLFxuICBcInRleHRMZW5ndGhcIixcbiAgXCJ2YWxpZGF0aW9uTWVzc2FnZVwiLFxuICBcIndpbGxWYWxpZGF0ZVwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxUZXh0QXJlYUVsZW1lbnQpW107XG5jb25zdCB0ZXh0YXJlYUV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxUZXh0QXJlYUVsZW1lbnQ+KEhUTUxfVEVYVEFSRUFfS0VZUyk7XG5cbmNvbnN0IEhUTUxfVElNRV9LRVlTID0gW1xuICBcImRhdGVUaW1lXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTFRpbWVFbGVtZW50KVtdO1xuY29uc3QgdGltZUV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxUaW1lRWxlbWVudD4oSFRNTF9USU1FX0tFWVMpO1xuXG5jb25zdCBIVE1MX1RSQUNLX0tFWVMgPSBbXG4gIFwiZGVmYXVsdFwiLFxuICBcImtpbmRcIixcbiAgXCJsYWJlbFwiLFxuICBcInJlYWR5U3RhdGVcIixcbiAgXCJzcmNcIixcbiAgXCJzcmNsYW5nXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTFRyYWNrRWxlbWVudClbXTtcbmNvbnN0IHRyYWNrRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTFRyYWNrRWxlbWVudD4oSFRNTF9UUkFDS19LRVlTKTtcblxuY29uc3QgSFRNTF9WSURFT19LRVlTID0gW1xuICBcImhlaWdodFwiLFxuICBcInBvc3RlclwiLFxuICBcInZpZGVvSGVpZ2h0XCIsXG4gIFwidmlkZW9XaWR0aFwiLFxuICBcIndpZHRoXCIsXG4gIFwicGxheXNJbmxpbmVcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MVmlkZW9FbGVtZW50KVtdO1xuY29uc3QgZXh0cmFjdEhUTUxWaWRlb09ubHkgPVxuICBjcmVhdGVFeHRyYWN0b3I8SFRNTFZpZGVvRWxlbWVudD4oKShIVE1MX1ZJREVPX0tFWVMpO1xuY29uc3QgdmlkZW9FeHRyYWN0b3IgPSAoZWx0OiBIVE1MVmlkZW9FbGVtZW50KSA9PiAoe1xuICAuLi5tZWRpYUV4dHJhY3RvcihlbHQpLFxuICAuLi5leHRyYWN0SFRNTFZpZGVvT25seShlbHQpLFxufSk7XG5cbmNvbnN0IEhUTUxfQlJfS0VZUyA9IFtcbiAgXCJjbGVhclwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxCUkVsZW1lbnQpW107XG5jb25zdCBickV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxCUkVsZW1lbnQ+KEhUTUxfQlJfS0VZUyk7XG5cbmNvbnN0IEhUTUxfQkFTRV9LRVlTID0gW1xuICBcImhyZWZcIixcbiAgXCJ0YXJnZXRcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MQmFzZUVsZW1lbnQpW107XG5jb25zdCBiYXNlRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTEJhc2VFbGVtZW50PihIVE1MX0JBU0VfS0VZUyk7XG5cbmNvbnN0IEhUTUxfQk9EWV9LRVlTID0gW1xuICBcImFMaW5rXCIsXG4gIFwiYmFja2dyb3VuZFwiLFxuICBcImJnQ29sb3JcIixcbiAgXCJsaW5rXCIsXG4gIFwidGV4dFwiLFxuICBcInZMaW5rXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTEJvZHlFbGVtZW50KVtdO1xuY29uc3QgYm9keUV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxCb2R5RWxlbWVudD4oSFRNTF9CT0RZX0tFWVMpO1xuXG5jb25zdCBIVE1MX0RMSVNUX0tFWVMgPSBbXG4gIFwiY29tcGFjdFwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxETGlzdEVsZW1lbnQpW107XG5jb25zdCBkbGlzdEV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxETGlzdEVsZW1lbnQ+KEhUTUxfRExJU1RfS0VZUyk7XG5cbmNvbnN0IEhUTUxfREVUQUlMU19LRVlTID0gW1xuICBcIm9wZW5cIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MRGV0YWlsc0VsZW1lbnQpW107XG5jb25zdCBkZXRhaWxzRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTERldGFpbHNFbGVtZW50PihIVE1MX0RFVEFJTFNfS0VZUyk7XG5cbmNvbnN0IEhUTUxfRElBTE9HX0tFWVMgPSBbXG4gIFwib3BlblwiLFxuICBcInJldHVyblZhbHVlXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTERpYWxvZ0VsZW1lbnQpW107XG5jb25zdCBkaWFsb2dFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MRGlhbG9nRWxlbWVudD4oSFRNTF9ESUFMT0dfS0VZUyk7XG5cbmNvbnN0IEhUTUxfRElWX0tFWVMgPSBbXG4gIFwiYWxpZ25cIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MRGl2RWxlbWVudClbXTtcbmNvbnN0IGRpdkV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxEaXZFbGVtZW50PihIVE1MX0RJVl9LRVlTKTtcblxuY29uc3QgaGVhZEV4dHJhY3RvciA9IChlbHQ6IEhUTUxIZWFkRWxlbWVudCkgPT4gZXh0cmFjdEhUTUxFbGVtZW50QmFzZShlbHQpO1xuXG5jb25zdCBIVE1MX0hFQURJTkdfS0VZUyA9IFtcbiAgXCJhbGlnblwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxIZWFkaW5nRWxlbWVudClbXTtcbmNvbnN0IGhlYWRpbmdFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MSGVhZGluZ0VsZW1lbnQ+KEhUTUxfSEVBRElOR19LRVlTKTtcblxuY29uc3QgSFRNTF9IUl9LRVlTID0gW1xuICBcImFsaWduXCIsXG4gIFwiY29sb3JcIixcbiAgXCJub1NoYWRlXCIsXG4gIFwic2l6ZVwiLFxuICBcIndpZHRoXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTEhSRWxlbWVudClbXTtcbmNvbnN0IGhyRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTEhSRWxlbWVudD4oSFRNTF9IUl9LRVlTKTtcblxuY29uc3QgSFRNTF9IVE1MX0tFWVMgPSBbXG4gIFwidmVyc2lvblwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxIdG1sRWxlbWVudClbXTtcbmNvbnN0IGh0bWxFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MSHRtbEVsZW1lbnQ+KEhUTUxfSFRNTF9LRVlTKTtcblxuY29uc3QgbWVudUV4dHJhY3RvciA9IChlbHQ6IEhUTUxNZW51RWxlbWVudCkgPT4gZXh0cmFjdEhUTUxFbGVtZW50QmFzZShlbHQpO1xuXG5jb25zdCBIVE1MX01FVEFfS0VZUyA9IFtcbiAgXCJjb250ZW50XCIsXG4gIFwiaHR0cEVxdWl2XCIsXG4gIFwibmFtZVwiLFxuICBcInNjaGVtZVwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxNZXRhRWxlbWVudClbXTtcbmNvbnN0IG1ldGFFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MTWV0YUVsZW1lbnQ+KEhUTUxfTUVUQV9LRVlTKTtcblxuY29uc3QgSFRNTF9QX0tFWVMgPSBbXG4gIFwiYWxpZ25cIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MUGFyYWdyYXBoRWxlbWVudClbXTtcbmNvbnN0IHBhcmFncmFwaEV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxQYXJhZ3JhcGhFbGVtZW50PihIVE1MX1BfS0VZUyk7XG5cbmNvbnN0IHBpY3R1cmVFeHRyYWN0b3IgPSAoZWx0OiBIVE1MUGljdHVyZUVsZW1lbnQpID0+XG4gIGV4dHJhY3RIVE1MRWxlbWVudEJhc2UoZWx0KTtcblxuY29uc3QgSFRNTF9QUkVfS0VZUyA9IFtcbiAgXCJ3aWR0aFwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxQcmVFbGVtZW50KVtdO1xuY29uc3QgcHJlRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTFByZUVsZW1lbnQ+KEhUTUxfUFJFX0tFWVMpO1xuXG5jb25zdCBzcGFuRXh0cmFjdG9yID0gKGVsdDogSFRNTFNwYW5FbGVtZW50KSA9PiBleHRyYWN0SFRNTEVsZW1lbnRCYXNlKGVsdCk7XG5cbmNvbnN0IEhUTUxfU1RZTEVfS0VZUyA9IFtcbiAgXCJtZWRpYVwiLFxuICBcInR5cGVcIixcbiAgXCJkaXNhYmxlZFwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxTdHlsZUVsZW1lbnQpW107XG5jb25zdCBzdHlsZUV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxTdHlsZUVsZW1lbnQ+KEhUTUxfU1RZTEVfS0VZUyk7XG5cbmNvbnN0IEhUTUxfVElUTEVfS0VZUyA9IFtcbiAgXCJ0ZXh0XCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTFRpdGxlRWxlbWVudClbXTtcbmNvbnN0IHRpdGxlRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTFRpdGxlRWxlbWVudD4oSFRNTF9USVRMRV9LRVlTKTtcblxuY29uc3QgSFRNTF9VTF9LRVlTID0gW1xuICBcImNvbXBhY3RcIixcbiAgXCJ0eXBlXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTFVMaXN0RWxlbWVudClbXTtcbmNvbnN0IHVsaXN0RXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTFVMaXN0RWxlbWVudD4oSFRNTF9VTF9LRVlTKTtcblxuLy8gTWFwIG9mIHRhZ05hbWUgLT4gZXh0cmFjdG9yIChjb25jaXNlLCBsaWtlIGV2ZW50cy50cylcbmNvbnN0IGVsZW1lbnRFeHRyYWN0b3JzOiBSZWNvcmQ8c3RyaW5nLCAoZWx0OiBhbnkpID0+IG9iamVjdD4gPSB7XG4gIEE6IGFuY2hvckV4dHJhY3RvcixcbiAgQVJFQTogYXJlYUV4dHJhY3RvcixcbiAgQVVESU86IGF1ZGlvRXh0cmFjdG9yLFxuICBCQVNFOiBiYXNlRXh0cmFjdG9yLFxuICBCTE9DS1FVT1RFOiBxdW90ZUV4dHJhY3RvcixcbiAgUTogcXVvdGVFeHRyYWN0b3IsXG4gIEJPRFk6IGJvZHlFeHRyYWN0b3IsXG4gIEJSOiBickV4dHJhY3RvcixcbiAgQlVUVE9OOiBidXR0b25FeHRyYWN0b3IsXG4gIENBTlZBUzogZXh0cmFjdEhUTUxFbGVtZW50QmFzZSxcbiAgQ0FQVElPTjogdGFibGVDYXB0aW9uRXh0cmFjdG9yLFxuICBDSVRFOiBjaXRlRXh0cmFjdG9yLFxuICBDT0w6IHRhYmxlQ29sRXh0cmFjdG9yLFxuICBDT0xHUk9VUDogdGFibGVDb2xFeHRyYWN0b3IsXG4gIERBVEE6IGRhdGFFeHRyYWN0b3IsXG4gIERFVEFJTFM6IGRldGFpbHNFeHRyYWN0b3IsXG4gIERJQUxPRzogZGlhbG9nRXh0cmFjdG9yLFxuICBESVY6IGRpdkV4dHJhY3RvcixcbiAgREw6IGRsaXN0RXh0cmFjdG9yLFxuICBFTUJFRDogZW1iZWRFeHRyYWN0b3IsXG4gIEZJRUxEU0VUOiBmaWVsZHNldEV4dHJhY3RvcixcbiAgRk9STTogZm9ybUV4dHJhY3RvcixcbiAgSDE6IGhlYWRpbmdFeHRyYWN0b3IsXG4gIEgyOiBoZWFkaW5nRXh0cmFjdG9yLFxuICBIMzogaGVhZGluZ0V4dHJhY3RvcixcbiAgSDQ6IGhlYWRpbmdFeHRyYWN0b3IsXG4gIEg1OiBoZWFkaW5nRXh0cmFjdG9yLFxuICBINjogaGVhZGluZ0V4dHJhY3RvcixcbiAgSEVBRDogaGVhZEV4dHJhY3RvcixcbiAgSFI6IGhyRXh0cmFjdG9yLFxuICBIVE1MOiBodG1sRXh0cmFjdG9yLFxuICBJRlJBTUU6IGlmcmFtZUV4dHJhY3RvcixcbiAgSU1HOiBpbWFnZUV4dHJhY3RvcixcbiAgSU5QVVQ6IGlucHV0RXh0cmFjdG9yLFxuICBMQUJFTDogbGFiZWxFeHRyYWN0b3IsXG4gIExJOiBsaUV4dHJhY3RvcixcbiAgTElOSzogbGlua0V4dHJhY3RvcixcbiAgTUFQOiBtYXBFeHRyYWN0b3IsXG4gIE1FTlU6IG1lbnVFeHRyYWN0b3IsXG4gIE1FVEE6IG1ldGFFeHRyYWN0b3IsXG4gIE1FVEVSOiBtZXRlckV4dHJhY3RvcixcbiAgSU5TOiBtb2RFeHRyYWN0b3IsXG4gIERFTDogbW9kRXh0cmFjdG9yLFxuICBPQkpFQ1Q6IG9iamVjdEV4dHJhY3RvcixcbiAgT0w6IG9saXN0RXh0cmFjdG9yLFxuICBPUFRHUk9VUDogb3B0Z3JvdXBFeHRyYWN0b3IsXG4gIE9QVElPTjogb3B0aW9uRXh0cmFjdG9yLFxuICBPVVRQVVQ6IG91dHB1dEV4dHJhY3RvcixcbiAgUDogcGFyYWdyYXBoRXh0cmFjdG9yLFxuICBQSUNUVVJFOiBwaWN0dXJlRXh0cmFjdG9yLFxuICBQUkU6IHByZUV4dHJhY3RvcixcbiAgUFJPR1JFU1M6IHByb2dyZXNzRXh0cmFjdG9yLFxuICBTQ1JJUFQ6IHNjcmlwdEV4dHJhY3RvcixcbiAgU0VMRUNUOiBzZWxlY3RFeHRyYWN0b3IsXG4gIFNMT1Q6IHNsb3RFeHRyYWN0b3IsXG4gIFNPVVJDRTogc291cmNlRXh0cmFjdG9yLFxuICBTUEFOOiBzcGFuRXh0cmFjdG9yLFxuICBTVFlMRTogc3R5bGVFeHRyYWN0b3IsXG4gIFRBQkxFOiB0YWJsZUV4dHJhY3RvcixcbiAgVEJPRFk6IHRhYmxlU2VjdGlvbkV4dHJhY3RvcixcbiAgVEhFQUQ6IHRhYmxlU2VjdGlvbkV4dHJhY3RvcixcbiAgVEZPT1Q6IHRhYmxlU2VjdGlvbkV4dHJhY3RvcixcbiAgVEQ6IHRhYmxlQ2VsbEV4dHJhY3RvcixcbiAgVEg6IHRhYmxlQ2VsbEV4dHJhY3RvcixcbiAgVEVNUExBVEU6IHRlbXBsYXRlRXh0cmFjdG9yLFxuICBURVhUQVJFQTogdGV4dGFyZWFFeHRyYWN0b3IsXG4gIFRJTUU6IHRpbWVFeHRyYWN0b3IsXG4gIFRJVExFOiB0aXRsZUV4dHJhY3RvcixcbiAgVFI6IHRhYmxlUm93RXh0cmFjdG9yLFxuICBUUkFDSzogdHJhY2tFeHRyYWN0b3IsXG4gIFVMOiB1bGlzdEV4dHJhY3RvcixcbiAgVklERU86IHZpZGVvRXh0cmFjdG9yLFxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RIVE1MRWxlbWVudChlbHQ6IEhUTUxFbGVtZW50KTogb2JqZWN0IHtcbiAgY29uc3QgdGFnTmFtZSA9IGVsdC50YWdOYW1lLnRvVXBwZXJDYXNlKCk7XG5cbiAgY29uc3QgZXh0cmFjdG9yID0gZWxlbWVudEV4dHJhY3RvcnNbdGFnTmFtZV07XG4gIGlmIChleHRyYWN0b3IpIHtcbiAgICByZXR1cm4gZXh0cmFjdG9yKGVsdCk7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBVbmV4cGVjdGVkIEhUTUwgZWxlbWVudCB0YWc6ICR7ZWx0LnRhZ05hbWV9ICh1cGRhdGUgLndlYi9jdXN0b20vc2VyaWFsaXplLnRzKWBcbiAgKTtcbn1cbiIsCiAgICAiLyogPT09IElNUE9SVEFOVCA9PT0gKi9cblxuaW1wb3J0IHsgZXh0cmFjdEhUTUxFbGVtZW50IH0gZnJvbSBcIi4vZWxlbWVudHNcIjtcbmltcG9ydCB7IGNyZWF0ZUV4dHJhY3RvciB9IGZyb20gXCIuL2V4dHJhY3RvclwiO1xuXG4vLyBSZXVzYWJsZSBjb21wdXRlZCBtYXBwZXJzIChoZWxwcyBidW5kbGVycy9taW5pZmllcnMgc2hhcmUgcmVmZXJlbmNlcylcbmNvbnN0IG1hcFRhcmdldCA9IChlOiB7IHRhcmdldDogRXZlbnRUYXJnZXQgfCBudWxsIH0pID0+XG4gIGV4dHJhY3RIVE1MRWxlbWVudChlLnRhcmdldCBhcyBIVE1MRWxlbWVudCk7XG5jb25zdCBtYXBSZWxhdGVkID0gKGU6IHsgcmVsYXRlZFRhcmdldDogRXZlbnRUYXJnZXQgfCBudWxsIH0pID0+XG4gIGUucmVsYXRlZFRhcmdldCA/IGV4dHJhY3RIVE1MRWxlbWVudChlLnJlbGF0ZWRUYXJnZXQgYXMgSFRNTEVsZW1lbnQpIDogbnVsbDtcblxuZnVuY3Rpb24gbWFrZUV4dHJhY3RvcjxLIGV4dGVuZHMgcmVhZG9ubHkgYW55W10+KFxuICBrZXlzOiBLLFxuICBjb21wdXRlZD86IFJlY29yZDxzdHJpbmcsIChldnQ6IGFueSkgPT4gYW55PlxuKSB7XG4gIHJldHVybiBjcmVhdGVFeHRyYWN0b3I8YW55PigpKFxuICAgIGtleXMgYXMgYW55LFxuICAgIHtcbiAgICAgIHRhcmdldDogbWFwVGFyZ2V0LFxuICAgICAgLi4uKGNvbXB1dGVkIHx8IHt9KSxcbiAgICB9IGFzIGFueVxuICApO1xufVxuXG5jb25zdCBTWU5USEVUSUNfS0VZUyA9IFtcbiAgXCJ0YXJnZXRcIixcbiAgXCJidWJibGVzXCIsXG4gIFwiY2FuY2VsYWJsZVwiLFxuICBcImRlZmF1bHRQcmV2ZW50ZWRcIixcbiAgXCJldmVudFBoYXNlXCIsXG4gIFwiaXNUcnVzdGVkXCIsXG4gIFwidGltZVN0YW1wXCIsXG4gIFwidHlwZVwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIFJlYWN0LlN5bnRoZXRpY0V2ZW50KVtdO1xuXG5jb25zdCBVSV9LRVlTID0gW1xuICAuLi5TWU5USEVUSUNfS0VZUyxcbiAgXCJkZXRhaWxcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBSZWFjdC5VSUV2ZW50KVtdO1xuXG5jb25zdCBNT1VTRV9LRVlTID0gW1xuICAuLi5VSV9LRVlTLFxuICBcImFsdEtleVwiLFxuICBcImJ1dHRvblwiLFxuICBcImJ1dHRvbnNcIixcbiAgXCJjbGllbnRYXCIsXG4gIFwiY2xpZW50WVwiLFxuICBcImN0cmxLZXlcIixcbiAgXCJtZXRhS2V5XCIsXG4gIFwibW92ZW1lbnRYXCIsXG4gIFwibW92ZW1lbnRZXCIsXG4gIFwicGFnZVhcIixcbiAgXCJwYWdlWVwiLFxuICBcInNjcmVlblhcIixcbiAgXCJzY3JlZW5ZXCIsXG4gIFwic2hpZnRLZXlcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBSZWFjdC5Nb3VzZUV2ZW50KVtdO1xuXG5jb25zdCBQT0lOVEVSX0tFWVMgPSBbXG4gIC4uLk1PVVNFX0tFWVMsXG4gIFwicG9pbnRlcklkXCIsXG4gIFwicHJlc3N1cmVcIixcbiAgXCJ0YW5nZW50aWFsUHJlc3N1cmVcIixcbiAgXCJ0aWx0WFwiLFxuICBcInRpbHRZXCIsXG4gIFwidHdpc3RcIixcbiAgXCJ3aWR0aFwiLFxuICBcImhlaWdodFwiLFxuICBcInBvaW50ZXJUeXBlXCIsXG4gIFwiaXNQcmltYXJ5XCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgUmVhY3QuUG9pbnRlckV2ZW50KVtdO1xuXG5jb25zdCBzeW50aGV0aWNFeHRyYWN0b3IgPSBtYWtlRXh0cmFjdG9yKFNZTlRIRVRJQ19LRVlTKTtcblxuY29uc3QgdWlFeHRyYWN0b3IgPSBtYWtlRXh0cmFjdG9yKFVJX0tFWVMpO1xuXG5jb25zdCBtb3VzZUV4dHJhY3RvciA9IG1ha2VFeHRyYWN0b3IoTU9VU0VfS0VZUywgeyByZWxhdGVkVGFyZ2V0OiBtYXBSZWxhdGVkIH0pO1xuXG5jb25zdCBjbGlwYm9hcmRFeHRyYWN0b3IgPSBtYWtlRXh0cmFjdG9yKFNZTlRIRVRJQ19LRVlTLCB7XG4gIGNsaXBib2FyZERhdGE6IChlKSA9PiBleHRyYWN0RGF0YVRyYW5zZmVyKGUuY2xpcGJvYXJkRGF0YSksXG59KTtcblxuY29uc3QgY29tcG9zaXRpb25FeHRyYWN0b3IgPSBtYWtlRXh0cmFjdG9yKFtcbiAgLi4uU1lOVEhFVElDX0tFWVMsXG4gIFwiZGF0YVwiLFxuXSBhcyBjb25zdCk7XG5cbmNvbnN0IGRyYWdFeHRyYWN0b3IgPSBtYWtlRXh0cmFjdG9yKE1PVVNFX0tFWVMsIHtcbiAgcmVsYXRlZFRhcmdldDogbWFwUmVsYXRlZCxcbiAgZGF0YVRyYW5zZmVyOiAoZSkgPT4gZXh0cmFjdERhdGFUcmFuc2ZlcihlLmRhdGFUcmFuc2ZlciksXG59KTtcblxuY29uc3QgcG9pbnRlckV4dHJhY3RvciA9IG1ha2VFeHRyYWN0b3IoUE9JTlRFUl9LRVlTLCB7XG4gIHJlbGF0ZWRUYXJnZXQ6IG1hcFJlbGF0ZWQsXG59KTtcblxuY29uc3QgZm9jdXNFeHRyYWN0b3IgPSBtYWtlRXh0cmFjdG9yKFNZTlRIRVRJQ19LRVlTLCB7XG4gIHJlbGF0ZWRUYXJnZXQ6IG1hcFJlbGF0ZWQsXG59KTtcblxuY29uc3QgZm9ybUV4dHJhY3RvciA9IG1ha2VFeHRyYWN0b3IoU1lOVEhFVElDX0tFWVMpO1xuXG5jb25zdCBpbnZhbGlkRXh0cmFjdG9yID0gbWFrZUV4dHJhY3RvcihTWU5USEVUSUNfS0VZUyk7XG5cbmNvbnN0IGNoYW5nZUV4dHJhY3RvciA9IG1ha2VFeHRyYWN0b3IoU1lOVEhFVElDX0tFWVMpO1xuXG5jb25zdCBrZXlib2FyZEV4dHJhY3RvciA9IG1ha2VFeHRyYWN0b3IoW1xuICAuLi5VSV9LRVlTLFxuICBcImFsdEtleVwiLFxuICBcImN0cmxLZXlcIixcbiAgXCJjb2RlXCIsXG4gIFwia2V5XCIsXG4gIFwibG9jYWxlXCIsXG4gIFwibG9jYXRpb25cIixcbiAgXCJtZXRhS2V5XCIsXG4gIFwicmVwZWF0XCIsXG4gIFwic2hpZnRLZXlcIixcbl0gYXMgY29uc3QpO1xuXG5jb25zdCB0b3VjaEV4dHJhY3RvciA9IG1ha2VFeHRyYWN0b3IoXG4gIFtcbiAgICAuLi5VSV9LRVlTLFxuICAgIFwiYWx0S2V5XCIsXG4gICAgXCJjdHJsS2V5XCIsXG4gICAgXCJtZXRhS2V5XCIsXG4gICAgXCJzaGlmdEtleVwiLFxuICAgIFwiY2hhbmdlZFRvdWNoZXNcIixcbiAgICBcInRhcmdldFRvdWNoZXNcIixcbiAgICBcInRvdWNoZXNcIixcbiAgXSBhcyBjb25zdCxcbiAge1xuICAgIGNoYW5nZWRUb3VjaGVzOiAoZSkgPT4gbWFwVG91Y2hMaXN0KGUuY2hhbmdlZFRvdWNoZXMpLFxuICAgIHRhcmdldFRvdWNoZXM6IChlKSA9PiBtYXBUb3VjaExpc3QoZS50YXJnZXRUb3VjaGVzKSxcbiAgICB0b3VjaGVzOiAoZSkgPT4gbWFwVG91Y2hMaXN0KGUudG91Y2hlcyksXG4gIH1cbik7XG5cbmNvbnN0IHdoZWVsRXh0cmFjdG9yID0gbWFrZUV4dHJhY3RvcihcbiAgWy4uLk1PVVNFX0tFWVMsIFwiZGVsdGFNb2RlXCIsIFwiZGVsdGFYXCIsIFwiZGVsdGFZXCIsIFwiZGVsdGFaXCJdIGFzIGNvbnN0LFxuICB7XG4gICAgcmVsYXRlZFRhcmdldDogbWFwUmVsYXRlZCxcbiAgfVxuKTtcblxuY29uc3QgYW5pbWF0aW9uRXh0cmFjdG9yID0gbWFrZUV4dHJhY3RvcihbXG4gIC4uLlNZTlRIRVRJQ19LRVlTLFxuICBcImFuaW1hdGlvbk5hbWVcIixcbiAgXCJlbGFwc2VkVGltZVwiLFxuICBcInBzZXVkb0VsZW1lbnRcIixcbl0gYXMgY29uc3QpO1xuXG5jb25zdCB0b2dnbGVFeHRyYWN0b3IgPSBtYWtlRXh0cmFjdG9yKFtcbiAgLi4uU1lOVEhFVElDX0tFWVMsXG4gIFwib2xkU3RhdGVcIixcbiAgXCJuZXdTdGF0ZVwiLFxuXSBhcyBjb25zdCk7XG5cbmNvbnN0IHRyYW5zaXRpb25FeHRyYWN0b3IgPSBtYWtlRXh0cmFjdG9yKFtcbiAgLi4uU1lOVEhFVElDX0tFWVMsXG4gIFwiZWxhcHNlZFRpbWVcIixcbiAgXCJwcm9wZXJ0eU5hbWVcIixcbiAgXCJwc2V1ZG9FbGVtZW50XCIsXG5dIGFzIGNvbnN0KTtcblxuZnVuY3Rpb24gbWFwVG91Y2hMaXN0KGxpc3Q6IGFueSk6IGFueVtdIHtcbiAgcmV0dXJuIEFycmF5LmZyb20obGlzdCBhcyBBcnJheUxpa2U8YW55PikubWFwKCh0b3VjaDogYW55KSA9PiAoe1xuICAgIHRhcmdldDogZXh0cmFjdEhUTUxFbGVtZW50KHRvdWNoLnRhcmdldCBhcyBIVE1MRWxlbWVudCksXG4gICAgaWRlbnRpZmllcjogdG91Y2guaWRlbnRpZmllcixcbiAgICBzY3JlZW5YOiB0b3VjaC5zY3JlZW5YLFxuICAgIHNjcmVlblk6IHRvdWNoLnNjcmVlblksXG4gICAgY2xpZW50WDogdG91Y2guY2xpZW50WCxcbiAgICBjbGllbnRZOiB0b3VjaC5jbGllbnRZLFxuICAgIHBhZ2VYOiB0b3VjaC5wYWdlWCxcbiAgICBwYWdlWTogdG91Y2gucGFnZVksXG4gIH0pKTtcbn1cblxuLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGV4dHJhY3QgRGF0YVRyYW5zZmVyIHByb3BlcnRpZXNcbmZ1bmN0aW9uIGV4dHJhY3REYXRhVHJhbnNmZXIoZHQ6IERhdGFUcmFuc2ZlciB8IG51bGwpOiBvYmplY3QgfCBudWxsIHtcbiAgaWYgKCFkdCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IGl0ZW1zID0gW107XG4gIGlmIChkdC5pdGVtcykge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZHQuaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGl0ZW0gPSBkdC5pdGVtc1tpXSE7XG4gICAgICBpdGVtcy5wdXNoKHtcbiAgICAgICAga2luZDogaXRlbS5raW5kLFxuICAgICAgICB0eXBlOiBpdGVtLnR5cGUsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBkcm9wX2VmZmVjdDogZHQuZHJvcEVmZmVjdCxcbiAgICBlZmZlY3RfYWxsb3dlZDogZHQuZWZmZWN0QWxsb3dlZCxcbiAgICBpdGVtczogaXRlbXMsXG4gICAgdHlwZXM6IEFycmF5LmZyb20oZHQudHlwZXMgfHwgW10pLFxuICB9O1xufVxuXG5jb25zdCBldmVudEV4dHJhY3Rvck1hcDogeyBba2V5OiBzdHJpbmddOiAoZXZ0OiBhbnkpID0+IG9iamVjdCB9ID0ge307XG5cbmZ1bmN0aW9uIGFkZChtYXA6IFJlY29yZDxzdHJpbmcsIGFueT4sIG5hbWVzOiByZWFkb25seSBzdHJpbmdbXSwgZm46IGFueSkge1xuICBmb3IgKGNvbnN0IG4gb2YgbmFtZXMpIG1hcFtuXSA9IGZuO1xufVxuXG5hZGQoXG4gIGV2ZW50RXh0cmFjdG9yTWFwLFxuICBbXG4gICAgXCJwb2ludGVyZG93blwiLFxuICAgIFwicG9pbnRlcm1vdmVcIixcbiAgICBcInBvaW50ZXJ1cFwiLFxuICAgIFwicG9pbnRlcmNhbmNlbFwiLFxuICAgIFwiZ290cG9pbnRlcmNhcHR1cmVcIixcbiAgICBcImxvc3Rwb2ludGVyY2FwdHVyZVwiLFxuICAgIFwicG9pbnRlcmVudGVyXCIsXG4gICAgXCJwb2ludGVybGVhdmVcIixcbiAgICBcInBvaW50ZXJvdmVyXCIsXG4gICAgXCJwb2ludGVyb3V0XCIsXG4gIF0sXG4gIHBvaW50ZXJFeHRyYWN0b3Jcbik7XG5cbmFkZChcbiAgZXZlbnRFeHRyYWN0b3JNYXAsXG4gIFtcbiAgICBcImNsaWNrXCIsXG4gICAgXCJjb250ZXh0bWVudVwiLFxuICAgIFwiZGJsY2xpY2tcIixcbiAgICBcIm1vdXNlZG93blwiLFxuICAgIFwibW91c2VlbnRlclwiLFxuICAgIFwibW91c2VsZWF2ZVwiLFxuICAgIFwibW91c2Vtb3ZlXCIsXG4gICAgXCJtb3VzZW91dFwiLFxuICAgIFwibW91c2VvdmVyXCIsXG4gICAgXCJtb3VzZXVwXCIsXG4gIF0sXG4gIG1vdXNlRXh0cmFjdG9yXG4pO1xuXG5hZGQoXG4gIGV2ZW50RXh0cmFjdG9yTWFwLFxuICBbXG4gICAgXCJkcmFnXCIsXG4gICAgXCJkcmFnZW5kXCIsXG4gICAgXCJkcmFnZW50ZXJcIixcbiAgICBcImRyYWdleGl0XCIsXG4gICAgXCJkcmFnbGVhdmVcIixcbiAgICBcImRyYWdvdmVyXCIsXG4gICAgXCJkcmFnc3RhcnRcIixcbiAgICBcImRyb3BcIixcbiAgXSxcbiAgZHJhZ0V4dHJhY3RvclxuKTtcblxuYWRkKGV2ZW50RXh0cmFjdG9yTWFwLCBbXCJrZXlkb3duXCIsIFwia2V5cHJlc3NcIiwgXCJrZXl1cFwiXSwga2V5Ym9hcmRFeHRyYWN0b3IpO1xuYWRkKGV2ZW50RXh0cmFjdG9yTWFwLCBbXCJmb2N1c1wiLCBcImJsdXJcIl0sIGZvY3VzRXh0cmFjdG9yKTtcbmFkZChldmVudEV4dHJhY3Rvck1hcCwgW1wiY2hhbmdlXCIsIFwiaW5wdXRcIl0sIGNoYW5nZUV4dHJhY3Rvcik7XG5hZGQoZXZlbnRFeHRyYWN0b3JNYXAsIFtcImludmFsaWRcIl0sIGludmFsaWRFeHRyYWN0b3IpO1xuYWRkKGV2ZW50RXh0cmFjdG9yTWFwLCBbXCJyZXNldFwiLCBcInN1Ym1pdFwiXSwgZm9ybUV4dHJhY3Rvcik7XG5hZGQoZXZlbnRFeHRyYWN0b3JNYXAsIFtcImNvcHlcIiwgXCJjdXRcIiwgXCJwYXN0ZVwiXSwgY2xpcGJvYXJkRXh0cmFjdG9yKTtcbmFkZChcbiAgZXZlbnRFeHRyYWN0b3JNYXAsXG4gIFtcImNvbXBvc2l0aW9uZW5kXCIsIFwiY29tcG9zaXRpb25zdGFydFwiLCBcImNvbXBvc2l0aW9udXBkYXRlXCJdLFxuICBjb21wb3NpdGlvbkV4dHJhY3RvclxuKTtcbmFkZChcbiAgZXZlbnRFeHRyYWN0b3JNYXAsXG4gIFtcInRvdWNoY2FuY2VsXCIsIFwidG91Y2hlbmRcIiwgXCJ0b3VjaG1vdmVcIiwgXCJ0b3VjaHN0YXJ0XCJdLFxuICB0b3VjaEV4dHJhY3RvclxuKTtcbmFkZChldmVudEV4dHJhY3Rvck1hcCwgW1wic2Nyb2xsXCJdLCB1aUV4dHJhY3Rvcik7XG5hZGQoZXZlbnRFeHRyYWN0b3JNYXAsIFtcIndoZWVsXCJdLCB3aGVlbEV4dHJhY3Rvcik7XG5hZGQoXG4gIGV2ZW50RXh0cmFjdG9yTWFwLFxuICBbXCJhbmltYXRpb25zdGFydFwiLCBcImFuaW1hdGlvbmVuZFwiLCBcImFuaW1hdGlvbml0ZXJhdGlvblwiXSxcbiAgYW5pbWF0aW9uRXh0cmFjdG9yXG4pO1xuYWRkKGV2ZW50RXh0cmFjdG9yTWFwLCBbXCJ0cmFuc2l0aW9uZW5kXCJdLCB0cmFuc2l0aW9uRXh0cmFjdG9yKTtcbmFkZChldmVudEV4dHJhY3Rvck1hcCwgW1widG9nZ2xlXCJdLCB0b2dnbGVFeHRyYWN0b3IpO1xuXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdEV2ZW50KHZhbHVlOiBhbnkpOiBhbnkge1xuICAvLyBEdWNrLXR5cGluZyBmb3IgUmVhY3QncyBTeW50aGV0aWNFdmVudC5cbiAgLy8gV2UgY2hlY2sgZm9yIHByb3BlcnRpZXMgdGhhdCBhcmUgdW5pcXVlIHRvIHN5bnRoZXRpYyBldmVudHMuXG4gIGlmIChcbiAgICB2YWx1ZSAmJlxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgIFwibmF0aXZlRXZlbnRcIiBpbiB2YWx1ZSAmJlxuICAgIHR5cGVvZiB2YWx1ZS5pc0RlZmF1bHRQcmV2ZW50ZWQgPT09IFwiZnVuY3Rpb25cIlxuICApIHtcbiAgICBjb25zdCBldnQgPSB2YWx1ZSBhcyBSZWFjdC5TeW50aGV0aWNFdmVudDtcbiAgICAvLyBUaGUgYHR5cGVgIHByb3BlcnR5IGlzIGNydWNpYWwgZm9yIHRoZSBsb29rdXAuXG4gICAgaWYgKHR5cGVvZiBldnQudHlwZSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIGNvbnN0IGV4dHJhY3RvciA9IGV2ZW50RXh0cmFjdG9yTWFwW2V2dC50eXBlLnRvTG93ZXJDYXNlKCldO1xuICAgIGlmIChleHRyYWN0b3IpIHtcbiAgICAgIHJldHVybiBleHRyYWN0b3IoZXZ0KTtcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayBmb3IgdW5rbm93biBldmVudCB0eXBlczogbWluaW1hbCBzeW50aGV0aWMgZXh0cmFjdG9yXG4gICAgcmV0dXJuIHN5bnRoZXRpY0V4dHJhY3RvcihldnQpO1xuICB9XG5cbiAgLy8gSWYgaXQncyBub3QgYSBkdWNrLXR5cGVkIGV2ZW50LCByZXR1cm4gaXQgYXMgaXMuXG4gIHJldHVybiB2YWx1ZTtcbn1cbiIsCiAgICAiLyogLS0gRGF0YSBmb3JtYXQgLS0gIFxuU2VyaWFsaXplZCBkYXRhIGNvbnNpc3RzIG9mOlxuMSkgQSBmaXJzdCBhcnJheSBjb250YWluaW5nIG9uZSBlbnRyeSBwZXIgZXh0ZW5zaW9uIHByb3ZpZGVkIGR1cmluZ1xuICAgc2VyaWFsaXphdGlvbi4gRm9yIGVhY2ggZXh0ZW5zaW9uLCBhbiBhcnJheSBvZiBpbmRpY2VzIGlzIHByb3ZpZGVkLiBUaGVzZVxuICAgaW5kaWNlcyByZWZlciB0byB0aGUgZW50cmllcyBpbiB0aGUgc2Vjb25kIGFycmF5IHRoYXQgd2VyZSBzZXJpYWxpemVkIHVzaW5nXG4gICB0aGlzIGV4dGVuc2lvbi4gVGhlc2UgZW50cmllcyBzaG91bGQgYmUgZGVzZXJpYWxpemVkIGJ5IHRoZWlyIGNvcnJlc3BvbmRpbmdcbiAgIGV4dGVuc2lvbi4gXG4yKSBBIHNlY29uZCBhcnJheSBjb250YWluaW5nIHRoZSBkYXRhIGVudHJpZXMuIEVhY2ggZW50cnkgY2FuIGJlOlxuICAtIEEgcHJpbWl0aXZlIChudW1iZXIsIHN0cmluZywgYm9vbGVhbikuXG4gIC0gQSByZWNvcmQgd2hvc2Uga2V5cyBhcmUgc3RyaW5ncyBhbmQgd2hvc2UgdmFsdWVzIGFyZSBpbmRpY2VzIGludG8gdGhlIGRhdGFcbiAgICBlbnRyaWVzIGFycmF5LlxuICAtIEFuIGFycmF5IHdob3NlIHZhbHVlcyBhcmUgaW5kaWNlcyBpbnRvIHRoZSBkYXRhIGVudHJpZXMgYXJyYXkuXG5cbkV4dGVuc2lvbnMgbmVlZCB0byBlbmNvZGUgdGhlaXIgaW5wdXRzIGludG8gcGxhaW4gSlNPTi4gVGhlIGVudHJpZXMgbWFya2VkIGZvclxuZGVjb2RpbmcgYnkgYW4gZXh0ZW5zaW9uIHdpbGwgZmlyc3QgcmVjb25zdHJ1Y3QgdGhlIHBsYWluIEpTT04gZnJvbSB0aGVcbmNvcnJlc3BvbmRpbmcgZGF0YSBlbnRyeSwgYmVmb3JlIGhhbmRpbmcgaXQgb2ZmIHRvIHRoZSBleHRlbnNpb24uXG5cblRoaXMgZm9ybWF0IGlzIHNpbWlsYXIgdG8gdGhlIG9uZSBhZG9wdGVkIGJ5IEZsYXR0ZWQsIGJ1dCB3aXRoIGEgZGlmZmVyZW50XG5leHRlbnNpb24gc3lzdGVtLlxuKi9cbmV4cG9ydCB0eXBlIFByaW1pdGl2ZSA9IG51bWJlciB8IHN0cmluZyB8IGJvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkO1xuZXhwb3J0IHR5cGUgRGF0YUVudHJ5ID0gUHJpbWl0aXZlIHwgUmVjb3JkPHN0cmluZywgbnVtYmVyPiB8IEFycmF5PG51bWJlcj47XG5leHBvcnQgdHlwZSBTZXJpYWxpemVkID0gW0FycmF5PEFycmF5PG51bWJlcj4+LCBBcnJheTxEYXRhRW50cnk+XTtcblxuZXhwb3J0IHR5cGUgRXh0ZW5zaW9uPFQgPSB1bmtub3duPiA9IHtcbiAgY2hlY2sodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBUO1xuICBlbmNvZGUodmFsdWU6IFQsIGVuY29kZTogKHZhbHVlOiB1bmtub3duKSA9PiBudW1iZXIpOiBEYXRhRW50cnk7XG4gIGRlY29kZShlbnRyeTogRGF0YUVudHJ5LCBkZWNvZGU6IChpbmRleDogbnVtYmVyKSA9PiB1bmtub3duKTogVDtcbn07XG5cbnR5cGUgRXh0ZW5zaW9uVHlwZTxFIGV4dGVuZHMgRXh0ZW5zaW9uPHVua25vd24+PiA9XG4gIEUgZXh0ZW5kcyBFeHRlbnNpb248aW5mZXIgVD4gPyBUIDogbmV2ZXI7XG50eXBlIEV4dGVuc2lvblR5cGVzPEV4dGVuc2lvbnMgZXh0ZW5kcyBBcnJheTxFeHRlbnNpb248dW5rbm93bj4+PiA9XG4gIEV4dGVuc2lvblR5cGU8RXh0ZW5zaW9uc1tudW1iZXJdPjtcblxuZXhwb3J0IHR5cGUgUHJpbWl0aXZlV2l0aEV4dDxFeHQgZXh0ZW5kcyB1bmtub3duID0gbmV2ZXI+ID0gUHJpbWl0aXZlIHwgRXh0O1xuZXhwb3J0IHR5cGUgU2VyaWFsaXphYmxlPEV4dCBleHRlbmRzIHVua25vd24gPSBuZXZlcj4gPVxuICB8IFByaW1pdGl2ZVdpdGhFeHQ8RXh0PlxuICB8IEFycmF5PFByaW1pdGl2ZVdpdGhFeHQ8RXh0Pj5cbiAgfCBSZWNvcmQ8c3RyaW5nLCBQcmltaXRpdmVXaXRoRXh0PEV4dD4+O1xuXG5leHBvcnQgdHlwZSBTZXJpYWxpemFibGVXaXRoPEV4dGVuc2lvbnMgZXh0ZW5kcyBBcnJheTxFeHRlbnNpb248YW55Pj4+ID1cbiAgU2VyaWFsaXphYmxlPEV4dGVuc2lvblR5cGVzPEV4dGVuc2lvbnM+PjtcblxuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZTxFeHRlbnNpb25zIGV4dGVuZHMgQXJyYXk8RXh0ZW5zaW9uPj4oXG4gIGRhdGE6IFNlcmlhbGl6YWJsZVdpdGg8RXh0ZW5zaW9ucz4sXG4gIGV4dGVuc2lvbnM6IEV4dGVuc2lvbnNcbik6IFNlcmlhbGl6ZWQge1xuICBjb25zdCBlbnRyaWVzOiBBcnJheTxEYXRhRW50cnk+ID0gW107XG4gIGNvbnN0IGV4dElkeExpc3RzOiBBcnJheTxBcnJheTxudW1iZXI+PiA9IGV4dGVuc2lvbnMubWFwKCgpID0+IFtdKTtcblxuICBjb25zdCBzZWVuID0gbmV3IE1hcDxhbnksIG51bWJlcj4oKTtcblxuICBjb25zdCBhZGQgPSAodmFsdWU6IGFueSk6IG51bWJlciA9PiB7XG4gICAgY29uc3QgY2FjaGVkID0gc2Vlbi5nZXQodmFsdWUpO1xuICAgIGlmIChjYWNoZWQgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGNhY2hlZDtcbiAgICAvLyBQcmltaXRpdmVzIChhcyBkZWZpbmVkIGJ5IHRoaXMgZm9ybWF0KSBhcmUgc3RvcmVkIGRpcmVjdGx5XG4gICAgaWYgKFxuICAgICAgdmFsdWUgPT0gbnVsbCB8fCAvLyBjYXRjaCBib3RoIG51bGwgYW5kIHVuZGVmaW5lZFxuICAgICAgdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiIHx8XG4gICAgICB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHxcbiAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IGlkeCA9IGVudHJpZXMubGVuZ3RoO1xuICAgICAgZW50cmllcy5wdXNoKHZhbHVlIGFzIFByaW1pdGl2ZSk7XG4gICAgICBzZWVuLnNldCh2YWx1ZSwgaWR4KTtcbiAgICAgIHJldHVybiBpZHg7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGV4dGVuc2lvbi1lbmNvZGVkIHZhbHVlc1xuICAgIGZvciAobGV0IGUgPSAwOyBlIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGUrKykge1xuICAgICAgY29uc3QgZXh0ID0gZXh0ZW5zaW9uc1tlXSE7XG4gICAgICBpZiAoZXh0LmNoZWNrKHZhbHVlKSkge1xuICAgICAgICBpZiAoc2Vlbi5oYXModmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIHNlZW4uZ2V0KHZhbHVlKSE7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaWR4ID0gZW50cmllcy5sZW5ndGg7XG4gICAgICAgIC8vIHBsYWNlaG9sZGVyIHRvIHN1cHBvcnQgY3ljbGVzIHdoaWxlIGVuY29kaW5nIGNoaWxkcmVuXG4gICAgICAgIGVudHJpZXMucHVzaChbXSk7XG4gICAgICAgIHNlZW4uc2V0KHZhbHVlLCBpZHgpO1xuICAgICAgICBjb25zdCBlbnRyeSA9IGV4dC5lbmNvZGUodmFsdWUgYXMgYW55LCAodjogdW5rbm93bikgPT4gYWRkKHYpKTtcbiAgICAgICAgZW50cmllc1tpZHhdID0gZW50cnkgYXMgRGF0YUVudHJ5O1xuICAgICAgICBleHRJZHhMaXN0c1tlXSEucHVzaChpZHgpO1xuICAgICAgICByZXR1cm4gaWR4O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIE5vbi1wcmltaXRpdmUsIG5vbi1leHRlbnNpb24gdmFsdWVzIG11c3QgYmUgYXJyYXlzIG9yIHBsYWluIG9iamVjdHNcbiAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBpZiAoc2Vlbi5oYXModmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBzZWVuLmdldCh2YWx1ZSkhO1xuICAgICAgfVxuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgY29uc3QgaWR4ID0gZW50cmllcy5sZW5ndGg7XG4gICAgICAgIC8vIHBsYWNlaG9sZGVyIGZpcnN0IHRvIGVzdGFibGlzaCBpbmRleCBmb3IgY3ljbGVzXG4gICAgICAgIGVudHJpZXMucHVzaChbXSk7XG4gICAgICAgIHNlZW4uc2V0KHZhbHVlLCBpZHgpO1xuICAgICAgICBjb25zdCBjaGlsZEluZGljZXM6IG51bWJlcltdID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjaGlsZEluZGljZXMucHVzaChhZGQodmFsdWVbaV0pKTtcbiAgICAgICAgfVxuICAgICAgICBlbnRyaWVzW2lkeF0gPSBjaGlsZEluZGljZXM7XG4gICAgICAgIHJldHVybiBpZHg7XG4gICAgICB9XG5cbiAgICAgIC8vIHBsYWluIG9iamVjdFxuICAgICAgY29uc3QgaWR4ID0gZW50cmllcy5sZW5ndGg7XG4gICAgICBlbnRyaWVzLnB1c2goe30pO1xuICAgICAgc2Vlbi5zZXQodmFsdWUsIGlkeCk7XG4gICAgICBjb25zdCByZWM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHZhbHVlKSkge1xuICAgICAgICBjb25zdCB2ID0gKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pW2tleV07XG4gICAgICAgIGNvbnN0IGNoaWxkSWR4ID0gYWRkKHYpO1xuICAgICAgICByZWNba2V5XSA9IGNoaWxkSWR4IGFzIG51bWJlcjtcbiAgICAgIH1cbiAgICAgIGVudHJpZXNbaWR4XSA9IHJlYztcbiAgICAgIHJldHVybiBpZHg7XG4gICAgfVxuXG4gICAgLy8gVW5zdXBwb3J0ZWQgdHlwZXMgKHVuZGVmaW5lZCwgZnVuY3Rpb24sIHN5bWJvbCwgYmlnaW50cywgbnVsbClcbiAgICAvLyBOb3RlOiBudWxsIGlzIG5vdCBwYXJ0IG9mIFByaW1pdGl2ZSBpbiB0aGlzIHYyIGZvcm1hdC4gU2tpcCBpdCBleHBsaWNpdGx5LlxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBVbnN1cHBvcnRlZCB2YWx1ZSBpbiBzZXJpYWxpemUoKTogJHtTdHJpbmcodmFsdWUpfSAodHlwZSAke3R5cGVvZiB2YWx1ZX0pYFxuICAgICk7XG4gIH07XG5cbiAgLy8gQnkgY29udmVudGlvbiwgdGhlIHJvb3QgdmFsdWUgaXMgdGhlIGZpcnN0IGVudHJ5IChpbmRleCAwKVxuICBhZGQoZGF0YSBhcyBhbnkpO1xuXG4gIHJldHVybiBbZXh0SWR4TGlzdHMsIGVudHJpZXNdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVzZXJpYWxpemU8RXh0ZW5zaW9ucyBleHRlbmRzIEFycmF5PEV4dGVuc2lvbj4+KFxuICBkYXRhOiBTZXJpYWxpemVkLFxuICBleHRlbnNpb25zOiBFeHRlbnNpb25zXG4pOiBTZXJpYWxpemFibGVXaXRoPEV4dGVuc2lvbnM+IHtcbiAgY29uc3QgW2V4dElkeExpc3RzLCBlbnRyaWVzXSA9IGRhdGE7XG5cbiAgLy8gTWFwIG5vZGUgaW5kZXggLT4gZXh0ZW5zaW9uIGluZGV4IHJlc3BvbnNpYmxlIGZvciBkZWNvZGluZyBpdFxuICBjb25zdCBub2RlVG9FeHQgPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyPigpO1xuICBmb3IgKGxldCBlID0gMDsgZSA8IGV4dElkeExpc3RzLmxlbmd0aDsgZSsrKSB7XG4gICAgZm9yIChjb25zdCBpZHggb2YgZXh0SWR4TGlzdHNbZV0gPz8gW10pIHtcbiAgICAgIG5vZGVUb0V4dC5zZXQoaWR4LCBlKTtcbiAgICB9XG4gIH1cblxuICAvLyBTaW5nbGUgcmVzb2x2ZXIgd2l0aCBleHRlbnNpb24tYXdhcmUgZGVjb2RlXG4gIGNvbnN0IHJlc29sdmVkID0gbmV3IE1hcDxudW1iZXIsIGFueT4oKTtcbiAgY29uc3QgcmVzb2x2ZSA9IChpZHg6IG51bWJlcik6IGFueSA9PiB7XG4gICAgaWYgKHJlc29sdmVkLmhhcyhpZHgpKSByZXR1cm4gcmVzb2x2ZWQuZ2V0KGlkeCk7XG5cbiAgICBpZiAoaWR4IDwgMCB8fCBpZHggPj0gZW50cmllcy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzZXJpYWxpemVkIGRhdGE6IG1pc3NpbmcgZW50cnkgYXQgaW5kZXggJHtpZHh9YCk7XG4gICAgfVxuICAgIGxldCBlbnRyeSA9IGVudHJpZXNbaWR4XTtcblxuICAgIGlmIChub2RlVG9FeHQuaGFzKGlkeCkpIHtcbiAgICAgIGNvbnN0IGV4dCA9IGV4dGVuc2lvbnNbbm9kZVRvRXh0LmdldChpZHgpIV0hO1xuICAgICAgY29uc3QgdmFsdWUgPSBleHQuZGVjb2RlKGVudHJpZXNbaWR4XSBhcyBEYXRhRW50cnksIChqOiBudW1iZXIpID0+XG4gICAgICAgIHJlc29sdmUoailcbiAgICAgICk7XG4gICAgICByZXNvbHZlZC5zZXQoaWR4LCB2YWx1ZSk7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgZW50cnkgPT0gbnVsbCB8fFxuICAgICAgdHlwZW9mIGVudHJ5ID09PSBcIm51bWJlclwiIHx8XG4gICAgICB0eXBlb2YgZW50cnkgPT09IFwic3RyaW5nXCIgfHxcbiAgICAgIHR5cGVvZiBlbnRyeSA9PT0gXCJib29sZWFuXCJcbiAgICApIHtcbiAgICAgIGVudHJ5ID8/PSB1bmRlZmluZWQ7XG4gICAgICByZXNvbHZlZC5zZXQoaWR4LCBlbnRyeSk7XG4gICAgICByZXR1cm4gZW50cnk7XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZW50cnkpKSB7XG4gICAgICBjb25zdCBhcnI6IGFueVtdID0gW107XG4gICAgICByZXNvbHZlZC5zZXQoaWR4LCBhcnIpO1xuICAgICAgZm9yIChjb25zdCBjaGlsZEluZGV4IG9mIGVudHJ5IGFzIG51bWJlcltdKSB7XG4gICAgICAgIGFyci5wdXNoKHJlc29sdmUoY2hpbGRJbmRleCkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFycjtcbiAgICB9XG5cbiAgICBjb25zdCBvYmo6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICByZXNvbHZlZC5zZXQoaWR4LCBvYmopO1xuICAgIGNvbnN0IG1hcCA9IGVudHJ5IGFzIFJlY29yZDxzdHJpbmcsIG51bWJlcj47XG4gICAgZm9yIChjb25zdCBrIGluIG1hcCkge1xuICAgICAgb2JqW2tdID0gcmVzb2x2ZShtYXBba10gYXMgbnVtYmVyKTtcbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbiAgfTtcblxuICBpZiAoZW50cmllcy5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHNlcmlhbGl6ZWQgZGF0YTogZW1wdHkgZW50cmllcyBhcnJheVwiKTtcbiAgfVxuICByZXR1cm4gcmVzb2x2ZSgwKTtcbn1cblxuY29uc3QgZGF0ZUV4dDogRXh0ZW5zaW9uPERhdGU+ID0ge1xuICBjaGVjayh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIERhdGUge1xuICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIERhdGU7XG4gIH0sXG4gIGVuY29kZSh2YWx1ZSwgZW5jb2RlKSB7XG4gICAgcmV0dXJuIHsgdDogZW5jb2RlKFwiZGF0ZVwiKSwgdHM6IGVuY29kZSh2YWx1ZS5nZXRUaW1lKCkpIH07XG4gIH0sXG4gIGRlY29kZShlbnRyeSwgZGVjb2RlKSB7XG4gICAgY29uc3QgdCA9IGRlY29kZSgoZW50cnkgYXMgUmVjb3JkPHN0cmluZywgbnVtYmVyPikudCkgYXMgc3RyaW5nO1xuICAgIGlmICh0ICE9PSBcImRhdGVcIikgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBkYXRlIHBheWxvYWRcIik7XG4gICAgY29uc3QgdHMgPSBkZWNvZGUoKGVudHJ5IGFzIFJlY29yZDxzdHJpbmcsIG51bWJlcj4pLnRzKSBhcyBudW1iZXI7XG4gICAgcmV0dXJuIG5ldyBEYXRlKHRzKTtcbiAgfSxcbn07XG5cbmNvbnN0IGZpbGVFeHQ6IEV4dGVuc2lvbjxGaWxlPiA9IHtcbiAgY2hlY2sodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBGaWxlIHtcbiAgICByZXR1cm4gdHlwZW9mIEZpbGUgIT09IFwidW5kZWZpbmVkXCIgJiYgdmFsdWUgaW5zdGFuY2VvZiBGaWxlO1xuICB9LFxuICBlbmNvZGUoZmlsZTogRmlsZSwgZW5jb2RlOiAodjogdW5rbm93bikgPT4gbnVtYmVyKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHQ6IGVuY29kZShcImZpbGVcIiksXG4gICAgICBuOiBlbmNvZGUoZmlsZS5uYW1lKSxcbiAgICAgIHRwOiBlbmNvZGUoZmlsZS50eXBlKSxcbiAgICAgIHN6OiBlbmNvZGUoZmlsZS5zaXplKSxcbiAgICAgIGxtOiBlbmNvZGUoZmlsZS5sYXN0TW9kaWZpZWQpLFxuICAgICAgLy8gcmF3IGJyb3dzZXIgRmlsZSBvYmplY3QgLSBzb2NrZXQuaW8gd2lsbCBjYXJyeSBpdCBhcyBiaW5hcnlcbiAgICAgIGI6IGZpbGUsXG4gICAgfSBhcyBhbnk7XG4gIH0sXG4gIGRlY29kZShlbnRyeTogRGF0YUVudHJ5LCBkZWNvZGU6IChpOiBudW1iZXIpID0+IHVua25vd24pOiBGaWxlIHtcbiAgICBjb25zdCBlID0gZW50cnkgYXMgYW55O1xuICAgIGNvbnN0IHQgPSBkZWNvZGUoZS50KSBhcyBzdHJpbmc7XG4gICAgaWYgKHQgIT09IFwiZmlsZVwiKSB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGZpbGUgcGF5bG9hZFwiKTtcbiAgICBjb25zdCBuYW1lID0gZGVjb2RlKGUubikgYXMgc3RyaW5nO1xuICAgIGNvbnN0IHR5cGUgPSBkZWNvZGUoZS50cCkgYXMgc3RyaW5nO1xuICAgIGNvbnN0IHNpemUgPSBkZWNvZGUoZS5zeikgYXMgbnVtYmVyO1xuICAgIGNvbnN0IGxhc3RNb2RpZmllZCA9IGRlY29kZShlLmxtKSBhcyBudW1iZXI7XG4gICAgY29uc3QgcmF3ID0gZS5maWxlO1xuICAgIGlmICh0eXBlb2YgRmlsZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgaWYgKHJhdyBpbnN0YW5jZW9mIEZpbGUpIHJldHVybiByYXc7XG4gICAgICBpZiAocmF3ICYmIChyYXcgaW5zdGFuY2VvZiBVaW50OEFycmF5IHx8IHJhdyBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSkge1xuICAgICAgICBjb25zdCBidWYgPVxuICAgICAgICAgIHJhdyBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgPyByYXcgOiBuZXcgVWludDhBcnJheShyYXcgYXMgQXJyYXlCdWZmZXIpO1xuICAgICAgICByZXR1cm4gbmV3IEZpbGUoW2J1ZiBhcyB1bmtub3duIGFzIEJsb2JQYXJ0XSwgbmFtZSwge1xuICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgbGFzdE1vZGlmaWVkLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIC8vIFRyeSBCbG9iXG4gICAgICBpZiAodHlwZW9mIEJsb2IgIT09IFwidW5kZWZpbmVkXCIgJiYgcmF3IGluc3RhbmNlb2YgQmxvYikge1xuICAgICAgICByZXR1cm4gbmV3IEZpbGUoW3Jhd10sIG5hbWUsIHsgdHlwZSwgbGFzdE1vZGlmaWVkIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBGYWxsYmFjayByZXR1cm4gYSBwbGFpbiBvYmplY3QgaWYgRmlsZSBpcyBub3QgYXZhaWxhYmxlXG4gICAgcmV0dXJuIHsgbmFtZSwgdHlwZSwgc2l6ZSwgbGFzdE1vZGlmaWVkLCBmaWxlOiByYXcgfSBhcyB1bmtub3duIGFzIEZpbGU7XG4gIH0sXG59IGFzIGFueTtcblxuY29uc3QgZm9ybURhdGFFeHQ6IEV4dGVuc2lvbjxGb3JtRGF0YT4gPSB7XG4gIGNoZWNrKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgRm9ybURhdGEge1xuICAgIHJldHVybiB0eXBlb2YgRm9ybURhdGEgIT09IFwidW5kZWZpbmVkXCIgJiYgdmFsdWUgaW5zdGFuY2VvZiBGb3JtRGF0YTtcbiAgfSxcbiAgZW5jb2RlKGZkOiBGb3JtRGF0YSwgZW5jb2RlOiAodjogdW5rbm93bikgPT4gbnVtYmVyKSB7XG4gICAgY29uc3QgZmllbGRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duIHwgdW5rbm93bltdPiA9IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiBmZC5lbnRyaWVzKCkpIHtcbiAgICAgIGNvbnN0IHByZXYgPSBmaWVsZHNba2V5XTtcbiAgICAgIGlmIChwcmV2ID09PSB1bmRlZmluZWQpIGZpZWxkc1trZXldID0gdmFsIGFzIGFueTtcbiAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocHJldikpIHByZXYucHVzaCh2YWwgYXMgYW55KTtcbiAgICAgIGVsc2UgZmllbGRzW2tleV0gPSBbcHJldiwgdmFsIGFzIGFueV07XG4gICAgfVxuICAgIHJldHVybiB7IHQ6IGVuY29kZShcImZvcm1kYXRhXCIpLCBmOiBlbmNvZGUoZmllbGRzKSB9O1xuICB9LFxuICBkZWNvZGUoZW50cnk6IERhdGFFbnRyeSwgZGVjb2RlOiAoaTogbnVtYmVyKSA9PiB1bmtub3duKSB7XG4gICAgY29uc3QgdCA9IGRlY29kZSgoZW50cnkgYXMgUmVjb3JkPHN0cmluZywgbnVtYmVyPikudCkgYXMgc3RyaW5nO1xuICAgIGlmICh0ICE9PSBcImZvcm1kYXRhXCIpIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgZm9ybWRhdGEgcGF5bG9hZFwiKTtcbiAgICBjb25zdCBkYXRhID0gZGVjb2RlKChlbnRyeSBhcyBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+KS5mKSBhcyBSZWNvcmQ8XG4gICAgICBzdHJpbmcsXG4gICAgICB1bmtub3duIHwgdW5rbm93bltdXG4gICAgPjtcbiAgICBjb25zdCBmZCA9IG5ldyBGb3JtRGF0YSgpO1xuICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKGRhdGEpKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2KSkge1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdikgZmQuYXBwZW5kKGssIGl0ZW0gYXMgYW55KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZkLmFwcGVuZChrLCB2IGFzIGFueSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmZDtcbiAgfSxcbn0gYXMgYW55O1xuXG5jb25zdCBzZXRFeHQ6IEV4dGVuc2lvbjxTZXQ8dW5rbm93bj4+ID0ge1xuICBjaGVjayh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFNldDx1bmtub3duPiB7XG4gICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgU2V0O1xuICB9LFxuICBlbmNvZGUoc2V0LCBlbmNvZGUpIHtcbiAgICByZXR1cm4geyB0OiBlbmNvZGUoXCJzZXRcIiksIGl0ZW1zOiBlbmNvZGUoQXJyYXkuZnJvbShzZXQudmFsdWVzKCkpKSB9O1xuICB9LFxuICBkZWNvZGUoZW50cnksIGRlY29kZSkge1xuICAgIGNvbnN0IHQgPSBkZWNvZGUoKGVudHJ5IGFzIFJlY29yZDxzdHJpbmcsIG51bWJlcj4pLnQpIGFzIHN0cmluZztcbiAgICBpZiAodCAhPT0gXCJzZXRcIikgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBzZXQgcGF5bG9hZFwiKTtcbiAgICBjb25zdCBpdGVtcyA9IGRlY29kZSgoZW50cnkgYXMgUmVjb3JkPHN0cmluZywgbnVtYmVyPikuaXRlbXMpIGFzIHVua25vd25bXTtcbiAgICByZXR1cm4gbmV3IFNldChpdGVtcyk7XG4gIH0sXG59O1xuXG5jb25zdCBtYXBFeHQ6IEV4dGVuc2lvbjxNYXA8dW5rbm93biwgdW5rbm93bj4+ID0ge1xuICBjaGVjayh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIE1hcDx1bmtub3duLCB1bmtub3duPiB7XG4gICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgTWFwO1xuICB9LFxuICBlbmNvZGUobWFwLCBlbmNvZGUpIHtcbiAgICByZXR1cm4geyB0OiBlbmNvZGUoXCJtYXBcIiksIGVudHJpZXM6IGVuY29kZShBcnJheS5mcm9tKG1hcC5lbnRyaWVzKCkpKSB9O1xuICB9LFxuICBkZWNvZGUoZW50cnksIGRlY29kZSkge1xuICAgIGNvbnN0IHQgPSBkZWNvZGUoKGVudHJ5IGFzIFJlY29yZDxzdHJpbmcsIG51bWJlcj4pLnQpIGFzIHN0cmluZztcbiAgICBpZiAodCAhPT0gXCJtYXBcIikgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBtYXAgcGF5bG9hZFwiKTtcbiAgICBjb25zdCBlbnRyaWVzQXJyID0gZGVjb2RlKFxuICAgICAgKGVudHJ5IGFzIFJlY29yZDxzdHJpbmcsIG51bWJlcj4pLmVudHJpZXNcbiAgICApIGFzIEFycmF5PFt1bmtub3duLCB1bmtub3duXT47XG4gICAgcmV0dXJuIG5ldyBNYXAoZW50cmllc0Fycik7XG4gIH0sXG59O1xuLy8gRGVmYXVsdCBleHRlbnNpb25zIGZvciBicm93c2VyL3J1bnRpbWUgdXNhZ2UgKG9yZGVyIE1VU1QgbWF0Y2ggc2VydmVyKVxuZXhwb3J0IGZ1bmN0aW9uIGRlZmF1bHRFeHRlbnNpb25zKCkge1xuICByZXR1cm4gW2RhdGVFeHQsIGZpbGVFeHQsIGZvcm1EYXRhRXh0LCBzZXRFeHQsIG1hcEV4dF07XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgUm91dGVJbmZvIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuaW1wb3J0IHR5cGUgeyBDbGllbnRNb3VudE1lc3NhZ2UgfSBmcm9tIFwiLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHR5cGUgeyBWRE9NLCBWRE9NVXBkYXRlIH0gZnJvbSBcIi4vdmRvbVwiO1xuaW1wb3J0IHsgZXh0cmFjdEV2ZW50IH0gZnJvbSBcIi4vc2VyaWFsaXplL2V2ZW50c1wiO1xuaW1wb3J0IHsgc2VyaWFsaXplLCBkZXNlcmlhbGl6ZSwgZGVmYXVsdEV4dGVuc2lvbnMgfSBmcm9tIFwiLi9zZXJpYWxpemUvdjJcIjtcblxuaW1wb3J0IHsgaW8sIFNvY2tldCB9IGZyb20gXCJzb2NrZXQuaW8tY2xpZW50XCI7XG5pbXBvcnQgdHlwZSB7XG4gIENsaWVudEFwaVJlc3VsdE1lc3NhZ2UsXG4gIENsaWVudE1lc3NhZ2UsXG4gIFNlcnZlckFwaUNhbGxNZXNzYWdlLFxuICBTZXJ2ZXJFcnJvckluZm8sXG4gIFNlcnZlck1lc3NhZ2UsXG59IGZyb20gXCIuL21lc3NhZ2VzXCI7XG5pbXBvcnQgdHlwZSB7IE5hdmlnYXRlRnVuY3Rpb24gfSBmcm9tIFwicmVhY3Qtcm91dGVyXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW91bnRlZFZpZXcge1xuICByb3V0ZUluZm86IFJvdXRlSW5mbztcbiAgb25Jbml0OiAodmRvbTogVkRPTSkgPT4gdm9pZDtcbiAgb25VcGRhdGU6IChvcHM6IFZET01VcGRhdGVbXSkgPT4gdm9pZDtcbn1cbmV4cG9ydCB0eXBlIENvbm5lY3Rpb25TdGF0dXNMaXN0ZW5lciA9IChjb25uZWN0ZWQ6IGJvb2xlYW4pID0+IHZvaWQ7XG5leHBvcnQgdHlwZSBTZXJ2ZXJFcnJvckxpc3RlbmVyID0gKFxuICBwYXRoOiBzdHJpbmcsXG4gIGVycm9yOiBTZXJ2ZXJFcnJvckluZm8gfCBudWxsXG4pID0+IHZvaWQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHVsc2VDbGllbnQge1xuICAvLyBDb25uZWN0aW9uIG1hbmFnZW1lbnRcbiAgY29ubmVjdCgpOiBQcm9taXNlPHZvaWQ+O1xuICBkaXNjb25uZWN0KCk6IHZvaWQ7XG4gIGlzQ29ubmVjdGVkKCk6IGJvb2xlYW47XG4gIG9uQ29ubmVjdGlvbkNoYW5nZShsaXN0ZW5lcjogQ29ubmVjdGlvblN0YXR1c0xpc3RlbmVyKTogKCkgPT4gdm9pZDtcbiAgLy8gTWVzc2FnZXNcbiAgbmF2aWdhdGUocGF0aDogc3RyaW5nLCByb3V0ZUluZm86IFJvdXRlSW5mbyk6IFByb21pc2U8dm9pZD47XG4gIGxlYXZlKHBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD47XG4gIGludm9rZUNhbGxiYWNrKHBhdGg6IHN0cmluZywgY2FsbGJhY2s6IHN0cmluZywgYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+O1xuICAvLyBWRE9NIHN1YnNjcmlwdGlvblxuICBtb3VudFZpZXcocGF0aDogc3RyaW5nLCB2aWV3OiBNb3VudGVkVmlldyk6ICgpID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBjbGFzcyBQdWxzZVNvY2tldElPQ2xpZW50IHtcbiAgcHJpdmF0ZSBhY3RpdmVWaWV3czogTWFwPHN0cmluZywgTW91bnRlZFZpZXc+O1xuICBwcml2YXRlIHNvY2tldDogU29ja2V0IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbWVzc2FnZVF1ZXVlOiBDbGllbnRNZXNzYWdlW107XG4gIHByaXZhdGUgY29ubmVjdGlvbkxpc3RlbmVyczogU2V0PENvbm5lY3Rpb25TdGF0dXNMaXN0ZW5lcj4gPSBuZXcgU2V0KCk7XG4gIHByaXZhdGUgc2VydmVyRXJyb3JzOiBNYXA8c3RyaW5nLCBTZXJ2ZXJFcnJvckluZm8+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIHNlcnZlckVycm9yTGlzdGVuZXJzOiBTZXQ8U2VydmVyRXJyb3JMaXN0ZW5lcj4gPSBuZXcgU2V0KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSB1cmw6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlbmRlcklkOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBmcmFtZXdvcmtOYXZpZ2F0ZTogTmF2aWdhdGVGdW5jdGlvblxuICApIHtcbiAgICB0aGlzLnNvY2tldCA9IG51bGw7XG4gICAgdGhpcy5hY3RpdmVWaWV3cyA9IG5ldyBNYXAoKTtcbiAgICB0aGlzLm1lc3NhZ2VRdWV1ZSA9IFtdO1xuICB9XG4gIHB1YmxpYyBpc0Nvbm5lY3RlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zb2NrZXQ/LmNvbm5lY3RlZCA/PyBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBjb25uZWN0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLnNvY2tldCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3Qgc29ja2V0ID0gaW8odGhpcy51cmwsIHtcbiAgICAgICAgdHJhbnNwb3J0czogW1wid2Vic29ja2V0XCIsIFwid2VidHJhbnNwb3J0XCJdLFxuICAgICAgICBhdXRoOiB7IHJlbmRlcklkOiB0aGlzLnJlbmRlcklkIH0sXG4gICAgICB9KTtcbiAgICAgIHRoaXMuc29ja2V0ID0gc29ja2V0O1xuXG4gICAgICBzb2NrZXQub24oXCJjb25uZWN0XCIsICgpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coXCJbU29ja2V0SU9UcmFuc3BvcnRdIENvbm5lY3RlZDpcIiwgdGhpcy5zb2NrZXQ/LmlkKTtcbiAgICAgICAgLy8gTWFrZSBzdXJlIHRvIHNlbmQgYSBuYXZpZ2F0ZSBwYXlsb2FkIGZvciBhbGwgdGhlIHJvdXRlc1xuICAgICAgICBmb3IgKGNvbnN0IFtwYXRoLCByb3V0ZV0gb2YgdGhpcy5hY3RpdmVWaWV3cykge1xuICAgICAgICAgIHNvY2tldC5lbWl0KFxuICAgICAgICAgICAgXCJtZXNzYWdlXCIsXG4gICAgICAgICAgICBzZXJpYWxpemUoXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcIm1vdW50XCIsXG4gICAgICAgICAgICAgICAgcGF0aDogcGF0aCxcbiAgICAgICAgICAgICAgICByb3V0ZUluZm86IHJvdXRlLnJvdXRlSW5mbyxcbiAgICAgICAgICAgICAgfSBhcyBhbnksXG4gICAgICAgICAgICAgIGRlZmF1bHRFeHRlbnNpb25zKClcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBwYXlsb2FkIG9mIHRoaXMubWVzc2FnZVF1ZXVlKSB7XG4gICAgICAgICAgLy8gQWxyZWFkeSBzZW50IGFib3ZlXG4gICAgICAgICAgaWYgKHBheWxvYWQudHlwZSA9PT0gXCJtb3VudFwiICYmIHRoaXMuYWN0aXZlVmlld3MuaGFzKHBheWxvYWQucGF0aCkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBXZSdyZSByZW1vdW50aW5nIGFsbCB0aGUgcm91dGVzLCBzbyBubyBuZWVkIHRvIG5hdmlnYXRlXG4gICAgICAgICAgaWYgKHBheWxvYWQudHlwZSA9PT0gXCJuYXZpZ2F0ZVwiKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc29ja2V0LmVtaXQoXG4gICAgICAgICAgICBcIm1lc3NhZ2VcIixcbiAgICAgICAgICAgIHNlcmlhbGl6ZShwYXlsb2FkIGFzIGFueSwgZGVmYXVsdEV4dGVuc2lvbnMoKSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWVzc2FnZVF1ZXVlID0gW107XG5cbiAgICAgICAgdGhpcy5ub3RpZnlDb25uZWN0aW9uTGlzdGVuZXJzKHRydWUpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9KTtcblxuICAgICAgc29ja2V0Lm9uKFwiY29ubmVjdF9lcnJvclwiLCAoZXJyKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJbU29ja2V0SU9UcmFuc3BvcnRdIENvbm5lY3Rpb24gZmFpbGVkOlwiLCBlcnIpO1xuICAgICAgICB0aGlzLm5vdGlmeUNvbm5lY3Rpb25MaXN0ZW5lcnMoZmFsc2UpO1xuICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgIH0pO1xuXG4gICAgICBzb2NrZXQub24oXCJkaXNjb25uZWN0XCIsICgpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coXCJbU29ja2V0SU9UcmFuc3BvcnRdIERpc2Nvbm5lY3RlZFwiKTtcbiAgICAgICAgdGhpcy5ub3RpZnlDb25uZWN0aW9uTGlzdGVuZXJzKGZhbHNlKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBXcmFwIGluIGFuIGFycm93IGZ1bmN0aW9uIHRvIGF2b2lkIGxvc2luZyB0aGUgYHRoaXNgIHJlZmVyZW5jZVxuICAgICAgc29ja2V0Lm9uKFwibWVzc2FnZVwiLCAoZGF0YSkgPT5cbiAgICAgICAgdGhpcy5oYW5kbGVTZXJ2ZXJNZXNzYWdlKGRlc2VyaWFsaXplKGRhdGEsIGRlZmF1bHRFeHRlbnNpb25zKCkpIGFzIGFueSlcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBvbkNvbm5lY3Rpb25DaGFuZ2UobGlzdGVuZXI6IENvbm5lY3Rpb25TdGF0dXNMaXN0ZW5lcik6ICgpID0+IHZvaWQge1xuICAgIHRoaXMuY29ubmVjdGlvbkxpc3RlbmVycy5hZGQobGlzdGVuZXIpO1xuICAgIGxpc3RlbmVyKHRoaXMuaXNDb25uZWN0ZWQoKSk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHRoaXMuY29ubmVjdGlvbkxpc3RlbmVycy5kZWxldGUobGlzdGVuZXIpO1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIG5vdGlmeUNvbm5lY3Rpb25MaXN0ZW5lcnMoY29ubmVjdGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lcnMpIHtcbiAgICAgIGxpc3RlbmVyKGNvbm5lY3RlZCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uU2VydmVyRXJyb3IobGlzdGVuZXI6IFNlcnZlckVycm9yTGlzdGVuZXIpOiAoKSA9PiB2b2lkIHtcbiAgICB0aGlzLnNlcnZlckVycm9yTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7XG4gICAgLy8gRW1pdCBjdXJyZW50IGVycm9ycyB0byBuZXcgbGlzdGVuZXJcbiAgICBmb3IgKGNvbnN0IFtwYXRoLCBlcnJdIG9mIHRoaXMuc2VydmVyRXJyb3JzKSBsaXN0ZW5lcihwYXRoLCBlcnIpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICB0aGlzLnNlcnZlckVycm9yTGlzdGVuZXJzLmRlbGV0ZShsaXN0ZW5lcik7XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgbm90aWZ5U2VydmVyRXJyb3IocGF0aDogc3RyaW5nLCBlcnJvcjogU2VydmVyRXJyb3JJbmZvIHwgbnVsbCkge1xuICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy5zZXJ2ZXJFcnJvckxpc3RlbmVycykgbGlzdGVuZXIocGF0aCwgZXJyb3IpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZW5kTWVzc2FnZShwYXlsb2FkOiBDbGllbnRNZXNzYWdlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaXNDb25uZWN0ZWQoKSkge1xuICAgICAgLy8gY29uc29sZS5sb2coXCJbU29ja2V0SU9UcmFuc3BvcnRdIFNlbmRpbmc6XCIsIHBheWxvYWQpO1xuICAgICAgdGhpcy5zb2NrZXQhLmVtaXQoXG4gICAgICAgIFwibWVzc2FnZVwiLFxuICAgICAgICBzZXJpYWxpemUocGF5bG9hZCBhcyBhbnksIGRlZmF1bHRFeHRlbnNpb25zKCkpXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBjb25zb2xlLmxvZyhcIltTb2NrZXRJT1RyYW5zcG9ydF0gUXVldWluZyBtZXNzYWdlOlwiLCBwYXlsb2FkKTtcbiAgICAgIHRoaXMubWVzc2FnZVF1ZXVlLnB1c2gocGF5bG9hZCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG1vdW50VmlldyhwYXRoOiBzdHJpbmcsIHZpZXc6IE1vdW50ZWRWaWV3KSB7XG4gICAgaWYgKHRoaXMuYWN0aXZlVmlld3MuaGFzKHBhdGgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFBhdGggJHtwYXRofSBpcyBhbHJlYWR5IG1vdW50ZWRgKTtcbiAgICB9XG4gICAgdGhpcy5hY3RpdmVWaWV3cy5zZXQocGF0aCwgdmlldyk7XG4gICAgdm9pZCB0aGlzLnNlbmRNZXNzYWdlKHtcbiAgICAgIHR5cGU6IFwibW91bnRcIixcbiAgICAgIHBhdGgsXG4gICAgICByb3V0ZUluZm86IHZpZXcucm91dGVJbmZvLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIG5hdmlnYXRlKHBhdGg6IHN0cmluZywgcm91dGVJbmZvOiBSb3V0ZUluZm8pIHtcbiAgICBhd2FpdCB0aGlzLnNlbmRNZXNzYWdlKHtcbiAgICAgIHR5cGU6IFwibmF2aWdhdGVcIixcbiAgICAgIHBhdGgsXG4gICAgICByb3V0ZUluZm8sXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgdW5tb3VudChwYXRoOiBzdHJpbmcpIHtcbiAgICB2b2lkIHRoaXMuc2VuZE1lc3NhZ2UoeyB0eXBlOiBcInVubW91bnRcIiwgcGF0aCB9KTtcbiAgICB0aGlzLmFjdGl2ZVZpZXdzLmRlbGV0ZShwYXRoKTtcbiAgfVxuXG4gIHB1YmxpYyBkaXNjb25uZWN0KCkge1xuICAgIHRoaXMuc29ja2V0Py5kaXNjb25uZWN0KCk7XG4gICAgdGhpcy5zb2NrZXQgPSBudWxsO1xuICAgIHRoaXMubWVzc2FnZVF1ZXVlID0gW107XG4gICAgdGhpcy5jb25uZWN0aW9uTGlzdGVuZXJzLmNsZWFyKCk7XG4gICAgdGhpcy5hY3RpdmVWaWV3cy5jbGVhcigpO1xuICAgIHRoaXMuc2VydmVyRXJyb3JzLmNsZWFyKCk7XG4gICAgdGhpcy5zZXJ2ZXJFcnJvckxpc3RlbmVycy5jbGVhcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVTZXJ2ZXJNZXNzYWdlKG1lc3NhZ2U6IFNlcnZlck1lc3NhZ2UpIHtcbiAgICAvLyBjb25zb2xlLmxvZyhcIltQdWxzZUNsaWVudF0gUmVjZWl2ZWQgbWVzc2FnZTpcIiwgbWVzc2FnZSk7XG4gICAgc3dpdGNoIChtZXNzYWdlLnR5cGUpIHtcbiAgICAgIGNhc2UgXCJ2ZG9tX2luaXRcIjoge1xuICAgICAgICBjb25zdCByb3V0ZSA9IHRoaXMuYWN0aXZlVmlld3MuZ2V0KG1lc3NhZ2UucGF0aCk7XG4gICAgICAgIC8vIElnbm9yZSBtZXNzYWdlcyBmb3IgcGF0aHMgdGhhdCBhcmUgbm90IG1vdW50ZWRcbiAgICAgICAgaWYgKCFyb3V0ZSkgcmV0dXJuO1xuICAgICAgICBpZiAocm91dGUpIHtcbiAgICAgICAgICByb3V0ZS5vbkluaXQobWVzc2FnZS52ZG9tKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBDbGVhciBhbnkgcHJpb3IgZXJyb3IgZm9yIHRoaXMgcGF0aCBvbiBzdWNjZXNzZnVsIGluaXRcbiAgICAgICAgaWYgKHRoaXMuc2VydmVyRXJyb3JzLmhhcyhtZXNzYWdlLnBhdGgpKSB7XG4gICAgICAgICAgdGhpcy5zZXJ2ZXJFcnJvcnMuZGVsZXRlKG1lc3NhZ2UucGF0aCk7XG4gICAgICAgICAgdGhpcy5ub3RpZnlTZXJ2ZXJFcnJvcihtZXNzYWdlLnBhdGgsIG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBcInZkb21fdXBkYXRlXCI6IHtcbiAgICAgICAgY29uc3Qgcm91dGUgPSB0aGlzLmFjdGl2ZVZpZXdzLmdldChtZXNzYWdlLnBhdGgpO1xuICAgICAgICBpZiAoIXJvdXRlKSByZXR1cm47IC8vIE5vdCBhbiBhY3RpdmUgcGF0aDsgZGlzY2FyZFxuICAgICAgICByb3V0ZS5vblVwZGF0ZShtZXNzYWdlLm9wcyk7XG4gICAgICAgIC8vIENsZWFyIGFueSBwcmlvciBlcnJvciBmb3IgdGhpcyBwYXRoIG9uIHN1Y2Nlc3NmdWwgdXBkYXRlXG4gICAgICAgIGlmICh0aGlzLnNlcnZlckVycm9ycy5oYXMobWVzc2FnZS5wYXRoKSkge1xuICAgICAgICAgIHRoaXMuc2VydmVyRXJyb3JzLmRlbGV0ZShtZXNzYWdlLnBhdGgpO1xuICAgICAgICAgIHRoaXMubm90aWZ5U2VydmVyRXJyb3IobWVzc2FnZS5wYXRoLCBudWxsKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJzZXJ2ZXJfZXJyb3JcIjoge1xuICAgICAgICBpZiAoIXRoaXMuYWN0aXZlVmlld3MuaGFzKG1lc3NhZ2UucGF0aCkpIHJldHVybjsgLy8gZGlzY2FyZCBmb3IgaW5hY3RpdmUgcGF0aHNcbiAgICAgICAgdGhpcy5zZXJ2ZXJFcnJvcnMuc2V0KG1lc3NhZ2UucGF0aCwgbWVzc2FnZS5lcnJvcik7XG4gICAgICAgIHRoaXMubm90aWZ5U2VydmVyRXJyb3IobWVzc2FnZS5wYXRoLCBtZXNzYWdlLmVycm9yKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFwiYXBpX2NhbGxcIjoge1xuICAgICAgICB2b2lkIHRoaXMucGVyZm9ybUFwaUNhbGwobWVzc2FnZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBcIm5hdmlnYXRlX3RvXCI6IHtcbiAgICAgICAgLy8gYG5hdmlnYXRlX3RvYCBpcyBuYXZpZ2F0aW9uYWw7IGFsbG93IHJlZ2FyZGxlc3Mgb2YgYWN0aXZlVmlld3MgbWVtYmVyc2hpcFxuICAgICAgICBjb25zdCByZXBsYWNlID0gISFtZXNzYWdlLnJlcGxhY2U7XG4gICAgICAgIGxldCBkZXN0ID0gbWVzc2FnZS5wYXRoIHx8IFwiXCI7XG4gICAgICAgIC8vIE5vcm1hbGl6ZSBwcm90b2NvbC1yZWxhdGl2ZSBVUkxzIHRvIGFic29sdXRlXG4gICAgICAgIGlmIChkZXN0LnN0YXJ0c1dpdGgoXCIvL1wiKSkgZGVzdCA9IGAke3dpbmRvdy5sb2NhdGlvbi5wcm90b2NvbH0ke2Rlc3R9YDtcbiAgICAgICAgY29uc3QgaGFzU2NoZW1lID0gL15bYS16QS1aXVthLXpBLVowLTkrLi1dKjovLnRlc3QoZGVzdCk7XG4gICAgICAgIGlmIChoYXNTY2hlbWUpIHtcbiAgICAgICAgICBpZiAoZGVzdC5zdGFydHNXaXRoKFwiaHR0cDovL1wiKSB8fCBkZXN0LnN0YXJ0c1dpdGgoXCJodHRwczovL1wiKSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTChkZXN0KTtcbiAgICAgICAgICAgICAgaWYgKHVybC5vcmlnaW4gPT09IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbnRlcm5hbCA9IGAke3VybC5wYXRobmFtZX0ke3VybC5zZWFyY2h9JHt1cmwuaGFzaH1gO1xuICAgICAgICAgICAgICAgIHRoaXMuZnJhbWV3b3JrTmF2aWdhdGUoaW50ZXJuYWwsIHsgcmVwbGFjZSB9KTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAocmVwbGFjZSkgd2luZG93LmxvY2F0aW9uLnJlcGxhY2UoZGVzdCk7XG4gICAgICAgICAgICAgICAgZWxzZSB3aW5kb3cubG9jYXRpb24uYXNzaWduKGRlc3QpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgaWYgKHJlcGxhY2UpIHdpbmRvdy5sb2NhdGlvbi5yZXBsYWNlKGRlc3QpO1xuICAgICAgICAgICAgICBlbHNlIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oZGVzdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIG1haWx0bzosIHRlbDosIGRhdGE6LCBldGMuXG4gICAgICAgICAgICBpZiAocmVwbGFjZSkgd2luZG93LmxvY2F0aW9uLnJlcGxhY2UoZGVzdCk7XG4gICAgICAgICAgICBlbHNlIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oZGVzdCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFJlbGF0aXZlIG9yIHJvb3QtcmVsYXRpdmUgcGF0aCDihpIgU1BBIG5hdmlnYXRlXG4gICAgICAgICAgdGhpcy5mcmFtZXdvcmtOYXZpZ2F0ZShkZXN0LCB7IHJlcGxhY2UgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJVbmV4cGVjdGVkIG1lc3NhZ2U6XCIsIG1lc3NhZ2UpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcGVyZm9ybUFwaUNhbGwobXNnOiBTZXJ2ZXJBcGlDYWxsTWVzc2FnZSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChtc2cudXJsLCB7XG4gICAgICAgIG1ldGhvZDogbXNnLm1ldGhvZCB8fCBcIkdFVFwiLFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgLi4uKG1zZy5oZWFkZXJzIHx8IHt9KSxcbiAgICAgICAgICAuLi4obXNnLmJvZHkgIT0gbnVsbCAmJiAhKFwiY29udGVudC10eXBlXCIgaW4gKG1zZy5oZWFkZXJzIHx8IHt9KSlcbiAgICAgICAgICAgID8geyBcImNvbnRlbnQtdHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIiB9XG4gICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgfSxcbiAgICAgICAgYm9keTpcbiAgICAgICAgICBtc2cuYm9keSAhPSBudWxsXG4gICAgICAgICAgICA/IHR5cGVvZiBtc2cuYm9keSA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgICAgICA/IG1zZy5ib2R5XG4gICAgICAgICAgICAgIDogSlNPTi5zdHJpbmdpZnkobXNnLmJvZHkpXG4gICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgY3JlZGVudGlhbHM6IG1zZy5jcmVkZW50aWFscyB8fCBcImluY2x1ZGVcIixcbiAgICAgIH0pO1xuICAgICAgY29uc3QgaGVhZGVyc09iajogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgICAgcmVzLmhlYWRlcnMuZm9yRWFjaCgodiwgaykgPT4gKGhlYWRlcnNPYmpba10gPSB2KSk7XG4gICAgICBsZXQgYm9keTogYW55ID0gbnVsbDtcbiAgICAgIGNvbnN0IGN0ID0gcmVzLmhlYWRlcnMuZ2V0KFwiY29udGVudC10eXBlXCIpIHx8IFwiXCI7XG4gICAgICBpZiAoY3QuaW5jbHVkZXMoXCJhcHBsaWNhdGlvbi9qc29uXCIpKSB7XG4gICAgICAgIGJvZHkgPSBhd2FpdCByZXMuanNvbigpLmNhdGNoKCgpID0+IG51bGwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYm9keSA9IGF3YWl0IHJlcy50ZXh0KCkuY2F0Y2goKCkgPT4gbnVsbCk7XG4gICAgICB9XG4gICAgICBjb25zdCByZXBseTogQ2xpZW50QXBpUmVzdWx0TWVzc2FnZSA9IHtcbiAgICAgICAgdHlwZTogXCJhcGlfcmVzdWx0XCIsXG4gICAgICAgIGlkOiBtc2cuaWQsXG4gICAgICAgIG9rOiByZXMub2ssXG4gICAgICAgIHN0YXR1czogcmVzLnN0YXR1cyxcbiAgICAgICAgaGVhZGVyczogaGVhZGVyc09iaixcbiAgICAgICAgYm9keSxcbiAgICAgIH07XG4gICAgICBhd2FpdCB0aGlzLnNlbmRNZXNzYWdlKHJlcGx5KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnN0IHJlcGx5OiBDbGllbnRBcGlSZXN1bHRNZXNzYWdlID0ge1xuICAgICAgICB0eXBlOiBcImFwaV9yZXN1bHRcIixcbiAgICAgICAgaWQ6IG1zZy5pZCxcbiAgICAgICAgb2s6IGZhbHNlLFxuICAgICAgICBzdGF0dXM6IDAsXG4gICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgICBib2R5OiB7IGVycm9yOiBTdHJpbmcoZXJyKSB9LFxuICAgICAgfTtcbiAgICAgIGF3YWl0IHRoaXMuc2VuZE1lc3NhZ2UocmVwbHkpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBpbnZva2VDYWxsYmFjayhwYXRoOiBzdHJpbmcsIGNhbGxiYWNrOiBzdHJpbmcsIGFyZ3M6IGFueVtdKSB7XG4gICAgYXdhaXQgdGhpcy5zZW5kTWVzc2FnZSh7XG4gICAgICB0eXBlOiBcImNhbGxiYWNrXCIsXG4gICAgICBwYXRoLFxuICAgICAgY2FsbGJhY2ssXG4gICAgICBhcmdzOiBhcmdzLm1hcChleHRyYWN0RXZlbnQpLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gcHVibGljIGdldFZET00ocGF0aDogc3RyaW5nKTogVkRPTSB8IG51bGwge1xuICAvLyAgIHJldHVybiB0aGlzLmFjdGl2ZVZpZXdzLmdldChwYXRoKT8udmRvbSA/PyBudWxsO1xuICAvLyB9XG59XG4iLAogICAgImltcG9ydCB7IGlvLCBTb2NrZXQgfSBmcm9tIFwic29ja2V0LmlvLWNsaWVudFwiO1xuaW1wb3J0IHR5cGUgeyBTZXJ2ZXJNZXNzYWdlLCBDbGllbnRNZXNzYWdlIH0gZnJvbSBcIi4vbWVzc2FnZXNcIjtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFRyYW5zcG9ydCBBYnN0cmFjdGlvblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IHR5cGUgTWVzc2FnZUxpc3RlbmVyID0gKG1lc3NhZ2U6IFNlcnZlck1lc3NhZ2UpID0+IHZvaWQ7XG5leHBvcnQgdHlwZSBDb25uZWN0aW9uU3RhdHVzTGlzdGVuZXIgPSAoY29ubmVjdGVkOiBib29sZWFuKSA9PiB2b2lkO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zcG9ydCB7XG4gIGNvbm5lY3QobGlzdGVuZXI6IE1lc3NhZ2VMaXN0ZW5lcik6IFByb21pc2U8dm9pZD47XG4gIGRpc2Nvbm5lY3QoKTogdm9pZDtcbiAgc2VuZE1lc3NhZ2UocGF5bG9hZDogQ2xpZW50TWVzc2FnZSk6IFByb21pc2U8dm9pZD47XG4gIGlzQ29ubmVjdGVkKCk6IGJvb2xlYW47XG4gIG9uQ29ubmVjdGlvbkNoYW5nZShsaXN0ZW5lcjogQ29ubmVjdGlvblN0YXR1c0xpc3RlbmVyKTogKCkgPT4gdm9pZDtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFNvY2tldC5JTyBUcmFuc3BvcnRcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBjbGFzcyBTb2NrZXRJT1RyYW5zcG9ydCBpbXBsZW1lbnRzIFRyYW5zcG9ydCB7XG4gIHByaXZhdGUgc29ja2V0OiBTb2NrZXQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBsaXN0ZW5lcjogTWVzc2FnZUxpc3RlbmVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbWVzc2FnZVF1ZXVlOiBDbGllbnRNZXNzYWdlW10gPSBbXTtcbiAgcHJpdmF0ZSBjb25uZWN0aW9uTGlzdGVuZXJzOiBTZXQ8Q29ubmVjdGlvblN0YXR1c0xpc3RlbmVyPiA9IG5ldyBTZXQoKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHVybDogc3RyaW5nKSB7fVxuXG4gIGNvbm5lY3QobGlzdGVuZXI6IE1lc3NhZ2VMaXN0ZW5lcik6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5zb2NrZXQgPSBpbyh0aGlzLnVybCwge1xuICAgICAgICB0cmFuc3BvcnRzOiBbXCJ3ZWJzb2NrZXRcIl0sXG4gICAgICB9KTtcblxuICAgICAgdGhpcy5zb2NrZXQub24oXCJjb25uZWN0XCIsICgpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coXCJbU29ja2V0SU9UcmFuc3BvcnRdIENvbm5lY3RlZDpcIiwgdGhpcy5zb2NrZXQ/LmlkKTtcblxuICAgICAgICBmb3IgKGNvbnN0IHBheWxvYWQgb2YgdGhpcy5tZXNzYWdlUXVldWUpIHtcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIltTb2NrZXRJT1RyYW5zcG9ydF0gU2VuZGluZyBxdWV1ZWQgbWVzc2FnZTpcIiwgcGF5bG9hZCk7XG4gICAgICAgICAgdGhpcy5zb2NrZXQ/LmVtaXQoXCJtZXNzYWdlXCIsIHBheWxvYWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWVzc2FnZVF1ZXVlID0gW107XG5cbiAgICAgICAgdGhpcy5ub3RpZnlDb25uZWN0aW9uTGlzdGVuZXJzKHRydWUpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5zb2NrZXQub24oXCJjb25uZWN0X2Vycm9yXCIsIChlcnIpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIltTb2NrZXRJT1RyYW5zcG9ydF0gQ29ubmVjdGlvbiBmYWlsZWQ6XCIsIGVycik7XG4gICAgICAgIHRoaXMubm90aWZ5Q29ubmVjdGlvbkxpc3RlbmVycyhmYWxzZSk7XG4gICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuc29ja2V0Lm9uKFwiZGlzY29ubmVjdFwiLCAoKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiW1NvY2tldElPVHJhbnNwb3J0XSBEaXNjb25uZWN0ZWRcIik7XG4gICAgICAgIHRoaXMubm90aWZ5Q29ubmVjdGlvbkxpc3RlbmVycyhmYWxzZSk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5zb2NrZXQub24oXCJtZXNzYWdlXCIsIChkYXRhOiBTZXJ2ZXJNZXNzYWdlKSA9PiB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiW1NvY2tldElPVHJhbnNwb3J0XSBSZWNlaXZlZCBtZXNzYWdlOlwiLCBkYXRhKTtcbiAgICAgICAgdGhpcy5saXN0ZW5lcj8uKGRhdGEpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBkaXNjb25uZWN0KCk6IHZvaWQge1xuICAgIHRoaXMuc29ja2V0Py5kaXNjb25uZWN0KCk7XG4gICAgdGhpcy5zb2NrZXQgPSBudWxsO1xuICAgIHRoaXMubGlzdGVuZXIgPSBudWxsO1xuICAgIHRoaXMubWVzc2FnZVF1ZXVlID0gW107XG4gICAgdGhpcy5jb25uZWN0aW9uTGlzdGVuZXJzLmNsZWFyKCk7XG4gIH1cblxuICBhc3luYyBzZW5kTWVzc2FnZShwYXlsb2FkOiBDbGllbnRNZXNzYWdlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaXNDb25uZWN0ZWQoKSkge1xuICAgICAgLy8gY29uc29sZS5sb2coXCJbU29ja2V0SU9UcmFuc3BvcnRdIFNlbmRpbmc6XCIsIHBheWxvYWQpO1xuICAgICAgdGhpcy5zb2NrZXQhLmVtaXQoXCJtZXNzYWdlXCIsIHBheWxvYWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBjb25zb2xlLmxvZyhcIltTb2NrZXRJT1RyYW5zcG9ydF0gUXVldWluZyBtZXNzYWdlOlwiLCBwYXlsb2FkKTtcbiAgICAgIHRoaXMubWVzc2FnZVF1ZXVlLnB1c2gocGF5bG9hZCk7XG4gICAgfVxuICB9XG5cbiAgaXNDb25uZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc29ja2V0Py5jb25uZWN0ZWQgfHwgZmFsc2U7XG4gIH1cblxuICBvbkNvbm5lY3Rpb25DaGFuZ2UobGlzdGVuZXI6IENvbm5lY3Rpb25TdGF0dXNMaXN0ZW5lcik6ICgpID0+IHZvaWQge1xuICAgIHRoaXMuY29ubmVjdGlvbkxpc3RlbmVycy5hZGQobGlzdGVuZXIpO1xuICAgIGxpc3RlbmVyKHRoaXMuaXNDb25uZWN0ZWQoKSk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHRoaXMuY29ubmVjdGlvbkxpc3RlbmVycy5kZWxldGUobGlzdGVuZXIpO1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIG5vdGlmeUNvbm5lY3Rpb25MaXN0ZW5lcnMoY29ubmVjdGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lcnMpIHtcbiAgICAgIGxpc3RlbmVyKGNvbm5lY3RlZCk7XG4gICAgfVxuICB9XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBJbi1NZW1vcnkgVHJhbnNwb3J0IChmb3IgdGVzdGluZylcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBjbGFzcyBJbk1lbW9yeVRyYW5zcG9ydCBpbXBsZW1lbnRzIFRyYW5zcG9ydCB7XG4gIHByaXZhdGUgbGlzdGVuZXI6IE1lc3NhZ2VMaXN0ZW5lciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGNvbm5lY3RlZCA9IGZhbHNlO1xuICBwcml2YXRlIGNvbm5lY3Rpb25MaXN0ZW5lcnM6IFNldDxDb25uZWN0aW9uU3RhdHVzTGlzdGVuZXI+ID0gbmV3IFNldCgpO1xuXG4gIC8vIFNpbXVsYXRlIHNlcnZlci1zaWRlIG1lc3NhZ2UgZGlzcGF0Y2hpbmdcbiAgcHVibGljIGRpc3BhdGNoTWVzc2FnZShtZXNzYWdlOiBTZXJ2ZXJNZXNzYWdlKSB7XG4gICAgaWYgKHRoaXMubGlzdGVuZXIpIHtcbiAgICAgIC8vIFNpbXVsYXRlIGFzeW5jIGJlaGF2aW9yXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMubGlzdGVuZXI/LihtZXNzYWdlKSwgMCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgY29ubmVjdChsaXN0ZW5lcjogTWVzc2FnZUxpc3RlbmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5saXN0ZW5lciA9IGxpc3RlbmVyO1xuICAgIHRoaXMuY29ubmVjdGVkID0gdHJ1ZTtcbiAgICBjb25zb2xlLmxvZyhcIltJbk1lbW9yeVRyYW5zcG9ydF0gQ29ubmVjdGVkLlwiKTtcbiAgfVxuXG4gIGRpc2Nvbm5lY3QoKTogdm9pZCB7XG4gICAgdGhpcy5saXN0ZW5lciA9IG51bGw7XG4gICAgdGhpcy5jb25uZWN0ZWQgPSBmYWxzZTtcbiAgICBjb25zb2xlLmxvZyhcIltJbk1lbW9yeVRyYW5zcG9ydF0gRGlzY29ubmVjdGVkLlwiKTtcbiAgfVxuXG4gIGFzeW5jIHNlbmRNZXNzYWdlKHBheWxvYWQ6IENsaWVudE1lc3NhZ2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuY29ubmVjdGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJbSW5NZW1vcnlUcmFuc3BvcnRdIE5vdCBjb25uZWN0ZWQuXCIpO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZyhgW0luTWVtb3J5VHJhbnNwb3J0XSBTZW50IG1lc3NhZ2U6YCwgcGF5bG9hZCk7XG4gICAgLy8gSW4gYSByZWFsIHRlc3Qgc2V0dXAsIHRoaXMgbWlnaHQgdHJpZ2dlciBhIHNpbXVsYXRlZCBzZXJ2ZXIgcmVzcG9uc2VcbiAgICAvLyB2aWEgYGRpc3BhdGNoTWVzc2FnZWAuXG4gIH1cblxuICBpc0Nvbm5lY3RlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jb25uZWN0ZWQ7XG4gIH1cblxuICBvbkNvbm5lY3Rpb25DaGFuZ2UobGlzdGVuZXI6IENvbm5lY3Rpb25TdGF0dXNMaXN0ZW5lcik6ICgpID0+IHZvaWQge1xuICAgIHRoaXMuY29ubmVjdGlvbkxpc3RlbmVycy5hZGQobGlzdGVuZXIpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICB0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lcnMuZGVsZXRlKGxpc3RlbmVyKTtcbiAgICB9O1xuICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgTG9hZGVyRnVuY3Rpb25BcmdzIH0gZnJvbSBcInJlYWN0LXJvdXRlclwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJvdXRlSW5mbyB7XG4gIHBhdGhuYW1lOiBzdHJpbmc7XG4gIGhhc2g6IHN0cmluZztcbiAgcXVlcnk6IHN0cmluZztcbiAgcXVlcnlQYXJhbXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIHBhdGhQYXJhbXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD47XG4gIGNhdGNoYWxsOiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RTZXJ2ZXJSb3V0ZUluZm8oe1xuICBwYXJhbXMsXG4gIHJlcXVlc3QsXG59OiBMb2FkZXJGdW5jdGlvbkFyZ3MpIHtcbiAgY29uc3QgeyBcIipcIjogY2F0Y2hhbGwgPSBcIlwiLCAuLi5wYXRoUGFyYW1zIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHBhcnNlZFVybCA9IG5ldyBVUkwocmVxdWVzdC51cmwpO1xuXG4gIHJldHVybiB7XG4gICAgaGFzaDogcGFyc2VkVXJsLmhhc2gsXG4gICAgcGF0aG5hbWU6IHBhcnNlZFVybC5wYXRobmFtZSxcbiAgICBxdWVyeTogcGFyc2VkVXJsLnNlYXJjaCxcbiAgICBxdWVyeVBhcmFtczogT2JqZWN0LmZyb21FbnRyaWVzKHBhcnNlZFVybC5zZWFyY2hQYXJhbXMuZW50cmllcygpKSxcbiAgICBwYXRoUGFyYW1zLFxuICAgIGNhdGNoYWxsOiBjYXRjaGFsbC5sZW5ndGggPiAxID8gY2F0Y2hhbGwuc3BsaXQoXCIvXCIpIDogW10sXG4gIH0gc2F0aXNmaWVzIFJvdXRlSW5mbztcbn0iLAogICAgIi8vIFNlcmlhbGl6YXRpb24gaGVscGVycyB0aGF0IHN1cHBvcnQ6XG4vLyAtIENpcmN1bGFyIHJlZmVyZW5jZXMgdmlhIG9iamVjdCBpZGVudGl0eSByZWZzXG4vLyAtIERhdGUgaW5zdGFuY2VzIOKGkiB7IF9fdDogXCJkYXRldGltZVwiLCB0aW1lc3RhbXAgfVxuLy8gLSBGb3JtRGF0YSDihpIgeyBfX3Q6IFwiZm9ybWRhdGFcIiwgZmllbGRzIH1cbi8vIC0gRmlsZSDihpIgeyBfX3Q6IFwiZmlsZVwiLCBuYW1lLCB0eXBlLCBzaXplLCBsYXN0TW9kaWZpZWQsIGNvbnRlbnQ6IG51bWJlcltdIH1cbi8vIEFsb25nIHdpdGggYSBkZWNvZGVyIGZvciB0aGUgc3ltbWV0cmljIHNoYXBlcyAod2UgZG8gbm90IHJlY29uc3RydWN0IEZpbGUvRm9ybURhdGEgb2JqZWN0cykuXG5cbnR5cGUgRW5jb2RlZFJlZiA9IHsgX190OiBcInJlZlwiOyBpZDogbnVtYmVyIH07XG50eXBlIEVuY29kZWRBcnJheSA9IHsgX190OiBcImFycmF5XCI7IF9faWQ6IG51bWJlcjsgaXRlbXM6IHVua25vd25bXSB9O1xudHlwZSBFbmNvZGVkT2JqZWN0ID0ge1xuICBfX3Q6IFwib2JqZWN0XCI7XG4gIF9faWQ6IG51bWJlcjtcbiAgcHJvcHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufTtcbnR5cGUgRW5jb2RlZERhdGUgPSB7IF9fdDogXCJkYXRldGltZVwiOyB0aW1lc3RhbXA6IG51bWJlciB9O1xudHlwZSBFbmNvZGVkRmlsZSA9IHtcbiAgX190OiBcImZpbGVcIjtcbiAgbmFtZTogc3RyaW5nO1xuICB0eXBlOiBzdHJpbmc7XG4gIHNpemU6IG51bWJlcjtcbiAgbGFzdE1vZGlmaWVkOiBudW1iZXI7XG4gIGNvbnRlbnQ6IG51bWJlcltdOyAvLyByYXcgYnl0ZXMgYXMgYSBKU09OLXNhZmUgbnVtYmVyIGFycmF5XG59O1xudHlwZSBFbmNvZGVkRm9ybURhdGEgPSB7XG4gIF9fdDogXCJmb3JtZGF0YVwiO1xuICBmaWVsZHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24gfCB1bmtub3duW10+O1xufTtcblxudHlwZSBJZGVudGl0eU1hcCA9IFdlYWtNYXA8b2JqZWN0LCBudW1iZXI+O1xuXG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKTtcbiAgcmV0dXJuIHByb3RvID09PSBPYmplY3QucHJvdG90eXBlIHx8IHByb3RvID09PSBudWxsO1xufVxuXG5cbmZ1bmN0aW9uIGlzRGF0ZSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIERhdGUge1xuICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBEYXRlO1xufVxuXG5mdW5jdGlvbiBpc1NraXBwYWJsZSh2YWx1ZTogdW5rbm93bik6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiIHx8XG4gICAgdHlwZW9mIHZhbHVlID09PSBcInN5bWJvbFwiIHx8XG4gICAgdHlwZW9mIHZhbHVlID09PSBcInVuZGVmaW5lZFwiXG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpbGVUb0J5dGVBcnJheShmaWxlOiBGaWxlKTogUHJvbWlzZTxudW1iZXJbXT4ge1xuICBjb25zdCBhYiA9IGF3YWl0IGZpbGUuYXJyYXlCdWZmZXIoKTtcbiAgcmV0dXJuIEFycmF5LmZyb20obmV3IFVpbnQ4QXJyYXkoYWIpKTtcbn1cblxuaW50ZXJmYWNlIEVuY29kZUNvbnRleHQge1xuICBzZWVuOiBJZGVudGl0eU1hcDtcbiAgbmV4dElkOiBudW1iZXI7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbmNvZGVGb3JXaXJlKGlucHV0OiB1bmtub3duKTogUHJvbWlzZTx1bmtub3duPiB7XG4gIGNvbnN0IGN0eDogRW5jb2RlQ29udGV4dCA9IHsgc2VlbjogbmV3IFdlYWtNYXAoKSwgbmV4dElkOiAxIH07XG4gIHJldHVybiBhd2FpdCBlbmNvZGVSZWN1cnNpdmUoaW5wdXQsIGN0eCk7XG59XG5cbmZ1bmN0aW9uIHJlbWVtYmVyKGN0eDogRW5jb2RlQ29udGV4dCwgb2JqOiBvYmplY3QpOiBudW1iZXIgfCBudWxsIHtcbiAgY29uc3QgZXhpc3RpbmcgPSBjdHguc2Vlbi5nZXQob2JqKTtcbiAgaWYgKGV4aXN0aW5nICE9PSB1bmRlZmluZWQpIHJldHVybiBudWxsO1xuICBjb25zdCBpZCA9IGN0eC5uZXh0SWQrKztcbiAgY3R4LnNlZW4uc2V0KG9iaiwgaWQpO1xuICByZXR1cm4gaWQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGVuY29kZVJlY3Vyc2l2ZShcbiAgdmFsdWU6IHVua25vd24sXG4gIGN0eDogRW5jb2RlQ29udGV4dFxuKTogUHJvbWlzZTx1bmtub3duPiB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvLyBTcGVjaWFsIGNhc2VzIGZpcnN0XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICBjb25zdCBkYXRlID0gdmFsdWUgYXMgRGF0ZTtcbiAgICBjb25zdCBlbmNvZGVkOiBFbmNvZGVkRGF0ZSA9IHsgX190OiBcImRhdGV0aW1lXCIsIHRpbWVzdGFtcDogZGF0ZS5nZXRUaW1lKCkgfTtcbiAgICByZXR1cm4gZW5jb2RlZDtcbiAgfVxuXG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEZvcm1EYXRhKSB7XG4gICAgY29uc3QgaWQgPSByZW1lbWJlcihjdHgsIHZhbHVlKTtcbiAgICBpZiAoaWQgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiB7IF9fdDogXCJyZWZcIiwgaWQ6IGN0eC5zZWVuLmdldCh2YWx1ZSBhcyBvYmplY3QpISB9IGFzIEVuY29kZWRSZWY7XG4gICAgfVxuICAgIGNvbnN0IGZpZWxkczogUmVjb3JkPHN0cmluZywgdW5rbm93biB8IHVua25vd25bXT4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZdIG9mIHZhbHVlLmVudHJpZXMoKSkge1xuICAgICAgY29uc3QgZW5jb2RlZFZhbCA9IGF3YWl0IGVuY29kZVJlY3Vyc2l2ZSh2IGFzIHVua25vd24sIGN0eCk7XG4gICAgICBpZiAoZW5jb2RlZFZhbCA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZmllbGRzLCBrZXkpKSB7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nID0gZmllbGRzW2tleV07XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGV4aXN0aW5nKSkge1xuICAgICAgICAgIGV4aXN0aW5nLnB1c2goZW5jb2RlZFZhbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmllbGRzW2tleV0gPSBbZXhpc3RpbmcsIGVuY29kZWRWYWxdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmaWVsZHNba2V5XSA9IGVuY29kZWRWYWw7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGVuY29kZWQ6IEVuY29kZWRGb3JtRGF0YSAmIHsgX19pZDogbnVtYmVyIH0gPSB7XG4gICAgICBfX3Q6IFwiZm9ybWRhdGFcIixcbiAgICAgIGZpZWxkcyxcbiAgICAgIF9faWQ6IGlkLFxuICAgIH0gYXMgYW55O1xuICAgIHJldHVybiBlbmNvZGVkO1xuICB9XG5cbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRmlsZSkge1xuICAgIGNvbnN0IGZpbGUgPSB2YWx1ZTtcbiAgICBjb25zdCBieXRlcyA9IGF3YWl0IGZpbGVUb0J5dGVBcnJheSh2YWx1ZSk7XG4gICAgY29uc3QgZW5jb2RlZDogRW5jb2RlZEZpbGUgPSB7XG4gICAgICBfX3Q6IFwiZmlsZVwiLFxuICAgICAgbmFtZTogZmlsZS5uYW1lLFxuICAgICAgdHlwZTogZmlsZS50eXBlLFxuICAgICAgc2l6ZTogZmlsZS5zaXplLFxuICAgICAgbGFzdE1vZGlmaWVkOiBmaWxlLmxhc3RNb2RpZmllZCxcbiAgICAgIGNvbnRlbnQ6IGJ5dGVzLFxuICAgIH07XG4gICAgcmV0dXJuIGVuY29kZWQ7XG4gIH1cblxuICAvLyBJZGVudGl0eSAvIGNpcmN1bGFyIHJlZmVyZW5jZSBoYW5kbGluZ1xuICBjb25zdCBvYmplY3QgPSB2YWx1ZSBhcyBvYmplY3Q7XG4gIGNvbnN0IGV4aXN0aW5nSWQgPSBjdHguc2Vlbi5nZXQob2JqZWN0KTtcbiAgaWYgKGV4aXN0aW5nSWQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IHJlZjogRW5jb2RlZFJlZiA9IHsgX190OiBcInJlZlwiLCBpZDogZXhpc3RpbmdJZCB9O1xuICAgIHJldHVybiByZWY7XG4gIH1cbiAgY29uc3QgdGhpc0lkID0gY3R4Lm5leHRJZCsrO1xuICBjdHguc2Vlbi5zZXQob2JqZWN0LCB0aGlzSWQpO1xuXG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIGNvbnN0IGl0ZW1zUmF3ID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAodmFsdWUgYXMgdW5rbm93bltdKS5tYXAoKGl0ZW0pID0+IGVuY29kZVJlY3Vyc2l2ZShpdGVtLCBjdHgpKVxuICAgICk7XG4gICAgY29uc3QgaXRlbXMgPSBpdGVtc1Jhdy5maWx0ZXIoKGl0KSA9PiBpdCAhPT0gdW5kZWZpbmVkKSBhcyB1bmtub3duW107XG4gICAgY29uc3QgZW5jb2RlZDogRW5jb2RlZEFycmF5ID0geyBfX3Q6IFwiYXJyYXlcIiwgX19pZDogdGhpc0lkLCBpdGVtcyB9O1xuICAgIHJldHVybiBlbmNvZGVkO1xuICB9XG5cbiAgLy8gUGxhaW4gb2JqZWN0IG9yIG90aGVyIG9iamVjdCB0eXBlc1xuICBjb25zdCBwcm9wczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgaWYgKGlzUGxhaW5PYmplY3QodmFsdWUpKSB7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModmFsdWUpKSB7XG4gICAgICBjb25zdCB2ID0gKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldO1xuICAgICAgaWYgKGlzU2tpcHBhYmxlKHYpKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGVuY29kZWRWID0gYXdhaXQgZW5jb2RlUmVjdXJzaXZlKHYsIGN0eCk7XG4gICAgICBpZiAoZW5jb2RlZFYgIT09IHVuZGVmaW5lZCkgcHJvcHNba2V5XSA9IGVuY29kZWRWO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBOb24tcGxhaW4gb2JqZWN0czogYmVzdCBlZmZvcnQg4oCTIGVudW1lcmF0ZSBlbnVtZXJhYmxlIHByb3BlcnRpZXNcbiAgICBmb3IgKGNvbnN0IGtleSBpbiB2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikge1xuICAgICAgY29uc3QgdiA9ICh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XTtcbiAgICAgIGlmIChpc1NraXBwYWJsZSh2KSkgY29udGludWU7XG4gICAgICBjb25zdCBlbmNvZGVkViA9IGF3YWl0IGVuY29kZVJlY3Vyc2l2ZSh2LCBjdHgpO1xuICAgICAgaWYgKGVuY29kZWRWICE9PSB1bmRlZmluZWQpIHByb3BzW2tleV0gPSBlbmNvZGVkVjtcbiAgICB9XG4gIH1cbiAgY29uc3QgZW5jb2RlZDogRW5jb2RlZE9iamVjdCA9IHsgX190OiBcIm9iamVjdFwiLCBfX2lkOiB0aGlzSWQsIHByb3BzIH07XG4gIHJldHVybiBlbmNvZGVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlRnJvbVdpcmUoaW5wdXQ6IHVua25vd24pOiB1bmtub3duIHtcbiAgcmV0dXJuIGRlY29kZVJlY3Vyc2l2ZShpbnB1dCk7XG59XG5cbmZ1bmN0aW9uIGRlY29kZVJlY3Vyc2l2ZSh2YWx1ZTogdW5rbm93bik6IHVua25vd24ge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiKSByZXR1cm4gdmFsdWU7XG5cbiAgY29uc3Qgb2JqID0gdmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNvbnN0IHRhZyA9IG9ialtcIl9fdFwiXTtcblxuICBpZiAodGFnID09PSBcImRhdGV0aW1lXCIpIHtcbiAgICBjb25zdCB0cyA9IG9ialtcInRpbWVzdGFtcFwiXSBhcyBudW1iZXI7XG4gICAgcmV0dXJuIG5ldyBEYXRlKHRzKTtcbiAgfVxuXG4gIGlmICh0YWcgPT09IFwiZmlsZVwiKSB7XG4gICAgLy8gRG8gbm90IHJlY29uc3RydWN0IEZpbGU7IGtlZXAgYXMgcGxhaW4gb2JqZWN0LiBPcHRpb25hbGx5LCB0dXJuIGNvbnRlbnQgaW50byBVaW50OEFycmF5IGZvciBjb252ZW5pZW5jZS5cbiAgICBjb25zdCBjb250ZW50ID0gb2JqW1wiY29udGVudFwiXTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShjb250ZW50KSkge1xuICAgICAgLy8gUmV0dXJuIGEgc2hhbGxvdyBjbG9uZSB3aXRoIFVpbnQ4QXJyYXkgZm9yIGNvbnRlbnRcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLm9iaixcbiAgICAgICAgY29udGVudDogbmV3IFVpbnQ4QXJyYXkoY29udGVudCBhcyBudW1iZXJbXSksXG4gICAgICB9IGFzIGFueTtcbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIGlmICh0YWcgPT09IFwiZm9ybWRhdGFcIikge1xuICAgIC8vIEtlZXAgYXMtaXMgKHBsYWluIG9iamVjdCksIGJ1dCBkZWNvZGUgbmVzdGVkIHZhbHVlc1xuICAgIGNvbnN0IGZpZWxkcyA9IG9ialtcImZpZWxkc1wiXSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duIHwgdW5rbm93bltdPjtcbiAgICBjb25zdCBkZWNvZGVkRmllbGRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duIHwgdW5rbm93bltdPiA9IHt9O1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGZpZWxkcykpIHtcbiAgICAgIGNvbnN0IHYgPSBmaWVsZHNba2V5XTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHYpKSB7XG4gICAgICAgIGRlY29kZWRGaWVsZHNba2V5XSA9IHYubWFwKCh4KSA9PiBkZWNvZGVSZWN1cnNpdmUoeCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVjb2RlZEZpZWxkc1trZXldID0gZGVjb2RlUmVjdXJzaXZlKHYpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyBfX3Q6IFwiZm9ybWRhdGFcIiwgZmllbGRzOiBkZWNvZGVkRmllbGRzIH0gYXMgRW5jb2RlZEZvcm1EYXRhO1xuICB9XG5cbiAgaWYgKHRhZyA9PT0gXCJhcnJheVwiKSB7XG4gICAgY29uc3QgaXRlbXMgPSAob2JqW1wiaXRlbXNcIl0gYXMgdW5rbm93bltdKS5tYXAoKHgpID0+IGRlY29kZVJlY3Vyc2l2ZSh4KSk7XG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG5cbiAgaWYgKHRhZyA9PT0gXCJvYmplY3RcIikge1xuICAgIGNvbnN0IHByb3BzID0gb2JqW1wicHJvcHNcIl0gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgY29uc3Qgb3V0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHByb3BzKSkge1xuICAgICAgb3V0W2tleV0gPSBkZWNvZGVSZWN1cnNpdmUocHJvcHNba2V5XSk7XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICBpZiAodGFnID09PSBcInJlZlwiKSB7XG4gICAgLy8gV2l0aG91dCBhIHJlY29uc3RydWN0aW9uIGNvbnRleHQgb24gdGhlIGNsaWVudCwgbGVhdmUgYXMtaXMuXG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIC8vIFVua25vd24gb2JqZWN0IOKAkyBkZXNjZW5kIHNoYWxsb3dseVxuICBjb25zdCBjb3B5OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhvYmopKSB7XG4gICAgY29weVtrZXldID0gZGVjb2RlUmVjdXJzaXZlKG9ialtrZXldKTtcbiAgfVxuICByZXR1cm4gY29weTtcbn1cblxuLy8gTGVnYWN5IGNsZWFuZXIga2VwdCBmb3IgY29tcGF0aWJpbGl0eSB3aGVyZSBhIHF1aWNrIGJlc3QtZWZmb3J0IEpTT04tc2FmZSBzaGFwZSBpcyBuZWVkZWRcbmV4cG9ydCBmdW5jdGlvbiBjbGVhbkZvclNlcmlhbGl6YXRpb24ob2JqOiB1bmtub3duKTogdW5rbm93biB7XG4gIHJldHVybiBjbGVhblJlY3Vyc2l2ZShvYmosIG5ldyBXZWFrU2V0KCkpO1xufVxuXG5mdW5jdGlvbiBjbGVhblJlY3Vyc2l2ZShvYmo6IHVua25vd24sIHNlZW46IFdlYWtTZXQ8b2JqZWN0Pik6IHVua25vd24ge1xuICBpZiAob2JqID09PSBudWxsIHx8IHR5cGVvZiBvYmogIT09IFwib2JqZWN0XCIpIHJldHVybiBvYmo7XG4gIGlmIChzZWVuLmhhcyhvYmogYXMgb2JqZWN0KSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgc2Vlbi5hZGQob2JqIGFzIG9iamVjdCk7XG4gIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICByZXR1cm4gKG9iaiBhcyB1bmtub3duW10pXG4gICAgICAubWFwKChpdGVtKSA9PiBjbGVhblJlY3Vyc2l2ZShpdGVtLCBzZWVuKSlcbiAgICAgIC5maWx0ZXIoKHgpID0+IHggIT09IHVuZGVmaW5lZCk7XG4gIH1cbiAgY29uc3Qgb3V0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICBmb3IgKGNvbnN0IGtleSBpbiBvYmogYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIHtcbiAgICBjb25zdCB2ID0gKG9iaiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XTtcbiAgICBpZiAoaXNTa2lwcGFibGUodikpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGNsZWFuZWQgPSBjbGVhblJlY3Vyc2l2ZSh2LCBzZWVuKTtcbiAgICBpZiAoY2xlYW5lZCAhPT0gdW5kZWZpbmVkKSBvdXRba2V5XSA9IGNsZWFuZWQ7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cbiIsCiAgICAiLy8gU2ltcGxlIG9iamVjdCB0cmFuc2Zvcm1hdGlvbiBmb3Igc29ja2V0LmlvIHRyYW5zcG9ydFxuLy8gSGFuZGxlcyBEYXRlcywgRmlsZXMgKHZpYSBzb2NrZXQuaW8gYmluYXJ5KSwgRm9ybURhdGEsIGFuZCBjaXJjdWxhciByZWZlcmVuY2VzXG5cbmZ1bmN0aW9uIGlzRGF0ZSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIERhdGUge1xuICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBEYXRlO1xufVxuXG5mdW5jdGlvbiBpc0ZpbGUodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBGaWxlIHtcbiAgcmV0dXJuIHR5cGVvZiBGaWxlICE9PSBcInVuZGVmaW5lZFwiICYmIHZhbHVlIGluc3RhbmNlb2YgRmlsZTtcbn1cblxuZnVuY3Rpb24gaXNGb3JtRGF0YSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIEZvcm1EYXRhIHtcbiAgcmV0dXJuIHR5cGVvZiBGb3JtRGF0YSAhPT0gXCJ1bmRlZmluZWRcIiAmJiB2YWx1ZSBpbnN0YW5jZW9mIEZvcm1EYXRhO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3RyaW5naWZ5KGlucHV0OiB1bmtub3duKTogdW5rbm93biB7XG4gIGNvbnN0IHNlZW4gPSBuZXcgTWFwPG9iamVjdCwgbnVtYmVyPigpO1xuICBsZXQgbmV4dElkID0gMTtcblxuICBjb25zdCB0cmFuc2Zvcm0gPSAodmFsdWU6IHVua25vd24pOiB1bmtub3duID0+IHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGNpcmN1bGFyIHJlZmVyZW5jZXNcbiAgICBjb25zdCBvYmogPSB2YWx1ZSBhcyBvYmplY3Q7XG4gICAgaWYgKHNlZW4uaGFzKG9iaikpIHtcbiAgICAgIHJldHVybiB7IF9fcmVmOiBzZWVuLmdldChvYmopIH07XG4gICAgfVxuXG4gICAgLy8gU3BlY2lhbCB0eXBlIHRyYW5zZm9ybWF0aW9uc1xuICAgIGlmIChpc0RhdGUodmFsdWUpKSB7XG4gICAgICBjb25zdCBpZCA9IG5leHRJZCsrO1xuICAgICAgc2Vlbi5zZXQob2JqLCBpZCk7XG4gICAgICByZXR1cm4geyBfX3B1bHNlOiBcImRhdGVcIiwgX19pZDogaWQsIHRpbWVzdGFtcDogdmFsdWUuZ2V0VGltZSgpIH07XG4gICAgfVxuXG4gICAgaWYgKGlzRmlsZSh2YWx1ZSkpIHtcbiAgICAgIC8vIFNvY2tldC5pbyBjYW4gaGFuZGxlIEZpbGUgb2JqZWN0cyBkaXJlY3RseSwganVzdCBhZGQgbWV0YWRhdGEgd3JhcHBlclxuICAgICAgY29uc3QgaWQgPSBuZXh0SWQrKztcbiAgICAgIHNlZW4uc2V0KG9iaiwgaWQpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgX19wdWxzZTogXCJmaWxlXCIsXG4gICAgICAgIF9faWQ6IGlkLFxuICAgICAgICBuYW1lOiB2YWx1ZS5uYW1lLFxuICAgICAgICB0eXBlOiB2YWx1ZS50eXBlLFxuICAgICAgICBzaXplOiB2YWx1ZS5zaXplLFxuICAgICAgICBsYXN0TW9kaWZpZWQ6IHZhbHVlLmxhc3RNb2RpZmllZCxcbiAgICAgICAgZmlsZTogdmFsdWUsIC8vIHNvY2tldC5pbyB3aWxsIGhhbmRsZSB0aGUgYmluYXJ5IGRhdGFcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKGlzRm9ybURhdGEodmFsdWUpKSB7XG4gICAgICBjb25zdCBpZCA9IG5leHRJZCsrO1xuICAgICAgc2Vlbi5zZXQob2JqLCBpZCk7XG4gICAgICBjb25zdCBmaWVsZHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24gfCB1bmtub3duW10+ID0ge307XG5cbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiB2YWx1ZS5lbnRyaWVzKCkpIHtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtZWRWYWwgPSB0cmFuc2Zvcm0odmFsKTtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChmaWVsZHMsIGtleSkpIHtcbiAgICAgICAgICBjb25zdCBleGlzdGluZyA9IGZpZWxkc1trZXldO1xuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGV4aXN0aW5nKSkge1xuICAgICAgICAgICAgZXhpc3RpbmcucHVzaCh0cmFuc2Zvcm1lZFZhbCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZpZWxkc1trZXldID0gW2V4aXN0aW5nLCB0cmFuc2Zvcm1lZFZhbF07XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZpZWxkc1trZXldID0gdHJhbnNmb3JtZWRWYWw7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHsgX19wdWxzZTogXCJmb3JtZGF0YVwiLCBfX2lkOiBpZCwgZmllbGRzIH07XG4gICAgfVxuXG4gICAgLy8gUmVndWxhciBvYmplY3RzIGFuZCBhcnJheXNcbiAgICBjb25zdCBpZCA9IG5leHRJZCsrO1xuICAgIHNlZW4uc2V0KG9iaiwgaWQpO1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBfX3B1bHNlOiBcImFycmF5XCIsXG4gICAgICAgIF9faWQ6IGlkLFxuICAgICAgICBpdGVtczogdmFsdWUubWFwKHRyYW5zZm9ybSksXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIFBsYWluIG9iamVjdHMgLSB1c2UgX19wdWxzZV9kYXRhIHRvIGF2b2lkIGNvbmZsaWN0c1xuICAgIGNvbnN0IHVzZXJEYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgIGZvciAoY29uc3Qga2V5IGluIHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSB7XG4gICAgICBjb25zdCB2ID0gKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldO1xuICAgICAgaWYgKFxuICAgICAgICB0eXBlb2YgdiA9PT0gXCJmdW5jdGlvblwiIHx8XG4gICAgICAgIHR5cGVvZiB2ID09PSBcInN5bWJvbFwiIHx8XG4gICAgICAgIHR5cGVvZiB2ID09PSBcInVuZGVmaW5lZFwiXG4gICAgICApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB1c2VyRGF0YVtrZXldID0gdHJhbnNmb3JtKHYpO1xuICAgIH1cblxuICAgIHJldHVybiB7IF9fcHVsc2U6IFwib2JqZWN0XCIsIF9faWQ6IGlkLCBfX2RhdGE6IHVzZXJEYXRhIH07XG4gIH07XG5cbiAgcmV0dXJuIHRyYW5zZm9ybShpbnB1dCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZShpbnB1dDogdW5rbm93bik6IHVua25vd24ge1xuICBjb25zdCBvYmplY3RzID0gbmV3IE1hcDxudW1iZXIsIHVua25vd24+KCk7XG5cbiAgY29uc3QgcmVzb2x2ZSA9ICh2YWx1ZTogdW5rbm93bik6IHVua25vd24gPT4ge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZS5tYXAocmVzb2x2ZSk7XG4gICAgfVxuXG4gICAgY29uc3Qgb2JqID0gdmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgICAvLyBIYW5kbGUgcmVmZXJlbmNlc1xuICAgIGlmIChvYmouX19yZWYgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgaWQgPSBvYmouX19yZWYgYXMgbnVtYmVyO1xuICAgICAgcmV0dXJuIG9iamVjdHMuZ2V0KGlkKSB8fCBudWxsO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBzcGVjaWFsIHR5cGVzIChvbmx5IGlmIHRoZXkgaGF2ZSBfX3B1bHNlIG1hcmtlcilcbiAgICBpZiAob2JqLl9fcHVsc2UgPT09IFwiZGF0ZVwiKSB7XG4gICAgICBjb25zdCBpZCA9IG9iai5fX2lkIGFzIG51bWJlcjtcbiAgICAgIGNvbnN0IHJlc29sdmVkID0gbmV3IERhdGUob2JqLnRpbWVzdGFtcCBhcyBudW1iZXIpO1xuICAgICAgb2JqZWN0cy5zZXQoaWQsIHJlc29sdmVkKTtcbiAgICAgIHJldHVybiByZXNvbHZlZDtcbiAgICB9XG5cbiAgICBpZiAob2JqLl9fcHVsc2UgPT09IFwiZmlsZVwiKSB7XG4gICAgICBjb25zdCBpZCA9IG9iai5fX2lkIGFzIG51bWJlcjtcbiAgICAgIC8vIFJldHVybiB0aGUgb3JpZ2luYWwgRmlsZSBvYmplY3QgZGlyZWN0bHkgKHNvY2tldC5pbyBwcmVzZXJ2ZXMgaXQpXG4gICAgICBjb25zdCByZXNvbHZlZCA9IG9iai5maWxlIGFzIEZpbGU7XG4gICAgICBvYmplY3RzLnNldChpZCwgcmVzb2x2ZWQpO1xuICAgICAgcmV0dXJuIHJlc29sdmVkO1xuICAgIH1cblxuICAgIGlmIChvYmouX19wdWxzZSA9PT0gXCJmb3JtZGF0YVwiKSB7XG4gICAgICBjb25zdCBpZCA9IG9iai5fX2lkIGFzIG51bWJlcjtcbiAgICAgIGNvbnN0IGZpZWxkcyA9IG9iai5maWVsZHMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93biB8IHVua25vd25bXT47XG5cbiAgICAgIC8vIFJlY29uc3RydWN0IEZvcm1EYXRhIG9iamVjdFxuICAgICAgY29uc3QgcmVzb2x2ZWQgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgIG9iamVjdHMuc2V0KGlkLCByZXNvbHZlZCk7XG5cbiAgICAgIGZvciAoY29uc3QgW2tleSwgdl0gb2YgT2JqZWN0LmVudHJpZXMoZmllbGRzKSkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2KSkge1xuICAgICAgICAgIC8vIE11bHRpcGxlIHZhbHVlcyBmb3Igc2FtZSBrZXlcbiAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2Ygdikge1xuICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWRJdGVtID0gcmVzb2x2ZShpdGVtKTtcbiAgICAgICAgICAgIHJlc29sdmVkLmFwcGVuZChrZXksIHJlc29sdmVkSXRlbSBhcyBzdHJpbmcgfCBGaWxlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgcmVzb2x2ZWRWYWx1ZSA9IHJlc29sdmUodik7XG4gICAgICAgICAgcmVzb2x2ZWQuYXBwZW5kKGtleSwgcmVzb2x2ZWRWYWx1ZSBhcyBzdHJpbmcgfCBGaWxlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzb2x2ZWQ7XG4gICAgfVxuXG4gICAgaWYgKG9iai5fX3B1bHNlID09PSBcImFycmF5XCIpIHtcbiAgICAgIGNvbnN0IGlkID0gb2JqLl9faWQgYXMgbnVtYmVyO1xuICAgICAgY29uc3QgcmVzb2x2ZWQ6IHVua25vd25bXSA9IFtdO1xuICAgICAgb2JqZWN0cy5zZXQoaWQsIHJlc29sdmVkKTtcblxuICAgICAgY29uc3QgaXRlbXMgPSBvYmouaXRlbXMgYXMgdW5rbm93bltdO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICByZXNvbHZlZFtpXSA9IHJlc29sdmUoaXRlbXNbaV0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc29sdmVkO1xuICAgIH1cblxuICAgIGlmIChvYmouX19wdWxzZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgY29uc3QgaWQgPSBvYmouX19pZCBhcyBudW1iZXI7XG4gICAgICBjb25zdCByZXNvbHZlZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICAgIG9iamVjdHMuc2V0KGlkLCByZXNvbHZlZCk7XG5cbiAgICAgIGNvbnN0IHVzZXJEYXRhID0gb2JqLl9fZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdl0gb2YgT2JqZWN0LmVudHJpZXModXNlckRhdGEpKSB7XG4gICAgICAgIHJlc29sdmVkW2tleV0gPSByZXNvbHZlKHYpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc29sdmVkO1xuICAgIH1cblxuICAgIC8vIFVua25vd24gb2JqZWN0IHR5cGUgLSBwcm9jZXNzIHByb3BlcnRpZXNcbiAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgZm9yIChjb25zdCBba2V5LCB2XSBvZiBPYmplY3QuZW50cmllcyhvYmopKSB7XG4gICAgICByZXN1bHRba2V5XSA9IHJlc29sdmUodik7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgcmV0dXJuIHJlc29sdmUoaW5wdXQpO1xufVxuIgogIF0sCiAgIm1hcHBpbmdzIjogIkFBQUEsb0JBQ0UsY0FDQSxhQUNBLG1CQUNBLGlCQUNBLGVDTEYsMkJBQ0UsbUJBQ0EsVUFFQSxlQUNBLGVDRkssSUFBTSxFQUFlLGFBQ2YsRUFBcUIsS0E2RTNCLFNBQVMsQ0FBYSxDQUFDLEVBQXFDLENB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UyxPQUFPLEVBQUssQ0FBNkIsRUFFL0MsS0FDTCxJQUFNLEVBQWdCLEVBQVEsQ0FBQyxFQUMvQixFQUFTLE9BQU8sRUFBSyxDQUE4QixFQUl2RCxPQUFPLEVBR1QsR0FBSSxFQUFJLFVBQVksUUFBUyxDQUMzQixJQUFNLEVBQUssRUFBSSxLQUNULEVBQXNCLENBQUMsRUFDN0IsRUFBUSxJQUFJLEVBQUksQ0FBUSxFQUV4QixJQUFNLEVBQVEsRUFBSSxNQUNsQixRQUFTLEVBQUksRUFBRyxFQUFJLEVBQU0sT0FBUSxJQUNoQyxFQUFTLEdBQUssRUFBUSxFQUFNLEVBQUUsRUFFaEMsT0FBTyxFQUdULEdBQUksRUFBSSxVQUFZLFNBQVUsQ0FDNUIsSUFBTSxFQUFLLEVBQUksS0FDVCxFQUFvQyxDQUFDLEVBQzNDLEVBQVEsSUFBSSxFQUFJLENBQVEsRUFFeEIsSUFBTSxFQUFXLEVBQUksT0FDckIsUUFBWSxFQUFLLEtBQU0sT0FBTyxRQUFRLENBQVEsRUFDNUMsRUFBUyxHQUFPLEVBQVEsQ0FBQyxFQUUzQixPQUFPLEVBSVQsSUFBTSxFQUFrQyxDQUFDLEVBQ3pDLFFBQVksRUFBSyxLQUFNLE9BQU8sUUFBUSxDQUFHLEVBQ3ZDLEVBQU8sR0FBTyxFQUFRLENBQUMsRUFFekIsT0FBTyxHQUdULE9BQU8sRUFBUSxDQUFLIiwKICAiZGVidWdJZCI6ICIwRUU3OUMwOTZENkY5RDEyNjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==
|
|
3
|
+
//# debugId=C119E40DCFA6CC5F64756E2164756E21
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3B1bHNlLnRzeCIsICIuLi9zcmMvcmVuZGVyZXIudHN4IiwgIi4uL3NyYy92ZG9tLnRzIiwgIi4uL3NyYy9zZXJpYWxpemUvZXh0cmFjdG9yLnRzIiwgIi4uL3NyYy9zZXJpYWxpemUvZWxlbWVudHMudHMiLCAiLi4vc3JjL3NlcmlhbGl6ZS9ldmVudHMudHMiLCAiLi4vc3JjL3NlcmlhbGl6ZS92My50cyIsICIuLi9zcmMvY2xpZW50LnRzeCIsICIuLi9zcmMvY2hhbm5lbC50cyIsICIuLi9zcmMvdXNlUHVsc2VDaGFubmVsLnRzIiwgIi4uL3NyYy9mb3JtLnRzeCIsICIuLi9zcmMvdHJhbnNwb3J0LnRzIiwgIi4uL3NyYy9oZWxwZXJzLnRzIiwgIi4uL3NyYy9zZXJpYWxpemUvY2xlYW4udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiaW1wb3J0IFJlYWN0LCB7XG4gIHVzZUVmZmVjdCxcbiAgdXNlU3RhdGUsXG4gIHVzZU1lbW8sXG4gIGNyZWF0ZUNvbnRleHQsXG4gIHVzZUNvbnRleHQsXG4gIHR5cGUgQ29tcG9uZW50VHlwZSxcbn0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBWRE9NUmVuZGVyZXIsIGFwcGx5VXBkYXRlcyB9IGZyb20gXCIuL3JlbmRlcmVyXCI7XG5pbXBvcnQgeyBQdWxzZVNvY2tldElPQ2xpZW50IH0gZnJvbSBcIi4vY2xpZW50XCI7XG5pbXBvcnQgdHlwZSB7IFZET00sIENvbXBvbmVudFJlZ2lzdHJ5LCBSZWdpc3RyeUVudHJ5IH0gZnJvbSBcIi4vdmRvbVwiO1xuaW1wb3J0IHsgdXNlTG9jYXRpb24sIHVzZVBhcmFtcywgdXNlTmF2aWdhdGUgfSBmcm9tIFwicmVhY3Qtcm91dGVyXCI7XG5pbXBvcnQgdHlwZSB7IFNlcnZlckVycm9ySW5mbyB9IGZyb20gXCIuL21lc3NhZ2VzXCI7XG5pbXBvcnQgdHlwZSB7IFJvdXRlSW5mbyB9IGZyb20gXCIuL2hlbHBlcnNcIjtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFR5cGVzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgaW50ZXJmYWNlIFB1bHNlQ29uZmlnIHtcbiAgc2VydmVyQWRkcmVzczogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBQdWxzZVByZXJlbmRlciA9IHtcbiAgcmVuZGVySWQ6IHN0cmluZztcbiAgdmlld3M6IFJlY29yZDxzdHJpbmcsIFZET00+O1xufTtcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBDb250ZXh0IGFuZCBIb29rc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLy8gQ29udGV4dCBmb3IgdGhlIGNsaWVudCwgcHJvdmlkZWQgYnkgUHVsc2VQcm92aWRlclxuY29uc3QgUHVsc2VDbGllbnRDb250ZXh0ID0gY3JlYXRlQ29udGV4dDxQdWxzZVNvY2tldElPQ2xpZW50IHwgbnVsbD4obnVsbCk7XG5jb25zdCBQdWxzZVByZXJlbmRlckNvbnRleHQgPSBjcmVhdGVDb250ZXh0PFB1bHNlUHJlcmVuZGVyIHwgbnVsbD4obnVsbCk7XG5cbmV4cG9ydCBjb25zdCB1c2VQdWxzZUNsaWVudCA9ICgpID0+IHtcbiAgY29uc3QgY2xpZW50ID0gdXNlQ29udGV4dChQdWxzZUNsaWVudENvbnRleHQpO1xuICBpZiAoIWNsaWVudCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcInVzZVB1bHNlQ2xpZW50IG11c3QgYmUgdXNlZCB3aXRoaW4gYSBQdWxzZVByb3ZpZGVyXCIpO1xuICB9XG4gIHJldHVybiBjbGllbnQ7XG59O1xuXG5leHBvcnQgY29uc3QgdXNlUHVsc2VQcmVyZW5kZXIgPSAocGF0aDogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IGN0eCA9IHVzZUNvbnRleHQoUHVsc2VQcmVyZW5kZXJDb250ZXh0KTtcbiAgaWYgKCFjdHgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1c2VQdWxzZVByZXJlbmRlciBtdXN0IGJlIHVzZWQgd2l0aGluIGEgUHVsc2VQcm92aWRlclwiKTtcbiAgfVxuICBjb25zdCB2aWV3ID0gY3R4LnZpZXdzW3BhdGhdO1xuICBpZiAoIXZpZXcpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHByZXJlbmRlciBmb3VuZCBmb3IgJyR7cGF0aH0nYCk7XG4gIH1cbiAgcmV0dXJuIHZpZXc7XG59O1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUHJvdmlkZXJcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHVsc2VQcm92aWRlclByb3BzIHtcbiAgY2hpbGRyZW46IFJlYWN0LlJlYWN0Tm9kZTtcbiAgY29uZmlnOiBQdWxzZUNvbmZpZztcbiAgcHJlcmVuZGVyOiBQdWxzZVByZXJlbmRlcjtcbn1cblxuY29uc3QgaW5Ccm93c2VyID0gdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIFB1bHNlUHJvdmlkZXIoe1xuICBjaGlsZHJlbixcbiAgY29uZmlnLFxuICBwcmVyZW5kZXIsXG59OiBQdWxzZVByb3ZpZGVyUHJvcHMpIHtcbiAgY29uc3QgW2Nvbm5lY3RlZCwgc2V0Q29ubmVjdGVkXSA9IHVzZVN0YXRlKHRydWUpO1xuICBjb25zdCByck5hdmlnYXRlID0gdXNlTmF2aWdhdGUoKTtcbiAgY29uc3QgeyByZW5kZXJJZCB9ID0gcHJlcmVuZGVyO1xuXG4gIGNvbnN0IGNsaWVudCA9IHVzZU1lbW8oXG4gICAgKCkgPT4gbmV3IFB1bHNlU29ja2V0SU9DbGllbnQoY29uZmlnLnNlcnZlckFkZHJlc3MsIHJlbmRlcklkLCByck5hdmlnYXRlKSxcbiAgICBbY29uZmlnLnNlcnZlckFkZHJlc3MsIHJyTmF2aWdhdGUsIHJlbmRlcklkXVxuICApO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiBjbGllbnQub25Db25uZWN0aW9uQ2hhbmdlKHNldENvbm5lY3RlZCksIFtjbGllbnRdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChpbkJyb3dzZXIpIHtcbiAgICAgIGNsaWVudC5jb25uZWN0KCk7XG4gICAgICByZXR1cm4gKCkgPT4gY2xpZW50LmRpc2Nvbm5lY3QoKTtcbiAgICB9XG4gIH0sIFtjbGllbnRdKTtcblxuICByZXR1cm4gKFxuICAgIDxQdWxzZUNsaWVudENvbnRleHQuUHJvdmlkZXIgdmFsdWU9e2NsaWVudH0+XG4gICAgICA8UHVsc2VQcmVyZW5kZXJDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXtwcmVyZW5kZXJ9PlxuICAgICAgICB7IWNvbm5lY3RlZCAmJiAoXG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgcG9zaXRpb246IFwiZml4ZWRcIixcbiAgICAgICAgICAgICAgYm90dG9tOiBcIjIwcHhcIixcbiAgICAgICAgICAgICAgcmlnaHQ6IFwiMjBweFwiLFxuICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwicmVkXCIsXG4gICAgICAgICAgICAgIGNvbG9yOiBcIndoaXRlXCIsXG4gICAgICAgICAgICAgIHBhZGRpbmc6IFwiMTBweFwiLFxuICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6IFwiNXB4XCIsXG4gICAgICAgICAgICAgIHpJbmRleDogMTAwMCxcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgPlxuICAgICAgICAgICAgRmFpbGVkIHRvIGNvbm5lY3QgdG8gdGhlIHNlcnZlci5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKX1cbiAgICAgICAge2NoaWxkcmVufVxuICAgICAgPC9QdWxzZVByZXJlbmRlckNvbnRleHQuUHJvdmlkZXI+XG4gICAgPC9QdWxzZUNsaWVudENvbnRleHQuUHJvdmlkZXI+XG4gICk7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBWaWV3XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgaW50ZXJmYWNlIFB1bHNlVmlld1Byb3BzIHtcbiAgZXh0ZXJuYWxDb21wb25lbnRzOiBDb21wb25lbnRSZWdpc3RyeTtcbiAgcGF0aDogc3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gUHVsc2VWaWV3KHsgZXh0ZXJuYWxDb21wb25lbnRzLCBwYXRoIH06IFB1bHNlVmlld1Byb3BzKSB7XG4gIGNvbnN0IGNsaWVudCA9IHVzZVB1bHNlQ2xpZW50KCk7XG4gIGNvbnN0IGluaXRpYWxWRE9NID0gdXNlUHVsc2VQcmVyZW5kZXIocGF0aCk7XG4gIGNvbnN0IHJlbmRlcmVyID0gdXNlTWVtbyhcbiAgICAoKSA9PiBuZXcgVkRPTVJlbmRlcmVyKGNsaWVudCwgcGF0aCwgZXh0ZXJuYWxDb21wb25lbnRzKSxcbiAgICBbY2xpZW50LCBwYXRoLCBleHRlcm5hbENvbXBvbmVudHNdXG4gICk7XG4gIGNvbnN0IFt0cmVlLCBzZXRUcmVlXSA9IHVzZVN0YXRlPFJlYWN0LlJlYWN0Tm9kZT4oKCkgPT5cbiAgICByZW5kZXJlci5yZW5kZXJOb2RlKGluaXRpYWxWRE9NKVxuICApO1xuICBjb25zdCBbc2VydmVyRXJyb3IsIHNldFNlcnZlckVycm9yXSA9IHVzZVN0YXRlPFNlcnZlckVycm9ySW5mbyB8IG51bGw+KG51bGwpO1xuXG4gIGNvbnN0IGxvY2F0aW9uID0gdXNlTG9jYXRpb24oKTtcbiAgY29uc3QgcGFyYW1zID0gdXNlUGFyYW1zKCk7XG5cbiAgY29uc3Qgcm91dGVJbmZvID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgeyBcIipcIjogY2F0Y2hhbGwgPSBcIlwiLCAuLi5wYXRoUGFyYW1zIH0gPSBwYXJhbXM7XG4gICAgY29uc3QgcXVlcnlQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKGxvY2F0aW9uLnNlYXJjaCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGhhc2g6IGxvY2F0aW9uLmhhc2gsXG4gICAgICBwYXRobmFtZTogbG9jYXRpb24ucGF0aG5hbWUsXG4gICAgICBxdWVyeTogbG9jYXRpb24uc2VhcmNoLFxuICAgICAgcXVlcnlQYXJhbXM6IE9iamVjdC5mcm9tRW50cmllcyhxdWVyeVBhcmFtcy5lbnRyaWVzKCkpLFxuICAgICAgcGF0aFBhcmFtcyxcbiAgICAgIGNhdGNoYWxsOiBjYXRjaGFsbC5sZW5ndGggPiAwID8gY2F0Y2hhbGwuc3BsaXQoXCIvXCIpIDogW10sXG4gICAgfSBzYXRpc2ZpZXMgUm91dGVJbmZvO1xuICB9LCBbXG4gICAgbG9jYXRpb24uaGFzaCxcbiAgICBsb2NhdGlvbi5wYXRobmFtZSxcbiAgICBsb2NhdGlvbi5zZWFyY2gsXG4gICAgSlNPTi5zdHJpbmdpZnkocGFyYW1zKSxcbiAgXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoaW5Ccm93c2VyKSB7XG4gICAgICBjbGllbnQubW91bnRWaWV3KHBhdGgsIHtcbiAgICAgICAgcm91dGVJbmZvLFxuICAgICAgICBvbkluaXQ6ICh2ZG9tKSA9PiB7XG4gICAgICAgICAgc2V0VHJlZShyZW5kZXJlci5yZW5kZXJOb2RlKHZkb20pKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25VcGRhdGU6IChvcHMpID0+IHtcbiAgICAgICAgICBzZXRUcmVlKChwcmV2KSA9PlxuICAgICAgICAgICAgcHJldiA9PSBudWxsID8gcHJldiA6IGFwcGx5VXBkYXRlcyhwcmV2LCBvcHMsIHJlbmRlcmVyKVxuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IG9mZkVyciA9IGNsaWVudC5vblNlcnZlckVycm9yKChwLCBlcnIpID0+IHtcbiAgICAgICAgaWYgKHAgPT09IHBhdGgpIHNldFNlcnZlckVycm9yKGVycik7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIG9mZkVycigpO1xuICAgICAgICBjbGllbnQudW5tb3VudChwYXRoKTtcbiAgICAgIH07XG4gICAgfVxuICAgIC8vIHJvdXRlSW5mbyBpcyBOT1QgaW5jbHVkZWQgaGVyZSBvbiBwdXJwb3NlXG4gIH0sIFtjbGllbnRdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChpbkJyb3dzZXIpIHtcbiAgICAgIGNsaWVudC5uYXZpZ2F0ZShwYXRoLCByb3V0ZUluZm8pO1xuICAgIH1cbiAgfSwgW2NsaWVudCwgcGF0aCwgcm91dGVJbmZvXSk7XG5cbiAgaWYgKHNlcnZlckVycm9yKSB7XG4gICAgcmV0dXJuIDxTZXJ2ZXJFcnJvciBlcnJvcj17c2VydmVyRXJyb3J9IC8+O1xuICB9XG5cbiAgcmV0dXJuIHRyZWU7XG59XG5cbmZ1bmN0aW9uIFNlcnZlckVycm9yKHsgZXJyb3IgfTogeyBlcnJvcjogU2VydmVyRXJyb3JJbmZvIH0pIHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICBzdHlsZT17e1xuICAgICAgICBwYWRkaW5nOiAxNixcbiAgICAgICAgYm9yZGVyOiBcIjFweCBzb2xpZCAjZTAwXCIsXG4gICAgICAgIGJhY2tncm91bmQ6IFwiI2ZmZjVmNVwiLFxuICAgICAgICBjb2xvcjogXCIjOTAwXCIsXG4gICAgICAgIGZvbnRGYW1pbHk6XG4gICAgICAgICAgJ3VpLW1vbm9zcGFjZSwgU0ZNb25vLVJlZ3VsYXIsIE1lbmxvLCBNb25hY28sIENvbnNvbGFzLCBcIkxpYmVyYXRpb24gTW9ub1wiLCBcIkNvdXJpZXIgTmV3XCIsIG1vbm9zcGFjZScsXG4gICAgICAgIHdoaXRlU3BhY2U6IFwicHJlLXdyYXBcIixcbiAgICAgIH19XG4gICAgPlxuICAgICAgPGRpdiBzdHlsZT17eyBmb250V2VpZ2h0OiA3MDAsIG1hcmdpbkJvdHRvbTogOCB9fT5cbiAgICAgICAgU2VydmVyIEVycm9yIGR1cmluZyB7ZXJyb3IucGhhc2V9XG4gICAgICA8L2Rpdj5cbiAgICAgIHtlcnJvci5tZXNzYWdlICYmIDxkaXY+e2Vycm9yLm1lc3NhZ2V9PC9kaXY+fVxuICAgICAge2Vycm9yLnN0YWNrICYmIChcbiAgICAgICAgPGRldGFpbHMgb3BlbiBzdHlsZT17eyBtYXJnaW5Ub3A6IDggfX0+XG4gICAgICAgICAgPHN1bW1hcnk+U3RhY2sgdHJhY2U8L3N1bW1hcnk+XG4gICAgICAgICAgPHByZSBzdHlsZT17eyBtYXJnaW46IDAgfX0+e2Vycm9yLnN0YWNrfTwvcHJlPlxuICAgICAgICA8L2RldGFpbHM+XG4gICAgICApfVxuICAgIDwvZGl2PlxuICApO1xufVxuIiwKICAgICJpbXBvcnQgUmVhY3QsIHtcbiAgY2xvbmVFbGVtZW50LFxuICBjcmVhdGVFbGVtZW50LFxuICBpc1ZhbGlkRWxlbWVudCxcbiAgbGF6eSxcbiAgU3VzcGVuc2UsXG4gIHR5cGUgQ29tcG9uZW50VHlwZSxcbn0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgdHlwZSB7IENvbXBvbmVudFJlZ2lzdHJ5LCBWRE9NTm9kZSwgVkRPTVVwZGF0ZSB9IGZyb20gXCIuL3Zkb21cIjtcbmltcG9ydCB7XG4gIEZSQUdNRU5UX1RBRyxcbiAgaXNFbGVtZW50Tm9kZSxcbiAgaXNNb3VudFBvaW50Tm9kZSxcbiAgTU9VTlRfUE9JTlRfUFJFRklYLFxufSBmcm9tIFwiLi92ZG9tXCI7XG5pbXBvcnQgdHlwZSB7IFB1bHNlU29ja2V0SU9DbGllbnQgfSBmcm9tIFwiLi9jbGllbnRcIjtcblxuZXhwb3J0IGNsYXNzIFZET01SZW5kZXJlciB7XG4gIHByaXZhdGUgY2FsbGJhY2tDYWNoZTogTWFwPHN0cmluZywgKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkPjtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjbGllbnQ6IFB1bHNlU29ja2V0SU9DbGllbnQsXG4gICAgcHJpdmF0ZSBwYXRoOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBjb21wb25lbnRzOiBDb21wb25lbnRSZWdpc3RyeVxuICApIHtcbiAgICB0aGlzLmNhbGxiYWNrQ2FjaGUgPSBuZXcgTWFwKCk7XG4gIH1cblxuICBnZXRDYWxsYmFjayhrZXk6IHN0cmluZykge1xuICAgIGxldCBmbiA9IHRoaXMuY2FsbGJhY2tDYWNoZS5nZXQoa2V5KTtcbiAgICBpZiAoIWZuKSB7XG4gICAgICBmbiA9ICguLi5hcmdzKSA9PiB0aGlzLmNsaWVudC5pbnZva2VDYWxsYmFjayh0aGlzLnBhdGgsIGtleSwgYXJncyk7XG4gICAgICB0aGlzLmNhbGxiYWNrQ2FjaGUuc2V0KGtleSwgZm4pO1xuICAgIH1cbiAgICByZXR1cm4gZm47XG4gIH1cblxuICByZW5kZXJOb2RlKG5vZGU6IFZET01Ob2RlKTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgICAvLyBIYW5kbGUgcHJpbWl0aXZlcyBlYXJseVxuICAgIGlmIChcbiAgICAgIG5vZGUgPT0gbnVsbCB8fCAvLyBjYXRjaGVzIGJvdGggbnVsbCBhbmQgdW5kZWZpbmVkXG4gICAgICB0eXBlb2Ygbm9kZSA9PT0gXCJib29sZWFuXCIgfHxcbiAgICAgIHR5cGVvZiBub2RlID09PSBcIm51bWJlclwiIHx8XG4gICAgICB0eXBlb2Ygbm9kZSA9PT0gXCJzdHJpbmdcIlxuICAgICkge1xuICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuXG4gICAgLy8gRWxlbWVudCBub2Rlc1xuICAgIGlmIChpc0VsZW1lbnROb2RlKG5vZGUpKSB7XG4gICAgICBjb25zdCB7IHRhZywgcHJvcHMgPSB7fSwgY2hpbGRyZW4gPSBbXSB9ID0gbm9kZTtcblxuICAgICAgLy8gUHJvY2VzcyBwcm9wcyBmb3IgY2FsbGJhY2tzXG4gICAgICBjb25zdCBwcm9jZXNzZWRQcm9wczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgICAgZm9yIChjb25zdCBbcHJvcEtleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHByb3BzKSkge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIHZhbHVlLnN0YXJ0c1dpdGgoXCIkJGZuOlwiKSkge1xuICAgICAgICAgIGNvbnN0IGNhbGxiYWNrS2V5ID0gdmFsdWUuc3Vic3RyaW5nKFwiJCRmbjpcIi5sZW5ndGgpO1xuICAgICAgICAgIHByb2Nlc3NlZFByb3BzW3Byb3BLZXldID0gdGhpcy5nZXRDYWxsYmFjayhjYWxsYmFja0tleSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvY2Vzc2VkUHJvcHNbcHJvcEtleV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG5vZGUua2V5KSB7XG4gICAgICAgIHByb2Nlc3NlZFByb3BzLmtleSA9IG5vZGUua2V5O1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZW5kZXJlZENoaWxkcmVuID0gW107XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgICAgIHJlbmRlcmVkQ2hpbGRyZW4ucHVzaCh0aGlzLnJlbmRlck5vZGUoY2hpbGQpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzTW91bnRQb2ludE5vZGUobm9kZSkpIHtcbiAgICAgICAgY29uc3QgY29tcG9uZW50S2V5ID0gbm9kZS50YWcuc2xpY2UoTU9VTlRfUE9JTlRfUFJFRklYLmxlbmd0aCk7XG4gICAgICAgIGNvbnN0IENvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50c1tjb21wb25lbnRLZXldITtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoQ29tcG9uZW50LCBwcm9jZXNzZWRQcm9wcywgLi4ucmVuZGVyZWRDaGlsZHJlbik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjcmVhdGVFbGVtZW50KFxuICAgICAgICB0YWcgPT09IEZSQUdNRU5UX1RBRyA/IFJlYWN0LkZyYWdtZW50IDogdGFnLFxuICAgICAgICBwcm9jZXNzZWRQcm9wcyxcbiAgICAgICAgLi4ucmVuZGVyZWRDaGlsZHJlblxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayBmb3IgdW5rbm93biBub2RlIHR5cGVzXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgY29uc29sZS5lcnJvcihcIlVua25vd24gVkRPTSBub2RlIHR5cGU6XCIsIG5vZGUpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVXBkYXRlIEZ1bmN0aW9ucyAoc2hhbGxvdy1jbG9uZSBhbG9uZyB1cGRhdGUgcGF0aClcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIHRvQ2hpbGRyZW5BcnJheUZyb21FbGVtZW50KGVsOiBSZWFjdC5SZWFjdEVsZW1lbnQpOiBSZWFjdC5SZWFjdE5vZGVbXSB7XG4gIGNvbnN0IGNoaWxkcmVuID0gKGVsLnByb3BzIGFzIGFueSk/LmNoaWxkcmVuIGFzIFJlYWN0LlJlYWN0Tm9kZSB8IHVuZGVmaW5lZDtcbiAgaWYgKGNoaWxkcmVuID09IG51bGwpIHJldHVybiBbXTtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoY2hpbGRyZW4pID8gY2hpbGRyZW4uc2xpY2UoKSA6IFtjaGlsZHJlbl07XG59XG5cbmZ1bmN0aW9uIHByb2Nlc3NQcm9wc0ZvckNhbGxiYWNrcyhcbiAgcmVuZGVyZXI6IFZET01SZW5kZXJlcixcbiAgcHJvcHM6IFJlY29yZDxzdHJpbmcsIGFueT5cbik6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICBjb25zdCBwcm9jZXNzZWQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgZm9yIChjb25zdCBbcHJvcEtleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHByb3BzIHx8IHt9KSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgdmFsdWUuc3RhcnRzV2l0aChcIiQkZm46XCIpKSB7XG4gICAgICBjb25zdCBjYWxsYmFja0tleSA9IHZhbHVlLnN1YnN0cmluZyhcIiQkZm46XCIubGVuZ3RoKTtcbiAgICAgIHByb2Nlc3NlZFtwcm9wS2V5XSA9IHJlbmRlcmVyLmdldENhbGxiYWNrKGNhbGxiYWNrS2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvY2Vzc2VkW3Byb3BLZXldID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBwcm9jZXNzZWQ7XG59XG5cbmZ1bmN0aW9uIGNsb25lRWxlbWVudFdpdGhDaGlsZHJlbihcbiAgZWw6IFJlYWN0LlJlYWN0RWxlbWVudCxcbiAgY2hpbGRyZW46IFJlYWN0LlJlYWN0Tm9kZVtdXG4pOiBSZWFjdC5SZWFjdEVsZW1lbnQge1xuICAvLyBQcmVzZXJ2ZSBleGlzdGluZyBwcm9wczsgb25seSBvdmVycmlkZSBjaGlsZHJlblxuICByZXR1cm4gY2xvbmVFbGVtZW50KGVsLCB1bmRlZmluZWQsIC4uLmNoaWxkcmVuKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5VXBkYXRlcyhcbiAgaW5pdGlhbFRyZWU6IFJlYWN0LlJlYWN0Tm9kZSxcbiAgdXBkYXRlczogVkRPTVVwZGF0ZVtdLFxuICByZW5kZXJlcjogVkRPTVJlbmRlcmVyXG4pOiBSZWFjdC5SZWFjdE5vZGUge1xuICBsZXQgbmV3VHJlZTogUmVhY3QuUmVhY3ROb2RlID0gaW5pdGlhbFRyZWU7XG4gIGZvciAoY29uc3QgdXBkYXRlIG9mIHVwZGF0ZXMpIHtcbiAgICBjb25zdCBwYXJ0cyA9IHVwZGF0ZS5wYXRoXG4gICAgICAuc3BsaXQoXCIuXCIpXG4gICAgICAuZmlsdGVyKChzKSA9PiBzLmxlbmd0aCA+IDApXG4gICAgICAubWFwKE51bWJlcik7XG5cbiAgICBjb25zdCBkZXNjZW5kID0gKG5vZGU6IFJlYWN0LlJlYWN0Tm9kZSwgZGVwdGg6IG51bWJlcik6IFJlYWN0LlJlYWN0Tm9kZSA9PiB7XG4gICAgICBpZiAoZGVwdGggPCBwYXJ0cy5sZW5ndGgpIHtcbiAgICAgICAgYXNzZXJ0SXNFbGVtZW50KG5vZGUsIHBhcnRzLCBkZXB0aCk7XG4gICAgICAgIG5vZGUgPSBub2RlIGFzIFJlYWN0LlJlYWN0RWxlbWVudDtcbiAgICAgICAgY29uc3QgY2hpbGRJZHggPSBwYXJ0c1tkZXB0aF0hO1xuICAgICAgICBjb25zdCBjaGlsZHJlbkFyciA9IHRvQ2hpbGRyZW5BcnJheUZyb21FbGVtZW50KG5vZGUpO1xuICAgICAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuQXJyW2NoaWxkSWR4XTtcbiAgICAgICAgY2hpbGRyZW5BcnJbY2hpbGRJZHhdID0gZGVzY2VuZChjaGlsZCwgZGVwdGggKyAxKSBhcyBhbnk7XG4gICAgICAgIHJldHVybiBjbG9uZUVsZW1lbnRXaXRoQ2hpbGRyZW4obm9kZSwgY2hpbGRyZW5BcnIpO1xuICAgICAgfVxuICAgICAgc3dpdGNoICh1cGRhdGUudHlwZSkge1xuICAgICAgICBjYXNlIFwicmVwbGFjZVwiOiB7XG4gICAgICAgICAgcmV0dXJuIHJlbmRlcmVyLnJlbmRlck5vZGUodXBkYXRlLmRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJ1cGRhdGVfcHJvcHNcIjoge1xuICAgICAgICAgIGFzc2VydElzRWxlbWVudChub2RlLCBwYXJ0cywgZGVwdGgpO1xuICAgICAgICAgIG5vZGUgPSBub2RlIGFzIFJlYWN0LlJlYWN0RWxlbWVudDtcbiAgICAgICAgICBjb25zdCBjdXJyZW50UHJvcHMgPSAobm9kZS5wcm9wcyA/PyB7fSkgYXMgb2JqZWN0O1xuICAgICAgICAgIGNvbnN0IG5leHRQcm9wczogUmVjb3JkPHN0cmluZywgYW55PiA9IHsgLi4uY3VycmVudFByb3BzIH07XG4gICAgICAgICAgY29uc3QgZGVsdGEgPSB1cGRhdGUuZGF0YTtcbiAgICAgICAgICBpZiAoZGVsdGEucmVtb3ZlICYmIGRlbHRhLnJlbW92ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBkZWx0YS5yZW1vdmUpIHtcbiAgICAgICAgICAgICAgaWYgKGtleSBpbiBuZXh0UHJvcHMpIGRlbGV0ZSBuZXh0UHJvcHNba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGRlbHRhLnNldCkge1xuICAgICAgICAgICAgY29uc3QgcHJvY2Vzc2VkID0gcHJvY2Vzc1Byb3BzRm9yQ2FsbGJhY2tzKHJlbmRlcmVyLCBkZWx0YS5zZXQpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMocHJvY2Vzc2VkKSkge1xuICAgICAgICAgICAgICBuZXh0UHJvcHNba10gPSB2O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBOb3QgcGFzc2luZyBjaGlsZHJlbiAtPiBvbmx5IHVwZGF0ZSB0aGUgcHJvcHNcbiAgICAgICAgICByZXR1cm4gY2xvbmVFbGVtZW50KG5vZGUsIG5leHRQcm9wcyk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcImluc2VydFwiOiB7XG4gICAgICAgICAgYXNzZXJ0SXNFbGVtZW50KG5vZGUsIHBhcnRzLCBkZXB0aCk7XG4gICAgICAgICAgbm9kZSA9IG5vZGUgYXMgUmVhY3QuUmVhY3RFbGVtZW50O1xuICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gdG9DaGlsZHJlbkFycmF5RnJvbUVsZW1lbnQobm9kZSk7XG4gICAgICAgICAgY2hpbGRyZW4uc3BsaWNlKHVwZGF0ZS5pZHgsIDAsIHJlbmRlcmVyLnJlbmRlck5vZGUodXBkYXRlLmRhdGEpKTtcbiAgICAgICAgICAvLyBPbmx5IHVwZGF0ZSB0aGUgY2hpbGRyZW4gKFR5cGVTY3JpcHQgZG9lc24ndCBsaWtlIHRoZSBgbnVsbGAsIGJ1dCB0aGF0J3Mgd2hhdCB0aGUgb2ZmaWNpYWwgUmVhY3QgZG9jcyBzYXkpXG4gICAgICAgICAgcmV0dXJuIGNsb25lRWxlbWVudChub2RlLCBudWxsISwgLi4uY2hpbGRyZW4pO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJyZW1vdmVcIjoge1xuICAgICAgICAgIGFzc2VydElzRWxlbWVudChub2RlLCBwYXJ0cywgZGVwdGgpO1xuICAgICAgICAgIG5vZGUgPSBub2RlIGFzIFJlYWN0LlJlYWN0RWxlbWVudDtcbiAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IHRvQ2hpbGRyZW5BcnJheUZyb21FbGVtZW50KG5vZGUpO1xuICAgICAgICAgIGNoaWxkcmVuLnNwbGljZSh1cGRhdGUuaWR4LCAxKTtcbiAgICAgICAgICAvLyBPbmx5IHVwZGF0ZSB0aGUgY2hpbGRyZW4gKFR5cGVTY3JpcHQgZG9lc24ndCBsaWtlIHRoZSBgbnVsbGAsIGJ1dCB0aGF0J3Mgd2hhdCB0aGUgb2ZmaWNpYWwgUmVhY3QgZG9jcyBzYXkpXG4gICAgICAgICAgcmV0dXJuIGNsb25lRWxlbWVudChub2RlLCBudWxsISwgLi4uY2hpbGRyZW4pO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJtb3ZlXCI6IHtcbiAgICAgICAgICBhc3NlcnRJc0VsZW1lbnQobm9kZSwgcGFydHMsIGRlcHRoKTtcbiAgICAgICAgICBub2RlID0gbm9kZSBhcyBSZWFjdC5SZWFjdEVsZW1lbnQ7XG4gICAgICAgICAgY29uc3QgY2hpbGRyZW4gPSB0b0NoaWxkcmVuQXJyYXlGcm9tRWxlbWVudChub2RlKTtcbiAgICAgICAgICBjb25zdCBpdGVtID0gY2hpbGRyZW4uc3BsaWNlKHVwZGF0ZS5kYXRhLmZyb21faW5kZXgsIDEpWzBdO1xuICAgICAgICAgIGNoaWxkcmVuLnNwbGljZSh1cGRhdGUuZGF0YS50b19pbmRleCwgMCwgaXRlbSk7XG4gICAgICAgICAgLy8gT25seSB1cGRhdGUgdGhlIGNoaWxkcmVuIChUeXBlU2NyaXB0IGRvZXNuJ3QgbGlrZSB0aGUgYG51bGxgLCBidXQgdGhhdCdzIHdoYXQgdGhlIG9mZmljaWFsIFJlYWN0IGRvY3Mgc2F5KVxuICAgICAgICAgIHJldHVybiBjbG9uZUVsZW1lbnQobm9kZSwgbnVsbCEsIC4uLmNoaWxkcmVuKTtcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBbUHVsc2UgcmVuZGVyZXJdIFVua25vd24gdXBkYXRlIHR5cGU6ICR7dXBkYXRlW1widHlwZVwiXX1gXG4gICAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgbmV3VHJlZSA9IGRlc2NlbmQobmV3VHJlZSwgMCk7XG4gIH1cbiAgcmV0dXJuIG5ld1RyZWU7XG59XG5cbi8vIFRoZSBgY29tcG9uZW50YCBwcm9wIHNob3VsZCBiZSBzb21ldGhpbmcgbGlrZSBgKCkgPT5cbi8vIGltcG9ydCgnfi9wYXRoL3RvL2NvbXBvbmVudCcpICh3ZSdsbCBuZWVkIHRvIHJlbWFwIGlmIHdlJ3JlIGltcG9ydGluZyBhIG5hbWVkIGV4cG9ydCBhbmQgbm90IHRoZSBkZWZhdWx0KVxuZXhwb3J0IGZ1bmN0aW9uIFJlbmRlckxhenkoXG4gIGNvbXBvbmVudDogKCkgPT4gUHJvbWlzZTx7IGRlZmF1bHQ6IENvbXBvbmVudFR5cGU8YW55PiB9PixcbiAgZmFsbGJhY2s/OiBSZWFjdC5SZWFjdE5vZGVcbik6IFJlYWN0LkZDPFJlYWN0LlByb3BzV2l0aENoaWxkcmVuPHVua25vd24+PiB7XG4gIGNvbnN0IENvbXBvbmVudCA9IGxhenkoY29tcG9uZW50KTtcbiAgcmV0dXJuICh7IGNoaWxkcmVuLCAuLi5wcm9wcyB9OiBSZWFjdC5Qcm9wc1dpdGhDaGlsZHJlbjx1bmtub3duPikgPT4ge1xuICAgIHJldHVybiAoXG4gICAgICA8U3VzcGVuc2UgZmFsbGJhY2s9e2ZhbGxiYWNrID8/IDw+PC8+fT5cbiAgICAgICAgPENvbXBvbmVudCB7Li4ucHJvcHN9PntjaGlsZHJlbn08L0NvbXBvbmVudD5cbiAgICAgIDwvU3VzcGVuc2U+XG4gICAgKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXNzZXJ0SXNFbGVtZW50KFxuICBub2RlOiBSZWFjdC5SZWFjdE5vZGUsXG4gIHBhcnRzOiBudW1iZXJbXSxcbiAgZGVwdGg6IG51bWJlclxuKTogbm9kZSBpcyBSZWFjdC5SZWFjdEVsZW1lbnQge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiICYmICFpc1ZhbGlkRWxlbWVudChub2RlKSkge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJJbnZhbGlkIG5vZGU6XCIsIG5vZGUpO1xuICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgbm9kZSBhdCBwYXRoIFwiICsgcGFydHMuc2xpY2UoMCwgZGVwdGgpLmpvaW4oXCIuXCIpKTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBDb21wb25lbnRUeXBlIH0gZnJvbSBcInJlYWN0XCI7XG5cbi8vIFNwZWNpYWwgcHJlZml4ZXMgZm9yIHJlc2VydmVkIG5vZGUgdHlwZXNcbmV4cG9ydCBjb25zdCBGUkFHTUVOVF9UQUcgPSBcIiQkZnJhZ21lbnRcIjtcbmV4cG9ydCBjb25zdCBNT1VOVF9QT0lOVF9QUkVGSVggPSBcIiQkXCI7XG5cbi8vIGV4cG9ydCB0eXBlIExhenlDb21wb25lbnQgPSAoKSA9PiBQcm9taXNlPHsgZGVmYXVsdDogQ29tcG9uZW50VHlwZTxhbnk+IH0+O1xuZXhwb3J0IHR5cGUgUmVnaXN0cnlFbnRyeSA9IENvbXBvbmVudFR5cGU8YW55PjtcbmV4cG9ydCB0eXBlIENvbXBvbmVudFJlZ2lzdHJ5ID0gUmVjb3JkPHN0cmluZywgQ29tcG9uZW50VHlwZTxhbnk+PjtcblxuZXhwb3J0IGludGVyZmFjZSBWRE9NRWxlbWVudCB7XG4gIHRhZzogc3RyaW5nO1xuICBwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIGNoaWxkcmVuPzogVkRPTU5vZGVbXTtcbiAga2V5Pzogc3RyaW5nO1xuICBsYXp5PzogYm9vbGVhbjtcbn1cblxuLy8gUHJpbWl0aXZlIG5vZGVzIHRoYXQgY2FuIGJlIHJlbmRlcmVkXG5leHBvcnQgdHlwZSBQcmltaXRpdmVOb2RlID0gc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbjtcblxuLy8gVkRPTU5vZGUgaXMgZWl0aGVyIGEgcHJpbWl0aXZlIChzdHJpbmcsIG51bWJlciwgYm9vbGVhbikgb3IgYW4gZWxlbWVudCBub2RlLlxuLy8gQm9vbGVhbnMgYXJlIHZhbGlkIGNoaWxkcmVuIGluIFJlYWN0IGJ1dCBkbyBub3QgcmVuZGVyIGFueXRoaW5nLlxuLy8gTW91bnQgcG9pbnRzIGFyZSBqdXN0IFVJRWxlbWVudE5vZGVzIHdpdGggdGFncyBzdGFydGluZyB3aXRoICQkQ29tcG9uZW50S2V5XG5leHBvcnQgdHlwZSBWRE9NTm9kZSA9IFByaW1pdGl2ZU5vZGUgfCBWRE9NRWxlbWVudDtcblxuZXhwb3J0IHR5cGUgVkRPTSA9IFZET01Ob2RlO1xuXG5leHBvcnQgdHlwZSBVcGRhdGVUeXBlID1cbiAgfCBcImluc2VydFwiXG4gIHwgXCJyZW1vdmVcIlxuICB8IFwicmVwbGFjZVwiXG4gIHwgXCJ1cGRhdGVfcHJvcHNcIlxuICB8IFwibW92ZVwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFZET01VcGRhdGVCYXNlIHtcbiAgdHlwZTogVXBkYXRlVHlwZTtcbiAgcGF0aDogc3RyaW5nOyAvLyBEb3Qtc2VwYXJhdGVkIHBhdGggdG8gdGhlIG5vZGVcbiAgZGF0YT86IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbnNlcnRVcGRhdGUgZXh0ZW5kcyBWRE9NVXBkYXRlQmFzZSB7XG4gIHR5cGU6IFwiaW5zZXJ0XCI7XG4gIGRhdGE6IFZET01Ob2RlOyAvLyBUaGUgbm9kZSB0byBpbnNlcnRcbiAgaWR4OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVtb3ZlVXBkYXRlIGV4dGVuZHMgVkRPTVVwZGF0ZUJhc2Uge1xuICB0eXBlOiBcInJlbW92ZVwiO1xuICBpZHg6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXBsYWNlVXBkYXRlIGV4dGVuZHMgVkRPTVVwZGF0ZUJhc2Uge1xuICB0eXBlOiBcInJlcGxhY2VcIjtcbiAgZGF0YTogVkRPTU5vZGU7IC8vIFRoZSBuZXcgbm9kZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZVByb3BzVXBkYXRlIGV4dGVuZHMgVkRPTVVwZGF0ZUJhc2Uge1xuICB0eXBlOiBcInVwZGF0ZV9wcm9wc1wiO1xuICBkYXRhOiB7XG4gICAgc2V0PzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICByZW1vdmU/OiBzdHJpbmdbXTtcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNb3ZlVXBkYXRlIGV4dGVuZHMgVkRPTVVwZGF0ZUJhc2Uge1xuICB0eXBlOiBcIm1vdmVcIjtcbiAgZGF0YToge1xuICAgIGZyb21faW5kZXg6IG51bWJlcjtcbiAgICB0b19pbmRleDogbnVtYmVyO1xuICB9O1xufVxuXG5leHBvcnQgdHlwZSBWRE9NVXBkYXRlID1cbiAgfCBJbnNlcnRVcGRhdGVcbiAgfCBSZW1vdmVVcGRhdGVcbiAgfCBSZXBsYWNlVXBkYXRlXG4gIHwgVXBkYXRlUHJvcHNVcGRhdGVcbiAgfCBNb3ZlVXBkYXRlO1xuXG4vLyBVdGlsaXR5IGZ1bmN0aW9ucyBmb3Igd29ya2luZyB3aXRoIHRoZSBVSSB0cmVlIHN0cnVjdHVyZVxuZXhwb3J0IGZ1bmN0aW9uIGlzRWxlbWVudE5vZGUobm9kZTogVkRPTU5vZGUpOiBub2RlIGlzIFZET01FbGVtZW50IHtcbiAgLy8gTWF0Y2hlcyBhbGwgbm9uLXRleHQgbm9kZXNcbiAgcmV0dXJuIHR5cGVvZiBub2RlID09PSBcIm9iamVjdFwiICYmIG5vZGUgIT09IG51bGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc01vdW50UG9pbnROb2RlKG5vZGU6IFZET01Ob2RlKTogbm9kZSBpcyBWRE9NRWxlbWVudCB7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIG5vZGUgPT09IFwib2JqZWN0XCIgJiZcbiAgICBub2RlICE9PSBudWxsICYmXG4gICAgbm9kZS50YWcuc3RhcnRzV2l0aChNT1VOVF9QT0lOVF9QUkVGSVgpICYmXG4gICAgbm9kZS50YWcgIT09IEZSQUdNRU5UX1RBR1xuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNUZXh0Tm9kZShub2RlOiBWRE9NTm9kZSk6IG5vZGUgaXMgc3RyaW5nIHtcbiAgcmV0dXJuIHR5cGVvZiBub2RlID09PSBcInN0cmluZ1wiO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNGcmFnbWVudChub2RlOiBWRE9NTm9kZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIG5vZGUgPT09IFwib2JqZWN0XCIgJiYgbm9kZSAhPT0gbnVsbCAmJiBub2RlLnRhZyA9PT0gRlJBR01FTlRfVEFHO1xufVxuIiwKICAgICJcbnR5cGUgU2ltcGxpZnk8VD4gPSB7IFtLIGluIGtleW9mIFRdOiBUW0tdIH0gJiB7fTtcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUV4dHJhY3RvcjxUIGV4dGVuZHMgb2JqZWN0PigpIHtcbiAgZnVuY3Rpb24gX2NyZWF0ZUV4dHJhY3RvcjxcbiAgICBjb25zdCBLIGV4dGVuZHMgcmVhZG9ubHkgKGtleW9mIFQpW10sXG4gICAgQyBleHRlbmRzIFBhcnRpYWw8UmVjb3JkPEtbbnVtYmVyXSB8IHN0cmluZywgKHNyYzogVCkgPT4gYW55Pj4sXG4gID4oa2V5czogSywgY29tcHV0ZWQ/OiBDKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHNyYzogVFxuICAgICk6IFNpbXBsaWZ5PFxuICAgICAgUGljazxULCBLW251bWJlcl0+ICYge1xuICAgICAgICBbUCBpbiBrZXlvZiBDXS0/OiBDW1BdIGV4dGVuZHMgKC4uLmFyZ3M6IGFueSkgPT4gaW5mZXIgUiA/IFIgOiBuZXZlcjtcbiAgICAgIH1cbiAgICA+ID0+IHtcbiAgICAgIGNvbnN0IG91dDogYW55ID0ge307XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgIG91dFtrZXkgYXMgc3RyaW5nXSA9IChzcmMgYXMgYW55KVtrZXkgYXMgc3RyaW5nXTtcbiAgICAgIH1cbiAgICAgIGlmIChjb21wdXRlZCkge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBjb21wdXRlZCkge1xuICAgICAgICAgIGNvbnN0IGZuID0gY29tcHV0ZWRba2V5XSE7XG4gICAgICAgICAgb3V0W2tleV0gPSBmbihzcmMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gb3V0O1xuICAgIH07XG4gIH1cbiAgcmV0dXJuIF9jcmVhdGVFeHRyYWN0b3I7XG59IiwKICAgICJpbXBvcnQgeyBjcmVhdGVFeHRyYWN0b3IgfSBmcm9tIFwiLi9leHRyYWN0b3JcIjtcblxuLy8gQmFzZSBleHRyYWN0b3JzIChjYW1lbENhc2UpIHNpbWlsYXIgdG8gZXZlbnRzLnRzIHN0eWxlXG5jb25zdCBsb3dlclRhZ05hbWUgPSAoZTogRWxlbWVudCkgPT4gZS50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbmNvbnN0IEVMRU1FTlRfS0VZUyA9IFtcbiAgXCJpZFwiLFxuICBcImNsYXNzTmFtZVwiLFxuICBcInRhZ05hbWVcIixcbiAgXCJsb2NhbE5hbWVcIixcbiAgXCJjbGllbnRIZWlnaHRcIixcbiAgXCJjbGllbnRMZWZ0XCIsXG4gIFwiY2xpZW50VG9wXCIsXG4gIFwiY2xpZW50V2lkdGhcIixcbiAgXCJzY3JvbGxIZWlnaHRcIixcbiAgXCJzY3JvbGxMZWZ0XCIsXG4gIFwic2Nyb2xsVG9wXCIsXG4gIFwic2Nyb2xsV2lkdGhcIixcbiAgXCJzbG90XCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgRWxlbWVudClbXTtcblxuY29uc3QgSFRNTF9PUl9TVkdfS0VZUyA9IFtcbiAgXCJhdXRvZm9jdXNcIixcbiAgXCJ0YWJJbmRleFwiLFxuICBcIm5vbmNlXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTE9yU1ZHRWxlbWVudClbXTtcblxuY29uc3QgSFRNTF9FTEVNRU5UX0JBU0VfS0VZUyA9IFtcbiAgXCJhY2Nlc3NLZXlcIixcbiAgXCJhY2Nlc3NLZXlMYWJlbFwiLFxuICBcImF1dG9jYXBpdGFsaXplXCIsXG4gIFwiZGlyXCIsXG4gIFwiZHJhZ2dhYmxlXCIsXG4gIFwiaGlkZGVuXCIsXG4gIFwiaW5lcnRcIixcbiAgXCJsYW5nXCIsXG4gIFwib2Zmc2V0SGVpZ2h0XCIsXG4gIFwib2Zmc2V0TGVmdFwiLFxuICBcIm9mZnNldFRvcFwiLFxuICBcIm9mZnNldFdpZHRoXCIsXG4gIFwicG9wb3ZlclwiLFxuICBcInNwZWxsY2hlY2tcIixcbiAgXCJ0aXRsZVwiLFxuICBcInRyYW5zbGF0ZVwiLFxuICBcIndyaXRpbmdTdWdnZXN0aW9uc1wiLFxuICBcImNvbnRlbnRFZGl0YWJsZVwiLFxuICBcImVudGVyS2V5SGludFwiLFxuICBcImlzQ29udGVudEVkaXRhYmxlXCIsXG4gIFwiaW5wdXRNb2RlXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTEVsZW1lbnQpW107XG5cbmNvbnN0IGV4dHJhY3RFbGVtZW50ID0gY3JlYXRlRXh0cmFjdG9yPEVsZW1lbnQ+KCkoRUxFTUVOVF9LRVlTLCB7XG4gIHRhZ05hbWU6IGxvd2VyVGFnTmFtZSxcbn0pO1xuXG5jb25zdCBleHRyYWN0SFRNTE9yU1ZHRWxlbWVudCA9XG4gIGNyZWF0ZUV4dHJhY3RvcjxIVE1MT3JTVkdFbGVtZW50PigpKEhUTUxfT1JfU1ZHX0tFWVMpO1xuXG5jb25zdCBleHRyYWN0SFRNTEVsZW1lbnRCYXNlT25seSA9IGNyZWF0ZUV4dHJhY3RvcjxIVE1MRWxlbWVudD4oKShcbiAgSFRNTF9FTEVNRU5UX0JBU0VfS0VZU1xuKTtcblxuZnVuY3Rpb24gZXh0cmFjdEhUTUxFbGVtZW50QmFzZShlbHQ6IEhUTUxFbGVtZW50KSB7XG4gIHJldHVybiB7XG4gICAgLi4uZXh0cmFjdEVsZW1lbnQoZWx0KSxcbiAgICAuLi5leHRyYWN0SFRNTE9yU1ZHRWxlbWVudChlbHQgYXMgSFRNTE9yU1ZHRWxlbWVudCksXG4gICAgLi4uZXh0cmFjdEhUTUxFbGVtZW50QmFzZU9ubHkoZWx0KSxcbiAgfTtcbn1cblxuLy8gSGVscGVyIHRvIGNvbXBvc2UgcGVyLWVsZW1lbnQgZXh0cmFjdG9ycyB3aXRoIHRoZSBzaGFyZWQgYmFzZVxuZnVuY3Rpb24gd2l0aEJhc2U8VCBleHRlbmRzIEhUTUxFbGVtZW50PihcbiAga2V5czogcmVhZG9ubHkgKGtleW9mIFQpW10sXG4gIGNvbXB1dGVkPzogUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCAoc3JjOiBUKSA9PiBhbnk+PlxuKSB7XG4gIGNvbnN0IG9ubHkgPSBjcmVhdGVFeHRyYWN0b3I8VD4oKShrZXlzLCBjb21wdXRlZCBhcyBhbnkpO1xuICByZXR1cm4gKGVsdDogVCkgPT4gKHsgLi4uZXh0cmFjdEhUTUxFbGVtZW50QmFzZShlbHQpLCAuLi5vbmx5KGVsdCkgfSk7XG59XG5cbmNvbnN0IEhUTUxfQU5DSE9SX0tFWVMgPSBbXG4gIFwiaGFzaFwiLFxuICBcImhvc3RcIixcbiAgXCJob3N0bmFtZVwiLFxuICBcImhyZWZcIixcbiAgXCJvcmlnaW5cIixcbiAgXCJwYXNzd29yZFwiLFxuICBcInBhdGhuYW1lXCIsXG4gIFwicG9ydFwiLFxuICBcInByb3RvY29sXCIsXG4gIFwic2VhcmNoXCIsXG4gIFwidGFyZ2V0XCIsXG4gIFwiZG93bmxvYWRcIixcbiAgXCJyZWxcIixcbiAgXCJocmVmbGFuZ1wiLFxuICBcInR5cGVcIixcbiAgXCJ1c2VybmFtZVwiLFxuICBcInBpbmdcIixcbiAgXCJyZWZlcnJlclBvbGljeVwiLFxuICBcInRleHRcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MQW5jaG9yRWxlbWVudClbXTtcbmNvbnN0IGFuY2hvckV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxBbmNob3JFbGVtZW50PihIVE1MX0FOQ0hPUl9LRVlTKTtcblxuY29uc3QgSFRNTF9BUkVBX0tFWVMgPSBbXG4gIFwiYWx0XCIsXG4gIFwiY29vcmRzXCIsXG4gIFwiZG93bmxvYWRcIixcbiAgXCJoYXNoXCIsXG4gIFwiaG9zdFwiLFxuICBcImhvc3RuYW1lXCIsXG4gIFwiaHJlZlwiLFxuICBcIm9yaWdpblwiLFxuICBcInBhc3N3b3JkXCIsXG4gIFwicGF0aG5hbWVcIixcbiAgXCJwb3J0XCIsXG4gIFwicHJvdG9jb2xcIixcbiAgXCJyZWxcIixcbiAgXCJzZWFyY2hcIixcbiAgXCJzaGFwZVwiLFxuICBcInRhcmdldFwiLFxuICBcInVzZXJuYW1lXCIsXG4gIFwicGluZ1wiLFxuICBcInJlZmVycmVyUG9saWN5XCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTEFyZWFFbGVtZW50KVtdO1xuY29uc3QgYXJlYUV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxBcmVhRWxlbWVudD4oSFRNTF9BUkVBX0tFWVMpO1xuXG5jb25zdCBIVE1MX01FRElBX0tFWVMgPSBbXG4gIFwiYXV0b3BsYXlcIixcbiAgXCJjb250cm9sc1wiLFxuICBcImNyb3NzT3JpZ2luXCIsXG4gIFwiY3VycmVudFNyY1wiLFxuICBcImN1cnJlbnRUaW1lXCIsXG4gIFwiZGVmYXVsdE11dGVkXCIsXG4gIFwiZGVmYXVsdFBsYXliYWNrUmF0ZVwiLFxuICBcImR1cmF0aW9uXCIsXG4gIFwiZW5kZWRcIixcbiAgXCJsb29wXCIsXG4gIFwibXV0ZWRcIixcbiAgXCJuZXR3b3JrU3RhdGVcIixcbiAgXCJwYXVzZWRcIixcbiAgXCJwbGF5YmFja1JhdGVcIixcbiAgXCJwcmVsb2FkXCIsXG4gIFwicmVhZHlTdGF0ZVwiLFxuICBcInNlZWtpbmdcIixcbiAgXCJzcmNcIixcbiAgXCJ2b2x1bWVcIixcbiAgXCJwcmVzZXJ2ZXNQaXRjaFwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxNZWRpYUVsZW1lbnQpW107XG5jb25zdCBtZWRpYUV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxNZWRpYUVsZW1lbnQ+KEhUTUxfTUVESUFfS0VZUyk7XG5cbmNvbnN0IGF1ZGlvRXh0cmFjdG9yID0gKGVsdDogSFRNTEF1ZGlvRWxlbWVudCkgPT4gbWVkaWFFeHRyYWN0b3IoZWx0KTtcblxuY29uc3QgSFRNTF9CVVRUT05fS0VZUyA9IFtcbiAgXCJkaXNhYmxlZFwiLFxuICBcIm5hbWVcIixcbiAgXCJ0eXBlXCIsXG4gIFwidmFsdWVcIixcbiAgXCJmb3JtQWN0aW9uXCIsXG4gIFwiZm9ybUVuY3R5cGVcIixcbiAgXCJmb3JtTWV0aG9kXCIsXG4gIFwiZm9ybU5vVmFsaWRhdGVcIixcbiAgXCJmb3JtVGFyZ2V0XCIsXG4gIFwicG9wb3ZlclRhcmdldEFjdGlvblwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxCdXR0b25FbGVtZW50KVtdO1xuY29uc3QgYnV0dG9uRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTEJ1dHRvbkVsZW1lbnQ+KEhUTUxfQlVUVE9OX0tFWVMpO1xuXG5jb25zdCBIVE1MX0RBVEFfS0VZUyA9IFtcbiAgXCJ2YWx1ZVwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxEYXRhRWxlbWVudClbXTtcbmNvbnN0IGRhdGFFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MRGF0YUVsZW1lbnQ+KEhUTUxfREFUQV9LRVlTKTtcblxuY29uc3QgSFRNTF9FTUJFRF9LRVlTID0gW1xuICBcImhlaWdodFwiLFxuICBcInNyY1wiLFxuICBcInR5cGVcIixcbiAgXCJ3aWR0aFwiLFxuICBcImFsaWduXCIsXG4gIFwibmFtZVwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxFbWJlZEVsZW1lbnQpW107XG5jb25zdCBlbWJlZEV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxFbWJlZEVsZW1lbnQ+KEhUTUxfRU1CRURfS0VZUyk7XG5cbmNvbnN0IEhUTUxfRklFTERTRVRfS0VZUyA9IFtcbiAgXCJkaXNhYmxlZFwiLFxuICBcIm5hbWVcIixcbiAgXCJ0eXBlXCIsXG4gIFwidmFsaWRhdGlvbk1lc3NhZ2VcIixcbiAgXCJ3aWxsVmFsaWRhdGVcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MRmllbGRTZXRFbGVtZW50KVtdO1xuY29uc3QgZmllbGRzZXRFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MRmllbGRTZXRFbGVtZW50PihIVE1MX0ZJRUxEU0VUX0tFWVMpO1xuXG5jb25zdCBIVE1MX0ZPUk1fS0VZUyA9IFtcbiAgXCJhY2NlcHRDaGFyc2V0XCIsXG4gIFwiYWN0aW9uXCIsXG4gIFwiYXV0b2NvbXBsZXRlXCIsXG4gIFwiZW5jb2RpbmdcIixcbiAgXCJlbmN0eXBlXCIsXG4gIFwibGVuZ3RoXCIsXG4gIFwibWV0aG9kXCIsXG4gIFwibmFtZVwiLFxuICBcIm5vVmFsaWRhdGVcIixcbiAgXCJ0YXJnZXRcIixcbiAgXCJyZWxcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MRm9ybUVsZW1lbnQpW107XG5jb25zdCBmb3JtRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTEZvcm1FbGVtZW50PihIVE1MX0ZPUk1fS0VZUyk7XG5cbmNvbnN0IEhUTUxfSUZSQU1FX0tFWVMgPSBbXG4gIFwiYWxsb3dcIixcbiAgXCJhbGxvd0Z1bGxzY3JlZW5cIixcbiAgXCJoZWlnaHRcIixcbiAgXCJuYW1lXCIsXG4gIFwicmVmZXJyZXJQb2xpY3lcIixcbiAgXCJzcmNcIixcbiAgXCJzcmNkb2NcIixcbiAgXCJ3aWR0aFwiLFxuICBcImFsaWduXCIsXG4gIFwiZnJhbWVCb3JkZXJcIixcbiAgXCJsb25nRGVzY1wiLFxuICBcIm1hcmdpbkhlaWdodFwiLFxuICBcIm1hcmdpbldpZHRoXCIsXG4gIFwic2Nyb2xsaW5nXCIsXG4gIFwic2FuZGJveFwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxJRnJhbWVFbGVtZW50KVtdO1xuY29uc3QgaWZyYW1lRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTElGcmFtZUVsZW1lbnQ+KEhUTUxfSUZSQU1FX0tFWVMpO1xuXG5jb25zdCBIVE1MX0lNQUdFX0tFWVMgPSBbXG4gIFwiYWx0XCIsXG4gIFwiY3Jvc3NPcmlnaW5cIixcbiAgXCJkZWNvZGluZ1wiLFxuICBcImhlaWdodFwiLFxuICBcImlzTWFwXCIsXG4gIFwibG9hZGluZ1wiLFxuICBcIm5hdHVyYWxIZWlnaHRcIixcbiAgXCJuYXR1cmFsV2lkdGhcIixcbiAgXCJyZWZlcnJlclBvbGljeVwiLFxuICBcInNpemVzXCIsXG4gIFwic3JjXCIsXG4gIFwic3Jjc2V0XCIsXG4gIFwidXNlTWFwXCIsXG4gIFwid2lkdGhcIixcbiAgXCJhbGlnblwiLFxuICBcImJvcmRlclwiLFxuICBcImNvbXBsZXRlXCIsXG4gIFwiaHNwYWNlXCIsXG4gIFwibG9uZ0Rlc2NcIixcbiAgXCJsb3dzcmNcIixcbiAgXCJuYW1lXCIsXG4gIFwidnNwYWNlXCIsXG4gIFwieFwiLFxuICBcInlcIixcbiAgXCJmZXRjaFByaW9yaXR5XCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTEltYWdlRWxlbWVudClbXTtcbmNvbnN0IGltYWdlRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTEltYWdlRWxlbWVudD4oSFRNTF9JTUFHRV9LRVlTKTtcblxuY29uc3QgSFRNTF9JTlBVVF9LRVlTID0gW1xuICBcImFjY2VwdFwiLFxuICBcImFsdFwiLFxuICBcImF1dG9jb21wbGV0ZVwiLFxuICBcImNoZWNrZWRcIixcbiAgXCJkZWZhdWx0Q2hlY2tlZFwiLFxuICBcImRlZmF1bHRWYWx1ZVwiLFxuICBcImRpck5hbWVcIixcbiAgXCJkaXNhYmxlZFwiLFxuICBcImhlaWdodFwiLFxuICBcImluZGV0ZXJtaW5hdGVcIixcbiAgXCJtYXhcIixcbiAgXCJtYXhMZW5ndGhcIixcbiAgXCJtaW5cIixcbiAgXCJtaW5MZW5ndGhcIixcbiAgXCJtdWx0aXBsZVwiLFxuICBcIm5hbWVcIixcbiAgXCJwYXR0ZXJuXCIsXG4gIFwicGxhY2Vob2xkZXJcIixcbiAgXCJyZWFkT25seVwiLFxuICBcInJlcXVpcmVkXCIsXG4gIFwic2VsZWN0aW9uRGlyZWN0aW9uXCIsXG4gIFwic2VsZWN0aW9uRW5kXCIsXG4gIFwic2VsZWN0aW9uU3RhcnRcIixcbiAgXCJzaXplXCIsXG4gIFwic3JjXCIsXG4gIFwic3RlcFwiLFxuICBcInR5cGVcIixcbiAgXCJ2YWx1ZVwiLFxuICBcInZhbHVlQXNOdW1iZXJcIixcbiAgXCJ3aWR0aFwiLFxuICBcImFsaWduXCIsXG4gIFwiY2FwdHVyZVwiLFxuICBcImZvcm1BY3Rpb25cIixcbiAgXCJmb3JtRW5jdHlwZVwiLFxuICBcImZvcm1NZXRob2RcIixcbiAgXCJmb3JtTm9WYWxpZGF0ZVwiLFxuICBcImZvcm1UYXJnZXRcIixcbiAgXCJ1c2VNYXBcIixcbiAgXCJ2YWxpZGF0aW9uTWVzc2FnZVwiLFxuICBcIndpbGxWYWxpZGF0ZVwiLFxuICBcInBvcG92ZXJUYXJnZXRBY3Rpb25cIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MSW5wdXRFbGVtZW50KVtdO1xuY29uc3QgaW5wdXRFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MSW5wdXRFbGVtZW50PihIVE1MX0lOUFVUX0tFWVMpO1xuXG5jb25zdCBIVE1MX0xBQkVMX0tFWVMgPSBbXG4gIFwiaHRtbEZvclwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxMYWJlbEVsZW1lbnQpW107XG5jb25zdCBsYWJlbEV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxMYWJlbEVsZW1lbnQ+KEhUTUxfTEFCRUxfS0VZUyk7XG5cbmNvbnN0IEhUTUxfTElfS0VZUyA9IFtcbiAgXCJ2YWx1ZVwiLFxuICBcInR5cGVcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MTElFbGVtZW50KVtdO1xuY29uc3QgbGlFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MTElFbGVtZW50PihIVE1MX0xJX0tFWVMpO1xuXG5jb25zdCBIVE1MX0xJTktfS0VZUyA9IFtcbiAgXCJhc1wiLFxuICBcImNyb3NzT3JpZ2luXCIsXG4gIFwiZGlzYWJsZWRcIixcbiAgXCJmZXRjaFByaW9yaXR5XCIsXG4gIFwiaHJlZlwiLFxuICBcImhyZWZsYW5nXCIsXG4gIFwiaW1hZ2VTaXplc1wiLFxuICBcImltYWdlU3Jjc2V0XCIsXG4gIFwiaW50ZWdyaXR5XCIsXG4gIFwibWVkaWFcIixcbiAgXCJyZWZlcnJlclBvbGljeVwiLFxuICBcInJlbFwiLFxuICBcInR5cGVcIixcbiAgXCJjaGFyc2V0XCIsXG4gIFwicmV2XCIsXG4gIFwidGFyZ2V0XCIsXG4gIFwic2l6ZXNcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MTGlua0VsZW1lbnQpW107XG5jb25zdCBsaW5rRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTExpbmtFbGVtZW50PihIVE1MX0xJTktfS0VZUyk7XG5cbmNvbnN0IEhUTUxfTUFQX0tFWVMgPSBbXG4gIFwibmFtZVwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxNYXBFbGVtZW50KVtdO1xuY29uc3QgbWFwRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTE1hcEVsZW1lbnQ+KEhUTUxfTUFQX0tFWVMpO1xuXG5jb25zdCBIVE1MX01FVEVSX0tFWVMgPSBbXG4gIFwiaGlnaFwiLFxuICBcImxvd1wiLFxuICBcIm1heFwiLFxuICBcIm1pblwiLFxuICBcIm9wdGltdW1cIixcbiAgXCJ2YWx1ZVwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxNZXRlckVsZW1lbnQpW107XG5jb25zdCBtZXRlckV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxNZXRlckVsZW1lbnQ+KEhUTUxfTUVURVJfS0VZUyk7XG5cbmNvbnN0IEhUTUxfTU9EX0tFWVMgPSBbXG4gIFwiY2l0ZVwiLFxuICBcImRhdGVUaW1lXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTE1vZEVsZW1lbnQpW107XG5jb25zdCBtb2RFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MTW9kRWxlbWVudD4oSFRNTF9NT0RfS0VZUyk7XG5cbmNvbnN0IEhUTUxfT0xfS0VZUyA9IFtcbiAgXCJyZXZlcnNlZFwiLFxuICBcInN0YXJ0XCIsXG4gIFwidHlwZVwiLFxuICBcImNvbXBhY3RcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MT0xpc3RFbGVtZW50KVtdO1xuY29uc3Qgb2xpc3RFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MT0xpc3RFbGVtZW50PihIVE1MX09MX0tFWVMpO1xuXG5jb25zdCBIVE1MX09CSkVDVF9LRVlTID0gW1xuICBcImRhdGFcIixcbiAgXCJoZWlnaHRcIixcbiAgXCJuYW1lXCIsXG4gIFwidHlwZVwiLFxuICBcInVzZU1hcFwiLFxuICBcIndpZHRoXCIsXG4gIFwidmFsaWRhdGlvbk1lc3NhZ2VcIixcbiAgXCJ3aWxsVmFsaWRhdGVcIixcbiAgXCJhbGlnblwiLFxuICBcImFyY2hpdmVcIixcbiAgXCJib3JkZXJcIixcbiAgXCJjb2RlXCIsXG4gIFwiY29kZUJhc2VcIixcbiAgXCJjb2RlVHlwZVwiLFxuICBcImRlY2xhcmVcIixcbiAgXCJoc3BhY2VcIixcbiAgXCJzdGFuZGJ5XCIsXG4gIFwidnNwYWNlXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTE9iamVjdEVsZW1lbnQpW107XG5jb25zdCBvYmplY3RFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MT2JqZWN0RWxlbWVudD4oSFRNTF9PQkpFQ1RfS0VZUyk7XG5cbmNvbnN0IEhUTUxfT1BUR1JPVVBfS0VZUyA9IFtcbiAgXCJkaXNhYmxlZFwiLFxuICBcImxhYmVsXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTE9wdEdyb3VwRWxlbWVudClbXTtcbmNvbnN0IG9wdGdyb3VwRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTE9wdEdyb3VwRWxlbWVudD4oSFRNTF9PUFRHUk9VUF9LRVlTKTtcblxuY29uc3QgSFRNTF9PUFRJT05fS0VZUyA9IFtcbiAgXCJkZWZhdWx0U2VsZWN0ZWRcIixcbiAgXCJkaXNhYmxlZFwiLFxuICBcImluZGV4XCIsXG4gIFwibGFiZWxcIixcbiAgXCJzZWxlY3RlZFwiLFxuICBcInRleHRcIixcbiAgXCJ2YWx1ZVwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxPcHRpb25FbGVtZW50KVtdO1xuY29uc3Qgb3B0aW9uRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTE9wdGlvbkVsZW1lbnQ+KEhUTUxfT1BUSU9OX0tFWVMpO1xuXG5jb25zdCBIVE1MX09VVFBVVF9LRVlTID0gW1xuICBcImRlZmF1bHRWYWx1ZVwiLFxuICBcIm5hbWVcIixcbiAgXCJ0eXBlXCIsXG4gIFwidmFsdWVcIixcbiAgXCJodG1sRm9yXCIsXG4gIFwidmFsaWRhdGlvbk1lc3NhZ2VcIixcbiAgXCJ3aWxsVmFsaWRhdGVcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MT3V0cHV0RWxlbWVudClbXTtcbmNvbnN0IG91dHB1dEV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxPdXRwdXRFbGVtZW50PihIVE1MX09VVFBVVF9LRVlTKTtcblxuY29uc3QgSFRNTF9QUk9HUkVTU19LRVlTID0gW1xuICBcIm1heFwiLFxuICBcInBvc2l0aW9uXCIsXG4gIFwidmFsdWVcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MUHJvZ3Jlc3NFbGVtZW50KVtdO1xuY29uc3QgcHJvZ3Jlc3NFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MUHJvZ3Jlc3NFbGVtZW50PihIVE1MX1BST0dSRVNTX0tFWVMpO1xuXG5jb25zdCBIVE1MX1FVT1RFX0tFWVMgPSBbXG4gIFwiY2l0ZVwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxRdW90ZUVsZW1lbnQpW107XG5jb25zdCBxdW90ZUV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxRdW90ZUVsZW1lbnQ+KEhUTUxfUVVPVEVfS0VZUyk7XG5cbmNvbnN0IGNpdGVFeHRyYWN0b3IgPSAoZWx0OiBIVE1MRWxlbWVudCkgPT4gZXh0cmFjdEhUTUxFbGVtZW50QmFzZShlbHQpO1xuXG5jb25zdCBIVE1MX1NDUklQVF9LRVlTID0gW1xuICBcImFzeW5jXCIsXG4gIFwiY3Jvc3NPcmlnaW5cIixcbiAgXCJkZWZlclwiLFxuICBcImZldGNoUHJpb3JpdHlcIixcbiAgXCJpbnRlZ3JpdHlcIixcbiAgXCJub01vZHVsZVwiLFxuICBcInJlZmVycmVyUG9saWN5XCIsXG4gIFwic3JjXCIsXG4gIFwidGV4dFwiLFxuICBcInR5cGVcIixcbiAgXCJjaGFyc2V0XCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTFNjcmlwdEVsZW1lbnQpW107XG5jb25zdCBleHRyYWN0SFRNTFNjcmlwdE9ubHkgPSBjcmVhdGVFeHRyYWN0b3I8SFRNTFNjcmlwdEVsZW1lbnQ+KCkoXG4gIEhUTUxfU0NSSVBUX0tFWVMsXG4gIHtcbiAgICBldmVudDogKHMpID0+IChzIGFzIGFueSkuZXZlbnQsXG4gICAgaHRtbEZvcjogKHMpID0+IChzIGFzIGFueSkuaHRtbEZvcixcbiAgfVxuKTtcbmNvbnN0IHNjcmlwdEV4dHJhY3RvciA9IChlbHQ6IEhUTUxTY3JpcHRFbGVtZW50KSA9PiAoe1xuICAuLi5leHRyYWN0SFRNTEVsZW1lbnRCYXNlKGVsdCksXG4gIC4uLmV4dHJhY3RIVE1MU2NyaXB0T25seShlbHQpLFxufSk7XG5cbmNvbnN0IEhUTUxfU0VMRUNUX0tFWVMgPSBbXG4gIFwiYXV0b2NvbXBsZXRlXCIsXG4gIFwiZGlzYWJsZWRcIixcbiAgXCJsZW5ndGhcIixcbiAgXCJtdWx0aXBsZVwiLFxuICBcIm5hbWVcIixcbiAgXCJyZXF1aXJlZFwiLFxuICBcInNlbGVjdGVkSW5kZXhcIixcbiAgXCJzaXplXCIsXG4gIFwidHlwZVwiLFxuICBcInZhbHVlXCIsXG4gIFwidmFsaWRhdGlvbk1lc3NhZ2VcIixcbiAgXCJ3aWxsVmFsaWRhdGVcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MU2VsZWN0RWxlbWVudClbXTtcbmNvbnN0IHNlbGVjdEV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxTZWxlY3RFbGVtZW50PihIVE1MX1NFTEVDVF9LRVlTKTtcblxuY29uc3QgSFRNTF9TTE9UX0tFWVMgPSBbXG4gIFwibmFtZVwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxTbG90RWxlbWVudClbXTtcbmNvbnN0IHNsb3RFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MU2xvdEVsZW1lbnQ+KEhUTUxfU0xPVF9LRVlTKTtcblxuY29uc3QgSFRNTF9TT1VSQ0VfS0VZUyA9IFtcbiAgXCJoZWlnaHRcIixcbiAgXCJtZWRpYVwiLFxuICBcInNpemVzXCIsXG4gIFwic3JjXCIsXG4gIFwic3Jjc2V0XCIsXG4gIFwidHlwZVwiLFxuICBcIndpZHRoXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTFNvdXJjZUVsZW1lbnQpW107XG5jb25zdCBzb3VyY2VFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MU291cmNlRWxlbWVudD4oSFRNTF9TT1VSQ0VfS0VZUyk7XG5cbmNvbnN0IEhUTUxfVEFCTEVfQ0FQVElPTl9LRVlTID0gW1xuICBcImFsaWduXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTFRhYmxlQ2FwdGlvbkVsZW1lbnQpW107XG5jb25zdCB0YWJsZUNhcHRpb25FeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MVGFibGVDYXB0aW9uRWxlbWVudD4oXG4gIEhUTUxfVEFCTEVfQ0FQVElPTl9LRVlTXG4pO1xuXG5jb25zdCBIVE1MX1RBQkxFX0NFTExfS0VZUyA9IFtcbiAgXCJhYmJyXCIsXG4gIFwiY2VsbEluZGV4XCIsXG4gIFwiY29sU3BhblwiLFxuICBcImhlYWRlcnNcIixcbiAgXCJyb3dTcGFuXCIsXG4gIFwic2NvcGVcIixcbiAgXCJhbGlnblwiLFxuICBcImF4aXNcIixcbiAgXCJiZ0NvbG9yXCIsXG4gIFwiY2hcIixcbiAgXCJjaE9mZlwiLFxuICBcImhlaWdodFwiLFxuICBcIm5vV3JhcFwiLFxuICBcInZBbGlnblwiLFxuICBcIndpZHRoXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTFRhYmxlQ2VsbEVsZW1lbnQpW107XG5jb25zdCB0YWJsZUNlbGxFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MVGFibGVDZWxsRWxlbWVudD4oSFRNTF9UQUJMRV9DRUxMX0tFWVMpO1xuXG5jb25zdCBIVE1MX1RBQkxFX0NPTF9LRVlTID0gW1xuICBcInNwYW5cIixcbiAgXCJhbGlnblwiLFxuICBcImNoXCIsXG4gIFwiY2hPZmZcIixcbiAgXCJ2QWxpZ25cIixcbiAgXCJ3aWR0aFwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxUYWJsZUNvbEVsZW1lbnQpW107XG5jb25zdCB0YWJsZUNvbEV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxUYWJsZUNvbEVsZW1lbnQ+KEhUTUxfVEFCTEVfQ09MX0tFWVMpO1xuXG5jb25zdCBIVE1MX1RBQkxFX0tFWVMgPSBbXG4gIFwiYWxpZ25cIixcbiAgXCJiZ0NvbG9yXCIsXG4gIFwiYm9yZGVyXCIsXG4gIFwiY2VsbFBhZGRpbmdcIixcbiAgXCJjZWxsU3BhY2luZ1wiLFxuICBcImZyYW1lXCIsXG4gIFwicnVsZXNcIixcbiAgXCJzdW1tYXJ5XCIsXG4gIFwid2lkdGhcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MVGFibGVFbGVtZW50KVtdO1xuY29uc3QgdGFibGVFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MVGFibGVFbGVtZW50PihIVE1MX1RBQkxFX0tFWVMpO1xuXG5jb25zdCBIVE1MX1RSX0tFWVMgPSBbXG4gIFwicm93SW5kZXhcIixcbiAgXCJzZWN0aW9uUm93SW5kZXhcIixcbiAgXCJhbGlnblwiLFxuICBcImJnQ29sb3JcIixcbiAgXCJjaFwiLFxuICBcImNoT2ZmXCIsXG4gIFwidkFsaWduXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTFRhYmxlUm93RWxlbWVudClbXTtcbmNvbnN0IHRhYmxlUm93RXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTFRhYmxlUm93RWxlbWVudD4oSFRNTF9UUl9LRVlTKTtcblxuY29uc3QgSFRNTF9UU0VDVElPTl9LRVlTID0gW1xuICBcImFsaWduXCIsXG4gIFwiY2hcIixcbiAgXCJjaE9mZlwiLFxuICBcInZBbGlnblwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50KVtdO1xuY29uc3QgdGFibGVTZWN0aW9uRXh0cmFjdG9yID1cbiAgd2l0aEJhc2U8SFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQ+KEhUTUxfVFNFQ1RJT05fS0VZUyk7XG5cbmNvbnN0IHRlbXBsYXRlRXh0cmFjdG9yID0gKGVsdDogSFRNTFRlbXBsYXRlRWxlbWVudCkgPT5cbiAgZXh0cmFjdEhUTUxFbGVtZW50QmFzZShlbHQpO1xuXG5jb25zdCBIVE1MX1RFWFRBUkVBX0tFWVMgPSBbXG4gIFwiYXV0b2NvbXBsZXRlXCIsXG4gIFwiY29sc1wiLFxuICBcImRlZmF1bHRWYWx1ZVwiLFxuICBcImRpck5hbWVcIixcbiAgXCJkaXNhYmxlZFwiLFxuICBcIm1heExlbmd0aFwiLFxuICBcIm1pbkxlbmd0aFwiLFxuICBcIm5hbWVcIixcbiAgXCJwbGFjZWhvbGRlclwiLFxuICBcInJlYWRPbmx5XCIsXG4gIFwicmVxdWlyZWRcIixcbiAgXCJyb3dzXCIsXG4gIFwic2VsZWN0aW9uRGlyZWN0aW9uXCIsXG4gIFwic2VsZWN0aW9uRW5kXCIsXG4gIFwic2VsZWN0aW9uU3RhcnRcIixcbiAgXCJ2YWx1ZVwiLFxuICBcIndyYXBcIixcbiAgXCJ0ZXh0TGVuZ3RoXCIsXG4gIFwidmFsaWRhdGlvbk1lc3NhZ2VcIixcbiAgXCJ3aWxsVmFsaWRhdGVcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MVGV4dEFyZWFFbGVtZW50KVtdO1xuY29uc3QgdGV4dGFyZWFFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MVGV4dEFyZWFFbGVtZW50PihIVE1MX1RFWFRBUkVBX0tFWVMpO1xuXG5jb25zdCBIVE1MX1RJTUVfS0VZUyA9IFtcbiAgXCJkYXRlVGltZVwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxUaW1lRWxlbWVudClbXTtcbmNvbnN0IHRpbWVFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MVGltZUVsZW1lbnQ+KEhUTUxfVElNRV9LRVlTKTtcblxuY29uc3QgSFRNTF9UUkFDS19LRVlTID0gW1xuICBcImRlZmF1bHRcIixcbiAgXCJraW5kXCIsXG4gIFwibGFiZWxcIixcbiAgXCJyZWFkeVN0YXRlXCIsXG4gIFwic3JjXCIsXG4gIFwic3JjbGFuZ1wiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxUcmFja0VsZW1lbnQpW107XG5jb25zdCB0cmFja0V4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxUcmFja0VsZW1lbnQ+KEhUTUxfVFJBQ0tfS0VZUyk7XG5cbmNvbnN0IEhUTUxfVklERU9fS0VZUyA9IFtcbiAgXCJoZWlnaHRcIixcbiAgXCJwb3N0ZXJcIixcbiAgXCJ2aWRlb0hlaWdodFwiLFxuICBcInZpZGVvV2lkdGhcIixcbiAgXCJ3aWR0aFwiLFxuICBcInBsYXlzSW5saW5lXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTFZpZGVvRWxlbWVudClbXTtcbmNvbnN0IGV4dHJhY3RIVE1MVmlkZW9Pbmx5ID1cbiAgY3JlYXRlRXh0cmFjdG9yPEhUTUxWaWRlb0VsZW1lbnQ+KCkoSFRNTF9WSURFT19LRVlTKTtcbmNvbnN0IHZpZGVvRXh0cmFjdG9yID0gKGVsdDogSFRNTFZpZGVvRWxlbWVudCkgPT4gKHtcbiAgLi4ubWVkaWFFeHRyYWN0b3IoZWx0KSxcbiAgLi4uZXh0cmFjdEhUTUxWaWRlb09ubHkoZWx0KSxcbn0pO1xuXG5jb25zdCBIVE1MX0JSX0tFWVMgPSBbXG4gIFwiY2xlYXJcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MQlJFbGVtZW50KVtdO1xuY29uc3QgYnJFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MQlJFbGVtZW50PihIVE1MX0JSX0tFWVMpO1xuXG5jb25zdCBIVE1MX0JBU0VfS0VZUyA9IFtcbiAgXCJocmVmXCIsXG4gIFwidGFyZ2V0XCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTEJhc2VFbGVtZW50KVtdO1xuY29uc3QgYmFzZUV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxCYXNlRWxlbWVudD4oSFRNTF9CQVNFX0tFWVMpO1xuXG5jb25zdCBIVE1MX0JPRFlfS0VZUyA9IFtcbiAgXCJhTGlua1wiLFxuICBcImJhY2tncm91bmRcIixcbiAgXCJiZ0NvbG9yXCIsXG4gIFwibGlua1wiLFxuICBcInRleHRcIixcbiAgXCJ2TGlua1wiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxCb2R5RWxlbWVudClbXTtcbmNvbnN0IGJvZHlFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MQm9keUVsZW1lbnQ+KEhUTUxfQk9EWV9LRVlTKTtcblxuY29uc3QgSFRNTF9ETElTVF9LRVlTID0gW1xuICBcImNvbXBhY3RcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MRExpc3RFbGVtZW50KVtdO1xuY29uc3QgZGxpc3RFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MRExpc3RFbGVtZW50PihIVE1MX0RMSVNUX0tFWVMpO1xuXG5jb25zdCBIVE1MX0RFVEFJTFNfS0VZUyA9IFtcbiAgXCJvcGVuXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTERldGFpbHNFbGVtZW50KVtdO1xuY29uc3QgZGV0YWlsc0V4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxEZXRhaWxzRWxlbWVudD4oSFRNTF9ERVRBSUxTX0tFWVMpO1xuXG5jb25zdCBIVE1MX0RJQUxPR19LRVlTID0gW1xuICBcIm9wZW5cIixcbiAgXCJyZXR1cm5WYWx1ZVwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxEaWFsb2dFbGVtZW50KVtdO1xuY29uc3QgZGlhbG9nRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTERpYWxvZ0VsZW1lbnQ+KEhUTUxfRElBTE9HX0tFWVMpO1xuXG5jb25zdCBIVE1MX0RJVl9LRVlTID0gW1xuICBcImFsaWduXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTERpdkVsZW1lbnQpW107XG5jb25zdCBkaXZFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MRGl2RWxlbWVudD4oSFRNTF9ESVZfS0VZUyk7XG5cbmNvbnN0IGhlYWRFeHRyYWN0b3IgPSAoZWx0OiBIVE1MSGVhZEVsZW1lbnQpID0+IGV4dHJhY3RIVE1MRWxlbWVudEJhc2UoZWx0KTtcblxuY29uc3QgSFRNTF9IRUFESU5HX0tFWVMgPSBbXG4gIFwiYWxpZ25cIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MSGVhZGluZ0VsZW1lbnQpW107XG5jb25zdCBoZWFkaW5nRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTEhlYWRpbmdFbGVtZW50PihIVE1MX0hFQURJTkdfS0VZUyk7XG5cbmNvbnN0IEhUTUxfSFJfS0VZUyA9IFtcbiAgXCJhbGlnblwiLFxuICBcImNvbG9yXCIsXG4gIFwibm9TaGFkZVwiLFxuICBcInNpemVcIixcbiAgXCJ3aWR0aFwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxIUkVsZW1lbnQpW107XG5jb25zdCBockV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxIUkVsZW1lbnQ+KEhUTUxfSFJfS0VZUyk7XG5cbmNvbnN0IEhUTUxfSFRNTF9LRVlTID0gW1xuICBcInZlcnNpb25cIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MSHRtbEVsZW1lbnQpW107XG5jb25zdCBodG1sRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTEh0bWxFbGVtZW50PihIVE1MX0hUTUxfS0VZUyk7XG5cbmNvbnN0IG1lbnVFeHRyYWN0b3IgPSAoZWx0OiBIVE1MTWVudUVsZW1lbnQpID0+IGV4dHJhY3RIVE1MRWxlbWVudEJhc2UoZWx0KTtcblxuY29uc3QgSFRNTF9NRVRBX0tFWVMgPSBbXG4gIFwiY29udGVudFwiLFxuICBcImh0dHBFcXVpdlwiLFxuICBcIm5hbWVcIixcbiAgXCJzY2hlbWVcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MTWV0YUVsZW1lbnQpW107XG5jb25zdCBtZXRhRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTE1ldGFFbGVtZW50PihIVE1MX01FVEFfS0VZUyk7XG5cbmNvbnN0IEhUTUxfUF9LRVlTID0gW1xuICBcImFsaWduXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTFBhcmFncmFwaEVsZW1lbnQpW107XG5jb25zdCBwYXJhZ3JhcGhFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MUGFyYWdyYXBoRWxlbWVudD4oSFRNTF9QX0tFWVMpO1xuXG5jb25zdCBwaWN0dXJlRXh0cmFjdG9yID0gKGVsdDogSFRNTFBpY3R1cmVFbGVtZW50KSA9PlxuICBleHRyYWN0SFRNTEVsZW1lbnRCYXNlKGVsdCk7XG5cbmNvbnN0IEhUTUxfUFJFX0tFWVMgPSBbXG4gIFwid2lkdGhcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MUHJlRWxlbWVudClbXTtcbmNvbnN0IHByZUV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxQcmVFbGVtZW50PihIVE1MX1BSRV9LRVlTKTtcblxuY29uc3Qgc3BhbkV4dHJhY3RvciA9IChlbHQ6IEhUTUxTcGFuRWxlbWVudCkgPT4gZXh0cmFjdEhUTUxFbGVtZW50QmFzZShlbHQpO1xuXG5jb25zdCBIVE1MX1NUWUxFX0tFWVMgPSBbXG4gIFwibWVkaWFcIixcbiAgXCJ0eXBlXCIsXG4gIFwiZGlzYWJsZWRcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MU3R5bGVFbGVtZW50KVtdO1xuY29uc3Qgc3R5bGVFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MU3R5bGVFbGVtZW50PihIVE1MX1NUWUxFX0tFWVMpO1xuXG5jb25zdCBIVE1MX1RJVExFX0tFWVMgPSBbXG4gIFwidGV4dFwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxUaXRsZUVsZW1lbnQpW107XG5jb25zdCB0aXRsZUV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxUaXRsZUVsZW1lbnQ+KEhUTUxfVElUTEVfS0VZUyk7XG5cbmNvbnN0IEhUTUxfVUxfS0VZUyA9IFtcbiAgXCJjb21wYWN0XCIsXG4gIFwidHlwZVwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxVTGlzdEVsZW1lbnQpW107XG5jb25zdCB1bGlzdEV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxVTGlzdEVsZW1lbnQ+KEhUTUxfVUxfS0VZUyk7XG5cbi8vIE1hcCBvZiB0YWdOYW1lIC0+IGV4dHJhY3RvciAoY29uY2lzZSwgbGlrZSBldmVudHMudHMpXG5jb25zdCBlbGVtZW50RXh0cmFjdG9yczogUmVjb3JkPHN0cmluZywgKGVsdDogYW55KSA9PiBvYmplY3Q+ID0ge1xuICBBOiBhbmNob3JFeHRyYWN0b3IsXG4gIEFSRUE6IGFyZWFFeHRyYWN0b3IsXG4gIEFVRElPOiBhdWRpb0V4dHJhY3RvcixcbiAgQkFTRTogYmFzZUV4dHJhY3RvcixcbiAgQkxPQ0tRVU9URTogcXVvdGVFeHRyYWN0b3IsXG4gIFE6IHF1b3RlRXh0cmFjdG9yLFxuICBCT0RZOiBib2R5RXh0cmFjdG9yLFxuICBCUjogYnJFeHRyYWN0b3IsXG4gIEJVVFRPTjogYnV0dG9uRXh0cmFjdG9yLFxuICBDQU5WQVM6IGV4dHJhY3RIVE1MRWxlbWVudEJhc2UsXG4gIENBUFRJT046IHRhYmxlQ2FwdGlvbkV4dHJhY3RvcixcbiAgQ0lURTogY2l0ZUV4dHJhY3RvcixcbiAgQ09MOiB0YWJsZUNvbEV4dHJhY3RvcixcbiAgQ09MR1JPVVA6IHRhYmxlQ29sRXh0cmFjdG9yLFxuICBEQVRBOiBkYXRhRXh0cmFjdG9yLFxuICBERVRBSUxTOiBkZXRhaWxzRXh0cmFjdG9yLFxuICBESUFMT0c6IGRpYWxvZ0V4dHJhY3RvcixcbiAgRElWOiBkaXZFeHRyYWN0b3IsXG4gIERMOiBkbGlzdEV4dHJhY3RvcixcbiAgRU1CRUQ6IGVtYmVkRXh0cmFjdG9yLFxuICBGSUVMRFNFVDogZmllbGRzZXRFeHRyYWN0b3IsXG4gIEZPUk06IGZvcm1FeHRyYWN0b3IsXG4gIEgxOiBoZWFkaW5nRXh0cmFjdG9yLFxuICBIMjogaGVhZGluZ0V4dHJhY3RvcixcbiAgSDM6IGhlYWRpbmdFeHRyYWN0b3IsXG4gIEg0OiBoZWFkaW5nRXh0cmFjdG9yLFxuICBINTogaGVhZGluZ0V4dHJhY3RvcixcbiAgSDY6IGhlYWRpbmdFeHRyYWN0b3IsXG4gIEhFQUQ6IGhlYWRFeHRyYWN0b3IsXG4gIEhSOiBockV4dHJhY3RvcixcbiAgSFRNTDogaHRtbEV4dHJhY3RvcixcbiAgSUZSQU1FOiBpZnJhbWVFeHRyYWN0b3IsXG4gIElNRzogaW1hZ2VFeHRyYWN0b3IsXG4gIElOUFVUOiBpbnB1dEV4dHJhY3RvcixcbiAgTEFCRUw6IGxhYmVsRXh0cmFjdG9yLFxuICBMSTogbGlFeHRyYWN0b3IsXG4gIExJTks6IGxpbmtFeHRyYWN0b3IsXG4gIE1BUDogbWFwRXh0cmFjdG9yLFxuICBNRU5VOiBtZW51RXh0cmFjdG9yLFxuICBNRVRBOiBtZXRhRXh0cmFjdG9yLFxuICBNRVRFUjogbWV0ZXJFeHRyYWN0b3IsXG4gIElOUzogbW9kRXh0cmFjdG9yLFxuICBERUw6IG1vZEV4dHJhY3RvcixcbiAgT0JKRUNUOiBvYmplY3RFeHRyYWN0b3IsXG4gIE9MOiBvbGlzdEV4dHJhY3RvcixcbiAgT1BUR1JPVVA6IG9wdGdyb3VwRXh0cmFjdG9yLFxuICBPUFRJT046IG9wdGlvbkV4dHJhY3RvcixcbiAgT1VUUFVUOiBvdXRwdXRFeHRyYWN0b3IsXG4gIFA6IHBhcmFncmFwaEV4dHJhY3RvcixcbiAgUElDVFVSRTogcGljdHVyZUV4dHJhY3RvcixcbiAgUFJFOiBwcmVFeHRyYWN0b3IsXG4gIFBST0dSRVNTOiBwcm9ncmVzc0V4dHJhY3RvcixcbiAgU0NSSVBUOiBzY3JpcHRFeHRyYWN0b3IsXG4gIFNFTEVDVDogc2VsZWN0RXh0cmFjdG9yLFxuICBTTE9UOiBzbG90RXh0cmFjdG9yLFxuICBTT1VSQ0U6IHNvdXJjZUV4dHJhY3RvcixcbiAgU1BBTjogc3BhbkV4dHJhY3RvcixcbiAgU1RZTEU6IHN0eWxlRXh0cmFjdG9yLFxuICBUQUJMRTogdGFibGVFeHRyYWN0b3IsXG4gIFRCT0RZOiB0YWJsZVNlY3Rpb25FeHRyYWN0b3IsXG4gIFRIRUFEOiB0YWJsZVNlY3Rpb25FeHRyYWN0b3IsXG4gIFRGT09UOiB0YWJsZVNlY3Rpb25FeHRyYWN0b3IsXG4gIFREOiB0YWJsZUNlbGxFeHRyYWN0b3IsXG4gIFRIOiB0YWJsZUNlbGxFeHRyYWN0b3IsXG4gIFRFTVBMQVRFOiB0ZW1wbGF0ZUV4dHJhY3RvcixcbiAgVEVYVEFSRUE6IHRleHRhcmVhRXh0cmFjdG9yLFxuICBUSU1FOiB0aW1lRXh0cmFjdG9yLFxuICBUSVRMRTogdGl0bGVFeHRyYWN0b3IsXG4gIFRSOiB0YWJsZVJvd0V4dHJhY3RvcixcbiAgVFJBQ0s6IHRyYWNrRXh0cmFjdG9yLFxuICBVTDogdWxpc3RFeHRyYWN0b3IsXG4gIFZJREVPOiB2aWRlb0V4dHJhY3Rvcixcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0SFRNTEVsZW1lbnQoZWx0OiBIVE1MRWxlbWVudCk6IG9iamVjdCB7XG4gIGNvbnN0IHRhZ05hbWUgPSBlbHQudGFnTmFtZS50b1VwcGVyQ2FzZSgpO1xuXG4gIGNvbnN0IGV4dHJhY3RvciA9IGVsZW1lbnRFeHRyYWN0b3JzW3RhZ05hbWVdO1xuICBpZiAoZXh0cmFjdG9yKSB7XG4gICAgcmV0dXJuIGV4dHJhY3RvcihlbHQpO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgVW5leHBlY3RlZCBIVE1MIGVsZW1lbnQgdGFnOiAke2VsdC50YWdOYW1lfSAodXBkYXRlIC53ZWIvY3VzdG9tL3NlcmlhbGl6ZS50cylgXG4gICk7XG59XG4iLAogICAgIi8qID09PSBJTVBPUlRBTlQgPT09ICovXG5cbmltcG9ydCB7IGV4dHJhY3RIVE1MRWxlbWVudCB9IGZyb20gXCIuL2VsZW1lbnRzXCI7XG5pbXBvcnQgeyBjcmVhdGVFeHRyYWN0b3IgfSBmcm9tIFwiLi9leHRyYWN0b3JcIjtcblxuLy8gUmV1c2FibGUgY29tcHV0ZWQgbWFwcGVycyAoaGVscHMgYnVuZGxlcnMvbWluaWZpZXJzIHNoYXJlIHJlZmVyZW5jZXMpXG5jb25zdCBtYXBUYXJnZXQgPSAoZTogeyB0YXJnZXQ6IEV2ZW50VGFyZ2V0IHwgbnVsbCB9KSA9PlxuICBleHRyYWN0SFRNTEVsZW1lbnQoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpO1xuY29uc3QgbWFwUmVsYXRlZCA9IChlOiB7IHJlbGF0ZWRUYXJnZXQ6IEV2ZW50VGFyZ2V0IHwgbnVsbCB9KSA9PlxuICBlLnJlbGF0ZWRUYXJnZXQgPyBleHRyYWN0SFRNTEVsZW1lbnQoZS5yZWxhdGVkVGFyZ2V0IGFzIEhUTUxFbGVtZW50KSA6IG51bGw7XG5cbmZ1bmN0aW9uIG1ha2VFeHRyYWN0b3I8SyBleHRlbmRzIHJlYWRvbmx5IGFueVtdPihcbiAga2V5czogSyxcbiAgY29tcHV0ZWQ/OiBSZWNvcmQ8c3RyaW5nLCAoZXZ0OiBhbnkpID0+IGFueT5cbikge1xuICByZXR1cm4gY3JlYXRlRXh0cmFjdG9yPGFueT4oKShcbiAgICBrZXlzIGFzIGFueSxcbiAgICB7XG4gICAgICB0YXJnZXQ6IG1hcFRhcmdldCxcbiAgICAgIC4uLihjb21wdXRlZCB8fCB7fSksXG4gICAgfSBhcyBhbnlcbiAgKTtcbn1cblxuY29uc3QgU1lOVEhFVElDX0tFWVMgPSBbXG4gIFwidGFyZ2V0XCIsXG4gIFwiYnViYmxlc1wiLFxuICBcImNhbmNlbGFibGVcIixcbiAgXCJkZWZhdWx0UHJldmVudGVkXCIsXG4gIFwiZXZlbnRQaGFzZVwiLFxuICBcImlzVHJ1c3RlZFwiLFxuICBcInRpbWVTdGFtcFwiLFxuICBcInR5cGVcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBSZWFjdC5TeW50aGV0aWNFdmVudClbXTtcblxuY29uc3QgVUlfS0VZUyA9IFtcbiAgLi4uU1lOVEhFVElDX0tFWVMsXG4gIFwiZGV0YWlsXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgUmVhY3QuVUlFdmVudClbXTtcblxuY29uc3QgTU9VU0VfS0VZUyA9IFtcbiAgLi4uVUlfS0VZUyxcbiAgXCJhbHRLZXlcIixcbiAgXCJidXR0b25cIixcbiAgXCJidXR0b25zXCIsXG4gIFwiY2xpZW50WFwiLFxuICBcImNsaWVudFlcIixcbiAgXCJjdHJsS2V5XCIsXG4gIFwibWV0YUtleVwiLFxuICBcIm1vdmVtZW50WFwiLFxuICBcIm1vdmVtZW50WVwiLFxuICBcInBhZ2VYXCIsXG4gIFwicGFnZVlcIixcbiAgXCJzY3JlZW5YXCIsXG4gIFwic2NyZWVuWVwiLFxuICBcInNoaWZ0S2V5XCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgUmVhY3QuTW91c2VFdmVudClbXTtcblxuY29uc3QgUE9JTlRFUl9LRVlTID0gW1xuICAuLi5NT1VTRV9LRVlTLFxuICBcInBvaW50ZXJJZFwiLFxuICBcInByZXNzdXJlXCIsXG4gIFwidGFuZ2VudGlhbFByZXNzdXJlXCIsXG4gIFwidGlsdFhcIixcbiAgXCJ0aWx0WVwiLFxuICBcInR3aXN0XCIsXG4gIFwid2lkdGhcIixcbiAgXCJoZWlnaHRcIixcbiAgXCJwb2ludGVyVHlwZVwiLFxuICBcImlzUHJpbWFyeVwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIFJlYWN0LlBvaW50ZXJFdmVudClbXTtcblxuY29uc3Qgc3ludGhldGljRXh0cmFjdG9yID0gbWFrZUV4dHJhY3RvcihTWU5USEVUSUNfS0VZUyk7XG5cbmNvbnN0IHVpRXh0cmFjdG9yID0gbWFrZUV4dHJhY3RvcihVSV9LRVlTKTtcblxuY29uc3QgbW91c2VFeHRyYWN0b3IgPSBtYWtlRXh0cmFjdG9yKE1PVVNFX0tFWVMsIHsgcmVsYXRlZFRhcmdldDogbWFwUmVsYXRlZCB9KTtcblxuY29uc3QgY2xpcGJvYXJkRXh0cmFjdG9yID0gbWFrZUV4dHJhY3RvcihTWU5USEVUSUNfS0VZUywge1xuICBjbGlwYm9hcmREYXRhOiAoZSkgPT4gZXh0cmFjdERhdGFUcmFuc2ZlcihlLmNsaXBib2FyZERhdGEpLFxufSk7XG5cbmNvbnN0IGNvbXBvc2l0aW9uRXh0cmFjdG9yID0gbWFrZUV4dHJhY3RvcihbXG4gIC4uLlNZTlRIRVRJQ19LRVlTLFxuICBcImRhdGFcIixcbl0gYXMgY29uc3QpO1xuXG5jb25zdCBkcmFnRXh0cmFjdG9yID0gbWFrZUV4dHJhY3RvcihNT1VTRV9LRVlTLCB7XG4gIHJlbGF0ZWRUYXJnZXQ6IG1hcFJlbGF0ZWQsXG4gIGRhdGFUcmFuc2ZlcjogKGUpID0+IGV4dHJhY3REYXRhVHJhbnNmZXIoZS5kYXRhVHJhbnNmZXIpLFxufSk7XG5cbmNvbnN0IHBvaW50ZXJFeHRyYWN0b3IgPSBtYWtlRXh0cmFjdG9yKFBPSU5URVJfS0VZUywge1xuICByZWxhdGVkVGFyZ2V0OiBtYXBSZWxhdGVkLFxufSk7XG5cbmNvbnN0IGZvY3VzRXh0cmFjdG9yID0gbWFrZUV4dHJhY3RvcihTWU5USEVUSUNfS0VZUywge1xuICByZWxhdGVkVGFyZ2V0OiBtYXBSZWxhdGVkLFxufSk7XG5cbmNvbnN0IGZvcm1FeHRyYWN0b3IgPSBtYWtlRXh0cmFjdG9yKFNZTlRIRVRJQ19LRVlTKTtcblxuY29uc3QgaW52YWxpZEV4dHJhY3RvciA9IG1ha2VFeHRyYWN0b3IoU1lOVEhFVElDX0tFWVMpO1xuXG5jb25zdCBjaGFuZ2VFeHRyYWN0b3IgPSBtYWtlRXh0cmFjdG9yKFNZTlRIRVRJQ19LRVlTKTtcblxuY29uc3Qga2V5Ym9hcmRFeHRyYWN0b3IgPSBtYWtlRXh0cmFjdG9yKFtcbiAgLi4uVUlfS0VZUyxcbiAgXCJhbHRLZXlcIixcbiAgXCJjdHJsS2V5XCIsXG4gIFwiY29kZVwiLFxuICBcImtleVwiLFxuICBcImxvY2FsZVwiLFxuICBcImxvY2F0aW9uXCIsXG4gIFwibWV0YUtleVwiLFxuICBcInJlcGVhdFwiLFxuICBcInNoaWZ0S2V5XCIsXG5dIGFzIGNvbnN0KTtcblxuY29uc3QgdG91Y2hFeHRyYWN0b3IgPSBtYWtlRXh0cmFjdG9yKFxuICBbXG4gICAgLi4uVUlfS0VZUyxcbiAgICBcImFsdEtleVwiLFxuICAgIFwiY3RybEtleVwiLFxuICAgIFwibWV0YUtleVwiLFxuICAgIFwic2hpZnRLZXlcIixcbiAgICBcImNoYW5nZWRUb3VjaGVzXCIsXG4gICAgXCJ0YXJnZXRUb3VjaGVzXCIsXG4gICAgXCJ0b3VjaGVzXCIsXG4gIF0gYXMgY29uc3QsXG4gIHtcbiAgICBjaGFuZ2VkVG91Y2hlczogKGUpID0+IG1hcFRvdWNoTGlzdChlLmNoYW5nZWRUb3VjaGVzKSxcbiAgICB0YXJnZXRUb3VjaGVzOiAoZSkgPT4gbWFwVG91Y2hMaXN0KGUudGFyZ2V0VG91Y2hlcyksXG4gICAgdG91Y2hlczogKGUpID0+IG1hcFRvdWNoTGlzdChlLnRvdWNoZXMpLFxuICB9XG4pO1xuXG5jb25zdCB3aGVlbEV4dHJhY3RvciA9IG1ha2VFeHRyYWN0b3IoXG4gIFsuLi5NT1VTRV9LRVlTLCBcImRlbHRhTW9kZVwiLCBcImRlbHRhWFwiLCBcImRlbHRhWVwiLCBcImRlbHRhWlwiXSBhcyBjb25zdCxcbiAge1xuICAgIHJlbGF0ZWRUYXJnZXQ6IG1hcFJlbGF0ZWQsXG4gIH1cbik7XG5cbmNvbnN0IGFuaW1hdGlvbkV4dHJhY3RvciA9IG1ha2VFeHRyYWN0b3IoW1xuICAuLi5TWU5USEVUSUNfS0VZUyxcbiAgXCJhbmltYXRpb25OYW1lXCIsXG4gIFwiZWxhcHNlZFRpbWVcIixcbiAgXCJwc2V1ZG9FbGVtZW50XCIsXG5dIGFzIGNvbnN0KTtcblxuY29uc3QgdG9nZ2xlRXh0cmFjdG9yID0gbWFrZUV4dHJhY3RvcihbXG4gIC4uLlNZTlRIRVRJQ19LRVlTLFxuICBcIm9sZFN0YXRlXCIsXG4gIFwibmV3U3RhdGVcIixcbl0gYXMgY29uc3QpO1xuXG5jb25zdCB0cmFuc2l0aW9uRXh0cmFjdG9yID0gbWFrZUV4dHJhY3RvcihbXG4gIC4uLlNZTlRIRVRJQ19LRVlTLFxuICBcImVsYXBzZWRUaW1lXCIsXG4gIFwicHJvcGVydHlOYW1lXCIsXG4gIFwicHNldWRvRWxlbWVudFwiLFxuXSBhcyBjb25zdCk7XG5cbmZ1bmN0aW9uIG1hcFRvdWNoTGlzdChsaXN0OiBhbnkpOiBhbnlbXSB7XG4gIHJldHVybiBBcnJheS5mcm9tKGxpc3QgYXMgQXJyYXlMaWtlPGFueT4pLm1hcCgodG91Y2g6IGFueSkgPT4gKHtcbiAgICB0YXJnZXQ6IGV4dHJhY3RIVE1MRWxlbWVudCh0b3VjaC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLFxuICAgIGlkZW50aWZpZXI6IHRvdWNoLmlkZW50aWZpZXIsXG4gICAgc2NyZWVuWDogdG91Y2guc2NyZWVuWCxcbiAgICBzY3JlZW5ZOiB0b3VjaC5zY3JlZW5ZLFxuICAgIGNsaWVudFg6IHRvdWNoLmNsaWVudFgsXG4gICAgY2xpZW50WTogdG91Y2guY2xpZW50WSxcbiAgICBwYWdlWDogdG91Y2gucGFnZVgsXG4gICAgcGFnZVk6IHRvdWNoLnBhZ2VZLFxuICB9KSk7XG59XG5cbi8vIEhlbHBlciBmdW5jdGlvbiB0byBleHRyYWN0IERhdGFUcmFuc2ZlciBwcm9wZXJ0aWVzXG5mdW5jdGlvbiBleHRyYWN0RGF0YVRyYW5zZmVyKGR0OiBEYXRhVHJhbnNmZXIgfCBudWxsKTogb2JqZWN0IHwgbnVsbCB7XG4gIGlmICghZHQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCBpdGVtcyA9IFtdO1xuICBpZiAoZHQuaXRlbXMpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGR0Lml0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBpdGVtID0gZHQuaXRlbXNbaV0hO1xuICAgICAgaXRlbXMucHVzaCh7XG4gICAgICAgIGtpbmQ6IGl0ZW0ua2luZCxcbiAgICAgICAgdHlwZTogaXRlbS50eXBlLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgZHJvcF9lZmZlY3Q6IGR0LmRyb3BFZmZlY3QsXG4gICAgZWZmZWN0X2FsbG93ZWQ6IGR0LmVmZmVjdEFsbG93ZWQsXG4gICAgaXRlbXM6IGl0ZW1zLFxuICAgIHR5cGVzOiBBcnJheS5mcm9tKGR0LnR5cGVzIHx8IFtdKSxcbiAgfTtcbn1cblxuY29uc3QgZXZlbnRFeHRyYWN0b3JNYXA6IHsgW2tleTogc3RyaW5nXTogKGV2dDogYW55KSA9PiBvYmplY3QgfSA9IHt9O1xuXG5mdW5jdGlvbiBhZGQobWFwOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBuYW1lczogcmVhZG9ubHkgc3RyaW5nW10sIGZuOiBhbnkpIHtcbiAgZm9yIChjb25zdCBuIG9mIG5hbWVzKSBtYXBbbl0gPSBmbjtcbn1cblxuYWRkKFxuICBldmVudEV4dHJhY3Rvck1hcCxcbiAgW1xuICAgIFwicG9pbnRlcmRvd25cIixcbiAgICBcInBvaW50ZXJtb3ZlXCIsXG4gICAgXCJwb2ludGVydXBcIixcbiAgICBcInBvaW50ZXJjYW5jZWxcIixcbiAgICBcImdvdHBvaW50ZXJjYXB0dXJlXCIsXG4gICAgXCJsb3N0cG9pbnRlcmNhcHR1cmVcIixcbiAgICBcInBvaW50ZXJlbnRlclwiLFxuICAgIFwicG9pbnRlcmxlYXZlXCIsXG4gICAgXCJwb2ludGVyb3ZlclwiLFxuICAgIFwicG9pbnRlcm91dFwiLFxuICBdLFxuICBwb2ludGVyRXh0cmFjdG9yXG4pO1xuXG5hZGQoXG4gIGV2ZW50RXh0cmFjdG9yTWFwLFxuICBbXG4gICAgXCJjbGlja1wiLFxuICAgIFwiY29udGV4dG1lbnVcIixcbiAgICBcImRibGNsaWNrXCIsXG4gICAgXCJtb3VzZWRvd25cIixcbiAgICBcIm1vdXNlZW50ZXJcIixcbiAgICBcIm1vdXNlbGVhdmVcIixcbiAgICBcIm1vdXNlbW92ZVwiLFxuICAgIFwibW91c2VvdXRcIixcbiAgICBcIm1vdXNlb3ZlclwiLFxuICAgIFwibW91c2V1cFwiLFxuICBdLFxuICBtb3VzZUV4dHJhY3RvclxuKTtcblxuYWRkKFxuICBldmVudEV4dHJhY3Rvck1hcCxcbiAgW1xuICAgIFwiZHJhZ1wiLFxuICAgIFwiZHJhZ2VuZFwiLFxuICAgIFwiZHJhZ2VudGVyXCIsXG4gICAgXCJkcmFnZXhpdFwiLFxuICAgIFwiZHJhZ2xlYXZlXCIsXG4gICAgXCJkcmFnb3ZlclwiLFxuICAgIFwiZHJhZ3N0YXJ0XCIsXG4gICAgXCJkcm9wXCIsXG4gIF0sXG4gIGRyYWdFeHRyYWN0b3Jcbik7XG5cbmFkZChldmVudEV4dHJhY3Rvck1hcCwgW1wia2V5ZG93blwiLCBcImtleXByZXNzXCIsIFwia2V5dXBcIl0sIGtleWJvYXJkRXh0cmFjdG9yKTtcbmFkZChldmVudEV4dHJhY3Rvck1hcCwgW1wiZm9jdXNcIiwgXCJibHVyXCJdLCBmb2N1c0V4dHJhY3Rvcik7XG5hZGQoZXZlbnRFeHRyYWN0b3JNYXAsIFtcImNoYW5nZVwiLCBcImlucHV0XCJdLCBjaGFuZ2VFeHRyYWN0b3IpO1xuYWRkKGV2ZW50RXh0cmFjdG9yTWFwLCBbXCJpbnZhbGlkXCJdLCBpbnZhbGlkRXh0cmFjdG9yKTtcbmFkZChldmVudEV4dHJhY3Rvck1hcCwgW1wicmVzZXRcIiwgXCJzdWJtaXRcIl0sIGZvcm1FeHRyYWN0b3IpO1xuYWRkKGV2ZW50RXh0cmFjdG9yTWFwLCBbXCJjb3B5XCIsIFwiY3V0XCIsIFwicGFzdGVcIl0sIGNsaXBib2FyZEV4dHJhY3Rvcik7XG5hZGQoXG4gIGV2ZW50RXh0cmFjdG9yTWFwLFxuICBbXCJjb21wb3NpdGlvbmVuZFwiLCBcImNvbXBvc2l0aW9uc3RhcnRcIiwgXCJjb21wb3NpdGlvbnVwZGF0ZVwiXSxcbiAgY29tcG9zaXRpb25FeHRyYWN0b3Jcbik7XG5hZGQoXG4gIGV2ZW50RXh0cmFjdG9yTWFwLFxuICBbXCJ0b3VjaGNhbmNlbFwiLCBcInRvdWNoZW5kXCIsIFwidG91Y2htb3ZlXCIsIFwidG91Y2hzdGFydFwiXSxcbiAgdG91Y2hFeHRyYWN0b3Jcbik7XG5hZGQoZXZlbnRFeHRyYWN0b3JNYXAsIFtcInNjcm9sbFwiXSwgdWlFeHRyYWN0b3IpO1xuYWRkKGV2ZW50RXh0cmFjdG9yTWFwLCBbXCJ3aGVlbFwiXSwgd2hlZWxFeHRyYWN0b3IpO1xuYWRkKFxuICBldmVudEV4dHJhY3Rvck1hcCxcbiAgW1wiYW5pbWF0aW9uc3RhcnRcIiwgXCJhbmltYXRpb25lbmRcIiwgXCJhbmltYXRpb25pdGVyYXRpb25cIl0sXG4gIGFuaW1hdGlvbkV4dHJhY3RvclxuKTtcbmFkZChldmVudEV4dHJhY3Rvck1hcCwgW1widHJhbnNpdGlvbmVuZFwiXSwgdHJhbnNpdGlvbkV4dHJhY3Rvcik7XG5hZGQoZXZlbnRFeHRyYWN0b3JNYXAsIFtcInRvZ2dsZVwiXSwgdG9nZ2xlRXh0cmFjdG9yKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RFdmVudCh2YWx1ZTogYW55KTogYW55IHtcbiAgLy8gRHVjay10eXBpbmcgZm9yIFJlYWN0J3MgU3ludGhldGljRXZlbnQuXG4gIC8vIFdlIGNoZWNrIGZvciBwcm9wZXJ0aWVzIHRoYXQgYXJlIHVuaXF1ZSB0byBzeW50aGV0aWMgZXZlbnRzLlxuICBpZiAoXG4gICAgdmFsdWUgJiZcbiAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICBcIm5hdGl2ZUV2ZW50XCIgaW4gdmFsdWUgJiZcbiAgICB0eXBlb2YgdmFsdWUuaXNEZWZhdWx0UHJldmVudGVkID09PSBcImZ1bmN0aW9uXCJcbiAgKSB7XG4gICAgY29uc3QgZXZ0ID0gdmFsdWUgYXMgUmVhY3QuU3ludGhldGljRXZlbnQ7XG4gICAgLy8gVGhlIGB0eXBlYCBwcm9wZXJ0eSBpcyBjcnVjaWFsIGZvciB0aGUgbG9va3VwLlxuICAgIGlmICh0eXBlb2YgZXZ0LnR5cGUgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBleHRyYWN0b3IgPSBldmVudEV4dHJhY3Rvck1hcFtldnQudHlwZS50b0xvd2VyQ2FzZSgpXTtcbiAgICBpZiAoZXh0cmFjdG9yKSB7XG4gICAgICByZXR1cm4gZXh0cmFjdG9yKGV2dCk7XG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2sgZm9yIHVua25vd24gZXZlbnQgdHlwZXM6IG1pbmltYWwgc3ludGhldGljIGV4dHJhY3RvclxuICAgIHJldHVybiBzeW50aGV0aWNFeHRyYWN0b3IoZXZ0KTtcbiAgfVxuXG4gIC8vIElmIGl0J3Mgbm90IGEgZHVjay10eXBlZCBldmVudCwgcmV0dXJuIGl0IGFzIGlzLlxuICByZXR1cm4gdmFsdWU7XG59XG4iLAogICAgImV4cG9ydCB0eXBlIFByaW1pdGl2ZSA9IG51bWJlciB8IHN0cmluZyB8IGJvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkO1xuZXhwb3J0IHR5cGUgSlNPTjxUPiA9IFQgfCBBcnJheTxKU09OPFQ+PiB8IHsgW0s6IHN0cmluZ106IEpTT048VD4gfTtcbmV4cG9ydCB0eXBlIFBsYWluSlNPTiA9IEpTT048UHJpbWl0aXZlPjtcbmV4cG9ydCB0eXBlIFNlcmlhbGl6YWJsZSA9IGFueTtcblxuZXhwb3J0IHR5cGUgU2VyaWFsaXplZCA9IFtbbnVtYmVyW10sIG51bWJlcltdLCBudW1iZXJbXSwgbnVtYmVyW11dLCBQbGFpbkpTT05dO1xuXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplKGRhdGE6IFNlcmlhbGl6YWJsZSk6IFNlcmlhbGl6ZWQge1xuICBjb25zdCBzZWVuID0gbmV3IE1hcDxhbnksIG51bWJlcj4oKTtcbiAgY29uc3QgcmVmczogbnVtYmVyW10gPSBbXTtcbiAgY29uc3QgZGF0ZXM6IG51bWJlcltdID0gW107XG4gIGNvbnN0IHNldHM6IG51bWJlcltdID0gW107XG4gIGNvbnN0IG1hcHM6IG51bWJlcltdID0gW107XG5cbiAgLy8gU2luZ2xlIGdsb2JhbCBjb3VudGVyIC0gaW5jcmVtZW50cyBvbmNlIHBlciBub2RlIHZpc2l0XG4gIGxldCBnbG9iYWxJbmRleCA9IDA7XG5cbiAgZnVuY3Rpb24gcHJvY2Vzcyh2YWx1ZTogU2VyaWFsaXphYmxlKTogUGxhaW5KU09OIHtcbiAgICBpZiAoXG4gICAgICB2YWx1ZSA9PSBudWxsIHx8XG4gICAgICB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgfHxcbiAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fFxuICAgICAgdHlwZW9mIHZhbHVlID09PSBcImJvb2xlYW5cIlxuICAgICkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIGNvbnN0IGlkeCA9IGdsb2JhbEluZGV4Kys7XG4gICAgY29uc3QgcHJldlJlZiA9IHNlZW4uZ2V0KHZhbHVlKTtcbiAgICBpZiAocHJldlJlZiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBNYWtlIHN1cmUgdG8gcHVzaCB0aGUgY3VycmVudCBpbmRleCwgYnV0IHVzZSB0aGUgcmVmJ3MgaW5kZXggYXMgdGhlIHZhbHVlIVxuICAgICAgcmVmcy5wdXNoKGlkeCk7XG4gICAgICByZXR1cm4gcHJldlJlZjtcbiAgICB9XG5cbiAgICBzZWVuLnNldCh2YWx1ZSwgaWR4KTtcblxuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgIGRhdGVzLnB1c2goaWR4KTtcbiAgICAgIHJldHVybiB2YWx1ZS5nZXRUaW1lKCk7XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBjb25zdCBsZW5ndGggPSB2YWx1ZS5sZW5ndGg7XG4gICAgICBjb25zdCByZXN1bHQgPSBuZXcgQXJyYXkobGVuZ3RoKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmVzdWx0W2ldID0gcHJvY2Vzcyh2YWx1ZVtpXSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE1hcCkge1xuICAgICAgbWFwcy5wdXNoKGlkeCk7XG4gICAgICBjb25zdCByZWM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgZW50cnldIG9mIHZhbHVlLmVudHJpZXMoKSkge1xuICAgICAgICByZWNbU3RyaW5nKGtleSldID0gcHJvY2VzcyhlbnRyeSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVjO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFNldCkge1xuICAgICAgc2V0cy5wdXNoKGlkeCk7XG4gICAgICBjb25zdCBzaXplID0gdmFsdWUuc2l6ZTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBBcnJheShzaXplKTtcbiAgICAgIGxldCBpID0gMDtcbiAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgdmFsdWUpIHtcbiAgICAgICAgcmVzdWx0W2ldID0gcHJvY2VzcyhlbnRyeSk7XG4gICAgICAgIGkgKz0gMTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgY29uc3QgcmVjOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModmFsdWUpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGtleXNbaV07XG4gICAgICAgIHJlY1trZXldID0gcHJvY2Vzcyh2YWx1ZVtrZXldKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZWM7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCB2YWx1ZSBpbiBzZXJpYWxpemF0aW9uOiAke3ZhbHVlfWApO1xuICB9XG5cbiAgY29uc3QgcGF5bG9hZCA9IHByb2Nlc3MoZGF0YSk7XG4gIHJldHVybiBbW3JlZnMsIGRhdGVzLCBzZXRzLCBtYXBzXSwgcGF5bG9hZF07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVzZXJpYWxpemF0aW9uT3B0aW9ucyB7XG4gIGNvZXJjZU51bGxzVG9VbmRlZmluZWQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVzZXJpYWxpemU8RGF0YSBleHRlbmRzIFNlcmlhbGl6YWJsZSA9IFNlcmlhbGl6YWJsZT4oXG4gIHBheWxvYWQ6IFNlcmlhbGl6ZWQsXG4gIG9wdGlvbnM/OiBEZXNlcmlhbGl6YXRpb25PcHRpb25zXG4pOiBEYXRhIHtcbiAgY29uc3QgW1tyZWZzQSwgZGF0ZXNBLCBzZXRzQSwgbWFwc0FdLCBkYXRhXSA9IHBheWxvYWQ7XG5cbiAgY29uc3QgcmVmcyA9IG5ldyBTZXQocmVmc0EpO1xuICBjb25zdCBkYXRlcyA9IG5ldyBTZXQoZGF0ZXNBKTtcbiAgY29uc3Qgc2V0cyA9IG5ldyBTZXQoc2V0c0EpO1xuICBjb25zdCBtYXBzID0gbmV3IFNldChtYXBzQSk7XG5cbiAgY29uc3Qgb2JqZWN0czogQXJyYXk8YW55PiA9IFtdO1xuXG4gIGZ1bmN0aW9uIHJlY29uc3RydWN0KHZhbHVlOiBQbGFpbkpTT04pOiBhbnkge1xuICAgIGNvbnN0IGlkeCA9IG9iamVjdHMubGVuZ3RoO1xuICAgIGlmIChyZWZzLmhhcyhpZHgpKSB7XG4gICAgICAvLyBXZSBpbmNyZW1lbnQgdGhlIGNvdW50ZXIgb24gcmVmcyBkdXJpbmcgc2VyaWFsaXphdGlvbi4gV2UncmUgbmV2ZXJcbiAgICAgIC8vIGdvaW5nIHRvIHVzZSB0aGlzIGVudHJ5LCBzbyB3ZSBjYW4ganVzdCBwdXNoIG51bGwuXG4gICAgICBvYmplY3RzLnB1c2gobnVsbCk7XG4gICAgICByZXR1cm4gb2JqZWN0c1t2YWx1ZSBhcyBudW1iZXJdO1xuICAgIH1cblxuICAgIGlmIChkYXRlcy5oYXMoaWR4KSkge1xuICAgICAgY29uc3QgZHQgPSBuZXcgRGF0ZSh2YWx1ZSBhcyBudW1iZXIpO1xuICAgICAgb2JqZWN0cy5wdXNoKGR0KTtcbiAgICAgIHJldHVybiBkdDtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICB2YWx1ZSA9PSBudWxsIHx8XG4gICAgICB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgfHxcbiAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fFxuICAgICAgdHlwZW9mIHZhbHVlID09PSBcImJvb2xlYW5cIlxuICAgICkge1xuICAgICAgaWYgKG9wdGlvbnM/LmNvZXJjZU51bGxzVG9VbmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID8/IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGlmIChzZXRzLmhhcyhpZHgpKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBTZXQoKTtcbiAgICAgICAgb2JqZWN0cy5wdXNoKHJlc3VsdCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICByZXN1bHQuYWRkKHJlY29uc3RydWN0KHZhbHVlW2ldKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbGVuZ3RoID0gdmFsdWUubGVuZ3RoO1xuICAgICAgY29uc3QgYXJyID0gbmV3IEFycmF5KGxlbmd0aCk7XG4gICAgICBvYmplY3RzLnB1c2goYXJyKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYXJyW2ldID0gcmVjb25zdHJ1Y3QodmFsdWVbaV0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFycjtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBpZiAobWFwcy5oYXMoaWR4KSkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgTWFwPHN0cmluZywgYW55PigpO1xuICAgICAgICBvYmplY3RzLnB1c2gocmVzdWx0KTtcbiAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHZhbHVlKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3Qga2V5ID0ga2V5c1tpXTtcbiAgICAgICAgICByZXN1bHQuc2V0KGtleSwgcmVjb25zdHJ1Y3QodmFsdWVba2V5XSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgICAgb2JqZWN0cy5wdXNoKHJlc3VsdCk7XG4gICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModmFsdWUpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGtleXNbaV07XG4gICAgICAgIHJlc3VsdFtrZXldID0gcmVjb25zdHJ1Y3QodmFsdWVba2V5XSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgdmFsdWUgaW4gZGVzZXJpYWxpemF0aW9uOiAke3ZhbHVlfWApO1xuICB9XG5cbiAgcmV0dXJuIHJlY29uc3RydWN0KGRhdGEpO1xufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IFJvdXRlSW5mbyB9IGZyb20gXCIuL2hlbHBlcnNcIjtcbmltcG9ydCB0eXBlIHsgVkRPTSwgVkRPTVVwZGF0ZSB9IGZyb20gXCIuL3Zkb21cIjtcbmltcG9ydCB7IGV4dHJhY3RFdmVudCB9IGZyb20gXCIuL3NlcmlhbGl6ZS9ldmVudHNcIjtcbmltcG9ydCB7IHNlcmlhbGl6ZSwgZGVzZXJpYWxpemUgfSBmcm9tIFwiLi9zZXJpYWxpemUvdjNcIjtcblxuaW1wb3J0IHsgaW8sIFNvY2tldCB9IGZyb20gXCJzb2NrZXQuaW8tY2xpZW50XCI7XG5pbXBvcnQgdHlwZSB7XG4gIENsaWVudEFwaVJlc3VsdE1lc3NhZ2UsXG4gIENsaWVudENoYW5uZWxNZXNzYWdlLFxuICBDbGllbnRNZXNzYWdlLFxuICBTZXJ2ZXJBcGlDYWxsTWVzc2FnZSxcbiAgU2VydmVyQ2hhbm5lbE1lc3NhZ2UsXG4gIFNlcnZlckVycm9ySW5mbyxcbiAgU2VydmVyTWVzc2FnZSxcbn0gZnJvbSBcIi4vbWVzc2FnZXNcIjtcbmltcG9ydCB0eXBlIHsgTmF2aWdhdGVGdW5jdGlvbiB9IGZyb20gXCJyZWFjdC1yb3V0ZXJcIjtcbmltcG9ydCB0eXBlIHsgQ2hhbm5lbEJyaWRnZSB9IGZyb20gXCIuL2NoYW5uZWxcIjtcbmltcG9ydCB7IGNyZWF0ZUNoYW5uZWxCcmlkZ2UsIFB1bHNlQ2hhbm5lbFJlc2V0RXJyb3IgfSBmcm9tIFwiLi9jaGFubmVsXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW91bnRlZFZpZXcge1xuICByb3V0ZUluZm86IFJvdXRlSW5mbztcbiAgb25Jbml0OiAodmRvbTogVkRPTSkgPT4gdm9pZDtcbiAgb25VcGRhdGU6IChvcHM6IFZET01VcGRhdGVbXSkgPT4gdm9pZDtcbn1cbmV4cG9ydCB0eXBlIENvbm5lY3Rpb25TdGF0dXNMaXN0ZW5lciA9IChjb25uZWN0ZWQ6IGJvb2xlYW4pID0+IHZvaWQ7XG5leHBvcnQgdHlwZSBTZXJ2ZXJFcnJvckxpc3RlbmVyID0gKFxuICBwYXRoOiBzdHJpbmcsXG4gIGVycm9yOiBTZXJ2ZXJFcnJvckluZm8gfCBudWxsXG4pID0+IHZvaWQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHVsc2VDbGllbnQge1xuICAvLyBDb25uZWN0aW9uIG1hbmFnZW1lbnRcbiAgY29ubmVjdCgpOiBQcm9taXNlPHZvaWQ+O1xuICBkaXNjb25uZWN0KCk6IHZvaWQ7XG4gIGlzQ29ubmVjdGVkKCk6IGJvb2xlYW47XG4gIG9uQ29ubmVjdGlvbkNoYW5nZShsaXN0ZW5lcjogQ29ubmVjdGlvblN0YXR1c0xpc3RlbmVyKTogKCkgPT4gdm9pZDtcbiAgLy8gTWVzc2FnZXNcbiAgbmF2aWdhdGUocGF0aDogc3RyaW5nLCByb3V0ZUluZm86IFJvdXRlSW5mbyk6IFByb21pc2U8dm9pZD47XG4gIGxlYXZlKHBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD47XG4gIGludm9rZUNhbGxiYWNrKHBhdGg6IHN0cmluZywgY2FsbGJhY2s6IHN0cmluZywgYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+O1xuICAvLyBWRE9NIHN1YnNjcmlwdGlvblxuICBtb3VudFZpZXcocGF0aDogc3RyaW5nLCB2aWV3OiBNb3VudGVkVmlldyk6ICgpID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBjbGFzcyBQdWxzZVNvY2tldElPQ2xpZW50IHtcbiAgcHJpdmF0ZSBhY3RpdmVWaWV3czogTWFwPHN0cmluZywgTW91bnRlZFZpZXc+O1xuICBwcml2YXRlIHNvY2tldDogU29ja2V0IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbWVzc2FnZVF1ZXVlOiBDbGllbnRNZXNzYWdlW107XG4gIHByaXZhdGUgY29ubmVjdGlvbkxpc3RlbmVyczogU2V0PENvbm5lY3Rpb25TdGF0dXNMaXN0ZW5lcj4gPSBuZXcgU2V0KCk7XG4gIHByaXZhdGUgc2VydmVyRXJyb3JzOiBNYXA8c3RyaW5nLCBTZXJ2ZXJFcnJvckluZm8+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIHNlcnZlckVycm9yTGlzdGVuZXJzOiBTZXQ8U2VydmVyRXJyb3JMaXN0ZW5lcj4gPSBuZXcgU2V0KCk7XG4gIHByaXZhdGUgY2hhbm5lbHM6IE1hcDxzdHJpbmcsIHsgYnJpZGdlOiBDaGFubmVsQnJpZGdlOyByZWZDb3VudDogbnVtYmVyIH0+ID0gbmV3IE1hcCgpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgdXJsOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSByZW5kZXJJZDogc3RyaW5nLFxuICAgIHByaXZhdGUgZnJhbWV3b3JrTmF2aWdhdGU6IE5hdmlnYXRlRnVuY3Rpb25cbiAgKSB7XG4gICAgdGhpcy5zb2NrZXQgPSBudWxsO1xuICAgIHRoaXMuYWN0aXZlVmlld3MgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5tZXNzYWdlUXVldWUgPSBbXTtcbiAgfVxuICBwdWJsaWMgaXNDb25uZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc29ja2V0Py5jb25uZWN0ZWQgPz8gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgY29ubmVjdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5zb2NrZXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHNvY2tldCA9IGlvKHRoaXMudXJsLCB7XG4gICAgICAgIHRyYW5zcG9ydHM6IFtcIndlYnNvY2tldFwiLCBcIndlYnRyYW5zcG9ydFwiXSxcbiAgICAgICAgYXV0aDogeyByZW5kZXJJZDogdGhpcy5yZW5kZXJJZCB9LFxuICAgICAgfSk7XG4gICAgICB0aGlzLnNvY2tldCA9IHNvY2tldDtcblxuICAgICAgc29ja2V0Lm9uKFwiY29ubmVjdFwiLCAoKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiW1NvY2tldElPVHJhbnNwb3J0XSBDb25uZWN0ZWQ6XCIsIHRoaXMuc29ja2V0Py5pZCk7XG4gICAgICAgIC8vIE1ha2Ugc3VyZSB0byBzZW5kIGEgbmF2aWdhdGUgcGF5bG9hZCBmb3IgYWxsIHRoZSByb3V0ZXNcbiAgICAgICAgZm9yIChjb25zdCBbcGF0aCwgcm91dGVdIG9mIHRoaXMuYWN0aXZlVmlld3MpIHtcbiAgICAgICAgICBzb2NrZXQuZW1pdChcbiAgICAgICAgICAgIFwibWVzc2FnZVwiLFxuICAgICAgICAgICAgc2VyaWFsaXplKHtcbiAgICAgICAgICAgICAgdHlwZTogXCJtb3VudFwiLFxuICAgICAgICAgICAgICBwYXRoOiBwYXRoLFxuICAgICAgICAgICAgICByb3V0ZUluZm86IHJvdXRlLnJvdXRlSW5mbyxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgcGF5bG9hZCBvZiB0aGlzLm1lc3NhZ2VRdWV1ZSkge1xuICAgICAgICAgIC8vIEFscmVhZHkgc2VudCBhYm92ZVxuICAgICAgICAgIGlmIChwYXlsb2FkLnR5cGUgPT09IFwibW91bnRcIiAmJiB0aGlzLmFjdGl2ZVZpZXdzLmhhcyhwYXlsb2FkLnBhdGgpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gV2UncmUgcmVtb3VudGluZyBhbGwgdGhlIHJvdXRlcywgc28gbm8gbmVlZCB0byBuYXZpZ2F0ZVxuICAgICAgICAgIGlmIChwYXlsb2FkLnR5cGUgPT09IFwibmF2aWdhdGVcIikge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNvY2tldC5lbWl0KFwibWVzc2FnZVwiLCBzZXJpYWxpemUocGF5bG9hZCkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWVzc2FnZVF1ZXVlID0gW107XG5cbiAgICAgICAgdGhpcy5ub3RpZnlDb25uZWN0aW9uTGlzdGVuZXJzKHRydWUpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9KTtcblxuICAgICAgc29ja2V0Lm9uKFwiY29ubmVjdF9lcnJvclwiLCAoZXJyKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJbU29ja2V0SU9UcmFuc3BvcnRdIENvbm5lY3Rpb24gZmFpbGVkOlwiLCBlcnIpO1xuICAgICAgICB0aGlzLm5vdGlmeUNvbm5lY3Rpb25MaXN0ZW5lcnMoZmFsc2UpO1xuICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgIH0pO1xuXG4gICAgICBzb2NrZXQub24oXCJkaXNjb25uZWN0XCIsICgpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coXCJbU29ja2V0SU9UcmFuc3BvcnRdIERpc2Nvbm5lY3RlZFwiKTtcbiAgICAgICAgdGhpcy5oYW5kbGVUcmFuc3BvcnREaXNjb25uZWN0KCk7XG4gICAgICAgIHRoaXMubm90aWZ5Q29ubmVjdGlvbkxpc3RlbmVycyhmYWxzZSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gV3JhcCBpbiBhbiBhcnJvdyBmdW5jdGlvbiB0byBhdm9pZCBsb3NpbmcgdGhlIGB0aGlzYCByZWZlcmVuY2VcbiAgICAgIHNvY2tldC5vbihcIm1lc3NhZ2VcIiwgKGRhdGEpID0+XG4gICAgICAgIHRoaXMuaGFuZGxlU2VydmVyTWVzc2FnZShkZXNlcmlhbGl6ZShkYXRhLCB7Y29lcmNlTnVsbHNUb1VuZGVmaW5lZDogdHJ1ZX0pKVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIG9uQ29ubmVjdGlvbkNoYW5nZShsaXN0ZW5lcjogQ29ubmVjdGlvblN0YXR1c0xpc3RlbmVyKTogKCkgPT4gdm9pZCB7XG4gICAgdGhpcy5jb25uZWN0aW9uTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7XG4gICAgbGlzdGVuZXIodGhpcy5pc0Nvbm5lY3RlZCgpKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgdGhpcy5jb25uZWN0aW9uTGlzdGVuZXJzLmRlbGV0ZShsaXN0ZW5lcik7XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgbm90aWZ5Q29ubmVjdGlvbkxpc3RlbmVycyhjb25uZWN0ZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIHRoaXMuY29ubmVjdGlvbkxpc3RlbmVycykge1xuICAgICAgbGlzdGVuZXIoY29ubmVjdGVkKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25TZXJ2ZXJFcnJvcihsaXN0ZW5lcjogU2VydmVyRXJyb3JMaXN0ZW5lcik6ICgpID0+IHZvaWQge1xuICAgIHRoaXMuc2VydmVyRXJyb3JMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTtcbiAgICAvLyBFbWl0IGN1cnJlbnQgZXJyb3JzIHRvIG5ldyBsaXN0ZW5lclxuICAgIGZvciAoY29uc3QgW3BhdGgsIGVycl0gb2YgdGhpcy5zZXJ2ZXJFcnJvcnMpIGxpc3RlbmVyKHBhdGgsIGVycik7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHRoaXMuc2VydmVyRXJyb3JMaXN0ZW5lcnMuZGVsZXRlKGxpc3RlbmVyKTtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBub3RpZnlTZXJ2ZXJFcnJvcihwYXRoOiBzdHJpbmcsIGVycm9yOiBTZXJ2ZXJFcnJvckluZm8gfCBudWxsKSB7XG4gICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLnNlcnZlckVycm9yTGlzdGVuZXJzKSBsaXN0ZW5lcihwYXRoLCBlcnJvcik7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNlbmRNZXNzYWdlKHBheWxvYWQ6IENsaWVudE1lc3NhZ2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5pc0Nvbm5lY3RlZCgpKSB7XG4gICAgICAvLyBjb25zb2xlLmxvZyhcIltTb2NrZXRJT1RyYW5zcG9ydF0gU2VuZGluZzpcIiwgcGF5bG9hZCk7XG4gICAgICB0aGlzLnNvY2tldCEuZW1pdChcIm1lc3NhZ2VcIiwgc2VyaWFsaXplKHBheWxvYWQgYXMgYW55KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKFwiW1NvY2tldElPVHJhbnNwb3J0XSBRdWV1aW5nIG1lc3NhZ2U6XCIsIHBheWxvYWQpO1xuICAgICAgdGhpcy5tZXNzYWdlUXVldWUucHVzaChwYXlsb2FkKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc2VuZENoYW5uZWxNZXNzYWdlKG1lc3NhZ2U6IENsaWVudENoYW5uZWxNZXNzYWdlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5zZW5kTWVzc2FnZShtZXNzYWdlKTtcbiAgfVxuXG4gIHB1YmxpYyBtb3VudFZpZXcocGF0aDogc3RyaW5nLCB2aWV3OiBNb3VudGVkVmlldykge1xuICAgIGlmICh0aGlzLmFjdGl2ZVZpZXdzLmhhcyhwYXRoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBQYXRoICR7cGF0aH0gaXMgYWxyZWFkeSBtb3VudGVkYCk7XG4gICAgfVxuICAgIHRoaXMuYWN0aXZlVmlld3Muc2V0KHBhdGgsIHZpZXcpO1xuICAgIHZvaWQgdGhpcy5zZW5kTWVzc2FnZSh7XG4gICAgICB0eXBlOiBcIm1vdW50XCIsXG4gICAgICBwYXRoLFxuICAgICAgcm91dGVJbmZvOiB2aWV3LnJvdXRlSW5mbyxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBuYXZpZ2F0ZShwYXRoOiBzdHJpbmcsIHJvdXRlSW5mbzogUm91dGVJbmZvKSB7XG4gICAgYXdhaXQgdGhpcy5zZW5kTWVzc2FnZSh7XG4gICAgICB0eXBlOiBcIm5hdmlnYXRlXCIsXG4gICAgICBwYXRoLFxuICAgICAgcm91dGVJbmZvLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHVubW91bnQocGF0aDogc3RyaW5nKSB7XG4gICAgdm9pZCB0aGlzLnNlbmRNZXNzYWdlKHsgdHlwZTogXCJ1bm1vdW50XCIsIHBhdGggfSk7XG4gICAgdGhpcy5hY3RpdmVWaWV3cy5kZWxldGUocGF0aCk7XG4gIH1cblxuICBwdWJsaWMgZGlzY29ubmVjdCgpIHtcbiAgICB0aGlzLnNvY2tldD8uZGlzY29ubmVjdCgpO1xuICAgIHRoaXMuc29ja2V0ID0gbnVsbDtcbiAgICB0aGlzLm1lc3NhZ2VRdWV1ZSA9IFtdO1xuICAgIHRoaXMuY29ubmVjdGlvbkxpc3RlbmVycy5jbGVhcigpO1xuICAgIHRoaXMuYWN0aXZlVmlld3MuY2xlYXIoKTtcbiAgICB0aGlzLnNlcnZlckVycm9ycy5jbGVhcigpO1xuICAgIHRoaXMuc2VydmVyRXJyb3JMaXN0ZW5lcnMuY2xlYXIoKTtcbiAgICBmb3IgKGNvbnN0IHsgYnJpZGdlIH0gb2YgdGhpcy5jaGFubmVscy52YWx1ZXMoKSkge1xuICAgICAgYnJpZGdlLmRpc3Bvc2UobmV3IFB1bHNlQ2hhbm5lbFJlc2V0RXJyb3IoXCJDbGllbnQgZGlzY29ubmVjdGVkXCIpKTtcbiAgICB9XG4gICAgdGhpcy5jaGFubmVscy5jbGVhcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVTZXJ2ZXJNZXNzYWdlKG1lc3NhZ2U6IFNlcnZlck1lc3NhZ2UpIHtcbiAgICAvLyBjb25zb2xlLmxvZyhcIltQdWxzZUNsaWVudF0gUmVjZWl2ZWQgbWVzc2FnZTpcIiwgbWVzc2FnZSk7XG4gICAgc3dpdGNoIChtZXNzYWdlLnR5cGUpIHtcbiAgICAgIGNhc2UgXCJ2ZG9tX2luaXRcIjoge1xuICAgICAgICBjb25zdCByb3V0ZSA9IHRoaXMuYWN0aXZlVmlld3MuZ2V0KG1lc3NhZ2UucGF0aCk7XG4gICAgICAgIC8vIElnbm9yZSBtZXNzYWdlcyBmb3IgcGF0aHMgdGhhdCBhcmUgbm90IG1vdW50ZWRcbiAgICAgICAgaWYgKCFyb3V0ZSkgcmV0dXJuO1xuICAgICAgICBpZiAocm91dGUpIHtcbiAgICAgICAgICByb3V0ZS5vbkluaXQobWVzc2FnZS52ZG9tKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBDbGVhciBhbnkgcHJpb3IgZXJyb3IgZm9yIHRoaXMgcGF0aCBvbiBzdWNjZXNzZnVsIGluaXRcbiAgICAgICAgaWYgKHRoaXMuc2VydmVyRXJyb3JzLmhhcyhtZXNzYWdlLnBhdGgpKSB7XG4gICAgICAgICAgdGhpcy5zZXJ2ZXJFcnJvcnMuZGVsZXRlKG1lc3NhZ2UucGF0aCk7XG4gICAgICAgICAgdGhpcy5ub3RpZnlTZXJ2ZXJFcnJvcihtZXNzYWdlLnBhdGgsIG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBcInZkb21fdXBkYXRlXCI6IHtcbiAgICAgICAgY29uc3Qgcm91dGUgPSB0aGlzLmFjdGl2ZVZpZXdzLmdldChtZXNzYWdlLnBhdGgpO1xuICAgICAgICBpZiAoIXJvdXRlKSByZXR1cm47IC8vIE5vdCBhbiBhY3RpdmUgcGF0aDsgZGlzY2FyZFxuICAgICAgICByb3V0ZS5vblVwZGF0ZShtZXNzYWdlLm9wcyk7XG4gICAgICAgIC8vIENsZWFyIGFueSBwcmlvciBlcnJvciBmb3IgdGhpcyBwYXRoIG9uIHN1Y2Nlc3NmdWwgdXBkYXRlXG4gICAgICAgIGlmICh0aGlzLnNlcnZlckVycm9ycy5oYXMobWVzc2FnZS5wYXRoKSkge1xuICAgICAgICAgIHRoaXMuc2VydmVyRXJyb3JzLmRlbGV0ZShtZXNzYWdlLnBhdGgpO1xuICAgICAgICAgIHRoaXMubm90aWZ5U2VydmVyRXJyb3IobWVzc2FnZS5wYXRoLCBudWxsKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJzZXJ2ZXJfZXJyb3JcIjoge1xuICAgICAgICBpZiAoIXRoaXMuYWN0aXZlVmlld3MuaGFzKG1lc3NhZ2UucGF0aCkpIHJldHVybjsgLy8gZGlzY2FyZCBmb3IgaW5hY3RpdmUgcGF0aHNcbiAgICAgICAgdGhpcy5zZXJ2ZXJFcnJvcnMuc2V0KG1lc3NhZ2UucGF0aCwgbWVzc2FnZS5lcnJvcik7XG4gICAgICAgIHRoaXMubm90aWZ5U2VydmVyRXJyb3IobWVzc2FnZS5wYXRoLCBtZXNzYWdlLmVycm9yKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFwiYXBpX2NhbGxcIjoge1xuICAgICAgICB2b2lkIHRoaXMucGVyZm9ybUFwaUNhbGwobWVzc2FnZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBcIm5hdmlnYXRlX3RvXCI6IHtcbiAgICAgICAgLy8gYG5hdmlnYXRlX3RvYCBpcyBuYXZpZ2F0aW9uYWw7IGFsbG93IHJlZ2FyZGxlc3Mgb2YgYWN0aXZlVmlld3MgbWVtYmVyc2hpcFxuICAgICAgICBjb25zdCByZXBsYWNlID0gISFtZXNzYWdlLnJlcGxhY2U7XG4gICAgICAgIGxldCBkZXN0ID0gbWVzc2FnZS5wYXRoIHx8IFwiXCI7XG4gICAgICAgIC8vIE5vcm1hbGl6ZSBwcm90b2NvbC1yZWxhdGl2ZSBVUkxzIHRvIGFic29sdXRlXG4gICAgICAgIGlmIChkZXN0LnN0YXJ0c1dpdGgoXCIvL1wiKSkgZGVzdCA9IGAke3dpbmRvdy5sb2NhdGlvbi5wcm90b2NvbH0ke2Rlc3R9YDtcbiAgICAgICAgY29uc3QgaGFzU2NoZW1lID0gL15bYS16QS1aXVthLXpBLVowLTkrLi1dKjovLnRlc3QoZGVzdCk7XG4gICAgICAgIGlmIChoYXNTY2hlbWUpIHtcbiAgICAgICAgICBpZiAoZGVzdC5zdGFydHNXaXRoKFwiaHR0cDovL1wiKSB8fCBkZXN0LnN0YXJ0c1dpdGgoXCJodHRwczovL1wiKSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTChkZXN0KTtcbiAgICAgICAgICAgICAgaWYgKHVybC5vcmlnaW4gPT09IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbnRlcm5hbCA9IGAke3VybC5wYXRobmFtZX0ke3VybC5zZWFyY2h9JHt1cmwuaGFzaH1gO1xuICAgICAgICAgICAgICAgIHRoaXMuZnJhbWV3b3JrTmF2aWdhdGUoaW50ZXJuYWwsIHsgcmVwbGFjZSB9KTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAocmVwbGFjZSkgd2luZG93LmxvY2F0aW9uLnJlcGxhY2UoZGVzdCk7XG4gICAgICAgICAgICAgICAgZWxzZSB3aW5kb3cubG9jYXRpb24uYXNzaWduKGRlc3QpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgaWYgKHJlcGxhY2UpIHdpbmRvdy5sb2NhdGlvbi5yZXBsYWNlKGRlc3QpO1xuICAgICAgICAgICAgICBlbHNlIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oZGVzdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIG1haWx0bzosIHRlbDosIGRhdGE6LCBldGMuXG4gICAgICAgICAgICBpZiAocmVwbGFjZSkgd2luZG93LmxvY2F0aW9uLnJlcGxhY2UoZGVzdCk7XG4gICAgICAgICAgICBlbHNlIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oZGVzdCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFJlbGF0aXZlIG9yIHJvb3QtcmVsYXRpdmUgcGF0aCDihpIgU1BBIG5hdmlnYXRlXG4gICAgICAgICAgdGhpcy5mcmFtZXdvcmtOYXZpZ2F0ZShkZXN0LCB7IHJlcGxhY2UgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFwiY2hhbm5lbF9tZXNzYWdlXCI6IHtcbiAgICAgICAgdGhpcy5yb3V0ZUNoYW5uZWxNZXNzYWdlKG1lc3NhZ2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIlVuZXhwZWN0ZWQgbWVzc2FnZTpcIiwgbWVzc2FnZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwZXJmb3JtQXBpQ2FsbChtc2c6IFNlcnZlckFwaUNhbGxNZXNzYWdlKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKG1zZy51cmwsIHtcbiAgICAgICAgbWV0aG9kOiBtc2cubWV0aG9kIHx8IFwiR0VUXCIsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAuLi4obXNnLmhlYWRlcnMgfHwge30pLFxuICAgICAgICAgIC4uLihtc2cuYm9keSAhPSBudWxsICYmICEoXCJjb250ZW50LXR5cGVcIiBpbiAobXNnLmhlYWRlcnMgfHwge30pKVxuICAgICAgICAgICAgPyB7IFwiY29udGVudC10eXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiIH1cbiAgICAgICAgICAgIDoge30pLFxuICAgICAgICB9LFxuICAgICAgICBib2R5OlxuICAgICAgICAgIG1zZy5ib2R5ICE9IG51bGxcbiAgICAgICAgICAgID8gdHlwZW9mIG1zZy5ib2R5ID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgICAgID8gbXNnLmJvZHlcbiAgICAgICAgICAgICAgOiBKU09OLnN0cmluZ2lmeShtc2cuYm9keSlcbiAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICBjcmVkZW50aWFsczogbXNnLmNyZWRlbnRpYWxzIHx8IFwiaW5jbHVkZVwiLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBoZWFkZXJzT2JqOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgICByZXMuaGVhZGVycy5mb3JFYWNoKCh2LCBrKSA9PiAoaGVhZGVyc09ialtrXSA9IHYpKTtcbiAgICAgIGxldCBib2R5OiBhbnkgPSBudWxsO1xuICAgICAgY29uc3QgY3QgPSByZXMuaGVhZGVycy5nZXQoXCJjb250ZW50LXR5cGVcIikgfHwgXCJcIjtcbiAgICAgIGlmIChjdC5pbmNsdWRlcyhcImFwcGxpY2F0aW9uL2pzb25cIikpIHtcbiAgICAgICAgYm9keSA9IGF3YWl0IHJlcy5qc29uKCkuY2F0Y2goKCkgPT4gbnVsbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBib2R5ID0gYXdhaXQgcmVzLnRleHQoKS5jYXRjaCgoKSA9PiBudWxsKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlcGx5OiBDbGllbnRBcGlSZXN1bHRNZXNzYWdlID0ge1xuICAgICAgICB0eXBlOiBcImFwaV9yZXN1bHRcIixcbiAgICAgICAgaWQ6IG1zZy5pZCxcbiAgICAgICAgb2s6IHJlcy5vayxcbiAgICAgICAgc3RhdHVzOiByZXMuc3RhdHVzLFxuICAgICAgICBoZWFkZXJzOiBoZWFkZXJzT2JqLFxuICAgICAgICBib2R5LFxuICAgICAgfTtcbiAgICAgIGF3YWl0IHRoaXMuc2VuZE1lc3NhZ2UocmVwbHkpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc3QgcmVwbHk6IENsaWVudEFwaVJlc3VsdE1lc3NhZ2UgPSB7XG4gICAgICAgIHR5cGU6IFwiYXBpX3Jlc3VsdFwiLFxuICAgICAgICBpZDogbXNnLmlkLFxuICAgICAgICBvazogZmFsc2UsXG4gICAgICAgIHN0YXR1czogMCxcbiAgICAgICAgaGVhZGVyczoge30sXG4gICAgICAgIGJvZHk6IHsgZXJyb3I6IFN0cmluZyhlcnIpIH0sXG4gICAgICB9O1xuICAgICAgYXdhaXQgdGhpcy5zZW5kTWVzc2FnZShyZXBseSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGludm9rZUNhbGxiYWNrKHBhdGg6IHN0cmluZywgY2FsbGJhY2s6IHN0cmluZywgYXJnczogYW55W10pIHtcbiAgICBhd2FpdCB0aGlzLnNlbmRNZXNzYWdlKHtcbiAgICAgIHR5cGU6IFwiY2FsbGJhY2tcIixcbiAgICAgIHBhdGgsXG4gICAgICBjYWxsYmFjayxcbiAgICAgIGFyZ3M6IGFyZ3MubWFwKGV4dHJhY3RFdmVudCksXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYWNxdWlyZUNoYW5uZWwoaWQ6IHN0cmluZyk6IENoYW5uZWxCcmlkZ2Uge1xuICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5lbnN1cmVDaGFubmVsRW50cnkoaWQpO1xuICAgIGVudHJ5LnJlZkNvdW50ICs9IDE7XG4gICAgcmV0dXJuIGVudHJ5LmJyaWRnZTtcbiAgfVxuXG4gIHB1YmxpYyByZWxlYXNlQ2hhbm5lbChpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgZW50cnkgPSB0aGlzLmNoYW5uZWxzLmdldChpZCk7XG4gICAgaWYgKCFlbnRyeSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlbnRyeS5yZWZDb3VudCA9IE1hdGgubWF4KDAsIGVudHJ5LnJlZkNvdW50IC0gMSk7XG4gICAgaWYgKGVudHJ5LnJlZkNvdW50ID09PSAwKSB7XG4gICAgICBlbnRyeS5icmlkZ2UuZGlzcG9zZShuZXcgUHVsc2VDaGFubmVsUmVzZXRFcnJvcihcIkNoYW5uZWwgcmVsZWFzZWRcIikpO1xuICAgICAgdGhpcy5jaGFubmVscy5kZWxldGUoaWQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZW5zdXJlQ2hhbm5lbEVudHJ5KGlkOiBzdHJpbmcpOiB7XG4gICAgYnJpZGdlOiBDaGFubmVsQnJpZGdlO1xuICAgIHJlZkNvdW50OiBudW1iZXI7XG4gIH0ge1xuICAgIGxldCBlbnRyeSA9IHRoaXMuY2hhbm5lbHMuZ2V0KGlkKTtcbiAgICBpZiAoIWVudHJ5KSB7XG4gICAgICBlbnRyeSA9IHtcbiAgICAgICAgYnJpZGdlOiBjcmVhdGVDaGFubmVsQnJpZGdlKHRoaXMsIGlkKSxcbiAgICAgICAgcmVmQ291bnQ6IDAsXG4gICAgICB9O1xuICAgICAgdGhpcy5jaGFubmVscy5zZXQoaWQsIGVudHJ5KTtcbiAgICB9XG4gICAgcmV0dXJuIGVudHJ5O1xuICB9XG5cbiAgcHJpdmF0ZSByb3V0ZUNoYW5uZWxNZXNzYWdlKG1lc3NhZ2U6IFNlcnZlckNoYW5uZWxNZXNzYWdlKTogdm9pZCB7XG4gICAgY29uc3QgZW50cnkgPSB0aGlzLmVuc3VyZUNoYW5uZWxFbnRyeShtZXNzYWdlLmNoYW5uZWwpO1xuICAgIGNvbnN0IGNsb3NlZCA9IGVudHJ5LmJyaWRnZS5oYW5kbGVTZXJ2ZXJNZXNzYWdlKG1lc3NhZ2UpO1xuICAgIGlmIChjbG9zZWQgJiYgZW50cnkucmVmQ291bnQgPT09IDApIHtcbiAgICAgIHRoaXMuY2hhbm5lbHMuZGVsZXRlKG1lc3NhZ2UuY2hhbm5lbCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVUcmFuc3BvcnREaXNjb25uZWN0KCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgZW50cnkgb2YgdGhpcy5jaGFubmVscy52YWx1ZXMoKSkge1xuICAgICAgZW50cnkuYnJpZGdlLmhhbmRsZURpc2Nvbm5lY3QobmV3IFB1bHNlQ2hhbm5lbFJlc2V0RXJyb3IoXCJDb25uZWN0aW9uIGxvc3RcIikpO1xuICAgIH1cbiAgfVxuXG4gIC8vIHB1YmxpYyBnZXRWRE9NKHBhdGg6IHN0cmluZyk6IFZET00gfCBudWxsIHtcbiAgLy8gICByZXR1cm4gdGhpcy5hY3RpdmVWaWV3cy5nZXQocGF0aCk/LnZkb20gPz8gbnVsbDtcbiAgLy8gfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7XG4gIFNlcnZlckNoYW5uZWxNZXNzYWdlLFxuICBTZXJ2ZXJDaGFubmVsUmVxdWVzdE1lc3NhZ2UsXG4gIFNlcnZlckNoYW5uZWxSZXNwb25zZU1lc3NhZ2UsXG59IGZyb20gXCIuL21lc3NhZ2VzXCI7XG5pbXBvcnQgdHlwZSB7IFB1bHNlU29ja2V0SU9DbGllbnQgfSBmcm9tIFwiLi9jbGllbnRcIjtcblxuZXhwb3J0IGNsYXNzIFB1bHNlQ2hhbm5lbFJlc2V0RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9IFwiUHVsc2VDaGFubmVsUmVzZXRFcnJvclwiO1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIENoYW5uZWxFdmVudEhhbmRsZXIgPSAocGF5bG9hZDogYW55KSA9PiBhbnkgfCBQcm9taXNlPGFueT47XG5cbmludGVyZmFjZSBQZW5kaW5nUmVxdWVzdCB7XG4gIHJlc29sdmU6ICh2YWx1ZTogYW55KSA9PiB2b2lkO1xuICByZWplY3Q6IChlcnJvcjogYW55KSA9PiB2b2lkO1xufVxuXG5mdW5jdGlvbiByYW5kb21JZCgpOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIGNyeXB0byAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2YgY3J5cHRvLnJhbmRvbVVVSUQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHJldHVybiBjcnlwdG8ucmFuZG9tVVVJRCgpLnJlcGxhY2UoLy0vZywgXCJcIik7XG4gIH1cbiAgcmV0dXJuIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMTYpLnNsaWNlKDIpICsgTWF0aC5yYW5kb20oKS50b1N0cmluZygxNikuc2xpY2UoMik7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdEVycm9yKGVycm9yOiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHJldHVybiBlcnJvci5tZXNzYWdlO1xuICBpZiAodHlwZW9mIGVycm9yID09PSBcInN0cmluZ1wiKSByZXR1cm4gZXJyb3I7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGVycm9yKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIFN0cmluZyhlcnJvcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNTZXJ2ZXJSZXNwb25zZU1lc3NhZ2UoXG4gIG1lc3NhZ2U6IFNlcnZlckNoYW5uZWxNZXNzYWdlXG4pOiBtZXNzYWdlIGlzIFNlcnZlckNoYW5uZWxSZXNwb25zZU1lc3NhZ2Uge1xuICByZXR1cm4gdHlwZW9mIChtZXNzYWdlIGFzIFNlcnZlckNoYW5uZWxSZXNwb25zZU1lc3NhZ2UpLnJlc3BvbnNlVG8gPT09IFwic3RyaW5nXCI7XG59XG5cbmZ1bmN0aW9uIGlzU2VydmVyUmVxdWVzdE1lc3NhZ2UoXG4gIG1lc3NhZ2U6IFNlcnZlckNoYW5uZWxNZXNzYWdlXG4pOiBtZXNzYWdlIGlzIFNlcnZlckNoYW5uZWxSZXF1ZXN0TWVzc2FnZSB7XG4gIHJldHVybiB0eXBlb2YgKG1lc3NhZ2UgYXMgU2VydmVyQ2hhbm5lbFJlcXVlc3RNZXNzYWdlKS5ldmVudCA9PT0gXCJzdHJpbmdcIjtcbn1cblxuZXhwb3J0IGNsYXNzIENoYW5uZWxCcmlkZ2Uge1xuICBwcml2YXRlIGhhbmRsZXJzID0gbmV3IE1hcDxzdHJpbmcsIFNldDxDaGFubmVsRXZlbnRIYW5kbGVyPj4oKTtcbiAgcHJpdmF0ZSBwZW5kaW5nID0gbmV3IE1hcDxzdHJpbmcsIFBlbmRpbmdSZXF1ZXN0PigpO1xuICBwcml2YXRlIGJhY2tsb2c6IFNlcnZlckNoYW5uZWxSZXF1ZXN0TWVzc2FnZVtdID0gW107XG4gIHByaXZhdGUgY2xvc2VkID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjbGllbnQ6IFB1bHNlU29ja2V0SU9DbGllbnQsIHB1YmxpYyByZWFkb25seSBpZDogc3RyaW5nKSB7fVxuXG4gIGVtaXQoZXZlbnQ6IHN0cmluZywgcGF5bG9hZD86IGFueSk6IHZvaWQge1xuICAgIHRoaXMuZW5zdXJlT3BlbigpO1xuICAgIHZvaWQgdGhpcy5jbGllbnQuc2VuZENoYW5uZWxNZXNzYWdlKHtcbiAgICAgIHR5cGU6IFwiY2hhbm5lbF9tZXNzYWdlXCIsXG4gICAgICBjaGFubmVsOiB0aGlzLmlkLFxuICAgICAgZXZlbnQsXG4gICAgICBwYXlsb2FkLFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgcmVxdWVzdChldmVudDogc3RyaW5nLCBwYXlsb2FkPzogYW55KTogUHJvbWlzZTxhbnk+IHtcbiAgICB0aGlzLmVuc3VyZU9wZW4oKTtcbiAgICBjb25zdCByZXF1ZXN0SWQgPSByYW5kb21JZCgpO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLnBlbmRpbmcuc2V0KHJlcXVlc3RJZCwgeyByZXNvbHZlLCByZWplY3QgfSk7XG4gICAgICB2b2lkIHRoaXMuY2xpZW50XG4gICAgICAgIC5zZW5kQ2hhbm5lbE1lc3NhZ2Uoe1xuICAgICAgICAgIHR5cGU6IFwiY2hhbm5lbF9tZXNzYWdlXCIsXG4gICAgICAgICAgY2hhbm5lbDogdGhpcy5pZCxcbiAgICAgICAgICBldmVudCxcbiAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICB0aGlzLnBlbmRpbmcuZGVsZXRlKHJlcXVlc3RJZCk7XG4gICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgb24oZXZlbnQ6IHN0cmluZywgaGFuZGxlcjogQ2hhbm5lbEV2ZW50SGFuZGxlcik6ICgpID0+IHZvaWQge1xuICAgIHRoaXMuZW5zdXJlT3BlbigpO1xuICAgIGxldCBidWNrZXQgPSB0aGlzLmhhbmRsZXJzLmdldChldmVudCk7XG4gICAgaWYgKCFidWNrZXQpIHtcbiAgICAgIGJ1Y2tldCA9IG5ldyBTZXQoKTtcbiAgICAgIHRoaXMuaGFuZGxlcnMuc2V0KGV2ZW50LCBidWNrZXQpO1xuICAgIH1cbiAgICBidWNrZXQuYWRkKGhhbmRsZXIpO1xuICAgIHRoaXMuZmx1c2hCYWNrbG9nKGV2ZW50KTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgY29uc3Qgc2V0ID0gdGhpcy5oYW5kbGVycy5nZXQoZXZlbnQpO1xuICAgICAgaWYgKCFzZXQpIHJldHVybjtcbiAgICAgIHNldC5kZWxldGUoaGFuZGxlcik7XG4gICAgICBpZiAoc2V0LnNpemUgPT09IDApIHtcbiAgICAgICAgdGhpcy5oYW5kbGVycy5kZWxldGUoZXZlbnQpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBoYW5kbGVTZXJ2ZXJNZXNzYWdlKG1lc3NhZ2U6IFNlcnZlckNoYW5uZWxNZXNzYWdlKTogYm9vbGVhbiB7XG4gICAgaWYgKGlzU2VydmVyUmVzcG9uc2VNZXNzYWdlKG1lc3NhZ2UpKSB7XG4gICAgICB0aGlzLnJlc29sdmVQZW5kaW5nKG1lc3NhZ2UpO1xuICAgICAgcmV0dXJuIHRoaXMuY2xvc2VkO1xuICAgIH1cbiAgICBpZiAodGhpcy5jbG9zZWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoIWlzU2VydmVyUmVxdWVzdE1lc3NhZ2UobWVzc2FnZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmNsb3NlZDtcbiAgICB9XG5cbiAgICBpZiAobWVzc2FnZS5ldmVudCA9PT0gXCJfX2Nsb3NlX19cIikge1xuICAgICAgdGhpcy5jbG9zZShuZXcgUHVsc2VDaGFubmVsUmVzZXRFcnJvcihcIkNoYW5uZWwgY2xvc2VkIGJ5IHNlcnZlclwiKSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKG1lc3NhZ2UucmVxdWVzdElkKSB7XG4gICAgICB2b2lkIHRoaXMuZGlzcGF0Y2hSZXF1ZXN0KG1lc3NhZ2UgYXMgU2VydmVyQ2hhbm5lbFJlcXVlc3RNZXNzYWdlICYge1xuICAgICAgICByZXF1ZXN0SWQ6IHN0cmluZztcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobWVzc2FnZSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNsb3NlZDtcbiAgfVxuXG4gIGhhbmRsZURpc2Nvbm5lY3QocmVhc29uOiBQdWxzZUNoYW5uZWxSZXNldEVycm9yKTogdm9pZCB7XG4gICAgdGhpcy5jbG9zZShyZWFzb24pO1xuICB9XG5cbiAgZGlzcG9zZShyZWFzb246IFB1bHNlQ2hhbm5lbFJlc2V0RXJyb3IpOiB2b2lkIHtcbiAgICB0aGlzLmNsb3NlKHJlYXNvbik7XG4gIH1cblxuICBwcml2YXRlIGVuc3VyZU9wZW4oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2xvc2VkKSB7XG4gICAgICB0aHJvdyBuZXcgUHVsc2VDaGFubmVsUmVzZXRFcnJvcihcIkNoYW5uZWwgaXMgY2xvc2VkXCIpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZmx1c2hCYWNrbG9nKGV2ZW50OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5iYWNrbG9nLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIGNvbnN0IHJlbWFpbmluZzogU2VydmVyQ2hhbm5lbFJlcXVlc3RNZXNzYWdlW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5iYWNrbG9nKSB7XG4gICAgICBpZiAoaXRlbS5ldmVudCA9PT0gZXZlbnQpIHtcbiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KGl0ZW0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVtYWluaW5nLnB1c2goaXRlbSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuYmFja2xvZyA9IHJlbWFpbmluZztcbiAgfVxuXG4gIHByaXZhdGUgZGlzcGF0Y2hFdmVudChtZXNzYWdlOiBTZXJ2ZXJDaGFubmVsUmVxdWVzdE1lc3NhZ2UpOiB2b2lkIHtcbiAgICBjb25zdCBoYW5kbGVycyA9IHRoaXMuaGFuZGxlcnMuZ2V0KG1lc3NhZ2UuZXZlbnQpO1xuICAgIGlmICghaGFuZGxlcnMgfHwgaGFuZGxlcnMuc2l6ZSA9PT0gMCkge1xuICAgICAgdGhpcy5iYWNrbG9nLnB1c2gobWVzc2FnZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiBoYW5kbGVycykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gaGFuZGxlcihtZXNzYWdlLnBheWxvYWQpO1xuICAgICAgICBpZiAocmVzdWx0ICYmIHR5cGVvZiAocmVzdWx0IGFzIFByb21pc2U8YW55PikudGhlbiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgdm9pZCAocmVzdWx0IGFzIFByb21pc2U8YW55PikuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIlB1bHNlIGNoYW5uZWwgaGFuZGxlciBlcnJvclwiLCBlcnIpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIlB1bHNlIGNoYW5uZWwgaGFuZGxlciBlcnJvclwiLCBlcnIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZGlzcGF0Y2hSZXF1ZXN0KFxuICAgIG1lc3NhZ2U6IFNlcnZlckNoYW5uZWxSZXF1ZXN0TWVzc2FnZSAmIHsgcmVxdWVzdElkOiBzdHJpbmcgfVxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBoYW5kbGVycyA9IHRoaXMuaGFuZGxlcnMuZ2V0KG1lc3NhZ2UuZXZlbnQpO1xuICAgIGxldCByZXNwb25zZTogYW55O1xuICAgIGxldCBlcnJvcjogYW55O1xuICAgIGlmIChoYW5kbGVycyAmJiBoYW5kbGVycy5zaXplID4gMCkge1xuICAgICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIGhhbmRsZXJzKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gaGFuZGxlcihtZXNzYWdlLnBheWxvYWQpO1xuICAgICAgICAgIHJlc3BvbnNlID0gYXdhaXQgUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgICAgaWYgKHJlc3BvbnNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgZXJyb3IgPSBlcnI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGVycm9yKSB7XG4gICAgICBhd2FpdCB0aGlzLmNsaWVudC5zZW5kQ2hhbm5lbE1lc3NhZ2Uoe1xuICAgICAgICB0eXBlOiBcImNoYW5uZWxfbWVzc2FnZVwiLFxuICAgICAgICBjaGFubmVsOiB0aGlzLmlkLFxuICAgICAgICBldmVudDogdW5kZWZpbmVkLFxuICAgICAgICByZXNwb25zZVRvOiBtZXNzYWdlLnJlcXVlc3RJZCxcbiAgICAgICAgZXJyb3I6IGZvcm1hdEVycm9yKGVycm9yKSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLmNsaWVudC5zZW5kQ2hhbm5lbE1lc3NhZ2Uoe1xuICAgICAgdHlwZTogXCJjaGFubmVsX21lc3NhZ2VcIixcbiAgICAgIGNoYW5uZWw6IHRoaXMuaWQsXG4gICAgICBldmVudDogdW5kZWZpbmVkLFxuICAgICAgcmVzcG9uc2VUbzogbWVzc2FnZS5yZXF1ZXN0SWQsXG4gICAgICBwYXlsb2FkOiByZXNwb25zZSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZVBlbmRpbmcobWVzc2FnZTogU2VydmVyQ2hhbm5lbFJlc3BvbnNlTWVzc2FnZSk6IHZvaWQge1xuICAgIGNvbnN0IGVudHJ5ID0gbWVzc2FnZS5yZXNwb25zZVRvID8gdGhpcy5wZW5kaW5nLmdldChtZXNzYWdlLnJlc3BvbnNlVG8pIDogdW5kZWZpbmVkO1xuICAgIGlmICghZW50cnkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5wZW5kaW5nLmRlbGV0ZShtZXNzYWdlLnJlc3BvbnNlVG8hKTtcbiAgICBpZiAobWVzc2FnZS5lcnJvciAhPT0gdW5kZWZpbmVkICYmIG1lc3NhZ2UuZXJyb3IgIT09IG51bGwpIHtcbiAgICAgIGVudHJ5LnJlamVjdChuZXcgUHVsc2VDaGFubmVsUmVzZXRFcnJvcihTdHJpbmcobWVzc2FnZS5lcnJvcikpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZW50cnkucmVzb2x2ZShtZXNzYWdlLnBheWxvYWQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2xvc2UocmVhc29uOiBQdWxzZUNoYW5uZWxSZXNldEVycm9yKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2xvc2VkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY2xvc2VkID0gdHJ1ZTtcbiAgICBmb3IgKGNvbnN0IHJlcXVlc3Qgb2YgdGhpcy5wZW5kaW5nLnZhbHVlcygpKSB7XG4gICAgICByZXF1ZXN0LnJlamVjdChyZWFzb24pO1xuICAgIH1cbiAgICB0aGlzLnBlbmRpbmcuY2xlYXIoKTtcbiAgICB0aGlzLmhhbmRsZXJzLmNsZWFyKCk7XG4gICAgdGhpcy5iYWNrbG9nID0gW107XG4gICAgLy8gTm8tb3A6IG93bmluZyBjbGllbnQgbWFuYWdlcyByZWdpc3RyeSBsaWZlY3ljbGUuXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNoYW5uZWxCcmlkZ2UoXG4gIGNsaWVudDogUHVsc2VTb2NrZXRJT0NsaWVudCxcbiAgaWQ6IHN0cmluZ1xuKTogQ2hhbm5lbEJyaWRnZSB7XG4gIHJldHVybiBuZXcgQ2hhbm5lbEJyaWRnZShjbGllbnQsIGlkKTtcbn1cbiIsCiAgICAiaW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VNZW1vIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyB1c2VQdWxzZUNsaWVudCB9IGZyb20gXCIuL3B1bHNlXCI7XG5pbXBvcnQgdHlwZSB7IENoYW5uZWxCcmlkZ2UgfSBmcm9tIFwiLi9jaGFubmVsXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VQdWxzZUNoYW5uZWwoY2hhbm5lbElkOiBzdHJpbmcpOiBDaGFubmVsQnJpZGdlIHtcbiAgY29uc3QgY2xpZW50ID0gdXNlUHVsc2VDbGllbnQoKTtcbiAgY29uc3QgYnJpZGdlID0gdXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKCFjaGFubmVsSWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInVzZVB1bHNlQ2hhbm5lbCByZXF1aXJlcyBhIG5vbi1lbXB0eSBjaGFubmVsSWRcIik7XG4gICAgfVxuICAgIHJldHVybiBjbGllbnQuYWNxdWlyZUNoYW5uZWwoY2hhbm5lbElkKTtcbiAgfSwgW2NsaWVudCwgY2hhbm5lbElkXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgY2xpZW50LnJlbGVhc2VDaGFubmVsKGNoYW5uZWxJZCk7XG4gICAgfTtcbiAgfSwgW2NsaWVudCwgY2hhbm5lbElkXSk7XG5cbiAgcmV0dXJuIGJyaWRnZTtcbn1cbiIsCiAgICAiaW1wb3J0IFJlYWN0LCB7IGZvcndhcmRSZWYsIHVzZUNhbGxiYWNrLCB0eXBlIEZvcm1FdmVudCB9IGZyb20gXCJyZWFjdFwiO1xuXG5leHBvcnQgdHlwZSBQdWxzZUZvcm1Qcm9wcyA9IFJlYWN0LkNvbXBvbmVudFByb3BzV2l0aG91dFJlZjxcImZvcm1cIj4gJiB7XG4gIGFjdGlvbjogc3RyaW5nO1xufTtcblxuLyoqXG4gKiBQdWxzZUZvcm0gaW50ZXJjZXB0cyBuYXRpdmUgZm9ybSBzdWJtaXNzaW9ucyBhbmQgc2VuZHMgdGhlbSB0aHJvdWdoIGZldGNoIHNvIHRoZVxuICogc3Vycm91bmRpbmcgUHVsc2UgdmlldyBzdGF5cyBtb3VudGVkLiBTZXJ2ZXItc2lkZSBoYW5kbGVycyBhcmUgc3RpbGwgaW52b2tlZCB2aWFcbiAqIHRoZSBmb3JtIGFjdGlvbiBlbmRwb2ludCBhbmQgcmVhY3RpdmUgdXBkYXRlcyBwcm9wYWdhdGUgb3ZlciB0aGUgc29ja2V0LlxuICovXG5leHBvcnQgY29uc3QgUHVsc2VGb3JtID0gZm9yd2FyZFJlZjxIVE1MRm9ybUVsZW1lbnQsIFB1bHNlRm9ybVByb3BzPihcbiAgZnVuY3Rpb24gUHVsc2VGb3JtKHsgb25TdWJtaXQsIGFjdGlvbiwgLi4ucmVzdCB9LCByZWYpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPGZvcm1cbiAgICAgICAgey4uLnJlc3R9XG4gICAgICAgIGFjdGlvbj17YWN0aW9ufVxuICAgICAgICByZWY9e3JlZn1cbiAgICAgICAgb25TdWJtaXQ9e3VzZUNhbGxiYWNrKFxuICAgICAgICAgIChldmVudDogRm9ybUV2ZW50PEhUTUxGb3JtRWxlbWVudD4pID0+XG4gICAgICAgICAgICBzdWJtaXRGb3JtKHsgZXZlbnQsIGFjdGlvbiwgb25TdWJtaXQgfSksXG4gICAgICAgICAgW2FjdGlvbiwgb25TdWJtaXRdXG4gICAgICAgICl9XG4gICAgICAvPlxuICAgICk7XG4gIH1cbik7XG5cbmludGVyZmFjZSBTdWJtaXRGb3JtIHtcbiAgZXZlbnQ6IFJlYWN0LkZvcm1FdmVudDxIVE1MRm9ybUVsZW1lbnQ+O1xuICBhY3Rpb246IHN0cmluZztcbiAgb25TdWJtaXQ/OiBQdWxzZUZvcm1Qcm9wc1tcIm9uU3VibWl0XCJdO1xuICBmb3JtRGF0YT86IEZvcm1EYXRhO1xuICBmb3JjZT86IGJvb2xlYW5cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN1Ym1pdEZvcm0oe1xuICBldmVudCxcbiAgYWN0aW9uLFxuICBvblN1Ym1pdCxcbiAgZm9ybURhdGEsXG4gIGZvcmNlXG59OiBTdWJtaXRGb3JtKSB7XG4gIG9uU3VibWl0Py4oZXZlbnQpO1xuICBpZiAoIWZvcmNlICYmIGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgZm9ybSA9IGV2ZW50LmN1cnJlbnRUYXJnZXQ7XG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIGNvbnN0IG5hdGl2ZUV2ZW50ID0gZXZlbnQubmF0aXZlRXZlbnQgYXMgU3VibWl0RXZlbnQ7XG4gIGlmICghZm9ybURhdGEpIHtcbiAgICBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YShmb3JtLCBuYXRpdmVFdmVudC5zdWJtaXR0ZXIpO1xuICB9XG4gIGNvbnN0IHVybCA9IG5ldyBVUkwoYWN0aW9uLCB3aW5kb3cubG9jYXRpb24uaHJlZik7XG4gIHRyeSB7XG4gICAgYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgLy8gUmVxdWlyZWQgZm9yIG91ciBob3N0aW5nIHNjZW5hcmlvcyBvZiBzYW1lIGhvc3QgKyBkaWZmZXJlbnQgcG9ydHMgb3IgMiBzdWJkb21haW5zXG4gICAgICBjcmVkZW50aWFsczogXCJpbmNsdWRlXCIsXG4gICAgICBib2R5OiBmb3JtRGF0YSxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgY29uc29sZS5lcnJvcihcIltQdWxzZV0gRm9ybSBzdWJtaXNzaW9uIGZhaWxlZFwiLCBlcnIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9XG59XG4iLAogICAgImltcG9ydCB7IGlvLCBTb2NrZXQgfSBmcm9tIFwic29ja2V0LmlvLWNsaWVudFwiO1xuaW1wb3J0IHR5cGUgeyBTZXJ2ZXJNZXNzYWdlLCBDbGllbnRNZXNzYWdlIH0gZnJvbSBcIi4vbWVzc2FnZXNcIjtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFRyYW5zcG9ydCBBYnN0cmFjdGlvblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IHR5cGUgTWVzc2FnZUxpc3RlbmVyID0gKG1lc3NhZ2U6IFNlcnZlck1lc3NhZ2UpID0+IHZvaWQ7XG5leHBvcnQgdHlwZSBDb25uZWN0aW9uU3RhdHVzTGlzdGVuZXIgPSAoY29ubmVjdGVkOiBib29sZWFuKSA9PiB2b2lkO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zcG9ydCB7XG4gIGNvbm5lY3QobGlzdGVuZXI6IE1lc3NhZ2VMaXN0ZW5lcik6IFByb21pc2U8dm9pZD47XG4gIGRpc2Nvbm5lY3QoKTogdm9pZDtcbiAgc2VuZE1lc3NhZ2UocGF5bG9hZDogQ2xpZW50TWVzc2FnZSk6IFByb21pc2U8dm9pZD47XG4gIGlzQ29ubmVjdGVkKCk6IGJvb2xlYW47XG4gIG9uQ29ubmVjdGlvbkNoYW5nZShsaXN0ZW5lcjogQ29ubmVjdGlvblN0YXR1c0xpc3RlbmVyKTogKCkgPT4gdm9pZDtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFNvY2tldC5JTyBUcmFuc3BvcnRcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBjbGFzcyBTb2NrZXRJT1RyYW5zcG9ydCBpbXBsZW1lbnRzIFRyYW5zcG9ydCB7XG4gIHByaXZhdGUgc29ja2V0OiBTb2NrZXQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBsaXN0ZW5lcjogTWVzc2FnZUxpc3RlbmVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbWVzc2FnZVF1ZXVlOiBDbGllbnRNZXNzYWdlW10gPSBbXTtcbiAgcHJpdmF0ZSBjb25uZWN0aW9uTGlzdGVuZXJzOiBTZXQ8Q29ubmVjdGlvblN0YXR1c0xpc3RlbmVyPiA9IG5ldyBTZXQoKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHVybDogc3RyaW5nKSB7fVxuXG4gIGNvbm5lY3QobGlzdGVuZXI6IE1lc3NhZ2VMaXN0ZW5lcik6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5zb2NrZXQgPSBpbyh0aGlzLnVybCwge1xuICAgICAgICB0cmFuc3BvcnRzOiBbXCJ3ZWJzb2NrZXRcIl0sXG4gICAgICB9KTtcblxuICAgICAgdGhpcy5zb2NrZXQub24oXCJjb25uZWN0XCIsICgpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coXCJbU29ja2V0SU9UcmFuc3BvcnRdIENvbm5lY3RlZDpcIiwgdGhpcy5zb2NrZXQ/LmlkKTtcblxuICAgICAgICBmb3IgKGNvbnN0IHBheWxvYWQgb2YgdGhpcy5tZXNzYWdlUXVldWUpIHtcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIltTb2NrZXRJT1RyYW5zcG9ydF0gU2VuZGluZyBxdWV1ZWQgbWVzc2FnZTpcIiwgcGF5bG9hZCk7XG4gICAgICAgICAgdGhpcy5zb2NrZXQ/LmVtaXQoXCJtZXNzYWdlXCIsIHBheWxvYWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWVzc2FnZVF1ZXVlID0gW107XG5cbiAgICAgICAgdGhpcy5ub3RpZnlDb25uZWN0aW9uTGlzdGVuZXJzKHRydWUpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5zb2NrZXQub24oXCJjb25uZWN0X2Vycm9yXCIsIChlcnIpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIltTb2NrZXRJT1RyYW5zcG9ydF0gQ29ubmVjdGlvbiBmYWlsZWQ6XCIsIGVycik7XG4gICAgICAgIHRoaXMubm90aWZ5Q29ubmVjdGlvbkxpc3RlbmVycyhmYWxzZSk7XG4gICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuc29ja2V0Lm9uKFwiZGlzY29ubmVjdFwiLCAoKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiW1NvY2tldElPVHJhbnNwb3J0XSBEaXNjb25uZWN0ZWRcIik7XG4gICAgICAgIHRoaXMubm90aWZ5Q29ubmVjdGlvbkxpc3RlbmVycyhmYWxzZSk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5zb2NrZXQub24oXCJtZXNzYWdlXCIsIChkYXRhOiBTZXJ2ZXJNZXNzYWdlKSA9PiB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiW1NvY2tldElPVHJhbnNwb3J0XSBSZWNlaXZlZCBtZXNzYWdlOlwiLCBkYXRhKTtcbiAgICAgICAgdGhpcy5saXN0ZW5lcj8uKGRhdGEpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBkaXNjb25uZWN0KCk6IHZvaWQge1xuICAgIHRoaXMuc29ja2V0Py5kaXNjb25uZWN0KCk7XG4gICAgdGhpcy5zb2NrZXQgPSBudWxsO1xuICAgIHRoaXMubGlzdGVuZXIgPSBudWxsO1xuICAgIHRoaXMubWVzc2FnZVF1ZXVlID0gW107XG4gICAgdGhpcy5jb25uZWN0aW9uTGlzdGVuZXJzLmNsZWFyKCk7XG4gIH1cblxuICBhc3luYyBzZW5kTWVzc2FnZShwYXlsb2FkOiBDbGllbnRNZXNzYWdlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaXNDb25uZWN0ZWQoKSkge1xuICAgICAgLy8gY29uc29sZS5sb2coXCJbU29ja2V0SU9UcmFuc3BvcnRdIFNlbmRpbmc6XCIsIHBheWxvYWQpO1xuICAgICAgdGhpcy5zb2NrZXQhLmVtaXQoXCJtZXNzYWdlXCIsIHBheWxvYWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBjb25zb2xlLmxvZyhcIltTb2NrZXRJT1RyYW5zcG9ydF0gUXVldWluZyBtZXNzYWdlOlwiLCBwYXlsb2FkKTtcbiAgICAgIHRoaXMubWVzc2FnZVF1ZXVlLnB1c2gocGF5bG9hZCk7XG4gICAgfVxuICB9XG5cbiAgaXNDb25uZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc29ja2V0Py5jb25uZWN0ZWQgfHwgZmFsc2U7XG4gIH1cblxuICBvbkNvbm5lY3Rpb25DaGFuZ2UobGlzdGVuZXI6IENvbm5lY3Rpb25TdGF0dXNMaXN0ZW5lcik6ICgpID0+IHZvaWQge1xuICAgIHRoaXMuY29ubmVjdGlvbkxpc3RlbmVycy5hZGQobGlzdGVuZXIpO1xuICAgIGxpc3RlbmVyKHRoaXMuaXNDb25uZWN0ZWQoKSk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHRoaXMuY29ubmVjdGlvbkxpc3RlbmVycy5kZWxldGUobGlzdGVuZXIpO1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIG5vdGlmeUNvbm5lY3Rpb25MaXN0ZW5lcnMoY29ubmVjdGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lcnMpIHtcbiAgICAgIGxpc3RlbmVyKGNvbm5lY3RlZCk7XG4gICAgfVxuICB9XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBJbi1NZW1vcnkgVHJhbnNwb3J0IChmb3IgdGVzdGluZylcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBjbGFzcyBJbk1lbW9yeVRyYW5zcG9ydCBpbXBsZW1lbnRzIFRyYW5zcG9ydCB7XG4gIHByaXZhdGUgbGlzdGVuZXI6IE1lc3NhZ2VMaXN0ZW5lciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGNvbm5lY3RlZCA9IGZhbHNlO1xuICBwcml2YXRlIGNvbm5lY3Rpb25MaXN0ZW5lcnM6IFNldDxDb25uZWN0aW9uU3RhdHVzTGlzdGVuZXI+ID0gbmV3IFNldCgpO1xuXG4gIC8vIFNpbXVsYXRlIHNlcnZlci1zaWRlIG1lc3NhZ2UgZGlzcGF0Y2hpbmdcbiAgcHVibGljIGRpc3BhdGNoTWVzc2FnZShtZXNzYWdlOiBTZXJ2ZXJNZXNzYWdlKSB7XG4gICAgaWYgKHRoaXMubGlzdGVuZXIpIHtcbiAgICAgIC8vIFNpbXVsYXRlIGFzeW5jIGJlaGF2aW9yXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMubGlzdGVuZXI/LihtZXNzYWdlKSwgMCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgY29ubmVjdChsaXN0ZW5lcjogTWVzc2FnZUxpc3RlbmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5saXN0ZW5lciA9IGxpc3RlbmVyO1xuICAgIHRoaXMuY29ubmVjdGVkID0gdHJ1ZTtcbiAgICBjb25zb2xlLmxvZyhcIltJbk1lbW9yeVRyYW5zcG9ydF0gQ29ubmVjdGVkLlwiKTtcbiAgfVxuXG4gIGRpc2Nvbm5lY3QoKTogdm9pZCB7XG4gICAgdGhpcy5saXN0ZW5lciA9IG51bGw7XG4gICAgdGhpcy5jb25uZWN0ZWQgPSBmYWxzZTtcbiAgICBjb25zb2xlLmxvZyhcIltJbk1lbW9yeVRyYW5zcG9ydF0gRGlzY29ubmVjdGVkLlwiKTtcbiAgfVxuXG4gIGFzeW5jIHNlbmRNZXNzYWdlKHBheWxvYWQ6IENsaWVudE1lc3NhZ2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuY29ubmVjdGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJbSW5NZW1vcnlUcmFuc3BvcnRdIE5vdCBjb25uZWN0ZWQuXCIpO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZyhgW0luTWVtb3J5VHJhbnNwb3J0XSBTZW50IG1lc3NhZ2U6YCwgcGF5bG9hZCk7XG4gICAgLy8gSW4gYSByZWFsIHRlc3Qgc2V0dXAsIHRoaXMgbWlnaHQgdHJpZ2dlciBhIHNpbXVsYXRlZCBzZXJ2ZXIgcmVzcG9uc2VcbiAgICAvLyB2aWEgYGRpc3BhdGNoTWVzc2FnZWAuXG4gIH1cblxuICBpc0Nvbm5lY3RlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jb25uZWN0ZWQ7XG4gIH1cblxuICBvbkNvbm5lY3Rpb25DaGFuZ2UobGlzdGVuZXI6IENvbm5lY3Rpb25TdGF0dXNMaXN0ZW5lcik6ICgpID0+IHZvaWQge1xuICAgIHRoaXMuY29ubmVjdGlvbkxpc3RlbmVycy5hZGQobGlzdGVuZXIpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICB0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lcnMuZGVsZXRlKGxpc3RlbmVyKTtcbiAgICB9O1xuICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgTG9hZGVyRnVuY3Rpb25BcmdzIH0gZnJvbSBcInJlYWN0LXJvdXRlclwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJvdXRlSW5mbyB7XG4gIHBhdGhuYW1lOiBzdHJpbmc7XG4gIGhhc2g6IHN0cmluZztcbiAgcXVlcnk6IHN0cmluZztcbiAgcXVlcnlQYXJhbXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIHBhdGhQYXJhbXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD47XG4gIGNhdGNoYWxsOiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RTZXJ2ZXJSb3V0ZUluZm8oe1xuICBwYXJhbXMsXG4gIHJlcXVlc3QsXG59OiBMb2FkZXJGdW5jdGlvbkFyZ3MpIHtcbiAgY29uc3QgeyBcIipcIjogY2F0Y2hhbGwgPSBcIlwiLCAuLi5wYXRoUGFyYW1zIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHBhcnNlZFVybCA9IG5ldyBVUkwocmVxdWVzdC51cmwpO1xuXG4gIHJldHVybiB7XG4gICAgaGFzaDogcGFyc2VkVXJsLmhhc2gsXG4gICAgcGF0aG5hbWU6IHBhcnNlZFVybC5wYXRobmFtZSxcbiAgICBxdWVyeTogcGFyc2VkVXJsLnNlYXJjaCxcbiAgICBxdWVyeVBhcmFtczogT2JqZWN0LmZyb21FbnRyaWVzKHBhcnNlZFVybC5zZWFyY2hQYXJhbXMuZW50cmllcygpKSxcbiAgICBwYXRoUGFyYW1zLFxuICAgIGNhdGNoYWxsOiBjYXRjaGFsbC5sZW5ndGggPiAxID8gY2F0Y2hhbGwuc3BsaXQoXCIvXCIpIDogW10sXG4gIH0gc2F0aXNmaWVzIFJvdXRlSW5mbztcbn0iLAogICAgIi8vIFNlcmlhbGl6YXRpb24gaGVscGVycyB0aGF0IHN1cHBvcnQ6XG4vLyAtIENpcmN1bGFyIHJlZmVyZW5jZXMgdmlhIG9iamVjdCBpZGVudGl0eSByZWZzXG4vLyAtIERhdGUgaW5zdGFuY2VzIOKGkiB7IF9fdDogXCJkYXRldGltZVwiLCB0aW1lc3RhbXAgfVxuLy8gLSBGb3JtRGF0YSDihpIgeyBfX3Q6IFwiZm9ybWRhdGFcIiwgZmllbGRzIH1cbi8vIC0gRmlsZSDihpIgeyBfX3Q6IFwiZmlsZVwiLCBuYW1lLCB0eXBlLCBzaXplLCBsYXN0TW9kaWZpZWQsIGNvbnRlbnQ6IG51bWJlcltdIH1cbi8vIEFsb25nIHdpdGggYSBkZWNvZGVyIGZvciB0aGUgc3ltbWV0cmljIHNoYXBlcyAod2UgZG8gbm90IHJlY29uc3RydWN0IEZpbGUvRm9ybURhdGEgb2JqZWN0cykuXG5cbnR5cGUgRW5jb2RlZFJlZiA9IHsgX190OiBcInJlZlwiOyBpZDogbnVtYmVyIH07XG50eXBlIEVuY29kZWRBcnJheSA9IHsgX190OiBcImFycmF5XCI7IF9faWQ6IG51bWJlcjsgaXRlbXM6IHVua25vd25bXSB9O1xudHlwZSBFbmNvZGVkT2JqZWN0ID0ge1xuICBfX3Q6IFwib2JqZWN0XCI7XG4gIF9faWQ6IG51bWJlcjtcbiAgcHJvcHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufTtcbnR5cGUgRW5jb2RlZERhdGUgPSB7IF9fdDogXCJkYXRldGltZVwiOyB0aW1lc3RhbXA6IG51bWJlciB9O1xudHlwZSBFbmNvZGVkRmlsZSA9IHtcbiAgX190OiBcImZpbGVcIjtcbiAgbmFtZTogc3RyaW5nO1xuICB0eXBlOiBzdHJpbmc7XG4gIHNpemU6IG51bWJlcjtcbiAgbGFzdE1vZGlmaWVkOiBudW1iZXI7XG4gIGNvbnRlbnQ6IG51bWJlcltdOyAvLyByYXcgYnl0ZXMgYXMgYSBKU09OLXNhZmUgbnVtYmVyIGFycmF5XG59O1xudHlwZSBFbmNvZGVkRm9ybURhdGEgPSB7XG4gIF9fdDogXCJmb3JtZGF0YVwiO1xuICBmaWVsZHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24gfCB1bmtub3duW10+O1xufTtcblxudHlwZSBJZGVudGl0eU1hcCA9IFdlYWtNYXA8b2JqZWN0LCBudW1iZXI+O1xuXG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKTtcbiAgcmV0dXJuIHByb3RvID09PSBPYmplY3QucHJvdG90eXBlIHx8IHByb3RvID09PSBudWxsO1xufVxuXG5cbmZ1bmN0aW9uIGlzRGF0ZSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIERhdGUge1xuICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBEYXRlO1xufVxuXG5mdW5jdGlvbiBpc1NraXBwYWJsZSh2YWx1ZTogdW5rbm93bik6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiIHx8XG4gICAgdHlwZW9mIHZhbHVlID09PSBcInN5bWJvbFwiIHx8XG4gICAgdHlwZW9mIHZhbHVlID09PSBcInVuZGVmaW5lZFwiXG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpbGVUb0J5dGVBcnJheShmaWxlOiBGaWxlKTogUHJvbWlzZTxudW1iZXJbXT4ge1xuICBjb25zdCBhYiA9IGF3YWl0IGZpbGUuYXJyYXlCdWZmZXIoKTtcbiAgcmV0dXJuIEFycmF5LmZyb20obmV3IFVpbnQ4QXJyYXkoYWIpKTtcbn1cblxuaW50ZXJmYWNlIEVuY29kZUNvbnRleHQge1xuICBzZWVuOiBJZGVudGl0eU1hcDtcbiAgbmV4dElkOiBudW1iZXI7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbmNvZGVGb3JXaXJlKGlucHV0OiB1bmtub3duKTogUHJvbWlzZTx1bmtub3duPiB7XG4gIGNvbnN0IGN0eDogRW5jb2RlQ29udGV4dCA9IHsgc2VlbjogbmV3IFdlYWtNYXAoKSwgbmV4dElkOiAxIH07XG4gIHJldHVybiBhd2FpdCBlbmNvZGVSZWN1cnNpdmUoaW5wdXQsIGN0eCk7XG59XG5cbmZ1bmN0aW9uIHJlbWVtYmVyKGN0eDogRW5jb2RlQ29udGV4dCwgb2JqOiBvYmplY3QpOiBudW1iZXIgfCBudWxsIHtcbiAgY29uc3QgZXhpc3RpbmcgPSBjdHguc2Vlbi5nZXQob2JqKTtcbiAgaWYgKGV4aXN0aW5nICE9PSB1bmRlZmluZWQpIHJldHVybiBudWxsO1xuICBjb25zdCBpZCA9IGN0eC5uZXh0SWQrKztcbiAgY3R4LnNlZW4uc2V0KG9iaiwgaWQpO1xuICByZXR1cm4gaWQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGVuY29kZVJlY3Vyc2l2ZShcbiAgdmFsdWU6IHVua25vd24sXG4gIGN0eDogRW5jb2RlQ29udGV4dFxuKTogUHJvbWlzZTx1bmtub3duPiB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvLyBTcGVjaWFsIGNhc2VzIGZpcnN0XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICBjb25zdCBkYXRlID0gdmFsdWUgYXMgRGF0ZTtcbiAgICBjb25zdCBlbmNvZGVkOiBFbmNvZGVkRGF0ZSA9IHsgX190OiBcImRhdGV0aW1lXCIsIHRpbWVzdGFtcDogZGF0ZS5nZXRUaW1lKCkgfTtcbiAgICByZXR1cm4gZW5jb2RlZDtcbiAgfVxuXG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEZvcm1EYXRhKSB7XG4gICAgY29uc3QgaWQgPSByZW1lbWJlcihjdHgsIHZhbHVlKTtcbiAgICBpZiAoaWQgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiB7IF9fdDogXCJyZWZcIiwgaWQ6IGN0eC5zZWVuLmdldCh2YWx1ZSBhcyBvYmplY3QpISB9IGFzIEVuY29kZWRSZWY7XG4gICAgfVxuICAgIGNvbnN0IGZpZWxkczogUmVjb3JkPHN0cmluZywgdW5rbm93biB8IHVua25vd25bXT4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZdIG9mIHZhbHVlLmVudHJpZXMoKSkge1xuICAgICAgY29uc3QgZW5jb2RlZFZhbCA9IGF3YWl0IGVuY29kZVJlY3Vyc2l2ZSh2IGFzIHVua25vd24sIGN0eCk7XG4gICAgICBpZiAoZW5jb2RlZFZhbCA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZmllbGRzLCBrZXkpKSB7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nID0gZmllbGRzW2tleV07XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGV4aXN0aW5nKSkge1xuICAgICAgICAgIGV4aXN0aW5nLnB1c2goZW5jb2RlZFZhbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmllbGRzW2tleV0gPSBbZXhpc3RpbmcsIGVuY29kZWRWYWxdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmaWVsZHNba2V5XSA9IGVuY29kZWRWYWw7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGVuY29kZWQ6IEVuY29kZWRGb3JtRGF0YSAmIHsgX19pZDogbnVtYmVyIH0gPSB7XG4gICAgICBfX3Q6IFwiZm9ybWRhdGFcIixcbiAgICAgIGZpZWxkcyxcbiAgICAgIF9faWQ6IGlkLFxuICAgIH0gYXMgYW55O1xuICAgIHJldHVybiBlbmNvZGVkO1xuICB9XG5cbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRmlsZSkge1xuICAgIGNvbnN0IGZpbGUgPSB2YWx1ZTtcbiAgICBjb25zdCBieXRlcyA9IGF3YWl0IGZpbGVUb0J5dGVBcnJheSh2YWx1ZSk7XG4gICAgY29uc3QgZW5jb2RlZDogRW5jb2RlZEZpbGUgPSB7XG4gICAgICBfX3Q6IFwiZmlsZVwiLFxuICAgICAgbmFtZTogZmlsZS5uYW1lLFxuICAgICAgdHlwZTogZmlsZS50eXBlLFxuICAgICAgc2l6ZTogZmlsZS5zaXplLFxuICAgICAgbGFzdE1vZGlmaWVkOiBmaWxlLmxhc3RNb2RpZmllZCxcbiAgICAgIGNvbnRlbnQ6IGJ5dGVzLFxuICAgIH07XG4gICAgcmV0dXJuIGVuY29kZWQ7XG4gIH1cblxuICAvLyBJZGVudGl0eSAvIGNpcmN1bGFyIHJlZmVyZW5jZSBoYW5kbGluZ1xuICBjb25zdCBvYmplY3QgPSB2YWx1ZSBhcyBvYmplY3Q7XG4gIGNvbnN0IGV4aXN0aW5nSWQgPSBjdHguc2Vlbi5nZXQob2JqZWN0KTtcbiAgaWYgKGV4aXN0aW5nSWQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IHJlZjogRW5jb2RlZFJlZiA9IHsgX190OiBcInJlZlwiLCBpZDogZXhpc3RpbmdJZCB9O1xuICAgIHJldHVybiByZWY7XG4gIH1cbiAgY29uc3QgdGhpc0lkID0gY3R4Lm5leHRJZCsrO1xuICBjdHguc2Vlbi5zZXQob2JqZWN0LCB0aGlzSWQpO1xuXG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIGNvbnN0IGl0ZW1zUmF3ID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAodmFsdWUgYXMgdW5rbm93bltdKS5tYXAoKGl0ZW0pID0+IGVuY29kZVJlY3Vyc2l2ZShpdGVtLCBjdHgpKVxuICAgICk7XG4gICAgY29uc3QgaXRlbXMgPSBpdGVtc1Jhdy5maWx0ZXIoKGl0KSA9PiBpdCAhPT0gdW5kZWZpbmVkKSBhcyB1bmtub3duW107XG4gICAgY29uc3QgZW5jb2RlZDogRW5jb2RlZEFycmF5ID0geyBfX3Q6IFwiYXJyYXlcIiwgX19pZDogdGhpc0lkLCBpdGVtcyB9O1xuICAgIHJldHVybiBlbmNvZGVkO1xuICB9XG5cbiAgLy8gUGxhaW4gb2JqZWN0IG9yIG90aGVyIG9iamVjdCB0eXBlc1xuICBjb25zdCBwcm9wczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgaWYgKGlzUGxhaW5PYmplY3QodmFsdWUpKSB7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModmFsdWUpKSB7XG4gICAgICBjb25zdCB2ID0gKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldO1xuICAgICAgaWYgKGlzU2tpcHBhYmxlKHYpKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGVuY29kZWRWID0gYXdhaXQgZW5jb2RlUmVjdXJzaXZlKHYsIGN0eCk7XG4gICAgICBpZiAoZW5jb2RlZFYgIT09IHVuZGVmaW5lZCkgcHJvcHNba2V5XSA9IGVuY29kZWRWO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBOb24tcGxhaW4gb2JqZWN0czogYmVzdCBlZmZvcnQg4oCTIGVudW1lcmF0ZSBlbnVtZXJhYmxlIHByb3BlcnRpZXNcbiAgICBmb3IgKGNvbnN0IGtleSBpbiB2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikge1xuICAgICAgY29uc3QgdiA9ICh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XTtcbiAgICAgIGlmIChpc1NraXBwYWJsZSh2KSkgY29udGludWU7XG4gICAgICBjb25zdCBlbmNvZGVkViA9IGF3YWl0IGVuY29kZVJlY3Vyc2l2ZSh2LCBjdHgpO1xuICAgICAgaWYgKGVuY29kZWRWICE9PSB1bmRlZmluZWQpIHByb3BzW2tleV0gPSBlbmNvZGVkVjtcbiAgICB9XG4gIH1cbiAgY29uc3QgZW5jb2RlZDogRW5jb2RlZE9iamVjdCA9IHsgX190OiBcIm9iamVjdFwiLCBfX2lkOiB0aGlzSWQsIHByb3BzIH07XG4gIHJldHVybiBlbmNvZGVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlRnJvbVdpcmUoaW5wdXQ6IHVua25vd24pOiB1bmtub3duIHtcbiAgcmV0dXJuIGRlY29kZVJlY3Vyc2l2ZShpbnB1dCk7XG59XG5cbmZ1bmN0aW9uIGRlY29kZVJlY3Vyc2l2ZSh2YWx1ZTogdW5rbm93bik6IHVua25vd24ge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiKSByZXR1cm4gdmFsdWU7XG5cbiAgY29uc3Qgb2JqID0gdmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNvbnN0IHRhZyA9IG9ialtcIl9fdFwiXTtcblxuICBpZiAodGFnID09PSBcImRhdGV0aW1lXCIpIHtcbiAgICBjb25zdCB0cyA9IG9ialtcInRpbWVzdGFtcFwiXSBhcyBudW1iZXI7XG4gICAgcmV0dXJuIG5ldyBEYXRlKHRzKTtcbiAgfVxuXG4gIGlmICh0YWcgPT09IFwiZmlsZVwiKSB7XG4gICAgLy8gRG8gbm90IHJlY29uc3RydWN0IEZpbGU7IGtlZXAgYXMgcGxhaW4gb2JqZWN0LiBPcHRpb25hbGx5LCB0dXJuIGNvbnRlbnQgaW50byBVaW50OEFycmF5IGZvciBjb252ZW5pZW5jZS5cbiAgICBjb25zdCBjb250ZW50ID0gb2JqW1wiY29udGVudFwiXTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShjb250ZW50KSkge1xuICAgICAgLy8gUmV0dXJuIGEgc2hhbGxvdyBjbG9uZSB3aXRoIFVpbnQ4QXJyYXkgZm9yIGNvbnRlbnRcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLm9iaixcbiAgICAgICAgY29udGVudDogbmV3IFVpbnQ4QXJyYXkoY29udGVudCBhcyBudW1iZXJbXSksXG4gICAgICB9IGFzIGFueTtcbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIGlmICh0YWcgPT09IFwiZm9ybWRhdGFcIikge1xuICAgIC8vIEtlZXAgYXMtaXMgKHBsYWluIG9iamVjdCksIGJ1dCBkZWNvZGUgbmVzdGVkIHZhbHVlc1xuICAgIGNvbnN0IGZpZWxkcyA9IG9ialtcImZpZWxkc1wiXSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duIHwgdW5rbm93bltdPjtcbiAgICBjb25zdCBkZWNvZGVkRmllbGRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duIHwgdW5rbm93bltdPiA9IHt9O1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGZpZWxkcykpIHtcbiAgICAgIGNvbnN0IHYgPSBmaWVsZHNba2V5XTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHYpKSB7XG4gICAgICAgIGRlY29kZWRGaWVsZHNba2V5XSA9IHYubWFwKCh4KSA9PiBkZWNvZGVSZWN1cnNpdmUoeCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVjb2RlZEZpZWxkc1trZXldID0gZGVjb2RlUmVjdXJzaXZlKHYpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyBfX3Q6IFwiZm9ybWRhdGFcIiwgZmllbGRzOiBkZWNvZGVkRmllbGRzIH0gYXMgRW5jb2RlZEZvcm1EYXRhO1xuICB9XG5cbiAgaWYgKHRhZyA9PT0gXCJhcnJheVwiKSB7XG4gICAgY29uc3QgaXRlbXMgPSAob2JqW1wiaXRlbXNcIl0gYXMgdW5rbm93bltdKS5tYXAoKHgpID0+IGRlY29kZVJlY3Vyc2l2ZSh4KSk7XG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG5cbiAgaWYgKHRhZyA9PT0gXCJvYmplY3RcIikge1xuICAgIGNvbnN0IHByb3BzID0gb2JqW1wicHJvcHNcIl0gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgY29uc3Qgb3V0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHByb3BzKSkge1xuICAgICAgb3V0W2tleV0gPSBkZWNvZGVSZWN1cnNpdmUocHJvcHNba2V5XSk7XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICBpZiAodGFnID09PSBcInJlZlwiKSB7XG4gICAgLy8gV2l0aG91dCBhIHJlY29uc3RydWN0aW9uIGNvbnRleHQgb24gdGhlIGNsaWVudCwgbGVhdmUgYXMtaXMuXG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIC8vIFVua25vd24gb2JqZWN0IOKAkyBkZXNjZW5kIHNoYWxsb3dseVxuICBjb25zdCBjb3B5OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhvYmopKSB7XG4gICAgY29weVtrZXldID0gZGVjb2RlUmVjdXJzaXZlKG9ialtrZXldKTtcbiAgfVxuICByZXR1cm4gY29weTtcbn1cblxuLy8gTGVnYWN5IGNsZWFuZXIga2VwdCBmb3IgY29tcGF0aWJpbGl0eSB3aGVyZSBhIHF1aWNrIGJlc3QtZWZmb3J0IEpTT04tc2FmZSBzaGFwZSBpcyBuZWVkZWRcbmV4cG9ydCBmdW5jdGlvbiBjbGVhbkZvclNlcmlhbGl6YXRpb24ob2JqOiB1bmtub3duKTogdW5rbm93biB7XG4gIHJldHVybiBjbGVhblJlY3Vyc2l2ZShvYmosIG5ldyBXZWFrU2V0KCkpO1xufVxuXG5mdW5jdGlvbiBjbGVhblJlY3Vyc2l2ZShvYmo6IHVua25vd24sIHNlZW46IFdlYWtTZXQ8b2JqZWN0Pik6IHVua25vd24ge1xuICBpZiAob2JqID09PSBudWxsIHx8IHR5cGVvZiBvYmogIT09IFwib2JqZWN0XCIpIHJldHVybiBvYmo7XG4gIGlmIChzZWVuLmhhcyhvYmogYXMgb2JqZWN0KSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgc2Vlbi5hZGQob2JqIGFzIG9iamVjdCk7XG4gIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICByZXR1cm4gKG9iaiBhcyB1bmtub3duW10pXG4gICAgICAubWFwKChpdGVtKSA9PiBjbGVhblJlY3Vyc2l2ZShpdGVtLCBzZWVuKSlcbiAgICAgIC5maWx0ZXIoKHgpID0+IHggIT09IHVuZGVmaW5lZCk7XG4gIH1cbiAgY29uc3Qgb3V0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICBmb3IgKGNvbnN0IGtleSBpbiBvYmogYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIHtcbiAgICBjb25zdCB2ID0gKG9iaiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XTtcbiAgICBpZiAoaXNTa2lwcGFibGUodikpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGNsZWFuZWQgPSBjbGVhblJlY3Vyc2l2ZSh2LCBzZWVuKTtcbiAgICBpZiAoY2xlYW5lZCAhPT0gdW5kZWZpbmVkKSBvdXRba2V5XSA9IGNsZWFuZWQ7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cbiIKICBdLAogICJtYXBwaW5ncyI6ICJBQUFBLG9CQUNFLGNBQ0EsYUFDQSxtQkFDQSxpQkFDQSxlQ0xGLDJCQUNFLG1CQUNBLFdBRUEsZUFDQSxlQ0ZLLElBQU0sR0FBZSxhQUNmLEdBQXFCLEtBNkUzQixTQUFTLEVBQWEsQ0FBQyxFQUFxQyxDQUVqRSxPQUFPLE9BQU8sSUFBUyxVQUFZ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QUFJLElBQVEsU0FBVSxDQUNwQixJQUFNLEVBQVEsRUFBSSxNQUNaLEVBQStCLENBQUMsRUFDdEMsUUFBVyxLQUFPLE9BQU8sS0FBSyxDQUFLLEVBQ2pDLEVBQUksR0FBTyxFQUFnQixFQUFNLEVBQUksRUFFdkMsT0FBTyxFQUdULEdBQUksSUFBUSxNQUVWLE9BQU8sRUFJVCxJQUFNLEVBQWdDLENBQUMsRUFDdkMsUUFBVyxLQUFPLE9BQU8sS0FBSyxDQUFHLEVBQy9CLEVBQUssR0FBTyxFQUFnQixFQUFJLEVBQUksRUFFdEMsT0FBTyxFQUlGLFNBQVMsRUFBcUIsQ0FBQyxFQUF1QixDQUMzRCxPQUFPLEdBQWUsRUFBSyxJQUFJLE9BQVMsRUFHMUMsU0FBUyxFQUFjLENBQUMsRUFBYyxFQUFnQyxDQUNwRSxHQUFJLElBQVEsTUFBUSxPQUFPLElBQVEsU0FBVSxPQUFPLEVBQ3BELEdBQUksRUFBSyxJQUFJLENBQWEsRUFBRyxPQUU3QixHQURBLEVBQUssSUFBSSxDQUFhLEVBQ2xCLE1BQU0sUUFBUSxDQUFHLEVBQ25CLE9BQVEsRUFDTCxJQUFJLENBQUMsSUFBUyxHQUFlLEVBQU0sQ0FBSSxDQUFDLEVBQ3hDLE9BQU8sQ0FBQyxJQUFNLElBQU0sTUFBUyxFQUVsQyxJQUFNLEVBQStCLENBQUMsRUFDdEMsUUFBVyxLQUFPLEVBQWdDLENBQ2hELElBQU0sRUFBSyxFQUFnQyxHQUMzQyxHQUFJLEdBQVksQ0FBQyxFQUFHLFNBQ3BCLElBQU0sRUFBVSxHQUFlLEVBQUcsQ0FBSSxFQUN0QyxHQUFJLElBQVksT0FBVyxFQUFJLEdBQU8sRUFFeEMsT0FBTyIsCiAgImRlYnVnSWQiOiAiQzExOUU0MERDRkE2Q0M1RjY0NzU2RTIxNjQ3NTZFMjEiLAogICJuYW1lcyI6IFtdCn0=
|