pulse-ui-client 0.1.27 → 0.1.28
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.bun.js +3 -3
- package/dist/index.js +2 -2
- package/dist/index.js.map +4 -4
- package/dist/index.node.js +3 -3
- package/dist/vdom.d.ts +0 -16
- package/package.json +1 -1
package/dist/index.bun.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{useEffect as c,useState as $W,useMemo as QW,createContext as BW,useContext as KW}from"react";import LW,{cloneElement as _,createElement as DW,isValidElement as MW,lazy as yW,Suspense as bW}from"react";var zW="$$fragment",GW="$$";function UW(W){return typeof W==="object"&&W!==null}function VW(W){return typeof W==="object"&&W!==null&&W.tag.startsWith("$$")&&W.tag!=="$$fragment"}import{jsx as l,Fragment as TW}from"react/jsx-runtime";class v{client;path;components;cssModules;callbacks;callbackCache;renderPropKeys;cssProps;callbackList;constructor(W,Z,$,Q,q=[],J=[],V=[]){this.client=W;this.path=Z;this.components=$;this.cssModules=Q;this.callbacks=new Set(q),this.callbackCache=new Map,this.renderPropKeys=new Set(J),this.cssProps=new Set(V),this.callbackList=[...this.callbacks].sort()}hasCallbackPath(W){return this.callbacks.has(W)}hasRenderPropPath(W){return this.renderPropKeys.has(W)}hasAnyCallbackUnder(W){if(W==="")return this.callbackList.length>0;let Z=kW(this.callbackList,W);return Z<this.callbackList.length&&this.callbackList[Z].startsWith(W)}setCallbacks(W){this.callbacks=new Set(W);for(let Z of Array.from(this.callbackCache.keys()))if(!this.callbacks.has(Z))this.callbackCache.delete(Z);this.callbackList=[...this.callbacks].sort()}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),this.callbackCache.delete(Z);if(W.add)for(let Z of W.add)this.callbacks.add(Z);this.callbackList=[...this.callbacks].sort()}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.remove)for(let Z of W.remove)this.cssProps.delete(Z);if(W.add)for(let Z of W.add)this.cssProps.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(UW(W)){let{tag:$,props:Q={},children:q=[]}=W,J={};for(let[F,G]of Object.entries(Q))J[F]=this.transformValue(Z,F,G);if(W.key)J.key=W.key;let V=[];for(let F=0;F<q.length;F+=1){let G=q[F],U=Z?`${Z}.${F}`:String(F);V.push(this.renderNode(G,U))}if(VW(W)){let F=W.tag.slice(GW.length),G=this.components[F];if(!G)throw Error(`Could not find component ${F}. This is a Pulse internal error.`);return DW(G,J,...V)}return DW($===zW?LW.Fragment:$,J,...V)}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 J=q[Q];if(typeof J!=="string")throw Error(`Received CSS reference for missing class '${Q}' in module '${$}'`);return J}}function s(W){let Z=W.props?.children;if(Z==null)return[];return Array.isArray(Z)?Z.slice():[Z]}function a(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 J=q.path.split(".").filter((F)=>F.length>0),V=(F,G,U)=>{if(G<J.length){o(F,J,G);let C=F,f=J[G],D=+f,X=U?`${U}.${f}`:f;if(!Number.isNaN(D)){let A=s(C),O=A[D];return A[D]=V(O,G+1,X),_(C,void 0,...A)}else{let A=C.props??{},O=A[f],R={...A,[f]:V(O,G+1,X)};return _(C,R)}}switch(q.type){case"replace":return $.renderNode(q.data,q.path);case"update_props":{o(F,J,G);let C=F,D={...C.props??{}},X=q.data;if(X.remove&&X.remove.length>0){for(let A of X.remove)if(A in D)delete D[A]}if(X.set)for(let[A,O]of Object.entries(X.set))D[A]=$.transformValue(U,A,O);return _(C,D)}case"reconciliation":{o(F,J,G);let C=F,f=s(C),D=[],[X,A]=q.new,[O,R]=q.reuse,N=-1,K=-1,M=-1,y=-1;if(X.length>0)N=X[0],M=0;if(O.length>0)K=O[0],y=0;for(let H=0;H<q.N;++H)if(H===N){let d=A[M],T=U?`${U}.${H}`:String(H);D.push($.renderNode(d,T)),N=M<X.length-1?X[++M]:-1}else if(H===K){let d=R[y],T=f[d],XW=U?`${U}.${H}`:String(H);if($.hasAnyCallbackUnder(XW))T=r(T,XW,$);D.push(T),K=y<O.length-1?O[++y]:-1}else D.push(f[H]);return _(C,null,...D)}default:throw Error(`[Pulse renderer] Unknown update type: ${q.type}`)}};Q=V(Q,0,"")}return Q}function SW(W,Z){let $=yW(W);return({children:Q,...q})=>{return l(bW,{fallback:Z??l(TW,{}),children:l($,{...q,children:Q})})}}function o(W,Z,$){return!0}function r(W,Z,$){if(!MW(W))return W;let Q=W,q=Q.props??{},J={...q};for(let F of Object.keys(q)){let G=Z?`${Z}.${F}`:F;if($.hasCallbackPath(G))J[F]=$.getCallback(Z,F);if($.hasRenderPropPath(G)&&$.hasAnyCallbackUnder(G))J[F]=r(q[F],G,$)}let V=s(Q).map((F,G)=>{let U=Z?`${Z}.${G}`:String(G);if($.hasAnyCallbackUnder(U))return r(F,U,$);else return F});return _(Q,J,...V)}function kW(W,Z){let $=0,Q=W.length;while($<Q){let q=$+Q>>>1;if(W[q]<Z)$=q+1;else Q=q}return $}function Y(){function W(Z,$){return(Q)=>{let q={};for(let J of Z)q[J]=Q[J];if($)for(let J in $){let V=$[J];q[J]=V(Q)}return q}}return W}var _W=(W)=>W.tagName.toLowerCase(),gW=["id","className","tagName","localName","clientHeight","clientLeft","clientTop","clientWidth","scrollHeight","scrollLeft","scrollTop","scrollWidth","slot"],xW=["autofocus","tabIndex","nonce"],mW=["accessKey","accessKeyLabel","autocapitalize","dir","draggable","hidden","inert","lang","offsetHeight","offsetLeft","offsetTop","offsetWidth","popover","spellcheck","title","translate","writingSuggestions","contentEditable","enterKeyHint","isContentEditable","inputMode"],vW=Y()(gW,{tagName:_W}),hW=Y()(xW),pW=Y()(mW);function w(W){return{...vW(W),...hW(W),...pW(W)}}function z(W,Z){let $=Y()(W,Z);return(Q)=>({...w(Q),...$(Q)})}var EW=["hash","host","hostname","href","origin","password","pathname","port","protocol","search","target","download","rel","hreflang","type","username","ping","referrerPolicy","text"],uW=z(EW),iW=["alt","coords","download","hash","host","hostname","href","origin","password","pathname","port","protocol","rel","search","shape","target","username","ping","referrerPolicy"],cW=z(iW),nW=["autoplay","controls","crossOrigin","currentSrc","currentTime","defaultMuted","defaultPlaybackRate","duration","ended","loop","muted","networkState","paused","playbackRate","preload","readyState","seeking","src","volume","preservesPitch"],NW=z(nW),dW=(W)=>NW(W),oW=["disabled","name","type","value","formAction","formEnctype","formMethod","formNoValidate","formTarget","popoverTargetAction"],lW=z(oW),sW=["value"],rW=z(sW),aW=["height","src","type","width","align","name"],tW=z(aW),eW=["disabled","name","type","validationMessage","willValidate"],W1=z(eW),Z1=["acceptCharset","action","autocomplete","encoding","enctype","length","method","name","noValidate","target","rel"],$1=z(Z1),Q1=["allow","allowFullscreen","height","name","referrerPolicy","src","srcdoc","width","align","frameBorder","longDesc","marginHeight","marginWidth","scrolling","sandbox"],q1=z(Q1),F1=["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"],J1=z(F1),X1=["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"],z1=z(X1),G1=["htmlFor"],U1=z(G1),V1=["value","type"],D1=z(V1),A1=["as","crossOrigin","disabled","fetchPriority","href","hreflang","imageSizes","imageSrcset","integrity","media","referrerPolicy","rel","type","charset","rev","target","sizes"],O1=z(A1),f1=["name"],C1=z(f1),N1=["high","low","max","min","optimum","value"],R1=z(N1),P1=["cite","dateTime"],AW=z(P1),j1=["reversed","start","type","compact"],B1=z(j1),K1=["data","height","name","type","useMap","width","validationMessage","willValidate","align","archive","border","code","codeBase","codeType","declare","hspace","standby","vspace"],I1=z(K1),H1=["disabled","label"],Y1=z(H1),w1=["defaultSelected","disabled","index","label","selected","text","value"],L1=z(w1),M1=["defaultValue","name","type","value","htmlFor","validationMessage","willValidate"],y1=z(M1),b1=["max","position","value"],S1=z(b1),k1=["cite"],OW=z(k1),T1=(W)=>w(W),_1=["async","crossOrigin","defer","fetchPriority","integrity","noModule","referrerPolicy","src","text","type","charset"],g1=Y()(_1,{event:(W)=>W.event,htmlFor:(W)=>W.htmlFor}),x1=(W)=>({...w(W),...g1(W)}),m1=["autocomplete","disabled","length","multiple","name","required","selectedIndex","size","type","value","validationMessage","willValidate"],v1=z(m1),h1=["name"],p1=z(h1),E1=["height","media","sizes","src","srcset","type","width"],u1=z(E1),i1=["align"],c1=z(i1),n1=["abbr","cellIndex","colSpan","headers","rowSpan","scope","align","axis","bgColor","ch","chOff","height","noWrap","vAlign","width"],fW=z(n1),d1=["span","align","ch","chOff","vAlign","width"],CW=z(d1),o1=["align","bgColor","border","cellPadding","cellSpacing","frame","rules","summary","width"],l1=z(o1),s1=["rowIndex","sectionRowIndex","align","bgColor","ch","chOff","vAlign"],r1=z(s1),a1=["align","ch","chOff","vAlign"],t=z(a1),t1=(W)=>w(W),e1=["autocomplete","cols","defaultValue","dirName","disabled","maxLength","minLength","name","placeholder","readOnly","required","rows","selectionDirection","selectionEnd","selectionStart","value","wrap","textLength","validationMessage","willValidate"],WZ=z(e1),ZZ=["dateTime"],$Z=z(ZZ),QZ=["default","kind","label","readyState","src","srclang"],qZ=z(QZ),FZ=["height","poster","videoHeight","videoWidth","width","playsInline"],JZ=Y()(FZ),XZ=(W)=>({...NW(W),...JZ(W)}),zZ=["clear"],GZ=z(zZ),UZ=["href","target"],VZ=z(UZ),DZ=["aLink","background","bgColor","link","text","vLink"],AZ=z(DZ),OZ=["compact"],fZ=z(OZ),CZ=["open"],NZ=z(CZ),RZ=["open","returnValue"],PZ=z(RZ),jZ=["align"],BZ=z(jZ),KZ=(W)=>w(W),IZ=["align"],b=z(IZ),HZ=["align","color","noShade","size","width"],YZ=z(HZ),wZ=["version"],LZ=z(wZ),MZ=(W)=>w(W),yZ=["content","httpEquiv","name","scheme"],bZ=z(yZ),SZ=["align"],kZ=z(SZ),TZ=(W)=>w(W),_Z=["width"],gZ=z(_Z),xZ=(W)=>w(W),mZ=["media","type","disabled"],vZ=z(mZ),hZ=["text"],pZ=z(hZ),EZ=["compact","type"],uZ=z(EZ),iZ={A:uW,AREA:cW,AUDIO:dW,BASE:VZ,BLOCKQUOTE:OW,Q:OW,BODY:AZ,BR:GZ,BUTTON:lW,CANVAS:w,CAPTION:c1,CITE:T1,COL:CW,COLGROUP:CW,DATA:rW,DETAILS:NZ,DIALOG:PZ,DIV:BZ,DL:fZ,EMBED:tW,FIELDSET:W1,FORM:$1,H1:b,H2:b,H3:b,H4:b,H5:b,H6:b,HEAD:KZ,HR:YZ,HTML:LZ,IFRAME:q1,IMG:J1,INPUT:z1,LABEL:U1,LI:D1,LINK:O1,MAP:C1,MENU:MZ,META:bZ,METER:R1,INS:AW,DEL:AW,OBJECT:I1,OL:B1,OPTGROUP:Y1,OPTION:L1,OUTPUT:y1,P:kZ,PICTURE:TZ,PRE:gZ,PROGRESS:S1,SCRIPT:x1,SELECT:v1,SLOT:p1,SOURCE:u1,SPAN:xZ,STYLE:vZ,TABLE:l1,TBODY:t,THEAD:t,TFOOT:t,TD:fW,TH:fW,TEMPLATE:t1,TEXTAREA:WZ,TIME:$Z,TITLE:pZ,TR:r1,TRACK:qZ,UL:uZ,VIDEO:XZ};function h(W){let Z=W.tagName.toUpperCase(),$=iZ[Z];if($)return $(W);throw Error(`Unexpected HTML element tag: ${W.tagName} (update .web/custom/serialize.ts)`)}var cZ=(W)=>h(W.target),g=(W)=>W.relatedTarget?h(W.relatedTarget):null;function P(W,Z){return Y()(W,{target:cZ,...Z||{}})}var I=["target","bubbles","cancelable","defaultPrevented","eventPhase","isTrusted","timeStamp","type"],p=[...I,"detail"],E=[...p,"altKey","button","buttons","clientX","clientY","ctrlKey","metaKey","movementX","movementY","pageX","pageY","screenX","screenY","shiftKey"],nZ=[...E,"pointerId","pressure","tangentialPressure","tiltX","tiltY","twist","width","height","pointerType","isPrimary"],dZ=P(I),oZ=P(p),lZ=P(E,{relatedTarget:g}),sZ=P(I,{clipboardData:(W)=>RW(W.clipboardData)}),rZ=P([...I,"data"]),aZ=P(E,{relatedTarget:g,dataTransfer:(W)=>RW(W.dataTransfer)}),tZ=P(nZ,{relatedTarget:g}),eZ=P(I,{relatedTarget:g}),W0=P(I),Z0=P(I),$0=P(I),Q0=P([...p,"altKey","ctrlKey","code","key","locale","location","metaKey","repeat","shiftKey"]),q0=P([...p,"altKey","ctrlKey","metaKey","shiftKey","changedTouches","targetTouches","touches"],{changedTouches:(W)=>e(W.changedTouches),targetTouches:(W)=>e(W.targetTouches),touches:(W)=>e(W.touches)}),F0=P([...E,"deltaMode","deltaX","deltaY","deltaZ"],{relatedTarget:g}),J0=P([...I,"animationName","elapsedTime","pseudoElement"]),X0=P([...I,"oldState","newState"]),z0=P([...I,"elapsedTime","propertyName","pseudoElement"]);function e(W){return Array.from(W).map((Z)=>({target:h(Z.target),identifier:Z.identifier,screenX:Z.screenX,screenY:Z.screenY,clientX:Z.clientX,clientY:Z.clientY,pageX:Z.pageX,pageY:Z.pageY}))}function RW(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 j={};function B(W,Z,$){for(let Q of Z)W[Q]=$}B(j,["pointerdown","pointermove","pointerup","pointercancel","gotpointercapture","lostpointercapture","pointerenter","pointerleave","pointerover","pointerout"],tZ);B(j,["click","contextmenu","dblclick","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup"],lZ);B(j,["drag","dragend","dragenter","dragexit","dragleave","dragover","dragstart","drop"],aZ);B(j,["keydown","keypress","keyup"],Q0);B(j,["focus","blur"],eZ);B(j,["change","input"],$0);B(j,["invalid"],Z0);B(j,["reset","submit"],W0);B(j,["copy","cut","paste"],sZ);B(j,["compositionend","compositionstart","compositionupdate"],rZ);B(j,["touchcancel","touchend","touchmove","touchstart"],q0);B(j,["scroll"],oZ);B(j,["wheel"],F0);B(j,["animationstart","animationend","animationiteration"],J0);B(j,["transitionend"],z0);B(j,["toggle"],X0);function WW(W){if(W&&typeof W==="object"&&"nativeEvent"in W&&typeof W.isDefaultPrevented==="function"){let Z=W;if(typeof Z.type!=="string")return W;let $=j[Z.type.toLowerCase()];if($)return $(Z);return dZ(Z)}return W}function x(W){let Z=new Map,$=[],Q=[],q=[],J=[],V=0;function F(U){if(U==null||typeof U==="number"||typeof U==="string"||typeof U==="boolean")return U;let C=V++,f=Z.get(U);if(f!==void 0)return $.push(C),f;if(Z.set(U,C),U instanceof Date)return Q.push(C),U.getTime();if(Array.isArray(U)){let D=U.length,X=Array(D);for(let A=0;A<D;A++)X[A]=F(U[A]);return X}if(U instanceof Map){J.push(C);let D={};for(let[X,A]of U.entries())D[String(X)]=F(A);return D}if(U instanceof Set){q.push(C);let D=U.size,X=Array(D),A=0;for(let O of U)X[A]=F(O),A+=1;return X}if(typeof U==="object"){let D={},X=Object.keys(U);for(let A=0;A<X.length;A++){let O=X[A];D[O]=F(U[O])}return D}throw Error(`Unsupported value in serialization: ${U}`)}let G=F(W);return[[$,Q,q,J],G]}function ZW(W,Z){let[[$,Q,q,J],V]=W,F=new Set($),G=new Set(Q),U=new Set(q),C=new Set(J),f=[];function D(X){let A=f.length;if(F.has(A))return f.push(null),f[X];if(G.has(A)){let O=new Date(X);return f.push(O),O}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(U.has(A)){let N=new Set;f.push(N);for(let K=0;K<X.length;K++)N.add(D(X[K]));return N}let O=X.length,R=Array(O);f.push(R);for(let N=0;N<O;N++)R[N]=D(X[N]);return R}if(typeof X==="object"){if(C.has(A)){let N=new Map;f.push(N);let K=Object.keys(X);for(let M=0;M<K.length;M++){let y=K[M];N.set(y,D(X[y]))}return N}let O={};f.push(O);let R=Object.keys(X);for(let N=0;N<R.length;N++){let K=R[N];O[K]=D(X[K])}return O}throw Error(`Unsupported value in deserialization: ${X}`)}return D(V)}import{io as A0}from"socket.io-client";class L extends Error{constructor(W){super(W);this.name="PulseChannelResetError"}}function G0(){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 U0(W){if(W instanceof Error)return W.message;if(typeof W==="string")return W;try{return JSON.stringify(W)}catch{return String(W)}}function V0(W){return typeof W.responseTo==="string"}function D0(W){return typeof W.event==="string"}class PW{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 $=G0();return new Promise((Q,q)=>{this.pending.set($,{resolve:Q,reject:q}),this.client.sendChannelMessage({type:"channel_message",channel:this.id,event:W,payload:Z,requestId:$}).catch((J)=>{this.pending.delete($),q(J)})})}on(W,Z){this.ensureOpen();let $=this.handlers.get(W);if(!$)$=new Set,this.handlers.set(W,$);return $.add(Z),this.flushBacklog(W),()=>{let Q=this.handlers.get(W);if(!Q)return;if(Q.delete(Z),Q.size===0)this.handlers.delete(W)}}handleServerMessage(W){if(V0(W))return this.resolvePending(W),this.closed;if(this.closed)return!0;if(!D0(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 J=q(W.payload);if($=await Promise.resolve(J),$!==void 0)break}catch(J){Q=J;break}if(Q){await this.client.sendChannelMessage({type:"channel_message",channel:this.id,event:void 0,responseTo:W.requestId,error:U0(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 jW(W,Z){return new PW(W,Z)}class u{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 $=A0(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",x({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",x(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(ZW(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",x(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 J=`${q.pathname}${q.search}${q.hash}`;this.frameworkNavigate(J,{replace:Z})}else if(Z)window.location.replace($);else window.location.assign($)}catch{if(Z)window.location.replace($);else window.location.assign($)}else if(Z)window.location.replace($);else window.location.assign($);else this.frameworkNavigate($,{replace:Z});break}case"channel_message":{this.routeChannelMessage(W);break}default:console.error("Unexpected message:",W)}}async performApiCall(W){try{let Z=await fetch(W.url,{method:W.method||"GET",headers:{...W.headers||{},...W.body!=null&&!("content-type"in(W.headers||{}))?{"content-type":"application/json"}:{}},body:W.body!=null?typeof W.body==="string"?W.body:JSON.stringify(W.body):void 0,credentials:W.credentials||"include"}),$={};Z.headers.forEach((V,F)=>$[F]=V);let Q=null;if((Z.headers.get("content-type")||"").includes("application/json"))Q=await Z.json().catch(()=>null);else Q=await Z.text().catch(()=>null);let J={type:"api_result",id:W.id,ok:Z.ok,status:Z.status,headers:$,body:Q};await this.sendMessage(J)}catch(Z){let $={type:"api_result",id:W.id,ok:!1,status:0,headers:{},body:{error:String(Z)}};await this.sendMessage($)}}async invokeCallback(W,Z,$){await this.sendMessage({type:"callback",path:W,callback:Z,args:$.map(WW)})}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:jW(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 O0,useParams as f0,useNavigate as C0}from"react-router";import{jsx as S,jsxs as i}from"react/jsx-runtime";var IW=BW(null),HW=BW(null),n=()=>{let W=KW(IW);if(!W)throw Error("usePulseClient must be used within a PulseProvider");return W},N0=(W)=>{let Z=KW(HW);if(!Z)throw Error("usePulsePrerender must be used within a PulseProvider");let $=Z.views[W];if(!$)throw Error(`No prerender found for '${W}'`);return $},qW=typeof window<"u";function R0({children:W,config:Z,prerender:$}){let[Q,q]=$W(!0),J=C0(),{renderId:V}=$,F=QW(()=>new u(Z.serverAddress,V,J),[Z.serverAddress,J,V]);return c(()=>F.onConnectionChange(q),[F]),c(()=>{if(qW)return F.connect(),()=>F.disconnect()},[F]),S(IW.Provider,{value:F,children:i(HW.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 P0({externalComponents:W,path:Z,cssModules:$}){let Q=n(),q=N0(Z),J=q.vdom,V=QW(()=>new v(Q,Z,W,$,q.callbacks,q.render_props,q.css_refs),[Q,Z,W,$,q]),[F,G]=$W(()=>V.renderNode(J)),[U,C]=$W(null),f=O0(),D=f0(),X=QW(()=>{let{"*":A="",...O}=D,R=new URLSearchParams(f.search);return{hash:f.hash,pathname:f.pathname,query:f.search,queryParams:Object.fromEntries(R.entries()),pathParams:O,catchall:A.length>0?A.split("/"):[]}},[f.hash,f.pathname,f.search,JSON.stringify(D)]);if(c(()=>{if(qW){Q.mountView(Z,{routeInfo:X,onInit:(O,R,N,K)=>{V.setCallbacks(R),V.setRenderProps(N),V.setCssRefs(K),G(V.renderNode(O))},onUpdate:(O)=>{G((R)=>R==null?R:a(R,O,V))}});let A=Q.onServerError((O,R)=>{if(O===Z)C(R)});return()=>{A(),Q.unmount(Z)}}},[Q]),c(()=>{if(qW)Q.navigate(Z,X)},[Q,Z,X]),U)return S(j0,{error:U});return F}function j0({error:W}){return i("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:[i("div",{style:{fontWeight:700,marginBottom:8},children:["Server Error during ",W.phase]}),W.message&&S("div",{children:W.message}),W.stack&&i("details",{open:!0,style:{marginTop:8},children:[S("summary",{children:"Stack trace"}),S("pre",{style:{margin:0},children:W.stack})]})]})}import{useEffect as B0,useMemo as K0}from"react";function I0(W){let Z=n(),$=K0(()=>{if(!W)throw Error("usePulseChannel requires a non-empty channelId");return Z.acquireChannel(W)},[Z,W]);return B0(()=>{return()=>{Z.releaseChannel(W)}},[Z,W]),$}import{forwardRef as H0,useCallback as Y0}from"react";import{jsx as L0}from"react/jsx-runtime";var w0=H0(function({onSubmit:Z,action:$,...Q},q){return L0("form",{...Q,action:$,ref:q,onSubmit:Y0((J)=>YW({event:J,action:$,onSubmit:Z}),[$,Z])})});async function YW({event:W,action:Z,onSubmit:$,formData:Q,force:q}){if($?.(W),!q&&W.defaultPrevented)return;let J=W.currentTarget;W.preventDefault();let V=W.nativeEvent;if(!Q)Q=new FormData(J,V.submitter);let F=new URL(Z,window.location.href);try{await fetch(F,{method:"POST",credentials:"include",body:Q})}catch(G){throw G}}import{io as M0}from"socket.io-client";class wW{url;socket=null;listener=null;messageQueue=[];connectionListeners=new Set;constructor(W){this.url=W}connect(W){return this.listener=W,new Promise((Z,$)=>{this.socket=M0(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 y0({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 b0(W){if(W===null||typeof W!=="object")return!1;let Z=Object.getPrototypeOf(W);return Z===Object.prototype||Z===null}function FW(W){return typeof W==="function"||typeof W==="symbol"||typeof W>"u"}async function S0(W){let Z=await W.arrayBuffer();return Array.from(new Uint8Array(Z))}async function k0(W){return await m(W,{seen:new WeakMap,nextId:1})}function T0(W,Z){if(W.seen.get(Z)!==void 0)return null;let Q=W.nextId++;return W.seen.set(Z,Q),Q}async function m(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=T0(Z,W);if(F===null)return{__t:"ref",id:Z.seen.get(W)};let G={};for(let[C,f]of W.entries()){let D=await m(f,Z);if(D===void 0)continue;if(Object.prototype.hasOwnProperty.call(G,C)){let X=G[C];if(Array.isArray(X))X.push(D);else G[C]=[X,D]}else G[C]=D}return{__t:"formdata",fields:G,__id:F}}if(W instanceof File){let F=W,G=await S0(W);return{__t:"file",name:F.name,type:F.type,size:F.size,lastModified:F.lastModified,content:G}}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 G=(await Promise.all(W.map((C)=>m(C,Z)))).filter((C)=>C!==void 0);return{__t:"array",__id:q,items:G}}let J={};if(b0(W))for(let F of Object.keys(W)){let G=W[F];if(FW(G))continue;let U=await m(G,Z);if(U!==void 0)J[F]=U}else for(let F in W){let G=W[F];if(FW(G))continue;let U=await m(G,Z);if(U!==void 0)J[F]=U}return{__t:"object",__id:q,props:J}}function _0(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,J={};for(let V of Object.keys(q)){let F=q[V];if(Array.isArray(F))J[V]=F.map((G)=>k(G));else J[V]=k(F)}return{__t:"formdata",fields:J}}if($==="array")return Z.items.map((J)=>k(J));if($==="object"){let q=Z.props,J={};for(let V of Object.keys(q))J[V]=k(q[V]);return J}if($==="ref")return Z;let Q={};for(let q of Object.keys(Z))Q[q]=k(Z[q]);return Q}function g0(W){return JW(W,new WeakSet)}function JW(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)=>JW(Q,Z)).filter((Q)=>Q!==void 0);let $={};for(let Q in W){let q=W[Q];if(FW(q))continue;let J=JW(q,Z);if(J!==void 0)$[Q]=J}return $}export{n as usePulseClient,I0 as usePulseChannel,YW as submitForm,x as serialize,y0 as extractServerRouteInfo,WW as extractEvent,k0 as encodeForWire,ZW as deserialize,_0 as decodeFromWire,g0 as cleanForSerialization,a as applyReactTreeUpdates,v as VDOMRenderer,wW as SocketIOTransport,SW as RenderLazy,P0 as PulseView,u as PulseSocketIOClient,R0 as PulseProvider,w0 as PulseForm,L as PulseChannelResetError};
|
|
2
|
+
import{useEffect as d,useState as QW,useMemo as qW,createContext as BW,useContext as KW}from"react";import LW,{cloneElement as _,createElement as r,isValidElement as MW,lazy as yW,Suspense as bW}from"react";var GW="$$fragment",UW="$$";function VW(W){return typeof W==="object"&&W!==null}function DW(W){return typeof W==="object"&&W!==null&&W.tag.startsWith("$$")&&W.tag!=="$$fragment"}import{jsx as s,Fragment as TW}from"react/jsx-runtime";class h{client;path;components;cssModules;callbacks;callbackCache;renderPropKeys;cssProps;callbackList;constructor(W,Z,$,Q,q=[],J=[],D=[]){this.client=W;this.path=Z;this.components=$;this.cssModules=Q;this.callbacks=new Set(q),this.callbackCache=new Map,this.renderPropKeys=new Set(J),this.cssProps=new Set(D),this.callbackList=[...this.callbacks].sort()}hasCallbackPath(W){return this.callbacks.has(W)}hasRenderPropPath(W){return this.renderPropKeys.has(W)}hasAnyCallbackUnder(W){if(W==="")return this.callbackList.length>0;let Z=kW(this.callbackList,W);return Z<this.callbackList.length&&this.callbackList[Z].startsWith(W)}setCallbacks(W){this.callbacks=new Set(W);for(let Z of Array.from(this.callbackCache.keys()))if(!this.callbacks.has(Z))this.callbackCache.delete(Z);this.callbackList=[...this.callbacks].sort()}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),this.callbackCache.delete(Z);if(W.add)for(let Z of W.add)this.callbacks.add(Z);this.callbackList=[...this.callbacks].sort()}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.remove)for(let Z of W.remove)this.cssProps.delete(Z);if(W.add)for(let Z of W.add)this.cssProps.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(VW(W)){let{tag:$,props:Q={},children:q=[]}=W,J={};for(let[F,G]of Object.entries(Q))J[F]=this.transformValue(Z,F,G);if(W.key)J.key=W.key;let D=[];for(let F=0;F<q.length;F+=1){let G=q[F],U=Z?`${Z}.${F}`:String(F);D.push(this.renderNode(G,U))}if(DW(W)){let F=W.tag.slice(UW.length),G=this.components[F];if(!G)throw Error(`Could not find component ${F}. This is a Pulse internal error.`);return r(G,J,...D)}return r($===GW?LW.Fragment:$,J,...D)}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 J=q[Q];if(typeof J!=="string")throw Error(`Received CSS reference for missing class '${Q}' in module '${$}'`);return J}}function v(W){let Z=W.props?.children;if(Z==null)return[];return Array.isArray(Z)?Z.slice():[Z]}function t(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 J=q.path.split(".").filter((F)=>F.length>0),D=(F,G,U)=>{if(G<J.length){l(F,J,G);let O=F,N=J[G],V=+N,X=U?`${U}.${N}`:N;if(!Number.isNaN(V)){let f=v(O),A=f[V];return f[V]=D(A,G+1,X),_(O,void 0,...f)}else{let f=O.props??{},A=f[N],C={...f,[N]:D(A,G+1,X)};return _(O,C)}}switch(q.type){case"replace":return $.renderNode(q.data,q.path);case"update_props":{l(F,J,G);let O=F,V={...O.props??{}},X=q.data;if(X.remove&&X.remove.length>0){for(let A of X.remove)if(A in V)delete V[A]}if(X.set)for(let[A,C]of Object.entries(X.set))V[A]=$.transformValue(U,A,C);if((X.remove?.length??0)>0)return V.key=O.key,V.ref=O.ref,r(O.type,V,...v(O));else return _(O,V)}case"reconciliation":{l(F,J,G);let O=F,N=v(O),V=[],[X,f]=q.new,[A,C]=q.reuse,R=-1,K=-1,M=-1,y=-1;if(X.length>0)R=X[0],M=0;if(A.length>0)K=A[0],y=0;for(let H=0;H<q.N;++H)if(H===R){let o=f[M],T=U?`${U}.${H}`:String(H);V.push($.renderNode(o,T)),R=M<X.length-1?X[++M]:-1}else if(H===K){let o=C[y],T=N[o],zW=U?`${U}.${H}`:String(H);if($.hasAnyCallbackUnder(zW))T=a(T,zW,$);V.push(T),K=y<A.length-1?A[++y]:-1}else V.push(N[H]);return _(O,null,...V)}default:throw Error(`[Pulse renderer] Unknown update type: ${q.type}`)}};Q=D(Q,0,"")}return Q}function SW(W,Z){let $=yW(W);return({children:Q,...q})=>{return s(bW,{fallback:Z??s(TW,{}),children:s($,{...q,children:Q})})}}function l(W,Z,$){return!0}function a(W,Z,$){if(!MW(W))return W;let Q=W,q=Q.props??{},J={...q};for(let F of Object.keys(q)){let G=Z?`${Z}.${F}`:F;if($.hasCallbackPath(G))J[F]=$.getCallback(Z,F);if($.hasRenderPropPath(G)&&$.hasAnyCallbackUnder(G))J[F]=a(q[F],G,$)}let D=v(Q).map((F,G)=>{let U=Z?`${Z}.${G}`:String(G);if($.hasAnyCallbackUnder(U))return a(F,U,$);else return F});return _(Q,J,...D)}function kW(W,Z){let $=0,Q=W.length;while($<Q){let q=$+Q>>>1;if(W[q]<Z)$=q+1;else Q=q}return $}function Y(){function W(Z,$){return(Q)=>{let q={};for(let J of Z)q[J]=Q[J];if($)for(let J in $){let D=$[J];q[J]=D(Q)}return q}}return W}var _W=(W)=>W.tagName.toLowerCase(),gW=["id","className","tagName","localName","clientHeight","clientLeft","clientTop","clientWidth","scrollHeight","scrollLeft","scrollTop","scrollWidth","slot"],xW=["autofocus","tabIndex","nonce"],mW=["accessKey","accessKeyLabel","autocapitalize","dir","draggable","hidden","inert","lang","offsetHeight","offsetLeft","offsetTop","offsetWidth","popover","spellcheck","title","translate","writingSuggestions","contentEditable","enterKeyHint","isContentEditable","inputMode"],vW=Y()(gW,{tagName:_W}),hW=Y()(xW),pW=Y()(mW);function w(W){return{...vW(W),...hW(W),...pW(W)}}function z(W,Z){let $=Y()(W,Z);return(Q)=>({...w(Q),...$(Q)})}var EW=["hash","host","hostname","href","origin","password","pathname","port","protocol","search","target","download","rel","hreflang","type","username","ping","referrerPolicy","text"],uW=z(EW),iW=["alt","coords","download","hash","host","hostname","href","origin","password","pathname","port","protocol","rel","search","shape","target","username","ping","referrerPolicy"],cW=z(iW),dW=["autoplay","controls","crossOrigin","currentSrc","currentTime","defaultMuted","defaultPlaybackRate","duration","ended","loop","muted","networkState","paused","playbackRate","preload","readyState","seeking","src","volume","preservesPitch"],CW=z(dW),nW=(W)=>CW(W),oW=["disabled","name","type","value","formAction","formEnctype","formMethod","formNoValidate","formTarget","popoverTargetAction"],lW=z(oW),sW=["value"],rW=z(sW),aW=["height","src","type","width","align","name"],tW=z(aW),eW=["disabled","name","type","validationMessage","willValidate"],W1=z(eW),Z1=["acceptCharset","action","autocomplete","encoding","enctype","length","method","name","noValidate","target","rel"],$1=z(Z1),Q1=["allow","allowFullscreen","height","name","referrerPolicy","src","srcdoc","width","align","frameBorder","longDesc","marginHeight","marginWidth","scrolling","sandbox"],q1=z(Q1),F1=["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"],J1=z(F1),X1=["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"],z1=z(X1),G1=["htmlFor"],U1=z(G1),V1=["value","type"],D1=z(V1),A1=["as","crossOrigin","disabled","fetchPriority","href","hreflang","imageSizes","imageSrcset","integrity","media","referrerPolicy","rel","type","charset","rev","target","sizes"],O1=z(A1),f1=["name"],N1=z(f1),C1=["high","low","max","min","optimum","value"],R1=z(C1),P1=["cite","dateTime"],AW=z(P1),j1=["reversed","start","type","compact"],B1=z(j1),K1=["data","height","name","type","useMap","width","validationMessage","willValidate","align","archive","border","code","codeBase","codeType","declare","hspace","standby","vspace"],I1=z(K1),H1=["disabled","label"],Y1=z(H1),w1=["defaultSelected","disabled","index","label","selected","text","value"],L1=z(w1),M1=["defaultValue","name","type","value","htmlFor","validationMessage","willValidate"],y1=z(M1),b1=["max","position","value"],S1=z(b1),k1=["cite"],OW=z(k1),T1=(W)=>w(W),_1=["async","crossOrigin","defer","fetchPriority","integrity","noModule","referrerPolicy","src","text","type","charset"],g1=Y()(_1,{event:(W)=>W.event,htmlFor:(W)=>W.htmlFor}),x1=(W)=>({...w(W),...g1(W)}),m1=["autocomplete","disabled","length","multiple","name","required","selectedIndex","size","type","value","validationMessage","willValidate"],v1=z(m1),h1=["name"],p1=z(h1),E1=["height","media","sizes","src","srcset","type","width"],u1=z(E1),i1=["align"],c1=z(i1),d1=["abbr","cellIndex","colSpan","headers","rowSpan","scope","align","axis","bgColor","ch","chOff","height","noWrap","vAlign","width"],fW=z(d1),n1=["span","align","ch","chOff","vAlign","width"],NW=z(n1),o1=["align","bgColor","border","cellPadding","cellSpacing","frame","rules","summary","width"],l1=z(o1),s1=["rowIndex","sectionRowIndex","align","bgColor","ch","chOff","vAlign"],r1=z(s1),a1=["align","ch","chOff","vAlign"],e=z(a1),t1=(W)=>w(W),e1=["autocomplete","cols","defaultValue","dirName","disabled","maxLength","minLength","name","placeholder","readOnly","required","rows","selectionDirection","selectionEnd","selectionStart","value","wrap","textLength","validationMessage","willValidate"],WZ=z(e1),ZZ=["dateTime"],$Z=z(ZZ),QZ=["default","kind","label","readyState","src","srclang"],qZ=z(QZ),FZ=["height","poster","videoHeight","videoWidth","width","playsInline"],JZ=Y()(FZ),XZ=(W)=>({...CW(W),...JZ(W)}),zZ=["clear"],GZ=z(zZ),UZ=["href","target"],VZ=z(UZ),DZ=["aLink","background","bgColor","link","text","vLink"],AZ=z(DZ),OZ=["compact"],fZ=z(OZ),NZ=["open"],CZ=z(NZ),RZ=["open","returnValue"],PZ=z(RZ),jZ=["align"],BZ=z(jZ),KZ=(W)=>w(W),IZ=["align"],b=z(IZ),HZ=["align","color","noShade","size","width"],YZ=z(HZ),wZ=["version"],LZ=z(wZ),MZ=(W)=>w(W),yZ=["content","httpEquiv","name","scheme"],bZ=z(yZ),SZ=["align"],kZ=z(SZ),TZ=(W)=>w(W),_Z=["width"],gZ=z(_Z),xZ=(W)=>w(W),mZ=["media","type","disabled"],vZ=z(mZ),hZ=["text"],pZ=z(hZ),EZ=["compact","type"],uZ=z(EZ),iZ={A:uW,AREA:cW,AUDIO:nW,BASE:VZ,BLOCKQUOTE:OW,Q:OW,BODY:AZ,BR:GZ,BUTTON:lW,CANVAS:w,CAPTION:c1,CITE:T1,COL:NW,COLGROUP:NW,DATA:rW,DETAILS:CZ,DIALOG:PZ,DIV:BZ,DL:fZ,EMBED:tW,FIELDSET:W1,FORM:$1,H1:b,H2:b,H3:b,H4:b,H5:b,H6:b,HEAD:KZ,HR:YZ,HTML:LZ,IFRAME:q1,IMG:J1,INPUT:z1,LABEL:U1,LI:D1,LINK:O1,MAP:N1,MENU:MZ,META:bZ,METER:R1,INS:AW,DEL:AW,OBJECT:I1,OL:B1,OPTGROUP:Y1,OPTION:L1,OUTPUT:y1,P:kZ,PICTURE:TZ,PRE:gZ,PROGRESS:S1,SCRIPT:x1,SELECT:v1,SLOT:p1,SOURCE:u1,SPAN:xZ,STYLE:vZ,TABLE:l1,TBODY:e,THEAD:e,TFOOT:e,TD:fW,TH:fW,TEMPLATE:t1,TEXTAREA:WZ,TIME:$Z,TITLE:pZ,TR:r1,TRACK:qZ,UL:uZ,VIDEO:XZ};function p(W){let Z=W.tagName.toUpperCase(),$=iZ[Z];if($)return $(W);throw Error(`Unexpected HTML element tag: ${W.tagName} (update .web/custom/serialize.ts)`)}var cZ=(W)=>p(W.target),g=(W)=>W.relatedTarget?p(W.relatedTarget):null;function P(W,Z){return Y()(W,{target:cZ,...Z||{}})}var I=["target","bubbles","cancelable","defaultPrevented","eventPhase","isTrusted","timeStamp","type"],E=[...I,"detail"],u=[...E,"altKey","button","buttons","clientX","clientY","ctrlKey","metaKey","movementX","movementY","pageX","pageY","screenX","screenY","shiftKey"],dZ=[...u,"pointerId","pressure","tangentialPressure","tiltX","tiltY","twist","width","height","pointerType","isPrimary"],nZ=P(I),oZ=P(E),lZ=P(u,{relatedTarget:g}),sZ=P(I,{clipboardData:(W)=>RW(W.clipboardData)}),rZ=P([...I,"data"]),aZ=P(u,{relatedTarget:g,dataTransfer:(W)=>RW(W.dataTransfer)}),tZ=P(dZ,{relatedTarget:g}),eZ=P(I,{relatedTarget:g}),W0=P(I),Z0=P(I),$0=P(I),Q0=P([...E,"altKey","ctrlKey","code","key","locale","location","metaKey","repeat","shiftKey"]),q0=P([...E,"altKey","ctrlKey","metaKey","shiftKey","changedTouches","targetTouches","touches"],{changedTouches:(W)=>WW(W.changedTouches),targetTouches:(W)=>WW(W.targetTouches),touches:(W)=>WW(W.touches)}),F0=P([...u,"deltaMode","deltaX","deltaY","deltaZ"],{relatedTarget:g}),J0=P([...I,"animationName","elapsedTime","pseudoElement"]),X0=P([...I,"oldState","newState"]),z0=P([...I,"elapsedTime","propertyName","pseudoElement"]);function WW(W){return Array.from(W).map((Z)=>({target:p(Z.target),identifier:Z.identifier,screenX:Z.screenX,screenY:Z.screenY,clientX:Z.clientX,clientY:Z.clientY,pageX:Z.pageX,pageY:Z.pageY}))}function RW(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 j={};function B(W,Z,$){for(let Q of Z)W[Q]=$}B(j,["pointerdown","pointermove","pointerup","pointercancel","gotpointercapture","lostpointercapture","pointerenter","pointerleave","pointerover","pointerout"],tZ);B(j,["click","contextmenu","dblclick","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup"],lZ);B(j,["drag","dragend","dragenter","dragexit","dragleave","dragover","dragstart","drop"],aZ);B(j,["keydown","keypress","keyup"],Q0);B(j,["focus","blur"],eZ);B(j,["change","input"],$0);B(j,["invalid"],Z0);B(j,["reset","submit"],W0);B(j,["copy","cut","paste"],sZ);B(j,["compositionend","compositionstart","compositionupdate"],rZ);B(j,["touchcancel","touchend","touchmove","touchstart"],q0);B(j,["scroll"],oZ);B(j,["wheel"],F0);B(j,["animationstart","animationend","animationiteration"],J0);B(j,["transitionend"],z0);B(j,["toggle"],X0);function ZW(W){if(W&&typeof W==="object"&&"nativeEvent"in W&&typeof W.isDefaultPrevented==="function"){let Z=W;if(typeof Z.type!=="string")return W;let $=j[Z.type.toLowerCase()];if($)return $(Z);return nZ(Z)}return W}function x(W){let Z=new Map,$=[],Q=[],q=[],J=[],D=0;function F(U){if(U==null||typeof U==="number"||typeof U==="string"||typeof U==="boolean")return U;let O=D++,N=Z.get(U);if(N!==void 0)return $.push(O),N;if(Z.set(U,O),U instanceof Date)return Q.push(O),U.getTime();if(Array.isArray(U)){let V=U.length,X=Array(V);for(let f=0;f<V;f++)X[f]=F(U[f]);return X}if(U instanceof Map){J.push(O);let V={};for(let[X,f]of U.entries())V[String(X)]=F(f);return V}if(U instanceof Set){q.push(O);let V=U.size,X=Array(V),f=0;for(let A of U)X[f]=F(A),f+=1;return X}if(typeof U==="object"){let V={},X=Object.keys(U);for(let f=0;f<X.length;f++){let A=X[f];V[A]=F(U[A])}return V}throw Error(`Unsupported value in serialization: ${U}`)}let G=F(W);return[[$,Q,q,J],G]}function $W(W,Z){let[[$,Q,q,J],D]=W,F=new Set($),G=new Set(Q),U=new Set(q),O=new Set(J),N=[];function V(X){let f=N.length;if(F.has(f))return N.push(null),N[X];if(G.has(f)){let A=new Date(X);return N.push(A),A}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(U.has(f)){let R=new Set;N.push(R);for(let K=0;K<X.length;K++)R.add(V(X[K]));return R}let A=X.length,C=Array(A);N.push(C);for(let R=0;R<A;R++)C[R]=V(X[R]);return C}if(typeof X==="object"){if(O.has(f)){let R=new Map;N.push(R);let K=Object.keys(X);for(let M=0;M<K.length;M++){let y=K[M];R.set(y,V(X[y]))}return R}let A={};N.push(A);let C=Object.keys(X);for(let R=0;R<C.length;R++){let K=C[R];A[K]=V(X[K])}return A}throw Error(`Unsupported value in deserialization: ${X}`)}return V(D)}import{io as A0}from"socket.io-client";class L extends Error{constructor(W){super(W);this.name="PulseChannelResetError"}}function G0(){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 U0(W){if(W instanceof Error)return W.message;if(typeof W==="string")return W;try{return JSON.stringify(W)}catch{return String(W)}}function V0(W){return typeof W.responseTo==="string"}function D0(W){return typeof W.event==="string"}class PW{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 $=G0();return new Promise((Q,q)=>{this.pending.set($,{resolve:Q,reject:q}),this.client.sendChannelMessage({type:"channel_message",channel:this.id,event:W,payload:Z,requestId:$}).catch((J)=>{this.pending.delete($),q(J)})})}on(W,Z){this.ensureOpen();let $=this.handlers.get(W);if(!$)$=new Set,this.handlers.set(W,$);return $.add(Z),this.flushBacklog(W),()=>{let Q=this.handlers.get(W);if(!Q)return;if(Q.delete(Z),Q.size===0)this.handlers.delete(W)}}handleServerMessage(W){if(V0(W))return this.resolvePending(W),this.closed;if(this.closed)return!0;if(!D0(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 J=q(W.payload);if($=await Promise.resolve(J),$!==void 0)break}catch(J){Q=J;break}if(Q){await this.client.sendChannelMessage({type:"channel_message",channel:this.id,event:void 0,responseTo:W.requestId,error:U0(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 jW(W,Z){return new PW(W,Z)}class i{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 $=A0(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",x({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",x(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($W(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",x(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 J=`${q.pathname}${q.search}${q.hash}`;this.frameworkNavigate(J,{replace:Z})}else if(Z)window.location.replace($);else window.location.assign($)}catch{if(Z)window.location.replace($);else window.location.assign($)}else if(Z)window.location.replace($);else window.location.assign($);else this.frameworkNavigate($,{replace:Z});break}case"channel_message":{this.routeChannelMessage(W);break}default:console.error("Unexpected message:",W)}}async performApiCall(W){try{let Z=await fetch(W.url,{method:W.method||"GET",headers:{...W.headers||{},...W.body!=null&&!("content-type"in(W.headers||{}))?{"content-type":"application/json"}:{}},body:W.body!=null?typeof W.body==="string"?W.body:JSON.stringify(W.body):void 0,credentials:W.credentials||"include"}),$={};Z.headers.forEach((D,F)=>$[F]=D);let Q=null;if((Z.headers.get("content-type")||"").includes("application/json"))Q=await Z.json().catch(()=>null);else Q=await Z.text().catch(()=>null);let J={type:"api_result",id:W.id,ok:Z.ok,status:Z.status,headers:$,body:Q};await this.sendMessage(J)}catch(Z){let $={type:"api_result",id:W.id,ok:!1,status:0,headers:{},body:{error:String(Z)}};await this.sendMessage($)}}async invokeCallback(W,Z,$){await this.sendMessage({type:"callback",path:W,callback:Z,args:$.map(ZW)})}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:jW(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 O0,useParams as f0,useNavigate as N0}from"react-router";import{jsx as S,jsxs as c}from"react/jsx-runtime";var IW=BW(null),HW=BW(null),n=()=>{let W=KW(IW);if(!W)throw Error("usePulseClient must be used within a PulseProvider");return W},C0=(W)=>{let Z=KW(HW);if(!Z)throw Error("usePulsePrerender must be used within a PulseProvider");let $=Z.views[W];if(!$)throw Error(`No prerender found for '${W}'`);return $},FW=typeof window<"u";function R0({children:W,config:Z,prerender:$}){let[Q,q]=QW(!0),J=N0(),{renderId:D}=$,F=qW(()=>new i(Z.serverAddress,D,J),[Z.serverAddress,J,D]);return d(()=>F.onConnectionChange(q),[F]),d(()=>{if(FW)return F.connect(),()=>F.disconnect()},[F]),S(IW.Provider,{value:F,children:c(HW.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 P0({externalComponents:W,path:Z,cssModules:$}){let Q=n(),q=C0(Z),J=q.vdom,D=qW(()=>new h(Q,Z,W,$,q.callbacks,q.render_props,q.css_refs),[Q,Z,W,$,q]),[F,G]=QW(()=>D.renderNode(J)),[U,O]=QW(null),N=O0(),V=f0(),X=qW(()=>{let{"*":f="",...A}=V,C=new URLSearchParams(N.search);return{hash:N.hash,pathname:N.pathname,query:N.search,queryParams:Object.fromEntries(C.entries()),pathParams:A,catchall:f.length>0?f.split("/"):[]}},[N.hash,N.pathname,N.search,JSON.stringify(V)]);if(d(()=>{if(FW){Q.mountView(Z,{routeInfo:X,onInit:(A,C,R,K)=>{D.setCallbacks(C),D.setRenderProps(R),D.setCssRefs(K),G(D.renderNode(A))},onUpdate:(A)=>{G((C)=>C==null?C:t(C,A,D))}});let f=Q.onServerError((A,C)=>{if(A===Z)O(C)});return()=>{f(),Q.unmount(Z)}}},[Q]),d(()=>{if(FW)Q.navigate(Z,X)},[Q,Z,X]),U)return S(j0,{error:U});return F}function j0({error:W}){return c("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:[c("div",{style:{fontWeight:700,marginBottom:8},children:["Server Error during ",W.phase]}),W.message&&S("div",{children:W.message}),W.stack&&c("details",{open:!0,style:{marginTop:8},children:[S("summary",{children:"Stack trace"}),S("pre",{style:{margin:0},children:W.stack})]})]})}import{useEffect as B0,useMemo as K0}from"react";function I0(W){let Z=n(),$=K0(()=>{if(!W)throw Error("usePulseChannel requires a non-empty channelId");return Z.acquireChannel(W)},[Z,W]);return B0(()=>{return()=>{Z.releaseChannel(W)}},[Z,W]),$}import{forwardRef as H0,useCallback as Y0}from"react";import{jsx as L0}from"react/jsx-runtime";var w0=H0(function({onSubmit:Z,action:$,...Q},q){return L0("form",{...Q,action:$,ref:q,onSubmit:Y0((J)=>YW({event:J,action:$,onSubmit:Z}),[$,Z])})});async function YW({event:W,action:Z,onSubmit:$,formData:Q,force:q}){if($?.(W),!q&&W.defaultPrevented)return;let J=W.currentTarget;W.preventDefault();let D=W.nativeEvent;if(!Q)Q=new FormData(J,D.submitter);let F=new URL(Z,window.location.href);try{await fetch(F,{method:"POST",credentials:"include",body:Q})}catch(G){throw G}}import{io as M0}from"socket.io-client";class wW{url;socket=null;listener=null;messageQueue=[];connectionListeners=new Set;constructor(W){this.url=W}connect(W){return this.listener=W,new Promise((Z,$)=>{this.socket=M0(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 y0({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 b0(W){if(W===null||typeof W!=="object")return!1;let Z=Object.getPrototypeOf(W);return Z===Object.prototype||Z===null}function JW(W){return typeof W==="function"||typeof W==="symbol"||typeof W>"u"}async function S0(W){let Z=await W.arrayBuffer();return Array.from(new Uint8Array(Z))}async function k0(W){return await m(W,{seen:new WeakMap,nextId:1})}function T0(W,Z){if(W.seen.get(Z)!==void 0)return null;let Q=W.nextId++;return W.seen.set(Z,Q),Q}async function m(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=T0(Z,W);if(F===null)return{__t:"ref",id:Z.seen.get(W)};let G={};for(let[O,N]of W.entries()){let V=await m(N,Z);if(V===void 0)continue;if(Object.prototype.hasOwnProperty.call(G,O)){let X=G[O];if(Array.isArray(X))X.push(V);else G[O]=[X,V]}else G[O]=V}return{__t:"formdata",fields:G,__id:F}}if(W instanceof File){let F=W,G=await S0(W);return{__t:"file",name:F.name,type:F.type,size:F.size,lastModified:F.lastModified,content:G}}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 G=(await Promise.all(W.map((O)=>m(O,Z)))).filter((O)=>O!==void 0);return{__t:"array",__id:q,items:G}}let J={};if(b0(W))for(let F of Object.keys(W)){let G=W[F];if(JW(G))continue;let U=await m(G,Z);if(U!==void 0)J[F]=U}else for(let F in W){let G=W[F];if(JW(G))continue;let U=await m(G,Z);if(U!==void 0)J[F]=U}return{__t:"object",__id:q,props:J}}function _0(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,J={};for(let D of Object.keys(q)){let F=q[D];if(Array.isArray(F))J[D]=F.map((G)=>k(G));else J[D]=k(F)}return{__t:"formdata",fields:J}}if($==="array")return Z.items.map((J)=>k(J));if($==="object"){let q=Z.props,J={};for(let D of Object.keys(q))J[D]=k(q[D]);return J}if($==="ref")return Z;let Q={};for(let q of Object.keys(Z))Q[q]=k(Z[q]);return Q}function g0(W){return XW(W,new WeakSet)}function XW(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)=>XW(Q,Z)).filter((Q)=>Q!==void 0);let $={};for(let Q in W){let q=W[Q];if(JW(q))continue;let J=XW(q,Z);if(J!==void 0)$[Q]=J}return $}export{n as usePulseClient,I0 as usePulseChannel,YW as submitForm,x as serialize,y0 as extractServerRouteInfo,ZW as extractEvent,k0 as encodeForWire,$W as deserialize,_0 as decodeFromWire,g0 as cleanForSerialization,t as applyReactTreeUpdates,h as VDOMRenderer,wW as SocketIOTransport,SW as RenderLazy,P0 as PulseView,i as PulseSocketIOClient,R0 as PulseProvider,w0 as PulseForm,L as PulseChannelResetError};
|
|
3
3
|
|
|
4
|
-
//# debugId=
|
|
5
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3B1bHNlLnRzeCIsICIuLi9zcmMvcmVuZGVyZXIudHN4IiwgIi4uL3NyYy92ZG9tLnRzIiwgIi4uL3NyYy9zZXJpYWxpemUvZXh0cmFjdG9yLnRzIiwgIi4uL3NyYy9zZXJpYWxpemUvZWxlbWVudHMudHMiLCAiLi4vc3JjL3NlcmlhbGl6ZS9ldmVudHMudHMiLCAiLi4vc3JjL3NlcmlhbGl6ZS9zZXJpYWxpemVyLnRzIiwgIi4uL3NyYy9jbGllbnQudHN4IiwgIi4uL3NyYy9jaGFubmVsLnRzIiwgIi4uL3NyYy91c2VQdWxzZUNoYW5uZWwudHMiLCAiLi4vc3JjL2Zvcm0udHN4IiwgIi4uL3NyYy90cmFuc3BvcnQudHMiLCAiLi4vc3JjL2hlbHBlcnMudHMiLCAiLi4vc3JjL3NlcmlhbGl6ZS9jbGVhbi50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICJpbXBvcnQgUmVhY3QsIHtcbiAgdXNlRWZmZWN0LFxuICB1c2VTdGF0ZSxcbiAgdXNlTWVtbyxcbiAgY3JlYXRlQ29udGV4dCxcbiAgdXNlQ29udGV4dCxcbiAgdHlwZSBDb21wb25lbnRUeXBlLFxufSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IFZET01SZW5kZXJlciwgYXBwbHlVcGRhdGVzIH0gZnJvbSBcIi4vcmVuZGVyZXJcIjtcbmltcG9ydCB7IFB1bHNlU29ja2V0SU9DbGllbnQgfSBmcm9tIFwiLi9jbGllbnRcIjtcbmltcG9ydCB0eXBlIHsgVkRPTSwgQ29tcG9uZW50UmVnaXN0cnksIFJlZ2lzdHJ5RW50cnkgfSBmcm9tIFwiLi92ZG9tXCI7XG5pbXBvcnQgeyB1c2VMb2NhdGlvbiwgdXNlUGFyYW1zLCB1c2VOYXZpZ2F0ZSB9IGZyb20gXCJyZWFjdC1yb3V0ZXJcIjtcbmltcG9ydCB0eXBlIHsgU2VydmVyRXJyb3JJbmZvfSBmcm9tIFwiLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHR5cGUgeyBSb3V0ZUluZm8gfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBUeXBlc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGludGVyZmFjZSBQdWxzZUNvbmZpZyB7XG4gIHNlcnZlckFkZHJlc3M6IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgUHVsc2VQcmVyZW5kZXJWaWV3ID0ge1xuICB2ZG9tOiBWRE9NO1xuICBjYWxsYmFja3M6IHN0cmluZ1tdO1xuICByZW5kZXJfcHJvcHM6IHN0cmluZ1tdO1xuICBjc3NfcmVmczogc3RyaW5nW107XG59O1xuXG5leHBvcnQgdHlwZSBQdWxzZVByZXJlbmRlciA9IHtcbiAgcmVuZGVySWQ6IHN0cmluZztcbiAgdmlld3M6IFJlY29yZDxzdHJpbmcsIFB1bHNlUHJlcmVuZGVyVmlldz47XG59O1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIENvbnRleHQgYW5kIEhvb2tzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vLyBDb250ZXh0IGZvciB0aGUgY2xpZW50LCBwcm92aWRlZCBieSBQdWxzZVByb3ZpZGVyXG5jb25zdCBQdWxzZUNsaWVudENvbnRleHQgPSBjcmVhdGVDb250ZXh0PFB1bHNlU29ja2V0SU9DbGllbnQgfCBudWxsPihudWxsKTtcbmNvbnN0IFB1bHNlUHJlcmVuZGVyQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQ8UHVsc2VQcmVyZW5kZXIgfCBudWxsPihudWxsKTtcblxuZXhwb3J0IGNvbnN0IHVzZVB1bHNlQ2xpZW50ID0gKCkgPT4ge1xuICBjb25zdCBjbGllbnQgPSB1c2VDb250ZXh0KFB1bHNlQ2xpZW50Q29udGV4dCk7XG4gIGlmICghY2xpZW50KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwidXNlUHVsc2VDbGllbnQgbXVzdCBiZSB1c2VkIHdpdGhpbiBhIFB1bHNlUHJvdmlkZXJcIik7XG4gIH1cbiAgcmV0dXJuIGNsaWVudDtcbn07XG5cbmV4cG9ydCBjb25zdCB1c2VQdWxzZVByZXJlbmRlciA9IChwYXRoOiBzdHJpbmcpID0+IHtcbiAgY29uc3QgY3R4ID0gdXNlQ29udGV4dChQdWxzZVByZXJlbmRlckNvbnRleHQpO1xuICBpZiAoIWN0eCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcInVzZVB1bHNlUHJlcmVuZGVyIG11c3QgYmUgdXNlZCB3aXRoaW4gYSBQdWxzZVByb3ZpZGVyXCIpO1xuICB9XG4gIGNvbnN0IHZpZXcgPSBjdHgudmlld3NbcGF0aF07XG4gIGlmICghdmlldykge1xuICAgIHRocm93IG5ldyBFcnJvcihgTm8gcHJlcmVuZGVyIGZvdW5kIGZvciAnJHtwYXRofSdgKTtcbiAgfVxuICByZXR1cm4gdmlldztcbn07XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBQcm92aWRlclxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGludGVyZmFjZSBQdWxzZVByb3ZpZGVyUHJvcHMge1xuICBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlO1xuICBjb25maWc6IFB1bHNlQ29uZmlnO1xuICBwcmVyZW5kZXI6IFB1bHNlUHJlcmVuZGVyO1xufVxuXG5jb25zdCBpbkJyb3dzZXIgPSB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiO1xuXG5leHBvcnQgZnVuY3Rpb24gUHVsc2VQcm92aWRlcih7XG4gIGNoaWxkcmVuLFxuICBjb25maWcsXG4gIHByZXJlbmRlcixcbn06IFB1bHNlUHJvdmlkZXJQcm9wcykge1xuICBjb25zdCBbY29ubmVjdGVkLCBzZXRDb25uZWN0ZWRdID0gdXNlU3RhdGUodHJ1ZSk7XG4gIGNvbnN0IHJyTmF2aWdhdGUgPSB1c2VOYXZpZ2F0ZSgpO1xuICBjb25zdCB7IHJlbmRlcklkIH0gPSBwcmVyZW5kZXI7XG5cbiAgY29uc3QgY2xpZW50ID0gdXNlTWVtbyhcbiAgICAoKSA9PiBuZXcgUHVsc2VTb2NrZXRJT0NsaWVudChjb25maWcuc2VydmVyQWRkcmVzcywgcmVuZGVySWQsIHJyTmF2aWdhdGUpLFxuICAgIFtjb25maWcuc2VydmVyQWRkcmVzcywgcnJOYXZpZ2F0ZSwgcmVuZGVySWRdXG4gICk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IGNsaWVudC5vbkNvbm5lY3Rpb25DaGFuZ2Uoc2V0Q29ubmVjdGVkKSwgW2NsaWVudF0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGluQnJvd3Nlcikge1xuICAgICAgY2xpZW50LmNvbm5lY3QoKTtcbiAgICAgIHJldHVybiAoKSA9PiBjbGllbnQuZGlzY29ubmVjdCgpO1xuICAgIH1cbiAgfSwgW2NsaWVudF0pO1xuXG4gIHJldHVybiAoXG4gICAgPFB1bHNlQ2xpZW50Q29udGV4dC5Qcm92aWRlciB2YWx1ZT17Y2xpZW50fT5cbiAgICAgIDxQdWxzZVByZXJlbmRlckNvbnRleHQuUHJvdmlkZXIgdmFsdWU9e3ByZXJlbmRlcn0+XG4gICAgICAgIHshY29ubmVjdGVkICYmIChcbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICBwb3NpdGlvbjogXCJmaXhlZFwiLFxuICAgICAgICAgICAgICBib3R0b206IFwiMjBweFwiLFxuICAgICAgICAgICAgICByaWdodDogXCIyMHB4XCIsXG4gICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogXCJyZWRcIixcbiAgICAgICAgICAgICAgY29sb3I6IFwid2hpdGVcIixcbiAgICAgICAgICAgICAgcGFkZGluZzogXCIxMHB4XCIsXG4gICAgICAgICAgICAgIGJvcmRlclJhZGl1czogXCI1cHhcIixcbiAgICAgICAgICAgICAgekluZGV4OiAxMDAwLFxuICAgICAgICAgICAgfX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICBGYWlsZWQgdG8gY29ubmVjdCB0byB0aGUgc2VydmVyLlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICApfVxuICAgICAgICB7Y2hpbGRyZW59XG4gICAgICA8L1B1bHNlUHJlcmVuZGVyQ29udGV4dC5Qcm92aWRlcj5cbiAgICA8L1B1bHNlQ2xpZW50Q29udGV4dC5Qcm92aWRlcj5cbiAgKTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFZpZXdcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHVsc2VWaWV3UHJvcHMge1xuICBleHRlcm5hbENvbXBvbmVudHM6IENvbXBvbmVudFJlZ2lzdHJ5O1xuICBwYXRoOiBzdHJpbmc7XG4gIGNzc01vZHVsZXM6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gUHVsc2VWaWV3KHtcbiAgZXh0ZXJuYWxDb21wb25lbnRzLFxuICBwYXRoLFxuICBjc3NNb2R1bGVzLFxufTogUHVsc2VWaWV3UHJvcHMpIHtcbiAgY29uc3QgY2xpZW50ID0gdXNlUHVsc2VDbGllbnQoKTtcbiAgY29uc3QgaW5pdGlhbFZpZXcgPSB1c2VQdWxzZVByZXJlbmRlcihwYXRoKTtcbiAgY29uc3QgaW5pdGlhbFZET00gPSBpbml0aWFsVmlldy52ZG9tO1xuICBjb25zdCByZW5kZXJlciA9IHVzZU1lbW8oXG4gICAgKCkgPT5cbiAgICAgIG5ldyBWRE9NUmVuZGVyZXIoXG4gICAgICAgIGNsaWVudCxcbiAgICAgICAgcGF0aCxcbiAgICAgICAgZXh0ZXJuYWxDb21wb25lbnRzLFxuICAgICAgICBjc3NNb2R1bGVzLFxuICAgICAgICBpbml0aWFsVmlldy5jYWxsYmFja3MsXG4gICAgICAgIGluaXRpYWxWaWV3LnJlbmRlcl9wcm9wcyxcbiAgICAgICAgaW5pdGlhbFZpZXcuY3NzX3JlZnNcbiAgICAgICksXG4gICAgW2NsaWVudCwgcGF0aCwgZXh0ZXJuYWxDb21wb25lbnRzLCBjc3NNb2R1bGVzLCBpbml0aWFsVmlld11cbiAgKTtcbiAgY29uc3QgW3RyZWUsIHNldFRyZWVdID0gdXNlU3RhdGU8UmVhY3QuUmVhY3ROb2RlPigoKSA9PlxuICAgIHJlbmRlcmVyLnJlbmRlck5vZGUoaW5pdGlhbFZET00pXG4gICk7XG4gIGNvbnN0IFtzZXJ2ZXJFcnJvciwgc2V0U2VydmVyRXJyb3JdID0gdXNlU3RhdGU8U2VydmVyRXJyb3JJbmZvIHwgbnVsbD4obnVsbCk7XG5cbiAgY29uc3QgbG9jYXRpb24gPSB1c2VMb2NhdGlvbigpO1xuICBjb25zdCBwYXJhbXMgPSB1c2VQYXJhbXMoKTtcblxuICBjb25zdCByb3V0ZUluZm8gPSB1c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCB7IFwiKlwiOiBjYXRjaGFsbCA9IFwiXCIsIC4uLnBhdGhQYXJhbXMgfSA9IHBhcmFtcztcbiAgICBjb25zdCBxdWVyeVBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMobG9jYXRpb24uc2VhcmNoKTtcbiAgICByZXR1cm4ge1xuICAgICAgaGFzaDogbG9jYXRpb24uaGFzaCxcbiAgICAgIHBhdGhuYW1lOiBsb2NhdGlvbi5wYXRobmFtZSxcbiAgICAgIHF1ZXJ5OiBsb2NhdGlvbi5zZWFyY2gsXG4gICAgICBxdWVyeVBhcmFtczogT2JqZWN0LmZyb21FbnRyaWVzKHF1ZXJ5UGFyYW1zLmVudHJpZXMoKSksXG4gICAgICBwYXRoUGFyYW1zLFxuICAgICAgY2F0Y2hhbGw6IGNhdGNoYWxsLmxlbmd0aCA+IDAgPyBjYXRjaGFsbC5zcGxpdChcIi9cIikgOiBbXSxcbiAgICB9IHNhdGlzZmllcyBSb3V0ZUluZm87XG4gIH0sIFtcbiAgICBsb2NhdGlvbi5oYXNoLFxuICAgIGxvY2F0aW9uLnBhdGhuYW1lLFxuICAgIGxvY2F0aW9uLnNlYXJjaCxcbiAgICBKU09OLnN0cmluZ2lmeShwYXJhbXMpLFxuICBdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChpbkJyb3dzZXIpIHtcbiAgICAgIGNsaWVudC5tb3VudFZpZXcocGF0aCwge1xuICAgICAgICByb3V0ZUluZm8sXG4gICAgICAgIG9uSW5pdDogKHZkb20sIGNhbGxiYWNrcywgcmVuZGVyUHJvcHMsIGNzc1JlZnMpID0+IHtcbiAgICAgICAgICByZW5kZXJlci5zZXRDYWxsYmFja3MoY2FsbGJhY2tzKTtcbiAgICAgICAgICByZW5kZXJlci5zZXRSZW5kZXJQcm9wcyhyZW5kZXJQcm9wcyk7XG4gICAgICAgICAgcmVuZGVyZXIuc2V0Q3NzUmVmcyhjc3NSZWZzKTtcbiAgICAgICAgICBzZXRUcmVlKHJlbmRlcmVyLnJlbmRlck5vZGUodmRvbSkpO1xuICAgICAgICB9LFxuICAgICAgICBvblVwZGF0ZTogKG9wcykgPT4ge1xuICAgICAgICAgIHNldFRyZWUoKHByZXYpID0+XG4gICAgICAgICAgICBwcmV2ID09IG51bGwgPyBwcmV2IDogYXBwbHlVcGRhdGVzKHByZXYsIG9wcywgcmVuZGVyZXIpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgY29uc3Qgb2ZmRXJyID0gY2xpZW50Lm9uU2VydmVyRXJyb3IoKHAsIGVycikgPT4ge1xuICAgICAgICBpZiAocCA9PT0gcGF0aCkgc2V0U2VydmVyRXJyb3IoZXJyKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgb2ZmRXJyKCk7XG4gICAgICAgIGNsaWVudC51bm1vdW50KHBhdGgpO1xuICAgICAgfTtcbiAgICB9XG4gICAgLy8gcm91dGVJbmZvIGlzIE5PVCBpbmNsdWRlZCBoZXJlIG9uIHB1cnBvc2VcbiAgfSwgW2NsaWVudF0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGluQnJvd3Nlcikge1xuICAgICAgY2xpZW50Lm5hdmlnYXRlKHBhdGgsIHJvdXRlSW5mbyk7XG4gICAgfVxuICB9LCBbY2xpZW50LCBwYXRoLCByb3V0ZUluZm9dKTtcblxuICBpZiAoc2VydmVyRXJyb3IpIHtcbiAgICByZXR1cm4gPFNlcnZlckVycm9yIGVycm9yPXtzZXJ2ZXJFcnJvcn0gLz47XG4gIH1cblxuICByZXR1cm4gdHJlZTtcbn1cblxuZnVuY3Rpb24gU2VydmVyRXJyb3IoeyBlcnJvciB9OiB7IGVycm9yOiBTZXJ2ZXJFcnJvckluZm8gfSkge1xuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIHN0eWxlPXt7XG4gICAgICAgIHBhZGRpbmc6IDE2LFxuICAgICAgICBib3JkZXI6IFwiMXB4IHNvbGlkICNlMDBcIixcbiAgICAgICAgYmFja2dyb3VuZDogXCIjZmZmNWY1XCIsXG4gICAgICAgIGNvbG9yOiBcIiM5MDBcIixcbiAgICAgICAgZm9udEZhbWlseTpcbiAgICAgICAgICAndWktbW9ub3NwYWNlLCBTRk1vbm8tUmVndWxhciwgTWVubG8sIE1vbmFjbywgQ29uc29sYXMsIFwiTGliZXJhdGlvbiBNb25vXCIsIFwiQ291cmllciBOZXdcIiwgbW9ub3NwYWNlJyxcbiAgICAgICAgd2hpdGVTcGFjZTogXCJwcmUtd3JhcFwiLFxuICAgICAgfX1cbiAgICA+XG4gICAgICA8ZGl2IHN0eWxlPXt7IGZvbnRXZWlnaHQ6IDcwMCwgbWFyZ2luQm90dG9tOiA4IH19PlxuICAgICAgICBTZXJ2ZXIgRXJyb3IgZHVyaW5nIHtlcnJvci5waGFzZX1cbiAgICAgIDwvZGl2PlxuICAgICAge2Vycm9yLm1lc3NhZ2UgJiYgPGRpdj57ZXJyb3IubWVzc2FnZX08L2Rpdj59XG4gICAgICB7ZXJyb3Iuc3RhY2sgJiYgKFxuICAgICAgICA8ZGV0YWlscyBvcGVuIHN0eWxlPXt7IG1hcmdpblRvcDogOCB9fT5cbiAgICAgICAgICA8c3VtbWFyeT5TdGFjayB0cmFjZTwvc3VtbWFyeT5cbiAgICAgICAgICA8cHJlIHN0eWxlPXt7IG1hcmdpbjogMCB9fT57ZXJyb3Iuc3RhY2t9PC9wcmU+XG4gICAgICAgIDwvZGV0YWlscz5cbiAgICAgICl9XG4gICAgPC9kaXY+XG4gICk7XG59XG4iLAogICAgImltcG9ydCBSZWFjdCwge1xuICBjbG9uZUVsZW1lbnQsXG4gIGNyZWF0ZUVsZW1lbnQsXG4gIGlzVmFsaWRFbGVtZW50LFxuICBsYXp5LFxuICBTdXNwZW5zZSxcbiAgdHlwZSBDb21wb25lbnRUeXBlLFxufSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB0eXBlIHtcbiAgQ29tcG9uZW50UmVnaXN0cnksXG4gIFZET01Ob2RlLFxuICBWRE9NVXBkYXRlLFxuICBWRE9NLFxuICBQYXRoRGVsdGEsXG59IGZyb20gXCIuL3Zkb21cIjtcbmltcG9ydCB7XG4gIEZSQUdNRU5UX1RBRyxcbiAgaXNFbGVtZW50Tm9kZSxcbiAgaXNNb3VudFBvaW50Tm9kZSxcbiAgTU9VTlRfUE9JTlRfUFJFRklYLFxufSBmcm9tIFwiLi92ZG9tXCI7XG5pbXBvcnQgdHlwZSB7IFB1bHNlU29ja2V0SU9DbGllbnQgfSBmcm9tIFwiLi9jbGllbnRcIjtcblxuZXhwb3J0IGNsYXNzIFZET01SZW5kZXJlciB7XG4gIHByaXZhdGUgY2FsbGJhY2tzOiBTZXQ8c3RyaW5nPjtcbiAgcHJpdmF0ZSBjYWxsYmFja0NhY2hlOiBNYXA8c3RyaW5nLCBGdW5jdGlvbj47XG4gIHByaXZhdGUgcmVuZGVyUHJvcEtleXM6IFNldDxzdHJpbmc+O1xuICBwcml2YXRlIGNzc1Byb3BzOiBTZXQ8c3RyaW5nPjtcbiAgcHJpdmF0ZSBjYWxsYmFja0xpc3Q6IHN0cmluZ1tdO1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNsaWVudDogUHVsc2VTb2NrZXRJT0NsaWVudCxcbiAgICBwcml2YXRlIHBhdGg6IHN0cmluZyxcbiAgICBwcml2YXRlIGNvbXBvbmVudHM6IENvbXBvbmVudFJlZ2lzdHJ5LFxuICAgIHByaXZhdGUgY3NzTW9kdWxlczogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgc3RyaW5nPj4sXG4gICAgaW5pdGlhbENhbGxiYWNrczogc3RyaW5nW10gPSBbXSxcbiAgICBpbml0aWFsUmVuZGVyUHJvcHM6IHN0cmluZ1tdID0gW10sXG4gICAgaW5pdGlhbENzc1JlZnM6IHN0cmluZ1tdID0gW11cbiAgKSB7XG4gICAgdGhpcy5jYWxsYmFja3MgPSBuZXcgU2V0KGluaXRpYWxDYWxsYmFja3MpO1xuICAgIHRoaXMuY2FsbGJhY2tDYWNoZSA9IG5ldyBNYXAoKTtcbiAgICB0aGlzLnJlbmRlclByb3BLZXlzID0gbmV3IFNldChpbml0aWFsUmVuZGVyUHJvcHMpO1xuICAgIHRoaXMuY3NzUHJvcHMgPSBuZXcgU2V0KGluaXRpYWxDc3NSZWZzKTtcbiAgICB0aGlzLmNhbGxiYWNrTGlzdCA9IFsuLi50aGlzLmNhbGxiYWNrc10uc29ydCgpO1xuICB9XG5cbiAgLy8gQWNjZXNzb3JzIHVzZWQgYnkgdXBkYXRlIGxvZ2ljIHRvIGRldGVybWluZSB3aGljaCBwcm9wcyBuZWVkIHJlYmluZGluZ1xuICBoYXNDYWxsYmFja1BhdGgocGF0aDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuY2FsbGJhY2tzLmhhcyhwYXRoKTtcbiAgfVxuXG4gIGhhc1JlbmRlclByb3BQYXRoKHBhdGg6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnJlbmRlclByb3BLZXlzLmhhcyhwYXRoKTtcbiAgfVxuXG4gIGhhc0FueUNhbGxiYWNrVW5kZXIocHJlZml4OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAocHJlZml4ID09PSBcIlwiKSByZXR1cm4gdGhpcy5jYWxsYmFja0xpc3QubGVuZ3RoID4gMDtcbiAgICBjb25zdCBpID0gbG93ZXJCb3VuZCh0aGlzLmNhbGxiYWNrTGlzdCwgcHJlZml4KTtcbiAgICByZXR1cm4gKFxuICAgICAgaSA8IHRoaXMuY2FsbGJhY2tMaXN0Lmxlbmd0aCAmJiB0aGlzLmNhbGxiYWNrTGlzdFtpXSEuc3RhcnRzV2l0aChwcmVmaXgpXG4gICAgKTtcbiAgfVxuXG4gIHNldENhbGxiYWNrcyhrZXlzOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuY2FsbGJhY2tzID0gbmV3IFNldChrZXlzKTtcbiAgICAvLyBwcnVuZSBzdGFsZSBjYWNoZWQgY2FsbGJhY2tzXG4gICAgZm9yIChjb25zdCBrIG9mIEFycmF5LmZyb20odGhpcy5jYWxsYmFja0NhY2hlLmtleXMoKSkpIHtcbiAgICAgIGlmICghdGhpcy5jYWxsYmFja3MuaGFzKGspKSB0aGlzLmNhbGxiYWNrQ2FjaGUuZGVsZXRlKGspO1xuICAgIH1cbiAgICB0aGlzLmNhbGxiYWNrTGlzdCA9IFsuLi50aGlzLmNhbGxiYWNrc10uc29ydCgpO1xuICB9XG5cbiAgc2V0UmVuZGVyUHJvcHMoa2V5czogc3RyaW5nW10pIHtcbiAgICB0aGlzLnJlbmRlclByb3BLZXlzID0gbmV3IFNldChrZXlzKTtcbiAgfVxuXG4gIHNldENzc1JlZnMoZW50cmllczogc3RyaW5nW10pIHtcbiAgICB0aGlzLmNzc1Byb3BzID0gbmV3IFNldChlbnRyaWVzKTtcbiAgfVxuXG4gIGFwcGx5Q2FsbGJhY2tEZWx0YShkZWx0YTogUGF0aERlbHRhKSB7XG4gICAgLy8gT25seSB1cGRhdGUgdGhlIGludGVybmFsIGNhbGxiYWNrIHBhdGggcmVnaXN0cnkgYW5kIGNhY2hlLiBXZSByZWx5IG9uXG4gICAgLy8gYWNjb21wYW55aW5nIHVwZGF0ZV9wcm9wcyBvcGVyYXRpb25zIHRoYXQgY29udGFpbiB0aGUgXCIkY2JcIiBwbGFjZWhvbGRlclxuICAgIC8vIHRvIHRyaWdnZXIgcHJvcCB1cGRhdGVzOyB0cmFuc2Zvcm1WYWx1ZSB3aWxsIHJlc29sdmUgdG8gZnVuY3Rpb25zLlxuICAgIGlmIChkZWx0YS5yZW1vdmUpIHtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGRlbHRhLnJlbW92ZSkge1xuICAgICAgICB0aGlzLmNhbGxiYWNrcy5kZWxldGUoa2V5KTtcbiAgICAgICAgdGhpcy5jYWxsYmFja0NhY2hlLmRlbGV0ZShrZXkpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZGVsdGEuYWRkKSB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBkZWx0YS5hZGQpIHtcbiAgICAgICAgdGhpcy5jYWxsYmFja3MuYWRkKGtleSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuY2FsbGJhY2tMaXN0ID0gWy4uLnRoaXMuY2FsbGJhY2tzXS5zb3J0KCk7XG4gIH1cblxuICBhcHBseVJlbmRlclByb3BzRGVsdGEoZGVsdGE6IFBhdGhEZWx0YSkge1xuICAgIGlmIChkZWx0YS5yZW1vdmUpIHtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGRlbHRhLnJlbW92ZSkge1xuICAgICAgICB0aGlzLnJlbmRlclByb3BLZXlzLmRlbGV0ZShrZXkpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZGVsdGEuYWRkKSB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBkZWx0YS5hZGQpIHtcbiAgICAgICAgdGhpcy5yZW5kZXJQcm9wS2V5cy5hZGQoa2V5KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhcHBseUNzc1JlZnNEZWx0YShkZWx0YTogUGF0aERlbHRhKSB7XG4gICAgaWYgKGRlbHRhLnJlbW92ZSkge1xuICAgICAgZm9yIChjb25zdCBwcm9wIG9mIGRlbHRhLnJlbW92ZSkge1xuICAgICAgICB0aGlzLmNzc1Byb3BzLmRlbGV0ZShwcm9wKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGRlbHRhLmFkZCkge1xuICAgICAgZm9yIChjb25zdCBwcm9wIG9mIGRlbHRhLmFkZCkge1xuICAgICAgICB0aGlzLmNzc1Byb3BzLmFkZChwcm9wKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXRDYWxsYmFjayhwYXRoOiBzdHJpbmcsIHByb3A6IHN0cmluZykge1xuICAgIGNvbnN0IGtleSA9IHRoaXMucHJvcFBhdGgocGF0aCwgcHJvcCk7XG4gICAgbGV0IGZuID0gdGhpcy5jYWxsYmFja0NhY2hlLmdldChrZXkpO1xuICAgIGlmICghZm4pIHtcbiAgICAgIGZuID0gKC4uLmFyZ3M6IGFueVtdKSA9PiB0aGlzLmNsaWVudC5pbnZva2VDYWxsYmFjayh0aGlzLnBhdGgsIGtleSwgYXJncyk7XG4gICAgICB0aGlzLmNhbGxiYWNrQ2FjaGUuc2V0KGtleSwgZm4pO1xuICAgIH1cbiAgICByZXR1cm4gZm47XG4gIH1cblxuICByZW5kZXJOb2RlKG5vZGU6IFZET01Ob2RlLCBjdXJyZW50UGF0aCA9IFwiXCIpOiBSZWFjdC5SZWFjdE5vZGUge1xuICAgIC8vIEhhbmRsZSBwcmltaXRpdmVzIGVhcmx5XG4gICAgaWYgKFxuICAgICAgbm9kZSA9PSBudWxsIHx8IC8vIGNhdGNoZXMgYm90aCBudWxsIGFuZCB1bmRlZmluZWRcbiAgICAgIHR5cGVvZiBub2RlID09PSBcImJvb2xlYW5cIiB8fFxuICAgICAgdHlwZW9mIG5vZGUgPT09IFwibnVtYmVyXCIgfHxcbiAgICAgIHR5cGVvZiBub2RlID09PSBcInN0cmluZ1wiXG4gICAgKSB7XG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG5cbiAgICAvLyBFbGVtZW50IG5vZGVzXG4gICAgaWYgKGlzRWxlbWVudE5vZGUobm9kZSkpIHtcbiAgICAgIGNvbnN0IHsgdGFnLCBwcm9wcyA9IHt9LCBjaGlsZHJlbiA9IFtdIH0gPSBub2RlO1xuXG4gICAgICBjb25zdCBuZXdQcm9wczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgICAgZm9yIChjb25zdCBbcHJvcE5hbWUsIHByb3BWYWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocHJvcHMpKSB7XG4gICAgICAgIG5ld1Byb3BzW3Byb3BOYW1lXSA9IHRoaXMudHJhbnNmb3JtVmFsdWUoXG4gICAgICAgICAgY3VycmVudFBhdGgsXG4gICAgICAgICAgcHJvcE5hbWUsXG4gICAgICAgICAgcHJvcFZhbHVlXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlLmtleSkge1xuICAgICAgICBuZXdQcm9wcy5rZXkgPSBub2RlLmtleTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVuZGVyZWRDaGlsZHJlbiA9IFtdO1xuICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGNoaWxkcmVuLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuW2luZGV4XSE7XG4gICAgICAgIGNvbnN0IGNoaWxkUGF0aCA9IGN1cnJlbnRQYXRoXG4gICAgICAgICAgPyBgJHtjdXJyZW50UGF0aH0uJHtpbmRleH1gXG4gICAgICAgICAgOiBTdHJpbmcoaW5kZXgpO1xuICAgICAgICByZW5kZXJlZENoaWxkcmVuLnB1c2godGhpcy5yZW5kZXJOb2RlKGNoaWxkLCBjaGlsZFBhdGgpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzTW91bnRQb2ludE5vZGUobm9kZSkpIHtcbiAgICAgICAgY29uc3QgY29tcG9uZW50S2V5ID0gbm9kZS50YWcuc2xpY2UoTU9VTlRfUE9JTlRfUFJFRklYLmxlbmd0aCk7XG4gICAgICAgIGNvbnN0IENvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50c1tjb21wb25lbnRLZXldITtcbiAgICAgICAgaWYgKCFDb21wb25lbnQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQ291bGQgbm90IGZpbmQgY29tcG9uZW50ICR7Y29tcG9uZW50S2V5fS4gVGhpcyBpcyBhIFB1bHNlIGludGVybmFsIGVycm9yLmBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjcmVhdGVFbGVtZW50KENvbXBvbmVudCwgbmV3UHJvcHMsIC4uLnJlbmRlcmVkQ2hpbGRyZW4pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY3JlYXRlRWxlbWVudChcbiAgICAgICAgdGFnID09PSBGUkFHTUVOVF9UQUcgPyBSZWFjdC5GcmFnbWVudCA6IHRhZyxcbiAgICAgICAgbmV3UHJvcHMsXG4gICAgICAgIC4uLnJlbmRlcmVkQ2hpbGRyZW5cbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2sgZm9yIHVua25vd24gbm9kZSB0eXBlc1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJVbmtub3duIFZET00gbm9kZSB0eXBlOlwiLCBub2RlKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIHByb3BQYXRoKHBhdGg6IHN0cmluZywgcHJvcDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHBhdGggPyBgJHtwYXRofS4ke3Byb3B9YCA6IHByb3A7XG4gIH1cblxuICB0cmFuc2Zvcm1WYWx1ZShwYXRoOiBzdHJpbmcsIGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgY29uc3QgcHJvcFBhdGggPSB0aGlzLnByb3BQYXRoKHBhdGgsIGtleSk7XG4gICAgaWYgKHRoaXMuY2FsbGJhY2tzLmhhcyhwcm9wUGF0aCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldENhbGxiYWNrKHBhdGgsIGtleSk7XG4gICAgfVxuICAgIGlmICh0aGlzLnJlbmRlclByb3BLZXlzLmhhcyhwcm9wUGF0aCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbmRlck5vZGUodmFsdWUsIHByb3BQYXRoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuY3NzUHJvcHMuaGFzKHByb3BQYXRoKSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVzb2x2ZUNzc1Rva2VuKHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlQ3NzVG9rZW4odG9rZW46IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgaWR4ID0gdG9rZW4uaW5kZXhPZihcIjpcIik7XG4gICAgaWYgKGlkeCA9PT0gLTEpIHtcbiAgICAgIHJldHVybiB0b2tlbjtcbiAgICB9XG4gICAgY29uc3QgbW9kdWxlSWQgPSB0b2tlbi5zbGljZSgwLCBpZHgpO1xuICAgIGNvbnN0IGNsYXNzTmFtZSA9IHRva2VuLnNsaWNlKGlkeCArIDEpO1xuICAgIGlmICghbW9kdWxlSWQgfHwgIWNsYXNzTmFtZSkge1xuICAgICAgcmV0dXJuIHRva2VuO1xuICAgIH1cbiAgICBjb25zdCBtb2QgPSB0aGlzLmNzc01vZHVsZXNbbW9kdWxlSWRdO1xuICAgIGlmICghbW9kKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBSZWNlaXZlZCBDU1MgcmVmZXJlbmNlIGZvciB1bmtub3duIG1vZHVsZSAnJHttb2R1bGVJZH0nYFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgcmVzb2x2ZWQgPSBtb2RbY2xhc3NOYW1lXTtcbiAgICBpZiAodHlwZW9mIHJlc29sdmVkICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBSZWNlaXZlZCBDU1MgcmVmZXJlbmNlIGZvciBtaXNzaW5nIGNsYXNzICcke2NsYXNzTmFtZX0nIGluIG1vZHVsZSAnJHttb2R1bGVJZH0nYFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc29sdmVkO1xuICB9XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBVcGRhdGUgRnVuY3Rpb25zIChzaGFsbG93LWNsb25lIGFsb25nIHVwZGF0ZSBwYXRoKVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gZW5zdXJlQ2hpbGRyZW5BcnJheShlbDogUmVhY3QuUmVhY3RFbGVtZW50KTogUmVhY3QuUmVhY3ROb2RlW10ge1xuICBjb25zdCBjaGlsZHJlbiA9IChlbC5wcm9wcyBhcyBhbnkpPy5jaGlsZHJlbiBhcyBSZWFjdC5SZWFjdE5vZGUgfCB1bmRlZmluZWQ7XG4gIGlmIChjaGlsZHJlbiA9PSBudWxsKSByZXR1cm4gW107XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGNoaWxkcmVuKSA/IGNoaWxkcmVuLnNsaWNlKCkgOiBbY2hpbGRyZW5dO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlVcGRhdGVzKFxuICBpbml0aWFsVHJlZTogUmVhY3QuUmVhY3ROb2RlLFxuICB1cGRhdGVzOiBWRE9NVXBkYXRlW10sXG4gIHJlbmRlcmVyOiBWRE9NUmVuZGVyZXJcbik6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gIGxldCBuZXdUcmVlOiBSZWFjdC5SZWFjdE5vZGUgPSBpbml0aWFsVHJlZTtcbiAgZm9yIChjb25zdCB1cGRhdGUgb2YgdXBkYXRlcykge1xuICAgIGlmICh1cGRhdGUudHlwZSA9PT0gXCJ1cGRhdGVfY2FsbGJhY2tzXCIpIHtcbiAgICAgIHJlbmRlcmVyLmFwcGx5Q2FsbGJhY2tEZWx0YSh1cGRhdGUuZGF0YSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKHVwZGF0ZS50eXBlID09PSBcInVwZGF0ZV9jc3NfcmVmc1wiKSB7XG4gICAgICByZW5kZXJlci5hcHBseUNzc1JlZnNEZWx0YSh1cGRhdGUuZGF0YSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKHVwZGF0ZS50eXBlID09PSBcInVwZGF0ZV9yZW5kZXJfcHJvcHNcIikge1xuICAgICAgcmVuZGVyZXIuYXBwbHlSZW5kZXJQcm9wc0RlbHRhKHVwZGF0ZS5kYXRhKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcnRzID0gdXBkYXRlLnBhdGguc3BsaXQoXCIuXCIpLmZpbHRlcigocykgPT4gcy5sZW5ndGggPiAwKTtcblxuICAgIGNvbnN0IGRlc2NlbmQgPSAoXG4gICAgICBub2RlOiBSZWFjdC5SZWFjdE5vZGUsXG4gICAgICBkZXB0aDogbnVtYmVyLFxuICAgICAgcGF0aDogc3RyaW5nXG4gICAgKTogUmVhY3QuUmVhY3ROb2RlID0+IHtcbiAgICAgIGlmIChkZXB0aCA8IHBhcnRzLmxlbmd0aCkge1xuICAgICAgICBhc3NlcnRJc0VsZW1lbnQobm9kZSwgcGFydHMsIGRlcHRoKTtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IG5vZGUgYXMgUmVhY3QuUmVhY3RFbGVtZW50PFJlY29yZDxzdHJpbmcsIGFueT4gfCBudWxsPjtcbiAgICAgICAgY29uc3QgY2hpbGRLZXkgPSBwYXJ0c1tkZXB0aF0hO1xuICAgICAgICBjb25zdCBjaGlsZElkeCA9ICtjaGlsZEtleTtcbiAgICAgICAgY29uc3QgY2hpbGRQYXRoID0gcGF0aCA/IGAke3BhdGh9LiR7Y2hpbGRLZXl9YCA6IGNoaWxkS2V5O1xuICAgICAgICBpZiAoIU51bWJlci5pc05hTihjaGlsZElkeCkpIHtcbiAgICAgICAgICAvLyBSZWd1bGFyIGNoaWxkIHRyYXZlcnNhbFxuICAgICAgICAgIGNvbnN0IGNoaWxkcmVuQXJyID0gZW5zdXJlQ2hpbGRyZW5BcnJheShlbGVtZW50KTtcbiAgICAgICAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuQXJyW2NoaWxkSWR4XTtcbiAgICAgICAgICBjaGlsZHJlbkFycltjaGlsZElkeF0gPSBkZXNjZW5kKGNoaWxkLCBkZXB0aCArIDEsIGNoaWxkUGF0aCkgYXMgYW55O1xuICAgICAgICAgIHJldHVybiBjbG9uZUVsZW1lbnQoZWxlbWVudCwgdW5kZWZpbmVkLCAuLi5jaGlsZHJlbkFycik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gUmVuZGVyIHByb3AgdHJhdmVyc2FsXG4gICAgICAgICAgY29uc3QgYmFzZVByb3BzID0gKGVsZW1lbnQucHJvcHMgPz8ge30pIGFzIFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgICAgICAgY29uc3QgY2hpbGQgPSBiYXNlUHJvcHNbY2hpbGRLZXldO1xuICAgICAgICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgICAgICAgLi4uYmFzZVByb3BzLFxuICAgICAgICAgICAgW2NoaWxkS2V5XTogZGVzY2VuZChjaGlsZCwgZGVwdGggKyAxLCBjaGlsZFBhdGgpLFxuICAgICAgICAgIH07XG4gICAgICAgICAgcmV0dXJuIGNsb25lRWxlbWVudChlbGVtZW50LCBwcm9wcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHN3aXRjaCAodXBkYXRlLnR5cGUpIHtcbiAgICAgICAgY2FzZSBcInJlcGxhY2VcIjoge1xuICAgICAgICAgIHJldHVybiByZW5kZXJlci5yZW5kZXJOb2RlKHVwZGF0ZS5kYXRhLCB1cGRhdGUucGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcInVwZGF0ZV9wcm9wc1wiOiB7XG4gICAgICAgICAgYXNzZXJ0SXNFbGVtZW50KG5vZGUsIHBhcnRzLCBkZXB0aCk7XG4gICAgICAgICAgY29uc3QgZWxlbWVudCA9IG5vZGUgYXMgUmVhY3QuUmVhY3RFbGVtZW50O1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRQcm9wcyA9IChlbGVtZW50LnByb3BzID8/IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgICAgICAgIGNvbnN0IG5leHRQcm9wczogUmVjb3JkPHN0cmluZywgYW55PiA9IHsgLi4uY3VycmVudFByb3BzIH07XG4gICAgICAgICAgY29uc3QgZGVsdGEgPSB1cGRhdGUuZGF0YTtcbiAgICAgICAgICBpZiAoZGVsdGEucmVtb3ZlICYmIGRlbHRhLnJlbW92ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBkZWx0YS5yZW1vdmUpIHtcbiAgICAgICAgICAgICAgaWYgKGtleSBpbiBuZXh0UHJvcHMpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgbmV4dFByb3BzW2tleV07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGRlbHRhLnNldCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMoZGVsdGEuc2V0KSkge1xuICAgICAgICAgICAgICBuZXh0UHJvcHNba10gPSByZW5kZXJlci50cmFuc2Zvcm1WYWx1ZShwYXRoLCBrLCB2KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gTm90IHBhc3NpbmcgY2hpbGRyZW4gLT4gb25seSB1cGRhdGUgdGhlIHByb3BzXG4gICAgICAgICAgcmV0dXJuIGNsb25lRWxlbWVudChlbGVtZW50LCBuZXh0UHJvcHMpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNhc2UgXCJpbnNlcnRcIjoge1xuICAgICAgICAvLyAgIGFzc2VydElzRWxlbWVudChub2RlLCBwYXJ0cywgZGVwdGgpO1xuICAgICAgICAvLyAgIGNvbnN0IGVsZW1lbnQgPSBub2RlIGFzIFJlYWN0LlJlYWN0RWxlbWVudDtcbiAgICAgICAgLy8gICBjb25zdCBjaGlsZHJlbiA9IGVuc3VyZUNoaWxkcmVuQXJyYXkoZWxlbWVudCk7XG4gICAgICAgIC8vICAgY29uc3QgY2hpbGRQYXRoID0gY3VycmVudFBhdGhcbiAgICAgICAgLy8gICAgID8gYCR7Y3VycmVudFBhdGh9LiR7dXBkYXRlLmlkeH1gXG4gICAgICAgIC8vICAgICA6IFN0cmluZyh1cGRhdGUuaWR4KTtcbiAgICAgICAgLy8gICBjaGlsZHJlbi5zcGxpY2UoXG4gICAgICAgIC8vICAgICB1cGRhdGUuaWR4LFxuICAgICAgICAvLyAgICAgMCxcbiAgICAgICAgLy8gICAgIHJlbmRlcmVyLnJlbmRlck5vZGUodXBkYXRlLmRhdGEsIGNoaWxkUGF0aClcbiAgICAgICAgLy8gICApO1xuICAgICAgICAvLyAgIC8vIE9ubHkgdXBkYXRlIHRoZSBjaGlsZHJlbiAoVHlwZVNjcmlwdCBkb2Vzbid0IGxpa2UgdGhlIGBudWxsYCwgYnV0IHRoYXQncyB3aGF0IHRoZSBvZmZpY2lhbCBSZWFjdCBkb2NzIHNheSlcbiAgICAgICAgLy8gICByZXR1cm4gY2xvbmVFbGVtZW50KGVsZW1lbnQsIG51bGwhLCAuLi5jaGlsZHJlbik7XG4gICAgICAgIC8vIH1cbiAgICAgICAgLy8gY2FzZSBcInJlbW92ZVwiOiB7XG4gICAgICAgIC8vICAgYXNzZXJ0SXNFbGVtZW50KG5vZGUsIHBhcnRzLCBkZXB0aCk7XG4gICAgICAgIC8vICAgY29uc3QgZWxlbWVudCA9IG5vZGUgYXMgUmVhY3QuUmVhY3RFbGVtZW50O1xuICAgICAgICAvLyAgIGNvbnN0IGNoaWxkcmVuID0gZW5zdXJlQ2hpbGRyZW5BcnJheShlbGVtZW50KTtcbiAgICAgICAgLy8gICBjaGlsZHJlbi5zcGxpY2UodXBkYXRlLmlkeCwgMSk7XG4gICAgICAgIC8vICAgLy8gT25seSB1cGRhdGUgdGhlIGNoaWxkcmVuIChUeXBlU2NyaXB0IGRvZXNuJ3QgbGlrZSB0aGUgYG51bGxgLCBidXQgdGhhdCdzIHdoYXQgdGhlIG9mZmljaWFsIFJlYWN0IGRvY3Mgc2F5KVxuICAgICAgICAvLyAgIHJldHVybiBjbG9uZUVsZW1lbnQoZWxlbWVudCwgbnVsbCEsIC4uLmNoaWxkcmVuKTtcbiAgICAgICAgLy8gfVxuICAgICAgICAvLyBjYXNlIFwibW92ZVwiOiB7XG4gICAgICAgIC8vICAgYXNzZXJ0SXNFbGVtZW50KG5vZGUsIHBhcnRzLCBkZXB0aCk7XG4gICAgICAgIC8vICAgY29uc3QgZWxlbWVudCA9IG5vZGUgYXMgUmVhY3QuUmVhY3RFbGVtZW50O1xuICAgICAgICAvLyAgIGNvbnN0IGNoaWxkcmVuID0gZW5zdXJlQ2hpbGRyZW5BcnJheShlbGVtZW50KTtcbiAgICAgICAgLy8gICBjb25zdCBpdGVtID0gY2hpbGRyZW4uc3BsaWNlKHVwZGF0ZS5kYXRhLmZyb21faW5kZXgsIDEpWzBdO1xuICAgICAgICAvLyAgIGNoaWxkcmVuLnNwbGljZSh1cGRhdGUuZGF0YS50b19pbmRleCwgMCwgaXRlbSk7XG5cbiAgICAgICAgLy8gICAvLyBSZWJpbmQgY2FsbGJhY2tzIGZvciBhZmZlY3RlZCBpbmRleCByYW5nZSAoaW5kaWNlcyB3aG9zZSBwYXRoIGNoYW5nZWQpXG4gICAgICAgIC8vICAgY29uc3Qgc3RhcnQgPSBNYXRoLm1pbih1cGRhdGUuZGF0YS5mcm9tX2luZGV4LCB1cGRhdGUuZGF0YS50b19pbmRleCk7XG4gICAgICAgIC8vICAgY29uc3QgZW5kID0gTWF0aC5tYXgodXBkYXRlLmRhdGEuZnJvbV9pbmRleCwgdXBkYXRlLmRhdGEudG9faW5kZXgpO1xuICAgICAgICAvLyAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8PSBlbmQ7IGkrKykge1xuICAgICAgICAvLyAgICAgY29uc3QgY2hpbGRQYXRoID0gY3VycmVudFBhdGggPyBgJHtjdXJyZW50UGF0aH0uJHtpfWAgOiBTdHJpbmcoaSk7XG4gICAgICAgIC8vICAgICBpZiAocmVuZGVyZXIuaGFzQW55Q2FsbGJhY2tVbmRlcihjaGlsZFBhdGgpKSB7XG4gICAgICAgIC8vICAgICAgIGNoaWxkcmVuW2ldID0gcmViaW5kQ2FsbGJhY2tzSW5TdWJ0cmVlKFxuICAgICAgICAvLyAgICAgICAgIGNoaWxkcmVuW2ldLFxuICAgICAgICAvLyAgICAgICAgIGNoaWxkUGF0aCxcbiAgICAgICAgLy8gICAgICAgICByZW5kZXJlclxuICAgICAgICAvLyAgICAgICApIGFzIGFueTtcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gICB9XG5cbiAgICAgICAgLy8gICAvLyBPbmx5IHVwZGF0ZSB0aGUgY2hpbGRyZW4gKFR5cGVTY3JpcHQgZG9lc24ndCBsaWtlIHRoZSBgbnVsbGAsIGJ1dCB0aGF0J3Mgd2hhdCB0aGUgb2ZmaWNpYWwgUmVhY3QgZG9jcyBzYXkpXG4gICAgICAgIC8vICAgcmV0dXJuIGNsb25lRWxlbWVudChlbGVtZW50LCBudWxsISwgLi4uY2hpbGRyZW4pO1xuICAgICAgICAvLyB9XG4gICAgICAgIGNhc2UgXCJyZWNvbmNpbGlhdGlvblwiOiB7XG4gICAgICAgICAgYXNzZXJ0SXNFbGVtZW50KG5vZGUsIHBhcnRzLCBkZXB0aCk7XG4gICAgICAgICAgY29uc3QgZWxlbWVudCA9IG5vZGUgYXMgUmVhY3QuUmVhY3RFbGVtZW50O1xuICAgICAgICAgIGNvbnN0IHByZXZDaGlsZHJlbiA9IGVuc3VyZUNoaWxkcmVuQXJyYXkoZWxlbWVudCk7XG4gICAgICAgICAgY29uc3QgbmV4dENoaWxkcmVuID0gW107XG5cbiAgICAgICAgICBjb25zdCBbbmV3SW5kaWNlcywgbmV3Q29udGVudHNdID0gdXBkYXRlLm5ldztcbiAgICAgICAgICBjb25zdCBbcmV1c2VJbmRpY2VzLCByZXVzZVNvdXJjZXNdID0gdXBkYXRlLnJldXNlO1xuXG4gICAgICAgICAgbGV0IG5leHROZXcgPSAtMSxcbiAgICAgICAgICAgIG5leHRSZXVzZSA9IC0xLFxuICAgICAgICAgICAgbmV3SWR4ID0gLTEsXG4gICAgICAgICAgICByZXVzZUlkeCA9IC0xO1xuICAgICAgICAgIGlmIChuZXdJbmRpY2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIG5leHROZXcgPSBuZXdJbmRpY2VzWzBdO1xuICAgICAgICAgICAgbmV3SWR4ID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJldXNlSW5kaWNlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBuZXh0UmV1c2UgPSByZXVzZUluZGljZXNbMF07XG4gICAgICAgICAgICByZXVzZUlkeCA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdXBkYXRlLk47ICsraSkge1xuICAgICAgICAgICAgaWYgKGkgPT09IG5leHROZXcpIHtcbiAgICAgICAgICAgICAgY29uc3QgY29udGVudHMgPSBuZXdDb250ZW50c1tuZXdJZHhdO1xuICAgICAgICAgICAgICBjb25zdCBjaGlsZFBhdGggPSBwYXRoID8gYCR7cGF0aH0uJHtpfWAgOiBTdHJpbmcoaSk7XG4gICAgICAgICAgICAgIG5leHRDaGlsZHJlbi5wdXNoKHJlbmRlcmVyLnJlbmRlck5vZGUoY29udGVudHMsIGNoaWxkUGF0aCkpO1xuICAgICAgICAgICAgICBuZXh0TmV3ID1cbiAgICAgICAgICAgICAgICBuZXdJZHggPCBuZXdJbmRpY2VzLmxlbmd0aCAtIDEgPyBuZXdJbmRpY2VzWysrbmV3SWR4XSA6IC0xO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpID09PSBuZXh0UmV1c2UpIHtcbiAgICAgICAgICAgICAgY29uc3Qgc3JjSWR4ID0gcmV1c2VTb3VyY2VzW3JldXNlSWR4XTtcbiAgICAgICAgICAgICAgbGV0IHNyYyA9IHByZXZDaGlsZHJlbltzcmNJZHhdO1xuICAgICAgICAgICAgICBjb25zdCBjaGlsZFBhdGggPSBwYXRoID8gYCR7cGF0aH0uJHtpfWAgOiBTdHJpbmcoaSk7XG4gICAgICAgICAgICAgIC8vIFRoZSBub2RlIG1heSBoYXZlIGNhbGxiYWNrcyB0aGF0IG5lZWQgdG8gYmUgdXBkYXRlZCBmb3IgdGhpcyBuZXcgcGF0aFxuICAgICAgICAgICAgICBpZiAocmVuZGVyZXIuaGFzQW55Q2FsbGJhY2tVbmRlcihjaGlsZFBhdGgpKSB7XG4gICAgICAgICAgICAgICAgc3JjID0gcmViaW5kQ2FsbGJhY2tzSW5TdWJ0cmVlKHNyYywgY2hpbGRQYXRoLCByZW5kZXJlcik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgbmV4dENoaWxkcmVuLnB1c2goc3JjKTtcbiAgICAgICAgICAgICAgbmV4dFJldXNlID1cbiAgICAgICAgICAgICAgICByZXVzZUlkeCA8IHJldXNlSW5kaWNlcy5sZW5ndGggLSAxXG4gICAgICAgICAgICAgICAgICA/IHJldXNlSW5kaWNlc1srK3JldXNlSWR4XVxuICAgICAgICAgICAgICAgICAgOiAtMTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIE5vIG5lZWQgdG8gcmViaW5kIGNhbGxiYWNrcywgdGhlIG5vZGUgaGFzbid0IG1vdmVkXG4gICAgICAgICAgICAgIG5leHRDaGlsZHJlbi5wdXNoKHByZXZDaGlsZHJlbltpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFBhc3MgbnVsbCB0byByZXVzZSBwcmV2aW91cyBwcm9wc1xuICAgICAgICAgIHJldHVybiBjbG9uZUVsZW1lbnQoZWxlbWVudCwgbnVsbCEsIC4uLm5leHRDaGlsZHJlbik7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgW1B1bHNlIHJlbmRlcmVyXSBVbmtub3duIHVwZGF0ZSB0eXBlOiAke3VwZGF0ZVtcInR5cGVcIl19YFxuICAgICAgICAgICk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIG5ld1RyZWUgPSBkZXNjZW5kKG5ld1RyZWUsIDAsIFwiXCIpO1xuICB9XG4gIHJldHVybiBuZXdUcmVlO1xufVxuXG4vLyBUaGUgYGNvbXBvbmVudGAgcHJvcCBzaG91bGQgYmUgc29tZXRoaW5nIGxpa2UgYCgpID0+XG4vLyBpbXBvcnQoJ34vcGF0aC90by9jb21wb25lbnQnKSAod2UnbGwgbmVlZCB0byByZW1hcCBpZiB3ZSdyZSBpbXBvcnRpbmcgYSBuYW1lZCBleHBvcnQgYW5kIG5vdCB0aGUgZGVmYXVsdClcbmV4cG9ydCBmdW5jdGlvbiBSZW5kZXJMYXp5KFxuICBjb21wb25lbnQ6ICgpID0+IFByb21pc2U8eyBkZWZhdWx0OiBDb21wb25lbnRUeXBlPGFueT4gfT4sXG4gIGZhbGxiYWNrPzogUmVhY3QuUmVhY3ROb2RlXG4pOiBSZWFjdC5GQzxSZWFjdC5Qcm9wc1dpdGhDaGlsZHJlbjx1bmtub3duPj4ge1xuICBjb25zdCBDb21wb25lbnQgPSBsYXp5KGNvbXBvbmVudCk7XG4gIHJldHVybiAoeyBjaGlsZHJlbiwgLi4ucHJvcHMgfTogUmVhY3QuUHJvcHNXaXRoQ2hpbGRyZW48dW5rbm93bj4pID0+IHtcbiAgICByZXR1cm4gKFxuICAgICAgPFN1c3BlbnNlIGZhbGxiYWNrPXtmYWxsYmFjayA/PyA8PjwvPn0+XG4gICAgICAgIDxDb21wb25lbnQgey4uLnByb3BzfT57Y2hpbGRyZW59PC9Db21wb25lbnQ+XG4gICAgICA8L1N1c3BlbnNlPlxuICAgICk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGFzc2VydElzRWxlbWVudChcbiAgbm9kZTogUmVhY3QuUmVhY3ROb2RlLFxuICBwYXJ0czogc3RyaW5nW10sXG4gIGRlcHRoOiBudW1iZXJcbik6IG5vZGUgaXMgUmVhY3QuUmVhY3RFbGVtZW50IHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiAmJiAhaXNWYWxpZEVsZW1lbnQobm9kZSkpIHtcbiAgICBjb25zb2xlLmVycm9yKFwiSW52YWxpZCBub2RlOlwiLCBub2RlKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIG5vZGUgYXQgcGF0aCBcIiArIHBhcnRzLnNsaWNlKDAsIGRlcHRoKS5qb2luKFwiLlwiKSk7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8vIFJlYmluZCBjYWxsYmFjayBmdW5jdGlvbiBwcm9wcyB3aXRoaW4gYSBzdWJ0cmVlIGFmdGVyIGEgcGF0aC1jaGFuZ2luZyBtb3ZlXG5mdW5jdGlvbiByZWJpbmRDYWxsYmFja3NJblN1YnRyZWUoXG4gIG5vZGU6IFJlYWN0LlJlYWN0Tm9kZSxcbiAgcGF0aDogc3RyaW5nLFxuICByZW5kZXJlcjogVkRPTVJlbmRlcmVyXG4pOiBSZWFjdC5SZWFjdE5vZGUge1xuICBpZiAoIWlzVmFsaWRFbGVtZW50KG5vZGUpKSByZXR1cm4gbm9kZTtcbiAgY29uc3QgZWxlbWVudCA9IG5vZGUgYXMgUmVhY3QuUmVhY3RFbGVtZW50PFJlY29yZDxzdHJpbmcsIGFueT4gfCBudWxsPjtcbiAgY29uc3QgYmFzZVByb3BzID0gKGVsZW1lbnQucHJvcHMgPz8ge30pIGFzIFJlY29yZDxzdHJpbmcsIGFueT47XG4gIGNvbnN0IG5leHRQcm9wczogUmVjb3JkPHN0cmluZywgYW55PiA9IHsgLi4uYmFzZVByb3BzIH07XG5cbiAgLy8gUmViaW5kIG9ubHkgY2FsbGJhY2sgcHJvcHM7IENTUyByZWZzIGFyZSBwYXRoLWFnbm9zdGljIGFuZCByZW5kZXItcHJvcHNcbiAgLy8gYXJlIGhhbmRsZWQgYnkgdGhlIHNlcnZlci1zaWRlIHJlbmRlcmVyIHZpYSBleHBsaWNpdCB1cGRhdGVzXG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGJhc2VQcm9wcykpIHtcbiAgICBjb25zdCBwcm9wUGF0aCA9IHBhdGggPyBgJHtwYXRofS4ke2tleX1gIDoga2V5O1xuICAgIGlmIChyZW5kZXJlci5oYXNDYWxsYmFja1BhdGgocHJvcFBhdGgpKSB7XG4gICAgICBuZXh0UHJvcHNba2V5XSA9IHJlbmRlcmVyLmdldENhbGxiYWNrKHBhdGgsIGtleSk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHJlbmRlcmVyLmhhc1JlbmRlclByb3BQYXRoKHByb3BQYXRoKSAmJlxuICAgICAgcmVuZGVyZXIuaGFzQW55Q2FsbGJhY2tVbmRlcihwcm9wUGF0aClcbiAgICApIHtcbiAgICAgIG5leHRQcm9wc1trZXldID0gcmViaW5kQ2FsbGJhY2tzSW5TdWJ0cmVlKFxuICAgICAgICBiYXNlUHJvcHNba2V5XSxcbiAgICAgICAgcHJvcFBhdGgsXG4gICAgICAgIHJlbmRlcmVyXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGNoaWxkcmVuID0gZW5zdXJlQ2hpbGRyZW5BcnJheShlbGVtZW50KS5tYXAoKGNoaWxkLCBpZHgpID0+IHtcbiAgICBjb25zdCBjaGlsZFBhdGggPSBwYXRoID8gYCR7cGF0aH0uJHtpZHh9YCA6IFN0cmluZyhpZHgpO1xuICAgIGlmIChyZW5kZXJlci5oYXNBbnlDYWxsYmFja1VuZGVyKGNoaWxkUGF0aCkpIHtcbiAgICAgIHJldHVybiByZWJpbmRDYWxsYmFja3NJblN1YnRyZWUoY2hpbGQsIGNoaWxkUGF0aCwgcmVuZGVyZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gY2hpbGQ7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gY2xvbmVFbGVtZW50KGVsZW1lbnQsIG5leHRQcm9wcywgLi4uY2hpbGRyZW4pO1xufVxuXG4vLyBCaW5hcnktc2VhcmNoIGxvd2VyIGJvdW5kIGZvciBwcmVmaXggbWF0Y2hpbmcgb24gc29ydGVkIGNhbGxiYWNrIHBhdGhzXG5mdW5jdGlvbiBsb3dlckJvdW5kKGFycjogc3RyaW5nW10sIHRhcmdldDogc3RyaW5nKTogbnVtYmVyIHtcbiAgbGV0IGxvID0gMDtcbiAgbGV0IGhpID0gYXJyLmxlbmd0aDtcbiAgd2hpbGUgKGxvIDwgaGkpIHtcbiAgICBjb25zdCBtaWQgPSAobG8gKyBoaSkgPj4+IDE7XG4gICAgaWYgKGFyclttaWRdISA8IHRhcmdldCkge1xuICAgICAgbG8gPSBtaWQgKyAxO1xuICAgIH0gZWxzZSB7XG4gICAgICBoaSA9IG1pZDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGxvO1xufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IENvbXBvbmVudFR5cGUgfSBmcm9tIFwicmVhY3RcIjtcblxuLy8gU3BlY2lhbCBwcmVmaXhlcyBmb3IgcmVzZXJ2ZWQgbm9kZSB0eXBlc1xuZXhwb3J0IGNvbnN0IEZSQUdNRU5UX1RBRyA9IFwiJCRmcmFnbWVudFwiO1xuZXhwb3J0IGNvbnN0IE1PVU5UX1BPSU5UX1BSRUZJWCA9IFwiJCRcIjtcblxuLy8gZXhwb3J0IHR5cGUgTGF6eUNvbXBvbmVudCA9ICgpID0+IFByb21pc2U8eyBkZWZhdWx0OiBDb21wb25lbnRUeXBlPGFueT4gfT47XG5leHBvcnQgdHlwZSBSZWdpc3RyeUVudHJ5ID0gQ29tcG9uZW50VHlwZTxhbnk+O1xuZXhwb3J0IHR5cGUgQ29tcG9uZW50UmVnaXN0cnkgPSBSZWNvcmQ8c3RyaW5nLCBDb21wb25lbnRUeXBlPGFueT4+O1xuXG5leHBvcnQgaW50ZXJmYWNlIFZET01FbGVtZW50IHtcbiAgdGFnOiBzdHJpbmc7XG4gIHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgY2hpbGRyZW4/OiBWRE9NTm9kZVtdO1xuICBrZXk/OiBzdHJpbmc7XG4gIGxhenk/OiBib29sZWFuO1xufVxuXG4vLyBQcmltaXRpdmUgbm9kZXMgdGhhdCBjYW4gYmUgcmVuZGVyZWRcbmV4cG9ydCB0eXBlIFByaW1pdGl2ZU5vZGUgPSBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuO1xuXG4vLyBWRE9NTm9kZSBpcyBlaXRoZXIgYSBwcmltaXRpdmUgKHN0cmluZywgbnVtYmVyLCBib29sZWFuKSBvciBhbiBlbGVtZW50IG5vZGUuXG4vLyBCb29sZWFucyBhcmUgdmFsaWQgY2hpbGRyZW4gaW4gUmVhY3QgYnV0IGRvIG5vdCByZW5kZXIgYW55dGhpbmcuXG4vLyBNb3VudCBwb2ludHMgYXJlIGp1c3QgVUlFbGVtZW50Tm9kZXMgd2l0aCB0YWdzIHN0YXJ0aW5nIHdpdGggJCRDb21wb25lbnRLZXlcbmV4cG9ydCB0eXBlIFZET01Ob2RlID0gUHJpbWl0aXZlTm9kZSB8IFZET01FbGVtZW50O1xuXG5leHBvcnQgdHlwZSBWRE9NID0gVkRPTU5vZGU7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVkRPTVVwZGF0ZUJhc2Uge1xuICB0eXBlOiBzdHJpbmc7XG4gIHBhdGg6IHN0cmluZzsgLy8gRG90LXNlcGFyYXRlZCBwYXRoIHRvIHRoZSBub2RlXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW5zZXJ0VXBkYXRlIGV4dGVuZHMgVkRPTVVwZGF0ZUJhc2Uge1xuICB0eXBlOiBcImluc2VydFwiO1xuICBkYXRhOiBWRE9NTm9kZTsgLy8gVGhlIG5vZGUgdG8gaW5zZXJ0XG4gIGlkeDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlbW92ZVVwZGF0ZSBleHRlbmRzIFZET01VcGRhdGVCYXNlIHtcbiAgdHlwZTogXCJyZW1vdmVcIjtcbiAgaWR4OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVwbGFjZVVwZGF0ZSBleHRlbmRzIFZET01VcGRhdGVCYXNlIHtcbiAgdHlwZTogXCJyZXBsYWNlXCI7XG4gIGRhdGE6IFZET01Ob2RlOyAvLyBUaGUgbmV3IG5vZGVcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVQcm9wc1VwZGF0ZSBleHRlbmRzIFZET01VcGRhdGVCYXNlIHtcbiAgdHlwZTogXCJ1cGRhdGVfcHJvcHNcIjtcbiAgZGF0YToge1xuICAgIHNldD86IFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgcmVtb3ZlPzogc3RyaW5nW107XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW92ZVVwZGF0ZSBleHRlbmRzIFZET01VcGRhdGVCYXNlIHtcbiAgdHlwZTogXCJtb3ZlXCI7XG4gIGRhdGE6IHtcbiAgICBmcm9tX2luZGV4OiBudW1iZXI7XG4gICAgdG9faW5kZXg6IG51bWJlcjtcbiAgfTtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgUmVjb25jaWxpYXRpb25VcGRhdGUge1xuICB0eXBlOiBcInJlY29uY2lsaWF0aW9uXCI7XG4gIHBhdGg6IHN0cmluZztcbiAgTjogbnVtYmVyO1xuICBuZXc6IFtudW1iZXJbXSwgVkRPTVtdXTtcbiAgcmV1c2U6IFtudW1iZXJbXSwgbnVtYmVyW11dO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBhdGhEZWx0YSB7XG4gIGFkZD86IHN0cmluZ1tdO1xuICByZW1vdmU/OiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVDYWxsYmFja3NVcGRhdGUgZXh0ZW5kcyBWRE9NVXBkYXRlQmFzZSB7XG4gIHR5cGU6IFwidXBkYXRlX2NhbGxiYWNrc1wiO1xuICBkYXRhOiBQYXRoRGVsdGE7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlUmVuZGVyUHJvcHNVcGRhdGUgZXh0ZW5kcyBWRE9NVXBkYXRlQmFzZSB7XG4gIHR5cGU6IFwidXBkYXRlX3JlbmRlcl9wcm9wc1wiO1xuICBkYXRhOiBQYXRoRGVsdGE7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlQ3NzUmVmc1VwZGF0ZSBleHRlbmRzIFZET01VcGRhdGVCYXNlIHtcbiAgdHlwZTogXCJ1cGRhdGVfY3NzX3JlZnNcIjtcbiAgZGF0YTogUGF0aERlbHRhO1xufVxuXG5leHBvcnQgdHlwZSBWRE9NVXBkYXRlID1cbiAgLy8gfCBJbnNlcnRVcGRhdGVcbiAgLy8gfCBSZW1vdmVVcGRhdGVcbiAgfCBSZXBsYWNlVXBkYXRlXG4gIHwgVXBkYXRlUHJvcHNVcGRhdGVcbiAgLy8gfCBNb3ZlVXBkYXRlXG4gIHwgUmVjb25jaWxpYXRpb25VcGRhdGVcbiAgfCBVcGRhdGVDYWxsYmFja3NVcGRhdGVcbiAgfCBVcGRhdGVSZW5kZXJQcm9wc1VwZGF0ZVxuICB8IFVwZGF0ZUNzc1JlZnNVcGRhdGU7XG5cbmV4cG9ydCB0eXBlIFVwZGF0ZVR5cGUgPSBWRE9NVXBkYXRlW1widHlwZVwiXTtcblxuLy8gVXRpbGl0eSBmdW5jdGlvbnMgZm9yIHdvcmtpbmcgd2l0aCB0aGUgVUkgdHJlZSBzdHJ1Y3R1cmVcbmV4cG9ydCBmdW5jdGlvbiBpc0VsZW1lbnROb2RlKG5vZGU6IFZET01Ob2RlKTogbm9kZSBpcyBWRE9NRWxlbWVudCB7XG4gIC8vIE1hdGNoZXMgYWxsIG5vbi10ZXh0IG5vZGVzXG4gIHJldHVybiB0eXBlb2Ygbm9kZSA9PT0gXCJvYmplY3RcIiAmJiBub2RlICE9PSBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNNb3VudFBvaW50Tm9kZShub2RlOiBWRE9NTm9kZSk6IG5vZGUgaXMgVkRPTUVsZW1lbnQge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiBub2RlID09PSBcIm9iamVjdFwiICYmXG4gICAgbm9kZSAhPT0gbnVsbCAmJlxuICAgIG5vZGUudGFnLnN0YXJ0c1dpdGgoTU9VTlRfUE9JTlRfUFJFRklYKSAmJlxuICAgIG5vZGUudGFnICE9PSBGUkFHTUVOVF9UQUdcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVGV4dE5vZGUobm9kZTogVkRPTU5vZGUpOiBub2RlIGlzIHN0cmluZyB7XG4gIHJldHVybiB0eXBlb2Ygbm9kZSA9PT0gXCJzdHJpbmdcIjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRnJhZ21lbnQobm9kZTogVkRPTU5vZGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiBub2RlID09PSBcIm9iamVjdFwiICYmIG5vZGUgIT09IG51bGwgJiYgbm9kZS50YWcgPT09IEZSQUdNRU5UX1RBRztcbn1cbiIsCiAgICAiXG50eXBlIFNpbXBsaWZ5PFQ+ID0geyBbSyBpbiBrZXlvZiBUXTogVFtLXSB9ICYge307XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFeHRyYWN0b3I8VCBleHRlbmRzIG9iamVjdD4oKSB7XG4gIGZ1bmN0aW9uIF9jcmVhdGVFeHRyYWN0b3I8XG4gICAgY29uc3QgSyBleHRlbmRzIHJlYWRvbmx5IChrZXlvZiBUKVtdLFxuICAgIEMgZXh0ZW5kcyBQYXJ0aWFsPFJlY29yZDxLW251bWJlcl0gfCBzdHJpbmcsIChzcmM6IFQpID0+IGFueT4+LFxuICA+KGtleXM6IEssIGNvbXB1dGVkPzogQykge1xuICAgIHJldHVybiAoXG4gICAgICBzcmM6IFRcbiAgICApOiBTaW1wbGlmeTxcbiAgICAgIFBpY2s8VCwgS1tudW1iZXJdPiAmIHtcbiAgICAgICAgW1AgaW4ga2V5b2YgQ10tPzogQ1tQXSBleHRlbmRzICguLi5hcmdzOiBhbnkpID0+IGluZmVyIFIgPyBSIDogbmV2ZXI7XG4gICAgICB9XG4gICAgPiA9PiB7XG4gICAgICBjb25zdCBvdXQ6IGFueSA9IHt9O1xuICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgICBvdXRba2V5IGFzIHN0cmluZ10gPSAoc3JjIGFzIGFueSlba2V5IGFzIHN0cmluZ107XG4gICAgICB9XG4gICAgICBpZiAoY29tcHV0ZWQpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gY29tcHV0ZWQpIHtcbiAgICAgICAgICBjb25zdCBmbiA9IGNvbXB1dGVkW2tleV0hO1xuICAgICAgICAgIG91dFtrZXldID0gZm4oc3JjKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG91dDtcbiAgICB9O1xuICB9XG4gIHJldHVybiBfY3JlYXRlRXh0cmFjdG9yO1xufSIsCiAgICAiaW1wb3J0IHsgY3JlYXRlRXh0cmFjdG9yIH0gZnJvbSBcIi4vZXh0cmFjdG9yXCI7XG5cbi8vIEJhc2UgZXh0cmFjdG9ycyAoY2FtZWxDYXNlKSBzaW1pbGFyIHRvIGV2ZW50cy50cyBzdHlsZVxuY29uc3QgbG93ZXJUYWdOYW1lID0gKGU6IEVsZW1lbnQpID0+IGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG5jb25zdCBFTEVNRU5UX0tFWVMgPSBbXG4gIFwiaWRcIixcbiAgXCJjbGFzc05hbWVcIixcbiAgXCJ0YWdOYW1lXCIsXG4gIFwibG9jYWxOYW1lXCIsXG4gIFwiY2xpZW50SGVpZ2h0XCIsXG4gIFwiY2xpZW50TGVmdFwiLFxuICBcImNsaWVudFRvcFwiLFxuICBcImNsaWVudFdpZHRoXCIsXG4gIFwic2Nyb2xsSGVpZ2h0XCIsXG4gIFwic2Nyb2xsTGVmdFwiLFxuICBcInNjcm9sbFRvcFwiLFxuICBcInNjcm9sbFdpZHRoXCIsXG4gIFwic2xvdFwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEVsZW1lbnQpW107XG5cbmNvbnN0IEhUTUxfT1JfU1ZHX0tFWVMgPSBbXG4gIFwiYXV0b2ZvY3VzXCIsXG4gIFwidGFiSW5kZXhcIixcbiAgXCJub25jZVwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxPclNWR0VsZW1lbnQpW107XG5cbmNvbnN0IEhUTUxfRUxFTUVOVF9CQVNFX0tFWVMgPSBbXG4gIFwiYWNjZXNzS2V5XCIsXG4gIFwiYWNjZXNzS2V5TGFiZWxcIixcbiAgXCJhdXRvY2FwaXRhbGl6ZVwiLFxuICBcImRpclwiLFxuICBcImRyYWdnYWJsZVwiLFxuICBcImhpZGRlblwiLFxuICBcImluZXJ0XCIsXG4gIFwibGFuZ1wiLFxuICBcIm9mZnNldEhlaWdodFwiLFxuICBcIm9mZnNldExlZnRcIixcbiAgXCJvZmZzZXRUb3BcIixcbiAgXCJvZmZzZXRXaWR0aFwiLFxuICBcInBvcG92ZXJcIixcbiAgXCJzcGVsbGNoZWNrXCIsXG4gIFwidGl0bGVcIixcbiAgXCJ0cmFuc2xhdGVcIixcbiAgXCJ3cml0aW5nU3VnZ2VzdGlvbnNcIixcbiAgXCJjb250ZW50RWRpdGFibGVcIixcbiAgXCJlbnRlcktleUhpbnRcIixcbiAgXCJpc0NvbnRlbnRFZGl0YWJsZVwiLFxuICBcImlucHV0TW9kZVwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxFbGVtZW50KVtdO1xuXG5jb25zdCBleHRyYWN0RWxlbWVudCA9IGNyZWF0ZUV4dHJhY3RvcjxFbGVtZW50PigpKEVMRU1FTlRfS0VZUywge1xuICB0YWdOYW1lOiBsb3dlclRhZ05hbWUsXG59KTtcblxuY29uc3QgZXh0cmFjdEhUTUxPclNWR0VsZW1lbnQgPVxuICBjcmVhdGVFeHRyYWN0b3I8SFRNTE9yU1ZHRWxlbWVudD4oKShIVE1MX09SX1NWR19LRVlTKTtcblxuY29uc3QgZXh0cmFjdEhUTUxFbGVtZW50QmFzZU9ubHkgPSBjcmVhdGVFeHRyYWN0b3I8SFRNTEVsZW1lbnQ+KCkoXG4gIEhUTUxfRUxFTUVOVF9CQVNFX0tFWVNcbik7XG5cbmZ1bmN0aW9uIGV4dHJhY3RIVE1MRWxlbWVudEJhc2UoZWx0OiBIVE1MRWxlbWVudCkge1xuICByZXR1cm4ge1xuICAgIC4uLmV4dHJhY3RFbGVtZW50KGVsdCksXG4gICAgLi4uZXh0cmFjdEhUTUxPclNWR0VsZW1lbnQoZWx0IGFzIEhUTUxPclNWR0VsZW1lbnQpLFxuICAgIC4uLmV4dHJhY3RIVE1MRWxlbWVudEJhc2VPbmx5KGVsdCksXG4gIH07XG59XG5cbi8vIEhlbHBlciB0byBjb21wb3NlIHBlci1lbGVtZW50IGV4dHJhY3RvcnMgd2l0aCB0aGUgc2hhcmVkIGJhc2VcbmZ1bmN0aW9uIHdpdGhCYXNlPFQgZXh0ZW5kcyBIVE1MRWxlbWVudD4oXG4gIGtleXM6IHJlYWRvbmx5IChrZXlvZiBUKVtdLFxuICBjb21wdXRlZD86IFBhcnRpYWw8UmVjb3JkPHN0cmluZywgKHNyYzogVCkgPT4gYW55Pj5cbikge1xuICBjb25zdCBvbmx5ID0gY3JlYXRlRXh0cmFjdG9yPFQ+KCkoa2V5cywgY29tcHV0ZWQgYXMgYW55KTtcbiAgcmV0dXJuIChlbHQ6IFQpID0+ICh7IC4uLmV4dHJhY3RIVE1MRWxlbWVudEJhc2UoZWx0KSwgLi4ub25seShlbHQpIH0pO1xufVxuXG5jb25zdCBIVE1MX0FOQ0hPUl9LRVlTID0gW1xuICBcImhhc2hcIixcbiAgXCJob3N0XCIsXG4gIFwiaG9zdG5hbWVcIixcbiAgXCJocmVmXCIsXG4gIFwib3JpZ2luXCIsXG4gIFwicGFzc3dvcmRcIixcbiAgXCJwYXRobmFtZVwiLFxuICBcInBvcnRcIixcbiAgXCJwcm90b2NvbFwiLFxuICBcInNlYXJjaFwiLFxuICBcInRhcmdldFwiLFxuICBcImRvd25sb2FkXCIsXG4gIFwicmVsXCIsXG4gIFwiaHJlZmxhbmdcIixcbiAgXCJ0eXBlXCIsXG4gIFwidXNlcm5hbWVcIixcbiAgXCJwaW5nXCIsXG4gIFwicmVmZXJyZXJQb2xpY3lcIixcbiAgXCJ0ZXh0XCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTEFuY2hvckVsZW1lbnQpW107XG5jb25zdCBhbmNob3JFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MQW5jaG9yRWxlbWVudD4oSFRNTF9BTkNIT1JfS0VZUyk7XG5cbmNvbnN0IEhUTUxfQVJFQV9LRVlTID0gW1xuICBcImFsdFwiLFxuICBcImNvb3Jkc1wiLFxuICBcImRvd25sb2FkXCIsXG4gIFwiaGFzaFwiLFxuICBcImhvc3RcIixcbiAgXCJob3N0bmFtZVwiLFxuICBcImhyZWZcIixcbiAgXCJvcmlnaW5cIixcbiAgXCJwYXNzd29yZFwiLFxuICBcInBhdGhuYW1lXCIsXG4gIFwicG9ydFwiLFxuICBcInByb3RvY29sXCIsXG4gIFwicmVsXCIsXG4gIFwic2VhcmNoXCIsXG4gIFwic2hhcGVcIixcbiAgXCJ0YXJnZXRcIixcbiAgXCJ1c2VybmFtZVwiLFxuICBcInBpbmdcIixcbiAgXCJyZWZlcnJlclBvbGljeVwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxBcmVhRWxlbWVudClbXTtcbmNvbnN0IGFyZWFFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MQXJlYUVsZW1lbnQ+KEhUTUxfQVJFQV9LRVlTKTtcblxuY29uc3QgSFRNTF9NRURJQV9LRVlTID0gW1xuICBcImF1dG9wbGF5XCIsXG4gIFwiY29udHJvbHNcIixcbiAgXCJjcm9zc09yaWdpblwiLFxuICBcImN1cnJlbnRTcmNcIixcbiAgXCJjdXJyZW50VGltZVwiLFxuICBcImRlZmF1bHRNdXRlZFwiLFxuICBcImRlZmF1bHRQbGF5YmFja1JhdGVcIixcbiAgXCJkdXJhdGlvblwiLFxuICBcImVuZGVkXCIsXG4gIFwibG9vcFwiLFxuICBcIm11dGVkXCIsXG4gIFwibmV0d29ya1N0YXRlXCIsXG4gIFwicGF1c2VkXCIsXG4gIFwicGxheWJhY2tSYXRlXCIsXG4gIFwicHJlbG9hZFwiLFxuICBcInJlYWR5U3RhdGVcIixcbiAgXCJzZWVraW5nXCIsXG4gIFwic3JjXCIsXG4gIFwidm9sdW1lXCIsXG4gIFwicHJlc2VydmVzUGl0Y2hcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MTWVkaWFFbGVtZW50KVtdO1xuY29uc3QgbWVkaWFFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MTWVkaWFFbGVtZW50PihIVE1MX01FRElBX0tFWVMpO1xuXG5jb25zdCBhdWRpb0V4dHJhY3RvciA9IChlbHQ6IEhUTUxBdWRpb0VsZW1lbnQpID0+IG1lZGlhRXh0cmFjdG9yKGVsdCk7XG5cbmNvbnN0IEhUTUxfQlVUVE9OX0tFWVMgPSBbXG4gIFwiZGlzYWJsZWRcIixcbiAgXCJuYW1lXCIsXG4gIFwidHlwZVwiLFxuICBcInZhbHVlXCIsXG4gIFwiZm9ybUFjdGlvblwiLFxuICBcImZvcm1FbmN0eXBlXCIsXG4gIFwiZm9ybU1ldGhvZFwiLFxuICBcImZvcm1Ob1ZhbGlkYXRlXCIsXG4gIFwiZm9ybVRhcmdldFwiLFxuICBcInBvcG92ZXJUYXJnZXRBY3Rpb25cIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MQnV0dG9uRWxlbWVudClbXTtcbmNvbnN0IGJ1dHRvbkV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxCdXR0b25FbGVtZW50PihIVE1MX0JVVFRPTl9LRVlTKTtcblxuY29uc3QgSFRNTF9EQVRBX0tFWVMgPSBbXG4gIFwidmFsdWVcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MRGF0YUVsZW1lbnQpW107XG5jb25zdCBkYXRhRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTERhdGFFbGVtZW50PihIVE1MX0RBVEFfS0VZUyk7XG5cbmNvbnN0IEhUTUxfRU1CRURfS0VZUyA9IFtcbiAgXCJoZWlnaHRcIixcbiAgXCJzcmNcIixcbiAgXCJ0eXBlXCIsXG4gIFwid2lkdGhcIixcbiAgXCJhbGlnblwiLFxuICBcIm5hbWVcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MRW1iZWRFbGVtZW50KVtdO1xuY29uc3QgZW1iZWRFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MRW1iZWRFbGVtZW50PihIVE1MX0VNQkVEX0tFWVMpO1xuXG5jb25zdCBIVE1MX0ZJRUxEU0VUX0tFWVMgPSBbXG4gIFwiZGlzYWJsZWRcIixcbiAgXCJuYW1lXCIsXG4gIFwidHlwZVwiLFxuICBcInZhbGlkYXRpb25NZXNzYWdlXCIsXG4gIFwid2lsbFZhbGlkYXRlXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTEZpZWxkU2V0RWxlbWVudClbXTtcbmNvbnN0IGZpZWxkc2V0RXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTEZpZWxkU2V0RWxlbWVudD4oSFRNTF9GSUVMRFNFVF9LRVlTKTtcblxuY29uc3QgSFRNTF9GT1JNX0tFWVMgPSBbXG4gIFwiYWNjZXB0Q2hhcnNldFwiLFxuICBcImFjdGlvblwiLFxuICBcImF1dG9jb21wbGV0ZVwiLFxuICBcImVuY29kaW5nXCIsXG4gIFwiZW5jdHlwZVwiLFxuICBcImxlbmd0aFwiLFxuICBcIm1ldGhvZFwiLFxuICBcIm5hbWVcIixcbiAgXCJub1ZhbGlkYXRlXCIsXG4gIFwidGFyZ2V0XCIsXG4gIFwicmVsXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTEZvcm1FbGVtZW50KVtdO1xuY29uc3QgZm9ybUV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxGb3JtRWxlbWVudD4oSFRNTF9GT1JNX0tFWVMpO1xuXG5jb25zdCBIVE1MX0lGUkFNRV9LRVlTID0gW1xuICBcImFsbG93XCIsXG4gIFwiYWxsb3dGdWxsc2NyZWVuXCIsXG4gIFwiaGVpZ2h0XCIsXG4gIFwibmFtZVwiLFxuICBcInJlZmVycmVyUG9saWN5XCIsXG4gIFwic3JjXCIsXG4gIFwic3JjZG9jXCIsXG4gIFwid2lkdGhcIixcbiAgXCJhbGlnblwiLFxuICBcImZyYW1lQm9yZGVyXCIsXG4gIFwibG9uZ0Rlc2NcIixcbiAgXCJtYXJnaW5IZWlnaHRcIixcbiAgXCJtYXJnaW5XaWR0aFwiLFxuICBcInNjcm9sbGluZ1wiLFxuICBcInNhbmRib3hcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MSUZyYW1lRWxlbWVudClbXTtcbmNvbnN0IGlmcmFtZUV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxJRnJhbWVFbGVtZW50PihIVE1MX0lGUkFNRV9LRVlTKTtcblxuY29uc3QgSFRNTF9JTUFHRV9LRVlTID0gW1xuICBcImFsdFwiLFxuICBcImNyb3NzT3JpZ2luXCIsXG4gIFwiZGVjb2RpbmdcIixcbiAgXCJoZWlnaHRcIixcbiAgXCJpc01hcFwiLFxuICBcImxvYWRpbmdcIixcbiAgXCJuYXR1cmFsSGVpZ2h0XCIsXG4gIFwibmF0dXJhbFdpZHRoXCIsXG4gIFwicmVmZXJyZXJQb2xpY3lcIixcbiAgXCJzaXplc1wiLFxuICBcInNyY1wiLFxuICBcInNyY3NldFwiLFxuICBcInVzZU1hcFwiLFxuICBcIndpZHRoXCIsXG4gIFwiYWxpZ25cIixcbiAgXCJib3JkZXJcIixcbiAgXCJjb21wbGV0ZVwiLFxuICBcImhzcGFjZVwiLFxuICBcImxvbmdEZXNjXCIsXG4gIFwibG93c3JjXCIsXG4gIFwibmFtZVwiLFxuICBcInZzcGFjZVwiLFxuICBcInhcIixcbiAgXCJ5XCIsXG4gIFwiZmV0Y2hQcmlvcml0eVwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxJbWFnZUVsZW1lbnQpW107XG5jb25zdCBpbWFnZUV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxJbWFnZUVsZW1lbnQ+KEhUTUxfSU1BR0VfS0VZUyk7XG5cbmNvbnN0IEhUTUxfSU5QVVRfS0VZUyA9IFtcbiAgXCJhY2NlcHRcIixcbiAgXCJhbHRcIixcbiAgXCJhdXRvY29tcGxldGVcIixcbiAgXCJjaGVja2VkXCIsXG4gIFwiZGVmYXVsdENoZWNrZWRcIixcbiAgXCJkZWZhdWx0VmFsdWVcIixcbiAgXCJkaXJOYW1lXCIsXG4gIFwiZGlzYWJsZWRcIixcbiAgXCJoZWlnaHRcIixcbiAgXCJpbmRldGVybWluYXRlXCIsXG4gIFwibWF4XCIsXG4gIFwibWF4TGVuZ3RoXCIsXG4gIFwibWluXCIsXG4gIFwibWluTGVuZ3RoXCIsXG4gIFwibXVsdGlwbGVcIixcbiAgXCJuYW1lXCIsXG4gIFwicGF0dGVyblwiLFxuICBcInBsYWNlaG9sZGVyXCIsXG4gIFwicmVhZE9ubHlcIixcbiAgXCJyZXF1aXJlZFwiLFxuICBcInNlbGVjdGlvbkRpcmVjdGlvblwiLFxuICBcInNlbGVjdGlvbkVuZFwiLFxuICBcInNlbGVjdGlvblN0YXJ0XCIsXG4gIFwic2l6ZVwiLFxuICBcInNyY1wiLFxuICBcInN0ZXBcIixcbiAgXCJ0eXBlXCIsXG4gIFwidmFsdWVcIixcbiAgXCJ2YWx1ZUFzTnVtYmVyXCIsXG4gIFwid2lkdGhcIixcbiAgXCJhbGlnblwiLFxuICBcImNhcHR1cmVcIixcbiAgXCJmb3JtQWN0aW9uXCIsXG4gIFwiZm9ybUVuY3R5cGVcIixcbiAgXCJmb3JtTWV0aG9kXCIsXG4gIFwiZm9ybU5vVmFsaWRhdGVcIixcbiAgXCJmb3JtVGFyZ2V0XCIsXG4gIFwidXNlTWFwXCIsXG4gIFwidmFsaWRhdGlvbk1lc3NhZ2VcIixcbiAgXCJ3aWxsVmFsaWRhdGVcIixcbiAgXCJwb3BvdmVyVGFyZ2V0QWN0aW9uXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTElucHV0RWxlbWVudClbXTtcbmNvbnN0IGlucHV0RXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTElucHV0RWxlbWVudD4oSFRNTF9JTlBVVF9LRVlTKTtcblxuY29uc3QgSFRNTF9MQUJFTF9LRVlTID0gW1xuICBcImh0bWxGb3JcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MTGFiZWxFbGVtZW50KVtdO1xuY29uc3QgbGFiZWxFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MTGFiZWxFbGVtZW50PihIVE1MX0xBQkVMX0tFWVMpO1xuXG5jb25zdCBIVE1MX0xJX0tFWVMgPSBbXG4gIFwidmFsdWVcIixcbiAgXCJ0eXBlXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTExJRWxlbWVudClbXTtcbmNvbnN0IGxpRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTExJRWxlbWVudD4oSFRNTF9MSV9LRVlTKTtcblxuY29uc3QgSFRNTF9MSU5LX0tFWVMgPSBbXG4gIFwiYXNcIixcbiAgXCJjcm9zc09yaWdpblwiLFxuICBcImRpc2FibGVkXCIsXG4gIFwiZmV0Y2hQcmlvcml0eVwiLFxuICBcImhyZWZcIixcbiAgXCJocmVmbGFuZ1wiLFxuICBcImltYWdlU2l6ZXNcIixcbiAgXCJpbWFnZVNyY3NldFwiLFxuICBcImludGVncml0eVwiLFxuICBcIm1lZGlhXCIsXG4gIFwicmVmZXJyZXJQb2xpY3lcIixcbiAgXCJyZWxcIixcbiAgXCJ0eXBlXCIsXG4gIFwiY2hhcnNldFwiLFxuICBcInJldlwiLFxuICBcInRhcmdldFwiLFxuICBcInNpemVzXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTExpbmtFbGVtZW50KVtdO1xuY29uc3QgbGlua0V4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxMaW5rRWxlbWVudD4oSFRNTF9MSU5LX0tFWVMpO1xuXG5jb25zdCBIVE1MX01BUF9LRVlTID0gW1xuICBcIm5hbWVcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MTWFwRWxlbWVudClbXTtcbmNvbnN0IG1hcEV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxNYXBFbGVtZW50PihIVE1MX01BUF9LRVlTKTtcblxuY29uc3QgSFRNTF9NRVRFUl9LRVlTID0gW1xuICBcImhpZ2hcIixcbiAgXCJsb3dcIixcbiAgXCJtYXhcIixcbiAgXCJtaW5cIixcbiAgXCJvcHRpbXVtXCIsXG4gIFwidmFsdWVcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MTWV0ZXJFbGVtZW50KVtdO1xuY29uc3QgbWV0ZXJFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MTWV0ZXJFbGVtZW50PihIVE1MX01FVEVSX0tFWVMpO1xuXG5jb25zdCBIVE1MX01PRF9LRVlTID0gW1xuICBcImNpdGVcIixcbiAgXCJkYXRlVGltZVwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxNb2RFbGVtZW50KVtdO1xuY29uc3QgbW9kRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTE1vZEVsZW1lbnQ+KEhUTUxfTU9EX0tFWVMpO1xuXG5jb25zdCBIVE1MX09MX0tFWVMgPSBbXG4gIFwicmV2ZXJzZWRcIixcbiAgXCJzdGFydFwiLFxuICBcInR5cGVcIixcbiAgXCJjb21wYWN0XCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTE9MaXN0RWxlbWVudClbXTtcbmNvbnN0IG9saXN0RXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTE9MaXN0RWxlbWVudD4oSFRNTF9PTF9LRVlTKTtcblxuY29uc3QgSFRNTF9PQkpFQ1RfS0VZUyA9IFtcbiAgXCJkYXRhXCIsXG4gIFwiaGVpZ2h0XCIsXG4gIFwibmFtZVwiLFxuICBcInR5cGVcIixcbiAgXCJ1c2VNYXBcIixcbiAgXCJ3aWR0aFwiLFxuICBcInZhbGlkYXRpb25NZXNzYWdlXCIsXG4gIFwid2lsbFZhbGlkYXRlXCIsXG4gIFwiYWxpZ25cIixcbiAgXCJhcmNoaXZlXCIsXG4gIFwiYm9yZGVyXCIsXG4gIFwiY29kZVwiLFxuICBcImNvZGVCYXNlXCIsXG4gIFwiY29kZVR5cGVcIixcbiAgXCJkZWNsYXJlXCIsXG4gIFwiaHNwYWNlXCIsXG4gIFwic3RhbmRieVwiLFxuICBcInZzcGFjZVwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxPYmplY3RFbGVtZW50KVtdO1xuY29uc3Qgb2JqZWN0RXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTE9iamVjdEVsZW1lbnQ+KEhUTUxfT0JKRUNUX0tFWVMpO1xuXG5jb25zdCBIVE1MX09QVEdST1VQX0tFWVMgPSBbXG4gIFwiZGlzYWJsZWRcIixcbiAgXCJsYWJlbFwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxPcHRHcm91cEVsZW1lbnQpW107XG5jb25zdCBvcHRncm91cEV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxPcHRHcm91cEVsZW1lbnQ+KEhUTUxfT1BUR1JPVVBfS0VZUyk7XG5cbmNvbnN0IEhUTUxfT1BUSU9OX0tFWVMgPSBbXG4gIFwiZGVmYXVsdFNlbGVjdGVkXCIsXG4gIFwiZGlzYWJsZWRcIixcbiAgXCJpbmRleFwiLFxuICBcImxhYmVsXCIsXG4gIFwic2VsZWN0ZWRcIixcbiAgXCJ0ZXh0XCIsXG4gIFwidmFsdWVcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MT3B0aW9uRWxlbWVudClbXTtcbmNvbnN0IG9wdGlvbkV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxPcHRpb25FbGVtZW50PihIVE1MX09QVElPTl9LRVlTKTtcblxuY29uc3QgSFRNTF9PVVRQVVRfS0VZUyA9IFtcbiAgXCJkZWZhdWx0VmFsdWVcIixcbiAgXCJuYW1lXCIsXG4gIFwidHlwZVwiLFxuICBcInZhbHVlXCIsXG4gIFwiaHRtbEZvclwiLFxuICBcInZhbGlkYXRpb25NZXNzYWdlXCIsXG4gIFwid2lsbFZhbGlkYXRlXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTE91dHB1dEVsZW1lbnQpW107XG5jb25zdCBvdXRwdXRFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MT3V0cHV0RWxlbWVudD4oSFRNTF9PVVRQVVRfS0VZUyk7XG5cbmNvbnN0IEhUTUxfUFJPR1JFU1NfS0VZUyA9IFtcbiAgXCJtYXhcIixcbiAgXCJwb3NpdGlvblwiLFxuICBcInZhbHVlXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTFByb2dyZXNzRWxlbWVudClbXTtcbmNvbnN0IHByb2dyZXNzRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTFByb2dyZXNzRWxlbWVudD4oSFRNTF9QUk9HUkVTU19LRVlTKTtcblxuY29uc3QgSFRNTF9RVU9URV9LRVlTID0gW1xuICBcImNpdGVcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MUXVvdGVFbGVtZW50KVtdO1xuY29uc3QgcXVvdGVFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MUXVvdGVFbGVtZW50PihIVE1MX1FVT1RFX0tFWVMpO1xuXG5jb25zdCBjaXRlRXh0cmFjdG9yID0gKGVsdDogSFRNTEVsZW1lbnQpID0+IGV4dHJhY3RIVE1MRWxlbWVudEJhc2UoZWx0KTtcblxuY29uc3QgSFRNTF9TQ1JJUFRfS0VZUyA9IFtcbiAgXCJhc3luY1wiLFxuICBcImNyb3NzT3JpZ2luXCIsXG4gIFwiZGVmZXJcIixcbiAgXCJmZXRjaFByaW9yaXR5XCIsXG4gIFwiaW50ZWdyaXR5XCIsXG4gIFwibm9Nb2R1bGVcIixcbiAgXCJyZWZlcnJlclBvbGljeVwiLFxuICBcInNyY1wiLFxuICBcInRleHRcIixcbiAgXCJ0eXBlXCIsXG4gIFwiY2hhcnNldFwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxTY3JpcHRFbGVtZW50KVtdO1xuY29uc3QgZXh0cmFjdEhUTUxTY3JpcHRPbmx5ID0gY3JlYXRlRXh0cmFjdG9yPEhUTUxTY3JpcHRFbGVtZW50PigpKFxuICBIVE1MX1NDUklQVF9LRVlTLFxuICB7XG4gICAgZXZlbnQ6IChzKSA9PiAocyBhcyBhbnkpLmV2ZW50LFxuICAgIGh0bWxGb3I6IChzKSA9PiAocyBhcyBhbnkpLmh0bWxGb3IsXG4gIH1cbik7XG5jb25zdCBzY3JpcHRFeHRyYWN0b3IgPSAoZWx0OiBIVE1MU2NyaXB0RWxlbWVudCkgPT4gKHtcbiAgLi4uZXh0cmFjdEhUTUxFbGVtZW50QmFzZShlbHQpLFxuICAuLi5leHRyYWN0SFRNTFNjcmlwdE9ubHkoZWx0KSxcbn0pO1xuXG5jb25zdCBIVE1MX1NFTEVDVF9LRVlTID0gW1xuICBcImF1dG9jb21wbGV0ZVwiLFxuICBcImRpc2FibGVkXCIsXG4gIFwibGVuZ3RoXCIsXG4gIFwibXVsdGlwbGVcIixcbiAgXCJuYW1lXCIsXG4gIFwicmVxdWlyZWRcIixcbiAgXCJzZWxlY3RlZEluZGV4XCIsXG4gIFwic2l6ZVwiLFxuICBcInR5cGVcIixcbiAgXCJ2YWx1ZVwiLFxuICBcInZhbGlkYXRpb25NZXNzYWdlXCIsXG4gIFwid2lsbFZhbGlkYXRlXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTFNlbGVjdEVsZW1lbnQpW107XG5jb25zdCBzZWxlY3RFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MU2VsZWN0RWxlbWVudD4oSFRNTF9TRUxFQ1RfS0VZUyk7XG5cbmNvbnN0IEhUTUxfU0xPVF9LRVlTID0gW1xuICBcIm5hbWVcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MU2xvdEVsZW1lbnQpW107XG5jb25zdCBzbG90RXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTFNsb3RFbGVtZW50PihIVE1MX1NMT1RfS0VZUyk7XG5cbmNvbnN0IEhUTUxfU09VUkNFX0tFWVMgPSBbXG4gIFwiaGVpZ2h0XCIsXG4gIFwibWVkaWFcIixcbiAgXCJzaXplc1wiLFxuICBcInNyY1wiLFxuICBcInNyY3NldFwiLFxuICBcInR5cGVcIixcbiAgXCJ3aWR0aFwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxTb3VyY2VFbGVtZW50KVtdO1xuY29uc3Qgc291cmNlRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTFNvdXJjZUVsZW1lbnQ+KEhUTUxfU09VUkNFX0tFWVMpO1xuXG5jb25zdCBIVE1MX1RBQkxFX0NBUFRJT05fS0VZUyA9IFtcbiAgXCJhbGlnblwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxUYWJsZUNhcHRpb25FbGVtZW50KVtdO1xuY29uc3QgdGFibGVDYXB0aW9uRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTFRhYmxlQ2FwdGlvbkVsZW1lbnQ+KFxuICBIVE1MX1RBQkxFX0NBUFRJT05fS0VZU1xuKTtcblxuY29uc3QgSFRNTF9UQUJMRV9DRUxMX0tFWVMgPSBbXG4gIFwiYWJiclwiLFxuICBcImNlbGxJbmRleFwiLFxuICBcImNvbFNwYW5cIixcbiAgXCJoZWFkZXJzXCIsXG4gIFwicm93U3BhblwiLFxuICBcInNjb3BlXCIsXG4gIFwiYWxpZ25cIixcbiAgXCJheGlzXCIsXG4gIFwiYmdDb2xvclwiLFxuICBcImNoXCIsXG4gIFwiY2hPZmZcIixcbiAgXCJoZWlnaHRcIixcbiAgXCJub1dyYXBcIixcbiAgXCJ2QWxpZ25cIixcbiAgXCJ3aWR0aFwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxUYWJsZUNlbGxFbGVtZW50KVtdO1xuY29uc3QgdGFibGVDZWxsRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTFRhYmxlQ2VsbEVsZW1lbnQ+KEhUTUxfVEFCTEVfQ0VMTF9LRVlTKTtcblxuY29uc3QgSFRNTF9UQUJMRV9DT0xfS0VZUyA9IFtcbiAgXCJzcGFuXCIsXG4gIFwiYWxpZ25cIixcbiAgXCJjaFwiLFxuICBcImNoT2ZmXCIsXG4gIFwidkFsaWduXCIsXG4gIFwid2lkdGhcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MVGFibGVDb2xFbGVtZW50KVtdO1xuY29uc3QgdGFibGVDb2xFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MVGFibGVDb2xFbGVtZW50PihIVE1MX1RBQkxFX0NPTF9LRVlTKTtcblxuY29uc3QgSFRNTF9UQUJMRV9LRVlTID0gW1xuICBcImFsaWduXCIsXG4gIFwiYmdDb2xvclwiLFxuICBcImJvcmRlclwiLFxuICBcImNlbGxQYWRkaW5nXCIsXG4gIFwiY2VsbFNwYWNpbmdcIixcbiAgXCJmcmFtZVwiLFxuICBcInJ1bGVzXCIsXG4gIFwic3VtbWFyeVwiLFxuICBcIndpZHRoXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTFRhYmxlRWxlbWVudClbXTtcbmNvbnN0IHRhYmxlRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTFRhYmxlRWxlbWVudD4oSFRNTF9UQUJMRV9LRVlTKTtcblxuY29uc3QgSFRNTF9UUl9LRVlTID0gW1xuICBcInJvd0luZGV4XCIsXG4gIFwic2VjdGlvblJvd0luZGV4XCIsXG4gIFwiYWxpZ25cIixcbiAgXCJiZ0NvbG9yXCIsXG4gIFwiY2hcIixcbiAgXCJjaE9mZlwiLFxuICBcInZBbGlnblwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxUYWJsZVJvd0VsZW1lbnQpW107XG5jb25zdCB0YWJsZVJvd0V4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxUYWJsZVJvd0VsZW1lbnQ+KEhUTUxfVFJfS0VZUyk7XG5cbmNvbnN0IEhUTUxfVFNFQ1RJT05fS0VZUyA9IFtcbiAgXCJhbGlnblwiLFxuICBcImNoXCIsXG4gIFwiY2hPZmZcIixcbiAgXCJ2QWxpZ25cIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MVGFibGVTZWN0aW9uRWxlbWVudClbXTtcbmNvbnN0IHRhYmxlU2VjdGlvbkV4dHJhY3RvciA9XG4gIHdpdGhCYXNlPEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50PihIVE1MX1RTRUNUSU9OX0tFWVMpO1xuXG5jb25zdCB0ZW1wbGF0ZUV4dHJhY3RvciA9IChlbHQ6IEhUTUxUZW1wbGF0ZUVsZW1lbnQpID0+XG4gIGV4dHJhY3RIVE1MRWxlbWVudEJhc2UoZWx0KTtcblxuY29uc3QgSFRNTF9URVhUQVJFQV9LRVlTID0gW1xuICBcImF1dG9jb21wbGV0ZVwiLFxuICBcImNvbHNcIixcbiAgXCJkZWZhdWx0VmFsdWVcIixcbiAgXCJkaXJOYW1lXCIsXG4gIFwiZGlzYWJsZWRcIixcbiAgXCJtYXhMZW5ndGhcIixcbiAgXCJtaW5MZW5ndGhcIixcbiAgXCJuYW1lXCIsXG4gIFwicGxhY2Vob2xkZXJcIixcbiAgXCJyZWFkT25seVwiLFxuICBcInJlcXVpcmVkXCIsXG4gIFwicm93c1wiLFxuICBcInNlbGVjdGlvbkRpcmVjdGlvblwiLFxuICBcInNlbGVjdGlvbkVuZFwiLFxuICBcInNlbGVjdGlvblN0YXJ0XCIsXG4gIFwidmFsdWVcIixcbiAgXCJ3cmFwXCIsXG4gIFwidGV4dExlbmd0aFwiLFxuICBcInZhbGlkYXRpb25NZXNzYWdlXCIsXG4gIFwid2lsbFZhbGlkYXRlXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTFRleHRBcmVhRWxlbWVudClbXTtcbmNvbnN0IHRleHRhcmVhRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTFRleHRBcmVhRWxlbWVudD4oSFRNTF9URVhUQVJFQV9LRVlTKTtcblxuY29uc3QgSFRNTF9USU1FX0tFWVMgPSBbXG4gIFwiZGF0ZVRpbWVcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MVGltZUVsZW1lbnQpW107XG5jb25zdCB0aW1lRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTFRpbWVFbGVtZW50PihIVE1MX1RJTUVfS0VZUyk7XG5cbmNvbnN0IEhUTUxfVFJBQ0tfS0VZUyA9IFtcbiAgXCJkZWZhdWx0XCIsXG4gIFwia2luZFwiLFxuICBcImxhYmVsXCIsXG4gIFwicmVhZHlTdGF0ZVwiLFxuICBcInNyY1wiLFxuICBcInNyY2xhbmdcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MVHJhY2tFbGVtZW50KVtdO1xuY29uc3QgdHJhY2tFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MVHJhY2tFbGVtZW50PihIVE1MX1RSQUNLX0tFWVMpO1xuXG5jb25zdCBIVE1MX1ZJREVPX0tFWVMgPSBbXG4gIFwiaGVpZ2h0XCIsXG4gIFwicG9zdGVyXCIsXG4gIFwidmlkZW9IZWlnaHRcIixcbiAgXCJ2aWRlb1dpZHRoXCIsXG4gIFwid2lkdGhcIixcbiAgXCJwbGF5c0lubGluZVwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxWaWRlb0VsZW1lbnQpW107XG5jb25zdCBleHRyYWN0SFRNTFZpZGVvT25seSA9XG4gIGNyZWF0ZUV4dHJhY3RvcjxIVE1MVmlkZW9FbGVtZW50PigpKEhUTUxfVklERU9fS0VZUyk7XG5jb25zdCB2aWRlb0V4dHJhY3RvciA9IChlbHQ6IEhUTUxWaWRlb0VsZW1lbnQpID0+ICh7XG4gIC4uLm1lZGlhRXh0cmFjdG9yKGVsdCksXG4gIC4uLmV4dHJhY3RIVE1MVmlkZW9Pbmx5KGVsdCksXG59KTtcblxuY29uc3QgSFRNTF9CUl9LRVlTID0gW1xuICBcImNsZWFyXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTEJSRWxlbWVudClbXTtcbmNvbnN0IGJyRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTEJSRWxlbWVudD4oSFRNTF9CUl9LRVlTKTtcblxuY29uc3QgSFRNTF9CQVNFX0tFWVMgPSBbXG4gIFwiaHJlZlwiLFxuICBcInRhcmdldFwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxCYXNlRWxlbWVudClbXTtcbmNvbnN0IGJhc2VFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MQmFzZUVsZW1lbnQ+KEhUTUxfQkFTRV9LRVlTKTtcblxuY29uc3QgSFRNTF9CT0RZX0tFWVMgPSBbXG4gIFwiYUxpbmtcIixcbiAgXCJiYWNrZ3JvdW5kXCIsXG4gIFwiYmdDb2xvclwiLFxuICBcImxpbmtcIixcbiAgXCJ0ZXh0XCIsXG4gIFwidkxpbmtcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MQm9keUVsZW1lbnQpW107XG5jb25zdCBib2R5RXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTEJvZHlFbGVtZW50PihIVE1MX0JPRFlfS0VZUyk7XG5cbmNvbnN0IEhUTUxfRExJU1RfS0VZUyA9IFtcbiAgXCJjb21wYWN0XCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTERMaXN0RWxlbWVudClbXTtcbmNvbnN0IGRsaXN0RXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTERMaXN0RWxlbWVudD4oSFRNTF9ETElTVF9LRVlTKTtcblxuY29uc3QgSFRNTF9ERVRBSUxTX0tFWVMgPSBbXG4gIFwib3BlblwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxEZXRhaWxzRWxlbWVudClbXTtcbmNvbnN0IGRldGFpbHNFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MRGV0YWlsc0VsZW1lbnQ+KEhUTUxfREVUQUlMU19LRVlTKTtcblxuY29uc3QgSFRNTF9ESUFMT0dfS0VZUyA9IFtcbiAgXCJvcGVuXCIsXG4gIFwicmV0dXJuVmFsdWVcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MRGlhbG9nRWxlbWVudClbXTtcbmNvbnN0IGRpYWxvZ0V4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxEaWFsb2dFbGVtZW50PihIVE1MX0RJQUxPR19LRVlTKTtcblxuY29uc3QgSFRNTF9ESVZfS0VZUyA9IFtcbiAgXCJhbGlnblwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxEaXZFbGVtZW50KVtdO1xuY29uc3QgZGl2RXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTERpdkVsZW1lbnQ+KEhUTUxfRElWX0tFWVMpO1xuXG5jb25zdCBoZWFkRXh0cmFjdG9yID0gKGVsdDogSFRNTEhlYWRFbGVtZW50KSA9PiBleHRyYWN0SFRNTEVsZW1lbnRCYXNlKGVsdCk7XG5cbmNvbnN0IEhUTUxfSEVBRElOR19LRVlTID0gW1xuICBcImFsaWduXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTEhlYWRpbmdFbGVtZW50KVtdO1xuY29uc3QgaGVhZGluZ0V4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxIZWFkaW5nRWxlbWVudD4oSFRNTF9IRUFESU5HX0tFWVMpO1xuXG5jb25zdCBIVE1MX0hSX0tFWVMgPSBbXG4gIFwiYWxpZ25cIixcbiAgXCJjb2xvclwiLFxuICBcIm5vU2hhZGVcIixcbiAgXCJzaXplXCIsXG4gIFwid2lkdGhcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MSFJFbGVtZW50KVtdO1xuY29uc3QgaHJFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MSFJFbGVtZW50PihIVE1MX0hSX0tFWVMpO1xuXG5jb25zdCBIVE1MX0hUTUxfS0VZUyA9IFtcbiAgXCJ2ZXJzaW9uXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTEh0bWxFbGVtZW50KVtdO1xuY29uc3QgaHRtbEV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxIdG1sRWxlbWVudD4oSFRNTF9IVE1MX0tFWVMpO1xuXG5jb25zdCBtZW51RXh0cmFjdG9yID0gKGVsdDogSFRNTE1lbnVFbGVtZW50KSA9PiBleHRyYWN0SFRNTEVsZW1lbnRCYXNlKGVsdCk7XG5cbmNvbnN0IEhUTUxfTUVUQV9LRVlTID0gW1xuICBcImNvbnRlbnRcIixcbiAgXCJodHRwRXF1aXZcIixcbiAgXCJuYW1lXCIsXG4gIFwic2NoZW1lXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTE1ldGFFbGVtZW50KVtdO1xuY29uc3QgbWV0YUV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxNZXRhRWxlbWVudD4oSFRNTF9NRVRBX0tFWVMpO1xuXG5jb25zdCBIVE1MX1BfS0VZUyA9IFtcbiAgXCJhbGlnblwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxQYXJhZ3JhcGhFbGVtZW50KVtdO1xuY29uc3QgcGFyYWdyYXBoRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTFBhcmFncmFwaEVsZW1lbnQ+KEhUTUxfUF9LRVlTKTtcblxuY29uc3QgcGljdHVyZUV4dHJhY3RvciA9IChlbHQ6IEhUTUxQaWN0dXJlRWxlbWVudCkgPT5cbiAgZXh0cmFjdEhUTUxFbGVtZW50QmFzZShlbHQpO1xuXG5jb25zdCBIVE1MX1BSRV9LRVlTID0gW1xuICBcIndpZHRoXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTFByZUVsZW1lbnQpW107XG5jb25zdCBwcmVFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MUHJlRWxlbWVudD4oSFRNTF9QUkVfS0VZUyk7XG5cbmNvbnN0IHNwYW5FeHRyYWN0b3IgPSAoZWx0OiBIVE1MU3BhbkVsZW1lbnQpID0+IGV4dHJhY3RIVE1MRWxlbWVudEJhc2UoZWx0KTtcblxuY29uc3QgSFRNTF9TVFlMRV9LRVlTID0gW1xuICBcIm1lZGlhXCIsXG4gIFwidHlwZVwiLFxuICBcImRpc2FibGVkXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTFN0eWxlRWxlbWVudClbXTtcbmNvbnN0IHN0eWxlRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTFN0eWxlRWxlbWVudD4oSFRNTF9TVFlMRV9LRVlTKTtcblxuY29uc3QgSFRNTF9USVRMRV9LRVlTID0gW1xuICBcInRleHRcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MVGl0bGVFbGVtZW50KVtdO1xuY29uc3QgdGl0bGVFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MVGl0bGVFbGVtZW50PihIVE1MX1RJVExFX0tFWVMpO1xuXG5jb25zdCBIVE1MX1VMX0tFWVMgPSBbXG4gIFwiY29tcGFjdFwiLFxuICBcInR5cGVcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MVUxpc3RFbGVtZW50KVtdO1xuY29uc3QgdWxpc3RFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MVUxpc3RFbGVtZW50PihIVE1MX1VMX0tFWVMpO1xuXG4vLyBNYXAgb2YgdGFnTmFtZSAtPiBleHRyYWN0b3IgKGNvbmNpc2UsIGxpa2UgZXZlbnRzLnRzKVxuY29uc3QgZWxlbWVudEV4dHJhY3RvcnM6IFJlY29yZDxzdHJpbmcsIChlbHQ6IGFueSkgPT4gb2JqZWN0PiA9IHtcbiAgQTogYW5jaG9yRXh0cmFjdG9yLFxuICBBUkVBOiBhcmVhRXh0cmFjdG9yLFxuICBBVURJTzogYXVkaW9FeHRyYWN0b3IsXG4gIEJBU0U6IGJhc2VFeHRyYWN0b3IsXG4gIEJMT0NLUVVPVEU6IHF1b3RlRXh0cmFjdG9yLFxuICBROiBxdW90ZUV4dHJhY3RvcixcbiAgQk9EWTogYm9keUV4dHJhY3RvcixcbiAgQlI6IGJyRXh0cmFjdG9yLFxuICBCVVRUT046IGJ1dHRvbkV4dHJhY3RvcixcbiAgQ0FOVkFTOiBleHRyYWN0SFRNTEVsZW1lbnRCYXNlLFxuICBDQVBUSU9OOiB0YWJsZUNhcHRpb25FeHRyYWN0b3IsXG4gIENJVEU6IGNpdGVFeHRyYWN0b3IsXG4gIENPTDogdGFibGVDb2xFeHRyYWN0b3IsXG4gIENPTEdST1VQOiB0YWJsZUNvbEV4dHJhY3RvcixcbiAgREFUQTogZGF0YUV4dHJhY3RvcixcbiAgREVUQUlMUzogZGV0YWlsc0V4dHJhY3RvcixcbiAgRElBTE9HOiBkaWFsb2dFeHRyYWN0b3IsXG4gIERJVjogZGl2RXh0cmFjdG9yLFxuICBETDogZGxpc3RFeHRyYWN0b3IsXG4gIEVNQkVEOiBlbWJlZEV4dHJhY3RvcixcbiAgRklFTERTRVQ6IGZpZWxkc2V0RXh0cmFjdG9yLFxuICBGT1JNOiBmb3JtRXh0cmFjdG9yLFxuICBIMTogaGVhZGluZ0V4dHJhY3RvcixcbiAgSDI6IGhlYWRpbmdFeHRyYWN0b3IsXG4gIEgzOiBoZWFkaW5nRXh0cmFjdG9yLFxuICBINDogaGVhZGluZ0V4dHJhY3RvcixcbiAgSDU6IGhlYWRpbmdFeHRyYWN0b3IsXG4gIEg2OiBoZWFkaW5nRXh0cmFjdG9yLFxuICBIRUFEOiBoZWFkRXh0cmFjdG9yLFxuICBIUjogaHJFeHRyYWN0b3IsXG4gIEhUTUw6IGh0bWxFeHRyYWN0b3IsXG4gIElGUkFNRTogaWZyYW1lRXh0cmFjdG9yLFxuICBJTUc6IGltYWdlRXh0cmFjdG9yLFxuICBJTlBVVDogaW5wdXRFeHRyYWN0b3IsXG4gIExBQkVMOiBsYWJlbEV4dHJhY3RvcixcbiAgTEk6IGxpRXh0cmFjdG9yLFxuICBMSU5LOiBsaW5rRXh0cmFjdG9yLFxuICBNQVA6IG1hcEV4dHJhY3RvcixcbiAgTUVOVTogbWVudUV4dHJhY3RvcixcbiAgTUVUQTogbWV0YUV4dHJhY3RvcixcbiAgTUVURVI6IG1ldGVyRXh0cmFjdG9yLFxuICBJTlM6IG1vZEV4dHJhY3RvcixcbiAgREVMOiBtb2RFeHRyYWN0b3IsXG4gIE9CSkVDVDogb2JqZWN0RXh0cmFjdG9yLFxuICBPTDogb2xpc3RFeHRyYWN0b3IsXG4gIE9QVEdST1VQOiBvcHRncm91cEV4dHJhY3RvcixcbiAgT1BUSU9OOiBvcHRpb25FeHRyYWN0b3IsXG4gIE9VVFBVVDogb3V0cHV0RXh0cmFjdG9yLFxuICBQOiBwYXJhZ3JhcGhFeHRyYWN0b3IsXG4gIFBJQ1RVUkU6IHBpY3R1cmVFeHRyYWN0b3IsXG4gIFBSRTogcHJlRXh0cmFjdG9yLFxuICBQUk9HUkVTUzogcHJvZ3Jlc3NFeHRyYWN0b3IsXG4gIFNDUklQVDogc2NyaXB0RXh0cmFjdG9yLFxuICBTRUxFQ1Q6IHNlbGVjdEV4dHJhY3RvcixcbiAgU0xPVDogc2xvdEV4dHJhY3RvcixcbiAgU09VUkNFOiBzb3VyY2VFeHRyYWN0b3IsXG4gIFNQQU46IHNwYW5FeHRyYWN0b3IsXG4gIFNUWUxFOiBzdHlsZUV4dHJhY3RvcixcbiAgVEFCTEU6IHRhYmxlRXh0cmFjdG9yLFxuICBUQk9EWTogdGFibGVTZWN0aW9uRXh0cmFjdG9yLFxuICBUSEVBRDogdGFibGVTZWN0aW9uRXh0cmFjdG9yLFxuICBURk9PVDogdGFibGVTZWN0aW9uRXh0cmFjdG9yLFxuICBURDogdGFibGVDZWxsRXh0cmFjdG9yLFxuICBUSDogdGFibGVDZWxsRXh0cmFjdG9yLFxuICBURU1QTEFURTogdGVtcGxhdGVFeHRyYWN0b3IsXG4gIFRFWFRBUkVBOiB0ZXh0YXJlYUV4dHJhY3RvcixcbiAgVElNRTogdGltZUV4dHJhY3RvcixcbiAgVElUTEU6IHRpdGxlRXh0cmFjdG9yLFxuICBUUjogdGFibGVSb3dFeHRyYWN0b3IsXG4gIFRSQUNLOiB0cmFja0V4dHJhY3RvcixcbiAgVUw6IHVsaXN0RXh0cmFjdG9yLFxuICBWSURFTzogdmlkZW9FeHRyYWN0b3IsXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdEhUTUxFbGVtZW50KGVsdDogSFRNTEVsZW1lbnQpOiBvYmplY3Qge1xuICBjb25zdCB0YWdOYW1lID0gZWx0LnRhZ05hbWUudG9VcHBlckNhc2UoKTtcblxuICBjb25zdCBleHRyYWN0b3IgPSBlbGVtZW50RXh0cmFjdG9yc1t0YWdOYW1lXTtcbiAgaWYgKGV4dHJhY3Rvcikge1xuICAgIHJldHVybiBleHRyYWN0b3IoZWx0KTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgYFVuZXhwZWN0ZWQgSFRNTCBlbGVtZW50IHRhZzogJHtlbHQudGFnTmFtZX0gKHVwZGF0ZSAud2ViL2N1c3RvbS9zZXJpYWxpemUudHMpYFxuICApO1xufVxuIiwKICAgICIvKiA9PT0gSU1QT1JUQU5UID09PSAqL1xuXG5pbXBvcnQgeyBleHRyYWN0SFRNTEVsZW1lbnQgfSBmcm9tIFwiLi9lbGVtZW50c1wiO1xuaW1wb3J0IHsgY3JlYXRlRXh0cmFjdG9yIH0gZnJvbSBcIi4vZXh0cmFjdG9yXCI7XG5cbi8vIFJldXNhYmxlIGNvbXB1dGVkIG1hcHBlcnMgKGhlbHBzIGJ1bmRsZXJzL21pbmlmaWVycyBzaGFyZSByZWZlcmVuY2VzKVxuY29uc3QgbWFwVGFyZ2V0ID0gKGU6IHsgdGFyZ2V0OiBFdmVudFRhcmdldCB8IG51bGwgfSkgPT5cbiAgZXh0cmFjdEhUTUxFbGVtZW50KGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KTtcbmNvbnN0IG1hcFJlbGF0ZWQgPSAoZTogeyByZWxhdGVkVGFyZ2V0OiBFdmVudFRhcmdldCB8IG51bGwgfSkgPT5cbiAgZS5yZWxhdGVkVGFyZ2V0ID8gZXh0cmFjdEhUTUxFbGVtZW50KGUucmVsYXRlZFRhcmdldCBhcyBIVE1MRWxlbWVudCkgOiBudWxsO1xuXG5mdW5jdGlvbiBtYWtlRXh0cmFjdG9yPEsgZXh0ZW5kcyByZWFkb25seSBhbnlbXT4oXG4gIGtleXM6IEssXG4gIGNvbXB1dGVkPzogUmVjb3JkPHN0cmluZywgKGV2dDogYW55KSA9PiBhbnk+XG4pIHtcbiAgcmV0dXJuIGNyZWF0ZUV4dHJhY3Rvcjxhbnk+KCkoXG4gICAga2V5cyBhcyBhbnksXG4gICAge1xuICAgICAgdGFyZ2V0OiBtYXBUYXJnZXQsXG4gICAgICAuLi4oY29tcHV0ZWQgfHwge30pLFxuICAgIH0gYXMgYW55XG4gICk7XG59XG5cbmNvbnN0IFNZTlRIRVRJQ19LRVlTID0gW1xuICBcInRhcmdldFwiLFxuICBcImJ1YmJsZXNcIixcbiAgXCJjYW5jZWxhYmxlXCIsXG4gIFwiZGVmYXVsdFByZXZlbnRlZFwiLFxuICBcImV2ZW50UGhhc2VcIixcbiAgXCJpc1RydXN0ZWRcIixcbiAgXCJ0aW1lU3RhbXBcIixcbiAgXCJ0eXBlXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgUmVhY3QuU3ludGhldGljRXZlbnQpW107XG5cbmNvbnN0IFVJX0tFWVMgPSBbXG4gIC4uLlNZTlRIRVRJQ19LRVlTLFxuICBcImRldGFpbFwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIFJlYWN0LlVJRXZlbnQpW107XG5cbmNvbnN0IE1PVVNFX0tFWVMgPSBbXG4gIC4uLlVJX0tFWVMsXG4gIFwiYWx0S2V5XCIsXG4gIFwiYnV0dG9uXCIsXG4gIFwiYnV0dG9uc1wiLFxuICBcImNsaWVudFhcIixcbiAgXCJjbGllbnRZXCIsXG4gIFwiY3RybEtleVwiLFxuICBcIm1ldGFLZXlcIixcbiAgXCJtb3ZlbWVudFhcIixcbiAgXCJtb3ZlbWVudFlcIixcbiAgXCJwYWdlWFwiLFxuICBcInBhZ2VZXCIsXG4gIFwic2NyZWVuWFwiLFxuICBcInNjcmVlbllcIixcbiAgXCJzaGlmdEtleVwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIFJlYWN0Lk1vdXNlRXZlbnQpW107XG5cbmNvbnN0IFBPSU5URVJfS0VZUyA9IFtcbiAgLi4uTU9VU0VfS0VZUyxcbiAgXCJwb2ludGVySWRcIixcbiAgXCJwcmVzc3VyZVwiLFxuICBcInRhbmdlbnRpYWxQcmVzc3VyZVwiLFxuICBcInRpbHRYXCIsXG4gIFwidGlsdFlcIixcbiAgXCJ0d2lzdFwiLFxuICBcIndpZHRoXCIsXG4gIFwiaGVpZ2h0XCIsXG4gIFwicG9pbnRlclR5cGVcIixcbiAgXCJpc1ByaW1hcnlcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBSZWFjdC5Qb2ludGVyRXZlbnQpW107XG5cbmNvbnN0IHN5bnRoZXRpY0V4dHJhY3RvciA9IG1ha2VFeHRyYWN0b3IoU1lOVEhFVElDX0tFWVMpO1xuXG5jb25zdCB1aUV4dHJhY3RvciA9IG1ha2VFeHRyYWN0b3IoVUlfS0VZUyk7XG5cbmNvbnN0IG1vdXNlRXh0cmFjdG9yID0gbWFrZUV4dHJhY3RvcihNT1VTRV9LRVlTLCB7IHJlbGF0ZWRUYXJnZXQ6IG1hcFJlbGF0ZWQgfSk7XG5cbmNvbnN0IGNsaXBib2FyZEV4dHJhY3RvciA9IG1ha2VFeHRyYWN0b3IoU1lOVEhFVElDX0tFWVMsIHtcbiAgY2xpcGJvYXJkRGF0YTogKGUpID0+IGV4dHJhY3REYXRhVHJhbnNmZXIoZS5jbGlwYm9hcmREYXRhKSxcbn0pO1xuXG5jb25zdCBjb21wb3NpdGlvbkV4dHJhY3RvciA9IG1ha2VFeHRyYWN0b3IoW1xuICAuLi5TWU5USEVUSUNfS0VZUyxcbiAgXCJkYXRhXCIsXG5dIGFzIGNvbnN0KTtcblxuY29uc3QgZHJhZ0V4dHJhY3RvciA9IG1ha2VFeHRyYWN0b3IoTU9VU0VfS0VZUywge1xuICByZWxhdGVkVGFyZ2V0OiBtYXBSZWxhdGVkLFxuICBkYXRhVHJhbnNmZXI6IChlKSA9PiBleHRyYWN0RGF0YVRyYW5zZmVyKGUuZGF0YVRyYW5zZmVyKSxcbn0pO1xuXG5jb25zdCBwb2ludGVyRXh0cmFjdG9yID0gbWFrZUV4dHJhY3RvcihQT0lOVEVSX0tFWVMsIHtcbiAgcmVsYXRlZFRhcmdldDogbWFwUmVsYXRlZCxcbn0pO1xuXG5jb25zdCBmb2N1c0V4dHJhY3RvciA9IG1ha2VFeHRyYWN0b3IoU1lOVEhFVElDX0tFWVMsIHtcbiAgcmVsYXRlZFRhcmdldDogbWFwUmVsYXRlZCxcbn0pO1xuXG5jb25zdCBmb3JtRXh0cmFjdG9yID0gbWFrZUV4dHJhY3RvcihTWU5USEVUSUNfS0VZUyk7XG5cbmNvbnN0IGludmFsaWRFeHRyYWN0b3IgPSBtYWtlRXh0cmFjdG9yKFNZTlRIRVRJQ19LRVlTKTtcblxuY29uc3QgY2hhbmdlRXh0cmFjdG9yID0gbWFrZUV4dHJhY3RvcihTWU5USEVUSUNfS0VZUyk7XG5cbmNvbnN0IGtleWJvYXJkRXh0cmFjdG9yID0gbWFrZUV4dHJhY3RvcihbXG4gIC4uLlVJX0tFWVMsXG4gIFwiYWx0S2V5XCIsXG4gIFwiY3RybEtleVwiLFxuICBcImNvZGVcIixcbiAgXCJrZXlcIixcbiAgXCJsb2NhbGVcIixcbiAgXCJsb2NhdGlvblwiLFxuICBcIm1ldGFLZXlcIixcbiAgXCJyZXBlYXRcIixcbiAgXCJzaGlmdEtleVwiLFxuXSBhcyBjb25zdCk7XG5cbmNvbnN0IHRvdWNoRXh0cmFjdG9yID0gbWFrZUV4dHJhY3RvcihcbiAgW1xuICAgIC4uLlVJX0tFWVMsXG4gICAgXCJhbHRLZXlcIixcbiAgICBcImN0cmxLZXlcIixcbiAgICBcIm1ldGFLZXlcIixcbiAgICBcInNoaWZ0S2V5XCIsXG4gICAgXCJjaGFuZ2VkVG91Y2hlc1wiLFxuICAgIFwidGFyZ2V0VG91Y2hlc1wiLFxuICAgIFwidG91Y2hlc1wiLFxuICBdIGFzIGNvbnN0LFxuICB7XG4gICAgY2hhbmdlZFRvdWNoZXM6IChlKSA9PiBtYXBUb3VjaExpc3QoZS5jaGFuZ2VkVG91Y2hlcyksXG4gICAgdGFyZ2V0VG91Y2hlczogKGUpID0+IG1hcFRvdWNoTGlzdChlLnRhcmdldFRvdWNoZXMpLFxuICAgIHRvdWNoZXM6IChlKSA9PiBtYXBUb3VjaExpc3QoZS50b3VjaGVzKSxcbiAgfVxuKTtcblxuY29uc3Qgd2hlZWxFeHRyYWN0b3IgPSBtYWtlRXh0cmFjdG9yKFxuICBbLi4uTU9VU0VfS0VZUywgXCJkZWx0YU1vZGVcIiwgXCJkZWx0YVhcIiwgXCJkZWx0YVlcIiwgXCJkZWx0YVpcIl0gYXMgY29uc3QsXG4gIHtcbiAgICByZWxhdGVkVGFyZ2V0OiBtYXBSZWxhdGVkLFxuICB9XG4pO1xuXG5jb25zdCBhbmltYXRpb25FeHRyYWN0b3IgPSBtYWtlRXh0cmFjdG9yKFtcbiAgLi4uU1lOVEhFVElDX0tFWVMsXG4gIFwiYW5pbWF0aW9uTmFtZVwiLFxuICBcImVsYXBzZWRUaW1lXCIsXG4gIFwicHNldWRvRWxlbWVudFwiLFxuXSBhcyBjb25zdCk7XG5cbmNvbnN0IHRvZ2dsZUV4dHJhY3RvciA9IG1ha2VFeHRyYWN0b3IoW1xuICAuLi5TWU5USEVUSUNfS0VZUyxcbiAgXCJvbGRTdGF0ZVwiLFxuICBcIm5ld1N0YXRlXCIsXG5dIGFzIGNvbnN0KTtcblxuY29uc3QgdHJhbnNpdGlvbkV4dHJhY3RvciA9IG1ha2VFeHRyYWN0b3IoW1xuICAuLi5TWU5USEVUSUNfS0VZUyxcbiAgXCJlbGFwc2VkVGltZVwiLFxuICBcInByb3BlcnR5TmFtZVwiLFxuICBcInBzZXVkb0VsZW1lbnRcIixcbl0gYXMgY29uc3QpO1xuXG5mdW5jdGlvbiBtYXBUb3VjaExpc3QobGlzdDogYW55KTogYW55W10ge1xuICByZXR1cm4gQXJyYXkuZnJvbShsaXN0IGFzIEFycmF5TGlrZTxhbnk+KS5tYXAoKHRvdWNoOiBhbnkpID0+ICh7XG4gICAgdGFyZ2V0OiBleHRyYWN0SFRNTEVsZW1lbnQodG91Y2gudGFyZ2V0IGFzIEhUTUxFbGVtZW50KSxcbiAgICBpZGVudGlmaWVyOiB0b3VjaC5pZGVudGlmaWVyLFxuICAgIHNjcmVlblg6IHRvdWNoLnNjcmVlblgsXG4gICAgc2NyZWVuWTogdG91Y2guc2NyZWVuWSxcbiAgICBjbGllbnRYOiB0b3VjaC5jbGllbnRYLFxuICAgIGNsaWVudFk6IHRvdWNoLmNsaWVudFksXG4gICAgcGFnZVg6IHRvdWNoLnBhZ2VYLFxuICAgIHBhZ2VZOiB0b3VjaC5wYWdlWSxcbiAgfSkpO1xufVxuXG4vLyBIZWxwZXIgZnVuY3Rpb24gdG8gZXh0cmFjdCBEYXRhVHJhbnNmZXIgcHJvcGVydGllc1xuZnVuY3Rpb24gZXh0cmFjdERhdGFUcmFuc2ZlcihkdDogRGF0YVRyYW5zZmVyIHwgbnVsbCk6IG9iamVjdCB8IG51bGwge1xuICBpZiAoIWR0KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgaXRlbXMgPSBbXTtcbiAgaWYgKGR0Lml0ZW1zKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkdC5pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgaXRlbSA9IGR0Lml0ZW1zW2ldITtcbiAgICAgIGl0ZW1zLnB1c2goe1xuICAgICAgICBraW5kOiBpdGVtLmtpbmQsXG4gICAgICAgIHR5cGU6IGl0ZW0udHlwZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIGRyb3BfZWZmZWN0OiBkdC5kcm9wRWZmZWN0LFxuICAgIGVmZmVjdF9hbGxvd2VkOiBkdC5lZmZlY3RBbGxvd2VkLFxuICAgIGl0ZW1zOiBpdGVtcyxcbiAgICB0eXBlczogQXJyYXkuZnJvbShkdC50eXBlcyB8fCBbXSksXG4gIH07XG59XG5cbmNvbnN0IGV2ZW50RXh0cmFjdG9yTWFwOiB7IFtrZXk6IHN0cmluZ106IChldnQ6IGFueSkgPT4gb2JqZWN0IH0gPSB7fTtcblxuZnVuY3Rpb24gYWRkKG1hcDogUmVjb3JkPHN0cmluZywgYW55PiwgbmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdLCBmbjogYW55KSB7XG4gIGZvciAoY29uc3QgbiBvZiBuYW1lcykgbWFwW25dID0gZm47XG59XG5cbmFkZChcbiAgZXZlbnRFeHRyYWN0b3JNYXAsXG4gIFtcbiAgICBcInBvaW50ZXJkb3duXCIsXG4gICAgXCJwb2ludGVybW92ZVwiLFxuICAgIFwicG9pbnRlcnVwXCIsXG4gICAgXCJwb2ludGVyY2FuY2VsXCIsXG4gICAgXCJnb3Rwb2ludGVyY2FwdHVyZVwiLFxuICAgIFwibG9zdHBvaW50ZXJjYXB0dXJlXCIsXG4gICAgXCJwb2ludGVyZW50ZXJcIixcbiAgICBcInBvaW50ZXJsZWF2ZVwiLFxuICAgIFwicG9pbnRlcm92ZXJcIixcbiAgICBcInBvaW50ZXJvdXRcIixcbiAgXSxcbiAgcG9pbnRlckV4dHJhY3RvclxuKTtcblxuYWRkKFxuICBldmVudEV4dHJhY3Rvck1hcCxcbiAgW1xuICAgIFwiY2xpY2tcIixcbiAgICBcImNvbnRleHRtZW51XCIsXG4gICAgXCJkYmxjbGlja1wiLFxuICAgIFwibW91c2Vkb3duXCIsXG4gICAgXCJtb3VzZWVudGVyXCIsXG4gICAgXCJtb3VzZWxlYXZlXCIsXG4gICAgXCJtb3VzZW1vdmVcIixcbiAgICBcIm1vdXNlb3V0XCIsXG4gICAgXCJtb3VzZW92ZXJcIixcbiAgICBcIm1vdXNldXBcIixcbiAgXSxcbiAgbW91c2VFeHRyYWN0b3Jcbik7XG5cbmFkZChcbiAgZXZlbnRFeHRyYWN0b3JNYXAsXG4gIFtcbiAgICBcImRyYWdcIixcbiAgICBcImRyYWdlbmRcIixcbiAgICBcImRyYWdlbnRlclwiLFxuICAgIFwiZHJhZ2V4aXRcIixcbiAgICBcImRyYWdsZWF2ZVwiLFxuICAgIFwiZHJhZ292ZXJcIixcbiAgICBcImRyYWdzdGFydFwiLFxuICAgIFwiZHJvcFwiLFxuICBdLFxuICBkcmFnRXh0cmFjdG9yXG4pO1xuXG5hZGQoZXZlbnRFeHRyYWN0b3JNYXAsIFtcImtleWRvd25cIiwgXCJrZXlwcmVzc1wiLCBcImtleXVwXCJdLCBrZXlib2FyZEV4dHJhY3Rvcik7XG5hZGQoZXZlbnRFeHRyYWN0b3JNYXAsIFtcImZvY3VzXCIsIFwiYmx1clwiXSwgZm9jdXNFeHRyYWN0b3IpO1xuYWRkKGV2ZW50RXh0cmFjdG9yTWFwLCBbXCJjaGFuZ2VcIiwgXCJpbnB1dFwiXSwgY2hhbmdlRXh0cmFjdG9yKTtcbmFkZChldmVudEV4dHJhY3Rvck1hcCwgW1wiaW52YWxpZFwiXSwgaW52YWxpZEV4dHJhY3Rvcik7XG5hZGQoZXZlbnRFeHRyYWN0b3JNYXAsIFtcInJlc2V0XCIsIFwic3VibWl0XCJdLCBmb3JtRXh0cmFjdG9yKTtcbmFkZChldmVudEV4dHJhY3Rvck1hcCwgW1wiY29weVwiLCBcImN1dFwiLCBcInBhc3RlXCJdLCBjbGlwYm9hcmRFeHRyYWN0b3IpO1xuYWRkKFxuICBldmVudEV4dHJhY3Rvck1hcCxcbiAgW1wiY29tcG9zaXRpb25lbmRcIiwgXCJjb21wb3NpdGlvbnN0YXJ0XCIsIFwiY29tcG9zaXRpb251cGRhdGVcIl0sXG4gIGNvbXBvc2l0aW9uRXh0cmFjdG9yXG4pO1xuYWRkKFxuICBldmVudEV4dHJhY3Rvck1hcCxcbiAgW1widG91Y2hjYW5jZWxcIiwgXCJ0b3VjaGVuZFwiLCBcInRvdWNobW92ZVwiLCBcInRvdWNoc3RhcnRcIl0sXG4gIHRvdWNoRXh0cmFjdG9yXG4pO1xuYWRkKGV2ZW50RXh0cmFjdG9yTWFwLCBbXCJzY3JvbGxcIl0sIHVpRXh0cmFjdG9yKTtcbmFkZChldmVudEV4dHJhY3Rvck1hcCwgW1wid2hlZWxcIl0sIHdoZWVsRXh0cmFjdG9yKTtcbmFkZChcbiAgZXZlbnRFeHRyYWN0b3JNYXAsXG4gIFtcImFuaW1hdGlvbnN0YXJ0XCIsIFwiYW5pbWF0aW9uZW5kXCIsIFwiYW5pbWF0aW9uaXRlcmF0aW9uXCJdLFxuICBhbmltYXRpb25FeHRyYWN0b3Jcbik7XG5hZGQoZXZlbnRFeHRyYWN0b3JNYXAsIFtcInRyYW5zaXRpb25lbmRcIl0sIHRyYW5zaXRpb25FeHRyYWN0b3IpO1xuYWRkKGV2ZW50RXh0cmFjdG9yTWFwLCBbXCJ0b2dnbGVcIl0sIHRvZ2dsZUV4dHJhY3Rvcik7XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0RXZlbnQodmFsdWU6IGFueSk6IGFueSB7XG4gIC8vIER1Y2stdHlwaW5nIGZvciBSZWFjdCdzIFN5bnRoZXRpY0V2ZW50LlxuICAvLyBXZSBjaGVjayBmb3IgcHJvcGVydGllcyB0aGF0IGFyZSB1bmlxdWUgdG8gc3ludGhldGljIGV2ZW50cy5cbiAgaWYgKFxuICAgIHZhbHVlICYmXG4gICAgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmXG4gICAgXCJuYXRpdmVFdmVudFwiIGluIHZhbHVlICYmXG4gICAgdHlwZW9mIHZhbHVlLmlzRGVmYXVsdFByZXZlbnRlZCA9PT0gXCJmdW5jdGlvblwiXG4gICkge1xuICAgIGNvbnN0IGV2dCA9IHZhbHVlIGFzIFJlYWN0LlN5bnRoZXRpY0V2ZW50O1xuICAgIC8vIFRoZSBgdHlwZWAgcHJvcGVydHkgaXMgY3J1Y2lhbCBmb3IgdGhlIGxvb2t1cC5cbiAgICBpZiAodHlwZW9mIGV2dC50eXBlICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgY29uc3QgZXh0cmFjdG9yID0gZXZlbnRFeHRyYWN0b3JNYXBbZXZ0LnR5cGUudG9Mb3dlckNhc2UoKV07XG4gICAgaWYgKGV4dHJhY3Rvcikge1xuICAgICAgcmV0dXJuIGV4dHJhY3RvcihldnQpO1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIGZvciB1bmtub3duIGV2ZW50IHR5cGVzOiBtaW5pbWFsIHN5bnRoZXRpYyBleHRyYWN0b3JcbiAgICByZXR1cm4gc3ludGhldGljRXh0cmFjdG9yKGV2dCk7XG4gIH1cblxuICAvLyBJZiBpdCdzIG5vdCBhIGR1Y2stdHlwZWQgZXZlbnQsIHJldHVybiBpdCBhcyBpcy5cbiAgcmV0dXJuIHZhbHVlO1xufVxuIiwKICAgICJleHBvcnQgdHlwZSBQcmltaXRpdmUgPSBudW1iZXIgfCBzdHJpbmcgfCBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZDtcbmV4cG9ydCB0eXBlIEpTT048VD4gPSBUIHwgQXJyYXk8SlNPTjxUPj4gfCB7IFtLOiBzdHJpbmddOiBKU09OPFQ+IH07XG5leHBvcnQgdHlwZSBQbGFpbkpTT04gPSBKU09OPFByaW1pdGl2ZT47XG5leHBvcnQgdHlwZSBTZXJpYWxpemFibGUgPSBhbnk7XG5cbmV4cG9ydCB0eXBlIFNlcmlhbGl6ZWQgPSBbW251bWJlcltdLCBudW1iZXJbXSwgbnVtYmVyW10sIG51bWJlcltdXSwgUGxhaW5KU09OXTtcblxuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZShkYXRhOiBTZXJpYWxpemFibGUpOiBTZXJpYWxpemVkIHtcbiAgY29uc3Qgc2VlbiA9IG5ldyBNYXA8YW55LCBudW1iZXI+KCk7XG4gIGNvbnN0IHJlZnM6IG51bWJlcltdID0gW107XG4gIGNvbnN0IGRhdGVzOiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCBzZXRzOiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCBtYXBzOiBudW1iZXJbXSA9IFtdO1xuXG4gIC8vIFNpbmdsZSBnbG9iYWwgY291bnRlciAtIGluY3JlbWVudHMgb25jZSBwZXIgbm9kZSB2aXNpdFxuICBsZXQgZ2xvYmFsSW5kZXggPSAwO1xuXG4gIGZ1bmN0aW9uIHByb2Nlc3ModmFsdWU6IFNlcmlhbGl6YWJsZSk6IFBsYWluSlNPTiB7XG4gICAgaWYgKFxuICAgICAgdmFsdWUgPT0gbnVsbCB8fFxuICAgICAgdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiIHx8XG4gICAgICB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHxcbiAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCJcbiAgICApIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBpZHggPSBnbG9iYWxJbmRleCsrO1xuICAgIGNvbnN0IHByZXZSZWYgPSBzZWVuLmdldCh2YWx1ZSk7XG4gICAgaWYgKHByZXZSZWYgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gTWFrZSBzdXJlIHRvIHB1c2ggdGhlIGN1cnJlbnQgaW5kZXgsIGJ1dCB1c2UgdGhlIHJlZidzIGluZGV4IGFzIHRoZSB2YWx1ZSFcbiAgICAgIHJlZnMucHVzaChpZHgpO1xuICAgICAgcmV0dXJuIHByZXZSZWY7XG4gICAgfVxuXG4gICAgc2Vlbi5zZXQodmFsdWUsIGlkeCk7XG5cbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICBkYXRlcy5wdXNoKGlkeCk7XG4gICAgICByZXR1cm4gdmFsdWUuZ2V0VGltZSgpO1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgY29uc3QgbGVuZ3RoID0gdmFsdWUubGVuZ3RoO1xuICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5KGxlbmd0aCk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJlc3VsdFtpXSA9IHByb2Nlc3ModmFsdWVbaV0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBNYXApIHtcbiAgICAgIG1hcHMucHVzaChpZHgpO1xuICAgICAgY29uc3QgcmVjOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIGVudHJ5XSBvZiB2YWx1ZS5lbnRyaWVzKCkpIHtcbiAgICAgICAgcmVjW1N0cmluZyhrZXkpXSA9IHByb2Nlc3MoZW50cnkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlYztcbiAgICB9XG5cbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTZXQpIHtcbiAgICAgIHNldHMucHVzaChpZHgpO1xuICAgICAgY29uc3Qgc2l6ZSA9IHZhbHVlLnNpemU7XG4gICAgICBjb25zdCByZXN1bHQgPSBuZXcgQXJyYXkoc2l6ZSk7XG4gICAgICBsZXQgaSA9IDA7XG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHZhbHVlKSB7XG4gICAgICAgIHJlc3VsdFtpXSA9IHByb2Nlc3MoZW50cnkpO1xuICAgICAgICBpICs9IDE7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIGNvbnN0IHJlYzogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHZhbHVlKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBrZXkgPSBrZXlzW2ldO1xuICAgICAgICByZWNba2V5XSA9IHByb2Nlc3ModmFsdWVba2V5XSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVjO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgdmFsdWUgaW4gc2VyaWFsaXphdGlvbjogJHt2YWx1ZX1gKTtcbiAgfVxuXG4gIGNvbnN0IHBheWxvYWQgPSBwcm9jZXNzKGRhdGEpO1xuICByZXR1cm4gW1tyZWZzLCBkYXRlcywgc2V0cywgbWFwc10sIHBheWxvYWRdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERlc2VyaWFsaXphdGlvbk9wdGlvbnMge1xuICBjb2VyY2VOdWxsc1RvVW5kZWZpbmVkPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlc2VyaWFsaXplPERhdGEgZXh0ZW5kcyBTZXJpYWxpemFibGUgPSBTZXJpYWxpemFibGU+KFxuICBwYXlsb2FkOiBTZXJpYWxpemVkLFxuICBvcHRpb25zPzogRGVzZXJpYWxpemF0aW9uT3B0aW9uc1xuKTogRGF0YSB7XG4gIGNvbnN0IFtbcmVmc0EsIGRhdGVzQSwgc2V0c0EsIG1hcHNBXSwgZGF0YV0gPSBwYXlsb2FkO1xuXG4gIGNvbnN0IHJlZnMgPSBuZXcgU2V0KHJlZnNBKTtcbiAgY29uc3QgZGF0ZXMgPSBuZXcgU2V0KGRhdGVzQSk7XG4gIGNvbnN0IHNldHMgPSBuZXcgU2V0KHNldHNBKTtcbiAgY29uc3QgbWFwcyA9IG5ldyBTZXQobWFwc0EpO1xuXG4gIGNvbnN0IG9iamVjdHM6IEFycmF5PGFueT4gPSBbXTtcblxuICBmdW5jdGlvbiByZWNvbnN0cnVjdCh2YWx1ZTogUGxhaW5KU09OKTogYW55IHtcbiAgICBjb25zdCBpZHggPSBvYmplY3RzLmxlbmd0aDtcbiAgICBpZiAocmVmcy5oYXMoaWR4KSkge1xuICAgICAgLy8gV2UgaW5jcmVtZW50IHRoZSBjb3VudGVyIG9uIHJlZnMgZHVyaW5nIHNlcmlhbGl6YXRpb24uIFdlJ3JlIG5ldmVyXG4gICAgICAvLyBnb2luZyB0byB1c2UgdGhpcyBlbnRyeSwgc28gd2UgY2FuIGp1c3QgcHVzaCBudWxsLlxuICAgICAgb2JqZWN0cy5wdXNoKG51bGwpO1xuICAgICAgcmV0dXJuIG9iamVjdHNbdmFsdWUgYXMgbnVtYmVyXTtcbiAgICB9XG5cbiAgICBpZiAoZGF0ZXMuaGFzKGlkeCkpIHtcbiAgICAgIGNvbnN0IGR0ID0gbmV3IERhdGUodmFsdWUgYXMgbnVtYmVyKTtcbiAgICAgIG9iamVjdHMucHVzaChkdCk7XG4gICAgICByZXR1cm4gZHQ7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgdmFsdWUgPT0gbnVsbCB8fFxuICAgICAgdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiIHx8XG4gICAgICB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHxcbiAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCJcbiAgICApIHtcbiAgICAgIGlmIChvcHRpb25zPy5jb2VyY2VOdWxsc1RvVW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA/PyB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBpZiAoc2V0cy5oYXMoaWR4KSkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgU2V0KCk7XG4gICAgICAgIG9iamVjdHMucHVzaChyZXN1bHQpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgcmVzdWx0LmFkZChyZWNvbnN0cnVjdCh2YWx1ZVtpXSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGxlbmd0aCA9IHZhbHVlLmxlbmd0aDtcbiAgICAgIGNvbnN0IGFyciA9IG5ldyBBcnJheShsZW5ndGgpO1xuICAgICAgb2JqZWN0cy5wdXNoKGFycik7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGFycltpXSA9IHJlY29uc3RydWN0KHZhbHVlW2ldKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnI7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgaWYgKG1hcHMuaGFzKGlkeCkpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IE1hcDxzdHJpbmcsIGFueT4oKTtcbiAgICAgICAgb2JqZWN0cy5wdXNoKHJlc3VsdCk7XG4gICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh2YWx1ZSk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGtleSA9IGtleXNbaV07XG4gICAgICAgICAgcmVzdWx0LnNldChrZXksIHJlY29uc3RydWN0KHZhbHVlW2tleV0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICAgIG9iamVjdHMucHVzaChyZXN1bHQpO1xuICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHZhbHVlKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBrZXkgPSBrZXlzW2ldO1xuICAgICAgICByZXN1bHRba2V5XSA9IHJlY29uc3RydWN0KHZhbHVlW2tleV0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHZhbHVlIGluIGRlc2VyaWFsaXphdGlvbjogJHt2YWx1ZX1gKTtcbiAgfVxuXG4gIHJldHVybiByZWNvbnN0cnVjdChkYXRhKTtcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBSb3V0ZUluZm8gfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5pbXBvcnQgdHlwZSB7IFZET00sIFZET01VcGRhdGUgfSBmcm9tIFwiLi92ZG9tXCI7XG5pbXBvcnQgeyBleHRyYWN0RXZlbnQgfSBmcm9tIFwiLi9zZXJpYWxpemUvZXZlbnRzXCI7XG5pbXBvcnQgeyBzZXJpYWxpemUsIGRlc2VyaWFsaXplIH0gZnJvbSBcIi4vc2VyaWFsaXplL3NlcmlhbGl6ZXJcIjtcblxuaW1wb3J0IHsgaW8sIFNvY2tldCB9IGZyb20gXCJzb2NrZXQuaW8tY2xpZW50XCI7XG5pbXBvcnQgdHlwZSB7XG4gIENsaWVudEFwaVJlc3VsdE1lc3NhZ2UsXG4gIENsaWVudENoYW5uZWxNZXNzYWdlLFxuICBDbGllbnRNZXNzYWdlLFxuICBTZXJ2ZXJBcGlDYWxsTWVzc2FnZSxcbiAgU2VydmVyQ2hhbm5lbE1lc3NhZ2UsXG4gIFNlcnZlckVycm9ySW5mbyxcbiAgU2VydmVyTWVzc2FnZSxcbn0gZnJvbSBcIi4vbWVzc2FnZXNcIjtcbmltcG9ydCB0eXBlIHsgTmF2aWdhdGVGdW5jdGlvbiB9IGZyb20gXCJyZWFjdC1yb3V0ZXJcIjtcbmltcG9ydCB0eXBlIHsgQ2hhbm5lbEJyaWRnZSB9IGZyb20gXCIuL2NoYW5uZWxcIjtcbmltcG9ydCB7IGNyZWF0ZUNoYW5uZWxCcmlkZ2UsIFB1bHNlQ2hhbm5lbFJlc2V0RXJyb3IgfSBmcm9tIFwiLi9jaGFubmVsXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW91bnRlZFZpZXcge1xuICByb3V0ZUluZm86IFJvdXRlSW5mbztcbiAgb25Jbml0OiAoXG4gICAgdmRvbTogVkRPTSxcbiAgICBjYWxsYmFja3M6IHN0cmluZ1tdLFxuICAgIHJlbmRlclByb3BzOiBzdHJpbmdbXSxcbiAgICBjc3NSZWZzOiBzdHJpbmdbXVxuICApID0+IHZvaWQ7XG4gIG9uVXBkYXRlOiAob3BzOiBWRE9NVXBkYXRlW10pID0+IHZvaWQ7XG59XG5leHBvcnQgdHlwZSBDb25uZWN0aW9uU3RhdHVzTGlzdGVuZXIgPSAoY29ubmVjdGVkOiBib29sZWFuKSA9PiB2b2lkO1xuZXhwb3J0IHR5cGUgU2VydmVyRXJyb3JMaXN0ZW5lciA9IChcbiAgcGF0aDogc3RyaW5nLFxuICBlcnJvcjogU2VydmVyRXJyb3JJbmZvIHwgbnVsbFxuKSA9PiB2b2lkO1xuXG5leHBvcnQgaW50ZXJmYWNlIFB1bHNlQ2xpZW50IHtcbiAgLy8gQ29ubmVjdGlvbiBtYW5hZ2VtZW50XG4gIGNvbm5lY3QoKTogUHJvbWlzZTx2b2lkPjtcbiAgZGlzY29ubmVjdCgpOiB2b2lkO1xuICBpc0Nvbm5lY3RlZCgpOiBib29sZWFuO1xuICBvbkNvbm5lY3Rpb25DaGFuZ2UobGlzdGVuZXI6IENvbm5lY3Rpb25TdGF0dXNMaXN0ZW5lcik6ICgpID0+IHZvaWQ7XG4gIC8vIE1lc3NhZ2VzXG4gIG5hdmlnYXRlKHBhdGg6IHN0cmluZywgcm91dGVJbmZvOiBSb3V0ZUluZm8pOiBQcm9taXNlPHZvaWQ+O1xuICBsZWF2ZShwYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xuICBpbnZva2VDYWxsYmFjayhwYXRoOiBzdHJpbmcsIGNhbGxiYWNrOiBzdHJpbmcsIGFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPjtcbiAgLy8gVkRPTSBzdWJzY3JpcHRpb25cbiAgbW91bnRWaWV3KHBhdGg6IHN0cmluZywgdmlldzogTW91bnRlZFZpZXcpOiAoKSA9PiB2b2lkO1xufVxuXG5leHBvcnQgY2xhc3MgUHVsc2VTb2NrZXRJT0NsaWVudCB7XG4gIHByaXZhdGUgYWN0aXZlVmlld3M6IE1hcDxzdHJpbmcsIE1vdW50ZWRWaWV3PjtcbiAgcHJpdmF0ZSBzb2NrZXQ6IFNvY2tldCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIG1lc3NhZ2VRdWV1ZTogQ2xpZW50TWVzc2FnZVtdO1xuICBwcml2YXRlIGNvbm5lY3Rpb25MaXN0ZW5lcnM6IFNldDxDb25uZWN0aW9uU3RhdHVzTGlzdGVuZXI+ID0gbmV3IFNldCgpO1xuICBwcml2YXRlIHNlcnZlckVycm9yczogTWFwPHN0cmluZywgU2VydmVyRXJyb3JJbmZvPiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBzZXJ2ZXJFcnJvckxpc3RlbmVyczogU2V0PFNlcnZlckVycm9yTGlzdGVuZXI+ID0gbmV3IFNldCgpO1xuICBwcml2YXRlIGNoYW5uZWxzOiBNYXA8c3RyaW5nLCB7IGJyaWRnZTogQ2hhbm5lbEJyaWRnZTsgcmVmQ291bnQ6IG51bWJlciB9PiA9XG4gICAgbmV3IE1hcCgpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgdXJsOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSByZW5kZXJJZDogc3RyaW5nLFxuICAgIHByaXZhdGUgZnJhbWV3b3JrTmF2aWdhdGU6IE5hdmlnYXRlRnVuY3Rpb25cbiAgKSB7XG4gICAgdGhpcy5zb2NrZXQgPSBudWxsO1xuICAgIHRoaXMuYWN0aXZlVmlld3MgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5tZXNzYWdlUXVldWUgPSBbXTtcbiAgfVxuICBwdWJsaWMgaXNDb25uZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc29ja2V0Py5jb25uZWN0ZWQgPz8gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgY29ubmVjdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5zb2NrZXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHNvY2tldCA9IGlvKHRoaXMudXJsLCB7XG4gICAgICAgIHRyYW5zcG9ydHM6IFtcIndlYnNvY2tldFwiLCBcIndlYnRyYW5zcG9ydFwiXSxcbiAgICAgICAgYXV0aDogeyByZW5kZXJJZDogdGhpcy5yZW5kZXJJZCB9LFxuICAgICAgfSk7XG4gICAgICB0aGlzLnNvY2tldCA9IHNvY2tldDtcblxuICAgICAgc29ja2V0Lm9uKFwiY29ubmVjdFwiLCAoKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiW1NvY2tldElPVHJhbnNwb3J0XSBDb25uZWN0ZWQ6XCIsIHRoaXMuc29ja2V0Py5pZCk7XG4gICAgICAgIC8vIE1ha2Ugc3VyZSB0byBzZW5kIGEgbmF2aWdhdGUgcGF5bG9hZCBmb3IgYWxsIHRoZSByb3V0ZXNcbiAgICAgICAgZm9yIChjb25zdCBbcGF0aCwgcm91dGVdIG9mIHRoaXMuYWN0aXZlVmlld3MpIHtcbiAgICAgICAgICBzb2NrZXQuZW1pdChcbiAgICAgICAgICAgIFwibWVzc2FnZVwiLFxuICAgICAgICAgICAgc2VyaWFsaXplKHtcbiAgICAgICAgICAgICAgdHlwZTogXCJtb3VudFwiLFxuICAgICAgICAgICAgICBwYXRoOiBwYXRoLFxuICAgICAgICAgICAgICByb3V0ZUluZm86IHJvdXRlLnJvdXRlSW5mbyxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgcGF5bG9hZCBvZiB0aGlzLm1lc3NhZ2VRdWV1ZSkge1xuICAgICAgICAgIC8vIEFscmVhZHkgc2VudCBhYm92ZVxuICAgICAgICAgIGlmIChwYXlsb2FkLnR5cGUgPT09IFwibW91bnRcIiAmJiB0aGlzLmFjdGl2ZVZpZXdzLmhhcyhwYXlsb2FkLnBhdGgpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gV2UncmUgcmVtb3VudGluZyBhbGwgdGhlIHJvdXRlcywgc28gbm8gbmVlZCB0byBuYXZpZ2F0ZVxuICAgICAgICAgIGlmIChwYXlsb2FkLnR5cGUgPT09IFwibmF2aWdhdGVcIikge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNvY2tldC5lbWl0KFwibWVzc2FnZVwiLCBzZXJpYWxpemUocGF5bG9hZCkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWVzc2FnZVF1ZXVlID0gW107XG5cbiAgICAgICAgdGhpcy5ub3RpZnlDb25uZWN0aW9uTGlzdGVuZXJzKHRydWUpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9KTtcblxuICAgICAgc29ja2V0Lm9uKFwiY29ubmVjdF9lcnJvclwiLCAoZXJyKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJbU29ja2V0SU9UcmFuc3BvcnRdIENvbm5lY3Rpb24gZmFpbGVkOlwiLCBlcnIpO1xuICAgICAgICB0aGlzLm5vdGlmeUNvbm5lY3Rpb25MaXN0ZW5lcnMoZmFsc2UpO1xuICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgIH0pO1xuXG4gICAgICBzb2NrZXQub24oXCJkaXNjb25uZWN0XCIsICgpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coXCJbU29ja2V0SU9UcmFuc3BvcnRdIERpc2Nvbm5lY3RlZFwiKTtcbiAgICAgICAgdGhpcy5oYW5kbGVUcmFuc3BvcnREaXNjb25uZWN0KCk7XG4gICAgICAgIHRoaXMubm90aWZ5Q29ubmVjdGlvbkxpc3RlbmVycyhmYWxzZSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gV3JhcCBpbiBhbiBhcnJvdyBmdW5jdGlvbiB0byBhdm9pZCBsb3NpbmcgdGhlIGB0aGlzYCByZWZlcmVuY2VcbiAgICAgIHNvY2tldC5vbihcIm1lc3NhZ2VcIiwgKGRhdGEpID0+XG4gICAgICAgIHRoaXMuaGFuZGxlU2VydmVyTWVzc2FnZShcbiAgICAgICAgICBkZXNlcmlhbGl6ZShkYXRhLCB7IGNvZXJjZU51bGxzVG9VbmRlZmluZWQ6IHRydWUgfSlcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIG9uQ29ubmVjdGlvbkNoYW5nZShsaXN0ZW5lcjogQ29ubmVjdGlvblN0YXR1c0xpc3RlbmVyKTogKCkgPT4gdm9pZCB7XG4gICAgdGhpcy5jb25uZWN0aW9uTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7XG4gICAgbGlzdGVuZXIodGhpcy5pc0Nvbm5lY3RlZCgpKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgdGhpcy5jb25uZWN0aW9uTGlzdGVuZXJzLmRlbGV0ZShsaXN0ZW5lcik7XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgbm90aWZ5Q29ubmVjdGlvbkxpc3RlbmVycyhjb25uZWN0ZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIHRoaXMuY29ubmVjdGlvbkxpc3RlbmVycykge1xuICAgICAgbGlzdGVuZXIoY29ubmVjdGVkKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25TZXJ2ZXJFcnJvcihsaXN0ZW5lcjogU2VydmVyRXJyb3JMaXN0ZW5lcik6ICgpID0+IHZvaWQge1xuICAgIHRoaXMuc2VydmVyRXJyb3JMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTtcbiAgICAvLyBFbWl0IGN1cnJlbnQgZXJyb3JzIHRvIG5ldyBsaXN0ZW5lclxuICAgIGZvciAoY29uc3QgW3BhdGgsIGVycl0gb2YgdGhpcy5zZXJ2ZXJFcnJvcnMpIGxpc3RlbmVyKHBhdGgsIGVycik7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHRoaXMuc2VydmVyRXJyb3JMaXN0ZW5lcnMuZGVsZXRlKGxpc3RlbmVyKTtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBub3RpZnlTZXJ2ZXJFcnJvcihwYXRoOiBzdHJpbmcsIGVycm9yOiBTZXJ2ZXJFcnJvckluZm8gfCBudWxsKSB7XG4gICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLnNlcnZlckVycm9yTGlzdGVuZXJzKSBsaXN0ZW5lcihwYXRoLCBlcnJvcik7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNlbmRNZXNzYWdlKHBheWxvYWQ6IENsaWVudE1lc3NhZ2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5pc0Nvbm5lY3RlZCgpKSB7XG4gICAgICAvLyBjb25zb2xlLmxvZyhcIltTb2NrZXRJT1RyYW5zcG9ydF0gU2VuZGluZzpcIiwgcGF5bG9hZCk7XG4gICAgICB0aGlzLnNvY2tldCEuZW1pdChcIm1lc3NhZ2VcIiwgc2VyaWFsaXplKHBheWxvYWQgYXMgYW55KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKFwiW1NvY2tldElPVHJhbnNwb3J0XSBRdWV1aW5nIG1lc3NhZ2U6XCIsIHBheWxvYWQpO1xuICAgICAgdGhpcy5tZXNzYWdlUXVldWUucHVzaChwYXlsb2FkKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc2VuZENoYW5uZWxNZXNzYWdlKFxuICAgIG1lc3NhZ2U6IENsaWVudENoYW5uZWxNZXNzYWdlXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuc2VuZE1lc3NhZ2UobWVzc2FnZSk7XG4gIH1cblxuICBwdWJsaWMgbW91bnRWaWV3KHBhdGg6IHN0cmluZywgdmlldzogTW91bnRlZFZpZXcpIHtcbiAgICBpZiAodGhpcy5hY3RpdmVWaWV3cy5oYXMocGF0aCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUGF0aCAke3BhdGh9IGlzIGFscmVhZHkgbW91bnRlZGApO1xuICAgIH1cbiAgICB0aGlzLmFjdGl2ZVZpZXdzLnNldChwYXRoLCB2aWV3KTtcbiAgICB2b2lkIHRoaXMuc2VuZE1lc3NhZ2Uoe1xuICAgICAgdHlwZTogXCJtb3VudFwiLFxuICAgICAgcGF0aCxcbiAgICAgIHJvdXRlSW5mbzogdmlldy5yb3V0ZUluZm8sXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgbmF2aWdhdGUocGF0aDogc3RyaW5nLCByb3V0ZUluZm86IFJvdXRlSW5mbykge1xuICAgIGF3YWl0IHRoaXMuc2VuZE1lc3NhZ2Uoe1xuICAgICAgdHlwZTogXCJuYXZpZ2F0ZVwiLFxuICAgICAgcGF0aCxcbiAgICAgIHJvdXRlSW5mbyxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyB1bm1vdW50KHBhdGg6IHN0cmluZykge1xuICAgIHZvaWQgdGhpcy5zZW5kTWVzc2FnZSh7IHR5cGU6IFwidW5tb3VudFwiLCBwYXRoIH0pO1xuICAgIHRoaXMuYWN0aXZlVmlld3MuZGVsZXRlKHBhdGgpO1xuICB9XG5cbiAgcHVibGljIGRpc2Nvbm5lY3QoKSB7XG4gICAgdGhpcy5zb2NrZXQ/LmRpc2Nvbm5lY3QoKTtcbiAgICB0aGlzLnNvY2tldCA9IG51bGw7XG4gICAgdGhpcy5tZXNzYWdlUXVldWUgPSBbXTtcbiAgICB0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lcnMuY2xlYXIoKTtcbiAgICB0aGlzLmFjdGl2ZVZpZXdzLmNsZWFyKCk7XG4gICAgdGhpcy5zZXJ2ZXJFcnJvcnMuY2xlYXIoKTtcbiAgICB0aGlzLnNlcnZlckVycm9yTGlzdGVuZXJzLmNsZWFyKCk7XG4gICAgZm9yIChjb25zdCB7IGJyaWRnZSB9IG9mIHRoaXMuY2hhbm5lbHMudmFsdWVzKCkpIHtcbiAgICAgIGJyaWRnZS5kaXNwb3NlKG5ldyBQdWxzZUNoYW5uZWxSZXNldEVycm9yKFwiQ2xpZW50IGRpc2Nvbm5lY3RlZFwiKSk7XG4gICAgfVxuICAgIHRoaXMuY2hhbm5lbHMuY2xlYXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlU2VydmVyTWVzc2FnZShtZXNzYWdlOiBTZXJ2ZXJNZXNzYWdlKSB7XG4gICAgLy8gY29uc29sZS5sb2coXCJbUHVsc2VDbGllbnRdIFJlY2VpdmVkIG1lc3NhZ2U6XCIsIG1lc3NhZ2UpO1xuICAgIHN3aXRjaCAobWVzc2FnZS50eXBlKSB7XG4gICAgICBjYXNlIFwidmRvbV9pbml0XCI6IHtcbiAgICAgICAgY29uc3Qgcm91dGUgPSB0aGlzLmFjdGl2ZVZpZXdzLmdldChtZXNzYWdlLnBhdGgpO1xuICAgICAgICAvLyBJZ25vcmUgbWVzc2FnZXMgZm9yIHBhdGhzIHRoYXQgYXJlIG5vdCBtb3VudGVkXG4gICAgICAgIGlmICghcm91dGUpIHJldHVybjtcbiAgICAgICAgaWYgKHJvdXRlKSB7XG4gICAgICAgICAgcm91dGUub25Jbml0KFxuICAgICAgICAgICAgbWVzc2FnZS52ZG9tLFxuICAgICAgICAgICAgbWVzc2FnZS5jYWxsYmFja3MsXG4gICAgICAgICAgICBtZXNzYWdlLnJlbmRlcl9wcm9wcyxcbiAgICAgICAgICAgIG1lc3NhZ2UuY3NzX3JlZnNcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIC8vIENsZWFyIGFueSBwcmlvciBlcnJvciBmb3IgdGhpcyBwYXRoIG9uIHN1Y2Nlc3NmdWwgaW5pdFxuICAgICAgICBpZiAodGhpcy5zZXJ2ZXJFcnJvcnMuaGFzKG1lc3NhZ2UucGF0aCkpIHtcbiAgICAgICAgICB0aGlzLnNlcnZlckVycm9ycy5kZWxldGUobWVzc2FnZS5wYXRoKTtcbiAgICAgICAgICB0aGlzLm5vdGlmeVNlcnZlckVycm9yKG1lc3NhZ2UucGF0aCwgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFwidmRvbV91cGRhdGVcIjoge1xuICAgICAgICBjb25zdCByb3V0ZSA9IHRoaXMuYWN0aXZlVmlld3MuZ2V0KG1lc3NhZ2UucGF0aCk7XG4gICAgICAgIGlmICghcm91dGUpIHJldHVybjsgLy8gTm90IGFuIGFjdGl2ZSBwYXRoOyBkaXNjYXJkXG4gICAgICAgIHJvdXRlLm9uVXBkYXRlKG1lc3NhZ2Uub3BzKTtcbiAgICAgICAgLy8gQ2xlYXIgYW55IHByaW9yIGVycm9yIGZvciB0aGlzIHBhdGggb24gc3VjY2Vzc2Z1bCB1cGRhdGVcbiAgICAgICAgaWYgKHRoaXMuc2VydmVyRXJyb3JzLmhhcyhtZXNzYWdlLnBhdGgpKSB7XG4gICAgICAgICAgdGhpcy5zZXJ2ZXJFcnJvcnMuZGVsZXRlKG1lc3NhZ2UucGF0aCk7XG4gICAgICAgICAgdGhpcy5ub3RpZnlTZXJ2ZXJFcnJvcihtZXNzYWdlLnBhdGgsIG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBcInNlcnZlcl9lcnJvclwiOiB7XG4gICAgICAgIGlmICghdGhpcy5hY3RpdmVWaWV3cy5oYXMobWVzc2FnZS5wYXRoKSkgcmV0dXJuOyAvLyBkaXNjYXJkIGZvciBpbmFjdGl2ZSBwYXRoc1xuICAgICAgICB0aGlzLnNlcnZlckVycm9ycy5zZXQobWVzc2FnZS5wYXRoLCBtZXNzYWdlLmVycm9yKTtcbiAgICAgICAgdGhpcy5ub3RpZnlTZXJ2ZXJFcnJvcihtZXNzYWdlLnBhdGgsIG1lc3NhZ2UuZXJyb3IpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJhcGlfY2FsbFwiOiB7XG4gICAgICAgIHZvaWQgdGhpcy5wZXJmb3JtQXBpQ2FsbChtZXNzYWdlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFwibmF2aWdhdGVfdG9cIjoge1xuICAgICAgICAvLyBgbmF2aWdhdGVfdG9gIGlzIG5hdmlnYXRpb25hbDsgYWxsb3cgcmVnYXJkbGVzcyBvZiBhY3RpdmVWaWV3cyBtZW1iZXJzaGlwXG4gICAgICAgIGNvbnN0IHJlcGxhY2UgPSAhIW1lc3NhZ2UucmVwbGFjZTtcbiAgICAgICAgbGV0IGRlc3QgPSBtZXNzYWdlLnBhdGggfHwgXCJcIjtcbiAgICAgICAgLy8gTm9ybWFsaXplIHByb3RvY29sLXJlbGF0aXZlIFVSTHMgdG8gYWJzb2x1dGVcbiAgICAgICAgaWYgKGRlc3Quc3RhcnRzV2l0aChcIi8vXCIpKSBkZXN0ID0gYCR7d2luZG93LmxvY2F0aW9uLnByb3RvY29sfSR7ZGVzdH1gO1xuICAgICAgICBjb25zdCBoYXNTY2hlbWUgPSAvXlthLXpBLVpdW2EtekEtWjAtOSsuLV0qOi8udGVzdChkZXN0KTtcbiAgICAgICAgaWYgKGhhc1NjaGVtZSkge1xuICAgICAgICAgIGlmIChkZXN0LnN0YXJ0c1dpdGgoXCJodHRwOi8vXCIpIHx8IGRlc3Quc3RhcnRzV2l0aChcImh0dHBzOi8vXCIpKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKGRlc3QpO1xuICAgICAgICAgICAgICBpZiAodXJsLm9yaWdpbiA9PT0gd2luZG93LmxvY2F0aW9uLm9yaWdpbikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGludGVybmFsID0gYCR7dXJsLnBhdGhuYW1lfSR7dXJsLnNlYXJjaH0ke3VybC5oYXNofWA7XG4gICAgICAgICAgICAgICAgdGhpcy5mcmFtZXdvcmtOYXZpZ2F0ZShpbnRlcm5hbCwgeyByZXBsYWNlIH0pO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChyZXBsYWNlKSB3aW5kb3cubG9jYXRpb24ucmVwbGFjZShkZXN0KTtcbiAgICAgICAgICAgICAgICBlbHNlIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oZGVzdCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICBpZiAocmVwbGFjZSkgd2luZG93LmxvY2F0aW9uLnJlcGxhY2UoZGVzdCk7XG4gICAgICAgICAgICAgIGVsc2Ugd2luZG93LmxvY2F0aW9uLmFzc2lnbihkZXN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gbWFpbHRvOiwgdGVsOiwgZGF0YTosIGV0Yy5cbiAgICAgICAgICAgIGlmIChyZXBsYWNlKSB3aW5kb3cubG9jYXRpb24ucmVwbGFjZShkZXN0KTtcbiAgICAgICAgICAgIGVsc2Ugd2luZG93LmxvY2F0aW9uLmFzc2lnbihkZXN0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gUmVsYXRpdmUgb3Igcm9vdC1yZWxhdGl2ZSBwYXRoIOKGkiBTUEEgbmF2aWdhdGVcbiAgICAgICAgICB0aGlzLmZyYW1ld29ya05hdmlnYXRlKGRlc3QsIHsgcmVwbGFjZSB9KTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJjaGFubmVsX21lc3NhZ2VcIjoge1xuICAgICAgICB0aGlzLnJvdXRlQ2hhbm5lbE1lc3NhZ2UobWVzc2FnZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiVW5leHBlY3RlZCBtZXNzYWdlOlwiLCBtZXNzYWdlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHBlcmZvcm1BcGlDYWxsKG1zZzogU2VydmVyQXBpQ2FsbE1lc3NhZ2UpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2gobXNnLnVybCwge1xuICAgICAgICBtZXRob2Q6IG1zZy5tZXRob2QgfHwgXCJHRVRcIixcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgIC4uLihtc2cuaGVhZGVycyB8fCB7fSksXG4gICAgICAgICAgLi4uKG1zZy5ib2R5ICE9IG51bGwgJiYgIShcImNvbnRlbnQtdHlwZVwiIGluIChtc2cuaGVhZGVycyB8fCB7fSkpXG4gICAgICAgICAgICA/IHsgXCJjb250ZW50LXR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIgfVxuICAgICAgICAgICAgOiB7fSksXG4gICAgICAgIH0sXG4gICAgICAgIGJvZHk6XG4gICAgICAgICAgbXNnLmJvZHkgIT0gbnVsbFxuICAgICAgICAgICAgPyB0eXBlb2YgbXNnLmJvZHkgPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgICAgPyBtc2cuYm9keVxuICAgICAgICAgICAgICA6IEpTT04uc3RyaW5naWZ5KG1zZy5ib2R5KVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIGNyZWRlbnRpYWxzOiBtc2cuY3JlZGVudGlhbHMgfHwgXCJpbmNsdWRlXCIsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGhlYWRlcnNPYmo6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICAgIHJlcy5oZWFkZXJzLmZvckVhY2goKHYsIGspID0+IChoZWFkZXJzT2JqW2tdID0gdikpO1xuICAgICAgbGV0IGJvZHk6IGFueSA9IG51bGw7XG4gICAgICBjb25zdCBjdCA9IHJlcy5oZWFkZXJzLmdldChcImNvbnRlbnQtdHlwZVwiKSB8fCBcIlwiO1xuICAgICAgaWYgKGN0LmluY2x1ZGVzKFwiYXBwbGljYXRpb24vanNvblwiKSkge1xuICAgICAgICBib2R5ID0gYXdhaXQgcmVzLmpzb24oKS5jYXRjaCgoKSA9PiBudWxsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJvZHkgPSBhd2FpdCByZXMudGV4dCgpLmNhdGNoKCgpID0+IG51bGwpO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVwbHk6IENsaWVudEFwaVJlc3VsdE1lc3NhZ2UgPSB7XG4gICAgICAgIHR5cGU6IFwiYXBpX3Jlc3VsdFwiLFxuICAgICAgICBpZDogbXNnLmlkLFxuICAgICAgICBvazogcmVzLm9rLFxuICAgICAgICBzdGF0dXM6IHJlcy5zdGF0dXMsXG4gICAgICAgIGhlYWRlcnM6IGhlYWRlcnNPYmosXG4gICAgICAgIGJvZHksXG4gICAgICB9O1xuICAgICAgYXdhaXQgdGhpcy5zZW5kTWVzc2FnZShyZXBseSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zdCByZXBseTogQ2xpZW50QXBpUmVzdWx0TWVzc2FnZSA9IHtcbiAgICAgICAgdHlwZTogXCJhcGlfcmVzdWx0XCIsXG4gICAgICAgIGlkOiBtc2cuaWQsXG4gICAgICAgIG9rOiBmYWxzZSxcbiAgICAgICAgc3RhdHVzOiAwLFxuICAgICAgICBoZWFkZXJzOiB7fSxcbiAgICAgICAgYm9keTogeyBlcnJvcjogU3RyaW5nKGVycikgfSxcbiAgICAgIH07XG4gICAgICBhd2FpdCB0aGlzLnNlbmRNZXNzYWdlKHJlcGx5KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgaW52b2tlQ2FsbGJhY2socGF0aDogc3RyaW5nLCBjYWxsYmFjazogc3RyaW5nLCBhcmdzOiBhbnlbXSkge1xuICAgIGF3YWl0IHRoaXMuc2VuZE1lc3NhZ2Uoe1xuICAgICAgdHlwZTogXCJjYWxsYmFja1wiLFxuICAgICAgcGF0aCxcbiAgICAgIGNhbGxiYWNrLFxuICAgICAgYXJnczogYXJncy5tYXAoZXh0cmFjdEV2ZW50KSxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhY3F1aXJlQ2hhbm5lbChpZDogc3RyaW5nKTogQ2hhbm5lbEJyaWRnZSB7XG4gICAgY29uc3QgZW50cnkgPSB0aGlzLmVuc3VyZUNoYW5uZWxFbnRyeShpZCk7XG4gICAgZW50cnkucmVmQ291bnQgKz0gMTtcbiAgICByZXR1cm4gZW50cnkuYnJpZGdlO1xuICB9XG5cbiAgcHVibGljIHJlbGVhc2VDaGFubmVsKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBlbnRyeSA9IHRoaXMuY2hhbm5lbHMuZ2V0KGlkKTtcbiAgICBpZiAoIWVudHJ5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVudHJ5LnJlZkNvdW50ID0gTWF0aC5tYXgoMCwgZW50cnkucmVmQ291bnQgLSAxKTtcbiAgICBpZiAoZW50cnkucmVmQ291bnQgPT09IDApIHtcbiAgICAgIGVudHJ5LmJyaWRnZS5kaXNwb3NlKG5ldyBQdWxzZUNoYW5uZWxSZXNldEVycm9yKFwiQ2hhbm5lbCByZWxlYXNlZFwiKSk7XG4gICAgICB0aGlzLmNoYW5uZWxzLmRlbGV0ZShpZCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBlbnN1cmVDaGFubmVsRW50cnkoaWQ6IHN0cmluZyk6IHtcbiAgICBicmlkZ2U6IENoYW5uZWxCcmlkZ2U7XG4gICAgcmVmQ291bnQ6IG51bWJlcjtcbiAgfSB7XG4gICAgbGV0IGVudHJ5ID0gdGhpcy5jaGFubmVscy5nZXQoaWQpO1xuICAgIGlmICghZW50cnkpIHtcbiAgICAgIGVudHJ5ID0ge1xuICAgICAgICBicmlkZ2U6IGNyZWF0ZUNoYW5uZWxCcmlkZ2UodGhpcywgaWQpLFxuICAgICAgICByZWZDb3VudDogMCxcbiAgICAgIH07XG4gICAgICB0aGlzLmNoYW5uZWxzLnNldChpZCwgZW50cnkpO1xuICAgIH1cbiAgICByZXR1cm4gZW50cnk7XG4gIH1cblxuICBwcml2YXRlIHJvdXRlQ2hhbm5lbE1lc3NhZ2UobWVzc2FnZTogU2VydmVyQ2hhbm5lbE1lc3NhZ2UpOiB2b2lkIHtcbiAgICBjb25zdCBlbnRyeSA9IHRoaXMuZW5zdXJlQ2hhbm5lbEVudHJ5KG1lc3NhZ2UuY2hhbm5lbCk7XG4gICAgY29uc3QgY2xvc2VkID0gZW50cnkuYnJpZGdlLmhhbmRsZVNlcnZlck1lc3NhZ2UobWVzc2FnZSk7XG4gICAgaWYgKGNsb3NlZCAmJiBlbnRyeS5yZWZDb3VudCA9PT0gMCkge1xuICAgICAgdGhpcy5jaGFubmVscy5kZWxldGUobWVzc2FnZS5jaGFubmVsKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVRyYW5zcG9ydERpc2Nvbm5lY3QoKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiB0aGlzLmNoYW5uZWxzLnZhbHVlcygpKSB7XG4gICAgICBlbnRyeS5icmlkZ2UuaGFuZGxlRGlzY29ubmVjdChcbiAgICAgICAgbmV3IFB1bHNlQ2hhbm5lbFJlc2V0RXJyb3IoXCJDb25uZWN0aW9uIGxvc3RcIilcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLy8gcHVibGljIGdldFZET00ocGF0aDogc3RyaW5nKTogVkRPTSB8IG51bGwge1xuICAvLyAgIHJldHVybiB0aGlzLmFjdGl2ZVZpZXdzLmdldChwYXRoKT8udmRvbSA/PyBudWxsO1xuICAvLyB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHtcbiAgU2VydmVyQ2hhbm5lbE1lc3NhZ2UsXG4gIFNlcnZlckNoYW5uZWxSZXF1ZXN0TWVzc2FnZSxcbiAgU2VydmVyQ2hhbm5lbFJlc3BvbnNlTWVzc2FnZSxcbn0gZnJvbSBcIi4vbWVzc2FnZXNcIjtcbmltcG9ydCB0eXBlIHsgUHVsc2VTb2NrZXRJT0NsaWVudCB9IGZyb20gXCIuL2NsaWVudFwiO1xuXG5leHBvcnQgY2xhc3MgUHVsc2VDaGFubmVsUmVzZXRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gXCJQdWxzZUNoYW5uZWxSZXNldEVycm9yXCI7XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgQ2hhbm5lbEV2ZW50SGFuZGxlciA9IChwYXlsb2FkOiBhbnkpID0+IGFueSB8IFByb21pc2U8YW55PjtcblxuaW50ZXJmYWNlIFBlbmRpbmdSZXF1ZXN0IHtcbiAgcmVzb2x2ZTogKHZhbHVlOiBhbnkpID0+IHZvaWQ7XG4gIHJlamVjdDogKGVycm9yOiBhbnkpID0+IHZvaWQ7XG59XG5cbmZ1bmN0aW9uIHJhbmRvbUlkKCk6IHN0cmluZyB7XG4gIGlmICh0eXBlb2YgY3J5cHRvICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiBjcnlwdG8ucmFuZG9tVVVJRCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgcmV0dXJuIGNyeXB0by5yYW5kb21VVUlEKCkucmVwbGFjZSgvLS9nLCBcIlwiKTtcbiAgfVxuICByZXR1cm4gTWF0aC5yYW5kb20oKS50b1N0cmluZygxNikuc2xpY2UoMikgKyBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDE2KS5zbGljZSgyKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0RXJyb3IoZXJyb3I6IHVua25vd24pOiBzdHJpbmcge1xuICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikgcmV0dXJuIGVycm9yLm1lc3NhZ2U7XG4gIGlmICh0eXBlb2YgZXJyb3IgPT09IFwic3RyaW5nXCIpIHJldHVybiBlcnJvcjtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZXJyb3IpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gU3RyaW5nKGVycm9yKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc1NlcnZlclJlc3BvbnNlTWVzc2FnZShcbiAgbWVzc2FnZTogU2VydmVyQ2hhbm5lbE1lc3NhZ2Vcbik6IG1lc3NhZ2UgaXMgU2VydmVyQ2hhbm5lbFJlc3BvbnNlTWVzc2FnZSB7XG4gIHJldHVybiB0eXBlb2YgKG1lc3NhZ2UgYXMgU2VydmVyQ2hhbm5lbFJlc3BvbnNlTWVzc2FnZSkucmVzcG9uc2VUbyA9PT0gXCJzdHJpbmdcIjtcbn1cblxuZnVuY3Rpb24gaXNTZXJ2ZXJSZXF1ZXN0TWVzc2FnZShcbiAgbWVzc2FnZTogU2VydmVyQ2hhbm5lbE1lc3NhZ2Vcbik6IG1lc3NhZ2UgaXMgU2VydmVyQ2hhbm5lbFJlcXVlc3RNZXNzYWdlIHtcbiAgcmV0dXJuIHR5cGVvZiAobWVzc2FnZSBhcyBTZXJ2ZXJDaGFubmVsUmVxdWVzdE1lc3NhZ2UpLmV2ZW50ID09PSBcInN0cmluZ1wiO1xufVxuXG5leHBvcnQgY2xhc3MgQ2hhbm5lbEJyaWRnZSB7XG4gIHByaXZhdGUgaGFuZGxlcnMgPSBuZXcgTWFwPHN0cmluZywgU2V0PENoYW5uZWxFdmVudEhhbmRsZXI+PigpO1xuICBwcml2YXRlIHBlbmRpbmcgPSBuZXcgTWFwPHN0cmluZywgUGVuZGluZ1JlcXVlc3Q+KCk7XG4gIHByaXZhdGUgYmFja2xvZzogU2VydmVyQ2hhbm5lbFJlcXVlc3RNZXNzYWdlW10gPSBbXTtcbiAgcHJpdmF0ZSBjbG9zZWQgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNsaWVudDogUHVsc2VTb2NrZXRJT0NsaWVudCwgcHVibGljIHJlYWRvbmx5IGlkOiBzdHJpbmcpIHt9XG5cbiAgZW1pdChldmVudDogc3RyaW5nLCBwYXlsb2FkPzogYW55KTogdm9pZCB7XG4gICAgdGhpcy5lbnN1cmVPcGVuKCk7XG4gICAgdm9pZCB0aGlzLmNsaWVudC5zZW5kQ2hhbm5lbE1lc3NhZ2Uoe1xuICAgICAgdHlwZTogXCJjaGFubmVsX21lc3NhZ2VcIixcbiAgICAgIGNoYW5uZWw6IHRoaXMuaWQsXG4gICAgICBldmVudCxcbiAgICAgIHBheWxvYWQsXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyByZXF1ZXN0KGV2ZW50OiBzdHJpbmcsIHBheWxvYWQ/OiBhbnkpOiBQcm9taXNlPGFueT4ge1xuICAgIHRoaXMuZW5zdXJlT3BlbigpO1xuICAgIGNvbnN0IHJlcXVlc3RJZCA9IHJhbmRvbUlkKCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMucGVuZGluZy5zZXQocmVxdWVzdElkLCB7IHJlc29sdmUsIHJlamVjdCB9KTtcbiAgICAgIHZvaWQgdGhpcy5jbGllbnRcbiAgICAgICAgLnNlbmRDaGFubmVsTWVzc2FnZSh7XG4gICAgICAgICAgdHlwZTogXCJjaGFubmVsX21lc3NhZ2VcIixcbiAgICAgICAgICBjaGFubmVsOiB0aGlzLmlkLFxuICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgIHRoaXMucGVuZGluZy5kZWxldGUocmVxdWVzdElkKTtcbiAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBvbihldmVudDogc3RyaW5nLCBoYW5kbGVyOiBDaGFubmVsRXZlbnRIYW5kbGVyKTogKCkgPT4gdm9pZCB7XG4gICAgdGhpcy5lbnN1cmVPcGVuKCk7XG4gICAgbGV0IGJ1Y2tldCA9IHRoaXMuaGFuZGxlcnMuZ2V0KGV2ZW50KTtcbiAgICBpZiAoIWJ1Y2tldCkge1xuICAgICAgYnVja2V0ID0gbmV3IFNldCgpO1xuICAgICAgdGhpcy5oYW5kbGVycy5zZXQoZXZlbnQsIGJ1Y2tldCk7XG4gICAgfVxuICAgIGJ1Y2tldC5hZGQoaGFuZGxlcik7XG4gICAgdGhpcy5mbHVzaEJhY2tsb2coZXZlbnQpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBjb25zdCBzZXQgPSB0aGlzLmhhbmRsZXJzLmdldChldmVudCk7XG4gICAgICBpZiAoIXNldCkgcmV0dXJuO1xuICAgICAgc2V0LmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgIGlmIChzZXQuc2l6ZSA9PT0gMCkge1xuICAgICAgICB0aGlzLmhhbmRsZXJzLmRlbGV0ZShldmVudCk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGhhbmRsZVNlcnZlck1lc3NhZ2UobWVzc2FnZTogU2VydmVyQ2hhbm5lbE1lc3NhZ2UpOiBib29sZWFuIHtcbiAgICBpZiAoaXNTZXJ2ZXJSZXNwb25zZU1lc3NhZ2UobWVzc2FnZSkpIHtcbiAgICAgIHRoaXMucmVzb2x2ZVBlbmRpbmcobWVzc2FnZSk7XG4gICAgICByZXR1cm4gdGhpcy5jbG9zZWQ7XG4gICAgfVxuICAgIGlmICh0aGlzLmNsb3NlZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmICghaXNTZXJ2ZXJSZXF1ZXN0TWVzc2FnZShtZXNzYWdlKSkge1xuICAgICAgcmV0dXJuIHRoaXMuY2xvc2VkO1xuICAgIH1cblxuICAgIGlmIChtZXNzYWdlLmV2ZW50ID09PSBcIl9fY2xvc2VfX1wiKSB7XG4gICAgICB0aGlzLmNsb3NlKG5ldyBQdWxzZUNoYW5uZWxSZXNldEVycm9yKFwiQ2hhbm5lbCBjbG9zZWQgYnkgc2VydmVyXCIpKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAobWVzc2FnZS5yZXF1ZXN0SWQpIHtcbiAgICAgIHZvaWQgdGhpcy5kaXNwYXRjaFJlcXVlc3QobWVzc2FnZSBhcyBTZXJ2ZXJDaGFubmVsUmVxdWVzdE1lc3NhZ2UgJiB7XG4gICAgICAgIHJlcXVlc3RJZDogc3RyaW5nO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChtZXNzYWdlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY2xvc2VkO1xuICB9XG5cbiAgaGFuZGxlRGlzY29ubmVjdChyZWFzb246IFB1bHNlQ2hhbm5lbFJlc2V0RXJyb3IpOiB2b2lkIHtcbiAgICB0aGlzLmNsb3NlKHJlYXNvbik7XG4gIH1cblxuICBkaXNwb3NlKHJlYXNvbjogUHVsc2VDaGFubmVsUmVzZXRFcnJvcik6IHZvaWQge1xuICAgIHRoaXMuY2xvc2UocmVhc29uKTtcbiAgfVxuXG4gIHByaXZhdGUgZW5zdXJlT3BlbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jbG9zZWQpIHtcbiAgICAgIHRocm93IG5ldyBQdWxzZUNoYW5uZWxSZXNldEVycm9yKFwiQ2hhbm5lbCBpcyBjbG9zZWRcIik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmbHVzaEJhY2tsb2coZXZlbnQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLmJhY2tsb2cubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgY29uc3QgcmVtYWluaW5nOiBTZXJ2ZXJDaGFubmVsUmVxdWVzdE1lc3NhZ2VbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLmJhY2tsb2cpIHtcbiAgICAgIGlmIChpdGVtLmV2ZW50ID09PSBldmVudCkge1xuICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoaXRlbSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZW1haW5pbmcucHVzaChpdGVtKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5iYWNrbG9nID0gcmVtYWluaW5nO1xuICB9XG5cbiAgcHJpdmF0ZSBkaXNwYXRjaEV2ZW50KG1lc3NhZ2U6IFNlcnZlckNoYW5uZWxSZXF1ZXN0TWVzc2FnZSk6IHZvaWQge1xuICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5oYW5kbGVycy5nZXQobWVzc2FnZS5ldmVudCk7XG4gICAgaWYgKCFoYW5kbGVycyB8fCBoYW5kbGVycy5zaXplID09PSAwKSB7XG4gICAgICB0aGlzLmJhY2tsb2cucHVzaChtZXNzYWdlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIGhhbmRsZXJzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBoYW5kbGVyKG1lc3NhZ2UucGF5bG9hZCk7XG4gICAgICAgIGlmIChyZXN1bHQgJiYgdHlwZW9mIChyZXN1bHQgYXMgUHJvbWlzZTxhbnk+KS50aGVuID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICB2b2lkIChyZXN1bHQgYXMgUHJvbWlzZTxhbnk+KS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiUHVsc2UgY2hhbm5lbCBoYW5kbGVyIGVycm9yXCIsIGVycik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiUHVsc2UgY2hhbm5lbCBoYW5kbGVyIGVycm9yXCIsIGVycik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBkaXNwYXRjaFJlcXVlc3QoXG4gICAgbWVzc2FnZTogU2VydmVyQ2hhbm5lbFJlcXVlc3RNZXNzYWdlICYgeyByZXF1ZXN0SWQ6IHN0cmluZyB9XG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5oYW5kbGVycy5nZXQobWVzc2FnZS5ldmVudCk7XG4gICAgbGV0IHJlc3BvbnNlOiBhbnk7XG4gICAgbGV0IGVycm9yOiBhbnk7XG4gICAgaWYgKGhhbmRsZXJzICYmIGhhbmRsZXJzLnNpemUgPiAwKSB7XG4gICAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgaGFuZGxlcnMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBoYW5kbGVyKG1lc3NhZ2UucGF5bG9hZCk7XG4gICAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCBQcm9taXNlLnJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICBpZiAocmVzcG9uc2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBlcnJvciA9IGVycjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgIGF3YWl0IHRoaXMuY2xpZW50LnNlbmRDaGFubmVsTWVzc2FnZSh7XG4gICAgICAgIHR5cGU6IFwiY2hhbm5lbF9tZXNzYWdlXCIsXG4gICAgICAgIGNoYW5uZWw6IHRoaXMuaWQsXG4gICAgICAgIGV2ZW50OiB1bmRlZmluZWQsXG4gICAgICAgIHJlc3BvbnNlVG86IG1lc3NhZ2UucmVxdWVzdElkLFxuICAgICAgICBlcnJvcjogZm9ybWF0RXJyb3IoZXJyb3IpLFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuY2xpZW50LnNlbmRDaGFubmVsTWVzc2FnZSh7XG4gICAgICB0eXBlOiBcImNoYW5uZWxfbWVzc2FnZVwiLFxuICAgICAgY2hhbm5lbDogdGhpcy5pZCxcbiAgICAgIGV2ZW50OiB1bmRlZmluZWQsXG4gICAgICByZXNwb25zZVRvOiBtZXNzYWdlLnJlcXVlc3RJZCxcbiAgICAgIHBheWxvYWQ6IHJlc3BvbnNlLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlUGVuZGluZyhtZXNzYWdlOiBTZXJ2ZXJDaGFubmVsUmVzcG9uc2VNZXNzYWdlKTogdm9pZCB7XG4gICAgY29uc3QgZW50cnkgPSBtZXNzYWdlLnJlc3BvbnNlVG8gPyB0aGlzLnBlbmRpbmcuZ2V0KG1lc3NhZ2UucmVzcG9uc2VUbykgOiB1bmRlZmluZWQ7XG4gICAgaWYgKCFlbnRyeSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnBlbmRpbmcuZGVsZXRlKG1lc3NhZ2UucmVzcG9uc2VUbyEpO1xuICAgIGlmIChtZXNzYWdlLmVycm9yICE9PSB1bmRlZmluZWQgJiYgbWVzc2FnZS5lcnJvciAhPT0gbnVsbCkge1xuICAgICAgZW50cnkucmVqZWN0KG5ldyBQdWxzZUNoYW5uZWxSZXNldEVycm9yKFN0cmluZyhtZXNzYWdlLmVycm9yKSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbnRyeS5yZXNvbHZlKG1lc3NhZ2UucGF5bG9hZCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjbG9zZShyZWFzb246IFB1bHNlQ2hhbm5lbFJlc2V0RXJyb3IpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jbG9zZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jbG9zZWQgPSB0cnVlO1xuICAgIGZvciAoY29uc3QgcmVxdWVzdCBvZiB0aGlzLnBlbmRpbmcudmFsdWVzKCkpIHtcbiAgICAgIHJlcXVlc3QucmVqZWN0KHJlYXNvbik7XG4gICAgfVxuICAgIHRoaXMucGVuZGluZy5jbGVhcigpO1xuICAgIHRoaXMuaGFuZGxlcnMuY2xlYXIoKTtcbiAgICB0aGlzLmJhY2tsb2cgPSBbXTtcbiAgICAvLyBOby1vcDogb3duaW5nIGNsaWVudCBtYW5hZ2VzIHJlZ2lzdHJ5IGxpZmVjeWNsZS5cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ2hhbm5lbEJyaWRnZShcbiAgY2xpZW50OiBQdWxzZVNvY2tldElPQ2xpZW50LFxuICBpZDogc3RyaW5nXG4pOiBDaGFubmVsQnJpZGdlIHtcbiAgcmV0dXJuIG5ldyBDaGFubmVsQnJpZGdlKGNsaWVudCwgaWQpO1xufVxuIiwKICAgICJpbXBvcnQgeyB1c2VFZmZlY3QsIHVzZU1lbW8gfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IHVzZVB1bHNlQ2xpZW50IH0gZnJvbSBcIi4vcHVsc2VcIjtcbmltcG9ydCB0eXBlIHsgQ2hhbm5lbEJyaWRnZSB9IGZyb20gXCIuL2NoYW5uZWxcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVB1bHNlQ2hhbm5lbChjaGFubmVsSWQ6IHN0cmluZyk6IENoYW5uZWxCcmlkZ2Uge1xuICBjb25zdCBjbGllbnQgPSB1c2VQdWxzZUNsaWVudCgpO1xuICBjb25zdCBicmlkZ2UgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBpZiAoIWNoYW5uZWxJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwidXNlUHVsc2VDaGFubmVsIHJlcXVpcmVzIGEgbm9uLWVtcHR5IGNoYW5uZWxJZFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIGNsaWVudC5hY3F1aXJlQ2hhbm5lbChjaGFubmVsSWQpO1xuICB9LCBbY2xpZW50LCBjaGFubmVsSWRdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBjbGllbnQucmVsZWFzZUNoYW5uZWwoY2hhbm5lbElkKTtcbiAgICB9O1xuICB9LCBbY2xpZW50LCBjaGFubmVsSWRdKTtcblxuICByZXR1cm4gYnJpZGdlO1xufVxuIiwKICAgICJpbXBvcnQgUmVhY3QsIHsgZm9yd2FyZFJlZiwgdXNlQ2FsbGJhY2ssIHR5cGUgRm9ybUV2ZW50IH0gZnJvbSBcInJlYWN0XCI7XG5cbmV4cG9ydCB0eXBlIFB1bHNlRm9ybVByb3BzID0gUmVhY3QuQ29tcG9uZW50UHJvcHNXaXRob3V0UmVmPFwiZm9ybVwiPiAmIHtcbiAgYWN0aW9uOiBzdHJpbmc7XG59O1xuXG4vKipcbiAqIFB1bHNlRm9ybSBpbnRlcmNlcHRzIG5hdGl2ZSBmb3JtIHN1Ym1pc3Npb25zIGFuZCBzZW5kcyB0aGVtIHRocm91Z2ggZmV0Y2ggc28gdGhlXG4gKiBzdXJyb3VuZGluZyBQdWxzZSB2aWV3IHN0YXlzIG1vdW50ZWQuIFNlcnZlci1zaWRlIGhhbmRsZXJzIGFyZSBzdGlsbCBpbnZva2VkIHZpYVxuICogdGhlIGZvcm0gYWN0aW9uIGVuZHBvaW50IGFuZCByZWFjdGl2ZSB1cGRhdGVzIHByb3BhZ2F0ZSBvdmVyIHRoZSBzb2NrZXQuXG4gKi9cbmV4cG9ydCBjb25zdCBQdWxzZUZvcm0gPSBmb3J3YXJkUmVmPEhUTUxGb3JtRWxlbWVudCwgUHVsc2VGb3JtUHJvcHM+KFxuICBmdW5jdGlvbiBQdWxzZUZvcm0oeyBvblN1Ym1pdCwgYWN0aW9uLCAuLi5yZXN0IH0sIHJlZikge1xuICAgIHJldHVybiAoXG4gICAgICA8Zm9ybVxuICAgICAgICB7Li4ucmVzdH1cbiAgICAgICAgYWN0aW9uPXthY3Rpb259XG4gICAgICAgIHJlZj17cmVmfVxuICAgICAgICBvblN1Ym1pdD17dXNlQ2FsbGJhY2soXG4gICAgICAgICAgKGV2ZW50OiBGb3JtRXZlbnQ8SFRNTEZvcm1FbGVtZW50PikgPT5cbiAgICAgICAgICAgIHN1Ym1pdEZvcm0oeyBldmVudCwgYWN0aW9uLCBvblN1Ym1pdCB9KSxcbiAgICAgICAgICBbYWN0aW9uLCBvblN1Ym1pdF1cbiAgICAgICAgKX1cbiAgICAgIC8+XG4gICAgKTtcbiAgfVxuKTtcblxuaW50ZXJmYWNlIFN1Ym1pdEZvcm0ge1xuICBldmVudDogUmVhY3QuRm9ybUV2ZW50PEhUTUxGb3JtRWxlbWVudD47XG4gIGFjdGlvbjogc3RyaW5nO1xuICBvblN1Ym1pdD86IFB1bHNlRm9ybVByb3BzW1wib25TdWJtaXRcIl07XG4gIGZvcm1EYXRhPzogRm9ybURhdGE7XG4gIGZvcmNlPzogYm9vbGVhblxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3VibWl0Rm9ybSh7XG4gIGV2ZW50LFxuICBhY3Rpb24sXG4gIG9uU3VibWl0LFxuICBmb3JtRGF0YSxcbiAgZm9yY2Vcbn06IFN1Ym1pdEZvcm0pIHtcbiAgb25TdWJtaXQ/LihldmVudCk7XG4gIGlmICghZm9yY2UgJiYgZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBmb3JtID0gZXZlbnQuY3VycmVudFRhcmdldDtcbiAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgY29uc3QgbmF0aXZlRXZlbnQgPSBldmVudC5uYXRpdmVFdmVudCBhcyBTdWJtaXRFdmVudDtcbiAgaWYgKCFmb3JtRGF0YSkge1xuICAgIGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKGZvcm0sIG5hdGl2ZUV2ZW50LnN1Ym1pdHRlcik7XG4gIH1cbiAgY29uc3QgdXJsID0gbmV3IFVSTChhY3Rpb24sIHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAvLyBSZXF1aXJlZCBmb3Igb3VyIGhvc3Rpbmcgc2NlbmFyaW9zIG9mIHNhbWUgaG9zdCArIGRpZmZlcmVudCBwb3J0cyBvciAyIHN1YmRvbWFpbnNcbiAgICAgIGNyZWRlbnRpYWxzOiBcImluY2x1ZGVcIixcbiAgICAgIGJvZHk6IGZvcm1EYXRhLFxuICAgIH0pO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiW1B1bHNlXSBGb3JtIHN1Ym1pc3Npb24gZmFpbGVkXCIsIGVycik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgaW8sIFNvY2tldCB9IGZyb20gXCJzb2NrZXQuaW8tY2xpZW50XCI7XG5pbXBvcnQgdHlwZSB7IFNlcnZlck1lc3NhZ2UsIENsaWVudE1lc3NhZ2UgfSBmcm9tIFwiLi9tZXNzYWdlc1wiO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVHJhbnNwb3J0IEFic3RyYWN0aW9uXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgdHlwZSBNZXNzYWdlTGlzdGVuZXIgPSAobWVzc2FnZTogU2VydmVyTWVzc2FnZSkgPT4gdm9pZDtcbmV4cG9ydCB0eXBlIENvbm5lY3Rpb25TdGF0dXNMaXN0ZW5lciA9IChjb25uZWN0ZWQ6IGJvb2xlYW4pID0+IHZvaWQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNwb3J0IHtcbiAgY29ubmVjdChsaXN0ZW5lcjogTWVzc2FnZUxpc3RlbmVyKTogUHJvbWlzZTx2b2lkPjtcbiAgZGlzY29ubmVjdCgpOiB2b2lkO1xuICBzZW5kTWVzc2FnZShwYXlsb2FkOiBDbGllbnRNZXNzYWdlKTogUHJvbWlzZTx2b2lkPjtcbiAgaXNDb25uZWN0ZWQoKTogYm9vbGVhbjtcbiAgb25Db25uZWN0aW9uQ2hhbmdlKGxpc3RlbmVyOiBDb25uZWN0aW9uU3RhdHVzTGlzdGVuZXIpOiAoKSA9PiB2b2lkO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gU29ja2V0LklPIFRyYW5zcG9ydFxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGNsYXNzIFNvY2tldElPVHJhbnNwb3J0IGltcGxlbWVudHMgVHJhbnNwb3J0IHtcbiAgcHJpdmF0ZSBzb2NrZXQ6IFNvY2tldCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGxpc3RlbmVyOiBNZXNzYWdlTGlzdGVuZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBtZXNzYWdlUXVldWU6IENsaWVudE1lc3NhZ2VbXSA9IFtdO1xuICBwcml2YXRlIGNvbm5lY3Rpb25MaXN0ZW5lcnM6IFNldDxDb25uZWN0aW9uU3RhdHVzTGlzdGVuZXI+ID0gbmV3IFNldCgpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgdXJsOiBzdHJpbmcpIHt9XG5cbiAgY29ubmVjdChsaXN0ZW5lcjogTWVzc2FnZUxpc3RlbmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5saXN0ZW5lciA9IGxpc3RlbmVyO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLnNvY2tldCA9IGlvKHRoaXMudXJsLCB7XG4gICAgICAgIHRyYW5zcG9ydHM6IFtcIndlYnNvY2tldFwiXSxcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnNvY2tldC5vbihcImNvbm5lY3RcIiwgKCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhcIltTb2NrZXRJT1RyYW5zcG9ydF0gQ29ubmVjdGVkOlwiLCB0aGlzLnNvY2tldD8uaWQpO1xuXG4gICAgICAgIGZvciAoY29uc3QgcGF5bG9hZCBvZiB0aGlzLm1lc3NhZ2VRdWV1ZSkge1xuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiW1NvY2tldElPVHJhbnNwb3J0XSBTZW5kaW5nIHF1ZXVlZCBtZXNzYWdlOlwiLCBwYXlsb2FkKTtcbiAgICAgICAgICB0aGlzLnNvY2tldD8uZW1pdChcIm1lc3NhZ2VcIiwgcGF5bG9hZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tZXNzYWdlUXVldWUgPSBbXTtcblxuICAgICAgICB0aGlzLm5vdGlmeUNvbm5lY3Rpb25MaXN0ZW5lcnModHJ1ZSk7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnNvY2tldC5vbihcImNvbm5lY3RfZXJyb3JcIiwgKGVycikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiW1NvY2tldElPVHJhbnNwb3J0XSBDb25uZWN0aW9uIGZhaWxlZDpcIiwgZXJyKTtcbiAgICAgICAgdGhpcy5ub3RpZnlDb25uZWN0aW9uTGlzdGVuZXJzKGZhbHNlKTtcbiAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5zb2NrZXQub24oXCJkaXNjb25uZWN0XCIsICgpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coXCJbU29ja2V0SU9UcmFuc3BvcnRdIERpc2Nvbm5lY3RlZFwiKTtcbiAgICAgICAgdGhpcy5ub3RpZnlDb25uZWN0aW9uTGlzdGVuZXJzKGZhbHNlKTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnNvY2tldC5vbihcIm1lc3NhZ2VcIiwgKGRhdGE6IFNlcnZlck1lc3NhZ2UpID0+IHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJbU29ja2V0SU9UcmFuc3BvcnRdIFJlY2VpdmVkIG1lc3NhZ2U6XCIsIGRhdGEpO1xuICAgICAgICB0aGlzLmxpc3RlbmVyPy4oZGF0YSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGRpc2Nvbm5lY3QoKTogdm9pZCB7XG4gICAgdGhpcy5zb2NrZXQ/LmRpc2Nvbm5lY3QoKTtcbiAgICB0aGlzLnNvY2tldCA9IG51bGw7XG4gICAgdGhpcy5saXN0ZW5lciA9IG51bGw7XG4gICAgdGhpcy5tZXNzYWdlUXVldWUgPSBbXTtcbiAgICB0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lcnMuY2xlYXIoKTtcbiAgfVxuXG4gIGFzeW5jIHNlbmRNZXNzYWdlKHBheWxvYWQ6IENsaWVudE1lc3NhZ2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5pc0Nvbm5lY3RlZCgpKSB7XG4gICAgICAvLyBjb25zb2xlLmxvZyhcIltTb2NrZXRJT1RyYW5zcG9ydF0gU2VuZGluZzpcIiwgcGF5bG9hZCk7XG4gICAgICB0aGlzLnNvY2tldCEuZW1pdChcIm1lc3NhZ2VcIiwgcGF5bG9hZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKFwiW1NvY2tldElPVHJhbnNwb3J0XSBRdWV1aW5nIG1lc3NhZ2U6XCIsIHBheWxvYWQpO1xuICAgICAgdGhpcy5tZXNzYWdlUXVldWUucHVzaChwYXlsb2FkKTtcbiAgICB9XG4gIH1cblxuICBpc0Nvbm5lY3RlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zb2NrZXQ/LmNvbm5lY3RlZCB8fCBmYWxzZTtcbiAgfVxuXG4gIG9uQ29ubmVjdGlvbkNoYW5nZShsaXN0ZW5lcjogQ29ubmVjdGlvblN0YXR1c0xpc3RlbmVyKTogKCkgPT4gdm9pZCB7XG4gICAgdGhpcy5jb25uZWN0aW9uTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7XG4gICAgbGlzdGVuZXIodGhpcy5pc0Nvbm5lY3RlZCgpKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgdGhpcy5jb25uZWN0aW9uTGlzdGVuZXJzLmRlbGV0ZShsaXN0ZW5lcik7XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgbm90aWZ5Q29ubmVjdGlvbkxpc3RlbmVycyhjb25uZWN0ZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIHRoaXMuY29ubmVjdGlvbkxpc3RlbmVycykge1xuICAgICAgbGlzdGVuZXIoY29ubmVjdGVkKTtcbiAgICB9XG4gIH1cbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEluLU1lbW9yeSBUcmFuc3BvcnQgKGZvciB0ZXN0aW5nKVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGNsYXNzIEluTWVtb3J5VHJhbnNwb3J0IGltcGxlbWVudHMgVHJhbnNwb3J0IHtcbiAgcHJpdmF0ZSBsaXN0ZW5lcjogTWVzc2FnZUxpc3RlbmVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY29ubmVjdGVkID0gZmFsc2U7XG4gIHByaXZhdGUgY29ubmVjdGlvbkxpc3RlbmVyczogU2V0PENvbm5lY3Rpb25TdGF0dXNMaXN0ZW5lcj4gPSBuZXcgU2V0KCk7XG5cbiAgLy8gU2ltdWxhdGUgc2VydmVyLXNpZGUgbWVzc2FnZSBkaXNwYXRjaGluZ1xuICBwdWJsaWMgZGlzcGF0Y2hNZXNzYWdlKG1lc3NhZ2U6IFNlcnZlck1lc3NhZ2UpIHtcbiAgICBpZiAodGhpcy5saXN0ZW5lcikge1xuICAgICAgLy8gU2ltdWxhdGUgYXN5bmMgYmVoYXZpb3JcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5saXN0ZW5lcj8uKG1lc3NhZ2UpLCAwKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBjb25uZWN0KGxpc3RlbmVyOiBNZXNzYWdlTGlzdGVuZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXI7XG4gICAgdGhpcy5jb25uZWN0ZWQgPSB0cnVlO1xuICAgIGNvbnNvbGUubG9nKFwiW0luTWVtb3J5VHJhbnNwb3J0XSBDb25uZWN0ZWQuXCIpO1xuICB9XG5cbiAgZGlzY29ubmVjdCgpOiB2b2lkIHtcbiAgICB0aGlzLmxpc3RlbmVyID0gbnVsbDtcbiAgICB0aGlzLmNvbm5lY3RlZCA9IGZhbHNlO1xuICAgIGNvbnNvbGUubG9nKFwiW0luTWVtb3J5VHJhbnNwb3J0XSBEaXNjb25uZWN0ZWQuXCIpO1xuICB9XG5cbiAgYXN5bmMgc2VuZE1lc3NhZ2UocGF5bG9hZDogQ2xpZW50TWVzc2FnZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5jb25uZWN0ZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIltJbk1lbW9yeVRyYW5zcG9ydF0gTm90IGNvbm5lY3RlZC5cIik7XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKGBbSW5NZW1vcnlUcmFuc3BvcnRdIFNlbnQgbWVzc2FnZTpgLCBwYXlsb2FkKTtcbiAgICAvLyBJbiBhIHJlYWwgdGVzdCBzZXR1cCwgdGhpcyBtaWdodCB0cmlnZ2VyIGEgc2ltdWxhdGVkIHNlcnZlciByZXNwb25zZVxuICAgIC8vIHZpYSBgZGlzcGF0Y2hNZXNzYWdlYC5cbiAgfVxuXG4gIGlzQ29ubmVjdGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNvbm5lY3RlZDtcbiAgfVxuXG4gIG9uQ29ubmVjdGlvbkNoYW5nZShsaXN0ZW5lcjogQ29ubmVjdGlvblN0YXR1c0xpc3RlbmVyKTogKCkgPT4gdm9pZCB7XG4gICAgdGhpcy5jb25uZWN0aW9uTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHRoaXMuY29ubmVjdGlvbkxpc3RlbmVycy5kZWxldGUobGlzdGVuZXIpO1xuICAgIH07XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBMb2FkZXJGdW5jdGlvbkFyZ3MgfSBmcm9tIFwicmVhY3Qtcm91dGVyXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUm91dGVJbmZvIHtcbiAgcGF0aG5hbWU6IHN0cmluZztcbiAgaGFzaDogc3RyaW5nO1xuICBxdWVyeTogc3RyaW5nO1xuICBxdWVyeVBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgcGF0aFBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPjtcbiAgY2F0Y2hhbGw6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFNlcnZlclJvdXRlSW5mbyh7XG4gIHBhcmFtcyxcbiAgcmVxdWVzdCxcbn06IExvYWRlckZ1bmN0aW9uQXJncykge1xuICBjb25zdCB7IFwiKlwiOiBjYXRjaGFsbCA9IFwiXCIsIC4uLnBhdGhQYXJhbXMgfSA9IHBhcmFtcztcbiAgY29uc3QgcGFyc2VkVXJsID0gbmV3IFVSTChyZXF1ZXN0LnVybCk7XG5cbiAgcmV0dXJuIHtcbiAgICBoYXNoOiBwYXJzZWRVcmwuaGFzaCxcbiAgICBwYXRobmFtZTogcGFyc2VkVXJsLnBhdGhuYW1lLFxuICAgIHF1ZXJ5OiBwYXJzZWRVcmwuc2VhcmNoLFxuICAgIHF1ZXJ5UGFyYW1zOiBPYmplY3QuZnJvbUVudHJpZXMocGFyc2VkVXJsLnNlYXJjaFBhcmFtcy5lbnRyaWVzKCkpLFxuICAgIHBhdGhQYXJhbXMsXG4gICAgY2F0Y2hhbGw6IGNhdGNoYWxsLmxlbmd0aCA+IDEgPyBjYXRjaGFsbC5zcGxpdChcIi9cIikgOiBbXSxcbiAgfSBzYXRpc2ZpZXMgUm91dGVJbmZvO1xufSIsCiAgICAiLy8gU2VyaWFsaXphdGlvbiBoZWxwZXJzIHRoYXQgc3VwcG9ydDpcbi8vIC0gQ2lyY3VsYXIgcmVmZXJlbmNlcyB2aWEgb2JqZWN0IGlkZW50aXR5IHJlZnNcbi8vIC0gRGF0ZSBpbnN0YW5jZXMg4oaSIHsgX190OiBcImRhdGV0aW1lXCIsIHRpbWVzdGFtcCB9XG4vLyAtIEZvcm1EYXRhIOKGkiB7IF9fdDogXCJmb3JtZGF0YVwiLCBmaWVsZHMgfVxuLy8gLSBGaWxlIOKGkiB7IF9fdDogXCJmaWxlXCIsIG5hbWUsIHR5cGUsIHNpemUsIGxhc3RNb2RpZmllZCwgY29udGVudDogbnVtYmVyW10gfVxuLy8gQWxvbmcgd2l0aCBhIGRlY29kZXIgZm9yIHRoZSBzeW1tZXRyaWMgc2hhcGVzICh3ZSBkbyBub3QgcmVjb25zdHJ1Y3QgRmlsZS9Gb3JtRGF0YSBvYmplY3RzKS5cblxudHlwZSBFbmNvZGVkUmVmID0geyBfX3Q6IFwicmVmXCI7IGlkOiBudW1iZXIgfTtcbnR5cGUgRW5jb2RlZEFycmF5ID0geyBfX3Q6IFwiYXJyYXlcIjsgX19pZDogbnVtYmVyOyBpdGVtczogdW5rbm93bltdIH07XG50eXBlIEVuY29kZWRPYmplY3QgPSB7XG4gIF9fdDogXCJvYmplY3RcIjtcbiAgX19pZDogbnVtYmVyO1xuICBwcm9wczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59O1xudHlwZSBFbmNvZGVkRGF0ZSA9IHsgX190OiBcImRhdGV0aW1lXCI7IHRpbWVzdGFtcDogbnVtYmVyIH07XG50eXBlIEVuY29kZWRGaWxlID0ge1xuICBfX3Q6IFwiZmlsZVwiO1xuICBuYW1lOiBzdHJpbmc7XG4gIHR5cGU6IHN0cmluZztcbiAgc2l6ZTogbnVtYmVyO1xuICBsYXN0TW9kaWZpZWQ6IG51bWJlcjtcbiAgY29udGVudDogbnVtYmVyW107IC8vIHJhdyBieXRlcyBhcyBhIEpTT04tc2FmZSBudW1iZXIgYXJyYXlcbn07XG50eXBlIEVuY29kZWRGb3JtRGF0YSA9IHtcbiAgX190OiBcImZvcm1kYXRhXCI7XG4gIGZpZWxkczogUmVjb3JkPHN0cmluZywgdW5rbm93biB8IHVua25vd25bXT47XG59O1xuXG50eXBlIElkZW50aXR5TWFwID0gV2Vha01hcDxvYmplY3QsIG51bWJlcj47XG5cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpO1xuICByZXR1cm4gcHJvdG8gPT09IE9iamVjdC5wcm90b3R5cGUgfHwgcHJvdG8gPT09IG51bGw7XG59XG5cblxuZnVuY3Rpb24gaXNEYXRlKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgRGF0ZSB7XG4gIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIERhdGU7XG59XG5cbmZ1bmN0aW9uIGlzU2tpcHBhYmxlKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIgfHxcbiAgICB0eXBlb2YgdmFsdWUgPT09IFwic3ltYm9sXCIgfHxcbiAgICB0eXBlb2YgdmFsdWUgPT09IFwidW5kZWZpbmVkXCJcbiAgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmlsZVRvQnl0ZUFycmF5KGZpbGU6IEZpbGUpOiBQcm9taXNlPG51bWJlcltdPiB7XG4gIGNvbnN0IGFiID0gYXdhaXQgZmlsZS5hcnJheUJ1ZmZlcigpO1xuICByZXR1cm4gQXJyYXkuZnJvbShuZXcgVWludDhBcnJheShhYikpO1xufVxuXG5pbnRlcmZhY2UgRW5jb2RlQ29udGV4dCB7XG4gIHNlZW46IElkZW50aXR5TWFwO1xuICBuZXh0SWQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuY29kZUZvcldpcmUoaW5wdXQ6IHVua25vd24pOiBQcm9taXNlPHVua25vd24+IHtcbiAgY29uc3QgY3R4OiBFbmNvZGVDb250ZXh0ID0geyBzZWVuOiBuZXcgV2Vha01hcCgpLCBuZXh0SWQ6IDEgfTtcbiAgcmV0dXJuIGF3YWl0IGVuY29kZVJlY3Vyc2l2ZShpbnB1dCwgY3R4KTtcbn1cblxuZnVuY3Rpb24gcmVtZW1iZXIoY3R4OiBFbmNvZGVDb250ZXh0LCBvYmo6IG9iamVjdCk6IG51bWJlciB8IG51bGwge1xuICBjb25zdCBleGlzdGluZyA9IGN0eC5zZWVuLmdldChvYmopO1xuICBpZiAoZXhpc3RpbmcgIT09IHVuZGVmaW5lZCkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IGlkID0gY3R4Lm5leHRJZCsrO1xuICBjdHguc2Vlbi5zZXQob2JqLCBpZCk7XG4gIHJldHVybiBpZDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZW5jb2RlUmVjdXJzaXZlKFxuICB2YWx1ZTogdW5rbm93bixcbiAgY3R4OiBFbmNvZGVDb250ZXh0XG4pOiBQcm9taXNlPHVua25vd24+IHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIikge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8vIFNwZWNpYWwgY2FzZXMgZmlyc3RcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIGNvbnN0IGRhdGUgPSB2YWx1ZSBhcyBEYXRlO1xuICAgIGNvbnN0IGVuY29kZWQ6IEVuY29kZWREYXRlID0geyBfX3Q6IFwiZGF0ZXRpbWVcIiwgdGltZXN0YW1wOiBkYXRlLmdldFRpbWUoKSB9O1xuICAgIHJldHVybiBlbmNvZGVkO1xuICB9XG5cbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRm9ybURhdGEpIHtcbiAgICBjb25zdCBpZCA9IHJlbWVtYmVyKGN0eCwgdmFsdWUpO1xuICAgIGlmIChpZCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHsgX190OiBcInJlZlwiLCBpZDogY3R4LnNlZW4uZ2V0KHZhbHVlIGFzIG9iamVjdCkhIH0gYXMgRW5jb2RlZFJlZjtcbiAgICB9XG4gICAgY29uc3QgZmllbGRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duIHwgdW5rbm93bltdPiA9IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgdl0gb2YgdmFsdWUuZW50cmllcygpKSB7XG4gICAgICBjb25zdCBlbmNvZGVkVmFsID0gYXdhaXQgZW5jb2RlUmVjdXJzaXZlKHYgYXMgdW5rbm93biwgY3R4KTtcbiAgICAgIGlmIChlbmNvZGVkVmFsID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChmaWVsZHMsIGtleSkpIHtcbiAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBmaWVsZHNba2V5XTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZXhpc3RpbmcpKSB7XG4gICAgICAgICAgZXhpc3RpbmcucHVzaChlbmNvZGVkVmFsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaWVsZHNba2V5XSA9IFtleGlzdGluZywgZW5jb2RlZFZhbF07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZpZWxkc1trZXldID0gZW5jb2RlZFZhbDtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgZW5jb2RlZDogRW5jb2RlZEZvcm1EYXRhICYgeyBfX2lkOiBudW1iZXIgfSA9IHtcbiAgICAgIF9fdDogXCJmb3JtZGF0YVwiLFxuICAgICAgZmllbGRzLFxuICAgICAgX19pZDogaWQsXG4gICAgfSBhcyBhbnk7XG4gICAgcmV0dXJuIGVuY29kZWQ7XG4gIH1cblxuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBGaWxlKSB7XG4gICAgY29uc3QgZmlsZSA9IHZhbHVlO1xuICAgIGNvbnN0IGJ5dGVzID0gYXdhaXQgZmlsZVRvQnl0ZUFycmF5KHZhbHVlKTtcbiAgICBjb25zdCBlbmNvZGVkOiBFbmNvZGVkRmlsZSA9IHtcbiAgICAgIF9fdDogXCJmaWxlXCIsXG4gICAgICBuYW1lOiBmaWxlLm5hbWUsXG4gICAgICB0eXBlOiBmaWxlLnR5cGUsXG4gICAgICBzaXplOiBmaWxlLnNpemUsXG4gICAgICBsYXN0TW9kaWZpZWQ6IGZpbGUubGFzdE1vZGlmaWVkLFxuICAgICAgY29udGVudDogYnl0ZXMsXG4gICAgfTtcbiAgICByZXR1cm4gZW5jb2RlZDtcbiAgfVxuXG4gIC8vIElkZW50aXR5IC8gY2lyY3VsYXIgcmVmZXJlbmNlIGhhbmRsaW5nXG4gIGNvbnN0IG9iamVjdCA9IHZhbHVlIGFzIG9iamVjdDtcbiAgY29uc3QgZXhpc3RpbmdJZCA9IGN0eC5zZWVuLmdldChvYmplY3QpO1xuICBpZiAoZXhpc3RpbmdJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgcmVmOiBFbmNvZGVkUmVmID0geyBfX3Q6IFwicmVmXCIsIGlkOiBleGlzdGluZ0lkIH07XG4gICAgcmV0dXJuIHJlZjtcbiAgfVxuICBjb25zdCB0aGlzSWQgPSBjdHgubmV4dElkKys7XG4gIGN0eC5zZWVuLnNldChvYmplY3QsIHRoaXNJZCk7XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgY29uc3QgaXRlbXNSYXcgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICh2YWx1ZSBhcyB1bmtub3duW10pLm1hcCgoaXRlbSkgPT4gZW5jb2RlUmVjdXJzaXZlKGl0ZW0sIGN0eCkpXG4gICAgKTtcbiAgICBjb25zdCBpdGVtcyA9IGl0ZW1zUmF3LmZpbHRlcigoaXQpID0+IGl0ICE9PSB1bmRlZmluZWQpIGFzIHVua25vd25bXTtcbiAgICBjb25zdCBlbmNvZGVkOiBFbmNvZGVkQXJyYXkgPSB7IF9fdDogXCJhcnJheVwiLCBfX2lkOiB0aGlzSWQsIGl0ZW1zIH07XG4gICAgcmV0dXJuIGVuY29kZWQ7XG4gIH1cblxuICAvLyBQbGFpbiBvYmplY3Qgb3Igb3RoZXIgb2JqZWN0IHR5cGVzXG4gIGNvbnN0IHByb3BzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICBpZiAoaXNQbGFpbk9iamVjdCh2YWx1ZSkpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh2YWx1ZSkpIHtcbiAgICAgIGNvbnN0IHYgPSAodmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV07XG4gICAgICBpZiAoaXNTa2lwcGFibGUodikpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgZW5jb2RlZFYgPSBhd2FpdCBlbmNvZGVSZWN1cnNpdmUodiwgY3R4KTtcbiAgICAgIGlmIChlbmNvZGVkViAhPT0gdW5kZWZpbmVkKSBwcm9wc1trZXldID0gZW5jb2RlZFY7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIE5vbi1wbGFpbiBvYmplY3RzOiBiZXN0IGVmZm9ydCDigJMgZW51bWVyYXRlIGVudW1lcmFibGUgcHJvcGVydGllc1xuICAgIGZvciAoY29uc3Qga2V5IGluIHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSB7XG4gICAgICBjb25zdCB2ID0gKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldO1xuICAgICAgaWYgKGlzU2tpcHBhYmxlKHYpKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGVuY29kZWRWID0gYXdhaXQgZW5jb2RlUmVjdXJzaXZlKHYsIGN0eCk7XG4gICAgICBpZiAoZW5jb2RlZFYgIT09IHVuZGVmaW5lZCkgcHJvcHNba2V5XSA9IGVuY29kZWRWO1xuICAgIH1cbiAgfVxuICBjb25zdCBlbmNvZGVkOiBFbmNvZGVkT2JqZWN0ID0geyBfX3Q6IFwib2JqZWN0XCIsIF9faWQ6IHRoaXNJZCwgcHJvcHMgfTtcbiAgcmV0dXJuIGVuY29kZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVGcm9tV2lyZShpbnB1dDogdW5rbm93bik6IHVua25vd24ge1xuICByZXR1cm4gZGVjb2RlUmVjdXJzaXZlKGlucHV0KTtcbn1cblxuZnVuY3Rpb24gZGVjb2RlUmVjdXJzaXZlKHZhbHVlOiB1bmtub3duKTogdW5rbm93biB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIpIHJldHVybiB2YWx1ZTtcblxuICBjb25zdCBvYmogPSB2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgY29uc3QgdGFnID0gb2JqW1wiX190XCJdO1xuXG4gIGlmICh0YWcgPT09IFwiZGF0ZXRpbWVcIikge1xuICAgIGNvbnN0IHRzID0gb2JqW1widGltZXN0YW1wXCJdIGFzIG51bWJlcjtcbiAgICByZXR1cm4gbmV3IERhdGUodHMpO1xuICB9XG5cbiAgaWYgKHRhZyA9PT0gXCJmaWxlXCIpIHtcbiAgICAvLyBEbyBub3QgcmVjb25zdHJ1Y3QgRmlsZTsga2VlcCBhcyBwbGFpbiBvYmplY3QuIE9wdGlvbmFsbHksIHR1cm4gY29udGVudCBpbnRvIFVpbnQ4QXJyYXkgZm9yIGNvbnZlbmllbmNlLlxuICAgIGNvbnN0IGNvbnRlbnQgPSBvYmpbXCJjb250ZW50XCJdO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGNvbnRlbnQpKSB7XG4gICAgICAvLyBSZXR1cm4gYSBzaGFsbG93IGNsb25lIHdpdGggVWludDhBcnJheSBmb3IgY29udGVudFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4ub2JqLFxuICAgICAgICBjb250ZW50OiBuZXcgVWludDhBcnJheShjb250ZW50IGFzIG51bWJlcltdKSxcbiAgICAgIH0gYXMgYW55O1xuICAgIH1cbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgaWYgKHRhZyA9PT0gXCJmb3JtZGF0YVwiKSB7XG4gICAgLy8gS2VlcCBhcy1pcyAocGxhaW4gb2JqZWN0KSwgYnV0IGRlY29kZSBuZXN0ZWQgdmFsdWVzXG4gICAgY29uc3QgZmllbGRzID0gb2JqW1wiZmllbGRzXCJdIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24gfCB1bmtub3duW10+O1xuICAgIGNvbnN0IGRlY29kZWRGaWVsZHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24gfCB1bmtub3duW10+ID0ge307XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZmllbGRzKSkge1xuICAgICAgY29uc3QgdiA9IGZpZWxkc1trZXldO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodikpIHtcbiAgICAgICAgZGVjb2RlZEZpZWxkc1trZXldID0gdi5tYXAoKHgpID0+IGRlY29kZVJlY3Vyc2l2ZSh4KSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWNvZGVkRmllbGRzW2tleV0gPSBkZWNvZGVSZWN1cnNpdmUodik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IF9fdDogXCJmb3JtZGF0YVwiLCBmaWVsZHM6IGRlY29kZWRGaWVsZHMgfSBhcyBFbmNvZGVkRm9ybURhdGE7XG4gIH1cblxuICBpZiAodGFnID09PSBcImFycmF5XCIpIHtcbiAgICBjb25zdCBpdGVtcyA9IChvYmpbXCJpdGVtc1wiXSBhcyB1bmtub3duW10pLm1hcCgoeCkgPT4gZGVjb2RlUmVjdXJzaXZlKHgpKTtcbiAgICByZXR1cm4gaXRlbXM7XG4gIH1cblxuICBpZiAodGFnID09PSBcIm9iamVjdFwiKSB7XG4gICAgY29uc3QgcHJvcHMgPSBvYmpbXCJwcm9wc1wiXSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zdCBvdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMocHJvcHMpKSB7XG4gICAgICBvdXRba2V5XSA9IGRlY29kZVJlY3Vyc2l2ZShwcm9wc1trZXldKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIGlmICh0YWcgPT09IFwicmVmXCIpIHtcbiAgICAvLyBXaXRob3V0IGEgcmVjb25zdHJ1Y3Rpb24gY29udGV4dCBvbiB0aGUgY2xpZW50LCBsZWF2ZSBhcy1pcy5cbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgLy8gVW5rbm93biBvYmplY3Qg4oCTIGRlc2NlbmQgc2hhbGxvd2x5XG4gIGNvbnN0IGNvcHk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKG9iaikpIHtcbiAgICBjb3B5W2tleV0gPSBkZWNvZGVSZWN1cnNpdmUob2JqW2tleV0pO1xuICB9XG4gIHJldHVybiBjb3B5O1xufVxuXG4vLyBMZWdhY3kgY2xlYW5lciBrZXB0IGZvciBjb21wYXRpYmlsaXR5IHdoZXJlIGEgcXVpY2sgYmVzdC1lZmZvcnQgSlNPTi1zYWZlIHNoYXBlIGlzIG5lZWRlZFxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFuRm9yU2VyaWFsaXphdGlvbihvYmo6IHVua25vd24pOiB1bmtub3duIHtcbiAgcmV0dXJuIGNsZWFuUmVjdXJzaXZlKG9iaiwgbmV3IFdlYWtTZXQoKSk7XG59XG5cbmZ1bmN0aW9uIGNsZWFuUmVjdXJzaXZlKG9iajogdW5rbm93biwgc2VlbjogV2Vha1NldDxvYmplY3Q+KTogdW5rbm93biB7XG4gIGlmIChvYmogPT09IG51bGwgfHwgdHlwZW9mIG9iaiAhPT0gXCJvYmplY3RcIikgcmV0dXJuIG9iajtcbiAgaWYgKHNlZW4uaGFzKG9iaiBhcyBvYmplY3QpKSByZXR1cm4gdW5kZWZpbmVkO1xuICBzZWVuLmFkZChvYmogYXMgb2JqZWN0KTtcbiAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgIHJldHVybiAob2JqIGFzIHVua25vd25bXSlcbiAgICAgIC5tYXAoKGl0ZW0pID0+IGNsZWFuUmVjdXJzaXZlKGl0ZW0sIHNlZW4pKVxuICAgICAgLmZpbHRlcigoeCkgPT4geCAhPT0gdW5kZWZpbmVkKTtcbiAgfVxuICBjb25zdCBvdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gIGZvciAoY29uc3Qga2V5IGluIG9iaiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikge1xuICAgIGNvbnN0IHYgPSAob2JqIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldO1xuICAgIGlmIChpc1NraXBwYWJsZSh2KSkgY29udGludWU7XG4gICAgY29uc3QgY2xlYW5lZCA9IGNsZWFuUmVjdXJzaXZlKHYsIHNlZW4pO1xuICAgIGlmIChjbGVhbmVkICE9PSB1bmRlZmluZWQpIG91dFtrZXldID0gY2xlYW5lZDtcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuIgogIF0sCiAgIm1hcHBpbmdzIjogIjtBQUFBLG9CQUNFLGNBQ0EsY0FDQSxvQkFDQSxpQkFDQSxlQ0xGLDJCQUNFLG1CQUNBLHFCQUNBLFdBQ0EsZUFDQSxlQ0ZLLElBQU0sR0FBZSxhQUNmLEdBQXFCLEtBc0czQixTQUFTLEVBQWEsQ0FBQyxFQUFxQyxDQUVqRSxPQUFPLE9BQU8sSUFBUyxVQUFZLElBQVMsS0FHdkMsU0FBUyxFQUFnQixDQUFDLEVBQXFDLENBQ3BFLE9BQ0Us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LEVBRzFDLFNBQVMsRUFBYyxDQUFDLEVBQWMsRUFBZ0MsQ0FDcEUsR0FBSSxJQUFRLE1BQVEsT0FBTyxJQUFRLFNBQVUsT0FBTyxFQUNwRCxHQUFJLEVBQUssSUFBSSxDQUFhLEVBQUcsT0FFN0IsR0FEQSxFQUFLLElBQUksQ0FBYSxFQUNsQixNQUFNLFFBQVEsQ0FBRyxFQUNuQixPQUFRLEVBQ0wsSUFBSSxDQUFDLElBQVMsR0FBZSxFQUFNLENBQUksQ0FBQyxFQUN4QyxPQUFPLENBQUMsSUFBTSxJQUFNLE1BQVMsRUFFbEMsSUFBTSxFQUErQixDQUFDLEVBQ3RDLFFBQVcsS0FBTyxFQUFnQyxDQUNoRCxJQUFNLEVBQUssRUFBZ0MsR0FDM0MsR0FBSSxHQUFZLENBQUMsRUFBRyxTQUNwQixJQUFNLEVBQVUsR0FBZSxFQUFHLENBQUksRUFDdEMsR0FBSSxJQUFZLE9BQVcsRUFBSSxHQUFPLEVBRXhDLE9BQU8iLAogICJkZWJ1Z0lkIjogIjBCMkI3OEQ0MDg2MDE1MTg2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9
|
|
4
|
+
//# debugId=E78E128417F6F91764756E2164756E21
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3B1bHNlLnRzeCIsICIuLi9zcmMvcmVuZGVyZXIudHN4IiwgIi4uL3NyYy92ZG9tLnRzIiwgIi4uL3NyYy9zZXJpYWxpemUvZXh0cmFjdG9yLnRzIiwgIi4uL3NyYy9zZXJpYWxpemUvZWxlbWVudHMudHMiLCAiLi4vc3JjL3NlcmlhbGl6ZS9ldmVudHMudHMiLCAiLi4vc3JjL3NlcmlhbGl6ZS9zZXJpYWxpemVyLnRzIiwgIi4uL3NyYy9jbGllbnQudHN4IiwgIi4uL3NyYy9jaGFubmVsLnRzIiwgIi4uL3NyYy91c2VQdWxzZUNoYW5uZWwudHMiLCAiLi4vc3JjL2Zvcm0udHN4IiwgIi4uL3NyYy90cmFuc3BvcnQudHMiLCAiLi4vc3JjL2hlbHBlcnMudHMiLCAiLi4vc3JjL3NlcmlhbGl6ZS9jbGVhbi50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICJpbXBvcnQgUmVhY3QsIHtcbiAgdXNlRWZmZWN0LFxuICB1c2VTdGF0ZSxcbiAgdXNlTWVtbyxcbiAgY3JlYXRlQ29udGV4dCxcbiAgdXNlQ29udGV4dCxcbiAgdHlwZSBDb21wb25lbnRUeXBlLFxufSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IFZET01SZW5kZXJlciwgYXBwbHlVcGRhdGVzIH0gZnJvbSBcIi4vcmVuZGVyZXJcIjtcbmltcG9ydCB7IFB1bHNlU29ja2V0SU9DbGllbnQgfSBmcm9tIFwiLi9jbGllbnRcIjtcbmltcG9ydCB0eXBlIHsgVkRPTSwgQ29tcG9uZW50UmVnaXN0cnksIFJlZ2lzdHJ5RW50cnkgfSBmcm9tIFwiLi92ZG9tXCI7XG5pbXBvcnQgeyB1c2VMb2NhdGlvbiwgdXNlUGFyYW1zLCB1c2VOYXZpZ2F0ZSB9IGZyb20gXCJyZWFjdC1yb3V0ZXJcIjtcbmltcG9ydCB0eXBlIHsgU2VydmVyRXJyb3JJbmZvfSBmcm9tIFwiLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHR5cGUgeyBSb3V0ZUluZm8gfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBUeXBlc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGludGVyZmFjZSBQdWxzZUNvbmZpZyB7XG4gIHNlcnZlckFkZHJlc3M6IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgUHVsc2VQcmVyZW5kZXJWaWV3ID0ge1xuICB2ZG9tOiBWRE9NO1xuICBjYWxsYmFja3M6IHN0cmluZ1tdO1xuICByZW5kZXJfcHJvcHM6IHN0cmluZ1tdO1xuICBjc3NfcmVmczogc3RyaW5nW107XG59O1xuXG5leHBvcnQgdHlwZSBQdWxzZVByZXJlbmRlciA9IHtcbiAgcmVuZGVySWQ6IHN0cmluZztcbiAgdmlld3M6IFJlY29yZDxzdHJpbmcsIFB1bHNlUHJlcmVuZGVyVmlldz47XG59O1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIENvbnRleHQgYW5kIEhvb2tzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vLyBDb250ZXh0IGZvciB0aGUgY2xpZW50LCBwcm92aWRlZCBieSBQdWxzZVByb3ZpZGVyXG5jb25zdCBQdWxzZUNsaWVudENvbnRleHQgPSBjcmVhdGVDb250ZXh0PFB1bHNlU29ja2V0SU9DbGllbnQgfCBudWxsPihudWxsKTtcbmNvbnN0IFB1bHNlUHJlcmVuZGVyQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQ8UHVsc2VQcmVyZW5kZXIgfCBudWxsPihudWxsKTtcblxuZXhwb3J0IGNvbnN0IHVzZVB1bHNlQ2xpZW50ID0gKCkgPT4ge1xuICBjb25zdCBjbGllbnQgPSB1c2VDb250ZXh0KFB1bHNlQ2xpZW50Q29udGV4dCk7XG4gIGlmICghY2xpZW50KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwidXNlUHVsc2VDbGllbnQgbXVzdCBiZSB1c2VkIHdpdGhpbiBhIFB1bHNlUHJvdmlkZXJcIik7XG4gIH1cbiAgcmV0dXJuIGNsaWVudDtcbn07XG5cbmV4cG9ydCBjb25zdCB1c2VQdWxzZVByZXJlbmRlciA9IChwYXRoOiBzdHJpbmcpID0+IHtcbiAgY29uc3QgY3R4ID0gdXNlQ29udGV4dChQdWxzZVByZXJlbmRlckNvbnRleHQpO1xuICBpZiAoIWN0eCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcInVzZVB1bHNlUHJlcmVuZGVyIG11c3QgYmUgdXNlZCB3aXRoaW4gYSBQdWxzZVByb3ZpZGVyXCIpO1xuICB9XG4gIGNvbnN0IHZpZXcgPSBjdHgudmlld3NbcGF0aF07XG4gIGlmICghdmlldykge1xuICAgIHRocm93IG5ldyBFcnJvcihgTm8gcHJlcmVuZGVyIGZvdW5kIGZvciAnJHtwYXRofSdgKTtcbiAgfVxuICByZXR1cm4gdmlldztcbn07XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBQcm92aWRlclxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGludGVyZmFjZSBQdWxzZVByb3ZpZGVyUHJvcHMge1xuICBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlO1xuICBjb25maWc6IFB1bHNlQ29uZmlnO1xuICBwcmVyZW5kZXI6IFB1bHNlUHJlcmVuZGVyO1xufVxuXG5jb25zdCBpbkJyb3dzZXIgPSB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiO1xuXG5leHBvcnQgZnVuY3Rpb24gUHVsc2VQcm92aWRlcih7XG4gIGNoaWxkcmVuLFxuICBjb25maWcsXG4gIHByZXJlbmRlcixcbn06IFB1bHNlUHJvdmlkZXJQcm9wcykge1xuICBjb25zdCBbY29ubmVjdGVkLCBzZXRDb25uZWN0ZWRdID0gdXNlU3RhdGUodHJ1ZSk7XG4gIGNvbnN0IHJyTmF2aWdhdGUgPSB1c2VOYXZpZ2F0ZSgpO1xuICBjb25zdCB7IHJlbmRlcklkIH0gPSBwcmVyZW5kZXI7XG5cbiAgY29uc3QgY2xpZW50ID0gdXNlTWVtbyhcbiAgICAoKSA9PiBuZXcgUHVsc2VTb2NrZXRJT0NsaWVudChjb25maWcuc2VydmVyQWRkcmVzcywgcmVuZGVySWQsIHJyTmF2aWdhdGUpLFxuICAgIFtjb25maWcuc2VydmVyQWRkcmVzcywgcnJOYXZpZ2F0ZSwgcmVuZGVySWRdXG4gICk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IGNsaWVudC5vbkNvbm5lY3Rpb25DaGFuZ2Uoc2V0Q29ubmVjdGVkKSwgW2NsaWVudF0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGluQnJvd3Nlcikge1xuICAgICAgY2xpZW50LmNvbm5lY3QoKTtcbiAgICAgIHJldHVybiAoKSA9PiBjbGllbnQuZGlzY29ubmVjdCgpO1xuICAgIH1cbiAgfSwgW2NsaWVudF0pO1xuXG4gIHJldHVybiAoXG4gICAgPFB1bHNlQ2xpZW50Q29udGV4dC5Qcm92aWRlciB2YWx1ZT17Y2xpZW50fT5cbiAgICAgIDxQdWxzZVByZXJlbmRlckNvbnRleHQuUHJvdmlkZXIgdmFsdWU9e3ByZXJlbmRlcn0+XG4gICAgICAgIHshY29ubmVjdGVkICYmIChcbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICBwb3NpdGlvbjogXCJmaXhlZFwiLFxuICAgICAgICAgICAgICBib3R0b206IFwiMjBweFwiLFxuICAgICAgICAgICAgICByaWdodDogXCIyMHB4XCIsXG4gICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogXCJyZWRcIixcbiAgICAgICAgICAgICAgY29sb3I6IFwid2hpdGVcIixcbiAgICAgICAgICAgICAgcGFkZGluZzogXCIxMHB4XCIsXG4gICAgICAgICAgICAgIGJvcmRlclJhZGl1czogXCI1cHhcIixcbiAgICAgICAgICAgICAgekluZGV4OiAxMDAwLFxuICAgICAgICAgICAgfX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICBGYWlsZWQgdG8gY29ubmVjdCB0byB0aGUgc2VydmVyLlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICApfVxuICAgICAgICB7Y2hpbGRyZW59XG4gICAgICA8L1B1bHNlUHJlcmVuZGVyQ29udGV4dC5Qcm92aWRlcj5cbiAgICA8L1B1bHNlQ2xpZW50Q29udGV4dC5Qcm92aWRlcj5cbiAgKTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFZpZXdcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHVsc2VWaWV3UHJvcHMge1xuICBleHRlcm5hbENvbXBvbmVudHM6IENvbXBvbmVudFJlZ2lzdHJ5O1xuICBwYXRoOiBzdHJpbmc7XG4gIGNzc01vZHVsZXM6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gUHVsc2VWaWV3KHtcbiAgZXh0ZXJuYWxDb21wb25lbnRzLFxuICBwYXRoLFxuICBjc3NNb2R1bGVzLFxufTogUHVsc2VWaWV3UHJvcHMpIHtcbiAgY29uc3QgY2xpZW50ID0gdXNlUHVsc2VDbGllbnQoKTtcbiAgY29uc3QgaW5pdGlhbFZpZXcgPSB1c2VQdWxzZVByZXJlbmRlcihwYXRoKTtcbiAgY29uc3QgaW5pdGlhbFZET00gPSBpbml0aWFsVmlldy52ZG9tO1xuICBjb25zdCByZW5kZXJlciA9IHVzZU1lbW8oXG4gICAgKCkgPT5cbiAgICAgIG5ldyBWRE9NUmVuZGVyZXIoXG4gICAgICAgIGNsaWVudCxcbiAgICAgICAgcGF0aCxcbiAgICAgICAgZXh0ZXJuYWxDb21wb25lbnRzLFxuICAgICAgICBjc3NNb2R1bGVzLFxuICAgICAgICBpbml0aWFsVmlldy5jYWxsYmFja3MsXG4gICAgICAgIGluaXRpYWxWaWV3LnJlbmRlcl9wcm9wcyxcbiAgICAgICAgaW5pdGlhbFZpZXcuY3NzX3JlZnNcbiAgICAgICksXG4gICAgW2NsaWVudCwgcGF0aCwgZXh0ZXJuYWxDb21wb25lbnRzLCBjc3NNb2R1bGVzLCBpbml0aWFsVmlld11cbiAgKTtcbiAgY29uc3QgW3RyZWUsIHNldFRyZWVdID0gdXNlU3RhdGU8UmVhY3QuUmVhY3ROb2RlPigoKSA9PlxuICAgIHJlbmRlcmVyLnJlbmRlck5vZGUoaW5pdGlhbFZET00pXG4gICk7XG4gIGNvbnN0IFtzZXJ2ZXJFcnJvciwgc2V0U2VydmVyRXJyb3JdID0gdXNlU3RhdGU8U2VydmVyRXJyb3JJbmZvIHwgbnVsbD4obnVsbCk7XG5cbiAgY29uc3QgbG9jYXRpb24gPSB1c2VMb2NhdGlvbigpO1xuICBjb25zdCBwYXJhbXMgPSB1c2VQYXJhbXMoKTtcblxuICBjb25zdCByb3V0ZUluZm8gPSB1c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCB7IFwiKlwiOiBjYXRjaGFsbCA9IFwiXCIsIC4uLnBhdGhQYXJhbXMgfSA9IHBhcmFtcztcbiAgICBjb25zdCBxdWVyeVBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMobG9jYXRpb24uc2VhcmNoKTtcbiAgICByZXR1cm4ge1xuICAgICAgaGFzaDogbG9jYXRpb24uaGFzaCxcbiAgICAgIHBhdGhuYW1lOiBsb2NhdGlvbi5wYXRobmFtZSxcbiAgICAgIHF1ZXJ5OiBsb2NhdGlvbi5zZWFyY2gsXG4gICAgICBxdWVyeVBhcmFtczogT2JqZWN0LmZyb21FbnRyaWVzKHF1ZXJ5UGFyYW1zLmVudHJpZXMoKSksXG4gICAgICBwYXRoUGFyYW1zLFxuICAgICAgY2F0Y2hhbGw6IGNhdGNoYWxsLmxlbmd0aCA+IDAgPyBjYXRjaGFsbC5zcGxpdChcIi9cIikgOiBbXSxcbiAgICB9IHNhdGlzZmllcyBSb3V0ZUluZm87XG4gIH0sIFtcbiAgICBsb2NhdGlvbi5oYXNoLFxuICAgIGxvY2F0aW9uLnBhdGhuYW1lLFxuICAgIGxvY2F0aW9uLnNlYXJjaCxcbiAgICBKU09OLnN0cmluZ2lmeShwYXJhbXMpLFxuICBdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChpbkJyb3dzZXIpIHtcbiAgICAgIGNsaWVudC5tb3VudFZpZXcocGF0aCwge1xuICAgICAgICByb3V0ZUluZm8sXG4gICAgICAgIG9uSW5pdDogKHZkb20sIGNhbGxiYWNrcywgcmVuZGVyUHJvcHMsIGNzc1JlZnMpID0+IHtcbiAgICAgICAgICByZW5kZXJlci5zZXRDYWxsYmFja3MoY2FsbGJhY2tzKTtcbiAgICAgICAgICByZW5kZXJlci5zZXRSZW5kZXJQcm9wcyhyZW5kZXJQcm9wcyk7XG4gICAgICAgICAgcmVuZGVyZXIuc2V0Q3NzUmVmcyhjc3NSZWZzKTtcbiAgICAgICAgICBzZXRUcmVlKHJlbmRlcmVyLnJlbmRlck5vZGUodmRvbSkpO1xuICAgICAgICB9LFxuICAgICAgICBvblVwZGF0ZTogKG9wcykgPT4ge1xuICAgICAgICAgIHNldFRyZWUoKHByZXYpID0+XG4gICAgICAgICAgICBwcmV2ID09IG51bGwgPyBwcmV2IDogYXBwbHlVcGRhdGVzKHByZXYsIG9wcywgcmVuZGVyZXIpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgY29uc3Qgb2ZmRXJyID0gY2xpZW50Lm9uU2VydmVyRXJyb3IoKHAsIGVycikgPT4ge1xuICAgICAgICBpZiAocCA9PT0gcGF0aCkgc2V0U2VydmVyRXJyb3IoZXJyKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgb2ZmRXJyKCk7XG4gICAgICAgIGNsaWVudC51bm1vdW50KHBhdGgpO1xuICAgICAgfTtcbiAgICB9XG4gICAgLy8gcm91dGVJbmZvIGlzIE5PVCBpbmNsdWRlZCBoZXJlIG9uIHB1cnBvc2VcbiAgfSwgW2NsaWVudF0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGluQnJvd3Nlcikge1xuICAgICAgY2xpZW50Lm5hdmlnYXRlKHBhdGgsIHJvdXRlSW5mbyk7XG4gICAgfVxuICB9LCBbY2xpZW50LCBwYXRoLCByb3V0ZUluZm9dKTtcblxuICBpZiAoc2VydmVyRXJyb3IpIHtcbiAgICByZXR1cm4gPFNlcnZlckVycm9yIGVycm9yPXtzZXJ2ZXJFcnJvcn0gLz47XG4gIH1cblxuICByZXR1cm4gdHJlZTtcbn1cblxuZnVuY3Rpb24gU2VydmVyRXJyb3IoeyBlcnJvciB9OiB7IGVycm9yOiBTZXJ2ZXJFcnJvckluZm8gfSkge1xuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIHN0eWxlPXt7XG4gICAgICAgIHBhZGRpbmc6IDE2LFxuICAgICAgICBib3JkZXI6IFwiMXB4IHNvbGlkICNlMDBcIixcbiAgICAgICAgYmFja2dyb3VuZDogXCIjZmZmNWY1XCIsXG4gICAgICAgIGNvbG9yOiBcIiM5MDBcIixcbiAgICAgICAgZm9udEZhbWlseTpcbiAgICAgICAgICAndWktbW9ub3NwYWNlLCBTRk1vbm8tUmVndWxhciwgTWVubG8sIE1vbmFjbywgQ29uc29sYXMsIFwiTGliZXJhdGlvbiBNb25vXCIsIFwiQ291cmllciBOZXdcIiwgbW9ub3NwYWNlJyxcbiAgICAgICAgd2hpdGVTcGFjZTogXCJwcmUtd3JhcFwiLFxuICAgICAgfX1cbiAgICA+XG4gICAgICA8ZGl2IHN0eWxlPXt7IGZvbnRXZWlnaHQ6IDcwMCwgbWFyZ2luQm90dG9tOiA4IH19PlxuICAgICAgICBTZXJ2ZXIgRXJyb3IgZHVyaW5nIHtlcnJvci5waGFzZX1cbiAgICAgIDwvZGl2PlxuICAgICAge2Vycm9yLm1lc3NhZ2UgJiYgPGRpdj57ZXJyb3IubWVzc2FnZX08L2Rpdj59XG4gICAgICB7ZXJyb3Iuc3RhY2sgJiYgKFxuICAgICAgICA8ZGV0YWlscyBvcGVuIHN0eWxlPXt7IG1hcmdpblRvcDogOCB9fT5cbiAgICAgICAgICA8c3VtbWFyeT5TdGFjayB0cmFjZTwvc3VtbWFyeT5cbiAgICAgICAgICA8cHJlIHN0eWxlPXt7IG1hcmdpbjogMCB9fT57ZXJyb3Iuc3RhY2t9PC9wcmU+XG4gICAgICAgIDwvZGV0YWlscz5cbiAgICAgICl9XG4gICAgPC9kaXY+XG4gICk7XG59XG4iLAogICAgImltcG9ydCBSZWFjdCwge1xuICBjbG9uZUVsZW1lbnQsXG4gIGNyZWF0ZUVsZW1lbnQsXG4gIGlzVmFsaWRFbGVtZW50LFxuICBsYXp5LFxuICBTdXNwZW5zZSxcbiAgdHlwZSBDb21wb25lbnRUeXBlLFxuICB0eXBlIFJlYWN0RWxlbWVudCxcbiAgdHlwZSBSZWFjdE5vZGUsXG59IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHR5cGUge1xuICBDb21wb25lbnRSZWdpc3RyeSxcbiAgVkRPTU5vZGUsXG4gIFZET01VcGRhdGUsXG4gIFZET00sXG4gIFBhdGhEZWx0YSxcbn0gZnJvbSBcIi4vdmRvbVwiO1xuaW1wb3J0IHtcbiAgRlJBR01FTlRfVEFHLFxuICBpc0VsZW1lbnROb2RlLFxuICBpc01vdW50UG9pbnROb2RlLFxuICBNT1VOVF9QT0lOVF9QUkVGSVgsXG59IGZyb20gXCIuL3Zkb21cIjtcbmltcG9ydCB0eXBlIHsgUHVsc2VTb2NrZXRJT0NsaWVudCB9IGZyb20gXCIuL2NsaWVudFwiO1xuXG5leHBvcnQgY2xhc3MgVkRPTVJlbmRlcmVyIHtcbiAgcHJpdmF0ZSBjYWxsYmFja3M6IFNldDxzdHJpbmc+O1xuICBwcml2YXRlIGNhbGxiYWNrQ2FjaGU6IE1hcDxzdHJpbmcsIEZ1bmN0aW9uPjtcbiAgcHJpdmF0ZSByZW5kZXJQcm9wS2V5czogU2V0PHN0cmluZz47XG4gIHByaXZhdGUgY3NzUHJvcHM6IFNldDxzdHJpbmc+O1xuICBwcml2YXRlIGNhbGxiYWNrTGlzdDogc3RyaW5nW107XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY2xpZW50OiBQdWxzZVNvY2tldElPQ2xpZW50LFxuICAgIHByaXZhdGUgcGF0aDogc3RyaW5nLFxuICAgIHByaXZhdGUgY29tcG9uZW50czogQ29tcG9uZW50UmVnaXN0cnksXG4gICAgcHJpdmF0ZSBjc3NNb2R1bGVzOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PixcbiAgICBpbml0aWFsQ2FsbGJhY2tzOiBzdHJpbmdbXSA9IFtdLFxuICAgIGluaXRpYWxSZW5kZXJQcm9wczogc3RyaW5nW10gPSBbXSxcbiAgICBpbml0aWFsQ3NzUmVmczogc3RyaW5nW10gPSBbXVxuICApIHtcbiAgICB0aGlzLmNhbGxiYWNrcyA9IG5ldyBTZXQoaW5pdGlhbENhbGxiYWNrcyk7XG4gICAgdGhpcy5jYWxsYmFja0NhY2hlID0gbmV3IE1hcCgpO1xuICAgIHRoaXMucmVuZGVyUHJvcEtleXMgPSBuZXcgU2V0KGluaXRpYWxSZW5kZXJQcm9wcyk7XG4gICAgdGhpcy5jc3NQcm9wcyA9IG5ldyBTZXQoaW5pdGlhbENzc1JlZnMpO1xuICAgIHRoaXMuY2FsbGJhY2tMaXN0ID0gWy4uLnRoaXMuY2FsbGJhY2tzXS5zb3J0KCk7XG4gIH1cblxuICAvLyBBY2Nlc3NvcnMgdXNlZCBieSB1cGRhdGUgbG9naWMgdG8gZGV0ZXJtaW5lIHdoaWNoIHByb3BzIG5lZWQgcmViaW5kaW5nXG4gIGhhc0NhbGxiYWNrUGF0aChwYXRoOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5jYWxsYmFja3MuaGFzKHBhdGgpO1xuICB9XG5cbiAgaGFzUmVuZGVyUHJvcFBhdGgocGF0aDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyUHJvcEtleXMuaGFzKHBhdGgpO1xuICB9XG5cbiAgaGFzQW55Q2FsbGJhY2tVbmRlcihwcmVmaXg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmIChwcmVmaXggPT09IFwiXCIpIHJldHVybiB0aGlzLmNhbGxiYWNrTGlzdC5sZW5ndGggPiAwO1xuICAgIGNvbnN0IGkgPSBsb3dlckJvdW5kKHRoaXMuY2FsbGJhY2tMaXN0LCBwcmVmaXgpO1xuICAgIHJldHVybiAoXG4gICAgICBpIDwgdGhpcy5jYWxsYmFja0xpc3QubGVuZ3RoICYmIHRoaXMuY2FsbGJhY2tMaXN0W2ldIS5zdGFydHNXaXRoKHByZWZpeClcbiAgICApO1xuICB9XG5cbiAgc2V0Q2FsbGJhY2tzKGtleXM6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5jYWxsYmFja3MgPSBuZXcgU2V0KGtleXMpO1xuICAgIC8vIHBydW5lIHN0YWxlIGNhY2hlZCBjYWxsYmFja3NcbiAgICBmb3IgKGNvbnN0IGsgb2YgQXJyYXkuZnJvbSh0aGlzLmNhbGxiYWNrQ2FjaGUua2V5cygpKSkge1xuICAgICAgaWYgKCF0aGlzLmNhbGxiYWNrcy5oYXMoaykpIHRoaXMuY2FsbGJhY2tDYWNoZS5kZWxldGUoayk7XG4gICAgfVxuICAgIHRoaXMuY2FsbGJhY2tMaXN0ID0gWy4uLnRoaXMuY2FsbGJhY2tzXS5zb3J0KCk7XG4gIH1cblxuICBzZXRSZW5kZXJQcm9wcyhrZXlzOiBzdHJpbmdbXSkge1xuICAgIHRoaXMucmVuZGVyUHJvcEtleXMgPSBuZXcgU2V0KGtleXMpO1xuICB9XG5cbiAgc2V0Q3NzUmVmcyhlbnRyaWVzOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuY3NzUHJvcHMgPSBuZXcgU2V0KGVudHJpZXMpO1xuICB9XG5cbiAgYXBwbHlDYWxsYmFja0RlbHRhKGRlbHRhOiBQYXRoRGVsdGEpIHtcbiAgICAvLyBPbmx5IHVwZGF0ZSB0aGUgaW50ZXJuYWwgY2FsbGJhY2sgcGF0aCByZWdpc3RyeSBhbmQgY2FjaGUuIFdlIHJlbHkgb25cbiAgICAvLyBhY2NvbXBhbnlpbmcgdXBkYXRlX3Byb3BzIG9wZXJhdGlvbnMgdGhhdCBjb250YWluIHRoZSBcIiRjYlwiIHBsYWNlaG9sZGVyXG4gICAgLy8gdG8gdHJpZ2dlciBwcm9wIHVwZGF0ZXM7IHRyYW5zZm9ybVZhbHVlIHdpbGwgcmVzb2x2ZSB0byBmdW5jdGlvbnMuXG4gICAgaWYgKGRlbHRhLnJlbW92ZSkge1xuICAgICAgZm9yIChjb25zdCBrZXkgb2YgZGVsdGEucmVtb3ZlKSB7XG4gICAgICAgIHRoaXMuY2FsbGJhY2tzLmRlbGV0ZShrZXkpO1xuICAgICAgICB0aGlzLmNhbGxiYWNrQ2FjaGUuZGVsZXRlKGtleSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChkZWx0YS5hZGQpIHtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGRlbHRhLmFkZCkge1xuICAgICAgICB0aGlzLmNhbGxiYWNrcy5hZGQoa2V5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5jYWxsYmFja0xpc3QgPSBbLi4udGhpcy5jYWxsYmFja3NdLnNvcnQoKTtcbiAgfVxuXG4gIGFwcGx5UmVuZGVyUHJvcHNEZWx0YShkZWx0YTogUGF0aERlbHRhKSB7XG4gICAgaWYgKGRlbHRhLnJlbW92ZSkge1xuICAgICAgZm9yIChjb25zdCBrZXkgb2YgZGVsdGEucmVtb3ZlKSB7XG4gICAgICAgIHRoaXMucmVuZGVyUHJvcEtleXMuZGVsZXRlKGtleSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChkZWx0YS5hZGQpIHtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGRlbHRhLmFkZCkge1xuICAgICAgICB0aGlzLnJlbmRlclByb3BLZXlzLmFkZChrZXkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFwcGx5Q3NzUmVmc0RlbHRhKGRlbHRhOiBQYXRoRGVsdGEpIHtcbiAgICBpZiAoZGVsdGEucmVtb3ZlKSB7XG4gICAgICBmb3IgKGNvbnN0IHByb3Agb2YgZGVsdGEucmVtb3ZlKSB7XG4gICAgICAgIHRoaXMuY3NzUHJvcHMuZGVsZXRlKHByb3ApO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZGVsdGEuYWRkKSB7XG4gICAgICBmb3IgKGNvbnN0IHByb3Agb2YgZGVsdGEuYWRkKSB7XG4gICAgICAgIHRoaXMuY3NzUHJvcHMuYWRkKHByb3ApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldENhbGxiYWNrKHBhdGg6IHN0cmluZywgcHJvcDogc3RyaW5nKSB7XG4gICAgY29uc3Qga2V5ID0gdGhpcy5wcm9wUGF0aChwYXRoLCBwcm9wKTtcbiAgICBsZXQgZm4gPSB0aGlzLmNhbGxiYWNrQ2FjaGUuZ2V0KGtleSk7XG4gICAgaWYgKCFmbikge1xuICAgICAgZm4gPSAoLi4uYXJnczogYW55W10pID0+IHRoaXMuY2xpZW50Lmludm9rZUNhbGxiYWNrKHRoaXMucGF0aCwga2V5LCBhcmdzKTtcbiAgICAgIHRoaXMuY2FsbGJhY2tDYWNoZS5zZXQoa2V5LCBmbik7XG4gICAgfVxuICAgIHJldHVybiBmbjtcbiAgfVxuXG4gIHJlbmRlck5vZGUobm9kZTogVkRPTU5vZGUsIGN1cnJlbnRQYXRoID0gXCJcIik6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gICAgLy8gSGFuZGxlIHByaW1pdGl2ZXMgZWFybHlcbiAgICBpZiAoXG4gICAgICBub2RlID09IG51bGwgfHwgLy8gY2F0Y2hlcyBib3RoIG51bGwgYW5kIHVuZGVmaW5lZFxuICAgICAgdHlwZW9mIG5vZGUgPT09IFwiYm9vbGVhblwiIHx8XG4gICAgICB0eXBlb2Ygbm9kZSA9PT0gXCJudW1iZXJcIiB8fFxuICAgICAgdHlwZW9mIG5vZGUgPT09IFwic3RyaW5nXCJcbiAgICApIHtcbiAgICAgIHJldHVybiBub2RlO1xuICAgIH1cblxuICAgIC8vIEVsZW1lbnQgbm9kZXNcbiAgICBpZiAoaXNFbGVtZW50Tm9kZShub2RlKSkge1xuICAgICAgY29uc3QgeyB0YWcsIHByb3BzID0ge30sIGNoaWxkcmVuID0gW10gfSA9IG5vZGU7XG5cbiAgICAgIGNvbnN0IG5ld1Byb3BzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgICBmb3IgKGNvbnN0IFtwcm9wTmFtZSwgcHJvcFZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwcm9wcykpIHtcbiAgICAgICAgbmV3UHJvcHNbcHJvcE5hbWVdID0gdGhpcy50cmFuc2Zvcm1WYWx1ZShcbiAgICAgICAgICBjdXJyZW50UGF0aCxcbiAgICAgICAgICBwcm9wTmFtZSxcbiAgICAgICAgICBwcm9wVmFsdWVcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG5vZGUua2V5KSB7XG4gICAgICAgIG5ld1Byb3BzLmtleSA9IG5vZGUua2V5O1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZW5kZXJlZENoaWxkcmVuID0gW107XG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgY2hpbGRyZW4ubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW5baW5kZXhdITtcbiAgICAgICAgY29uc3QgY2hpbGRQYXRoID0gY3VycmVudFBhdGhcbiAgICAgICAgICA/IGAke2N1cnJlbnRQYXRofS4ke2luZGV4fWBcbiAgICAgICAgICA6IFN0cmluZyhpbmRleCk7XG4gICAgICAgIHJlbmRlcmVkQ2hpbGRyZW4ucHVzaCh0aGlzLnJlbmRlck5vZGUoY2hpbGQsIGNoaWxkUGF0aCkpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNNb3VudFBvaW50Tm9kZShub2RlKSkge1xuICAgICAgICBjb25zdCBjb21wb25lbnRLZXkgPSBub2RlLnRhZy5zbGljZShNT1VOVF9QT0lOVF9QUkVGSVgubGVuZ3RoKTtcbiAgICAgICAgY29uc3QgQ29tcG9uZW50ID0gdGhpcy5jb21wb25lbnRzW2NvbXBvbmVudEtleV0hO1xuICAgICAgICBpZiAoIUNvbXBvbmVudCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBDb3VsZCBub3QgZmluZCBjb21wb25lbnQgJHtjb21wb25lbnRLZXl9LiBUaGlzIGlzIGEgUHVsc2UgaW50ZXJuYWwgZXJyb3IuYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoQ29tcG9uZW50LCBuZXdQcm9wcywgLi4ucmVuZGVyZWRDaGlsZHJlbik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjcmVhdGVFbGVtZW50KFxuICAgICAgICB0YWcgPT09IEZSQUdNRU5UX1RBRyA/IFJlYWN0LkZyYWdtZW50IDogdGFnLFxuICAgICAgICBuZXdQcm9wcyxcbiAgICAgICAgLi4ucmVuZGVyZWRDaGlsZHJlblxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayBmb3IgdW5rbm93biBub2RlIHR5cGVzXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgY29uc29sZS5lcnJvcihcIlVua25vd24gVkRPTSBub2RlIHR5cGU6XCIsIG5vZGUpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgcHJvcFBhdGgocGF0aDogc3RyaW5nLCBwcm9wOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gcGF0aCA/IGAke3BhdGh9LiR7cHJvcH1gIDogcHJvcDtcbiAgfVxuXG4gIHRyYW5zZm9ybVZhbHVlKHBhdGg6IHN0cmluZywga2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICBjb25zdCBwcm9wUGF0aCA9IHRoaXMucHJvcFBhdGgocGF0aCwga2V5KTtcbiAgICBpZiAodGhpcy5jYWxsYmFja3MuaGFzKHByb3BQYXRoKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2FsbGJhY2socGF0aCwga2V5KTtcbiAgICB9XG4gICAgaWYgKHRoaXMucmVuZGVyUHJvcEtleXMuaGFzKHByb3BQYXRoKSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVuZGVyTm9kZSh2YWx1ZSwgcHJvcFBhdGgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5jc3NQcm9wcy5oYXMocHJvcFBhdGgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXNvbHZlQ3NzVG9rZW4odmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVDc3NUb2tlbih0b2tlbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBpZHggPSB0b2tlbi5pbmRleE9mKFwiOlwiKTtcbiAgICBpZiAoaWR4ID09PSAtMSkge1xuICAgICAgcmV0dXJuIHRva2VuO1xuICAgIH1cbiAgICBjb25zdCBtb2R1bGVJZCA9IHRva2VuLnNsaWNlKDAsIGlkeCk7XG4gICAgY29uc3QgY2xhc3NOYW1lID0gdG9rZW4uc2xpY2UoaWR4ICsgMSk7XG4gICAgaWYgKCFtb2R1bGVJZCB8fCAhY2xhc3NOYW1lKSB7XG4gICAgICByZXR1cm4gdG9rZW47XG4gICAgfVxuICAgIGNvbnN0IG1vZCA9IHRoaXMuY3NzTW9kdWxlc1ttb2R1bGVJZF07XG4gICAgaWYgKCFtb2QpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFJlY2VpdmVkIENTUyByZWZlcmVuY2UgZm9yIHVua25vd24gbW9kdWxlICcke21vZHVsZUlkfSdgXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCByZXNvbHZlZCA9IG1vZFtjbGFzc05hbWVdO1xuICAgIGlmICh0eXBlb2YgcmVzb2x2ZWQgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFJlY2VpdmVkIENTUyByZWZlcmVuY2UgZm9yIG1pc3NpbmcgY2xhc3MgJyR7Y2xhc3NOYW1lfScgaW4gbW9kdWxlICcke21vZHVsZUlkfSdgXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzb2x2ZWQ7XG4gIH1cbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFVwZGF0ZSBGdW5jdGlvbnMgKHNoYWxsb3ctY2xvbmUgYWxvbmcgdXBkYXRlIHBhdGgpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5mdW5jdGlvbiBlbnN1cmVDaGlsZHJlbkFycmF5KGVsOiBSZWFjdC5SZWFjdEVsZW1lbnQpOiBSZWFjdC5SZWFjdE5vZGVbXSB7XG4gIGNvbnN0IGNoaWxkcmVuID0gKGVsLnByb3BzIGFzIGFueSk/LmNoaWxkcmVuIGFzIFJlYWN0LlJlYWN0Tm9kZSB8IHVuZGVmaW5lZDtcbiAgaWYgKGNoaWxkcmVuID09IG51bGwpIHJldHVybiBbXTtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoY2hpbGRyZW4pID8gY2hpbGRyZW4uc2xpY2UoKSA6IFtjaGlsZHJlbl07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseVVwZGF0ZXMoXG4gIGluaXRpYWxUcmVlOiBSZWFjdC5SZWFjdE5vZGUsXG4gIHVwZGF0ZXM6IFZET01VcGRhdGVbXSxcbiAgcmVuZGVyZXI6IFZET01SZW5kZXJlclxuKTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgbGV0IG5ld1RyZWU6IFJlYWN0LlJlYWN0Tm9kZSA9IGluaXRpYWxUcmVlO1xuICBmb3IgKGNvbnN0IHVwZGF0ZSBvZiB1cGRhdGVzKSB7XG4gICAgaWYgKHVwZGF0ZS50eXBlID09PSBcInVwZGF0ZV9jYWxsYmFja3NcIikge1xuICAgICAgcmVuZGVyZXIuYXBwbHlDYWxsYmFja0RlbHRhKHVwZGF0ZS5kYXRhKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAodXBkYXRlLnR5cGUgPT09IFwidXBkYXRlX2Nzc19yZWZzXCIpIHtcbiAgICAgIHJlbmRlcmVyLmFwcGx5Q3NzUmVmc0RlbHRhKHVwZGF0ZS5kYXRhKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAodXBkYXRlLnR5cGUgPT09IFwidXBkYXRlX3JlbmRlcl9wcm9wc1wiKSB7XG4gICAgICByZW5kZXJlci5hcHBseVJlbmRlclByb3BzRGVsdGEodXBkYXRlLmRhdGEpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgcGFydHMgPSB1cGRhdGUucGF0aC5zcGxpdChcIi5cIikuZmlsdGVyKChzKSA9PiBzLmxlbmd0aCA+IDApO1xuXG4gICAgY29uc3QgZGVzY2VuZCA9IChcbiAgICAgIG5vZGU6IFJlYWN0LlJlYWN0Tm9kZSxcbiAgICAgIGRlcHRoOiBudW1iZXIsXG4gICAgICBwYXRoOiBzdHJpbmdcbiAgICApOiBSZWFjdC5SZWFjdE5vZGUgPT4ge1xuICAgICAgaWYgKGRlcHRoIDwgcGFydHMubGVuZ3RoKSB7XG4gICAgICAgIGFzc2VydElzRWxlbWVudChub2RlLCBwYXJ0cywgZGVwdGgpO1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gbm9kZSBhcyBSZWFjdC5SZWFjdEVsZW1lbnQ8UmVjb3JkPHN0cmluZywgYW55PiB8IG51bGw+O1xuICAgICAgICBjb25zdCBjaGlsZEtleSA9IHBhcnRzW2RlcHRoXSE7XG4gICAgICAgIGNvbnN0IGNoaWxkSWR4ID0gK2NoaWxkS2V5O1xuICAgICAgICBjb25zdCBjaGlsZFBhdGggPSBwYXRoID8gYCR7cGF0aH0uJHtjaGlsZEtleX1gIDogY2hpbGRLZXk7XG4gICAgICAgIGlmICghTnVtYmVyLmlzTmFOKGNoaWxkSWR4KSkge1xuICAgICAgICAgIC8vIFJlZ3VsYXIgY2hpbGQgdHJhdmVyc2FsXG4gICAgICAgICAgY29uc3QgY2hpbGRyZW5BcnIgPSBlbnN1cmVDaGlsZHJlbkFycmF5KGVsZW1lbnQpO1xuICAgICAgICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW5BcnJbY2hpbGRJZHhdO1xuICAgICAgICAgIGNoaWxkcmVuQXJyW2NoaWxkSWR4XSA9IGRlc2NlbmQoY2hpbGQsIGRlcHRoICsgMSwgY2hpbGRQYXRoKSBhcyBhbnk7XG4gICAgICAgICAgcmV0dXJuIGNsb25lRWxlbWVudChlbGVtZW50LCB1bmRlZmluZWQsIC4uLmNoaWxkcmVuQXJyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBSZW5kZXIgcHJvcCB0cmF2ZXJzYWxcbiAgICAgICAgICBjb25zdCBiYXNlUHJvcHMgPSAoZWxlbWVudC5wcm9wcyA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICAgICAgICBjb25zdCBjaGlsZCA9IGJhc2VQcm9wc1tjaGlsZEtleV07XG4gICAgICAgICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICAgICAgICAuLi5iYXNlUHJvcHMsXG4gICAgICAgICAgICBbY2hpbGRLZXldOiBkZXNjZW5kKGNoaWxkLCBkZXB0aCArIDEsIGNoaWxkUGF0aCksXG4gICAgICAgICAgfTtcbiAgICAgICAgICByZXR1cm4gY2xvbmVFbGVtZW50KGVsZW1lbnQsIHByb3BzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc3dpdGNoICh1cGRhdGUudHlwZSkge1xuICAgICAgICBjYXNlIFwicmVwbGFjZVwiOiB7XG4gICAgICAgICAgcmV0dXJuIHJlbmRlcmVyLnJlbmRlck5vZGUodXBkYXRlLmRhdGEsIHVwZGF0ZS5wYXRoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwidXBkYXRlX3Byb3BzXCI6IHtcbiAgICAgICAgICBhc3NlcnRJc0VsZW1lbnQobm9kZSwgcGFydHMsIGRlcHRoKTtcbiAgICAgICAgICBjb25zdCBlbGVtZW50ID0gbm9kZSBhcyBSZWFjdC5SZWFjdEVsZW1lbnQ7XG4gICAgICAgICAgY29uc3QgY3VycmVudFByb3BzID0gKGVsZW1lbnQucHJvcHMgPz8ge30pIGFzIFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgICAgICAgY29uc3QgbmV4dFByb3BzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0geyAuLi5jdXJyZW50UHJvcHMgfTtcbiAgICAgICAgICBjb25zdCBkZWx0YSA9IHVwZGF0ZS5kYXRhO1xuICAgICAgICAgIGlmIChkZWx0YS5yZW1vdmUgJiYgZGVsdGEucmVtb3ZlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIGRlbHRhLnJlbW92ZSkge1xuICAgICAgICAgICAgICBpZiAoa2V5IGluIG5leHRQcm9wcykge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBuZXh0UHJvcHNba2V5XTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZGVsdGEuc2V0KSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhkZWx0YS5zZXQpKSB7XG4gICAgICAgICAgICAgIG5leHRQcm9wc1trXSA9IHJlbmRlcmVyLnRyYW5zZm9ybVZhbHVlKHBhdGgsIGssIHYpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIElmIHNvbWUgcHJvcHMgd2VyZSByZW1vdmVkLCB1c2UgYGNyZWF0ZUVsZW1lbnRgIHRvIGZ1bGx5IG92ZXJyaWRlXG4gICAgICAgICAgLy8gdGhlIHByb3BzLCBhcyBgY2xvbmVFbGVtZW50YCBzaGFsbG93bHkgbWVyZ2VzIHRoZSBuZXcgcHJvcHMgd2l0aFxuICAgICAgICAgIC8vIHRoZSBvbGQgb25lcy5cbiAgICAgICAgICBjb25zdCByZW1vdmVkU29tZXRoaW5nID0gKGRlbHRhLnJlbW92ZT8ubGVuZ3RoID8/IDApID4gMDtcbiAgICAgICAgICBpZiAocmVtb3ZlZFNvbWV0aGluZykge1xuICAgICAgICAgICAgLy8gUHJlc2VydmUga2V5ICsgcmVmXG4gICAgICAgICAgICBuZXh0UHJvcHNbXCJrZXlcIl0gPSBlbGVtZW50LmtleTtcbiAgICAgICAgICAgIG5leHRQcm9wc1tcInJlZlwiXSA9IChlbGVtZW50IGFzIGFueSkucmVmO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgIGVsZW1lbnQudHlwZSxcbiAgICAgICAgICAgICAgbmV4dFByb3BzLFxuICAgICAgICAgICAgICAuLi5lbnN1cmVDaGlsZHJlbkFycmF5KGVsZW1lbnQpXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBEb24ndCB0b3VjaCBjaGlsZHJlbi4gS2V5IGFuZCByZWYgYXJlIHRyYW5zZmVycmVkIGJ5IGNsb25lRWxlbWVudC5cbiAgICAgICAgICAgIHJldHVybiBjbG9uZUVsZW1lbnQoZWxlbWVudCwgbmV4dFByb3BzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcInJlY29uY2lsaWF0aW9uXCI6IHtcbiAgICAgICAgICBhc3NlcnRJc0VsZW1lbnQobm9kZSwgcGFydHMsIGRlcHRoKTtcbiAgICAgICAgICBjb25zdCBlbGVtZW50ID0gbm9kZSBhcyBSZWFjdC5SZWFjdEVsZW1lbnQ7XG4gICAgICAgICAgY29uc3QgcHJldkNoaWxkcmVuID0gZW5zdXJlQ2hpbGRyZW5BcnJheShlbGVtZW50KTtcbiAgICAgICAgICBjb25zdCBuZXh0Q2hpbGRyZW4gPSBbXTtcblxuICAgICAgICAgIGNvbnN0IFtuZXdJbmRpY2VzLCBuZXdDb250ZW50c10gPSB1cGRhdGUubmV3O1xuICAgICAgICAgIGNvbnN0IFtyZXVzZUluZGljZXMsIHJldXNlU291cmNlc10gPSB1cGRhdGUucmV1c2U7XG5cbiAgICAgICAgICBsZXQgbmV4dE5ldyA9IC0xLFxuICAgICAgICAgICAgbmV4dFJldXNlID0gLTEsXG4gICAgICAgICAgICBuZXdJZHggPSAtMSxcbiAgICAgICAgICAgIHJldXNlSWR4ID0gLTE7XG4gICAgICAgICAgaWYgKG5ld0luZGljZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbmV4dE5ldyA9IG5ld0luZGljZXNbMF07XG4gICAgICAgICAgICBuZXdJZHggPSAwO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocmV1c2VJbmRpY2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIG5leHRSZXVzZSA9IHJldXNlSW5kaWNlc1swXTtcbiAgICAgICAgICAgIHJldXNlSWR4ID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB1cGRhdGUuTjsgKytpKSB7XG4gICAgICAgICAgICBpZiAoaSA9PT0gbmV4dE5ldykge1xuICAgICAgICAgICAgICBjb25zdCBjb250ZW50cyA9IG5ld0NvbnRlbnRzW25ld0lkeF07XG4gICAgICAgICAgICAgIGNvbnN0IGNoaWxkUGF0aCA9IHBhdGggPyBgJHtwYXRofS4ke2l9YCA6IFN0cmluZyhpKTtcbiAgICAgICAgICAgICAgbmV4dENoaWxkcmVuLnB1c2gocmVuZGVyZXIucmVuZGVyTm9kZShjb250ZW50cywgY2hpbGRQYXRoKSk7XG4gICAgICAgICAgICAgIG5leHROZXcgPVxuICAgICAgICAgICAgICAgIG5ld0lkeCA8IG5ld0luZGljZXMubGVuZ3RoIC0gMSA/IG5ld0luZGljZXNbKytuZXdJZHhdIDogLTE7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGkgPT09IG5leHRSZXVzZSkge1xuICAgICAgICAgICAgICBjb25zdCBzcmNJZHggPSByZXVzZVNvdXJjZXNbcmV1c2VJZHhdO1xuICAgICAgICAgICAgICBsZXQgc3JjID0gcHJldkNoaWxkcmVuW3NyY0lkeF07XG4gICAgICAgICAgICAgIGNvbnN0IGNoaWxkUGF0aCA9IHBhdGggPyBgJHtwYXRofS4ke2l9YCA6IFN0cmluZyhpKTtcbiAgICAgICAgICAgICAgLy8gVGhlIG5vZGUgbWF5IGhhdmUgY2FsbGJhY2tzIHRoYXQgbmVlZCB0byBiZSB1cGRhdGVkIGZvciB0aGlzIG5ldyBwYXRoXG4gICAgICAgICAgICAgIGlmIChyZW5kZXJlci5oYXNBbnlDYWxsYmFja1VuZGVyKGNoaWxkUGF0aCkpIHtcbiAgICAgICAgICAgICAgICBzcmMgPSByZWJpbmRDYWxsYmFja3NJblN1YnRyZWUoc3JjLCBjaGlsZFBhdGgsIHJlbmRlcmVyKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBuZXh0Q2hpbGRyZW4ucHVzaChzcmMpO1xuICAgICAgICAgICAgICBuZXh0UmV1c2UgPVxuICAgICAgICAgICAgICAgIHJldXNlSWR4IDwgcmV1c2VJbmRpY2VzLmxlbmd0aCAtIDFcbiAgICAgICAgICAgICAgICAgID8gcmV1c2VJbmRpY2VzWysrcmV1c2VJZHhdXG4gICAgICAgICAgICAgICAgICA6IC0xO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gTm8gbmVlZCB0byByZWJpbmQgY2FsbGJhY2tzLCB0aGUgbm9kZSBoYXNuJ3QgbW92ZWRcbiAgICAgICAgICAgICAgbmV4dENoaWxkcmVuLnB1c2gocHJldkNoaWxkcmVuW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gUGFzcyBudWxsIHRvIHJldXNlIHByZXZpb3VzIHByb3BzXG4gICAgICAgICAgcmV0dXJuIGNsb25lRWxlbWVudChlbGVtZW50LCBudWxsISwgLi4ubmV4dENoaWxkcmVuKTtcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBbUHVsc2UgcmVuZGVyZXJdIFVua25vd24gdXBkYXRlIHR5cGU6ICR7dXBkYXRlW1widHlwZVwiXX1gXG4gICAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgbmV3VHJlZSA9IGRlc2NlbmQobmV3VHJlZSwgMCwgXCJcIik7XG4gIH1cbiAgcmV0dXJuIG5ld1RyZWU7XG59XG5cbi8vIFRoZSBgY29tcG9uZW50YCBwcm9wIHNob3VsZCBiZSBzb21ldGhpbmcgbGlrZSBgKCkgPT5cbi8vIGltcG9ydCgnfi9wYXRoL3RvL2NvbXBvbmVudCcpICh3ZSdsbCBuZWVkIHRvIHJlbWFwIGlmIHdlJ3JlIGltcG9ydGluZyBhIG5hbWVkIGV4cG9ydCBhbmQgbm90IHRoZSBkZWZhdWx0KVxuZXhwb3J0IGZ1bmN0aW9uIFJlbmRlckxhenkoXG4gIGNvbXBvbmVudDogKCkgPT4gUHJvbWlzZTx7IGRlZmF1bHQ6IENvbXBvbmVudFR5cGU8YW55PiB9PixcbiAgZmFsbGJhY2s/OiBSZWFjdC5SZWFjdE5vZGVcbik6IFJlYWN0LkZDPFJlYWN0LlByb3BzV2l0aENoaWxkcmVuPHVua25vd24+PiB7XG4gIGNvbnN0IENvbXBvbmVudCA9IGxhenkoY29tcG9uZW50KTtcbiAgcmV0dXJuICh7IGNoaWxkcmVuLCAuLi5wcm9wcyB9OiBSZWFjdC5Qcm9wc1dpdGhDaGlsZHJlbjx1bmtub3duPikgPT4ge1xuICAgIHJldHVybiAoXG4gICAgICA8U3VzcGVuc2UgZmFsbGJhY2s9e2ZhbGxiYWNrID8/IDw+PC8+fT5cbiAgICAgICAgPENvbXBvbmVudCB7Li4ucHJvcHN9PntjaGlsZHJlbn08L0NvbXBvbmVudD5cbiAgICAgIDwvU3VzcGVuc2U+XG4gICAgKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXNzZXJ0SXNFbGVtZW50KFxuICBub2RlOiBSZWFjdC5SZWFjdE5vZGUsXG4gIHBhcnRzOiBzdHJpbmdbXSxcbiAgZGVwdGg6IG51bWJlclxuKTogbm9kZSBpcyBSZWFjdC5SZWFjdEVsZW1lbnQge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiICYmICFpc1ZhbGlkRWxlbWVudChub2RlKSkge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJJbnZhbGlkIG5vZGU6XCIsIG5vZGUpO1xuICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgbm9kZSBhdCBwYXRoIFwiICsgcGFydHMuc2xpY2UoMCwgZGVwdGgpLmpvaW4oXCIuXCIpKTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLy8gUmViaW5kIGNhbGxiYWNrIGZ1bmN0aW9uIHByb3BzIHdpdGhpbiBhIHN1YnRyZWUgYWZ0ZXIgYSBwYXRoLWNoYW5naW5nIG1vdmVcbmZ1bmN0aW9uIHJlYmluZENhbGxiYWNrc0luU3VidHJlZShcbiAgbm9kZTogUmVhY3QuUmVhY3ROb2RlLFxuICBwYXRoOiBzdHJpbmcsXG4gIHJlbmRlcmVyOiBWRE9NUmVuZGVyZXJcbik6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gIGlmICghaXNWYWxpZEVsZW1lbnQobm9kZSkpIHJldHVybiBub2RlO1xuICBjb25zdCBlbGVtZW50ID0gbm9kZSBhcyBSZWFjdC5SZWFjdEVsZW1lbnQ8UmVjb3JkPHN0cmluZywgYW55PiB8IG51bGw+O1xuICBjb25zdCBiYXNlUHJvcHMgPSAoZWxlbWVudC5wcm9wcyA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgYW55PjtcbiAgY29uc3QgbmV4dFByb3BzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0geyAuLi5iYXNlUHJvcHMgfTtcblxuICAvLyBSZWJpbmQgb25seSBjYWxsYmFjayBwcm9wczsgQ1NTIHJlZnMgYXJlIHBhdGgtYWdub3N0aWMgYW5kIHJlbmRlci1wcm9wc1xuICAvLyBhcmUgaGFuZGxlZCBieSB0aGUgc2VydmVyLXNpZGUgcmVuZGVyZXIgdmlhIGV4cGxpY2l0IHVwZGF0ZXNcbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoYmFzZVByb3BzKSkge1xuICAgIGNvbnN0IHByb3BQYXRoID0gcGF0aCA/IGAke3BhdGh9LiR7a2V5fWAgOiBrZXk7XG4gICAgaWYgKHJlbmRlcmVyLmhhc0NhbGxiYWNrUGF0aChwcm9wUGF0aCkpIHtcbiAgICAgIG5leHRQcm9wc1trZXldID0gcmVuZGVyZXIuZ2V0Q2FsbGJhY2socGF0aCwga2V5KTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgcmVuZGVyZXIuaGFzUmVuZGVyUHJvcFBhdGgocHJvcFBhdGgpICYmXG4gICAgICByZW5kZXJlci5oYXNBbnlDYWxsYmFja1VuZGVyKHByb3BQYXRoKVxuICAgICkge1xuICAgICAgbmV4dFByb3BzW2tleV0gPSByZWJpbmRDYWxsYmFja3NJblN1YnRyZWUoXG4gICAgICAgIGJhc2VQcm9wc1trZXldLFxuICAgICAgICBwcm9wUGF0aCxcbiAgICAgICAgcmVuZGVyZXJcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgY2hpbGRyZW4gPSBlbnN1cmVDaGlsZHJlbkFycmF5KGVsZW1lbnQpLm1hcCgoY2hpbGQsIGlkeCkgPT4ge1xuICAgIGNvbnN0IGNoaWxkUGF0aCA9IHBhdGggPyBgJHtwYXRofS4ke2lkeH1gIDogU3RyaW5nKGlkeCk7XG4gICAgaWYgKHJlbmRlcmVyLmhhc0FueUNhbGxiYWNrVW5kZXIoY2hpbGRQYXRoKSkge1xuICAgICAgcmV0dXJuIHJlYmluZENhbGxiYWNrc0luU3VidHJlZShjaGlsZCwgY2hpbGRQYXRoLCByZW5kZXJlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBjaGlsZDtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBjbG9uZUVsZW1lbnQoZWxlbWVudCwgbmV4dFByb3BzLCAuLi5jaGlsZHJlbik7XG59XG5cbi8vIEJpbmFyeS1zZWFyY2ggbG93ZXIgYm91bmQgZm9yIHByZWZpeCBtYXRjaGluZyBvbiBzb3J0ZWQgY2FsbGJhY2sgcGF0aHNcbmZ1bmN0aW9uIGxvd2VyQm91bmQoYXJyOiBzdHJpbmdbXSwgdGFyZ2V0OiBzdHJpbmcpOiBudW1iZXIge1xuICBsZXQgbG8gPSAwO1xuICBsZXQgaGkgPSBhcnIubGVuZ3RoO1xuICB3aGlsZSAobG8gPCBoaSkge1xuICAgIGNvbnN0IG1pZCA9IChsbyArIGhpKSA+Pj4gMTtcbiAgICBpZiAoYXJyW21pZF0hIDwgdGFyZ2V0KSB7XG4gICAgICBsbyA9IG1pZCArIDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIGhpID0gbWlkO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbG87XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgQ29tcG9uZW50VHlwZSB9IGZyb20gXCJyZWFjdFwiO1xuXG4vLyBTcGVjaWFsIHByZWZpeGVzIGZvciByZXNlcnZlZCBub2RlIHR5cGVzXG5leHBvcnQgY29uc3QgRlJBR01FTlRfVEFHID0gXCIkJGZyYWdtZW50XCI7XG5leHBvcnQgY29uc3QgTU9VTlRfUE9JTlRfUFJFRklYID0gXCIkJFwiO1xuXG4vLyBleHBvcnQgdHlwZSBMYXp5Q29tcG9uZW50ID0gKCkgPT4gUHJvbWlzZTx7IGRlZmF1bHQ6IENvbXBvbmVudFR5cGU8YW55PiB9PjtcbmV4cG9ydCB0eXBlIFJlZ2lzdHJ5RW50cnkgPSBDb21wb25lbnRUeXBlPGFueT47XG5leHBvcnQgdHlwZSBDb21wb25lbnRSZWdpc3RyeSA9IFJlY29yZDxzdHJpbmcsIENvbXBvbmVudFR5cGU8YW55Pj47XG5cbmV4cG9ydCBpbnRlcmZhY2UgVkRPTUVsZW1lbnQge1xuICB0YWc6IHN0cmluZztcbiAgcHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICBjaGlsZHJlbj86IFZET01Ob2RlW107XG4gIGtleT86IHN0cmluZztcbiAgbGF6eT86IGJvb2xlYW47XG59XG5cbi8vIFByaW1pdGl2ZSBub2RlcyB0aGF0IGNhbiBiZSByZW5kZXJlZFxuZXhwb3J0IHR5cGUgUHJpbWl0aXZlTm9kZSA9IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW47XG5cbi8vIFZET01Ob2RlIGlzIGVpdGhlciBhIHByaW1pdGl2ZSAoc3RyaW5nLCBudW1iZXIsIGJvb2xlYW4pIG9yIGFuIGVsZW1lbnQgbm9kZS5cbi8vIEJvb2xlYW5zIGFyZSB2YWxpZCBjaGlsZHJlbiBpbiBSZWFjdCBidXQgZG8gbm90IHJlbmRlciBhbnl0aGluZy5cbi8vIE1vdW50IHBvaW50cyBhcmUganVzdCBVSUVsZW1lbnROb2RlcyB3aXRoIHRhZ3Mgc3RhcnRpbmcgd2l0aCAkJENvbXBvbmVudEtleVxuZXhwb3J0IHR5cGUgVkRPTU5vZGUgPSBQcmltaXRpdmVOb2RlIHwgVkRPTUVsZW1lbnQ7XG5cbmV4cG9ydCB0eXBlIFZET00gPSBWRE9NTm9kZTtcblxuZXhwb3J0IGludGVyZmFjZSBWRE9NVXBkYXRlQmFzZSB7XG4gIHR5cGU6IHN0cmluZztcbiAgcGF0aDogc3RyaW5nOyAvLyBEb3Qtc2VwYXJhdGVkIHBhdGggdG8gdGhlIG5vZGVcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXBsYWNlVXBkYXRlIGV4dGVuZHMgVkRPTVVwZGF0ZUJhc2Uge1xuICB0eXBlOiBcInJlcGxhY2VcIjtcbiAgZGF0YTogVkRPTU5vZGU7IC8vIFRoZSBuZXcgbm9kZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZVByb3BzVXBkYXRlIGV4dGVuZHMgVkRPTVVwZGF0ZUJhc2Uge1xuICB0eXBlOiBcInVwZGF0ZV9wcm9wc1wiO1xuICBkYXRhOiB7XG4gICAgc2V0PzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICByZW1vdmU/OiBzdHJpbmdbXTtcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZWNvbmNpbGlhdGlvblVwZGF0ZSB7XG4gIHR5cGU6IFwicmVjb25jaWxpYXRpb25cIjtcbiAgcGF0aDogc3RyaW5nO1xuICBOOiBudW1iZXI7XG4gIG5ldzogW251bWJlcltdLCBWRE9NW11dO1xuICByZXVzZTogW251bWJlcltdLCBudW1iZXJbXV07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGF0aERlbHRhIHtcbiAgYWRkPzogc3RyaW5nW107XG4gIHJlbW92ZT86IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZUNhbGxiYWNrc1VwZGF0ZSBleHRlbmRzIFZET01VcGRhdGVCYXNlIHtcbiAgdHlwZTogXCJ1cGRhdGVfY2FsbGJhY2tzXCI7XG4gIGRhdGE6IFBhdGhEZWx0YTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVSZW5kZXJQcm9wc1VwZGF0ZSBleHRlbmRzIFZET01VcGRhdGVCYXNlIHtcbiAgdHlwZTogXCJ1cGRhdGVfcmVuZGVyX3Byb3BzXCI7XG4gIGRhdGE6IFBhdGhEZWx0YTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVDc3NSZWZzVXBkYXRlIGV4dGVuZHMgVkRPTVVwZGF0ZUJhc2Uge1xuICB0eXBlOiBcInVwZGF0ZV9jc3NfcmVmc1wiO1xuICBkYXRhOiBQYXRoRGVsdGE7XG59XG5cbmV4cG9ydCB0eXBlIFZET01VcGRhdGUgPVxuICB8IFJlcGxhY2VVcGRhdGVcbiAgfCBVcGRhdGVQcm9wc1VwZGF0ZVxuICB8IFJlY29uY2lsaWF0aW9uVXBkYXRlXG4gIHwgVXBkYXRlQ2FsbGJhY2tzVXBkYXRlXG4gIHwgVXBkYXRlUmVuZGVyUHJvcHNVcGRhdGVcbiAgfCBVcGRhdGVDc3NSZWZzVXBkYXRlO1xuXG5leHBvcnQgdHlwZSBVcGRhdGVUeXBlID0gVkRPTVVwZGF0ZVtcInR5cGVcIl07XG5cbi8vIFV0aWxpdHkgZnVuY3Rpb25zIGZvciB3b3JraW5nIHdpdGggdGhlIFVJIHRyZWUgc3RydWN0dXJlXG5leHBvcnQgZnVuY3Rpb24gaXNFbGVtZW50Tm9kZShub2RlOiBWRE9NTm9kZSk6IG5vZGUgaXMgVkRPTUVsZW1lbnQge1xuICAvLyBNYXRjaGVzIGFsbCBub24tdGV4dCBub2Rlc1xuICByZXR1cm4gdHlwZW9mIG5vZGUgPT09IFwib2JqZWN0XCIgJiYgbm9kZSAhPT0gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTW91bnRQb2ludE5vZGUobm9kZTogVkRPTU5vZGUpOiBub2RlIGlzIFZET01FbGVtZW50IHtcbiAgcmV0dXJuIChcbiAgICB0eXBlb2Ygbm9kZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgIG5vZGUgIT09IG51bGwgJiZcbiAgICBub2RlLnRhZy5zdGFydHNXaXRoKE1PVU5UX1BPSU5UX1BSRUZJWCkgJiZcbiAgICBub2RlLnRhZyAhPT0gRlJBR01FTlRfVEFHXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1RleHROb2RlKG5vZGU6IFZET01Ob2RlKTogbm9kZSBpcyBzdHJpbmcge1xuICByZXR1cm4gdHlwZW9mIG5vZGUgPT09IFwic3RyaW5nXCI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0ZyYWdtZW50KG5vZGU6IFZET01Ob2RlKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2Ygbm9kZSA9PT0gXCJvYmplY3RcIiAmJiBub2RlICE9PSBudWxsICYmIG5vZGUudGFnID09PSBGUkFHTUVOVF9UQUc7XG59XG4iLAogICAgIlxudHlwZSBTaW1wbGlmeTxUPiA9IHsgW0sgaW4ga2V5b2YgVF06IFRbS10gfSAmIHt9O1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRXh0cmFjdG9yPFQgZXh0ZW5kcyBvYmplY3Q+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+ID0ge307XG4gICAgICBvYmplY3RzLnB1c2gocmVzdWx0KTtcbiAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh2YWx1ZSk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qga2V5ID0ga2V5c1tpXTtcbiAgICAgICAgcmVzdWx0W2tleV0gPSByZWNvbnN0cnVjdCh2YWx1ZVtrZXldKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCB2YWx1ZSBpbiBkZXNlcmlhbGl6YXRpb246ICR7dmFsdWV9YCk7XG4gIH1cblxuICByZXR1cm4gcmVjb25zdHJ1Y3QoZGF0YSk7XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgUm91dGVJbmZvIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuaW1wb3J0IHR5cGUgeyBWRE9NLCBWRE9NVXBkYXRlIH0gZnJvbSBcIi4vdmRvbVwiO1xuaW1wb3J0IHsgZXh0cmFjdEV2ZW50IH0gZnJvbSBcIi4vc2VyaWFsaXplL2V2ZW50c1wiO1xuaW1wb3J0IHsgc2VyaWFsaXplLCBkZXNlcmlhbGl6ZSB9IGZyb20gXCIuL3NlcmlhbGl6ZS9zZXJpYWxpemVyXCI7XG5cbmltcG9ydCB7IGlvLCBTb2NrZXQgfSBmcm9tIFwic29ja2V0LmlvLWNsaWVudFwiO1xuaW1wb3J0IHR5cGUge1xuICBDbGllbnRBcGlSZXN1bHRNZXNzYWdlLFxuICBDbGllbnRDaGFubmVsTWVzc2FnZSxcbiAgQ2xpZW50TWVzc2FnZSxcbiAgU2VydmVyQXBpQ2FsbE1lc3NhZ2UsXG4gIFNlcnZlckNoYW5uZWxNZXNzYWdlLFxuICBTZXJ2ZXJFcnJvckluZm8sXG4gIFNlcnZlck1lc3NhZ2UsXG59IGZyb20gXCIuL21lc3NhZ2VzXCI7XG5pbXBvcnQgdHlwZSB7IE5hdmlnYXRlRnVuY3Rpb24gfSBmcm9tIFwicmVhY3Qtcm91dGVyXCI7XG5pbXBvcnQgdHlwZSB7IENoYW5uZWxCcmlkZ2UgfSBmcm9tIFwiLi9jaGFubmVsXCI7XG5pbXBvcnQgeyBjcmVhdGVDaGFubmVsQnJpZGdlLCBQdWxzZUNoYW5uZWxSZXNldEVycm9yIH0gZnJvbSBcIi4vY2hhbm5lbFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIE1vdW50ZWRWaWV3IHtcbiAgcm91dGVJbmZvOiBSb3V0ZUluZm87XG4gIG9uSW5pdDogKFxuICAgIHZkb206IFZET00sXG4gICAgY2FsbGJhY2tzOiBzdHJpbmdbXSxcbiAgICByZW5kZXJQcm9wczogc3RyaW5nW10sXG4gICAgY3NzUmVmczogc3RyaW5nW11cbiAgKSA9PiB2b2lkO1xuICBvblVwZGF0ZTogKG9wczogVkRPTVVwZGF0ZVtdKSA9PiB2b2lkO1xufVxuZXhwb3J0IHR5cGUgQ29ubmVjdGlvblN0YXR1c0xpc3RlbmVyID0gKGNvbm5lY3RlZDogYm9vbGVhbikgPT4gdm9pZDtcbmV4cG9ydCB0eXBlIFNlcnZlckVycm9yTGlzdGVuZXIgPSAoXG4gIHBhdGg6IHN0cmluZyxcbiAgZXJyb3I6IFNlcnZlckVycm9ySW5mbyB8IG51bGxcbikgPT4gdm9pZDtcblxuZXhwb3J0IGludGVyZmFjZSBQdWxzZUNsaWVudCB7XG4gIC8vIENvbm5lY3Rpb24gbWFuYWdlbWVudFxuICBjb25uZWN0KCk6IFByb21pc2U8dm9pZD47XG4gIGRpc2Nvbm5lY3QoKTogdm9pZDtcbiAgaXNDb25uZWN0ZWQoKTogYm9vbGVhbjtcbiAgb25Db25uZWN0aW9uQ2hhbmdlKGxpc3RlbmVyOiBDb25uZWN0aW9uU3RhdHVzTGlzdGVuZXIpOiAoKSA9PiB2b2lkO1xuICAvLyBNZXNzYWdlc1xuICBuYXZpZ2F0ZShwYXRoOiBzdHJpbmcsIHJvdXRlSW5mbzogUm91dGVJbmZvKTogUHJvbWlzZTx2b2lkPjtcbiAgbGVhdmUocGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcbiAgaW52b2tlQ2FsbGJhY2socGF0aDogc3RyaW5nLCBjYWxsYmFjazogc3RyaW5nLCBhcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD47XG4gIC8vIFZET00gc3Vic2NyaXB0aW9uXG4gIG1vdW50VmlldyhwYXRoOiBzdHJpbmcsIHZpZXc6IE1vdW50ZWRWaWV3KTogKCkgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGNsYXNzIFB1bHNlU29ja2V0SU9DbGllbnQge1xuICBwcml2YXRlIGFjdGl2ZVZpZXdzOiBNYXA8c3RyaW5nLCBNb3VudGVkVmlldz47XG4gIHByaXZhdGUgc29ja2V0OiBTb2NrZXQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBtZXNzYWdlUXVldWU6IENsaWVudE1lc3NhZ2VbXTtcbiAgcHJpdmF0ZSBjb25uZWN0aW9uTGlzdGVuZXJzOiBTZXQ8Q29ubmVjdGlvblN0YXR1c0xpc3RlbmVyPiA9IG5ldyBTZXQoKTtcbiAgcHJpdmF0ZSBzZXJ2ZXJFcnJvcnM6IE1hcDxzdHJpbmcsIFNlcnZlckVycm9ySW5mbz4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgc2VydmVyRXJyb3JMaXN0ZW5lcnM6IFNldDxTZXJ2ZXJFcnJvckxpc3RlbmVyPiA9IG5ldyBTZXQoKTtcbiAgcHJpdmF0ZSBjaGFubmVsczogTWFwPHN0cmluZywgeyBicmlkZ2U6IENoYW5uZWxCcmlkZ2U7IHJlZkNvdW50OiBudW1iZXIgfT4gPVxuICAgIG5ldyBNYXAoKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHVybDogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVuZGVySWQ6IHN0cmluZyxcbiAgICBwcml2YXRlIGZyYW1ld29ya05hdmlnYXRlOiBOYXZpZ2F0ZUZ1bmN0aW9uXG4gICkge1xuICAgIHRoaXMuc29ja2V0ID0gbnVsbDtcbiAgICB0aGlzLmFjdGl2ZVZpZXdzID0gbmV3IE1hcCgpO1xuICAgIHRoaXMubWVzc2FnZVF1ZXVlID0gW107XG4gIH1cbiAgcHVibGljIGlzQ29ubmVjdGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNvY2tldD8uY29ubmVjdGVkID8/IGZhbHNlO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGNvbm5lY3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuc29ja2V0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBzb2NrZXQgPSBpbyh0aGlzLnVybCwge1xuICAgICAgICB0cmFuc3BvcnRzOiBbXCJ3ZWJzb2NrZXRcIiwgXCJ3ZWJ0cmFuc3BvcnRcIl0sXG4gICAgICAgIGF1dGg6IHsgcmVuZGVySWQ6IHRoaXMucmVuZGVySWQgfSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5zb2NrZXQgPSBzb2NrZXQ7XG5cbiAgICAgIHNvY2tldC5vbihcImNvbm5lY3RcIiwgKCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhcIltTb2NrZXRJT1RyYW5zcG9ydF0gQ29ubmVjdGVkOlwiLCB0aGlzLnNvY2tldD8uaWQpO1xuICAgICAgICAvLyBNYWtlIHN1cmUgdG8gc2VuZCBhIG5hdmlnYXRlIHBheWxvYWQgZm9yIGFsbCB0aGUgcm91dGVzXG4gICAgICAgIGZvciAoY29uc3QgW3BhdGgsIHJvdXRlXSBvZiB0aGlzLmFjdGl2ZVZpZXdzKSB7XG4gICAgICAgICAgc29ja2V0LmVtaXQoXG4gICAgICAgICAgICBcIm1lc3NhZ2VcIixcbiAgICAgICAgICAgIHNlcmlhbGl6ZSh7XG4gICAgICAgICAgICAgIHR5cGU6IFwibW91bnRcIixcbiAgICAgICAgICAgICAgcGF0aDogcGF0aCxcbiAgICAgICAgICAgICAgcm91dGVJbmZvOiByb3V0ZS5yb3V0ZUluZm8sXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IHBheWxvYWQgb2YgdGhpcy5tZXNzYWdlUXVldWUpIHtcbiAgICAgICAgICAvLyBBbHJlYWR5IHNlbnQgYWJvdmVcbiAgICAgICAgICBpZiAocGF5bG9hZC50eXBlID09PSBcIm1vdW50XCIgJiYgdGhpcy5hY3RpdmVWaWV3cy5oYXMocGF5bG9hZC5wYXRoKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFdlJ3JlIHJlbW91bnRpbmcgYWxsIHRoZSByb3V0ZXMsIHNvIG5vIG5lZWQgdG8gbmF2aWdhdGVcbiAgICAgICAgICBpZiAocGF5bG9hZC50eXBlID09PSBcIm5hdmlnYXRlXCIpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzb2NrZXQuZW1pdChcIm1lc3NhZ2VcIiwgc2VyaWFsaXplKHBheWxvYWQpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1lc3NhZ2VRdWV1ZSA9IFtdO1xuXG4gICAgICAgIHRoaXMubm90aWZ5Q29ubmVjdGlvbkxpc3RlbmVycyh0cnVlKTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSk7XG5cbiAgICAgIHNvY2tldC5vbihcImNvbm5lY3RfZXJyb3JcIiwgKGVycikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiW1NvY2tldElPVHJhbnNwb3J0XSBDb25uZWN0aW9uIGZhaWxlZDpcIiwgZXJyKTtcbiAgICAgICAgdGhpcy5ub3RpZnlDb25uZWN0aW9uTGlzdGVuZXJzKGZhbHNlKTtcbiAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICB9KTtcblxuICAgICAgc29ja2V0Lm9uKFwiZGlzY29ubmVjdFwiLCAoKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiW1NvY2tldElPVHJhbnNwb3J0XSBEaXNjb25uZWN0ZWRcIik7XG4gICAgICAgIHRoaXMuaGFuZGxlVHJhbnNwb3J0RGlzY29ubmVjdCgpO1xuICAgICAgICB0aGlzLm5vdGlmeUNvbm5lY3Rpb25MaXN0ZW5lcnMoZmFsc2UpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFdyYXAgaW4gYW4gYXJyb3cgZnVuY3Rpb24gdG8gYXZvaWQgbG9zaW5nIHRoZSBgdGhpc2AgcmVmZXJlbmNlXG4gICAgICBzb2NrZXQub24oXCJtZXNzYWdlXCIsIChkYXRhKSA9PlxuICAgICAgICB0aGlzLmhhbmRsZVNlcnZlck1lc3NhZ2UoXG4gICAgICAgICAgZGVzZXJpYWxpemUoZGF0YSwgeyBjb2VyY2VOdWxsc1RvVW5kZWZpbmVkOiB0cnVlIH0pXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBvbkNvbm5lY3Rpb25DaGFuZ2UobGlzdGVuZXI6IENvbm5lY3Rpb25TdGF0dXNMaXN0ZW5lcik6ICgpID0+IHZvaWQge1xuICAgIHRoaXMuY29ubmVjdGlvbkxpc3RlbmVycy5hZGQobGlzdGVuZXIpO1xuICAgIGxpc3RlbmVyKHRoaXMuaXNDb25uZWN0ZWQoKSk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHRoaXMuY29ubmVjdGlvbkxpc3RlbmVycy5kZWxldGUobGlzdGVuZXIpO1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIG5vdGlmeUNvbm5lY3Rpb25MaXN0ZW5lcnMoY29ubmVjdGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lcnMpIHtcbiAgICAgIGxpc3RlbmVyKGNvbm5lY3RlZCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uU2VydmVyRXJyb3IobGlzdGVuZXI6IFNlcnZlckVycm9yTGlzdGVuZXIpOiAoKSA9PiB2b2lkIHtcbiAgICB0aGlzLnNlcnZlckVycm9yTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7XG4gICAgLy8gRW1pdCBjdXJyZW50IGVycm9ycyB0byBuZXcgbGlzdGVuZXJcbiAgICBmb3IgKGNvbnN0IFtwYXRoLCBlcnJdIG9mIHRoaXMuc2VydmVyRXJyb3JzKSBsaXN0ZW5lcihwYXRoLCBlcnIpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICB0aGlzLnNlcnZlckVycm9yTGlzdGVuZXJzLmRlbGV0ZShsaXN0ZW5lcik7XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgbm90aWZ5U2VydmVyRXJyb3IocGF0aDogc3RyaW5nLCBlcnJvcjogU2VydmVyRXJyb3JJbmZvIHwgbnVsbCkge1xuICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy5zZXJ2ZXJFcnJvckxpc3RlbmVycykgbGlzdGVuZXIocGF0aCwgZXJyb3IpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZW5kTWVzc2FnZShwYXlsb2FkOiBDbGllbnRNZXNzYWdlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaXNDb25uZWN0ZWQoKSkge1xuICAgICAgLy8gY29uc29sZS5sb2coXCJbU29ja2V0SU9UcmFuc3BvcnRdIFNlbmRpbmc6XCIsIHBheWxvYWQpO1xuICAgICAgdGhpcy5zb2NrZXQhLmVtaXQoXCJtZXNzYWdlXCIsIHNlcmlhbGl6ZShwYXlsb2FkIGFzIGFueSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBjb25zb2xlLmxvZyhcIltTb2NrZXRJT1RyYW5zcG9ydF0gUXVldWluZyBtZXNzYWdlOlwiLCBwYXlsb2FkKTtcbiAgICAgIHRoaXMubWVzc2FnZVF1ZXVlLnB1c2gocGF5bG9hZCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFzeW5jIHNlbmRDaGFubmVsTWVzc2FnZShcbiAgICBtZXNzYWdlOiBDbGllbnRDaGFubmVsTWVzc2FnZVxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnNlbmRNZXNzYWdlKG1lc3NhZ2UpO1xuICB9XG5cbiAgcHVibGljIG1vdW50VmlldyhwYXRoOiBzdHJpbmcsIHZpZXc6IE1vdW50ZWRWaWV3KSB7XG4gICAgaWYgKHRoaXMuYWN0aXZlVmlld3MuaGFzKHBhdGgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFBhdGggJHtwYXRofSBpcyBhbHJlYWR5IG1vdW50ZWRgKTtcbiAgICB9XG4gICAgdGhpcy5hY3RpdmVWaWV3cy5zZXQocGF0aCwgdmlldyk7XG4gICAgdm9pZCB0aGlzLnNlbmRNZXNzYWdlKHtcbiAgICAgIHR5cGU6IFwibW91bnRcIixcbiAgICAgIHBhdGgsXG4gICAgICByb3V0ZUluZm86IHZpZXcucm91dGVJbmZvLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIG5hdmlnYXRlKHBhdGg6IHN0cmluZywgcm91dGVJbmZvOiBSb3V0ZUluZm8pIHtcbiAgICBhd2FpdCB0aGlzLnNlbmRNZXNzYWdlKHtcbiAgICAgIHR5cGU6IFwibmF2aWdhdGVcIixcbiAgICAgIHBhdGgsXG4gICAgICByb3V0ZUluZm8sXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgdW5tb3VudChwYXRoOiBzdHJpbmcpIHtcbiAgICB2b2lkIHRoaXMuc2VuZE1lc3NhZ2UoeyB0eXBlOiBcInVubW91bnRcIiwgcGF0aCB9KTtcbiAgICB0aGlzLmFjdGl2ZVZpZXdzLmRlbGV0ZShwYXRoKTtcbiAgfVxuXG4gIHB1YmxpYyBkaXNjb25uZWN0KCkge1xuICAgIHRoaXMuc29ja2V0Py5kaXNjb25uZWN0KCk7XG4gICAgdGhpcy5zb2NrZXQgPSBudWxsO1xuICAgIHRoaXMubWVzc2FnZVF1ZXVlID0gW107XG4gICAgdGhpcy5jb25uZWN0aW9uTGlzdGVuZXJzLmNsZWFyKCk7XG4gICAgdGhpcy5hY3RpdmVWaWV3cy5jbGVhcigpO1xuICAgIHRoaXMuc2VydmVyRXJyb3JzLmNsZWFyKCk7XG4gICAgdGhpcy5zZXJ2ZXJFcnJvckxpc3RlbmVycy5jbGVhcigpO1xuICAgIGZvciAoY29uc3QgeyBicmlkZ2UgfSBvZiB0aGlzLmNoYW5uZWxzLnZhbHVlcygpKSB7XG4gICAgICBicmlkZ2UuZGlzcG9zZShuZXcgUHVsc2VDaGFubmVsUmVzZXRFcnJvcihcIkNsaWVudCBkaXNjb25uZWN0ZWRcIikpO1xuICAgIH1cbiAgICB0aGlzLmNoYW5uZWxzLmNsZWFyKCk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVNlcnZlck1lc3NhZ2UobWVzc2FnZTogU2VydmVyTWVzc2FnZSkge1xuICAgIC8vIGNvbnNvbGUubG9nKFwiW1B1bHNlQ2xpZW50XSBSZWNlaXZlZCBtZXNzYWdlOlwiLCBtZXNzYWdlKTtcbiAgICBzd2l0Y2ggKG1lc3NhZ2UudHlwZSkge1xuICAgICAgY2FzZSBcInZkb21faW5pdFwiOiB7XG4gICAgICAgIGNvbnN0IHJvdXRlID0gdGhpcy5hY3RpdmVWaWV3cy5nZXQobWVzc2FnZS5wYXRoKTtcbiAgICAgICAgLy8gSWdub3JlIG1lc3NhZ2VzIGZvciBwYXRocyB0aGF0IGFyZSBub3QgbW91bnRlZFxuICAgICAgICBpZiAoIXJvdXRlKSByZXR1cm47XG4gICAgICAgIGlmIChyb3V0ZSkge1xuICAgICAgICAgIHJvdXRlLm9uSW5pdChcbiAgICAgICAgICAgIG1lc3NhZ2UudmRvbSxcbiAgICAgICAgICAgIG1lc3NhZ2UuY2FsbGJhY2tzLFxuICAgICAgICAgICAgbWVzc2FnZS5yZW5kZXJfcHJvcHMsXG4gICAgICAgICAgICBtZXNzYWdlLmNzc19yZWZzXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBDbGVhciBhbnkgcHJpb3IgZXJyb3IgZm9yIHRoaXMgcGF0aCBvbiBzdWNjZXNzZnVsIGluaXRcbiAgICAgICAgaWYgKHRoaXMuc2VydmVyRXJyb3JzLmhhcyhtZXNzYWdlLnBhdGgpKSB7XG4gICAgICAgICAgdGhpcy5zZXJ2ZXJFcnJvcnMuZGVsZXRlKG1lc3NhZ2UucGF0aCk7XG4gICAgICAgICAgdGhpcy5ub3RpZnlTZXJ2ZXJFcnJvcihtZXNzYWdlLnBhdGgsIG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBcInZkb21fdXBkYXRlXCI6IHtcbiAgICAgICAgY29uc3Qgcm91dGUgPSB0aGlzLmFjdGl2ZVZpZXdzLmdldChtZXNzYWdlLnBhdGgpO1xuICAgICAgICBpZiAoIXJvdXRlKSByZXR1cm47IC8vIE5vdCBhbiBhY3RpdmUgcGF0aDsgZGlzY2FyZFxuICAgICAgICByb3V0ZS5vblVwZGF0ZShtZXNzYWdlLm9wcyk7XG4gICAgICAgIC8vIENsZWFyIGFueSBwcmlvciBlcnJvciBmb3IgdGhpcyBwYXRoIG9uIHN1Y2Nlc3NmdWwgdXBkYXRlXG4gICAgICAgIGlmICh0aGlzLnNlcnZlckVycm9ycy5oYXMobWVzc2FnZS5wYXRoKSkge1xuICAgICAgICAgIHRoaXMuc2VydmVyRXJyb3JzLmRlbGV0ZShtZXNzYWdlLnBhdGgpO1xuICAgICAgICAgIHRoaXMubm90aWZ5U2VydmVyRXJyb3IobWVzc2FnZS5wYXRoLCBudWxsKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJzZXJ2ZXJfZXJyb3JcIjoge1xuICAgICAgICBpZiAoIXRoaXMuYWN0aXZlVmlld3MuaGFzKG1lc3NhZ2UucGF0aCkpIHJldHVybjsgLy8gZGlzY2FyZCBmb3IgaW5hY3RpdmUgcGF0aHNcbiAgICAgICAgdGhpcy5zZXJ2ZXJFcnJvcnMuc2V0KG1lc3NhZ2UucGF0aCwgbWVzc2FnZS5lcnJvcik7XG4gICAgICAgIHRoaXMubm90aWZ5U2VydmVyRXJyb3IobWVzc2FnZS5wYXRoLCBtZXNzYWdlLmVycm9yKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFwiYXBpX2NhbGxcIjoge1xuICAgICAgICB2b2lkIHRoaXMucGVyZm9ybUFwaUNhbGwobWVzc2FnZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBcIm5hdmlnYXRlX3RvXCI6IHtcbiAgICAgICAgLy8gYG5hdmlnYXRlX3RvYCBpcyBuYXZpZ2F0aW9uYWw7IGFsbG93IHJlZ2FyZGxlc3Mgb2YgYWN0aXZlVmlld3MgbWVtYmVyc2hpcFxuICAgICAgICBjb25zdCByZXBsYWNlID0gISFtZXNzYWdlLnJlcGxhY2U7XG4gICAgICAgIGxldCBkZXN0ID0gbWVzc2FnZS5wYXRoIHx8IFwiXCI7XG4gICAgICAgIC8vIE5vcm1hbGl6ZSBwcm90b2NvbC1yZWxhdGl2ZSBVUkxzIHRvIGFic29sdXRlXG4gICAgICAgIGlmIChkZXN0LnN0YXJ0c1dpdGgoXCIvL1wiKSkgZGVzdCA9IGAke3dpbmRvdy5sb2NhdGlvbi5wcm90b2NvbH0ke2Rlc3R9YDtcbiAgICAgICAgY29uc3QgaGFzU2NoZW1lID0gL15bYS16QS1aXVthLXpBLVowLTkrLi1dKjovLnRlc3QoZGVzdCk7XG4gICAgICAgIGlmIChoYXNTY2hlbWUpIHtcbiAgICAgICAgICBpZiAoZGVzdC5zdGFydHNXaXRoKFwiaHR0cDovL1wiKSB8fCBkZXN0LnN0YXJ0c1dpdGgoXCJodHRwczovL1wiKSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTChkZXN0KTtcbiAgICAgICAgICAgICAgaWYgKHVybC5vcmlnaW4gPT09IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbnRlcm5hbCA9IGAke3VybC5wYXRobmFtZX0ke3VybC5zZWFyY2h9JHt1cmwuaGFzaH1gO1xuICAgICAgICAgICAgICAgIHRoaXMuZnJhbWV3b3JrTmF2aWdhdGUoaW50ZXJuYWwsIHsgcmVwbGFjZSB9KTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAocmVwbGFjZSkgd2luZG93LmxvY2F0aW9uLnJlcGxhY2UoZGVzdCk7XG4gICAgICAgICAgICAgICAgZWxzZSB3aW5kb3cubG9jYXRpb24uYXNzaWduKGRlc3QpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgaWYgKHJlcGxhY2UpIHdpbmRvdy5sb2NhdGlvbi5yZXBsYWNlKGRlc3QpO1xuICAgICAgICAgICAgICBlbHNlIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oZGVzdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIG1haWx0bzosIHRlbDosIGRhdGE6LCBldGMuXG4gICAgICAgICAgICBpZiAocmVwbGFjZSkgd2luZG93LmxvY2F0aW9uLnJlcGxhY2UoZGVzdCk7XG4gICAgICAgICAgICBlbHNlIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oZGVzdCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFJlbGF0aXZlIG9yIHJvb3QtcmVsYXRpdmUgcGF0aCDihpIgU1BBIG5hdmlnYXRlXG4gICAgICAgICAgdGhpcy5mcmFtZXdvcmtOYXZpZ2F0ZShkZXN0LCB7IHJlcGxhY2UgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFwiY2hhbm5lbF9tZXNzYWdlXCI6IHtcbiAgICAgICAgdGhpcy5yb3V0ZUNoYW5uZWxNZXNzYWdlKG1lc3NhZ2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIlVuZXhwZWN0ZWQgbWVzc2FnZTpcIiwgbWVzc2FnZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwZXJmb3JtQXBpQ2FsbChtc2c6IFNlcnZlckFwaUNhbGxNZXNzYWdlKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKG1zZy51cmwsIHtcbiAgICAgICAgbWV0aG9kOiBtc2cubWV0aG9kIHx8IFwiR0VUXCIsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAuLi4obXNnLmhlYWRlcnMgfHwge30pLFxuICAgICAgICAgIC4uLihtc2cuYm9keSAhPSBudWxsICYmICEoXCJjb250ZW50LXR5cGVcIiBpbiAobXNnLmhlYWRlcnMgfHwge30pKVxuICAgICAgICAgICAgPyB7IFwiY29udGVudC10eXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiIH1cbiAgICAgICAgICAgIDoge30pLFxuICAgICAgICB9LFxuICAgICAgICBib2R5OlxuICAgICAgICAgIG1zZy5ib2R5ICE9IG51bGxcbiAgICAgICAgICAgID8gdHlwZW9mIG1zZy5ib2R5ID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgICAgID8gbXNnLmJvZHlcbiAgICAgICAgICAgICAgOiBKU09OLnN0cmluZ2lmeShtc2cuYm9keSlcbiAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICBjcmVkZW50aWFsczogbXNnLmNyZWRlbnRpYWxzIHx8IFwiaW5jbHVkZVwiLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBoZWFkZXJzT2JqOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgICByZXMuaGVhZGVycy5mb3JFYWNoKCh2LCBrKSA9PiAoaGVhZGVyc09ialtrXSA9IHYpKTtcbiAgICAgIGxldCBib2R5OiBhbnkgPSBudWxsO1xuICAgICAgY29uc3QgY3QgPSByZXMuaGVhZGVycy5nZXQoXCJjb250ZW50LXR5cGVcIikgfHwgXCJcIjtcbiAgICAgIGlmIChjdC5pbmNsdWRlcyhcImFwcGxpY2F0aW9uL2pzb25cIikpIHtcbiAgICAgICAgYm9keSA9IGF3YWl0IHJlcy5qc29uKCkuY2F0Y2goKCkgPT4gbnVsbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBib2R5ID0gYXdhaXQgcmVzLnRleHQoKS5jYXRjaCgoKSA9PiBudWxsKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlcGx5OiBDbGllbnRBcGlSZXN1bHRNZXNzYWdlID0ge1xuICAgICAgICB0eXBlOiBcImFwaV9yZXN1bHRcIixcbiAgICAgICAgaWQ6IG1zZy5pZCxcbiAgICAgICAgb2s6IHJlcy5vayxcbiAgICAgICAgc3RhdHVzOiByZXMuc3RhdHVzLFxuICAgICAgICBoZWFkZXJzOiBoZWFkZXJzT2JqLFxuICAgICAgICBib2R5LFxuICAgICAgfTtcbiAgICAgIGF3YWl0IHRoaXMuc2VuZE1lc3NhZ2UocmVwbHkpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc3QgcmVwbHk6IENsaWVudEFwaVJlc3VsdE1lc3NhZ2UgPSB7XG4gICAgICAgIHR5cGU6IFwiYXBpX3Jlc3VsdFwiLFxuICAgICAgICBpZDogbXNnLmlkLFxuICAgICAgICBvazogZmFsc2UsXG4gICAgICAgIHN0YXR1czogMCxcbiAgICAgICAgaGVhZGVyczoge30sXG4gICAgICAgIGJvZHk6IHsgZXJyb3I6IFN0cmluZyhlcnIpIH0sXG4gICAgICB9O1xuICAgICAgYXdhaXQgdGhpcy5zZW5kTWVzc2FnZShyZXBseSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGludm9rZUNhbGxiYWNrKHBhdGg6IHN0cmluZywgY2FsbGJhY2s6IHN0cmluZywgYXJnczogYW55W10pIHtcbiAgICBhd2FpdCB0aGlzLnNlbmRNZXNzYWdlKHtcbiAgICAgIHR5cGU6IFwiY2FsbGJhY2tcIixcbiAgICAgIHBhdGgsXG4gICAgICBjYWxsYmFjayxcbiAgICAgIGFyZ3M6IGFyZ3MubWFwKGV4dHJhY3RFdmVudCksXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYWNxdWlyZUNoYW5uZWwoaWQ6IHN0cmluZyk6IENoYW5uZWxCcmlkZ2Uge1xuICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5lbnN1cmVDaGFubmVsRW50cnkoaWQpO1xuICAgIGVudHJ5LnJlZkNvdW50ICs9IDE7XG4gICAgcmV0dXJuIGVudHJ5LmJyaWRnZTtcbiAgfVxuXG4gIHB1YmxpYyByZWxlYXNlQ2hhbm5lbChpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgZW50cnkgPSB0aGlzLmNoYW5uZWxzLmdldChpZCk7XG4gICAgaWYgKCFlbnRyeSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlbnRyeS5yZWZDb3VudCA9IE1hdGgubWF4KDAsIGVudHJ5LnJlZkNvdW50IC0gMSk7XG4gICAgaWYgKGVudHJ5LnJlZkNvdW50ID09PSAwKSB7XG4gICAgICBlbnRyeS5icmlkZ2UuZGlzcG9zZShuZXcgUHVsc2VDaGFubmVsUmVzZXRFcnJvcihcIkNoYW5uZWwgcmVsZWFzZWRcIikpO1xuICAgICAgdGhpcy5jaGFubmVscy5kZWxldGUoaWQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZW5zdXJlQ2hhbm5lbEVudHJ5KGlkOiBzdHJpbmcpOiB7XG4gICAgYnJpZGdlOiBDaGFubmVsQnJpZGdlO1xuICAgIHJlZkNvdW50OiBudW1iZXI7XG4gIH0ge1xuICAgIGxldCBlbnRyeSA9IHRoaXMuY2hhbm5lbHMuZ2V0KGlkKTtcbiAgICBpZiAoIWVudHJ5KSB7XG4gICAgICBlbnRyeSA9IHtcbiAgICAgICAgYnJpZGdlOiBjcmVhdGVDaGFubmVsQnJpZGdlKHRoaXMsIGlkKSxcbiAgICAgICAgcmVmQ291bnQ6IDAsXG4gICAgICB9O1xuICAgICAgdGhpcy5jaGFubmVscy5zZXQoaWQsIGVudHJ5KTtcbiAgICB9XG4gICAgcmV0dXJuIGVudHJ5O1xuICB9XG5cbiAgcHJpdmF0ZSByb3V0ZUNoYW5uZWxNZXNzYWdlKG1lc3NhZ2U6IFNlcnZlckNoYW5uZWxNZXNzYWdlKTogdm9pZCB7XG4gICAgY29uc3QgZW50cnkgPSB0aGlzLmVuc3VyZUNoYW5uZWxFbnRyeShtZXNzYWdlLmNoYW5uZWwpO1xuICAgIGNvbnN0IGNsb3NlZCA9IGVudHJ5LmJyaWRnZS5oYW5kbGVTZXJ2ZXJNZXNzYWdlKG1lc3NhZ2UpO1xuICAgIGlmIChjbG9zZWQgJiYgZW50cnkucmVmQ291bnQgPT09IDApIHtcbiAgICAgIHRoaXMuY2hhbm5lbHMuZGVsZXRlKG1lc3NhZ2UuY2hhbm5lbCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVUcmFuc3BvcnREaXNjb25uZWN0KCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgZW50cnkgb2YgdGhpcy5jaGFubmVscy52YWx1ZXMoKSkge1xuICAgICAgZW50cnkuYnJpZGdlLmhhbmRsZURpc2Nvbm5lY3QoXG4gICAgICAgIG5ldyBQdWxzZUNoYW5uZWxSZXNldEVycm9yKFwiQ29ubmVjdGlvbiBsb3N0XCIpXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8vIHB1YmxpYyBnZXRWRE9NKHBhdGg6IHN0cmluZyk6IFZET00gfCBudWxsIHtcbiAgLy8gICByZXR1cm4gdGhpcy5hY3RpdmVWaWV3cy5nZXQocGF0aCk/LnZkb20gPz8gbnVsbDtcbiAgLy8gfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7XG4gIFNlcnZlckNoYW5uZWxNZXNzYWdlLFxuICBTZXJ2ZXJDaGFubmVsUmVxdWVzdE1lc3NhZ2UsXG4gIFNlcnZlckNoYW5uZWxSZXNwb25zZU1lc3NhZ2UsXG59IGZyb20gXCIuL21lc3NhZ2VzXCI7XG5pbXBvcnQgdHlwZSB7IFB1bHNlU29ja2V0SU9DbGllbnQgfSBmcm9tIFwiLi9jbGllbnRcIjtcblxuZXhwb3J0IGNsYXNzIFB1bHNlQ2hhbm5lbFJlc2V0RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9IFwiUHVsc2VDaGFubmVsUmVzZXRFcnJvclwiO1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIENoYW5uZWxFdmVudEhhbmRsZXIgPSAocGF5bG9hZDogYW55KSA9PiBhbnkgfCBQcm9taXNlPGFueT47XG5cbmludGVyZmFjZSBQZW5kaW5nUmVxdWVzdCB7XG4gIHJlc29sdmU6ICh2YWx1ZTogYW55KSA9PiB2b2lkO1xuICByZWplY3Q6IChlcnJvcjogYW55KSA9PiB2b2lkO1xufVxuXG5mdW5jdGlvbiByYW5kb21JZCgpOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIGNyeXB0byAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2YgY3J5cHRvLnJhbmRvbVVVSUQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHJldHVybiBjcnlwdG8ucmFuZG9tVVVJRCgpLnJlcGxhY2UoLy0vZywgXCJcIik7XG4gIH1cbiAgcmV0dXJuIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMTYpLnNsaWNlKDIpICsgTWF0aC5yYW5kb20oKS50b1N0cmluZygxNikuc2xpY2UoMik7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdEVycm9yKGVycm9yOiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHJldHVybiBlcnJvci5tZXNzYWdlO1xuICBpZiAodHlwZW9mIGVycm9yID09PSBcInN0cmluZ1wiKSByZXR1cm4gZXJyb3I7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGVycm9yKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIFN0cmluZyhlcnJvcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNTZXJ2ZXJSZXNwb25zZU1lc3NhZ2UoXG4gIG1lc3NhZ2U6IFNlcnZlckNoYW5uZWxNZXNzYWdlXG4pOiBtZXNzYWdlIGlzIFNlcnZlckNoYW5uZWxSZXNwb25zZU1lc3NhZ2Uge1xuICByZXR1cm4gdHlwZW9mIChtZXNzYWdlIGFzIFNlcnZlckNoYW5uZWxSZXNwb25zZU1lc3NhZ2UpLnJlc3BvbnNlVG8gPT09IFwic3RyaW5nXCI7XG59XG5cbmZ1bmN0aW9uIGlzU2VydmVyUmVxdWVzdE1lc3NhZ2UoXG4gIG1lc3NhZ2U6IFNlcnZlckNoYW5uZWxNZXNzYWdlXG4pOiBtZXNzYWdlIGlzIFNlcnZlckNoYW5uZWxSZXF1ZXN0TWVzc2FnZSB7XG4gIHJldHVybiB0eXBlb2YgKG1lc3NhZ2UgYXMgU2VydmVyQ2hhbm5lbFJlcXVlc3RNZXNzYWdlKS5ldmVudCA9PT0gXCJzdHJpbmdcIjtcbn1cblxuZXhwb3J0IGNsYXNzIENoYW5uZWxCcmlkZ2Uge1xuICBwcml2YXRlIGhhbmRsZXJzID0gbmV3IE1hcDxzdHJpbmcsIFNldDxDaGFubmVsRXZlbnRIYW5kbGVyPj4oKTtcbiAgcHJpdmF0ZSBwZW5kaW5nID0gbmV3IE1hcDxzdHJpbmcsIFBlbmRpbmdSZXF1ZXN0PigpO1xuICBwcml2YXRlIGJhY2tsb2c6IFNlcnZlckNoYW5uZWxSZXF1ZXN0TWVzc2FnZVtdID0gW107XG4gIHByaXZhdGUgY2xvc2VkID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjbGllbnQ6IFB1bHNlU29ja2V0SU9DbGllbnQsIHB1YmxpYyByZWFkb25seSBpZDogc3RyaW5nKSB7fVxuXG4gIGVtaXQoZXZlbnQ6IHN0cmluZywgcGF5bG9hZD86IGFueSk6IHZvaWQge1xuICAgIHRoaXMuZW5zdXJlT3BlbigpO1xuICAgIHZvaWQgdGhpcy5jbGllbnQuc2VuZENoYW5uZWxNZXNzYWdlKHtcbiAgICAgIHR5cGU6IFwiY2hhbm5lbF9tZXNzYWdlXCIsXG4gICAgICBjaGFubmVsOiB0aGlzLmlkLFxuICAgICAgZXZlbnQsXG4gICAgICBwYXlsb2FkLFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgcmVxdWVzdChldmVudDogc3RyaW5nLCBwYXlsb2FkPzogYW55KTogUHJvbWlzZTxhbnk+IHtcbiAgICB0aGlzLmVuc3VyZU9wZW4oKTtcbiAgICBjb25zdCByZXF1ZXN0SWQgPSByYW5kb21JZCgpO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLnBlbmRpbmcuc2V0KHJlcXVlc3RJZCwgeyByZXNvbHZlLCByZWplY3QgfSk7XG4gICAgICB2b2lkIHRoaXMuY2xpZW50XG4gICAgICAgIC5zZW5kQ2hhbm5lbE1lc3NhZ2Uoe1xuICAgICAgICAgIHR5cGU6IFwiY2hhbm5lbF9tZXNzYWdlXCIsXG4gICAgICAgICAgY2hhbm5lbDogdGhpcy5pZCxcbiAgICAgICAgICBldmVudCxcbiAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICB0aGlzLnBlbmRpbmcuZGVsZXRlKHJlcXVlc3RJZCk7XG4gICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgb24oZXZlbnQ6IHN0cmluZywgaGFuZGxlcjogQ2hhbm5lbEV2ZW50SGFuZGxlcik6ICgpID0+IHZvaWQge1xuICAgIHRoaXMuZW5zdXJlT3BlbigpO1xuICAgIGxldCBidWNrZXQgPSB0aGlzLmhhbmRsZXJzLmdldChldmVudCk7XG4gICAgaWYgKCFidWNrZXQpIHtcbiAgICAgIGJ1Y2tldCA9IG5ldyBTZXQoKTtcbiAgICAgIHRoaXMuaGFuZGxlcnMuc2V0KGV2ZW50LCBidWNrZXQpO1xuICAgIH1cbiAgICBidWNrZXQuYWRkKGhhbmRsZXIpO1xuICAgIHRoaXMuZmx1c2hCYWNrbG9nKGV2ZW50KTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgY29uc3Qgc2V0ID0gdGhpcy5oYW5kbGVycy5nZXQoZXZlbnQpO1xuICAgICAgaWYgKCFzZXQpIHJldHVybjtcbiAgICAgIHNldC5kZWxldGUoaGFuZGxlcik7XG4gICAgICBpZiAoc2V0LnNpemUgPT09IDApIHtcbiAgICAgICAgdGhpcy5oYW5kbGVycy5kZWxldGUoZXZlbnQpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBoYW5kbGVTZXJ2ZXJNZXNzYWdlKG1lc3NhZ2U6IFNlcnZlckNoYW5uZWxNZXNzYWdlKTogYm9vbGVhbiB7XG4gICAgaWYgKGlzU2VydmVyUmVzcG9uc2VNZXNzYWdlKG1lc3NhZ2UpKSB7XG4gICAgICB0aGlzLnJlc29sdmVQZW5kaW5nKG1lc3NhZ2UpO1xuICAgICAgcmV0dXJuIHRoaXMuY2xvc2VkO1xuICAgIH1cbiAgICBpZiAodGhpcy5jbG9zZWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoIWlzU2VydmVyUmVxdWVzdE1lc3NhZ2UobWVzc2FnZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmNsb3NlZDtcbiAgICB9XG5cbiAgICBpZiAobWVzc2FnZS5ldmVudCA9PT0gXCJfX2Nsb3NlX19cIikge1xuICAgICAgdGhpcy5jbG9zZShuZXcgUHVsc2VDaGFubmVsUmVzZXRFcnJvcihcIkNoYW5uZWwgY2xvc2VkIGJ5IHNlcnZlclwiKSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKG1lc3NhZ2UucmVxdWVzdElkKSB7XG4gICAgICB2b2lkIHRoaXMuZGlzcGF0Y2hSZXF1ZXN0KG1lc3NhZ2UgYXMgU2VydmVyQ2hhbm5lbFJlcXVlc3RNZXNzYWdlICYge1xuICAgICAgICByZXF1ZXN0SWQ6IHN0cmluZztcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobWVzc2FnZSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNsb3NlZDtcbiAgfVxuXG4gIGhhbmRsZURpc2Nvbm5lY3QocmVhc29uOiBQdWxzZUNoYW5uZWxSZXNldEVycm9yKTogdm9pZCB7XG4gICAgdGhpcy5jbG9zZShyZWFzb24pO1xuICB9XG5cbiAgZGlzcG9zZShyZWFzb246IFB1bHNlQ2hhbm5lbFJlc2V0RXJyb3IpOiB2b2lkIHtcbiAgICB0aGlzLmNsb3NlKHJlYXNvbik7XG4gIH1cblxuICBwcml2YXRlIGVuc3VyZU9wZW4oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2xvc2VkKSB7XG4gICAgICB0aHJvdyBuZXcgUHVsc2VDaGFubmVsUmVzZXRFcnJvcihcIkNoYW5uZWwgaXMgY2xvc2VkXCIpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZmx1c2hCYWNrbG9nKGV2ZW50OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5iYWNrbG9nLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIGNvbnN0IHJlbWFpbmluZzogU2VydmVyQ2hhbm5lbFJlcXVlc3RNZXNzYWdlW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5iYWNrbG9nKSB7XG4gICAgICBpZiAoaXRlbS5ldmVudCA9PT0gZXZlbnQpIHtcbiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KGl0ZW0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVtYWluaW5nLnB1c2goaXRlbSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuYmFja2xvZyA9IHJlbWFpbmluZztcbiAgfVxuXG4gIHByaXZhdGUgZGlzcGF0Y2hFdmVudChtZXNzYWdlOiBTZXJ2ZXJDaGFubmVsUmVxdWVzdE1lc3NhZ2UpOiB2b2lkIHtcbiAgICBjb25zdCBoYW5kbGVycyA9IHRoaXMuaGFuZGxlcnMuZ2V0KG1lc3NhZ2UuZXZlbnQpO1xuICAgIGlmICghaGFuZGxlcnMgfHwgaGFuZGxlcnMuc2l6ZSA9PT0gMCkge1xuICAgICAgdGhpcy5iYWNrbG9nLnB1c2gobWVzc2FnZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiBoYW5kbGVycykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gaGFuZGxlcihtZXNzYWdlLnBheWxvYWQpO1xuICAgICAgICBpZiAocmVzdWx0ICYmIHR5cGVvZiAocmVzdWx0IGFzIFByb21pc2U8YW55PikudGhlbiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgdm9pZCAocmVzdWx0IGFzIFByb21pc2U8YW55PikuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIlB1bHNlIGNoYW5uZWwgaGFuZGxlciBlcnJvclwiLCBlcnIpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIlB1bHNlIGNoYW5uZWwgaGFuZGxlciBlcnJvclwiLCBlcnIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZGlzcGF0Y2hSZXF1ZXN0KFxuICAgIG1lc3NhZ2U6IFNlcnZlckNoYW5uZWxSZXF1ZXN0TWVzc2FnZSAmIHsgcmVxdWVzdElkOiBzdHJpbmcgfVxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBoYW5kbGVycyA9IHRoaXMuaGFuZGxlcnMuZ2V0KG1lc3NhZ2UuZXZlbnQpO1xuICAgIGxldCByZXNwb25zZTogYW55O1xuICAgIGxldCBlcnJvcjogYW55O1xuICAgIGlmIChoYW5kbGVycyAmJiBoYW5kbGVycy5zaXplID4gMCkge1xuICAgICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIGhhbmRsZXJzKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gaGFuZGxlcihtZXNzYWdlLnBheWxvYWQpO1xuICAgICAgICAgIHJlc3BvbnNlID0gYXdhaXQgUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgICAgaWYgKHJlc3BvbnNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgZXJyb3IgPSBlcnI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGVycm9yKSB7XG4gICAgICBhd2FpdCB0aGlzLmNsaWVudC5zZW5kQ2hhbm5lbE1lc3NhZ2Uoe1xuICAgICAgICB0eXBlOiBcImNoYW5uZWxfbWVzc2FnZVwiLFxuICAgICAgICBjaGFubmVsOiB0aGlzLmlkLFxuICAgICAgICBldmVudDogdW5kZWZpbmVkLFxuICAgICAgICByZXNwb25zZVRvOiBtZXNzYWdlLnJlcXVlc3RJZCxcbiAgICAgICAgZXJyb3I6IGZvcm1hdEVycm9yKGVycm9yKSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLmNsaWVudC5zZW5kQ2hhbm5lbE1lc3NhZ2Uoe1xuICAgICAgdHlwZTogXCJjaGFubmVsX21lc3NhZ2VcIixcbiAgICAgIGNoYW5uZWw6IHRoaXMuaWQsXG4gICAgICBldmVudDogdW5kZWZpbmVkLFxuICAgICAgcmVzcG9uc2VUbzogbWVzc2FnZS5yZXF1ZXN0SWQsXG4gICAgICBwYXlsb2FkOiByZXNwb25zZSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZVBlbmRpbmcobWVzc2FnZTogU2VydmVyQ2hhbm5lbFJlc3BvbnNlTWVzc2FnZSk6IHZvaWQge1xuICAgIGNvbnN0IGVudHJ5ID0gbWVzc2FnZS5yZXNwb25zZVRvID8gdGhpcy5wZW5kaW5nLmdldChtZXNzYWdlLnJlc3BvbnNlVG8pIDogdW5kZWZpbmVkO1xuICAgIGlmICghZW50cnkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5wZW5kaW5nLmRlbGV0ZShtZXNzYWdlLnJlc3BvbnNlVG8hKTtcbiAgICBpZiAobWVzc2FnZS5lcnJvciAhPT0gdW5kZWZpbmVkICYmIG1lc3NhZ2UuZXJyb3IgIT09IG51bGwpIHtcbiAgICAgIGVudHJ5LnJlamVjdChuZXcgUHVsc2VDaGFubmVsUmVzZXRFcnJvcihTdHJpbmcobWVzc2FnZS5lcnJvcikpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZW50cnkucmVzb2x2ZShtZXNzYWdlLnBheWxvYWQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2xvc2UocmVhc29uOiBQdWxzZUNoYW5uZWxSZXNldEVycm9yKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2xvc2VkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY2xvc2VkID0gdHJ1ZTtcbiAgICBmb3IgKGNvbnN0IHJlcXVlc3Qgb2YgdGhpcy5wZW5kaW5nLnZhbHVlcygpKSB7XG4gICAgICByZXF1ZXN0LnJlamVjdChyZWFzb24pO1xuICAgIH1cbiAgICB0aGlzLnBlbmRpbmcuY2xlYXIoKTtcbiAgICB0aGlzLmhhbmRsZXJzLmNsZWFyKCk7XG4gICAgdGhpcy5iYWNrbG9nID0gW107XG4gICAgLy8gTm8tb3A6IG93bmluZyBjbGllbnQgbWFuYWdlcyByZWdpc3RyeSBsaWZlY3ljbGUuXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNoYW5uZWxCcmlkZ2UoXG4gIGNsaWVudDogUHVsc2VTb2NrZXRJT0NsaWVudCxcbiAgaWQ6IHN0cmluZ1xuKTogQ2hhbm5lbEJyaWRnZSB7XG4gIHJldHVybiBuZXcgQ2hhbm5lbEJyaWRnZShjbGllbnQsIGlkKTtcbn1cbiIsCiAgICAiaW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VNZW1vIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyB1c2VQdWxzZUNsaWVudCB9IGZyb20gXCIuL3B1bHNlXCI7XG5pbXBvcnQgdHlwZSB7IENoYW5uZWxCcmlkZ2UgfSBmcm9tIFwiLi9jaGFubmVsXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VQdWxzZUNoYW5uZWwoY2hhbm5lbElkOiBzdHJpbmcpOiBDaGFubmVsQnJpZGdlIHtcbiAgY29uc3QgY2xpZW50ID0gdXNlUHVsc2VDbGllbnQoKTtcbiAgY29uc3QgYnJpZGdlID0gdXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKCFjaGFubmVsSWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInVzZVB1bHNlQ2hhbm5lbCByZXF1aXJlcyBhIG5vbi1lbXB0eSBjaGFubmVsSWRcIik7XG4gICAgfVxuICAgIHJldHVybiBjbGllbnQuYWNxdWlyZUNoYW5uZWwoY2hhbm5lbElkKTtcbiAgfSwgW2NsaWVudCwgY2hhbm5lbElkXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgY2xpZW50LnJlbGVhc2VDaGFubmVsKGNoYW5uZWxJZCk7XG4gICAgfTtcbiAgfSwgW2NsaWVudCwgY2hhbm5lbElkXSk7XG5cbiAgcmV0dXJuIGJyaWRnZTtcbn1cbiIsCiAgICAiaW1wb3J0IFJlYWN0LCB7IGZvcndhcmRSZWYsIHVzZUNhbGxiYWNrLCB0eXBlIEZvcm1FdmVudCB9IGZyb20gXCJyZWFjdFwiO1xuXG5leHBvcnQgdHlwZSBQdWxzZUZvcm1Qcm9wcyA9IFJlYWN0LkNvbXBvbmVudFByb3BzV2l0aG91dFJlZjxcImZvcm1cIj4gJiB7XG4gIGFjdGlvbjogc3RyaW5nO1xufTtcblxuLyoqXG4gKiBQdWxzZUZvcm0gaW50ZXJjZXB0cyBuYXRpdmUgZm9ybSBzdWJtaXNzaW9ucyBhbmQgc2VuZHMgdGhlbSB0aHJvdWdoIGZldGNoIHNvIHRoZVxuICogc3Vycm91bmRpbmcgUHVsc2UgdmlldyBzdGF5cyBtb3VudGVkLiBTZXJ2ZXItc2lkZSBoYW5kbGVycyBhcmUgc3RpbGwgaW52b2tlZCB2aWFcbiAqIHRoZSBmb3JtIGFjdGlvbiBlbmRwb2ludCBhbmQgcmVhY3RpdmUgdXBkYXRlcyBwcm9wYWdhdGUgb3ZlciB0aGUgc29ja2V0LlxuICovXG5leHBvcnQgY29uc3QgUHVsc2VGb3JtID0gZm9yd2FyZFJlZjxIVE1MRm9ybUVsZW1lbnQsIFB1bHNlRm9ybVByb3BzPihcbiAgZnVuY3Rpb24gUHVsc2VGb3JtKHsgb25TdWJtaXQsIGFjdGlvbiwgLi4ucmVzdCB9LCByZWYpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPGZvcm1cbiAgICAgICAgey4uLnJlc3R9XG4gICAgICAgIGFjdGlvbj17YWN0aW9ufVxuICAgICAgICByZWY9e3JlZn1cbiAgICAgICAgb25TdWJtaXQ9e3VzZUNhbGxiYWNrKFxuICAgICAgICAgIChldmVudDogRm9ybUV2ZW50PEhUTUxGb3JtRWxlbWVudD4pID0+XG4gICAgICAgICAgICBzdWJtaXRGb3JtKHsgZXZlbnQsIGFjdGlvbiwgb25TdWJtaXQgfSksXG4gICAgICAgICAgW2FjdGlvbiwgb25TdWJtaXRdXG4gICAgICAgICl9XG4gICAgICAvPlxuICAgICk7XG4gIH1cbik7XG5cbmludGVyZmFjZSBTdWJtaXRGb3JtIHtcbiAgZXZlbnQ6IFJlYWN0LkZvcm1FdmVudDxIVE1MRm9ybUVsZW1lbnQ+O1xuICBhY3Rpb246IHN0cmluZztcbiAgb25TdWJtaXQ/OiBQdWxzZUZvcm1Qcm9wc1tcIm9uU3VibWl0XCJdO1xuICBmb3JtRGF0YT86IEZvcm1EYXRhO1xuICBmb3JjZT86IGJvb2xlYW5cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN1Ym1pdEZvcm0oe1xuICBldmVudCxcbiAgYWN0aW9uLFxuICBvblN1Ym1pdCxcbiAgZm9ybURhdGEsXG4gIGZvcmNlXG59OiBTdWJtaXRGb3JtKSB7XG4gIG9uU3VibWl0Py4oZXZlbnQpO1xuICBpZiAoIWZvcmNlICYmIGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgZm9ybSA9IGV2ZW50LmN1cnJlbnRUYXJnZXQ7XG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIGNvbnN0IG5hdGl2ZUV2ZW50ID0gZXZlbnQubmF0aXZlRXZlbnQgYXMgU3VibWl0RXZlbnQ7XG4gIGlmICghZm9ybURhdGEpIHtcbiAgICBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YShmb3JtLCBuYXRpdmVFdmVudC5zdWJtaXR0ZXIpO1xuICB9XG4gIGNvbnN0IHVybCA9IG5ldyBVUkwoYWN0aW9uLCB3aW5kb3cubG9jYXRpb24uaHJlZik7XG4gIHRyeSB7XG4gICAgYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgLy8gUmVxdWlyZWQgZm9yIG91ciBob3N0aW5nIHNjZW5hcmlvcyBvZiBzYW1lIGhvc3QgKyBkaWZmZXJlbnQgcG9ydHMgb3IgMiBzdWJkb21haW5zXG4gICAgICBjcmVkZW50aWFsczogXCJpbmNsdWRlXCIsXG4gICAgICBib2R5OiBmb3JtRGF0YSxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgY29uc29sZS5lcnJvcihcIltQdWxzZV0gRm9ybSBzdWJtaXNzaW9uIGZhaWxlZFwiLCBlcnIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9XG59XG4iLAogICAgImltcG9ydCB7IGlvLCBTb2NrZXQgfSBmcm9tIFwic29ja2V0LmlvLWNsaWVudFwiO1xuaW1wb3J0IHR5cGUgeyBTZXJ2ZXJNZXNzYWdlLCBDbGllbnRNZXNzYWdlIH0gZnJvbSBcIi4vbWVzc2FnZXNcIjtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFRyYW5zcG9ydCBBYnN0cmFjdGlvblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IHR5cGUgTWVzc2FnZUxpc3RlbmVyID0gKG1lc3NhZ2U6IFNlcnZlck1lc3NhZ2UpID0+IHZvaWQ7XG5leHBvcnQgdHlwZSBDb25uZWN0aW9uU3RhdHVzTGlzdGVuZXIgPSAoY29ubmVjdGVkOiBib29sZWFuKSA9PiB2b2lkO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zcG9ydCB7XG4gIGNvbm5lY3QobGlzdGVuZXI6IE1lc3NhZ2VMaXN0ZW5lcik6IFByb21pc2U8dm9pZD47XG4gIGRpc2Nvbm5lY3QoKTogdm9pZDtcbiAgc2VuZE1lc3NhZ2UocGF5bG9hZDogQ2xpZW50TWVzc2FnZSk6IFByb21pc2U8dm9pZD47XG4gIGlzQ29ubmVjdGVkKCk6IGJvb2xlYW47XG4gIG9uQ29ubmVjdGlvbkNoYW5nZShsaXN0ZW5lcjogQ29ubmVjdGlvblN0YXR1c0xpc3RlbmVyKTogKCkgPT4gdm9pZDtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFNvY2tldC5JTyBUcmFuc3BvcnRcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBjbGFzcyBTb2NrZXRJT1RyYW5zcG9ydCBpbXBsZW1lbnRzIFRyYW5zcG9ydCB7XG4gIHByaXZhdGUgc29ja2V0OiBTb2NrZXQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBsaXN0ZW5lcjogTWVzc2FnZUxpc3RlbmVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbWVzc2FnZVF1ZXVlOiBDbGllbnRNZXNzYWdlW10gPSBbXTtcbiAgcHJpdmF0ZSBjb25uZWN0aW9uTGlzdGVuZXJzOiBTZXQ8Q29ubmVjdGlvblN0YXR1c0xpc3RlbmVyPiA9IG5ldyBTZXQoKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHVybDogc3RyaW5nKSB7fVxuXG4gIGNvbm5lY3QobGlzdGVuZXI6IE1lc3NhZ2VMaXN0ZW5lcik6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5zb2NrZXQgPSBpbyh0aGlzLnVybCwge1xuICAgICAgICB0cmFuc3BvcnRzOiBbXCJ3ZWJzb2NrZXRcIl0sXG4gICAgICB9KTtcblxuICAgICAgdGhpcy5zb2NrZXQub24oXCJjb25uZWN0XCIsICgpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coXCJbU29ja2V0SU9UcmFuc3BvcnRdIENvbm5lY3RlZDpcIiwgdGhpcy5zb2NrZXQ/LmlkKTtcblxuICAgICAgICBmb3IgKGNvbnN0IHBheWxvYWQgb2YgdGhpcy5tZXNzYWdlUXVldWUpIHtcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIltTb2NrZXRJT1RyYW5zcG9ydF0gU2VuZGluZyBxdWV1ZWQgbWVzc2FnZTpcIiwgcGF5bG9hZCk7XG4gICAgICAgICAgdGhpcy5zb2NrZXQ/LmVtaXQoXCJtZXNzYWdlXCIsIHBheWxvYWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWVzc2FnZVF1ZXVlID0gW107XG5cbiAgICAgICAgdGhpcy5ub3RpZnlDb25uZWN0aW9uTGlzdGVuZXJzKHRydWUpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5zb2NrZXQub24oXCJjb25uZWN0X2Vycm9yXCIsIChlcnIpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIltTb2NrZXRJT1RyYW5zcG9ydF0gQ29ubmVjdGlvbiBmYWlsZWQ6XCIsIGVycik7XG4gICAgICAgIHRoaXMubm90aWZ5Q29ubmVjdGlvbkxpc3RlbmVycyhmYWxzZSk7XG4gICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuc29ja2V0Lm9uKFwiZGlzY29ubmVjdFwiLCAoKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiW1NvY2tldElPVHJhbnNwb3J0XSBEaXNjb25uZWN0ZWRcIik7XG4gICAgICAgIHRoaXMubm90aWZ5Q29ubmVjdGlvbkxpc3RlbmVycyhmYWxzZSk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5zb2NrZXQub24oXCJtZXNzYWdlXCIsIChkYXRhOiBTZXJ2ZXJNZXNzYWdlKSA9PiB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiW1NvY2tldElPVHJhbnNwb3J0XSBSZWNlaXZlZCBtZXNzYWdlOlwiLCBkYXRhKTtcbiAgICAgICAgdGhpcy5saXN0ZW5lcj8uKGRhdGEpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBkaXNjb25uZWN0KCk6IHZvaWQge1xuICAgIHRoaXMuc29ja2V0Py5kaXNjb25uZWN0KCk7XG4gICAgdGhpcy5zb2NrZXQgPSBudWxsO1xuICAgIHRoaXMubGlzdGVuZXIgPSBudWxsO1xuICAgIHRoaXMubWVzc2FnZVF1ZXVlID0gW107XG4gICAgdGhpcy5jb25uZWN0aW9uTGlzdGVuZXJzLmNsZWFyKCk7XG4gIH1cblxuICBhc3luYyBzZW5kTWVzc2FnZShwYXlsb2FkOiBDbGllbnRNZXNzYWdlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaXNDb25uZWN0ZWQoKSkge1xuICAgICAgLy8gY29uc29sZS5sb2coXCJbU29ja2V0SU9UcmFuc3BvcnRdIFNlbmRpbmc6XCIsIHBheWxvYWQpO1xuICAgICAgdGhpcy5zb2NrZXQhLmVtaXQoXCJtZXNzYWdlXCIsIHBheWxvYWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBjb25zb2xlLmxvZyhcIltTb2NrZXRJT1RyYW5zcG9ydF0gUXVldWluZyBtZXNzYWdlOlwiLCBwYXlsb2FkKTtcbiAgICAgIHRoaXMubWVzc2FnZVF1ZXVlLnB1c2gocGF5bG9hZCk7XG4gICAgfVxuICB9XG5cbiAgaXNDb25uZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc29ja2V0Py5jb25uZWN0ZWQgfHwgZmFsc2U7XG4gIH1cblxuICBvbkNvbm5lY3Rpb25DaGFuZ2UobGlzdGVuZXI6IENvbm5lY3Rpb25TdGF0dXNMaXN0ZW5lcik6ICgpID0+IHZvaWQge1xuICAgIHRoaXMuY29ubmVjdGlvbkxpc3RlbmVycy5hZGQobGlzdGVuZXIpO1xuICAgIGxpc3RlbmVyKHRoaXMuaXNDb25uZWN0ZWQoKSk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHRoaXMuY29ubmVjdGlvbkxpc3RlbmVycy5kZWxldGUobGlzdGVuZXIpO1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIG5vdGlmeUNvbm5lY3Rpb25MaXN0ZW5lcnMoY29ubmVjdGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lcnMpIHtcbiAgICAgIGxpc3RlbmVyKGNvbm5lY3RlZCk7XG4gICAgfVxuICB9XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBJbi1NZW1vcnkgVHJhbnNwb3J0IChmb3IgdGVzdGluZylcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBjbGFzcyBJbk1lbW9yeVRyYW5zcG9ydCBpbXBsZW1lbnRzIFRyYW5zcG9ydCB7XG4gIHByaXZhdGUgbGlzdGVuZXI6IE1lc3NhZ2VMaXN0ZW5lciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGNvbm5lY3RlZCA9IGZhbHNlO1xuICBwcml2YXRlIGNvbm5lY3Rpb25MaXN0ZW5lcnM6IFNldDxDb25uZWN0aW9uU3RhdHVzTGlzdGVuZXI+ID0gbmV3IFNldCgpO1xuXG4gIC8vIFNpbXVsYXRlIHNlcnZlci1zaWRlIG1lc3NhZ2UgZGlzcGF0Y2hpbmdcbiAgcHVibGljIGRpc3BhdGNoTWVzc2FnZShtZXNzYWdlOiBTZXJ2ZXJNZXNzYWdlKSB7XG4gICAgaWYgKHRoaXMubGlzdGVuZXIpIHtcbiAgICAgIC8vIFNpbXVsYXRlIGFzeW5jIGJlaGF2aW9yXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMubGlzdGVuZXI/LihtZXNzYWdlKSwgMCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgY29ubmVjdChsaXN0ZW5lcjogTWVzc2FnZUxpc3RlbmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5saXN0ZW5lciA9IGxpc3RlbmVyO1xuICAgIHRoaXMuY29ubmVjdGVkID0gdHJ1ZTtcbiAgICBjb25zb2xlLmxvZyhcIltJbk1lbW9yeVRyYW5zcG9ydF0gQ29ubmVjdGVkLlwiKTtcbiAgfVxuXG4gIGRpc2Nvbm5lY3QoKTogdm9pZCB7XG4gICAgdGhpcy5saXN0ZW5lciA9IG51bGw7XG4gICAgdGhpcy5jb25uZWN0ZWQgPSBmYWxzZTtcbiAgICBjb25zb2xlLmxvZyhcIltJbk1lbW9yeVRyYW5zcG9ydF0gRGlzY29ubmVjdGVkLlwiKTtcbiAgfVxuXG4gIGFzeW5jIHNlbmRNZXNzYWdlKHBheWxvYWQ6IENsaWVudE1lc3NhZ2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuY29ubmVjdGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJbSW5NZW1vcnlUcmFuc3BvcnRdIE5vdCBjb25uZWN0ZWQuXCIpO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZyhgW0luTWVtb3J5VHJhbnNwb3J0XSBTZW50IG1lc3NhZ2U6YCwgcGF5bG9hZCk7XG4gICAgLy8gSW4gYSByZWFsIHRlc3Qgc2V0dXAsIHRoaXMgbWlnaHQgdHJpZ2dlciBhIHNpbXVsYXRlZCBzZXJ2ZXIgcmVzcG9uc2VcbiAgICAvLyB2aWEgYGRpc3BhdGNoTWVzc2FnZWAuXG4gIH1cblxuICBpc0Nvbm5lY3RlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jb25uZWN0ZWQ7XG4gIH1cblxuICBvbkNvbm5lY3Rpb25DaGFuZ2UobGlzdGVuZXI6IENvbm5lY3Rpb25TdGF0dXNMaXN0ZW5lcik6ICgpID0+IHZvaWQge1xuICAgIHRoaXMuY29ubmVjdGlvbkxpc3RlbmVycy5hZGQobGlzdGVuZXIpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICB0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lcnMuZGVsZXRlKGxpc3RlbmVyKTtcbiAgICB9O1xuICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgTG9hZGVyRnVuY3Rpb25BcmdzIH0gZnJvbSBcInJlYWN0LXJvdXRlclwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJvdXRlSW5mbyB7XG4gIHBhdGhuYW1lOiBzdHJpbmc7XG4gIGhhc2g6IHN0cmluZztcbiAgcXVlcnk6IHN0cmluZztcbiAgcXVlcnlQYXJhbXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIHBhdGhQYXJhbXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD47XG4gIGNhdGNoYWxsOiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RTZXJ2ZXJSb3V0ZUluZm8oe1xuICBwYXJhbXMsXG4gIHJlcXVlc3QsXG59OiBMb2FkZXJGdW5jdGlvbkFyZ3MpIHtcbiAgY29uc3QgeyBcIipcIjogY2F0Y2hhbGwgPSBcIlwiLCAuLi5wYXRoUGFyYW1zIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHBhcnNlZFVybCA9IG5ldyBVUkwocmVxdWVzdC51cmwpO1xuXG4gIHJldHVybiB7XG4gICAgaGFzaDogcGFyc2VkVXJsLmhhc2gsXG4gICAgcGF0aG5hbWU6IHBhcnNlZFVybC5wYXRobmFtZSxcbiAgICBxdWVyeTogcGFyc2VkVXJsLnNlYXJjaCxcbiAgICBxdWVyeVBhcmFtczogT2JqZWN0LmZyb21FbnRyaWVzKHBhcnNlZFVybC5zZWFyY2hQYXJhbXMuZW50cmllcygpKSxcbiAgICBwYXRoUGFyYW1zLFxuICAgIGNhdGNoYWxsOiBjYXRjaGFsbC5sZW5ndGggPiAxID8gY2F0Y2hhbGwuc3BsaXQoXCIvXCIpIDogW10sXG4gIH0gc2F0aXNmaWVzIFJvdXRlSW5mbztcbn0iLAogICAgIi8vIFNlcmlhbGl6YXRpb24gaGVscGVycyB0aGF0IHN1cHBvcnQ6XG4vLyAtIENpcmN1bGFyIHJlZmVyZW5jZXMgdmlhIG9iamVjdCBpZGVudGl0eSByZWZzXG4vLyAtIERhdGUgaW5zdGFuY2VzIOKGkiB7IF9fdDogXCJkYXRldGltZVwiLCB0aW1lc3RhbXAgfVxuLy8gLSBGb3JtRGF0YSDihpIgeyBfX3Q6IFwiZm9ybWRhdGFcIiwgZmllbGRzIH1cbi8vIC0gRmlsZSDihpIgeyBfX3Q6IFwiZmlsZVwiLCBuYW1lLCB0eXBlLCBzaXplLCBsYXN0TW9kaWZpZWQsIGNvbnRlbnQ6IG51bWJlcltdIH1cbi8vIEFsb25nIHdpdGggYSBkZWNvZGVyIGZvciB0aGUgc3ltbWV0cmljIHNoYXBlcyAod2UgZG8gbm90IHJlY29uc3RydWN0IEZpbGUvRm9ybURhdGEgb2JqZWN0cykuXG5cbnR5cGUgRW5jb2RlZFJlZiA9IHsgX190OiBcInJlZlwiOyBpZDogbnVtYmVyIH07XG50eXBlIEVuY29kZWRBcnJheSA9IHsgX190OiBcImFycmF5XCI7IF9faWQ6IG51bWJlcjsgaXRlbXM6IHVua25vd25bXSB9O1xudHlwZSBFbmNvZGVkT2JqZWN0ID0ge1xuICBfX3Q6IFwib2JqZWN0XCI7XG4gIF9faWQ6IG51bWJlcjtcbiAgcHJvcHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufTtcbnR5cGUgRW5jb2RlZERhdGUgPSB7IF9fdDogXCJkYXRldGltZVwiOyB0aW1lc3RhbXA6IG51bWJlciB9O1xudHlwZSBFbmNvZGVkRmlsZSA9IHtcbiAgX190OiBcImZpbGVcIjtcbiAgbmFtZTogc3RyaW5nO1xuICB0eXBlOiBzdHJpbmc7XG4gIHNpemU6IG51bWJlcjtcbiAgbGFzdE1vZGlmaWVkOiBudW1iZXI7XG4gIGNvbnRlbnQ6IG51bWJlcltdOyAvLyByYXcgYnl0ZXMgYXMgYSBKU09OLXNhZmUgbnVtYmVyIGFycmF5XG59O1xudHlwZSBFbmNvZGVkRm9ybURhdGEgPSB7XG4gIF9fdDogXCJmb3JtZGF0YVwiO1xuICBmaWVsZHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24gfCB1bmtub3duW10+O1xufTtcblxudHlwZSBJZGVudGl0eU1hcCA9IFdlYWtNYXA8b2JqZWN0LCBudW1iZXI+O1xuXG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKTtcbiAgcmV0dXJuIHByb3RvID09PSBPYmplY3QucHJvdG90eXBlIHx8IHByb3RvID09PSBudWxsO1xufVxuXG5cbmZ1bmN0aW9uIGlzRGF0ZSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIERhdGUge1xuICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBEYXRlO1xufVxuXG5mdW5jdGlvbiBpc1NraXBwYWJsZSh2YWx1ZTogdW5rbm93bik6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiIHx8XG4gICAgdHlwZW9mIHZhbHVlID09PSBcInN5bWJvbFwiIHx8XG4gICAgdHlwZW9mIHZhbHVlID09PSBcInVuZGVmaW5lZFwiXG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpbGVUb0J5dGVBcnJheShmaWxlOiBGaWxlKTogUHJvbWlzZTxudW1iZXJbXT4ge1xuICBjb25zdCBhYiA9IGF3YWl0IGZpbGUuYXJyYXlCdWZmZXIoKTtcbiAgcmV0dXJuIEFycmF5LmZyb20obmV3IFVpbnQ4QXJyYXkoYWIpKTtcbn1cblxuaW50ZXJmYWNlIEVuY29kZUNvbnRleHQge1xuICBzZWVuOiBJZGVudGl0eU1hcDtcbiAgbmV4dElkOiBudW1iZXI7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbmNvZGVGb3JXaXJlKGlucHV0OiB1bmtub3duKTogUHJvbWlzZTx1bmtub3duPiB7XG4gIGNvbnN0IGN0eDogRW5jb2RlQ29udGV4dCA9IHsgc2VlbjogbmV3IFdlYWtNYXAoKSwgbmV4dElkOiAxIH07XG4gIHJldHVybiBhd2FpdCBlbmNvZGVSZWN1cnNpdmUoaW5wdXQsIGN0eCk7XG59XG5cbmZ1bmN0aW9uIHJlbWVtYmVyKGN0eDogRW5jb2RlQ29udGV4dCwgb2JqOiBvYmplY3QpOiBudW1iZXIgfCBudWxsIHtcbiAgY29uc3QgZXhpc3RpbmcgPSBjdHguc2Vlbi5nZXQob2JqKTtcbiAgaWYgKGV4aXN0aW5nICE9PSB1bmRlZmluZWQpIHJldHVybiBudWxsO1xuICBjb25zdCBpZCA9IGN0eC5uZXh0SWQrKztcbiAgY3R4LnNlZW4uc2V0KG9iaiwgaWQpO1xuICByZXR1cm4gaWQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGVuY29kZVJlY3Vyc2l2ZShcbiAgdmFsdWU6IHVua25vd24sXG4gIGN0eDogRW5jb2RlQ29udGV4dFxuKTogUHJvbWlzZTx1bmtub3duPiB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvLyBTcGVjaWFsIGNhc2VzIGZpcnN0XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICBjb25zdCBkYXRlID0gdmFsdWUgYXMgRGF0ZTtcbiAgICBjb25zdCBlbmNvZGVkOiBFbmNvZGVkRGF0ZSA9IHsgX190OiBcImRhdGV0aW1lXCIsIHRpbWVzdGFtcDogZGF0ZS5nZXRUaW1lKCkgfTtcbiAgICByZXR1cm4gZW5jb2RlZDtcbiAgfVxuXG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEZvcm1EYXRhKSB7XG4gICAgY29uc3QgaWQgPSByZW1lbWJlcihjdHgsIHZhbHVlKTtcbiAgICBpZiAoaWQgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiB7IF9fdDogXCJyZWZcIiwgaWQ6IGN0eC5zZWVuLmdldCh2YWx1ZSBhcyBvYmplY3QpISB9IGFzIEVuY29kZWRSZWY7XG4gICAgfVxuICAgIGNvbnN0IGZpZWxkczogUmVjb3JkPHN0cmluZywgdW5rbm93biB8IHVua25vd25bXT4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZdIG9mIHZhbHVlLmVudHJpZXMoKSkge1xuICAgICAgY29uc3QgZW5jb2RlZFZhbCA9IGF3YWl0IGVuY29kZVJlY3Vyc2l2ZSh2IGFzIHVua25vd24sIGN0eCk7XG4gICAgICBpZiAoZW5jb2RlZFZhbCA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZmllbGRzLCBrZXkpKSB7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nID0gZmllbGRzW2tleV07XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGV4aXN0aW5nKSkge1xuICAgICAgICAgIGV4aXN0aW5nLnB1c2goZW5jb2RlZFZhbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmllbGRzW2tleV0gPSBbZXhpc3RpbmcsIGVuY29kZWRWYWxdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmaWVsZHNba2V5XSA9IGVuY29kZWRWYWw7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGVuY29kZWQ6IEVuY29kZWRGb3JtRGF0YSAmIHsgX19pZDogbnVtYmVyIH0gPSB7XG4gICAgICBfX3Q6IFwiZm9ybWRhdGFcIixcbiAgICAgIGZpZWxkcyxcbiAgICAgIF9faWQ6IGlkLFxuICAgIH0gYXMgYW55O1xuICAgIHJldHVybiBlbmNvZGVkO1xuICB9XG5cbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRmlsZSkge1xuICAgIGNvbnN0IGZpbGUgPSB2YWx1ZTtcbiAgICBjb25zdCBieXRlcyA9IGF3YWl0IGZpbGVUb0J5dGVBcnJheSh2YWx1ZSk7XG4gICAgY29uc3QgZW5jb2RlZDogRW5jb2RlZEZpbGUgPSB7XG4gICAgICBfX3Q6IFwiZmlsZVwiLFxuICAgICAgbmFtZTogZmlsZS5uYW1lLFxuICAgICAgdHlwZTogZmlsZS50eXBlLFxuICAgICAgc2l6ZTogZmlsZS5zaXplLFxuICAgICAgbGFzdE1vZGlmaWVkOiBmaWxlLmxhc3RNb2RpZmllZCxcbiAgICAgIGNvbnRlbnQ6IGJ5dGVzLFxuICAgIH07XG4gICAgcmV0dXJuIGVuY29kZWQ7XG4gIH1cblxuICAvLyBJZGVudGl0eSAvIGNpcmN1bGFyIHJlZmVyZW5jZSBoYW5kbGluZ1xuICBjb25zdCBvYmplY3QgPSB2YWx1ZSBhcyBvYmplY3Q7XG4gIGNvbnN0IGV4aXN0aW5nSWQgPSBjdHguc2Vlbi5nZXQob2JqZWN0KTtcbiAgaWYgKGV4aXN0aW5nSWQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IHJlZjogRW5jb2RlZFJlZiA9IHsgX190OiBcInJlZlwiLCBpZDogZXhpc3RpbmdJZCB9O1xuICAgIHJldHVybiByZWY7XG4gIH1cbiAgY29uc3QgdGhpc0lkID0gY3R4Lm5leHRJZCsrO1xuICBjdHguc2Vlbi5zZXQob2JqZWN0LCB0aGlzSWQpO1xuXG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIGNvbnN0IGl0ZW1zUmF3ID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAodmFsdWUgYXMgdW5rbm93bltdKS5tYXAoKGl0ZW0pID0+IGVuY29kZVJlY3Vyc2l2ZShpdGVtLCBjdHgpKVxuICAgICk7XG4gICAgY29uc3QgaXRlbXMgPSBpdGVtc1Jhdy5maWx0ZXIoKGl0KSA9PiBpdCAhPT0gdW5kZWZpbmVkKSBhcyB1bmtub3duW107XG4gICAgY29uc3QgZW5jb2RlZDogRW5jb2RlZEFycmF5ID0geyBfX3Q6IFwiYXJyYXlcIiwgX19pZDogdGhpc0lkLCBpdGVtcyB9O1xuICAgIHJldHVybiBlbmNvZGVkO1xuICB9XG5cbiAgLy8gUGxhaW4gb2JqZWN0IG9yIG90aGVyIG9iamVjdCB0eXBlc1xuICBjb25zdCBwcm9wczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgaWYgKGlzUGxhaW5PYmplY3QodmFsdWUpKSB7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModmFsdWUpKSB7XG4gICAgICBjb25zdCB2ID0gKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldO1xuICAgICAgaWYgKGlzU2tpcHBhYmxlKHYpKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGVuY29kZWRWID0gYXdhaXQgZW5jb2RlUmVjdXJzaXZlKHYsIGN0eCk7XG4gICAgICBpZiAoZW5jb2RlZFYgIT09IHVuZGVmaW5lZCkgcHJvcHNba2V5XSA9IGVuY29kZWRWO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBOb24tcGxhaW4gb2JqZWN0czogYmVzdCBlZmZvcnQg4oCTIGVudW1lcmF0ZSBlbnVtZXJhYmxlIHByb3BlcnRpZXNcbiAgICBmb3IgKGNvbnN0IGtleSBpbiB2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikge1xuICAgICAgY29uc3QgdiA9ICh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XTtcbiAgICAgIGlmIChpc1NraXBwYWJsZSh2KSkgY29udGludWU7XG4gICAgICBjb25zdCBlbmNvZGVkViA9IGF3YWl0IGVuY29kZVJlY3Vyc2l2ZSh2LCBjdHgpO1xuICAgICAgaWYgKGVuY29kZWRWICE9PSB1bmRlZmluZWQpIHByb3BzW2tleV0gPSBlbmNvZGVkVjtcbiAgICB9XG4gIH1cbiAgY29uc3QgZW5jb2RlZDogRW5jb2RlZE9iamVjdCA9IHsgX190OiBcIm9iamVjdFwiLCBfX2lkOiB0aGlzSWQsIHByb3BzIH07XG4gIHJldHVybiBlbmNvZGVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlRnJvbVdpcmUoaW5wdXQ6IHVua25vd24pOiB1bmtub3duIHtcbiAgcmV0dXJuIGRlY29kZVJlY3Vyc2l2ZShpbnB1dCk7XG59XG5cbmZ1bmN0aW9uIGRlY29kZVJlY3Vyc2l2ZSh2YWx1ZTogdW5rbm93bik6IHVua25vd24ge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiKSByZXR1cm4gdmFsdWU7XG5cbiAgY29uc3Qgb2JqID0gdmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNvbnN0IHRhZyA9IG9ialtcIl9fdFwiXTtcblxuICBpZiAodGFnID09PSBcImRhdGV0aW1lXCIpIHtcbiAgICBjb25zdCB0cyA9IG9ialtcInRpbWVzdGFtcFwiXSBhcyBudW1iZXI7XG4gICAgcmV0dXJuIG5ldyBEYXRlKHRzKTtcbiAgfVxuXG4gIGlmICh0YWcgPT09IFwiZmlsZVwiKSB7XG4gICAgLy8gRG8gbm90IHJlY29uc3RydWN0IEZpbGU7IGtlZXAgYXMgcGxhaW4gb2JqZWN0LiBPcHRpb25hbGx5LCB0dXJuIGNvbnRlbnQgaW50byBVaW50OEFycmF5IGZvciBjb252ZW5pZW5jZS5cbiAgICBjb25zdCBjb250ZW50ID0gb2JqW1wiY29udGVudFwiXTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShjb250ZW50KSkge1xuICAgICAgLy8gUmV0dXJuIGEgc2hhbGxvdyBjbG9uZSB3aXRoIFVpbnQ4QXJyYXkgZm9yIGNvbnRlbnRcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLm9iaixcbiAgICAgICAgY29udGVudDogbmV3IFVpbnQ4QXJyYXkoY29udGVudCBhcyBudW1iZXJbXSksXG4gICAgICB9IGFzIGFueTtcbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIGlmICh0YWcgPT09IFwiZm9ybWRhdGFcIikge1xuICAgIC8vIEtlZXAgYXMtaXMgKHBsYWluIG9iamVjdCksIGJ1dCBkZWNvZGUgbmVzdGVkIHZhbHVlc1xuICAgIGNvbnN0IGZpZWxkcyA9IG9ialtcImZpZWxkc1wiXSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duIHwgdW5rbm93bltdPjtcbiAgICBjb25zdCBkZWNvZGVkRmllbGRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duIHwgdW5rbm93bltdPiA9IHt9O1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGZpZWxkcykpIHtcbiAgICAgIGNvbnN0IHYgPSBmaWVsZHNba2V5XTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHYpKSB7XG4gICAgICAgIGRlY29kZWRGaWVsZHNba2V5XSA9IHYubWFwKCh4KSA9PiBkZWNvZGVSZWN1cnNpdmUoeCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVjb2RlZEZpZWxkc1trZXldID0gZGVjb2RlUmVjdXJzaXZlKHYpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyBfX3Q6IFwiZm9ybWRhdGFcIiwgZmllbGRzOiBkZWNvZGVkRmllbGRzIH0gYXMgRW5jb2RlZEZvcm1EYXRhO1xuICB9XG5cbiAgaWYgKHRhZyA9PT0gXCJhcnJheVwiKSB7XG4gICAgY29uc3QgaXRlbXMgPSAob2JqW1wiaXRlbXNcIl0gYXMgdW5rbm93bltdKS5tYXAoKHgpID0+IGRlY29kZVJlY3Vyc2l2ZSh4KSk7XG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG5cbiAgaWYgKHRhZyA9PT0gXCJvYmplY3RcIikge1xuICAgIGNvbnN0IHByb3BzID0gb2JqW1wicHJvcHNcIl0gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgY29uc3Qgb3V0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHByb3BzKSkge1xuICAgICAgb3V0W2tleV0gPSBkZWNvZGVSZWN1cnNpdmUocHJvcHNba2V5XSk7XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICBpZiAodGFnID09PSBcInJlZlwiKSB7XG4gICAgLy8gV2l0aG91dCBhIHJlY29uc3RydWN0aW9uIGNvbnRleHQgb24gdGhlIGNsaWVudCwgbGVhdmUgYXMtaXMuXG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIC8vIFVua25vd24gb2JqZWN0IOKAkyBkZXNjZW5kIHNoYWxsb3dseVxuICBjb25zdCBjb3B5OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhvYmopKSB7XG4gICAgY29weVtrZXldID0gZGVjb2RlUmVjdXJzaXZlKG9ialtrZXldKTtcbiAgfVxuICByZXR1cm4gY29weTtcbn1cblxuLy8gTGVnYWN5IGNsZWFuZXIga2VwdCBmb3IgY29tcGF0aWJpbGl0eSB3aGVyZSBhIHF1aWNrIGJlc3QtZWZmb3J0IEpTT04tc2FmZSBzaGFwZSBpcyBuZWVkZWRcbmV4cG9ydCBmdW5jdGlvbiBjbGVhbkZvclNlcmlhbGl6YXRpb24ob2JqOiB1bmtub3duKTogdW5rbm93biB7XG4gIHJldHVybiBjbGVhblJlY3Vyc2l2ZShvYmosIG5ldyBXZWFrU2V0KCkpO1xufVxuXG5mdW5jdGlvbiBjbGVhblJlY3Vyc2l2ZShvYmo6IHVua25vd24sIHNlZW46IFdlYWtTZXQ8b2JqZWN0Pik6IHVua25vd24ge1xuICBpZiAob2JqID09PSBudWxsIHx8IHR5cGVvZiBvYmogIT09IFwib2JqZWN0XCIpIHJldHVybiBvYmo7XG4gIGlmIChzZWVuLmhhcyhvYmogYXMgb2JqZWN0KSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgc2Vlbi5hZGQob2JqIGFzIG9iamVjdCk7XG4gIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICByZXR1cm4gKG9iaiBhcyB1bmtub3duW10pXG4gICAgICAubWFwKChpdGVtKSA9PiBjbGVhblJlY3Vyc2l2ZShpdGVtLCBzZWVuKSlcbiAgICAgIC5maWx0ZXIoKHgpID0+IHggIT09IHVuZGVmaW5lZCk7XG4gIH1cbiAgY29uc3Qgb3V0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICBmb3IgKGNvbnN0IGtleSBpbiBvYmogYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIHtcbiAgICBjb25zdCB2ID0gKG9iaiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XTtcbiAgICBpZiAoaXNTa2lwcGFibGUodikpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGNsZWFuZWQgPSBjbGVhblJlY3Vyc2l2ZSh2LCBzZWVuKTtcbiAgICBpZiAoY2xlYW5lZCAhPT0gdW5kZWZpbmVkKSBvdXRba2V5XSA9IGNsZWFuZWQ7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cbiIKICBdLAogICJtYXBwaW5ncyI6ICI7QUFBQSxvQkFDRSxjQUNBLGNBQ0Esb0JBQ0EsaUJBQ0EsZUNMRiwyQkFDRSxtQkFDQSxvQkFDQSxXQUNBLGVBQ0EsZUNGSyxJQUFNLEdBQWUsYUFDZixHQUFxQixLQWlGM0IsU0FBUyxFQUFhLENBQUMsRUFBcUMsQ0FFakUsT0FBTyxPQUFPLElBQVMsVUFBWSxJQUFTLEtBR3ZDLFNBQVMsRUFBZ0IsQ0FBQyxFQUFxQyxDQUNwRSxPQUNFLE9BQU8sSUFBUyxVQUNoQixJQUFTLE1BQ1QsRUFBSyxJQUFJLFdBMUZxQixJQTBGUSxHQUN0QyxFQUFLLE1BNUZtQixvRURzQnJCLE1BQU0sQ0FBYSxDQU9kLE9BQ0EsS0FDQSxXQUNBLFdBVEYsVUFDQSxjQUNBLGVBQ0EsU0FDQSxhQUNSLFdBQVcsQ0FDRCxFQUNBLEVBQ0EsRUFDQSxFQUNSLEVBQTZCLENBQUMsRUFDOUIsRUFBK0IsQ0FBQyxFQUNoQyxFQUEyQixDQUFDLEVBQzVCLENBUFEsY0FDQSxZQUNBLGtCQUNBLGtCQUtSLEtBQUssVUFBWSxJQUFJLElBQUksQ0FBZ0IsRUFDekMsS0FBSyxjQUFnQixJQUFJLElBQ3pCLEtB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LEVBQVUsRUFBSSxRQUNwQixHQUFJLE1BQU0sUUFBUSxDQUFPLEVBRXZCLE1BQU8sSUFDRixFQUNILFFBQVMsSUFBSSxXQUFXLENBQW1CLENBQzdDLEVBRUYsT0FBTyxFQUdULEdBQUksSUFBUSxXQUFZLENBRXRCLElBQU0sRUFBUyxFQUFJLE9BQ2IsRUFBcUQsQ0FBQyxFQUM1RCxRQUFXLEtBQU8sT0FBTyxLQUFLLENBQU0sRUFBRyxDQUNyQyxJQUFNLEVBQUksRUFBTyxHQUNqQixHQUFJLE1BQU0sUUFBUSxDQUFDLEVBQ2pCLEVBQWMsR0FBTyxFQUFFLElBQUksQ0FBQyxJQUFNLEVBQWdCLENBQUMsQ0FBQyxFQUVwRCxPQUFjLEdBQU8sRUFBZ0IsQ0FBQyxFQUcxQyxNQUFPLENBQUUsSUFBSyxXQUFZLE9BQVEsQ0FBYyxFQUdsRCxHQUFJLElBQVEsUUFFVixPQURlLEVBQUksTUFBdUIsSUFBSSxDQUFDLElBQU0sRUFBZ0IsQ0FBQyxDQUFDLEVBSXpFLEdBQUksSUFBUSxTQUFVLENBQ3BCLElBQU0sRUFBUSxFQUFJLE1BQ1osRUFBK0IsQ0FBQyxFQUN0QyxRQUFXLEtBQU8sT0FBTyxLQUFLLENBQUssRUFDakMsRUFBSSxHQUFPLEVBQWdCLEVBQU0sRUFBSSxFQUV2QyxPQUFPLEVBR1QsR0FBSSxJQUFRLE1BRVYsT0FBTyxFQUlULElBQU0sRUFBZ0MsQ0FBQyxFQUN2QyxRQUFXLEtBQU8sT0FBTyxLQUFLLENBQUcsRUFDL0IsRUFBSyxHQUFPLEVBQWdCLEVBQUksRUFBSSxFQUV0QyxPQUFPLEVBSUYsU0FBUyxFQUFxQixDQUFDLEVBQXVCLENBQzNELE9BQU8sR0FBZSxFQUFLLElBQUksT0FBUyxFQUcxQyxTQUFTLEVBQWMsQ0FBQyxFQUFjLEVBQWdDLENBQ3BFLEdBQUksSUFBUSxNQUFRLE9BQU8sSUFBUSxTQUFVLE9BQU8sRUFDcEQsR0FBSSxFQUFLLElBQUksQ0FBYSxFQUFHLE9BRTdCLEdBREEsRUFBSyxJQUFJLENBQWEsRUFDbEIsTUFBTSxRQUFRLENBQUcsRUFDbkIsT0FBUSxFQUNMLElBQUksQ0FBQyxJQUFTLEdBQWUsRUFBTSxDQUFJLENBQUMsRUFDeEMsT0FBTyxDQUFDLElBQU0sSUFBTSxNQUFTLEVBRWxDLElBQU0sRUFBK0IsQ0FBQyxFQUN0QyxRQUFXLEtBQU8sRUFBZ0MsQ0FDaEQsSUFBTSxFQUFLLEVBQWdDLEdBQzNDLEdBQUksR0FBWSxDQUFDLEVBQUcsU0FDcEIsSUFBTSxFQUFVLEdBQWUsRUFBRyxDQUFJLEVBQ3RDLEdBQUksSUFBWSxPQUFXLEVBQUksR0FBTyxFQUV4QyxPQUFPIiwKICAiZGVidWdJZCI6ICJFNzhFMTI4NDE3RjZGOTE3NjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==
|