Files
scrypted/sites/static/google-cast-receiver/js/main.js
2024-07-18 10:24:34 -07:00

2 lines
90 KiB
JavaScript

(()=>{"use strict";var __webpack_modules__={636:(module,__webpack_exports__,__webpack_require__)=>{function startPeriodicGarbageCollection(){let e;__webpack_require__.g.gc||console.warn("rpc peer garbage collection not available: global.gc is not exposed.");try{e=__webpack_require__.g}catch(e){}let t=0;return setInterval((()=>{const r=Date.now(),i=r-t,o=RpcPeer.remotesCreated;RpcPeer.remotesCreated=0;const n=RpcPeer.remotesCollected;RpcPeer.remotesCollected=0,(o||n||i>3e5)&&(t=r,e?.gc?.())}),1e4)}__webpack_require__.d(__webpack_exports__,{uD:()=>RpcPeer}),module=__webpack_require__.hmd(module);class RpcProxy{peer;entry;constructorName;proxyProps;proxyOneWayMethods;constructor(e,t,r,i,o){this.peer=e,this.entry=t,this.constructorName=r,this.proxyProps=i,this.proxyOneWayMethods=o}toPrimitive(){const e=this.peer;return`RpcProxy-${e.selfName}:${e.peerName}: ${this.constructorName}`}get(e,t,r){if(t===RpcPeer.PROPERTY_PROXY_ID)return this.entry.id;if("__proxy_constructor"===t)return this.constructorName;if("__proxy_peer"===t)return this.peer;if(t===RpcPeer.PROPERTY_PROXY_PROPERTIES)return this.proxyProps;if(t===RpcPeer.PROPERTY_PROXY_ONEWAY_METHODS)return this.proxyOneWayMethods;if(t===RpcPeer.PROPERTY_JSON_DISABLE_SERIALIZATION||t===RpcPeer.PROPERTY_JSON_COPY_SERIALIZE_CHILDREN)return;if("then"===t)return;if("constructor"===t)return;if(void 0!==this.proxyProps?.[t])return this.proxyProps?.[t];return RpcPeer.handleFunctionInvocations(this,e,t,r)||new Proxy((()=>t),this)}set(e,t,r,i){return t===RpcPeer.finalizerIdSymbol?this.entry.finalizerId=r:(this.proxyProps||={},this.proxyProps[t]=r),!0}apply(e,t,r){if(Object.isFrozen(this.peer.pendingResults))return Promise.reject(new RPCResultError(this.peer,"RpcPeer has been killed"));const i=e()||null,o=[],n={};for(const e of r||[])o.push(this.peer.serialize(e,n));const s={type:"apply",id:void 0,proxyId:this.entry.id,args:o,method:i};return this.proxyOneWayMethods?.includes?.(i)?(s.oneway=!0,null===i&&delete s.method,this.peer.send(s,void 0,n),Promise.resolve()):this.peer.createPendingResult(((e,t)=>{s.id=e,this.peer.send(s,t,n)}))}}class RPCResultError extends Error{cause;constructor(e,t,r,i){super(`${e.selfName}:${e.peerName}: ${t}`),this.cause=r,i?.name&&(this.name=i?.name),i?.stack&&(this.stack=`${e.peerName}:${e.selfName}\n${r?.stack||i.stack}`)}}function compileFunction(code,params,options){params=params||[];const f=`(function(${params.join(",")}) {;${code};})`;return eval(f)}try{const e=FinalizationRegistry}catch(e){window.WeakRef=class{target;constructor(e){this.target=e}deref(){return this.target}},window.FinalizationRegistry=class{register(){}}}class RpcPeer{selfName;peerName;send;idCounter=1;params={};pendingResults={};proxyCounter=1;localProxied=new Map;localProxyMap={};remoteWeakProxies={};finalizers=new FinalizationRegistry((e=>this.finalize(e)));nameDeserializerMap=new Map;constructorSerializerMap=new Map;transportSafeArgumentTypes=RpcPeer.getDefaultTransportSafeArgumentTypes();killed;killedDeferred;tags={};static finalizerIdSymbol=Symbol("rpcFinalizerId");static remotesCollected=0;static remotesCreated=0;static activeRpcPeer;static isRpcProxy(e){return!!e?.[RpcPeer.PROPERTY_PROXY_ID]}static getDefaultTransportSafeArgumentTypes(){const e=new Set;return e.add(Number.name),e.add(String.name),e.add(Object.name),e.add(Boolean.name),e.add(Array.name),e}static handleFunctionInvocations(e,t,r,i){return"apply"===r?(r,i)=>e.apply(t,e,i):"call"===r?(r,...i)=>e.apply(t,e,i):"toString"===r||r===Symbol.toPrimitive?(t,...r)=>e.toPrimitive():void 0}static PROPERTY_PROXY_ID="__proxy_id";static PROPERTY_PROXY_ONEWAY_METHODS="__proxy_oneway_methods";static PROPERTY_JSON_DISABLE_SERIALIZATION="__json_disable_serialization";static PROPERTY_PROXY_PROPERTIES="__proxy_props";static PROPERTY_JSON_COPY_SERIALIZE_CHILDREN="__json_copy_serialize_children";static PROBED_PROPERTIES=new Set(["then","constructor","__proxy_id","__proxy_constructor","__proxy_peer",RpcPeer.PROPERTY_PROXY_ONEWAY_METHODS,RpcPeer.PROPERTY_JSON_DISABLE_SERIALIZATION,RpcPeer.PROPERTY_PROXY_PROPERTIES,RpcPeer.PROPERTY_JSON_COPY_SERIALIZE_CHILDREN]);constructor(e,t,r){this.selfName=e,this.peerName=t,this.send=r,this.killed=new Promise(((e,t)=>{this.killedDeferred={resolve:e,reject:t}})),this.killed.catch((()=>{}))}createPendingResult(e){if(Object.isFrozen(this.pendingResults))return Promise.reject(new RPCResultError(this,"RpcPeer has been killed"));const t=new Promise(((t,r)=>{const i=(this.idCounter++).toString();this.pendingResults[i]={resolve:t,reject:r},e(i,(e=>r(new RPCResultError(this,e.message,e))))}));return t.catch((()=>{})),t}kill(e){const t=new RPCResultError(this,e||"peer was killed");this.killedDeferred.reject(t);for(const e of Object.values(this.pendingResults))e.reject(t);this.pendingResults=Object.freeze({}),this.params=Object.freeze({}),this.remoteWeakProxies=Object.freeze({}),this.localProxyMap=Object.freeze({}),this.localProxied.clear()}addSerializer(e,t,r){this.nameDeserializerMap.set(t,r),this.constructorSerializerMap.set(e,t)}finalize(e){RpcPeer.remotesCollected++,delete this.remoteWeakProxies[e.id];const t={__local_proxy_id:e.id,__local_proxy_finalizer_id:e.finalizerId,type:"finalize"};this.send(t)}async getParam(e){return this.createPendingResult(((t,r)=>{const i={id:t,type:"param",param:e};this.send(i,r)}))}evalLocal(e,t,r){const i=Object.assign({},this.params,r);let o;try{o=module.require("vm").compileFunction}catch(e){o=compileFunction}return o(e,Object.keys(i),{filename:t})(...Object.values(i))}createErrorResult(e,t){e.stack=t.stack||"no stack",e.result=t.name||"no name",e.message=t.message||"no message"}deserialize(e,t){if(!e)return e;if(e[RpcPeer.PROPERTY_JSON_COPY_SERIALIZE_CHILDREN]){const r={};for(const[i,o]of Object.entries(e))r[i]=this.deserialize(o,t);return r}const{__remote_proxy_id:r,__remote_proxy_finalizer_id:i,__local_proxy_id:o,__remote_constructor_name:n,__serialized_value:s,__remote_proxy_props:a,__remote_proxy_oneway_methods:c}=e;if(r){let e=this.remoteWeakProxies[r]?.deref();e||(e=this.newProxy(r,n,a,c)),e[RpcPeer.finalizerIdSymbol]=i;const o=this.nameDeserializerMap.get(n);return o?o.deserialize(e,t):e}if(o){const e=this.localProxyMap[o];if(!e)throw new RPCResultError(this,`invalid local proxy id ${o}`);return e}const _=this.nameDeserializerMap.get(n);return _?_.deserialize(s,t):e}serialize(e,t){if(!0===e?.[RpcPeer.PROPERTY_JSON_COPY_SERIALIZE_CHILDREN]){const r={};for(const[i,o]of Object.entries(e))r[i]=this.serialize(o,t);return r}if(!e||!e[RpcPeer.PROPERTY_JSON_DISABLE_SERIALIZATION]&&this.transportSafeArgumentTypes.has(e.constructor?.name))return e;let r=e.__proxy_constructor||e.constructor?.name?.toString(),i=this.localProxied.get(e);if(i){const t=(this.proxyCounter++).toString();return i.finalizerId=t,{__remote_proxy_id:i.id,__remote_proxy_finalizer_id:t,__remote_constructor_name:r,__remote_proxy_props:e?.[RpcPeer.PROPERTY_PROXY_PROPERTIES],__remote_proxy_oneway_methods:e?.[RpcPeer.PROPERTY_PROXY_ONEWAY_METHODS]}}const{__proxy_id:o,__proxy_peer:n}=e;if(o&&n===this)return{__local_proxy_id:o};const s=this.constructorSerializerMap.get(e.constructor);if(s){r=s;const i=this.nameDeserializerMap.get(s);if(!i)throw new Error("serializer not found for "+s);const o=i.serialize(e,t);return{__remote_proxy_id:void 0,__remote_proxy_finalizer_id:void 0,__remote_constructor_name:r,__remote_proxy_props:e?.[RpcPeer.PROPERTY_PROXY_PROPERTIES],__remote_proxy_oneway_methods:e?.[RpcPeer.PROPERTY_PROXY_ONEWAY_METHODS],__serialized_value:o}}const a=(this.proxyCounter++).toString();return i={id:a,finalizerId:a},this.localProxied.set(e,i),this.localProxyMap[a]=e,{__remote_proxy_id:a,__remote_proxy_finalizer_id:a,__remote_constructor_name:r,__remote_proxy_props:e?.[RpcPeer.PROPERTY_PROXY_PROPERTIES],__remote_proxy_oneway_methods:e?.[RpcPeer.PROPERTY_PROXY_ONEWAY_METHODS]}}newProxy(e,t,r,i){RpcPeer.remotesCreated++;const o={id:e,finalizerId:void 0},n=new RpcProxy(this,o,t,r,i),s=new Proxy("Function"===t||"AsyncFunction"===t?function(){}:n,n),a=new WeakRef(s);return this.remoteWeakProxies[e]=a,this.finalizers.register(n,o),s}handleMessage(e,t){try{RpcPeer.activeRpcPeer=this,this.handleMessageInternal(e,t)}finally{RpcPeer.activeRpcPeer=void 0}}async handleMessageInternal(e,t){if(!Object.isFrozen(this.pendingResults))try{switch(e.type){case"param":{const t=e,r={},i={type:"result",id:t.id,result:this.serialize(this.params[t.param],r)};this.send(i,void 0,r);break}case"apply":{const r=e,i={type:"result",id:r.id||""},o={};try{const e=this.localProxyMap[r.proxyId];if(!e)throw new Error(`proxy id ${r.proxyId} not found`);const n=[];for(const e of r.args||[])n.push(this.deserialize(e,t));let s;if(r.method){if(!e[r.method])throw new Error(`target ${e?.constructor?.name} does not have method ${r.method}`);s=await e[r.method](...n)}else s=await e(...n);i.result=this.serialize(s,o)}catch(e){this.createErrorResult(i,e)}r.oneway||this.send(i,void 0,o);break}case"result":{const r=e,i=this.pendingResults[r.id];if(delete this.pendingResults[r.id],!i)throw new Error(`unknown result ${r.id}`);if(r.message||r.stack){const e=new RPCResultError(this,r.message||"no message",void 0,{name:r.result,stack:r.stack});return void i.reject(e)}i.resolve(this.deserialize(r.result,t));break}case"finalize":{const t=e,r=this.localProxyMap[t.__local_proxy_id];if(r){const e=this.localProxied.get(r);if(t.__local_proxy_finalizer_id&&t.__local_proxy_finalizer_id!==e?.finalizerId)break;delete this.localProxyMap[t.__local_proxy_id],this.localProxied.delete(r)}break}default:throw new Error(`unknown rpc message type ${e.type}`)}}catch(e){return void console.error("unhandled rpc error",this.peerName,e)}}}function getEvalSource(){return`\n (() => {\n ${RpcProxy}\n\n ${RpcPeer}\n \n return {\n RpcPeer,\n RpcProxy,\n };\n })();\n `}}},__webpack_module_cache__={};function __webpack_require__(e){var t=__webpack_module_cache__[e];if(void 0!==t)return t.exports;var r=__webpack_module_cache__[e]={id:e,loaded:!1,exports:{}};return __webpack_modules__[e](r,r.exports,__webpack_require__),r.loaded=!0,r.exports}__webpack_require__.d=(e,t)=>{for(var r in t)__webpack_require__.o(t,r)&&!__webpack_require__.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},__webpack_require__.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),__webpack_require__.hmd=e=>((e=Object.create(e)).children||(e.children=[]),Object.defineProperty(e,"exports",{enumerable:!0,set:()=>{throw new Error("ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: "+e.id)}}),e),__webpack_require__.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);var __webpack_exports__={};(()=>{var e=__webpack_require__(636);class t{finished=!1;resolve;reject;promise=new Promise(((e,t)=>{this.resolve=t=>{this.finished=!0,e(t)},this.reject=e=>{this.finished=!0,t(e)}}))}function r(){try{return navigator.userAgent}catch(e){}}function i(e){return new Promise((t=>{e.addEventListener("iceconnectionstatechange",(()=>{o(e)&&t(e.iceConnectionState)}))}))}function o(e){return"disconnected"===e.iceConnectionState||"failed"===e.iceConnectionState||"closed"===e.iceConnectionState}class n{pc;pcDeferred=new t;dcDeferred=new t;microphone;micEnabled=!1;onPeerConnection;options={userAgent:r(),capabilities:{audio:RTCRtpReceiver.getCapabilities?.("audio")||{codecs:void 0,headerExtensions:void 0},video:RTCRtpReceiver.getCapabilities?.("video")||{codecs:void 0,headerExtensions:void 0}},screen:{devicePixelRatio:window.devicePixelRatio,width:screen.width,height:screen.height}};constructor(){}async getOptions(){return this.options}async setMicrophone(e){if(this.microphone&&e&&!this.micEnabled){this.micEnabled=!0;const e=await navigator.mediaDevices.getUserMedia({video:!1,audio:!0});await this.microphone.replaceTrack(e.getTracks()[0])}this.microphone.track.enabled=e}close(){this.pcDeferred.promise.then((e=>{for(const t of e.getTransceivers()||[])try{t.sender?.track?.stop?.()}catch(e){}e.close()})).catch((()=>{})),this.pcDeferred.reject(new Error("iceConnectionState "+this.pc?.iceConnectionState))}async createPeerConnection(e){if(this.pc)return;const t=this.pc=new RTCPeerConnection(e.configuration);if(this.pcDeferred.resolve(t),await(this.onPeerConnection?.(t)),t.addEventListener("iceconnectionstatechange",(()=>{console.log("iceConnectionState",t.iceConnectionState),console.log("connectionState",t.connectionState),o(t)&&this.close()})),e.datachannel){const r=t.createDataChannel(e.datachannel.label,e.datachannel.dict);r.binaryType="arraybuffer",this.dcDeferred.resolve(r)}if(e.audio){let r;r=e.getUserMediaSafariHack&&navigator.userAgent.includes("Safari")&&!navigator.userAgent.includes("Chrome")?t.addTransceiver("audio",{...e.audio,streams:[await navigator.mediaDevices.getUserMedia({audio:!0})]}):t.addTransceiver("audio",e.audio),"sendrecv"!==e.audio.direction&&"sendonly"!==e.audio.direction||(this.microphone=r.sender)}if(e.video)if("sendrecv"===e.video.direction||"sendonly"===e.video.direction)try{const e=await navigator.mediaDevices.getUserMedia({video:!0});for(const r of e.getTracks())t.addTrack(r)}catch(e){}else t.addTransceiver("video",e.video)}async createLocalDescription(e,t,r){await this.createPeerConnection(t);const i=new Promise((e=>{this.pc.onicecandidate=t=>{t.candidate?r?.(JSON.parse(JSON.stringify(t.candidate))):e(void 0)},this.pc.onicegatheringstatechange=()=>{"complete"===this.pc.iceGatheringState&&e(void 0)}})),o=e=>({type:e.type,sdp:e.sdp});if("offer"===e){let e=await this.pc.createOffer({offerToReceiveAudio:!!t.audio,offerToReceiveVideo:!!t.video});const n=this.pc.setLocalDescription(e);return r||(await n,await i,e=await this.pc.createOffer({offerToReceiveAudio:!!t.audio,offerToReceiveVideo:!!t.video})),o(e)}{let e=await this.pc.createAnswer();const t=this.pc.setLocalDescription(e);return r||(await t,await i,e=this.pc.currentLocalDescription||e),o(e)}}async setRemoteDescription(e,t){await this.createPeerConnection(t),await this.pc.setRemoteDescription(e)}async addIceCandidate(e){await this.pc.addIceCandidate(e)}async endSession(){}}document.addEventListener("DOMContentLoaded",(function(t){const r=new cast.framework.CastReceiverOptions;r.disableIdleTimeout=!0,cast.framework.CastReceiverContext.getInstance().start(r);const o=cast.framework.CastReceiverContext.getInstance().getPlayerManager(),s=document.getElementById("media");let a;o.setMessageInterceptor(cast.framework.messages.MessageType.LOAD,(t=>{console.log(t);const r=t.media.entity||t.media.contentId,o=t.credentials??t.media.customData.token,c=new URL(r),_=c.pathname,d={};for(const[e,t]of new URLSearchParams(c.search))d[e]=t;const l={path:_,query:d},p=eio(`wss://${c.host}`,l);return p.on("open",(async()=>{p.send(JSON.stringify({token:o}));const t=new e.uD("cast-receiver","host",((e,t)=>{try{p.send(JSON.stringify(e))}catch(e){t?.(e)}}));p.on("message",(e=>{t.handleMessage(JSON.parse(e))}));const r=new n;r.options.screen.width=1280,r.options.screen.height=720,r.options.screen.devicePixelRatio=1;const c=()=>{console.log("cleanup"),p.close(),r.pcDeferred.promise.then((e=>e.close()))};a?.(),a=c,p.on("close",(()=>{console.log("socket io connection close event"),c()})),r.onPeerConnection=async e=>{i(e).then(c);const t=new MediaStream(e.getReceivers().map((e=>e.track)));e.ontrack=e=>t.addTrack(e.track),s.srcObject=t,function(e){return new Promise(((t,r)=>{"connected"!==e.iceConnectionState?(e.addEventListener("iceconnectionstatechange",(()=>{"connected"===e.iceConnectionState&&t(void 0)})),i(e).then((e=>r(new Error(e))))):t(void 0)}))}(e).then((()=>{p.removeAllListeners()}))},t.params.session=r})),null}))}))})()})();
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUNyQyxNQUFNQyxFQUFjLElBQUlDLFlBQVl2SCxFQUFHd0gsZUFBZUMsS0FBS3RTLEdBQWFBLEVBQVN3TSxTQUNqRjNCLEVBQUcwSCxRQUFVOVQsR0FBSzBULEVBQVlwRSxTQUFTdFAsRUFBRStOLE9BQ3pDWCxFQUFNMkcsVUFBWUwsRURyRDNCLFNBQXdDdEgsR0FDM0MsT0FBTyxJQUFJekosU0FBUSxDQUFDZSxFQUFTZCxLQUNLLGNBQTFCd0osRUFBR0csb0JBSVBILEVBQUdDLGlCQUFpQiw0QkFBNEIsS0FDZCxjQUExQkQsRUFBR0csb0JBQ0g3SSxPQUFRNUIsRUFBVSxJQUUxQnFLLEVBQTRCQyxHQUFJNkIsTUFBSytGLEdBQVVwUixFQUFPLElBQUlnQixNQUFNb1EsT0FQNUR0USxPQUFRNUIsRUFPNkQsR0FFakYsQ0MwQ2dCbVMsQ0FBK0I3SCxHQUMxQjZCLE1BQUssS0FDTmlGLEVBQU9nQixvQkFBb0IsR0FFN0IsRUFFTlosRUFBUWpQLE9BQWdCLFFBQUltUCxDQUFPLElBRWhDLElBQUksR0FHbkIsRyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL2Rpc3Qvc2VydmVyL3NyYy9ycGMuanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovLy93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svcnVudGltZS9nbG9iYWwiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svcnVudGltZS9oYXJtb255IG1vZHVsZSBkZWNvcmF0b3IiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vLy4vZGlzdC9jb21tb24vc3JjL2RlZmVycmVkLmpzIiwid2VicGFjazovLy8uL2Rpc3QvY29tbW9uL3NyYy9ydGMtc2lnbmFsaW5nLmpzIiwid2VicGFjazovLy8uL2Rpc3QvZG9jcy9wbHVnaW5zL2dvb2dsZS1ob21lL2Nhc3QtcmVjZWl2ZXIvc3JjL2Nhc3QuanMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0UGVyaW9kaWNHYXJiYWdlQ29sbGVjdGlvbigpIHtcbiAgICBpZiAoIWdsb2JhbC5nYykge1xuICAgICAgICBjb25zb2xlLndhcm4oJ3JwYyBwZWVyIGdhcmJhZ2UgY29sbGVjdGlvbiBub3QgYXZhaWxhYmxlOiBnbG9iYWwuZ2MgaXMgbm90IGV4cG9zZWQuJyk7XG4gICAgfVxuICAgIGxldCBnO1xuICAgIHRyeSB7XG4gICAgICAgIGcgPSBnbG9iYWw7XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgfVxuICAgIC8vIHBlcmlvZGljYWxseSBzZWUgaWYgbmV3IG9iamVjdHMgd2VyZSBjcmVhdGVkIG9yIGZpbmFsaXplZCxcbiAgICAvLyBhbmQgY29sbGVjdCBnYyBpZiBzby5cbiAgICBsZXQgbGFzdENvbGxlY3Rpb24gPSAwO1xuICAgIHJldHVybiBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgIGNvbnN0IHNpbmNlTGFzdENvbGxlY3Rpb24gPSBub3cgLSBsYXN0Q29sbGVjdGlvbjtcbiAgICAgICAgY29uc3QgcmVtb3Rlc0NyZWF0ZWQgPSBScGNQZWVyLnJlbW90ZXNDcmVhdGVkO1xuICAgICAgICBScGNQZWVyLnJlbW90ZXNDcmVhdGVkID0gMDtcbiAgICAgICAgY29uc3QgcmVtb3Rlc0NvbGxlY3RlZCA9IFJwY1BlZXIucmVtb3Rlc0NvbGxlY3RlZDtcbiAgICAgICAgUnBjUGVlci5yZW1vdGVzQ29sbGVjdGVkID0gMDtcbiAgICAgICAgaWYgKHJlbW90ZXNDcmVhdGVkIHx8IHJlbW90ZXNDb2xsZWN0ZWQgfHwgc2luY2VMYXN0Q29sbGVjdGlvbiA+IDUgKiA2MCAqIDEwMDApIHtcbiAgICAgICAgICAgIGxhc3RDb2xsZWN0aW9uID0gbm93O1xuICAgICAgICAgICAgZz8uZ2M/LigpO1xuICAgICAgICB9XG4gICAgfSwgMTAwMDApO1xufVxuY2xhc3MgUnBjUHJveHkge1xuICAgIHBlZXI7XG4gICAgZW50cnk7XG4gICAgY29uc3RydWN0b3JOYW1lO1xuICAgIHByb3h5UHJvcHM7XG4gICAgcHJveHlPbmVXYXlNZXRob2RzO1xuICAgIGNvbnN0cnVjdG9yKHBlZXIsIGVudHJ5LCBjb25zdHJ1Y3Rvck5hbWUsIHByb3h5UHJvcHMsIHByb3h5T25lV2F5TWV0aG9kcykge1xuICAgICAgICB0aGlzLnBlZXIgPSBwZWVyO1xuICAgICAgICB0aGlzLmVudHJ5ID0gZW50cnk7XG4gICAgICAgIHRoaXMuY29uc3RydWN0b3JOYW1lID0gY29uc3RydWN0b3JOYW1lO1xuICAgICAgICB0aGlzLnByb3h5UHJvcHMgPSBwcm94eVByb3BzO1xuICAgICAgICB0aGlzLnByb3h5T25lV2F5TWV0aG9kcyA9IHByb3h5T25lV2F5TWV0aG9kcztcbiAgICB9XG4gICAgdG9QcmltaXRpdmUoKSB7XG4gICAgICAgIGNvbnN0IHBlZXIgPSB0aGlzLnBlZXI7XG4gICAgICAgIHJldHVybiBgUnBjUHJveHktJHtwZWVyLnNlbGZOYW1lfToke3BlZXIucGVlck5hbWV9OiAke3RoaXMuY29uc3RydWN0b3JOYW1lfWA7XG4gICAgfVxuICAgIGdldCh0YXJnZXQsIHAsIHJlY2VpdmVyKSB7XG4gICAgICAgIGlmIChwID09PSBScGNQZWVyLlBST1BFUlRZX1BST1hZX0lEKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW50cnkuaWQ7XG4gICAgICAgIGlmIChwID09PSAnX19wcm94eV9jb25zdHJ1Y3RvcicpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvck5hbWU7XG4gICAgICAgIGlmIChwID09PSAnX19wcm94eV9wZWVyJylcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBlZXI7XG4gICAgICAgIGlmIChwID09PSBScGNQZWVyLlBST1BFUlRZX1BST1hZX1BST1BFUlRJRVMpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm94eVByb3BzO1xuICAgICAgICBpZiAocCA9PT0gUnBjUGVlci5QUk9QRVJUWV9QUk9YWV9PTkVXQVlfTUVUSE9EUylcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb3h5T25lV2F5TWV0aG9kcztcbiAgICAgICAgaWYgKHAgPT09IFJwY1BlZXIuUFJPUEVSVFlfSlNPTl9ESVNBQkxFX1NFUklBTElaQVRJT04gfHwgcCA9PT0gUnBjUGVlci5QUk9QRVJUWV9KU09OX0NPUFlfU0VSSUFMSVpFX0NISUxEUkVOKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpZiAocCA9PT0gJ3RoZW4nKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpZiAocCA9PT0gJ2NvbnN0cnVjdG9yJylcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMucHJveHlQcm9wcz8uW3BdICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm94eVByb3BzPy5bcF07XG4gICAgICAgIGNvbnN0IGhhbmRsZWQgPSBScGNQZWVyLmhhbmRsZUZ1bmN0aW9uSW52b2NhdGlvbnModGhpcywgdGFyZ2V0LCBwLCByZWNlaXZlcik7XG4gICAgICAgIGlmIChoYW5kbGVkKVxuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZWQ7XG4gICAgICAgIHJldHVybiBuZXcgUHJveHkoKCkgPT4gcCwgdGhpcyk7XG4gICAgfVxuICAgIHNldCh0YXJnZXQsIHAsIHZhbHVlLCByZWNlaXZlcikge1xuICAgICAgICBpZiAocCA9PT0gUnBjUGVlci5maW5hbGl6ZXJJZFN5bWJvbCkge1xuICAgICAgICAgICAgdGhpcy5lbnRyeS5maW5hbGl6ZXJJZCA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wcm94eVByb3BzIHx8PSB7fTtcbiAgICAgICAgICAgIHRoaXMucHJveHlQcm9wc1twXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBhcHBseSh0YXJnZXQsIHRoaXNBcmcsIGFyZ0FycmF5KSB7XG4gICAgICAgIGlmIChPYmplY3QuaXNGcm96ZW4odGhpcy5wZWVyLnBlbmRpbmdSZXN1bHRzKSlcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgUlBDUmVzdWx0RXJyb3IodGhpcy5wZWVyLCAnUnBjUGVlciBoYXMgYmVlbiBraWxsZWQnKSk7XG4gICAgICAgIC8vIHJwYyBvYmplY3RzIGNhbiBiZSBmdW5jdGlvbnMuIGlmIHRoZSBmdW5jdGlvbiBpcyBhIG9uZXdheSBtZXRob2QsXG4gICAgICAgIC8vIGl0IHdpbGwgaGF2ZSBhIG51bGwgaW4gdGhlIG9uZXdheSBtZXRob2QgbGlzdC4gdGhpcyBpcyBiZWNhdXNlXG4gICAgICAgIC8vIHVuZGVmaW5lZCBpcyBub3QgSlNPTiBzZXJpYWxpemFibGUuXG4gICAgICAgIGNvbnN0IG1ldGhvZCA9IHRhcmdldCgpIHx8IG51bGw7XG4gICAgICAgIGNvbnN0IGFyZ3MgPSBbXTtcbiAgICAgICAgY29uc3Qgc2VyaWFsaXphdGlvbkNvbnRleHQgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBhcmcgb2YgKGFyZ0FycmF5IHx8IFtdKSkge1xuICAgICAgICAgICAgYXJncy5wdXNoKHRoaXMucGVlci5zZXJpYWxpemUoYXJnLCBzZXJpYWxpemF0aW9uQ29udGV4dCkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJwY0FwcGx5ID0ge1xuICAgICAgICAgICAgdHlwZTogXCJhcHBseVwiLFxuICAgICAgICAgICAgaWQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHByb3h5SWQ6IHRoaXMuZW50cnkuaWQsXG4gICAgICAgICAgICBhcmdzLFxuICAgICAgICAgICAgbWV0aG9kLFxuICAgICAgICB9O1xuICAgICAgICBpZiAodGhpcy5wcm94eU9uZVdheU1ldGhvZHM/LmluY2x1ZGVzPy4obWV0aG9kKSkge1xuICAgICAgICAgICAgcnBjQXBwbHkub25ld2F5ID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vIGEgb25ld2F5IGNhbGxhYmxlIG9iamVjdCBkb2Vzbid0IG5lZWQgdG8gYmUgaW4gdGhlIEpTT04gcGF5bG9hZC5cbiAgICAgICAgICAgIGlmIChtZXRob2QgPT09IG51bGwpXG4gICAgICAgICAgICAgICAgZGVsZXRlIHJwY0FwcGx5Lm1ldGhvZDtcbiAgICAgICAgICAgIHRoaXMucGVlci5zZW5kKHJwY0FwcGx5LCB1bmRlZmluZWQsIHNlcmlhbGl6YXRpb25Db250ZXh0KTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5wZWVyLmNyZWF0ZVBlbmRpbmdSZXN1bHQoKGlkLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHJwY0FwcGx5LmlkID0gaWQ7XG4gICAgICAgICAgICB0aGlzLnBlZXIuc2VuZChycGNBcHBseSwgcmVqZWN0LCBzZXJpYWxpemF0aW9uQ29udGV4dCk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbi8vIHRvZG86IGVycm9yIGNvbnN0cnVjdG9yIGFkZHMgYSBcImNhdXNlXCIgdmFyaWFibGUgaW4gQ2hyb21lIDkzLCBOb2RlIHY/P1xuZXhwb3J0IGNsYXNzIFJQQ1Jlc3VsdEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNhdXNlO1xuICAgIGNvbnN0cnVjdG9yKHBlZXIsIG1lc3NhZ2UsIGNhdXNlLCBvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKGAke3BlZXIuc2VsZk5hbWV9OiR7cGVlci5wZWVyTmFtZX06ICR7bWVzc2FnZX1gKTtcbiAgICAgICAgdGhpcy5jYXVzZSA9IGNhdXNlO1xuICAgICAgICBpZiAob3B0aW9ucz8ubmFtZSkge1xuICAgICAgICAgICAgdGhpcy5uYW1lID0gb3B0aW9ucz8ubmFtZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucz8uc3RhY2spIHtcbiAgICAgICAgICAgIHRoaXMuc3RhY2sgPSBgJHtwZWVyLnBlZXJOYW1lfToke3BlZXIuc2VsZk5hbWV9XFxuJHtjYXVzZT8uc3RhY2sgfHwgb3B0aW9ucy5zdGFja31gO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gY29tcGlsZUZ1bmN0aW9uKGNvZGUsIHBhcmFtcywgb3B0aW9ucykge1xuICAgIHBhcmFtcyA9IHBhcmFtcyB8fCBbXTtcbiAgICBjb25zdCBmID0gYChmdW5jdGlvbigke3BhcmFtcy5qb2luKCcsJyl9KSB7OyR7Y29kZX07fSlgO1xuICAgIHJldHVybiBldmFsKGYpO1xufVxudHJ5IHtcbiAgICBjb25zdCBmciA9IEZpbmFsaXphdGlvblJlZ2lzdHJ5O1xufVxuY2F0Y2ggKGUpIHtcbiAgICB3aW5kb3cuV2Vha1JlZiA9IGNsYXNzIFdlYWtSZWYge1xuICAgICAgICB0YXJnZXQ7XG4gICAgICAgIGNvbnN0cnVjdG9yKHRhcmdldCkge1xuICAgICAgICAgICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7XG4gICAgICAgIH1cbiAgICAgICAgZGVyZWYoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50YXJnZXQ7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHdpbmRvdy5GaW5hbGl6YXRpb25SZWdpc3RyeSA9IGNsYXNzIEZpbmFsaXphdGlvblJlZ2lzdHJ5IHtcbiAgICAgICAgcmVnaXN0ZXIoKSB7XG4gICAgICAgIH1cbiAgICB9O1xufVxuZXhwb3J0IGNsYXNzIFJwY1BlZXIge1xuICAgIHNlbGZOYW1lO1xuICAgIHBlZXJOYW1lO1xuICAgIHNlbmQ7XG4gICAgaWRDb3VudGVyID0gMTtcbiAgICBwYXJhbXMgPSB7fTtcbiAgICBwZW5kaW5nUmVzdWx0cyA9IHt9O1xuICAgIHByb3h5Q291bnRlciA9IDE7XG4gICAgbG9jYWxQcm94aWVkID0gbmV3IE1hcCgpO1xuICAgIGxvY2FsUHJveHlNYXAgPSB7fTtcbiAgICByZW1vdGVXZWFrUHJveGllcyA9IHt9O1xuICAgIGZpbmFsaXplcnMgPSBuZXcgRmluYWxpemF0aW9uUmVnaXN0cnkoZW50cnkgPT4gdGhpcy5maW5hbGl6ZShlbnRyeSkpO1xuICAgIG5hbWVEZXNlcmlhbGl6ZXJNYXAgPSBuZXcgTWFwKCk7XG4gICAgY29uc3RydWN0b3JTZXJpYWxpemVyTWFwID0gbmV3IE1hcCgpO1xuICAgIHRyYW5zcG9ydFNhZmVBcmd1bWVudFR5cGVzID0gUnBjUGVlci5nZXREZWZhdWx0VHJhbnNwb3J0U2FmZUFyZ3VtZW50VHlwZXMoKTtcbiAgICBraWxsZWQ7XG4gICAga2lsbGVkRGVmZXJyZWQ7XG4gICAgdGFncyA9IHt9O1xuICAgIHN0YXRpYyBmaW5hbGl6ZXJJZFN5bWJvbCA9IFN5bWJvbCgncnBjRmluYWxpemVySWQnKTtcbiAgICBzdGF0aWMgcmVtb3Rlc0NvbGxlY3RlZCA9IDA7XG4gICAgc3RhdGljIHJlbW90ZXNDcmVhdGVkID0gMDtcbiAgICBzdGF0aWMgYWN0aXZlUnBjUGVlcjtcbiAgICBzdGF0aWMgaXNScGNQcm94eSh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gISF2YWx1ZT8uW1JwY1BlZXIuUFJPUEVSVFlfUFJPWFlfSURdO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0RGVmYXVsdFRyYW5zcG9ydFNhZmVBcmd1bWVudFR5cGVzKCkge1xuICAgICAgICBjb25zdCBqc29uU2VyaWFsaXphYmxlID0gbmV3IFNldCgpO1xuICAgICAgICBqc29uU2VyaWFsaXphYmxlLmFkZChOdW1iZXIubmFtZSk7XG4gICAgICAgIGpzb25TZXJpYWxpemFibGUuYWRkKFN0cmluZy5uYW1lKTtcbiAgICAgICAganNvblNlcmlhbGl6YWJsZS5hZGQoT2JqZWN0Lm5hbWUpO1xuICAgICAgICBqc29uU2VyaWFsaXphYmxlLmFkZChCb29sZWFuLm5hbWUpO1xuICAgICAgICBqc29uU2VyaWFsaXphYmxlLmFkZChBcnJheS5uYW1lKTtcbiAgICAgICAgcmV0dXJuIGpzb25TZXJpYWxpemFibGU7XG4gICAgfVxuICAgIHN0YXRpYyBoYW5kbGVGdW5jdGlvbkludm9jYXRpb25zKHRoaXosIHRhcmdldCwgcCwgcmVjZWl2ZXIpIHtcbiAgICAgICAgaWYgKHAgPT09ICdhcHBseScpIHtcbiAgICAgICAgICAgIHJldHVybiAodGhpc0FyZywgYXJncykgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGl6LmFwcGx5KHRhcmdldCwgdGhpeiwgYXJncyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHAgPT09ICdjYWxsJykge1xuICAgICAgICAgICAgcmV0dXJuICh0aGlzQXJnLCAuLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXouYXBwbHkodGFyZ2V0LCB0aGl6LCBhcmdzKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocCA9PT0gJ3RvU3RyaW5nJyB8fCBwID09PSBTeW1ib2wudG9QcmltaXRpdmUpIHtcbiAgICAgICAgICAgIHJldHVybiAodGhpc0FyZywgLi4uYXJncykgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGl6LnRvUHJpbWl0aXZlKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyBQUk9QRVJUWV9QUk9YWV9JRCA9ICdfX3Byb3h5X2lkJztcbiAgICBzdGF0aWMgUFJPUEVSVFlfUFJPWFlfT05FV0FZX01FVEhPRFMgPSAnX19wcm94eV9vbmV3YXlfbWV0aG9kcyc7XG4gICAgc3RhdGljIFBST1BFUlRZX0pTT05fRElTQUJMRV9TRVJJQUxJWkFUSU9OID0gJ19fanNvbl9kaXNhYmxlX3NlcmlhbGl6YXRpb24nO1xuICAgIHN0YXRpYyBQUk9QRVJUWV9QUk9YWV9QUk9QRVJUSUVTID0gJ19fcHJveHlfcHJvcHMnO1xuICAgIHN0YXRpYyBQUk9QRVJUWV9KU09OX0NPUFlfU0VSSUFMSVpFX0NISUxEUkVOID0gJ19fanNvbl9jb3B5X3NlcmlhbGl6ZV9jaGlsZHJlbic7XG4gICAgc3RhdGljIFBST0JFRF9QUk9QRVJUSUVTID0gbmV3IFNldChbXG4gICAgICAgICd0aGVuJyxcbiAgICAgICAgJ2NvbnN0cnVjdG9yJyxcbiAgICAgICAgJ19fcHJveHlfaWQnLFxuICAgICAgICAnX19wcm94eV9jb25zdHJ1Y3RvcicsXG4gICAgICAgICdfX3Byb3h5X3BlZXInLFxuICAgICAgICBScGNQZWVyLlBST1BFUlRZX1BST1hZX09ORVdBWV9NRVRIT0RTLFxuICAgICAgICBScGNQZWVyLlBST1BFUlRZX0pTT05fRElTQUJMRV9TRVJJQUxJWkFUSU9OLFxuICAgICAgICBScGNQZWVyLlBST1BFUlRZX1BST1hZX1BST1BFUlRJRVMsXG4gICAgICAgIFJwY1BlZXIuUFJPUEVSVFlfSlNPTl9DT1BZX1NFUklBTElaRV9DSElMRFJFTixcbiAgICBdKTtcbiAgICBjb25zdHJ1Y3RvcihzZWxmTmFtZSwgcGVlck5hbWUsIHNlbmQpIHtcbiAgICAgICAgdGhpcy5zZWxmTmFtZSA9IHNlbGZOYW1lO1xuICAgICAgICB0aGlzLnBlZXJOYW1lID0gcGVlck5hbWU7XG4gICAgICAgIHRoaXMuc2VuZCA9IHNlbmQ7XG4gICAgICAgIHRoaXMua2lsbGVkID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5raWxsZWREZWZlcnJlZCA9IHsgcmVzb2x2ZSwgcmVqZWN0IH07XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmtpbGxlZC5jYXRjaCgoKSA9PiB7IH0pO1xuICAgIH1cbiAgICBjcmVhdGVQZW5kaW5nUmVzdWx0KGNiKSB7XG4gICAgICAgIGlmIChPYmplY3QuaXNGcm96ZW4odGhpcy5wZW5kaW5nUmVzdWx0cykpXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IFJQQ1Jlc3VsdEVycm9yKHRoaXMsICdScGNQZWVyIGhhcyBiZWVuIGtpbGxlZCcpKTtcbiAgICAgICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gKHRoaXMuaWRDb3VudGVyKyspLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdSZXN1bHRzW2lkXSA9IHsgcmVzb2x2ZSwgcmVqZWN0IH07XG4gICAgICAgICAgICBjYihpZCwgZSA9PiByZWplY3QobmV3IFJQQ1Jlc3VsdEVycm9yKHRoaXMsIGUubWVzc2FnZSwgZSkpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIHRvZG86IG1ha2UgdGhpcyBhbiBvcHRpb24gc28gcnBjIGRvZXNuJ3QgbnVrZSB0aGUgcHJvY2VzcyBpZiB1bmNhdWdodD9cbiAgICAgICAgcHJvbWlzZS5jYXRjaCgoKSA9PiB7IH0pO1xuICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9XG4gICAga2lsbChtZXNzYWdlKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gbmV3IFJQQ1Jlc3VsdEVycm9yKHRoaXMsIG1lc3NhZ2UgfHwgJ3BlZXIgd2FzIGtpbGxlZCcpO1xuICAgICAgICB0aGlzLmtpbGxlZERlZmVycmVkLnJlamVjdChlcnJvcik7XG4gICAgICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIE9iamVjdC52YWx1ZXModGhpcy5wZW5kaW5nUmVzdWx0cykpIHtcbiAgICAgICAgICAgIHJlc3VsdC5yZWplY3QoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucGVuZGluZ1Jlc3VsdHMgPSBPYmplY3QuZnJlZXplKHt9KTtcbiAgICAgICAgdGhpcy5wYXJhbXMgPSBPYmplY3QuZnJlZXplKHt9KTtcbiAgICAgICAgdGhpcy5yZW1vdGVXZWFrUHJveGllcyA9IE9iamVjdC5mcmVlemUoe30pO1xuICAgICAgICB0aGlzLmxvY2FsUHJveHlNYXAgPSBPYmplY3QuZnJlZXplKHt9KTtcbiAgICAgICAgdGhpcy5sb2NhbFByb3hpZWQuY2xlYXIoKTtcbiAgICB9XG4gICAgLy8gbmVlZCBhIG5hbWUvY29uc3RydWN0b3IgbWFwIGR1ZSB0byBiYWJlbCBuYW1lIG1hbmdsaW5nPyBmaXggc29tZWhvdz9cbiAgICBhZGRTZXJpYWxpemVyKGN0ciwgbmFtZSwgc2VyaWFsaXplcikge1xuICAgICAgICB0aGlzLm5hbWVEZXNlcmlhbGl6ZXJNYXAuc2V0KG5hbWUsIHNlcmlhbGl6ZXIpO1xuICAgICAgICB0aGlzLmNvbnN0cnVjdG9yU2VyaWFsaXplck1hcC5zZXQoY3RyLCBuYW1lKTtcbiAgICB9XG4gICAgZmluYWxpemUoZW50cnkpIHtcbiAgICAgICAgUnBjUGVlci5yZW1vdGVzQ29sbGVjdGVkKys7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnJlbW90ZVdlYWtQcm94aWVzW2VudHJ5LmlkXTtcbiAgICAgICAgY29uc3QgcnBjRmluYWxpemUgPSB7XG4gICAgICAgICAgICBfX2xvY2FsX3Byb3h5X2lkOiBlbnRyeS5pZCxcbiAgICAgICAgICAgIF9fbG9jYWxfcHJveHlfZmluYWxpemVyX2lkOiBlbnRyeS5maW5hbGl6ZXJJZCxcbiAgICAgICAgICAgIHR5cGU6ICdmaW5hbGl6ZScsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc2VuZChycGNGaW5hbGl6ZSk7XG4gICAgfVxuICAgIGFzeW5jIGdldFBhcmFtKHBhcmFtKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVBlbmRpbmdSZXN1bHQoKGlkLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmFtTWVzc2FnZSA9IHtcbiAgICAgICAgICAgICAgICBpZCxcbiAgICAgICAgICAgICAgICB0eXBlOiAncGFyYW0nLFxuICAgICAgICAgICAgICAgIHBhcmFtLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuc2VuZChwYXJhbU1lc3NhZ2UsIHJlamVjdCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBldmFsTG9jYWwoc2NyaXB0LCBmaWxlbmFtZSwgY29lcmNlZFBhcmFtcykge1xuICAgICAgICBjb25zdCBwYXJhbXMgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLnBhcmFtcywgY29lcmNlZFBhcmFtcyk7XG4gICAgICAgIGxldCBjb21waWxlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gcHJldmVudCBidW5kbGVycyBmcm9tIHRyeWluZyB0byBpbmNsdWRlIG5vbi1leGlzdGVudCB2bSBtb2R1bGUuXG4gICAgICAgICAgICBjb21waWxlID0gbW9kdWxlW2ByZXF1aXJlYF0oJ3ZtJykuY29tcGlsZUZ1bmN0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb21waWxlID0gY29tcGlsZUZ1bmN0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGYgPSBjb21waWxlKHNjcmlwdCwgT2JqZWN0LmtleXMocGFyYW1zKSwge1xuICAgICAgICAgICAgZmlsZW5hbWUsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGYoLi4uT2JqZWN0LnZhbHVlcyhwYXJhbXMpKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBjcmVhdGVFcnJvclJlc3VsdChyZXN1bHQsIGUpIHtcbiAgICAgICAgcmVzdWx0LnN0YWNrID0gZS5zdGFjayB8fCAnbm8gc3RhY2snO1xuICAgICAgICByZXN1bHQucmVzdWx0ID0gZS5uYW1lIHx8ICdubyBuYW1lJztcbiAgICAgICAgcmVzdWx0Lm1lc3NhZ2UgPSBlLm1lc3NhZ2UgfHwgJ25vIG1lc3NhZ2UnO1xuICAgIH1cbiAgICBkZXNlcmlhbGl6ZSh2YWx1ZSwgZGVzZXJpYWxpemF0aW9uQ29udGV4dCkge1xuICAgICAgICBpZiAoIXZhbHVlKVxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICBjb25zdCBjb3B5U2VyaWFsaXplQ2hpbGRyZW4gPSB2YWx1ZVtScGNQZWVyLlBST1BFUlRZX0pTT05fQ09QWV9TRVJJQUxJWkVfQ0hJTERSRU5dO1xuICAgICAgICBpZiAoY29weVNlcmlhbGl6ZUNoaWxkcmVuKSB7XG4gICAgICAgICAgICBjb25zdCByZXQgPSB7fTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXRba2V5XSA9IHRoaXMuZGVzZXJpYWxpemUodmFsLCBkZXNlcmlhbGl6YXRpb25Db250ZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBfX3JlbW90ZV9wcm94eV9pZCwgX19yZW1vdGVfcHJveHlfZmluYWxpemVyX2lkLCBfX2xvY2FsX3Byb3h5X2lkLCBfX3JlbW90ZV9jb25zdHJ1Y3Rvcl9uYW1lLCBfX3NlcmlhbGl6ZWRfdmFsdWUsIF9fcmVtb3RlX3Byb3h5X3Byb3BzLCBfX3JlbW90ZV9wcm94eV9vbmV3YXlfbWV0aG9kcyB9ID0gdmFsdWU7XG4gICAgICAgIGlmIChfX3JlbW90ZV9wcm94eV9pZCkge1xuICAgICAgICAgICAgbGV0IHByb3h5ID0gdGhpcy5yZW1vdGVXZWFrUHJveGllc1tfX3JlbW90ZV9wcm94eV9pZF0/LmRlcmVmKCk7XG4gICAgICAgICAgICBpZiAoIXByb3h5KVxuICAgICAgICAgICAgICAgIHByb3h5ID0gdGhpcy5uZXdQcm94eShfX3JlbW90ZV9wcm94eV9pZCwgX19yZW1vdGVfY29uc3RydWN0b3JfbmFtZSwgX19yZW1vdGVfcHJveHlfcHJvcHMsIF9fcmVtb3RlX3Byb3h5X29uZXdheV9tZXRob2RzKTtcbiAgICAgICAgICAgIHByb3h5W1JwY1BlZXIuZmluYWxpemVySWRTeW1ib2xdID0gX19yZW1vdGVfcHJveHlfZmluYWxpemVyX2lkO1xuICAgICAgICAgICAgY29uc3QgZGVzZXJpYWxpemVyID0gdGhpcy5uYW1lRGVzZXJpYWxpemVyTWFwLmdldChfX3JlbW90ZV9jb25zdHJ1Y3Rvcl9uYW1lKTtcbiAgICAgICAgICAgIGlmIChkZXNlcmlhbGl6ZXIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGVzZXJpYWxpemVyLmRlc2VyaWFsaXplKHByb3h5LCBkZXNlcmlhbGl6YXRpb25Db250ZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwcm94eTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoX19sb2NhbF9wcm94eV9pZCkge1xuICAgICAgICAgICAgY29uc3QgcmV0ID0gdGhpcy5sb2NhbFByb3h5TWFwW19fbG9jYWxfcHJveHlfaWRdO1xuICAgICAgICAgICAgaWYgKCFyZXQpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJQQ1Jlc3VsdEVycm9yKHRoaXMsIGBpbnZhbGlkIGxvY2FsIHByb3h5IGlkICR7X19sb2NhbF9wcm94eV9pZH1gKTtcbiAgICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGVzZXJpYWxpemVyID0gdGhpcy5uYW1lRGVzZXJpYWxpemVyTWFwLmdldChfX3JlbW90ZV9jb25zdHJ1Y3Rvcl9uYW1lKTtcbiAgICAgICAgaWYgKGRlc2VyaWFsaXplcikge1xuICAgICAgICAgICAgcmV0dXJuIGRlc2VyaWFsaXplci5kZXNlcmlhbGl6ZShfX3NlcmlhbGl6ZWRfdmFsdWUsIGRlc2VyaWFsaXphdGlvbkNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgc2VyaWFsaXplKHZhbHVlLCBzZXJpYWxpemF0aW9uQ29udGV4dCkge1xuICAgICAgICBpZiAodmFsdWU/LltScGNQZWVyLlBST1BFUlRZX0pTT05fQ09QWV9TRVJJQUxJWkVfQ0hJTERSRU5dID09PSB0cnVlKSB7XG4gICAgICAgICAgICBjb25zdCByZXQgPSB7fTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXRba2V5XSA9IHRoaXMuc2VyaWFsaXplKHZhbCwgc2VyaWFsaXphdGlvbkNvbnRleHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXZhbHVlIHx8ICghdmFsdWVbUnBjUGVlci5QUk9QRVJUWV9KU09OX0RJU0FCTEVfU0VSSUFMSVpBVElPTl0gJiYgdGhpcy50cmFuc3BvcnRTYWZlQXJndW1lbnRUeXBlcy5oYXModmFsdWUuY29uc3RydWN0b3I/Lm5hbWUpKSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGxldCBfX3JlbW90ZV9jb25zdHJ1Y3Rvcl9uYW1lID0gdmFsdWUuX19wcm94eV9jb25zdHJ1Y3RvciB8fCB2YWx1ZS5jb25zdHJ1Y3Rvcj8ubmFtZT8udG9TdHJpbmcoKTtcbiAgICAgICAgbGV0IHByb3hpZWRFbnRyeSA9IHRoaXMubG9jYWxQcm94aWVkLmdldCh2YWx1ZSk7XG4gICAgICAgIGlmIChwcm94aWVkRW50cnkpIHtcbiAgICAgICAgICAgIGNvbnN0IF9fcmVtb3RlX3Byb3h5X2ZpbmFsaXplcl9pZCA9ICh0aGlzLnByb3h5Q291bnRlcisrKS50b1N0cmluZygpO1xuICAgICAgICAgICAgcHJveGllZEVudHJ5LmZpbmFsaXplcklkID0gX19yZW1vdGVfcHJveHlfZmluYWxpemVyX2lkO1xuICAgICAgICAgICAgY29uc3QgcmV0ID0ge1xuICAgICAgICAgICAgICAgIF9fcmVtb3RlX3Byb3h5X2lkOiBwcm94aWVkRW50cnkuaWQsXG4gICAgICAgICAgICAgICAgX19yZW1vdGVfcHJveHlfZmluYWxpemVyX2lkLFxuICAgICAgICAgICAgICAgIF9fcmVtb3RlX2NvbnN0cnVjdG9yX25hbWUsXG4gICAgICAgICAgICAgICAgX19yZW1vdGVfcHJveHlfcHJvcHM6IHZhbHVlPy5bUnBjUGVlci5QUk9QRVJUWV9QUk9YWV9QUk9QRVJUSUVTXSxcbiAgICAgICAgICAgICAgICBfX3JlbW90ZV9wcm94eV9vbmV3YXlfbWV0aG9kczogdmFsdWU/LltScGNQZWVyLlBST1BFUlRZX1BST1hZX09ORVdBWV9NRVRIT0RTXSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgX19wcm94eV9pZCwgX19wcm94eV9wZWVyIH0gPSB2YWx1ZTtcbiAgICAgICAgaWYgKF9fcHJveHlfaWQgJiYgX19wcm94eV9wZWVyID09PSB0aGlzKSB7XG4gICAgICAgICAgICBjb25zdCByZXQgPSB7XG4gICAgICAgICAgICAgICAgX19sb2NhbF9wcm94eV9pZDogX19wcm94eV9pZCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZXJNYXBOYW1lID0gdGhpcy5jb25zdHJ1Y3RvclNlcmlhbGl6ZXJNYXAuZ2V0KHZhbHVlLmNvbnN0cnVjdG9yKTtcbiAgICAgICAgaWYgKHNlcmlhbGl6ZXJNYXBOYW1lKSB7XG4gICAgICAgICAgICBfX3JlbW90ZV9jb25zdHJ1Y3Rvcl9uYW1lID0gc2VyaWFsaXplck1hcE5hbWU7XG4gICAgICAgICAgICBjb25zdCBzZXJpYWxpemVyID0gdGhpcy5uYW1lRGVzZXJpYWxpemVyTWFwLmdldChzZXJpYWxpemVyTWFwTmFtZSk7XG4gICAgICAgICAgICBpZiAoIXNlcmlhbGl6ZXIpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzZXJpYWxpemVyIG5vdCBmb3VuZCBmb3IgJyArIHNlcmlhbGl6ZXJNYXBOYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBzZXJpYWxpemVyLnNlcmlhbGl6ZSh2YWx1ZSwgc2VyaWFsaXphdGlvbkNvbnRleHQpO1xuICAgICAgICAgICAgY29uc3QgcmV0ID0ge1xuICAgICAgICAgICAgICAgIF9fcmVtb3RlX3Byb3h5X2lkOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgX19yZW1vdGVfcHJveHlfZmluYWxpemVyX2lkOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgX19yZW1vdGVfY29uc3RydWN0b3JfbmFtZSxcbiAgICAgICAgICAgICAgICBfX3JlbW90ZV9wcm94eV9wcm9wczogdmFsdWU/LltScGNQZWVyLlBST1BFUlRZX1BST1hZX1BST1BFUlRJRVNdLFxuICAgICAgICAgICAgICAgIF9fcmVtb3RlX3Byb3h5X29uZXdheV9tZXRob2RzOiB2YWx1ZT8uW1JwY1BlZXIuUFJPUEVSVFlfUFJPWFlfT05FV0FZX01FVEhPRFNdLFxuICAgICAgICAgICAgICAgIF9fc2VyaWFsaXplZF92YWx1ZTogc2VyaWFsaXplZCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IF9fcmVtb3RlX3Byb3h5X2lkID0gKHRoaXMucHJveHlDb3VudGVyKyspLnRvU3RyaW5nKCk7XG4gICAgICAgIHByb3hpZWRFbnRyeSA9IHtcbiAgICAgICAgICAgIGlkOiBfX3JlbW90ZV9wcm94eV9pZCxcbiAgICAgICAgICAgIGZpbmFsaXplcklkOiBfX3JlbW90ZV9wcm94eV9pZCxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5sb2NhbFByb3hpZWQuc2V0KHZhbHVlLCBwcm94aWVkRW50cnkpO1xuICAgICAgICB0aGlzLmxvY2FsUHJveHlNYXBbX19yZW1vdGVfcHJveHlfaWRdID0gdmFsdWU7XG4gICAgICAgIGNvbnN0IHJldCA9IHtcbiAgICAgICAgICAgIF9fcmVtb3RlX3Byb3h5X2lkLFxuICAgICAgICAgICAgX19yZW1vdGVfcHJveHlfZmluYWxpemVyX2lkOiBfX3JlbW90ZV9wcm94eV9pZCxcbiAgICAgICAgICAgIF9fcmVtb3RlX2NvbnN0cnVjdG9yX25hbWUsXG4gICAgICAgICAgICBfX3JlbW90ZV9wcm94eV9wcm9wczogdmFsdWU/LltScGNQZWVyLlBST1BFUlRZX1BST1hZX1BST1BFUlRJRVNdLFxuICAgICAgICAgICAgX19yZW1vdGVfcHJveHlfb25ld2F5X21ldGhvZHM6IHZhbHVlPy5bUnBjUGVlci5QUk9QRVJUWV9QUk9YWV9PTkVXQVlfTUVUSE9EU10sXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuICAgIG5ld1Byb3h5KHByb3h5SWQsIHByb3h5Q29uc3RydWN0b3JOYW1lLCBwcm94eVByb3BzLCBwcm94eU9uZVdheU1ldGhvZHMpIHtcbiAgICAgICAgUnBjUGVlci5yZW1vdGVzQ3JlYXRlZCsrO1xuICAgICAgICBjb25zdCBsb2NhbFByb3hpZWRFbnRyeSA9IHtcbiAgICAgICAgICAgIGlkOiBwcm94eUlkLFxuICAgICAgICAgICAgZmluYWxpemVySWQ6IHVuZGVmaW5lZCxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcnBjID0gbmV3IFJwY1Byb3h5KHRoaXMsIGxvY2FsUHJveGllZEVudHJ5LCBwcm94eUNvbnN0cnVjdG9yTmFtZSwgcHJveHlQcm9wcywgcHJveHlPbmVXYXlNZXRob2RzKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gcHJveHlDb25zdHJ1Y3Rvck5hbWUgPT09ICdGdW5jdGlvbicgfHwgcHJveHlDb25zdHJ1Y3Rvck5hbWUgPT09ICdBc3luY0Z1bmN0aW9uJyA/IGZ1bmN0aW9uICgpIHsgfSA6IHJwYztcbiAgICAgICAgY29uc3QgcHJveHkgPSBuZXcgUHJveHkodGFyZ2V0LCBycGMpO1xuICAgICAgICBjb25zdCB3ZWFrcmVmID0gbmV3IFdlYWtSZWYocHJveHkpO1xuICAgICAgICB0aGlzLnJlbW90ZVdlYWtQcm94aWVzW3Byb3h5SWRdID0gd2Vha3JlZjtcbiAgICAgICAgdGhpcy5maW5hbGl6ZXJzLnJlZ2lzdGVyKHJwYywgbG9jYWxQcm94aWVkRW50cnkpO1xuICAgICAgICByZXR1cm4gcHJveHk7XG4gICAgfVxuICAgIGhhbmRsZU1lc3NhZ2UobWVzc2FnZSwgZGVzZXJpYWxpemF0aW9uQ29udGV4dCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgUnBjUGVlci5hY3RpdmVScGNQZWVyID0gdGhpcztcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlTWVzc2FnZUludGVybmFsKG1lc3NhZ2UsIGRlc2VyaWFsaXphdGlvbkNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgUnBjUGVlci5hY3RpdmVScGNQZWVyID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIGhhbmRsZU1lc3NhZ2VJbnRlcm5hbChtZXNzYWdlLCBkZXNlcmlhbGl6YXRpb25Db250ZXh0KSB7XG4gICAgICAgIGlmIChPYmplY3QuaXNGcm96ZW4odGhpcy5wZW5kaW5nUmVzdWx0cykpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBzd2l0Y2ggKG1lc3NhZ2UudHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ3BhcmFtJzoge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBycGNQYXJhbSA9IG1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlcmlhbGl6YXRpb25Db250ZXh0ID0ge307XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdyZXN1bHQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHJwY1BhcmFtLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0OiB0aGlzLnNlcmlhbGl6ZSh0aGlzLnBhcmFtc1tycGNQYXJhbS5wYXJhbV0sIHNlcmlhbGl6YXRpb25Db250ZXh0KVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbmQocmVzdWx0LCB1bmRlZmluZWQsIHNlcmlhbGl6YXRpb25Db250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgJ2FwcGx5Jzoge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBycGNBcHBseSA9IG1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdyZXN1bHQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHJwY0FwcGx5LmlkIHx8ICcnLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZXJpYWxpemF0aW9uQ29udGV4dCA9IHt9O1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5sb2NhbFByb3h5TWFwW3JwY0FwcGx5LnByb3h5SWRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YXJnZXQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBwcm94eSBpZCAke3JwY0FwcGx5LnByb3h5SWR9IG5vdCBmb3VuZGApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJncyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhcmcgb2YgKHJwY0FwcGx5LmFyZ3MgfHwgW10pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5wdXNoKHRoaXMuZGVzZXJpYWxpemUoYXJnLCBkZXNlcmlhbGl6YXRpb25Db250ZXh0KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocnBjQXBwbHkubWV0aG9kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWV0aG9kID0gdGFyZ2V0W3JwY0FwcGx5Lm1ldGhvZF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtZXRob2QpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgdGFyZ2V0ICR7dGFyZ2V0Py5jb25zdHJ1Y3Rvcj8ubmFtZX0gZG9lcyBub3QgaGF2ZSBtZXRob2QgJHtycGNBcHBseS5tZXRob2R9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBhd2FpdCB0YXJnZXRbcnBjQXBwbHkubWV0aG9kXSguLi5hcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gYXdhaXQgdGFyZ2V0KC4uLmFyZ3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnJlc3VsdCA9IHRoaXMuc2VyaWFsaXplKHZhbHVlLCBzZXJpYWxpemF0aW9uQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUuZXJyb3IoJ2ZhaWx1cmUnLCBycGNBcHBseS5tZXRob2QsIGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVFcnJvclJlc3VsdChyZXN1bHQsIGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghcnBjQXBwbHkub25ld2F5KVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZW5kKHJlc3VsdCwgdW5kZWZpbmVkLCBzZXJpYWxpemF0aW9uQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlICdyZXN1bHQnOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJwY1Jlc3VsdCA9IG1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlZmVycmVkID0gdGhpcy5wZW5kaW5nUmVzdWx0c1tycGNSZXN1bHQuaWRdO1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5wZW5kaW5nUmVzdWx0c1tycGNSZXN1bHQuaWRdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWRlZmVycmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB1bmtub3duIHJlc3VsdCAke3JwY1Jlc3VsdC5pZH1gKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJwY1Jlc3VsdC5tZXNzYWdlIHx8IHJwY1Jlc3VsdC5zdGFjaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IG5ldyBSUENSZXN1bHRFcnJvcih0aGlzLCBycGNSZXN1bHQubWVzc2FnZSB8fCAnbm8gbWVzc2FnZScsIHVuZGVmaW5lZCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHJwY1Jlc3VsdC5yZXN1bHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2s6IHJwY1Jlc3VsdC5zdGFjayxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0KGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUodGhpcy5kZXNlcmlhbGl6ZShycGNSZXN1bHQucmVzdWx0LCBkZXNlcmlhbGl6YXRpb25Db250ZXh0KSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlICdmaW5hbGl6ZSc6IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcnBjRmluYWxpemUgPSBtZXNzYWdlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2NhbCA9IHRoaXMubG9jYWxQcm94eU1hcFtycGNGaW5hbGl6ZS5fX2xvY2FsX3Byb3h5X2lkXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2NhbFByb3hpZWRFbnRyeSA9IHRoaXMubG9jYWxQcm94aWVkLmdldChsb2NhbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBhIGZpbmFsaXplciBpZCBpcyBzcGVjaWZpZWQsIGl0IG11c3QgbWF0Y2guXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocnBjRmluYWxpemUuX19sb2NhbF9wcm94eV9maW5hbGl6ZXJfaWQgJiYgcnBjRmluYWxpemUuX19sb2NhbF9wcm94eV9maW5hbGl6ZXJfaWQgIT09IGxvY2FsUHJveGllZEVudHJ5Py5maW5hbGl6ZXJJZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMubG9jYWxQcm94eU1hcFtycGNGaW5hbGl6ZS5fX2xvY2FsX3Byb3h5X2lkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxQcm94aWVkLmRlbGV0ZShsb2NhbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgdW5rbm93biBycGMgbWVzc2FnZSB0eXBlICR7bWVzc2FnZS50eXBlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCd1bmhhbmRsZWQgcnBjIGVycm9yJywgdGhpcy5wZWVyTmFtZSwgZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0RXZhbFNvdXJjZSgpIHtcbiAgICByZXR1cm4gYFxuICAgICgoKSA9PiB7XG4gICAgICAgICR7UnBjUHJveHl9XG5cbiAgICAgICAgJHtScGNQZWVyfVxuICAgIFxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgUnBjUGVlcixcbiAgICAgICAgICAgIFJwY1Byb3h5LFxuICAgICAgICB9O1xuICAgIH0pKCk7XG4gICAgYDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJwYy5qcy5tYXAiLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdGlkOiBtb2R1bGVJZCxcblx0XHRsb2FkZWQ6IGZhbHNlLFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcblx0bW9kdWxlLmxvYWRlZCA9IHRydWU7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSAoZXhwb3J0cywgZGVmaW5pdGlvbikgPT4ge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLmcgPSAoZnVuY3Rpb24oKSB7XG5cdGlmICh0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gJ29iamVjdCcpIHJldHVybiBnbG9iYWxUaGlzO1xuXHR0cnkge1xuXHRcdHJldHVybiB0aGlzIHx8IG5ldyBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0aWYgKHR5cGVvZiB3aW5kb3cgPT09ICdvYmplY3QnKSByZXR1cm4gd2luZG93O1xuXHR9XG59KSgpOyIsIl9fd2VicGFja19yZXF1aXJlX18uaG1kID0gKG1vZHVsZSkgPT4ge1xuXHRtb2R1bGUgPSBPYmplY3QuY3JlYXRlKG1vZHVsZSk7XG5cdGlmICghbW9kdWxlLmNoaWxkcmVuKSBtb2R1bGUuY2hpbGRyZW4gPSBbXTtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZSwgJ2V4cG9ydHMnLCB7XG5cdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRzZXQ6ICgpID0+IHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignRVMgTW9kdWxlcyBtYXkgbm90IGFzc2lnbiBtb2R1bGUuZXhwb3J0cyBvciBleHBvcnRzLiosIFVzZSBFU00gZXhwb3J0IHN5bnRheCwgaW5zdGVhZDogJyArIG1vZHVsZS5pZCk7XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIG1vZHVsZTtcbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsImV4cG9ydCBjbGFzcyBEZWZlcnJlZCB7XG4gICAgZmluaXNoZWQgPSBmYWxzZTtcbiAgICByZXNvbHZlO1xuICAgIHJlamVjdDtcbiAgICBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICB0aGlzLnJlc29sdmUgPSB2ID0+IHtcbiAgICAgICAgICAgIHRoaXMuZmluaXNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgcmVzb2x2ZSh2KTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5yZWplY3QgPSBlID0+IHtcbiAgICAgICAgICAgIHRoaXMuZmluaXNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICB9O1xuICAgIH0pO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGVmZXJyZWQuanMubWFwIiwiaW1wb3J0IHsgRGVmZXJyZWQgfSBmcm9tIFwiLi9kZWZlcnJlZFwiO1xuZnVuY3Rpb24gZ2V0VXNlckFnZW50KCkge1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBuYXZpZ2F0b3IudXNlckFnZW50O1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgIH1cbn1cbi8vIGNvbm5lY3Rpb25TdGF0ZSBpcyBub3QgaW1wbGVtZW50ZWQgaW4gZmlyZWZveD8gc28gd2F0Y2ggaWNlQ29ubmVjdGlvblN0YXRlIGluc3RlYWQuLi5cbmV4cG9ydCBmdW5jdGlvbiB3YWl0UGVlckNvbm5lY3Rpb25JY2VDb25uZWN0ZWQocGMpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBpZiAocGMuaWNlQ29ubmVjdGlvblN0YXRlID09PSAnY29ubmVjdGVkJykge1xuICAgICAgICAgICAgcmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHBjLmFkZEV2ZW50TGlzdGVuZXIoJ2ljZWNvbm5lY3Rpb25zdGF0ZWNoYW5nZScsICgpID0+IHtcbiAgICAgICAgICAgIGlmIChwYy5pY2VDb25uZWN0aW9uU3RhdGUgPT09ICdjb25uZWN0ZWQnKVxuICAgICAgICAgICAgICAgIHJlc29sdmUodW5kZWZpbmVkKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHdhaXRQZWVySWNlQ29ubmVjdGlvbkNsb3NlZChwYykudGhlbihyZWFzb24gPT4gcmVqZWN0KG5ldyBFcnJvcihyZWFzb24pKSk7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gd2FpdFBlZXJJY2VDb25uZWN0aW9uQ2xvc2VkKHBjKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICBwYy5hZGRFdmVudExpc3RlbmVyKCdpY2Vjb25uZWN0aW9uc3RhdGVjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoaXNQZWVyQ29ubmVjdGlvbkNsb3NlZChwYykpIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHBjLmljZUNvbm5lY3Rpb25TdGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzUGVlckNvbm5lY3Rpb25DbG9zZWQocGMpIHtcbiAgICByZXR1cm4gcGMuaWNlQ29ubmVjdGlvblN0YXRlID09PSAnZGlzY29ubmVjdGVkJ1xuICAgICAgICB8fCBwYy5pY2VDb25uZWN0aW9uU3RhdGUgPT09ICdmYWlsZWQnXG4gICAgICAgIHx8IHBjLmljZUNvbm5lY3Rpb25TdGF0ZSA9PT0gJ2Nsb3NlZCc7XG59XG5mdW5jdGlvbiBzaWxlbmNlKCkge1xuICAgIGxldCBjdHggPSBuZXcgQXVkaW9Db250ZXh0KCksIG9zY2lsbGF0b3IgPSBjdHguY3JlYXRlT3NjaWxsYXRvcigpO1xuICAgIGNvbnN0IGRlc3QgPSBjdHguY3JlYXRlTWVkaWFTdHJlYW1EZXN0aW5hdGlvbigpO1xuICAgIG9zY2lsbGF0b3IuY29ubmVjdChkZXN0KTtcbiAgICBvc2NpbGxhdG9yLnN0YXJ0KCk7XG4gICAgY29uc3QgcmV0ID0gZGVzdC5zdHJlYW0uZ2V0QXVkaW9UcmFja3MoKVswXTtcbiAgICByZXQuZW5hYmxlZCA9IGZhbHNlO1xuICAgIHJldHVybiByZXQ7XG59XG5leHBvcnQgY2xhc3MgQnJvd3NlclNpZ25hbGluZ1Nlc3Npb24ge1xuICAgIHBjO1xuICAgIHBjRGVmZXJyZWQgPSBuZXcgRGVmZXJyZWQoKTtcbiAgICBkY0RlZmVycmVkID0gbmV3IERlZmVycmVkKCk7XG4gICAgbWljcm9waG9uZTtcbiAgICBtaWNFbmFibGVkID0gZmFsc2U7XG4gICAgb25QZWVyQ29ubmVjdGlvbjtcbiAgICBvcHRpb25zID0ge1xuICAgICAgICB1c2VyQWdlbnQ6IGdldFVzZXJBZ2VudCgpLFxuICAgICAgICBjYXBhYmlsaXRpZXM6IHtcbiAgICAgICAgICAgIGF1ZGlvOiBSVENSdHBSZWNlaXZlci5nZXRDYXBhYmlsaXRpZXM/LignYXVkaW8nKSB8fCB7XG4gICAgICAgICAgICAgICAgY29kZWNzOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgaGVhZGVyRXh0ZW5zaW9uczogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZpZGVvOiBSVENSdHBSZWNlaXZlci5nZXRDYXBhYmlsaXRpZXM/LigndmlkZW8nKSB8fCB7XG4gICAgICAgICAgICAgICAgY29kZWNzOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgaGVhZGVyRXh0ZW5zaW9uczogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgc2NyZWVuOiB7XG4gICAgICAgICAgICBkZXZpY2VQaXhlbFJhdGlvOiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyxcbiAgICAgICAgICAgIHdpZHRoOiBzY3JlZW4ud2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQ6IHNjcmVlbi5oZWlnaHQsXG4gICAgICAgIH0sXG4gICAgfTtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICB9XG4gICAgYXN5bmMgZ2V0T3B0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucztcbiAgICB9XG4gICAgYXN5bmMgc2V0TWljcm9waG9uZShlbmFibGVkKSB7XG4gICAgICAgIGlmICh0aGlzLm1pY3JvcGhvbmUgJiYgZW5hYmxlZCAmJiAhdGhpcy5taWNFbmFibGVkKSB7XG4gICAgICAgICAgICB0aGlzLm1pY0VuYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgLy8gZG9pbmcgc2VuZHJlY3Ygb24gc2FmYXJpIHJlcXVpcmVzIGEgbWljIGJlIGF0dGFjaGVkLCBvciBpdCBmYWlscyB0byBjb25uZWN0LlxuICAgICAgICAgICAgY29uc3QgbWljID0gYXdhaXQgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5nZXRVc2VyTWVkaWEoeyB2aWRlbzogZmFsc2UsIGF1ZGlvOiB0cnVlIH0pO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5taWNyb3Bob25lLnJlcGxhY2VUcmFjayhtaWMuZ2V0VHJhY2tzKClbMF0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWljcm9waG9uZS50cmFjay5lbmFibGVkID0gZW5hYmxlZDtcbiAgICB9XG4gICAgY2xvc2UoKSB7XG4gICAgICAgIHRoaXMucGNEZWZlcnJlZC5wcm9taXNlLnRoZW4ocGMgPT4ge1xuICAgICAgICAgICAgZm9yIChjb25zdCB0IG9mIHBjLmdldFRyYW5zY2VpdmVycygpIHx8IFtdKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdC5zZW5kZXI/LnRyYWNrPy5zdG9wPy4oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYy5jbG9zZSgpO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKCgpID0+IHsgfSk7XG4gICAgICAgIHRoaXMucGNEZWZlcnJlZC5yZWplY3QobmV3IEVycm9yKCdpY2VDb25uZWN0aW9uU3RhdGUgJyArIHRoaXMucGM/LmljZUNvbm5lY3Rpb25TdGF0ZSkpO1xuICAgIH1cbiAgICBhc3luYyBjcmVhdGVQZWVyQ29ubmVjdGlvbihzZXR1cCkge1xuICAgICAgICBpZiAodGhpcy5wYylcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY29uc3QgY2hlY2tDb25uID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ2ljZUNvbm5lY3Rpb25TdGF0ZScsIHBjLmljZUNvbm5lY3Rpb25TdGF0ZSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnY29ubmVjdGlvblN0YXRlJywgcGMuY29ubmVjdGlvblN0YXRlKTtcbiAgICAgICAgICAgIGlmIChpc1BlZXJDb25uZWN0aW9uQ2xvc2VkKHBjKSlcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHBjID0gdGhpcy5wYyA9IG5ldyBSVENQZWVyQ29ubmVjdGlvbihzZXR1cC5jb25maWd1cmF0aW9uKTtcbiAgICAgICAgdGhpcy5wY0RlZmVycmVkLnJlc29sdmUocGMpO1xuICAgICAgICBhd2FpdCB0aGlzLm9uUGVlckNvbm5lY3Rpb24/LihwYyk7XG4gICAgICAgIC8vIHBjLmFkZEV2ZW50TGlzdGVuZXIoJ2Nvbm5lY3Rpb25zdGF0ZWNoYW5nZScsIGNoZWNrQ29ubik7XG4gICAgICAgIHBjLmFkZEV2ZW50TGlzdGVuZXIoJ2ljZWNvbm5lY3Rpb25zdGF0ZWNoYW5nZScsIGNoZWNrQ29ubik7XG4gICAgICAgIC8vIHBjLmFkZEV2ZW50TGlzdGVuZXIoJ2ljZWdhdGhlcmluZ3N0YXRlY2hhbmdlJywgZXYgPT4gY29uc29sZS5sb2coJ2ljZUdhdGhlcmluZ1N0YXRlJywgcGMuaWNlR2F0aGVyaW5nU3RhdGUpKVxuICAgICAgICAvLyBwYy5hZGRFdmVudExpc3RlbmVyKCdzaWduYWxpbmdzdGF0ZWNoYW5nZScsIGV2ID0+IGNvbnNvbGUubG9nKCdzaWduYWxpbmdTdGF0ZScsIHBjLnNpZ25hbGluZ1N0YXRlKSlcbiAgICAgICAgLy8gcGMuYWRkRXZlbnRMaXN0ZW5lcignaWNlY2FuZGlkYXRlZXJyb3InLCBldiA9PiBjb25zb2xlLmxvZygnaWNlY2FuZGlkYXRlZXJyb3InKSlcbiAgICAgICAgaWYgKHNldHVwLmRhdGFjaGFubmVsKSB7XG4gICAgICAgICAgICBjb25zdCBkYyA9IHBjLmNyZWF0ZURhdGFDaGFubmVsKHNldHVwLmRhdGFjaGFubmVsLmxhYmVsLCBzZXR1cC5kYXRhY2hhbm5lbC5kaWN0KTtcbiAgICAgICAgICAgIGRjLmJpbmFyeVR5cGUgPSAnYXJyYXlidWZmZXInO1xuICAgICAgICAgICAgdGhpcy5kY0RlZmVycmVkLnJlc29sdmUoZGMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZXR1cC5hdWRpbykge1xuICAgICAgICAgICAgbGV0IGF1ZGlvO1xuICAgICAgICAgICAgaWYgKHNldHVwLmdldFVzZXJNZWRpYVNhZmFyaUhhY2sgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmNsdWRlcygnU2FmYXJpJykgJiYgIW5hdmlnYXRvci51c2VyQWdlbnQuaW5jbHVkZXMoJ0Nocm9tZScpKSB7XG4gICAgICAgICAgICAgICAgLy8gb2ZmZXJpbmcgYSBzZW5kcmVjdiBvbiBzYWZhcmkgcmVxdWlyZXMgYSBtaWMgYmUgYXR0YWNoZWQgZm9yIHJpbmcgd2VicnRjLCBvciBpdCBmYWlscyB0byBzdHJlYW0/XG4gICAgICAgICAgICAgICAgLy8gZXZlbiBpZiBhIHNpbGVudCB0cmFjayBpcyB1c2VkLi4uXG4gICAgICAgICAgICAgICAgYXVkaW8gPSBwYy5hZGRUcmFuc2NlaXZlcignYXVkaW8nLCB7XG4gICAgICAgICAgICAgICAgICAgIC4uLnNldHVwLmF1ZGlvLFxuICAgICAgICAgICAgICAgICAgICBzdHJlYW1zOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYSh7IGF1ZGlvOiB0cnVlIH0pXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBhdWRpbyA9IHBjLmFkZFRyYW5zY2VpdmVyKCdhdWRpbycsIHNldHVwLmF1ZGlvKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzZXR1cC5hdWRpby5kaXJlY3Rpb24gPT09ICdzZW5kcmVjdicgfHwgc2V0dXAuYXVkaW8uZGlyZWN0aW9uID09PSAnc2VuZG9ubHknKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5taWNyb3Bob25lID0gYXVkaW8uc2VuZGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzZXR1cC52aWRlbykge1xuICAgICAgICAgICAgaWYgKHNldHVwLnZpZGVvLmRpcmVjdGlvbiA9PT0gJ3NlbmRyZWN2JyB8fCBzZXR1cC52aWRlby5kaXJlY3Rpb24gPT09ICdzZW5kb25seScpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYW1lcmEgPSBhd2FpdCBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYSh7IHZpZGVvOiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHRyYWNrIG9mIGNhbWVyYS5nZXRUcmFja3MoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGMuYWRkVHJhY2sodHJhY2spO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHdoYXQgbm93XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcGMuYWRkVHJhbnNjZWl2ZXIoJ3ZpZGVvJywgc2V0dXAudmlkZW8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIGNyZWF0ZUxvY2FsRGVzY3JpcHRpb24odHlwZSwgc2V0dXAsIHNlbmRJY2VDYW5kaWRhdGUpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5jcmVhdGVQZWVyQ29ubmVjdGlvbihzZXR1cCk7XG4gICAgICAgIGNvbnN0IGdhdGhlcmluZ1Byb21pc2UgPSBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgIHRoaXMucGMub25pY2VjYW5kaWRhdGUgPSBldiA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGV2LmNhbmRpZGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImxvY2FsIGNhbmRpZGF0ZVwiLCBldi5jYW5kaWRhdGUpO1xuICAgICAgICAgICAgICAgICAgICBzZW5kSWNlQ2FuZGlkYXRlPy4oSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShldi5jYW5kaWRhdGUpKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMucGMub25pY2VnYXRoZXJpbmdzdGF0ZWNoYW5nZSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wYy5pY2VHYXRoZXJpbmdTdGF0ZSA9PT0gJ2NvbXBsZXRlJylcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHRvRGVzY3JpcHRpb24gPSAoaW5pdCkgPT4ge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ2xvY2FsIGRlc2NyaXB0aW9uJywgaW5pdC5zZHApO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBpbml0LnR5cGUsXG4gICAgICAgICAgICAgICAgc2RwOiBpbml0LnNkcCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH07XG4gICAgICAgIGlmICh0eXBlID09PSAnb2ZmZXInKSB7XG4gICAgICAgICAgICBsZXQgb2ZmZXIgPSBhd2FpdCB0aGlzLnBjLmNyZWF0ZU9mZmVyKHtcbiAgICAgICAgICAgICAgICBvZmZlclRvUmVjZWl2ZUF1ZGlvOiAhIXNldHVwLmF1ZGlvLFxuICAgICAgICAgICAgICAgIG9mZmVyVG9SZWNlaXZlVmlkZW86ICEhc2V0dXAudmlkZW8sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IHNldCA9IHRoaXMucGMuc2V0TG9jYWxEZXNjcmlwdGlvbihvZmZlcik7XG4gICAgICAgICAgICBpZiAoc2VuZEljZUNhbmRpZGF0ZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdG9EZXNjcmlwdGlvbihvZmZlcik7XG4gICAgICAgICAgICBhd2FpdCBzZXQ7XG4gICAgICAgICAgICBhd2FpdCBnYXRoZXJpbmdQcm9taXNlO1xuICAgICAgICAgICAgb2ZmZXIgPSBhd2FpdCB0aGlzLnBjLmNyZWF0ZU9mZmVyKHtcbiAgICAgICAgICAgICAgICBvZmZlclRvUmVjZWl2ZUF1ZGlvOiAhIXNldHVwLmF1ZGlvLFxuICAgICAgICAgICAgICAgIG9mZmVyVG9SZWNlaXZlVmlkZW86ICEhc2V0dXAudmlkZW8sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiB0b0Rlc2NyaXB0aW9uKG9mZmVyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBhbnN3ZXIgPSBhd2FpdCB0aGlzLnBjLmNyZWF0ZUFuc3dlcigpO1xuICAgICAgICAgICAgY29uc3Qgc2V0ID0gdGhpcy5wYy5zZXRMb2NhbERlc2NyaXB0aW9uKGFuc3dlcik7XG4gICAgICAgICAgICBpZiAoc2VuZEljZUNhbmRpZGF0ZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdG9EZXNjcmlwdGlvbihhbnN3ZXIpO1xuICAgICAgICAgICAgYXdhaXQgc2V0O1xuICAgICAgICAgICAgYXdhaXQgZ2F0aGVyaW5nUHJvbWlzZTtcbiAgICAgICAgICAgIGFuc3dlciA9IHRoaXMucGMuY3VycmVudExvY2FsRGVzY3JpcHRpb24gfHwgYW5zd2VyO1xuICAgICAgICAgICAgcmV0dXJuIHRvRGVzY3JpcHRpb24oYW5zd2VyKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBzZXRSZW1vdGVEZXNjcmlwdGlvbihkZXNjcmlwdGlvbiwgc2V0dXApIHtcbiAgICAgICAgYXdhaXQgdGhpcy5jcmVhdGVQZWVyQ29ubmVjdGlvbihzZXR1cCk7XG4gICAgICAgIGF3YWl0IHRoaXMucGMuc2V0UmVtb3RlRGVzY3JpcHRpb24oZGVzY3JpcHRpb24pO1xuICAgICAgICAvLyBjb25zb2xlLmxvZygncmVtb3RlIGRlc2NyaXB0aW9uJywgZGVzY3JpcHRpb24uc2RwKTtcbiAgICB9XG4gICAgYXN5bmMgYWRkSWNlQ2FuZGlkYXRlKGNhbmRpZGF0ZSkge1xuICAgICAgICBhd2FpdCB0aGlzLnBjLmFkZEljZUNhbmRpZGF0ZShjYW5kaWRhdGUpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcInJlbW90ZSBjYW5kaWRhdGVcIiwgY2FuZGlkYXRlKTtcbiAgICB9XG4gICAgYXN5bmMgZW5kU2Vzc2lvbigpIHtcbiAgICB9XG59XG5mdW5jdGlvbiBsb2dTZW5kQ2FuZGlkYXRlKGNvbnNvbGUsIHR5cGUsIHNlc3Npb24pIHtcbiAgICByZXR1cm4gYXN5bmMgKGNhbmRpZGF0ZSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYCR7dHlwZX0gdHJpY2tsZWQgY2FuZGlkYXRlOmAsIGNhbmRpZGF0ZS5zZHBNTGluZUluZGV4LCBjYW5kaWRhdGUuY2FuZGlkYXRlKTtcbiAgICAgICAgICAgIGF3YWl0IHNlc3Npb24uYWRkSWNlQ2FuZGlkYXRlKGNhbmRpZGF0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ2FkZEljZUNhbmRpZGF0ZSBlcnJvcicsIGUpO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgIH07XG59XG5mdW5jdGlvbiBjcmVhdGVDYW5kaWRhdGVRdWV1ZShjb25zb2xlLCB0eXBlLCBzZXNzaW9uKSB7XG4gICAgbGV0IHJlYWR5ID0gZmFsc2U7XG4gICAgbGV0IGNhbmRpZGF0ZVF1ZXVlID0gW107XG4gICAgY29uc3QgbHMgPSBsb2dTZW5kQ2FuZGlkYXRlKGNvbnNvbGUsIHR5cGUsIHNlc3Npb24pO1xuICAgIGNvbnN0IHF1ZXVlU2VuZENhbmRpZGF0ZSA9IGFzeW5jIChjYW5kaWRhdGUpID0+IHtcbiAgICAgICAgaWYgKCFyZWFkeSlcbiAgICAgICAgICAgIGNhbmRpZGF0ZVF1ZXVlLnB1c2goY2FuZGlkYXRlKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgbHMoY2FuZGlkYXRlKTtcbiAgICB9O1xuICAgIHJldHVybiB7XG4gICAgICAgIGZsdXNoKCkge1xuICAgICAgICAgICAgcmVhZHkgPSB0cnVlO1xuICAgICAgICAgICAgZm9yIChjb25zdCBjYW5kaWRhdGUgb2YgY2FuZGlkYXRlUXVldWUpIHtcbiAgICAgICAgICAgICAgICBscyhjYW5kaWRhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FuZGlkYXRlUXVldWUgPSBbXTtcbiAgICAgICAgfSxcbiAgICAgICAgcXVldWVTZW5kQ2FuZGlkYXRlLFxuICAgIH07XG59XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29ubmVjdFJUQ1NpZ25hbGluZ0NsaWVudHMoY29uc29sZSwgb2ZmZXJDbGllbnQsIG9mZmVyU2V0dXAsIGFuc3dlckNsaWVudCwgYW5zd2VyU2V0dXApIHtcbiAgICBjb25zdCBvZmZlck9wdGlvbnMgPSBhd2FpdCBvZmZlckNsaWVudC5nZXRPcHRpb25zKCk7XG4gICAgY29uc3QgYW5zd2VyT3B0aW9ucyA9IGF3YWl0IGFuc3dlckNsaWVudC5nZXRPcHRpb25zKCk7XG4gICAgY29uc3QgZGlzYWJsZVRyaWNrbGUgPSBvZmZlck9wdGlvbnM/LmRpc2FibGVUcmlja2xlIHx8IGFuc3dlck9wdGlvbnM/LmRpc2FibGVUcmlja2xlO1xuICAgIGlmIChvZmZlck9wdGlvbnM/Lm9mZmVyICYmIGFuc3dlck9wdGlvbnM/Lm9mZmVyKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0JvdGggUlRDIGNsaWVudHMgaGF2ZSBvZmZlcnMgYW5kIGNhbiBub3QgbmVnb3RpYXRlLiBDb25zaWRlciBpbXBsZW1lbnRpbmcgdGhpcyBpbiBAc2NyeXB0ZWQvd2VicnRjLicpO1xuICAgIGlmIChvZmZlck9wdGlvbnM/LnJlcXVpcmVzT2ZmZXIgJiYgYW5zd2VyT3B0aW9ucy5yZXF1aXJlc09mZmVyKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0JvdGggUlRDIGNsaWVudHMgcmVxdWlyZSBvZmZlcnMgYW5kIGNhbiBub3QgbmVnb3RpYXRlLicpO1xuICAgIG9mZmVyU2V0dXAudHlwZSA9ICdvZmZlcic7XG4gICAgYW5zd2VyU2V0dXAudHlwZSA9ICdhbnN3ZXInO1xuICAgIGNvbnN0IGFuc3dlclF1ZXVlID0gY3JlYXRlQ2FuZGlkYXRlUXVldWUoY29uc29sZSwgJ29mZmVyJywgYW5zd2VyQ2xpZW50KTtcbiAgICBjb25zdCBvZmZlclF1ZXVlID0gY3JlYXRlQ2FuZGlkYXRlUXVldWUoY29uc29sZSwgJ2Fuc3dlcicsIG9mZmVyQ2xpZW50KTtcbiAgICBjb25zdCBvZmZlciA9IGF3YWl0IG9mZmVyQ2xpZW50LmNyZWF0ZUxvY2FsRGVzY3JpcHRpb24oJ29mZmVyJywgb2ZmZXJTZXR1cCwgZGlzYWJsZVRyaWNrbGUgPyB1bmRlZmluZWQgOiBhbnN3ZXJRdWV1ZS5xdWV1ZVNlbmRDYW5kaWRhdGUpO1xuICAgIGNvbnNvbGUubG9nKCdvZmZlciBzZHAnLCBvZmZlci5zZHApO1xuICAgIGF3YWl0IGFuc3dlckNsaWVudC5zZXRSZW1vdGVEZXNjcmlwdGlvbihvZmZlciwgYW5zd2VyU2V0dXApO1xuICAgIGNvbnN0IGFuc3dlciA9IGF3YWl0IGFuc3dlckNsaWVudC5jcmVhdGVMb2NhbERlc2NyaXB0aW9uKCdhbnN3ZXInLCBhbnN3ZXJTZXR1cCwgZGlzYWJsZVRyaWNrbGUgPyB1bmRlZmluZWQgOiBvZmZlclF1ZXVlLnF1ZXVlU2VuZENhbmRpZGF0ZSk7XG4gICAgY29uc29sZS5sb2coJ2Fuc3dlciBzZHAnLCBhbnN3ZXIuc2RwKTtcbiAgICBhd2FpdCBvZmZlckNsaWVudC5zZXRSZW1vdGVEZXNjcmlwdGlvbihhbnN3ZXIsIG9mZmVyU2V0dXApO1xuICAgIG9mZmVyUXVldWUuZmx1c2goKTtcbiAgICBhbnN3ZXJRdWV1ZS5mbHVzaCgpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cnRjLXNpZ25hbGluZy5qcy5tYXAiLCJpbXBvcnQgeyBScGNQZWVyIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vc2VydmVyL3NyYy9ycGMnO1xuaW1wb3J0IHsgQnJvd3NlclNpZ25hbGluZ1Nlc3Npb24sIHdhaXRQZWVyQ29ubmVjdGlvbkljZUNvbm5lY3RlZCwgd2FpdFBlZXJJY2VDb25uZWN0aW9uQ2xvc2VkIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vY29tbW9uL3NyYy9ydGMtc2lnbmFsaW5nJztcbmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJET01Db250ZW50TG9hZGVkXCIsIGZ1bmN0aW9uIChldmVudCkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSBuZXcgY2FzdC5mcmFtZXdvcmsuQ2FzdFJlY2VpdmVyT3B0aW9ucygpO1xuICAgIG9wdGlvbnMuZGlzYWJsZUlkbGVUaW1lb3V0ID0gdHJ1ZTtcbiAgICBjYXN0LmZyYW1ld29yay5DYXN0UmVjZWl2ZXJDb250ZXh0LmdldEluc3RhbmNlKCkuc3RhcnQob3B0aW9ucyk7XG4gICAgY29uc3QgY29udGV4dCA9IGNhc3QuZnJhbWV3b3JrLkNhc3RSZWNlaXZlckNvbnRleHQuZ2V0SW5zdGFuY2UoKTtcbiAgICBjb25zdCBwbGF5ZXJNYW5hZ2VyID0gY29udGV4dC5nZXRQbGF5ZXJNYW5hZ2VyKCk7XG4gICAgY29uc3QgdmlkZW8gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWVkaWEnKTtcbiAgICBsZXQgcHJldmlvdXNDbGVhbnVwO1xuICAgIC8vIGludGVyY2VwdCB0aGUgTE9BRCByZXF1ZXN0IHRvIGJlIGFibGUgdG8gcmVhZCBpbiBhIGNvbnRlbnRJZCBhbmQgZ2V0IGRhdGFcbiAgICBjb25zdCBpbnRlcmNlcHRvciA9IChsb2FkUmVxdWVzdERhdGEpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2cobG9hZFJlcXVlc3REYXRhKTtcbiAgICAgICAgY29uc3QgZWlvVXJsID0gbG9hZFJlcXVlc3REYXRhLm1lZGlhLmVudGl0eSB8fCBsb2FkUmVxdWVzdERhdGEubWVkaWEuY29udGVudElkO1xuICAgICAgICBjb25zdCB0b2tlbiA9IGxvYWRSZXF1ZXN0RGF0YS5jcmVkZW50aWFscyA/PyBsb2FkUmVxdWVzdERhdGEubWVkaWEuY3VzdG9tRGF0YS50b2tlbjtcbiAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTChlaW9VcmwpO1xuICAgICAgICBjb25zdCBlbmRwb2ludFBhdGggPSB1cmwucGF0aG5hbWU7XG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0ge307XG4gICAgICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIG5ldyBVUkxTZWFyY2hQYXJhbXModXJsLnNlYXJjaCkpIHtcbiAgICAgICAgICAgIHF1ZXJ5W2tdID0gdjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgcGF0aDogZW5kcG9pbnRQYXRoLFxuICAgICAgICAgICAgcXVlcnksXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHNvY2tldCA9IGVpbyhgd3NzOi8vJHt1cmwuaG9zdH1gLCBvcHRpb25zKTtcbiAgICAgICAgc29ja2V0Lm9uKCdvcGVuJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgc29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgIHRva2VuLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgY29uc3QgcnBjUGVlciA9IG5ldyBScGNQZWVyKCdjYXN0LXJlY2VpdmVyJywgJ2hvc3QnLCAobWVzc2FnZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgc29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkobWVzc2FnZSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZWplY3Q/LihlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHNvY2tldC5vbignbWVzc2FnZScsIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgcnBjUGVlci5oYW5kbGVNZXNzYWdlKEpTT04ucGFyc2UoZGF0YSkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBzZXNzaW9uID0gbmV3IEJyb3dzZXJTaWduYWxpbmdTZXNzaW9uKCk7XG4gICAgICAgICAgICAvLyBuZXN0IGh1YiBkZXZpY2VzIGxpZSBhYm91dCB0aGVpciBjYXBhYmlsdGllcywgc3VjaCBhc1xuICAgICAgICAgICAgLy8gcmVwb3J0aW5nIHRoYXQgdGhleSBzdXBwb3J0IDRrIGFuZCBoMjY0IGhpZ2guXG4gICAgICAgICAgICBzZXNzaW9uLm9wdGlvbnMuc2NyZWVuLndpZHRoID0gMTI4MDtcbiAgICAgICAgICAgIHNlc3Npb24ub3B0aW9ucy5zY3JlZW4uaGVpZ2h0ID0gNzIwO1xuICAgICAgICAgICAgc2Vzc2lvbi5vcHRpb25zLnNjcmVlbi5kZXZpY2VQaXhlbFJhdGlvID0gMTtcbiAgICAgICAgICAgIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2NsZWFudXAnKTtcbiAgICAgICAgICAgICAgICBzb2NrZXQuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICBzZXNzaW9uLnBjRGVmZXJyZWQucHJvbWlzZS50aGVuKHBjID0+IHBjLmNsb3NlKCkpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHByZXZpb3VzQ2xlYW51cD8uKCk7XG4gICAgICAgICAgICBwcmV2aW91c0NsZWFudXAgPSBjbGVhbnVwO1xuICAgICAgICAgICAgc29ja2V0Lm9uKCdjbG9zZScsICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnc29ja2V0IGlvIGNvbm5lY3Rpb24gY2xvc2UgZXZlbnQnKTtcbiAgICAgICAgICAgICAgICBjbGVhbnVwKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHNlc3Npb24ub25QZWVyQ29ubmVjdGlvbiA9IGFzeW5jIChwYykgPT4ge1xuICAgICAgICAgICAgICAgIHdhaXRQZWVySWNlQ29ubmVjdGlvbkNsb3NlZChwYykudGhlbihjbGVhbnVwKTtcbiAgICAgICAgICAgICAgICBjb25zdCBtZWRpYVN0cmVhbSA9IG5ldyBNZWRpYVN0cmVhbShwYy5nZXRSZWNlaXZlcnMoKS5tYXAoKHJlY2VpdmVyKSA9PiByZWNlaXZlci50cmFjaykpO1xuICAgICAgICAgICAgICAgIHBjLm9udHJhY2sgPSBlID0+IG1lZGlhU3RyZWFtLmFkZFRyYWNrKGUudHJhY2spO1xuICAgICAgICAgICAgICAgIHZpZGVvLnNyY09iamVjdCA9IG1lZGlhU3RyZWFtO1xuICAgICAgICAgICAgICAgIHdhaXRQZWVyQ29ubmVjdGlvbkljZUNvbm5lY3RlZChwYylcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzb2NrZXQucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHNvY2tldC5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJwY1BlZXIucGFyYW1zWydzZXNzaW9uJ10gPSBzZXNzaW9uO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgICBwbGF5ZXJNYW5hZ2VyLnNldE1lc3NhZ2VJbnRlcmNlcHRvcihjYXN0LmZyYW1ld29yay5tZXNzYWdlcy5NZXNzYWdlVHlwZS5MT0FELCBpbnRlcmNlcHRvcik7XG59KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNhc3QuanMubWFwIl0sIm5hbWVzIjpbInN0YXJ0UGVyaW9kaWNHYXJiYWdlQ29sbGVjdGlvbiIsImciLCJnYyIsImNvbnNvbGUiLCJ3YXJuIiwiZSIsImxhc3RDb2xsZWN0aW9uIiwic2V0SW50ZXJ2YWwiLCJub3ciLCJEYXRlIiwic2luY2VMYXN0Q29sbGVjdGlvbiIsInJlbW90ZXNDcmVhdGVkIiwiUnBjUGVlciIsInJlbW90ZXNDb2xsZWN0ZWQiLCJScGNQcm94eSIsInBlZXIiLCJlbnRyeSIsImNvbnN0cnVjdG9yTmFtZSIsInByb3h5UHJvcHMiLCJwcm94eU9uZVdheU1ldGhvZHMiLCJjb25zdHJ1Y3RvciIsInRoaXMiLCJ0b1ByaW1pdGl2ZSIsInNlbGZOYW1lIiwicGVlck5hbWUiLCJnZXQiLCJ0YXJnZXQiLCJwIiwicmVjZWl2ZXIiLCJQUk9QRVJUWV9QUk9YWV9JRCIsImlkIiwiUFJPUEVSVFlfUFJPWFlfUFJPUEVSVElFUyIsIlBST1BFUlRZX1BST1hZX09ORVdBWV9NRVRIT0RTIiwiUFJPUEVSVFlfSlNPTl9ESVNBQkxFX1NFUklBTElaQVRJT04iLCJQUk9QRVJUWV9KU09OX0NPUFlfU0VSSUFMSVpFX0NISUxEUkVOIiwidW5kZWZpbmVkIiwiaGFuZGxlRnVuY3Rpb25JbnZvY2F0aW9ucyIsIlByb3h5Iiwic2V0IiwidmFsdWUiLCJmaW5hbGl6ZXJJZFN5bWJvbCIsImZpbmFsaXplcklkIiwiYXBwbHkiLCJ0aGlzQXJnIiwiYXJnQXJyYXkiLCJPYmplY3QiLCJpc0Zyb3plbiIsInBlbmRpbmdSZXN1bHRzIiwiUHJvbWlzZSIsInJlamVjdCIsIlJQQ1Jlc3VsdEVycm9yIiwibWV0aG9kIiwiYXJncyIsInNlcmlhbGl6YXRpb25Db250ZXh0IiwiYXJnIiwicHVzaCIsInNlcmlhbGl6ZSIsInJwY0FwcGx5IiwidHlwZSIsInByb3h5SWQiLCJpbmNsdWRlcyIsIm9uZXdheSIsInNlbmQiLCJyZXNvbHZlIiwiY3JlYXRlUGVuZGluZ1Jlc3VsdCIsIkVycm9yIiwiY2F1c2UiLCJtZXNzYWdlIiwib3B0aW9ucyIsInN1cGVyIiwibmFtZSIsInN0YWNrIiwiY29tcGlsZUZ1bmN0aW9uIiwiY29kZSIsInBhcmFtcyIsImYiLCJqb2luIiwiZXZhbCIsImZyIiwiRmluYWxpemF0aW9uUmVnaXN0cnkiLCJ3aW5kb3ciLCJXZWFrUmVmIiwiZGVyZWYiLCJyZWdpc3RlciIsImlkQ291bnRlciIsInByb3h5Q291bnRlciIsImxvY2FsUHJveGllZCIsIk1hcCIsImxvY2FsUHJveHlNYXAiLCJyZW1vdGVXZWFrUHJveGllcyIsImZpbmFsaXplcnMiLCJmaW5hbGl6ZSIsIm5hbWVEZXNlcmlhbGl6ZXJNYXAiLCJjb25zdHJ1Y3RvclNlcmlhbGl6ZXJNYXAiLCJ0cmFuc3BvcnRTYWZlQXJndW1lbnRUeXBlcyIsImdldERlZmF1bHRUcmFuc3BvcnRTYWZlQXJndW1lbnRUeXBlcyIsImtpbGxlZCIsImtpbGxlZERlZmVycmVkIiwidGFncyIsInN0YXRpYyIsIlN5bWJvbCIsImpzb25TZXJpYWxpemFibGUiLCJTZXQiLCJhZGQiLCJOdW1iZXIiLCJTdHJpbmciLCJCb29sZWFuIiwiQXJyYXkiLCJ0aGl6IiwiY2F0Y2giLCJjYiIsInByb21pc2UiLCJ0b1N0cmluZyIsImtpbGwiLCJlcnJvciIsInJlc3VsdCIsInZhbHVlcyIsImZyZWV6ZSIsImNsZWFyIiwiYWRkU2VyaWFsaXplciIsImN0ciIsInNlcmlhbGl6ZXIiLCJycGNGaW5hbGl6ZSIsIl9fbG9jYWxfcHJveHlfaWQiLCJfX2xvY2FsX3Byb3h5X2ZpbmFsaXplcl9pZCIsImFzeW5jIiwicGFyYW0iLCJwYXJhbU1lc3NhZ2UiLCJldmFsTG9jYWwiLCJzY3JpcHQiLCJmaWxlbmFtZSIsImNvZXJjZWRQYXJhbXMiLCJhc3NpZ24iLCJjb21waWxlIiwibW9kdWxlIiwia2V5cyIsImNyZWF0ZUVycm9yUmVzdWx0IiwiZGVzZXJpYWxpemUiLCJkZXNlcmlhbGl6YXRpb25Db250ZXh0IiwicmV0Iiwia2V5IiwidmFsIiwiZW50cmllcyIsIl9fcmVtb3RlX3Byb3h5X2lkIiwiX19yZW1vdGVfcHJveHlfZmluYWxpemVyX2lkIiwiX19yZW1vdGVfY29uc3RydWN0b3JfbmFtZSIsIl9fc2VyaWFsaXplZF92YWx1ZSIsIl9fcmVtb3RlX3Byb3h5X3Byb3BzIiwiX19yZW1vdGVfcHJveHlfb25ld2F5X21ldGhvZHMiLCJwcm94eSIsIm5ld1Byb3h5IiwiZGVzZXJpYWxpemVyIiwiaGFzIiwiX19wcm94eV9jb25zdHJ1Y3RvciIsInByb3hpZWRFbnRyeSIsIl9fcHJveHlfaWQiLCJfX3Byb3h5X3BlZXIiLCJzZXJpYWxpemVyTWFwTmFtZSIsInNlcmlhbGl6ZWQiLCJwcm94eUNvbnN0cnVjdG9yTmFtZSIsImxvY2FsUHJveGllZEVudHJ5IiwicnBjIiwid2Vha3JlZiIsImhhbmRsZU1lc3NhZ2UiLCJhY3RpdmVScGNQZWVyIiwiaGFuZGxlTWVzc2FnZUludGVybmFsIiwicnBjUGFyYW0iLCJycGNSZXN1bHQiLCJkZWZlcnJlZCIsImxvY2FsIiwiZGVsZXRlIiwiZ2V0RXZhbFNvdXJjZSIsIl9fd2VicGFja19tb2R1bGVfY2FjaGVfXyIsIl9fd2VicGFja19yZXF1aXJlX18iLCJtb2R1bGVJZCIsImNhY2hlZE1vZHVsZSIsImV4cG9ydHMiLCJsb2FkZWQiLCJfX3dlYnBhY2tfbW9kdWxlc19fIiwiZCIsImRlZmluaXRpb24iLCJvIiwiZGVmaW5lUHJvcGVydHkiLCJlbnVtZXJhYmxlIiwiZ2xvYmFsVGhpcyIsIkZ1bmN0aW9uIiwiaG1kIiwiY3JlYXRlIiwiY2hpbGRyZW4iLCJvYmoiLCJwcm9wIiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiRGVmZXJyZWQiLCJmaW5pc2hlZCIsInYiLCJnZXRVc2VyQWdlbnQiLCJuYXZpZ2F0b3IiLCJ1c2VyQWdlbnQiLCJ3YWl0UGVlckljZUNvbm5lY3Rpb25DbG9zZWQiLCJwYyIsImFkZEV2ZW50TGlzdGVuZXIiLCJpc1BlZXJDb25uZWN0aW9uQ2xvc2VkIiwiaWNlQ29ubmVjdGlvblN0YXRlIiwiQnJvd3NlclNpZ25hbGluZ1Nlc3Npb24iLCJwY0RlZmVycmVkIiwiZGNEZWZlcnJlZCIsIm1pY3JvcGhvbmUiLCJtaWNFbmFibGVkIiwib25QZWVyQ29ubmVjdGlvbiIsImNhcGFiaWxpdGllcyIsImF1ZGlvIiwiUlRDUnRwUmVjZWl2ZXIiLCJnZXRDYXBhYmlsaXRpZXMiLCJjb2RlY3MiLCJoZWFkZXJFeHRlbnNpb25zIiwidmlkZW8iLCJzY3JlZW4iLCJkZXZpY2VQaXhlbFJhdGlvIiwid2lkdGgiLCJoZWlnaHQiLCJlbmFibGVkIiwibWljIiwibWVkaWFEZXZpY2VzIiwiZ2V0VXNlck1lZGlhIiwicmVwbGFjZVRyYWNrIiwiZ2V0VHJhY2tzIiwidHJhY2siLCJjbG9zZSIsInRoZW4iLCJ0IiwiZ2V0VHJhbnNjZWl2ZXJzIiwic2VuZGVyIiwic3RvcCIsInNldHVwIiwiUlRDUGVlckNvbm5lY3Rpb24iLCJjb25maWd1cmF0aW9uIiwibG9nIiwiY29ubmVjdGlvblN0YXRlIiwiZGF0YWNoYW5uZWwiLCJkYyIsImNyZWF0ZURhdGFDaGFubmVsIiwibGFiZWwiLCJkaWN0IiwiYmluYXJ5VHlwZSIsImdldFVzZXJNZWRpYVNhZmFyaUhhY2siLCJhZGRUcmFuc2NlaXZlciIsInN0cmVhbXMiLCJkaXJlY3Rpb24iLCJjYW1lcmEiLCJhZGRUcmFjayIsInNlbmRJY2VDYW5kaWRhdGUiLCJjcmVhdGVQZWVyQ29ubmVjdGlvbiIsImdhdGhlcmluZ1Byb21pc2UiLCJvbmljZWNhbmRpZGF0ZSIsImV2IiwiY2FuZGlkYXRlIiwiSlNPTiIsInBhcnNlIiwic3RyaW5naWZ5Iiwib25pY2VnYXRoZXJpbmdzdGF0ZWNoYW5nZSIsImljZUdhdGhlcmluZ1N0YXRlIiwidG9EZXNjcmlwdGlvbiIsImluaXQiLCJzZHAiLCJvZmZlciIsImNyZWF0ZU9mZmVyIiwib2ZmZXJUb1JlY2VpdmVBdWRpbyIsIm9mZmVyVG9SZWNlaXZlVmlkZW8iLCJzZXRMb2NhbERlc2NyaXB0aW9uIiwiYW5zd2VyIiwiY3JlYXRlQW5zd2VyIiwiY3VycmVudExvY2FsRGVzY3JpcHRpb24iLCJkZXNjcmlwdGlvbiIsInNldFJlbW90ZURlc2NyaXB0aW9uIiwiYWRkSWNlQ2FuZGlkYXRlIiwiZG9jdW1lbnQiLCJldmVudCIsImNhc3QiLCJmcmFtZXdvcmsiLCJDYXN0UmVjZWl2ZXJPcHRpb25zIiwiZGlzYWJsZUlkbGVUaW1lb3V0IiwiQ2FzdFJlY2VpdmVyQ29udGV4dCIsImdldEluc3RhbmNlIiwic3RhcnQiLCJwbGF5ZXJNYW5hZ2VyIiwiZ2V0UGxheWVyTWFuYWdlciIsImdldEVsZW1lbnRCeUlkIiwicHJldmlvdXNDbGVhbnVwIiwic2V0TWVzc2FnZUludGVyY2VwdG9yIiwibWVzc2FnZXMiLCJNZXNzYWdlVHlwZSIsIkxPQUQiLCJsb2FkUmVxdWVzdERhdGEiLCJlaW9VcmwiLCJtZWRpYSIsImVudGl0eSIsImNvbnRlbnRJZCIsInRva2VuIiwiY3JlZGVudGlhbHMiLCJjdXN0b21EYXRhIiwidXJsIiwiVVJMIiwiZW5kcG9pbnRQYXRoIiwicGF0aG5hbWUiLCJxdWVyeSIsImsiLCJVUkxTZWFyY2hQYXJhbXMiLCJzZWFyY2giLCJwYXRoIiwic29ja2V0IiwiZWlvIiwiaG9zdCIsIm9uIiwicnBjUGVlciIsImRhdGEiLCJzZXNzaW9uIiwiY2xlYW51cCIsIm1lZGlhU3RyZWFtIiwiTWVkaWFTdHJlYW0iLCJnZXRSZWNlaXZlcnMiLCJtYXAiLCJvbnRyYWNrIiwic3JjT2JqZWN0IiwicmVhc29uIiwid2FpdFBlZXJDb25uZWN0aW9uSWNlQ29ubmVjdGVkIiwicmVtb3ZlQWxsTGlzdGVuZXJzIl0sInNvdXJjZVJvb3QiOiIifQ==