pulse-ui-client 0.0.14 → 0.1.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- import{useEffect as p,useState as a,useMemo as t,createContext as RW,useContext as NW}from"react";import wW,{cloneElement as K,createElement as JW,isValidElement as BW,lazy as KW,Suspense as HW}from"react";var QW="$$fragment",qW="$$";function zW(W){return typeof W==="object"&&W!==null}function FW(W){return typeof W==="object"&&W!==null&&W.tag.startsWith("$$")&&W.tag!=="$$fragment"}import{jsx as d,Fragment as LW}from"react/jsx-runtime";class x{client;path;components;callbackCache;callbackProps;renderPropKeys;constructor(W,Z,$,Q=[],q=[]){this.client=W;this.path=Z;this.components=$;this.callbackCache=new Map,this.callbackProps=new Map,this.renderPropKeys=new Set(q),this.setCallbacks(Q)}setCallbacks(W){this.callbackProps.clear(),this.callbackCache.clear();for(let Z of W){let[$,Q]=this.splitPropPath(Z);if(!this.callbackProps.has($))this.callbackProps.set($,new Set);this.callbackProps.get($).add(Q)}}applyCallbackDelta(W,Z){let $=new Map,Q=(z)=>{if(!$.has(z))$.set(z,new Set(this.callbackProps.get(z)??[]))};if(W.remove)for(let z of W.remove){let[O,F]=this.splitPropPath(z);Q(O);let X=this.callbackProps.get(O);if(!X){this.callbackCache.delete(z);continue}if(this.callbackCache.delete(z),X.delete(F),X.size===0)this.callbackProps.delete(O)}if(W.add)for(let z of W.add){let[O,F]=this.splitPropPath(z);if(Q(O),!this.callbackProps.has(O))this.callbackProps.set(O,new Set);this.callbackProps.get(O).add(F)}let q=Z;for(let[z,O]of $.entries()){let F=new Set(this.callbackProps.get(z)??[]);if(this.setsEqual(O,F))continue;let X=z?z.split(".").filter((G)=>G.length>0):[];q=this.updateCallbacksOnTree(q,X,0,z,O,F)}return q}setRenderProps(W){this.renderPropKeys=new Set(W)}applyRenderPropsDelta(W){if(W.remove)for(let Z of W.remove)this.renderPropKeys.delete(Z);if(W.add)for(let Z of W.add)this.renderPropKeys.add(Z)}getCallback(W,Z){let $=this.propPath(W,Z),Q=this.callbackCache.get($);if(!Q)Q=(...q)=>this.client.invokeCallback(this.path,$,q),this.callbackCache.set($,Q);return Q}renderNode(W,Z=""){if(W==null||typeof W==="boolean"||typeof W==="number"||typeof W==="string")return W;if(zW(W)){let{tag:$,props:Q={},children:q=[]}=W,z={...Q||{}};for(let F of this.getCallbackNames(Z))z[F]=this.getCallback(Z,F);for(let[F,X]of Object.entries(z)){let G=this.propPath(Z,F);if(this.renderPropKeys.has(G)){let J=Z?`${Z}.${F}`:F;z[F]=this.renderNode(X,J)}}if(W.key)z.key=W.key;let O=[];for(let F=0;F<q.length;F+=1){let X=q[F],G=Z?`${Z}.${F}`:String(F);O.push(this.renderNode(X,G))}if(FW(W)){let F=W.tag.slice(qW.length),X=this.components[F];return JW(X,z,...O)}return JW($===QW?wW.Fragment:$,z,...O)}return null}splitPropPath(W){let Z=W.lastIndexOf(".");if(Z===-1)return["",W];return[W.slice(0,Z),W.slice(Z+1)]}propPath(W,Z){return W?`${W}.${Z}`:Z}getCallbackNames(W){let Z=this.callbackProps.get(W);return Z?Array.from(Z):[]}transformValue(W,Z,$){let Q=this.callbackProps.get(W),q=this.propPath(W,Z);if(Q&&Q.size>0&&Q.has(Z))return this.getCallback(W,Z);if(this.renderPropKeys.has(q))return this.renderNode($,q);return $}updateCallbacksOnTree(W,Z,$,Q,q,z){if($<Z.length){M(W,Z,$);let J=W,C=Z[$],A=Number(C),V=Q?`${Q}.${C}`:C;if(!Number.isNaN(A)){let D=y(J),R=D[A],I=this.updateCallbacksOnTree(R,Z,$+1,V,q,z);if(I===R)return W;return D[A]=I,K(J,void 0,...D)}else{let D=J.props??{},R=D[C],I=this.updateCallbacksOnTree(R,Z,$+1,V,q,z);if(I===R)return W;return K(J,{...D,[C]:I})}}if(!BW(W))return W;let O=W,F=O.props??{},X=!1,G={...F};for(let J of q)if(!z.has(J)&&J in G)delete G[J],X=!0;for(let J of z){let C=this.getCallback(Q,J);if(G[J]!==C)G[J]=C,X=!0}if(!X)return W;return K(O,G)}setsEqual(W,Z){if(W.size!==Z.size)return!1;for(let $ of W)if(!Z.has($))return!1;return!0}}function y(W){let Z=W.props?.children;if(Z==null)return[];return Array.isArray(Z)?Z.slice():[Z]}function n(W,Z,$){let Q=W;for(let q of Z){if(q.type==="update_callbacks"){Q=$.applyCallbackDelta(q.data,Q);continue}if(q.type==="update_render_props"){$.applyRenderPropsDelta(q.data);continue}let z=q.path.split(".").filter((F)=>F.length>0),O=(F,X,G)=>{if(X<z.length){M(F,z,X);let J=F,C=z[X],A=+C,V=G?`${G}.${C}`:C;if(!Number.isNaN(A)){let D=y(J),R=D[A];return D[A]=O(R,X+1,V),K(J,void 0,...D)}else{let D=J.props??{},R=D[C],I={...D,[C]:O(R,X+1,V)};return K(J,I)}}switch(q.type){case"replace":return $.renderNode(q.data,q.path);case"update_props":{M(F,z,X);let J=F,A={...J.props??{}},V=q.data;if(V.remove&&V.remove.length>0){for(let D of V.remove)if(D in A)delete A[D]}if(V.set)for(let[D,R]of Object.entries(V.set))A[D]=$.transformValue(G,D,R);return K(J,A)}case"insert":{M(F,z,X);let J=F,C=y(J),A=G?`${G}.${q.idx}`:String(q.idx);return C.splice(q.idx,0,$.renderNode(q.data,A)),K(J,null,...C)}case"remove":{M(F,z,X);let J=F,C=y(J);return C.splice(q.idx,1),K(J,null,...C)}case"move":{M(F,z,X);let J=F,C=y(J),A=C.splice(q.data.from_index,1)[0];return C.splice(q.data.to_index,0,A),K(J,null,...C)}default:throw Error(`[Pulse renderer] Unknown update type: ${q.type}`)}};Q=O(Q,0,"")}return Q}function YW(W,Z){let $=KW(W);return({children:Q,...q})=>{return d(HW,{fallback:Z??d(LW,{}),children:d($,{...q,children:Q})})}}function M(W,Z,$){return!0}function H(){function W(Z,$){return(Q)=>{let q={};for(let z of Z)q[z]=Q[z];if($)for(let z in $){let O=$[z];q[z]=O(Q)}return q}}return W}var MW=(W)=>W.tagName.toLowerCase(),bW=["id","className","tagName","localName","clientHeight","clientLeft","clientTop","clientWidth","scrollHeight","scrollLeft","scrollTop","scrollWidth","slot"],SW=["autofocus","tabIndex","nonce"],kW=["accessKey","accessKeyLabel","autocapitalize","dir","draggable","hidden","inert","lang","offsetHeight","offsetLeft","offsetTop","offsetWidth","popover","spellcheck","title","translate","writingSuggestions","contentEditable","enterKeyHint","isContentEditable","inputMode"],yW=H()(bW,{tagName:MW}),_W=H()(SW),TW=H()(kW);function Y(W){return{...yW(W),..._W(W),...TW(W)}}function U(W,Z){let $=H()(W,Z);return(Q)=>({...Y(Q),...$(Q)})}var gW=["hash","host","hostname","href","origin","password","pathname","port","protocol","search","target","download","rel","hreflang","type","username","ping","referrerPolicy","text"],xW=U(gW),vW=["alt","coords","download","hash","host","hostname","href","origin","password","pathname","port","protocol","rel","search","shape","target","username","ping","referrerPolicy"],mW=U(vW),hW=["autoplay","controls","crossOrigin","currentSrc","currentTime","defaultMuted","defaultPlaybackRate","duration","ended","loop","muted","networkState","paused","playbackRate","preload","readyState","seeking","src","volume","preservesPitch"],DW=U(hW),EW=(W)=>DW(W),uW=["disabled","name","type","value","formAction","formEnctype","formMethod","formNoValidate","formTarget","popoverTargetAction"],pW=U(uW),iW=["value"],cW=U(iW),dW=["height","src","type","width","align","name"],nW=U(dW),lW=["disabled","name","type","validationMessage","willValidate"],oW=U(lW),sW=["acceptCharset","action","autocomplete","encoding","enctype","length","method","name","noValidate","target","rel"],rW=U(sW),aW=["allow","allowFullscreen","height","name","referrerPolicy","src","srcdoc","width","align","frameBorder","longDesc","marginHeight","marginWidth","scrolling","sandbox"],tW=U(aW),eW=["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"],W1=U(eW),Z1=["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"],$1=U(Z1),Q1=["htmlFor"],q1=U(Q1),z1=["value","type"],F1=U(z1),J1=["as","crossOrigin","disabled","fetchPriority","href","hreflang","imageSizes","imageSrcset","integrity","media","referrerPolicy","rel","type","charset","rev","target","sizes"],X1=U(J1),G1=["name"],U1=U(G1),V1=["high","low","max","min","optimum","value"],D1=U(V1),O1=["cite","dateTime"],XW=U(O1),C1=["reversed","start","type","compact"],A1=U(C1),R1=["data","height","name","type","useMap","width","validationMessage","willValidate","align","archive","border","code","codeBase","codeType","declare","hspace","standby","vspace"],N1=U(R1),f1=["disabled","label"],I1=U(f1),P1=["defaultSelected","disabled","index","label","selected","text","value"],j1=U(P1),w1=["defaultValue","name","type","value","htmlFor","validationMessage","willValidate"],B1=U(w1),K1=["max","position","value"],H1=U(K1),Y1=["cite"],GW=U(Y1),L1=(W)=>Y(W),M1=["async","crossOrigin","defer","fetchPriority","integrity","noModule","referrerPolicy","src","text","type","charset"],b1=H()(M1,{event:(W)=>W.event,htmlFor:(W)=>W.htmlFor}),S1=(W)=>({...Y(W),...b1(W)}),k1=["autocomplete","disabled","length","multiple","name","required","selectedIndex","size","type","value","validationMessage","willValidate"],y1=U(k1),_1=["name"],T1=U(_1),g1=["height","media","sizes","src","srcset","type","width"],x1=U(g1),v1=["align"],m1=U(v1),h1=["abbr","cellIndex","colSpan","headers","rowSpan","scope","align","axis","bgColor","ch","chOff","height","noWrap","vAlign","width"],UW=U(h1),E1=["span","align","ch","chOff","vAlign","width"],VW=U(E1),u1=["align","bgColor","border","cellPadding","cellSpacing","frame","rules","summary","width"],p1=U(u1),i1=["rowIndex","sectionRowIndex","align","bgColor","ch","chOff","vAlign"],c1=U(i1),d1=["align","ch","chOff","vAlign"],l=U(d1),n1=(W)=>Y(W),l1=["autocomplete","cols","defaultValue","dirName","disabled","maxLength","minLength","name","placeholder","readOnly","required","rows","selectionDirection","selectionEnd","selectionStart","value","wrap","textLength","validationMessage","willValidate"],o1=U(l1),s1=["dateTime"],r1=U(s1),a1=["default","kind","label","readyState","src","srclang"],t1=U(a1),e1=["height","poster","videoHeight","videoWidth","width","playsInline"],W3=H()(e1),Z3=(W)=>({...DW(W),...W3(W)}),$3=["clear"],Q3=U($3),q3=["href","target"],z3=U(q3),F3=["aLink","background","bgColor","link","text","vLink"],J3=U(F3),X3=["compact"],G3=U(X3),U3=["open"],V3=U(U3),D3=["open","returnValue"],O3=U(D3),C3=["align"],A3=U(C3),R3=(W)=>Y(W),N3=["align"],b=U(N3),f3=["align","color","noShade","size","width"],I3=U(f3),P3=["version"],j3=U(P3),w3=(W)=>Y(W),B3=["content","httpEquiv","name","scheme"],K3=U(B3),H3=["align"],Y3=U(H3),L3=(W)=>Y(W),M3=["width"],b3=U(M3),S3=(W)=>Y(W),k3=["media","type","disabled"],y3=U(k3),_3=["text"],T3=U(_3),g3=["compact","type"],x3=U(g3),v3={A:xW,AREA:mW,AUDIO:EW,BASE:z3,BLOCKQUOTE:GW,Q:GW,BODY:J3,BR:Q3,BUTTON:pW,CANVAS:Y,CAPTION:m1,CITE:L1,COL:VW,COLGROUP:VW,DATA:cW,DETAILS:V3,DIALOG:O3,DIV:A3,DL:G3,EMBED:nW,FIELDSET:oW,FORM:rW,H1:b,H2:b,H3:b,H4:b,H5:b,H6:b,HEAD:R3,HR:I3,HTML:j3,IFRAME:tW,IMG:W1,INPUT:$1,LABEL:q1,LI:F1,LINK:X1,MAP:U1,MENU:w3,META:K3,METER:D1,INS:XW,DEL:XW,OBJECT:N1,OL:A1,OPTGROUP:I1,OPTION:j1,OUTPUT:B1,P:Y3,PICTURE:L3,PRE:b3,PROGRESS:H1,SCRIPT:S1,SELECT:y1,SLOT:T1,SOURCE:x1,SPAN:S3,STYLE:y3,TABLE:p1,TBODY:l,THEAD:l,TFOOT:l,TD:UW,TH:UW,TEMPLATE:n1,TEXTAREA:o1,TIME:r1,TITLE:T3,TR:c1,TRACK:t1,UL:x3,VIDEO:Z3};function v(W){let Z=W.tagName.toUpperCase(),$=v3[Z];if($)return $(W);throw Error(`Unexpected HTML element tag: ${W.tagName} (update .web/custom/serialize.ts)`)}var m3=(W)=>v(W.target),_=(W)=>W.relatedTarget?v(W.relatedTarget):null;function N(W,Z){return H()(W,{target:m3,...Z||{}})}var w=["target","bubbles","cancelable","defaultPrevented","eventPhase","isTrusted","timeStamp","type"],m=[...w,"detail"],h=[...m,"altKey","button","buttons","clientX","clientY","ctrlKey","metaKey","movementX","movementY","pageX","pageY","screenX","screenY","shiftKey"],h3=[...h,"pointerId","pressure","tangentialPressure","tiltX","tiltY","twist","width","height","pointerType","isPrimary"],E3=N(w),u3=N(m),p3=N(h,{relatedTarget:_}),i3=N(w,{clipboardData:(W)=>OW(W.clipboardData)}),c3=N([...w,"data"]),d3=N(h,{relatedTarget:_,dataTransfer:(W)=>OW(W.dataTransfer)}),n3=N(h3,{relatedTarget:_}),l3=N(w,{relatedTarget:_}),o3=N(w),s3=N(w),r3=N(w),a3=N([...m,"altKey","ctrlKey","code","key","locale","location","metaKey","repeat","shiftKey"]),t3=N([...m,"altKey","ctrlKey","metaKey","shiftKey","changedTouches","targetTouches","touches"],{changedTouches:(W)=>o(W.changedTouches),targetTouches:(W)=>o(W.targetTouches),touches:(W)=>o(W.touches)}),e3=N([...h,"deltaMode","deltaX","deltaY","deltaZ"],{relatedTarget:_}),WZ=N([...w,"animationName","elapsedTime","pseudoElement"]),ZZ=N([...w,"oldState","newState"]),$Z=N([...w,"elapsedTime","propertyName","pseudoElement"]);function o(W){return Array.from(W).map((Z)=>({target:v(Z.target),identifier:Z.identifier,screenX:Z.screenX,screenY:Z.screenY,clientX:Z.clientX,clientY:Z.clientY,pageX:Z.pageX,pageY:Z.pageY}))}function OW(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 f={};function j(W,Z,$){for(let Q of Z)W[Q]=$}j(f,["pointerdown","pointermove","pointerup","pointercancel","gotpointercapture","lostpointercapture","pointerenter","pointerleave","pointerover","pointerout"],n3);j(f,["click","contextmenu","dblclick","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup"],p3);j(f,["drag","dragend","dragenter","dragexit","dragleave","dragover","dragstart","drop"],d3);j(f,["keydown","keypress","keyup"],a3);j(f,["focus","blur"],l3);j(f,["change","input"],r3);j(f,["invalid"],s3);j(f,["reset","submit"],o3);j(f,["copy","cut","paste"],i3);j(f,["compositionend","compositionstart","compositionupdate"],c3);j(f,["touchcancel","touchend","touchmove","touchstart"],t3);j(f,["scroll"],u3);j(f,["wheel"],e3);j(f,["animationstart","animationend","animationiteration"],WZ);j(f,["transitionend"],$Z);j(f,["toggle"],ZZ);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 $=f[Z.type.toLowerCase()];if($)return $(Z);return E3(Z)}return W}function T(W){let Z=new Map,$=[],Q=[],q=[],z=[],O=0;function F(G){if(G==null||typeof G==="number"||typeof G==="string"||typeof G==="boolean")return G;let J=O++,C=Z.get(G);if(C!==void 0)return $.push(J),C;if(Z.set(G,J),G instanceof Date)return Q.push(J),G.getTime();if(Array.isArray(G)){let A=G.length,V=Array(A);for(let D=0;D<A;D++)V[D]=F(G[D]);return V}if(G instanceof Map){z.push(J);let A={};for(let[V,D]of G.entries())A[String(V)]=F(D);return A}if(G instanceof Set){q.push(J);let A=G.size,V=Array(A),D=0;for(let R of G)V[D]=F(R),D+=1;return V}if(typeof G==="object"){let A={},V=Object.keys(G);for(let D=0;D<V.length;D++){let R=V[D];A[R]=F(G[R])}return A}throw Error(`Unsupported value in serialization: ${G}`)}let X=F(W);return[[$,Q,q,z],X]}function r(W,Z){let[[$,Q,q,z],O]=W,F=new Set($),X=new Set(Q),G=new Set(q),J=new Set(z),C=[];function A(V){let D=C.length;if(F.has(D))return C.push(null),C[V];if(X.has(D)){let R=new Date(V);return C.push(R),R}if(V==null||typeof V==="number"||typeof V==="string"||typeof V==="boolean"){if(Z?.coerceNullsToUndefined)return V??void 0;return V}if(Array.isArray(V)){if(G.has(D)){let P=new Set;C.push(P);for(let B=0;B<V.length;B++)P.add(A(V[B]));return P}let R=V.length,I=Array(R);C.push(I);for(let P=0;P<R;P++)I[P]=A(V[P]);return I}if(typeof V==="object"){if(J.has(D)){let P=new Map;C.push(P);let B=Object.keys(V);for(let c=0;c<B.length;c++){let $W=B[c];P.set($W,A(V[$W]))}return P}let R={};C.push(R);let I=Object.keys(V);for(let P=0;P<I.length;P++){let B=I[P];R[B]=A(V[B])}return R}throw Error(`Unsupported value in deserialization: ${V}`)}return A(O)}import{io as JZ}from"socket.io-client";class L 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 qZ(W){if(W instanceof Error)return W.message;if(typeof W==="string")return W;try{return JSON.stringify(W)}catch{return String(W)}}function zZ(W){return typeof W.responseTo==="string"}function FZ(W){return typeof W.event==="string"}class CW{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((z)=>{this.pending.delete($),q(z)})})}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(zZ(W))return this.resolvePending(W),this.closed;if(this.closed)return!0;if(!FZ(W))return this.closed;if(W.event==="__close__")return this.close(new L("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 L("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 z=q(W.payload);if($=await Promise.resolve(z),$!==void 0)break}catch(z){Q=z;break}if(Q){await this.client.sendChannelMessage({type:"channel_message",channel:this.id,event:void 0,responseTo:W.requestId,error:qZ(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 L(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 AW(W,Z){return new CW(W,Z)}class E{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 $=JZ(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 L("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,W.callbacks,W.render_props);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 z=`${q.pathname}${q.search}${q.hash}`;this.frameworkNavigate(z,{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((O,F)=>$[F]=O);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 z={type:"api_result",id:W.id,ok:Z.ok,status:Z.status,headers:$,body:Q};await this.sendMessage(z)}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 L("Channel released")),this.channels.delete(W)}ensureChannelEntry(W){let Z=this.channels.get(W);if(!Z)Z={bridge:AW(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 L("Connection lost"))}}import{useLocation as XZ,useParams as GZ,useNavigate as UZ}from"react-router";import{jsx as S,jsxs as u}from"react/jsx-runtime";var fW=RW(null),IW=RW(null),i=()=>{let W=NW(fW);if(!W)throw Error("usePulseClient must be used within a PulseProvider");return W},VZ=(W)=>{let Z=NW(IW);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 DZ({children:W,config:Z,prerender:$}){let[Q,q]=a(!0),z=UZ(),{renderId:O}=$,F=t(()=>new E(Z.serverAddress,O,z),[Z.serverAddress,z,O]);return p(()=>F.onConnectionChange(q),[F]),p(()=>{if(e)return F.connect(),()=>F.disconnect()},[F]),S(fW.Provider,{value:F,children:u(IW.Provider,{value:$,children:[!Q&&S("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 OZ({externalComponents:W,path:Z}){let $=i(),Q=VZ(Z),q=Q.vdom,z=t(()=>new x($,Z,W,Q.callbacks,Q.render_props),[$,Z,W,Q]),[O,F]=a(()=>z.renderNode(q)),[X,G]=a(null),J=XZ(),C=GZ(),A=t(()=>{let{"*":V="",...D}=C,R=new URLSearchParams(J.search);return{hash:J.hash,pathname:J.pathname,query:J.search,queryParams:Object.fromEntries(R.entries()),pathParams:D,catchall:V.length>0?V.split("/"):[]}},[J.hash,J.pathname,J.search,JSON.stringify(C)]);if(p(()=>{if(e){$.mountView(Z,{routeInfo:A,onInit:(D,R,I)=>{z.setCallbacks(R),z.setRenderProps(I),F(z.renderNode(D))},onUpdate:(D)=>{F((R)=>R==null?R:n(R,D,z))}});let V=$.onServerError((D,R)=>{if(D===Z)G(R)});return()=>{V(),$.unmount(Z)}}},[$]),p(()=>{if(e)$.navigate(Z,A)},[$,Z,A]),X)return S(CZ,{error:X});return O}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&&S("div",{children:W.message}),W.stack&&u("details",{open:!0,style:{marginTop:8},children:[S("summary",{children:"Stack trace"}),S("pre",{style:{margin:0},children:W.stack})]})]})}import{useEffect as AZ,useMemo as RZ}from"react";function NZ(W){let Z=i(),$=RZ(()=>{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 fZ,useCallback as IZ}from"react";import{jsx as jZ}from"react/jsx-runtime";var PZ=fZ(function({onSubmit:Z,action:$,...Q},q){return jZ("form",{...Q,action:$,ref:q,onSubmit:IZ((z)=>PW({event:z,action:$,onSubmit:Z}),[$,Z])})});async function PW({event:W,action:Z,onSubmit:$,formData:Q,force:q}){if($?.(W),!q&&W.defaultPrevented)return;let z=W.currentTarget;W.preventDefault();let O=W.nativeEvent;if(!Q)Q=new FormData(z,O.submitter);let F=new URL(Z,window.location.href);try{await fetch(F,{method:"POST",credentials:"include",body:Q})}catch(X){throw X}}import{io as wZ}from"socket.io-client";class jW{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=wZ(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 BZ({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 g(W,{seen:new WeakMap,nextId:1})}function LZ(W,Z){if(W.seen.get(Z)!==void 0)return null;let Q=W.nextId++;return W.seen.set(Z,Q),Q}async function g(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 F=LZ(Z,W);if(F===null)return{__t:"ref",id:Z.seen.get(W)};let X={};for(let[J,C]of W.entries()){let A=await g(C,Z);if(A===void 0)continue;if(Object.prototype.hasOwnProperty.call(X,J)){let V=X[J];if(Array.isArray(V))V.push(A);else X[J]=[V,A]}else X[J]=A}return{__t:"formdata",fields:X,__id:F}}if(W instanceof File){let F=W,X=await HZ(W);return{__t:"file",name:F.name,type:F.type,size:F.size,lastModified:F.lastModified,content:X}}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 X=(await Promise.all(W.map((J)=>g(J,Z)))).filter((J)=>J!==void 0);return{__t:"array",__id:q,items:X}}let z={};if(KZ(W))for(let F of Object.keys(W)){let X=W[F];if(WW(X))continue;let G=await g(X,Z);if(G!==void 0)z[F]=G}else for(let F in W){let X=W[F];if(WW(X))continue;let G=await g(X,Z);if(G!==void 0)z[F]=G}return{__t:"object",__id:q,props:z}}function MZ(W){return k(W)}function k(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,z={};for(let O of Object.keys(q)){let F=q[O];if(Array.isArray(F))z[O]=F.map((X)=>k(X));else z[O]=k(F)}return{__t:"formdata",fields:z}}if($==="array")return Z.items.map((z)=>k(z));if($==="object"){let q=Z.props,z={};for(let O of Object.keys(q))z[O]=k(q[O]);return z}if($==="ref")return Z;let Q={};for(let q of Object.keys(Z))Q[q]=k(Z[q]);return Q}function bZ(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 z=ZW(q,Z);if(z!==void 0)$[Q]=z}return $}export{i as usePulseClient,NZ as usePulseChannel,PW as submitForm,T as serialize,BZ as extractServerRouteInfo,s as extractEvent,YZ as encodeForWire,r as deserialize,MZ as decodeFromWire,bZ as cleanForSerialization,n as applyReactTreeUpdates,x as VDOMRenderer,jW as SocketIOTransport,YW as RenderLazy,OZ as PulseView,E as PulseSocketIOClient,DZ as PulseProvider,PZ as PulseForm,L as PulseChannelResetError};
1
+ import{useEffect as u,useState as a,useMemo as t,createContext as CW,useContext as RW}from"react";import BW,{cloneElement as K,createElement as JW,isValidElement as wW,lazy as KW,Suspense as HW}from"react";var QW="$$fragment",qW="$$";function zW(W){return typeof W==="object"&&W!==null}function FW(W){return typeof W==="object"&&W!==null&&W.tag.startsWith("$$")&&W.tag!=="$$fragment"}import{jsx as d,Fragment as LW}from"react/jsx-runtime";class x{client;path;components;cssModules;callbacks;callbackCache;renderPropKeys;cssProps;constructor(W,Z,$,Q,q=[],z=[],N=[]){this.client=W;this.path=Z;this.components=$;this.cssModules=Q;this.callbacks=new Set(q),this.callbackCache=new Map,this.renderPropKeys=new Set(z),this.cssProps=new Set(N),this.setCallbacks(q)}setCallbacks(W){this.callbacks=new Set(W)}setRenderProps(W){this.renderPropKeys=new Set(W)}setCssRefs(W){this.cssProps=new Set(W)}applyCallbackDelta(W){if(W.remove)for(let Z of W.remove)this.callbacks.delete(Z);if(W.add)for(let Z of W.add)this.callbacks.add(Z)}applyRenderPropsDelta(W){if(W.remove)for(let Z of W.remove)this.renderPropKeys.delete(Z);if(W.add)for(let Z of W.add)this.renderPropKeys.add(Z)}applyCssRefsDelta(W){if(W.set)for(let Z of W.set)this.cssProps.add(Z);if(W.remove)for(let Z of W.remove)this.cssProps.delete(Z)}getCallback(W,Z){let $=this.propPath(W,Z),Q=this.callbackCache.get($);if(!Q)Q=(...q)=>this.client.invokeCallback(this.path,$,q),this.callbackCache.set($,Q);return Q}renderNode(W,Z=""){if(W==null||typeof W==="boolean"||typeof W==="number"||typeof W==="string")return W;if(zW(W)){let{tag:$,props:Q={},children:q=[]}=W,z={};for(let[F,U]of Object.entries(Q))z[F]=this.transformValue(Z,F,U);if(W.key)z.key=W.key;let N=[];for(let F=0;F<q.length;F+=1){let U=q[F],G=Z?`${Z}.${F}`:String(F);N.push(this.renderNode(U,G))}if(FW(W)){let F=W.tag.slice(qW.length),U=this.components[F];if(!U)throw Error(`Could not find component ${F}. This is a Pulse internal error.`);return JW(U,z,...N)}return JW($===QW?BW.Fragment:$,z,...N)}return null}propPath(W,Z){return W?`${W}.${Z}`:Z}transformValue(W,Z,$){let Q=this.propPath(W,Z);if(this.callbacks.has(Q))return this.getCallback(W,Z);if(this.renderPropKeys.has(Q))return this.renderNode($,Q);if(this.cssProps.has(Q))return this.resolveCssToken($);return $}resolveCssToken(W){let Z=W.indexOf(":");if(Z===-1)return W;let $=W.slice(0,Z),Q=W.slice(Z+1);if(!$||!Q)return W;let q=this.cssModules[$];if(!q)throw Error(`Received CSS reference for unknown module '${$}'`);let z=q[Q];if(typeof z!=="string")throw Error(`Received CSS reference for missing class '${Q}' in module '${$}'`);return z}updateCallbacksOnTree(W,Z,$,Q,q,z){if($<Z.length){M(W,Z,$);let V=W,D=Z[$],A=Number(D),X=Q?`${Q}.${D}`:D;if(!Number.isNaN(A)){let O=S(V),C=O[A],R=this.updateCallbacksOnTree(C,Z,$+1,X,q,z);if(R===C)return W;return O[A]=R,K(V,void 0,...O)}else{let O=V.props??{},C=O[D],R=this.updateCallbacksOnTree(C,Z,$+1,X,q,z);if(R===C)return W;return K(V,{...O,[D]:R})}}if(!wW(W))return W;let N=W,F=N.props??{},U=!1,G={...F};for(let V of q)if(!z.has(V)&&V in G)delete G[V],U=!0;for(let V of z){let D=this.getCallback(Q,V);if(G[V]!==D)G[V]=D,U=!0}if(!U)return W;return K(N,G)}setsEqual(W,Z){if(W.size!==Z.size)return!1;for(let $ of W)if(!Z.has($))return!1;return!0}}function S(W){let Z=W.props?.children;if(Z==null)return[];return Array.isArray(Z)?Z.slice():[Z]}function n(W,Z,$){let Q=W;for(let q of Z){if(q.type==="update_callbacks"){$.applyCallbackDelta(q.data);continue}if(q.type==="update_css_refs"){$.applyCssRefsDelta(q.data);continue}if(q.type==="update_render_props"){$.applyRenderPropsDelta(q.data);continue}let z=q.path.split(".").filter((F)=>F.length>0),N=(F,U,G)=>{if(U<z.length){M(F,z,U);let V=F,D=z[U],A=+D,X=G?`${G}.${D}`:D;if(!Number.isNaN(A)){let O=S(V),C=O[A];return O[A]=N(C,U+1,X),K(V,void 0,...O)}else{let O=V.props??{},C=O[D],R={...O,[D]:N(C,U+1,X)};return K(V,R)}}switch(q.type){case"replace":return $.renderNode(q.data,q.path);case"update_props":{M(F,z,U);let V=F,A={...V.props??{}},X=q.data;if(X.remove&&X.remove.length>0){for(let O of X.remove)if(O in A)delete A[O]}if(X.set)for(let[O,C]of Object.entries(X.set))A[O]=$.transformValue(G,O,C);return K(V,A)}case"insert":{M(F,z,U);let V=F,D=S(V),A=G?`${G}.${q.idx}`:String(q.idx);return D.splice(q.idx,0,$.renderNode(q.data,A)),K(V,null,...D)}case"remove":{M(F,z,U);let V=F,D=S(V);return D.splice(q.idx,1),K(V,null,...D)}case"move":{M(F,z,U);let V=F,D=S(V),A=D.splice(q.data.from_index,1)[0];return D.splice(q.data.to_index,0,A),K(V,null,...D)}default:throw Error(`[Pulse renderer] Unknown update type: ${q.type}`)}};Q=N(Q,0,"")}return Q}function YW(W,Z){let $=KW(W);return({children:Q,...q})=>{return d(HW,{fallback:Z??d(LW,{}),children:d($,{...q,children:Q})})}}function M(W,Z,$){return!0}function H(){function W(Z,$){return(Q)=>{let q={};for(let z of Z)q[z]=Q[z];if($)for(let z in $){let N=$[z];q[z]=N(Q)}return q}}return W}var MW=(W)=>W.tagName.toLowerCase(),yW=["id","className","tagName","localName","clientHeight","clientLeft","clientTop","clientWidth","scrollHeight","scrollLeft","scrollTop","scrollWidth","slot"],bW=["autofocus","tabIndex","nonce"],kW=["accessKey","accessKeyLabel","autocapitalize","dir","draggable","hidden","inert","lang","offsetHeight","offsetLeft","offsetTop","offsetWidth","popover","spellcheck","title","translate","writingSuggestions","contentEditable","enterKeyHint","isContentEditable","inputMode"],SW=H()(yW,{tagName:MW}),TW=H()(bW),_W=H()(kW);function Y(W){return{...SW(W),...TW(W),..._W(W)}}function J(W,Z){let $=H()(W,Z);return(Q)=>({...Y(Q),...$(Q)})}var gW=["hash","host","hostname","href","origin","password","pathname","port","protocol","search","target","download","rel","hreflang","type","username","ping","referrerPolicy","text"],xW=J(gW),vW=["alt","coords","download","hash","host","hostname","href","origin","password","pathname","port","protocol","rel","search","shape","target","username","ping","referrerPolicy"],hW=J(vW),mW=["autoplay","controls","crossOrigin","currentSrc","currentTime","defaultMuted","defaultPlaybackRate","duration","ended","loop","muted","networkState","paused","playbackRate","preload","readyState","seeking","src","volume","preservesPitch"],DW=J(mW),pW=(W)=>DW(W),EW=["disabled","name","type","value","formAction","formEnctype","formMethod","formNoValidate","formTarget","popoverTargetAction"],uW=J(EW),iW=["value"],cW=J(iW),dW=["height","src","type","width","align","name"],nW=J(dW),oW=["disabled","name","type","validationMessage","willValidate"],lW=J(oW),sW=["acceptCharset","action","autocomplete","encoding","enctype","length","method","name","noValidate","target","rel"],rW=J(sW),aW=["allow","allowFullscreen","height","name","referrerPolicy","src","srcdoc","width","align","frameBorder","longDesc","marginHeight","marginWidth","scrolling","sandbox"],tW=J(aW),eW=["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"],W1=J(eW),Z1=["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"],$1=J(Z1),Q1=["htmlFor"],q1=J(Q1),z1=["value","type"],F1=J(z1),J1=["as","crossOrigin","disabled","fetchPriority","href","hreflang","imageSizes","imageSrcset","integrity","media","referrerPolicy","rel","type","charset","rev","target","sizes"],X1=J(J1),G1=["name"],U1=J(G1),V1=["high","low","max","min","optimum","value"],D1=J(V1),O1=["cite","dateTime"],XW=J(O1),A1=["reversed","start","type","compact"],N1=J(A1),C1=["data","height","name","type","useMap","width","validationMessage","willValidate","align","archive","border","code","codeBase","codeType","declare","hspace","standby","vspace"],R1=J(C1),f1=["disabled","label"],P1=J(f1),I1=["defaultSelected","disabled","index","label","selected","text","value"],j1=J(I1),B1=["defaultValue","name","type","value","htmlFor","validationMessage","willValidate"],w1=J(B1),K1=["max","position","value"],H1=J(K1),Y1=["cite"],GW=J(Y1),L1=(W)=>Y(W),M1=["async","crossOrigin","defer","fetchPriority","integrity","noModule","referrerPolicy","src","text","type","charset"],y1=H()(M1,{event:(W)=>W.event,htmlFor:(W)=>W.htmlFor}),b1=(W)=>({...Y(W),...y1(W)}),k1=["autocomplete","disabled","length","multiple","name","required","selectedIndex","size","type","value","validationMessage","willValidate"],S1=J(k1),T1=["name"],_1=J(T1),g1=["height","media","sizes","src","srcset","type","width"],x1=J(g1),v1=["align"],h1=J(v1),m1=["abbr","cellIndex","colSpan","headers","rowSpan","scope","align","axis","bgColor","ch","chOff","height","noWrap","vAlign","width"],UW=J(m1),p1=["span","align","ch","chOff","vAlign","width"],VW=J(p1),E1=["align","bgColor","border","cellPadding","cellSpacing","frame","rules","summary","width"],u1=J(E1),i1=["rowIndex","sectionRowIndex","align","bgColor","ch","chOff","vAlign"],c1=J(i1),d1=["align","ch","chOff","vAlign"],o=J(d1),n1=(W)=>Y(W),o1=["autocomplete","cols","defaultValue","dirName","disabled","maxLength","minLength","name","placeholder","readOnly","required","rows","selectionDirection","selectionEnd","selectionStart","value","wrap","textLength","validationMessage","willValidate"],l1=J(o1),s1=["dateTime"],r1=J(s1),a1=["default","kind","label","readyState","src","srclang"],t1=J(a1),e1=["height","poster","videoHeight","videoWidth","width","playsInline"],W3=H()(e1),Z3=(W)=>({...DW(W),...W3(W)}),$3=["clear"],Q3=J($3),q3=["href","target"],z3=J(q3),F3=["aLink","background","bgColor","link","text","vLink"],J3=J(F3),X3=["compact"],G3=J(X3),U3=["open"],V3=J(U3),D3=["open","returnValue"],O3=J(D3),A3=["align"],N3=J(A3),C3=(W)=>Y(W),R3=["align"],y=J(R3),f3=["align","color","noShade","size","width"],P3=J(f3),I3=["version"],j3=J(I3),B3=(W)=>Y(W),w3=["content","httpEquiv","name","scheme"],K3=J(w3),H3=["align"],Y3=J(H3),L3=(W)=>Y(W),M3=["width"],y3=J(M3),b3=(W)=>Y(W),k3=["media","type","disabled"],S3=J(k3),T3=["text"],_3=J(T3),g3=["compact","type"],x3=J(g3),v3={A:xW,AREA:hW,AUDIO:pW,BASE:z3,BLOCKQUOTE:GW,Q:GW,BODY:J3,BR:Q3,BUTTON:uW,CANVAS:Y,CAPTION:h1,CITE:L1,COL:VW,COLGROUP:VW,DATA:cW,DETAILS:V3,DIALOG:O3,DIV:N3,DL:G3,EMBED:nW,FIELDSET:lW,FORM:rW,H1:y,H2:y,H3:y,H4:y,H5:y,H6:y,HEAD:C3,HR:P3,HTML:j3,IFRAME:tW,IMG:W1,INPUT:$1,LABEL:q1,LI:F1,LINK:X1,MAP:U1,MENU:B3,META:K3,METER:D1,INS:XW,DEL:XW,OBJECT:R1,OL:N1,OPTGROUP:P1,OPTION:j1,OUTPUT:w1,P:Y3,PICTURE:L3,PRE:y3,PROGRESS:H1,SCRIPT:b1,SELECT:S1,SLOT:_1,SOURCE:x1,SPAN:b3,STYLE:S3,TABLE:u1,TBODY:o,THEAD:o,TFOOT:o,TD:UW,TH:UW,TEMPLATE:n1,TEXTAREA:l1,TIME:r1,TITLE:_3,TR:c1,TRACK:t1,UL:x3,VIDEO:Z3};function v(W){let Z=W.tagName.toUpperCase(),$=v3[Z];if($)return $(W);throw Error(`Unexpected HTML element tag: ${W.tagName} (update .web/custom/serialize.ts)`)}var h3=(W)=>v(W.target),T=(W)=>W.relatedTarget?v(W.relatedTarget):null;function P(W,Z){return H()(W,{target:h3,...Z||{}})}var w=["target","bubbles","cancelable","defaultPrevented","eventPhase","isTrusted","timeStamp","type"],h=[...w,"detail"],m=[...h,"altKey","button","buttons","clientX","clientY","ctrlKey","metaKey","movementX","movementY","pageX","pageY","screenX","screenY","shiftKey"],m3=[...m,"pointerId","pressure","tangentialPressure","tiltX","tiltY","twist","width","height","pointerType","isPrimary"],p3=P(w),E3=P(h),u3=P(m,{relatedTarget:T}),i3=P(w,{clipboardData:(W)=>OW(W.clipboardData)}),c3=P([...w,"data"]),d3=P(m,{relatedTarget:T,dataTransfer:(W)=>OW(W.dataTransfer)}),n3=P(m3,{relatedTarget:T}),o3=P(w,{relatedTarget:T}),l3=P(w),s3=P(w),r3=P(w),a3=P([...h,"altKey","ctrlKey","code","key","locale","location","metaKey","repeat","shiftKey"]),t3=P([...h,"altKey","ctrlKey","metaKey","shiftKey","changedTouches","targetTouches","touches"],{changedTouches:(W)=>l(W.changedTouches),targetTouches:(W)=>l(W.targetTouches),touches:(W)=>l(W.touches)}),e3=P([...m,"deltaMode","deltaX","deltaY","deltaZ"],{relatedTarget:T}),WZ=P([...w,"animationName","elapsedTime","pseudoElement"]),ZZ=P([...w,"oldState","newState"]),$Z=P([...w,"elapsedTime","propertyName","pseudoElement"]);function l(W){return Array.from(W).map((Z)=>({target:v(Z.target),identifier:Z.identifier,screenX:Z.screenX,screenY:Z.screenY,clientX:Z.clientX,clientY:Z.clientY,pageX:Z.pageX,pageY:Z.pageY}))}function OW(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 I={};function j(W,Z,$){for(let Q of Z)W[Q]=$}j(I,["pointerdown","pointermove","pointerup","pointercancel","gotpointercapture","lostpointercapture","pointerenter","pointerleave","pointerover","pointerout"],n3);j(I,["click","contextmenu","dblclick","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup"],u3);j(I,["drag","dragend","dragenter","dragexit","dragleave","dragover","dragstart","drop"],d3);j(I,["keydown","keypress","keyup"],a3);j(I,["focus","blur"],o3);j(I,["change","input"],r3);j(I,["invalid"],s3);j(I,["reset","submit"],l3);j(I,["copy","cut","paste"],i3);j(I,["compositionend","compositionstart","compositionupdate"],c3);j(I,["touchcancel","touchend","touchmove","touchstart"],t3);j(I,["scroll"],E3);j(I,["wheel"],e3);j(I,["animationstart","animationend","animationiteration"],WZ);j(I,["transitionend"],$Z);j(I,["toggle"],ZZ);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 $=I[Z.type.toLowerCase()];if($)return $(Z);return p3(Z)}return W}function _(W){let Z=new Map,$=[],Q=[],q=[],z=[],N=0;function F(G){if(G==null||typeof G==="number"||typeof G==="string"||typeof G==="boolean")return G;let V=N++,D=Z.get(G);if(D!==void 0)return $.push(V),D;if(Z.set(G,V),G instanceof Date)return Q.push(V),G.getTime();if(Array.isArray(G)){let A=G.length,X=Array(A);for(let O=0;O<A;O++)X[O]=F(G[O]);return X}if(G instanceof Map){z.push(V);let A={};for(let[X,O]of G.entries())A[String(X)]=F(O);return A}if(G instanceof Set){q.push(V);let A=G.size,X=Array(A),O=0;for(let C of G)X[O]=F(C),O+=1;return X}if(typeof G==="object"){let A={},X=Object.keys(G);for(let O=0;O<X.length;O++){let C=X[O];A[C]=F(G[C])}return A}throw Error(`Unsupported value in serialization: ${G}`)}let U=F(W);return[[$,Q,q,z],U]}function r(W,Z){let[[$,Q,q,z],N]=W,F=new Set($),U=new Set(Q),G=new Set(q),V=new Set(z),D=[];function A(X){let O=D.length;if(F.has(O))return D.push(null),D[X];if(U.has(O)){let C=new Date(X);return D.push(C),C}if(X==null||typeof X==="number"||typeof X==="string"||typeof X==="boolean"){if(Z?.coerceNullsToUndefined)return X??void 0;return X}if(Array.isArray(X)){if(G.has(O)){let f=new Set;D.push(f);for(let B=0;B<X.length;B++)f.add(A(X[B]));return f}let C=X.length,R=Array(C);D.push(R);for(let f=0;f<C;f++)R[f]=A(X[f]);return R}if(typeof X==="object"){if(V.has(O)){let f=new Map;D.push(f);let B=Object.keys(X);for(let c=0;c<B.length;c++){let $W=B[c];f.set($W,A(X[$W]))}return f}let C={};D.push(C);let R=Object.keys(X);for(let f=0;f<R.length;f++){let B=R[f];C[B]=A(X[B])}return C}throw Error(`Unsupported value in deserialization: ${X}`)}return A(N)}import{io as JZ}from"socket.io-client";class L 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 qZ(W){if(W instanceof Error)return W.message;if(typeof W==="string")return W;try{return JSON.stringify(W)}catch{return String(W)}}function zZ(W){return typeof W.responseTo==="string"}function FZ(W){return typeof W.event==="string"}class AW{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((z)=>{this.pending.delete($),q(z)})})}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(zZ(W))return this.resolvePending(W),this.closed;if(this.closed)return!0;if(!FZ(W))return this.closed;if(W.event==="__close__")return this.close(new L("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 L("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 z=q(W.payload);if($=await Promise.resolve(z),$!==void 0)break}catch(z){Q=z;break}if(Q){await this.client.sendChannelMessage({type:"channel_message",channel:this.id,event:void 0,responseTo:W.requestId,error:qZ(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 L(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 NW(W,Z){return new AW(W,Z)}class p{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 $=JZ(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",_({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",_(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",_(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 L("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,W.callbacks,W.render_props,W.css_refs);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 z=`${q.pathname}${q.search}${q.hash}`;this.frameworkNavigate(z,{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((N,F)=>$[F]=N);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 z={type:"api_result",id:W.id,ok:Z.ok,status:Z.status,headers:$,body:Q};await this.sendMessage(z)}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 L("Channel released")),this.channels.delete(W)}ensureChannelEntry(W){let Z=this.channels.get(W);if(!Z)Z={bridge:NW(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 L("Connection lost"))}}import{useLocation as XZ,useParams as GZ,useNavigate as UZ}from"react-router";import{jsx as b,jsxs as E}from"react/jsx-runtime";var fW=CW(null),PW=CW(null),i=()=>{let W=RW(fW);if(!W)throw Error("usePulseClient must be used within a PulseProvider");return W},VZ=(W)=>{let Z=RW(PW);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 DZ({children:W,config:Z,prerender:$}){let[Q,q]=a(!0),z=UZ(),{renderId:N}=$,F=t(()=>new p(Z.serverAddress,N,z),[Z.serverAddress,z,N]);return u(()=>F.onConnectionChange(q),[F]),u(()=>{if(e)return F.connect(),()=>F.disconnect()},[F]),b(fW.Provider,{value:F,children:E(PW.Provider,{value:$,children:[!Q&&b("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 OZ({externalComponents:W,path:Z,cssModules:$}){let Q=i(),q=VZ(Z),z=q.vdom,N=t(()=>new x(Q,Z,W,$,q.callbacks,q.render_props,q.css_refs),[Q,Z,W,$,q]),[F,U]=a(()=>N.renderNode(z)),[G,V]=a(null),D=XZ(),A=GZ(),X=t(()=>{let{"*":O="",...C}=A,R=new URLSearchParams(D.search);return{hash:D.hash,pathname:D.pathname,query:D.search,queryParams:Object.fromEntries(R.entries()),pathParams:C,catchall:O.length>0?O.split("/"):[]}},[D.hash,D.pathname,D.search,JSON.stringify(A)]);if(u(()=>{if(e){Q.mountView(Z,{routeInfo:X,onInit:(C,R,f,B)=>{N.setCallbacks(R),N.setRenderProps(f),N.setCssRefs(B),U(N.renderNode(C))},onUpdate:(C)=>{U((R)=>R==null?R:n(R,C,N))}});let O=Q.onServerError((C,R)=>{if(C===Z)V(R)});return()=>{O(),Q.unmount(Z)}}},[Q]),u(()=>{if(e)Q.navigate(Z,X)},[Q,Z,X]),G)return b(AZ,{error:G});return F}function AZ({error:W}){return E("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:[E("div",{style:{fontWeight:700,marginBottom:8},children:["Server Error during ",W.phase]}),W.message&&b("div",{children:W.message}),W.stack&&E("details",{open:!0,style:{marginTop:8},children:[b("summary",{children:"Stack trace"}),b("pre",{style:{margin:0},children:W.stack})]})]})}import{useEffect as NZ,useMemo as CZ}from"react";function RZ(W){let Z=i(),$=CZ(()=>{if(!W)throw Error("usePulseChannel requires a non-empty channelId");return Z.acquireChannel(W)},[Z,W]);return NZ(()=>{return()=>{Z.releaseChannel(W)}},[Z,W]),$}import{forwardRef as fZ,useCallback as PZ}from"react";import{jsx as jZ}from"react/jsx-runtime";var IZ=fZ(function({onSubmit:Z,action:$,...Q},q){return jZ("form",{...Q,action:$,ref:q,onSubmit:PZ((z)=>IW({event:z,action:$,onSubmit:Z}),[$,Z])})});async function IW({event:W,action:Z,onSubmit:$,formData:Q,force:q}){if($?.(W),!q&&W.defaultPrevented)return;let z=W.currentTarget;W.preventDefault();let N=W.nativeEvent;if(!Q)Q=new FormData(z,N.submitter);let F=new URL(Z,window.location.href);try{await fetch(F,{method:"POST",credentials:"include",body:Q})}catch(U){throw U}}import{io as BZ}from"socket.io-client";class jW{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 wZ({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 g(W,{seen:new WeakMap,nextId:1})}function LZ(W,Z){if(W.seen.get(Z)!==void 0)return null;let Q=W.nextId++;return W.seen.set(Z,Q),Q}async function g(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 F=LZ(Z,W);if(F===null)return{__t:"ref",id:Z.seen.get(W)};let U={};for(let[V,D]of W.entries()){let A=await g(D,Z);if(A===void 0)continue;if(Object.prototype.hasOwnProperty.call(U,V)){let X=U[V];if(Array.isArray(X))X.push(A);else U[V]=[X,A]}else U[V]=A}return{__t:"formdata",fields:U,__id:F}}if(W instanceof File){let F=W,U=await HZ(W);return{__t:"file",name:F.name,type:F.type,size:F.size,lastModified:F.lastModified,content:U}}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 U=(await Promise.all(W.map((V)=>g(V,Z)))).filter((V)=>V!==void 0);return{__t:"array",__id:q,items:U}}let z={};if(KZ(W))for(let F of Object.keys(W)){let U=W[F];if(WW(U))continue;let G=await g(U,Z);if(G!==void 0)z[F]=G}else for(let F in W){let U=W[F];if(WW(U))continue;let G=await g(U,Z);if(G!==void 0)z[F]=G}return{__t:"object",__id:q,props:z}}function MZ(W){return k(W)}function k(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,z={};for(let N of Object.keys(q)){let F=q[N];if(Array.isArray(F))z[N]=F.map((U)=>k(U));else z[N]=k(F)}return{__t:"formdata",fields:z}}if($==="array")return Z.items.map((z)=>k(z));if($==="object"){let q=Z.props,z={};for(let N of Object.keys(q))z[N]=k(q[N]);return z}if($==="ref")return Z;let Q={};for(let q of Object.keys(Z))Q[q]=k(Z[q]);return Q}function yZ(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 z=ZW(q,Z);if(z!==void 0)$[Q]=z}return $}export{i as usePulseClient,RZ as usePulseChannel,IW as submitForm,_ as serialize,wZ as extractServerRouteInfo,s as extractEvent,YZ as encodeForWire,r as deserialize,MZ as decodeFromWire,yZ as cleanForSerialization,n as applyReactTreeUpdates,x as VDOMRenderer,jW as SocketIOTransport,YW as RenderLazy,OZ as PulseView,p as PulseSocketIOClient,DZ as PulseProvider,IZ as PulseForm,L as PulseChannelResetError};
2
2
 
3
- //# debugId=F4564B9E3B69701964756E2164756E21
4
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3B1bHNlLnRzeCIsICIuLi9zcmMvcmVuZGVyZXIudHN4IiwgIi4uL3NyYy92ZG9tLnRzIiwgIi4uL3NyYy9zZXJpYWxpemUvZXh0cmFjdG9yLnRzIiwgIi4uL3NyYy9zZXJpYWxpemUvZWxlbWVudHMudHMiLCAiLi4vc3JjL3NlcmlhbGl6ZS9ldmVudHMudHMiLCAiLi4vc3JjL3NlcmlhbGl6ZS92My50cyIsICIuLi9zcmMvY2xpZW50LnRzeCIsICIuLi9zcmMvY2hhbm5lbC50cyIsICIuLi9zcmMvdXNlUHVsc2VDaGFubmVsLnRzIiwgIi4uL3NyYy9mb3JtLnRzeCIsICIuLi9zcmMvdHJhbnNwb3J0LnRzIiwgIi4uL3NyYy9oZWxwZXJzLnRzIiwgIi4uL3NyYy9zZXJpYWxpemUvY2xlYW4udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiaW1wb3J0IFJlYWN0LCB7XG4gIHVzZUVmZmVjdCxcbiAgdXNlU3RhdGUsXG4gIHVzZU1lbW8sXG4gIGNyZWF0ZUNvbnRleHQsXG4gIHVzZUNvbnRleHQsXG4gIHR5cGUgQ29tcG9uZW50VHlwZSxcbn0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBWRE9NUmVuZGVyZXIsIGFwcGx5VXBkYXRlcyB9IGZyb20gXCIuL3JlbmRlcmVyXCI7XG5pbXBvcnQgeyBQdWxzZVNvY2tldElPQ2xpZW50IH0gZnJvbSBcIi4vY2xpZW50XCI7XG5pbXBvcnQgdHlwZSB7IFZET00sIENvbXBvbmVudFJlZ2lzdHJ5LCBSZWdpc3RyeUVudHJ5IH0gZnJvbSBcIi4vdmRvbVwiO1xuaW1wb3J0IHsgdXNlTG9jYXRpb24sIHVzZVBhcmFtcywgdXNlTmF2aWdhdGUgfSBmcm9tIFwicmVhY3Qtcm91dGVyXCI7XG5pbXBvcnQgdHlwZSB7IFNlcnZlckVycm9ySW5mbyB9IGZyb20gXCIuL21lc3NhZ2VzXCI7XG5pbXBvcnQgdHlwZSB7IFJvdXRlSW5mbyB9IGZyb20gXCIuL2hlbHBlcnNcIjtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFR5cGVzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgaW50ZXJmYWNlIFB1bHNlQ29uZmlnIHtcbiAgc2VydmVyQWRkcmVzczogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBQdWxzZVByZXJlbmRlclZpZXcgPSB7XG4gIHZkb206IFZET007XG4gIGNhbGxiYWNrczogc3RyaW5nW107XG4gIHJlbmRlcl9wcm9wczogc3RyaW5nW107XG59O1xuXG5leHBvcnQgdHlwZSBQdWxzZVByZXJlbmRlciA9IHtcbiAgcmVuZGVySWQ6IHN0cmluZztcbiAgdmlld3M6IFJlY29yZDxzdHJpbmcsIFB1bHNlUHJlcmVuZGVyVmlldz47XG59O1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIENvbnRleHQgYW5kIEhvb2tzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vLyBDb250ZXh0IGZvciB0aGUgY2xpZW50LCBwcm92aWRlZCBieSBQdWxzZVByb3ZpZGVyXG5jb25zdCBQdWxzZUNsaWVudENvbnRleHQgPSBjcmVhdGVDb250ZXh0PFB1bHNlU29ja2V0SU9DbGllbnQgfCBudWxsPihudWxsKTtcbmNvbnN0IFB1bHNlUHJlcmVuZGVyQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQ8UHVsc2VQcmVyZW5kZXIgfCBudWxsPihudWxsKTtcblxuZXhwb3J0IGNvbnN0IHVzZVB1bHNlQ2xpZW50ID0gKCkgPT4ge1xuICBjb25zdCBjbGllbnQgPSB1c2VDb250ZXh0KFB1bHNlQ2xpZW50Q29udGV4dCk7XG4gIGlmICghY2xpZW50KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwidXNlUHVsc2VDbGllbnQgbXVzdCBiZSB1c2VkIHdpdGhpbiBhIFB1bHNlUHJvdmlkZXJcIik7XG4gIH1cbiAgcmV0dXJuIGNsaWVudDtcbn07XG5cbmV4cG9ydCBjb25zdCB1c2VQdWxzZVByZXJlbmRlciA9IChwYXRoOiBzdHJpbmcpID0+IHtcbiAgY29uc3QgY3R4ID0gdXNlQ29udGV4dChQdWxzZVByZXJlbmRlckNvbnRleHQpO1xuICBpZiAoIWN0eCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcInVzZVB1bHNlUHJlcmVuZGVyIG11c3QgYmUgdXNlZCB3aXRoaW4gYSBQdWxzZVByb3ZpZGVyXCIpO1xuICB9XG4gIGNvbnN0IHZpZXcgPSBjdHgudmlld3NbcGF0aF07XG4gIGlmICghdmlldykge1xuICAgIHRocm93IG5ldyBFcnJvcihgTm8gcHJlcmVuZGVyIGZvdW5kIGZvciAnJHtwYXRofSdgKTtcbiAgfVxuICByZXR1cm4gdmlldztcbn07XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBQcm92aWRlclxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGludGVyZmFjZSBQdWxzZVByb3ZpZGVyUHJvcHMge1xuICBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlO1xuICBjb25maWc6IFB1bHNlQ29uZmlnO1xuICBwcmVyZW5kZXI6IFB1bHNlUHJlcmVuZGVyO1xufVxuXG5jb25zdCBpbkJyb3dzZXIgPSB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiO1xuXG5leHBvcnQgZnVuY3Rpb24gUHVsc2VQcm92aWRlcih7XG4gIGNoaWxkcmVuLFxuICBjb25maWcsXG4gIHByZXJlbmRlcixcbn06IFB1bHNlUHJvdmlkZXJQcm9wcykge1xuICBjb25zdCBbY29ubmVjdGVkLCBzZXRDb25uZWN0ZWRdID0gdXNlU3RhdGUodHJ1ZSk7XG4gIGNvbnN0IHJyTmF2aWdhdGUgPSB1c2VOYXZpZ2F0ZSgpO1xuICBjb25zdCB7IHJlbmRlcklkIH0gPSBwcmVyZW5kZXI7XG5cbiAgY29uc3QgY2xpZW50ID0gdXNlTWVtbyhcbiAgICAoKSA9PiBuZXcgUHVsc2VTb2NrZXRJT0NsaWVudChjb25maWcuc2VydmVyQWRkcmVzcywgcmVuZGVySWQsIHJyTmF2aWdhdGUpLFxuICAgIFtjb25maWcuc2VydmVyQWRkcmVzcywgcnJOYXZpZ2F0ZSwgcmVuZGVySWRdXG4gICk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IGNsaWVudC5vbkNvbm5lY3Rpb25DaGFuZ2Uoc2V0Q29ubmVjdGVkKSwgW2NsaWVudF0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGluQnJvd3Nlcikge1xuICAgICAgY2xpZW50LmNvbm5lY3QoKTtcbiAgICAgIHJldHVybiAoKSA9PiBjbGllbnQuZGlzY29ubmVjdCgpO1xuICAgIH1cbiAgfSwgW2NsaWVudF0pO1xuXG4gIHJldHVybiAoXG4gICAgPFB1bHNlQ2xpZW50Q29udGV4dC5Qcm92aWRlciB2YWx1ZT17Y2xpZW50fT5cbiAgICAgIDxQdWxzZVByZXJlbmRlckNvbnRleHQuUHJvdmlkZXIgdmFsdWU9e3ByZXJlbmRlcn0+XG4gICAgICAgIHshY29ubmVjdGVkICYmIChcbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICBwb3NpdGlvbjogXCJmaXhlZFwiLFxuICAgICAgICAgICAgICBib3R0b206IFwiMjBweFwiLFxuICAgICAgICAgICAgICByaWdodDogXCIyMHB4XCIsXG4gICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogXCJyZWRcIixcbiAgICAgICAgICAgICAgY29sb3I6IFwid2hpdGVcIixcbiAgICAgICAgICAgICAgcGFkZGluZzogXCIxMHB4XCIsXG4gICAgICAgICAgICAgIGJvcmRlclJhZGl1czogXCI1cHhcIixcbiAgICAgICAgICAgICAgekluZGV4OiAxMDAwLFxuICAgICAgICAgICAgfX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICBGYWlsZWQgdG8gY29ubmVjdCB0byB0aGUgc2VydmVyLlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICApfVxuICAgICAgICB7Y2hpbGRyZW59XG4gICAgICA8L1B1bHNlUHJlcmVuZGVyQ29udGV4dC5Qcm92aWRlcj5cbiAgICA8L1B1bHNlQ2xpZW50Q29udGV4dC5Qcm92aWRlcj5cbiAgKTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFZpZXdcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHVsc2VWaWV3UHJvcHMge1xuICBleHRlcm5hbENvbXBvbmVudHM6IENvbXBvbmVudFJlZ2lzdHJ5O1xuICBwYXRoOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBQdWxzZVZpZXcoeyBleHRlcm5hbENvbXBvbmVudHMsIHBhdGggfTogUHVsc2VWaWV3UHJvcHMpIHtcbiAgY29uc3QgY2xpZW50ID0gdXNlUHVsc2VDbGllbnQoKTtcbiAgY29uc3QgaW5pdGlhbFZpZXcgPSB1c2VQdWxzZVByZXJlbmRlcihwYXRoKTtcbiAgY29uc3QgaW5pdGlhbFZET00gPSBpbml0aWFsVmlldy52ZG9tO1xuICBjb25zdCByZW5kZXJlciA9IHVzZU1lbW8oXG4gICAgKCkgPT5cbiAgICAgIG5ldyBWRE9NUmVuZGVyZXIoXG4gICAgICAgIGNsaWVudCxcbiAgICAgICAgcGF0aCxcbiAgICAgICAgZXh0ZXJuYWxDb21wb25lbnRzLFxuICAgICAgICBpbml0aWFsVmlldy5jYWxsYmFja3MsXG4gICAgICAgIGluaXRpYWxWaWV3LnJlbmRlcl9wcm9wc1xuICAgICAgKSxcbiAgICBbY2xpZW50LCBwYXRoLCBleHRlcm5hbENvbXBvbmVudHMsIGluaXRpYWxWaWV3XVxuICApO1xuICBjb25zdCBbdHJlZSwgc2V0VHJlZV0gPSB1c2VTdGF0ZTxSZWFjdC5SZWFjdE5vZGU+KCgpID0+XG4gICAgcmVuZGVyZXIucmVuZGVyTm9kZShpbml0aWFsVkRPTSlcbiAgKTtcbiAgY29uc3QgW3NlcnZlckVycm9yLCBzZXRTZXJ2ZXJFcnJvcl0gPSB1c2VTdGF0ZTxTZXJ2ZXJFcnJvckluZm8gfCBudWxsPihudWxsKTtcblxuICBjb25zdCBsb2NhdGlvbiA9IHVzZUxvY2F0aW9uKCk7XG4gIGNvbnN0IHBhcmFtcyA9IHVzZVBhcmFtcygpO1xuXG4gIGNvbnN0IHJvdXRlSW5mbyA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGNvbnN0IHsgXCIqXCI6IGNhdGNoYWxsID0gXCJcIiwgLi4ucGF0aFBhcmFtcyB9ID0gcGFyYW1zO1xuICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhsb2NhdGlvbi5zZWFyY2gpO1xuICAgIHJldHVybiB7XG4gICAgICBoYXNoOiBsb2NhdGlvbi5oYXNoLFxuICAgICAgcGF0aG5hbWU6IGxvY2F0aW9uLnBhdGhuYW1lLFxuICAgICAgcXVlcnk6IGxvY2F0aW9uLnNlYXJjaCxcbiAgICAgIHF1ZXJ5UGFyYW1zOiBPYmplY3QuZnJvbUVudHJpZXMocXVlcnlQYXJhbXMuZW50cmllcygpKSxcbiAgICAgIHBhdGhQYXJhbXMsXG4gICAgICBjYXRjaGFsbDogY2F0Y2hhbGwubGVuZ3RoID4gMCA/IGNhdGNoYWxsLnNwbGl0KFwiL1wiKSA6IFtdLFxuICAgIH0gc2F0aXNmaWVzIFJvdXRlSW5mbztcbiAgfSwgW1xuICAgIGxvY2F0aW9uLmhhc2gsXG4gICAgbG9jYXRpb24ucGF0aG5hbWUsXG4gICAgbG9jYXRpb24uc2VhcmNoLFxuICAgIEpTT04uc3RyaW5naWZ5KHBhcmFtcyksXG4gIF0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGluQnJvd3Nlcikge1xuICAgICAgY2xpZW50Lm1vdW50VmlldyhwYXRoLCB7XG4gICAgICAgIHJvdXRlSW5mbyxcbiAgICAgICAgb25Jbml0OiAodmRvbSwgY2FsbGJhY2tzLCByZW5kZXJQcm9wcykgPT4ge1xuICAgICAgICAgIHJlbmRlcmVyLnNldENhbGxiYWNrcyhjYWxsYmFja3MpO1xuICAgICAgICAgIHJlbmRlcmVyLnNldFJlbmRlclByb3BzKHJlbmRlclByb3BzKTtcbiAgICAgICAgICBzZXRUcmVlKHJlbmRlcmVyLnJlbmRlck5vZGUodmRvbSkpO1xuICAgICAgICB9LFxuICAgICAgICBvblVwZGF0ZTogKG9wcykgPT4ge1xuICAgICAgICAgIHNldFRyZWUoKHByZXYpID0+XG4gICAgICAgICAgICBwcmV2ID09IG51bGwgPyBwcmV2IDogYXBwbHlVcGRhdGVzKHByZXYsIG9wcywgcmVuZGVyZXIpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgY29uc3Qgb2ZmRXJyID0gY2xpZW50Lm9uU2VydmVyRXJyb3IoKHAsIGVycikgPT4ge1xuICAgICAgICBpZiAocCA9PT0gcGF0aCkgc2V0U2VydmVyRXJyb3IoZXJyKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgb2ZmRXJyKCk7XG4gICAgICAgIGNsaWVudC51bm1vdW50KHBhdGgpO1xuICAgICAgfTtcbiAgICB9XG4gICAgLy8gcm91dGVJbmZvIGlzIE5PVCBpbmNsdWRlZCBoZXJlIG9uIHB1cnBvc2VcbiAgfSwgW2NsaWVudF0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGluQnJvd3Nlcikge1xuICAgICAgY2xpZW50Lm5hdmlnYXRlKHBhdGgsIHJvdXRlSW5mbyk7XG4gICAgfVxuICB9LCBbY2xpZW50LCBwYXRoLCByb3V0ZUluZm9dKTtcblxuICBpZiAoc2VydmVyRXJyb3IpIHtcbiAgICByZXR1cm4gPFNlcnZlckVycm9yIGVycm9yPXtzZXJ2ZXJFcnJvcn0gLz47XG4gIH1cblxuICByZXR1cm4gdHJlZTtcbn1cblxuZnVuY3Rpb24gU2VydmVyRXJyb3IoeyBlcnJvciB9OiB7IGVycm9yOiBTZXJ2ZXJFcnJvckluZm8gfSkge1xuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIHN0eWxlPXt7XG4gICAgICAgIHBhZGRpbmc6IDE2LFxuICAgICAgICBib3JkZXI6IFwiMXB4IHNvbGlkICNlMDBcIixcbiAgICAgICAgYmFja2dyb3VuZDogXCIjZmZmNWY1XCIsXG4gICAgICAgIGNvbG9yOiBcIiM5MDBcIixcbiAgICAgICAgZm9udEZhbWlseTpcbiAgICAgICAgICAndWktbW9ub3NwYWNlLCBTRk1vbm8tUmVndWxhciwgTWVubG8sIE1vbmFjbywgQ29uc29sYXMsIFwiTGliZXJhdGlvbiBNb25vXCIsIFwiQ291cmllciBOZXdcIiwgbW9ub3NwYWNlJyxcbiAgICAgICAgd2hpdGVTcGFjZTogXCJwcmUtd3JhcFwiLFxuICAgICAgfX1cbiAgICA+XG4gICAgICA8ZGl2IHN0eWxlPXt7IGZvbnRXZWlnaHQ6IDcwMCwgbWFyZ2luQm90dG9tOiA4IH19PlxuICAgICAgICBTZXJ2ZXIgRXJyb3IgZHVyaW5nIHtlcnJvci5waGFzZX1cbiAgICAgIDwvZGl2PlxuICAgICAge2Vycm9yLm1lc3NhZ2UgJiYgPGRpdj57ZXJyb3IubWVzc2FnZX08L2Rpdj59XG4gICAgICB7ZXJyb3Iuc3RhY2sgJiYgKFxuICAgICAgICA8ZGV0YWlscyBvcGVuIHN0eWxlPXt7IG1hcmdpblRvcDogOCB9fT5cbiAgICAgICAgICA8c3VtbWFyeT5TdGFjayB0cmFjZTwvc3VtbWFyeT5cbiAgICAgICAgICA8cHJlIHN0eWxlPXt7IG1hcmdpbjogMCB9fT57ZXJyb3Iuc3RhY2t9PC9wcmU+XG4gICAgICAgIDwvZGV0YWlscz5cbiAgICAgICl9XG4gICAgPC9kaXY+XG4gICk7XG59XG4iLAogICAgImltcG9ydCBSZWFjdCwge1xuICBjbG9uZUVsZW1lbnQsXG4gIGNyZWF0ZUVsZW1lbnQsXG4gIGlzVmFsaWRFbGVtZW50LFxuICBsYXp5LFxuICBTdXNwZW5zZSxcbiAgdHlwZSBDb21wb25lbnRUeXBlLFxufSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB0eXBlIHsgQ29tcG9uZW50UmVnaXN0cnksIFZET01Ob2RlLCBWRE9NVXBkYXRlLCBWRE9NIH0gZnJvbSBcIi4vdmRvbVwiO1xuaW1wb3J0IHtcbiAgRlJBR01FTlRfVEFHLFxuICBpc0VsZW1lbnROb2RlLFxuICBpc01vdW50UG9pbnROb2RlLFxuICBNT1VOVF9QT0lOVF9QUkVGSVgsXG59IGZyb20gXCIuL3Zkb21cIjtcbmltcG9ydCB0eXBlIHsgUHVsc2VTb2NrZXRJT0NsaWVudCB9IGZyb20gXCIuL2NsaWVudFwiO1xuXG5leHBvcnQgY2xhc3MgVkRPTVJlbmRlcmVyIHtcbiAgcHJpdmF0ZSBjYWxsYmFja0NhY2hlOiBNYXA8c3RyaW5nLCAoLi4uYXJnczogYW55W10pID0+IHZvaWQ+O1xuICBwcml2YXRlIGNhbGxiYWNrUHJvcHM6IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+PjtcbiAgcHJpdmF0ZSByZW5kZXJQcm9wS2V5czogU2V0PHN0cmluZz47XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY2xpZW50OiBQdWxzZVNvY2tldElPQ2xpZW50LFxuICAgIHByaXZhdGUgcGF0aDogc3RyaW5nLFxuICAgIHByaXZhdGUgY29tcG9uZW50czogQ29tcG9uZW50UmVnaXN0cnksXG4gICAgaW5pdGlhbENhbGxiYWNrczogc3RyaW5nW10gPSBbXSxcbiAgICBpbml0aWFsUmVuZGVyUHJvcHM6IHN0cmluZ1tdID0gW11cbiAgKSB7XG4gICAgdGhpcy5jYWxsYmFja0NhY2hlID0gbmV3IE1hcCgpO1xuICAgIHRoaXMuY2FsbGJhY2tQcm9wcyA9IG5ldyBNYXAoKTtcbiAgICB0aGlzLnJlbmRlclByb3BLZXlzID0gbmV3IFNldChpbml0aWFsUmVuZGVyUHJvcHMpO1xuICAgIHRoaXMuc2V0Q2FsbGJhY2tzKGluaXRpYWxDYWxsYmFja3MpO1xuICB9XG5cbiAgc2V0Q2FsbGJhY2tzKGtleXM6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5jYWxsYmFja1Byb3BzLmNsZWFyKCk7XG4gICAgdGhpcy5jYWxsYmFja0NhY2hlLmNsZWFyKCk7XG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgY29uc3QgW3BhdGgsIHByb3BdID0gdGhpcy5zcGxpdFByb3BQYXRoKGtleSk7XG4gICAgICBpZiAoIXRoaXMuY2FsbGJhY2tQcm9wcy5oYXMocGF0aCkpIHtcbiAgICAgICAgdGhpcy5jYWxsYmFja1Byb3BzLnNldChwYXRoLCBuZXcgU2V0KCkpO1xuICAgICAgfVxuICAgICAgdGhpcy5jYWxsYmFja1Byb3BzLmdldChwYXRoKSEuYWRkKHByb3ApO1xuICAgIH1cbiAgfVxuXG4gIGFwcGx5Q2FsbGJhY2tEZWx0YShcbiAgICBkZWx0YTogeyBhZGQ/OiBzdHJpbmdbXTsgcmVtb3ZlPzogc3RyaW5nW10gfSxcbiAgICB0cmVlOiBSZWFjdC5SZWFjdE5vZGVcbiAgKTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgICBjb25zdCBiZWZvcmVNYXAgPSBuZXcgTWFwPHN0cmluZywgU2V0PHN0cmluZz4+KCk7XG4gICAgY29uc3QgcmVjb3JkQmVmb3JlID0gKHBhdGg6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKCFiZWZvcmVNYXAuaGFzKHBhdGgpKSB7XG4gICAgICAgIGJlZm9yZU1hcC5zZXQocGF0aCwgbmV3IFNldCh0aGlzLmNhbGxiYWNrUHJvcHMuZ2V0KHBhdGgpID8/IFtdKSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGlmIChkZWx0YS5yZW1vdmUpIHtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGRlbHRhLnJlbW92ZSkge1xuICAgICAgICBjb25zdCBbcGF0aCwgcHJvcF0gPSB0aGlzLnNwbGl0UHJvcFBhdGgoa2V5KTtcbiAgICAgICAgcmVjb3JkQmVmb3JlKHBhdGgpO1xuICAgICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5jYWxsYmFja1Byb3BzLmdldChwYXRoKTtcbiAgICAgICAgaWYgKCFjdXJyZW50KSB7XG4gICAgICAgICAgdGhpcy5jYWxsYmFja0NhY2hlLmRlbGV0ZShrZXkpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2FsbGJhY2tDYWNoZS5kZWxldGUoa2V5KTtcbiAgICAgICAgY3VycmVudC5kZWxldGUocHJvcCk7XG4gICAgICAgIGlmIChjdXJyZW50LnNpemUgPT09IDApIHtcbiAgICAgICAgICB0aGlzLmNhbGxiYWNrUHJvcHMuZGVsZXRlKHBhdGgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGRlbHRhLmFkZCkge1xuICAgICAgZm9yIChjb25zdCBrZXkgb2YgZGVsdGEuYWRkKSB7XG4gICAgICAgIGNvbnN0IFtwYXRoLCBwcm9wXSA9IHRoaXMuc3BsaXRQcm9wUGF0aChrZXkpO1xuICAgICAgICByZWNvcmRCZWZvcmUocGF0aCk7XG4gICAgICAgIGlmICghdGhpcy5jYWxsYmFja1Byb3BzLmhhcyhwYXRoKSkge1xuICAgICAgICAgIHRoaXMuY2FsbGJhY2tQcm9wcy5zZXQocGF0aCwgbmV3IFNldCgpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNhbGxiYWNrUHJvcHMuZ2V0KHBhdGgpIS5hZGQocHJvcCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IG5leHRUcmVlID0gdHJlZTtcbiAgICBmb3IgKGNvbnN0IFtwYXRoLCBiZWZvcmVdIG9mIGJlZm9yZU1hcC5lbnRyaWVzKCkpIHtcbiAgICAgIGNvbnN0IGFmdGVyID0gbmV3IFNldCh0aGlzLmNhbGxiYWNrUHJvcHMuZ2V0KHBhdGgpID8/IFtdKTtcbiAgICAgIGlmICh0aGlzLnNldHNFcXVhbChiZWZvcmUsIGFmdGVyKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBhcnRzID0gcGF0aFxuICAgICAgICA/IHBhdGguc3BsaXQoXCIuXCIpLmZpbHRlcigoc2VnbWVudCkgPT4gc2VnbWVudC5sZW5ndGggPiAwKVxuICAgICAgICA6IFtdO1xuICAgICAgbmV4dFRyZWUgPSB0aGlzLnVwZGF0ZUNhbGxiYWNrc09uVHJlZShcbiAgICAgICAgbmV4dFRyZWUsXG4gICAgICAgIHBhcnRzLFxuICAgICAgICAwLFxuICAgICAgICBwYXRoLFxuICAgICAgICBiZWZvcmUsXG4gICAgICAgIGFmdGVyXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBuZXh0VHJlZTtcbiAgfVxuXG4gIHNldFJlbmRlclByb3BzKGtleXM6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5yZW5kZXJQcm9wS2V5cyA9IG5ldyBTZXQoa2V5cyk7XG4gIH1cblxuICBhcHBseVJlbmRlclByb3BzRGVsdGEoZGVsdGE6IHsgYWRkPzogc3RyaW5nW107IHJlbW92ZT86IHN0cmluZ1tdIH0pIHtcbiAgICBpZiAoZGVsdGEucmVtb3ZlKSB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBkZWx0YS5yZW1vdmUpIHtcbiAgICAgICAgdGhpcy5yZW5kZXJQcm9wS2V5cy5kZWxldGUoa2V5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGRlbHRhLmFkZCkge1xuICAgICAgZm9yIChjb25zdCBrZXkgb2YgZGVsdGEuYWRkKSB7XG4gICAgICAgIHRoaXMucmVuZGVyUHJvcEtleXMuYWRkKGtleSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0Q2FsbGJhY2socGF0aDogc3RyaW5nLCBwcm9wOiBzdHJpbmcpIHtcbiAgICBjb25zdCBrZXkgPSB0aGlzLnByb3BQYXRoKHBhdGgsIHByb3ApO1xuICAgIGxldCBmbiA9IHRoaXMuY2FsbGJhY2tDYWNoZS5nZXQoa2V5KTtcbiAgICBpZiAoIWZuKSB7XG4gICAgICBmbiA9ICguLi5hcmdzOiBhbnlbXSkgPT4gdGhpcy5jbGllbnQuaW52b2tlQ2FsbGJhY2sodGhpcy5wYXRoLCBrZXksIGFyZ3MpO1xuICAgICAgdGhpcy5jYWxsYmFja0NhY2hlLnNldChrZXksIGZuKTtcbiAgICB9XG4gICAgcmV0dXJuIGZuO1xuICB9XG5cbiAgcmVuZGVyTm9kZShub2RlOiBWRE9NTm9kZSwgY3VycmVudFBhdGggPSBcIlwiKTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgICAvLyBIYW5kbGUgcHJpbWl0aXZlcyBlYXJseVxuICAgIGlmIChcbiAgICAgIG5vZGUgPT0gbnVsbCB8fCAvLyBjYXRjaGVzIGJvdGggbnVsbCBhbmQgdW5kZWZpbmVkXG4gICAgICB0eXBlb2Ygbm9kZSA9PT0gXCJib29sZWFuXCIgfHxcbiAgICAgIHR5cGVvZiBub2RlID09PSBcIm51bWJlclwiIHx8XG4gICAgICB0eXBlb2Ygbm9kZSA9PT0gXCJzdHJpbmdcIlxuICAgICkge1xuICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuXG4gICAgLy8gRWxlbWVudCBub2Rlc1xuICAgIGlmIChpc0VsZW1lbnROb2RlKG5vZGUpKSB7XG4gICAgICBjb25zdCB7IHRhZywgcHJvcHMgPSB7fSwgY2hpbGRyZW4gPSBbXSB9ID0gbm9kZTtcblxuICAgICAgY29uc3QgcHJvY2Vzc2VkUHJvcHM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7IC4uLihwcm9wcyB8fCB7fSkgfTtcblxuICAgICAgLy8gQXBwbHkgY2FsbGJhY2tzXG4gICAgICBmb3IgKGNvbnN0IHByb3BOYW1lIG9mIHRoaXMuZ2V0Q2FsbGJhY2tOYW1lcyhjdXJyZW50UGF0aCkpIHtcbiAgICAgICAgcHJvY2Vzc2VkUHJvcHNbcHJvcE5hbWVdID0gdGhpcy5nZXRDYWxsYmFjayhjdXJyZW50UGF0aCwgcHJvcE5hbWUpO1xuICAgICAgfVxuXG4gICAgICAvLyBEZXRlY3QgYW5kIHJlbmRlciBhbnkgcmVuZGVyIHByb3BzIChWRE9NIG9iamVjdHMgaW4gcHJvcHMpXG4gICAgICBmb3IgKGNvbnN0IFtwcm9wTmFtZSwgcHJvcFZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwcm9jZXNzZWRQcm9wcykpIHtcbiAgICAgICAgY29uc3QgcmVuZGVyUHJvcEtleSA9IHRoaXMucHJvcFBhdGgoY3VycmVudFBhdGgsIHByb3BOYW1lKTtcbiAgICAgICAgaWYgKHRoaXMucmVuZGVyUHJvcEtleXMuaGFzKHJlbmRlclByb3BLZXkpKSB7XG4gICAgICAgICAgLy8gVGhpcyBwcm9wIGlzIGEgcmVuZGVyIHByb3AgLSByZW5kZXIgdGhlIFZET00gdG8gUmVhY3RcbiAgICAgICAgICBjb25zdCByZW5kZXJQcm9wUGF0aCA9IGN1cnJlbnRQYXRoXG4gICAgICAgICAgICA/IGAke2N1cnJlbnRQYXRofS4ke3Byb3BOYW1lfWBcbiAgICAgICAgICAgIDogcHJvcE5hbWU7XG4gICAgICAgICAgcHJvY2Vzc2VkUHJvcHNbcHJvcE5hbWVdID0gdGhpcy5yZW5kZXJOb2RlKHByb3BWYWx1ZSwgcmVuZGVyUHJvcFBhdGgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlLmtleSkge1xuICAgICAgICBwcm9jZXNzZWRQcm9wcy5rZXkgPSBub2RlLmtleTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVuZGVyZWRDaGlsZHJlbiA9IFtdO1xuICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGNoaWxkcmVuLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuW2luZGV4XSE7XG4gICAgICAgIGNvbnN0IGNoaWxkUGF0aCA9IGN1cnJlbnRQYXRoXG4gICAgICAgICAgPyBgJHtjdXJyZW50UGF0aH0uJHtpbmRleH1gXG4gICAgICAgICAgOiBTdHJpbmcoaW5kZXgpO1xuICAgICAgICByZW5kZXJlZENoaWxkcmVuLnB1c2godGhpcy5yZW5kZXJOb2RlKGNoaWxkLCBjaGlsZFBhdGgpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzTW91bnRQb2ludE5vZGUobm9kZSkpIHtcbiAgICAgICAgY29uc3QgY29tcG9uZW50S2V5ID0gbm9kZS50YWcuc2xpY2UoTU9VTlRfUE9JTlRfUFJFRklYLmxlbmd0aCk7XG4gICAgICAgIGNvbnN0IENvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50c1tjb21wb25lbnRLZXldITtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoQ29tcG9uZW50LCBwcm9jZXNzZWRQcm9wcywgLi4ucmVuZGVyZWRDaGlsZHJlbik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjcmVhdGVFbGVtZW50KFxuICAgICAgICB0YWcgPT09IEZSQUdNRU5UX1RBRyA/IFJlYWN0LkZyYWdtZW50IDogdGFnLFxuICAgICAgICBwcm9jZXNzZWRQcm9wcyxcbiAgICAgICAgLi4ucmVuZGVyZWRDaGlsZHJlblxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayBmb3IgdW5rbm93biBub2RlIHR5cGVzXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgY29uc29sZS5lcnJvcihcIlVua25vd24gVkRPTSBub2RlIHR5cGU6XCIsIG5vZGUpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgc3BsaXRQcm9wUGF0aChrZXk6IHN0cmluZyk6IFtwYXRoOiBzdHJpbmcsIHByb3A6IHN0cmluZ10ge1xuICAgIGNvbnN0IGxhc3REb3QgPSBrZXkubGFzdEluZGV4T2YoXCIuXCIpO1xuICAgIGlmIChsYXN0RG90ID09PSAtMSkge1xuICAgICAgcmV0dXJuIFtcIlwiLCBrZXldO1xuICAgIH1cbiAgICByZXR1cm4gW2tleS5zbGljZSgwLCBsYXN0RG90KSwga2V5LnNsaWNlKGxhc3REb3QgKyAxKV07XG4gIH1cblxuICBwcml2YXRlIHByb3BQYXRoKHBhdGg6IHN0cmluZywgcHJvcDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHBhdGggPyBgJHtwYXRofS4ke3Byb3B9YCA6IHByb3A7XG4gIH1cblxuICBwcml2YXRlIGdldENhbGxiYWNrTmFtZXMocGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHByb3BzID0gdGhpcy5jYWxsYmFja1Byb3BzLmdldChwYXRoKTtcbiAgICByZXR1cm4gcHJvcHMgPyBBcnJheS5mcm9tKHByb3BzKSA6IFtdO1xuICB9XG5cbiAgdHJhbnNmb3JtVmFsdWUocGF0aDogc3RyaW5nLCBrZXk6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgIGNvbnN0IGNhbGxiYWNrcyA9IHRoaXMuY2FsbGJhY2tQcm9wcy5nZXQocGF0aCk7XG4gICAgY29uc3QgcHJvcFBhdGggPSB0aGlzLnByb3BQYXRoKHBhdGgsIGtleSk7XG4gICAgaWYgKGNhbGxiYWNrcyAmJiBjYWxsYmFja3Muc2l6ZSA+IDAgJiYgY2FsbGJhY2tzLmhhcyhrZXkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRDYWxsYmFjayhwYXRoLCBrZXkpO1xuICAgIH1cbiAgICBpZiAodGhpcy5yZW5kZXJQcm9wS2V5cy5oYXMocHJvcFBhdGgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZW5kZXJOb2RlKHZhbHVlLCBwcm9wUGF0aCk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQ2FsbGJhY2tzT25UcmVlKFxuICAgIG5vZGU6IFJlYWN0LlJlYWN0Tm9kZSxcbiAgICBwYXJ0czogc3RyaW5nW10sXG4gICAgZGVwdGg6IG51bWJlcixcbiAgICBjdXJyZW50UGF0aDogc3RyaW5nLFxuICAgIGJlZm9yZTogU2V0PHN0cmluZz4sXG4gICAgYWZ0ZXI6IFNldDxzdHJpbmc+XG4gICk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gICAgaWYgKGRlcHRoIDwgcGFydHMubGVuZ3RoKSB7XG4gICAgICBhc3NlcnRJc0VsZW1lbnQobm9kZSwgcGFydHMsIGRlcHRoKTtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBub2RlIGFzIFJlYWN0LlJlYWN0RWxlbWVudDxSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbD47XG4gICAgICBjb25zdCBzZWdtZW50ID0gcGFydHNbZGVwdGhdITtcbiAgICAgIGNvbnN0IGNoaWxkSWR4ID0gTnVtYmVyKHNlZ21lbnQpO1xuICAgICAgY29uc3QgbmV4dFBhdGggPSBjdXJyZW50UGF0aCA/IGAke2N1cnJlbnRQYXRofS4ke3NlZ21lbnR9YCA6IHNlZ21lbnQ7XG4gICAgICBpZiAoIU51bWJlci5pc05hTihjaGlsZElkeCkpIHtcbiAgICAgICAgY29uc3QgY2hpbGRyZW5BcnIgPSBlbnN1cmVDaGlsZHJlbkFycmF5KGVsZW1lbnQpO1xuICAgICAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuQXJyW2NoaWxkSWR4XTtcbiAgICAgICAgY29uc3QgdXBkYXRlZENoaWxkID0gdGhpcy51cGRhdGVDYWxsYmFja3NPblRyZWUoXG4gICAgICAgICAgY2hpbGQsXG4gICAgICAgICAgcGFydHMsXG4gICAgICAgICAgZGVwdGggKyAxLFxuICAgICAgICAgIG5leHRQYXRoLFxuICAgICAgICAgIGJlZm9yZSxcbiAgICAgICAgICBhZnRlclxuICAgICAgICApO1xuICAgICAgICBpZiAodXBkYXRlZENoaWxkID09PSBjaGlsZCkge1xuICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICAgIGNoaWxkcmVuQXJyW2NoaWxkSWR4XSA9IHVwZGF0ZWRDaGlsZCBhcyBhbnk7XG4gICAgICAgIHJldHVybiBjbG9uZUVsZW1lbnQoZWxlbWVudCwgdW5kZWZpbmVkLCAuLi5jaGlsZHJlbkFycik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBiYXNlUHJvcHMgPSAoZWxlbWVudC5wcm9wcyA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICAgICAgY29uc3QgY2hpbGQgPSBiYXNlUHJvcHNbc2VnbWVudF07XG4gICAgICAgIGNvbnN0IHVwZGF0ZWRDaGlsZCA9IHRoaXMudXBkYXRlQ2FsbGJhY2tzT25UcmVlKFxuICAgICAgICAgIGNoaWxkLFxuICAgICAgICAgIHBhcnRzLFxuICAgICAgICAgIGRlcHRoICsgMSxcbiAgICAgICAgICBuZXh0UGF0aCxcbiAgICAgICAgICBiZWZvcmUsXG4gICAgICAgICAgYWZ0ZXJcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHVwZGF0ZWRDaGlsZCA9PT0gY2hpbGQpIHtcbiAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2xvbmVFbGVtZW50KGVsZW1lbnQsIHtcbiAgICAgICAgICAuLi5iYXNlUHJvcHMsXG4gICAgICAgICAgW3NlZ21lbnRdOiB1cGRhdGVkQ2hpbGQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghaXNWYWxpZEVsZW1lbnQobm9kZSkpIHtcbiAgICAgIHJldHVybiBub2RlO1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnQgPSBub2RlIGFzIFJlYWN0LlJlYWN0RWxlbWVudDxSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbD47XG4gICAgY29uc3QgY3VycmVudFByb3BzID0gKGVsZW1lbnQucHJvcHMgPz8ge30pIGFzIFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgbGV0IGNoYW5nZWQgPSBmYWxzZTtcbiAgICBjb25zdCBuZXh0UHJvcHM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7IC4uLmN1cnJlbnRQcm9wcyB9O1xuXG4gICAgZm9yIChjb25zdCBwcm9wIG9mIGJlZm9yZSkge1xuICAgICAgaWYgKCFhZnRlci5oYXMocHJvcCkgJiYgcHJvcCBpbiBuZXh0UHJvcHMpIHtcbiAgICAgICAgZGVsZXRlIG5leHRQcm9wc1twcm9wXTtcbiAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBwcm9wIG9mIGFmdGVyKSB7XG4gICAgICBjb25zdCBmbiA9IHRoaXMuZ2V0Q2FsbGJhY2soY3VycmVudFBhdGgsIHByb3ApO1xuICAgICAgaWYgKG5leHRQcm9wc1twcm9wXSAhPT0gZm4pIHtcbiAgICAgICAgbmV4dFByb3BzW3Byb3BdID0gZm47XG4gICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghY2hhbmdlZCkge1xuICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIHJldHVybiBjbG9uZUVsZW1lbnQoZWxlbWVudCwgbmV4dFByb3BzKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0c0VxdWFsKGxlZnQ6IFNldDxzdHJpbmc+LCByaWdodDogU2V0PHN0cmluZz4pOiBib29sZWFuIHtcbiAgICBpZiAobGVmdC5zaXplICE9PSByaWdodC5zaXplKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgbGVmdCkge1xuICAgICAgaWYgKCFyaWdodC5oYXModmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFVwZGF0ZSBGdW5jdGlvbnMgKHNoYWxsb3ctY2xvbmUgYWxvbmcgdXBkYXRlIHBhdGgpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5mdW5jdGlvbiBlbnN1cmVDaGlsZHJlbkFycmF5KGVsOiBSZWFjdC5SZWFjdEVsZW1lbnQpOiBSZWFjdC5SZWFjdE5vZGVbXSB7XG4gIGNvbnN0IGNoaWxkcmVuID0gKGVsLnByb3BzIGFzIGFueSk/LmNoaWxkcmVuIGFzIFJlYWN0LlJlYWN0Tm9kZSB8IHVuZGVmaW5lZDtcbiAgaWYgKGNoaWxkcmVuID09IG51bGwpIHJldHVybiBbXTtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoY2hpbGRyZW4pID8gY2hpbGRyZW4uc2xpY2UoKSA6IFtjaGlsZHJlbl07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseVVwZGF0ZXMoXG4gIGluaXRpYWxUcmVlOiBSZWFjdC5SZWFjdE5vZGUsXG4gIHVwZGF0ZXM6IFZET01VcGRhdGVbXSxcbiAgcmVuZGVyZXI6IFZET01SZW5kZXJlclxuKTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgbGV0IG5ld1RyZWU6IFJlYWN0LlJlYWN0Tm9kZSA9IGluaXRpYWxUcmVlO1xuICBmb3IgKGNvbnN0IHVwZGF0ZSBvZiB1cGRhdGVzKSB7XG4gICAgaWYgKHVwZGF0ZS50eXBlID09PSBcInVwZGF0ZV9jYWxsYmFja3NcIikge1xuICAgICAgbmV3VHJlZSA9IHJlbmRlcmVyLmFwcGx5Q2FsbGJhY2tEZWx0YSh1cGRhdGUuZGF0YSwgbmV3VHJlZSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKHVwZGF0ZS50eXBlID09PSBcInVwZGF0ZV9yZW5kZXJfcHJvcHNcIikge1xuICAgICAgcmVuZGVyZXIuYXBwbHlSZW5kZXJQcm9wc0RlbHRhKHVwZGF0ZS5kYXRhKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcnRzID0gdXBkYXRlLnBhdGguc3BsaXQoXCIuXCIpLmZpbHRlcigocykgPT4gcy5sZW5ndGggPiAwKTtcblxuICAgIGNvbnN0IGRlc2NlbmQgPSAoXG4gICAgICBub2RlOiBSZWFjdC5SZWFjdE5vZGUsXG4gICAgICBkZXB0aDogbnVtYmVyLFxuICAgICAgY3VycmVudFBhdGg6IHN0cmluZ1xuICAgICk6IFJlYWN0LlJlYWN0Tm9kZSA9PiB7XG4gICAgICBpZiAoZGVwdGggPCBwYXJ0cy5sZW5ndGgpIHtcbiAgICAgICAgYXNzZXJ0SXNFbGVtZW50KG5vZGUsIHBhcnRzLCBkZXB0aCk7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBub2RlIGFzIFJlYWN0LlJlYWN0RWxlbWVudDxSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbD47XG4gICAgICAgIGNvbnN0IGNoaWxkS2V5ID0gcGFydHNbZGVwdGhdITtcbiAgICAgICAgY29uc3QgY2hpbGRJZHggPSArY2hpbGRLZXk7XG4gICAgICAgIGNvbnN0IGNoaWxkUGF0aCA9IGN1cnJlbnRQYXRoID8gYCR7Y3VycmVudFBhdGh9LiR7Y2hpbGRLZXl9YCA6IGNoaWxkS2V5O1xuICAgICAgICBpZiAoIU51bWJlci5pc05hTihjaGlsZElkeCkpIHtcbiAgICAgICAgICAvLyBSZWd1bGFyIGNoaWxkIHRyYXZlcnNhbFxuICAgICAgICAgIGNvbnN0IGNoaWxkcmVuQXJyID0gZW5zdXJlQ2hpbGRyZW5BcnJheShlbGVtZW50KTtcbiAgICAgICAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuQXJyW2NoaWxkSWR4XTtcbiAgICAgICAgICBjaGlsZHJlbkFycltjaGlsZElkeF0gPSBkZXNjZW5kKGNoaWxkLCBkZXB0aCArIDEsIGNoaWxkUGF0aCkgYXMgYW55O1xuICAgICAgICAgIHJldHVybiBjbG9uZUVsZW1lbnQoZWxlbWVudCwgdW5kZWZpbmVkLCAuLi5jaGlsZHJlbkFycik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gUmVuZGVyIHByb3AgdHJhdmVyc2FsXG4gICAgICAgICAgY29uc3QgYmFzZVByb3BzID0gKGVsZW1lbnQucHJvcHMgPz8ge30pIGFzIFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgICAgICAgY29uc3QgY2hpbGQgPSBiYXNlUHJvcHNbY2hpbGRLZXldO1xuICAgICAgICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgICAgICAgLi4uYmFzZVByb3BzLFxuICAgICAgICAgICAgW2NoaWxkS2V5XTogZGVzY2VuZChjaGlsZCwgZGVwdGggKyAxLCBjaGlsZFBhdGgpLFxuICAgICAgICAgIH07XG4gICAgICAgICAgcmV0dXJuIGNsb25lRWxlbWVudChlbGVtZW50LCBwcm9wcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHN3aXRjaCAodXBkYXRlLnR5cGUpIHtcbiAgICAgICAgY2FzZSBcInJlcGxhY2VcIjoge1xuICAgICAgICAgIHJldHVybiByZW5kZXJlci5yZW5kZXJOb2RlKHVwZGF0ZS5kYXRhLCB1cGRhdGUucGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcInVwZGF0ZV9wcm9wc1wiOiB7XG4gICAgICAgICAgYXNzZXJ0SXNFbGVtZW50KG5vZGUsIHBhcnRzLCBkZXB0aCk7XG4gICAgICAgICAgY29uc3QgZWxlbWVudCA9IG5vZGUgYXMgUmVhY3QuUmVhY3RFbGVtZW50O1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRQcm9wcyA9IChlbGVtZW50LnByb3BzID8/IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgICAgICAgIGNvbnN0IG5leHRQcm9wczogUmVjb3JkPHN0cmluZywgYW55PiA9IHsgLi4uY3VycmVudFByb3BzIH07XG4gICAgICAgICAgY29uc3QgZGVsdGEgPSB1cGRhdGUuZGF0YTtcbiAgICAgICAgICBpZiAoZGVsdGEucmVtb3ZlICYmIGRlbHRhLnJlbW92ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBkZWx0YS5yZW1vdmUpIHtcbiAgICAgICAgICAgICAgaWYgKGtleSBpbiBuZXh0UHJvcHMpIGRlbGV0ZSBuZXh0UHJvcHNba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGRlbHRhLnNldCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMoZGVsdGEuc2V0KSkge1xuICAgICAgICAgICAgICBuZXh0UHJvcHNba10gPSByZW5kZXJlci50cmFuc2Zvcm1WYWx1ZShjdXJyZW50UGF0aCwgaywgdik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIE5vdCBwYXNzaW5nIGNoaWxkcmVuIC0+IG9ubHkgdXBkYXRlIHRoZSBwcm9wc1xuICAgICAgICAgIHJldHVybiBjbG9uZUVsZW1lbnQoZWxlbWVudCwgbmV4dFByb3BzKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwiaW5zZXJ0XCI6IHtcbiAgICAgICAgICBhc3NlcnRJc0VsZW1lbnQobm9kZSwgcGFydHMsIGRlcHRoKTtcbiAgICAgICAgICBjb25zdCBlbGVtZW50ID0gbm9kZSBhcyBSZWFjdC5SZWFjdEVsZW1lbnQ7XG4gICAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBlbnN1cmVDaGlsZHJlbkFycmF5KGVsZW1lbnQpO1xuICAgICAgICAgIGNvbnN0IGNoaWxkUGF0aCA9IGN1cnJlbnRQYXRoXG4gICAgICAgICAgICA/IGAke2N1cnJlbnRQYXRofS4ke3VwZGF0ZS5pZHh9YFxuICAgICAgICAgICAgOiBTdHJpbmcodXBkYXRlLmlkeCk7XG4gICAgICAgICAgY2hpbGRyZW4uc3BsaWNlKFxuICAgICAgICAgICAgdXBkYXRlLmlkeCxcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICByZW5kZXJlci5yZW5kZXJOb2RlKHVwZGF0ZS5kYXRhLCBjaGlsZFBhdGgpXG4gICAgICAgICAgKTtcbiAgICAgICAgICAvLyBPbmx5IHVwZGF0ZSB0aGUgY2hpbGRyZW4gKFR5cGVTY3JpcHQgZG9lc24ndCBsaWtlIHRoZSBgbnVsbGAsIGJ1dCB0aGF0J3Mgd2hhdCB0aGUgb2ZmaWNpYWwgUmVhY3QgZG9jcyBzYXkpXG4gICAgICAgICAgcmV0dXJuIGNsb25lRWxlbWVudChlbGVtZW50LCBudWxsISwgLi4uY2hpbGRyZW4pO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJyZW1vdmVcIjoge1xuICAgICAgICAgIGFzc2VydElzRWxlbWVudChub2RlLCBwYXJ0cywgZGVwdGgpO1xuICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBub2RlIGFzIFJlYWN0LlJlYWN0RWxlbWVudDtcbiAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IGVuc3VyZUNoaWxkcmVuQXJyYXkoZWxlbWVudCk7XG4gICAgICAgICAgY2hpbGRyZW4uc3BsaWNlKHVwZGF0ZS5pZHgsIDEpO1xuICAgICAgICAgIC8vIE9ubHkgdXBkYXRlIHRoZSBjaGlsZHJlbiAoVHlwZVNjcmlwdCBkb2Vzbid0IGxpa2UgdGhlIGBudWxsYCwgYnV0IHRoYXQncyB3aGF0IHRoZSBvZmZpY2lhbCBSZWFjdCBkb2NzIHNheSlcbiAgICAgICAgICByZXR1cm4gY2xvbmVFbGVtZW50KGVsZW1lbnQsIG51bGwhLCAuLi5jaGlsZHJlbik7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcIm1vdmVcIjoge1xuICAgICAgICAgIGFzc2VydElzRWxlbWVudChub2RlLCBwYXJ0cywgZGVwdGgpO1xuICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBub2RlIGFzIFJlYWN0LlJlYWN0RWxlbWVudDtcbiAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IGVuc3VyZUNoaWxkcmVuQXJyYXkoZWxlbWVudCk7XG4gICAgICAgICAgY29uc3QgaXRlbSA9IGNoaWxkcmVuLnNwbGljZSh1cGRhdGUuZGF0YS5mcm9tX2luZGV4LCAxKVswXTtcbiAgICAgICAgICBjaGlsZHJlbi5zcGxpY2UodXBkYXRlLmRhdGEudG9faW5kZXgsIDAsIGl0ZW0pO1xuICAgICAgICAgIC8vIE9ubHkgdXBkYXRlIHRoZSBjaGlsZHJlbiAoVHlwZVNjcmlwdCBkb2Vzbid0IGxpa2UgdGhlIGBudWxsYCwgYnV0IHRoYXQncyB3aGF0IHRoZSBvZmZpY2lhbCBSZWFjdCBkb2NzIHNheSlcbiAgICAgICAgICByZXR1cm4gY2xvbmVFbGVtZW50KGVsZW1lbnQsIG51bGwhLCAuLi5jaGlsZHJlbik7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgW1B1bHNlIHJlbmRlcmVyXSBVbmtub3duIHVwZGF0ZSB0eXBlOiAke3VwZGF0ZVtcInR5cGVcIl19YFxuICAgICAgICAgICk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIG5ld1RyZWUgPSBkZXNjZW5kKG5ld1RyZWUsIDAsIFwiXCIpO1xuICB9XG4gIHJldHVybiBuZXdUcmVlO1xufVxuXG4vLyBUaGUgYGNvbXBvbmVudGAgcHJvcCBzaG91bGQgYmUgc29tZXRoaW5nIGxpa2UgYCgpID0+XG4vLyBpbXBvcnQoJ34vcGF0aC90by9jb21wb25lbnQnKSAod2UnbGwgbmVlZCB0byByZW1hcCBpZiB3ZSdyZSBpbXBvcnRpbmcgYSBuYW1lZCBleHBvcnQgYW5kIG5vdCB0aGUgZGVmYXVsdClcbmV4cG9ydCBmdW5jdGlvbiBSZW5kZXJMYXp5KFxuICBjb21wb25lbnQ6ICgpID0+IFByb21pc2U8eyBkZWZhdWx0OiBDb21wb25lbnRUeXBlPGFueT4gfT4sXG4gIGZhbGxiYWNrPzogUmVhY3QuUmVhY3ROb2RlXG4pOiBSZWFjdC5GQzxSZWFjdC5Qcm9wc1dpdGhDaGlsZHJlbjx1bmtub3duPj4ge1xuICBjb25zdCBDb21wb25lbnQgPSBsYXp5KGNvbXBvbmVudCk7XG4gIHJldHVybiAoeyBjaGlsZHJlbiwgLi4ucHJvcHMgfTogUmVhY3QuUHJvcHNXaXRoQ2hpbGRyZW48dW5rbm93bj4pID0+IHtcbiAgICByZXR1cm4gKFxuICAgICAgPFN1c3BlbnNlIGZhbGxiYWNrPXtmYWxsYmFjayA/PyA8PjwvPn0+XG4gICAgICAgIDxDb21wb25lbnQgey4uLnByb3BzfT57Y2hpbGRyZW59PC9Db21wb25lbnQ+XG4gICAgICA8L1N1c3BlbnNlPlxuICAgICk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGFzc2VydElzRWxlbWVudChcbiAgbm9kZTogUmVhY3QuUmVhY3ROb2RlLFxuICBwYXJ0czogc3RyaW5nW10sXG4gIGRlcHRoOiBudW1iZXJcbik6IG5vZGUgaXMgUmVhY3QuUmVhY3RFbGVtZW50IHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiAmJiAhaXNWYWxpZEVsZW1lbnQobm9kZSkpIHtcbiAgICBjb25zb2xlLmVycm9yKFwiSW52YWxpZCBub2RlOlwiLCBub2RlKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIG5vZGUgYXQgcGF0aCBcIiArIHBhcnRzLnNsaWNlKDAsIGRlcHRoKS5qb2luKFwiLlwiKSk7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgQ29tcG9uZW50VHlwZSB9IGZyb20gXCJyZWFjdFwiO1xuXG4vLyBTcGVjaWFsIHByZWZpeGVzIGZvciByZXNlcnZlZCBub2RlIHR5cGVzXG5leHBvcnQgY29uc3QgRlJBR01FTlRfVEFHID0gXCIkJGZyYWdtZW50XCI7XG5leHBvcnQgY29uc3QgTU9VTlRfUE9JTlRfUFJFRklYID0gXCIkJFwiO1xuXG4vLyBleHBvcnQgdHlwZSBMYXp5Q29tcG9uZW50ID0gKCkgPT4gUHJvbWlzZTx7IGRlZmF1bHQ6IENvbXBvbmVudFR5cGU8YW55PiB9PjtcbmV4cG9ydCB0eXBlIFJlZ2lzdHJ5RW50cnkgPSBDb21wb25lbnRUeXBlPGFueT47XG5leHBvcnQgdHlwZSBDb21wb25lbnRSZWdpc3RyeSA9IFJlY29yZDxzdHJpbmcsIENvbXBvbmVudFR5cGU8YW55Pj47XG5cbmV4cG9ydCBpbnRlcmZhY2UgVkRPTUVsZW1lbnQge1xuICB0YWc6IHN0cmluZztcbiAgcHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICBjaGlsZHJlbj86IFZET01Ob2RlW107XG4gIGtleT86IHN0cmluZztcbiAgbGF6eT86IGJvb2xlYW47XG59XG5cbi8vIFByaW1pdGl2ZSBub2RlcyB0aGF0IGNhbiBiZSByZW5kZXJlZFxuZXhwb3J0IHR5cGUgUHJpbWl0aXZlTm9kZSA9IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW47XG5cbi8vIFZET01Ob2RlIGlzIGVpdGhlciBhIHByaW1pdGl2ZSAoc3RyaW5nLCBudW1iZXIsIGJvb2xlYW4pIG9yIGFuIGVsZW1lbnQgbm9kZS5cbi8vIEJvb2xlYW5zIGFyZSB2YWxpZCBjaGlsZHJlbiBpbiBSZWFjdCBidXQgZG8gbm90IHJlbmRlciBhbnl0aGluZy5cbi8vIE1vdW50IHBvaW50cyBhcmUganVzdCBVSUVsZW1lbnROb2RlcyB3aXRoIHRhZ3Mgc3RhcnRpbmcgd2l0aCAkJENvbXBvbmVudEtleVxuZXhwb3J0IHR5cGUgVkRPTU5vZGUgPSBQcmltaXRpdmVOb2RlIHwgVkRPTUVsZW1lbnQ7XG5cbmV4cG9ydCB0eXBlIFZET00gPSBWRE9NTm9kZTtcblxuZXhwb3J0IHR5cGUgVXBkYXRlVHlwZSA9XG4gIHwgXCJpbnNlcnRcIlxuICB8IFwicmVtb3ZlXCJcbiAgfCBcInJlcGxhY2VcIlxuICB8IFwidXBkYXRlX3Byb3BzXCJcbiAgfCBcIm1vdmVcIlxuICB8IFwidXBkYXRlX2NhbGxiYWNrc1wiXG4gIHwgXCJ1cGRhdGVfcmVuZGVyX3Byb3BzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVkRPTVVwZGF0ZUJhc2Uge1xuICB0eXBlOiBVcGRhdGVUeXBlO1xuICBwYXRoOiBzdHJpbmc7IC8vIERvdC1zZXBhcmF0ZWQgcGF0aCB0byB0aGUgbm9kZVxuICBkYXRhPzogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEluc2VydFVwZGF0ZSBleHRlbmRzIFZET01VcGRhdGVCYXNlIHtcbiAgdHlwZTogXCJpbnNlcnRcIjtcbiAgZGF0YTogVkRPTU5vZGU7IC8vIFRoZSBub2RlIHRvIGluc2VydFxuICBpZHg6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZW1vdmVVcGRhdGUgZXh0ZW5kcyBWRE9NVXBkYXRlQmFzZSB7XG4gIHR5cGU6IFwicmVtb3ZlXCI7XG4gIGlkeDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlcGxhY2VVcGRhdGUgZXh0ZW5kcyBWRE9NVXBkYXRlQmFzZSB7XG4gIHR5cGU6IFwicmVwbGFjZVwiO1xuICBkYXRhOiBWRE9NTm9kZTsgLy8gVGhlIG5ldyBub2RlXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlUHJvcHNVcGRhdGUgZXh0ZW5kcyBWRE9NVXBkYXRlQmFzZSB7XG4gIHR5cGU6IFwidXBkYXRlX3Byb3BzXCI7XG4gIGRhdGE6IHtcbiAgICBzZXQ/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIHJlbW92ZT86IHN0cmluZ1tdO1xuICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1vdmVVcGRhdGUgZXh0ZW5kcyBWRE9NVXBkYXRlQmFzZSB7XG4gIHR5cGU6IFwibW92ZVwiO1xuICBkYXRhOiB7XG4gICAgZnJvbV9pbmRleDogbnVtYmVyO1xuICAgIHRvX2luZGV4OiBudW1iZXI7XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlQ2FsbGJhY2tzVXBkYXRlIGV4dGVuZHMgVkRPTVVwZGF0ZUJhc2Uge1xuICB0eXBlOiBcInVwZGF0ZV9jYWxsYmFja3NcIjtcbiAgZGF0YToge1xuICAgIGFkZD86IHN0cmluZ1tdOyAvLyBmdWxsIGNhbGxiYWNrIGtleXMgbGlrZSBcIjAuMS5vbkNsaWNrXCJcbiAgICByZW1vdmU/OiBzdHJpbmdbXTtcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVSZW5kZXJQcm9wc1VwZGF0ZSBleHRlbmRzIFZET01VcGRhdGVCYXNlIHtcbiAgdHlwZTogXCJ1cGRhdGVfcmVuZGVyX3Byb3BzXCI7XG4gIGRhdGE6IHtcbiAgICBhZGQ/OiBzdHJpbmdbXTsgLy8gcmVuZGVyIHByb3Aga2V5cyBsaWtlIFwiMC4xLmxlZnRTZWN0aW9uXCJcbiAgICByZW1vdmU/OiBzdHJpbmdbXTtcbiAgfTtcbn1cblxuZXhwb3J0IHR5cGUgVkRPTVVwZGF0ZSA9XG4gIHwgSW5zZXJ0VXBkYXRlXG4gIHwgUmVtb3ZlVXBkYXRlXG4gIHwgUmVwbGFjZVVwZGF0ZVxuICB8IFVwZGF0ZVByb3BzVXBkYXRlXG4gIHwgTW92ZVVwZGF0ZVxuICB8IFVwZGF0ZUNhbGxiYWNrc1VwZGF0ZVxuICB8IFVwZGF0ZVJlbmRlclByb3BzVXBkYXRlO1xuXG4vLyBVdGlsaXR5IGZ1bmN0aW9ucyBmb3Igd29ya2luZyB3aXRoIHRoZSBVSSB0cmVlIHN0cnVjdHVyZVxuZXhwb3J0IGZ1bmN0aW9uIGlzRWxlbWVudE5vZGUobm9kZTogVkRPTU5vZGUpOiBub2RlIGlzIFZET01FbGVtZW50IHtcbiAgLy8gTWF0Y2hlcyBhbGwgbm9uLXRleHQgbm9kZXNcbiAgcmV0dXJuIHR5cGVvZiBub2RlID09PSBcIm9iamVjdFwiICYmIG5vZGUgIT09IG51bGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc01vdW50UG9pbnROb2RlKG5vZGU6IFZET01Ob2RlKTogbm9kZSBpcyBWRE9NRWxlbWVudCB7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIG5vZGUgPT09IFwib2JqZWN0XCIgJiZcbiAgICBub2RlICE9PSBudWxsICYmXG4gICAgbm9kZS50YWcuc3RhcnRzV2l0aChNT1VOVF9QT0lOVF9QUkVGSVgpICYmXG4gICAgbm9kZS50YWcgIT09IEZSQUdNRU5UX1RBR1xuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNUZXh0Tm9kZShub2RlOiBWRE9NTm9kZSk6IG5vZGUgaXMgc3RyaW5nIHtcbiAgcmV0dXJuIHR5cGVvZiBub2RlID09PSBcInN0cmluZ1wiO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNGcmFnbWVudChub2RlOiBWRE9NTm9kZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIG5vZGUgPT09IFwib2JqZWN0XCIgJiYgbm9kZSAhPT0gbnVsbCAmJiBub2RlLnRhZyA9PT0gRlJBR01FTlRfVEFHO1xufVxuIiwKICAgICJcbnR5cGUgU2ltcGxpZnk8VD4gPSB7IFtLIGluIGtleW9mIFRdOiBUW0tdIH0gJiB7fTtcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUV4dHJhY3RvcjxUIGV4dGVuZHMgb2JqZWN0PigpIHtcbiAgZnVuY3Rpb24gX2NyZWF0ZUV4dHJhY3RvcjxcbiAgICBjb25zdCBLIGV4dGVuZHMgcmVhZG9ubHkgKGtleW9mIFQpW10sXG4gICAgQyBleHRlbmRzIFBhcnRpYWw8UmVjb3JkPEtbbnVtYmVyXSB8IHN0cmluZywgKHNyYzogVCkgPT4gYW55Pj4sXG4gID4oa2V5czogSywgY29tcHV0ZWQ/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/IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGlmIChzZXRzLmhhcyhpZHgpKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBTZXQoKTtcbiAgICAgICAgb2JqZWN0cy5wdXNoKHJlc3VsdCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICByZXN1bHQuYWRkKHJlY29uc3RydWN0KHZhbHVlW2ldKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbGVuZ3RoID0gdmFsdWUubGVuZ3RoO1xuICAgICAgY29uc3QgYXJyID0gbmV3IEFycmF5KGxlbmd0aCk7XG4gICAgICBvYmplY3RzLnB1c2goYXJyKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYXJyW2ldID0gcmVjb25zdHJ1Y3QodmFsdWVbaV0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFycjtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBpZiAobWFwcy5oYXMoaWR4KSkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgTWFwPHN0cmluZywgYW55PigpO1xuICAgICAgICBvYmplY3RzLnB1c2gocmVzdWx0KTtcbiAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHZhbHVlKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3Qga2V5ID0ga2V5c1tpXTtcbiAgICAgICAgICByZXN1bHQuc2V0KGtleSwgcmVjb25zdHJ1Y3QodmFsdWVba2V5XSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgICAgb2JqZWN0cy5wdXNoKHJlc3VsdCk7XG4gICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModmFsdWUpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGtleXNbaV07XG4gICAgICAgIHJlc3VsdFtrZXldID0gcmVjb25zdHJ1Y3QodmFsdWVba2V5XSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgdmFsdWUgaW4gZGVzZXJpYWxpemF0aW9uOiAke3ZhbHVlfWApO1xuICB9XG5cbiAgcmV0dXJuIHJlY29uc3RydWN0KGRhdGEpO1xufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IFJvdXRlSW5mbyB9IGZyb20gXCIuL2hlbHBlcnNcIjtcbmltcG9ydCB0eXBlIHsgVkRPTSwgVkRPTVVwZGF0ZSB9IGZyb20gXCIuL3Zkb21cIjtcbmltcG9ydCB7IGV4dHJhY3RFdmVudCB9IGZyb20gXCIuL3NlcmlhbGl6ZS9ldmVudHNcIjtcbmltcG9ydCB7IHNlcmlhbGl6ZSwgZGVzZXJpYWxpemUgfSBmcm9tIFwiLi9zZXJpYWxpemUvdjNcIjtcblxuaW1wb3J0IHsgaW8sIFNvY2tldCB9IGZyb20gXCJzb2NrZXQuaW8tY2xpZW50XCI7XG5pbXBvcnQgdHlwZSB7XG4gIENsaWVudEFwaVJlc3VsdE1lc3NhZ2UsXG4gIENsaWVudENoYW5uZWxNZXNzYWdlLFxuICBDbGllbnRNZXNzYWdlLFxuICBTZXJ2ZXJBcGlDYWxsTWVzc2FnZSxcbiAgU2VydmVyQ2hhbm5lbE1lc3NhZ2UsXG4gIFNlcnZlckVycm9ySW5mbyxcbiAgU2VydmVyTWVzc2FnZSxcbn0gZnJvbSBcIi4vbWVzc2FnZXNcIjtcbmltcG9ydCB0eXBlIHsgTmF2aWdhdGVGdW5jdGlvbiB9IGZyb20gXCJyZWFjdC1yb3V0ZXJcIjtcbmltcG9ydCB0eXBlIHsgQ2hhbm5lbEJyaWRnZSB9IGZyb20gXCIuL2NoYW5uZWxcIjtcbmltcG9ydCB7IGNyZWF0ZUNoYW5uZWxCcmlkZ2UsIFB1bHNlQ2hhbm5lbFJlc2V0RXJyb3IgfSBmcm9tIFwiLi9jaGFubmVsXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW91bnRlZFZpZXcge1xuICByb3V0ZUluZm86IFJvdXRlSW5mbztcbiAgb25Jbml0OiAodmRvbTogVkRPTSwgY2FsbGJhY2tzOiBzdHJpbmdbXSwgcmVuZGVyUHJvcHM6IHN0cmluZ1tdKSA9PiB2b2lkO1xuICBvblVwZGF0ZTogKG9wczogVkRPTVVwZGF0ZVtdKSA9PiB2b2lkO1xufVxuZXhwb3J0IHR5cGUgQ29ubmVjdGlvblN0YXR1c0xpc3RlbmVyID0gKGNvbm5lY3RlZDogYm9vbGVhbikgPT4gdm9pZDtcbmV4cG9ydCB0eXBlIFNlcnZlckVycm9yTGlzdGVuZXIgPSAoXG4gIHBhdGg6IHN0cmluZyxcbiAgZXJyb3I6IFNlcnZlckVycm9ySW5mbyB8IG51bGxcbikgPT4gdm9pZDtcblxuZXhwb3J0IGludGVyZmFjZSBQdWxzZUNsaWVudCB7XG4gIC8vIENvbm5lY3Rpb24gbWFuYWdlbWVudFxuICBjb25uZWN0KCk6IFByb21pc2U8dm9pZD47XG4gIGRpc2Nvbm5lY3QoKTogdm9pZDtcbiAgaXNDb25uZWN0ZWQoKTogYm9vbGVhbjtcbiAgb25Db25uZWN0aW9uQ2hhbmdlKGxpc3RlbmVyOiBDb25uZWN0aW9uU3RhdHVzTGlzdGVuZXIpOiAoKSA9PiB2b2lkO1xuICAvLyBNZXNzYWdlc1xuICBuYXZpZ2F0ZShwYXRoOiBzdHJpbmcsIHJvdXRlSW5mbzogUm91dGVJbmZvKTogUHJvbWlzZTx2b2lkPjtcbiAgbGVhdmUocGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcbiAgaW52b2tlQ2FsbGJhY2socGF0aDogc3RyaW5nLCBjYWxsYmFjazogc3RyaW5nLCBhcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD47XG4gIC8vIFZET00gc3Vic2NyaXB0aW9uXG4gIG1vdW50VmlldyhwYXRoOiBzdHJpbmcsIHZpZXc6IE1vdW50ZWRWaWV3KTogKCkgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGNsYXNzIFB1bHNlU29ja2V0SU9DbGllbnQge1xuICBwcml2YXRlIGFjdGl2ZVZpZXdzOiBNYXA8c3RyaW5nLCBNb3VudGVkVmlldz47XG4gIHByaXZhdGUgc29ja2V0OiBTb2NrZXQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBtZXNzYWdlUXVldWU6IENsaWVudE1lc3NhZ2VbXTtcbiAgcHJpdmF0ZSBjb25uZWN0aW9uTGlzdGVuZXJzOiBTZXQ8Q29ubmVjdGlvblN0YXR1c0xpc3RlbmVyPiA9IG5ldyBTZXQoKTtcbiAgcHJpdmF0ZSBzZXJ2ZXJFcnJvcnM6IE1hcDxzdHJpbmcsIFNlcnZlckVycm9ySW5mbz4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgc2VydmVyRXJyb3JMaXN0ZW5lcnM6IFNldDxTZXJ2ZXJFcnJvckxpc3RlbmVyPiA9IG5ldyBTZXQoKTtcbiAgcHJpdmF0ZSBjaGFubmVsczogTWFwPHN0cmluZywgeyBicmlkZ2U6IENoYW5uZWxCcmlkZ2U7IHJlZkNvdW50OiBudW1iZXIgfT4gPVxuICAgIG5ldyBNYXAoKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHVybDogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVuZGVySWQ6IHN0cmluZyxcbiAgICBwcml2YXRlIGZyYW1ld29ya05hdmlnYXRlOiBOYXZpZ2F0ZUZ1bmN0aW9uXG4gICkge1xuICAgIHRoaXMuc29ja2V0ID0gbnVsbDtcbiAgICB0aGlzLmFjdGl2ZVZpZXdzID0gbmV3IE1hcCgpO1xuICAgIHRoaXMubWVzc2FnZVF1ZXVlID0gW107XG4gIH1cbiAgcHVibGljIGlzQ29ubmVjdGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNvY2tldD8uY29ubmVjdGVkID8/IGZhbHNlO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGNvbm5lY3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuc29ja2V0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBzb2NrZXQgPSBpbyh0aGlzLnVybCwge1xuICAgICAgICB0cmFuc3BvcnRzOiBbXCJ3ZWJzb2NrZXRcIiwgXCJ3ZWJ0cmFuc3BvcnRcIl0sXG4gICAgICAgIGF1dGg6IHsgcmVuZGVySWQ6IHRoaXMucmVuZGVySWQgfSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5zb2NrZXQgPSBzb2NrZXQ7XG5cbiAgICAgIHNvY2tldC5vbihcImNvbm5lY3RcIiwgKCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhcIltTb2NrZXRJT1RyYW5zcG9ydF0gQ29ubmVjdGVkOlwiLCB0aGlzLnNvY2tldD8uaWQpO1xuICAgICAgICAvLyBNYWtlIHN1cmUgdG8gc2VuZCBhIG5hdmlnYXRlIHBheWxvYWQgZm9yIGFsbCB0aGUgcm91dGVzXG4gICAgICAgIGZvciAoY29uc3QgW3BhdGgsIHJvdXRlXSBvZiB0aGlzLmFjdGl2ZVZpZXdzKSB7XG4gICAgICAgICAgc29ja2V0LmVtaXQoXG4gICAgICAgICAgICBcIm1lc3NhZ2VcIixcbiAgICAgICAgICAgIHNlcmlhbGl6ZSh7XG4gICAgICAgICAgICAgIHR5cGU6IFwibW91bnRcIixcbiAgICAgICAgICAgICAgcGF0aDogcGF0aCxcbiAgICAgICAgICAgICAgcm91dGVJbmZvOiByb3V0ZS5yb3V0ZUluZm8sXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IHBheWxvYWQgb2YgdGhpcy5tZXNzYWdlUXVldWUpIHtcbiAgICAgICAgICAvLyBBbHJlYWR5IHNlbnQgYWJvdmVcbiAgICAgICAgICBpZiAocGF5bG9hZC50eXBlID09PSBcIm1vdW50XCIgJiYgdGhpcy5hY3RpdmVWaWV3cy5oYXMocGF5bG9hZC5wYXRoKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFdlJ3JlIHJlbW91bnRpbmcgYWxsIHRoZSByb3V0ZXMsIHNvIG5vIG5lZWQgdG8gbmF2aWdhdGVcbiAgICAgICAgICBpZiAocGF5bG9hZC50eXBlID09PSBcIm5hdmlnYXRlXCIpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzb2NrZXQuZW1pdChcIm1lc3NhZ2VcIiwgc2VyaWFsaXplKHBheWxvYWQpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1lc3NhZ2VRdWV1ZSA9IFtdO1xuXG4gICAgICAgIHRoaXMubm90aWZ5Q29ubmVjdGlvbkxpc3RlbmVycyh0cnVlKTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSk7XG5cbiAgICAgIHNvY2tldC5vbihcImNvbm5lY3RfZXJyb3JcIiwgKGVycikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiW1NvY2tldElPVHJhbnNwb3J0XSBDb25uZWN0aW9uIGZhaWxlZDpcIiwgZXJyKTtcbiAgICAgICAgdGhpcy5ub3RpZnlDb25uZWN0aW9uTGlzdGVuZXJzKGZhbHNlKTtcbiAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICB9KTtcblxuICAgICAgc29ja2V0Lm9uKFwiZGlzY29ubmVjdFwiLCAoKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiW1NvY2tldElPVHJhbnNwb3J0XSBEaXNjb25uZWN0ZWRcIik7XG4gICAgICAgIHRoaXMuaGFuZGxlVHJhbnNwb3J0RGlzY29ubmVjdCgpO1xuICAgICAgICB0aGlzLm5vdGlmeUNvbm5lY3Rpb25MaXN0ZW5lcnMoZmFsc2UpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFdyYXAgaW4gYW4gYXJyb3cgZnVuY3Rpb24gdG8gYXZvaWQgbG9zaW5nIHRoZSBgdGhpc2AgcmVmZXJlbmNlXG4gICAgICBzb2NrZXQub24oXCJtZXNzYWdlXCIsIChkYXRhKSA9PlxuICAgICAgICB0aGlzLmhhbmRsZVNlcnZlck1lc3NhZ2UoXG4gICAgICAgICAgZGVzZXJpYWxpemUoZGF0YSwgeyBjb2VyY2VOdWxsc1RvVW5kZWZpbmVkOiB0cnVlIH0pXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBvbkNvbm5lY3Rpb25DaGFuZ2UobGlzdGVuZXI6IENvbm5lY3Rpb25TdGF0dXNMaXN0ZW5lcik6ICgpID0+IHZvaWQge1xuICAgIHRoaXMuY29ubmVjdGlvbkxpc3RlbmVycy5hZGQobGlzdGVuZXIpO1xuICAgIGxpc3RlbmVyKHRoaXMuaXNDb25uZWN0ZWQoKSk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHRoaXMuY29ubmVjdGlvbkxpc3RlbmVycy5kZWxldGUobGlzdGVuZXIpO1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIG5vdGlmeUNvbm5lY3Rpb25MaXN0ZW5lcnMoY29ubmVjdGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lcnMpIHtcbiAgICAgIGxpc3RlbmVyKGNvbm5lY3RlZCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uU2VydmVyRXJyb3IobGlzdGVuZXI6IFNlcnZlckVycm9yTGlzdGVuZXIpOiAoKSA9PiB2b2lkIHtcbiAgICB0aGlzLnNlcnZlckVycm9yTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7XG4gICAgLy8gRW1pdCBjdXJyZW50IGVycm9ycyB0byBuZXcgbGlzdGVuZXJcbiAgICBmb3IgKGNvbnN0IFtwYXRoLCBlcnJdIG9mIHRoaXMuc2VydmVyRXJyb3JzKSBsaXN0ZW5lcihwYXRoLCBlcnIpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICB0aGlzLnNlcnZlckVycm9yTGlzdGVuZXJzLmRlbGV0ZShsaXN0ZW5lcik7XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgbm90aWZ5U2VydmVyRXJyb3IocGF0aDogc3RyaW5nLCBlcnJvcjogU2VydmVyRXJyb3JJbmZvIHwgbnVsbCkge1xuICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy5zZXJ2ZXJFcnJvckxpc3RlbmVycykgbGlzdGVuZXIocGF0aCwgZXJyb3IpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZW5kTWVzc2FnZShwYXlsb2FkOiBDbGllbnRNZXNzYWdlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaXNDb25uZWN0ZWQoKSkge1xuICAgICAgLy8gY29uc29sZS5sb2coXCJbU29ja2V0SU9UcmFuc3BvcnRdIFNlbmRpbmc6XCIsIHBheWxvYWQpO1xuICAgICAgdGhpcy5zb2NrZXQhLmVtaXQoXCJtZXNzYWdlXCIsIHNlcmlhbGl6ZShwYXlsb2FkIGFzIGFueSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBjb25zb2xlLmxvZyhcIltTb2NrZXRJT1RyYW5zcG9ydF0gUXVldWluZyBtZXNzYWdlOlwiLCBwYXlsb2FkKTtcbiAgICAgIHRoaXMubWVzc2FnZVF1ZXVlLnB1c2gocGF5bG9hZCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFzeW5jIHNlbmRDaGFubmVsTWVzc2FnZShcbiAgICBtZXNzYWdlOiBDbGllbnRDaGFubmVsTWVzc2FnZVxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnNlbmRNZXNzYWdlKG1lc3NhZ2UpO1xuICB9XG5cbiAgcHVibGljIG1vdW50VmlldyhwYXRoOiBzdHJpbmcsIHZpZXc6IE1vdW50ZWRWaWV3KSB7XG4gICAgaWYgKHRoaXMuYWN0aXZlVmlld3MuaGFzKHBhdGgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFBhdGggJHtwYXRofSBpcyBhbHJlYWR5IG1vdW50ZWRgKTtcbiAgICB9XG4gICAgdGhpcy5hY3RpdmVWaWV3cy5zZXQocGF0aCwgdmlldyk7XG4gICAgdm9pZCB0aGlzLnNlbmRNZXNzYWdlKHtcbiAgICAgIHR5cGU6IFwibW91bnRcIixcbiAgICAgIHBhdGgsXG4gICAgICByb3V0ZUluZm86IHZpZXcucm91dGVJbmZvLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIG5hdmlnYXRlKHBhdGg6IHN0cmluZywgcm91dGVJbmZvOiBSb3V0ZUluZm8pIHtcbiAgICBhd2FpdCB0aGlzLnNlbmRNZXNzYWdlKHtcbiAgICAgIHR5cGU6IFwibmF2aWdhdGVcIixcbiAgICAgIHBhdGgsXG4gICAgICByb3V0ZUluZm8sXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgdW5tb3VudChwYXRoOiBzdHJpbmcpIHtcbiAgICB2b2lkIHRoaXMuc2VuZE1lc3NhZ2UoeyB0eXBlOiBcInVubW91bnRcIiwgcGF0aCB9KTtcbiAgICB0aGlzLmFjdGl2ZVZpZXdzLmRlbGV0ZShwYXRoKTtcbiAgfVxuXG4gIHB1YmxpYyBkaXNjb25uZWN0KCkge1xuICAgIHRoaXMuc29ja2V0Py5kaXNjb25uZWN0KCk7XG4gICAgdGhpcy5zb2NrZXQgPSBudWxsO1xuICAgIHRoaXMubWVzc2FnZVF1ZXVlID0gW107XG4gICAgdGhpcy5jb25uZWN0aW9uTGlzdGVuZXJzLmNsZWFyKCk7XG4gICAgdGhpcy5hY3RpdmVWaWV3cy5jbGVhcigpO1xuICAgIHRoaXMuc2VydmVyRXJyb3JzLmNsZWFyKCk7XG4gICAgdGhpcy5zZXJ2ZXJFcnJvckxpc3RlbmVycy5jbGVhcigpO1xuICAgIGZvciAoY29uc3QgeyBicmlkZ2UgfSBvZiB0aGlzLmNoYW5uZWxzLnZhbHVlcygpKSB7XG4gICAgICBicmlkZ2UuZGlzcG9zZShuZXcgUHVsc2VDaGFubmVsUmVzZXRFcnJvcihcIkNsaWVudCBkaXNjb25uZWN0ZWRcIikpO1xuICAgIH1cbiAgICB0aGlzLmNoYW5uZWxzLmNsZWFyKCk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVNlcnZlck1lc3NhZ2UobWVzc2FnZTogU2VydmVyTWVzc2FnZSkge1xuICAgIC8vIGNvbnNvbGUubG9nKFwiW1B1bHNlQ2xpZW50XSBSZWNlaXZlZCBtZXNzYWdlOlwiLCBtZXNzYWdlKTtcbiAgICBzd2l0Y2ggKG1lc3NhZ2UudHlwZSkge1xuICAgICAgY2FzZSBcInZkb21faW5pdFwiOiB7XG4gICAgICAgIGNvbnN0IHJvdXRlID0gdGhpcy5hY3RpdmVWaWV3cy5nZXQobWVzc2FnZS5wYXRoKTtcbiAgICAgICAgLy8gSWdub3JlIG1lc3NhZ2VzIGZvciBwYXRocyB0aGF0IGFyZSBub3QgbW91bnRlZFxuICAgICAgICBpZiAoIXJvdXRlKSByZXR1cm47XG4gICAgICAgIGlmIChyb3V0ZSkge1xuICAgICAgICAgIHJvdXRlLm9uSW5pdChtZXNzYWdlLnZkb20sIG1lc3NhZ2UuY2FsbGJhY2tzLCBtZXNzYWdlLnJlbmRlcl9wcm9wcyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2xlYXIgYW55IHByaW9yIGVycm9yIGZvciB0aGlzIHBhdGggb24gc3VjY2Vzc2Z1bCBpbml0XG4gICAgICAgIGlmICh0aGlzLnNlcnZlckVycm9ycy5oYXMobWVzc2FnZS5wYXRoKSkge1xuICAgICAgICAgIHRoaXMuc2VydmVyRXJyb3JzLmRlbGV0ZShtZXNzYWdlLnBhdGgpO1xuICAgICAgICAgIHRoaXMubm90aWZ5U2VydmVyRXJyb3IobWVzc2FnZS5wYXRoLCBudWxsKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJ2ZG9tX3VwZGF0ZVwiOiB7XG4gICAgICAgIGNvbnN0IHJvdXRlID0gdGhpcy5hY3RpdmVWaWV3cy5nZXQobWVzc2FnZS5wYXRoKTtcbiAgICAgICAgaWYgKCFyb3V0ZSkgcmV0dXJuOyAvLyBOb3QgYW4gYWN0aXZlIHBhdGg7IGRpc2NhcmRcbiAgICAgICAgcm91dGUub25VcGRhdGUobWVzc2FnZS5vcHMpO1xuICAgICAgICAvLyBDbGVhciBhbnkgcHJpb3IgZXJyb3IgZm9yIHRoaXMgcGF0aCBvbiBzdWNjZXNzZnVsIHVwZGF0ZVxuICAgICAgICBpZiAodGhpcy5zZXJ2ZXJFcnJvcnMuaGFzKG1lc3NhZ2UucGF0aCkpIHtcbiAgICAgICAgICB0aGlzLnNlcnZlckVycm9ycy5kZWxldGUobWVzc2FnZS5wYXRoKTtcbiAgICAgICAgICB0aGlzLm5vdGlmeVNlcnZlckVycm9yKG1lc3NhZ2UucGF0aCwgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFwic2VydmVyX2Vycm9yXCI6IHtcbiAgICAgICAgaWYgKCF0aGlzLmFjdGl2ZVZpZXdzLmhhcyhtZXNzYWdlLnBhdGgpKSByZXR1cm47IC8vIGRpc2NhcmQgZm9yIGluYWN0aXZlIHBhdGhzXG4gICAgICAgIHRoaXMuc2VydmVyRXJyb3JzLnNldChtZXNzYWdlLnBhdGgsIG1lc3NhZ2UuZXJyb3IpO1xuICAgICAgICB0aGlzLm5vdGlmeVNlcnZlckVycm9yKG1lc3NhZ2UucGF0aCwgbWVzc2FnZS5lcnJvcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBcImFwaV9jYWxsXCI6IHtcbiAgICAgICAgdm9pZCB0aGlzLnBlcmZvcm1BcGlDYWxsKG1lc3NhZ2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJuYXZpZ2F0ZV90b1wiOiB7XG4gICAgICAgIC8vIGBuYXZpZ2F0ZV90b2AgaXMgbmF2aWdhdGlvbmFsOyBhbGxvdyByZWdhcmRsZXNzIG9mIGFjdGl2ZVZpZXdzIG1lbWJlcnNoaXBcbiAgICAgICAgY29uc3QgcmVwbGFjZSA9ICEhbWVzc2FnZS5yZXBsYWNlO1xuICAgICAgICBsZXQgZGVzdCA9IG1lc3NhZ2UucGF0aCB8fCBcIlwiO1xuICAgICAgICAvLyBOb3JtYWxpemUgcHJvdG9jb2wtcmVsYXRpdmUgVVJMcyB0byBhYnNvbHV0ZVxuICAgICAgICBpZiAoZGVzdC5zdGFydHNXaXRoKFwiLy9cIikpIGRlc3QgPSBgJHt3aW5kb3cubG9jYXRpb24ucHJvdG9jb2x9JHtkZXN0fWA7XG4gICAgICAgIGNvbnN0IGhhc1NjaGVtZSA9IC9eW2EtekEtWl1bYS16QS1aMC05Ky4tXSo6Ly50ZXN0KGRlc3QpO1xuICAgICAgICBpZiAoaGFzU2NoZW1lKSB7XG4gICAgICAgICAgaWYgKGRlc3Quc3RhcnRzV2l0aChcImh0dHA6Ly9cIikgfHwgZGVzdC5zdGFydHNXaXRoKFwiaHR0cHM6Ly9cIikpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoZGVzdCk7XG4gICAgICAgICAgICAgIGlmICh1cmwub3JpZ2luID09PSB3aW5kb3cubG9jYXRpb24ub3JpZ2luKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW50ZXJuYWwgPSBgJHt1cmwucGF0aG5hbWV9JHt1cmwuc2VhcmNofSR7dXJsLmhhc2h9YDtcbiAgICAgICAgICAgICAgICB0aGlzLmZyYW1ld29ya05hdmlnYXRlKGludGVybmFsLCB7IHJlcGxhY2UgfSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlcGxhY2UpIHdpbmRvdy5sb2NhdGlvbi5yZXBsYWNlKGRlc3QpO1xuICAgICAgICAgICAgICAgIGVsc2Ugd2luZG93LmxvY2F0aW9uLmFzc2lnbihkZXN0KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgIGlmIChyZXBsYWNlKSB3aW5kb3cubG9jYXRpb24ucmVwbGFjZShkZXN0KTtcbiAgICAgICAgICAgICAgZWxzZSB3aW5kb3cubG9jYXRpb24uYXNzaWduKGRlc3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBtYWlsdG86LCB0ZWw6LCBkYXRhOiwgZXRjLlxuICAgICAgICAgICAgaWYgKHJlcGxhY2UpIHdpbmRvdy5sb2NhdGlvbi5yZXBsYWNlKGRlc3QpO1xuICAgICAgICAgICAgZWxzZSB3aW5kb3cubG9jYXRpb24uYXNzaWduKGRlc3QpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBSZWxhdGl2ZSBvciByb290LXJlbGF0aXZlIHBhdGgg4oaSIFNQQSBuYXZpZ2F0ZVxuICAgICAgICAgIHRoaXMuZnJhbWV3b3JrTmF2aWdhdGUoZGVzdCwgeyByZXBsYWNlIH0pO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBcImNoYW5uZWxfbWVzc2FnZVwiOiB7XG4gICAgICAgIHRoaXMucm91dGVDaGFubmVsTWVzc2FnZShtZXNzYWdlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJVbmV4cGVjdGVkIG1lc3NhZ2U6XCIsIG1lc3NhZ2UpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcGVyZm9ybUFwaUNhbGwobXNnOiBTZXJ2ZXJBcGlDYWxsTWVzc2FnZSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChtc2cudXJsLCB7XG4gICAgICAgIG1ldGhvZDogbXNnLm1ldGhvZCB8fCBcIkdFVFwiLFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgLi4uKG1zZy5oZWFkZXJzIHx8IHt9KSxcbiAgICAgICAgICAuLi4obXNnLmJvZHkgIT0gbnVsbCAmJiAhKFwiY29udGVudC10eXBlXCIgaW4gKG1zZy5oZWFkZXJzIHx8IHt9KSlcbiAgICAgICAgICAgID8geyBcImNvbnRlbnQtdHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIiB9XG4gICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgfSxcbiAgICAgICAgYm9keTpcbiAgICAgICAgICBtc2cuYm9keSAhPSBudWxsXG4gICAgICAgICAgICA/IHR5cGVvZiBtc2cuYm9keSA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgICAgICA/IG1zZy5ib2R5XG4gICAgICAgICAgICAgIDogSlNPTi5zdHJpbmdpZnkobXNnLmJvZHkpXG4gICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgY3JlZGVudGlhbHM6IG1zZy5jcmVkZW50aWFscyB8fCBcImluY2x1ZGVcIixcbiAgICAgIH0pO1xuICAgICAgY29uc3QgaGVhZGVyc09iajogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgICAgcmVzLmhlYWRlcnMuZm9yRWFjaCgodiwgaykgPT4gKGhlYWRlcnNPYmpba10gPSB2KSk7XG4gICAgICBsZXQgYm9keTogYW55ID0gbnVsbDtcbiAgICAgIGNvbnN0IGN0ID0gcmVzLmhlYWRlcnMuZ2V0KFwiY29udGVudC10eXBlXCIpIHx8IFwiXCI7XG4gICAgICBpZiAoY3QuaW5jbHVkZXMoXCJhcHBsaWNhdGlvbi9qc29uXCIpKSB7XG4gICAgICAgIGJvZHkgPSBhd2FpdCByZXMuanNvbigpLmNhdGNoKCgpID0+IG51bGwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYm9keSA9IGF3YWl0IHJlcy50ZXh0KCkuY2F0Y2goKCkgPT4gbnVsbCk7XG4gICAgICB9XG4gICAgICBjb25zdCByZXBseTogQ2xpZW50QXBpUmVzdWx0TWVzc2FnZSA9IHtcbiAgICAgICAgdHlwZTogXCJhcGlfcmVzdWx0XCIsXG4gICAgICAgIGlkOiBtc2cuaWQsXG4gICAgICAgIG9rOiByZXMub2ssXG4gICAgICAgIHN0YXR1czogcmVzLnN0YXR1cyxcbiAgICAgICAgaGVhZGVyczogaGVhZGVyc09iaixcbiAgICAgICAgYm9keSxcbiAgICAgIH07XG4gICAgICBhd2FpdCB0aGlzLnNlbmRNZXNzYWdlKHJlcGx5KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnN0IHJlcGx5OiBDbGllbnRBcGlSZXN1bHRNZXNzYWdlID0ge1xuICAgICAgICB0eXBlOiBcImFwaV9yZXN1bHRcIixcbiAgICAgICAgaWQ6IG1zZy5pZCxcbiAgICAgICAgb2s6IGZhbHNlLFxuICAgICAgICBzdGF0dXM6IDAsXG4gICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgICBib2R5OiB7IGVycm9yOiBTdHJpbmcoZXJyKSB9LFxuICAgICAgfTtcbiAgICAgIGF3YWl0IHRoaXMuc2VuZE1lc3NhZ2UocmVwbHkpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBpbnZva2VDYWxsYmFjayhwYXRoOiBzdHJpbmcsIGNhbGxiYWNrOiBzdHJpbmcsIGFyZ3M6IGFueVtdKSB7XG4gICAgYXdhaXQgdGhpcy5zZW5kTWVzc2FnZSh7XG4gICAgICB0eXBlOiBcImNhbGxiYWNrXCIsXG4gICAgICBwYXRoLFxuICAgICAgY2FsbGJhY2ssXG4gICAgICBhcmdzOiBhcmdzLm1hcChleHRyYWN0RXZlbnQpLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFjcXVpcmVDaGFubmVsKGlkOiBzdHJpbmcpOiBDaGFubmVsQnJpZGdlIHtcbiAgICBjb25zdCBlbnRyeSA9IHRoaXMuZW5zdXJlQ2hhbm5lbEVudHJ5KGlkKTtcbiAgICBlbnRyeS5yZWZDb3VudCArPSAxO1xuICAgIHJldHVybiBlbnRyeS5icmlkZ2U7XG4gIH1cblxuICBwdWJsaWMgcmVsZWFzZUNoYW5uZWwoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5jaGFubmVscy5nZXQoaWQpO1xuICAgIGlmICghZW50cnkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZW50cnkucmVmQ291bnQgPSBNYXRoLm1heCgwLCBlbnRyeS5yZWZDb3VudCAtIDEpO1xuICAgIGlmIChlbnRyeS5yZWZDb3VudCA9PT0gMCkge1xuICAgICAgZW50cnkuYnJpZGdlLmRpc3Bvc2UobmV3IFB1bHNlQ2hhbm5lbFJlc2V0RXJyb3IoXCJDaGFubmVsIHJlbGVhc2VkXCIpKTtcbiAgICAgIHRoaXMuY2hhbm5lbHMuZGVsZXRlKGlkKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGVuc3VyZUNoYW5uZWxFbnRyeShpZDogc3RyaW5nKToge1xuICAgIGJyaWRnZTogQ2hhbm5lbEJyaWRnZTtcbiAgICByZWZDb3VudDogbnVtYmVyO1xuICB9IHtcbiAgICBsZXQgZW50cnkgPSB0aGlzLmNoYW5uZWxzLmdldChpZCk7XG4gICAgaWYgKCFlbnRyeSkge1xuICAgICAgZW50cnkgPSB7XG4gICAgICAgIGJyaWRnZTogY3JlYXRlQ2hhbm5lbEJyaWRnZSh0aGlzLCBpZCksXG4gICAgICAgIHJlZkNvdW50OiAwLFxuICAgICAgfTtcbiAgICAgIHRoaXMuY2hhbm5lbHMuc2V0KGlkLCBlbnRyeSk7XG4gICAgfVxuICAgIHJldHVybiBlbnRyeTtcbiAgfVxuXG4gIHByaXZhdGUgcm91dGVDaGFubmVsTWVzc2FnZShtZXNzYWdlOiBTZXJ2ZXJDaGFubmVsTWVzc2FnZSk6IHZvaWQge1xuICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5lbnN1cmVDaGFubmVsRW50cnkobWVzc2FnZS5jaGFubmVsKTtcbiAgICBjb25zdCBjbG9zZWQgPSBlbnRyeS5icmlkZ2UuaGFuZGxlU2VydmVyTWVzc2FnZShtZXNzYWdlKTtcbiAgICBpZiAoY2xvc2VkICYmIGVudHJ5LnJlZkNvdW50ID09PSAwKSB7XG4gICAgICB0aGlzLmNoYW5uZWxzLmRlbGV0ZShtZXNzYWdlLmNoYW5uZWwpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlVHJhbnNwb3J0RGlzY29ubmVjdCgpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHRoaXMuY2hhbm5lbHMudmFsdWVzKCkpIHtcbiAgICAgIGVudHJ5LmJyaWRnZS5oYW5kbGVEaXNjb25uZWN0KFxuICAgICAgICBuZXcgUHVsc2VDaGFubmVsUmVzZXRFcnJvcihcIkNvbm5lY3Rpb24gbG9zdFwiKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvLyBwdWJsaWMgZ2V0VkRPTShwYXRoOiBzdHJpbmcpOiBWRE9NIHwgbnVsbCB7XG4gIC8vICAgcmV0dXJuIHRoaXMuYWN0aXZlVmlld3MuZ2V0KHBhdGgpPy52ZG9tID8/IG51bGw7XG4gIC8vIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUge1xuICBTZXJ2ZXJDaGFubmVsTWVzc2FnZSxcbiAgU2VydmVyQ2hhbm5lbFJlcXVlc3RNZXNzYWdlLFxuICBTZXJ2ZXJDaGFubmVsUmVzcG9uc2VNZXNzYWdlLFxufSBmcm9tIFwiLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHR5cGUgeyBQdWxzZVNvY2tldElPQ2xpZW50IH0gZnJvbSBcIi4vY2xpZW50XCI7XG5cbmV4cG9ydCBjbGFzcyBQdWxzZUNoYW5uZWxSZXNldEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSBcIlB1bHNlQ2hhbm5lbFJlc2V0RXJyb3JcIjtcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBDaGFubmVsRXZlbnRIYW5kbGVyID0gKHBheWxvYWQ6IGFueSkgPT4gYW55IHwgUHJvbWlzZTxhbnk+O1xuXG5pbnRlcmZhY2UgUGVuZGluZ1JlcXVlc3Qge1xuICByZXNvbHZlOiAodmFsdWU6IGFueSkgPT4gdm9pZDtcbiAgcmVqZWN0OiAoZXJyb3I6IGFueSkgPT4gdm9pZDtcbn1cblxuZnVuY3Rpb24gcmFuZG9tSWQoKTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiBjcnlwdG8gIT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIGNyeXB0by5yYW5kb21VVUlEID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gY3J5cHRvLnJhbmRvbVVVSUQoKS5yZXBsYWNlKC8tL2csIFwiXCIpO1xuICB9XG4gIHJldHVybiBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDE2KS5zbGljZSgyKSArIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMTYpLnNsaWNlKDIpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRFcnJvcihlcnJvcjogdW5rbm93bik6IHN0cmluZyB7XG4gIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSByZXR1cm4gZXJyb3IubWVzc2FnZTtcbiAgaWYgKHR5cGVvZiBlcnJvciA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGVycm9yO1xuICB0cnkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShlcnJvcik7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBTdHJpbmcoZXJyb3IpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzU2VydmVyUmVzcG9uc2VNZXNzYWdlKFxuICBtZXNzYWdlOiBTZXJ2ZXJDaGFubmVsTWVzc2FnZVxuKTogbWVzc2FnZSBpcyBTZXJ2ZXJDaGFubmVsUmVzcG9uc2VNZXNzYWdlIHtcbiAgcmV0dXJuIHR5cGVvZiAobWVzc2FnZSBhcyBTZXJ2ZXJDaGFubmVsUmVzcG9uc2VNZXNzYWdlKS5yZXNwb25zZVRvID09PSBcInN0cmluZ1wiO1xufVxuXG5mdW5jdGlvbiBpc1NlcnZlclJlcXVlc3RNZXNzYWdlKFxuICBtZXNzYWdlOiBTZXJ2ZXJDaGFubmVsTWVzc2FnZVxuKTogbWVzc2FnZSBpcyBTZXJ2ZXJDaGFubmVsUmVxdWVzdE1lc3NhZ2Uge1xuICByZXR1cm4gdHlwZW9mIChtZXNzYWdlIGFzIFNlcnZlckNoYW5uZWxSZXF1ZXN0TWVzc2FnZSkuZXZlbnQgPT09IFwic3RyaW5nXCI7XG59XG5cbmV4cG9ydCBjbGFzcyBDaGFubmVsQnJpZGdlIHtcbiAgcHJpdmF0ZSBoYW5kbGVycyA9IG5ldyBNYXA8c3RyaW5nLCBTZXQ8Q2hhbm5lbEV2ZW50SGFuZGxlcj4+KCk7XG4gIHByaXZhdGUgcGVuZGluZyA9IG5ldyBNYXA8c3RyaW5nLCBQZW5kaW5nUmVxdWVzdD4oKTtcbiAgcHJpdmF0ZSBiYWNrbG9nOiBTZXJ2ZXJDaGFubmVsUmVxdWVzdE1lc3NhZ2VbXSA9IFtdO1xuICBwcml2YXRlIGNsb3NlZCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2xpZW50OiBQdWxzZVNvY2tldElPQ2xpZW50LCBwdWJsaWMgcmVhZG9ubHkgaWQ6IHN0cmluZykge31cblxuICBlbWl0KGV2ZW50OiBzdHJpbmcsIHBheWxvYWQ/OiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLmVuc3VyZU9wZW4oKTtcbiAgICB2b2lkIHRoaXMuY2xpZW50LnNlbmRDaGFubmVsTWVzc2FnZSh7XG4gICAgICB0eXBlOiBcImNoYW5uZWxfbWVzc2FnZVwiLFxuICAgICAgY2hhbm5lbDogdGhpcy5pZCxcbiAgICAgIGV2ZW50LFxuICAgICAgcGF5bG9hZCxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHJlcXVlc3QoZXZlbnQ6IHN0cmluZywgcGF5bG9hZD86IGFueSk6IFByb21pc2U8YW55PiB7XG4gICAgdGhpcy5lbnN1cmVPcGVuKCk7XG4gICAgY29uc3QgcmVxdWVzdElkID0gcmFuZG9tSWQoKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5wZW5kaW5nLnNldChyZXF1ZXN0SWQsIHsgcmVzb2x2ZSwgcmVqZWN0IH0pO1xuICAgICAgdm9pZCB0aGlzLmNsaWVudFxuICAgICAgICAuc2VuZENoYW5uZWxNZXNzYWdlKHtcbiAgICAgICAgICB0eXBlOiBcImNoYW5uZWxfbWVzc2FnZVwiLFxuICAgICAgICAgIGNoYW5uZWw6IHRoaXMuaWQsXG4gICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgdGhpcy5wZW5kaW5nLmRlbGV0ZShyZXF1ZXN0SWQpO1xuICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIG9uKGV2ZW50OiBzdHJpbmcsIGhhbmRsZXI6IENoYW5uZWxFdmVudEhhbmRsZXIpOiAoKSA9PiB2b2lkIHtcbiAgICB0aGlzLmVuc3VyZU9wZW4oKTtcbiAgICBsZXQgYnVja2V0ID0gdGhpcy5oYW5kbGVycy5nZXQoZXZlbnQpO1xuICAgIGlmICghYnVja2V0KSB7XG4gICAgICBidWNrZXQgPSBuZXcgU2V0KCk7XG4gICAgICB0aGlzLmhhbmRsZXJzLnNldChldmVudCwgYnVja2V0KTtcbiAgICB9XG4gICAgYnVja2V0LmFkZChoYW5kbGVyKTtcbiAgICB0aGlzLmZsdXNoQmFja2xvZyhldmVudCk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGNvbnN0IHNldCA9IHRoaXMuaGFuZGxlcnMuZ2V0KGV2ZW50KTtcbiAgICAgIGlmICghc2V0KSByZXR1cm47XG4gICAgICBzZXQuZGVsZXRlKGhhbmRsZXIpO1xuICAgICAgaWYgKHNldC5zaXplID09PSAwKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlcnMuZGVsZXRlKGV2ZW50KTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgaGFuZGxlU2VydmVyTWVzc2FnZShtZXNzYWdlOiBTZXJ2ZXJDaGFubmVsTWVzc2FnZSk6IGJvb2xlYW4ge1xuICAgIGlmIChpc1NlcnZlclJlc3BvbnNlTWVzc2FnZShtZXNzYWdlKSkge1xuICAgICAgdGhpcy5yZXNvbHZlUGVuZGluZyhtZXNzYWdlKTtcbiAgICAgIHJldHVybiB0aGlzLmNsb3NlZDtcbiAgICB9XG4gICAgaWYgKHRoaXMuY2xvc2VkKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKCFpc1NlcnZlclJlcXVlc3RNZXNzYWdlKG1lc3NhZ2UpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jbG9zZWQ7XG4gICAgfVxuXG4gICAgaWYgKG1lc3NhZ2UuZXZlbnQgPT09IFwiX19jbG9zZV9fXCIpIHtcbiAgICAgIHRoaXMuY2xvc2UobmV3IFB1bHNlQ2hhbm5lbFJlc2V0RXJyb3IoXCJDaGFubmVsIGNsb3NlZCBieSBzZXJ2ZXJcIikpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChtZXNzYWdlLnJlcXVlc3RJZCkge1xuICAgICAgdm9pZCB0aGlzLmRpc3BhdGNoUmVxdWVzdChtZXNzYWdlIGFzIFNlcnZlckNoYW5uZWxSZXF1ZXN0TWVzc2FnZSAmIHtcbiAgICAgICAgcmVxdWVzdElkOiBzdHJpbmc7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG1lc3NhZ2UpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jbG9zZWQ7XG4gIH1cblxuICBoYW5kbGVEaXNjb25uZWN0KHJlYXNvbjogUHVsc2VDaGFubmVsUmVzZXRFcnJvcik6IHZvaWQge1xuICAgIHRoaXMuY2xvc2UocmVhc29uKTtcbiAgfVxuXG4gIGRpc3Bvc2UocmVhc29uOiBQdWxzZUNoYW5uZWxSZXNldEVycm9yKTogdm9pZCB7XG4gICAgdGhpcy5jbG9zZShyZWFzb24pO1xuICB9XG5cbiAgcHJpdmF0ZSBlbnN1cmVPcGVuKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNsb3NlZCkge1xuICAgICAgdGhyb3cgbmV3IFB1bHNlQ2hhbm5lbFJlc2V0RXJyb3IoXCJDaGFubmVsIGlzIGNsb3NlZFwiKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZsdXNoQmFja2xvZyhldmVudDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYmFja2xvZy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICBjb25zdCByZW1haW5pbmc6IFNlcnZlckNoYW5uZWxSZXF1ZXN0TWVzc2FnZVtdID0gW107XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMuYmFja2xvZykge1xuICAgICAgaWYgKGl0ZW0uZXZlbnQgPT09IGV2ZW50KSB7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChpdGVtKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlbWFpbmluZy5wdXNoKGl0ZW0pO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmJhY2tsb2cgPSByZW1haW5pbmc7XG4gIH1cblxuICBwcml2YXRlIGRpc3BhdGNoRXZlbnQobWVzc2FnZTogU2VydmVyQ2hhbm5lbFJlcXVlc3RNZXNzYWdlKTogdm9pZCB7XG4gICAgY29uc3QgaGFuZGxlcnMgPSB0aGlzLmhhbmRsZXJzLmdldChtZXNzYWdlLmV2ZW50KTtcbiAgICBpZiAoIWhhbmRsZXJzIHx8IGhhbmRsZXJzLnNpemUgPT09IDApIHtcbiAgICAgIHRoaXMuYmFja2xvZy5wdXNoKG1lc3NhZ2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgaGFuZGxlcnMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGhhbmRsZXIobWVzc2FnZS5wYXlsb2FkKTtcbiAgICAgICAgaWYgKHJlc3VsdCAmJiB0eXBlb2YgKHJlc3VsdCBhcyBQcm9taXNlPGFueT4pLnRoZW4gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIHZvaWQgKHJlc3VsdCBhcyBQcm9taXNlPGFueT4pLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJQdWxzZSBjaGFubmVsIGhhbmRsZXIgZXJyb3JcIiwgZXJyKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJQdWxzZSBjaGFubmVsIGhhbmRsZXIgZXJyb3JcIiwgZXJyKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGRpc3BhdGNoUmVxdWVzdChcbiAgICBtZXNzYWdlOiBTZXJ2ZXJDaGFubmVsUmVxdWVzdE1lc3NhZ2UgJiB7IHJlcXVlc3RJZDogc3RyaW5nIH1cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaGFuZGxlcnMgPSB0aGlzLmhhbmRsZXJzLmdldChtZXNzYWdlLmV2ZW50KTtcbiAgICBsZXQgcmVzcG9uc2U6IGFueTtcbiAgICBsZXQgZXJyb3I6IGFueTtcbiAgICBpZiAoaGFuZGxlcnMgJiYgaGFuZGxlcnMuc2l6ZSA+IDApIHtcbiAgICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiBoYW5kbGVycykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGhhbmRsZXIobWVzc2FnZS5wYXlsb2FkKTtcbiAgICAgICAgICByZXNwb25zZSA9IGF3YWl0IFByb21pc2UucmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICAgIGlmIChyZXNwb25zZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGVycm9yID0gZXJyO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChlcnJvcikge1xuICAgICAgYXdhaXQgdGhpcy5jbGllbnQuc2VuZENoYW5uZWxNZXNzYWdlKHtcbiAgICAgICAgdHlwZTogXCJjaGFubmVsX21lc3NhZ2VcIixcbiAgICAgICAgY2hhbm5lbDogdGhpcy5pZCxcbiAgICAgICAgZXZlbnQ6IHVuZGVmaW5lZCxcbiAgICAgICAgcmVzcG9uc2VUbzogbWVzc2FnZS5yZXF1ZXN0SWQsXG4gICAgICAgIGVycm9yOiBmb3JtYXRFcnJvcihlcnJvciksXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5jbGllbnQuc2VuZENoYW5uZWxNZXNzYWdlKHtcbiAgICAgIHR5cGU6IFwiY2hhbm5lbF9tZXNzYWdlXCIsXG4gICAgICBjaGFubmVsOiB0aGlzLmlkLFxuICAgICAgZXZlbnQ6IHVuZGVmaW5lZCxcbiAgICAgIHJlc3BvbnNlVG86IG1lc3NhZ2UucmVxdWVzdElkLFxuICAgICAgcGF5bG9hZDogcmVzcG9uc2UsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVQZW5kaW5nKG1lc3NhZ2U6IFNlcnZlckNoYW5uZWxSZXNwb25zZU1lc3NhZ2UpOiB2b2lkIHtcbiAgICBjb25zdCBlbnRyeSA9IG1lc3NhZ2UucmVzcG9uc2VUbyA/IHRoaXMucGVuZGluZy5nZXQobWVzc2FnZS5yZXNwb25zZVRvKSA6IHVuZGVmaW5lZDtcbiAgICBpZiAoIWVudHJ5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucGVuZGluZy5kZWxldGUobWVzc2FnZS5yZXNwb25zZVRvISk7XG4gICAgaWYgKG1lc3NhZ2UuZXJyb3IgIT09IHVuZGVmaW5lZCAmJiBtZXNzYWdlLmVycm9yICE9PSBudWxsKSB7XG4gICAgICBlbnRyeS5yZWplY3QobmV3IFB1bHNlQ2hhbm5lbFJlc2V0RXJyb3IoU3RyaW5nKG1lc3NhZ2UuZXJyb3IpKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVudHJ5LnJlc29sdmUobWVzc2FnZS5wYXlsb2FkKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNsb3NlKHJlYXNvbjogUHVsc2VDaGFubmVsUmVzZXRFcnJvcik6IHZvaWQge1xuICAgIGlmICh0aGlzLmNsb3NlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmNsb3NlZCA9IHRydWU7XG4gICAgZm9yIChjb25zdCByZXF1ZXN0IG9mIHRoaXMucGVuZGluZy52YWx1ZXMoKSkge1xuICAgICAgcmVxdWVzdC5yZWplY3QocmVhc29uKTtcbiAgICB9XG4gICAgdGhpcy5wZW5kaW5nLmNsZWFyKCk7XG4gICAgdGhpcy5oYW5kbGVycy5jbGVhcigpO1xuICAgIHRoaXMuYmFja2xvZyA9IFtdO1xuICAgIC8vIE5vLW9wOiBvd25pbmcgY2xpZW50IG1hbmFnZXMgcmVnaXN0cnkgbGlmZWN5Y2xlLlxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDaGFubmVsQnJpZGdlKFxuICBjbGllbnQ6IFB1bHNlU29ja2V0SU9DbGllbnQsXG4gIGlkOiBzdHJpbmdcbik6IENoYW5uZWxCcmlkZ2Uge1xuICByZXR1cm4gbmV3IENoYW5uZWxCcmlkZ2UoY2xpZW50LCBpZCk7XG59XG4iLAogICAgImltcG9ydCB7IHVzZUVmZmVjdCwgdXNlTWVtbyB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgdXNlUHVsc2VDbGllbnQgfSBmcm9tIFwiLi9wdWxzZVwiO1xuaW1wb3J0IHR5cGUgeyBDaGFubmVsQnJpZGdlIH0gZnJvbSBcIi4vY2hhbm5lbFwiO1xuXG5leHBvcnQgZnVuY3Rpb24gdXNlUHVsc2VDaGFubmVsKGNoYW5uZWxJZDogc3RyaW5nKTogQ2hhbm5lbEJyaWRnZSB7XG4gIGNvbnN0IGNsaWVudCA9IHVzZVB1bHNlQ2xpZW50KCk7XG4gIGNvbnN0IGJyaWRnZSA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGlmICghY2hhbm5lbElkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1c2VQdWxzZUNoYW5uZWwgcmVxdWlyZXMgYSBub24tZW1wdHkgY2hhbm5lbElkXCIpO1xuICAgIH1cbiAgICByZXR1cm4gY2xpZW50LmFjcXVpcmVDaGFubmVsKGNoYW5uZWxJZCk7XG4gIH0sIFtjbGllbnQsIGNoYW5uZWxJZF0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGNsaWVudC5yZWxlYXNlQ2hhbm5lbChjaGFubmVsSWQpO1xuICAgIH07XG4gIH0sIFtjbGllbnQsIGNoYW5uZWxJZF0pO1xuXG4gIHJldHVybiBicmlkZ2U7XG59XG4iLAogICAgImltcG9ydCBSZWFjdCwgeyBmb3J3YXJkUmVmLCB1c2VDYWxsYmFjaywgdHlwZSBGb3JtRXZlbnQgfSBmcm9tIFwicmVhY3RcIjtcblxuZXhwb3J0IHR5cGUgUHVsc2VGb3JtUHJvcHMgPSBSZWFjdC5Db21wb25lbnRQcm9wc1dpdGhvdXRSZWY8XCJmb3JtXCI+ICYge1xuICBhY3Rpb246IHN0cmluZztcbn07XG5cbi8qKlxuICogUHVsc2VGb3JtIGludGVyY2VwdHMgbmF0aXZlIGZvcm0gc3VibWlzc2lvbnMgYW5kIHNlbmRzIHRoZW0gdGhyb3VnaCBmZXRjaCBzbyB0aGVcbiAqIHN1cnJvdW5kaW5nIFB1bHNlIHZpZXcgc3RheXMgbW91bnRlZC4gU2VydmVyLXNpZGUgaGFuZGxlcnMgYXJlIHN0aWxsIGludm9rZWQgdmlhXG4gKiB0aGUgZm9ybSBhY3Rpb24gZW5kcG9pbnQgYW5kIHJlYWN0aXZlIHVwZGF0ZXMgcHJvcGFnYXRlIG92ZXIgdGhlIHNvY2tldC5cbiAqL1xuZXhwb3J0IGNvbnN0IFB1bHNlRm9ybSA9IGZvcndhcmRSZWY8SFRNTEZvcm1FbGVtZW50LCBQdWxzZUZvcm1Qcm9wcz4oXG4gIGZ1bmN0aW9uIFB1bHNlRm9ybSh7IG9uU3VibWl0LCBhY3Rpb24sIC4uLnJlc3QgfSwgcmVmKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxmb3JtXG4gICAgICAgIHsuLi5yZXN0fVxuICAgICAgICBhY3Rpb249e2FjdGlvbn1cbiAgICAgICAgcmVmPXtyZWZ9XG4gICAgICAgIG9uU3VibWl0PXt1c2VDYWxsYmFjayhcbiAgICAgICAgICAoZXZlbnQ6IEZvcm1FdmVudDxIVE1MRm9ybUVsZW1lbnQ+KSA9PlxuICAgICAgICAgICAgc3VibWl0Rm9ybSh7IGV2ZW50LCBhY3Rpb24sIG9uU3VibWl0IH0pLFxuICAgICAgICAgIFthY3Rpb24sIG9uU3VibWl0XVxuICAgICAgICApfVxuICAgICAgLz5cbiAgICApO1xuICB9XG4pO1xuXG5pbnRlcmZhY2UgU3VibWl0Rm9ybSB7XG4gIGV2ZW50OiBSZWFjdC5Gb3JtRXZlbnQ8SFRNTEZvcm1FbGVtZW50PjtcbiAgYWN0aW9uOiBzdHJpbmc7XG4gIG9uU3VibWl0PzogUHVsc2VGb3JtUHJvcHNbXCJvblN1Ym1pdFwiXTtcbiAgZm9ybURhdGE/OiBGb3JtRGF0YTtcbiAgZm9yY2U/OiBib29sZWFuXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdWJtaXRGb3JtKHtcbiAgZXZlbnQsXG4gIGFjdGlvbixcbiAgb25TdWJtaXQsXG4gIGZvcm1EYXRhLFxuICBmb3JjZVxufTogU3VibWl0Rm9ybSkge1xuICBvblN1Ym1pdD8uKGV2ZW50KTtcbiAgaWYgKCFmb3JjZSAmJiBldmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGZvcm0gPSBldmVudC5jdXJyZW50VGFyZ2V0O1xuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICBjb25zdCBuYXRpdmVFdmVudCA9IGV2ZW50Lm5hdGl2ZUV2ZW50IGFzIFN1Ym1pdEV2ZW50O1xuICBpZiAoIWZvcm1EYXRhKSB7XG4gICAgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoZm9ybSwgbmF0aXZlRXZlbnQuc3VibWl0dGVyKTtcbiAgfVxuICBjb25zdCB1cmwgPSBuZXcgVVJMKGFjdGlvbiwgd2luZG93LmxvY2F0aW9uLmhyZWYpO1xuICB0cnkge1xuICAgIGF3YWl0IGZldGNoKHVybCwge1xuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIC8vIFJlcXVpcmVkIGZvciBvdXIgaG9zdGluZyBzY2VuYXJpb3Mgb2Ygc2FtZSBob3N0ICsgZGlmZmVyZW50IHBvcnRzIG9yIDIgc3ViZG9tYWluc1xuICAgICAgY3JlZGVudGlhbHM6IFwiaW5jbHVkZVwiLFxuICAgICAgYm9keTogZm9ybURhdGEsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJbUHVsc2VdIEZvcm0gc3VibWlzc2lvbiBmYWlsZWRcIiwgZXJyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgfVxufVxuIiwKICAgICJpbXBvcnQgeyBpbywgU29ja2V0IH0gZnJvbSBcInNvY2tldC5pby1jbGllbnRcIjtcbmltcG9ydCB0eXBlIHsgU2VydmVyTWVzc2FnZSwgQ2xpZW50TWVzc2FnZSB9IGZyb20gXCIuL21lc3NhZ2VzXCI7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBUcmFuc3BvcnQgQWJzdHJhY3Rpb25cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCB0eXBlIE1lc3NhZ2VMaXN0ZW5lciA9IChtZXNzYWdlOiBTZXJ2ZXJNZXNzYWdlKSA9PiB2b2lkO1xuZXhwb3J0IHR5cGUgQ29ubmVjdGlvblN0YXR1c0xpc3RlbmVyID0gKGNvbm5lY3RlZDogYm9vbGVhbikgPT4gdm9pZDtcblxuZXhwb3J0IGludGVyZmFjZSBUcmFuc3BvcnQge1xuICBjb25uZWN0KGxpc3RlbmVyOiBNZXNzYWdlTGlzdGVuZXIpOiBQcm9taXNlPHZvaWQ+O1xuICBkaXNjb25uZWN0KCk6IHZvaWQ7XG4gIHNlbmRNZXNzYWdlKHBheWxvYWQ6IENsaWVudE1lc3NhZ2UpOiBQcm9taXNlPHZvaWQ+O1xuICBpc0Nvbm5lY3RlZCgpOiBib29sZWFuO1xuICBvbkNvbm5lY3Rpb25DaGFuZ2UobGlzdGVuZXI6IENvbm5lY3Rpb25TdGF0dXNMaXN0ZW5lcik6ICgpID0+IHZvaWQ7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBTb2NrZXQuSU8gVHJhbnNwb3J0XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgY2xhc3MgU29ja2V0SU9UcmFuc3BvcnQgaW1wbGVtZW50cyBUcmFuc3BvcnQge1xuICBwcml2YXRlIHNvY2tldDogU29ja2V0IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbGlzdGVuZXI6IE1lc3NhZ2VMaXN0ZW5lciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIG1lc3NhZ2VRdWV1ZTogQ2xpZW50TWVzc2FnZVtdID0gW107XG4gIHByaXZhdGUgY29ubmVjdGlvbkxpc3RlbmVyczogU2V0PENvbm5lY3Rpb25TdGF0dXNMaXN0ZW5lcj4gPSBuZXcgU2V0KCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSB1cmw6IHN0cmluZykge31cblxuICBjb25uZWN0KGxpc3RlbmVyOiBNZXNzYWdlTGlzdGVuZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXI7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuc29ja2V0ID0gaW8odGhpcy51cmwsIHtcbiAgICAgICAgdHJhbnNwb3J0czogW1wid2Vic29ja2V0XCJdLFxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuc29ja2V0Lm9uKFwiY29ubmVjdFwiLCAoKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiW1NvY2tldElPVHJhbnNwb3J0XSBDb25uZWN0ZWQ6XCIsIHRoaXMuc29ja2V0Py5pZCk7XG5cbiAgICAgICAgZm9yIChjb25zdCBwYXlsb2FkIG9mIHRoaXMubWVzc2FnZVF1ZXVlKSB7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXCJbU29ja2V0SU9UcmFuc3BvcnRdIFNlbmRpbmcgcXVldWVkIG1lc3NhZ2U6XCIsIHBheWxvYWQpO1xuICAgICAgICAgIHRoaXMuc29ja2V0Py5lbWl0KFwibWVzc2FnZVwiLCBwYXlsb2FkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1lc3NhZ2VRdWV1ZSA9IFtdO1xuXG4gICAgICAgIHRoaXMubm90aWZ5Q29ubmVjdGlvbkxpc3RlbmVycyh0cnVlKTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuc29ja2V0Lm9uKFwiY29ubmVjdF9lcnJvclwiLCAoZXJyKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJbU29ja2V0SU9UcmFuc3BvcnRdIENvbm5lY3Rpb24gZmFpbGVkOlwiLCBlcnIpO1xuICAgICAgICB0aGlzLm5vdGlmeUNvbm5lY3Rpb25MaXN0ZW5lcnMoZmFsc2UpO1xuICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnNvY2tldC5vbihcImRpc2Nvbm5lY3RcIiwgKCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhcIltTb2NrZXRJT1RyYW5zcG9ydF0gRGlzY29ubmVjdGVkXCIpO1xuICAgICAgICB0aGlzLm5vdGlmeUNvbm5lY3Rpb25MaXN0ZW5lcnMoZmFsc2UpO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuc29ja2V0Lm9uKFwibWVzc2FnZVwiLCAoZGF0YTogU2VydmVyTWVzc2FnZSkgPT4ge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIltTb2NrZXRJT1RyYW5zcG9ydF0gUmVjZWl2ZWQgbWVzc2FnZTpcIiwgZGF0YSk7XG4gICAgICAgIHRoaXMubGlzdGVuZXI/LihkYXRhKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgZGlzY29ubmVjdCgpOiB2b2lkIHtcbiAgICB0aGlzLnNvY2tldD8uZGlzY29ubmVjdCgpO1xuICAgIHRoaXMuc29ja2V0ID0gbnVsbDtcbiAgICB0aGlzLmxpc3RlbmVyID0gbnVsbDtcbiAgICB0aGlzLm1lc3NhZ2VRdWV1ZSA9IFtdO1xuICAgIHRoaXMuY29ubmVjdGlvbkxpc3RlbmVycy5jbGVhcigpO1xuICB9XG5cbiAgYXN5bmMgc2VuZE1lc3NhZ2UocGF5bG9hZDogQ2xpZW50TWVzc2FnZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmlzQ29ubmVjdGVkKCkpIHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKFwiW1NvY2tldElPVHJhbnNwb3J0XSBTZW5kaW5nOlwiLCBwYXlsb2FkKTtcbiAgICAgIHRoaXMuc29ja2V0IS5lbWl0KFwibWVzc2FnZVwiLCBwYXlsb2FkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gY29uc29sZS5sb2coXCJbU29ja2V0SU9UcmFuc3BvcnRdIFF1ZXVpbmcgbWVzc2FnZTpcIiwgcGF5bG9hZCk7XG4gICAgICB0aGlzLm1lc3NhZ2VRdWV1ZS5wdXNoKHBheWxvYWQpO1xuICAgIH1cbiAgfVxuXG4gIGlzQ29ubmVjdGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNvY2tldD8uY29ubmVjdGVkIHx8IGZhbHNlO1xuICB9XG5cbiAgb25Db25uZWN0aW9uQ2hhbmdlKGxpc3RlbmVyOiBDb25uZWN0aW9uU3RhdHVzTGlzdGVuZXIpOiAoKSA9PiB2b2lkIHtcbiAgICB0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTtcbiAgICBsaXN0ZW5lcih0aGlzLmlzQ29ubmVjdGVkKCkpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICB0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lcnMuZGVsZXRlKGxpc3RlbmVyKTtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBub3RpZnlDb25uZWN0aW9uTGlzdGVuZXJzKGNvbm5lY3RlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy5jb25uZWN0aW9uTGlzdGVuZXJzKSB7XG4gICAgICBsaXN0ZW5lcihjb25uZWN0ZWQpO1xuICAgIH1cbiAgfVxufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gSW4tTWVtb3J5IFRyYW5zcG9ydCAoZm9yIHRlc3RpbmcpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgY2xhc3MgSW5NZW1vcnlUcmFuc3BvcnQgaW1wbGVtZW50cyBUcmFuc3BvcnQge1xuICBwcml2YXRlIGxpc3RlbmVyOiBNZXNzYWdlTGlzdGVuZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjb25uZWN0ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBjb25uZWN0aW9uTGlzdGVuZXJzOiBTZXQ8Q29ubmVjdGlvblN0YXR1c0xpc3RlbmVyPiA9IG5ldyBTZXQoKTtcblxuICAvLyBTaW11bGF0ZSBzZXJ2ZXItc2lkZSBtZXNzYWdlIGRpc3BhdGNoaW5nXG4gIHB1YmxpYyBkaXNwYXRjaE1lc3NhZ2UobWVzc2FnZTogU2VydmVyTWVzc2FnZSkge1xuICAgIGlmICh0aGlzLmxpc3RlbmVyKSB7XG4gICAgICAvLyBTaW11bGF0ZSBhc3luYyBiZWhhdmlvclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmxpc3RlbmVyPy4obWVzc2FnZSksIDApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGNvbm5lY3QobGlzdGVuZXI6IE1lc3NhZ2VMaXN0ZW5lcik6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjtcbiAgICB0aGlzLmNvbm5lY3RlZCA9IHRydWU7XG4gICAgY29uc29sZS5sb2coXCJbSW5NZW1vcnlUcmFuc3BvcnRdIENvbm5lY3RlZC5cIik7XG4gIH1cblxuICBkaXNjb25uZWN0KCk6IHZvaWQge1xuICAgIHRoaXMubGlzdGVuZXIgPSBudWxsO1xuICAgIHRoaXMuY29ubmVjdGVkID0gZmFsc2U7XG4gICAgY29uc29sZS5sb2coXCJbSW5NZW1vcnlUcmFuc3BvcnRdIERpc2Nvbm5lY3RlZC5cIik7XG4gIH1cblxuICBhc3luYyBzZW5kTWVzc2FnZShwYXlsb2FkOiBDbGllbnRNZXNzYWdlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmNvbm5lY3RlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiW0luTWVtb3J5VHJhbnNwb3J0XSBOb3QgY29ubmVjdGVkLlwiKTtcbiAgICB9XG4gICAgY29uc29sZS5sb2coYFtJbk1lbW9yeVRyYW5zcG9ydF0gU2VudCBtZXNzYWdlOmAsIHBheWxvYWQpO1xuICAgIC8vIEluIGEgcmVhbCB0ZXN0IHNldHVwLCB0aGlzIG1pZ2h0IHRyaWdnZXIgYSBzaW11bGF0ZWQgc2VydmVyIHJlc3BvbnNlXG4gICAgLy8gdmlhIGBkaXNwYXRjaE1lc3NhZ2VgLlxuICB9XG5cbiAgaXNDb25uZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY29ubmVjdGVkO1xuICB9XG5cbiAgb25Db25uZWN0aW9uQ2hhbmdlKGxpc3RlbmVyOiBDb25uZWN0aW9uU3RhdHVzTGlzdGVuZXIpOiAoKSA9PiB2b2lkIHtcbiAgICB0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgdGhpcy5jb25uZWN0aW9uTGlzdGVuZXJzLmRlbGV0ZShsaXN0ZW5lcik7XG4gICAgfTtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IExvYWRlckZ1bmN0aW9uQXJncyB9IGZyb20gXCJyZWFjdC1yb3V0ZXJcIjtcblxuZXhwb3J0IGludGVyZmFjZSBSb3V0ZUluZm8ge1xuICBwYXRobmFtZTogc3RyaW5nO1xuICBoYXNoOiBzdHJpbmc7XG4gIHF1ZXJ5OiBzdHJpbmc7XG4gIHF1ZXJ5UGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBwYXRoUGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+O1xuICBjYXRjaGFsbDogc3RyaW5nW107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0U2VydmVyUm91dGVJbmZvKHtcbiAgcGFyYW1zLFxuICByZXF1ZXN0LFxufTogTG9hZGVyRnVuY3Rpb25BcmdzKSB7XG4gIGNvbnN0IHsgXCIqXCI6IGNhdGNoYWxsID0gXCJcIiwgLi4ucGF0aFBhcmFtcyB9ID0gcGFyYW1zO1xuICBjb25zdCBwYXJzZWRVcmwgPSBuZXcgVVJMKHJlcXVlc3QudXJsKTtcblxuICByZXR1cm4ge1xuICAgIGhhc2g6IHBhcnNlZFVybC5oYXNoLFxuICAgIHBhdGhuYW1lOiBwYXJzZWRVcmwucGF0aG5hbWUsXG4gICAgcXVlcnk6IHBhcnNlZFVybC5zZWFyY2gsXG4gICAgcXVlcnlQYXJhbXM6IE9iamVjdC5mcm9tRW50cmllcyhwYXJzZWRVcmwuc2VhcmNoUGFyYW1zLmVudHJpZXMoKSksXG4gICAgcGF0aFBhcmFtcyxcbiAgICBjYXRjaGFsbDogY2F0Y2hhbGwubGVuZ3RoID4gMSA/IGNhdGNoYWxsLnNwbGl0KFwiL1wiKSA6IFtdLFxuICB9IHNhdGlzZmllcyBSb3V0ZUluZm87XG59IiwKICAgICIvLyBTZXJpYWxpemF0aW9uIGhlbHBlcnMgdGhhdCBzdXBwb3J0OlxuLy8gLSBDaXJjdWxhciByZWZlcmVuY2VzIHZpYSBvYmplY3QgaWRlbnRpdHkgcmVmc1xuLy8gLSBEYXRlIGluc3RhbmNlcyDihpIgeyBfX3Q6IFwiZGF0ZXRpbWVcIiwgdGltZXN0YW1wIH1cbi8vIC0gRm9ybURhdGEg4oaSIHsgX190OiBcImZvcm1kYXRhXCIsIGZpZWxkcyB9XG4vLyAtIEZpbGUg4oaSIHsgX190OiBcImZpbGVcIiwgbmFtZSwgdHlwZSwgc2l6ZSwgbGFzdE1vZGlmaWVkLCBjb250ZW50OiBudW1iZXJbXSB9XG4vLyBBbG9uZyB3aXRoIGEgZGVjb2RlciBmb3IgdGhlIHN5bW1ldHJpYyBzaGFwZXMgKHdlIGRvIG5vdCByZWNvbnN0cnVjdCBGaWxlL0Zvcm1EYXRhIG9iamVjdHMpLlxuXG50eXBlIEVuY29kZWRSZWYgPSB7IF9fdDogXCJyZWZcIjsgaWQ6IG51bWJlciB9O1xudHlwZSBFbmNvZGVkQXJyYXkgPSB7IF9fdDogXCJhcnJheVwiOyBfX2lkOiBudW1iZXI7IGl0ZW1zOiB1bmtub3duW10gfTtcbnR5cGUgRW5jb2RlZE9iamVjdCA9IHtcbiAgX190OiBcIm9iamVjdFwiO1xuICBfX2lkOiBudW1iZXI7XG4gIHByb3BzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn07XG50eXBlIEVuY29kZWREYXRlID0geyBfX3Q6IFwiZGF0ZXRpbWVcIjsgdGltZXN0YW1wOiBudW1iZXIgfTtcbnR5cGUgRW5jb2RlZEZpbGUgPSB7XG4gIF9fdDogXCJmaWxlXCI7XG4gIG5hbWU6IHN0cmluZztcbiAgdHlwZTogc3RyaW5nO1xuICBzaXplOiBudW1iZXI7XG4gIGxhc3RNb2RpZmllZDogbnVtYmVyO1xuICBjb250ZW50OiBudW1iZXJbXTsgLy8gcmF3IGJ5dGVzIGFzIGEgSlNPTi1zYWZlIG51bWJlciBhcnJheVxufTtcbnR5cGUgRW5jb2RlZEZvcm1EYXRhID0ge1xuICBfX3Q6IFwiZm9ybWRhdGFcIjtcbiAgZmllbGRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duIHwgdW5rbm93bltdPjtcbn07XG5cbnR5cGUgSWRlbnRpdHlNYXAgPSBXZWFrTWFwPG9iamVjdCwgbnVtYmVyPjtcblxuZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIikgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSk7XG4gIHJldHVybiBwcm90byA9PT0gT2JqZWN0LnByb3RvdHlwZSB8fCBwcm90byA9PT0gbnVsbDtcbn1cblxuXG5mdW5jdGlvbiBpc0RhdGUodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBEYXRlIHtcbiAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgRGF0ZTtcbn1cblxuZnVuY3Rpb24gaXNTa2lwcGFibGUodmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIiB8fFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJzeW1ib2xcIiB8fFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJ1bmRlZmluZWRcIlxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmaWxlVG9CeXRlQXJyYXkoZmlsZTogRmlsZSk6IFByb21pc2U8bnVtYmVyW10+IHtcbiAgY29uc3QgYWIgPSBhd2FpdCBmaWxlLmFycmF5QnVmZmVyKCk7XG4gIHJldHVybiBBcnJheS5mcm9tKG5ldyBVaW50OEFycmF5KGFiKSk7XG59XG5cbmludGVyZmFjZSBFbmNvZGVDb250ZXh0IHtcbiAgc2VlbjogSWRlbnRpdHlNYXA7XG4gIG5leHRJZDogbnVtYmVyO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5jb2RlRm9yV2lyZShpbnB1dDogdW5rbm93bik6IFByb21pc2U8dW5rbm93bj4ge1xuICBjb25zdCBjdHg6IEVuY29kZUNvbnRleHQgPSB7IHNlZW46IG5ldyBXZWFrTWFwKCksIG5leHRJZDogMSB9O1xuICByZXR1cm4gYXdhaXQgZW5jb2RlUmVjdXJzaXZlKGlucHV0LCBjdHgpO1xufVxuXG5mdW5jdGlvbiByZW1lbWJlcihjdHg6IEVuY29kZUNvbnRleHQsIG9iajogb2JqZWN0KTogbnVtYmVyIHwgbnVsbCB7XG4gIGNvbnN0IGV4aXN0aW5nID0gY3R4LnNlZW4uZ2V0KG9iaik7XG4gIGlmIChleGlzdGluZyAhPT0gdW5kZWZpbmVkKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgaWQgPSBjdHgubmV4dElkKys7XG4gIGN0eC5zZWVuLnNldChvYmosIGlkKTtcbiAgcmV0dXJuIGlkO1xufVxuXG5hc3luYyBmdW5jdGlvbiBlbmNvZGVSZWN1cnNpdmUoXG4gIHZhbHVlOiB1bmtub3duLFxuICBjdHg6IEVuY29kZUNvbnRleHRcbik6IFByb21pc2U8dW5rbm93bj4ge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLy8gU3BlY2lhbCBjYXNlcyBmaXJzdFxuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgY29uc3QgZGF0ZSA9IHZhbHVlIGFzIERhdGU7XG4gICAgY29uc3QgZW5jb2RlZDogRW5jb2RlZERhdGUgPSB7IF9fdDogXCJkYXRldGltZVwiLCB0aW1lc3RhbXA6IGRhdGUuZ2V0VGltZSgpIH07XG4gICAgcmV0dXJuIGVuY29kZWQ7XG4gIH1cblxuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBGb3JtRGF0YSkge1xuICAgIGNvbnN0IGlkID0gcmVtZW1iZXIoY3R4LCB2YWx1ZSk7XG4gICAgaWYgKGlkID09PSBudWxsKSB7XG4gICAgICByZXR1cm4geyBfX3Q6IFwicmVmXCIsIGlkOiBjdHguc2Vlbi5nZXQodmFsdWUgYXMgb2JqZWN0KSEgfSBhcyBFbmNvZGVkUmVmO1xuICAgIH1cbiAgICBjb25zdCBmaWVsZHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24gfCB1bmtub3duW10+ID0ge307XG4gICAgZm9yIChjb25zdCBba2V5LCB2XSBvZiB2YWx1ZS5lbnRyaWVzKCkpIHtcbiAgICAgIGNvbnN0IGVuY29kZWRWYWwgPSBhd2FpdCBlbmNvZGVSZWN1cnNpdmUodiBhcyB1bmtub3duLCBjdHgpO1xuICAgICAgaWYgKGVuY29kZWRWYWwgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGZpZWxkcywga2V5KSkge1xuICAgICAgICBjb25zdCBleGlzdGluZyA9IGZpZWxkc1trZXldO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShleGlzdGluZykpIHtcbiAgICAgICAgICBleGlzdGluZy5wdXNoKGVuY29kZWRWYWwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZpZWxkc1trZXldID0gW2V4aXN0aW5nLCBlbmNvZGVkVmFsXTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmllbGRzW2tleV0gPSBlbmNvZGVkVmFsO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBlbmNvZGVkOiBFbmNvZGVkRm9ybURhdGEgJiB7IF9faWQ6IG51bWJlciB9ID0ge1xuICAgICAgX190OiBcImZvcm1kYXRhXCIsXG4gICAgICBmaWVsZHMsXG4gICAgICBfX2lkOiBpZCxcbiAgICB9IGFzIGFueTtcbiAgICByZXR1cm4gZW5jb2RlZDtcbiAgfVxuXG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEZpbGUpIHtcbiAgICBjb25zdCBmaWxlID0gdmFsdWU7XG4gICAgY29uc3QgYnl0ZXMgPSBhd2FpdCBmaWxlVG9CeXRlQXJyYXkodmFsdWUpO1xuICAgIGNvbnN0IGVuY29kZWQ6IEVuY29kZWRGaWxlID0ge1xuICAgICAgX190OiBcImZpbGVcIixcbiAgICAgIG5hbWU6IGZpbGUubmFtZSxcbiAgICAgIHR5cGU6IGZpbGUudHlwZSxcbiAgICAgIHNpemU6IGZpbGUuc2l6ZSxcbiAgICAgIGxhc3RNb2RpZmllZDogZmlsZS5sYXN0TW9kaWZpZWQsXG4gICAgICBjb250ZW50OiBieXRlcyxcbiAgICB9O1xuICAgIHJldHVybiBlbmNvZGVkO1xuICB9XG5cbiAgLy8gSWRlbnRpdHkgLyBjaXJjdWxhciByZWZlcmVuY2UgaGFuZGxpbmdcbiAgY29uc3Qgb2JqZWN0ID0gdmFsdWUgYXMgb2JqZWN0O1xuICBjb25zdCBleGlzdGluZ0lkID0gY3R4LnNlZW4uZ2V0KG9iamVjdCk7XG4gIGlmIChleGlzdGluZ0lkICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCByZWY6IEVuY29kZWRSZWYgPSB7IF9fdDogXCJyZWZcIiwgaWQ6IGV4aXN0aW5nSWQgfTtcbiAgICByZXR1cm4gcmVmO1xuICB9XG4gIGNvbnN0IHRoaXNJZCA9IGN0eC5uZXh0SWQrKztcbiAgY3R4LnNlZW4uc2V0KG9iamVjdCwgdGhpc0lkKTtcblxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBjb25zdCBpdGVtc1JhdyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgKHZhbHVlIGFzIHVua25vd25bXSkubWFwKChpdGVtKSA9PiBlbmNvZGVSZWN1cnNpdmUoaXRlbSwgY3R4KSlcbiAgICApO1xuICAgIGNvbnN0IGl0ZW1zID0gaXRlbXNSYXcuZmlsdGVyKChpdCkgPT4gaXQgIT09IHVuZGVmaW5lZCkgYXMgdW5rbm93bltdO1xuICAgIGNvbnN0IGVuY29kZWQ6IEVuY29kZWRBcnJheSA9IHsgX190OiBcImFycmF5XCIsIF9faWQ6IHRoaXNJZCwgaXRlbXMgfTtcbiAgICByZXR1cm4gZW5jb2RlZDtcbiAgfVxuXG4gIC8vIFBsYWluIG9iamVjdCBvciBvdGhlciBvYmplY3QgdHlwZXNcbiAgY29uc3QgcHJvcHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gIGlmIChpc1BsYWluT2JqZWN0KHZhbHVlKSkge1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHZhbHVlKSkge1xuICAgICAgY29uc3QgdiA9ICh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XTtcbiAgICAgIGlmIChpc1NraXBwYWJsZSh2KSkgY29udGludWU7XG4gICAgICBjb25zdCBlbmNvZGVkViA9IGF3YWl0IGVuY29kZVJlY3Vyc2l2ZSh2LCBjdHgpO1xuICAgICAgaWYgKGVuY29kZWRWICE9PSB1bmRlZmluZWQpIHByb3BzW2tleV0gPSBlbmNvZGVkVjtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gTm9uLXBsYWluIG9iamVjdHM6IGJlc3QgZWZmb3J0IOKAkyBlbnVtZXJhdGUgZW51bWVyYWJsZSBwcm9wZXJ0aWVzXG4gICAgZm9yIChjb25zdCBrZXkgaW4gdmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIHtcbiAgICAgIGNvbnN0IHYgPSAodmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV07XG4gICAgICBpZiAoaXNTa2lwcGFibGUodikpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgZW5jb2RlZFYgPSBhd2FpdCBlbmNvZGVSZWN1cnNpdmUodiwgY3R4KTtcbiAgICAgIGlmIChlbmNvZGVkViAhPT0gdW5kZWZpbmVkKSBwcm9wc1trZXldID0gZW5jb2RlZFY7XG4gICAgfVxuICB9XG4gIGNvbnN0IGVuY29kZWQ6IEVuY29kZWRPYmplY3QgPSB7IF9fdDogXCJvYmplY3RcIiwgX19pZDogdGhpc0lkLCBwcm9wcyB9O1xuICByZXR1cm4gZW5jb2RlZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZUZyb21XaXJlKGlucHV0OiB1bmtub3duKTogdW5rbm93biB7XG4gIHJldHVybiBkZWNvZGVSZWN1cnNpdmUoaW5wdXQpO1xufVxuXG5mdW5jdGlvbiBkZWNvZGVSZWN1cnNpdmUodmFsdWU6IHVua25vd24pOiB1bmtub3duIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIikgcmV0dXJuIHZhbHVlO1xuXG4gIGNvbnN0IG9iaiA9IHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBjb25zdCB0YWcgPSBvYmpbXCJfX3RcIl07XG5cbiAgaWYgKHRhZyA9PT0gXCJkYXRldGltZVwiKSB7XG4gICAgY29uc3QgdHMgPSBvYmpbXCJ0aW1lc3RhbXBcIl0gYXMgbnVtYmVyO1xuICAgIHJldHVybiBuZXcgRGF0ZSh0cyk7XG4gIH1cblxuICBpZiAodGFnID09PSBcImZpbGVcIikge1xuICAgIC8vIERvIG5vdCByZWNvbnN0cnVjdCBGaWxlOyBrZWVwIGFzIHBsYWluIG9iamVjdC4gT3B0aW9uYWxseSwgdHVybiBjb250ZW50IGludG8gVWludDhBcnJheSBmb3IgY29udmVuaWVuY2UuXG4gICAgY29uc3QgY29udGVudCA9IG9ialtcImNvbnRlbnRcIl07XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY29udGVudCkpIHtcbiAgICAgIC8vIFJldHVybiBhIHNoYWxsb3cgY2xvbmUgd2l0aCBVaW50OEFycmF5IGZvciBjb250ZW50XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5vYmosXG4gICAgICAgIGNvbnRlbnQ6IG5ldyBVaW50OEFycmF5KGNvbnRlbnQgYXMgbnVtYmVyW10pLFxuICAgICAgfSBhcyBhbnk7XG4gICAgfVxuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICBpZiAodGFnID09PSBcImZvcm1kYXRhXCIpIHtcbiAgICAvLyBLZWVwIGFzLWlzIChwbGFpbiBvYmplY3QpLCBidXQgZGVjb2RlIG5lc3RlZCB2YWx1ZXNcbiAgICBjb25zdCBmaWVsZHMgPSBvYmpbXCJmaWVsZHNcIl0gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93biB8IHVua25vd25bXT47XG4gICAgY29uc3QgZGVjb2RlZEZpZWxkczogUmVjb3JkPHN0cmluZywgdW5rbm93biB8IHVua25vd25bXT4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhmaWVsZHMpKSB7XG4gICAgICBjb25zdCB2ID0gZmllbGRzW2tleV07XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2KSkge1xuICAgICAgICBkZWNvZGVkRmllbGRzW2tleV0gPSB2Lm1hcCgoeCkgPT4gZGVjb2RlUmVjdXJzaXZlKHgpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlY29kZWRGaWVsZHNba2V5XSA9IGRlY29kZVJlY3Vyc2l2ZSh2KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgX190OiBcImZvcm1kYXRhXCIsIGZpZWxkczogZGVjb2RlZEZpZWxkcyB9IGFzIEVuY29kZWRGb3JtRGF0YTtcbiAgfVxuXG4gIGlmICh0YWcgPT09IFwiYXJyYXlcIikge1xuICAgIGNvbnN0IGl0ZW1zID0gKG9ialtcIml0ZW1zXCJdIGFzIHVua25vd25bXSkubWFwKCh4KSA9PiBkZWNvZGVSZWN1cnNpdmUoeCkpO1xuICAgIHJldHVybiBpdGVtcztcbiAgfVxuXG4gIGlmICh0YWcgPT09IFwib2JqZWN0XCIpIHtcbiAgICBjb25zdCBwcm9wcyA9IG9ialtcInByb3BzXCJdIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGNvbnN0IG91dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhwcm9wcykpIHtcbiAgICAgIG91dFtrZXldID0gZGVjb2RlUmVjdXJzaXZlKHByb3BzW2tleV0pO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgaWYgKHRhZyA9PT0gXCJyZWZcIikge1xuICAgIC8vIFdpdGhvdXQgYSByZWNvbnN0cnVjdGlvbiBjb250ZXh0IG9uIHRoZSBjbGllbnQsIGxlYXZlIGFzLWlzLlxuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICAvLyBVbmtub3duIG9iamVjdCDigJMgZGVzY2VuZCBzaGFsbG93bHlcbiAgY29uc3QgY29weTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMob2JqKSkge1xuICAgIGNvcHlba2V5XSA9IGRlY29kZVJlY3Vyc2l2ZShvYmpba2V5XSk7XG4gIH1cbiAgcmV0dXJuIGNvcHk7XG59XG5cbi8vIExlZ2FjeSBjbGVhbmVyIGtlcHQgZm9yIGNvbXBhdGliaWxpdHkgd2hlcmUgYSBxdWljayBiZXN0LWVmZm9ydCBKU09OLXNhZmUgc2hhcGUgaXMgbmVlZGVkXG5leHBvcnQgZnVuY3Rpb24gY2xlYW5Gb3JTZXJpYWxpemF0aW9uKG9iajogdW5rbm93bik6IHVua25vd24ge1xuICByZXR1cm4gY2xlYW5SZWN1cnNpdmUob2JqLCBuZXcgV2Vha1NldCgpKTtcbn1cblxuZnVuY3Rpb24gY2xlYW5SZWN1cnNpdmUob2JqOiB1bmtub3duLCBzZWVuOiBXZWFrU2V0PG9iamVjdD4pOiB1bmtub3duIHtcbiAgaWYgKG9iaiA9PT0gbnVsbCB8fCB0eXBlb2Ygb2JqICE9PSBcIm9iamVjdFwiKSByZXR1cm4gb2JqO1xuICBpZiAoc2Vlbi5oYXMob2JqIGFzIG9iamVjdCkpIHJldHVybiB1bmRlZmluZWQ7XG4gIHNlZW4uYWRkKG9iaiBhcyBvYmplY3QpO1xuICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgcmV0dXJuIChvYmogYXMgdW5rbm93bltdKVxuICAgICAgLm1hcCgoaXRlbSkgPT4gY2xlYW5SZWN1cnNpdmUoaXRlbSwgc2VlbikpXG4gICAgICAuZmlsdGVyKCh4KSA9PiB4ICE9PSB1bmRlZmluZWQpO1xuICB9XG4gIGNvbnN0IG91dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgZm9yIChjb25zdCBrZXkgaW4gb2JqIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSB7XG4gICAgY29uc3QgdiA9IChvYmogYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV07XG4gICAgaWYgKGlzU2tpcHBhYmxlKHYpKSBjb250aW51ZTtcbiAgICBjb25zdCBjbGVhbmVkID0gY2xlYW5SZWN1cnNpdmUodiwgc2Vlbik7XG4gICAgaWYgKGNsZWFuZWQgIT09IHVuZGVmaW5lZCkgb3V0W2tleV0gPSBjbGVhbmVkO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG4iCiAgXSwKICAibWFwcGluZ3MiOiAiQUFBQSxvQkFDRSxjQUNBLGFBQ0EsbUJBQ0EsaUJBQ0EsZUNMRiwyQkFDRSxtQkFDQSxxQkFDQSxXQUNBLGVBQ0EsZUNGSyxJQUFNLEdBQWUsYUFDZixHQUFxQixLQWlHM0IsU0FBUyxFQUFhLENBQUMsRUFBcUMsQ0FFakUsT0FBTyxPQUFPLElBQVMsVUFBWSxJQUFTLEtBR3ZDLFNBQVMsRUFBZ0IsQ0FBQyxFQUFxQyxDQUNwRSxPQUNFLE9BQU8sSUFBUyxVQUNoQixJQUFTLE1BQ1QsRUFBSyxJQUFJLFdBMUdxQixJQTBHUSxHQUN0QyxFQUFLLE1BNUdtQixvRURjckIsTUFBTSxDQUFhLENBS2QsT0FDQSxLQUNBLFdBTkYsY0FDQSxjQUNBLGVBQ1IsV0FBVyxDQUNELEVBQ0EsRUFDQSxFQUNSLEVBQTZCLENBQUMsRUFDOUIsRUFBK0IsQ0FBQyxFQUNoQyxDQUxRLGNBQ0EsWUFDQSxrQkFJUixLQUFLLGNBQWdCLElBQUksSUFDekIsS0FBSyxjQUFnQixJQUFJLElBQ3pCLEtBQUssZUFBaUIsSUFBSSxJQUFJLENBQWtCLEVBQ2hELEtBQUssYUFBYSxDQUFnQixFQUdwQyxZQUFZLENBQUMsRUFBZ0IsQ0FDM0IsS0FBSyxjQUFjLE1BQU0sRUFDekIsS0FBSyxjQUFjLE1BQU0sRUFDekIsUUFBVyxLQUFPLEVBQU0sQ0FDdEIsSUFBTyxFQUFNLEdBQVEsS0FBSyxjQUFjLENBQUcsRUFDM0MsR0FBSSxDQUFDLEtBQUssY0FBYyxJQUFJLENBQUksRUFDOUIsS0FBSyxjQUFjLElBQUksRUFBTSxJQUFJLEdBQUssRUFFeEMsS0FBSyxjQUFjLElBQUksQ0FBSSxFQUFHLElBQUksQ0FBSSxHQUkxQyxrQkFBa0IsQ0FDaEIsRUFDQSxFQUNpQixDQUNqQixJQUFNLEVBQVksSUFBSSxJQUNoQixFQUFlLENBQUMsSUFBaUIsQ0FDckMsR0FBSSxDQUFDLEVBQVUsSUFB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
3
+ //# debugId=0766C161CC73C0CE64756E2164756E21
4
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3B1bHNlLnRzeCIsICIuLi9zcmMvcmVuZGVyZXIudHN4IiwgIi4uL3NyYy92ZG9tLnRzIiwgIi4uL3NyYy9zZXJpYWxpemUvZXh0cmFjdG9yLnRzIiwgIi4uL3NyYy9zZXJpYWxpemUvZWxlbWVudHMudHMiLCAiLi4vc3JjL3NlcmlhbGl6ZS9ldmVudHMudHMiLCAiLi4vc3JjL3NlcmlhbGl6ZS92My50cyIsICIuLi9zcmMvY2xpZW50LnRzeCIsICIuLi9zcmMvY2hhbm5lbC50cyIsICIuLi9zcmMvdXNlUHVsc2VDaGFubmVsLnRzIiwgIi4uL3NyYy9mb3JtLnRzeCIsICIuLi9zcmMvdHJhbnNwb3J0LnRzIiwgIi4uL3NyYy9oZWxwZXJzLnRzIiwgIi4uL3NyYy9zZXJpYWxpemUvY2xlYW4udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiaW1wb3J0IFJlYWN0LCB7XG4gIHVzZUVmZmVjdCxcbiAgdXNlU3RhdGUsXG4gIHVzZU1lbW8sXG4gIGNyZWF0ZUNvbnRleHQsXG4gIHVzZUNvbnRleHQsXG4gIHR5cGUgQ29tcG9uZW50VHlwZSxcbn0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBWRE9NUmVuZGVyZXIsIGFwcGx5VXBkYXRlcyB9IGZyb20gXCIuL3JlbmRlcmVyXCI7XG5pbXBvcnQgeyBQdWxzZVNvY2tldElPQ2xpZW50IH0gZnJvbSBcIi4vY2xpZW50XCI7XG5pbXBvcnQgdHlwZSB7IFZET00sIENvbXBvbmVudFJlZ2lzdHJ5LCBSZWdpc3RyeUVudHJ5IH0gZnJvbSBcIi4vdmRvbVwiO1xuaW1wb3J0IHsgdXNlTG9jYXRpb24sIHVzZVBhcmFtcywgdXNlTmF2aWdhdGUgfSBmcm9tIFwicmVhY3Qtcm91dGVyXCI7XG5pbXBvcnQgdHlwZSB7IFNlcnZlckVycm9ySW5mb30gZnJvbSBcIi4vbWVzc2FnZXNcIjtcbmltcG9ydCB0eXBlIHsgUm91dGVJbmZvIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVHlwZXNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHVsc2VDb25maWcge1xuICBzZXJ2ZXJBZGRyZXNzOiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIFB1bHNlUHJlcmVuZGVyVmlldyA9IHtcbiAgdmRvbTogVkRPTTtcbiAgY2FsbGJhY2tzOiBzdHJpbmdbXTtcbiAgcmVuZGVyX3Byb3BzOiBzdHJpbmdbXTtcbiAgY3NzX3JlZnM6IHN0cmluZ1tdO1xufTtcblxuZXhwb3J0IHR5cGUgUHVsc2VQcmVyZW5kZXIgPSB7XG4gIHJlbmRlcklkOiBzdHJpbmc7XG4gIHZpZXdzOiBSZWNvcmQ8c3RyaW5nLCBQdWxzZVByZXJlbmRlclZpZXc+O1xufTtcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBDb250ZXh0IGFuZCBIb29rc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLy8gQ29udGV4dCBmb3IgdGhlIGNsaWVudCwgcHJvdmlkZWQgYnkgUHVsc2VQcm92aWRlclxuY29uc3QgUHVsc2VDbGllbnRDb250ZXh0ID0gY3JlYXRlQ29udGV4dDxQdWxzZVNvY2tldElPQ2xpZW50IHwgbnVsbD4obnVsbCk7XG5jb25zdCBQdWxzZVByZXJlbmRlckNvbnRleHQgPSBjcmVhdGVDb250ZXh0PFB1bHNlUHJlcmVuZGVyIHwgbnVsbD4obnVsbCk7XG5cbmV4cG9ydCBjb25zdCB1c2VQdWxzZUNsaWVudCA9ICgpID0+IHtcbiAgY29uc3QgY2xpZW50ID0gdXNlQ29udGV4dChQdWxzZUNsaWVudENvbnRleHQpO1xuICBpZiAoIWNsaWVudCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcInVzZVB1bHNlQ2xpZW50IG11c3QgYmUgdXNlZCB3aXRoaW4gYSBQdWxzZVByb3ZpZGVyXCIpO1xuICB9XG4gIHJldHVybiBjbGllbnQ7XG59O1xuXG5leHBvcnQgY29uc3QgdXNlUHVsc2VQcmVyZW5kZXIgPSAocGF0aDogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IGN0eCA9IHVzZUNvbnRleHQoUHVsc2VQcmVyZW5kZXJDb250ZXh0KTtcbiAgaWYgKCFjdHgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1c2VQdWxzZVByZXJlbmRlciBtdXN0IGJlIHVzZWQgd2l0aGluIGEgUHVsc2VQcm92aWRlclwiKTtcbiAgfVxuICBjb25zdCB2aWV3ID0gY3R4LnZpZXdzW3BhdGhdO1xuICBpZiAoIXZpZXcpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHByZXJlbmRlciBmb3VuZCBmb3IgJyR7cGF0aH0nYCk7XG4gIH1cbiAgcmV0dXJuIHZpZXc7XG59O1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUHJvdmlkZXJcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHVsc2VQcm92aWRlclByb3BzIHtcbiAgY2hpbGRyZW46IFJlYWN0LlJlYWN0Tm9kZTtcbiAgY29uZmlnOiBQdWxzZUNvbmZpZztcbiAgcHJlcmVuZGVyOiBQdWxzZVByZXJlbmRlcjtcbn1cblxuY29uc3QgaW5Ccm93c2VyID0gdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIFB1bHNlUHJvdmlkZXIoe1xuICBjaGlsZHJlbixcbiAgY29uZmlnLFxuICBwcmVyZW5kZXIsXG59OiBQdWxzZVByb3ZpZGVyUHJvcHMpIHtcbiAgY29uc3QgW2Nvbm5lY3RlZCwgc2V0Q29ubmVjdGVkXSA9IHVzZVN0YXRlKHRydWUpO1xuICBjb25zdCByck5hdmlnYXRlID0gdXNlTmF2aWdhdGUoKTtcbiAgY29uc3QgeyByZW5kZXJJZCB9ID0gcHJlcmVuZGVyO1xuXG4gIGNvbnN0IGNsaWVudCA9IHVzZU1lbW8oXG4gICAgKCkgPT4gbmV3IFB1bHNlU29ja2V0SU9DbGllbnQoY29uZmlnLnNlcnZlckFkZHJlc3MsIHJlbmRlcklkLCByck5hdmlnYXRlKSxcbiAgICBbY29uZmlnLnNlcnZlckFkZHJlc3MsIHJyTmF2aWdhdGUsIHJlbmRlcklkXVxuICApO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiBjbGllbnQub25Db25uZWN0aW9uQ2hhbmdlKHNldENvbm5lY3RlZCksIFtjbGllbnRdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChpbkJyb3dzZXIpIHtcbiAgICAgIGNsaWVudC5jb25uZWN0KCk7XG4gICAgICByZXR1cm4gKCkgPT4gY2xpZW50LmRpc2Nvbm5lY3QoKTtcbiAgICB9XG4gIH0sIFtjbGllbnRdKTtcblxuICByZXR1cm4gKFxuICAgIDxQdWxzZUNsaWVudENvbnRleHQuUHJvdmlkZXIgdmFsdWU9e2NsaWVudH0+XG4gICAgICA8UHVsc2VQcmVyZW5kZXJDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXtwcmVyZW5kZXJ9PlxuICAgICAgICB7IWNvbm5lY3RlZCAmJiAoXG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgcG9zaXRpb246IFwiZml4ZWRcIixcbiAgICAgICAgICAgICAgYm90dG9tOiBcIjIwcHhcIixcbiAgICAgICAgICAgICAgcmlnaHQ6IFwiMjBweFwiLFxuICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwicmVkXCIsXG4gICAgICAgICAgICAgIGNvbG9yOiBcIndoaXRlXCIsXG4gICAgICAgICAgICAgIHBhZGRpbmc6IFwiMTBweFwiLFxuICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6IFwiNXB4XCIsXG4gICAgICAgICAgICAgIHpJbmRleDogMTAwMCxcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgPlxuICAgICAgICAgICAgRmFpbGVkIHRvIGNvbm5lY3QgdG8gdGhlIHNlcnZlci5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKX1cbiAgICAgICAge2NoaWxkcmVufVxuICAgICAgPC9QdWxzZVByZXJlbmRlckNvbnRleHQuUHJvdmlkZXI+XG4gICAgPC9QdWxzZUNsaWVudENvbnRleHQuUHJvdmlkZXI+XG4gICk7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBWaWV3XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgaW50ZXJmYWNlIFB1bHNlVmlld1Byb3BzIHtcbiAgZXh0ZXJuYWxDb21wb25lbnRzOiBDb21wb25lbnRSZWdpc3RyeTtcbiAgcGF0aDogc3RyaW5nO1xuICBjc3NNb2R1bGVzOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Pjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFB1bHNlVmlldyh7XG4gIGV4dGVybmFsQ29tcG9uZW50cyxcbiAgcGF0aCxcbiAgY3NzTW9kdWxlcyxcbn06IFB1bHNlVmlld1Byb3BzKSB7XG4gIGNvbnN0IGNsaWVudCA9IHVzZVB1bHNlQ2xpZW50KCk7XG4gIGNvbnN0IGluaXRpYWxWaWV3ID0gdXNlUHVsc2VQcmVyZW5kZXIocGF0aCk7XG4gIGNvbnN0IGluaXRpYWxWRE9NID0gaW5pdGlhbFZpZXcudmRvbTtcbiAgY29uc3QgcmVuZGVyZXIgPSB1c2VNZW1vKFxuICAgICgpID0+XG4gICAgICBuZXcgVkRPTVJlbmRlcmVyKFxuICAgICAgICBjbGllbnQsXG4gICAgICAgIHBhdGgsXG4gICAgICAgIGV4dGVybmFsQ29tcG9uZW50cyxcbiAgICAgICAgY3NzTW9kdWxlcyxcbiAgICAgICAgaW5pdGlhbFZpZXcuY2FsbGJhY2tzLFxuICAgICAgICBpbml0aWFsVmlldy5yZW5kZXJfcHJvcHMsXG4gICAgICAgIGluaXRpYWxWaWV3LmNzc19yZWZzXG4gICAgICApLFxuICAgIFtjbGllbnQsIHBhdGgsIGV4dGVybmFsQ29tcG9uZW50cywgY3NzTW9kdWxlcywgaW5pdGlhbFZpZXddXG4gICk7XG4gIGNvbnN0IFt0cmVlLCBzZXRUcmVlXSA9IHVzZVN0YXRlPFJlYWN0LlJlYWN0Tm9kZT4oKCkgPT5cbiAgICByZW5kZXJlci5yZW5kZXJOb2RlKGluaXRpYWxWRE9NKVxuICApO1xuICBjb25zdCBbc2VydmVyRXJyb3IsIHNldFNlcnZlckVycm9yXSA9IHVzZVN0YXRlPFNlcnZlckVycm9ySW5mbyB8IG51bGw+KG51bGwpO1xuXG4gIGNvbnN0IGxvY2F0aW9uID0gdXNlTG9jYXRpb24oKTtcbiAgY29uc3QgcGFyYW1zID0gdXNlUGFyYW1zKCk7XG5cbiAgY29uc3Qgcm91dGVJbmZvID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgeyBcIipcIjogY2F0Y2hhbGwgPSBcIlwiLCAuLi5wYXRoUGFyYW1zIH0gPSBwYXJhbXM7XG4gICAgY29uc3QgcXVlcnlQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKGxvY2F0aW9uLnNlYXJjaCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGhhc2g6IGxvY2F0aW9uLmhhc2gsXG4gICAgICBwYXRobmFtZTogbG9jYXRpb24ucGF0aG5hbWUsXG4gICAgICBxdWVyeTogbG9jYXRpb24uc2VhcmNoLFxuICAgICAgcXVlcnlQYXJhbXM6IE9iamVjdC5mcm9tRW50cmllcyhxdWVyeVBhcmFtcy5lbnRyaWVzKCkpLFxuICAgICAgcGF0aFBhcmFtcyxcbiAgICAgIGNhdGNoYWxsOiBjYXRjaGFsbC5sZW5ndGggPiAwID8gY2F0Y2hhbGwuc3BsaXQoXCIvXCIpIDogW10sXG4gICAgfSBzYXRpc2ZpZXMgUm91dGVJbmZvO1xuICB9LCBbXG4gICAgbG9jYXRpb24uaGFzaCxcbiAgICBsb2NhdGlvbi5wYXRobmFtZSxcbiAgICBsb2NhdGlvbi5zZWFyY2gsXG4gICAgSlNPTi5zdHJpbmdpZnkocGFyYW1zKSxcbiAgXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoaW5Ccm93c2VyKSB7XG4gICAgICBjbGllbnQubW91bnRWaWV3KHBhdGgsIHtcbiAgICAgICAgcm91dGVJbmZvLFxuICAgICAgICBvbkluaXQ6ICh2ZG9tLCBjYWxsYmFja3MsIHJlbmRlclByb3BzLCBjc3NSZWZzKSA9PiB7XG4gICAgICAgICAgcmVuZGVyZXIuc2V0Q2FsbGJhY2tzKGNhbGxiYWNrcyk7XG4gICAgICAgICAgcmVuZGVyZXIuc2V0UmVuZGVyUHJvcHMocmVuZGVyUHJvcHMpO1xuICAgICAgICAgIHJlbmRlcmVyLnNldENzc1JlZnMoY3NzUmVmcyk7XG4gICAgICAgICAgc2V0VHJlZShyZW5kZXJlci5yZW5kZXJOb2RlKHZkb20pKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25VcGRhdGU6IChvcHMpID0+IHtcbiAgICAgICAgICBzZXRUcmVlKChwcmV2KSA9PlxuICAgICAgICAgICAgcHJldiA9PSBudWxsID8gcHJldiA6IGFwcGx5VXBkYXRlcyhwcmV2LCBvcHMsIHJlbmRlcmVyKVxuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IG9mZkVyciA9IGNsaWVudC5vblNlcnZlckVycm9yKChwLCBlcnIpID0+IHtcbiAgICAgICAgaWYgKHAgPT09IHBhdGgpIHNldFNlcnZlckVycm9yKGVycik7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIG9mZkVycigpO1xuICAgICAgICBjbGllbnQudW5tb3VudChwYXRoKTtcbiAgICAgIH07XG4gICAgfVxuICAgIC8vIHJvdXRlSW5mbyBpcyBOT1QgaW5jbHVkZWQgaGVyZSBvbiBwdXJwb3NlXG4gIH0sIFtjbGllbnRdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChpbkJyb3dzZXIpIHtcbiAgICAgIGNsaWVudC5uYXZpZ2F0ZShwYXRoLCByb3V0ZUluZm8pO1xuICAgIH1cbiAgfSwgW2NsaWVudCwgcGF0aCwgcm91dGVJbmZvXSk7XG5cbiAgaWYgKHNlcnZlckVycm9yKSB7XG4gICAgcmV0dXJuIDxTZXJ2ZXJFcnJvciBlcnJvcj17c2VydmVyRXJyb3J9IC8+O1xuICB9XG5cbiAgcmV0dXJuIHRyZWU7XG59XG5cbmZ1bmN0aW9uIFNlcnZlckVycm9yKHsgZXJyb3IgfTogeyBlcnJvcjogU2VydmVyRXJyb3JJbmZvIH0pIHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICBzdHlsZT17e1xuICAgICAgICBwYWRkaW5nOiAxNixcbiAgICAgICAgYm9yZGVyOiBcIjFweCBzb2xpZCAjZTAwXCIsXG4gICAgICAgIGJhY2tncm91bmQ6IFwiI2ZmZjVmNVwiLFxuICAgICAgICBjb2xvcjogXCIjOTAwXCIsXG4gICAgICAgIGZvbnRGYW1pbHk6XG4gICAgICAgICAgJ3VpLW1vbm9zcGFjZSwgU0ZNb25vLVJlZ3VsYXIsIE1lbmxvLCBNb25hY28sIENvbnNvbGFzLCBcIkxpYmVyYXRpb24gTW9ub1wiLCBcIkNvdXJpZXIgTmV3XCIsIG1vbm9zcGFjZScsXG4gICAgICAgIHdoaXRlU3BhY2U6IFwicHJlLXdyYXBcIixcbiAgICAgIH19XG4gICAgPlxuICAgICAgPGRpdiBzdHlsZT17eyBmb250V2VpZ2h0OiA3MDAsIG1hcmdpbkJvdHRvbTogOCB9fT5cbiAgICAgICAgU2VydmVyIEVycm9yIGR1cmluZyB7ZXJyb3IucGhhc2V9XG4gICAgICA8L2Rpdj5cbiAgICAgIHtlcnJvci5tZXNzYWdlICYmIDxkaXY+e2Vycm9yLm1lc3NhZ2V9PC9kaXY+fVxuICAgICAge2Vycm9yLnN0YWNrICYmIChcbiAgICAgICAgPGRldGFpbHMgb3BlbiBzdHlsZT17eyBtYXJnaW5Ub3A6IDggfX0+XG4gICAgICAgICAgPHN1bW1hcnk+U3RhY2sgdHJhY2U8L3N1bW1hcnk+XG4gICAgICAgICAgPHByZSBzdHlsZT17eyBtYXJnaW46IDAgfX0+e2Vycm9yLnN0YWNrfTwvcHJlPlxuICAgICAgICA8L2RldGFpbHM+XG4gICAgICApfVxuICAgIDwvZGl2PlxuICApO1xufVxuIiwKICAgICJpbXBvcnQgUmVhY3QsIHtcbiAgY2xvbmVFbGVtZW50LFxuICBjcmVhdGVFbGVtZW50LFxuICBpc1ZhbGlkRWxlbWVudCxcbiAgbGF6eSxcbiAgU3VzcGVuc2UsXG4gIHR5cGUgQ29tcG9uZW50VHlwZSxcbn0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgdHlwZSB7IENvbXBvbmVudFJlZ2lzdHJ5LCBWRE9NTm9kZSwgVkRPTVVwZGF0ZSwgVkRPTSB9IGZyb20gXCIuL3Zkb21cIjtcbmltcG9ydCB7XG4gIEZSQUdNRU5UX1RBRyxcbiAgaXNFbGVtZW50Tm9kZSxcbiAgaXNNb3VudFBvaW50Tm9kZSxcbiAgTU9VTlRfUE9JTlRfUFJFRklYLFxufSBmcm9tIFwiLi92ZG9tXCI7XG5pbXBvcnQgdHlwZSB7IFB1bHNlU29ja2V0SU9DbGllbnQgfSBmcm9tIFwiLi9jbGllbnRcIjtcblxuZXhwb3J0IGNsYXNzIFZET01SZW5kZXJlciB7XG4gIHByaXZhdGUgY2FsbGJhY2tzOiBTZXQ8c3RyaW5nPjtcbiAgcHJpdmF0ZSBjYWxsYmFja0NhY2hlOiBNYXA8c3RyaW5nLCBGdW5jdGlvbj47XG4gIHByaXZhdGUgcmVuZGVyUHJvcEtleXM6IFNldDxzdHJpbmc+O1xuICBwcml2YXRlIGNzc1Byb3BzOiBTZXQ8c3RyaW5nPjtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjbGllbnQ6IFB1bHNlU29ja2V0SU9DbGllbnQsXG4gICAgcHJpdmF0ZSBwYXRoOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBjb21wb25lbnRzOiBDb21wb25lbnRSZWdpc3RyeSxcbiAgICBwcml2YXRlIGNzc01vZHVsZXM6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+LFxuICAgIGluaXRpYWxDYWxsYmFja3M6IHN0cmluZ1tdID0gW10sXG4gICAgaW5pdGlhbFJlbmRlclByb3BzOiBzdHJpbmdbXSA9IFtdLFxuICAgIGluaXRpYWxDc3NSZWZzOiBzdHJpbmdbXSA9IFtdXG4gICkge1xuICAgIHRoaXMuY2FsbGJhY2tzID0gbmV3IFNldChpbml0aWFsQ2FsbGJhY2tzKTtcbiAgICB0aGlzLmNhbGxiYWNrQ2FjaGUgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5yZW5kZXJQcm9wS2V5cyA9IG5ldyBTZXQoaW5pdGlhbFJlbmRlclByb3BzKTtcbiAgICB0aGlzLmNzc1Byb3BzID0gbmV3IFNldChpbml0aWFsQ3NzUmVmcyk7XG4gICAgdGhpcy5zZXRDYWxsYmFja3MoaW5pdGlhbENhbGxiYWNrcyk7XG4gIH1cblxuICBzZXRDYWxsYmFja3Moa2V5czogc3RyaW5nW10pIHtcbiAgICB0aGlzLmNhbGxiYWNrcyA9IG5ldyBTZXQoa2V5cyk7XG4gIH1cblxuICBzZXRSZW5kZXJQcm9wcyhrZXlzOiBzdHJpbmdbXSkge1xuICAgIHRoaXMucmVuZGVyUHJvcEtleXMgPSBuZXcgU2V0KGtleXMpO1xuICB9XG5cbiAgc2V0Q3NzUmVmcyhlbnRyaWVzOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuY3NzUHJvcHMgPSBuZXcgU2V0KGVudHJpZXMpO1xuICB9XG5cbiAgYXBwbHlDYWxsYmFja0RlbHRhKGRlbHRhOiB7IGFkZD86IHN0cmluZ1tdOyByZW1vdmU/OiBzdHJpbmdbXSB9KSB7XG4gICAgLy8gT25seSB1cGRhdGUgdGhlIGludGVybmFsIGNhbGxiYWNrIHBhdGggcmVnaXN0cnkgYW5kIGNhY2hlLiBXZSByZWx5IG9uXG4gICAgLy8gYWNjb21wYW55aW5nIHVwZGF0ZV9wcm9wcyBvcGVyYXRpb25zIHRoYXQgY29udGFpbiB0aGUgXCIkY2JcIiBwbGFjZWhvbGRlclxuICAgIC8vIHRvIHRyaWdnZXIgcHJvcCB1cGRhdGVzOyB0cmFuc2Zvcm1WYWx1ZSB3aWxsIHJlc29sdmUgdG8gZnVuY3Rpb25zLlxuICAgIGlmIChkZWx0YS5yZW1vdmUpIHtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGRlbHRhLnJlbW92ZSkge1xuICAgICAgICB0aGlzLmNhbGxiYWNrcy5kZWxldGUoa2V5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGRlbHRhLmFkZCkge1xuICAgICAgZm9yIChjb25zdCBrZXkgb2YgZGVsdGEuYWRkKSB7XG4gICAgICAgIHRoaXMuY2FsbGJhY2tzLmFkZChrZXkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFwcGx5UmVuZGVyUHJvcHNEZWx0YShkZWx0YTogeyBhZGQ/OiBzdHJpbmdbXTsgcmVtb3ZlPzogc3RyaW5nW10gfSkge1xuICAgIGlmIChkZWx0YS5yZW1vdmUpIHtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGRlbHRhLnJlbW92ZSkge1xuICAgICAgICB0aGlzLnJlbmRlclByb3BLZXlzLmRlbGV0ZShrZXkpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZGVsdGEuYWRkKSB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBkZWx0YS5hZGQpIHtcbiAgICAgICAgdGhpcy5yZW5kZXJQcm9wS2V5cy5hZGQoa2V5KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhcHBseUNzc1JlZnNEZWx0YShkZWx0YTogeyBzZXQ/OiBzdHJpbmdbXTsgcmVtb3ZlPzogc3RyaW5nW10gfSkge1xuICAgIGlmIChkZWx0YS5zZXQpIHtcbiAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBkZWx0YS5zZXQpIHtcbiAgICAgICAgdGhpcy5jc3NQcm9wcy5hZGQocHJvcCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChkZWx0YS5yZW1vdmUpIHtcbiAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBkZWx0YS5yZW1vdmUpIHtcbiAgICAgICAgdGhpcy5jc3NQcm9wcy5kZWxldGUocHJvcCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0Q2FsbGJhY2socGF0aDogc3RyaW5nLCBwcm9wOiBzdHJpbmcpIHtcbiAgICBjb25zdCBrZXkgPSB0aGlzLnByb3BQYXRoKHBhdGgsIHByb3ApO1xuICAgIGxldCBmbiA9IHRoaXMuY2FsbGJhY2tDYWNoZS5nZXQoa2V5KTtcbiAgICBpZiAoIWZuKSB7XG4gICAgICBmbiA9ICguLi5hcmdzOiBhbnlbXSkgPT4gdGhpcy5jbGllbnQuaW52b2tlQ2FsbGJhY2sodGhpcy5wYXRoLCBrZXksIGFyZ3MpO1xuICAgICAgdGhpcy5jYWxsYmFja0NhY2hlLnNldChrZXksIGZuKTtcbiAgICB9XG4gICAgcmV0dXJuIGZuO1xuICB9XG5cbiAgcmVuZGVyTm9kZShub2RlOiBWRE9NTm9kZSwgY3VycmVudFBhdGggPSBcIlwiKTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgICAvLyBIYW5kbGUgcHJpbWl0aXZlcyBlYXJseVxuICAgIGlmIChcbiAgICAgIG5vZGUgPT0gbnVsbCB8fCAvLyBjYXRjaGVzIGJvdGggbnVsbCBhbmQgdW5kZWZpbmVkXG4gICAgICB0eXBlb2Ygbm9kZSA9PT0gXCJib29sZWFuXCIgfHxcbiAgICAgIHR5cGVvZiBub2RlID09PSBcIm51bWJlclwiIHx8XG4gICAgICB0eXBlb2Ygbm9kZSA9PT0gXCJzdHJpbmdcIlxuICAgICkge1xuICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuXG4gICAgLy8gRWxlbWVudCBub2Rlc1xuICAgIGlmIChpc0VsZW1lbnROb2RlKG5vZGUpKSB7XG4gICAgICBjb25zdCB7IHRhZywgcHJvcHMgPSB7fSwgY2hpbGRyZW4gPSBbXSB9ID0gbm9kZTtcblxuICAgICAgY29uc3QgbmV3UHJvcHM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICAgIGZvciAoY29uc3QgW3Byb3BOYW1lLCBwcm9wVmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHByb3BzKSkge1xuICAgICAgICBuZXdQcm9wc1twcm9wTmFtZV0gPSB0aGlzLnRyYW5zZm9ybVZhbHVlKFxuICAgICAgICAgIGN1cnJlbnRQYXRoLFxuICAgICAgICAgIHByb3BOYW1lLFxuICAgICAgICAgIHByb3BWYWx1ZVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAobm9kZS5rZXkpIHtcbiAgICAgICAgbmV3UHJvcHMua2V5ID0gbm9kZS5rZXk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlbmRlcmVkQ2hpbGRyZW4gPSBbXTtcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBjaGlsZHJlbi5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlbltpbmRleF0hO1xuICAgICAgICBjb25zdCBjaGlsZFBhdGggPSBjdXJyZW50UGF0aFxuICAgICAgICAgID8gYCR7Y3VycmVudFBhdGh9LiR7aW5kZXh9YFxuICAgICAgICAgIDogU3RyaW5nKGluZGV4KTtcbiAgICAgICAgcmVuZGVyZWRDaGlsZHJlbi5wdXNoKHRoaXMucmVuZGVyTm9kZShjaGlsZCwgY2hpbGRQYXRoKSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc01vdW50UG9pbnROb2RlKG5vZGUpKSB7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudEtleSA9IG5vZGUudGFnLnNsaWNlKE1PVU5UX1BPSU5UX1BSRUZJWC5sZW5ndGgpO1xuICAgICAgICBjb25zdCBDb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudHNbY29tcG9uZW50S2V5XSE7XG4gICAgICAgIGlmICghQ29tcG9uZW50KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYENvdWxkIG5vdCBmaW5kIGNvbXBvbmVudCAke2NvbXBvbmVudEtleX0uIFRoaXMgaXMgYSBQdWxzZSBpbnRlcm5hbCBlcnJvci5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY3JlYXRlRWxlbWVudChDb21wb25lbnQsIG5ld1Byb3BzLCAuLi5yZW5kZXJlZENoaWxkcmVuKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoXG4gICAgICAgIHRhZyA9PT0gRlJBR01FTlRfVEFHID8gUmVhY3QuRnJhZ21lbnQgOiB0YWcsXG4gICAgICAgIG5ld1Byb3BzLFxuICAgICAgICAuLi5yZW5kZXJlZENoaWxkcmVuXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIGZvciB1bmtub3duIG5vZGUgdHlwZXNcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiVW5rbm93biBWRE9NIG5vZGUgdHlwZTpcIiwgbm9kZSk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBwcm9wUGF0aChwYXRoOiBzdHJpbmcsIHByb3A6IHN0cmluZykge1xuICAgIHJldHVybiBwYXRoID8gYCR7cGF0aH0uJHtwcm9wfWAgOiBwcm9wO1xuICB9XG5cbiAgdHJhbnNmb3JtVmFsdWUocGF0aDogc3RyaW5nLCBrZXk6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgIGNvbnN0IHByb3BQYXRoID0gdGhpcy5wcm9wUGF0aChwYXRoLCBrZXkpO1xuICAgIGlmICh0aGlzLmNhbGxiYWNrcy5oYXMocHJvcFBhdGgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRDYWxsYmFjayhwYXRoLCBrZXkpO1xuICAgIH1cbiAgICBpZiAodGhpcy5yZW5kZXJQcm9wS2V5cy5oYXMocHJvcFBhdGgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZW5kZXJOb2RlKHZhbHVlLCBwcm9wUGF0aCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmNzc1Byb3BzLmhhcyhwcm9wUGF0aCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlc29sdmVDc3NUb2tlbih2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZUNzc1Rva2VuKHRva2VuOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGlkeCA9IHRva2VuLmluZGV4T2YoXCI6XCIpO1xuICAgIGlmIChpZHggPT09IC0xKSB7XG4gICAgICByZXR1cm4gdG9rZW47XG4gICAgfVxuICAgIGNvbnN0IG1vZHVsZUlkID0gdG9rZW4uc2xpY2UoMCwgaWR4KTtcbiAgICBjb25zdCBjbGFzc05hbWUgPSB0b2tlbi5zbGljZShpZHggKyAxKTtcbiAgICBpZiAoIW1vZHVsZUlkIHx8ICFjbGFzc05hbWUpIHtcbiAgICAgIHJldHVybiB0b2tlbjtcbiAgICB9XG4gICAgY29uc3QgbW9kID0gdGhpcy5jc3NNb2R1bGVzW21vZHVsZUlkXTtcbiAgICBpZiAoIW1vZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgUmVjZWl2ZWQgQ1NTIHJlZmVyZW5jZSBmb3IgdW5rbm93biBtb2R1bGUgJyR7bW9kdWxlSWR9J2BcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHJlc29sdmVkID0gbW9kW2NsYXNzTmFtZV07XG4gICAgaWYgKHR5cGVvZiByZXNvbHZlZCAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgUmVjZWl2ZWQgQ1NTIHJlZmVyZW5jZSBmb3IgbWlzc2luZyBjbGFzcyAnJHtjbGFzc05hbWV9JyBpbiBtb2R1bGUgJyR7bW9kdWxlSWR9J2BcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiByZXNvbHZlZDtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQ2FsbGJhY2tzT25UcmVlKFxuICAgIG5vZGU6IFJlYWN0LlJlYWN0Tm9kZSxcbiAgICBwYXJ0czogc3RyaW5nW10sXG4gICAgZGVwdGg6IG51bWJlcixcbiAgICBjdXJyZW50UGF0aDogc3RyaW5nLFxuICAgIGJlZm9yZTogU2V0PHN0cmluZz4sXG4gICAgYWZ0ZXI6IFNldDxzdHJpbmc+XG4gICk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gICAgaWYgKGRlcHRoIDwgcGFydHMubGVuZ3RoKSB7XG4gICAgICBhc3NlcnRJc0VsZW1lbnQobm9kZSwgcGFydHMsIGRlcHRoKTtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBub2RlIGFzIFJlYWN0LlJlYWN0RWxlbWVudDxSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbD47XG4gICAgICBjb25zdCBzZWdtZW50ID0gcGFydHNbZGVwdGhdITtcbiAgICAgIGNvbnN0IGNoaWxkSWR4ID0gTnVtYmVyKHNlZ21lbnQpO1xuICAgICAgY29uc3QgbmV4dFBhdGggPSBjdXJyZW50UGF0aCA/IGAke2N1cnJlbnRQYXRofS4ke3NlZ21lbnR9YCA6IHNlZ21lbnQ7XG4gICAgICBpZiAoIU51bWJlci5pc05hTihjaGlsZElkeCkpIHtcbiAgICAgICAgY29uc3QgY2hpbGRyZW5BcnIgPSBlbnN1cmVDaGlsZHJlbkFycmF5KGVsZW1lbnQpO1xuICAgICAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuQXJyW2NoaWxkSWR4XTtcbiAgICAgICAgY29uc3QgdXBkYXRlZENoaWxkID0gdGhpcy51cGRhdGVDYWxsYmFja3NPblRyZWUoXG4gICAgICAgICAgY2hpbGQsXG4gICAgICAgICAgcGFydHMsXG4gICAgICAgICAgZGVwdGggKyAxLFxuICAgICAgICAgIG5leHRQYXRoLFxuICAgICAgICAgIGJlZm9yZSxcbiAgICAgICAgICBhZnRlclxuICAgICAgICApO1xuICAgICAgICBpZiAodXBkYXRlZENoaWxkID09PSBjaGlsZCkge1xuICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICAgIGNoaWxkcmVuQXJyW2NoaWxkSWR4XSA9IHVwZGF0ZWRDaGlsZCBhcyBhbnk7XG4gICAgICAgIHJldHVybiBjbG9uZUVsZW1lbnQoZWxlbWVudCwgdW5kZWZpbmVkLCAuLi5jaGlsZHJlbkFycik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBiYXNlUHJvcHMgPSAoZWxlbWVudC5wcm9wcyA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICAgICAgY29uc3QgY2hpbGQgPSBiYXNlUHJvcHNbc2VnbWVudF07XG4gICAgICAgIGNvbnN0IHVwZGF0ZWRDaGlsZCA9IHRoaXMudXBkYXRlQ2FsbGJhY2tzT25UcmVlKFxuICAgICAgICAgIGNoaWxkLFxuICAgICAgICAgIHBhcnRzLFxuICAgICAgICAgIGRlcHRoICsgMSxcbiAgICAgICAgICBuZXh0UGF0aCxcbiAgICAgICAgICBiZWZvcmUsXG4gICAgICAgICAgYWZ0ZXJcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHVwZGF0ZWRDaGlsZCA9PT0gY2hpbGQpIHtcbiAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2xvbmVFbGVtZW50KGVsZW1lbnQsIHtcbiAgICAgICAgICAuLi5iYXNlUHJvcHMsXG4gICAgICAgICAgW3NlZ21lbnRdOiB1cGRhdGVkQ2hpbGQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghaXNWYWxpZEVsZW1lbnQobm9kZSkpIHtcbiAgICAgIHJldHVybiBub2RlO1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnQgPSBub2RlIGFzIFJlYWN0LlJlYWN0RWxlbWVudDxSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbD47XG4gICAgY29uc3QgY3VycmVudFByb3BzID0gKGVsZW1lbnQucHJvcHMgPz8ge30pIGFzIFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgbGV0IGNoYW5nZWQgPSBmYWxzZTtcbiAgICBjb25zdCBuZXh0UHJvcHM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7IC4uLmN1cnJlbnRQcm9wcyB9O1xuXG4gICAgZm9yIChjb25zdCBwcm9wIG9mIGJlZm9yZSkge1xuICAgICAgaWYgKCFhZnRlci5oYXMocHJvcCkgJiYgcHJvcCBpbiBuZXh0UHJvcHMpIHtcbiAgICAgICAgZGVsZXRlIG5leHRQcm9wc1twcm9wXTtcbiAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBwcm9wIG9mIGFmdGVyKSB7XG4gICAgICBjb25zdCBmbiA9IHRoaXMuZ2V0Q2FsbGJhY2soY3VycmVudFBhdGgsIHByb3ApO1xuICAgICAgaWYgKG5leHRQcm9wc1twcm9wXSAhPT0gZm4pIHtcbiAgICAgICAgbmV4dFByb3BzW3Byb3BdID0gZm47XG4gICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghY2hhbmdlZCkge1xuICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIHJldHVybiBjbG9uZUVsZW1lbnQoZWxlbWVudCwgbmV4dFByb3BzKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0c0VxdWFsKGxlZnQ6IFNldDxzdHJpbmc+LCByaWdodDogU2V0PHN0cmluZz4pOiBib29sZWFuIHtcbiAgICBpZiAobGVmdC5zaXplICE9PSByaWdodC5zaXplKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgbGVmdCkge1xuICAgICAgaWYgKCFyaWdodC5oYXModmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFVwZGF0ZSBGdW5jdGlvbnMgKHNoYWxsb3ctY2xvbmUgYWxvbmcgdXBkYXRlIHBhdGgpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5mdW5jdGlvbiBlbnN1cmVDaGlsZHJlbkFycmF5KGVsOiBSZWFjdC5SZWFjdEVsZW1lbnQpOiBSZWFjdC5SZWFjdE5vZGVbXSB7XG4gIGNvbnN0IGNoaWxkcmVuID0gKGVsLnByb3BzIGFzIGFueSk/LmNoaWxkcmVuIGFzIFJlYWN0LlJlYWN0Tm9kZSB8IHVuZGVmaW5lZDtcbiAgaWYgKGNoaWxkcmVuID09IG51bGwpIHJldHVybiBbXTtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoY2hpbGRyZW4pID8gY2hpbGRyZW4uc2xpY2UoKSA6IFtjaGlsZHJlbl07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseVVwZGF0ZXMoXG4gIGluaXRpYWxUcmVlOiBSZWFjdC5SZWFjdE5vZGUsXG4gIHVwZGF0ZXM6IFZET01VcGRhdGVbXSxcbiAgcmVuZGVyZXI6IFZET01SZW5kZXJlclxuKTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgbGV0IG5ld1RyZWU6IFJlYWN0LlJlYWN0Tm9kZSA9IGluaXRpYWxUcmVlO1xuICBmb3IgKGNvbnN0IHVwZGF0ZSBvZiB1cGRhdGVzKSB7XG4gICAgaWYgKHVwZGF0ZS50eXBlID09PSBcInVwZGF0ZV9jYWxsYmFja3NcIikge1xuICAgICAgcmVuZGVyZXIuYXBwbHlDYWxsYmFja0RlbHRhKHVwZGF0ZS5kYXRhKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAodXBkYXRlLnR5cGUgPT09IFwidXBkYXRlX2Nzc19yZWZzXCIpIHtcbiAgICAgIHJlbmRlcmVyLmFwcGx5Q3NzUmVmc0RlbHRhKHVwZGF0ZS5kYXRhKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAodXBkYXRlLnR5cGUgPT09IFwidXBkYXRlX3JlbmRlcl9wcm9wc1wiKSB7XG4gICAgICByZW5kZXJlci5hcHBseVJlbmRlclByb3BzRGVsdGEodXBkYXRlLmRhdGEpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgcGFydHMgPSB1cGRhdGUucGF0aC5zcGxpdChcIi5cIikuZmlsdGVyKChzKSA9PiBzLmxlbmd0aCA+IDApO1xuXG4gICAgY29uc3QgZGVzY2VuZCA9IChcbiAgICAgIG5vZGU6IFJlYWN0LlJlYWN0Tm9kZSxcbiAgICAgIGRlcHRoOiBudW1iZXIsXG4gICAgICBjdXJyZW50UGF0aDogc3RyaW5nXG4gICAgKTogUmVhY3QuUmVhY3ROb2RlID0+IHtcbiAgICAgIGlmIChkZXB0aCA8IHBhcnRzLmxlbmd0aCkge1xuICAgICAgICBhc3NlcnRJc0VsZW1lbnQobm9kZSwgcGFydHMsIGRlcHRoKTtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IG5vZGUgYXMgUmVhY3QuUmVhY3RFbGVtZW50PFJlY29yZDxzdHJpbmcsIGFueT4gfCBudWxsPjtcbiAgICAgICAgY29uc3QgY2hpbGRLZXkgPSBwYXJ0c1tkZXB0aF0hO1xuICAgICAgICBjb25zdCBjaGlsZElkeCA9ICtjaGlsZEtleTtcbiAgICAgICAgY29uc3QgY2hpbGRQYXRoID0gY3VycmVudFBhdGggPyBgJHtjdXJyZW50UGF0aH0uJHtjaGlsZEtleX1gIDogY2hpbGRLZXk7XG4gICAgICAgIGlmICghTnVtYmVyLmlzTmFOKGNoaWxkSWR4KSkge1xuICAgICAgICAgIC8vIFJlZ3VsYXIgY2hpbGQgdHJhdmVyc2FsXG4gICAgICAgICAgY29uc3QgY2hpbGRyZW5BcnIgPSBlbnN1cmVDaGlsZHJlbkFycmF5KGVsZW1lbnQpO1xuICAgICAgICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW5BcnJbY2hpbGRJZHhdO1xuICAgICAgICAgIGNoaWxkcmVuQXJyW2NoaWxkSWR4XSA9IGRlc2NlbmQoY2hpbGQsIGRlcHRoICsgMSwgY2hpbGRQYXRoKSBhcyBhbnk7XG4gICAgICAgICAgcmV0dXJuIGNsb25lRWxlbWVudChlbGVtZW50LCB1bmRlZmluZWQsIC4uLmNoaWxkcmVuQXJyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBSZW5kZXIgcHJvcCB0cmF2ZXJzYWxcbiAgICAgICAgICBjb25zdCBiYXNlUHJvcHMgPSAoZWxlbWVudC5wcm9wcyA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICAgICAgICBjb25zdCBjaGlsZCA9IGJhc2VQcm9wc1tjaGlsZEtleV07XG4gICAgICAgICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICAgICAgICAuLi5iYXNlUHJvcHMsXG4gICAgICAgICAgICBbY2hpbGRLZXldOiBkZXNjZW5kKGNoaWxkLCBkZXB0aCArIDEsIGNoaWxkUGF0aCksXG4gICAgICAgICAgfTtcbiAgICAgICAgICByZXR1cm4gY2xvbmVFbGVtZW50KGVsZW1lbnQsIHByb3BzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc3dpdGNoICh1cGRhdGUudHlwZSkge1xuICAgICAgICBjYXNlIFwicmVwbGFjZVwiOiB7XG4gICAgICAgICAgcmV0dXJuIHJlbmRlcmVyLnJlbmRlck5vZGUodXBkYXRlLmRhdGEsIHVwZGF0ZS5wYXRoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwidXBkYXRlX3Byb3BzXCI6IHtcbiAgICAgICAgICBhc3NlcnRJc0VsZW1lbnQobm9kZSwgcGFydHMsIGRlcHRoKTtcbiAgICAgICAgICBjb25zdCBlbGVtZW50ID0gbm9kZSBhcyBSZWFjdC5SZWFjdEVsZW1lbnQ7XG4gICAgICAgICAgY29uc3QgY3VycmVudFByb3BzID0gKGVsZW1lbnQucHJvcHMgPz8ge30pIGFzIFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgICAgICAgY29uc3QgbmV4dFByb3BzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0geyAuLi5jdXJyZW50UHJvcHMgfTtcbiAgICAgICAgICBjb25zdCBkZWx0YSA9IHVwZGF0ZS5kYXRhO1xuICAgICAgICAgIGlmIChkZWx0YS5yZW1vdmUgJiYgZGVsdGEucmVtb3ZlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIGRlbHRhLnJlbW92ZSkge1xuICAgICAgICAgICAgICBpZiAoa2V5IGluIG5leHRQcm9wcykge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBuZXh0UHJvcHNba2V5XTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZGVsdGEuc2V0KSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhkZWx0YS5zZXQpKSB7XG4gICAgICAgICAgICAgIG5leHRQcm9wc1trXSA9IHJlbmRlcmVyLnRyYW5zZm9ybVZhbHVlKGN1cnJlbnRQYXRoLCBrLCB2KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gTm90IHBhc3NpbmcgY2hpbGRyZW4gLT4gb25seSB1cGRhdGUgdGhlIHByb3BzXG4gICAgICAgICAgcmV0dXJuIGNsb25lRWxlbWVudChlbGVtZW50LCBuZXh0UHJvcHMpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJpbnNlcnRcIjoge1xuICAgICAgICAgIGFzc2VydElzRWxlbWVudChub2RlLCBwYXJ0cywgZGVwdGgpO1xuICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBub2RlIGFzIFJlYWN0LlJlYWN0RWxlbWVudDtcbiAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IGVuc3VyZUNoaWxkcmVuQXJyYXkoZWxlbWVudCk7XG4gICAgICAgICAgY29uc3QgY2hpbGRQYXRoID0gY3VycmVudFBhdGhcbiAgICAgICAgICAgID8gYCR7Y3VycmVudFBhdGh9LiR7dXBkYXRlLmlkeH1gXG4gICAgICAgICAgICA6IFN0cmluZyh1cGRhdGUuaWR4KTtcbiAgICAgICAgICBjaGlsZHJlbi5zcGxpY2UoXG4gICAgICAgICAgICB1cGRhdGUuaWR4LFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIHJlbmRlcmVyLnJlbmRlck5vZGUodXBkYXRlLmRhdGEsIGNoaWxkUGF0aClcbiAgICAgICAgICApO1xuICAgICAgICAgIC8vIE9ubHkgdXBkYXRlIHRoZSBjaGlsZHJlbiAoVHlwZVNjcmlwdCBkb2Vzbid0IGxpa2UgdGhlIGBudWxsYCwgYnV0IHRoYXQncyB3aGF0IHRoZSBvZmZpY2lhbCBSZWFjdCBkb2NzIHNheSlcbiAgICAgICAgICByZXR1cm4gY2xvbmVFbGVtZW50KGVsZW1lbnQsIG51bGwhLCAuLi5jaGlsZHJlbik7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcInJlbW92ZVwiOiB7XG4gICAgICAgICAgYXNzZXJ0SXNFbGVtZW50KG5vZGUsIHBhcnRzLCBkZXB0aCk7XG4gICAgICAgICAgY29uc3QgZWxlbWVudCA9IG5vZGUgYXMgUmVhY3QuUmVhY3RFbGVtZW50O1xuICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gZW5zdXJlQ2hpbGRyZW5BcnJheShlbGVtZW50KTtcbiAgICAgICAgICBjaGlsZHJlbi5zcGxpY2UodXBkYXRlLmlkeCwgMSk7XG4gICAgICAgICAgLy8gT25seSB1cGRhdGUgdGhlIGNoaWxkcmVuIChUeXBlU2NyaXB0IGRvZXNuJ3QgbGlrZSB0aGUgYG51bGxgLCBidXQgdGhhdCdzIHdoYXQgdGhlIG9mZmljaWFsIFJlYWN0IGRvY3Mgc2F5KVxuICAgICAgICAgIHJldHVybiBjbG9uZUVsZW1lbnQoZWxlbWVudCwgbnVsbCEsIC4uLmNoaWxkcmVuKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwibW92ZVwiOiB7XG4gICAgICAgICAgYXNzZXJ0SXNFbGVtZW50KG5vZGUsIHBhcnRzLCBkZXB0aCk7XG4gICAgICAgICAgY29uc3QgZWxlbWVudCA9IG5vZGUgYXMgUmVhY3QuUmVhY3RFbGVtZW50O1xuICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gZW5zdXJlQ2hpbGRyZW5BcnJheShlbGVtZW50KTtcbiAgICAgICAgICBjb25zdCBpdGVtID0gY2hpbGRyZW4uc3BsaWNlKHVwZGF0ZS5kYXRhLmZyb21faW5kZXgsIDEpWzBdO1xuICAgICAgICAgIGNoaWxkcmVuLnNwbGljZSh1cGRhdGUuZGF0YS50b19pbmRleCwgMCwgaXRlbSk7XG4gICAgICAgICAgLy8gT25seSB1cGRhdGUgdGhlIGNoaWxkcmVuIChUeXBlU2NyaXB0IGRvZXNuJ3QgbGlrZSB0aGUgYG51bGxgLCBidXQgdGhhdCdzIHdoYXQgdGhlIG9mZmljaWFsIFJlYWN0IGRvY3Mgc2F5KVxuICAgICAgICAgIHJldHVybiBjbG9uZUVsZW1lbnQoZWxlbWVudCwgbnVsbCEsIC4uLmNoaWxkcmVuKTtcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBbUHVsc2UgcmVuZGVyZXJdIFVua25vd24gdXBkYXRlIHR5cGU6ICR7dXBkYXRlW1widHlwZVwiXX1gXG4gICAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgbmV3VHJlZSA9IGRlc2NlbmQobmV3VHJlZSwgMCwgXCJcIik7XG4gIH1cbiAgcmV0dXJuIG5ld1RyZWU7XG59XG5cbi8vIFRoZSBgY29tcG9uZW50YCBwcm9wIHNob3VsZCBiZSBzb21ldGhpbmcgbGlrZSBgKCkgPT5cbi8vIGltcG9ydCgnfi9wYXRoL3RvL2NvbXBvbmVudCcpICh3ZSdsbCBuZWVkIHRvIHJlbWFwIGlmIHdlJ3JlIGltcG9ydGluZyBhIG5hbWVkIGV4cG9ydCBhbmQgbm90IHRoZSBkZWZhdWx0KVxuZXhwb3J0IGZ1bmN0aW9uIFJlbmRlckxhenkoXG4gIGNvbXBvbmVudDogKCkgPT4gUHJvbWlzZTx7IGRlZmF1bHQ6IENvbXBvbmVudFR5cGU8YW55PiB9PixcbiAgZmFsbGJhY2s/OiBSZWFjdC5SZWFjdE5vZGVcbik6IFJlYWN0LkZDPFJlYWN0LlByb3BzV2l0aENoaWxkcmVuPHVua25vd24+PiB7XG4gIGNvbnN0IENvbXBvbmVudCA9IGxhenkoY29tcG9uZW50KTtcbiAgcmV0dXJuICh7IGNoaWxkcmVuLCAuLi5wcm9wcyB9OiBSZWFjdC5Qcm9wc1dpdGhDaGlsZHJlbjx1bmtub3duPikgPT4ge1xuICAgIHJldHVybiAoXG4gICAgICA8U3VzcGVuc2UgZmFsbGJhY2s9e2ZhbGxiYWNrID8/IDw+PC8+fT5cbiAgICAgICAgPENvbXBvbmVudCB7Li4ucHJvcHN9PntjaGlsZHJlbn08L0NvbXBvbmVudD5cbiAgICAgIDwvU3VzcGVuc2U+XG4gICAgKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXNzZXJ0SXNFbGVtZW50KFxuICBub2RlOiBSZWFjdC5SZWFjdE5vZGUsXG4gIHBhcnRzOiBzdHJpbmdbXSxcbiAgZGVwdGg6IG51bWJlclxuKTogbm9kZSBpcyBSZWFjdC5SZWFjdEVsZW1lbnQge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiICYmICFpc1ZhbGlkRWxlbWVudChub2RlKSkge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJJbnZhbGlkIG5vZGU6XCIsIG5vZGUpO1xuICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgbm9kZSBhdCBwYXRoIFwiICsgcGFydHMuc2xpY2UoMCwgZGVwdGgpLmpvaW4oXCIuXCIpKTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBDb21wb25lbnRUeXBlIH0gZnJvbSBcInJlYWN0XCI7XG5cbi8vIFNwZWNpYWwgcHJlZml4ZXMgZm9yIHJlc2VydmVkIG5vZGUgdHlwZXNcbmV4cG9ydCBjb25zdCBGUkFHTUVOVF9UQUcgPSBcIiQkZnJhZ21lbnRcIjtcbmV4cG9ydCBjb25zdCBNT1VOVF9QT0lOVF9QUkVGSVggPSBcIiQkXCI7XG5cbi8vIGV4cG9ydCB0eXBlIExhenlDb21wb25lbnQgPSAoKSA9PiBQcm9taXNlPHsgZGVmYXVsdDogQ29tcG9uZW50VHlwZTxhbnk+IH0+O1xuZXhwb3J0IHR5cGUgUmVnaXN0cnlFbnRyeSA9IENvbXBvbmVudFR5cGU8YW55PjtcbmV4cG9ydCB0eXBlIENvbXBvbmVudFJlZ2lzdHJ5ID0gUmVjb3JkPHN0cmluZywgQ29tcG9uZW50VHlwZTxhbnk+PjtcblxuZXhwb3J0IGludGVyZmFjZSBWRE9NRWxlbWVudCB7XG4gIHRhZzogc3RyaW5nO1xuICBwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIGNoaWxkcmVuPzogVkRPTU5vZGVbXTtcbiAga2V5Pzogc3RyaW5nO1xuICBsYXp5PzogYm9vbGVhbjtcbn1cblxuLy8gUHJpbWl0aXZlIG5vZGVzIHRoYXQgY2FuIGJlIHJlbmRlcmVkXG5leHBvcnQgdHlwZSBQcmltaXRpdmVOb2RlID0gc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbjtcblxuLy8gVkRPTU5vZGUgaXMgZWl0aGVyIGEgcHJpbWl0aXZlIChzdHJpbmcsIG51bWJlciwgYm9vbGVhbikgb3IgYW4gZWxlbWVudCBub2RlLlxuLy8gQm9vbGVhbnMgYXJlIHZhbGlkIGNoaWxkcmVuIGluIFJlYWN0IGJ1dCBkbyBub3QgcmVuZGVyIGFueXRoaW5nLlxuLy8gTW91bnQgcG9pbnRzIGFyZSBqdXN0IFVJRWxlbWVudE5vZGVzIHdpdGggdGFncyBzdGFydGluZyB3aXRoICQkQ29tcG9uZW50S2V5XG5leHBvcnQgdHlwZSBWRE9NTm9kZSA9IFByaW1pdGl2ZU5vZGUgfCBWRE9NRWxlbWVudDtcblxuZXhwb3J0IHR5cGUgVkRPTSA9IFZET01Ob2RlO1xuXG5leHBvcnQgdHlwZSBVcGRhdGVUeXBlID1cbiAgfCBcImluc2VydFwiXG4gIHwgXCJyZW1vdmVcIlxuICB8IFwicmVwbGFjZVwiXG4gIHwgXCJ1cGRhdGVfcHJvcHNcIlxuICB8IFwibW92ZVwiXG4gIHwgXCJ1cGRhdGVfY2FsbGJhY2tzXCJcbiAgfCBcInVwZGF0ZV9yZW5kZXJfcHJvcHNcIlxuICB8IFwidXBkYXRlX2Nzc19yZWZzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVkRPTVVwZGF0ZUJhc2Uge1xuICB0eXBlOiBVcGRhdGVUeXBlO1xuICBwYXRoOiBzdHJpbmc7IC8vIERvdC1zZXBhcmF0ZWQgcGF0aCB0byB0aGUgbm9kZVxuICBkYXRhPzogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEluc2VydFVwZGF0ZSBleHRlbmRzIFZET01VcGRhdGVCYXNlIHtcbiAgdHlwZTogXCJpbnNlcnRcIjtcbiAgZGF0YTogVkRPTU5vZGU7IC8vIFRoZSBub2RlIHRvIGluc2VydFxuICBpZHg6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZW1vdmVVcGRhdGUgZXh0ZW5kcyBWRE9NVXBkYXRlQmFzZSB7XG4gIHR5cGU6IFwicmVtb3ZlXCI7XG4gIGlkeDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlcGxhY2VVcGRhdGUgZXh0ZW5kcyBWRE9NVXBkYXRlQmFzZSB7XG4gIHR5cGU6IFwicmVwbGFjZVwiO1xuICBkYXRhOiBWRE9NTm9kZTsgLy8gVGhlIG5ldyBub2RlXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlUHJvcHNVcGRhdGUgZXh0ZW5kcyBWRE9NVXBkYXRlQmFzZSB7XG4gIHR5cGU6IFwidXBkYXRlX3Byb3BzXCI7XG4gIGRhdGE6IHtcbiAgICBzZXQ/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIHJlbW92ZT86IHN0cmluZ1tdO1xuICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1vdmVVcGRhdGUgZXh0ZW5kcyBWRE9NVXBkYXRlQmFzZSB7XG4gIHR5cGU6IFwibW92ZVwiO1xuICBkYXRhOiB7XG4gICAgZnJvbV9pbmRleDogbnVtYmVyO1xuICAgIHRvX2luZGV4OiBudW1iZXI7XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlQ2FsbGJhY2tzVXBkYXRlIGV4dGVuZHMgVkRPTVVwZGF0ZUJhc2Uge1xuICB0eXBlOiBcInVwZGF0ZV9jYWxsYmFja3NcIjtcbiAgZGF0YToge1xuICAgIGFkZD86IHN0cmluZ1tdOyAvLyBmdWxsIGNhbGxiYWNrIGtleXMgbGlrZSBcIjAuMS5vbkNsaWNrXCJcbiAgICByZW1vdmU/OiBzdHJpbmdbXTtcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVSZW5kZXJQcm9wc1VwZGF0ZSBleHRlbmRzIFZET01VcGRhdGVCYXNlIHtcbiAgdHlwZTogXCJ1cGRhdGVfcmVuZGVyX3Byb3BzXCI7XG4gIGRhdGE6IHtcbiAgICBhZGQ/OiBzdHJpbmdbXTsgLy8gcmVuZGVyIHByb3Aga2V5cyBsaWtlIFwiMC4xLmxlZnRTZWN0aW9uXCJcbiAgICByZW1vdmU/OiBzdHJpbmdbXTtcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVDc3NSZWZzVXBkYXRlIGV4dGVuZHMgVkRPTVVwZGF0ZUJhc2Uge1xuICB0eXBlOiBcInVwZGF0ZV9jc3NfcmVmc1wiO1xuICBkYXRhOiB7XG4gICAgc2V0Pzogc3RyaW5nW107XG4gICAgcmVtb3ZlPzogc3RyaW5nW107XG4gIH07XG59XG5cbmV4cG9ydCB0eXBlIFZET01VcGRhdGUgPVxuICB8IEluc2VydFVwZGF0ZVxuICB8IFJlbW92ZVVwZGF0ZVxuICB8IFJlcGxhY2VVcGRhdGVcbiAgfCBVcGRhdGVQcm9wc1VwZGF0ZVxuICB8IE1vdmVVcGRhdGVcbiAgfCBVcGRhdGVDYWxsYmFja3NVcGRhdGVcbiAgfCBVcGRhdGVSZW5kZXJQcm9wc1VwZGF0ZVxuICB8IFVwZGF0ZUNzc1JlZnNVcGRhdGU7XG5cbi8vIFV0aWxpdHkgZnVuY3Rpb25zIGZvciB3b3JraW5nIHdpdGggdGhlIFVJIHRyZWUgc3RydWN0dXJlXG5leHBvcnQgZnVuY3Rpb24gaXNFbGVtZW50Tm9kZShub2RlOiBWRE9NTm9kZSk6IG5vZGUgaXMgVkRPTUVsZW1lbnQge1xuICAvLyBNYXRjaGVzIGFsbCBub24tdGV4dCBub2Rlc1xuICByZXR1cm4gdHlwZW9mIG5vZGUgPT09IFwib2JqZWN0XCIgJiYgbm9kZSAhPT0gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTW91bnRQb2ludE5vZGUobm9kZTogVkRPTU5vZGUpOiBub2RlIGlzIFZET01FbGVtZW50IHtcbiAgcmV0dXJuIChcbiAgICB0eXBlb2Ygbm9kZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgIG5vZGUgIT09IG51bGwgJiZcbiAgICBub2RlLnRhZy5zdGFydHNXaXRoKE1PVU5UX1BPSU5UX1BSRUZJWCkgJiZcbiAgICBub2RlLnRhZyAhPT0gRlJBR01FTlRfVEFHXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1RleHROb2RlKG5vZGU6IFZET01Ob2RlKTogbm9kZSBpcyBzdHJpbmcge1xuICByZXR1cm4gdHlwZW9mIG5vZGUgPT09IFwic3RyaW5nXCI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0ZyYWdtZW50KG5vZGU6IFZET01Ob2RlKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2Ygbm9kZSA9PT0gXCJvYmplY3RcIiAmJiBub2RlICE9PSBudWxsICYmIG5vZGUudGFnID09PSBGUkFHTUVOVF9UQUc7XG59XG4iLAogICAgIlxudHlwZSBTaW1wbGlmeTxUPiA9IHsgW0sgaW4ga2V5b2YgVF06IFRbS10gfSAmIHt9O1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRXh0cmFjdG9yPFQgZXh0ZW5kcyBvYmplY3Q+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+IG9iamVjdCB9ID0ge307XG5cbmZ1bmN0aW9uIGFkZChtYXA6IFJlY29yZDxzdHJpbmcsIGFueT4sIG5hbWVzOiByZWFkb25seSBzdHJpbmdbXSwgZm46IGFueSkge1xuICBmb3IgKGNvbnN0IG4gb2YgbmFtZXMpIG1hcFtuXSA9IGZuO1xufVxuXG5hZGQoXG4gIGV2ZW50RXh0cmFjdG9yTWFwLFxuICBbXG4gICAgXCJwb2ludGVyZG93blwiLFxuICAgIFwicG9pbnRlcm1vdmVcIixcbiAgICBcInBvaW50ZXJ1cFwiLFxuICAgIFwicG9pbnRlcmNhbmNlbFwiLFxuICAgIFwiZ290cG9pbnRlcmNhcHR1cmVcIixcbiAgICBcImxvc3Rwb2ludGVyY2FwdHVyZVwiLFxuICAgIFwicG9pbnRlcmVudGVyXCIsXG4gICAgXCJwb2ludGVybGVhdmVcIixcbiAgICBcInBvaW50ZXJvdmVyXCIsXG4gICAgXCJwb2ludGVyb3V0XCIsXG4gIF0sXG4gIHBvaW50ZXJFeHRyYWN0b3Jcbik7XG5cbmFkZChcbiAgZXZlbnRFeHRyYWN0b3JNYXAsXG4gIFtcbiAgICBcImNsaWNrXCIsXG4gICAgXCJjb250ZXh0bWVudVwiLFxuICAgIFwiZGJsY2xpY2tcIixcbiAgICBcIm1vdXNlZG93blwiLFxuICAgIFwibW91c2VlbnRlclwiLFxuICAgIFwibW91c2VsZWF2ZVwiLFxuICAgIFwibW91c2Vtb3ZlXCIsXG4gICAgXCJtb3VzZW91dFwiLFxuICAgIFwibW91c2VvdmVyXCIsXG4gICAgXCJtb3VzZXVwXCIsXG4gIF0sXG4gIG1vdXNlRXh0cmFjdG9yXG4pO1xuXG5hZGQoXG4gIGV2ZW50RXh0cmFjdG9yTWFwLFxuICBbXG4gICAgXCJkcmFnXCIsXG4gICAgXCJkcmFnZW5kXCIsXG4gICAgXCJkcmFnZW50ZXJcIixcbiAgICBcImRyYWdleGl0XCIsXG4gICAgXCJkcmFnbGVhdmVcIixcbiAgICBcImRyYWdvdmVyXCIsXG4gICAgXCJkcmFnc3RhcnRcIixcbiAgICBcImRyb3BcIixcbiAgXSxcbiAgZHJhZ0V4dHJhY3RvclxuKTtcblxuYWRkKGV2ZW50RXh0cmFjdG9yTWFwLCBbXCJrZXlkb3duXCIsIFwia2V5cHJlc3NcIiwgXCJrZXl1cFwiXSwga2V5Ym9hcmRFeHRyYWN0b3IpO1xuYWRkKGV2ZW50RXh0cmFjdG9yTWFwLCBbXCJmb2N1c1wiLCBcImJsdXJcIl0sIGZvY3VzRXh0cmFjdG9yKTtcbmFkZChldmVudEV4dHJhY3Rvck1hcCwgW1wiY2hhbmdlXCIsIFwiaW5wdXRcIl0sIGNoYW5nZUV4dHJhY3Rvcik7XG5hZGQoZXZlbnRFeHRyYWN0b3JNYXAsIFtcImludmFsaWRcIl0sIGludmFsaWRFeHRyYWN0b3IpO1xuYWRkKGV2ZW50RXh0cmFjdG9yTWFwLCBbXCJyZXNldFwiLCBcInN1Ym1pdFwiXSwgZm9ybUV4dHJhY3Rvcik7XG5hZGQoZXZlbnRFeHRyYWN0b3JNYXAsIFtcImNvcHlcIiwgXCJjdXRcIiwgXCJwYXN0ZVwiXSwgY2xpcGJvYXJkRXh0cmFjdG9yKTtcbmFkZChcbiAgZXZlbnRFeHRyYWN0b3JNYXAsXG4gIFtcImNvbXBvc2l0aW9uZW5kXCIsIFwiY29tcG9zaXRpb25zdGFydFwiLCBcImNvbXBvc2l0aW9udXBkYXRlXCJdLFxuICBjb21wb3NpdGlvbkV4dHJhY3RvclxuKTtcbmFkZChcbiAgZXZlbnRFeHRyYWN0b3JNYXAsXG4gIFtcInRvdWNoY2FuY2VsXCIsIFwidG91Y2hlbmRcIiwgXCJ0b3VjaG1vdmVcIiwgXCJ0b3VjaHN0YXJ0XCJdLFxuICB0b3VjaEV4dHJhY3RvclxuKTtcbmFkZChldmVudEV4dHJhY3Rvck1hcCwgW1wic2Nyb2xsXCJdLCB1aUV4dHJhY3Rvcik7XG5hZGQoZXZlbnRFeHRyYWN0b3JNYXAsIFtcIndoZWVsXCJdLCB3aGVlbEV4dHJhY3Rvcik7XG5hZGQoXG4gIGV2ZW50RXh0cmFjdG9yTWFwLFxuICBbXCJhbmltYXRpb25zdGFydFwiLCBcImFuaW1hdGlvbmVuZFwiLCBcImFuaW1hdGlvbml0ZXJhdGlvblwiXSxcbiAgYW5pbWF0aW9uRXh0cmFjdG9yXG4pO1xuYWRkKGV2ZW50RXh0cmFjdG9yTWFwLCBbXCJ0cmFuc2l0aW9uZW5kXCJdLCB0cmFuc2l0aW9uRXh0cmFjdG9yKTtcbmFkZChldmVudEV4dHJhY3Rvck1hcCwgW1widG9nZ2xlXCJdLCB0b2dnbGVFeHRyYWN0b3IpO1xuXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdEV2ZW50KHZhbHVlOiBhbnkpOiBhbnkge1xuICAvLyBEdWNrLXR5cGluZyBmb3IgUmVhY3QncyBTeW50aGV0aWNFdmVudC5cbiAgLy8gV2UgY2hlY2sgZm9yIHByb3BlcnRpZXMgdGhhdCBhcmUgdW5pcXVlIHRvIHN5bnRoZXRpYyBldmVudHMuXG4gIGlmIChcbiAgICB2YWx1ZSAmJlxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgIFwibmF0aXZlRXZlbnRcIiBpbiB2YWx1ZSAmJlxuICAgIHR5cGVvZiB2YWx1ZS5pc0RlZmF1bHRQcmV2ZW50ZWQgPT09IFwiZnVuY3Rpb25cIlxuICApIHtcbiAgICBjb25zdCBldnQgPSB2YWx1ZSBhcyBSZWFjdC5TeW50aGV0aWNFdmVudDtcbiAgICAvLyBUaGUgYHR5cGVgIHByb3BlcnR5IGlzIGNydWNpYWwgZm9yIHRoZSBsb29rdXAuXG4gICAgaWYgKHR5cGVvZiBldnQudHlwZSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIGNvbnN0IGV4dHJhY3RvciA9IGV2ZW50RXh0cmFjdG9yTWFwW2V2dC50eXBlLnRvTG93ZXJDYXNlKCldO1xuICAgIGlmIChleHRyYWN0b3IpIHtcbiAgICAgIHJldHVybiBleHRyYWN0b3IoZXZ0KTtcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayBmb3IgdW5rbm93biBldmVudCB0eXBlczogbWluaW1hbCBzeW50aGV0aWMgZXh0cmFjdG9yXG4gICAgcmV0dXJuIHN5bnRoZXRpY0V4dHJhY3RvcihldnQpO1xuICB9XG5cbiAgLy8gSWYgaXQncyBub3QgYSBkdWNrLXR5cGVkIGV2ZW50LCByZXR1cm4gaXQgYXMgaXMuXG4gIHJldHVybiB2YWx1ZTtcbn1cbiIsCiAgICAiZXhwb3J0IHR5cGUgUHJpbWl0aXZlID0gbnVtYmVyIHwgc3RyaW5nIHwgYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQ7XG5leHBvcnQgdHlwZSBKU09OPFQ+ID0gVCB8IEFycmF5PEpTT048VD4+IHwgeyBbSzogc3RyaW5nXTogSlNPTjxUPiB9O1xuZXhwb3J0IHR5cGUgUGxhaW5KU09OID0gSlNPTjxQcmltaXRpdmU+O1xuZXhwb3J0IHR5cGUgU2VyaWFsaXphYmxlID0gYW55O1xuXG5leHBvcnQgdHlwZSBTZXJpYWxpemVkID0gW1tudW1iZXJbXSwgbnVtYmVyW10sIG51bWJlcltdLCBudW1iZXJbXV0sIFBsYWluSlNPTl07XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemUoZGF0YTogU2VyaWFsaXphYmxlKTogU2VyaWFsaXplZCB7XG4gIGNvbnN0IHNlZW4gPSBuZXcgTWFwPGFueSwgbnVtYmVyPigpO1xuICBjb25zdCByZWZzOiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCBkYXRlczogbnVtYmVyW10gPSBbXTtcbiAgY29uc3Qgc2V0czogbnVtYmVyW10gPSBbXTtcbiAgY29uc3QgbWFwczogbnVtYmVyW10gPSBbXTtcblxuICAvLyBTaW5nbGUgZ2xvYmFsIGNvdW50ZXIgLSBpbmNyZW1lbnRzIG9uY2UgcGVyIG5vZGUgdmlzaXRcbiAgbGV0IGdsb2JhbEluZGV4ID0gMDtcblxuICBmdW5jdGlvbiBwcm9jZXNzKHZhbHVlOiBTZXJpYWxpemFibGUpOiBQbGFpbkpTT04ge1xuICAgIGlmIChcbiAgICAgIHZhbHVlID09IG51bGwgfHxcbiAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiB8fFxuICAgICAgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8XG4gICAgICB0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiXG4gICAgKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgY29uc3QgaWR4ID0gZ2xvYmFsSW5kZXgrKztcbiAgICBjb25zdCBwcmV2UmVmID0gc2Vlbi5nZXQodmFsdWUpO1xuICAgIGlmIChwcmV2UmVmICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIE1ha2Ugc3VyZSB0byBwdXNoIHRoZSBjdXJyZW50IGluZGV4LCBidXQgdXNlIHRoZSByZWYncyBpbmRleCBhcyB0aGUgdmFsdWUhXG4gICAgICByZWZzLnB1c2goaWR4KTtcbiAgICAgIHJldHVybiBwcmV2UmVmO1xuICAgIH1cblxuICAgIHNlZW4uc2V0KHZhbHVlLCBpZHgpO1xuXG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgZGF0ZXMucHVzaChpZHgpO1xuICAgICAgcmV0dXJuIHZhbHVlLmdldFRpbWUoKTtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGNvbnN0IGxlbmd0aCA9IHZhbHVlLmxlbmd0aDtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBBcnJheShsZW5ndGgpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICByZXN1bHRbaV0gPSBwcm9jZXNzKHZhbHVlW2ldKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgICBtYXBzLnB1c2goaWR4KTtcbiAgICAgIGNvbnN0IHJlYzogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgICAgZm9yIChjb25zdCBba2V5LCBlbnRyeV0gb2YgdmFsdWUuZW50cmllcygpKSB7XG4gICAgICAgIHJlY1tTdHJpbmcoa2V5KV0gPSBwcm9jZXNzKGVudHJ5KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZWM7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgICBzZXRzLnB1c2goaWR4KTtcbiAgICAgIGNvbnN0IHNpemUgPSB2YWx1ZS5zaXplO1xuICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5KHNpemUpO1xuICAgICAgbGV0IGkgPSAwO1xuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiB2YWx1ZSkge1xuICAgICAgICByZXN1bHRbaV0gPSBwcm9jZXNzKGVudHJ5KTtcbiAgICAgICAgaSArPSAxO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBjb25zdCByZWM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh2YWx1ZSk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qga2V5ID0ga2V5c1tpXTtcbiAgICAgICAgcmVjW2tleV0gPSBwcm9jZXNzKHZhbHVlW2tleV0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlYztcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHZhbHVlIGluIHNlcmlhbGl6YXRpb246ICR7dmFsdWV9YCk7XG4gIH1cblxuICBjb25zdCBwYXlsb2FkID0gcHJvY2VzcyhkYXRhKTtcbiAgcmV0dXJuIFtbcmVmcywgZGF0ZXMsIHNldHMsIG1hcHNdLCBwYXlsb2FkXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEZXNlcmlhbGl6YXRpb25PcHRpb25zIHtcbiAgY29lcmNlTnVsbHNUb1VuZGVmaW5lZD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZXNlcmlhbGl6ZTxEYXRhIGV4dGVuZHMgU2VyaWFsaXphYmxlID0gU2VyaWFsaXphYmxlPihcbiAgcGF5bG9hZDogU2VyaWFsaXplZCxcbiAgb3B0aW9ucz86IERlc2VyaWFsaXphdGlvbk9wdGlvbnNcbik6IERhdGEge1xuICBjb25zdCBbW3JlZnNBLCBkYXRlc0EsIHNldHNBLCBtYXBzQV0sIGRhdGFdID0gcGF5bG9hZDtcblxuICBjb25zdCByZWZzID0gbmV3IFNldChyZWZzQSk7XG4gIGNvbnN0IGRhdGVzID0gbmV3IFNldChkYXRlc0EpO1xuICBjb25zdCBzZXRzID0gbmV3IFNldChzZXRzQSk7XG4gIGNvbnN0IG1hcHMgPSBuZXcgU2V0KG1hcHNBKTtcblxuICBjb25zdCBvYmplY3RzOiBBcnJheTxhbnk+ID0gW107XG5cbiAgZnVuY3Rpb24gcmVjb25zdHJ1Y3QodmFsdWU6IFBsYWluSlNPTik6IGFueSB7XG4gICAgY29uc3QgaWR4ID0gb2JqZWN0cy5sZW5ndGg7XG4gICAgaWYgKHJlZnMuaGFzKGlkeCkpIHtcbiAgICAgIC8vIFdlIGluY3JlbWVudCB0aGUgY291bnRlciBvbiByZWZzIGR1cmluZyBzZXJpYWxpemF0aW9uLiBXZSdyZSBuZXZlclxuICAgICAgLy8gZ29pbmcgdG8gdXNlIHRoaXMgZW50cnksIHNvIHdlIGNhbiBqdXN0IHB1c2ggbnVsbC5cbiAgICAgIG9iamVjdHMucHVzaChudWxsKTtcbiAgICAgIHJldHVybiBvYmplY3RzW3ZhbHVlIGFzIG51bWJlcl07XG4gICAgfVxuXG4gICAgaWYgKGRhdGVzLmhhcyhpZHgpKSB7XG4gICAgICBjb25zdCBkdCA9IG5ldyBEYXRlKHZhbHVlIGFzIG51bWJlcik7XG4gICAgICBvYmplY3RzLnB1c2goZHQpO1xuICAgICAgcmV0dXJuIGR0O1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHZhbHVlID09IG51bGwgfHxcbiAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiB8fFxuICAgICAgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8XG4gICAgICB0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiXG4gICAgKSB7XG4gICAgICBpZiAob3B0aW9ucz8uY29lcmNlTnVsbHNUb1VuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gdmFsdWUgPz8gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgaWYgKHNldHMuaGFzKGlkeCkpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IFNldCgpO1xuICAgICAgICBvYmplY3RzLnB1c2gocmVzdWx0KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHJlc3VsdC5hZGQocmVjb25zdHJ1Y3QodmFsdWVbaV0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBsZW5ndGggPSB2YWx1ZS5sZW5ndGg7XG4gICAgICBjb25zdCBhcnIgPSBuZXcgQXJyYXkobGVuZ3RoKTtcbiAgICAgIG9iamVjdHMucHVzaChhcnIpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICBhcnJbaV0gPSByZWNvbnN0cnVjdCh2YWx1ZVtpXSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJyO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIGlmIChtYXBzLmhhcyhpZHgpKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCk7XG4gICAgICAgIG9iamVjdHMucHVzaChyZXN1bHQpO1xuICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModmFsdWUpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBrZXkgPSBrZXlzW2ldO1xuICAgICAgICAgIHJlc3VsdC5zZXQoa2V5LCByZWNvbnN0cnVjdCh2YWx1ZVtrZXldKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgICBvYmplY3RzLnB1c2gocmVzdWx0KTtcbiAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh2YWx1ZSk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qga2V5ID0ga2V5c1tpXTtcbiAgICAgICAgcmVzdWx0W2tleV0gPSByZWNvbnN0cnVjdCh2YWx1ZVtrZXldKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCB2YWx1ZSBpbiBkZXNlcmlhbGl6YXRpb246ICR7dmFsdWV9YCk7XG4gIH1cblxuICByZXR1cm4gcmVjb25zdHJ1Y3QoZGF0YSk7XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgUm91dGVJbmZvIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuaW1wb3J0IHR5cGUgeyBWRE9NLCBWRE9NVXBkYXRlIH0gZnJvbSBcIi4vdmRvbVwiO1xuaW1wb3J0IHsgZXh0cmFjdEV2ZW50IH0gZnJvbSBcIi4vc2VyaWFsaXplL2V2ZW50c1wiO1xuaW1wb3J0IHsgc2VyaWFsaXplLCBkZXNlcmlhbGl6ZSB9IGZyb20gXCIuL3NlcmlhbGl6ZS92M1wiO1xuXG5pbXBvcnQgeyBpbywgU29ja2V0IH0gZnJvbSBcInNvY2tldC5pby1jbGllbnRcIjtcbmltcG9ydCB0eXBlIHtcbiAgQ2xpZW50QXBpUmVzdWx0TWVzc2FnZSxcbiAgQ2xpZW50Q2hhbm5lbE1lc3NhZ2UsXG4gIENsaWVudE1lc3NhZ2UsXG4gIFNlcnZlckFwaUNhbGxNZXNzYWdlLFxuICBTZXJ2ZXJDaGFubmVsTWVzc2FnZSxcbiAgU2VydmVyRXJyb3JJbmZvLFxuICBTZXJ2ZXJNZXNzYWdlLFxufSBmcm9tIFwiLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHR5cGUgeyBOYXZpZ2F0ZUZ1bmN0aW9uIH0gZnJvbSBcInJlYWN0LXJvdXRlclwiO1xuaW1wb3J0IHR5cGUgeyBDaGFubmVsQnJpZGdlIH0gZnJvbSBcIi4vY2hhbm5lbFwiO1xuaW1wb3J0IHsgY3JlYXRlQ2hhbm5lbEJyaWRnZSwgUHVsc2VDaGFubmVsUmVzZXRFcnJvciB9IGZyb20gXCIuL2NoYW5uZWxcIjtcblxuZXhwb3J0IGludGVyZmFjZSBNb3VudGVkVmlldyB7XG4gIHJvdXRlSW5mbzogUm91dGVJbmZvO1xuICBvbkluaXQ6IChcbiAgICB2ZG9tOiBWRE9NLFxuICAgIGNhbGxiYWNrczogc3RyaW5nW10sXG4gICAgcmVuZGVyUHJvcHM6IHN0cmluZ1tdLFxuICAgIGNzc1JlZnM6IHN0cmluZ1tdXG4gICkgPT4gdm9pZDtcbiAgb25VcGRhdGU6IChvcHM6IFZET01VcGRhdGVbXSkgPT4gdm9pZDtcbn1cbmV4cG9ydCB0eXBlIENvbm5lY3Rpb25TdGF0dXNMaXN0ZW5lciA9IChjb25uZWN0ZWQ6IGJvb2xlYW4pID0+IHZvaWQ7XG5leHBvcnQgdHlwZSBTZXJ2ZXJFcnJvckxpc3RlbmVyID0gKFxuICBwYXRoOiBzdHJpbmcsXG4gIGVycm9yOiBTZXJ2ZXJFcnJvckluZm8gfCBudWxsXG4pID0+IHZvaWQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHVsc2VDbGllbnQge1xuICAvLyBDb25uZWN0aW9uIG1hbmFnZW1lbnRcbiAgY29ubmVjdCgpOiBQcm9taXNlPHZvaWQ+O1xuICBkaXNjb25uZWN0KCk6IHZvaWQ7XG4gIGlzQ29ubmVjdGVkKCk6IGJvb2xlYW47XG4gIG9uQ29ubmVjdGlvbkNoYW5nZShsaXN0ZW5lcjogQ29ubmVjdGlvblN0YXR1c0xpc3RlbmVyKTogKCkgPT4gdm9pZDtcbiAgLy8gTWVzc2FnZXNcbiAgbmF2aWdhdGUocGF0aDogc3RyaW5nLCByb3V0ZUluZm86IFJvdXRlSW5mbyk6IFByb21pc2U8dm9pZD47XG4gIGxlYXZlKHBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD47XG4gIGludm9rZUNhbGxiYWNrKHBhdGg6IHN0cmluZywgY2FsbGJhY2s6IHN0cmluZywgYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+O1xuICAvLyBWRE9NIHN1YnNjcmlwdGlvblxuICBtb3VudFZpZXcocGF0aDogc3RyaW5nLCB2aWV3OiBNb3VudGVkVmlldyk6ICgpID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBjbGFzcyBQdWxzZVNvY2tldElPQ2xpZW50IHtcbiAgcHJpdmF0ZSBhY3RpdmVWaWV3czogTWFwPHN0cmluZywgTW91bnRlZFZpZXc+O1xuICBwcml2YXRlIHNvY2tldDogU29ja2V0IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbWVzc2FnZVF1ZXVlOiBDbGllbnRNZXNzYWdlW107XG4gIHByaXZhdGUgY29ubmVjdGlvbkxpc3RlbmVyczogU2V0PENvbm5lY3Rpb25TdGF0dXNMaXN0ZW5lcj4gPSBuZXcgU2V0KCk7XG4gIHByaXZhdGUgc2VydmVyRXJyb3JzOiBNYXA8c3RyaW5nLCBTZXJ2ZXJFcnJvckluZm8+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIHNlcnZlckVycm9yTGlzdGVuZXJzOiBTZXQ8U2VydmVyRXJyb3JMaXN0ZW5lcj4gPSBuZXcgU2V0KCk7XG4gIHByaXZhdGUgY2hhbm5lbHM6IE1hcDxzdHJpbmcsIHsgYnJpZGdlOiBDaGFubmVsQnJpZGdlOyByZWZDb3VudDogbnVtYmVyIH0+ID1cbiAgICBuZXcgTWFwKCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSB1cmw6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlbmRlcklkOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBmcmFtZXdvcmtOYXZpZ2F0ZTogTmF2aWdhdGVGdW5jdGlvblxuICApIHtcbiAgICB0aGlzLnNvY2tldCA9IG51bGw7XG4gICAgdGhpcy5hY3RpdmVWaWV3cyA9IG5ldyBNYXAoKTtcbiAgICB0aGlzLm1lc3NhZ2VRdWV1ZSA9IFtdO1xuICB9XG4gIHB1YmxpYyBpc0Nvbm5lY3RlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zb2NrZXQ/LmNvbm5lY3RlZCA/PyBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBjb25uZWN0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLnNvY2tldCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3Qgc29ja2V0ID0gaW8odGhpcy51cmwsIHtcbiAgICAgICAgdHJhbnNwb3J0czogW1wid2Vic29ja2V0XCIsIFwid2VidHJhbnNwb3J0XCJdLFxuICAgICAgICBhdXRoOiB7IHJlbmRlcklkOiB0aGlzLnJlbmRlcklkIH0sXG4gICAgICB9KTtcbiAgICAgIHRoaXMuc29ja2V0ID0gc29ja2V0O1xuXG4gICAgICBzb2NrZXQub24oXCJjb25uZWN0XCIsICgpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coXCJbU29ja2V0SU9UcmFuc3BvcnRdIENvbm5lY3RlZDpcIiwgdGhpcy5zb2NrZXQ/LmlkKTtcbiAgICAgICAgLy8gTWFrZSBzdXJlIHRvIHNlbmQgYSBuYXZpZ2F0ZSBwYXlsb2FkIGZvciBhbGwgdGhlIHJvdXRlc1xuICAgICAgICBmb3IgKGNvbnN0IFtwYXRoLCByb3V0ZV0gb2YgdGhpcy5hY3RpdmVWaWV3cykge1xuICAgICAgICAgIHNvY2tldC5lbWl0KFxuICAgICAgICAgICAgXCJtZXNzYWdlXCIsXG4gICAgICAgICAgICBzZXJpYWxpemUoe1xuICAgICAgICAgICAgICB0eXBlOiBcIm1vdW50XCIsXG4gICAgICAgICAgICAgIHBhdGg6IHBhdGgsXG4gICAgICAgICAgICAgIHJvdXRlSW5mbzogcm91dGUucm91dGVJbmZvLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBwYXlsb2FkIG9mIHRoaXMubWVzc2FnZVF1ZXVlKSB7XG4gICAgICAgICAgLy8gQWxyZWFkeSBzZW50IGFib3ZlXG4gICAgICAgICAgaWYgKHBheWxvYWQudHlwZSA9PT0gXCJtb3VudFwiICYmIHRoaXMuYWN0aXZlVmlld3MuaGFzKHBheWxvYWQucGF0aCkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBXZSdyZSByZW1vdW50aW5nIGFsbCB0aGUgcm91dGVzLCBzbyBubyBuZWVkIHRvIG5hdmlnYXRlXG4gICAgICAgICAgaWYgKHBheWxvYWQudHlwZSA9PT0gXCJuYXZpZ2F0ZVwiKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc29ja2V0LmVtaXQoXCJtZXNzYWdlXCIsIHNlcmlhbGl6ZShwYXlsb2FkKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tZXNzYWdlUXVldWUgPSBbXTtcblxuICAgICAgICB0aGlzLm5vdGlmeUNvbm5lY3Rpb25MaXN0ZW5lcnModHJ1ZSk7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0pO1xuXG4gICAgICBzb2NrZXQub24oXCJjb25uZWN0X2Vycm9yXCIsIChlcnIpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIltTb2NrZXRJT1RyYW5zcG9ydF0gQ29ubmVjdGlvbiBmYWlsZWQ6XCIsIGVycik7XG4gICAgICAgIHRoaXMubm90aWZ5Q29ubmVjdGlvbkxpc3RlbmVycyhmYWxzZSk7XG4gICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgfSk7XG5cbiAgICAgIHNvY2tldC5vbihcImRpc2Nvbm5lY3RcIiwgKCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhcIltTb2NrZXRJT1RyYW5zcG9ydF0gRGlzY29ubmVjdGVkXCIpO1xuICAgICAgICB0aGlzLmhhbmRsZVRyYW5zcG9ydERpc2Nvbm5lY3QoKTtcbiAgICAgICAgdGhpcy5ub3RpZnlDb25uZWN0aW9uTGlzdGVuZXJzKGZhbHNlKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBXcmFwIGluIGFuIGFycm93IGZ1bmN0aW9uIHRvIGF2b2lkIGxvc2luZyB0aGUgYHRoaXNgIHJlZmVyZW5jZVxuICAgICAgc29ja2V0Lm9uKFwibWVzc2FnZVwiLCAoZGF0YSkgPT5cbiAgICAgICAgdGhpcy5oYW5kbGVTZXJ2ZXJNZXNzYWdlKFxuICAgICAgICAgIGRlc2VyaWFsaXplKGRhdGEsIHsgY29lcmNlTnVsbHNUb1VuZGVmaW5lZDogdHJ1ZSB9KVxuICAgICAgICApXG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgb25Db25uZWN0aW9uQ2hhbmdlKGxpc3RlbmVyOiBDb25uZWN0aW9uU3RhdHVzTGlzdGVuZXIpOiAoKSA9PiB2b2lkIHtcbiAgICB0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTtcbiAgICBsaXN0ZW5lcih0aGlzLmlzQ29ubmVjdGVkKCkpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICB0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lcnMuZGVsZXRlKGxpc3RlbmVyKTtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBub3RpZnlDb25uZWN0aW9uTGlzdGVuZXJzKGNvbm5lY3RlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy5jb25uZWN0aW9uTGlzdGVuZXJzKSB7XG4gICAgICBsaXN0ZW5lcihjb25uZWN0ZWQpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvblNlcnZlckVycm9yKGxpc3RlbmVyOiBTZXJ2ZXJFcnJvckxpc3RlbmVyKTogKCkgPT4gdm9pZCB7XG4gICAgdGhpcy5zZXJ2ZXJFcnJvckxpc3RlbmVycy5hZGQobGlzdGVuZXIpO1xuICAgIC8vIEVtaXQgY3VycmVudCBlcnJvcnMgdG8gbmV3IGxpc3RlbmVyXG4gICAgZm9yIChjb25zdCBbcGF0aCwgZXJyXSBvZiB0aGlzLnNlcnZlckVycm9ycykgbGlzdGVuZXIocGF0aCwgZXJyKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgdGhpcy5zZXJ2ZXJFcnJvckxpc3RlbmVycy5kZWxldGUobGlzdGVuZXIpO1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIG5vdGlmeVNlcnZlckVycm9yKHBhdGg6IHN0cmluZywgZXJyb3I6IFNlcnZlckVycm9ySW5mbyB8IG51bGwpIHtcbiAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIHRoaXMuc2VydmVyRXJyb3JMaXN0ZW5lcnMpIGxpc3RlbmVyKHBhdGgsIGVycm9yKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2VuZE1lc3NhZ2UocGF5bG9hZDogQ2xpZW50TWVzc2FnZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmlzQ29ubmVjdGVkKCkpIHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKFwiW1NvY2tldElPVHJhbnNwb3J0XSBTZW5kaW5nOlwiLCBwYXlsb2FkKTtcbiAgICAgIHRoaXMuc29ja2V0IS5lbWl0KFwibWVzc2FnZVwiLCBzZXJpYWxpemUocGF5bG9hZCBhcyBhbnkpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gY29uc29sZS5sb2coXCJbU29ja2V0SU9UcmFuc3BvcnRdIFF1ZXVpbmcgbWVzc2FnZTpcIiwgcGF5bG9hZCk7XG4gICAgICB0aGlzLm1lc3NhZ2VRdWV1ZS5wdXNoKHBheWxvYWQpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBzZW5kQ2hhbm5lbE1lc3NhZ2UoXG4gICAgbWVzc2FnZTogQ2xpZW50Q2hhbm5lbE1lc3NhZ2VcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5zZW5kTWVzc2FnZShtZXNzYWdlKTtcbiAgfVxuXG4gIHB1YmxpYyBtb3VudFZpZXcocGF0aDogc3RyaW5nLCB2aWV3OiBNb3VudGVkVmlldykge1xuICAgIGlmICh0aGlzLmFjdGl2ZVZpZXdzLmhhcyhwYXRoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBQYXRoICR7cGF0aH0gaXMgYWxyZWFkeSBtb3VudGVkYCk7XG4gICAgfVxuICAgIHRoaXMuYWN0aXZlVmlld3Muc2V0KHBhdGgsIHZpZXcpO1xuICAgIHZvaWQgdGhpcy5zZW5kTWVzc2FnZSh7XG4gICAgICB0eXBlOiBcIm1vdW50XCIsXG4gICAgICBwYXRoLFxuICAgICAgcm91dGVJbmZvOiB2aWV3LnJvdXRlSW5mbyxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBuYXZpZ2F0ZShwYXRoOiBzdHJpbmcsIHJvdXRlSW5mbzogUm91dGVJbmZvKSB7XG4gICAgYXdhaXQgdGhpcy5zZW5kTWVzc2FnZSh7XG4gICAgICB0eXBlOiBcIm5hdmlnYXRlXCIsXG4gICAgICBwYXRoLFxuICAgICAgcm91dGVJbmZvLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHVubW91bnQocGF0aDogc3RyaW5nKSB7XG4gICAgdm9pZCB0aGlzLnNlbmRNZXNzYWdlKHsgdHlwZTogXCJ1bm1vdW50XCIsIHBhdGggfSk7XG4gICAgdGhpcy5hY3RpdmVWaWV3cy5kZWxldGUocGF0aCk7XG4gIH1cblxuICBwdWJsaWMgZGlzY29ubmVjdCgpIHtcbiAgICB0aGlzLnNvY2tldD8uZGlzY29ubmVjdCgpO1xuICAgIHRoaXMuc29ja2V0ID0gbnVsbDtcbiAgICB0aGlzLm1lc3NhZ2VRdWV1ZSA9IFtdO1xuICAgIHRoaXMuY29ubmVjdGlvbkxpc3RlbmVycy5jbGVhcigpO1xuICAgIHRoaXMuYWN0aXZlVmlld3MuY2xlYXIoKTtcbiAgICB0aGlzLnNlcnZlckVycm9ycy5jbGVhcigpO1xuICAgIHRoaXMuc2VydmVyRXJyb3JMaXN0ZW5lcnMuY2xlYXIoKTtcbiAgICBmb3IgKGNvbnN0IHsgYnJpZGdlIH0gb2YgdGhpcy5jaGFubmVscy52YWx1ZXMoKSkge1xuICAgICAgYnJpZGdlLmRpc3Bvc2UobmV3IFB1bHNlQ2hhbm5lbFJlc2V0RXJyb3IoXCJDbGllbnQgZGlzY29ubmVjdGVkXCIpKTtcbiAgICB9XG4gICAgdGhpcy5jaGFubmVscy5jbGVhcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVTZXJ2ZXJNZXNzYWdlKG1lc3NhZ2U6IFNlcnZlck1lc3NhZ2UpIHtcbiAgICAvLyBjb25zb2xlLmxvZyhcIltQdWxzZUNsaWVudF0gUmVjZWl2ZWQgbWVzc2FnZTpcIiwgbWVzc2FnZSk7XG4gICAgc3dpdGNoIChtZXNzYWdlLnR5cGUpIHtcbiAgICAgIGNhc2UgXCJ2ZG9tX2luaXRcIjoge1xuICAgICAgICBjb25zdCByb3V0ZSA9IHRoaXMuYWN0aXZlVmlld3MuZ2V0KG1lc3NhZ2UucGF0aCk7XG4gICAgICAgIC8vIElnbm9yZSBtZXNzYWdlcyBmb3IgcGF0aHMgdGhhdCBhcmUgbm90IG1vdW50ZWRcbiAgICAgICAgaWYgKCFyb3V0ZSkgcmV0dXJuO1xuICAgICAgICBpZiAocm91dGUpIHtcbiAgICAgICAgICByb3V0ZS5vbkluaXQoXG4gICAgICAgICAgICBtZXNzYWdlLnZkb20sXG4gICAgICAgICAgICBtZXNzYWdlLmNhbGxiYWNrcyxcbiAgICAgICAgICAgIG1lc3NhZ2UucmVuZGVyX3Byb3BzLFxuICAgICAgICAgICAgbWVzc2FnZS5jc3NfcmVmc1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2xlYXIgYW55IHByaW9yIGVycm9yIGZvciB0aGlzIHBhdGggb24gc3VjY2Vzc2Z1bCBpbml0XG4gICAgICAgIGlmICh0aGlzLnNlcnZlckVycm9ycy5oYXMobWVzc2FnZS5wYXRoKSkge1xuICAgICAgICAgIHRoaXMuc2VydmVyRXJyb3JzLmRlbGV0ZShtZXNzYWdlLnBhdGgpO1xuICAgICAgICAgIHRoaXMubm90aWZ5U2VydmVyRXJyb3IobWVzc2FnZS5wYXRoLCBudWxsKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJ2ZG9tX3VwZGF0ZVwiOiB7XG4gICAgICAgIGNvbnN0IHJvdXRlID0gdGhpcy5hY3RpdmVWaWV3cy5nZXQobWVzc2FnZS5wYXRoKTtcbiAgICAgICAgaWYgKCFyb3V0ZSkgcmV0dXJuOyAvLyBOb3QgYW4gYWN0aXZlIHBhdGg7IGRpc2NhcmRcbiAgICAgICAgcm91dGUub25VcGRhdGUobWVzc2FnZS5vcHMpO1xuICAgICAgICAvLyBDbGVhciBhbnkgcHJpb3IgZXJyb3IgZm9yIHRoaXMgcGF0aCBvbiBzdWNjZXNzZnVsIHVwZGF0ZVxuICAgICAgICBpZiAodGhpcy5zZXJ2ZXJFcnJvcnMuaGFzKG1lc3NhZ2UucGF0aCkpIHtcbiAgICAgICAgICB0aGlzLnNlcnZlckVycm9ycy5kZWxldGUobWVzc2FnZS5wYXRoKTtcbiAgICAgICAgICB0aGlzLm5vdGlmeVNlcnZlckVycm9yKG1lc3NhZ2UucGF0aCwgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFwic2VydmVyX2Vycm9yXCI6IHtcbiAgICAgICAgaWYgKCF0aGlzLmFjdGl2ZVZpZXdzLmhhcyhtZXNzYWdlLnBhdGgpKSByZXR1cm47IC8vIGRpc2NhcmQgZm9yIGluYWN0aXZlIHBhdGhzXG4gICAgICAgIHRoaXMuc2VydmVyRXJyb3JzLnNldChtZXNzYWdlLnBhdGgsIG1lc3NhZ2UuZXJyb3IpO1xuICAgICAgICB0aGlzLm5vdGlmeVNlcnZlckVycm9yKG1lc3NhZ2UucGF0aCwgbWVzc2FnZS5lcnJvcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBcImFwaV9jYWxsXCI6IHtcbiAgICAgICAgdm9pZCB0aGlzLnBlcmZvcm1BcGlDYWxsKG1lc3NhZ2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJuYXZpZ2F0ZV90b1wiOiB7XG4gICAgICAgIC8vIGBuYXZpZ2F0ZV90b2AgaXMgbmF2aWdhdGlvbmFsOyBhbGxvdyByZWdhcmRsZXNzIG9mIGFjdGl2ZVZpZXdzIG1lbWJlcnNoaXBcbiAgICAgICAgY29uc3QgcmVwbGFjZSA9ICEhbWVzc2FnZS5yZXBsYWNlO1xuICAgICAgICBsZXQgZGVzdCA9IG1lc3NhZ2UucGF0aCB8fCBcIlwiO1xuICAgICAgICAvLyBOb3JtYWxpemUgcHJvdG9jb2wtcmVsYXRpdmUgVVJMcyB0byBhYnNvbHV0ZVxuICAgICAgICBpZiAoZGVzdC5zdGFydHNXaXRoKFwiLy9cIikpIGRlc3QgPSBgJHt3aW5kb3cubG9jYXRpb24ucHJvdG9jb2x9JHtkZXN0fWA7XG4gICAgICAgIGNvbnN0IGhhc1NjaGVtZSA9IC9eW2EtekEtWl1bYS16QS1aMC05Ky4tXSo6Ly50ZXN0KGRlc3QpO1xuICAgICAgICBpZiAoaGFzU2NoZW1lKSB7XG4gICAgICAgICAgaWYgKGRlc3Quc3RhcnRzV2l0aChcImh0dHA6Ly9cIikgfHwgZGVzdC5zdGFydHNXaXRoKFwiaHR0cHM6Ly9cIikpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoZGVzdCk7XG4gICAgICAgICAgICAgIGlmICh1cmwub3JpZ2luID09PSB3aW5kb3cubG9jYXRpb24ub3JpZ2luKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW50ZXJuYWwgPSBgJHt1cmwucGF0aG5hbWV9JHt1cmwuc2VhcmNofSR7dXJsLmhhc2h9YDtcbiAgICAgICAgICAgICAgICB0aGlzLmZyYW1ld29ya05hdmlnYXRlKGludGVybmFsLCB7IHJlcGxhY2UgfSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlcGxhY2UpIHdpbmRvdy5sb2NhdGlvbi5yZXBsYWNlKGRlc3QpO1xuICAgICAgICAgICAgICAgIGVsc2Ugd2luZG93LmxvY2F0aW9uLmFzc2lnbihkZXN0KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgIGlmIChyZXBsYWNlKSB3aW5kb3cubG9jYXRpb24ucmVwbGFjZShkZXN0KTtcbiAgICAgICAgICAgICAgZWxzZSB3aW5kb3cubG9jYXRpb24uYXNzaWduKGRlc3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBtYWlsdG86LCB0ZWw6LCBkYXRhOiwgZXRjLlxuICAgICAgICAgICAgaWYgKHJlcGxhY2UpIHdpbmRvdy5sb2NhdGlvbi5yZXBsYWNlKGRlc3QpO1xuICAgICAgICAgICAgZWxzZSB3aW5kb3cubG9jYXRpb24uYXNzaWduKGRlc3QpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBSZWxhdGl2ZSBvciByb290LXJlbGF0aXZlIHBhdGgg4oaSIFNQQSBuYXZpZ2F0ZVxuICAgICAgICAgIHRoaXMuZnJhbWV3b3JrTmF2aWdhdGUoZGVzdCwgeyByZXBsYWNlIH0pO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBcImNoYW5uZWxfbWVzc2FnZVwiOiB7XG4gICAgICAgIHRoaXMucm91dGVDaGFubmVsTWVzc2FnZShtZXNzYWdlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJVbmV4cGVjdGVkIG1lc3NhZ2U6XCIsIG1lc3NhZ2UpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcGVyZm9ybUFwaUNhbGwobXNnOiBTZXJ2ZXJBcGlDYWxsTWVzc2FnZSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChtc2cudXJsLCB7XG4gICAgICAgIG1ldGhvZDogbXNnLm1ldGhvZCB8fCBcIkdFVFwiLFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgLi4uKG1zZy5oZWFkZXJzIHx8IHt9KSxcbiAgICAgICAgICAuLi4obXNnLmJvZHkgIT0gbnVsbCAmJiAhKFwiY29udGVudC10eXBlXCIgaW4gKG1zZy5oZWFkZXJzIHx8IHt9KSlcbiAgICAgICAgICAgID8geyBcImNvbnRlbnQtdHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIiB9XG4gICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgfSxcbiAgICAgICAgYm9keTpcbiAgICAgICAgICBtc2cuYm9keSAhPSBudWxsXG4gICAgICAgICAgICA/IHR5cGVvZiBtc2cuYm9keSA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgICAgICA/IG1zZy5ib2R5XG4gICAgICAgICAgICAgIDogSlNPTi5zdHJpbmdpZnkobXNnLmJvZHkpXG4gICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgY3JlZGVudGlhbHM6IG1zZy5jcmVkZW50aWFscyB8fCBcImluY2x1ZGVcIixcbiAgICAgIH0pO1xuICAgICAgY29uc3QgaGVhZGVyc09iajogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgICAgcmVzLmhlYWRlcnMuZm9yRWFjaCgodiwgaykgPT4gKGhlYWRlcnNPYmpba10gPSB2KSk7XG4gICAgICBsZXQgYm9keTogYW55ID0gbnVsbDtcbiAgICAgIGNvbnN0IGN0ID0gcmVzLmhlYWRlcnMuZ2V0KFwiY29udGVudC10eXBlXCIpIHx8IFwiXCI7XG4gICAgICBpZiAoY3QuaW5jbHVkZXMoXCJhcHBsaWNhdGlvbi9qc29uXCIpKSB7XG4gICAgICAgIGJvZHkgPSBhd2FpdCByZXMuanNvbigpLmNhdGNoKCgpID0+IG51bGwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYm9keSA9IGF3YWl0IHJlcy50ZXh0KCkuY2F0Y2goKCkgPT4gbnVsbCk7XG4gICAgICB9XG4gICAgICBjb25zdCByZXBseTogQ2xpZW50QXBpUmVzdWx0TWVzc2FnZSA9IHtcbiAgICAgICAgdHlwZTogXCJhcGlfcmVzdWx0XCIsXG4gICAgICAgIGlkOiBtc2cuaWQsXG4gICAgICAgIG9rOiByZXMub2ssXG4gICAgICAgIHN0YXR1czogcmVzLnN0YXR1cyxcbiAgICAgICAgaGVhZGVyczogaGVhZGVyc09iaixcbiAgICAgICAgYm9keSxcbiAgICAgIH07XG4gICAgICBhd2FpdCB0aGlzLnNlbmRNZXNzYWdlKHJlcGx5KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnN0IHJlcGx5OiBDbGllbnRBcGlSZXN1bHRNZXNzYWdlID0ge1xuICAgICAgICB0eXBlOiBcImFwaV9yZXN1bHRcIixcbiAgICAgICAgaWQ6IG1zZy5pZCxcbiAgICAgICAgb2s6IGZhbHNlLFxuICAgICAgICBzdGF0dXM6IDAsXG4gICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgICBib2R5OiB7IGVycm9yOiBTdHJpbmcoZXJyKSB9LFxuICAgICAgfTtcbiAgICAgIGF3YWl0IHRoaXMuc2VuZE1lc3NhZ2UocmVwbHkpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBpbnZva2VDYWxsYmFjayhwYXRoOiBzdHJpbmcsIGNhbGxiYWNrOiBzdHJpbmcsIGFyZ3M6IGFueVtdKSB7XG4gICAgYXdhaXQgdGhpcy5zZW5kTWVzc2FnZSh7XG4gICAgICB0eXBlOiBcImNhbGxiYWNrXCIsXG4gICAgICBwYXRoLFxuICAgICAgY2FsbGJhY2ssXG4gICAgICBhcmdzOiBhcmdzLm1hcChleHRyYWN0RXZlbnQpLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFjcXVpcmVDaGFubmVsKGlkOiBzdHJpbmcpOiBDaGFubmVsQnJpZGdlIHtcbiAgICBjb25zdCBlbnRyeSA9IHRoaXMuZW5zdXJlQ2hhbm5lbEVudHJ5KGlkKTtcbiAgICBlbnRyeS5yZWZDb3VudCArPSAxO1xuICAgIHJldHVybiBlbnRyeS5icmlkZ2U7XG4gIH1cblxuICBwdWJsaWMgcmVsZWFzZUNoYW5uZWwoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5jaGFubmVscy5nZXQoaWQpO1xuICAgIGlmICghZW50cnkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZW50cnkucmVmQ291bnQgPSBNYXRoLm1heCgwLCBlbnRyeS5yZWZDb3VudCAtIDEpO1xuICAgIGlmIChlbnRyeS5yZWZDb3VudCA9PT0gMCkge1xuICAgICAgZW50cnkuYnJpZGdlLmRpc3Bvc2UobmV3IFB1bHNlQ2hhbm5lbFJlc2V0RXJyb3IoXCJDaGFubmVsIHJlbGVhc2VkXCIpKTtcbiAgICAgIHRoaXMuY2hhbm5lbHMuZGVsZXRlKGlkKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGVuc3VyZUNoYW5uZWxFbnRyeShpZDogc3RyaW5nKToge1xuICAgIGJyaWRnZTogQ2hhbm5lbEJyaWRnZTtcbiAgICByZWZDb3VudDogbnVtYmVyO1xuICB9IHtcbiAgICBsZXQgZW50cnkgPSB0aGlzLmNoYW5uZWxzLmdldChpZCk7XG4gICAgaWYgKCFlbnRyeSkge1xuICAgICAgZW50cnkgPSB7XG4gICAgICAgIGJyaWRnZTogY3JlYXRlQ2hhbm5lbEJyaWRnZSh0aGlzLCBpZCksXG4gICAgICAgIHJlZkNvdW50OiAwLFxuICAgICAgfTtcbiAgICAgIHRoaXMuY2hhbm5lbHMuc2V0KGlkLCBlbnRyeSk7XG4gICAgfVxuICAgIHJldHVybiBlbnRyeTtcbiAgfVxuXG4gIHByaXZhdGUgcm91dGVDaGFubmVsTWVzc2FnZShtZXNzYWdlOiBTZXJ2ZXJDaGFubmVsTWVzc2FnZSk6IHZvaWQge1xuICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5lbnN1cmVDaGFubmVsRW50cnkobWVzc2FnZS5jaGFubmVsKTtcbiAgICBjb25zdCBjbG9zZWQgPSBlbnRyeS5icmlkZ2UuaGFuZGxlU2VydmVyTWVzc2FnZShtZXNzYWdlKTtcbiAgICBpZiAoY2xvc2VkICYmIGVudHJ5LnJlZkNvdW50ID09PSAwKSB7XG4gICAgICB0aGlzLmNoYW5uZWxzLmRlbGV0ZShtZXNzYWdlLmNoYW5uZWwpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlVHJhbnNwb3J0RGlzY29ubmVjdCgpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHRoaXMuY2hhbm5lbHMudmFsdWVzKCkpIHtcbiAgICAgIGVudHJ5LmJyaWRnZS5oYW5kbGVEaXNjb25uZWN0KFxuICAgICAgICBuZXcgUHVsc2VDaGFubmVsUmVzZXRFcnJvcihcIkNvbm5lY3Rpb24gbG9zdFwiKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvLyBwdWJsaWMgZ2V0VkRPTShwYXRoOiBzdHJpbmcpOiBWRE9NIHwgbnVsbCB7XG4gIC8vICAgcmV0dXJuIHRoaXMuYWN0aXZlVmlld3MuZ2V0KHBhdGgpPy52ZG9tID8/IG51bGw7XG4gIC8vIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUge1xuICBTZXJ2ZXJDaGFubmVsTWVzc2FnZSxcbiAgU2VydmVyQ2hhbm5lbFJlcXVlc3RNZXNzYWdlLFxuICBTZXJ2ZXJDaGFubmVsUmVzcG9uc2VNZXNzYWdlLFxufSBmcm9tIFwiLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHR5cGUgeyBQdWxzZVNvY2tldElPQ2xpZW50IH0gZnJvbSBcIi4vY2xpZW50XCI7XG5cbmV4cG9ydCBjbGFzcyBQdWxzZUNoYW5uZWxSZXNldEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSBcIlB1bHNlQ2hhbm5lbFJlc2V0RXJyb3JcIjtcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBDaGFubmVsRXZlbnRIYW5kbGVyID0gKHBheWxvYWQ6IGFueSkgPT4gYW55IHwgUHJvbWlzZTxhbnk+O1xuXG5pbnRlcmZhY2UgUGVuZGluZ1JlcXVlc3Qge1xuICByZXNvbHZlOiAodmFsdWU6IGFueSkgPT4gdm9pZDtcbiAgcmVqZWN0OiAoZXJyb3I6IGFueSkgPT4gdm9pZDtcbn1cblxuZnVuY3Rpb24gcmFuZG9tSWQoKTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiBjcnlwdG8gIT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIGNyeXB0by5yYW5kb21VVUlEID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gY3J5cHRvLnJhbmRvbVVVSUQoKS5yZXBsYWNlKC8tL2csIFwiXCIpO1xuICB9XG4gIHJldHVybiBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDE2KS5zbGljZSgyKSArIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMTYpLnNsaWNlKDIpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRFcnJvcihlcnJvcjogdW5rbm93bik6IHN0cmluZyB7XG4gIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSByZXR1cm4gZXJyb3IubWVzc2FnZTtcbiAgaWYgKHR5cGVvZiBlcnJvciA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGVycm9yO1xuICB0cnkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShlcnJvcik7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBTdHJpbmcoZXJyb3IpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzU2VydmVyUmVzcG9uc2VNZXNzYWdlKFxuICBtZXNzYWdlOiBTZXJ2ZXJDaGFubmVsTWVzc2FnZVxuKTogbWVzc2FnZSBpcyBTZXJ2ZXJDaGFubmVsUmVzcG9uc2VNZXNzYWdlIHtcbiAgcmV0dXJuIHR5cGVvZiAobWVzc2FnZSBhcyBTZXJ2ZXJDaGFubmVsUmVzcG9uc2VNZXNzYWdlKS5yZXNwb25zZVRvID09PSBcInN0cmluZ1wiO1xufVxuXG5mdW5jdGlvbiBpc1NlcnZlclJlcXVlc3RNZXNzYWdlKFxuICBtZXNzYWdlOiBTZXJ2ZXJDaGFubmVsTWVzc2FnZVxuKTogbWVzc2FnZSBpcyBTZXJ2ZXJDaGFubmVsUmVxdWVzdE1lc3NhZ2Uge1xuICByZXR1cm4gdHlwZW9mIChtZXNzYWdlIGFzIFNlcnZlckNoYW5uZWxSZXF1ZXN0TWVzc2FnZSkuZXZlbnQgPT09IFwic3RyaW5nXCI7XG59XG5cbmV4cG9ydCBjbGFzcyBDaGFubmVsQnJpZGdlIHtcbiAgcHJpdmF0ZSBoYW5kbGVycyA9IG5ldyBNYXA8c3RyaW5nLCBTZXQ8Q2hhbm5lbEV2ZW50SGFuZGxlcj4+KCk7XG4gIHByaXZhdGUgcGVuZGluZyA9IG5ldyBNYXA8c3RyaW5nLCBQZW5kaW5nUmVxdWVzdD4oKTtcbiAgcHJpdmF0ZSBiYWNrbG9nOiBTZXJ2ZXJDaGFubmVsUmVxdWVzdE1lc3NhZ2VbXSA9IFtdO1xuICBwcml2YXRlIGNsb3NlZCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2xpZW50OiBQdWxzZVNvY2tldElPQ2xpZW50LCBwdWJsaWMgcmVhZG9ubHkgaWQ6IHN0cmluZykge31cblxuICBlbWl0KGV2ZW50OiBzdHJpbmcsIHBheWxvYWQ/OiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLmVuc3VyZU9wZW4oKTtcbiAgICB2b2lkIHRoaXMuY2xpZW50LnNlbmRDaGFubmVsTWVzc2FnZSh7XG4gICAgICB0eXBlOiBcImNoYW5uZWxfbWVzc2FnZVwiLFxuICAgICAgY2hhbm5lbDogdGhpcy5pZCxcbiAgICAgIGV2ZW50LFxuICAgICAgcGF5bG9hZCxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHJlcXVlc3QoZXZlbnQ6IHN0cmluZywgcGF5bG9hZD86IGFueSk6IFByb21pc2U8YW55PiB7XG4gICAgdGhpcy5lbnN1cmVPcGVuKCk7XG4gICAgY29uc3QgcmVxdWVzdElkID0gcmFuZG9tSWQoKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5wZW5kaW5nLnNldChyZXF1ZXN0SWQsIHsgcmVzb2x2ZSwgcmVqZWN0IH0pO1xuICAgICAgdm9pZCB0aGlzLmNsaWVudFxuICAgICAgICAuc2VuZENoYW5uZWxNZXNzYWdlKHtcbiAgICAgICAgICB0eXBlOiBcImNoYW5uZWxfbWVzc2FnZVwiLFxuICAgICAgICAgIGNoYW5uZWw6IHRoaXMuaWQsXG4gICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgdGhpcy5wZW5kaW5nLmRlbGV0ZShyZXF1ZXN0SWQpO1xuICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIG9uKGV2ZW50OiBzdHJpbmcsIGhhbmRsZXI6IENoYW5uZWxFdmVudEhhbmRsZXIpOiAoKSA9PiB2b2lkIHtcbiAgICB0aGlzLmVuc3VyZU9wZW4oKTtcbiAgICBsZXQgYnVja2V0ID0gdGhpcy5oYW5kbGVycy5nZXQoZXZlbnQpO1xuICAgIGlmICghYnVja2V0KSB7XG4gICAgICBidWNrZXQgPSBuZXcgU2V0KCk7XG4gICAgICB0aGlzLmhhbmRsZXJzLnNldChldmVudCwgYnVja2V0KTtcbiAgICB9XG4gICAgYnVja2V0LmFkZChoYW5kbGVyKTtcbiAgICB0aGlzLmZsdXNoQmFja2xvZyhldmVudCk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGNvbnN0IHNldCA9IHRoaXMuaGFuZGxlcnMuZ2V0KGV2ZW50KTtcbiAgICAgIGlmICghc2V0KSByZXR1cm47XG4gICAgICBzZXQuZGVsZXRlKGhhbmRsZXIpO1xuICAgICAgaWYgKHNldC5zaXplID09PSAwKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlcnMuZGVsZXRlKGV2ZW50KTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgaGFuZGxlU2VydmVyTWVzc2FnZShtZXNzYWdlOiBTZXJ2ZXJDaGFubmVsTWVzc2FnZSk6IGJvb2xlYW4ge1xuICAgIGlmIChpc1NlcnZlclJlc3BvbnNlTWVzc2FnZShtZXNzYWdlKSkge1xuICAgICAgdGhpcy5yZXNvbHZlUGVuZGluZyhtZXNzYWdlKTtcbiAgICAgIHJldHVybiB0aGlzLmNsb3NlZDtcbiAgICB9XG4gICAgaWYgKHRoaXMuY2xvc2VkKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKCFpc1NlcnZlclJlcXVlc3RNZXNzYWdlKG1lc3NhZ2UpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jbG9zZWQ7XG4gICAgfVxuXG4gICAgaWYgKG1lc3NhZ2UuZXZlbnQgPT09IFwiX19jbG9zZV9fXCIpIHtcbiAgICAgIHRoaXMuY2xvc2UobmV3IFB1bHNlQ2hhbm5lbFJlc2V0RXJyb3IoXCJDaGFubmVsIGNsb3NlZCBieSBzZXJ2ZXJcIikpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChtZXNzYWdlLnJlcXVlc3RJZCkge1xuICAgICAgdm9pZCB0aGlzLmRpc3BhdGNoUmVxdWVzdChtZXNzYWdlIGFzIFNlcnZlckNoYW5uZWxSZXF1ZXN0TWVzc2FnZSAmIHtcbiAgICAgICAgcmVxdWVzdElkOiBzdHJpbmc7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG1lc3NhZ2UpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jbG9zZWQ7XG4gIH1cblxuICBoYW5kbGVEaXNjb25uZWN0KHJlYXNvbjogUHVsc2VDaGFubmVsUmVzZXRFcnJvcik6IHZvaWQge1xuICAgIHRoaXMuY2xvc2UocmVhc29uKTtcbiAgfVxuXG4gIGRpc3Bvc2UocmVhc29uOiBQdWxzZUNoYW5uZWxSZXNldEVycm9yKTogdm9pZCB7XG4gICAgdGhpcy5jbG9zZShyZWFzb24pO1xuICB9XG5cbiAgcHJpdmF0ZSBlbnN1cmVPcGVuKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNsb3NlZCkge1xuICAgICAgdGhyb3cgbmV3IFB1bHNlQ2hhbm5lbFJlc2V0RXJyb3IoXCJDaGFubmVsIGlzIGNsb3NlZFwiKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZsdXNoQmFja2xvZyhldmVudDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYmFja2xvZy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICBjb25zdCByZW1haW5pbmc6IFNlcnZlckNoYW5uZWxSZXF1ZXN0TWVzc2FnZVtdID0gW107XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMuYmFja2xvZykge1xuICAgICAgaWYgKGl0ZW0uZXZlbnQgPT09IGV2ZW50KSB7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChpdGVtKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlbWFpbmluZy5wdXNoKGl0ZW0pO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmJhY2tsb2cgPSByZW1haW5pbmc7XG4gIH1cblxuICBwcml2YXRlIGRpc3BhdGNoRXZlbnQobWVzc2FnZTogU2VydmVyQ2hhbm5lbFJlcXVlc3RNZXNzYWdlKTogdm9pZCB7XG4gICAgY29uc3QgaGFuZGxlcnMgPSB0aGlzLmhhbmRsZXJzLmdldChtZXNzYWdlLmV2ZW50KTtcbiAgICBpZiAoIWhhbmRsZXJzIHx8IGhhbmRsZXJzLnNpemUgPT09IDApIHtcbiAgICAgIHRoaXMuYmFja2xvZy5wdXNoKG1lc3NhZ2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgaGFuZGxlcnMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGhhbmRsZXIobWVzc2FnZS5wYXlsb2FkKTtcbiAgICAgICAgaWYgKHJlc3VsdCAmJiB0eXBlb2YgKHJlc3VsdCBhcyBQcm9taXNlPGFueT4pLnRoZW4gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIHZvaWQgKHJlc3VsdCBhcyBQcm9taXNlPGFueT4pLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJQdWxzZSBjaGFubmVsIGhhbmRsZXIgZXJyb3JcIiwgZXJyKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJQdWxzZSBjaGFubmVsIGhhbmRsZXIgZXJyb3JcIiwgZXJyKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGRpc3BhdGNoUmVxdWVzdChcbiAgICBtZXNzYWdlOiBTZXJ2ZXJDaGFubmVsUmVxdWVzdE1lc3NhZ2UgJiB7IHJlcXVlc3RJZDogc3RyaW5nIH1cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaGFuZGxlcnMgPSB0aGlzLmhhbmRsZXJzLmdldChtZXNzYWdlLmV2ZW50KTtcbiAgICBsZXQgcmVzcG9uc2U6IGFueTtcbiAgICBsZXQgZXJyb3I6IGFueTtcbiAgICBpZiAoaGFuZGxlcnMgJiYgaGFuZGxlcnMuc2l6ZSA+IDApIHtcbiAgICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiBoYW5kbGVycykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGhhbmRsZXIobWVzc2FnZS5wYXlsb2FkKTtcbiAgICAgICAgICByZXNwb25zZSA9IGF3YWl0IFByb21pc2UucmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICAgIGlmIChyZXNwb25zZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGVycm9yID0gZXJyO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChlcnJvcikge1xuICAgICAgYXdhaXQgdGhpcy5jbGllbnQuc2VuZENoYW5uZWxNZXNzYWdlKHtcbiAgICAgICAgdHlwZTogXCJjaGFubmVsX21lc3NhZ2VcIixcbiAgICAgICAgY2hhbm5lbDogdGhpcy5pZCxcbiAgICAgICAgZXZlbnQ6IHVuZGVmaW5lZCxcbiAgICAgICAgcmVzcG9uc2VUbzogbWVzc2FnZS5yZXF1ZXN0SWQsXG4gICAgICAgIGVycm9yOiBmb3JtYXRFcnJvcihlcnJvciksXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5jbGllbnQuc2VuZENoYW5uZWxNZXNzYWdlKHtcbiAgICAgIHR5cGU6IFwiY2hhbm5lbF9tZXNzYWdlXCIsXG4gICAgICBjaGFubmVsOiB0aGlzLmlkLFxuICAgICAgZXZlbnQ6IHVuZGVmaW5lZCxcbiAgICAgIHJlc3BvbnNlVG86IG1lc3NhZ2UucmVxdWVzdElkLFxuICAgICAgcGF5bG9hZDogcmVzcG9uc2UsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVQZW5kaW5nKG1lc3NhZ2U6IFNlcnZlckNoYW5uZWxSZXNwb25zZU1lc3NhZ2UpOiB2b2lkIHtcbiAgICBjb25zdCBlbnRyeSA9IG1lc3NhZ2UucmVzcG9uc2VUbyA/IHRoaXMucGVuZGluZy5nZXQobWVzc2FnZS5yZXNwb25zZVRvKSA6IHVuZGVmaW5lZDtcbiAgICBpZiAoIWVudHJ5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucGVuZGluZy5kZWxldGUobWVzc2FnZS5yZXNwb25zZVRvISk7XG4gICAgaWYgKG1lc3NhZ2UuZXJyb3IgIT09IHVuZGVmaW5lZCAmJiBtZXNzYWdlLmVycm9yICE9PSBudWxsKSB7XG4gICAgICBlbnRyeS5yZWplY3QobmV3IFB1bHNlQ2hhbm5lbFJlc2V0RXJyb3IoU3RyaW5nKG1lc3NhZ2UuZXJyb3IpKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVudHJ5LnJlc29sdmUobWVzc2FnZS5wYXlsb2FkKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNsb3NlKHJlYXNvbjogUHVsc2VDaGFubmVsUmVzZXRFcnJvcik6IHZvaWQge1xuICAgIGlmICh0aGlzLmNsb3NlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmNsb3NlZCA9IHRydWU7XG4gICAgZm9yIChjb25zdCByZXF1ZXN0IG9mIHRoaXMucGVuZGluZy52YWx1ZXMoKSkge1xuICAgICAgcmVxdWVzdC5yZWplY3QocmVhc29uKTtcbiAgICB9XG4gICAgdGhpcy5wZW5kaW5nLmNsZWFyKCk7XG4gICAgdGhpcy5oYW5kbGVycy5jbGVhcigpO1xuICAgIHRoaXMuYmFja2xvZyA9IFtdO1xuICAgIC8vIE5vLW9wOiBvd25pbmcgY2xpZW50IG1hbmFnZXMgcmVnaXN0cnkgbGlmZWN5Y2xlLlxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDaGFubmVsQnJpZGdlKFxuICBjbGllbnQ6IFB1bHNlU29ja2V0SU9DbGllbnQsXG4gIGlkOiBzdHJpbmdcbik6IENoYW5uZWxCcmlkZ2Uge1xuICByZXR1cm4gbmV3IENoYW5uZWxCcmlkZ2UoY2xpZW50LCBpZCk7XG59XG4iLAogICAgImltcG9ydCB7IHVzZUVmZmVjdCwgdXNlTWVtbyB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgdXNlUHVsc2VDbGllbnQgfSBmcm9tIFwiLi9wdWxzZVwiO1xuaW1wb3J0IHR5cGUgeyBDaGFubmVsQnJpZGdlIH0gZnJvbSBcIi4vY2hhbm5lbFwiO1xuXG5leHBvcnQgZnVuY3Rpb24gdXNlUHVsc2VDaGFubmVsKGNoYW5uZWxJZDogc3RyaW5nKTogQ2hhbm5lbEJyaWRnZSB7XG4gIGNvbnN0IGNsaWVudCA9IHVzZVB1bHNlQ2xpZW50KCk7XG4gIGNvbnN0IGJyaWRnZSA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGlmICghY2hhbm5lbElkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1c2VQdWxzZUNoYW5uZWwgcmVxdWlyZXMgYSBub24tZW1wdHkgY2hhbm5lbElkXCIpO1xuICAgIH1cbiAgICByZXR1cm4gY2xpZW50LmFjcXVpcmVDaGFubmVsKGNoYW5uZWxJZCk7XG4gIH0sIFtjbGllbnQsIGNoYW5uZWxJZF0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGNsaWVudC5yZWxlYXNlQ2hhbm5lbChjaGFubmVsSWQpO1xuICAgIH07XG4gIH0sIFtjbGllbnQsIGNoYW5uZWxJZF0pO1xuXG4gIHJldHVybiBicmlkZ2U7XG59XG4iLAogICAgImltcG9ydCBSZWFjdCwgeyBmb3J3YXJkUmVmLCB1c2VDYWxsYmFjaywgdHlwZSBGb3JtRXZlbnQgfSBmcm9tIFwicmVhY3RcIjtcblxuZXhwb3J0IHR5cGUgUHVsc2VGb3JtUHJvcHMgPSBSZWFjdC5Db21wb25lbnRQcm9wc1dpdGhvdXRSZWY8XCJmb3JtXCI+ICYge1xuICBhY3Rpb246IHN0cmluZztcbn07XG5cbi8qKlxuICogUHVsc2VGb3JtIGludGVyY2VwdHMgbmF0aXZlIGZvcm0gc3VibWlzc2lvbnMgYW5kIHNlbmRzIHRoZW0gdGhyb3VnaCBmZXRjaCBzbyB0aGVcbiAqIHN1cnJvdW5kaW5nIFB1bHNlIHZpZXcgc3RheXMgbW91bnRlZC4gU2VydmVyLXNpZGUgaGFuZGxlcnMgYXJlIHN0aWxsIGludm9rZWQgdmlhXG4gKiB0aGUgZm9ybSBhY3Rpb24gZW5kcG9pbnQgYW5kIHJlYWN0aXZlIHVwZGF0ZXMgcHJvcGFnYXRlIG92ZXIgdGhlIHNvY2tldC5cbiAqL1xuZXhwb3J0IGNvbnN0IFB1bHNlRm9ybSA9IGZvcndhcmRSZWY8SFRNTEZvcm1FbGVtZW50LCBQdWxzZUZvcm1Qcm9wcz4oXG4gIGZ1bmN0aW9uIFB1bHNlRm9ybSh7IG9uU3VibWl0LCBhY3Rpb24sIC4uLnJlc3QgfSwgcmVmKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxmb3JtXG4gICAgICAgIHsuLi5yZXN0fVxuICAgICAgICBhY3Rpb249e2FjdGlvbn1cbiAgICAgICAgcmVmPXtyZWZ9XG4gICAgICAgIG9uU3VibWl0PXt1c2VDYWxsYmFjayhcbiAgICAgICAgICAoZXZlbnQ6IEZvcm1FdmVudDxIVE1MRm9ybUVsZW1lbnQ+KSA9PlxuICAgICAgICAgICAgc3VibWl0Rm9ybSh7IGV2ZW50LCBhY3Rpb24sIG9uU3VibWl0IH0pLFxuICAgICAgICAgIFthY3Rpb24sIG9uU3VibWl0XVxuICAgICAgICApfVxuICAgICAgLz5cbiAgICApO1xuICB9XG4pO1xuXG5pbnRlcmZhY2UgU3VibWl0Rm9ybSB7XG4gIGV2ZW50OiBSZWFjdC5Gb3JtRXZlbnQ8SFRNTEZvcm1FbGVtZW50PjtcbiAgYWN0aW9uOiBzdHJpbmc7XG4gIG9uU3VibWl0PzogUHVsc2VGb3JtUHJvcHNbXCJvblN1Ym1pdFwiXTtcbiAgZm9ybURhdGE/OiBGb3JtRGF0YTtcbiAgZm9yY2U/OiBib29sZWFuXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdWJtaXRGb3JtKHtcbiAgZXZlbnQsXG4gIGFjdGlvbixcbiAgb25TdWJtaXQsXG4gIGZvcm1EYXRhLFxuICBmb3JjZVxufTogU3VibWl0Rm9ybSkge1xuICBvblN1Ym1pdD8uKGV2ZW50KTtcbiAgaWYgKCFmb3JjZSAmJiBldmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGZvcm0gPSBldmVudC5jdXJyZW50VGFyZ2V0O1xuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICBjb25zdCBuYXRpdmVFdmVudCA9IGV2ZW50Lm5hdGl2ZUV2ZW50IGFzIFN1Ym1pdEV2ZW50O1xuICBpZiAoIWZvcm1EYXRhKSB7XG4gICAgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoZm9ybSwgbmF0aXZlRXZlbnQuc3VibWl0dGVyKTtcbiAgfVxuICBjb25zdCB1cmwgPSBuZXcgVVJMKGFjdGlvbiwgd2luZG93LmxvY2F0aW9uLmhyZWYpO1xuICB0cnkge1xuICAgIGF3YWl0IGZldGNoKHVybCwge1xuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIC8vIFJlcXVpcmVkIGZvciBvdXIgaG9zdGluZyBzY2VuYXJpb3Mgb2Ygc2FtZSBob3N0ICsgZGlmZmVyZW50IHBvcnRzIG9yIDIgc3ViZG9tYWluc1xuICAgICAgY3JlZGVudGlhbHM6IFwiaW5jbHVkZVwiLFxuICAgICAgYm9keTogZm9ybURhdGEsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJbUHVsc2VdIEZvcm0gc3VibWlzc2lvbiBmYWlsZWRcIiwgZXJyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgfVxufVxuIiwKICAgICJpbXBvcnQgeyBpbywgU29ja2V0IH0gZnJvbSBcInNvY2tldC5pby1jbGllbnRcIjtcbmltcG9ydCB0eXBlIHsgU2VydmVyTWVzc2FnZSwgQ2xpZW50TWVzc2FnZSB9IGZyb20gXCIuL21lc3NhZ2VzXCI7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBUcmFuc3BvcnQgQWJzdHJhY3Rpb25cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCB0eXBlIE1lc3NhZ2VMaXN0ZW5lciA9IChtZXNzYWdlOiBTZXJ2ZXJNZXNzYWdlKSA9PiB2b2lkO1xuZXhwb3J0IHR5cGUgQ29ubmVjdGlvblN0YXR1c0xpc3RlbmVyID0gKGNvbm5lY3RlZDogYm9vbGVhbikgPT4gdm9pZDtcblxuZXhwb3J0IGludGVyZmFjZSBUcmFuc3BvcnQge1xuICBjb25uZWN0KGxpc3RlbmVyOiBNZXNzYWdlTGlzdGVuZXIpOiBQcm9taXNlPHZvaWQ+O1xuICBkaXNjb25uZWN0KCk6IHZvaWQ7XG4gIHNlbmRNZXNzYWdlKHBheWxvYWQ6IENsaWVudE1lc3NhZ2UpOiBQcm9taXNlPHZvaWQ+O1xuICBpc0Nvbm5lY3RlZCgpOiBib29sZWFuO1xuICBvbkNvbm5lY3Rpb25DaGFuZ2UobGlzdGVuZXI6IENvbm5lY3Rpb25TdGF0dXNMaXN0ZW5lcik6ICgpID0+IHZvaWQ7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBTb2NrZXQuSU8gVHJhbnNwb3J0XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgY2xhc3MgU29ja2V0SU9UcmFuc3BvcnQgaW1wbGVtZW50cyBUcmFuc3BvcnQge1xuICBwcml2YXRlIHNvY2tldDogU29ja2V0IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbGlzdGVuZXI6IE1lc3NhZ2VMaXN0ZW5lciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIG1lc3NhZ2VRdWV1ZTogQ2xpZW50TWVzc2FnZVtdID0gW107XG4gIHByaXZhdGUgY29ubmVjdGlvbkxpc3RlbmVyczogU2V0PENvbm5lY3Rpb25TdGF0dXNMaXN0ZW5lcj4gPSBuZXcgU2V0KCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSB1cmw6IHN0cmluZykge31cblxuICBjb25uZWN0KGxpc3RlbmVyOiBNZXNzYWdlTGlzdGVuZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXI7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuc29ja2V0ID0gaW8odGhpcy51cmwsIHtcbiAgICAgICAgdHJhbnNwb3J0czogW1wid2Vic29ja2V0XCJdLFxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuc29ja2V0Lm9uKFwiY29ubmVjdFwiLCAoKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiW1NvY2tldElPVHJhbnNwb3J0XSBDb25uZWN0ZWQ6XCIsIHRoaXMuc29ja2V0Py5pZCk7XG5cbiAgICAgICAgZm9yIChjb25zdCBwYXlsb2FkIG9mIHRoaXMubWVzc2FnZVF1ZXVlKSB7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXCJbU29ja2V0SU9UcmFuc3BvcnRdIFNlbmRpbmcgcXVldWVkIG1lc3NhZ2U6XCIsIHBheWxvYWQpO1xuICAgICAgICAgIHRoaXMuc29ja2V0Py5lbWl0KFwibWVzc2FnZVwiLCBwYXlsb2FkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1lc3NhZ2VRdWV1ZSA9IFtdO1xuXG4gICAgICAgIHRoaXMubm90aWZ5Q29ubmVjdGlvbkxpc3RlbmVycyh0cnVlKTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuc29ja2V0Lm9uKFwiY29ubmVjdF9lcnJvclwiLCAoZXJyKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJbU29ja2V0SU9UcmFuc3BvcnRdIENvbm5lY3Rpb24gZmFpbGVkOlwiLCBlcnIpO1xuICAgICAgICB0aGlzLm5vdGlmeUNvbm5lY3Rpb25MaXN0ZW5lcnMoZmFsc2UpO1xuICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnNvY2tldC5vbihcImRpc2Nvbm5lY3RcIiwgKCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhcIltTb2NrZXRJT1RyYW5zcG9ydF0gRGlzY29ubmVjdGVkXCIpO1xuICAgICAgICB0aGlzLm5vdGlmeUNvbm5lY3Rpb25MaXN0ZW5lcnMoZmFsc2UpO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuc29ja2V0Lm9uKFwibWVzc2FnZVwiLCAoZGF0YTogU2VydmVyTWVzc2FnZSkgPT4ge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIltTb2NrZXRJT1RyYW5zcG9ydF0gUmVjZWl2ZWQgbWVzc2FnZTpcIiwgZGF0YSk7XG4gICAgICAgIHRoaXMubGlzdGVuZXI/LihkYXRhKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgZGlzY29ubmVjdCgpOiB2b2lkIHtcbiAgICB0aGlzLnNvY2tldD8uZGlzY29ubmVjdCgpO1xuICAgIHRoaXMuc29ja2V0ID0gbnVsbDtcbiAgICB0aGlzLmxpc3RlbmVyID0gbnVsbDtcbiAgICB0aGlzLm1lc3NhZ2VRdWV1ZSA9IFtdO1xuICAgIHRoaXMuY29ubmVjdGlvbkxpc3RlbmVycy5jbGVhcigpO1xuICB9XG5cbiAgYXN5bmMgc2VuZE1lc3NhZ2UocGF5bG9hZDogQ2xpZW50TWVzc2FnZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmlzQ29ubmVjdGVkKCkpIHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKFwiW1NvY2tldElPVHJhbnNwb3J0XSBTZW5kaW5nOlwiLCBwYXlsb2FkKTtcbiAgICAgIHRoaXMuc29ja2V0IS5lbWl0KFwibWVzc2FnZVwiLCBwYXlsb2FkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gY29uc29sZS5sb2coXCJbU29ja2V0SU9UcmFuc3BvcnRdIFF1ZXVpbmcgbWVzc2FnZTpcIiwgcGF5bG9hZCk7XG4gICAgICB0aGlzLm1lc3NhZ2VRdWV1ZS5wdXNoKHBheWxvYWQpO1xuICAgIH1cbiAgfVxuXG4gIGlzQ29ubmVjdGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNvY2tldD8uY29ubmVjdGVkIHx8IGZhbHNlO1xuICB9XG5cbiAgb25Db25uZWN0aW9uQ2hhbmdlKGxpc3RlbmVyOiBDb25uZWN0aW9uU3RhdHVzTGlzdGVuZXIpOiAoKSA9PiB2b2lkIHtcbiAgICB0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTtcbiAgICBsaXN0ZW5lcih0aGlzLmlzQ29ubmVjdGVkKCkpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICB0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lcnMuZGVsZXRlKGxpc3RlbmVyKTtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBub3RpZnlDb25uZWN0aW9uTGlzdGVuZXJzKGNvbm5lY3RlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy5jb25uZWN0aW9uTGlzdGVuZXJzKSB7XG4gICAgICBsaXN0ZW5lcihjb25uZWN0ZWQpO1xuICAgIH1cbiAgfVxufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gSW4tTWVtb3J5IFRyYW5zcG9ydCAoZm9yIHRlc3RpbmcpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgY2xhc3MgSW5NZW1vcnlUcmFuc3BvcnQgaW1wbGVtZW50cyBUcmFuc3BvcnQge1xuICBwcml2YXRlIGxpc3RlbmVyOiBNZXNzYWdlTGlzdGVuZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjb25uZWN0ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBjb25uZWN0aW9uTGlzdGVuZXJzOiBTZXQ8Q29ubmVjdGlvblN0YXR1c0xpc3RlbmVyPiA9IG5ldyBTZXQoKTtcblxuICAvLyBTaW11bGF0ZSBzZXJ2ZXItc2lkZSBtZXNzYWdlIGRpc3BhdGNoaW5nXG4gIHB1YmxpYyBkaXNwYXRjaE1lc3NhZ2UobWVzc2FnZTogU2VydmVyTWVzc2FnZSkge1xuICAgIGlmICh0aGlzLmxpc3RlbmVyKSB7XG4gICAgICAvLyBTaW11bGF0ZSBhc3luYyBiZWhhdmlvclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmxpc3RlbmVyPy4obWVzc2FnZSksIDApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGNvbm5lY3QobGlzdGVuZXI6IE1lc3NhZ2VMaXN0ZW5lcik6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjtcbiAgICB0aGlzLmNvbm5lY3RlZCA9IHRydWU7XG4gICAgY29uc29sZS5sb2coXCJbSW5NZW1vcnlUcmFuc3BvcnRdIENvbm5lY3RlZC5cIik7XG4gIH1cblxuICBkaXNjb25uZWN0KCk6IHZvaWQge1xuICAgIHRoaXMubGlzdGVuZXIgPSBudWxsO1xuICAgIHRoaXMuY29ubmVjdGVkID0gZmFsc2U7XG4gICAgY29uc29sZS5sb2coXCJbSW5NZW1vcnlUcmFuc3BvcnRdIERpc2Nvbm5lY3RlZC5cIik7XG4gIH1cblxuICBhc3luYyBzZW5kTWVzc2FnZShwYXlsb2FkOiBDbGllbnRNZXNzYWdlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmNvbm5lY3RlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiW0luTWVtb3J5VHJhbnNwb3J0XSBOb3QgY29ubmVjdGVkLlwiKTtcbiAgICB9XG4gICAgY29uc29sZS5sb2coYFtJbk1lbW9yeVRyYW5zcG9ydF0gU2VudCBtZXNzYWdlOmAsIHBheWxvYWQpO1xuICAgIC8vIEluIGEgcmVhbCB0ZXN0IHNldHVwLCB0aGlzIG1pZ2h0IHRyaWdnZXIgYSBzaW11bGF0ZWQgc2VydmVyIHJlc3BvbnNlXG4gICAgLy8gdmlhIGBkaXNwYXRjaE1lc3NhZ2VgLlxuICB9XG5cbiAgaXNDb25uZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY29ubmVjdGVkO1xuICB9XG5cbiAgb25Db25uZWN0aW9uQ2hhbmdlKGxpc3RlbmVyOiBDb25uZWN0aW9uU3RhdHVzTGlzdGVuZXIpOiAoKSA9PiB2b2lkIHtcbiAgICB0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgdGhpcy5jb25uZWN0aW9uTGlzdGVuZXJzLmRlbGV0ZShsaXN0ZW5lcik7XG4gICAgfTtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IExvYWRlckZ1bmN0aW9uQXJncyB9IGZyb20gXCJyZWFjdC1yb3V0ZXJcIjtcblxuZXhwb3J0IGludGVyZmFjZSBSb3V0ZUluZm8ge1xuICBwYXRobmFtZTogc3RyaW5nO1xuICBoYXNoOiBzdHJpbmc7XG4gIHF1ZXJ5OiBzdHJpbmc7XG4gIHF1ZXJ5UGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBwYXRoUGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+O1xuICBjYXRjaGFsbDogc3RyaW5nW107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0U2VydmVyUm91dGVJbmZvKHtcbiAgcGFyYW1zLFxuICByZXF1ZXN0LFxufTogTG9hZGVyRnVuY3Rpb25BcmdzKSB7XG4gIGNvbnN0IHsgXCIqXCI6IGNhdGNoYWxsID0gXCJcIiwgLi4ucGF0aFBhcmFtcyB9ID0gcGFyYW1zO1xuICBjb25zdCBwYXJzZWRVcmwgPSBuZXcgVVJMKHJlcXVlc3QudXJsKTtcblxuICByZXR1cm4ge1xuICAgIGhhc2g6IHBhcnNlZFVybC5oYXNoLFxuICAgIHBhdGhuYW1lOiBwYXJzZWRVcmwucGF0aG5hbWUsXG4gICAgcXVlcnk6IHBhcnNlZFVybC5zZWFyY2gsXG4gICAgcXVlcnlQYXJhbXM6IE9iamVjdC5mcm9tRW50cmllcyhwYXJzZWRVcmwuc2VhcmNoUGFyYW1zLmVudHJpZXMoKSksXG4gICAgcGF0aFBhcmFtcyxcbiAgICBjYXRjaGFsbDogY2F0Y2hhbGwubGVuZ3RoID4gMSA/IGNhdGNoYWxsLnNwbGl0KFwiL1wiKSA6IFtdLFxuICB9IHNhdGlzZmllcyBSb3V0ZUluZm87XG59IiwKICAgICIvLyBTZXJpYWxpemF0aW9uIGhlbHBlcnMgdGhhdCBzdXBwb3J0OlxuLy8gLSBDaXJjdWxhciByZWZlcmVuY2VzIHZpYSBvYmplY3QgaWRlbnRpdHkgcmVmc1xuLy8gLSBEYXRlIGluc3RhbmNlcyDihpIgeyBfX3Q6IFwiZGF0ZXRpbWVcIiwgdGltZXN0YW1wIH1cbi8vIC0gRm9ybURhdGEg4oaSIHsgX190OiBcImZvcm1kYXRhXCIsIGZpZWxkcyB9XG4vLyAtIEZpbGUg4oaSIHsgX190OiBcImZpbGVcIiwgbmFtZSwgdHlwZSwgc2l6ZSwgbGFzdE1vZGlmaWVkLCBjb250ZW50OiBudW1iZXJbXSB9XG4vLyBBbG9uZyB3aXRoIGEgZGVjb2RlciBmb3IgdGhlIHN5bW1ldHJpYyBzaGFwZXMgKHdlIGRvIG5vdCByZWNvbnN0cnVjdCBGaWxlL0Zvcm1EYXRhIG9iamVjdHMpLlxuXG50eXBlIEVuY29kZWRSZWYgPSB7IF9fdDogXCJyZWZcIjsgaWQ6IG51bWJlciB9O1xudHlwZSBFbmNvZGVkQXJyYXkgPSB7IF9fdDogXCJhcnJheVwiOyBfX2lkOiBudW1iZXI7IGl0ZW1zOiB1bmtub3duW10gfTtcbnR5cGUgRW5jb2RlZE9iamVjdCA9IHtcbiAgX190OiBcIm9iamVjdFwiO1xuICBfX2lkOiBudW1iZXI7XG4gIHByb3BzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn07XG50eXBlIEVuY29kZWREYXRlID0geyBfX3Q6IFwiZGF0ZXRpbWVcIjsgdGltZXN0YW1wOiBudW1iZXIgfTtcbnR5cGUgRW5jb2RlZEZpbGUgPSB7XG4gIF9fdDogXCJmaWxlXCI7XG4gIG5hbWU6IHN0cmluZztcbiAgdHlwZTogc3RyaW5nO1xuICBzaXplOiBudW1iZXI7XG4gIGxhc3RNb2RpZmllZDogbnVtYmVyO1xuICBjb250ZW50OiBudW1iZXJbXTsgLy8gcmF3IGJ5dGVzIGFzIGEgSlNPTi1zYWZlIG51bWJlciBhcnJheVxufTtcbnR5cGUgRW5jb2RlZEZvcm1EYXRhID0ge1xuICBfX3Q6IFwiZm9ybWRhdGFcIjtcbiAgZmllbGRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duIHwgdW5rbm93bltdPjtcbn07XG5cbnR5cGUgSWRlbnRpdHlNYXAgPSBXZWFrTWFwPG9iamVjdCwgbnVtYmVyPjtcblxuZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIikgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSk7XG4gIHJldHVybiBwcm90byA9PT0gT2JqZWN0LnByb3RvdHlwZSB8fCBwcm90byA9PT0gbnVsbDtcbn1cblxuXG5mdW5jdGlvbiBpc0RhdGUodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBEYXRlIHtcbiAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgRGF0ZTtcbn1cblxuZnVuY3Rpb24gaXNTa2lwcGFibGUodmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIiB8fFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJzeW1ib2xcIiB8fFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJ1bmRlZmluZWRcIlxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmaWxlVG9CeXRlQXJyYXkoZmlsZTogRmlsZSk6IFByb21pc2U8bnVtYmVyW10+IHtcbiAgY29uc3QgYWIgPSBhd2FpdCBmaWxlLmFycmF5QnVmZmVyKCk7XG4gIHJldHVybiBBcnJheS5mcm9tKG5ldyBVaW50OEFycmF5KGFiKSk7XG59XG5cbmludGVyZmFjZSBFbmNvZGVDb250ZXh0IHtcbiAgc2VlbjogSWRlbnRpdHlNYXA7XG4gIG5leHRJZDogbnVtYmVyO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5jb2RlRm9yV2lyZShpbnB1dDogdW5rbm93bik6IFByb21pc2U8dW5rbm93bj4ge1xuICBjb25zdCBjdHg6IEVuY29kZUNvbnRleHQgPSB7IHNlZW46IG5ldyBXZWFrTWFwKCksIG5leHRJZDogMSB9O1xuICByZXR1cm4gYXdhaXQgZW5jb2RlUmVjdXJzaXZlKGlucHV0LCBjdHgpO1xufVxuXG5mdW5jdGlvbiByZW1lbWJlcihjdHg6IEVuY29kZUNvbnRleHQsIG9iajogb2JqZWN0KTogbnVtYmVyIHwgbnVsbCB7XG4gIGNvbnN0IGV4aXN0aW5nID0gY3R4LnNlZW4uZ2V0KG9iaik7XG4gIGlmIChleGlzdGluZyAhPT0gdW5kZWZpbmVkKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgaWQgPSBjdHgubmV4dElkKys7XG4gIGN0eC5zZWVuLnNldChvYmosIGlkKTtcbiAgcmV0dXJuIGlkO1xufVxuXG5hc3luYyBmdW5jdGlvbiBlbmNvZGVSZWN1cnNpdmUoXG4gIHZhbHVlOiB1bmtub3duLFxuICBjdHg6IEVuY29kZUNvbnRleHRcbik6IFByb21pc2U8dW5rbm93bj4ge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLy8gU3BlY2lhbCBjYXNlcyBmaXJzdFxuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgY29uc3QgZGF0ZSA9IHZhbHVlIGFzIERhdGU7XG4gICAgY29uc3QgZW5jb2RlZDogRW5jb2RlZERhdGUgPSB7IF9fdDogXCJkYXRldGltZVwiLCB0aW1lc3RhbXA6IGRhdGUuZ2V0VGltZSgpIH07XG4gICAgcmV0dXJuIGVuY29kZWQ7XG4gIH1cblxuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBGb3JtRGF0YSkge1xuICAgIGNvbnN0IGlkID0gcmVtZW1iZXIoY3R4LCB2YWx1ZSk7XG4gICAgaWYgKGlkID09PSBudWxsKSB7XG4gICAgICByZXR1cm4geyBfX3Q6IFwicmVmXCIsIGlkOiBjdHguc2Vlbi5nZXQodmFsdWUgYXMgb2JqZWN0KSEgfSBhcyBFbmNvZGVkUmVmO1xuICAgIH1cbiAgICBjb25zdCBmaWVsZHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24gfCB1bmtub3duW10+ID0ge307XG4gICAgZm9yIChjb25zdCBba2V5LCB2XSBvZiB2YWx1ZS5lbnRyaWVzKCkpIHtcbiAgICAgIGNvbnN0IGVuY29kZWRWYWwgPSBhd2FpdCBlbmNvZGVSZWN1cnNpdmUodiBhcyB1bmtub3duLCBjdHgpO1xuICAgICAgaWYgKGVuY29kZWRWYWwgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGZpZWxkcywga2V5KSkge1xuICAgICAgICBjb25zdCBleGlzdGluZyA9IGZpZWxkc1trZXldO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShleGlzdGluZykpIHtcbiAgICAgICAgICBleGlzdGluZy5wdXNoKGVuY29kZWRWYWwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZpZWxkc1trZXldID0gW2V4aXN0aW5nLCBlbmNvZGVkVmFsXTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmllbGRzW2tleV0gPSBlbmNvZGVkVmFsO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBlbmNvZGVkOiBFbmNvZGVkRm9ybURhdGEgJiB7IF9faWQ6IG51bWJlciB9ID0ge1xuICAgICAgX190OiBcImZvcm1kYXRhXCIsXG4gICAgICBmaWVsZHMsXG4gICAgICBfX2lkOiBpZCxcbiAgICB9IGFzIGFueTtcbiAgICByZXR1cm4gZW5jb2RlZDtcbiAgfVxuXG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEZpbGUpIHtcbiAgICBjb25zdCBmaWxlID0gdmFsdWU7XG4gICAgY29uc3QgYnl0ZXMgPSBhd2FpdCBmaWxlVG9CeXRlQXJyYXkodmFsdWUpO1xuICAgIGNvbnN0IGVuY29kZWQ6IEVuY29kZWRGaWxlID0ge1xuICAgICAgX190OiBcImZpbGVcIixcbiAgICAgIG5hbWU6IGZpbGUubmFtZSxcbiAgICAgIHR5cGU6IGZpbGUudHlwZSxcbiAgICAgIHNpemU6IGZpbGUuc2l6ZSxcbiAgICAgIGxhc3RNb2RpZmllZDogZmlsZS5sYXN0TW9kaWZpZWQsXG4gICAgICBjb250ZW50OiBieXRlcyxcbiAgICB9O1xuICAgIHJldHVybiBlbmNvZGVkO1xuICB9XG5cbiAgLy8gSWRlbnRpdHkgLyBjaXJjdWxhciByZWZlcmVuY2UgaGFuZGxpbmdcbiAgY29uc3Qgb2JqZWN0ID0gdmFsdWUgYXMgb2JqZWN0O1xuICBjb25zdCBleGlzdGluZ0lkID0gY3R4LnNlZW4uZ2V0KG9iamVjdCk7XG4gIGlmIChleGlzdGluZ0lkICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCByZWY6IEVuY29kZWRSZWYgPSB7IF9fdDogXCJyZWZcIiwgaWQ6IGV4aXN0aW5nSWQgfTtcbiAgICByZXR1cm4gcmVmO1xuICB9XG4gIGNvbnN0IHRoaXNJZCA9IGN0eC5uZXh0SWQrKztcbiAgY3R4LnNlZW4uc2V0KG9iamVjdCwgdGhpc0lkKTtcblxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBjb25zdCBpdGVtc1JhdyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgKHZhbHVlIGFzIHVua25vd25bXSkubWFwKChpdGVtKSA9PiBlbmNvZGVSZWN1cnNpdmUoaXRlbSwgY3R4KSlcbiAgICApO1xuICAgIGNvbnN0IGl0ZW1zID0gaXRlbXNSYXcuZmlsdGVyKChpdCkgPT4gaXQgIT09IHVuZGVmaW5lZCkgYXMgdW5rbm93bltdO1xuICAgIGNvbnN0IGVuY29kZWQ6IEVuY29kZWRBcnJheSA9IHsgX190OiBcImFycmF5XCIsIF9faWQ6IHRoaXNJZCwgaXRlbXMgfTtcbiAgICByZXR1cm4gZW5jb2RlZDtcbiAgfVxuXG4gIC8vIFBsYWluIG9iamVjdCBvciBvdGhlciBvYmplY3QgdHlwZXNcbiAgY29uc3QgcHJvcHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gIGlmIChpc1BsYWluT2JqZWN0KHZhbHVlKSkge1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHZhbHVlKSkge1xuICAgICAgY29uc3QgdiA9ICh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XTtcbiAgICAgIGlmIChpc1NraXBwYWJsZSh2KSkgY29udGludWU7XG4gICAgICBjb25zdCBlbmNvZGVkViA9IGF3YWl0IGVuY29kZVJlY3Vyc2l2ZSh2LCBjdHgpO1xuICAgICAgaWYgKGVuY29kZWRWICE9PSB1bmRlZmluZWQpIHByb3BzW2tleV0gPSBlbmNvZGVkVjtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gTm9uLXBsYWluIG9iamVjdHM6IGJlc3QgZWZmb3J0IOKAkyBlbnVtZXJhdGUgZW51bWVyYWJsZSBwcm9wZXJ0aWVzXG4gICAgZm9yIChjb25zdCBrZXkgaW4gdmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIHtcbiAgICAgIGNvbnN0IHYgPSAodmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV07XG4gICAgICBpZiAoaXNTa2lwcGFibGUodikpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgZW5jb2RlZFYgPSBhd2FpdCBlbmNvZGVSZWN1cnNpdmUodiwgY3R4KTtcbiAgICAgIGlmIChlbmNvZGVkViAhPT0gdW5kZWZpbmVkKSBwcm9wc1trZXldID0gZW5jb2RlZFY7XG4gICAgfVxuICB9XG4gIGNvbnN0IGVuY29kZWQ6IEVuY29kZWRPYmplY3QgPSB7IF9fdDogXCJvYmplY3RcIiwgX19pZDogdGhpc0lkLCBwcm9wcyB9O1xuICByZXR1cm4gZW5jb2RlZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZUZyb21XaXJlKGlucHV0OiB1bmtub3duKTogdW5rbm93biB7XG4gIHJldHVybiBkZWNvZGVSZWN1cnNpdmUoaW5wdXQpO1xufVxuXG5mdW5jdGlvbiBkZWNvZGVSZWN1cnNpdmUodmFsdWU6IHVua25vd24pOiB1bmtub3duIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIikgcmV0dXJuIHZhbHVlO1xuXG4gIGNvbnN0IG9iaiA9IHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBjb25zdCB0YWcgPSBvYmpbXCJfX3RcIl07XG5cbiAgaWYgKHRhZyA9PT0gXCJkYXRldGltZVwiKSB7XG4gICAgY29uc3QgdHMgPSBvYmpbXCJ0aW1lc3RhbXBcIl0gYXMgbnVtYmVyO1xuICAgIHJldHVybiBuZXcgRGF0ZSh0cyk7XG4gIH1cblxuICBpZiAodGFnID09PSBcImZpbGVcIikge1xuICAgIC8vIERvIG5vdCByZWNvbnN0cnVjdCBGaWxlOyBrZWVwIGFzIHBsYWluIG9iamVjdC4gT3B0aW9uYWxseSwgdHVybiBjb250ZW50IGludG8gVWludDhBcnJheSBmb3IgY29udmVuaWVuY2UuXG4gICAgY29uc3QgY29udGVudCA9IG9ialtcImNvbnRlbnRcIl07XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY29udGVudCkpIHtcbiAgICAgIC8vIFJldHVybiBhIHNoYWxsb3cgY2xvbmUgd2l0aCBVaW50OEFycmF5IGZvciBjb250ZW50XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5vYmosXG4gICAgICAgIGNvbnRlbnQ6IG5ldyBVaW50OEFycmF5KGNvbnRlbnQgYXMgbnVtYmVyW10pLFxuICAgICAgfSBhcyBhbnk7XG4gICAgfVxuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICBpZiAodGFnID09PSBcImZvcm1kYXRhXCIpIHtcbiAgICAvLyBLZWVwIGFzLWlzIChwbGFpbiBvYmplY3QpLCBidXQgZGVjb2RlIG5lc3RlZCB2YWx1ZXNcbiAgICBjb25zdCBmaWVsZHMgPSBvYmpbXCJmaWVsZHNcIl0gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93biB8IHVua25vd25bXT47XG4gICAgY29uc3QgZGVjb2RlZEZpZWxkczogUmVjb3JkPHN0cmluZywgdW5rbm93biB8IHVua25vd25bXT4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhmaWVsZHMpKSB7XG4gICAgICBjb25zdCB2ID0gZmllbGRzW2tleV07XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2KSkge1xuICAgICAgICBkZWNvZGVkRmllbGRzW2tleV0gPSB2Lm1hcCgoeCkgPT4gZGVjb2RlUmVjdXJzaXZlKHgpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlY29kZWRGaWVsZHNba2V5XSA9IGRlY29kZVJlY3Vyc2l2ZSh2KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgX190OiBcImZvcm1kYXRhXCIsIGZpZWxkczogZGVjb2RlZEZpZWxkcyB9IGFzIEVuY29kZWRGb3JtRGF0YTtcbiAgfVxuXG4gIGlmICh0YWcgPT09IFwiYXJyYXlcIikge1xuICAgIGNvbnN0IGl0ZW1zID0gKG9ialtcIml0ZW1zXCJdIGFzIHVua25vd25bXSkubWFwKCh4KSA9PiBkZWNvZGVSZWN1cnNpdmUoeCkpO1xuICAgIHJldHVybiBpdGVtcztcbiAgfVxuXG4gIGlmICh0YWcgPT09IFwib2JqZWN0XCIpIHtcbiAgICBjb25zdCBwcm9wcyA9IG9ialtcInByb3BzXCJdIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGNvbnN0IG91dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhwcm9wcykpIHtcbiAgICAgIG91dFtrZXldID0gZGVjb2RlUmVjdXJzaXZlKHByb3BzW2tleV0pO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgaWYgKHRhZyA9PT0gXCJyZWZcIikge1xuICAgIC8vIFdpdGhvdXQgYSByZWNvbnN0cnVjdGlvbiBjb250ZXh0IG9uIHRoZSBjbGllbnQsIGxlYXZlIGFzLWlzLlxuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICAvLyBVbmtub3duIG9iamVjdCDigJMgZGVzY2VuZCBzaGFsbG93bHlcbiAgY29uc3QgY29weTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMob2JqKSkge1xuICAgIGNvcHlba2V5XSA9IGRlY29kZVJlY3Vyc2l2ZShvYmpba2V5XSk7XG4gIH1cbiAgcmV0dXJuIGNvcHk7XG59XG5cbi8vIExlZ2FjeSBjbGVhbmVyIGtlcHQgZm9yIGNvbXBhdGliaWxpdHkgd2hlcmUgYSBxdWljayBiZXN0LWVmZm9ydCBKU09OLXNhZmUgc2hhcGUgaXMgbmVlZGVkXG5leHBvcnQgZnVuY3Rpb24gY2xlYW5Gb3JTZXJpYWxpemF0aW9uKG9iajogdW5rbm93bik6IHVua25vd24ge1xuICByZXR1cm4gY2xlYW5SZWN1cnNpdmUob2JqLCBuZXcgV2Vha1NldCgpKTtcbn1cblxuZnVuY3Rpb24gY2xlYW5SZWN1cnNpdmUob2JqOiB1bmtub3duLCBzZWVuOiBXZWFrU2V0PG9iamVjdD4pOiB1bmtub3duIHtcbiAgaWYgKG9iaiA9PT0gbnVsbCB8fCB0eXBlb2Ygb2JqICE9PSBcIm9iamVjdFwiKSByZXR1cm4gb2JqO1xuICBpZiAoc2Vlbi5oYXMob2JqIGFzIG9iamVjdCkpIHJldHVybiB1bmRlZmluZWQ7XG4gIHNlZW4uYWRkKG9iaiBhcyBvYmplY3QpO1xuICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgcmV0dXJuIChvYmogYXMgdW5rbm93bltdKVxuICAgICAgLm1hcCgoaXRlbSkgPT4gY2xlYW5SZWN1cnNpdmUoaXRlbSwgc2VlbikpXG4gICAgICAuZmlsdGVyKCh4KSA9PiB4ICE9PSB1bmRlZmluZWQpO1xuICB9XG4gIGNvbnN0IG91dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgZm9yIChjb25zdCBrZXkgaW4gb2JqIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSB7XG4gICAgY29uc3QgdiA9IChvYmogYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV07XG4gICAgaWYgKGlzU2tpcHBhYmxlKHYpKSBjb250aW51ZTtcbiAgICBjb25zdCBjbGVhbmVkID0gY2xlYW5SZWN1cnNpdmUodiwgc2Vlbik7XG4gICAgaWYgKGNsZWFuZWQgIT09IHVuZGVmaW5lZCkgb3V0W2tleV0gPSBjbGVhbmVkO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG4iCiAgXSwKICAibWFwcGluZ3MiOiAiQUFBQSxvQkFDRSxjQUNBLGFBQ0EsbUJBQ0EsaUJBQ0EsZUNMRiwyQkFDRSxtQkFDQSxxQkFDQSxXQUNBLGVBQ0EsZUNGSyxJQUFNLEdBQWUsYUFDZixHQUFxQixLQTJHM0IsU0FBUyxFQUFhLENBQUMsRUFBcUMsQ0FFakUsT0FBTyxPQUFPLElBQVMsVUFBWSxJQUFTLEtBR3ZDLFNBQVMsRUFBZ0IsQ0FBQyxF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